From 4ea6dadbad6b26daa60aa14306cca1b725c84711 Mon Sep 17 00:00:00 2001 From: jiegeaiai Date: Thu, 28 Nov 2024 01:13:57 +0800 Subject: [PATCH] add first code --- .gitignore | 3 + CMakeLists.txt | 32 + Thirdparty/SDL2/BUGS.txt | 16 + Thirdparty/SDL2/COPYING.txt | 20 + Thirdparty/SDL2/README-SDL.txt | 13 + Thirdparty/SDL2/README.txt | 21 + Thirdparty/SDL2/WhatsNew.txt | 870 + .../SDL2/cmake/sdl2-config-version.cmake | 54 + Thirdparty/SDL2/cmake/sdl2-config.cmake | 117 + Thirdparty/SDL2/docs/CONTRIBUTING.md | 97 + Thirdparty/SDL2/docs/README-android.md | 483 + Thirdparty/SDL2/docs/README-cmake.md | 163 + Thirdparty/SDL2/docs/README-directfb.md | 123 + Thirdparty/SDL2/docs/README-dynapi.md | 138 + Thirdparty/SDL2/docs/README-emscripten.md | 76 + Thirdparty/SDL2/docs/README-gdk.md | 155 + Thirdparty/SDL2/docs/README-gesture.md | 71 + Thirdparty/SDL2/docs/README-git.md | 19 + Thirdparty/SDL2/docs/README-hg.md | 4 + Thirdparty/SDL2/docs/README-ios.md | 307 + Thirdparty/SDL2/docs/README-kmsbsd.md | 27 + Thirdparty/SDL2/docs/README-linux.md | 96 + Thirdparty/SDL2/docs/README-macos.md | 285 + Thirdparty/SDL2/docs/README-n3ds.md | 28 + Thirdparty/SDL2/docs/README-nacl.md | 103 + Thirdparty/SDL2/docs/README-ngage.md | 44 + Thirdparty/SDL2/docs/README-os2.md | 92 + Thirdparty/SDL2/docs/README-pandora.md | 17 + Thirdparty/SDL2/docs/README-platforms.md | 8 + Thirdparty/SDL2/docs/README-porting.md | 68 + Thirdparty/SDL2/docs/README-ps2.md | 51 + Thirdparty/SDL2/docs/README-psp.md | 36 + Thirdparty/SDL2/docs/README-raspberrypi.md | 180 + Thirdparty/SDL2/docs/README-riscos.md | 41 + Thirdparty/SDL2/docs/README-touch.md | 86 + Thirdparty/SDL2/docs/README-versions.md | 60 + Thirdparty/SDL2/docs/README-visualc.md | 114 + Thirdparty/SDL2/docs/README-vita.md | 33 + Thirdparty/SDL2/docs/README-wince.md | 10 + Thirdparty/SDL2/docs/README-windows.md | 58 + Thirdparty/SDL2/docs/README-winrt.md | 519 + Thirdparty/SDL2/docs/README.md | 63 + Thirdparty/SDL2/docs/doxyfile | 1561 + Thirdparty/SDL2/docs/release_checklist.md | 49 + Thirdparty/SDL2/include/SDL.h | 233 + Thirdparty/SDL2/include/SDL_assert.h | 320 + Thirdparty/SDL2/include/SDL_atomic.h | 414 + Thirdparty/SDL2/include/SDL_audio.h | 1500 + Thirdparty/SDL2/include/SDL_bits.h | 126 + Thirdparty/SDL2/include/SDL_blendmode.h | 198 + Thirdparty/SDL2/include/SDL_clipboard.h | 141 + Thirdparty/SDL2/include/SDL_config.h | 331 + Thirdparty/SDL2/include/SDL_cpuinfo.h | 594 + Thirdparty/SDL2/include/SDL_egl.h | 2352 ++ Thirdparty/SDL2/include/SDL_endian.h | 348 + Thirdparty/SDL2/include/SDL_error.h | 163 + Thirdparty/SDL2/include/SDL_events.h | 1166 + Thirdparty/SDL2/include/SDL_filesystem.h | 149 + Thirdparty/SDL2/include/SDL_gamecontroller.h | 1074 + Thirdparty/SDL2/include/SDL_gesture.h | 117 + Thirdparty/SDL2/include/SDL_guid.h | 100 + Thirdparty/SDL2/include/SDL_haptic.h | 1341 + Thirdparty/SDL2/include/SDL_hidapi.h | 451 + Thirdparty/SDL2/include/SDL_hints.h | 2613 ++ Thirdparty/SDL2/include/SDL_joystick.h | 1069 + Thirdparty/SDL2/include/SDL_keyboard.h | 353 + Thirdparty/SDL2/include/SDL_keycode.h | 358 + Thirdparty/SDL2/include/SDL_loadso.h | 115 + Thirdparty/SDL2/include/SDL_locale.h | 103 + Thirdparty/SDL2/include/SDL_log.h | 404 + Thirdparty/SDL2/include/SDL_main.h | 282 + Thirdparty/SDL2/include/SDL_messagebox.h | 193 + Thirdparty/SDL2/include/SDL_metal.h | 113 + Thirdparty/SDL2/include/SDL_misc.h | 79 + Thirdparty/SDL2/include/SDL_mouse.h | 464 + Thirdparty/SDL2/include/SDL_mutex.h | 545 + Thirdparty/SDL2/include/SDL_name.h | 33 + Thirdparty/SDL2/include/SDL_opengl.h | 2132 ++ Thirdparty/SDL2/include/SDL_opengl_glext.h | 13213 +++++++++ Thirdparty/SDL2/include/SDL_opengles.h | 39 + Thirdparty/SDL2/include/SDL_opengles2.h | 52 + Thirdparty/SDL2/include/SDL_opengles2_gl2.h | 656 + .../SDL2/include/SDL_opengles2_gl2ext.h | 4033 +++ .../SDL2/include/SDL_opengles2_gl2platform.h | 27 + .../SDL2/include/SDL_opengles2_khrplatform.h | 311 + Thirdparty/SDL2/include/SDL_pixels.h | 644 + Thirdparty/SDL2/include/SDL_platform.h | 261 + Thirdparty/SDL2/include/SDL_power.h | 87 + Thirdparty/SDL2/include/SDL_quit.h | 58 + Thirdparty/SDL2/include/SDL_rect.h | 376 + Thirdparty/SDL2/include/SDL_render.h | 1924 ++ Thirdparty/SDL2/include/SDL_revision.h | 7 + Thirdparty/SDL2/include/SDL_rwops.h | 841 + Thirdparty/SDL2/include/SDL_scancode.h | 438 + Thirdparty/SDL2/include/SDL_sensor.h | 322 + Thirdparty/SDL2/include/SDL_shape.h | 155 + Thirdparty/SDL2/include/SDL_stdinc.h | 838 + Thirdparty/SDL2/include/SDL_surface.h | 997 + Thirdparty/SDL2/include/SDL_system.h | 623 + Thirdparty/SDL2/include/SDL_syswm.h | 386 + Thirdparty/SDL2/include/SDL_test.h | 69 + Thirdparty/SDL2/include/SDL_test_assert.h | 105 + Thirdparty/SDL2/include/SDL_test_common.h | 236 + Thirdparty/SDL2/include/SDL_test_compare.h | 69 + Thirdparty/SDL2/include/SDL_test_crc32.h | 124 + Thirdparty/SDL2/include/SDL_test_font.h | 168 + Thirdparty/SDL2/include/SDL_test_fuzzer.h | 386 + Thirdparty/SDL2/include/SDL_test_harness.h | 134 + Thirdparty/SDL2/include/SDL_test_images.h | 78 + Thirdparty/SDL2/include/SDL_test_log.h | 67 + Thirdparty/SDL2/include/SDL_test_md5.h | 129 + Thirdparty/SDL2/include/SDL_test_memory.h | 63 + Thirdparty/SDL2/include/SDL_test_random.h | 115 + Thirdparty/SDL2/include/SDL_thread.h | 464 + Thirdparty/SDL2/include/SDL_timer.h | 222 + Thirdparty/SDL2/include/SDL_touch.h | 150 + Thirdparty/SDL2/include/SDL_types.h | 29 + Thirdparty/SDL2/include/SDL_version.h | 204 + Thirdparty/SDL2/include/SDL_video.h | 2178 ++ Thirdparty/SDL2/include/SDL_vulkan.h | 215 + Thirdparty/SDL2/include/begin_code.h | 187 + Thirdparty/SDL2/include/close_code.h | 40 + Thirdparty/SDL2/lib/x64/SDL2.dll | Bin 0 -> 2499584 bytes Thirdparty/SDL2/lib/x64/SDL2.lib | Bin 0 -> 183542 bytes Thirdparty/SDL2/lib/x64/SDL2main.lib | Bin 0 -> 36292 bytes Thirdparty/SDL2/lib/x64/SDL2test.lib | Bin 0 -> 951034 bytes Thirdparty/SDL2/lib/x86/SDL2.dll | Bin 0 -> 2278912 bytes Thirdparty/SDL2/lib/x86/SDL2.lib | Bin 0 -> 187788 bytes Thirdparty/SDL2/lib/x86/SDL2main.lib | Bin 0 -> 36942 bytes Thirdparty/SDL2/lib/x86/SDL2test.lib | Bin 0 -> 926004 bytes Thirdparty/glew/LICENSE.txt | 73 + Thirdparty/glew/doc/advanced.html | 232 + Thirdparty/glew/doc/basic.html | 282 + Thirdparty/glew/doc/build.html | 151 + Thirdparty/glew/doc/credits.html | 104 + Thirdparty/glew/doc/github.png | Bin 0 -> 1219 bytes Thirdparty/glew/doc/glew.css | 187 + Thirdparty/glew/doc/glew.html | 924 + Thirdparty/glew/doc/glew.png | Bin 0 -> 9298 bytes Thirdparty/glew/doc/glew.txt | 29 + Thirdparty/glew/doc/glxew.html | 186 + Thirdparty/glew/doc/gpl.txt | 340 + Thirdparty/glew/doc/index.html | 214 + Thirdparty/glew/doc/install.html | 228 + Thirdparty/glew/doc/khronos.txt | 20 + Thirdparty/glew/doc/log.html | 1238 + Thirdparty/glew/doc/mesa.txt | 21 + Thirdparty/glew/doc/new.png | Bin 0 -> 1180 bytes Thirdparty/glew/doc/ogl_sm.jpg | Bin 0 -> 1617 bytes Thirdparty/glew/doc/travis.png | Bin 0 -> 2541 bytes Thirdparty/glew/doc/wglew.html | 170 + Thirdparty/glew/include/GL/eglew.h | 2618 ++ Thirdparty/glew/include/GL/glew.h | 23686 +++++++++++++++ Thirdparty/glew/include/GL/glxew.h | 1775 ++ Thirdparty/glew/include/GL/wglew.h | 1447 + Thirdparty/glew/lib/Release/Win32/glew32.lib | Bin 0 -> 712098 bytes Thirdparty/glew/lib/Release/Win32/glew32s.lib | Bin 0 -> 2443636 bytes Thirdparty/glew/lib/Release/x64/glew32.lib | Bin 0 -> 701288 bytes Thirdparty/glew/lib/Release/x64/glew32s.lib | Bin 0 -> 2584968 bytes Thirdparty/glew/lib/glew32.lib | Bin 0 -> 701288 bytes Thirdparty/glew/lib/glew32s.lib | Bin 0 -> 2584968 bytes Thirdparty/glfw/include/GLFW/glfw3.h | 5912 ++++ Thirdparty/glfw/include/GLFW/glfw3native.h | 628 + Thirdparty/glfw/lib-vc2022/glfw3.dll | Bin 0 -> 216576 bytes Thirdparty/glfw/lib-vc2022/glfw3.lib | Bin 0 -> 634898 bytes Thirdparty/glfw/lib-vc2022/glfw3_mt.lib | Bin 0 -> 634316 bytes Thirdparty/glfw/lib-vc2022/glfw3dll.lib | Bin 0 -> 30306 bytes Thirdparty/glm/CMakeLists.txt | 70 + Thirdparty/glm/common.hpp | 539 + Thirdparty/glm/detail/_features.hpp | 394 + Thirdparty/glm/detail/_fixes.hpp | 27 + Thirdparty/glm/detail/_noise.hpp | 81 + Thirdparty/glm/detail/_swizzle.hpp | 804 + Thirdparty/glm/detail/_swizzle_func.hpp | 682 + Thirdparty/glm/detail/_vectorize.hpp | 162 + Thirdparty/glm/detail/compute_common.hpp | 50 + .../glm/detail/compute_vector_relational.hpp | 30 + Thirdparty/glm/detail/func_common.inl | 792 + Thirdparty/glm/detail/func_common_simd.inl | 231 + Thirdparty/glm/detail/func_exponential.inl | 152 + .../glm/detail/func_exponential_simd.inl | 37 + Thirdparty/glm/detail/func_geometric.inl | 243 + Thirdparty/glm/detail/func_geometric_simd.inl | 163 + Thirdparty/glm/detail/func_integer.inl | 372 + Thirdparty/glm/detail/func_integer_simd.inl | 65 + Thirdparty/glm/detail/func_matrix.inl | 398 + Thirdparty/glm/detail/func_matrix_simd.inl | 249 + Thirdparty/glm/detail/func_packing.inl | 189 + Thirdparty/glm/detail/func_packing_simd.inl | 6 + Thirdparty/glm/detail/func_trigonometric.inl | 197 + .../glm/detail/func_trigonometric_simd.inl | 0 .../glm/detail/func_vector_relational.inl | 87 + .../detail/func_vector_relational_simd.inl | 6 + Thirdparty/glm/detail/glm.cpp | 263 + Thirdparty/glm/detail/qualifier.hpp | 230 + Thirdparty/glm/detail/setup.hpp | 1135 + Thirdparty/glm/detail/type_float.hpp | 68 + Thirdparty/glm/detail/type_half.hpp | 16 + Thirdparty/glm/detail/type_half.inl | 241 + Thirdparty/glm/detail/type_mat2x2.hpp | 177 + Thirdparty/glm/detail/type_mat2x2.inl | 536 + Thirdparty/glm/detail/type_mat2x3.hpp | 159 + Thirdparty/glm/detail/type_mat2x3.inl | 510 + Thirdparty/glm/detail/type_mat2x4.hpp | 161 + Thirdparty/glm/detail/type_mat2x4.inl | 520 + Thirdparty/glm/detail/type_mat3x2.hpp | 167 + Thirdparty/glm/detail/type_mat3x2.inl | 532 + Thirdparty/glm/detail/type_mat3x3.hpp | 184 + Thirdparty/glm/detail/type_mat3x3.inl | 601 + Thirdparty/glm/detail/type_mat3x4.hpp | 166 + Thirdparty/glm/detail/type_mat3x4.inl | 578 + Thirdparty/glm/detail/type_mat4x2.hpp | 171 + Thirdparty/glm/detail/type_mat4x2.inl | 574 + Thirdparty/glm/detail/type_mat4x3.hpp | 171 + Thirdparty/glm/detail/type_mat4x3.inl | 598 + Thirdparty/glm/detail/type_mat4x4.hpp | 189 + Thirdparty/glm/detail/type_mat4x4.inl | 706 + Thirdparty/glm/detail/type_mat4x4_simd.inl | 6 + Thirdparty/glm/detail/type_quat.hpp | 186 + Thirdparty/glm/detail/type_quat.inl | 408 + Thirdparty/glm/detail/type_quat_simd.inl | 188 + Thirdparty/glm/detail/type_vec1.hpp | 308 + Thirdparty/glm/detail/type_vec1.inl | 551 + Thirdparty/glm/detail/type_vec2.hpp | 399 + Thirdparty/glm/detail/type_vec2.inl | 913 + Thirdparty/glm/detail/type_vec3.hpp | 432 + Thirdparty/glm/detail/type_vec3.inl | 1068 + Thirdparty/glm/detail/type_vec4.hpp | 505 + Thirdparty/glm/detail/type_vec4.inl | 1140 + Thirdparty/glm/detail/type_vec4_simd.inl | 775 + Thirdparty/glm/exponential.hpp | 110 + Thirdparty/glm/ext.hpp | 253 + Thirdparty/glm/ext/matrix_clip_space.hpp | 522 + Thirdparty/glm/ext/matrix_clip_space.inl | 555 + Thirdparty/glm/ext/matrix_common.hpp | 36 + Thirdparty/glm/ext/matrix_common.inl | 16 + Thirdparty/glm/ext/matrix_double2x2.hpp | 23 + .../glm/ext/matrix_double2x2_precision.hpp | 49 + Thirdparty/glm/ext/matrix_double2x3.hpp | 18 + .../glm/ext/matrix_double2x3_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double2x4.hpp | 18 + .../glm/ext/matrix_double2x4_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double3x2.hpp | 18 + .../glm/ext/matrix_double3x2_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double3x3.hpp | 23 + .../glm/ext/matrix_double3x3_precision.hpp | 49 + Thirdparty/glm/ext/matrix_double3x4.hpp | 18 + .../glm/ext/matrix_double3x4_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double4x2.hpp | 18 + .../glm/ext/matrix_double4x2_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double4x3.hpp | 18 + .../glm/ext/matrix_double4x3_precision.hpp | 31 + Thirdparty/glm/ext/matrix_double4x4.hpp | 23 + .../glm/ext/matrix_double4x4_precision.hpp | 49 + Thirdparty/glm/ext/matrix_float2x2.hpp | 23 + .../glm/ext/matrix_float2x2_precision.hpp | 49 + Thirdparty/glm/ext/matrix_float2x3.hpp | 18 + .../glm/ext/matrix_float2x3_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float2x4.hpp | 18 + .../glm/ext/matrix_float2x4_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float3x2.hpp | 18 + .../glm/ext/matrix_float3x2_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float3x3.hpp | 23 + .../glm/ext/matrix_float3x3_precision.hpp | 49 + Thirdparty/glm/ext/matrix_float3x4.hpp | 18 + .../glm/ext/matrix_float3x4_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float4x2.hpp | 18 + .../glm/ext/matrix_float4x2_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float4x3.hpp | 18 + .../glm/ext/matrix_float4x3_precision.hpp | 31 + Thirdparty/glm/ext/matrix_float4x4.hpp | 23 + .../glm/ext/matrix_float4x4_precision.hpp | 49 + Thirdparty/glm/ext/matrix_int2x2.hpp | 38 + Thirdparty/glm/ext/matrix_int2x2_sized.hpp | 70 + Thirdparty/glm/ext/matrix_int2x3.hpp | 33 + Thirdparty/glm/ext/matrix_int2x3_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int2x4.hpp | 33 + Thirdparty/glm/ext/matrix_int2x4_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int3x2.hpp | 33 + Thirdparty/glm/ext/matrix_int3x2_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int3x3.hpp | 38 + Thirdparty/glm/ext/matrix_int3x3_sized.hpp | 70 + Thirdparty/glm/ext/matrix_int3x4.hpp | 33 + Thirdparty/glm/ext/matrix_int3x4_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int4x2.hpp | 33 + Thirdparty/glm/ext/matrix_int4x2_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int4x3.hpp | 33 + Thirdparty/glm/ext/matrix_int4x3_sized.hpp | 49 + Thirdparty/glm/ext/matrix_int4x4.hpp | 38 + Thirdparty/glm/ext/matrix_int4x4_sized.hpp | 70 + Thirdparty/glm/ext/matrix_projection.hpp | 149 + Thirdparty/glm/ext/matrix_projection.inl | 106 + Thirdparty/glm/ext/matrix_relational.hpp | 132 + Thirdparty/glm/ext/matrix_relational.inl | 82 + Thirdparty/glm/ext/matrix_transform.hpp | 144 + Thirdparty/glm/ext/matrix_transform.inl | 152 + Thirdparty/glm/ext/matrix_uint2x2.hpp | 38 + Thirdparty/glm/ext/matrix_uint2x2_sized.hpp | 70 + Thirdparty/glm/ext/matrix_uint2x3.hpp | 33 + Thirdparty/glm/ext/matrix_uint2x3_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint2x4.hpp | 33 + Thirdparty/glm/ext/matrix_uint2x4_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint3x2.hpp | 33 + Thirdparty/glm/ext/matrix_uint3x2_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint3x3.hpp | 38 + Thirdparty/glm/ext/matrix_uint3x3_sized.hpp | 70 + Thirdparty/glm/ext/matrix_uint3x4.hpp | 33 + Thirdparty/glm/ext/matrix_uint3x4_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint4x2.hpp | 33 + Thirdparty/glm/ext/matrix_uint4x2_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint4x3.hpp | 33 + Thirdparty/glm/ext/matrix_uint4x3_sized.hpp | 49 + Thirdparty/glm/ext/matrix_uint4x4.hpp | 38 + Thirdparty/glm/ext/matrix_uint4x4_sized.hpp | 70 + Thirdparty/glm/ext/quaternion_common.hpp | 135 + Thirdparty/glm/ext/quaternion_common.inl | 144 + Thirdparty/glm/ext/quaternion_common_simd.inl | 18 + Thirdparty/glm/ext/quaternion_double.hpp | 39 + .../glm/ext/quaternion_double_precision.hpp | 42 + Thirdparty/glm/ext/quaternion_exponential.hpp | 63 + Thirdparty/glm/ext/quaternion_exponential.inl | 85 + Thirdparty/glm/ext/quaternion_float.hpp | 39 + .../glm/ext/quaternion_float_precision.hpp | 36 + Thirdparty/glm/ext/quaternion_geometric.hpp | 70 + Thirdparty/glm/ext/quaternion_geometric.inl | 36 + Thirdparty/glm/ext/quaternion_relational.hpp | 62 + Thirdparty/glm/ext/quaternion_relational.inl | 35 + Thirdparty/glm/ext/quaternion_transform.hpp | 47 + Thirdparty/glm/ext/quaternion_transform.inl | 24 + .../glm/ext/quaternion_trigonometric.hpp | 63 + .../glm/ext/quaternion_trigonometric.inl | 34 + Thirdparty/glm/ext/scalar_common.hpp | 157 + Thirdparty/glm/ext/scalar_common.inl | 152 + Thirdparty/glm/ext/scalar_constants.hpp | 40 + Thirdparty/glm/ext/scalar_constants.inl | 24 + Thirdparty/glm/ext/scalar_int_sized.hpp | 70 + Thirdparty/glm/ext/scalar_integer.hpp | 92 + Thirdparty/glm/ext/scalar_integer.inl | 243 + Thirdparty/glm/ext/scalar_packing.hpp | 32 + Thirdparty/glm/ext/scalar_packing.inl | 0 Thirdparty/glm/ext/scalar_relational.hpp | 65 + Thirdparty/glm/ext/scalar_relational.inl | 40 + Thirdparty/glm/ext/scalar_uint_sized.hpp | 70 + Thirdparty/glm/ext/scalar_ulp.hpp | 74 + Thirdparty/glm/ext/scalar_ulp.inl | 284 + Thirdparty/glm/ext/vector_bool1.hpp | 30 + Thirdparty/glm/ext/vector_bool1_precision.hpp | 34 + Thirdparty/glm/ext/vector_bool2.hpp | 18 + Thirdparty/glm/ext/vector_bool2_precision.hpp | 31 + Thirdparty/glm/ext/vector_bool3.hpp | 18 + Thirdparty/glm/ext/vector_bool3_precision.hpp | 31 + Thirdparty/glm/ext/vector_bool4.hpp | 18 + Thirdparty/glm/ext/vector_bool4_precision.hpp | 31 + Thirdparty/glm/ext/vector_common.hpp | 204 + Thirdparty/glm/ext/vector_common.inl | 129 + Thirdparty/glm/ext/vector_double1.hpp | 31 + .../glm/ext/vector_double1_precision.hpp | 36 + Thirdparty/glm/ext/vector_double2.hpp | 18 + .../glm/ext/vector_double2_precision.hpp | 31 + Thirdparty/glm/ext/vector_double3.hpp | 18 + .../glm/ext/vector_double3_precision.hpp | 34 + Thirdparty/glm/ext/vector_double4.hpp | 18 + .../glm/ext/vector_double4_precision.hpp | 35 + Thirdparty/glm/ext/vector_float1.hpp | 31 + .../glm/ext/vector_float1_precision.hpp | 36 + Thirdparty/glm/ext/vector_float2.hpp | 18 + .../glm/ext/vector_float2_precision.hpp | 31 + Thirdparty/glm/ext/vector_float3.hpp | 18 + .../glm/ext/vector_float3_precision.hpp | 31 + Thirdparty/glm/ext/vector_float4.hpp | 18 + .../glm/ext/vector_float4_precision.hpp | 31 + Thirdparty/glm/ext/vector_int1.hpp | 32 + Thirdparty/glm/ext/vector_int1_sized.hpp | 49 + Thirdparty/glm/ext/vector_int2.hpp | 18 + Thirdparty/glm/ext/vector_int2_sized.hpp | 49 + Thirdparty/glm/ext/vector_int3.hpp | 18 + Thirdparty/glm/ext/vector_int3_sized.hpp | 49 + Thirdparty/glm/ext/vector_int4.hpp | 18 + Thirdparty/glm/ext/vector_int4_sized.hpp | 49 + Thirdparty/glm/ext/vector_integer.hpp | 149 + Thirdparty/glm/ext/vector_integer.inl | 85 + Thirdparty/glm/ext/vector_packing.hpp | 32 + Thirdparty/glm/ext/vector_packing.inl | 0 Thirdparty/glm/ext/vector_relational.hpp | 107 + Thirdparty/glm/ext/vector_relational.inl | 75 + Thirdparty/glm/ext/vector_uint1.hpp | 32 + Thirdparty/glm/ext/vector_uint1_sized.hpp | 49 + Thirdparty/glm/ext/vector_uint2.hpp | 18 + Thirdparty/glm/ext/vector_uint2_sized.hpp | 49 + Thirdparty/glm/ext/vector_uint3.hpp | 18 + Thirdparty/glm/ext/vector_uint3_sized.hpp | 49 + Thirdparty/glm/ext/vector_uint4.hpp | 18 + Thirdparty/glm/ext/vector_uint4_sized.hpp | 49 + Thirdparty/glm/ext/vector_ulp.hpp | 109 + Thirdparty/glm/ext/vector_ulp.inl | 74 + Thirdparty/glm/fwd.hpp | 1233 + Thirdparty/glm/geometric.hpp | 116 + Thirdparty/glm/glm.hpp | 136 + Thirdparty/glm/gtc/bitfield.hpp | 266 + Thirdparty/glm/gtc/bitfield.inl | 626 + Thirdparty/glm/gtc/color_space.hpp | 56 + Thirdparty/glm/gtc/color_space.inl | 84 + Thirdparty/glm/gtc/constants.hpp | 165 + Thirdparty/glm/gtc/constants.inl | 167 + Thirdparty/glm/gtc/epsilon.hpp | 60 + Thirdparty/glm/gtc/epsilon.inl | 80 + Thirdparty/glm/gtc/integer.hpp | 65 + Thirdparty/glm/gtc/integer.inl | 68 + Thirdparty/glm/gtc/matrix_access.hpp | 60 + Thirdparty/glm/gtc/matrix_access.inl | 62 + Thirdparty/glm/gtc/matrix_integer.hpp | 433 + Thirdparty/glm/gtc/matrix_inverse.hpp | 50 + Thirdparty/glm/gtc/matrix_inverse.inl | 118 + Thirdparty/glm/gtc/matrix_transform.hpp | 36 + Thirdparty/glm/gtc/matrix_transform.inl | 3 + Thirdparty/glm/gtc/noise.hpp | 61 + Thirdparty/glm/gtc/noise.inl | 807 + Thirdparty/glm/gtc/packing.hpp | 728 + Thirdparty/glm/gtc/packing.inl | 938 + Thirdparty/glm/gtc/quaternion.hpp | 173 + Thirdparty/glm/gtc/quaternion.inl | 202 + Thirdparty/glm/gtc/quaternion_simd.inl | 0 Thirdparty/glm/gtc/random.hpp | 82 + Thirdparty/glm/gtc/random.inl | 303 + Thirdparty/glm/gtc/reciprocal.hpp | 135 + Thirdparty/glm/gtc/reciprocal.inl | 191 + Thirdparty/glm/gtc/round.hpp | 160 + Thirdparty/glm/gtc/round.inl | 155 + Thirdparty/glm/gtc/type_aligned.hpp | 1315 + Thirdparty/glm/gtc/type_precision.hpp | 2094 ++ Thirdparty/glm/gtc/type_precision.inl | 6 + Thirdparty/glm/gtc/type_ptr.hpp | 230 + Thirdparty/glm/gtc/type_ptr.inl | 386 + Thirdparty/glm/gtc/ulp.hpp | 152 + Thirdparty/glm/gtc/ulp.inl | 173 + Thirdparty/glm/gtc/vec1.hpp | 30 + Thirdparty/glm/gtx/associated_min_max.hpp | 207 + Thirdparty/glm/gtx/associated_min_max.inl | 354 + Thirdparty/glm/gtx/bit.hpp | 98 + Thirdparty/glm/gtx/bit.inl | 92 + Thirdparty/glm/gtx/closest_point.hpp | 49 + Thirdparty/glm/gtx/closest_point.inl | 45 + Thirdparty/glm/gtx/color_encoding.hpp | 54 + Thirdparty/glm/gtx/color_encoding.inl | 45 + Thirdparty/glm/gtx/color_space.hpp | 72 + Thirdparty/glm/gtx/color_space.inl | 141 + Thirdparty/glm/gtx/color_space_YCoCg.hpp | 60 + Thirdparty/glm/gtx/color_space_YCoCg.inl | 107 + Thirdparty/glm/gtx/common.hpp | 76 + Thirdparty/glm/gtx/common.inl | 125 + Thirdparty/glm/gtx/compatibility.hpp | 133 + Thirdparty/glm/gtx/compatibility.inl | 62 + Thirdparty/glm/gtx/component_wise.hpp | 69 + Thirdparty/glm/gtx/component_wise.inl | 127 + Thirdparty/glm/gtx/dual_quaternion.hpp | 274 + Thirdparty/glm/gtx/dual_quaternion.inl | 352 + Thirdparty/glm/gtx/easing.hpp | 219 + Thirdparty/glm/gtx/easing.inl | 436 + Thirdparty/glm/gtx/euler_angles.hpp | 335 + Thirdparty/glm/gtx/euler_angles.inl | 899 + Thirdparty/glm/gtx/extend.hpp | 42 + Thirdparty/glm/gtx/extend.inl | 48 + Thirdparty/glm/gtx/extended_min_max.hpp | 137 + Thirdparty/glm/gtx/extended_min_max.inl | 138 + Thirdparty/glm/gtx/exterior_product.hpp | 45 + Thirdparty/glm/gtx/exterior_product.inl | 26 + Thirdparty/glm/gtx/fast_exponential.hpp | 95 + Thirdparty/glm/gtx/fast_exponential.inl | 136 + Thirdparty/glm/gtx/fast_square_root.hpp | 92 + Thirdparty/glm/gtx/fast_square_root.inl | 75 + Thirdparty/glm/gtx/fast_trigonometry.hpp | 79 + Thirdparty/glm/gtx/fast_trigonometry.inl | 142 + Thirdparty/glm/gtx/float_notmalize.inl | 13 + Thirdparty/glm/gtx/functions.hpp | 56 + Thirdparty/glm/gtx/functions.inl | 30 + Thirdparty/glm/gtx/gradient_paint.hpp | 53 + Thirdparty/glm/gtx/gradient_paint.inl | 36 + .../glm/gtx/handed_coordinate_space.hpp | 50 + .../glm/gtx/handed_coordinate_space.inl | 26 + Thirdparty/glm/gtx/hash.hpp | 142 + Thirdparty/glm/gtx/hash.inl | 184 + Thirdparty/glm/gtx/integer.hpp | 76 + Thirdparty/glm/gtx/integer.inl | 185 + Thirdparty/glm/gtx/intersect.hpp | 92 + Thirdparty/glm/gtx/intersect.inl | 200 + Thirdparty/glm/gtx/io.hpp | 201 + Thirdparty/glm/gtx/io.inl | 440 + Thirdparty/glm/gtx/log_base.hpp | 48 + Thirdparty/glm/gtx/log_base.inl | 16 + Thirdparty/glm/gtx/matrix_cross_product.hpp | 47 + Thirdparty/glm/gtx/matrix_cross_product.inl | 37 + Thirdparty/glm/gtx/matrix_decompose.hpp | 46 + Thirdparty/glm/gtx/matrix_decompose.inl | 186 + Thirdparty/glm/gtx/matrix_factorisation.hpp | 69 + Thirdparty/glm/gtx/matrix_factorisation.inl | 84 + Thirdparty/glm/gtx/matrix_interpolation.hpp | 60 + Thirdparty/glm/gtx/matrix_interpolation.inl | 129 + Thirdparty/glm/gtx/matrix_major_storage.hpp | 119 + Thirdparty/glm/gtx/matrix_major_storage.inl | 166 + Thirdparty/glm/gtx/matrix_operation.hpp | 103 + Thirdparty/glm/gtx/matrix_operation.inl | 176 + Thirdparty/glm/gtx/matrix_query.hpp | 77 + Thirdparty/glm/gtx/matrix_query.inl | 113 + Thirdparty/glm/gtx/matrix_transform_2d.hpp | 81 + Thirdparty/glm/gtx/matrix_transform_2d.inl | 68 + Thirdparty/glm/gtx/mixed_product.hpp | 41 + Thirdparty/glm/gtx/mixed_product.inl | 15 + Thirdparty/glm/gtx/norm.hpp | 88 + Thirdparty/glm/gtx/norm.inl | 95 + Thirdparty/glm/gtx/normal.hpp | 41 + Thirdparty/glm/gtx/normal.inl | 15 + Thirdparty/glm/gtx/normalize_dot.hpp | 49 + Thirdparty/glm/gtx/normalize_dot.inl | 16 + Thirdparty/glm/gtx/number_precision.hpp | 61 + Thirdparty/glm/gtx/number_precision.inl | 6 + Thirdparty/glm/gtx/optimum_pow.hpp | 54 + Thirdparty/glm/gtx/optimum_pow.inl | 22 + Thirdparty/glm/gtx/orthonormalize.hpp | 49 + Thirdparty/glm/gtx/orthonormalize.inl | 29 + Thirdparty/glm/gtx/perpendicular.hpp | 41 + Thirdparty/glm/gtx/perpendicular.inl | 10 + Thirdparty/glm/gtx/polar_coordinates.hpp | 48 + Thirdparty/glm/gtx/polar_coordinates.inl | 36 + Thirdparty/glm/gtx/projection.hpp | 43 + Thirdparty/glm/gtx/projection.inl | 10 + Thirdparty/glm/gtx/quaternion.hpp | 174 + Thirdparty/glm/gtx/quaternion.inl | 159 + Thirdparty/glm/gtx/range.hpp | 98 + Thirdparty/glm/gtx/raw_data.hpp | 51 + Thirdparty/glm/gtx/raw_data.inl | 2 + Thirdparty/glm/gtx/rotate_normalized_axis.hpp | 68 + Thirdparty/glm/gtx/rotate_normalized_axis.inl | 58 + Thirdparty/glm/gtx/rotate_vector.hpp | 123 + Thirdparty/glm/gtx/rotate_vector.inl | 187 + Thirdparty/glm/gtx/scalar_multiplication.hpp | 75 + Thirdparty/glm/gtx/scalar_relational.hpp | 36 + Thirdparty/glm/gtx/scalar_relational.inl | 88 + Thirdparty/glm/gtx/spline.hpp | 65 + Thirdparty/glm/gtx/spline.inl | 60 + Thirdparty/glm/gtx/std_based_type.hpp | 68 + Thirdparty/glm/gtx/std_based_type.inl | 6 + Thirdparty/glm/gtx/string_cast.hpp | 52 + Thirdparty/glm/gtx/string_cast.inl | 492 + Thirdparty/glm/gtx/texture.hpp | 46 + Thirdparty/glm/gtx/texture.inl | 17 + Thirdparty/glm/gtx/transform.hpp | 60 + Thirdparty/glm/gtx/transform.inl | 23 + Thirdparty/glm/gtx/transform2.hpp | 89 + Thirdparty/glm/gtx/transform2.inl | 125 + Thirdparty/glm/gtx/type_aligned.hpp | 982 + Thirdparty/glm/gtx/type_aligned.inl | 6 + Thirdparty/glm/gtx/type_trait.hpp | 85 + Thirdparty/glm/gtx/type_trait.inl | 61 + Thirdparty/glm/gtx/vec_swizzle.hpp | 2782 ++ Thirdparty/glm/gtx/vector_angle.hpp | 57 + Thirdparty/glm/gtx/vector_angle.inl | 44 + Thirdparty/glm/gtx/vector_query.hpp | 66 + Thirdparty/glm/gtx/vector_query.inl | 154 + Thirdparty/glm/gtx/wrap.hpp | 37 + Thirdparty/glm/gtx/wrap.inl | 6 + Thirdparty/glm/integer.hpp | 212 + Thirdparty/glm/mat2x2.hpp | 9 + Thirdparty/glm/mat2x3.hpp | 9 + Thirdparty/glm/mat2x4.hpp | 9 + Thirdparty/glm/mat3x2.hpp | 9 + Thirdparty/glm/mat3x3.hpp | 8 + Thirdparty/glm/mat3x4.hpp | 8 + Thirdparty/glm/mat4x2.hpp | 9 + Thirdparty/glm/mat4x3.hpp | 8 + Thirdparty/glm/mat4x4.hpp | 9 + Thirdparty/glm/matrix.hpp | 161 + Thirdparty/glm/packing.hpp | 173 + Thirdparty/glm/simd/common.h | 240 + Thirdparty/glm/simd/exponential.h | 20 + Thirdparty/glm/simd/geometric.h | 124 + Thirdparty/glm/simd/integer.h | 115 + Thirdparty/glm/simd/matrix.h | 1028 + Thirdparty/glm/simd/neon.h | 155 + Thirdparty/glm/simd/packing.h | 8 + Thirdparty/glm/simd/platform.h | 398 + Thirdparty/glm/simd/trigonometric.h | 9 + Thirdparty/glm/simd/vector_relational.h | 8 + Thirdparty/glm/trigonometric.hpp | 210 + Thirdparty/glm/vec2.hpp | 14 + Thirdparty/glm/vec3.hpp | 14 + Thirdparty/glm/vec4.hpp | 15 + Thirdparty/glm/vector_relational.hpp | 121 + Thirdparty/irrKlang/changes.txt | 780 + Thirdparty/irrKlang/doc/cpp/annotated.html | 99 + Thirdparty/irrKlang/doc/cpp/classes.html | 85 + ...irrklang_1_1_i_audio_recorder-members.html | 93 + .../classirrklang_1_1_i_audio_recorder.gif | Bin 0 -> 1031 bytes .../classirrklang_1_1_i_audio_recorder.html | 368 + ...ssirrklang_1_1_i_audio_stream-members.html | 89 + .../cpp/classirrklang_1_1_i_audio_stream.gif | Bin 0 -> 788 bytes .../cpp/classirrklang_1_1_i_audio_stream.html | 239 + ...ang_1_1_i_audio_stream_loader-members.html | 87 + ...lassirrklang_1_1_i_audio_stream_loader.gif | Bin 0 -> 876 bytes ...assirrklang_1_1_i_audio_stream_loader.html | 175 + ..._captured_audio_data_receiver-members.html | 85 + ...ang_1_1_i_captured_audio_data_receiver.gif | Bin 0 -> 999 bytes ...ng_1_1_i_captured_audio_data_receiver.html | 147 + ...ssirrklang_1_1_i_file_factory-members.html | 86 + .../cpp/classirrklang_1_1_i_file_factory.gif | Bin 0 -> 966 bytes .../cpp/classirrklang_1_1_i_file_factory.html | 157 + ...assirrklang_1_1_i_file_reader-members.html | 90 + .../cpp/classirrklang_1_1_i_file_reader.gif | Bin 0 -> 961 bytes .../cpp/classirrklang_1_1_i_file_reader.html | 260 + ...assirrklang_1_1_i_ref_counted-members.html | 84 + .../cpp/classirrklang_1_1_i_ref_counted.gif | Bin 0 -> 4695 bytes .../cpp/classirrklang_1_1_i_ref_counted.html | 205 + .../classirrklang_1_1_i_sound-members.html | 109 + .../doc/cpp/classirrklang_1_1_i_sound.gif | Bin 0 -> 821 bytes .../doc/cpp/classirrklang_1_1_i_sound.html | 714 + ...klang_1_1_i_sound_device_list-members.html | 87 + .../classirrklang_1_1_i_sound_device_list.gif | Bin 0 -> 845 bytes ...classirrklang_1_1_i_sound_device_list.html | 186 + ...ng_1_1_i_sound_effect_control-members.html | 108 + ...ssirrklang_1_1_i_sound_effect_control.html | 1087 + ...ssirrklang_1_1_i_sound_engine-members.html | 120 + .../cpp/classirrklang_1_1_i_sound_engine.gif | Bin 0 -> 994 bytes .../cpp/classirrklang_1_1_i_sound_engine.html | 1299 + ...i_sound_mixed_output_receiver-members.html | 82 + ...ang_1_1_i_sound_mixed_output_receiver.html | 166 + ...ssirrklang_1_1_i_sound_source-members.html | 99 + .../cpp/classirrklang_1_1_i_sound_source.gif | Bin 0 -> 867 bytes .../cpp/classirrklang_1_1_i_sound_source.html | 490 + ...1_i_sound_stop_event_receiver-members.html | 82 + ...klang_1_1_i_sound_stop_event_receiver.html | 166 + ...ang_1_1_i_virtual_ref_counted-members.html | 83 + ...lassirrklang_1_1_i_virtual_ref_counted.gif | Bin 0 -> 1292 bytes ...assirrklang_1_1_i_virtual_ref_counted.html | 175 + .../cpp/classirrklang_1_1vec3d-members.html | 123 + .../doc/cpp/classirrklang_1_1vec3d.html | 1142 + Thirdparty/irrKlang/doc/cpp/doxygen.css | 374 + Thirdparty/irrKlang/doc/cpp/doxygen.png | Bin 0 -> 1281 bytes Thirdparty/irrKlang/doc/cpp/files.html | 101 + Thirdparty/irrKlang/doc/cpp/functions.html | 131 + .../irrKlang/doc/cpp/functions_0x63.html | 128 + .../irrKlang/doc/cpp/functions_0x64.html | 150 + .../irrKlang/doc/cpp/functions_0x65.html | 143 + .../irrKlang/doc/cpp/functions_0x66.html | 119 + .../irrKlang/doc/cpp/functions_0x67.html | 260 + .../irrKlang/doc/cpp/functions_0x69.html | 167 + .../irrKlang/doc/cpp/functions_0x6c.html | 116 + .../irrKlang/doc/cpp/functions_0x6e.html | 116 + .../irrKlang/doc/cpp/functions_0x6f.html | 161 + .../irrKlang/doc/cpp/functions_0x70.html | 134 + .../irrKlang/doc/cpp/functions_0x72.html | 137 + .../irrKlang/doc/cpp/functions_0x73.html | 219 + .../irrKlang/doc/cpp/functions_0x75.html | 116 + .../irrKlang/doc/cpp/functions_0x76.html | 116 + .../irrKlang/doc/cpp/functions_0x78.html | 116 + .../irrKlang/doc/cpp/functions_0x79.html | 116 + .../irrKlang/doc/cpp/functions_0x7a.html | 116 + .../irrKlang/doc/cpp/functions_0x7e.html | 137 + .../irrKlang/doc/cpp/functions_func.html | 685 + .../irrKlang/doc/cpp/functions_vars.html | 124 + Thirdparty/irrKlang/doc/cpp/globals.html | 95 + Thirdparty/irrKlang/doc/cpp/globals_defs.html | 95 + Thirdparty/irrKlang/doc/cpp/hierarchy.html | 103 + .../cpp/ik___e_sound_engine_options_8h.html | 105 + ...ik___e_sound_engine_options_8h_source.html | 120 + .../cpp/ik___e_sound_output_drivers_8h.html | 105 + ...ik___e_sound_output_drivers_8h_source.html | 116 + .../doc/cpp/ik___e_stream_modes_8h.html | 96 + .../cpp/ik___e_stream_modes_8h_source.html | 101 + .../doc/cpp/ik___i_audio_recorder_8h.html | 95 + .../cpp/ik___i_audio_recorder_8h_source.html | 142 + .../doc/cpp/ik___i_audio_stream_8h.html | 93 + .../cpp/ik___i_audio_stream_8h_source.html | 113 + .../cpp/ik___i_audio_stream_loader_8h.html | 93 + .../ik___i_audio_stream_loader_8h_source.html | 109 + .../doc/cpp/ik___i_file_factory_8h.html | 92 + .../cpp/ik___i_file_factory_8h_source.html | 104 + .../doc/cpp/ik___i_file_reader_8h.html | 92 + .../doc/cpp/ik___i_file_reader_8h_source.html | 109 + .../doc/cpp/ik___i_ref_counted_8h.html | 92 + .../doc/cpp/ik___i_ref_counted_8h_source.html | 125 + .../irrKlang/doc/cpp/ik___i_sound_8h.html | 94 + .../doc/cpp/ik___i_sound_8h_source.html | 174 + .../doc/cpp/ik___i_sound_device_list_8h.html | 92 + .../ik___i_sound_device_list_8h_source.html | 107 + .../cpp/ik___i_sound_effect_control_8h.html | 93 + ...ik___i_sound_effect_control_8h_source.html | 205 + .../doc/cpp/ik___i_sound_engine_8h.html | 100 + .../cpp/ik___i_sound_engine_8h_source.html | 252 + ...ik___i_sound_mixed_output_receiver_8h.html | 93 + ...sound_mixed_output_receiver_8h_source.html | 109 + .../doc/cpp/ik___i_sound_source_8h.html | 95 + .../cpp/ik___i_sound_source_8h_source.html | 138 + .../ik___i_sound_stop_event_receiver_8h.html | 101 + ...i_sound_stop_event_receiver_8h_source.html | 121 + .../cpp/ik___i_virtual_ref_counted_8h.html | 92 + .../ik___i_virtual_ref_counted_8h_source.html | 113 + .../cpp/ik___s_audio_stream_format_8h.html | 98 + .../ik___s_audio_stream_format_8h_source.html | 135 + .../doc/cpp/ik__irr_klang_types_8h.html | 118 + .../cpp/ik__irr_klang_types_8h_source.html | 154 + Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h.html | 101 + .../irrKlang/doc/cpp/ik__vec3d_8h_source.html | 302 + Thirdparty/irrKlang/doc/cpp/index.html | 667 + Thirdparty/irrKlang/doc/cpp/installdox | 117 + Thirdparty/irrKlang/doc/cpp/irr_klang_8h.html | 175 + .../irrKlang/doc/cpp/irr_klang_8h_source.html | 172 + Thirdparty/irrKlang/doc/cpp/irrklang.png | Bin 0 -> 3161 bytes Thirdparty/irrKlang/doc/cpp/logobig.png | Bin 0 -> 14460 bytes .../irrKlang/doc/cpp/namespaceirrklang.html | 973 + .../irrKlang/doc/cpp/namespacemembers.html | 296 + .../doc/cpp/namespacemembers_enum.html | 105 + .../doc/cpp/namespacemembers_eval.html | 174 + .../doc/cpp/namespacemembers_func.html | 111 + .../doc/cpp/namespacemembers_type.html | 123 + .../doc/cpp/namespacemembers_vars.html | 111 + Thirdparty/irrKlang/doc/cpp/namespaces.html | 81 + .../irrKlang/doc/cpp/search/all_61.html | 56 + .../irrKlang/doc/cpp/search/all_63.html | 74 + .../irrKlang/doc/cpp/search/all_64.html | 95 + .../irrKlang/doc/cpp/search/all_65.html | 284 + .../irrKlang/doc/cpp/search/all_66.html | 32 + .../irrKlang/doc/cpp/search/all_67.html | 321 + .../irrKlang/doc/cpp/search/all_69.html | 445 + .../irrKlang/doc/cpp/search/all_6c.html | 26 + .../irrKlang/doc/cpp/search/all_6d.html | 26 + .../irrKlang/doc/cpp/search/all_6e.html | 26 + .../irrKlang/doc/cpp/search/all_6f.html | 132 + .../irrKlang/doc/cpp/search/all_70.html | 68 + .../irrKlang/doc/cpp/search/all_72.html | 71 + .../irrKlang/doc/cpp/search/all_73.html | 248 + .../irrKlang/doc/cpp/search/all_75.html | 26 + .../irrKlang/doc/cpp/search/all_76.html | 48 + .../irrKlang/doc/cpp/search/all_78.html | 26 + .../irrKlang/doc/cpp/search/all_79.html | 26 + .../irrKlang/doc/cpp/search/all_7a.html | 26 + .../irrKlang/doc/cpp/search/all_7e.html | 68 + .../irrKlang/doc/cpp/search/classes_69.html | 110 + .../irrKlang/doc/cpp/search/classes_73.html | 32 + .../irrKlang/doc/cpp/search/classes_76.html | 26 + Thirdparty/irrKlang/doc/cpp/search/close.png | Bin 0 -> 273 bytes .../irrKlang/doc/cpp/search/defines_69.html | 38 + .../irrKlang/doc/cpp/search/enums_65.html | 50 + .../doc/cpp/search/enumvalues_65.html | 188 + .../irrKlang/doc/cpp/search/files_69.html | 125 + .../irrKlang/doc/cpp/search/functions_61.html | 56 + .../irrKlang/doc/cpp/search/functions_63.html | 68 + .../irrKlang/doc/cpp/search/functions_64.html | 95 + .../irrKlang/doc/cpp/search/functions_65.html | 86 + .../irrKlang/doc/cpp/search/functions_66.html | 26 + .../irrKlang/doc/cpp/search/functions_67.html | 321 + .../irrKlang/doc/cpp/search/functions_69.html | 131 + .../irrKlang/doc/cpp/search/functions_6c.html | 26 + .../irrKlang/doc/cpp/search/functions_6d.html | 26 + .../irrKlang/doc/cpp/search/functions_6e.html | 26 + .../irrKlang/doc/cpp/search/functions_6f.html | 132 + .../irrKlang/doc/cpp/search/functions_70.html | 38 + .../irrKlang/doc/cpp/search/functions_72.html | 71 + .../irrKlang/doc/cpp/search/functions_73.html | 224 + .../irrKlang/doc/cpp/search/functions_75.html | 26 + .../irrKlang/doc/cpp/search/functions_76.html | 30 + .../irrKlang/doc/cpp/search/functions_7e.html | 68 + .../doc/cpp/search/namespaces_69.html | 25 + .../irrKlang/doc/cpp/search/nomatches.html | 12 + Thirdparty/irrKlang/doc/cpp/search/search.css | 198 + Thirdparty/irrKlang/doc/cpp/search/search.js | 744 + Thirdparty/irrKlang/doc/cpp/search/search.png | Bin 0 -> 527 bytes .../irrKlang/doc/cpp/search/typedefs_69.html | 74 + .../irrKlang/doc/cpp/search/typedefs_76.html | 32 + .../irrKlang/doc/cpp/search/variables_63.html | 26 + .../irrKlang/doc/cpp/search/variables_66.html | 26 + .../irrKlang/doc/cpp/search/variables_69.html | 62 + .../irrKlang/doc/cpp/search/variables_70.html | 50 + .../irrKlang/doc/cpp/search/variables_73.html | 32 + .../irrKlang/doc/cpp/search/variables_78.html | 26 + .../irrKlang/doc/cpp/search/variables_79.html | 26 + .../irrKlang/doc/cpp/search/variables_7a.html | 26 + ...ang_1_1_s_audio_stream_format-members.html | 88 + ...uctirrklang_1_1_s_audio_stream_format.html | 252 + ..._1_s_internal_audio_interface-members.html | 85 + ...rklang_1_1_s_internal_audio_interface.html | 183 + Thirdparty/irrKlang/doc/cpp/tab_b.gif | Bin 0 -> 35 bytes Thirdparty/irrKlang/doc/cpp/tab_l.gif | Bin 0 -> 706 bytes Thirdparty/irrKlang/doc/cpp/tab_r.gif | Bin 0 -> 2585 bytes Thirdparty/irrKlang/doc/cpp/tabs.css | 105 + Thirdparty/irrKlang/doc/doc_cpp.html | 12 + Thirdparty/irrKlang/doc/doc_dotnet.html | 12 + .../IrrKlang.AudioFormat.BytesPerSecond.html | 57 + .../IrrKlang.AudioFormat.ChannelCount.html | 58 + .../dotnet/IrrKlang.AudioFormat.Format.html | 58 + .../IrrKlang.AudioFormat.FrameCount.html | 58 + .../IrrKlang.AudioFormat.FrameSize.html | 57 + .../IrrKlang.AudioFormat.SampleDataSize.html | 57 + .../IrrKlang.AudioFormat.SampleRate.html | 58 + .../IrrKlang.AudioFormat.SampleSize.html | 57 + .../doc/dotnet/IrrKlang.AudioFormat.html | 68 + .../IrrKlang.AudioFormatConstructor.html | 50 + .../dotnet/IrrKlang.AudioFormatFields.html | 52 + .../dotnet/IrrKlang.AudioFormatMembers.html | 95 + .../IrrKlang.AudioFormatProperties.html | 52 + .../doc/dotnet/IrrKlang.EventForwarder.html | 67 + .../IrrKlang.EventForwarderMembers.html | 67 + .../dotnet/IrrKlang.FileFactoryForwarder.html | 67 + .../IrrKlang.FileFactoryForwarderMembers.html | 67 + ...order.AddSoundSourceFromRecordedAudio.html | 54 + .../IrrKlang.IAudioRecorder.AudioFormat.html | 56 + ...Recorder.ClearRecordedAudioDataBuffer.html | 54 + .../IrrKlang.IAudioRecorder.Finalize.html | 54 + .../IrrKlang.IAudioRecorder.IsRecording.html | 56 + ...lang.IAudioRecorder.RecordedAudioData.html | 57 + ...tartRecordingBufferedAudio_overload_1.html | 55 + ...tartRecordingBufferedAudio_overload_2.html | 54 + ...StartRecordingBufferedAudio_overloads.html | 49 + ...ang.IAudioRecorder.StopRecordingAudio.html | 54 + .../doc/dotnet/IrrKlang.IAudioRecorder.html | 67 + .../IrrKlang.IAudioRecorderConstructor.html | 58 + .../IrrKlang.IAudioRecorderConstructor1.html | 47 + .../IrrKlang.IAudioRecorderConstructor2.html | 47 + .../IrrKlang.IAudioRecorderConstructor3.html | 47 + .../IrrKlang.IAudioRecorderMembers.html | 98 + .../IrrKlang.IAudioRecorderMethods.html | 72 + .../IrrKlang.IAudioRecorderProperties.html | 51 + .../doc/dotnet/IrrKlang.IFileFactory.html | 62 + .../IrrKlang.IFileFactory.openFile.html | 55 + .../dotnet/IrrKlang.IFileFactoryMembers.html | 56 + .../dotnet/IrrKlang.IFileFactoryMethods.html | 49 + .../doc/dotnet/IrrKlang.ISound.Dispose.html | 59 + .../doc/dotnet/IrrKlang.ISound.Finalize.html | 54 + .../doc/dotnet/IrrKlang.ISound.Finished.html | 56 + .../doc/dotnet/IrrKlang.ISound.Looped.html | 56 + .../dotnet/IrrKlang.ISound.MaxDistance.html | 56 + .../dotnet/IrrKlang.ISound.MinDistance.html | 56 + .../doc/dotnet/IrrKlang.ISound.Pan.html | 56 + .../doc/dotnet/IrrKlang.ISound.Paused.html | 56 + .../dotnet/IrrKlang.ISound.PlayLength.html | 56 + .../dotnet/IrrKlang.ISound.PlayPosition.html | 56 + .../dotnet/IrrKlang.ISound.PlaybackSpeed.html | 59 + .../doc/dotnet/IrrKlang.ISound.Position.html | 56 + .../IrrKlang.ISound.SoundEffectControl.html | 56 + .../doc/dotnet/IrrKlang.ISound.Stop.html | 55 + .../doc/dotnet/IrrKlang.ISound.Velocity.html | 56 + .../doc/dotnet/IrrKlang.ISound.Volume.html | 56 + .../irrKlang/doc/dotnet/IrrKlang.ISound.html | 67 + ....setSoundStopEventReceiver_overload_1.html | 62 + ....setSoundStopEventReceiver_overload_2.html | 66 + ...d.setSoundStopEventReceiver_overloads.html | 49 + .../dotnet/IrrKlang.ISoundConstructor.html | 51 + ...IrrKlang.ISoundDeviceList.DeviceCount.html | 56 + .../IrrKlang.ISoundDeviceList.Finalize.html | 54 + ...ISoundDeviceList.getDeviceDescription.html | 54 + ...IrrKlang.ISoundDeviceList.getDeviceID.html | 55 + .../doc/dotnet/IrrKlang.ISoundDeviceList.html | 67 + .../IrrKlang.ISoundDeviceListConstructor.html | 54 + ...IrrKlang.ISoundDeviceListConstructor1.html | 47 + ...IrrKlang.ISoundDeviceListConstructor2.html | 47 + .../IrrKlang.ISoundDeviceListMembers.html | 94 + .../IrrKlang.ISoundDeviceListMethods.html | 70 + .../IrrKlang.ISoundDeviceListProperties.html | 49 + ...ISoundEffectControl.DisableAllEffects.html | 54 + ...ffectControl.DisableChorusSoundEffect.html | 54 + ...tControl.DisableCompressorSoundEffect.html | 54 + ...tControl.DisableDistortionSoundEffect.html | 54 + ...dEffectControl.DisableEchoSoundEffect.html | 54 + ...fectControl.DisableFlangerSoundEffect.html | 54 + ...ffectControl.DisableGargleSoundEffect.html | 54 + ...Control.DisableI3DL2ReverbSoundEffect.html | 54 + ...fectControl.DisableParamEqSoundEffect.html | 54 + ...Control.DisableWavesReverbSoundEffect.html | 54 + ...ol.EnableChorusSoundEffect_overload_1.html | 56 + ...ol.EnableChorusSoundEffect_overload_2.html | 56 + ...rol.EnableChorusSoundEffect_overloads.html | 49 + ...nableCompressorSoundEffect_overload_1.html | 56 + ...nableCompressorSoundEffect_overload_2.html | 56 + ...EnableCompressorSoundEffect_overloads.html | 49 + ...nableDistortionSoundEffect_overload_1.html | 56 + ...nableDistortionSoundEffect_overload_2.html | 56 + ...EnableDistortionSoundEffect_overloads.html | 49 + ...trol.EnableEchoSoundEffect_overload_1.html | 56 + ...trol.EnableEchoSoundEffect_overload_2.html | 56 + ...ntrol.EnableEchoSoundEffect_overloads.html | 49 + ...l.EnableFlangerSoundEffect_overload_1.html | 56 + ...l.EnableFlangerSoundEffect_overload_2.html | 56 + ...ol.EnableFlangerSoundEffect_overloads.html | 49 + ...ol.EnableGargleSoundEffect_overload_1.html | 56 + ...ol.EnableGargleSoundEffect_overload_2.html | 56 + ...rol.EnableGargleSoundEffect_overloads.html | 49 + ...ableI3DL2ReverbSoundEffect_overload_1.html | 56 + ...ableI3DL2ReverbSoundEffect_overload_2.html | 56 + ...nableI3DL2ReverbSoundEffect_overloads.html | 49 + ...l.EnableParamEqSoundEffect_overload_1.html | 56 + ...l.EnableParamEqSoundEffect_overload_2.html | 56 + ...ol.EnableParamEqSoundEffect_overloads.html | 49 + ...ableWavesReverbSoundEffect_overload_1.html | 56 + ...ableWavesReverbSoundEffect_overload_2.html | 56 + ...nableWavesReverbSoundEffect_overloads.html | 49 + ...IrrKlang.ISoundEffectControl.Finalize.html | 54 + ...ectControl.IsChorusSoundEffectEnabled.html | 56 + ...ontrol.IsCompressorSoundEffectEnabled.html | 56 + ...ontrol.IsDistortionSoundEffectEnabled.html | 56 + ...ffectControl.IsEchoSoundEffectEnabled.html | 56 + ...ctControl.IsFlangerSoundEffectEnabled.html | 56 + ...ectControl.IsGargleSoundEffectEnabled.html | 56 + ...ntrol.IsI3DL2ReverbSoundEffectEnabled.html | 56 + ...ctControl.IsParamEqSoundEffectEnabled.html | 56 + ...ntrol.IsWavesReverbSoundEffectEnabled.html | 56 + .../dotnet/IrrKlang.ISoundEffectControl.html | 67 + ...rKlang.ISoundEffectControlConstructor.html | 51 + .../IrrKlang.ISoundEffectControlMembers.html | 120 + .../IrrKlang.ISoundEffectControlMethods.html | 87 + ...rrKlang.ISoundEffectControlProperties.html | 57 + .../IrrKlang.ISoundEngine.AddFileFactory.html | 54 + ...lang.ISoundEngine.AddSoundSourceAlias.html | 67 + ...ine.AddSoundSourceFromFile_overload_1.html | 63 + ...ine.AddSoundSourceFromFile_overload_2.html | 67 + ...ine.AddSoundSourceFromFile_overload_3.html | 72 + ...gine.AddSoundSourceFromFile_overloads.html | 53 + ...oundEngine.AddSoundSourceFromIOStream.html | 56 + ...ISoundEngine.AddSoundSourceFromMemory.html | 55 + ...SoundEngine.AddSoundSourceFromPCMData.html | 55 + ...SoundEngine.Default3DSoundMaxDistance.html | 56 + ...SoundEngine.Default3DSoundMinDistance.html | 56 + .../IrrKlang.ISoundEngine.Finalize.html | 54 + ...SoundEngine.GetSoundSource_overload_1.html | 55 + ...SoundEngine.GetSoundSource_overload_2.html | 55 + ...ISoundEngine.GetSoundSource_overloads.html | 50 + ...Klang.ISoundEngine.IsCurrentlyPlaying.html | 54 + ...IrrKlang.ISoundEngine.IsMultiThreaded.html | 56 + .../IrrKlang.ISoundEngine.LoadPlugins.html | 55 + .../dotnet/IrrKlang.ISoundEngine.Name.html | 56 + ...rKlang.ISoundEngine.Play2D_overload_1.html | 54 + ...rKlang.ISoundEngine.Play2D_overload_2.html | 54 + ...rKlang.ISoundEngine.Play2D_overload_3.html | 54 + ...rKlang.ISoundEngine.Play2D_overload_4.html | 54 + ...rKlang.ISoundEngine.Play2D_overload_5.html | 54 + ...rKlang.ISoundEngine.Play2D_overload_6.html | 54 + ...rrKlang.ISoundEngine.Play2D_overloads.html | 65 + ...rKlang.ISoundEngine.Play3D_overload_1.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_2.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_3.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_4.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_5.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_6.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_7.html | 54 + ...rKlang.ISoundEngine.Play3D_overload_8.html | 54 + ...rrKlang.ISoundEngine.Play3D_overloads.html | 73 + ...ng.ISoundEngine.RemoveAllSoundSources.html | 54 + ...rKlang.ISoundEngine.RemoveSoundSource.html | 54 + ...Klang.ISoundEngine.SetAllSoundsPaused.html | 54 + ...oundEngine.SetDopplerEffectParameters.html | 54 + ...Engine.SetListenerPosition_overload_1.html | 54 + ...Engine.SetListenerPosition_overload_2.html | 54 + ...Engine.SetListenerPosition_overload_3.html | 54 + ...Engine.SetListenerPosition_overload_4.html | 54 + ...dEngine.SetListenerPosition_overloads.html | 57 + ...rrKlang.ISoundEngine.SetRolloffFactor.html | 61 + .../IrrKlang.ISoundEngine.SoundVolume.html | 56 + .../IrrKlang.ISoundEngine.StopAllSounds.html | 54 + .../dotnet/IrrKlang.ISoundEngine.Update.html | 54 + .../doc/dotnet/IrrKlang.ISoundEngine.html | 68 + ....ISoundEngine.internalGetNativeEngine.html | 55 + .../IrrKlang.ISoundEngineConstructor.html | 62 + .../IrrKlang.ISoundEngineConstructor1.html | 47 + .../IrrKlang.ISoundEngineConstructor2.html | 47 + .../IrrKlang.ISoundEngineConstructor3.html | 47 + .../IrrKlang.ISoundEngineConstructor4.html | 46 + .../dotnet/IrrKlang.ISoundEngineMembers.html | 116 + .../dotnet/IrrKlang.ISoundEngineMethods.html | 88 + .../IrrKlang.ISoundEngineProperties.html | 53 + .../doc/dotnet/IrrKlang.ISoundMembers.html | 108 + .../doc/dotnet/IrrKlang.ISoundMethods.html | 71 + .../doc/dotnet/IrrKlang.ISoundProperties.html | 61 + .../IrrKlang.ISoundSource.AudioFormat.html | 56 + ...Klang.ISoundSource.DefaultMaxDistance.html | 56 + ...Klang.ISoundSource.DefaultMinDistance.html | 56 + .../IrrKlang.ISoundSource.DefaultVolume.html | 56 + .../dotnet/IrrKlang.ISoundSource.Dispose.html | 59 + .../IrrKlang.ISoundSource.Finalize.html | 54 + ...ang.ISoundSource.ForceReloadAtNextUse.html | 54 + ...ISoundSource.ForcedStreamingThreshold.html | 57 + ...Klang.ISoundSource.IsSeekingSupported.html | 56 + .../dotnet/IrrKlang.ISoundSource.Name.html | 56 + .../IrrKlang.ISoundSource.PlayLength.html | 56 + .../IrrKlang.ISoundSource.SampleData.html | 57 + .../IrrKlang.ISoundSource.StreamMode.html | 56 + ...ang.ISoundSource.getNativeSoundSource.html | 54 + .../doc/dotnet/IrrKlang.ISoundSource.html | 67 + .../IrrKlang.ISoundSourceConstructor.html | 51 + .../dotnet/IrrKlang.ISoundSourceMembers.html | 105 + .../dotnet/IrrKlang.ISoundSourceMethods.html | 71 + .../IrrKlang.ISoundSourceProperties.html | 58 + ...SoundStopEventReceiver.OnSoundStopped.html | 56 + .../IrrKlang.ISoundStopEventReceiver.html | 62 + ...rKlang.ISoundStopEventReceiverMembers.html | 56 + ...rKlang.ISoundStopEventReceiverMethods.html | 49 + .../doc/dotnet/IrrKlang.SampleFormat.html | 81 + .../dotnet/IrrKlang.SoundDeviceListType.html | 80 + .../IrrKlang.SoundEngineOptionFlag.html | 110 + .../dotnet/IrrKlang.SoundOutputDriver.html | 105 + .../doc/dotnet/IrrKlang.StopEventCause.html | 85 + .../doc/dotnet/IrrKlang.StreamForwarder.html | 67 + .../IrrKlang.StreamForwarderMembers.html | 67 + .../doc/dotnet/IrrKlang.StreamMode.html | 85 + .../IrrKlang.Vector3D.CrossProduct.html | 63 + .../dotnet/IrrKlang.Vector3D.DotProduct.html | 54 + .../doc/dotnet/IrrKlang.Vector3D.Equals.html | 54 + .../IrrKlang.Vector3D.GetDistanceFrom.html | 54 + .../IrrKlang.Vector3D.GetDistanceFromSQ.html | 54 + .../IrrKlang.Vector3D.GetInterpolated.html | 65 + .../dotnet/IrrKlang.Vector3D.GetLength.html | 54 + .../dotnet/IrrKlang.Vector3D.GetLengthSQ.html | 54 + .../doc/dotnet/IrrKlang.Vector3D.Invert.html | 54 + .../IrrKlang.Vector3D.IsBetweenPoints.html | 67 + .../doc/dotnet/IrrKlang.Vector3D.Length.html | 57 + .../dotnet/IrrKlang.Vector3D.LengthSQ.html | 57 + .../dotnet/IrrKlang.Vector3D.Normalize.html | 54 + .../dotnet/IrrKlang.Vector3D.SetLength.html | 54 + .../IrrKlang.Vector3D.Set_overload_1.html | 55 + .../IrrKlang.Vector3D.Set_overload_2.html | 55 + .../IrrKlang.Vector3D.Set_overloads.html | 50 + .../dotnet/IrrKlang.Vector3D.ToString.html | 55 + .../doc/dotnet/IrrKlang.Vector3D.X.html | 58 + .../doc/dotnet/IrrKlang.Vector3D.Y.html | 58 + .../doc/dotnet/IrrKlang.Vector3D.Z.html | 58 + .../doc/dotnet/IrrKlang.Vector3D.html | 67 + .../dotnet/IrrKlang.Vector3D.op_Addition.html | 48 + .../dotnet/IrrKlang.Vector3D.op_Division.html | 48 + .../dotnet/IrrKlang.Vector3D.op_Equality.html | 48 + ...Klang.Vector3D.op_Multiply_overload_1.html | 48 + ...Klang.Vector3D.op_Multiply_overload_2.html | 48 + ...rKlang.Vector3D.op_Multiply_overloads.html | 50 + .../IrrKlang.Vector3D.op_Subtraction.html | 48 + .../dotnet/IrrKlang.Vector3DConstructor.html | 54 + .../dotnet/IrrKlang.Vector3DConstructor1.html | 47 + .../dotnet/IrrKlang.Vector3DConstructor2.html | 46 + .../doc/dotnet/IrrKlang.Vector3DFields.html | 51 + .../doc/dotnet/IrrKlang.Vector3DMembers.html | 109 + .../doc/dotnet/IrrKlang.Vector3DMethods.html | 68 + .../dotnet/IrrKlang.Vector3DOperators.html | 53 + .../dotnet/IrrKlang.Vector3DProperties.html | 50 + Thirdparty/irrKlang/doc/dotnet/IrrKlang.html | 190 + .../doc/dotnet/IrrKlangHierarchy.html | 88 + Thirdparty/irrKlang/doc/dotnet/MSDN.css | 405 + Thirdparty/irrKlang/doc/dotnet/contents.html | 1145 + Thirdparty/irrKlang/doc/dotnet/default.html | 97 + Thirdparty/irrKlang/doc/dotnet/index.html | 21 + Thirdparty/irrKlang/doc/dotnet/intevent.gif | Bin 0 -> 887 bytes Thirdparty/irrKlang/doc/dotnet/intfield.gif | Bin 0 -> 897 bytes Thirdparty/irrKlang/doc/dotnet/intmethod.gif | Bin 0 -> 904 bytes .../irrKlang/doc/dotnet/intoperator.gif | Bin 0 -> 884 bytes .../irrKlang/doc/dotnet/intproperty.gif | Bin 0 -> 909 bytes Thirdparty/irrKlang/doc/dotnet/ndoc.log | 296 + Thirdparty/irrKlang/doc/dotnet/privevent.gif | Bin 0 -> 897 bytes Thirdparty/irrKlang/doc/dotnet/privfield.gif | Bin 0 -> 904 bytes Thirdparty/irrKlang/doc/dotnet/privmethod.gif | Bin 0 -> 908 bytes .../irrKlang/doc/dotnet/privoperator.gif | Bin 0 -> 887 bytes .../irrKlang/doc/dotnet/privproperty.gif | Bin 0 -> 908 bytes Thirdparty/irrKlang/doc/dotnet/protevent.gif | Bin 0 -> 899 bytes Thirdparty/irrKlang/doc/dotnet/protfield.gif | Bin 0 -> 914 bytes Thirdparty/irrKlang/doc/dotnet/protmethod.gif | Bin 0 -> 908 bytes .../irrKlang/doc/dotnet/protoperator.gif | Bin 0 -> 887 bytes .../irrKlang/doc/dotnet/protproperty.gif | Bin 0 -> 923 bytes Thirdparty/irrKlang/doc/dotnet/pubevent.gif | Bin 0 -> 869 bytes Thirdparty/irrKlang/doc/dotnet/pubfield.gif | Bin 0 -> 881 bytes Thirdparty/irrKlang/doc/dotnet/pubmethod.gif | Bin 0 -> 889 bytes .../irrKlang/doc/dotnet/puboperator.gif | Bin 0 -> 864 bytes .../irrKlang/doc/dotnet/pubproperty.gif | Bin 0 -> 893 bytes Thirdparty/irrKlang/doc/dotnet/static.gif | Bin 0 -> 909 bytes Thirdparty/irrKlang/doc/dotnet/tree.css | 60 + Thirdparty/irrKlang/doc/dotnet/tree.js | 264 + .../irrKlang/doc/dotnet/treenodedot.gif | Bin 0 -> 829 bytes .../irrKlang/doc/dotnet/treenodeminus.gif | Bin 0 -> 56 bytes .../irrKlang/doc/dotnet/treenodeplus.gif | Bin 0 -> 59 bytes Thirdparty/irrKlang/doc/readme.txt | 2 + .../irrKlang/include/ik_ESoundEngineOptions.h | 78 + .../irrKlang/include/ik_ESoundOutputDrivers.h | 59 + Thirdparty/irrKlang/include/ik_EStreamModes.h | 31 + .../irrKlang/include/ik_IAudioRecorder.h | 110 + Thirdparty/irrKlang/include/ik_IAudioStream.h | 49 + .../irrKlang/include/ik_IAudioStreamLoader.h | 40 + Thirdparty/irrKlang/include/ik_IFileFactory.h | 41 + Thirdparty/irrKlang/include/ik_IFileReader.h | 50 + Thirdparty/irrKlang/include/ik_IRefCounted.h | 119 + Thirdparty/irrKlang/include/ik_ISound.h | 194 + .../irrKlang/include/ik_ISoundDeviceList.h | 41 + .../irrKlang/include/ik_ISoundEffectControl.h | 243 + Thirdparty/irrKlang/include/ik_ISoundEngine.h | 436 + .../include/ik_ISoundMixedOutputReceiver.h | 46 + Thirdparty/irrKlang/include/ik_ISoundSource.h | 167 + .../include/ik_ISoundStopEventReceiver.h | 72 + .../irrKlang/include/ik_IVirtualRefCounted.h | 48 + .../irrKlang/include/ik_SAudioStreamFormat.h | 71 + .../irrKlang/include/ik_irrKlangTypes.h | 96 + Thirdparty/irrKlang/include/ik_vec3d.h | 261 + Thirdparty/irrKlang/include/irrKlang.h | 1040 + .../lib/Winx64-visualStudio/irrKlang.exp | Bin 0 -> 2329 bytes .../lib/Winx64-visualStudio/irrKlang.lib | Bin 0 -> 4380 bytes Thirdparty/irrKlang/media/MF-3DAYS.S3M | Bin 0 -> 57840 bytes Thirdparty/irrKlang/media/MF-PANTS.MOD | Bin 0 -> 91666 bytes Thirdparty/irrKlang/media/MF-W-90.XM | Bin 0 -> 53096 bytes Thirdparty/irrKlang/media/bell.wav | Bin 0 -> 64954 bytes Thirdparty/irrKlang/media/explosion.wav | Bin 0 -> 17687 bytes Thirdparty/irrKlang/media/getout.ogg | Bin 0 -> 464460 bytes Thirdparty/irrKlang/media/license.txt | 155 + Thirdparty/irrKlang/media/ophelia.mp3 | Bin 0 -> 659456 bytes Thirdparty/irrKlang/readme.txt | 191 + .../opencv2/include/opencv2/calib3d.hpp | 4094 +++ .../include/opencv2/calib3d/calib3d.hpp | 48 + .../include/opencv2/calib3d/calib3d_c.h | 150 + Thirdparty/opencv2/include/opencv2/core.hpp | 3396 +++ .../opencv2/include/opencv2/core/affine.hpp | 678 + .../opencv2/include/opencv2/core/async.hpp | 105 + .../opencv2/include/opencv2/core/base.hpp | 664 + .../include/opencv2/core/bindings_utils.hpp | 352 + .../include/opencv2/core/bufferpool.hpp | 40 + .../opencv2/include/opencv2/core/check.hpp | 170 + .../opencv2/include/opencv2/core/core.hpp | 48 + .../opencv2/include/opencv2/core/core_c.h | 3128 ++ .../opencv2/include/opencv2/core/cuda.hpp | 1337 + .../opencv2/include/opencv2/core/cuda.inl.hpp | 763 + .../include/opencv2/core/cuda/block.hpp | 211 + .../opencv2/core/cuda/border_interpolate.hpp | 722 + .../include/opencv2/core/cuda/color.hpp | 309 + .../include/opencv2/core/cuda/common.hpp | 131 + .../opencv2/core/cuda/datamov_utils.hpp | 113 + .../opencv2/core/cuda/detail/color_detail.hpp | 2018 ++ .../opencv2/core/cuda/detail/reduce.hpp | 365 + .../core/cuda/detail/reduce_key_val.hpp | 502 + .../core/cuda/detail/transform_detail.hpp | 392 + .../core/cuda/detail/type_traits_detail.hpp | 191 + .../core/cuda/detail/vec_distance_detail.hpp | 121 + .../opencv2/core/cuda/dynamic_smem.hpp | 88 + .../include/opencv2/core/cuda/emulation.hpp | 269 + .../include/opencv2/core/cuda/filters.hpp | 293 + .../include/opencv2/core/cuda/funcattrib.hpp | 79 + .../include/opencv2/core/cuda/functional.hpp | 805 + .../include/opencv2/core/cuda/limits.hpp | 128 + .../include/opencv2/core/cuda/reduce.hpp | 209 + .../opencv2/core/cuda/saturate_cast.hpp | 292 + .../include/opencv2/core/cuda/scan.hpp | 258 + .../opencv2/core/cuda/simd_functions.hpp | 869 + .../include/opencv2/core/cuda/transform.hpp | 75 + .../include/opencv2/core/cuda/type_traits.hpp | 90 + .../include/opencv2/core/cuda/utility.hpp | 230 + .../opencv2/core/cuda/vec_distance.hpp | 232 + .../include/opencv2/core/cuda/vec_math.hpp | 923 + .../include/opencv2/core/cuda/vec_traits.hpp | 288 + .../include/opencv2/core/cuda/warp.hpp | 139 + .../include/opencv2/core/cuda/warp_reduce.hpp | 76 + .../opencv2/core/cuda/warp_shuffle.hpp | 162 + .../opencv2/core/cuda_stream_accessor.hpp | 86 + .../include/opencv2/core/cuda_types.hpp | 144 + .../include/opencv2/core/cv_cpu_dispatch.h | 390 + .../include/opencv2/core/cv_cpu_helper.h | 571 + .../opencv2/include/opencv2/core/cvdef.h | 980 + .../opencv2/include/opencv2/core/cvstd.hpp | 190 + .../include/opencv2/core/cvstd.inl.hpp | 197 + .../include/opencv2/core/cvstd_wrapper.hpp | 154 + .../opencv2/core/detail/async_promise.hpp | 71 + .../core/detail/dispatch_helper.impl.hpp | 49 + .../opencv2/core/detail/exception_ptr.hpp | 27 + .../opencv2/include/opencv2/core/directx.hpp | 184 + .../include/opencv2/core/dualquaternion.hpp | 979 + .../opencv2/core/dualquaternion.inl.hpp | 487 + .../opencv2/include/opencv2/core/eigen.hpp | 404 + .../include/opencv2/core/fast_math.hpp | 433 + .../opencv2/include/opencv2/core/hal/hal.hpp | 256 + .../include/opencv2/core/hal/interface.h | 190 + .../include/opencv2/core/hal/intrin.hpp | 1262 + .../include/opencv2/core/hal/intrin_avx.hpp | 3177 ++ .../opencv2/core/hal/intrin_avx512.hpp | 3090 ++ .../include/opencv2/core/hal/intrin_cpp.hpp | 3317 +++ .../opencv2/core/hal/intrin_forward.hpp | 191 + .../include/opencv2/core/hal/intrin_lasx.hpp | 3023 ++ .../include/opencv2/core/hal/intrin_lsx.hpp | 2536 ++ .../include/opencv2/core/hal/intrin_msa.hpp | 1887 ++ .../include/opencv2/core/hal/intrin_neon.hpp | 2657 ++ .../include/opencv2/core/hal/intrin_rvv.hpp | 3342 +++ .../opencv2/core/hal/intrin_rvv071.hpp | 2540 ++ .../hal/intrin_rvv_010_compat_non-policy.hpp | 24395 ++++++++++++++++ ...n_rvv_010_compat_overloaded-non-policy.hpp | 768 + .../core/hal/intrin_rvv_011_compat.hpp | 33 + .../core/hal/intrin_rvv_compat_overloaded.hpp | 208 + .../opencv2/core/hal/intrin_rvv_scalable.hpp | 2131 ++ .../include/opencv2/core/hal/intrin_sse.hpp | 3468 +++ .../opencv2/core/hal/intrin_sse_em.hpp | 180 + .../include/opencv2/core/hal/intrin_vsx.hpp | 1608 + .../include/opencv2/core/hal/intrin_wasm.hpp | 2783 ++ .../include/opencv2/core/hal/msa_macros.h | 1558 + .../opencv2/core/hal/simd_utils.impl.hpp | 186 + .../opencv2/include/opencv2/core/mat.hpp | 3796 +++ .../opencv2/include/opencv2/core/mat.inl.hpp | 3422 +++ .../opencv2/include/opencv2/core/matx.hpp | 1536 + .../include/opencv2/core/neon_utils.hpp | 128 + .../opencv2/include/opencv2/core/ocl.hpp | 918 + .../include/opencv2/core/ocl_genbase.hpp | 69 + .../include/opencv2/core/opencl/ocl_defs.hpp | 82 + .../opencv2/core/opencl/opencl_info.hpp | 213 + .../opencv2/core/opencl/opencl_svm.hpp | 81 + .../runtime/autogenerated/opencl_clblas.hpp | 602 + .../runtime/autogenerated/opencl_clfft.hpp | 146 + .../runtime/autogenerated/opencl_core.hpp | 371 + .../autogenerated/opencl_core_wrappers.hpp | 272 + .../runtime/autogenerated/opencl_gl.hpp | 62 + .../autogenerated/opencl_gl_wrappers.hpp | 42 + .../core/opencl/runtime/opencl_clblas.hpp | 53 + .../core/opencl/runtime/opencl_clfft.hpp | 53 + .../core/opencl/runtime/opencl_core.hpp | 84 + .../opencl/runtime/opencl_core_wrappers.hpp | 47 + .../opencv2/core/opencl/runtime/opencl_gl.hpp | 53 + .../opencl/runtime/opencl_gl_wrappers.hpp | 47 + .../core/opencl/runtime/opencl_svm_20.hpp | 48 + .../opencl/runtime/opencl_svm_definitions.hpp | 42 + .../runtime/opencl_svm_hsa_extension.hpp | 166 + .../opencv2/include/opencv2/core/opengl.hpp | 733 + .../include/opencv2/core/operations.hpp | 612 + .../opencv2/include/opencv2/core/optim.hpp | 307 + .../opencv2/include/opencv2/core/ovx.hpp | 28 + .../parallel/backend/parallel_for.openmp.hpp | 72 + .../parallel/backend/parallel_for.tbb.hpp | 153 + .../core/parallel/parallel_backend.hpp | 90 + .../include/opencv2/core/persistence.hpp | 1350 + .../include/opencv2/core/quaternion.hpp | 1696 ++ .../include/opencv2/core/quaternion.inl.hpp | 1063 + .../opencv2/include/opencv2/core/saturate.hpp | 180 + .../include/opencv2/core/simd_intrinsics.hpp | 87 + .../include/opencv2/core/softfloat.hpp | 514 + .../include/opencv2/core/sse_utils.hpp | 652 + .../opencv2/include/opencv2/core/traits.hpp | 417 + .../opencv2/include/opencv2/core/types.hpp | 2463 ++ .../opencv2/include/opencv2/core/types_c.h | 2126 ++ .../opencv2/include/opencv2/core/utility.hpp | 1229 + .../opencv2/core/utils/allocator_stats.hpp | 29 + .../core/utils/allocator_stats.impl.hpp | 158 + .../include/opencv2/core/utils/filesystem.hpp | 82 + .../opencv2/core/utils/fp_control_utils.hpp | 69 + .../opencv2/core/utils/instrumentation.hpp | 125 + .../opencv2/core/utils/logger.defines.hpp | 42 + .../include/opencv2/core/utils/logger.hpp | 218 + .../include/opencv2/core/utils/logtag.hpp | 28 + .../include/opencv2/core/utils/tls.hpp | 235 + .../include/opencv2/core/utils/trace.hpp | 252 + .../opencv2/include/opencv2/core/va_intel.hpp | 75 + .../opencv2/include/opencv2/core/version.hpp | 26 + .../include/opencv2/core/vsx_utils.hpp | 1047 + Thirdparty/opencv2/include/opencv2/cvconfig.h | 155 + Thirdparty/opencv2/include/opencv2/dnn.hpp | 78 + .../include/opencv2/dnn/all_layers.hpp | 1174 + .../opencv2/include/opencv2/dnn/dict.hpp | 160 + .../opencv2/include/opencv2/dnn/dnn.hpp | 1915 ++ .../opencv2/include/opencv2/dnn/dnn.inl.hpp | 412 + .../include/opencv2/dnn/layer.details.hpp | 78 + .../opencv2/include/opencv2/dnn/layer.hpp | 88 + .../include/opencv2/dnn/shape_utils.hpp | 290 + .../include/opencv2/dnn/utils/debug_utils.hpp | 24 + .../opencv2/dnn/utils/inference_engine.hpp | 82 + .../opencv2/include/opencv2/dnn/version.hpp | 21 + .../opencv2/include/opencv2/features2d.hpp | 1610 + .../include/opencv2/features2d/features2d.hpp | 48 + .../opencv2/features2d/hal/interface.h | 33 + Thirdparty/opencv2/include/opencv2/flann.hpp | 629 + .../include/opencv2/flann/all_indices.h | 162 + .../opencv2/include/opencv2/flann/allocator.h | 196 + .../opencv2/include/opencv2/flann/any.h | 355 + .../include/opencv2/flann/autotuned_index.h | 594 + .../include/opencv2/flann/composite_index.h | 196 + .../opencv2/include/opencv2/flann/config.h | 42 + .../opencv2/include/opencv2/flann/defines.h | 169 + .../opencv2/include/opencv2/flann/dist.h | 1292 + .../opencv2/include/opencv2/flann/dummy.h | 16 + .../include/opencv2/flann/dynamic_bitset.h | 160 + .../opencv2/include/opencv2/flann/flann.hpp | 48 + .../include/opencv2/flann/flann_base.hpp | 312 + .../opencv2/include/opencv2/flann/general.h | 65 + .../include/opencv2/flann/ground_truth.h | 98 + .../opencv2/include/opencv2/flann/hdf5.h | 235 + .../opencv2/include/opencv2/flann/heap.h | 244 + .../flann/hierarchical_clustering_index.h | 846 + .../include/opencv2/flann/index_testing.h | 319 + .../include/opencv2/flann/kdtree_index.h | 636 + .../opencv2/flann/kdtree_single_index.h | 645 + .../include/opencv2/flann/kmeans_index.h | 1819 ++ .../include/opencv2/flann/linear_index.h | 135 + .../opencv2/include/opencv2/flann/logger.h | 138 + .../opencv2/include/opencv2/flann/lsh_index.h | 403 + .../opencv2/include/opencv2/flann/lsh_table.h | 522 + .../opencv2/include/opencv2/flann/matrix.h | 121 + .../include/opencv2/flann/miniflann.hpp | 185 + .../opencv2/include/opencv2/flann/nn_index.h | 180 + .../include/opencv2/flann/object_factory.h | 95 + .../opencv2/include/opencv2/flann/params.h | 126 + .../opencv2/include/opencv2/flann/random.h | 156 + .../include/opencv2/flann/result_set.h | 548 + .../opencv2/include/opencv2/flann/sampling.h | 84 + .../opencv2/include/opencv2/flann/saving.h | 191 + .../include/opencv2/flann/simplex_downhill.h | 190 + .../opencv2/include/opencv2/flann/timer.h | 99 + .../opencv2/include/opencv2/highgui.hpp | 848 + .../include/opencv2/highgui/highgui.hpp | 48 + .../include/opencv2/highgui/highgui_c.h | 251 + .../opencv2/include/opencv2/imgcodecs.hpp | 419 + .../include/opencv2/imgcodecs/imgcodecs.hpp | 48 + .../include/opencv2/imgcodecs/imgcodecs_c.h | 1 + .../opencv2/include/opencv2/imgcodecs/ios.h | 59 + .../opencv2/imgcodecs/legacy/constants_c.h | 54 + .../include/opencv2/imgcodecs/macosx.h | 20 + .../opencv2/include/opencv2/imgproc.hpp | 5069 ++++ .../include/opencv2/imgproc/bindings.hpp | 34 + .../opencv2/imgproc/detail/gcgraph.hpp | 395 + .../include/opencv2/imgproc/hal/hal.hpp | 251 + .../include/opencv2/imgproc/hal/interface.h | 46 + .../include/opencv2/imgproc/imgproc.hpp | 48 + .../include/opencv2/imgproc/imgproc_c.h | 1185 + .../include/opencv2/imgproc/segmentation.hpp | 141 + .../opencv2/include/opencv2/imgproc/types_c.h | 659 + Thirdparty/opencv2/include/opencv2/ml.hpp | 1956 ++ Thirdparty/opencv2/include/opencv2/ml/ml.hpp | 48 + .../opencv2/include/opencv2/ml/ml.inl.hpp | 60 + .../opencv2/include/opencv2/objdetect.hpp | 871 + .../include/opencv2/objdetect/aruco_board.hpp | 199 + .../opencv2/objdetect/aruco_detector.hpp | 386 + .../opencv2/objdetect/aruco_dictionary.hpp | 155 + .../include/opencv2/objdetect/barcode.hpp | 65 + .../opencv2/objdetect/charuco_detector.hpp | 154 + .../objdetect/detection_based_tracker.hpp | 222 + .../include/opencv2/objdetect/face.hpp | 140 + .../objdetect/graphical_code_detector.hpp | 81 + .../include/opencv2/objdetect/objdetect.hpp | 48 + Thirdparty/opencv2/include/opencv2/opencv.hpp | 95 + .../include/opencv2/opencv_modules.hpp | 28 + Thirdparty/opencv2/include/opencv2/photo.hpp | 858 + .../opencv2/include/opencv2/photo/cuda.hpp | 157 + .../opencv2/photo/legacy/constants_c.h | 14 + .../opencv2/include/opencv2/photo/photo.hpp | 48 + .../opencv2/include/opencv2/stitching.hpp | 365 + .../opencv2/stitching/detail/autocalib.hpp | 86 + .../opencv2/stitching/detail/blenders.hpp | 184 + .../opencv2/stitching/detail/camera.hpp | 78 + .../stitching/detail/exposure_compensate.hpp | 245 + .../opencv2/stitching/detail/matchers.hpp | 267 + .../stitching/detail/motion_estimators.hpp | 373 + .../opencv2/stitching/detail/seam_finders.hpp | 291 + .../opencv2/stitching/detail/timelapsers.hpp | 91 + .../include/opencv2/stitching/detail/util.hpp | 121 + .../opencv2/stitching/detail/util_inl.hpp | 131 + .../opencv2/stitching/detail/warpers.hpp | 706 + .../opencv2/stitching/detail/warpers_inl.hpp | 782 + .../include/opencv2/stitching/warpers.hpp | 277 + Thirdparty/opencv2/include/opencv2/video.hpp | 59 + .../include/opencv2/video/background_segm.hpp | 317 + .../opencv2/video/detail/tracking.detail.hpp | 406 + .../opencv2/video/legacy/constants_c.h | 16 + .../include/opencv2/video/tracking.hpp | 931 + .../opencv2/include/opencv2/video/video.hpp | 48 + .../opencv2/include/opencv2/videoio.hpp | 1182 + .../opencv2/include/opencv2/videoio/cap_ios.h | 150 + .../opencv2/videoio/legacy/constants_c.h | 434 + .../include/opencv2/videoio/registry.hpp | 72 + .../include/opencv2/videoio/videoio.hpp | 48 + .../include/opencv2/videoio/videoio_c.h | 153 + .../opencv2/lib/OpenCVConfig-version.cmake | 15 + Thirdparty/opencv2/lib/OpenCVConfig.cmake | 355 + .../opencv2/lib/OpenCVModules-debug.cmake | 149 + Thirdparty/opencv2/lib/OpenCVModules.cmake | 193 + Thirdparty/opencv2/lib/opencv_calib3d480d.lib | Bin 0 -> 303418 bytes Thirdparty/opencv2/lib/opencv_core480d.lib | Bin 0 -> 915272 bytes Thirdparty/opencv2/lib/opencv_dnn480d.lib | Bin 0 -> 754336 bytes .../opencv2/lib/opencv_features2d480d.lib | Bin 0 -> 315994 bytes Thirdparty/opencv2/lib/opencv_flann480d.lib | Bin 0 -> 153818 bytes Thirdparty/opencv2/lib/opencv_highgui480d.lib | Bin 0 -> 215720 bytes .../opencv2/lib/opencv_imgcodecs480d.lib | Bin 0 -> 166480 bytes Thirdparty/opencv2/lib/opencv_imgproc480d.lib | Bin 0 -> 330562 bytes Thirdparty/opencv2/lib/opencv_ml480d.lib | Bin 0 -> 197258 bytes .../opencv2/lib/opencv_objdetect480d.lib | Bin 0 -> 417468 bytes Thirdparty/opencv2/lib/opencv_photo480d.lib | Bin 0 -> 250530 bytes .../opencv2/lib/opencv_stitching480d.lib | Bin 0 -> 819026 bytes Thirdparty/opencv2/lib/opencv_video480d.lib | Bin 0 -> 389042 bytes Thirdparty/opencv2/lib/opencv_videoio480d.lib | Bin 0 -> 210260 bytes Thirdparty/spdlog/include/spdlog/async.h | 99 + .../spdlog/include/spdlog/async_logger-inl.h | 90 + .../spdlog/include/spdlog/async_logger.h | 68 + Thirdparty/spdlog/include/spdlog/cfg/argv.h | 44 + Thirdparty/spdlog/include/spdlog/cfg/env.h | 38 + .../spdlog/include/spdlog/cfg/helpers-inl.h | 120 + .../spdlog/include/spdlog/cfg/helpers.h | 29 + Thirdparty/spdlog/include/spdlog/common-inl.h | 82 + Thirdparty/spdlog/include/spdlog/common.h | 420 + .../include/spdlog/details/backtracer-inl.h | 75 + .../include/spdlog/details/backtracer.h | 46 + .../include/spdlog/details/circular_q.h | 146 + .../include/spdlog/details/console_globals.h | 32 + .../include/spdlog/details/file_helper-inl.h | 180 + .../include/spdlog/details/file_helper.h | 62 + .../include/spdlog/details/fmt_helper.h | 164 + .../include/spdlog/details/log_msg-inl.h | 37 + .../spdlog/include/spdlog/details/log_msg.h | 37 + .../spdlog/details/log_msg_buffer-inl.h | 58 + .../include/spdlog/details/log_msg_buffer.h | 33 + .../include/spdlog/details/mpmc_blocking_q.h | 154 + .../include/spdlog/details/null_mutex.h | 45 + .../spdlog/include/spdlog/details/os-inl.h | 635 + Thirdparty/spdlog/include/spdlog/details/os.h | 122 + .../spdlog/details/periodic_worker-inl.h | 28 + .../include/spdlog/details/periodic_worker.h | 60 + .../include/spdlog/details/registry-inl.h | 315 + .../spdlog/include/spdlog/details/registry.h | 123 + .../spdlog/details/synchronous_factory.h | 24 + .../spdlog/details/tcp_client-windows.h | 160 + .../include/spdlog/details/tcp_client.h | 146 + .../include/spdlog/details/thread_pool-inl.h | 137 + .../include/spdlog/details/thread_pool.h | 122 + .../spdlog/details/udp_client-windows.h | 113 + .../include/spdlog/details/udp_client.h | 94 + .../include/spdlog/details/windows_include.h | 11 + .../spdlog/include/spdlog/fmt/bin_to_hex.h | 248 + .../spdlog/include/spdlog/fmt/bundled/args.h | 234 + .../include/spdlog/fmt/bundled/chrono.h | 2069 ++ .../spdlog/include/spdlog/fmt/bundled/color.h | 651 + .../include/spdlog/fmt/bundled/compile.h | 611 + .../spdlog/include/spdlog/fmt/bundled/core.h | 3323 +++ .../spdlog/fmt/bundled/fmt.license.rst | 27 + .../include/spdlog/fmt/bundled/format-inl.h | 1723 ++ .../include/spdlog/fmt/bundled/format.h | 4217 +++ .../include/spdlog/fmt/bundled/locale.h | 2 + .../spdlog/include/spdlog/fmt/bundled/os.h | 478 + .../include/spdlog/fmt/bundled/ostream.h | 237 + .../include/spdlog/fmt/bundled/printf.h | 640 + .../include/spdlog/fmt/bundled/ranges.h | 722 + .../spdlog/include/spdlog/fmt/bundled/std.h | 171 + .../spdlog/include/spdlog/fmt/bundled/xchar.h | 229 + Thirdparty/spdlog/include/spdlog/fmt/chrono.h | 22 + .../spdlog/include/spdlog/fmt/compile.h | 22 + Thirdparty/spdlog/include/spdlog/fmt/fmt.h | 33 + Thirdparty/spdlog/include/spdlog/fmt/ostr.h | 22 + Thirdparty/spdlog/include/spdlog/fmt/ranges.h | 22 + Thirdparty/spdlog/include/spdlog/fmt/std.h | 23 + Thirdparty/spdlog/include/spdlog/fmt/xchar.h | 22 + Thirdparty/spdlog/include/spdlog/formatter.h | 18 + Thirdparty/spdlog/include/spdlog/fwd.h | 18 + Thirdparty/spdlog/include/spdlog/logger-inl.h | 257 + Thirdparty/spdlog/include/spdlog/logger.h | 427 + .../include/spdlog/pattern_formatter-inl.h | 1436 + .../spdlog/include/spdlog/pattern_formatter.h | 128 + .../include/spdlog/sinks/android_sink.h | 146 + .../include/spdlog/sinks/ansicolor_sink-inl.h | 145 + .../include/spdlog/sinks/ansicolor_sink.h | 118 + .../include/spdlog/sinks/base_sink-inl.h | 63 + .../spdlog/include/spdlog/sinks/base_sink.h | 52 + .../spdlog/sinks/basic_file_sink-inl.h | 44 + .../include/spdlog/sinks/basic_file_sink.h | 60 + .../include/spdlog/sinks/callback_sink.h | 61 + .../include/spdlog/sinks/daily_file_sink.h | 247 + .../spdlog/include/spdlog/sinks/dist_sink.h | 97 + .../include/spdlog/sinks/dup_filter_sink.h | 96 + .../include/spdlog/sinks/hourly_file_sink.h | 204 + .../spdlog/include/spdlog/sinks/kafka_sink.h | 133 + .../spdlog/include/spdlog/sinks/mongo_sink.h | 107 + .../spdlog/include/spdlog/sinks/msvc_sink.h | 71 + .../spdlog/include/spdlog/sinks/null_sink.h | 44 + .../include/spdlog/sinks/ostream_sink.h | 50 + .../spdlog/include/spdlog/sinks/qt_sinks.h | 292 + .../include/spdlog/sinks/ringbuffer_sink.h | 74 + .../spdlog/sinks/rotating_file_sink-inl.h | 152 + .../include/spdlog/sinks/rotating_file_sink.h | 81 + .../spdlog/include/spdlog/sinks/sink-inl.h | 25 + Thirdparty/spdlog/include/spdlog/sinks/sink.h | 35 + .../spdlog/sinks/stdout_color_sinks-inl.h | 38 + .../include/spdlog/sinks/stdout_color_sinks.h | 45 + .../include/spdlog/sinks/stdout_sinks-inl.h | 138 + .../include/spdlog/sinks/stdout_sinks.h | 87 + .../spdlog/include/spdlog/sinks/syslog_sink.h | 109 + .../include/spdlog/sinks/systemd_sink.h | 126 + .../spdlog/include/spdlog/sinks/tcp_sink.h | 81 + .../spdlog/include/spdlog/sinks/udp_sink.h | 74 + .../include/spdlog/sinks/win_eventlog_sink.h | 289 + .../include/spdlog/sinks/wincolor_sink-inl.h | 175 + .../include/spdlog/sinks/wincolor_sink.h | 85 + Thirdparty/spdlog/include/spdlog/spdlog-inl.h | 125 + Thirdparty/spdlog/include/spdlog/spdlog.h | 363 + Thirdparty/spdlog/include/spdlog/stopwatch.h | 69 + Thirdparty/spdlog/include/spdlog/tweakme.h | 140 + Thirdparty/spdlog/include/spdlog/version.h | 10 + .../lib/cmake/spdlog/spdlogConfig.cmake | 44 + .../spdlog/spdlogConfigTargets-debug.cmake | 19 + .../spdlog/spdlogConfigTargets-release.cmake | 19 + .../cmake/spdlog/spdlogConfigTargets.cmake | 116 + .../cmake/spdlog/spdlogConfigVersion.cmake | 65 + Thirdparty/spdlog/lib/pkgconfig/spdlog.pc | 13 + Thirdparty/spdlog/lib/spdlog.lib | Bin 0 -> 3501274 bytes Thirdparty/spdlog/lib/spdlogd.lib | Bin 0 -> 19247674 bytes Thirdparty/stb/.travis.yml | 8 + Thirdparty/stb/LICENSE | 37 + Thirdparty/stb/README.md | 182 + .../stb/data/atari_8bit_font_revised.png | Bin 0 -> 1769 bytes Thirdparty/stb/data/easy_font_raw.png | Bin 0 -> 645 bytes Thirdparty/stb/data/herringbone/license.txt | 4 + .../template_caves_limit_connectivity.png | Bin 0 -> 10818 bytes .../template_caves_tiny_corridors.png | Bin 0 -> 4904 bytes .../herringbone/template_corner_caves.png | Bin 0 -> 9337 bytes .../template_horizontal_corridors_v1.png | Bin 0 -> 5491 bytes .../template_horizontal_corridors_v2.png | Bin 0 -> 5759 bytes .../template_horizontal_corridors_v3.png | Bin 0 -> 6766 bytes .../template_limit_connectivity_fat.png | Bin 0 -> 6655 bytes .../template_limited_connectivity.png | Bin 0 -> 6728 bytes .../data/herringbone/template_maze_2_wide.png | Bin 0 -> 12776 bytes .../herringbone/template_maze_plus_2_wide.png | Bin 0 -> 13141 bytes .../data/herringbone/template_open_areas.png | Bin 0 -> 7764 bytes .../template_ref2_corner_caves.png | Bin 0 -> 9729 bytes .../template_rooms_and_corridors.png | Bin 0 -> 4736 bytes ...oms_and_corridors_2_wide_diagonal_bias.png | Bin 0 -> 4193 bytes .../template_rooms_limit_connectivity.png | Bin 0 -> 7664 bytes ...emplate_round_rooms_diagonal_corridors.png | Bin 0 -> 8172 bytes .../herringbone/template_sean_dungeon.png | Bin 0 -> 10261 bytes .../template_simple_caves_2_wide.png | Bin 0 -> 15712 bytes ...emplate_square_rooms_with_random_rects.png | Bin 0 -> 4772 bytes Thirdparty/stb/data/map_01.png | Bin 0 -> 30625 bytes Thirdparty/stb/data/map_02.png | Bin 0 -> 3243 bytes Thirdparty/stb/data/map_03.png | Bin 0 -> 9620 bytes Thirdparty/stb/deprecated/rrsprintf.h | 1055 + Thirdparty/stb/deprecated/stb.h | 13111 +++++++++ Thirdparty/stb/deprecated/stb_image.c | 4678 +++ Thirdparty/stb/deprecated/stb_image_resize.h | 2634 ++ Thirdparty/stb/deprecated/stretch_test.c | 29 + Thirdparty/stb/deprecated/stretchy_buffer.h | 263 + Thirdparty/stb/deprecated/stretchy_buffer.txt | 28 + Thirdparty/stb/docs/other_libs.md | 1 + Thirdparty/stb/docs/stb_howto.txt | 185 + .../stb/docs/stb_voxel_render_interview.md | 173 + Thirdparty/stb/docs/why_public_domain.md | 117 + Thirdparty/stb/stb_c_lexer.h | 940 + Thirdparty/stb/stb_connected_components.h | 1049 + Thirdparty/stb/stb_divide.h | 433 + Thirdparty/stb/stb_ds.h | 1895 ++ Thirdparty/stb/stb_dxt.h | 719 + Thirdparty/stb/stb_easy_font.h | 305 + Thirdparty/stb/stb_herringbone_wang_tile.h | 1221 + Thirdparty/stb/stb_hexwave.h | 680 + Thirdparty/stb/stb_image.h | 7987 +++++ Thirdparty/stb/stb_image_resize2.h | 10303 +++++++ .../stb/stb_image_resize_test/dotimings.c | 224 + .../stb_image_resize_test/old_image_resize.h | 2738 ++ Thirdparty/stb/stb_image_resize_test/oldir.c | 56 + .../stb/stb_image_resize_test/stbirtest.c | 992 + .../stb/stb_image_resize_test/vf_train.c | 999 + Thirdparty/stb/stb_image_write.h | 1724 ++ Thirdparty/stb/stb_include.h | 295 + Thirdparty/stb/stb_leakcheck.h | 194 + Thirdparty/stb/stb_perlin.h | 428 + Thirdparty/stb/stb_rect_pack.h | 623 + Thirdparty/stb/stb_sprintf.h | 1906 ++ Thirdparty/stb/stb_textedit.h | 1429 + Thirdparty/stb/stb_tilemap_editor.h | 4187 +++ Thirdparty/stb/stb_truetype.h | 5077 ++++ Thirdparty/stb/stb_vorbis.c | 5584 ++++ Thirdparty/stb/stb_voxel_render.h | 3807 +++ Thirdparty/stb/tests/Makefile | 12 + Thirdparty/stb/tests/c_lexer_test.c | 50 + Thirdparty/stb/tests/c_lexer_test.dsp | 89 + Thirdparty/stb/tests/caveview/README.md | 85 + Thirdparty/stb/tests/caveview/cave_main.c | 598 + Thirdparty/stb/tests/caveview/cave_mesher.c | 933 + Thirdparty/stb/tests/caveview/cave_parse.c | 632 + Thirdparty/stb/tests/caveview/cave_parse.h | 41 + Thirdparty/stb/tests/caveview/cave_render.c | 951 + Thirdparty/stb/tests/caveview/caveview.dsp | 157 + Thirdparty/stb/tests/caveview/caveview.dsw | 29 + Thirdparty/stb/tests/caveview/caveview.h | 50 + Thirdparty/stb/tests/caveview/glext.h | 11124 +++++++ Thirdparty/stb/tests/caveview/glext_list.h | 34 + Thirdparty/stb/tests/caveview/main.c | 0 Thirdparty/stb/tests/caveview/stb_gl.h | 1103 + Thirdparty/stb/tests/caveview/stb_glprog.h | 504 + .../tests/caveview/win32/SDL_windows_main.c | 224 + Thirdparty/stb/tests/fuzz_main.c | 54 + Thirdparty/stb/tests/grid_reachability.c | 363 + Thirdparty/stb/tests/herringbone.dsp | 95 + Thirdparty/stb/tests/herringbone_generator.c | 87 + Thirdparty/stb/tests/herringbone_map.c | 83 + Thirdparty/stb/tests/herringbone_map.dsp | 94 + Thirdparty/stb/tests/image_test.c | 173 + Thirdparty/stb/tests/image_test.dsp | 103 + Thirdparty/stb/tests/image_write_test.c | 60 + Thirdparty/stb/tests/ossfuzz.sh | 29 + Thirdparty/stb/tests/oversample/README.md | 94 + Thirdparty/stb/tests/oversample/main.c | 332 + .../stb/tests/oversample/oversample.dsp | 97 + .../stb/tests/oversample/oversample.dsw | 29 + .../stb/tests/oversample/oversample.exe | Bin 0 -> 54272 bytes .../stb/tests/oversample/stb_wingraph.h | 829 + Thirdparty/stb/tests/pbm/basi0g16.pgm | Bin 0 -> 2064 bytes Thirdparty/stb/tests/pbm/basi2c16.ppm | Bin 0 -> 6160 bytes Thirdparty/stb/tests/pbm/cdfn2c08.ppm | Bin 0 -> 826 bytes Thirdparty/stb/tests/pbm/cdun2c08.ppm | Bin 0 -> 3086 bytes Thirdparty/stb/tests/pbm/comment.pgm | Bin 0 -> 1083 bytes Thirdparty/stb/tests/pbm/ctfn0g04.pgm | Bin 0 -> 1038 bytes Thirdparty/stb/tests/pg_test/pg_test.c | 124 + .../stb/tests/pngsuite/16bit/basi0g16.png | Bin 0 -> 299 bytes .../stb/tests/pngsuite/16bit/basi2c16.png | Bin 0 -> 595 bytes .../stb/tests/pngsuite/16bit/basi4a16.png | Bin 0 -> 2855 bytes .../stb/tests/pngsuite/16bit/basi6a16.png | Bin 0 -> 4180 bytes .../stb/tests/pngsuite/16bit/basn0g16.png | Bin 0 -> 167 bytes .../stb/tests/pngsuite/16bit/basn2c16.png | Bin 0 -> 302 bytes .../stb/tests/pngsuite/16bit/basn4a16.png | Bin 0 -> 2206 bytes .../stb/tests/pngsuite/16bit/basn6a16.png | Bin 0 -> 3435 bytes .../stb/tests/pngsuite/16bit/bgai4a16.png | Bin 0 -> 2855 bytes .../stb/tests/pngsuite/16bit/bgan6a16.png | Bin 0 -> 3435 bytes .../stb/tests/pngsuite/16bit/bggn4a16.png | Bin 0 -> 2220 bytes .../stb/tests/pngsuite/16bit/bgyn6a16.png | Bin 0 -> 3453 bytes .../stb/tests/pngsuite/16bit/oi1n0g16.png | Bin 0 -> 167 bytes .../stb/tests/pngsuite/16bit/oi1n2c16.png | Bin 0 -> 302 bytes .../stb/tests/pngsuite/16bit/oi2n0g16.png | Bin 0 -> 179 bytes .../stb/tests/pngsuite/16bit/oi2n2c16.png | Bin 0 -> 314 bytes .../stb/tests/pngsuite/16bit/oi4n0g16.png | Bin 0 -> 203 bytes .../stb/tests/pngsuite/16bit/oi4n2c16.png | Bin 0 -> 338 bytes .../stb/tests/pngsuite/16bit/oi9n0g16.png | Bin 0 -> 1283 bytes .../stb/tests/pngsuite/16bit/oi9n2c16.png | Bin 0 -> 3038 bytes .../stb/tests/pngsuite/16bit/tbbn2c16.png | Bin 0 -> 2041 bytes .../stb/tests/pngsuite/16bit/tbgn2c16.png | Bin 0 -> 2041 bytes .../stb/tests/pngsuite/16bit/tbwn0g16.png | Bin 0 -> 1313 bytes .../stb/tests/pngsuite/PngSuite.LICENSE | 9 + .../stb/tests/pngsuite/corrupt/xc1n0g08.png | Bin 0 -> 138 bytes .../stb/tests/pngsuite/corrupt/xc9n2c08.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xcrn0g04.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xcsn0g01.png | Bin 0 -> 164 bytes .../stb/tests/pngsuite/corrupt/xd0n2c08.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xd3n2c08.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xd9n2c08.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xdtn0g01.png | Bin 0 -> 61 bytes .../stb/tests/pngsuite/corrupt/xhdn0g08.png | Bin 0 -> 138 bytes .../stb/tests/pngsuite/corrupt/xlfn0g04.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/corrupt/xs1n0g01.png | Bin 0 -> 164 bytes .../stb/tests/pngsuite/corrupt/xs2n0g01.png | Bin 0 -> 164 bytes .../stb/tests/pngsuite/corrupt/xs4n0g01.png | Bin 0 -> 164 bytes .../stb/tests/pngsuite/corrupt/xs7n0g01.png | Bin 0 -> 164 bytes .../tests/pngsuite/iphone/iphone_basi0g01.png | Bin 0 -> 384 bytes .../tests/pngsuite/iphone/iphone_basi0g02.png | Bin 0 -> 302 bytes .../tests/pngsuite/iphone/iphone_basi3p02.png | Bin 0 -> 303 bytes .../tests/pngsuite/iphone/iphone_bgwn6a08.png | Bin 0 -> 2573 bytes .../tests/pngsuite/iphone/iphone_bgyn6a16.png | Bin 0 -> 2267 bytes .../tests/pngsuite/iphone/iphone_tbyn3p08.png | Bin 0 -> 1558 bytes .../tests/pngsuite/iphone/iphone_z06n2c08.png | Bin 0 -> 2393 bytes .../stb/tests/pngsuite/primary/basi0g01.png | Bin 0 -> 217 bytes .../stb/tests/pngsuite/primary/basi0g02.png | Bin 0 -> 154 bytes .../stb/tests/pngsuite/primary/basi0g04.png | Bin 0 -> 247 bytes .../stb/tests/pngsuite/primary/basi0g08.png | Bin 0 -> 254 bytes .../stb/tests/pngsuite/primary/basi2c08.png | Bin 0 -> 315 bytes .../stb/tests/pngsuite/primary/basi3p01.png | Bin 0 -> 132 bytes .../stb/tests/pngsuite/primary/basi3p02.png | Bin 0 -> 193 bytes .../stb/tests/pngsuite/primary/basi3p04.png | Bin 0 -> 327 bytes .../stb/tests/pngsuite/primary/basi3p08.png | Bin 0 -> 1527 bytes .../stb/tests/pngsuite/primary/basi4a08.png | Bin 0 -> 214 bytes .../stb/tests/pngsuite/primary/basi6a08.png | Bin 0 -> 361 bytes .../stb/tests/pngsuite/primary/basn0g01.png | Bin 0 -> 164 bytes .../stb/tests/pngsuite/primary/basn0g02.png | Bin 0 -> 104 bytes .../stb/tests/pngsuite/primary/basn0g04.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/primary/basn0g08.png | Bin 0 -> 138 bytes .../stb/tests/pngsuite/primary/basn2c08.png | Bin 0 -> 145 bytes .../stb/tests/pngsuite/primary/basn3p01.png | Bin 0 -> 112 bytes .../stb/tests/pngsuite/primary/basn3p02.png | Bin 0 -> 146 bytes .../stb/tests/pngsuite/primary/basn3p04.png | Bin 0 -> 216 bytes .../stb/tests/pngsuite/primary/basn3p08.png | Bin 0 -> 1286 bytes .../stb/tests/pngsuite/primary/basn4a08.png | Bin 0 -> 126 bytes .../stb/tests/pngsuite/primary/basn6a08.png | Bin 0 -> 184 bytes .../stb/tests/pngsuite/primary/bgai4a08.png | Bin 0 -> 214 bytes .../stb/tests/pngsuite/primary/bgan6a08.png | Bin 0 -> 184 bytes .../stb/tests/pngsuite/primary/bgbn4a08.png | Bin 0 -> 140 bytes .../stb/tests/pngsuite/primary/bgwn6a08.png | Bin 0 -> 202 bytes .../stb/tests/pngsuite/primary/s01i3p01.png | Bin 0 -> 113 bytes .../stb/tests/pngsuite/primary/s01n3p01.png | Bin 0 -> 113 bytes .../stb/tests/pngsuite/primary/s02i3p01.png | Bin 0 -> 114 bytes .../stb/tests/pngsuite/primary/s02n3p01.png | Bin 0 -> 115 bytes .../stb/tests/pngsuite/primary/s03i3p01.png | Bin 0 -> 118 bytes .../stb/tests/pngsuite/primary/s03n3p01.png | Bin 0 -> 120 bytes .../stb/tests/pngsuite/primary/s04i3p01.png | Bin 0 -> 126 bytes .../stb/tests/pngsuite/primary/s04n3p01.png | Bin 0 -> 121 bytes .../stb/tests/pngsuite/primary/s05i3p02.png | Bin 0 -> 134 bytes .../stb/tests/pngsuite/primary/s05n3p02.png | Bin 0 -> 129 bytes .../stb/tests/pngsuite/primary/s06i3p02.png | Bin 0 -> 143 bytes .../stb/tests/pngsuite/primary/s06n3p02.png | Bin 0 -> 131 bytes .../stb/tests/pngsuite/primary/s07i3p02.png | Bin 0 -> 149 bytes .../stb/tests/pngsuite/primary/s07n3p02.png | Bin 0 -> 138 bytes .../stb/tests/pngsuite/primary/s08i3p02.png | Bin 0 -> 149 bytes .../stb/tests/pngsuite/primary/s08n3p02.png | Bin 0 -> 139 bytes .../stb/tests/pngsuite/primary/s09i3p02.png | Bin 0 -> 147 bytes .../stb/tests/pngsuite/primary/s09n3p02.png | Bin 0 -> 143 bytes .../stb/tests/pngsuite/primary/s32i3p04.png | Bin 0 -> 355 bytes .../stb/tests/pngsuite/primary/s32n3p04.png | Bin 0 -> 263 bytes .../stb/tests/pngsuite/primary/s33i3p04.png | Bin 0 -> 385 bytes .../stb/tests/pngsuite/primary/s33n3p04.png | Bin 0 -> 329 bytes .../stb/tests/pngsuite/primary/s34i3p04.png | Bin 0 -> 349 bytes .../stb/tests/pngsuite/primary/s34n3p04.png | Bin 0 -> 248 bytes .../stb/tests/pngsuite/primary/s35i3p04.png | Bin 0 -> 399 bytes .../stb/tests/pngsuite/primary/s35n3p04.png | Bin 0 -> 338 bytes .../stb/tests/pngsuite/primary/s36i3p04.png | Bin 0 -> 356 bytes .../stb/tests/pngsuite/primary/s36n3p04.png | Bin 0 -> 258 bytes .../stb/tests/pngsuite/primary/s37i3p04.png | Bin 0 -> 393 bytes .../stb/tests/pngsuite/primary/s37n3p04.png | Bin 0 -> 336 bytes .../stb/tests/pngsuite/primary/s38i3p04.png | Bin 0 -> 357 bytes .../stb/tests/pngsuite/primary/s38n3p04.png | Bin 0 -> 245 bytes .../stb/tests/pngsuite/primary/s39i3p04.png | Bin 0 -> 420 bytes .../stb/tests/pngsuite/primary/s39n3p04.png | Bin 0 -> 352 bytes .../stb/tests/pngsuite/primary/s40i3p04.png | Bin 0 -> 357 bytes .../stb/tests/pngsuite/primary/s40n3p04.png | Bin 0 -> 256 bytes .../stb/tests/pngsuite/primary/tbbn0g04.png | Bin 0 -> 429 bytes .../stb/tests/pngsuite/primary/tbbn3p08.png | Bin 0 -> 1499 bytes .../stb/tests/pngsuite/primary/tbgn3p08.png | Bin 0 -> 1499 bytes .../stb/tests/pngsuite/primary/tbrn2c08.png | Bin 0 -> 1633 bytes .../stb/tests/pngsuite/primary/tbwn3p08.png | Bin 0 -> 1496 bytes .../stb/tests/pngsuite/primary/tbyn3p08.png | Bin 0 -> 1499 bytes .../stb/tests/pngsuite/primary/tm3n3p02.png | Bin 0 -> 116 bytes .../stb/tests/pngsuite/primary/tp0n0g08.png | Bin 0 -> 719 bytes .../stb/tests/pngsuite/primary/tp0n2c08.png | Bin 0 -> 1594 bytes .../stb/tests/pngsuite/primary/tp0n3p08.png | Bin 0 -> 1476 bytes .../stb/tests/pngsuite/primary/tp1n3p08.png | Bin 0 -> 1483 bytes .../stb/tests/pngsuite/primary/z00n2c08.png | Bin 0 -> 3172 bytes .../stb/tests/pngsuite/primary/z03n2c08.png | Bin 0 -> 232 bytes .../stb/tests/pngsuite/primary/z06n2c08.png | Bin 0 -> 224 bytes .../stb/tests/pngsuite/primary/z09n2c08.png | Bin 0 -> 224 bytes .../tests/pngsuite/primary_check/basi0g01.png | Bin 0 -> 391 bytes .../tests/pngsuite/primary_check/basi0g02.png | Bin 0 -> 283 bytes .../tests/pngsuite/primary_check/basi0g04.png | Bin 0 -> 252 bytes .../tests/pngsuite/primary_check/basi0g08.png | Bin 0 -> 293 bytes .../tests/pngsuite/primary_check/basi2c08.png | Bin 0 -> 274 bytes .../tests/pngsuite/primary_check/basi3p01.png | Bin 0 -> 273 bytes .../tests/pngsuite/primary_check/basi3p02.png | Bin 0 -> 286 bytes .../tests/pngsuite/primary_check/basi3p04.png | Bin 0 -> 331 bytes .../tests/pngsuite/primary_check/basi3p08.png | Bin 0 -> 387 bytes .../tests/pngsuite/primary_check/basi4a08.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/basi6a08.png | Bin 0 -> 298 bytes .../tests/pngsuite/primary_check/basn0g01.png | Bin 0 -> 391 bytes .../tests/pngsuite/primary_check/basn0g02.png | Bin 0 -> 283 bytes .../tests/pngsuite/primary_check/basn0g04.png | Bin 0 -> 252 bytes .../tests/pngsuite/primary_check/basn0g08.png | Bin 0 -> 293 bytes .../tests/pngsuite/primary_check/basn2c08.png | Bin 0 -> 274 bytes .../tests/pngsuite/primary_check/basn3p01.png | Bin 0 -> 273 bytes .../tests/pngsuite/primary_check/basn3p02.png | Bin 0 -> 286 bytes .../tests/pngsuite/primary_check/basn3p04.png | Bin 0 -> 331 bytes .../tests/pngsuite/primary_check/basn3p08.png | Bin 0 -> 387 bytes .../tests/pngsuite/primary_check/basn4a08.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/basn6a08.png | Bin 0 -> 298 bytes .../tests/pngsuite/primary_check/bgai4a08.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/bgan6a08.png | Bin 0 -> 298 bytes .../tests/pngsuite/primary_check/bgbn4a08.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/bgwn6a08.png | Bin 0 -> 298 bytes .../tests/pngsuite/primary_check/s01i3p01.png | Bin 0 -> 202 bytes .../tests/pngsuite/primary_check/s01n3p01.png | Bin 0 -> 202 bytes .../tests/pngsuite/primary_check/s02i3p01.png | Bin 0 -> 210 bytes .../tests/pngsuite/primary_check/s02n3p01.png | Bin 0 -> 210 bytes .../tests/pngsuite/primary_check/s03i3p01.png | Bin 0 -> 216 bytes .../tests/pngsuite/primary_check/s03n3p01.png | Bin 0 -> 216 bytes .../tests/pngsuite/primary_check/s04i3p01.png | Bin 0 -> 221 bytes .../tests/pngsuite/primary_check/s04n3p01.png | Bin 0 -> 221 bytes .../tests/pngsuite/primary_check/s05i3p02.png | Bin 0 -> 232 bytes .../tests/pngsuite/primary_check/s05n3p02.png | Bin 0 -> 232 bytes .../tests/pngsuite/primary_check/s06i3p02.png | Bin 0 -> 239 bytes .../tests/pngsuite/primary_check/s06n3p02.png | Bin 0 -> 239 bytes .../tests/pngsuite/primary_check/s07i3p02.png | Bin 0 -> 249 bytes .../tests/pngsuite/primary_check/s07n3p02.png | Bin 0 -> 249 bytes .../tests/pngsuite/primary_check/s08i3p02.png | Bin 0 -> 255 bytes .../tests/pngsuite/primary_check/s08n3p02.png | Bin 0 -> 255 bytes .../tests/pngsuite/primary_check/s09i3p02.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/s09n3p02.png | Bin 0 -> 263 bytes .../tests/pngsuite/primary_check/s32i3p04.png | Bin 0 -> 441 bytes .../tests/pngsuite/primary_check/s32n3p04.png | Bin 0 -> 441 bytes .../tests/pngsuite/primary_check/s33i3p04.png | Bin 0 -> 470 bytes .../tests/pngsuite/primary_check/s33n3p04.png | Bin 0 -> 470 bytes .../tests/pngsuite/primary_check/s34i3p04.png | Bin 0 -> 431 bytes .../tests/pngsuite/primary_check/s34n3p04.png | Bin 0 -> 431 bytes .../tests/pngsuite/primary_check/s35i3p04.png | Bin 0 -> 477 bytes .../tests/pngsuite/primary_check/s35n3p04.png | Bin 0 -> 477 bytes .../tests/pngsuite/primary_check/s36i3p04.png | Bin 0 -> 448 bytes .../tests/pngsuite/primary_check/s36n3p04.png | Bin 0 -> 448 bytes .../tests/pngsuite/primary_check/s37i3p04.png | Bin 0 -> 478 bytes .../tests/pngsuite/primary_check/s37n3p04.png | Bin 0 -> 478 bytes .../tests/pngsuite/primary_check/s38i3p04.png | Bin 0 -> 439 bytes .../tests/pngsuite/primary_check/s38n3p04.png | Bin 0 -> 439 bytes .../tests/pngsuite/primary_check/s39i3p04.png | Bin 0 -> 499 bytes .../tests/pngsuite/primary_check/s39n3p04.png | Bin 0 -> 499 bytes .../tests/pngsuite/primary_check/s40i3p04.png | Bin 0 -> 463 bytes .../tests/pngsuite/primary_check/s40n3p04.png | Bin 0 -> 463 bytes .../tests/pngsuite/primary_check/tbbn0g04.png | Bin 0 -> 762 bytes .../tests/pngsuite/primary_check/tbbn3p08.png | Bin 0 -> 1911 bytes .../tests/pngsuite/primary_check/tbgn3p08.png | Bin 0 -> 1911 bytes .../tests/pngsuite/primary_check/tbrn2c08.png | Bin 0 -> 1901 bytes .../tests/pngsuite/primary_check/tbwn3p08.png | Bin 0 -> 1911 bytes .../tests/pngsuite/primary_check/tbyn3p08.png | Bin 0 -> 1911 bytes .../tests/pngsuite/primary_check/tm3n3p02.png | Bin 0 -> 306 bytes .../tests/pngsuite/primary_check/tp0n0g08.png | Bin 0 -> 1802 bytes .../tests/pngsuite/primary_check/tp0n2c08.png | Bin 0 -> 1955 bytes .../tests/pngsuite/primary_check/tp0n3p08.png | Bin 0 -> 1959 bytes .../tests/pngsuite/primary_check/tp1n3p08.png | Bin 0 -> 1911 bytes .../tests/pngsuite/primary_check/z00n2c08.png | Bin 0 -> 422 bytes .../tests/pngsuite/primary_check/z03n2c08.png | Bin 0 -> 422 bytes .../tests/pngsuite/primary_check/z06n2c08.png | Bin 0 -> 422 bytes .../tests/pngsuite/primary_check/z09n2c08.png | Bin 0 -> 422 bytes .../stb/tests/pngsuite/unused/ccwn2c08.png | Bin 0 -> 1514 bytes .../stb/tests/pngsuite/unused/ccwn3p08.png | Bin 0 -> 1554 bytes .../stb/tests/pngsuite/unused/cdfn2c08.png | Bin 0 -> 404 bytes .../stb/tests/pngsuite/unused/cdhn2c08.png | Bin 0 -> 344 bytes .../stb/tests/pngsuite/unused/cdsn2c08.png | Bin 0 -> 232 bytes .../stb/tests/pngsuite/unused/cdun2c08.png | Bin 0 -> 724 bytes .../stb/tests/pngsuite/unused/ch1n3p04.png | Bin 0 -> 258 bytes .../stb/tests/pngsuite/unused/ch2n3p08.png | Bin 0 -> 1810 bytes .../stb/tests/pngsuite/unused/cm0n0g04.png | Bin 0 -> 292 bytes .../stb/tests/pngsuite/unused/cm7n0g04.png | Bin 0 -> 292 bytes .../stb/tests/pngsuite/unused/cm9n0g04.png | Bin 0 -> 292 bytes .../stb/tests/pngsuite/unused/cs3n2c16.png | Bin 0 -> 214 bytes .../stb/tests/pngsuite/unused/cs3n3p08.png | Bin 0 -> 259 bytes .../stb/tests/pngsuite/unused/cs5n2c08.png | Bin 0 -> 186 bytes .../stb/tests/pngsuite/unused/cs5n3p08.png | Bin 0 -> 271 bytes .../stb/tests/pngsuite/unused/cs8n2c08.png | Bin 0 -> 149 bytes .../stb/tests/pngsuite/unused/cs8n3p08.png | Bin 0 -> 256 bytes .../stb/tests/pngsuite/unused/ct0n0g04.png | Bin 0 -> 273 bytes .../stb/tests/pngsuite/unused/ct1n0g04.png | Bin 0 -> 792 bytes .../stb/tests/pngsuite/unused/cten0g04.png | Bin 0 -> 742 bytes .../stb/tests/pngsuite/unused/ctfn0g04.png | Bin 0 -> 716 bytes .../stb/tests/pngsuite/unused/ctgn0g04.png | Bin 0 -> 1182 bytes .../stb/tests/pngsuite/unused/cthn0g04.png | Bin 0 -> 1269 bytes .../stb/tests/pngsuite/unused/ctjn0g04.png | Bin 0 -> 941 bytes .../stb/tests/pngsuite/unused/ctzn0g04.png | Bin 0 -> 753 bytes .../stb/tests/pngsuite/unused/f00n0g08.png | Bin 0 -> 319 bytes .../stb/tests/pngsuite/unused/f00n2c08.png | Bin 0 -> 2475 bytes .../stb/tests/pngsuite/unused/f01n0g08.png | Bin 0 -> 321 bytes .../stb/tests/pngsuite/unused/f01n2c08.png | Bin 0 -> 1180 bytes .../stb/tests/pngsuite/unused/f02n0g08.png | Bin 0 -> 355 bytes .../stb/tests/pngsuite/unused/f02n2c08.png | Bin 0 -> 1729 bytes .../stb/tests/pngsuite/unused/f03n0g08.png | Bin 0 -> 389 bytes .../stb/tests/pngsuite/unused/f03n2c08.png | Bin 0 -> 1291 bytes .../stb/tests/pngsuite/unused/f04n0g08.png | Bin 0 -> 269 bytes .../stb/tests/pngsuite/unused/f04n2c08.png | Bin 0 -> 985 bytes .../stb/tests/pngsuite/unused/f99n0g04.png | Bin 0 -> 426 bytes .../stb/tests/pngsuite/unused/g03n0g16.png | Bin 0 -> 345 bytes .../stb/tests/pngsuite/unused/g03n2c08.png | Bin 0 -> 370 bytes .../stb/tests/pngsuite/unused/g03n3p04.png | Bin 0 -> 214 bytes .../stb/tests/pngsuite/unused/g04n0g16.png | Bin 0 -> 363 bytes .../stb/tests/pngsuite/unused/g04n2c08.png | Bin 0 -> 377 bytes .../stb/tests/pngsuite/unused/g04n3p04.png | Bin 0 -> 219 bytes .../stb/tests/pngsuite/unused/g05n0g16.png | Bin 0 -> 339 bytes .../stb/tests/pngsuite/unused/g05n2c08.png | Bin 0 -> 350 bytes .../stb/tests/pngsuite/unused/g05n3p04.png | Bin 0 -> 206 bytes .../stb/tests/pngsuite/unused/g07n0g16.png | Bin 0 -> 321 bytes .../stb/tests/pngsuite/unused/g07n2c08.png | Bin 0 -> 340 bytes .../stb/tests/pngsuite/unused/g07n3p04.png | Bin 0 -> 207 bytes .../stb/tests/pngsuite/unused/g10n0g16.png | Bin 0 -> 262 bytes .../stb/tests/pngsuite/unused/g10n2c08.png | Bin 0 -> 285 bytes .../stb/tests/pngsuite/unused/g10n3p04.png | Bin 0 -> 214 bytes .../stb/tests/pngsuite/unused/g25n0g16.png | Bin 0 -> 383 bytes .../stb/tests/pngsuite/unused/g25n2c08.png | Bin 0 -> 405 bytes .../stb/tests/pngsuite/unused/g25n3p04.png | Bin 0 -> 215 bytes .../stb/tests/pngsuite/unused/pp0n2c16.png | Bin 0 -> 962 bytes .../stb/tests/pngsuite/unused/pp0n6a08.png | Bin 0 -> 818 bytes .../stb/tests/pngsuite/unused/ps1n0g08.png | Bin 0 -> 1456 bytes .../stb/tests/pngsuite/unused/ps1n2c16.png | Bin 0 -> 1620 bytes .../stb/tests/pngsuite/unused/ps2n0g08.png | Bin 0 -> 2320 bytes .../stb/tests/pngsuite/unused/ps2n2c16.png | Bin 0 -> 2484 bytes Thirdparty/stb/tests/prerelease/stb_lib.h | 3305 +++ Thirdparty/stb/tests/resample_test.cpp | 1127 + Thirdparty/stb/tests/resample_test_c.c | 8 + Thirdparty/stb/tests/resize.dsp | 94 + Thirdparty/stb/tests/sdf/sdf_test.c | 152 + .../stb/tests/sdf/sdf_test_arial_16.png | Bin 0 -> 121269 bytes .../stb/tests/sdf/sdf_test_times_16.png | Bin 0 -> 108371 bytes .../stb/tests/sdf/sdf_test_times_50.png | Bin 0 -> 104962 bytes Thirdparty/stb/tests/stb.c | 3330 +++ Thirdparty/stb/tests/stb.dsp | 240 + Thirdparty/stb/tests/stb.dsw | 158 + Thirdparty/stb/tests/stb_c_lexer_fuzzer.cpp | 74 + Thirdparty/stb/tests/stb_cpp.cpp | 85 + Thirdparty/stb/tests/stb_cpp.dsp | 98 + Thirdparty/stb/tests/stb_png.dict | 8 + Thirdparty/stb/tests/stb_static.c | 12 + Thirdparty/stb/tests/stbi_read_fuzzer.c | 28 + Thirdparty/stb/tests/stblib.dsp | 102 + Thirdparty/stb/tests/stblib_test.c | 11 + Thirdparty/stb/tests/stblib_test_companion.c | 4 + Thirdparty/stb/tests/stretch_test.dsp | 89 + Thirdparty/stb/tests/test.sbm | 60 + Thirdparty/stb/tests/test_c_compilation.c | 50 + Thirdparty/stb/tests/test_c_lexer.c | 50 + Thirdparty/stb/tests/test_cpp_compilation.cpp | 186 + Thirdparty/stb/tests/test_ds.c | 1034 + Thirdparty/stb/tests/test_ds_cpp.cpp | 418 + Thirdparty/stb/tests/test_dxt.c | 1 + Thirdparty/stb/tests/test_easyfont.c | 10 + Thirdparty/stb/tests/test_image.c | 7 + Thirdparty/stb/tests/test_image_write.c | 7 + Thirdparty/stb/tests/test_perlin.c | 1 + Thirdparty/stb/tests/test_siphash.c | 21 + Thirdparty/stb/tests/test_sprintf.c | 202 + Thirdparty/stb/tests/test_truetype.c | 154 + Thirdparty/stb/tests/test_vorbis.c | 18 + Thirdparty/stb/tests/test_voxel.c | 1 + Thirdparty/stb/tests/textedit_sample.c | 94 + .../tilemap_editor_integration_example.c | 193 + Thirdparty/stb/tests/truetype_test_win32.c | 184 + Thirdparty/stb/tests/vorbseek/vorbseek.c | 125 + Thirdparty/stb/tests/vorbseek/vorbseek.dsp | 96 + Thirdparty/stb/tools/README.footer.md | 135 + Thirdparty/stb/tools/README.header.md | 20 + Thirdparty/stb/tools/README.list | 21 + Thirdparty/stb/tools/build_matrix.c | 137 + Thirdparty/stb/tools/easy_font_maker.c | 211 + Thirdparty/stb/tools/make_readme.c | 65 + Thirdparty/stb/tools/make_readme.dsp | 97 + Thirdparty/stb/tools/mr.bat | 1 + Thirdparty/stb/tools/trailing_whitespace.c | 32 + Thirdparty/stb/tools/unicode.c | 749 + Thirdparty/stb/tools/unicode/unicode.dsp | 88 + src/Application/Application.cpp | 52 + src/Application/Application.h | 24 + src/CMakeLists.txt | 85 + src/Core/Constant.cpp | 0 src/Core/Constant.h | 44 + src/Core/Core.h | 17 + src/Core/CriticalSection.cpp | 10 + src/Core/CriticalSection.h | 25 + src/Core/Logger.cpp | 29 + src/Core/Logger.h | 38 + src/Core/Mesh.cpp | 27 + src/Core/Mesh.h | 43 + src/Core/Object/Object.cpp | 55 + src/Core/Object/Object.h | 48 + src/Core/Object/SharedPtr.h | 194 + src/Core/Object/WeakPtr.cpp | 57 + src/Core/Object/WeakPtr.h | 188 + src/Core/ScopeLock.h | 20 + src/Core/Singleton.h | 65 + src/Core/SpinLock.h | 23 + src/Core/StbImage.cpp | 3 + src/Core/StringUtil.cpp | 74 + src/Core/StringUtil.h | 12 + src/Core/Thread/ThreadChecker.cpp | 41 + src/Core/Thread/ThreadChecker.h | 23 + src/HumanRender.manifest | 11 + src/Platforms/Windows/Main.cpp | 117 + src/RHI/DriverSettings.h | 19 + src/RHI/IRHIAPI.h | 60 + src/RHI/OpenglDrv/GLDrvAPI.cpp | 124 + src/RHI/OpenglDrv/GLDrvAPI.h | 59 + src/RHI/OpenglDrv/GLHandleMapper.cpp | 114 + src/RHI/OpenglDrv/GLHandleMapper.h | 32 + src/RHI/OpenglDrv/GLRHICommond.cpp | 252 + src/RHI/OpenglDrv/GLRHICommond.h | 178 + src/RHI/OpenglDrv/GLShader.cpp | 178 + src/RHI/OpenglDrv/GLShader.h | 43 + src/RHI/RHI.cpp | 97 + src/RHI/RHI.h | 45 + src/RHI/RHICommond.cpp | 11 + src/RHI/RHICommond.h | 115 + src/RHI/RHICommondList.cpp | 63 + src/RHI/RHICommondList.h | 35 + src/Window/GLFWImpl/GLFWImpl.cpp | 72 + src/Window/GLFWImpl/GLFWImpl.h | 23 + src/Window/Window.cpp | 22 + src/Window/Window.h | 25 + src/Window/WindowImpl.h | 17 + src/Window/WindowSettings.h | 19 + 1954 files changed, 516780 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 Thirdparty/SDL2/BUGS.txt create mode 100644 Thirdparty/SDL2/COPYING.txt create mode 100644 Thirdparty/SDL2/README-SDL.txt create mode 100644 Thirdparty/SDL2/README.txt create mode 100644 Thirdparty/SDL2/WhatsNew.txt create mode 100644 Thirdparty/SDL2/cmake/sdl2-config-version.cmake create mode 100644 Thirdparty/SDL2/cmake/sdl2-config.cmake create mode 100644 Thirdparty/SDL2/docs/CONTRIBUTING.md create mode 100644 Thirdparty/SDL2/docs/README-android.md create mode 100644 Thirdparty/SDL2/docs/README-cmake.md create mode 100644 Thirdparty/SDL2/docs/README-directfb.md create mode 100644 Thirdparty/SDL2/docs/README-dynapi.md create mode 100644 Thirdparty/SDL2/docs/README-emscripten.md create mode 100644 Thirdparty/SDL2/docs/README-gdk.md create mode 100644 Thirdparty/SDL2/docs/README-gesture.md create mode 100644 Thirdparty/SDL2/docs/README-git.md create mode 100644 Thirdparty/SDL2/docs/README-hg.md create mode 100644 Thirdparty/SDL2/docs/README-ios.md create mode 100644 Thirdparty/SDL2/docs/README-kmsbsd.md create mode 100644 Thirdparty/SDL2/docs/README-linux.md create mode 100644 Thirdparty/SDL2/docs/README-macos.md create mode 100644 Thirdparty/SDL2/docs/README-n3ds.md create mode 100644 Thirdparty/SDL2/docs/README-nacl.md create mode 100644 Thirdparty/SDL2/docs/README-ngage.md create mode 100644 Thirdparty/SDL2/docs/README-os2.md create mode 100644 Thirdparty/SDL2/docs/README-pandora.md create mode 100644 Thirdparty/SDL2/docs/README-platforms.md create mode 100644 Thirdparty/SDL2/docs/README-porting.md create mode 100644 Thirdparty/SDL2/docs/README-ps2.md create mode 100644 Thirdparty/SDL2/docs/README-psp.md create mode 100644 Thirdparty/SDL2/docs/README-raspberrypi.md create mode 100644 Thirdparty/SDL2/docs/README-riscos.md create mode 100644 Thirdparty/SDL2/docs/README-touch.md create mode 100644 Thirdparty/SDL2/docs/README-versions.md create mode 100644 Thirdparty/SDL2/docs/README-visualc.md create mode 100644 Thirdparty/SDL2/docs/README-vita.md create mode 100644 Thirdparty/SDL2/docs/README-wince.md create mode 100644 Thirdparty/SDL2/docs/README-windows.md create mode 100644 Thirdparty/SDL2/docs/README-winrt.md create mode 100644 Thirdparty/SDL2/docs/README.md create mode 100644 Thirdparty/SDL2/docs/doxyfile create mode 100644 Thirdparty/SDL2/docs/release_checklist.md create mode 100644 Thirdparty/SDL2/include/SDL.h create mode 100644 Thirdparty/SDL2/include/SDL_assert.h create mode 100644 Thirdparty/SDL2/include/SDL_atomic.h create mode 100644 Thirdparty/SDL2/include/SDL_audio.h create mode 100644 Thirdparty/SDL2/include/SDL_bits.h create mode 100644 Thirdparty/SDL2/include/SDL_blendmode.h create mode 100644 Thirdparty/SDL2/include/SDL_clipboard.h create mode 100644 Thirdparty/SDL2/include/SDL_config.h create mode 100644 Thirdparty/SDL2/include/SDL_cpuinfo.h create mode 100644 Thirdparty/SDL2/include/SDL_egl.h create mode 100644 Thirdparty/SDL2/include/SDL_endian.h create mode 100644 Thirdparty/SDL2/include/SDL_error.h create mode 100644 Thirdparty/SDL2/include/SDL_events.h create mode 100644 Thirdparty/SDL2/include/SDL_filesystem.h create mode 100644 Thirdparty/SDL2/include/SDL_gamecontroller.h create mode 100644 Thirdparty/SDL2/include/SDL_gesture.h create mode 100644 Thirdparty/SDL2/include/SDL_guid.h create mode 100644 Thirdparty/SDL2/include/SDL_haptic.h create mode 100644 Thirdparty/SDL2/include/SDL_hidapi.h create mode 100644 Thirdparty/SDL2/include/SDL_hints.h create mode 100644 Thirdparty/SDL2/include/SDL_joystick.h create mode 100644 Thirdparty/SDL2/include/SDL_keyboard.h create mode 100644 Thirdparty/SDL2/include/SDL_keycode.h create mode 100644 Thirdparty/SDL2/include/SDL_loadso.h create mode 100644 Thirdparty/SDL2/include/SDL_locale.h create mode 100644 Thirdparty/SDL2/include/SDL_log.h create mode 100644 Thirdparty/SDL2/include/SDL_main.h create mode 100644 Thirdparty/SDL2/include/SDL_messagebox.h create mode 100644 Thirdparty/SDL2/include/SDL_metal.h create mode 100644 Thirdparty/SDL2/include/SDL_misc.h create mode 100644 Thirdparty/SDL2/include/SDL_mouse.h create mode 100644 Thirdparty/SDL2/include/SDL_mutex.h create mode 100644 Thirdparty/SDL2/include/SDL_name.h create mode 100644 Thirdparty/SDL2/include/SDL_opengl.h create mode 100644 Thirdparty/SDL2/include/SDL_opengl_glext.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles2.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles2_gl2.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles2_gl2ext.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles2_gl2platform.h create mode 100644 Thirdparty/SDL2/include/SDL_opengles2_khrplatform.h create mode 100644 Thirdparty/SDL2/include/SDL_pixels.h create mode 100644 Thirdparty/SDL2/include/SDL_platform.h create mode 100644 Thirdparty/SDL2/include/SDL_power.h create mode 100644 Thirdparty/SDL2/include/SDL_quit.h create mode 100644 Thirdparty/SDL2/include/SDL_rect.h create mode 100644 Thirdparty/SDL2/include/SDL_render.h create mode 100644 Thirdparty/SDL2/include/SDL_revision.h create mode 100644 Thirdparty/SDL2/include/SDL_rwops.h create mode 100644 Thirdparty/SDL2/include/SDL_scancode.h create mode 100644 Thirdparty/SDL2/include/SDL_sensor.h create mode 100644 Thirdparty/SDL2/include/SDL_shape.h create mode 100644 Thirdparty/SDL2/include/SDL_stdinc.h create mode 100644 Thirdparty/SDL2/include/SDL_surface.h create mode 100644 Thirdparty/SDL2/include/SDL_system.h create mode 100644 Thirdparty/SDL2/include/SDL_syswm.h create mode 100644 Thirdparty/SDL2/include/SDL_test.h create mode 100644 Thirdparty/SDL2/include/SDL_test_assert.h create mode 100644 Thirdparty/SDL2/include/SDL_test_common.h create mode 100644 Thirdparty/SDL2/include/SDL_test_compare.h create mode 100644 Thirdparty/SDL2/include/SDL_test_crc32.h create mode 100644 Thirdparty/SDL2/include/SDL_test_font.h create mode 100644 Thirdparty/SDL2/include/SDL_test_fuzzer.h create mode 100644 Thirdparty/SDL2/include/SDL_test_harness.h create mode 100644 Thirdparty/SDL2/include/SDL_test_images.h create mode 100644 Thirdparty/SDL2/include/SDL_test_log.h create mode 100644 Thirdparty/SDL2/include/SDL_test_md5.h create mode 100644 Thirdparty/SDL2/include/SDL_test_memory.h create mode 100644 Thirdparty/SDL2/include/SDL_test_random.h create mode 100644 Thirdparty/SDL2/include/SDL_thread.h create mode 100644 Thirdparty/SDL2/include/SDL_timer.h create mode 100644 Thirdparty/SDL2/include/SDL_touch.h create mode 100644 Thirdparty/SDL2/include/SDL_types.h create mode 100644 Thirdparty/SDL2/include/SDL_version.h create mode 100644 Thirdparty/SDL2/include/SDL_video.h create mode 100644 Thirdparty/SDL2/include/SDL_vulkan.h create mode 100644 Thirdparty/SDL2/include/begin_code.h create mode 100644 Thirdparty/SDL2/include/close_code.h create mode 100644 Thirdparty/SDL2/lib/x64/SDL2.dll create mode 100644 Thirdparty/SDL2/lib/x64/SDL2.lib create mode 100644 Thirdparty/SDL2/lib/x64/SDL2main.lib create mode 100644 Thirdparty/SDL2/lib/x64/SDL2test.lib create mode 100644 Thirdparty/SDL2/lib/x86/SDL2.dll create mode 100644 Thirdparty/SDL2/lib/x86/SDL2.lib create mode 100644 Thirdparty/SDL2/lib/x86/SDL2main.lib create mode 100644 Thirdparty/SDL2/lib/x86/SDL2test.lib create mode 100644 Thirdparty/glew/LICENSE.txt create mode 100644 Thirdparty/glew/doc/advanced.html create mode 100644 Thirdparty/glew/doc/basic.html create mode 100644 Thirdparty/glew/doc/build.html create mode 100644 Thirdparty/glew/doc/credits.html create mode 100644 Thirdparty/glew/doc/github.png create mode 100644 Thirdparty/glew/doc/glew.css create mode 100644 Thirdparty/glew/doc/glew.html create mode 100644 Thirdparty/glew/doc/glew.png create mode 100644 Thirdparty/glew/doc/glew.txt create mode 100644 Thirdparty/glew/doc/glxew.html create mode 100644 Thirdparty/glew/doc/gpl.txt create mode 100644 Thirdparty/glew/doc/index.html create mode 100644 Thirdparty/glew/doc/install.html create mode 100644 Thirdparty/glew/doc/khronos.txt create mode 100644 Thirdparty/glew/doc/log.html create mode 100644 Thirdparty/glew/doc/mesa.txt create mode 100644 Thirdparty/glew/doc/new.png create mode 100644 Thirdparty/glew/doc/ogl_sm.jpg create mode 100644 Thirdparty/glew/doc/travis.png create mode 100644 Thirdparty/glew/doc/wglew.html create mode 100644 Thirdparty/glew/include/GL/eglew.h create mode 100644 Thirdparty/glew/include/GL/glew.h create mode 100644 Thirdparty/glew/include/GL/glxew.h create mode 100644 Thirdparty/glew/include/GL/wglew.h create mode 100644 Thirdparty/glew/lib/Release/Win32/glew32.lib create mode 100644 Thirdparty/glew/lib/Release/Win32/glew32s.lib create mode 100644 Thirdparty/glew/lib/Release/x64/glew32.lib create mode 100644 Thirdparty/glew/lib/Release/x64/glew32s.lib create mode 100644 Thirdparty/glew/lib/glew32.lib create mode 100644 Thirdparty/glew/lib/glew32s.lib create mode 100644 Thirdparty/glfw/include/GLFW/glfw3.h create mode 100644 Thirdparty/glfw/include/GLFW/glfw3native.h create mode 100644 Thirdparty/glfw/lib-vc2022/glfw3.dll create mode 100644 Thirdparty/glfw/lib-vc2022/glfw3.lib create mode 100644 Thirdparty/glfw/lib-vc2022/glfw3_mt.lib create mode 100644 Thirdparty/glfw/lib-vc2022/glfw3dll.lib create mode 100644 Thirdparty/glm/CMakeLists.txt create mode 100644 Thirdparty/glm/common.hpp create mode 100644 Thirdparty/glm/detail/_features.hpp create mode 100644 Thirdparty/glm/detail/_fixes.hpp create mode 100644 Thirdparty/glm/detail/_noise.hpp create mode 100644 Thirdparty/glm/detail/_swizzle.hpp create mode 100644 Thirdparty/glm/detail/_swizzle_func.hpp create mode 100644 Thirdparty/glm/detail/_vectorize.hpp create mode 100644 Thirdparty/glm/detail/compute_common.hpp create mode 100644 Thirdparty/glm/detail/compute_vector_relational.hpp create mode 100644 Thirdparty/glm/detail/func_common.inl create mode 100644 Thirdparty/glm/detail/func_common_simd.inl create mode 100644 Thirdparty/glm/detail/func_exponential.inl create mode 100644 Thirdparty/glm/detail/func_exponential_simd.inl create mode 100644 Thirdparty/glm/detail/func_geometric.inl create mode 100644 Thirdparty/glm/detail/func_geometric_simd.inl create mode 100644 Thirdparty/glm/detail/func_integer.inl create mode 100644 Thirdparty/glm/detail/func_integer_simd.inl create mode 100644 Thirdparty/glm/detail/func_matrix.inl create mode 100644 Thirdparty/glm/detail/func_matrix_simd.inl create mode 100644 Thirdparty/glm/detail/func_packing.inl create mode 100644 Thirdparty/glm/detail/func_packing_simd.inl create mode 100644 Thirdparty/glm/detail/func_trigonometric.inl create mode 100644 Thirdparty/glm/detail/func_trigonometric_simd.inl create mode 100644 Thirdparty/glm/detail/func_vector_relational.inl create mode 100644 Thirdparty/glm/detail/func_vector_relational_simd.inl create mode 100644 Thirdparty/glm/detail/glm.cpp create mode 100644 Thirdparty/glm/detail/qualifier.hpp create mode 100644 Thirdparty/glm/detail/setup.hpp create mode 100644 Thirdparty/glm/detail/type_float.hpp create mode 100644 Thirdparty/glm/detail/type_half.hpp create mode 100644 Thirdparty/glm/detail/type_half.inl create mode 100644 Thirdparty/glm/detail/type_mat2x2.hpp create mode 100644 Thirdparty/glm/detail/type_mat2x2.inl create mode 100644 Thirdparty/glm/detail/type_mat2x3.hpp create mode 100644 Thirdparty/glm/detail/type_mat2x3.inl create mode 100644 Thirdparty/glm/detail/type_mat2x4.hpp create mode 100644 Thirdparty/glm/detail/type_mat2x4.inl create mode 100644 Thirdparty/glm/detail/type_mat3x2.hpp create mode 100644 Thirdparty/glm/detail/type_mat3x2.inl create mode 100644 Thirdparty/glm/detail/type_mat3x3.hpp create mode 100644 Thirdparty/glm/detail/type_mat3x3.inl create mode 100644 Thirdparty/glm/detail/type_mat3x4.hpp create mode 100644 Thirdparty/glm/detail/type_mat3x4.inl create mode 100644 Thirdparty/glm/detail/type_mat4x2.hpp create mode 100644 Thirdparty/glm/detail/type_mat4x2.inl create mode 100644 Thirdparty/glm/detail/type_mat4x3.hpp create mode 100644 Thirdparty/glm/detail/type_mat4x3.inl create mode 100644 Thirdparty/glm/detail/type_mat4x4.hpp create mode 100644 Thirdparty/glm/detail/type_mat4x4.inl create mode 100644 Thirdparty/glm/detail/type_mat4x4_simd.inl create mode 100644 Thirdparty/glm/detail/type_quat.hpp create mode 100644 Thirdparty/glm/detail/type_quat.inl create mode 100644 Thirdparty/glm/detail/type_quat_simd.inl create mode 100644 Thirdparty/glm/detail/type_vec1.hpp create mode 100644 Thirdparty/glm/detail/type_vec1.inl create mode 100644 Thirdparty/glm/detail/type_vec2.hpp create mode 100644 Thirdparty/glm/detail/type_vec2.inl create mode 100644 Thirdparty/glm/detail/type_vec3.hpp create mode 100644 Thirdparty/glm/detail/type_vec3.inl create mode 100644 Thirdparty/glm/detail/type_vec4.hpp create mode 100644 Thirdparty/glm/detail/type_vec4.inl create mode 100644 Thirdparty/glm/detail/type_vec4_simd.inl create mode 100644 Thirdparty/glm/exponential.hpp create mode 100644 Thirdparty/glm/ext.hpp create mode 100644 Thirdparty/glm/ext/matrix_clip_space.hpp create mode 100644 Thirdparty/glm/ext/matrix_clip_space.inl create mode 100644 Thirdparty/glm/ext/matrix_common.hpp create mode 100644 Thirdparty/glm/ext/matrix_common.inl create mode 100644 Thirdparty/glm/ext/matrix_double2x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_double2x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double2x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_double2x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double2x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_double2x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_double3x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_double4x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_float2x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_float3x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x2_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x3_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_float4x4_precision.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_int2x4_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_int3x4_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_int4x4_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_projection.hpp create mode 100644 Thirdparty/glm/ext/matrix_projection.inl create mode 100644 Thirdparty/glm/ext/matrix_relational.hpp create mode 100644 Thirdparty/glm/ext/matrix_relational.inl create mode 100644 Thirdparty/glm/ext/matrix_transform.hpp create mode 100644 Thirdparty/glm/ext/matrix_transform.inl create mode 100644 Thirdparty/glm/ext/matrix_uint2x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint2x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint2x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint2x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint2x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint2x4_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint3x4_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x2.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x2_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x3.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x3_sized.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x4.hpp create mode 100644 Thirdparty/glm/ext/matrix_uint4x4_sized.hpp create mode 100644 Thirdparty/glm/ext/quaternion_common.hpp create mode 100644 Thirdparty/glm/ext/quaternion_common.inl create mode 100644 Thirdparty/glm/ext/quaternion_common_simd.inl create mode 100644 Thirdparty/glm/ext/quaternion_double.hpp create mode 100644 Thirdparty/glm/ext/quaternion_double_precision.hpp create mode 100644 Thirdparty/glm/ext/quaternion_exponential.hpp create mode 100644 Thirdparty/glm/ext/quaternion_exponential.inl create mode 100644 Thirdparty/glm/ext/quaternion_float.hpp create mode 100644 Thirdparty/glm/ext/quaternion_float_precision.hpp create mode 100644 Thirdparty/glm/ext/quaternion_geometric.hpp create mode 100644 Thirdparty/glm/ext/quaternion_geometric.inl create mode 100644 Thirdparty/glm/ext/quaternion_relational.hpp create mode 100644 Thirdparty/glm/ext/quaternion_relational.inl create mode 100644 Thirdparty/glm/ext/quaternion_transform.hpp create mode 100644 Thirdparty/glm/ext/quaternion_transform.inl create mode 100644 Thirdparty/glm/ext/quaternion_trigonometric.hpp create mode 100644 Thirdparty/glm/ext/quaternion_trigonometric.inl create mode 100644 Thirdparty/glm/ext/scalar_common.hpp create mode 100644 Thirdparty/glm/ext/scalar_common.inl create mode 100644 Thirdparty/glm/ext/scalar_constants.hpp create mode 100644 Thirdparty/glm/ext/scalar_constants.inl create mode 100644 Thirdparty/glm/ext/scalar_int_sized.hpp create mode 100644 Thirdparty/glm/ext/scalar_integer.hpp create mode 100644 Thirdparty/glm/ext/scalar_integer.inl create mode 100644 Thirdparty/glm/ext/scalar_packing.hpp create mode 100644 Thirdparty/glm/ext/scalar_packing.inl create mode 100644 Thirdparty/glm/ext/scalar_relational.hpp create mode 100644 Thirdparty/glm/ext/scalar_relational.inl create mode 100644 Thirdparty/glm/ext/scalar_uint_sized.hpp create mode 100644 Thirdparty/glm/ext/scalar_ulp.hpp create mode 100644 Thirdparty/glm/ext/scalar_ulp.inl create mode 100644 Thirdparty/glm/ext/vector_bool1.hpp create mode 100644 Thirdparty/glm/ext/vector_bool1_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_bool2.hpp create mode 100644 Thirdparty/glm/ext/vector_bool2_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_bool3.hpp create mode 100644 Thirdparty/glm/ext/vector_bool3_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_bool4.hpp create mode 100644 Thirdparty/glm/ext/vector_bool4_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_common.hpp create mode 100644 Thirdparty/glm/ext/vector_common.inl create mode 100644 Thirdparty/glm/ext/vector_double1.hpp create mode 100644 Thirdparty/glm/ext/vector_double1_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_double2.hpp create mode 100644 Thirdparty/glm/ext/vector_double2_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_double3.hpp create mode 100644 Thirdparty/glm/ext/vector_double3_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_double4.hpp create mode 100644 Thirdparty/glm/ext/vector_double4_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_float1.hpp create mode 100644 Thirdparty/glm/ext/vector_float1_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_float2.hpp create mode 100644 Thirdparty/glm/ext/vector_float2_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_float3.hpp create mode 100644 Thirdparty/glm/ext/vector_float3_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_float4.hpp create mode 100644 Thirdparty/glm/ext/vector_float4_precision.hpp create mode 100644 Thirdparty/glm/ext/vector_int1.hpp create mode 100644 Thirdparty/glm/ext/vector_int1_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_int2.hpp create mode 100644 Thirdparty/glm/ext/vector_int2_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_int3.hpp create mode 100644 Thirdparty/glm/ext/vector_int3_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_int4.hpp create mode 100644 Thirdparty/glm/ext/vector_int4_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_integer.hpp create mode 100644 Thirdparty/glm/ext/vector_integer.inl create mode 100644 Thirdparty/glm/ext/vector_packing.hpp create mode 100644 Thirdparty/glm/ext/vector_packing.inl create mode 100644 Thirdparty/glm/ext/vector_relational.hpp create mode 100644 Thirdparty/glm/ext/vector_relational.inl create mode 100644 Thirdparty/glm/ext/vector_uint1.hpp create mode 100644 Thirdparty/glm/ext/vector_uint1_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_uint2.hpp create mode 100644 Thirdparty/glm/ext/vector_uint2_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_uint3.hpp create mode 100644 Thirdparty/glm/ext/vector_uint3_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_uint4.hpp create mode 100644 Thirdparty/glm/ext/vector_uint4_sized.hpp create mode 100644 Thirdparty/glm/ext/vector_ulp.hpp create mode 100644 Thirdparty/glm/ext/vector_ulp.inl create mode 100644 Thirdparty/glm/fwd.hpp create mode 100644 Thirdparty/glm/geometric.hpp create mode 100644 Thirdparty/glm/glm.hpp create mode 100644 Thirdparty/glm/gtc/bitfield.hpp create mode 100644 Thirdparty/glm/gtc/bitfield.inl create mode 100644 Thirdparty/glm/gtc/color_space.hpp create mode 100644 Thirdparty/glm/gtc/color_space.inl create mode 100644 Thirdparty/glm/gtc/constants.hpp create mode 100644 Thirdparty/glm/gtc/constants.inl create mode 100644 Thirdparty/glm/gtc/epsilon.hpp create mode 100644 Thirdparty/glm/gtc/epsilon.inl create mode 100644 Thirdparty/glm/gtc/integer.hpp create mode 100644 Thirdparty/glm/gtc/integer.inl create mode 100644 Thirdparty/glm/gtc/matrix_access.hpp create mode 100644 Thirdparty/glm/gtc/matrix_access.inl create mode 100644 Thirdparty/glm/gtc/matrix_integer.hpp create mode 100644 Thirdparty/glm/gtc/matrix_inverse.hpp create mode 100644 Thirdparty/glm/gtc/matrix_inverse.inl create mode 100644 Thirdparty/glm/gtc/matrix_transform.hpp create mode 100644 Thirdparty/glm/gtc/matrix_transform.inl create mode 100644 Thirdparty/glm/gtc/noise.hpp create mode 100644 Thirdparty/glm/gtc/noise.inl create mode 100644 Thirdparty/glm/gtc/packing.hpp create mode 100644 Thirdparty/glm/gtc/packing.inl create mode 100644 Thirdparty/glm/gtc/quaternion.hpp create mode 100644 Thirdparty/glm/gtc/quaternion.inl create mode 100644 Thirdparty/glm/gtc/quaternion_simd.inl create mode 100644 Thirdparty/glm/gtc/random.hpp create mode 100644 Thirdparty/glm/gtc/random.inl create mode 100644 Thirdparty/glm/gtc/reciprocal.hpp create mode 100644 Thirdparty/glm/gtc/reciprocal.inl create mode 100644 Thirdparty/glm/gtc/round.hpp create mode 100644 Thirdparty/glm/gtc/round.inl create mode 100644 Thirdparty/glm/gtc/type_aligned.hpp create mode 100644 Thirdparty/glm/gtc/type_precision.hpp create mode 100644 Thirdparty/glm/gtc/type_precision.inl create mode 100644 Thirdparty/glm/gtc/type_ptr.hpp create mode 100644 Thirdparty/glm/gtc/type_ptr.inl create mode 100644 Thirdparty/glm/gtc/ulp.hpp create mode 100644 Thirdparty/glm/gtc/ulp.inl create mode 100644 Thirdparty/glm/gtc/vec1.hpp create mode 100644 Thirdparty/glm/gtx/associated_min_max.hpp create mode 100644 Thirdparty/glm/gtx/associated_min_max.inl create mode 100644 Thirdparty/glm/gtx/bit.hpp create mode 100644 Thirdparty/glm/gtx/bit.inl create mode 100644 Thirdparty/glm/gtx/closest_point.hpp create mode 100644 Thirdparty/glm/gtx/closest_point.inl create mode 100644 Thirdparty/glm/gtx/color_encoding.hpp create mode 100644 Thirdparty/glm/gtx/color_encoding.inl create mode 100644 Thirdparty/glm/gtx/color_space.hpp create mode 100644 Thirdparty/glm/gtx/color_space.inl create mode 100644 Thirdparty/glm/gtx/color_space_YCoCg.hpp create mode 100644 Thirdparty/glm/gtx/color_space_YCoCg.inl create mode 100644 Thirdparty/glm/gtx/common.hpp create mode 100644 Thirdparty/glm/gtx/common.inl create mode 100644 Thirdparty/glm/gtx/compatibility.hpp create mode 100644 Thirdparty/glm/gtx/compatibility.inl create mode 100644 Thirdparty/glm/gtx/component_wise.hpp create mode 100644 Thirdparty/glm/gtx/component_wise.inl create mode 100644 Thirdparty/glm/gtx/dual_quaternion.hpp create mode 100644 Thirdparty/glm/gtx/dual_quaternion.inl create mode 100644 Thirdparty/glm/gtx/easing.hpp create mode 100644 Thirdparty/glm/gtx/easing.inl create mode 100644 Thirdparty/glm/gtx/euler_angles.hpp create mode 100644 Thirdparty/glm/gtx/euler_angles.inl create mode 100644 Thirdparty/glm/gtx/extend.hpp create mode 100644 Thirdparty/glm/gtx/extend.inl create mode 100644 Thirdparty/glm/gtx/extended_min_max.hpp create mode 100644 Thirdparty/glm/gtx/extended_min_max.inl create mode 100644 Thirdparty/glm/gtx/exterior_product.hpp create mode 100644 Thirdparty/glm/gtx/exterior_product.inl create mode 100644 Thirdparty/glm/gtx/fast_exponential.hpp create mode 100644 Thirdparty/glm/gtx/fast_exponential.inl create mode 100644 Thirdparty/glm/gtx/fast_square_root.hpp create mode 100644 Thirdparty/glm/gtx/fast_square_root.inl create mode 100644 Thirdparty/glm/gtx/fast_trigonometry.hpp create mode 100644 Thirdparty/glm/gtx/fast_trigonometry.inl create mode 100644 Thirdparty/glm/gtx/float_notmalize.inl create mode 100644 Thirdparty/glm/gtx/functions.hpp create mode 100644 Thirdparty/glm/gtx/functions.inl create mode 100644 Thirdparty/glm/gtx/gradient_paint.hpp create mode 100644 Thirdparty/glm/gtx/gradient_paint.inl create mode 100644 Thirdparty/glm/gtx/handed_coordinate_space.hpp create mode 100644 Thirdparty/glm/gtx/handed_coordinate_space.inl create mode 100644 Thirdparty/glm/gtx/hash.hpp create mode 100644 Thirdparty/glm/gtx/hash.inl create mode 100644 Thirdparty/glm/gtx/integer.hpp create mode 100644 Thirdparty/glm/gtx/integer.inl create mode 100644 Thirdparty/glm/gtx/intersect.hpp create mode 100644 Thirdparty/glm/gtx/intersect.inl create mode 100644 Thirdparty/glm/gtx/io.hpp create mode 100644 Thirdparty/glm/gtx/io.inl create mode 100644 Thirdparty/glm/gtx/log_base.hpp create mode 100644 Thirdparty/glm/gtx/log_base.inl create mode 100644 Thirdparty/glm/gtx/matrix_cross_product.hpp create mode 100644 Thirdparty/glm/gtx/matrix_cross_product.inl create mode 100644 Thirdparty/glm/gtx/matrix_decompose.hpp create mode 100644 Thirdparty/glm/gtx/matrix_decompose.inl create mode 100644 Thirdparty/glm/gtx/matrix_factorisation.hpp create mode 100644 Thirdparty/glm/gtx/matrix_factorisation.inl create mode 100644 Thirdparty/glm/gtx/matrix_interpolation.hpp create mode 100644 Thirdparty/glm/gtx/matrix_interpolation.inl create mode 100644 Thirdparty/glm/gtx/matrix_major_storage.hpp create mode 100644 Thirdparty/glm/gtx/matrix_major_storage.inl create mode 100644 Thirdparty/glm/gtx/matrix_operation.hpp create mode 100644 Thirdparty/glm/gtx/matrix_operation.inl create mode 100644 Thirdparty/glm/gtx/matrix_query.hpp create mode 100644 Thirdparty/glm/gtx/matrix_query.inl create mode 100644 Thirdparty/glm/gtx/matrix_transform_2d.hpp create mode 100644 Thirdparty/glm/gtx/matrix_transform_2d.inl create mode 100644 Thirdparty/glm/gtx/mixed_product.hpp create mode 100644 Thirdparty/glm/gtx/mixed_product.inl create mode 100644 Thirdparty/glm/gtx/norm.hpp create mode 100644 Thirdparty/glm/gtx/norm.inl create mode 100644 Thirdparty/glm/gtx/normal.hpp create mode 100644 Thirdparty/glm/gtx/normal.inl create mode 100644 Thirdparty/glm/gtx/normalize_dot.hpp create mode 100644 Thirdparty/glm/gtx/normalize_dot.inl create mode 100644 Thirdparty/glm/gtx/number_precision.hpp create mode 100644 Thirdparty/glm/gtx/number_precision.inl create mode 100644 Thirdparty/glm/gtx/optimum_pow.hpp create mode 100644 Thirdparty/glm/gtx/optimum_pow.inl create mode 100644 Thirdparty/glm/gtx/orthonormalize.hpp create mode 100644 Thirdparty/glm/gtx/orthonormalize.inl create mode 100644 Thirdparty/glm/gtx/perpendicular.hpp create mode 100644 Thirdparty/glm/gtx/perpendicular.inl create mode 100644 Thirdparty/glm/gtx/polar_coordinates.hpp create mode 100644 Thirdparty/glm/gtx/polar_coordinates.inl create mode 100644 Thirdparty/glm/gtx/projection.hpp create mode 100644 Thirdparty/glm/gtx/projection.inl create mode 100644 Thirdparty/glm/gtx/quaternion.hpp create mode 100644 Thirdparty/glm/gtx/quaternion.inl create mode 100644 Thirdparty/glm/gtx/range.hpp create mode 100644 Thirdparty/glm/gtx/raw_data.hpp create mode 100644 Thirdparty/glm/gtx/raw_data.inl create mode 100644 Thirdparty/glm/gtx/rotate_normalized_axis.hpp create mode 100644 Thirdparty/glm/gtx/rotate_normalized_axis.inl create mode 100644 Thirdparty/glm/gtx/rotate_vector.hpp create mode 100644 Thirdparty/glm/gtx/rotate_vector.inl create mode 100644 Thirdparty/glm/gtx/scalar_multiplication.hpp create mode 100644 Thirdparty/glm/gtx/scalar_relational.hpp create mode 100644 Thirdparty/glm/gtx/scalar_relational.inl create mode 100644 Thirdparty/glm/gtx/spline.hpp create mode 100644 Thirdparty/glm/gtx/spline.inl create mode 100644 Thirdparty/glm/gtx/std_based_type.hpp create mode 100644 Thirdparty/glm/gtx/std_based_type.inl create mode 100644 Thirdparty/glm/gtx/string_cast.hpp create mode 100644 Thirdparty/glm/gtx/string_cast.inl create mode 100644 Thirdparty/glm/gtx/texture.hpp create mode 100644 Thirdparty/glm/gtx/texture.inl create mode 100644 Thirdparty/glm/gtx/transform.hpp create mode 100644 Thirdparty/glm/gtx/transform.inl create mode 100644 Thirdparty/glm/gtx/transform2.hpp create mode 100644 Thirdparty/glm/gtx/transform2.inl create mode 100644 Thirdparty/glm/gtx/type_aligned.hpp create mode 100644 Thirdparty/glm/gtx/type_aligned.inl create mode 100644 Thirdparty/glm/gtx/type_trait.hpp create mode 100644 Thirdparty/glm/gtx/type_trait.inl create mode 100644 Thirdparty/glm/gtx/vec_swizzle.hpp create mode 100644 Thirdparty/glm/gtx/vector_angle.hpp create mode 100644 Thirdparty/glm/gtx/vector_angle.inl create mode 100644 Thirdparty/glm/gtx/vector_query.hpp create mode 100644 Thirdparty/glm/gtx/vector_query.inl create mode 100644 Thirdparty/glm/gtx/wrap.hpp create mode 100644 Thirdparty/glm/gtx/wrap.inl create mode 100644 Thirdparty/glm/integer.hpp create mode 100644 Thirdparty/glm/mat2x2.hpp create mode 100644 Thirdparty/glm/mat2x3.hpp create mode 100644 Thirdparty/glm/mat2x4.hpp create mode 100644 Thirdparty/glm/mat3x2.hpp create mode 100644 Thirdparty/glm/mat3x3.hpp create mode 100644 Thirdparty/glm/mat3x4.hpp create mode 100644 Thirdparty/glm/mat4x2.hpp create mode 100644 Thirdparty/glm/mat4x3.hpp create mode 100644 Thirdparty/glm/mat4x4.hpp create mode 100644 Thirdparty/glm/matrix.hpp create mode 100644 Thirdparty/glm/packing.hpp create mode 100644 Thirdparty/glm/simd/common.h create mode 100644 Thirdparty/glm/simd/exponential.h create mode 100644 Thirdparty/glm/simd/geometric.h create mode 100644 Thirdparty/glm/simd/integer.h create mode 100644 Thirdparty/glm/simd/matrix.h create mode 100644 Thirdparty/glm/simd/neon.h create mode 100644 Thirdparty/glm/simd/packing.h create mode 100644 Thirdparty/glm/simd/platform.h create mode 100644 Thirdparty/glm/simd/trigonometric.h create mode 100644 Thirdparty/glm/simd/vector_relational.h create mode 100644 Thirdparty/glm/trigonometric.hpp create mode 100644 Thirdparty/glm/vec2.hpp create mode 100644 Thirdparty/glm/vec3.hpp create mode 100644 Thirdparty/glm/vec4.hpp create mode 100644 Thirdparty/glm/vector_relational.hpp create mode 100644 Thirdparty/irrKlang/changes.txt create mode 100644 Thirdparty/irrKlang/doc/cpp/annotated.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classes.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d.html create mode 100644 Thirdparty/irrKlang/doc/cpp/doxygen.css create mode 100644 Thirdparty/irrKlang/doc/cpp/doxygen.png create mode 100644 Thirdparty/irrKlang/doc/cpp/files.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x63.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x64.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x65.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x66.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x67.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x6c.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x6e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x6f.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x70.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x72.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x73.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x75.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x76.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x78.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x79.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x7a.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_0x7e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_func.html create mode 100644 Thirdparty/irrKlang/doc/cpp/functions_vars.html create mode 100644 Thirdparty/irrKlang/doc/cpp/globals.html create mode 100644 Thirdparty/irrKlang/doc/cpp/globals_defs.html create mode 100644 Thirdparty/irrKlang/doc/cpp/hierarchy.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/index.html create mode 100644 Thirdparty/irrKlang/doc/cpp/installdox create mode 100644 Thirdparty/irrKlang/doc/cpp/irr_klang_8h.html create mode 100644 Thirdparty/irrKlang/doc/cpp/irr_klang_8h_source.html create mode 100644 Thirdparty/irrKlang/doc/cpp/irrklang.png create mode 100644 Thirdparty/irrKlang/doc/cpp/logobig.png create mode 100644 Thirdparty/irrKlang/doc/cpp/namespaceirrklang.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers_enum.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers_eval.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers_func.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers_type.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespacemembers_vars.html create mode 100644 Thirdparty/irrKlang/doc/cpp/namespaces.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_61.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_63.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_64.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_65.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_66.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_67.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_6c.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_6d.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_6e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_6f.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_70.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_72.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_73.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_75.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_76.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_78.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_79.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_7a.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/all_7e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/classes_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/classes_73.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/classes_76.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/close.png create mode 100644 Thirdparty/irrKlang/doc/cpp/search/defines_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/enums_65.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/enumvalues_65.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/files_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_61.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_63.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_64.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_65.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_66.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_67.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_6c.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_6d.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_6e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_6f.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_70.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_72.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_73.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_75.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_76.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/functions_7e.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/namespaces_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/nomatches.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/search.css create mode 100644 Thirdparty/irrKlang/doc/cpp/search/search.js create mode 100644 Thirdparty/irrKlang/doc/cpp/search/search.png create mode 100644 Thirdparty/irrKlang/doc/cpp/search/typedefs_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/typedefs_76.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_63.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_66.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_69.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_70.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_73.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_78.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_79.html create mode 100644 Thirdparty/irrKlang/doc/cpp/search/variables_7a.html create mode 100644 Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format.html create mode 100644 Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface-members.html create mode 100644 Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface.html create mode 100644 Thirdparty/irrKlang/doc/cpp/tab_b.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/tab_l.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/tab_r.gif create mode 100644 Thirdparty/irrKlang/doc/cpp/tabs.css create mode 100644 Thirdparty/irrKlang/doc/doc_cpp.html create mode 100644 Thirdparty/irrKlang/doc/doc_dotnet.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.BytesPerSecond.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.ChannelCount.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.Format.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameCount.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameSize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleDataSize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleRate.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleSize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatFields.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarder.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarderMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarder.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarderMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AddSoundSourceFromRecordedAudio.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AudioFormat.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.ClearRecordedAudioDataBuffer.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.IsRecording.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.RecordedAudioData.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StopRecordingAudio.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.openFile.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Dispose.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finished.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Looped.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MaxDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MinDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Pan.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Paused.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayLength.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayPosition.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlaybackSpeed.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Position.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.SoundEffectControl.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Stop.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Velocity.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Volume.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.DeviceCount.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceDescription.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceID.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableAllEffects.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableChorusSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableCompressorSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableDistortionSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableEchoSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableFlangerSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableGargleSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableI3DL2ReverbSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableParamEqSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableWavesReverbSoundEffect.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsChorusSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsCompressorSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsDistortionSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsEchoSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsFlangerSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsGargleSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsParamEqSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsWavesReverbSoundEffectEnabled.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddFileFactory.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceAlias.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromIOStream.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromMemory.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromPCMData.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMaxDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMinDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsCurrentlyPlaying.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsMultiThreaded.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.LoadPlugins.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Name.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_4.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_5.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_6.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_4.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_5.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_6.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_7.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_8.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveAllSoundSources.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveSoundSource.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetAllSoundsPaused.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetDopplerEffectParameters.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_4.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetRolloffFactor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SoundVolume.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.StopAllSounds.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Update.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.internalGetNativeEngine.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor3.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor4.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.AudioFormat.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMaxDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMinDistance.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultVolume.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Dispose.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Finalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForceReloadAtNextUse.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForcedStreamingThreshold.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.IsSeekingSupported.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Name.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.PlayLength.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.SampleData.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.StreamMode.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.getNativeSoundSource.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.OnSoundStopped.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.SampleFormat.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundDeviceListType.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundEngineOptionFlag.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundOutputDriver.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.StopEventCause.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarder.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarderMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamMode.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.CrossProduct.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.DotProduct.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Equals.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFrom.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFromSQ.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetInterpolated.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLength.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLengthSQ.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Invert.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.IsBetweenPoints.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Length.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.LengthSQ.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Normalize.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.SetLength.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.ToString.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.X.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Y.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Z.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Addition.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Division.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Equality.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overloads.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Subtraction.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor1.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor2.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DFields.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMembers.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMethods.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DOperators.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DProperties.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlang.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/IrrKlangHierarchy.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/MSDN.css create mode 100644 Thirdparty/irrKlang/doc/dotnet/contents.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/default.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/index.html create mode 100644 Thirdparty/irrKlang/doc/dotnet/intevent.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/intfield.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/intmethod.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/intoperator.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/intproperty.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/ndoc.log create mode 100644 Thirdparty/irrKlang/doc/dotnet/privevent.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/privfield.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/privmethod.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/privoperator.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/privproperty.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/protevent.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/protfield.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/protmethod.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/protoperator.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/protproperty.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/pubevent.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/pubfield.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/pubmethod.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/puboperator.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/pubproperty.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/static.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/tree.css create mode 100644 Thirdparty/irrKlang/doc/dotnet/tree.js create mode 100644 Thirdparty/irrKlang/doc/dotnet/treenodedot.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/treenodeminus.gif create mode 100644 Thirdparty/irrKlang/doc/dotnet/treenodeplus.gif create mode 100644 Thirdparty/irrKlang/doc/readme.txt create mode 100644 Thirdparty/irrKlang/include/ik_ESoundEngineOptions.h create mode 100644 Thirdparty/irrKlang/include/ik_ESoundOutputDrivers.h create mode 100644 Thirdparty/irrKlang/include/ik_EStreamModes.h create mode 100644 Thirdparty/irrKlang/include/ik_IAudioRecorder.h create mode 100644 Thirdparty/irrKlang/include/ik_IAudioStream.h create mode 100644 Thirdparty/irrKlang/include/ik_IAudioStreamLoader.h create mode 100644 Thirdparty/irrKlang/include/ik_IFileFactory.h create mode 100644 Thirdparty/irrKlang/include/ik_IFileReader.h create mode 100644 Thirdparty/irrKlang/include/ik_IRefCounted.h create mode 100644 Thirdparty/irrKlang/include/ik_ISound.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundDeviceList.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundEffectControl.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundEngine.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundMixedOutputReceiver.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundSource.h create mode 100644 Thirdparty/irrKlang/include/ik_ISoundStopEventReceiver.h create mode 100644 Thirdparty/irrKlang/include/ik_IVirtualRefCounted.h create mode 100644 Thirdparty/irrKlang/include/ik_SAudioStreamFormat.h create mode 100644 Thirdparty/irrKlang/include/ik_irrKlangTypes.h create mode 100644 Thirdparty/irrKlang/include/ik_vec3d.h create mode 100644 Thirdparty/irrKlang/include/irrKlang.h create mode 100644 Thirdparty/irrKlang/lib/Winx64-visualStudio/irrKlang.exp create mode 100644 Thirdparty/irrKlang/lib/Winx64-visualStudio/irrKlang.lib create mode 100644 Thirdparty/irrKlang/media/MF-3DAYS.S3M create mode 100644 Thirdparty/irrKlang/media/MF-PANTS.MOD create mode 100644 Thirdparty/irrKlang/media/MF-W-90.XM create mode 100644 Thirdparty/irrKlang/media/bell.wav create mode 100644 Thirdparty/irrKlang/media/explosion.wav create mode 100644 Thirdparty/irrKlang/media/getout.ogg create mode 100644 Thirdparty/irrKlang/media/license.txt create mode 100644 Thirdparty/irrKlang/media/ophelia.mp3 create mode 100644 Thirdparty/irrKlang/readme.txt create mode 100644 Thirdparty/opencv2/include/opencv2/calib3d.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/calib3d/calib3d.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/calib3d/calib3d_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/core.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/affine.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/async.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/base.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/bindings_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/bufferpool.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/check.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/core.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/core_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/block.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/border_interpolate.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/color.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/common.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/datamov_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/color_detail.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce_key_val.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/transform_detail.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/type_traits_detail.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/detail/vec_distance_detail.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/dynamic_smem.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/emulation.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/filters.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/funcattrib.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/functional.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/limits.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/reduce.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/saturate_cast.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/scan.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/simd_functions.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/transform.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/type_traits.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/utility.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/vec_distance.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/vec_math.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/vec_traits.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/warp.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/warp_reduce.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda/warp_shuffle.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda_stream_accessor.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cuda_types.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cv_cpu_dispatch.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/cv_cpu_helper.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/cvdef.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/cvstd.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cvstd.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/cvstd_wrapper.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/detail/async_promise.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/detail/dispatch_helper.impl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/detail/exception_ptr.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/directx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/dualquaternion.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/dualquaternion.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/eigen.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/fast_math.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/hal.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/interface.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx512.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_cpp.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_forward.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_lasx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_lsx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_msa.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_neon.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv071.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_non-policy.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_overloaded-non-policy.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_011_compat.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_compat_overloaded.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_scalable.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse_em.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_vsx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/intrin_wasm.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/msa_macros.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/hal/simd_utils.impl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/mat.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/mat.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/matx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/neon_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/ocl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/ocl_genbase.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/ocl_defs.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/opencl_info.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/opencl_svm.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clblas.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clfft.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core_wrappers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clblas.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clfft.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core_wrappers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_20.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_definitions.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_hsa_extension.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/opengl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/operations.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/optim.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/ovx.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.openmp.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.tbb.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/parallel/parallel_backend.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/persistence.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/quaternion.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/quaternion.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/saturate.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/simd_intrinsics.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/softfloat.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/sse_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/traits.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/types.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/types_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/core/utility.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.impl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/filesystem.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/fp_control_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/instrumentation.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/logger.defines.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/logger.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/logtag.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/tls.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/utils/trace.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/va_intel.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/version.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/core/vsx_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/cvconfig.h create mode 100644 Thirdparty/opencv2/include/opencv2/dnn.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/all_layers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/dict.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/dnn.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/dnn.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/layer.details.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/layer.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/shape_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/utils/debug_utils.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/utils/inference_engine.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/dnn/version.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/features2d.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/features2d/features2d.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/features2d/hal/interface.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/flann/all_indices.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/allocator.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/any.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/autotuned_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/composite_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/config.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/defines.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/dist.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/dummy.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/dynamic_bitset.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/flann.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/flann/flann_base.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/flann/general.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/ground_truth.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/hdf5.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/heap.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/hierarchical_clustering_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/index_testing.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/kdtree_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/kdtree_single_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/kmeans_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/linear_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/logger.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/lsh_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/lsh_table.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/matrix.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/miniflann.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/flann/nn_index.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/object_factory.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/params.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/random.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/result_set.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/sampling.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/saving.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/simplex_downhill.h create mode 100644 Thirdparty/opencv2/include/opencv2/flann/timer.h create mode 100644 Thirdparty/opencv2/include/opencv2/highgui.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/highgui/highgui.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/highgui/highgui_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs/ios.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs/legacy/constants_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgcodecs/macosx.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/bindings.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/detail/gcgraph.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/hal/hal.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/hal/interface.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/imgproc.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/imgproc_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/segmentation.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/imgproc/types_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/ml.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/ml/ml.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/ml/ml.inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/aruco_board.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/aruco_detector.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/aruco_dictionary.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/barcode.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/charuco_detector.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/detection_based_tracker.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/face.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/graphical_code_detector.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/objdetect/objdetect.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/opencv.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/opencv_modules.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/photo.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/photo/cuda.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/photo/legacy/constants_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/photo/photo.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/autocalib.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/blenders.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/camera.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/exposure_compensate.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/matchers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/motion_estimators.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/seam_finders.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/timelapsers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/util.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/util_inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/warpers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/detail/warpers_inl.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/stitching/warpers.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/video.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/video/background_segm.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/video/detail/tracking.detail.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/video/legacy/constants_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/video/tracking.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/video/video.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/videoio.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/videoio/cap_ios.h create mode 100644 Thirdparty/opencv2/include/opencv2/videoio/legacy/constants_c.h create mode 100644 Thirdparty/opencv2/include/opencv2/videoio/registry.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/videoio/videoio.hpp create mode 100644 Thirdparty/opencv2/include/opencv2/videoio/videoio_c.h create mode 100644 Thirdparty/opencv2/lib/OpenCVConfig-version.cmake create mode 100644 Thirdparty/opencv2/lib/OpenCVConfig.cmake create mode 100644 Thirdparty/opencv2/lib/OpenCVModules-debug.cmake create mode 100644 Thirdparty/opencv2/lib/OpenCVModules.cmake create mode 100644 Thirdparty/opencv2/lib/opencv_calib3d480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_core480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_dnn480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_features2d480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_flann480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_highgui480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_imgcodecs480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_imgproc480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_ml480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_objdetect480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_photo480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_stitching480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_video480d.lib create mode 100644 Thirdparty/opencv2/lib/opencv_videoio480d.lib create mode 100644 Thirdparty/spdlog/include/spdlog/async.h create mode 100644 Thirdparty/spdlog/include/spdlog/async_logger-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/async_logger.h create mode 100644 Thirdparty/spdlog/include/spdlog/cfg/argv.h create mode 100644 Thirdparty/spdlog/include/spdlog/cfg/env.h create mode 100644 Thirdparty/spdlog/include/spdlog/cfg/helpers-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/cfg/helpers.h create mode 100644 Thirdparty/spdlog/include/spdlog/common-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/common.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/backtracer-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/backtracer.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/circular_q.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/console_globals.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/file_helper-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/file_helper.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/fmt_helper.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/log_msg-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/log_msg.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/log_msg_buffer-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/log_msg_buffer.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/mpmc_blocking_q.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/null_mutex.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/os-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/os.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/periodic_worker-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/periodic_worker.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/registry-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/registry.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/synchronous_factory.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/tcp_client-windows.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/tcp_client.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/thread_pool-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/thread_pool.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/udp_client-windows.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/udp_client.h create mode 100644 Thirdparty/spdlog/include/spdlog/details/windows_include.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bin_to_hex.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/args.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/chrono.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/color.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/compile.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/core.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/fmt.license.rst create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/format-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/format.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/locale.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/os.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/ostream.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/printf.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/ranges.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/std.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/bundled/xchar.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/chrono.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/compile.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/fmt.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/ostr.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/ranges.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/std.h create mode 100644 Thirdparty/spdlog/include/spdlog/fmt/xchar.h create mode 100644 Thirdparty/spdlog/include/spdlog/formatter.h create mode 100644 Thirdparty/spdlog/include/spdlog/fwd.h create mode 100644 Thirdparty/spdlog/include/spdlog/logger-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/logger.h create mode 100644 Thirdparty/spdlog/include/spdlog/pattern_formatter-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/pattern_formatter.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/android_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/ansicolor_sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/ansicolor_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/base_sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/base_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/basic_file_sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/basic_file_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/callback_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/daily_file_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/dist_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/dup_filter_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/hourly_file_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/kafka_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/mongo_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/msvc_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/null_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/ostream_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/qt_sinks.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/ringbuffer_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/rotating_file_sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/rotating_file_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/stdout_color_sinks-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/stdout_color_sinks.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/stdout_sinks-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/stdout_sinks.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/syslog_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/systemd_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/tcp_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/udp_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/win_eventlog_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/wincolor_sink-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/sinks/wincolor_sink.h create mode 100644 Thirdparty/spdlog/include/spdlog/spdlog-inl.h create mode 100644 Thirdparty/spdlog/include/spdlog/spdlog.h create mode 100644 Thirdparty/spdlog/include/spdlog/stopwatch.h create mode 100644 Thirdparty/spdlog/include/spdlog/tweakme.h create mode 100644 Thirdparty/spdlog/include/spdlog/version.h create mode 100644 Thirdparty/spdlog/lib/cmake/spdlog/spdlogConfig.cmake create mode 100644 Thirdparty/spdlog/lib/cmake/spdlog/spdlogConfigTargets-debug.cmake create mode 100644 Thirdparty/spdlog/lib/cmake/spdlog/spdlogConfigTargets-release.cmake create mode 100644 Thirdparty/spdlog/lib/cmake/spdlog/spdlogConfigTargets.cmake create mode 100644 Thirdparty/spdlog/lib/cmake/spdlog/spdlogConfigVersion.cmake create mode 100644 Thirdparty/spdlog/lib/pkgconfig/spdlog.pc create mode 100644 Thirdparty/spdlog/lib/spdlog.lib create mode 100644 Thirdparty/spdlog/lib/spdlogd.lib create mode 100644 Thirdparty/stb/.travis.yml create mode 100644 Thirdparty/stb/LICENSE create mode 100644 Thirdparty/stb/README.md create mode 100644 Thirdparty/stb/data/atari_8bit_font_revised.png create mode 100644 Thirdparty/stb/data/easy_font_raw.png create mode 100644 Thirdparty/stb/data/herringbone/license.txt create mode 100644 Thirdparty/stb/data/herringbone/template_caves_limit_connectivity.png create mode 100644 Thirdparty/stb/data/herringbone/template_caves_tiny_corridors.png create mode 100644 Thirdparty/stb/data/herringbone/template_corner_caves.png create mode 100644 Thirdparty/stb/data/herringbone/template_horizontal_corridors_v1.png create mode 100644 Thirdparty/stb/data/herringbone/template_horizontal_corridors_v2.png create mode 100644 Thirdparty/stb/data/herringbone/template_horizontal_corridors_v3.png create mode 100644 Thirdparty/stb/data/herringbone/template_limit_connectivity_fat.png create mode 100644 Thirdparty/stb/data/herringbone/template_limited_connectivity.png create mode 100644 Thirdparty/stb/data/herringbone/template_maze_2_wide.png create mode 100644 Thirdparty/stb/data/herringbone/template_maze_plus_2_wide.png create mode 100644 Thirdparty/stb/data/herringbone/template_open_areas.png create mode 100644 Thirdparty/stb/data/herringbone/template_ref2_corner_caves.png create mode 100644 Thirdparty/stb/data/herringbone/template_rooms_and_corridors.png create mode 100644 Thirdparty/stb/data/herringbone/template_rooms_and_corridors_2_wide_diagonal_bias.png create mode 100644 Thirdparty/stb/data/herringbone/template_rooms_limit_connectivity.png create mode 100644 Thirdparty/stb/data/herringbone/template_round_rooms_diagonal_corridors.png create mode 100644 Thirdparty/stb/data/herringbone/template_sean_dungeon.png create mode 100644 Thirdparty/stb/data/herringbone/template_simple_caves_2_wide.png create mode 100644 Thirdparty/stb/data/herringbone/template_square_rooms_with_random_rects.png create mode 100644 Thirdparty/stb/data/map_01.png create mode 100644 Thirdparty/stb/data/map_02.png create mode 100644 Thirdparty/stb/data/map_03.png create mode 100644 Thirdparty/stb/deprecated/rrsprintf.h create mode 100644 Thirdparty/stb/deprecated/stb.h create mode 100644 Thirdparty/stb/deprecated/stb_image.c create mode 100644 Thirdparty/stb/deprecated/stb_image_resize.h create mode 100644 Thirdparty/stb/deprecated/stretch_test.c create mode 100644 Thirdparty/stb/deprecated/stretchy_buffer.h create mode 100644 Thirdparty/stb/deprecated/stretchy_buffer.txt create mode 100644 Thirdparty/stb/docs/other_libs.md create mode 100644 Thirdparty/stb/docs/stb_howto.txt create mode 100644 Thirdparty/stb/docs/stb_voxel_render_interview.md create mode 100644 Thirdparty/stb/docs/why_public_domain.md create mode 100644 Thirdparty/stb/stb_c_lexer.h create mode 100644 Thirdparty/stb/stb_connected_components.h create mode 100644 Thirdparty/stb/stb_divide.h create mode 100644 Thirdparty/stb/stb_ds.h create mode 100644 Thirdparty/stb/stb_dxt.h create mode 100644 Thirdparty/stb/stb_easy_font.h create mode 100644 Thirdparty/stb/stb_herringbone_wang_tile.h create mode 100644 Thirdparty/stb/stb_hexwave.h create mode 100644 Thirdparty/stb/stb_image.h create mode 100644 Thirdparty/stb/stb_image_resize2.h create mode 100644 Thirdparty/stb/stb_image_resize_test/dotimings.c create mode 100644 Thirdparty/stb/stb_image_resize_test/old_image_resize.h create mode 100644 Thirdparty/stb/stb_image_resize_test/oldir.c create mode 100644 Thirdparty/stb/stb_image_resize_test/stbirtest.c create mode 100644 Thirdparty/stb/stb_image_resize_test/vf_train.c create mode 100644 Thirdparty/stb/stb_image_write.h create mode 100644 Thirdparty/stb/stb_include.h create mode 100644 Thirdparty/stb/stb_leakcheck.h create mode 100644 Thirdparty/stb/stb_perlin.h create mode 100644 Thirdparty/stb/stb_rect_pack.h create mode 100644 Thirdparty/stb/stb_sprintf.h create mode 100644 Thirdparty/stb/stb_textedit.h create mode 100644 Thirdparty/stb/stb_tilemap_editor.h create mode 100644 Thirdparty/stb/stb_truetype.h create mode 100644 Thirdparty/stb/stb_vorbis.c create mode 100644 Thirdparty/stb/stb_voxel_render.h create mode 100644 Thirdparty/stb/tests/Makefile create mode 100644 Thirdparty/stb/tests/c_lexer_test.c create mode 100644 Thirdparty/stb/tests/c_lexer_test.dsp create mode 100644 Thirdparty/stb/tests/caveview/README.md create mode 100644 Thirdparty/stb/tests/caveview/cave_main.c create mode 100644 Thirdparty/stb/tests/caveview/cave_mesher.c create mode 100644 Thirdparty/stb/tests/caveview/cave_parse.c create mode 100644 Thirdparty/stb/tests/caveview/cave_parse.h create mode 100644 Thirdparty/stb/tests/caveview/cave_render.c create mode 100644 Thirdparty/stb/tests/caveview/caveview.dsp create mode 100644 Thirdparty/stb/tests/caveview/caveview.dsw create mode 100644 Thirdparty/stb/tests/caveview/caveview.h create mode 100644 Thirdparty/stb/tests/caveview/glext.h create mode 100644 Thirdparty/stb/tests/caveview/glext_list.h create mode 100644 Thirdparty/stb/tests/caveview/main.c create mode 100644 Thirdparty/stb/tests/caveview/stb_gl.h create mode 100644 Thirdparty/stb/tests/caveview/stb_glprog.h create mode 100644 Thirdparty/stb/tests/caveview/win32/SDL_windows_main.c create mode 100644 Thirdparty/stb/tests/fuzz_main.c create mode 100644 Thirdparty/stb/tests/grid_reachability.c create mode 100644 Thirdparty/stb/tests/herringbone.dsp create mode 100644 Thirdparty/stb/tests/herringbone_generator.c create mode 100644 Thirdparty/stb/tests/herringbone_map.c create mode 100644 Thirdparty/stb/tests/herringbone_map.dsp create mode 100644 Thirdparty/stb/tests/image_test.c create mode 100644 Thirdparty/stb/tests/image_test.dsp create mode 100644 Thirdparty/stb/tests/image_write_test.c create mode 100644 Thirdparty/stb/tests/ossfuzz.sh create mode 100644 Thirdparty/stb/tests/oversample/README.md create mode 100644 Thirdparty/stb/tests/oversample/main.c create mode 100644 Thirdparty/stb/tests/oversample/oversample.dsp create mode 100644 Thirdparty/stb/tests/oversample/oversample.dsw create mode 100644 Thirdparty/stb/tests/oversample/oversample.exe create mode 100644 Thirdparty/stb/tests/oversample/stb_wingraph.h create mode 100644 Thirdparty/stb/tests/pbm/basi0g16.pgm create mode 100644 Thirdparty/stb/tests/pbm/basi2c16.ppm create mode 100644 Thirdparty/stb/tests/pbm/cdfn2c08.ppm create mode 100644 Thirdparty/stb/tests/pbm/cdun2c08.ppm create mode 100644 Thirdparty/stb/tests/pbm/comment.pgm create mode 100644 Thirdparty/stb/tests/pbm/ctfn0g04.pgm create mode 100644 Thirdparty/stb/tests/pg_test/pg_test.c create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basi0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basi2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basi4a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basi6a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basn0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basn2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basn4a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/basn6a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/bgai4a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/bgan6a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/bggn4a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/bgyn6a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi1n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi1n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi2n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi2n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi4n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi4n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi9n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/oi9n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/tbbn2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/tbgn2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/16bit/tbwn0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/PngSuite.LICENSE create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xc1n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xc9n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xcrn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xcsn0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xd0n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xd3n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xd9n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xdtn0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xhdn0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xlfn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xs1n0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xs2n0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xs4n0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/corrupt/xs7n0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_basi0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_basi0g02.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_basi3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_bgwn6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_bgyn6a16.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_tbyn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/iphone/iphone_z06n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi0g02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basi6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn0g02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/basn6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/bgai4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/bgan6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/bgbn4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/bgwn6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s01i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s01n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s02i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s02n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s03i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s03n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s04i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s04n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s05i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s05n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s06i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s06n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s07i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s07n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s08i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s08n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s09i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s09n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s32i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s32n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s33i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s33n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s34i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s34n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s35i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s35n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s36i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s36n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s37i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s37n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s38i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s38n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s39i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s39n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s40i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/s40n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbbn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbbn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbgn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbrn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbwn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tbyn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tm3n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tp0n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tp0n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tp0n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/tp1n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/z00n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/z03n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/z06n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary/z09n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi0g02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basi6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn0g01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn0g02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/basn6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/bgai4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/bgan6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/bgbn4a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/bgwn6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s01i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s01n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s02i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s02n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s03i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s03n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s04i3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s04n3p01.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s05i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s05n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s06i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s06n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s07i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s07n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s08i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s08n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s09i3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s09n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s32i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s32n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s33i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s33n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s34i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s34n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s35i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s35n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s36i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s36n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s37i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s37n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s38i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s38n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s39i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s39n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s40i3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/s40n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbbn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbbn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbgn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbrn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbwn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tbyn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tm3n3p02.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tp0n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tp0n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tp0n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/tp1n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/z00n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/z03n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/z06n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/primary_check/z09n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ccwn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ccwn3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cdfn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cdhn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cdsn2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cdun2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ch1n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ch2n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cm0n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cm7n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cm9n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs3n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs3n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs5n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs5n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs8n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cs8n3p08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ct0n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ct1n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cten0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ctfn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ctgn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/cthn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ctjn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ctzn0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f00n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f00n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f01n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f01n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f02n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f02n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f03n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f03n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f04n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f04n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/f99n0g04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g03n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g03n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g03n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g04n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g04n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g04n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g05n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g05n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g05n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g07n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g07n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g07n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g10n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g10n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g10n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g25n0g16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g25n2c08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/g25n3p04.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/pp0n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/pp0n6a08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ps1n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ps1n2c16.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ps2n0g08.png create mode 100644 Thirdparty/stb/tests/pngsuite/unused/ps2n2c16.png create mode 100644 Thirdparty/stb/tests/prerelease/stb_lib.h create mode 100644 Thirdparty/stb/tests/resample_test.cpp create mode 100644 Thirdparty/stb/tests/resample_test_c.c create mode 100644 Thirdparty/stb/tests/resize.dsp create mode 100644 Thirdparty/stb/tests/sdf/sdf_test.c create mode 100644 Thirdparty/stb/tests/sdf/sdf_test_arial_16.png create mode 100644 Thirdparty/stb/tests/sdf/sdf_test_times_16.png create mode 100644 Thirdparty/stb/tests/sdf/sdf_test_times_50.png create mode 100644 Thirdparty/stb/tests/stb.c create mode 100644 Thirdparty/stb/tests/stb.dsp create mode 100644 Thirdparty/stb/tests/stb.dsw create mode 100644 Thirdparty/stb/tests/stb_c_lexer_fuzzer.cpp create mode 100644 Thirdparty/stb/tests/stb_cpp.cpp create mode 100644 Thirdparty/stb/tests/stb_cpp.dsp create mode 100644 Thirdparty/stb/tests/stb_png.dict create mode 100644 Thirdparty/stb/tests/stb_static.c create mode 100644 Thirdparty/stb/tests/stbi_read_fuzzer.c create mode 100644 Thirdparty/stb/tests/stblib.dsp create mode 100644 Thirdparty/stb/tests/stblib_test.c create mode 100644 Thirdparty/stb/tests/stblib_test_companion.c create mode 100644 Thirdparty/stb/tests/stretch_test.dsp create mode 100644 Thirdparty/stb/tests/test.sbm create mode 100644 Thirdparty/stb/tests/test_c_compilation.c create mode 100644 Thirdparty/stb/tests/test_c_lexer.c create mode 100644 Thirdparty/stb/tests/test_cpp_compilation.cpp create mode 100644 Thirdparty/stb/tests/test_ds.c create mode 100644 Thirdparty/stb/tests/test_ds_cpp.cpp create mode 100644 Thirdparty/stb/tests/test_dxt.c create mode 100644 Thirdparty/stb/tests/test_easyfont.c create mode 100644 Thirdparty/stb/tests/test_image.c create mode 100644 Thirdparty/stb/tests/test_image_write.c create mode 100644 Thirdparty/stb/tests/test_perlin.c create mode 100644 Thirdparty/stb/tests/test_siphash.c create mode 100644 Thirdparty/stb/tests/test_sprintf.c create mode 100644 Thirdparty/stb/tests/test_truetype.c create mode 100644 Thirdparty/stb/tests/test_vorbis.c create mode 100644 Thirdparty/stb/tests/test_voxel.c create mode 100644 Thirdparty/stb/tests/textedit_sample.c create mode 100644 Thirdparty/stb/tests/tilemap_editor_integration_example.c create mode 100644 Thirdparty/stb/tests/truetype_test_win32.c create mode 100644 Thirdparty/stb/tests/vorbseek/vorbseek.c create mode 100644 Thirdparty/stb/tests/vorbseek/vorbseek.dsp create mode 100644 Thirdparty/stb/tools/README.footer.md create mode 100644 Thirdparty/stb/tools/README.header.md create mode 100644 Thirdparty/stb/tools/README.list create mode 100644 Thirdparty/stb/tools/build_matrix.c create mode 100644 Thirdparty/stb/tools/easy_font_maker.c create mode 100644 Thirdparty/stb/tools/make_readme.c create mode 100644 Thirdparty/stb/tools/make_readme.dsp create mode 100644 Thirdparty/stb/tools/mr.bat create mode 100644 Thirdparty/stb/tools/trailing_whitespace.c create mode 100644 Thirdparty/stb/tools/unicode.c create mode 100644 Thirdparty/stb/tools/unicode/unicode.dsp create mode 100644 src/Application/Application.cpp create mode 100644 src/Application/Application.h create mode 100644 src/CMakeLists.txt create mode 100644 src/Core/Constant.cpp create mode 100644 src/Core/Constant.h create mode 100644 src/Core/Core.h create mode 100644 src/Core/CriticalSection.cpp create mode 100644 src/Core/CriticalSection.h create mode 100644 src/Core/Logger.cpp create mode 100644 src/Core/Logger.h create mode 100644 src/Core/Mesh.cpp create mode 100644 src/Core/Mesh.h create mode 100644 src/Core/Object/Object.cpp create mode 100644 src/Core/Object/Object.h create mode 100644 src/Core/Object/SharedPtr.h create mode 100644 src/Core/Object/WeakPtr.cpp create mode 100644 src/Core/Object/WeakPtr.h create mode 100644 src/Core/ScopeLock.h create mode 100644 src/Core/Singleton.h create mode 100644 src/Core/SpinLock.h create mode 100644 src/Core/StbImage.cpp create mode 100644 src/Core/StringUtil.cpp create mode 100644 src/Core/StringUtil.h create mode 100644 src/Core/Thread/ThreadChecker.cpp create mode 100644 src/Core/Thread/ThreadChecker.h create mode 100644 src/HumanRender.manifest create mode 100644 src/Platforms/Windows/Main.cpp create mode 100644 src/RHI/DriverSettings.h create mode 100644 src/RHI/IRHIAPI.h create mode 100644 src/RHI/OpenglDrv/GLDrvAPI.cpp create mode 100644 src/RHI/OpenglDrv/GLDrvAPI.h create mode 100644 src/RHI/OpenglDrv/GLHandleMapper.cpp create mode 100644 src/RHI/OpenglDrv/GLHandleMapper.h create mode 100644 src/RHI/OpenglDrv/GLRHICommond.cpp create mode 100644 src/RHI/OpenglDrv/GLRHICommond.h create mode 100644 src/RHI/OpenglDrv/GLShader.cpp create mode 100644 src/RHI/OpenglDrv/GLShader.h create mode 100644 src/RHI/RHI.cpp create mode 100644 src/RHI/RHI.h create mode 100644 src/RHI/RHICommond.cpp create mode 100644 src/RHI/RHICommond.h create mode 100644 src/RHI/RHICommondList.cpp create mode 100644 src/RHI/RHICommondList.h create mode 100644 src/Window/GLFWImpl/GLFWImpl.cpp create mode 100644 src/Window/GLFWImpl/GLFWImpl.h create mode 100644 src/Window/Window.cpp create mode 100644 src/Window/Window.h create mode 100644 src/Window/WindowImpl.h create mode 100644 src/Window/WindowSettings.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f4a83c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +build/ +bin/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9593f38 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.21) + +PROJECT(HunanRender) +SET(CMAKE_CXX_STANDARD 17) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) +SET(CMAKE_CXX_EXTENSIONS OFF) + + +MACRO(SOURCE_GROUP_BY_DIR SOURCE_FILES) + IF(MSVC) + set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR}) + foreach(sgbd_file ${${SOURCE_FILES}}) + string(REGEX REPLACE ${sgbd_cur_dir}/\(.*\) \\1 sgbd_fpath ${sgbd_file}) + string(REGEX REPLACE "\(.*\)/.*" \\1 sgbd_group_name ${sgbd_fpath}) + string(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup) + string(REPLACE "/" "\\" sgbd_group_name ${sgbd_group_name}) + if(sgbd_nogroup) + set(sgbd_group_name "\\") + endif(sgbd_nogroup) + source_group(${sgbd_group_name} FILES ${sgbd_file}) + endforeach(sgbd_file) + ENDIF(MSVC) +ENDMACRO(SOURCE_GROUP_BY_DIR) + +SET(Thirdparty ${CMAKE_CURRENT_SOURCE_DIR}/Thirdparty) +SET(ProjectDIR ${CMAKE_CURRENT_SOURCE_DIR}) + +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") +SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") +SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO") + +ADD_SUBDIRECTORY(Src) diff --git a/Thirdparty/SDL2/BUGS.txt b/Thirdparty/SDL2/BUGS.txt new file mode 100644 index 0000000..b1463e7 --- /dev/null +++ b/Thirdparty/SDL2/BUGS.txt @@ -0,0 +1,16 @@ + +Bugs are now managed in the SDL issue tracker, here: + + https://github.com/libsdl-org/SDL/issues + +You may report bugs there, and search to see if a given issue has already + been reported, discussed, and maybe even fixed. + + +You may also find help at the SDL forums/mailing list: + + https://discourse.libsdl.org/ + +Bug reports are welcome here, but we really appreciate if you use the issue + tracker, as bugs discussed on the mailing list may be forgotten or missed. + diff --git a/Thirdparty/SDL2/COPYING.txt b/Thirdparty/SDL2/COPYING.txt new file mode 100644 index 0000000..0e2bef3 --- /dev/null +++ b/Thirdparty/SDL2/COPYING.txt @@ -0,0 +1,20 @@ + +Simple DirectMedia Layer +Copyright (C) 1997-2020 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/Thirdparty/SDL2/README-SDL.txt b/Thirdparty/SDL2/README-SDL.txt new file mode 100644 index 0000000..8d92955 --- /dev/null +++ b/Thirdparty/SDL2/README-SDL.txt @@ -0,0 +1,13 @@ + +Please distribute this file with the SDL runtime environment: + +The Simple DirectMedia Layer (SDL for short) is a cross-platform library +designed to make it easy to write multi-media software, such as games +and emulators. + +The Simple DirectMedia Layer library source code is available from: +https://www.libsdl.org/ + +This library is distributed under the terms of the zlib license: +http://www.zlib.net/zlib_license.html + diff --git a/Thirdparty/SDL2/README.txt b/Thirdparty/SDL2/README.txt new file mode 100644 index 0000000..431ba0e --- /dev/null +++ b/Thirdparty/SDL2/README.txt @@ -0,0 +1,21 @@ + + Simple DirectMedia Layer + + (SDL) + + Version 2.0 + +--- +https://www.libsdl.org/ + +Simple DirectMedia Layer is a cross-platform development library designed +to provide low level access to audio, keyboard, mouse, joystick, and graphics +hardware via OpenGL and Direct3D. It is used by video playback software, +emulators, and popular games including Valve's award winning catalog +and many Humble Bundle games. + +More extensive documentation is available in the docs directory, starting +with README.md + +Enjoy! + Sam Lantinga (slouken@libsdl.org) diff --git a/Thirdparty/SDL2/WhatsNew.txt b/Thirdparty/SDL2/WhatsNew.txt new file mode 100644 index 0000000..28f60c9 --- /dev/null +++ b/Thirdparty/SDL2/WhatsNew.txt @@ -0,0 +1,870 @@ + +This is a list of major changes in SDL's version history. + +--------------------------------------------------------------------------- +2.28.2: +--------------------------------------------------------------------------- +General: +* Added the hint SDL_HINT_JOYSTICK_WGI to control whether to use Windows.Gaming.Input for controllers + + +--------------------------------------------------------------------------- +2.28.0: +--------------------------------------------------------------------------- + +General: +* Added SDL_HasWindowSurface() and SDL_DestroyWindowSurface() to switch between the window surface and rendering APIs +* Added a display event SDL_DISPLAYEVENT_MOVED which is sent when the primary monitor changes or displays change position relative to each other +* Added the hint SDL_HINT_ENABLE_SCREEN_KEYBOARD to control whether the on-screen keyboard should be shown when text input is active + + +--------------------------------------------------------------------------- +2.26.0: +--------------------------------------------------------------------------- + +General: +* Updated OpenGL headers to the latest API from The Khronos Group Inc. +* Added SDL_GetWindowSizeInPixels() to get the window size in pixels, which may differ from the window coordinate size for windows with high-DPI support +* Added simulated vsync synchronization for the software renderer +* Added the mouse position to SDL_MouseWheelEvent +* Added SDL_ResetHints() to reset all hints to their default values +* Added SDL_GetJoystickGUIDInfo() to get device information encoded in a joystick GUID +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 to control whether the HIDAPI driver for XBox 360 controllers should be used +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED to control whether the player LEDs should be lit to indicate which player is associated with an Xbox 360 controller +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS to control whether the HIDAPI driver for XBox 360 wireless controllers should be used +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE to control whether the HIDAPI driver for XBox One controllers should be used +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED to control the brightness of the XBox One guide button LED +* Added support for PS3 controllers to the HIDAPI driver, enabled by default on macOS, controlled by the SDL_HINT_JOYSTICK_HIDAPI_PS3 hint +* Added support for Nintendo Wii controllers to the HIDAPI driver, not enabled by default, controlled by the SDL_HINT_JOYSTICK_HIDAPI_WII hint +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED to control whether the player LED should be lit on the Nintendo Wii controllers +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS to control whether Nintendo Switch Joy-Con controllers will be in vertical mode when using the HIDAPI driver +* Added access to the individual left and right gyro sensors of the combined Joy-Cons controller +* Added a microsecond timestamp to SDL_SensorEvent and SDL_ControllerSensorEvent, when the hardware provides that information +* Added SDL_SensorGetDataWithTimestamp() and SDL_GameControllerGetSensorDataWithTimestamp() to retrieve the last sensor data with the associated microsecond timestamp +* Added the hint SDL_HINT_HIDAPI_IGNORE_DEVICES to have the SDL HID API ignore specific devices +* SDL_GetRevision() now includes more information about the SDL build, including the git commit hash if available + +Windows: +* Added the hint SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE to control whether the system mouse acceleration curve is used for relative mouse motion + +macOS: +* Implemented vsync synchronization on macOS 12 + +Linux: +* Added SDL_SetPrimarySelectionText(), SDL_GetPrimarySelectionText(), and SDL_HasPrimarySelectionText() to interact with the X11 primary selection clipboard +* Added the hint SDL_HINT_VIDEO_WAYLAND_EMULATE_MOUSE_WARP to control whether mouse pointer warp emulation is enabled under Wayland + +Android: +* Enabled IME soft keyboard input +* Added version checking to make sure the SDL Java and C code are compatible + + +--------------------------------------------------------------------------- +2.24.0: +--------------------------------------------------------------------------- + +General: +* New version numbering scheme, similar to GLib and Flatpak. + * An even number in the minor version (second component) indicates a production-ready stable release such as 2.24.0, which would have been 2.0.24 under the old system. + * The patchlevel (micro version, third component) indicates a bugfix-only update: for example, 2.24.1 would be a bugfix-only release to fix bugs in 2.24.0, without adding new features. + * An odd number in the minor version indicates a prerelease such as 2.23.0. Stable distributions should not use these prereleases. + * The patchlevel indicates successive prereleases, for example 2.23.1 and 2.23.2 would be prereleases during development of the SDL 2.24.0 stable release. +* Added SDL_GetPointDisplayIndex() and SDL_GetRectDisplayIndex() to get the display associated with a point and rectangle in screen space +* Added SDL_bsearch(), SDL_crc16(), and SDL_utf8strnlen() to the stdlib routines +* Added SDL_CPUPauseInstruction() as a macro in SDL_atomic.h +* Added SDL_size_mul_overflow() and SDL_size_add_overflow() for better size overflow protection +* Added SDL_ResetHint() to reset a hint to the default value +* Added SDL_ResetKeyboard() to reset SDL's internal keyboard state, generating key up events for all currently pressed keys +* Added the hint SDL_HINT_MOUSE_RELATIVE_WARP_MOTION to control whether mouse warping generates motion events in relative mode. This hint defaults off. +* Added the hint SDL_HINT_TRACKPAD_IS_TOUCH_ONLY to control whether trackpads are treated as touch devices or mice. By default touchpads are treated as mouse input. +* The hint SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS now defaults on +* Added support for mini-gamepad mode for Nintendo Joy-Con controllers using the HIDAPI driver +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS to control whether Joy-Con controllers are automatically merged into a unified gamepad when using the HIDAPI driver. This hint defaults on. +* The hint SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED can be set to a floating point value to set the brightness of the Home LED on Nintendo Switch controllers +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED to set the Home LED brightness for the Nintendo Joy-Con controllers. By default the Home LED is not modified. +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED to control whether the player LED should be lit on the Nintendo Joy-Con controllers +* Added support for Nintendo Online classic controllers using the HIDAPI driver +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC to control whether the HIDAPI driver for Nintendo Online classic controllers should be used +* Added support for the NVIDIA Shield Controller to the HIDAPI driver, supporting rumble and battery status +* Added support for NVIDIA SHIELD controller to the HIDAPI driver, and a hint SDL_HINT_JOYSTICK_HIDAPI_SHIELD to control whether this is used +* Added functions to get the platform dependent name for a joystick or game controller: + * SDL_JoystickPathForIndex() + * SDL_JoystickPath() + * SDL_GameControllerPathForIndex() + * SDL_GameControllerPath() +* Added SDL_GameControllerGetFirmwareVersion() and SDL_JoystickGetFirmwareVersion(), currently implemented for DualSense(tm) Wireless Controllers using HIDAPI +* Added SDL_JoystickAttachVirtualEx() for extended virtual controller support +* Added joystick event SDL_JOYBATTERYUPDATED for when battery status changes +* Added SDL_GUIDToString() and SDL_GUIDFromString() to convert between SDL GUID and string +* Added SDL_HasLSX() and SDL_HasLASX() to detect LoongArch SIMD support +* Added SDL_GetOriginalMemoryFunctions() +* Added SDL_GetDefaultAudioInfo() to get the name and format of the default audio device, currently implemented for PipeWire, PulseAudio, WASAPI, and DirectSound +* Added HIDAPI driver for the NVIDIA SHIELD controller (2017 model) to enable support for battery status and rumble +* Added support for opening audio devices with 3 or 5 channels (2.1, 4.1). All channel counts from Mono to 7.1 are now supported. +* Rewrote audio channel converters used by SDL_AudioCVT, based on the channel matrix coefficients used as the default for FAudio voices +* SDL log messages are no longer limited to 4K and can be any length +* Fixed a long-standing calling convention issue with dynapi affecting OpenWatcom or OS/2 builds + +Windows: +* Added initial support for building for Windows and Xbox with Microsoft's Game Development Kit (GDK), see docs/README-gdk.md for details +* Added a D3D12 renderer implementation and SDL_RenderGetD3D12Device() to retrieve the D3D12 device associated with it +* Added the hint SDL_HINT_WINDOWS_DPI_AWARENESS to set whether the application is DPI-aware. This hint must be set before initializing the video subsystem +* Added the hint SDL_HINT_WINDOWS_DPI_SCALING to control whether the SDL coordinates are in DPI-scaled points or pixels +* Added the hint SDL_HINT_DIRECTINPUT_ENABLED to control whether the DirectInput driver should be used +* Added support for SDL_GetAudioDeviceSpec to the DirectSound backend + +Linux: +* Support for XVidMode has been removed, mode changes are only supported using the XRandR extension +* Added the hint SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION to control whether to expose a set of emulated modes in addition to the native resolution modes available on Wayland +* Added the hint SDL_HINT_KMSDRM_DEVICE_INDEX to specify which KMSDRM device to use if the default is not desired +* Added the hint SDL_HINT_LINUX_DIGITAL_HATS to control whether to treat hats as digital rather than checking to see if they may be analog +* Added the hint SDL_HINT_LINUX_HAT_DEADZONES to control whether to use deadzones on analog hats + +macOS: +* Bumped minimum OS deployment version to macOS 10.9 +* Added SDL_GL_FLOATBUFFERS to allow Cocoa GL contexts to use EDR +* Added the hint SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH to control whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing. This hint defaults to blocking, which is the safer option on modern macOS. + + +--------------------------------------------------------------------------- +2.0.22: +--------------------------------------------------------------------------- + +General: +* Added SDL_RenderGetWindow() to get the window associated with a renderer +* Added floating point rectangle functions: + * SDL_PointInFRect() + * SDL_FRectEmpty() + * SDL_FRectEquals() + * SDL_FRectEqualsEpsilon() + * SDL_HasIntersectionF() + * SDL_IntersectFRect() + * SDL_UnionFRect() + * SDL_EncloseFPoints() + * SDL_IntersectFRectAndLine() +* Added SDL_IsTextInputShown() which returns whether the IME window is currently shown +* Added SDL_ClearComposition() to dismiss the composition window without disabling IME input +* Added SDL_TEXTEDITING_EXT event for handling long composition text, and a hint SDL_HINT_IME_SUPPORT_EXTENDED_TEXT to enable it +* Added the hint SDL_HINT_MOUSE_RELATIVE_MODE_CENTER to control whether the mouse should be constrained to the whole window or the center of the window when relative mode is enabled +* The mouse is now automatically captured when mouse buttons are pressed, and the hint SDL_HINT_MOUSE_AUTO_CAPTURE allows you to control this behavior +* Added the hint SDL_HINT_VIDEO_FOREIGN_WINDOW_OPENGL to let SDL know that a foreign window will be used with OpenGL +* Added the hint SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN to let SDL know that a foreign window will be used with Vulkan +* Added the hint SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE to specify whether an SDL_QUIT event will be delivered when the last application window is closed +* Added the hint SDL_HINT_JOYSTICK_ROG_CHAKRAM to control whether ROG Chakram mice show up as joysticks + +Windows: +* Added support for SDL_BLENDOPERATION_MINIMUM and SDL_BLENDOPERATION_MAXIMUM to the D3D9 renderer + +Linux: +* Compiling with Wayland support requires libwayland-client version 1.18.0 or later +* Added the hint SDL_HINT_X11_WINDOW_TYPE to specify the _NET_WM_WINDOW_TYPE of SDL windows +* Added the hint SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR to allow using libdecor with compositors that support xdg-decoration + +Android: +* Added SDL_AndroidSendMessage() to send a custom command to the SDL java activity + + +--------------------------------------------------------------------------- +2.0.20: +--------------------------------------------------------------------------- + +General: +* SDL_RenderGeometryRaw() takes a pointer to SDL_Color, not int. You can cast color data in SDL_PIXELFORMAT_RGBA32 format (SDL_PIXELFORMAT_ABGR8888 on little endian systems) for this parameter. +* Improved accuracy of horizontal and vertical line drawing when using OpenGL or OpenGLES +* Added the hint SDL_HINT_RENDER_LINE_METHOD to control the method of line drawing used, to select speed, correctness, and compatibility. + +Windows: +* Fixed size of custom cursors + +Linux: +* Fixed hotplug controller detection, broken in 2.0.18 + + +--------------------------------------------------------------------------- +2.0.18: +--------------------------------------------------------------------------- + +General: +* The SDL wiki documentation and development headers are automatically kept in sync +* Each function has information about in which version of SDL it was introduced +* SDL-specific CMake options are now prefixed with 'SDL_'. Be sure to update your CMake build scripts accordingly! +* Added the hint SDL_HINT_APP_NAME to let SDL know the name of your application for various places it might show up in system information +* Added SDL_RenderGeometry() and SDL_RenderGeometryRaw() to allow rendering of arbitrary shapes using the SDL 2D render API +* Added SDL_SetTextureUserData() and SDL_GetTextureUserData() to associate application data with an SDL texture +* Added SDL_RenderWindowToLogical() and SDL_RenderLogicalToWindow() to convert between window coordinates and logical render coordinates +* Added SDL_RenderSetVSync() to change whether a renderer present is synchronized with vblank at runtime +* Added SDL_PremultiplyAlpha() to premultiply alpha on a block of SDL_PIXELFORMAT_ARGB8888 pixels +* Added a window event SDL_WINDOWEVENT_DISPLAY_CHANGED which is sent when a window changes what display it's centered on +* Added SDL_GetWindowICCProfile() to query a window's ICC profile, and a window event SDL_WINDOWEVENT_ICCPROF_CHANGED that is sent when it changes +* Added the hint SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY to allow EGL windows to be transparent instead of opaque +* SDL_WaitEvent() has been redesigned to use less CPU in most cases +* Added SDL_SetWindowMouseRect() and SDL_GetWindowMouseRect() to confine the mouse cursor to an area of a window +* You can now read precise mouse wheel motion using 'preciseX' and 'preciseY' event fields +* Added SDL_GameControllerHasRumble() and SDL_GameControllerHasRumbleTriggers() to query whether a game controller supports rumble +* Added SDL_JoystickHasRumble() and SDL_JoystickHasRumbleTriggers() to query whether a joystick supports rumble +* SDL's hidapi implementation is now available as a public API in SDL_hidapi.h + +Windows: +* Improved relative mouse motion over Windows Remote Desktop +* Added the hint SDL_HINT_IME_SHOW_UI to show native UI components instead of hiding them (defaults off) + +Windows/UWP: +* WGI is used instead of XInput for better controller support in UWP apps + +Linux: +* Added the hint SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME to set the activity that's displayed by the system when the screensaver is disabled +* Added the hint SDL_HINT_LINUX_JOYSTICK_CLASSIC to control whether /dev/input/js* or /dev/input/event* are used as joystick devices +* Added the hint SDL_HINT_JOYSTICK_DEVICE to allow the user to specify devices that will be opened in addition to the normal joystick detection +* Added SDL_LinuxSetThreadPriorityAndPolicy() for more control over a thread priority on Linux + +Android: +* Added support for audio output and capture using AAudio on Android 8.1 and newer +* Steam Controller support is disabled by default, and can be enabled by setting the hint SDL_HINT_JOYSTICK_HIDAPI_STEAM to "1" before calling SDL_Init() + +Apple Arcade: +* Added SDL_GameControllerGetAppleSFSymbolsNameForButton() and SDL_GameControllerGetAppleSFSymbolsNameForAxis() to support Apple Arcade titles + +iOS: +* Added documentation that the UIApplicationSupportsIndirectInputEvents key must be set to true in your application's Info.plist in order to get real Bluetooth mouse events. +* Steam Controller support is disabled by default, and can be enabled by setting the hint SDL_HINT_JOYSTICK_HIDAPI_STEAM to "1" before calling SDL_Init() + + +--------------------------------------------------------------------------- +2.0.16: +--------------------------------------------------------------------------- +General: +* Added SDL_FlashWindow() to get a user's attention +* Added SDL_GetAudioDeviceSpec() to get the preferred audio format of a device +* Added SDL_SetWindowAlwaysOnTop() to dynamically change the SDL_WINDOW_ALWAYS_ON_TOP flag for a window +* Added SDL_SetWindowKeyboardGrab() to support grabbing the keyboard independently of the mouse +* Added SDL_SoftStretchLinear() to do bilinear scaling between 32-bit software surfaces +* Added SDL_UpdateNVTexture() to update streaming NV12/21 textures +* Added SDL_GameControllerSendEffect() and SDL_JoystickSendEffect() to allow sending custom trigger effects to the DualSense controller +* Added SDL_GameControllerGetSensorDataRate() to get the sensor data rate for PlayStation and Nintendo Switch controllers +* Added support for the Amazon Luna game controller +* Added rumble support for the Google Stadia controller using the HIDAPI driver +* Added SDL_GameControllerType constants for the Amazon Luna and Google Stadia controllers +* Added analog rumble for Nintendo Switch Pro controllers using the HIDAPI driver +* Reduced CPU usage when using SDL_WaitEvent() and SDL_WaitEventTimeout() + +Windows: +* Added SDL_SetWindowsMessageHook() to set a function that is called for all Windows messages +* Added SDL_RenderGetD3D11Device() to get the D3D11 device used by the SDL renderer + +Linux: +* Greatly improved Wayland support +* Added support for audio output and capture using Pipewire +* Added the hint SDL_HINT_AUDIO_INCLUDE_MONITORS to control whether PulseAudio recording should include monitor devices +* Added the hint SDL_HINT_AUDIO_DEVICE_STREAM_ROLE to describe the role of your application for audio control panels + +Android: +* Added SDL_AndroidShowToast() to show a lightweight notification + +iOS: +* Added support for mouse relative mode on iOS 14.1 and newer +* Added support for the Xbox Series X controller + +tvOS: +* Added support for the Xbox Series X controller + + +--------------------------------------------------------------------------- +2.0.14: +--------------------------------------------------------------------------- +General: +* Added support for PS5 DualSense and Xbox Series X controllers to the HIDAPI controller driver +* Added game controller button constants for paddles and new buttons +* Added game controller functions to get additional information: + * SDL_GameControllerGetSerial() + * SDL_GameControllerHasAxis() + * SDL_GameControllerHasButton() + * SDL_GameControllerGetNumTouchpads() + * SDL_GameControllerGetNumTouchpadFingers() + * SDL_GameControllerGetTouchpadFinger() + * SDL_GameControllerHasSensor() + * SDL_GameControllerSetSensorEnabled() + * SDL_GameControllerIsSensorEnabled() + * SDL_GameControllerGetSensorData() + * SDL_GameControllerRumbleTriggers() + * SDL_GameControllerHasLED() + * SDL_GameControllerSetLED() +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_PS5 to control whether the HIDAPI driver for PS5 controllers should be used. +* Added joystick functions to get additional information: + * SDL_JoystickGetSerial() + * SDL_JoystickRumbleTriggers() + * SDL_JoystickHasLED() + * SDL_JoystickSetLED() +* Added an API to allow the application to create virtual joysticks: + * SDL_JoystickAttachVirtual() + * SDL_JoystickDetachVirtual() + * SDL_JoystickIsVirtual() + * SDL_JoystickSetVirtualAxis() + * SDL_JoystickSetVirtualButton() + * SDL_JoystickSetVirtualHat() +* Added SDL_LockSensors() and SDL_UnlockSensors() to guarantee exclusive access to the sensor list +* Added SDL_HAPTIC_STEERING_AXIS to play an effect on the steering wheel +* Added the hint SDL_HINT_MOUSE_RELATIVE_SCALING to control whether relative motion is scaled by the screen DPI or renderer logical size +* The default value for SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS is now false for better compatibility with modern window managers +* Added SDL_GetPreferredLocales() to get the application's current locale setting +* Added the hint SDL_HINT_PREFERRED_LOCALES to override your application's default locale setting +* Added SDL_OpenURL() to open a URL in the system's default browser +* Added SDL_HasSurfaceRLE() to tell whether a surface is currently using RLE encoding +* Added SDL_SIMDRealloc() to reallocate memory obtained from SDL_SIMDAlloc() +* Added SDL_GetErrorMsg() to get the last error in a thread-safe way +* Added SDL_crc32(), SDL_wcscasecmp(), SDL_wcsncasecmp(), SDL_trunc(), SDL_truncf() +* Added clearer names for RGB pixel formats, e.g. SDL_PIXELFORMAT_XRGB8888, SDL_PIXELFORMAT_XBGR8888, etc. + +Windows: +* Added the RAWINPUT controller driver to support more than 4 Xbox controllers simultaneously +* Added the hint SDL_HINT_JOYSTICK_RAWINPUT to control whether the RAWINPUT driver should be used +* Added the hint SDL_HINT_JOYSTICK_HIDAPI_CORRELATE_XINPUT to control whether XInput and WGI should be used to for complete controller functionality with the RAWINPUT driver. + +macOS: +* Added the SDL_WINDOW_METAL flag to specify that a window should be created with a Metal view +* Added SDL_Metal_GetLayer() to get the CAMetalLayer backing a Metal view +* Added SDL_Metal_GetDrawableSize() to get the size of a window's drawable, in pixels + +Linux: +* Added the hint SDL_HINT_AUDIO_DEVICE_APP_NAME to specify the name that shows up in PulseAudio for your application +* Added the hint SDL_HINT_AUDIO_DEVICE_STREAM_NAME to specify the name that shows up in PulseAudio associated with your audio stream +* Added the hint SDL_HINT_LINUX_JOYSTICK_DEADZONES to control whether HID defined dead zones should be respected on Linux +* Added the hint SDL_HINT_THREAD_PRIORITY_POLICY to specify the thread scheduler policy +* Added the hint SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL to allow time critical threads to use a realtime scheduling policy + +Android: +* Added SDL_AndroidRequestPermission() to request a specific system permission +* Added the hint SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO to control whether audio will pause when the application goes intot he background + +OS/2: +* Added support for OS/2, see docs/README-os2.md for details + +Emscripten (running in a web browser): +* Added the hint SDL_HINT_EMSCRIPTEN_ASYNCIFY to control whether SDL should call emscripten_sleep internally + + +--------------------------------------------------------------------------- +2.0.12: +--------------------------------------------------------------------------- + +General: +* Added SDL_GetTextureScaleMode() and SDL_SetTextureScaleMode() to get and set the scaling mode used for a texture +* Added SDL_LockTextureToSurface(), similar to SDL_LockTexture() but the locked area is exposed as a SDL surface. +* Added new blend mode, SDL_BLENDMODE_MUL, which does a modulate and blend operation +* Added the hint SDL_HINT_DISPLAY_USABLE_BOUNDS to override the results of SDL_GetDisplayUsableBounds() for display index 0. +* Added the window underneath the finger to the SDL_TouchFingerEvent +* Added SDL_GameControllerTypeForIndex(), SDL_GameControllerGetType() to return the type of a game controller (Xbox 360, Xbox One, PS3, PS4, or Nintendo Switch Pro) +* Added the hint SDL_HINT_GAMECONTROLLERTYPE to override the automatic game controller type detection +* Added SDL_JoystickFromPlayerIndex() and SDL_GameControllerFromPlayerIndex() to get the device associated with a player index +* Added SDL_JoystickSetPlayerIndex() and SDL_GameControllerSetPlayerIndex() to set the player index associated with a device +* Added the hint SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS to specify whether Nintendo Switch Pro controllers should use the buttons as labeled or swapped to match positional layout. The default is to use the buttons as labeled. +* Added support for Nintendo GameCube controllers to the HIDAPI driver, and a hint SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE to control whether this is used. +* Improved support for Xbox 360 and Xbox One controllers when using the HIDAPI driver +* Added support for many game controllers, including: + * 8BitDo FC30 Pro + * 8BitDo M30 GamePad + * BDA PS4 Fightpad + * HORI Fighting Commander + * Hyperkin Duke + * Hyperkin X91 + * MOGA XP5-A Plus + * NACON GC-400ES + * NVIDIA Controller v01.04 + * PDP Versus Fighting Pad + * Razer Raion Fightpad for PS4 + * Razer Serval + * Stadia Controller + * SteelSeries Stratus Duo + * Victrix Pro Fight Stick for PS4 + * Xbox One Elite Series 2 +* Fixed blocking game controller rumble calls when using the HIDAPI driver +* Added SDL_zeroa() macro to zero an array of elements +* Added SDL_HasARMSIMD() which returns true if the CPU has ARM SIMD (ARMv6+) features + +Windows: +* Fixed crash when using the release SDL DLL with applications built with gcc +* Fixed performance regression in event handling introduced in 2.0.10 +* Added support for SDL_SetThreadPriority() for UWP applications + +Linux: +* Added the hint SDL_HINT_VIDEO_X11_WINDOW_VISUALID to specify the visual chosen for new X11 windows +* Added the hint SDL_HINT_VIDEO_X11_FORCE_EGL to specify whether X11 should use GLX or EGL by default + +iOS / tvOS / macOS: +* Added SDL_Metal_CreateView() and SDL_Metal_DestroyView() to create CAMetalLayer-backed NSView/UIView and attach it to the specified window. + +iOS/ tvOS: +* Added support for Bluetooth Steam Controllers as game controllers + +tvOS: +* Fixed support for surround sound on Apple TV + +Android: +* Added SDL_GetAndroidSDKVersion() to return the API level of the current device +* Added support for audio capture using OpenSL-ES +* Added support for Bluetooth Steam Controllers as game controllers +* Fixed rare crashes when the app goes into the background or terminates + + +--------------------------------------------------------------------------- +2.0.10: +--------------------------------------------------------------------------- + +General: +* The SDL_RW* macros have been turned into functions that are available only in 2.0.10 and onward +* Added SDL_SIMDGetAlignment(), SDL_SIMDAlloc(), and SDL_SIMDFree(), to allocate memory aligned for SIMD operations for the current CPU +* Added SDL_RenderDrawPointF(), SDL_RenderDrawPointsF(), SDL_RenderDrawLineF(), SDL_RenderDrawLinesF(), SDL_RenderDrawRectF(), SDL_RenderDrawRectsF(), SDL_RenderFillRectF(), SDL_RenderFillRectsF(), SDL_RenderCopyF(), SDL_RenderCopyExF(), to allow floating point precision in the SDL rendering API. +* Added SDL_GetTouchDeviceType() to get the type of a touch device, which can be a touch screen or a trackpad in relative or absolute coordinate mode. +* The SDL rendering API now uses batched rendering by default, for improved performance +* Added SDL_RenderFlush() to force batched render commands to execute, if you're going to mix SDL rendering with native rendering +* Added the hint SDL_HINT_RENDER_BATCHING to control whether batching should be used for the rendering API. This defaults to "1" if you don't specify what rendering driver to use when creating the renderer. +* Added the hint SDL_HINT_EVENT_LOGGING to enable logging of SDL events for debugging purposes +* Added the hint SDL_HINT_GAMECONTROLLERCONFIG_FILE to specify a file that will be loaded at joystick initialization with game controller bindings +* Added the hint SDL_HINT_MOUSE_TOUCH_EVENTS to control whether SDL will synthesize touch events from mouse events +* Improved handling of malformed WAVE and BMP files, fixing potential security exploits + +Linux: +* Removed the Mir video driver in favor of Wayland + +iOS / tvOS: +* Added support for Xbox and PS4 wireless controllers in iOS 13 and tvOS 13 +* Added support for text input using Bluetooth keyboards + +Android: +* Added low latency audio using OpenSL ES +* Removed SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH (replaced by SDL_HINT_MOUSE_TOUCH_EVENTS and SDL_HINT_TOUCH_MOUSE_EVENTS) + SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH=1, should be replaced by setting both previous hints to 0. + SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH=0, should be replaced by setting both previous hints to 1. +* Added the hint SDL_HINT_ANDROID_BLOCK_ON_PAUSE to set whether the event loop will block itself when the app is paused. + + +--------------------------------------------------------------------------- +2.0.9: +--------------------------------------------------------------------------- + +General: +* Added a new sensor API, initialized by passing SDL_INIT_SENSOR to SDL_Init(), and defined in SDL_sensor.h +* Added an event SDL_SENSORUPDATE which is sent when a sensor is updated +* Added SDL_GetDisplayOrientation() to return the current display orientation +* Added an event SDL_DISPLAYEVENT which is sent when the display orientation changes +* Added HIDAPI joystick drivers for more consistent support for Xbox, PS4 and Nintendo Switch Pro controller support across platforms. (Thanks to Valve for contributing the PS4 and Nintendo Switch Pro controller support) +* Added support for many other popular game controllers +* Added SDL_JoystickGetDevicePlayerIndex(), SDL_JoystickGetPlayerIndex(), and SDL_GameControllerGetPlayerIndex() to get the player index for a controller. For XInput controllers this returns the XInput index for the controller. +* Added SDL_GameControllerRumble() and SDL_JoystickRumble() which allow simple rumble without using the haptics API +* Added SDL_GameControllerMappingForDeviceIndex() to get the mapping for a controller before it's opened +* Added the hint SDL_HINT_MOUSE_DOUBLE_CLICK_TIME to control the mouse double-click time +* Added the hint SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS to control the mouse double-click radius, in pixels +* Added SDL_HasColorKey() to return whether a surface has a colorkey active +* Added SDL_HasAVX512F() to return whether the CPU has AVX-512F features +* Added SDL_IsTablet() to return whether the application is running on a tablet +* Added SDL_THREAD_PRIORITY_TIME_CRITICAL for threads that must run at the highest priority + +Mac OS X: +* Fixed black screen at start on Mac OS X Mojave + +Linux: +* Added SDL_LinuxSetThreadPriority() to allow adjusting the thread priority of native threads using RealtimeKit if available. + +iOS: +* Fixed Asian IME input + +Android: +* Updated required Android SDK to API 26, to match Google's new App Store requirements +* Added support for wired USB Xbox, PS4, and Nintendo Switch Pro controllers +* Added support for relative mouse mode on Android 7.0 and newer (except where it's broken, on Chromebooks and when in DeX mode with Samsung Experience 9.0) +* Added support for custom mouse cursors on Android 7.0 and newer +* Added the hint SDL_HINT_ANDROID_TRAP_BACK_BUTTON to control whether the back button will back out of the app (the default) or be passed to the application as SDL_SCANCODE_AC_BACK +* Added SDL_AndroidBackButton() to trigger the Android system back button behavior when handling the back button in the application +* Added SDL_IsChromebook() to return whether the app is running in the Chromebook Android runtime +* Added SDL_IsDeXMode() to return whether the app is running while docked in the Samsung DeX + + +--------------------------------------------------------------------------- +2.0.8: +--------------------------------------------------------------------------- + +General: +* Added SDL_fmod() and SDL_log10() +* Each of the SDL math functions now has the corresponding float version +* Added SDL_SetYUVConversionMode() and SDL_GetYUVConversionMode() to control the formula used when converting to and from YUV colorspace. The options are JPEG, BT.601, and BT.709 + +Windows: +* Implemented WASAPI support on Windows UWP and removed the deprecated XAudio2 implementation +* Added resampling support on WASAPI on Windows 7 and above + +Windows UWP: +* Added SDL_WinRTGetDeviceFamily() to find out what type of device your application is running on + +Mac OS X: +* Added support for the Vulkan SDK for Mac: + https://www.lunarg.com/lunarg-releases-vulkan-sdk-1-0-69-0-for-mac/ +* Added support for OpenGL ES using ANGLE when it's available + +Mac OS X / iOS / tvOS: +* Added a Metal 2D render implementation +* Added SDL_RenderGetMetalLayer() and SDL_RenderGetMetalCommandEncoder() to insert your own drawing into SDL rendering when using the Metal implementation + +iOS: +* Added the hint SDL_HINT_IOS_HIDE_HOME_INDICATOR to control whether the home indicator bar on iPhone X should be hidden. This defaults to dimming the indicator for fullscreen applications and showing the indicator for windowed applications. + +iOS / Android: +* Added the hint SDL_HINT_RETURN_KEY_HIDES_IME to control whether the return key on the software keyboard should hide the keyboard or send a key event (the default) + +Android: +* SDL now supports building with Android Studio and Gradle by default, and the old Ant project is available in android-project-ant +* SDL now requires the API 19 SDK to build, but can still target devices down to API 14 (Android 4.0.1) +* Added SDL_IsAndroidTV() to tell whether the application is running on Android TV + +Android / tvOS: +* Added the hint SDL_HINT_TV_REMOTE_AS_JOYSTICK to control whether TV remotes should be listed as joystick devices (the default) or send keyboard events. + +Linux: +* Added the hint SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR to control whether the X server should skip the compositor for the SDL application. This defaults to "1" +* Added the hint SDL_HINT_VIDEO_DOUBLE_BUFFER to control whether the Raspberry Pi and KMSDRM video drivers should use double or triple buffering (the default) + + +--------------------------------------------------------------------------- +2.0.7: +--------------------------------------------------------------------------- + +General: +* Added audio stream conversion functions: + SDL_NewAudioStream + SDL_AudioStreamPut + SDL_AudioStreamGet + SDL_AudioStreamAvailable + SDL_AudioStreamFlush + SDL_AudioStreamClear + SDL_FreeAudioStream +* Added functions to query and set the SDL memory allocation functions: + SDL_GetMemoryFunctions() + SDL_SetMemoryFunctions() + SDL_GetNumAllocations() +* Added locking functions for multi-threaded access to the joystick and game controller APIs: + SDL_LockJoysticks() + SDL_UnlockJoysticks() +* The following functions are now thread-safe: + SDL_SetEventFilter() + SDL_GetEventFilter() + SDL_AddEventWatch() + SDL_DelEventWatch() + + +General: +--------------------------------------------------------------------------- +2.0.6: +--------------------------------------------------------------------------- + +General: +* Added cross-platform Vulkan graphics support in SDL_vulkan.h + SDL_Vulkan_LoadLibrary() + SDL_Vulkan_GetVkGetInstanceProcAddr() + SDL_Vulkan_GetInstanceExtensions() + SDL_Vulkan_CreateSurface() + SDL_Vulkan_GetDrawableSize() + SDL_Vulkan_UnloadLibrary() + This is all the platform-specific code you need to bring up Vulkan on all SDL platforms. You can look at an example in test/testvulkan.c +* Added SDL_ComposeCustomBlendMode() to create custom blend modes for 2D rendering +* Added SDL_HasNEON() which returns whether the CPU has NEON instruction support +* Added support for many game controllers, including the Nintendo Switch Pro Controller +* Added support for inverted axes and separate axis directions in game controller mappings +* Added functions to return information about a joystick before it's opened: + SDL_JoystickGetDeviceVendor() + SDL_JoystickGetDeviceProduct() + SDL_JoystickGetDeviceProductVersion() + SDL_JoystickGetDeviceType() + SDL_JoystickGetDeviceInstanceID() +* Added functions to return information about an open joystick: + SDL_JoystickGetVendor() + SDL_JoystickGetProduct() + SDL_JoystickGetProductVersion() + SDL_JoystickGetType() + SDL_JoystickGetAxisInitialState() +* Added functions to return information about an open game controller: + SDL_GameControllerGetVendor() + SDL_GameControllerGetProduct() + SDL_GameControllerGetProductVersion() +* Added SDL_GameControllerNumMappings() and SDL_GameControllerMappingForIndex() to be able to enumerate the built-in game controller mappings +* Added SDL_LoadFile() and SDL_LoadFile_RW() to load a file into memory +* Added SDL_DuplicateSurface() to make a copy of a surface +* Added an experimental JACK audio driver +* Implemented non-power-of-two audio resampling, optionally using libsamplerate to perform the resampling +* Added the hint SDL_HINT_AUDIO_RESAMPLING_MODE to control the quality of resampling +* Added the hint SDL_HINT_RENDER_LOGICAL_SIZE_MODE to control the scaling policy for SDL_RenderSetLogicalSize(): + "0" or "letterbox" - Uses letterbox/sidebars to fit the entire rendering on screen (the default) + "1" or "overscan" - Will zoom the rendering so it fills the entire screen, allowing edges to be drawn offscreen +* Added the hints SDL_HINT_MOUSE_NORMAL_SPEED_SCALE and SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE to scale the mouse speed when being read from raw mouse input +* Added the hint SDL_HINT_TOUCH_MOUSE_EVENTS to control whether SDL will synthesize mouse events from touch events + +Windows: +* The new default audio driver on Windows is WASAPI and supports hot-plugging devices and changing the default audio device +* The old XAudio2 audio driver is deprecated and will be removed in the next release +* Added hints SDL_HINT_WINDOWS_INTRESOURCE_ICON and SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL to specify a custom icon resource ID for SDL windows +* The hint SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING is now on by default for compatibility with .NET languages and various Windows debuggers +* Updated the GUID format for game controller mappings, older mappings will be automatically converted on load +* Implemented the SDL_WINDOW_ALWAYS_ON_TOP flag on Windows + +Linux: +* Added an experimental KMS/DRM video driver for embedded development + +iOS: +* Added a hint SDL_HINT_AUDIO_CATEGORY to control the audio category, determining whether the phone mute switch affects the audio + +--------------------------------------------------------------------------- +2.0.5: +--------------------------------------------------------------------------- + +General: +* Implemented audio capture support for some platforms +* Added SDL_DequeueAudio() to retrieve audio when buffer queuing is turned on for audio capture +* Added events for dragging and dropping text +* Added events for dragging and dropping multiple items +* By default the click raising a window will not be delivered to the SDL application. You can set the hint SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH to "1" to allow that click through to the window. +* Saving a surface with an alpha channel as a BMP will use a newer BMP format that supports alpha information. You can set the hint SDL_HINT_BMP_SAVE_LEGACY_FORMAT to "1" to use the old format. +* Added SDL_GetHintBoolean() to get the boolean value of a hint +* Added SDL_RenderSetIntegerScale() to set whether to smoothly scale or use integral multiples of the viewport size when scaling the rendering output +* Added SDL_CreateRGBSurfaceWithFormat() and SDL_CreateRGBSurfaceWithFormatFrom() to create an SDL surface with a specific pixel format +* Added SDL_GetDisplayUsableBounds() which returns the area usable for windows. For example, on Mac OS X, this subtracts the area occupied by the menu bar and dock. +* Added SDL_GetWindowBordersSize() which returns the size of the window's borders around the client area +* Added a window event SDL_WINDOWEVENT_HIT_TEST when a window had a hit test that wasn't SDL_HITTEST_NORMAL (e.g. in the title bar or window frame) +* Added SDL_SetWindowResizable() to change whether a window is resizable +* Added SDL_SetWindowOpacity() and SDL_GetWindowOpacity() to affect the window transparency +* Added SDL_SetWindowModalFor() to set a window as modal for another window +* Added support for AUDIO_U16LSB and AUDIO_U16MSB to SDL_MixAudioFormat() +* Fixed flipped images when reading back from target textures when using the OpenGL renderer +* Fixed texture color modulation with SDL_BLENDMODE_NONE when using the OpenGL renderer +* Fixed bug where the alpha value of colorkeys was ignored when blitting in some cases + +Windows: +* Added a hint SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING to prevent SDL from raising a debugger exception to name threads. This exception can cause problems with .NET applications when running under a debugger. +* The hint SDL_HINT_THREAD_STACK_SIZE is now supported on Windows +* Fixed XBox controller triggers automatically being pulled at startup +* The first icon from the executable is used as the default window icon at runtime +* Fixed SDL log messages being printed twice if SDL was built with C library support +* Reset dead keys when the SDL window loses focus, so dead keys pressed in SDL applications don't affect text input into other applications. + +Mac OS X: +* Fixed selecting the dummy video driver +* The caps lock key now generates a pressed event when pressed and a released event when released, instead of a press/release event pair when pressed. +* Fixed mouse wheel events on Mac OS X 10.12 +* The audio driver has been updated to use AVFoundation for better compatibility with newer versions of Mac OS X + +Linux: +* Added support for the Fcitx IME +* Added a window event SDL_WINDOWEVENT_TAKE_FOCUS when a window manager asks the SDL window whether it wants to take focus. +* Refresh rates are now rounded instead of truncated, e.g. 59.94 Hz is rounded up to 60 Hz instead of 59. +* Added initial support for touchscreens on Raspberry Pi + +OpenBSD: +* SDL_GetBasePath() is now implemented on OpenBSD + +iOS: +* Added support for dynamically loaded objects on iOS 8 and newer + +tvOS: +* Added support for Apple TV +* Added a hint SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION to control whether he Apple TV remote's joystick axes will automatically match the rotation of the remote. + +Android: +* Fixed SDL not resizing window when Android screen resolution changes +* Corrected the joystick Z axis reporting for the accelerometer + +Emscripten (running in a web browser): +* Many bug fixes and improvements + + +--------------------------------------------------------------------------- +2.0.4: +--------------------------------------------------------------------------- + +General: +* Added support for web applications using Emscripten, see docs/README-emscripten.md for more information +* Added support for web applications using Native Client (NaCl), see docs/README-nacl.md for more information +* Added an API to queue audio instead of using the audio callback: + SDL_QueueAudio(), SDL_GetQueuedAudioSize(), SDL_ClearQueuedAudio() +* Added events for audio device hot plug support: + SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED +* Added SDL_PointInRect() +* Added SDL_HasAVX2() to detect CPUs with AVX2 support +* Added SDL_SetWindowHitTest() to let apps treat parts of their SDL window like traditional window decorations (drag areas, resize areas) +* Added SDL_GetGrabbedWindow() to get the window that currently has input grab, if any +* Added SDL_RenderIsClipEnabled() to tell whether clipping is currently enabled in a renderer +* Added SDL_CaptureMouse() to capture the mouse to get events while the mouse is not in your window +* Added SDL_WarpMouseGlobal() to warp the mouse cursor in global screen space +* Added SDL_GetGlobalMouseState() to get the current mouse state outside of an SDL window +* Added a direction field to mouse wheel events to tell whether they are flipped (natural) or not +* Added GL_CONTEXT_RELEASE_BEHAVIOR GL attribute (maps to [WGL|GLX]_ARB_context_flush_control extension) +* Added EGL_KHR_create_context support to allow OpenGL ES version selection on some platforms +* Added NV12 and NV21 YUV texture support for OpenGL and OpenGL ES 2.0 renderers +* Added a Vivante video driver that is used on various SoC platforms +* Added an event SDL_RENDER_DEVICE_RESET that is sent from the D3D renderers when the D3D device is lost, and from Android's event loop when the GLES context had to be recreated +* Added a hint SDL_HINT_NO_SIGNAL_HANDLERS to disable SDL's built in signal handling +* Added a hint SDL_HINT_THREAD_STACK_SIZE to set the stack size of SDL's threads +* Added SDL_sqrtf(), SDL_tan(), and SDL_tanf() to the stdlib routines +* Improved support for WAV and BMP files with unusual chunks in them +* Renamed SDL_assert_data to SDL_AssertData and SDL_assert_state to SDL_AssertState +* Added a hint SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN to prevent window interaction while cursor is hidden +* Added SDL_GetDisplayDPI() to get the DPI information for a display +* Added SDL_JoystickCurrentPowerLevel() to get the battery level of a joystick +* Added SDL_JoystickFromInstanceID(), as a helper function, to get the SDL_Joystick* that an event is referring to. +* Added SDL_GameControllerFromInstanceID(), as a helper function, to get the SDL_GameController* that an event is referring to. + +Windows: +* Added support for Windows Phone 8.1 and Windows 10/UWP (Universal Windows Platform) +* Timer resolution is now 1 ms by default, adjustable with the SDL_HINT_TIMER_RESOLUTION hint +* SDLmain no longer depends on the C runtime, so you can use the same .lib in both Debug and Release builds +* Added SDL_SetWindowsMessageHook() to set a function to be called for every windows message before TranslateMessage() +* Added a hint SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP to control whether SDL_PumpEvents() processes the Windows message loop +* You can distinguish between real mouse and touch events by looking for SDL_TOUCH_MOUSEID in the mouse event "which" field +* SDL_SysWMinfo now contains the window HDC +* Added support for Unicode command line options +* Prevent beeping when Alt-key combos are pressed +* SDL_SetTextInputRect() re-positions the OS-rendered IME +* Added a hint SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 to prevent generating SDL_WINDOWEVENT_CLOSE events when Alt-F4 is pressed +* Added a hint SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING to use the old axis and button mapping for XInput devices (deprecated) + +Mac OS X: +* Implemented drag-and-drop support +* Improved joystick hot-plug detection +* The SDL_WINDOWEVENT_EXPOSED window event is triggered in the appropriate situations +* Fixed relative mouse mode when the application loses/regains focus +* Fixed bugs related to transitioning to and from Spaces-aware fullscreen-desktop mode +* Fixed the refresh rate of display modes +* SDL_SysWMInfo is now ARC-compatible +* Added a hint SDL_HINT_MAC_BACKGROUND_APP to prevent forcing the application to become a foreground process + +Linux: +* Enabled building with Mir and Wayland support by default. +* Added IBus IME support +* Added a hint SDL_HINT_IME_INTERNAL_EDITING to control whether IBus should handle text editing internally instead of sending SDL_TEXTEDITING events +* Added a hint SDL_HINT_VIDEO_X11_NET_WM_PING to allow disabling _NET_WM_PING protocol handling in SDL_CreateWindow() +* Added support for multiple audio devices when using Pulseaudio +* Fixed duplicate mouse events when using relative mouse motion + +iOS: +* Added support for iOS 8 +* The SDL_WINDOW_ALLOW_HIGHDPI window flag now enables high-dpi support, and SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() gets the window resolution in pixels +* SDL_GetWindowSize() and display mode sizes are in the "DPI-independent points" / "screen coordinates" coordinate space rather than pixels (matches OS X behavior) +* Added native resolution support for the iPhone 6 Plus +* Added support for MFi game controllers +* Added support for the hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK +* Added sRGB OpenGL ES context support on iOS 7+ +* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER +* SDL_SysWMinfo now contains the OpenGL ES framebuffer and color renderbuffer objects used by the window's active GLES view +* Fixed various rotation and orientation issues +* Fixed memory leaks + +Android: +* Added a hint SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH to prevent mouse events from being registered as touch events +* Added hints SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION and SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION +* Added support for SDL_DisableScreenSaver(), SDL_EnableScreenSaver() and the hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER +* Added support for SDL_ShowMessageBox() and SDL_ShowSimpleMessageBox() + +Raspberry Pi: +* Added support for the Raspberry Pi 2 + + +--------------------------------------------------------------------------- +2.0.3: +--------------------------------------------------------------------------- + +Mac OS X: +* Fixed creating an OpenGL context by default on Mac OS X 10.6 + + +--------------------------------------------------------------------------- +2.0.2: +--------------------------------------------------------------------------- +General: +* Added SDL_GL_ResetAttributes() to reset OpenGL attributes to default values +* Added an API to load a database of game controller mappings from a file: + SDL_GameControllerAddMappingsFromFile(), SDL_GameControllerAddMappingsFromRW() +* Added game controller mappings for the PS4 and OUYA controllers +* Added SDL_GetDefaultAssertionHandler() and SDL_GetAssertionHandler() +* Added SDL_DetachThread() +* Added SDL_HasAVX() to determine if the CPU has AVX features +* Added SDL_vsscanf(), SDL_acos(), and SDL_asin() to the stdlib routines +* EGL can now create/manage OpenGL and OpenGL ES 1.x/2.x contexts, and share + them using SDL_GL_SHARE_WITH_CURRENT_CONTEXT +* Added a field "clicks" to the mouse button event which records whether the event is a single click, double click, etc. +* The screensaver is now disabled by default, and there is a hint SDL_HINT_VIDEO_ALLOW_SCREENSAVER that can change that behavior. +* Added a hint SDL_HINT_MOUSE_RELATIVE_MODE_WARP to specify whether mouse relative mode should be emulated using mouse warping. +* testgl2 does not need to link with libGL anymore +* Added testgles2 test program to demonstrate working with OpenGL ES 2.0 +* Added controllermap test program to visually map a game controller + +Windows: +* Support for OpenGL ES 2.x contexts using either WGL or EGL (natively via + the driver or emulated through ANGLE) +* Added a hint SDL_HINT_VIDEO_WIN_D3DCOMPILER to specify which D3D shader compiler to use for OpenGL ES 2 support through ANGLE +* Added a hint SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT that is useful when creating multiple windows that should share the same OpenGL context. +* Added an event SDL_RENDER_TARGETS_RESET that is sent when D3D9 render targets are reset after the device has been restored. + +Mac OS X: +* Added a hint SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK to control whether Ctrl+click should be treated as a right click on Mac OS X. This is off by default. + +Linux: +* Fixed fullscreen and focused behavior when receiving NotifyGrab events +* Added experimental Wayland and Mir support, disabled by default + +Android: +* Joystick support (minimum SDK version required to build SDL is now 12, + the required runtime version remains at 10, but on such devices joystick + support won't be available). +* Hotplugging support for joysticks +* Added a hint SDL_HINT_ACCELEROMETER_AS_JOYSTICK to control whether the accelerometer should be listed as a 3 axis joystick, which it will by default. + + +--------------------------------------------------------------------------- +2.0.1: +--------------------------------------------------------------------------- + +General: +* Added an API to get common filesystem paths in SDL_filesystem.h: + SDL_GetBasePath(), SDL_GetPrefPath() +* Added an API to do optimized YV12 and IYUV texture updates: + SDL_UpdateYUVTexture() +* Added an API to get the amount of RAM on the system: + SDL_GetSystemRAM() +* Added a macro to perform timestamp comparisons with SDL_GetTicks(): + SDL_TICKS_PASSED() +* Dramatically improved OpenGL ES 2.0 rendering performance +* Added OpenGL attribute SDL_GL_FRAMEBUFFER_SRGB_CAPABLE + +Windows: +* Created a static library configuration for the Visual Studio 2010 project +* Added a hint to create the Direct3D device with support for multi-threading: + SDL_HINT_RENDER_DIRECT3D_THREADSAFE +* Added a function to get the D3D9 adapter index for a display: + SDL_Direct3D9GetAdapterIndex() +* Added a function to get the D3D9 device for a D3D9 renderer: + SDL_RenderGetD3D9Device() +* Fixed building SDL with the mingw32 toolchain (mingw-w64 is preferred) +* Fixed crash when using two XInput controllers at the same time +* Fixed detecting a mixture of XInput and DirectInput controllers +* Fixed clearing a D3D render target larger than the window +* Improved support for format specifiers in SDL_snprintf() + +Mac OS X: +* Added support for retina displays: + Create your window with the SDL_WINDOW_ALLOW_HIGHDPI flag, and then use SDL_GL_GetDrawableSize() to find the actual drawable size. You are responsible for scaling mouse and drawing coordinates appropriately. +* Fixed mouse warping in fullscreen mode +* Right mouse click is emulated by holding the Ctrl key while left clicking + +Linux: +* Fixed float audio support with the PulseAudio driver +* Fixed missing line endpoints in the OpenGL renderer on some drivers +* X11 symbols are no longer defined to avoid collisions when linking statically + +iOS: +* Fixed status bar visibility on iOS 7 +* Flipped the accelerometer Y axis to match expected values + +Android: +IMPORTANT: You MUST get the updated SDLActivity.java to match C code +* Moved EGL initialization to native code +* Fixed the accelerometer axis rotation relative to the device rotation +* Fixed race conditions when handling the EGL context on pause/resume +* Touch devices are available for enumeration immediately after init + +Raspberry Pi: +* Added support for the Raspberry Pi, see README-raspberrypi.txt for details diff --git a/Thirdparty/SDL2/cmake/sdl2-config-version.cmake b/Thirdparty/SDL2/cmake/sdl2-config-version.cmake new file mode 100644 index 0000000..42bb6e7 --- /dev/null +++ b/Thirdparty/SDL2/cmake/sdl2-config-version.cmake @@ -0,0 +1,54 @@ +# based on the files generated by CMake's write_basic_package_version_file + +# SDL2 CMake version configuration file: +# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC + +if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/../include/SDL_version.h") + message(AUTHOR_WARNING "Could not find SDL_version.h. This script is meant to be placed in the root of SDL2-devel-2.x.y-VC") + return() +endif() + +file(READ "${CMAKE_CURRENT_LIST_DIR}/../include/SDL_version.h" _sdl_version_h) +string(REGEX MATCH "#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)" _sdl_major_re "${_sdl_version_h}") +set(_sdl_major "${CMAKE_MATCH_1}") +string(REGEX MATCH "#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)" _sdl_minor_re "${_sdl_version_h}") +set(_sdl_minor "${CMAKE_MATCH_1}") +string(REGEX MATCH "#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)" _sdl_patch_re "${_sdl_version_h}") +set(_sdl_patch "${CMAKE_MATCH_1}") +if(_sdl_major_re AND _sdl_minor_re AND _sdl_patch_re) + set(PACKAGE_VERSION "${_sdl_major}.${_sdl_minor}.${_sdl_patch}") +else() + message(AUTHOR_WARNING "Could not extract version from SDL_version.h.") + return() +endif() + +if(PACKAGE_FIND_VERSION_RANGE) + # Package version must be in the requested version range + if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN) + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + endif() +else() + if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + +# if the using project doesn't have CMAKE_SIZEOF_VOID_P set, fail. +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT (CMAKE_SIZEOF_VOID_P STREQUAL "8" OR CMAKE_SIZEOF_VOID_P STREQUAL "4")) + set(PACKAGE_VERSION "${PACKAGE_VERSION} (32+64bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/Thirdparty/SDL2/cmake/sdl2-config.cmake b/Thirdparty/SDL2/cmake/sdl2-config.cmake new file mode 100644 index 0000000..0f03a63 --- /dev/null +++ b/Thirdparty/SDL2/cmake/sdl2-config.cmake @@ -0,0 +1,117 @@ +# SDL2 CMake configuration file: +# This file is meant to be placed in a cmake subfolder of SDL2-devel-2.x.y-VC + +cmake_minimum_required(VERSION 3.0) + +include(FeatureSummary) +set_package_properties(SDL2 PROPERTIES + URL "https://www.libsdl.org/" + DESCRIPTION "low level access to audio, keyboard, mouse, joystick, and graphics hardware" +) + +# Copied from `configure_package_config_file` +macro(set_and_check _var _file) + set(${_var} "${_file}") + if(NOT EXISTS "${_file}") + message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") + endif() +endmacro() + +# Copied from `configure_package_config_file` +macro(check_required_components _NAME) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(NOT ${_NAME}_${comp}_FOUND) + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() + +set(SDL2_FOUND TRUE) + +if(CMAKE_SIZEOF_VOID_P STREQUAL "4") + set(_sdl_arch_subdir "x86") +elseif(CMAKE_SIZEOF_VOID_P STREQUAL "8") + set(_sdl_arch_subdir "x64") +else() + set(SDL2_FOUND FALSE) + return() +endif() + +# For compatibility with autotools sdl2-config.cmake, provide SDL2_* variables. + +set_and_check(SDL2_PREFIX "${CMAKE_CURRENT_LIST_DIR}/..") +set_and_check(SDL2_EXEC_PREFIX "${CMAKE_CURRENT_LIST_DIR}/..") +set_and_check(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include") +set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}") +set_and_check(SDL2_BINDIR "${SDL2_PREFIX}/lib/${_sdl_arch_subdir}") +set_and_check(SDL2_LIBDIR "${SDL2_PREFIX}/lib/${_sdl_arch_subdir}") + +set(SDL2_LIBRARIES SDL2::SDL2main SDL2::SDL2) +set(SDL2MAIN_LIBRARY SDL2::SDL2main) +set(SDL2TEST_LIBRARY SDL2::SDL2test) + + +# All targets are created, even when some might not be requested though COMPONENTS. +# This is done for compatibility with CMake generated SDL2-target.cmake files. + +set(_sdl2_library "${SDL2_LIBDIR}/SDL2.lib") +set(_sdl2_dll_library "${SDL2_BINDIR}/SDL2.dll") +if(EXISTS "${_sdl2_library}" AND EXISTS "${_sdl2_dll_library}") + if(NOT TARGET SDL2::SDL2) + add_library(SDL2::SDL2 SHARED IMPORTED) + set_target_properties(SDL2::SDL2 + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}" + IMPORTED_IMPLIB "${_sdl2_library}" + IMPORTED_LOCATION "${_sdl2_dll_library}" + COMPATIBLE_INTERFACE_BOOL "SDL2_SHARED" + INTERFACE_SDL2_SHARED "ON" + COMPATIBLE_INTERFACE_STRING "SDL_VERSION" + INTERFACE_SDL_VERSION "SDL2" + ) + endif() + set(SDL2_SDL2_FOUND TRUE) +else() + set(SDL2_SDL2_FOUND FALSE) +endif() +unset(_sdl2_library) +unset(_sdl2_dll_library) + +set(_sdl2main_library "${SDL2_LIBDIR}/SDL2main.lib") +if(EXISTS "${_sdl2main_library}") + if(NOT TARGET SDL2::SDL2main) + add_library(SDL2::SDL2main STATIC IMPORTED) + set_target_properties(SDL2::SDL2main + PROPERTIES + IMPORTED_LOCATION "${_sdl2main_library}" + COMPATIBLE_INTERFACE_STRING "SDL_VERSION" + INTERFACE_SDL_VERSION "SDL2" + ) + endif() + set(SDL2_SDL2main_FOUND TRUE) +else() + set(SDL2_SDL2_FOUND FALSE) +endif() +unset(_sdl2main_library) + +set(_sdl2test_library "${SDL2_LIBDIR}/SDL2test.lib") +if(EXISTS "${_sdl2test_library}") + if(NOT TARGET SDL2::SDL2test) + add_library(SDL2::SDL2test STATIC IMPORTED) + set_target_properties(SDL2::SDL2test + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}" + IMPORTED_LOCATION "${_sdl2test_library}" + COMPATIBLE_INTERFACE_STRING "SDL_VERSION" + INTERFACE_SDL_VERSION "SDL2" + ) + endif() + set(SDL2_SDL2test_FOUND TRUE) +else() + set(SDL2_SDL2_FOUND FALSE) +endif() +unset(_sdl2test_library) + +check_required_components(SDL2) diff --git a/Thirdparty/SDL2/docs/CONTRIBUTING.md b/Thirdparty/SDL2/docs/CONTRIBUTING.md new file mode 100644 index 0000000..969ce8b --- /dev/null +++ b/Thirdparty/SDL2/docs/CONTRIBUTING.md @@ -0,0 +1,97 @@ +# Contributing to SDL + +We appreciate your interest in contributing to SDL, this document will describe how to report bugs, contribute code or ideas or edit documentation. + +**Table Of Contents** + +- [Filing a GitHub issue](#filing-a-github-issue) + - [Reporting a bug](#reporting-a-bug) + - [Suggesting enhancements](#suggesting-enhancements) +- [Contributing code](#contributing-code) + - [Forking the project](#forking-the-project) + - [Following the style guide](#following-the-style-guide) + - [Running the tests](#running-the-tests) + - [Opening a pull request](#opening-a-pull-request) +- [Contributing to the documentation](#contributing-to-the-documentation) + - [Editing a function documentation](#editing-a-function-documentation) + - [Editing the wiki](#editing-the-wiki) + +## Filing a GitHub issue + +### Reporting a bug + +If you think you have found a bug and would like to report it, here are the steps you should take: + +- Before opening a new issue, ensure your bug has not already been reported on the [GitHub Issues page](https://github.com/libsdl-org/SDL/issues). +- On the issue tracker, click on [New Issue](https://github.com/libsdl-org/SDL/issues/new). +- Include details about your environment, such as your Operating System and SDL version. +- If possible, provide a small example that reproduces your bug. + +### Suggesting enhancements + +If you want to suggest changes for the project, here are the steps you should take: + +- Check if the suggestion has already been made on: + - the [issue tracker](https://github.com/libsdl-org/SDL/issues); + - the [discourse forum](https://discourse.libsdl.org/); + - or if a [pull request](https://github.com/libsdl-org/SDL/pulls) already exists. +- On the issue tracker, click on [New Issue](https://github.com/libsdl-org/SDL/issues/new). +- Describe what change you would like to happen. + +## Contributing code + +This section will cover how the process of forking the project, making a change and opening a pull request. + +### Forking the project + +The first step consists in making a fork of the project, this is only necessary for the first contribution. + +Head over to https://github.com/libsdl-org/SDL and click on the `Fork` button in the top right corner of your screen, you may leave the fields unchanged and click `Create Fork`. + +You will be redirected to your fork of the repository, click the green `Code` button and copy the git clone link. + +If you had already forked the repository, you may update it from the web page using the `Fetch upstream` button. + +### Following the style guide + +Code formatting is done using a custom `.clang-format` file, you can learn more about how to run it [here](https://clang.llvm.org/docs/ClangFormat.html). + +Some legacy code may not be formatted, as such avoid formatting the whole file at once and only format around your changes. + +For your commit message to be properly displayed on GitHub, it should contain: + +- A short description of the commit of 50 characters or less on the first line. +- If necessary, add a blank line followed by a long description, each line should be 72 characters or less. + +For example: + +``` +Fix crash in SDL_FooBar. + +This addresses the issue #123456 by making sure Foo was successful +before calling Bar. +``` + +### Running the tests + +Tests allow you to verify if your changes did not break any behaviour, here are the steps to follow: + +- Before pushing, run the `testautomation` suite on your machine, there should be no more failing tests after your change than before. +- After pushing to your fork, Continuous Integration (GitHub Actions) will ensure compilation and tests still pass on other systems. + +### Opening a pull request + +- Head over to your fork's GitHub page. +- Click on the `Contribute` button and `Open Pull Request`. +- Fill out the pull request template. +- If any changes are requested, you can add new commits to your fork and they will be automatically added to the pull request. + +## Contributing to the documentation + +### Editing a function documentation + +The wiki documentation for API functions is synchronised from the headers' doxygen comments. As such, all modifications to syntax; function parameters; return value; version; related functions should be done in the header directly. + +### Editing the wiki + +Other changes to the wiki should done directly from https://wiki.libsdl.org/ diff --git a/Thirdparty/SDL2/docs/README-android.md b/Thirdparty/SDL2/docs/README-android.md new file mode 100644 index 0000000..c8de5ea --- /dev/null +++ b/Thirdparty/SDL2/docs/README-android.md @@ -0,0 +1,483 @@ +Android +================================================================================ + +Matt Styles wrote a tutorial on building SDL for Android with Visual Studio: +http://trederia.blogspot.de/2017/03/building-sdl2-for-android-with-visual.html + +The rest of this README covers the Android gradle style build process. + +If you are using the older ant build process, it is no longer officially +supported, but you can use the "android-project-ant" directory as a template. + + +Requirements +================================================================================ + +Android SDK (version 31 or later) +https://developer.android.com/sdk/index.html + +Android NDK r15c or later +https://developer.android.com/tools/sdk/ndk/index.html + +Minimum API level supported by SDL: 16 (Android 4.1) + + +How the port works +================================================================================ + +- Android applications are Java-based, optionally with parts written in C +- As SDL apps are C-based, we use a small Java shim that uses JNI to talk to + the SDL library +- This means that your application C code must be placed inside an Android + Java project, along with some C support code that communicates with Java +- This eventually produces a standard Android .apk package + +The Android Java code implements an "Activity" and can be found in: +android-project/app/src/main/java/org/libsdl/app/SDLActivity.java + +The Java code loads your game code, the SDL shared library, and +dispatches to native functions implemented in the SDL library: +src/core/android/SDL_android.c + + +Building an app +================================================================================ + +For simple projects you can use the script located at build-scripts/androidbuild.sh + +There's two ways of using it: + + androidbuild.sh com.yourcompany.yourapp < sources.list + androidbuild.sh com.yourcompany.yourapp source1.c source2.c ...sourceN.c + +sources.list should be a text file with a source file name in each line +Filenames should be specified relative to the current directory, for example if +you are in the build-scripts directory and want to create the testgles.c test, you'll +run: + + ./androidbuild.sh org.libsdl.testgles ../test/testgles.c + +One limitation of this script is that all sources provided will be aggregated into +a single directory, thus all your source files should have a unique name. + +Once the project is complete the script will tell you where the debug APK is located. +If you want to create a signed release APK, you can use the project created by this +utility to generate it. + +Finally, a word of caution: re running androidbuild.sh wipes any changes you may have +done in the build directory for the app! + + + +For more complex projects, follow these instructions: + +1. Get the source code for SDL and copy the 'android-project' directory located at SDL/android-project to a suitable location. Also make sure to rename it to your project name (In these examples: YOURPROJECT). + + (The 'android-project' directory can basically be seen as a sort of starting point for the android-port of your project. It contains the glue code between the Android Java 'frontend' and the SDL code 'backend'. It also contains some standard behaviour, like how events should be handled, which you will be able to change.) + +2. Move or [symlink](https://en.wikipedia.org/wiki/Symbolic_link) the SDL directory into the "YOURPROJECT/app/jni" directory + +(This is needed as the source of SDL has to be compiled by the Android compiler) + +3. Edit "YOURPROJECT/app/jni/src/Android.mk" to include your source files. + +(They should be separated by spaces after the "LOCAL_SRC_FILES := " declaration) + +4a. If you want to use Android Studio, simply open your 'YOURPROJECT' directory and start building. + +4b. If you want to build manually, run './gradlew installDebug' in the project directory. This compiles the .java, creates an .apk with the native code embedded, and installs it on any connected Android device + + +If you already have a project that uses CMake, the instructions change somewhat: + +1. Do points 1 and 2 from the instruction above. +2. Edit "YOURPROJECT/app/build.gradle" to comment out or remove sections containing ndk-build + and uncomment the cmake sections. Add arguments to the CMake invocation as needed. +3. Edit "YOURPROJECT/app/jni/CMakeLists.txt" to include your project (it defaults to + adding the "src" subdirectory). Note that you'll have SDL2, SDL2main and SDL2-static + as targets in your project, so you should have "target_link_libraries(yourgame SDL2 SDL2main)" + in your CMakeLists.txt file. Also be aware that you should use add_library() instead of + add_executable() for the target containing your "main" function. + +If you wish to use Android Studio, you can skip the last step. + +4. Run './gradlew installDebug' or './gradlew installRelease' in the project directory. It will build and install your .apk on any + connected Android device + +Here's an explanation of the files in the Android project, so you can customize them: + + android-project/app + build.gradle - build info including the application version and SDK + src/main/AndroidManifest.xml - package manifest. Among others, it contains the class name of the main Activity and the package name of the application. + jni/ - directory holding native code + jni/Application.mk - Application JNI settings, including target platform and STL library + jni/Android.mk - Android makefile that can call recursively the Android.mk files in all subdirectories + jni/CMakeLists.txt - Top-level CMake project that adds SDL as a subproject + jni/SDL/ - (symlink to) directory holding the SDL library files + jni/SDL/Android.mk - Android makefile for creating the SDL shared library + jni/src/ - directory holding your C/C++ source + jni/src/Android.mk - Android makefile that you should customize to include your source code and any library references + jni/src/CMakeLists.txt - CMake file that you may customize to include your source code and any library references + src/main/assets/ - directory holding asset files for your application + src/main/res/ - directory holding resources for your application + src/main/res/mipmap-* - directories holding icons for different phone hardware + src/main/res/values/strings.xml - strings used in your application, including the application name + src/main/java/org/libsdl/app/SDLActivity.java - the Java class handling the initialization and binding to SDL. Be very careful changing this, as the SDL library relies on this implementation. You should instead subclass this for your application. + + +Customizing your application name +================================================================================ + +To customize your application name, edit AndroidManifest.xml and replace +"org.libsdl.app" with an identifier for your product package. + +Then create a Java class extending SDLActivity and place it in a directory +under src matching your package, e.g. + + src/com/gamemaker/game/MyGame.java + +Here's an example of a minimal class file: + + --- MyGame.java -------------------------- + package com.gamemaker.game; + + import org.libsdl.app.SDLActivity; + + /** + * A sample wrapper class that just calls SDLActivity + */ + + public class MyGame extends SDLActivity { } + + ------------------------------------------ + +Then replace "SDLActivity" in AndroidManifest.xml with the name of your +class, .e.g. "MyGame" + + +Customizing your application icon +================================================================================ + +Conceptually changing your icon is just replacing the "ic_launcher.png" files in +the drawable directories under the res directory. There are several directories +for different screen sizes. + + +Loading assets +================================================================================ + +Any files you put in the "app/src/main/assets" directory of your project +directory will get bundled into the application package and you can load +them using the standard functions in SDL_rwops.h. + +There are also a few Android specific functions that allow you to get other +useful paths for saving and loading data: +* SDL_AndroidGetInternalStoragePath() +* SDL_AndroidGetExternalStorageState() +* SDL_AndroidGetExternalStoragePath() + +See SDL_system.h for more details on these functions. + +The asset packaging system will, by default, compress certain file extensions. +SDL includes two asset file access mechanisms, the preferred one is the so +called "File Descriptor" method, which is faster and doesn't involve the Dalvik +GC, but given this method does not work on compressed assets, there is also the +"Input Stream" method, which is automatically used as a fall back by SDL. You +may want to keep this fact in mind when building your APK, specially when large +files are involved. +For more information on which extensions get compressed by default and how to +disable this behaviour, see for example: + +http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ + + +Pause / Resume behaviour +================================================================================ + +If SDL_HINT_ANDROID_BLOCK_ON_PAUSE hint is set (the default), +the event loop will block itself when the app is paused (ie, when the user +returns to the main Android dashboard). Blocking is better in terms of battery +use, and it allows your app to spring back to life instantaneously after resume +(versus polling for a resume message). + +Upon resume, SDL will attempt to restore the GL context automatically. +In modern devices (Android 3.0 and up) this will most likely succeed and your +app can continue to operate as it was. + +However, there's a chance (on older hardware, or on systems under heavy load), +where the GL context can not be restored. In that case you have to listen for +a specific message (SDL_RENDER_DEVICE_RESET) and restore your textures +manually or quit the app. + +You should not use the SDL renderer API while the app going in background: +- SDL_APP_WILLENTERBACKGROUND: + after you read this message, GL context gets backed-up and you should not + use the SDL renderer API. + + When this event is received, you have to set the render target to NULL, if you're using it. + (eg call SDL_SetRenderTarget(renderer, NULL)) + +- SDL_APP_DIDENTERFOREGROUND: + GL context is restored, and the SDL renderer API is available (unless you + receive SDL_RENDER_DEVICE_RESET). + +Mouse / Touch events +================================================================================ + +In some case, SDL generates synthetic mouse (resp. touch) events for touch +(resp. mouse) devices. +To enable/disable this behavior, see SDL_hints.h: +- SDL_HINT_TOUCH_MOUSE_EVENTS +- SDL_HINT_MOUSE_TOUCH_EVENTS + +Misc +================================================================================ + +For some device, it appears to works better setting explicitly GL attributes +before creating a window: + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); + +Threads and the Java VM +================================================================================ + +For a quick tour on how Linux native threads interoperate with the Java VM, take +a look here: https://developer.android.com/guide/practices/jni.html + +If you want to use threads in your SDL app, it's strongly recommended that you +do so by creating them using SDL functions. This way, the required attach/detach +handling is managed by SDL automagically. If you have threads created by other +means and they make calls to SDL functions, make sure that you call +Android_JNI_SetupThread() before doing anything else otherwise SDL will attach +your thread automatically anyway (when you make an SDL call), but it'll never +detach it. + + +If you ever want to use JNI in a native thread (created by "SDL_CreateThread()"), +it won't be able to find your java class and method because of the java class loader +which is different for native threads, than for java threads (eg your "main()"). + +the work-around is to find class/method, in you "main()" thread, and to use them +in your native thread. + +see: +https://developer.android.com/training/articles/perf-jni#faq:-why-didnt-findclass-find-my-class + +Using STL +================================================================================ + +You can use STL in your project by creating an Application.mk file in the jni +folder and adding the following line: + + APP_STL := c++_shared + +For more information go here: + https://developer.android.com/ndk/guides/cpp-support + + +Using the emulator +================================================================================ + +There are some good tips and tricks for getting the most out of the +emulator here: https://developer.android.com/tools/devices/emulator.html + +Especially useful is the info on setting up OpenGL ES 2.0 emulation. + +Notice that this software emulator is incredibly slow and needs a lot of disk space. +Using a real device works better. + + +Troubleshooting +================================================================================ + +You can see if adb can see any devices with the following command: + + adb devices + +You can see the output of log messages on the default device with: + + adb logcat + +You can push files to the device with: + + adb push local_file remote_path_and_file + +You can push files to the SD Card at /sdcard, for example: + + adb push moose.dat /sdcard/moose.dat + +You can see the files on the SD card with a shell command: + + adb shell ls /sdcard/ + +You can start a command shell on the default device with: + + adb shell + +You can remove the library files of your project (and not the SDL lib files) with: + + ndk-build clean + +You can do a build with the following command: + + ndk-build + +You can see the complete command line that ndk-build is using by passing V=1 on the command line: + + ndk-build V=1 + +If your application crashes in native code, you can use ndk-stack to get a symbolic stack trace: + https://developer.android.com/ndk/guides/ndk-stack + +If you want to go through the process manually, you can use addr2line to convert the +addresses in the stack trace to lines in your code. + +For example, if your crash looks like this: + + I/DEBUG ( 31): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 400085d0 + I/DEBUG ( 31): r0 00000000 r1 00001000 r2 00000003 r3 400085d4 + I/DEBUG ( 31): r4 400085d0 r5 40008000 r6 afd41504 r7 436c6a7c + I/DEBUG ( 31): r8 436c6b30 r9 435c6fb0 10 435c6f9c fp 4168d82c + I/DEBUG ( 31): ip 8346aff0 sp 436c6a60 lr afd1c8ff pc afd1c902 cpsr 60000030 + I/DEBUG ( 31): #00 pc 0001c902 /system/lib/libc.so + I/DEBUG ( 31): #01 pc 0001ccf6 /system/lib/libc.so + I/DEBUG ( 31): #02 pc 000014bc /data/data/org.libsdl.app/lib/libmain.so + I/DEBUG ( 31): #03 pc 00001506 /data/data/org.libsdl.app/lib/libmain.so + +You can see that there's a crash in the C library being called from the main code. +I run addr2line with the debug version of my code: + + arm-eabi-addr2line -C -f -e obj/local/armeabi/libmain.so + +and then paste in the number after "pc" in the call stack, from the line that I care about: +000014bc + +I get output from addr2line showing that it's in the quit function, in testspriteminimal.c, on line 23. + +You can add logging to your code to help show what's happening: + + #include + + __android_log_print(ANDROID_LOG_INFO, "foo", "Something happened! x = %d", x); + +If you need to build without optimization turned on, you can create a file called +"Application.mk" in the jni directory, with the following line in it: + + APP_OPTIM := debug + + +Memory debugging +================================================================================ + +The best (and slowest) way to debug memory issues on Android is valgrind. +Valgrind has support for Android out of the box, just grab code using: + + svn co svn://svn.valgrind.org/valgrind/trunk valgrind + +... and follow the instructions in the file README.android to build it. + +One thing I needed to do on Mac OS X was change the path to the toolchain, +and add ranlib to the environment variables: +export RANLIB=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-ranlib + +Once valgrind is built, you can create a wrapper script to launch your +application with it, changing org.libsdl.app to your package identifier: + + --- start_valgrind_app ------------------- + #!/system/bin/sh + export TMPDIR=/data/data/org.libsdl.app + exec /data/local/Inst/bin/valgrind --log-file=/sdcard/valgrind.log --error-limit=no $* + ------------------------------------------ + +Then push it to the device: + + adb push start_valgrind_app /data/local + +and make it executable: + + adb shell chmod 755 /data/local/start_valgrind_app + +and tell Android to use the script to launch your application: + + adb shell setprop wrap.org.libsdl.app "logwrapper /data/local/start_valgrind_app" + +If the setprop command says "could not set property", it's likely that +your package name is too long and you should make it shorter by changing +AndroidManifest.xml and the path to your class file in android-project/src + +You can then launch your application normally and waaaaaaaiiittt for it. +You can monitor the startup process with the logcat command above, and +when it's done (or even while it's running) you can grab the valgrind +output file: + + adb pull /sdcard/valgrind.log + +When you're done instrumenting with valgrind, you can disable the wrapper: + + adb shell setprop wrap.org.libsdl.app "" + + +Graphics debugging +================================================================================ + +If you are developing on a compatible Tegra-based tablet, NVidia provides +Tegra Graphics Debugger at their website. Because SDL2 dynamically loads EGL +and GLES libraries, you must follow their instructions for installing the +interposer library on a rooted device. The non-rooted instructions are not +compatible with applications that use SDL2 for video. + +The Tegra Graphics Debugger is available from NVidia here: +https://developer.nvidia.com/tegra-graphics-debugger + + +Why is API level 16 the minimum required? +================================================================================ + +The latest NDK toolchain doesn't support targeting earlier than API level 16. +As of this writing, according to https://developer.android.com/about/dashboards/index.html +about 99% of the Android devices accessing Google Play support API level 16 or +higher (January 2018). + + +A note regarding the use of the "dirty rectangles" rendering technique +================================================================================ + +If your app uses a variation of the "dirty rectangles" rendering technique, +where you only update a portion of the screen on each frame, you may notice a +variety of visual glitches on Android, that are not present on other platforms. +This is caused by SDL's use of EGL as the support system to handle OpenGL ES/ES2 +contexts, in particular the use of the eglSwapBuffers function. As stated in the +documentation for the function "The contents of ancillary buffers are always +undefined after calling eglSwapBuffers". +Setting the EGL_SWAP_BEHAVIOR attribute of the surface to EGL_BUFFER_PRESERVED +is not possible for SDL as it requires EGL 1.4, available only on the API level +17+, so the only workaround available on this platform is to redraw the entire +screen each frame. + +Reference: http://www.khronos.org/registry/egl/specs/EGLTechNote0001.html + + +Ending your application +================================================================================ + +Two legitimate ways: + +- return from your main() function. Java side will automatically terminate the +Activity by calling Activity.finish(). + +- Android OS can decide to terminate your application by calling onDestroy() +(see Activity life cycle). Your application will receive a SDL_QUIT event you +can handle to save things and quit. + +Don't call exit() as it stops the activity badly. + +NB: "Back button" can be handled as a SDL_KEYDOWN/UP events, with Keycode +SDLK_AC_BACK, for any purpose. + +Known issues +================================================================================ + +- The number of buttons reported for each joystick is hardcoded to be 36, which +is the current maximum number of buttons Android can report. + diff --git a/Thirdparty/SDL2/docs/README-cmake.md b/Thirdparty/SDL2/docs/README-cmake.md new file mode 100644 index 0000000..8f2aa7c --- /dev/null +++ b/Thirdparty/SDL2/docs/README-cmake.md @@ -0,0 +1,163 @@ +# CMake + +(www.cmake.org) + +SDL's build system was traditionally based on autotools. Over time, this +approach has suffered from several issues across the different supported +platforms. +To solve these problems, a new build system based on CMake was introduced. +It is developed in parallel to the legacy autotools build system, so users +can experiment with it without complication. + +The CMake build system is supported on the following platforms: + +* FreeBSD +* Linux +* Microsoft Visual C +* MinGW and Msys +* macOS, iOS, and tvOS, with support for XCode +* Android +* Emscripten +* RiscOS +* Playstation Vita + +## Building SDL + +Assuming the source for SDL is located at `~/sdl` +```sh +cd ~ +mkdir build +cd build +cmake ~/sdl +cmake --build . +``` + +This will build the static and dynamic versions of SDL in the `~/build` directory. +Installation can be done using: + +```sh +cmake --install . # '--install' requires CMake 3.15, or newer +``` + +## Including SDL in your project + +SDL can be included in your project in 2 major ways: +- using a system SDL library, provided by your (*nix) distribution or a package manager +- using a vendored SDL library: this is SDL copied or symlinked in a subfolder. + +The following CMake script supports both, depending on the value of `MYGAME_VENDORED`. + +```cmake +cmake_minimum_required(VERSION 3.0) +project(mygame) + +# Create an option to switch between a system sdl library and a vendored sdl library +option(MYGAME_VENDORED "Use vendored libraries" OFF) + +if(MYGAME_VENDORED) + add_subdirectory(vendored/sdl EXCLUDE_FROM_ALL) +else() + # 1. Look for a SDL2 package, 2. look for the SDL2 component and 3. fail if none can be found + find_package(SDL2 REQUIRED CONFIG REQUIRED COMPONENTS SDL2) + + # 1. Look for a SDL2 package, 2. Look for the SDL2maincomponent and 3. DO NOT fail when SDL2main is not available + find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2main) +endif() + +# Create your game executable target as usual +add_executable(mygame WIN32 mygame.c) + +# SDL2::SDL2main may or may not be available. It is e.g. required by Windows GUI applications +if(TARGET SDL2::SDL2main) + # It has an implicit dependency on SDL2 functions, so it MUST be added before SDL2::SDL2 (or SDL2::SDL2-static) + target_link_libraries(mygame PRIVATE SDL2::SDL2main) +endif() + +# Link to the actual SDL2 library. SDL2::SDL2 is the shared SDL library, SDL2::SDL2-static is the static SDL libarary. +target_link_libraries(mygame PRIVATE SDL2::SDL2) +``` + +### A system SDL library + +For CMake to find SDL, it must be installed in [a default location CMake is looking for](https://cmake.org/cmake/help/latest/command/find_package.html#config-mode-search-procedure). + +The following components are available, to be used as an argument of `find_package`. + +| Component name | Description | +|----------------|--------------------------------------------------------------------------------------------| +| SDL2 | The SDL2 shared library, available through the `SDL2::SDL2` target [^SDL_TARGET_EXCEPTION] | +| SDL2-static | The SDL2 static library, available through the `SDL2::SDL2-static` target | +| SDL2main | The SDL2main static library, available through the `SDL2::SDL2main` target | +| SDL2test | The SDL2test static library, available through the `SDL2::SDL2test` target | + +### Using a vendored SDL + +This only requires a copy of SDL in a subdirectory. + +## CMake configuration options for platforms + +### iOS/tvOS + +CMake 3.14+ natively includes support for iOS and tvOS. SDL binaries may be built +using Xcode or Make, possibly among other build-systems. + +When using a recent version of CMake (3.14+), it should be possible to: + +- build SDL for iOS, both static and dynamic +- build SDL test apps (as iOS/tvOS .app bundles) +- generate a working SDL_config.h for iOS (using SDL_config.h.cmake as a basis) + +To use, set the following CMake variables when running CMake's configuration stage: + +- `CMAKE_SYSTEM_NAME=` (either `iOS` or `tvOS`) +- `CMAKE_OSX_SYSROOT=` (examples: `iphoneos`, `iphonesimulator`, `iphoneos12.4`, `/full/path/to/iPhoneOS.sdk`, + `appletvos`, `appletvsimulator`, `appletvos12.4`, `/full/path/to/AppleTVOS.sdk`, etc.) +- `CMAKE_OSX_ARCHITECTURES=` (example: "arm64;armv7s;x86_64") + + +#### Examples + +- for iOS-Simulator, using the latest, installed SDK: + + ```bash + cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 + ``` + +- for iOS-Device, using the latest, installed SDK, 64-bit only + + ```bash + cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64 + ``` + +- for iOS-Device, using the latest, installed SDK, mixed 32/64 bit + + ```cmake + cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s" + ``` + +- for iOS-Device, using a specific SDK revision (iOS 12.4, in this example): + + ```cmake + cmake ~/sdl -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos12.4 -DCMAKE_OSX_ARCHITECTURES=arm64 + ``` + +- for iOS-Simulator, using the latest, installed SDK, and building SDL test apps (as .app bundles): + + ```cmake + cmake ~/sdl -DSDL_TESTS=1 -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 + ``` + +- for tvOS-Simulator, using the latest, installed SDK: + + ```cmake + cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_ARCHITECTURES=x86_64 + ``` + +- for tvOS-Device, using the latest, installed SDK: + + ```cmake + cmake ~/sdl -DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_ARCHITECTURES=arm64` + ``` + + +[^SDL_TARGET_EXCEPTION]: `SDL2::SDL2` can be an ALIAS to a static `SDL2::SDL2-static` target for multiple reasons. diff --git a/Thirdparty/SDL2/docs/README-directfb.md b/Thirdparty/SDL2/docs/README-directfb.md new file mode 100644 index 0000000..c41cab2 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-directfb.md @@ -0,0 +1,123 @@ +DirectFB +======== + +Supports: + +- Hardware YUV overlays +- OpenGL - software only +- 2D/3D accelerations (depends on directfb driver) +- multiple displays +- windows + +What you need: + +* DirectFB 1.0.1, 1.2.x, 1.3.0 +* Kernel-Framebuffer support: required: vesafb, radeonfb .... +* Mesa 7.0.x - optional for OpenGL + +The `/etc/directfbrc` file should contain the following lines to make +your joystick work and avoid crashes: + +``` +disable-module=joystick +disable-module=cle266 +disable-module=cyber5k +no-linux-input-grab +``` + +To disable to use x11 backend when DISPLAY variable is found use + +``` +export SDL_DIRECTFB_X11_CHECK=0 +``` + +To disable the use of linux input devices, i.e. multimice/multikeyboard support, +use + +``` +export SDL_DIRECTFB_LINUX_INPUT=0 +``` + +To use hardware accelerated YUV-overlays for YUV-textures, use: + +``` +export SDL_DIRECTFB_YUV_DIRECT=1 +``` + +This is disabled by default. It will only support one +YUV texture, namely the first. Every other YUV texture will be +rendered in software. + +In addition, you may use (directfb-1.2.x) + +``` +export SDL_DIRECTFB_YUV_UNDERLAY=1 +``` + +to make the YUV texture an underlay. This will make the cursor to +be shown. + +Simple Window Manager +===================== + +The driver has support for a very, very basic window manager you may +want to use when running with `wm=default`. Use + +``` +export SDL_DIRECTFB_WM=1 +``` + +to enable basic window borders. In order to have the window title rendered, +you need to have the following font installed: + +``` +/usr/share/fonts/truetype/freefont/FreeSans.ttf +``` + +OpenGL Support +============== + +The following instructions will give you *software* OpenGL. However this +works at least on all directfb supported platforms. + +As of this writing 20100802 you need to pull Mesa from git and do the following: + +``` +git clone git://anongit.freedesktop.org/git/mesa/mesa +cd mesa +git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a +``` + +Edit `configs/linux-directfb` so that the Directories-section looks like this: + +``` +# Directories +SRC_DIRS = mesa glu +GLU_DIRS = sgi +DRIVER_DIRS = directfb +PROGRAM_DIRS = +``` + +Then do the following: + +``` +make linux-directfb +make + +echo Installing - please enter sudo pw. + +sudo make install INSTALL_DIR=/usr/local/dfb_GL +cd src/mesa/drivers/directfb +make +sudo make install INSTALL_DIR=/usr/local/dfb_GL +``` + +To run the SDL - testprograms: + +``` +export SDL_VIDEODRIVER=directfb +export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib +export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7 + +./testgl +``` diff --git a/Thirdparty/SDL2/docs/README-dynapi.md b/Thirdparty/SDL2/docs/README-dynapi.md new file mode 100644 index 0000000..8eb6fb2 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-dynapi.md @@ -0,0 +1,138 @@ +# Dynamic API + +Originally posted on Ryan's Google+ account. + +Background: + +- The Steam Runtime has (at least in theory) a really kick-ass build of SDL2, + but developers are shipping their own SDL2 with individual Steam games. + These games might stop getting updates, but a newer SDL2 might be needed later. + Certainly we'll always be fixing bugs in SDL, even if a new video target isn't + ever needed, and these fixes won't make it to a game shipping its own SDL. +- Even if we replace the SDL2 in those games with a compatible one, that is to + say, edit a developer's Steam depot (yuck!), there are developers that are + statically linking SDL2 that we can't do this for. We can't even force the + dynamic loader to ignore their SDL2 in this case, of course. +- If you don't ship an SDL2 with the game in some form, people that disabled the + Steam Runtime, or just tried to run the game from the command line instead of + Steam might find themselves unable to run the game, due to a missing dependency. +- If you want to ship on non-Steam platforms like GOG or Humble Bundle, or target + generic Linux boxes that may or may not have SDL2 installed, you have to ship + the library or risk a total failure to launch. So now, you might have to have + a non-Steam build plus a Steam build (that is, one with and one without SDL2 + included), which is inconvenient if you could have had one universal build + that works everywhere. +- We like the zlib license, but the biggest complaint from the open source + community about the license change is the static linking. The LGPL forced this + as a legal, not technical issue, but zlib doesn't care. Even those that aren't + concerned about the GNU freedoms found themselves solving the same problems: + swapping in a newer SDL to an older game often times can save the day. + Static linking stops this dead. + +So here's what we did: + +SDL now has, internally, a table of function pointers. So, this is what SDL_Init +now looks like: + +```c +UInt32 SDL_Init(Uint32 flags) +{ + return jump_table.SDL_Init(flags); +} +``` + +Except that is all done with a bunch of macro magic so we don't have to maintain +every one of these. + +What is jump_table.SDL_init()? Eventually, that's a function pointer of the real +SDL_Init() that you've been calling all this time. But at startup, it looks more +like this: + +```c +Uint32 SDL_Init_DEFAULT(Uint32 flags) +{ + SDL_InitDynamicAPI(); + return jump_table.SDL_Init(flags); +} +``` + +SDL_InitDynamicAPI() fills in jump_table with all the actual SDL function +pointers, which means that this `_DEFAULT` function never gets called again. +First call to any SDL function sets the whole thing up. + +So you might be asking, what was the value in that? Isn't this what the operating +system's dynamic loader was supposed to do for us? Yes, but now we've got this +level of indirection, we can do things like this: + +```bash +export SDL_DYNAMIC_API=/my/actual/libSDL-2.0.so.0 +./MyGameThatIsStaticallyLinkedToSDL2 +``` + +And now, this game that is statically linked to SDL, can still be overridden +with a newer, or better, SDL. The statically linked one will only be used as +far as calling into the jump table in this case. But in cases where no override +is desired, the statically linked version will provide its own jump table, +and everyone is happy. + +So now: +- Developers can statically link SDL, and users can still replace it. + (We'd still rather you ship a shared library, though!) +- Developers can ship an SDL with their game, Valve can override it for, say, + new features on SteamOS, or distros can override it for their own needs, + but it'll also just work in the default case. +- Developers can ship the same package to everyone (Humble Bundle, GOG, etc), + and it'll do the right thing. +- End users (and Valve) can update a game's SDL in almost any case, + to keep abandoned games running on newer platforms. +- Everyone develops with SDL exactly as they have been doing all along. + Same headers, same ABI. Just get the latest version to enable this magic. + + +A little more about SDL_InitDynamicAPI(): + +Internally, InitAPI does some locking to make sure everything waits until a +single thread initializes everything (although even SDL_CreateThread() goes +through here before spinning a thread, too), and then decides if it should use +an external SDL library. If not, it sets up the jump table using the current +SDL's function pointers (which might be statically linked into a program, or in +a shared library of its own). If so, it loads that library and looks for and +calls a single function: + +```c +SInt32 SDL_DYNAPI_entry(Uint32 version, void *table, Uint32 tablesize); +``` + +That function takes a version number (more on that in a moment), the address of +the jump table, and the size, in bytes, of the table. +Now, we've got policy here: this table's layout never changes; new stuff gets +added to the end. Therefore SDL_DYNAPI_entry() knows that it can provide all +the needed functions if tablesize <= sizeof its own jump table. If tablesize is +bigger (say, SDL 2.0.4 is trying to load SDL 2.0.3), then we know to abort, but +if it's smaller, we know we can provide the entire API that the caller needs. + +The version variable is a failsafe switch. +Right now it's always 1. This number changes when there are major API changes +(so we know if the tablesize might be smaller, or entries in it have changed). +Right now SDL_DYNAPI_entry gives up if the version doesn't match, but it's not +inconceivable to have a small dispatch library that only supplies this one +function and loads different, otherwise-incompatible SDL libraries and has the +right one initialize the jump table based on the version. For something that +must generically catch lots of different versions of SDL over time, like the +Steam Client, this isn't a bad option. + +Finally, I'm sure some people are reading this and thinking, +"I don't want that overhead in my project!" + +To which I would point out that the extra function call through the jump table +probably wouldn't even show up in a profile, but lucky you: this can all be +disabled. You can build SDL without this if you absolutely must, but we would +encourage you not to do that. However, on heavily locked down platforms like +iOS, or maybe when debugging, it makes sense to disable it. The way this is +designed in SDL, you just have to change one #define, and the entire system +vaporizes out, and SDL functions exactly like it always did. Most of it is +macro magic, so the system is contained to one C file and a few headers. +However, this is on by default and you have to edit a header file to turn it +off. Our hopes is that if we make it easy to disable, but not too easy, +everyone will ultimately be able to get what they want, but we've gently +nudged everyone towards what we think is the best solution. diff --git a/Thirdparty/SDL2/docs/README-emscripten.md b/Thirdparty/SDL2/docs/README-emscripten.md new file mode 100644 index 0000000..82aa720 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-emscripten.md @@ -0,0 +1,76 @@ +# Emscripten + +(This documentation is not very robust; we will update and expand this later.) + +## A quick note about audio + +Modern web browsers will not permit web pages to produce sound before the +user has interacted with them; this is for several reasons, not the least +of which being that no one likes when a random browser tab suddenly starts +making noise and the user has to scramble to figure out which and silence +it. + +To solve this, most browsers will refuse to let a web app use the audio +subsystem at all before the user has interacted with (clicked on) the page +in a meaningful way. SDL-based apps also have to deal with this problem; if +the user hasn't interacted with the page, SDL_OpenAudioDevice will fail. + +There are two reasonable ways to deal with this: if you are writing some +sort of media player thing, where the user expects there to be a volume +control when you mouseover the canvas, just default that control to a muted +state; if the user clicks on the control to unmute it, on this first click, +open the audio device. This allows the media to play at start, the user can +reasonably opt-in to listening, and you never get access denied to the audio +device. + +Many games do not have this sort of UI, and are more rigid about starting +audio along with everything else at the start of the process. For these, your +best bet is to write a little Javascript that puts up a "Click here to play!" +UI, and upon the user clicking, remove that UI and then call the Emscripten +app's main() function. As far as the application knows, the audio device was +available to be opened as soon as the program started, and since this magic +happens in a little Javascript, you don't have to change your C/C++ code at +all to make it happen. + +Please see the discussion at https://github.com/libsdl-org/SDL/issues/6385 +for some Javascript code to steal for this approach. + + +## Building SDL/emscripten + +SDL currently requires at least Emscripten 2.0.32 to build. Newer versions +are likely to work, as well. + + +Build: + + $ mkdir build + $ cd build + $ emconfigure ../configure --host=asmjs-unknown-emscripten --disable-assembly --disable-threads --disable-cpuinfo CFLAGS="-O2" + $ emmake make + +Or with cmake: + + $ mkdir build + $ cd build + $ emcmake cmake .. + $ emmake make + +To build one of the tests: + + $ cd test/ + $ emcc -O2 --js-opts 0 -g4 testdraw2.c -I../include ../build/.libs/libSDL2.a ../build/libSDL2_test.a -o a.html + +Uses GLES2 renderer or software + +Some other SDL2 libraries can be easily built (assuming SDL2 is installed somewhere): + +SDL_mixer (http://www.libsdl.org/projects/SDL_mixer/): + + $ EMCONFIGURE_JS=1 emconfigure ../configure + build as usual... + +SDL_gfx (http://cms.ferzkopp.net/index.php/software/13-sdl-gfx): + + $ EMCONFIGURE_JS=1 emconfigure ../configure --disable-mmx + build as usual... diff --git a/Thirdparty/SDL2/docs/README-gdk.md b/Thirdparty/SDL2/docs/README-gdk.md new file mode 100644 index 0000000..903265f --- /dev/null +++ b/Thirdparty/SDL2/docs/README-gdk.md @@ -0,0 +1,155 @@ +GDK +===== + +This port allows SDL applications to run via Microsoft's Game Development Kit (GDK). + +Windows (GDK) and Xbox One/Xbox Series (GDKX) are supported. Although most of the Xbox code is included in the public SDL source code, NDA access is required for a small number of source files. If you have access to GDKX, these required Xbox files are posted on the GDK forums [here](https://forums.xboxlive.com/questions/130003/). + + +Requirements +------------ + +* Microsoft Visual Studio 2022 (in theory, it should also work in 2017 or 2019, but this has not been tested) +* Microsoft GDK June 2022 or newer (public release [here](https://github.com/microsoft/GDK/releases/tag/June_2022)) +* To publish a package or successfully authenticate a user, you will need to create an app id/configure services in Partner Center. However, for local testing purposes (without authenticating on Xbox Live), the identifiers used by the GDK test programs in the included solution will work. + + +Windows GDK Status +------ + +The Windows GDK port supports the full set of Win32 APIs, renderers, controllers, input devices, etc., as the normal Windows x64 build of SDL. + +* Additionally, the GDK port adds the following: + * Compile-time platform detection for SDL programs. The `__GDK__` is `#define`d on every GDK platform, and the `__WINGDK__` is `#define`d on Windows GDK, specifically. (This distinction exists because other GDK platforms support a smaller subset of functionality. This allows you to mark code for "any" GDK separate from Windows GDK.) + * GDK-specific setup: + * Initializing/uninitializing the game runtime, and initializing Xbox Live services + * Creating a global task queue and setting it as the default for the process. When running any async operations, passing in `NULL` as the task queue will make the task get added to the global task queue. + + * An implementation on `WinMain` that performs the above GDK setup (you should link against SDL2main.lib, as in Windows x64). If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters. + * Global task queue callbacks are dispatched during `SDL_PumpEvents` (which is also called internally if using `SDL_PollEvent`). + * You can get the handle of the global task queue through `SDL_GDKGetTaskQueue`, if needed. When done with the queue, be sure to use `XTaskQueueCloseHandle` to decrement the reference count (otherwise it will cause a resource leak). + +* What doesn't work: + * Compilation with anything other than through the included Visual C++ solution file + +## VisualC-GDK Solution + +The included `VisualC-GDK/SDL.sln` solution includes the following targets for the Gaming.Desktop.x64 configuration: + +* SDL2 (DLL) - This is the typical SDL2.dll, but for Gaming.Desktop.x64. +* SDL2main (lib) - This contains a drop-in implementation of `WinMain` that is used as the entry point for GDK programs. +* tests/testgamecontroller - Standard SDL test program demonstrating controller functionality. +* tests/testgdk - GDK-specific test program that demonstrates using the global task queue to login a user into Xbox Live. + *NOTE*: As of the June 2022 GDK, you cannot test user logins without a valid Title ID and MSAAppId. You will need to manually change the identifiers in the `MicrosoftGame.config` to your valid IDs from Partner Center if you wish to test this. +* tests/testsprite2 - Standard SDL test program demonstrating sprite drawing functionality. + +If you set one of the test programs as a startup project, you can run it directly from Visual Studio. + +Windows GDK Setup, Detailed Steps +--------------------- + +These steps assume you already have a game using SDL that runs on Windows x64 along with a corresponding Visual Studio solution file for the x64 version. If you don't have this, it's easiest to use one of the test program vcxproj files in the `VisualC-GDK` directory as a starting point, though you will still need to do most of the steps below. + +### 1. Add a Gaming.Desktop.x64 Configuration ### + +In your game's existing Visual Studio Solution, go to Build > Configuration Manager. From the "Active solution platform" drop-down select "New...". From the drop-down list, select Gaming.Desktop.x64 and copy the settings from the x64 configuration. + +### 2. Build SDL2 and SDL2main for GDK ### + +Open `VisualC-GDK/SDL.sln` in Visual Studio, you need to build the SDL2 and SDL2main targets for the Gaming.Desktop.x64 platform (Release is recommended). You will need to copy/keep track of the `SDL2.dll`, `XCurl.dll` (which is output by Gaming.Desktop.x64), `SDL2.lib`, and `SDL2main.lib` output files for your game project. + +*Alternatively*, you could setup your solution file to instead reference the SDL2/SDL2main project file targets from the SDL source, and add those projects as a dependency. This would mean that SDL2 and SDL2main would both be built when your game is built. + +### 3. Configuring Project Settings ### + +While the Gaming.Desktop.x64 configuration sets most of the required settings, there are some additional items to configure for your game project under the Gaming.Desktop.x64 Configuration: + +* Under C/C++ > General > Additional Include Directories, make sure the `SDL/include` path is referenced +* Under Linker > General > Additional Library Directories, make sure to reference the path where the newly-built SDL2.lib and SDL2main.lib are +* Under Linker > Input > Additional Dependencies, you need the following: + * `SDL2.lib` + * `SDL2main.lib` (unless not using) + * `xgameruntime.lib` + * `../Microsoft.Xbox.Services.141.GDK.C.Thunks.lib` +* Note that in general, the GDK libraries depend on the MSVC C/C++ runtime, so there is no way to remove this dependency from a GDK program that links against GDK. + +### 4. Setting up SDL_main ### + +Rather than using your own implementation of `WinMain`, it's recommended that you instead `#include "SDL_main.h"` and declare a standard main function. If you are unable to do this, you can instead manually call `SDL_GDKRunApp` from your entry point, passing in your `SDL_main` function and `NULL` as the parameters. + +### 5. Required DLLs ### + +The game will not launch in the debugger unless required DLLs are included in the directory that contains the game's .exe file. You need to make sure that the following files are copied into the directory: + +* Your SDL2.dll +* "$(Console_GRDKExtLibRoot)Xbox.Services.API.C\DesignTime\CommonConfiguration\Neutral\Lib\Release\Microsoft.Xbox.Services.141.GDK.C.Thunks.dll" +* XCurl.dll + +You can either copy these in a post-build step, or you can add the dlls into the project and set its Configuration Properties > General > Item type to "Copy file," which will also copy them into the output directory. + +### 6. Setting up MicrosoftGame.config ### + +You can copy `VisualC-GDK/tests/testgdk/MicrosoftGame.config` and use that as a starting point in your project. Minimally, you will want to change the Executable Name attribute, the DefaultDisplayName, and the Description. + +This file must be copied into the same directory as the game's .exe file. As with the DLLs, you can either use a post-build step or the "Copy file" item type. + +For basic testing, you do not need to change anything else in `MicrosoftGame.config`. However, if you want to test any Xbox Live services (such as logging in users) _or_ publish a package, you will need to setup a Game app on Partner Center. + +Then, you need to set the following values to the values from Partner Center: + +* Identity tag - Name and Publisher attributes +* TitleId +* MSAAppId + +### 7. Adding Required Logos + +Several logo PNG files are required to be able to launch the game, even from the debugger. You can use the sample logos provided in `VisualC-GDK/logos`. As with the other files, they must be copied into the same directory as the game's .exe file. + + +### 8. Copying any Data Files ### + +When debugging GDK games, there is no way to specify a working directory. Therefore, any required game data must also be copied into the output directory, likely in a post-build step. + + +### 9. Build and Run from Visual Studio ### + +At this point, you should be able to build and run your game from the Visual Studio Debugger. If you get any linker errors, make sure you double-check that you referenced all the required libs. + +If you are testing Xbox Live functionality, it's likely you will need to change to the Sandbox for your title. To do this: + +1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu +2. Switch the sandbox name with: + `XblPCSandbox SANDBOX.#` +3. (To switch back to the retail sandbox): + `XblPCSandbox RETAIL` + +### 10. Packaging and Installing Locally + +You can use one of the test program's `PackageLayout.xml` as a starting point. Minimally, you will need to change the exe to the correct name and also reference any required game data. As with the other data files, it's easiest if you have this copy to the output directory, although it's not a requirement as you can specify relative paths to files. + +To create the package: + +1. Run "Desktop VS 2022 Gaming Command Prompt" from the Start Menu +2. `cd` to the directory containing the `PackageLayout.xml` with the correct paths (if you use the local path as in the sample package layout, this would be from your .exe output directory) +3. `mkdir Package` to create an output directory +4. To package the file into the `Package` directory, use: + `makepkg pack /f PackageLayout.xml /lt /d . /nogameos /pc /pd Package` +5. To install the package, use: + `wdapp install PACKAGENAME.msixvc` +6. Once the package is installed, you can run it from the start menu. +7. As with when running from Visual Studio, if you need to test any Xbox Live functionality you must switch to the correct sandbox. + + +Troubleshooting +--------------- + +#### Xbox Live Login does not work + +As of June 2022 GDK, you must have a valid Title Id and MSAAppId in order to test Xbox Live functionality such as user login. Make sure these are set correctly in the `MicrosoftGame.config`. This means that even testgdk will not let you login without setting these properties to valid values. + +Furthermore, confirm that your PC is set to the correct sandbox. + + +#### "The current user has already installed an unpackaged version of this app. A packaged version cannot replace this." error when installing + +Prior to June 2022 GDK, running from the Visual Studio debugger would still locally register the app (and it would appear on the start menu). To fix this, you have to uninstall it (it's simplest to right click on it from the start menu to uninstall it). diff --git a/Thirdparty/SDL2/docs/README-gesture.md b/Thirdparty/SDL2/docs/README-gesture.md new file mode 100644 index 0000000..ee6a0c5 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-gesture.md @@ -0,0 +1,71 @@ +Dollar Gestures +=========================================================================== +SDL provides an implementation of the $1 gesture recognition system. This allows for recording, saving, loading, and performing single stroke gestures. + +Gestures can be performed with any number of fingers (the centroid of the fingers must follow the path of the gesture), but the number of fingers must be constant (a finger cannot go down in the middle of a gesture). The path of a gesture is considered the path from the time when the final finger went down, to the first time any finger comes up. + +Dollar gestures are assigned an Id based on a hash function. This is guaranteed to remain constant for a given gesture. There is a (small) chance that two different gestures will be assigned the same ID. In this case, simply re-recording one of the gestures should result in a different ID. + +Recording: +---------- +To begin recording on a touch device call: +SDL_RecordGesture(SDL_TouchID touchId), where touchId is the id of the touch device you wish to record on, or -1 to record on all connected devices. + +Recording terminates as soon as a finger comes up. Recording is acknowledged by an SDL_DOLLARRECORD event. +A SDL_DOLLARRECORD event is a dgesture with the following fields: + +* event.dgesture.touchId - the Id of the touch used to record the gesture. +* event.dgesture.gestureId - the unique id of the recorded gesture. + + +Performing: +----------- +As long as there is a dollar gesture assigned to a touch, every finger-up event will also cause an SDL_DOLLARGESTURE event with the following fields: + +* event.dgesture.touchId - the Id of the touch which performed the gesture. +* event.dgesture.gestureId - the unique id of the closest gesture to the performed stroke. +* event.dgesture.error - the difference between the gesture template and the actual performed gesture. Lower error is a better match. +* event.dgesture.numFingers - the number of fingers used to draw the stroke. + +Most programs will want to define an appropriate error threshold and check to be sure that the error of a gesture is not abnormally high (an indicator that no gesture was performed). + + + +Saving: +------- +To save a template, call SDL_SaveDollarTemplate(gestureId, dst) where gestureId is the id of the gesture you want to save, and dst is an SDL_RWops pointer to the file where the gesture will be stored. + +To save all currently loaded templates, call SDL_SaveAllDollarTemplates(dst) where dst is an SDL_RWops pointer to the file where the gesture will be stored. + +Both functions return the number of gestures successfully saved. + + +Loading: +-------- +To load templates from a file, call SDL_LoadDollarTemplates(touchId,src) where touchId is the id of the touch to load to (or -1 to load to all touch devices), and src is an SDL_RWops pointer to a gesture save file. + +SDL_LoadDollarTemplates returns the number of templates successfully loaded. + + + +=========================================================================== +Multi Gestures +=========================================================================== +SDL provides simple support for pinch/rotate/swipe gestures. +Every time a finger is moved an SDL_MULTIGESTURE event is sent with the following fields: + +* event.mgesture.touchId - the Id of the touch on which the gesture was performed. +* event.mgesture.x - the normalized x coordinate of the gesture. (0..1) +* event.mgesture.y - the normalized y coordinate of the gesture. (0..1) +* event.mgesture.dTheta - the amount that the fingers rotated during this motion. +* event.mgesture.dDist - the amount that the fingers pinched during this motion. +* event.mgesture.numFingers - the number of fingers used in the gesture. + + +=========================================================================== +Notes +=========================================================================== +For a complete example see test/testgesture.c + +Please direct questions/comments to: + jim.tla+sdl_touch@gmail.com diff --git a/Thirdparty/SDL2/docs/README-git.md b/Thirdparty/SDL2/docs/README-git.md new file mode 100644 index 0000000..3f03488 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-git.md @@ -0,0 +1,19 @@ +git +========= + +The latest development version of SDL is available via git. +Git allows you to get up-to-the-minute fixes and enhancements; +as a developer works on a source tree, you can use "git" to mirror that +source tree instead of waiting for an official release. Please look +at the Git website ( https://git-scm.com/ ) for more +information on using git, where you can also download software for +macOS, Windows, and Unix systems. + + git clone https://github.com/libsdl-org/SDL + +If you are building SDL via configure, you will need to run autogen.sh +before running configure. + +There is a web interface to the Git repository at: + http://github.com/libsdl-org/SDL/ + diff --git a/Thirdparty/SDL2/docs/README-hg.md b/Thirdparty/SDL2/docs/README-hg.md new file mode 100644 index 0000000..4e35683 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-hg.md @@ -0,0 +1,4 @@ +We are no longer hosted in Mercurial. Please see README-git.md for details. + +Thanks! + diff --git a/Thirdparty/SDL2/docs/README-ios.md b/Thirdparty/SDL2/docs/README-ios.md new file mode 100644 index 0000000..f5a3a83 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-ios.md @@ -0,0 +1,307 @@ +iOS +====== + +Building the Simple DirectMedia Layer for iOS 9.0+ +============================================================================== + +Requirements: Mac OS X 10.9 or later and the iOS 9.0 or newer SDK. + +Instructions: + +1. Open SDL.xcodeproj (located in Xcode/SDL) in Xcode. +2. Select your desired target, and hit build. + + +Using the Simple DirectMedia Layer for iOS +============================================================================== + +1. Run Xcode and create a new project using the iOS Game template, selecting the Objective C language and Metal game technology. +2. In the main view, delete all files except for Assets and LaunchScreen +3. Right click the project in the main view, select "Add Files...", and add the SDL project, Xcode/SDL/SDL.xcodeproj +4. Select the project in the main view, go to the "Info" tab and under "Custom iOS Target Properties" remove the line "Main storyboard file base name" +5. Select the project in the main view, go to the "Build Settings" tab, select "All", and edit "Header Search Path" and drag over the SDL "Public Headers" folder from the left +6. Select the project in the main view, go to the "Build Phases" tab, select "Link Binary With Libraries", and add SDL2.framework from "Framework-iOS" +7. Select the project in the main view, go to the "General" tab, scroll down to "Frameworks, Libraries, and Embedded Content", and select "Embed & Sign" for the SDL library. +8. In the main view, expand SDL -> Library Source -> main -> uikit and drag SDL_uikit_main.c into your game files +9. Add the source files that you would normally have for an SDL program, making sure to have #include "SDL.h" at the top of the file containing your main() function. +10. Add any assets that your application needs. +11. Enjoy! + + +TODO: Add information regarding App Store requirements such as icons, etc. + + +Notes -- Retina / High-DPI and window sizes +============================================================================== + +Window and display mode sizes in SDL are in "screen coordinates" (or "points", +in Apple's terminology) rather than in pixels. On iOS this means that a window +created on an iPhone 6 will have a size in screen coordinates of 375 x 667, +rather than a size in pixels of 750 x 1334. All iOS apps are expected to +size their content based on screen coordinates / points rather than pixels, +as this allows different iOS devices to have different pixel densities +(Retina versus non-Retina screens, etc.) without apps caring too much. + +By default SDL will not use the full pixel density of the screen on +Retina/high-dpi capable devices. Use the SDL_WINDOW_ALLOW_HIGHDPI flag when +creating your window to enable high-dpi support. + +When high-dpi support is enabled, SDL_GetWindowSize() and display mode sizes +will still be in "screen coordinates" rather than pixels, but the window will +have a much greater pixel density when the device supports it, and the +SDL_GL_GetDrawableSize() or SDL_GetRendererOutputSize() functions (depending on +whether raw OpenGL or the SDL_Render API is used) can be queried to determine +the size in pixels of the drawable screen framebuffer. + +Some OpenGL ES functions such as glViewport expect sizes in pixels rather than +sizes in screen coordinates. When doing 2D rendering with OpenGL ES, an +orthographic projection matrix using the size in screen coordinates +(SDL_GetWindowSize()) can be used in order to display content at the same scale +no matter whether a Retina device is used or not. + + +Notes -- Application events +============================================================================== + +On iOS the application goes through a fixed life cycle and you will get +notifications of state changes via application events. When these events +are delivered you must handle them in an event callback because the OS may +not give you any processing time after the events are delivered. + +e.g. + + int HandleAppEvents(void *userdata, SDL_Event *event) + { + switch (event->type) + { + case SDL_APP_TERMINATING: + /* Terminate the app. + Shut everything down before returning from this function. + */ + return 0; + case SDL_APP_LOWMEMORY: + /* You will get this when your app is paused and iOS wants more memory. + Release as much memory as possible. + */ + return 0; + case SDL_APP_WILLENTERBACKGROUND: + /* Prepare your app to go into the background. Stop loops, etc. + This gets called when the user hits the home button, or gets a call. + */ + return 0; + case SDL_APP_DIDENTERBACKGROUND: + /* This will get called if the user accepted whatever sent your app to the background. + If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. + When you get this, you have 5 seconds to save all your state or the app will be terminated. + Your app is NOT active at this point. + */ + return 0; + case SDL_APP_WILLENTERFOREGROUND: + /* This call happens when your app is coming back to the foreground. + Restore all your state here. + */ + return 0; + case SDL_APP_DIDENTERFOREGROUND: + /* Restart your loops here. + Your app is interactive and getting CPU again. + */ + return 0; + default: + /* No special processing, add it to the event queue */ + return 1; + } + } + + int main(int argc, char *argv[]) + { + SDL_SetEventFilter(HandleAppEvents, NULL); + + ... run your main loop + + return 0; + } + + +Notes -- Accelerometer as Joystick +============================================================================== + +SDL for iPhone supports polling the built in accelerometer as a joystick device. For an example on how to do this, see the accelerometer.c in the demos directory. + +The main thing to note when using the accelerometer with SDL is that while the iPhone natively reports accelerometer as floating point values in units of g-force, SDL_JoystickGetAxis() reports joystick values as signed integers. Hence, in order to convert between the two, some clamping and scaling is necessary on the part of the iPhone SDL joystick driver. To convert SDL_JoystickGetAxis() reported values BACK to units of g-force, simply multiply the values by SDL_IPHONE_MAX_GFORCE / 0x7FFF. + + +Notes -- OpenGL ES +============================================================================== + +Your SDL application for iOS uses OpenGL ES for video by default. + +OpenGL ES for iOS supports several display pixel formats, such as RGBA8 and RGB565, which provide a 32 bit and 16 bit color buffer respectively. By default, the implementation uses RGB565, but you may use RGBA8 by setting each color component to 8 bits in SDL_GL_SetAttribute(). + +If your application doesn't use OpenGL's depth buffer, you may find significant performance improvement by setting SDL_GL_DEPTH_SIZE to 0. + +Finally, if your application completely redraws the screen each frame, you may find significant performance improvement by setting the attribute SDL_GL_RETAINED_BACKING to 0. + +OpenGL ES on iOS doesn't use the traditional system-framebuffer setup provided in other operating systems. Special care must be taken because of this: + +- The drawable Renderbuffer must be bound to the GL_RENDERBUFFER binding point when SDL_GL_SwapWindow() is called. +- The drawable Framebuffer Object must be bound while rendering to the screen and when SDL_GL_SwapWindow() is called. +- If multisample antialiasing (MSAA) is used and glReadPixels is used on the screen, the drawable framebuffer must be resolved to the MSAA resolve framebuffer (via glBlitFramebuffer or glResolveMultisampleFramebufferAPPLE), and the MSAA resolve framebuffer must be bound to the GL_READ_FRAMEBUFFER binding point, before glReadPixels is called. + +The above objects can be obtained via SDL_GetWindowWMInfo() (in SDL_syswm.h). + + +Notes -- Keyboard +============================================================================== + +The SDL keyboard API has been extended to support on-screen keyboards: + +void SDL_StartTextInput() + -- enables text events and reveals the onscreen keyboard. + +void SDL_StopTextInput() + -- disables text events and hides the onscreen keyboard. + +SDL_bool SDL_IsTextInputActive() + -- returns whether or not text events are enabled (and the onscreen keyboard is visible) + + +Notes -- Mouse +============================================================================== + +iOS now supports Bluetooth mice on iPad, but by default will provide the mouse input as touch. In order for SDL to see the real mouse events, you should set the key UIApplicationSupportsIndirectInputEvents to true in your Info.plist + + +Notes -- Reading and Writing files +============================================================================== + +Each application installed on iPhone resides in a sandbox which includes its own Application Home directory. Your application may not access files outside this directory. + +Once your application is installed its directory tree looks like: + + MySDLApp Home/ + MySDLApp.app + Documents/ + Library/ + Preferences/ + tmp/ + +When your SDL based iPhone application starts up, it sets the working directory to the main bundle (MySDLApp Home/MySDLApp.app), where your application resources are stored. You cannot write to this directory. Instead, I advise you to write document files to "../Documents/" and preferences to "../Library/Preferences". + +More information on this subject is available here: +http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html + + +Notes -- xcFramework +============================================================================== + +The SDL.xcodeproj file now includes a target to build SDL2.xcframework. An xcframework is a new (Xcode 11) uber-framework which can handle any combination of processor type and target OS platform. + +In the past, iOS devices were always an ARM variant processor, and the simulator was always i386 or x86_64, and thus libraries could be combined into a single framework for both simulator and device. With the introduction of the Apple Silicon ARM-based machines, regular frameworks would collide as CPU type was no longer sufficient to differentiate the platform. So Apple created the new xcframework library package. + +The xcframework target builds into a Products directory alongside the SDL.xcodeproj file, as SDL2.xcframework. This can be brought in to any iOS project and will function properly for both simulator and device, no matter their CPUs. Note that Intel Macs cannot cross-compile for Apple Silicon Macs. If you need AS compatibility, perform this build on an Apple Silicon Mac. + +This target requires Xcode 11 or later. The target will simply fail to build if attempted on older Xcodes. + +In addition, on Apple platforms, main() cannot be in a dynamically loaded library. This means that iOS apps which used the statically-linked libSDL2.lib and now link with the xcframwork will need to define their own main() to call SDL_UIKitRunApp(), like this: + +#ifndef SDL_MAIN_HANDLED +#ifdef main +#undef main +#endif + +int +main(int argc, char *argv[]) +{ + return SDL_UIKitRunApp(argc, argv, SDL_main); +} +#endif /* !SDL_MAIN_HANDLED */ + +Using an xcFramework is similar to using a regular framework. However, issues have been seen with the build system not seeing the headers in the xcFramework. To remedy this, add the path to the xcFramework in your app's target ==> Build Settings ==> Framework Search Paths and mark it recursive (this is critical). Also critical is to remove "*.framework" from Build Settings ==> Sub-Directories to Exclude in Recursive Searches. Clean the build folder, and on your next build the build system should be able to see any of these in your code, as expected: + +#include "SDL_main.h" +#include +#include + + +Notes -- iPhone SDL limitations +============================================================================== + +Windows: + Full-size, single window applications only. You cannot create multi-window SDL applications for iPhone OS. The application window will fill the display, though you have the option of turning on or off the menu-bar (pass SDL_CreateWindow() the flag SDL_WINDOW_BORDERLESS). + +Textures: + The optimal texture formats on iOS are SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_BGR888, and SDL_PIXELFORMAT_RGB24 pixel formats. + +Loading Shared Objects: + This is disabled by default since it seems to break the terms of the iOS SDK agreement for iOS versions prior to iOS 8. It can be re-enabled in SDL_config_iphoneos.h. + + +Notes -- CoreBluetooth.framework +============================================================================== + +SDL_JOYSTICK_HIDAPI is disabled by default. It can give you access to a lot +more game controller devices, but it requires permission from the user before +your app will be able to talk to the Bluetooth hardware. "Made For iOS" +branded controllers do not need this as we don't have to speak to them +directly with raw bluetooth, so many apps can live without this. + +You'll need to link with CoreBluetooth.framework and add something like this +to your Info.plist: + +NSBluetoothPeripheralUsageDescription +MyApp would like to remain connected to nearby bluetooth Game Controllers and Game Pads even when you're not using the app. + + +Game Center +============================================================================== + +Game Center integration might require that you break up your main loop in order to yield control back to the system. In other words, instead of running an endless main loop, you run each frame in a callback function, using: + + int SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (*callback)(void*), void *callbackParam); + +This will set up the given function to be called back on the animation callback, and then you have to return from main() to let the Cocoa event loop run. + +e.g. + + extern "C" + void ShowFrame(void*) + { + ... do event handling, frame logic and rendering ... + } + + int main(int argc, char *argv[]) + { + ... initialize game ... + + #if __IPHONEOS__ + // Initialize the Game Center for scoring and matchmaking + InitGameCenter(); + + // Set up the game to run in the window animation callback on iOS + // so that Game Center and so forth works correctly. + SDL_iPhoneSetAnimationCallback(window, 1, ShowFrame, NULL); + #else + while ( running ) { + ShowFrame(0); + DelayFrame(); + } + #endif + return 0; + } + + +Deploying to older versions of iOS +============================================================================== + +SDL supports deploying to older versions of iOS than are supported by the latest version of Xcode, all the way back to iOS 8.0 + +In order to do that you need to download an older version of Xcode: +https://developer.apple.com/download/more/?name=Xcode + +Open the package contents of the older Xcode and your newer version of Xcode and copy over the folders in Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport + +Then open the file Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist and add the versions of iOS you want to deploy to the key Root/DefaultProperties/DEPLOYMENT_TARGET_SUGGESTED_VALUES + +Open your project and set your deployment target to the desired version of iOS + +Finally, remove GameController from the list of frameworks linked by your application and edit the build settings for "Other Linker Flags" and add -weak_framework GameController diff --git a/Thirdparty/SDL2/docs/README-kmsbsd.md b/Thirdparty/SDL2/docs/README-kmsbsd.md new file mode 100644 index 0000000..01db5e8 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-kmsbsd.md @@ -0,0 +1,27 @@ +KMSDRM on *BSD +================================================== + +KMSDRM is supported on FreeBSD and OpenBSD. DragonFlyBSD works but requires being a root user. NetBSD isn't supported yet because the application will crash when creating the KMSDRM screen. + +WSCONS support has been brought back, but only as an input backend. It will not be brought back as a video backend to ease maintenance. + +OpenBSD note: Note that the video backend assumes that the user has read/write permissions to the /dev/drm* devices. + + +SDL2 WSCONS input backend features +=================================================== +1. It is keymap-aware; it will work properly with different keymaps. +2. It has mouse support. +3. Accent input is supported. +4. Compose keys are supported. +5. AltGr and Meta Shift keys work as intended. + +Partially working or no input on OpenBSD/NetBSD. +================================================== + +The WSCONS input backend needs read/write access to the /dev/wskbd* devices, without which it will not work properly. /dev/wsmouse must also be read/write accessible, otherwise mouse input will not work. + +Partially working or no input on FreeBSD. +================================================== + +The evdev devices are only accessible to the root user by default. Edit devfs rules to allow access to such devices. The /dev/kbd* devices are also only accessible to the root user by default. Edit devfs rules to allow access to such devices. diff --git a/Thirdparty/SDL2/docs/README-linux.md b/Thirdparty/SDL2/docs/README-linux.md new file mode 100644 index 0000000..b28690b --- /dev/null +++ b/Thirdparty/SDL2/docs/README-linux.md @@ -0,0 +1,96 @@ +Linux +================================================================================ + +By default SDL will only link against glibc, the rest of the features will be +enabled dynamically at runtime depending on the available features on the target +system. So, for example if you built SDL with XRandR support and the target +system does not have the XRandR libraries installed, it will be disabled +at runtime, and you won't get a missing library error, at least with the +default configuration parameters. + + +Build Dependencies +-------------------------------------------------------------------------------- + +Ubuntu 18.04, all available features enabled: + + sudo apt-get install build-essential git make autoconf automake libtool \ + pkg-config cmake ninja-build gnome-desktop-testing libasound2-dev libpulse-dev \ + libaudio-dev libjack-dev libsndio-dev libsamplerate0-dev libx11-dev libxext-dev \ + libxrandr-dev libxcursor-dev libxfixes-dev libxi-dev libxss-dev libwayland-dev \ + libxkbcommon-dev libdrm-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \ + libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev + +Ubuntu 22.04+ can also add `libpipewire-0.3-dev libdecor-0-dev` to that command line. + +Fedora 35, all available features enabled: + + sudo yum install gcc git-core make cmake autoconf automake libtool \ + alsa-lib-devel pulseaudio-libs-devel nas-devel pipewire-devel \ + libX11-devel libXext-devel libXrandr-devel libXcursor-devel libXfixes-devel \ + libXi-devel libXScrnSaver-devel dbus-devel ibus-devel fcitx-devel \ + systemd-devel mesa-libGL-devel libxkbcommon-devel mesa-libGLES-devel \ + mesa-libEGL-devel vulkan-devel wayland-devel wayland-protocols-devel \ + libdrm-devel mesa-libgbm-devel libusb-devel libdecor-devel \ + libsamplerate-devel pipewire-jack-audio-connection-kit-devel \ + +NOTES: +- This includes all the audio targets except arts and esd, because Ubuntu + (and/or Debian) pulled their packages, but in theory SDL still supports them. + The sndio audio target is also unavailable on Fedora. +- libsamplerate0-dev lets SDL optionally link to libresamplerate at runtime + for higher-quality audio resampling. SDL will work without it if the library + is missing, so it's safe to build in support even if the end user doesn't + have this library installed. +- DirectFB isn't included because the configure script (currently) fails to find + it at all. You can do "sudo apt-get install libdirectfb-dev" and fix the + configure script to include DirectFB support. Send patches. :) + + +Joystick does not work +-------------------------------------------------------------------------------- + +If you compiled or are using a version of SDL with udev support (and you should!) +there's a few issues that may cause SDL to fail to detect your joystick. To +debug this, start by installing the evtest utility. On Ubuntu/Debian: + + sudo apt-get install evtest + +Then run: + + sudo evtest + +You'll hopefully see your joystick listed along with a name like "/dev/input/eventXX" +Now run: + + cat /dev/input/event/XX + +If you get a permission error, you need to set a udev rule to change the mode of +your device (see below) + +Also, try: + + sudo udevadm info --query=all --name=input/eventXX + +If you see a line stating ID_INPUT_JOYSTICK=1, great, if you don't see it, +you need to set up an udev rule to force this variable. + +A combined rule for the Saitek Pro Flight Rudder Pedals to fix both issues looks +like: + + SUBSYSTEM=="input", ATTRS{idProduct}=="0763", ATTRS{idVendor}=="06a3", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" + SUBSYSTEM=="input", ATTRS{idProduct}=="0764", ATTRS{idVendor}=="06a3", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1" + +You can set up similar rules for your device by changing the values listed in +idProduct and idVendor. To obtain these values, try: + + sudo udevadm info -a --name=input/eventXX | grep idVendor + sudo udevadm info -a --name=input/eventXX | grep idProduct + +If multiple values come up for each of these, the one you want is the first one of each. + +On other systems which ship with an older udev (such as CentOS), you may need +to set up a rule such as: + + SUBSYSTEM=="input", ENV{ID_CLASS}=="joystick", ENV{ID_INPUT_JOYSTICK}="1" + diff --git a/Thirdparty/SDL2/docs/README-macos.md b/Thirdparty/SDL2/docs/README-macos.md new file mode 100644 index 0000000..af8a475 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-macos.md @@ -0,0 +1,285 @@ +# Mac OS X (aka macOS). + +These instructions are for people using Apple's Mac OS X (pronounced +"ten"), which in newer versions is just referred to as "macOS". + +From the developer's point of view, macOS is a sort of hybrid Mac and +Unix system, and you have the option of using either traditional +command line tools or Apple's IDE Xcode. + +# Command Line Build + +To build SDL using the command line, use the standard configure and make +process: + +```bash +mkdir build +cd build +../configure +make +sudo make install +``` + +CMake is also known to work, although it continues to be a work in progress: + +```bash +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release .. +make +sudo make install +``` + + +You can also build SDL as a Universal library (a single binary for both +64-bit Intel and ARM architectures), by using the build-scripts/clang-fat.sh +script. + +```bash +mkdir build +cd build +CC=$PWD/../build-scripts/clang-fat.sh ../configure +make +sudo make install +``` + +This script builds SDL with 10.9 ABI compatibility on 64-bit Intel and 11.0 +ABI compatibility on ARM64 architectures. For best compatibility you +should compile your application the same way. + +Please note that building SDL requires at least Xcode 6 and the 10.9 SDK. +PowerPC support for macOS has been officially dropped as of SDL 2.0.2. +32-bit Intel and macOS 10.8 runtime support has been officially dropped as +of SDL 2.24.0. + +To use the library once it's built, you essential have two possibilities: +use the traditional autoconf/automake/make method, or use Xcode. + + +# Caveats for using SDL with Mac OS X + +If you register your own NSApplicationDelegate (using [NSApp setDelegate:]), +SDL will not register its own. This means that SDL will not terminate using +SDL_Quit if it receives a termination request, it will terminate like a +normal app, and it will not send a SDL_DROPFILE when you request to open a +file with the app. To solve these issues, put the following code in your +NSApplicationDelegate implementation: + + +```objc +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) { + SDL_Event event; + event.type = SDL_QUIT; + SDL_PushEvent(&event); + } + + return NSTerminateCancel; +} + +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename +{ + if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) { + SDL_Event event; + event.type = SDL_DROPFILE; + event.drop.file = SDL_strdup([filename UTF8String]); + return (SDL_PushEvent(&event) > 0); + } + + return NO; +} +``` + +# Using the Simple DirectMedia Layer with a traditional Makefile + +An existing autoconf/automake build system for your SDL app has good chances +to work almost unchanged on macOS. However, to produce a "real" Mac binary +that you can distribute to users, you need to put the generated binary into a +so called "bundle", which is basically a fancy folder with a name like +"MyCoolGame.app". + +To get this build automatically, add something like the following rule to +your Makefile.am: + +```make +bundle_contents = APP_NAME.app/Contents +APP_NAME_bundle: EXE_NAME + mkdir -p $(bundle_contents)/MacOS + mkdir -p $(bundle_contents)/Resources + echo "APPL????" > $(bundle_contents)/PkgInfo + $(INSTALL_PROGRAM) $< $(bundle_contents)/MacOS/ +``` + +You should replace `EXE_NAME` with the name of the executable. `APP_NAME` is +what will be visible to the user in the Finder. Usually it will be the same +as `EXE_NAME` but capitalized. E.g. if `EXE_NAME` is "testgame" then `APP_NAME` +usually is "TestGame". You might also want to use `@PACKAGE@` to use the +package name as specified in your configure.ac file. + +If your project builds more than one application, you will have to do a bit +more. For each of your target applications, you need a separate rule. + +If you want the created bundles to be installed, you may want to add this +rule to your Makefile.am: + +```make +install-exec-hook: APP_NAME_bundle + rm -rf $(DESTDIR)$(prefix)/Applications/APP_NAME.app + mkdir -p $(DESTDIR)$(prefix)/Applications/ + cp -r $< /$(DESTDIR)$(prefix)Applications/ +``` + +This rule takes the Bundle created by the rule from step 3 and installs them +into "$(DESTDIR)$(prefix)/Applications/". + +Again, if you want to install multiple applications, you will have to augment +the make rule accordingly. + +But beware! That is only part of the story! With the above, you end up with +a barebones .app bundle, which is double-clickable from the Finder. But +there are some more things you should do before shipping your product... + +1. The bundle right now probably is dynamically linked against SDL. That + means that when you copy it to another computer, *it will not run*, + unless you also install SDL on that other computer. A good solution + for this dilemma is to static link against SDL. On OS X, you can + achieve that by linking against the libraries listed by + + ```bash + sdl-config --static-libs + ``` + + instead of those listed by + + ```bash + sdl-config --libs + ``` + + Depending on how exactly SDL is integrated into your build systems, the + way to achieve that varies, so I won't describe it here in detail + +2. Add an 'Info.plist' to your application. That is a special XML file which + contains some meta-information about your application (like some copyright + information, the version of your app, the name of an optional icon file, + and other things). Part of that information is displayed by the Finder + when you click on the .app, or if you look at the "Get Info" window. + More information about Info.plist files can be found on Apple's homepage. + + +As a final remark, let me add that I use some of the techniques (and some +variations of them) in [Exult](https://github.com/exult/exult) and +[ScummVM](https://github.com/scummvm/scummvm); both are available in source on +the net, so feel free to take a peek at them for inspiration! + + +# Using the Simple DirectMedia Layer with Xcode + +These instructions are for using Apple's Xcode IDE to build SDL applications. + +## First steps + +The first thing to do is to unpack the Xcode.tar.gz archive in the +top level SDL directory (where the Xcode.tar.gz archive resides). +Because Stuffit Expander will unpack the archive into a subdirectory, +you should unpack the archive manually from the command line: + +```bash +cd [path_to_SDL_source] +tar zxf Xcode.tar.gz +``` + +This will create a new folder called Xcode, which you can browse +normally from the Finder. + +## Building the Framework + +The SDL Library is packaged as a framework bundle, an organized +relocatable folder hierarchy of executable code, interface headers, +and additional resources. For practical purposes, you can think of a +framework as a more user and system-friendly shared library, whose library +file behaves more or less like a standard UNIX shared library. + +To build the framework, simply open the framework project and build it. +By default, the framework bundle "SDL.framework" is installed in +/Library/Frameworks. Therefore, the testers and project stationary expect +it to be located there. However, it will function the same in any of the +following locations: + +* ~/Library/Frameworks +* /Local/Library/Frameworks +* /System/Library/Frameworks + +## Build Options + +There are two "Build Styles" (See the "Targets" tab) for SDL. +"Deployment" should be used if you aren't tweaking the SDL library. +"Development" should be used to debug SDL apps or the library itself. + +## Building the Testers + +Open the SDLTest project and build away! + +## Using the Project Stationary + +Copy the stationary to the indicated folders to access it from +the "New Project" and "Add target" menus. What could be easier? + +## Setting up a new project by hand + +Some of you won't want to use the Stationary so I'll give some tips: + +(this is accurate as of Xcode 12.5.) + +* Click "File" -> "New" -> "Project... +* Choose "macOS" and then "App" from the "Application" section. +* Fill out the options in the next window. User interface is "XIB" and + Language is "Objective-C". +* Remove "main.m" from your project +* Remove "MainMenu.xib" from your project +* Remove "AppDelegates.*" from your project +* Add "\$(HOME)/Library/Frameworks/SDL.framework/Headers" to include path +* Add "\$(HOME)/Library/Frameworks" to the frameworks search path +* Add "-framework SDL -framework Foundation -framework AppKit" to "OTHER_LDFLAGS" +* Add your files +* Clean and build + +## Building from command line + +Use `xcode-build` in the same directory as your .pbxproj file + +## Running your app + +You can send command line args to your app by either invoking it from +the command line (in *.app/Contents/MacOS) or by entering them in the +Executables" panel of the target settings. + +# Implementation Notes + +Some things that may be of interest about how it all works... + +## Working directory + +In SDL 1.2, the working directory of your SDL app is by default set to its +parent, but this is no longer the case in SDL 2.0. SDL2 does change the +working directory, which means it'll be whatever the command line prompt +that launched the program was using, or if launched by double-clicking in +the finger, it will be "/", the _root of the filesystem_. Plan accordingly! +You can use SDL_GetBasePath() to find where the program is running from and +chdir() there directly. + + +## You have a Cocoa App! + +Your SDL app is essentially a Cocoa application. When your app +starts up and the libraries finish loading, a Cocoa procedure is called, +which sets up the working directory and calls your main() method. +You are free to modify your Cocoa app with generally no consequence +to SDL. You cannot, however, easily change the SDL window itself. +Functionality may be added in the future to help this. + +# Bug reports + +Bugs are tracked at [the GitHub issue tracker](https://github.com/libsdl-org/SDL/issues/). +Please feel free to report bugs there! + diff --git a/Thirdparty/SDL2/docs/README-n3ds.md b/Thirdparty/SDL2/docs/README-n3ds.md new file mode 100644 index 0000000..ff528eb --- /dev/null +++ b/Thirdparty/SDL2/docs/README-n3ds.md @@ -0,0 +1,28 @@ +# Nintendo 3DS + +SDL port for the Nintendo 3DS [Homebrew toolchain](https://devkitpro.org/) contributed by: + +- [Pierre Wendling](https://github.com/FtZPetruska) + +Credits to: + +- The awesome people who ported SDL to other homebrew platforms. +- The Devkitpro team for making all the tools necessary to achieve this. + +## Building + +To build for the Nintendo 3DS, make sure you have devkitARM and cmake installed and run: + +```bash +cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/3DS.cmake" -DCMAKE_BUILD_TYPE=Release +cmake --build build +cmake --install build +``` + +## Notes + +- Currently only software rendering is supported. +- SDL2main should be used to ensure ROMFS is enabled. +- By default, the extra L2 cache and higher clock speeds of the New 2/3DS lineup are enabled. If you wish to turn it off, use `osSetSpeedupEnable(false)` in your main function. +- `SDL_GetBasePath` returns the romfs root instead of the executable's directory. +- The Nintendo 3DS uses a cooperative threading model on a single core, meaning a thread will never yield unless done manually through the `SDL_Delay` functions, or blocking waits (`SDL_LockMutex`, `SDL_SemWait`, `SDL_CondWait`, `SDL_WaitThread`). To avoid starving other threads, `SDL_SemTryWait` and `SDL_SemWaitTimeout` will yield if they fail to acquire the semaphore, see https://github.com/libsdl-org/SDL/pull/6776 for more information. diff --git a/Thirdparty/SDL2/docs/README-nacl.md b/Thirdparty/SDL2/docs/README-nacl.md new file mode 100644 index 0000000..2906825 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-nacl.md @@ -0,0 +1,103 @@ +Native Client +================================================================================ + +Requirements: + +* Native Client SDK (https://developer.chrome.com/native-client), + (tested with Pepper version 33 or higher). + +The SDL backend for Chrome's Native Client has been tested only with the PNaCl +toolchain, which generates binaries designed to run on ARM and x86_32/64 +platforms. This does not mean it won't work with the other toolchains! + +================================================================================ +Building SDL for NaCl +================================================================================ + +Set up the right environment variables (see naclbuild.sh), then configure SDL with: + + configure --host=pnacl --prefix some/install/destination + +Then "make". + +As an example of how to create a deployable app a Makefile project is provided +in test/nacl/Makefile, which includes some monkey patching of the common.mk file +provided by NaCl, without which linking properly to SDL won't work (the search +path can't be modified externally, so the linker won't find SDL's binaries unless +you dump them into the SDK path, which is inconvenient). +Also provided in test/nacl is the required support file, such as index.html, +manifest.json, etc. +SDL apps for NaCl run on a worker thread using the ppapi_simple infrastructure. +This allows for blocking calls on all the relevant systems (OpenGL ES, filesystem), +hiding the asynchronous nature of the browser behind the scenes...which is not the +same as making it disappear! + + +================================================================================ +Running tests +================================================================================ + +Due to the nature of NaCl programs, building and running SDL tests is not as +straightforward as one would hope. The script naclbuild.sh in build-scripts +automates the process and should serve as a guide for users of SDL trying to build +their own applications. + +Basic usage: + + ./naclbuild.sh path/to/pepper/toolchain (i.e. ~/naclsdk/pepper_35) + +This will build testgles2.c by default. + +If you want to build a different test, for example testrendercopyex.c: + + SOURCES=~/sdl/SDL/test/testrendercopyex.c ./naclbuild.sh ~/naclsdk/pepper_35 + +Once the build finishes, you have to serve the contents with a web server (the +script will give you instructions on how to do that with Python). + +================================================================================ +RWops and nacl_io +================================================================================ + +SDL_RWops work transparently with nacl_io. Two functions control the mount points: + + int mount(const char* source, const char* target, + const char* filesystemtype, + unsigned long mountflags, const void *data); + int umount(const char *target); + + For convenience, SDL will by default mount an httpfs tree at / before calling +the app's main function. Such setting can be overridden by calling: + + umount("/"); + +And then mounting a different filesystem at / + +It's important to consider that the asynchronous nature of file operations on a +browser is hidden from the application, effectively providing the developer with +a set of blocking file operations just like you get in a regular desktop +environment, which eases the job of porting to Native Client, but also introduces +a set of challenges of its own, in particular when big file sizes and slow +connections are involved. + +For more information on how nacl_io and mount points work, see: + + https://developer.chrome.com/native-client/devguide/coding/nacl_io + https://src.chromium.org/chrome/trunk/src/native_client_sdk/src/libraries/nacl_io/nacl_io.h + +To be able to save into the directory "/save/" (like backup of game) : + + mount("", "/save", "html5fs", 0, "type=PERSISTENT"); + +And add to manifest.json : + + "permissions": [ + "unlimitedStorage" + ] + +================================================================================ +TODO - Known Issues +================================================================================ +* Testing of all systems with a real application (something other than SDL's tests) +* Key events don't seem to work properly + diff --git a/Thirdparty/SDL2/docs/README-ngage.md b/Thirdparty/SDL2/docs/README-ngage.md new file mode 100644 index 0000000..83c2e33 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-ngage.md @@ -0,0 +1,44 @@ +Nokia N-Gage +============ + +SDL2 port for Symbian S60v1 and v2 with a main focus on the Nokia N-Gage +(Classic and QD) by [Michael Fitzmayer](https://github.com/mupfdev). + +Compiling +--------- + +SDL is part of the [N-Gage SDK.](https://github.com/ngagesdk) project. +The library is included in the +[toolchain](https://github.com/ngagesdk/ngage-toolchain) as a +sub-module. + +A complete example project based on SDL2 can be found in the GitHub +account of the SDK: [Wordle](https://github.com/ngagesdk/wordle). + +Current level of implementation +------------------------------- + +The video driver currently provides full screen video support with +keyboard input. + +At the moment only the software renderer works. + +Audio is not yet implemented. + +Acknowledgements +---------------- + +Thanks to Hannu Viitala, Kimmo Kinnunen and Markus Mertama for the +valuable insight into Symbian programming. Without the SDL 1.2 port +which was specially developed for CDoom (Doom for the Nokia 9210), this +adaptation would not have been possible. + +I would like to thank my friends +[Razvan](https://twitter.com/bewarerazvan) and [Dan +Whelan](https://danwhelan.ie/), for their continuous support. Without +you and the [N-Gage community](https://discord.gg/dbUzqJ26vs), I would +have lost my patience long ago. + +Last but not least, I would like to thank the development team of +[EKA2L1](https://12z1.com/) (an experimental Symbian OS emulator). Your +patience and support in troubleshooting helped me a lot. diff --git a/Thirdparty/SDL2/docs/README-os2.md b/Thirdparty/SDL2/docs/README-os2.md new file mode 100644 index 0000000..148eb33 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-os2.md @@ -0,0 +1,92 @@ +Simple DirectMedia Layer 2 for OS/2 & eComStation +================================================================================ +SDL port for OS/2, authored by Andrey Vasilkin , 2016 + + +OpenGL not supported by this port. + +Additional optional environment variables: + +SDL_AUDIO_SHARE + Values: 0 or 1, default is 0 + Initializes the device as shareable or exclusively acquired. + +SDL_VIDEODRIVER + Values: DIVE or VMAN, default is DIVE + Use video subsystem: Direct interface video extensions (DIVE) or + Video Manager (VMAN). + +You may significantly increase video output speed with OS4 kernel and patched +files vman.dll and dive.dll or with latest versions of ACPI support and video +driver Panorama. + +Latest versions of OS/4 kernel: + http://gus.biysk.ru/os4/ + (Info: https://www.os2world.com/wiki/index.php/Phoenix_OS/4) + +Patched files vman.dll and dive.dll: + http://gus.biysk.ru/os4/test/pached_dll/PATCHED_DLL.RAR + + +Compiling: +---------- + +Open Watcom 1.9 or newer is tested. For the new Open Watcom V2 fork, see: +https://github.com/open-watcom/ and https://open-watcom.github.io +WATCOM environment variable must to be set to the Open Watcom install +directory. To compile, run: wmake -f Makefile.os2 + + +Installing: +----------- + +- eComStation: + + If you have previously installed SDL2, make a Backup copy of SDL2.dll + located in D:\ecs\dll (where D: is disk on which installed eComStation). + Stop all programs running with SDL2. Copy SDL2.dll to D:\ecs\dll + +- OS/2: + + Copy SDL2.dll to any directory on your LIBPATH. If you have a previous + version installed, close all SDL2 applications before replacing the old + copy. Also make sure that any other older versions of DLLs are removed + from your system. + + +Joysticks in SDL2: +------------------ + +The joystick code in SDL2 is a direct forward-port from the SDL-1.2 version. +Here is the original documentation from SDL-1.2: + +The Joystick detection only works for standard joysticks (2 buttons, 2 axes +and the like). Therefore, if you use a non-standard joystick, you should +specify its features in the SDL_OS2_JOYSTICK environment variable in a batch +file or CONFIG.SYS, so SDL applications can provide full capability to your +device. The syntax is: + +SET SDL_OS2_JOYSTICK=[JOYSTICK_NAME] [AXES] [BUTTONS] [HATS] [BALLS] + +So, it you have a Gravis GamePad with 4 axes, 2 buttons, 2 hats and 0 balls, +the line should be: + +SET SDL_OS2_JOYSTICK=Gravis_GamePad 4 2 2 0 + +If you want to add spaces in your joystick name, just surround it with +quotes or double-quotes: + +SET SDL_OS2_JOYSTICK='Gravis GamePad' 4 2 2 0 + +or + +SET SDL_OS2_JOYSTICK="Gravis GamePad" 4 2 2 0 + + Note however that Balls and Hats are not supported under OS/2, and the +value will be ignored... but it is wise to define these correctly because +in the future those can be supported. + + Also the number of buttons is limited to 2 when using two joysticks, +4 when using one joystick with 4 axes, 6 when using a joystick with 3 axes +and 8 when using a joystick with 2 axes. Notice however these are limitations +of the Joystick Port hardware, not OS/2. diff --git a/Thirdparty/SDL2/docs/README-pandora.md b/Thirdparty/SDL2/docs/README-pandora.md new file mode 100644 index 0000000..b89d526 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-pandora.md @@ -0,0 +1,17 @@ +Pandora +===================================================================== + +( http://openpandora.org/ ) +- A pandora specific video driver was written to allow SDL 2.0 with OpenGL ES +support to work on the pandora under the framebuffer. This driver do not have +input support for now, so if you use it you will have to add your own control code. +The video driver name is "pandora" so if you have problem running it from +the framebuffer, try to set the following variable before starting your application : +"export SDL_VIDEODRIVER=pandora" + +- OpenGL ES support was added to the x11 driver, so it's working like the normal +x11 driver one with OpenGLX support, with SDL input event's etc.. + + +David Carré (Cpasjuste) +cpasjuste@gmail.com diff --git a/Thirdparty/SDL2/docs/README-platforms.md b/Thirdparty/SDL2/docs/README-platforms.md new file mode 100644 index 0000000..14454ec --- /dev/null +++ b/Thirdparty/SDL2/docs/README-platforms.md @@ -0,0 +1,8 @@ +Platforms +========= + +We maintain the list of supported platforms on our wiki now, and how to +build and install SDL for those platforms: + + https://wiki.libsdl.org/Installation + diff --git a/Thirdparty/SDL2/docs/README-porting.md b/Thirdparty/SDL2/docs/README-porting.md new file mode 100644 index 0000000..82f35c6 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-porting.md @@ -0,0 +1,68 @@ +Porting +======= + +* Porting To A New Platform + + The first thing you have to do when porting to a new platform, is look at +include/SDL_platform.h and create an entry there for your operating system. +The standard format is "__PLATFORM__", where PLATFORM is the name of the OS. +Ideally SDL_platform.h will be able to auto-detect the system it's building +on based on C preprocessor symbols. + +There are two basic ways of building SDL at the moment: + +1. The "UNIX" way: ./configure; make; make install + + If you have a GNUish system, then you might try this. Edit configure.ac, + take a look at the large section labelled: + + "Set up the configuration based on the host platform!" + + Add a section for your platform, and then re-run autogen.sh and build! + +2. Using an IDE: + + If you're using an IDE or other non-configure build system, you'll probably + want to create a custom SDL_config.h for your platform. Edit SDL_config.h, + add a section for your platform, and create a custom SDL_config_{platform}.h, + based on SDL_config_minimal.h and SDL_config.h.in + + Add the top level include directory to the header search path, and then add + the following sources to the project: + + src/*.c + src/atomic/*.c + src/audio/*.c + src/cpuinfo/*.c + src/events/*.c + src/file/*.c + src/haptic/*.c + src/joystick/*.c + src/power/*.c + src/render/*.c + src/render/software/*.c + src/stdlib/*.c + src/thread/*.c + src/timer/*.c + src/video/*.c + src/audio/disk/*.c + src/audio/dummy/*.c + src/filesystem/dummy/*.c + src/video/dummy/*.c + src/haptic/dummy/*.c + src/joystick/dummy/*.c + src/main/dummy/*.c + src/thread/generic/*.c + src/timer/dummy/*.c + src/loadso/dummy/*.c + + +Once you have a working library without any drivers, you can go back to each +of the major subsystems and start implementing drivers for your platform. + +If you have any questions, don't hesitate to ask on the SDL mailing list: + http://www.libsdl.org/mailing-list.php + +Enjoy! + Sam Lantinga (slouken@libsdl.org) + diff --git a/Thirdparty/SDL2/docs/README-ps2.md b/Thirdparty/SDL2/docs/README-ps2.md new file mode 100644 index 0000000..3f07580 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-ps2.md @@ -0,0 +1,51 @@ +PS2 +====== +SDL2 port for the Sony Playstation 2 contributed by: +- Francisco Javier Trujillo Mata + + +Credit to + - The guys that ported SDL to PSP & Vita because I'm taking them as reference. + - David G. F. for helping me with several issues and tests. + +## Building +To build SDL2 library for the PS2, make sure you have the latest PS2Dev status and run: +```bash +cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$PS2DEV/ps2sdk/ps2dev.cmake +cmake --build build +cmake --install build +``` + +## Hints +The PS2 port has a special Hint for having a dynamic VSYNC. The Hint is `SDL_HINT_PS2_DYNAMIC_VSYNC`. +If you enabled the dynamic vsync having as well `SDL_RENDERER_PRESENTVSYNC` enabled, then if the app is not able to run at 60 FPS, automatically the `vsync` will be disabled having a better performance, instead of droping FPS to 30. + +## Notes +If you trying to debug a SDL app through [ps2client](https://github.com/ps2dev/ps2client) you need to avoid the IOP reset, otherwise you will lose the conection with your computer. +So to avoid the reset of the IOP CPU, you need to call to the macro `SDL_PS2_SKIP_IOP_RESET();`. +It could be something similar as: +```c +..... + +SDL_PS2_SKIP_IOP_RESET(); + +int main(int argc, char *argv[]) +{ +..... +``` +For a release binary is recommendable to reset the IOP always. + +Remember to do a clean compilation everytime you enable or disable the `SDL_PS2_SKIP_IOP_RESET` otherwise the change won't be reflected. + +## Getting PS2 Dev +[Installing PS2 Dev](https://github.com/ps2dev/ps2dev) + +## Running on PCSX2 Emulator +[PCSX2](https://github.com/PCSX2/pcsx2) + +[More PCSX2 information](https://pcsx2.net/) + +## To Do +- PS2 Screen Keyboard +- Dialogs +- Others diff --git a/Thirdparty/SDL2/docs/README-psp.md b/Thirdparty/SDL2/docs/README-psp.md new file mode 100644 index 0000000..0c5380f --- /dev/null +++ b/Thirdparty/SDL2/docs/README-psp.md @@ -0,0 +1,36 @@ +PSP +====== +SDL2 port for the Sony PSP contributed by: +- Captian Lex +- Francisco Javier Trujillo Mata +- Wouter Wijsman + + +Credit to + Marcus R.Brown,Jim Paris,Matthew H for the original SDL 1.2 for PSP + Geecko for his PSP GU lib "Glib2d" + +## Building +To build SDL2 library for the PSP, make sure you have the latest PSPDev status and run: +```bash +cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$PSPDEV/psp/share/pspdev.cmake +cmake --build build +cmake --install build +``` + + +## Getting PSP Dev +[Installing PSP Dev](https://github.com/pspdev/pspdev) + +## Running on PPSSPP Emulator +[PPSSPP](https://github.com/hrydgard/ppsspp) + +[Build Instructions](https://github.com/hrydgard/ppsspp/wiki/Build-instructions) + + +## Compiling a HelloWorld +[PSP Hello World](https://psp-dev.org/doku.php?id=tutorial:hello_world) + +## To Do +- PSP Screen Keyboard +- Dialogs diff --git a/Thirdparty/SDL2/docs/README-raspberrypi.md b/Thirdparty/SDL2/docs/README-raspberrypi.md new file mode 100644 index 0000000..f2f24c7 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-raspberrypi.md @@ -0,0 +1,180 @@ +Raspberry Pi +============ + +Requirements: + +Raspbian (other Linux distros may work as well). + +Features +-------- + +* Works without X11 +* Hardware accelerated OpenGL ES 2.x +* Sound via ALSA +* Input (mouse/keyboard/joystick) via EVDEV +* Hotplugging of input devices via UDEV + + +Raspbian Build Dependencies +--------------------------- + +sudo apt-get install libudev-dev libasound2-dev libdbus-1-dev + +You also need the VideoCore binary stuff that ships in /opt/vc for EGL and +OpenGL ES 2.x, it usually comes pre-installed, but in any case: + +sudo apt-get install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev + + +NEON +---- + +If your Pi has NEON support, make sure you add -mfpu=neon to your CFLAGS so +that SDL will select some otherwise-disabled highly-optimized code. The +original Pi units don't have NEON, the Pi2 probably does, and the Pi3 +definitely does. + + +Cross compiling from x86 Linux +------------------------------ + +To cross compile SDL for Raspbian from your desktop machine, you'll need a +Raspbian system root and the cross compilation tools. We'll assume these tools +will be placed in /opt/rpi-tools + + sudo git clone --depth 1 https://github.com/raspberrypi/tools /opt/rpi-tools + +You'll also need a Raspbian binary image. +Get it from: http://downloads.raspberrypi.org/raspbian_latest +After unzipping, you'll get file with a name like: "-wheezy-raspbian.img" +Let's assume the sysroot will be built in /opt/rpi-sysroot. + + export SYSROOT=/opt/rpi-sysroot + sudo kpartx -a -v .img + sudo mount -o loop /dev/mapper/loop0p2 /mnt + sudo cp -r /mnt $SYSROOT + sudo apt-get install qemu binfmt-support qemu-user-static + sudo cp /usr/bin/qemu-arm-static $SYSROOT/usr/bin + sudo mount --bind /dev $SYSROOT/dev + sudo mount --bind /proc $SYSROOT/proc + sudo mount --bind /sys $SYSROOT/sys + +Now, before chrooting into the ARM sysroot, you'll need to apply a workaround, +edit $SYSROOT/etc/ld.so.preload and comment out all lines in it. + + sudo chroot $SYSROOT + apt-get install libudev-dev libasound2-dev libdbus-1-dev libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev + exit + sudo umount $SYSROOT/dev + sudo umount $SYSROOT/proc + sudo umount $SYSROOT/sys + sudo umount /mnt + +There's one more fix required, as the libdl.so symlink uses an absolute path +which doesn't quite work in our setup. + + sudo rm -rf $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so + sudo ln -s ../../../lib/arm-linux-gnueabihf/libdl.so.2 $SYSROOT/usr/lib/arm-linux-gnueabihf/libdl.so + +The final step is compiling SDL itself. + + export CC="/opt/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$SYSROOT -I$SYSROOT/opt/vc/include -I$SYSROOT/usr/include -I$SYSROOT/opt/vc/include/interface/vcos/pthreads -I$SYSROOT/opt/vc/include/interface/vmcs_host/linux" + cd + mkdir -p build;cd build + LDFLAGS="-L$SYSROOT/opt/vc/lib" ../configure --with-sysroot=$SYSROOT --host=arm-raspberry-linux-gnueabihf --prefix=$PWD/rpi-sdl2-installed --disable-pulseaudio --disable-esd + make + make install + +To be able to deploy this to /usr/local in the Raspbian system you need to fix up a few paths: + + perl -w -pi -e "s#$PWD/rpi-sdl2-installed#/usr/local#g;" ./rpi-sdl2-installed/lib/libSDL2.la ./rpi-sdl2-installed/lib/pkgconfig/sdl2.pc ./rpi-sdl2-installed/bin/sdl2-config + +Apps don't work or poor video/audio performance +----------------------------------------------- + +If you get sound problems, buffer underruns, etc, run "sudo rpi-update" to +update the RPi's firmware. Note that doing so will fix these problems, but it +will also render the CMA - Dynamic Memory Split functionality useless. + +Also, by default the Raspbian distro configures the GPU RAM at 64MB, this is too +low in general, specially if a 1080p TV is hooked up. + +See here how to configure this setting: http://elinux.org/RPiconfig + +Using a fixed gpu_mem=128 is the best option (specially if you updated the +firmware, using CMA probably won't work, at least it's the current case). + +No input +-------- + +Make sure you belong to the "input" group. + + sudo usermod -aG input `whoami` + +No HDMI Audio +------------- + +If you notice that ALSA works but there's no audio over HDMI, try adding: + + hdmi_drive=2 + +to your config.txt file and reboot. + +Reference: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=5062 + +Text Input API support +---------------------- + +The Text Input API is supported, with translation of scan codes done via the +kernel symbol tables. For this to work, SDL needs access to a valid console. +If you notice there's no SDL_TEXTINPUT message being emitted, double check that +your app has read access to one of the following: + +* /proc/self/fd/0 +* /dev/tty +* /dev/tty[0...6] +* /dev/vc/0 +* /dev/console + +This is usually not a problem if you run from the physical terminal (as opposed +to running from a pseudo terminal, such as via SSH). If running from a PTS, a +quick workaround is to run your app as root or add yourself to the tty group, +then re-login to the system. + + sudo usermod -aG tty `whoami` + +The keyboard layout used by SDL is the same as the one the kernel uses. +To configure the layout on Raspbian: + + sudo dpkg-reconfigure keyboard-configuration + +To configure the locale, which controls which keys are interpreted as letters, +this determining the CAPS LOCK behavior: + + sudo dpkg-reconfigure locales + + +OpenGL problems +--------------- + +If you have desktop OpenGL headers installed at build time in your RPi or cross +compilation environment, support for it will be built in. However, the chipset +does not actually have support for it, which causes issues in certain SDL apps +since the presence of OpenGL support supersedes the ES/ES2 variants. +The workaround is to disable OpenGL at configuration time: + + ./configure --disable-video-opengl + +Or if the application uses the Render functions, you can use the SDL_RENDER_DRIVER +environment variable: + + export SDL_RENDER_DRIVER=opengles2 + +Notes +----- + +* When launching apps remotely (via SSH), SDL can prevent local keystrokes from + leaking into the console only if it has root privileges. Launching apps locally + does not suffer from this issue. + + diff --git a/Thirdparty/SDL2/docs/README-riscos.md b/Thirdparty/SDL2/docs/README-riscos.md new file mode 100644 index 0000000..76b27e0 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-riscos.md @@ -0,0 +1,41 @@ +RISC OS +======= + +Requirements: + +* RISC OS 3.5 or later. +* [SharedUnixLibrary](http://www.riscos.info/packages/LibraryDetails.html#SharedUnixLibraryarm). +* [DigitalRenderer](http://www.riscos.info/packages/LibraryDetails.html#DRendererarm), for audio support. +* [Iconv](http://www.netsurf-browser.org/projects/iconv/), for `SDL_iconv` and related functions. + + +Compiling: +---------- + +Currently, SDL2 for RISC OS only supports compiling with GCCSDK under Linux. Both the autoconf and CMake build systems are supported. + +The following commands can be used to build SDL2 for RISC OS using autoconf: + + ./configure --host=arm-unknown-riscos --prefix=$GCCSDK_INSTALL_ENV --disable-gcc-atomics + make + make install + +The following commands can be used to build SDL2 for RISC OS using CMake: + + cmake -Bbuild-riscos -DCMAKE_TOOLCHAIN_FILE=$GCCSDK_INSTALL_ENV/toolchain-riscos.cmake -DRISCOS=ON -DCMAKE_INSTALL_PREFIX=$GCCSDK_INSTALL_ENV -DCMAKE_BUILD_TYPE=Release -DSDL_GCC_ATOMICS=OFF + cmake --build build-riscos + cmake --build build-riscos --target install + + +Current level of implementation +------------------------------- + +The video driver currently provides full screen video support with keyboard and mouse input. Windowed mode is not yet supported, but is planned in the future. Only software rendering is supported. + +The filesystem APIs return either Unix-style paths or RISC OS-style paths based on the value of the `__riscosify_control` symbol, as is standard for UnixLib functions. + +The audio, loadso, thread and timer APIs are currently provided by UnixLib. + +GCC atomics are currently broken on some platforms, meaning it's currently necessary to compile with `--disable-gcc-atomics` using autotools or `-DSDL_GCC_ATOMICS=OFF` using CMake. + +The joystick, locale and power APIs are not yet implemented. diff --git a/Thirdparty/SDL2/docs/README-touch.md b/Thirdparty/SDL2/docs/README-touch.md new file mode 100644 index 0000000..1a23f35 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-touch.md @@ -0,0 +1,86 @@ +Touch +=========================================================================== +System Specific Notes +=========================================================================== +Linux: +The linux touch system is currently based off event streams, and proc/bus/devices. The active user must be given permissions to read /dev/input/TOUCHDEVICE, where TOUCHDEVICE is the event stream for your device. Currently only Wacom tablets are supported. If you have an unsupported tablet contact me at jim.tla+sdl_touch@gmail.com and I will help you get support for it. + +Mac: +The Mac and iPhone APIs are pretty. If your touch device supports them then you'll be fine. If it doesn't, then there isn't much we can do. + +iPhone: +Works out of box. + +Windows: +Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com + +=========================================================================== +Events +=========================================================================== +SDL_FINGERDOWN: +Sent when a finger (or stylus) is placed on a touch device. +Fields: +* event.tfinger.touchId - the Id of the touch device. +* event.tfinger.fingerId - the Id of the finger which just went down. +* event.tfinger.x - the x coordinate of the touch (0..1) +* event.tfinger.y - the y coordinate of the touch (0..1) +* event.tfinger.pressure - the pressure of the touch (0..1) + +SDL_FINGERMOTION: +Sent when a finger (or stylus) is moved on the touch device. +Fields: +Same as SDL_FINGERDOWN but with additional: +* event.tfinger.dx - change in x coordinate during this motion event. +* event.tfinger.dy - change in y coordinate during this motion event. + +SDL_FINGERUP: +Sent when a finger (or stylus) is lifted from the touch device. +Fields: +Same as SDL_FINGERDOWN. + + +=========================================================================== +Functions +=========================================================================== +SDL provides the ability to access the underlying SDL_Finger structures. +These structures should _never_ be modified. + +The following functions are included from SDL_touch.h + +To get a SDL_TouchID call SDL_GetTouchDevice(int index). +This returns a SDL_TouchID. +IMPORTANT: If the touch has been removed, or there is no touch with the given index, SDL_GetTouchDevice() will return 0. Be sure to check for this! + +The number of touch devices can be queried with SDL_GetNumTouchDevices(). + +A SDL_TouchID may be used to get pointers to SDL_Finger. + +SDL_GetNumTouchFingers(touchID) may be used to get the number of fingers currently down on the device. + +The most common reason to access SDL_Finger is to query the fingers outside the event. In most cases accessing the fingers is using the event. This would be accomplished by code like the following: + + float x = event.tfinger.x; + float y = event.tfinger.y; + + + +To get a SDL_Finger, call SDL_GetTouchFinger(SDL_TouchID touchID, int index), where touchID is a SDL_TouchID, and index is the requested finger. +This returns a SDL_Finger *, or NULL if the finger does not exist, or has been removed. +A SDL_Finger is guaranteed to be persistent for the duration of a touch, but it will be de-allocated as soon as the finger is removed. This occurs when the SDL_FINGERUP event is _added_ to the event queue, and thus _before_ the SDL_FINGERUP event is polled. +As a result, be very careful to check for NULL return values. + +A SDL_Finger has the following fields: +* x, y: + The current coordinates of the touch. +* pressure: + The pressure of the touch. + + +=========================================================================== +Notes +=========================================================================== +For a complete example see test/testgesture.c + +Please direct questions/comments to: + jim.tla+sdl_touch@gmail.com + (original author, API was changed since) diff --git a/Thirdparty/SDL2/docs/README-versions.md b/Thirdparty/SDL2/docs/README-versions.md new file mode 100644 index 0000000..097dba1 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-versions.md @@ -0,0 +1,60 @@ +# Versioning + +## Since 2.23.0 + +SDL follows an "odd/even" versioning policy, similar to GLib, GTK, Flatpak +and older versions of the Linux kernel: + +* The major version (first part) increases when backwards compatibility + is broken, which will happen infrequently. + +* If the minor version (second part) is divisible by 2 + (for example 2.24.x, 2.26.x), this indicates a version of SDL that + is believed to be stable and suitable for production use. + + * In stable releases, the patchlevel or micro version (third part) + indicates bugfix releases. Bugfix releases should not add or + remove ABI, so the ".0" release (for example 2.24.0) should be + forwards-compatible with all the bugfix releases from the + same cycle (for example 2.24.1). + + * The minor version increases when new API or ABI is added, or when + other significant changes are made. Newer minor versions are + backwards-compatible, but not fully forwards-compatible. + For example, programs built against SDL 2.24.x should work fine + with SDL 2.26.x, but programs built against SDL 2.26.x will not + necessarily work with 2.24.x. + +* If the minor version (second part) is not divisible by 2 + (for example 2.23.x, 2.25.x), this indicates a development prerelease + of SDL that is not suitable for stable software distributions. + Use with caution. + + * The patchlevel or micro version (third part) increases with + each prerelease. + + * Each prerelease might add new API and/or ABI. + + * Prereleases are backwards-compatible with older stable branches. + For example, 2.25.x will be backwards-compatible with 2.24.x. + + * Prereleases are not guaranteed to be backwards-compatible with + each other. For example, new API or ABI added in 2.25.1 + might be removed or changed in 2.25.2. + If this would be a problem for you, please do not use prereleases. + + * Only upgrade to a prerelease if you can guarantee that you will + promptly upgrade to the stable release that follows it. + For example, do not upgrade to 2.23.x unless you will be able to + upgrade to 2.24.0 when it becomes available. + + * Software distributions that have a freeze policy (in particular Linux + distributions with a release cycle, such as Debian and Fedora) + should usually only package stable releases, and not prereleases. + +## Before 2.23.0 + +Older versions of SDL followed a similar policy, but instead of the +odd/even rule applying to the minor version, it applied to the patchlevel +(micro version, third part). For example, 2.0.22 was a stable release +and 2.0.21 was a prerelease. diff --git a/Thirdparty/SDL2/docs/README-visualc.md b/Thirdparty/SDL2/docs/README-visualc.md new file mode 100644 index 0000000..fb0edb9 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-visualc.md @@ -0,0 +1,114 @@ +Using SDL with Microsoft Visual C++ +=================================== + +### by Lion Kimbro with additions by James Turk + +You can either use the precompiled libraries from the [SDL](https://www.libsdl.org/download.php) web site, or you can build SDL +yourself. + +### Building SDL + +0. To build SDL, your machine must, at a minimum, have the DirectX9.0c SDK installed. It may or may not be retrievable from +the [Microsoft](https://www.microsoft.com) website, so you might need to locate it [online](https://duckduckgo.com/?q=directx9.0c+sdk+download&t=h_&ia=web). +_Editor's note: I've been able to successfully build SDL using Visual Studio 2019 **without** the DX9.0c SDK_ + +1. Open the Visual Studio solution file at `./VisualC/SDL.sln`. + +2. Your IDE will likely prompt you to upgrade this solution file to whatever later version of the IDE you're using. In the `Retarget Projects` dialog, +all of the affected project files should be checked allowing you to use the latest `Windows SDK Version` you have installed, along with +the `Platform Toolset`. + +If you choose *NOT* to upgrade to use the latest `Windows SDK Version` or `Platform Toolset`, then you'll need the `Visual Studio 2010 Platform Toolset`. + +3. Build the `.dll` and `.lib` files by right clicking on each project in turn (Projects are listed in the _Workspace_ +panel in the _FileView_ tab), and selecting `Build`. + +You may get a few warnings, but you should not get any errors. + +Later, we will refer to the following `.lib` and `.dll` files that have just been generated: + +- `./VisualC/Win32/Debug/SDL2.dll` or `./VisualC/Win32/Release/SDL2.dll` +- `./VisualC/Win32/Debug/SDL2.lib` or `./VisualC/Win32/Release/SDL2.lib` +- `./VisualC/Win32/Debug/SDL2main.lib` or `./VisualC/Win32/Release/SDL2main.lib` + +_Note for the `x64` versions, just replace `Win32` in the path with `x64`_ + +### Creating a Project with SDL + +- Create a project as a `Win32 Application`. + +- Create a C++ file for your project. + +- Set the C runtime to `Multi-threaded DLL` in the menu: +`Project|Settings|C/C++ tab|Code Generation|Runtime Library `. + +- Add the SDL `include` directory to your list of includes in the menu: +`Project|Settings|C/C++ tab|Preprocessor|Additional include directories ` + +*VC7 Specific: Instead of doing this, I find it easier to add the +include and library directories to the list that VC7 keeps. Do this by +selecting Tools|Options|Projects|VC++ Directories and under the "Show +Directories For:" dropbox select "Include Files", and click the "New +Directory Icon" and add the [SDLROOT]\\include directory (e.g. If you +installed to c:\\SDL\\ add c:\\SDL\\include). Proceed to change the +dropbox selection to "Library Files" and add [SDLROOT]\\lib.* + +The "include directory" I am referring to is the `./include` folder. + +Now we're going to use the files that we had created earlier in the *Build SDL* step. + +Copy the following file into your Project directory: + +- `SDL2.dll` + +Add the following files to your project (It is not necessary to copy them to your project directory): + +- `SDL2.lib` +- `SDL2main.lib` + +To add them to your project, right click on your project, and select +`Add files to project`. + +**Instead of adding the files to your project, it is more desirable to add them to the linker options: Project|Properties|Linker|Command Line +and type the names of the libraries to link with in the "Additional Options:" box. Note: This must be done for each build configuration +(e.g. Release,Debug).** + +### Hello SDL2 + +Here's a sample SDL snippet to verify everything is setup in your IDE: + +``` + #include "SDL.h" + + int main( int argc, char* argv[] ) + { + const int WIDTH = 640; + const int HEIGHT = 480; + SDL_Window* window = NULL; + SDL_Renderer* renderer = NULL; + + SDL_Init(SDL_INIT_VIDEO); + window = SDL_CreateWindow("SDL2 Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; + } + ``` + +### That's it! + +I hope that this document has helped you get through the most difficult part of using the SDL: installing it. +Suggestions for improvements should be posted to the [Github Issues](https://github.com/libsdl-org/SDL/issues). + +### Credits + +Thanks to [Paulus Esterhazy](mailto:pesterhazy@gmx.net), for the work on VC++ port. + +This document was originally called "VisualC.txt", and was written by [Sam Lantinga](mailto:slouken@libsdl.org). + +Later, it was converted to HTML and expanded into the document that you see today by [Lion Kimbro](mailto:snowlion@sprynet.com). + +Minor Fixes and Visual C++ 7 Information (In Green) was added by [James Turk](mailto:james@conceptofzero.net) diff --git a/Thirdparty/SDL2/docs/README-vita.md b/Thirdparty/SDL2/docs/README-vita.md new file mode 100644 index 0000000..0a11cf8 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-vita.md @@ -0,0 +1,33 @@ +PS Vita +======= +SDL port for the Sony Playstation Vita and Sony Playstation TV + +Credit to +* xerpi, cpasjuste and rsn8887 for initial (vita2d) port +* vitasdk/dolcesdk devs +* CBPS discord (Namely Graphene and SonicMastr) + +Building +-------- +To build for the PSVita, make sure you have vitasdk and cmake installed and run: +``` + cmake -S. -Bbuild -DCMAKE_TOOLCHAIN_FILE=${VITASDK}/share/vita.toolchain.cmake -DCMAKE_BUILD_TYPE=Release + cmake --build build + cmake --install build +``` + + +Notes +----- +* gles1/gles2 support and renderers are disabled by default and can be enabled by configuring with `-DVIDEO_VITA_PVR=ON` + These renderers support 720p and 1080i resolutions. These can be specified with: + `SDL_setenv("VITA_RESOLUTION", "720", 1);` and `SDL_setenv("VITA_RESOLUTION", "1080", 1);` +* Desktop GL 1.X and 2.X support and renderers are also disabled by default and also can be enabled with `-DVIDEO_VITA_PVR=ON` as long as gl4es4vita is present in your SDK. + They support the same resolutions as the gles1/gles2 backends and require specifying `SDL_setenv("VITA_PVR_OGL", "1", 1);` + anytime before video subsystem initialization. +* gles2 support via PIB is disabled by default and can be enabled by configuring with `-DVIDEO_VITA_PIB=ON` +* By default SDL emits mouse events for touch events on every touchscreen. + Vita has two touchscreens, so it's recommended to use `SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0");` and handle touch events instead. + Individual touchscreens can be disabled with: + `SDL_setenv("VITA_DISABLE_TOUCH_FRONT", "1", 1);` and `SDL_setenv("VITA_DISABLE_TOUCH_BACK", "1", 1);` +* Support for L2/R2/R3/R3 buttons, haptic feedback and gamepad led only available on PSTV, or when using external ds4 gamepad on vita. diff --git a/Thirdparty/SDL2/docs/README-wince.md b/Thirdparty/SDL2/docs/README-wince.md new file mode 100644 index 0000000..9fc6454 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-wince.md @@ -0,0 +1,10 @@ +WinCE +===== + +Windows CE is no longer supported by SDL. + +We have left the CE support in SDL 1.2 for those that must have it, and we +have support for Windows Phone 8 and WinRT in SDL2, as of SDL 2.0.3. + +--ryan. + diff --git a/Thirdparty/SDL2/docs/README-windows.md b/Thirdparty/SDL2/docs/README-windows.md new file mode 100644 index 0000000..66b5fb0 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-windows.md @@ -0,0 +1,58 @@ +# Windows + +## LLVM and Intel C++ compiler support + +SDL will build with the Visual Studio project files with LLVM-based compilers, such as the Intel oneAPI C++ +compiler, but you'll have to manually add the "-msse3" command line option +to at least the SDL_audiocvt.c source file, and possibly others. This may +not be necessary if you build SDL with CMake instead of the included Visual +Studio solution. + +Details are here: https://github.com/libsdl-org/SDL/issues/5186 + + +## OpenGL ES 2.x support + +SDL has support for OpenGL ES 2.x under Windows via two alternative +implementations. + +The most straightforward method consists in running your app in a system with +a graphic card paired with a relatively recent (as of November of 2013) driver +which supports the WGL_EXT_create_context_es2_profile extension. Vendors known +to ship said extension on Windows currently include nVidia and Intel. + +The other method involves using the +[ANGLE library](https://code.google.com/p/angleproject/). If an OpenGL ES 2.x +context is requested and no WGL_EXT_create_context_es2_profile extension is +found, SDL will try to load the libEGL.dll library provided by ANGLE. + +To obtain the ANGLE binaries, you can either compile from source from +https://chromium.googlesource.com/angle/angle or copy the relevant binaries +from a recent Chrome/Chromium install for Windows. The files you need are: + +- libEGL.dll +- libGLESv2.dll +- d3dcompiler_46.dll (supports Windows Vista or later, better shader + compiler) *or* d3dcompiler_43.dll (supports Windows XP or later) + +If you compile ANGLE from source, you can configure it so it does not need the +d3dcompiler_* DLL at all (for details on this, see their documentation). +However, by default SDL will try to preload the d3dcompiler_46.dll to +comply with ANGLE's requirements. If you wish SDL to preload +d3dcompiler_43.dll (to support Windows XP) or to skip this step at all, you +can use the SDL_HINT_VIDEO_WIN_D3DCOMPILER hint (see SDL_hints.h for more +details). + +Known Bugs: + +- SDL_GL_SetSwapInterval is currently a no op when using ANGLE. It appears + that there's a bug in the library which prevents the window contents from + refreshing if this is set to anything other than the default value. + +## Vulkan Surface Support + +Support for creating Vulkan surfaces is configured on by default. To disable +it change the value of `SDL_VIDEO_VULKAN` to 0 in `SDL_config_windows.h`. You +must install the [Vulkan SDK](https://www.lunarg.com/vulkan-sdk/) in order to +use Vulkan graphics in your application. + diff --git a/Thirdparty/SDL2/docs/README-winrt.md b/Thirdparty/SDL2/docs/README-winrt.md new file mode 100644 index 0000000..d87ec04 --- /dev/null +++ b/Thirdparty/SDL2/docs/README-winrt.md @@ -0,0 +1,519 @@ +WinRT +===== + +This port allows SDL applications to run on Microsoft's platforms that require +use of "Windows Runtime", aka. "WinRT", APIs. Microsoft may, in some cases, +refer to them as either "Windows Store", or for Windows 10, "UWP" apps. + +In the past, SDL has supported Windows RT 8.x, Windows Phone, etc, but in +modern times this port is focused on UWP apps, which run on Windows 10, +and modern Xbox consoles. + + +Requirements +------------ + +* Microsoft Visual C++ (aka Visual Studio) 2019. + - Free, "Community" or "Express" editions may be used, so long as they + include support for either "Windows Store" or "Windows Phone" apps. + "Express" versions marked as supporting "Windows Desktop" development + typically do not include support for creating WinRT apps, to note. + (The "Community" editions of Visual C++ do, however, support both + desktop/Win32 and WinRT development). +* A valid Microsoft account - This requirement is not imposed by SDL, but + rather by Microsoft's Visual C++ toolchain. This is required to launch or + debug apps. + + +Status +------ + +Here is a rough list of what works, and what doesn't: + +* What works: + * compilation via Visual C++ 2019. + * compile-time platform detection for SDL programs. The C/C++ #define, + `__WINRT__`, will be set to 1 (by SDL) when compiling for WinRT. + * GPU-accelerated 2D rendering, via SDL_Renderer. + * OpenGL ES 2, via the ANGLE library (included separately from SDL) + * software rendering, via either SDL_Surface (optionally in conjunction with + SDL_GetWindowSurface() and SDL_UpdateWindowSurface()) or via the + SDL_Renderer APIs + * threads + * timers (via SDL_GetTicks(), SDL_AddTimer(), SDL_GetPerformanceCounter(), + SDL_GetPerformanceFrequency(), etc.) + * file I/O via SDL_RWops + * mouse input (unsupported on Windows Phone) + * audio, via SDL's WASAPI backend (if you want to record, your app must + have "Microphone" capabilities enabled in its manifest, and the user must + not have blocked access. Otherwise, capture devices will fail to work, + presenting as a device disconnect shortly after opening it.) + * .DLL file loading. Libraries *MUST* be packaged inside applications. Loading + anything outside of the app is not supported. + * system path retrieval via SDL's filesystem APIs + * game controllers. Support is provided via the SDL_Joystick and + SDL_GameController APIs, and is backed by Microsoft's XInput API. Please + note, however, that Windows limits game-controller support in UWP apps to, + "Xbox compatible controllers" (many controllers that work in Win32 apps, + do not work in UWP, due to restrictions in UWP itself.) + * multi-touch input + * app events. SDL_APP_WILLENTER* and SDL_APP_DIDENTER* events get sent out as + appropriate. + * window events + * using Direct3D 11.x APIs outside of SDL. Non-XAML / Direct3D-only apps can + choose to render content directly via Direct3D, using SDL to manage the + internal WinRT window, as well as input and audio. (Use + SDL_GetWindowWMInfo() to get the WinRT 'CoreWindow', and pass it into + IDXGIFactory2::CreateSwapChainForCoreWindow() as appropriate.) + +* What partially works: + * keyboard input. Most of WinRT's documented virtual keys are supported, as + well as many keys with documented hardware scancodes. Converting + SDL_Scancodes to or from SDL_Keycodes may not work, due to missing APIs + (MapVirtualKey()) in Microsoft's Windows Store / UWP APIs. + * SDLmain. WinRT uses a different signature for each app's main() function. + SDL-based apps that use this port must compile in SDL_winrt_main_NonXAML.cpp + (in `SDL\src\main\winrt\`) directly in order for their C-style main() + functions to be called. + +* What doesn't work: + * compilation with anything other than Visual C++ + * programmatically-created custom cursors. These don't appear to be supported + by WinRT. Different OS-provided cursors can, however, be created via + SDL_CreateSystemCursor() (unsupported on Windows Phone) + * SDL_WarpMouseInWindow() or SDL_WarpMouseGlobal(). This are not currently + supported by WinRT itself. + * joysticks and game controllers that either are not supported by + Microsoft's XInput API, or are not supported within UWP apps (many + controllers that work in Win32, do not work in UWP, due to restrictions in + UWP itself). + * turning off VSync when rendering on Windows Phone. Attempts to turn VSync + off on Windows Phone result either in Direct3D not drawing anything, or it + forcing VSync back on. As such, SDL_RENDERER_PRESENTVSYNC will always get + turned-on on Windows Phone. This limitation is not present in non-Phone + WinRT (such as Windows 8.x), where turning off VSync appears to work. + * probably anything else that's not listed as supported + + + +Upgrade Notes +------------- + +#### SDL_GetPrefPath() usage when upgrading WinRT apps from SDL 2.0.3 + +SDL 2.0.4 fixes two bugs found in the WinRT version of SDL_GetPrefPath(). +The fixes may affect older, SDL 2.0.3-based apps' save data. Please note +that these changes only apply to SDL-based WinRT apps, and not to apps for +any other platform. + +1. SDL_GetPrefPath() would return an invalid path, one in which the path's + directory had not been created. Attempts to create files there + (via fopen(), for example), would fail, unless that directory was + explicitly created beforehand. + +2. SDL_GetPrefPath(), for non-WinPhone-based apps, would return a path inside + a WinRT 'Roaming' folder, the contents of which get automatically + synchronized across multiple devices. This process can occur while an + application runs, and can cause existing save-data to be overwritten + at unexpected times, with data from other devices. (Windows Phone apps + written with SDL 2.0.3 did not utilize a Roaming folder, due to API + restrictions in Windows Phone 8.0). + + +SDL_GetPrefPath(), starting with SDL 2.0.4, addresses these by: + +1. making sure that SDL_GetPrefPath() returns a directory in which data + can be written to immediately, without first needing to create directories. + +2. basing SDL_GetPrefPath() off of a different, non-Roaming folder, the + contents of which do not automatically get synchronized across devices + (and which require less work to use safely, in terms of data integrity). + +Apps that wish to get their Roaming folder's path can do so either by using +SDL_WinRTGetFSPathUTF8(), SDL_WinRTGetFSPathUNICODE() (which returns a +UCS-2/wide-char string), or directly through the WinRT class, +Windows.Storage.ApplicationData. + + + +Setup, High-Level Steps +----------------------- + +The steps for setting up a project for an SDL/WinRT app looks like the +following, at a high-level: + +1. create a new Visual C++ project using Microsoft's template for a, + "Direct3D App". +2. remove most of the files from the project. +3. make your app's project directly reference SDL/WinRT's own Visual C++ + project file, via use of Visual C++'s "References" dialog. This will setup + the linker, and will copy SDL's .dll files to your app's final output. +4. adjust your app's build settings, at minimum, telling it where to find SDL's + header files. +5. add files that contains a WinRT-appropriate main function, along with some + data to make sure mouse-cursor-hiding (via SDL_ShowCursor(SDL_DISABLE) calls) + work properly. +6. add SDL-specific app code. +7. build and run your app. + + +Setup, Detailed Steps +--------------------- + +### 1. Create a new project ### + +Create a new project using one of Visual C++'s templates for a plain, non-XAML, +"Direct3D App" (XAML support for SDL/WinRT is not yet ready for use). If you +don't see one of these templates, in Visual C++'s 'New Project' dialog, try +using the textbox titled, 'Search Installed Templates' to look for one. + + +### 2. Remove unneeded files from the project ### + +In the new project, delete any file that has one of the following extensions: + +- .cpp +- .h +- .hlsl + +When you are done, you should be left with a few files, each of which will be a +necessary part of your app's project. These files will consist of: + +- an .appxmanifest file, which contains metadata on your WinRT app. This is + similar to an Info.plist file on iOS, or an AndroidManifest.xml on Android. +- a few .png files, one of which is a splash screen (displayed when your app + launches), others are app icons. +- a .pfx file, used for code signing purposes. + + +### 3. Add references to SDL's project files ### + +SDL/WinRT can be built in multiple variations, spanning across three different +CPU architectures (x86, x64, and ARM) and two different configurations +(Debug and Release). WinRT and Visual C++ do not currently provide a means +for combining multiple variations of one library into a single file. +Furthermore, it does not provide an easy means for copying pre-built .dll files +into your app's final output (via Post-Build steps, for example). It does, +however, provide a system whereby an app can reference the MSVC projects of +libraries such that, when the app is built: + +1. each library gets built for the appropriate CPU architecture(s) and WinRT + platform(s). +2. each library's output, such as .dll files, get copied to the app's build + output. + +To set this up for SDL/WinRT, you'll need to run through the following steps: + +1. open up the Solution Explorer inside Visual C++ (under the "View" menu, then + "Solution Explorer") +2. right click on your app's solution. +3. navigate to "Add", then to "Existing Project..." +4. find SDL/WinRT's Visual C++ project file and open it, in the `VisualC-WinRT` + directory. +5. once the project has been added, right-click on your app's project and + select, "References..." +6. click on the button titled, "Add New Reference..." +7. check the box next to SDL +8. click OK to close the dialog +9. SDL will now show up in the list of references. Click OK to close that + dialog. + +Your project is now linked to SDL's project, insofar that when the app is +built, SDL will be built as well, with its build output getting included with +your app. + + +### 4. Adjust Your App's Build Settings ### + +Some build settings need to be changed in your app's project. This guide will +outline the following: + +- making sure that the compiler knows where to find SDL's header files +- **Optional for C++, but NECESSARY for compiling C code:** telling the + compiler not to use Microsoft's C++ extensions for WinRT development. +- **Optional:** telling the compiler not generate errors due to missing + precompiled header files. + +To change these settings: + +1. right-click on the project +2. choose "Properties" +3. in the drop-down box next to "Configuration", choose, "All Configurations" +4. in the drop-down box next to "Platform", choose, "All Platforms" +5. in the left-hand list, expand the "C/C++" section +6. select "General" +7. edit the "Additional Include Directories" setting, and add a path to SDL's + "include" directory +8. **Optional: to enable compilation of C code:** change the setting for + "Consume Windows Runtime Extension" from "Yes (/ZW)" to "No". If you're + working with a completely C++ based project, this step can usually be + omitted. +9. **Optional: to disable precompiled headers (which can produce + 'stdafx.h'-related build errors, if setup incorrectly:** in the left-hand + list, select "Precompiled Headers", then change the setting for "Precompiled + Header" from "Use (/Yu)" to "Not Using Precompiled Headers". +10. close the dialog, saving settings, by clicking the "OK" button + + +### 5. Add a WinRT-appropriate main function, and a blank-cursor image, to the app. ### + +A few files should be included directly in your app's MSVC project, specifically: +1. a WinRT-appropriate main function (which is different than main() functions on + other platforms) +2. a Win32-style cursor resource, used by SDL_ShowCursor() to hide the mouse cursor + (if and when the app needs to do so). *If this cursor resource is not + included, mouse-position reporting may fail if and when the cursor is + hidden, due to possible bugs/design-oddities in Windows itself.* + +To include these files for C/C++ projects: + +1. right-click on your project (again, in Visual C++'s Solution Explorer), + navigate to "Add", then choose "Existing Item...". +2. navigate to the directory containing SDL's source code, then into its + subdirectory, 'src/main/winrt/'. Select, then add, the following files: + - `SDL_winrt_main_NonXAML.cpp` + - `SDL2-WinRTResources.rc` + - `SDL2-WinRTResource_BlankCursor.cur` +3. right-click on the file `SDL_winrt_main_NonXAML.cpp` (as listed in your + project), then click on "Properties...". +4. in the drop-down box next to "Configuration", choose, "All Configurations" +5. in the drop-down box next to "Platform", choose, "All Platforms" +6. in the left-hand list, click on "C/C++" +7. change the setting for "Consume Windows Runtime Extension" to "Yes (/ZW)". +8. click the OK button. This will close the dialog. + +**NOTE: C++/CX compilation is currently required in at least one file of your +app's project. This is to make sure that Visual C++'s linker builds a 'Windows +Metadata' file (.winmd) for your app. Not doing so can lead to build errors.** + +For non-C++ projects, you will need to call SDL_WinRTRunApp from your language's +main function, and generate SDL2-WinRTResources.res manually by using `rc` via +the Developer Command Prompt and including it as a within the +first block in your Visual Studio project file. + +### 6. Add app code and assets ### + +At this point, you can add in SDL-specific source code. Be sure to include a +C-style main function (ie: `int main(int argc, char *argv[])`). From there you +should be able to create a single `SDL_Window` (WinRT apps can only have one +window, at present), as well as an `SDL_Renderer`. Direct3D will be used to +draw content. Events are received via SDL's usual event functions +(`SDL_PollEvent`, etc.) If you have a set of existing source files and assets, +you can start adding them to the project now. If not, or if you would like to +make sure that you're setup correctly, some short and simple sample code is +provided below. + + +#### 6.A. ... when creating a new app #### + +If you are creating a new app (rather than porting an existing SDL-based app), +or if you would just like a simple app to test SDL/WinRT with before trying to +get existing code working, some working SDL/WinRT code is provided below. To +set this up: + +1. right click on your app's project +2. select Add, then New Item. An "Add New Item" dialog will show up. +3. from the left-hand list, choose "Visual C++" +4. from the middle/main list, choose "C++ File (.cpp)" +5. near the bottom of the dialog, next to "Name:", type in a name for your +source file, such as, "main.cpp". +6. click on the Add button. This will close the dialog, add the new file to +your project, and open the file in Visual C++'s text editor. +7. Copy and paste the following code into the new file, then save it. + +```c +#include + +int main(int argc, char **argv) +{ + SDL_DisplayMode mode; + SDL_Window * window = NULL; + SDL_Renderer * renderer = NULL; + SDL_Event evt; + SDL_bool keep_going = SDL_TRUE; + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + return 1; + } else if (SDL_GetCurrentDisplayMode(0, &mode) != 0) { + return 1; + } else if (SDL_CreateWindowAndRenderer(mode.w, mode.h, SDL_WINDOW_FULLSCREEN, &window, &renderer) != 0) { + return 1; + } + + while (keep_going) { + while (SDL_PollEvent(&evt)) { + if ((evt.type == SDL_KEYDOWN) && (evt.key.keysym.sym == SDLK_ESCAPE)) { + keep_going = SDL_FALSE; + } + } + + SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); + SDL_RenderClear(renderer); + SDL_RenderPresent(renderer); + } + + SDL_Quit(); + return 0; +} +``` + +#### 6.B. Adding code and assets #### + +If you have existing code and assets that you'd like to add, you should be able +to add them now. The process for adding a set of files is as such. + +1. right click on the app's project +2. select Add, then click on "New Item..." +3. open any source, header, or asset files as appropriate. Support for C and +C++ is available. + +Do note that WinRT only supports a subset of the APIs that are available to +Win32-based apps. Many portions of the Win32 API and the C runtime are not +available. + +A list of unsupported C APIs can be found at + + +General information on using the C runtime in WinRT can be found at + + +A list of supported Win32 APIs for WinRT apps can be found at +. To note, +the list of supported Win32 APIs for Windows Phone 8.0 is different. +That list can be found at + + + +### 7. Build and run your app ### + +Your app project should now be setup, and you should be ready to build your app. +To run it on the local machine, open the Debug menu and choose "Start +Debugging". This will build your app, then run your app full-screen. To switch +out of your app, press the Windows key. Alternatively, you can choose to run +your app in a window. To do this, before building and running your app, find +the drop-down menu in Visual C++'s toolbar that says, "Local Machine". Expand +this by clicking on the arrow on the right side of the list, then click on +Simulator. Once you do that, any time you build and run the app, the app will +launch in window, rather than full-screen. + + +#### 7.A. Running apps on older, ARM-based, "Windows RT" devices #### + +**These instructions do not include Windows Phone, despite Windows Phone +typically running on ARM processors.** They are specifically for devices +that use the "Windows RT" operating system, which was a modified version of +Windows 8.x that ran primarily on ARM-based tablet computers. + +To build and run the app on ARM-based, "Windows RT" devices, you'll need to: + +- install Microsoft's "Remote Debugger" on the device. Visual C++ installs and + debugs ARM-based apps via IP networks. +- change a few options on the development machine, both to make sure it builds + for ARM (rather than x86 or x64), and to make sure it knows how to find the + Windows RT device (on the network). + +Microsoft's Remote Debugger can be found at +. Please note +that separate versions of this debugger exist for different versions of Visual +C++, one each for MSVC 2015, 2013, and 2012. + +To setup Visual C++ to launch your app on an ARM device: + +1. make sure the Remote Debugger is running on your ARM device, and that it's on + the same IP network as your development machine. +2. from Visual C++'s toolbar, find a drop-down menu that says, "Win32". Click + it, then change the value to "ARM". +3. make sure Visual C++ knows the hostname or IP address of the ARM device. To + do this: + 1. open the app project's properties + 2. select "Debugging" + 3. next to "Machine Name", enter the hostname or IP address of the ARM + device + 4. if, and only if, you've turned off authentication in the Remote Debugger, + then change the setting for "Require Authentication" to No + 5. click "OK" +4. build and run the app (from Visual C++). The first time you do this, a + prompt will show up on the ARM device, asking for a Microsoft Account. You + do, unfortunately, need to log in here, and will need to follow the + subsequent registration steps in order to launch the app. After you do so, + if the app didn't already launch, try relaunching it again from within Visual + C++. + + +Troubleshooting +--------------- + +#### Build fails with message, "error LNK2038: mismatch detected for 'vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker'" + +Try adding the following to your linker flags. In MSVC, this can be done by +right-clicking on the app project, navigating to Configuration Properties -> +Linker -> Command Line, then adding them to the Additional Options +section. + +* For Release builds / MSVC-Configurations, add: + + /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib + +* For Debug builds / MSVC-Configurations, add: + + /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib + + +#### Mouse-motion events fail to get sent, or SDL_GetMouseState() fails to return updated values + +This may be caused by a bug in Windows itself, whereby hiding the mouse +cursor can cause mouse-position reporting to fail. + +SDL provides a workaround for this, but it requires that an app links to a +set of Win32-style cursor image-resource files. A copy of suitable resource +files can be found in `src/main/winrt/`. Adding them to an app's Visual C++ +project file should be sufficient to get the app to use them. + + +#### SDL's Visual Studio project file fails to open, with message, "The system can't find the file specified." + +This can be caused for any one of a few reasons, which Visual Studio can +report, but won't always do so in an up-front manner. + +To help determine why this error comes up: + +1. open a copy of Visual Studio without opening a project file. This can be + accomplished via Windows' Start Menu, among other means. +2. show Visual Studio's Output window. This can be done by going to VS' + menu bar, then to View, and then to Output. +3. try opening the SDL project file directly by going to VS' menu bar, then + to File, then to Open, then to Project/Solution. When a File-Open dialog + appears, open the SDL project (such as the one in SDL's source code, in its + directory, VisualC-WinRT/UWP_VS2015/). +4. after attempting to open SDL's Visual Studio project file, additional error + information will be output to the Output window. + +If Visual Studio reports (via its Output window) that the project: + +"could not be loaded because it's missing install components. To fix this launch Visual Studio setup with the following selections: +Microsoft.VisualStudio.ComponentGroup.UWP.VC" + +... then you will need to re-launch Visual Studio's installer, and make sure that +the workflow for "Universal Windows Platform development" is checked, and that its +optional component, "C++ Universal Windows Platform tools" is also checked. While +you are there, if you are planning on targeting UWP / Windows 10, also make sure +that you check the optional component, "Windows 10 SDK (10.0.10240.0)". After +making sure these items are checked as-appropriate, install them. + +Once you install these components, try re-launching Visual Studio, and re-opening +the SDL project file. If you still get the error dialog, try using the Output +window, again, seeing what Visual Studio says about it. + + +#### Game controllers / joysticks aren't working! + +Windows only permits certain game controllers and joysticks to work within +WinRT / UWP apps. Even if a game controller or joystick works in a Win32 +app, that device is not guaranteed to work inside a WinRT / UWP app. + +According to Microsoft, "Xbox compatible controllers" should work inside +UWP apps, potentially with more working in the future. This includes, but +may not be limited to, Microsoft-made Xbox controllers and USB adapters. +(Source: https://social.msdn.microsoft.com/Forums/en-US/9064838b-e8c3-4c18-8a83-19bf0dfe150d/xinput-fails-to-detect-game-controllers?forum=wpdevelop) + + diff --git a/Thirdparty/SDL2/docs/README.md b/Thirdparty/SDL2/docs/README.md new file mode 100644 index 0000000..c6084cf --- /dev/null +++ b/Thirdparty/SDL2/docs/README.md @@ -0,0 +1,63 @@ +# Simple DirectMedia Layer + +https://www.libsdl.org/ + +Simple DirectMedia Layer is a cross-platform development library designed +to provide low level access to audio, keyboard, mouse, joystick, and graphics +hardware via OpenGL and Direct3D. It is used by video playback software, +emulators, and popular games including Valve's award winning catalog +and many Humble Bundle games. + +SDL officially supports Windows, macOS, Linux, iOS, and Android. +Support for other platforms may be found in the source code. + +SDL is written in C, works natively with C++, and there are bindings +available for several other languages, including C# and Python. + +This library is distributed under the zlib license, which can be found +in the file "LICENSE.txt". + +The best way to learn how to use SDL is to check out the header files in +the "include" subdirectory and the programs in the "test" subdirectory. +The header files and test programs are well commented and always up to date. + +More documentation and FAQs are available online at [the wiki](http://wiki.libsdl.org/) + +- [Android](README-android.md) +- [CMake](README-cmake.md) +- [DirectFB](README-directfb.md) +- [DynAPI](README-dynapi.md) +- [Emscripten](README-emscripten.md) +- [GDK](README-gdk.md) +- [Gesture](README-gesture.md) +- [Git](README-git.md) +- [iOS](README-ios.md) +- [Linux](README-linux.md) +- [macOS](README-macos.md) +- [OS/2](README-os2.md) +- [Native Client](README-nacl.md) +- [Pandora](README-pandora.md) +- [Supported Platforms](README-platforms.md) +- [Porting information](README-porting.md) +- [PSP](README-psp.md) +- [PS2](README-ps2.md) +- [Raspberry Pi](README-raspberrypi.md) +- [Touch](README-touch.md) +- [Versions](README-versions.md) +- [WinCE](README-wince.md) +- [Windows](README-windows.md) +- [WinRT](README-winrt.md) +- [PSVita](README-vita.md) +- [Nokia N-Gage](README-ngage.md) + +If you need help with the library, or just want to discuss SDL related +issues, you can join the [SDL Discourse](https://discourse.libsdl.org/), +which can be used as a web forum or a mailing list, at your preference. + +If you want to report bugs or contribute patches, please submit them to +[our bug tracker](https://github.com/libsdl-org/SDL/issues) + +Enjoy! + + +Sam Lantinga diff --git a/Thirdparty/SDL2/docs/doxyfile b/Thirdparty/SDL2/docs/doxyfile new file mode 100644 index 0000000..7b80a3a --- /dev/null +++ b/Thirdparty/SDL2/docs/doxyfile @@ -0,0 +1,1561 @@ +# Doxyfile 1.5.9 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = SDL + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 2.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./output + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = YES + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = "defined=\"\def\"" \ + "discussion=\"\par Discussion:\n\"" + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set +# FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = YES + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = ./doxygen_warn.txt + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . ../include + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl \ + *.h.in \ + *.h.default \ + *.md + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = ../include/SDL_opengles2_gl2ext.h \ + ../include/SDL_opengles2_gl2platform.h \ + ../include/SDL_opengles2_khrplatform.h \ + ../include/SDL_opengl_glext.h \ + ../include/SDL_opengles2_gl2.h \ + ../include/SDL_opengles2.h \ + ../include/SDL_opengles.h \ + ../include/SDL_opengl.h \ + ../include/SDL_egl.h \ + ./release_checklist.md \ + + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = YES + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = SDL_ \ + SDL + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "SDL 2.0 Doxygen" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.libsdl.sdl20 + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = ./sdl20.chm + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 1 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = ALL + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = DOXYGEN_SHOULD_IGNORE_THIS=1 \ + DECLSPEC= \ + SDLCALL= \ + _WIN32=1 + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = ./SDL.tag + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = c:\Perl\bin\perl.exe + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 60 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 2 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/Thirdparty/SDL2/docs/release_checklist.md b/Thirdparty/SDL2/docs/release_checklist.md new file mode 100644 index 0000000..37d8b6d --- /dev/null +++ b/Thirdparty/SDL2/docs/release_checklist.md @@ -0,0 +1,49 @@ +# Release checklist + +When changing the version, run `build-scripts/update-version.sh X Y Z`, +where `X Y Z` are the major version, minor version, and patch level. So +`2 28 1` means "change the version to 2.28.1". This script does much of the +mechanical work. + + +## New feature release + +* Update `WhatsNew.txt` + +* Bump version number to 2.EVEN.0: + + * `./build-scripts/update-version.sh 2 EVEN 0` + +* Do the release + +* Update the website file include/header.inc.php to reflect the new version + +## New bugfix release + +* Check that no new API/ABI was added + + * If it was, do a new feature release (see above) instead + +* Bump version number from 2.Y.Z to 2.Y.(Z+1) (Y is even) + + * `./build-scripts/update-version.sh 2 Y Z+1` + +* Do the release + +* Update the website file include/header.inc.php to reflect the new version + +## After a feature release + +* Create a branch like `release-2.24.x` + +* Bump version number to 2.ODD.0 for next development branch + + * `./build-scripts/update-version.sh 2 ODD 0` + +## New development prerelease + +* Bump version number from 2.Y.Z to 2.Y.(Z+1) (Y is odd) + + * `./build-scripts/update-version.sh 2 Y Z+1` + +* Do the release diff --git a/Thirdparty/SDL2/include/SDL.h b/Thirdparty/SDL2/include/SDL.h new file mode 100644 index 0000000..9ba8f68 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL.h @@ -0,0 +1,233 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL.h + * + * Main include header for the SDL library + */ + + +#ifndef SDL_h_ +#define SDL_h_ + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_assert.h" +#include "SDL_atomic.h" +#include "SDL_audio.h" +#include "SDL_clipboard.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_filesystem.h" +#include "SDL_gamecontroller.h" +#include "SDL_guid.h" +#include "SDL_haptic.h" +#include "SDL_hidapi.h" +#include "SDL_hints.h" +#include "SDL_joystick.h" +#include "SDL_loadso.h" +#include "SDL_log.h" +#include "SDL_messagebox.h" +#include "SDL_metal.h" +#include "SDL_mutex.h" +#include "SDL_power.h" +#include "SDL_render.h" +#include "SDL_rwops.h" +#include "SDL_sensor.h" +#include "SDL_shape.h" +#include "SDL_system.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_version.h" +#include "SDL_video.h" +#include "SDL_locale.h" +#include "SDL_misc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* As of version 0.5, SDL is loaded dynamically into the application */ + +/** + * \name SDL_INIT_* + * + * These are the flags which may be passed to SDL_Init(). You should + * specify the subsystems which you will be using in your application. + */ +/* @{ */ +#define SDL_INIT_TIMER 0x00000001u +#define SDL_INIT_AUDIO 0x00000010u +#define SDL_INIT_VIDEO 0x00000020u /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ +#define SDL_INIT_JOYSTICK 0x00000200u /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ +#define SDL_INIT_HAPTIC 0x00001000u +#define SDL_INIT_GAMECONTROLLER 0x00002000u /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ +#define SDL_INIT_EVENTS 0x00004000u +#define SDL_INIT_SENSOR 0x00008000u +#define SDL_INIT_NOPARACHUTE 0x00100000u /**< compatibility; this flag is ignored. */ +#define SDL_INIT_EVERYTHING ( \ + SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ + SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR \ + ) +/* @} */ + +/** + * Initialize the SDL library. + * + * SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the + * two may be used interchangeably. Though for readability of your code + * SDL_InitSubSystem() might be preferred. + * + * The file I/O (for example: SDL_RWFromFile) and threading (SDL_CreateThread) + * subsystems are initialized by default. Message boxes + * (SDL_ShowSimpleMessageBox) also attempt to work without initializing the + * video subsystem, in hopes of being useful in showing an error dialog when + * SDL_Init fails. You must specifically initialize other subsystems if you + * use them in your application. + * + * Logging (such as SDL_Log) works without initialization, too. + * + * `flags` may be any of the following OR'd together: + * + * - `SDL_INIT_TIMER`: timer subsystem + * - `SDL_INIT_AUDIO`: audio subsystem + * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events + * subsystem + * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the + * events subsystem + * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem + * - `SDL_INIT_GAMECONTROLLER`: controller subsystem; automatically + * initializes the joystick subsystem + * - `SDL_INIT_EVENTS`: events subsystem + * - `SDL_INIT_EVERYTHING`: all of the above subsystems + * - `SDL_INIT_NOPARACHUTE`: compatibility; this flag is ignored + * + * Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem() + * for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or + * call SDL_Quit() to force shutdown). If a subsystem is already loaded then + * this call will increase the ref-count and return. + * + * \param flags subsystem initialization flags + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + * \sa SDL_SetMainReady + * \sa SDL_WasInit + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** + * Compatibility function to initialize the SDL library. + * + * In SDL2, this function and SDL_Init() are interchangeable. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_Quit + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** + * Shut down specific SDL subsystems. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * SDL_QuitSubSystem() and SDL_WasInit() will not work. You will need to use + * that subsystem's quit function (SDL_VideoQuit()) directly instead. But + * generally, you should not be using those functions directly anyhow; use + * SDL_Init() instead. + * + * You still need to call SDL_Quit() even if you close all open subsystems + * with SDL_QuitSubSystem(). + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** + * Get a mask of the specified subsystems which are currently initialized. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it + * returns the initialization status of the specified subsystems. + * + * The return value does not include SDL_INIT_NOPARACHUTE. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_InitSubSystem + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** + * Clean up all initialized subsystems. + * + * You should call this function even if you have already shutdown each + * initialized subsystem with SDL_QuitSubSystem(). It is safe to call this + * function even in the case of errors in initialization. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * then you must use that subsystem's quit function (SDL_VideoQuit()) to shut + * it down before calling SDL_Quit(). But generally, you should not be using + * those functions directly anyhow; use SDL_Init() instead. + * + * You can use this function with atexit() to ensure that it is run when your + * application is shutdown, but it is not wise to do this from a library or + * other dynamically loaded code. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_assert.h b/Thirdparty/SDL2/include/SDL_assert.h new file mode 100644 index 0000000..87d5c1b --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_assert.h @@ -0,0 +1,320 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_assert_h_ +#define SDL_assert_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDL_ASSERT_LEVEL +#ifdef SDL_DEFAULT_ASSERT_LEVEL +#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL +#elif defined(_DEBUG) || defined(DEBUG) || \ + (defined(__GNUC__) && !defined(__OPTIMIZE__)) +#define SDL_ASSERT_LEVEL 2 +#else +#define SDL_ASSERT_LEVEL 1 +#endif +#endif /* SDL_ASSERT_LEVEL */ + +/* +These are macros and not first class functions so that the debugger breaks +on the assertion line and not in some random guts of SDL, and so each +assert can have unique static variables associated with it. +*/ + +#if defined(_MSC_VER) +/* Don't include intrin.h here because it contains C++ code */ + extern void __cdecl __debugbreak(void); + #define SDL_TriggerBreakpoint() __debugbreak() +#elif _SDL_HAS_BUILTIN(__builtin_debugtrap) + #define SDL_TriggerBreakpoint() __builtin_debugtrap() +#elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) ) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) +#elif ( defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */ + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" ) +#elif defined(__APPLE__) && defined(__arm__) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "bkpt #22\n\t" ) +#elif defined(__386__) && defined(__WATCOMC__) + #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } +#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__) + #include + #define SDL_TriggerBreakpoint() raise(SIGTRAP) +#else + /* How do we trigger breakpoints on this platform? */ + #define SDL_TriggerBreakpoint() +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +# define SDL_FUNCTION __func__ +#elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__)) +# define SDL_FUNCTION __FUNCTION__ +#else +# define SDL_FUNCTION "???" +#endif +#define SDL_FILE __FILE__ +#define SDL_LINE __LINE__ + +/* +sizeof (x) makes the compiler still parse the expression even without +assertions enabled, so the code is always checked at compile time, but +doesn't actually generate code for it, so there are no side effects or +expensive checks at run time, just the constant size of what x WOULD be, +which presumably gets optimized out as unused. +This also solves the problem of... + + int somevalue = blah(); + SDL_assert(somevalue == 1); + +...which would cause compiles to complain that somevalue is unused if we +disable assertions. +*/ + +/* "while (0,0)" fools Microsoft's compiler's /W4 warning level into thinking + this condition isn't constant. And looks like an owl's face! */ +#ifdef _MSC_VER /* stupid /W4 warnings. */ +#define SDL_NULL_WHILE_LOOP_CONDITION (0,0) +#else +#define SDL_NULL_WHILE_LOOP_CONDITION (0) +#endif + +#define SDL_disabled_assert(condition) \ + do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) + +typedef enum +{ + SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ + SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ + SDL_ASSERTION_ABORT, /**< Terminate the program. */ + SDL_ASSERTION_IGNORE, /**< Ignore the assert. */ + SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */ +} SDL_AssertState; + +typedef struct SDL_AssertData +{ + int always_ignore; + unsigned int trigger_count; + const char *condition; + const char *filename; + int linenum; + const char *function; + const struct SDL_AssertData *next; +} SDL_AssertData; + +/* Never call this directly. Use the SDL_assert* macros. */ +extern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *, + const char *, + const char *, int) +#if defined(__clang__) +#if __has_feature(attribute_analyzer_noreturn) +/* this tells Clang's static analysis that we're a custom assert function, + and that the analyzer should assume the condition was always true past this + SDL_assert test. */ + __attribute__((analyzer_noreturn)) +#endif +#endif +; + +/* the do {} while(0) avoids dangling else problems: + if (x) SDL_assert(y); else blah(); + ... without the do/while, the "else" could attach to this macro's "if". + We try to handle just the minimum we need here in a macro...the loop, + the static vars, and break points. The heavy lifting is handled in + SDL_ReportAssertion(), in SDL_assert.c. +*/ +#define SDL_enabled_assert(condition) \ + do { \ + while ( !(condition) ) { \ + static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \ + const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \ + if (sdl_assert_state == SDL_ASSERTION_RETRY) { \ + continue; /* go again. */ \ + } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \ + SDL_TriggerBreakpoint(); \ + } \ + break; /* not retrying. */ \ + } \ + } while (SDL_NULL_WHILE_LOOP_CONDITION) + +/* Enable various levels of assertions. */ +#if SDL_ASSERT_LEVEL == 0 /* assertions disabled */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_disabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 1 /* release settings. */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 2 /* normal settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) +#else +# error Unknown assertion level. +#endif + +/* this assertion is never disabled at any level. */ +#define SDL_assert_always(condition) SDL_enabled_assert(condition) + + +/** + * A callback that fires when an SDL assertion fails. + * + * \param data a pointer to the SDL_AssertData structure corresponding to the + * current assertion + * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler() + * \returns an SDL_AssertState value indicating how to handle the failure. + */ +typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( + const SDL_AssertData* data, void* userdata); + +/** + * Set an application-defined assertion handler. + * + * This function allows an application to show its own assertion UI and/or + * force the response to an assertion failure. If the application doesn't + * provide this, SDL will try to do the right thing, popping up a + * system-specific GUI dialog, and probably minimizing any fullscreen windows. + * + * This callback may fire from any thread, but it runs wrapped in a mutex, so + * it will only fire from one thread at a time. + * + * This callback is NOT reset to SDL's internal handler upon SDL_Quit()! + * + * \param handler the SDL_AssertionHandler function to call when an assertion + * fails or NULL for the default handler + * \param userdata a pointer that is passed to `handler` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAssertionHandler + */ +extern DECLSPEC void SDLCALL SDL_SetAssertionHandler( + SDL_AssertionHandler handler, + void *userdata); + +/** + * Get the default assertion handler. + * + * This returns the function pointer that is called by default when an + * assertion is triggered. This is an internal function provided by SDL, that + * is used for assertions when SDL_SetAssertionHandler() hasn't been used to + * provide a different function. + * + * \returns the default SDL_AssertionHandler that is called when an assert + * triggers. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GetAssertionHandler + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void); + +/** + * Get the current assertion handler. + * + * This returns the function pointer that is called when an assertion is + * triggered. This is either the value last passed to + * SDL_SetAssertionHandler(), or if no application-specified function is set, + * is equivalent to calling SDL_GetDefaultAssertionHandler(). + * + * The parameter `puserdata` is a pointer to a void*, which will store the + * "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value + * will always be NULL for the default handler. If you don't care about this + * data, it is safe to pass a NULL pointer to this function to ignore it. + * + * \param puserdata pointer which is filled with the "userdata" pointer that + * was passed to SDL_SetAssertionHandler() + * \returns the SDL_AssertionHandler that is called when an assert triggers. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_SetAssertionHandler + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata); + +/** + * Get a list of all assertion failures. + * + * This function gets all assertions triggered since the last call to + * SDL_ResetAssertionReport(), or the start of the program. + * + * The proper way to examine this data looks something like this: + * + * ```c + * const SDL_AssertData *item = SDL_GetAssertionReport(); + * while (item) { + * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n", + * item->condition, item->function, item->filename, + * item->linenum, item->trigger_count, + * item->always_ignore ? "yes" : "no"); + * item = item->next; + * } + * ``` + * + * \returns a list of all failed assertions or NULL if the list is empty. This + * memory should not be modified or freed by the application. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ResetAssertionReport + */ +extern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); + +/** + * Clear the list of all assertion failures. + * + * This function will clear the list of all assertions triggered up to that + * point. Immediately following this call, SDL_GetAssertionReport will return + * no items. In addition, any previously-triggered assertions will be reset to + * a trigger_count of zero, and their always_ignore state will be false. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAssertionReport + */ +extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void); + + +/* these had wrong naming conventions until 2.0.4. Please update your app! */ +#define SDL_assert_state SDL_AssertState +#define SDL_assert_data SDL_AssertData + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_assert_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_atomic.h b/Thirdparty/SDL2/include/SDL_atomic.h new file mode 100644 index 0000000..1dd816a --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_atomic.h @@ -0,0 +1,414 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_atomic.h + * + * Atomic operations. + * + * IMPORTANT: + * If you are not an expert in concurrent lockless programming, you should + * only be using the atomic lock and reference counting functions in this + * file. In all other cases you should be protecting your data structures + * with full mutexes. + * + * The list of "safe" functions to use are: + * SDL_AtomicLock() + * SDL_AtomicUnlock() + * SDL_AtomicIncRef() + * SDL_AtomicDecRef() + * + * Seriously, here be dragons! + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * + * You can find out a little more about lockless programming and the + * subtle issues that can arise here: + * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx + * + * There's also lots of good information here: + * http://www.1024cores.net/home/lock-free-algorithms + * http://preshing.com/ + * + * These operations may or may not actually be implemented using + * processor specific atomic operations. When possible they are + * implemented as true processor specific atomic operations. When that + * is not possible the are implemented using locks that *do* use the + * available atomic operations. + * + * All of the atomic operations that modify memory are full memory barriers. + */ + +#ifndef SDL_atomic_h_ +#define SDL_atomic_h_ + +#include "SDL_stdinc.h" +#include "SDL_platform.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name SDL AtomicLock + * + * The atomic locks are efficient spinlocks using CPU instructions, + * but are vulnerable to starvation and can spin forever if a thread + * holding a lock has been terminated. For this reason you should + * minimize the code executed inside an atomic lock and never do + * expensive things like API or system calls while holding them. + * + * The atomic locks are not safe to lock recursively. + * + * Porting Note: + * The spin lock functions and type are required and can not be + * emulated because they are used in the atomic emulation code. + */ +/* @{ */ + +typedef int SDL_SpinLock; + +/** + * Try to lock a spin lock by setting it to a non-zero value. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * \returns SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already + * held. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicLock + * \sa SDL_AtomicUnlock + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); + +/** + * Lock a spin lock by setting it to a non-zero value. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicTryLock + * \sa SDL_AtomicUnlock + */ +extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); + +/** + * Unlock a spin lock by setting it to 0. + * + * Always returns immediately. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicLock + * \sa SDL_AtomicTryLock + */ +extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); + +/* @} *//* SDL AtomicLock */ + + +/** + * The compiler barrier prevents the compiler from reordering + * reads and writes to globally visible variables across the call. + */ +#if defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__) +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) +#define SDL_CompilerBarrier() _ReadWriteBarrier() +#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */ +#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") +#elif defined(__WATCOMC__) +extern __inline void SDL_CompilerBarrier(void); +#pragma aux SDL_CompilerBarrier = "" parm [] modify exact []; +#else +#define SDL_CompilerBarrier() \ +{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } +#endif + +/** + * Memory barriers are designed to prevent reads and writes from being + * reordered by the compiler and being seen out of order on multi-core CPUs. + * + * A typical pattern would be for thread A to write some data and a flag, and + * for thread B to read the flag and get the data. In this case you would + * insert a release barrier between writing the data and the flag, + * guaranteeing that the data write completes no later than the flag is + * written, and you would insert an acquire barrier between reading the flag + * and reading the data, to ensure that all the reads associated with the flag + * have completed. + * + * In this pattern you should always see a release barrier paired with an + * acquire barrier and you should gate the data reads/writes with a single + * flag variable. + * + * For more information on these semantics, take a look at the blog post: + * http://preshing.com/20120913/acquire-and-release-semantics + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); +extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); + +#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory") +#elif defined(__GNUC__) && defined(__aarch64__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__GNUC__) && defined(__arm__) +#if 0 /* defined(__LINUX__) || defined(__ANDROID__) */ +/* Information from: + https://chromium.googlesource.com/chromium/chromium/+/trunk/base/atomicops_internals_arm_gcc.h#19 + + The Linux kernel provides a helper function which provides the right code for a memory barrier, + hard-coded at address 0xffff0fa0 +*/ +typedef void (*SDL_KernelMemoryBarrierFunc)(); +#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#elif 0 /* defined(__QNXNTO__) */ +#include + +#define SDL_MemoryBarrierRelease() __cpu_membarrier() +#define SDL_MemoryBarrierAcquire() __cpu_membarrier() +#else +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) || defined(__ARM_ARCH_8A__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_5TE__) +#ifdef __thumb__ +/* The mcr instruction isn't available in thumb mode, use real functions */ +#define SDL_MEMORY_BARRIER_USES_FUNCTION +#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction() +#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction() +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#endif /* __thumb__ */ +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory") +#endif /* __LINUX__ || __ANDROID__ */ +#endif /* __GNUC__ && __arm__ */ +#else +#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */ +#include +#define SDL_MemoryBarrierRelease() __machine_rel_barrier() +#define SDL_MemoryBarrierAcquire() __machine_acq_barrier() +#else +/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */ +#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier() +#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier() +#endif +#endif + +/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */ +#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */ +#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory") +#elif (defined(__powerpc__) || defined(__powerpc64__)) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27"); +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + #define SDL_CPUPauseInstruction() _mm_pause() /* this is actually "rep nop" and not a SIMD instruction. No inline asm in MSVC x86-64! */ +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) + #define SDL_CPUPauseInstruction() __yield() +#elif defined(__WATCOMC__) && defined(__386__) + extern __inline void SDL_CPUPauseInstruction(void); + #pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause" +#else + #define SDL_CPUPauseInstruction() +#endif + + +/** + * \brief A type representing an atomic integer value. It is a struct + * so people don't accidentally use numeric operations on it. + */ +typedef struct { int value; } SDL_atomic_t; + +/** + * Set an atomic variable to a new value if it is currently an old value. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param oldval the old value + * \param newval the new value + * \returns SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicGet + * \sa SDL_AtomicSet + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval); + +/** + * Set an atomic variable to a value. + * + * This function also acts as a full memory barrier. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param v the desired value + * \returns the previous value of the atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicGet + */ +extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v); + +/** + * Get the value of an atomic variable. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable + * \returns the current value of an atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicSet + */ +extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a); + +/** + * Add to an atomic variable. + * + * This function also acts as a full memory barrier. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param v the desired value to add + * \returns the previous value of the atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicDecRef + * \sa SDL_AtomicIncRef + */ +extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v); + +/** + * \brief Increment an atomic variable used as a reference count. + */ +#ifndef SDL_AtomicIncRef +#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#endif + +/** + * \brief Decrement an atomic variable used as a reference count. + * + * \return SDL_TRUE if the variable reached zero after decrementing, + * SDL_FALSE otherwise + */ +#ifndef SDL_AtomicDecRef +#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#endif + +/** + * Set a pointer to a new value if it is currently an old value. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \param oldval the old pointer value + * \param newval the new pointer value + * \returns SDL_TRUE if the pointer was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicCAS + * \sa SDL_AtomicGetPtr + * \sa SDL_AtomicSetPtr + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval); + +/** + * Set a pointer to a value atomically. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \param v the desired pointer value + * \returns the previous value of the pointer. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicGetPtr + */ +extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); + +/** + * Get the value of a pointer atomically. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \returns the current value of a pointer. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicSetPtr + */ +extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif + +#include "close_code.h" + +#endif /* SDL_atomic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_audio.h b/Thirdparty/SDL2/include/SDL_audio.h new file mode 100644 index 0000000..ccd3598 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_audio.h @@ -0,0 +1,1500 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/* !!! FIXME: several functions in here need Doxygen comments. */ + +/** + * \file SDL_audio.h + * + * Access to the raw audio mixing buffer for the SDL library. + */ + +#ifndef SDL_audio_h_ +#define SDL_audio_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Audio format flags. + * + * These are what the 16 bits in SDL_AudioFormat currently mean... + * (Unspecified bits are always zero). + * + * \verbatim + ++-----------------------sample is signed if set + || + || ++-----------sample is bigendian if set + || || + || || ++---sample is float if set + || || || + || || || +---sample bit size---+ + || || || | | + 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + \endverbatim + * + * There are macros in SDL 2.0 and later to query these bits. + */ +typedef Uint16 SDL_AudioFormat; + +/** + * \name Audio flags + */ +/* @{ */ + +#define SDL_AUDIO_MASK_BITSIZE (0xFF) +#define SDL_AUDIO_MASK_DATATYPE (1<<8) +#define SDL_AUDIO_MASK_ENDIAN (1<<12) +#define SDL_AUDIO_MASK_SIGNED (1<<15) +#define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE) +#define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE) +#define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN) +#define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED) +#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) +#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) +#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) + +/** + * \name Audio format flags + * + * Defaults to LSB byte order. + */ +/* @{ */ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB +/* @} */ + +/** + * \name int32 support + */ +/* @{ */ +#define AUDIO_S32LSB 0x8020 /**< 32-bit integer samples */ +#define AUDIO_S32MSB 0x9020 /**< As above, but big-endian byte order */ +#define AUDIO_S32 AUDIO_S32LSB +/* @} */ + +/** + * \name float32 support + */ +/* @{ */ +#define AUDIO_F32LSB 0x8120 /**< 32-bit floating point samples */ +#define AUDIO_F32MSB 0x9120 /**< As above, but big-endian byte order */ +#define AUDIO_F32 AUDIO_F32LSB +/* @} */ + +/** + * \name Native audio byte ordering + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#define AUDIO_S32SYS AUDIO_S32LSB +#define AUDIO_F32SYS AUDIO_F32LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#define AUDIO_S32SYS AUDIO_S32MSB +#define AUDIO_F32SYS AUDIO_F32MSB +#endif +/* @} */ + +/** + * \name Allow change flags + * + * Which audio format changes are allowed when opening a device. + */ +/* @{ */ +#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001 +#define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002 +#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004 +#define SDL_AUDIO_ALLOW_SAMPLES_CHANGE 0x00000008 +#define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE|SDL_AUDIO_ALLOW_SAMPLES_CHANGE) +/* @} */ + +/* @} *//* Audio flags */ + +/** + * This function is called when the audio device needs more data. + * + * \param userdata An application-specific parameter saved in + * the SDL_AudioSpec structure + * \param stream A pointer to the audio data buffer. + * \param len The length of that buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + * + * You can choose to avoid callbacks and use SDL_QueueAudio() instead, if + * you like. Just open your audio device with a NULL callback. + */ +typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, + int len); + +/** + * The calculated values in this structure are calculated by SDL_OpenAudio(). + * + * For multi-channel audio, the default SDL channel mapping is: + * 2: FL FR (stereo) + * 3: FL FR LFE (2.1 surround) + * 4: FL FR BL BR (quad) + * 5: FL FR LFE BL BR (4.1 surround) + * 6: FL FR FC LFE SL SR (5.1 surround - last two can also be BL BR) + * 7: FL FR FC LFE BC SL SR (6.1 surround) + * 8: FL FR FC LFE BL BR SL SR (7.1 surround) + */ +typedef struct SDL_AudioSpec +{ + int freq; /**< DSP frequency -- samples per second */ + SDL_AudioFormat format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */ + void *userdata; /**< Userdata passed to callback (ignored for NULL callbacks). */ +} SDL_AudioSpec; + + +struct SDL_AudioCVT; +typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt, + SDL_AudioFormat format); + +/** + * \brief Upper limit of filters in SDL_AudioCVT + * + * The maximum number of SDL_AudioFilter functions in SDL_AudioCVT is + * currently limited to 9. The SDL_AudioCVT.filters array has 10 pointers, + * one of which is the terminating NULL pointer. + */ +#define SDL_AUDIOCVT_MAX_FILTERS 9 + +/** + * \struct SDL_AudioCVT + * \brief A structure to hold a set of audio conversion filters and buffers. + * + * Note that various parts of the conversion pipeline can take advantage + * of SIMD operations (like SSE2, for example). SDL_AudioCVT doesn't require + * you to pass it aligned data, but can possibly run much faster if you + * set both its (buf) field to a pointer that is aligned to 16 bytes, and its + * (len) field to something that's a multiple of 16, if possible. + */ +#if defined(__GNUC__) && !defined(__CHERI_PURE_CAPABILITY__) +/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't + pad it out to 88 bytes to guarantee ABI compatibility between compilers. + This is not a concern on CHERI architectures, where pointers must be stored + at aligned locations otherwise they will become invalid, and thus structs + containing pointers cannot be packed without giving a warning or error. + vvv + The next time we rev the ABI, make sure to size the ints and add padding. +*/ +#define SDL_AUDIOCVT_PACKED __attribute__((packed)) +#else +#define SDL_AUDIOCVT_PACKED +#endif +/* */ +typedef struct SDL_AudioCVT +{ + int needed; /**< Set to 1 if conversion possible */ + SDL_AudioFormat src_format; /**< Source audio format */ + SDL_AudioFormat dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + SDL_AudioFilter filters[SDL_AUDIOCVT_MAX_FILTERS + 1]; /**< NULL-terminated list of filter functions */ + int filter_index; /**< Current audio conversion function */ +} SDL_AUDIOCVT_PACKED SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * \name Driver discovery functions + * + * These functions return the list of built in audio drivers, in the + * order that they are normally initialized by default. + */ +/* @{ */ + +/** + * Use this function to get the number of built-in audio drivers. + * + * This function returns a hardcoded number. This never returns a negative + * value; if there are no drivers compiled into this build of SDL, this + * function returns zero. The presence of a driver in this list does not mean + * it will function, it just means SDL is capable of interacting with that + * interface. For example, a build of SDL might have esound support, but if + * there's no esound server available, SDL's esound driver would fail if used. + * + * By default, SDL tries all drivers, in its preferred order, until one is + * found to be usable. + * + * \returns the number of built-in audio drivers. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDriver + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); + +/** + * Use this function to get the name of a built in audio driver. + * + * The list of audio drivers is given in the order that they are normally + * initialized by default; the drivers that seem more reasonable to choose + * first (as far as the SDL developers believe) are earlier in the list. + * + * The names of drivers are all simple, low-ASCII identifiers, like "alsa", + * "coreaudio" or "xaudio2". These never have Unicode characters, and are not + * meant to be proper names. + * + * \param index the index of the audio driver; the value ranges from 0 to + * SDL_GetNumAudioDrivers() - 1 + * \returns the name of the audio driver at the requested index, or NULL if an + * invalid index was specified. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumAudioDrivers + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index); +/* @} */ + +/** + * \name Initialization and cleanup + * + * \internal These functions are used internally, and should not be used unless + * you have a specific need to specify the audio driver you want to + * use. You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/* @{ */ + +/** + * Use this function to initialize a particular audio driver. + * + * This function is used internally, and should not be used unless you have a + * specific need to designate the audio driver you want to use. You should + * normally use SDL_Init() or SDL_InitSubSystem(). + * + * \param driver_name the name of the desired audio driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioQuit + */ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); + +/** + * Use this function to shut down audio if you initialized it with + * SDL_AudioInit(). + * + * This function is used internally, and should not be used unless you have a + * specific need to specify the audio driver you want to use. You should + * normally use SDL_Quit() or SDL_QuitSubSystem(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioInit + */ +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/* @} */ + +/** + * Get the name of the current audio driver. + * + * The returned string points to internal static memory and thus never becomes + * invalid, even if you quit the audio subsystem and initialize a new driver + * (although such a case would return a different static string from another + * call to this function, of course). As such, you should not modify or free + * the returned string. + * + * \returns the name of the current audio driver or NULL if no driver has been + * initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioInit + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); + +/** + * This function is a legacy means of opening the audio device. + * + * This function remains for compatibility with SDL 1.2, but also because it's + * slightly easier to use than the new functions in SDL 2.0. The new, more + * powerful, and preferred way to do this is SDL_OpenAudioDevice(). + * + * This function is roughly equivalent to: + * + * ```c + * SDL_OpenAudioDevice(NULL, 0, desired, obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); + * ``` + * + * With two notable exceptions: + * + * - If `obtained` is NULL, we use `desired` (and allow no changes), which + * means desired will be modified to have the correct values for silence, + * etc, and SDL will convert any differences between your app's specific + * request and the hardware behind the scenes. + * - The return value is always success or failure, and not a device ID, which + * means you can only have one device open at a time with this function. + * + * \param desired an SDL_AudioSpec structure representing the desired output + * format. Please refer to the SDL_OpenAudioDevice + * documentation for details on how to prepare this structure. + * \param obtained an SDL_AudioSpec structure filled in with the actual + * parameters, or NULL. + * \returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by `obtained`. + * + * If `obtained` is NULL, the audio data passed to the callback + * function will be guaranteed to be in the requested format, and + * will be automatically converted to the actual hardware audio + * format if necessary. If `obtained` is NULL, `desired` will have + * fields modified. + * + * This function returns a negative error code on failure to open the + * audio device or failure to set up the audio thread; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CloseAudio + * \sa SDL_LockAudio + * \sa SDL_PauseAudio + * \sa SDL_UnlockAudio + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, + SDL_AudioSpec * obtained); + +/** + * SDL Audio Device IDs. + * + * A successful call to SDL_OpenAudio() is always device id 1, and legacy + * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls + * always returns devices >= 2 on success. The legacy calls are good both + * for backwards compatibility and when you don't care about multiple, + * specific, or capture devices. + */ +typedef Uint32 SDL_AudioDeviceID; + +/** + * Get the number of built-in audio devices. + * + * This function is only valid after successfully initializing the audio + * subsystem. + * + * Note that audio capture support is not implemented as of SDL 2.0.4, so the + * `iscapture` parameter is for future expansion and should always be zero for + * now. + * + * This function will return -1 if an explicit list of devices can't be + * determined. Returning -1 is not an error. For example, if SDL is set up to + * talk to a remote audio server, it can't list every one available on the + * Internet, but it will still allow a specific host to be specified in + * SDL_OpenAudioDevice(). + * + * In many common cases, when this function returns a value <= 0, it can still + * successfully open the default device (NULL for first argument of + * SDL_OpenAudioDevice()). + * + * This function may trigger a complete redetect of available hardware. It + * should not be called for each iteration of a loop, but rather once at the + * start of a loop: + * + * ```c + * // Don't do this: + * for (int i = 0; i < SDL_GetNumAudioDevices(0); i++) + * + * // do this instead: + * const int count = SDL_GetNumAudioDevices(0); + * for (int i = 0; i < count; ++i) { do_something_here(); } + * ``` + * + * \param iscapture zero to request playback devices, non-zero to request + * recording devices + * \returns the number of available devices exposed by the current driver or + * -1 if an explicit list of devices can't be determined. A return + * value of -1 does not necessarily mean an error condition. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDeviceName + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); + +/** + * Get the human-readable name of a specific audio device. + * + * This function is only valid after successfully initializing the audio + * subsystem. The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); re-call that function to redetect available + * hardware. + * + * The string returned by this function is UTF-8 encoded, read-only, and + * managed internally. You are not to free it. If you need to keep the string + * for any length of time, you should make your own copy of it, as it will be + * invalid next time any of several other SDL functions are called. + * + * \param index the index of the audio device; valid values range from 0 to + * SDL_GetNumAudioDevices() - 1 + * \param iscapture non-zero to query the list of recording devices, zero to + * query the list of output devices. + * \returns the name of the audio device at the requested index, or NULL on + * error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumAudioDevices + * \sa SDL_GetDefaultAudioInfo + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, + int iscapture); + +/** + * Get the preferred audio format of a specific audio device. + * + * This function is only valid after a successfully initializing the audio + * subsystem. The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); re-call that function to redetect available + * hardware. + * + * `spec` will be filled with the sample rate, sample format, and channel + * count. + * + * \param index the index of the audio device; valid values range from 0 to + * SDL_GetNumAudioDevices() - 1 + * \param iscapture non-zero to query the list of recording devices, zero to + * query the list of output devices. + * \param spec The SDL_AudioSpec to be initialized by this function. + * \returns 0 on success, nonzero on error + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetNumAudioDevices + * \sa SDL_GetDefaultAudioInfo + */ +extern DECLSPEC int SDLCALL SDL_GetAudioDeviceSpec(int index, + int iscapture, + SDL_AudioSpec *spec); + + +/** + * Get the name and preferred format of the default audio device. + * + * Some (but not all!) platforms have an isolated mechanism to get information + * about the "default" device. This can actually be a completely different + * device that's not in the list you get from SDL_GetAudioDeviceSpec(). It can + * even be a network address! (This is discussed in SDL_OpenAudioDevice().) + * + * As a result, this call is not guaranteed to be performant, as it can query + * the sound server directly every time, unlike the other query functions. You + * should call this function sparingly! + * + * `spec` will be filled with the sample rate, sample format, and channel + * count, if a default device exists on the system. If `name` is provided, + * will be filled with either a dynamically-allocated UTF-8 string or NULL. + * + * \param name A pointer to be filled with the name of the default device (can + * be NULL). Please call SDL_free() when you are done with this + * pointer! + * \param spec The SDL_AudioSpec to be initialized by this function. + * \param iscapture non-zero to query the default recording device, zero to + * query the default output device. + * \returns 0 on success, nonzero on error + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetAudioDeviceName + * \sa SDL_GetAudioDeviceSpec + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC int SDLCALL SDL_GetDefaultAudioInfo(char **name, + SDL_AudioSpec *spec, + int iscapture); + + +/** + * Open a specific audio device. + * + * SDL_OpenAudio(), unlike this function, always acts on device ID 1. As such, + * this function will never return a 1 so as not to conflict with the legacy + * function. + * + * Please note that SDL 2.0 before 2.0.5 did not support recording; as such, + * this function would fail if `iscapture` was not zero. Starting with SDL + * 2.0.5, recording is implemented and this value can be non-zero. + * + * Passing in a `device` name of NULL requests the most reasonable default + * (and is equivalent to what SDL_OpenAudio() does to choose a device). The + * `device` name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but + * some drivers allow arbitrary and driver-specific strings, such as a + * hostname/IP address for a remote audio server, or a filename in the + * diskaudio driver. + * + * An opened audio device starts out paused, and should be enabled for playing + * by calling SDL_PauseAudioDevice(devid, 0) when you are ready for your audio + * callback function to be called. Since the audio driver may modify the + * requested size of the audio buffer, you should allocate any local mixing + * buffers after you open the audio device. + * + * The audio callback runs in a separate thread in most cases; you can prevent + * race conditions between your callback and other threads without fully + * pausing playback with SDL_LockAudioDevice(). For more information about the + * callback, see SDL_AudioSpec. + * + * Managing the audio spec via 'desired' and 'obtained': + * + * When filling in the desired audio spec structure: + * + * - `desired->freq` should be the frequency in sample-frames-per-second (Hz). + * - `desired->format` should be the audio format (`AUDIO_S16SYS`, etc). + * - `desired->samples` is the desired size of the audio buffer, in _sample + * frames_ (with stereo output, two samples--left and right--would make a + * single sample frame). This number should be a power of two, and may be + * adjusted by the audio driver to a value more suitable for the hardware. + * Good values seem to range between 512 and 8096 inclusive, depending on + * the application and CPU speed. Smaller values reduce latency, but can + * lead to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. Note that the number of sample frames is + * directly related to time by the following formula: `ms = + * (sampleframes*1000)/freq` + * - `desired->size` is the size in _bytes_ of the audio buffer, and is + * calculated by SDL_OpenAudioDevice(). You don't initialize this. + * - `desired->silence` is the value used to set the buffer to silence, and is + * calculated by SDL_OpenAudioDevice(). You don't initialize this. + * - `desired->callback` should be set to a function that will be called when + * the audio device is ready for more data. It is passed a pointer to the + * audio buffer, and the length in bytes of the audio buffer. This function + * usually runs in a separate thread, and so you should protect data + * structures that it accesses by calling SDL_LockAudioDevice() and + * SDL_UnlockAudioDevice() in your code. Alternately, you may pass a NULL + * pointer here, and call SDL_QueueAudio() with some frequency, to queue + * more audio samples to be played (or for capture devices, call + * SDL_DequeueAudio() with some frequency, to obtain audio samples). + * - `desired->userdata` is passed as the first parameter to your callback + * function. If you passed a NULL callback, this value is ignored. + * + * `allowed_changes` can have the following flags OR'd together: + * + * - `SDL_AUDIO_ALLOW_FREQUENCY_CHANGE` + * - `SDL_AUDIO_ALLOW_FORMAT_CHANGE` + * - `SDL_AUDIO_ALLOW_CHANNELS_CHANGE` + * - `SDL_AUDIO_ALLOW_SAMPLES_CHANGE` + * - `SDL_AUDIO_ALLOW_ANY_CHANGE` + * + * These flags specify how SDL should behave when a device cannot offer a + * specific feature. If the application requests a feature that the hardware + * doesn't offer, SDL will always try to get the closest equivalent. + * + * For example, if you ask for float32 audio format, but the sound card only + * supports int16, SDL will set the hardware to int16. If you had set + * SDL_AUDIO_ALLOW_FORMAT_CHANGE, SDL will change the format in the `obtained` + * structure. If that flag was *not* set, SDL will prepare to convert your + * callback's float32 audio to int16 before feeding it to the hardware and + * will keep the originally requested format in the `obtained` structure. + * + * The resulting audio specs, varying depending on hardware and on what + * changes were allowed, will then be written back to `obtained`. + * + * If your application can only handle one specific data format, pass a zero + * for `allowed_changes` and let SDL transparently handle any differences. + * + * \param device a UTF-8 string reported by SDL_GetAudioDeviceName() or a + * driver-specific name as appropriate. NULL requests the most + * reasonable default device. + * \param iscapture non-zero to specify a device should be opened for + * recording, not playback + * \param desired an SDL_AudioSpec structure representing the desired output + * format; see SDL_OpenAudio() for more information + * \param obtained an SDL_AudioSpec structure filled in with the actual output + * format; see SDL_OpenAudio() for more information + * \param allowed_changes 0, or one or more flags OR'd together + * \returns a valid device ID that is > 0 on success or 0 on failure; call + * SDL_GetError() for more information. + * + * For compatibility with SDL 1.2, this will never return 1, since + * SDL reserves that ID for the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CloseAudioDevice + * \sa SDL_GetAudioDeviceName + * \sa SDL_LockAudioDevice + * \sa SDL_OpenAudio + * \sa SDL_PauseAudioDevice + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice( + const char *device, + int iscapture, + const SDL_AudioSpec *desired, + SDL_AudioSpec *obtained, + int allowed_changes); + + + +/** + * \name Audio state + * + * Get the current audio state. + */ +/* @{ */ +typedef enum +{ + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_AudioStatus; + +/** + * This function is a legacy means of querying the audio device. + * + * New programs might want to use SDL_GetAudioDeviceStatus() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_GetAudioDeviceStatus(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \returns the SDL_AudioStatus of the audio device opened by SDL_OpenAudio(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDeviceStatus + */ +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void); + +/** + * Use this function to get the current audio state of an audio device. + * + * \param dev the ID of an audio device previously opened with + * SDL_OpenAudioDevice() + * \returns the SDL_AudioStatus of the specified audio device. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PauseAudioDevice + */ +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev); +/* @} *//* Audio State */ + +/** + * \name Pause audio functions + * + * These functions pause and unpause the audio callback processing. + * They should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +/* @{ */ + +/** + * This function is a legacy means of pausing the audio device. + * + * New programs might want to use SDL_PauseAudioDevice() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_PauseAudioDevice(1, pause_on); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \param pause_on non-zero to pause, 0 to unpause + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioStatus + * \sa SDL_PauseAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * Use this function to pause and unpause audio playback on a specified + * device. + * + * This function pauses and unpauses the audio callback processing for a given + * device. Newly-opened audio devices start in the paused state, so you must + * call this function with **pause_on**=0 after opening the specified audio + * device to start playing sound. This allows you to safely initialize data + * for your callback function after opening the audio device. Silence will be + * written to the audio device while paused, and the audio callback is + * guaranteed to not be called. Pausing one device does not prevent other + * unpaused devices from running their callbacks. + * + * Pausing state does not stack; even if you pause a device several times, a + * single unpause will start the device playing again, and vice versa. This is + * different from how SDL_LockAudioDevice() works. + * + * If you just need to protect a few variables from race conditions vs your + * callback, you shouldn't pause the audio device, as it will lead to dropouts + * in the audio playback. Instead, you should use SDL_LockAudioDevice(). + * + * \param dev a device opened by SDL_OpenAudioDevice() + * \param pause_on non-zero to pause, 0 to unpause + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev, + int pause_on); +/* @} *//* Pause audio functions */ + +/** + * Load the audio data of a WAVE file into memory. + * + * Loading a WAVE file requires `src`, `spec`, `audio_buf` and `audio_len` to + * be valid pointers. The entire data portion of the file is then loaded into + * memory and decoded if necessary. + * + * If `freesrc` is non-zero, the data source gets automatically closed and + * freed before the function returns. + * + * Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and + * 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and + * A-law and mu-law (8 bits). Other formats are currently unsupported and + * cause an error. + * + * If this function succeeds, the pointer returned by it is equal to `spec` + * and the pointer to the audio data allocated by the function is written to + * `audio_buf` and its length in bytes to `audio_len`. The SDL_AudioSpec + * members `freq`, `channels`, and `format` are set to the values of the audio + * data in the buffer. The `samples` member is set to a sane default and all + * others are set to zero. + * + * It's necessary to use SDL_FreeWAV() to free the audio data returned in + * `audio_buf` when it is no longer used. + * + * Because of the underspecification of the .WAV format, there are many + * problematic files in the wild that cause issues with strict decoders. To + * provide compatibility with these files, this decoder is lenient in regards + * to the truncation of the file, the fact chunk, and the size of the RIFF + * chunk. The hints `SDL_HINT_WAVE_RIFF_CHUNK_SIZE`, + * `SDL_HINT_WAVE_TRUNCATION`, and `SDL_HINT_WAVE_FACT_CHUNK` can be used to + * tune the behavior of the loading process. + * + * Any file that is invalid (due to truncation, corruption, or wrong values in + * the headers), too big, or unsupported causes an error. Additionally, any + * critical I/O error from the data source will terminate the loading process + * with an error. The function returns NULL on error and in all cases (with + * the exception of `src` being NULL), an appropriate error message will be + * set. + * + * It is required that the data source supports seeking. + * + * Example: + * + * ```c + * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, &spec, &buf, &len); + * ``` + * + * Note that the SDL_LoadWAV macro does this same thing for you, but in a less + * messy way: + * + * ```c + * SDL_LoadWAV("sample.wav", &spec, &buf, &len); + * ``` + * + * \param src The data source for the WAVE data + * \param freesrc If non-zero, SDL will _always_ free the data source + * \param spec An SDL_AudioSpec that will be filled in with the wave file's + * format details + * \param audio_buf A pointer filled with the audio data, allocated by the + * function. + * \param audio_len A pointer filled with the length of the audio data buffer + * in bytes + * \returns This function, if successfully called, returns `spec`, which will + * be filled with the audio data format of the wave source data. + * `audio_buf` will be filled with a pointer to an allocated buffer + * containing the audio data, and `audio_len` is filled with the + * length of that audio buffer in bytes. + * + * This function returns NULL if the .WAV file cannot be opened, uses + * an unknown data format, or is corrupt; call SDL_GetError() for + * more information. + * + * When the application is done with the data returned in + * `audio_buf`, it should call SDL_FreeWAV() to dispose of it. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeWAV + * \sa SDL_LoadWAV + */ +extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, + int freesrc, + SDL_AudioSpec * spec, + Uint8 ** audio_buf, + Uint32 * audio_len); + +/** + * Loads a WAV from a file. + * Compatibility convenience function. + */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * Free data previously allocated with SDL_LoadWAV() or SDL_LoadWAV_RW(). + * + * After a WAVE file has been opened with SDL_LoadWAV() or SDL_LoadWAV_RW() + * its data can eventually be freed with SDL_FreeWAV(). It is safe to call + * this function with a NULL pointer. + * + * \param audio_buf a pointer to the buffer created by SDL_LoadWAV() or + * SDL_LoadWAV_RW() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadWAV + * \sa SDL_LoadWAV_RW + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); + +/** + * Initialize an SDL_AudioCVT structure for conversion. + * + * Before an SDL_AudioCVT structure can be used to convert audio data it must + * be initialized with source and destination information. + * + * This function will zero out every field of the SDL_AudioCVT, so it must be + * called before the application fills in the final buffer information. + * + * Once this function has returned successfully, and reported that a + * conversion is necessary, the application fills in the rest of the fields in + * SDL_AudioCVT, now that it knows how large a buffer it needs to allocate, + * and then can call SDL_ConvertAudio() to complete the conversion. + * + * \param cvt an SDL_AudioCVT structure filled in with audio conversion + * information + * \param src_format the source format of the audio data; for more info see + * SDL_AudioFormat + * \param src_channels the number of channels in the source + * \param src_rate the frequency (sample-frames-per-second) of the source + * \param dst_format the destination format of the audio data; for more info + * see SDL_AudioFormat + * \param dst_channels the number of channels in the destination + * \param dst_rate the frequency (sample-frames-per-second) of the destination + * \returns 1 if the audio filter is prepared, 0 if no conversion is needed, + * or a negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ConvertAudio + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, + SDL_AudioFormat src_format, + Uint8 src_channels, + int src_rate, + SDL_AudioFormat dst_format, + Uint8 dst_channels, + int dst_rate); + +/** + * Convert audio data to a desired audio format. + * + * This function does the actual audio data conversion, after the application + * has called SDL_BuildAudioCVT() to prepare the conversion information and + * then filled in the buffer details. + * + * Once the application has initialized the `cvt` structure using + * SDL_BuildAudioCVT(), allocated an audio buffer and filled it with audio + * data in the source format, this function will convert the buffer, in-place, + * to the desired format. + * + * The data conversion may go through several passes; any given pass may + * possibly temporarily increase the size of the data. For example, SDL might + * expand 16-bit data to 32 bits before resampling to a lower frequency, + * shrinking the data size after having grown it briefly. Since the supplied + * buffer will be both the source and destination, converting as necessary + * in-place, the application must allocate a buffer that will fully contain + * the data during its largest conversion pass. After SDL_BuildAudioCVT() + * returns, the application should set the `cvt->len` field to the size, in + * bytes, of the source data, and allocate a buffer that is `cvt->len * + * cvt->len_mult` bytes long for the `buf` field. + * + * The source data should be copied into this buffer before the call to + * SDL_ConvertAudio(). Upon successful return, this buffer will contain the + * converted audio, and `cvt->len_cvt` will be the size of the converted data, + * in bytes. Any bytes in the buffer past `cvt->len_cvt` are undefined once + * this function returns. + * + * \param cvt an SDL_AudioCVT structure that was previously set up by + * SDL_BuildAudioCVT(). + * \returns 0 if the conversion was completed successfully or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BuildAudioCVT + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); + +/* SDL_AudioStream is a new audio conversion interface. + The benefits vs SDL_AudioCVT: + - it can handle resampling data in chunks without generating + artifacts, when it doesn't have the complete buffer available. + - it can handle incoming data in any variable size. + - You push data as you have it, and pull it when you need it + */ +/* this is opaque to the outside world. */ +struct _SDL_AudioStream; +typedef struct _SDL_AudioStream SDL_AudioStream; + +/** + * Create a new audio stream. + * + * \param src_format The format of the source audio + * \param src_channels The number of channels of the source audio + * \param src_rate The sampling rate of the source audio + * \param dst_format The format of the desired audio output + * \param dst_channels The number of channels of the desired audio output + * \param dst_rate The sampling rate of the desired audio output + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioFormat src_format, + const Uint8 src_channels, + const int src_rate, + const SDL_AudioFormat dst_format, + const Uint8 dst_channels, + const int dst_rate); + +/** + * Add data to be converted/resampled to the stream. + * + * \param stream The stream the audio data is being added to + * \param buf A pointer to the audio data to add + * \param len The number of bytes to write to the stream + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len); + +/** + * Get converted/resampled data from the stream + * + * \param stream The stream the audio is being requested from + * \param buf A buffer to fill with audio data + * \param len The maximum number of bytes to fill + * \returns the number of bytes read from the stream, or -1 on error + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len); + +/** + * Get the number of converted/resampled bytes available. + * + * The stream may be buffering data behind the scenes until it has enough to + * resample correctly, so this number might be lower than what you expect, or + * even be zero. Add more data or flush the stream if you need the data now. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream); + +/** + * Tell the stream that you're done sending data, and anything being buffered + * should be converted/resampled and made available immediately. + * + * It is legal to add more data to a stream after flushing, but there will be + * audio gaps in the output. Generally this is intended to signal the end of + * input, so the complete output becomes available. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream); + +/** + * Clear any pending data in the stream without converting it + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream); + +/** + * Free an audio stream + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + */ +extern DECLSPEC void SDLCALL SDL_FreeAudioStream(SDL_AudioStream *stream); + +#define SDL_MIX_MAXVOLUME 128 + +/** + * This function is a legacy means of mixing audio. + * + * This function is equivalent to calling... + * + * ```c + * SDL_MixAudioFormat(dst, src, format, len, volume); + * ``` + * + * ...where `format` is the obtained format of the audio device from the + * legacy SDL_OpenAudio() function. + * + * \param dst the destination for the mixed audio + * \param src the source audio buffer to be mixed + * \param len the length of the audio buffer in bytes + * \param volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MixAudioFormat + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, + Uint32 len, int volume); + +/** + * Mix audio data in a specified format. + * + * This takes an audio buffer `src` of `len` bytes of `format` data and mixes + * it into `dst`, performing addition, volume adjustment, and overflow + * clipping. The buffer pointed to by `dst` must also be `len` bytes of + * `format` data. + * + * This is provided for convenience -- you can mix your own audio data. + * + * Do not use this function for mixing together more than two streams of + * sample data. The output from repeated application of this function may be + * distorted by clipping, because there is no accumulator with greater range + * than the input (not to mention this being an inefficient way of doing it). + * + * It is a common misconception that this function is required to write audio + * data to an output stream in an audio callback. While you can do that, + * SDL_MixAudioFormat() is really only needed when you're mixing a single + * audio stream with a volume adjustment. + * + * \param dst the destination for the mixed audio + * \param src the source audio buffer to be mixed + * \param format the SDL_AudioFormat structure representing the desired audio + * format + * \param len the length of the audio buffer in bytes + * \param volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, + const Uint8 * src, + SDL_AudioFormat format, + Uint32 len, int volume); + +/** + * Queue more audio on non-callback devices. + * + * If you are looking to retrieve queued audio from a non-callback capture + * device, you want SDL_DequeueAudio() instead. SDL_QueueAudio() will return + * -1 to signify an error if you use it with capture devices. + * + * SDL offers two ways to feed audio to the device: you can either supply a + * callback that SDL triggers with some frequency to obtain more audio (pull + * method), or you can supply no callback, and then SDL will expect you to + * supply data at regular intervals (push method) with this function. + * + * There are no limits on the amount of data you can queue, short of + * exhaustion of address space. Queued data will drain to the device as + * necessary without further intervention from you. If the device needs audio + * but there is not enough queued, it will play silence to make up the + * difference. This means you will have skips in your audio playback if you + * aren't routinely queueing sufficient data. + * + * This function copies the supplied data, so you are safe to free it when the + * function returns. This function is thread-safe, but queueing to the same + * device from two threads at once does not promise which buffer will be + * queued first. + * + * You may not queue audio on a device that is using an application-supplied + * callback; doing so returns an error. You have to use the audio callback or + * queue audio with this function, but not both. + * + * You should not call SDL_LockAudio() on the device before queueing; SDL + * handles locking internally for this function. + * + * Note that SDL2 does not support planar audio. You will need to resample + * from planar audio formats into a non-planar one (see SDL_AudioFormat) + * before queuing audio. + * + * \param dev the device ID to which we will queue audio + * \param data the data to queue to the device for later playback + * \param len the number of bytes (not samples!) to which `data` points + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_GetQueuedAudioSize + */ +extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len); + +/** + * Dequeue more audio on non-callback devices. + * + * If you are looking to queue audio for output on a non-callback playback + * device, you want SDL_QueueAudio() instead. SDL_DequeueAudio() will always + * return 0 if you use it with playback devices. + * + * SDL offers two ways to retrieve audio from a capture device: you can either + * supply a callback that SDL triggers with some frequency as the device + * records more audio data, (push method), or you can supply no callback, and + * then SDL will expect you to retrieve data at regular intervals (pull + * method) with this function. + * + * There are no limits on the amount of data you can queue, short of + * exhaustion of address space. Data from the device will keep queuing as + * necessary without further intervention from you. This means you will + * eventually run out of memory if you aren't routinely dequeueing data. + * + * Capture devices will not queue data when paused; if you are expecting to + * not need captured audio for some length of time, use SDL_PauseAudioDevice() + * to stop the capture device from queueing more data. This can be useful + * during, say, level loading times. When unpaused, capture devices will start + * queueing data from that point, having flushed any capturable data available + * while paused. + * + * This function is thread-safe, but dequeueing from the same device from two + * threads at once does not promise which thread will dequeue data first. + * + * You may not dequeue audio from a device that is using an + * application-supplied callback; doing so returns an error. You have to use + * the audio callback, or dequeue audio with this function, but not both. + * + * You should not call SDL_LockAudio() on the device before dequeueing; SDL + * handles locking internally for this function. + * + * \param dev the device ID from which we will dequeue audio + * \param data a pointer into where audio data should be copied + * \param len the number of bytes (not samples!) to which (data) points + * \returns the number of bytes dequeued, which could be less than requested; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_GetQueuedAudioSize + */ +extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len); + +/** + * Get the number of bytes of still-queued audio. + * + * For playback devices: this is the number of bytes that have been queued for + * playback with SDL_QueueAudio(), but have not yet been sent to the hardware. + * + * Once we've sent it to the hardware, this function can not decide the exact + * byte boundary of what has been played. It's possible that we just gave the + * hardware several kilobytes right before you called this function, but it + * hasn't played any of it yet, or maybe half of it, etc. + * + * For capture devices, this is the number of bytes that have been captured by + * the device and are waiting for you to dequeue. This number may grow at any + * time, so this only informs of the lower-bound of available data. + * + * You may not queue or dequeue audio on a device that is using an + * application-supplied callback; calling this function on such a device + * always returns 0. You have to use the audio callback or queue audio, but + * not both. + * + * You should not call SDL_LockAudio() on the device before querying; SDL + * handles locking internally for this function. + * + * \param dev the device ID of which we will query queued audio size + * \returns the number of bytes (not samples!) of queued audio. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_QueueAudio + * \sa SDL_DequeueAudio + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev); + +/** + * Drop any queued audio data waiting to be sent to the hardware. + * + * Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For + * output devices, the hardware will start playing silence if more audio isn't + * queued. For capture devices, the hardware will start filling the empty + * queue with new data if the capture device isn't paused. + * + * This will not prevent playback of queued audio that's already been sent to + * the hardware, as we can not undo that, so expect there to be some fraction + * of a second of audio that might still be heard. This can be useful if you + * want to, say, drop any pending music or any unprocessed microphone input + * during a level change in your game. + * + * You may not queue or dequeue audio on a device that is using an + * application-supplied callback; calling this function on such a device + * always returns 0. You have to use the audio callback or queue audio, but + * not both. + * + * You should not call SDL_LockAudio() on the device before clearing the + * queue; SDL handles locking internally for this function. + * + * This function always succeeds and thus returns void. + * + * \param dev the device ID of which to clear the audio queue + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetQueuedAudioSize + * \sa SDL_QueueAudio + * \sa SDL_DequeueAudio + */ +extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev); + + +/** + * \name Audio lock functions + * + * The lock manipulated by these functions protects the callback function. + * During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that + * the callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/* @{ */ + +/** + * This function is a legacy means of locking the audio device. + * + * New programs might want to use SDL_LockAudioDevice() instead. This function + * is equivalent to calling... + * + * ```c + * SDL_LockAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + * \sa SDL_UnlockAudio + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); + +/** + * Use this function to lock out the audio callback function for a specified + * device. + * + * The lock manipulated by these functions protects the audio callback + * function specified in SDL_OpenAudioDevice(). During a + * SDL_LockAudioDevice()/SDL_UnlockAudioDevice() pair, you can be guaranteed + * that the callback function for that device is not running, even if the + * device is not paused. While a device is locked, any other unpaused, + * unlocked devices may still run their callbacks. + * + * Calling this function from inside your audio callback is unnecessary. SDL + * obtains this lock before calling your function, and releases it when the + * function returns. + * + * You should not hold the lock longer than absolutely necessary. If you hold + * it too long, you'll experience dropouts in your audio playback. Ideally, + * your application locks the device, sets a few variables and unlocks again. + * Do not do heavy work while holding the lock for a device. + * + * It is safe to lock the audio device multiple times, as long as you unlock + * it an equivalent number of times. The callback will not run until the + * device has been unlocked completely in this way. If your application fails + * to unlock the device appropriately, your callback will never run, you might + * hear repeating bursts of audio, and SDL_CloseAudioDevice() will probably + * deadlock. + * + * Internally, the audio device lock is a mutex; if you lock from two threads + * at once, not only will you block the audio callback, you'll block the other + * thread. + * + * \param dev the ID of the device to be locked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev); + +/** + * This function is a legacy means of unlocking the audio device. + * + * New programs might want to use SDL_UnlockAudioDevice() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_UnlockAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudio + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); + +/** + * Use this function to unlock the audio callback function for a specified + * device. + * + * This function should be paired with a previous SDL_LockAudioDevice() call. + * + * \param dev the ID of the device to be unlocked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev); +/* @} *//* Audio lock functions */ + +/** + * This function is a legacy means of closing the audio device. + * + * This function is equivalent to calling... + * + * ```c + * SDL_CloseAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_OpenAudio + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + +/** + * Use this function to shut down audio processing and close the audio device. + * + * The application should close open audio devices once they are no longer + * needed. Calling this function will wait until the device's audio callback + * is not running, release the audio hardware and then clean up internal + * state. No further audio will play from this device once this function + * returns. + * + * This function may block briefly while pending audio data is played by the + * hardware, so that applications don't drop the last buffer of data they + * supplied. + * + * The device ID is invalid as soon as the device is closed, and is eligible + * for reuse in a new SDL_OpenAudioDevice() call immediately. + * + * \param dev an audio device previously opened with SDL_OpenAudioDevice() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_audio_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_bits.h b/Thirdparty/SDL2/include/SDL_bits.h new file mode 100644 index 0000000..81161ae --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_bits.h @@ -0,0 +1,126 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_bits.h + * + * Functions for fiddling with bits and bitmasks. + */ + +#ifndef SDL_bits_h_ +#define SDL_bits_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_bits.h + */ + +/** + * Get the index of the most significant bit. Result is undefined when called + * with 0. This operation can also be stated as "count leading zeroes" and + * "log base 2". + * + * \return the index of the most significant bit, or -1 if the value is 0. + */ +#if defined(__WATCOMC__) && defined(__386__) +extern __inline int _SDL_bsr_watcom(Uint32); +#pragma aux _SDL_bsr_watcom = \ + "bsr eax, eax" \ + parm [eax] nomemory \ + value [eax] \ + modify exact [eax] nomemory; +#endif + +SDL_FORCE_INLINE int +SDL_MostSignificantBitIndex32(Uint32 x) +{ +#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) + /* Count Leading Zeroes builtin in GCC. + * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html + */ + if (x == 0) { + return -1; + } + return 31 - __builtin_clz(x); +#elif defined(__WATCOMC__) && defined(__386__) + if (x == 0) { + return -1; + } + return _SDL_bsr_watcom(x); +#elif defined(_MSC_VER) + unsigned long index; + if (_BitScanReverse(&index, x)) { + return index; + } + return -1; +#else + /* Based off of Bit Twiddling Hacks by Sean Eron Anderson + * , released in the public domain. + * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog + */ + const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const int S[] = {1, 2, 4, 8, 16}; + + int msbIndex = 0; + int i; + + if (x == 0) { + return -1; + } + + for (i = 4; i >= 0; i--) + { + if (x & b[i]) + { + x >>= S[i]; + msbIndex |= S[i]; + } + } + + return msbIndex; +#endif +} + +SDL_FORCE_INLINE SDL_bool +SDL_HasExactlyOneBitSet32(Uint32 x) +{ + if (x && !(x & (x - 1))) { + return SDL_TRUE; + } + return SDL_FALSE; +} + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_bits_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_blendmode.h b/Thirdparty/SDL2/include/SDL_blendmode.h new file mode 100644 index 0000000..4ecbe50 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_blendmode.h @@ -0,0 +1,198 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_blendmode.h + * + * Header file declaring the SDL_BlendMode enumeration + */ + +#ifndef SDL_blendmode_h_ +#define SDL_blendmode_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The blend mode used in SDL_RenderCopy() and drawing operations. + */ +typedef enum +{ + SDL_BLENDMODE_NONE = 0x00000000, /**< no blending + dstRGBA = srcRGBA */ + SDL_BLENDMODE_BLEND = 0x00000001, /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = srcA + (dstA * (1-srcA)) */ + SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending + dstRGB = (srcRGB * srcA) + dstRGB + dstA = dstA */ + SDL_BLENDMODE_MOD = 0x00000004, /**< color modulate + dstRGB = srcRGB * dstRGB + dstA = dstA */ + SDL_BLENDMODE_MUL = 0x00000008, /**< color multiply + dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)) + dstA = dstA */ + SDL_BLENDMODE_INVALID = 0x7FFFFFFF + + /* Additional custom blend modes can be returned by SDL_ComposeCustomBlendMode() */ + +} SDL_BlendMode; + +/** + * \brief The blend operation used when combining source and destination pixel components + */ +typedef enum +{ + SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */ + SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */ + SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */ + SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D9, D3D11 */ + SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D9, D3D11 */ +} SDL_BlendOperation; + +/** + * \brief The normalized factor used to multiply pixel components + */ +typedef enum +{ + SDL_BLENDFACTOR_ZERO = 0x1, /**< 0, 0, 0, 0 */ + SDL_BLENDFACTOR_ONE = 0x2, /**< 1, 1, 1, 1 */ + SDL_BLENDFACTOR_SRC_COLOR = 0x3, /**< srcR, srcG, srcB, srcA */ + SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4, /**< 1-srcR, 1-srcG, 1-srcB, 1-srcA */ + SDL_BLENDFACTOR_SRC_ALPHA = 0x5, /**< srcA, srcA, srcA, srcA */ + SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6, /**< 1-srcA, 1-srcA, 1-srcA, 1-srcA */ + SDL_BLENDFACTOR_DST_COLOR = 0x7, /**< dstR, dstG, dstB, dstA */ + SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */ + SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */ + SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */ +} SDL_BlendFactor; + +/** + * Compose a custom blend mode for renderers. + * + * The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept + * the SDL_BlendMode returned by this function if the renderer supports it. + * + * A blend mode controls how the pixels from a drawing operation (source) get + * combined with the pixels from the render target (destination). First, the + * components of the source and destination pixels get multiplied with their + * blend factors. Then, the blend operation takes the two products and + * calculates the result that will get stored in the render target. + * + * Expressed in pseudocode, it would look like this: + * + * ```c + * dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor); + * dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor); + * ``` + * + * Where the functions `colorOperation(src, dst)` and `alphaOperation(src, + * dst)` can return one of the following: + * + * - `src + dst` + * - `src - dst` + * - `dst - src` + * - `min(src, dst)` + * - `max(src, dst)` + * + * The red, green, and blue components are always multiplied with the first, + * second, and third components of the SDL_BlendFactor, respectively. The + * fourth component is not used. + * + * The alpha component is always multiplied with the fourth component of the + * SDL_BlendFactor. The other components are not used in the alpha + * calculation. + * + * Support for these blend modes varies for each renderer. To check if a + * specific SDL_BlendMode is supported, create a renderer and pass it to + * either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will + * return with an error if the blend mode is not supported. + * + * This list describes the support of custom blend modes for each renderer in + * SDL 2.0.6. All renderers support the four blend modes listed in the + * SDL_BlendMode enumeration. + * + * - **direct3d**: Supports all operations with all factors. However, some + * factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and + * `SDL_BLENDOPERATION_MAXIMUM`. + * - **direct3d11**: Same as Direct3D 9. + * - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all + * factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly with SDL + * 2.0.6. + * - **opengles**: Supports the `SDL_BLENDOPERATION_ADD` operation with all + * factors. Color and alpha factors need to be the same. OpenGL ES 1 + * implementation specific: May also support `SDL_BLENDOPERATION_SUBTRACT` + * and `SDL_BLENDOPERATION_REV_SUBTRACT`. May support color and alpha + * operations being different from each other. May support color and alpha + * factors being different from each other. + * - **opengles2**: Supports the `SDL_BLENDOPERATION_ADD`, + * `SDL_BLENDOPERATION_SUBTRACT`, `SDL_BLENDOPERATION_REV_SUBTRACT` + * operations with all factors. + * - **psp**: No custom blend mode support. + * - **software**: No custom blend mode support. + * + * Some renderers do not provide an alpha component for the default render + * target. The `SDL_BLENDFACTOR_DST_ALPHA` and + * `SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA` factors do not have an effect in this + * case. + * + * \param srcColorFactor the SDL_BlendFactor applied to the red, green, and + * blue components of the source pixels + * \param dstColorFactor the SDL_BlendFactor applied to the red, green, and + * blue components of the destination pixels + * \param colorOperation the SDL_BlendOperation used to combine the red, + * green, and blue components of the source and + * destination pixels + * \param srcAlphaFactor the SDL_BlendFactor applied to the alpha component of + * the source pixels + * \param dstAlphaFactor the SDL_BlendFactor applied to the alpha component of + * the destination pixels + * \param alphaOperation the SDL_BlendOperation used to combine the alpha + * component of the source and destination pixels + * \returns an SDL_BlendMode that represents the chosen factors and + * operations. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_GetRenderDrawBlendMode + * \sa SDL_SetTextureBlendMode + * \sa SDL_GetTextureBlendMode + */ +extern DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, + SDL_BlendFactor dstColorFactor, + SDL_BlendOperation colorOperation, + SDL_BlendFactor srcAlphaFactor, + SDL_BlendFactor dstAlphaFactor, + SDL_BlendOperation alphaOperation); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_blendmode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_clipboard.h b/Thirdparty/SDL2/include/SDL_clipboard.h new file mode 100644 index 0000000..7c351fb --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_clipboard.h @@ -0,0 +1,141 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_clipboard.h + * + * Include file for SDL clipboard handling + */ + +#ifndef SDL_clipboard_h_ +#define SDL_clipboard_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * Put UTF-8 text into the clipboard. + * + * \param text the text to store in the clipboard + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetClipboardText + * \sa SDL_HasClipboardText + */ +extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); + +/** + * Get UTF-8 text from the clipboard, which must be freed with SDL_free(). + * + * This functions returns empty string if there was not enough memory left for + * a copy of the clipboard's content. + * + * \returns the clipboard text on success or an empty string on failure; call + * SDL_GetError() for more information. Caller must call SDL_free() + * on the returned pointer when done with it (even if there was an + * error). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasClipboardText + * \sa SDL_SetClipboardText + */ +extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); + +/** + * Query whether the clipboard exists and contains a non-empty text string. + * + * \returns SDL_TRUE if the clipboard has text, or SDL_FALSE if it does not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetClipboardText + * \sa SDL_SetClipboardText + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); + +/** + * Put UTF-8 text into the primary selection. + * + * \param text the text to store in the primary selection + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetPrimarySelectionText + * \sa SDL_HasPrimarySelectionText + */ +extern DECLSPEC int SDLCALL SDL_SetPrimarySelectionText(const char *text); + +/** + * Get UTF-8 text from the primary selection, which must be freed with + * SDL_free(). + * + * This functions returns empty string if there was not enough memory left for + * a copy of the primary selection's content. + * + * \returns the primary selection text on success or an empty string on + * failure; call SDL_GetError() for more information. Caller must + * call SDL_free() on the returned pointer when done with it (even if + * there was an error). + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_HasPrimarySelectionText + * \sa SDL_SetPrimarySelectionText + */ +extern DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void); + +/** + * Query whether the primary selection exists and contains a non-empty text + * string. + * + * \returns SDL_TRUE if the primary selection has text, or SDL_FALSE if it + * does not. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetPrimarySelectionText + * \sa SDL_SetPrimarySelectionText + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_clipboard_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_config.h b/Thirdparty/SDL2/include/SDL_config.h new file mode 100644 index 0000000..01322c1 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_config.h @@ -0,0 +1,331 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_config_windows_h_ +#define SDL_config_windows_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* winsdkver.h defines _WIN32_MAXVER for SDK version detection. It is present since at least the Windows 7 SDK, + * but out of caution we'll only use it if the compiler supports __has_include() to confirm its presence. + * If your compiler doesn't support __has_include() but you have winsdkver.h, define HAVE_WINSDKVER_H. */ +#if !defined(HAVE_WINSDKVER_H) && defined(__has_include) +#if __has_include() +#define HAVE_WINSDKVER_H 1 +#endif +#endif + +#ifdef HAVE_WINSDKVER_H +#include +#endif + +/* sdkddkver.h defines more specific SDK version numbers. This is needed because older versions of the + * Windows 10 SDK have broken declarations for the C API for DirectX 12. */ +#if !defined(HAVE_SDKDDKVER_H) && defined(__has_include) +#if __has_include() +#define HAVE_SDKDDKVER_H 1 +#endif +#endif + +#ifdef HAVE_SDKDDKVER_H +#include +#endif + +/* This is a set of defines to configure the SDL features */ + +#if !defined(HAVE_STDINT_H) && !defined(_STDINT_H_) +/* Most everything except Visual Studio 2008 and earlier has stdint.h now */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +#else +#define HAVE_STDINT_H 1 +#endif /* Visual Studio 2008 */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +#ifdef __clang__ +# define HAVE_GCC_ATOMICS 1 +#endif + +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +#ifndef __WATCOMC__ +#define HAVE_DXGI_H 1 +#define HAVE_XINPUT_H 1 +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0A00 /* Windows 10 SDK */ +#define HAVE_WINDOWS_GAMING_INPUT_H 1 +#endif +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0602 /* Windows 8 SDK */ +#define HAVE_D3D11_H 1 +#define HAVE_ROAPI_H 1 +#endif +#if defined(WDK_NTDDI_VERSION) && WDK_NTDDI_VERSION > 0x0A000008 /* 10.0.19041.0 */ +#define HAVE_D3D12_H 1 +#endif +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0603 /* Windows 8.1 SDK */ +#define HAVE_SHELLSCALINGAPI_H 1 +#endif +#define HAVE_MMDEVICEAPI_H 1 +#define HAVE_AUDIOCLIENT_H 1 +#define HAVE_TPCSHRD_H 1 +#define HAVE_SENSORSAPI_H 1 +#endif +#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64)) && (defined(_MSC_VER) && _MSC_VER >= 1600) +#define HAVE_IMMINTRIN_H 1 +#elif defined(__has_include) && (defined(__i386__) || defined(__x86_64)) +# if __has_include() +# define HAVE_IMMINTRIN_H 1 +# endif +#endif + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define STDC_HEADERS 1 +#define HAVE_CTYPE_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_STRING_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +/* OpenWatcom requires specific calling conventions for qsort and bsearch */ +#ifndef __WATCOMC__ +#define HAVE_QSORT 1 +#define HAVE_BSEARCH 1 +#endif +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__STRUPR */ +/* #undef HAVE__STRLWR */ +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +/* #undef HAVE_STRTOK_R */ +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__LTOA */ +/* #undef HAVE__ULTOA */ +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE__WCSICMP 1 +#define HAVE__WCSNICMP 1 +#define HAVE__WCSDUP 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_EXP 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_FMOD 1 +#define HAVE_LOG 1 +#define HAVE_LOG10 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SQRT 1 +#define HAVE_TAN 1 +#ifndef __WATCOMC__ +#define HAVE_ACOSF 1 +#define HAVE_ASINF 1 +#define HAVE_ATANF 1 +#define HAVE_ATAN2F 1 +#define HAVE_CEILF 1 +#define HAVE__COPYSIGN 1 +#define HAVE_COSF 1 +#define HAVE_EXPF 1 +#define HAVE_FABSF 1 +#define HAVE_FLOORF 1 +#define HAVE_FMODF 1 +#define HAVE_LOGF 1 +#define HAVE_LOG10F 1 +#define HAVE_POWF 1 +#define HAVE_SINF 1 +#define HAVE_SQRTF 1 +#define HAVE_TANF 1 +#endif +#if defined(_MSC_VER) +/* These functions were added with the VC++ 2013 C runtime library */ +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_VSSCANF 1 +#define HAVE_LROUND 1 +#define HAVE_LROUNDF 1 +#define HAVE_ROUND 1 +#define HAVE_ROUNDF 1 +#define HAVE_SCALBN 1 +#define HAVE_SCALBNF 1 +#define HAVE_TRUNC 1 +#define HAVE_TRUNCF 1 +#endif +/* This function is available with at least the VC++ 2008 C runtime library */ +#if _MSC_VER >= 1400 +#define HAVE__FSEEKI64 1 +#endif +#ifdef _USE_MATH_DEFINES +#define HAVE_M_PI 1 +#endif +#elif defined(__WATCOMC__) +#define HAVE__FSEEKI64 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_VSSCANF 1 +#define HAVE_ROUND 1 +#define HAVE_SCALBN 1 +#define HAVE_TRUNC 1 +#else +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#if defined(HAVE_MMDEVICEAPI_H) && defined(HAVE_AUDIOCLIENT_H) +#define SDL_AUDIO_DRIVER_WASAPI 1 +#endif +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_HIDAPI 1 +#ifndef __WINRT__ +#define SDL_JOYSTICK_RAWINPUT 1 +#endif +#define SDL_JOYSTICK_VIRTUAL 1 +#ifdef HAVE_WINDOWS_GAMING_INPUT_H +#define SDL_JOYSTICK_WGI 1 +#endif +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 + +/* Enable the sensor driver */ +#ifdef HAVE_SENSORSAPI_H +#define SDL_SENSOR_WINDOWS 1 +#else +#define SDL_SENSOR_DUMMY 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_GENERIC_COND_SUFFIX 1 +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D11) && defined(HAVE_D3D11_H) +#define SDL_VIDEO_RENDER_D3D11 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D12) && defined(HAVE_D3D12_H) +#define SDL_VIDEO_RENDER_D3D12 1 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + +/* Enable Vulkan support */ +#define SDL_VIDEO_VULKAN 1 + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 + +#endif /* SDL_config_windows_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_cpuinfo.h b/Thirdparty/SDL2/include/SDL_cpuinfo.h new file mode 100644 index 0000000..ed5e979 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_cpuinfo.h @@ -0,0 +1,594 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_cpuinfo.h + * + * CPU feature detection for SDL. + */ + +#ifndef SDL_cpuinfo_h_ +#define SDL_cpuinfo_h_ + +#include "SDL_stdinc.h" + +/* Need to do this here because intrin.h has C++ code in it */ +/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64)) +#ifdef __clang__ +/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, + so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ + +#ifndef __PRFCHWINTRIN_H +#define __PRFCHWINTRIN_H + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_m_prefetch(void *__P) +{ + __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */); +} + +#endif /* __PRFCHWINTRIN_H */ +#endif /* __clang__ */ +#include +#ifndef _WIN64 +#ifndef __MMX__ +#define __MMX__ +#endif +#ifndef __3dNOW__ +#define __3dNOW__ +#endif +#endif +#ifndef __SSE__ +#define __SSE__ +#endif +#ifndef __SSE2__ +#define __SSE2__ +#endif +#ifndef __SSE3__ +#define __SSE3__ +#endif +#elif defined(__MINGW64_VERSION_MAJOR) +#include +#if !defined(SDL_DISABLE_ARM_NEON_H) && defined(__ARM_NEON) +# include +#endif +#else +/* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC_H to have it included. */ +#if defined(HAVE_ALTIVEC_H) && defined(__ALTIVEC__) && !defined(__APPLE_ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC_H) +#include +#endif +#if !defined(SDL_DISABLE_ARM_NEON_H) +# if defined(__ARM_NEON) +# include +# elif defined(__WINDOWS__) || defined(__WINRT__) || defined(__GDK__) +/* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */ +# if defined(_M_ARM) +# include +# include +# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */ +# endif +# if defined (_M_ARM64) +# include +# include +# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */ +# define __ARM_ARCH 8 +# endif +# endif +#endif +#endif /* compiler version */ + +#if defined(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H) +#include +#endif +#if defined(__loongarch_sx) && !defined(SDL_DISABLE_LSX_H) +#include +#define __LSX__ +#endif +#if defined(__loongarch_asx) && !defined(SDL_DISABLE_LASX_H) +#include +#define __LASX__ +#endif +#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) +#include +#else +#if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H) +#include +#endif +#if defined(__SSE__) && !defined(SDL_DISABLE_XMMINTRIN_H) +#include +#endif +#if defined(__SSE2__) && !defined(SDL_DISABLE_EMMINTRIN_H) +#include +#endif +#if defined(__SSE3__) && !defined(SDL_DISABLE_PMMINTRIN_H) +#include +#endif +#endif /* HAVE_IMMINTRIN_H */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* This is a guess for the cacheline size used for padding. + * Most x86 processors have a 64 byte cache line. + * The 64-bit PowerPC processors have a 128 byte cache line. + * We'll use the larger value to be generally safe. + */ +#define SDL_CACHELINE_SIZE 128 + +/** + * Get the number of CPU cores available. + * + * \returns the total number of logical CPU cores. On CPUs that include + * technologies such as hyperthreading, the number of logical cores + * may be more than the number of physical cores. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); + +/** + * Determine the L1 cache line size of the CPU. + * + * This is useful for determining multi-threaded structure padding or SIMD + * prefetch sizes. + * + * \returns the L1 cache line size of the CPU, in bytes. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); + +/** + * Determine whether the CPU has the RDTSC instruction. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has the RDTSC instruction or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** + * Determine whether the CPU has AltiVec features. + * + * This always returns false on CPUs that aren't using PowerPC instruction + * sets. + * + * \returns SDL_TRUE if the CPU has AltiVec features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/** + * Determine whether the CPU has MMX features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has MMX features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** + * Determine whether the CPU has 3DNow! features. + * + * This always returns false on CPUs that aren't using AMD instruction sets. + * + * \returns SDL_TRUE if the CPU has 3DNow! features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** + * Determine whether the CPU has SSE features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** + * Determine whether the CPU has SSE2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** + * Determine whether the CPU has SSE3 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE3 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); + +/** + * Determine whether the CPU has SSE4.1 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE4.1 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); + +/** + * Determine whether the CPU has SSE4.2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE4.2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); + +/** + * Determine whether the CPU has AVX features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); + +/** + * Determine whether the CPU has AVX2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); + +/** + * Determine whether the CPU has AVX-512F (foundation) features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX-512F features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_HasAVX + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); + +/** + * Determine whether the CPU has ARM SIMD (ARMv6) features. + * + * This is different from ARM NEON, which is a different instruction set. + * + * This always returns false on CPUs that aren't using ARM instruction sets. + * + * \returns SDL_TRUE if the CPU has ARM SIMD features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_HasNEON + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void); + +/** + * Determine whether the CPU has NEON (ARM SIMD) features. + * + * This always returns false on CPUs that aren't using ARM instruction sets. + * + * \returns SDL_TRUE if the CPU has ARM NEON features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); + +/** + * Determine whether the CPU has LSX (LOONGARCH SIMD) features. + * + * This always returns false on CPUs that aren't using LOONGARCH instruction + * sets. + * + * \returns SDL_TRUE if the CPU has LOONGARCH LSX features or SDL_FALSE if + * not. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); + +/** + * Determine whether the CPU has LASX (LOONGARCH SIMD) features. + * + * This always returns false on CPUs that aren't using LOONGARCH instruction + * sets. + * + * \returns SDL_TRUE if the CPU has LOONGARCH LASX features or SDL_FALSE if + * not. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasLASX(void); + +/** + * Get the amount of RAM configured in the system. + * + * \returns the amount of RAM configured in the system in MiB. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); + +/** + * Report the alignment this system needs for SIMD allocations. + * + * This will return the minimum number of bytes to which a pointer must be + * aligned to be compatible with SIMD instructions on the current machine. For + * example, if the machine supports SSE only, it will return 16, but if it + * supports AVX-512F, it'll return 64 (etc). This only reports values for + * instruction sets SDL knows about, so if your SDL build doesn't have + * SDL_HasAVX512F(), then it might return 16 for the SSE support it sees and + * not 64 for the AVX-512 instructions that exist but SDL doesn't know about. + * Plan accordingly. + * + * \returns the alignment in bytes needed for available, known SIMD + * instructions. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void); + +/** + * Allocate memory in a SIMD-friendly way. + * + * This will allocate a block of memory that is suitable for use with SIMD + * instructions. Specifically, it will be properly aligned and padded for the + * system's supported vector instructions. + * + * The memory returned will be padded such that it is safe to read or write an + * incomplete vector at the end of the memory block. This can be useful so you + * don't have to drop back to a scalar fallback at the end of your SIMD + * processing loop to deal with the final elements without overflowing the + * allocated buffer. + * + * You must free this memory with SDL_FreeSIMD(), not free() or SDL_free() or + * delete[], etc. + * + * Note that SDL will only deal with SIMD instruction sets it is aware of; for + * example, SDL 2.0.8 knows that SSE wants 16-byte vectors (SDL_HasSSE()), and + * AVX2 wants 32 bytes (SDL_HasAVX2()), but doesn't know that AVX-512 wants + * 64. To be clear: if you can't decide to use an instruction set with an + * SDL_Has*() function, don't use that instruction set with memory allocated + * through here. + * + * SDL_AllocSIMD(0) will return a non-NULL pointer, assuming the system isn't + * out of memory, but you are not allowed to dereference it (because you only + * own zero bytes of that buffer). + * + * \param len The length, in bytes, of the block to allocate. The actual + * allocated block might be larger due to padding, etc. + * \returns a pointer to the newly-allocated block, NULL if out of memory. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_SIMDGetAlignment + * \sa SDL_SIMDRealloc + * \sa SDL_SIMDFree + */ +extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len); + +/** + * Reallocate memory obtained from SDL_SIMDAlloc + * + * It is not valid to use this function on a pointer from anything but + * SDL_SIMDAlloc(). It can't be used on pointers from malloc, realloc, + * SDL_malloc, memalign, new[], etc. + * + * \param mem The pointer obtained from SDL_SIMDAlloc. This function also + * accepts NULL, at which point this function is the same as + * calling SDL_SIMDAlloc with a NULL pointer. + * \param len The length, in bytes, of the block to allocated. The actual + * allocated block might be larger due to padding, etc. Passing 0 + * will return a non-NULL pointer, assuming the system isn't out of + * memory. + * \returns a pointer to the newly-reallocated block, NULL if out of memory. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_SIMDGetAlignment + * \sa SDL_SIMDAlloc + * \sa SDL_SIMDFree + */ +extern DECLSPEC void * SDLCALL SDL_SIMDRealloc(void *mem, const size_t len); + +/** + * Deallocate memory obtained from SDL_SIMDAlloc + * + * It is not valid to use this function on a pointer from anything but + * SDL_SIMDAlloc() or SDL_SIMDRealloc(). It can't be used on pointers from + * malloc, realloc, SDL_malloc, memalign, new[], etc. + * + * However, SDL_SIMDFree(NULL) is a legal no-op. + * + * The memory pointed to by `ptr` is no longer valid for access upon return, + * and may be returned to the system or reused by a future allocation. The + * pointer passed to this function is no longer safe to dereference once this + * function returns, and should be discarded. + * + * \param ptr The pointer, returned from SDL_SIMDAlloc or SDL_SIMDRealloc, to + * deallocate. NULL is a legal no-op. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_SIMDAlloc + * \sa SDL_SIMDRealloc + */ +extern DECLSPEC void SDLCALL SDL_SIMDFree(void *ptr); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_cpuinfo_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_egl.h b/Thirdparty/SDL2/include/SDL_egl.h new file mode 100644 index 0000000..6f51c08 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_egl.h @@ -0,0 +1,2352 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_egl.h + * + * This is a simple file to encapsulate the EGL API headers. + */ +#if !defined(_MSC_VER) && !defined(__ANDROID__) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS) + +#if defined(__vita__) || defined(__psp2__) +#include +#endif + +#include +#include + +#else /* _MSC_VER */ + +/* EGL headers for Visual Studio */ + +#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_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY 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_APIENTRY + *------------------------------------------------------------------------- + * 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_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#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 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#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 KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +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_ */ + + +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright 2007-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for egl.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by filing an issue or pull request on the public Khronos EGL Registry, at + * https://www.github.com/KhronosGroup/EGL-Registry/ + */ + +/*#include */ + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + * + * Khronos STRONGLY RECOMMENDS that you use the default definitions + * provided below, since these changes affect both binary and source + * portability of applications using EGL running on different EGL + * implementations. + */ + +#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES) + +typedef void *EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(__EMSCRIPTEN__) + +typedef int EGLNativeDisplayType; +typedef int EGLNativePixmapType; +typedef int EGLNativeWindowType; + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(WL_EGL_PLATFORM) + +typedef struct wl_display *EGLNativeDisplayType; +typedef struct wl_egl_pixmap *EGLNativePixmapType; +typedef struct wl_egl_window *EGLNativeWindowType; + +#elif defined(__GBM__) + +typedef struct gbm_device *EGLNativeDisplayType; +typedef struct gbm_bo *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__ANDROID__) || defined(ANDROID) + +struct ANativeWindow; +struct egl_native_pixmap_t; + +typedef void* EGLNativeDisplayType; +typedef struct egl_native_pixmap_t* EGLNativePixmapType; +typedef struct ANativeWindow* EGLNativeWindowType; + +#elif defined(USE_OZONE) + +typedef intptr_t EGLNativeDisplayType; +typedef intptr_t EGLNativePixmapType; +typedef intptr_t EGLNativeWindowType; + +#elif defined(USE_X11) + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#elif defined(__unix__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__APPLE__) + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__HAIKU__) + +#include + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__Fuchsia__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +typedef khronos_int32_t EGLint; + + +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#endif /* __eglplatform_h */ + + +#ifndef __egl_h_ +#define __egl_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +** +** This header is generated from the Khronos EGL XML API Registry. +** The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.khronos.org/registry/egl +** +** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $ +*/ + +/*#include */ + +#ifndef EGL_EGL_PROTOTYPES +#define EGL_EGL_PROTOTYPES 1 +#endif + +/* Generated on date 20220525 */ + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: .* + * Default extensions included: None + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_VERSION_1_0 +#define EGL_VERSION_1_0 1 +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +/*#include */ +/*#include */ +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void); +typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); +typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void); +typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void); +EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw); +EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id); +EGLAPI EGLint EGLAPIENTRY eglGetError (void); +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); +EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); +#endif +#endif /* EGL_VERSION_1_0 */ + +#ifndef EGL_VERSION_1_1 +#define EGL_VERSION_1_1 1 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_CONTEXT_LOST 0x300E +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval); +#endif +#endif /* EGL_VERSION_1_1 */ + +#ifndef EGL_VERSION_1_2 +#define EGL_VERSION_1_2 1 +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_CLIENT_APIS 0x308D +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_VERTICAL_RESOLUTION 0x3091 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api); +typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api); +EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); +#endif +#endif /* EGL_VERSION_1_2 */ + +#ifndef EGL_VERSION_1_3 +#define EGL_VERSION_1_3 1 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#endif /* EGL_VERSION_1_3 */ + +#ifndef EGL_VERSION_1_4 +#define EGL_VERSION_1_4 1 +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void); +#endif +#endif /* EGL_VERSION_1_4 */ + +#ifndef EGL_VERSION_1_5 +#define EGL_VERSION_1_5 1 +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SIGNALED 0x30F2 +#define EGL_UNSIGNALED 0x30F3 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); +typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); +EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image); +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags); +#endif +#endif /* EGL_VERSION_1_5 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __egl_h_ */ + + +#ifndef __eglext_h_ +#define __eglext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +** +** This header is generated from the Khronos EGL XML API Registry. +** The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.khronos.org/registry/egl +** +** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $ +*/ + +/*#include */ + +#define EGL_EGLEXT_VERSION 20220525 + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: _nomatch_^ + * Default extensions included: egl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_KHR_cl_event +#define EGL_KHR_cl_event 1 +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF +#endif /* EGL_KHR_cl_event */ + +#ifndef EGL_KHR_cl_event2 +#define EGL_KHR_cl_event2 1 +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#endif +#endif /* EGL_KHR_cl_event2 */ + +#ifndef EGL_KHR_client_get_all_proc_addresses +#define EGL_KHR_client_get_all_proc_addresses 1 +#endif /* EGL_KHR_client_get_all_proc_addresses */ + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 +#endif /* EGL_KHR_config_attribs */ + +#ifndef EGL_KHR_context_flush_control +#define EGL_KHR_context_flush_control 1 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 +#endif /* EGL_KHR_context_flush_control */ + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#endif /* EGL_KHR_create_context */ + +#ifndef EGL_KHR_create_context_no_error +#define EGL_KHR_create_context_no_error 1 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#endif /* EGL_KHR_create_context_no_error */ + +#ifndef EGL_KHR_debug +#define EGL_KHR_debug 1 +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define EGL_OBJECT_THREAD_KHR 0x33B0 +#define EGL_OBJECT_DISPLAY_KHR 0x33B1 +#define EGL_OBJECT_CONTEXT_KHR 0x33B2 +#define EGL_OBJECT_SURFACE_KHR 0x33B3 +#define EGL_OBJECT_IMAGE_KHR 0x33B4 +#define EGL_OBJECT_SYNC_KHR 0x33B5 +#define EGL_OBJECT_STREAM_KHR 0x33B6 +#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 +#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA +#define EGL_DEBUG_MSG_WARN_KHR 0x33BB +#define EGL_DEBUG_MSG_INFO_KHR 0x33BC +#define EGL_DEBUG_CALLBACK_KHR 0x33B8 +typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value); +typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglDebugMessageControlKHR (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDebugKHR (EGLint attribute, EGLAttrib *value); +EGLAPI EGLint EGLAPIENTRY eglLabelObjectKHR (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +#endif +#endif /* EGL_KHR_debug */ + +#ifndef EGL_KHR_display_reference +#define EGL_KHR_display_reference 1 +#define EGL_TRACK_REFERENCES_KHR 0x3352 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC) (EGLDisplay dpy, EGLint name, EGLAttrib *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribKHR (EGLDisplay dpy, EGLint name, EGLAttrib *value); +#endif +#endif /* EGL_KHR_display_reference */ + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_fence_sync */ + +#ifndef EGL_KHR_get_all_proc_addresses +#define EGL_KHR_get_all_proc_addresses 1 +#endif /* EGL_KHR_get_all_proc_addresses */ + +#ifndef EGL_KHR_gl_colorspace +#define EGL_KHR_gl_colorspace 1 +#define EGL_GL_COLORSPACE_KHR 0x309D +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#endif /* EGL_KHR_gl_colorspace */ + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 +#endif /* EGL_KHR_gl_renderbuffer_image */ + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC +#endif /* EGL_KHR_gl_texture_2D_image */ + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD +#endif /* EGL_KHR_gl_texture_3D_image */ + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 +#endif /* EGL_KHR_gl_texture_cubemap_image */ + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +typedef void *EGLImageKHR; +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 +#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0) +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif +#endif /* EGL_KHR_image */ + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 +#endif /* EGL_KHR_image_base */ + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +#endif /* EGL_KHR_image_pixmap */ + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface); +#endif +#endif /* EGL_KHR_lock_surface */ + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 +#endif /* EGL_KHR_lock_surface2 */ + +#ifndef EGL_KHR_lock_surface3 +#define EGL_KHR_lock_surface3 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#endif +#endif /* EGL_KHR_lock_surface3 */ + +#ifndef EGL_KHR_mutable_render_buffer +#define EGL_KHR_mutable_render_buffer 1 +#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 +#endif /* EGL_KHR_mutable_render_buffer */ + +#ifndef EGL_KHR_no_config_context +#define EGL_KHR_no_config_context 1 +#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0) +#endif /* EGL_KHR_no_config_context */ + +#ifndef EGL_KHR_partial_update +#define EGL_KHR_partial_update 1 +#define EGL_BUFFER_AGE_KHR 0x313D +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_partial_update */ + +#ifndef EGL_KHR_platform_android +#define EGL_KHR_platform_android 1 +#define EGL_PLATFORM_ANDROID_KHR 0x3141 +#endif /* EGL_KHR_platform_android */ + +#ifndef EGL_KHR_platform_gbm +#define EGL_KHR_platform_gbm 1 +#define EGL_PLATFORM_GBM_KHR 0x31D7 +#endif /* EGL_KHR_platform_gbm */ + +#ifndef EGL_KHR_platform_wayland +#define EGL_KHR_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#endif /* EGL_KHR_platform_wayland */ + +#ifndef EGL_KHR_platform_x11 +#define EGL_KHR_platform_x11 1 +#define EGL_PLATFORM_X11_KHR 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 +#endif /* EGL_KHR_platform_x11 */ + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR EGL_CAST(EGLSyncKHR,0) +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_reusable_sync */ + +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_NO_STREAM_KHR EGL_CAST(EGLStreamKHR,0) +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_stream */ + +#ifndef EGL_KHR_stream_attrib +#define EGL_KHR_stream_attrib 1 +#ifdef KHRONOS_SUPPORT_INT64 +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamAttribKHR (EGLDisplay dpy, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_stream_attrib */ + +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 +#ifdef EGL_KHR_stream +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_consumer_gltexture */ + +#ifndef EGL_KHR_stream_cross_process_fd +#define EGL_KHR_stream_cross_process_fd 1 +typedef int EGLNativeFileDescriptorKHR; +#ifdef EGL_KHR_stream +#define EGL_NO_FILE_DESCRIPTOR_KHR EGL_CAST(EGLNativeFileDescriptorKHR,-1) +typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_cross_process_fd */ + +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_fifo */ + +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 +#ifdef EGL_KHR_stream +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_aldatalocator */ + +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_BIT_KHR 0x0800 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_eglsurface */ + +#ifndef EGL_KHR_surfaceless_context +#define EGL_KHR_surfaceless_context 1 +#endif /* EGL_KHR_surfaceless_context */ + +#ifndef EGL_KHR_swap_buffers_with_damage +#define EGL_KHR_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_swap_buffers_with_damage */ + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA +#endif /* EGL_KHR_vg_parent_image */ + +#ifndef EGL_KHR_wait_sync +#define EGL_KHR_wait_sync 1 +typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#endif +#endif /* EGL_KHR_wait_sync */ + +#ifndef EGL_ANDROID_GLES_layers +#define EGL_ANDROID_GLES_layers 1 +#endif /* EGL_ANDROID_GLES_layers */ + +#ifndef EGL_ANDROID_blob_cache +#define EGL_ANDROID_blob_cache 1 +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#endif +#endif /* EGL_ANDROID_blob_cache */ + +#ifndef EGL_ANDROID_create_native_client_buffer +#define EGL_ANDROID_create_native_client_buffer 1 +#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 +#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 +#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 +#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 +typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID (const EGLint *attrib_list); +#endif +#endif /* EGL_ANDROID_create_native_client_buffer */ + +#ifndef EGL_ANDROID_framebuffer_target +#define EGL_ANDROID_framebuffer_target 1 +#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 +#endif /* EGL_ANDROID_framebuffer_target */ + +#ifndef EGL_ANDROID_front_buffer_auto_refresh +#define EGL_ANDROID_front_buffer_auto_refresh 1 +#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C +#endif /* EGL_ANDROID_front_buffer_auto_refresh */ + +#ifndef EGL_ANDROID_get_frame_timestamps +#define EGL_ANDROID_get_frame_timestamps 1 +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; +#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2) +#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1) +#define EGL_TIMESTAMPS_ANDROID 0x3430 +#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431 +#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432 +#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433 +#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434 +#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435 +#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436 +#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437 +#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438 +#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439 +#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A +#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B +#define EGL_READS_DONE_TIME_ANDROID 0x343C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingANDROID (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); +EGLAPI EGLBoolean EGLAPIENTRY eglGetNextFrameIdANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); +EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); +EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampsANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); +#endif +#endif /* EGL_ANDROID_get_frame_timestamps */ + +#ifndef EGL_ANDROID_get_native_client_buffer +#define EGL_ANDROID_get_native_client_buffer 1 +struct AHardwareBuffer; +typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHardwareBuffer *buffer); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer); +#endif +#endif /* EGL_ANDROID_get_native_client_buffer */ + +#ifndef EGL_ANDROID_image_native_buffer +#define EGL_ANDROID_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_ANDROID 0x3140 +#endif /* EGL_ANDROID_image_native_buffer */ + +#ifndef EGL_ANDROID_native_fence_sync +#define EGL_ANDROID_native_fence_sync 1 +#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 +#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 +#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 +#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 +typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync); +#endif +#endif /* EGL_ANDROID_native_fence_sync */ + +#ifndef EGL_ANDROID_presentation_time +#define EGL_ANDROID_presentation_time 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); +#endif +#endif /* EGL_ANDROID_presentation_time */ + +#ifndef EGL_ANDROID_recordable +#define EGL_ANDROID_recordable 1 +#define EGL_RECORDABLE_ANDROID 0x3142 +#endif /* EGL_ANDROID_recordable */ + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ + +#ifndef EGL_ANGLE_device_d3d +#define EGL_ANGLE_device_d3d 1 +#define EGL_D3D9_DEVICE_ANGLE 0x33A0 +#define EGL_D3D11_DEVICE_ANGLE 0x33A1 +#endif /* EGL_ANGLE_device_d3d */ + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif +#endif /* EGL_ANGLE_query_surface_pointer */ + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ + +#ifndef EGL_ANGLE_sync_control_rate +#define EGL_ANGLE_sync_control_rate 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETMSCRATEANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator); +#endif +#endif /* EGL_ANGLE_sync_control_rate */ + +#ifndef EGL_ANGLE_window_fixed_size +#define EGL_ANGLE_window_fixed_size 1 +#define EGL_FIXED_SIZE_ANGLE 0x3201 +#endif /* EGL_ANGLE_window_fixed_size */ + +#ifndef EGL_ARM_image_format +#define EGL_ARM_image_format 1 +#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287 +#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288 +#endif /* EGL_ARM_image_format */ + +#ifndef EGL_ARM_implicit_external_sync +#define EGL_ARM_implicit_external_sync 1 +#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A +#endif /* EGL_ARM_implicit_external_sync */ + +#ifndef EGL_ARM_pixmap_multisample_discard +#define EGL_ARM_pixmap_multisample_discard 1 +#define EGL_DISCARD_SAMPLES_ARM 0x3286 +#endif /* EGL_ARM_pixmap_multisample_discard */ + +#ifndef EGL_EXT_bind_to_front +#define EGL_EXT_bind_to_front 1 +#define EGL_FRONT_BUFFER_EXT 0x3464 +#endif /* EGL_EXT_bind_to_front */ + +#ifndef EGL_EXT_buffer_age +#define EGL_EXT_buffer_age 1 +#define EGL_BUFFER_AGE_EXT 0x313D +#endif /* EGL_EXT_buffer_age */ + +#ifndef EGL_EXT_client_extensions +#define EGL_EXT_client_extensions 1 +#endif /* EGL_EXT_client_extensions */ + +#ifndef EGL_EXT_client_sync +#define EGL_EXT_client_sync 1 +#define EGL_SYNC_CLIENT_EXT 0x3364 +#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglClientSignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_EXT_client_sync */ + +#ifndef EGL_EXT_compositor +#define EGL_EXT_compositor 1 +#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460 +#define EGL_EXTERNAL_REF_ID_EXT 0x3461 +#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT 0x3462 +#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT 0x3463 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC) (const EGLint *external_ref_ids, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC) (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC) (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC) (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC) (EGLint external_win_id); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC) (EGLint external_win_id, EGLint width, EGLint height); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC) (EGLint external_win_id, EGLint policy); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextListEXT (const EGLint *external_ref_ids, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextAttributesEXT (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowListEXT (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowAttributesEXT (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorBindTexWindowEXT (EGLint external_win_id); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetSizeEXT (EGLint external_win_id, EGLint width, EGLint height); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSwapPolicyEXT (EGLint external_win_id, EGLint policy); +#endif +#endif /* EGL_EXT_compositor */ + +#ifndef EGL_EXT_config_select_group +#define EGL_EXT_config_select_group 1 +#define EGL_CONFIG_SELECT_GROUP_EXT 0x34C0 +#endif /* EGL_EXT_config_select_group */ + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF +#endif /* EGL_EXT_create_context_robustness */ + +#ifndef EGL_EXT_device_base +#define EGL_EXT_device_base 1 +typedef void *EGLDeviceEXT; +#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0) +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#endif +#endif /* EGL_EXT_device_base */ + +#ifndef EGL_EXT_device_drm +#define EGL_EXT_device_drm 1 +#define EGL_DRM_DEVICE_FILE_EXT 0x3233 +#define EGL_DRM_MASTER_FD_EXT 0x333C +#endif /* EGL_EXT_device_drm */ + +#ifndef EGL_EXT_device_drm_render_node +#define EGL_EXT_device_drm_render_node 1 +#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377 +#endif /* EGL_EXT_device_drm_render_node */ + +#ifndef EGL_EXT_device_enumeration +#define EGL_EXT_device_enumeration 1 +#endif /* EGL_EXT_device_enumeration */ + +#ifndef EGL_EXT_device_openwf +#define EGL_EXT_device_openwf 1 +#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 +#define EGL_OPENWF_DEVICE_EXT 0x333D +#endif /* EGL_EXT_device_openwf */ + +#ifndef EGL_EXT_device_persistent_id +#define EGL_EXT_device_persistent_id 1 +#define EGL_DEVICE_UUID_EXT 0x335C +#define EGL_DRIVER_UUID_EXT 0x335D +#define EGL_DRIVER_NAME_EXT 0x335E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEBINARYEXTPROC) (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceBinaryEXT (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size); +#endif +#endif /* EGL_EXT_device_persistent_id */ + +#ifndef EGL_EXT_device_query +#define EGL_EXT_device_query 1 +#endif /* EGL_EXT_device_query */ + +#ifndef EGL_EXT_device_query_name +#define EGL_EXT_device_query_name 1 +#define EGL_RENDERER_EXT 0x335F +#endif /* EGL_EXT_device_query_name */ + +#ifndef EGL_EXT_explicit_device +#define EGL_EXT_explicit_device 1 +#endif /* EGL_EXT_explicit_device */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_linear +#define EGL_EXT_gl_colorspace_bt2020_linear 1 +#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F +#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_pq +#define EGL_EXT_gl_colorspace_bt2020_pq 1 +#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 +#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ + +#ifndef EGL_EXT_gl_colorspace_display_p3 +#define EGL_EXT_gl_colorspace_display_p3 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT 0x3363 +#endif /* EGL_EXT_gl_colorspace_display_p3 */ + +#ifndef EGL_EXT_gl_colorspace_display_p3_linear +#define EGL_EXT_gl_colorspace_display_p3_linear 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT 0x3362 +#endif /* EGL_EXT_gl_colorspace_display_p3_linear */ + +#ifndef EGL_EXT_gl_colorspace_display_p3_passthrough +#define EGL_EXT_gl_colorspace_display_p3_passthrough 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT 0x3490 +#endif /* EGL_EXT_gl_colorspace_display_p3_passthrough */ + +#ifndef EGL_EXT_gl_colorspace_scrgb +#define EGL_EXT_gl_colorspace_scrgb 1 +#define EGL_GL_COLORSPACE_SCRGB_EXT 0x3351 +#endif /* EGL_EXT_gl_colorspace_scrgb */ + +#ifndef EGL_EXT_gl_colorspace_scrgb_linear +#define EGL_EXT_gl_colorspace_scrgb_linear 1 +#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 +#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ + +#ifndef EGL_EXT_image_dma_buf_import +#define EGL_EXT_image_dma_buf_import 1 +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 +#endif /* EGL_EXT_image_dma_buf_import */ + +#ifndef EGL_EXT_image_dma_buf_import_modifiers +#define EGL_EXT_image_dma_buf_import_modifiers 1 +#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 +#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 +#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 +#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 +#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 +#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 +#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 +#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 +#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 +#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 +#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufFormatsEXT (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufModifiersEXT (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); +#endif +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ + +#ifndef EGL_EXT_image_gl_colorspace +#define EGL_EXT_image_gl_colorspace 1 +#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D +#endif /* EGL_EXT_image_gl_colorspace */ + +#ifndef EGL_EXT_image_implicit_sync_control +#define EGL_EXT_image_implicit_sync_control 1 +#define EGL_IMPORT_SYNC_TYPE_EXT 0x3470 +#define EGL_IMPORT_IMPLICIT_SYNC_EXT 0x3471 +#define EGL_IMPORT_EXPLICIT_SYNC_EXT 0x3472 +#endif /* EGL_EXT_image_implicit_sync_control */ + +#ifndef EGL_EXT_multiview_window +#define EGL_EXT_multiview_window 1 +#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 +#endif /* EGL_EXT_multiview_window */ + +#ifndef EGL_EXT_output_base +#define EGL_EXT_output_base 1 +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +#define EGL_NO_OUTPUT_LAYER_EXT EGL_CAST(EGLOutputLayerEXT,0) +#define EGL_NO_OUTPUT_PORT_EXT EGL_CAST(EGLOutputPortEXT,0) +#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D +#define EGL_BAD_OUTPUT_PORT_EXT 0x322E +#define EGL_SWAP_INTERVAL_EXT 0x322F +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#endif +#endif /* EGL_EXT_output_base */ + +#ifndef EGL_EXT_output_drm +#define EGL_EXT_output_drm 1 +#define EGL_DRM_CRTC_EXT 0x3234 +#define EGL_DRM_PLANE_EXT 0x3235 +#define EGL_DRM_CONNECTOR_EXT 0x3236 +#endif /* EGL_EXT_output_drm */ + +#ifndef EGL_EXT_output_openwf +#define EGL_EXT_output_openwf 1 +#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 +#define EGL_OPENWF_PORT_ID_EXT 0x3239 +#endif /* EGL_EXT_output_openwf */ + +#ifndef EGL_EXT_pixel_format_float +#define EGL_EXT_pixel_format_float 1 +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B +#endif /* EGL_EXT_pixel_format_float */ + +#ifndef EGL_EXT_platform_base +#define EGL_EXT_platform_base 1 +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#endif +#endif /* EGL_EXT_platform_base */ + +#ifndef EGL_EXT_platform_device +#define EGL_EXT_platform_device 1 +#define EGL_PLATFORM_DEVICE_EXT 0x313F +#endif /* EGL_EXT_platform_device */ + +#ifndef EGL_EXT_platform_wayland +#define EGL_EXT_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 +#endif /* EGL_EXT_platform_wayland */ + +#ifndef EGL_EXT_platform_x11 +#define EGL_EXT_platform_x11 1 +#define EGL_PLATFORM_X11_EXT 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 +#endif /* EGL_EXT_platform_x11 */ + +#ifndef EGL_EXT_platform_xcb +#define EGL_EXT_platform_xcb 1 +#define EGL_PLATFORM_XCB_EXT 0x31DC +#define EGL_PLATFORM_XCB_SCREEN_EXT 0x31DE +#endif /* EGL_EXT_platform_xcb */ + +#ifndef EGL_EXT_present_opaque +#define EGL_EXT_present_opaque 1 +#define EGL_PRESENT_OPAQUE_EXT 0x31DF +#endif /* EGL_EXT_present_opaque */ + +#ifndef EGL_EXT_protected_content +#define EGL_EXT_protected_content 1 +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 +#endif /* EGL_EXT_protected_content */ + +#ifndef EGL_EXT_protected_surface +#define EGL_EXT_protected_surface 1 +#endif /* EGL_EXT_protected_surface */ + +#ifndef EGL_EXT_stream_consumer_egloutput +#define EGL_EXT_stream_consumer_egloutput 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#endif +#endif /* EGL_EXT_stream_consumer_egloutput */ + +#ifndef EGL_EXT_surface_CTA861_3_metadata +#define EGL_EXT_surface_CTA861_3_metadata 1 +#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT 0x3360 +#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT 0x3361 +#endif /* EGL_EXT_surface_CTA861_3_metadata */ + +#ifndef EGL_EXT_surface_SMPTE2086_metadata +#define EGL_EXT_surface_SMPTE2086_metadata 1 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 +#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 +#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 +#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 +#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A +#define EGL_METADATA_SCALING_EXT 50000 +#endif /* EGL_EXT_surface_SMPTE2086_metadata */ + +#ifndef EGL_EXT_surface_compression +#define EGL_EXT_surface_compression 1 +#define EGL_SURFACE_COMPRESSION_EXT 0x34B0 +#define EGL_SURFACE_COMPRESSION_PLANE1_EXT 0x328E +#define EGL_SURFACE_COMPRESSION_PLANE2_EXT 0x328F +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x34B1 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x34B2 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x34B4 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x34B5 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x34B6 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x34B7 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x34B8 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x34B9 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x34BA +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x34BB +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x34BC +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x34BD +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x34BE +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x34BF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSUPPORTEDCOMPRESSIONRATESEXTPROC) (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySupportedCompressionRatesEXT (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates); +#endif +#endif /* EGL_EXT_surface_compression */ + +#ifndef EGL_EXT_swap_buffers_with_damage +#define EGL_EXT_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_EXT_swap_buffers_with_damage */ + +#ifndef EGL_EXT_sync_reuse +#define EGL_EXT_sync_reuse 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglUnsignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_EXT_sync_reuse */ + +#ifndef EGL_EXT_yuv_surface +#define EGL_EXT_yuv_surface 1 +#define EGL_YUV_ORDER_EXT 0x3301 +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_SUBSAMPLE_EXT 0x3312 +#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 +#define EGL_YUV_CSC_STANDARD_EXT 0x330A +#define EGL_YUV_PLANE_BPP_EXT 0x331A +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_ORDER_YUV_EXT 0x3302 +#define EGL_YUV_ORDER_YVU_EXT 0x3303 +#define EGL_YUV_ORDER_YUYV_EXT 0x3304 +#define EGL_YUV_ORDER_UYVY_EXT 0x3305 +#define EGL_YUV_ORDER_YVYU_EXT 0x3306 +#define EGL_YUV_ORDER_VYUY_EXT 0x3307 +#define EGL_YUV_ORDER_AYUV_EXT 0x3308 +#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 +#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 +#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 +#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 +#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 +#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B +#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C +#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D +#define EGL_YUV_PLANE_BPP_0_EXT 0x331B +#define EGL_YUV_PLANE_BPP_8_EXT 0x331C +#define EGL_YUV_PLANE_BPP_10_EXT 0x331D +#endif /* EGL_EXT_yuv_surface */ + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#endif +#endif /* EGL_HI_clientpixmap */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 +#define EGL_COLOR_FORMAT_HI 0x8F70 +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 +#endif /* EGL_HI_colorformats */ + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif /* EGL_IMG_context_priority */ + +#ifndef EGL_IMG_image_plane_attribs +#define EGL_IMG_image_plane_attribs 1 +#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 +#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 +#endif /* EGL_IMG_image_plane_attribs */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 +#define EGL_DRM_BUFFER_MESA 0x31D3 +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 +#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004 +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif +#endif /* EGL_MESA_drm_image */ + +#ifndef EGL_MESA_image_dma_buf_export +#define EGL_MESA_image_dma_buf_export 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#endif +#endif /* EGL_MESA_image_dma_buf_export */ + +#ifndef EGL_MESA_platform_gbm +#define EGL_MESA_platform_gbm 1 +#define EGL_PLATFORM_GBM_MESA 0x31D7 +#endif /* EGL_MESA_platform_gbm */ + +#ifndef EGL_MESA_platform_surfaceless +#define EGL_MESA_platform_surfaceless 1 +#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD +#endif /* EGL_MESA_platform_surfaceless */ + +#ifndef EGL_MESA_query_driver +#define EGL_MESA_query_driver 1 +typedef char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC) (EGLDisplay dpy); +typedef const char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC) (EGLDisplay dpy); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI char *EGLAPIENTRY eglGetDisplayDriverConfig (EGLDisplay dpy); +EGLAPI const char *EGLAPIENTRY eglGetDisplayDriverName (EGLDisplay dpy); +#endif +#endif /* EGL_MESA_query_driver */ + +#ifndef EGL_NOK_swap_region +#define EGL_NOK_swap_region 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region */ + +#ifndef EGL_NOK_swap_region2 +#define EGL_NOK_swap_region2 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region2 */ + +#ifndef EGL_NOK_texture_from_pixmap +#define EGL_NOK_texture_from_pixmap 1 +#define EGL_Y_INVERTED_NOK 0x307F +#endif /* EGL_NOK_texture_from_pixmap */ + +#ifndef EGL_NV_3dvision_surface +#define EGL_NV_3dvision_surface 1 +#define EGL_AUTO_STEREO_NV 0x3136 +#endif /* EGL_NV_3dvision_surface */ + +#ifndef EGL_NV_context_priority_realtime +#define EGL_NV_context_priority_realtime 1 +#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357 +#endif /* EGL_NV_context_priority_realtime */ + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif /* EGL_NV_coverage_sample */ + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 +#endif /* EGL_NV_coverage_sample_resolve */ + +#ifndef EGL_NV_cuda_event +#define EGL_NV_cuda_event 1 +#define EGL_CUDA_EVENT_HANDLE_NV 0x323B +#define EGL_SYNC_CUDA_EVENT_NV 0x323C +#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D +#endif /* EGL_NV_cuda_event */ + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif /* EGL_NV_depth_nonlinear */ + +#ifndef EGL_NV_device_cuda +#define EGL_NV_device_cuda 1 +#define EGL_CUDA_DEVICE_NV 0x323A +#endif /* EGL_NV_device_cuda */ + +#ifndef EGL_NV_native_query +#define EGL_NV_native_query 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#endif +#endif /* EGL_NV_native_query */ + +#ifndef EGL_NV_post_convert_rounding +#define EGL_NV_post_convert_rounding 1 +#endif /* EGL_NV_post_convert_rounding */ + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif +#endif /* EGL_NV_post_sub_buffer */ + +#ifndef EGL_NV_quadruple_buffer +#define EGL_NV_quadruple_buffer 1 +#define EGL_QUADRUPLE_BUFFER_NV 0x3231 +#endif /* EGL_NV_quadruple_buffer */ + +#ifndef EGL_NV_robustness_video_memory_purge +#define EGL_NV_robustness_video_memory_purge 1 +#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#endif /* EGL_NV_robustness_video_memory_purge */ + +#ifndef EGL_NV_stream_consumer_eglimage +#define EGL_NV_stream_consumer_eglimage 1 +#define EGL_STREAM_CONSUMER_IMAGE_NV 0x3373 +#define EGL_STREAM_IMAGE_ADD_NV 0x3374 +#define EGL_STREAM_IMAGE_REMOVE_NV 0x3375 +#define EGL_STREAM_IMAGE_AVAILABLE_NV 0x3376 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMIMAGECONSUMERCONNECTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list); +typedef EGLint (EGLAPIENTRYP PFNEGLQUERYSTREAMCONSUMEREVENTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMACQUIREIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMRELEASEIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamImageConsumerConnectNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list); +EGLAPI EGLint EGLAPIENTRY eglQueryStreamConsumerEventNV (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAcquireImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamReleaseImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); +#endif +#endif /* EGL_NV_stream_consumer_eglimage */ + +#ifndef EGL_NV_stream_consumer_gltexture_yuv +#define EGL_NV_stream_consumer_gltexture_yuv 1 +#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C +#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D +#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ + +#ifndef EGL_NV_stream_cross_display +#define EGL_NV_stream_cross_display 1 +#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E +#endif /* EGL_NV_stream_cross_display */ + +#ifndef EGL_NV_stream_cross_object +#define EGL_NV_stream_cross_object 1 +#define EGL_STREAM_CROSS_OBJECT_NV 0x334D +#endif /* EGL_NV_stream_cross_object */ + +#ifndef EGL_NV_stream_cross_partition +#define EGL_NV_stream_cross_partition 1 +#define EGL_STREAM_CROSS_PARTITION_NV 0x323F +#endif /* EGL_NV_stream_cross_partition */ + +#ifndef EGL_NV_stream_cross_process +#define EGL_NV_stream_cross_process 1 +#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 +#endif /* EGL_NV_stream_cross_process */ + +#ifndef EGL_NV_stream_cross_system +#define EGL_NV_stream_cross_system 1 +#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F +#endif /* EGL_NV_stream_cross_system */ + +#ifndef EGL_NV_stream_dma +#define EGL_NV_stream_dma 1 +#define EGL_STREAM_DMA_NV 0x3371 +#define EGL_STREAM_DMA_SERVER_NV 0x3372 +#endif /* EGL_NV_stream_dma */ + +#ifndef EGL_NV_stream_fifo_next +#define EGL_NV_stream_fifo_next 1 +#define EGL_PENDING_FRAME_NV 0x3329 +#define EGL_STREAM_TIME_PENDING_NV 0x332A +#endif /* EGL_NV_stream_fifo_next */ + +#ifndef EGL_NV_stream_fifo_synchronous +#define EGL_NV_stream_fifo_synchronous 1 +#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 +#endif /* EGL_NV_stream_fifo_synchronous */ + +#ifndef EGL_NV_stream_flush +#define EGL_NV_stream_flush 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamFlushNV (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_NV_stream_flush */ + +#ifndef EGL_NV_stream_frame_limits +#define EGL_NV_stream_frame_limits 1 +#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 +#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 +#endif /* EGL_NV_stream_frame_limits */ + +#ifndef EGL_NV_stream_metadata +#define EGL_NV_stream_metadata 1 +#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 +#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 +#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 +#define EGL_PRODUCER_METADATA_NV 0x3253 +#define EGL_CONSUMER_METADATA_NV 0x3254 +#define EGL_PENDING_METADATA_NV 0x3328 +#define EGL_METADATA0_SIZE_NV 0x3255 +#define EGL_METADATA1_SIZE_NV 0x3256 +#define EGL_METADATA2_SIZE_NV 0x3257 +#define EGL_METADATA3_SIZE_NV 0x3258 +#define EGL_METADATA0_TYPE_NV 0x3259 +#define EGL_METADATA1_TYPE_NV 0x325A +#define EGL_METADATA2_TYPE_NV 0x325B +#define EGL_METADATA3_TYPE_NV 0x325C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribNV (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); +#endif +#endif /* EGL_NV_stream_metadata */ + +#ifndef EGL_NV_stream_origin +#define EGL_NV_stream_origin 1 +#define EGL_STREAM_FRAME_ORIGIN_X_NV 0x3366 +#define EGL_STREAM_FRAME_ORIGIN_Y_NV 0x3367 +#define EGL_STREAM_FRAME_MAJOR_AXIS_NV 0x3368 +#define EGL_CONSUMER_AUTO_ORIENTATION_NV 0x3369 +#define EGL_PRODUCER_AUTO_ORIENTATION_NV 0x336A +#define EGL_LEFT_NV 0x336B +#define EGL_RIGHT_NV 0x336C +#define EGL_TOP_NV 0x336D +#define EGL_BOTTOM_NV 0x336E +#define EGL_X_AXIS_NV 0x336F +#define EGL_Y_AXIS_NV 0x3370 +#endif /* EGL_NV_stream_origin */ + +#ifndef EGL_NV_stream_remote +#define EGL_NV_stream_remote 1 +#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 +#define EGL_STREAM_TYPE_NV 0x3241 +#define EGL_STREAM_PROTOCOL_NV 0x3242 +#define EGL_STREAM_ENDPOINT_NV 0x3243 +#define EGL_STREAM_LOCAL_NV 0x3244 +#define EGL_STREAM_PRODUCER_NV 0x3247 +#define EGL_STREAM_CONSUMER_NV 0x3248 +#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 +#endif /* EGL_NV_stream_remote */ + +#ifndef EGL_NV_stream_reset +#define EGL_NV_stream_reset 1 +#define EGL_SUPPORT_RESET_NV 0x3334 +#define EGL_SUPPORT_REUSE_NV 0x3335 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglResetStreamNV (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_NV_stream_reset */ + +#ifndef EGL_NV_stream_socket +#define EGL_NV_stream_socket 1 +#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B +#define EGL_SOCKET_HANDLE_NV 0x324C +#define EGL_SOCKET_TYPE_NV 0x324D +#endif /* EGL_NV_stream_socket */ + +#ifndef EGL_NV_stream_socket_inet +#define EGL_NV_stream_socket_inet 1 +#define EGL_SOCKET_TYPE_INET_NV 0x324F +#endif /* EGL_NV_stream_socket_inet */ + +#ifndef EGL_NV_stream_socket_unix +#define EGL_NV_stream_socket_unix 1 +#define EGL_SOCKET_TYPE_UNIX_NV 0x324E +#endif /* EGL_NV_stream_socket_unix */ + +#ifndef EGL_NV_stream_sync +#define EGL_NV_stream_sync 1 +#define EGL_SYNC_NEW_FRAME_NV 0x321F +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#endif +#endif /* EGL_NV_stream_sync */ + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_NO_SYNC_NV EGL_CAST(EGLSyncNV,0) +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); +EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_sync */ + +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 +typedef khronos_utime_nanoseconds_t EGLuint64NV; +#ifdef KHRONOS_SUPPORT_INT64 +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void); +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_system_time */ + +#ifndef EGL_NV_triple_buffer +#define EGL_NV_triple_buffer 1 +#define EGL_TRIPLE_BUFFER_NV 0x3230 +#endif /* EGL_NV_triple_buffer */ + +#ifndef EGL_TIZEN_image_native_buffer +#define EGL_TIZEN_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 +#endif /* EGL_TIZEN_image_native_buffer */ + +#ifndef EGL_TIZEN_image_native_surface +#define EGL_TIZEN_image_native_surface 1 +#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 +#endif /* EGL_TIZEN_image_native_surface */ + +#ifndef EGL_WL_bind_wayland_display +#define EGL_WL_bind_wayland_display 1 +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +struct wl_display; +struct wl_resource; +#define EGL_WAYLAND_BUFFER_WL 0x31D5 +#define EGL_WAYLAND_PLANE_WL 0x31D6 +#define EGL_TEXTURE_Y_U_V_WL 0x31D7 +#define EGL_TEXTURE_Y_UV_WL 0x31D8 +#define EGL_TEXTURE_Y_XUXV_WL 0x31D9 +#define EGL_TEXTURE_EXTERNAL_WL 0x31DA +#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); +EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); +#endif +#endif /* EGL_WL_bind_wayland_display */ + +#ifndef EGL_WL_create_wayland_buffer_from_image +#define EGL_WL_create_wayland_buffer_from_image 1 +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC +struct wl_buffer; +typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dpy, EGLImageKHR image); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI struct wl_buffer *EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy, EGLImageKHR image); +#endif +#endif /* EGL_WL_create_wayland_buffer_from_image */ + +#ifdef __cplusplus +} +#endif + +#endif /* __eglext_h_ */ + +#endif /* _MSC_VER */ diff --git a/Thirdparty/SDL2/include/SDL_endian.h b/Thirdparty/SDL2/include/SDL_endian.h new file mode 100644 index 0000000..71bc067 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_endian.h @@ -0,0 +1,348 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_endian.h + * + * Functions for reading and writing endian-specific values + */ + +#ifndef SDL_endian_h_ +#define SDL_endian_h_ + +#include "SDL_stdinc.h" + +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, + so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ +#ifdef __clang__ +#ifndef __PRFCHWINTRIN_H +#define __PRFCHWINTRIN_H +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_m_prefetch(void *__P) +{ + __builtin_prefetch(__P, 0, 3 /* _MM_HINT_T0 */); +} +#endif /* __PRFCHWINTRIN_H */ +#endif /* __clang__ */ + +#include +#endif + +/** + * \name The two types of endianness + */ +/* @{ */ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/* @} */ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#elif defined(__OpenBSD__) || defined(__DragonFly__) +#include +#define SDL_BYTEORDER BYTE_ORDER +#elif defined(__FreeBSD__) || defined(__NetBSD__) +#include +#define SDL_BYTEORDER BYTE_ORDER +/* predefs from newer gcc and clang versions: */ +#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__) +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#error Unsupported endianness +#endif /**/ +#else +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MIPSEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux__ */ +#endif /* !SDL_BYTEORDER */ + +#ifndef SDL_FLOATWORDORDER /* Not defined in SDL_config.h? */ +/* predefs from newer gcc versions: */ +#if defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__) +#if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN +#elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) +#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN +#else +#error Unsupported endianness +#endif /**/ +#elif defined(__MAVERICK__) +/* For Maverick, float words are always little-endian. */ +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN +#elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__) +/* For FPA, float words are always big-endian. */ +#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN +#else +/* By default, assume that floats words follow the memory system mode. */ +#define SDL_FLOATWORDORDER SDL_BYTEORDER +#endif /* __FLOAT_WORD_ORDER__ */ +#endif /* !SDL_FLOATWORDORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_endian.h + */ + +/* various modern compilers may have builtin swap */ +#if defined(__GNUC__) || defined(__clang__) +# define HAS_BUILTIN_BSWAP16 (_SDL_HAS_BUILTIN(__builtin_bswap16)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +# define HAS_BUILTIN_BSWAP32 (_SDL_HAS_BUILTIN(__builtin_bswap32)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) +# define HAS_BUILTIN_BSWAP64 (_SDL_HAS_BUILTIN(__builtin_bswap64)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + + /* this one is broken */ +# define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95) +#else +# define HAS_BUILTIN_BSWAP16 0 +# define HAS_BUILTIN_BSWAP32 0 +# define HAS_BUILTIN_BSWAP64 0 +# define HAS_BROKEN_BSWAP 0 +#endif + +#if HAS_BUILTIN_BSWAP16 +#define SDL_Swap16(x) __builtin_bswap16(x) +#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) +#pragma intrinsic(_byteswap_ushort) +#define SDL_Swap16(x) _byteswap_ushort(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); + return x; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); + return x; +} +#elif (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + int result; + + __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); + return (Uint16)result; +} +#elif (defined(__m68k__) && !defined(__mcoldfire__)) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint16 SDL_Swap16(Uint16); +#pragma aux SDL_Swap16 = \ + "xchg al, ah" \ + parm [ax] \ + modify [ax]; +#else +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); +} +#endif + +#if HAS_BUILTIN_BSWAP32 +#define SDL_Swap32(x) __builtin_bswap32(x) +#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) +#pragma intrinsic(_byteswap_ulong) +#define SDL_Swap32(x) _byteswap_ulong(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0": "=r"(x):"0"(x)); + return x; +} +#elif (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x)); + return result; +} +#elif (defined(__m68k__) && !defined(__mcoldfire__)) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint32 SDL_Swap32(Uint32); +#pragma aux SDL_Swap32 = \ + "bswap eax" \ + parm [eax] \ + modify [eax]; +#else +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) | + ((x >> 8) & 0x0000FF00) | (x >> 24))); +} +#endif + +#if HAS_BUILTIN_BSWAP64 +#define SDL_Swap64(x) __builtin_bswap64(x) +#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL) +#pragma intrinsic(_byteswap_uint64) +#define SDL_Swap64(x) _byteswap_uint64(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + union { + struct { + Uint32 a, b; + } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r"(v.s.a), "=r"(v.s.b) + : "0" (v.s.a), "1"(v.s.b)); + return v.u; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint64 SDL_Swap64(Uint64); +#pragma aux SDL_Swap64 = \ + "bswap eax" \ + "bswap edx" \ + "xchg eax,edx" \ + parm [eax edx] \ + modify [eax edx]; +#else +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif + + +SDL_FORCE_INLINE float +SDL_SwapFloat(float x) +{ + union { + float f; + Uint32 ui32; + } swapper; + swapper.f = x; + swapper.ui32 = SDL_Swap32(swapper.ui32); + return swapper.f; +} + +/* remove extra macros */ +#undef HAS_BROKEN_BSWAP +#undef HAS_BUILTIN_BSWAP16 +#undef HAS_BUILTIN_BSWAP32 +#undef HAS_BUILTIN_BSWAP64 + +/** + * \name Swap to native + * Byteswap item from the specified endianness to the native endianness. + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapFloatLE(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#define SDL_SwapFloatBE(X) (X) +#endif +/* @} *//* Swap to native */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_endian_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_error.h b/Thirdparty/SDL2/include/SDL_error.h new file mode 100644 index 0000000..31c2261 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_error.h @@ -0,0 +1,163 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_error.h + * + * Simple error message routines for SDL. + */ + +#ifndef SDL_error_h_ +#define SDL_error_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Public functions */ + + +/** + * Set the SDL error message for the current thread. + * + * Calling this function will replace any previous error message that was set. + * + * This function always returns -1, since SDL frequently uses -1 to signify an + * failing result, leading to this idiom: + * + * ```c + * if (error_code) { + * return SDL_SetError("This operation has failed: %d", error_code); + * } + * ``` + * + * \param fmt a printf()-style message format string + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any + * \returns always -1. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ClearError + * \sa SDL_GetError + */ +extern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Retrieve a message about the last error that occurred on the current + * thread. + * + * It is possible for multiple errors to occur before calling SDL_GetError(). + * Only the last error is returned. + * + * The message is only applicable when an SDL function has signaled an error. + * You must check the return values of SDL function calls to determine when to + * appropriately call SDL_GetError(). You should *not* use the results of + * SDL_GetError() to decide if an error has occurred! Sometimes SDL will set + * an error string even when reporting success. + * + * SDL will *not* clear the error string for successful API calls. You *must* + * check return values for failure cases before you can assume the error + * string applies. + * + * Error strings are set per-thread, so an error set in a different thread + * will not interfere with the current thread's operation. + * + * The returned string is internally allocated and must not be freed by the + * application. + * + * \returns a message with information about the specific error that occurred, + * or an empty string if there hasn't been an error message set since + * the last call to SDL_ClearError(). The message is only applicable + * when an SDL function has signaled an error. You must check the + * return values of SDL function calls to determine when to + * appropriately call SDL_GetError(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ClearError + * \sa SDL_SetError + */ +extern DECLSPEC const char *SDLCALL SDL_GetError(void); + +/** + * Get the last error message that was set for the current thread. + * + * This allows the caller to copy the error string into a provided buffer, but + * otherwise operates exactly the same as SDL_GetError(). + * + * \param errstr A buffer to fill with the last error message that was set for + * the current thread + * \param maxlen The size of the buffer pointed to by the errstr parameter + * \returns the pointer passed in as the `errstr` parameter. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GetError + */ +extern DECLSPEC char * SDLCALL SDL_GetErrorMsg(char *errstr, int maxlen); + +/** + * Clear any previous error message for this thread. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetError + * \sa SDL_SetError + */ +extern DECLSPEC void SDLCALL SDL_ClearError(void); + +/** + * \name Internal error functions + * + * \internal + * Private error reporting function - used internally. + */ +/* @{ */ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) +typedef enum +{ + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +/* SDL_Error() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code); +/* @} *//* Internal error functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_error_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_events.h b/Thirdparty/SDL2/include/SDL_events.h new file mode 100644 index 0000000..9d09703 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_events.h @@ -0,0 +1,1166 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_events.h + * + * Include file for SDL event handling. + */ + +#ifndef SDL_events_h_ +#define SDL_events_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_quit.h" +#include "SDL_gesture.h" +#include "SDL_touch.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* General keyboard/mouse state definitions */ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 + +/** + * The types of events that can be delivered. + */ +typedef enum +{ + SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */ + + /* Application events */ + SDL_QUIT = 0x100, /**< User-requested quit */ + + /* These application events have special meaning on iOS, see README-ios.md for details */ + SDL_APP_TERMINATING, /**< The application is being terminated by the OS + Called on iOS in applicationWillTerminate() + Called on Android in onDestroy() + */ + SDL_APP_LOWMEMORY, /**< The application is low on memory, free memory if possible. + Called on iOS in applicationDidReceiveMemoryWarning() + Called on Android in onLowMemory() + */ + SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background + Called on iOS in applicationWillResignActive() + Called on Android in onPause() + */ + SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time + Called on iOS in applicationDidEnterBackground() + Called on Android in onPause() + */ + SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground + Called on iOS in applicationWillEnterForeground() + Called on Android in onResume() + */ + SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive + Called on iOS in applicationDidBecomeActive() + Called on Android in onResume() + */ + + SDL_LOCALECHANGED, /**< The user's locale preferences have changed. */ + + /* Display events */ + SDL_DISPLAYEVENT = 0x150, /**< Display state change */ + + /* Window events */ + SDL_WINDOWEVENT = 0x200, /**< Window state change */ + SDL_SYSWMEVENT, /**< System specific event */ + + /* Keyboard events */ + SDL_KEYDOWN = 0x300, /**< Key pressed */ + SDL_KEYUP, /**< Key released */ + SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ + SDL_TEXTINPUT, /**< Keyboard text input */ + SDL_KEYMAPCHANGED, /**< Keymap changed due to a system event such as an + input language or keyboard layout change. + */ + SDL_TEXTEDITING_EXT, /**< Extended keyboard text editing (composition) */ + + /* Mouse events */ + SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_MOUSEWHEEL, /**< Mouse wheel motion */ + + /* Joystick events */ + SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */ + SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */ + SDL_JOYBATTERYUPDATED, /**< Joystick battery level change */ + + /* Game controller events */ + SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */ + SDL_CONTROLLERBUTTONDOWN, /**< Game controller button pressed */ + SDL_CONTROLLERBUTTONUP, /**< Game controller button released */ + SDL_CONTROLLERDEVICEADDED, /**< A new Game controller has been inserted into the system */ + SDL_CONTROLLERDEVICEREMOVED, /**< An opened Game controller has been removed */ + SDL_CONTROLLERDEVICEREMAPPED, /**< The controller mapping was updated */ + SDL_CONTROLLERTOUCHPADDOWN, /**< Game controller touchpad was touched */ + SDL_CONTROLLERTOUCHPADMOTION, /**< Game controller touchpad finger was moved */ + SDL_CONTROLLERTOUCHPADUP, /**< Game controller touchpad finger was lifted */ + SDL_CONTROLLERSENSORUPDATE, /**< Game controller sensor was updated */ + + /* Touch events */ + SDL_FINGERDOWN = 0x700, + SDL_FINGERUP, + SDL_FINGERMOTION, + + /* Gesture events */ + SDL_DOLLARGESTURE = 0x800, + SDL_DOLLARRECORD, + SDL_MULTIGESTURE, + + /* Clipboard events */ + SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard or primary selection changed */ + + /* Drag and drop events */ + SDL_DROPFILE = 0x1000, /**< The system requests a file open */ + SDL_DROPTEXT, /**< text/plain drag-and-drop event */ + SDL_DROPBEGIN, /**< A new set of drops is beginning (NULL filename) */ + SDL_DROPCOMPLETE, /**< Current set of drops is now complete (NULL filename) */ + + /* Audio hotplug events */ + SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */ + SDL_AUDIODEVICEREMOVED, /**< An audio device has been removed. */ + + /* Sensor events */ + SDL_SENSORUPDATE = 0x1200, /**< A sensor was updated */ + + /* Render events */ + SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */ + SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */ + + /* Internal events */ + SDL_POLLSENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ + + /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, + * and should be allocated with SDL_RegisterEvents() + */ + SDL_USEREVENT = 0x8000, + + /** + * This last event is only for bounding internal arrays + */ + SDL_LASTEVENT = 0xFFFF +} SDL_EventType; + +/** + * \brief Fields shared by every event + */ +typedef struct SDL_CommonEvent +{ + Uint32 type; + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_CommonEvent; + +/** + * \brief Display state change event data (event.display.*) + */ +typedef struct SDL_DisplayEvent +{ + Uint32 type; /**< ::SDL_DISPLAYEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 display; /**< The associated display index */ + Uint8 event; /**< ::SDL_DisplayEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ +} SDL_DisplayEvent; + +/** + * \brief Window state change event data (event.window.*) + */ +typedef struct SDL_WindowEvent +{ + Uint32 type; /**< ::SDL_WINDOWEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The associated window */ + Uint8 event; /**< ::SDL_WindowEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ + Sint32 data2; /**< event dependent data */ +} SDL_WindowEvent; + +/** + * \brief Keyboard button event structure (event.key.*) + */ +typedef struct SDL_KeyboardEvent +{ + Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 repeat; /**< Non-zero if this is a key repeat */ + Uint8 padding2; + Uint8 padding3; + SDL_Keysym keysym; /**< The key that was pressed or released */ +} SDL_KeyboardEvent; + +#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text editing event structure (event.edit.*) + */ +typedef struct SDL_TextEditingEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingEvent; + +/** + * \brief Extended keyboard text editing event structure (event.editExt.*) when text would be + * truncated if stored in the text buffer SDL_TextEditingEvent + */ +typedef struct SDL_TextEditingExtEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING_EXT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char* text; /**< The editing text, which should be freed with SDL_free(), and will not be NULL */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingExtEvent; + +#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text input event structure (event.text.*) + */ +typedef struct SDL_TextInputEvent +{ + Uint32 type; /**< ::SDL_TEXTINPUT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ +} SDL_TextInputEvent; + +/** + * \brief Mouse motion event structure (event.motion.*) + */ +typedef struct SDL_MouseMotionEvent +{ + Uint32 type; /**< ::SDL_MOUSEMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint32 state; /**< The current button state */ + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ + Sint32 xrel; /**< The relative motion in the X direction */ + Sint32 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** + * \brief Mouse button event structure (event.button.*) + */ +typedef struct SDL_MouseButtonEvent +{ + Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */ + Uint8 padding1; + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ +} SDL_MouseButtonEvent; + +/** + * \brief Mouse wheel event structure (event.wheel.*) + */ +typedef struct SDL_MouseWheelEvent +{ + Uint32 type; /**< ::SDL_MOUSEWHEEL */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ + Sint32 y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ + Uint32 direction; /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */ + float preciseX; /**< The amount scrolled horizontally, positive to the right and negative to the left, with float precision (added in 2.0.18) */ + float preciseY; /**< The amount scrolled vertically, positive away from the user and negative toward the user, with float precision (added in 2.0.18) */ + Sint32 mouseX; /**< X coordinate, relative to window (added in 2.26.0) */ + Sint32 mouseY; /**< Y coordinate, relative to window (added in 2.26.0) */ +} SDL_MouseWheelEvent; + +/** + * \brief Joystick axis motion event structure (event.jaxis.*) + */ +typedef struct SDL_JoyAxisEvent +{ + Uint32 type; /**< ::SDL_JOYAXISMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The joystick axis index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_JoyAxisEvent; + +/** + * \brief Joystick trackball motion event structure (event.jball.*) + */ +typedef struct SDL_JoyBallEvent +{ + Uint32 type; /**< ::SDL_JOYBALLMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 ball; /**< The joystick trackball index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** + * \brief Joystick hat position change event structure (event.jhat.*) + */ +typedef struct SDL_JoyHatEvent +{ + Uint32 type; /**< ::SDL_JOYHATMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value. + * \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP + * \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT + * \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN + * + * Note that zero means the POV is centered. + */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyHatEvent; + +/** + * \brief Joystick button event structure (event.jbutton.*) + */ +typedef struct SDL_JoyButtonEvent +{ + Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyButtonEvent; + +/** + * \brief Joystick device event structure (event.jdevice.*) + */ +typedef struct SDL_JoyDeviceEvent +{ + Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */ +} SDL_JoyDeviceEvent; + +/** + * \brief Joysick battery level change event structure (event.jbattery.*) + */ +typedef struct SDL_JoyBatteryEvent +{ + Uint32 type; /**< ::SDL_JOYBATTERYUPDATED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + SDL_JoystickPowerLevel level; /**< The joystick battery level */ +} SDL_JoyBatteryEvent; + +/** + * \brief Game controller axis motion event structure (event.caxis.*) + */ +typedef struct SDL_ControllerAxisEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_ControllerAxisEvent; + + +/** + * \brief Game controller button event structure (event.cbutton.*) + */ +typedef struct SDL_ControllerButtonEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The controller button (SDL_GameControllerButton) */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_ControllerButtonEvent; + + +/** + * \brief Controller device event structure (event.cdevice.*) + */ +typedef struct SDL_ControllerDeviceEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ +} SDL_ControllerDeviceEvent; + +/** + * \brief Game controller touchpad event structure (event.ctouchpad.*) + */ +typedef struct SDL_ControllerTouchpadEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERTOUCHPADDOWN or ::SDL_CONTROLLERTOUCHPADMOTION or ::SDL_CONTROLLERTOUCHPADUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Sint32 touchpad; /**< The index of the touchpad */ + Sint32 finger; /**< The index of the finger on the touchpad */ + float x; /**< Normalized in the range 0...1 with 0 being on the left */ + float y; /**< Normalized in the range 0...1 with 0 being at the top */ + float pressure; /**< Normalized in the range 0...1 */ +} SDL_ControllerTouchpadEvent; + +/** + * \brief Game controller sensor event structure (event.csensor.*) + */ +typedef struct SDL_ControllerSensorEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERSENSORUPDATE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Sint32 sensor; /**< The type of the sensor, one of the values of ::SDL_SensorType */ + float data[3]; /**< Up to 3 values from the sensor, as defined in SDL_sensor.h */ + Uint64 timestamp_us; /**< The timestamp of the sensor reading in microseconds, if the hardware provides this information. */ +} SDL_ControllerSensorEvent; + +/** + * \brief Audio device event structure (event.adevice.*) + */ +typedef struct SDL_AudioDeviceEvent +{ + Uint32 type; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 which; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */ + Uint8 iscapture; /**< zero if an output device, non-zero if a capture device. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_AudioDeviceEvent; + + +/** + * \brief Touch finger event structure (event.tfinger.*) + */ +typedef struct SDL_TouchFingerEvent +{ + Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + SDL_FingerID fingerId; + float x; /**< Normalized in the range 0...1 */ + float y; /**< Normalized in the range 0...1 */ + float dx; /**< Normalized in the range -1...1 */ + float dy; /**< Normalized in the range -1...1 */ + float pressure; /**< Normalized in the range 0...1 */ + Uint32 windowID; /**< The window underneath the finger, if any */ +} SDL_TouchFingerEvent; + + +/** + * \brief Multiple Finger Gesture Event (event.mgesture.*) + */ +typedef struct SDL_MultiGestureEvent +{ + Uint32 type; /**< ::SDL_MULTIGESTURE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + float dTheta; + float dDist; + float x; + float y; + Uint16 numFingers; + Uint16 padding; +} SDL_MultiGestureEvent; + + +/** + * \brief Dollar Gesture Event (event.dgesture.*) + */ +typedef struct SDL_DollarGestureEvent +{ + Uint32 type; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + SDL_GestureID gestureId; + Uint32 numFingers; + float error; + float x; /**< Normalized center of gesture */ + float y; /**< Normalized center of gesture */ +} SDL_DollarGestureEvent; + + +/** + * \brief An event used to request a file open by the system (event.drop.*) + * This event is enabled by default, you can disable it with SDL_EventState(). + * \note If this event is enabled, you must free the filename in the event. + */ +typedef struct SDL_DropEvent +{ + Uint32 type; /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + char *file; /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */ + Uint32 windowID; /**< The window that was dropped on, if any */ +} SDL_DropEvent; + + +/** + * \brief Sensor event structure (event.sensor.*) + */ +typedef struct SDL_SensorEvent +{ + Uint32 type; /**< ::SDL_SENSORUPDATE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The instance ID of the sensor */ + float data[6]; /**< Up to 6 values from the sensor - additional values can be queried using SDL_SensorGetData() */ + Uint64 timestamp_us; /**< The timestamp of the sensor reading in microseconds, if the hardware provides this information. */ +} SDL_SensorEvent; + +/** + * \brief The "quit requested" event + */ +typedef struct SDL_QuitEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_QuitEvent; + +/** + * \brief OS Specific event + */ +typedef struct SDL_OSEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_OSEvent; + +/** + * \brief A user-defined event type (event.user.*) + */ +typedef struct SDL_UserEvent +{ + Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The associated window if any */ + Sint32 code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; + +/** + * \brief A video driver dependent system event (event.syswm.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * + * \note If you want to use this event, you should include SDL_syswm.h. + */ +typedef struct SDL_SysWMEvent +{ + Uint32 type; /**< ::SDL_SYSWMEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ +} SDL_SysWMEvent; + +/** + * \brief General event structure + */ +typedef union SDL_Event +{ + Uint32 type; /**< Event type, shared with all events */ + SDL_CommonEvent common; /**< Common event data */ + SDL_DisplayEvent display; /**< Display event data */ + SDL_WindowEvent window; /**< Window event data */ + SDL_KeyboardEvent key; /**< Keyboard event data */ + SDL_TextEditingEvent edit; /**< Text editing event data */ + SDL_TextEditingExtEvent editExt; /**< Extended text editing event data */ + SDL_TextInputEvent text; /**< Text input event data */ + SDL_MouseMotionEvent motion; /**< Mouse motion event data */ + SDL_MouseButtonEvent button; /**< Mouse button event data */ + SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ + SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ + SDL_JoyBallEvent jball; /**< Joystick ball event data */ + SDL_JoyHatEvent jhat; /**< Joystick hat event data */ + SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ + SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */ + SDL_JoyBatteryEvent jbattery; /**< Joystick battery event data */ + SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ + SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ + SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ + SDL_ControllerTouchpadEvent ctouchpad; /**< Game Controller touchpad event data */ + SDL_ControllerSensorEvent csensor; /**< Game Controller sensor event data */ + SDL_AudioDeviceEvent adevice; /**< Audio device event data */ + SDL_SensorEvent sensor; /**< Sensor event data */ + SDL_QuitEvent quit; /**< Quit request event data */ + SDL_UserEvent user; /**< Custom event data */ + SDL_SysWMEvent syswm; /**< System dependent window event data */ + SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_MultiGestureEvent mgesture; /**< Gesture event data */ + SDL_DollarGestureEvent dgesture; /**< Gesture event data */ + SDL_DropEvent drop; /**< Drag and drop event data */ + + /* This is necessary for ABI compatibility between Visual C++ and GCC. + Visual C++ will respect the push pack pragma and use 52 bytes (size of + SDL_TextEditingEvent, the largest structure for 32-bit and 64-bit + architectures) for this union, and GCC will use the alignment of the + largest datatype within the union, which is 8 bytes on 64-bit + architectures. + + So... we'll add padding to force the size to be 56 bytes for both. + + On architectures where pointers are 16 bytes, this needs rounding up to + the next multiple of 16, 64, and on architectures where pointers are + even larger the size of SDL_UserEvent will dominate as being 3 pointers. + */ + Uint8 padding[sizeof(void *) <= 8 ? 56 : sizeof(void *) == 16 ? 64 : 3 * sizeof(void *)]; +} SDL_Event; + +/* Make sure we haven't broken binary compatibility */ +SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NULL)->padding)); + + +/* Function prototypes */ + +/** + * Pump the event loop, gathering events from the input devices. + * + * This function updates the event queue and internal input device state. + * + * **WARNING**: This should only be run in the thread that initialized the + * video subsystem, and for extra safety, you should consider only doing those + * things on the main thread in any case. + * + * SDL_PumpEvents() gathers all the pending input information from devices and + * places it in the event queue. Without calls to SDL_PumpEvents() no events + * would ever be placed on the queue. Often the need for calls to + * SDL_PumpEvents() is hidden from the user since SDL_PollEvent() and + * SDL_WaitEvent() implicitly call SDL_PumpEvents(). However, if you are not + * polling or waiting for events (e.g. you are filtering them), then you must + * call SDL_PumpEvents() to force an event queue update. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_WaitEvent + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +/* @{ */ +typedef enum +{ + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Check the event queue for messages and optionally return them. + * + * `action` may be any of the following: + * + * - `SDL_ADDEVENT`: up to `numevents` events will be added to the back of the + * event queue. + * - `SDL_PEEKEVENT`: `numevents` events at the front of the event queue, + * within the specified minimum and maximum type, will be returned to the + * caller and will _not_ be removed from the queue. + * - `SDL_GETEVENT`: up to `numevents` events at the front of the event queue, + * within the specified minimum and maximum type, will be returned to the + * caller and will be removed from the queue. + * + * You may have to call SDL_PumpEvents() before calling this function. + * Otherwise, the events may not be ready to be filtered when you call + * SDL_PeepEvents(). + * + * This function is thread-safe. + * + * \param events destination buffer for the retrieved events + * \param numevents if action is SDL_ADDEVENT, the number of events to add + * back to the event queue; if action is SDL_PEEKEVENT or + * SDL_GETEVENT, the maximum number of events to retrieve + * \param action action to take; see [[#action|Remarks]] for details + * \param minType minimum value of the event type to be considered; + * SDL_FIRSTEVENT is a safe choice + * \param maxType maximum value of the event type to be considered; + * SDL_LASTEVENT is a safe choice + * \returns the number of events actually stored or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_PushEvent + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, + SDL_eventaction action, + Uint32 minType, Uint32 maxType); +/* @} */ + +/** + * Check for the existence of a certain event type in the event queue. + * + * If you need to check for a range of event types, use SDL_HasEvents() + * instead. + * + * \param type the type of event to be queried; see SDL_EventType for details + * \returns SDL_TRUE if events matching `type` are present, or SDL_FALSE if + * events matching `type` are not present. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasEvents + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); + + +/** + * Check for the existence of certain event types in the event queue. + * + * If you need to check for a single event type, use SDL_HasEvent() instead. + * + * \param minType the low end of event type to be queried, inclusive; see + * SDL_EventType for details + * \param maxType the high end of event type to be queried, inclusive; see + * SDL_EventType for details + * \returns SDL_TRUE if events with type >= `minType` and <= `maxType` are + * present, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasEvents + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); + +/** + * Clear events of a specific type from the event queue. + * + * This will unconditionally remove any events from the queue that match + * `type`. If you need to remove a range of event types, use SDL_FlushEvents() + * instead. + * + * It's also normal to just ignore events you don't care about in your event + * loop without calling this function. + * + * This function only affects currently queued events. If you want to make + * sure that all pending OS events are flushed, you can call SDL_PumpEvents() + * on the main thread immediately before the flush call. + * + * \param type the type of event to be cleared; see SDL_EventType for details + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FlushEvents + */ +extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); + +/** + * Clear events of a range of types from the event queue. + * + * This will unconditionally remove any events from the queue that are in the + * range of `minType` to `maxType`, inclusive. If you need to remove a single + * event type, use SDL_FlushEvent() instead. + * + * It's also normal to just ignore events you don't care about in your event + * loop without calling this function. + * + * This function only affects currently queued events. If you want to make + * sure that all pending OS events are flushed, you can call SDL_PumpEvents() + * on the main thread immediately before the flush call. + * + * \param minType the low end of event type to be cleared, inclusive; see + * SDL_EventType for details + * \param maxType the high end of event type to be cleared, inclusive; see + * SDL_EventType for details + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FlushEvent + */ +extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); + +/** + * Poll for currently pending events. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. The 1 returned refers to + * this event, immediately stored in the SDL Event structure -- not an event + * to follow. + * + * If `event` is NULL, it simply returns 1 if there is an event in the queue, + * but will not remove it from the queue. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that set the video mode. + * + * SDL_PollEvent() is the favored way of receiving system events since it can + * be done from the main loop and does not suspend the main loop while waiting + * on an event to be posted. + * + * The common practice is to fully process the event queue once every frame, + * usually as a first step before updating the game's state: + * + * ```c + * while (game_is_still_running) { + * SDL_Event event; + * while (SDL_PollEvent(&event)) { // poll until all events are handled! + * // decide what to do with this event. + * } + * + * // update game state, draw the current frame + * } + * ``` + * + * \param event the SDL_Event structure to be filled with the next event from + * the queue, or NULL + * \returns 1 if there is a pending event or 0 if there are none available. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventFilter + * \sa SDL_PeepEvents + * \sa SDL_PushEvent + * \sa SDL_SetEventFilter + * \sa SDL_WaitEvent + * \sa SDL_WaitEventTimeout + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); + +/** + * Wait indefinitely for the next available event. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that initialized the video subsystem. + * + * \param event the SDL_Event structure to be filled in with the next event + * from the queue, or NULL + * \returns 1 on success or 0 if there was an error while waiting for events; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_WaitEventTimeout + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); + +/** + * Wait until the specified timeout (in milliseconds) for the next available + * event. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that initialized the video subsystem. + * + * \param event the SDL_Event structure to be filled in with the next event + * from the queue, or NULL + * \param timeout the maximum number of milliseconds to wait for the next + * available event + * \returns 1 on success or 0 if there was an error while waiting for events; + * call SDL_GetError() for more information. This also returns 0 if + * the timeout elapsed without an event arriving. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_WaitEvent + */ +extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, + int timeout); + +/** + * Add an event to the event queue. + * + * The event queue can actually be used as a two way communication channel. + * Not only can events be read from the queue, but the user can also push + * their own events onto it. `event` is a pointer to the event structure you + * wish to push onto the queue. The event is copied into the queue, and the + * caller may dispose of the memory pointed to after SDL_PushEvent() returns. + * + * Note: Pushing device input events onto the queue doesn't modify the state + * of the device within SDL. + * + * This function is thread-safe, and can be called from other threads safely. + * + * Note: Events pushed onto the queue with SDL_PushEvent() get passed through + * the event filter but events added with SDL_PeepEvents() do not. + * + * For pushing application-specific events, please use SDL_RegisterEvents() to + * get an event type that does not conflict with other code that also wants + * its own custom event types. + * + * \param event the SDL_Event to be added to the queue + * \returns 1 on success, 0 if the event was filtered, or a negative error + * code on failure; call SDL_GetError() for more information. A + * common reason for error is the event queue being full. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PeepEvents + * \sa SDL_PollEvent + * \sa SDL_RegisterEvents + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); + +/** + * A function pointer used for callbacks that watch the event queue. + * + * \param userdata what was passed as `userdata` to SDL_SetEventFilter() + * or SDL_AddEventWatch, etc + * \param event the event that triggered the callback + * \returns 1 to permit event to be added to the queue, and 0 to disallow + * it. When used with SDL_AddEventWatch, the return value is ignored. + * + * \sa SDL_SetEventFilter + * \sa SDL_AddEventWatch + */ +typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); + +/** + * Set up a filter to process all events before they change internal state and + * are posted to the internal event queue. + * + * If the filter function returns 1 when called, then the event will be added + * to the internal queue. If it returns 0, then the event will be dropped from + * the queue, but the internal state will still be updated. This allows + * selective filtering of dynamically arriving events. + * + * **WARNING**: Be very careful of what you do in the event filter function, + * as it may run in a different thread! + * + * On platforms that support it, if the quit event is generated by an + * interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the + * application at the next event poll. + * + * There is one caveat when dealing with the ::SDL_QuitEvent event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will be + * closed, otherwise the window will remain open if possible. + * + * Note: Disabled events never make it to the event filter function; see + * SDL_EventState(). + * + * Note: If you just want to inspect events without filtering, you should use + * SDL_AddEventWatch() instead. + * + * Note: Events pushed onto the queue with SDL_PushEvent() get passed through + * the event filter, but events pushed onto the queue with SDL_PeepEvents() do + * not. + * + * \param filter An SDL_EventFilter function to call when an event happens + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddEventWatch + * \sa SDL_EventState + * \sa SDL_GetEventFilter + * \sa SDL_PeepEvents + * \sa SDL_PushEvent + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, + void *userdata); + +/** + * Query the current event filter. + * + * This function can be used to "chain" filters, by saving the existing filter + * before replacing it with a function that will call that saved filter. + * + * \param filter the current callback function will be stored here + * \param userdata the pointer that is passed to the current event filter will + * be stored here + * \returns SDL_TRUE on success or SDL_FALSE if there is no event filter set. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetEventFilter + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, + void **userdata); + +/** + * Add a callback to be triggered when an event is added to the event queue. + * + * `filter` will be called when an event happens, and its return value is + * ignored. + * + * **WARNING**: Be very careful of what you do in the event filter function, + * as it may run in a different thread! + * + * If the quit event is generated by a signal (e.g. SIGINT), it will bypass + * the internal queue and be delivered to the watch callback immediately, and + * arrive at the next event poll. + * + * Note: the callback is called for events posted by the user through + * SDL_PushEvent(), but not for disabled events, nor for events by a filter + * callback set with SDL_SetEventFilter(), nor for events posted by the user + * through SDL_PeepEvents(). + * + * \param filter an SDL_EventFilter function to call when an event happens. + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DelEventWatch + * \sa SDL_SetEventFilter + */ +extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Remove an event watch callback added with SDL_AddEventWatch(). + * + * This function takes the same input as SDL_AddEventWatch() to identify and + * delete the corresponding callback. + * + * \param filter the function originally passed to SDL_AddEventWatch() + * \param userdata the pointer originally passed to SDL_AddEventWatch() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddEventWatch + */ +extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Run a specific filter function on the current event queue, removing any + * events for which the filter returns 0. + * + * See SDL_SetEventFilter() for more information. Unlike SDL_SetEventFilter(), + * this function does not change the filter permanently, it only uses the + * supplied filter until this function returns. + * + * \param filter the SDL_EventFilter function to call when an event happens + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventFilter + * \sa SDL_SetEventFilter + */ +extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, + void *userdata); + +/* @{ */ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 + +/** + * Set the state of processing events by type. + * + * `state` may be any of the following: + * + * - `SDL_QUERY`: returns the current processing state of the specified event + * - `SDL_IGNORE` (aka `SDL_DISABLE`): the event will automatically be dropped + * from the event queue and will not be filtered + * - `SDL_ENABLE`: the event will be processed normally + * + * \param type the type of event; see SDL_EventType for details + * \param state how to process the event + * \returns `SDL_DISABLE` or `SDL_ENABLE`, representing the processing state + * of the event before this function makes any changes to it. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventState + */ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); +/* @} */ +#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) + +/** + * Allocate a set of user-defined events, and return the beginning event + * number for that set of events. + * + * Calling this function with `numevents` <= 0 is an error and will return + * (Uint32)-1. + * + * Note, (Uint32)-1 means the maximum unsigned 32-bit integer value (or + * 0xFFFFFFFF), but is clearer to write. + * + * \param numevents the number of events to be allocated + * \returns the beginning event number, or (Uint32)-1 if there are not enough + * user-defined events left. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PushEvent + */ +extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_events_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_filesystem.h b/Thirdparty/SDL2/include/SDL_filesystem.h new file mode 100644 index 0000000..4cad657 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_filesystem.h @@ -0,0 +1,149 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_filesystem.h + * + * \brief Include file for filesystem SDL API functions + */ + +#ifndef SDL_filesystem_h_ +#define SDL_filesystem_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the directory where the application was run from. + * + * This is not necessarily a fast call, so you should call this once near + * startup and save the string if you need it. + * + * **Mac OS X and iOS Specific Functionality**: If the application is in a + * ".app" bundle, this function returns the Resource directory (e.g. + * MyApp.app/Contents/Resources/). This behaviour can be overridden by adding + * a property to the Info.plist file. Adding a string key with the name + * SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the + * behaviour. + * + * Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an + * application in /Applications/SDLApp/MyApp.app): + * + * - `resource`: bundle resource directory (the default). For example: + * `/Applications/SDLApp/MyApp.app/Contents/Resources` + * - `bundle`: the Bundle directory. For example: + * `/Applications/SDLApp/MyApp.app/` + * - `parent`: the containing directory of the bundle. For example: + * `/Applications/SDLApp/` + * + * **Nintendo 3DS Specific Functionality**: This function returns "romfs" + * directory of the application as it is uncommon to store resources outside + * the executable. As such it is not a writable directory. + * + * The returned path is guaranteed to end with a path separator ('\' on + * Windows, '/' on most other platforms). + * + * The pointer returned is owned by the caller. Please call SDL_free() on the + * pointer when done with it. + * + * \returns an absolute path in UTF-8 encoding to the application data + * directory. NULL will be returned on error or when the platform + * doesn't implement this functionality, call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_GetPrefPath + */ +extern DECLSPEC char *SDLCALL SDL_GetBasePath(void); + +/** + * Get the user-and-app-specific path where files can be written. + * + * Get the "pref dir". This is meant to be where users can write personal + * files (preferences and save games, etc) that are specific to your + * application. This directory is unique per user, per application. + * + * This function will decide the appropriate location in the native + * filesystem, create the directory if necessary, and return a string of the + * absolute path to the directory in UTF-8 encoding. + * + * On Windows, the string might look like: + * + * `C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\` + * + * On Linux, the string might look like: + * + * `/home/bob/.local/share/My Program Name/` + * + * On Mac OS X, the string might look like: + * + * `/Users/bob/Library/Application Support/My Program Name/` + * + * You should assume the path returned by this function is the only safe place + * to write files (and that SDL_GetBasePath(), while it might be writable, or + * even the parent of the returned path, isn't where you should be writing + * things). + * + * Both the org and app strings may become part of a directory name, so please + * follow these rules: + * + * - Try to use the same org string (_including case-sensitivity_) for all + * your applications that use this function. + * - Always use a unique app string for each one, and make sure it never + * changes for an app once you've decided on it. + * - Unicode characters are legal, as long as it's UTF-8 encoded, but... + * - ...only use letters, numbers, and spaces. Avoid punctuation like "Game + * Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. + * + * The returned path is guaranteed to end with a path separator ('\' on + * Windows, '/' on most other platforms). + * + * The pointer returned is owned by the caller. Please call SDL_free() on the + * pointer when done with it. + * + * \param org the name of your organization + * \param app the name of your application + * \returns a UTF-8 string of the user directory in platform-dependent + * notation. NULL if there's a problem (creating directory failed, + * etc.). + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_GetBasePath + */ +extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_filesystem_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_gamecontroller.h b/Thirdparty/SDL2/include/SDL_gamecontroller.h new file mode 100644 index 0000000..140054d --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_gamecontroller.h @@ -0,0 +1,1074 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gamecontroller.h + * + * Include file for SDL game controller event handling + */ + +#ifndef SDL_gamecontroller_h_ +#define SDL_gamecontroller_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" +#include "SDL_sensor.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_gamecontroller.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_GAMECONTROLLER flag. This causes SDL to scan the system + * for game controllers, and load appropriate drivers. + * + * If you would like to receive controller updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/** + * The gamecontroller structure used to identify an SDL game controller + */ +struct _SDL_GameController; +typedef struct _SDL_GameController SDL_GameController; + +typedef enum +{ + SDL_CONTROLLER_TYPE_UNKNOWN = 0, + SDL_CONTROLLER_TYPE_XBOX360, + SDL_CONTROLLER_TYPE_XBOXONE, + SDL_CONTROLLER_TYPE_PS3, + SDL_CONTROLLER_TYPE_PS4, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO, + SDL_CONTROLLER_TYPE_VIRTUAL, + SDL_CONTROLLER_TYPE_PS5, + SDL_CONTROLLER_TYPE_AMAZON_LUNA, + SDL_CONTROLLER_TYPE_GOOGLE_STADIA, + SDL_CONTROLLER_TYPE_NVIDIA_SHIELD, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR +} SDL_GameControllerType; + +typedef enum +{ + SDL_CONTROLLER_BINDTYPE_NONE = 0, + SDL_CONTROLLER_BINDTYPE_BUTTON, + SDL_CONTROLLER_BINDTYPE_AXIS, + SDL_CONTROLLER_BINDTYPE_HAT +} SDL_GameControllerBindType; + +/** + * Get the SDL joystick layer binding for this controller button/axis mapping + */ +typedef struct SDL_GameControllerButtonBind +{ + SDL_GameControllerBindType bindType; + union + { + int button; + int axis; + struct { + int hat; + int hat_mask; + } hat; + } value; + +} SDL_GameControllerButtonBind; + + +/** + * To count the number of game controllers in the system for the following: + * + * ```c + * int nJoysticks = SDL_NumJoysticks(); + * int nGameControllers = 0; + * for (int i = 0; i < nJoysticks; i++) { + * if (SDL_IsGameController(i)) { + * nGameControllers++; + * } + * } + * ``` + * + * Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: + * guid,name,mappings + * + * Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones. + * Under Windows there is a reserved GUID of "xinput" that covers any XInput devices. + * The mapping format for joystick is: + * bX - a joystick button, index X + * hX.Y - hat X with value Y + * aX - axis X of the joystick + * Buttons can be used as a controller axis and vice versa. + * + * This string shows an example of a valid mapping for a controller + * + * ```c + * "03000000341a00003608000000000000,PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7", + * ``` + */ + +/** + * Load a set of Game Controller mappings from a seekable SDL data stream. + * + * You can call this function several times, if needed, to load different + * database files. + * + * If a new mapping is loaded for an already known controller GUID, the later + * version will overwrite the one currently loaded. + * + * Mappings not belonging to the current platform or with no platform field + * specified will be ignored (i.e. mappings for Linux will be ignored in + * Windows, etc). + * + * This function will load the text database entirely in memory before + * processing it, so take this into consideration if you are in a memory + * constrained environment. + * + * \param rw the data stream for the mappings to be added + * \param freerw non-zero to close the stream after being read + * \returns the number of mappings added or -1 on error; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GameControllerAddMapping + * \sa SDL_GameControllerAddMappingsFromFile + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw); + +/** + * Load a set of mappings from a file, filtered by the current SDL_GetPlatform() + * + * Convenience macro. + */ +#define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Add support for controllers that SDL is unaware of or to cause an existing + * controller to have a different binding. + * + * The mapping string has the format "GUID,name,mapping", where GUID is the + * string value from SDL_JoystickGetGUIDString(), name is the human readable + * string for the device and mappings are controller mappings to joystick + * ones. Under Windows there is a reserved GUID of "xinput" that covers all + * XInput devices. The mapping format for joystick is: {| |bX |a joystick + * button, index X |- |hX.Y |hat X with value Y |- |aX |axis X of the joystick + * |} Buttons can be used as a controller axes and vice versa. + * + * This string shows an example of a valid mapping for a controller: + * + * ```c + * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7" + * ``` + * + * \param mappingString the mapping string + * \returns 1 if a new mapping is added, 0 if an existing mapping is updated, + * -1 on error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerMapping + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString); + +/** + * Get the number of mappings installed. + * + * \returns the number of mappings. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void); + +/** + * Get the mapping at a particular index. + * + * \returns the mapping string. Must be freed with SDL_free(). Returns NULL if + * the index is out of range. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index); + +/** + * Get the game controller mapping string for a given GUID. + * + * The returned string must be freed with SDL_free(). + * + * \param guid a structure containing the GUID for which a mapping is desired + * \returns a mapping string or NULL on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUID + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid); + +/** + * Get the current mapping of a Game Controller. + * + * The returned string must be freed with SDL_free(). + * + * Details about mappings are discussed with SDL_GameControllerAddMapping(). + * + * \param gamecontroller the game controller you want to get the current + * mapping for + * \returns a string that has the controller's mapping or NULL if no mapping + * is available; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerAddMapping + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMapping(SDL_GameController *gamecontroller); + +/** + * Check if the given joystick is supported by the game controller interface. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, up to + * SDL_NumJoysticks() + * \returns SDL_TRUE if the given joystick is supported by the game controller + * interface, SDL_FALSE if it isn't or it's an invalid index. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerNameForIndex + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index); + +/** + * Get the implementation dependent name for the game controller. + * + * This function can be called before any controllers are opened. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the implementation-dependent name for the game controller, or NULL + * if there is no name or the index is invalid. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerName + * \sa SDL_GameControllerOpen + * \sa SDL_IsGameController + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index); + +/** + * Get the implementation dependent path for the game controller. + * + * This function can be called before any controllers are opened. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the implementation-dependent path for the game controller, or NULL + * if there is no path or the index is invalid. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GameControllerPath + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerPathForIndex(int joystick_index); + +/** + * Get the type of a game controller. + * + * This can be called before any controllers are opened. + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the controller type. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerTypeForIndex(int joystick_index); + +/** + * Get the mapping of a game controller. + * + * This can be called before any controllers are opened. + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the mapping string. Must be freed with SDL_free(). Returns NULL if + * no mapping is available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index); + +/** + * Open a game controller for use. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * The index passed as an argument refers to the N'th game controller on the + * system. This index is not the value which will identify this controller in + * future controller events. The joystick's instance id (SDL_JoystickID) will + * be used there instead. + * + * \param joystick_index the device_index of a device, up to + * SDL_NumJoysticks() + * \returns a gamecontroller identifier or NULL if an error occurred; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerClose + * \sa SDL_GameControllerNameForIndex + * \sa SDL_IsGameController + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); + +/** + * Get the SDL_GameController associated with an instance id. + * + * \param joyid the instance id to get the SDL_GameController for + * \returns an SDL_GameController on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid); + +/** + * Get the SDL_GameController associated with a player index. + * + * Please note that the player index is _not_ the device index, nor is it the + * instance id! + * + * \param player_index the player index, which is not the device index or the + * instance id! + * \returns the SDL_GameController associated with a player index. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_GameControllerGetPlayerIndex + * \sa SDL_GameControllerSetPlayerIndex + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromPlayerIndex(int player_index); + +/** + * Get the implementation-dependent name for an opened game controller. + * + * This is the same name as returned by SDL_GameControllerNameForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns the implementation dependent name for the game controller, or NULL + * if there is no name or the identifier passed is invalid. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerNameForIndex + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); + +/** + * Get the implementation-dependent path for an opened game controller. + * + * This is the same path as returned by SDL_GameControllerNameForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns the implementation dependent path for the game controller, or NULL + * if there is no path or the identifier passed is invalid. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GameControllerPathForIndex + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerPath(SDL_GameController *gamecontroller); + +/** + * Get the type of this currently opened controller + * + * This is the same name as returned by SDL_GameControllerTypeForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller the game controller object to query. + * \returns the controller type. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerGetType(SDL_GameController *gamecontroller); + +/** + * Get the player index of an opened game controller. + * + * For XInput controllers this returns the XInput user index. + * + * \param gamecontroller the game controller object to query. + * \returns the player index for controller, or -1 if it's not available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller); + +/** + * Set the player index of an opened game controller. + * + * \param gamecontroller the game controller object to adjust. + * \param player_index Player index to assign to this controller, or -1 to + * clear the player index and turn off player LEDs. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index); + +/** + * Get the USB vendor ID of an opened controller, if available. + * + * If the vendor ID isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB vendor ID, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController *gamecontroller); + +/** + * Get the USB product ID of an opened controller, if available. + * + * If the product ID isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB product ID, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController *gamecontroller); + +/** + * Get the product version of an opened controller, if available. + * + * If the product version isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB product version, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController *gamecontroller); + +/** + * Get the firmware version of an opened controller, if available. + * + * If the firmware version isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the controller firmware version, or zero if unavailable. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetFirmwareVersion(SDL_GameController *gamecontroller); + +/** + * Get the serial number of an opened controller, if available. + * + * Returns the serial number of the controller, or NULL if it is not + * available. + * + * \param gamecontroller the game controller object to query. + * \return the serial number, or NULL if unavailable. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC const char * SDLCALL SDL_GameControllerGetSerial(SDL_GameController *gamecontroller); + +/** + * Check if a controller has been opened and is currently connected. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns SDL_TRUE if the controller has been opened and is currently + * connected, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerClose + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller); + +/** + * Get the Joystick ID from a Game Controller. + * + * This function will give you a SDL_Joystick object, which allows you to use + * the SDL_Joystick functions with a SDL_GameController object. This would be + * useful for getting a joystick's position at any given time, even if it + * hasn't moved (moving it would produce an event, which would have the axis' + * value). + * + * The pointer returned is owned by the SDL_GameController. You should not + * call SDL_JoystickClose() on it, for example, since doing so will likely + * cause SDL to crash. + * + * \param gamecontroller the game controller object that you want to get a + * joystick from + * \returns a SDL_Joystick object; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller); + +/** + * Query or change current state of Game Controller events. + * + * If controller events are disabled, you must call SDL_GameControllerUpdate() + * yourself and check the state of the controller when you want controller + * information. + * + * Any number can be passed to SDL_GameControllerEventState(), but only -1, 0, + * and 1 will have any effect. Other numbers will just be returned. + * + * \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE` + * \returns the same value passed to the function, with exception to -1 + * (SDL_QUERY), which will return the current state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickEventState + */ +extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state); + +/** + * Manually pump game controller updates if not using the loop. + * + * This function is called automatically by the event loop if events are + * enabled. Under such circumstances, it will not be necessary to call this + * function. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void); + + +/** + * The list of axes available from a controller + * + * Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX, + * and are centered within ~8000 of zero, though advanced UI will allow users to set + * or autodetect the dead zone, which varies between controllers. + * + * Trigger axis values range from 0 to SDL_JOYSTICK_AXIS_MAX. + */ +typedef enum +{ + SDL_CONTROLLER_AXIS_INVALID = -1, + SDL_CONTROLLER_AXIS_LEFTX, + SDL_CONTROLLER_AXIS_LEFTY, + SDL_CONTROLLER_AXIS_RIGHTX, + SDL_CONTROLLER_AXIS_RIGHTY, + SDL_CONTROLLER_AXIS_TRIGGERLEFT, + SDL_CONTROLLER_AXIS_TRIGGERRIGHT, + SDL_CONTROLLER_AXIS_MAX +} SDL_GameControllerAxis; + +/** + * Convert a string into SDL_GameControllerAxis enum. + * + * This function is called internally to translate SDL_GameController mapping + * strings for the underlying joystick device into the consistent + * SDL_GameController mapping. You do not normally need to call this function + * unless you are parsing SDL_GameController mappings in your own code. + * + * Note specially that "righttrigger" and "lefttrigger" map to + * `SDL_CONTROLLER_AXIS_TRIGGERRIGHT` and `SDL_CONTROLLER_AXIS_TRIGGERLEFT`, + * respectively. + * + * \param str string representing a SDL_GameController axis + * \returns the SDL_GameControllerAxis enum corresponding to the input string, + * or `SDL_CONTROLLER_AXIS_INVALID` if no match was found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetStringForAxis + */ +extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *str); + +/** + * Convert from an SDL_GameControllerAxis enum to a string. + * + * The caller should not SDL_free() the returned string. + * + * \param axis an enum value for a given SDL_GameControllerAxis + * \returns a string for the given axis, or NULL if an invalid axis is + * specified. The string returned is of the format used by + * SDL_GameController mapping strings. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetAxisFromString + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis); + +/** + * Get the SDL joystick layer binding for a controller axis mapping. + * + * \param gamecontroller a game controller + * \param axis an axis enum value (one of the SDL_GameControllerAxis values) + * \returns a SDL_GameControllerButtonBind describing the bind. On failure + * (like the given Controller axis doesn't exist on the device), its + * `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetBindForButton + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * Query whether a game controller has a given axis. + * + * This merely reports whether the controller's mapping defined this axis, as + * that is all the information SDL has about the physical device. + * + * \param gamecontroller a game controller + * \param axis an axis enum value (an SDL_GameControllerAxis value) + * \returns SDL_TRUE if the controller has this axis, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL +SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + +/** + * Get the current state of an axis control on a game controller. + * + * The axis indices start at index 0. + * + * The state is a value ranging from -32768 to 32767. Triggers, however, range + * from 0 to 32767 (they never return a negative value). + * + * \param gamecontroller a game controller + * \param axis an axis index (one of the SDL_GameControllerAxis values) + * \returns axis state (including 0) on success or 0 (also) on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetButton + */ +extern DECLSPEC Sint16 SDLCALL +SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + +/** + * The list of buttons available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_BUTTON_INVALID = -1, + SDL_CONTROLLER_BUTTON_A, + SDL_CONTROLLER_BUTTON_B, + SDL_CONTROLLER_BUTTON_X, + SDL_CONTROLLER_BUTTON_Y, + SDL_CONTROLLER_BUTTON_BACK, + SDL_CONTROLLER_BUTTON_GUIDE, + SDL_CONTROLLER_BUTTON_START, + SDL_CONTROLLER_BUTTON_LEFTSTICK, + SDL_CONTROLLER_BUTTON_RIGHTSTICK, + SDL_CONTROLLER_BUTTON_LEFTSHOULDER, + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, + SDL_CONTROLLER_BUTTON_DPAD_UP, + SDL_CONTROLLER_BUTTON_DPAD_DOWN, + SDL_CONTROLLER_BUTTON_DPAD_LEFT, + SDL_CONTROLLER_BUTTON_DPAD_RIGHT, + SDL_CONTROLLER_BUTTON_MISC1, /* Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button */ + SDL_CONTROLLER_BUTTON_PADDLE1, /* Xbox Elite paddle P1 (upper left, facing the back) */ + SDL_CONTROLLER_BUTTON_PADDLE2, /* Xbox Elite paddle P3 (upper right, facing the back) */ + SDL_CONTROLLER_BUTTON_PADDLE3, /* Xbox Elite paddle P2 (lower left, facing the back) */ + SDL_CONTROLLER_BUTTON_PADDLE4, /* Xbox Elite paddle P4 (lower right, facing the back) */ + SDL_CONTROLLER_BUTTON_TOUCHPAD, /* PS4/PS5 touchpad button */ + SDL_CONTROLLER_BUTTON_MAX +} SDL_GameControllerButton; + +/** + * Convert a string into an SDL_GameControllerButton enum. + * + * This function is called internally to translate SDL_GameController mapping + * strings for the underlying joystick device into the consistent + * SDL_GameController mapping. You do not normally need to call this function + * unless you are parsing SDL_GameController mappings in your own code. + * + * \param str string representing a SDL_GameController axis + * \returns the SDL_GameControllerButton enum corresponding to the input + * string, or `SDL_CONTROLLER_AXIS_INVALID` if no match was found. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *str); + +/** + * Convert from an SDL_GameControllerButton enum to a string. + * + * The caller should not SDL_free() the returned string. + * + * \param button an enum value for a given SDL_GameControllerButton + * \returns a string for the given button, or NULL if an invalid button is + * specified. The string returned is of the format used by + * SDL_GameController mapping strings. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetButtonFromString + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button); + +/** + * Get the SDL joystick layer binding for a controller button mapping. + * + * \param gamecontroller a game controller + * \param button an button enum value (an SDL_GameControllerButton value) + * \returns a SDL_GameControllerButtonBind describing the bind. On failure + * (like the given Controller button doesn't exist on the device), + * its `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetBindForAxis + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Query whether a game controller has a given button. + * + * This merely reports whether the controller's mapping defined this button, + * as that is all the information SDL has about the physical device. + * + * \param gamecontroller a game controller + * \param button a button enum value (an SDL_GameControllerButton value) + * \returns SDL_TRUE if the controller has this button, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Get the current state of a button on a game controller. + * + * \param gamecontroller a game controller + * \param button a button index (one of the SDL_GameControllerButton values) + * \returns 1 for pressed state or 0 for not pressed state or error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetAxis + */ +extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Get the number of touchpads on a game controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpads(SDL_GameController *gamecontroller); + +/** + * Get the number of supported simultaneous fingers on a touchpad on a game + * controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpadFingers(SDL_GameController *gamecontroller, int touchpad); + +/** + * Get the current state of a finger on a touchpad on a game controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetTouchpadFinger(SDL_GameController *gamecontroller, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure); + +/** + * Return whether a game controller has a particular sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasSensor(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Set whether data reporting for a game controller sensor is enabled. + * + * \param gamecontroller The controller to update + * \param type The type of sensor to enable/disable + * \param enabled Whether data reporting should be enabled + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSetSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type, SDL_bool enabled); + +/** + * Query whether sensor data reporting is enabled for a game controller. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerIsSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Get the data rate (number of events per second) of a game controller + * sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \return the data rate, or 0.0f if the data rate is not available. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC float SDLCALL SDL_GameControllerGetSensorDataRate(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Get the current state of a game controller sensor. + * + * The number of values and interpretation of the data is sensor dependent. + * See SDL_sensor.h for the details for each type of sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \return 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorData(SDL_GameController *gamecontroller, SDL_SensorType type, float *data, int num_values); + +/** + * Get the current state of a game controller sensor with the timestamp of the + * last update. + * + * The number of values and interpretation of the data is sensor dependent. + * See SDL_sensor.h for the details for each type of sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \param timestamp A pointer filled with the timestamp in microseconds of the + * current sensor reading if available, or 0 if not + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \return 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.26.0. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorDataWithTimestamp(SDL_GameController *gamecontroller, SDL_SensorType type, Uint64 *timestamp, float *data, int num_values); + +/** + * Start a rumble effect on a game controller. + * + * Each call to this function cancels any previous rumble effect, and calling + * it with 0 intensity stops any rumbling. + * + * \param gamecontroller The controller to vibrate + * \param low_frequency_rumble The intensity of the low frequency (left) + * rumble motor, from 0 to 0xFFFF + * \param high_frequency_rumble The intensity of the high frequency (right) + * rumble motor, from 0 to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if rumble isn't supported on this controller + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_GameControllerHasRumble + */ +extern DECLSPEC int SDLCALL SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); + +/** + * Start a rumble effect in the game controller's triggers. + * + * Each call to this function cancels any previous trigger rumble effect, and + * calling it with 0 intensity stops any rumbling. + * + * Note that this is rumbling of the _triggers_ and not the game controller as + * a whole. This is currently only supported on Xbox One controllers. If you + * want the (more common) whole-controller rumble, use + * SDL_GameControllerRumble() instead. + * + * \param gamecontroller The controller to vibrate + * \param left_rumble The intensity of the left trigger rumble motor, from 0 + * to 0xFFFF + * \param right_rumble The intensity of the right trigger rumble motor, from 0 + * to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if trigger rumble isn't supported on this controller + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GameControllerHasRumbleTriggers + */ +extern DECLSPEC int SDLCALL SDL_GameControllerRumbleTriggers(SDL_GameController *gamecontroller, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); + +/** + * Query whether a game controller has an LED. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have a + * modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasLED(SDL_GameController *gamecontroller); + +/** + * Query whether a game controller has rumble support. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have rumble + * support + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerRumble + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasRumble(SDL_GameController *gamecontroller); + +/** + * Query whether a game controller has rumble support on triggers. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have trigger + * rumble support + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerRumbleTriggers + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasRumbleTriggers(SDL_GameController *gamecontroller); + +/** + * Update a game controller's LED color. + * + * \param gamecontroller The controller to update + * \param red The intensity of the red LED + * \param green The intensity of the green LED + * \param blue The intensity of the blue LED + * \returns 0, or -1 if this controller does not have a modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSetLED(SDL_GameController *gamecontroller, Uint8 red, Uint8 green, Uint8 blue); + +/** + * Send a controller specific effect packet + * + * \param gamecontroller The controller to affect + * \param data The data to send to the controller + * \param size The size of the data to send to the controller + * \returns 0, or -1 if this controller or driver doesn't support effect + * packets + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSendEffect(SDL_GameController *gamecontroller, const void *data, int size); + +/** + * Close a game controller previously opened with SDL_GameControllerOpen(). + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller); + +/** + * Return the sfSymbolsName for a given button on a game controller on Apple + * platforms. + * + * \param gamecontroller the controller to query + * \param button a button on the game controller + * \returns the sfSymbolsName or NULL if the name can't be found + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerGetAppleSFSymbolsNameForAxis + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button); + +/** + * Return the sfSymbolsName for a given axis on a game controller on Apple + * platforms. + * + * \param gamecontroller the controller to query + * \param axis an axis on the game controller + * \returns the sfSymbolsName or NULL if the name can't be found + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerGetAppleSFSymbolsNameForButton + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_gamecontroller_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_gesture.h b/Thirdparty/SDL2/include/SDL_gesture.h new file mode 100644 index 0000000..db70b4d --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_gesture.h @@ -0,0 +1,117 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_gesture.h + * + * Include file for SDL gesture event handling. + */ + +#ifndef SDL_gesture_h_ +#define SDL_gesture_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "SDL_touch.h" + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_GestureID; + +/* Function prototypes */ + +/** + * Begin recording a gesture on a specified touch device or all touch devices. + * + * If the parameter `touchId` is -1 (i.e., all devices), this function will + * always return 1, regardless of whether there actually are any devices. + * + * \param touchId the touch device id, or -1 for all touch devices + * \returns 1 on success or 0 if the specified device could not be found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchDevice + */ +extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId); + + +/** + * Save all currently loaded Dollar Gesture templates. + * + * \param dst a SDL_RWops to save to + * \returns the number of saved templates on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadDollarTemplates + * \sa SDL_SaveDollarTemplate + */ +extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst); + +/** + * Save a currently loaded Dollar Gesture template. + * + * \param gestureId a gesture id + * \param dst a SDL_RWops to save to + * \returns 1 on success or 0 on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadDollarTemplates + * \sa SDL_SaveAllDollarTemplates + */ +extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst); + + +/** + * Load Dollar Gesture templates from a file. + * + * \param touchId a touch id + * \param src a SDL_RWops to load from + * \returns the number of loaded templates on success or a negative error code + * (or 0) on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SaveAllDollarTemplates + * \sa SDL_SaveDollarTemplate + */ +extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_gesture_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_guid.h b/Thirdparty/SDL2/include/SDL_guid.h new file mode 100644 index 0000000..d964223 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_guid.h @@ -0,0 +1,100 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_guid.h + * + * Include file for handling ::SDL_GUID values. + */ + +#ifndef SDL_guid_h_ +#define SDL_guid_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An SDL_GUID is a 128-bit identifier for an input device that + * identifies that device across runs of SDL programs on the same + * platform. If the device is detached and then re-attached to a + * different port, or if the base system is rebooted, the device + * should still report the same GUID. + * + * GUIDs are as precise as possible but are not guaranteed to + * distinguish physically distinct but equivalent devices. For + * example, two game controllers from the same vendor with the same + * product ID and revision may have the same GUID. + * + * GUIDs may be platform-dependent (i.e., the same device may report + * different GUIDs on different operating systems). + */ +typedef struct { + Uint8 data[16]; +} SDL_GUID; + +/* Function prototypes */ + +/** + * Get an ASCII string representation for a given ::SDL_GUID. + * + * You should supply at least 33 bytes for pszGUID. + * + * \param guid the ::SDL_GUID you wish to convert to string + * \param pszGUID buffer in which to write the ASCII string + * \param cbGUID the size of pszGUID + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GUIDFromString + */ +extern DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID); + +/** + * Convert a GUID string into a ::SDL_GUID structure. + * + * Performs no error checking. If this function is given a string containing + * an invalid GUID, the function will silently succeed, but the GUID generated + * will not be useful. + * + * \param pchGUID string containing an ASCII representation of a GUID + * \returns a ::SDL_GUID structure. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GUIDToString + */ +extern DECLSPEC SDL_GUID SDLCALL SDL_GUIDFromString(const char *pchGUID); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_guid_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_haptic.h b/Thirdparty/SDL2/include/SDL_haptic.h new file mode 100644 index 0000000..2462a1e --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_haptic.h @@ -0,0 +1,1341 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_haptic.h + * + * \brief The SDL haptic subsystem allows you to control haptic (force feedback) + * devices. + * + * The basic usage is as follows: + * - Initialize the subsystem (::SDL_INIT_HAPTIC). + * - Open a haptic device. + * - SDL_HapticOpen() to open from index. + * - SDL_HapticOpenFromJoystick() to open from an existing joystick. + * - Create an effect (::SDL_HapticEffect). + * - Upload the effect with SDL_HapticNewEffect(). + * - Run the effect with SDL_HapticRunEffect(). + * - (optional) Free the effect with SDL_HapticDestroyEffect(). + * - Close the haptic device with SDL_HapticClose(). + * + * \par Simple rumble example: + * \code + * SDL_Haptic *haptic; + * + * // Open the device + * haptic = SDL_HapticOpen( 0 ); + * if (haptic == NULL) + * return -1; + * + * // Initialize simple rumble + * if (SDL_HapticRumbleInit( haptic ) != 0) + * return -1; + * + * // Play effect at 50% strength for 2 seconds + * if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0) + * return -1; + * SDL_Delay( 2000 ); + * + * // Clean up + * SDL_HapticClose( haptic ); + * \endcode + * + * \par Complete example: + * \code + * int test_haptic( SDL_Joystick * joystick ) { + * SDL_Haptic *haptic; + * SDL_HapticEffect effect; + * int effect_id; + * + * // Open the device + * haptic = SDL_HapticOpenFromJoystick( joystick ); + * if (haptic == NULL) return -1; // Most likely joystick isn't haptic + * + * // See if it can do sine waves + * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) { + * SDL_HapticClose(haptic); // No sine effect + * return -1; + * } + * + * // Create the effect + * SDL_memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default + * effect.type = SDL_HAPTIC_SINE; + * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates + * effect.periodic.direction.dir[0] = 18000; // Force comes from south + * effect.periodic.period = 1000; // 1000 ms + * effect.periodic.magnitude = 20000; // 20000/32767 strength + * effect.periodic.length = 5000; // 5 seconds long + * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength + * effect.periodic.fade_length = 1000; // Takes 1 second to fade away + * + * // Upload the effect + * effect_id = SDL_HapticNewEffect( haptic, &effect ); + * + * // Test the effect + * SDL_HapticRunEffect( haptic, effect_id, 1 ); + * SDL_Delay( 5000); // Wait for the effect to finish + * + * // We destroy the effect, although closing the device also does this + * SDL_HapticDestroyEffect( haptic, effect_id ); + * + * // Close the device + * SDL_HapticClose(haptic); + * + * return 0; // Success + * } + * \endcode + */ + +#ifndef SDL_haptic_h_ +#define SDL_haptic_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* FIXME: For SDL 2.1, adjust all the magnitude variables to be Uint16 (0xFFFF). + * + * At the moment the magnitude variables are mixed between signed/unsigned, and + * it is also not made clear that ALL of those variables expect a max of 0x7FFF. + * + * Some platforms may have higher precision than that (Linux FF, Windows XInput) + * so we should fix the inconsistency in favor of higher possible precision, + * adjusting for platforms that use different scales. + * -flibit + */ + +/** + * \typedef SDL_Haptic + * + * \brief The haptic structure used to identify an SDL haptic. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + */ +struct _SDL_Haptic; +typedef struct _SDL_Haptic SDL_Haptic; + + +/** + * \name Haptic features + * + * Different haptic features a device can have. + */ +/* @{ */ + +/** + * \name Haptic effects + */ +/* @{ */ + +/** + * \brief Constant effect supported. + * + * Constant haptic effect. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_CONSTANT (1u<<0) + +/** + * \brief Sine wave effect supported. + * + * Periodic haptic effect that simulates sine waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SINE (1u<<1) + +/** + * \brief Left/Right effect supported. + * + * Haptic effect for direct control over high/low frequency motors. + * + * \sa SDL_HapticLeftRight + * \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry, + * we ran out of bits, and this is important for XInput devices. + */ +#define SDL_HAPTIC_LEFTRIGHT (1u<<2) + +/* !!! FIXME: put this back when we have more bits in 2.1 */ +/* #define SDL_HAPTIC_SQUARE (1<<2) */ + +/** + * \brief Triangle wave effect supported. + * + * Periodic haptic effect that simulates triangular waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_TRIANGLE (1u<<3) + +/** + * \brief Sawtoothup wave effect supported. + * + * Periodic haptic effect that simulates saw tooth up waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHUP (1u<<4) + +/** + * \brief Sawtoothdown wave effect supported. + * + * Periodic haptic effect that simulates saw tooth down waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHDOWN (1u<<5) + +/** + * \brief Ramp effect supported. + * + * Ramp haptic effect. + * + * \sa SDL_HapticRamp + */ +#define SDL_HAPTIC_RAMP (1u<<6) + +/** + * \brief Spring effect supported - uses axes position. + * + * Condition haptic effect that simulates a spring. Effect is based on the + * axes position. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_SPRING (1u<<7) + +/** + * \brief Damper effect supported - uses axes velocity. + * + * Condition haptic effect that simulates dampening. Effect is based on the + * axes velocity. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_DAMPER (1u<<8) + +/** + * \brief Inertia effect supported - uses axes acceleration. + * + * Condition haptic effect that simulates inertia. Effect is based on the axes + * acceleration. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_INERTIA (1u<<9) + +/** + * \brief Friction effect supported - uses axes movement. + * + * Condition haptic effect that simulates friction. Effect is based on the + * axes movement. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_FRICTION (1u<<10) + +/** + * \brief Custom effect is supported. + * + * User defined custom haptic effect. + */ +#define SDL_HAPTIC_CUSTOM (1u<<11) + +/* @} *//* Haptic effects */ + +/* These last few are features the device has, not effects */ + +/** + * \brief Device can set global gain. + * + * Device supports setting the global gain. + * + * \sa SDL_HapticSetGain + */ +#define SDL_HAPTIC_GAIN (1u<<12) + +/** + * \brief Device can set autocenter. + * + * Device supports setting autocenter. + * + * \sa SDL_HapticSetAutocenter + */ +#define SDL_HAPTIC_AUTOCENTER (1u<<13) + +/** + * \brief Device can be queried for effect status. + * + * Device supports querying effect status. + * + * \sa SDL_HapticGetEffectStatus + */ +#define SDL_HAPTIC_STATUS (1u<<14) + +/** + * \brief Device can be paused. + * + * Devices supports being paused. + * + * \sa SDL_HapticPause + * \sa SDL_HapticUnpause + */ +#define SDL_HAPTIC_PAUSE (1u<<15) + + +/** + * \name Direction encodings + */ +/* @{ */ + +/** + * \brief Uses polar coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_POLAR 0 + +/** + * \brief Uses cartesian coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_CARTESIAN 1 + +/** + * \brief Uses spherical coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_SPHERICAL 2 + +/** + * \brief Use this value to play an effect on the steering wheel axis. This + * provides better compatibility across platforms and devices as SDL will guess + * the correct axis. + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_STEERING_AXIS 3 + +/* @} *//* Direction encodings */ + +/* @} *//* Haptic features */ + +/* + * Misc defines. + */ + +/** + * \brief Used to play a device an infinite number of times. + * + * \sa SDL_HapticRunEffect + */ +#define SDL_HAPTIC_INFINITY 4294967295U + + +/** + * \brief Structure that represents a haptic direction. + * + * This is the direction where the force comes from, + * instead of the direction in which the force is exerted. + * + * Directions can be specified by: + * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates. + * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. + * - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. + * + * Cardinal directions of the haptic device are relative to the positioning + * of the device. North is considered to be away from the user. + * + * The following diagram represents the cardinal directions: + * \verbatim + .--. + |__| .-------. + |=.| |.-----.| + |--| || || + | | |'-----'| + |__|~')_____(' + [ COMPUTER ] + + + North (0,-1) + ^ + | + | + (-1,0) West <----[ HAPTIC ]----> East (1,0) + | + | + v + South (0,1) + + + [ USER ] + \|||/ + (o o) + ---ooO-(_)-Ooo--- + \endverbatim + * + * If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a + * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses + * the first \c dir parameter. The cardinal directions would be: + * - North: 0 (0 degrees) + * - East: 9000 (90 degrees) + * - South: 18000 (180 degrees) + * - West: 27000 (270 degrees) + * + * If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions + * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses + * the first three \c dir parameters. The cardinal directions would be: + * - North: 0,-1, 0 + * - East: 1, 0, 0 + * - South: 0, 1, 0 + * - West: -1, 0, 0 + * + * The Z axis represents the height of the effect if supported, otherwise + * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you + * can use any multiple you want, only the direction matters. + * + * If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. + * The first two \c dir parameters are used. The \c dir parameters are as + * follows (all values are in hundredths of degrees): + * - Degrees from (1, 0) rotated towards (0, 1). + * - Degrees towards (0, 0, 1) (device needs at least 3 axes). + * + * + * Example of force coming from the south with all encodings (force coming + * from the south means the user will have to pull the stick to counteract): + * \code + * SDL_HapticDirection direction; + * + * // Cartesian directions + * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. + * direction.dir[0] = 0; // X position + * direction.dir[1] = 1; // Y position + * // Assuming the device has 2 axes, we don't need to specify third parameter. + * + * // Polar directions + * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. + * direction.dir[0] = 18000; // Polar only uses first parameter + * + * // Spherical coordinates + * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding + * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. + * \endcode + * + * \sa SDL_HAPTIC_POLAR + * \sa SDL_HAPTIC_CARTESIAN + * \sa SDL_HAPTIC_SPHERICAL + * \sa SDL_HAPTIC_STEERING_AXIS + * \sa SDL_HapticEffect + * \sa SDL_HapticNumAxes + */ +typedef struct SDL_HapticDirection +{ + Uint8 type; /**< The type of encoding. */ + Sint32 dir[3]; /**< The encoded direction. */ +} SDL_HapticDirection; + + +/** + * \brief A structure containing a template for a Constant effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_CONSTANT effect. + * + * A constant effect applies a constant force in the specified direction + * to the joystick. + * + * \sa SDL_HAPTIC_CONSTANT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticConstant +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CONSTANT */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Constant */ + Sint16 level; /**< Strength of the constant effect. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticConstant; + +/** + * \brief A structure containing a template for a Periodic effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SINE + * - ::SDL_HAPTIC_LEFTRIGHT + * - ::SDL_HAPTIC_TRIANGLE + * - ::SDL_HAPTIC_SAWTOOTHUP + * - ::SDL_HAPTIC_SAWTOOTHDOWN + * + * A periodic effect consists in a wave-shaped effect that repeats itself + * over time. The type determines the shape of the wave and the parameters + * determine the dimensions of the wave. + * + * Phase is given by hundredth of a degree meaning that giving the phase a value + * of 9000 will displace it 25% of its period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of its period. + * - 18000: Displaced 50% of its period. + * - 27000: Displaced 75% of its period. + * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred. + * + * Examples: + * \verbatim + SDL_HAPTIC_SINE + __ __ __ __ + / \ / \ / \ / + / \__/ \__/ \__/ + + SDL_HAPTIC_SQUARE + __ __ __ __ __ + | | | | | | | | | | + | |__| |__| |__| |__| | + + SDL_HAPTIC_TRIANGLE + /\ /\ /\ /\ /\ + / \ / \ / \ / \ / + / \/ \/ \/ \/ + + SDL_HAPTIC_SAWTOOTHUP + /| /| /| /| /| /| /| + / | / | / | / | / | / | / | + / |/ |/ |/ |/ |/ |/ | + + SDL_HAPTIC_SAWTOOTHDOWN + \ |\ |\ |\ |\ |\ |\ | + \ | \ | \ | \ | \ | \ | \ | + \| \| \| \| \| \| \| + \endverbatim + * + * \sa SDL_HAPTIC_SINE + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HAPTIC_TRIANGLE + * \sa SDL_HAPTIC_SAWTOOTHUP + * \sa SDL_HAPTIC_SAWTOOTHDOWN + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticPeriodic +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_LEFTRIGHT, + ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or + ::SDL_HAPTIC_SAWTOOTHDOWN */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Periodic */ + Uint16 period; /**< Period of the wave. */ + Sint16 magnitude; /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */ + Sint16 offset; /**< Mean value of the wave. */ + Uint16 phase; /**< Positive phase shift given by hundredth of a degree. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticPeriodic; + +/** + * \brief A structure containing a template for a Condition effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SPRING: Effect based on axes position. + * - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity. + * - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration. + * - ::SDL_HAPTIC_FRICTION: Effect based on axes movement. + * + * Direction is handled by condition internals instead of a direction member. + * The condition effect specific members have three parameters. The first + * refers to the X axis, the second refers to the Y axis and the third + * refers to the Z axis. The right terms refer to the positive side of the + * axis and the left terms refer to the negative side of the axis. Please + * refer to the ::SDL_HapticDirection diagram for which side is positive and + * which is negative. + * + * \sa SDL_HapticDirection + * \sa SDL_HAPTIC_SPRING + * \sa SDL_HAPTIC_DAMPER + * \sa SDL_HAPTIC_INERTIA + * \sa SDL_HAPTIC_FRICTION + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCondition +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER, + ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */ + SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Condition */ + Uint16 right_sat[3]; /**< Level when joystick is to the positive side; max 0xFFFF. */ + Uint16 left_sat[3]; /**< Level when joystick is to the negative side; max 0xFFFF. */ + Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ + Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ + Uint16 deadband[3]; /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */ + Sint16 center[3]; /**< Position of the dead zone. */ +} SDL_HapticCondition; + +/** + * \brief A structure containing a template for a Ramp effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect. + * + * The ramp effect starts at start strength and ends at end strength. + * It augments in linear fashion. If you use attack and fade with a ramp + * the effects get added to the ramp effect making the effect become + * quadratic instead of linear. + * + * \sa SDL_HAPTIC_RAMP + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticRamp +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_RAMP */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Ramp */ + Sint16 start; /**< Beginning strength level. */ + Sint16 end; /**< Ending strength level. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticRamp; + +/** + * \brief A structure containing a template for a Left/Right effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_LEFTRIGHT effect. + * + * The Left/Right effect is used to explicitly control the large and small + * motors, commonly found in modern game controllers. The small (right) motor + * is high frequency, and the large (left) motor is low frequency. + * + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticLeftRight +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_LEFTRIGHT */ + + /* Replay */ + Uint32 length; /**< Duration of the effect in milliseconds. */ + + /* Rumble */ + Uint16 large_magnitude; /**< Control of the large controller motor. */ + Uint16 small_magnitude; /**< Control of the small controller motor. */ +} SDL_HapticLeftRight; + +/** + * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_CUSTOM effect. + * + * A custom force feedback effect is much like a periodic effect, where the + * application can define its exact shape. You will have to allocate the + * data yourself. Data should consist of channels * samples Uint16 samples. + * + * If channels is one, the effect is rotated using the defined direction. + * Otherwise it uses the samples in data for the different axes. + * + * \sa SDL_HAPTIC_CUSTOM + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCustom +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CUSTOM */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Custom */ + Uint8 channels; /**< Axes to use, minimum of one. */ + Uint16 period; /**< Sample periods. */ + Uint16 samples; /**< Amount of samples. */ + Uint16 *data; /**< Should contain channels*samples items. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticCustom; + +/** + * \brief The generic template for any haptic effect. + * + * All values max at 32767 (0x7FFF). Signed values also can be negative. + * Time values unless specified otherwise are in milliseconds. + * + * You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767 + * value. Neither delay, interval, attack_length nor fade_length support + * ::SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. + * + * Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of + * ::SDL_HAPTIC_INFINITY. + * + * Button triggers may not be supported on all devices, it is advised to not + * use them if possible. Buttons start at index 1 instead of index 0 like + * the joystick. + * + * If both attack_length and fade_level are 0, the envelope is not used, + * otherwise both values are used. + * + * Common parts: + * \code + * // Replay - All effects have this + * Uint32 length; // Duration of effect (ms). + * Uint16 delay; // Delay before starting effect. + * + * // Trigger - All effects have this + * Uint16 button; // Button that triggers effect. + * Uint16 interval; // How soon before effect can be triggered again. + * + * // Envelope - All effects except condition effects have this + * Uint16 attack_length; // Duration of the attack (ms). + * Uint16 attack_level; // Level at the start of the attack. + * Uint16 fade_length; // Duration of the fade out (ms). + * Uint16 fade_level; // Level at the end of the fade. + * \endcode + * + * + * Here we have an example of a constant effect evolution in time: + * \verbatim + Strength + ^ + | + | effect level --> _________________ + | / \ + | / \ + | / \ + | / \ + | attack_level --> | \ + | | | <--- fade_level + | + +--------------------------------------------------> Time + [--] [---] + attack_length fade_length + + [------------------][-----------------------] + delay length + \endverbatim + * + * Note either the attack_level or the fade_level may be above the actual + * effect level. + * + * \sa SDL_HapticConstant + * \sa SDL_HapticPeriodic + * \sa SDL_HapticCondition + * \sa SDL_HapticRamp + * \sa SDL_HapticLeftRight + * \sa SDL_HapticCustom + */ +typedef union SDL_HapticEffect +{ + /* Common for all force feedback effects */ + Uint16 type; /**< Effect type. */ + SDL_HapticConstant constant; /**< Constant effect. */ + SDL_HapticPeriodic periodic; /**< Periodic effect. */ + SDL_HapticCondition condition; /**< Condition effect. */ + SDL_HapticRamp ramp; /**< Ramp effect. */ + SDL_HapticLeftRight leftright; /**< Left/Right effect. */ + SDL_HapticCustom custom; /**< Custom effect. */ +} SDL_HapticEffect; + + +/* Function prototypes */ + +/** + * Count the number of haptic devices attached to the system. + * + * \returns the number of haptic devices detected on the system or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticName + */ +extern DECLSPEC int SDLCALL SDL_NumHaptics(void); + +/** + * Get the implementation dependent name of a haptic device. + * + * This can be called before any joysticks are opened. If no name can be + * found, this function returns NULL. + * + * \param device_index index of the device to query. + * \returns the name of the device or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_NumHaptics + */ +extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); + +/** + * Open a haptic device for use. + * + * The index passed as an argument refers to the N'th haptic device on this + * system. + * + * When opening a haptic device, its gain will be set to maximum and + * autocenter will be disabled. To modify these values use SDL_HapticSetGain() + * and SDL_HapticSetAutocenter(). + * + * \param device_index index of the device to open + * \returns the device identifier or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticClose + * \sa SDL_HapticIndex + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticOpenFromMouse + * \sa SDL_HapticPause + * \sa SDL_HapticSetAutocenter + * \sa SDL_HapticSetGain + * \sa SDL_HapticStopAll + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); + +/** + * Check if the haptic device at the designated index has been opened. + * + * \param device_index the index of the device to query + * \returns 1 if it has been opened, 0 if it hasn't or on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticIndex + * \sa SDL_HapticOpen + */ +extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); + +/** + * Get the index of a haptic device. + * + * \param haptic the SDL_Haptic device to query + * \returns the index of the specified haptic device or a negative error code + * on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpened + */ +extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); + +/** + * Query whether or not the current mouse has haptic capabilities. + * + * \returns SDL_TRUE if the mouse is haptic or SDL_FALSE if it isn't. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpenFromMouse + */ +extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); + +/** + * Try to open a haptic device from the current mouse. + * + * \returns the haptic device identifier or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_MouseIsHaptic + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); + +/** + * Query if a joystick has haptic features. + * + * \param joystick the SDL_Joystick to test for haptic capabilities + * \returns SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpenFromJoystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); + +/** + * Open a haptic device for use from a joystick device. + * + * You must still close the haptic device separately. It will not be closed + * with the joystick. + * + * When opened from a joystick you should first close the haptic device before + * closing the joystick device. If not, on some implementations the haptic + * device will also get unallocated and you'll be unable to use force feedback + * on that device. + * + * \param joystick the SDL_Joystick to create a haptic device from + * \returns a valid haptic device identifier on success or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticClose + * \sa SDL_HapticOpen + * \sa SDL_JoystickIsHaptic + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * + joystick); + +/** + * Close a haptic device previously opened with SDL_HapticOpen(). + * + * \param haptic the SDL_Haptic device to close + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + */ +extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); + +/** + * Get the number of effects a haptic device can store. + * + * On some platforms this isn't fully supported, and therefore is an + * approximation. Always check to see if your created effect was actually + * created and do not rely solely on SDL_HapticNumEffects(). + * + * \param haptic the SDL_Haptic device to query + * \returns the number of effects the haptic device can store or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNumEffectsPlaying + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); + +/** + * Get the number of effects a haptic device can play at the same time. + * + * This is not supported on all platforms, but will always return a value. + * + * \param haptic the SDL_Haptic device to query maximum playing effects + * \returns the number of effects the haptic device can play at the same time + * or a negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); + +/** + * Get the haptic device's supported features in bitwise manner. + * + * \param haptic the SDL_Haptic device to query + * \returns a list of supported haptic features in bitwise manner (OR'd), or 0 + * on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticEffectSupported + * \sa SDL_HapticNumEffects + */ +extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); + + +/** + * Get the number of haptic axes the device has. + * + * The number of haptic axes might be useful if working with the + * SDL_HapticDirection effect. + * + * \param haptic the SDL_Haptic device to query + * \returns the number of axes on success or a negative error code on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); + +/** + * Check to see if an effect is supported by a haptic device. + * + * \param haptic the SDL_Haptic device to query + * \param effect the desired effect to query + * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNewEffect + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, + SDL_HapticEffect * + effect); + +/** + * Create a new haptic effect on a specified device. + * + * \param haptic an SDL_Haptic device to create the effect on + * \param effect an SDL_HapticEffect structure containing the properties of + * the effect to create + * \returns the ID of the effect on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticUpdateEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, + SDL_HapticEffect * effect); + +/** + * Update the properties of an effect. + * + * Can be used dynamically, although behavior when dynamically changing + * direction may be strange. Specifically the effect may re-upload itself and + * start playing from the start. You also cannot change the type either when + * running SDL_HapticUpdateEffect(). + * + * \param haptic the SDL_Haptic device that has the effect + * \param effect the identifier of the effect to update + * \param data an SDL_HapticEffect structure containing the new effect + * properties to use + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticNewEffect + * \sa SDL_HapticRunEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, + int effect, + SDL_HapticEffect * data); + +/** + * Run the haptic effect on its associated haptic device. + * + * To repeat the effect over and over indefinitely, set `iterations` to + * `SDL_HAPTIC_INFINITY`. (Repeats the envelope - attack and fade.) To make + * one instance of the effect last indefinitely (so the effect does not fade), + * set the effect's `length` in its structure/union to `SDL_HAPTIC_INFINITY` + * instead. + * + * \param haptic the SDL_Haptic device to run the effect on + * \param effect the ID of the haptic effect to run + * \param iterations the number of iterations to run the effect; use + * `SDL_HAPTIC_INFINITY` to repeat forever + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticGetEffectStatus + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, + int effect, + Uint32 iterations); + +/** + * Stop the haptic effect on its associated haptic device. + * + * * + * + * \param haptic the SDL_Haptic device to stop the effect on + * \param effect the ID of the haptic effect to stop + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticRunEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, + int effect); + +/** + * Destroy a haptic effect on the device. + * + * This will stop the effect if it's running. Effects are automatically + * destroyed when the device is closed. + * + * \param haptic the SDL_Haptic device to destroy the effect on + * \param effect the ID of the haptic effect to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic, + int effect); + +/** + * Get the status of the current effect on the specified haptic device. + * + * Device must support the SDL_HAPTIC_STATUS feature. + * + * \param haptic the SDL_Haptic device to query for the effect status on + * \param effect the ID of the haptic effect to query its status + * \returns 0 if it isn't playing, 1 if it is playing, or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic, + int effect); + +/** + * Set the global gain of the specified haptic device. + * + * Device must support the SDL_HAPTIC_GAIN feature. + * + * The user may specify the maximum gain by setting the environment variable + * `SDL_HAPTIC_GAIN_MAX` which should be between 0 and 100. All calls to + * SDL_HapticSetGain() will scale linearly using `SDL_HAPTIC_GAIN_MAX` as the + * maximum. + * + * \param haptic the SDL_Haptic device to set the gain on + * \param gain value to set the gain to, should be between 0 and 100 (0 - 100) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); + +/** + * Set the global autocenter of the device. + * + * Autocenter should be between 0 and 100. Setting it to 0 will disable + * autocentering. + * + * Device must support the SDL_HAPTIC_AUTOCENTER feature. + * + * \param haptic the SDL_Haptic device to set autocentering on + * \param autocenter value to set autocenter to (0-100) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic, + int autocenter); + +/** + * Pause a haptic device. + * + * Device must support the `SDL_HAPTIC_PAUSE` feature. Call + * SDL_HapticUnpause() to resume playback. + * + * Do not modify the effects nor add new ones while the device is paused. That + * can cause all sorts of weird errors. + * + * \param haptic the SDL_Haptic device to pause + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticUnpause + */ +extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); + +/** + * Unpause a haptic device. + * + * Call to unpause after SDL_HapticPause(). + * + * \param haptic the SDL_Haptic device to unpause + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticPause + */ +extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); + +/** + * Stop all the currently playing effects on a haptic device. + * + * \param haptic the SDL_Haptic device to stop + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); + +/** + * Check whether rumble is supported on a haptic device. + * + * \param haptic haptic device to check for rumble support + * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic); + +/** + * Initialize a haptic device for simple rumble playback. + * + * \param haptic the haptic device to initialize for simple rumble playback + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic); + +/** + * Run a simple rumble effect on a haptic device. + * + * \param haptic the haptic device to play the rumble effect on + * \param strength strength of the rumble to play as a 0-1 float value + * \param length length of the rumble to play in milliseconds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumbleStop + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length ); + +/** + * Stop the simple rumble on a haptic device. + * + * \param haptic the haptic device to stop the rumble effect on + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_haptic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_hidapi.h b/Thirdparty/SDL2/include/SDL_hidapi.h new file mode 100644 index 0000000..0575100 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_hidapi.h @@ -0,0 +1,451 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_hidapi.h + * + * Header file for SDL HIDAPI functions. + * + * This is an adaptation of the original HIDAPI interface by Alan Ott, + * and includes source code licensed under the following BSD license: + * + Copyright (c) 2010, Alan Ott, Signal 11 Software + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Signal 11 Software nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + * + * If you would like a version of SDL without this code, you can build SDL + * with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for example + * on iOS or tvOS to avoid a dependency on the CoreBluetooth framework. + */ + +#ifndef SDL_hidapi_h_ +#define SDL_hidapi_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A handle representing an open HID device + */ +struct SDL_hid_device_; +typedef struct SDL_hid_device_ SDL_hid_device; /**< opaque hidapi structure */ + +/** hidapi info structure */ +/** + * \brief Information about a connected HID device + */ +typedef struct SDL_hid_device_info +{ + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. + + * Valid on both Linux implementations in all cases. + * Valid on the Windows implementation only if the device + contains more than one interface. */ + int interface_number; + + /** Additional information about the USB interface. + Valid on libusb and Android implementations. */ + int interface_class; + int interface_subclass; + int interface_protocol; + + /** Pointer to the next device */ + struct SDL_hid_device_info *next; +} SDL_hid_device_info; + + +/** + * Initialize the HIDAPI library. + * + * This function initializes the HIDAPI library. Calling it is not strictly + * necessary, as it will be called automatically by SDL_hid_enumerate() and + * any of the SDL_hid_open_*() functions if it is needed. This function should + * be called at the beginning of execution however, if there is a chance of + * HIDAPI handles being opened by different threads simultaneously. + * + * Each call to this function should have a matching call to SDL_hid_exit() + * + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_exit + */ +extern DECLSPEC int SDLCALL SDL_hid_init(void); + +/** + * Finalize the HIDAPI library. + * + * This function frees all of the static data associated with HIDAPI. It + * should be called at the end of execution to avoid memory leaks. + * + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_init + */ +extern DECLSPEC int SDLCALL SDL_hid_exit(void); + +/** + * Check to see if devices may have been added or removed. + * + * Enumerating the HID devices is an expensive operation, so you can call this + * to see if there have been any system device changes since the last call to + * this function. A change in the counter returned doesn't necessarily mean + * that anything has changed, but you can call SDL_hid_enumerate() to get an + * updated device list. + * + * Calling this function for the first time may cause a thread or other system + * resource to be allocated to track device change notifications. + * + * \returns a change counter that is incremented with each potential device + * change, or 0 if device change detection isn't available. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_enumerate + */ +extern DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); + +/** + * Enumerate the HID Devices. + * + * This function returns a linked list of all the HID devices attached to the + * system which match vendor_id and product_id. If `vendor_id` is set to 0 + * then any vendor matches. If `product_id` is set to 0 then any product + * matches. If `vendor_id` and `product_id` are both set to 0, then all HID + * devices will be returned. + * + * \param vendor_id The Vendor ID (VID) of the types of device to open. + * \param product_id The Product ID (PID) of the types of device to open. + * \returns a pointer to a linked list of type SDL_hid_device_info, containing + * information about the HID devices attached to the system, or NULL + * in the case of failure. Free this linked list by calling + * SDL_hid_free_enumeration(). + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_device_change_count + */ +extern DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id); + +/** + * Free an enumeration Linked List + * + * This function frees a linked list created by SDL_hid_enumerate(). + * + * \param devs Pointer to a list of struct_device returned from + * SDL_hid_enumerate(). + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); + +/** + * Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally + * a serial number. + * + * If `serial_number` is NULL, the first device with the specified VID and PID + * is opened. + * + * \param vendor_id The Vendor ID (VID) of the device to open. + * \param product_id The Product ID (PID) of the device to open. + * \param serial_number The Serial Number of the device to open (Optionally + * NULL). + * \returns a pointer to a SDL_hid_device object on success or NULL on + * failure. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + +/** + * Open a HID device by its path name. + * + * The path name be determined by calling SDL_hid_enumerate(), or a + * platform-specific path name can be used (eg: /dev/hidraw0 on Linux). + * + * \param path The path name of the device to open + * \returns a pointer to a SDL_hid_device object on success or NULL on + * failure. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path, int bExclusive /* = false */); + +/** + * Write an Output report to a HID device. + * + * The first byte of `data` must contain the Report ID. For devices which only + * support a single report, this must be set to 0x0. The remaining bytes + * contain the report data. Since the Report ID is mandatory, calls to + * SDL_hid_write() will always contain one more byte than the report contains. + * For example, if a hid report is 16 bytes long, 17 bytes must be passed to + * SDL_hid_write(), the Report ID (or 0x0, for devices with a single report), + * followed by the report data (16 bytes). In this example, the length passed + * in would be 17. + * + * SDL_hid_write() will send the data on the first OUT endpoint, if one + * exists. If it does not, it will send the data through the Control Endpoint + * (Endpoint 0). + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data The data to send, including the report number as the first + * byte. + * \param length The length in bytes of the data to send. + * \returns the actual number of bytes written and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); + +/** + * Read an Input report from a HID device with timeout. + * + * Input reports are returned to the host through the INTERRUPT IN endpoint. + * The first byte will contain the Report number if the device uses numbered + * reports. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into. + * \param length The number of bytes to read. For devices with multiple + * reports, make sure to read an extra byte for the report + * number. + * \param milliseconds timeout in milliseconds or -1 for blocking wait. + * \returns the actual number of bytes read and -1 on error. If no packet was + * available to be read within the timeout period, this function + * returns 0. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); + +/** + * Read an Input report from a HID device. + * + * Input reports are returned to the host through the INTERRUPT IN endpoint. + * The first byte will contain the Report number if the device uses numbered + * reports. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into. + * \param length The number of bytes to read. For devices with multiple + * reports, make sure to read an extra byte for the report + * number. + * \returns the actual number of bytes read and -1 on error. If no packet was + * available to be read and the handle is in non-blocking mode, this + * function returns 0. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); + +/** + * Set the device handle to be non-blocking. + * + * In non-blocking mode calls to SDL_hid_read() will return immediately with a + * value of 0 if there is no data to be read. In blocking mode, SDL_hid_read() + * will wait (block) until there is data to read before returning. + * + * Nonblocking can be turned on and off at any time. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param nonblock enable or not the nonblocking reads - 1 to enable + * nonblocking - 0 to disable nonblocking. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); + +/** + * Send a Feature report to the device. + * + * Feature reports are sent over the Control endpoint as a Set_Report + * transfer. The first byte of `data` must contain the Report ID. For devices + * which only support a single report, this must be set to 0x0. The remaining + * bytes contain the report data. Since the Report ID is mandatory, calls to + * SDL_hid_send_feature_report() will always contain one more byte than the + * report contains. For example, if a hid report is 16 bytes long, 17 bytes + * must be passed to SDL_hid_send_feature_report(): the Report ID (or 0x0, for + * devices which do not use numbered reports), followed by the report data (16 + * bytes). In this example, the length passed in would be 17. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data The data to send, including the report number as the first + * byte. + * \param length The length in bytes of the data to send, including the report + * number. + * \returns the actual number of bytes written and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); + +/** + * Get a feature report from a HID device. + * + * Set the first byte of `data` to the Report ID of the report to be read. + * Make sure to allow space for this extra byte in `data`. Upon return, the + * first byte will still contain the Report ID, and the report data will start + * in data[1]. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into, including the Report ID. + * Set the first byte of `data` to the Report ID of the report to + * be read, or set it to zero if your device does not use numbered + * reports. + * \param length The number of bytes to read, including an extra byte for the + * report ID. The buffer can be longer than the actual report. + * \returns the number of bytes read plus one for the report ID (which is + * still in the first byte), or -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); + +/** + * Close a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_close(SDL_hid_device *dev); + +/** + * Get The Manufacturer String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get The Product String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get The Serial Number String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get a string from a HID device, based on its string index. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string_index The index of the string to get. + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); + +/** + * Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers + * + * \param active SDL_TRUE to start the scan, SDL_FALSE to stop the scan + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_hidapi_h_ */ + +/* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_hints.h b/Thirdparty/SDL2/include/SDL_hints.h new file mode 100644 index 0000000..c808a60 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_hints.h @@ -0,0 +1,2613 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_hints.h + * + * Official documentation for SDL configuration variables + * + * This file contains functions to set and get configuration hints, + * as well as listing each of them alphabetically. + * + * The convention for naming hints is SDL_HINT_X, where "SDL_X" is + * the environment variable that can be used to override the default. + * + * In general these hints are just that - they may or may not be + * supported or applicable on any given platform, but they provide + * a way for an application or user to give the library a hint as + * to how they would like the library to work. + */ + +#ifndef SDL_hints_h_ +#define SDL_hints_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A variable controlling whether the Android / iOS built-in + * accelerometer should be listed as a joystick device. + * + * This variable can be set to the following values: + * "0" - The accelerometer is not listed as a joystick + * "1" - The accelerometer is available as a 3 axis joystick (the default). + */ +#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK "SDL_ACCELEROMETER_AS_JOYSTICK" + +/** + * \brief Specify the behavior of Alt+Tab while the keyboard is grabbed. + * + * By default, SDL emulates Alt+Tab functionality while the keyboard is grabbed + * and your window is full-screen. This prevents the user from getting stuck in + * your application if you've enabled keyboard grab. + * + * The variable can be set to the following values: + * "0" - SDL will not handle Alt+Tab. Your application is responsible + for handling Alt+Tab while the keyboard is grabbed. + * "1" - SDL will minimize your window when Alt+Tab is pressed (default) +*/ +#define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" + +/** + * \brief If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it. + * This is a debugging aid for developers and not expected to be used by end users. The default is "1" + * + * This variable can be set to the following values: + * "0" - don't allow topmost + * "1" - allow topmost + */ +#define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST" + +/** + * \brief Android APK expansion main file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION" + +/** + * \brief Android APK expansion patch file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION" + +/** + * \brief A variable to control whether the event loop will block itself when the app is paused. + * + * The variable can be set to the following values: + * "0" - Non blocking. + * "1" - Blocking. (default) + * + * The value should be set before SDL is initialized. + */ +#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE" + +/** + * \brief A variable to control whether SDL will pause audio in background + * (Requires SDL_ANDROID_BLOCK_ON_PAUSE as "Non blocking") + * + * The variable can be set to the following values: + * "0" - Non paused. + * "1" - Paused. (default) + * + * The value should be set before SDL is initialized. + */ +#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO "SDL_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO" + +/** + * \brief A variable to control whether we trap the Android back button to handle it manually. + * This is necessary for the right mouse button to work on some Android devices, or + * to be able to trap the back button for use in your code reliably. If set to true, + * the back button will show up as an SDL_KEYDOWN / SDL_KEYUP pair with a keycode of + * SDL_SCANCODE_AC_BACK. + * + * The variable can be set to the following values: + * "0" - Back button will be handled as usual for system. (default) + * "1" - Back button will be trapped, allowing you to handle the key press + * manually. (This will also let right mouse click work on systems + * where the right mouse button functions as back.) + * + * The value of this hint is used at runtime, so it can be changed at any time. + */ +#define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON" + +/** + * \brief Specify an application name. + * + * This hint lets you specify the application name sent to the OS when + * required. For example, this will often appear in volume control applets for + * audio streams, and in lists of applications which are inhibiting the + * screensaver. You should use a string that describes your program ("My Game + * 2: The Revenge") + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: probably the application's name or "SDL Application" if SDL + * doesn't have any better information. + * + * Note that, for audio streams, this can be overridden with + * SDL_HINT_AUDIO_DEVICE_APP_NAME. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_APP_NAME "SDL_APP_NAME" + +/** + * \brief A variable controlling whether controllers used with the Apple TV + * generate UI events. + * + * When UI events are generated by controller input, the app will be + * backgrounded when the Apple TV remote's menu button is pressed, and when the + * pause or B buttons on gamepads are pressed. + * + * More information about properly making use of controllers for the Apple TV + * can be found here: + * https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/ + * + * This variable can be set to the following values: + * "0" - Controller input does not generate UI events (the default). + * "1" - Controller input generates UI events. + */ +#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS" + +/** + * \brief A variable controlling whether the Apple TV remote's joystick axes + * will automatically match the rotation of the remote. + * + * This variable can be set to the following values: + * "0" - Remote orientation does not affect joystick axes (the default). + * "1" - Joystick axes are based on the orientation of the remote. + */ +#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION" + +/** + * \brief A variable controlling the audio category on iOS and Mac OS X + * + * This variable can be set to the following values: + * + * "ambient" - Use the AVAudioSessionCategoryAmbient audio category, will be muted by the phone mute switch (default) + * "playback" - Use the AVAudioSessionCategoryPlayback category + * + * For more information, see Apple's documentation: + * https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html + */ +#define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" + +/** + * \brief Specify an application name for an audio device. + * + * Some audio backends (such as PulseAudio) allow you to describe your audio + * stream. Among other things, this description might show up in a system + * control panel that lets the user adjust the volume on specific audio + * streams instead of using one giant master volume slider. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your program ("My Game 2: The Revenge") + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: this will be the name set with SDL_HINT_APP_NAME, if that hint is + * set. Otherwise, it'll probably the application's name or "SDL Application" + * if SDL doesn't have any better information. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_APP_NAME "SDL_AUDIO_DEVICE_APP_NAME" + +/** + * \brief Specify an application name for an audio device. + * + * Some audio backends (such as PulseAudio) allow you to describe your audio + * stream. Among other things, this description might show up in a system + * control panel that lets the user adjust the volume on specific audio + * streams instead of using one giant master volume slider. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your what your program is playing ("audio stream" is + * probably sufficient in many cases, but this could be useful for something + * like "team chat" if you have a headset playing VoIP audio separately). + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "audio stream" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" + +/** + * \brief Specify an application role for an audio device. + * + * Some audio backends (such as Pipewire) allow you to describe the role of + * your audio stream. Among other things, this description might show up in + * a system control panel or software for displaying and manipulating media + * playback/capture graphs. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your what your program is playing (Game, Music, Movie, + * etc...). + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "Game" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" + +/** + * \brief A variable controlling speed/quality tradeoff of audio resampling. + * + * If available, SDL can use libsamplerate ( http://www.mega-nerd.com/SRC/ ) + * to handle audio resampling. There are different resampling modes available + * that produce different levels of quality, using more CPU. + * + * If this hint isn't specified to a valid setting, or libsamplerate isn't + * available, SDL will use the default, internal resampling algorithm. + * + * As of SDL 2.26, SDL_ConvertAudio() respects this hint when libsamplerate is available. + * + * This hint is currently only checked at audio subsystem initialization. + * + * This variable can be set to the following values: + * + * "0" or "default" - Use SDL's internal resampling (Default when not set - low quality, fast) + * "1" or "fast" - Use fast, slightly higher quality resampling, if available + * "2" or "medium" - Use medium quality resampling, if available + * "3" or "best" - Use high quality resampling, if available + */ +#define SDL_HINT_AUDIO_RESAMPLING_MODE "SDL_AUDIO_RESAMPLING_MODE" + +/** + * \brief A variable controlling whether SDL updates joystick state when getting input events + * + * This variable can be set to the following values: + * + * "0" - You'll call SDL_JoystickUpdate() manually + * "1" - SDL will automatically call SDL_JoystickUpdate() (default) + * + * This hint can be toggled on and off at runtime. + */ +#define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS" + +/** + * \brief A variable controlling whether SDL updates sensor state when getting input events + * + * This variable can be set to the following values: + * + * "0" - You'll call SDL_SensorUpdate() manually + * "1" - SDL will automatically call SDL_SensorUpdate() (default) + * + * This hint can be toggled on and off at runtime. + */ +#define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS" + +/** + * \brief Prevent SDL from using version 4 of the bitmap header when saving BMPs. + * + * The bitmap header version 4 is required for proper alpha channel support and + * SDL will use it when required. Should this not be desired, this hint can + * force the use of the 40 byte header version which is supported everywhere. + * + * The variable can be set to the following values: + * "0" - Surfaces with a colorkey or an alpha channel are saved to a + * 32-bit BMP file with an alpha mask. SDL will use the bitmap + * header version 4 and set the alpha mask accordingly. + * "1" - Surfaces with a colorkey or an alpha channel are saved to a + * 32-bit BMP file without an alpha mask. The alpha channel data + * will be in the file, but applications are going to ignore it. + * + * The default value is "0". + */ +#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" + +/** + * \brief Override for SDL_GetDisplayUsableBounds() + * + * If set, this hint will override the expected results for + * SDL_GetDisplayUsableBounds() for display index 0. Generally you don't want + * to do this, but this allows an embedded system to request that some of the + * screen be reserved for other uses when paired with a well-behaved + * application. + * + * The contents of this hint must be 4 comma-separated integers, the first + * is the bounds x, then y, width and height, in that order. + */ +#define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" + +/** + * \brief Disable giving back control to the browser automatically + * when running with asyncify + * + * With -s ASYNCIFY, SDL2 calls emscripten_sleep during operations + * such as refreshing the screen or polling events. + * + * This hint only applies to the emscripten platform + * + * The variable can be set to the following values: + * "0" - Disable emscripten_sleep calls (if you give back browser control manually or use asyncify for other purposes) + * "1" - Enable emscripten_sleep calls (the default) + */ +#define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY" + +/** + * \brief override the binding element for keyboard inputs for Emscripten builds + * + * This hint only applies to the emscripten platform + * + * The variable can be one of + * "#window" - The javascript window object (this is the default) + * "#document" - The javascript document object + * "#screen" - the javascript window.screen object + * "#canvas" - the WebGL canvas element + * any other string without a leading # sign applies to the element on the page with that ID. + */ +#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" + +/** + * \brief A variable that controls whether the on-screen keyboard should be shown when text input is active + * + * The variable can be set to the following values: + * "0" - Do not show the on-screen keyboard + * "1" - Show the on-screen keyboard + * + * The default value is "1". This hint must be set before text input is activated. + */ +#define SDL_HINT_ENABLE_SCREEN_KEYBOARD "SDL_ENABLE_SCREEN_KEYBOARD" + +/** + * \brief A variable that controls whether Steam Controllers should be exposed using the SDL joystick and game controller APIs + * + * The variable can be set to the following values: + * "0" - Do not scan for Steam Controllers + * "1" - Scan for Steam Controllers (the default) + * + * The default value is "1". This hint must be set before initializing the joystick subsystem. + */ +#define SDL_HINT_ENABLE_STEAM_CONTROLLERS "SDL_ENABLE_STEAM_CONTROLLERS" + +/** + * \brief A variable controlling verbosity of the logging of SDL events pushed onto the internal queue. + * + * This variable can be set to the following values, from least to most verbose: + * + * "0" - Don't log any events (default) + * "1" - Log most events (other than the really spammy ones). + * "2" - Include mouse and finger motion events. + * "3" - Include SDL_SysWMEvent events. + * + * This is generally meant to be used to debug SDL itself, but can be useful + * for application developers that need better visibility into what is going + * on in the event queue. Logged events are sent through SDL_Log(), which + * means by default they appear on stdout on most platforms or maybe + * OutputDebugString() on Windows, and can be funneled by the app with + * SDL_LogSetOutputFunction(), etc. + * + * This hint can be toggled on and off at runtime, if you only need to log + * events for a small subset of program execution. + */ +#define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" + +/** + * \brief A variable controlling whether raising the window should be done more forcefully + * + * This variable can be set to the following values: + * "0" - No forcing (the default) + * "1" - Extra level of forcing + * + * At present, this is only an issue under MS Windows, which makes it nearly impossible to + * programmatically move a window to the foreground, for "security" reasons. See + * http://stackoverflow.com/a/34414846 for a discussion. + */ +#define SDL_HINT_FORCE_RAISEWINDOW "SDL_HINT_FORCE_RAISEWINDOW" + +/** + * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. + * + * SDL can try to accelerate the SDL screen surface by using streaming + * textures with a 3D rendering engine. This variable controls whether and + * how this is done. + * + * This variable can be set to the following values: + * "0" - Disable 3D acceleration + * "1" - Enable 3D acceleration, using the default renderer. + * "X" - Enable 3D acceleration, using X where X is one of the valid rendering drivers. (e.g. "direct3d", "opengl", etc.) + * + * By default SDL tries to make a best guess for each platform whether + * to use acceleration or not. + */ +#define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" + +/** + * \brief A variable that lets you manually hint extra gamecontroller db entries. + * + * The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" + +/** + * \brief A variable that lets you provide a file with extra gamecontroller db entries. + * + * The file should contain lines of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE" + +/** + * \brief A variable that overrides the automatic controller type detection + * + * The variable should be comma separated entries, in the form: VID/PID=type + * + * The VID and PID should be hexadecimal with exactly 4 digits, e.g. 0x00fd + * + * The type should be one of: + * Xbox360 + * XboxOne + * PS3 + * PS4 + * PS5 + * SwitchPro + * + * This hint affects what driver is used, and must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + */ +#define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE" + +/** + * \brief A variable containing a list of devices to skip when scanning for game controllers. + * + * The format of the string is a comma separated list of USB VID/PID pairs + * in hexadecimal form, e.g. + * + * 0xAAAA/0xBBBB,0xCCCC/0xDDDD + * + * The variable can also take the form of @file, in which case the named + * file will be loaded and interpreted as the value of the variable. + */ +#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES" + +/** + * \brief If set, all devices will be skipped when scanning for game controllers except for the ones listed in this variable. + * + * The format of the string is a comma separated list of USB VID/PID pairs + * in hexadecimal form, e.g. + * + * 0xAAAA/0xBBBB,0xCCCC/0xDDDD + * + * The variable can also take the form of @file, in which case the named + * file will be loaded and interpreted as the value of the variable. + */ +#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT" + +/** + * \brief If set, game controller face buttons report their values according to their labels instead of their positional layout. + * + * For example, on Nintendo Switch controllers, normally you'd get: + * + * (Y) + * (X) (B) + * (A) + * + * but if this hint is set, you'll get: + * + * (X) + * (Y) (A) + * (B) + * + * The variable can be set to the following values: + * "0" - Report the face buttons by position, as though they were on an Xbox controller. + * "1" - Report the face buttons by label instead of position + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS "SDL_GAMECONTROLLER_USE_BUTTON_LABELS" + +/** + * \brief A variable controlling whether grabbing input grabs the keyboard + * + * This variable can be set to the following values: + * "0" - Grab will affect only the mouse + * "1" - Grab will affect mouse and keyboard + * + * By default SDL will not grab the keyboard so system shortcuts still work. + */ +#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD" + +/** + * \brief A variable containing a list of devices to ignore in SDL_hid_enumerate() + * + * For example, to ignore the Shanwan DS3 controller and any Valve controller, you might + * have the string "0x2563/0x0523,0x28de/0x0000" + */ +#define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" + +/** + * \brief A variable controlling whether the idle timer is disabled on iOS. + * + * When an iOS app does not receive touches for some time, the screen is + * dimmed automatically. For games where the accelerometer is the only input + * this is problematic. This functionality can be disabled by setting this + * hint. + * + * As of SDL 2.0.4, SDL_EnableScreenSaver() and SDL_DisableScreenSaver() + * accomplish the same thing on iOS. They should be preferred over this hint. + * + * This variable can be set to the following values: + * "0" - Enable idle timer + * "1" - Disable idle timer + */ +#define SDL_HINT_IDLE_TIMER_DISABLED "SDL_IOS_IDLE_TIMER_DISABLED" + +/** + * \brief A variable to control whether certain IMEs should handle text editing internally instead of sending SDL_TEXTEDITING events. + * + * The variable can be set to the following values: + * "0" - SDL_TEXTEDITING events are sent, and it is the application's + * responsibility to render the text from these events and + * differentiate it somehow from committed text. (default) + * "1" - If supported by the IME then SDL_TEXTEDITING events are not sent, + * and text that is being composed will be rendered in its own UI. + */ +#define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING" + +/** + * \brief A variable to control whether certain IMEs should show native UI components (such as the Candidate List) instead of suppressing them. + * + * The variable can be set to the following values: + * "0" - Native UI components are not display. (default) + * "1" - Native UI components are displayed. + */ +#define SDL_HINT_IME_SHOW_UI "SDL_IME_SHOW_UI" + +/** + * \brief A variable to control if extended IME text support is enabled. + * If enabled then SDL_TextEditingExtEvent will be issued if the text would be truncated otherwise. + * Additionally SDL_TextInputEvent will be dispatched multiple times so that it is not truncated. + * + * The variable can be set to the following values: + * "0" - Legacy behavior. Text can be truncated, no heap allocations. (default) + * "1" - Modern behavior. + */ +#define SDL_HINT_IME_SUPPORT_EXTENDED_TEXT "SDL_IME_SUPPORT_EXTENDED_TEXT" + +/** + * \brief A variable controlling whether the home indicator bar on iPhone X + * should be hidden. + * + * This variable can be set to the following values: + * "0" - The indicator bar is not hidden (default for windowed applications) + * "1" - The indicator bar is hidden and is shown when the screen is touched (useful for movie playback applications) + * "2" - The indicator bar is dim and the first swipe makes it visible and the second swipe performs the "home" action (default for fullscreen applications) + */ +#define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR" + +/** + * \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background. + * + * The variable can be set to the following values: + * "0" - Disable joystick & gamecontroller input events when the + * application is in the background. + * "1" - Enable joystick & gamecontroller input events when the + * application is in the background. + * + * The default value is "0". This hint may be set at any time. + */ +#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" + +/** + * \brief A variable controlling whether the HIDAPI joystick drivers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI drivers are not used + * "1" - HIDAPI drivers are used (the default) + * + * This variable is the default for all drivers, but can be overridden by the hints for specific drivers below. + */ +#define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo GameCube controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE" + +/** + * \brief A variable controlling whether "low_frequency_rumble" and "high_frequency_rumble" is used to implement + * the GameCube controller's 3 rumble modes, Stop(0), Rumble(1), and StopHard(2) + * this is useful for applications that need full compatibility for things like ADSR envelopes. + * Stop is implemented by setting "low_frequency_rumble" to "0" and "high_frequency_rumble" ">0" + * Rumble is both at any arbitrary value, + * StopHard is implemented by setting both "low_frequency_rumble" and "high_frequency_rumble" to "0" + * + * This variable can be set to the following values: + * "0" - Normal rumble behavior is behavior is used (default) + * "1" - Proper GameCube controller rumble behavior is used + * + */ +#define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_GAMECUBE_RUMBLE_BRAKE" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Switch Joy-Cons should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS" + +/** + * \brief A variable controlling whether Nintendo Switch Joy-Con controllers will be combined into a single Pro-like controller when using the HIDAPI driver + * + * This variable can be set to the following values: + * "0" - Left and right Joy-Con controllers will not be combined and each will be a mini-gamepad + * "1" - Left and right Joy-Con controllers will be combined into a single controller (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS" + +/** + * \brief A variable controlling whether Nintendo Switch Joy-Con controllers will be in vertical mode when using the HIDAPI driver + * + * This variable can be set to the following values: + * "0" - Left and right Joy-Con controllers will not be in vertical mode (the default) + * "1" - Left and right Joy-Con controllers will be in vertical mode + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" + +/** + * \brief A variable controlling whether the HIDAPI driver for Amazon Luna controllers connected via Bluetooth should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Online classic controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC" + +/** + * \brief A variable controlling whether the HIDAPI driver for NVIDIA SHIELD controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS3 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI on macOS, and "0" on other platforms. + * + * It is not possible to use this driver on Windows, due to limitations in the default drivers + * installed. See https://github.com/ViGEm/DsHidMini for an alternative driver on Windows. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS4 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" + +/** + * \brief A variable controlling whether extended input reports should be used for PS4 controllers when using the HIDAPI driver. + * + * This variable can be set to the following values: + * "0" - extended reports are not enabled (the default) + * "1" - extended reports + * + * Extended input reports allow rumble on Bluetooth PS4 controllers, but + * break DirectInput handling for applications that don't use SDL. + * + * Once extended reports are enabled, they can not be disabled without + * power cycling the controller. + * + * For compatibility with applications written for versions of SDL prior + * to the introduction of PS5 controller support, this value will also + * control the state of extended reports on PS5 controllers when the + * SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE hint is not explicitly set. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS5 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a PS5 controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED" + +/** + * \brief A variable controlling whether extended input reports should be used for PS5 controllers when using the HIDAPI driver. + * + * This variable can be set to the following values: + * "0" - extended reports are not enabled (the default) + * "1" - extended reports + * + * Extended input reports allow rumble on Bluetooth PS5 controllers, but + * break DirectInput handling for applications that don't use SDL. + * + * Once extended reports are enabled, they can not be disabled without + * power cycling the controller. + * + * For compatibility with applications written for versions of SDL prior + * to the introduction of PS5 controller support, this value defaults to + * the value of SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE" + +/** + * \brief A variable controlling whether the HIDAPI driver for Google Stadia controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA" + +/** + * \brief A variable controlling whether the HIDAPI driver for Bluetooth Steam Controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used for Steam Controllers, which requires Bluetooth access + * and may prompt the user for permission on iOS and Android. + * + * The default is "0" + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Switch controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Pro controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Joy-Con controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Nintendo Switch controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Wii and Wii U controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * This driver doesn't work with the dolphinbar, so the default is SDL_FALSE for now. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Wii controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is "0" on Windows, otherwise the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox 360 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with an Xbox 360 controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox 360 wireless controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox One controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when an Xbox One controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. The default brightness is 0.4. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" + +/** + * \brief A variable controlling whether the RAWINPUT joystick drivers should be used for better handling XInput-capable devices. + * + * This variable can be set to the following values: + * "0" - RAWINPUT drivers are not used + * "1" - RAWINPUT drivers are used (the default) + */ +#define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT" + +/** + * \brief A variable controlling whether the RAWINPUT driver should pull correlated data from XInput. + * + * This variable can be set to the following values: + * "0" - RAWINPUT driver will only use data from raw input APIs + * "1" - RAWINPUT driver will also pull data from XInput, providing + * better trigger axes, guide button presses, and rumble support + * for Xbox controllers + * + * The default is "1". This hint applies to any joysticks opened after setting the hint. + */ +#define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT" + +/** + * \brief A variable controlling whether the ROG Chakram mice should show up as joysticks + * + * This variable can be set to the following values: + * "0" - ROG Chakram mice do not show up as joysticks (the default) + * "1" - ROG Chakram mice show up as joysticks + */ +#define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM" + +/** + * \brief A variable controlling whether a separate thread should be used + * for handling joystick detection and raw input messages on Windows + * + * This variable can be set to the following values: + * "0" - A separate thread is not used (the default) + * "1" - A separate thread is used for handling raw input messages + * + */ +#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD" + +/** + * \brief A variable controlling whether Windows.Gaming.Input should be used for controller handling. + * + * This variable can be set to the following values: + * "0" - WGI is not used + * "1" - WGI is used (the default) + */ +#define SDL_HINT_JOYSTICK_WGI "SDL_JOYSTICK_WGI" + +/** + * \brief Determines whether SDL enforces that DRM master is required in order + * to initialize the KMSDRM video backend. + * + * The DRM subsystem has a concept of a "DRM master" which is a DRM client that + * has the ability to set planes, set cursor, etc. When SDL is DRM master, it + * can draw to the screen using the SDL rendering APIs. Without DRM master, SDL + * is still able to process input and query attributes of attached displays, + * but it cannot change display state or draw to the screen directly. + * + * In some cases, it can be useful to have the KMSDRM backend even if it cannot + * be used for rendering. An app may want to use SDL for input processing while + * using another rendering API (such as an MMAL overlay on Raspberry Pi) or + * using its own code to render to DRM overlays that SDL doesn't support. + * + * This hint must be set before initializing the video subsystem. + * + * This variable can be set to the following values: + * "0" - SDL will allow usage of the KMSDRM backend without DRM master + * "1" - SDL Will require DRM master to use the KMSDRM backend (default) + */ +#define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" + +/** + * \brief A comma separated list of devices to open as joysticks + * + * This variable is currently only used by the Linux joystick driver. + */ +#define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE" + +/** + * \brief A variable controlling whether joysticks on Linux will always treat 'hat' axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking whether they may be analog. + * + * This variable can be set to the following values: + * "0" - Only map hat axis inputs to digital hat outputs if the input axes appear to actually be digital (the default) + * "1" - Always handle the input axes numbered ABS_HAT0X to ABS_HAT3Y as digital hats + */ +#define SDL_HINT_LINUX_DIGITAL_HATS "SDL_LINUX_DIGITAL_HATS" + +/** + * \brief A variable controlling whether digital hats on Linux will apply deadzones to their underlying input axes or use unfiltered values. + * + * This variable can be set to the following values: + * "0" - Return digital hat values based on unfiltered input axis values + * "1" - Return digital hat values with deadzones on the input axes taken into account (the default) + */ +#define SDL_HINT_LINUX_HAT_DEADZONES "SDL_LINUX_HAT_DEADZONES" + +/** + * \brief A variable controlling whether to use the classic /dev/input/js* joystick interface or the newer /dev/input/event* joystick interface on Linux + * + * This variable can be set to the following values: + * "0" - Use /dev/input/event* + * "1" - Use /dev/input/js* + * + * By default the /dev/input/event* interfaces are used + */ +#define SDL_HINT_LINUX_JOYSTICK_CLASSIC "SDL_LINUX_JOYSTICK_CLASSIC" + +/** + * \brief A variable controlling whether joysticks on Linux adhere to their HID-defined deadzones or return unfiltered values. + * + * This variable can be set to the following values: + * "0" - Return unfiltered joystick axis values (the default) + * "1" - Return axis values with deadzones taken into account + */ +#define SDL_HINT_LINUX_JOYSTICK_DEADZONES "SDL_LINUX_JOYSTICK_DEADZONES" + +/** +* \brief When set don't force the SDL app to become a foreground process +* +* This hint only applies to Mac OS X. +* +*/ +#define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" + +/** + * \brief A variable that determines whether ctrl+click should generate a right-click event on Mac + * + * If present, holding ctrl while left clicking will generate a right click + * event when on Mac. + */ +#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" + +/** + * \brief A variable controlling whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing + * + * This variable can be set to the following values: + * "0" - Dispatching OpenGL context updates will block the dispatching thread until the main thread finishes processing (default). + * "1" - Dispatching OpenGL context updates will allow the dispatching thread to continue execution. + * + * Generally you want the default, but if you have OpenGL code in a background thread on a Mac, and the main thread + * hangs because it's waiting for that background thread, but that background thread is also hanging because it's + * waiting for the main thread to do an update, this might fix your issue. + * + * This hint only applies to macOS. + * + * This hint is available since SDL 2.24.0. + * + */ +#define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH" + +/** + * \brief A variable setting the double click radius, in pixels. + */ +#define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS" + +/** + * \brief A variable setting the double click time, in milliseconds. + */ +#define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME" + +/** + * \brief Allow mouse click events when clicking to focus an SDL window + * + * This variable can be set to the following values: + * "0" - Ignore mouse clicks that activate a window + * "1" - Generate events for mouse clicks that activate a window + * + * By default SDL will ignore mouse clicks that activate a window + */ +#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH" + +/** + * \brief A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode + */ +#define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE" + +/** + * \brief A variable controlling whether relative mouse mode constrains the mouse to the center of the window + * + * This variable can be set to the following values: + * "0" - Relative mouse mode constrains the mouse to the window + * "1" - Relative mouse mode constrains the mouse to the center of the window + * + * Constraining to the center of the window works better for FPS games and when the + * application is running over RDP. Constraining to the whole window works better + * for 2D games and increases the chance that the mouse will be in the correct + * position when using high DPI mice. + * + * By default SDL will constrain the mouse to the center of the window + */ +#define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER" + +/** + * \brief A variable controlling whether relative mouse mode is implemented using mouse warping + * + * This variable can be set to the following values: + * "0" - Relative mouse mode uses raw input + * "1" - Relative mouse mode uses mouse warping + * + * By default SDL will use raw input for relative mouse mode + */ +#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" + +/** + * \brief A variable controlling whether relative mouse motion is affected by renderer scaling + * + * This variable can be set to the following values: + * "0" - Relative motion is unaffected by DPI or renderer's logical size + * "1" - Relative motion is scaled according to DPI scaling and logical size + * + * By default relative mouse deltas are affected by DPI and renderer scaling + */ +#define SDL_HINT_MOUSE_RELATIVE_SCALING "SDL_MOUSE_RELATIVE_SCALING" + +/** + * \brief A variable setting the scale for mouse motion, in floating point, when the mouse is in relative mode + */ +#define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" + +/** + * \brief A variable controlling whether the system mouse acceleration curve is used for relative mouse motion. + * + * This variable can be set to the following values: + * "0" - Relative mouse motion will be unscaled (the default) + * "1" - Relative mouse motion will be scaled using the system mouse acceleration curve. + * + * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will override the system speed scale. + */ +#define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE" + +/** + * \brief A variable controlling whether a motion event should be generated for mouse warping in relative mode. + * + * This variable can be set to the following values: + * "0" - Warping the mouse will not generate a motion event in relative mode + * "1" - Warping the mouse will generate a motion event in relative mode + * + * By default warping the mouse will not generate motion events in relative mode. This avoids the application having to filter out large relative motion due to warping. + */ +#define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION" + +/** + * \brief A variable controlling whether mouse events should generate synthetic touch events + * + * This variable can be set to the following values: + * "0" - Mouse events will not generate touch events (default for desktop platforms) + * "1" - Mouse events will generate touch events (default for mobile platforms, such as Android and iOS) + */ +#define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS" + +/** + * \brief A variable controlling whether the mouse is captured while mouse buttons are pressed + * + * This variable can be set to the following values: + * "0" - The mouse is not captured while mouse buttons are pressed + * "1" - The mouse is captured while mouse buttons are pressed + * + * By default the mouse is captured while mouse buttons are pressed so if the mouse is dragged + * outside the window, the application continues to receive mouse events until the button is + * released. + */ +#define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE" + +/** + * \brief Tell SDL not to catch the SIGINT or SIGTERM signals. + * + * This hint only applies to Unix-like platforms, and should set before + * any calls to SDL_Init() + * + * The variable can be set to the following values: + * "0" - SDL will install a SIGINT and SIGTERM handler, and when it + * catches a signal, convert it into an SDL_QUIT event. + * "1" - SDL will not install a signal handler at all. + */ +#define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" + +/** + * \brief A variable controlling what driver to use for OpenGL ES contexts. + * + * On some platforms, currently Windows and X11, OpenGL drivers may support + * creating contexts with an OpenGL ES profile. By default SDL uses these + * profiles, when available, otherwise it attempts to load an OpenGL ES + * library, e.g. that provided by the ANGLE project. This variable controls + * whether SDL follows this default behaviour or will always load an + * OpenGL ES library. + * + * Circumstances where this is useful include + * - Testing an app with a particular OpenGL ES implementation, e.g ANGLE, + * or emulator, e.g. those from ARM, Imagination or Qualcomm. + * - Resolving OpenGL ES function addresses at link time by linking with + * the OpenGL ES library instead of querying them at run time with + * SDL_GL_GetProcAddress(). + * + * Caution: for an application to work with the default behaviour across + * different OpenGL drivers it must query the OpenGL ES function + * addresses at run time using SDL_GL_GetProcAddress(). + * + * This variable is ignored on most platforms because OpenGL ES is native + * or not supported. + * + * This variable can be set to the following values: + * "0" - Use ES profile of OpenGL, if available. (Default when not set.) + * "1" - Load OpenGL ES library using the default library names. + * + */ +#define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" + +/** + * \brief A variable controlling which orientations are allowed on iOS/Android. + * + * In some circumstances it is necessary to be able to explicitly control + * which UI orientations are allowed. + * + * This variable is a space delimited list of the following values: + * "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown" + */ +#define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" + +/** + * \brief A variable controlling the use of a sentinel event when polling the event queue + * + * This variable can be set to the following values: + * "0" - Disable poll sentinels + * "1" - Enable poll sentinels + * + * When polling for events, SDL_PumpEvents is used to gather new events from devices. + * If a device keeps producing new events between calls to SDL_PumpEvents, a poll loop will + * become stuck until the new events stop. + * This is most noticeable when moving a high frequency mouse. + * + * By default, poll sentinels are enabled. + */ +#define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL" + +/** + * \brief Override for SDL_GetPreferredLocales() + * + * If set, this will be favored over anything the OS might report for the + * user's preferred locales. Changing this hint at runtime will not generate + * a SDL_LOCALECHANGED event (but if you can change the hint, you can push + * your own event, if you want). + * + * The format of this hint is a comma-separated list of language and locale, + * combined with an underscore, as is a common format: "en_GB". Locale is + * optional: "en". So you might have a list like this: "en_GB,jp,es_PT" + */ +#define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES" + +/** + * \brief A variable describing the content orientation on QtWayland-based platforms. + * + * On QtWayland platforms, windows are rotated client-side to allow for custom + * transitions. In order to correctly position overlays (e.g. volume bar) and + * gestures (e.g. events view, close/minimize gestures), the system needs to + * know in which orientation the application is currently drawing its contents. + * + * This does not cause the window to be rotated or resized, the application + * needs to take care of drawing the content in the right orientation (the + * framebuffer is always in portrait mode). + * + * This variable can be one of the following values: + * "primary" (default), "portrait", "landscape", "inverted-portrait", "inverted-landscape" + * + * Since SDL 2.0.22 this variable accepts a comma-separated list of values above. + */ +#define SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION "SDL_QTWAYLAND_CONTENT_ORIENTATION" + +/** + * \brief Flags to set on QtWayland windows to integrate with the native window manager. + * + * On QtWayland platforms, this hint controls the flags to set on the windows. + * For example, on Sailfish OS "OverridesSystemGestures" disables swipe gestures. + * + * This variable is a space-separated list of the following values (empty = no flags): + * "OverridesSystemGestures", "StaysOnTop", "BypassWindowManager" + */ +#define SDL_HINT_QTWAYLAND_WINDOW_FLAGS "SDL_QTWAYLAND_WINDOW_FLAGS" + +/** + * \brief A variable controlling whether the 2D render API is compatible or efficient. + * + * This variable can be set to the following values: + * + * "0" - Don't use batching to make rendering more efficient. + * "1" - Use batching, but might cause problems if app makes its own direct OpenGL calls. + * + * Up to SDL 2.0.9, the render API would draw immediately when requested. Now + * it batches up draw requests and sends them all to the GPU only when forced + * to (during SDL_RenderPresent, when changing render targets, by updating a + * texture that the batch needs, etc). This is significantly more efficient, + * but it can cause problems for apps that expect to render on top of the + * render API's output. As such, SDL will disable batching if a specific + * render backend is requested (since this might indicate that the app is + * planning to use the underlying graphics API directly). This hint can + * be used to explicitly request batching in this instance. It is a contract + * that you will either never use the underlying graphics API directly, or + * if you do, you will call SDL_RenderFlush() before you do so any current + * batch goes to the GPU before your work begins. Not following this contract + * will result in undefined behavior. + */ +#define SDL_HINT_RENDER_BATCHING "SDL_RENDER_BATCHING" + +/** + * \brief A variable controlling how the 2D render API renders lines + * + * This variable can be set to the following values: + * "0" - Use the default line drawing method (Bresenham's line algorithm as of SDL 2.0.20) + * "1" - Use the driver point API using Bresenham's line algorithm (correct, draws many points) + * "2" - Use the driver line API (occasionally misses line endpoints based on hardware driver quirks, was the default before 2.0.20) + * "3" - Use the driver geometry API (correct, draws thicker diagonal lines) + * + * This variable should be set when the renderer is created. + */ +#define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD" + +/** + * \brief A variable controlling whether to enable Direct3D 11+'s Debug Layer. + * + * This variable does not have any effect on the Direct3D 9 based renderer. + * + * This variable can be set to the following values: + * "0" - Disable Debug Layer use + * "1" - Enable Debug Layer use + * + * By default, SDL does not use Direct3D Debug Layer. + */ +#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" + +/** + * \brief A variable controlling whether the Direct3D device is initialized for thread-safe operations. + * + * This variable can be set to the following values: + * "0" - Thread-safety is not enabled (faster) + * "1" - Thread-safety is enabled + * + * By default the Direct3D device is created with thread-safety disabled. + */ +#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" + +/** + * \brief A variable specifying which render driver to use. + * + * If the application doesn't pick a specific renderer to use, this variable + * specifies the name of the preferred renderer. If the preferred renderer + * can't be initialized, the normal default renderer is used. + * + * This variable is case insensitive and can be set to the following values: + * "direct3d" + * "direct3d11" + * "direct3d12" + * "opengl" + * "opengles2" + * "opengles" + * "metal" + * "software" + * + * The default varies by platform, but it's the first one in the list that + * is available on the current platform. + */ +#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" + +/** + * \brief A variable controlling the scaling policy for SDL_RenderSetLogicalSize. + * + * This variable can be set to the following values: + * "0" or "letterbox" - Uses letterbox/sidebars to fit the entire rendering on screen + * "1" or "overscan" - Will zoom the rendering so it fills the entire screen, allowing edges to be drawn offscreen + * + * By default letterbox is used + */ +#define SDL_HINT_RENDER_LOGICAL_SIZE_MODE "SDL_RENDER_LOGICAL_SIZE_MODE" + +/** + * \brief A variable controlling whether the OpenGL render driver uses shaders if they are available. + * + * This variable can be set to the following values: + * "0" - Disable shaders + * "1" - Enable shaders + * + * By default shaders are used if OpenGL supports them. + */ +#define SDL_HINT_RENDER_OPENGL_SHADERS "SDL_RENDER_OPENGL_SHADERS" + +/** + * \brief A variable controlling the scaling quality + * + * This variable can be set to the following values: + * "0" or "nearest" - Nearest pixel sampling + * "1" or "linear" - Linear filtering (supported by OpenGL and Direct3D) + * "2" or "best" - Currently this is the same as "linear" + * + * By default nearest pixel sampling is used + */ +#define SDL_HINT_RENDER_SCALE_QUALITY "SDL_RENDER_SCALE_QUALITY" + +/** + * \brief A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing. + * + * This variable can be set to the following values: + * "0" - Disable vsync + * "1" - Enable vsync + * + * By default SDL does not sync screen surface updates with vertical refresh. + */ +#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" + +/** + * \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS + * + * This variable can be set to the following values: + * "0" - It will be using VSYNC as defined in the main flag. Default + * "1" - If VSYNC was previously enabled, then it will disable VSYNC if doesn't reach enough speed + * + * By default SDL does not enable the automatic VSYNC + */ +#define SDL_HINT_PS2_DYNAMIC_VSYNC "SDL_PS2_DYNAMIC_VSYNC" + +/** + * \brief A variable to control whether the return key on the soft keyboard + * should hide the soft keyboard on Android and iOS. + * + * The variable can be set to the following values: + * "0" - The return key will be handled as a key event. This is the behaviour of SDL <= 2.0.3. (default) + * "1" - The return key will hide the keyboard. + * + * The value of this hint is used at runtime, so it can be changed at any time. + */ +#define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME" + +/** + * \brief Tell SDL which Dispmanx layer to use on a Raspberry PI + * + * Also known as Z-order. The variable can take a negative or positive value. + * The default is 10000. + */ +#define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER" + +/** + * \brief Specify an "activity name" for screensaver inhibition. + * + * Some platforms, notably Linux desktops, list the applications which are + * inhibiting the screensaver or other power-saving features. + * + * This hint lets you specify the "activity name" sent to the OS when + * SDL_DisableScreenSaver() is used (or the screensaver is automatically + * disabled). The contents of this hint are used when the screensaver is + * disabled. You should use a string that describes what your program is doing + * (and, therefore, why the screensaver is disabled). For example, "Playing a + * game" or "Watching a video". + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "Playing a game" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" + +/** + * \brief Specifies whether SDL_THREAD_PRIORITY_TIME_CRITICAL should be treated as realtime. + * + * On some platforms, like Linux, a realtime priority thread may be subject to restrictions + * that require special handling by the application. This hint exists to let SDL know that + * the app is prepared to handle said restrictions. + * + * On Linux, SDL will apply the following configuration to any thread that becomes realtime: + * * The SCHED_RESET_ON_FORK bit will be set on the scheduling policy, + * * An RLIMIT_RTTIME budget will be configured to the rtkit specified limit. + * * Exceeding this limit will result in the kernel sending SIGKILL to the app, + * * Refer to the man pages for more information. + * + * This variable can be set to the following values: + * "0" - default platform specific behaviour + * "1" - Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling policy + */ +#define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL" + +/** +* \brief A string specifying additional information to use with SDL_SetThreadPriority. +* +* By default SDL_SetThreadPriority will make appropriate system changes in order to +* apply a thread priority. For example on systems using pthreads the scheduler policy +* is changed automatically to a policy that works well with a given priority. +* Code which has specific requirements can override SDL's default behavior with this hint. +* +* pthread hint values are "current", "other", "fifo" and "rr". +* Currently no other platform hint values are defined but may be in the future. +* +* \note On Linux, the kernel may send SIGKILL to realtime tasks which exceed the distro +* configured execution budget for rtkit. This budget can be queried through RLIMIT_RTTIME +* after calling SDL_SetThreadPriority(). +*/ +#define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY" + +/** +* \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size +* +* Use this hint in case you need to set SDL's threads stack size to other than the default. +* This is specially useful if you build SDL against a non glibc libc library (such as musl) which +* provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses). +* Support for this hint is currently available only in the pthread, Windows, and PSP backend. +* +* Instead of this hint, in 2.0.9 and later, you can use +* SDL_CreateThreadWithStackSize(). This hint only works with the classic +* SDL_CreateThread(). +*/ +#define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE" + +/** + * \brief A variable that controls the timer resolution, in milliseconds. + * + * The higher resolution the timer, the more frequently the CPU services + * timer interrupts, and the more precise delays are, but this takes up + * power and CPU time. This hint is only used on Windows. + * + * See this blog post for more information: + * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/ + * + * If this variable is set to "0", the system timer resolution is not set. + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" + +/** + * \brief A variable controlling whether touch events should generate synthetic mouse events + * + * This variable can be set to the following values: + * "0" - Touch events will not generate mouse events + * "1" - Touch events will generate mouse events + * + * By default SDL will generate mouse events for touch events + */ +#define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS" + +/** + * \brief A variable controlling which touchpad should generate synthetic mouse events + * + * This variable can be set to the following values: + * "0" - Only front touchpad should generate mouse events. Default + * "1" - Only back touchpad should generate mouse events. + * "2" - Both touchpads should generate mouse events. + * + * By default SDL will generate mouse events for all touch devices + */ +#define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_HINT_VITA_TOUCH_MOUSE_DEVICE" + +/** + * \brief A variable controlling whether the Android / tvOS remotes + * should be listed as joystick devices, instead of sending keyboard events. + * + * This variable can be set to the following values: + * "0" - Remotes send enter/escape/arrow key events + * "1" - Remotes are available as 2 axis, 2 button joysticks (the default). + */ +#define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK" + +/** + * \brief A variable controlling whether the screensaver is enabled. + * + * This variable can be set to the following values: + * "0" - Disable screensaver + * "1" - Enable screensaver + * + * By default SDL will disable the screensaver. + */ +#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" + +/** + * \brief Tell the video driver that we only want a double buffer. + * + * By default, most lowlevel 2D APIs will use a triple buffer scheme that + * wastes no CPU time on waiting for vsync after issuing a flip, but + * introduces a frame of latency. On the other hand, using a double buffer + * scheme instead is recommended for cases where low latency is an important + * factor because we save a whole frame of latency. + * We do so by waiting for vsync immediately after issuing a flip, usually just + * after eglSwapBuffers call in the backend's *_SwapWindow function. + * + * Since it's driver-specific, it's only supported where possible and + * implemented. Currently supported the following drivers: + * + * - KMSDRM (kmsdrm) + * - Raspberry Pi (raspberrypi) + */ +#define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" + +/** + * \brief A variable controlling whether the EGL window is allowed to be + * composited as transparent, rather than opaque. + * + * Most window systems will always render windows opaque, even if the surface + * format has an alpha channel. This is not always true, however, so by default + * SDL will try to enforce opaque composition. To override this behavior, you + * can set this hint to "1". + */ +#define SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY "SDL_VIDEO_EGL_ALLOW_TRANSPARENCY" + +/** + * \brief A variable controlling whether the graphics context is externally managed. + * + * This variable can be set to the following values: + * "0" - SDL will manage graphics contexts that are attached to windows. + * "1" - Disable graphics context management on windows. + * + * By default SDL will manage OpenGL contexts in certain situations. For example, on Android the + * context will be automatically saved and restored when pausing the application. Additionally, some + * platforms will assume usage of OpenGL if Vulkan isn't used. Setting this to "1" will prevent this + * behavior, which is desireable when the application manages the graphics context, such as + * an externally managed OpenGL context or attaching a Vulkan surface to the window. + */ +#define SDL_HINT_VIDEO_EXTERNAL_CONTEXT "SDL_VIDEO_EXTERNAL_CONTEXT" + +/** + * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS) + */ +#define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" + +/** + * \brief A variable that dictates policy for fullscreen Spaces on Mac OS X. + * + * This hint only applies to Mac OS X. + * + * The variable can be set to the following values: + * "0" - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and + * SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen" + * button on their titlebars). + * "1" - Enable Spaces support (FULLSCREEN_DESKTOP will use them and + * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" + * button on their titlebars). + * + * The default value is "1". This hint must be set before any windows are created. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" + +/** + * \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to false. + * \warning Before SDL 2.0.14, this defaulted to true! In 2.0.14, we're + * seeing if "true" causes more problems than it solves in modern times. + * + */ +#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" + +/** + * \brief A variable controlling whether the libdecor Wayland backend is allowed to be used. + * + * This variable can be set to the following values: + * "0" - libdecor use is disabled. + * "1" - libdecor use is enabled (default). + * + * libdecor is used over xdg-shell when xdg-decoration protocol is unavailable. + */ +#define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR" + +/** + * \brief A variable controlling whether the libdecor Wayland backend is preferred over native decrations. + * + * When this hint is set, libdecor will be used to provide window decorations, even if xdg-decoration is + * available. (Note that, by default, libdecor will use xdg-decoration itself if available). + * + * This variable can be set to the following values: + * "0" - libdecor is enabled only if server-side decorations are unavailable. + * "1" - libdecor is always enabled if available. + * + * libdecor is used over xdg-shell when xdg-decoration protocol is unavailable. + */ +#define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR" + +/** + * \brief A variable controlling whether video mode emulation is enabled under Wayland. + * + * When this hint is set, a standard set of emulated CVT video modes will be exposed for use by the application. + * If it is disabled, the only modes exposed will be the logical desktop size and, in the case of a scaled + * desktop, the native display resolution. + * + * This variable can be set to the following values: + * "0" - Video mode emulation is disabled. + * "1" - Video mode emulation is enabled. + * + * By default video mode emulation is enabled. + */ +#define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION" + +/** + * \brief Enable or disable mouse pointer warp emulation, needed by some older games. + * + * When this hint is set, any SDL will emulate mouse warps using relative mouse mode. + * This is required for some older games (such as Source engine games), which warp the + * mouse to the centre of the screen rather than using relative mouse motion. Note that + * relative mouse mode may have different mouse acceleration behaviour than pointer warps. + * + * This variable can be set to the following values: + * "0" - All mouse warps fail, as mouse warping is not available under wayland. + * "1" - Some mouse warps will be emulated by forcing relative mouse mode. + * + * If not set, this is automatically enabled unless an application uses relative mouse + * mode directly. + */ +#define SDL_HINT_VIDEO_WAYLAND_EMULATE_MOUSE_WARP "SDL_VIDEO_WAYLAND_EMULATE_MOUSE_WARP" + +/** +* \brief A variable that is the address of another SDL_Window* (as a hex string formatted with "%p"). +* +* If this hint is set before SDL_CreateWindowFrom() and the SDL_Window* it is set to has +* SDL_WINDOW_OPENGL set (and running on WGL only, currently), then two things will occur on the newly +* created SDL_Window: +* +* 1. Its pixel format will be set to the same pixel format as this SDL_Window. This is +* needed for example when sharing an OpenGL context across multiple windows. +* +* 2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for +* OpenGL rendering. +* +* This variable can be set to the following values: +* The address (as a string "%p") of the SDL_Window* that new windows created with SDL_CreateWindowFrom() should +* share a pixel format with. +*/ +#define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT" + +/** + * \brief When calling SDL_CreateWindowFrom(), make the window compatible with OpenGL. + * + * This variable can be set to the following values: + * "0" - Don't add any graphics flags to the SDL_WindowFlags + * "1" - Add SDL_WINDOW_OPENGL to the SDL_WindowFlags + * + * By default SDL will not make the foreign window compatible with OpenGL. + */ +#define SDL_HINT_VIDEO_FOREIGN_WINDOW_OPENGL "SDL_VIDEO_FOREIGN_WINDOW_OPENGL" + +/** + * \brief When calling SDL_CreateWindowFrom(), make the window compatible with Vulkan. + * + * This variable can be set to the following values: + * "0" - Don't add any graphics flags to the SDL_WindowFlags + * "1" - Add SDL_WINDOW_VULKAN to the SDL_WindowFlags + * + * By default SDL will not make the foreign window compatible with Vulkan. + */ +#define SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN "SDL_VIDEO_FOREIGN_WINDOW_VULKAN" + +/** +* \brief A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries +* +* SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It +* can use two different sets of binaries, those compiled by the user from source +* or those provided by the Chrome browser. In the later case, these binaries require +* that SDL loads a DLL providing the shader compiler. +* +* This variable can be set to the following values: +* "d3dcompiler_46.dll" - default, best for Vista or later. +* "d3dcompiler_43.dll" - for XP support. +* "none" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries. +* +*/ +#define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" + +/** + * \brief A variable controlling whether X11 should use GLX or EGL by default + * + * This variable can be set to the following values: + * "0" - Use GLX + * "1" - Use EGL + * + * By default SDL will use GLX when both are present. + */ +#define SDL_HINT_VIDEO_X11_FORCE_EGL "SDL_VIDEO_X11_FORCE_EGL" + +/** + * \brief A variable controlling whether the X11 _NET_WM_BYPASS_COMPOSITOR hint should be used. + * + * This variable can be set to the following values: + * "0" - Disable _NET_WM_BYPASS_COMPOSITOR + * "1" - Enable _NET_WM_BYPASS_COMPOSITOR + * + * By default SDL will use _NET_WM_BYPASS_COMPOSITOR + * + */ +#define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR" + +/** + * \brief A variable controlling whether the X11 _NET_WM_PING protocol should be supported. + * + * This variable can be set to the following values: + * "0" - Disable _NET_WM_PING + * "1" - Enable _NET_WM_PING + * + * By default SDL will use _NET_WM_PING, but for applications that know they + * will not always be able to respond to ping requests in a timely manner they can + * turn it off to avoid the window manager thinking the app is hung. + * The hint is checked in CreateWindow. + */ +#define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" + +/** + * \brief A variable forcing the visual ID chosen for new X11 windows + * + */ +#define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID" + +/** + * \brief A no-longer-used variable controlling whether the X11 Xinerama extension should be used. + * + * Before SDL 2.0.24, this would let apps and users disable Xinerama support on X11. + * Now SDL never uses Xinerama, and does not check for this hint at all. + * The preprocessor define is left here for source compatibility. + */ +#define SDL_HINT_VIDEO_X11_XINERAMA "SDL_VIDEO_X11_XINERAMA" + +/** + * \brief A variable controlling whether the X11 XRandR extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XRandR + * "1" - Enable XRandR + * + * By default SDL will use XRandR. + */ +#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" + +/** + * \brief A no-longer-used variable controlling whether the X11 VidMode extension should be used. + * + * Before SDL 2.0.24, this would let apps and users disable XVidMode support on X11. + * Now SDL never uses XVidMode, and does not check for this hint at all. + * The preprocessor define is left here for source compatibility. + */ +#define SDL_HINT_VIDEO_X11_XVIDMODE "SDL_VIDEO_X11_XVIDMODE" + +/** + * \brief Controls how the fact chunk affects the loading of a WAVE file. + * + * The fact chunk stores information about the number of samples of a WAVE + * file. The Standards Update from Microsoft notes that this value can be used + * to 'determine the length of the data in seconds'. This is especially useful + * for compressed formats (for which this is a mandatory chunk) if they produce + * multiple sample frames per block and truncating the block is not allowed. + * The fact chunk can exactly specify how many sample frames there should be + * in this case. + * + * Unfortunately, most application seem to ignore the fact chunk and so SDL + * ignores it by default as well. + * + * This variable can be set to the following values: + * + * "truncate" - Use the number of samples to truncate the wave data if + * the fact chunk is present and valid + * "strict" - Like "truncate", but raise an error if the fact chunk + * is invalid, not present for non-PCM formats, or if the + * data chunk doesn't have that many samples + * "ignorezero" - Like "truncate", but ignore fact chunk if the number of + * samples is zero + * "ignore" - Ignore fact chunk entirely (default) + */ +#define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK" + +/** + * \brief Controls how the size of the RIFF chunk affects the loading of a WAVE file. + * + * The size of the RIFF chunk (which includes all the sub-chunks of the WAVE + * file) is not always reliable. In case the size is wrong, it's possible to + * just ignore it and step through the chunks until a fixed limit is reached. + * + * Note that files that have trailing data unrelated to the WAVE file or + * corrupt files may slow down the loading process without a reliable boundary. + * By default, SDL stops after 10000 chunks to prevent wasting time. Use the + * environment variable SDL_WAVE_CHUNK_LIMIT to adjust this value. + * + * This variable can be set to the following values: + * + * "force" - Always use the RIFF chunk size as a boundary for the chunk search + * "ignorezero" - Like "force", but a zero size searches up to 4 GiB (default) + * "ignore" - Ignore the RIFF chunk size and always search up to 4 GiB + * "maximum" - Search for chunks until the end of file (not recommended) + */ +#define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE" + +/** + * \brief Controls how a truncated WAVE file is handled. + * + * A WAVE file is considered truncated if any of the chunks are incomplete or + * the data chunk size is not a multiple of the block size. By default, SDL + * decodes until the first incomplete block, as most applications seem to do. + * + * This variable can be set to the following values: + * + * "verystrict" - Raise an error if the file is truncated + * "strict" - Like "verystrict", but the size of the RIFF chunk is ignored + * "dropframe" - Decode until the first incomplete sample frame + * "dropblock" - Decode until the first incomplete block (default) + */ +#define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" + +/** + * \brief Tell SDL not to name threads on Windows with the 0x406D1388 Exception. + * The 0x406D1388 Exception is a trick used to inform Visual Studio of a + * thread's name, but it tends to cause problems with other debuggers, + * and the .NET runtime. Note that SDL 2.0.6 and later will still use + * the (safer) SetThreadDescription API, introduced in the Windows 10 + * Creators Update, if available. + * + * The variable can be set to the following values: + * "0" - SDL will raise the 0x406D1388 Exception to name threads. + * This is the default behavior of SDL <= 2.0.4. + * "1" - SDL will not raise this exception, and threads will be unnamed. (default) + * This is necessary with .NET languages or debuggers that aren't Visual Studio. + */ +#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING" + +/** + * \brief Controls whether menus can be opened with their keyboard shortcut (Alt+mnemonic). + * + * If the mnemonics are enabled, then menus can be opened by pressing the Alt + * key and the corresponding mnemonic (for example, Alt+F opens the File menu). + * However, in case an invalid mnemonic is pressed, Windows makes an audible + * beep to convey that nothing happened. This is true even if the window has + * no menu at all! + * + * Because most SDL applications don't have menus, and some want to use the Alt + * key for other purposes, SDL disables mnemonics (and the beeping) by default. + * + * Note: This also affects keyboard events: with mnemonics enabled, when a + * menu is opened from the keyboard, you will not receive a KEYUP event for + * the mnemonic key, and *might* not receive one for Alt. + * + * This variable can be set to the following values: + * "0" - Alt+mnemonic does nothing, no beeping. (default) + * "1" - Alt+mnemonic opens menus, invalid mnemonics produce a beep. + */ +#define SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS "SDL_WINDOWS_ENABLE_MENU_MNEMONICS" + +/** + * \brief A variable controlling whether the windows message loop is processed by SDL + * + * This variable can be set to the following values: + * "0" - The window message loop is not run + * "1" - The window message loop is processed in SDL_PumpEvents() + * + * By default SDL will process the windows message loop + */ +#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" + +/** + * \brief Force SDL to use Critical Sections for mutexes on Windows. + * On Windows 7 and newer, Slim Reader/Writer Locks are available. + * They offer better performance, allocate no kernel ressources and + * use less memory. SDL will fall back to Critical Sections on older + * OS versions or if forced to by this hint. + * + * This variable can be set to the following values: + * "0" - Use SRW Locks when available. If not, fall back to Critical Sections. (default) + * "1" - Force the use of Critical Sections in all cases. + * + */ +#define SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS "SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS" + +/** + * \brief Force SDL to use Kernel Semaphores on Windows. + * Kernel Semaphores are inter-process and require a context + * switch on every interaction. On Windows 8 and newer, the + * WaitOnAddress API is available. Using that and atomics to + * implement semaphores increases performance. + * SDL will fall back to Kernel Objects on older OS versions + * or if forced to by this hint. + * + * This variable can be set to the following values: + * "0" - Use Atomics and WaitOnAddress API when available. If not, fall back to Kernel Objects. (default) + * "1" - Force the use of Kernel Objects in all cases. + * + */ +#define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" + +/** + * \brief A variable to specify custom icon resource id from RC file on Windows platform + */ +#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" +#define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" + +/** + * \brief Tell SDL not to generate window-close events for Alt+F4 on Windows. + * + * The variable can be set to the following values: + * "0" - SDL will generate a window-close event when it sees Alt+F4. + * "1" - SDL will only do normal key handling for Alt+F4. + */ +#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4" + +/** + * \brief Use the D3D9Ex API introduced in Windows Vista, instead of normal D3D9. + * Direct3D 9Ex contains changes to state management that can eliminate device + * loss errors during scenarios like Alt+Tab or UAC prompts. D3D9Ex may require + * some changes to your application to cope with the new behavior, so this + * is disabled by default. + * + * This hint must be set before initializing the video subsystem. + * + * For more information on Direct3D 9Ex, see: + * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista#direct3d-9ex + * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/direct3d-9ex-improvements + * + * This variable can be set to the following values: + * "0" - Use the original Direct3D 9 API (default) + * "1" - Use the Direct3D 9Ex API on Vista and later (and fall back if D3D9Ex is unavailable) + * + */ +#define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX" + +/** + * \brief Controls whether SDL will declare the process to be DPI aware. + * + * This hint must be set before initializing the video subsystem. + * + * The main purpose of declaring DPI awareness is to disable OS bitmap scaling of SDL windows on monitors with + * a DPI scale factor. + * + * This hint is equivalent to requesting DPI awareness via external means (e.g. calling SetProcessDpiAwarenessContext) + * and does not cause SDL to use a virtualized coordinate system, so it will generally give you 1 SDL coordinate = 1 pixel + * even on high-DPI displays. + * + * For more information, see: + * https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows + * + * This variable can be set to the following values: + * "" - Do not change the DPI awareness (default). + * "unaware" - Declare the process as DPI unaware. (Windows 8.1 and later). + * "system" - Request system DPI awareness. (Vista and later). + * "permonitor" - Request per-monitor DPI awareness. (Windows 8.1 and later). + * "permonitorv2" - Request per-monitor V2 DPI awareness. (Windows 10, version 1607 and later). + * The most visible difference from "permonitor" is that window title bar will be scaled + * to the visually correct size when dragging between monitors with different scale factors. + * This is the preferred DPI awareness level. + * + * If the requested DPI awareness is not available on the currently running OS, SDL will try to request the best + * available match. + */ +#define SDL_HINT_WINDOWS_DPI_AWARENESS "SDL_WINDOWS_DPI_AWARENESS" + +/** + * \brief Uses DPI-scaled points as the SDL coordinate system on Windows. + * + * This changes the SDL coordinate system units to be DPI-scaled points, rather than pixels everywhere. + * This means windows will be appropriately sized, even when created on high-DPI displays with scaling. + * + * e.g. requesting a 640x480 window from SDL, on a display with 125% scaling in Windows display settings, + * will create a window with an 800x600 client area (in pixels). + * + * Setting this to "1" implicitly requests process DPI awareness (setting SDL_WINDOWS_DPI_AWARENESS is unnecessary), + * and forces SDL_WINDOW_ALLOW_HIGHDPI on all windows. + * + * This variable can be set to the following values: + * "0" - SDL coordinates equal Windows coordinates. No automatic window resizing when dragging + * between monitors with different scale factors (unless this is performed by + * Windows itself, which is the case when the process is DPI unaware). + * "1" - SDL coordinates are in DPI-scaled points. Automatically resize windows as needed on + * displays with non-100% scale factors. + */ +#define SDL_HINT_WINDOWS_DPI_SCALING "SDL_WINDOWS_DPI_SCALING" + +/** + * \brief A variable controlling whether the window frame and title bar are interactive when the cursor is hidden + * + * This variable can be set to the following values: + * "0" - The window frame is not interactive when the cursor is hidden (no move, resize, etc) + * "1" - The window frame is interactive when the cursor is hidden + * + * By default SDL will allow interaction with the window frame when the cursor is hidden + */ +#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" + +/** +* \brief A variable controlling whether the window is activated when the SDL_ShowWindow function is called +* +* This variable can be set to the following values: +* "0" - The window is activated when the SDL_ShowWindow function is called +* "1" - The window is not activated when the SDL_ShowWindow function is called +* +* By default SDL will activate the window when the SDL_ShowWindow function is called +*/ +#define SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN "SDL_WINDOW_NO_ACTIVATION_WHEN_SHOWN" + +/** \brief Allows back-button-press events on Windows Phone to be marked as handled + * + * Windows Phone devices typically feature a Back button. When pressed, + * the OS will emit back-button-press events, which apps are expected to + * handle in an appropriate manner. If apps do not explicitly mark these + * events as 'Handled', then the OS will invoke its default behavior for + * unhandled back-button-press events, which on Windows Phone 8 and 8.1 is to + * terminate the app (and attempt to switch to the previous app, or to the + * device's home screen). + * + * Setting the SDL_HINT_WINRT_HANDLE_BACK_BUTTON hint to "1" will cause SDL + * to mark back-button-press events as Handled, if and when one is sent to + * the app. + * + * Internally, Windows Phone sends back button events as parameters to + * special back-button-press callback functions. Apps that need to respond + * to back-button-press events are expected to register one or more + * callback functions for such, shortly after being launched (during the + * app's initialization phase). After the back button is pressed, the OS + * will invoke these callbacks. If the app's callback(s) do not explicitly + * mark the event as handled by the time they return, or if the app never + * registers one of these callback, the OS will consider the event + * un-handled, and it will apply its default back button behavior (terminate + * the app). + * + * SDL registers its own back-button-press callback with the Windows Phone + * OS. This callback will emit a pair of SDL key-press events (SDL_KEYDOWN + * and SDL_KEYUP), each with a scancode of SDL_SCANCODE_AC_BACK, after which + * it will check the contents of the hint, SDL_HINT_WINRT_HANDLE_BACK_BUTTON. + * If the hint's value is set to "1", the back button event's Handled + * property will get set to 'true'. If the hint's value is set to something + * else, or if it is unset, SDL will leave the event's Handled property + * alone. (By default, the OS sets this property to 'false', to note.) + * + * SDL apps can either set SDL_HINT_WINRT_HANDLE_BACK_BUTTON well before a + * back button is pressed, or can set it in direct-response to a back button + * being pressed. + * + * In order to get notified when a back button is pressed, SDL apps should + * register a callback function with SDL_AddEventWatch(), and have it listen + * for SDL_KEYDOWN events that have a scancode of SDL_SCANCODE_AC_BACK. + * (Alternatively, SDL_KEYUP events can be listened-for. Listening for + * either event type is suitable.) Any value of SDL_HINT_WINRT_HANDLE_BACK_BUTTON + * set by such a callback, will be applied to the OS' current + * back-button-press event. + * + * More details on back button behavior in Windows Phone apps can be found + * at the following page, on Microsoft's developer site: + * http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx + */ +#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON" + +/** \brief Label text for a WinRT app's privacy policy link + * + * Network-enabled WinRT apps must include a privacy policy. On Windows 8, 8.1, and RT, + * Microsoft mandates that this policy be available via the Windows Settings charm. + * SDL provides code to add a link there, with its label text being set via the + * optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that a privacy policy's contents are not set via this hint. A separate + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the actual text of the + * policy. + * + * The contents of this hint should be encoded as a UTF8 string. + * + * The default value is "Privacy Policy". This hint should only be set during app + * initialization, preferably before any calls to SDL_Init(). + * + * For additional information on linking to a privacy policy, see the documentation for + * SDL_HINT_WINRT_PRIVACY_POLICY_URL. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL" + +/** + * \brief A URL to a WinRT app's privacy policy + * + * All network-enabled WinRT apps must make a privacy policy available to its + * users. On Windows 8, 8.1, and RT, Microsoft mandates that this policy be + * be available in the Windows Settings charm, as accessed from within the app. + * SDL provides code to add a URL-based link there, which can point to the app's + * privacy policy. + * + * To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL + * before calling any SDL_Init() functions. The contents of the hint should + * be a valid URL. For example, "http://www.example.com". + * + * The default value is "", which will prevent SDL from adding a privacy policy + * link to the Settings charm. This hint should only be set during app init. + * + * The label text of an app's "Privacy Policy" link may be customized via another + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that on Windows Phone, Microsoft does not provide standard UI + * for displaying a privacy policy link, and as such, SDL_HINT_WINRT_PRIVACY_POLICY_URL + * will not get used on that platform. Network-enabled phone apps should display + * their privacy policy through some other, in-app means. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL" + +/** + * \brief Mark X11 windows as override-redirect. + * + * If set, this _might_ increase framerate at the expense of the desktop + * not working as expected. Override-redirect windows aren't noticed by the + * window manager at all. + * + * You should probably only use this for fullscreen windows, and you probably + * shouldn't even use it for that. But it's here if you want to try! + */ +#define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT" + +/** + * \brief A variable that lets you disable the detection and use of Xinput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable XInput detection (only uses direct input) + * "1" - Enable XInput detection (the default) + */ +#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" + + /** + * \brief A variable that lets you disable the detection and use of DirectInput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable DirectInput detection (only uses XInput) + * "1" - Enable DirectInput detection (the default) + */ +#define SDL_HINT_DIRECTINPUT_ENABLED "SDL_DIRECTINPUT_ENABLED" + +/** + * \brief A variable that causes SDL to use the old axis and button mapping for XInput devices. + * + * This hint is for backwards compatibility only and will be removed in SDL 2.1 + * + * The default value is "0". This hint must be set before SDL_Init() + */ +#define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING" + +/** + * \brief A variable that causes SDL to not ignore audio "monitors" + * + * This is currently only used for PulseAudio and ignored elsewhere. + * + * By default, SDL ignores audio devices that aren't associated with physical + * hardware. Changing this hint to "1" will expose anything SDL sees that + * appears to be an audio source or sink. This will add "devices" to the list + * that the user probably doesn't want or need, but it can be useful in + * scenarios where you want to hook up SDL to some sort of virtual device, + * etc. + * + * The default value is "0". This hint must be set before SDL_Init(). + * + * This hint is available since SDL 2.0.16. Before then, virtual devices are + * always ignored. + */ +#define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS" + +/** + * \brief A variable that forces X11 windows to create as a custom type. + * + * This is currently only used for X11 and ignored elsewhere. + * + * During SDL_CreateWindow, SDL uses the _NET_WM_WINDOW_TYPE X11 property + * to report to the window manager the type of window it wants to create. + * This might be set to various things if SDL_WINDOW_TOOLTIP or + * SDL_WINDOW_POPUP_MENU, etc, were specified. For "normal" windows that + * haven't set a specific type, this hint can be used to specify a custom + * type. For example, a dock window might set this to + * "_NET_WM_WINDOW_TYPE_DOCK". + * + * If not set or set to "", this hint is ignored. This hint must be set + * before the SDL_CreateWindow() call that it is intended to affect. + * + * This hint is available since SDL 2.0.22. + */ +#define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" + +/** + * \brief A variable that decides whether to send SDL_QUIT when closing the final window. + * + * By default, SDL sends an SDL_QUIT event when there is only one window + * and it receives an SDL_WINDOWEVENT_CLOSE event, under the assumption most + * apps would also take the loss of this window as a signal to terminate the + * program. + * + * However, it's not unreasonable in some cases to have the program continue + * to live on, perhaps to create new windows later. + * + * Changing this hint to "0" will cause SDL to not send an SDL_QUIT event + * when the final window is requesting to close. Note that in this case, + * there are still other legitimate reasons one might get an SDL_QUIT + * event: choosing "Quit" from the macOS menu bar, sending a SIGINT (ctrl-c) + * on Unix, etc. + * + * The default value is "1". This hint can be changed at any time. + * + * This hint is available since SDL 2.0.22. Before then, you always get + * an SDL_QUIT event when closing the final window. + */ +#define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE" + + +/** + * \brief A variable that decides what video backend to use. + * + * By default, SDL will try all available video backends in a reasonable + * order until it finds one that can work, but this hint allows the app + * or user to force a specific target, such as "x11" if, say, you are + * on Wayland but want to try talking to the X server instead. + * + * This functionality has existed since SDL 2.0.0 (indeed, before that) + * but before 2.0.22 this was an environment variable only. In 2.0.22, + * it was upgraded to a full SDL hint, so you can set the environment + * variable as usual or programatically set the hint with SDL_SetHint, + * which won't propagate to child processes. + * + * The default value is unset, in which case SDL will try to figure out + * the best video backend on your behalf. This hint needs to be set + * before SDL_Init() is called to be useful. + * + * This hint is available since SDL 2.0.22. Before then, you could set + * the environment variable to get the same effect. + */ +#define SDL_HINT_VIDEODRIVER "SDL_VIDEODRIVER" + +/** + * \brief A variable that decides what audio backend to use. + * + * By default, SDL will try all available audio backends in a reasonable + * order until it finds one that can work, but this hint allows the app + * or user to force a specific target, such as "alsa" if, say, you are + * on PulseAudio but want to try talking to the lower level instead. + * + * This functionality has existed since SDL 2.0.0 (indeed, before that) + * but before 2.0.22 this was an environment variable only. In 2.0.22, + * it was upgraded to a full SDL hint, so you can set the environment + * variable as usual or programatically set the hint with SDL_SetHint, + * which won't propagate to child processes. + * + * The default value is unset, in which case SDL will try to figure out + * the best audio backend on your behalf. This hint needs to be set + * before SDL_Init() is called to be useful. + * + * This hint is available since SDL 2.0.22. Before then, you could set + * the environment variable to get the same effect. + */ +#define SDL_HINT_AUDIODRIVER "SDL_AUDIODRIVER" + +/** + * \brief A variable that decides what KMSDRM device to use. + * + * Internally, SDL might open something like "/dev/dri/cardNN" to + * access KMSDRM functionality, where "NN" is a device index number. + * + * SDL makes a guess at the best index to use (usually zero), but the + * app or user can set this hint to a number between 0 and 99 to + * force selection. + * + * This hint is available since SDL 2.24.0. + */ +#define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX" + + +/** + * \brief A variable that treats trackpads as touch devices. + * + * On macOS (and possibly other platforms in the future), SDL will report + * touches on a trackpad as mouse input, which is generally what users + * expect from this device; however, these are often actually full + * multitouch-capable touch devices, so it might be preferable to some apps + * to treat them as such. + * + * Setting this hint to true will make the trackpad input report as a + * multitouch device instead of a mouse. The default is false. + * + * Note that most platforms don't support this hint. As of 2.24.0, it + * only supports MacBooks' trackpads on macOS. Others may follow later. + * + * This hint is checked during SDL_Init and can not be changed after. + * + * This hint is available since SDL 2.24.0. + */ +#define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY" + + +/** + * \brief An enumeration of hint priorities + */ +typedef enum +{ + SDL_HINT_DEFAULT, + SDL_HINT_NORMAL, + SDL_HINT_OVERRIDE +} SDL_HintPriority; + + +/** + * Set a hint with a specific priority. + * + * The priority controls the behavior when setting a hint that already has a + * value. Hints will replace existing hints of their priority and lower. + * Environment variables are considered to have override priority. + * + * \param name the hint to set + * \param value the value of the hint variable + * \param priority the SDL_HintPriority level for the hint + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, + const char *value, + SDL_HintPriority priority); + +/** + * Set a hint with normal priority. + * + * Hints will not be set if there is an existing override hint or environment + * variable that takes precedence. You can use SDL_SetHintWithPriority() to + * set the hint with override priority instead. + * + * \param name the hint to set + * \param value the value of the hint variable + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHintWithPriority + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, + const char *value); + +/** + * Reset a hint to the default value. + * + * This will reset a hint to the value of the environment variable, or NULL if + * the environment isn't set. Callbacks will be called normally with this + * change. + * + * \param name the hint to set + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); + +/** + * Reset all hints to the default values. + * + * This will reset all hints to the value of the associated environment + * variable, or NULL if the environment isn't set. Callbacks will be called + * normally with this change. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + * \sa SDL_ResetHint + */ +extern DECLSPEC void SDLCALL SDL_ResetHints(void); + +/** + * Get the value of a hint. + * + * \param name the hint to query + * \returns the string value of a hint or NULL if the hint isn't set. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetHint + * \sa SDL_SetHintWithPriority + */ +extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); + +/** + * Get the boolean value of a hint variable. + * + * \param name the name of the hint to get the boolean value from + * \param default_value the value to return if the hint does not exist + * \returns the boolean value of a hint or the provided default value if the + * hint does not exist. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value); + +/** + * Type definition of the hint callback function. + * + * \param userdata what was passed as `userdata` to SDL_AddHintCallback() + * \param name what was passed as `name` to SDL_AddHintCallback() + * \param oldValue the previous hint value + * \param newValue the new value hint is to be set to + */ +typedef void (SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue); + +/** + * Add a function to watch a particular hint. + * + * \param name the hint to watch + * \param callback An SDL_HintCallback function that will be called when the + * hint value changes + * \param userdata a pointer to pass to the callback function + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DelHintCallback + */ +extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * Remove a function watching a particular hint. + * + * \param name the hint being watched + * \param callback An SDL_HintCallback function that will be called when the + * hint value changes + * \param userdata a pointer being passed to the callback function + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddHintCallback + */ +extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * Clear all hints. + * + * This function is automatically called during SDL_Quit(), and deletes all + * callbacks without calling them and frees all memory associated with hints. + * If you're calling this from application code you probably want to call + * SDL_ResetHints() instead. + * + * This function will be removed from the API the next time we rev the ABI. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ResetHints + */ +extern DECLSPEC void SDLCALL SDL_ClearHints(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_hints_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_joystick.h b/Thirdparty/SDL2/include/SDL_joystick.h new file mode 100644 index 0000000..b9b4f62 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_joystick.h @@ -0,0 +1,1069 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_joystick.h + * + * Include file for SDL joystick event handling + * + * The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks(), with the exact joystick + * behind a device_index changing as joysticks are plugged and unplugged. + * + * The term "instance_id" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted + * then it will get a new instance_id, instance_id's are monotonically increasing identifiers of a joystick plugged in. + * + * The term "player_index" is the number assigned to a player on a specific + * controller. For XInput controllers this returns the XInput user index. + * Many joysticks will not be able to supply this information. + * + * The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of + * the device (a X360 wired controller for example). This identifier is platform dependent. + */ + +#ifndef SDL_joystick_h_ +#define SDL_joystick_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_guid.h" +#include "SDL_mutex.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_joystick.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + * + * If you would like to receive joystick updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/** + * The joystick structure used to identify an SDL joystick + */ +#ifdef SDL_THREAD_SAFETY_ANALYSIS +extern SDL_mutex *SDL_joystick_lock; +#endif +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* A structure that encodes the stable unique id for a joystick device */ +typedef SDL_GUID SDL_JoystickGUID; + +/** + * This is a unique ID for a joystick for the time it is connected to the system, + * and is never reused for the lifetime of the application. If the joystick is + * disconnected and reconnected, it will get a new ID. + * + * The ID value starts at 0 and increments from there. The value -1 is an invalid ID. + */ +typedef Sint32 SDL_JoystickID; + +typedef enum +{ + SDL_JOYSTICK_TYPE_UNKNOWN, + SDL_JOYSTICK_TYPE_GAMECONTROLLER, + SDL_JOYSTICK_TYPE_WHEEL, + SDL_JOYSTICK_TYPE_ARCADE_STICK, + SDL_JOYSTICK_TYPE_FLIGHT_STICK, + SDL_JOYSTICK_TYPE_DANCE_PAD, + SDL_JOYSTICK_TYPE_GUITAR, + SDL_JOYSTICK_TYPE_DRUM_KIT, + SDL_JOYSTICK_TYPE_ARCADE_PAD, + SDL_JOYSTICK_TYPE_THROTTLE +} SDL_JoystickType; + +typedef enum +{ + SDL_JOYSTICK_POWER_UNKNOWN = -1, + SDL_JOYSTICK_POWER_EMPTY, /* <= 5% */ + SDL_JOYSTICK_POWER_LOW, /* <= 20% */ + SDL_JOYSTICK_POWER_MEDIUM, /* <= 70% */ + SDL_JOYSTICK_POWER_FULL, /* <= 100% */ + SDL_JOYSTICK_POWER_WIRED, + SDL_JOYSTICK_POWER_MAX +} SDL_JoystickPowerLevel; + +/* Set max recognized G-force from accelerometer + See src/joystick/uikit/SDL_sysjoystick.m for notes on why this is needed + */ +#define SDL_IPHONE_MAX_GFORCE 5.0 + + +/* Function prototypes */ + +/** + * Locking for multi-threaded access to the joystick API + * + * If you are using the joystick API or handling events from multiple threads + * you should use these locking functions to protect access to the joysticks. + * + * In particular, you are guaranteed that the joystick list won't change, so + * the API functions that take a joystick index will be valid, and joystick + * and game controller events will not be delivered. + * + * As of SDL 2.26.0, you can take the joystick lock around reinitializing the + * joystick subsystem, to prevent other threads from seeing joysticks in an + * uninitialized state. However, all open joysticks will be closed and SDL + * functions called with them will fail. + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_LockJoysticks(void) SDL_ACQUIRE(SDL_joystick_lock); + + +/** + * Unlocking for multi-threaded access to the joystick API + * + * If you are using the joystick API or handling events from multiple threads + * you should use these locking functions to protect access to the joysticks. + * + * In particular, you are guaranteed that the joystick list won't change, so + * the API functions that take a joystick index will be valid, and joystick + * and game controller events will not be delivered. + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_UnlockJoysticks(void) SDL_RELEASE(SDL_joystick_lock); + +/** + * Count the number of joysticks attached to the system. + * + * \returns the number of attached joysticks on success or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickName + * \sa SDL_JoystickPath + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system) + * \returns the name of the selected joystick. If no name can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickName + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); + +/** + * Get the implementation dependent path of a joystick. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system) + * \returns the path of the selected joystick. If no path can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_JoystickPath + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickPathForIndex(int device_index); + +/** + * Get the player index of a joystick, or -1 if it's not available This can be + * called before any joysticks are opened. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index); + +/** + * Get the implementation-dependent GUID for the joystick at a given device + * index. + * + * This function can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the GUID of the selected joystick. If called on an invalid index, + * this function returns a zero GUID + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetGUID + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index); + +/** + * Get the USB vendor ID of a joystick, if available. + * + * This can be called before any joysticks are opened. If the vendor ID isn't + * available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the USB vendor ID of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceVendor(int device_index); + +/** + * Get the USB product ID of a joystick, if available. + * + * This can be called before any joysticks are opened. If the product ID isn't + * available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the USB product ID of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProduct(int device_index); + +/** + * Get the product version of a joystick, if available. + * + * This can be called before any joysticks are opened. If the product version + * isn't available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the product version of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_index); + +/** + * Get the type of a joystick, if available. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the SDL_JoystickType of the selected joystick. If called on an + * invalid index, this function returns `SDL_JOYSTICK_TYPE_UNKNOWN` + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index); + +/** + * Get the instance ID of a joystick. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the instance id of the selected joystick. If called on an invalid + * index, this function returns -1. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickGetDeviceInstanceID(int device_index); + +/** + * Open a joystick for use. + * + * The `device_index` argument refers to the N'th joystick presently + * recognized by SDL on the system. It is **NOT** the same as the instance ID + * used to identify the joystick in future events. See + * SDL_JoystickInstanceID() for more details about instance IDs. + * + * The joystick subsystem must be initialized before a joystick can be opened + * for use. + * + * \param device_index the index of the joystick to query + * \returns a joystick identifier or NULL if an error occurred; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickClose + * \sa SDL_JoystickInstanceID + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Get the SDL_Joystick associated with an instance id. + * + * \param instance_id the instance id to get the SDL_Joystick for + * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID instance_id); + +/** + * Get the SDL_Joystick associated with a player index. + * + * \param player_index the player index to get the SDL_Joystick for + * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromPlayerIndex(int player_index); + +/** + * Attach a new virtual joystick. + * + * \returns the joystick's device index, or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type, + int naxes, + int nbuttons, + int nhats); + +/** + * The structure that defines an extended virtual joystick description + * + * The caller must zero the structure and then initialize the version with `SDL_VIRTUAL_JOYSTICK_DESC_VERSION` before passing it to SDL_JoystickAttachVirtualEx() + * All other elements of this structure are optional and can be left 0. + * + * \sa SDL_JoystickAttachVirtualEx + */ +typedef struct SDL_VirtualJoystickDesc +{ + Uint16 version; /**< `SDL_VIRTUAL_JOYSTICK_DESC_VERSION` */ + Uint16 type; /**< `SDL_JoystickType` */ + Uint16 naxes; /**< the number of axes on this joystick */ + Uint16 nbuttons; /**< the number of buttons on this joystick */ + Uint16 nhats; /**< the number of hats on this joystick */ + Uint16 vendor_id; /**< the USB vendor ID of this joystick */ + Uint16 product_id; /**< the USB product ID of this joystick */ + Uint16 padding; /**< unused */ + Uint32 button_mask; /**< A mask of which buttons are valid for this controller + e.g. (1 << SDL_CONTROLLER_BUTTON_A) */ + Uint32 axis_mask; /**< A mask of which axes are valid for this controller + e.g. (1 << SDL_CONTROLLER_AXIS_LEFTX) */ + const char *name; /**< the name of the joystick */ + + void *userdata; /**< User data pointer passed to callbacks */ + void (SDLCALL *Update)(void *userdata); /**< Called when the joystick state should be updated */ + void (SDLCALL *SetPlayerIndex)(void *userdata, int player_index); /**< Called when the player index is set */ + int (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_JoystickRumble() */ + int (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_JoystickRumbleTriggers() */ + int (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_JoystickSetLED() */ + int (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_JoystickSendEffect() */ + +} SDL_VirtualJoystickDesc; + +/** + * \brief The current version of the SDL_VirtualJoystickDesc structure + */ +#define SDL_VIRTUAL_JOYSTICK_DESC_VERSION 1 + +/** + * Attach a new virtual joystick with extended properties. + * + * \returns the joystick's device index, or -1 if an error occurred. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtualEx(const SDL_VirtualJoystickDesc *desc); + +/** + * Detach a virtual joystick. + * + * \param device_index a value previously returned from + * SDL_JoystickAttachVirtual() + * \returns 0 on success, or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index); + +/** + * Query whether or not the joystick at a given device index is virtual. + * + * \param device_index a joystick device index. + * \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index); + +/** + * Set values on an opened, virtual-joystick's axis. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * Note that when sending trigger axes, you should scale the value to the full + * range of Sint16. For example, a trigger at rest would have the value of + * `SDL_JOYSTICK_AXIS_MIN`. + * + * \param joystick the virtual joystick on which to set state. + * \param axis the specific axis on the virtual joystick to set. + * \param value the new value for the specified axis. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); + +/** + * Set values on an opened, virtual-joystick's button. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * \param joystick the virtual joystick on which to set state. + * \param button the specific button on the virtual joystick to set. + * \param value the new value for the specified button. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick *joystick, int button, Uint8 value); + +/** + * Set values on an opened, virtual-joystick's hat. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * \param joystick the virtual joystick on which to set state. + * \param hat the specific hat on the virtual joystick to set. + * \param value the new value for the specified hat. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); + +/** + * Get the implementation dependent name of a joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the name of the selected joystick. If no name can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNameForIndex + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick *joystick); + +/** + * Get the implementation dependent path of a joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the path of the selected joystick. If no path can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_JoystickPathForIndex + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickPath(SDL_Joystick *joystick); + +/** + * Get the player index of an opened joystick. + * + * For XInput controllers this returns the XInput user index. Many joysticks + * will not be able to supply this information. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the player index, or -1 if it's not available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetPlayerIndex(SDL_Joystick *joystick); + +/** + * Set the player index of an opened joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \param player_index Player index to assign to this joystick, or -1 to clear + * the player index and turn off player LEDs. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC void SDLCALL SDL_JoystickSetPlayerIndex(SDL_Joystick *joystick, int player_index); + +/** + * Get the implementation-dependent GUID for the joystick. + * + * This function requires an open joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the GUID of the given joystick. If called on an invalid index, + * this function returns a zero GUID; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick *joystick); + +/** + * Get the USB vendor ID of an opened joystick, if available. + * + * If the vendor ID isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetVendor(SDL_Joystick *joystick); + +/** + * Get the USB product ID of an opened joystick, if available. + * + * If the product ID isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the USB product ID of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProduct(SDL_Joystick *joystick); + +/** + * Get the product version of an opened joystick, if available. + * + * If the product version isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the product version of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick *joystick); + +/** + * Get the firmware version of an opened joystick, if available. + * + * If the firmware version isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the firmware version of the selected joystick, or 0 if + * unavailable. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetFirmwareVersion(SDL_Joystick *joystick); + +/** + * Get the serial number of an opened joystick, if available. + * + * Returns the serial number of the joystick, or NULL if it is not available. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the serial number of the selected joystick, or NULL if + * unavailable. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickGetSerial(SDL_Joystick *joystick); + +/** + * Get the type of an opened joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the SDL_JoystickType of the selected joystick. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetType(SDL_Joystick *joystick); + +/** + * Get an ASCII string representation for a given SDL_JoystickGUID. + * + * You should supply at least 33 bytes for pszGUID. + * + * \param guid the SDL_JoystickGUID you wish to convert to string + * \param pszGUID buffer in which to write the ASCII string + * \param cbGUID the size of pszGUID + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUID + * \sa SDL_JoystickGetGUIDFromString + */ +extern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID); + +/** + * Convert a GUID string into a SDL_JoystickGUID structure. + * + * Performs no error checking. If this function is given a string containing + * an invalid GUID, the function will silently succeed, but the GUID generated + * will not be useful. + * + * \param pchGUID string containing an ASCII representation of a GUID + * \returns a SDL_JoystickGUID structure. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); + +/** + * Get the device information encoded in a SDL_JoystickGUID structure + * + * \param guid the SDL_JoystickGUID you wish to get info about + * \param vendor A pointer filled in with the device VID, or 0 if not + * available + * \param product A pointer filled in with the device PID, or 0 if not + * available + * \param version A pointer filled in with the device version, or 0 if not + * available + * \param crc16 A pointer filled in with a CRC used to distinguish different + * products with the same VID/PID, or 0 if not available + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_JoystickGetDeviceGUID + */ +extern DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version, Uint16 *crc16); + +/** + * Get the status of a specified joystick. + * + * \param joystick the joystick to query + * \returns SDL_TRUE if the joystick has been opened, SDL_FALSE if it has not; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickClose + * \sa SDL_JoystickOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick *joystick); + +/** + * Get the instance ID of an opened joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the instance ID of the specified joystick on success or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickOpen + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick. + * + * Often, the directional pad on a game controller will either look like 4 + * separate buttons or a POV hat, and not axes, but all of this is up to the + * device and platform. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of axis controls/number of axes on success or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetAxis + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick. + * + * Joystick trackballs have only relative motion events associated with them + * and their state cannot be polled. + * + * Most joysticks do not have trackballs. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of trackballs on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetBall + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of POV hats on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetHat + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of buttons on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetButton + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick events are + * enabled. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickEventState + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and manually check the state of the joystick when you want + * joystick information. + * + * It is recommended that you leave joystick event handling enabled. + * + * **WARNING**: Calling this function may delete all events currently in SDL's + * event queue. + * + * \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE` + * \returns 1 if enabled, 0 if disabled, or a negative error code on failure; + * call SDL_GetError() for more information. + * + * If `state` is `SDL_QUERY` then the current state is returned, + * otherwise the new processing state is returned. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerEventState + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +#define SDL_JOYSTICK_AXIS_MAX 32767 +#define SDL_JOYSTICK_AXIS_MIN -32768 + +/** + * Get the current state of an axis control on a joystick. + * + * SDL makes no promises about what part of the joystick any given axis refers + * to. Your game should have some sort of configuration UI to let users + * specify what each axis should be bound to. Alternately, SDL's higher-level + * Game Controller API makes a great effort to apply order to this lower-level + * interface, so you know that a specific axis is the "left thumb stick," etc. + * + * The value returned by SDL_JoystickGetAxis() is a signed integer (-32768 to + * 32767) representing the current position of the axis. It may be necessary + * to impose certain tolerances on these values to account for jitter. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param axis the axis to query; the axis indices start at index 0 + * \returns a 16-bit signed integer representing the current position of the + * axis or 0 on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumAxes + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, + int axis); + +/** + * Get the initial state of an axis control on a joystick. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param axis the axis to query; the axis indices start at index 0 + * \param state Upon return, the initial value is supplied here. + * \return SDL_TRUE if this axis has any initial value, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAxisInitialState(SDL_Joystick *joystick, + int axis, Sint16 *state); + +/** + * \name Hat positions + */ +/* @{ */ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/* @} */ + +/** + * Get the current state of a POV hat on a joystick. + * + * The returned value will be one of the following positions: + * + * - `SDL_HAT_CENTERED` + * - `SDL_HAT_UP` + * - `SDL_HAT_RIGHT` + * - `SDL_HAT_DOWN` + * - `SDL_HAT_LEFT` + * - `SDL_HAT_RIGHTUP` + * - `SDL_HAT_RIGHTDOWN` + * - `SDL_HAT_LEFTUP` + * - `SDL_HAT_LEFTDOWN` + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param hat the hat index to get the state from; indices start at index 0 + * \returns the current hat position. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumHats + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, + int hat); + +/** + * Get the ball axis change since the last poll. + * + * Trackballs can only return relative motion since the last call to + * SDL_JoystickGetBall(), these motion deltas are placed into `dx` and `dy`. + * + * Most joysticks do not have trackballs. + * + * \param joystick the SDL_Joystick to query + * \param ball the ball index to query; ball indices start at index 0 + * \param dx stores the difference in the x axis position since the last poll + * \param dy stores the difference in the y axis position since the last poll + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumBalls + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, + int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param button the button index to get the state from; indices start at + * index 0 + * \returns 1 if the specified button is pressed, 0 otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumButtons + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, + int button); + +/** + * Start a rumble effect. + * + * Each call to this function cancels any previous rumble effect, and calling + * it with 0 intensity stops any rumbling. + * + * \param joystick The joystick to vibrate + * \param low_frequency_rumble The intensity of the low frequency (left) + * rumble motor, from 0 to 0xFFFF + * \param high_frequency_rumble The intensity of the high frequency (right) + * rumble motor, from 0 to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if rumble isn't supported on this joystick + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_JoystickHasRumble + */ +extern DECLSPEC int SDLCALL SDL_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); + +/** + * Start a rumble effect in the joystick's triggers + * + * Each call to this function cancels any previous trigger rumble effect, and + * calling it with 0 intensity stops any rumbling. + * + * Note that this is rumbling of the _triggers_ and not the game controller as + * a whole. This is currently only supported on Xbox One controllers. If you + * want the (more common) whole-controller rumble, use SDL_JoystickRumble() + * instead. + * + * \param joystick The joystick to vibrate + * \param left_rumble The intensity of the left trigger rumble motor, from 0 + * to 0xFFFF + * \param right_rumble The intensity of the right trigger rumble motor, from 0 + * to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if trigger rumble isn't supported on this joystick + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_JoystickHasRumbleTriggers + */ +extern DECLSPEC int SDLCALL SDL_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); + +/** + * Query whether a joystick has an LED. + * + * An example of a joystick LED is the light on the back of a PlayStation 4's + * DualShock 4 controller. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has a modifiable LED, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasLED(SDL_Joystick *joystick); + +/** + * Query whether a joystick has rumble support. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has rumble, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_JoystickRumble + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasRumble(SDL_Joystick *joystick); + +/** + * Query whether a joystick has rumble support on triggers. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has trigger rumble, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_JoystickRumbleTriggers + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasRumbleTriggers(SDL_Joystick *joystick); + +/** + * Update a joystick's LED color. + * + * An example of a joystick LED is the light on the back of a PlayStation 4's + * DualShock 4 controller. + * + * \param joystick The joystick to update + * \param red The intensity of the red LED + * \param green The intensity of the green LED + * \param blue The intensity of the blue LED + * \returns 0 on success, -1 if this joystick does not have a modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); + +/** + * Send a joystick specific effect packet + * + * \param joystick The joystick to affect + * \param data The data to send to the joystick + * \param size The size of the data to send to the joystick + * \returns 0, or -1 if this joystick or driver doesn't support effect packets + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSendEffect(SDL_Joystick *joystick, const void *data, int size); + +/** + * Close a joystick previously opened with SDL_JoystickOpen(). + * + * \param joystick The joystick device to close + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickOpen + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + +/** + * Get the battery level of a joystick as SDL_JoystickPowerLevel. + * + * \param joystick the SDL_Joystick to query + * \returns the current battery level as SDL_JoystickPowerLevel on success or + * `SDL_JOYSTICK_POWER_UNKNOWN` if it is unknown + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick *joystick); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_joystick_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_keyboard.h b/Thirdparty/SDL2/include/SDL_keyboard.h new file mode 100644 index 0000000..86a37ad --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_keyboard.h @@ -0,0 +1,353 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_keyboard.h + * + * Include file for SDL keyboard event handling + */ + +#ifndef SDL_keyboard_h_ +#define SDL_keyboard_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keycode.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The SDL keysym structure, used in key events. + * + * \note If you are looking for translated character input, see the ::SDL_TEXTINPUT event. + */ +typedef struct SDL_Keysym +{ + SDL_Scancode scancode; /**< SDL physical key code - see ::SDL_Scancode for details */ + SDL_Keycode sym; /**< SDL virtual key code - see ::SDL_Keycode for details */ + Uint16 mod; /**< current key modifiers */ + Uint32 unused; +} SDL_Keysym; + +/* Function prototypes */ + +/** + * Query the window which currently has keyboard focus. + * + * \returns the window with keyboard focus. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); + +/** + * Get a snapshot of the current state of the keyboard. + * + * The pointer returned is a pointer to an internal SDL array. It will be + * valid for the whole lifetime of the application and should not be freed by + * the caller. + * + * A array element with a value of 1 means that the key is pressed and a value + * of 0 means that it is not. Indexes into this array are obtained by using + * SDL_Scancode values. + * + * Use SDL_PumpEvents() to update the state array. + * + * This function gives you the current state after all events have been + * processed, so if a key or button has been pressed and released before you + * process events, then the pressed state will never show up in the + * SDL_GetKeyboardState() calls. + * + * Note: This function doesn't take into account whether shift has been + * pressed or not. + * + * \param numkeys if non-NULL, receives the length of the returned array + * \returns a pointer to an array of key states. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PumpEvents + * \sa SDL_ResetKeyboard + */ +extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); + +/** + * Clear the state of the keyboard + * + * This function will generate key up events for all pressed keys. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetKeyboardState + */ +extern DECLSPEC void SDLCALL SDL_ResetKeyboard(void); + +/** + * Get the current key modifier state for the keyboard. + * + * \returns an OR'd combination of the modifier keys for the keyboard. See + * SDL_Keymod for details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyboardState + * \sa SDL_SetModState + */ +extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state for the keyboard. + * + * The inverse of SDL_GetModState(), SDL_SetModState() allows you to impose + * modifier key states on your application. Simply pass your desired modifier + * states into `modstate`. This value may be a bitwise, OR'd combination of + * SDL_Keymod values. + * + * This does not change the keyboard state, only the key modifier flags that + * SDL reports. + * + * \param modstate the desired SDL_Keymod for the keyboard + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetModState + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); + +/** + * Get the key code corresponding to the given scancode according to the + * current keyboard layout. + * + * See SDL_Keycode for details. + * + * \param scancode the desired SDL_Scancode to query + * \returns the SDL_Keycode that corresponds to the given SDL_Scancode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyName + * \sa SDL_GetScancodeFromKey + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode); + +/** + * Get the scancode corresponding to the given key code according to the + * current keyboard layout. + * + * See SDL_Scancode for details. + * + * \param key the desired SDL_Keycode to query + * \returns the SDL_Scancode that corresponds to the given SDL_Keycode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetScancodeName + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key); + +/** + * Get a human-readable name for a scancode. + * + * See SDL_Scancode for details. + * + * **Warning**: The returned name is by design not stable across platforms, + * e.g. the name for `SDL_SCANCODE_LGUI` is "Left GUI" under Linux but "Left + * Windows" under Microsoft Windows, and some scancodes like + * `SDL_SCANCODE_NONUSBACKSLASH` don't have any name at all. There are even + * scancodes that share names, e.g. `SDL_SCANCODE_RETURN` and + * `SDL_SCANCODE_RETURN2` (both called "Return"). This function is therefore + * unsuitable for creating a stable cross-platform two-way mapping between + * strings and scancodes. + * + * \param scancode the desired SDL_Scancode to query + * \returns a pointer to the name for the scancode. If the scancode doesn't + * have a name this function returns an empty string (""). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetScancodeFromKey + * \sa SDL_GetScancodeFromName + */ +extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); + +/** + * Get a scancode from a human-readable name. + * + * \param name the human-readable scancode name + * \returns the SDL_Scancode, or `SDL_SCANCODE_UNKNOWN` if the name wasn't + * recognized; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromName + * \sa SDL_GetScancodeFromKey + * \sa SDL_GetScancodeName + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name); + +/** + * Get a human-readable name for a key. + * + * See SDL_Scancode and SDL_Keycode for details. + * + * \param key the desired SDL_Keycode to query + * \returns a pointer to a UTF-8 string that stays valid at least until the + * next call to this function. If you need it around any longer, you + * must copy it. If the key doesn't have a name, this function + * returns an empty string (""). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromName + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetScancodeFromKey + */ +extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); + +/** + * Get a key code from a human-readable name. + * + * \param name the human-readable key name + * \returns key code, or `SDLK_UNKNOWN` if the name wasn't recognized; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetKeyName + * \sa SDL_GetScancodeFromName + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); + +/** + * Start accepting Unicode text input events. + * + * This function will start accepting Unicode text input events in the focused + * SDL window, and start emitting SDL_TextInputEvent (SDL_TEXTINPUT) and + * SDL_TextEditingEvent (SDL_TEXTEDITING) events. Please use this function in + * pair with SDL_StopTextInput(). + * + * On some platforms using this function activates the screen keyboard. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetTextInputRect + * \sa SDL_StopTextInput + */ +extern DECLSPEC void SDLCALL SDL_StartTextInput(void); + +/** + * Check whether or not Unicode text input events are enabled. + * + * \returns SDL_TRUE if text input events are enabled else SDL_FALSE. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void); + +/** + * Stop receiving any text input events. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC void SDLCALL SDL_StopTextInput(void); + +/** + * Dismiss the composition window/IME without disabling the subsystem. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_StartTextInput + * \sa SDL_StopTextInput + */ +extern DECLSPEC void SDLCALL SDL_ClearComposition(void); + +/** + * Returns if an IME Composite or Candidate window is currently shown. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputShown(void); + +/** + * Set the rectangle used to type Unicode text inputs. + * + * To start text input in a given location, this function is intended to be + * called before SDL_StartTextInput, although some platforms support moving + * the rectangle even while text input (and a composition) is active. + * + * Note: If you want to use the system native IME window, try setting hint + * **SDL_HINT_IME_SHOW_UI** to **1**, otherwise this function won't give you + * any feedback. + * + * \param rect the SDL_Rect structure representing the rectangle to receive + * text (ignored if NULL) + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC void SDLCALL SDL_SetTextInputRect(const SDL_Rect *rect); + +/** + * Check whether the platform has screen keyboard support. + * + * \returns SDL_TRUE if the platform has some screen keyboard support or + * SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + * \sa SDL_IsScreenKeyboardShown + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); + +/** + * Check whether the screen keyboard is shown for given window. + * + * \param window the window for which screen keyboard should be queried + * \returns SDL_TRUE if screen keyboard is shown or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasScreenKeyboardSupport + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_keyboard_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_keycode.h b/Thirdparty/SDL2/include/SDL_keycode.h new file mode 100644 index 0000000..7106223 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_keycode.h @@ -0,0 +1,358 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_keycode.h + * + * Defines constants which identify keyboard keys and modifiers. + */ + +#ifndef SDL_keycode_h_ +#define SDL_keycode_h_ + +#include "SDL_stdinc.h" +#include "SDL_scancode.h" + +/** + * \brief The SDL virtual key representation. + * + * Values of this type are used to represent keyboard keys using the current + * layout of the keyboard. These values include Unicode values representing + * the unmodified character that would be generated by pressing the key, or + * an SDLK_* constant for those keys that do not generate characters. + * + * A special exception is the number keys at the top of the keyboard which + * map to SDLK_0...SDLK_9 on AZERTY layouts. + */ +typedef Sint32 SDL_Keycode; + +#define SDLK_SCANCODE_MASK (1<<30) +#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) + +typedef enum +{ + SDLK_UNKNOWN = 0, + + SDLK_RETURN = '\r', + SDLK_ESCAPE = '\x1B', + SDLK_BACKSPACE = '\b', + SDLK_TAB = '\t', + SDLK_SPACE = ' ', + SDLK_EXCLAIM = '!', + SDLK_QUOTEDBL = '"', + SDLK_HASH = '#', + SDLK_PERCENT = '%', + SDLK_DOLLAR = '$', + SDLK_AMPERSAND = '&', + SDLK_QUOTE = '\'', + SDLK_LEFTPAREN = '(', + SDLK_RIGHTPAREN = ')', + SDLK_ASTERISK = '*', + SDLK_PLUS = '+', + SDLK_COMMA = ',', + SDLK_MINUS = '-', + SDLK_PERIOD = '.', + SDLK_SLASH = '/', + SDLK_0 = '0', + SDLK_1 = '1', + SDLK_2 = '2', + SDLK_3 = '3', + SDLK_4 = '4', + SDLK_5 = '5', + SDLK_6 = '6', + SDLK_7 = '7', + SDLK_8 = '8', + SDLK_9 = '9', + SDLK_COLON = ':', + SDLK_SEMICOLON = ';', + SDLK_LESS = '<', + SDLK_EQUALS = '=', + SDLK_GREATER = '>', + SDLK_QUESTION = '?', + SDLK_AT = '@', + + /* + Skip uppercase letters + */ + + SDLK_LEFTBRACKET = '[', + SDLK_BACKSLASH = '\\', + SDLK_RIGHTBRACKET = ']', + SDLK_CARET = '^', + SDLK_UNDERSCORE = '_', + SDLK_BACKQUOTE = '`', + SDLK_a = 'a', + SDLK_b = 'b', + SDLK_c = 'c', + SDLK_d = 'd', + SDLK_e = 'e', + SDLK_f = 'f', + SDLK_g = 'g', + SDLK_h = 'h', + SDLK_i = 'i', + SDLK_j = 'j', + SDLK_k = 'k', + SDLK_l = 'l', + SDLK_m = 'm', + SDLK_n = 'n', + SDLK_o = 'o', + SDLK_p = 'p', + SDLK_q = 'q', + SDLK_r = 'r', + SDLK_s = 's', + SDLK_t = 't', + SDLK_u = 'u', + SDLK_v = 'v', + SDLK_w = 'w', + SDLK_x = 'x', + SDLK_y = 'y', + SDLK_z = 'z', + + SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK), + + SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1), + SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2), + SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3), + SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4), + SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5), + SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6), + SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7), + SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8), + SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9), + SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10), + SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11), + SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12), + + SDLK_PRINTSCREEN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN), + SDLK_SCROLLLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK), + SDLK_PAUSE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE), + SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT), + SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME), + SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP), + SDLK_DELETE = '\x7F', + SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END), + SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN), + SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT), + SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT), + SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN), + SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP), + + SDLK_NUMLOCKCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR), + SDLK_KP_DIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE), + SDLK_KP_MULTIPLY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY), + SDLK_KP_MINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS), + SDLK_KP_PLUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS), + SDLK_KP_ENTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER), + SDLK_KP_1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1), + SDLK_KP_2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2), + SDLK_KP_3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3), + SDLK_KP_4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4), + SDLK_KP_5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5), + SDLK_KP_6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6), + SDLK_KP_7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7), + SDLK_KP_8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8), + SDLK_KP_9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9), + SDLK_KP_0 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0), + SDLK_KP_PERIOD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD), + + SDLK_APPLICATION = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION), + SDLK_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER), + SDLK_KP_EQUALS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS), + SDLK_F13 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13), + SDLK_F14 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14), + SDLK_F15 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15), + SDLK_F16 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16), + SDLK_F17 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17), + SDLK_F18 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18), + SDLK_F19 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19), + SDLK_F20 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20), + SDLK_F21 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21), + SDLK_F22 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22), + SDLK_F23 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23), + SDLK_F24 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24), + SDLK_EXECUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE), + SDLK_HELP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP), + SDLK_MENU = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU), + SDLK_SELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT), + SDLK_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP), + SDLK_AGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN), + SDLK_UNDO = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO), + SDLK_CUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT), + SDLK_COPY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY), + SDLK_PASTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE), + SDLK_FIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND), + SDLK_MUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE), + SDLK_VOLUMEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP), + SDLK_VOLUMEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN), + SDLK_KP_COMMA = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA), + SDLK_KP_EQUALSAS400 = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400), + + SDLK_ALTERASE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE), + SDLK_SYSREQ = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ), + SDLK_CANCEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL), + SDLK_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR), + SDLK_PRIOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR), + SDLK_RETURN2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2), + SDLK_SEPARATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR), + SDLK_OUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT), + SDLK_OPER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER), + SDLK_CLEARAGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN), + SDLK_CRSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL), + SDLK_EXSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL), + + SDLK_KP_00 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00), + SDLK_KP_000 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000), + SDLK_THOUSANDSSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR), + SDLK_DECIMALSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR), + SDLK_CURRENCYUNIT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT), + SDLK_CURRENCYSUBUNIT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT), + SDLK_KP_LEFTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN), + SDLK_KP_RIGHTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN), + SDLK_KP_LEFTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE), + SDLK_KP_RIGHTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE), + SDLK_KP_TAB = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB), + SDLK_KP_BACKSPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE), + SDLK_KP_A = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A), + SDLK_KP_B = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B), + SDLK_KP_C = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C), + SDLK_KP_D = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D), + SDLK_KP_E = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E), + SDLK_KP_F = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F), + SDLK_KP_XOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR), + SDLK_KP_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER), + SDLK_KP_PERCENT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT), + SDLK_KP_LESS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS), + SDLK_KP_GREATER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER), + SDLK_KP_AMPERSAND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND), + SDLK_KP_DBLAMPERSAND = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND), + SDLK_KP_VERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR), + SDLK_KP_DBLVERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR), + SDLK_KP_COLON = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON), + SDLK_KP_HASH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH), + SDLK_KP_SPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE), + SDLK_KP_AT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT), + SDLK_KP_EXCLAM = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM), + SDLK_KP_MEMSTORE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE), + SDLK_KP_MEMRECALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL), + SDLK_KP_MEMCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR), + SDLK_KP_MEMADD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD), + SDLK_KP_MEMSUBTRACT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT), + SDLK_KP_MEMMULTIPLY = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY), + SDLK_KP_MEMDIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE), + SDLK_KP_PLUSMINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS), + SDLK_KP_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR), + SDLK_KP_CLEARENTRY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY), + SDLK_KP_BINARY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY), + SDLK_KP_OCTAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL), + SDLK_KP_DECIMAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL), + SDLK_KP_HEXADECIMAL = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL), + + SDLK_LCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL), + SDLK_LSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT), + SDLK_LALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT), + SDLK_LGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI), + SDLK_RCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL), + SDLK_RSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT), + SDLK_RALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT), + SDLK_RGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI), + + SDLK_MODE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE), + + SDLK_AUDIONEXT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIONEXT), + SDLK_AUDIOPREV = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPREV), + SDLK_AUDIOSTOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOSTOP), + SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY), + SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE), + SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT), + SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW), + SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL), + SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR), + SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER), + SDLK_AC_SEARCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH), + SDLK_AC_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME), + SDLK_AC_BACK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK), + SDLK_AC_FORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD), + SDLK_AC_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP), + SDLK_AC_REFRESH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH), + SDLK_AC_BOOKMARKS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS), + + SDLK_BRIGHTNESSDOWN = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSDOWN), + SDLK_BRIGHTNESSUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSUP), + SDLK_DISPLAYSWITCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DISPLAYSWITCH), + SDLK_KBDILLUMTOGGLE = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMTOGGLE), + SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN), + SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP), + SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT), + SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP), + SDLK_APP1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP1), + SDLK_APP2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP2), + + SDLK_AUDIOREWIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOREWIND), + SDLK_AUDIOFASTFORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOFASTFORWARD), + + SDLK_SOFTLEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT), + SDLK_SOFTRIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT), + SDLK_CALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL), + SDLK_ENDCALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) +} SDL_KeyCode; + +/** + * \brief Enumeration of valid key mods (possibly OR'd together). + */ +typedef enum +{ + KMOD_NONE = 0x0000, + KMOD_LSHIFT = 0x0001, + KMOD_RSHIFT = 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LGUI = 0x0400, + KMOD_RGUI = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_SCROLL = 0x8000, + + KMOD_CTRL = KMOD_LCTRL | KMOD_RCTRL, + KMOD_SHIFT = KMOD_LSHIFT | KMOD_RSHIFT, + KMOD_ALT = KMOD_LALT | KMOD_RALT, + KMOD_GUI = KMOD_LGUI | KMOD_RGUI, + + KMOD_RESERVED = KMOD_SCROLL /* This is for source-level compatibility with SDL 2.0.0. */ +} SDL_Keymod; + +#endif /* SDL_keycode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_loadso.h b/Thirdparty/SDL2/include/SDL_loadso.h new file mode 100644 index 0000000..ca59b68 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_loadso.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_loadso.h + * + * System dependent library loading routines + * + * Some things to keep in mind: + * \li These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * \li Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * \li Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + +#ifndef SDL_loadso_h_ +#define SDL_loadso_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Dynamically load a shared object. + * + * \param sofile a system-dependent name of the object file + * \returns an opaque pointer to the object handle or NULL if there was an + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadFunction + * \sa SDL_UnloadObject + */ +extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Look up the address of the named function in a shared object. + * + * This function pointer is no longer valid after calling SDL_UnloadObject(). + * + * This function can only look up C function names. Other languages may have + * name mangling and intrinsic language support that varies from compiler to + * compiler. + * + * Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * + * If the requested function doesn't exist, NULL is returned. + * + * \param handle a valid shared object handle returned by SDL_LoadObject() + * \param name the name of the function to look up + * \returns a pointer to the function or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadObject + * \sa SDL_UnloadObject + */ +extern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, + const char *name); + +/** + * Unload a shared object from memory. + * + * \param handle a valid shared object handle returned by SDL_LoadObject() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadFunction + * \sa SDL_LoadObject + */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_loadso_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_locale.h b/Thirdparty/SDL2/include/SDL_locale.h new file mode 100644 index 0000000..482dbef --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_locale.h @@ -0,0 +1,103 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_locale.h + * + * Include file for SDL locale services + */ + +#ifndef _SDL_locale_h +#define _SDL_locale_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + + +typedef struct SDL_Locale +{ + const char *language; /**< A language name, like "en" for English. */ + const char *country; /**< A country, like "US" for America. Can be NULL. */ +} SDL_Locale; + +/** + * Report the user's preferred locale. + * + * This returns an array of SDL_Locale structs, the final item zeroed out. + * When the caller is done with this array, it should call SDL_free() on the + * returned value; all the memory involved is allocated in a single block, so + * a single SDL_free() will suffice. + * + * Returned language strings are in the format xx, where 'xx' is an ISO-639 + * language specifier (such as "en" for English, "de" for German, etc). + * Country strings are in the format YY, where "YY" is an ISO-3166 country + * code (such as "US" for the United States, "CA" for Canada, etc). Country + * might be NULL if there's no specific guidance on them (so you might get { + * "en", "US" } for American English, but { "en", NULL } means "English + * language, generically"). Language strings are never NULL, except to + * terminate the array. + * + * Please note that not all of these strings are 2 characters; some are three + * or more. + * + * The returned list of locales are in the order of the user's preference. For + * example, a German citizen that is fluent in US English and knows enough + * Japanese to navigate around Tokyo might have a list like: { "de", "en_US", + * "jp", NULL }. Someone from England might prefer British English (where + * "color" is spelled "colour", etc), but will settle for anything like it: { + * "en_GB", "en", NULL }. + * + * This function returns NULL on error, including when the platform does not + * supply this information at all. + * + * This might be a "slow" call that has to query the operating system. It's + * best to ask for this once and save the results. However, this list can + * change, usually because the user has changed a system preference outside of + * your program; SDL will send an SDL_LOCALECHANGED event in this case, if + * possible, and you can call this function again to get an updated copy of + * preferred locales. + * + * \return array of locales, terminated with a locale with a NULL language + * field. Will return NULL on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_Locale * SDLCALL SDL_GetPreferredLocales(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* _SDL_locale_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_log.h b/Thirdparty/SDL2/include/SDL_log.h new file mode 100644 index 0000000..da733c4 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_log.h @@ -0,0 +1,404 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_log.h + * + * Simple log messages with categories and priorities. + * + * By default logs are quiet, but if you're debugging SDL you might want: + * + * SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN); + * + * Here's where the messages go on different platforms: + * Windows: debug output stream + * Android: log output + * Others: standard error output (stderr) + */ + +#ifndef SDL_log_h_ +#define SDL_log_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief The maximum size of a log message prior to SDL 2.0.24 + * + * As of 2.0.24 there is no limit to the length of SDL log messages. + */ +#define SDL_MAX_LOG_MESSAGE 4096 + +/** + * \brief The predefined log categories + * + * By default the application category is enabled at the INFO level, + * the assert category is enabled at the WARN level, test is enabled + * at the VERBOSE level and all other categories are enabled at the + * CRITICAL level. + */ +typedef enum +{ + SDL_LOG_CATEGORY_APPLICATION, + SDL_LOG_CATEGORY_ERROR, + SDL_LOG_CATEGORY_ASSERT, + SDL_LOG_CATEGORY_SYSTEM, + SDL_LOG_CATEGORY_AUDIO, + SDL_LOG_CATEGORY_VIDEO, + SDL_LOG_CATEGORY_RENDER, + SDL_LOG_CATEGORY_INPUT, + SDL_LOG_CATEGORY_TEST, + + /* Reserved for future SDL library use */ + SDL_LOG_CATEGORY_RESERVED1, + SDL_LOG_CATEGORY_RESERVED2, + SDL_LOG_CATEGORY_RESERVED3, + SDL_LOG_CATEGORY_RESERVED4, + SDL_LOG_CATEGORY_RESERVED5, + SDL_LOG_CATEGORY_RESERVED6, + SDL_LOG_CATEGORY_RESERVED7, + SDL_LOG_CATEGORY_RESERVED8, + SDL_LOG_CATEGORY_RESERVED9, + SDL_LOG_CATEGORY_RESERVED10, + + /* Beyond this point is reserved for application use, e.g. + enum { + MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM, + MYAPP_CATEGORY_AWESOME2, + MYAPP_CATEGORY_AWESOME3, + ... + }; + */ + SDL_LOG_CATEGORY_CUSTOM +} SDL_LogCategory; + +/** + * \brief The predefined log priorities + */ +typedef enum +{ + SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_DEBUG, + SDL_LOG_PRIORITY_INFO, + SDL_LOG_PRIORITY_WARN, + SDL_LOG_PRIORITY_ERROR, + SDL_LOG_PRIORITY_CRITICAL, + SDL_NUM_LOG_PRIORITIES +} SDL_LogPriority; + + +/** + * Set the priority of all log categories. + * + * \param priority the SDL_LogPriority to assign + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetPriority + */ +extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority); + +/** + * Set the priority of a particular log category. + * + * \param category the category to assign a priority to + * \param priority the SDL_LogPriority to assign + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogGetPriority + * \sa SDL_LogSetAllPriority + */ +extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category, + SDL_LogPriority priority); + +/** + * Get the priority of a particular log category. + * + * \param category the category to query + * \returns the SDL_LogPriority for the requested category + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetPriority + */ +extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category); + +/** + * Reset all priorities to default. + * + * This is called by SDL_Quit(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetAllPriority + * \sa SDL_LogSetPriority + */ +extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); + +/** + * Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO. + * + * = * \param fmt a printf() style message format string + * + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Log a message with SDL_LOG_PRIORITY_VERBOSE. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_DEBUG. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_INFO. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_WARN. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + */ +extern DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_ERROR. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_CRITICAL. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with the specified category and priority. + * + * \param category the category of the message + * \param priority the priority of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogMessage(int category, + SDL_LogPriority priority, + SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3); + +/** + * Log a message with the specified category and priority. + * + * \param category the category of the message + * \param priority the priority of the message + * \param fmt a printf() style message format string + * \param ap a variable argument list + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogMessageV(int category, + SDL_LogPriority priority, + const char *fmt, va_list ap); + +/** + * The prototype for the log output callback function. + * + * This function is called by SDL when there is new text to be logged. + * + * \param userdata what was passed as `userdata` to SDL_LogSetOutputFunction() + * \param category the category of the message + * \param priority the priority of the message + * \param message the message being output + */ +typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); + +/** + * Get the current log output function. + * + * \param callback an SDL_LogOutputFunction filled in with the current log + * callback + * \param userdata a pointer filled in with the pointer that is passed to + * `callback` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetOutputFunction + */ +extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata); + +/** + * Replace the default log output function with one of your own. + * + * \param callback an SDL_LogOutputFunction to call instead of the default + * \param userdata a pointer that is passed to `callback` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogGetOutputFunction + */ +extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_log_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_main.h b/Thirdparty/SDL2/include/SDL_main.h new file mode 100644 index 0000000..5cc8e59 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_main.h @@ -0,0 +1,282 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_main_h_ +#define SDL_main_h_ + +#include "SDL_stdinc.h" + +/** + * \file SDL_main.h + * + * Redefine main() on some platforms so that it is called by SDL. + */ + +#ifndef SDL_MAIN_HANDLED +#if defined(__WIN32__) +/* On Windows SDL provides WinMain(), which parses the command line and passes + the arguments to your main function. + + If you provide your own WinMain(), you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__WINRT__) +/* On WinRT, SDL provides a main function that initializes CoreApplication, + creating an instance of IFrameworkView in the process. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. In non-XAML apps, the file, + src/main/winrt/SDL_WinRT_main_NonXAML.cpp, or a copy of it, must be compiled + into the app itself. In XAML apps, the function, SDL_WinRTRunApp must be + called, with a pointer to the Direct3D-hosted XAML control passed in. +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__GDK__) +/* On GDK, SDL provides a main function that initializes the game runtime. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. You must either link against SDL2main or, if not possible, + call the SDL_GDKRunApp function from your entry point. +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__IPHONEOS__) +/* On iOS SDL provides a main function that creates an application delegate + and starts the iOS application run loop. + + If you link with SDL dynamically on iOS, the main function can't be in a + shared library, so you need to link with libSDLmain.a, which includes a + stub main function that calls into the shared library to start execution. + + See src/video/uikit/SDL_uikitappdelegate.m for more details. + */ +#define SDL_MAIN_NEEDED + +#elif defined(__ANDROID__) +/* On Android SDL provides a Java class in SDLActivity.java that is the + main activity entry point. + + See docs/README-android.md for more details on extending that class. + */ +#define SDL_MAIN_NEEDED + +/* We need to export SDL_main so it can be launched from Java */ +#define SDLMAIN_DECLSPEC DECLSPEC + +#elif defined(__NACL__) +/* On NACL we use ppapi_simple to set up the application helper code, + then wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before + starting the user main function. + All user code is run in a separate thread by ppapi_simple, thus + allowing for blocking io to take place via nacl_io +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__PSP__) +/* On PSP SDL provides a main function that sets the module info, + activates the GPU and starts the thread required to be able to exit + the software. + + If you provide this yourself, you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__PS2__) +#define SDL_MAIN_AVAILABLE + +#define SDL_PS2_SKIP_IOP_RESET() \ + void reset_IOP(); \ + void reset_IOP() {} + +#elif defined(__3DS__) +/* + On N3DS, SDL provides a main function that sets up the screens + and storage. + + If you provide this yourself, you may define SDL_MAIN_HANDLED +*/ +#define SDL_MAIN_AVAILABLE + +#endif +#endif /* SDL_MAIN_HANDLED */ + +#ifndef SDLMAIN_DECLSPEC +#define SDLMAIN_DECLSPEC +#endif + +/** + * \file SDL_main.h + * + * The application's main() function must be called with C linkage, + * and should be declared like this: + * \code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * \endcode + */ + +#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) +#define main SDL_main +#endif + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The prototype for the application's main() function + */ +typedef int (*SDL_main_func)(int argc, char *argv[]); +extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]); + + +/** + * Circumvent failure of SDL_Init() when not using SDL_main() as an entry + * point. + * + * This function is defined in SDL_main.h, along with the preprocessor rule to + * redefine main() as SDL_main(). Thus to ensure that your main() function + * will not be changed it is necessary to define SDL_MAIN_HANDLED before + * including SDL.h. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + */ +extern DECLSPEC void SDLCALL SDL_SetMainReady(void); + +#if defined(__WIN32__) || defined(__GDK__) + +/** + * Register a win32 window class for SDL's use. + * + * This can be called to set the application window class at startup. It is + * safe to call this multiple times, as long as every call is eventually + * paired with a call to SDL_UnregisterApp, but a second registration attempt + * while a previous registration is still active will be ignored, other than + * to increment a counter. + * + * Most applications do not need to, and should not, call this directly; SDL + * will call it when initializing the video subsystem. + * + * \param name the window class name, in UTF-8 encoding. If NULL, SDL + * currently uses "SDL_app" but this isn't guaranteed. + * \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL + * currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of + * what is specified here. + * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL + * will use `GetModuleHandle(NULL)` instead. + * \returns 0 on success, -1 on error. SDL_GetError() may have details. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); + +/** + * Deregister the win32 window class from an SDL_RegisterApp call. + * + * This can be called to undo the effects of SDL_RegisterApp. + * + * Most applications do not need to, and should not, call this directly; SDL + * will call it when deinitializing the video subsystem. + * + * It is safe to call this multiple times, as long as every call is eventually + * paired with a prior call to SDL_RegisterApp. The window class will only be + * deregistered when the registration counter in SDL_RegisterApp decrements to + * zero through calls to this function. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + + +#ifdef __WINRT__ + +/** + * Initialize and launch an SDL/WinRT application. + * + * \param mainFunction the SDL app's C-style main(), an SDL_main_func + * \param reserved reserved for future use; should be NULL + * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve + * more information on the failure. + * + * \since This function is available since SDL 2.0.3. + */ +extern DECLSPEC int SDLCALL SDL_WinRTRunApp(SDL_main_func mainFunction, void * reserved); + +#endif /* __WINRT__ */ + +#if defined(__IPHONEOS__) + +/** + * Initializes and launches an SDL application. + * + * \param argc The argc parameter from the application's main() function + * \param argv The argv parameter from the application's main() function + * \param mainFunction The SDL app's C-style main(), an SDL_main_func + * \return the return value from mainFunction + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_UIKitRunApp(int argc, char *argv[], SDL_main_func mainFunction); + +#endif /* __IPHONEOS__ */ + +#ifdef __GDK__ + +/** + * Initialize and launch an SDL GDK application. + * + * \param mainFunction the SDL app's C-style main(), an SDL_main_func + * \param reserved reserved for future use; should be NULL + * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve + * more information on the failure. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved); + +/** + * Callback from the application to let the suspend continue. + * + * \since This function is available since SDL 2.28.0. + */ +extern DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); + +#endif /* __GDK__ */ + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_main_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_messagebox.h b/Thirdparty/SDL2/include/SDL_messagebox.h new file mode 100644 index 0000000..7896fd1 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_messagebox.h @@ -0,0 +1,193 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_messagebox_h_ +#define SDL_messagebox_h_ + +#include "SDL_stdinc.h" +#include "SDL_video.h" /* For SDL_Window */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * SDL_MessageBox flags. If supported will display warning icon, etc. + */ +typedef enum +{ + SDL_MESSAGEBOX_ERROR = 0x00000010, /**< error dialog */ + SDL_MESSAGEBOX_WARNING = 0x00000020, /**< warning dialog */ + SDL_MESSAGEBOX_INFORMATION = 0x00000040, /**< informational dialog */ + SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT = 0x00000080, /**< buttons placed left to right */ + SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT = 0x00000100 /**< buttons placed right to left */ +} SDL_MessageBoxFlags; + +/** + * Flags for SDL_MessageBoxButtonData. + */ +typedef enum +{ + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001, /**< Marks the default button when return is hit */ + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002 /**< Marks the default button when escape is hit */ +} SDL_MessageBoxButtonFlags; + +/** + * Individual button data. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxButtonFlags */ + int buttonid; /**< User defined button id (value returned via SDL_ShowMessageBox) */ + const char * text; /**< The UTF-8 button text */ +} SDL_MessageBoxButtonData; + +/** + * RGB value used in a message box color scheme + */ +typedef struct +{ + Uint8 r, g, b; +} SDL_MessageBoxColor; + +typedef enum +{ + SDL_MESSAGEBOX_COLOR_BACKGROUND, + SDL_MESSAGEBOX_COLOR_TEXT, + SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, + SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, + SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, + SDL_MESSAGEBOX_COLOR_MAX +} SDL_MessageBoxColorType; + +/** + * A set of colors to use for message box dialogs + */ +typedef struct +{ + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; +} SDL_MessageBoxColorScheme; + +/** + * MessageBox structure containing title, text, window, etc. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxFlags */ + SDL_Window *window; /**< Parent window, can be NULL */ + const char *title; /**< UTF-8 title */ + const char *message; /**< UTF-8 message text */ + + int numbuttons; + const SDL_MessageBoxButtonData *buttons; + + const SDL_MessageBoxColorScheme *colorScheme; /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */ +} SDL_MessageBoxData; + +/** + * Create a modal message box. + * + * If your needs aren't complex, it might be easier to use + * SDL_ShowSimpleMessageBox. + * + * This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or closes the + * messagebox. + * + * This function may be called at any time, even before SDL_Init(). This makes + * it useful for reporting errors like a failure to create a renderer or + * OpenGL context. + * + * On X11, SDL rolls its own dialog box with X11 primitives instead of a + * formal toolkit like GTK+ or Qt. + * + * Note that if SDL_Init() would fail because there isn't any available video + * target, this function is likely to fail for the same reasons. If this is a + * concern, check the return value from this function and fall back to writing + * to stderr if you can. + * + * \param messageboxdata the SDL_MessageBoxData structure with title, text and + * other options + * \param buttonid the pointer to which user id of hit button should be copied + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowSimpleMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +/** + * Display a simple modal message box. + * + * If your needs aren't complex, this function is preferred over + * SDL_ShowMessageBox. + * + * `flags` may be any of the following: + * + * - `SDL_MESSAGEBOX_ERROR`: error dialog + * - `SDL_MESSAGEBOX_WARNING`: warning dialog + * - `SDL_MESSAGEBOX_INFORMATION`: informational dialog + * + * This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or closes the + * messagebox. + * + * This function may be called at any time, even before SDL_Init(). This makes + * it useful for reporting errors like a failure to create a renderer or + * OpenGL context. + * + * On X11, SDL rolls its own dialog box with X11 primitives instead of a + * formal toolkit like GTK+ or Qt. + * + * Note that if SDL_Init() would fail because there isn't any available video + * target, this function is likely to fail for the same reasons. If this is a + * concern, check the return value from this function and fall back to writing + * to stderr if you can. + * + * \param flags an SDL_MessageBoxFlags value + * \param title UTF-8 title text + * \param message UTF-8 message text + * \param window the parent window, or NULL for no parent + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_messagebox_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_metal.h b/Thirdparty/SDL2/include/SDL_metal.h new file mode 100644 index 0000000..f36e348 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_metal.h @@ -0,0 +1,113 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_metal.h + * + * Header file for functions to creating Metal layers and views on SDL windows. + */ + +#ifndef SDL_metal_h_ +#define SDL_metal_h_ + +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS). + * + * \note This can be cast directly to an NSView or UIView. + */ +typedef void *SDL_MetalView; + +/** + * \name Metal support functions + */ +/* @{ */ + +/** + * Create a CAMetalLayer-backed NSView/UIView and attach it to the specified + * window. + * + * On macOS, this does *not* associate a MTLDevice with the CAMetalLayer on + * its own. It is up to user code to do that. + * + * The returned handle can be casted directly to a NSView or UIView. To access + * the backing CAMetalLayer, call SDL_Metal_GetLayer(). + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_Metal_DestroyView + * \sa SDL_Metal_GetLayer + */ +extern DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window * window); + +/** + * Destroy an existing SDL_MetalView object. + * + * This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was + * called after SDL_CreateWindow. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_Metal_CreateView + */ +extern DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); + +/** + * Get a pointer to the backing CAMetalLayer for the given view. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_Metal_CreateView + */ +extern DECLSPEC void *SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); + +/** + * Get the size of a window's underlying drawable in pixels (for use with + * setting viewport, scissor & etc). + * + * \param window SDL_Window from which the drawable size should be queried + * \param w Pointer to variable for storing the width in pixels, may be NULL + * \param h Pointer to variable for storing the height in pixels, may be NULL + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GetWindowSize + * \sa SDL_CreateWindow + */ +extern DECLSPEC void SDLCALL SDL_Metal_GetDrawableSize(SDL_Window* window, int *w, + int *h); + +/* @} *//* Metal support functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_metal_h_ */ diff --git a/Thirdparty/SDL2/include/SDL_misc.h b/Thirdparty/SDL2/include/SDL_misc.h new file mode 100644 index 0000000..13ed9c7 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_misc.h @@ -0,0 +1,79 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_misc.h + * + * \brief Include file for SDL API functions that don't fit elsewhere. + */ + +#ifndef SDL_misc_h_ +#define SDL_misc_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Open a URL/URI in the browser or other appropriate external application. + * + * Open a URL in a separate, system-provided application. How this works will + * vary wildly depending on the platform. This will likely launch what makes + * sense to handle a specific URL's protocol (a web browser for `http://`, + * etc), but it might also be able to launch file managers for directories and + * other things. + * + * What happens when you open a URL varies wildly as well: your game window + * may lose focus (and may or may not lose focus if your game was fullscreen + * or grabbing input at the time). On mobile devices, your app will likely + * move to the background or your process might be paused. Any given platform + * may or may not handle a given URL. + * + * If this is unimplemented (or simply unavailable) for a platform, this will + * fail with an error. A successful result does not mean the URL loaded, just + * that we launched _something_ to handle it (or at least believe we did). + * + * All this to say: this function can be useful, but you should definitely + * test it on every platform you target. + * + * \param url A valid URL/URI to open. Use `file:///full/path/to/file` for + * local files, if supported. + * \returns 0 on success, or -1 on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_OpenURL(const char *url); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_misc_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_mouse.h b/Thirdparty/SDL2/include/SDL_mouse.h new file mode 100644 index 0000000..aa07575 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_mouse.h @@ -0,0 +1,464 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_mouse.h + * + * Include file for SDL mouse event handling. + */ + +#ifndef SDL_mouse_h_ +#define SDL_mouse_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SDL_Cursor SDL_Cursor; /**< Implementation dependent */ + +/** + * \brief Cursor types for SDL_CreateSystemCursor(). + */ +typedef enum +{ + SDL_SYSTEM_CURSOR_ARROW, /**< Arrow */ + SDL_SYSTEM_CURSOR_IBEAM, /**< I-beam */ + SDL_SYSTEM_CURSOR_WAIT, /**< Wait */ + SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair */ + SDL_SYSTEM_CURSOR_WAITARROW, /**< Small wait cursor (or Wait if not available) */ + SDL_SYSTEM_CURSOR_SIZENWSE, /**< Double arrow pointing northwest and southeast */ + SDL_SYSTEM_CURSOR_SIZENESW, /**< Double arrow pointing northeast and southwest */ + SDL_SYSTEM_CURSOR_SIZEWE, /**< Double arrow pointing west and east */ + SDL_SYSTEM_CURSOR_SIZENS, /**< Double arrow pointing north and south */ + SDL_SYSTEM_CURSOR_SIZEALL, /**< Four pointed arrow pointing north, south, east, and west */ + SDL_SYSTEM_CURSOR_NO, /**< Slashed circle or crossbones */ + SDL_SYSTEM_CURSOR_HAND, /**< Hand */ + SDL_NUM_SYSTEM_CURSORS +} SDL_SystemCursor; + +/** + * \brief Scroll direction types for the Scroll event + */ +typedef enum +{ + SDL_MOUSEWHEEL_NORMAL, /**< The scroll direction is normal */ + SDL_MOUSEWHEEL_FLIPPED /**< The scroll direction is flipped / natural */ +} SDL_MouseWheelDirection; + +/* Function prototypes */ + +/** + * Get the window which currently has mouse focus. + * + * \returns the window with mouse focus. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); + +/** + * Retrieve the current state of the mouse. + * + * The current button state is returned as a button bitmask, which can be + * tested using the `SDL_BUTTON(X)` macros (where `X` is generally 1 for the + * left, 2 for middle, 3 for the right button), and `x` and `y` are set to the + * mouse cursor position relative to the focus window. You can pass NULL for + * either `x` or `y`. + * + * \param x the x coordinate of the mouse cursor position relative to the + * focus window + * \param y the y coordinate of the mouse cursor position relative to the + * focus window + * \returns a 32-bit button bitmask of the current button state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetGlobalMouseState + * \sa SDL_GetRelativeMouseState + * \sa SDL_PumpEvents + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Get the current state of the mouse in relation to the desktop. + * + * This works similarly to SDL_GetMouseState(), but the coordinates will be + * reported relative to the top-left of the desktop. This can be useful if you + * need to track the mouse outside of a specific window and SDL_CaptureMouse() + * doesn't fit your needs. For example, it could be useful if you need to + * track the mouse while dragging a window, where coordinates relative to a + * window might not be in sync at all times. + * + * Note: SDL_GetMouseState() returns the mouse position as SDL understands it + * from the last pump of the event queue. This function, however, queries the + * OS for the current mouse position, and as such, might be a slightly less + * efficient function. Unless you know what you're doing and have a good + * reason to use this function, you probably want SDL_GetMouseState() instead. + * + * \param x filled in with the current X coord relative to the desktop; can be + * NULL + * \param y filled in with the current Y coord relative to the desktop; can be + * NULL + * \returns the current button state as a bitmask which can be tested using + * the SDL_BUTTON(X) macros. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_CaptureMouse + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetGlobalMouseState(int *x, int *y); + +/** + * Retrieve the relative state of the mouse. + * + * The current button state is returned as a button bitmask, which can be + * tested using the `SDL_BUTTON(X)` macros (where `X` is generally 1 for the + * left, 2 for middle, 3 for the right button), and `x` and `y` are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState() or since + * event initialization. You can pass NULL for either `x` or `y`. + * + * \param x a pointer filled with the last recorded x coordinate of the mouse + * \param y a pointer filled with the last recorded y coordinate of the mouse + * \returns a 32-bit button bitmask of the relative button state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetMouseState + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Move the mouse cursor to the given position within the window. + * + * This function generates a mouse motion event if relative mode is not + * enabled. If relative mode is enabled, you can force mouse events for the + * warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint. + * + * Note that this function will appear to succeed, but not actually move the + * mouse when used over Microsoft Remote Desktop. + * + * \param window the window to move the mouse into, or NULL for the current + * mouse focus + * \param x the x coordinate within the window + * \param y the y coordinate within the window + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WarpMouseGlobal + */ +extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, + int x, int y); + +/** + * Move the mouse to the given position in global screen space. + * + * This function generates a mouse motion event. + * + * A failure of this function usually means that it is unsupported by a + * platform. + * + * Note that this function will appear to succeed, but not actually move the + * mouse when used over Microsoft Remote Desktop. + * + * \param x the x coordinate + * \param y the y coordinate + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_WarpMouseInWindow + */ +extern DECLSPEC int SDLCALL SDL_WarpMouseGlobal(int x, int y); + +/** + * Set relative mouse mode. + * + * While the mouse is in relative mode, the cursor is hidden, the mouse + * position is constrained to the window, and SDL will report continuous + * relative mouse motion even if the mouse is at the edge of the window. + * + * This function will flush any pending mouse motion. + * + * \param enabled SDL_TRUE to enable relative mode, SDL_FALSE to disable. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * If relative mode is not supported, this returns -1. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRelativeMouseMode + */ +extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); + +/** + * Capture the mouse and to track input outside an SDL window. + * + * Capturing enables your app to obtain mouse events globally, instead of just + * within your window. Not all video targets support this function. When + * capturing is enabled, the current window will get all mouse events, but + * unlike relative mode, no change is made to the cursor and it is not + * restrained to your window. + * + * This function may also deny mouse input to other windows--both those in + * your application and others on the system--so you should use this function + * sparingly, and in small bursts. For example, you might want to track the + * mouse while the user is dragging something, until the user releases a mouse + * button. It is not recommended that you capture the mouse for long periods + * of time, such as the entire time your app is running. For that, you should + * probably use SDL_SetRelativeMouseMode() or SDL_SetWindowGrab(), depending + * on your goals. + * + * While captured, mouse events still report coordinates relative to the + * current (foreground) window, but those coordinates may be outside the + * bounds of the window (including negative values). Capturing is only allowed + * for the foreground window. If the window loses focus while capturing, the + * capture will be disabled automatically. + * + * While capturing is enabled, the current window will have the + * `SDL_WINDOW_MOUSE_CAPTURE` flag set. + * + * Please note that as of SDL 2.0.22, SDL will attempt to "auto capture" the + * mouse while the user is pressing a button; this is to try and make mouse + * behavior more consistent between platforms, and deal with the common case + * of a user dragging the mouse outside of the window. This means that if you + * are calling SDL_CaptureMouse() only to deal with this situation, you no + * longer have to (although it is safe to do so). If this causes problems for + * your app, you can disable auto capture by setting the + * `SDL_HINT_MOUSE_AUTO_CAPTURE` hint to zero. + * + * \param enabled SDL_TRUE to enable capturing, SDL_FALSE to disable. + * \returns 0 on success or -1 if not supported; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetGlobalMouseState + */ +extern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool enabled); + +/** + * Query whether relative mouse mode is enabled. + * + * \returns SDL_TRUE if relative mode is enabled or SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRelativeMouseMode + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void); + +/** + * Create a cursor using the specified bitmap data and mask (in MSB format). + * + * `mask` has to be in MSB (Most Significant Bit) format. + * + * The cursor width (`w`) must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * + * - data=0, mask=1: white + * - data=1, mask=1: black + * - data=0, mask=0: transparent + * - data=1, mask=0: inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + * + * If you want to have a color cursor, or create your cursor from an + * SDL_Surface, you should use SDL_CreateColorCursor(). Alternately, you can + * hide the cursor and draw your own as part of your game's rendering, but it + * will be bound to the framerate. + * + * Also, since SDL 2.0.0, SDL_CreateSystemCursor() is available, which + * provides twelve readily available system cursors to pick from. + * + * \param data the color value for each pixel of the cursor + * \param mask the mask value for each pixel of the cursor + * \param w the width of the cursor + * \param h the height of the cursor + * \param hot_x the X-axis location of the upper left corner of the cursor + * relative to the actual mouse position + * \param hot_y the Y-axis location of the upper left corner of the cursor + * relative to the actual mouse position + * \returns a new cursor with the specified parameters on success or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeCursor + * \sa SDL_SetCursor + * \sa SDL_ShowCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data, + const Uint8 * mask, + int w, int h, int hot_x, + int hot_y); + +/** + * Create a color cursor. + * + * \param surface an SDL_Surface structure representing the cursor image + * \param hot_x the x position of the cursor hot spot + * \param hot_y the y position of the cursor hot spot + * \returns the new cursor on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_FreeCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateColorCursor(SDL_Surface *surface, + int hot_x, + int hot_y); + +/** + * Create a system cursor. + * + * \param id an SDL_SystemCursor enum value + * \returns a cursor on success or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id); + +/** + * Set the active cursor. + * + * This function sets the currently active cursor to the specified one. If the + * cursor is currently visible, the change will be immediately represented on + * the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if + * this is desired for any reason. + * + * \param cursor a cursor to make active + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_GetCursor + * \sa SDL_ShowCursor + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor); + +/** + * Get the active cursor. + * + * This function returns a pointer to the current cursor which is owned by the + * library. It is not necessary to free the cursor with SDL_FreeCursor(). + * + * \returns the active cursor or NULL if there is no mouse. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void); + +/** + * Get the default cursor. + * + * You do not have to call SDL_FreeCursor() on the return value, but it is + * safe to do so. + * + * \returns the default cursor on success or NULL on failure. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSystemCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void); + +/** + * Free a previously-created cursor. + * + * Use this function to free cursor resources created with SDL_CreateCursor(), + * SDL_CreateColorCursor() or SDL_CreateSystemCursor(). + * + * \param cursor the cursor to free + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateColorCursor + * \sa SDL_CreateCursor + * \sa SDL_CreateSystemCursor + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); + +/** + * Toggle whether or not the cursor is shown. + * + * The cursor starts off displayed but can be turned off. Passing `SDL_ENABLE` + * displays the cursor and passing `SDL_DISABLE` hides it. + * + * The current state of the mouse cursor can be queried by passing + * `SDL_QUERY`; either `SDL_DISABLE` or `SDL_ENABLE` will be returned. + * + * \param toggle `SDL_ENABLE` to show the cursor, `SDL_DISABLE` to hide it, + * `SDL_QUERY` to query the current state without changing it. + * \returns `SDL_ENABLE` if the cursor is shown, or `SDL_DISABLE` if the + * cursor is hidden, or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_SetCursor + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/** + * Used as a mask when testing buttons in buttonstate. + * + * - Button 1: Left mouse button + * - Button 2: Middle mouse button + * - Button 3: Right mouse button + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_X1 4 +#define SDL_BUTTON_X2 5 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_mouse_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_mutex.h b/Thirdparty/SDL2/include/SDL_mutex.h new file mode 100644 index 0000000..e679d38 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_mutex.h @@ -0,0 +1,545 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_mutex_h_ +#define SDL_mutex_h_ + +/** + * \file SDL_mutex.h + * + * Functions to provide thread synchronization primitives. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/******************************************************************************/ +/* Enable thread safety attributes only with clang. + * The attributes can be safely erased when compiling with other compilers. + */ +#if defined(SDL_THREAD_SAFETY_ANALYSIS) && \ + defined(__clang__) && (!defined(SWIG)) +#define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) +#else +#define SDL_THREAD_ANNOTATION_ATTRIBUTE__(x) /* no-op */ +#endif + +#define SDL_CAPABILITY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) + +#define SDL_SCOPED_CAPABILITY \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) + +#define SDL_GUARDED_BY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) + +#define SDL_PT_GUARDED_BY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) + +#define SDL_ACQUIRED_BEFORE(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x)) + +#define SDL_ACQUIRED_AFTER(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x)) + +#define SDL_REQUIRES(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(x)) + +#define SDL_REQUIRES_SHARED(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(x)) + +#define SDL_ACQUIRE(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(x)) + +#define SDL_ACQUIRE_SHARED(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(x)) + +#define SDL_RELEASE(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(x)) + +#define SDL_RELEASE_SHARED(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(x)) + +#define SDL_RELEASE_GENERIC(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(release_generic_capability(x)) + +#define SDL_TRY_ACQUIRE(x, y) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(x, y)) + +#define SDL_TRY_ACQUIRE_SHARED(x, y) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(x, y)) + +#define SDL_EXCLUDES(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(x)) + +#define SDL_ASSERT_CAPABILITY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) + +#define SDL_ASSERT_SHARED_CAPABILITY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) + +#define SDL_RETURN_CAPABILITY(x) \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) + +#define SDL_NO_THREAD_SAFETY_ANALYSIS \ + SDL_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) + +/******************************************************************************/ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** + * This is the timeout value which corresponds to never time out. + */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/** + * \name Mutex functions + */ +/* @{ */ + +/* The SDL mutex structure, defined in SDL_sysmutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** + * Create a new mutex. + * + * All newly-created mutexes begin in the _unlocked_ state. + * + * Calls to SDL_LockMutex() will not return while the mutex is locked by + * another thread. See SDL_TryLockMutex() to attempt to lock without blocking. + * + * SDL mutexes are reentrant. + * + * \returns the initialized and unlocked mutex or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroyMutex + * \sa SDL_LockMutex + * \sa SDL_TryLockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void); + +/** + * Lock the mutex. + * + * This will block until the mutex is available, which is to say it is in the + * unlocked state and the OS has chosen the caller as the next thread to lock + * it. Of all threads waiting to lock the mutex, only one may do so at a time. + * + * It is legal for the owning thread to lock an already-locked mutex. It must + * unlock it the same number of times before it is actually made available for + * other threads in the system (this is known as a "recursive mutex"). + * + * \param mutex the mutex to lock + * \return 0, or -1 on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex) SDL_ACQUIRE(mutex); +#define SDL_mutexP(m) SDL_LockMutex(m) + +/** + * Try to lock a mutex without blocking. + * + * This works just like SDL_LockMutex(), but if the mutex is not available, + * this function returns `SDL_MUTEX_TIMEOUT` immediately. + * + * This technique is useful if you need exclusive access to a resource but + * don't want to wait for it, and will return to it to try again later. + * + * \param mutex the mutex to try to lock + * \returns 0, `SDL_MUTEX_TIMEDOUT`, or -1 on error; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateMutex + * \sa SDL_DestroyMutex + * \sa SDL_LockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex) SDL_TRY_ACQUIRE(0, mutex); + +/** + * Unlock the mutex. + * + * It is legal for the owning thread to lock an already-locked mutex. It must + * unlock it the same number of times before it is actually made available for + * other threads in the system (this is known as a "recursive mutex"). + * + * It is an error to unlock a mutex that has not been locked by the current + * thread, and doing so results in undefined behavior. + * + * It is also an error to unlock a mutex that isn't locked at all. + * + * \param mutex the mutex to unlock. + * \returns 0, or -1 on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex) SDL_RELEASE(mutex); +#define SDL_mutexV(m) SDL_UnlockMutex(m) + +/** + * Destroy a mutex created with SDL_CreateMutex(). + * + * This function must be called on any mutex that is no longer needed. Failure + * to destroy a mutex will result in a system memory or resource leak. While + * it is safe to destroy a mutex that is _unlocked_, it is not safe to attempt + * to destroy a locked mutex, and may result in undefined behavior depending + * on the platform. + * + * \param mutex the mutex to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateMutex + * \sa SDL_LockMutex + * \sa SDL_TryLockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex); + +/* @} *//* Mutex functions */ + + +/** + * \name Semaphore functions + */ +/* @{ */ + +/* The SDL semaphore structure, defined in SDL_syssem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** + * Create a semaphore. + * + * This function creates a new semaphore and initializes it with the value + * `initial_value`. Each wait operation on the semaphore will atomically + * decrement the semaphore value and potentially block if the semaphore value + * is 0. Each post operation will atomically increment the semaphore value and + * wake waiting threads and allow them to retry the wait operation. + * + * \param initial_value the starting value of the semaphore + * \returns a new semaphore or NULL on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** + * Destroy a semaphore. + * + * It is not safe to destroy a semaphore if there are threads currently + * waiting on it. + * + * \param sem the semaphore to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem); + +/** + * Wait until a semaphore has a positive value and then decrements it. + * + * This function suspends the calling thread until either the semaphore + * pointed to by `sem` has a positive value or the call is interrupted by a + * signal or error. If the call is successful it will atomically decrement the + * semaphore value. + * + * This function is the equivalent of calling SDL_SemWaitTimeout() with a time + * length of `SDL_MUTEX_MAXWAIT`. + * + * \param sem the semaphore wait on + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem); + +/** + * See if a semaphore has a positive value and decrement it if it does. + * + * This function checks to see if the semaphore pointed to by `sem` has a + * positive value and atomically decrements the semaphore value if it does. If + * the semaphore doesn't have a positive value, the function immediately + * returns SDL_MUTEX_TIMEDOUT. + * + * \param sem the semaphore to wait on + * \returns 0 if the wait succeeds, `SDL_MUTEX_TIMEDOUT` if the wait would + * block, or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem); + +/** + * Wait until a semaphore has a positive value and then decrements it. + * + * This function suspends the calling thread until either the semaphore + * pointed to by `sem` has a positive value, the call is interrupted by a + * signal or error, or the specified time has elapsed. If the call is + * successful it will atomically decrement the semaphore value. + * + * \param sem the semaphore to wait on + * \param timeout the length of the timeout, in milliseconds + * \returns 0 if the wait succeeds, `SDL_MUTEX_TIMEDOUT` if the wait does not + * succeed in the allotted time, or a negative error code on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout); + +/** + * Atomically increment a semaphore's value and wake waiting threads. + * + * \param sem the semaphore to increment + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem); + +/** + * Get the current value of a semaphore. + * + * \param sem the semaphore to query + * \returns the current value of the semaphore. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem); + +/* @} *//* Semaphore functions */ + + +/** + * \name Condition variable functions + */ +/* @{ */ + +/* The SDL condition variable structure, defined in SDL_syscond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; + +/** + * Create a condition variable. + * + * \returns a new condition variable or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_DestroyCond + */ +extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void); + +/** + * Destroy a condition variable. + * + * \param cond the condition variable to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond); + +/** + * Restart one of the threads that are waiting on the condition variable. + * + * \param cond the condition variable to signal + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond); + +/** + * Restart all threads that are waiting on the condition variable. + * + * \param cond the condition variable to signal + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond); + +/** + * Wait until a condition variable is signaled. + * + * This function unlocks the specified `mutex` and waits for another thread to + * call SDL_CondSignal() or SDL_CondBroadcast() on the condition variable + * `cond`. Once the condition variable is signaled, the mutex is re-locked and + * the function returns. + * + * The mutex must be locked before calling this function. + * + * This function is the equivalent of calling SDL_CondWaitTimeout() with a + * time length of `SDL_MUTEX_MAXWAIT`. + * + * \param cond the condition variable to wait on + * \param mutex the mutex used to coordinate thread access + * \returns 0 when it is signaled or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex); + +/** + * Wait until a condition variable is signaled or a certain time has passed. + * + * This function unlocks the specified `mutex` and waits for another thread to + * call SDL_CondSignal() or SDL_CondBroadcast() on the condition variable + * `cond`, or for the specified time to elapse. Once the condition variable is + * signaled or the time elapsed, the mutex is re-locked and the function + * returns. + * + * The mutex must be locked before calling this function. + * + * \param cond the condition variable to wait on + * \param mutex the mutex used to coordinate thread access + * \param ms the maximum time to wait, in milliseconds, or `SDL_MUTEX_MAXWAIT` + * to wait indefinitely + * \returns 0 if the condition variable is signaled, `SDL_MUTEX_TIMEDOUT` if + * the condition is not signaled in the allotted time, or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond, + SDL_mutex * mutex, Uint32 ms); + +/* @} *//* Condition variable functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_mutex_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_name.h b/Thirdparty/SDL2/include/SDL_name.h new file mode 100644 index 0000000..5c3e07a --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_name.h @@ -0,0 +1,33 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDLname_h_ +#define SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* SDLname_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_opengl.h b/Thirdparty/SDL2/include/SDL_opengl.h new file mode 100644 index 0000000..0ba8912 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengl.h @@ -0,0 +1,2132 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengl.h + * + * This is a simple file to encapsulate the OpenGL API headers. + */ + +/** + * \def NO_SDL_GLEXT + * + * Define this if you have your own version of glext.h and want to disable the + * version included in SDL_opengl.h. + */ + +#ifndef SDL_opengl_h_ +#define SDL_opengl_h_ + +#include "SDL_config.h" + +#ifndef __IPHONEOS__ /* No OpenGL on iOS. */ + +/* + * Mesa 3-D graphics library + * + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 2009 VMware, Inc. All Rights Reserved. + * + * 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. + */ + + +#ifndef __gl_h_ +#define __gl_h_ + +#if defined(USE_MGL_NAMESPACE) +#include "gl_mangle.h" +#endif + + +/********************************************************************** + * Begin system-specific stuff. + */ + +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) +#define __WIN32__ +#endif + +#if defined(__WIN32__) && !defined(__CYGWIN__) +# if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ +# define GLAPI __declspec(dllexport) +# elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ +# define GLAPI __declspec(dllimport) +# else /* for use with static link lib build of Win32 edition only */ +# define GLAPI extern +# endif /* _STATIC_MESA support */ +# if defined(__MINGW32__) && defined(GL_NO_STDCALL) || defined(UNDER_CE) /* The generated DLLs by MingW with STDCALL are not compatible with the ones done by Microsoft's compilers */ +# define GLAPIENTRY +# else +# define GLAPIENTRY __stdcall +# endif +#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */ +# define GLAPI extern +# define GLAPIENTRY __stdcall +#elif defined(__OS2__) || defined(__EMX__) /* native os/2 opengl */ +# define GLAPI extern +# define GLAPIENTRY _System +# define APIENTRY _System +# if defined(__GNUC__) && !defined(_System) +# define _System +# endif +#elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) +# define GLAPI __attribute__((visibility("default"))) +# define GLAPIENTRY +#endif /* WIN32 && !CYGWIN */ + +/* + * WINDOWS: Include windows.h here to define APIENTRY. + * It is also useful when applications include this file by + * including only glut.h, since glut.h depends on windows.h. + * Applications needing to include windows.h with parms other + * than "WIN32_LEAN_AND_MEAN" may include windows.h before + * glut.h or gl.h. + */ +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#ifndef NOMINMAX /* don't define min() and max(). */ +#define NOMINMAX +#endif +#include +#endif + +#ifndef GLAPI +#define GLAPI extern +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef APIENTRY +#define APIENTRY GLAPIENTRY +#endif + +/* "P" suffix to be used for a pointer to a function */ +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * +#endif + +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export on +#endif + +/* + * End system-specific stuff. + **********************************************************************/ + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 + + +/* + * Datatypes + */ +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; /* 1-byte signed */ +typedef short GLshort; /* 2-byte signed */ +typedef int GLint; /* 4-byte signed */ +typedef unsigned char GLubyte; /* 1-byte unsigned */ +typedef unsigned short GLushort; /* 2-byte unsigned */ +typedef unsigned int GLuint; /* 4-byte unsigned */ +typedef int GLsizei; /* 4-byte signed */ +typedef float GLfloat; /* single precision float */ +typedef float GLclampf; /* single precision float in [0,1] */ +typedef double GLdouble; /* double precision float */ +typedef double GLclampd; /* double precision float in [0,1] */ + + + +/* + * Constants + */ + +/* Boolean values */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* Data types */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A + +/* Primitives */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 + +/* Vertex Arrays */ +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D + +/* Matrix Mode */ +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* Points */ +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 + +/* Lines */ +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 + +/* Polygons */ +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 + +/* Display Lists */ +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 + +/* Depth buffer */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 + +/* Lighting */ +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 + +/* User clipping planes */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* Accumulation buffer */ +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 + +/* Alpha testing */ +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 + +/* Blending */ +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 + +/* Render Mode */ +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 + +/* Feedback */ +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 + +/* Selection */ +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 + +/* Fog */ +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* Logic Ops */ +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D + +/* Stencil */ +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 + +/* Buffers, Pixel Drawing/Reading */ +#define GL_NONE 0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +/*GL_FRONT 0x0404 */ +/*GL_BACK 0x0405 */ +/*GL_FRONT_AND_BACK 0x0408 */ +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 + +/* Implementation limits */ +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B + +/* Gets */ +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 + +/* Evaluators */ +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 + +/* Hints */ +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* Scissor box */ +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 + +/* Pixel Mode / Transfer */ +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 + +/* Texture mapping */ +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 + +/* Utility */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* Errors */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 + +/* glPush/PopAttrib bits */ +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000FFFFF + + +/* OpenGL 1.1 */ +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF + + + +/* + * Miscellaneous + */ + +GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); + +GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glClear( GLbitfield mask ); + +GLAPI void GLAPIENTRY glIndexMask( GLuint mask ); + +GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); + +GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref ); + +GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); + +GLAPI void GLAPIENTRY glLogicOp( GLenum opcode ); + +GLAPI void GLAPIENTRY glCullFace( GLenum mode ); + +GLAPI void GLAPIENTRY glFrontFace( GLenum mode ); + +GLAPI void GLAPIENTRY glPointSize( GLfloat size ); + +GLAPI void GLAPIENTRY glLineWidth( GLfloat width ); + +GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern ); + +GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode ); + +GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); + +GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask ); + +GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask ); + +GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag ); + +GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag ); + +GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height); + +GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); + +GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); + +GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glReadBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glEnable( GLenum cap ); + +GLAPI void GLAPIENTRY glDisable( GLenum cap ); + +GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap ); + + +GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ + +GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ + + +GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); + +GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params ); + +GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params ); + +GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask ); + +GLAPI void GLAPIENTRY glPopAttrib( void ); + + +GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ + +GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */ + + +GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode ); + +GLAPI GLenum GLAPIENTRY glGetError( void ); + +GLAPI const GLubyte * GLAPIENTRY glGetString( GLenum name ); + +GLAPI void GLAPIENTRY glFinish( void ); + +GLAPI void GLAPIENTRY glFlush( void ); + +GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode ); + + +/* + * Depth Buffer + */ + +GLAPI void GLAPIENTRY glClearDepth( GLclampd depth ); + +GLAPI void GLAPIENTRY glDepthFunc( GLenum func ); + +GLAPI void GLAPIENTRY glDepthMask( GLboolean flag ); + +GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); + + +/* + * Accumulation Buffer + */ + +GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); + +GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value ); + + +/* + * Transformation + */ + +GLAPI void GLAPIENTRY glMatrixMode( GLenum mode ); + +GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glViewport( GLint x, GLint y, + GLsizei width, GLsizei height ); + +GLAPI void GLAPIENTRY glPushMatrix( void ); + +GLAPI void GLAPIENTRY glPopMatrix( void ); + +GLAPI void GLAPIENTRY glLoadIdentity( void ); + +GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glRotated( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRotatef( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); + + +/* + * Display Lists + */ + +GLAPI GLboolean GLAPIENTRY glIsList( GLuint list ); + +GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range ); + +GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range ); + +GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode ); + +GLAPI void GLAPIENTRY glEndList( void ); + +GLAPI void GLAPIENTRY glCallList( GLuint list ); + +GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type, + const GLvoid *lists ); + +GLAPI void GLAPIENTRY glListBase( GLuint base ); + + +/* + * Drawing Functions + */ + +GLAPI void GLAPIENTRY glBegin( GLenum mode ); + +GLAPI void GLAPIENTRY glEnd( void ); + + +GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex2iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex3iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex4iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); +GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); +GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); +GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); +GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); + +GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glNormal3iv( const GLint *v ); +GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glIndexd( GLdouble c ); +GLAPI void GLAPIENTRY glIndexf( GLfloat c ); +GLAPI void GLAPIENTRY glIndexi( GLint c ); +GLAPI void GLAPIENTRY glIndexs( GLshort c ); +GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c ); +GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c ); +GLAPI void GLAPIENTRY glIndexiv( const GLint *c ); +GLAPI void GLAPIENTRY glIndexsv( const GLshort *c ); +GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); +GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); +GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); +GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue ); +GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); +GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); +GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); +GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); + +GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green, + GLint blue, GLint alpha ); +GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor3iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor3sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor3usv( const GLushort *v ); + +GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor4iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor4sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor4usv( const GLushort *v ); + + +GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s ); +GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s ); +GLAPI void GLAPIENTRY glTexCoord1i( GLint s ); +GLAPI void GLAPIENTRY glTexCoord1s( GLshort s ); + +GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t ); +GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t ); +GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t ); +GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); +GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); +GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); +GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); +GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); +GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); +GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); +GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 ); +GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); + + +/* + * Vertex Arrays (1.1) + */ + +GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params ); + +GLAPI void GLAPIENTRY glArrayElement( GLint i ); + +GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); + +GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride, + const GLvoid *pointer ); + +/* + * Lighting + */ + +GLAPI void GLAPIENTRY glShadeModel( GLenum mode ); + +GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname, + GLfloat *params ); +GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode ); + + +/* + * Raster functions + */ + +GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); + +GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLsizei mapsize, + const GLfloat *values ); +GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLsizei mapsize, + const GLuint *values ); +GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLsizei mapsize, + const GLushort *values ); + +GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); +GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); +GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); + +GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); + +GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); + +GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); + +/* + * Stenciling + */ + +GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); + +GLAPI void GLAPIENTRY glStencilMask( GLuint mask ); + +GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); + +GLAPI void GLAPIENTRY glClearStencil( GLint s ); + + + +/* + * Texture mapping + */ + +GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); +GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); +GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); +GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target, + GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target, + GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, + GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); + + +/* 1.1 functions */ + +GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures ); + +GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures); + +GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture ); + +GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); + +GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n, + const GLuint *textures, + GLboolean *residences ); + +GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture ); + + +GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); + + +/* + * Evaluators + */ + +GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); + +GLAPI void GLAPIENTRY glMap2d( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +GLAPI void GLAPIENTRY glMap2f( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); + +GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); +GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); +GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); + +GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u ); +GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u ); + +GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); +GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); + +GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); +GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); + +GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); + +GLAPI void GLAPIENTRY glEvalPoint1( GLint i ); + +GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j ); + +GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); + +GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + + +/* + * Fog + */ + +GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param ); + +GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params ); + +GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params ); + + +/* + * Selection and Feedback + */ + +GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); + +GLAPI void GLAPIENTRY glPassThrough( GLfloat token ); + +GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); + +GLAPI void GLAPIENTRY glInitNames( void ); + +GLAPI void GLAPIENTRY glLoadName( GLuint name ); + +GLAPI void GLAPIENTRY glPushName( GLuint name ); + +GLAPI void GLAPIENTRY glPopName( void ); + + + +/* + * OpenGL 1.2 + */ + +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_TEXTURE_BINDING_3D 0x806A + +GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, + GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLsizei depth, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLsizei width, + GLsizei height, GLsizei depth, + GLenum format, + GLenum type, const GLvoid *pixels); + +GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLint x, + GLint y, GLsizei width, + GLsizei height ); + +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + + +/* + * GL_ARB_imaging + */ + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 + + +GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +GLAPI void GLAPIENTRY glColorSubTable( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname, + const GLint *params); + +GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname, + const GLfloat *params); + +GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glBlendEquation( GLenum mode ); + +GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +GLAPI void GLAPIENTRY glResetHistogram( GLenum target ); + +GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat, + GLboolean sink ); + +GLAPI void GLAPIENTRY glResetMinmax( GLenum target ); + +GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname, + GLfloat params ); + +GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); + +GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname, + GLint params ); + +GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width, + GLsizei height); + +GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format, + GLenum type, GLvoid *image ); + +GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); + +GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + + + + +/* + * OpenGL 1.3 + */ + +/* multitexture */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#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_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_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_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +/* texture_cube_map */ +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +/* texture_compression */ +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +/* multisample */ +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +/* transpose_matrix */ +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +/* texture_env_combine */ +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +/* texture_env_dot3 */ +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +/* texture_border_clamp */ +#define GL_CLAMP_TO_BORDER 0x812D + +GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ); + +GLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v ); + + +GLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); + + +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); + + + +/* + * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1) + */ +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); +GLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s); +GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s); +GLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s); +GLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t); +GLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t); +GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v); + +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#endif /* GL_ARB_multitexture */ + + + +/* + * Define this token if you want "old-style" header file behaviour (extensions + * defined in gl.h). Otherwise, extensions will be included from glext.h. + */ +#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) +#include "SDL_opengl_glext.h" +#endif /* GL_GLEXT_LEGACY */ + + + +/********************************************************************** + * Begin system-specific stuff + */ +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export off +#endif + +/* + * End system-specific stuff + **********************************************************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ + +#endif /* !__IPHONEOS__ */ + +#endif /* SDL_opengl_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_opengl_glext.h b/Thirdparty/SDL2/include/SDL_opengl_glext.h new file mode 100644 index 0000000..ff6ad12 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengl_glext.h @@ -0,0 +1,13213 @@ +/* SDL modified the include guard to be compatible with Mesa and Apple include guards: + * - Mesa uses: __gl_glext_h_ + * - Apple uses: __glext_h_ */ +#if !defined(__glext_h_) && !defined(__gl_glext_h_) +#define __glext_h_ 1 +#define __gl_glext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +#define GL_GLEXT_VERSION 20220530 + +/*#include */ +#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_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY 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_APIENTRY + *------------------------------------------------------------------------- + * 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_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#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 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#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 KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +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_ */ + +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP 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 (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#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_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_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_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP 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 (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif +#endif /* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_intptr_t GLintptr; +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#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_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_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef khronos_uint16_t GLhalf; +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#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_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_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_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif +#endif /* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif +#endif /* GL_VERSION_3_1 */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +typedef khronos_uint64_t GLuint64; +typedef khronos_int64_t GLint64; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); +#endif +#endif /* GL_VERSION_3_2 */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +#endif +#endif /* GL_VERSION_3_3 */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_VERSION_4_0 */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif +#endif /* GL_VERSION_4_1 */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#endif +#endif /* GL_VERSION_4_2 */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_MINMAX 0x802E +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); +GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); +GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); +GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); +GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); +GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); +GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); +GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); +GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); +GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); +GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); +GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); +GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); +GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); +GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); +GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glTextureBarrier (void); +#endif +#endif /* GL_VERSION_4_5 */ + +#ifndef GL_VERSION_4_6 +#define GL_VERSION_4_6 1 +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +typedef void (APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpecializeShader (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +GLAPI void APIENTRY glMultiDrawArraysIndirectCount (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCount (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glPolygonOffsetClamp (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_VERSION_4_6 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 +typedef void (APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveBoundingBoxARB (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_ARB_ES3_2_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef khronos_uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 +#endif /* GL_ARB_conditional_render_inverted */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 +#endif /* GL_ARB_cull_distance */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 +#endif /* GL_ARB_derivative_control */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 +#endif /* GL_ARB_direct_state_access */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 +#endif /* GL_ARB_fragment_shader_interlock */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 +#endif /* GL_ARB_get_texture_sub_image */ + +#ifndef GL_ARB_gl_spirv +#define GL_ARB_gl_spirv 1 +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SPIR_V_BINARY_ARB 0x9552 +typedef void (APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpecializeShaderARB (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +#endif +#endif /* GL_ARB_gl_spirv */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 +#define GL_INT64_ARB 0x140E +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 +typedef void (APIENTRYP PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (APIENTRYP PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64 *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64 *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64ARB (GLint location, GLint64 x); +GLAPI void APIENTRY glUniform2i64ARB (GLint location, GLint64 x, GLint64 y); +GLAPI void APIENTRY glUniform3i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z); +GLAPI void APIENTRY glUniform4i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +GLAPI void APIENTRY glUniform1i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform2i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform3i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform4i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform1ui64ARB (GLint location, GLuint64 x); +GLAPI void APIENTRY glUniform2ui64ARB (GLint location, GLuint64 x, GLuint64 y); +GLAPI void APIENTRY glUniform3ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +GLAPI void APIENTRY glUniform4ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +GLAPI void APIENTRY glUniform1ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform2ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform3ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform4ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glGetUniformi64vARB (GLuint program, GLint location, GLint64 *params); +GLAPI void APIENTRY glGetUniformui64vARB (GLuint program, GLint location, GLuint64 *params); +GLAPI void APIENTRY glGetnUniformi64vARB (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glGetnUniformui64vARB (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); +GLAPI void APIENTRY glProgramUniform1i64ARB (GLuint program, GLint location, GLint64 x); +GLAPI void APIENTRY glProgramUniform2i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y); +GLAPI void APIENTRY glProgramUniform3i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +GLAPI void APIENTRY glProgramUniform4i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +GLAPI void APIENTRY glProgramUniform1i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform2i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform3i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform4i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform1ui64ARB (GLuint program, GLint location, GLuint64 x); +GLAPI void APIENTRY glProgramUniform2ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y); +GLAPI void APIENTRY glProgramUniform3ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +GLAPI void APIENTRY glProgramUniform4ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +GLAPI void APIENTRY glProgramUniform1ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform2ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform3ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform4ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +#endif +#endif /* GL_ARB_gpu_shader_int64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef khronos_uint16_t GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_VIEW_CLASS_EAC_R11 0x9383 +#define GL_VIEW_CLASS_EAC_RG11 0x9384 +#define GL_VIEW_CLASS_ETC2_RGB 0x9385 +#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 +#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 +#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 +#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 +#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A +#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B +#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C +#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D +#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E +#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F +#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 +#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 +#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 +#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 +#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 +#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); +#endif +#endif /* GL_ARB_multisample */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 +typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMaxShaderCompilerThreadsARB (GLuint count); +#endif +#endif /* GL_ARB_parallel_shader_compile */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#endif /* GL_ARB_pipeline_statistics_query */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_polygon_offset_clamp +#define GL_ARB_polygon_offset_clamp 1 +#endif /* GL_ARB_polygon_offset_clamp */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 +#endif /* GL_ARB_post_depth_coverage */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLEVALUATEDEPTHVALUESARBPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvARB (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvARB (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glEvaluateDepthValuesARB (void); +#endif +#endif /* GL_ARB_sample_locations */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 +#endif /* GL_ARB_shader_atomic_counter_ops */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 +#endif /* GL_ARB_shader_ballot */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 +#endif /* GL_ARB_shader_clock */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 +#endif /* GL_ARB_shader_texture_image_samples */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 +#endif /* GL_ARB_shader_viewport_layer_array */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_buffer */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 +#endif /* GL_ARB_sparse_texture2 */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 +#endif /* GL_ARB_sparse_texture_clamp */ + +#ifndef GL_ARB_spirv_extensions +#define GL_ARB_spirv_extensions 1 +#endif /* GL_ARB_spirv_extensions */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 +#endif /* GL_ARB_texture_barrier */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_ARB_texture_buffer_object */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (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 (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_filter_anisotropic +#define GL_ARB_texture_filter_anisotropic 1 +#endif /* GL_ARB_texture_filter_anisotropic */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 +#endif /* GL_ARB_texture_filter_minmax */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#endif /* GL_ARB_transform_feedback_overflow_query */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +typedef khronos_ssize_t GLsizeiptrARB; +typedef khronos_intptr_t GLintptrARB; +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYDVNVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDDNVPROC) (GLuint index, GLdouble n, GLdouble f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangeArraydvNV (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexeddNV (GLuint index, GLdouble n, GLdouble f); +#endif +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 +#endif /* GL_KHR_no_error */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); +#endif +#endif /* GL_KHR_parallel_shader_compile */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_shader_subgroup +#define GL_KHR_shader_subgroup 1 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#endif /* GL_KHR_shader_subgroup */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef khronos_int32_t GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#endif +#endif /* GL_OES_single_precision */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif /* GL_3DFX_multisample */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); +#endif +#endif /* GL_3DFX_tbuffer */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufSize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufSize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif +#endif /* GL_AMD_debug_output */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_AMD_draw_buffers_blend */ + +#ifndef GL_AMD_framebuffer_multisample_advanced +#define GL_AMD_framebuffer_multisample_advanced 1 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_AMD_framebuffer_multisample_advanced */ + +#ifndef GL_AMD_framebuffer_sample_positions +#define GL_AMD_framebuffer_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSamplePositionsfvAMD (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +GLAPI void APIENTRY glNamedFramebufferSamplePositionsfvAMD (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +GLAPI void APIENTRY glGetFramebufferParameterfvAMD (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +GLAPI void APIENTRY glGetNamedFramebufferParameterfvAMD (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +#endif +#endif /* GL_AMD_framebuffer_sample_positions */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ + +#ifndef GL_AMD_gpu_shader_half_float +#define GL_AMD_gpu_shader_half_float 1 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD +#endif /* GL_AMD_gpu_shader_half_float */ + +#ifndef GL_AMD_gpu_shader_int16 +#define GL_AMD_gpu_shader_int16 1 +#endif /* GL_AMD_gpu_shader_int16 */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef khronos_int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_AMD_gpu_shader_int64 */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); +#endif +#endif /* GL_AMD_interleaved_elements */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#endif +#endif /* GL_AMD_multi_draw_indirect */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif +#endif /* GL_AMD_name_gen_delete */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); +#endif +#endif /* GL_AMD_occlusion_query_event */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); +#endif +#endif /* GL_AMD_sample_positions */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ + +#ifndef GL_AMD_shader_ballot +#define GL_AMD_shader_ballot 1 +#endif /* GL_AMD_shader_ballot */ + +#ifndef GL_AMD_shader_explicit_vertex_parameter +#define GL_AMD_shader_explicit_vertex_parameter 1 +#endif /* GL_AMD_shader_explicit_vertex_parameter */ + +#ifndef GL_AMD_shader_gpu_shader_half_float_fetch +#define GL_AMD_shader_gpu_shader_half_float_fetch 1 +#endif /* GL_AMD_shader_gpu_shader_half_float_fetch */ + +#ifndef GL_AMD_shader_image_load_store_lod +#define GL_AMD_shader_image_load_store_lod 1 +#endif /* GL_AMD_shader_image_load_store_lod */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#endif +#endif /* GL_AMD_sparse_texture */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); +#endif +#endif /* GL_AMD_stencil_operation_extended */ + +#ifndef GL_AMD_texture_gather_bias_lod +#define GL_AMD_texture_gather_bias_lod 1 +#endif /* GL_AMD_texture_gather_bias_lod */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_APPLE_texture_range */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif +#endif /* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_EGL_image_storage +#define GL_EXT_EGL_image_storage 1 +typedef void *GLeglImageOES; +typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); +typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); +GLAPI void APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#endif +#endif /* GL_EXT_EGL_image_storage */ + +#ifndef GL_EXT_EGL_sync +#define GL_EXT_EGL_sync 1 +#endif /* GL_EXT_EGL_sync */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif +#endif /* GL_EXT_bindable_uniform */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#endif +#endif /* GL_EXT_blend_color */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_EXT_blend_equation_separate */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_EXT_blend_func_separate */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); +#endif +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif +#endif /* GL_EXT_compiled_vertex_array */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_copy_texture */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, 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 (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, 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 (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#endif +#endif /* GL_EXT_draw_buffers2 */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#endif +#endif /* GL_EXT_draw_range_elements */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 +typedef void *GLeglClientBufferEXT; +typedef void (APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#endif +#endif /* GL_EXT_external_buffer */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_EXT_framebuffer_blit */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +#endif +#endif /* GL_EXT_geometry_shader4 */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_EXT_gpu_shader4 */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); +#endif +#endif /* GL_EXT_index_func */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_index_material */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_light_texture */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_UUID_SIZE_EXT 16 +typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); +typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); +typedef void (APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); +typedef GLboolean (APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); +typedef void (APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); +GLAPI void APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); +GLAPI void APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); +GLAPI GLboolean APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); +GLAPI void APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); +GLAPI void APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); +GLAPI void APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem1DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem1DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_EXT_memory_object */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +typedef void (APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_memory_object_fd */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +GLAPI void APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_memory_object_win32 */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_multiview_tessellation_geometry_shader +#define GL_EXT_multiview_tessellation_geometry_shader 1 +#endif /* GL_EXT_multiview_tessellation_geometry_shader */ + +#ifndef GL_EXT_multiview_texture_multisample +#define GL_EXT_multiview_texture_multisample 1 +#endif /* GL_EXT_multiview_texture_multisample */ + +#ifndef GL_EXT_multiview_timer_query +#define GL_EXT_multiview_timer_query 1 +#endif /* GL_EXT_multiview_timer_query */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_paletted_texture */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_pixel_transform */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_EXT_point_parameters */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); +#endif +#endif /* GL_EXT_polygon_offset */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); +#endif +#endif /* GL_EXT_raster_multisample */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +typedef void (APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); +typedef void (APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); +typedef GLboolean (APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); +typedef void (APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +typedef void (APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); +GLAPI void APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); +GLAPI GLboolean APIENTRY glIsSemaphoreEXT (GLuint semaphore); +GLAPI void APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); +GLAPI void APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +GLAPI void APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#endif +#endif /* GL_EXT_semaphore */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_semaphore_fd */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); +GLAPI void APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_semaphore_win32 */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif /* GL_EXT_shader_framebuffer_fetch */ + +#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +typedef void (APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferFetchBarrierEXT (void); +#endif +#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif +#endif /* GL_EXT_shader_image_load_store */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shader_samples_identical +#define GL_EXT_shader_samples_identical 1 +#endif /* GL_EXT_shader_samples_identical */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif +#endif /* GL_EXT_stencil_clear_tag */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); +#endif +#endif /* GL_EXT_stencil_two_side */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_subtexture */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif +#endif /* GL_EXT_texture_integer */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif +#endif /* GL_EXT_texture_object */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 +#define GL_SR8_EXT 0x8FBD +#endif /* GL_EXT_texture_sRGB_R8 */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 +#define GL_SRG8_EXT 0x8FBE +#endif /* GL_EXT_texture_sRGB_RG8 */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shadow_lod +#define GL_EXT_texture_shadow_lod 1 +#endif /* GL_EXT_texture_shadow_lod */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_BGRA8_EXT 0x93A1 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +typedef void (APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_EXT_texture_storage */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif +#endif /* GL_EXT_transform_feedback */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif +#endif /* GL_EXT_vertex_shader */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_vertex_weighting */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 +typedef GLboolean (APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); +GLAPI GLboolean APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); +#endif +#endif /* GL_EXT_win32_keyed_mutex */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 +typedef void (APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); +#endif +#endif /* GL_EXT_window_rectangles */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#endif +#endif /* GL_EXT_x11_sync_object */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); +#endif +#endif /* GL_GREMEDY_frame_terminator */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); +#endif +#endif /* GL_GREMEDY_string_marker */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_HP_image_transform */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#endif +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); +#endif +#endif /* GL_IBM_static_data */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_INGR_blend_func_separate */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_blackhole_render +#define GL_INTEL_blackhole_render 1 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#endif /* GL_INTEL_blackhole_render */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE +#endif /* GL_INTEL_conservative_rasterization */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 +typedef void (APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); +#endif +#endif /* GL_INTEL_framebuffer_CMAA */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#endif +#endif /* GL_INTEL_map_texture */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_framebuffer_flip_x +#define GL_MESA_framebuffer_flip_x 1 +#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC +#endif /* GL_MESA_framebuffer_flip_x */ + +#ifndef GL_MESA_framebuffer_flip_y +#define GL_MESA_framebuffer_flip_y 1 +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferParameteriMESA (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameterivMESA (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_MESA_framebuffer_flip_y */ + +#ifndef GL_MESA_framebuffer_swap_xy +#define GL_MESA_framebuffer_swap_xy 1 +#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD +#endif /* GL_MESA_framebuffer_swap_xy */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ + +#ifndef GL_MESA_program_binary_formats +#define GL_MESA_program_binary_formats 1 +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#endif /* GL_MESA_program_binary_formats */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif +#endif /* GL_MESA_resize_buffers */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 +#endif /* GL_MESA_shader_integer_functions */ + +#ifndef GL_MESA_tile_raster_order +#define GL_MESA_tile_raster_order 1 +#define GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8 +#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9 +#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA +#endif /* GL_MESA_tile_raster_order */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NVX_gpu_multicast2 +#define GL_NVX_gpu_multicast2 1 +#define GL_UPLOAD_GPU_MASK_NVX 0x954A +typedef void (APIENTRYP PFNGLUPLOADGPUMASKNVXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLMULTICASTVIEWPORTARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC) (GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); +typedef void (APIENTRYP PFNGLMULTICASTSCISSORARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLint *v); +typedef GLuint (APIENTRYP PFNGLASYNCCOPYBUFFERSUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +typedef GLuint (APIENTRYP PFNGLASYNCCOPYIMAGESUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUploadGpuMaskNVX (GLbitfield mask); +GLAPI void APIENTRY glMulticastViewportArrayvNVX (GLuint gpu, GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glMulticastViewportPositionWScaleNVX (GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); +GLAPI void APIENTRY glMulticastScissorArrayvNVX (GLuint gpu, GLuint first, GLsizei count, const GLint *v); +GLAPI GLuint APIENTRY glAsyncCopyBufferSubDataNVX (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +GLAPI GLuint APIENTRY glAsyncCopyImageSubDataNVX (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +#endif +#endif /* GL_NVX_gpu_multicast2 */ + +#ifndef GL_NVX_linked_gpu_multicast +#define GL_NVX_linked_gpu_multicast 1 +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA +typedef void (APIENTRYP PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLLGPUINTERLOCKNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLGPUNamedBufferSubDataNVX (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glLGPUCopyImageSubDataNVX (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glLGPUInterlockNVX (void); +#endif +#endif /* GL_NVX_linked_gpu_multicast */ + +#ifndef GL_NVX_progress_fence +#define GL_NVX_progress_fence 1 +typedef GLuint (APIENTRYP PFNGLCREATEPROGRESSFENCENVXPROC) (void); +typedef void (APIENTRYP PFNGLSIGNALSEMAPHOREUI64NVXPROC) (GLuint signalGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +typedef void (APIENTRYP PFNGLWAITSEMAPHOREUI64NVXPROC) (GLuint waitGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +typedef void (APIENTRYP PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC) (GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glCreateProgressFenceNVX (void); +GLAPI void APIENTRY glSignalSemaphoreui64NVX (GLuint signalGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +GLAPI void APIENTRY glWaitSemaphoreui64NVX (GLuint waitGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +GLAPI void APIENTRY glClientWaitSemaphoreui64NVX (GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +#endif +#endif /* GL_NVX_progress_fence */ + +#ifndef GL_NV_alpha_to_coverage_dither_control +#define GL_NV_alpha_to_coverage_dither_control 1 +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +typedef void (APIENTRYP PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaToCoverageDitherControlNV (GLenum mode); +#endif +#endif /* GL_NV_alpha_to_coverage_dither_control */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 +#endif /* GL_NV_blend_minmax_factor */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +typedef void (APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#endif +#endif /* GL_NV_clip_space_w_scaling */ + +#ifndef GL_NV_command_list +#define GL_NV_command_list 1 +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A +#define GL_BLEND_COLOR_COMMAND_NV 0x000B +#define GL_STENCIL_REF_COMMAND_NV 0x000C +#define GL_LINE_WIDTH_COMMAND_NV 0x000D +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E +#define GL_ALPHA_REF_COMMAND_NV 0x000F +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 +typedef void (APIENTRYP PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint *states); +typedef void (APIENTRYP PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint *states); +typedef GLboolean (APIENTRYP PFNGLISSTATENVPROC) (GLuint state); +typedef void (APIENTRYP PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); +typedef GLuint (APIENTRYP PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (APIENTRYP PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint *lists); +typedef void (APIENTRYP PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint *lists); +typedef GLboolean (APIENTRYP PFNGLISCOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (APIENTRYP PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCreateStatesNV (GLsizei n, GLuint *states); +GLAPI void APIENTRY glDeleteStatesNV (GLsizei n, const GLuint *states); +GLAPI GLboolean APIENTRY glIsStateNV (GLuint state); +GLAPI void APIENTRY glStateCaptureNV (GLuint state, GLenum mode); +GLAPI GLuint APIENTRY glGetCommandHeaderNV (GLenum tokenID, GLuint size); +GLAPI GLushort APIENTRY glGetStageIndexNV (GLenum shadertype); +GLAPI void APIENTRY glDrawCommandsNV (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); +GLAPI void APIENTRY glDrawCommandsAddressNV (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); +GLAPI void APIENTRY glDrawCommandsStatesNV (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glDrawCommandsStatesAddressNV (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glCreateCommandListsNV (GLsizei n, GLuint *lists); +GLAPI void APIENTRY glDeleteCommandListsNV (GLsizei n, const GLuint *lists); +GLAPI GLboolean APIENTRY glIsCommandListNV (GLuint list); +GLAPI void APIENTRY glListDrawCommandsStatesClientNV (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glCommandListSegmentsNV (GLuint list, GLuint segments); +GLAPI void APIENTRY glCompileCommandListNV (GLuint list); +GLAPI void APIENTRY glCallCommandListNV (GLuint list); +#endif +#endif /* GL_NV_command_list */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_compute_shader_derivatives +#define GL_NV_compute_shader_derivatives 1 +#endif /* GL_NV_compute_shader_derivatives */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); +#endif +#endif /* GL_NV_conservative_raster */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B +typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConservativeRasterParameterfNV (GLenum pname, GLfloat value); +#endif +#endif /* GL_NV_conservative_raster_dilate */ + +#ifndef GL_NV_conservative_raster_pre_snap +#define GL_NV_conservative_raster_pre_snap 1 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#endif /* GL_NV_conservative_raster_pre_snap */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F +typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); +#endif +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +#ifndef GL_NV_conservative_raster_underestimation +#define GL_NV_conservative_raster_underestimation 1 +#endif /* GL_NV_conservative_raster_underestimation */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif +#endif /* GL_NV_depth_buffer_float */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864F +#endif /* GL_NV_depth_clamp */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#endif +#endif /* GL_NV_draw_texture */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 +typedef void (APIENTRY *GLVULKANPROCNV)(void); +typedef void (APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); +typedef void (APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +GLAPI GLVULKANPROCNV APIENTRY glGetVkProcAddrNV (const GLchar *name); +GLAPI void APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); +GLAPI void APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); +GLAPI void APIENTRY glSignalVkFenceNV (GLuint64 vkFence); +#endif +#endif /* GL_NV_draw_vulkan_image */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif +#endif /* GL_NV_evaluators */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif +#endif /* GL_NV_explicit_multisample */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif +#endif /* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif /* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ + +#ifndef GL_NV_fragment_shader_barycentric +#define GL_NV_fragment_shader_barycentric 1 +#endif /* GL_NV_fragment_shader_barycentric */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_NV_geometry_program4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_multicast +#define GL_NV_gpu_multicast 1 +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_RENDER_GPU_MASK_NV 0x9558 +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +typedef void (APIENTRYP PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTICASTBARRIERNVPROC) (void); +typedef void (APIENTRYP PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderGpuMaskNV (GLbitfield mask); +GLAPI void APIENTRY glMulticastBufferSubDataNV (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glMulticastCopyBufferSubDataNV (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glMulticastCopyImageSubDataNV (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glMulticastBlitFramebufferNV (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glMulticastFramebufferSampleLocationsfvNV (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glMulticastBarrierNV (void); +GLAPI void APIENTRY glMulticastWaitSyncNV (GLuint signalGpu, GLbitfield waitGpuMask); +GLAPI void APIENTRY glMulticastGetQueryObjectivNV (GLuint gpu, GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glMulticastGetQueryObjectuivNV (GLuint gpu, GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMulticastGetQueryObjecti64vNV (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glMulticastGetQueryObjectui64vNV (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_NV_gpu_multicast */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif +#endif /* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif +#endif /* GL_NV_half_float */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#endif +#endif /* GL_NV_internalformat_sample_query */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ + +#ifndef GL_NV_memory_attachment +#define GL_NV_memory_attachment 1 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +typedef void (APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +typedef void (APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); +typedef void (APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +GLAPI void APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); +GLAPI void APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_NV_memory_attachment */ + +#ifndef GL_NV_memory_object_sparse +#define GL_NV_memory_object_sparse 1 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTMEMNVPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTMEMNVPROC) (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC) (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentMemNV (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GLAPI void APIENTRY glTexPageCommitmentMemNV (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentMemNV (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GLAPI void APIENTRY glTexturePageCommitmentMemNV (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#endif +#endif /* GL_NV_memory_object_sparse */ + +#ifndef GL_NV_mesh_shader +#define GL_NV_mesh_shader 1 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_TASK_SHADER_NV 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +typedef void (APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); +typedef void (APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); +GLAPI void APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_NV_mesh_shader */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif /* GL_NV_multisample_coverage */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_occlusion_query */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#endif +#endif /* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); +#endif +#endif /* GL_NV_pixel_data_range */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif +#endif /* GL_NV_point_sprite */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_NV_present_video */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); +#endif +#endif /* GL_NV_primitive_restart */ + +#ifndef GL_NV_primitive_shading_rate +#define GL_NV_primitive_shading_rate 1 +#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1 +#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2 +#endif /* GL_NV_primitive_shading_rate */ + +#ifndef GL_NV_query_resource +#define GL_NV_query_resource 1 +#define GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV 0x9540 +#define GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV 0x9542 +#define GL_QUERY_RESOURCE_SYS_RESERVED_NV 0x9544 +#define GL_QUERY_RESOURCE_TEXTURE_NV 0x9545 +#define GL_QUERY_RESOURCE_RENDERBUFFER_NV 0x9546 +#define GL_QUERY_RESOURCE_BUFFEROBJECT_NV 0x9547 +typedef GLint (APIENTRYP PFNGLQUERYRESOURCENVPROC) (GLenum queryType, GLint tagId, GLuint count, GLint *buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glQueryResourceNV (GLenum queryType, GLint tagId, GLuint count, GLint *buffer); +#endif +#endif /* GL_NV_query_resource */ + +#ifndef GL_NV_query_resource_tag +#define GL_NV_query_resource_tag 1 +typedef void (APIENTRYP PFNGLGENQUERYRESOURCETAGNVPROC) (GLsizei n, GLint *tagIds); +typedef void (APIENTRYP PFNGLDELETEQUERYRESOURCETAGNVPROC) (GLsizei n, const GLint *tagIds); +typedef void (APIENTRYP PFNGLQUERYRESOURCETAGNVPROC) (GLint tagId, const GLchar *tagString); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueryResourceTagNV (GLsizei n, GLint *tagIds); +GLAPI void APIENTRY glDeleteQueryResourceTagNV (GLsizei n, const GLint *tagIds); +GLAPI void APIENTRY glQueryResourceTagNV (GLint tagId, const GLchar *tagString); +#endif +#endif /* GL_NV_query_resource_tag */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif +#endif /* GL_NV_register_combiners2 */ + +#ifndef GL_NV_representative_fragment_test +#define GL_NV_representative_fragment_test 1 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#endif /* GL_NV_representative_fragment_test */ + +#ifndef GL_NV_robustness_video_memory_purge +#define GL_NV_robustness_video_memory_purge 1 +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB +#endif /* GL_NV_robustness_video_memory_purge */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_scissor_exclusive +#define GL_NV_scissor_exclusive 1 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); +#endif +#endif /* GL_NV_scissor_exclusive */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ + +#ifndef GL_NV_shader_atomic_float64 +#define GL_NV_shader_atomic_float64 1 +#endif /* GL_NV_shader_atomic_float64 */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 +#endif /* GL_NV_shader_atomic_int64 */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_shader_buffer_load */ + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_subgroup_partitioned +#define GL_NV_shader_subgroup_partitioned 1 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#endif /* GL_NV_shader_subgroup_partitioned */ + +#ifndef GL_NV_shader_texture_footprint +#define GL_NV_shader_texture_footprint 1 +#endif /* GL_NV_shader_texture_footprint */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_shading_rate_image +#define GL_NV_shading_rate_image 1 +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +typedef void (APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); +typedef void (APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); +typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); +typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindShadingRateImageNV (GLuint texture); +GLAPI void APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); +GLAPI void APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); +GLAPI void APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); +GLAPI void APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +GLAPI void APIENTRY glShadingRateSampleOrderNV (GLenum order); +GLAPI void APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); +#endif +#endif /* GL_NV_shading_rate_image */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 +#endif /* GL_NV_stereo_view_rendering */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); +#endif +#endif /* GL_NV_texture_barrier */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#endif +#endif /* GL_NV_texture_multisample */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_rectangle_compressed +#define GL_NV_texture_rectangle_compressed 1 +#endif /* GL_NV_texture_rectangle_compressed */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_timeline_semaphore +#define GL_NV_timeline_semaphore 1 +#define GL_TIMELINE_SEMAPHORE_VALUE_NV 0x9595 +#define GL_SEMAPHORE_TYPE_NV 0x95B3 +#define GL_SEMAPHORE_TYPE_BINARY_NV 0x95B4 +#define GL_SEMAPHORE_TYPE_TIMELINE_NV 0x95B5 +#define GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV 0x95B6 +typedef void (APIENTRYP PFNGLCREATESEMAPHORESNVPROC) (GLsizei n, GLuint *semaphores); +typedef void (APIENTRYP PFNGLSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCreateSemaphoresNV (GLsizei n, GLuint *semaphores); +GLAPI void APIENTRY glSemaphoreParameterivNV (GLuint semaphore, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetSemaphoreParameterivNV (GLuint semaphore, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_timeline_semaphore */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif +#endif /* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif +#endif /* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#endif /* GL_NV_uniform_buffer_unified_memory */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +typedef GLintptr GLvdpauSurfaceNV; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ + +#ifndef GL_NV_vdpau_interop2 +#define GL_NV_vdpau_interop2 1 +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceWithPictureStructureNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); +#endif +#endif /* GL_NV_vdpau_interop2 */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 +#endif /* GL_NV_viewport_array2 */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B +typedef void (APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#endif +#endif /* GL_NV_viewport_swizzle */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 +#endif /* GL_OVR_multiview2 */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); +#endif +#endif /* GL_PGI_misc_hints */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_detail_texture */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); +#endif +#endif /* GL_SGIS_fog_function */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); +#endif +#endif /* GL_SGIS_multisample */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); +#endif +#endif /* GL_SGIS_pixel_texture */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_SGIS_point_parameters */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_sharpen_texture */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_SGIS_texture4D */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif +#endif /* GL_SGIS_texture_color_mask */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif +#endif /* GL_SGIS_texture_filter4 */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); +#endif +#endif /* GL_SGIX_async */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif +#endif /* GL_SGIX_flush_raster */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif +#endif /* GL_SGIX_fragment_lighting */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); +#endif +#endif /* GL_SGIX_framezoom */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); +#endif +#endif /* GL_SGIX_igloo_interface */ + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); +#endif +#endif /* GL_SGIX_instruments */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_list_priority */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); +#endif +#endif /* GL_SGIX_pixel_texture */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); +#endif +#endif /* GL_SGIX_polynomial_ffd */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); +#endif +#endif /* GL_SGIX_reference_plane */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_sprite */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif /* GL_SGIX_ycrcb_subsample */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_SGI_color_table */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif +#endif /* GL_SUNX_constant_data */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif +#endif /* GL_SUN_mesh_array */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); +#endif +#endif /* GL_SUN_triangle_list */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif +#endif /* GL_SUN_vertex */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/SDL2/include/SDL_opengles.h b/Thirdparty/SDL2/include/SDL_opengles.h new file mode 100644 index 0000000..f4465ea --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles.h @@ -0,0 +1,39 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 1.X API headers. + */ +#include "SDL_config.h" + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif diff --git a/Thirdparty/SDL2/include/SDL_opengles2.h b/Thirdparty/SDL2/include/SDL_opengles2.h new file mode 100644 index 0000000..5e3b717 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles2.h @@ -0,0 +1,52 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_opengles2.h + * + * This is a simple file to encapsulate the OpenGL ES 2.0 API headers. + */ +#include "SDL_config.h" + +#if !defined(_MSC_VER) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS) + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#include +#endif + +#else /* _MSC_VER */ + +/* OpenGL ES2 headers for Visual Studio */ +#include "SDL_opengles2_khrplatform.h" +#include "SDL_opengles2_gl2platform.h" +#include "SDL_opengles2_gl2.h" +#include "SDL_opengles2_gl2ext.h" + +#endif /* _MSC_VER */ + +#ifndef APIENTRY +#define APIENTRY GL_APIENTRY +#endif diff --git a/Thirdparty/SDL2/include/SDL_opengles2_gl2.h b/Thirdparty/SDL2/include/SDL_opengles2_gl2.h new file mode 100644 index 0000000..d13622a --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles2_gl2.h @@ -0,0 +1,656 @@ +#ifndef __gles2_gl2_h_ +#define __gles2_gl2_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +/*#include */ + +#ifndef GL_APIENTRYP +#define GL_APIENTRYP GL_APIENTRY* +#endif + +#ifndef GL_GLES_PROTOTYPES +#define GL_GLES_PROTOTYPES 1 +#endif + +/* Generated on date 20220530 */ + +/* Generated C header for: + * API: gles2 + * Profile: common + * Versions considered: 2\.[0-9] + * Versions emitted: .* + * Default extensions included: None + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_ES_VERSION_2_0 +#define GL_ES_VERSION_2_0 1 +/*#include */ +typedef khronos_int8_t GLbyte; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef void GLvoid; +typedef struct __GLsync *GLsync; +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef unsigned int GLenum; +typedef unsigned int GLuint; +typedef char GLchar; +typedef khronos_float_t GLfloat; +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_intptr_t GLintptr; +typedef unsigned int GLbitfield; +typedef int GLint; +typedef unsigned char GLboolean; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#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_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#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_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#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_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_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_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_NONE 0 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); +typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); +typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); +typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); +typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void); +typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void); +typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); +typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); +typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); +typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); +typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); +typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +#if GL_GLES_PROTOTYPES +GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); +GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); +GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); +GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); +GL_APICALL void GL_APIENTRY glClearStencil (GLint s); +GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); +GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); +GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); +GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); +GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); +GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); +GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); +GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); +GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glDisable (GLenum cap); +GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GL_APICALL void GL_APIENTRY glEnable (GLenum cap); +GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glFinish (void); +GL_APICALL void GL_APIENTRY glFlush (void); +GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); +GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); +GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); +GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); +GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL GLenum GL_APIENTRY glGetError (void); +GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); +GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); +GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); +GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); +GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); +GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); +GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); +GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); +GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); +GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); +GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); +GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); +GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_ES_VERSION_2_0 */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/SDL2/include/SDL_opengles2_gl2ext.h b/Thirdparty/SDL2/include/SDL_opengles2_gl2ext.h new file mode 100644 index 0000000..9448ce0 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles2_gl2ext.h @@ -0,0 +1,4033 @@ +#ifndef __gles2_gl2ext_h_ +#define __gles2_gl2ext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +#ifndef GL_APIENTRYP +#define GL_APIENTRYP GL_APIENTRY* +#endif + +/* Generated on date 20220530 */ + +/* Generated C header for: + * API: gles2 + * Profile: common + * Versions considered: 2\.[0-9] + * Versions emitted: _nomatch_^ + * Default extensions included: gles2 + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (GL_APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_SAMPLER 0x82E6 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_QUERY_KHR 0x82E3 +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); +typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); +typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); +GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); +GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); +#endif +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 +#endif /* GL_KHR_no_error */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); +#endif +#endif /* GL_KHR_parallel_shader_compile */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_CONTEXT_LOST_KHR 0x0507 +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void); +GL_APICALL void GL_APIENTRY glReadnPixelsKHR (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvKHR (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetnUniformivKHR (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +#endif +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_shader_subgroup +#define GL_KHR_shader_subgroup 1 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#endif /* GL_KHR_shader_subgroup */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +typedef void *GLeglImageOES; +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +#endif /* GL_OES_EGL_image */ + +#ifndef GL_OES_EGL_image_external +#define GL_OES_EGL_image_external 1 +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#endif /* GL_OES_EGL_image_external */ + +#ifndef GL_OES_EGL_image_external_essl3 +#define GL_OES_EGL_image_external_essl3 1 +#endif /* GL_OES_EGL_image_external_essl3 */ + +#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture +#define GL_OES_compressed_ETC1_RGB8_sub_texture 1 +#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */ + +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#define GL_ETC1_RGB8_OES 0x8D64 +#endif /* GL_OES_compressed_ETC1_RGB8_texture */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_copy_image +#define GL_OES_copy_image 1 +typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyImageSubDataOES (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#endif +#endif /* GL_OES_copy_image */ + +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif /* GL_OES_depth24 */ + +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif /* GL_OES_depth32 */ + +#ifndef GL_OES_depth_texture +#define GL_OES_depth_texture 1 +#endif /* GL_OES_depth_texture */ + +#ifndef GL_OES_draw_buffers_indexed +#define GL_OES_draw_buffers_indexed 1 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +typedef void (GL_APIENTRYP PFNGLENABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP PFNGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEnableiOES (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiOES (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glBlendEquationiOES (GLuint buf, GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparateiOES (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunciOES (GLuint buf, GLenum src, GLenum dst); +GL_APICALL void GL_APIENTRY glBlendFuncSeparateiOES (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glColorMaskiOES (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index); +#endif +#endif /* GL_OES_draw_buffers_indexed */ + +#ifndef GL_OES_draw_elements_base_vertex +#define GL_OES_draw_elements_base_vertex 1 +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +#endif +#endif /* GL_OES_draw_elements_base_vertex */ + +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif /* GL_OES_element_index_uint */ + +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif /* GL_OES_fbo_render_mipmap */ + +#ifndef GL_OES_fragment_precision_high +#define GL_OES_fragment_precision_high 1 +#endif /* GL_OES_fragment_precision_high */ + +#ifndef GL_OES_geometry_point_size +#define GL_OES_geometry_point_size 1 +#endif /* GL_OES_geometry_point_size */ + +#ifndef GL_OES_geometry_shader +#define GL_OES_geometry_shader 1 +#define GL_GEOMETRY_SHADER_OES 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F +#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E +#define GL_LINES_ADJACENCY_OES 0x000A +#define GL_LINE_STRIP_ADJACENCY_OES 0x000B +#define GL_TRIANGLES_ADJACENCY_OES 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E +#define GL_UNDEFINED_VERTEX_OES 0x8260 +#define GL_PRIMITIVES_GENERATED_OES 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureOES (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif +#endif /* GL_OES_geometry_shader */ + +#ifndef GL_OES_get_program_binary +#define GL_OES_get_program_binary 1 +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +#endif +#endif /* GL_OES_get_program_binary */ + +#ifndef GL_OES_gpu_shader5 +#define GL_OES_gpu_shader5 1 +#endif /* GL_OES_gpu_shader5 */ + +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_OES_mapbuffer */ + +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif /* GL_OES_packed_depth_stencil */ + +#ifndef GL_OES_primitive_bounding_box +#define GL_OES_primitive_bounding_box 1 +#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE +typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxOES (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_OES_primitive_bounding_box */ + +#ifndef GL_OES_required_internalformat +#define GL_OES_required_internalformat 1 +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 +#endif /* GL_OES_required_internalformat */ + +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif /* GL_OES_rgb8_rgba8 */ + +#ifndef GL_OES_sample_shading +#define GL_OES_sample_shading 1 +#define GL_SAMPLE_SHADING_OES 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 +typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMinSampleShadingOES (GLfloat value); +#endif +#endif /* GL_OES_sample_shading */ + +#ifndef GL_OES_sample_variables +#define GL_OES_sample_variables 1 +#endif /* GL_OES_sample_variables */ + +#ifndef GL_OES_shader_image_atomic +#define GL_OES_shader_image_atomic 1 +#endif /* GL_OES_shader_image_atomic */ + +#ifndef GL_OES_shader_io_blocks +#define GL_OES_shader_io_blocks 1 +#endif /* GL_OES_shader_io_blocks */ + +#ifndef GL_OES_shader_multisample_interpolation +#define GL_OES_shader_multisample_interpolation 1 +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D +#endif /* GL_OES_shader_multisample_interpolation */ + +#ifndef GL_OES_standard_derivatives +#define GL_OES_standard_derivatives 1 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#endif /* GL_OES_standard_derivatives */ + +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif /* GL_OES_stencil1 */ + +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif /* GL_OES_stencil4 */ + +#ifndef GL_OES_surfaceless_context +#define GL_OES_surfaceless_context 1 +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 +#endif /* GL_OES_surfaceless_context */ + +#ifndef GL_OES_tessellation_point_size +#define GL_OES_tessellation_point_size 1 +#endif /* GL_OES_tessellation_point_size */ + +#ifndef GL_OES_tessellation_shader +#define GL_OES_tessellation_shader 1 +#define GL_PATCHES_OES 0x000E +#define GL_PATCH_VERTICES_OES 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 +#define GL_TESS_GEN_MODE_OES 0x8E76 +#define GL_TESS_GEN_SPACING_OES 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 +#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 +#define GL_ISOLINES_OES 0x8E7A +#define GL_QUADS_OES 0x0007 +#define GL_FRACTIONAL_ODD_OES 0x8E7B +#define GL_FRACTIONAL_EVEN_OES 0x8E7C +#define GL_MAX_PATCH_VERTICES_OES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 +#define GL_IS_PER_PATCH_OES 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 +#define GL_TESS_CONTROL_SHADER_OES 0x8E88 +#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 +typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPatchParameteriOES (GLenum pname, GLint value); +#endif +#endif /* GL_OES_tessellation_shader */ + +#ifndef GL_OES_texture_3D +#define GL_OES_texture_3D 1 +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (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 (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (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 (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif +#endif /* GL_OES_texture_3D */ + +#ifndef GL_OES_texture_border_clamp +#define GL_OES_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 +#define GL_CLAMP_TO_BORDER_OES 0x812D +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexParameterIivOES (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexParameterIuivOES (GLenum target, GLenum pname, const GLuint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIivOES (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIuivOES (GLenum target, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glSamplerParameterIivOES (GLuint sampler, GLenum pname, const GLint *param); +GL_APICALL void GL_APIENTRY glSamplerParameterIuivOES (GLuint sampler, GLenum pname, const GLuint *param); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOES (GLuint sampler, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOES (GLuint sampler, GLenum pname, GLuint *params); +#endif +#endif /* GL_OES_texture_border_clamp */ + +#ifndef GL_OES_texture_buffer +#define GL_OES_texture_buffer 1 +#define GL_TEXTURE_BUFFER_OES 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F +#define GL_SAMPLER_BUFFER_OES 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 +#define GL_IMAGE_BUFFER_OES 0x9051 +#define GL_INT_IMAGE_BUFFER_OES 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D +#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E +typedef void (GL_APIENTRYP PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexBufferOES (GLenum target, GLenum internalformat, GLuint buffer); +GL_APICALL void GL_APIENTRY glTexBufferRangeOES (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_OES_texture_buffer */ + +#ifndef GL_OES_texture_compression_astc +#define GL_OES_texture_compression_astc 1 +#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 +#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 +#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 +#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 +#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 +#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 +#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 +#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 +#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 +#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 +#endif /* GL_OES_texture_compression_astc */ + +#ifndef GL_OES_texture_cube_map_array +#define GL_OES_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A +#endif /* GL_OES_texture_cube_map_array */ + +#ifndef GL_OES_texture_float +#define GL_OES_texture_float 1 +#endif /* GL_OES_texture_float */ + +#ifndef GL_OES_texture_float_linear +#define GL_OES_texture_float_linear 1 +#endif /* GL_OES_texture_float_linear */ + +#ifndef GL_OES_texture_half_float +#define GL_OES_texture_half_float 1 +#define GL_HALF_FLOAT_OES 0x8D61 +#endif /* GL_OES_texture_half_float */ + +#ifndef GL_OES_texture_half_float_linear +#define GL_OES_texture_half_float_linear 1 +#endif /* GL_OES_texture_half_float_linear */ + +#ifndef GL_OES_texture_npot +#define GL_OES_texture_npot 1 +#endif /* GL_OES_texture_npot */ + +#ifndef GL_OES_texture_stencil8 +#define GL_OES_texture_stencil8 1 +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_STENCIL_INDEX8_OES 0x8D48 +#endif /* GL_OES_texture_stencil8 */ + +#ifndef GL_OES_texture_storage_multisample_2d_array +#define GL_OES_texture_storage_multisample_2d_array 1 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOES (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +#endif +#endif /* GL_OES_texture_storage_multisample_2d_array */ + +#ifndef GL_OES_texture_view +#define GL_OES_texture_view 1 +#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureViewOES (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#endif +#endif /* GL_OES_texture_view */ + +#ifndef GL_OES_vertex_array_object +#define GL_OES_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); +GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); +GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); +GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); +#endif +#endif /* GL_OES_vertex_array_object */ + +#ifndef GL_OES_vertex_half_float +#define GL_OES_vertex_half_float 1 +#endif /* GL_OES_vertex_half_float */ + +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_OES_vertex_type_10_10_10_2 1 +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#endif /* GL_OES_vertex_type_10_10_10_2 */ + +#ifndef GL_OES_viewport_array +#define GL_OES_viewport_array 1 +#define GL_MAX_VIEWPORTS_OES 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_OES 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_OES 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES 0x825F +typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportArrayvOES (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glViewportIndexedfOES (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GL_APICALL void GL_APIENTRY glViewportIndexedfvOES (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glScissorArrayvOES (GLuint first, GLsizei count, const GLint *v); +GL_APICALL void GL_APIENTRY glScissorIndexedOES (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorIndexedvOES (GLuint index, const GLint *v); +GL_APICALL void GL_APIENTRY glDepthRangeArrayfvOES (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glDepthRangeIndexedfOES (GLuint index, GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glGetFloati_vOES (GLenum target, GLuint index, GLfloat *data); +#endif +#endif /* GL_OES_viewport_array */ + +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif /* GL_AMD_compressed_3DC_texture */ + +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif /* GL_AMD_compressed_ATC_texture */ + +#ifndef GL_AMD_framebuffer_multisample_advanced +#define GL_AMD_framebuffer_multisample_advanced 1 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_AMD_framebuffer_multisample_advanced */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 +#define GL_Z400_BINARY_AMD 0x8740 +#endif /* GL_AMD_program_binary_Z400 */ + +#ifndef GL_ANDROID_extension_pack_es31a +#define GL_ANDROID_extension_pack_es31a 1 +#endif /* GL_ANDROID_extension_pack_es31a */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 +#endif /* GL_ANGLE_depth_texture */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); +#endif +#endif /* GL_ANGLE_instanced_arrays */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 +#endif /* GL_ANGLE_pack_reverse_row_order */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 +#endif /* GL_ANGLE_program_binary */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 +#endif /* GL_ANGLE_texture_usage */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +#endif +#endif /* GL_ANGLE_translated_shader_source */ + +#ifndef GL_APPLE_clip_distance +#define GL_APPLE_clip_distance 1 +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 +#endif /* GL_APPLE_clip_distance */ + +#ifndef GL_APPLE_color_buffer_packed_float +#define GL_APPLE_color_buffer_packed_float 1 +#endif /* GL_APPLE_color_buffer_packed_float */ + +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 +typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif +#endif /* GL_APPLE_copy_texture_levels */ + +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); +#endif +#endif /* GL_APPLE_framebuffer_multisample */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull +typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); +typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); +GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); +GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); +GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +#endif +#endif /* GL_APPLE_sync */ + +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 +#endif /* GL_APPLE_texture_format_BGRA8888 */ + +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#endif /* GL_APPLE_texture_max_level */ + +#ifndef GL_APPLE_texture_packed_float +#define GL_APPLE_texture_packed_float 1 +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_RGB9_E5_APPLE 0x8C3D +#endif /* GL_APPLE_texture_packed_float */ + +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 +#endif /* GL_ARM_mali_program_binary */ + +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 +#endif /* GL_ARM_mali_shader_binary */ + +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 +#endif /* GL_ARM_rgba8 */ + +#ifndef GL_ARM_shader_framebuffer_fetch +#define GL_ARM_shader_framebuffer_fetch 1 +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 +#endif /* GL_ARM_shader_framebuffer_fetch */ + +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 +#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ + +#ifndef GL_ARM_texture_unnormalized_coordinates +#define GL_ARM_texture_unnormalized_coordinates 1 +#define GL_TEXTURE_UNNORMALIZED_COORDINATES_ARM 0x8F6A +#endif /* GL_ARM_texture_unnormalized_coordinates */ + +#ifndef GL_DMP_program_binary +#define GL_DMP_program_binary 1 +#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 +#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 +#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 +#endif /* GL_DMP_program_binary */ + +#ifndef GL_DMP_shader_binary +#define GL_DMP_shader_binary 1 +#define GL_SHADER_BINARY_DMP 0x9250 +#endif /* GL_DMP_shader_binary */ + +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 +#endif /* GL_EXT_EGL_image_array */ + +#ifndef GL_EXT_EGL_image_storage +#define GL_EXT_EGL_image_storage 1 +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); +GL_APICALL void GL_APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#endif +#endif /* GL_EXT_EGL_image_storage */ + +#ifndef GL_EXT_EGL_image_storage_compression +#define GL_EXT_EGL_image_storage_compression 1 +#define GL_SURFACE_COMPRESSION_EXT 0x96C0 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x96C1 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x96C2 +#endif /* GL_EXT_EGL_image_storage_compression */ + +#ifndef GL_EXT_YUV_target +#define GL_EXT_YUV_target 1 +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 +#endif /* GL_EXT_YUV_target */ + +#ifndef GL_EXT_base_instance +#define GL_EXT_base_instance 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedBaseInstanceEXT (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +#endif +#endif /* GL_EXT_base_instance */ + +#ifndef GL_EXT_blend_func_extended +#define GL_EXT_blend_func_extended 1 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_LOCATION_INDEX_EXT 0x930F +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXT (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GL_APICALL void GL_APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXT (GLuint program, GLenum programInterface, const GLchar *name); +GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXT (GLuint program, const GLchar *name); +#endif +#endif /* GL_EXT_blend_func_extended */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_buffer_storage +#define GL_EXT_buffer_storage 1 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 +#define GL_MAP_COHERENT_BIT_EXT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 +#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F +#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferStorageEXT (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +#endif +#endif /* GL_EXT_buffer_storage */ + +#ifndef GL_EXT_clear_texture +#define GL_EXT_clear_texture 1 +typedef void (GL_APIENTRYP PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glClearTexImageEXT (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GL_APICALL void GL_APIENTRY glClearTexSubImageEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +#endif +#endif /* GL_EXT_clear_texture */ + +#ifndef GL_EXT_clip_control +#define GL_EXT_clip_control 1 +#define GL_LOWER_LEFT_EXT 0x8CA1 +#define GL_UPPER_LEFT_EXT 0x8CA2 +#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E +#define GL_ZERO_TO_ONE_EXT 0x935F +#define GL_CLIP_ORIGIN_EXT 0x935C +#define GL_CLIP_DEPTH_MODE_EXT 0x935D +typedef void (GL_APIENTRYP PFNGLCLIPCONTROLEXTPROC) (GLenum origin, GLenum depth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glClipControlEXT (GLenum origin, GLenum depth); +#endif +#endif /* GL_EXT_clip_control */ + +#ifndef GL_EXT_clip_cull_distance +#define GL_EXT_clip_cull_distance 1 +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#endif /* GL_EXT_clip_cull_distance */ + +#ifndef GL_EXT_color_buffer_float +#define GL_EXT_color_buffer_float 1 +#endif /* GL_EXT_color_buffer_float */ + +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_RG16F_EXT 0x822F +#define GL_R16F_EXT 0x822D +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#endif /* GL_EXT_color_buffer_half_float */ + +#ifndef GL_EXT_conservative_depth +#define GL_EXT_conservative_depth 1 +#endif /* GL_EXT_conservative_depth */ + +#ifndef GL_EXT_copy_image +#define GL_EXT_copy_image 1 +typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyImageSubDataEXT (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#endif +#endif /* GL_EXT_copy_image */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_clamp +#define GL_EXT_depth_clamp 1 +#define GL_DEPTH_CLAMP_EXT 0x864F +#endif /* GL_EXT_depth_clamp */ + +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +#endif /* GL_EXT_discard_framebuffer */ + +#ifndef GL_EXT_disjoint_timer_query +#define GL_EXT_disjoint_timer_query 1 +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB +typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); +typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VEXTPROC) (GLenum pname, GLint64 *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); +GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); +GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); +GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); +GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); +GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); +GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +GL_APICALL void GL_APIENTRY glGetInteger64vEXT (GLenum pname, GLint64 *data); +#endif +#endif /* GL_EXT_disjoint_timer_query */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_EXT_draw_buffers */ + +#ifndef GL_EXT_draw_buffers_indexed +#define GL_EXT_draw_buffers_indexed 1 +typedef void (GL_APIENTRYP PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP PFNGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEnableiEXT (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiEXT (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glBlendEquationiEXT (GLuint buf, GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparateiEXT (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunciEXT (GLuint buf, GLenum src, GLenum dst); +GL_APICALL void GL_APIENTRY glBlendFuncSeparateiEXT (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glColorMaskiEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index); +#endif +#endif /* GL_EXT_draw_buffers_indexed */ + +#ifndef GL_EXT_draw_elements_base_vertex +#define GL_EXT_draw_elements_base_vertex 1 +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +#endif +#endif /* GL_EXT_draw_elements_base_vertex */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_transform_feedback +#define GL_EXT_draw_transform_feedback 1 +typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKEXTPROC) (GLenum mode, GLuint id); +typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC) (GLenum mode, GLuint id, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawTransformFeedbackEXT (GLenum mode, GLuint id); +GL_APICALL void GL_APIENTRY glDrawTransformFeedbackInstancedEXT (GLenum mode, GLuint id, GLsizei instancecount); +#endif +#endif /* GL_EXT_draw_transform_feedback */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 +typedef void *GLeglClientBufferEXT; +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +GL_APICALL void GL_APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#endif +#endif /* GL_EXT_external_buffer */ + +#ifndef GL_EXT_float_blend +#define GL_EXT_float_blend 1 +#endif /* GL_EXT_float_blend */ + +#ifndef GL_EXT_fragment_shading_rate +#define GL_EXT_fragment_shading_rate 1 +#define GL_SHADING_RATE_1X1_PIXELS_EXT 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_EXT 0x96A7 +#define GL_SHADING_RATE_2X1_PIXELS_EXT 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_EXT 0x96A9 +#define GL_SHADING_RATE_1X4_PIXELS_EXT 0x96AA +#define GL_SHADING_RATE_4X1_PIXELS_EXT 0x96AB +#define GL_SHADING_RATE_4X2_PIXELS_EXT 0x96AC +#define GL_SHADING_RATE_2X4_PIXELS_EXT 0x96AD +#define GL_SHADING_RATE_4X4_PIXELS_EXT 0x96AE +#define GL_SHADING_RATE_EXT 0x96D0 +#define GL_SHADING_RATE_ATTACHMENT_EXT 0x96D1 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT 0x96D2 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_EXT 0x96D3 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_EXT 0x96D4 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_EXT 0x96D5 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_EXT 0x96D6 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D7 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D8 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96D9 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96DA +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_ASPECT_RATIO_EXT 0x96DB +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_LAYERS_EXT 0x96DC +#define GL_FRAGMENT_SHADING_RATE_WITH_SHADER_DEPTH_STENCIL_WRITES_SUPPORTED_EXT 0x96DD +#define GL_FRAGMENT_SHADING_RATE_WITH_SAMPLE_MASK_SUPPORTED_EXT 0x96DE +#define GL_FRAGMENT_SHADING_RATE_ATTACHMENT_WITH_DEFAULT_FRAMEBUFFER_SUPPORTED_EXT 0x96DF +#define GL_FRAGMENT_SHADING_RATE_NON_TRIVIAL_COMBINERS_SUPPORTED_EXT 0x8F6F +typedef void (GL_APIENTRYP PFNGLGETFRAGMENTSHADINGRATESEXTPROC) (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEEXTPROC) (GLenum rate); +typedef void (GL_APIENTRYP PFNGLSHADINGRATECOMBINEROPSEXTPROC) (GLenum combinerOp0, GLenum combinerOp1); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSHADINGRATEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetFragmentShadingRatesEXT (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +GL_APICALL void GL_APIENTRY glShadingRateEXT (GLenum rate); +GL_APICALL void GL_APIENTRY glShadingRateCombinerOpsEXT (GLenum combinerOp0, GLenum combinerOp1); +GL_APICALL void GL_APIENTRY glFramebufferShadingRateEXT (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#endif +#endif /* GL_EXT_fragment_shading_rate */ + +#ifndef GL_EXT_geometry_point_size +#define GL_EXT_geometry_point_size 1 +#endif /* GL_EXT_geometry_point_size */ + +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif +#endif /* GL_EXT_geometry_shader */ + +#ifndef GL_EXT_gpu_shader5 +#define GL_EXT_gpu_shader5 1 +#endif /* GL_EXT_gpu_shader5 */ + +#ifndef GL_EXT_instanced_arrays +#define GL_EXT_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_instanced_arrays */ + +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); +#endif +#endif /* GL_EXT_map_buffer_range */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_UUID_SIZE_EXT 16 +typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); +typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); +typedef void (GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); +typedef GLboolean (GL_APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); +typedef void (GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); +GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); +GL_APICALL void GL_APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); +GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); +GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); +GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_EXT_memory_object */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_memory_object_fd */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +GL_APICALL void GL_APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_memory_object_win32 */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multi_draw_indirect +#define GL_EXT_multi_draw_indirect 1 +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysIndirectEXT (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GL_APICALL void GL_APIENTRY glMultiDrawElementsIndirectEXT (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +#endif +#endif /* GL_EXT_multi_draw_indirect */ + +#ifndef GL_EXT_multisampled_compatibility +#define GL_EXT_multisampled_compatibility 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#endif /* GL_EXT_multisampled_compatibility */ + +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +#endif /* GL_EXT_multisampled_render_to_texture */ + +#ifndef GL_EXT_multisampled_render_to_texture2 +#define GL_EXT_multisampled_render_to_texture2 1 +#endif /* GL_EXT_multisampled_render_to_texture2 */ + +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); +GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); +GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); +#endif +#endif /* GL_EXT_multiview_draw_buffers */ + +#ifndef GL_EXT_multiview_tessellation_geometry_shader +#define GL_EXT_multiview_tessellation_geometry_shader 1 +#endif /* GL_EXT_multiview_tessellation_geometry_shader */ + +#ifndef GL_EXT_multiview_texture_multisample +#define GL_EXT_multiview_texture_multisample 1 +#endif /* GL_EXT_multiview_texture_multisample */ + +#ifndef GL_EXT_multiview_timer_query +#define GL_EXT_multiview_timer_query 1 +#endif /* GL_EXT_multiview_timer_query */ + +#ifndef GL_EXT_occlusion_query_boolean +#define GL_EXT_occlusion_query_boolean 1 +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#endif /* GL_EXT_occlusion_query_boolean */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ + +#ifndef GL_EXT_primitive_bounding_box +#define GL_EXT_primitive_bounding_box 1 +#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxEXT (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_EXT_primitive_bounding_box */ + +#ifndef GL_EXT_protected_textures +#define GL_EXT_protected_textures 1 +#define GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT 0x00000010 +#define GL_TEXTURE_PROTECTED_EXT 0x8BFA +#endif /* GL_EXT_protected_textures */ + +#ifndef GL_EXT_pvrtc_sRGB +#define GL_EXT_pvrtc_sRGB 1 +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 +#endif /* GL_EXT_pvrtc_sRGB */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (GL_APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); +#endif +#endif /* GL_EXT_raster_multisample */ + +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif /* GL_EXT_read_format_bgra */ + +#ifndef GL_EXT_render_snorm +#define GL_EXT_render_snorm 1 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGBA16_SNORM_EXT 0x8F9B +#endif /* GL_EXT_render_snorm */ + +#ifndef GL_EXT_robustness +#define GL_EXT_robustness 1 +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); +GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif +#endif /* GL_EXT_robustness */ + +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#endif /* GL_EXT_sRGB */ + +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#endif /* GL_EXT_sRGB_write_control */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); +typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); +typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +typedef void (GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); +GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); +GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXT (GLuint semaphore); +GL_APICALL void GL_APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); +GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); +GL_APICALL void GL_APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +GL_APICALL void GL_APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#endif +#endif /* GL_EXT_semaphore */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_semaphore_fd */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_semaphore_win32 */ + +#ifndef GL_EXT_separate_depth_stencil +#define GL_EXT_separate_depth_stencil 1 +#endif /* GL_EXT_separate_depth_stencil */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); +GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); +GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); +GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); +GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif /* GL_EXT_shader_framebuffer_fetch */ + +#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierEXT (void); +#endif +#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ + +#ifndef GL_EXT_shader_group_vote +#define GL_EXT_shader_group_vote 1 +#endif /* GL_EXT_shader_group_vote */ + +#ifndef GL_EXT_shader_implicit_conversions +#define GL_EXT_shader_implicit_conversions 1 +#endif /* GL_EXT_shader_implicit_conversions */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shader_io_blocks +#define GL_EXT_shader_io_blocks 1 +#endif /* GL_EXT_shader_io_blocks */ + +#ifndef GL_EXT_shader_non_constant_global_initializers +#define GL_EXT_shader_non_constant_global_initializers 1 +#endif /* GL_EXT_shader_non_constant_global_initializers */ + +#ifndef GL_EXT_shader_pixel_local_storage +#define GL_EXT_shader_pixel_local_storage 1 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#endif /* GL_EXT_shader_pixel_local_storage */ + +#ifndef GL_EXT_shader_pixel_local_storage2 +#define GL_EXT_shader_pixel_local_storage2 1 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GL_APIENTRYP PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); +typedef void (GL_APIENTRYP PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferPixelLocalStorageSizeEXT (GLuint target, GLsizei size); +GL_APICALL GLsizei GL_APIENTRY glGetFramebufferPixelLocalStorageSizeEXT (GLuint target); +GL_APICALL void GL_APIENTRY glClearPixelLocalStorageuiEXT (GLsizei offset, GLsizei n, const GLuint *values); +#endif +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +#ifndef GL_EXT_shader_samples_identical +#define GL_EXT_shader_samples_identical 1 +#endif /* GL_EXT_shader_samples_identical */ + +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 +#endif /* GL_EXT_shader_texture_lod */ + +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 +#endif /* GL_EXT_shadow_samplers */ + +#ifndef GL_EXT_sparse_texture +#define GL_EXT_sparse_texture 1 +#define GL_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_3D 0x806F +#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexPageCommitmentEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#endif +#endif /* GL_EXT_sparse_texture */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_tessellation_point_size +#define GL_EXT_tessellation_point_size 1 +#endif /* GL_EXT_tessellation_point_size */ + +#ifndef GL_EXT_tessellation_shader +#define GL_EXT_tessellation_shader 1 +#define GL_PATCHES_EXT 0x000E +#define GL_PATCH_VERTICES_EXT 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 +#define GL_TESS_GEN_MODE_EXT 0x8E76 +#define GL_TESS_GEN_SPACING_EXT 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 +#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 +#define GL_ISOLINES_EXT 0x8E7A +#define GL_QUADS_EXT 0x0007 +#define GL_FRACTIONAL_ODD_EXT 0x8E7B +#define GL_FRACTIONAL_EVEN_EXT 0x8E7C +#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_IS_PER_PATCH_EXT 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 +#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 +#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 +typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPatchParameteriEXT (GLenum pname, GLint value); +#endif +#endif /* GL_EXT_tessellation_shader */ + +#ifndef GL_EXT_texture_border_clamp +#define GL_EXT_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_CLAMP_TO_BORDER_EXT 0x812D +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glSamplerParameterIivEXT (GLuint sampler, GLenum pname, const GLint *param); +GL_APICALL void GL_APIENTRY glSamplerParameterIuivEXT (GLuint sampler, GLenum pname, const GLuint *param); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIivEXT (GLuint sampler, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivEXT (GLuint sampler, GLenum pname, GLuint *params); +#endif +#endif /* GL_EXT_texture_border_clamp */ + +#ifndef GL_EXT_texture_buffer +#define GL_EXT_texture_buffer 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D +#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E +typedef void (GL_APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_EXT_texture_buffer */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode +#define GL_EXT_texture_compression_astc_decode_mode 1 +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 +#endif /* GL_EXT_texture_compression_astc_decode_mode */ + +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +#endif /* GL_EXT_texture_compression_bptc */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif /* GL_EXT_texture_compression_dxt1 */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_compression_s3tc_srgb +#define GL_EXT_texture_compression_s3tc_srgb 1 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_compression_s3tc_srgb */ + +#ifndef GL_EXT_texture_cube_map_array +#define GL_EXT_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#endif /* GL_EXT_texture_cube_map_array */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif /* GL_EXT_texture_format_BGRA8888 */ + +#ifndef GL_EXT_texture_format_sRGB_override +#define GL_EXT_texture_format_sRGB_override 1 +#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF +#endif /* GL_EXT_texture_format_sRGB_override */ + +#ifndef GL_EXT_texture_mirror_clamp_to_edge +#define GL_EXT_texture_mirror_clamp_to_edge 1 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#endif /* GL_EXT_texture_mirror_clamp_to_edge */ + +#ifndef GL_EXT_texture_norm16 +#define GL_EXT_texture_norm16 1 +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_RGB16_SNORM_EXT 0x8F9A +#endif /* GL_EXT_texture_norm16 */ + +#ifndef GL_EXT_texture_query_lod +#define GL_EXT_texture_query_lod 1 +#endif /* GL_EXT_texture_query_lod */ + +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#endif /* GL_EXT_texture_rg */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 +#define GL_SR8_EXT 0x8FBD +#endif /* GL_EXT_texture_sRGB_R8 */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 +#define GL_SRG8_EXT 0x8FBE +#endif /* GL_EXT_texture_sRGB_RG8 */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shadow_lod +#define GL_EXT_texture_shadow_lod 1 +#endif /* GL_EXT_texture_shadow_lod */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_EXT_texture_storage */ + +#ifndef GL_EXT_texture_storage_compression +#define GL_EXT_texture_storage_compression 1 +#define GL_NUM_SURFACE_COMPRESSION_FIXED_RATES_EXT 0x8F6E +#define GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x96C4 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x96C5 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x96C6 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x96C7 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x96C8 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x96C9 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x96CA +#define GL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x96CB +#define GL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x96CC +#define GL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x96CD +#define GL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x96CE +#define GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x96CF +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEATTRIBS2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, const GLint* attrib_list); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEATTRIBS3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorageAttribs2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, const GLint* attrib_list); +GL_APICALL void GL_APIENTRY glTexStorageAttribs3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const GLint* attrib_list); +#endif +#endif /* GL_EXT_texture_storage_compression */ + +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#endif /* GL_EXT_texture_type_2_10_10_10_REV */ + +#ifndef GL_EXT_texture_view +#define GL_EXT_texture_view 1 +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#endif +#endif /* GL_EXT_texture_view */ + +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 +#endif /* GL_EXT_unpack_subimage */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 +typedef GLboolean (GL_APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (GL_APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLboolean GL_APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); +GL_APICALL GLboolean GL_APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); +#endif +#endif /* GL_EXT_win32_keyed_mutex */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 +typedef void (GL_APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); +#endif +#endif /* GL_EXT_window_rectangles */ + +#ifndef GL_FJ_shader_binary_GCCSO +#define GL_FJ_shader_binary_GCCSO 1 +#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 +#endif /* GL_FJ_shader_binary_GCCSO */ + +#ifndef GL_IMG_bindless_texture +#define GL_IMG_bindless_texture 1 +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLEIMGPROC) (GLuint texture); +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEIMGPROC) (GLuint texture, GLuint sampler); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64IMGPROC) (GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VIMGPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleIMG (GLuint texture); +GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleIMG (GLuint texture, GLuint sampler); +GL_APICALL void GL_APIENTRY glUniformHandleui64IMG (GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glUniformHandleui64vIMG (GLint location, GLsizei count, const GLuint64 *value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64IMG (GLuint program, GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vIMG (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +#endif +#endif /* GL_IMG_bindless_texture */ + +#ifndef GL_IMG_framebuffer_downsample +#define GL_IMG_framebuffer_downsample 1 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG 0x913C +#define GL_NUM_DOWNSAMPLE_SCALES_IMG 0x913D +#define GL_DOWNSAMPLE_SCALES_IMG 0x913E +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG 0x913F +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTexture2DDownsampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); +GL_APICALL void GL_APIENTRY glFramebufferTextureLayerDownsampleIMG (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); +#endif +#endif /* GL_IMG_framebuffer_downsample */ + +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_IMG_multisampled_render_to_texture 1 +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +#endif /* GL_IMG_multisampled_render_to_texture */ + +#ifndef GL_IMG_program_binary +#define GL_IMG_program_binary 1 +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#endif /* GL_IMG_program_binary */ + +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif /* GL_IMG_read_format */ + +#ifndef GL_IMG_shader_binary +#define GL_IMG_shader_binary 1 +#define GL_SGX_BINARY_IMG 0x8C0A +#endif /* GL_IMG_shader_binary */ + +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif /* GL_IMG_texture_compression_pvrtc */ + +#ifndef GL_IMG_texture_compression_pvrtc2 +#define GL_IMG_texture_compression_pvrtc2 1 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 +#endif /* GL_IMG_texture_compression_pvrtc2 */ + +#ifndef GL_IMG_texture_filter_cubic +#define GL_IMG_texture_filter_cubic 1 +#define GL_CUBIC_IMG 0x9139 +#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A +#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B +#endif /* GL_IMG_texture_filter_cubic */ + +#ifndef GL_INTEL_blackhole_render +#define GL_INTEL_blackhole_render 1 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#endif /* GL_INTEL_blackhole_render */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE +#endif /* GL_INTEL_conservative_rasterization */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 +typedef void (GL_APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); +#endif +#endif /* GL_INTEL_framebuffer_CMAA */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESA_bgra +#define GL_MESA_bgra 1 +#define GL_BGR_EXT 0x80E0 +#endif /* GL_MESA_bgra */ + +#ifndef GL_MESA_framebuffer_flip_x +#define GL_MESA_framebuffer_flip_x 1 +#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC +#endif /* GL_MESA_framebuffer_flip_x */ + +#ifndef GL_MESA_framebuffer_flip_y +#define GL_MESA_framebuffer_flip_y 1 +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferParameteriMESA (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glGetFramebufferParameterivMESA (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_MESA_framebuffer_flip_y */ + +#ifndef GL_MESA_framebuffer_swap_xy +#define GL_MESA_framebuffer_swap_xy 1 +#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD +#endif /* GL_MESA_framebuffer_swap_xy */ + +#ifndef GL_MESA_program_binary_formats +#define GL_MESA_program_binary_formats 1 +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#endif /* GL_MESA_program_binary_formats */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 +#endif /* GL_MESA_shader_integer_functions */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (GL_APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GL_APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleNV (GLuint texture); +GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GL_APICALL void GL_APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GL_APICALL void GL_APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GL_APICALL GLuint64 GL_APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GL_APICALL void GL_APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GL_APICALL void GL_APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GL_APICALL void GL_APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GL_APICALL GLboolean GL_APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GL_APICALL GLboolean GL_APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_NV_blend_minmax_factor */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +typedef void (GL_APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#endif +#endif /* GL_NV_clip_space_w_scaling */ + +#ifndef GL_NV_compute_shader_derivatives +#define GL_NV_compute_shader_derivatives 1 +#endif /* GL_NV_compute_shader_derivatives */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (GL_APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GL_APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GL_APICALL void GL_APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (GL_APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); +#endif +#endif /* GL_NV_conservative_raster */ + +#ifndef GL_NV_conservative_raster_pre_snap +#define GL_NV_conservative_raster_pre_snap 1 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#endif /* GL_NV_conservative_raster_pre_snap */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F +typedef void (GL_APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); +#endif +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +#ifndef GL_NV_copy_buffer +#define GL_NV_copy_buffer 1 +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 +typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif +#endif /* GL_NV_copy_buffer */ + +#ifndef GL_NV_coverage_sample +#define GL_NV_coverage_sample 1 +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 +typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); +typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); +GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); +#endif +#endif /* GL_NV_coverage_sample */ + +#ifndef GL_NV_depth_nonlinear +#define GL_NV_depth_nonlinear 1 +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#endif /* GL_NV_depth_nonlinear */ + +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_NV_draw_buffers */ + +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_NV_draw_instanced */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 +typedef void (GL_APIENTRY *GLVULKANPROCNV)(void); +typedef void (GL_APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (GL_APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); +typedef void (GL_APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GL_APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GL_APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +GL_APICALL GLVULKANPROCNV GL_APIENTRY glGetVkProcAddrNV (const GLchar *name); +GL_APICALL void GL_APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); +GL_APICALL void GL_APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); +GL_APICALL void GL_APIENTRY glSignalVkFenceNV (GLuint64 vkFence); +#endif +#endif /* GL_NV_draw_vulkan_image */ + +#ifndef GL_NV_explicit_attrib_location +#define GL_NV_explicit_attrib_location 1 +#endif /* GL_NV_explicit_attrib_location */ + +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#endif /* GL_NV_fbo_color_attachments */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); +GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (GL_APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_shader_barycentric +#define GL_NV_fragment_shader_barycentric 1 +#endif /* GL_NV_fragment_shader_barycentric */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_NV_framebuffer_blit */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufSize, GLfloat *v); +typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GL_APICALL void GL_APIENTRY glGetCoverageModulationTableNV (GLsizei bufSize, GLfloat *v); +GL_APICALL void GL_APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample +#define GL_NV_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample */ + +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 +#endif /* GL_NV_generate_mipmap_sRGB */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_PATCHES 0x000E +typedef void (GL_APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GL_APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GL_APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GL_APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GL_APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GL_APICALL void GL_APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GL_APICALL void GL_APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GL_APICALL void GL_APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GL_APICALL void GL_APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GL_APICALL void GL_APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GL_APICALL void GL_APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GL_APICALL void GL_APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GL_APICALL void GL_APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GL_APICALL void GL_APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GL_APICALL void GL_APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GL_APICALL void GL_APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GL_APICALL void GL_APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GL_APICALL void GL_APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GL_APICALL void GL_APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GL_APICALL void GL_APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GL_APICALL void GL_APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GL_APICALL void GL_APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_image_formats +#define GL_NV_image_formats 1 +#endif /* GL_NV_image_formats */ + +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); +#endif +#endif /* GL_NV_instanced_arrays */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#endif +#endif /* GL_NV_internalformat_sample_query */ + +#ifndef GL_NV_memory_attachment +#define GL_NV_memory_attachment 1 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +typedef void (GL_APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); +typedef void (GL_APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +GL_APICALL void GL_APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); +GL_APICALL void GL_APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_NV_memory_attachment */ + +#ifndef GL_NV_memory_object_sparse +#define GL_NV_memory_object_sparse 1 +typedef void (GL_APIENTRYP PFNGLBUFFERPAGECOMMITMENTMEMNVPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTMEMNVPROC) (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC) (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferPageCommitmentMemNV (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GL_APICALL void GL_APIENTRY glTexPageCommitmentMemNV (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +GL_APICALL void GL_APIENTRY glNamedBufferPageCommitmentMemNV (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GL_APICALL void GL_APIENTRY glTexturePageCommitmentMemNV (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#endif +#endif /* GL_NV_memory_object_sparse */ + +#ifndef GL_NV_mesh_shader +#define GL_NV_mesh_shader 1 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_TASK_SHADER_NV 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +typedef void (GL_APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); +typedef void (GL_APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); +GL_APICALL void GL_APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); +GL_APICALL void GL_APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); +GL_APICALL void GL_APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_NV_mesh_shader */ + +#ifndef GL_NV_non_square_matrices +#define GL_NV_non_square_matrices 1 +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_NV_non_square_matrices */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +typedef double GLdouble; +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (GL_APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (GL_APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (GL_APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (GL_APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (GL_APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (GL_APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (GL_APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (GL_APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (GL_APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (GL_APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (GL_APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (GL_APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (GL_APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (GL_APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (GL_APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GL_APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GL_APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range); +GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path); +GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func); +GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +GL_APICALL void GL_APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixPopEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixPushEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF +#endif /* GL_NV_pixel_buffer_object */ + +#ifndef GL_NV_polygon_mode +#define GL_NV_polygon_mode 1 +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 +typedef void (GL_APIENTRYP PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPolygonModeNV (GLenum face, GLenum mode); +#endif +#endif /* GL_NV_polygon_mode */ + +#ifndef GL_NV_primitive_shading_rate +#define GL_NV_primitive_shading_rate 1 +#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1 +#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2 +#endif /* GL_NV_primitive_shading_rate */ + +#ifndef GL_NV_read_buffer +#define GL_NV_read_buffer 1 +#define GL_READ_BUFFER_NV 0x0C02 +typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); +#endif +#endif /* GL_NV_read_buffer */ + +#ifndef GL_NV_read_buffer_front +#define GL_NV_read_buffer_front 1 +#endif /* GL_NV_read_buffer_front */ + +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 +#endif /* GL_NV_read_depth */ + +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 +#endif /* GL_NV_read_depth_stencil */ + +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 +#endif /* GL_NV_read_stencil */ + +#ifndef GL_NV_representative_fragment_test +#define GL_NV_representative_fragment_test 1 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#endif /* GL_NV_representative_fragment_test */ + +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F +#define GL_ETC1_SRGB8_NV 0x88EE +#endif /* GL_NV_sRGB_formats */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_scissor_exclusive +#define GL_NV_scissor_exclusive 1 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +typedef void (GL_APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); +#endif +#endif /* GL_NV_scissor_exclusive */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_noperspective_interpolation +#define GL_NV_shader_noperspective_interpolation 1 +#endif /* GL_NV_shader_noperspective_interpolation */ + +#ifndef GL_NV_shader_subgroup_partitioned +#define GL_NV_shader_subgroup_partitioned 1 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#endif /* GL_NV_shader_subgroup_partitioned */ + +#ifndef GL_NV_shader_texture_footprint +#define GL_NV_shader_texture_footprint 1 +#endif /* GL_NV_shader_texture_footprint */ + +#ifndef GL_NV_shading_rate_image +#define GL_NV_shading_rate_image 1 +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +typedef void (GL_APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); +typedef void (GL_APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); +typedef void (GL_APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); +typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindShadingRateImageNV (GLuint texture); +GL_APICALL void GL_APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); +GL_APICALL void GL_APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); +GL_APICALL void GL_APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); +GL_APICALL void GL_APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +GL_APICALL void GL_APIENTRY glShadingRateSampleOrderNV (GLenum order); +GL_APICALL void GL_APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); +#endif +#endif /* GL_NV_shading_rate_image */ + +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 +#endif /* GL_NV_shadow_samplers_array */ + +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 +#endif /* GL_NV_shadow_samplers_cube */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 +#endif /* GL_NV_stereo_view_rendering */ + +#ifndef GL_NV_texture_border_clamp +#define GL_NV_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D +#endif /* GL_NV_texture_border_clamp */ + +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 +#endif /* GL_NV_texture_compression_s3tc_update */ + +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 +#endif /* GL_NV_texture_npot_2D_mipmap */ + +#ifndef GL_NV_timeline_semaphore +#define GL_NV_timeline_semaphore 1 +#define GL_TIMELINE_SEMAPHORE_VALUE_NV 0x9595 +#define GL_SEMAPHORE_TYPE_NV 0x95B3 +#define GL_SEMAPHORE_TYPE_BINARY_NV 0x95B4 +#define GL_SEMAPHORE_TYPE_TIMELINE_NV 0x95B5 +#define GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV 0x95B6 +typedef void (GL_APIENTRYP PFNGLCREATESEMAPHORESNVPROC) (GLsizei n, GLuint *semaphores); +typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCreateSemaphoresNV (GLsizei n, GLuint *semaphores); +GL_APICALL void GL_APIENTRY glSemaphoreParameterivNV (GLuint semaphore, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glGetSemaphoreParameterivNV (GLuint semaphore, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_timeline_semaphore */ + +#ifndef GL_NV_viewport_array +#define GL_NV_viewport_array 1 +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F +typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (GL_APIENTRYP PFNGLENABLEINVPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEINVPROC) (GLenum target, GLuint index); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportArrayvNV (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glViewportIndexedfNV (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GL_APICALL void GL_APIENTRY glViewportIndexedfvNV (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glScissorArrayvNV (GLuint first, GLsizei count, const GLint *v); +GL_APICALL void GL_APIENTRY glScissorIndexedNV (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorIndexedvNV (GLuint index, const GLint *v); +GL_APICALL void GL_APIENTRY glDepthRangeArrayfvNV (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glDepthRangeIndexedfNV (GLuint index, GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glGetFloati_vNV (GLenum target, GLuint index, GLfloat *data); +GL_APICALL void GL_APIENTRY glEnableiNV (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiNV (GLenum target, GLuint index); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediNV (GLenum target, GLuint index); +#endif +#endif /* GL_NV_viewport_array */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 +#endif /* GL_NV_viewport_array2 */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B +typedef void (GL_APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#endif +#endif /* GL_NV_viewport_swizzle */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 +#endif /* GL_OVR_multiview2 */ + +#ifndef GL_OVR_multiview_multisampled_render_to_texture +#define GL_OVR_multiview_multisampled_render_to_texture 1 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureMultisampleMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +#ifndef GL_QCOM_YUV_texture_gather +#define GL_QCOM_YUV_texture_gather 1 +#endif /* GL_QCOM_YUV_texture_gather */ + +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); +#endif +#endif /* GL_QCOM_alpha_test */ + +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 +#endif /* GL_QCOM_binning_control */ + +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +#endif /* GL_QCOM_driver_control */ + +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); +#endif +#endif /* GL_QCOM_extended_get */ + +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif +#endif /* GL_QCOM_extended_get2 */ + +#ifndef GL_QCOM_frame_extrapolation +#define GL_QCOM_frame_extrapolation 1 +typedef void (GL_APIENTRYP PFNGLEXTRAPOLATETEX2DQCOMPROC) (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtrapolateTex2DQCOM (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor); +#endif +#endif /* GL_QCOM_frame_extrapolation */ + +#ifndef GL_QCOM_framebuffer_foveated +#define GL_QCOM_framebuffer_foveated 1 +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x00000001 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x00000002 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFoveationConfigQCOM (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); +GL_APICALL void GL_APIENTRY glFramebufferFoveationParametersQCOM (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#endif +#endif /* GL_QCOM_framebuffer_foveated */ + +#ifndef GL_QCOM_motion_estimation +#define GL_QCOM_motion_estimation 1 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_X_QCOM 0x8C90 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_Y_QCOM 0x8C91 +typedef void (GL_APIENTRYP PFNGLTEXESTIMATEMOTIONQCOMPROC) (GLuint ref, GLuint target, GLuint output); +typedef void (GL_APIENTRYP PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC) (GLuint ref, GLuint target, GLuint output, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexEstimateMotionQCOM (GLuint ref, GLuint target, GLuint output); +GL_APICALL void GL_APIENTRY glTexEstimateMotionRegionsQCOM (GLuint ref, GLuint target, GLuint output, GLuint mask); +#endif +#endif /* GL_QCOM_motion_estimation */ + +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif /* GL_QCOM_perfmon_global_mode */ + +#ifndef GL_QCOM_render_shared_exponent +#define GL_QCOM_render_shared_exponent 1 +#endif /* GL_QCOM_render_shared_exponent */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierQCOM (void); +#endif +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_rate +#define GL_QCOM_shader_framebuffer_fetch_rate 1 +#endif /* GL_QCOM_shader_framebuffer_fetch_rate */ + +#ifndef GL_QCOM_shading_rate +#define GL_QCOM_shading_rate 1 +#define GL_SHADING_RATE_QCOM 0x96A4 +#define GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM 0x96A5 +#define GL_SHADING_RATE_1X1_PIXELS_QCOM 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_QCOM 0x96A7 +#define GL_SHADING_RATE_2X1_PIXELS_QCOM 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_QCOM 0x96A9 +#define GL_SHADING_RATE_4X2_PIXELS_QCOM 0x96AC +#define GL_SHADING_RATE_4X4_PIXELS_QCOM 0x96AE +typedef void (GL_APIENTRYP PFNGLSHADINGRATEQCOMPROC) (GLenum rate); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glShadingRateQCOM (GLenum rate); +#endif +#endif /* GL_QCOM_shading_rate */ + +#ifndef GL_QCOM_texture_foveated +#define GL_QCOM_texture_foveated 1 +#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB +#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC +#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD +#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE +#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF +typedef void (GL_APIENTRYP PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureFoveationParametersQCOM (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#endif +#endif /* GL_QCOM_texture_foveated */ + +#ifndef GL_QCOM_texture_foveated2 +#define GL_QCOM_texture_foveated2 1 +#define GL_TEXTURE_FOVEATED_CUTOFF_DENSITY_QCOM 0x96A0 +#endif /* GL_QCOM_texture_foveated2 */ + +#ifndef GL_QCOM_texture_foveated_subsampled_layout +#define GL_QCOM_texture_foveated_subsampled_layout 1 +#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x00000004 +#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 +#endif /* GL_QCOM_texture_foveated_subsampled_layout */ + +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); +#endif +#endif /* GL_QCOM_tiled_rendering */ + +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif /* GL_QCOM_writeonly_rendering */ + +#ifndef GL_VIV_shader_binary +#define GL_VIV_shader_binary 1 +#define GL_SHADER_BINARY_VIV 0x8FC4 +#endif /* GL_VIV_shader_binary */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/SDL2/include/SDL_opengles2_gl2platform.h b/Thirdparty/SDL2/include/SDL_opengles2_gl2platform.h new file mode 100644 index 0000000..426796e --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles2_gl2platform.h @@ -0,0 +1,27 @@ +#ifndef __gl2platform_h_ +#define __gl2platform_h_ + +/* +** Copyright 2017-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * Please contribute modifications back to Khronos as pull requests on the + * public github repository: + * https://github.com/KhronosGroup/OpenGL-Registry + */ + +/*#include */ + +#ifndef GL_APICALL +#define GL_APICALL KHRONOS_APICALL +#endif + +#ifndef GL_APIENTRY +#define GL_APIENTRY KHRONOS_APIENTRY +#endif + +#endif /* __gl2platform_h_ */ diff --git a/Thirdparty/SDL2/include/SDL_opengles2_khrplatform.h b/Thirdparty/SDL2/include/SDL_opengles2_khrplatform.h new file mode 100644 index 0000000..0164644 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_opengles2_khrplatform.h @@ -0,0 +1,311 @@ +#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_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY 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_APIENTRY + *------------------------------------------------------------------------- + * 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_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#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 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#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 KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +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_ */ diff --git a/Thirdparty/SDL2/include/SDL_pixels.h b/Thirdparty/SDL2/include/SDL_pixels.h new file mode 100644 index 0000000..9abd57b --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_pixels.h @@ -0,0 +1,644 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_pixels.h + * + * Header for the enumerated pixel format definitions. + */ + +#ifndef SDL_pixels_h_ +#define SDL_pixels_h_ + +#include "SDL_stdinc.h" +#include "SDL_endian.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Transparency definitions + * + * These define alpha as the opacity of a surface. + */ +/* @{ */ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/* @} */ + +/** Pixel type. */ +typedef enum +{ + SDL_PIXELTYPE_UNKNOWN, + SDL_PIXELTYPE_INDEX1, + SDL_PIXELTYPE_INDEX4, + SDL_PIXELTYPE_INDEX8, + SDL_PIXELTYPE_PACKED8, + SDL_PIXELTYPE_PACKED16, + SDL_PIXELTYPE_PACKED32, + SDL_PIXELTYPE_ARRAYU8, + SDL_PIXELTYPE_ARRAYU16, + SDL_PIXELTYPE_ARRAYU32, + SDL_PIXELTYPE_ARRAYF16, + SDL_PIXELTYPE_ARRAYF32 +} SDL_PixelType; + +/** Bitmap pixel order, high bit -> low bit. */ +typedef enum +{ + SDL_BITMAPORDER_NONE, + SDL_BITMAPORDER_4321, + SDL_BITMAPORDER_1234 +} SDL_BitmapOrder; + +/** Packed component order, high bit -> low bit. */ +typedef enum +{ + SDL_PACKEDORDER_NONE, + SDL_PACKEDORDER_XRGB, + SDL_PACKEDORDER_RGBX, + SDL_PACKEDORDER_ARGB, + SDL_PACKEDORDER_RGBA, + SDL_PACKEDORDER_XBGR, + SDL_PACKEDORDER_BGRX, + SDL_PACKEDORDER_ABGR, + SDL_PACKEDORDER_BGRA +} SDL_PackedOrder; + +/** Array component order, low byte -> high byte. */ +/* !!! FIXME: in 2.1, make these not overlap differently with + !!! FIXME: SDL_PACKEDORDER_*, so we can simplify SDL_ISPIXELFORMAT_ALPHA */ +typedef enum +{ + SDL_ARRAYORDER_NONE, + SDL_ARRAYORDER_RGB, + SDL_ARRAYORDER_RGBA, + SDL_ARRAYORDER_ARGB, + SDL_ARRAYORDER_BGR, + SDL_ARRAYORDER_BGRA, + SDL_ARRAYORDER_ABGR +} SDL_ArrayOrder; + +/** Packed component layout. */ +typedef enum +{ + SDL_PACKEDLAYOUT_NONE, + SDL_PACKEDLAYOUT_332, + SDL_PACKEDLAYOUT_4444, + SDL_PACKEDLAYOUT_1555, + SDL_PACKEDLAYOUT_5551, + SDL_PACKEDLAYOUT_565, + SDL_PACKEDLAYOUT_8888, + SDL_PACKEDLAYOUT_2101010, + SDL_PACKEDLAYOUT_1010102 +} SDL_PackedLayout; + +#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) + +#define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ + ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ + ((bits) << 8) | ((bytes) << 0)) + +#define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F) +#define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) +#define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) +#define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) +#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) +#define SDL_BYTESPERPIXEL(X) \ + (SDL_ISPIXELFORMAT_FOURCC(X) ? \ + ((((X) == SDL_PIXELFORMAT_YUY2) || \ + ((X) == SDL_PIXELFORMAT_UYVY) || \ + ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF)) + +#define SDL_ISPIXELFORMAT_INDEXED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) + +#define SDL_ISPIXELFORMAT_PACKED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32))) + +#define SDL_ISPIXELFORMAT_ARRAY(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) + +#define SDL_ISPIXELFORMAT_ALPHA(format) \ + ((SDL_ISPIXELFORMAT_PACKED(format) && \ + ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \ + (SDL_ISPIXELFORMAT_ARRAY(format) && \ + ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA)))) + +/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ +#define SDL_ISPIXELFORMAT_FOURCC(format) \ + ((format) && (SDL_PIXELFLAG(format) != 1)) + +/* Note: If you modify this list, update SDL_GetPixelFormatName() */ +typedef enum +{ + SDL_PIXELFORMAT_UNKNOWN, + SDL_PIXELFORMAT_INDEX1LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX1MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX4LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX4MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX8 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), + SDL_PIXELFORMAT_RGB332 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_332, 8, 1), + SDL_PIXELFORMAT_XRGB4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_4444, 12, 2), + SDL_PIXELFORMAT_RGB444 = SDL_PIXELFORMAT_XRGB4444, + SDL_PIXELFORMAT_XBGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_4444, 12, 2), + SDL_PIXELFORMAT_BGR444 = SDL_PIXELFORMAT_XBGR4444, + SDL_PIXELFORMAT_XRGB1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_RGB555 = SDL_PIXELFORMAT_XRGB1555, + SDL_PIXELFORMAT_XBGR1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_BGR555 = SDL_PIXELFORMAT_XBGR1555, + SDL_PIXELFORMAT_ARGB4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_RGBA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ABGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_BGRA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ARGB1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_RGBA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_ABGR1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_BGRA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_RGB565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_BGR565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_RGB24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, + 24, 3), + SDL_PIXELFORMAT_BGR24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0, + 24, 3), + SDL_PIXELFORMAT_XRGB8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_RGB888 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_RGBX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_XBGR8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_BGR888 = SDL_PIXELFORMAT_XBGR8888, + SDL_PIXELFORMAT_BGRX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_ARGB8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_RGBA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ABGR8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_BGRA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ARGB2101010 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_2101010, 32, 4), + + /* Aliases for RGBA byte arrays of color data, for the current platform */ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888, + SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888, + SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888, + SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888, +#else + SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888, + SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888, + SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888, + SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888, +#endif + + SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), + SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ + SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), + SDL_PIXELFORMAT_YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), + SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), + SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'), + SDL_PIXELFORMAT_NV12 = /**< Planar mode: Y + U/V interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'), + SDL_PIXELFORMAT_NV21 = /**< Planar mode: Y + V/U interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'), + SDL_PIXELFORMAT_EXTERNAL_OES = /**< Android video texture format */ + SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' ') +} SDL_PixelFormatEnum; + +/** + * The bits of this structure can be directly reinterpreted as an integer-packed + * color which uses the SDL_PIXELFORMAT_RGBA32 format (SDL_PIXELFORMAT_ABGR8888 + * on little-endian systems and SDL_PIXELFORMAT_RGBA8888 on big-endian systems). + */ +typedef struct SDL_Color +{ + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 a; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette +{ + int ncolors; + SDL_Color *colors; + Uint32 version; + int refcount; +} SDL_Palette; + +/** + * \note Everything in the pixel format structure is read-only. + */ +typedef struct SDL_PixelFormat +{ + Uint32 format; + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 padding[2]; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + int refcount; + struct SDL_PixelFormat *next; +} SDL_PixelFormat; + +/** + * Get the human readable name of a pixel format. + * + * \param format the pixel format to query + * \returns the human readable name of the specified pixel format or + * `SDL_PIXELFORMAT_UNKNOWN` if the format isn't recognized. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format); + +/** + * Convert one of the enumerated pixel formats to a bpp value and RGBA masks. + * + * \param format one of the SDL_PixelFormatEnum values + * \param bpp a bits per pixel value; usually 15, 16, or 32 + * \param Rmask a pointer filled in with the red mask for the format + * \param Gmask a pointer filled in with the green mask for the format + * \param Bmask a pointer filled in with the blue mask for the format + * \param Amask a pointer filled in with the alpha mask for the format + * \returns SDL_TRUE on success or SDL_FALSE if the conversion wasn't + * possible; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MasksToPixelFormatEnum + */ +extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, + int *bpp, + Uint32 * Rmask, + Uint32 * Gmask, + Uint32 * Bmask, + Uint32 * Amask); + +/** + * Convert a bpp value and RGBA masks to an enumerated pixel format. + * + * This will return `SDL_PIXELFORMAT_UNKNOWN` if the conversion wasn't + * possible. + * + * \param bpp a bits per pixel value; usually 15, 16, or 32 + * \param Rmask the red mask for the format + * \param Gmask the green mask for the format + * \param Bmask the blue mask for the format + * \param Amask the alpha mask for the format + * \returns one of the SDL_PixelFormatEnum values + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PixelFormatEnumToMasks + */ +extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); + +/** + * Create an SDL_PixelFormat structure corresponding to a pixel format. + * + * Returned structure may come from a shared global cache (i.e. not newly + * allocated), and hence should not be modified, especially the palette. Weird + * errors such as `Blit combination not supported` may occur. + * + * \param pixel_format one of the SDL_PixelFormatEnum values + * \returns the new SDL_PixelFormat structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeFormat + */ +extern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format); + +/** + * Free an SDL_PixelFormat structure allocated by SDL_AllocFormat(). + * + * \param format the SDL_PixelFormat structure to free + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + */ +extern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format); + +/** + * Create a palette structure with the specified number of color entries. + * + * The palette entries are initialized to white. + * + * \param ncolors represents the number of color entries in the color palette + * \returns a new SDL_Palette structure on success or NULL on failure (e.g. if + * there wasn't enough memory); call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreePalette + */ +extern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors); + +/** + * Set the palette for a pixel format structure. + * + * \param format the SDL_PixelFormat structure that will use the palette + * \param palette the SDL_Palette structure that will be used + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + * \sa SDL_FreePalette + */ +extern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format, + SDL_Palette *palette); + +/** + * Set a range of colors in a palette. + * + * \param palette the SDL_Palette structure to modify + * \param colors an array of SDL_Color structures to copy into the palette + * \param firstcolor the index of the first palette entry to modify + * \param ncolors the number of entries to modify + * \returns 0 on success or a negative error code if not all of the colors + * could be set; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette, + const SDL_Color * colors, + int firstcolor, int ncolors); + +/** + * Free a palette created with SDL_AllocPalette(). + * + * \param palette the SDL_Palette structure to be freed + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + */ +extern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette); + +/** + * Map an RGB triple to an opaque pixel value for a given pixel format. + * + * This function maps the RGB color value to the specified pixel format and + * returns the pixel value best approximating the given RGB color value for + * the given pixel format. + * + * If the format has a palette (8-bit) the index of the closest matching color + * in the palette will be returned. + * + * If the specified pixel format has an alpha component it will be returned as + * all 1 bits (fully opaque). + * + * If the pixel format bpp (color depth) is less than 32-bpp then the unused + * upper bits of the return value can safely be ignored (e.g., with a 16-bpp + * format the return value can be assigned to a Uint16, and similarly a Uint8 + * for an 8-bpp format). + * + * \param format an SDL_PixelFormat structure describing the pixel format + * \param r the red component of the pixel in the range 0-255 + * \param g the green component of the pixel in the range 0-255 + * \param b the blue component of the pixel in the range 0-255 + * \returns a pixel value + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_GetRGBA + * \sa SDL_MapRGBA + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b); + +/** + * Map an RGBA quadruple to a pixel value for a given pixel format. + * + * This function maps the RGBA color value to the specified pixel format and + * returns the pixel value best approximating the given RGBA color value for + * the given pixel format. + * + * If the specified pixel format has no alpha component the alpha value will + * be ignored (as it will be in formats with a palette). + * + * If the format has a palette (8-bit) the index of the closest matching color + * in the palette will be returned. + * + * If the pixel format bpp (color depth) is less than 32-bpp then the unused + * upper bits of the return value can safely be ignored (e.g., with a 16-bpp + * format the return value can be assigned to a Uint16, and similarly a Uint8 + * for an 8-bpp format). + * + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r the red component of the pixel in the range 0-255 + * \param g the green component of the pixel in the range 0-255 + * \param b the blue component of the pixel in the range 0-255 + * \param a the alpha component of the pixel in the range 0-255 + * \returns a pixel value + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_GetRGBA + * \sa SDL_MapRGB + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * Get RGB values from a pixel in the specified format. + * + * This function uses the entire 8-bit [0..255] range when converting color + * components from pixel formats with less than 8-bits per RGB component + * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, + * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). + * + * \param pixel a pixel value + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r a pointer filled in with the red component + * \param g a pointer filled in with the green component + * \param b a pointer filled in with the blue component + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGBA + * \sa SDL_MapRGB + * \sa SDL_MapRGBA + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b); + +/** + * Get RGBA values from a pixel in the specified format. + * + * This function uses the entire 8-bit [0..255] range when converting color + * components from pixel formats with less than 8-bits per RGB component + * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, + * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). + * + * If the surface has no alpha component, the alpha will be returned as 0xff + * (100% opaque). + * + * \param pixel a pixel value + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r a pointer filled in with the red component + * \param g a pointer filled in with the green component + * \param b a pointer filled in with the blue component + * \param a a pointer filled in with the alpha component + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_MapRGB + * \sa SDL_MapRGBA + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * Calculate a 256 entry gamma ramp for a gamma value. + * + * \param gamma a gamma value where 0.0 is black and 1.0 is identity + * \param ramp an array of 256 values filled in with the gamma ramp + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_pixels_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_platform.h b/Thirdparty/SDL2/include/SDL_platform.h new file mode 100644 index 0000000..d2a7e05 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_platform.h @@ -0,0 +1,261 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_platform.h + * + * Try to get a standard set of platform defines. + */ + +#ifndef SDL_platform_h_ +#define SDL_platform_h_ + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if (defined(linux) || defined(__linux) || defined(__linux__)) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(ANDROID) || defined(__ANDROID__) +#undef __ANDROID__ +#undef __LINUX__ /* do we need to do this? */ +#define __ANDROID__ 1 +#endif +#if defined(__NGAGE__) +#undef __NGAGE__ +#define __NGAGE__ 1 +#endif + +#if defined(__APPLE__) +/* lets us know what version of Mac OS X we're compiling on */ +#include +#include + +/* Fix building with older SDKs that don't define these + See this for more information: + https://stackoverflow.com/questions/12132933/preprocessor-macro-for-os-x-targets +*/ +#ifndef TARGET_OS_MACCATALYST +#define TARGET_OS_MACCATALYST 0 +#endif +#ifndef TARGET_OS_IOS +#define TARGET_OS_IOS 0 +#endif +#ifndef TARGET_OS_IPHONE +#define TARGET_OS_IPHONE 0 +#endif +#ifndef TARGET_OS_TV +#define TARGET_OS_TV 0 +#endif +#ifndef TARGET_OS_SIMULATOR +#define TARGET_OS_SIMULATOR 0 +#endif + +#if TARGET_OS_TV +#undef __TVOS__ +#define __TVOS__ 1 +#endif +#if TARGET_OS_IPHONE +/* if compiling for iOS */ +#undef __IPHONEOS__ +#define __IPHONEOS__ 1 +#undef __MACOSX__ +#else +/* if not compiling for iOS */ +#undef __MACOSX__ +#define __MACOSX__ 1 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 +# error SDL for Mac OS X only supports deploying on 10.7 and above. +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */ +#endif /* TARGET_OS_IPHONE */ +#endif /* defined(__APPLE__) */ + +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) || defined(__EMX__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__sun) && defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif + +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) +/* Try to find out if we're compiling for WinRT, GDK or non-WinRT/GDK */ +#if defined(_MSC_VER) && defined(__has_include) +#if __has_include() +#define HAVE_WINAPIFAMILY_H 1 +#else +#define HAVE_WINAPIFAMILY_H 0 +#endif + +/* If _USING_V110_SDK71_ is defined it means we are using the Windows XP toolset. */ +#elif defined(_MSC_VER) && (_MSC_VER >= 1700 && !_USING_V110_SDK71_) /* _MSC_VER == 1700 for Visual Studio 2012 */ +#define HAVE_WINAPIFAMILY_H 1 +#else +#define HAVE_WINAPIFAMILY_H 0 +#endif + +#if HAVE_WINAPIFAMILY_H +#include +#define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)) +#else +#define WINAPI_FAMILY_WINRT 0 +#endif /* HAVE_WINAPIFAMILY_H */ + +#if WINAPI_FAMILY_WINRT +#undef __WINRT__ +#define __WINRT__ 1 +#elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */ +#undef __WINGDK__ +#define __WINGDK__ 1 +#elif defined(_GAMING_XBOX_XBOXONE) +#undef __XBOXONE__ +#define __XBOXONE__ 1 +#elif defined(_GAMING_XBOX_SCARLETT) +#undef __XBOXSERIES__ +#define __XBOXSERIES__ 1 +#else +#undef __WINDOWS__ +#define __WINDOWS__ 1 +#endif +#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */ + +#if defined(__WINDOWS__) +#undef __WIN32__ +#define __WIN32__ 1 +#endif +/* This is to support generic "any GDK" separate from a platform-specific GDK */ +#if defined(__WINGDK__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) +#undef __GDK__ +#define __GDK__ 1 +#endif +#if defined(__PSP__) +#undef __PSP__ +#define __PSP__ 1 +#endif +#if defined(PS2) +#define __PS2__ 1 +#endif + +/* The NACL compiler defines __native_client__ and __pnacl__ + * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi + */ +#if defined(__native_client__) +#undef __LINUX__ +#undef __NACL__ +#define __NACL__ 1 +#endif +#if defined(__pnacl__) +#undef __LINUX__ +#undef __PNACL__ +#define __PNACL__ 1 +/* PNACL with newlib supports static linking only */ +#define __SDL_NOGETPROCADDR__ +#endif + +#if defined(__vita__) +#define __VITA__ 1 +#endif + +#if defined(__3DS__) +#undef __3DS__ +#define __3DS__ 1 +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the name of the platform. + * + * Here are the names returned for some (but not all) supported platforms: + * + * - "Windows" + * - "Mac OS X" + * - "Linux" + * - "iOS" + * - "Android" + * + * \returns the name of the platform. If the correct platform name is not + * available, returns a string beginning with the text "Unknown". + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_platform_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_power.h b/Thirdparty/SDL2/include/SDL_power.h new file mode 100644 index 0000000..1d75704 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_power.h @@ -0,0 +1,87 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_power_h_ +#define SDL_power_h_ + +/** + * \file SDL_power.h + * + * Header for the SDL power management routines. + */ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The basic state for the system's power supply. + */ +typedef enum +{ + SDL_POWERSTATE_UNKNOWN, /**< cannot determine power status */ + SDL_POWERSTATE_ON_BATTERY, /**< Not plugged in, running on the battery */ + SDL_POWERSTATE_NO_BATTERY, /**< Plugged in, no battery available */ + SDL_POWERSTATE_CHARGING, /**< Plugged in, charging battery */ + SDL_POWERSTATE_CHARGED /**< Plugged in, battery charged */ +} SDL_PowerState; + +/** + * Get the current power supply details. + * + * You should never take a battery status as absolute truth. Batteries + * (especially failing batteries) are delicate hardware, and the values + * reported here are best estimates based on what that hardware reports. It's + * not uncommon for older batteries to lose stored power much faster than it + * reports, or completely drain when reporting it has 20 percent left, etc. + * + * Battery status can change at any time; if you are concerned with power + * state, you should call this function frequently, and perhaps ignore changes + * until they seem to be stable for a few seconds. + * + * It's possible a platform can only report battery percentage or time left + * but not both. + * + * \param seconds seconds of battery life left, you can pass a NULL here if + * you don't care, will return -1 if we can't determine a + * value, or we're not running on a battery + * \param percent percentage of battery life left, between 0 and 100, you can + * pass a NULL here if you don't care, will return -1 if we + * can't determine a value, or we're not running on a battery + * \returns an SDL_PowerState enum representing the current battery state. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *seconds, int *percent); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_power_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_quit.h b/Thirdparty/SDL2/include/SDL_quit.h new file mode 100644 index 0000000..d8ceb89 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_quit.h @@ -0,0 +1,58 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_quit.h + * + * Include file for SDL quit event handling. + */ + +#ifndef SDL_quit_h_ +#define SDL_quit_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** + * \file SDL_quit.h + * + * An ::SDL_QUIT event is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate ::SDL_QUIT events as well. There is no way + * to determine the cause of an ::SDL_QUIT event, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + * + * \sa SDL_Quit() + */ + +/* There are no functions directly affecting the quit event */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT) > 0)) + +#endif /* SDL_quit_h_ */ diff --git a/Thirdparty/SDL2/include/SDL_rect.h b/Thirdparty/SDL2/include/SDL_rect.h new file mode 100644 index 0000000..9611a31 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_rect.h @@ -0,0 +1,376 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rect.h + * + * Header file for SDL_rect definition and management functions. + */ + +#ifndef SDL_rect_h_ +#define SDL_rect_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The structure that defines a point (integer) + * + * \sa SDL_EnclosePoints + * \sa SDL_PointInRect + */ +typedef struct SDL_Point +{ + int x; + int y; +} SDL_Point; + +/** + * The structure that defines a point (floating point) + * + * \sa SDL_EncloseFPoints + * \sa SDL_PointInFRect + */ +typedef struct SDL_FPoint +{ + float x; + float y; +} SDL_FPoint; + + +/** + * A rectangle, with the origin at the upper left (integer). + * + * \sa SDL_RectEmpty + * \sa SDL_RectEquals + * \sa SDL_HasIntersection + * \sa SDL_IntersectRect + * \sa SDL_IntersectRectAndLine + * \sa SDL_UnionRect + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Rect +{ + int x, y; + int w, h; +} SDL_Rect; + + +/** + * A rectangle, with the origin at the upper left (floating point). + * + * \sa SDL_FRectEmpty + * \sa SDL_FRectEquals + * \sa SDL_FRectEqualsEpsilon + * \sa SDL_HasIntersectionF + * \sa SDL_IntersectFRect + * \sa SDL_IntersectFRectAndLine + * \sa SDL_UnionFRect + * \sa SDL_EncloseFPoints + * \sa SDL_PointInFRect + */ +typedef struct SDL_FRect +{ + float x; + float y; + float w; + float h; +} SDL_FRect; + + +/** + * Returns true if point resides inside a rectangle. + */ +SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) +{ + return ( (p->x >= r->x) && (p->x < (r->x + r->w)) && + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +{ + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b) +{ + return (a && b && (a->x == b->x) && (a->y == b->y) && + (a->w == b->w) && (a->h == b->h)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Determine whether two rectangles intersect. + * + * If either pointer is NULL the function will return SDL_FALSE. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_IntersectRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A, + const SDL_Rect * B); + +/** + * Calculate the intersection of two rectangles. + * + * If `result` is NULL then this function will return SDL_FALSE. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \param result an SDL_Rect structure filled in with the intersection of + * rectangles `A` and `B` + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasIntersection + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * Calculate the union of two rectangles. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \param result an SDL_Rect structure filled in with the union of rectangles + * `A` and `B` + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * Calculate a minimal rectangle enclosing a set of points. + * + * If `clip` is not NULL then only points inside of the clipping rectangle are + * considered. + * + * \param points an array of SDL_Point structures representing points to be + * enclosed + * \param count the number of structures in the `points` array + * \param clip an SDL_Rect used for clipping or NULL to enclose all points + * \param result an SDL_Rect structure filled in with the minimal enclosing + * rectangle + * \returns SDL_TRUE if any points were enclosed or SDL_FALSE if all the + * points were outside of the clipping rectangle. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EnclosePoints(const SDL_Point * points, + int count, + const SDL_Rect * clip, + SDL_Rect * result); + +/** + * Calculate the intersection of a rectangle and line segment. + * + * This function is used to clip a line segment to a rectangle. A line segment + * contained entirely within the rectangle or that does not intersect will + * remain unchanged. A line segment that crosses the rectangle at either or + * both ends will be clipped to the boundary of the rectangle and the new + * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary. + * + * \param rect an SDL_Rect structure representing the rectangle to intersect + * \param X1 a pointer to the starting X-coordinate of the line + * \param Y1 a pointer to the starting Y-coordinate of the line + * \param X2 a pointer to the ending X-coordinate of the line + * \param Y2 a pointer to the ending Y-coordinate of the line + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect * + rect, int *X1, + int *Y1, int *X2, + int *Y2); + + +/* SDL_FRect versions... */ + +/** + * Returns true if point resides inside a rectangle. + */ +SDL_FORCE_INLINE SDL_bool SDL_PointInFRect(const SDL_FPoint *p, const SDL_FRect *r) +{ + return ( (p->x >= r->x) && (p->x < (r->x + r->w)) && + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEmpty(const SDL_FRect *r) +{ + return ((!r) || (r->w <= 0.0f) || (r->h <= 0.0f)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal, within some given epsilon. + * + * \since This function is available since SDL 2.0.22. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEqualsEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon) +{ + return (a && b && ((a == b) || + ((SDL_fabsf(a->x - b->x) <= epsilon) && + (SDL_fabsf(a->y - b->y) <= epsilon) && + (SDL_fabsf(a->w - b->w) <= epsilon) && + (SDL_fabsf(a->h - b->h) <= epsilon)))) + ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal, using a default epsilon. + * + * \since This function is available since SDL 2.0.22. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEquals(const SDL_FRect *a, const SDL_FRect *b) +{ + return SDL_FRectEqualsEpsilon(a, b, SDL_FLT_EPSILON); +} + +/** + * Determine whether two rectangles intersect with float precision. + * + * If either pointer is NULL the function will return SDL_FALSE. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_IntersectRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersectionF(const SDL_FRect * A, + const SDL_FRect * B); + +/** + * Calculate the intersection of two rectangles with float precision. + * + * If `result` is NULL then this function will return SDL_FALSE. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \param result an SDL_FRect structure filled in with the intersection of + * rectangles `A` and `B` + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_HasIntersectionF + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectFRect(const SDL_FRect * A, + const SDL_FRect * B, + SDL_FRect * result); + +/** + * Calculate the union of two rectangles with float precision. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \param result an SDL_FRect structure filled in with the union of rectangles + * `A` and `B` + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC void SDLCALL SDL_UnionFRect(const SDL_FRect * A, + const SDL_FRect * B, + SDL_FRect * result); + +/** + * Calculate a minimal rectangle enclosing a set of points with float + * precision. + * + * If `clip` is not NULL then only points inside of the clipping rectangle are + * considered. + * + * \param points an array of SDL_FPoint structures representing points to be + * enclosed + * \param count the number of structures in the `points` array + * \param clip an SDL_FRect used for clipping or NULL to enclose all points + * \param result an SDL_FRect structure filled in with the minimal enclosing + * rectangle + * \returns SDL_TRUE if any points were enclosed or SDL_FALSE if all the + * points were outside of the clipping rectangle. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EncloseFPoints(const SDL_FPoint * points, + int count, + const SDL_FRect * clip, + SDL_FRect * result); + +/** + * Calculate the intersection of a rectangle and line segment with float + * precision. + * + * This function is used to clip a line segment to a rectangle. A line segment + * contained entirely within the rectangle or that does not intersect will + * remain unchanged. A line segment that crosses the rectangle at either or + * both ends will be clipped to the boundary of the rectangle and the new + * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary. + * + * \param rect an SDL_FRect structure representing the rectangle to intersect + * \param X1 a pointer to the starting X-coordinate of the line + * \param Y1 a pointer to the starting Y-coordinate of the line + * \param X2 a pointer to the ending X-coordinate of the line + * \param Y2 a pointer to the ending Y-coordinate of the line + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectFRectAndLine(const SDL_FRect * + rect, float *X1, + float *Y1, float *X2, + float *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_rect_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_render.h b/Thirdparty/SDL2/include/SDL_render.h new file mode 100644 index 0000000..d62715a --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_render.h @@ -0,0 +1,1924 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_render.h + * + * Header file for SDL 2D rendering functions. + * + * This API supports the following features: + * * single pixel points + * * single pixel lines + * * filled rectangles + * * texture images + * + * The primitives may be drawn in opaque, blended, or additive modes. + * + * The texture images may be drawn in opaque, blended, or additive modes. + * They can have an additional color tint or alpha modulation applied to + * them, and may also be stretched with linear interpolation. + * + * This API is designed to accelerate simple 2D operations. You may + * want more functionality such as polygons and particle effects and + * in that case you should use SDL's OpenGL/Direct3D support or one + * of the many good 3D engines. + * + * These functions must be called from the main thread. + * See this bug for details: http://bugzilla.libsdl.org/show_bug.cgi?id=1995 + */ + +#ifndef SDL_render_h_ +#define SDL_render_h_ + +#include "SDL_stdinc.h" +#include "SDL_rect.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Flags used when creating a rendering context + */ +typedef enum +{ + SDL_RENDERER_SOFTWARE = 0x00000001, /**< The renderer is a software fallback */ + SDL_RENDERER_ACCELERATED = 0x00000002, /**< The renderer uses hardware + acceleration */ + SDL_RENDERER_PRESENTVSYNC = 0x00000004, /**< Present is synchronized + with the refresh rate */ + SDL_RENDERER_TARGETTEXTURE = 0x00000008 /**< The renderer supports + rendering to texture */ +} SDL_RendererFlags; + +/** + * Information on the capabilities of a render driver or context. + */ +typedef struct SDL_RendererInfo +{ + const char *name; /**< The name of the renderer */ + Uint32 flags; /**< Supported ::SDL_RendererFlags */ + Uint32 num_texture_formats; /**< The number of available texture formats */ + Uint32 texture_formats[16]; /**< The available texture formats */ + int max_texture_width; /**< The maximum texture width */ + int max_texture_height; /**< The maximum texture height */ +} SDL_RendererInfo; + +/** + * Vertex structure + */ +typedef struct SDL_Vertex +{ + SDL_FPoint position; /**< Vertex position, in SDL_Renderer coordinates */ + SDL_Color color; /**< Vertex color */ + SDL_FPoint tex_coord; /**< Normalized texture coordinates, if needed */ +} SDL_Vertex; + +/** + * The scaling mode for a texture. + */ +typedef enum +{ + SDL_ScaleModeNearest, /**< nearest pixel sampling */ + SDL_ScaleModeLinear, /**< linear filtering */ + SDL_ScaleModeBest /**< anisotropic filtering */ +} SDL_ScaleMode; + +/** + * The access pattern allowed for a texture. + */ +typedef enum +{ + SDL_TEXTUREACCESS_STATIC, /**< Changes rarely, not lockable */ + SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */ + SDL_TEXTUREACCESS_TARGET /**< Texture can be used as a render target */ +} SDL_TextureAccess; + +/** + * The texture channel modulation used in SDL_RenderCopy(). + */ +typedef enum +{ + SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */ + SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */ + SDL_TEXTUREMODULATE_ALPHA = 0x00000002 /**< srcA = srcA * alpha */ +} SDL_TextureModulate; + +/** + * Flip constants for SDL_RenderCopyEx + */ +typedef enum +{ + SDL_FLIP_NONE = 0x00000000, /**< Do not flip */ + SDL_FLIP_HORIZONTAL = 0x00000001, /**< flip horizontally */ + SDL_FLIP_VERTICAL = 0x00000002 /**< flip vertically */ +} SDL_RendererFlip; + +/** + * A structure representing rendering state + */ +struct SDL_Renderer; +typedef struct SDL_Renderer SDL_Renderer; + +/** + * An efficient driver-specific representation of pixel data + */ +struct SDL_Texture; +typedef struct SDL_Texture SDL_Texture; + +/* Function prototypes */ + +/** + * Get the number of 2D rendering drivers available for the current display. + * + * A render driver is a set of code that handles rendering and texture + * management on a particular display. Normally there is only one, but some + * drivers may have several available with different capabilities. + * + * There may be none if SDL was compiled without render support. + * + * \returns a number >= 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_GetRenderDriverInfo + */ +extern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); + +/** + * Get info about a specific 2D rendering driver for the current display. + * + * \param index the index of the driver to query information about + * \param info an SDL_RendererInfo structure to be filled with information on + * the rendering driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_GetNumRenderDrivers + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index, + SDL_RendererInfo * info); + +/** + * Create a window and default renderer. + * + * \param width the width of the window + * \param height the height of the window + * \param window_flags the flags used to create the window (see + * SDL_CreateWindow()) + * \param window a pointer filled with the window, or NULL on error + * \param renderer a pointer filled with the renderer, or NULL on error + * \returns 0 on success, or -1 on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_CreateWindow + */ +extern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer( + int width, int height, Uint32 window_flags, + SDL_Window **window, SDL_Renderer **renderer); + + +/** + * Create a 2D rendering context for a window. + * + * \param window the window where rendering is displayed + * \param index the index of the rendering driver to initialize, or -1 to + * initialize the first one supporting the requested flags + * \param flags 0, or one or more SDL_RendererFlags OR'd together + * \returns a valid rendering context or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSoftwareRenderer + * \sa SDL_DestroyRenderer + * \sa SDL_GetNumRenderDrivers + * \sa SDL_GetRendererInfo + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window, + int index, Uint32 flags); + +/** + * Create a 2D software rendering context for a surface. + * + * Two other API which can be used to create SDL_Renderer: + * SDL_CreateRenderer() and SDL_CreateWindowAndRenderer(). These can _also_ + * create a software renderer, but they are intended to be used with an + * SDL_Window as the final destination and not an SDL_Surface. + * + * \param surface the SDL_Surface structure representing the surface where + * rendering is done + * \returns a valid rendering context or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_CreateWindowRenderer + * \sa SDL_DestroyRenderer + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface); + +/** + * Get the renderer associated with a window. + * + * \param window the window to query + * \returns the rendering context on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window); + +/** + * Get the window associated with a renderer. + * + * \param renderer the renderer to query + * \returns the window on success or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_RenderGetWindow(SDL_Renderer *renderer); + +/** + * Get information about a rendering context. + * + * \param renderer the rendering context + * \param info an SDL_RendererInfo structure filled with information about the + * current renderer + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer, + SDL_RendererInfo * info); + +/** + * Get the output size in pixels of a rendering context. + * + * Due to high-dpi displays, you might end up with a rendering context that + * has more pixels than the window that contains it, so use this instead of + * SDL_GetWindowSize() to decide how much drawing area you have. + * + * \param renderer the rendering context + * \param w an int filled with the width + * \param h an int filled with the height + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderer + */ +extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, + int *w, int *h); + +/** + * Create a texture for a rendering context. + * + * You can set the texture scaling method by setting + * `SDL_HINT_RENDER_SCALE_QUALITY` before creating the texture. + * + * \param renderer the rendering context + * \param format one of the enumerated values in SDL_PixelFormatEnum + * \param access one of the enumerated values in SDL_TextureAccess + * \param w the width of the texture in pixels + * \param h the height of the texture in pixels + * \returns a pointer to the created texture or NULL if no rendering context + * was active, the format was unsupported, or the width or height + * were out of range; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTextureFromSurface + * \sa SDL_DestroyTexture + * \sa SDL_QueryTexture + * \sa SDL_UpdateTexture + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer, + Uint32 format, + int access, int w, + int h); + +/** + * Create a texture from an existing surface. + * + * The surface is not modified or freed by this function. + * + * The SDL_TextureAccess hint for the created texture is + * `SDL_TEXTUREACCESS_STATIC`. + * + * The pixel format of the created texture may be different from the pixel + * format of the surface. Use SDL_QueryTexture() to query the pixel format of + * the texture. + * + * \param renderer the rendering context + * \param surface the SDL_Surface structure containing pixel data used to fill + * the texture + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_DestroyTexture + * \sa SDL_QueryTexture + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface); + +/** + * Query the attributes of a texture. + * + * \param texture the texture to query + * \param format a pointer filled in with the raw format of the texture; the + * actual format may differ, but pixel transfers will use this + * format (one of the SDL_PixelFormatEnum values). This argument + * can be NULL if you don't need this information. + * \param access a pointer filled in with the actual access to the texture + * (one of the SDL_TextureAccess values). This argument can be + * NULL if you don't need this information. + * \param w a pointer filled in with the width of the texture in pixels. This + * argument can be NULL if you don't need this information. + * \param h a pointer filled in with the height of the texture in pixels. This + * argument can be NULL if you don't need this information. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + */ +extern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_Texture * texture, + Uint32 * format, int *access, + int *w, int *h); + +/** + * Set an additional color value multiplied into render copy operations. + * + * When this texture is rendered, during the copy operation each source color + * channel is modulated by the appropriate color value according to the + * following formula: + * + * `srcC = srcC * (color / 255)` + * + * Color modulation is not always supported by the renderer; it will return -1 + * if color modulation is not supported. + * + * \param texture the texture to update + * \param r the red color value multiplied into copy operations + * \param g the green color value multiplied into copy operations + * \param b the blue color value multiplied into copy operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureColorMod + * \sa SDL_SetTextureAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_Texture * texture, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * Get the additional color value multiplied into render copy operations. + * + * \param texture the texture to query + * \param r a pointer filled in with the current red color value + * \param g a pointer filled in with the current green color value + * \param b a pointer filled in with the current blue color value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureAlphaMod + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_Texture * texture, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * Set an additional alpha value multiplied into render copy operations. + * + * When this texture is rendered, during the copy operation the source alpha + * value is modulated by this alpha value according to the following formula: + * + * `srcA = srcA * (alpha / 255)` + * + * Alpha modulation is not always supported by the renderer; it will return -1 + * if alpha modulation is not supported. + * + * \param texture the texture to update + * \param alpha the source alpha value multiplied into copy operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureAlphaMod + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture, + Uint8 alpha); + +/** + * Get the additional alpha value multiplied into render copy operations. + * + * \param texture the texture to query + * \param alpha a pointer filled in with the current alpha value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureColorMod + * \sa SDL_SetTextureAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_Texture * texture, + Uint8 * alpha); + +/** + * Set the blend mode for a texture, used by SDL_RenderCopy(). + * + * If the blend mode is not supported, the closest supported mode is chosen + * and this function returns -1. + * + * \param texture the texture to update + * \param blendMode the SDL_BlendMode to use for texture blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureBlendMode + * \sa SDL_RenderCopy + */ +extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for texture copy operations. + * + * \param texture the texture to query + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetTextureBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode *blendMode); + +/** + * Set the scale mode used for texture scale operations. + * + * If the scale mode is not supported, the closest supported mode is chosen. + * + * \param texture The texture to update. + * \param scaleMode the SDL_ScaleMode to use for texture scaling. + * \returns 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_GetTextureScaleMode + */ +extern DECLSPEC int SDLCALL SDL_SetTextureScaleMode(SDL_Texture * texture, + SDL_ScaleMode scaleMode); + +/** + * Get the scale mode used for texture scale operations. + * + * \param texture the texture to query. + * \param scaleMode a pointer filled in with the current scale mode. + * \return 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_SetTextureScaleMode + */ +extern DECLSPEC int SDLCALL SDL_GetTextureScaleMode(SDL_Texture * texture, + SDL_ScaleMode *scaleMode); + +/** + * Associate a user-specified pointer with a texture. + * + * \param texture the texture to update. + * \param userdata the pointer to associate with the texture. + * \returns 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GetTextureUserData + */ +extern DECLSPEC int SDLCALL SDL_SetTextureUserData(SDL_Texture * texture, + void *userdata); + +/** + * Get the user-specified pointer associated with a texture + * + * \param texture the texture to query. + * \return the pointer associated with the texture, or NULL if the texture is + * not valid. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_SetTextureUserData + */ +extern DECLSPEC void * SDLCALL SDL_GetTextureUserData(SDL_Texture * texture); + +/** + * Update the given texture rectangle with new pixel data. + * + * The pixel data must be in the pixel format of the texture. Use + * SDL_QueryTexture() to query the pixel format of the texture. + * + * This is a fairly slow function, intended for use with static textures that + * do not change often. + * + * If the texture is intended to be updated often, it is preferred to create + * the texture as streaming and use the locking functions referenced below. + * While this function will work with streaming textures, for optimization + * reasons you may not get the pixels back if you lock the texture afterward. + * + * \param texture the texture to update + * \param rect an SDL_Rect structure representing the area to update, or NULL + * to update the entire texture + * \param pixels the raw pixel data in the format of the texture + * \param pitch the number of bytes in a row of pixel data, including padding + * between lines + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_LockTexture + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const void *pixels, int pitch); + +/** + * Update a rectangle within a planar YV12 or IYUV texture with new pixel + * data. + * + * You can use SDL_UpdateTexture() as long as your pixel data is a contiguous + * block of Y and U/V planes in the proper order, but this function is + * available if your pixel data is not contiguous. + * + * \param texture the texture to update + * \param rect a pointer to the rectangle of pixels to update, or NULL to + * update the entire texture + * \param Yplane the raw pixel data for the Y plane + * \param Ypitch the number of bytes between rows of pixel data for the Y + * plane + * \param Uplane the raw pixel data for the U plane + * \param Upitch the number of bytes between rows of pixel data for the U + * plane + * \param Vplane the raw pixel data for the V plane + * \param Vpitch the number of bytes between rows of pixel data for the V + * plane + * \returns 0 on success or -1 if the texture is not valid; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_UpdateTexture + */ +extern DECLSPEC int SDLCALL SDL_UpdateYUVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *Uplane, int Upitch, + const Uint8 *Vplane, int Vpitch); + +/** + * Update a rectangle within a planar NV12 or NV21 texture with new pixels. + * + * You can use SDL_UpdateTexture() as long as your pixel data is a contiguous + * block of NV12/21 planes in the proper order, but this function is available + * if your pixel data is not contiguous. + * + * \param texture the texture to update + * \param rect a pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param Yplane the raw pixel data for the Y plane. + * \param Ypitch the number of bytes between rows of pixel data for the Y + * plane. + * \param UVplane the raw pixel data for the UV plane. + * \param UVpitch the number of bytes between rows of pixel data for the UV + * plane. + * \return 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_UpdateNVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *UVplane, int UVpitch); + +/** + * Lock a portion of the texture for **write-only** pixel access. + * + * As an optimization, the pixels made available for editing don't necessarily + * contain the old texture data. This is a write-only operation, and if you + * need to keep a copy of the texture data you should do that at the + * application level. + * + * You must use SDL_UnlockTexture() to unlock the pixels and apply any + * changes. + * + * \param texture the texture to lock for access, which was created with + * `SDL_TEXTUREACCESS_STREAMING` + * \param rect an SDL_Rect structure representing the area to lock for access; + * NULL to lock the entire texture + * \param pixels this is filled in with a pointer to the locked pixels, + * appropriately offset by the locked area + * \param pitch this is filled in with the pitch of the locked pixels; the + * pitch is the length of one row in bytes + * \returns 0 on success or a negative error code if the texture is not valid + * or was not created with `SDL_TEXTUREACCESS_STREAMING`; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture, + const SDL_Rect * rect, + void **pixels, int *pitch); + +/** + * Lock a portion of the texture for **write-only** pixel access, and expose + * it as a SDL surface. + * + * Besides providing an SDL_Surface instead of raw pixel data, this function + * operates like SDL_LockTexture. + * + * As an optimization, the pixels made available for editing don't necessarily + * contain the old texture data. This is a write-only operation, and if you + * need to keep a copy of the texture data you should do that at the + * application level. + * + * You must use SDL_UnlockTexture() to unlock the pixels and apply any + * changes. + * + * The returned surface is freed internally after calling SDL_UnlockTexture() + * or SDL_DestroyTexture(). The caller should not free it. + * + * \param texture the texture to lock for access, which was created with + * `SDL_TEXTUREACCESS_STREAMING` + * \param rect a pointer to the rectangle to lock for access. If the rect is + * NULL, the entire texture will be locked + * \param surface this is filled in with an SDL surface representing the + * locked area + * \returns 0 on success, or -1 if the texture is not valid or was not created + * with `SDL_TEXTUREACCESS_STREAMING` + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_LockTexture + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, + const SDL_Rect *rect, + SDL_Surface **surface); + +/** + * Unlock a texture, uploading the changes to video memory, if needed. + * + * **Warning**: Please note that SDL_LockTexture() is intended to be + * write-only; it will not guarantee the previous contents of the texture will + * be provided. You must fully initialize any area of a texture that you lock + * before unlocking it, as the pixels might otherwise be uninitialized memory. + * + * Which is to say: locking and immediately unlocking a texture can result in + * corrupted textures, depending on the renderer in use. + * + * \param texture a texture locked by SDL_LockTexture() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockTexture + */ +extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture); + +/** + * Determine whether a renderer supports the use of render targets. + * + * \param renderer the renderer that will be checked + * \returns SDL_TRUE if supported or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderTarget + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderTargetSupported(SDL_Renderer *renderer); + +/** + * Set a texture as the current rendering target. + * + * Before using this function, you should check the + * `SDL_RENDERER_TARGETTEXTURE` bit in the flags of SDL_RendererInfo to see if + * render targets are supported. + * + * The default render target is the window for which the renderer was created. + * To stop rendering to a texture and render to the window again, call this + * function with a NULL `texture`. + * + * \param renderer the rendering context + * \param texture the targeted texture, which must be created with the + * `SDL_TEXTUREACCESS_TARGET` flag, or NULL to render to the + * window instead of a texture. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderTarget + */ +extern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, + SDL_Texture *texture); + +/** + * Get the current render target. + * + * The default render target is the window for which the renderer was created, + * and is reported a NULL here. + * + * \param renderer the rendering context + * \returns the current render target or NULL for the default render target. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderTarget + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer); + +/** + * Set a device independent resolution for rendering. + * + * This function uses the viewport and scaling functionality to allow a fixed + * logical resolution for rendering, regardless of the actual output + * resolution. If the actual output resolution doesn't have the same aspect + * ratio the output rendering will be centered within the output display. + * + * If the output display is a window, mouse and touch events in the window + * will be filtered and scaled so they seem to arrive within the logical + * resolution. The SDL_HINT_MOUSE_RELATIVE_SCALING hint controls whether + * relative motion events are also scaled. + * + * If this function results in scaling or subpixel drawing by the rendering + * backend, it will be handled using the appropriate quality hints. + * + * \param renderer the renderer for which resolution should be set + * \param w the width of the logical resolution + * \param h the height of the logical resolution + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h); + +/** + * Get device independent resolution for rendering. + * + * When using the main rendering target (eg no target texture is set): this + * may return 0 for `w` and `h` if the SDL_Renderer has never had its logical + * size set by SDL_RenderSetLogicalSize(). Otherwise it returns the logical + * width and height. + * + * When using a target texture: Never return 0 for `w` and `h` at first. Then + * it returns the logical width and height that are set. + * + * \param renderer a rendering context + * \param w an int to be filled with the width + * \param h an int to be filled with the height + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h); + +/** + * Set whether to force integer scales for resolution-independent rendering. + * + * This function restricts the logical viewport to integer values - that is, + * when a resolution is between two multiples of a logical size, the viewport + * size is rounded down to the lower multiple. + * + * \param renderer the renderer for which integer scaling should be set + * \param enable enable or disable the integer scaling for rendering + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RenderGetIntegerScale + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetIntegerScale(SDL_Renderer * renderer, + SDL_bool enable); + +/** + * Get whether integer scales are forced for resolution-independent rendering. + * + * \param renderer the renderer from which integer scaling should be queried + * \returns SDL_TRUE if integer scales are forced or SDL_FALSE if not and on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RenderSetIntegerScale + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderGetIntegerScale(SDL_Renderer * renderer); + +/** + * Set the drawing area for rendering on the current target. + * + * When the window is resized, the viewport is reset to fill the entire new + * window size. + * + * \param renderer the rendering context + * \param rect the SDL_Rect structure representing the drawing area, or NULL + * to set the viewport to the entire target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetViewport + */ +extern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Get the drawing area for the current target. + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure filled in with the current drawing area + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetViewport + */ +extern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * Set the clip rectangle for rendering on the specified target. + * + * \param renderer the rendering context for which clip rectangle should be + * set + * \param rect an SDL_Rect structure representing the clip area, relative to + * the viewport, or NULL to disable clipping + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetClipRect + * \sa SDL_RenderIsClipEnabled + */ +extern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Get the clip rectangle for the current target. + * + * \param renderer the rendering context from which clip rectangle should be + * queried + * \param rect an SDL_Rect structure filled in with the current clipping area + * or an empty rectangle if clipping is disabled + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderIsClipEnabled + * \sa SDL_RenderSetClipRect + */ +extern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * Get whether clipping is enabled on the given renderer. + * + * \param renderer the renderer from which clip state should be queried + * \returns SDL_TRUE if clipping is enabled or SDL_FALSE if not; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_RenderGetClipRect + * \sa SDL_RenderSetClipRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderIsClipEnabled(SDL_Renderer * renderer); + + +/** + * Set the drawing scale for rendering on the current target. + * + * The drawing coordinates are scaled by the x/y scaling factors before they + * are used by the renderer. This allows resolution independent drawing with a + * single coordinate system. + * + * If this results in scaling or subpixel drawing by the rendering backend, it + * will be handled using the appropriate quality hints. For best results use + * integer scaling factors. + * + * \param renderer a rendering context + * \param scaleX the horizontal scaling factor + * \param scaleY the vertical scaling factor + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetScale(SDL_Renderer * renderer, + float scaleX, float scaleY); + +/** + * Get the drawing scale for the current target. + * + * \param renderer the renderer from which drawing scale should be queried + * \param scaleX a pointer filled in with the horizontal scaling factor + * \param scaleY a pointer filled in with the vertical scaling factor + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetScale + */ +extern DECLSPEC void SDLCALL SDL_RenderGetScale(SDL_Renderer * renderer, + float *scaleX, float *scaleY); + +/** + * Get logical coordinates of point in renderer when given real coordinates of + * point in window. + * + * Logical coordinates will differ from real coordinates when render is scaled + * and logical renderer size set + * + * \param renderer the renderer from which the logical coordinates should be + * calculated + * \param windowX the real X coordinate in the window + * \param windowY the real Y coordinate in the window + * \param logicalX the pointer filled with the logical x coordinate + * \param logicalY the pointer filled with the logical y coordinate + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetScale + * \sa SDL_RenderGetLogicalSize + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderWindowToLogical(SDL_Renderer * renderer, + int windowX, int windowY, + float *logicalX, float *logicalY); + + +/** + * Get real coordinates of point in window when given logical coordinates of + * point in renderer. + * + * Logical coordinates will differ from real coordinates when render is scaled + * and logical renderer size set + * + * \param renderer the renderer from which the window coordinates should be + * calculated + * \param logicalX the logical x coordinate + * \param logicalY the logical y coordinate + * \param windowX the pointer filled with the real X coordinate in the window + * \param windowY the pointer filled with the real Y coordinate in the window + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetScale + * \sa SDL_RenderGetLogicalSize + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderLogicalToWindow(SDL_Renderer * renderer, + float logicalX, float logicalY, + int *windowX, int *windowY); + +/** + * Set the color used for drawing operations (Rect, Line and Clear). + * + * Set the color for drawing or filling rectangles, lines, and points, and for + * SDL_RenderClear(). + * + * \param renderer the rendering context + * \param r the red value used to draw on the rendering target + * \param g the green value used to draw on the rendering target + * \param b the blue value used to draw on the rendering target + * \param a the alpha value used to draw on the rendering target; usually + * `SDL_ALPHA_OPAQUE` (255). Use SDL_SetRenderDrawBlendMode to + * specify how the alpha channel is used + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderDrawColor + * \sa SDL_RenderClear + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawColor(SDL_Renderer * renderer, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * Get the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer the rendering context + * \param r a pointer filled in with the red value used to draw on the + * rendering target + * \param g a pointer filled in with the green value used to draw on the + * rendering target + * \param b a pointer filled in with the blue value used to draw on the + * rendering target + * \param a a pointer filled in with the alpha value used to draw on the + * rendering target; usually `SDL_ALPHA_OPAQUE` (255) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawColor(SDL_Renderer * renderer, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * Set the blend mode used for drawing operations (Fill and Line). + * + * If the blend mode is not supported, the closest supported mode is chosen. + * + * \param renderer the rendering context + * \param blendMode the SDL_BlendMode to use for blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderDrawBlendMode + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for drawing operations. + * + * \param renderer the rendering context + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode *blendMode); + +/** + * Clear the current rendering target with the drawing color. + * + * This function clears the entire rendering target, ignoring the viewport and + * the clip rectangle. + * + * \param renderer the rendering context + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer); + +/** + * Draw a point on the current rendering target. + * + * SDL_RenderDrawPoint() draws a single point. If you want to draw multiple, + * use SDL_RenderDrawPoints() instead. + * + * \param renderer the rendering context + * \param x the x coordinate of the point + * \param y the y coordinate of the point + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoint(SDL_Renderer * renderer, + int x, int y); + +/** + * Draw multiple points on the current rendering target. + * + * \param renderer the rendering context + * \param points an array of SDL_Point structures that represent the points to + * draw + * \param count the number of points to draw + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * Draw a line on the current rendering target. + * + * SDL_RenderDrawLine() draws the line to include both end points. If you want + * to draw multiple, connecting lines use SDL_RenderDrawLines() instead. + * + * \param renderer the rendering context + * \param x1 the x coordinate of the start point + * \param y1 the y coordinate of the start point + * \param x2 the x coordinate of the end point + * \param y2 the y coordinate of the end point + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLine(SDL_Renderer * renderer, + int x1, int y1, int x2, int y2); + +/** + * Draw a series of connected lines on the current rendering target. + * + * \param renderer the rendering context + * \param points an array of SDL_Point structures representing points along + * the lines + * \param count the number of points, drawing count-1 lines + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * Draw a rectangle on the current rendering target. + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure representing the rectangle to draw, or + * NULL to outline the entire rendering target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Draw some number of rectangles on the current rendering target. + * + * \param renderer the rendering context + * \param rects an array of SDL_Rect structures representing the rectangles to + * be drawn + * \param count the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * Fill a rectangle on the current rendering target with the drawing color. + * + * The current drawing color is set by SDL_SetRenderDrawColor(), and the + * color's alpha value is ignored unless blending is enabled with the + * appropriate call to SDL_SetRenderDrawBlendMode(). + * + * \param renderer the rendering context + * \param rect the SDL_Rect structure representing the rectangle to fill, or + * NULL for the entire rendering target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Fill some number of rectangles on the current rendering target with the + * drawing color. + * + * \param renderer the rendering context + * \param rects an array of SDL_Rect structures representing the rectangles to + * be filled + * \param count the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderPresent + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * Copy a portion of the texture to the current rendering target. + * + * The texture is blended with the destination based on its blend mode set + * with SDL_SetTextureBlendMode(). + * + * The texture color is affected based on its color modulation set by + * SDL_SetTextureColorMod(). + * + * The texture alpha is affected based on its alpha modulation set by + * SDL_SetTextureAlphaMod(). + * + * \param renderer the rendering context + * \param texture the source texture + * \param srcrect the source SDL_Rect structure or NULL for the entire texture + * \param dstrect the destination SDL_Rect structure or NULL for the entire + * rendering target; the texture will be stretched to fill the + * given rectangle + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderCopyEx + * \sa SDL_SetTextureAlphaMod + * \sa SDL_SetTextureBlendMode + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect); + +/** + * Copy a portion of the texture to the current rendering, with optional + * rotation and flipping. + * + * Copy a portion of the texture to the current rendering target, optionally + * rotating it by angle around the given center and also flipping it + * top-bottom and/or left-right. + * + * The texture is blended with the destination based on its blend mode set + * with SDL_SetTextureBlendMode(). + * + * The texture color is affected based on its color modulation set by + * SDL_SetTextureColorMod(). + * + * The texture alpha is affected based on its alpha modulation set by + * SDL_SetTextureAlphaMod(). + * + * \param renderer the rendering context + * \param texture the source texture + * \param srcrect the source SDL_Rect structure or NULL for the entire texture + * \param dstrect the destination SDL_Rect structure or NULL for the entire + * rendering target + * \param angle an angle in degrees that indicates the rotation that will be + * applied to dstrect, rotating it in a clockwise direction + * \param center a pointer to a point indicating the point around which + * dstrect will be rotated (if NULL, rotation will be done + * around `dstrect.w / 2`, `dstrect.h / 2`) + * \param flip a SDL_RendererFlip value stating which flipping actions should + * be performed on the texture + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderCopy + * \sa SDL_SetTextureAlphaMod + * \sa SDL_SetTextureBlendMode + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyEx(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect, + const double angle, + const SDL_Point *center, + const SDL_RendererFlip flip); + + +/** + * Draw a point on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a point. + * \param x The x coordinate of the point. + * \param y The y coordinate of the point. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPointF(SDL_Renderer * renderer, + float x, float y); + +/** + * Draw multiple points on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw multiple points. + * \param points The points to draw + * \param count The number of points to draw + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPointsF(SDL_Renderer * renderer, + const SDL_FPoint * points, + int count); + +/** + * Draw a line on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a line. + * \param x1 The x coordinate of the start point. + * \param y1 The y coordinate of the start point. + * \param x2 The x coordinate of the end point. + * \param y2 The y coordinate of the end point. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLineF(SDL_Renderer * renderer, + float x1, float y1, float x2, float y2); + +/** + * Draw a series of connected lines on the current rendering target at + * subpixel precision. + * + * \param renderer The renderer which should draw multiple lines. + * \param points The points along the lines + * \param count The number of points, drawing count-1 lines + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLinesF(SDL_Renderer * renderer, + const SDL_FPoint * points, + int count); + +/** + * Draw a rectangle on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a rectangle. + * \param rect A pointer to the destination rectangle, or NULL to outline the + * entire rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRectF(SDL_Renderer * renderer, + const SDL_FRect * rect); + +/** + * Draw some number of rectangles on the current rendering target at subpixel + * precision. + * + * \param renderer The renderer which should draw multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRectsF(SDL_Renderer * renderer, + const SDL_FRect * rects, + int count); + +/** + * Fill a rectangle on the current rendering target with the drawing color at + * subpixel precision. + * + * \param renderer The renderer which should fill a rectangle. + * \param rect A pointer to the destination rectangle, or NULL for the entire + * rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRectF(SDL_Renderer * renderer, + const SDL_FRect * rect); + +/** + * Fill some number of rectangles on the current rendering target with the + * drawing color at subpixel precision. + * + * \param renderer The renderer which should fill multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRectsF(SDL_Renderer * renderer, + const SDL_FRect * rects, + int count); + +/** + * Copy a portion of the texture to the current rendering target at subpixel + * precision. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyF(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_FRect * dstrect); + +/** + * Copy a portion of the source texture to the current rendering target, with + * rotation and flipping, at subpixel precision. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \param angle An angle in degrees that indicates the rotation that will be + * applied to dstrect, rotating it in a clockwise direction + * \param center A pointer to a point indicating the point around which + * dstrect will be rotated (if NULL, rotation will be done + * around dstrect.w/2, dstrect.h/2). + * \param flip An SDL_RendererFlip value stating which flipping actions should + * be performed on the texture + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyExF(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_FRect * dstrect, + const double angle, + const SDL_FPoint *center, + const SDL_RendererFlip flip); + +/** + * Render a list of triangles, optionally using a texture and indices into the + * vertex array Color and alpha modulation is done per vertex + * (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored). + * + * \param renderer The rendering context. + * \param texture (optional) The SDL texture to use. + * \param vertices Vertices. + * \param num_vertices Number of vertices. + * \param indices (optional) An array of integer indices into the 'vertices' + * array, if NULL all vertices will be rendered in sequential + * order. + * \param num_indices Number of indices. + * \return 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGeometryRaw + * \sa SDL_Vertex + */ +extern DECLSPEC int SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, + SDL_Texture *texture, + const SDL_Vertex *vertices, int num_vertices, + const int *indices, int num_indices); + +/** + * Render a list of triangles, optionally using a texture and indices into the + * vertex arrays Color and alpha modulation is done per vertex + * (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored). + * + * \param renderer The rendering context. + * \param texture (optional) The SDL texture to use. + * \param xy Vertex positions + * \param xy_stride Byte size to move from one element to the next element + * \param color Vertex colors (as SDL_Color) + * \param color_stride Byte size to move from one element to the next element + * \param uv Vertex normalized texture coordinates + * \param uv_stride Byte size to move from one element to the next element + * \param num_vertices Number of vertices. + * \param indices (optional) An array of indices into the 'vertices' arrays, + * if NULL all vertices will be rendered in sequential order. + * \param num_indices Number of indices. + * \param size_indices Index size: 1 (byte), 2 (short), 4 (int) + * \return 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGeometry + * \sa SDL_Vertex + */ +extern DECLSPEC int SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, + SDL_Texture *texture, + const float *xy, int xy_stride, + const SDL_Color *color, int color_stride, + const float *uv, int uv_stride, + int num_vertices, + const void *indices, int num_indices, int size_indices); + +/** + * Read pixels from the current rendering target to an array of pixels. + * + * **WARNING**: This is a very slow operation, and should not be used + * frequently. If you're using this on the main rendering target, it should be + * called after rendering and before SDL_RenderPresent(). + * + * `pitch` specifies the number of bytes between rows in the destination + * `pixels` data. This allows you to write to a subrectangle or have padded + * rows in the destination. Generally, `pitch` should equal the number of + * pixels per row in the `pixels` data times the number of bytes per pixel, + * but it might contain additional padding (for example, 24bit RGB Windows + * Bitmap data pads all rows to multiples of 4 bytes). + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure representing the area to read, or NULL + * for the entire render target + * \param format an SDL_PixelFormatEnum value of the desired format of the + * pixel data, or 0 to use the format of the rendering target + * \param pixels a pointer to the pixel data to copy into + * \param pitch the pitch of the `pixels` parameter + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_RenderReadPixels(SDL_Renderer * renderer, + const SDL_Rect * rect, + Uint32 format, + void *pixels, int pitch); + +/** + * Update the screen with any rendering performed since the previous call. + * + * SDL's rendering functions operate on a backbuffer; that is, calling a + * rendering function such as SDL_RenderDrawLine() does not directly put a + * line on the screen, but rather updates the backbuffer. As such, you compose + * your entire scene and *present* the composed backbuffer to the screen as a + * complete picture. + * + * Therefore, when using SDL's rendering API, one does all drawing intended + * for the frame, and then calls this function once per frame to present the + * final drawing to the user. + * + * The backbuffer should be considered invalidated after each present; do not + * assume that previous contents will exist between frames. You are strongly + * encouraged to call SDL_RenderClear() to initialize the backbuffer before + * starting each new frame's drawing, even if you plan to overwrite every + * pixel. + * + * \param renderer the rendering context + * + * \threadsafety You may only call this function on the main thread. If this + * happens to work on a background thread on any given platform + * or backend, it's purely by luck and you should not rely on it + * to work next time. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderClear + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer); + +/** + * Destroy the specified texture. + * + * Passing NULL or an otherwise invalid texture will set the SDL error message + * to "Invalid texture". + * + * \param texture the texture to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_CreateTextureFromSurface + */ +extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); + +/** + * Destroy the rendering context for a window and free associated textures. + * + * If `renderer` is NULL, this function will return immediately after setting + * the SDL error message to "Invalid renderer". See SDL_GetError(). + * + * \param renderer the rendering context + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer); + +/** + * Force the rendering context to flush any pending commands to the underlying + * rendering API. + * + * You do not need to (and in fact, shouldn't) call this function unless you + * are planning to call into OpenGL/Direct3D/Metal/whatever directly in + * addition to using an SDL_Renderer. + * + * This is for a very-specific case: if you are using SDL's render API, you + * asked for a specific renderer backend (OpenGL, Direct3D, etc), you set + * SDL_HINT_RENDER_BATCHING to "1", and you plan to make OpenGL/D3D/whatever + * calls in addition to SDL render API calls. If all of this applies, you + * should call SDL_RenderFlush() between calls to SDL's render API and the + * low-level API you're using in cooperation. + * + * In all other cases, you can ignore this function. This is only here to get + * maximum performance out of a specific situation. In all other cases, SDL + * will do the right thing, perhaps at a performance loss. + * + * This function is first available in SDL 2.0.10, and is not needed in 2.0.9 + * and earlier, as earlier versions did not queue rendering commands at all, + * instead flushing them to the OS immediately. + * + * \param renderer the rendering context + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFlush(SDL_Renderer * renderer); + + +/** + * Bind an OpenGL/ES/ES2 texture to the current context. + * + * This is for use with OpenGL instructions when rendering OpenGL primitives + * directly. + * + * If not NULL, `texw` and `texh` will be filled with the width and height + * values suitable for the provided texture. In most cases, both will be 1.0, + * however, on systems that support the GL_ARB_texture_rectangle extension, + * these values will actually be the pixel width and height used to create the + * texture, so this factor needs to be taken into account when providing + * texture coordinates to OpenGL. + * + * You need a renderer to create an SDL_Texture, therefore you can only use + * this function with an implicit OpenGL context from SDL_CreateRenderer(), + * not with your own OpenGL context. If you need control over your OpenGL + * context, you need to write your own texture-loading methods. + * + * Also note that SDL may upload RGB textures as BGR (or vice-versa), and + * re-order the color channels in the shaders phase, so the uploaded texture + * may have swapped color channels. + * + * \param texture the texture to bind to the current OpenGL/ES/ES2 context + * \param texw a pointer to a float value which will be filled with the + * texture width or NULL if you don't need that value + * \param texh a pointer to a float value which will be filled with the + * texture height or NULL if you don't need that value + * \returns 0 on success, or -1 if the operation is not supported; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_MakeCurrent + * \sa SDL_GL_UnbindTexture + */ +extern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh); + +/** + * Unbind an OpenGL/ES/ES2 texture from the current context. + * + * See SDL_GL_BindTexture() for examples on how to use these functions + * + * \param texture the texture to unbind from the current OpenGL/ES/ES2 context + * \returns 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_BindTexture + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); + +/** + * Get the CAMetalLayer associated with the given Metal renderer. + * + * This function returns `void *`, so SDL doesn't have to include Metal's + * headers, but it can be safely cast to a `CAMetalLayer *`. + * + * \param renderer The renderer to query + * \returns a `CAMetalLayer *` on success, or NULL if the renderer isn't a + * Metal renderer + * + * \since This function is available since SDL 2.0.8. + * + * \sa SDL_RenderGetMetalCommandEncoder + */ +extern DECLSPEC void *SDLCALL SDL_RenderGetMetalLayer(SDL_Renderer * renderer); + +/** + * Get the Metal command encoder for the current frame + * + * This function returns `void *`, so SDL doesn't have to include Metal's + * headers, but it can be safely cast to an `id`. + * + * Note that as of SDL 2.0.18, this will return NULL if Metal refuses to give + * SDL a drawable to render to, which might happen if the window is + * hidden/minimized/offscreen. This doesn't apply to command encoders for + * render targets, just the window's backbacker. Check your return values! + * + * \param renderer The renderer to query + * \returns an `id` on success, or NULL if the + * renderer isn't a Metal renderer or there was an error. + * + * \since This function is available since SDL 2.0.8. + * + * \sa SDL_RenderGetMetalLayer + */ +extern DECLSPEC void *SDLCALL SDL_RenderGetMetalCommandEncoder(SDL_Renderer * renderer); + +/** + * Toggle VSync of the given renderer. + * + * \param renderer The renderer to toggle + * \param vsync 1 for on, 0 for off. All other values are reserved + * \returns a 0 int on success, or non-zero on failure + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_RenderSetVSync(SDL_Renderer* renderer, int vsync); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_render_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_revision.h b/Thirdparty/SDL2/include/SDL_revision.h new file mode 100644 index 0000000..84d6003 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_revision.h @@ -0,0 +1,7 @@ +/* Generated by updaterev.sh, do not edit */ +#ifdef SDL_VENDOR_INFO +#define SDL_REVISION "SDL-release-2.28.2-0-g031912c4b (" SDL_VENDOR_INFO ")" +#else +#define SDL_REVISION "SDL-release-2.28.2-0-g031912c4b" +#endif +#define SDL_REVISION_NUMBER 0 diff --git a/Thirdparty/SDL2/include/SDL_rwops.h b/Thirdparty/SDL2/include/SDL_rwops.h new file mode 100644 index 0000000..8615cb5 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_rwops.h @@ -0,0 +1,841 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_rwops.h + * + * This file provides a general interface for SDL to read and write + * data streams. It can easily be extended to files, memory, etc. + */ + +#ifndef SDL_rwops_h_ +#define SDL_rwops_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* RWops Types */ +#define SDL_RWOPS_UNKNOWN 0U /**< Unknown stream type */ +#define SDL_RWOPS_WINFILE 1U /**< Win32 file */ +#define SDL_RWOPS_STDFILE 2U /**< Stdio file */ +#define SDL_RWOPS_JNIFILE 3U /**< Android asset */ +#define SDL_RWOPS_MEMORY 4U /**< Memory stream */ +#define SDL_RWOPS_MEMORY_RO 5U /**< Read-Only memory stream */ + +/** + * This is the read/write operation structure -- very basic. + */ +typedef struct SDL_RWops +{ + /** + * Return the size of the file in this rwops, or -1 if unknown + */ + Sint64 (SDLCALL * size) (struct SDL_RWops * context); + + /** + * Seek to \c offset relative to \c whence, one of stdio's whence values: + * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END + * + * \return the final offset in the data stream, or -1 on error. + */ + Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, + int whence); + + /** + * Read up to \c maxnum objects each of size \c size from the data + * stream to the area pointed at by \c ptr. + * + * \return the number of objects read, or 0 at error or end of file. + */ + size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, + size_t size, size_t maxnum); + + /** + * Write exactly \c num objects each of size \c size from the area + * pointed at by \c ptr to data stream. + * + * \return the number of objects written, or 0 at error or end of file. + */ + size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, + size_t size, size_t num); + + /** + * Close and free an allocated SDL_RWops structure. + * + * \return 0 if successful or -1 on write error when flushing data. + */ + int (SDLCALL * close) (struct SDL_RWops * context); + + Uint32 type; + union + { +#if defined(__ANDROID__) + struct + { + void *asset; + } androidio; +#elif defined(__WIN32__) || defined(__GDK__) + struct + { + SDL_bool append; + void *h; + struct + { + void *data; + size_t size; + size_t left; + } buffer; + } windowsio; +#endif + +#ifdef HAVE_STDIO_H + struct + { + SDL_bool autoclose; + FILE *fp; + } stdio; +#endif + struct + { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct + { + void *data1; + void *data2; + } unknown; + } hidden; + +} SDL_RWops; + + +/** + * \name RWFrom functions + * + * Functions to create SDL_RWops structures from various data streams. + */ +/* @{ */ + +/** + * Use this function to create a new SDL_RWops structure for reading from + * and/or writing to a named file. + * + * The `mode` string is treated roughly the same as in a call to the C + * library's fopen(), even if SDL doesn't happen to use fopen() behind the + * scenes. + * + * Available `mode` strings: + * + * - "r": Open a file for reading. The file must exist. + * - "w": Create an empty file for writing. If a file with the same name + * already exists its content is erased and the file is treated as a new + * empty file. + * - "a": Append to a file. Writing operations append data at the end of the + * file. The file is created if it does not exist. + * - "r+": Open a file for update both reading and writing. The file must + * exist. + * - "w+": Create an empty file for both reading and writing. If a file with + * the same name already exists its content is erased and the file is + * treated as a new empty file. + * - "a+": Open a file for reading and appending. All writing operations are + * performed at the end of the file, protecting the previous content to be + * overwritten. You can reposition (fseek, rewind) the internal pointer to + * anywhere in the file for reading, but writing operations will move it + * back to the end of file. The file is created if it does not exist. + * + * **NOTE**: In order to open a file as a binary file, a "b" character has to + * be included in the `mode` string. This additional "b" character can either + * be appended at the end of the string (thus making the following compound + * modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the + * letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+"). + * Additional characters may follow the sequence, although they should have no + * effect. For example, "t" is sometimes appended to make explicit the file is + * a text file. + * + * This function supports Unicode filenames, but they must be encoded in UTF-8 + * format, regardless of the underlying operating system. + * + * As a fallback, SDL_RWFromFile() will transparently open a matching filename + * in an Android app's `assets`. + * + * Closing the SDL_RWops will close the file handle SDL is holding internally. + * + * \param file a UTF-8 string representing the filename to open + * \param mode an ASCII string representing the mode to be used for opening + * the file. + * \returns a pointer to the SDL_RWops structure that is created, or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, + const char *mode); + +#ifdef HAVE_STDIO_H + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, SDL_bool autoclose); + +#else + +/** + * Use this function to create an SDL_RWops structure from a standard I/O file + * pointer (stdio.h's `FILE*`). + * + * This function is not available on Windows, since files opened in an + * application on that platform cannot be used by a dynamically linked + * library. + * + * On some platforms, the first parameter is a `void*`, on others, it's a + * `FILE*`, depending on what system headers are available to SDL. It is + * always intended to be the `FILE*` type from the C runtime's stdio.h. + * + * \param fp the `FILE*` that feeds the SDL_RWops stream + * \param autoclose SDL_TRUE to close the `FILE*` when closing the SDL_RWops, + * SDL_FALSE to leave the `FILE*` open when the RWops is + * closed + * \returns a pointer to the SDL_RWops structure that is created, or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, + SDL_bool autoclose); +#endif + +/** + * Use this function to prepare a read-write memory buffer for use with + * SDL_RWops. + * + * This function sets up an SDL_RWops struct based on a memory area of a + * certain size, for both read and write access. + * + * This memory buffer is not copied by the RWops; the pointer you provide must + * remain valid until you close the stream. Closing the stream will not free + * the original buffer. + * + * If you need to make sure the RWops never writes to the memory buffer, you + * should use SDL_RWFromConstMem() with a read-only buffer of memory instead. + * + * \param mem a pointer to a buffer to feed an SDL_RWops stream + * \param size the buffer size, in bytes + * \returns a pointer to a new SDL_RWops structure, or NULL if it fails; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); + +/** + * Use this function to prepare a read-only memory buffer for use with RWops. + * + * This function sets up an SDL_RWops struct based on a memory area of a + * certain size. It assumes the memory area is not writable. + * + * Attempting to write to this RWops stream will report an error without + * writing to the memory buffer. + * + * This memory buffer is not copied by the RWops; the pointer you provide must + * remain valid until you close the stream. Closing the stream will not free + * the original buffer. + * + * If you need to write to a memory buffer, you should use SDL_RWFromMem() + * with a writable buffer of memory instead. + * + * \param mem a pointer to a read-only buffer to feed an SDL_RWops stream + * \param size the buffer size, in bytes + * \returns a pointer to a new SDL_RWops structure, or NULL if it fails; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, + int size); + +/* @} *//* RWFrom functions */ + + +/** + * Use this function to allocate an empty, unpopulated SDL_RWops structure. + * + * Applications do not need to use this function unless they are providing + * their own SDL_RWops implementation. If you just need a SDL_RWops to + * read/write a common data source, you should use the built-in + * implementations in SDL, like SDL_RWFromFile() or SDL_RWFromMem(), etc. + * + * You must free the returned pointer with SDL_FreeRW(). Depending on your + * operating system and compiler, there may be a difference between the + * malloc() and free() your program uses and the versions SDL calls + * internally. Trying to mix the two can cause crashing such as segmentation + * faults. Since all SDL_RWops must free themselves when their **close** + * method is called, all SDL_RWops must be allocated through this function, so + * they can all be freed correctly with SDL_FreeRW(). + * + * \returns a pointer to the allocated memory on success, or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeRW + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); + +/** + * Use this function to free an SDL_RWops structure allocated by + * SDL_AllocRW(). + * + * Applications do not need to use this function unless they are providing + * their own SDL_RWops implementation. If you just need a SDL_RWops to + * read/write a common data source, you should use the built-in + * implementations in SDL, like SDL_RWFromFile() or SDL_RWFromMem(), etc, and + * call the **close** method on those SDL_RWops pointers when you are done + * with them. + * + * Only use SDL_FreeRW() on pointers returned by SDL_AllocRW(). The pointer is + * invalid as soon as this function returns. Any extra memory allocated during + * creation of the SDL_RWops is not freed by SDL_FreeRW(); the programmer must + * be responsible for managing that memory in their **close** method. + * + * \param area the SDL_RWops structure to be freed + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocRW + */ +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); + +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ + +/** + * Use this function to get the size of the data stream in an SDL_RWops. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context the SDL_RWops to get the size of the data stream from + * \returns the size of the data stream in the SDL_RWops on success, -1 if + * unknown or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWsize(SDL_RWops *context); + +/** + * Seek within an SDL_RWops data stream. + * + * This function seeks to byte `offset`, relative to `whence`. + * + * `whence` may be any of the following values: + * + * - `RW_SEEK_SET`: seek from the beginning of data + * - `RW_SEEK_CUR`: seek relative to current read point + * - `RW_SEEK_END`: seek relative to the end of data + * + * If this stream can not seek, it will return -1. + * + * SDL_RWseek() is actually a wrapper function that calls the SDL_RWops's + * `seek` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param offset an offset in bytes, relative to **whence** location; can be + * negative + * \param whence any of `RW_SEEK_SET`, `RW_SEEK_CUR`, `RW_SEEK_END` + * \returns the final offset in the data stream after the seek or -1 on error. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWseek(SDL_RWops *context, + Sint64 offset, int whence); + +/** + * Determine the current read/write offset in an SDL_RWops data stream. + * + * SDL_RWtell is actually a wrapper function that calls the SDL_RWops's `seek` + * method, with an offset of 0 bytes from `RW_SEEK_CUR`, to simplify + * application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a SDL_RWops data stream object from which to get the current + * offset + * \returns the current offset in the stream, or -1 if the information can not + * be determined. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWtell(SDL_RWops *context); + +/** + * Read from a data source. + * + * This function reads up to `maxnum` objects each of size `size` from the + * data source to the area pointed at by `ptr`. This function may read less + * objects than requested. It will return zero when there has been an error or + * the data stream is completely read. + * + * SDL_RWread() is actually a function wrapper that calls the SDL_RWops's + * `read` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param ptr a pointer to a buffer to read data into + * \param size the size of each object to read, in bytes + * \param maxnum the maximum number of objects to be read + * \returns the number of objects read, or 0 at error or end of file; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC size_t SDLCALL SDL_RWread(SDL_RWops *context, + void *ptr, size_t size, + size_t maxnum); + +/** + * Write to an SDL_RWops data stream. + * + * This function writes exactly `num` objects each of size `size` from the + * area pointed at by `ptr` to the stream. If this fails for any reason, it'll + * return less than `num` to demonstrate how far the write progressed. On + * success, it returns `num`. + * + * SDL_RWwrite is actually a function wrapper that calls the SDL_RWops's + * `write` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param ptr a pointer to a buffer containing data to write + * \param size the size of an object to write, in bytes + * \param num the number of objects to write + * \returns the number of objects written, which will be less than **num** on + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + */ +extern DECLSPEC size_t SDLCALL SDL_RWwrite(SDL_RWops *context, + const void *ptr, size_t size, + size_t num); + +/** + * Close and free an allocated SDL_RWops structure. + * + * SDL_RWclose() closes and cleans up the SDL_RWops stream. It releases any + * resources used by the stream and frees the SDL_RWops itself with + * SDL_FreeRW(). This returns 0 on success, or -1 if the stream failed to + * flush to its output (e.g. to disk). + * + * Note that if this fails to flush the stream to disk, this function reports + * an error, but the SDL_RWops is still invalid once this function returns. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context SDL_RWops structure to close + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC int SDLCALL SDL_RWclose(SDL_RWops *context); + +/** + * Load all the data from an SDL data stream. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in the value reported via + * `datasize`. + * + * The data should be freed with SDL_free(). + * + * \param src the SDL_RWops to read all available data from + * \param datasize if not NULL, will store the number of bytes read + * \param freesrc if non-zero, calls SDL_RWclose() on `src` before returning + * \returns the data, or NULL if there was an error. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void *SDLCALL SDL_LoadFile_RW(SDL_RWops *src, + size_t *datasize, + int freesrc); + +/** + * Load all the data from a file path. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in the value reported via + * `datasize`. + * + * The data should be freed with SDL_free(). + * + * Prior to SDL 2.0.10, this function was a macro wrapping around + * SDL_LoadFile_RW. + * + * \param file the path to read all available data from + * \param datasize if not NULL, will store the number of bytes read + * \returns the data, or NULL if there was an error. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC void *SDLCALL SDL_LoadFile(const char *file, size_t *datasize); + +/** + * \name Read endian functions + * + * Read an item of the specified endianness and return in native format. + */ +/* @{ */ + +/** + * Use this function to read a byte from an SDL_RWops. + * + * \param src the SDL_RWops to read from + * \returns the read byte on success or 0 on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteU8 + */ +extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); + +/** + * Use this function to read 16 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 16 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE16 + */ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); + +/** + * Use this function to read 16 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 16 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE16 + */ +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); + +/** + * Use this function to read 32 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 32 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE32 + */ +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); + +/** + * Use this function to read 32 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 32 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE32 + */ +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); + +/** + * Use this function to read 64 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 64 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE64 + */ +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); + +/** + * Use this function to read 64 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 64 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE64 + */ +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); +/* @} *//* Read endian functions */ + +/** + * \name Write endian functions + * + * Write an item of native format to the specified endianness. + */ +/* @{ */ + +/** + * Use this function to write a byte to an SDL_RWops. + * + * \param dst the SDL_RWops to write to + * \param value the byte value to write + * \returns 1 on success or 0 on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadU8 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); + +/** + * Use this function to write 16 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE16 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); + +/** + * Use this function to write 16 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE16 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); + +/** + * Use this function to write 32 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE32 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); + +/** + * Use this function to write 32 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE32 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); + +/** + * Use this function to write 64 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE64 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); + +/** + * Use this function to write 64 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE64 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); +/* @} *//* Write endian functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_rwops_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_scancode.h b/Thirdparty/SDL2/include/SDL_scancode.h new file mode 100644 index 0000000..a960a79 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_scancode.h @@ -0,0 +1,438 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_scancode.h + * + * Defines keyboard scancodes. + */ + +#ifndef SDL_scancode_h_ +#define SDL_scancode_h_ + +#include "SDL_stdinc.h" + +/** + * \brief The SDL keyboard scancode representation. + * + * Values of this type are used to represent keyboard keys, among other places + * in the \link SDL_Keysym::scancode key.keysym.scancode \endlink field of the + * SDL_Event structure. + * + * The values in this enumeration are based on the USB usage page standard: + * https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf + */ +typedef enum +{ + SDL_SCANCODE_UNKNOWN = 0, + + /** + * \name Usage page 0x07 + * + * These values are from usage page 0x07 (USB keyboard page). + */ + /* @{ */ + + SDL_SCANCODE_A = 4, + SDL_SCANCODE_B = 5, + SDL_SCANCODE_C = 6, + SDL_SCANCODE_D = 7, + SDL_SCANCODE_E = 8, + SDL_SCANCODE_F = 9, + SDL_SCANCODE_G = 10, + SDL_SCANCODE_H = 11, + SDL_SCANCODE_I = 12, + SDL_SCANCODE_J = 13, + SDL_SCANCODE_K = 14, + SDL_SCANCODE_L = 15, + SDL_SCANCODE_M = 16, + SDL_SCANCODE_N = 17, + SDL_SCANCODE_O = 18, + SDL_SCANCODE_P = 19, + SDL_SCANCODE_Q = 20, + SDL_SCANCODE_R = 21, + SDL_SCANCODE_S = 22, + SDL_SCANCODE_T = 23, + SDL_SCANCODE_U = 24, + SDL_SCANCODE_V = 25, + SDL_SCANCODE_W = 26, + SDL_SCANCODE_X = 27, + SDL_SCANCODE_Y = 28, + SDL_SCANCODE_Z = 29, + + SDL_SCANCODE_1 = 30, + SDL_SCANCODE_2 = 31, + SDL_SCANCODE_3 = 32, + SDL_SCANCODE_4 = 33, + SDL_SCANCODE_5 = 34, + SDL_SCANCODE_6 = 35, + SDL_SCANCODE_7 = 36, + SDL_SCANCODE_8 = 37, + SDL_SCANCODE_9 = 38, + SDL_SCANCODE_0 = 39, + + SDL_SCANCODE_RETURN = 40, + SDL_SCANCODE_ESCAPE = 41, + SDL_SCANCODE_BACKSPACE = 42, + SDL_SCANCODE_TAB = 43, + SDL_SCANCODE_SPACE = 44, + + SDL_SCANCODE_MINUS = 45, + SDL_SCANCODE_EQUALS = 46, + SDL_SCANCODE_LEFTBRACKET = 47, + SDL_SCANCODE_RIGHTBRACKET = 48, + SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + * key on ISO keyboards and at the right end + * of the QWERTY row on ANSI keyboards. + * Produces REVERSE SOLIDUS (backslash) and + * VERTICAL LINE in a US layout, REVERSE + * SOLIDUS and VERTICAL LINE in a UK Mac + * layout, NUMBER SIGN and TILDE in a UK + * Windows layout, DOLLAR SIGN and POUND SIGN + * in a Swiss German layout, NUMBER SIGN and + * APOSTROPHE in a German layout, GRAVE + * ACCENT and POUND SIGN in a French Mac + * layout, and ASTERISK and MICRO SIGN in a + * French Windows layout. + */ + SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code + * instead of 49 for the same key, but all + * OSes I've seen treat the two codes + * identically. So, as an implementor, unless + * your keyboard generates both of those + * codes and your OS treats them differently, + * you should generate SDL_SCANCODE_BACKSLASH + * instead of this code. As a user, you + * should not rely on this code because SDL + * will never generate it with most (all?) + * keyboards. + */ + SDL_SCANCODE_SEMICOLON = 51, + SDL_SCANCODE_APOSTROPHE = 52, + SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + * and ISO keyboards). Produces GRAVE ACCENT and + * TILDE in a US Windows layout and in US and UK + * Mac layouts on ANSI keyboards, GRAVE ACCENT + * and NOT SIGN in a UK Windows layout, SECTION + * SIGN and PLUS-MINUS SIGN in US and UK Mac + * layouts on ISO keyboards, SECTION SIGN and + * DEGREE SIGN in a Swiss German layout (Mac: + * only on ISO keyboards), CIRCUMFLEX ACCENT and + * DEGREE SIGN in a German layout (Mac: only on + * ISO keyboards), SUPERSCRIPT TWO and TILDE in a + * French Windows layout, COMMERCIAL AT and + * NUMBER SIGN in a French Mac layout on ISO + * keyboards, and LESS-THAN SIGN and GREATER-THAN + * SIGN in a Swiss German, German, or French Mac + * layout on ANSI keyboards. + */ + SDL_SCANCODE_COMMA = 54, + SDL_SCANCODE_PERIOD = 55, + SDL_SCANCODE_SLASH = 56, + + SDL_SCANCODE_CAPSLOCK = 57, + + SDL_SCANCODE_F1 = 58, + SDL_SCANCODE_F2 = 59, + SDL_SCANCODE_F3 = 60, + SDL_SCANCODE_F4 = 61, + SDL_SCANCODE_F5 = 62, + SDL_SCANCODE_F6 = 63, + SDL_SCANCODE_F7 = 64, + SDL_SCANCODE_F8 = 65, + SDL_SCANCODE_F9 = 66, + SDL_SCANCODE_F10 = 67, + SDL_SCANCODE_F11 = 68, + SDL_SCANCODE_F12 = 69, + + SDL_SCANCODE_PRINTSCREEN = 70, + SDL_SCANCODE_SCROLLLOCK = 71, + SDL_SCANCODE_PAUSE = 72, + SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + does send code 73, not 117) */ + SDL_SCANCODE_HOME = 74, + SDL_SCANCODE_PAGEUP = 75, + SDL_SCANCODE_DELETE = 76, + SDL_SCANCODE_END = 77, + SDL_SCANCODE_PAGEDOWN = 78, + SDL_SCANCODE_RIGHT = 79, + SDL_SCANCODE_LEFT = 80, + SDL_SCANCODE_DOWN = 81, + SDL_SCANCODE_UP = 82, + + SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards + */ + SDL_SCANCODE_KP_DIVIDE = 84, + SDL_SCANCODE_KP_MULTIPLY = 85, + SDL_SCANCODE_KP_MINUS = 86, + SDL_SCANCODE_KP_PLUS = 87, + SDL_SCANCODE_KP_ENTER = 88, + SDL_SCANCODE_KP_1 = 89, + SDL_SCANCODE_KP_2 = 90, + SDL_SCANCODE_KP_3 = 91, + SDL_SCANCODE_KP_4 = 92, + SDL_SCANCODE_KP_5 = 93, + SDL_SCANCODE_KP_6 = 94, + SDL_SCANCODE_KP_7 = 95, + SDL_SCANCODE_KP_8 = 96, + SDL_SCANCODE_KP_9 = 97, + SDL_SCANCODE_KP_0 = 98, + SDL_SCANCODE_KP_PERIOD = 99, + + SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO + * keyboards have over ANSI ones, + * located between left shift and Y. + * Produces GRAVE ACCENT and TILDE in a + * US or UK Mac layout, REVERSE SOLIDUS + * (backslash) and VERTICAL LINE in a + * US or UK Windows layout, and + * LESS-THAN SIGN and GREATER-THAN SIGN + * in a Swiss German, German, or French + * layout. */ + SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ + SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + * not a physical key - but some Mac keyboards + * do have a power key. */ + SDL_SCANCODE_KP_EQUALS = 103, + SDL_SCANCODE_F13 = 104, + SDL_SCANCODE_F14 = 105, + SDL_SCANCODE_F15 = 106, + SDL_SCANCODE_F16 = 107, + SDL_SCANCODE_F17 = 108, + SDL_SCANCODE_F18 = 109, + SDL_SCANCODE_F19 = 110, + SDL_SCANCODE_F20 = 111, + SDL_SCANCODE_F21 = 112, + SDL_SCANCODE_F22 = 113, + SDL_SCANCODE_F23 = 114, + SDL_SCANCODE_F24 = 115, + SDL_SCANCODE_EXECUTE = 116, + SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ + SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ + SDL_SCANCODE_SELECT = 119, + SDL_SCANCODE_STOP = 120, /**< AC Stop */ + SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ + SDL_SCANCODE_UNDO = 122, /**< AC Undo */ + SDL_SCANCODE_CUT = 123, /**< AC Cut */ + SDL_SCANCODE_COPY = 124, /**< AC Copy */ + SDL_SCANCODE_PASTE = 125, /**< AC Paste */ + SDL_SCANCODE_FIND = 126, /**< AC Find */ + SDL_SCANCODE_MUTE = 127, + SDL_SCANCODE_VOLUMEUP = 128, + SDL_SCANCODE_VOLUMEDOWN = 129, +/* not sure whether there's a reason to enable these */ +/* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ +/* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ +/* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ + SDL_SCANCODE_KP_COMMA = 133, + SDL_SCANCODE_KP_EQUALSAS400 = 134, + + SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + footnotes in USB doc */ + SDL_SCANCODE_INTERNATIONAL2 = 136, + SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ + SDL_SCANCODE_INTERNATIONAL4 = 138, + SDL_SCANCODE_INTERNATIONAL5 = 139, + SDL_SCANCODE_INTERNATIONAL6 = 140, + SDL_SCANCODE_INTERNATIONAL7 = 141, + SDL_SCANCODE_INTERNATIONAL8 = 142, + SDL_SCANCODE_INTERNATIONAL9 = 143, + SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ + SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ + SDL_SCANCODE_LANG3 = 146, /**< Katakana */ + SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ + SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ + SDL_SCANCODE_LANG6 = 149, /**< reserved */ + SDL_SCANCODE_LANG7 = 150, /**< reserved */ + SDL_SCANCODE_LANG8 = 151, /**< reserved */ + SDL_SCANCODE_LANG9 = 152, /**< reserved */ + + SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ + SDL_SCANCODE_SYSREQ = 154, + SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ + SDL_SCANCODE_CLEAR = 156, + SDL_SCANCODE_PRIOR = 157, + SDL_SCANCODE_RETURN2 = 158, + SDL_SCANCODE_SEPARATOR = 159, + SDL_SCANCODE_OUT = 160, + SDL_SCANCODE_OPER = 161, + SDL_SCANCODE_CLEARAGAIN = 162, + SDL_SCANCODE_CRSEL = 163, + SDL_SCANCODE_EXSEL = 164, + + SDL_SCANCODE_KP_00 = 176, + SDL_SCANCODE_KP_000 = 177, + SDL_SCANCODE_THOUSANDSSEPARATOR = 178, + SDL_SCANCODE_DECIMALSEPARATOR = 179, + SDL_SCANCODE_CURRENCYUNIT = 180, + SDL_SCANCODE_CURRENCYSUBUNIT = 181, + SDL_SCANCODE_KP_LEFTPAREN = 182, + SDL_SCANCODE_KP_RIGHTPAREN = 183, + SDL_SCANCODE_KP_LEFTBRACE = 184, + SDL_SCANCODE_KP_RIGHTBRACE = 185, + SDL_SCANCODE_KP_TAB = 186, + SDL_SCANCODE_KP_BACKSPACE = 187, + SDL_SCANCODE_KP_A = 188, + SDL_SCANCODE_KP_B = 189, + SDL_SCANCODE_KP_C = 190, + SDL_SCANCODE_KP_D = 191, + SDL_SCANCODE_KP_E = 192, + SDL_SCANCODE_KP_F = 193, + SDL_SCANCODE_KP_XOR = 194, + SDL_SCANCODE_KP_POWER = 195, + SDL_SCANCODE_KP_PERCENT = 196, + SDL_SCANCODE_KP_LESS = 197, + SDL_SCANCODE_KP_GREATER = 198, + SDL_SCANCODE_KP_AMPERSAND = 199, + SDL_SCANCODE_KP_DBLAMPERSAND = 200, + SDL_SCANCODE_KP_VERTICALBAR = 201, + SDL_SCANCODE_KP_DBLVERTICALBAR = 202, + SDL_SCANCODE_KP_COLON = 203, + SDL_SCANCODE_KP_HASH = 204, + SDL_SCANCODE_KP_SPACE = 205, + SDL_SCANCODE_KP_AT = 206, + SDL_SCANCODE_KP_EXCLAM = 207, + SDL_SCANCODE_KP_MEMSTORE = 208, + SDL_SCANCODE_KP_MEMRECALL = 209, + SDL_SCANCODE_KP_MEMCLEAR = 210, + SDL_SCANCODE_KP_MEMADD = 211, + SDL_SCANCODE_KP_MEMSUBTRACT = 212, + SDL_SCANCODE_KP_MEMMULTIPLY = 213, + SDL_SCANCODE_KP_MEMDIVIDE = 214, + SDL_SCANCODE_KP_PLUSMINUS = 215, + SDL_SCANCODE_KP_CLEAR = 216, + SDL_SCANCODE_KP_CLEARENTRY = 217, + SDL_SCANCODE_KP_BINARY = 218, + SDL_SCANCODE_KP_OCTAL = 219, + SDL_SCANCODE_KP_DECIMAL = 220, + SDL_SCANCODE_KP_HEXADECIMAL = 221, + + SDL_SCANCODE_LCTRL = 224, + SDL_SCANCODE_LSHIFT = 225, + SDL_SCANCODE_LALT = 226, /**< alt, option */ + SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ + SDL_SCANCODE_RCTRL = 228, + SDL_SCANCODE_RSHIFT = 229, + SDL_SCANCODE_RALT = 230, /**< alt gr, option */ + SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ + + SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered + * by any of the above, but since there's a + * special KMOD_MODE for it I'm adding it here + */ + + /* @} *//* Usage page 0x07 */ + + /** + * \name Usage page 0x0C + * + * These values are mapped from usage page 0x0C (USB consumer page). + * See https://usb.org/sites/default/files/hut1_2.pdf + * + * There are way more keys in the spec than we can represent in the + * current scancode range, so pick the ones that commonly come up in + * real world usage. + */ + /* @{ */ + + SDL_SCANCODE_AUDIONEXT = 258, + SDL_SCANCODE_AUDIOPREV = 259, + SDL_SCANCODE_AUDIOSTOP = 260, + SDL_SCANCODE_AUDIOPLAY = 261, + SDL_SCANCODE_AUDIOMUTE = 262, + SDL_SCANCODE_MEDIASELECT = 263, + SDL_SCANCODE_WWW = 264, /**< AL Internet Browser */ + SDL_SCANCODE_MAIL = 265, + SDL_SCANCODE_CALCULATOR = 266, /**< AL Calculator */ + SDL_SCANCODE_COMPUTER = 267, + SDL_SCANCODE_AC_SEARCH = 268, /**< AC Search */ + SDL_SCANCODE_AC_HOME = 269, /**< AC Home */ + SDL_SCANCODE_AC_BACK = 270, /**< AC Back */ + SDL_SCANCODE_AC_FORWARD = 271, /**< AC Forward */ + SDL_SCANCODE_AC_STOP = 272, /**< AC Stop */ + SDL_SCANCODE_AC_REFRESH = 273, /**< AC Refresh */ + SDL_SCANCODE_AC_BOOKMARKS = 274, /**< AC Bookmarks */ + + /* @} *//* Usage page 0x0C */ + + /** + * \name Walther keys + * + * These are values that Christian Walther added (for mac keyboard?). + */ + /* @{ */ + + SDL_SCANCODE_BRIGHTNESSDOWN = 275, + SDL_SCANCODE_BRIGHTNESSUP = 276, + SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display + switch, video mode switch */ + SDL_SCANCODE_KBDILLUMTOGGLE = 278, + SDL_SCANCODE_KBDILLUMDOWN = 279, + SDL_SCANCODE_KBDILLUMUP = 280, + SDL_SCANCODE_EJECT = 281, + SDL_SCANCODE_SLEEP = 282, /**< SC System Sleep */ + + SDL_SCANCODE_APP1 = 283, + SDL_SCANCODE_APP2 = 284, + + /* @} *//* Walther keys */ + + /** + * \name Usage page 0x0C (additional media keys) + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ + + SDL_SCANCODE_AUDIOREWIND = 285, + SDL_SCANCODE_AUDIOFASTFORWARD = 286, + + /* @} *//* Usage page 0x0C (additional media keys) */ + + /** + * \name Mobile keys + * + * These are values that are often used on mobile phones. + */ + /* @{ */ + + SDL_SCANCODE_SOFTLEFT = 287, /**< Usually situated below the display on phones and + used as a multi-function feature key for selecting + a software defined function shown on the bottom left + of the display. */ + SDL_SCANCODE_SOFTRIGHT = 288, /**< Usually situated below the display on phones and + used as a multi-function feature key for selecting + a software defined function shown on the bottom right + of the display. */ + SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ + SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ + + /* @} *//* Mobile keys */ + + /* Add any other keys here. */ + + SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes + for array bounds */ +} SDL_Scancode; + +#endif /* SDL_scancode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_sensor.h b/Thirdparty/SDL2/include/SDL_sensor.h new file mode 100644 index 0000000..9ecce44 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_sensor.h @@ -0,0 +1,322 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_sensor.h + * + * Include file for SDL sensor event handling + * + */ + +#ifndef SDL_sensor_h_ +#define SDL_sensor_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +/** + * \brief SDL_sensor.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_SENSOR flag. This causes SDL to scan the system + * for sensors, and load appropriate drivers. + */ + +struct _SDL_Sensor; +typedef struct _SDL_Sensor SDL_Sensor; + +/** + * This is a unique ID for a sensor for the time it is connected to the system, + * and is never reused for the lifetime of the application. + * + * The ID value starts at 0 and increments from there. The value -1 is an invalid ID. + */ +typedef Sint32 SDL_SensorID; + +/* The different sensors defined by SDL + * + * Additional sensors may be available, using platform dependent semantics. + * + * Hare are the additional Android sensors: + * https://developer.android.com/reference/android/hardware/SensorEvent.html#values + */ +typedef enum +{ + SDL_SENSOR_INVALID = -1, /**< Returned for an invalid sensor */ + SDL_SENSOR_UNKNOWN, /**< Unknown sensor type */ + SDL_SENSOR_ACCEL, /**< Accelerometer */ + SDL_SENSOR_GYRO, /**< Gyroscope */ + SDL_SENSOR_ACCEL_L, /**< Accelerometer for left Joy-Con controller and Wii nunchuk */ + SDL_SENSOR_GYRO_L, /**< Gyroscope for left Joy-Con controller */ + SDL_SENSOR_ACCEL_R, /**< Accelerometer for right Joy-Con controller */ + SDL_SENSOR_GYRO_R /**< Gyroscope for right Joy-Con controller */ +} SDL_SensorType; + +/** + * Accelerometer sensor + * + * The accelerometer returns the current acceleration in SI meters per + * second squared. This measurement includes the force of gravity, so + * a device at rest will have an value of SDL_STANDARD_GRAVITY away + * from the center of the earth, which is a positive Y value. + * + * values[0]: Acceleration on the x axis + * values[1]: Acceleration on the y axis + * values[2]: Acceleration on the z axis + * + * For phones held in portrait mode and game controllers held in front of you, + * the axes are defined as follows: + * -X ... +X : left ... right + * -Y ... +Y : bottom ... top + * -Z ... +Z : farther ... closer + * + * The axis data is not changed when the phone is rotated. + * + * \sa SDL_GetDisplayOrientation() + */ +#define SDL_STANDARD_GRAVITY 9.80665f + +/** + * Gyroscope sensor + * + * The gyroscope returns the current rate of rotation in radians per second. + * The rotation is positive in the counter-clockwise direction. That is, + * an observer looking from a positive location on one of the axes would + * see positive rotation on that axis when it appeared to be rotating + * counter-clockwise. + * + * values[0]: Angular speed around the x axis (pitch) + * values[1]: Angular speed around the y axis (yaw) + * values[2]: Angular speed around the z axis (roll) + * + * For phones held in portrait mode and game controllers held in front of you, + * the axes are defined as follows: + * -X ... +X : left ... right + * -Y ... +Y : bottom ... top + * -Z ... +Z : farther ... closer + * + * The axis data is not changed when the phone or controller is rotated. + * + * \sa SDL_GetDisplayOrientation() + */ + +/* Function prototypes */ + +/** + * Locking for multi-threaded access to the sensor API + * + * If you are using the sensor API or handling events from multiple threads + * you should use these locking functions to protect access to the sensors. + * + * In particular, you are guaranteed that the sensor list won't change, so the + * API functions that take a sensor index will be valid, and sensor events + * will not be delivered. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC void SDLCALL SDL_LockSensors(void); +extern DECLSPEC void SDLCALL SDL_UnlockSensors(void); + +/** + * Count the number of sensors attached to the system right now. + * + * \returns the number of sensors detected. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_NumSensors(void); + +/** + * Get the implementation dependent name of a sensor. + * + * \param device_index The sensor to obtain name from + * \returns the sensor name, or NULL if `device_index` is out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC const char *SDLCALL SDL_SensorGetDeviceName(int device_index); + +/** + * Get the type of a sensor. + * + * \param device_index The sensor to get the type from + * \returns the SDL_SensorType, or `SDL_SENSOR_INVALID` if `device_index` is + * out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorType SDLCALL SDL_SensorGetDeviceType(int device_index); + +/** + * Get the platform dependent type of a sensor. + * + * \param device_index The sensor to check + * \returns the sensor platform dependent type, or -1 if `device_index` is out + * of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetDeviceNonPortableType(int device_index); + +/** + * Get the instance ID of a sensor. + * + * \param device_index The sensor to get instance id from + * \returns the sensor instance ID, or -1 if `device_index` is out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorID SDLCALL SDL_SensorGetDeviceInstanceID(int device_index); + +/** + * Open a sensor for use. + * + * \param device_index The sensor to open + * \returns an SDL_Sensor sensor object, or NULL if an error occurred. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_Sensor *SDLCALL SDL_SensorOpen(int device_index); + +/** + * Return the SDL_Sensor associated with an instance id. + * + * \param instance_id The sensor from instance id + * \returns an SDL_Sensor object. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_Sensor *SDLCALL SDL_SensorFromInstanceID(SDL_SensorID instance_id); + +/** + * Get the implementation dependent name of a sensor + * + * \param sensor The SDL_Sensor object + * \returns the sensor name, or NULL if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC const char *SDLCALL SDL_SensorGetName(SDL_Sensor *sensor); + +/** + * Get the type of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the SDL_SensorType type, or `SDL_SENSOR_INVALID` if `sensor` is + * NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorType SDLCALL SDL_SensorGetType(SDL_Sensor *sensor); + +/** + * Get the platform dependent type of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the sensor platform dependent type, or -1 if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetNonPortableType(SDL_Sensor *sensor); + +/** + * Get the instance ID of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the sensor instance ID, or -1 if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorID SDLCALL SDL_SensorGetInstanceID(SDL_Sensor *sensor); + +/** + * Get the current state of an opened sensor. + * + * The number of values and interpretation of the data is sensor dependent. + * + * \param sensor The SDL_Sensor object to query + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetData(SDL_Sensor *sensor, float *data, int num_values); + +/** + * Get the current state of an opened sensor with the timestamp of the last + * update. + * + * The number of values and interpretation of the data is sensor dependent. + * + * \param sensor The SDL_Sensor object to query + * \param timestamp A pointer filled with the timestamp in microseconds of the + * current sensor reading if available, or 0 if not + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.26.0. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetDataWithTimestamp(SDL_Sensor *sensor, Uint64 *timestamp, float *data, int num_values); + +/** + * Close a sensor previously opened with SDL_SensorOpen(). + * + * \param sensor The SDL_Sensor object to close + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_SensorClose(SDL_Sensor *sensor); + +/** + * Update the current state of the open sensors. + * + * This is called automatically by the event loop if sensor events are + * enabled. + * + * This needs to be called from the thread that initialized the sensor + * subsystem. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_SensorUpdate(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* SDL_sensor_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_shape.h b/Thirdparty/SDL2/include/SDL_shape.h new file mode 100644 index 0000000..f66babc --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_shape.h @@ -0,0 +1,155 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_shape_h_ +#define SDL_shape_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** \file SDL_shape.h + * + * Header file for the shaped window API. + */ + +#define SDL_NONSHAPEABLE_WINDOW -1 +#define SDL_INVALID_SHAPE_ARGUMENT -2 +#define SDL_WINDOW_LACKS_SHAPE -3 + +/** + * Create a window that can be shaped with the specified position, dimensions, + * and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with + * any of the following: ::SDL_WINDOW_OPENGL, + * ::SDL_WINDOW_INPUT_GRABBED, ::SDL_WINDOW_HIDDEN, + * ::SDL_WINDOW_RESIZABLE, ::SDL_WINDOW_MAXIMIZED, + * ::SDL_WINDOW_MINIMIZED, ::SDL_WINDOW_BORDERLESS is always set, + * and ::SDL_WINDOW_FULLSCREEN is always unset. + * \return the window created, or NULL if window creation failed. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); + +/** + * Return whether the given window is a shaped window. + * + * \param window The window to query for being shaped. + * \return SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if + * the window is unshaped or NULL. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateShapedWindow + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsShapedWindow(const SDL_Window *window); + +/** \brief An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. */ +typedef enum { + /** \brief The default mode, a binarized alpha cutoff of 1. */ + ShapeModeDefault, + /** \brief A binarized alpha cutoff with a given integer value. */ + ShapeModeBinarizeAlpha, + /** \brief A binarized alpha cutoff with a given integer value, but with the opposite comparison. */ + ShapeModeReverseBinarizeAlpha, + /** \brief A color key is applied. */ + ShapeModeColorKey +} WindowShapeMode; + +#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha) + +/** \brief A union containing parameters for shaped windows. */ +typedef union { + /** \brief A cutoff alpha value for binarization of the window shape's alpha channel. */ + Uint8 binarizationCutoff; + SDL_Color colorKey; +} SDL_WindowShapeParams; + +/** \brief A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. */ +typedef struct SDL_WindowShapeMode { + /** \brief The mode of these window-shape parameters. */ + WindowShapeMode mode; + /** \brief Window-shape parameters. */ + SDL_WindowShapeParams parameters; +} SDL_WindowShapeMode; + +/** + * Set the shape and parameters of a shaped window. + * + * \param window The shaped window whose parameters should be set. + * \param shape A surface encoding the desired shape for the window. + * \param shape_mode The parameters to set for the shaped window. + * \return 0 on success, SDL_INVALID_SHAPE_ARGUMENT on an invalid shape + * argument, or SDL_NONSHAPEABLE_WINDOW if the SDL_Window given does + * not reference a valid shaped window. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WindowShapeMode + * \sa SDL_GetShapedWindowMode + */ +extern DECLSPEC int SDLCALL SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); + +/** + * Get the shape parameters of a shaped window. + * + * \param window The shaped window whose parameters should be retrieved. + * \param shape_mode An empty shape-mode structure to fill, or NULL to check + * whether the window has a shape. + * \return 0 if the window has a shape and, provided shape_mode was not NULL, + * shape_mode has been filled with the mode data, + * SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped + * window, or SDL_WINDOW_LACKS_SHAPE if the SDL_Window given is a + * shapeable window currently lacking a shape. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WindowShapeMode + * \sa SDL_SetWindowShape + */ +extern DECLSPEC int SDLCALL SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_shape_h_ */ diff --git a/Thirdparty/SDL2/include/SDL_stdinc.h b/Thirdparty/SDL2/include/SDL_stdinc.h new file mode 100644 index 0000000..182ed86 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_stdinc.h @@ -0,0 +1,838 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_stdinc.h + * + * This is a general header that includes C language support. + */ + +#ifndef SDL_stdinc_h_ +#define SDL_stdinc_h_ + +#include "SDL_config.h" + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_WCHAR_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#ifdef HAVE_MATH_H +# if defined(_MSC_VER) +/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on + Visual Studio. See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx + for more information. +*/ +# ifndef _USE_MATH_DEFINES +# define _USE_MATH_DEFINES +# endif +# endif +# include +#endif +#ifdef HAVE_FLOAT_H +# include +#endif +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) +#pragma alloca +# elif defined(__MRC__) +void *alloca(unsigned); +# else +char *alloca(); +# endif +#endif + +#ifdef SIZE_MAX +# define SDL_SIZE_MAX SIZE_MAX +#else +# define SDL_SIZE_MAX ((size_t) -1) +#endif + +/** + * Check if the compiler supports a given builtin. + * Supported by virtually all clang versions and recent gcc. Use this + * instead of checking the clang version if possible. + */ +#ifdef __has_builtin +#define _SDL_HAS_BUILTIN(x) __has_builtin(x) +#else +#define _SDL_HAS_BUILTIN(x) 0 +#endif + +/** + * The number of elements in an array. + */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/** + * Macro useful for building other macros with strings in them + * + * e.g. #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n") + */ +#define SDL_STRINGIFY_ARG(arg) #arg + +/** + * \name Cast operators + * + * Use proper C++ casts when compiled as C++ to be compatible with the option + * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). + */ +/* @{ */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#define SDL_const_cast(type, expression) const_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#define SDL_const_cast(type, expression) ((type)(expression)) +#endif +/* @} *//* Cast operators */ + +/* Define a four character code as a Uint32 */ +#define SDL_FOURCC(A, B, C, D) \ + ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) + +/** + * \name Basic data types + */ +/* @{ */ + +#ifdef __CC_ARM +/* ARM's compiler throws warnings if we use an enum: like "SDL_bool x = a < b;" */ +#define SDL_FALSE 0 +#define SDL_TRUE 1 +typedef int SDL_bool; +#else +typedef enum +{ + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; +#endif + +/** + * \brief A signed 8-bit integer type. + */ +#define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ +#define SDL_MIN_SINT8 ((Sint8)(~0x7F)) /* -128 */ +typedef int8_t Sint8; +/** + * \brief An unsigned 8-bit integer type. + */ +#define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ +#define SDL_MIN_UINT8 ((Uint8)0x00) /* 0 */ +typedef uint8_t Uint8; +/** + * \brief A signed 16-bit integer type. + */ +#define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ +#define SDL_MIN_SINT16 ((Sint16)(~0x7FFF)) /* -32768 */ +typedef int16_t Sint16; +/** + * \brief An unsigned 16-bit integer type. + */ +#define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ +#define SDL_MIN_UINT16 ((Uint16)0x0000) /* 0 */ +typedef uint16_t Uint16; +/** + * \brief A signed 32-bit integer type. + */ +#define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ +#define SDL_MIN_SINT32 ((Sint32)(~0x7FFFFFFF)) /* -2147483648 */ +typedef int32_t Sint32; +/** + * \brief An unsigned 32-bit integer type. + */ +#define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ +#define SDL_MIN_UINT32 ((Uint32)0x00000000) /* 0 */ +typedef uint32_t Uint32; + +/** + * \brief A signed 64-bit integer type. + */ +#define SDL_MAX_SINT64 ((Sint64)0x7FFFFFFFFFFFFFFFll) /* 9223372036854775807 */ +#define SDL_MIN_SINT64 ((Sint64)(~0x7FFFFFFFFFFFFFFFll)) /* -9223372036854775808 */ +typedef int64_t Sint64; +/** + * \brief An unsigned 64-bit integer type. + */ +#define SDL_MAX_UINT64 ((Uint64)0xFFFFFFFFFFFFFFFFull) /* 18446744073709551615 */ +#define SDL_MIN_UINT64 ((Uint64)(0x0000000000000000ull)) /* 0 */ +typedef uint64_t Uint64; + +/* @} *//* Basic data types */ + +/** + * \name Floating-point constants + */ +/* @{ */ + +#ifdef FLT_EPSILON +#define SDL_FLT_EPSILON FLT_EPSILON +#else +#define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ +#endif + +/* @} *//* Floating-point constants */ + +/* Make sure we have macros for printing width-based integers. + * should define these but this is not true all platforms. + * (for example win32) */ +#ifndef SDL_PRIs64 +#ifdef PRIs64 +#define SDL_PRIs64 PRIs64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIs64 "I64d" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIs64 "ld" +#else +#define SDL_PRIs64 "lld" +#endif +#endif +#ifndef SDL_PRIu64 +#ifdef PRIu64 +#define SDL_PRIu64 PRIu64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIu64 "I64u" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIu64 "lu" +#else +#define SDL_PRIu64 "llu" +#endif +#endif +#ifndef SDL_PRIx64 +#ifdef PRIx64 +#define SDL_PRIx64 PRIx64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIx64 "I64x" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIx64 "lx" +#else +#define SDL_PRIx64 "llx" +#endif +#endif +#ifndef SDL_PRIX64 +#ifdef PRIX64 +#define SDL_PRIX64 PRIX64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIX64 "I64X" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIX64 "lX" +#else +#define SDL_PRIX64 "llX" +#endif +#endif +#ifndef SDL_PRIs32 +#ifdef PRId32 +#define SDL_PRIs32 PRId32 +#else +#define SDL_PRIs32 "d" +#endif +#endif +#ifndef SDL_PRIu32 +#ifdef PRIu32 +#define SDL_PRIu32 PRIu32 +#else +#define SDL_PRIu32 "u" +#endif +#endif +#ifndef SDL_PRIx32 +#ifdef PRIx32 +#define SDL_PRIx32 PRIx32 +#else +#define SDL_PRIx32 "x" +#endif +#endif +#ifndef SDL_PRIX32 +#ifdef PRIX32 +#define SDL_PRIX32 PRIX32 +#else +#define SDL_PRIX32 "X" +#endif +#endif + +/* Annotations to help code analysis tools */ +#ifdef SDL_DISABLE_ANALYZE_MACROS +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#else +#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ +#include + +#define SDL_IN_BYTECAP(x) _In_bytecount_(x) +#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) +#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) +#define SDL_OUT_CAP(x) _Out_cap_(x) +#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) +#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) + +#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ +#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ +#else +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#endif +#if defined(__GNUC__) +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) +#else +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#endif +#endif /* SDL_DISABLE_ANALYZE_MACROS */ + +#ifndef SDL_COMPILE_TIME_ASSERT +#if defined(__cplusplus) +#if (__cplusplus >= 201103L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#endif +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define SDL_COMPILE_TIME_ASSERT(name, x) _Static_assert(x, #x) +#endif +#endif /* !SDL_COMPILE_TIME_ASSERT */ + +#ifndef SDL_COMPILE_TIME_ASSERT +/* universal, but may trigger -Wunused-local-typedefs */ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1] +#endif + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +/* Check to make sure enums are the size of ints, for structure packing. + For both Watcom C/C++ and Borland C/C++ the compiler option that makes + enums having the size of an int must be enabled. + This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). +*/ + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +#if !defined(__ANDROID__) && !defined(__VITA__) && !defined(__3DS__) + /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ +typedef enum +{ + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); +extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); +extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); +extern DECLSPEC void SDLCALL SDL_free(void *mem); + +typedef void *(SDLCALL *SDL_malloc_func)(size_t size); +typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); +typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); +typedef void (SDLCALL *SDL_free_func)(void *mem); + +/** + * Get the original set of SDL memory functions + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, + SDL_calloc_func *calloc_func, + SDL_realloc_func *realloc_func, + SDL_free_func *free_func); + +/** + * Get the current set of SDL memory functions + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func, + SDL_calloc_func *calloc_func, + SDL_realloc_func *realloc_func, + SDL_free_func *free_func); + +/** + * Replace SDL's memory allocation functions with a custom set + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, + SDL_calloc_func calloc_func, + SDL_realloc_func realloc_func, + SDL_free_func free_func); + +/** + * Get the number of outstanding (unfreed) allocations + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void); + +extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); +extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); + +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); +extern DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); + +extern DECLSPEC int SDLCALL SDL_abs(int x); + +/* NOTE: these double-evaluate their arguments, so you should never have side effects in the parameters */ +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) +#define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) + +extern DECLSPEC int SDLCALL SDL_isalpha(int x); +extern DECLSPEC int SDLCALL SDL_isalnum(int x); +extern DECLSPEC int SDLCALL SDL_isblank(int x); +extern DECLSPEC int SDLCALL SDL_iscntrl(int x); +extern DECLSPEC int SDLCALL SDL_isdigit(int x); +extern DECLSPEC int SDLCALL SDL_isxdigit(int x); +extern DECLSPEC int SDLCALL SDL_ispunct(int x); +extern DECLSPEC int SDLCALL SDL_isspace(int x); +extern DECLSPEC int SDLCALL SDL_isupper(int x); +extern DECLSPEC int SDLCALL SDL_islower(int x); +extern DECLSPEC int SDLCALL SDL_isprint(int x); +extern DECLSPEC int SDLCALL SDL_isgraph(int x); +extern DECLSPEC int SDLCALL SDL_toupper(int x); +extern DECLSPEC int SDLCALL SDL_tolower(int x); + +extern DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); +extern DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); + +extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); + +#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) +#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) +#define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) + +#define SDL_copyp(dst, src) \ + { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ + SDL_memcpy((dst), (src), sizeof (*(src))) + + +/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ +SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) +{ +#if defined(__GNUC__) && defined(__i386__) + int u0, u1, u2; + __asm__ __volatile__ ( + "cld \n\t" + "rep ; stosl \n\t" + : "=&D" (u0), "=&a" (u1), "=&c" (u2) + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) + : "memory" + ); +#else + size_t _n = (dwords + 3) / 4; + Uint32 *_p = SDL_static_cast(Uint32 *, dst); + Uint32 _val = (val); + if (dwords == 0) { + return; + } + switch (dwords % 4) { + case 0: do { *_p++ = _val; SDL_FALLTHROUGH; + case 3: *_p++ = _val; SDL_FALLTHROUGH; + case 2: *_p++ = _val; SDL_FALLTHROUGH; + case 1: *_p++ = _val; + } while ( --_n ); + } +#endif +} + +extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); + +extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); +extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC wchar_t *SDLCALL SDL_wcsdup(const wchar_t *wstr); +extern DECLSPEC wchar_t *SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); + +extern DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); +extern DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); +extern DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); +extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); +extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); +extern DECLSPEC char *SDLCALL SDL_strrev(char *str); +extern DECLSPEC char *SDLCALL SDL_strupr(char *str); +extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); +extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); +extern DECLSPEC char *SDLCALL SDL_strcasestr(const char *haystack, const char *needle); +extern DECLSPEC char *SDLCALL SDL_strtokr(char *s1, const char *s2, char **saveptr); +extern DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes); + +extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); + +extern DECLSPEC int SDLCALL SDL_atoi(const char *str); +extern DECLSPEC double SDLCALL SDL_atof(const char *str); +extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); +extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); + +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); + +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); +extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3); +extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); +extern DECLSPEC int SDLCALL SDL_vasprintf(char **strp, const char *fmt, va_list ap); + +#ifndef HAVE_M_PI +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 /**< pi */ +#endif +#endif + +/** + * Use this function to compute arc cosine of `x`. + * + * The definition of `y = acos(x)` is `x = cos(y)`. + * + * Domain: `-1 <= x <= 1` + * + * Range: `0 <= y <= Pi` + * + * \param x floating point value, in radians. + * \returns arc cosine of `x`. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC double SDLCALL SDL_acos(double x); +extern DECLSPEC float SDLCALL SDL_acosf(float x); +extern DECLSPEC double SDLCALL SDL_asin(double x); +extern DECLSPEC float SDLCALL SDL_asinf(float x); +extern DECLSPEC double SDLCALL SDL_atan(double x); +extern DECLSPEC float SDLCALL SDL_atanf(float x); +extern DECLSPEC double SDLCALL SDL_atan2(double y, double x); +extern DECLSPEC float SDLCALL SDL_atan2f(float y, float x); +extern DECLSPEC double SDLCALL SDL_ceil(double x); +extern DECLSPEC float SDLCALL SDL_ceilf(float x); +extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); +extern DECLSPEC float SDLCALL SDL_copysignf(float x, float y); +extern DECLSPEC double SDLCALL SDL_cos(double x); +extern DECLSPEC float SDLCALL SDL_cosf(float x); +extern DECLSPEC double SDLCALL SDL_exp(double x); +extern DECLSPEC float SDLCALL SDL_expf(float x); +extern DECLSPEC double SDLCALL SDL_fabs(double x); +extern DECLSPEC float SDLCALL SDL_fabsf(float x); +extern DECLSPEC double SDLCALL SDL_floor(double x); +extern DECLSPEC float SDLCALL SDL_floorf(float x); +extern DECLSPEC double SDLCALL SDL_trunc(double x); +extern DECLSPEC float SDLCALL SDL_truncf(float x); +extern DECLSPEC double SDLCALL SDL_fmod(double x, double y); +extern DECLSPEC float SDLCALL SDL_fmodf(float x, float y); +extern DECLSPEC double SDLCALL SDL_log(double x); +extern DECLSPEC float SDLCALL SDL_logf(float x); +extern DECLSPEC double SDLCALL SDL_log10(double x); +extern DECLSPEC float SDLCALL SDL_log10f(float x); +extern DECLSPEC double SDLCALL SDL_pow(double x, double y); +extern DECLSPEC float SDLCALL SDL_powf(float x, float y); +extern DECLSPEC double SDLCALL SDL_round(double x); +extern DECLSPEC float SDLCALL SDL_roundf(float x); +extern DECLSPEC long SDLCALL SDL_lround(double x); +extern DECLSPEC long SDLCALL SDL_lroundf(float x); +extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); +extern DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); +extern DECLSPEC double SDLCALL SDL_sin(double x); +extern DECLSPEC float SDLCALL SDL_sinf(float x); +extern DECLSPEC double SDLCALL SDL_sqrt(double x); +extern DECLSPEC float SDLCALL SDL_sqrtf(float x); +extern DECLSPEC double SDLCALL SDL_tan(double x); +extern DECLSPEC float SDLCALL SDL_tanf(float x); + +/* The SDL implementation of iconv() returns these error codes */ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 + +/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, + const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, + size_t * inbytesleft, char **outbuf, + size_t * outbytesleft); + +/** + * This function converts a buffer or string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, + const char *fromcode, + const char *inbuf, + size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", (char *)S, (SDL_wcslen(S)+1)*sizeof(wchar_t)) + +/* force builds using Clang's static analysis tools to use literal C runtime + here, since there are possibly tests that are ineffective otherwise. */ +#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS) + +/* The analyzer knows about strlcpy even when the system doesn't provide it */ +#ifndef HAVE_STRLCPY +size_t strlcpy(char* dst, const char* src, size_t size); +#endif + +/* The analyzer knows about strlcat even when the system doesn't provide it */ +#ifndef HAVE_STRLCAT +size_t strlcat(char* dst, const char* src, size_t size); +#endif + +#ifndef HAVE_WCSLCPY +size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size); +#endif + +#ifndef HAVE_WCSLCAT +size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); +#endif + +/* Starting LLVM 16, the analyser errors out if these functions do not have + their prototype defined (clang-diagnostic-implicit-function-declaration) */ +#include +#include +#include + +#define SDL_malloc malloc +#define SDL_calloc calloc +#define SDL_realloc realloc +#define SDL_free free +#define SDL_memset memset +#define SDL_memcpy memcpy +#define SDL_memmove memmove +#define SDL_memcmp memcmp +#define SDL_strlcpy strlcpy +#define SDL_strlcat strlcat +#define SDL_strlen strlen +#define SDL_wcslen wcslen +#define SDL_wcslcpy wcslcpy +#define SDL_wcslcat wcslcat +#define SDL_strdup strdup +#define SDL_wcsdup wcsdup +#define SDL_strchr strchr +#define SDL_strrchr strrchr +#define SDL_strstr strstr +#define SDL_wcsstr wcsstr +#define SDL_strtokr strtok_r +#define SDL_strcmp strcmp +#define SDL_wcscmp wcscmp +#define SDL_strncmp strncmp +#define SDL_wcsncmp wcsncmp +#define SDL_strcasecmp strcasecmp +#define SDL_strncasecmp strncasecmp +#define SDL_sscanf sscanf +#define SDL_vsscanf vsscanf +#define SDL_snprintf snprintf +#define SDL_vsnprintf vsnprintf +#endif + +SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords) +{ + return SDL_memcpy(dst, src, dwords * 4); +} + +/** + * If a * b would overflow, return -1. Otherwise store a * b via ret + * and return 0. + * + * \since This function is available since SDL 2.24.0. + */ +SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, + size_t b, + size_t *ret) +{ + if (a != 0 && b > SDL_SIZE_MAX / a) { + return -1; + } + *ret = a * b; + return 0; +} + +#if _SDL_HAS_BUILTIN(__builtin_mul_overflow) +/* This needs to be wrapped in an inline rather than being a direct #define, + * because __builtin_mul_overflow() is type-generic, but we want to be + * consistent about interpreting a and b as size_t. */ +SDL_FORCE_INLINE int _SDL_size_mul_overflow_builtin (size_t a, + size_t b, + size_t *ret) +{ + return __builtin_mul_overflow(a, b, ret) == 0 ? 0 : -1; +} +#define SDL_size_mul_overflow(a, b, ret) (_SDL_size_mul_overflow_builtin(a, b, ret)) +#endif + +/** + * If a + b would overflow, return -1. Otherwise store a + b via ret + * and return 0. + * + * \since This function is available since SDL 2.24.0. + */ +SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a, + size_t b, + size_t *ret) +{ + if (b > SDL_SIZE_MAX - a) { + return -1; + } + *ret = a + b; + return 0; +} + +#if _SDL_HAS_BUILTIN(__builtin_add_overflow) +/* This needs to be wrapped in an inline rather than being a direct #define, + * the same as the call to __builtin_mul_overflow() above. */ +SDL_FORCE_INLINE int _SDL_size_add_overflow_builtin (size_t a, + size_t b, + size_t *ret) +{ + return __builtin_add_overflow(a, b, ret) == 0 ? 0 : -1; +} +#define SDL_size_add_overflow(a, b, ret) (_SDL_size_add_overflow_builtin(a, b, ret)) +#endif + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_stdinc_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_surface.h b/Thirdparty/SDL2/include/SDL_surface.h new file mode 100644 index 0000000..d6ee615 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_surface.h @@ -0,0 +1,997 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_surface.h + * + * Header file for ::SDL_Surface definition and management functions. + */ + +#ifndef SDL_surface_h_ +#define SDL_surface_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_blendmode.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Surface flags + * + * These are the currently supported flags for the ::SDL_Surface. + * + * \internal + * Used internally (read-only). + */ +/* @{ */ +#define SDL_SWSURFACE 0 /**< Just here for compatibility */ +#define SDL_PREALLOC 0x00000001 /**< Surface uses preallocated memory */ +#define SDL_RLEACCEL 0x00000002 /**< Surface is RLE encoded */ +#define SDL_DONTFREE 0x00000004 /**< Surface is referenced internally */ +#define SDL_SIMD_ALIGNED 0x00000008 /**< Surface uses aligned memory */ +/* @} *//* Surface flags */ + +/** + * Evaluates to true if the surface needs to be locked before access. + */ +#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0) + +typedef struct SDL_BlitMap SDL_BlitMap; /* this is an opaque type. */ + +/** + * \brief A collection of pixels used in software blitting. + * + * \note This structure should be treated as read-only, except for \c pixels, + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface +{ + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + int pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + + /** Application data associated with the surface */ + void *userdata; /**< Read-write */ + + /** information needed for surfaces requiring locks */ + int locked; /**< Read-only */ + + /** list of BlitMap that hold a reference to this surface */ + void *list_blitmap; /**< Private */ + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + + /** info for fast blit mapping to other surfaces */ + SDL_BlitMap *map; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** + * \brief The type of function used for surface blitting functions. + */ +typedef int (SDLCALL *SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, + struct SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * \brief The formula used for converting between YUV and RGB + */ +typedef enum +{ + SDL_YUV_CONVERSION_JPEG, /**< Full range JPEG */ + SDL_YUV_CONVERSION_BT601, /**< BT.601 (the default) */ + SDL_YUV_CONVERSION_BT709, /**< BT.709 */ + SDL_YUV_CONVERSION_AUTOMATIC /**< BT.601 for SD content, BT.709 for HD content */ +} SDL_YUV_CONVERSION_MODE; + +/** + * Allocate a new RGB surface. + * + * If `depth` is 4 or 8 bits, an empty palette is allocated for the surface. + * If `depth` is greater than 8 bits, the pixel format is set using the + * [RGBA]mask parameters. + * + * The [RGBA]mask parameters are the bitmasks used to extract that color from + * a pixel. For instance, `Rmask` being 0xFF000000 means the red data is + * stored in the most significant byte. Using zeros for the RGB masks sets a + * default value, based on the depth. For example: + * + * ```c++ + * SDL_CreateRGBSurface(0,w,h,32,0,0,0,0); + * ``` + * + * However, using zero for the Amask results in an Amask of 0. + * + * By default surfaces with an alpha mask are set up for blending as with: + * + * ```c++ + * SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND) + * ``` + * + * You can change this by calling SDL_SetSurfaceBlendMode() and selecting a + * different `blendMode`. + * + * \param flags the flags are unused and should be set to 0 + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param Rmask the red mask for the pixels + * \param Gmask the green mask for the pixels + * \param Bmask the blue mask for the pixels + * \param Amask the alpha mask for the pixels + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); + + +/* !!! FIXME for 2.1: why does this ask for depth? Format provides that. */ + +/** + * Allocate a new RGB surface with a specific pixel format. + * + * This function operates mostly like SDL_CreateRGBSurface(), except instead + * of providing pixel color masks, you provide it with a predefined format + * from SDL_PixelFormatEnum. + * + * \param flags the flags are unused and should be set to 0 + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param format the SDL_PixelFormatEnum for the new surface's pixel format. + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormat + (Uint32 flags, int width, int height, int depth, Uint32 format); + +/** + * Allocate a new RGB surface with existing pixel data. + * + * This function operates mostly like SDL_CreateRGBSurface(), except it does + * not allocate memory for the pixel data, instead the caller provides an + * existing buffer of data for the surface to use. + * + * No copy is made of the pixel data. Pixel data is not managed automatically; + * you must free the surface before you free the pixel data. + * + * \param pixels a pointer to existing pixel data + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param pitch the pitch of the surface in bytes + * \param Rmask the red mask for the pixels + * \param Gmask the green mask for the pixels + * \param Bmask the blue mask for the pixels + * \param Amask the alpha mask for the pixels + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, + int height, + int depth, + int pitch, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); + +/* !!! FIXME for 2.1: why does this ask for depth? Format provides that. */ + +/** + * Allocate a new RGB surface with with a specific pixel format and existing + * pixel data. + * + * This function operates mostly like SDL_CreateRGBSurfaceFrom(), except + * instead of providing pixel color masks, you provide it with a predefined + * format from SDL_PixelFormatEnum. + * + * No copy is made of the pixel data. Pixel data is not managed automatically; + * you must free the surface before you free the pixel data. + * + * \param pixels a pointer to existing pixel data + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param pitch the pitch of the surface in bytes + * \param format the SDL_PixelFormatEnum for the new surface's pixel format. + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormatFrom + (void *pixels, int width, int height, int depth, int pitch, Uint32 format); + +/** + * Free an RGB surface. + * + * It is safe to pass NULL to this function. + * + * \param surface the SDL_Surface to free. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_LoadBMP + * \sa SDL_LoadBMP_RW + */ +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface); + +/** + * Set the palette used by a surface. + * + * A single palette can be shared with many surfaces. + * + * \param surface the SDL_Surface structure to update + * \param palette the SDL_Palette structure to use + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface, + SDL_Palette * palette); + +/** + * Set up a surface for directly accessing the pixels. + * + * Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write to + * and read from `surface->pixels`, using the pixel format stored in + * `surface->format`. Once you are done accessing the surface, you should use + * SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If `SDL_MUSTLOCK(surface)` evaluates to + * 0, then you can read and write to the surface at any time, and the pixel + * format of the surface will not change. + * + * \param surface the SDL_Surface structure to be locked + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MUSTLOCK + * \sa SDL_UnlockSurface + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface); + +/** + * Release a surface after directly accessing the pixels. + * + * \param surface the SDL_Surface structure to be unlocked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockSurface + */ +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface); + +/** + * Load a BMP image from a seekable SDL data stream. + * + * The new surface should be freed with SDL_FreeSurface(). Not doing so will + * result in a memory leak. + * + * src is an open SDL_RWops buffer, typically loaded with SDL_RWFromFile. + * Alternitavely, you might also use the macro SDL_LoadBMP to load a bitmap + * from a file, convert it to an SDL_Surface and then close the file. + * + * \param src the data stream for the surface + * \param freesrc non-zero to close the stream after being read + * \returns a pointer to a new SDL_Surface structure or NULL if there was an + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeSurface + * \sa SDL_RWFromFile + * \sa SDL_LoadBMP + * \sa SDL_SaveBMP_RW + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src, + int freesrc); + +/** + * Load a surface from a file. + * + * Convenience macro. + */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data stream in BMP format. + * + * Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the + * BMP directly. Other RGB formats with 8-bit or higher get converted to a + * 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit + * surface before they are saved. YUV and paletted 1-bit and 4-bit formats are + * not supported. + * + * \param surface the SDL_Surface structure containing the image to be saved + * \param dst a data stream to save to + * \param freedst non-zero to close the stream after being written + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadBMP_RW + * \sa SDL_SaveBMP + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface * surface, SDL_RWops * dst, int freedst); + +/** + * Save a surface to a file. + * + * Convenience macro. + */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Set the RLE acceleration hint for a surface. + * + * If RLE is enabled, color key and alpha blending blits are much faster, but + * the surface must be locked before directly accessing the pixels. + * + * \param surface the SDL_Surface structure to optimize + * \param flag 0 to disable, non-zero to enable RLE acceleration + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_LockSurface + * \sa SDL_UnlockSurface + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface, + int flag); + +/** + * Returns whether the surface is RLE enabled + * + * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * + * \param surface the SDL_Surface structure to query + * \returns SDL_TRUE if the surface is RLE enabled, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_SetSurfaceRLE + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSurfaceRLE(SDL_Surface * surface); + +/** + * Set the color key (transparent pixel) in a surface. + * + * The color key defines a pixel value that will be treated as transparent in + * a blit. For example, one can use this to specify that cyan pixels should be + * considered transparent, and therefore not rendered. + * + * It is a pixel of the format used by the surface, as generated by + * SDL_MapRGB(). + * + * RLE acceleration can substantially speed up blitting of images with large + * horizontal runs of transparent pixels. See SDL_SetSurfaceRLE() for details. + * + * \param surface the SDL_Surface structure to update + * \param flag SDL_TRUE to enable color key, SDL_FALSE to disable color key + * \param key the transparent pixel + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_GetColorKey + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface, + int flag, Uint32 key); + +/** + * Returns whether the surface has a color key + * + * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * + * \param surface the SDL_Surface structure to query + * \return SDL_TRUE if the surface has a color key, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_SetColorKey + * \sa SDL_GetColorKey + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasColorKey(SDL_Surface * surface); + +/** + * Get the color key (transparent pixel) for a surface. + * + * The color key is a pixel of the format used by the surface, as generated by + * SDL_MapRGB(). + * + * If the surface doesn't have color key enabled this function returns -1. + * + * \param surface the SDL_Surface structure to query + * \param key a pointer filled in with the transparent pixel + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_SetColorKey + */ +extern DECLSPEC int SDLCALL SDL_GetColorKey(SDL_Surface * surface, + Uint32 * key); + +/** + * Set an additional color value multiplied into blit operations. + * + * When this surface is blitted, during the blit operation each source color + * channel is modulated by the appropriate color value according to the + * following formula: + * + * `srcC = srcC * (color / 255)` + * + * \param surface the SDL_Surface structure to update + * \param r the red color value multiplied into blit operations + * \param g the green color value multiplied into blit operations + * \param b the blue color value multiplied into blit operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceColorMod + * \sa SDL_SetSurfaceAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * Get the additional color value multiplied into blit operations. + * + * \param surface the SDL_Surface structure to query + * \param r a pointer filled in with the current red color value + * \param g a pointer filled in with the current green color value + * \param b a pointer filled in with the current blue color value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceAlphaMod + * \sa SDL_SetSurfaceColorMod + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * Set an additional alpha value used in blit operations. + * + * When this surface is blitted, during the blit operation the source alpha + * value is modulated by this alpha value according to the following formula: + * + * `srcA = srcA * (alpha / 255)` + * + * \param surface the SDL_Surface structure to update + * \param alpha the alpha value multiplied into blit operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceAlphaMod + * \sa SDL_SetSurfaceColorMod + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 alpha); + +/** + * Get the additional alpha value used in blit operations. + * + * \param surface the SDL_Surface structure to query + * \param alpha a pointer filled in with the current alpha value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceColorMod + * \sa SDL_SetSurfaceAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 * alpha); + +/** + * Set the blend mode used for blit operations. + * + * To copy a surface to another surface (or texture) without blending with the + * existing data, the blendmode of the SOURCE surface should be set to + * `SDL_BLENDMODE_NONE`. + * + * \param surface the SDL_Surface structure to update + * \param blendMode the SDL_BlendMode to use for blit blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceBlendMode + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for blit operations. + * + * \param surface the SDL_Surface structure to query + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetSurfaceBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode *blendMode); + +/** + * Set the clipping rectangle for a surface. + * + * When `surface` is the destination of a blit, only the area within the clip + * rectangle is drawn into. + * + * Note that blits are automatically clipped to the edges of the source and + * destination surfaces. + * + * \param surface the SDL_Surface structure to be clipped + * \param rect the SDL_Rect structure representing the clipping rectangle, or + * NULL to disable clipping + * \returns SDL_TRUE if the rectangle intersects the surface, otherwise + * SDL_FALSE and blits will be completely clipped. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_GetClipRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, + const SDL_Rect * rect); + +/** + * Get the clipping rectangle for a surface. + * + * When `surface` is the destination of a blit, only the area within the clip + * rectangle is drawn into. + * + * \param surface the SDL_Surface structure representing the surface to be + * clipped + * \param rect an SDL_Rect structure filled in with the clipping rectangle for + * the surface + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_SetClipRect + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, + SDL_Rect * rect); + +/* + * Creates a new surface identical to the existing surface. + * + * The returned surface should be freed with SDL_FreeSurface(). + * + * \param surface the surface to duplicate. + * \returns a copy of the surface, or NULL on failure; call SDL_GetError() for + * more information. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_DuplicateSurface(SDL_Surface * surface); + +/** + * Copy an existing surface to a new surface of the specified format. + * + * This function is used to optimize images for faster *repeat* blitting. This + * is accomplished by converting the original and storing the result as a new + * surface. The new, optimized surface can then be used as the source for + * future blits, making them faster. + * + * \param src the existing SDL_Surface structure to convert + * \param fmt the SDL_PixelFormat structure that the new surface is optimized + * for + * \param flags the flags are unused and should be set to 0; this is a + * leftover from SDL 1.2's API + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + * \sa SDL_ConvertSurfaceFormat + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface + (SDL_Surface * src, const SDL_PixelFormat * fmt, Uint32 flags); + +/** + * Copy an existing surface to a new surface of the specified format enum. + * + * This function operates just like SDL_ConvertSurface(), but accepts an + * SDL_PixelFormatEnum value instead of an SDL_PixelFormat structure. As such, + * it might be easier to call but it doesn't have access to palette + * information for the destination surface, in case that would be important. + * + * \param src the existing SDL_Surface structure to convert + * \param pixel_format the SDL_PixelFormatEnum that the new surface is + * optimized for + * \param flags the flags are unused and should be set to 0; this is a + * leftover from SDL 1.2's API + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + * \sa SDL_ConvertSurface + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurfaceFormat + (SDL_Surface * src, Uint32 pixel_format, Uint32 flags); + +/** + * Copy a block of pixels of one format to another format. + * + * \param width the width of the block to copy, in pixels + * \param height the height of the block to copy, in pixels + * \param src_format an SDL_PixelFormatEnum value of the `src` pixels format + * \param src a pointer to the source pixels + * \param src_pitch the pitch of the source pixels, in bytes + * \param dst_format an SDL_PixelFormatEnum value of the `dst` pixels format + * \param dst a pointer to be filled in with new pixel data + * \param dst_pitch the pitch of the destination pixels, in bytes + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Premultiply the alpha on a block of pixels. + * + * This is safe to use with src == dst, but not for other overlapping areas. + * + * This function is currently only implemented for SDL_PIXELFORMAT_ARGB8888. + * + * \param width the width of the block to convert, in pixels + * \param height the height of the block to convert, in pixels + * \param src_format an SDL_PixelFormatEnum value of the `src` pixels format + * \param src a pointer to the source pixels + * \param src_pitch the pitch of the source pixels, in bytes + * \param dst_format an SDL_PixelFormatEnum value of the `dst` pixels format + * \param dst a pointer to be filled in with premultiplied pixel data + * \param dst_pitch the pitch of the destination pixels, in bytes + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_PremultiplyAlpha(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Perform a fast fill of a rectangle with a specific color. + * + * `color` should be a pixel of the format used by the surface, and can be + * generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an + * alpha component then the destination is simply filled with that alpha + * information, no blending takes place. + * + * If there is a clip rectangle set on the destination (set via + * SDL_SetClipRect()), then this function will fill based on the intersection + * of the clip rectangle and `rect`. + * + * \param dst the SDL_Surface structure that is the drawing target + * \param rect the SDL_Rect structure representing the rectangle to fill, or + * NULL to fill the entire surface + * \param color the color to fill with + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FillRects + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color); + +/** + * Perform a fast fill of a set of rectangles with a specific color. + * + * `color` should be a pixel of the format used by the surface, and can be + * generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an + * alpha component then the destination is simply filled with that alpha + * information, no blending takes place. + * + * If there is a clip rectangle set on the destination (set via + * SDL_SetClipRect()), then this function will fill based on the intersection + * of the clip rectangle and `rect`. + * + * \param dst the SDL_Surface structure that is the drawing target + * \param rects an array of SDL_Rects representing the rectangles to fill. + * \param count the number of rectangles in the array + * \param color the color to fill with + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FillRect + */ +extern DECLSPEC int SDLCALL SDL_FillRects + (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color); + +/* !!! FIXME: merge this documentation with the wiki */ +/** + * Performs a fast blit from the source surface to the destination surface. + * + * This assumes that the source and destination rectangles are + * the same size. If either \c srcrect or \c dstrect are NULL, the entire + * surface (\c src or \c dst) is copied. The final blit rectangles are saved + * in \c srcrect and \c dstrect after all clipping is performed. + * + * \returns 0 if the blit is successful, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without blending and colorkey + * are defined as follows: + * \verbatim + RGBA->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB, set destination alpha to source per-surface alpha value. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + + RGBA->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy all of RGBA to the destination. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + \endverbatim + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** + * Perform a fast blit from the source surface to the destination surface. + * + * SDL_UpperBlit() has been replaced by SDL_BlitSurface(), which is merely a + * macro for this function with a less confusing name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Perform low-level surface blitting only. + * + * This is a semi-private blit function and it performs low-level surface + * blitting, assuming the input rectangles have already been clipped. + * + * Unless you know what you're doing, you should be using SDL_BlitSurface() + * instead. + * + * \param src the SDL_Surface structure to be copied from + * \param srcrect the SDL_Rect structure representing the rectangle to be + * copied, or NULL to copy the entire surface + * \param dst the SDL_Surface structure that is the blit target + * \param dstrect the SDL_Rect structure representing the rectangle that is + * copied into + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + + +/** + * Perform a fast, low quality, stretch blit between two surfaces of the same + * format. + * + * Please use SDL_BlitScaled() instead. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + +/** + * Perform bilinear scaling between two surfaces of the same format, 32BPP. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretchLinear(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + + +#define SDL_BlitScaled SDL_UpperBlitScaled + +/** + * Perform a scaled surface copy to a destination surface. + * + * SDL_UpperBlitScaled() has been replaced by SDL_BlitScaled(), which is + * merely a macro for this function with a less confusing name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitScaled + */ +extern DECLSPEC int SDLCALL SDL_UpperBlitScaled + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Perform low-level surface scaled blitting only. + * + * This is a semi-private function and it performs low-level surface blitting, + * assuming the input rectangles have already been clipped. + * + * \param src the SDL_Surface structure to be copied from + * \param srcrect the SDL_Rect structure representing the rectangle to be + * copied + * \param dst the SDL_Surface structure that is the blit target + * \param dstrect the SDL_Rect structure representing the rectangle that is + * copied into + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitScaled + */ +extern DECLSPEC int SDLCALL SDL_LowerBlitScaled + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Set the YUV conversion mode + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC void SDLCALL SDL_SetYUVConversionMode(SDL_YUV_CONVERSION_MODE mode); + +/** + * Get the YUV conversion mode + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionMode(void); + +/** + * Get the YUV conversion mode, returning the correct mode for the resolution + * when the current conversion mode is SDL_YUV_CONVERSION_AUTOMATIC + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionModeForResolution(int width, int height); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_surface_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_system.h b/Thirdparty/SDL2/include/SDL_system.h new file mode 100644 index 0000000..4b7eadd --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_system.h @@ -0,0 +1,623 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_system.h + * + * Include file for platform specific SDL API functions + */ + +#ifndef SDL_system_h_ +#define SDL_system_h_ + +#include "SDL_stdinc.h" +#include "SDL_keyboard.h" +#include "SDL_render.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* Platform specific functions for Windows */ +#if defined(__WIN32__) || defined(__GDK__) + +typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam); + +/** + * Set a callback for every Windows message, run before TranslateMessage(). + * + * \param callback The SDL_WindowsMessageHook function to call. + * \param userdata a pointer to pass to every iteration of `callback` + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + +/** + * Get the D3D9 adapter index that matches the specified display index. + * + * The returned adapter index can be passed to `IDirect3D9::CreateDevice` and + * controls on which monitor a full screen application will appear. + * + * \param displayIndex the display index for which to get the D3D9 adapter + * index + * \returns the D3D9 adapter index on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); + +typedef struct IDirect3DDevice9 IDirect3DDevice9; + +/** + * Get the D3D9 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D device + * \returns the D3D9 device associated with given renderer or NULL if it is + * not a D3D9 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); + +typedef struct ID3D11Device ID3D11Device; + +/** + * Get the D3D11 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D11 device + * \returns the D3D11 device associated with given renderer or NULL if it is + * not a D3D11 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC ID3D11Device* SDLCALL SDL_RenderGetD3D11Device(SDL_Renderer * renderer); + +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ + +#if defined(__WIN32__) || defined(__GDK__) + +typedef struct ID3D12Device ID3D12Device; + +/** + * Get the D3D12 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D12 device + * \returns the D3D12 device associated with given renderer or NULL if it is + * not a D3D12 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC ID3D12Device* SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer* renderer); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + +/** + * Get the DXGI Adapter and Output indices for the specified display index. + * + * The DXGI Adapter and Output indices can be passed to `EnumAdapters` and + * `EnumOutputs` respectively to get the objects required to create a DX10 or + * DX11 device and swap chain. + * + * Before SDL 2.0.4 this function did not return a value. Since SDL 2.0.4 it + * returns an SDL_bool. + * + * \param displayIndex the display index for which to get both indices + * \param adapterIndex a pointer to be filled in with the adapter index + * \param outputIndex a pointer to be filled in with the output index + * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); + +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ + +/* Platform specific functions for Linux */ +#ifdef __LINUX__ + +/** + * Sets the UNIX nice value for a thread. + * + * This uses setpriority() if possible, and RealtimeKit if available. + * + * \param threadID the Unix thread ID to change priority of. + * \param priority The new, Unix-specific, priority value. + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriority(Sint64 threadID, int priority); + +/** + * Sets the priority (not nice level) and scheduling policy for a thread. + * + * This uses setpriority() if possible, and RealtimeKit if available. + * + * \param threadID The Unix thread ID to change priority of. + * \param sdlPriority The new SDL_ThreadPriority value. + * \param schedPolicy The new scheduling policy (SCHED_FIFO, SCHED_RR, + * SCHED_OTHER, etc...) + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); + +#endif /* __LINUX__ */ + +/* Platform specific functions for iOS */ +#ifdef __IPHONEOS__ + +#define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam) + +/** + * Use this function to set the animation callback on Apple iOS. + * + * The function prototype for `callback` is: + * + * ```c + * void callback(void* callbackParam); + * ``` + * + * Where its parameter, `callbackParam`, is what was passed as `callbackParam` + * to SDL_iPhoneSetAnimationCallback(). + * + * This function is only available on Apple iOS. + * + * For more information see: + * https://github.com/libsdl-org/SDL/blob/main/docs/README-ios.md + * + * This functions is also accessible using the macro + * SDL_iOSSetAnimationCallback() since SDL 2.0.4. + * + * \param window the window for which the animation callback should be set + * \param interval the number of frames after which **callback** will be + * called + * \param callback the function to call for every frame. + * \param callbackParam a pointer that is passed to `callback`. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_iPhoneSetEventPump + */ +extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (SDLCALL *callback)(void*), void *callbackParam); + +#define SDL_iOSSetEventPump(enabled) SDL_iPhoneSetEventPump(enabled) + +/** + * Use this function to enable or disable the SDL event pump on Apple iOS. + * + * This function is only available on Apple iOS. + * + * This functions is also accessible using the macro SDL_iOSSetEventPump() + * since SDL 2.0.4. + * + * \param enabled SDL_TRUE to enable the event pump, SDL_FALSE to disable it + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_iPhoneSetAnimationCallback + */ +extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); + +#endif /* __IPHONEOS__ */ + + +/* Platform specific functions for Android */ +#ifdef __ANDROID__ + +/** + * Get the Android Java Native Interface Environment of the current thread. + * + * This is the JNIEnv one needs to access the Java virtual machine from native + * code, and is needed for many Android APIs to be usable from C. + * + * The prototype of the function in SDL's code actually declare a void* return + * type, even if the implementation returns a pointer to a JNIEnv. The + * rationale being that the SDL headers can avoid including jni.h. + * + * \returns a pointer to Java native interface object (JNIEnv) to which the + * current thread is attached, or 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetActivity + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(void); + +/** + * Retrieve the Java instance of the Android activity class. + * + * The prototype of the function in SDL's code actually declares a void* + * return type, even if the implementation returns a jobject. The rationale + * being that the SDL headers can avoid including jni.h. + * + * The jobject returned by the function is a local reference and must be + * released by the caller. See the PushLocalFrame() and PopLocalFrame() or + * DeleteLocalRef() functions of the Java native interface: + * + * https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html + * + * \returns the jobject representing the instance of the Activity class of the + * Android application, or NULL on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetJNIEnv + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetActivity(void); + +/** + * Query Android API level of the current device. + * + * - API level 31: Android 12 + * - API level 30: Android 11 + * - API level 29: Android 10 + * - API level 28: Android 9 + * - API level 27: Android 8.1 + * - API level 26: Android 8.0 + * - API level 25: Android 7.1 + * - API level 24: Android 7.0 + * - API level 23: Android 6.0 + * - API level 22: Android 5.1 + * - API level 21: Android 5.0 + * - API level 20: Android 4.4W + * - API level 19: Android 4.4 + * - API level 18: Android 4.3 + * - API level 17: Android 4.2 + * - API level 16: Android 4.1 + * - API level 15: Android 4.0.3 + * - API level 14: Android 4.0 + * - API level 13: Android 3.2 + * - API level 12: Android 3.1 + * - API level 11: Android 3.0 + * - API level 10: Android 2.3.3 + * + * \returns the Android API level. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); + +/** + * Query if the application is running on Android TV. + * + * \returns SDL_TRUE if this is Android TV, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsAndroidTV(void); + +/** + * Query if the application is running on a Chromebook. + * + * \returns SDL_TRUE if this is a Chromebook, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsChromebook(void); + +/** + * Query if the application is running on a Samsung DeX docking station. + * + * \returns SDL_TRUE if this is a DeX docking station, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsDeXMode(void); + +/** + * Trigger the Android system back button behavior. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_AndroidBackButton(void); + +/** + See the official Android developer guide for more information: + http://developer.android.com/guide/topics/data/data-storage.html +*/ +#define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 +#define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 + +/** + * Get the path used for internal storage for this application. + * + * This path is unique to your application and cannot be written to by other + * applications. + * + * Your internal storage path is typically: + * `/data/data/your.app.package/files`. + * + * \returns the path used for internal storage or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStorageState + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath(void); + +/** + * Get the current state of external storage. + * + * The current state of external storage, a bitmask of these values: + * `SDL_ANDROID_EXTERNAL_STORAGE_READ`, `SDL_ANDROID_EXTERNAL_STORAGE_WRITE`. + * + * If external storage is currently unavailable, this will return 0. + * + * \returns the current state of external storage on success or 0 on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStoragePath + */ +extern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState(void); + +/** + * Get the path used for external storage for this application. + * + * This path is unique to your application, but is public and can be written + * to by other applications. + * + * Your external storage path is typically: + * `/storage/sdcard0/Android/data/your.app.package/files`. + * + * \returns the path used for external storage for this application on success + * or NULL on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStorageState + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath(void); + +/** + * Request permissions at runtime. + * + * This blocks the calling thread until the permission is granted or denied. + * + * \param permission The permission to request. + * \returns SDL_TRUE if the permission was granted, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AndroidRequestPermission(const char *permission); + +/** + * Shows an Android toast notification. + * + * Toasts are a sort of lightweight notification that are unique to Android. + * + * https://developer.android.com/guide/topics/ui/notifiers/toasts + * + * Shows toast in UI thread. + * + * For the `gravity` parameter, choose a value from here, or -1 if you don't + * have a preference: + * + * https://developer.android.com/reference/android/view/Gravity + * + * \param message text message to be shown + * \param duration 0=short, 1=long + * \param gravity where the notification should appear on the screen. + * \param xoffset set this parameter only when gravity >=0 + * \param yoffset set this parameter only when gravity >=0 + * \returns 0 if success, -1 if any error occurs. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_AndroidShowToast(const char* message, int duration, int gravity, int xoffset, int yoffset); + +/** + * Send a user command to SDLActivity. + * + * Override "boolean onUnhandledMessage(Message msg)" to handle the message. + * + * \param command user command that must be greater or equal to 0x8000 + * \param param user parameter + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC int SDLCALL SDL_AndroidSendMessage(Uint32 command, int param); + +#endif /* __ANDROID__ */ + +/* Platform specific functions for WinRT */ +#ifdef __WINRT__ + +/** + * \brief WinRT / Windows Phone path types + */ +typedef enum +{ + /** \brief The installed app's root directory. + Files here are likely to be read-only. */ + SDL_WINRT_PATH_INSTALLED_LOCATION, + + /** \brief The app's local data store. Files may be written here */ + SDL_WINRT_PATH_LOCAL_FOLDER, + + /** \brief The app's roaming data store. Unsupported on Windows Phone. + Files written here may be copied to other machines via a network + connection. + */ + SDL_WINRT_PATH_ROAMING_FOLDER, + + /** \brief The app's temporary data store. Unsupported on Windows Phone. + Files written here may be deleted at any time. */ + SDL_WINRT_PATH_TEMP_FOLDER +} SDL_WinRT_Path; + + +/** + * \brief WinRT Device Family + */ +typedef enum +{ + /** \brief Unknown family */ + SDL_WINRT_DEVICEFAMILY_UNKNOWN, + + /** \brief Desktop family*/ + SDL_WINRT_DEVICEFAMILY_DESKTOP, + + /** \brief Mobile family (for example smartphone) */ + SDL_WINRT_DEVICEFAMILY_MOBILE, + + /** \brief XBox family */ + SDL_WINRT_DEVICEFAMILY_XBOX, +} SDL_WinRT_DeviceFamily; + + +/** + * Retrieve a WinRT defined path on the local file system. + * + * Not all paths are available on all versions of Windows. This is especially + * true on Windows Phone. Check the documentation for the given SDL_WinRT_Path + * for more information on which path types are supported where. + * + * Documentation on most app-specific path types on WinRT can be found on + * MSDN, at the URL: + * + * https://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType the type of path to retrieve, one of SDL_WinRT_Path + * \returns a UCS-2 string (16-bit, wide-char) containing the path, or NULL if + * the path is not available for any reason; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.3. + * + * \sa SDL_WinRTGetFSPathUTF8 + */ +extern DECLSPEC const wchar_t * SDLCALL SDL_WinRTGetFSPathUNICODE(SDL_WinRT_Path pathType); + +/** + * Retrieve a WinRT defined path on the local file system. + * + * Not all paths are available on all versions of Windows. This is especially + * true on Windows Phone. Check the documentation for the given SDL_WinRT_Path + * for more information on which path types are supported where. + * + * Documentation on most app-specific path types on WinRT can be found on + * MSDN, at the URL: + * + * https://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType the type of path to retrieve, one of SDL_WinRT_Path + * \returns a UTF-8 string (8-bit, multi-byte) containing the path, or NULL if + * the path is not available for any reason; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.3. + * + * \sa SDL_WinRTGetFSPathUNICODE + */ +extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathType); + +/** + * Detects the device family of WinRT platform at runtime. + * + * \returns a value from the SDL_WinRT_DeviceFamily enum. + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_WinRTGetDeviceFamily(); + +#endif /* __WINRT__ */ + +/** + * Query if the current device is a tablet. + * + * If SDL can't determine this, it will return SDL_FALSE. + * + * \returns SDL_TRUE if the device is a tablet, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); + +/* Functions used by iOS application delegates to notify SDL about state changes */ +extern DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationWillResignActive(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidBecomeActive(void); +#ifdef __IPHONEOS__ +extern DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); +#endif + +/* Functions used only by GDK */ +#if defined(__GDK__) +typedef struct XTaskQueueObject * XTaskQueueHandle; + +/** + * Gets a reference to the global async task queue handle for GDK, + * initializing if needed. + * + * Once you are done with the task queue, you should call + * XTaskQueueCloseHandle to reduce the reference count to avoid a resource + * leak. + * + * \param outTaskQueue a pointer to be filled in with task queue handle. + * \returns 0 if success, -1 if any error occurs. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_GDKGetTaskQueue(XTaskQueueHandle * outTaskQueue); + +#endif + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_system_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_syswm.h b/Thirdparty/SDL2/include/SDL_syswm.h new file mode 100644 index 0000000..b35734d --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_syswm.h @@ -0,0 +1,386 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_syswm.h + * + * Include file for SDL custom system window manager hooks. + */ + +#ifndef SDL_syswm_h_ +#define SDL_syswm_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_version.h" + +/** + * \brief SDL_syswm.h + * + * Your application has access to a special type of event ::SDL_SYSWMEVENT, + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState(). + */ +struct SDL_SysWMinfo; + +#if !defined(SDL_PROTOTYPES_ONLY) + +#if defined(SDL_VIDEO_DRIVER_WINDOWS) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX /* don't define min() and max(). */ +#define NOMINMAX +#endif +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_WINRT) +#include +#endif + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +#endif /* defined(SDL_VIDEO_DRIVER_X11) */ + +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_COCOA) +#ifdef __OBJC__ +@class NSWindow; +#else +typedef struct _NSWindow NSWindow; +#endif +#endif + +#if defined(SDL_VIDEO_DRIVER_UIKIT) +#ifdef __OBJC__ +#include +#else +typedef struct _UIWindow UIWindow; +typedef struct _UIViewController UIViewController; +#endif +typedef Uint32 GLuint; +#endif + +#if defined(SDL_VIDEO_VULKAN) || defined(SDL_VIDEO_METAL) +#define SDL_METALVIEW_TAG 255 +#endif + +#if defined(SDL_VIDEO_DRIVER_ANDROID) +typedef struct ANativeWindow ANativeWindow; +typedef void *EGLSurface; +#endif + +#if defined(SDL_VIDEO_DRIVER_VIVANTE) +#include "SDL_egl.h" +#endif + +#if defined(SDL_VIDEO_DRIVER_OS2) +#define INCL_WIN +#include +#endif +#endif /* SDL_PROTOTYPES_ONLY */ + +#if defined(SDL_VIDEO_DRIVER_KMSDRM) +struct gbm_device; +#endif + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(SDL_PROTOTYPES_ONLY) +/** + * These are the various supported windowing subsystems + */ +typedef enum +{ + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, + SDL_SYSWM_X11, + SDL_SYSWM_DIRECTFB, + SDL_SYSWM_COCOA, + SDL_SYSWM_UIKIT, + SDL_SYSWM_WAYLAND, + SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ + SDL_SYSWM_WINRT, + SDL_SYSWM_ANDROID, + SDL_SYSWM_VIVANTE, + SDL_SYSWM_OS2, + SDL_SYSWM_HAIKU, + SDL_SYSWM_KMSDRM, + SDL_SYSWM_RISCOS +} SDL_SYSWM_TYPE; + +/** + * The custom event structure. + */ +struct SDL_SysWMmsg +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct { + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct { + XEvent event; + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct { + DFBEvent event; + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + /* Latest version of Xcode clang complains about empty structs in C v. C++: + error: empty struct has size 0 in C, size 1 in C++ + */ + int dummy; + /* No Cocoa window events yet */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + int dummy; + /* No UIKit window events yet */ + } uikit; +#endif +#if defined(SDL_VIDEO_DRIVER_VIVANTE) + struct + { + int dummy; + /* No Vivante window events yet */ + } vivante; +#endif +#if defined(SDL_VIDEO_DRIVER_OS2) + struct + { + BOOL fFrame; /**< TRUE if hwnd is a frame window */ + HWND hwnd; /**< The window receiving the message */ + ULONG msg; /**< The message identifier */ + MPARAM mp1; /**< The first first message parameter */ + MPARAM mp2; /**< The second first message parameter */ + } os2; +#endif + /* Can't have an empty union */ + int dummy; + } msg; +}; + +/** + * The custom window manager information structure. + * + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +struct SDL_SysWMinfo +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct + { + HWND window; /**< The window handle */ + HDC hdc; /**< The window device context */ + HINSTANCE hinstance; /**< The instance handle */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_WINRT) + struct + { + IInspectable * window; /**< The WinRT CoreWindow */ + } winrt; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct + { + Display *display; /**< The X11 display */ + Window window; /**< The X11 window */ + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct + { + IDirectFB *dfb; /**< The directfb main interface */ + IDirectFBWindow *window; /**< The directfb window handle */ + IDirectFBSurface *surface; /**< The directfb client surface */ + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { +#if defined(__OBJC__) && defined(__has_feature) + #if __has_feature(objc_arc) + NSWindow __unsafe_unretained *window; /**< The Cocoa window */ + #else + NSWindow *window; /**< The Cocoa window */ + #endif +#else + NSWindow *window; /**< The Cocoa window */ +#endif + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { +#if defined(__OBJC__) && defined(__has_feature) + #if __has_feature(objc_arc) + UIWindow __unsafe_unretained *window; /**< The UIKit window */ + #else + UIWindow *window; /**< The UIKit window */ + #endif +#else + UIWindow *window; /**< The UIKit window */ +#endif + GLuint framebuffer; /**< The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. */ + GLuint colorbuffer; /**< The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. */ + GLuint resolveFramebuffer; /**< The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. */ + } uikit; +#endif +#if defined(SDL_VIDEO_DRIVER_WAYLAND) + struct + { + struct wl_display *display; /**< Wayland display */ + struct wl_surface *surface; /**< Wayland surface */ + void *shell_surface; /**< DEPRECATED Wayland shell_surface (window manager handle) */ + struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */ + struct xdg_surface *xdg_surface; /**< Wayland xdg surface (window manager handle) */ + struct xdg_toplevel *xdg_toplevel; /**< Wayland xdg toplevel role */ + struct xdg_popup *xdg_popup; /**< Wayland xdg popup role */ + struct xdg_positioner *xdg_positioner; /**< Wayland xdg positioner, for popup */ + } wl; +#endif +#if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ + struct + { + void *connection; /**< Mir display server connection */ + void *surface; /**< Mir surface */ + } mir; +#endif + +#if defined(SDL_VIDEO_DRIVER_ANDROID) + struct + { + ANativeWindow *window; + EGLSurface surface; + } android; +#endif + +#if defined(SDL_VIDEO_DRIVER_OS2) + struct + { + HWND hwnd; /**< The window handle */ + HWND hwndFrame; /**< The frame window handle */ + } os2; +#endif + +#if defined(SDL_VIDEO_DRIVER_VIVANTE) + struct + { + EGLNativeDisplayType display; + EGLNativeWindowType window; + } vivante; +#endif + +#if defined(SDL_VIDEO_DRIVER_KMSDRM) + struct + { + int dev_index; /**< Device index (ex: the X in /dev/dri/cardX) */ + int drm_fd; /**< DRM FD (unavailable on Vulkan windows) */ + struct gbm_device *gbm_dev; /**< GBM device (unavailable on Vulkan windows) */ + } kmsdrm; +#endif + + /* Make sure this union is always 64 bytes (8 64-bit pointers). */ + /* Be careful not to overflow this if you add a new target! */ + Uint8 dummy[64]; + } info; +}; + +#endif /* SDL_PROTOTYPES_ONLY */ + +typedef struct SDL_SysWMinfo SDL_SysWMinfo; + + +/** + * Get driver-specific information about a window. + * + * You must include SDL_syswm.h for the declaration of SDL_SysWMinfo. + * + * The caller must initialize the `info` structure's version by using + * `SDL_VERSION(&info.version)`, and then this function will fill in the rest + * of the structure with information about the given window. + * + * \param window the window about which information is being requested + * \param info an SDL_SysWMinfo structure filled in with window information + * \returns SDL_TRUE if the function is implemented and the `version` member + * of the `info` struct is valid, or SDL_FALSE if the information + * could not be retrieved; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, + SDL_SysWMinfo * info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_syswm_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test.h b/Thirdparty/SDL2/include/SDL_test.h new file mode 100644 index 0000000..80daaaf --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_h_ +#define SDL_test_h_ + +#include "SDL.h" +#include "SDL_test_assert.h" +#include "SDL_test_common.h" +#include "SDL_test_compare.h" +#include "SDL_test_crc32.h" +#include "SDL_test_font.h" +#include "SDL_test_fuzzer.h" +#include "SDL_test_harness.h" +#include "SDL_test_images.h" +#include "SDL_test_log.h" +#include "SDL_test_md5.h" +#include "SDL_test_memory.h" +#include "SDL_test_random.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Global definitions */ + +/* + * Note: Maximum size of SDLTest log message is less than SDL's limit + * to ensure we can fit additional information such as the timestamp. + */ +#define SDLTEST_MAX_LOGMESSAGE_LENGTH 3584 + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_assert.h b/Thirdparty/SDL2/include/SDL_test_assert.h new file mode 100644 index 0000000..341e490 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_assert.h @@ -0,0 +1,105 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_assert.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Assert API for test code and test cases + * + */ + +#ifndef SDL_test_assert_h_ +#define SDL_test_assert_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Fails the assert. + */ +#define ASSERT_FAIL 0 + +/** + * \brief Passes the assert. + */ +#define ASSERT_PASS 1 + +/** + * \brief Assert that logs and break execution flow on failures. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_Assert(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + * + * \returns the assertCondition so it can be used to externally to break execution flow if desired. + */ +int SDLTest_AssertCheck(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Explicitly pass without checking an assertion condition. Updates assertion counter. + * + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_AssertPass(SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * \brief Resets the assert summary counters to zero. + */ +void SDLTest_ResetAssertSummary(void); + +/** + * \brief Logs summary of all assertions (total, pass, fail) since last reset as INFO or ERROR. + */ +void SDLTest_LogAssertSummary(void); + + +/** + * \brief Converts the current assert summary state to a test result. + * + * \returns TEST_RESULT_PASSED, TEST_RESULT_FAILED, or TEST_RESULT_NO_ASSERT + */ +int SDLTest_AssertSummaryToTestResult(void); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_assert_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_common.h b/Thirdparty/SDL2/include/SDL_test_common.h new file mode 100644 index 0000000..6de63ca --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_common.h @@ -0,0 +1,236 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_common.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* Ported from original test\common.h file. */ + +#ifndef SDL_test_common_h_ +#define SDL_test_common_h_ + +#include "SDL.h" + +#if defined(__PSP__) +#define DEFAULT_WINDOW_WIDTH 480 +#define DEFAULT_WINDOW_HEIGHT 272 +#elif defined(__VITA__) +#define DEFAULT_WINDOW_WIDTH 960 +#define DEFAULT_WINDOW_HEIGHT 544 +#else +#define DEFAULT_WINDOW_WIDTH 640 +#define DEFAULT_WINDOW_HEIGHT 480 +#endif + +#define VERBOSE_VIDEO 0x00000001 +#define VERBOSE_MODES 0x00000002 +#define VERBOSE_RENDER 0x00000004 +#define VERBOSE_EVENT 0x00000008 +#define VERBOSE_AUDIO 0x00000010 +#define VERBOSE_MOTION 0x00000020 + +typedef struct +{ + /* SDL init flags */ + char **argv; + Uint32 flags; + Uint32 verbose; + + /* Video info */ + const char *videodriver; + int display; + const char *window_title; + const char *window_icon; + Uint32 window_flags; + SDL_bool flash_on_focus_loss; + int window_x; + int window_y; + int window_w; + int window_h; + int window_minW; + int window_minH; + int window_maxW; + int window_maxH; + int logical_w; + int logical_h; + float scale; + int depth; + int refresh_rate; + int num_windows; + SDL_Window **windows; + + /* Renderer info */ + const char *renderdriver; + Uint32 render_flags; + SDL_bool skip_renderer; + SDL_Renderer **renderers; + SDL_Texture **targets; + + /* Audio info */ + const char *audiodriver; + SDL_AudioSpec audiospec; + + /* GL settings */ + int gl_red_size; + int gl_green_size; + int gl_blue_size; + int gl_alpha_size; + int gl_buffer_size; + int gl_depth_size; + int gl_stencil_size; + int gl_double_buffer; + int gl_accum_red_size; + int gl_accum_green_size; + int gl_accum_blue_size; + int gl_accum_alpha_size; + int gl_stereo; + int gl_multisamplebuffers; + int gl_multisamplesamples; + int gl_retained_backing; + int gl_accelerated; + int gl_major_version; + int gl_minor_version; + int gl_debug; + int gl_profile_mask; + + /* Additional fields added in 2.0.18 */ + SDL_Rect confine; + +} SDLTest_CommonState; + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Parse command line parameters and create common state. + * + * \param argv Array of command line parameters + * \param flags Flags indicating which subsystem to initialize (i.e. SDL_INIT_VIDEO | SDL_INIT_AUDIO) + * + * \returns a newly allocated common state object. + */ +SDLTest_CommonState *SDLTest_CommonCreateState(char **argv, Uint32 flags); + +/** + * \brief Process one common argument. + * + * \param state The common state describing the test window to create. + * \param index The index of the argument to process in argv[]. + * + * \returns the number of arguments processed (i.e. 1 for --fullscreen, 2 for --video [videodriver], or -1 on error. + */ +int SDLTest_CommonArg(SDLTest_CommonState * state, int index); + + +/** + * \brief Logs command line usage info. + * + * This logs the appropriate command line options for the subsystems in use + * plus other common options, and then any application-specific options. + * This uses the SDL_Log() function and splits up output to be friendly to + * 80-character-wide terminals. + * + * \param state The common state describing the test window for the app. + * \param argv0 argv[0], as passed to main/SDL_main. + * \param options an array of strings for application specific options. The last element of the array should be NULL. + */ +void SDLTest_CommonLogUsage(SDLTest_CommonState * state, const char *argv0, const char **options); + +/** + * \brief Returns common usage information + * + * You should (probably) be using SDLTest_CommonLogUsage() instead, but this + * function remains for binary compatibility. Strings returned from this + * function are valid until SDLTest_CommonQuit() is called, in which case + * those strings' memory is freed and can no longer be used. + * + * \param state The common state describing the test window to create. + * \returns a string with usage information + */ +const char *SDLTest_CommonUsage(SDLTest_CommonState * state); + +/** + * \brief Open test window. + * + * \param state The common state describing the test window to create. + * + * \returns SDL_TRUE if initialization succeeded, false otherwise + */ +SDL_bool SDLTest_CommonInit(SDLTest_CommonState * state); + +/** + * \brief Easy argument handling when test app doesn't need any custom args. + * + * \param state The common state describing the test window to create. + * \param argc argc, as supplied to SDL_main + * \param argv argv, as supplied to SDL_main + * + * \returns SDL_FALSE if app should quit, true otherwise. + */ +SDL_bool SDLTest_CommonDefaultArgs(SDLTest_CommonState * state, const int argc, char **argv); + +/** + * \brief Common event handler for test windows. + * + * \param state The common state used to create test window. + * \param event The event to handle. + * \param done Flag indicating we are done. + * + */ +void SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done); + +/** + * \brief Close test window. + * + * \param state The common state used to create test window. + * + */ +void SDLTest_CommonQuit(SDLTest_CommonState * state); + +/** + * \brief Draws various window information (position, size, etc.) to the renderer. + * + * \param renderer The renderer to draw to. + * \param window The window whose information should be displayed. + * \param usedHeight Returns the height used, so the caller can draw more below. + * + */ +void SDLTest_CommonDrawWindowInfo(SDL_Renderer * renderer, SDL_Window * window, int * usedHeight); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_common_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_compare.h b/Thirdparty/SDL2/include/SDL_test_compare.h new file mode 100644 index 0000000..5fce25c --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_compare.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_compare.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines comparison functions (i.e. for surfaces). + +*/ + +#ifndef SDL_test_compare_h_ +#define SDL_test_compare_h_ + +#include "SDL.h" + +#include "SDL_test_images.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Compares a surface and with reference image data for equality + * + * \param surface Surface used in comparison + * \param referenceSurface Test Surface used in comparison + * \param allowable_error Allowable difference (=sum of squared difference for each RGB component) in blending accuracy. + * + * \returns 0 if comparison succeeded, >0 (=number of pixels for which the comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. + */ +int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_compare_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_crc32.h b/Thirdparty/SDL2/include/SDL_test_crc32.h new file mode 100644 index 0000000..bf34782 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_crc32.h @@ -0,0 +1,124 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_crc32.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Implements CRC32 calculations (default output is Perl String::CRC32 compatible). + +*/ + +#ifndef SDL_test_crc32_h_ +#define SDL_test_crc32_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ------------ Definitions --------- */ + +/* Definition shared by all CRC routines */ + +#ifndef CrcUint32 + #define CrcUint32 unsigned int +#endif +#ifndef CrcUint8 + #define CrcUint8 unsigned char +#endif + +#ifdef ORIGINAL_METHOD + #define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */ +#else + #define CRC32_POLY 0xEDB88320 /* Perl String::CRC32 compatible */ +#endif + +/** + * Data structure for CRC32 (checksum) computation + */ + typedef struct { + CrcUint32 crc32_table[256]; /* CRC table */ + } SDLTest_Crc32Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * \brief Initialize the CRC context + * + * Note: The function initializes the crc table required for all crc calculations. + * + * \param crcContext pointer to context variable + * + * \returns 0 for OK, -1 on error + * + */ + int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext); + + +/** + * \brief calculate a crc32 from a data block + * + * \param crcContext pointer to context variable + * \param inBuf input buffer to checksum + * \param inLen length of input buffer + * \param crc32 pointer to Uint32 to store the final CRC into + * + * \returns 0 for OK, -1 on error + * + */ +int SDLTest_Crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + +/* Same routine broken down into three steps */ +int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + + +/** + * \brief clean up CRC context + * + * \param crcContext pointer to context variable + * + * \returns 0 for OK, -1 on error + * +*/ + +int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_crc32_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_font.h b/Thirdparty/SDL2/include/SDL_test_font.h new file mode 100644 index 0000000..18a82ff --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_font.h @@ -0,0 +1,168 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_font.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_font_h_ +#define SDL_test_font_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +#define FONT_CHARACTER_SIZE 8 +#define FONT_LINE_HEIGHT (FONT_CHARACTER_SIZE + 2) + +/** + * \brief Draw a string in the currently set font. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the character. + * \param y The Y coordinate of the upper left corner of the character. + * \param c The character to draw. + * + * \returns 0 on success, -1 on failure. + */ +int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, Uint32 c); + +/** + * \brief Draw a UTF-8 string in the currently set font. + * + * The font currently only supports characters in the Basic Latin and Latin-1 Supplement sets. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the string. + * \param y The Y coordinate of the upper left corner of the string. + * \param s The string to draw. + * + * \returns 0 on success, -1 on failure. + */ +int SDLTest_DrawString(SDL_Renderer *renderer, int x, int y, const char *s); + +/** + * \brief Data used for multi-line text output + */ +typedef struct SDLTest_TextWindow +{ + SDL_Rect rect; + int current; + int numlines; + char **lines; +} SDLTest_TextWindow; + +/** + * \brief Create a multi-line text output window + * + * \param x The X coordinate of the upper left corner of the window. + * \param y The Y coordinate of the upper left corner of the window. + * \param w The width of the window (currently ignored) + * \param h The height of the window (currently ignored) + * + * \returns the new window, or NULL on failure. + * + * \since This function is available since SDL 2.24.0 + */ +SDLTest_TextWindow *SDLTest_TextWindowCreate(int x, int y, int w, int h); + +/** + * \brief Display a multi-line text output window + * + * This function should be called every frame to display the text + * + * \param textwin The text output window + * \param renderer The renderer to use for display + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowDisplay(SDLTest_TextWindow *textwin, SDL_Renderer *renderer); + +/** + * \brief Add text to a multi-line text output window + * + * Adds UTF-8 text to the end of the current text. The newline character starts a + * new line of text. The backspace character deletes the last character or, if the + * line is empty, deletes the line and goes to the end of the previous line. + * + * \param textwin The text output window + * \param fmt A printf() style format string + * \param ... additional parameters matching % tokens in the `fmt` string, if any + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowAddText(SDLTest_TextWindow *textwin, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Add text to a multi-line text output window + * + * Adds UTF-8 text to the end of the current text. The newline character starts a + * new line of text. The backspace character deletes the last character or, if the + * line is empty, deletes the line and goes to the end of the previous line. + * + * \param textwin The text output window + * \param text The text to add to the window + * \param len The length, in bytes, of the text to add to the window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowAddTextWithLength(SDLTest_TextWindow *textwin, const char *text, size_t len); + +/** + * \brief Clear the text in a multi-line text output window + * + * \param textwin The text output window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowClear(SDLTest_TextWindow *textwin); + +/** + * \brief Free the storage associated with a multi-line text output window + * + * \param textwin The text output window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowDestroy(SDLTest_TextWindow *textwin); + +/** + * \brief Cleanup textures used by font drawing functions. + */ +void SDLTest_CleanupTextDrawing(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_font_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_fuzzer.h b/Thirdparty/SDL2/include/SDL_test_fuzzer.h new file mode 100644 index 0000000..cfe6a14 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_fuzzer.h @@ -0,0 +1,386 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_fuzzer.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Data generators for fuzzing test data in a reproducible way. + +*/ + +#ifndef SDL_test_fuzzer_h_ +#define SDL_test_fuzzer_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* + Based on GSOC code by Markus Kauppila +*/ + + +/** + * \file + * Note: The fuzzer implementation uses a static instance of random context + * internally which makes it thread-UNsafe. + */ + +/** + * Initializes the fuzzer for a test + * + * \param execKey Execution "Key" that initializes the random number generator uniquely for the test. + * + */ +void SDLTest_FuzzerInit(Uint64 execKey); + + +/** + * Returns a random Uint8 + * + * \returns a generated integer + */ +Uint8 SDLTest_RandomUint8(void); + +/** + * Returns a random Sint8 + * + * \returns a generated signed integer + */ +Sint8 SDLTest_RandomSint8(void); + + +/** + * Returns a random Uint16 + * + * \returns a generated integer + */ +Uint16 SDLTest_RandomUint16(void); + +/** + * Returns a random Sint16 + * + * \returns a generated signed integer + */ +Sint16 SDLTest_RandomSint16(void); + + +/** + * Returns a random integer + * + * \returns a generated integer + */ +Sint32 SDLTest_RandomSint32(void); + + +/** + * Returns a random positive integer + * + * \returns a generated integer + */ +Uint32 SDLTest_RandomUint32(void); + +/** + * Returns random Uint64. + * + * \returns a generated integer + */ +Uint64 SDLTest_RandomUint64(void); + + +/** + * Returns random Sint64. + * + * \returns a generated signed integer + */ +Sint64 SDLTest_RandomSint64(void); + +/** + * \returns a random float in range [0.0 - 1.0] + */ +float SDLTest_RandomUnitFloat(void); + +/** + * \returns a random double in range [0.0 - 1.0] + */ +double SDLTest_RandomUnitDouble(void); + +/** + * \returns a random float. + * + */ +float SDLTest_RandomFloat(void); + +/** + * \returns a random double. + * + */ +double SDLTest_RandomDouble(void); + +/** + * Returns a random boundary value for Uint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100 + * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT8_MIN with error set + */ +Sint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain); + + +/** + * Returns a random boundary value for Sint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100 + * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT16_MIN with error set + */ +Sint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100 + * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT32_MIN with error set + */ +Sint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100 + * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT64_MIN with error set + */ +Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain); + + +/** + * Returns integer in range [min, max] (inclusive). + * Min and max values can be negative values. + * If Max in smaller than min, then the values are swapped. + * Min and max are the same value, that value will be returned. + * + * \param min Minimum inclusive value of returned random number + * \param max Maximum inclusive value of returned random number + * + * \returns a generated random integer in range + */ +Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max); + + +/** + * Generates random null-terminated string. The minimum length for + * the string is 1 character, maximum length for the string is 255 + * characters and it can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \returns a newly allocated random string; or NULL if length was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiString(void); + + +/** + * Generates random null-terminated string. The maximum length for + * the string is defined by the maxLength parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param maxLength The maximum length of the generated string. + * + * \returns a newly allocated random string; or NULL if maxLength was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength); + + +/** + * Generates random null-terminated string. The length for + * the string is defined by the size parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param size The length of the generated string + * + * \returns a newly allocated random string; or NULL if size was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringOfSize(int size); + +/** + * Get the invocation count for the fuzzer since last ...FuzzerInit. + * + * \returns the invocation count. + */ +int SDLTest_GetFuzzerInvocationCount(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_fuzzer_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_harness.h b/Thirdparty/SDL2/include/SDL_test_harness.h new file mode 100644 index 0000000..26231dc --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_harness.h @@ -0,0 +1,134 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_harness.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + Defines types for test case definitions and the test execution harness API. + + Based on original GSOC code by Markus Kauppila +*/ + +#ifndef SDL_test_h_arness_h +#define SDL_test_h_arness_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ! Definitions for test case structures */ +#define TEST_ENABLED 1 +#define TEST_DISABLED 0 + +/* ! Definition of all the possible test return values of the test case method */ +#define TEST_ABORTED -1 +#define TEST_STARTED 0 +#define TEST_COMPLETED 1 +#define TEST_SKIPPED 2 + +/* ! Definition of all the possible test results for the harness */ +#define TEST_RESULT_PASSED 0 +#define TEST_RESULT_FAILED 1 +#define TEST_RESULT_NO_ASSERT 2 +#define TEST_RESULT_SKIPPED 3 +#define TEST_RESULT_SETUP_FAILURE 4 + +/* !< Function pointer to a test case setup function (run before every test) */ +typedef void (*SDLTest_TestCaseSetUpFp)(void *arg); + +/* !< Function pointer to a test case function */ +typedef int (*SDLTest_TestCaseFp)(void *arg); + +/* !< Function pointer to a test case teardown function (run after every test) */ +typedef void (*SDLTest_TestCaseTearDownFp)(void *arg); + +/** + * Holds information about a single test case. + */ +typedef struct SDLTest_TestCaseReference { + /* !< Func2Stress */ + SDLTest_TestCaseFp testCase; + /* !< Short name (or function name) "Func2Stress" */ + const char *name; + /* !< Long name or full description "This test pushes func2() to the limit." */ + const char *description; + /* !< Set to TEST_ENABLED or TEST_DISABLED (test won't be run) */ + int enabled; +} SDLTest_TestCaseReference; + +/** + * Holds information about a test suite (multiple test cases). + */ +typedef struct SDLTest_TestSuiteReference { + /* !< "PlatformSuite" */ + const char *name; + /* !< The function that is run before each test. NULL skips. */ + SDLTest_TestCaseSetUpFp testSetUp; + /* !< The test cases that are run as part of the suite. Last item should be NULL. */ + const SDLTest_TestCaseReference **testCases; + /* !< The function that is run after each test. NULL skips. */ + SDLTest_TestCaseTearDownFp testTearDown; +} SDLTest_TestSuiteReference; + + +/** + * \brief Generates a random run seed string for the harness. The generated seed will contain alphanumeric characters (0-9A-Z). + * + * Note: The returned string needs to be deallocated by the caller. + * + * \param length The length of the seed string to generate + * + * \returns the generated seed string + */ +char *SDLTest_GenerateRunSeed(const int length); + +/** + * \brief Execute a test suite using the given run seed and execution key. + * + * \param testSuites Suites containing the test case. + * \param userRunSeed Custom run seed provided by user, or NULL to autogenerate one. + * \param userExecKey Custom execution key provided by user, or 0 to autogenerate one. + * \param filter Filter specification. NULL disables. Case sensitive. + * \param testIterations Number of iterations to run each test case. + * + * \returns the test run result: 0 when all tests passed, 1 if any tests failed. + */ +int SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_h_arness_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_images.h b/Thirdparty/SDL2/include/SDL_test_images.h new file mode 100644 index 0000000..1211371 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_images.h @@ -0,0 +1,78 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_images.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines some images for tests. + +*/ + +#ifndef SDL_test_images_h_ +#define SDL_test_images_h_ + +#include "SDL.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + *Type for test images. + */ +typedef struct SDLTest_SurfaceImage_s { + int width; + int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + const char *pixel_data; +} SDLTest_SurfaceImage_t; + +/* Test images */ +SDL_Surface *SDLTest_ImageBlit(void); +SDL_Surface *SDLTest_ImageBlitColor(void); +SDL_Surface *SDLTest_ImageBlitAlpha(void); +SDL_Surface *SDLTest_ImageBlitBlendAdd(void); +SDL_Surface *SDLTest_ImageBlitBlend(void); +SDL_Surface *SDLTest_ImageBlitBlendMod(void); +SDL_Surface *SDLTest_ImageBlitBlendNone(void); +SDL_Surface *SDLTest_ImageBlitBlendAll(void); +SDL_Surface *SDLTest_ImageFace(void); +SDL_Surface *SDLTest_ImagePrimitives(void); +SDL_Surface *SDLTest_ImagePrimitivesBlend(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_images_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_log.h b/Thirdparty/SDL2/include/SDL_test_log.h new file mode 100644 index 0000000..a27ffc2 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_log.h @@ -0,0 +1,67 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_log.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Wrapper to log in the TEST category + * + */ + +#ifndef SDL_test_log_h_ +#define SDL_test_log_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Prints given message with a timestamp in the TEST category and INFO priority. + * + * \param fmt Message to be logged + */ +void SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * \brief Prints given message with a timestamp in the TEST category and the ERROR priority. + * + * \param fmt Message to be logged + */ +void SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_log_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_md5.h b/Thirdparty/SDL2/include/SDL_test_md5.h new file mode 100644 index 0000000..538c7ae --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_md5.h @@ -0,0 +1,129 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_md5.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + *********************************************************************** + ** Header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + *********************************************************************** +*/ + +/* + *********************************************************************** + ** Message-digest routines: ** + ** To form the message digest for a message M ** + ** (1) Initialize a context buffer mdContext using MD5Init ** + ** (2) Call MD5Update on mdContext and M ** + ** (3) Call MD5Final on mdContext ** + ** The message digest is now in mdContext->digest[0...15] ** + *********************************************************************** +*/ + +#ifndef SDL_test_md5_h_ +#define SDL_test_md5_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------ Definitions --------- */ + +/* typedef a 32-bit type */ + typedef unsigned long int MD5UINT4; + +/* Data structure for MD5 (Message-Digest) computation */ + typedef struct { + MD5UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ + MD5UINT4 buf[4]; /* scratch buffer */ + unsigned char in[64]; /* input buffer */ + unsigned char digest[16]; /* actual digest after Md5Final call */ + } SDLTest_Md5Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * \brief initialize the context + * + * \param mdContext pointer to context variable + * + * Note: The function initializes the message-digest context + * mdContext. Call before each new use of the context - + * all fields are set to zero. + */ + void SDLTest_Md5Init(SDLTest_Md5Context * mdContext); + + +/** + * \brief update digest from variable length data + * + * \param mdContext pointer to context variable + * \param inBuf pointer to data array/string + * \param inLen length of data array/string + * + * Note: The function updates the message-digest context to account + * for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. +*/ + + void SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf, + unsigned int inLen); + + +/** + * \brief complete digest computation + * + * \param mdContext pointer to context variable + * + * Note: The function terminates the message-digest computation and + * ends with the desired message digest in mdContext.digest[0..15]. + * Always call before using the digest[] variable. +*/ + + void SDLTest_Md5Final(SDLTest_Md5Context * mdContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_md5_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_memory.h b/Thirdparty/SDL2/include/SDL_test_memory.h new file mode 100644 index 0000000..f959177 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_memory.h @@ -0,0 +1,63 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_memory.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_memory_h_ +#define SDL_test_memory_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief Start tracking SDL memory allocations + * + * \note This should be called before any other SDL functions for complete tracking coverage + */ +int SDLTest_TrackAllocations(void); + +/** + * \brief Print a log of any outstanding allocations + * + * \note This can be called after SDL_Quit() + */ +void SDLTest_LogAllocations(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_memory_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_test_random.h b/Thirdparty/SDL2/include/SDL_test_random.h new file mode 100644 index 0000000..0035a80 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_test_random.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_test_random.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + A "32-bit Multiply with carry random number generator. Very fast. + Includes a list of recommended multipliers. + + multiply-with-carry generator: x(n) = a*x(n-1) + carry mod 2^32. + period: (a*2^31)-1 + +*/ + +#ifndef SDL_test_random_h_ +#define SDL_test_random_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Definitions */ + +/* + * Macros that return a random number in a specific format. + */ +#define SDLTest_RandomInt(c) ((int)SDLTest_Random(c)) + +/* + * Context structure for the random number generator state. + */ + typedef struct { + unsigned int a; + unsigned int x; + unsigned int c; + unsigned int ah; + unsigned int al; + } SDLTest_RandomContext; + + +/* --- Function prototypes */ + +/** + * \brief Initialize random number generator with two integers. + * + * Note: The random sequence of numbers returned by ...Random() is the + * same for the same two integers and has a period of 2^31. + * + * \param rndContext pointer to context structure + * \param xi integer that defines the random sequence + * \param ci integer that defines the random sequence + * + */ + void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, + unsigned int ci); + +/** + * \brief Initialize random number generator based on current system time. + * + * \param rndContext pointer to context structure + * + */ + void SDLTest_RandomInitTime(SDLTest_RandomContext *rndContext); + + +/** + * \brief Initialize random number generator based on current system time. + * + * Note: ...RandomInit() or ...RandomInitTime() must have been called + * before using this function. + * + * \param rndContext pointer to context structure + * + * \returns a random number (32bit unsigned integer) + * + */ + unsigned int SDLTest_Random(SDLTest_RandomContext *rndContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_random_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_thread.h b/Thirdparty/SDL2/include/SDL_thread.h new file mode 100644 index 0000000..b829bba --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_thread.h @@ -0,0 +1,464 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_thread_h_ +#define SDL_thread_h_ + +/** + * \file SDL_thread.h + * + * Header for the SDL thread management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_atomic.h" +#include "SDL_mutex.h" + +#if (defined(__WIN32__) || defined(__GDK__)) && !defined(__WINRT__) +#include /* _beginthreadex() and _endthreadex() */ +#endif +#if defined(__OS2__) /* for _beginthread() and _endthread() */ +#ifndef __EMX__ +#include +#else +#include +#endif +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/* The SDL thread ID */ +typedef unsigned long SDL_threadID; + +/* Thread local storage ID, 0 is the invalid ID */ +typedef unsigned int SDL_TLSID; + +/** + * The SDL thread priority. + * + * SDL will make system changes as necessary in order to apply the thread priority. + * Code which attempts to control thread state related to priority should be aware + * that calling SDL_SetThreadPriority may alter such state. + * SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of this behavior. + * + * \note On many systems you require special privileges to set high or time critical priority. + */ +typedef enum { + SDL_THREAD_PRIORITY_LOW, + SDL_THREAD_PRIORITY_NORMAL, + SDL_THREAD_PRIORITY_HIGH, + SDL_THREAD_PRIORITY_TIME_CRITICAL +} SDL_ThreadPriority; + +/** + * The function passed to SDL_CreateThread(). + * + * \param data what was passed as `data` to SDL_CreateThread() + * \returns a value that can be reported through SDL_WaitThread(). + */ +typedef int (SDLCALL * SDL_ThreadFunction) (void *data); + + +#if (defined(__WIN32__) || defined(__GDK__)) && !defined(__WINRT__) +/** + * \file SDL_thread.h + * + * We compile SDL into a DLL. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL2.DLL will + * be initialized for those threads, and not the RTL of the calling + * application! + * + * To solve this, we make a little hack here. + * + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL2.DLL which uses this API, + * then the RTL of SDL2.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime + * library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD + +typedef uintptr_t (__cdecl * pfnSDL_CurrentBeginThread) + (void *, unsigned, unsigned (__stdcall *func)(void *), + void * /*arg*/, unsigned, unsigned * /* threadID */); +typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); + +#ifndef SDL_beginthread +#define SDL_beginthread _beginthreadex +#endif +#ifndef SDL_endthread +#define SDL_endthread _endthreadex +#endif + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, + const char *name, const size_t stacksize, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + + +#if defined(SDL_CreateThread) && SDL_DYNAMIC_API +#undef SDL_CreateThread +#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#undef SDL_CreateThreadWithStackSize +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#else +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#endif + +#elif defined(__OS2__) +/* + * just like the windows case above: We compile SDL2 + * into a dll with Watcom's runtime statically linked. + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD + +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void * /*arg*/); +typedef void (*pfnSDL_CurrentEndThread)(void); + +#ifndef SDL_beginthread +#define SDL_beginthread _beginthread +#endif +#ifndef SDL_endthread +#define SDL_endthread _endthread +#endif + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +#if defined(SDL_CreateThread) && SDL_DYNAMIC_API +#undef SDL_CreateThread +#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#undef SDL_CreateThreadWithStackSize +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#else +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#endif + +#else + +/** + * Create a new thread with a default stack size. + * + * This is equivalent to calling: + * + * ```c + * SDL_CreateThreadWithStackSize(fn, name, 0, data); + * ``` + * + * \param fn the SDL_ThreadFunction function to call in the new thread + * \param name the name of the thread + * \param data a pointer that is passed to `fn` + * \returns an opaque pointer to the new thread object on success, NULL if the + * new thread could not be created; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThreadWithStackSize + * \sa SDL_WaitThread + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); + +/** + * Create a new thread with a specific stack size. + * + * SDL makes an attempt to report `name` to the system, so that debuggers can + * display it. Not all platforms support this. + * + * Thread naming is a little complicated: Most systems have very small limits + * for the string length (Haiku has 32 bytes, Linux currently has 16, Visual + * C++ 6.0 has _nine_!), and possibly other arbitrary rules. You'll have to + * see what happens with your system's debugger. The name should be UTF-8 (but + * using the naming limits of C identifiers is a better bet). There are no + * requirements for thread naming conventions, so long as the string is + * null-terminated UTF-8, but these guidelines are helpful in choosing a name: + * + * https://stackoverflow.com/questions/149932/naming-conventions-for-threads + * + * If a system imposes requirements, SDL will try to munge the string for it + * (truncate, etc), but the original string contents will be available from + * SDL_GetThreadName(). + * + * The size (in bytes) of the new stack can be specified. Zero means "use the + * system default" which might be wildly different between platforms. x86 + * Linux generally defaults to eight megabytes, an embedded device might be a + * few kilobytes instead. You generally need to specify a stack that is a + * multiple of the system's page size (in many cases, this is 4 kilobytes, but + * check your system documentation). + * + * In SDL 2.1, stack size will be folded into the original SDL_CreateThread + * function, but for backwards compatibility, this is currently a separate + * function. + * + * \param fn the SDL_ThreadFunction function to call in the new thread + * \param name the name of the thread + * \param stacksize the size, in bytes, to allocate for the new thread stack. + * \param data a pointer that is passed to `fn` + * \returns an opaque pointer to the new thread object on success, NULL if the + * new thread could not be created; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_WaitThread + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data); + +#endif + +/** + * Get the thread name as it was specified in SDL_CreateThread(). + * + * This is internal memory, not to be freed by the caller, and remains valid + * until the specified thread is cleaned up by SDL_WaitThread(). + * + * \param thread the thread to query + * \returns a pointer to a UTF-8 string that names the specified thread, or + * NULL if it doesn't have a name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThread + */ +extern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread); + +/** + * Get the thread identifier for the current thread. + * + * This thread identifier is as reported by the underlying operating system. + * If SDL is running on a platform that does not support threads the return + * value will always be zero. + * + * This function also returns a valid thread ID when called from the main + * thread. + * + * \returns the ID of the current thread. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetThreadID + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); + +/** + * Get the thread identifier for the specified thread. + * + * This thread identifier is as reported by the underlying operating system. + * If SDL is running on a platform that does not support threads the return + * value will always be zero. + * + * \param thread the thread to query + * \returns the ID of the specified thread, or the ID of the current thread if + * `thread` is NULL. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ThreadID + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); + +/** + * Set the priority for the current thread. + * + * Note that some platforms will not let you alter the priority (or at least, + * promote the thread to a higher priority) at all, and some require you to be + * an administrator account. Be prepared for this to fail. + * + * \param priority the SDL_ThreadPriority to set + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); + +/** + * Wait for a thread to finish. + * + * Threads that haven't been detached will remain (as a "zombie") until this + * function cleans them up. Not doing so is a resource leak. + * + * Once a thread has been cleaned up through this function, the SDL_Thread + * that references it becomes invalid and should not be referenced again. As + * such, only one thread may call SDL_WaitThread() on another. + * + * The return code for the thread function is placed in the area pointed to by + * `status`, if `status` is not NULL. + * + * You may not wait on a thread that has been used in a call to + * SDL_DetachThread(). Use either that function or this one, but not both, or + * behavior is undefined. + * + * It is safe to pass a NULL thread to this function; it is a no-op. + * + * Note that the thread pointer is freed by this function and is not valid + * afterward. + * + * \param thread the SDL_Thread pointer that was returned from the + * SDL_CreateThread() call that started this thread + * \param status pointer to an integer that will receive the value returned + * from the thread function by its 'return', or NULL to not + * receive such value back. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThread + * \sa SDL_DetachThread + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); + +/** + * Let a thread clean up on exit without intervention. + * + * A thread may be "detached" to signify that it should not remain until + * another thread has called SDL_WaitThread() on it. Detaching a thread is + * useful for long-running threads that nothing needs to synchronize with or + * further manage. When a detached thread is done, it simply goes away. + * + * There is no way to recover the return code of a detached thread. If you + * need this, don't detach the thread and instead use SDL_WaitThread(). + * + * Once a thread is detached, you should usually assume the SDL_Thread isn't + * safe to reference again, as it will become invalid immediately upon the + * detached thread's exit, instead of remaining until someone has called + * SDL_WaitThread() to finally clean it up. As such, don't detach the same + * thread more than once. + * + * If a thread has already exited when passed to SDL_DetachThread(), it will + * stop waiting for a call to SDL_WaitThread() and clean up immediately. It is + * not safe to detach a thread that might be used with SDL_WaitThread(). + * + * You may not call SDL_WaitThread() on a thread that has been detached. Use + * either that function or this one, but not both, or behavior is undefined. + * + * It is safe to pass NULL to this function; it is a no-op. + * + * \param thread the SDL_Thread pointer that was returned from the + * SDL_CreateThread() call that started this thread + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_CreateThread + * \sa SDL_WaitThread + */ +extern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread); + +/** + * Create a piece of thread-local storage. + * + * This creates an identifier that is globally visible to all threads but + * refers to data that is thread-specific. + * + * \returns the newly created thread local storage identifier or 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSGet + * \sa SDL_TLSSet + */ +extern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void); + +/** + * Get the current thread's value associated with a thread local storage ID. + * + * \param id the thread local storage ID + * \returns the value associated with the ID for the current thread or NULL if + * no value has been set; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSCreate + * \sa SDL_TLSSet + */ +extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); + +/** + * Set the current thread's value associated with a thread local storage ID. + * + * The function prototype for `destructor` is: + * + * ```c + * void destructor(void *value) + * ``` + * + * where its parameter `value` is what was passed as `value` to SDL_TLSSet(). + * + * \param id the thread local storage ID + * \param value the value to associate with the ID for the current thread + * \param destructor a function called when the thread exits, to free the + * value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSCreate + * \sa SDL_TLSGet + */ +extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (SDLCALL *destructor)(void*)); + +/** + * Cleanup all TLS data for this thread. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC void SDLCALL SDL_TLSCleanup(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_thread_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_timer.h b/Thirdparty/SDL2/include/SDL_timer.h new file mode 100644 index 0000000..98f9ad1 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_timer.h @@ -0,0 +1,222 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_timer_h_ +#define SDL_timer_h_ + +/** + * \file SDL_timer.h + * + * Header for the SDL time management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the number of milliseconds since SDL library initialization. + * + * This value wraps if the program runs for more than ~49 days. + * + * This function is not recommended as of SDL 2.0.18; use SDL_GetTicks64() + * instead, where the value doesn't wrap every ~49 days. There are places in + * SDL where we provide a 32-bit timestamp that can not change without + * breaking binary compatibility, though, so this function isn't officially + * deprecated. + * + * \returns an unsigned 32-bit value representing the number of milliseconds + * since the SDL library initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TICKS_PASSED + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** + * Get the number of milliseconds since SDL library initialization. + * + * Note that you should not use the SDL_TICKS_PASSED macro with values + * returned by this function, as that macro does clever math to compensate for + * the 32-bit overflow every ~49 days that SDL_GetTicks() suffers from. 64-bit + * values from this function can be safely compared directly. + * + * For example, if you want to wait 100 ms, you could do this: + * + * ```c + * const Uint64 timeout = SDL_GetTicks64() + 100; + * while (SDL_GetTicks64() < timeout) { + * // ... do work until timeout has elapsed + * } + * ``` + * + * \returns an unsigned 64-bit value representing the number of milliseconds + * since the SDL library initialized. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetTicks64(void); + +/** + * Compare 32-bit SDL ticks values, and return true if `A` has passed `B`. + * + * This should be used with results from SDL_GetTicks(), as this macro + * attempts to deal with the 32-bit counter wrapping back to zero every ~49 + * days, but should _not_ be used with SDL_GetTicks64(), which does not have + * that problem. + * + * For example, with SDL_GetTicks(), if you want to wait 100 ms, you could + * do this: + * + * ```c + * const Uint32 timeout = SDL_GetTicks() + 100; + * while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + * // ... do work until timeout has elapsed + * } + * ``` + * + * Note that this does not handle tick differences greater + * than 2^31 so take care when using the above kind of code + * with large timeout delays (tens of days). + */ +#define SDL_TICKS_PASSED(A, B) ((Sint32)((B) - (A)) <= 0) + +/** + * Get the current value of the high resolution counter. + * + * This function is typically used for profiling. + * + * The counter values are only meaningful relative to each other. Differences + * between values can be converted to times by using + * SDL_GetPerformanceFrequency(). + * + * \returns the current counter value. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetPerformanceFrequency + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); + +/** + * Get the count per second of the high resolution counter. + * + * \returns a platform-specific count per second. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetPerformanceCounter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); + +/** + * Wait a specified number of milliseconds before returning. + * + * This function waits a specified number of milliseconds before returning. It + * waits at least the specified time, but possibly longer due to OS + * scheduling. + * + * \param ms the number of milliseconds to delay + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** + * Function prototype for the timer callback function. + * + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param); + +/** + * Definition of the timer ID type. + */ +typedef int SDL_TimerID; + +/** + * Call a callback function at a future time. + * + * If you use this function, you must pass `SDL_INIT_TIMER` to SDL_Init(). + * + * The callback function is passed the current timer interval and the user + * supplied parameter from the SDL_AddTimer() call and should return the next + * timer interval. If the value returned from the callback is 0, the timer is + * canceled. + * + * The callback is run on a separate thread. + * + * Timers take into account the amount of time it took to execute the + * callback. For example, if the callback took 250 ms to execute and returned + * 1000 (ms), the timer would only wait another 750 ms before its next + * iteration. + * + * Timing may be inexact due to OS scheduling. Be sure to note the current + * time with SDL_GetTicks() or SDL_GetPerformanceCounter() in case your + * callback needs to adjust for variances. + * + * \param interval the timer delay, in milliseconds, passed to `callback` + * \param callback the SDL_TimerCallback function to call when the specified + * `interval` elapses + * \param param a pointer that is passed to `callback` + * \returns a timer ID or 0 if an error occurs; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RemoveTimer + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, + SDL_TimerCallback callback, + void *param); + +/** + * Remove a timer created with SDL_AddTimer(). + * + * \param id the ID of the timer to remove + * \returns SDL_TRUE if the timer is removed or SDL_FALSE if the timer wasn't + * found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddTimer + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_timer_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_touch.h b/Thirdparty/SDL2/include/SDL_touch.h new file mode 100644 index 0000000..c12d4a1 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_touch.h @@ -0,0 +1,150 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_touch.h + * + * Include file for SDL touch event handling. + */ + +#ifndef SDL_touch_h_ +#define SDL_touch_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_TouchID; +typedef Sint64 SDL_FingerID; + +typedef enum +{ + SDL_TOUCH_DEVICE_INVALID = -1, + SDL_TOUCH_DEVICE_DIRECT, /* touch screen with window-relative coordinates */ + SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE, /* trackpad with absolute device coordinates */ + SDL_TOUCH_DEVICE_INDIRECT_RELATIVE /* trackpad with screen cursor-relative coordinates */ +} SDL_TouchDeviceType; + +typedef struct SDL_Finger +{ + SDL_FingerID id; + float x; + float y; + float pressure; +} SDL_Finger; + +/* Used as the device ID for mouse events simulated with touch input */ +#define SDL_TOUCH_MOUSEID ((Uint32)-1) + +/* Used as the SDL_TouchID for touch events simulated with mouse input */ +#define SDL_MOUSE_TOUCHID ((Sint64)-1) + + +/** + * Get the number of registered touch devices. + * + * On some platforms SDL first sees the touch device if it was actually used. + * Therefore SDL_GetNumTouchDevices() may return 0 although devices are + * available. After using all devices at least once the number will be + * correct. + * + * This was fixed for Android in SDL 2.0.1. + * + * \returns the number of registered touch devices. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchDevice + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchDevices(void); + +/** + * Get the touch ID with the given index. + * + * \param index the touch device index + * \returns the touch ID with the given index on success or 0 if the index is + * invalid; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumTouchDevices + */ +extern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index); + +/** + * Get the touch device name as reported from the driver or NULL if the index + * is invalid. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC const char* SDLCALL SDL_GetTouchName(int index); + +/** + * Get the type of the given touch device. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID); + +/** + * Get the number of active fingers for a given touch device. + * + * \param touchID the ID of a touch device + * \returns the number of active fingers for a given touch device on success + * or 0 on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchFinger + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchFingers(SDL_TouchID touchID); + +/** + * Get the finger object for specified touch device ID and finger index. + * + * The returned resource is owned by SDL and should not be deallocated. + * + * \param touchID the ID of the requested touch device + * \param index the index of the requested finger + * \returns a pointer to the SDL_Finger object or NULL if no object at the + * given ID and index could be found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RecordGesture + */ +extern DECLSPEC SDL_Finger * SDLCALL SDL_GetTouchFinger(SDL_TouchID touchID, int index); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_touch_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_types.h b/Thirdparty/SDL2/include/SDL_types.h new file mode 100644 index 0000000..b5d7192 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_types.h @@ -0,0 +1,29 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_types.h + * + * \deprecated + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/Thirdparty/SDL2/include/SDL_version.h b/Thirdparty/SDL2/include/SDL_version.h new file mode 100644 index 0000000..dc03f02 --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_version.h @@ -0,0 +1,204 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_version.h + * + * This header defines the current SDL version. + */ + +#ifndef SDL_version_h_ +#define SDL_version_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Information about the version of SDL in use. + * + * Represents the library's version as three levels: major revision + * (increments with massive changes, additions, and enhancements), + * minor revision (increments with backwards-compatible changes to the + * major revision), and patchlevel (increments with fixes to the minor + * revision). + * + * \sa SDL_VERSION + * \sa SDL_GetVersion + */ +typedef struct SDL_version +{ + Uint8 major; /**< major version */ + Uint8 minor; /**< minor version */ + Uint8 patch; /**< update version */ +} SDL_version; + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_MAJOR_VERSION 2 +#define SDL_MINOR_VERSION 28 +#define SDL_PATCHLEVEL 2 + +/** + * Macro to determine SDL version program was compiled against. + * + * This macro fills in a SDL_version structure with the version of the + * library you compiled against. This is determined by what header the + * compiler uses. Note that if you dynamically linked the library, you might + * have a slightly newer or older version at runtime. That version can be + * determined with SDL_GetVersion(), which, unlike SDL_VERSION(), + * is not a macro. + * + * \param x A pointer to a SDL_version struct to initialize. + * + * \sa SDL_version + * \sa SDL_GetVersion + */ +#define SDL_VERSION(x) \ +{ \ + (x)->major = SDL_MAJOR_VERSION; \ + (x)->minor = SDL_MINOR_VERSION; \ + (x)->patch = SDL_PATCHLEVEL; \ +} + +/* TODO: Remove this whole block in SDL 3 */ +#if SDL_MAJOR_VERSION < 3 +/** + * This macro turns the version numbers into a numeric value: + * \verbatim + (1,2,3) -> (1203) + \endverbatim + * + * This assumes that there will never be more than 100 patchlevels. + * + * In versions higher than 2.9.0, the minor version overflows into + * the thousands digit: for example, 2.23.0 is encoded as 4300, + * and 2.255.99 would be encoded as 25799. + * This macro will not be available in SDL 3.x. + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** + * This is the version number macro for the current SDL version. + * + * In versions higher than 2.9.0, the minor version overflows into + * the thousands digit: for example, 2.23.0 is encoded as 4300. + * This macro will not be available in SDL 3.x. + * + * Deprecated, use SDL_VERSION_ATLEAST or SDL_VERSION instead. + */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) +#endif /* SDL_MAJOR_VERSION < 3 */ + +/** + * This macro will evaluate to true if compiled with SDL at least X.Y.Z. + */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + ((SDL_MAJOR_VERSION >= X) && \ + (SDL_MAJOR_VERSION > X || SDL_MINOR_VERSION >= Y) && \ + (SDL_MAJOR_VERSION > X || SDL_MINOR_VERSION > Y || SDL_PATCHLEVEL >= Z)) + +/** + * Get the version of SDL that is linked against your program. + * + * If you are linking to SDL dynamically, then it is possible that the current + * version will be different than the version you compiled against. This + * function returns the current version, while SDL_VERSION() is a macro that + * tells you what version you compiled with. + * + * This function may be called safely at any time, even before SDL_Init(). + * + * \param ver the SDL_version structure that contains the version information + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRevision + */ +extern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver); + +/** + * Get the code revision of SDL that is linked against your program. + * + * This value is the revision of the code you are linked with and may be + * different from the code you are compiling with, which is found in the + * constant SDL_REVISION. + * + * The revision is arbitrary string (a hash value) uniquely identifying the + * exact revision of the SDL library in use, and is only useful in comparing + * against other revisions. It is NOT an incrementing number. + * + * If SDL wasn't built from a git repository with the appropriate tools, this + * will return an empty string. + * + * Prior to SDL 2.0.16, before development moved to GitHub, this returned a + * hash for a Mercurial repository. + * + * You shouldn't use this function for anything but logging it for debugging + * purposes. The string is not intended to be reliable in any way. + * + * \returns an arbitrary string, uniquely identifying the exact revision of + * the SDL library in use. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetVersion + */ +extern DECLSPEC const char *SDLCALL SDL_GetRevision(void); + +/** + * Obsolete function, do not use. + * + * When SDL was hosted in a Mercurial repository, and was built carefully, + * this would return the revision number that the build was created from. This + * number was not reliable for several reasons, but more importantly, SDL is + * now hosted in a git repository, which does not offer numbers at all, only + * hashes. This function only ever returns zero now. Don't use it. + * + * Before SDL 2.0.16, this might have returned an unreliable, but non-zero + * number. + * + * \deprecated Use SDL_GetRevision() instead; if SDL was carefully built, it + * will return a git hash. + * + * \returns zero, always, in modern SDL releases. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRevision + */ +extern SDL_DEPRECATED DECLSPEC int SDLCALL SDL_GetRevisionNumber(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_version_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_video.h b/Thirdparty/SDL2/include/SDL_video.h new file mode 100644 index 0000000..c8b2d7a --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_video.h @@ -0,0 +1,2178 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_video.h + * + * Header file for SDL video functions. + */ + +#ifndef SDL_video_h_ +#define SDL_video_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a display mode + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + * \sa SDL_GetDesktopDisplayMode() + * \sa SDL_GetCurrentDisplayMode() + * \sa SDL_GetClosestDisplayMode() + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +typedef struct +{ + Uint32 format; /**< pixel format */ + int w; /**< width, in screen coordinates */ + int h; /**< height, in screen coordinates */ + int refresh_rate; /**< refresh rate (or zero for unspecified) */ + void *driverdata; /**< driver-specific data, initialize to 0 */ +} SDL_DisplayMode; + +/** + * \brief The type used to identify a window + * + * \sa SDL_CreateWindow() + * \sa SDL_CreateWindowFrom() + * \sa SDL_DestroyWindow() + * \sa SDL_FlashWindow() + * \sa SDL_GetWindowData() + * \sa SDL_GetWindowFlags() + * \sa SDL_GetWindowGrab() + * \sa SDL_GetWindowKeyboardGrab() + * \sa SDL_GetWindowMouseGrab() + * \sa SDL_GetWindowPosition() + * \sa SDL_GetWindowSize() + * \sa SDL_GetWindowTitle() + * \sa SDL_HideWindow() + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + * \sa SDL_RaiseWindow() + * \sa SDL_RestoreWindow() + * \sa SDL_SetWindowData() + * \sa SDL_SetWindowFullscreen() + * \sa SDL_SetWindowGrab() + * \sa SDL_SetWindowKeyboardGrab() + * \sa SDL_SetWindowMouseGrab() + * \sa SDL_SetWindowIcon() + * \sa SDL_SetWindowPosition() + * \sa SDL_SetWindowSize() + * \sa SDL_SetWindowBordered() + * \sa SDL_SetWindowResizable() + * \sa SDL_SetWindowTitle() + * \sa SDL_ShowWindow() + */ +typedef struct SDL_Window SDL_Window; + +/** + * \brief The flags on a window + * + * \sa SDL_GetWindowFlags() + */ +typedef enum +{ + SDL_WINDOW_FULLSCREEN = 0x00000001, /**< fullscreen window */ + SDL_WINDOW_OPENGL = 0x00000002, /**< window usable with OpenGL context */ + SDL_WINDOW_SHOWN = 0x00000004, /**< window is visible */ + SDL_WINDOW_HIDDEN = 0x00000008, /**< window is not visible */ + SDL_WINDOW_BORDERLESS = 0x00000010, /**< no window decoration */ + SDL_WINDOW_RESIZABLE = 0x00000020, /**< window can be resized */ + SDL_WINDOW_MINIMIZED = 0x00000040, /**< window is minimized */ + SDL_WINDOW_MAXIMIZED = 0x00000080, /**< window is maximized */ + SDL_WINDOW_MOUSE_GRABBED = 0x00000100, /**< window has grabbed mouse input */ + SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */ + SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ + SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), + SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000, /**< window should be created in high-DPI mode if supported. + On macOS NSHighResolutionCapable must be set true in the + application's Info.plist for this to have any effect. */ + SDL_WINDOW_MOUSE_CAPTURE = 0x00004000, /**< window has mouse captured (unrelated to MOUSE_GRABBED) */ + SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000, /**< window should always be above others */ + SDL_WINDOW_SKIP_TASKBAR = 0x00010000, /**< window should not be added to the taskbar */ + SDL_WINDOW_UTILITY = 0x00020000, /**< window should be treated as a utility window */ + SDL_WINDOW_TOOLTIP = 0x00040000, /**< window should be treated as a tooltip */ + SDL_WINDOW_POPUP_MENU = 0x00080000, /**< window should be treated as a popup menu */ + SDL_WINDOW_KEYBOARD_GRABBED = 0x00100000, /**< window has grabbed keyboard input */ + SDL_WINDOW_VULKAN = 0x10000000, /**< window usable for Vulkan surface */ + SDL_WINDOW_METAL = 0x20000000, /**< window usable for Metal view */ + + SDL_WINDOW_INPUT_GRABBED = SDL_WINDOW_MOUSE_GRABBED /**< equivalent to SDL_WINDOW_MOUSE_GRABBED for compatibility */ +} SDL_WindowFlags; + +/** + * \brief Used to indicate that you don't care what the window position is. + */ +#define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u +#define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) +#define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) +#define SDL_WINDOWPOS_ISUNDEFINED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * \brief Used to indicate that the window position should be centered. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u +#define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) +#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) +#define SDL_WINDOWPOS_ISCENTERED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + +/** + * \brief Event subtype for window events + */ +typedef enum +{ + SDL_WINDOWEVENT_NONE, /**< Never used */ + SDL_WINDOWEVENT_SHOWN, /**< Window has been shown */ + SDL_WINDOWEVENT_HIDDEN, /**< Window has been hidden */ + SDL_WINDOWEVENT_EXPOSED, /**< Window has been exposed and should be + redrawn */ + SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 + */ + SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as + a result of an API call or through the + system or user changing the window size. */ + SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ + SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ + SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size + and position */ + SDL_WINDOWEVENT_ENTER, /**< Window has gained mouse focus */ + SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ + SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ + SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ + SDL_WINDOWEVENT_CLOSE, /**< The window manager requests that the window be closed */ + SDL_WINDOWEVENT_TAKE_FOCUS, /**< Window is being offered a focus (should SetWindowInputFocus() on itself or a subwindow, or ignore) */ + SDL_WINDOWEVENT_HIT_TEST, /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL. */ + SDL_WINDOWEVENT_ICCPROF_CHANGED,/**< The ICC profile of the window's display has changed. */ + SDL_WINDOWEVENT_DISPLAY_CHANGED /**< Window has been moved to display data1. */ +} SDL_WindowEventID; + +/** + * \brief Event subtype for display events + */ +typedef enum +{ + SDL_DISPLAYEVENT_NONE, /**< Never used */ + SDL_DISPLAYEVENT_ORIENTATION, /**< Display orientation has changed to data1 */ + SDL_DISPLAYEVENT_CONNECTED, /**< Display has been added to the system */ + SDL_DISPLAYEVENT_DISCONNECTED, /**< Display has been removed from the system */ + SDL_DISPLAYEVENT_MOVED /**< Display has changed position */ +} SDL_DisplayEventID; + +/** + * \brief Display orientation + */ +typedef enum +{ + SDL_ORIENTATION_UNKNOWN, /**< The display orientation can't be determined */ + SDL_ORIENTATION_LANDSCAPE, /**< The display is in landscape mode, with the right side up, relative to portrait mode */ + SDL_ORIENTATION_LANDSCAPE_FLIPPED, /**< The display is in landscape mode, with the left side up, relative to portrait mode */ + SDL_ORIENTATION_PORTRAIT, /**< The display is in portrait mode */ + SDL_ORIENTATION_PORTRAIT_FLIPPED /**< The display is in portrait mode, upside down */ +} SDL_DisplayOrientation; + +/** + * \brief Window flash operation + */ +typedef enum +{ + SDL_FLASH_CANCEL, /**< Cancel any window flash state */ + SDL_FLASH_BRIEFLY, /**< Flash the window briefly to get attention */ + SDL_FLASH_UNTIL_FOCUSED /**< Flash the window until it gets focus */ +} SDL_FlashOperation; + +/** + * \brief An opaque handle to an OpenGL context. + */ +typedef void *SDL_GLContext; + +/** + * \brief OpenGL configuration attributes + */ +typedef enum +{ + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION, + SDL_GL_CONTEXT_EGL, + SDL_GL_CONTEXT_FLAGS, + SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_SHARE_WITH_CURRENT_CONTEXT, + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR, + SDL_GL_CONTEXT_RESET_NOTIFICATION, + SDL_GL_CONTEXT_NO_ERROR, + SDL_GL_FLOATBUFFERS +} SDL_GLattr; + +typedef enum +{ + SDL_GL_CONTEXT_PROFILE_CORE = 0x0001, + SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002, + SDL_GL_CONTEXT_PROFILE_ES = 0x0004 /**< GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ +} SDL_GLprofile; + +typedef enum +{ + SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001, + SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002, + SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004, + SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008 +} SDL_GLcontextFlag; + +typedef enum +{ + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001 +} SDL_GLcontextReleaseFlag; + +typedef enum +{ + SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000, + SDL_GL_CONTEXT_RESET_LOSE_CONTEXT = 0x0001 +} SDL_GLContextResetNotification; + +/* Function prototypes */ + +/** + * Get the number of video drivers compiled into SDL. + * + * \returns a number >= 1 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetVideoDriver + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); + +/** + * Get the name of a built in video driver. + * + * The video drivers are presented in the order in which they are normally + * checked during initialization. + * + * \param index the index of a video driver + * \returns the name of the video driver with the given **index**. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + */ +extern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index); + +/** + * Initialize the video subsystem, optionally specifying a video driver. + * + * This function initializes the video subsystem, setting up a connection to + * the window manager, etc, and determines the available display modes and + * pixel formats, but does not initialize a window or graphics mode. + * + * If you use this function and you haven't used the SDL_INIT_VIDEO flag with + * either SDL_Init() or SDL_InitSubSystem(), you should call SDL_VideoQuit() + * before calling SDL_Quit(). + * + * It is safe to call this function multiple times. SDL_VideoInit() will call + * SDL_VideoQuit() itself if the video subsystem has already been initialized. + * + * You can use SDL_GetNumVideoDrivers() and SDL_GetVideoDriver() to find a + * specific `driver_name`. + * + * \param driver_name the name of a video driver to initialize, or NULL for + * the default driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + * \sa SDL_GetVideoDriver + * \sa SDL_InitSubSystem + * \sa SDL_VideoQuit + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name); + +/** + * Shut down the video subsystem, if initialized with SDL_VideoInit(). + * + * This function closes all windows, and restores the original video mode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_VideoInit + */ +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); + +/** + * Get the name of the currently initialized video driver. + * + * \returns the name of the current video driver or NULL if no driver has been + * initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + * \sa SDL_GetVideoDriver + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); + +/** + * Get the number of available video displays. + * + * \returns a number >= 1 or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayBounds + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); + +/** + * Get the name of a display in UTF-8 encoding. + * + * \param displayIndex the index of display from which the name should be + * queried + * \returns the name of a display or NULL for an invalid display index or + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); + +/** + * Get the desktop area represented by a display. + * + * The primary display (`displayIndex` zero) is always located at 0,0. + * + * \param displayIndex the index of the display to query + * \param rect the SDL_Rect structure filled in with the display bounds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect); + +/** + * Get the usable desktop area represented by a display. + * + * The primary display (`displayIndex` zero) is always located at 0,0. + * + * This is the same area as SDL_GetDisplayBounds() reports, but with portions + * reserved by the system removed. For example, on Apple's macOS, this + * subtracts the area occupied by the menu bar and dock. + * + * Setting a window to be fullscreen generally bypasses these unusable areas, + * so these are good guidelines for the maximum space available to a + * non-fullscreen window. + * + * The parameter `rect` is ignored if it is NULL. + * + * This function also returns -1 if the parameter `displayIndex` is out of + * range. + * + * \param displayIndex the index of the display to query the usable bounds + * from + * \param rect the SDL_Rect structure filled in with the display bounds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect); + +/** + * Get the dots/pixels-per-inch for a display. + * + * Diagonal, horizontal and vertical DPI can all be optionally returned if the + * appropriate parameter is non-NULL. + * + * A failure of this function usually means that either no DPI information is + * available or the `displayIndex` is out of range. + * + * **WARNING**: This reports the DPI that the hardware reports, and it is not + * always reliable! It is almost always better to use SDL_GetWindowSize() to + * find the window size, which might be in logical points instead of pixels, + * and then SDL_GL_GetDrawableSize(), SDL_Vulkan_GetDrawableSize(), + * SDL_Metal_GetDrawableSize(), or SDL_GetRendererOutputSize(), and compare + * the two values to get an actual scaling value between the two. We will be + * rethinking how high-dpi details should be managed in SDL3 to make things + * more consistent, reliable, and clear. + * + * \param displayIndex the index of the display from which DPI information + * should be queried + * \param ddpi a pointer filled in with the diagonal DPI of the display; may + * be NULL + * \param hdpi a pointer filled in with the horizontal DPI of the display; may + * be NULL + * \param vdpi a pointer filled in with the vertical DPI of the display; may + * be NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi); + +/** + * Get the orientation of a display. + * + * \param displayIndex the index of the display to query + * \returns The SDL_DisplayOrientation enum value of the display, or + * `SDL_ORIENTATION_UNKNOWN` if it isn't available. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetDisplayOrientation(int displayIndex); + +/** + * Get the number of available display modes. + * + * The `displayIndex` needs to be in the range from 0 to + * SDL_GetNumVideoDisplays() - 1. + * + * \param displayIndex the index of the display to query + * \returns a number >= 1 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(int displayIndex); + +/** + * Get information about a specific display mode. + * + * The display modes are sorted in this priority: + * + * - width -> largest to smallest + * - height -> largest to smallest + * - bits per pixel -> more colors to fewer colors + * - packed pixel layout -> largest to smallest + * - refresh rate -> highest to lowest + * + * \param displayIndex the index of the display to query + * \param modeIndex the index of the display mode to query + * \param mode an SDL_DisplayMode structure filled in with the mode at + * `modeIndex` + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumDisplayModes + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayMode(int displayIndex, int modeIndex, + SDL_DisplayMode * mode); + +/** + * Get information about the desktop's display mode. + * + * There's a difference between this function and SDL_GetCurrentDisplayMode() + * when SDL runs fullscreen and has changed the resolution. In that case this + * function will return the previous native display mode, and not the current + * display mode. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure filled in with the current display + * mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetCurrentDisplayMode + * \sa SDL_GetDisplayMode + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode); + +/** + * Get information about the current display mode. + * + * There's a difference between this function and SDL_GetDesktopDisplayMode() + * when SDL runs fullscreen and has changed the resolution. In that case this + * function will return the current display mode, and not the previous native + * display mode. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure filled in with the current display + * mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDesktopDisplayMode + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumVideoDisplays + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode); + + +/** + * Get the closest match to the requested display mode. + * + * The available display modes are scanned and `closest` is filled in with the + * closest mode matching the requested mode and returned. The mode format and + * refresh rate default to the desktop mode if they are set to 0. The modes + * are scanned with size being first priority, format being second priority, + * and finally checking the refresh rate. If all the available modes are too + * small, then NULL is returned. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure containing the desired display + * mode + * \param closest an SDL_DisplayMode structure filled in with the closest + * match of the available display modes + * \returns the passed in value `closest` or NULL if no matching video mode + * was available; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumDisplayModes + */ +extern DECLSPEC SDL_DisplayMode * SDLCALL SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode * mode, SDL_DisplayMode * closest); + +/** + * Get the index of the display containing a point + * + * \param point the point to query + * \returns the index of the display containing the point or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetPointDisplayIndex(const SDL_Point * point); + +/** + * Get the index of the display primarily containing a rect + * + * \param rect the rect to query + * \returns the index of the display entirely containing the rect or closest + * to the center of the rect on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetRectDisplayIndex(const SDL_Rect * rect); + +/** + * Get the index of the display associated with a window. + * + * \param window the window to query + * \returns the index of the display containing the center of the window on + * success or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayIndex(SDL_Window * window); + +/** + * Set the display mode to use when a window is visible at fullscreen. + * + * This only affects the display mode used when the window is fullscreen. To + * change the window size when the window is not fullscreen, use + * SDL_SetWindowSize(). + * + * \param window the window to affect + * \param mode the SDL_DisplayMode structure representing the mode to use, or + * NULL to use the window's dimensions and the desktop's format + * and refresh rate + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowDisplayMode + * \sa SDL_SetWindowFullscreen + */ +extern DECLSPEC int SDLCALL SDL_SetWindowDisplayMode(SDL_Window * window, + const SDL_DisplayMode * mode); + +/** + * Query the display mode to use when a window is visible at fullscreen. + * + * \param window the window to query + * \param mode an SDL_DisplayMode structure filled in with the fullscreen + * display mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowDisplayMode + * \sa SDL_SetWindowFullscreen + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayMode(SDL_Window * window, + SDL_DisplayMode * mode); + +/** + * Get the raw ICC profile data for the screen the window is currently on. + * + * Data returned should be freed with SDL_free. + * + * \param window the window to query + * \param size the size of the ICC profile + * \returns the raw ICC profile data on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void* SDLCALL SDL_GetWindowICCProfile(SDL_Window * window, size_t* size); + +/** + * Get the pixel format associated with the window. + * + * \param window the window to query + * \returns the pixel format of the window on success or + * SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); + +/** + * Create a window with the specified position, dimensions, and flags. + * + * `flags` may be any of the following OR'd together: + * + * - `SDL_WINDOW_FULLSCREEN`: fullscreen window + * - `SDL_WINDOW_FULLSCREEN_DESKTOP`: fullscreen window at desktop resolution + * - `SDL_WINDOW_OPENGL`: window usable with an OpenGL context + * - `SDL_WINDOW_VULKAN`: window usable with a Vulkan instance + * - `SDL_WINDOW_METAL`: window usable with a Metal instance + * - `SDL_WINDOW_HIDDEN`: window is not visible + * - `SDL_WINDOW_BORDERLESS`: no window decoration + * - `SDL_WINDOW_RESIZABLE`: window can be resized + * - `SDL_WINDOW_MINIMIZED`: window is minimized + * - `SDL_WINDOW_MAXIMIZED`: window is maximized + * - `SDL_WINDOW_INPUT_GRABBED`: window has grabbed input focus + * - `SDL_WINDOW_ALLOW_HIGHDPI`: window should be created in high-DPI mode if + * supported (>= SDL 2.0.1) + * + * `SDL_WINDOW_SHOWN` is ignored by SDL_CreateWindow(). The SDL_Window is + * implicitly shown if SDL_WINDOW_HIDDEN is not set. `SDL_WINDOW_SHOWN` may be + * queried later using SDL_GetWindowFlags(). + * + * On Apple's macOS, you **must** set the NSHighResolutionCapable Info.plist + * property to YES, otherwise you will not receive a High-DPI OpenGL canvas. + * + * If the window is created with the `SDL_WINDOW_ALLOW_HIGHDPI` flag, its size + * in pixels may differ from its size in screen coordinates on platforms with + * high-DPI support (e.g. iOS and macOS). Use SDL_GetWindowSize() to query the + * client area's size in screen coordinates, and SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to query the drawable size in pixels. Note that + * when this flag is set, the drawable size can vary after the window is + * created and should be queried after major window events such as when the + * window is resized or moved between displays. + * + * If the window is set fullscreen, the width and height parameters `w` and + * `h` will not be used. However, invalid size parameters (e.g. too large) may + * still fail. Window size is actually limited to 16384 x 16384 for all + * platforms at window creation. + * + * If the window is created with any of the SDL_WINDOW_OPENGL or + * SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function + * (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the + * corresponding UnloadLibrary function is called by SDL_DestroyWindow(). + * + * If SDL_WINDOW_VULKAN is specified and there isn't a working Vulkan driver, + * SDL_CreateWindow() will fail because SDL_Vulkan_LoadLibrary() will fail. + * + * If SDL_WINDOW_METAL is specified on an OS that does not support Metal, + * SDL_CreateWindow() will fail. + * + * On non-Apple devices, SDL requires you to either not link to the Vulkan + * loader or link to a dynamic library version. This limitation may be removed + * in a future version of SDL. + * + * \param title the title of the window, in UTF-8 encoding + * \param x the x position of the window, `SDL_WINDOWPOS_CENTERED`, or + * `SDL_WINDOWPOS_UNDEFINED` + * \param y the y position of the window, `SDL_WINDOWPOS_CENTERED`, or + * `SDL_WINDOWPOS_UNDEFINED` + * \param w the width of the window, in screen coordinates + * \param h the height of the window, in screen coordinates + * \param flags 0, or one or more SDL_WindowFlags OR'd together + * \returns the window that was created or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindowFrom + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, + int x, int y, int w, + int h, Uint32 flags); + +/** + * Create an SDL window from an existing native window. + * + * In some cases (e.g. OpenGL) and on some platforms (e.g. Microsoft Windows) + * the hint `SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT` needs to be configured + * before using SDL_CreateWindowFrom(). + * + * \param data a pointer to driver-dependent window creation data, typically + * your native window cast to a void* + * \returns the window that was created or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowFrom(const void *data); + +/** + * Get the numeric ID of a window. + * + * The numeric ID is what SDL_WindowEvent references, and is necessary to map + * these events to specific SDL_Window objects. + * + * \param window the window to query + * \returns the ID of the window on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowFromID + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowID(SDL_Window * window); + +/** + * Get a window from a stored ID. + * + * The numeric ID is what SDL_WindowEvent references, and is necessary to map + * these events to specific SDL_Window objects. + * + * \param id the ID of the window + * \returns the window associated with `id` or NULL if it doesn't exist; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowID + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(Uint32 id); + +/** + * Get the window flags. + * + * \param window the window to query + * \returns a mask of the SDL_WindowFlags associated with `window` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_HideWindow + * \sa SDL_MaximizeWindow + * \sa SDL_MinimizeWindow + * \sa SDL_SetWindowFullscreen + * \sa SDL_SetWindowGrab + * \sa SDL_ShowWindow + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window * window); + +/** + * Set the title of a window. + * + * This string is expected to be in UTF-8 encoding. + * + * \param window the window to change + * \param title the desired window title in UTF-8 format + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowTitle + */ +extern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_Window * window, + const char *title); + +/** + * Get the title of a window. + * + * \param window the window to query + * \returns the title of the window in UTF-8 format or "" if there is no + * title. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowTitle + */ +extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window); + +/** + * Set the icon for a window. + * + * \param window the window to change + * \param icon an SDL_Surface structure containing the icon for the window + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window, + SDL_Surface * icon); + +/** + * Associate an arbitrary named pointer with a window. + * + * `name` is case-sensitive. + * + * \param window the window to associate with the pointer + * \param name the name of the pointer + * \param userdata the associated pointer + * \returns the previous value associated with `name`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowData + */ +extern DECLSPEC void* SDLCALL SDL_SetWindowData(SDL_Window * window, + const char *name, + void *userdata); + +/** + * Retrieve the data pointer associated with a window. + * + * \param window the window to query + * \param name the name of the pointer + * \returns the value associated with `name`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowData + */ +extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window, + const char *name); + +/** + * Set the position of a window. + * + * The window coordinate origin is the upper left of the display. + * + * \param window the window to reposition + * \param x the x coordinate of the window in screen coordinates, or + * `SDL_WINDOWPOS_CENTERED` or `SDL_WINDOWPOS_UNDEFINED` + * \param y the y coordinate of the window in screen coordinates, or + * `SDL_WINDOWPOS_CENTERED` or `SDL_WINDOWPOS_UNDEFINED` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowPosition + */ +extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window, + int x, int y); + +/** + * Get the position of a window. + * + * If you do not need the value for one of the positions a NULL may be passed + * in the `x` or `y` parameter. + * + * \param window the window to query + * \param x a pointer filled in with the x position of the window, in screen + * coordinates, may be NULL + * \param y a pointer filled in with the y position of the window, in screen + * coordinates, may be NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowPosition + */ +extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window, + int *x, int *y); + +/** + * Set the size of a window's client area. + * + * The window size in screen coordinates may differ from the size in pixels, + * if the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a platform + * with high-dpi support (e.g. iOS or macOS). Use SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to get the real client area size in pixels. + * + * Fullscreen windows automatically match the size of the display mode, and + * you should use SDL_SetWindowDisplayMode() to change their size. + * + * \param window the window to change + * \param w the width of the window in pixels, in screen coordinates, must be + * > 0 + * \param h the height of the window in pixels, in screen coordinates, must be + * > 0 + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSize + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, + int h); + +/** + * Get the size of a window's client area. + * + * NULL can safely be passed as the `w` or `h` parameter if the width or + * height value is not desired. + * + * The window size in screen coordinates may differ from the size in pixels, + * if the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a platform + * with high-dpi support (e.g. iOS or macOS). Use SDL_GL_GetDrawableSize(), + * SDL_Vulkan_GetDrawableSize(), or SDL_GetRendererOutputSize() to get the + * real client area size in pixels. + * + * \param window the window to query the width and height from + * \param w a pointer filled in with the width of the window, in screen + * coordinates, may be NULL + * \param h a pointer filled in with the height of the window, in screen + * coordinates, may be NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetDrawableSize + * \sa SDL_Vulkan_GetDrawableSize + * \sa SDL_SetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w, + int *h); + +/** + * Get the size of a window's borders (decorations) around the client area. + * + * Note: If this function fails (returns -1), the size values will be + * initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the + * window in question was borderless. + * + * Note: This function may fail on systems where the window has not yet been + * decorated by the display server (for example, immediately after calling + * SDL_CreateWindow). It is recommended that you wait at least until the + * window has been presented and composited, so that the window system has a + * chance to decorate the window and provide the border dimensions to SDL. + * + * This function also returns -1 if getting the information is not supported. + * + * \param window the window to query the size values of the border + * (decorations) from + * \param top pointer to variable for storing the size of the top border; NULL + * is permitted + * \param left pointer to variable for storing the size of the left border; + * NULL is permitted + * \param bottom pointer to variable for storing the size of the bottom + * border; NULL is permitted + * \param right pointer to variable for storing the size of the right border; + * NULL is permitted + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowSize + */ +extern DECLSPEC int SDLCALL SDL_GetWindowBordersSize(SDL_Window * window, + int *top, int *left, + int *bottom, int *right); + +/** + * Get the size of a window in pixels. + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window the window from which the drawable size should be queried + * \param w a pointer to variable for storing the width in pixels, may be NULL + * \param h a pointer to variable for storing the height in pixels, may be + * NULL + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_CreateWindow + * \sa SDL_GetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSizeInPixels(SDL_Window * window, + int *w, int *h); + +/** + * Set the minimum size of a window's client area. + * + * \param window the window to change + * \param min_w the minimum width of the window in pixels + * \param min_h the minimum height of the window in pixels + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMinimumSize + * \sa SDL_SetWindowMaximumSize + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window, + int min_w, int min_h); + +/** + * Get the minimum size of a window's client area. + * + * \param window the window to query + * \param w a pointer filled in with the minimum width of the window, may be + * NULL + * \param h a pointer filled in with the minimum height of the window, may be + * NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMaximumSize + * \sa SDL_SetWindowMinimumSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window, + int *w, int *h); + +/** + * Set the maximum size of a window's client area. + * + * \param window the window to change + * \param max_w the maximum width of the window in pixels + * \param max_h the maximum height of the window in pixels + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMaximumSize + * \sa SDL_SetWindowMinimumSize + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMaximumSize(SDL_Window * window, + int max_w, int max_h); + +/** + * Get the maximum size of a window's client area. + * + * \param window the window to query + * \param w a pointer filled in with the maximum width of the window, may be + * NULL + * \param h a pointer filled in with the maximum height of the window, may be + * NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMinimumSize + * \sa SDL_SetWindowMaximumSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMaximumSize(SDL_Window * window, + int *w, int *h); + +/** + * Set the border state of a window. + * + * This will add or remove the window's `SDL_WINDOW_BORDERLESS` flag and add + * or remove the border from the actual window. This is a no-op if the + * window's border already matches the requested state. + * + * You can't change the border state of a fullscreen window. + * + * \param window the window of which to change the border state + * \param bordered SDL_FALSE to remove border, SDL_TRUE to add border + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowBordered(SDL_Window * window, + SDL_bool bordered); + +/** + * Set the user-resizable state of a window. + * + * This will add or remove the window's `SDL_WINDOW_RESIZABLE` flag and + * allow/disallow user resizing of the window. This is a no-op if the window's + * resizable state already matches the requested state. + * + * You can't change the resizable state of a fullscreen window. + * + * \param window the window of which to change the resizable state + * \param resizable SDL_TRUE to allow resizing, SDL_FALSE to disallow + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowResizable(SDL_Window * window, + SDL_bool resizable); + +/** + * Set the window to always be above the others. + * + * This will add or remove the window's `SDL_WINDOW_ALWAYS_ON_TOP` flag. This + * will bring the window to the front and keep the window above the rest. + * + * \param window The window of which to change the always on top state + * \param on_top SDL_TRUE to set the window always on top, SDL_FALSE to + * disable + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window * window, + SDL_bool on_top); + +/** + * Show a window. + * + * \param window the window to show + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HideWindow + * \sa SDL_RaiseWindow + */ +extern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_Window * window); + +/** + * Hide a window. + * + * \param window the window to hide + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowWindow + */ +extern DECLSPEC void SDLCALL SDL_HideWindow(SDL_Window * window); + +/** + * Raise a window above other windows and set the input focus. + * + * \param window the window to raise + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_Window * window); + +/** + * Make a window as large as possible. + * + * \param window the window to maximize + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MinimizeWindow + * \sa SDL_RestoreWindow + */ +extern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_Window * window); + +/** + * Minimize a window to an iconic representation. + * + * \param window the window to minimize + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MaximizeWindow + * \sa SDL_RestoreWindow + */ +extern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_Window * window); + +/** + * Restore the size and position of a minimized or maximized window. + * + * \param window the window to restore + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MaximizeWindow + * \sa SDL_MinimizeWindow + */ +extern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_Window * window); + +/** + * Set a window's fullscreen state. + * + * `flags` may be `SDL_WINDOW_FULLSCREEN`, for "real" fullscreen with a + * videomode change; `SDL_WINDOW_FULLSCREEN_DESKTOP` for "fake" fullscreen + * that takes the size of the desktop; and 0 for windowed mode. + * + * \param window the window to change + * \param flags `SDL_WINDOW_FULLSCREEN`, `SDL_WINDOW_FULLSCREEN_DESKTOP` or 0 + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowDisplayMode + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window, + Uint32 flags); + +/** + * Return whether the window has a surface associated with it. + * + * \returns SDL_TRUE if there is a surface associated with the window, or SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.28.0. + * + * \sa SDL_GetWindowSurface + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasWindowSurface(SDL_Window *window); + +/** + * Get the SDL surface associated with the window. + * + * A new surface will be created with the optimal format for the window, if + * necessary. This surface will be freed when the window is destroyed. Do not + * free this surface. + * + * This surface will be invalidated if the window is resized. After resizing a + * window this function must be called again to return a valid surface. + * + * You may not combine this with 3D or the rendering API on this window. + * + * This function is affected by `SDL_HINT_FRAMEBUFFER_ACCELERATION`. + * + * \param window the window to query + * \returns the surface associated with the window, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroyWindowSurface + * \sa SDL_HasWindowSurface + * \sa SDL_UpdateWindowSurface + * \sa SDL_UpdateWindowSurfaceRects + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window); + +/** + * Copy the window surface to the screen. + * + * This is the function you use to reflect any changes to the surface on the + * screen. + * + * This function is equivalent to the SDL 1.2 API SDL_Flip(). + * + * \param window the window to update + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSurface + * \sa SDL_UpdateWindowSurfaceRects + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window); + +/** + * Copy areas of the window surface to the screen. + * + * This is the function you use to reflect changes to portions of the surface + * on the screen. + * + * This function is equivalent to the SDL 1.2 API SDL_UpdateRects(). + * + * \param window the window to update + * \param rects an array of SDL_Rect structures representing areas of the + * surface to copy, in pixels + * \param numrects the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSurface + * \sa SDL_UpdateWindowSurface + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, + const SDL_Rect * rects, + int numrects); + +/** + * Destroy the surface associated with the window. + * + * \param window the window to update + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.28.0. + * + * \sa SDL_GetWindowSurface + * \sa SDL_HasWindowSurface + */ +extern DECLSPEC int SDLCALL SDL_DestroyWindowSurface(SDL_Window *window); + +/** + * Set a window's input grab mode. + * + * When input is grabbed, the mouse is confined to the window. This function + * will also grab the keyboard if `SDL_HINT_GRAB_KEYBOARD` is set. To grab the + * keyboard without also grabbing the mouse, use SDL_SetWindowKeyboardGrab(). + * + * If the caller enables a grab while another window is currently grabbed, the + * other window loses its grab in favor of the caller's window. + * + * \param window the window for which the input grab mode should be set + * \param grabbed SDL_TRUE to grab input or SDL_FALSE to release input + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetGrabbedWindow + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Set a window's keyboard grab mode. + * + * Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or + * the Meta/Super key. Note that not all system keyboard shortcuts can be + * captured by applications (one example is Ctrl+Alt+Del on Windows). + * + * This is primarily intended for specialized applications such as VNC clients + * or VM frontends. Normal games should not use keyboard grab. + * + * When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the + * window is full-screen to ensure the user is not trapped in your + * application. If you have a custom keyboard shortcut to exit fullscreen + * mode, you may suppress this behavior with + * `SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED`. + * + * If the caller enables a grab while another window is currently grabbed, the + * other window loses its grab in favor of the caller's window. + * + * \param window The window for which the keyboard grab mode should be set. + * \param grabbed This is SDL_TRUE to grab keyboard, and SDL_FALSE to release. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowKeyboardGrab + * \sa SDL_SetWindowMouseGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Set a window's mouse grab mode. + * + * Mouse grab confines the mouse cursor to the window. + * + * \param window The window for which the mouse grab mode should be set. + * \param grabbed This is SDL_TRUE to grab mouse, and SDL_FALSE to release. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowMouseGrab + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMouseGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Get a window's input grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if input is grabbed, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window); + +/** + * Get a window's keyboard grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if keyboard is grabbed, and SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowKeyboardGrab(SDL_Window * window); + +/** + * Get a window's mouse grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if mouse is grabbed, and SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowMouseGrab(SDL_Window * window); + +/** + * Get the window that currently has an input grab enabled. + * + * \returns the window if input is grabbed or NULL otherwise. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetWindowGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); + +/** + * Confines the cursor to the specified area of a window. + * + * Note that this does NOT grab the cursor, it only defines the area a cursor + * is restricted to when the window has mouse focus. + * + * \param window The window that will be associated with the barrier. + * \param rect A rectangle area in window-relative coordinates. If NULL the + * barrier for the specified window will be destroyed. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseGrab + */ +extern DECLSPEC int SDLCALL SDL_SetWindowMouseRect(SDL_Window * window, const SDL_Rect * rect); + +/** + * Get the mouse confinement rectangle of a window. + * + * \param window The window to query + * \returns A pointer to the mouse confinement rectangle of a window, or NULL + * if there isn't one. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_SetWindowMouseRect + */ +extern DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_Window * window); + +/** + * Set the brightness (gamma multiplier) for a given window's display. + * + * Despite the name and signature, this method sets the brightness of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) The + * brightness set will not follow the window if it is moved to another + * display. + * + * Many platforms will refuse to set the display brightness in modern times. + * You are better off using a shader to adjust gamma during rendering, or + * something similar. + * + * \param window the window used to select the display whose brightness will + * be changed + * \param brightness the brightness (gamma multiplier) value to set where 0.0 + * is completely dark and 1.0 is normal brightness + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowBrightness + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_SetWindowBrightness(SDL_Window * window, float brightness); + +/** + * Get the brightness (gamma multiplier) for a given window's display. + * + * Despite the name and signature, this method retrieves the brightness of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) + * + * \param window the window used to select the display whose brightness will + * be queried + * \returns the brightness for the display where 0.0 is completely dark and + * 1.0 is normal brightness. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowBrightness + */ +extern DECLSPEC float SDLCALL SDL_GetWindowBrightness(SDL_Window * window); + +/** + * Set the opacity for a window. + * + * The parameter `opacity` will be clamped internally between 0.0f + * (transparent) and 1.0f (opaque). + * + * This function also returns -1 if setting the opacity isn't supported. + * + * \param window the window which will be made transparent or opaque + * \param opacity the opacity value (0.0f - transparent, 1.0f - opaque) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowOpacity + */ +extern DECLSPEC int SDLCALL SDL_SetWindowOpacity(SDL_Window * window, float opacity); + +/** + * Get the opacity of a window. + * + * If transparency isn't supported on this platform, opacity will be reported + * as 1.0f without error. + * + * The parameter `opacity` is ignored if it is NULL. + * + * This function also returns -1 if an invalid window was provided. + * + * \param window the window to get the current opacity value from + * \param out_opacity the float filled in (0.0f - transparent, 1.0f - opaque) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_SetWindowOpacity + */ +extern DECLSPEC int SDLCALL SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity); + +/** + * Set the window as a modal for another window. + * + * \param modal_window the window that should be set modal + * \param parent_window the parent window for the modal window + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window); + +/** + * Explicitly set input focus to the window. + * + * You almost certainly want SDL_RaiseWindow() instead of this function. Use + * this with caution, as you might give focus to a window that is completely + * obscured by other windows. + * + * \param window the window that should get the input focus + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RaiseWindow + */ +extern DECLSPEC int SDLCALL SDL_SetWindowInputFocus(SDL_Window * window); + +/** + * Set the gamma ramp for the display that owns a given window. + * + * Set the gamma translation table for the red, green, and blue channels of + * the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. The + * input is the index into the array, and the output is the 16-bit gamma value + * at that index, scaled to the output color precision. + * + * Despite the name and signature, this method sets the gamma ramp of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) The gamma + * ramp set will not follow the window if it is moved to another display. + * + * \param window the window used to select the display whose gamma ramp will + * be changed + * \param red a 256 element array of 16-bit quantities representing the + * translation table for the red channel, or NULL + * \param green a 256 element array of 16-bit quantities representing the + * translation table for the green channel, or NULL + * \param blue a 256 element array of 16-bit quantities representing the + * translation table for the blue channel, or NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window, + const Uint16 * red, + const Uint16 * green, + const Uint16 * blue); + +/** + * Get the gamma ramp for a given window's display. + * + * Despite the name and signature, this method retrieves the gamma ramp of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) + * + * \param window the window used to select the display whose gamma ramp will + * be queried + * \param red a 256 element array of 16-bit quantities filled in with the + * translation table for the red channel, or NULL + * \param green a 256 element array of 16-bit quantities filled in with the + * translation table for the green channel, or NULL + * \param blue a 256 element array of 16-bit quantities filled in with the + * translation table for the blue channel, or NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window, + Uint16 * red, + Uint16 * green, + Uint16 * blue); + +/** + * Possible return values from the SDL_HitTest callback. + * + * \sa SDL_HitTest + */ +typedef enum +{ + SDL_HITTEST_NORMAL, /**< Region is normal. No special properties. */ + SDL_HITTEST_DRAGGABLE, /**< Region can drag entire window. */ + SDL_HITTEST_RESIZE_TOPLEFT, + SDL_HITTEST_RESIZE_TOP, + SDL_HITTEST_RESIZE_TOPRIGHT, + SDL_HITTEST_RESIZE_RIGHT, + SDL_HITTEST_RESIZE_BOTTOMRIGHT, + SDL_HITTEST_RESIZE_BOTTOM, + SDL_HITTEST_RESIZE_BOTTOMLEFT, + SDL_HITTEST_RESIZE_LEFT +} SDL_HitTestResult; + +/** + * Callback used for hit-testing. + * + * \param win the SDL_Window where hit-testing was set on + * \param area an SDL_Point which should be hit-tested + * \param data what was passed as `callback_data` to SDL_SetWindowHitTest() + * \return an SDL_HitTestResult value. + * + * \sa SDL_SetWindowHitTest + */ +typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, + const SDL_Point *area, + void *data); + +/** + * Provide a callback that decides if a window region has special properties. + * + * Normally windows are dragged and resized by decorations provided by the + * system window manager (a title bar, borders, etc), but for some apps, it + * makes sense to drag them from somewhere else inside the window itself; for + * example, one might have a borderless window that wants to be draggable from + * any part, or simulate its own title bar, etc. + * + * This function lets the app provide a callback that designates pieces of a + * given window as special. This callback is run during event processing if we + * need to tell the OS to treat a region of the window specially; the use of + * this callback is known as "hit testing." + * + * Mouse input may not be delivered to your application if it is within a + * special area; the OS will often apply that input to moving the window or + * resizing the window and not deliver it to the application. + * + * Specifying NULL for a callback disables hit-testing. Hit-testing is + * disabled by default. + * + * Platforms that don't support this functionality will return -1 + * unconditionally, even if you're attempting to disable hit-testing. + * + * Your callback may fire at any time, and its firing does not indicate any + * specific behavior (for example, on Windows, this certainly might fire when + * the OS is deciding whether to drag your window, but it fires for lots of + * other reasons, too, some unrelated to anything you probably care about _and + * when the mouse isn't actually at the location it is testing_). Since this + * can fire at any time, you should try to keep your callback efficient, + * devoid of allocations, etc. + * + * \param window the window to set hit-testing on + * \param callback the function to call when doing a hit-test + * \param callback_data an app-defined void pointer passed to **callback** + * \returns 0 on success or -1 on error (including unsupported); call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window, + SDL_HitTest callback, + void *callback_data); + +/** + * Request a window to demand attention from the user. + * + * \param window the window to be flashed + * \param operation the flash operation + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_FlashWindow(SDL_Window * window, SDL_FlashOperation operation); + +/** + * Destroy a window. + * + * If `window` is NULL, this function will return immediately after setting + * the SDL error message to "Invalid window". See SDL_GetError(). + * + * \param window the window to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_CreateWindowFrom + */ +extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window); + + +/** + * Check whether the screensaver is currently enabled. + * + * The screensaver is disabled by default since SDL 2.0.2. Before SDL 2.0.2 + * the screensaver was enabled by default. + * + * The default can also be changed using `SDL_HINT_VIDEO_ALLOW_SCREENSAVER`. + * + * \returns SDL_TRUE if the screensaver is enabled, SDL_FALSE if it is + * disabled. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DisableScreenSaver + * \sa SDL_EnableScreenSaver + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void); + +/** + * Allow the screen to be blanked by a screen saver. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DisableScreenSaver + * \sa SDL_IsScreenSaverEnabled + */ +extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void); + +/** + * Prevent the screen from being blanked by a screen saver. + * + * If you disable the screensaver, it is automatically re-enabled when SDL + * quits. + * + * The screensaver is disabled by default since SDL 2.0.2. Before SDL 2.0.2 + * the screensaver was enabled by default. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_EnableScreenSaver + * \sa SDL_IsScreenSaverEnabled + */ +extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void); + + +/** + * \name OpenGL support functions + */ +/* @{ */ + +/** + * Dynamically load an OpenGL library. + * + * This should be done after initializing the video driver, but before + * creating any OpenGL windows. If no OpenGL library is loaded, the default + * library will be loaded upon creation of the first OpenGL window. + * + * If you do this, you need to retrieve all of the GL functions used in your + * program from the dynamic library using SDL_GL_GetProcAddress(). + * + * \param path the platform dependent OpenGL library name, or NULL to open the + * default OpenGL library + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetProcAddress + * \sa SDL_GL_UnloadLibrary + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get an OpenGL function by name. + * + * If the GL library is loaded at runtime with SDL_GL_LoadLibrary(), then all + * GL functions must be retrieved this way. Usually this is used to retrieve + * function pointers to OpenGL extensions. + * + * There are some quirks to looking up OpenGL functions that require some + * extra care from the application. If you code carefully, you can handle + * these quirks without any platform-specific code, though: + * + * - On Windows, function pointers are specific to the current GL context; + * this means you need to have created a GL context and made it current + * before calling SDL_GL_GetProcAddress(). If you recreate your context or + * create a second context, you should assume that any existing function + * pointers aren't valid to use with it. This is (currently) a + * Windows-specific limitation, and in practice lots of drivers don't suffer + * this limitation, but it is still the way the wgl API is documented to + * work and you should expect crashes if you don't respect it. Store a copy + * of the function pointers that comes and goes with context lifespan. + * - On X11, function pointers returned by this function are valid for any + * context, and can even be looked up before a context is created at all. + * This means that, for at least some common OpenGL implementations, if you + * look up a function that doesn't exist, you'll get a non-NULL result that + * is _NOT_ safe to call. You must always make sure the function is actually + * available for a given GL context before calling it, by checking for the + * existence of the appropriate extension with SDL_GL_ExtensionSupported(), + * or verifying that the version of OpenGL you're using offers the function + * as core functionality. + * - Some OpenGL drivers, on all platforms, *will* return NULL if a function + * isn't supported, but you can't count on this behavior. Check for + * extensions you use, and if you get a NULL anyway, act as if that + * extension wasn't available. This is probably a bug in the driver, but you + * can code defensively for this scenario anyhow. + * - Just because you're on Linux/Unix, don't assume you'll be using X11. + * Next-gen display servers are waiting to replace it, and may or may not + * make the same promises about function pointers. + * - OpenGL function pointers must be declared `APIENTRY` as in the example + * code. This will ensure the proper calling convention is followed on + * platforms where this matters (Win32) thereby avoiding stack corruption. + * + * \param proc the name of an OpenGL function + * \returns a pointer to the named OpenGL function. The returned pointer + * should be cast to the appropriate function signature. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_ExtensionSupported + * \sa SDL_GL_LoadLibrary + * \sa SDL_GL_UnloadLibrary + */ +extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc); + +/** + * Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_LoadLibrary + */ +extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); + +/** + * Check if an OpenGL extension is supported for the current context. + * + * This function operates on the current GL context; you must have created a + * context and it must be current before calling this function. Do not assume + * that all contexts you create will have the same set of extensions + * available, or that recreating an existing context will offer the same + * extensions again. + * + * While it's probably not a massive overhead, this function is not an O(1) + * operation. Check the extensions you care about after creating the GL + * context and save that information somewhere instead of calling the function + * every time you need to know. + * + * \param extension the name of the extension to check + * \returns SDL_TRUE if the extension is supported, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char + *extension); + +/** + * Reset all previously set OpenGL context attributes to their default values. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GL_GetAttribute + * \sa SDL_GL_SetAttribute + */ +extern DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); + +/** + * Set an OpenGL window attribute before window creation. + * + * This function sets the OpenGL attribute `attr` to `value`. The requested + * attributes should be set before creating an OpenGL window. You should use + * SDL_GL_GetAttribute() to check the values after creating the OpenGL + * context, since the values obtained can differ from the requested ones. + * + * \param attr an SDL_GLattr enum value specifying the OpenGL attribute to set + * \param value the desired value for the attribute + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetAttribute + * \sa SDL_GL_ResetAttributes + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get the actual value for an attribute from the current context. + * + * \param attr an SDL_GLattr enum value specifying the OpenGL attribute to get + * \param value a pointer filled in with the current value of `attr` + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_ResetAttributes + * \sa SDL_GL_SetAttribute + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); + +/** + * Create an OpenGL context for an OpenGL window, and make it current. + * + * Windows users new to OpenGL should note that, for historical reasons, GL + * functions added after OpenGL version 1.1 are not available by default. + * Those functions must be loaded at run-time, either with an OpenGL + * extension-handling library or with SDL_GL_GetProcAddress() and its related + * functions. + * + * SDL_GLContext is an alias for `void *`. It's opaque to the application. + * + * \param window the window to associate with the context + * \returns the OpenGL context associated with `window` or NULL on error; call + * SDL_GetError() for more details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_DeleteContext + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window * + window); + +/** + * Set up an OpenGL context for rendering into an OpenGL window. + * + * The context must have been created with a compatible window. + * + * \param window the window to associate with the context + * \param context the OpenGL context to associate with the window + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_CreateContext + */ +extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window, + SDL_GLContext context); + +/** + * Get the currently active OpenGL window. + * + * \returns the currently active OpenGL window on success or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void); + +/** + * Get the currently active OpenGL context. + * + * \returns the currently active OpenGL context or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); + +/** + * Get the size of a window's underlying drawable in pixels. + * + * This returns info useful for calling glViewport(). + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window the window from which the drawable size should be queried + * \param w a pointer to variable for storing the width in pixels, may be NULL + * \param h a pointer to variable for storing the height in pixels, may be + * NULL + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_CreateWindow + * \sa SDL_GetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w, + int *h); + +/** + * Set the swap interval for the current OpenGL context. + * + * Some systems allow specifying -1 for the interval, to enable adaptive + * vsync. Adaptive vsync works the same as vsync, but if you've already missed + * the vertical retrace for a given frame, it swaps buffers immediately, which + * might be less jarring for the user during occasional framerate drops. If an + * application requests adaptive vsync and the system does not support it, + * this function will fail and return -1. In such a case, you should probably + * retry the call with 1 for the interval. + * + * Adaptive vsync is implemented for some glX drivers with + * GLX_EXT_swap_control_tear, and for some Windows drivers with + * WGL_EXT_swap_control_tear. + * + * Read more on the Khronos wiki: + * https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync + * + * \param interval 0 for immediate updates, 1 for updates synchronized with + * the vertical retrace, -1 for adaptive vsync + * \returns 0 on success or -1 if setting the swap interval is not supported; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetSwapInterval + */ +extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval); + +/** + * Get the swap interval for the current OpenGL context. + * + * If the system can't determine the swap interval, or there isn't a valid + * current context, this function will return 0 as a safe default. + * + * \returns 0 if there is no vertical retrace synchronization, 1 if the buffer + * swap is synchronized with the vertical retrace, and -1 if late + * swaps happen immediately instead of waiting for the next retrace; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_SetSwapInterval + */ +extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void); + +/** + * Update a window with OpenGL rendering. + * + * This is used with double-buffered OpenGL contexts, which are the default. + * + * On macOS, make sure you bind 0 to the draw framebuffer before swapping the + * window, otherwise nothing will happen. If you aren't using + * glBindFramebuffer(), this is the default and you won't have to do anything + * extra. + * + * \param window the window to change + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window); + +/** + * Delete an OpenGL context. + * + * \param context the OpenGL context to be deleted + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_CreateContext + */ +extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context); + +/* @} *//* OpenGL support functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_video_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/Thirdparty/SDL2/include/SDL_vulkan.h b/Thirdparty/SDL2/include/SDL_vulkan.h new file mode 100644 index 0000000..ab86a0b --- /dev/null +++ b/Thirdparty/SDL2/include/SDL_vulkan.h @@ -0,0 +1,215 @@ +/* + Simple DirectMedia Layer + Copyright (C) 2017, Mark Callow + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_vulkan.h + * + * Header file for functions to creating Vulkan surfaces on SDL windows. + */ + +#ifndef SDL_vulkan_h_ +#define SDL_vulkan_h_ + +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid including vulkan.h, don't define VkInstance if it's already included */ +#ifdef VULKAN_H_ +#define NO_SDL_VULKAN_TYPEDEFS +#endif +#ifndef NO_SDL_VULKAN_TYPEDEFS +#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; + +#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object; +#else +#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object; +#endif + +VK_DEFINE_HANDLE(VkInstance) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) + +#endif /* !NO_SDL_VULKAN_TYPEDEFS */ + +typedef VkInstance SDL_vulkanInstance; +typedef VkSurfaceKHR SDL_vulkanSurface; /* for compatibility with Tizen */ + +/** + * \name Vulkan support functions + * + * \note SDL_Vulkan_GetInstanceExtensions & SDL_Vulkan_CreateSurface API + * is compatable with Tizen's implementation of Vulkan in SDL. + */ +/* @{ */ + +/** + * Dynamically load the Vulkan loader library. + * + * This should be called after initializing the video driver, but before + * creating any Vulkan windows. If no Vulkan loader library is loaded, the + * default library will be loaded upon creation of the first Vulkan window. + * + * It is fairly common for Vulkan applications to link with libvulkan instead + * of explicitly loading it at run time. This will work with SDL provided the + * application links to a dynamic library and both it and SDL use the same + * search path. + * + * If you specify a non-NULL `path`, an application should retrieve all of the + * Vulkan functions it uses from the dynamic library using + * SDL_Vulkan_GetVkGetInstanceProcAddr unless you can guarantee `path` points + * to the same vulkan loader library the application linked to. + * + * On Apple devices, if `path` is NULL, SDL will attempt to find the + * `vkGetInstanceProcAddr` address within all the Mach-O images of the current + * process. This is because it is fairly common for Vulkan applications to + * link with libvulkan (and historically MoltenVK was provided as a static + * library). If it is not found, on macOS, SDL will attempt to load + * `vulkan.framework/vulkan`, `libvulkan.1.dylib`, + * `MoltenVK.framework/MoltenVK`, and `libMoltenVK.dylib`, in that order. On + * iOS, SDL will attempt to load `libMoltenVK.dylib`. Applications using a + * dynamic framework or .dylib must ensure it is included in its application + * bundle. + * + * On non-Apple devices, application linking with a static libvulkan is not + * supported. Either do not link to the Vulkan loader or link to a dynamic + * library version. + * + * \param path The platform dependent Vulkan loader library name or NULL + * \returns 0 on success or -1 if the library couldn't be loaded; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_GetVkInstanceProcAddr + * \sa SDL_Vulkan_UnloadLibrary + */ +extern DECLSPEC int SDLCALL SDL_Vulkan_LoadLibrary(const char *path); + +/** + * Get the address of the `vkGetInstanceProcAddr` function. + * + * This should be called after either calling SDL_Vulkan_LoadLibrary() or + * creating an SDL_Window with the `SDL_WINDOW_VULKAN` flag. + * + * \returns the function pointer for `vkGetInstanceProcAddr` or NULL on error. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void *SDLCALL SDL_Vulkan_GetVkGetInstanceProcAddr(void); + +/** + * Unload the Vulkan library previously loaded by SDL_Vulkan_LoadLibrary() + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_LoadLibrary + */ +extern DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); + +/** + * Get the names of the Vulkan instance extensions needed to create a surface + * with SDL_Vulkan_CreateSurface. + * + * If `pNames` is NULL, then the number of required Vulkan instance extensions + * is returned in `pCount`. Otherwise, `pCount` must point to a variable set + * to the number of elements in the `pNames` array, and on return the variable + * is overwritten with the number of names actually written to `pNames`. If + * `pCount` is less than the number of required extensions, at most `pCount` + * structures will be written. If `pCount` is smaller than the number of + * required extensions, SDL_FALSE will be returned instead of SDL_TRUE, to + * indicate that not all the required extensions were returned. + * + * The `window` parameter is currently needed to be valid as of SDL 2.0.8, + * however, this parameter will likely be removed in future releases + * + * \param window A window for which the required Vulkan instance extensions + * should be retrieved (will be deprecated in a future release) + * \param pCount A pointer to an unsigned int corresponding to the number of + * extensions to be returned + * \param pNames NULL or a pointer to an array to be filled with required + * Vulkan instance extensions + * \returns SDL_TRUE on success, SDL_FALSE on error. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_CreateSurface + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, + unsigned int *pCount, + const char **pNames); + +/** + * Create a Vulkan rendering surface for a window. + * + * The `window` must have been created with the `SDL_WINDOW_VULKAN` flag and + * `instance` must have been created with extensions returned by + * SDL_Vulkan_GetInstanceExtensions() enabled. + * + * \param window The window to which to attach the Vulkan surface + * \param instance The Vulkan instance handle + * \param surface A pointer to a VkSurfaceKHR handle to output the newly + * created surface + * \returns SDL_TRUE on success, SDL_FALSE on error. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_GetInstanceExtensions + * \sa SDL_Vulkan_GetDrawableSize + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, + VkInstance instance, + VkSurfaceKHR* surface); + +/** + * Get the size of the window's underlying drawable dimensions in pixels. + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window an SDL_Window for which the size is to be queried + * \param w Pointer to the variable to write the width to or NULL + * \param h Pointer to the variable to write the height to or NULL + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_GetWindowSize + * \sa SDL_CreateWindow + * \sa SDL_Vulkan_CreateSurface + */ +extern DECLSPEC void SDLCALL SDL_Vulkan_GetDrawableSize(SDL_Window * window, + int *w, int *h); + +/* @} *//* Vulkan support functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_vulkan_h_ */ diff --git a/Thirdparty/SDL2/include/begin_code.h b/Thirdparty/SDL2/include/begin_code.h new file mode 100644 index 0000000..4142ffe --- /dev/null +++ b/Thirdparty/SDL2/include/begin_code.h @@ -0,0 +1,187 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file begin_code.h + * + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/* This shouldn't be nested -- included it around code only. */ +#ifdef SDL_begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define SDL_begin_code_h + +#ifndef SDL_DEPRECATED +# if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ +# define SDL_DEPRECATED __attribute__((deprecated)) +# else +# define SDL_DEPRECATED +# endif +#endif + +#ifndef SDL_UNUSED +# ifdef __GNUC__ +# define SDL_UNUSED __attribute__((unused)) +# else +# define SDL_UNUSED +# endif +#endif + +/* Some compilers use a special export keyword */ +#ifndef DECLSPEC +# if defined(__WIN32__) || defined(__WINRT__) || defined(__CYGWIN__) || defined(__GDK__) +# ifdef DLL_EXPORT +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined(__OS2__) +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# else +# if defined(__GNUC__) && __GNUC__ >= 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/* By default SDL uses the C calling convention */ +#ifndef SDLCALL +#if (defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__)) && !defined(__GNUC__) +#define SDLCALL __cdecl +#elif defined(__OS2__) || defined(__EMX__) +#define SDLCALL _System +# if defined (__GNUC__) && !defined(_System) +# define _System /* for old EMX/GCC compat. */ +# endif +#else +#define SDLCALL +#endif +#endif /* SDLCALL */ + +/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ +#ifdef __SYMBIAN32__ +#undef DECLSPEC +#define DECLSPEC +#endif /* __SYMBIAN32__ */ + +/* Force structure packing at 4 byte alignment. + This is necessary if the header is included in code which has structure + packing set to an alternate value, say for loading structures from disk. + The packing is reset to the previous value in close_code.h + */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef _MSC_VER +#pragma warning(disable: 4103) +#endif +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wpragma-pack" +#endif +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#ifdef _WIN64 +/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */ +#pragma pack(push,8) +#else +#pragma pack(push,4) +#endif +#endif /* Compiler needs structure packing set */ + +#ifndef SDL_INLINE +#if defined(__GNUC__) +#define SDL_INLINE __inline__ +#elif defined(_MSC_VER) || defined(__BORLANDC__) || \ + defined(__DMC__) || defined(__SC__) || \ + defined(__WATCOMC__) || defined(__LCC__) || \ + defined(__DECC) || defined(__CC_ARM) +#define SDL_INLINE __inline +#ifndef __inline__ +#define __inline__ __inline +#endif +#else +#define SDL_INLINE inline +#ifndef __inline__ +#define __inline__ inline +#endif +#endif +#endif /* SDL_INLINE not defined */ + +#ifndef SDL_FORCE_INLINE +#if defined(_MSC_VER) +#define SDL_FORCE_INLINE __forceinline +#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) ) +#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__ +#else +#define SDL_FORCE_INLINE static SDL_INLINE +#endif +#endif /* SDL_FORCE_INLINE not defined */ + +#ifndef SDL_NORETURN +#if defined(__GNUC__) +#define SDL_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define SDL_NORETURN __declspec(noreturn) +#else +#define SDL_NORETURN +#endif +#endif /* SDL_NORETURN not defined */ + +/* Apparently this is needed by several Windows compilers */ +#if !defined(__MACH__) +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif /* NULL */ +#endif /* ! Mac OS X - breaks precompiled headers */ + +#ifndef SDL_FALLTHROUGH +#if (defined(__cplusplus) && __cplusplus >= 201703L) || \ + (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L) +#define SDL_FALLTHROUGH [[fallthrough]] +#else +#if defined(__has_attribute) +#define SDL_HAS_FALLTHROUGH __has_attribute(__fallthrough__) +#else +#define SDL_HAS_FALLTHROUGH 0 +#endif /* __has_attribute */ +#if SDL_HAS_FALLTHROUGH && \ + ((defined(__GNUC__) && __GNUC__ >= 7) || \ + (defined(__clang_major__) && __clang_major__ >= 10)) +#define SDL_FALLTHROUGH __attribute__((__fallthrough__)) +#else +#define SDL_FALLTHROUGH do {} while (0) /* fallthrough */ +#endif /* SDL_HAS_FALLTHROUGH */ +#undef SDL_HAS_FALLTHROUGH +#endif /* C++17 or C2x */ +#endif /* SDL_FALLTHROUGH not defined */ diff --git a/Thirdparty/SDL2/include/close_code.h b/Thirdparty/SDL2/include/close_code.h new file mode 100644 index 0000000..b5ff3e2 --- /dev/null +++ b/Thirdparty/SDL2/include/close_code.h @@ -0,0 +1,40 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file close_code.h + * + * This file reverses the effects of begin_code.h and should be included + * after you finish any function and structure declarations in your headers + */ + +#ifndef SDL_begin_code_h +#error close_code.h included without matching begin_code.h +#endif +#undef SDL_begin_code_h + +/* Reset structure packing at previous byte alignment */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#pragma pack(pop) +#endif /* Compiler needs structure packing set */ diff --git a/Thirdparty/SDL2/lib/x64/SDL2.dll b/Thirdparty/SDL2/lib/x64/SDL2.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e9bd603b4ce3dca501b04c27600f60d8ae06472 GIT binary patch literal 2499584 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

kR*|4sOf;x)&V&{{_t6@PBT{J?fvG?Ae*uJNmyG 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℘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%0Dm1P=!TkYRktAzdx5sPqNt(<(@b6sl^z8 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

A-=gHTrWm`<&4-RCv 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�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%0DSE;i<5xiXX3fg3xqzt74OI#$aEoDd>LLsMF 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 z z_<&+35>e#mbf^rhJ;wjh;0`S^h$Q({QvH6fIBc@n|^ic+B47jE9Jlo=A)F$d}Ilt34i$ z{!~Uge#Rm(ps1nFX5h<$!&Y50{44={){j*DEY?70!|hQ4IJ#sVIJ)vC)@<3bOOAgW zwP}+^fp|aOj3G`W^NMbrT(bESlJp^AVl0*nG5!Wc$Bv3zm0p47KC*bLfQcY@ zg*Q?Zx%*bWP^jMEjn10;f)=rH+cM`aeMq#e(Mt9yPj>|x()^zo-^0+~VlQW?v|i(I z(~6~1USydRt3E74=UK0-;M3j)V3#!kul6IkWKg=R;YGbKpubo19iLAdt5?|jJ)Gz1 za@%^2l(6&j{2j6s`+C-A-f&_k7s%zR&%BB^y8^a@kWcl>EBmDPEylti^PdM=xf19t9NHgJ&O}C-KZfy*{cNikS&bm}ukX*o#L8Z}C6|CM z*8C(MN8EZ-C zzFl4Kv~${JRGBhe!B=BXDD`^{0Fi0`x?d;T0CWX_HYos%*8n8y-%I^--Qk1gJd^Ha zU3;=VQ(cdLQ=RIZZ13!t?ql8FkLMoS-YNeNftdlWAj4!yxQC4DA1^eS=!G4=Dv^D2Eo~C;FP1jcgXp62(Se zW^2RA&bkyG%N16H*r%WdnRE~xZ}@=KQM~(k*@iXrmj2H-uywFu`ycebUa?FUfY0_c z^Ul~E$+*YvnAG*j8IP5hNZ)jbc9g!^%=iy+#y@Pvf3vTTH}L!lTJ2)|?OC;#0}Nom zN#2M~B^a>TzcU2_`uDaPvQR%0peU02I}L*-FcNN`2NA!q>Qnjdi-b5T6aF-|!MMEBxB%8Oj@eSIwQvq8eTEJ{%?X zC@OruoK4*+-f_Z5Wb+X+HSsBu%-D&CwuObJUZSGydwKi5?{2JbFO5y68sMU)su>5QvdXl-SM~jRWVHRc>M2qHWmVcY)N6ΝMq| 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%0D3TEI;!{G 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

  • vhjfjse1etqx4bl4cnae|Ek6T0TEbVBaeQeY2Ra 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/SDL2/lib/x64/SDL2.lib b/Thirdparty/SDL2/lib/x64/SDL2.lib new file mode 100644 index 0000000000000000000000000000000000000000..99c5321cab958bb4c2e43583c7866a69972923f7 GIT binary patch literal 183542 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%0A0f)aByo(sML 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%0DP2N?E@211 zvxMo1-ccuCqW3u`#1i%}#o#XdYFwmC2#Q%nh~W9HZ~U^_C%L4!DOp@1CAzeR)l?7ocg3@@j${kjWEu<8j80* z9z-a(!fnhq&cfk@94n*^nS&9$I%TGHBdPtnYUBd&vb>&a#&a88a^a7pz z>7G-(@Sivm;}in>6|AP*^NC?ba~^fYLBfwsSxAUJbuS4DM5NhqyK811jm#3&I7esLGXcLO7>?q`Yem(y4;|y zU;RoCQB>wE@v8p z=mR$sqrZ6#Hnohinumn>_|XH!EJR6j@K(q-w22131q|bv?>v2cDuLc@xZc{TE3~Wy z(k894ki(}42MU=W^DMF|GOE)A?q1crLrFQhBQ{W3CUSIMczWb$%LdVrffEnu2d>i8 zX7(IHMM`=Mp+dD;dJw0Xcq_p0gtcZqM=AI2v3z~|K_Ap&g^JZN{tGrWYSdqWoZ8&f7`LBZsF@B=Q*5 zqexbOMA$8?gaz>7sYnXtMccek#Qm5UxZ1ax zkK-03Ax`};iT7NuL@N-Y11VK#X5kP+Ae;8rCX;)Iv_hd-JgV+qhEHfP6aaR3Ba$=E zl=OYu1ov#+vClShg=bn^EOL5}a+wRKOs2)PDEZm% zU{hvBxoEs3!o3Q32d>6=W`w{6h=c(EVWPCdu1wwA&-P0$uqab9D%Fo~++gnq|4T%< z%0?=WOQf*7P%TKIBCV1x{7DXu9#o&B(SZ7dz}PwWQiR5cOhlNGe`+x^tBw4C!?&7^ z6v8Vu)*v$c0X3Uf@{xJshJt%m;fpC>$d+kYghVq^6&o9v_(Dm{#&HnhDGVx|d68sh zO0-X{BVsEaqWWAI=YaaWK(La|=t^$^Q<5=Plt_n;$8Z?_tch+_TJcbbWt6fE=>aVR zD(RoBmJ`{jS$zINiTqvt>q#c6pF^0F#DS>RX!;T&uzRgPNG zgB)e4dxw!6GE9~L=G@n)IEJkj`roefEu7ULUWecIA9>{&jV*x0}B|7w@>5E zs$Izu|G8Di;d`EYF)lXnbji|w4!W*;r7$sx1yXw-+cR?%^E<>dwy`5ZSlmvf?|F?@V%{t9v`)w~Li2GzUTa&E-o?R$J0g}aP%MjTUXuLwMj%I>I|4Zx$B#hr zcErhegx6_z1acxcVFWJKBk&1~z~tA3G`-!W8M3^TWcjb)Tgi4kQD}1gbQR^I-880bZ0_&igdPHsK&nOF;hYLRHc1IAKL(|Cd<h?qT&mi`mV|Q_-}s$+&AZBSfIWs6=*I4T9+eR1J2vn{d3VH>A?nhq8DIUZM_* zB4f7_;aL;3h%g*TRn=pgH{-lS^9&x z^%SH36P#6aJy!T1QVt0T&({bcVPzqN6|j0nqdp)+%-Hjj6m!$^SGvDI$#8#}X*Rp= z*$G#2&pLgb_B%m+8MwgXf>*cyo|U8v3WOn;vl!7mC`E-zIUdU~SipJZuB=cw26+ju zf`au?L#{WbkOeble2vf}QwJpmdSv@ z=YU2nG!3alkl(BLL=oi*8}A~h3BS}%1~j2U8H~0VF6_o|QbTyi0%HK9Ls&k8my-LL&YByu~mfqaDPbZQKg((#1frbG8{l>dR&#p}438^s%7GuJ`QyAtJTS-~ zcL^o7bhxO&hVecOaA#*H$`#875AM4#W#N{PWeBQ(oL`PlI#lU|OucfAa$)DW2W4F# ziwA(;!vXV=Nw~&uGKbLzIgEg(K174k?7jTLv!i}G{6hN0O#jC`#L^zz=zkTEF~f2v z!w;E3mQegk?J*1PSG|D+Tni&z>Uqpe+BD_|Q$Xpka%hBs3MfUU4}y()#RM*2C#ym- zmr7C4Ap#J7=LlJ)P%iiZqVqqns*@L+9gl4PFk;@9vO`D{`Q33ODsTY?)z z6*3C&1T69WVATEzFMdm}<*)^A>BSX<9Cx4*GPg?ZA$xIE7*~qCC?=>O{TATS%R$%E zt+c6$O-Gx~#DuF8E|rArCaW=P;Z}J6#*sj3o7Bh!@>CX zm_!;p(=!Ar=x6!Hzt0k?2{Dqsh<1qSSer^y@c}lHu73(C4M!* zrKPD%;>(fPTG!*?B8a5f@NJs}_{hBhj>iuIs_n-Mu)z#;ZHD4yccM1N_(bg@K5!V0 z9f<-{c9;^iy^I?NKua20njIu+m#{2B@7i}ud>qNtIu^>;b8YL-3N3!4kpB}VSalU@sr*B zRmk5xK7R}I4>R3f2py=$$-jj0D;d8vCw@gS;^U0}QBM3Y)Aulbv5uD}CZ~+AuZa0W zO!p4(?*-iL;MH zv=v>3S8XzY?i}CAZtpqgBXxd}^0G7v>io=3xm2GulX*qkP^$1R@ux%<_W756sG~@` zeIQwoZh5bx*mf4O3{)j6a%HtMJ9vw-Sda?>r&tsvOVuKC>&z*hTVqE5V;Dv#E5`9` z&)hN{FQ`Y`Ir31O4MYjPR?at?UvVtxnT7Vl;*22n0c3}0XWiik^}@)ES(r>o0i<&| z70+atBpERIA*Bopt|bU68%HqZKq;}%UG{KX2(~AfF7~9S3tZ1^)&5Nmh}@-5k>SNBoQhX89Xor90K%~keYi`mP*Qou=g z*-HDlcP7KXf_zShkVU)gj7|Y^cCdiplmakA2w!A__S2v^a6Yoh=rC9rOEQ)YZ?FCC zByJJa#&GkkAL+kf)(%;b1waAznEz5!4UEnq2}uja4hidbDI z`v9$AH`i3^oH&7jvdmW8yNa4ojBcj(p381fx347nxNUF^md%UYTu@ah7S}RHbSGG0 z^7ELL9X_M^M3|#&coPOx13#t5zX#{E_DaT==ERpXKF)Y9t~2R}SWXY)Jvs5uF}{uQ z;`r;Z-M#@7f7srP%@OwSGk^-O{|G+8*R6O30u!}Ed48b?yXN1HrIM={?F@GPh~og4 z+a})LTk}r|Pudz!zMabunqB?)zJp-7?Eki|$@lX%W!yr>x6)JO4I#b_e@xzRL<1sX zMBDW2#QWalCCg73!LdvM1=H^DG|qu;F#YREiA8Q1eDh4g=fV-4-ngJO5Rx>1bPD=) zrl8TwSkS&qK?TLx1r5DFr=a#gl|Yg-&asUPI_1QsEq+vPX?B_xKO%1qSZ(@SrfF6G znBBB0gT+4q;N%`}BltR|57Lxz&Y=uQ9>DE31v@i_z6d*b#5m`$aRKZ%>}5~!oE>s1 zva+mQeCmQQ9E$A)_>Ml)WZZuTzGA7^1*xw1(RN(&4eGW3BaU5dM9PKVrW}FeH4M*h zNR3dB8HwxA0y9E!!dX6=kwN{^52($^GW|kv#f%K;7YZ$AWQBf-%gajr!m(^d2sKI@ zl$SO7h3A`QWUYP~k{1ecNVY;=HtCm@@-nPnR>{jYycoe&ZeZoJ%|@^tbQSCjgm7cD z5e%aTgD^(0ZtdZU=<>EU^w;}_jWe$EM)n;u&iGuRamE)*Bg3Z~XMC;7IOEpP8{dN) zFj{fkFUpN~aauD+6PLFapjUvxHv22DgNq^nWr#YHhl*|Xfy3#jPvZ2J*CAxI8leAH z7_c||d@}n8rFrb)-yNZ{!Y`a*7FW8iQTw5_PC0v__=bJ12r{uM7H|u~$TS2#pzZfM z9n*2#=uxB|Ahe(b*`Xs%up-LDp~EPme!+(551ZC<{Z>~$#qF;X{N0hL=XZcLc+?-`4SBY$nA>Svpe`uG4wVVvvK>t-?*0nwB>9j<~_?GKG zV~&E(UB#>}e&4t5#P7gY5Im(6q+Eu6D3`f3A63&YR)H%1g%{wc!e4mU228EosYaJ# zM%HaHBHMz{zjV8S^_2no(haB(pRP}S36;h(f4qGNMx@}O4K?_ws#H}Sm>yK?!X|FI z6# zlVk@vv2b5Hv=Sly!76hG#;fZ8&Y+*-Ot=}9v3OrXM=_DE3BJVuOT~+KJ_D$*qY0sw z07!!LJ`hWl{9OPdvMs<{SHjQ(p4ZoqgxO)E}a1@be^W9cmX% zTQY~PPI?C+M^{x{oQ%X$twPOiSJiFQfP{g>C+6!B^-DBYW|t_zjo!d;0dn(HP3bWC1G!Oq93&$ct1<$ul7 zF@gUzC-UU}*PH|=`d@QC{2%bYcFFTTZLF*HiFEt_ckPuo{NS(l%Kz`#D}UZN>kty>it*|Nq@ynHb2jSJtm-du9EawpW(dmh<%EZ2eK}l_huq z?SMiyj;$owRiu!u?Yf8 zA6(;gk*aRM1C}c^x9k51cfC%1`7@xN8{c#fQ<4`wbHv>rSJkad_aN(i@w!;vH3cDf5FF;T1R;Dj^>TR&KL_=IX*v$buji1 zU)O&B!oz*XweP@aC9?M&7w>`a`X^ct_(m&X3Bwhj`INCaM!=|OS6HWL%reu!JQuQ8=6b7?tCt(2pn zawO-1o!RW2FQdrGs+7kjT)NK{r!4v!o@->lt6OXk`gmYf7}(Vtxgve|dB z7^%u?j^W@agrS|N!RLq@*;&!EviSg9?uz-BWZ(PW= z;jDEVfMX`^=~!Y%0(c!WTSAv_E#+r~yg(W)28(*IzmNq-!PaR~M|#(4Zl}hLi&{UZ zGj=Y30zq4wn^>Cec8lF4osmA0%z`yF*ROjYJ1-!B?LBuor?8S42~TL;fnU1>6S;kK zCOR}c8P2rSG)?AHcotkbJbr-8$~R|ssigweImsh9m2&Abaq2JzU2-9#NMB0B+s6$t zQ(N5i_c=Rif8*|`Dfz(tJV}?(DNwU0kzo6>=>}|1UiNP|9=p#em>W#oljnyZKit6& zH;=#1LM|ijB^uQVZ0xDt=kUu7u~*P{WB|vov#J*FVJtK^U&EVKOPgl9`W6~zQ1T?! zssKwCn(cM_CgXlk7M5)u)drF_;aC}#O|>hnXc01xEoTvXBdlT1%yuLgo4<&*QA1<% zX$A$`DB3^4Hfk7;CT;%&+bG&U!8VHaPq2;RQ3Y(HX#WJ;DB3^4Hj4I7u#MV>M*wFX$kmrBF{d$5PP=Vn@C5GiJ) z4d_tOVhOiPn5ryhq(j0133p03DB&&%i@j1LEa6g#?~yPSw9Lo?371Q_SHhJN?w2rU z4IGw9m<$}pWfGPH@JL+3LeG&U5|#lR8I&;3%5h+Z@ZQKS{EjUzM9kjED8ksJj`D46 zd4a@{CJ^@^-^3m&U!vLnh_?7Pw%mtbynT<)@%B(Hh_fvIY8^*fvWh~aj20gG0Ha>A ztJJJHGlmlp?p^Z_`^wghhp*4oGgFI)@R^i;Cg)0_L%wU28b9a=^^2a zl-wb)R1XO;P_l&f?p@28^>*avN&W`X1T-Nc5DEaY-`!y}2YI3h0tVo^(k<{LqQWVhLosB!T^g z;`q$+NAhjQ9|@6`@kipkjq^vcejw`5jOWrdKv+b3|4bGqv>>Qd zCLf%TxY-cQ0)+lZ(vajQ$#%!a#P)FdmJ&ZK3?6nq6C*Y7xcYyQaf*tEh zf;pii$0IKSBw3*s2G~=xaB2oAuIEa1d+*3^r{w*ok~TXsPf2261yWPgGzTb#0&WOE z=6#}0(f>h8!C6Ze_ZZAQuRTPXFC83rod5)`X7lIniL^h46KVFsOJwEn+i5wT=`p3h z@jZfDi4S>K}4zd%yAFGz<=?4LV{w%d_(Y`{(+O!ykmF{mbp8b(oL z7N~X^K*SM$iY_^V3H_b0)8qoL&oPWY1lgbLVEX3R%yT(h)r6MpLlg?Y^-G9f$9P1( zf=KJKl+gZMJUqkxz$;7z{u2iEef zx(G>&5t{J~5^#`Mcpw*=&pzfKf_?;r)cXTskt1>1Pzyvt|XJCG!yJakdPq3 zA_Q3wvTQ(5hKJC93(@E-6K4fw4T3wzky2laZq@Wop^s!xj&pB1#`ymK&>B(qGuh&P z{$kB!72a!B#+`SKE_7`a!IX6* zY6r<PPsA$MA3B zn<-loR1HFk$xPu5>|{Cr`P6A1^Hj#ZifUQQGdiEW^l5yd?rHzC{NfG#7t^n1`g*Bo zlat~1PKI`7NHD{9@dcjn;jE+=+Y)-|$D)Ho0_)^+ z$AS{IGDlH5ZUTKnPC5aB6{KVmfS9w5RCE*d zqF)O43XaepR~2#1F|H*y!tU9Ur7htoK=Fb~Rs-F)`*vggkZm&Ax*^KgGC~0@Tk9&S zR6CX;JBTRg@CbB%7h8h)PfHzw;R)*aWV#NrAdlEN=mnFrT4F_|nTj@KS5%%;Q4ke5 z?I&7k7pAdQsT%=&n{{Q@Rpp6jC!0|v&3I2mH)BI#A`Eqpx)`D(3>26Rx^-2h*12ZC z0%7l|rrWrYA?!lcSDLatmE9(kTbr9c*KZgs@%8Scwix6BUU&kke_?SvvbTltIs*$+E|r0SFnj zBRA17AJlb`jy>wCCL)JH2NYy;kXP!00R3De#w$2AQ?e{>7ht6>u=qgCgq&DR&FbO~ zULzQ=HVPESaWP$AJ_}ZjZR+}VWI=6S>d&R_<<#xgB;MnG3-037boyiG`Ku~Szw4W}4YMSc6QcE8yH z=(NioYzt-NacXy=AFio#T-yCJN}}r9c5mcuZ}*QNdx&Y6vyr^Hl*Ml58o}z0i4d=M zFsYTN@)Ou{&20TUhZK({>7hBb}41OGj%T}4zW-Z(=^u_&H7HzEo zHJMXW5}l5&NX=?-Ow`oeB30Kgc_E7f!I%q|AfVolsY-kuK$kc*yTw`<{17G1#6mxw z{Nv7#ZeSdT1!mQ;$S}N79_~Amx)e=2sOMO#kIBuxV*DQHanrN8d7njpJ7hpcY(Jbh zO}32wgtDCp8nK`X>zZPAS87zpvLTlhqm3M%`GO^y<*9ZBPa;rumFg1#rh&205ez)*F{izk% zp;;;7O8 zHKb8R<_NBo-e1w-?fx&Q8~ZP5@pZq1K*=R7`Q6VV5YQLglhuAYOU->2R9B&G>Qf%o z)1w3e#re+8Z$znFz5*rONd=|8Am>Jj$SSmse~HK%C&U8KxQYmsfWwy{J(gsZLf;rC zGCSZYTpP?fvkxmSLZR=>%%)^kKjN+|u8WCY&t@%N%Qtw5cn9^tUYT!jm79UVddQEs zNGdN()y^Plks}8#y4jZ(za-unYbW~l{vBXaoOxUjX&Jx*{A?R?;~`VOOe=sgvMqBx zTAV1wdaFcRi<(Jrad0HW_{ji&3|)JTaP$j28Ad@fps|&tzu&Aqk~;8E#TUIsbSkL~ zbW?GK&xjtw#vE7S6<6dN(cj}G2}g4&!8zz&*8|n~DwG4%c&x>n&~h_r-*r%Uesn$t zjN2$wt9;3Uh!GOz%7q)5)JAAqS2? z0%Q?O*sXB!Wk0u_Sf%_36?~~ZphtzO?f{t>tE@ubVi&8q{@#7%!#jK4*OSDn4fP zS7E|U3^0a&>H!&DdyTu>Ig7Fn2V#iF=qhqX7x3+juNRH}PchZVCBg24mvni%e;2{d zWcRPp(WRI4=q172f*R}li;>V3p4 zz3u)JCN&}$h6iXxYH=@s0gfGHVipiWOg_c|f3v6JYv5N8V{}Gt^-VUS4j;G@6OJZu!ox0qrwkJtI#^%bQ&LdoF|+Z+hq2lMSO{2a7$$ToHXP4LnZKEo-)mmn#j z`!H8y;ge-mUR~sVkVS*KDPP4X$y(nc<(f^SUaN4_j5A7A2XnIq-K^Ez!pq#zTP@pn ztZa4wH#0(nXu|hP(y&xFr85Tb;cxVMMcvloRDItBRkxzK_Q2A~vJY}6o{8F!l;YgB z=9JM`X5GWwx};q2od(vtO9KI?Aq(mxJ%^BhNc-r(l6G`pQ7^vMavKHZ!3SV?E+C{E|_=YH^~Kd>({omd}8e<;oUAmdn|%I)_0bhp=6=H{qO z7gdw{p(g#IGxtNM^TE2I$+~6ENohG3k<~6Dv9zuD6&AJk^`jUVoPADxlM_ICxr+X? z%Dz4F+exZs2DilezrsG`ato_hSfc3(A5Bcul!|n!OVXvltZWOIqJ8vU5a9r8;GcCv z*m{^RCxKOi^c(AeI1@k2g{bCF7^YZ{Gh;zys~;fH60Uk5B0P!e!+Zb^wB~tS&7P>2 zA(yBxkyRrG0E=_fX?wWQz~+EK6kr7N2 zI}q7KAg!0a_M&KmgYd4Oo#si@ds(l-9(MS2Mt+%**o6hO+x*z|-N~;!8^yrx0i;&9b#m-1VX(T3_%a#1 z05)!_I&D}7@tRXts(HL&U4n^R!@7iPSoftaRe||U4C^`_!@7CkwVcO=j>udA@t-%W z1H*j{Y~I8M?Qi2?P-udC3j93Y^*WjDb51Av1Kb(GSrvJ=b`PTJy)$`bfzjWDJyT=g zbadM07Bq6E++7gmJK+f<3fu_!JoXR2iMr&d;5$IPsxSW2p7#w$_ML53`z@Nb-w-mt z#7(i>(_Hk`H5)ml<(sSIC<}smDUY5|B+qGa^woa2+>a8i#wNhJ5+Ou}5nQE%JqWJR!37AeWzg|X+8@}a-$bFt- zCg-^N^c4Aq^tV0w+Y0^ml78#OBT?NzTm$Vp@R)&rZO3V>8qM3iA9ZX%lp}}XsBn`` zu-nF$VSaITwu`Mr(iGtNgv0fBL*<+-RMP(#D5L>p_<|@KPsE_1IEbG5GtiMfx<+&; zc8+{*;&*gugYj^G;BK9Tl*~9@|1Pv2ml1v!r3wz`8<0o&RF&71C=-6(>ME^9FG#^X z^bf$38uW6j@~XXP9~T7j8B1AG1nxoC`@E@H4G=moiYb9Tfm)@YlI((**8xNOd%Z`% zK>EX=RXDVqn5(`q4AZ}=t?*QR3kS< z(v_5FDq-kMz8=nM;!7FuY5q_iIZW z^5=#WkZ=DBcI(mCB|u{gXar`x_Q$*FvLFlp)+U#i((1G#`LBLl7k?kz4>l zQX>CAM{X<&uQ~@S9C?u^c__rgt5gZZ8yMZg*=QZwoE52`#?|+=|du96jr?9#` zF@JIT`(dtry#ch|V_*DTluDr@IVaN=p;Pqw1ouyIvc&yU*XAdpOCTh%4D~NQ^>r^i zLk%LrT;79U*U@J$W7aKTOoSU@>R$@Xbz!`cZ#>CK5vO1Mc(=OOpuHj(WUqD0!JE`l zCQy@bB*GOh_h9OAl#peP0LkIq%n{!B>16uyqZI-!oPuhZOl5Sxm*?0ckPslqo!k(C zoJMN5*1^$y3N#96{mg}DvGXi)o(0a6f(XCoS|Z##h}enD53n@*G$75AMxv|>%o#Z1 z4k%9-Eh61qx`D3*s#xE@gZN`#eU3wT{P`$euff0L$i|0QJ&0kI2Z8 zb7pCgID4ZDORbzD)MJW&Gjl1Ow&^Wh%zjxrBB@y&DoSdwETNL4*c(W1sIXM~%g>W4 z!WV2LF)AT0yk;vd zm)gvOMzf3XWCJ~9JUiB)(Y3=+%1=ahAq@+lu>|y7Ye&tcI}l|RMkTeh#;DzbPfOV_ zv7dnV=h9(#Ok-tclpgpkx#oj)`H?NVu2$A1DHD>0r6%Me5Qa>-21G@-Nl8>YS5a1P zidwxA=uA^kca!TbW_UjWx?a)*l$vGF1h%${H&p80uZ2}F)bwV~b*kViiCLzvi z`R-^o$VoentF3he79?M!N1r>&@|l(`mONw-v#LOWyk$_IRw9U%q7mDLCgaW!3wIB4 zdm6j3hENKB?& z2IGtjxeI2ghp3juOfWLoFB}mQdhA7e;f)2;jdlUJ4dtu(IF}`PZQvSBEhVUtx95cm zB5$`)sPb%-Ra(tfwLFYZT)rq_%m@{!f$+eka<`li zjBF$edec}SM8Io)ayF(CcR#(l1IKT3G(S&XNX_ePzeIr>F~@a$8I#}pnFr@X?ikOg z3QG*ZN0)KCieePiUuPhjxi!b3UHUv%_Q48R?iFa20}CfGy?(ER)@Vq<%ei*n#d!zL zg5eGaS1O1|em2Mgj?g$cb@?L4z1`;~s$|bKvaQm+PEy(d&AuWPJb@q}Zrr;H`!3+X zgdDQ6AB>ObN`!CL1On*!OxHt}z&B@;v_nsez~li_2f_2Y07&2QUKAGo%*iV~?FB6P<=QO1#OJ2Gb^$A|H&?2j}IUPy^>6J5}8R(?w2R zYF?pfkxiS?WqifGt?Sk@a7%$H;sVG`-C1NVT_b6Dd}wZ7fnORcPGF!I{1JwpB_-$a z7y$Aj<$)+O=7z-26%J^Wh!mNP3oUuO zs_aJW#~@x6VSU!pO~9^N6k!c2&(tCa&S5}hxm+P1XFS5EsQnoOeL~NX^DPsOpJ_h> zU0|ifn$0ATgiO=KzRb1wv4k4*rDxK?a1LgyK8)FwWm*H2Jz=jHwfT0^S@x}!tcN+2 zMIxJMu2s@PcgB4QsZ5#goSWI48TS>5FXmX5I`xcO@wCx@9a^eO$6NgoWs$@y5=LEO zMhf@AHJSpxxm*Uqv+jC9Q!Pc>NFongb!5W!KM1%4bnoKDL7Qe5_gKgS*zKaIWg17e0_Nt?K`AZ_)kkjlW|2Q+u{F`W-@!VCGi2udtQlWyX$fnN^nxK!%6vkN z8RvIai(`KRDHJd$h&WwQtV$h@-eGO# zWPL)1pplK=cabBgXEN!Nbrc=UrH7@bC}H#>Iw4ogIUSNUr;O{6golYW>ab5>3JxQO z{o&6-2TMDy*R=ka*a>^a zfkep$;EJs9N;_nQ<3Oe>D>&3@x$J2{vr3tz^Z1+Rwj{NmGb}TfA)ZC`X_Bp^yk&~aC z1bcJ&RzqIqj&T+Vefr!eZdqn0@uC4cM(p$RcKnQ!h+IvM8qY+H*nW>}Ytq&e8e!(> zh+PbKtw#Sv=&Qb?+ULPY-%;)FV0h{d#KG4Ayc|p&(asH$KK81EZw!GpT97-%CKtrD zeVRzk2kzzlzwi&q4cdOT6u3us^r&!P0ouo%mKdU?8}1AtrW7%Ym~d5~mmh#X#Kd*5 z9Ej?26d7u8O)buD=A(rcgk9iOU#pB&1K(;?wHJ>DH5tE6f?(Zkt>|OjZI$X=bXy@% z?si=j(z45H@MM=Y;K?rIRw5qIFU4(X>@=>sKp$$l_0>`|B}gQm5C0Q+qaYRFo4w4a zyis`pOkQ)#$o}*5wn)e9KAN{<_hDL8oQ{ITPldWA2w;jpqotrR@*Y-b{(%r8k{T}s zcvj+>k7pI0KD){Rrz-F+bQkGyt%9^A}&f%o9<G4{EiO}^hw48M-yMf{{}*i_YH(x-y2EJyAFARpNwgL9!CH9r0=&iePh7&z3qDR zz;)7y7aHF>baHGclM?U*yTIgeJ6QO5cyr+Ljor6 zApw`0LQj7C^fxsDUrbr&ssJ4;2=R~&;zpUHlwpn-t4A@(j3m#`JF@#o-Y>vHIT4na zBZ$Hw25A@N0ze<^_1dWf?}Krc0vo3|~r+kMP`VKN?`wmCo2nE_xouubNA^ z3BQnex($_NffKP%zg>r|We&uzF#B!!R(+lxU!!J%#q3TQs}p&TBS@^B2x#dEfR<$d z1-e{NuNF|NX6ytY&^R%o>p9ZqN_TKXasZ@3|1+pxj9p}cyitm1pq^6qtZ~d3>*>t+ zIhXYRp7`;h%${!?M8~eQu9|}x1$|Ov-I50mv-&W*>GjC3k0Y+oJd&5hvtZmr^52|W zfM&nF7M{A<8nA*Kf84;9Raf;hG}@CqhhwU)6#XslL~8OUnQ@jgkCc5wk27;O#xG#4 zgfd-a9yqtrzYEQE5d%)^PE{k*kcvIW$!g2g-OfP%4v|B=BCk8uRb-(yQ^I-#Wtuy& z5FeqG{R5fTk~Qgfj`zNU#q3mAeDbkLPM=jvNGn`L_X1*)X(NYQRD!dq$Q2!7Y&C6j zWXYMc3ey`i)+VurO<+1I=M*SwX~^-|Xnp0|5HoSp1W1sx1-&TK?XM39A~wFG8<2So zGxY}!;sFH*7Q+P`Vh-V9fzS~p#i0cIUY4joVcpgrIE*y-Uc;_Kgf^%}pH<<|WRrZI ziMt}OoU>}G^62Zi97?vGti-Q#O3AK68qB7su!9v{z>0L`ok+<_I`~A{l-Vlr4CBe! zxCc+p#tZOl0NlMuroQCsdxr}mBYF!kn9xV`)+#MY=I8AVM7zA-Kd<85#%A`<&U?+l0bg&D-K^^27|1urq8UK(D z@{E54gSsVnTdCjr@xa?EzEMFBz!o9QeW=VDrLhC!AYV1MOP@n-Hrel0>NcFC6!*z` z0@~cj1(fvSAtgx~ck`4=-RjS%`rY%tbR(hcmZb+N^6(6lW%xNX5zgld*a2*xQX|`R6Wihiokalg){jj1%eSqIc@kHLMoaxwIJNy zi!h$8nALeO0~w12Z~zDzxk64pz@d+I)`@jszG59$untzRDlp9QvJNX@eywA+;Xx9{ zM;@6=ee8EO?!+qJm&M;P7}9H?eexYWeXi29sg-{zAS6^TcS$i5 z_1^=PAiX1n?lPaO=z9qtaD}ftodObl)Z8WpocmWdX|jHZ9@+tE6B~kOi}P&dlY;qM zcq&EL?c{nlPXP)Kfi-eWjO?3Iv8jlZZ`@Uj4{)|X-EGVJNwtAMqltcXDrp_jEqDq_ z@PQ0a?@e(co#sOgjw=InH-dvYGbJ91?Dm>(p(joSbVw;sYFc0+-1bH?zgnbyA;gA| z0&87s(I;7o@MJ>3%xpcLk~wwn8h(zj`Pj>c05p@!d*hp}(3LVJ8b&1jyAh}9SYN_x z43NX%BHrK^aC`}|(!Dp;zZXD^O^M@F)44ab#kn_CzR10)tmI@ds_pJ3w9)@%K&`4|45_)e!#L2QrlBnbfQD_#=Tk&^w9mx8(>=q8fXzu-e%AL1 zNBfnGa;{%d{e_Cj`*d!w$t`?!Ri4_^=L8lk{jLfQ`?_zsDV+v$iMqmR+h_cOk}w|fDV5v}4YQYPwzzeTot&HVu0>q--( z0oI8<0`{3*`V_VxBB+Ps)w%armc;tVH#rWvy7)U491+l~vzJYzfMe&Z8vJLZO?g z?HD9Tm3qSr&2_3xkY|C=73I-dZ^gg{GM55Vo(a*ZXFgm>3@?xu0F^;NFIIR&w@Im!I_l%47g3 zXX&x3rL{85&_r1ATAMhsdt z;B@bPf_n3E*~2@38A_|kl*VzS=>{r#7`6NDFDH<~59Z*25l8Pe5pFgMPd+@@L$=HA zK^KU9mP;wnyz8J@7RVW94o%4x(T7n3LqLA=pQ%_xJ}E4MTFnlN=>H{>sXB@nT-`RQ zx)MB~21c=Q4pfctpu#(FWe=U@-0k}l@|w?JxjG4GWVUk6Qo>z0nQKw!5a6P0fH9Tp zy}vU1wzy2^Wynd_ctWB$)$G7r--h?jUY)O9=J3myk5?s6G>@}x^%<9YIS~AdKrolo ze^L+*Ln9Xw#s4u7st9DFu9ToVVBDy|;DX=;FyIr=?$#hwvJLM63n#+>w+(nNbzK$f zHuqzM2qB?Xi<36{P7|1Y(+*J9b`rR(yAm?DA`{F%DOGS>B=3Rj=hD9(Z<{#Yc3j0v z1P$|R_>A#@a;npMYA5e-Z0*{2!$B=DUH(67W^x{@)8mq)DrCyt%}_3Vdd`sh#LKY# z8m^YR#HrLoCUz5^z>N>mg8i}EVBWJCR8Q<6QntVU>q^|*=M4<9xl@^dx+S>Q`Ochc zqVMqOWkEO$>`p}I!ce%`S7tA^(nMAc^6hYYnF#xD()t~9G@;3C?LhL+0?AzA5jjH+ zps)w>H5k$Z?-7i5A+|)_oL&%$IVPkAEdc8O_*_W6e~tyeai6f@W#0n3a}-X{B{JvZDS{iGIg)Kk z?3z{e90+hY`pMYbRL?=nsg9wlTXH`LJHvHtVK2Gq@;o1gsv~m$-W$@H9dNI0)nbDV79FvGjH0KoE%xk|My< zAfO>DzcCpaW~XhSD&bNxZfKNs5a2>81m;X#_5!5Eyrt9OENzb7Zn*}t7iTW+Gs^KQ zH*(|xPk_jki!KoDRaYHL&)bk13!H`%ynmc~^WXrm+LRR=O7<5*o2639Gs=>DBTpnmfL4C|3M3hVH2^6_8{f3>{Ms zv7%nYirS&1Xc`Bg3kNu4l#ZT?1x#M*E8Z6VK_?X&KcFPk7L@XHQjpmqoYF3+#o?cZF88)ARLXe~)-KB3Q-iWLt= zVF%sYgKJ`^J7!^9fe-Z%OIKHAjNI z+m3Fk&_-@ob*ittXCt?|E*7M3kE?5wa@^bFP%w(!R&2`c$;qEWT7!R+6YsYzxG(!& zSI_n;&i%HBmh)QLtov>E&2h_+5|`#&OY7Wk z+uP$5ly$%D@CFvN4=lt1CcZGcppcbQQ2Rvp+jiZN4Q)Zayg8-q({EU2I8AF?o1OSj zqd>$F8bXhs06_)FIq&dx)X_K(7Zx9(hy0^vla({SuRxWBO&0 zym$Z;^2o#(@#>c)^2MiL2IVDRzi^Auj1=gXA$cj(FDvAwNWZLy3M}(LGS|v;C9x%-}Xm1Pj{kDcE9bOxtaTIE4wDV-*%7vkcDzU zO7;&&z+v{XNPW@m{m9KXvoK)ajWGO=+~=|w_rBX!Y}<5UDeqi%3z0!}PAo69_Cc)? zye_5f3o_>xeo#{h&`QoN8{@7Nn=L%hpnw}%oNmZ(AXRZ=f>MvnKZqnzQm)_$7w*>e zfYy;d_j=tzT(3*f5=qgjRI?u`qQhUGK9jfR8qpx~*9n0*14GbWVWpCG#w`t zCtR92-nQ4ci~7bq??xfGvKN{%0n~$&aG<90GtnoLndTv6*t4Fddn3)(vy+``V?> zZNkZ0Ikz3Q^Kb}%;8g?~9+UTxA95<|*{fY9*q=}myI0P=dme|h#@6QfG56I6aIf$~ zdVh!V3Tm-x3Q~W1@k67o<75XQ-iQ8P?;9R@6cz5VKc&GaQ4yJEe}oP}>>Lfo30Dtq z`f&Q{VSxwAO4LN~D={VQ>uKX4=Y7LPC%tcY8L`vC9>7<=(A=8*i`jMhg(PRq(;`RQ@maL2SfL zzOPVJm(qAEFTWYJg>33r5J9+D$Ex~eqT&CSQoh`@{a15`7||i zem?d0nZxv>#`gQE{An(Pz-KafaPE#R@H9@l=vd!!0?9<=bW1f$C zJX9j%*HWkfl;=hMGvypdQ4Hz`shf)F_D4J4O3kM1&!v#CjvzP?+}14KgO+3TxbdEG z@hH0thQit$^o!aU^z+)LyHMMDo|cxfh&NSRenNeSaI4Iz&xvQ1>3FxWiOO*c`Ll4V zTG$6u14TUZ{7>4QJcCRC4I6)7v8Inopr=KJvBBDeO{`8BTw?+Oy|kll4wnwy9eu}} z?t-E+9I;{l!RX%yl&kBhGS-f?ML17wm7P=WD4{IQfMDC9h&D|~?PL8^LxRpbzWKpz zEjaGRA8H9A7TXt`6#^!Nj`piDiyxU{(gK8s9PGFSb9& z(?Ccvi1(Y503u#W0A}=BvNMNV_F<5L;o+dkV~^Z^1S&0+Jn`C6>~R>9Zd&vs$aCNc zu0JNoczD4C8J+wzu;B80jWDP0{1^s0Thu8PqhaB-Dzb~sMf+Y^=HvcK>~_4XZ;MRd z=#B0Se;68u&>RY?NH4zN>?Hp{f#6NvQ=^E1MsQ?Xp>tm~@Co$1`X~~6?kEDkflaJ; z4IN#fl5bu$*>lNF`3v?Fv3S1|?}_SsrcG4Ks`9`?GP%PS)LM)}k0&nboCS&;5`)$m zg|~79+8+W=uoh>}FGNxmIfP$SUI2t{fsB`0{3aqWO_IJ5l5wet76Wv4o6dmmPM(p! zERWGYgfdaraCSa*XIV5AzDg+pW~Tu2o(f*f3AM~$o88|yu*pGaW<6JmF;eCr^s9oRrmPQ#XX{Fc#JokFpi;sD&0(JX(TqxCgU*xjGAQpW&FUv3aSvEo@;mXuJEP*y-a~ zncb*;Mm6G@s1G5PC###|R&_Z*WoGG-xh+;Tc(sVAPP{Jkz#8X#V$)}w8n*5l2xFtOe&Y^}oBX29V=^-pbe{kIL~ssR*##7IvqUV#_3 zj>}GO;17rsh_m8b5#d*LJX$N}eRkyewR{vp3jmJ-RqMqgpClqxNhNGcYVk`_dH|(& zIHf}`8s~i-q8|$PZ>%2X`wni9UxSGZ?Etkn51U+g7EODfz~x89rERr6^5msWLdd>Kb_opi!pV{ z%qdeqIs+D7XVO^ISa>gjR-D^a@O5kqaL+mwSUQTV!k@pIPw%3ekqC2&X}fw9j~qa; zdLOH3Gdh?SoucwJ=WF6lJO3i=W&>znCki6)_weZrtjEJPK8uqd+0k?;{$|h28NEQ% zi$=}!2UfA(NB$r7-aS65>gpTMkO3w*a)L&Uno3%yHrCjNiZ-dS4U#|<&`|=$8kJT` zsnCiK6G#;?aV9XQ$HBCy#d_`IrCM#Fl}7GnxFq0>fFg-k6qPdu6}%Cy^ZS0+-e=|{ zfKU58eSYuz$LmKj=d88PzO23W+H3E<_S!6V*B?{zwCo%BuumGvuc3(S z|Ehc_mx(_6;7E*j$oIqWi%t*YjvO$Jz_g82Bj3nuWQl-+$ZAs4kdM0FSoUM`;K%Zw zwugci_m0(mKDVBA|C^F$=VB$RNB@KOnNrLDzW#?DZuUPp`jE{Nne2c4>E{Mnp`5S| zZpn7KpOmC`uS2j*Q4Z{NAn4uMM;_kiuo&I*6iT*rX|FzKur%wPvarJ`&+#4|ZrWiw z2V41$GH?}Z>XC~T^tcZ^kRP$0plnQ5+$4US`X~%Q8T?C{ph{_i3y+`)O0*^jgWp;c zMDgg-1S^#$cn?AZ`%CG8e}Lql(*tE%4;=RudZ7Q+&;!?_k7E9w?*EI^{r`z{|CauL zPx@W@znOlQ{y!tt-&OyglzKmU|7SsU|7TgzUPtf$HDB5P8Cv@&{eS)ctp5)`YX1kO zSN~`DP0$j}j0x1UkcT)PMl0hW*k>>ujy2cVIXG#d?e^g`XfMGj1X{*xxjHX4 zdFiu|fsEOCdL4&$`4XPLfHvB5AZgsZ9WxTaI% zASQUTpALSs?~QrmQI{d9{Y#b~ojtpWa?mE@fFJXy-g3~5Zh!*FIB@BYAqS`@#{nl> zndKk^AJo6m_!6^pW;z49jzj-(&2uQ-h zmW9p2hd{ubP$Xy4nYbM=rbC`g#n5zLJ$Bm0=VBE0TH|xfoB(3y3xmNNa(n@#AaO6H zaIs8?R@>($A@Y>ehp8Pnz%4T>yqd2^z6xAunXm2P+1i_x-IOid|6>1IL+RA z7sYx;&>CN6AuOghPzFPeZJumbL$sIxkRFbz!}Bi=fRmjy__U}R?TYuSu1Q=2&me8@174JZk8s0f=ysBA=bA55)AM;$*N2V2 zY%FR14Z+^^f&sc+c&+cM#K4Dq&O(K5ab>Se#r8>rRlYA!j~`U401%E-)^e^b0N|Xw z#AA;mm*KT!8CbcRnrkxGxQmf-!$EKUj1v(&6HsFgH9^Bcp6?1BXUyRmeZxTsjo9eN z^HLh|tFmChqoE3{AXndcoGL;a8J9RQb?QZc3(XJXAM(6UncQwF=es~`EL_cwys=ak zeaf&Ig&8G84D zt(BlEBNbHxmgV7!4*EWz-xHEUD4frhLk)-zxAPqkhZ3f5Ak_;$#PtWLmQG$aZn?@iLKJTy>ZUu;<9wVgiuXi3%D7?7 zyBl%>eK^9=yR*`I_b-^6Aln|}?_&@))Jyd4)+*@T+0?sgWobHRJ7-#>eDu}d$KpFW zcVO3XdVF%}T@<(!<+g)p4lpl({?DzZKzOZ=Kn{J{a8LqaMl#S#`OK4lpFOJ$OC~rNY4%%BKE0@dFf23oq<>$XV|A6GKHaTlsV%B{>1kb^3(!uTL_iMa$SZH@Dw9cgm=hMmcz5GJl84T{}_mI}n*>0>O6qkRhT zFTk3P{{e;;)EX0!^K{8k;#85JNf(*?AgVV%w3s6KG9=VfRM&s)UlCO_dqyJYls63T zrN|U8*-CZPi`c8M1S7&X6+*_5pHp}AYzQAG4qUS>!Y}s+*mV#mk6?tr6eHs2d;05{ ze88T9s*@_!xQdf$&L_T=_ECVnluX`Tj}o#^(+Nz*zL~$)KRC@IFhB@hDL zKuzxP?^y~Kx{Az)Dc)eNpR$eL)O=XWwG4#G%U}o3!bfTONsnhTNMlgzdV~!v2Ssbn z8tFZ=J#l%u0!?bZoSqMh6)`JN1_l`mXH#dC;jU+4TPf612cAkjYwUB2At0+k1o~2S zCU!mAx^Pb?);VxEncsz~Flbkr2hFXV?}wnL&^RVSM))S;;~H7SC&=!;4)0KDM8n0+ zw(*X93UQ1Zn#i*zj051F+Labl+XoZHZbR+~Ug|NaN#^&7Re09+0LOQUgsk7izJDN% zm-+p?)H{x~Q!}3omSBATvgdm7waCZ4UVJIudyUWA#64T))I*3Jq2|;h)SUVXh^-pE z^Oz&rL2c_$KDh!#S){tnPrE)X|Gf{J5?DK2BmEQO8E&iP8v1BUcC@UUxF;a1&JykV zNv@+o(Rohd{Fmk{R!)=ixyEOOck=K206U14kH5%nC{5de=u}pihuR#?ECmVY5+WLU zCsqux2^}|b7W$O4*)*k1BdM(0B4(R~dmk^&wr0}YmdVf_qzl<7#1O=yZ0$N_Qd3D?PVGr0mD#n& zS;5@QX+Cou)JH$F{rud}d!Q|4p)t@DLY5?roe)Z^GKg`+u7=Zm9_ z5qX!AP{DoHLX^MQ8V2PYnrJod0vu1N?ZCVAb|Ahjw91s7Oo@df(72&ijO4Jkv8Ti@ zWQ(Zh7sW`OgN6Qr6CQZAD_#}%d%VjYoWkm93lOrsqRN+f)REocUdgJ93GzE;x zZgzzk@H3ftjL|$26~A_X(R^u^`DqlQ8sC;3e>XP^F(F>&pH1<1eOaqZ?wW>@f-!}m ztIbc1X3!bUpH2dci{FNnb@qJz|zT!z}z=Ah6bZ)?5TR(A=&=-n3`0C@UJbCd{ z@YaS-4D#d3$z;xMB@5i$C@iTRU^SM>Q|M%{mm_;}+ysRMYjHg%kU(UV5mAN^i-59q z`a{pi^+uDL)Y(_`M*CeA4XE)4&}>+)h5%DODMje^lw?ZO;X;X$h4=R{=1d1eQMc6I z0rCX|`A(L6Is0t916nZgJ{9m{S^Vn7U)(dLdHYT-$M{RLvN}wLJlZDQ6?p^`j0kD6Ijgk7#QzF=vV~bs0C(^ChGF<*vWEL1z|o+3u19CrP>_);kwVI(okC}I;GYUXCh~rpCwM@psV&Lxt^)w zFsXN$?|jM8UA@bE=Y#aS%y(W*z3au4RVcg~-&5-;WSm~dChs8HJ=Rm)>)3N~zEG{F zXzzQvYMfw=mo;qK5!Re~R0FFAGtk)2qVUP9%x=cX!Tux%XSipsgO8k1$o=T_u1}o-(V!R(+(pZEtg}zTcAb#<5+u{@c zwlzB4A>G>;4D@*UCUFdkUJ@g-YU7DR&}EoR(-`7?sYk}U+-FPPEqt|dh zcO%GU(zyblUX#xIAl#^KX`&cesM+VMDS21+Ss}){$*4p*MnYC(syIxS8Req`6T>ZD z7(mmYi6XzpScIziV_p-^n(Xu7o)`(RA5qh(_SpkqoAdh?y31dv42g26{>hB|RY`$} zl%S57!OgSqZTKLrw`=0V8s8AP$!i4lFjCO%ghEZWN*~8hFucx#<7PZ7-I>ubIuPo- zs=Kqyi>EqZaUTXzRh?HIz|ui@jmRqd4japUY;0zRu@DhYGG_&9I{SBA;_bX@SLaA? z$0febt3EH88kkypHz(PJN)4gGSzVqh2p`0~8H}zB9!y3dW94I*q;q3slkvZfAeARbD27$aGxf%|s*uIIL<`UE~Av zCa^?RVAq3*7a*A7gC3*tMivJrX2~6|A8nd-fn)0u ze?Zd0F?zvhjxlw!BR149_nU2EPh_J11ku5bh3hk+QaU}%&{zl&@4U9VbC_i5u{*Cl zV3r18PO}%Lhf<0RgB%>i?0 zAl%wB>Fb#E{@P~}uRwQ5uizl!u0?lj=%wb{rdp>mp3(I{xA@oV@g=-lOFlzAevZt< z12b_gRTj=?IOn5iQP%pcF*(-N*^VZPjqt`wUj%bS9H8^ObkOn!?7RCO;wiJppULw-JR73 zO1f*`#rkfGKG(TMjjzz{$MOqvBjQ80Zu%s?!)vr|$ndrox3k*Yb*FMYy~7bc8PC)Dx}4qL zsX3&zGA0od{W0%HOqhBPvR%gN{~m`(S^WgzQ+z5fvyGwnG9b|LPOLF^Zs-`{6^lMs zMy^}{`Gmi6EEJm1W6a~ep^S&RyxzC)^@fh}x4fOO4>~^Vd=7H}q=moUH{QYDJlOyC zGv%2XojC!#=Gs@m)2QRv#bh$Rcq=aSP^hGP5Wa*dT%Htz6sjQ5VlrHM-$v&sdDCd5 zpWvGvUB^m!-t18Ak=Ejhd%GR(Ef$Mi`wxx=XH;BV!UNlXpLqgF09Ah684o@w;vKc;9Dc?tW7OM7?$^Q5wIWpe;2r^cS0Mn2<9U1T0 zBS%4#DHQY?bQ_!qIR(d=0j^Z#(&e06Ard$?TgBbk-xl(m8_)!A|_pG*giv{Wm8z)Ol4z%mP%KUa!4t2qLbE^e*mLKL#bY zPg4%OC3=Cf8LZe9g4Qqb%2a(67~@>A_+a{AyChY`kn+v|Qi7sP2e9Q4_c+VTQ6W`k zP7djDe1tNyg1yU(h?G73vdHdUp#Qqes=O#mx-q!>e~YY){f$j?^u|z40X9=arpoRZ zTI6Ow26YzLYr@$~x^AsY|tFZrS`H{TaG6atC05C1Py8*19$YzyeZYe%R3PG3mO$AE(UqNDkrN+(6< z{is*x{VnEO=w7nlcE@>`J6@fhRA78^`Jer-_@6@N5-)Qo)cVYrw+~fIO%GiDsH}kY zM`In(#y#e5x*oD0-ga)a;>1>0d6j?amLvP8Ci5_#Iii2+`@ppI^iO331-E}1*L`?iiXJhH(^F*)3tH8= zR$U-AEguudfK{DmmE{`?_k$G$)-Z0U3^UioKgz?%7W)1LPGscoUZ4UauQs!3Xs06MIv@E`k<`lc=mbPk&_?qK@)@UZJ0`i z)p45C2{h-tX)0df3Kg$VMNi>}n73JDc^qi89e=^?R?CY*jmWuBX~>|IN4JziN*Bbz znA;Z}0f6&P44rrZ9SDpF<6Gkq9t4fuctj5`r}F@Q%igJ%-^yzB>n$f9JBawP?>hy1 zv2n4T20B^!WU!*2#E>r~Y|k@Ta+GS`SY|!W<$bF{d^l*~zyib9jgO$9tGH$WPE|ci z$1w9V^Cfk|JX2o_()#l=jPkd2Cm)WD0o}=c7|LQ%@hsm9&vI)JJ9%s(I=S5MlBx&2 z9Z(;sN8%iIOY}!^${9K1`|3#B57`pc6UG06(@yPwaVH*iaKFT|@45Xi)Y&(E&*5rv zO?%{*(VvI8@i(!KLLZ|41geL1K&8{@!X&5Z%r!E~v-=~(N7%B!QwLjjmU_z)(qHzGw!hFOU_g8bIa`H-P1 zE+>AQ?K3?%wYu|4FW##0RT=F1(VbWNP^21j7)7|;9G1=G!gYBb zOgv8h2pfG3>pU>3xCjn1+^Hg)efpRMW<;`->M20QaHt`5{!qi^{Gkipko+Qoav`A* z!;Ja9+aTQa_UZM#8<*J&C&l304pTRl9JKjhBUK-rKguwx!DB8StAXM+1yQV472d%w zd1r08!~-|&R{+5vh40ih9WZRc8hwmLt>M2-MvFUY2?CFTP|{p<2u zO594AQeDbFu(1V8ig4&*S5V$~65uk?{9VUS52Dd&cV6a2@v0N=Vpi#VPo+a!S==S& zU?IqSHU4p4_z-SVsKc9MGqr`eiyD196jI}D%3#(PW~vQ|n5w_$nK71`FU zUh`FB;jV_HbllvAB>m_@*$qj#Ul;+s=vP&H8mu&)M#u5n!Jd6)8-8%BKpO*}Z;cHd z&lL{c_t>lKS5J`TjVg0kE|twzwi7BaLbzvWn^N~_OHr2L&naL`nC z9n_ro){O$SFi9T{HzGfQ7Ln1^h|up9BP5+0&q2LpurwkCc*FtWXOm)qpyR_xLhMO% zSdQ$4*Y>xD;YcOU8P;HUfc_>Eb4_mOF4yYIz?_=B(6Js$R*gGQlMR9`Y zx=IgD@zR0m&(KT=1kR4NkNSAJw9=h`>fZ4+m=n@|a{d>LclYB(sK!_I<3D{H{R8KO z<-C^8mwx(2`YYOKsh`6#tADTLm|qdJjDi%14iT&co5cudjLjwcySF<%v% zK!#YVYq4$&5NFRS|TYtgqQY(!!uz|>@xC9n8F(!2Ag!C zslo(-A~kx`KJ!&jK>AGy`3{0u=^&^f`e&DIq7Nt!`d5M#bY`Geq>FttNE8p477|IF zWgG3TGZBszCWLNFtQW3#-FtuQ#)}o^{$3Z`VFB~Pvog2b6+vy4JGh^90*SDvw^-Cr zEO??<^&?SbiI=Ew)&8cO%a})~I$MwB089{Dw1dFeNPVtn~KMCOJ>`-#U-7RO#v_I$*o zrmr%mKWgjrZveeM!Y>mdrE{v^+RHi72zspIIq@!n=xENXk?ckYcPZ8c)ey)d3vI)4 zxU-+Ari4O~DY{?upqs1cFfGVPz_NGI4e3Ewr08JRXC!=@4(YR-B)ZY2OdszMR@}v& ze#bbJk?6p?oU=0`CN`6?-twiir<^xR#lJX4`!k1M0x``tdlo>wT$(Sz_bGX^#)-jy z>TaZYy4c3bl2CT1j;rx~rVG3GL)g4nYKEp`(qCuN737Z0Qrjvpb45wpaau_y4|~U& z!gJ!0rx69LXZkX3>-4t{(B($@C^lDXk$xOdU393;QXRn~F_{6ylvnqyO!ZW70{OVp zo9m>fnJ_b*l9Ng~J{5j@CEO(IWS3>BSp_z`TaC#6kD(ljV`V;b@&WgFHJ>h~*6>1( zLhz3#Go}|NUIaDT4ps@Gph91fPpHE|BzXiLox>AdkWz{zsJ4Gj+8R3h>#rUxf`)d(0oO5ewJ;*6_z3I|Jtk`O;>$YVbOHs(yljVdrZ+ z><)V(o`-A>AIdW3-i|Ugl>US6uk-*8-5UPH6HaE$oY_#iG6lRoHYOR~>z(=2hSC@v zT!nHRxR4u8c*1+LW?lqDikj<%c^XmVMw}k2lw?kIC4<|QO4h*vIM(BGPg6e<>x7{-6}9Ec+`p<@OcXG9H zVmww?XACOy;^c?^;O#}{vFlUSAb1|Q@&A3U^E6M-W84gImobJ6?q zD(MDSIvL{QBIo1!PtzYSQYCZ>JYjA6MVCXAGTAm| zTt7-T`wk%3-h%-~L#~4&8}g;?DF-=Y&>#*crr$v92EzUj7hsvgF`+bM{SDwG!7mHA znBa#Lwec%}R|vS2;J+#G=>$J2;4*?&EAUwa&l7Mt!7nRtF~KthTuJbI3Ot&30oM>*qQDV?Ke~{W zpFr@%3OtYCR|Pzg;Hwn)VS=9(Fx_1uQx$j-!H)|VK3hiQ76o2O@NWe?jo^6-+)D6G z0uB-UpaQ=}@O1*NBY2SlZzFiLfM*dLSKyBcK9^vb5)-pgVfGSps$e1z5n|p{n7%gv z;}J|$W4aXPcw%-8V`>~1_|0C0`8qK#3Wm#@#Pp|<@&?W(=4rv)sWB%gObIdf2!@-C z{N{9psU+rB!Q7`YLlkBlF+UT`LmI<%L*#QcF{1?Yh{oXB0%E2RGej_tYs^&&Gn1H; z1oM=}{6b+Gi8+X#VulxK%uI#(9WmPlvshyq73M)=HV9^k#>`ikKM}J~Fe^0Xj|%fQ zV(t=5i^eQenB~OWESR+#vr=K!6Y~?ntk;<56=n-DBL%~5PmXpf%noAC77T|dVszEGG$#O(bMdC;LTnSSBuz-hp|EtoenhW_N>^=ZVc6U;V^8LTj867!^B z-qV<~73N%Gek&MTW6oEY3SwpoW~atn1Ps;$qc>th4EcEmb1i@(M<4c98L#jWhqFto z#1*^IzyS4S#S*wa(p3lF;BSWglL@{Idnf)hw#@F2!G<*33b0kN z9!78CQ9P#R4`dMD?a;NpjKsk7OqQ9}kWGkFQ2>WXX4=W6N8v*s;Z|fb09`9(9)onG zvMYWlLq+2aNUCjk9*YFjBjm#$6)Lic`e3+Z3kq&C>5_Ki(Opt&+*^MR`CC4iiyKhx40A<; z@OaGHC20GMWi+ykg1#--RWciBF`2(zjK9X9hKKNj?7xkI*s%)~yJUPCUWjjqN}s-j z$f~oVfZm8cr}n+@Li;ZDA}2KvuyA-DMH~aJ9HhiP5zfBhpAY}MJohn{=RUv$KYgO` z>(jqp`NektC&vbtpzV^&_@^z*gPM4_)eQ5v1fBd~b%l8vlX!FfG(5$Aw(CmT+p(V< zSYu_fW6gjxfsl{O52(AVp2n|Lu?QVulvVKpYCubmHilgS&0_Vmch3+|4||vT2S%yO zD!J^JG)5^O%*$N}&L`1g+_8F=+f`rPV)Lct;Rszu`IgpC^uwdbb@-N7(6j%J*%a(v zW|cUGGtbm~s%^LIfwheD4g<+;ldKM-fgPx$@#Yf z8XJy-G(Of0s0yGIm|ZOeZikth+=_RQTu2f*YO5CFLRg=*r|0aI$tI06N;T-(X?NXx z{NAM5nz)9G1|YOYX*$|!Zo09GZj3{Bx~8M?=B7JK(Um%M`|-|xMQhGYm#OH^a_C;x zbTseWbgv&Ll!5WUF^^;*L1Wh-E?ad-NO#u zd`(9)(@l4;qWhggH$~IY?sU^lS9A>y-Ed7uL)1+-O3_Vo=uXviv`pP}rz^T^9lFo( z&ic|+b<^$7mik`e&^@o|XuG=UURHD$ICKwdIvTTXx+fJ~p+k4GrlWQ1rVA^&Qysdo znvUkKo9-$_cdSEqmZqce>!v$L(Iue?q#tE!I-0_6x?>dGZinu5ypu09jNNqG4dKgn zhwf=jM>E+?w_MR}ap){fN2A$IH($}UIds=)I-1aKx+#iosY7?ZrlUdarW>y4o^-#(R4Ju-E_|@x(0{tUQI_s+)ekeqMPo} zP1kfZ%iVN0E4rUKbfYvKjdVBNSVeb*LwCBSqsi{3J4?}B)6uwh(><-|20L_NO-EDTO=l^(K@QzjnvRCQo9;SAm+8=* zqv<#eaMPWy=)OR3eUbZPG#w`eZo1TDa*(DY`#8bf;=MPBh$frz^Vo znhwM5N>JD<&QS&(^-kg@GFO=j_GcLXaSaImCVoL(qrgpV!?`<8qpzIy;9tJSxzqs# zxss531;VqSpt+F{Qy?@u0I>*}DG*v1fILLV&jjKJgjPi5EMMXQW-9BPAF`a~Lhv~< zqGkUN6tqnuAmfXSnAkw5EbWnZQ${)G4!3J@LA-gf?%w=Vu4lnV8TK%6BylpvXU6?^ z{u_6NxzUM`LND_mR=^9m=~Esk#M!+9VJR$9ra*C_*_<3(07DZqk0kuaaTgp`V2Nt5 z#AxE)adIpyT{?#4)7Y=aHz1;4m`=_c0d0yXz^!hWqWQaFf-F#^Pw&wcg#cBTiXAX z>Ffd;3?-GlWtY11dW@PU)=h_St+8(%qO3qUqAgWlgh>GlYHGSuUvCq$JbZnH6O2U@^ziO2JreZUz_E%0IwOfc>R;S z7UI?5>jHT#!s}^#HSubl!zD&I{!m~n<@-VJFXj6Y`IwJt=W072Z^kuuMx=v}({uRQ zi+miFOP7(=d>o70Ba8^=d)AbEZg@S#$D1Xj%pdtUy?~$H&Bsv^!_wm8Sl$vHsmCLG zQ5}9`Q%YmgE9Evl$WdNX5|`^0ue=5=)Y!7biyx!HPU1po=P7^N!F~S)jq%34k0!}8!GLV*@ zOQazE2;f{XVBt|s8*z?>-R%q%oucnM7bTel@j0x`{@N{A4apBng#N^A zoD^_0srp66J`})PN>%9JMw)QUVJ83Qy^4|^#gctSU2WaS26;R zvG6~<;7c)GHs#`!?`X&S)#7$8!p zvYfBd3PX*xeWWVm41JPD!A-Pwe9d|LY;VF7J zSqHfoFVkjdYKo|*03xH{ci#uD^CA+B$~YW_MB^OT#v`0&;NO{Qi%vE3-by`nJghYH?355fv!zamp}vse^n* zjm`Ep|+&W^%rz^|W5@l)ib!nZ&c z?D7PbnHZA@m`WrYJ3I`hz3YX8IxL~ptk&xM)-6`>yYAd?xxbBp5SMXu66my?N%cR_sIsimM{(InI zfM4I^P~G_TzRX`(S@^NrJ#Z=+kL{q)nX#q}Y}<$T^_}t8We)+Dy6|KOoOP!<;W^OW z@Cglllx8>Ah0&g6Rt;*xK96?62@jT=+u%IY#~6!+_+|eq!mm#qJ9Lib?tc`q7R3p` z1D3inTYLu6X4#8)utfs?;H4Z5nvs~mdvJyqO;8^Hc(7-eg^0Rx;;u4u zIYye%2phGriA%?Lk+_Ayu~w{SGBtB0eK zVdJXzm8^@ZEbZk;pdK~kf8YgIITKf+nKZ$qCWhrHN_>{8zl#5hAa2NLsPzXb=eBS) zm_$BV^SR7VfrIxKx&<^{0X*K({u1vO;*i{oVH0f41|D&<(L8>P#WMrwUXl{Mpzo!I|$F(8Q4Y+P&%6Y9K1- zDXL2=#^xK5pJD&jn0u`k9)c2o^}HEp$oZ(fczLX;JJV5#jNz7H+3jt%smeNo#`puCM$$yoL?bS&9lX_)Pm5|ytu zp)c5@DtH>V)U5DB4K(bND8qN+l!Y9ny;F`Ox0~Z~fo!YDXIc&WxRcOU5#S5;9^St< z1jB6BCPaS1x%F{*;n{hflQ%TPyn#URbw8j&$*EiqN!Gd8l|-SxO#V z`p5AMoUB#P>!=bKAgV|2xQN=h@*sTEuAtiaM*R;nmVONhD)nQO@1_QNN@*ZDKG|fU zD#Itx>cv5{jMz9@^kf~v8o(-%aMe;qeU2Nph0(ZPO;b3E5BUO@W?YLlrSJZ8^yD*(4}FPdsstk19VG za-4@-IbuD}3*(LpKd^FUm|ngqAM5m~TGUf&C$T=T+{vPVPFDboi$M+&d< z(8!<=xWbEXjL7$)Mu&Xabs@%+ z^!U2UJ-#|Z{-sOEQ8w=#kY?~x1bx~*E$HxLfXt@H*gq=?|1szV#OR3ibMfzp>2Ldr^ov~Sv-78H6c_(+=4giBx`>A{8n=N6 zDvkFlGUV{M9P6TN^Ce^9rxBF!Gh`HwdvIMh>h^5fv=`B?V?#%19Yx03 zk75bKtjMM|*$Zz+F2VeC8YWcPRhoH25EYjx33Um~1+R?CZe4;vCG01nbrI>z(OJ$E3Lv6o3e{6@vXuXQt=n*` z8b>3qfb~==TAAeIRmzU!l?qNP7L?slyLjXR1*9C*E;Z{Y4>kPIE)UHZ@_N@rM;afO zA4z}YVwsOMbK2LfKZ?H8{VQ~Gn)kihH@qJUO%JhDuwNKF&4?_e@_HTbW#-idso)A! z_n}*tbNF7xA-8Lo(i>^{TY04No$e|hZCyvV-T8$hduQR;wkn=c{?=jRH_wnY-T+!j zo#ws1`b*nOEH>(2O2*>1n7`IE9*c}@#L}+raOEg)BF3d&^Eup)Aa^4ihlP`dy=pRt z5wT&fKDIxgiZ9ND?m2boYGQ|0l$6)TV=(VYOhI)gHOUz_25LveI0$Nk;s2^(5Xua! z$tP>@+aoXs-bHGyVTT(G!zi(GB8#@fKVvjF(wsK;X5el*qw5l_ zN3Zh3!FpIpX6+XxW4*Pz5(m_}n%Pa||8->7L-}J~7f;29L4>N<&`S~rAQepz1I~qD zS`^z8Ix#iGgIR>2R`Bbu>*3dbSq+Uy8gmUSjEU2WQmVvl%vp)I6OV%N^=Qgqa>C+s zl8A=1e}sz*_$=P=pX!%3dx?HpXJ4bA(8~64Qx!30*7kTjYj606kvF~J|5N$68u6>Bty((yWi_<-l|^HAoDPJLg? zQ-ONCS-)M2Q5mo(UZ7%6!!^te`x)K>(-=H3s>PjavR=c9a>z*@=23N2Ak`d}ssgjX z{Ax4kLm

    rlMW4}9{=t%<{+G9eqUL#`h)4k_b?T4njS-jzMdHZqN+^JY?XB! zy_i3LVH&aD-UKoRHG0YR;DRKS_?;*?kLgUr{LXc0L}oc3%yu>DE12!k%p=;4;&g)Z zC62iQuD7neJVv;6)={xvWnv$E`>6>u4b1Xg7&Xzmi-Wi;7{AK^q&83jlN48gS-kJkA!J~Ox1IDyNf z9BOn&P}LDuw>vHPi!TR=xsvD_hk}_O;6^V+UoispWD(umS@h-**w8A}jIm^oSHs>O zWVeNZXv^V8cc)zqKxzISw&0X=9<=ZpPAUg%cthc^8Ai%?E#AXDysJ~F3b%0thmjF9 zm}onIS#`g{Td|sMrs4iV*AJc@{8dCMiLYe@XWa^s3p@nUaA%km7QW0)oPVd`R_}sH z|7My>R?>hK;n6PO08XREt9f9!iZkiMhYPa<4A1~3(2au!noBBszjhkF|D~phgx77a zJ0;1TNHv}L6FaDq*FX+0sj(mR6h>Mj$|y?qxiN0>ZZISJ;kw_Du<+v9Xp3XxIeV@g zZr3-=k4uM|UyfNR??hFSnY3J0C{Y9HGoCXa&arFTU!m8xMStnbM1xD<)jyg0*N(1i z0xZj2>UdQg7L%xeZ^$16$iEN z7o~11XYYPyjJoe7mfoO0weAvA8^Y9#%s%onU1lcCL~7nlO?bNR@ItTBjxa&$1G(>- zAo$)W63c`)*qsQOl7#wayz(8X-g!|tSL4(A%lt^{-km0@GDoi*9asW&a)56FJ=kqA z7?s*nY3%xW3O8o9~@ zyN4jEcqTy=VS14d-o7dm7W#7@XpV=eXRCKc|vn8lpdj%O}iQ&!k;{2=Su zrw8Z;-q3wU(hDV#kaitqXYgLVW)?*zde5dza#)OxnU7up?Mg~3&W;Z+Fpb3R zJvkMAI)zM2eUi4*l%MgG-BaS#uI?0V5PBr%Rb9O|Y}93@GZrA_Jks!#PAjygwlGBp zK--?$X$2pefUn|>@2)?>8fhK28#tPar&^{JI@DnO0GwW0aprWAmn)k|ePyB}`D8}= zt6M{vzP8W)-Q{Bv(+Z694at!G>fc&py)Kifr}(bh`<-LX1SVhoNWXpsYKm29YDXj6>ulIe>ypYOcxG>MUlJPxk-7{Fn=9gg!W>zOXaP zNhKZUGWT^(?+Zj(i-Hq>kH2JCX&bK(LuDS1IVOnwCKb3N#2!D%D?YiPw zm)4V;|5H79`FUCr^KCwu7Ek1|8i{1IJiC+s?_;TC4?tW=ILWS>W7tn0oW|~-c`~iQ zDjk?yI?*VBlF-Ed*8R_KrWN=!3@_;jNmUx5MZDAB8Y|$KKKPq3X}UlBQW*VYE~lvD zMfpAGLyL$%;k9ZcSsRpUDSi8n+6K0#_YUt{C6GvUxS!NmYaD_E!d%Pcrg>$i*b0b z64+aDxE2%e?08B?h_yF{eRkY`#eax>_1dcJG-q1Rw7^PcX!Cc}ju5ymC^drFKOlX> zss6qE2hPASltFj0#}L@iCG7XhxIWz(4GUnVF5n?bjka9^X0t6h$rgO&z0CCC&ubas z`HFwIew~I=5}vn1a)_D*cholR57@Ns=o?G*?BKfu^DL7qBmJew-i#r4vz^%vB~abQ zkjUF^mq2G~#kmoJC%g>`y{CJGSU>5cd^kHAF?)=^Brzfx3$unt!r4FJ#LDgejvBJV zN(rY@hPQAS9s8405jJ>KV7B{wQ;n?sMC}cVSr2o}NidJcc@s8D#TY!E zo^=tT{!^Y3C*V(;s zv~4GE$TRGY5ItH7X(82o8TI-CzMN>^2R!u+?W$D3rl8t#q;161B=$z~+VL>?C_9SW zM`bO}v?ri-oAtX_%gZS+SfmYp71M!SmuGcmKF1m_{3We!V3!EN2i}k?Ywf&!1YZ5@ zEk$}}Gt9+1;|!-}92LF~eNP;YzlLbLJMoc~u!6ALg4Y4}&Wi}4D_6q#Ittz-E9g26Omj8no~=Y>jplT#OW(Z}MK2v{ zTrK#Njc@~L$-`CmelYW*;r0*{{2vOu(h&}PC8}l&eN;#0%dF%ii9w-nkKbsyT>@uI zH>&2Pw=V9e`0PmG!^_0W; zIaav|S5;8!%^AGK8_HaxillvAZF-Qe1v+^Ivz14XGxp?;6l?!DCtqeqb=VEmhDhO; z9}8}bV=`n7rkTBEMJ`3DxvGAx4FL(Y^A2Q2Pb*xX^YvCBp7|u?g7`n4(is(?W8Mp& zRSO1wj6V;)%tqpy#j*P~;w7p>x?v*8U==rWe$Jb=?%!EDQmjE+%vapO+xjGRK_yrv zuVOXdRjwJc$Pli#B=GcT_rG5|Qt&5T&`DM)6VPRksjHZu_*OehdL$=jtNV-dlWuOy zZ2oQ}^V)(7*7!XwBl$8O&s#lTz|%ca)F%VK#^10`Ua(FjIQp@uu``%td4WIa2Dmm4 z>c~hOEeDxRnV;NAd;cW*+dr+;FsqSHNfLbB9ov1T#7J>wJZJAo_-Dd{Il0S(|9ncM z;NVJe`@~xLxbiLi+8eEnw;1ksohfaJ%r7a6;&Kyb&jSB7e{QmZCoP#A?rQQ~RaoIe zs4tuGtqrE9T=%bTo&4;haYSvVgZ!E-(p+3;PvK2-t15c`OI)Hk=m_(9OT!O-(Q}Yw ztWWRvlpH|;w3GwP-b>*NV?~{HpK)EJI6E>)Eu|CO25_Gl-ap{4xr-K|gH~3;z=e`_ z%i;F?FVYEoa*T5{4f&24;PZ>9_+IzV@uU}jjtau=PJL*=*Evd`F%AFVG1X>AZxo)0 zoBkq}Cpx`2Lqm$(xn;AZGn^U&V}GfmbtEdw1e~le;8nn7GetDE@m3Gfk|GB z=PQ&f#aDF28&HPbG<Z-|!}I+?Ph1!#XgIpcC3aFqyvlV^RJM`a3&XeJ z!?}?NuecAM<~5%FY@BxW@De2Pes+*Pc+6_f26nH;#N0NZu?bArSwk;)lJ2(v{^MPo z`XQD_O7C6`;i)TMQAVnTnPc@ChhGByfkxh^5sCXGk+E|Bj`8Fgmhz{&so4-F>%E32 z%)-f{k{CT^sr22Yoi5 zJaJE?QFO~Kz91j`N=I^_eNmgz;!`wp$-SN3N(No_CrOLxxXemc%b zCZJXW&D}FM@nmO(du9i-1Kk|)X?MO#_w-`lr{}Fbg4Zu7&t)p=VUR}~5a}>~0+Wt= zlLwfNwz)~<?*Ad zyz6i?(n^K5EqVQ{h0VSo6=Dw8CuUk_XHua=*IQm)LTB$PQ1|q?##O3>n{QTOLaT9` ziAvY*_F27|{ph)wUYs3mMXxVmcs=W1VVBG@LU*GraR2ul2K z`b?%2reeOIY5u`pOpW*W3~M+oj*;3VLC^c2atBm<^p9C^VjrzId+xGf0POI zVdPEQ1P1VI88}C;a!-}0SJ6=-Lzn?hrV{AS&DQimFE|O0l>wc55a-oi&NGjiPnGE% z5=n|~LGAd!Y~}JKj9lhrCHL;Q^*4bIx)=_SYOu*?IVtACb8bgt_#1wqH|%LOqFS&ZOLk! z@;&e^AzgC~Z$f(boXR5aKL&@u0V_A}ZXikBtt6bXablLoLpy?WQvq@R)Dk>FXL-g< z+%%FD{E2(NSj$qBdnFDtzYD_Rq#(Qa0L-*svGD(NLU6x0%3Hh2Gqjw9Z?cFWHtVI+B}^S~Df{H~id<*^`raz9X>oOX!e~bFRF? zuRWbq-(Dt?HG=O~amwNCA+vIdFI$G{vz;C_J87_rtop?B3oWbDpndl*nED$h|5qQ@MxTaa&g4Bx@_Jm{qWpH0nP}UQVtu z%uM|q*LEaYU};=-qw!ts(7u3b>eF8=r{*NFH&zSwD4!7^D?9`j@ML$4QYj~$K!}|2a`Rlqyb=<$Bn7mPrOx1Q= zfj4>XXc#gTH*<45PQQ_!`qP_>X};sZ(ChIqmuEUpA7;|z#jiY?$r4R`(>Y;xk%P#_ ztnPlSisgP4hOjZ2hw)4SXij(h828p@XBg*DK_*xUlX=??iu(xaP;RRIDlq*toL&;@<07VRKJ~hqN&_+9V6b?*r$`Dt!#5Rf zWS|C=V&X$Za8q+*q41s@7VeW!RFMQ$a}rAUCgDqX1=m}T%FtQ(b${X{j-<9G`P0xn zRpUO8UYxCWag-E?QK*Q^c@;iV_ePgWxUic!Lz#)Oj12TID0c3B5HCp#$DlyV_^;~F zz4!R<{;NH(|JR!ACLK_c}SOr_wv7 zDY+Ad1}Za2;vU1TWq``NV)DI@UpXJSs3st{rR0LAn;m@z=v+y@6`tekGn~U6kBikE8YdE>!`x)^?kK?< zhH$plbI<>i$^UybbuL(!|NUl^z=_)>rV%qe=Pea45`XMxbk|ZKoEglmd1+ArNb*wjr z*B_5pBHMNux90+z&za2U-6HQ+Rjjuta>Yr&?Dz-i(p1V51wOb?gr zPIXDZ6E{{VjutV1I~e{zkGQKoCx^9zJAs~RE}E%^a-0sYnClZ8gFZPQ4y-Y!^f;U) z&zVZLhJ?!}vl=%pwcfLy9hr_iVgB{BYw_sAqtCCsE;7HuZ;;QA1 zz&CROkMZiJV46rg{p=a{z2=S<^*e=>nmGh*VGs@Y?|#hdU&%D3J=DSr@=oOezIlz= z%RTAMuh3oiL1JCB(s10}>8)>i?|aw6O5PwpP>I|B9vit#i~2E|nXU7fud~KksqtE0rS?eZw=dgN0Cs+QZuW#Y)%+wm$;5SsQoWQn<%0XlKWm9<&pU{<-_S zQnbK5Md+3qOLJi&k4ahN+$4yyD(>W@VN533tn|lWxt!D6%`?y8lzEKfy%=g?8MvT^ z-T)rbZu$zc>X-FwOc1M1N4Ejyayr@7{qR+8I^hM%V1CxX5LRv+9?1@(gZK&7Vh8tc zuAxW1L8`GlQ_UyhMc#>`kOMzyYHF5=a^>Da#j}=<7MQjbJ8d?z$NvQTB+09(*`Z1V zx8UU=VPfE9sZ73UoXDsDgCb$OTT zO~E_-m?<nx@WZ{!W$W#+c|=81DJ01D~^|C~*|U|csIGIeF8 znA^46>Ls|_4Q{Kgj&XycT}IJJM( zs+q-5JSO=Dh#8~v!4)}}OwTi{ix%g@7I4mfH2&}48ox8D`F1c-ml~#xMuYbiJ}3Z zh>xP~^Y`D37Fo4KroB(nW@!6Jn6}4zT8j)*YjWMANDR-zllYuOcM9f$vZ7HQJeDM#&r{jd3ok$C_cmdr9mA&I&O~` z!4G7@FISjeCl#x%F?oug>8AFOZhmTf!_z%N+kb26{H-tSouqP$!5}}uKQ@Y*93#H* zBPMCjGil^|btfqH89knam;W;UW%sTHH$!dtdUCGUw|-=1%?R|w7;#=#XF^2|n5~I8 zk_@_?xwwe`qH}hqw>{SinOk8~v*O|zikI^)-u(j3b39Nb@SQXuO}Ug_B}S~f2voWY z(pHfH`k+LRikz!90!4S^T;4>5+pi_!BAvvX{`&Y5++-Qwy=9EpgKN1T?kJP^J{aS; z!M7eaB{ycrW^k^!>$-c4;7`hdB{Rbhw@|Xv!-i^Es6*+fl6K3or;a>=Vs^2IxVXRc9yqw`w-V9&2 z&ZulwgoCI@wsi%JSV~SK`m!m>@88W&mF8aPop3srnOBuv-sf#3oJwnOGv4F`j3%i* z0B8I6{QK@b#E~G34BY2gn`zj0NJhdaEQ}GDEKCZ3-Mf=a=!t)1A#dtB%Iyd5KoBxTF}QE^ zclXac86&bW$MJ(kDy3om#xw1GJxI*W>D>jDy0eHJ@~@-tGVP;QZPfl|AAbvz8--7! zDLZ(XaT!NTZhtZIQk}U8Xc@Vs;`Ht{!H0XOQJ=Xn`aILnTfnh%!dA@$bL|EpUW1ivqV8ap!4#$uP`6kX_h>l6VlF_A(ga8J@Isu&lXAB30*iw)YoB3v7TNdMq=% z-`MV){e9eS@X;xSGT53Mj9d?n>w>-t@(Cr+o0~}j&FChW@9-i<reljUGHQJ0Dp~PM&L;%lhpKm#gsQ4rs1*wEnR&UoZ0nRGpFf)o}wn^ zLyIW|`l?Sy*NOVFk1WLr(83#LZ>GWHVbS$hLST<7FWsbnOdUWAz; zb?6A&kiHnmx0;M=eHCBpAnu@y_^%VV0c0uM-4kxezO7ZEns#Ci;A1>^k?=#+@N+c4 zx!#jGO5^dsM3DIJ4Og|ENgw&pV$0DNE)nxR()o%|@xFpd@5Mx)B)-#QpCd9F8~v;8 z%H*a_I-BrTB)PvQI#$$}5GGuu1YdkB50!&pN*PWd4(In^=EUuVBMWjL`6YVif}H3+ zSd-~^JC=~+cwn!ABbmng*+d5qGnYI0&r2)i#KkZfhO`b&jTq$w6N=vA-aSY<@>}v% zlfVYwm}}s)qnXC{2~PfJ@OvGn1isG=uo$NUxszuNO0k|q9y2AF$R@ejKsn4!!WEc# z@(mLJA95ZQ;kL!W^o|SB5fon)Sh8klJeOIG;hcqeKsaOBVehSsbilLiZ{d?4;gpj> zgk?ao4PYYnh{>v%m`zZVWSV<}%|>+1m&v_N=~$s{y0c(qac6QJu=rpy^0QF>_u*Q1 zr^0?9aZv@A&suJSkeLDVk!<`?aM=*{Tq}6Kz2#0WN1G_<$c>J66n-YC?C?jm~colQe5GPsY91$O7pd;FQV%YCa6c z_u~%xib~juTA3cd<$74lZ<%oT0giADHz^yS;bwH4OPEji*8T1+W5pS`kY_K_Z=sLH%U{;0A?_*on_Cz!a^gL<+HyvJ53f-S z7kO{^{Z~#J=7ZPd&Z40t^`?ROJyT)@R*7a3(=YHcJ>cbT;23H`60nCh)msQIJ_$GC zVa~8}{*P8V+zSesfDx>Poo;utFji!~;<@RsH$8bhW^dJ@;{J$c@BsAC8HeP3wVqZS z{i_`-G%dG*7G+PiGADw~qHt3mLc0m$o9sr*%0faa+zv3W_>~>Ytm3+48rL}?OeOU( zm2&|p>Mh{#yW~RLTk?94fSTjJ>vge0FLs@Xjp+ur!LEG5&zcK2Luvf1<4Jv-=Nm5N zY;x~zo2cH=8lfL2!8T^*u1i-_DnLhdklPiLU6kE&^#xgF&-x)mj}jeB=>1t;rpZ^88Hxscpq-q$KL92 z#1lci7no7>g}<{Ab$T^k=BH$u+p=4ans2xVbrs3-?3{?@nPYQ{J8Uz-mQ)su=PmHx zT&l}2&Ol~2?ctV;tMr(-F*%E4#eF_;QXbsrNz|7RazLHohkt;bISSX*RH!&{cn)T& zC+XtLA3RtlvmyJrE~| zf>*E&+L?Rr;W4~7Zj!A4n6N%f+Guq4Ep!0);RfSj+beT=55(EDic{`}$g&mUoNLT} zc5jy3$&|R~_>1zwc-F(gFdApczjOF*#)`hVB~w)0si0fYSnlAFj^cE&NE5oZ6-^_T z{TuA<3)zIdbx->B%63lql&H`}=}}vgHTjOt^f2D-6ikmA$&8qE++kZpmzdmF9oD`% zyu}pVFk+ZBWK%CIaL3YYW~%K%gQ-Z)(7jo-D;l7y0A|Kjbr}!-K=$hyc!~FLDHYlE zuo5p~#r^A%^!IN4>n)E(g}b0m4m4g#rTpL^;-X}z59=jyDYN+{sl$|5|=>IHkF7&2^u6U)BKz? zlQh=uZm313oT@2XHM@;PE_ zST#t22wjO%F=9R4&-YsjSPG<7&*C}whkE=0)0y{upZnZr__BO$NLmUW}aSdna*f4r&*Cn#Rd%NznGVQlo}T2F{w?p^1mGiVa~;kUW&c` zvfuNt#-k*zgieY&zvw^8g8TmnWzymvN*>$1Ny~>eZ)xH{refPt09= zMYGo-bhq9vljb46&@tGrggtaiabIm_5$>$%uiczHnR9iK&$-2>!^3gWZFJrD({*l8 zC(1ZF0*vG=$n+BXm2ShR*FsQVbgu4#o{n^;ZV&HAyfC`2rSd8Z;FEIGdGC(4D|cZ( zegTHCsY{aAmz(Hc{8o9GD^q` zvpzq`D->=DzQ%spTQMAWW923!LQOTnTB|d84@7kyG;$>e!jGV+hn@Z3`t`%a+v9X? z^_1J6==PqXS`=av=1LA+WY+ehoQSKb?+^H%pOkG;SY5A1E->@_F_ri;(R}bt{66>C z{qqF=_Ci@5m*Jno9ezKo&0+I?hb_(Xejo3qRCC+hta{(z_1@tm*Fh_xF1tp;-CU^h zDQD%w(kU-7TXUW6b_WK1nvBYsylSgyMmJE6?%^#Dvp0*RnVrms6DBLS&;AHUT#xVT zrrF=KU-BVUIm$t5DvWr_I%ogPC_!;;Vk1{mnBsrGDdVSYMy$iIoM|iGGES6@GjGBK z-ir--h&uLrlO*#h&XjJk%tq9W(HpT1&B8Q{UM9R|~BoEX*jA=bK%r!_C zM!eM(i9;&#E6&Cn+!k$MI)h8(M!vdjmDkw`e3u;1j1zWQG?lu+Uw1PMzuipeZz-UE zWA^-Pn%${5kDn!TkWva4zn&ZIK6zi6)SbS?ptUfmJ7|q>q}TpICdq{opw^p-{%=}sO7hdsy|}T4*EbZ|ZFHK{ z|E<2!6U+;pE3fQI{>6>>!Jp|u!pyQdSusJTFyf2eh{e8&A1Tai{eH9y_vkRwhaY;b zbp2n_M^{u$_(XH5qTznq6R`gcc%yeq{QQV+x|q*kQC&C3-}tN#)pys=!SsGWr?#BO zZViuin0fsRoJWZ_rx8ARFI?3n>9>VL;9GY1p5vPdx(lD(>v+65n}3&fc@xI>0a$L_ zFEj&VIVXB~E{>4NHTt3N$i4iDoBWiMnlCYBntb>s8H#tx(l6&*3UC`Atm=1Go}f90 z8eU!Xd!*%m*vcgX=h)T!8A{RDNfJNZv^ z(eLx?%+`l4@hPsCo_4scf2YY)I9;B?dARk}_9%QyfBdL9;a{hYh;qM9@trSfxUKP6 z-qXTJ0~k-7s>?iU<`ohT4mC$oiS1n`&t$kNOg{JzIfUm%v&_3qj&*v=uE&+m(z72< zhbnXOKa0Qox(T9T`>`LT^&AsrTAgmk+$ZqEYkjh>Vb4drXuq-9xmYbc)#rLp!q4YS z(A-GD{S{T^B$KJ(bpBG9<_jv|Iu(2lj2v!y7}Os>MJwC$-XCUOIovw@0rfkaIGTWF z&c}wn9cvQi;lBm*^Km}Mrz_v0mq|mC=cwaHR~Ehr`>`lH;q|tVl}dJ>YaPL~Ju-pIimPA_~-;?8Z7bnc)({-}Ny7Hz&;v6lDrCNm+o z+q6C+`|D8KQ>RIUD3?^)XyWJtQcC+8Zn1Iw`_UxBA&ucS!A`gMt6|4u;yq=$Yk|${ z|I9ht!IQot?8I_=e&3iqM1LFQ2G8gAzaFl=+eGOF)QHbgO=6PNFM@WSsazn(rc-sh zqiP%ratsb|5fpKK_0c>e@ArPLgY*ZVcxuI)-0K>-T<2rrH`wJk%ClT(2lqR;w3c}(i%hS~bFWua zFRlx@uCJ?x@)jr?b!LjFGciNfrkFzMq0Xg6@I2k!JG-}PRijUCWLR0Ch=1#gYTpdH9NNt z@}&0T>+h_8n_G8+Ee#){%-_QKJ}y_T%^4b&w0x4uv^AI(8FvLmL5$~MjvKbz%TsKc zuif|YWq;QILJFCtB{+jC{Nojck%UjM@ zb|KHi2L0oY>L0^lf|c%33~`;)q-5-QnZ$l!LV z2gN2C7udf2Dc{1{imzAPDt|qvXL`i!`!l?2udh6g6K|gE!Y??bwYZx5^zW6NL`&eF z`?yB_w>sQx6#DcAYYOF_hv{SMB(#SU=nvaEQAJB#L{s0y1^ICDL~qejoZA`>qaVP@ zkK;p+G@TxgvNfCNtD!3M+2{5lo?pMQ{+s3)cjJEFs@r~tny^IP|8@?aLmCd3h%Z0|zis6mb<{Qh0c0hVj;+ zNAc@e@L_-MqxFn$#qYhF=Fw5P++MPkcD5m02GgjUZBD$0qyNdusos`aY4zvR?jG|Ar&k|uyUsIE!rS=@F1GvfPPgvYlCO(R zzBN*7KgITOPwd{^D6r-A6Hj) z!*U^yKa)fK?1<%Fro!~8E#Kkzh}9oif3!sM8T?yIbe88u^Kjqgt9Y6sbFyE#K_=e^ z<=}i=M|W%LeKvS~#QxJTIrWi-Cv7X*%}@Adm7^L8{HSElOZ>VU;Ev7utos^&YJ%(} zwWL}XG0&cb^P+ok6*PA9v%FqWG*1)esD@iCs_{grpf1&gMjySb*S=i@9Ea*!{sXvJN$>rXnUD4n>*4Cif^ zv)Ns-N)qlmGw|!ZR~zB$O_0JC?D(KtyVboN*7I+JxwqrncIanzQeAez-!aL}`Ldgf zDvNn*5VP+KIww?y7pX>FNZK?$#QQle{<+TV=xO!L&X zc)we{;O!EfIxrlawkc(}*}H6>>Xz`-<8AN71oTM{?dNSBP@}Wn`XO1}Iqc<#SASIU z$e0dzod10SwhEH5WS&H*0_m*9@>%0vkuqp2p*AG(Y)xusvyE11>P(Bos8;-EyOh)p z&f-p0H6uZ)%LHOKMy`h=r=oAhMO)W9^>q{U`{R;*S#Oy0rS-YJnaLzn7;AG&qrJ#^7t zD7}x$i&LI2yLTa`Z?S!RZIWM?)_2fdJEf&(%=~uIl)HI|dQ30(>dyPr<$j28 zKu45St%fkaIdytO_clsP9IM}MwqWF)nXO0*q^x`UTur~Iy6IKfy$o;m6Q3_`JPJq~4+=}8hYA(A$yG~qFub+Tzr z^%m}fR`{#kjfG{ze98uRVXDZ-GJG{zfCC5V+bCg77Kjjc()*sO0(H!j2-EVfmn z4Q5$tj`jk*(Q>&cE2Imolr6u??A1DXk?Z*kH%d3#B%5JNV^-B0f(MHr!V>y$>FhFj z^9de|q<*SNN7XEmAZ<%Pi)qbPT5Y=&tqxVO6MvK8ZRz4v?55!MP=R{6Hu@mQei(W{ z&zjY>4oSz%QFljZ45Qq~luI5YVqAFnDr6D2cZnJ8Ql6J`8bnnh zssC@{0B?r-)AoO~@JF=r>$T(WI;cgR5PC+6c~`XCsE1FgmzLj$*XxIN2Ka@ud`m;P zlN?{m2+!xJj(Lptd7Ptag2offj7jV$#)!7#{W|o8owVkRiH|OM^4)*YDxKMP_`_LNkS?iqhLFamhb6n)yrkv9@ z=W?ZUxXHQOW?Dby%88{+3KY1#LY|zh7Of5BC`w>gwqxtaA1@O;0cxMp4*#XZK!7nLzr42q=36E@o zKeoXeG5De!o>;ga%<#e*xu-$~lczzae z3no#uS|?Gdf=Rr7t&@21vQFDpGnvCw!fj^HxAUItaQb%IQn?Fz6q}vr^?T*FFEfev zZgk%_E;}XIuK(Kq8`m_6cWtuoSuitSQepU#mADzDve3%$IlWQOu_@{|2BU6cIO;V5 zT}50c(WHB5)iGpr3B7Jg78)3Z00LD%?geO4-CI@kj4Ix%a%a5)qbhWuD#umg$=BfL zEAZa>JNbJ1e6>B$T6>^1b+R=y``mf*+vcW3ec|A9-PD#B^cH!~A;>JevlZ6a7G`b5 zr$)ZFeGyIbK6qwdG_x<3*%!&|i(~dhF+pN#G~4%TLrw!BSJ5;z$hs@9;kiEr&%M%1 zmv3LpUjp&@{nAq-&+ga(a~S@=ty3e@W_wrqTj&wADHS-~V3t5@QH_GN6c2h0=%qthZU(^kyNc9ZEvyr?DEiz=+e zd~8J(@^X>mZ|y{PAg# zmm{WYEYU4i=@RGb654cy%XNdR^nn}oe}lS(ZTh{P`n-JDs1znjIpqtT?xi}t6*|0i zSlMv;bp-!9u7AkGx5n|Tq28aytG4SSGI-P;{AoYlbSQL1RD|q)7iO~;qd9=d%;_Y? zFqZ+wvKUjDz)&{pC|WU+o!CeBKXlcrZ~K0`uf&JV{VQU5_Rl)(d2xe+;vnu@n7?1f z%6}2x^WO)u_6z)0aTqq-)!pRxN{4w?t;NAs|FVA$bQE_sjyDUtkD}wtDake%Fy~RTdfh;ZXN7sC)U-eLKC$ zc5;8rhW>w{=SlIUqs2k)CAowH=SyG1k*of!x@apr&`-$>sFZ0nzn7vIrr@FH5sLh@xa>OWoo9Kx@U+Z|a_(`${?Qs~c z4Z5cXTl{4w`%3QolU)nxmr$}3&neE$&*{w_FQfAM(7k)!i5GJ&&#Q?+dPY#-e;Q^? Pl_dO|*Zy(9-@yL?oS?h=|BdL_|PDL_|bHM8q2+e&17w-NI0{Wa7N&J-G7c~B_A_17C*yiq7X-Z^e?+a*E*YQxhS@^;7pb@7u1H(V_})bZS05>q#sk;_-&<(#-HU}HT)n-) zcNbwF`1wu-cU&eE;llF`zP6Q6gdff^xb9G)G;YI|u$jRx9~VmF1Z)X24DPvFD8jFH zGq`6Z_JMn^G5Ez}LJ{s=Zg4BMgdf8n;jSYLehi-)@cU!nHuxa?406J)R~g&_8Q~{S z7~F=m2{$7R!cV~^-1VTr-AjZbT(iBwov2&F5B4*-3v$9W$Oqxhiw(ZABiaWz|1yK0 zBCmwokq?dK*aAP>)!?VdGvOBGh47OT4Q@Ub`2v0d9^vMl4SsPv>IJwFc_#c~7lZTQ zpK$l(249*fl*UGE3FuFR^H2wbFC$ID`GW>uhEI)0u>~$zWN{I;z*o1mKv};^K;I!; z*lX~$N%RN8?FJXk5lZ89Yzfa8e0@YH!q1PfcnDkI>o*u&jC>QWxzFI*ErlX{f3C&3 z*aAO1!vcPP2>b{(8Yt_JfNL8TcVG+r=_%zZd9Q%}p+Uo$J@u{nYB7Ejz4f%T_hG*kn1N0@ln zpo#uTm_U0I8mLP^9y`O}6UaB=Xr!;P1Y6*P&}*ECEpP(-Yg~^l@O$JLP@h7(0rK}d zYp7%H78++Q5DJhd@1UVh-c=Z&txqPPeF>k$@j`e9@ED;tRsUfGPP_Mx0 zJ87uJNSDwLAB4r=68hnrumtH5`ezut0lo<{;h*r%5rcs}gd!|?!eHQJ>;p>=G8jPr zAuPSt;M_5c`@k2`-w9{qm?nJj6oYdP7K-r2rwz_QzXRmY78-mX=P1GkVX+2V;5zg* zK=sbikhkB7^APa8%MGqUpCkNecMa8hCU|GU7y1?9nlm)i{FX4d7h7OYlm(EdKWcC! z(j|Nl{R>cUN4^31K5#V9?(YLO+-7jZr9x`-Vhfx$si6)S6b4sf3-tA9$dl0T3HRJ> zaMVdc0%}jx2jPvVJHn@NylLEy?d{+^WAFjg1)$cRr6GTSaslc&%HVxh2?fY|Ml{s( zb`=D9?F|;_i`SxGJnuAv&9EhG0U1GUG{B{U(iq2yzYWnXA;#N9#x^0Sv{sJ9#;4DQGFej$Ik$l_vbfg|f0YV!+)#tU0Q z5l%t-1M(EqDWG0>pTTo?L^*)1QD1~paEt)*6pRgk+WHv{`2pmC@Zm9ogNeX_`tOWTcKQpb>I@7gFFNBx}!DJQ7A7U zAKY9+z5i)JkiSKr0Mt(IQGYdIuJI1 z{Pf=qKJ#870d+dcPuTZdgN>UBrGfM|0-u8|;VoMkeEc4v0Qt9v4gP+xkc6KaFoGK7YIqX;W2}o=3pQA8OC$MjRzUruqE`s z50QVubz2$SeIBltfqS<%coe<>_2DfwfK{@~>B6ANb=+gC}OvSeFO3@+i0lcHwuD${0t5CA@pU!$1XJZ5RMzdCr&qb0gg$+lH(2b1DEi&2MrG0 z5yvO+;iC+;dI_-gF*bDxFpP(KHxAkbK+C_pO zacxdeN1#lAycPZlzj?301K<;WbDP0WkQU+A<2BUA`*1u0+a7K3$$p^#`F`X9P}`#3 z2uJT}u$4kP1KV7yA%A)j(kDD+aLXZRFW_F(8=%hK+2E{;alHc^IZHzxiMl1+i+m7{ zg%84qE;XROOMQ6V5gPLP1-LE+essFQX|M&*@XtXT`m-1`|T`Fz!rG%Ar=^? zUJSeh^+tF#`XFJC11v7Z7I^(kgBeJN@LIGbVdv`%UU!2~gq={AgjXqpSMDd22J-Vt zV5egYc7d(NDcAz9c);RNY!5}7Z?B zIw8EYWpO{Yz|PAJb~s2V4fxyv*nKk#@OKAZyaLCHS$Y1AL9<;;>!%avPMY4H+M2Pe=YRD1+XW4W3~b2kR;)o z8x1ZPfgZTScrYX zdh~xl-u#3?>tG=XA4i`cd+5Por-hMKEzoG2mxwWYzoQ8vQU z&=dZ7mWF!!?zqp{9kT5-)T{Tyc!hTOH+&NQey_n(=yMuZV+;HTc_RGl0fT>_y$JuB z(okw=+z0F|b zqzgPV$KpI}F-Ba5`X+o6Z9}+ZPm6Q01-^;)B3yQ%!MC>)ig3kTgKuN}(Ks4g;PP87 zaQt5meDhI*Z(J`F;nKSezJ=pl1AXLMz@;Mw-#7?7U<2xbu>Nv`HRv0J8uALrAEQn* z&c_yL-C*$XyV2gjQ8P5uo@gh+8?G`qwCWUj&SCkaXT^}ZTv1o;Exug@{KAIB!)qZo@c z9>Dei96Klr;e)6PK>iN(2&kja)Q}H8i2I-ip+lVj@^{NM)CW;6Kt6;%4=B2~p?jQ% zF4Rz;-B)OweiE){fzxg>*!u|FrxDKUO3WA_=X zIsyB@_&Ej@^gF^>!{9yF2t^n{za>ex}9}sg+Th)%3q=@$j4-^&V8x~I2dq5B zVA)gf2P{XM5Z=`?IA{s{0Pmh@aPSsF5ti+0Fnk&O0SBW^3GW#&7<~riBb=-uH=O~hAoQS#u#<|#@i+j9{8fshU3G=Qp=)v(rm^as;8}&!%xyGQo2m3vk8${nD zJdClFaOeF7cMW6y12}1cK^x;8poX^6kdGXV^A>PF@~80_w!kkQ*HH7pBfJ3V5w=Df z6BeQW6V5)#pzlJ=Pob~>4d+rooq4>)me>-|hJ??9PdEeRCVU=c1?0yCVb!X>#RE$R zhgbE^ADTDVH!!?(aMe(6|12n$EbH%2wc-P$Hp=0J%a*)jRd4rjw;-cc2Ue#B>XoVS zW@`fWwTa19shD^Zm3qB78d98uw4;gENl4qOCh9^&`teq^8hSSSq(SbMwrZ8U6I+WVOZZt;p!>&2_QfifsC=S|d*1h>U)9t1`)2rq;G1(oZ#$^b3*EC+SZ$ zgY-vRqkGQ@b8iJ?i=X?@SWz77RzSLm>I6DhsB{vm9i7||X|=>^Cz@+nox<3Nob|+H zY)ulq@(tQbwJ$@Zto%Wsp#V@sO#gmYjsV(C?_03K8k2r^fd!1U?leF8uJ?)Mg~I z`lvRcE@~6MTU9oiIf=EMo@8|mt(Lfy*Tvd8Nvw8sO{~=ttHod!tBuI&kyO~ju&X7` zHyR*iQ2mFjspes^6C)xot}1y?4y6IB5jCZy88Pu{Q%yby>wWDZR!tiL>FSY{+1FOF zYTE1SvCayNU96lAw3Vr5Ev!|uPj>h<9%-;o8dNC8t5D}8g?2hslc>b<%ZsO8kWThRJNy7+BJ4o zF#9G~HC{2Ka#m9nZl(9N6@KxwjKJw;g`J`T9R!6gF`Q-78?Dw@Z!`O3N57bv6=+>^ zazneen&ot~kcABH!BSk>yjqJ|HFfBl!`EqbJv$ZZT}llG~>~wqS<#EW<)BR zv+;Vf$;L`6&~~KbhE_saoDv%BX2S{!9kbL*m*zy19oOS}U#Ey)%#2jls@_~3w!7XX z8~k7pL7|K7_TI~;HQ8Jj+UZ@g!VhL+_DR!fPB&Pgtf0^_JFT>7)e}=E z(fM>#-${(xT4SK8kFeh9BxG%Vv!n}=*7E~bAIDbCjf$hTeK^0BG5gvE8g66+q|=AC zFM-~*a%SR>^V(>$v36B+lAonRDcPI-(R#DZu4$RL;Ds%!8Kx%~G6wZpgLN=2CognA zS*bM!tCcZ!h0W!}9IURcwWq4B?n!nOGcoa&HClOQq%b}waU0p)ZdY4$(;Aj$uo|gs zZVU3lN@J|f?}d=*R84lcQ}3;gS8&~t>U|S-Vp%VnFi+L7ohepWP^4OzIW1WYR&h&| zXnbz-da~@EYEINfhg%!^o1^S*I8u0So@k_=wXA{Jg^WWdC#IRY=&7_?wQ6gyTCd`w z!cCrprS8m2JavyAK3!{V+Ec>wxu4fP6lTEGg%)}aI#9~dLeD{ar5r8vobE9;Zkn{T z&~uRV0KYFNvZUpni40_!PVSk=MwaR1#DvxSR*Rn?y^I)OCk!tO8H?L&cyS~xCf+=> ze=G47N{N*atU!CfjNMdq@$^)6eOT-BLNW2EuO_TONE~}aBs4B3rs>fMk%@`dOSfpv z4GEFUiD@!CRGq-|OS8pB_CytU&Kg+nfsQP&yQ0EpuL_aXqo5f|Aq~6?*CwjXY1YxL zvqEFp1I>0!Ga{>BUa3#B;=+%W5yKRIUXx#Fgi>PJ62~+q*52S}2v@chc2!JfPU=`a zt!8BmcSbDlL<|&;8`l}pj4Wgn72}6!M=VsDue8f@4gVan{}F>^(2YR%A8W%RJ2 z+7YZeL$ioPK5$4HmrE)W%q~(8*AV-9!voFBm^V%;e36)V7*CAhK&#el)u!T0i&#lE zRHH^7rXNa))mud+tVwxXPR!x{AyYS@yFh3;$a_T4601c)BCVD<{}|pHe14A-a8hCo zu2|4&PAsU^S>=b)fHe@NWjT;}2F{u(MGHL#ovuw!5K^Mo5L-Vh7+ew33K8iS;OPig zJBdlF9d*RP6-HvU)hfGEfL2S4cB;x}Nd{LKiP6SK#^4GgG1_(LPf=xBkwncFKF55TM4_b-N2Y&a@=ab>2H!{cQ$uNw}G5Y88Nps_a zWRB63VHlZX^v|C&JI<$(IYv*0VPwQuK{d{cT8IjLTv*NUrPaG}aRXuChZorTaV54U z8ICWrHQ|L0ghg6$v8{75Bn}1wdTcg5R%`aQYHO=4Hjk9kTC2b$tan&24Y9SLuffmT zfw17b6H~3BGtDtVo9eu2On^6d68>C-#B&6)U5YzW?Jo2m2(AC3E~;y5qt(*7a9V4n z9rtQs<`k4@Q>&rLDw~oiYEk<%T5IL*@u9R@^2`9}q{O1J9{XX^ zg^2V$)3y4T&fUD_!yzkD5Ethi96Y9DhEy&m=920U>5Idj_@N3mr6S2`3 z!h8g5t%=y(Yb&*SWrUx>1Dik}SuUtgx7owiz{=_(3w>);k~ga(3u=nMS7?x^h`+eD zUeiOOmxYW4SdhUV!8xAO5c{3e)#(~_00kiaf1 zU8*Asx*<#|A`mi;J81mDS}>i8_~xcC@yf&z&zXDA0oy6bW**G~Cayy%XE|H%*mIqZ zEN~G!uU?xRX;xZe!`1cdXh?Nrfi@_$NOfefu+lEINOd+>xL=s4v^ET3;z+Nz$z(21 zv3blZeRUwKd5X<(Ug_(iwdMSb2~Hukti_90MqaeUYWL|~!XFmEgOypv(9rzIUQ4`|Jj^E1{V+Y zEoS%2RM$>wSxe?GT@pDmBCGEoigT(ZPTQTTwTSfST0*g$zxl&BDWEBYK zV;R_Rb8)487`rAbW018b4>u!9n8z{(S?g+WCq+L(Ffs9{j43UY7TyLb_39MAxz+9p zIWaLl2RSZOJ_jWPXKT`!hh4a`3<&UUx>~wOIP;b7>6x zYS73U{Xt8}+WcnLg^2X?D)rH6EGDfUSeclp3|9E6shpOqaHRG%@H`8Pq~d2!iHi6I zc@PF+Ng@Stmo@M-E9M14;>>U8X^DX*7D})#8!3{syBlM4+9=IJp(o3zDDj9^DG9(P}58%hPs>uO~Ix|du$uBa$ac8Fl^u0-sp3d-t(q> z#7y!=hjpgtOiVnC6_!>E0={)JO0uDg=ZtSACZ4$z&M+f|@mU$`Sv-)rmvvH|+sfLi z+YhoCNHwb{(_lZlxbfxD3gY6ZvKfrHk;3}bgY7%2@hrF(Tc2Lwvk8x0Ogs#IUf_95 zY}2)Q)N~vMVUO~K@>=V?gB21zpjP>U9 zfu+8>U}q$oj8hPIpjDl~a*EnyeS>bEFjuLLEHLX{k1Ns3LIz9QQ6MDFGFl(sQ|EJ` zfsi=;v_?MW1VZ8rHOHrhrdri0{+&qj@pYWe&+*IKJU7&ZrzWg22@K|H@62n$X;zpgpC`E`~At2#Ts&IoZiYwgK;WdrNs z$aYZ;h1%Nn8bRiMh-o;xht}=INm#zqaf@Ybn%{IfRw!%78Qi*epf73$YoryNi`S}f z_o-h|%G)r4wMF$v&k zlGo=_jV)2mjAv%qH*elRt2rJ$gf9$3HM0xuv!l*xQe=9vG}q}y8Cr08%*XaFi{-?aP)e-9O0AutF){HLQ$?Xyq#k39W>Y80vm=ep1I~_EF`2qX zjfD#07PYbfuUxf9F`L2GlxNjshnsBUKXZ?j>d3+$dg)A2sw0bKlViB)D@`V=F0rH2 zGaIQh#+E}K>@vyHr1N^REGq24R%L{BCwI~{3dY4mhkmeFYQqW4c5xGn9!d=ZEm;-y z92-Om#^s4;4th>twn6$C!$51TC|@Jhv9#+VgOQFbirUtmr~$K89%$3t#a2aCL{>#w zJ&1F#W~xzbvksM2v()l-MRK8k(*!W@?5IUI8yW z@rpxAIfAvtSq_hFr|>G*2ws9<2Pq5_t+hf2ENr4`;3~^UQOo#TW%=fY22)UYFN5_* zxP>eFfG(JC;oc3bVGLbs5%jXS+v4(}-TlTgp>vXq@RyLaixz<{t zGKbbxCiMfUwfwCESS4DYRtGEOk!xLANGMwy#C8hH?ZpC`scKQiV2q)Ip6Rqjb;_Og zk|7Y;iFA<#Em~wx*a8cyBMaSCou{x1L<;L2V|dQ77ZVQ^>;=A%Ozd+@H^i7nZHz`w z1WkUq)>=6_DUtUu+tf_fS)q-rGSha>#Hb=Z`RQQe)xJy_I`YZ9W8Yi)O7f-lY}9xQ zrr43>U=neP-ncOjHe9Uu04Y6st!lEYD+|@?;LbFIgT(e*y%T83p$AgS4nahdk zXf$%;J|~&`&+9|Wfr?(IQfkTdp(UExEG0(#z75s#wDY{ICu)?i`@8HHE({@SyBte= z_`#D{J4)6bm;Yna{7yS@P;feVSdQ6NT;g{uhjmm?v;KxROtK*=$&MjpZTs-ELfgJ}2fIKS+F^oc=%^^3IU#f;DzW!;2z%m}UFxx-kM9i`mh zlg*}6Mrjn|P1dN;=BTv2Gcc-%Z-$sMlR_I>nWr1M(ZOj# z_WZS2V3ORxxPph;&4Rb!ZaCAA){8vRYjqSyt^Si z+sBBY9z{G1V38zWf!+40WI(k3a)wr?pjL;hQ$^G-QmwrwYv0WC@(!jtevo<~h z9c(=*^no)%NiLm+vm0ac$H$|mH?B5@aJlNVp_N|cldE*AU|cheIzY=D`>SiK+5Ui= zA$l7;B#{rj+!~Y7(aRr9OgwXgg51W;NI_hT4H;r6C6=L}o0_|a_|hP&&e+B0iO9~M zDkeqKfZd76N&ZSKWezNZvAyv zk=4@5$kb#~GjXmc?YN#<&cZ6m7>896ZV# z+0~9LM>tMhj>=syQko0vAU74kvyu=y`7+njzHZB08D6QU@>1E{m|E#;bN``Ps!LO& zV{6kDz*(smKJQXicFsz@(6PJeyl__P#W$82vXjXoUSTEl)NecjayNb? zmwG~4?gqHbNkGZk7x%&)92A^R9x^w)N!?mU1vTq0xi{{RvxJ-V=x&%hIC7M%eeRAk zDVrx{eYnfla8OKqcv9*kyzeS2NXSV&xN~ZmwbQ4T=tOjHM~A(e5GZq!p=SLVKNw=; zo5rM4B4*ZG4_4Jb8()l`7CQVC1-sWHRtY9J2YCt z&3d%;_bmKH%+wpIa#L;sN@|b#-jsbn$=c(ZY`8f+x@NKxz3js-@8E?KH|1*qu1%v` z`J__^9t(Qbugjoeb?jX+HT8!IHJ9DxegaBrk28|7&#YeKMNFBgH>`KlcgLG_mJm~4 zXe8r|?p+4sekENaqhBi!$H0y19i}Wmp$BuT-KBdkl&9eLjXG1^4nj0lHyA69cToziL zH(brr@NIoTfsi;D(=-Kv0uaq7thZQ0Y#fax>{vr=%+_i4 zib@nGAW{$)%WCu7NI_haS54RIs&kzx6nA-~Tbq;k3Um&{xlq7@U* ztV3)YdDw{}h4)Fhp&K4e2rYaj0yWvW`{TY$GN~?2$#KdP^9*mDoR>}hg1KxXKzo@7 zQ>+zJo%if5Xv!#BXcrq66mO5vo%|&YV`IghhjilS*oAka@LW@b?0Xi*CLwrR#F%xD z=KKLS2B#ZkCV|THX~lGzL8$W<_T`;2qe$)TXav*`E@`~s??IVb zNC@5*W9@j2WEjG58J7IfH@Sr}bxK^ZTzFgmhWQyW`Vi*n;-j!|9D z^GggPbBr+^g?rWLnhItOR*lB7Pst!larV{5^hC84-SO&VyuxwEu|9Z}Gl-U2l1Zv} zmd$8gBe9JvWUQKu7NI$sRXFat_zMKYvqHzg0`9R@Q|VV!h{|=LMc8hRX|CvKuU(y5 z)o3R5vujkZ~}^W4UL+p2Lyw!>vN5~nxN;)JpkXTKWhb~ev3ob_n@B{Rya6*>;t zPvBD;h`C3ZY|)20GbJpgg?=W@g5C};Vn%4))=Sq`q4SM&%toFUdcvG;b$u1BR$7#p z;jFPlfxdFb22-juFDE93$%VBBVxLT{K}h1EiP>&o;r{W=zzhKxW+K8js- ztq@9yb)d;%=%)|``krQ!zL=7s6&hmWlACgcaGv!MdOx(Qr5a%i-=CzLu??yG0S^KxR+a+;h+E;l|`)0wee&$V`cGf{e*as#iiY_yM; z`HLX9XBx}a4Q}~0es>OwL~E_WmIKZ7I{d(MwUOwfhoRJ3_f|)y*+<8~u`T-iWL|`5YMt!57J}HxDNOgz#fm4NPo3Eyg>=mDTJ*1hhiRS?pU2o(8ey zp#_#sPtjZI^o{xG{0D=K-ddvHbhOOq$&%iwv6<~@vW4=o#<7R+arb()+$PnN8iQukmaOl1NL+z0Oyn zNi1csGV=VP61^wlnLUWpcL)f{D9BMrAX`&DdWkfe@r)D+ zS3gNjBg-%|#vu>-#yOK1mlG2Qyyf}mufA1sTCzexJ6PqkJS`u`HJ6sx^0d6%TluuS zmZ#N|3;pa17N~h@fg+b&pyuh}y>1MA>C2_I!U8o`e%9s1qOj$=SY9u zHj{=~@mwf~YX+9#N^3P9+~#6>ln}@ktrTj*6H%ffKH8^@pQwD^;0l)nbdeGdSH@Ya z_m*(l(K6P1OZe==lnz!8=x!U9tVom-ye+(PmG7X&HX(Rhq)XQT@qKNPrdN6!xbxyn zT3+dGkd6=K9NRFZw?R7PHcaVl`t*l$GV2OVi6XVPLl(*_-fBD>iI=dw#`SccpM8}h)p_4V z6Sq5=kdoU_Gn80ZRmv|*LN{rW0yRZR3RcBa&`sCDfS18FN5&vf`4pTmSB6mMEvRiX z-mRGP=C3bdYK7+>SZz*Jr}!f-)4E=hvIi^d2ACUYrMDTxEOQ#D)tH1jZ-FPbnCp$^ z_UQJrP!QMNJQvqIek6-E0ox?Y@765ct9(xE2N1n$L$YGxA%YgI!_4F&)>!tk#z-kY z()oN~Y}WVk$+UpUPoz%m5TFQC*JJp^4X*y#yaIO+^SmdVTb2)PXt1xG8e6X+w!K?k zQ<==gl+0<#3d;{mEMg6@k)k(VG=%w8&PiCYI0vd6<2{>a-3NQVbKv_6cDvR+1vL3F;g z)r7>vHkZYFJpL4fj1^ML8pH$cIIa(9UL5f-pNl7lVXq3^|`L$+MnCB)SeQrz2=Vw=OI*#B-R z&isKA4}L|7>#tX0HViYFnv_68+Jpg#({o6c3@lJ6+d5A1Li zWWa;KMc-56$g7oj09c6M7k^iY?eTjNwmbb?iOcR#;`|Gh*y?La%=w`bhhC?|ZNO&0 z?1!>$57`mezZm;FqCA(K55M4Ebvx1kc7?wg z*uNV7PK3W>;cHiHcgFU3M4CDa@6B(M^)8DCan5I&E`_EBKb z1*jWf+pi*B-~pf)^)QKgxE+{tkrJl^&j2G|SK=7d)kDAy_&pPKe;@L?<+V!8{k{_C z0%xG^o&je52VEB&sC(f2E0nk&+l?EP zm_4Y(drwp1sntqcH;sH=FU1{KOR?a4Qmk16U+blKWUUmZV0+$MmDmI5nU-RBofO+c ze$SK?7hwM?>>q{w2iBo(ZkFPB;L7()vHPc`c!g^|tHhl+hAu~a?r{z3<3~8&AUg`YGqB&9uf)B;$$O%&AaCMG)ECNn%G)7(AIc8g z249yRAw@4Rd72c12cTVno<1cmI0<>`M}@xdFWr)qAq~b@cXpQ&|kJdpHNDOEpglfw*a%AkG=_vbb$}-3En@! zxeDCJpNskf);|b8hbeK~p%_E3eGJ>1?vmoN1!$Z7lsL03#lp`@u?6aXA=1D52#g=t zKjJOuhrps=N^vnzN7*mjT#42TQMaccjZ>t!55IRr8XLDpn?SY%vS;x7Zj@{6!|-<; z`YX2AVtdT#sGAQcvCZDd%c)9ijkY|mj&_6Wh^-(;-)x}{jz+uOf0PoNBi~QIAMO8J zDH_;61=~5Ot68Y4#;2sX{TM0cen^UOY)?55#~1qYdq0EpPsee%FUGBnIQD??&*8X2 zIqvy5`tskTIQZ`vGk=cue*}4hZvQjT9zR6>AiLp4949y6n7K)c$FQA)?Um>^2SL6i z_TLNMR>T0Jo?4sICejz#D(B4#P;-0 zpdY*dW7iVcpzR)f8|okJc@*;S5bE#@*q{4ZjGU;+oIlc*6eQ@%tEH4S4IJTLha&u-yy%+kYZO56)v3 z)o46No1)+S{Z`cRZy{bjR{qHm+GEx=fMI*#}IaLg__3H9|w zln=Na$7m16!TMbE(;4X7uf_RpM^yX|qT0f)R8 zV?D6vOHhZeMmz7J#HGN@*TV+BX292VJL6b=9mXa2Qm?`}@0IWa9E1HCyP%%~54-~B zUtoKbUAz?hT`|VNe$8u8ex!Fdwr9cTIY_4k{r$jl_&sO`aDmNshnxWa_X7j4KL}|) z4B4XXa83oz+Y5O*6~0i;n-0gA)xxm=4C41=Qy52@G&Ue#_`M}C6Tj<|-~%T?w{jZ& z@LY_kzk|C_ zniP*-g<}f8Z^G}Mi*PJ_Rf@S6<5>POjw$?J54%IIM&CIf;}+y=zJhbbH>FsM{kt!a zV)i#Au90xeKsJK?+b@)20Js$L#<##n9v;MYzptZj!vE#iZu1=+3&7@=qCWtS1M86w z0c?)+T1fk0oj2gvKw0lygZjWR-t%KA&IfKl zx$j1~XB>qx?TK*==k=#gK|h;=vHH#EaQ^ z=)b^|*na}t%W?efhOu$i{c&Cf)?!>#G&Z6xXQKU9-iNXJW9U;K!8mX{#XaJD!Y^#l23;5~rf14#cFq<1oK(?%SFpFsbIeDHHPjxnY`b_nc&*~s%w zsIv=Rg#4X|aTR0pIL@WVo-D-20V^7+iE`SaGsm7HTuFL)aTi#t3K58 z-!PV+iDLtJ3OMQWNc#+2Ut%lJr#`p25bsl0sQtTMAzvxKCr%Nc6rUEK5~qrfi<8A? z#EIf0@e6T}_>=gvcuYJh{wN+6ua!TSH_Fe6@2J0ve~YKZEP0{$s`#3?Nc=%8mhX`L z@^1MRahLqO*hjue&X#lJ-Rc~%Th}ktFXVmd*XrxyVsW^bgW;DKC=Wkl&J*%FE=1@^blA`AzwCd9nPqyh85U^)-3F{Iz_8nyE(A0=2Jt ziyBj-s#o=^g=&#ns@|yK$r8y+^%Q zty0U>3bnVIqxMp7RQsuY)Sl|i>aA+Fdbc`QRn#Hs0JU7bNgb#@DozmhiC>G~io3-F z;%K#*?2>)*8Bvqn@|R+be6ReaJYL){?v<-$MUKjGd59d7Bl5H2ba8~bO`a~ltu9xa zsUON~T+Yh0~ShpN@;fUbAT56Cm+5wb2Da#~KwbLFYBDckZid8|A}epa3# z&yth!NO_bzT5go<eFhY`iweGeMo&$eL|h6KCX^cC#d7qht+4*N$T_J zO!WnIhWeB`O`WPfr%q9)tCQ6h@i66XjpT6XGN45pj(At$c-=(>1$mR@a-l_UYQY>t692 z(bM&y_??(kFPGD5iEOI%>VEZCabVZ{uB*jW;ydEI;(BqNxK?~${6PFroFH!&KNdd` zH;G%st>Q*;m^xN`K)tQ&IbBm^-Vb#34Eg07c#?b5Yl*UP*9t=`bJXV=WGf2hBy8C|dLdPeQePh^&#P9@6{jFrQ##VXmeSo}%-QGHULEFV?xl*{D7@;!2K*OIROu0>saUGL~x ztJbM+iJ!^a<$|u;#T~eo_^J4r__?@Eyhtn)%f$+@QVfZAiFb>G#X(}e=oQ7!_lpD#pcXu|^yw>S7D=0&$7@nmR{)QJt;MRTrvnsEgFs)y3*8 z^(A$l`ieSVeN|nczN|hdjusyf$A}k;ZN+xtC1QK=3h{EWlh{GLOzbFLDh?1mVnQ^< zq-cm~u~y6#&k?T?uNE`JuHtaf5-$|b6>Tvk)`|6EYq3EbA>Jw8Cyo?L#bU9ac(Zti z*hkC~dxC<>?ZaUGsPYPhv5ItP5(PL{qNlLzjM?7&Q1S2H~s(W+|*^( z%ysjKAN0rzBK{(w721c)daqt@j$#SG1brc+5Deg%?i76*uaHo#6tg^2~JABy7FY`^-8c@xEKvqkT6g zCc&FG-9}SKD}M1=#<89jUi%!a(8pX2y)ia~6)yBnq1&gBIDC(KT+>wuysWLZ5Gnz! zP|!%?76e*9Br0BnNM&KKHBXE6TI=vzT24%hWwZk{IX*6Fzgp%ci>Ifm_G3B5WbnWq zp0YOdQhI|abm=wpR&$!OoIdfPU#6oK7(Qb|)rrdF8m!P^LbfU{ASdsu1v-5At2&XE zyjY^>saBM{q-APmcnzw8Ri}|qxesctjo{O2xKr)(R7` zZf8Eo6jpiX^?_wy7w(-lYv!uVyLnH8eW;jf1?xd+pjZ$tu(vWMYPIO=W!fV6a0%_Z zg~~?j_OMRGDzS{s#e33{@SD#@;G<{pedh!5G=kyRIu1U(Fb9*J13g~(CCiH!vA zyhguS<&a=Sw|$4XWYumlykPXO10I;@VBr^RDJzf`%V2`HuB-}Y4+JqbpGh`F0Utv9 zA&lZ%xSnn`VJ9*s>9Q9icPobUr=q=|?ALnfRsUjbkmcsSbgbW!FEVah2Fc;vT}X@K zK$uM|^9A6{dS`getVzm#=LjD+@?THXxo1I0aphv8z1ysnXp3(gq%MN^Q#??l?$b8n zS!zZ@np+b^AGymjC^Am5EI6f5SILE(3_?1x0+sPyh{}8l`WtobOHRCuagyIfvHW|Yhx#(B|qts_G8^a`rK{B*YC75X&f=Zhaic z=A)0<0$D9z2^!}E!BFwJ5%UUe){7^YfWDg`MbULj*yg)xd8KY64AmXF1g^fZCL5fN z?amt_cZ{Lun82dhoVcL=sS;r-%W?-*d8VM$ac#36|4-p{vmQ)ST=_S4*H}snGNVC$??`s88Tm-kLa7jIhbFz6s$a$deRpTS-o@+i? zW~zZ_-d?I@-59IowXtf`#83$xVvH_!?I)*8+r{arqFDTo%(tphCAi@@46*idd9tz| zdcnkDitkHmlmv;R)+V|_1koX zW5{Ek?rIB~qZFso<^?P*4KE()o_4`Zj`kl2IQ%6h>Paax5c(n!jl|}rsSL! zaft%~f0d?C)Fvve4MVt{)Iqao8lgxsnA~Hd9VVIz4t{t09XQEmaS-z%Q}ps1bs{#* zF%9oauB9vMq8UOQH(qCBAK3CZIgRb?crpqTlO)J5z1tfc-iDPmt+wLuMLHYq^`|0z zBS8Ne3H-W4mJVqgheZZLIct8W;KE=|j#Z+aRN&EmkUc9;tIsNYcq5yA^YYVR_u?Xl zc3vrQZRM$Jt4Lg1ISS??0ogRIf``{Z=FN;$aTn_ZtVZnXe9jZS+!ws0$37t7IR2vo z!8JOZlRON^PdOkNOON05P>_`Lv}z_ydJxMW--%(zjn!ZzSu=&e4}Nelir{X^z1@{P zm@GSUZZw(&^~&nlx1Jbq69UeA^k4ubHV)`qR&)R(>YFzY_kH6v_Y9-p2JK^*?lhBe zvbeIoHi569){d}K&4ri6wMLnSMvR;RW6_3!0QzzS8TKubdU`ylL-Q2>0O(>r=Jm?iLJ&nVTMxvO60H^o4feMDG<{1nVM%@2S3N`PXY zP&0dPwiggbG2P#Ab_|Q=2Df*_3o= z4lZk*i9R1U+EWxjz@0)vT{0izlo+T@!Q6-zDvC+-NJxF7hFEvFH@0mZ5PA?Y+H`W%uTZkv4rHW>=IQt`x+>-v-E*JTVxVa zLz;Qxqz*}4qFU%y!URcls+qDn$<4(FE{Alu_9SE3>d93M2Ek&=(7C075jQvP$|e!> z2}-9f>lglGFLXc`>~{8G@)sVCND^Ea1(zs=CcOR#gw)&Z$t9HP?w-ogPLa@GkvMZd z(;G_ixysd?k>#r`p3!wF;F=(57|2Sy5OlUi{R4);m(_(&7*cK0XTu3ydY;>}cwm)# z)J^-z$HJ(INr5>vI}Eu!X6GiOOur?H3n}j$;F)<~F?yJuTXJ-}YX%c9bOo~QNejDz z1sAkyX1D`AyR0XMy;b#2tssh(ihzxd5(GmxnUA8e2UC!+!r*Qu8R9C)#+Uc=8!#;o zn{Lz9PtwC^^j40p!J_7SaYP~EN7>TlXzJr7{l zzu@^!F{NaF+bN~RmG)un;bw66Hoq}#r^NKlByP#Vt06Nv*HdX>BDmE(diXSgVezVD zj6uwL;Y(jJBM!GtWis*1?VS}xKQ*Q65azs4^_zg|+6&$0#(A!-54!JSyBFT8>Kht9 zP~uxm+6bo?tS>Zq!5x>my|6tP`%#~Vg!S<_pc9X*L>Z15I+#-!9V$n{wPGgFRl1bhwMv7w-VFx@66#1nWT5W|0}H<&nhZprBaAxca8q|!(;U$k z01>TdVj8zcll2XHF3pmHZzJk#@HI*Lwv-JzdP+9Pr(bVMzoP5^!4-6Mf(eE;P4k-+ zjcmaH+bhOnqYcP-x>NGkSt3~oDwr1xirkGTgu0LIwA8}2syQmgD7;k$#9~+&2R$t@u-;? z!4RKK(8AcJ2%yLmbQA95fHRd1_Uz{$O+_PP`h-#*Cety3(@kNjPqw^Dg81Gn{qS^Z z>`Mb`+pPM))!q>cmulS5VH{4L8YwO&aup77Ssg)DQb*7v1%=E85A~TNSrHK3i<5Zu zUS%pJ2=8rF6jHr-T<)s3jq545v>{xi5tKy6adeKY>TrUW&S>hq6{s^6g+M6HU&9m+@ua0>&C-Oq{zEsuOrq!mr1N za(Sgb?Q&I}U@F>SEA`DKNigeT1i2X!qd^({qY@^{tP=Bj{VBfqJ~UGMJIq+oYz&~a zX%T_HdyY66MQL)GgqCznB6jZYLrpHin=y3oq6@OsHBj)Q%?hH0DI{fcv?K`LXTWZ7 z-$HxwN(sn(SGPOVIQ+%|ipBUUCXEbs@|`5P1qmc)3lbo(%dB-y?LkCR|2&f-KBe^rarrF0m_Y`Ut{wHX zsXuXB>2wPp5T9IALA4gSwpW^IMyx`YF=G%t)AcFvXSyWUFLorozzlKS^>vjE?WK)j z`a-83jobrC^Dx!Tc*2h{=!u@B7K(6qu-srdN#uONG-ibK)O4hX9*-8@{nN-ov=Cz& z)^SA+`bOOpYC+VE5v-yq6mICxI8Pp%7DmZqQ?F@`RcKjBlp}pBnM;B{O)cE8r>TXM zKQk@FIHlE&@UOWQavLj~wWzR zz|ORI&x!7?^_R`HsTa@{d&O1lRHfw)Gn*4Uo-2+#BO2}>qFac@wC&oo-=g=#3N_AZ z#cveS{?^Bfdq7~{M+~N|mNoF)IC#3F_x-VM-e(AB&&>Oa!3|^}2=8=_IGR5&LY6$P zD)_va;jo!ABeG+NDc7*8W|xsog728nWo~&qzZk*VN=xF^gBzF z;q271NxK`)PU$rs{yCf8^|#&s_eiqTnS2accZE>Ax?@jeo>3B&H*iB!r0iuHYfKd% zY3S-Jc-&g-vMVxui59$qhuOSIGji0MBkoyRA?!nl^v0Nbe9S@{ub@u>`@4L*>u%od zuDg5JyZ%Ps?lQ8!)z?~guU{Fll~x&T2EWEl%U9a;;ccoe`c()gvDSae?cq6`rQnyH zg{aWafKdEw`d>9;HPXg-Flui)vB0Ug*2YAbeYQrwtlcOk1}I*;v2}Ze(v|>4aiZ3! znfZAUvT(%;T@gmENXu!_|<#6w1suPZw%(xL0I?+Ayw>^GA`!esO@ z3C!sf9lvVFp+DAXv$<0Q;EK=XfOIEHimk8nMHKk^IyMqF56hWUs}{QipoB2 z?X1?BuWi$A4VN3X$@I_gGtx%j^J(_m`h^#h^IE%7FDBP%2N#D}+4HJ&NGg zwo}*IV^|eyE27q3-NJjs&ZbT?{ccAeY{d?Jpw;cPv0lq|i&`5ilf2FP(Dzi+W~N^E zKiy-NdUN&Odl`rNr|r%7?S9#B8Bi_N^>3#roJ|Br?L>8A)V(cFzv;V1WQyMuKEK#O zqnO{5ZuG+s>-lgjt+!eFho>rXaMxCiv}Y0rD|->4M*NtnV%i>P7vK#vKUsd!6^xh?8xE zd0>gQsHa%(Wi;*8cY=uqX-nZzx zQ_Y}LPPNc=jSv0P8erz#bx))b{PsVm#`i^rd{s?bfvYaN-ze&DZKWNy>{{N?YuiDi zt{cTp(5STU8V6{M48an^Da0Fqhl$a z3z3q@-DG{DDDJw-H0d#E?sfJ2k-J3?jP;E$9#i5HDUsS~$5?J}LSwNHfs(rNI+|MU zq^Ft6vNCuto>k(n2(=RDGKk=jsMt!#M4JR(Nf;~yOROz!q)QZ3kX-BP267QX5?g(z zNVS3Wg)THpOmeq~c{vNylBdLVoC(?D4SC>}K+eOrFa;g#7+vZkC_~seY$%tIdw3Ag zC6wdL*xV5JW4mS~>9AIA9)r0C687%E( z1xZ4}c<-6OFriW}JSf7$BpUO4I!r4W!o#Jv-rhYk4o#hmjr9-)O9KK2VIY}M?3Zrj zq}(@dcZ1U+%L`QL5J?aD(h-TInF}2f^XnXvWE!5tI{b{!FoK|ze^kw+MfORPe5wD33+2UaFsm|A_>@l9A79aOJha{jMYZq;okyCPUl zCz4+MzX^gq!`oS(4pbICXVbiAQG{nrd6qd$7VLM(rF)D~-t=fuERNLgdrs2&jmZqUh-%R=nTzjnvFH~krZ`V<{m5km->q#|P8y|Lv8Kl976153I#KlD* zqC_05`igXEP$Et!7Kd?hCO}b+z?S0V2rQ~XOwb{Vn9v0#a;q+jC2v_4HK%!VCZ|qs zy>PC_4RjL9h#Q+&3@*G-PN%~fCi`< z8ZPT&nlua&SMy*L$L0o{M9^G88HJxV5-;y=_+OgFj`|Zc%PV#b;qL zF1pFtOglMM7!)dU=|V$g#W*B&fGDPP!xar`7^9-<54D+&=+rq?@KhmlzOhq-emyYH zl!-qPtP0Ml{n}uz)z2ezKq)4-^VcOwT5Va9R$Y>$)uK9Fps8HSerYn-77H#j;!Mrj z092gp!ccLk4?GpMYcPH$_o7i?s?=j9Pep75#tw$kD19?=$^up~OREnSTW8eCOoLmb z-C@8mj)QYgHe)uNRVGb3Ori-rmuj$fJ7Z{8KxY(Tn5&$c&mOwOaH#5wgHpF_1$V|T zTgRQ#`yg0lTC?akqb-(jXLP~K64|Qv3%xVOnX`y#P*V6nSvgA=(I%s_tH3iF7dnfn zGHby*>v4mLY4{?HmM5Ecr<3VsBesvwT!5w6%7)JJfwf`+U1N`r37huz93Ob*y}l=YW};EK)Txea4TQaT9TWqR0&I3rn-;nnn7N1U7u z&=reu4MSnNVzHU_FiW)aI-02{vonFa@^;w=RwnC%(?t-k*cMYBVJNSR+644U6fUe+ zPEpqPiV$D1k(nsTnYnOZp@k3n#ibPbE0)kQuiC`qD!nL@WlLXmlk_$Z|PAS^*h zw9&@w>nmlNBI;O%5TEplRwhNxFbP@~IL(JHO9?!H8Pl%`!cgR>9!MQM77Z<-qW85M7bA3Lmnsi~BP@MbN9(3sgbAN0Nt1AKT#fa3Y(|_+ zNTvh9MO1phNWVqKO*4;>vEc_&)c_Nx{Gi&sS zZD+LNB&|3IJ{RT|A?VodJiI7Y!<<+o?yZhY$JFEz5dyB@Od7|7WA35H)o&Atup2E{ z#*?QI6~XG53oBh7k z)H9Im=GFze^B#(DccCaB^e$u|j(QMAF3{-U8D#r1vB&zfs7&z#V3U^n=Loh@ewy@N_a( z=^%XGg%7u;#Q>MbY6-D z6budMNoMjQoq4QCaRPa6G+74}ER(ZYE$=2Hb^!)cPfpXph@F2;GR}%Z`^5z$oef4< zs_JA`l3WpXD;~a4;7KPiFNj)VVRninGgz zNtbz=N8;p-ZU~bZ2a@GipF$HK$W}z%A$L0ubr5DUY_~MnB-dt^Zo-*;L#9)NUkuFn4Fh3j)Y&CfMXK@Ir$SML#>}|vL&U16bDA=QVKOsz z?(|%mXvu=BB2y&`uDreopP5NL2%=f0jc-8;$C=ewg)X<+s!-Cjj18`tNz{he%xR+A z^TJ`W(5lezpqtER$K_V^s5&#cM`1Vvf7xK1TyMGq>mxo6XNlN_=L|eWK{`VX3)Sfr zVZcr<)xj{rq(Q}1L?l6NGD&7#DG%rA6A6QQM$))nnFx>Ra}5&*D4Avo#Od9eQD$d4 zjVgJPVZ`R5f}IGhB3(0L6n1nC>n92b8WdZ{?F_<##;TmNG!iIFD^(|V|K=Jg3>O-v zTLcZw2-8`Az4A6*7o&yov|m1$s87TP1*Lfv3bh;GB726r+AM-Euom*XlJKHQqV&A2 z2r`;zsbRBvx-Up3M+;#QcGNr6Hxl}23EQlQHfr8H%Bp-I($Je;;lcPmC~3emLOxZf zgN*j*&x=INc%o4=&1XpxCZDF%Og`7Bqjq{T6U3D7kB0>?0Zjvf2?rPoCb3$A;{OFQ z9q5klvpH24?vzs^9~AmDBs38K)$bQ!P`wDVICc8)Kp@c}QTaae>H?xNBO5X`BC;-R z0;UFzP1sZ>;O(nJsCvB#r0VxgI90ySGN9wBhS_uhRs$OyW|i-AAJH7aY8&s-n^441 z9ObHTGm&`Rv}1I zw33JNOg^&VT2n`pQP9?ukq_OFT%lwA{!Jo6xq znAlKc18#;QJ%q8swI@yB*pOwz$A%&suQL?6P_ltchvxMAHf(1gpy0A>mqN@&0(K`m|PNszYPqH6h{Kff(?bs zc|6_;OmuWr#xXHgBN1;e*y(tyoJ8SrnZ(Cojl@YVOaNWR(qVL&BrTv0smnMfux=z` zYlh$j0di9jh1!kmbiiFEo2Ib4UJ_lCm=L^y+6CebMaki9gYpI(iqgy4-3I9O6c?s9 zltf3Oi_oj18wb1~aBm_t;d{L}2;v(EeJI~hm~>Xe-7UiUdLl`A^FtDKLP+9Hs71UJ zl8B%0Ajx$(El$#;-t+;A`D-Hn4li7`GoiWR) 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

    BY@^T4y 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%0DXMTLp^GC{ln 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 oa({#xZ;$zdnG=PXGV_ literal 0 HcmV?d00001 diff --git a/Thirdparty/SDL2/lib/x86/SDL2test.lib b/Thirdparty/SDL2/lib/x86/SDL2test.lib new file mode 100644 index 0000000000000000000000000000000000000000..21892ca9c737b69ac39e8d8b4a417c9ec1f2d961 GIT binary patch literal 926004 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 z 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�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 Ll4G0i8(eqWG=(}f@zTx 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

    RSstKc7 z;+?Lvk6WPxt6?qTA4nrpln=2nDs}LU=a>R-xOQ`jG%`h{J(j-8lUvkw&K4FpBCOUDq7wR4%A|PLW2Y z+QK4g$_3M$je@#^Q>2k8sv{!j-(Io@k9?@<+Qcc+$W(hqQEjEG$!#Ab3hEH2NF!4n zU=gKv%-tP61C>+;Kv2klNw!Iq>-sOSYl)7j?k4eW%L?B<#H+xE;7{# z7LkYhf0#B=PzyOl8ky?MD9T&9#-uau*Akt+eKHW)bYBqaUZ8h zBU3$K5iP(=kGCEu!rH+p(tx7x=;&Hrfj*cvj-)m zA3o956W`whjn1Fm_&YWR&lVXd$G`lO9yN{h=SHSUKwT#v>FOQjPajxgW2WGp`q~9) z6~<_P`ZA3Z8L8$`pD2IgndT{UQ7C|hWpSV19qkXLCN^db5{la{J90z z*qAWhsm^=;>WPF#`h#W^njtV#S)~g*EO^()$B4gUW8$Hq_)LD*KO)*66Vn)R-_`gS zqx>;5&24x`H8eEIoD2w_O7+yjG*2R36c%0PD1WT5#>VVI*|>mDTNeF^tcvu<#xx%z zGV}0>E^CxOc35L${zO>h0%44tpuu z9~aY5{;274M)~7rnxlwMSA2T)e97O@{&<+C4>GV5KGB6=jmEn^K3@DC8$+!kyh2+x ze@?VNKBj4?%V#h12WG=5-qIQjam)vU;nyh3#VAW7wE$^Ut0+t7C`-R6%gs?1dz2*@ zWyy=Olto!4M_J}YS(ZgvR!3PjM_Jy9vV0O{`60^kca-J&hLrzwsX5<0%5rm*B`eA@ zCdx85%Ca)b@=TOvN0en>l;x8s%kNQ^MyRXGrKanKC`->MizUjE7iFo6vdoRLtd6p5 zjj|kwvV0q5`8&#TJ^BneT}e?EUzBB3lx1d=<^CwklTnseqAc%6S-y#~T#T|brS5@U z>fPxQWf>S{860J)h_c)jWqB~lvLVW{E6Va=l;up6KkQoMp;HiS;j|M z7DicCM_IN+S>B4WoQSfVjj}XQJ07h~XccAY6=g9;S@NPR6;YPEqAZU{mV7$ujN{{S zY1txa$ZcPg<(nwWr6@~_Ya{Ph&nSx}$}&94G9k*cD9W-n%JNE-t0>FgQI_WF zfL^;_-J>iwMOlVMS*oHeQ=%+$xFtag>rrlr*DPDOWq@XRms@VpET3^px@I}YElHZC z312!&(=1)N*B<3$=4dSV);V!!Gwln6Ge)-mDOB(#yqrVp^l#1Um{?o#upbTd~vDq=Z zgY;=WVo3ig_lt6Mtz;p7gJhxmwMDW}&TrRSQi$4v`{l;Jv8)^t^_B(vA;oRz?;U7DXAqsHSL`g))rIxHJt# zkgYsv7K$KSUD7NRL3W2V3!d3B7-;S;ER@ey$wD#oNEXVUEXhK7I8?Gwq(@2?iZpfA zA}oq@g=C>f*Gd+O^zD)*5uza&(^D*2j`gR|`{G3wmOre%)7plxQ0OknLZJ_qEEIZ3 zvQX$@y(OK(nyI%WCPGxBj}I%WPe>Zd!)=m<^6)*$Ld9ja-k%H#{ZmPUZ_+aSAzN_6 z@Esx|rHKg$tha1IU>37KR5TydhtA6UXOf2U=U2%>F>HXkqvbOz^EXHqDp5(2 zg_S7DLb*{aSty1RBny?O`I3e1=_<)W_mtWV5g&^4>ym}yd{}QurdsfwWT80!Em+59;vZI4+L3Ys2ht6kYM<2a~ zjdrpm3+3TBy(OJ;j89Ay5=qz0X3C#T!#*y8Wi~!3 z7X4|20Iabw>ZJFMm=880mlWKvg8M@nd50y)C`6TA@4Yj1m7rec6lrAYR#-$>!_R+< zrEWE>!<-_GOl2{u5#H&V^Xg4Cg8H3Pq>-s?SYl(;r7?5cSI!CQy5{5)zS##anaY7B zHl`jq;+i+NBQi#fA^m-sSMyYq%-D4l>ol5=ADbmQ) za4D=0b9Q_ws3tAoh>J8bh3yJm499kQc8Z{SaEdfCMf*HrcRTpckBNfH

    RSY9yoh zRSYBZzNa(L_BcDM;@Ih@8R(#TXPqtHpQ zYkS&f$Yzy#h*PAIsWGsKR`jbCiPsA11x}Ghrp7XgHQcesqu`u z2JdujJGbGGpl;$6X=G{wETZ&&duJjlje3{!I7J$nnkZ50Q;#1I)a{%ijZ95qlzP7w zZyDW5P%Ak_8kw5RD797&dG4?81@#iANF!6|43I8VMRs*Ldd4NFL!2UwOwkNkP^VtC zZxqy@oFa`(O=T2!HaO4D{6tXguZJTp(#X^_Sj5QTy>6>N7nGM%q>(99Cs1k&kW^c? zQ&6KgMH-o!!6>yoY>~8jgrF92iZn7clTm8Uzc{#=Q&8(UMH-nx2lpS+EGId7lspf=Zp>6lr8?Hlym{oi6j|B|$;`%qh~y)ErpE*yj6@@9A>B zL2L2}<669AYA!5-`rMbLD~BC8MH-p9lTm66AKuv*6<1AH8mCAjQ+G*W{XT0+e?fUU zMH-o!CsBWIyn3LZiaA9ZnVQciwRhOF3wLlmbD0&neQ#)IG3> zw)gc}Cv-KX14b-#kw&KOg++|a-+Ivhg$OH?Q>2lp#f(zZwXykl-8gC#r${4H_c1C4 z@8VKR)Sa9njZDF7#87PyUu|4)O2lwEr${4H4=_sgeRbE_O9b@>r$_^;FihPayC6bX z3H&elpJSY28s_u^EL1;)C8iD5TQrM)cDxi;F&g~n;(>sOPa9Blkw#9%GFZeteQ{PL zBx;&cI7J$ndXQ1g@lMxX>(T*&3UZ1xGW8HFu`z0!xn|>VU8x(-DbmQ)az-`7J6$gr zDh`RT7ITU;GKGPQE;o9nUIh=-biKeS(#X_GMyd7v;*Hn41@#f9NF!6Is0d3ftL-YT zK{u#|^$Vv+BU2AEssY~VsyF3ScR^j-t|7^SvjcYW|~yr710iZn8{TB7m~#N`NTJf}z_Q;$p3_wGKqg1V1W zq>-sLj8bdvkjHP)wMZK|MH-n}%P4g;SUx80qzLPMPLW2Yo{*^ZjaLp3)Q_AZjZCd$ zR13V*Rlm(hG$d-yH*Tj`Nh4EF!XoOjeZ-M*f=b~OX=G|Wqtx8!^iyW7p!}R7jZ8fy zQPaa8l?bYmQ>2lprzPsN-sjj8fZ;-B0~;P*4s|kw&IAGpYgJ>6)=AUe`vA

    RSY6~o4weZO{ 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

    RSY6PRy zmhIkQUp+0t>Nr60j5IQp&nQ0JH_R)179Z6Z=5vZPGBuJ>eA;RFaNdhY1hs-wq>-rt zMyX@A4;GEyFQ_A&B8^NHGHNi-jrAXgX9?<>n-nu?WU7c!YMJkPZU41`vU7?wGF8kd zwFU5fSbwUZhI5KEG8JM}Hjm+)2VTBSP}Q6wjZBp=N^M0C)LZb9ptf>~G%__xqFy>X zP&ab;fm5WBsnLw;#$#CZ$nyI{Slw<`%%qX2QbwsQcA(xlr=W&&iZn7chEZ`mtXIE# zw2h#aaEdfCHI`9rIhFj>TZMw!&neQ#R2iexbR};42#tYSdSeDEo{>hT${D4OqXI4H zTfbE5W=@etrYabv-mf3r4GRP{fm5WBsY*tvVNJU(pbP6cPLW2Ysu-n)^|7y4fe7n+ zPLW2Y#xbf3&qK3k7AE&dGBue| zY8&G@GBt%!O?V8yns)jPLG|GjX=LhlMs?;?@YKmEf(meoG)njj zVWAbuC3wY3zdJCM`J>*8k&CC7s|>z1hxHy#9DnGbiH_rUl$czTk$kcR3 zwN{)BE4QYFMOb}IikUPrHG@&=y@-2%&?|x}

    RSY9^!9@z~yPvo;Cp0Zx%drtV;r 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/LICENSE.txt b/Thirdparty/glew/LICENSE.txt new file mode 100644 index 0000000..f707804 --- /dev/null +++ b/Thirdparty/glew/LICENSE.txt @@ -0,0 +1,73 @@ +The OpenGL Extension Wrangler Library +Copyright (C) 2002-2007, Milan Ikits +Copyright (C) 2002-2007, Marcelo E. Magallon +Copyright (C) 2002, Lev Povalahev +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. + + +Mesa 3-D graphics library +Version: 7.0 + +Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + +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 +BRIAN PAUL 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. + + +Copyright (c) 2007 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. diff --git a/Thirdparty/glew/doc/advanced.html b/Thirdparty/glew/doc/advanced.html new file mode 100644 index 0000000..8e617b6 --- /dev/null +++ b/Thirdparty/glew/doc/advanced.html @@ -0,0 +1,232 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Automatic Code Generation

    + +

    +Starting from release 1.1.0, the source code and parts of the +documentation are automatically generated from the extension +specifications in a two-step process. In the first step, +specification files from the OpenGL registry are downloaded and +parsed. Skeleton descriptors are created for each extension. These +descriptors contain all necessary information for creating the source +code and documentation in a simple and compact format, including the +name of the extension, url link to the specification, tokens, function +declarations, typedefs and struct definitions. In the second step, +the header files as well as the library and glewinfo source are +generated from the descriptor files. The code generation scripts are +located in the auto subdirectory. +

    + +

    +The code generation scripts require GNU make, wget, and perl. On +Windows, the simplest way to get access to these tools is to install +Cygwin, but make sure that the +root directory is mounted in binary mode. The makefile in the +auto directory provides the following build targets: +

    + + + + + + + + + + + + +
    makeCreate the source files from the descriptors.
    If the +descriptors do not exist, create them from the spec files.
    If the spec +files do not exist, download them from the OpenGL repository.
    make cleanDelete the source files.
    make clobberDelete the source files and the descriptors.
    make destroyDelete the source files, the descriptors, and the spec files.
    make customCreate the source files for the extensions +listed in auto/custom.txt.
    See "Custom Code +Generation" below for more details.
    + +

    Adding a New Extension

    + +

    +To add a new extension, create a descriptor file for the extension in +auto/core and rerun the code generation scripts by typing +make clean; make in the auto directory. +

    + +

    +The format of the descriptor file is given below. Items in +brackets are optional. +

    + +

    +<Extension Name>
    +[<URL of Specification File>]
    +    [<Token Name> <Token Value>]
    +    [<Token Name> <Token Value>]
    +    ...
    +    [<Typedef>]
    +    [<Typedef>]
    +    ...
    +    [<Function Signature>]
    +    [<Function Signature>]
    +    ...
    + +

    + + + +

    +Take a look at one of the files in auto/core for an +example. Note that typedefs and function signatures should not be +terminated with a semicolon. +

    + +

    Custom Code Generation

    +

    +Starting from GLEW 1.3.0, it is possible to control which extensions +to include in the libarary by specifying a list in +auto/custom.txt. This is useful when you do not need all the +extensions and would like to reduce the size of the source files. +Type make clean; make custom in the auto directory +to rerun the scripts with the custom list of extensions. +

    + +

    +For example, the following is the list of extensions needed to get GLEW and the +utilities to compile. +

    + +

    +WGL_ARB_extensions_string
    +WGL_ARB_multisample
    +WGL_ARB_pixel_format
    +WGL_ARB_pbuffer
    +WGL_EXT_extensions_string
    +WGL_ATI_pixel_format_float
    +WGL_NV_float_buffer
    +

    + +

    Separate Namespace

    + +

    +To avoid name clashes when linking with libraries that include the +same symbols, extension entry points are declared in a separate +namespace (release 1.1.0 and up). This is achieved by aliasing OpenGL +function names to their GLEW equivalents. For instance, +glFancyFunction is simply an alias to +glewFancyFunction. The separate namespace does not effect +token and function pointer definitions. +

    + +

    Known Issues

    + +

    +GLEW requires GLX 1.2 for compatibility with GLUT. +

    + + +
    + + diff --git a/Thirdparty/glew/doc/basic.html b/Thirdparty/glew/doc/basic.html new file mode 100644 index 0000000..bc3497b --- /dev/null +++ b/Thirdparty/glew/doc/basic.html @@ -0,0 +1,282 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Initializing GLEW

    +

    +First you need to create a valid OpenGL rendering context and call +glewInit() to initialize the extension entry points. If +glewInit() returns GLEW_OK, the initialization +succeeded and you can use the available extensions as well as core +OpenGL functionality. For example: +

    + +

    +#include <GL/glew.h>
    +#include <GL/glut.h>
    +...
    +glutInit(&argc, argv);
    +glutCreateWindow("GLEW Test");
    +GLenum err = glewInit();
    +if (GLEW_OK != err)
    +{
    +  /* Problem: glewInit failed, something is seriously wrong. */
    +  fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
    +  ...
    +}
    +fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
    +

    + +

    Checking for Extensions

    + +

    +Starting from GLEW 1.1.0, you can find out if a particular extension +is available on your platform by querying globally defined variables +of the form GLEW_{extension_name}: +

    + +

    +if (GLEW_ARB_vertex_program)
    +{
    +  /* It is safe to use the ARB_vertex_program extension here. */
    +  glGenProgramsARB(...);
    +}
    +

    + +

    +In GLEW 1.0.x, a global structure was used for this task. To ensure +binary compatibility between releases, the struct was replaced with a +set of variables. +

    + +

    +You can also check for core OpenGL functionality. For example, to +see if OpenGL 1.3 is supported, do the following: +

    + +

    +if (GLEW_VERSION_1_3)
    +{
    +  /* Yay! OpenGL 1.3 is supported! */
    +}
    +

    + +

    +In general, you can check if GLEW_{extension_name} or +GLEW_VERSION_{version} is true or false. +

    + +

    +It is also possible to perform extension checks from string +input. Starting from the 1.3.0 release, use glewIsSupported +to check if the required core or extension functionality is +available: +

    + +

    +if (glewIsSupported("GL_VERSION_1_4  GL_ARB_point_sprite"))
    +{
    +  /* Great, we have OpenGL 1.4 + point sprites. */
    +}
    +

    + +

    +For extensions only, glewGetExtension provides a slower alternative +(GLEW 1.0.x-1.2.x). Note that in the 1.3.0 release +glewGetExtension was replaced with +glewIsSupported. +

    + +

    +if (glewGetExtension("GL_ARB_fragment_program"))
    +{
    +  /* Looks like ARB_fragment_program is supported. */
    +}
    +

    + +

    Experimental Drivers

    + +

    +GLEW obtains information on the supported extensions from the graphics +driver. Experimental or pre-release drivers, however, might not +report every available extension through the standard mechanism, in +which case GLEW will report it unsupported. To circumvent this +situation, the glewExperimental global switch can be turned +on by setting it to GL_TRUE before calling +glewInit(), which ensures that all extensions with valid +entry points will be exposed. +

    + +

    Platform Specific Extensions

    + +

    +Platform specific extensions are separated into two header files: +wglew.h and glxew.h, which define the available +WGL and GLX extensions. To determine if a certain +extension is supported, query WGLEW_{extension name} or +GLXEW_{extension_name}. For example: +

    + +

    +#include <GL/wglew.h>
    +
    +if (WGLEW_ARB_pbuffer)
    +{
    +  /* OK, we can use pbuffers. */
    +}
    +else
    +{
    +  /* Sorry, pbuffers will not work on this platform. */
    +}
    +

    + +

    +Alternatively, use wglewIsSupported or +glxewIsSupported to check for extensions from a string: +

    + +

    +if (wglewIsSupported("WGL_ARB_pbuffer"))
    +{
    +  /* OK, we can use pbuffers. */
    +}
    +

    + +

    Utilities

    + +

    +GLEW provides two command-line utilities: one for creating a list of +available extensions and visuals; and another for verifying extension +entry points. +

    + +

    visualinfo: extensions and visuals

    + +

    +visualinfo is an extended version of glxinfo. The +Windows version creates a file called visualinfo.txt, which +contains a list of available OpenGL, WGL, and GLU extensions as well +as a table of visuals aka. pixel formats. Pbuffer and MRT capable +visuals are also included. For additional usage information, type +visualinfo -h. +

    + +

    glewinfo: extension verification utility

    + +

    +glewinfo allows you to verify the entry points for the +extensions supported on your platform. The Windows version +reports the results to a text file called glewinfo.txt. The +Unix version prints the results to stdout. +

    + +

    Windows usage:

    +
    glewinfo [-pf <id>]
    + +

    where <id> is the pixel format id for which the +capabilities are displayed.

    + +

    Unix usage:

    +
    glewinfo [-display <dpy>] [-visual <id>]
    + +

    where <dpy> is the X11 display and <id> is +the visual id for which the capabilities are displayed.

    + + +
    + + diff --git a/Thirdparty/glew/doc/build.html b/Thirdparty/glew/doc/build.html new file mode 100644 index 0000000..8dd5580 --- /dev/null +++ b/Thirdparty/glew/doc/build.html @@ -0,0 +1,151 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Building GLEW

    + +

    Windows

    + +

    A MS Visual Studio project is provided in the build/vc6 directory.

    +

    Pre-built shared and static libraries are also available for download.

    + +

    Makefile

    + +

    For platforms other than MS Windows, the provided Makefile is used.

    + +

    Command-line variables

    + + + + + + +
    SYSTEMautoTarget system to build: darwin, linux, solaris, etc.
    For a full list of supported targets: ls config/Makefile.*
    +config.guess is used to auto detect, as necessary.
    GLEW_DEST/usrBase directory for installation.
    + +

    Make targets

    + + + + + + + + + + + + +
    allBuild everything.
    glew.libBuild static and dynamic GLEW libraries.
    glew.lib.mxBuild static and dynamic GLEWmx libraries.
    glew.binBuild glewinfo and visualinfo utilities.
    cleanDelete temporary and built files.
    install.allInstall everything.
    installInstall GLEW libraries.
    install.mxInstall GLEWmx libraries.
    install.binInstall glewinfo and visualinfo utilities.
    uninstallDelete installed files.
    + +

    Requirements

    + +
      +
    • GNU make
    • +
    • perl
    • +
    • wget
    • +
    • GNU sed
    • +
    • gcc compiler
    • +
    • git
    • +
    + +Ubuntu:
    sudo apt-get install libXmu-dev libXi-dev libgl-dev dos2unix git wget
    +Fedora:
    sudo yum install libXmu-devel libXi-devel libGL-devel dos2unix git wget
    + +
    + + diff --git a/Thirdparty/glew/doc/credits.html b/Thirdparty/glew/doc/credits.html new file mode 100644 index 0000000..ecf88b1 --- /dev/null +++ b/Thirdparty/glew/doc/credits.html @@ -0,0 +1,104 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    +Author, copyright and licensing information on github.

    + +
    + + diff --git a/Thirdparty/glew/doc/github.png b/Thirdparty/glew/doc/github.png new file mode 100644 index 0000000000000000000000000000000000000000..540f7c0b150fc74a9d6c5a3f624fb9db3e3a2941 GIT binary patch literal 1219 zcmV;!1U&nRP)8Mw00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliru-vJm5D>gTw!wvud1XM{xK~zY` z?bcg}UG)_P@ZUc7IcF|enbJ;eBx96`rdCZ$5g$?`N@=k#QWR0z5+xKWv>>G~rQ(ZF zLGYy&OCL%rw#C|e!3PD24{fPRy`f{GsS*<$P5fsZ%v{cyv-@!NoH=vJ1lkuLvi8f~ z|I0ex`qp>WTAa7@_J3P^>;P?x)+)Hz6lAP>k8=bR=L|U;+)jvZIp_l9mdyC2-=qa% z*heYvofx=La+%K=@=kgZV#w7#BQw+c-T)_aqcL66UQFF{Bqv(&Oyp~xS7I;m&3HZD zj;nhtMHX4XRWt63rO0Et@UbhNjy&>s<1D{15+@^%cKjrUH`}iavf^*{fhCK`lpXa- zOuEw)9xSCR3ms1F zST^H~ivM8P4}1f^cKbk@%j=R}K5GI>eOQAetOY}ao8>Ym+}G0y(NxAU4?C{zAuM=b zyT?V8S6uev%!`$rC@INxC)(l1t)(izawa!SPo zF>SxglyGHy&%CEBuCNgji+y<9<|1?c>@8g7>*nHLUMSd^a+lqPy%&$Cr`ItP5}}E< zmx#KZnng@AxYd`{T;hlaT%v@}yVN`0un2a>gKE*yw5JCy8t$;qtZ8p4xzZ1{{mir+ zHP^e&uuRAGaZh?|g`3KXVziXdb{ISS*j2jd`jell*{-Bv+@2zcnwpZ4B0=N6Q)s5# z*T#^Fk%IXOs_F%cnUTJiDc_Cf)0=ArMMVj@dDKj}$i*(U%Y;gi`EGj7L5Fnkj9VP= ztXAQ^rlzJkAkduR-g@hJ#JC|($Ypl<>;?hr=%Q>K9j6@kN!1Mn@=;T+!N1e*h=!^h zr~F>UvLV;H@SNp+!C|LUHy(4XrkZUVH8ZD!nmst~UOaAcgQJF~j6NehJDR@TYa)JS z$6!_8)G{??T`yYDRMK1nCc(QtLfI8Dnm+VA@!=K@7uVE_6{U=+uRFI4+8b88Xvm7f zX}xCt>2&+j73;l--}ImlgmUjl>Uh*2b z$;_q`#Hd?cW5Hk26ESSk`)MX7)tyQw<4bNb>dExm_04jN`71V==gv08#g_LrpYG!0 hH{_nT^Y*{me*tLCU3U + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Supported OpenGL Extensions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1 3DFX_multisample
    2 3DFX_tbuffer
    3 3DFX_texture_compression_FXT1

    4 AMD_blend_minmax_factor
    5 AMD_compressed_3DC_texture
    6 AMD_compressed_ATC_texture
    7 AMD_conservative_depth
    8 AMD_debug_output
    9 AMD_depth_clamp_separate
    10 AMD_draw_buffers_blend
    11 AMD_framebuffer_sample_positions
    12 AMD_gcn_shader
    13 AMD_gpu_shader_half_float
    14 AMD_gpu_shader_int16
    15 AMD_gpu_shader_int64
    16 AMD_interleaved_elements
    17 AMD_multi_draw_indirect
    18 AMD_name_gen_delete
    19 AMD_occlusion_query_event
    20 AMD_performance_monitor
    21 AMD_pinned_memory
    22 AMD_program_binary_Z400
    23 AMD_query_buffer_object
    24 AMD_sample_positions
    25 AMD_seamless_cubemap_per_texture
    26 AMD_shader_atomic_counter_ops
    27 AMD_shader_ballot
    28 AMD_shader_explicit_vertex_parameter
    29 AMD_shader_stencil_export
    30 AMD_shader_stencil_value_export
    31 AMD_shader_trinary_minmax
    32 AMD_sparse_texture
    33 AMD_stencil_operation_extended
    34 AMD_texture_gather_bias_lod
    35 AMD_texture_texture4
    36 AMD_transform_feedback3_lines_triangles
    37 AMD_transform_feedback4
    38 AMD_vertex_shader_layer
    39 AMD_vertex_shader_tessellator
    40 AMD_vertex_shader_viewport_index

    41 ANDROID_extension_pack_es31a

    42 ANGLE_depth_texture
    43 ANGLE_framebuffer_blit
    44 ANGLE_framebuffer_multisample
    45 ANGLE_instanced_arrays
    46 ANGLE_pack_reverse_row_order
    47 ANGLE_program_binary
    48 ANGLE_texture_compression_dxt1
    49 ANGLE_texture_compression_dxt3
    50 ANGLE_texture_compression_dxt5
    51 ANGLE_texture_usage
    52 ANGLE_timer_query
    53 ANGLE_translated_shader_source

    54 APPLE_aux_depth_stencil
    55 APPLE_client_storage
    56 APPLE_clip_distance
    57 APPLE_color_buffer_packed_float
    58 APPLE_copy_texture_levels
    59 APPLE_element_array
    60 APPLE_fence
    61 APPLE_float_pixels
    62 APPLE_flush_buffer_range
    63 APPLE_framebuffer_multisample
    64 APPLE_object_purgeable
    65 APPLE_pixel_buffer
    66 APPLE_rgb_422
    67 APPLE_row_bytes
    68 APPLE_specular_vector
    69 APPLE_sync
    70 APPLE_texture_2D_limited_npot
    71 APPLE_texture_format_BGRA8888
    72 APPLE_texture_max_level
    73 APPLE_texture_packed_float
    74 APPLE_texture_range
    75 APPLE_transform_hint
    76 APPLE_vertex_array_object
    77 APPLE_vertex_array_range
    78 APPLE_vertex_program_evaluators
    79 APPLE_ycbcr_422

    80 ARB_ES2_compatibility
    81 ARB_ES3_1_compatibility
    82 ARB_ES3_2_compatibility
    83 ARB_ES3_compatibility
    84 ARB_arrays_of_arrays
    85 ARB_base_instance
    86 ARB_bindless_texture
    87 ARB_blend_func_extended
    88 ARB_buffer_storage
    89 ARB_cl_event
    90 ARB_clear_buffer_object
    91 ARB_clear_texture
    92 ARB_clip_control
    93 ARB_color_buffer_float
    94 ARB_compatibility
    95 ARB_compressed_texture_pixel_storage
    96 ARB_compute_shader
    97 ARB_compute_variable_group_size
    98 ARB_conditional_render_inverted
    99 ARB_conservative_depth
    100 ARB_copy_buffer
    101 ARB_copy_image
    102 ARB_cull_distance
    103 ARB_debug_output
    104 ARB_depth_buffer_float
    105 ARB_depth_clamp
    106 ARB_depth_texture
    107 ARB_derivative_control
    108 ARB_direct_state_access
    109 ARB_draw_buffers
    110 ARB_draw_buffers_blend
    111 ARB_draw_elements_base_vertex
    112 ARB_draw_indirect
    113 ARB_draw_instanced
    114 ARB_enhanced_layouts
    115 ARB_explicit_attrib_location
    116 ARB_explicit_uniform_location
    117 ARB_fragment_coord_conventions
    118 ARB_fragment_layer_viewport
    119 ARB_fragment_program
    120 ARB_fragment_program_shadow
    121 ARB_fragment_shader
    122 ARB_fragment_shader_interlock
    123 ARB_framebuffer_no_attachments
    124 ARB_framebuffer_object
    125 ARB_framebuffer_sRGB
    126 ARB_geometry_shader4
    127 ARB_get_program_binary
    128 ARB_get_texture_sub_image
    129 ARB_gl_spirv
    130 ARB_gpu_shader5
    131 ARB_gpu_shader_fp64
    132 ARB_gpu_shader_int64
    133 ARB_half_float_pixel
    134 ARB_half_float_vertex
    135 ARB_imaging
    136 ARB_indirect_parameters
    137 ARB_instanced_arrays
    138 ARB_internalformat_query
    139 ARB_internalformat_query2
    140 ARB_invalidate_subdata
    141 ARB_map_buffer_alignment
    142 ARB_map_buffer_range
    143 ARB_matrix_palette
    144 ARB_multi_bind
    145 ARB_multi_draw_indirect
    146 ARB_multisample
    147 ARB_multitexture
    148 ARB_occlusion_query
    149 ARB_occlusion_query2
    150 ARB_parallel_shader_compile
    151 ARB_pipeline_statistics_query
    152 ARB_pixel_buffer_object
    153 ARB_point_parameters
    154 ARB_point_sprite
    155 ARB_polygon_offset_clamp
    156 ARB_post_depth_coverage
    157 ARB_program_interface_query
    158 ARB_provoking_vertex
    159 ARB_query_buffer_object
    160 ARB_robust_buffer_access_behavior
    161 ARB_robustness
    162 ARB_robustness_application_isolation
    163 ARB_robustness_share_group_isolation
    164 ARB_sample_locations
    165 ARB_sample_shading
    166 ARB_sampler_objects
    167 ARB_seamless_cube_map
    168 ARB_seamless_cubemap_per_texture
    169 ARB_separate_shader_objects
    170 ARB_shader_atomic_counter_ops
    171 ARB_shader_atomic_counters
    172 ARB_shader_ballot
    173 ARB_shader_bit_encoding
    174 ARB_shader_clock
    175 ARB_shader_draw_parameters
    176 ARB_shader_group_vote
    177 ARB_shader_image_load_store
    178 ARB_shader_image_size
    179 ARB_shader_objects
    180 ARB_shader_precision
    181 ARB_shader_stencil_export
    182 ARB_shader_storage_buffer_object
    183 ARB_shader_subroutine
    184 ARB_shader_texture_image_samples
    185 ARB_shader_texture_lod
    186 ARB_shader_viewport_layer_array
    187 ARB_shading_language_100
    188 ARB_shading_language_420pack
    189 ARB_shading_language_include
    190 ARB_shading_language_packing
    191 ARB_shadow
    192 ARB_shadow_ambient
    193 ARB_sparse_buffer
    194 ARB_sparse_texture
    195 ARB_sparse_texture2
    196 ARB_sparse_texture_clamp
    197 ARB_spirv_extensions
    198 ARB_stencil_texturing
    199 ARB_sync
    200 ARB_tessellation_shader
    201 ARB_texture_barrier
    202 ARB_texture_border_clamp
    203 ARB_texture_buffer_object
    204 ARB_texture_buffer_object_rgb32
    205 ARB_texture_buffer_range
    206 ARB_texture_compression
    207 ARB_texture_compression_bptc
    208 ARB_texture_compression_rgtc
    209 ARB_texture_cube_map
    210 ARB_texture_cube_map_array
    211 ARB_texture_env_add
    212 ARB_texture_env_combine
    213 ARB_texture_env_crossbar
    214 ARB_texture_env_dot3
    215 ARB_texture_filter_anisotropic
    216 ARB_texture_filter_minmax
    217 ARB_texture_float
    218 ARB_texture_gather
    219 ARB_texture_mirror_clamp_to_edge
    220 ARB_texture_mirrored_repeat
    221 ARB_texture_multisample
    222 ARB_texture_non_power_of_two
    223 ARB_texture_query_levels
    224 ARB_texture_query_lod
    225 ARB_texture_rectangle
    226 ARB_texture_rg
    227 ARB_texture_rgb10_a2ui
    228 ARB_texture_stencil8
    229 ARB_texture_storage
    230 ARB_texture_storage_multisample
    231 ARB_texture_swizzle
    232 ARB_texture_view
    233 ARB_timer_query
    234 ARB_transform_feedback2
    235 ARB_transform_feedback3
    236 ARB_transform_feedback_instanced
    237 ARB_transform_feedback_overflow_query
    238 ARB_transpose_matrix
    239 ARB_uniform_buffer_object
    240 ARB_vertex_array_bgra
    241 ARB_vertex_array_object
    242 ARB_vertex_attrib_64bit
    243 ARB_vertex_attrib_binding
    244 ARB_vertex_blend
    245 ARB_vertex_buffer_object
    246 ARB_vertex_program
    247 ARB_vertex_shader
    248 ARB_vertex_type_10f_11f_11f_rev
    249 ARB_vertex_type_2_10_10_10_rev
    250 ARB_viewport_array
    251 ARB_window_pos

    252 ARM_mali_program_binary
    253 ARM_mali_shader_binary
    254 ARM_rgba8
    255 ARM_shader_framebuffer_fetch
    256 ARM_shader_framebuffer_fetch_depth_stencil

    257 ATIX_point_sprites
    258 ATIX_texture_env_combine3
    259 ATIX_texture_env_route
    260 ATIX_vertex_shader_output_point_size

    261 ATI_draw_buffers
    262 ATI_element_array
    263 ATI_envmap_bumpmap
    264 ATI_fragment_shader
    265 ATI_map_object_buffer
    266 ATI_meminfo
    267 ATI_pn_triangles
    268 ATI_separate_stencil
    269 ATI_shader_texture_lod
    270 ATI_text_fragment_shader
    271 ATI_texture_compression_3dc
    272 ATI_texture_env_combine3
    273 ATI_texture_float
    274 ATI_texture_mirror_once
    275 ATI_vertex_array_object
    276 ATI_vertex_attrib_array_object
    277 ATI_vertex_streams

    278 EGL_KHR_context_flush_control
    279 EGL_NV_robustness_video_memory_purge

    280 EXT_422_pixels
    281 EXT_Cg_shader
    282 EXT_EGL_image_array
    283 EXT_YUV_target
    284 EXT_abgr
    285 EXT_base_instance
    286 EXT_bgra
    287 EXT_bindable_uniform
    288 EXT_blend_color
    289 EXT_blend_equation_separate
    290 EXT_blend_func_extended
    291 EXT_blend_func_separate
    292 EXT_blend_logic_op
    293 EXT_blend_minmax
    294 EXT_blend_subtract
    295 EXT_buffer_storage
    296 EXT_clear_texture
    297 EXT_clip_cull_distance
    298 EXT_clip_volume_hint
    299 EXT_cmyka
    300 EXT_color_buffer_float
    301 EXT_color_buffer_half_float
    302 EXT_color_subtable
    303 EXT_compiled_vertex_array
    304 EXT_compressed_ETC1_RGB8_sub_texture
    305 EXT_conservative_depth
    306 EXT_convolution
    307 EXT_coordinate_frame
    308 EXT_copy_image
    309 EXT_copy_texture
    310 EXT_cull_vertex
    311 EXT_debug_label
    312 EXT_debug_marker
    313 EXT_depth_bounds_test
    314 EXT_direct_state_access
    315 EXT_discard_framebuffer
    316 EXT_draw_buffers
    317 EXT_draw_buffers2
    318 EXT_draw_buffers_indexed
    319 EXT_draw_elements_base_vertex
    320 EXT_draw_instanced
    321 EXT_draw_range_elements
    322 EXT_external_buffer
    323 EXT_float_blend
    324 EXT_fog_coord
    325 EXT_frag_depth
    326 EXT_fragment_lighting
    327 EXT_framebuffer_blit
    328 EXT_framebuffer_multisample
    329 EXT_framebuffer_multisample_blit_scaled
    330 EXT_framebuffer_object
    331 EXT_framebuffer_sRGB
    332 EXT_geometry_point_size
    333 EXT_geometry_shader
    334 EXT_geometry_shader4
    335 EXT_gpu_program_parameters
    336 EXT_gpu_shader4
    337 EXT_gpu_shader5
    338 EXT_histogram
    339 EXT_index_array_formats
    340 EXT_index_func
    341 EXT_index_material
    342 EXT_index_texture
    343 EXT_instanced_arrays
    344 EXT_light_texture
    345 EXT_map_buffer_range
    346 EXT_memory_object
    347 EXT_memory_object_fd
    348 EXT_memory_object_win32
    349 EXT_misc_attribute
    350 EXT_multi_draw_arrays
    351 EXT_multi_draw_indirect
    352 EXT_multiple_textures
    353 EXT_multisample
    354 EXT_multisample_compatibility
    355 EXT_multisampled_render_to_texture
    356 EXT_multisampled_render_to_texture2
    357 EXT_multiview_draw_buffers
    358 EXT_packed_depth_stencil
    359 EXT_packed_float
    360 EXT_packed_pixels
    361 EXT_paletted_texture
    362 EXT_pixel_buffer_object
    363 EXT_pixel_transform
    364 EXT_pixel_transform_color_table
    365 EXT_point_parameters
    366 EXT_polygon_offset
    367 EXT_polygon_offset_clamp
    368 EXT_post_depth_coverage
    369 EXT_provoking_vertex
    370 EXT_pvrtc_sRGB
    371 EXT_raster_multisample
    372 EXT_read_format_bgra
    373 EXT_render_snorm
    374 EXT_rescale_normal
    375 EXT_sRGB
    376 EXT_sRGB_write_control
    377 EXT_scene_marker
    378 EXT_secondary_color
    379 EXT_semaphore
    380 EXT_semaphore_fd
    381 EXT_semaphore_win32
    382 EXT_separate_shader_objects
    383 EXT_separate_specular_color
    384 EXT_shader_framebuffer_fetch
    385 EXT_shader_group_vote
    386 EXT_shader_image_load_formatted
    387 EXT_shader_image_load_store
    388 EXT_shader_implicit_conversions
    389 EXT_shader_integer_mix
    390 EXT_shader_io_blocks
    391 EXT_shader_non_constant_global_initializers
    392 EXT_shader_pixel_local_storage
    393 EXT_shader_pixel_local_storage2
    394 EXT_shader_texture_lod
    395 EXT_shadow_funcs
    396 EXT_shadow_samplers
    397 EXT_shared_texture_palette
    398 EXT_sparse_texture
    399 EXT_sparse_texture2
    400 EXT_stencil_clear_tag
    401 EXT_stencil_two_side
    402 EXT_stencil_wrap
    403 EXT_subtexture
    404 EXT_texture
    405 EXT_texture3D
    406 EXT_texture_array
    407 EXT_texture_buffer_object
    408 EXT_texture_compression_astc_decode_mode
    409 EXT_texture_compression_astc_decode_mode_rgb9e5
    410 EXT_texture_compression_bptc
    411 EXT_texture_compression_dxt1
    412 EXT_texture_compression_latc
    413 EXT_texture_compression_rgtc
    414 EXT_texture_compression_s3tc
    415 EXT_texture_cube_map
    416 EXT_texture_cube_map_array
    417 EXT_texture_edge_clamp
    418 EXT_texture_env
    419 EXT_texture_env_add
    420 EXT_texture_env_combine
    421 EXT_texture_env_dot3
    422 EXT_texture_filter_anisotropic
    423 EXT_texture_filter_minmax
    424 EXT_texture_format_BGRA8888
    425 EXT_texture_integer
    426 EXT_texture_lod_bias
    427 EXT_texture_mirror_clamp
    428 EXT_texture_norm16
    429 EXT_texture_object
    430 EXT_texture_perturb_normal
    431 EXT_texture_rectangle
    432 EXT_texture_rg
    433 EXT_texture_sRGB
    434 EXT_texture_sRGB_R8
    435 EXT_texture_sRGB_RG8
    436 EXT_texture_sRGB_decode
    437 EXT_texture_shared_exponent
    438 EXT_texture_snorm
    439 EXT_texture_storage
    440 EXT_texture_swizzle
    441 EXT_texture_type_2_10_10_10_REV
    442 EXT_texture_view
    443 EXT_timer_query
    444 EXT_transform_feedback
    445 EXT_unpack_subimage
    446 EXT_vertex_array
    447 EXT_vertex_array_bgra
    448 EXT_vertex_array_setXXX
    449 EXT_vertex_attrib_64bit
    450 EXT_vertex_shader
    451 EXT_vertex_weighting
    452 EXT_win32_keyed_mutex
    453 EXT_window_rectangles
    454 EXT_x11_sync_object

    455 GREMEDY_frame_terminator
    456 GREMEDY_string_marker

    457 HP_convolution_border_modes
    458 HP_image_transform
    459 HP_occlusion_test
    460 HP_texture_lighting

    461 IBM_cull_vertex
    462 IBM_multimode_draw_arrays
    463 IBM_rasterpos_clip
    464 IBM_static_data
    465 IBM_texture_mirrored_repeat
    466 IBM_vertex_array_lists

    467 INGR_color_clamp
    468 INGR_interlace_read

    469 INTEL_conservative_rasterization
    470 INTEL_fragment_shader_ordering
    471 INTEL_framebuffer_CMAA
    472 INTEL_map_texture
    473 INTEL_parallel_arrays
    474 INTEL_performance_query
    475 INTEL_texture_scissor

    476 KHR_blend_equation_advanced
    477 KHR_blend_equation_advanced_coherent
    478 KHR_context_flush_control
    479 KHR_debug
    480 KHR_no_error
    481 KHR_parallel_shader_compile
    482 KHR_robust_buffer_access_behavior
    483 KHR_robustness
    484 KHR_texture_compression_astc_hdr
    485 KHR_texture_compression_astc_ldr
    486 KHR_texture_compression_astc_sliced_3d

    487 KTX_buffer_region

    488 MESAX_texture_stack

    489 MESA_pack_invert
    490 MESA_resize_buffers
    491 MESA_shader_integer_functions
    492 MESA_window_pos
    493 MESA_ycbcr_texture

    494 NVX_blend_equation_advanced_multi_draw_buffers
    495 NVX_conditional_render
    496 NVX_gpu_memory_info
    497 NVX_linked_gpu_multicast

    498 NV_3dvision_settings
    499 NV_EGL_stream_consumer_external
    500 NV_alpha_to_coverage_dither_control
    501 NV_bgr
    502 NV_bindless_multi_draw_indirect
    503 NV_bindless_multi_draw_indirect_count
    504 NV_bindless_texture
    505 NV_blend_equation_advanced
    506 NV_blend_equation_advanced_coherent
    507 NV_blend_minmax_factor
    508 NV_blend_square
    509 NV_clip_space_w_scaling
    510 NV_command_list
    511 NV_compute_program5
    512 NV_conditional_render
    513 NV_conservative_raster
    514 NV_conservative_raster_dilate
    515 NV_conservative_raster_pre_snap_triangles
    516 NV_copy_buffer
    517 NV_copy_depth_to_color
    518 NV_copy_image
    519 NV_deep_texture3D
    520 NV_depth_buffer_float
    521 NV_depth_clamp
    522 NV_depth_range_unclamped
    523 NV_draw_buffers
    524 NV_draw_instanced
    525 NV_draw_texture
    526 NV_draw_vulkan_image
    527 NV_evaluators
    528 NV_explicit_attrib_location
    529 NV_explicit_multisample
    530 NV_fbo_color_attachments
    531 NV_fence
    532 NV_fill_rectangle
    533 NV_float_buffer
    534 NV_fog_distance
    535 NV_fragment_coverage_to_color
    536 NV_fragment_program
    537 NV_fragment_program2
    538 NV_fragment_program4
    539 NV_fragment_program_option
    540 NV_fragment_shader_interlock
    541 NV_framebuffer_blit
    542 NV_framebuffer_mixed_samples
    543 NV_framebuffer_multisample
    544 NV_framebuffer_multisample_coverage
    545 NV_generate_mipmap_sRGB
    546 NV_geometry_program4
    547 NV_geometry_shader4
    548 NV_geometry_shader_passthrough
    549 NV_gpu_multicast
    550 NV_gpu_program4
    551 NV_gpu_program5
    552 NV_gpu_program5_mem_extended
    553 NV_gpu_program_fp64
    554 NV_gpu_shader5
    555 NV_half_float
    556 NV_image_formats
    557 NV_instanced_arrays
    558 NV_internalformat_sample_query
    559 NV_light_max_exponent
    560 NV_multisample_coverage
    561 NV_multisample_filter_hint
    562 NV_non_square_matrices
    563 NV_occlusion_query
    564 NV_pack_subimage
    565 NV_packed_depth_stencil
    566 NV_packed_float
    567 NV_packed_float_linear
    568 NV_parameter_buffer_object
    569 NV_parameter_buffer_object2
    570 NV_path_rendering
    571 NV_path_rendering_shared_edge
    572 NV_pixel_buffer_object
    573 NV_pixel_data_range
    574 NV_platform_binary
    575 NV_point_sprite
    576 NV_polygon_mode
    577 NV_present_video
    578 NV_primitive_restart
    579 NV_read_depth
    580 NV_read_depth_stencil
    581 NV_read_stencil
    582 NV_register_combiners
    583 NV_register_combiners2
    584 NV_robustness_video_memory_purge
    585 NV_sRGB_formats
    586 NV_sample_locations
    587 NV_sample_mask_override_coverage
    588 NV_shader_atomic_counters
    589 NV_shader_atomic_float
    590 NV_shader_atomic_float64
    591 NV_shader_atomic_fp16_vector
    592 NV_shader_atomic_int64
    593 NV_shader_buffer_load
    594 NV_shader_noperspective_interpolation
    595 NV_shader_storage_buffer_object
    596 NV_shader_thread_group
    597 NV_shader_thread_shuffle
    598 NV_shadow_samplers_array
    599 NV_shadow_samplers_cube
    600 NV_stereo_view_rendering
    601 NV_tessellation_program5
    602 NV_texgen_emboss
    603 NV_texgen_reflection
    604 NV_texture_array
    605 NV_texture_barrier
    606 NV_texture_border_clamp
    607 NV_texture_compression_latc
    608 NV_texture_compression_s3tc
    609 NV_texture_compression_s3tc_update
    610 NV_texture_compression_vtc
    611 NV_texture_env_combine4
    612 NV_texture_expand_normal
    613 NV_texture_multisample
    614 NV_texture_npot_2D_mipmap
    615 NV_texture_rectangle
    616 NV_texture_rectangle_compressed
    617 NV_texture_shader
    618 NV_texture_shader2
    619 NV_texture_shader3
    620 NV_transform_feedback
    621 NV_transform_feedback2
    622 NV_uniform_buffer_unified_memory
    623 NV_vdpau_interop
    624 NV_vertex_array_range
    625 NV_vertex_array_range2
    626 NV_vertex_attrib_integer_64bit
    627 NV_vertex_buffer_unified_memory
    628 NV_vertex_program
    629 NV_vertex_program1_1
    630 NV_vertex_program2
    631 NV_vertex_program2_option
    632 NV_vertex_program3
    633 NV_vertex_program4
    634 NV_video_capture
    635 NV_viewport_array
    636 NV_viewport_array2
    637 NV_viewport_swizzle

    638 OES_byte_coordinates

    639 OML_interlace
    640 OML_resample
    641 OML_subsample

    642 OVR_multiview
    643 OVR_multiview2
    644 OVR_multiview_multisampled_render_to_texture

    645 PGI_misc_hints
    646 PGI_vertex_hints

    647 QCOM_alpha_test
    648 QCOM_binning_control
    649 QCOM_driver_control
    650 QCOM_extended_get
    651 QCOM_extended_get2
    652 QCOM_framebuffer_foveated
    653 QCOM_perfmon_global_mode
    654 QCOM_shader_framebuffer_fetch_noncoherent
    655 QCOM_tiled_rendering
    656 QCOM_writeonly_rendering

    657 REGAL_ES1_0_compatibility
    658 REGAL_ES1_1_compatibility
    659 REGAL_enable
    660 REGAL_error_string
    661 REGAL_extension_query
    662 REGAL_log
    663 REGAL_proc_address

    664 REND_screen_coordinates

    665 S3_s3tc

    666 SGIS_clip_band_hint
    667 SGIS_color_range
    668 SGIS_detail_texture
    669 SGIS_fog_function
    670 SGIS_generate_mipmap
    671 SGIS_line_texgen
    672 SGIS_multisample
    673 SGIS_multitexture
    674 SGIS_pixel_texture
    675 SGIS_point_line_texgen
    676 SGIS_shared_multisample
    677 SGIS_sharpen_texture
    678 SGIS_texture4D
    679 SGIS_texture_border_clamp
    680 SGIS_texture_edge_clamp
    681 SGIS_texture_filter4
    682 SGIS_texture_lod
    683 SGIS_texture_select

    684 SGIX_async
    685 SGIX_async_histogram
    686 SGIX_async_pixel
    687 SGIX_bali_g_instruments
    688 SGIX_bali_r_instruments
    689 SGIX_bali_timer_instruments
    690 SGIX_blend_alpha_minmax
    691 SGIX_blend_cadd
    692 SGIX_blend_cmultiply
    693 SGIX_calligraphic_fragment
    694 SGIX_clipmap
    695 SGIX_color_matrix_accuracy
    696 SGIX_color_table_index_mode
    697 SGIX_complex_polar
    698 SGIX_convolution_accuracy
    699 SGIX_cube_map
    700 SGIX_cylinder_texgen
    701 SGIX_datapipe
    702 SGIX_decimation
    703 SGIX_depth_pass_instrument
    704 SGIX_depth_texture
    705 SGIX_dvc
    706 SGIX_flush_raster
    707 SGIX_fog_blend
    708 SGIX_fog_factor_to_alpha
    709 SGIX_fog_layers
    710 SGIX_fog_offset
    711 SGIX_fog_patchy
    712 SGIX_fog_scale
    713 SGIX_fog_texture
    714 SGIX_fragment_lighting_space
    715 SGIX_fragment_specular_lighting
    716 SGIX_fragments_instrument
    717 SGIX_framezoom
    718 SGIX_icc_texture
    719 SGIX_igloo_interface
    720 SGIX_image_compression
    721 SGIX_impact_pixel_texture
    722 SGIX_instrument_error
    723 SGIX_interlace
    724 SGIX_ir_instrument1
    725 SGIX_line_quality_hint
    726 SGIX_list_priority
    727 SGIX_mpeg1
    728 SGIX_mpeg2
    729 SGIX_nonlinear_lighting_pervertex
    730 SGIX_nurbs_eval
    731 SGIX_occlusion_instrument
    732 SGIX_packed_6bytes
    733 SGIX_pixel_texture
    734 SGIX_pixel_texture_bits
    735 SGIX_pixel_texture_lod
    736 SGIX_pixel_tiles
    737 SGIX_polynomial_ffd
    738 SGIX_quad_mesh
    739 SGIX_reference_plane
    740 SGIX_resample
    741 SGIX_scalebias_hint
    742 SGIX_shadow
    743 SGIX_shadow_ambient
    744 SGIX_slim
    745 SGIX_spotlight_cutoff
    746 SGIX_sprite
    747 SGIX_subdiv_patch
    748 SGIX_subsample
    749 SGIX_tag_sample_buffer
    750 SGIX_texture_add_env
    751 SGIX_texture_coordinate_clamp
    752 SGIX_texture_lod_bias
    753 SGIX_texture_mipmap_anisotropic
    754 SGIX_texture_multi_buffer
    755 SGIX_texture_phase
    756 SGIX_texture_range
    757 SGIX_texture_scale_bias
    758 SGIX_texture_supersample
    759 SGIX_vector_ops
    760 SGIX_vertex_array_object
    761 SGIX_vertex_preclip
    762 SGIX_vertex_preclip_hint
    763 SGIX_ycrcb
    764 SGIX_ycrcb_subsample
    765 SGIX_ycrcba

    766 SGI_color_matrix
    767 SGI_color_table
    768 SGI_complex
    769 SGI_complex_type
    770 SGI_fft
    771 SGI_texture_color_table

    772 SUNX_constant_data

    773 SUN_convolution_border_modes
    774 SUN_global_alpha
    775 SUN_mesh_array
    776 SUN_read_video_pixels
    777 SUN_slice_accum
    778 SUN_triangle_list
    779 SUN_vertex

    780 WIN_phong_shading
    781 WIN_scene_markerXXX
    782 WIN_specular_fog
    783 WIN_swap_hint
    + +
    + + diff --git a/Thirdparty/glew/doc/glew.png b/Thirdparty/glew/doc/glew.png new file mode 100644 index 0000000000000000000000000000000000000000..d46550f194988fe99362932b29f48aeded97111e GIT binary patch literal 9298 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 SQv}cd07nix*}k?RB>f+9$xcWB literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/doc/glew.txt b/Thirdparty/glew/doc/glew.txt new file mode 100644 index 0000000..67b4aff --- /dev/null +++ b/Thirdparty/glew/doc/glew.txt @@ -0,0 +1,29 @@ +The OpenGL Extension Wrangler Library +Copyright (C) 2008-2016, Nigel Stewart +Copyright (C) 2002-2008, Milan Ikits +Copyright (C) 2002-2008, Marcelo E. Magallon +Copyright (C) 2002, Lev Povalahev +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Thirdparty/glew/doc/glxew.html b/Thirdparty/glew/doc/glxew.html new file mode 100644 index 0000000..d1ee00c --- /dev/null +++ b/Thirdparty/glew/doc/glxew.html @@ -0,0 +1,186 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Supported GLX Extensions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1 3DFX_multisample

    2 AMD_gpu_association

    3 ARB_context_flush_control
    4 ARB_create_context
    5 ARB_create_context_no_error
    6 ARB_create_context_profile
    7 ARB_create_context_robustness
    8 ARB_fbconfig_float
    9 ARB_framebuffer_sRGB
    10 ARB_get_proc_address
    11 ARB_multisample
    12 ARB_robustness_application_isolation
    13 ARB_robustness_share_group_isolation
    14 ARB_vertex_buffer_object

    15 ATI_pixel_format_float
    16 ATI_render_texture

    17 EXT_buffer_age
    18 EXT_create_context_es2_profile
    19 EXT_create_context_es_profile
    20 EXT_fbconfig_packed_float
    21 EXT_framebuffer_sRGB
    22 EXT_import_context
    23 EXT_libglvnd
    24 EXT_scene_marker
    25 EXT_stereo_tree
    26 EXT_swap_control
    27 EXT_swap_control_tear
    28 EXT_texture_from_pixmap
    29 EXT_visual_info
    30 EXT_visual_rating

    31 INTEL_swap_event

    32 MESA_agp_offset
    33 MESA_copy_sub_buffer
    34 MESA_pixmap_colormap
    35 MESA_query_renderer
    36 MESA_release_buffers
    37 MESA_set_3dfx_mode
    38 MESA_swap_control

    39 NV_copy_buffer
    40 NV_copy_image
    41 NV_delay_before_swap
    42 NV_float_buffer
    43 NV_multisample_coverage
    44 NV_present_video
    45 NV_robustness_video_memory_purge
    46 NV_swap_group
    47 NV_vertex_array_range
    48 NV_video_capture
    49 NV_video_out

    50 OML_swap_method
    51 OML_sync_control

    52 SGIS_blended_overlay
    53 SGIS_color_range
    54 SGIS_multisample
    55 SGIS_shared_multisample

    56 SGIX_fbconfig
    57 SGIX_hyperpipe
    58 SGIX_pbuffer
    59 SGIX_swap_barrier
    60 SGIX_swap_group
    61 SGIX_video_resize
    62 SGIX_visual_select_group

    63 SGI_cushion
    64 SGI_make_current_read
    65 SGI_swap_control
    66 SGI_video_sync

    67 SUN_get_transparent_index
    68 SUN_video_resize
    + +
    + + diff --git a/Thirdparty/glew/doc/gpl.txt b/Thirdparty/glew/doc/gpl.txt new file mode 100644 index 0000000..b7b5f53 --- /dev/null +++ b/Thirdparty/glew/doc/gpl.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Thirdparty/glew/doc/index.html b/Thirdparty/glew/doc/index.html new file mode 100644 index 0000000..84e7407 --- /dev/null +++ b/Thirdparty/glew/doc/index.html @@ -0,0 +1,214 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    +The OpenGL Extension Wrangler Library (GLEW) is a cross-platform +open-source C/C++ extension loading library. GLEW provides efficient +run-time mechanisms for determining which OpenGL extensions are +supported on the target platform. OpenGL core and extension +functionality is exposed in a single header file. GLEW has been +tested on a variety of operating systems, including Windows, Linux, +Mac OS X, FreeBSD, Irix, and Solaris. +

    + +

    Downloads

    +

    +GLEW is distributed +as source and precompiled binaries.
    +The latest release is +2.1.0[07-31-17]: +

    +

    +

    +

    + + + +
    + + + + + + + + + + + + + + + +
    Source +ZIP |  +TGZ
    Binaries +Windows 32-bit and 64-bit +
    +
    + +

    +

    +An up-to-date copy is also available using git: +

    +
      +
    • github
      +git clone https://github.com/nigels-com/glew.git glew
       
    • +
    + +

    Supported Extensions

    +

    +The latest release contains support for OpenGL 4.6, compatibility and forward-compatible contexts and the following extensions: +

    + + +

    News

    +
      +
    • [07-31-17] GLEW 2.1.0 adds support for OpenGL 4.6, new extensions and minor bug fixes
    • +
    • [07-24-16] GLEW 2.0.0 adds support for forward-compatible contexts, adds new extensions, OSMesa and EGL support, MX discontinued and minor bug fixes
    • +
    • [08-10-15] GLEW 1.13.0 adds support for new extensions, fixes minor bugs
    • +
    • [26-01-15] GLEW 1.12.0 fixes minor bugs and adds new extensions
    • +
    • [08-11-14] GLEW 1.11.0 adds support for OpenGL 4.5, new extensions
    • +
    • [07-22-13] GLEW 1.10.0 adds support for OpenGL 4.4, new extensions
    • +
    • [08-06-12] GLEW 1.9.0 adds support for OpenGL 4.3, new extensions
    • +
    • [07-17-12] GLEW 1.8.0 fixes minor bugs and adds new extensions
    • +
    • [08-26-11] GLEW 1.7.0 adds support for OpenGL 4.2, new extensions, fixes bugs
    • +
    • [04-27-11] GLEW 1.6.0 fixes minor bugs and adds eight new extensions
    • +
    • [01-31-11] GLEW 1.5.8 fixes minor bugs and adds two new extensions
    • +
    • [11-03-10] GLEW 1.5.7 fixes minor bugs and adds one new extension
    • +
    • [09-07-10] GLEW 1.5.6 adds support for OpenGL 4.1, fixes bugs
    • +
    • [07-13-10] GLEW 1.5.5 fixes minor bugs and adds new extensions
    • +
    • [04-21-10] GLEW 1.5.4 adds support for OpenGL 3.3, OpenGL 4.0 and new extensions, fixes bugs
    • +
    • [02-28-10] GLEW 1.5.3 fixes minor bugs and adds three new extensions
    • +
    • [12-31-09] GLEW 1.5.2 adds support for OpenGL 3.1, OpenGL 3.2 and new extensions
    • +
    • [11-03-08] GLEW 1.5.1 adds support for OpenGL 3.0 and 31 new extensions
    • +
    • [12-27-07] GLEW 1.5.0 is released under less restrictive licenses
    • +
    • [04-27-07] GLEW 1.4.0 is released
    • +
    • [03-08-07] GLEW is included in the NVIDIA OpenGL SDK
    • +
    • [03-04-07] GLEW 1.3.6 is released
    • +
    • [02-28-07] Repository is migrated to SVN
    • +
    • [02-25-07] GLEW is included in the OpenGL SDK
    • +
    • [11-21-06] GLEW 1.3.5 adds OpenGL 2.1 and NVIDIA G80 extensions
    • +
    • [03-04-06] GLEW 1.3.4 adds support for five new extensions
    • +
    • [05-16-05] GLEW 1.3.3 is released
    • +
    • [03-16-05] GLEW 1.3.2 adds support for GL_APPLE_pixel_buffer
    • +
    • [02-11-05] gljava and sdljava provide a Java binding to OpenGL via GLEW
    • +
    • [02-02-05] GLEW 1.3.1 adds support for GL_EXT_framebuffer_object
    • +
    • [01-04-05] GLEW 1.3.0 adds core OpenGL 2.0 support plus many enhancements
    • +
    • [12-22-04] GLEWpy Python wrapper announced
    • +
    • [12-12-04] Mailing lists created on sourceforge
    • +
    • [12-06-04] GLEW 1.2.5 adds new extensions and support for FreeBSD
    • +
    + +

    Links

    + + + +
    + + diff --git a/Thirdparty/glew/doc/install.html b/Thirdparty/glew/doc/install.html new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/Thirdparty/glew/doc/install.html @@ -0,0 +1,228 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Installation

    + +

    +To use the shared library version of GLEW, you need to copy the +headers and libraries into their destination directories. On Windows +this typically boils down to copying: +

    + + + + + + + + + + +
    bin/glew32.dll    to    %SystemRoot%/system32
    lib/glew32.lib    to    {VC Root}/Lib
    include/GL/glew.h    to    {VC Root}/Include/GL
    include/GL/wglew.h    to    {VC Root}/Include/GL
    +

    +

    + +

    +where {VC Root} is the Visual C++ root directory, typically +C:/Program Files/Microsoft Visual Studio/VC98 for Visual +Studio 6.0 or C:/Program Files/Microsoft Visual +Studio .NET 2003/Vc7/PlatformSDK for Visual Studio .NET. +

    + +

    +On Unix, typing make install will attempt to install GLEW +into /usr/include/GL and /usr/lib. You can +customize the installation target via the GLEW_DEST +environment variable if you do not have write access to these +directories. +

    + +

    Building Your Project with GLEW

    +

    +There are two ways to build your project with GLEW. +

    +

    Including the source files / project file

    +

    +The simpler but less flexible way is to include glew.h and +glew.c into your project. On Windows, you also need to +define the GLEW_STATIC preprocessor token when building a +static library or executable, and the GLEW_BUILD preprocessor +token when building a dll. You also need to replace +<GL/gl.h> and <GL/glu.h> with +<glew.h> in your code and set the appropriate include +flag (-I) to tell the compiler where to look for it. For +example: +

    +

    +#include <glew.h>
    +#include <GL/glut.h>
    +<gl, glu, and glut functionality is available here>
    +

    +

    +Depending on where you put glew.h you may also need to change +the include directives in glew.c. Note that if you are using +GLEW together with GLUT, you have to include glew.h first. +In addition, glew.h includes glu.h, so you do not +need to include it separately. +

    +

    +On Windows, you also have the option of adding the supplied project +file glew_static.dsp to your workspace (solution) and compile +it together with your other projects. In this case you also need to +change the GLEW_BUILD preprocessor constant to +GLEW_STATIC when building a static library or executable, +otherwise you get build errors. +

    +

    +Note that GLEW does not use the C +runtime library, so it does not matter which version (single-threaded, +multi-threaded or multi-threaded DLL) it is linked with (without +debugging information). It is, however, always a good idea to compile all +your projects including GLEW with the same C runtime settings. +

    + +

    Using GLEW as a shared library

    + +

    +Alternatively, you can use the provided project files / makefile to +build a separate shared library you can link your projects with later. +In this case the best practice is to install glew.h, +glew32.lib, and glew32.dll / libGLEW.so to +where the OpenGL equivalents gl.h, opengl32.lib, and +opengl32.dll / libGL.so are located. Note that you +need administrative privileges to do this. If you do not have +administrator access and your system administrator will not do it for +you, you can install GLEW into your own lib and include subdirectories +and tell the compiler where to find it. Then you can just replace +<GL/gl.h> with <GL/glew.h> in your +program: +

    + +

    +#include <GL/glew.h>
    +#include <GL/glut.h>
    +<gl, glu, and glut functionality is available here>
    +

    + +

    +or: +

    + +

    +#include <GL/glew.h>
    +<gl and glu functionality is available here>
    +

    + +

    +Remember to link your project with glew32.lib, +glu32.lib, and opengl32.lib on Windows and +libGLEW.so, libGLU.so, and libGL.so on +Unix (-lGLEW -lGLU -lGL). +

    + +

    +It is important to keep in mind that glew.h includes neither +windows.h nor gl.h. Also, GLEW will warn you by +issuing a preprocessor error in case you have included gl.h, +glext.h, or glATI.h before glew.h. +

    + + +
    + + diff --git a/Thirdparty/glew/doc/khronos.txt b/Thirdparty/glew/doc/khronos.txt new file mode 100644 index 0000000..ffc271c --- /dev/null +++ b/Thirdparty/glew/doc/khronos.txt @@ -0,0 +1,20 @@ +Copyright (c) 2007 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. diff --git a/Thirdparty/glew/doc/log.html b/Thirdparty/glew/doc/log.html new file mode 100644 index 0000000..a343f2b --- /dev/null +++ b/Thirdparty/glew/doc/log.html @@ -0,0 +1,1238 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Change Log

    + +
    +
      +
    • 2.1.0 [07-31-17] +
        +
      • Enhancements: +
          +
        • OpenGL 4.6 support added +
        • Improved Mac OSX build support +
        • Improved cmake build support +
        +
      + +
        +
      • Bug fixes: +
          +
        • Resovled crash when glXGetCurrentDisplay() is NULL +
        • CMake: only install PDB files with MSVC +
        • wglGetProcAddress crash with NOGDI defined +
        • Mac: using -Os rather than -O2 +
        +
      + +
        +
      • New extensions: +
          +
        • GL_AMD_gpu_shader_half_float +
        • GL_AMD_shader_ballot +
        • GL_ARB_gl_spirv +
        • GL_EGL_KHR_context_flush_control +
        • GL_INTEL_conservative_rasterization +
        • GL_MESA_shader_integer_functions +
        • GL_NVX_blend_equation_advanced_multi_draw_buffers +
        • GL_NV_gpu_multicast +
        • EGL_ARM_implicit_external_sync +
        • EGL_EXT_gl_colorspace_bt2020_linear +
        • EGL_EXT_gl_colorspace_bt2020_pq +
        • EGL_EXT_gl_colorspace_scrgb_linear +
        • EGL_EXT_image_dma_buf_import_modifiers +
        • EGL_EXT_pixel_format_float +
        • EGL_EXT_surface_SMPTE2086_metadata +
        • EGL_KHR_context_flush_control +
        • EGL_KHR_no_config_context +
        • EGL_KHR_stream_attrib +
        • EGL_MESA_platform_surfaceless +
        • EGL_NV_stream_cross_display +
        • EGL_NV_stream_cross_object +
        • EGL_NV_stream_cross_partition +
        • EGL_NV_stream_cross_process +
        • EGL_NV_stream_cross_system +
        • EGL_NV_stream_fifo_next +
        • EGL_NV_stream_fifo_synchronous +
        • EGL_NV_stream_frame_limits +
        • EGL_NV_stream_remote +
        • EGL_NV_stream_reset +
        • EGL_NV_stream_socket +
        • EGL_NV_stream_socket_inet +
        • EGL_NV_stream_socket_unix +
        • WGL_EXT_colorspace +
        +
      + +
    + +
    +
      +
    • 2.0.0 [07-24-16] +
        +
      • Enhancements: +
          +
        • Forward context support added +
        • OSMesa support added +
        • EGL support added +
        • MX support discontinued +
        • Improved cmake build support +
        +
      +
        +
      • New extensions: +
          +
        • GL_AMD_shader_explicit_vertex_parameter +
        • GL_ARB_gl_spirv +
        • GL_EGL_NV_robustness_video_memory_purge +
        • GL_EXT_window_rectangles +
        • GL_INTEL_conservative_rasterization +
        • GL_KHR_texture_compression_astc_sliced_3d +
        • GL_MESA_shader_integer_functions +
        • GL_NVX_blend_equation_advanced_multi_draw_buffers +
        • GL_NVX_linked_gpu_multicast +
        • GL_NV_clip_space_w_scaling +
        • GL_NV_command_list +
        • GL_NV_conservative_raster_pre_snap_triangles +
        • GL_NV_draw_vulkan_image +
        • GL_NV_gpu_multicast +
        • GL_NV_robustness_video_memory_purge +
        • GL_NV_shader_atomic_float64 +
        • GL_NV_stereo_view_rendering +
        • GL_NV_viewport_swizzle +
        • GLX_EXT_libglvnd +
        • GLX_NV_robustness_video_memory_purge +
        +
      +
    + +
    +
      +
    • 1.13.0 [08-10-15] +
        +
      • Enhancements: +
          +
        • glxewInit, wglewInit +
        • glewinfo adds support for -version, -profile core|compatibility and -flag debug|forward parameters +
        • Improved cmake build support +
        +
      +
        +
      • New extensions: +
          +
        • GL_ARB_ES3_2_compatibility +
        • GL_ARB_fragment_shader_interlock +
        • GL_ARB_gpu_shader_int64 +
        • GL_ARB_parallel_shader_compile +
        • GL_ARB_post_depth_coverage +
        • GL_ARB_sample_locations +
        • GL_ARB_shader_atomic_counter_ops +
        • GL_ARB_shader_ballot +
        • GL_ARB_shader_clock +
        • GL_ARB_shader_viewport_layer_array +
        • GL_ARB_sparse_texture2 +
        • GL_ARB_sparse_texture_clamp +
        • GL_ARB_texture_filter_minmax +
        • GL_INTEL_framebuffer_CMAA +
        • GL_KHR_no_error +
        • GL_NV_conservative_raster_dilate +
        • GL_OVR_multiview +
        • GL_OVR_multiview2 +
        +
      • Bug fixes +
      +
    + +
    +
      +
    • 1.12.0 [01-26-15] +
        +
      • New extensions: +
          +
        • GL_EXT_polygon_offset_clamp +
        • GL_EXT_post_depth_coverage +
        • GL_EXT_raster_multisample +
        • GL_EXT_sparse_texture2 +
        • GL_EXT_texture_filter_minmax +
        • GL_NV_conservative_raster +
        • GL_NV_fill_rectangle +
        • GL_NV_fragment_coverage_to_color +
        • GL_NV_fragment_shader_interlock +
        • GL_NV_framebuffer_mixed_samples +
        • GL_NV_geometry_shader_passthrough +
        • GL_NV_internalformat_sample_query +
        • GL_NV_sample_locations +
        • GL_NV_sample_mask_override_coverage +
        • GL_NV_shader_atomic_fp16_vector +
        • GL_NV_uniform_buffer_unified_memory +
        • GL_NV_viewport_array2 +
        +
      • Bug fixes +
      +
    + +
    +
      +
    • 1.11.0 [08-11-14] +
        +
      • New features: +
          +
        • Support for OpenGL 4.5 +
        +
      • New extensions: +
          +
        • GL_AMD_gcn_shader +
        • GL_AMD_gpu_shader_int64 +
        • GL_AMD_occlusion_query_event +
        • GL_AMD_shader_atomic_counter_ops +
        • GL_AMD_shader_stencil_value_export +
        • GL_AMD_transform_feedback4 +
        • GL_ARB_ES3_1_compatibility +
        • GL_ARB_clip_control +
        • GL_ARB_conditional_render_inverted +
        • GL_ARB_cull_distance +
        • GL_ARB_derivative_control +
        • GL_ARB_direct_state_access +
        • GL_ARB_get_texture_sub_image +
        • GL_ARB_pipeline_statistics_query +
        • GL_ARB_shader_texture_image_samples +
        • GL_ARB_sparse_buffer +
        • GL_ARB_texture_barrier +
        • GL_ARB_transform_feedback_overflow_query +
        • GL_EXT_debug_label +
        • GL_EXT_shader_image_load_formatted +
        • GL_EXT_shader_integer_mix +
        • GL_INTEL_fragment_shader_ordering +
        • GL_INTEL_performance_query +
        • GL_KHR_blend_equation_advanced +
        • GL_KHR_blend_equation_advanced_coherent +
        • GL_KHR_context_flush_control +
        • GL_KHR_robust_buffer_access_behavior +
        • GL_KHR_robustness +
        • GL_KHR_texture_compression_astc_hdr +
        • GL_NV_bindless_multi_draw_indirect_count +
        • GL_NV_shader_atomic_int64 +
        • GL_NV_shader_thread_group +
        • GL_NV_shader_thread_shuffle +
        • GL_REGAL_proc_address +
        • GLX_ARB_context_flush_control +
        • GLX_EXT_stereo_tree +
        • GLX_MESA_query_renderer +
        • GLX_NV_copy_buffer +
        • GLX_NV_delay_before_swap +
        • WGL_ARB_context_flush_control +
        • WGL_NV_delay_before_swap +
        +
      • Bug fixes +
      +
    + +
    +
      +
    • 1.10.0 [07-22-13] +
        +
      • New features: +
          +
        • Support for OpenGL 4.4 +
        +
      • New extensions: +
          +
        • GL_AMD_interleaved_elements +
        • GL_AMD_shader_trinary_minmax +
        • GL_AMD_sparse_texture +
        • GL_ANGLE_depth_texture +
        • GL_ANGLE_framebuffer_blit +
        • GL_ANGLE_framebuffer_multisample +
        • GL_ANGLE_instanced_arrays +
        • GL_ANGLE_pack_reverse_row_order +
        • GL_ANGLE_program_binary +
        • GL_ANGLE_texture_compression_dxt1 +
        • GL_ANGLE_texture_compression_dxt3 +
        • GL_ANGLE_texture_compression_dxt5 +
        • GL_ANGLE_texture_usage +
        • GL_ANGLE_timer_query +
        • GL_ANGLE_translated_shader_source +
        • GL_ARB_bindless_texture +
        • GL_ARB_buffer_storage +
        • GL_ARB_clear_texture +
        • GL_ARB_compute_variable_group_size +
        • GL_ARB_enhanced_layouts +
        • GL_ARB_indirect_parameters +
        • GL_ARB_multi_bind +
        • GL_ARB_query_buffer_object +
        • GL_ARB_seamless_cubemap_per_texture +
        • GL_ARB_shader_draw_parameters +
        • GL_ARB_shader_group_vote +
        • GL_ARB_sparse_texture +
        • GL_ARB_texture_mirror_clamp_to_edge +
        • GL_ARB_texture_stencil8 +
        • GL_ARB_vertex_type_10f_11f_11f_rev +
        • GL_INTEL_map_texture +
        • GL_NVX_conditional_render +
        • GL_NV_bindless_multi_draw_indirect +
        • GL_NV_blend_equation_advanced +
        • GL_NV_compute_program5 +
        • GL_NV_deep_texture3D +
        • GL_NV_draw_texture +
        • GL_NV_shader_atomic_counters +
        • GL_NV_shader_storage_buffer_object +
        • GL_REGAL_ES1_0_compatibility +
        • GL_REGAL_ES1_1_compatibility +
        • GL_REGAL_enable +
        • GLX_EXT_buffer_age +
        • WGL_ARB_robustness_application_isolation +
        • WGL_ARB_robustness_share_group_isolation +
        +
      • Bug fixes +
      +
    + +
    +
      +
    • 1.9.0 [08-06-12] +
        +
      • New features: + +
      • New extensions: +
          +
        • GL_ARB_ES3_compatibility +
        • GL_ARB_clear_buffer_object +
        • GL_ARB_compute_shader +
        • GL_ARB_copy_image +
        • GL_ARB_explicit_uniform_location +
        • GL_ARB_fragment_layer_viewport +
        • GL_ARB_framebuffer_no_attachments +
        • GL_ARB_internalformat_query2 +
        • GL_ARB_multi_draw_indirect +
        • GL_ARB_program_interface_query +
        • GL_ARB_robust_buffer_access_behavior +
        • GL_ARB_robustness_application_isolation +
        • GL_ARB_robustness_share_group_isolation +
        • GL_ARB_shader_image_size +
        • GL_ARB_shader_storage_buffer_object +
        • GL_ARB_stencil_texturing +
        • GL_ARB_texture_buffer_range +
        • GL_ARB_texture_query_levels +
        • GL_ARB_texture_storage_multisample +
        • GL_ARB_texture_view +
        • GL_ARB_vertex_attrib_binding +
        • GL_EXT_debug_marker +
        • GL_KHR_debug +
        • GL_REGAL_error_string +
        • GL_REGAL_extension_query +
        • GL_REGAL_log +
        • GLX_ARB_robustness_application_isolation +
        • GLX_ARB_robustness_share_group_isolation +
        • GLX_EXT_create_context_es_profile +
        • WGL_EXT_create_context_es_profile +
        +
      • Bug fixes: +
          +
        • Not using GLU library for Makefile builds. +
        +
      +
    + +
    +
      +
    • 1.8.0 [07-17-12] +
        +
      • New extensions: +
          +
        • GL_AMD_pinned_memory +
        • GL_AMD_query_buffer_object +
        • GL_AMD_stencil_operation_extended +
        • GL_AMD_vertex_shader_layer +
        • GL_AMD_vertex_shader_viewport_index +
        • GL_NV_bindless_texture +
        • GL_NV_shader_atomic_float +
        • GLX_EXT_swap_control_tear +
        • WGL_EXT_swap_control_tear +
        • WGL_NV_DX_interop2 +
        +
      • Bug fixes: +
          +
        • MS Visual Studio 2010 projects added +
        • GLX_NV_video_out replaces GLX_NV_video_output +
        • ANSI C prototype for glewInit +
        • Improved CentOS build support +
        • Improved GL_ARB_gpu_shader_fp64 support +
        • ARB_texture_compression_bptc and ARB_copy_buffer constants +
        • Linux needs to define GLEW_STATIC for static library builds +
        • Custom code generation problem resolved +
        • GLEWAPIENTRY added to glew.h for calling convention customization +
        • Correction for glPathStencilDepthOffsetNV +
        • Resolve OSX gcc warnings +
        • Added build support for NetBSD +
        +
      +
    + +
    +
      +
    • 1.7.0 [08-26-11] +
        +
      • New features: +
          +
        • Support for OpenGL 4.2 +
        +
      • New extensions: +
          +
        • GL_AMD_multi_draw_indirect +
        • GL_ARB_base_instance +
        • GL_ARB_compressed_texture_pixel_storage +
        • GL_ARB_conservative_depth +
        • GL_ARB_internalformat_query +
        • GL_ARB_map_buffer_alignment +
        • GL_ARB_shader_atomic_counters +
        • GL_ARB_shader_image_load_store +
        • GL_ARB_shading_language_420pack +
        • GL_ARB_shading_language_packing +
        • GL_ARB_texture_storage +
        • GL_ARB_transform_feedback_instanced +
        • GL_EXT_framebuffer_multisample_blit_scaled +
        • GL_NV_path_rendering +
        • GL_NV_path_rendering +
        • GLX_MESA_swap_control +
        +
      • Bug fixes: +
          +
        • const qualifiers for GL 1.4 MultiDrawArrays, MultiDrawElements +
        • Add glGetGraphicsResetStatusARB to GL_ARB_robustness +
        • Remove EXT suffix from GL_KTX_buffer_region entry points +
        • Solaris needs inttypes.h +
        • Add ERROR_INVALID_VERSION_ARB and ERROR_INVALID_PROFILE_ARB to WGL_ARB_create_context +
        • Add GLX_MESA_swap_control +
        • Set -install_name for OSX +
        • Add 64-bit darwin build option (SYSTEM=darwin_x86-64) +
        • Add GL_NV_path_rendering +
        +
      +
    + +
    +
      +
    • 1.6.0 [04-27-11] +
        +
      • New extensions: +
          +
        • GL_AMD_blend_minmax_factor +
        • GL_AMD_sample_positions +
        • GL_EXT_x11_sync_object +
        • GL_NV_texture_multisample +
        • GL_NV_video_capture +
        • GLX_NV_video_capture +
        • WGL_NV_DX_interop +
        • WGL_NV_video_capture +
        +
      • Bug fixes: +
          +
        • Define GLEW_NO_GLU for no glu dependency. +
        • mx suffix for GLEW MX libraries, build both libraries by default. +
        • Cygwin build improvements +
        • Soname of GLEWmx shared libraries +
        • Query GL extension string only once +
        • GLX_OML_sync_control no longer requires C99 +
        • glDraw*InstancedARB moved from GL_ARB_draw_instanced to GL_ARB_instanced_arrays +
        • glFramebufferTextureLayerEXT moved from GL_EXT_geometry_shader4 to GL_EXT_texture_array +
        • Fixes for BSD build +
        +
      +
    + +
    +
      +
    • 1.5.8 [01-31-11] +
        +
      • New extensions: +
          +
        • GL_AMD_depth_clamp_separate +
        • GL_EXT_texture_sRGB_decode +
        +
      • Bug fixes: +
          +
        • Borland C++ fix for __int64 +
        • GL_DOUBLE_MATNxM enumerants for OpenGL 4.0 +
        • Correction to glGetTransformFeedbackVarying +
        • Correction to glSecondaryColorPointer +
        • Corrections to glGetVertexAttribPointerv and glGetShaderSource +
        • Switched code repository from svn to git +
        +
      +
    + +
    +
      +
    • 1.5.7 [11-03-10] +
        +
      • New extension: +
          +
        • GL_NVX_gpu_memory_info +
        +
      • Bug fixes: +
          +
        • Improved mingw32 build support +
        • Improved cygwin build support +
        • glGetPointervEXT fix +
        • Add GLEW_VERSION_1_2_1 +
        +
      +
    + +
    +
      +
    • 1.5.6 [09-07-10] +
        +
      • New features: +
          +
        • Support for OpenGL 4.1 +
        +
      • New extensions: +
          +
        • GL_ARB_ES2_compatibility +
        • GL_ARB_cl_event +
        • GL_ARB_debug_output +
        • GL_ARB_get_program_binary +
        • GL_ARB_robustness +
        • GL_ARB_separate_shader_objects +
        • GL_ARB_shader_precision +
        • GL_ARB_shader_stencil_export +
        • GL_ARB_vertex_attrib_64bit +
        • GL_ARB_viewport_array +
        • GLX_ARB_create_context_robustness +
        • GLX_EXT_create_context_es2_profile +
        • WGL_ARB_create_context_robustness +
        • WGL_EXT_create_context_es2_profile +
        +
      +
    + +
    +
      +
    • 1.5.5 [07-13-10] +
        +
      • New extensions: +
          +
        • GL_AMD_debug_output +
        • GL_AMD_name_gen_delete +
        • GL_AMD_transform_feedback3_lines_triangles +
        • GL_NV_multisample_coverage +
        • GL_NV_vdpau_interop +
        • GLX_AMD_gpu_association +
        • GLX_NV_multisample_coverage +
        • WGL_NV_multisample_coverage +
        +
      • Bug fixes: +
          +
        • Compilation issue with GLX_SGI_video_sync +
        • OpenGL 4.0 double-precision uniform functions added +
        • Constness of glPointParameterfvARB and glPointParameterfvEXT +
        • Added glVertexAttribDivisor +
        • Compilation issue with Nvidia GLX headers +
        +
      +
    + +
    +
      +
    • 1.5.4 [04-21-10] +
        +
      • New features: +
          +
        • Support for OpenGL 3.3 +
        • Support for OpenGL 4.0 +
        +
      • New extensions: +
          +
        • GL_AMD_conservative_depth +
        • GL_ARB_blend_func_extended +
        • GL_ARB_draw_indirect +
        • GL_ARB_explicit_attrib_location +
        • GL_ARB_gpu_shader5 +
        • GL_ARB_gpu_shader_fp64 +
        • GL_ARB_occlusion_query2 +
        • GL_ARB_sampler_objects +
        • GL_ARB_shader_bit_encoding +
        • GL_ARB_shader_subroutine +
        • GL_ARB_shading_language_include +
        • GL_ARB_tessellation_shader +
        • GL_ARB_texture_buffer_object_rgb32 +
        • GL_ARB_texture_compression_bptc +
        • GL_ARB_texture_rgb10_a2ui +
        • GL_ARB_texture_swizzle +
        • GL_ARB_timer_query +
        • GL_ARB_transform_feedback2 +
        • GL_ARB_transform_feedback3 +
        • GL_ARB_vertex_type_2_10_10_10_rev +
        • GL_EXT_shader_image_load_store +
        • GL_EXT_vertex_attrib_64bit +
        • GL_NV_gpu_program5 +
        • GL_NV_gpu_program_fp64 +
        • GL_NV_gpu_shader5 +
        • GL_NV_tessellation_program5 +
        • GL_NV_vertex_attrib_integer_64bit +
        • GLX_ARB_vertex_buffer_object +
        +
      • Bug fixes: +
          +
        • Parameter constness fix for glPointParameteriv and glPointParameterfv +
        +
      +
    + +
    +
      +
    • 1.5.3 [02-28-10] +
        +
      • New extensions: +
          +
        • GLX_INTEL_swap_event +
        • GL_AMD_seamless_cubemap_per_texture +
        • GL_AMD_shader_stencil_export +
        +
      • Bug fixes: +
          +
        • Correct version detection for GL 3.1 and 3.2 +
        • Missing 3.1 enumerants +
        • Add glew.pc +
        +
      +
    + +
    +
      +
    • 1.5.2 [12-31-09] +
        +
      • New features: +
          +
        • Support for OpenGL 3.1 +
        • Support for OpenGL 3.2 +
        +
      • New extensions: +
          +
        • GL_AMD_draw_buffers_blend +
        • GL_AMD_performance_monitor +
        • GL_AMD_texture_texture4 +
        • GL_AMD_vertex_shader_tessellator +
        • GL_APPLE_aux_depth_stencil +
        • GL_APPLE_object_purgeable +
        • GL_APPLE_rgb_422 +
        • GL_APPLE_row_bytes +
        • GL_APPLE_vertex_program_evaluators +
        • GL_ARB_compatibility +
        • GL_ARB_copy_buffer +
        • GL_ARB_depth_clamp +
        • GL_ARB_draw_buffers_blend +
        • GL_ARB_draw_elements_base_vertex +
        • GL_ARB_fragment_coord_conventions +
        • GL_ARB_provoking_vertex +
        • GL_ARB_sample_shading +
        • GL_ARB_seamless_cube_map +
        • GL_ARB_shader_texture_lod +
        • GL_ARB_sync +
        • GL_ARB_texture_cube_map_array +
        • GL_ARB_texture_gather +
        • GL_ARB_texture_multisample +
        • GL_ARB_texture_query_lod +
        • GL_ARB_uniform_buffer_object +
        • GL_ARB_vertex_array_bgra +
        • GL_ATI_meminfo +
        • GL_EXT_provoking_vertex +
        • GL_EXT_separate_shader_objects +
        • GL_EXT_texture_snorm +
        • GL_NV_copy_image +
        • GL_NV_parameter_buffer_object2 +
        • GL_NV_shader_buffer_load +
        • GL_NV_texture_barrier +
        • GL_NV_transform_feedback2 +
        • GL_NV_vertex_buffer_unified_memory +
        • WGL_AMD_gpu_association +
        • WGL_ARB_create_context_profile +
        • WGL_NV_copy_image +
        • GLX_ARB_create_context_profile +
        • GLX_EXT_swap_control +
        • GLX_NV_copy_image +
        +
      • Bug fixes: +
          +
        • DOS line endings for windows .zip archives only. +
        • glTransformFeedbackVaryings arguments. +
        • Resource leak in glewinfo and visualinfo tools. +
        • WIN32_LEAN_AND_MEAN preprocessor pollution. +
        • Fixed version detection for GLEW_VERSION_2_1 and GLEW_VERSION_3_0. +
        • MesaGLUT glut.h GLAPIENTRY dependency. +
        • glFramebufferTextureLayer correction. +
        • OSX compiler warnings resolved. +
        • Cygwin linking to opengl32 by default, rather than X11 OpenGL. +
        • SnowLeopard (OSX 10.6) gl.h detection. +
        • Use $(STRIP) consistently. +
        +
      +
    + +
    +
      +
    • 1.5.1 [11-03-08] +
        +
      • New features: +
          +
        • Support for OpenGL 3.0 +
        +
      • New extensions: +
          +
        • GL_ARB_depth_buffer_float +
        • GL_ARB_draw_instance, +
        • GL_ARB_framebuffer_object +
        • GL_ARB_framebuffer_sRGB +
        • GL_ARB_geometry_shader4 +
        • GL_ARB_half_float_pixel +
        • GL_ARB_half_float_vertex +
        • GL_ARB_instanced_arrays +
        • GL_ARB_map_buffer_range +
        • GL_ARB_texture_buffer_object +
        • GL_ARB_texture_compression_rgtc +
        • GL_ARB_vertex_array_object +
        • GL_EXT_direct_state_access +
        • GL_EXT_texture_swizzle +
        • GL_EXT_transform_feedback +
        • GL_EXT_vertex_array_bgra +
        • GL_NV_conditional_render +
        • GL_NV_explicit_multisample +
        • GL_NV_present_video +
        • GL_SGIS_point_line_texgen +
        • GL_SGIX_convolution_accuracy +
        • WGL_ARB_create_context +
        • WGL_ARB_framebuffer_sRGB +
        • WGL_NV_present_video +
        • WGL_NV_swap_group +
        • WGL_NV_video_output +
        • GLX_ARB_create_context +
        • GLX_ARB_framebuffer_sRGB +
        • GLX_NV_present_video +
        • GLX_NV_swap_group +
        • GLX_NV_video_output +
        +
      • Bug fixes: +
          +
        • Licensing issues with documentation +
        • Problems with long long and _MSC_VER on MINGW +
        • Incorrect parameter for glGetUniformLocation +
        • glewGetExtension fails on last entry +
        • Incomplete GL_NV_texture_shader tokens +
        • Scripting problems on Cygwin +
        • Incorrect definition for GLint on OS X +
        +
      +
    + +
    +
      +
    • 1.5.0 [12-27-07] +
        +
      • New features: +
          +
        • Licensing change (BSD, Mesa 3-D, Khronos) +
        • Switch to using registry on www.opengl.org +
        • Support for major and minor version strings +
        +
      • New extensions: +
          +
        • GL_APPLE_flush_buffer_range +
        • GL_GREMEDY_frame_terminator +
        • GLX_EXT_texture_from_pixmap +
        +
      • Bug fixes: +
          +
        • Incorrent 64-bit type definitions +
        • Do not strip static library on install +
        • Missing tokens in GL_ATI_fragment_shader and WGL_{ARB,EXT}_make_current_read +
        • Missing tokens in GL_VERSION_2_1 +
        • Missing functions in GL_VERSION_1_4 +
        • Incorrect parameter type for glXCopyContext +
        +
      +
    +
    +
      +
    • 1.4.0 [04-27-07] +
        +
      • New features: +
          +
        • Extension variables are declared const to avoid possible +corruption of their values +
        +
      • New extensions: +
          +
        • GL_NV_depth_range_unclamped +
        +
      • Bug fixes: +
          +
        • Incorrect tokens in GL_NV_transform_feedback and GL_NV_framebuffer_multisample_coverage +
        • Incorrect function names in GL_EXT_gpu_program_parameters +
        • Missing tokens in GL_EXT_framebuffer_multisample +
        • GLEW_MX initialization problem for WGL_{ARB,EXT}_extensions_string +
        +
      +
    +
    +
      +
    • 1.3.6 [03-04-07] +
        +
      • New extensions: +
          +
        • GL_ATI_shader_texture_lod +
        • GL_EXT_gpu_program_parameters +
        • GL_NV_geometry_shader4 +
        • WGL_NV_gpu_affinity +
        • GLX_SGIX_hyperpipe +
        +
      • Bug fixes: +
          +
        • Missing include guards in glxew.h +
        • Makefile and install problems for Cygwin builds +
        • Install problem for Linux AMD64 builds +
        • Incorrent token in GL_ATI_texture_compression_3dc +
        • Missing tokens from GL_ATIX_point_sprites +
        +
      +
    +
    +
      +
    • 1.3.5 [11-21-06] +
        +
      • New features: +
          +
        • Support for core OpenGL 2.1 +
        • Debug support for glewIsSupported +
        +
      • New extensions: +
          +
        • GL_EXT_bindable_uniform +
        • GL_EXT_draw_buffers2 +
        • GL_EXT_draw_instanced +
        • GL_EXT_framebuffer_sRGB +
        • GL_EXT_geometry_shader4 +
        • GL_EXT_gpu_shader4 +
        • GL_EXT_packed_float +
        • GL_EXT_texture_array +
        • GL_EXT_texture_buffer_object +
        • GL_EXT_texture_compression_latc +
        • GL_EXT_texture_compression_rgtc +
        • GL_EXT_texture_integer +
        • GL_EXT_texture_shared_exponent +
        • GL_EXT_timer_query +
        • GL_NV_depth_buffer_float +
        • GL_NV_fragment_program4 +
        • GL_NV_framebuffer_multisample_coverage +
        • GL_NV_geometry_program4 +
        • GL_NV_gpu_program4 +
        • GL_NV_parameter_buffer_object +
        • GL_NV_transform_feedback +
        • GL_NV_vertex_program4 +
        • GL_OES_byte_coordinates +
        • GL_OES_compressed_paletted_texture +
        • GL_OES_read_format +
        • GL_OES_single_precision +
        • WGL_EXT_pixel_format_packed_float +
        • WGL_EXT_framebuffer_sRGB +
        • GLX_EXT_fbconfig_packed_float +
        • GLX_EXT_framebuffer_sRGB +
        +
      • Bug fixes: +
          +
        • Wrong GLXContext definition on Solaris +
        • Makefile problem for parallel builds +
        +
      +
    +
    +
      +
    • 1.3.4 [03-04-06] +
        +
      • New extensions: +
          +
        • GL_EXT_framebuffer_blit +
        • GL_EXT_framebuffer_multisample +
        • GL_EXT_packed_depth_stencil +
        • GL_MESAX_texture_stack +
        • WGL_3DL_stereo_control +
        +
      +
        +
      • Bug fixes: +
          +
        • glBlendEquation missing from GL_ARB_imaging +
        • Wrong APIENTRY definition for Cygwin +
        • Incorrect OS X OpenGL types +
        • Unix 64-bit installation patch +
        +
      +
    +
    +
      +
    • 1.3.3 [05-16-05] +
        +
      • New feature: +
          +
        • Code generation option to split source into multiple files +
        +
      +
        +
      • Bug fixes: +
          +
        • OpenGL 2.0 core initialization problems +
        • Wrong value for token GL_SHADER_TYPE +
        • Missing tokens in GL_ATI_fragment_shader +
        • Missing entry points in GL_ARB_transpose_matrix +
        +
      +
    +
    +
      +
    • 1.3.2 [03-16-05] +
        +
      • New extension: +
          +
        • GL_APPLE_pixel_buffer +
        +
      • Bug fixes: +
          +
        • Missing OpenGL 2.0 entry points +
        • Missing tokens in GL_SGIX_shadow +
        • MinGW makefile problem +
        • Check for incorrect OpenGL version string on SiS hardware +
        • Documentation update to meet the HTML 4.01 Transitional specification +
        +
      +
    +
    +
      +
    • 1.3.1 [02-02-05] +
        +
      • New features: +
          +
        • Consistent Unix and Windows versioning +
        +
      • New extensions: +
          +
        • GL_EXT_framebuffer_object +
        • GL_ARB_pixel_buffer_object +
        +
      • Bug fixes: +
          +
        • Missing OpenGL 2.0 tokens +
        • Incorrect typedefs (GLhandleARB and GLhalf) +
        • Borland compiler problems +
        +
      +
    +
    +
      +
    • 1.3.0 [01-04-05] +
        +
      • New features: +
          +
        • Support for core OpenGL 2.0 +
        • glewIsSupported provides efficient string-based extension checks +
        • Custom code generation from a list of extensions +
        • Makefile changes +
        +
      • New extensions: +
          +
        • WGL_ATI_render_texture_rectangle +
        +
      • Bug fixes: +
          +
        • Incorrect function signature in OpenGL 1.5 core +
        +
      +
    +
    +
      +
    • 1.2.5 [12-06-04] +
        +
      • New extensions: +
          +
        • GL_ATI_texture_compression_3dc +
        • GL_EXT_Cg_shader +
        • GL_EXT_draw_range_elements +
        • GL_KTX_buffer_region +
        +
      • Bug fixes: +
          +
        • OpenGL version detection bug +
        • Problems with wxWindows and MinGW compilation +
        • visualinfo compilation problem with GLEW_MX specified +
        • Wrong token name in OpenGL 1.5 core +
        +
      • Support for FreeBSD +
      +
    +
    +
      +
    • 1.2.4 [09-06-04] +
        +
      • Added ARB_draw_buffers and ARB_texture_rectangle +
      • Fixed bug in ARB_shader_objects +
      • Replaced wglinfo with visualinfo +
      +
    +
    +
      +
    • 1.2.3 [06-10-04] +
        +
      • Added GL_NV_fragment_program2, GL_NV_fragment_program_option, GL_NV_vertex_program2_option, GL_NV_vertex_program3 +
      • Bug fix in GL_ARB_vertex_blend +
      +
    +
    +
      +
    • 1.2.2 [05-08-04] +
        +
      • Added GL_EXT_pixel_buffer_object, removed GL_NV_element_array +
      • Fixed GLEW_MX problems +
      • Bug fix in GL_EXT_texture_rectangle and wglinfo +
      +
    +
    +
      +
    • 1.2.1 [03-18-04] +
        +
      • Bug fix in OpenGL version query (early release of 1.2.0 contained this bug) +
      • Bug fix in GL_ARB_shader_objects and temporary bug fix in GL_ARB_vertex_shader +
      • Added flags on GDI support and multisampling to wglinfo +
      +
    +
    +
      +
    • 1.2.0 [02-19-04] +
        +
      • Added full OpenGL 1.5 support +
      • Added support for multiple rendering contexts with different capabilities +
      • Added command line flags to glewinfo for selecting displays and visuals +
      • Added GLX_SGIS_multisample, GLX_SUN_video_resize, and GL_SUN_read_video_pixels +
      • Added MinGW/MSYS support +
      • Bug fixes in GL_ARB_shader_objects and the OS X build +
      +
    +
    +
      +
    • 1.1.4 [12-15-03] +
        +
      • Added GL_APPLE_float_pixels, GL_APPLE_texture_range, +GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, +GLX_ATI_pixel_format_float, and GLX_ATI_render_texture +
      • Bug fixes in GL_ATI_map_object_buffer and GL_ATI_fragment_shader +
      +
    +
    +
      +
    • 1.1.3 [10-28-03] +
        +
      • Added Solaris and Darwin support +
      • Added GL_ARB_fragment_shader, GL_ARB_shader_objects, and GL_ARB_vertex_shader +
      • Fixed bug in GL_WIN_swap_hint +
      • Removed glewinfo's dependency on GLUT +
      +
    +
    +
      +
    • 1.1.2 [09-15-03] +
        +
      • Removed dependency on WGL_{ARB,EXT}_extensions_string to make GLEW run on Matrox cards +
      • Added glewGetString for querying the GLEW version string +
      +
    +
    +
      +
    • 1.1.1 [08-11-03] +
        +
      • Added GLX_NV_float_buffer, GL_ARB_shading_language_100, and GL_ARB_texture_non_power_of_two +
      • Fixed bug in GL_ARB_vertex_buffer_object +
      • Minor updates in documentation +
      +
    +
    +
      +
    • 1.1.0 [07-08-03] +
        +
      • Added automatic code generation +
      • Added almost every extension in the registry +
      • Added separate namespace +
      • Added Irix support +
      • Updated documentation +
      +
    +
    +
      +
    • 1.0.7 [06-29-03] +
        +
      • Added GL_EXT_depth_bounds_test +
      • Fixed typos +
      +
    +
    +
      +
    • 1.0.6 [05-05-03] +
        +
      • Added ARB_vertex_buffer_object and NV_half_float +
      • Updated wglinfo +
      • Temporary Linux bug fixes (problems with SDL and MESA) +
      +
    +
    +
      +
    • 1.0.5 [02-17-03] +
        +
      • Bug fixes +
      • Added wglinfo +
      • Updated documentation +
      +
    +
    +
      +
    • 1.0.4 [02-02-03] +
        +
      • Added NV_texture_expand_normal +
      • Added mingw support +
      • Updated documentation +
      +
    +
    +
      +
    • 1.0.3 [01-09-03] +
        +
      • Cleaned up ATI extensions +
      • Changed function prototypes to match glext.h +
      • Added EXT_texture3D +
      • Fixed typos in ATI_vertex_attrib_array_object and ATI_draw_buffers +
      +
    +
    +
      +
    • 1.0.2 [12-21-02] +
        +
      • Added list of supported extensions to documentation +
      • Added NV_half_float and NV_texgen_emboss +
      +
    +
    +
      +
    • 1.0.1 [12-17-02] +
        +
      • Bug fixes +
      • Added glewGetExtension +
      +
    +
    +
      +
    • 1.0.0 [12-12-02] +
        +
      • Initial release +
      +
    +
    + + +
    + + diff --git a/Thirdparty/glew/doc/mesa.txt b/Thirdparty/glew/doc/mesa.txt new file mode 100644 index 0000000..a82dd4b --- /dev/null +++ b/Thirdparty/glew/doc/mesa.txt @@ -0,0 +1,21 @@ +Mesa 3-D graphics library +Version: 7.0 + +Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + +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 +BRIAN PAUL 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/Thirdparty/glew/doc/new.png b/Thirdparty/glew/doc/new.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce2b47960a7085d7e599044ae16187cdd79153a GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0vp^l0eME!3-o9=sc?gQk(@Ik;M!Q+`=Ht$S`Y;1W=GA z-O<;Pfnj4`&F{d;K)yn~JGFCa<74&D@oYeyX$c9*zYc!<&#ugD zEX;h`K5fE3d!7AtAbrBj%8&UMxaGCg^YE;B^S_bhGyeiTHjt*I2Wij#@s`{#4`Wk1 zcAm$Fr+$BdfkAy*0t1JF+Jam2V}O}iVy5K2zYp1VP2u#YVZOw`c!VS5Vy&Rj?)<-SyMXD!>frJ-_3sASzYj7t}CiK1p=3en~oMXMs0 zp<*ct%eofjl3TJ-(qdI^m2LK5SM7iMo##By?|HxX{oe2Ue&+~!1;YTbG`BDZ5C#BG z^Z|kiKrsvUV21$+U;zMzC^Q9>j6DP0y?|#8ia;VF-fI{{IaegvG-cAr$-% zyi7#UDPi1KI0RrU1%pFmWT|v@8d?~_U@-(7?w?{11_l&a4J!7qoUyIjV@;Yo9g$Iw zwoA&XHPNDe?Ybnep+RT?ECyP2fR@y#5;=^jl5$F?YX$v)1fw(xOhH%vF~{!Kxt)s! z?%_keW6F^I80R_JiZSj!yu+@s%A>_gC*>(!?^49Er%`#T7;Q9&4Uw z-EIlfky)}8LTeJxnIIg-y2UN(Ramxv8>^DkK%xQ=`xS0V{X=6p_H^~XW^`TSKPWN)tgl3YJ<~ubbI;-Vdj4CXCJwVady>xra zWO-bIaf9DJezwZYvKeN{Y>%_OxVSEq)8$u&oGBaVJCs-P>Ev=6UP{|LCtKbuuCsYb zwrcIZCe7;iKX5a-ePBh8!80*>E8H(f2trZ5ZBbvR1FLx?Cep3^o7pM8W1yVqJ;&VP zxuC_&2d{_Lf9$Aww>3yM182byPn0$qh<80wNYD-;>8IAc9ez4u`zii@+Gve>{khq$ z>G5AK9Q|WqyYh4~xi2D*^_k(Ly&s9lqx9v<^(L{2#--+t@6xRN%su9{9W+|Ks91BC z39Sda0z3w;C)+Y^&QP_oJ9s_D{_I%W_<-~mi7|fKMaSdGY~RNL0TNdU75ZmY%lw#( zllY9a?gx1#8^gF2ao%d>e(KHl3ZC>`R^_^cDE>6vm^%2E%kr=g3^8R>YMt0FKHaB1 zW>hs}f-J|pg_)d6Id<;xb&HZ8bqCVG0~J-*Zs(j<#}uTJWY3u*XPYPbpx#jvR$LA4Pc<>()X8nt`|KPF>{P;;dAT~9_is`OE)U>Od*|$Lt~cMlxqRfd zOjS~u*^y%P{tKGi zxAIr+b%`2l7=CRb>V&wl&l$rfPWVM(Q%zny9}ZOaeLHr>CTsVC<=7hmK>1((2_$yc zC?{l=;wf!lLZw(C7DIg`$M^!SzkT$|cdU_yaEySHfAJ9MAl{-{U?PU|tUl?g>!nO-738Ql%gH zTo<-ge()QhXCy`ef zqflsIxci3Yjr@#CFDbs(hM{>8iHSsr9!1Kqd>DF^R2HtmQ+;tPa^*XN(d8o?14x#X&d7--kaK%y3_cy2dRU7~S literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/doc/travis.png b/Thirdparty/glew/doc/travis.png new file mode 100644 index 0000000000000000000000000000000000000000..caf2607e2e344c84da434397c060c406673bf39f GIT binary patch literal 2541 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 Dhk(Rc literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/doc/wglew.html b/Thirdparty/glew/doc/wglew.html new file mode 100644 index 0000000..bf5c9da --- /dev/null +++ b/Thirdparty/glew/doc/wglew.html @@ -0,0 +1,170 @@ + + + + + +GLEW: The OpenGL Extension Wrangler Library + + + + + + + + +
    + + + + + + + + +
    + + + + + + + +
    Latest Release: 2.1.0

    GLEW Logo

    + + + + + + + + + + + + + + + +
    Download
    Usage
    Building
    Installation
    Source Generation
    Change Log

    GitHub
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page
    +

    +
    + + + + +
    Last Update: 07-31-17
    + OpenGL Logo
    + GitHub Logo
    + Travis Logo
    + SourceForge Logo +
    +
    +
    + +

    The OpenGL Extension Wrangler Library

    + + + + +

    Supported WGL Extensions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1 3DFX_multisample

    2 3DL_stereo_control

    3 AMD_gpu_association

    4 ARB_buffer_region
    5 ARB_context_flush_control
    6 ARB_create_context
    7 ARB_create_context_no_error
    8 ARB_create_context_profile
    9 ARB_create_context_robustness
    10 ARB_extensions_string
    11 ARB_framebuffer_sRGB
    12 ARB_make_current_read
    13 ARB_multisample
    14 ARB_pbuffer
    15 ARB_pixel_format
    16 ARB_pixel_format_float
    17 ARB_render_texture
    18 ARB_robustness_application_isolation
    19 ARB_robustness_share_group_isolation

    20 ATI_pixel_format_float
    21 ATI_render_texture_rectangle

    22 EXT_colorspace
    23 EXT_create_context_es2_profile
    24 EXT_create_context_es_profile
    25 EXT_depth_float
    26 EXT_display_color_table
    27 EXT_extensions_string
    28 EXT_framebuffer_sRGB
    29 EXT_make_current_read
    30 EXT_multisample
    31 EXT_pbuffer
    32 EXT_pixel_format
    33 EXT_pixel_format_packed_float
    34 EXT_swap_control
    35 EXT_swap_control_tear

    36 I3D_digital_video_control
    37 I3D_gamma
    38 I3D_genlock
    39 I3D_image_buffer
    40 I3D_swap_frame_lock
    41 I3D_swap_frame_usage

    42 NV_DX_interop
    43 NV_DX_interop2
    44 NV_copy_image
    45 NV_delay_before_swap
    46 NV_float_buffer
    47 NV_gpu_affinity
    48 NV_multisample_coverage
    49 NV_present_video
    50 NV_render_depth_texture
    51 NV_render_texture_rectangle
    52 NV_swap_group
    53 NV_vertex_array_range
    54 NV_video_capture
    55 NV_video_output

    56 OML_sync_control
    + +
    + + diff --git a/Thirdparty/glew/include/GL/eglew.h b/Thirdparty/glew/include/GL/eglew.h new file mode 100644 index 0000000..4670147 --- /dev/null +++ b/Thirdparty/glew/include/GL/eglew.h @@ -0,0 +1,2618 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 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. +*/ + +#ifndef __eglew_h__ +#define __eglew_h__ +#define __EGLEW_H__ + +#ifdef __eglext_h_ +#error eglext.h included before eglew.h +#endif + +#if defined(__egl_h_) +#error egl.h included before eglew.h +#endif + +#define __eglext_h_ + +#define __egl_h_ + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY +#endif +#ifndef EGLAPI +#define EGLAPI extern +#endif + +/* EGL Types */ +#include + +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int32_t EGLint; + +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); + +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; + +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; + +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef void *EGLImageKHR; +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void *EGLDeviceEXT; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; + +struct EGLClientPixmapHI; + +#define EGL_DONT_CARE ((EGLint)-1) + +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_IMAGE ((EGLImage)0) +#define EGL_NO_SURFACE ((EGLSurface)0) +#define EGL_NO_SYNC ((EGLSync)0) + +#define EGL_UNKNOWN ((EGLint)-1) + +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) + +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); +/* ---------------------------- EGL_VERSION_1_0 ---------------------------- */ + +#ifndef EGL_VERSION_1_0 +#define EGL_VERSION_1_0 1 + +#define EGL_FALSE 0 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_TRUE 1 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_WINDOW_BIT 0x0004 +#define EGL_SUCCESS 0x3000 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_RED_SIZE 0x3024 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_NONE 0x3038 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_EXTENSIONS 0x3055 +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_DRAW 0x3059 +#define EGL_READ 0x305A +#define EGL_CORE_NATIVE_ENGINE 0x305B + +typedef EGLBoolean ( * PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLBoolean ( * PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext ( * PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean ( * PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean ( * PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLDisplay ( * PFNEGLGETCURRENTDISPLAYPROC) ( void ); +typedef EGLSurface ( * PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); +typedef EGLDisplay ( * PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); +typedef EGLint ( * PFNEGLGETERRORPROC) ( void ); +typedef EGLBoolean ( * PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLBoolean ( * PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLBoolean ( * PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef const char * ( * PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean ( * PFNEGLTERMINATEPROC) (EGLDisplay dpy); +typedef EGLBoolean ( * PFNEGLWAITGLPROC) ( void ); +typedef EGLBoolean ( * PFNEGLWAITNATIVEPROC) (EGLint engine); + +#define eglChooseConfig EGLEW_GET_FUN(__eglewChooseConfig) +#define eglCopyBuffers EGLEW_GET_FUN(__eglewCopyBuffers) +#define eglCreateContext EGLEW_GET_FUN(__eglewCreateContext) +#define eglCreatePbufferSurface EGLEW_GET_FUN(__eglewCreatePbufferSurface) +#define eglCreatePixmapSurface EGLEW_GET_FUN(__eglewCreatePixmapSurface) +#define eglCreateWindowSurface EGLEW_GET_FUN(__eglewCreateWindowSurface) +#define eglDestroyContext EGLEW_GET_FUN(__eglewDestroyContext) +#define eglDestroySurface EGLEW_GET_FUN(__eglewDestroySurface) +#define eglGetConfigAttrib EGLEW_GET_FUN(__eglewGetConfigAttrib) +#define eglGetConfigs EGLEW_GET_FUN(__eglewGetConfigs) +#define eglGetCurrentDisplay EGLEW_GET_FUN(__eglewGetCurrentDisplay) +#define eglGetCurrentSurface EGLEW_GET_FUN(__eglewGetCurrentSurface) +#define eglGetDisplay EGLEW_GET_FUN(__eglewGetDisplay) +#define eglGetError EGLEW_GET_FUN(__eglewGetError) +#define eglInitialize EGLEW_GET_FUN(__eglewInitialize) +#define eglMakeCurrent EGLEW_GET_FUN(__eglewMakeCurrent) +#define eglQueryContext EGLEW_GET_FUN(__eglewQueryContext) +#define eglQueryString EGLEW_GET_FUN(__eglewQueryString) +#define eglQuerySurface EGLEW_GET_FUN(__eglewQuerySurface) +#define eglSwapBuffers EGLEW_GET_FUN(__eglewSwapBuffers) +#define eglTerminate EGLEW_GET_FUN(__eglewTerminate) +#define eglWaitGL EGLEW_GET_FUN(__eglewWaitGL) +#define eglWaitNative EGLEW_GET_FUN(__eglewWaitNative) + +#define EGLEW_VERSION_1_0 EGLEW_GET_VAR(__EGLEW_VERSION_1_0) + +#endif /* EGL_VERSION_1_0 */ + +/* ---------------------------- EGL_VERSION_1_1 ---------------------------- */ + +#ifndef EGL_VERSION_1_1 +#define EGL_VERSION_1_1 1 + +#define EGL_CONTEXT_LOST 0x300E +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_BACK_BUFFER 0x3084 + +typedef EGLBoolean ( * PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean ( * PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean ( * PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean ( * PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); + +#define eglBindTexImage EGLEW_GET_FUN(__eglewBindTexImage) +#define eglReleaseTexImage EGLEW_GET_FUN(__eglewReleaseTexImage) +#define eglSurfaceAttrib EGLEW_GET_FUN(__eglewSurfaceAttrib) +#define eglSwapInterval EGLEW_GET_FUN(__eglewSwapInterval) + +#define EGLEW_VERSION_1_1 EGLEW_GET_VAR(__EGLEW_VERSION_1_1) + +#endif /* EGL_VERSION_1_1 */ + +/* ---------------------------- EGL_VERSION_1_2 ---------------------------- */ + +#ifndef EGL_VERSION_1_2 +#define EGL_VERSION_1_2 1 + +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_COLORSPACE 0x3087 +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_CLIENT_APIS 0x308D +#define EGL_RGB_BUFFER 0x308E +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_DISPLAY_SCALING 10000 + +typedef EGLBoolean ( * PFNEGLBINDAPIPROC) (EGLenum api); +typedef EGLSurface ( * PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); +typedef EGLenum ( * PFNEGLQUERYAPIPROC) ( void ); +typedef EGLBoolean ( * PFNEGLRELEASETHREADPROC) ( void ); +typedef EGLBoolean ( * PFNEGLWAITCLIENTPROC) ( void ); + +#define eglBindAPI EGLEW_GET_FUN(__eglewBindAPI) +#define eglCreatePbufferFromClientBuffer EGLEW_GET_FUN(__eglewCreatePbufferFromClientBuffer) +#define eglQueryAPI EGLEW_GET_FUN(__eglewQueryAPI) +#define eglReleaseThread EGLEW_GET_FUN(__eglewReleaseThread) +#define eglWaitClient EGLEW_GET_FUN(__eglewWaitClient) + +#define EGLEW_VERSION_1_2 EGLEW_GET_VAR(__EGLEW_VERSION_1_2) + +#endif /* EGL_VERSION_1_2 */ + +/* ---------------------------- EGL_VERSION_1_3 ---------------------------- */ + +#ifndef EGL_VERSION_1_3 +#define EGL_VERSION_1_3 1 + +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_CONFORMANT 0x3042 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 + +#define EGLEW_VERSION_1_3 EGLEW_GET_VAR(__EGLEW_VERSION_1_3) + +#endif /* EGL_VERSION_1_3 */ + +/* ---------------------------- EGL_VERSION_1_4 ---------------------------- */ + +#ifndef EGL_VERSION_1_4 +#define EGL_VERSION_1_4 1 + +#define EGL_OPENGL_BIT 0x0008 +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_OPENGL_API 0x30A2 + +typedef EGLContext ( * PFNEGLGETCURRENTCONTEXTPROC) ( void ); + +#define eglGetCurrentContext EGLEW_GET_FUN(__eglewGetCurrentContext) + +#define EGLEW_VERSION_1_4 EGLEW_GET_VAR(__EGLEW_VERSION_1_4) + +#endif /* EGL_VERSION_1_4 */ + +/* ---------------------------- EGL_VERSION_1_5 ---------------------------- */ + +#ifndef EGL_VERSION_1_5 +#define EGL_VERSION_1_5 1 + +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SIGNALED 0x30F2 +#define EGL_UNSIGNALED 0x30F3 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLImage ( * PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); +typedef EGLSync ( * PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); +typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void * native_display, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); + +#define eglClientWaitSync EGLEW_GET_FUN(__eglewClientWaitSync) +#define eglCreateImage EGLEW_GET_FUN(__eglewCreateImage) +#define eglCreatePlatformPixmapSurface EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurface) +#define eglCreatePlatformWindowSurface EGLEW_GET_FUN(__eglewCreatePlatformWindowSurface) +#define eglCreateSync EGLEW_GET_FUN(__eglewCreateSync) +#define eglDestroyImage EGLEW_GET_FUN(__eglewDestroyImage) +#define eglDestroySync EGLEW_GET_FUN(__eglewDestroySync) +#define eglGetPlatformDisplay EGLEW_GET_FUN(__eglewGetPlatformDisplay) +#define eglGetSyncAttrib EGLEW_GET_FUN(__eglewGetSyncAttrib) +#define eglWaitSync EGLEW_GET_FUN(__eglewWaitSync) + +#define EGLEW_VERSION_1_5 EGLEW_GET_VAR(__EGLEW_VERSION_1_5) + +#endif /* EGL_VERSION_1_5 */ + +/* ------------------------- EGL_ANDROID_blob_cache ------------------------ */ + +#ifndef EGL_ANDROID_blob_cache +#define EGL_ANDROID_blob_cache 1 + +typedef void ( * PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); + +#define eglSetBlobCacheFuncsANDROID EGLEW_GET_FUN(__eglewSetBlobCacheFuncsANDROID) + +#define EGLEW_ANDROID_blob_cache EGLEW_GET_VAR(__EGLEW_ANDROID_blob_cache) + +#endif /* EGL_ANDROID_blob_cache */ + +/* ---------------- EGL_ANDROID_create_native_client_buffer ---------------- */ + +#ifndef EGL_ANDROID_create_native_client_buffer +#define EGL_ANDROID_create_native_client_buffer 1 + +#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 +#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 +#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 +#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 + +typedef EGLClientBuffer ( * PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint * attrib_list); + +#define eglCreateNativeClientBufferANDROID EGLEW_GET_FUN(__eglewCreateNativeClientBufferANDROID) + +#define EGLEW_ANDROID_create_native_client_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_create_native_client_buffer) + +#endif /* EGL_ANDROID_create_native_client_buffer */ + +/* --------------------- EGL_ANDROID_framebuffer_target -------------------- */ + +#ifndef EGL_ANDROID_framebuffer_target +#define EGL_ANDROID_framebuffer_target 1 + +#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 + +#define EGLEW_ANDROID_framebuffer_target EGLEW_GET_VAR(__EGLEW_ANDROID_framebuffer_target) + +#endif /* EGL_ANDROID_framebuffer_target */ + +/* ----------------- EGL_ANDROID_front_buffer_auto_refresh ----------------- */ + +#ifndef EGL_ANDROID_front_buffer_auto_refresh +#define EGL_ANDROID_front_buffer_auto_refresh 1 + +#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C + +#define EGLEW_ANDROID_front_buffer_auto_refresh EGLEW_GET_VAR(__EGLEW_ANDROID_front_buffer_auto_refresh) + +#endif /* EGL_ANDROID_front_buffer_auto_refresh */ + +/* -------------------- EGL_ANDROID_image_native_buffer -------------------- */ + +#ifndef EGL_ANDROID_image_native_buffer +#define EGL_ANDROID_image_native_buffer 1 + +#define EGL_NATIVE_BUFFER_ANDROID 0x3140 + +#define EGLEW_ANDROID_image_native_buffer EGLEW_GET_VAR(__EGLEW_ANDROID_image_native_buffer) + +#endif /* EGL_ANDROID_image_native_buffer */ + +/* --------------------- EGL_ANDROID_native_fence_sync --------------------- */ + +#ifndef EGL_ANDROID_native_fence_sync +#define EGL_ANDROID_native_fence_sync 1 + +#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 +#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 +#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 + +typedef EGLint ( * PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); + +#define eglDupNativeFenceFDANDROID EGLEW_GET_FUN(__eglewDupNativeFenceFDANDROID) + +#define EGLEW_ANDROID_native_fence_sync EGLEW_GET_VAR(__EGLEW_ANDROID_native_fence_sync) + +#endif /* EGL_ANDROID_native_fence_sync */ + +/* --------------------- EGL_ANDROID_presentation_time --------------------- */ + +#ifndef EGL_ANDROID_presentation_time +#define EGL_ANDROID_presentation_time 1 + +typedef EGLBoolean ( * PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); + +#define eglPresentationTimeANDROID EGLEW_GET_FUN(__eglewPresentationTimeANDROID) + +#define EGLEW_ANDROID_presentation_time EGLEW_GET_VAR(__EGLEW_ANDROID_presentation_time) + +#endif /* EGL_ANDROID_presentation_time */ + +/* ------------------------- EGL_ANDROID_recordable ------------------------ */ + +#ifndef EGL_ANDROID_recordable +#define EGL_ANDROID_recordable 1 + +#define EGL_RECORDABLE_ANDROID 0x3142 + +#define EGLEW_ANDROID_recordable EGLEW_GET_VAR(__EGLEW_ANDROID_recordable) + +#endif /* EGL_ANDROID_recordable */ + +/* ---------------- EGL_ANGLE_d3d_share_handle_client_buffer --------------- */ + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 + +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 + +#define EGLEW_ANGLE_d3d_share_handle_client_buffer EGLEW_GET_VAR(__EGLEW_ANGLE_d3d_share_handle_client_buffer) + +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ + +/* -------------------------- EGL_ANGLE_device_d3d ------------------------- */ + +#ifndef EGL_ANGLE_device_d3d +#define EGL_ANGLE_device_d3d 1 + +#define EGL_D3D9_DEVICE_ANGLE 0x33A0 +#define EGL_D3D11_DEVICE_ANGLE 0x33A1 + +#define EGLEW_ANGLE_device_d3d EGLEW_GET_VAR(__EGLEW_ANGLE_device_d3d) + +#endif /* EGL_ANGLE_device_d3d */ + +/* -------------------- EGL_ANGLE_query_surface_pointer -------------------- */ + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 + +typedef EGLBoolean ( * PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void ** value); + +#define eglQuerySurfacePointerANGLE EGLEW_GET_FUN(__eglewQuerySurfacePointerANGLE) + +#define EGLEW_ANGLE_query_surface_pointer EGLEW_GET_VAR(__EGLEW_ANGLE_query_surface_pointer) + +#endif /* EGL_ANGLE_query_surface_pointer */ + +/* ------------- EGL_ANGLE_surface_d3d_texture_2d_share_handle ------------- */ + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 + +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 + +#define EGLEW_ANGLE_surface_d3d_texture_2d_share_handle EGLEW_GET_VAR(__EGLEW_ANGLE_surface_d3d_texture_2d_share_handle) + +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ + +/* ---------------------- EGL_ANGLE_window_fixed_size ---------------------- */ + +#ifndef EGL_ANGLE_window_fixed_size +#define EGL_ANGLE_window_fixed_size 1 + +#define EGL_FIXED_SIZE_ANGLE 0x3201 + +#define EGLEW_ANGLE_window_fixed_size EGLEW_GET_VAR(__EGLEW_ANGLE_window_fixed_size) + +#endif /* EGL_ANGLE_window_fixed_size */ + +/* --------------------- EGL_ARM_implicit_external_sync -------------------- */ + +#ifndef EGL_ARM_implicit_external_sync +#define EGL_ARM_implicit_external_sync 1 + +#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A + +#define EGLEW_ARM_implicit_external_sync EGLEW_GET_VAR(__EGLEW_ARM_implicit_external_sync) + +#endif /* EGL_ARM_implicit_external_sync */ + +/* ------------------- EGL_ARM_pixmap_multisample_discard ------------------ */ + +#ifndef EGL_ARM_pixmap_multisample_discard +#define EGL_ARM_pixmap_multisample_discard 1 + +#define EGL_DISCARD_SAMPLES_ARM 0x3286 + +#define EGLEW_ARM_pixmap_multisample_discard EGLEW_GET_VAR(__EGLEW_ARM_pixmap_multisample_discard) + +#endif /* EGL_ARM_pixmap_multisample_discard */ + +/* --------------------------- EGL_EXT_buffer_age -------------------------- */ + +#ifndef EGL_EXT_buffer_age +#define EGL_EXT_buffer_age 1 + +#define EGL_BUFFER_AGE_EXT 0x313D + +#define EGLEW_EXT_buffer_age EGLEW_GET_VAR(__EGLEW_EXT_buffer_age) + +#endif /* EGL_EXT_buffer_age */ + +/* ----------------------- EGL_EXT_client_extensions ----------------------- */ + +#ifndef EGL_EXT_client_extensions +#define EGL_EXT_client_extensions 1 + +#define EGLEW_EXT_client_extensions EGLEW_GET_VAR(__EGLEW_EXT_client_extensions) + +#endif /* EGL_EXT_client_extensions */ + +/* ------------------- EGL_EXT_create_context_robustness ------------------- */ + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 + +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF + +#define EGLEW_EXT_create_context_robustness EGLEW_GET_VAR(__EGLEW_EXT_create_context_robustness) + +#endif /* EGL_EXT_create_context_robustness */ + +/* -------------------------- EGL_EXT_device_base -------------------------- */ + +#ifndef EGL_EXT_device_base +#define EGL_EXT_device_base 1 + +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C + +#define EGLEW_EXT_device_base EGLEW_GET_VAR(__EGLEW_EXT_device_base) + +#endif /* EGL_EXT_device_base */ + +/* --------------------------- EGL_EXT_device_drm -------------------------- */ + +#ifndef EGL_EXT_device_drm +#define EGL_EXT_device_drm 1 + +#define EGL_DRM_DEVICE_FILE_EXT 0x3233 + +#define EGLEW_EXT_device_drm EGLEW_GET_VAR(__EGLEW_EXT_device_drm) + +#endif /* EGL_EXT_device_drm */ + +/* ----------------------- EGL_EXT_device_enumeration ---------------------- */ + +#ifndef EGL_EXT_device_enumeration +#define EGL_EXT_device_enumeration 1 + +typedef EGLBoolean ( * PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT * devices, EGLint * num_devices); + +#define eglQueryDevicesEXT EGLEW_GET_FUN(__eglewQueryDevicesEXT) + +#define EGLEW_EXT_device_enumeration EGLEW_GET_VAR(__EGLEW_EXT_device_enumeration) + +#endif /* EGL_EXT_device_enumeration */ + +/* ------------------------- EGL_EXT_device_openwf ------------------------- */ + +#ifndef EGL_EXT_device_openwf +#define EGL_EXT_device_openwf 1 + +#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 + +#define EGLEW_EXT_device_openwf EGLEW_GET_VAR(__EGLEW_EXT_device_openwf) + +#endif /* EGL_EXT_device_openwf */ + +/* -------------------------- EGL_EXT_device_query ------------------------- */ + +#ifndef EGL_EXT_device_query +#define EGL_EXT_device_query 1 + +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C + +typedef EGLBoolean ( * PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); + +#define eglQueryDeviceAttribEXT EGLEW_GET_FUN(__eglewQueryDeviceAttribEXT) +#define eglQueryDeviceStringEXT EGLEW_GET_FUN(__eglewQueryDeviceStringEXT) +#define eglQueryDisplayAttribEXT EGLEW_GET_FUN(__eglewQueryDisplayAttribEXT) + +#define EGLEW_EXT_device_query EGLEW_GET_VAR(__EGLEW_EXT_device_query) + +#endif /* EGL_EXT_device_query */ + +/* ------------------ EGL_EXT_gl_colorspace_bt2020_linear ------------------ */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_linear +#define EGL_EXT_gl_colorspace_bt2020_linear 1 + +#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F + +#define EGLEW_EXT_gl_colorspace_bt2020_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_linear) + +#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ + +/* -------------------- EGL_EXT_gl_colorspace_bt2020_pq -------------------- */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_pq +#define EGL_EXT_gl_colorspace_bt2020_pq 1 + +#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 + +#define EGLEW_EXT_gl_colorspace_bt2020_pq EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_bt2020_pq) + +#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ + +/* ------------------- EGL_EXT_gl_colorspace_scrgb_linear ------------------ */ + +#ifndef EGL_EXT_gl_colorspace_scrgb_linear +#define EGL_EXT_gl_colorspace_scrgb_linear 1 + +#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 + +#define EGLEW_EXT_gl_colorspace_scrgb_linear EGLEW_GET_VAR(__EGLEW_EXT_gl_colorspace_scrgb_linear) + +#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ + +/* ---------------------- EGL_EXT_image_dma_buf_import --------------------- */ + +#ifndef EGL_EXT_image_dma_buf_import +#define EGL_EXT_image_dma_buf_import 1 + +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 + +#define EGLEW_EXT_image_dma_buf_import EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import) + +#endif /* EGL_EXT_image_dma_buf_import */ + +/* ----------------- EGL_EXT_image_dma_buf_import_modifiers ---------------- */ + +#ifndef EGL_EXT_image_dma_buf_import_modifiers +#define EGL_EXT_image_dma_buf_import_modifiers 1 + +#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 +#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 +#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 +#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 +#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 +#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 +#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 +#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 +#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 +#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 +#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A + +typedef EGLBoolean ( * PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +typedef EGLBoolean ( * PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); + +#define eglQueryDmaBufFormatsEXT EGLEW_GET_FUN(__eglewQueryDmaBufFormatsEXT) +#define eglQueryDmaBufModifiersEXT EGLEW_GET_FUN(__eglewQueryDmaBufModifiersEXT) + +#define EGLEW_EXT_image_dma_buf_import_modifiers EGLEW_GET_VAR(__EGLEW_EXT_image_dma_buf_import_modifiers) + +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ + +/* ------------------------ EGL_EXT_multiview_window ----------------------- */ + +#ifndef EGL_EXT_multiview_window +#define EGL_EXT_multiview_window 1 + +#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 + +#define EGLEW_EXT_multiview_window EGLEW_GET_VAR(__EGLEW_EXT_multiview_window) + +#endif /* EGL_EXT_multiview_window */ + +/* -------------------------- EGL_EXT_output_base -------------------------- */ + +#ifndef EGL_EXT_output_base +#define EGL_EXT_output_base 1 + +#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D +#define EGL_BAD_OUTPUT_PORT_EXT 0x322E +#define EGL_SWAP_INTERVAL_EXT 0x322F + +typedef EGLBoolean ( * PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputLayerEXT * layers, EGLint max_layers, EGLint * num_layers); +typedef EGLBoolean ( * PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list, EGLOutputPortEXT * ports, EGLint max_ports, EGLint * num_ports); +typedef EGLBoolean ( * PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +typedef EGLBoolean ( * PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib * value); +typedef const char * ( * PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); + +#define eglGetOutputLayersEXT EGLEW_GET_FUN(__eglewGetOutputLayersEXT) +#define eglGetOutputPortsEXT EGLEW_GET_FUN(__eglewGetOutputPortsEXT) +#define eglOutputLayerAttribEXT EGLEW_GET_FUN(__eglewOutputLayerAttribEXT) +#define eglOutputPortAttribEXT EGLEW_GET_FUN(__eglewOutputPortAttribEXT) +#define eglQueryOutputLayerAttribEXT EGLEW_GET_FUN(__eglewQueryOutputLayerAttribEXT) +#define eglQueryOutputLayerStringEXT EGLEW_GET_FUN(__eglewQueryOutputLayerStringEXT) +#define eglQueryOutputPortAttribEXT EGLEW_GET_FUN(__eglewQueryOutputPortAttribEXT) +#define eglQueryOutputPortStringEXT EGLEW_GET_FUN(__eglewQueryOutputPortStringEXT) + +#define EGLEW_EXT_output_base EGLEW_GET_VAR(__EGLEW_EXT_output_base) + +#endif /* EGL_EXT_output_base */ + +/* --------------------------- EGL_EXT_output_drm -------------------------- */ + +#ifndef EGL_EXT_output_drm +#define EGL_EXT_output_drm 1 + +#define EGL_DRM_CRTC_EXT 0x3234 +#define EGL_DRM_PLANE_EXT 0x3235 +#define EGL_DRM_CONNECTOR_EXT 0x3236 + +#define EGLEW_EXT_output_drm EGLEW_GET_VAR(__EGLEW_EXT_output_drm) + +#endif /* EGL_EXT_output_drm */ + +/* ------------------------- EGL_EXT_output_openwf ------------------------- */ + +#ifndef EGL_EXT_output_openwf +#define EGL_EXT_output_openwf 1 + +#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 +#define EGL_OPENWF_PORT_ID_EXT 0x3239 + +#define EGLEW_EXT_output_openwf EGLEW_GET_VAR(__EGLEW_EXT_output_openwf) + +#endif /* EGL_EXT_output_openwf */ + +/* ----------------------- EGL_EXT_pixel_format_float ---------------------- */ + +#ifndef EGL_EXT_pixel_format_float +#define EGL_EXT_pixel_format_float 1 + +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B + +#define EGLEW_EXT_pixel_format_float EGLEW_GET_VAR(__EGLEW_EXT_pixel_format_float) + +#endif /* EGL_EXT_pixel_format_float */ + +/* ------------------------- EGL_EXT_platform_base ------------------------- */ + +#ifndef EGL_EXT_platform_base +#define EGL_EXT_platform_base 1 + +typedef EGLSurface ( * PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLint * attrib_list); +typedef EGLSurface ( * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void * native_window, const EGLint * attrib_list); +typedef EGLDisplay ( * PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void * native_display, const EGLint * attrib_list); + +#define eglCreatePlatformPixmapSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformPixmapSurfaceEXT) +#define eglCreatePlatformWindowSurfaceEXT EGLEW_GET_FUN(__eglewCreatePlatformWindowSurfaceEXT) +#define eglGetPlatformDisplayEXT EGLEW_GET_FUN(__eglewGetPlatformDisplayEXT) + +#define EGLEW_EXT_platform_base EGLEW_GET_VAR(__EGLEW_EXT_platform_base) + +#endif /* EGL_EXT_platform_base */ + +/* ------------------------ EGL_EXT_platform_device ------------------------ */ + +#ifndef EGL_EXT_platform_device +#define EGL_EXT_platform_device 1 + +#define EGL_PLATFORM_DEVICE_EXT 0x313F + +#define EGLEW_EXT_platform_device EGLEW_GET_VAR(__EGLEW_EXT_platform_device) + +#endif /* EGL_EXT_platform_device */ + +/* ------------------------ EGL_EXT_platform_wayland ----------------------- */ + +#ifndef EGL_EXT_platform_wayland +#define EGL_EXT_platform_wayland 1 + +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 + +#define EGLEW_EXT_platform_wayland EGLEW_GET_VAR(__EGLEW_EXT_platform_wayland) + +#endif /* EGL_EXT_platform_wayland */ + +/* -------------------------- EGL_EXT_platform_x11 ------------------------- */ + +#ifndef EGL_EXT_platform_x11 +#define EGL_EXT_platform_x11 1 + +#define EGL_PLATFORM_X11_EXT 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 + +#define EGLEW_EXT_platform_x11 EGLEW_GET_VAR(__EGLEW_EXT_platform_x11) + +#endif /* EGL_EXT_platform_x11 */ + +/* ----------------------- EGL_EXT_protected_content ----------------------- */ + +#ifndef EGL_EXT_protected_content +#define EGL_EXT_protected_content 1 + +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 + +#define EGLEW_EXT_protected_content EGLEW_GET_VAR(__EGLEW_EXT_protected_content) + +#endif /* EGL_EXT_protected_content */ + +/* ----------------------- EGL_EXT_protected_surface ----------------------- */ + +#ifndef EGL_EXT_protected_surface +#define EGL_EXT_protected_surface 1 + +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 + +#define EGLEW_EXT_protected_surface EGLEW_GET_VAR(__EGLEW_EXT_protected_surface) + +#endif /* EGL_EXT_protected_surface */ + +/* ------------------- EGL_EXT_stream_consumer_egloutput ------------------- */ + +#ifndef EGL_EXT_stream_consumer_egloutput +#define EGL_EXT_stream_consumer_egloutput 1 + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); + +#define eglStreamConsumerOutputEXT EGLEW_GET_FUN(__eglewStreamConsumerOutputEXT) + +#define EGLEW_EXT_stream_consumer_egloutput EGLEW_GET_VAR(__EGLEW_EXT_stream_consumer_egloutput) + +#endif /* EGL_EXT_stream_consumer_egloutput */ + +/* ------------------- EGL_EXT_surface_SMPTE2086_metadata ------------------ */ + +#ifndef EGL_EXT_surface_SMPTE2086_metadata +#define EGL_EXT_surface_SMPTE2086_metadata 1 + +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 +#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 +#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 +#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 +#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A + +#define EGLEW_EXT_surface_SMPTE2086_metadata EGLEW_GET_VAR(__EGLEW_EXT_surface_SMPTE2086_metadata) + +#endif /* EGL_EXT_surface_SMPTE2086_metadata */ + +/* -------------------- EGL_EXT_swap_buffers_with_damage ------------------- */ + +#ifndef EGL_EXT_swap_buffers_with_damage +#define EGL_EXT_swap_buffers_with_damage 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSwapBuffersWithDamageEXT EGLEW_GET_FUN(__eglewSwapBuffersWithDamageEXT) + +#define EGLEW_EXT_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_EXT_swap_buffers_with_damage) + +#endif /* EGL_EXT_swap_buffers_with_damage */ + +/* -------------------------- EGL_EXT_yuv_surface -------------------------- */ + +#ifndef EGL_EXT_yuv_surface +#define EGL_EXT_yuv_surface 1 + +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_ORDER_EXT 0x3301 +#define EGL_YUV_ORDER_YUV_EXT 0x3302 +#define EGL_YUV_ORDER_YVU_EXT 0x3303 +#define EGL_YUV_ORDER_YUYV_EXT 0x3304 +#define EGL_YUV_ORDER_UYVY_EXT 0x3305 +#define EGL_YUV_ORDER_YVYU_EXT 0x3306 +#define EGL_YUV_ORDER_VYUY_EXT 0x3307 +#define EGL_YUV_ORDER_AYUV_EXT 0x3308 +#define EGL_YUV_CSC_STANDARD_EXT 0x330A +#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B +#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C +#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_SUBSAMPLE_EXT 0x3312 +#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 +#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 +#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 +#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 +#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 +#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 +#define EGL_YUV_PLANE_BPP_EXT 0x331A +#define EGL_YUV_PLANE_BPP_0_EXT 0x331B +#define EGL_YUV_PLANE_BPP_8_EXT 0x331C +#define EGL_YUV_PLANE_BPP_10_EXT 0x331D + +#define EGLEW_EXT_yuv_surface EGLEW_GET_VAR(__EGLEW_EXT_yuv_surface) + +#endif /* EGL_EXT_yuv_surface */ + +/* -------------------------- EGL_HI_clientpixmap -------------------------- */ + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 + +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 + +typedef EGLSurface ( * PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI * pixmap); + +#define eglCreatePixmapSurfaceHI EGLEW_GET_FUN(__eglewCreatePixmapSurfaceHI) + +#define EGLEW_HI_clientpixmap EGLEW_GET_VAR(__EGLEW_HI_clientpixmap) + +#endif /* EGL_HI_clientpixmap */ + +/* -------------------------- EGL_HI_colorformats -------------------------- */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 + +#define EGL_COLOR_FORMAT_HI 0x8F70 +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 + +#define EGLEW_HI_colorformats EGLEW_GET_VAR(__EGLEW_HI_colorformats) + +#endif /* EGL_HI_colorformats */ + +/* ------------------------ EGL_IMG_context_priority ----------------------- */ + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 + +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 + +#define EGLEW_IMG_context_priority EGLEW_GET_VAR(__EGLEW_IMG_context_priority) + +#endif /* EGL_IMG_context_priority */ + +/* ---------------------- EGL_IMG_image_plane_attribs ---------------------- */ + +#ifndef EGL_IMG_image_plane_attribs +#define EGL_IMG_image_plane_attribs 1 + +#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 +#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 + +#define EGLEW_IMG_image_plane_attribs EGLEW_GET_VAR(__EGLEW_IMG_image_plane_attribs) + +#endif /* EGL_IMG_image_plane_attribs */ + +/* ---------------------------- EGL_KHR_cl_event --------------------------- */ + +#ifndef EGL_KHR_cl_event +#define EGL_KHR_cl_event 1 + +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF + +#define EGLEW_KHR_cl_event EGLEW_GET_VAR(__EGLEW_KHR_cl_event) + +#endif /* EGL_KHR_cl_event */ + +/* --------------------------- EGL_KHR_cl_event2 --------------------------- */ + +#ifndef EGL_KHR_cl_event2 +#define EGL_KHR_cl_event2 1 + +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF + +typedef EGLSyncKHR ( * PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR * attrib_list); + +#define eglCreateSync64KHR EGLEW_GET_FUN(__eglewCreateSync64KHR) + +#define EGLEW_KHR_cl_event2 EGLEW_GET_VAR(__EGLEW_KHR_cl_event2) + +#endif /* EGL_KHR_cl_event2 */ + +/* ----------------- EGL_KHR_client_get_all_proc_addresses ----------------- */ + +#ifndef EGL_KHR_client_get_all_proc_addresses +#define EGL_KHR_client_get_all_proc_addresses 1 + +#define EGLEW_KHR_client_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_client_get_all_proc_addresses) + +#endif /* EGL_KHR_client_get_all_proc_addresses */ + +/* ------------------------- EGL_KHR_config_attribs ------------------------ */ + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 + +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 +#define EGL_CONFORMANT_KHR 0x3042 + +#define EGLEW_KHR_config_attribs EGLEW_GET_VAR(__EGLEW_KHR_config_attribs) + +#endif /* EGL_KHR_config_attribs */ + +/* --------------------- EGL_KHR_context_flush_control --------------------- */ + +#ifndef EGL_KHR_context_flush_control +#define EGL_KHR_context_flush_control 1 + +#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 + +#define EGLEW_KHR_context_flush_control EGLEW_GET_VAR(__EGLEW_KHR_context_flush_control) + +#endif /* EGL_KHR_context_flush_control */ + +/* ------------------------- EGL_KHR_create_context ------------------------ */ + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 + +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF + +#define EGLEW_KHR_create_context EGLEW_GET_VAR(__EGLEW_KHR_create_context) + +#endif /* EGL_KHR_create_context */ + +/* -------------------- EGL_KHR_create_context_no_error -------------------- */ + +#ifndef EGL_KHR_create_context_no_error +#define EGL_KHR_create_context_no_error 1 + +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 + +#define EGLEW_KHR_create_context_no_error EGLEW_GET_VAR(__EGLEW_KHR_create_context_no_error) + +#endif /* EGL_KHR_create_context_no_error */ + +/* ----------------------------- EGL_KHR_debug ----------------------------- */ + +#ifndef EGL_KHR_debug +#define EGL_KHR_debug 1 + +#define EGL_OBJECT_THREAD_KHR 0x33B0 +#define EGL_OBJECT_DISPLAY_KHR 0x33B1 +#define EGL_OBJECT_CONTEXT_KHR 0x33B2 +#define EGL_OBJECT_SURFACE_KHR 0x33B3 +#define EGL_OBJECT_IMAGE_KHR 0x33B4 +#define EGL_OBJECT_SYNC_KHR 0x33B5 +#define EGL_OBJECT_STREAM_KHR 0x33B6 +#define EGL_DEBUG_CALLBACK_KHR 0x33B8 +#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 +#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA +#define EGL_DEBUG_MSG_WARN_KHR 0x33BB +#define EGL_DEBUG_MSG_INFO_KHR 0x33BC + +typedef EGLint ( * PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib * attrib_list); +typedef EGLint ( * PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +typedef EGLBoolean ( * PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib * value); + +#define eglDebugMessageControlKHR EGLEW_GET_FUN(__eglewDebugMessageControlKHR) +#define eglLabelObjectKHR EGLEW_GET_FUN(__eglewLabelObjectKHR) +#define eglQueryDebugKHR EGLEW_GET_FUN(__eglewQueryDebugKHR) + +#define EGLEW_KHR_debug EGLEW_GET_VAR(__EGLEW_KHR_debug) + +#endif /* EGL_KHR_debug */ + +/* --------------------------- EGL_KHR_fence_sync -------------------------- */ + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 + +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 + +#define EGLEW_KHR_fence_sync EGLEW_GET_VAR(__EGLEW_KHR_fence_sync) + +#endif /* EGL_KHR_fence_sync */ + +/* --------------------- EGL_KHR_get_all_proc_addresses -------------------- */ + +#ifndef EGL_KHR_get_all_proc_addresses +#define EGL_KHR_get_all_proc_addresses 1 + +#define EGLEW_KHR_get_all_proc_addresses EGLEW_GET_VAR(__EGLEW_KHR_get_all_proc_addresses) + +#endif /* EGL_KHR_get_all_proc_addresses */ + +/* ------------------------- EGL_KHR_gl_colorspace ------------------------- */ + +#ifndef EGL_KHR_gl_colorspace +#define EGL_KHR_gl_colorspace 1 + +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#define EGL_GL_COLORSPACE_KHR 0x309D + +#define EGLEW_KHR_gl_colorspace EGLEW_GET_VAR(__EGLEW_KHR_gl_colorspace) + +#endif /* EGL_KHR_gl_colorspace */ + +/* --------------------- EGL_KHR_gl_renderbuffer_image --------------------- */ + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 + +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 + +#define EGLEW_KHR_gl_renderbuffer_image EGLEW_GET_VAR(__EGLEW_KHR_gl_renderbuffer_image) + +#endif /* EGL_KHR_gl_renderbuffer_image */ + +/* ---------------------- EGL_KHR_gl_texture_2D_image ---------------------- */ + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 + +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC + +#define EGLEW_KHR_gl_texture_2D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_2D_image) + +#endif /* EGL_KHR_gl_texture_2D_image */ + +/* ---------------------- EGL_KHR_gl_texture_3D_image ---------------------- */ + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 + +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD + +#define EGLEW_KHR_gl_texture_3D_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_3D_image) + +#endif /* EGL_KHR_gl_texture_3D_image */ + +/* -------------------- EGL_KHR_gl_texture_cubemap_image ------------------- */ + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 + +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 + +#define EGLEW_KHR_gl_texture_cubemap_image EGLEW_GET_VAR(__EGLEW_KHR_gl_texture_cubemap_image) + +#endif /* EGL_KHR_gl_texture_cubemap_image */ + +/* ----------------------------- EGL_KHR_image ----------------------------- */ + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 + +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 + +typedef EGLImageKHR ( * PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); + +#define eglCreateImageKHR EGLEW_GET_FUN(__eglewCreateImageKHR) +#define eglDestroyImageKHR EGLEW_GET_FUN(__eglewDestroyImageKHR) + +#define EGLEW_KHR_image EGLEW_GET_VAR(__EGLEW_KHR_image) + +#endif /* EGL_KHR_image */ + +/* --------------------------- EGL_KHR_image_base -------------------------- */ + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 + +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 + +#define EGLEW_KHR_image_base EGLEW_GET_VAR(__EGLEW_KHR_image_base) + +#endif /* EGL_KHR_image_base */ + +/* -------------------------- EGL_KHR_image_pixmap ------------------------- */ + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 + +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 + +#define EGLEW_KHR_image_pixmap EGLEW_GET_VAR(__EGLEW_KHR_image_pixmap) + +#endif /* EGL_KHR_image_pixmap */ + +/* -------------------------- EGL_KHR_lock_surface ------------------------- */ + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 + +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF + +typedef EGLBoolean ( * PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); + +#define eglLockSurfaceKHR EGLEW_GET_FUN(__eglewLockSurfaceKHR) +#define eglUnlockSurfaceKHR EGLEW_GET_FUN(__eglewUnlockSurfaceKHR) + +#define EGLEW_KHR_lock_surface EGLEW_GET_VAR(__EGLEW_KHR_lock_surface) + +#endif /* EGL_KHR_lock_surface */ + +/* ------------------------- EGL_KHR_lock_surface2 ------------------------- */ + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 + +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 + +#define EGLEW_KHR_lock_surface2 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface2) + +#endif /* EGL_KHR_lock_surface2 */ + +/* ------------------------- EGL_KHR_lock_surface3 ------------------------- */ + +#ifndef EGL_KHR_lock_surface3 +#define EGL_KHR_lock_surface3 1 + +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 + +typedef EGLBoolean ( * PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR * value); + +#define eglQuerySurface64KHR EGLEW_GET_FUN(__eglewQuerySurface64KHR) + +#define EGLEW_KHR_lock_surface3 EGLEW_GET_VAR(__EGLEW_KHR_lock_surface3) + +#endif /* EGL_KHR_lock_surface3 */ + +/* --------------------- EGL_KHR_mutable_render_buffer --------------------- */ + +#ifndef EGL_KHR_mutable_render_buffer +#define EGL_KHR_mutable_render_buffer 1 + +#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 + +#define EGLEW_KHR_mutable_render_buffer EGLEW_GET_VAR(__EGLEW_KHR_mutable_render_buffer) + +#endif /* EGL_KHR_mutable_render_buffer */ + +/* ----------------------- EGL_KHR_no_config_context ----------------------- */ + +#ifndef EGL_KHR_no_config_context +#define EGL_KHR_no_config_context 1 + +#define EGLEW_KHR_no_config_context EGLEW_GET_VAR(__EGLEW_KHR_no_config_context) + +#endif /* EGL_KHR_no_config_context */ + +/* ------------------------- EGL_KHR_partial_update ------------------------ */ + +#ifndef EGL_KHR_partial_update +#define EGL_KHR_partial_update 1 + +#define EGL_BUFFER_AGE_KHR 0x313D + +typedef EGLBoolean ( * PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSetDamageRegionKHR EGLEW_GET_FUN(__eglewSetDamageRegionKHR) + +#define EGLEW_KHR_partial_update EGLEW_GET_VAR(__EGLEW_KHR_partial_update) + +#endif /* EGL_KHR_partial_update */ + +/* ------------------------ EGL_KHR_platform_android ----------------------- */ + +#ifndef EGL_KHR_platform_android +#define EGL_KHR_platform_android 1 + +#define EGL_PLATFORM_ANDROID_KHR 0x3141 + +#define EGLEW_KHR_platform_android EGLEW_GET_VAR(__EGLEW_KHR_platform_android) + +#endif /* EGL_KHR_platform_android */ + +/* -------------------------- EGL_KHR_platform_gbm ------------------------- */ + +#ifndef EGL_KHR_platform_gbm +#define EGL_KHR_platform_gbm 1 + +#define EGL_PLATFORM_GBM_KHR 0x31D7 + +#define EGLEW_KHR_platform_gbm EGLEW_GET_VAR(__EGLEW_KHR_platform_gbm) + +#endif /* EGL_KHR_platform_gbm */ + +/* ------------------------ EGL_KHR_platform_wayland ----------------------- */ + +#ifndef EGL_KHR_platform_wayland +#define EGL_KHR_platform_wayland 1 + +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 + +#define EGLEW_KHR_platform_wayland EGLEW_GET_VAR(__EGLEW_KHR_platform_wayland) + +#endif /* EGL_KHR_platform_wayland */ + +/* -------------------------- EGL_KHR_platform_x11 ------------------------- */ + +#ifndef EGL_KHR_platform_x11 +#define EGL_KHR_platform_x11 1 + +#define EGL_PLATFORM_X11_KHR 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 + +#define EGLEW_KHR_platform_x11 EGLEW_GET_VAR(__EGLEW_KHR_platform_x11) + +#endif /* EGL_KHR_platform_x11 */ + +/* ------------------------- EGL_KHR_reusable_sync ------------------------- */ + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLSyncKHR ( * PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); + +#define eglClientWaitSyncKHR EGLEW_GET_FUN(__eglewClientWaitSyncKHR) +#define eglCreateSyncKHR EGLEW_GET_FUN(__eglewCreateSyncKHR) +#define eglDestroySyncKHR EGLEW_GET_FUN(__eglewDestroySyncKHR) +#define eglGetSyncAttribKHR EGLEW_GET_FUN(__eglewGetSyncAttribKHR) +#define eglSignalSyncKHR EGLEW_GET_FUN(__eglewSignalSyncKHR) + +#define EGLEW_KHR_reusable_sync EGLEW_GET_VAR(__EGLEW_KHR_reusable_sync) + +#endif /* EGL_KHR_reusable_sync */ + +/* ----------------------------- EGL_KHR_stream ---------------------------- */ + +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 + +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR * value); +typedef EGLBoolean ( * PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); + +#define eglCreateStreamKHR EGLEW_GET_FUN(__eglewCreateStreamKHR) +#define eglDestroyStreamKHR EGLEW_GET_FUN(__eglewDestroyStreamKHR) +#define eglQueryStreamKHR EGLEW_GET_FUN(__eglewQueryStreamKHR) +#define eglQueryStreamu64KHR EGLEW_GET_FUN(__eglewQueryStreamu64KHR) +#define eglStreamAttribKHR EGLEW_GET_FUN(__eglewStreamAttribKHR) + +#define EGLEW_KHR_stream EGLEW_GET_VAR(__EGLEW_KHR_stream) + +#endif /* EGL_KHR_stream */ + +/* ------------------------- EGL_KHR_stream_attrib ------------------------- */ + +#ifndef EGL_KHR_stream_attrib +#define EGL_KHR_stream_attrib 1 + +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib * attrib_list); + +#define eglCreateStreamAttribKHR EGLEW_GET_FUN(__eglewCreateStreamAttribKHR) +#define eglQueryStreamAttribKHR EGLEW_GET_FUN(__eglewQueryStreamAttribKHR) +#define eglSetStreamAttribKHR EGLEW_GET_FUN(__eglewSetStreamAttribKHR) +#define eglStreamConsumerAcquireAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireAttribKHR) +#define eglStreamConsumerReleaseAttribKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseAttribKHR) + +#define EGLEW_KHR_stream_attrib EGLEW_GET_VAR(__EGLEW_KHR_stream_attrib) + +#endif /* EGL_KHR_stream_attrib */ + +/* ------------------- EGL_KHR_stream_consumer_gltexture ------------------- */ + +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 + +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglStreamConsumerAcquireKHR EGLEW_GET_FUN(__eglewStreamConsumerAcquireKHR) +#define eglStreamConsumerGLTextureExternalKHR EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalKHR) +#define eglStreamConsumerReleaseKHR EGLEW_GET_FUN(__eglewStreamConsumerReleaseKHR) + +#define EGLEW_KHR_stream_consumer_gltexture EGLEW_GET_VAR(__EGLEW_KHR_stream_consumer_gltexture) + +#endif /* EGL_KHR_stream_consumer_gltexture */ + +/* -------------------- EGL_KHR_stream_cross_process_fd -------------------- */ + +#ifndef EGL_KHR_stream_cross_process_fd +#define EGL_KHR_stream_cross_process_fd 1 + +typedef EGLStreamKHR ( * PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +typedef EGLNativeFileDescriptorKHR ( * PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglCreateStreamFromFileDescriptorKHR EGLEW_GET_FUN(__eglewCreateStreamFromFileDescriptorKHR) +#define eglGetStreamFileDescriptorKHR EGLEW_GET_FUN(__eglewGetStreamFileDescriptorKHR) + +#define EGLEW_KHR_stream_cross_process_fd EGLEW_GET_VAR(__EGLEW_KHR_stream_cross_process_fd) + +#endif /* EGL_KHR_stream_cross_process_fd */ + +/* -------------------------- EGL_KHR_stream_fifo -------------------------- */ + +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 + +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF + +typedef EGLBoolean ( * PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR * value); + +#define eglQueryStreamTimeKHR EGLEW_GET_FUN(__eglewQueryStreamTimeKHR) + +#define EGLEW_KHR_stream_fifo EGLEW_GET_VAR(__EGLEW_KHR_stream_fifo) + +#endif /* EGL_KHR_stream_fifo */ + +/* ----------------- EGL_KHR_stream_producer_aldatalocator ----------------- */ + +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 + +#define EGLEW_KHR_stream_producer_aldatalocator EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_aldatalocator) + +#endif /* EGL_KHR_stream_producer_aldatalocator */ + +/* ------------------- EGL_KHR_stream_producer_eglsurface ------------------ */ + +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 + +#define EGL_STREAM_BIT_KHR 0x0800 + +typedef EGLSurface ( * PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint * attrib_list); + +#define eglCreateStreamProducerSurfaceKHR EGLEW_GET_FUN(__eglewCreateStreamProducerSurfaceKHR) + +#define EGLEW_KHR_stream_producer_eglsurface EGLEW_GET_VAR(__EGLEW_KHR_stream_producer_eglsurface) + +#endif /* EGL_KHR_stream_producer_eglsurface */ + +/* ---------------------- EGL_KHR_surfaceless_context ---------------------- */ + +#ifndef EGL_KHR_surfaceless_context +#define EGL_KHR_surfaceless_context 1 + +#define EGLEW_KHR_surfaceless_context EGLEW_GET_VAR(__EGLEW_KHR_surfaceless_context) + +#endif /* EGL_KHR_surfaceless_context */ + +/* -------------------- EGL_KHR_swap_buffers_with_damage ------------------- */ + +#ifndef EGL_KHR_swap_buffers_with_damage +#define EGL_KHR_swap_buffers_with_damage 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint * rects, EGLint n_rects); + +#define eglSwapBuffersWithDamageKHR EGLEW_GET_FUN(__eglewSwapBuffersWithDamageKHR) + +#define EGLEW_KHR_swap_buffers_with_damage EGLEW_GET_VAR(__EGLEW_KHR_swap_buffers_with_damage) + +#endif /* EGL_KHR_swap_buffers_with_damage */ + +/* ------------------------ EGL_KHR_vg_parent_image ------------------------ */ + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 + +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA + +#define EGLEW_KHR_vg_parent_image EGLEW_GET_VAR(__EGLEW_KHR_vg_parent_image) + +#endif /* EGL_KHR_vg_parent_image */ + +/* --------------------------- EGL_KHR_wait_sync --------------------------- */ + +#ifndef EGL_KHR_wait_sync +#define EGL_KHR_wait_sync 1 + +typedef EGLint ( * PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); + +#define eglWaitSyncKHR EGLEW_GET_FUN(__eglewWaitSyncKHR) + +#define EGLEW_KHR_wait_sync EGLEW_GET_VAR(__EGLEW_KHR_wait_sync) + +#endif /* EGL_KHR_wait_sync */ + +/* --------------------------- EGL_MESA_drm_image -------------------------- */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 + +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 +#define EGL_DRM_BUFFER_MESA 0x31D3 +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 + +typedef EGLImageKHR ( * PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint * name, EGLint * handle, EGLint * stride); + +#define eglCreateDRMImageMESA EGLEW_GET_FUN(__eglewCreateDRMImageMESA) +#define eglExportDRMImageMESA EGLEW_GET_FUN(__eglewExportDRMImageMESA) + +#define EGLEW_MESA_drm_image EGLEW_GET_VAR(__EGLEW_MESA_drm_image) + +#endif /* EGL_MESA_drm_image */ + +/* --------------------- EGL_MESA_image_dma_buf_export --------------------- */ + +#ifndef EGL_MESA_image_dma_buf_export +#define EGL_MESA_image_dma_buf_export 1 + +typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fds, EGLint * strides, EGLint * offsets); +typedef EGLBoolean ( * PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int * fourcc, int * num_planes, EGLuint64KHR * modifiers); + +#define eglExportDMABUFImageMESA EGLEW_GET_FUN(__eglewExportDMABUFImageMESA) +#define eglExportDMABUFImageQueryMESA EGLEW_GET_FUN(__eglewExportDMABUFImageQueryMESA) + +#define EGLEW_MESA_image_dma_buf_export EGLEW_GET_VAR(__EGLEW_MESA_image_dma_buf_export) + +#endif /* EGL_MESA_image_dma_buf_export */ + +/* ------------------------- EGL_MESA_platform_gbm ------------------------- */ + +#ifndef EGL_MESA_platform_gbm +#define EGL_MESA_platform_gbm 1 + +#define EGL_PLATFORM_GBM_MESA 0x31D7 + +#define EGLEW_MESA_platform_gbm EGLEW_GET_VAR(__EGLEW_MESA_platform_gbm) + +#endif /* EGL_MESA_platform_gbm */ + +/* --------------------- EGL_MESA_platform_surfaceless --------------------- */ + +#ifndef EGL_MESA_platform_surfaceless +#define EGL_MESA_platform_surfaceless 1 + +#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD + +#define EGLEW_MESA_platform_surfaceless EGLEW_GET_VAR(__EGLEW_MESA_platform_surfaceless) + +#endif /* EGL_MESA_platform_surfaceless */ + +/* -------------------------- EGL_NOK_swap_region -------------------------- */ + +#ifndef EGL_NOK_swap_region +#define EGL_NOK_swap_region 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); + +#define eglSwapBuffersRegionNOK EGLEW_GET_FUN(__eglewSwapBuffersRegionNOK) + +#define EGLEW_NOK_swap_region EGLEW_GET_VAR(__EGLEW_NOK_swap_region) + +#endif /* EGL_NOK_swap_region */ + +/* -------------------------- EGL_NOK_swap_region2 ------------------------- */ + +#ifndef EGL_NOK_swap_region2 +#define EGL_NOK_swap_region2 1 + +typedef EGLBoolean ( * PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint * rects); + +#define eglSwapBuffersRegion2NOK EGLEW_GET_FUN(__eglewSwapBuffersRegion2NOK) + +#define EGLEW_NOK_swap_region2 EGLEW_GET_VAR(__EGLEW_NOK_swap_region2) + +#endif /* EGL_NOK_swap_region2 */ + +/* ---------------------- EGL_NOK_texture_from_pixmap ---------------------- */ + +#ifndef EGL_NOK_texture_from_pixmap +#define EGL_NOK_texture_from_pixmap 1 + +#define EGL_Y_INVERTED_NOK 0x307F + +#define EGLEW_NOK_texture_from_pixmap EGLEW_GET_VAR(__EGLEW_NOK_texture_from_pixmap) + +#endif /* EGL_NOK_texture_from_pixmap */ + +/* ------------------------ EGL_NV_3dvision_surface ------------------------ */ + +#ifndef EGL_NV_3dvision_surface +#define EGL_NV_3dvision_surface 1 + +#define EGL_AUTO_STEREO_NV 0x3136 + +#define EGLEW_NV_3dvision_surface EGLEW_GET_VAR(__EGLEW_NV_3dvision_surface) + +#endif /* EGL_NV_3dvision_surface */ + +/* ------------------------- EGL_NV_coverage_sample ------------------------ */ + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 + +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 + +#define EGLEW_NV_coverage_sample EGLEW_GET_VAR(__EGLEW_NV_coverage_sample) + +#endif /* EGL_NV_coverage_sample */ + +/* --------------------- EGL_NV_coverage_sample_resolve -------------------- */ + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 + +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 + +#define EGLEW_NV_coverage_sample_resolve EGLEW_GET_VAR(__EGLEW_NV_coverage_sample_resolve) + +#endif /* EGL_NV_coverage_sample_resolve */ + +/* --------------------------- EGL_NV_cuda_event --------------------------- */ + +#ifndef EGL_NV_cuda_event +#define EGL_NV_cuda_event 1 + +#define EGL_CUDA_EVENT_HANDLE_NV 0x323B +#define EGL_SYNC_CUDA_EVENT_NV 0x323C +#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D + +#define EGLEW_NV_cuda_event EGLEW_GET_VAR(__EGLEW_NV_cuda_event) + +#endif /* EGL_NV_cuda_event */ + +/* ------------------------- EGL_NV_depth_nonlinear ------------------------ */ + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 + +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 + +#define EGLEW_NV_depth_nonlinear EGLEW_GET_VAR(__EGLEW_NV_depth_nonlinear) + +#endif /* EGL_NV_depth_nonlinear */ + +/* --------------------------- EGL_NV_device_cuda -------------------------- */ + +#ifndef EGL_NV_device_cuda +#define EGL_NV_device_cuda 1 + +#define EGL_CUDA_DEVICE_NV 0x323A + +#define EGLEW_NV_device_cuda EGLEW_GET_VAR(__EGLEW_NV_device_cuda) + +#endif /* EGL_NV_device_cuda */ + +/* -------------------------- EGL_NV_native_query -------------------------- */ + +#ifndef EGL_NV_native_query +#define EGL_NV_native_query 1 + +typedef EGLBoolean ( * PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType * display_id); +typedef EGLBoolean ( * PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType * pixmap); +typedef EGLBoolean ( * PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType * window); + +#define eglQueryNativeDisplayNV EGLEW_GET_FUN(__eglewQueryNativeDisplayNV) +#define eglQueryNativePixmapNV EGLEW_GET_FUN(__eglewQueryNativePixmapNV) +#define eglQueryNativeWindowNV EGLEW_GET_FUN(__eglewQueryNativeWindowNV) + +#define EGLEW_NV_native_query EGLEW_GET_VAR(__EGLEW_NV_native_query) + +#endif /* EGL_NV_native_query */ + +/* ---------------------- EGL_NV_post_convert_rounding --------------------- */ + +#ifndef EGL_NV_post_convert_rounding +#define EGL_NV_post_convert_rounding 1 + +#define EGLEW_NV_post_convert_rounding EGLEW_GET_VAR(__EGLEW_NV_post_convert_rounding) + +#endif /* EGL_NV_post_convert_rounding */ + +/* ------------------------- EGL_NV_post_sub_buffer ------------------------ */ + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 + +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE + +typedef EGLBoolean ( * PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); + +#define eglPostSubBufferNV EGLEW_GET_FUN(__eglewPostSubBufferNV) + +#define EGLEW_NV_post_sub_buffer EGLEW_GET_VAR(__EGLEW_NV_post_sub_buffer) + +#endif /* EGL_NV_post_sub_buffer */ + +/* ------------------ EGL_NV_robustness_video_memory_purge ----------------- */ + +#ifndef EGL_NV_robustness_video_memory_purge +#define EGL_NV_robustness_video_memory_purge 1 + +#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C + +#define EGLEW_NV_robustness_video_memory_purge EGLEW_GET_VAR(__EGLEW_NV_robustness_video_memory_purge) + +#endif /* EGL_NV_robustness_video_memory_purge */ + +/* ------------------ EGL_NV_stream_consumer_gltexture_yuv ----------------- */ + +#ifndef EGL_NV_stream_consumer_gltexture_yuv +#define EGL_NV_stream_consumer_gltexture_yuv 1 + +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C +#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D +#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E + +typedef EGLBoolean ( * PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib *attrib_list); + +#define eglStreamConsumerGLTextureExternalAttribsNV EGLEW_GET_FUN(__eglewStreamConsumerGLTextureExternalAttribsNV) + +#define EGLEW_NV_stream_consumer_gltexture_yuv EGLEW_GET_VAR(__EGLEW_NV_stream_consumer_gltexture_yuv) + +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ + +/* ---------------------- EGL_NV_stream_cross_display ---------------------- */ + +#ifndef EGL_NV_stream_cross_display +#define EGL_NV_stream_cross_display 1 + +#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E + +#define EGLEW_NV_stream_cross_display EGLEW_GET_VAR(__EGLEW_NV_stream_cross_display) + +#endif /* EGL_NV_stream_cross_display */ + +/* ----------------------- EGL_NV_stream_cross_object ---------------------- */ + +#ifndef EGL_NV_stream_cross_object +#define EGL_NV_stream_cross_object 1 + +#define EGL_STREAM_CROSS_OBJECT_NV 0x334D + +#define EGLEW_NV_stream_cross_object EGLEW_GET_VAR(__EGLEW_NV_stream_cross_object) + +#endif /* EGL_NV_stream_cross_object */ + +/* --------------------- EGL_NV_stream_cross_partition --------------------- */ + +#ifndef EGL_NV_stream_cross_partition +#define EGL_NV_stream_cross_partition 1 + +#define EGL_STREAM_CROSS_PARTITION_NV 0x323F + +#define EGLEW_NV_stream_cross_partition EGLEW_GET_VAR(__EGLEW_NV_stream_cross_partition) + +#endif /* EGL_NV_stream_cross_partition */ + +/* ---------------------- EGL_NV_stream_cross_process ---------------------- */ + +#ifndef EGL_NV_stream_cross_process +#define EGL_NV_stream_cross_process 1 + +#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 + +#define EGLEW_NV_stream_cross_process EGLEW_GET_VAR(__EGLEW_NV_stream_cross_process) + +#endif /* EGL_NV_stream_cross_process */ + +/* ----------------------- EGL_NV_stream_cross_system ---------------------- */ + +#ifndef EGL_NV_stream_cross_system +#define EGL_NV_stream_cross_system 1 + +#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F + +#define EGLEW_NV_stream_cross_system EGLEW_GET_VAR(__EGLEW_NV_stream_cross_system) + +#endif /* EGL_NV_stream_cross_system */ + +/* ------------------------ EGL_NV_stream_fifo_next ------------------------ */ + +#ifndef EGL_NV_stream_fifo_next +#define EGL_NV_stream_fifo_next 1 + +#define EGL_PENDING_FRAME_NV 0x3329 +#define EGL_STREAM_TIME_PENDING_NV 0x332A + +#define EGLEW_NV_stream_fifo_next EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_next) + +#endif /* EGL_NV_stream_fifo_next */ + +/* --------------------- EGL_NV_stream_fifo_synchronous -------------------- */ + +#ifndef EGL_NV_stream_fifo_synchronous +#define EGL_NV_stream_fifo_synchronous 1 + +#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 + +#define EGLEW_NV_stream_fifo_synchronous EGLEW_GET_VAR(__EGLEW_NV_stream_fifo_synchronous) + +#endif /* EGL_NV_stream_fifo_synchronous */ + +/* ----------------------- EGL_NV_stream_frame_limits ---------------------- */ + +#ifndef EGL_NV_stream_frame_limits +#define EGL_NV_stream_frame_limits 1 + +#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 +#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 + +#define EGLEW_NV_stream_frame_limits EGLEW_GET_VAR(__EGLEW_NV_stream_frame_limits) + +#endif /* EGL_NV_stream_frame_limits */ + +/* ------------------------- EGL_NV_stream_metadata ------------------------ */ + +#ifndef EGL_NV_stream_metadata +#define EGL_NV_stream_metadata 1 + +#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 +#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 +#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 +#define EGL_PRODUCER_METADATA_NV 0x3253 +#define EGL_CONSUMER_METADATA_NV 0x3254 +#define EGL_METADATA0_SIZE_NV 0x3255 +#define EGL_METADATA1_SIZE_NV 0x3256 +#define EGL_METADATA2_SIZE_NV 0x3257 +#define EGL_METADATA3_SIZE_NV 0x3258 +#define EGL_METADATA0_TYPE_NV 0x3259 +#define EGL_METADATA1_TYPE_NV 0x325A +#define EGL_METADATA2_TYPE_NV 0x325B +#define EGL_METADATA3_TYPE_NV 0x325C +#define EGL_PENDING_METADATA_NV 0x3328 + +typedef EGLBoolean ( * PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean ( * PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void * data); +typedef EGLBoolean ( * PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void * data); + +#define eglQueryDisplayAttribNV EGLEW_GET_FUN(__eglewQueryDisplayAttribNV) +#define eglQueryStreamMetadataNV EGLEW_GET_FUN(__eglewQueryStreamMetadataNV) +#define eglSetStreamMetadataNV EGLEW_GET_FUN(__eglewSetStreamMetadataNV) + +#define EGLEW_NV_stream_metadata EGLEW_GET_VAR(__EGLEW_NV_stream_metadata) + +#endif /* EGL_NV_stream_metadata */ + +/* -------------------------- EGL_NV_stream_remote ------------------------- */ + +#ifndef EGL_NV_stream_remote +#define EGL_NV_stream_remote 1 + +#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 +#define EGL_STREAM_TYPE_NV 0x3241 +#define EGL_STREAM_PROTOCOL_NV 0x3242 +#define EGL_STREAM_ENDPOINT_NV 0x3243 +#define EGL_STREAM_LOCAL_NV 0x3244 +#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 +#define EGL_STREAM_PRODUCER_NV 0x3247 +#define EGL_STREAM_CONSUMER_NV 0x3248 + +#define EGLEW_NV_stream_remote EGLEW_GET_VAR(__EGLEW_NV_stream_remote) + +#endif /* EGL_NV_stream_remote */ + +/* -------------------------- EGL_NV_stream_reset -------------------------- */ + +#ifndef EGL_NV_stream_reset +#define EGL_NV_stream_reset 1 + +#define EGL_SUPPORT_RESET_NV 0x3334 +#define EGL_SUPPORT_REUSE_NV 0x3335 + +typedef EGLBoolean ( * PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); + +#define eglResetStreamNV EGLEW_GET_FUN(__eglewResetStreamNV) + +#define EGLEW_NV_stream_reset EGLEW_GET_VAR(__EGLEW_NV_stream_reset) + +#endif /* EGL_NV_stream_reset */ + +/* -------------------------- EGL_NV_stream_socket ------------------------- */ + +#ifndef EGL_NV_stream_socket +#define EGL_NV_stream_socket 1 + +#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B +#define EGL_SOCKET_HANDLE_NV 0x324C +#define EGL_SOCKET_TYPE_NV 0x324D + +#define EGLEW_NV_stream_socket EGLEW_GET_VAR(__EGLEW_NV_stream_socket) + +#endif /* EGL_NV_stream_socket */ + +/* ----------------------- EGL_NV_stream_socket_inet ----------------------- */ + +#ifndef EGL_NV_stream_socket_inet +#define EGL_NV_stream_socket_inet 1 + +#define EGL_SOCKET_TYPE_INET_NV 0x324F + +#define EGLEW_NV_stream_socket_inet EGLEW_GET_VAR(__EGLEW_NV_stream_socket_inet) + +#endif /* EGL_NV_stream_socket_inet */ + +/* ----------------------- EGL_NV_stream_socket_unix ----------------------- */ + +#ifndef EGL_NV_stream_socket_unix +#define EGL_NV_stream_socket_unix 1 + +#define EGL_SOCKET_TYPE_UNIX_NV 0x324E + +#define EGLEW_NV_stream_socket_unix EGLEW_GET_VAR(__EGLEW_NV_stream_socket_unix) + +#endif /* EGL_NV_stream_socket_unix */ + +/* --------------------------- EGL_NV_stream_sync -------------------------- */ + +#ifndef EGL_NV_stream_sync +#define EGL_NV_stream_sync 1 + +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_NEW_FRAME_NV 0x321F + +typedef EGLSyncKHR ( * PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint * attrib_list); + +#define eglCreateStreamSyncNV EGLEW_GET_FUN(__eglewCreateStreamSyncNV) + +#define EGLEW_NV_stream_sync EGLEW_GET_VAR(__EGLEW_NV_stream_sync) + +#endif /* EGL_NV_stream_sync */ + +/* ------------------------------ EGL_NV_sync ------------------------------ */ + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 + +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFF + +typedef EGLint ( * PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLSyncNV ( * PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint * attrib_list); +typedef EGLBoolean ( * PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean ( * PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLBoolean ( * PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint * value); +typedef EGLBoolean ( * PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); + +#define eglClientWaitSyncNV EGLEW_GET_FUN(__eglewClientWaitSyncNV) +#define eglCreateFenceSyncNV EGLEW_GET_FUN(__eglewCreateFenceSyncNV) +#define eglDestroySyncNV EGLEW_GET_FUN(__eglewDestroySyncNV) +#define eglFenceNV EGLEW_GET_FUN(__eglewFenceNV) +#define eglGetSyncAttribNV EGLEW_GET_FUN(__eglewGetSyncAttribNV) +#define eglSignalSyncNV EGLEW_GET_FUN(__eglewSignalSyncNV) + +#define EGLEW_NV_sync EGLEW_GET_VAR(__EGLEW_NV_sync) + +#endif /* EGL_NV_sync */ + +/* --------------------------- EGL_NV_system_time -------------------------- */ + +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 + +typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) ( void ); +typedef EGLuint64NV ( * PFNEGLGETSYSTEMTIMENVPROC) ( void ); + +#define eglGetSystemTimeFrequencyNV EGLEW_GET_FUN(__eglewGetSystemTimeFrequencyNV) +#define eglGetSystemTimeNV EGLEW_GET_FUN(__eglewGetSystemTimeNV) + +#define EGLEW_NV_system_time EGLEW_GET_VAR(__EGLEW_NV_system_time) + +#endif /* EGL_NV_system_time */ + +/* --------------------- EGL_TIZEN_image_native_buffer --------------------- */ + +#ifndef EGL_TIZEN_image_native_buffer +#define EGL_TIZEN_image_native_buffer 1 + +#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 + +#define EGLEW_TIZEN_image_native_buffer EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_buffer) + +#endif /* EGL_TIZEN_image_native_buffer */ + +/* --------------------- EGL_TIZEN_image_native_surface -------------------- */ + +#ifndef EGL_TIZEN_image_native_surface +#define EGL_TIZEN_image_native_surface 1 + +#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 + +#define EGLEW_TIZEN_image_native_surface EGLEW_GET_VAR(__EGLEW_TIZEN_image_native_surface) + +#endif /* EGL_TIZEN_image_native_surface */ + +/* ------------------------------------------------------------------------- */ + +#define EGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define EGLEW_VAR_EXPORT GLEW_VAR_EXPORT + +EGLEW_FUN_EXPORT PFNEGLCHOOSECONFIGPROC __eglewChooseConfig; +EGLEW_FUN_EXPORT PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers; +EGLEW_FUN_EXPORT PFNEGLCREATECONTEXTPROC __eglewCreateContext; +EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERSURFACEPROC __eglewCreatePbufferSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEPROC __eglewCreatePixmapSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEWINDOWSURFACEPROC __eglewCreateWindowSurface; +EGLEW_FUN_EXPORT PFNEGLDESTROYCONTEXTPROC __eglewDestroyContext; +EGLEW_FUN_EXPORT PFNEGLDESTROYSURFACEPROC __eglewDestroySurface; +EGLEW_FUN_EXPORT PFNEGLGETCONFIGATTRIBPROC __eglewGetConfigAttrib; +EGLEW_FUN_EXPORT PFNEGLGETCONFIGSPROC __eglewGetConfigs; +EGLEW_FUN_EXPORT PFNEGLGETCURRENTDISPLAYPROC __eglewGetCurrentDisplay; +EGLEW_FUN_EXPORT PFNEGLGETCURRENTSURFACEPROC __eglewGetCurrentSurface; +EGLEW_FUN_EXPORT PFNEGLGETDISPLAYPROC __eglewGetDisplay; +EGLEW_FUN_EXPORT PFNEGLGETERRORPROC __eglewGetError; +EGLEW_FUN_EXPORT PFNEGLINITIALIZEPROC __eglewInitialize; +EGLEW_FUN_EXPORT PFNEGLMAKECURRENTPROC __eglewMakeCurrent; +EGLEW_FUN_EXPORT PFNEGLQUERYCONTEXTPROC __eglewQueryContext; +EGLEW_FUN_EXPORT PFNEGLQUERYSTRINGPROC __eglewQueryString; +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPROC __eglewQuerySurface; +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSPROC __eglewSwapBuffers; +EGLEW_FUN_EXPORT PFNEGLTERMINATEPROC __eglewTerminate; +EGLEW_FUN_EXPORT PFNEGLWAITGLPROC __eglewWaitGL; +EGLEW_FUN_EXPORT PFNEGLWAITNATIVEPROC __eglewWaitNative; + +EGLEW_FUN_EXPORT PFNEGLBINDTEXIMAGEPROC __eglewBindTexImage; +EGLEW_FUN_EXPORT PFNEGLRELEASETEXIMAGEPROC __eglewReleaseTexImage; +EGLEW_FUN_EXPORT PFNEGLSURFACEATTRIBPROC __eglewSurfaceAttrib; +EGLEW_FUN_EXPORT PFNEGLSWAPINTERVALPROC __eglewSwapInterval; + +EGLEW_FUN_EXPORT PFNEGLBINDAPIPROC __eglewBindAPI; +EGLEW_FUN_EXPORT PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC __eglewCreatePbufferFromClientBuffer; +EGLEW_FUN_EXPORT PFNEGLQUERYAPIPROC __eglewQueryAPI; +EGLEW_FUN_EXPORT PFNEGLRELEASETHREADPROC __eglewReleaseThread; +EGLEW_FUN_EXPORT PFNEGLWAITCLIENTPROC __eglewWaitClient; + +EGLEW_FUN_EXPORT PFNEGLGETCURRENTCONTEXTPROC __eglewGetCurrentContext; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCPROC __eglewClientWaitSync; +EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEPROC __eglewCreateImage; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC __eglewCreatePlatformPixmapSurface; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEPROC __eglewCreatePlatformWindowSurface; +EGLEW_FUN_EXPORT PFNEGLCREATESYNCPROC __eglewCreateSync; +EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEPROC __eglewDestroyImage; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCPROC __eglewDestroySync; +EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYPROC __eglewGetPlatformDisplay; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBPROC __eglewGetSyncAttrib; +EGLEW_FUN_EXPORT PFNEGLWAITSYNCPROC __eglewWaitSync; + +EGLEW_FUN_EXPORT PFNEGLSETBLOBCACHEFUNCSANDROIDPROC __eglewSetBlobCacheFuncsANDROID; + +EGLEW_FUN_EXPORT PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC __eglewCreateNativeClientBufferANDROID; + +EGLEW_FUN_EXPORT PFNEGLDUPNATIVEFENCEFDANDROIDPROC __eglewDupNativeFenceFDANDROID; + +EGLEW_FUN_EXPORT PFNEGLPRESENTATIONTIMEANDROIDPROC __eglewPresentationTimeANDROID; + +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACEPOINTERANGLEPROC __eglewQuerySurfacePointerANGLE; + +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESEXTPROC __eglewQueryDevicesEXT; + +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICEATTRIBEXTPROC __eglewQueryDeviceAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDEVICESTRINGEXTPROC __eglewQueryDeviceStringEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBEXTPROC __eglewQueryDisplayAttribEXT; + +EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFFORMATSEXTPROC __eglewQueryDmaBufFormatsEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYDMABUFMODIFIERSEXTPROC __eglewQueryDmaBufModifiersEXT; + +EGLEW_FUN_EXPORT PFNEGLGETOUTPUTLAYERSEXTPROC __eglewGetOutputLayersEXT; +EGLEW_FUN_EXPORT PFNEGLGETOUTPUTPORTSEXTPROC __eglewGetOutputPortsEXT; +EGLEW_FUN_EXPORT PFNEGLOUTPUTLAYERATTRIBEXTPROC __eglewOutputLayerAttribEXT; +EGLEW_FUN_EXPORT PFNEGLOUTPUTPORTATTRIBEXTPROC __eglewOutputPortAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC __eglewQueryOutputLayerAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC __eglewQueryOutputLayerStringEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC __eglewQueryOutputPortAttribEXT; +EGLEW_FUN_EXPORT PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC __eglewQueryOutputPortStringEXT; + +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC __eglewCreatePlatformPixmapSurfaceEXT; +EGLEW_FUN_EXPORT PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC __eglewCreatePlatformWindowSurfaceEXT; +EGLEW_FUN_EXPORT PFNEGLGETPLATFORMDISPLAYEXTPROC __eglewGetPlatformDisplayEXT; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMEROUTPUTEXTPROC __eglewStreamConsumerOutputEXT; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC __eglewSwapBuffersWithDamageEXT; + +EGLEW_FUN_EXPORT PFNEGLCREATEPIXMAPSURFACEHIPROC __eglewCreatePixmapSurfaceHI; + +EGLEW_FUN_EXPORT PFNEGLCREATESYNC64KHRPROC __eglewCreateSync64KHR; + +EGLEW_FUN_EXPORT PFNEGLDEBUGMESSAGECONTROLKHRPROC __eglewDebugMessageControlKHR; +EGLEW_FUN_EXPORT PFNEGLLABELOBJECTKHRPROC __eglewLabelObjectKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYDEBUGKHRPROC __eglewQueryDebugKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATEIMAGEKHRPROC __eglewCreateImageKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYIMAGEKHRPROC __eglewDestroyImageKHR; + +EGLEW_FUN_EXPORT PFNEGLLOCKSURFACEKHRPROC __eglewLockSurfaceKHR; +EGLEW_FUN_EXPORT PFNEGLUNLOCKSURFACEKHRPROC __eglewUnlockSurfaceKHR; + +EGLEW_FUN_EXPORT PFNEGLQUERYSURFACE64KHRPROC __eglewQuerySurface64KHR; + +EGLEW_FUN_EXPORT PFNEGLSETDAMAGEREGIONKHRPROC __eglewSetDamageRegionKHR; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCKHRPROC __eglewClientWaitSyncKHR; +EGLEW_FUN_EXPORT PFNEGLCREATESYNCKHRPROC __eglewCreateSyncKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCKHRPROC __eglewDestroySyncKHR; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBKHRPROC __eglewGetSyncAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCKHRPROC __eglewSignalSyncKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMKHRPROC __eglewCreateStreamKHR; +EGLEW_FUN_EXPORT PFNEGLDESTROYSTREAMKHRPROC __eglewDestroyStreamKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMKHRPROC __eglewQueryStreamKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMU64KHRPROC __eglewQueryStreamu64KHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMATTRIBKHRPROC __eglewStreamAttribKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMATTRIBKHRPROC __eglewCreateStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMATTRIBKHRPROC __eglewQueryStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSETSTREAMATTRIBKHRPROC __eglewSetStreamAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC __eglewStreamConsumerAcquireAttribKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC __eglewStreamConsumerReleaseAttribKHR; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERACQUIREKHRPROC __eglewStreamConsumerAcquireKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC __eglewStreamConsumerGLTextureExternalKHR; +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERRELEASEKHRPROC __eglewStreamConsumerReleaseKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC __eglewCreateStreamFromFileDescriptorKHR; +EGLEW_FUN_EXPORT PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC __eglewGetStreamFileDescriptorKHR; + +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMTIMEKHRPROC __eglewQueryStreamTimeKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC __eglewCreateStreamProducerSurfaceKHR; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC __eglewSwapBuffersWithDamageKHR; + +EGLEW_FUN_EXPORT PFNEGLWAITSYNCKHRPROC __eglewWaitSyncKHR; + +EGLEW_FUN_EXPORT PFNEGLCREATEDRMIMAGEMESAPROC __eglewCreateDRMImageMESA; +EGLEW_FUN_EXPORT PFNEGLEXPORTDRMIMAGEMESAPROC __eglewExportDRMImageMESA; + +EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEMESAPROC __eglewExportDMABUFImageMESA; +EGLEW_FUN_EXPORT PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC __eglewExportDMABUFImageQueryMESA; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGIONNOKPROC __eglewSwapBuffersRegionNOK; + +EGLEW_FUN_EXPORT PFNEGLSWAPBUFFERSREGION2NOKPROC __eglewSwapBuffersRegion2NOK; + +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEDISPLAYNVPROC __eglewQueryNativeDisplayNV; +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEPIXMAPNVPROC __eglewQueryNativePixmapNV; +EGLEW_FUN_EXPORT PFNEGLQUERYNATIVEWINDOWNVPROC __eglewQueryNativeWindowNV; + +EGLEW_FUN_EXPORT PFNEGLPOSTSUBBUFFERNVPROC __eglewPostSubBufferNV; + +EGLEW_FUN_EXPORT PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC __eglewStreamConsumerGLTextureExternalAttribsNV; + +EGLEW_FUN_EXPORT PFNEGLQUERYDISPLAYATTRIBNVPROC __eglewQueryDisplayAttribNV; +EGLEW_FUN_EXPORT PFNEGLQUERYSTREAMMETADATANVPROC __eglewQueryStreamMetadataNV; +EGLEW_FUN_EXPORT PFNEGLSETSTREAMMETADATANVPROC __eglewSetStreamMetadataNV; + +EGLEW_FUN_EXPORT PFNEGLRESETSTREAMNVPROC __eglewResetStreamNV; + +EGLEW_FUN_EXPORT PFNEGLCREATESTREAMSYNCNVPROC __eglewCreateStreamSyncNV; + +EGLEW_FUN_EXPORT PFNEGLCLIENTWAITSYNCNVPROC __eglewClientWaitSyncNV; +EGLEW_FUN_EXPORT PFNEGLCREATEFENCESYNCNVPROC __eglewCreateFenceSyncNV; +EGLEW_FUN_EXPORT PFNEGLDESTROYSYNCNVPROC __eglewDestroySyncNV; +EGLEW_FUN_EXPORT PFNEGLFENCENVPROC __eglewFenceNV; +EGLEW_FUN_EXPORT PFNEGLGETSYNCATTRIBNVPROC __eglewGetSyncAttribNV; +EGLEW_FUN_EXPORT PFNEGLSIGNALSYNCNVPROC __eglewSignalSyncNV; + +EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC __eglewGetSystemTimeFrequencyNV; +EGLEW_FUN_EXPORT PFNEGLGETSYSTEMTIMENVPROC __eglewGetSystemTimeNV; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_0; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_1; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_3; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_4; +EGLEW_VAR_EXPORT GLboolean __EGLEW_VERSION_1_5; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_blob_cache; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_create_native_client_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_framebuffer_target; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_front_buffer_auto_refresh; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_image_native_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_native_fence_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_presentation_time; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANDROID_recordable; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_d3d_share_handle_client_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_device_d3d; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_query_surface_pointer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_surface_d3d_texture_2d_share_handle; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ANGLE_window_fixed_size; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_implicit_external_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_ARM_pixmap_multisample_discard; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_buffer_age; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_client_extensions; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_create_context_robustness; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_drm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_enumeration; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_openwf; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_device_query; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_linear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_bt2020_pq; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_gl_colorspace_scrgb_linear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_image_dma_buf_import_modifiers; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_multiview_window; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_drm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_output_openwf; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_pixel_format_float; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_device; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_wayland; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_platform_x11; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_content; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_protected_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_stream_consumer_egloutput; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_surface_SMPTE2086_metadata; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_swap_buffers_with_damage; +EGLEW_VAR_EXPORT GLboolean __EGLEW_EXT_yuv_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_clientpixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_HI_colorformats; +EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_context_priority; +EGLEW_VAR_EXPORT GLboolean __EGLEW_IMG_image_plane_attribs; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_cl_event2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_client_get_all_proc_addresses; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_config_attribs; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_context_flush_control; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_create_context_no_error; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_debug; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_fence_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_get_all_proc_addresses; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_colorspace; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_renderbuffer_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_2D_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_3D_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_gl_texture_cubemap_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_base; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_image_pixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_lock_surface3; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_mutable_render_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_no_config_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_partial_update; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_android; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_gbm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_wayland; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_platform_x11; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_reusable_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_attrib; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_consumer_gltexture; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_cross_process_fd; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_fifo; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_aldatalocator; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_stream_producer_eglsurface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_surfaceless_context; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_swap_buffers_with_damage; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_vg_parent_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_KHR_wait_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_drm_image; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_image_dma_buf_export; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_gbm; +EGLEW_VAR_EXPORT GLboolean __EGLEW_MESA_platform_surfaceless; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_swap_region2; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NOK_texture_from_pixmap; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_3dvision_surface; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_coverage_sample_resolve; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_cuda_event; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_depth_nonlinear; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_device_cuda; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_native_query; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_convert_rounding; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_post_sub_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_robustness_video_memory_purge; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_consumer_gltexture_yuv; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_display; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_object; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_partition; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_process; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_cross_system; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_next; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_fifo_synchronous; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_frame_limits; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_metadata; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_remote; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_reset; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_inet; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_socket_unix; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_stream_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_sync; +EGLEW_VAR_EXPORT GLboolean __EGLEW_NV_system_time; +EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_buffer; +EGLEW_VAR_EXPORT GLboolean __EGLEW_TIZEN_image_native_surface; +/* ------------------------------------------------------------------------ */ + +GLEWAPI GLenum GLEWAPIENTRY eglewInit (EGLDisplay display); +GLEWAPI GLboolean GLEWAPIENTRY eglewIsSupported (const char *name); + +#define EGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define EGLEW_GET_FUN(x) x + +GLEWAPI GLboolean GLEWAPIENTRY eglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __eglew_h__ */ diff --git a/Thirdparty/glew/include/GL/glew.h b/Thirdparty/glew/include/GL/glew.h new file mode 100644 index 0000000..b5b6987 --- /dev/null +++ b/Thirdparty/glew/include/GL/glew.h @@ -0,0 +1,23686 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 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. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) +#error gl.h included before glew.h +#endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif +#if defined(__REGAL_H__) +#error Regal.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __GL_H__ +#define _GL_H +#define __gltypes_h_ +#define __REGAL_H__ +#define __X_GL_H +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* and */ +#ifdef APIENTRY +# ifndef GLAPIENTRY +# define GLAPIENTRY APIENTRY +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY APIENTRY +# endif +#else +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# ifndef GLAPIENTRY +# define GLAPIENTRY __stdcall +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY __stdcall +# endif +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +/* + * GLEW_STATIC is defined for static library. + * GLEW_BUILD is defined for building the DLL library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +/* SGI MIPSPro doesn't like stdint.h in C++ mode */ +/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ + +#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) +#include +#else +#include +#endif + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY + +/* + * GLEW_STATIC is defined for static library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# if defined(__GNUC__) && __GNUC__>=4 +# define GLEWAPI extern __attribute__ ((visibility("default"))) +# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define GLEWAPI extern __global +# else +# define GLEWAPI extern +# endif +#endif + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif + +#endif /* _WIN32 */ + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef GLEWAPIENTRY +#define GLEWAPIENTRY +#endif + +#define GLEW_VAR_EXPORT GLEWAPI +#define GLEW_FUN_EXPORT GLEWAPI + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned long GLulong; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1400 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#elif defined(_MSC_VER) || defined(__BORLANDC__) +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#else +# if defined(__MINGW32__) || defined(__CYGWIN__) +#include +# endif +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +#endif +typedef GLint64EXT GLint64; +typedef GLuint64EXT GLuint64; +typedef struct __GLsync *GLsync; + +typedef char GLchar; + +#define GL_ZERO 0 +#define GL_FALSE 0 +#define GL_LOGIC_OP 0x0BF1 +#define GL_NONE 0 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_NO_ERROR 0 +#define GL_POINTS 0x0000 +#define GL_CURRENT_BIT 0x00000001 +#define GL_TRUE 1 +#define GL_ONE 1 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_POINT_BIT 0x00000002 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_BIT 0x00000004 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_R3_G3_B2 0x2A10 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_HINT_BIT 0x00008000 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +#ifndef GLEW_NO_GLU +# ifdef __APPLE__ +# include +# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define GLEW_NO_GLU +# endif +# endif +#endif + +#ifndef GLEW_NO_GLU +/* this is where we can safely include GLU */ +# if defined(__APPLE__) && defined(__MACH__) +# include +# else +# include +# endif +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ + +#ifndef GL_VERSION_1_2_1 +#define GL_VERSION_1_2_1 1 + +#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) + +#endif /* GL_VERSION_1_2_1 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#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_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_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_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * 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 (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) +#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#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_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_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 + +#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); + +#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) +#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) +#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) +#define glClampColor GLEW_GET_FUN(__glewClampColor) +#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) +#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) +#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) +#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) +#define glColorMaski GLEW_GET_FUN(__glewColorMaski) +#define glDisablei GLEW_GET_FUN(__glewDisablei) +#define glEnablei GLEW_GET_FUN(__glewEnablei) +#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) +#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) +#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) +#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) +#define glGetStringi GLEW_GET_FUN(__glewGetStringi) +#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) +#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) +#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) +#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) +#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) +#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) +#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) +#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) +#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) +#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) +#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) +#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) +#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) +#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) +#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) +#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) +#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) +#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) +#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) +#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) +#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) +#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) +#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) +#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) +#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) +#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) +#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) +#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) +#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) +#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) +#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) +#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) +#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) +#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) +#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) +#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) +#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) +#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) +#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) + +#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) + +#endif /* GL_VERSION_3_0 */ + +/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 + +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); + +#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) +#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) +#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) +#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) + +#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) + +#endif /* GL_VERSION_3_1 */ + +/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 + +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); + +#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) +#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) +#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) + +#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) + +#endif /* GL_VERSION_3_2 */ + +/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_RGB10_A2UI 0x906F + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) + +#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) + +#endif /* GL_VERSION_3_3 */ + +/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 + +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); + +#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) +#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) +#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) +#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) +#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) + +#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) + +#endif /* GL_VERSION_4_0 */ + +/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 + +#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) + +#endif /* GL_VERSION_4_1 */ + +/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 + +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 + +#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) + +#endif /* GL_VERSION_4_2 */ + +/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 + +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E + +#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) + +#endif /* GL_VERSION_4_3 */ + +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + +/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + +#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) +#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) +#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) +#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) + +#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) + +#endif /* GL_VERSION_4_5 */ + +/* ----------------------------- GL_VERSION_4_6 ---------------------------- */ + +#ifndef GL_VERSION_4_6 +#define GL_VERSION_4_6 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); + +#define glMultiDrawArraysIndirectCount GLEW_GET_FUN(__glewMultiDrawArraysIndirectCount) +#define glMultiDrawElementsIndirectCount GLEW_GET_FUN(__glewMultiDrawElementsIndirectCount) +#define glSpecializeShader GLEW_GET_FUN(__glewSpecializeShader) + +#define GLEW_VERSION_4_6 GLEW_GET_VAR(__GLEW_VERSION_4_6) + +#endif /* GL_VERSION_4_6 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) + +#endif /* GL_AMD_blend_minmax_factor */ + +/* --------------------- GL_AMD_compressed_3DC_texture --------------------- */ + +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 + +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA + +#define GLEW_AMD_compressed_3DC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_3DC_texture) + +#endif /* GL_AMD_compressed_3DC_texture */ + +/* --------------------- GL_AMD_compressed_ATC_texture --------------------- */ + +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 + +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 + +#define GLEW_AMD_compressed_ATC_texture GLEW_GET_VAR(__GLEW_AMD_compressed_ATC_texture) + +#endif /* GL_AMD_compressed_ATC_texture */ + +/* ----------------------- GL_AMD_conservative_depth ----------------------- */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 + +#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) + +#endif /* GL_AMD_conservative_depth */ + +/* -------------------------- GL_AMD_debug_output -------------------------- */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 + +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 + +typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); + +#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) +#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) +#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) +#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) + +#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) + +#endif /* GL_AMD_debug_output */ + +/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 + +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F + +#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) + +#endif /* GL_AMD_depth_clamp_separate */ + +/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) +#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) +#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) +#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) + +#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) + +#endif /* GL_AMD_draw_buffers_blend */ + +/* ------------------ GL_AMD_framebuffer_sample_positions ------------------ */ + +#ifndef GL_AMD_framebuffer_sample_positions +#define GL_AMD_framebuffer_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat* values); + +#define glFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewFramebufferSamplePositionsfvAMD) +#define glGetFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetFramebufferParameterfvAMD) +#define glGetNamedFramebufferParameterfvAMD GLEW_GET_FUN(__glewGetNamedFramebufferParameterfvAMD) +#define glNamedFramebufferSamplePositionsfvAMD GLEW_GET_FUN(__glewNamedFramebufferSamplePositionsfvAMD) + +#define GLEW_AMD_framebuffer_sample_positions GLEW_GET_VAR(__GLEW_AMD_framebuffer_sample_positions) + +#endif /* GL_AMD_framebuffer_sample_positions */ + +/* --------------------------- GL_AMD_gcn_shader --------------------------- */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 + +#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) + +#endif /* GL_AMD_gcn_shader */ + +/* ---------------------- GL_AMD_gpu_shader_half_float --------------------- */ + +#ifndef GL_AMD_gpu_shader_half_float +#define GL_AMD_gpu_shader_half_float 1 + +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD + +#define GLEW_AMD_gpu_shader_half_float GLEW_GET_VAR(__GLEW_AMD_gpu_shader_half_float) + +#endif /* GL_AMD_gpu_shader_half_float */ + +/* ------------------------ GL_AMD_gpu_shader_int16 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int16 +#define GL_AMD_gpu_shader_int16 1 + +#define GLEW_AMD_gpu_shader_int16 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int16) + +#endif /* GL_AMD_gpu_shader_int16 */ + +/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 + +#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) + +#endif /* GL_AMD_gpu_shader_int64 */ + +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + +/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) +#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) + +#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) + +#endif /* GL_AMD_multi_draw_indirect */ + +/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 + +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 + +typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); +typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); + +#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) +#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) +#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) + +#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) + +#endif /* GL_AMD_name_gen_delete */ + +/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 + +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); + +#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) + +#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) + +#endif /* GL_AMD_occlusion_query_event */ + +/* ----------------------- GL_AMD_performance_monitor ---------------------- */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 + +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); + +#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) +#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) +#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) +#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) +#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) +#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) +#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) +#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) +#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) +#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) +#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) + +#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) + +#endif /* GL_AMD_performance_monitor */ + +/* -------------------------- GL_AMD_pinned_memory ------------------------- */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 + +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 + +#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) + +#endif /* GL_AMD_pinned_memory */ + +/* ----------------------- GL_AMD_program_binary_Z400 ---------------------- */ + +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 + +#define GL_Z400_BINARY_AMD 0x8740 + +#define GLEW_AMD_program_binary_Z400 GLEW_GET_VAR(__GLEW_AMD_program_binary_Z400) + +#endif /* GL_AMD_program_binary_Z400 */ + +/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 + +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 + +#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) + +#endif /* GL_AMD_query_buffer_object */ + +/* ------------------------ GL_AMD_sample_positions ------------------------ */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F + +typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); + +#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) + +#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) + +#endif /* GL_AMD_sample_positions */ + +/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) + +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 + +#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) + +#endif /* GL_AMD_shader_atomic_counter_ops */ + +/* -------------------------- GL_AMD_shader_ballot ------------------------- */ + +#ifndef GL_AMD_shader_ballot +#define GL_AMD_shader_ballot 1 + +#define GLEW_AMD_shader_ballot GLEW_GET_VAR(__GLEW_AMD_shader_ballot) + +#endif /* GL_AMD_shader_ballot */ + +/* ---------------- GL_AMD_shader_explicit_vertex_parameter ---------------- */ + +#ifndef GL_AMD_shader_explicit_vertex_parameter +#define GL_AMD_shader_explicit_vertex_parameter 1 + +#define GLEW_AMD_shader_explicit_vertex_parameter GLEW_GET_VAR(__GLEW_AMD_shader_explicit_vertex_parameter) + +#endif /* GL_AMD_shader_explicit_vertex_parameter */ + +/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 + +#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) + +#endif /* GL_AMD_shader_stencil_export */ + +/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ + +#ifndef GL_AMD_shader_stencil_value_export +#define GL_AMD_shader_stencil_value_export 1 + +#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) + +#endif /* GL_AMD_shader_stencil_value_export */ + +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + +/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 + +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D + +typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); + +#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) + +#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) + +#endif /* GL_AMD_stencil_operation_extended */ + +/* --------------------- GL_AMD_texture_gather_bias_lod -------------------- */ + +#ifndef GL_AMD_texture_gather_bias_lod +#define GL_AMD_texture_gather_bias_lod 1 + +#define GLEW_AMD_texture_gather_bias_lod GLEW_GET_VAR(__GLEW_AMD_texture_gather_bias_lod) + +#endif /* GL_AMD_texture_gather_bias_lod */ + +/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 + +#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) + +#endif /* GL_AMD_texture_texture4 */ + +/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 + +#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) + +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 + +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + +#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) + +#endif /* GL_AMD_transform_feedback4 */ + +/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 + +#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) + +#endif /* GL_AMD_vertex_shader_layer */ + +/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 + +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 + +typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); + +#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) +#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) + +#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) + +#endif /* GL_AMD_vertex_shader_tessellator */ + +/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 + +#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) + +#endif /* GL_AMD_vertex_shader_viewport_index */ + +/* -------------------- GL_ANDROID_extension_pack_es31a -------------------- */ + +#ifndef GL_ANDROID_extension_pack_es31a +#define GL_ANDROID_extension_pack_es31a 1 + +#define GLEW_ANDROID_extension_pack_es31a GLEW_GET_VAR(__GLEW_ANDROID_extension_pack_es31a) + +#endif /* GL_ANDROID_extension_pack_es31a */ + +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + +/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 + +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 + +#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) + +#endif /* GL_APPLE_aux_depth_stencil */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_clip_distance ------------------------ */ + +#ifndef GL_APPLE_clip_distance +#define GL_APPLE_clip_distance 1 + +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 + +#define GLEW_APPLE_clip_distance GLEW_GET_VAR(__GLEW_APPLE_clip_distance) + +#endif /* GL_APPLE_clip_distance */ + +/* ------------------- GL_APPLE_color_buffer_packed_float ------------------ */ + +#ifndef GL_APPLE_color_buffer_packed_float +#define GL_APPLE_color_buffer_packed_float 1 + +#define GLEW_APPLE_color_buffer_packed_float GLEW_GET_VAR(__GLEW_APPLE_color_buffer_packed_float) + +#endif /* GL_APPLE_color_buffer_packed_float */ + +/* ---------------------- GL_APPLE_copy_texture_levels --------------------- */ + +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); + +#define glCopyTextureLevelsAPPLE GLEW_GET_FUN(__glewCopyTextureLevelsAPPLE) + +#define GLEW_APPLE_copy_texture_levels GLEW_GET_VAR(__GLEW_APPLE_copy_texture_levels) + +#endif /* GL_APPLE_copy_texture_levels */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 + +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 + +typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) +#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) + +#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) + +#endif /* GL_APPLE_flush_buffer_range */ + +/* -------------------- GL_APPLE_framebuffer_multisample ------------------- */ + +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); + +#define glRenderbufferStorageMultisampleAPPLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleAPPLE) +#define glResolveMultisampleFramebufferAPPLE GLEW_GET_FUN(__glewResolveMultisampleFramebufferAPPLE) + +#define GLEW_APPLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_APPLE_framebuffer_multisample) + +#endif /* GL_APPLE_framebuffer_multisample */ + +/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 + +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D + +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); + +#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) +#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) +#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) + +#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) + +#endif /* GL_APPLE_object_purgeable */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 + +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_422_APPLE 0x8A1F +#define GL_RGB_RAW_422_APPLE 0x8A51 + +#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) + +#endif /* GL_APPLE_rgb_422 */ + +/* --------------------------- GL_APPLE_row_bytes -------------------------- */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 + +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 + +#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) + +#endif /* GL_APPLE_row_bytes */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ----------------------------- GL_APPLE_sync ----------------------------- */ + +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCAPPLEPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVAPPLEPROC) (GLsync GLsync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCAPPLEPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCAPPLEPROC) (GLsync GLsync, GLbitfield flags, GLuint64 timeout); + +#define glClientWaitSyncAPPLE GLEW_GET_FUN(__glewClientWaitSyncAPPLE) +#define glDeleteSyncAPPLE GLEW_GET_FUN(__glewDeleteSyncAPPLE) +#define glFenceSyncAPPLE GLEW_GET_FUN(__glewFenceSyncAPPLE) +#define glGetInteger64vAPPLE GLEW_GET_FUN(__glewGetInteger64vAPPLE) +#define glGetSyncivAPPLE GLEW_GET_FUN(__glewGetSyncivAPPLE) +#define glIsSyncAPPLE GLEW_GET_FUN(__glewIsSyncAPPLE) +#define glWaitSyncAPPLE GLEW_GET_FUN(__glewWaitSyncAPPLE) + +#define GLEW_APPLE_sync GLEW_GET_VAR(__GLEW_APPLE_sync) + +#endif /* GL_APPLE_sync */ + +/* -------------------- GL_APPLE_texture_2D_limited_npot ------------------- */ + +#ifndef GL_APPLE_texture_2D_limited_npot +#define GL_APPLE_texture_2D_limited_npot 1 + +#define GLEW_APPLE_texture_2D_limited_npot GLEW_GET_VAR(__GLEW_APPLE_texture_2D_limited_npot) + +#endif /* GL_APPLE_texture_2D_limited_npot */ + +/* -------------------- GL_APPLE_texture_format_BGRA8888 ------------------- */ + +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 + +#define GLEW_APPLE_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_APPLE_texture_format_BGRA8888) + +#endif /* GL_APPLE_texture_format_BGRA8888 */ + +/* ----------------------- GL_APPLE_texture_max_level ---------------------- */ + +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 + +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + +#define GLEW_APPLE_texture_max_level GLEW_GET_VAR(__GLEW_APPLE_texture_max_level) + +#endif /* GL_APPLE_texture_max_level */ + +/* --------------------- GL_APPLE_texture_packed_float --------------------- */ + +#ifndef GL_APPLE_texture_packed_float +#define GL_APPLE_texture_packed_float 1 + +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_RGB9_E5_APPLE 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E + +#define GLEW_APPLE_texture_packed_float GLEW_GET_VAR(__GLEW_APPLE_texture_packed_float) + +#endif /* GL_APPLE_texture_packed_float */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 + +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 + +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); + +#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) +#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) +#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) +#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) +#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) +#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) +#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) + +#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) + +#endif /* GL_APPLE_vertex_program_evaluators */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 + +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_RGB565 0x8D62 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD + +typedef int GLfixed; + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); +typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); + +#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) +#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) +#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) +#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) +#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) + +#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) + +#endif /* GL_ARB_ES2_compatibility */ + +/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); + +#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) + +#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) + +#endif /* GL_ARB_ES3_1_compatibility */ + +/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 + +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + +#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) + +#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) + +#endif /* GL_ARB_ES3_2_compatibility */ + +/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 + +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 + +#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) + +#endif /* GL_ARB_ES3_compatibility */ + +/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 + +#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) + +#endif /* GL_ARB_arrays_of_arrays */ + +/* -------------------------- GL_ARB_base_instance ------------------------- */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) +#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) +#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) + +#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) + +#endif /* GL_ARB_base_instance */ + +/* ------------------------ GL_ARB_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + +/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 + +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); + +#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) +#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) + +#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) + +#endif /* GL_ARB_blend_func_extended */ + +/* ------------------------- GL_ARB_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + +/* ---------------------------- GL_ARB_cl_event ---------------------------- */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 + +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 + +typedef struct _cl_context *cl_context; +typedef struct _cl_event *cl_event; + +typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); + +#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) + +#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) + +#endif /* GL_ARB_cl_event */ + +/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 + +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + +#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) +#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) +#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) +#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) + +#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) + +#endif /* GL_ARB_clear_buffer_object */ + +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + +/* -------------------------- GL_ARB_clip_control -------------------------- */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 + +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F + +typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); + +#define glClipControl GLEW_GET_FUN(__glewClipControl) + +#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) + +#endif /* GL_ARB_clip_control */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_compatibility ------------------------- */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 + +#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) + +#endif /* GL_ARB_compatibility */ + +/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 + +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E + +#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) + +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +/* ------------------------- GL_ARB_compute_shader ------------------------- */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 + +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); + +#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) +#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) + +#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) + +#endif /* GL_ARB_compute_shader */ + +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + +/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 + +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A + +#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) + +#endif /* GL_ARB_conditional_render_inverted */ + +/* ----------------------- GL_ARB_conservative_depth ----------------------- */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 + +#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) + +#endif /* GL_ARB_conservative_depth */ + +/* --------------------------- GL_ARB_copy_buffer -------------------------- */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 + +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) + +#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) + +#endif /* GL_ARB_copy_buffer */ + +/* --------------------------- GL_ARB_copy_image --------------------------- */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) + +#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) + +#endif /* GL_ARB_copy_image */ + +/* -------------------------- GL_ARB_cull_distance ------------------------- */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 + +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA + +#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) + +#endif /* GL_ARB_cull_distance */ + +/* -------------------------- GL_ARB_debug_output -------------------------- */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 + +typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); + +#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) +#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) +#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) +#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) + +#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) + +#endif /* GL_ARB_debug_output */ + +/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD + +#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) + +#endif /* GL_ARB_depth_buffer_float */ + +/* --------------------------- GL_ARB_depth_clamp -------------------------- */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 + +#define GL_DEPTH_CLAMP 0x864F + +#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) + +#endif /* GL_ARB_depth_clamp */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* ----------------------- GL_ARB_derivative_control ----------------------- */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 + +#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) + +#endif /* GL_ARB_derivative_control */ + +/* ----------------------- GL_ARB_direct_state_access ---------------------- */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 + +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA + +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); +typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) +#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) +#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) +#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) +#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) +#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) +#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) +#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) +#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) +#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) +#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) +#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) +#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) +#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) +#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) +#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) +#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) +#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) +#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) +#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) +#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) +#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) +#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) +#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) +#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) +#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) +#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) +#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) +#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) +#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) +#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) +#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) +#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) +#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) +#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) +#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) +#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) +#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) +#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) +#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) +#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) +#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) +#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) +#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) +#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) +#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) +#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) +#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) +#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) +#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) +#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) +#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) +#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) +#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) +#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) +#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) +#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) +#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) +#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) +#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) +#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) +#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) +#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) +#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) +#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) +#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) +#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) +#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) +#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) +#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) +#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) +#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) +#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) +#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) +#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) +#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) +#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) +#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) +#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) +#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) +#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) +#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) +#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) +#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) +#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) +#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) +#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) +#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) +#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) +#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) +#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) +#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) +#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) +#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) +#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) +#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) +#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) + +#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) + +#endif /* GL_ARB_direct_state_access */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); + +#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) +#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) +#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) +#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) + +#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) + +#endif /* GL_ARB_draw_buffers_blend */ + +/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, void**indices, GLsizei primcount, GLint *basevertex); + +#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) +#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) +#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) +#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) + +#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) + +#endif /* GL_ARB_draw_elements_base_vertex */ + +/* -------------------------- GL_ARB_draw_indirect ------------------------- */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 + +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); + +#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) +#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) + +#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) + +#endif /* GL_ARB_draw_indirect */ + +/* ------------------------- GL_ARB_draw_instanced ------------------------- */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 + +#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) + +#endif /* GL_ARB_draw_instanced */ + +/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + +/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 + +#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) + +#endif /* GL_ARB_explicit_attrib_location */ + +/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 + +#define GL_MAX_UNIFORM_LOCATIONS 0x826E + +#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) + +#endif /* GL_ARB_explicit_uniform_location */ + +/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 + +#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) + +#endif /* GL_ARB_fragment_coord_conventions */ + +/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 + +#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) + +#endif /* GL_ARB_fragment_layer_viewport */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 + +#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) + +#endif /* GL_ARB_fragment_shader_interlock */ + +/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 + +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); + +#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) +#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) +#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) +#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) + +#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) + +#endif /* GL_ARB_framebuffer_no_attachments */ + +/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_INDEX 0x8222 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_SRGB 0x8C40 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#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_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_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) +#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) +#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) +#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) +#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) +#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) +#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) +#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) +#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) +#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) +#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) +#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) +#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) +#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) +#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) +#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) +#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) +#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) +#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) +#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) + +#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) + +#endif /* GL_ARB_framebuffer_object */ + +/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB 0x8DB9 + +#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) + +#endif /* GL_ARB_framebuffer_sRGB */ + +/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_ARB 0xA +#define GL_LINE_STRIP_ADJACENCY_ARB 0xB +#define GL_TRIANGLES_ADJACENCY_ARB 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) +#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) +#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) +#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) + +#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) + +#endif /* GL_ARB_geometry_shader4 */ + +/* ----------------------- GL_ARB_get_program_binary ----------------------- */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 + +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); + +#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) +#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) +#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) + +#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) + +#endif /* GL_ARB_get_program_binary */ + +/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 + +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + +#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) +#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) + +#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) + +#endif /* GL_ARB_get_texture_sub_image */ + +/* ---------------------------- GL_ARB_gl_spirv ---------------------------- */ + +#ifndef GL_ARB_gl_spirv +#define GL_ARB_gl_spirv 1 + +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SPIR_V_BINARY_ARB 0x9552 + +typedef void (GLAPIENTRY * PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); + +#define glSpecializeShaderARB GLEW_GET_FUN(__glewSpecializeShaderARB) + +#define GLEW_ARB_gl_spirv GLEW_GET_VAR(__GLEW_ARB_gl_spirv) + +#endif /* GL_ARB_gl_spirv */ + +/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 + +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) + +#endif /* GL_ARB_gpu_shader5 */ + +/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 + +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); + +#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) +#define glUniform1d GLEW_GET_FUN(__glewUniform1d) +#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) +#define glUniform2d GLEW_GET_FUN(__glewUniform2d) +#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) +#define glUniform3d GLEW_GET_FUN(__glewUniform3d) +#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) +#define glUniform4d GLEW_GET_FUN(__glewUniform4d) +#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) +#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) +#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) +#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) +#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) +#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) +#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) +#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) +#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) +#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) + +#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) + +#endif /* GL_ARB_gpu_shader_fp64 */ + +/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 + +#define GL_INT64_ARB 0x140E +#define GL_UNSIGNED_INT64_ARB 0x140F +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) +#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) +#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) +#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) +#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) +#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) +#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) +#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) +#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) +#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) +#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) +#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) +#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) +#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) +#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) +#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) +#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) +#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) +#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) +#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) +#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) +#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) +#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) +#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) +#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) +#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) +#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) +#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) +#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) +#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) +#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) +#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) +#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) +#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) +#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) +#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) + +#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) + +#endif /* GL_ARB_gpu_shader_int64 */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 + +#define GL_HALF_FLOAT 0x140B + +#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) + +#endif /* GL_ARB_half_float_vertex */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 + +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + +/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) +#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) +#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) + +#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) + +#endif /* GL_ARB_instanced_arrays */ + +/* ---------------------- GL_ARB_internalformat_query ---------------------- */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 + +#define GL_NUM_SAMPLE_COUNTS 0x9380 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) + +#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) + +#endif /* GL_ARB_internalformat_query */ + +/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 + +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); + +#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) + +#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) + +#endif /* GL_ARB_internalformat_query2 */ + +/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 + +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + +#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) +#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) +#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) +#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) +#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) +#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) + +#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) + +#endif /* GL_ARB_invalidate_subdata */ + +/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 + +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC + +#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) + +#endif /* GL_ARB_map_buffer_alignment */ + +/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) +#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) + +#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) + +#endif /* GL_ARB_map_buffer_range */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + +/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) +#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) + +#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) + +#endif /* GL_ARB_multi_draw_indirect */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 + +#define GL_ANY_SAMPLES_PASSED 0x8C2F + +#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) + +#endif /* GL_ARB_occlusion_query2 */ + +/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) + +#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) + +#endif /* GL_ARB_parallel_shader_compile */ + +/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 + +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F + +#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) + +#endif /* GL_ARB_pipeline_statistics_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ---------------------- GL_ARB_polygon_offset_clamp ---------------------- */ + +#ifndef GL_ARB_polygon_offset_clamp +#define GL_ARB_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClamp GLEW_GET_FUN(__glewPolygonOffsetClamp) + +#define GLEW_ARB_polygon_offset_clamp GLEW_GET_VAR(__GLEW_ARB_polygon_offset_clamp) + +#endif /* GL_ARB_polygon_offset_clamp */ + +/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 + +#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) + +#endif /* GL_ARB_post_depth_coverage */ + +/* --------------------- GL_ARB_program_interface_query -------------------- */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 + +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_IS_PER_PATCH 0x92E7 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); +typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); + +#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) +#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) +#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) +#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) +#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) +#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) + +#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) + +#endif /* GL_ARB_program_interface_query */ + +/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); + +#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) + +#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) + +#endif /* GL_ARB_provoking_vertex */ + +/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + +/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 + +#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) + +#endif /* GL_ARB_robust_buffer_access_behavior */ + +/* --------------------------- GL_ARB_robustness --------------------------- */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); +typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); +typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); +typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); +typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); + +#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) +#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) +#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) +#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) +#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) +#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) +#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) +#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) +#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) +#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) +#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) +#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) +#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) +#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) +#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) +#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) +#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) +#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) +#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) +#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) + +#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) + +#endif /* GL_ARB_robustness */ + +/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ + +#ifndef GL_ARB_robustness_application_isolation +#define GL_ARB_robustness_application_isolation 1 + +#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) + +#endif /* GL_ARB_robustness_application_isolation */ + +/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ + +#ifndef GL_ARB_robustness_share_group_isolation +#define GL_ARB_robustness_share_group_isolation 1 + +#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) + +#endif /* GL_ARB_robustness_share_group_isolation */ + +/* ------------------------ GL_ARB_sample_locations ------------------------ */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 + +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) +#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) + +#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) + +#endif /* GL_ARB_sample_locations */ + +/* ------------------------- GL_ARB_sample_shading ------------------------- */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 + +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 + +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); + +#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) + +#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) + +#endif /* GL_ARB_sample_shading */ + +/* ------------------------- GL_ARB_sampler_objects ------------------------ */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 + +#define GL_SAMPLER_BINDING 0x8919 + +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); +typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); + +#define glBindSampler GLEW_GET_FUN(__glewBindSampler) +#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) +#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) +#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) +#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) +#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) +#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) +#define glIsSampler GLEW_GET_FUN(__glewIsSampler) +#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) +#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) +#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) +#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) +#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) +#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) + +#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) + +#endif /* GL_ARB_sampler_objects */ + +/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) + +#endif /* GL_ARB_seamless_cube_map */ + +/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +/* --------------------- GL_ARB_separate_shader_objects -------------------- */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 + +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_ALL_SHADER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); + +#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) +#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) +#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) +#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) +#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) +#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) +#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) +#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) +#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) +#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) +#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) +#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) +#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) +#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) +#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) +#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) +#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) +#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) +#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) +#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) +#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) +#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) +#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) +#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) +#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) +#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) +#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) +#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) +#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) +#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) +#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) +#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) +#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) +#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) +#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) +#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) +#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) +#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) +#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) +#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) +#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) +#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) +#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) +#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) +#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) +#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) +#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) +#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) +#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) +#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) +#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) +#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) +#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) +#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) +#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) +#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) +#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) +#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) +#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) +#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) + +#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) + +#endif /* GL_ARB_separate_shader_objects */ + +/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 + +#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) + +#endif /* GL_ARB_shader_atomic_counter_ops */ + +/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 + +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC + +typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); + +#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) + +#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) + +#endif /* GL_ARB_shader_atomic_counters */ + +/* -------------------------- GL_ARB_shader_ballot ------------------------- */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 + +#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) + +#endif /* GL_ARB_shader_ballot */ + +/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 + +#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) + +#endif /* GL_ARB_shader_bit_encoding */ + +/* -------------------------- GL_ARB_shader_clock -------------------------- */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 + +#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) + +#endif /* GL_ARB_shader_clock */ + +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + +/* --------------------- GL_ARB_shader_image_load_store -------------------- */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); + +#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) +#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) + +#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) + +#endif /* GL_ARB_shader_image_load_store */ + +/* ------------------------ GL_ARB_shader_image_size ----------------------- */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 + +#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) + +#endif /* GL_ARB_shader_image_size */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ------------------------ GL_ARB_shader_precision ------------------------ */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 + +#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) + +#endif /* GL_ARB_shader_precision */ + +/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 + +#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) + +#endif /* GL_ARB_shader_stencil_export */ + +/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 + +#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF + +typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); + +#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) + +#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) + +#endif /* GL_ARB_shader_storage_buffer_object */ + +/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 + +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B + +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); +typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); + +#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) +#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) +#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) +#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) +#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) +#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) +#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) +#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) + +#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) + +#endif /* GL_ARB_shader_subroutine */ + +/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 + +#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) + +#endif /* GL_ARB_shader_texture_image_samples */ + +/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 + +#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) + +#endif /* GL_ARB_shader_texture_lod */ + +/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 + +#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) + +#endif /* GL_ARB_shader_viewport_layer_array */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* -------------------- GL_ARB_shading_language_420pack -------------------- */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 + +#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) + +#endif /* GL_ARB_shading_language_420pack */ + +/* -------------------- GL_ARB_shading_language_include -------------------- */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 + +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA + +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); + +#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) +#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) +#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) +#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) +#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) +#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) + +#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) + +#endif /* GL_ARB_shading_language_include */ + +/* -------------------- GL_ARB_shading_language_packing -------------------- */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 + +#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) + +#endif /* GL_ARB_shading_language_packing */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 + +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 + +typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); + +#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) + +#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) + +#endif /* GL_ARB_sparse_buffer */ + +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + +/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 + +#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) + +#endif /* GL_ARB_sparse_texture2 */ + +/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 + +#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) + +#endif /* GL_ARB_sparse_texture_clamp */ + +/* ------------------------ GL_ARB_spirv_extensions ------------------------ */ + +#ifndef GL_ARB_spirv_extensions +#define GL_ARB_spirv_extensions 1 + +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 + +#define GLEW_ARB_spirv_extensions GLEW_GET_VAR(__GLEW_ARB_spirv_extensions) + +#endif /* GL_ARB_spirv_extensions */ + +/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 + +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA + +#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) + +#endif /* GL_ARB_stencil_texturing */ + +/* ------------------------------ GL_ARB_sync ------------------------------ */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); + +#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) +#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) +#define glFenceSync GLEW_GET_FUN(__glewFenceSync) +#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) +#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) +#define glIsSync GLEW_GET_FUN(__glewIsSync) +#define glWaitSync GLEW_GET_FUN(__glewWaitSync) + +#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) + +#endif /* GL_ARB_sync */ + +/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 + +#define GL_PATCHES 0xE +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A + +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); + +#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) +#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) + +#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) + +#endif /* GL_ARB_tessellation_shader */ + +/* ------------------------- GL_ARB_texture_barrier ------------------------ */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); + +#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) + +#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) + +#endif /* GL_ARB_texture_barrier */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) + +#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) + +#endif /* GL_ARB_texture_buffer_object */ + +/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 + +#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) + +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 + +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + +#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) +#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) + +#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) + +#endif /* GL_ARB_texture_buffer_range */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (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 (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + +#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) + +#endif /* GL_ARB_texture_compression_bptc */ + +/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE + +#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) + +#endif /* GL_ARB_texture_compression_rgtc */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F + +#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) + +#endif /* GL_ARB_texture_cube_map_array */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* ------------------- GL_ARB_texture_filter_anisotropic ------------------- */ + +#ifndef GL_ARB_texture_filter_anisotropic +#define GL_ARB_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF + +#define GLEW_ARB_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_ARB_texture_filter_anisotropic) + +#endif /* GL_ARB_texture_filter_anisotropic */ + +/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 + +#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) + +#endif /* GL_ARB_texture_filter_minmax */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* ------------------------- GL_ARB_texture_gather ------------------------- */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 + +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F + +#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) + +#endif /* GL_ARB_texture_gather */ + +/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* ----------------------- GL_ARB_texture_multisample ---------------------- */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 + +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) +#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) +#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) +#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) + +#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) + +#endif /* GL_ARB_texture_multisample */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 + +#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) + +#endif /* GL_ARB_texture_query_levels */ + +/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 + +#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) + +#endif /* GL_ARB_texture_query_lod */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* --------------------------- GL_ARB_texture_rg --------------------------- */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 + +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C + +#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) + +#endif /* GL_ARB_texture_rg */ + +/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 + +#define GL_RGB10_A2UI 0x906F + +#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) + +#endif /* GL_ARB_texture_rgb10_a2ui */ + +/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + +/* ------------------------- GL_ARB_texture_storage ------------------------ */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 + +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) +#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) +#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) + +#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) + +#endif /* GL_ARB_texture_storage */ + +/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) +#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) +#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) +#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) + +#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) + +#endif /* GL_ARB_texture_storage_multisample */ + +/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 + +#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) + +#endif /* GL_ARB_texture_swizzle */ + +/* -------------------------- GL_ARB_texture_view -------------------------- */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 + +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureView GLEW_GET_FUN(__glewTextureView) + +#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) + +#endif /* GL_ARB_texture_view */ + +/* --------------------------- GL_ARB_timer_query -------------------------- */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 + +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); + +#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) +#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) +#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) + +#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) + +#endif /* GL_ARB_timer_query */ + +/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); + +#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) +#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) +#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) +#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) +#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) +#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) +#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) + +#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) + +#endif /* GL_ARB_transform_feedback2 */ + +/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 + +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); + +#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) +#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) +#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) +#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) + +#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) + +#endif /* GL_ARB_transform_feedback3 */ + +/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); + +#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) +#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) + +#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) + +#endif /* GL_ARB_transform_feedback_instanced */ + +/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 + +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED + +#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) + +#endif /* GL_ARB_transform_feedback_overflow_query */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 + +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFFu + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); +typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); +typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + +#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) +#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) +#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) +#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) +#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) +#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) +#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) +#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) +#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) +#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) + +#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) + +#endif /* GL_ARB_uniform_buffer_object */ + +/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) + +#endif /* GL_ARB_vertex_array_bgra */ + +/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); + +#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) +#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) +#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) +#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) + +#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) + +#endif /* GL_ARB_vertex_array_object */ + +/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + +#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) +#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) +#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) +#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) +#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) +#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) +#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) +#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) +#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) +#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) + +#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) + +#endif /* GL_ARB_vertex_attrib_64bit */ + +/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 + +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); + +#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) +#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) +#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) +#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) +#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) +#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) +#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) +#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) +#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) +#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) +#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) +#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) + +#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) + +#endif /* GL_ARB_vertex_attrib_binding */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_INT_2_10_10_10_REV 0x8D9F + +typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); + +#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) +#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) +#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) +#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) +#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) +#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) +#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) +#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) +#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) +#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) +#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) +#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) +#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) +#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) +#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) +#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) +#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) +#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) +#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) +#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) +#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) +#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) +#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) +#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) +#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) +#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) +#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) +#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) +#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) +#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) +#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) +#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) +#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) +#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) +#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) +#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) +#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) +#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) + +#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +/* ------------------------- GL_ARB_viewport_array ------------------------- */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) +#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) +#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) +#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) +#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) +#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) +#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) +#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) +#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) +#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) + +#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) + +#endif /* GL_ARB_viewport_array */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ----------------------- GL_ARM_mali_program_binary ---------------------- */ + +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 + +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 + +#define GLEW_ARM_mali_program_binary GLEW_GET_VAR(__GLEW_ARM_mali_program_binary) + +#endif /* GL_ARM_mali_program_binary */ + +/* ----------------------- GL_ARM_mali_shader_binary ----------------------- */ + +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 + +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 + +#define GLEW_ARM_mali_shader_binary GLEW_GET_VAR(__GLEW_ARM_mali_shader_binary) + +#endif /* GL_ARM_mali_shader_binary */ + +/* ------------------------------ GL_ARM_rgba8 ----------------------------- */ + +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 + +#define GL_RGBA8_OES 0x8058 + +#define GLEW_ARM_rgba8 GLEW_GET_VAR(__GLEW_ARM_rgba8) + +#endif /* GL_ARM_rgba8 */ + +/* -------------------- GL_ARM_shader_framebuffer_fetch -------------------- */ + +#ifndef GL_ARM_shader_framebuffer_fetch +#define GL_ARM_shader_framebuffer_fetch 1 + +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 + +#define GLEW_ARM_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch) + +#endif /* GL_ARM_shader_framebuffer_fetch */ + +/* ------------- GL_ARM_shader_framebuffer_fetch_depth_stencil ------------- */ + +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 + +#define GLEW_ARM_shader_framebuffer_fetch_depth_stencil GLEW_GET_VAR(__GLEW_ARM_shader_framebuffer_fetch_depth_stencil) + +#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_2X_BIT_ATI 0x00000001 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* ----------------------------- GL_ATI_meminfo ---------------------------- */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 + +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD + +#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) + +#endif /* GL_ATI_meminfo */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) +#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) +#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) +#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) +#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) +#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) +#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) +#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* -------------------- GL_EGL_KHR_context_flush_control ------------------- */ + +#ifndef GL_EGL_KHR_context_flush_control +#define GL_EGL_KHR_context_flush_control 1 + +#define GLEW_EGL_KHR_context_flush_control GLEW_GET_VAR(__GLEW_EGL_KHR_context_flush_control) + +#endif /* GL_EGL_KHR_context_flush_control */ + +/* ---------------- GL_EGL_NV_robustness_video_memory_purge ---------------- */ + +#ifndef GL_EGL_NV_robustness_video_memory_purge +#define GL_EGL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_EGL_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_EGL_NV_robustness_video_memory_purge) + +#endif /* GL_EGL_NV_robustness_video_memory_purge */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------- GL_EXT_EGL_image_array ------------------------ */ + +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 + +#define GLEW_EXT_EGL_image_array GLEW_GET_VAR(__GLEW_EXT_EGL_image_array) + +#endif /* GL_EXT_EGL_image_array */ + +/* --------------------------- GL_EXT_YUV_target --------------------------- */ + +#ifndef GL_EXT_YUV_target +#define GL_EXT_YUV_target 1 + +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 + +#define GLEW_EXT_YUV_target GLEW_GET_VAR(__GLEW_EXT_YUV_target) + +#endif /* GL_EXT_YUV_target */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* -------------------------- GL_EXT_base_instance ------------------------- */ + +#ifndef GL_EXT_base_instance +#define GL_EXT_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstanceEXT) +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstanceEXT) + +#define GLEW_EXT_base_instance GLEW_GET_VAR(__GLEW_EXT_base_instance) + +#endif /* GL_EXT_base_instance */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_extended ---------------------- */ + +#ifndef GL_EXT_blend_func_extended +#define GL_EXT_blend_func_extended 1 + +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +#define GL_LOCATION_INDEX_EXT 0x930F + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar* name); + +#define glBindFragDataLocationIndexedEXT GLEW_GET_FUN(__glewBindFragDataLocationIndexedEXT) +#define glGetFragDataIndexEXT GLEW_GET_FUN(__glewGetFragDataIndexEXT) +#define glGetProgramResourceLocationIndexEXT GLEW_GET_FUN(__glewGetProgramResourceLocationIndexEXT) + +#define GLEW_EXT_blend_func_extended GLEW_GET_VAR(__GLEW_EXT_blend_func_extended) + +#endif /* GL_EXT_blend_func_extended */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------- GL_EXT_buffer_storage ------------------------- */ + +#ifndef GL_EXT_buffer_storage +#define GL_EXT_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 +#define GL_MAP_COHERENT_BIT_EXT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 +#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F +#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorageEXT GLEW_GET_FUN(__glewBufferStorageEXT) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_EXT_buffer_storage GLEW_GET_VAR(__GLEW_EXT_buffer_storage) + +#endif /* GL_EXT_buffer_storage */ + +/* -------------------------- GL_EXT_clear_texture ------------------------- */ + +#ifndef GL_EXT_clear_texture +#define GL_EXT_clear_texture 1 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImageEXT GLEW_GET_FUN(__glewClearTexImageEXT) +#define glClearTexSubImageEXT GLEW_GET_FUN(__glewClearTexSubImageEXT) + +#define GLEW_EXT_clear_texture GLEW_GET_VAR(__GLEW_EXT_clear_texture) + +#endif /* GL_EXT_clear_texture */ + +/* ----------------------- GL_EXT_clip_cull_distance ----------------------- */ + +#ifndef GL_EXT_clip_cull_distance +#define GL_EXT_clip_cull_distance 1 + +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA + +#define GLEW_EXT_clip_cull_distance GLEW_GET_VAR(__GLEW_EXT_clip_cull_distance) + +#endif /* GL_EXT_clip_cull_distance */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ----------------------- GL_EXT_color_buffer_float ----------------------- */ + +#ifndef GL_EXT_color_buffer_float +#define GL_EXT_color_buffer_float 1 + +#define GLEW_EXT_color_buffer_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_float) + +#endif /* GL_EXT_color_buffer_float */ + +/* --------------------- GL_EXT_color_buffer_half_float -------------------- */ + +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 + +#define GLEW_EXT_color_buffer_half_float GLEW_GET_VAR(__GLEW_EXT_color_buffer_half_float) + +#endif /* GL_EXT_color_buffer_half_float */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* ---------------- GL_EXT_compressed_ETC1_RGB8_sub_texture ---------------- */ + +#ifndef GL_EXT_compressed_ETC1_RGB8_sub_texture +#define GL_EXT_compressed_ETC1_RGB8_sub_texture 1 + +#define GLEW_EXT_compressed_ETC1_RGB8_sub_texture GLEW_GET_VAR(__GLEW_EXT_compressed_ETC1_RGB8_sub_texture) + +#endif /* GL_EXT_compressed_ETC1_RGB8_sub_texture */ + +/* ----------------------- GL_EXT_conservative_depth ----------------------- */ + +#ifndef GL_EXT_conservative_depth +#define GL_EXT_conservative_depth 1 + +#define GLEW_EXT_conservative_depth GLEW_GET_VAR(__GLEW_EXT_conservative_depth) + +#endif /* GL_EXT_conservative_depth */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* --------------------------- GL_EXT_copy_image --------------------------- */ + +#ifndef GL_EXT_copy_image +#define GL_EXT_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubDataEXT GLEW_GET_FUN(__glewCopyImageSubDataEXT) + +#define GLEW_EXT_copy_image GLEW_GET_VAR(__GLEW_EXT_copy_image) + +#endif /* GL_EXT_copy_image */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* --------------------------- GL_EXT_debug_label -------------------------- */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 + +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 + +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); + +#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) +#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) + +#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) + +#endif /* GL_EXT_debug_label */ + +/* -------------------------- GL_EXT_debug_marker -------------------------- */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 + +typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); +typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); + +#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) +#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) +#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) + +#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) + +#endif /* GL_EXT_debug_marker */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* ----------------------- GL_EXT_direct_state_access ---------------------- */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 + +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F + +typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, 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 (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, 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 (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, 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 (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + +#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) +#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) +#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) +#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) +#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) +#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) +#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) +#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) +#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) +#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) +#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) +#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) +#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) +#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) +#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) +#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) +#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) +#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) +#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) +#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) +#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) +#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) +#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) +#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) +#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) +#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) +#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) +#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) +#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) +#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) +#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) +#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) +#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) +#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) +#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) +#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) +#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) +#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) +#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) +#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) +#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) +#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) +#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) +#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) +#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) +#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) +#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) +#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) +#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) +#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) +#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) +#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) +#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) +#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) +#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) +#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) +#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) +#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) +#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) +#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) +#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) +#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) +#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) +#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) +#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) +#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) +#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) +#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) +#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) +#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) +#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) +#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) +#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) +#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) +#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) +#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) +#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) +#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) +#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) +#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) +#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) +#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) +#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) +#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) +#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) +#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) +#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) +#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) +#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) +#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) +#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) +#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) +#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) +#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) +#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) +#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) +#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) +#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) +#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) +#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) +#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) +#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) +#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) +#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) +#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) +#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) +#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) +#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) +#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) +#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) +#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) +#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) +#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) +#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) +#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) +#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) +#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) +#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) +#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) +#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) +#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) +#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) +#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) +#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) +#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) +#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) +#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) +#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) +#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) +#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) +#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) +#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) +#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) +#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) +#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) +#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) +#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) +#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) +#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) +#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) +#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) +#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) +#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) +#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) +#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) +#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) +#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) +#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) +#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) +#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) +#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) +#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) +#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) +#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) +#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) +#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) +#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) +#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) +#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) +#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) +#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) +#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) +#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) +#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) +#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) +#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) +#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) +#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) +#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) +#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) +#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) +#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) +#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) +#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) +#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) +#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) +#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) +#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) +#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) +#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) +#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) +#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) +#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) +#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) +#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) +#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) +#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) +#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) +#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) +#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) +#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) +#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) +#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) +#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) +#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) +#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) +#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) +#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) +#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) +#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) +#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) +#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) +#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) +#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) +#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) +#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) +#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) +#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) +#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) +#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) +#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) +#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) +#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) +#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) + +#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) + +#endif /* GL_EXT_direct_state_access */ + +/* ----------------------- GL_EXT_discard_framebuffer ---------------------- */ + +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 + +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 + +typedef void (GLAPIENTRY * PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); + +#define glDiscardFramebufferEXT GLEW_GET_FUN(__glewDiscardFramebufferEXT) + +#define GLEW_EXT_discard_framebuffer GLEW_GET_VAR(__GLEW_EXT_discard_framebuffer) + +#endif /* GL_EXT_discard_framebuffer */ + +/* -------------------------- GL_EXT_draw_buffers -------------------------- */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersEXT GLEW_GET_FUN(__glewDrawBuffersEXT) + +#define GLEW_EXT_draw_buffers GLEW_GET_VAR(__GLEW_EXT_draw_buffers) + +#endif /* GL_EXT_draw_buffers */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ---------------------- GL_EXT_draw_buffers_indexed ---------------------- */ + +#ifndef GL_EXT_draw_buffers_indexed +#define GL_EXT_draw_buffers_indexed 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); + +#define glBlendEquationSeparateiEXT GLEW_GET_FUN(__glewBlendEquationSeparateiEXT) +#define glBlendEquationiEXT GLEW_GET_FUN(__glewBlendEquationiEXT) +#define glBlendFuncSeparateiEXT GLEW_GET_FUN(__glewBlendFuncSeparateiEXT) +#define glBlendFunciEXT GLEW_GET_FUN(__glewBlendFunciEXT) +#define glColorMaskiEXT GLEW_GET_FUN(__glewColorMaskiEXT) +#define glDisableiEXT GLEW_GET_FUN(__glewDisableiEXT) +#define glEnableiEXT GLEW_GET_FUN(__glewEnableiEXT) +#define glIsEnablediEXT GLEW_GET_FUN(__glewIsEnablediEXT) + +#define GLEW_EXT_draw_buffers_indexed GLEW_GET_VAR(__GLEW_EXT_draw_buffers_indexed) + +#endif /* GL_EXT_draw_buffers_indexed */ + +/* -------------------- GL_EXT_draw_elements_base_vertex ------------------- */ + +#ifndef GL_EXT_draw_elements_base_vertex +#define GL_EXT_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); + +#define glDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsBaseVertexEXT) +#define glDrawElementsInstancedBaseVertexEXT GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexEXT) +#define glDrawRangeElementsBaseVertexEXT GLEW_GET_FUN(__glewDrawRangeElementsBaseVertexEXT) +#define glMultiDrawElementsBaseVertexEXT GLEW_GET_FUN(__glewMultiDrawElementsBaseVertexEXT) + +#define GLEW_EXT_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_EXT_draw_elements_base_vertex) + +#endif /* GL_EXT_draw_elements_base_vertex */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ------------------------- GL_EXT_external_buffer ------------------------ */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 + +typedef void* GLeglClientBufferEXT; + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); + +#define glBufferStorageExternalEXT GLEW_GET_FUN(__glewBufferStorageExternalEXT) +#define glNamedBufferStorageExternalEXT GLEW_GET_FUN(__glewNamedBufferStorageExternalEXT) + +#define GLEW_EXT_external_buffer GLEW_GET_VAR(__GLEW_EXT_external_buffer) + +#endif /* GL_EXT_external_buffer */ + +/* --------------------------- GL_EXT_float_blend -------------------------- */ + +#ifndef GL_EXT_float_blend +#define GL_EXT_float_blend 1 + +#define GLEW_EXT_float_blend GLEW_GET_VAR(__GLEW_EXT_float_blend) + +#endif /* GL_EXT_float_blend */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* --------------------------- GL_EXT_frag_depth --------------------------- */ + +#ifndef GL_EXT_frag_depth +#define GL_EXT_frag_depth 1 + +#define GLEW_EXT_frag_depth GLEW_GET_VAR(__GLEW_EXT_frag_depth) + +#endif /* GL_EXT_frag_depth */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 + +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB + +#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) + +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ----------------------- GL_EXT_geometry_point_size ---------------------- */ + +#ifndef GL_EXT_geometry_point_size +#define GL_EXT_geometry_point_size 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_point_size GLEW_GET_VAR(__GLEW_EXT_geometry_point_size) + +#endif /* GL_EXT_geometry_point_size */ + +/* ------------------------- GL_EXT_geometry_shader ------------------------ */ + +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 + +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 + +#define GLEW_EXT_geometry_shader GLEW_GET_VAR(__GLEW_EXT_geometry_shader) + +#endif /* GL_EXT_geometry_shader */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* --------------------------- GL_EXT_gpu_shader5 -------------------------- */ + +#ifndef GL_EXT_gpu_shader5 +#define GL_EXT_gpu_shader5 1 + +#define GLEW_EXT_gpu_shader5 GLEW_GET_VAR(__GLEW_EXT_gpu_shader5) + +#endif /* GL_EXT_gpu_shader5 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* ------------------------ GL_EXT_instanced_arrays ------------------------ */ + +#ifndef GL_EXT_instanced_arrays +#define GL_EXT_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexAttribDivisorEXT) + +#define GLEW_EXT_instanced_arrays GLEW_GET_VAR(__GLEW_EXT_instanced_arrays) + +#endif /* GL_EXT_instanced_arrays */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------ GL_EXT_map_buffer_range ------------------------ */ + +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 + +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedBufferRangeEXT) +#define glMapBufferRangeEXT GLEW_GET_FUN(__glewMapBufferRangeEXT) + +#define GLEW_EXT_map_buffer_range GLEW_GET_VAR(__GLEW_EXT_map_buffer_range) + +#endif /* GL_EXT_map_buffer_range */ + +/* -------------------------- GL_EXT_memory_object ------------------------- */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 + +#define GL_UUID_SIZE_EXT 16 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint* memoryObjects); +typedef void (GLAPIENTRY * PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte* data); +typedef void (GLAPIENTRY * PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte* data); +typedef GLboolean (GLAPIENTRY * PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (GLAPIENTRY * PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); + +#define glBufferStorageMemEXT GLEW_GET_FUN(__glewBufferStorageMemEXT) +#define glCreateMemoryObjectsEXT GLEW_GET_FUN(__glewCreateMemoryObjectsEXT) +#define glDeleteMemoryObjectsEXT GLEW_GET_FUN(__glewDeleteMemoryObjectsEXT) +#define glGetMemoryObjectParameterivEXT GLEW_GET_FUN(__glewGetMemoryObjectParameterivEXT) +#define glGetUnsignedBytei_vEXT GLEW_GET_FUN(__glewGetUnsignedBytei_vEXT) +#define glGetUnsignedBytevEXT GLEW_GET_FUN(__glewGetUnsignedBytevEXT) +#define glIsMemoryObjectEXT GLEW_GET_FUN(__glewIsMemoryObjectEXT) +#define glMemoryObjectParameterivEXT GLEW_GET_FUN(__glewMemoryObjectParameterivEXT) +#define glNamedBufferStorageMemEXT GLEW_GET_FUN(__glewNamedBufferStorageMemEXT) +#define glTexStorageMem1DEXT GLEW_GET_FUN(__glewTexStorageMem1DEXT) +#define glTexStorageMem2DEXT GLEW_GET_FUN(__glewTexStorageMem2DEXT) +#define glTexStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem2DMultisampleEXT) +#define glTexStorageMem3DEXT GLEW_GET_FUN(__glewTexStorageMem3DEXT) +#define glTexStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTexStorageMem3DMultisampleEXT) +#define glTextureStorageMem1DEXT GLEW_GET_FUN(__glewTextureStorageMem1DEXT) +#define glTextureStorageMem2DEXT GLEW_GET_FUN(__glewTextureStorageMem2DEXT) +#define glTextureStorageMem2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem2DMultisampleEXT) +#define glTextureStorageMem3DEXT GLEW_GET_FUN(__glewTextureStorageMem3DEXT) +#define glTextureStorageMem3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorageMem3DMultisampleEXT) + +#define GLEW_EXT_memory_object GLEW_GET_VAR(__GLEW_EXT_memory_object) + +#endif /* GL_EXT_memory_object */ + +/* ------------------------ GL_EXT_memory_object_fd ------------------------ */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 + +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); + +#define glImportMemoryFdEXT GLEW_GET_FUN(__glewImportMemoryFdEXT) + +#define GLEW_EXT_memory_object_fd GLEW_GET_VAR(__GLEW_EXT_memory_object_fd) + +#endif /* GL_EXT_memory_object_fd */ + +/* ----------------------- GL_EXT_memory_object_win32 ---------------------- */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 + +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A + +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); + +#define glImportMemoryWin32HandleEXT GLEW_GET_FUN(__glewImportMemoryWin32HandleEXT) +#define glImportMemoryWin32NameEXT GLEW_GET_FUN(__glewImportMemoryWin32NameEXT) + +#define GLEW_EXT_memory_object_win32 GLEW_GET_VAR(__GLEW_EXT_memory_object_win32) + +#endif /* GL_EXT_memory_object_win32 */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* ----------------------- GL_EXT_multi_draw_indirect ---------------------- */ + +#ifndef GL_EXT_multi_draw_indirect +#define GL_EXT_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectEXT GLEW_GET_FUN(__glewMultiDrawArraysIndirectEXT) +#define glMultiDrawElementsIndirectEXT GLEW_GET_FUN(__glewMultiDrawElementsIndirectEXT) + +#define GLEW_EXT_multi_draw_indirect GLEW_GET_VAR(__GLEW_EXT_multi_draw_indirect) + +#endif /* GL_EXT_multi_draw_indirect */ + +/* ------------------------ GL_EXT_multiple_textures ----------------------- */ + +#ifndef GL_EXT_multiple_textures +#define GL_EXT_multiple_textures 1 + +#define GLEW_EXT_multiple_textures GLEW_GET_VAR(__GLEW_EXT_multiple_textures) + +#endif /* GL_EXT_multiple_textures */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* -------------------- GL_EXT_multisample_compatibility ------------------- */ + +#ifndef GL_EXT_multisample_compatibility +#define GL_EXT_multisample_compatibility 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F + +#define GLEW_EXT_multisample_compatibility GLEW_GET_VAR(__GLEW_EXT_multisample_compatibility) + +#endif /* GL_EXT_multisample_compatibility */ + +/* ----------------- GL_EXT_multisampled_render_to_texture ----------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); + +#define glFramebufferTexture2DMultisampleEXT GLEW_GET_FUN(__glewFramebufferTexture2DMultisampleEXT) + +#define GLEW_EXT_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture) + +#endif /* GL_EXT_multisampled_render_to_texture */ + +/* ----------------- GL_EXT_multisampled_render_to_texture2 ---------------- */ + +#ifndef GL_EXT_multisampled_render_to_texture2 +#define GL_EXT_multisampled_render_to_texture2 1 + +#define GLEW_EXT_multisampled_render_to_texture2 GLEW_GET_VAR(__GLEW_EXT_multisampled_render_to_texture2) + +#endif /* GL_EXT_multisampled_render_to_texture2 */ + +/* --------------------- GL_EXT_multiview_draw_buffers --------------------- */ + +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 + +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum* location, const GLint *indices); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint* data); +typedef void (GLAPIENTRY * PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); + +#define glDrawBuffersIndexedEXT GLEW_GET_FUN(__glewDrawBuffersIndexedEXT) +#define glGetIntegeri_vEXT GLEW_GET_FUN(__glewGetIntegeri_vEXT) +#define glReadBufferIndexedEXT GLEW_GET_FUN(__glewReadBufferIndexedEXT) + +#define GLEW_EXT_multiview_draw_buffers GLEW_GET_VAR(__GLEW_EXT_multiview_draw_buffers) + +#endif /* GL_EXT_multiview_draw_buffers */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) + +#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) + +#endif /* GL_EXT_polygon_offset_clamp */ + +/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 + +#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) + +#endif /* GL_EXT_post_depth_coverage */ + +/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); + +#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) + +#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) + +#endif /* GL_EXT_provoking_vertex */ + +/* --------------------------- GL_EXT_pvrtc_sRGB --------------------------- */ + +#ifndef GL_EXT_pvrtc_sRGB +#define GL_EXT_pvrtc_sRGB 1 + +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 + +#define GLEW_EXT_pvrtc_sRGB GLEW_GET_VAR(__GLEW_EXT_pvrtc_sRGB) + +#endif /* GL_EXT_pvrtc_sRGB */ + +/* ----------------------- GL_EXT_raster_multisample ----------------------- */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); + +#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) +#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) +#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) +#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) + +#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) + +#endif /* GL_EXT_raster_multisample */ + +/* ------------------------ GL_EXT_read_format_bgra ------------------------ */ + +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 + +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + +#define GLEW_EXT_read_format_bgra GLEW_GET_VAR(__GLEW_EXT_read_format_bgra) + +#endif /* GL_EXT_read_format_bgra */ + +/* -------------------------- GL_EXT_render_snorm -------------------------- */ + +#ifndef GL_EXT_render_snorm +#define GL_EXT_render_snorm 1 + +#define GL_BYTE 0x1400 +#define GL_SHORT 0x1402 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGBA16_SNORM_EXT 0x8F9B + +#define GLEW_EXT_render_snorm GLEW_GET_VAR(__GLEW_EXT_render_snorm) + +#endif /* GL_EXT_render_snorm */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GL_RESCALE_NORMAL_EXT 0x803A + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* ------------------------------ GL_EXT_sRGB ------------------------------ */ + +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 + +#define GLEW_EXT_sRGB GLEW_GET_VAR(__GLEW_EXT_sRGB) + +#endif /* GL_EXT_sRGB */ + +/* ----------------------- GL_EXT_sRGB_write_control ----------------------- */ + +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + +#define GLEW_EXT_sRGB_write_control GLEW_GET_VAR(__GLEW_EXT_sRGB_write_control) + +#endif /* GL_EXT_sRGB_write_control */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* ---------------------------- GL_EXT_semaphore --------------------------- */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 + +typedef void (GLAPIENTRY * PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint* semaphores); +typedef void (GLAPIENTRY * PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (GLAPIENTRY * PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64* params); +typedef void (GLAPIENTRY * PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +typedef void (GLAPIENTRY * PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint* buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); + +#define glDeleteSemaphoresEXT GLEW_GET_FUN(__glewDeleteSemaphoresEXT) +#define glGenSemaphoresEXT GLEW_GET_FUN(__glewGenSemaphoresEXT) +#define glGetSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewGetSemaphoreParameterui64vEXT) +#define glIsSemaphoreEXT GLEW_GET_FUN(__glewIsSemaphoreEXT) +#define glSemaphoreParameterui64vEXT GLEW_GET_FUN(__glewSemaphoreParameterui64vEXT) +#define glSignalSemaphoreEXT GLEW_GET_FUN(__glewSignalSemaphoreEXT) +#define glWaitSemaphoreEXT GLEW_GET_FUN(__glewWaitSemaphoreEXT) + +#define GLEW_EXT_semaphore GLEW_GET_VAR(__GLEW_EXT_semaphore) + +#endif /* GL_EXT_semaphore */ + +/* -------------------------- GL_EXT_semaphore_fd -------------------------- */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); + +#define glImportSemaphoreFdEXT GLEW_GET_FUN(__glewImportSemaphoreFdEXT) + +#define GLEW_EXT_semaphore_fd GLEW_GET_VAR(__GLEW_EXT_semaphore_fd) + +#endif /* GL_EXT_semaphore_fd */ + +/* ------------------------- GL_EXT_semaphore_win32 ------------------------ */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 + +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (GLAPIENTRY * PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); + +#define glImportSemaphoreWin32HandleEXT GLEW_GET_FUN(__glewImportSemaphoreWin32HandleEXT) +#define glImportSemaphoreWin32NameEXT GLEW_GET_FUN(__glewImportSemaphoreWin32NameEXT) + +#define GLEW_EXT_semaphore_win32 GLEW_GET_VAR(__GLEW_EXT_semaphore_win32) + +#endif /* GL_EXT_semaphore_win32 */ + +/* --------------------- GL_EXT_separate_shader_objects -------------------- */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 + +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D + +typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); +typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); + +#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) +#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) +#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) + +#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) + +#endif /* GL_EXT_separate_shader_objects */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* -------------------- GL_EXT_shader_framebuffer_fetch -------------------- */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 + +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + +#define GLEW_EXT_shader_framebuffer_fetch GLEW_GET_VAR(__GLEW_EXT_shader_framebuffer_fetch) + +#endif /* GL_EXT_shader_framebuffer_fetch */ + +/* ------------------------ GL_EXT_shader_group_vote ----------------------- */ + +#ifndef GL_EXT_shader_group_vote +#define GL_EXT_shader_group_vote 1 + +#define GLEW_EXT_shader_group_vote GLEW_GET_VAR(__GLEW_EXT_shader_group_vote) + +#endif /* GL_EXT_shader_group_vote */ + +/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 + +#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) + +#endif /* GL_EXT_shader_image_load_formatted */ + +/* --------------------- GL_EXT_shader_image_load_store -------------------- */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); + +#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) +#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) + +#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) + +#endif /* GL_EXT_shader_image_load_store */ + +/* ------------------- GL_EXT_shader_implicit_conversions ------------------ */ + +#ifndef GL_EXT_shader_implicit_conversions +#define GL_EXT_shader_implicit_conversions 1 + +#define GLEW_EXT_shader_implicit_conversions GLEW_GET_VAR(__GLEW_EXT_shader_implicit_conversions) + +#endif /* GL_EXT_shader_implicit_conversions */ + +/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 + +#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) + +#endif /* GL_EXT_shader_integer_mix */ + +/* ------------------------ GL_EXT_shader_io_blocks ------------------------ */ + +#ifndef GL_EXT_shader_io_blocks +#define GL_EXT_shader_io_blocks 1 + +#define GLEW_EXT_shader_io_blocks GLEW_GET_VAR(__GLEW_EXT_shader_io_blocks) + +#endif /* GL_EXT_shader_io_blocks */ + +/* ------------- GL_EXT_shader_non_constant_global_initializers ------------ */ + +#ifndef GL_EXT_shader_non_constant_global_initializers +#define GL_EXT_shader_non_constant_global_initializers 1 + +#define GLEW_EXT_shader_non_constant_global_initializers GLEW_GET_VAR(__GLEW_EXT_shader_non_constant_global_initializers) + +#endif /* GL_EXT_shader_non_constant_global_initializers */ + +/* ------------------- GL_EXT_shader_pixel_local_storage ------------------- */ + +#ifndef GL_EXT_shader_pixel_local_storage +#define GL_EXT_shader_pixel_local_storage 1 + +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 + +#define GLEW_EXT_shader_pixel_local_storage GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage) + +#endif /* GL_EXT_shader_pixel_local_storage */ + +/* ------------------- GL_EXT_shader_pixel_local_storage2 ------------------ */ + +#ifndef GL_EXT_shader_pixel_local_storage2 +#define GL_EXT_shader_pixel_local_storage2 1 + +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 + +typedef void (GLAPIENTRY * PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint* values); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GLAPIENTRY * PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); + +#define glClearPixelLocalStorageuiEXT GLEW_GET_FUN(__glewClearPixelLocalStorageuiEXT) +#define glFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewFramebufferPixelLocalStorageSizeEXT) +#define glGetFramebufferPixelLocalStorageSizeEXT GLEW_GET_FUN(__glewGetFramebufferPixelLocalStorageSizeEXT) + +#define GLEW_EXT_shader_pixel_local_storage2 GLEW_GET_VAR(__GLEW_EXT_shader_pixel_local_storage2) + +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +/* ----------------------- GL_EXT_shader_texture_lod ----------------------- */ + +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 + +#define GLEW_EXT_shader_texture_lod GLEW_GET_VAR(__GLEW_EXT_shader_texture_lod) + +#endif /* GL_EXT_shader_texture_lod */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* ------------------------- GL_EXT_shadow_samplers ------------------------ */ + +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 + +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 + +#define GLEW_EXT_shadow_samplers GLEW_GET_VAR(__GLEW_EXT_shadow_samplers) + +#endif /* GL_EXT_shadow_samplers */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------- GL_EXT_sparse_texture ------------------------- */ + +#ifndef GL_EXT_sparse_texture +#define GL_EXT_sparse_texture 1 + +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A +#define GL_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentEXT GLEW_GET_FUN(__glewTexPageCommitmentEXT) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_EXT_sparse_texture GLEW_GET_VAR(__GLEW_EXT_sparse_texture) + +#endif /* GL_EXT_sparse_texture */ + +/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 + +#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) + +#endif /* GL_EXT_sparse_texture2 */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------- GL_EXT_texture_compression_astc_decode_mode -------------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode +#define GL_EXT_texture_compression_astc_decode_mode 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode) + +#endif /* GL_EXT_texture_compression_astc_decode_mode */ + +/* ----------- GL_EXT_texture_compression_astc_decode_mode_rgb9e5 ---------- */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode_rgb9e5 +#define GL_EXT_texture_compression_astc_decode_mode_rgb9e5 1 + +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 + +#define GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5 GLEW_GET_VAR(__GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5) + +#endif /* GL_EXT_texture_compression_astc_decode_mode_rgb9e5 */ + +/* -------------------- GL_EXT_texture_compression_bptc -------------------- */ + +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F + +#define GLEW_EXT_texture_compression_bptc GLEW_GET_VAR(__GLEW_EXT_texture_compression_bptc) + +#endif /* GL_EXT_texture_compression_bptc */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* --------------------- GL_EXT_texture_cube_map_array --------------------- */ + +#ifndef GL_EXT_texture_cube_map_array +#define GL_EXT_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A + +#define GLEW_EXT_texture_cube_map_array GLEW_GET_VAR(__GLEW_EXT_texture_cube_map_array) + +#endif /* GL_EXT_texture_cube_map_array */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 + +#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) + +#endif /* GL_EXT_texture_filter_minmax */ + +/* --------------------- GL_EXT_texture_format_BGRA8888 -------------------- */ + +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 + +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_texture_format_BGRA8888 GLEW_GET_VAR(__GLEW_EXT_texture_format_BGRA8888) + +#endif /* GL_EXT_texture_format_BGRA8888 */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_norm16 ------------------------- */ + +#ifndef GL_EXT_texture_norm16 +#define GL_EXT_texture_norm16 1 + +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA16_EXT 0x805B +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGBA16_SNORM_EXT 0x8F9B + +#define GLEW_EXT_texture_norm16 GLEW_GET_VAR(__GLEW_EXT_texture_norm16) + +#endif /* GL_EXT_texture_norm16 */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* --------------------------- GL_EXT_texture_rg --------------------------- */ + +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 + +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B + +#define GLEW_EXT_texture_rg GLEW_GET_VAR(__GLEW_EXT_texture_rg) + +#endif /* GL_EXT_texture_rg */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* ------------------------- GL_EXT_texture_sRGB_R8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 + +#define GL_SR8_EXT 0x8FBD + +#define GLEW_EXT_texture_sRGB_R8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_R8) + +#endif /* GL_EXT_texture_sRGB_R8 */ + +/* ------------------------ GL_EXT_texture_sRGB_RG8 ------------------------ */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 + +#define GL_SRG8_EXT 0x8FBE + +#define GLEW_EXT_texture_sRGB_RG8 GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_RG8) + +#endif /* GL_EXT_texture_sRGB_RG8 */ + +/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) + +#endif /* GL_EXT_texture_sRGB_decode */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* -------------------------- GL_EXT_texture_snorm ------------------------- */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 + +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B + +#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) + +#endif /* GL_EXT_texture_snorm */ + +/* ------------------------- GL_EXT_texture_storage ------------------------ */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 + +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R16F_EXT 0x822D +#define GL_R32F_EXT 0x822E +#define GL_RG16F_EXT 0x822F +#define GL_RG32F_EXT 0x8230 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB_RAW_422_APPLE 0x8A51 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_BGRA8_EXT 0x93A1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +#define glTexStorage1DEXT GLEW_GET_FUN(__glewTexStorage1DEXT) +#define glTexStorage2DEXT GLEW_GET_FUN(__glewTexStorage2DEXT) +#define glTexStorage3DEXT GLEW_GET_FUN(__glewTexStorage3DEXT) +#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) +#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) +#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) + +#define GLEW_EXT_texture_storage GLEW_GET_VAR(__GLEW_EXT_texture_storage) + +#endif /* GL_EXT_texture_storage */ + +/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 + +#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) + +#endif /* GL_EXT_texture_swizzle */ + +/* ------------------- GL_EXT_texture_type_2_10_10_10_REV ------------------ */ + +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 + +#define GLEW_EXT_texture_type_2_10_10_10_REV GLEW_GET_VAR(__GLEW_EXT_texture_type_2_10_10_10_REV) + +#endif /* GL_EXT_texture_type_2_10_10_10_REV */ + +/* -------------------------- GL_EXT_texture_view -------------------------- */ + +#ifndef GL_EXT_texture_view +#define GL_EXT_texture_view 1 + +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureViewEXT GLEW_GET_FUN(__glewTextureViewEXT) + +#define GLEW_EXT_texture_view GLEW_GET_VAR(__GLEW_EXT_texture_view) + +#endif /* GL_EXT_texture_view */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* ----------------------- GL_EXT_transform_feedback ----------------------- */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 + +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F + +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); + +#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) +#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) +#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) +#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) +#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) +#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) +#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) + +#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) + +#endif /* GL_EXT_transform_feedback */ + +/* ------------------------- GL_EXT_unpack_subimage ------------------------ */ + +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 + +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 + +#define GLEW_EXT_unpack_subimage GLEW_GET_VAR(__GLEW_EXT_unpack_subimage) + +#endif /* GL_EXT_unpack_subimage */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) + +#endif /* GL_EXT_vertex_array_bgra */ + +/* ----------------------- GL_EXT_vertex_array_setXXX ---------------------- */ + +#ifndef GL_EXT_vertex_array_setXXX +#define GL_EXT_vertex_array_setXXX 1 + +typedef void (GLAPIENTRY * PFNGLBINDARRAYSETEXTPROC) (const void *arrayset); +typedef const void * (GLAPIENTRY * PFNGLCREATEARRAYSETEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEARRAYSETSEXTPROC) (GLsizei n, const void *arrayset[]); + +#define glBindArraySetEXT GLEW_GET_FUN(__glewBindArraySetEXT) +#define glCreateArraySetExt GLEW_GET_FUN(__glewCreateArraySetExt) +#define glDeleteArraySetsEXT GLEW_GET_FUN(__glewDeleteArraySetsEXT) + +#define GLEW_EXT_vertex_array_setXXX GLEW_GET_VAR(__GLEW_EXT_vertex_array_setXXX) + +#endif /* GL_EXT_vertex_array_setXXX */ + +/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 + +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) +#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) +#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) +#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) +#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) +#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) +#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) +#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) +#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) +#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) +#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) + +#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) + +#endif /* GL_EXT_vertex_attrib_64bit */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ------------------------ GL_EXT_win32_keyed_mutex ----------------------- */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 + +typedef GLboolean (GLAPIENTRY * PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (GLAPIENTRY * PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); + +#define glAcquireKeyedMutexWin32EXT GLEW_GET_FUN(__glewAcquireKeyedMutexWin32EXT) +#define glReleaseKeyedMutexWin32EXT GLEW_GET_FUN(__glewReleaseKeyedMutexWin32EXT) + +#define GLEW_EXT_win32_keyed_mutex GLEW_GET_VAR(__GLEW_EXT_win32_keyed_mutex) + +#endif /* GL_EXT_win32_keyed_mutex */ + +/* ------------------------ GL_EXT_window_rectangles ----------------------- */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 + +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 + +typedef void (GLAPIENTRY * PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint box[]); + +#define glWindowRectanglesEXT GLEW_GET_FUN(__glewWindowRectanglesEXT) + +#define GLEW_EXT_window_rectangles GLEW_GET_VAR(__GLEW_EXT_window_rectangles) + +#endif /* GL_EXT_window_rectangles */ + +/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 + +#define GL_SYNC_X11_FENCE_EXT 0x90E1 + +typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); + +#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) + +#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) + +#endif /* GL_EXT_x11_sync_object */ + +/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 + +typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); + +#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) + +#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) + +#endif /* GL_GREMEDY_frame_terminator */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------ GL_INTEL_conservative_rasterization ------------------ */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 + +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE + +#define GLEW_INTEL_conservative_rasterization GLEW_GET_VAR(__GLEW_INTEL_conservative_rasterization) + +#endif /* GL_INTEL_conservative_rasterization */ + +/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 + +#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) + +#endif /* GL_INTEL_fragment_shader_ordering */ + +/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 + +#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) + +#endif /* GL_INTEL_framebuffer_CMAA */ + +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ----------------------- GL_INTEL_performance_query ---------------------- */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 + +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); +typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); +typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); +typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); + +#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) +#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) +#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) +#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) +#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) +#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) +#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) +#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) +#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) +#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) + +#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) + +#endif /* GL_INTEL_performance_query */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); + +#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) + +#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) + +#endif /* GL_KHR_blend_equation_advanced */ + +/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 + +#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) + +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +/* ---------------------- GL_KHR_context_flush_control --------------------- */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 + +#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) + +#endif /* GL_KHR_context_flush_control */ + +/* ------------------------------ GL_KHR_debug ----------------------------- */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 + +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_DISPLAY_LIST 0x82E7 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_OUTPUT 0x92E0 + +typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (void* ptr, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (void* ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); + +#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) +#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) +#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) +#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) +#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) +#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) +#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) +#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) +#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) + +#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) + +#endif /* GL_KHR_debug */ + +/* ---------------------------- GL_KHR_no_error ---------------------------- */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) + +#endif /* GL_KHR_no_error */ + +/* --------------------- GL_KHR_parallel_shader_compile -------------------- */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsKHR GLEW_GET_FUN(__glewMaxShaderCompilerThreadsKHR) + +#define GLEW_KHR_parallel_shader_compile GLEW_GET_VAR(__GLEW_KHR_parallel_shader_compile) + +#endif /* GL_KHR_parallel_shader_compile */ + +/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 + +#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) + +#endif /* GL_KHR_robust_buffer_access_behavior */ + +/* --------------------------- GL_KHR_robustness --------------------------- */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 + +#define GL_CONTEXT_LOST 0x0507 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 + +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + +#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) +#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) +#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) +#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) + +#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) + +#endif /* GL_KHR_robustness */ + +/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) + +#endif /* GL_KHR_texture_compression_astc_hdr */ + +/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) + +#endif /* GL_KHR_texture_compression_astc_ldr */ + +/* --------------- GL_KHR_texture_compression_astc_sliced_3d --------------- */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 + +#define GLEW_KHR_texture_compression_astc_sliced_3d GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_sliced_3d) + +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) +#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) +#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) +#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) +#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* -------------------- GL_MESA_shader_integer_functions ------------------- */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 + +#define GLEW_MESA_shader_integer_functions GLEW_GET_VAR(__GLEW_MESA_shader_integer_functions) + +#endif /* GL_MESA_shader_integer_functions */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* ----------- GL_NVX_blend_equation_advanced_multi_draw_buffers ----------- */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 + +#define GLEW_NVX_blend_equation_advanced_multi_draw_buffers GLEW_GET_VAR(__GLEW_NVX_blend_equation_advanced_multi_draw_buffers) + +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + +/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 + +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B + +#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) + +#endif /* GL_NVX_gpu_memory_info */ + +/* ---------------------- GL_NVX_linked_gpu_multicast ---------------------- */ + +#ifndef GL_NVX_linked_gpu_multicast +#define GL_NVX_linked_gpu_multicast 1 + +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA + +typedef void (GLAPIENTRY * PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLLGPUINTERLOCKNVXPROC) (void); +typedef void (GLAPIENTRY * PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); + +#define glLGPUCopyImageSubDataNVX GLEW_GET_FUN(__glewLGPUCopyImageSubDataNVX) +#define glLGPUInterlockNVX GLEW_GET_FUN(__glewLGPUInterlockNVX) +#define glLGPUNamedBufferSubDataNVX GLEW_GET_FUN(__glewLGPUNamedBufferSubDataNVX) + +#define GLEW_NVX_linked_gpu_multicast GLEW_GET_VAR(__GLEW_NVX_linked_gpu_multicast) + +#endif /* GL_NVX_linked_gpu_multicast */ + +/* ------------------------ GL_NV_3dvision_settings ------------------------ */ + +#ifndef GL_NV_3dvision_settings +#define GL_NV_3dvision_settings 1 + +#define GL_3DVISION_STEREO_NV 0x90F4 +#define GL_STEREO_SEPARATION_NV 0x90F5 +#define GL_STEREO_CONVERGENCE_NV 0x90F6 +#define GL_STEREO_CUTOFF_NV 0x90F7 +#define GL_STEREO_PROJECTION_NV 0x90F8 +#define GL_STEREO_PROJECTION_PERSPECTIVE_NV 0x90F9 +#define GL_STEREO_PROJECTION_ORTHO_NV 0x90FA + +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSTEREOPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glStereoParameterfNV GLEW_GET_FUN(__glewStereoParameterfNV) +#define glStereoParameteriNV GLEW_GET_FUN(__glewStereoParameteriNV) + +#define GLEW_NV_3dvision_settings GLEW_GET_VAR(__GLEW_NV_3dvision_settings) + +#endif /* GL_NV_3dvision_settings */ + +/* ------------------- GL_NV_EGL_stream_consumer_external ------------------ */ + +#ifndef GL_NV_EGL_stream_consumer_external +#define GL_NV_EGL_stream_consumer_external 1 + +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 + +#define GLEW_NV_EGL_stream_consumer_external GLEW_GET_VAR(__GLEW_NV_EGL_stream_consumer_external) + +#endif /* GL_NV_EGL_stream_consumer_external */ + +/* ----------------- GL_NV_alpha_to_coverage_dither_control ---------------- */ + +#ifndef GL_NV_alpha_to_coverage_dither_control +#define GL_NV_alpha_to_coverage_dither_control 1 + +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F + +#define GLEW_NV_alpha_to_coverage_dither_control GLEW_GET_VAR(__GLEW_NV_alpha_to_coverage_dither_control) + +#endif /* GL_NV_alpha_to_coverage_dither_control */ + +/* ------------------------------- GL_NV_bgr ------------------------------- */ + +#ifndef GL_NV_bgr +#define GL_NV_bgr 1 + +#define GL_BGR_NV 0x80E0 + +#define GLEW_NV_bgr GLEW_GET_VAR(__GLEW_NV_bgr) + +#endif /* GL_NV_bgr */ + +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) +#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) + +#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +/* ------------------------- GL_NV_bindless_texture ------------------------ */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) +#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) +#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) +#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) +#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) +#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) +#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) +#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) +#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) +#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) +#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) +#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) +#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) + +#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) + +#endif /* GL_NV_bindless_texture */ + +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_XOR_NV 0x1506 +#define GL_RED_NV 0x1903 +#define GL_GREEN_NV 0x1904 +#define GL_BLUE_NV 0x1905 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + +/* ----------------------- GL_NV_blend_minmax_factor ----------------------- */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_NV_blend_minmax_factor GLEW_GET_VAR(__GLEW_NV_blend_minmax_factor) + +#endif /* GL_NV_blend_minmax_factor */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ----------------------- GL_NV_clip_space_w_scaling ---------------------- */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 + +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E + +typedef void (GLAPIENTRY * PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); + +#define glViewportPositionWScaleNV GLEW_GET_FUN(__glewViewportPositionWScaleNV) + +#define GLEW_NV_clip_space_w_scaling GLEW_GET_VAR(__GLEW_NV_clip_space_w_scaling) + +#endif /* GL_NV_clip_space_w_scaling */ + +/* --------------------------- GL_NV_command_list -------------------------- */ + +#ifndef GL_NV_command_list +#define GL_NV_command_list 1 + +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000a +#define GL_BLEND_COLOR_COMMAND_NV 0x000b +#define GL_STENCIL_REF_COMMAND_NV 0x000c +#define GL_LINE_WIDTH_COMMAND_NV 0x000d +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000e +#define GL_ALPHA_REF_COMMAND_NV 0x000f +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 + +typedef void (GLAPIENTRY * PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (GLAPIENTRY * PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (GLAPIENTRY * PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint* lists); +typedef void (GLAPIENTRY * PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint* states); +typedef void (GLAPIENTRY * PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint* lists); +typedef void (GLAPIENTRY * PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint* states); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr* indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef GLuint (GLAPIENTRY * PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (GLAPIENTRY * PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef GLboolean (GLAPIENTRY * PFNGLISCOMMANDLISTNVPROC) (GLuint list); +typedef GLboolean (GLAPIENTRY * PFNGLISSTATENVPROC) (GLuint state); +typedef void (GLAPIENTRY * PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void** indirects, const GLsizei* sizes, const GLuint* states, const GLuint* fbos, GLuint count); +typedef void (GLAPIENTRY * PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); + +#define glCallCommandListNV GLEW_GET_FUN(__glewCallCommandListNV) +#define glCommandListSegmentsNV GLEW_GET_FUN(__glewCommandListSegmentsNV) +#define glCompileCommandListNV GLEW_GET_FUN(__glewCompileCommandListNV) +#define glCreateCommandListsNV GLEW_GET_FUN(__glewCreateCommandListsNV) +#define glCreateStatesNV GLEW_GET_FUN(__glewCreateStatesNV) +#define glDeleteCommandListsNV GLEW_GET_FUN(__glewDeleteCommandListsNV) +#define glDeleteStatesNV GLEW_GET_FUN(__glewDeleteStatesNV) +#define glDrawCommandsAddressNV GLEW_GET_FUN(__glewDrawCommandsAddressNV) +#define glDrawCommandsNV GLEW_GET_FUN(__glewDrawCommandsNV) +#define glDrawCommandsStatesAddressNV GLEW_GET_FUN(__glewDrawCommandsStatesAddressNV) +#define glDrawCommandsStatesNV GLEW_GET_FUN(__glewDrawCommandsStatesNV) +#define glGetCommandHeaderNV GLEW_GET_FUN(__glewGetCommandHeaderNV) +#define glGetStageIndexNV GLEW_GET_FUN(__glewGetStageIndexNV) +#define glIsCommandListNV GLEW_GET_FUN(__glewIsCommandListNV) +#define glIsStateNV GLEW_GET_FUN(__glewIsStateNV) +#define glListDrawCommandsStatesClientNV GLEW_GET_FUN(__glewListDrawCommandsStatesClientNV) +#define glStateCaptureNV GLEW_GET_FUN(__glewStateCaptureNV) + +#define GLEW_NV_command_list GLEW_GET_VAR(__GLEW_NV_command_list) + +#endif /* GL_NV_command_list */ + +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 + +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + +/* ------------------------ GL_NV_conditional_render ----------------------- */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 + +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); + +#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) +#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) + +#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) + +#endif /* GL_NV_conditional_render */ + +/* ----------------------- GL_NV_conservative_raster ----------------------- */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 + +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 + +typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); + +#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) + +#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) + +#endif /* GL_NV_conservative_raster */ + +/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 + +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); + +#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) + +#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) + +#endif /* GL_NV_conservative_raster_dilate */ + +/* -------------- GL_NV_conservative_raster_pre_snap_triangles ------------- */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 + +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); + +#define glConservativeRasterParameteriNV GLEW_GET_FUN(__glewConservativeRasterParameteriNV) + +#define GLEW_NV_conservative_raster_pre_snap_triangles GLEW_GET_VAR(__GLEW_NV_conservative_raster_pre_snap_triangles) + +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +/* --------------------------- GL_NV_copy_buffer --------------------------- */ + +#ifndef GL_NV_copy_buffer +#define GL_NV_copy_buffer 1 + +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubDataNV GLEW_GET_FUN(__glewCopyBufferSubDataNV) + +#define GLEW_NV_copy_buffer GLEW_GET_VAR(__GLEW_NV_copy_buffer) + +#endif /* GL_NV_copy_buffer */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ---------------------------- GL_NV_copy_image --------------------------- */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) + +#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) + +#endif /* GL_NV_copy_image */ + +/* -------------------------- GL_NV_deep_texture3D ------------------------- */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 + +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* --------------------------- GL_NV_draw_buffers -------------------------- */ + +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersNV GLEW_GET_FUN(__glewDrawBuffersNV) + +#define GLEW_NV_draw_buffers GLEW_GET_VAR(__GLEW_NV_draw_buffers) + +#endif /* GL_NV_draw_buffers */ + +/* -------------------------- GL_NV_draw_instanced ------------------------- */ + +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedNV GLEW_GET_FUN(__glewDrawArraysInstancedNV) +#define glDrawElementsInstancedNV GLEW_GET_FUN(__glewDrawElementsInstancedNV) + +#define GLEW_NV_draw_instanced GLEW_GET_VAR(__GLEW_NV_draw_instanced) + +#endif /* GL_NV_draw_instanced */ + +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + +/* ------------------------ GL_NV_draw_vulkan_image ------------------------ */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 + +typedef void (APIENTRY *GLVULKANPROCNV)(void); + +typedef void (GLAPIENTRY * PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (GLAPIENTRY * PFNGLGETVKPROCADDRNVPROC) (const GLchar* name); +typedef void (GLAPIENTRY * PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +typedef void (GLAPIENTRY * PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GLAPIENTRY * PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); + +#define glDrawVkImageNV GLEW_GET_FUN(__glewDrawVkImageNV) +#define glGetVkProcAddrNV GLEW_GET_FUN(__glewGetVkProcAddrNV) +#define glSignalVkFenceNV GLEW_GET_FUN(__glewSignalVkFenceNV) +#define glSignalVkSemaphoreNV GLEW_GET_FUN(__glewSignalVkSemaphoreNV) +#define glWaitVkSemaphoreNV GLEW_GET_FUN(__glewWaitVkSemaphoreNV) + +#define GLEW_NV_draw_vulkan_image GLEW_GET_VAR(__GLEW_NV_draw_vulkan_image) + +#endif /* GL_NV_draw_vulkan_image */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* --------------------- GL_NV_explicit_attrib_location -------------------- */ + +#ifndef GL_NV_explicit_attrib_location +#define GL_NV_explicit_attrib_location 1 + +#define GLEW_NV_explicit_attrib_location GLEW_GET_VAR(__GLEW_NV_explicit_attrib_location) + +#endif /* GL_NV_explicit_attrib_location */ + +/* ----------------------- GL_NV_explicit_multisample ---------------------- */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 + +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); + +#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) +#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) +#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) + +#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) + +#endif /* GL_NV_explicit_multisample */ + +/* ---------------------- GL_NV_fbo_color_attachments ---------------------- */ + +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 + +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF + +#define GLEW_NV_fbo_color_attachments GLEW_GET_VAR(__GLEW_NV_fbo_color_attachments) + +#endif /* GL_NV_fbo_color_attachments */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* -------------------------- GL_NV_fill_rectangle ------------------------- */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 + +#define GL_FILL_RECTANGLE_NV 0x933C + +#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) + +#endif /* GL_NV_fill_rectangle */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 + +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); + +#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) + +#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) + +#endif /* GL_NV_fragment_coverage_to_color */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 + +#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) + +#endif /* GL_NV_fragment_shader_interlock */ + +/* ------------------------- GL_NV_framebuffer_blit ------------------------ */ + +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferNV GLEW_GET_FUN(__glewBlitFramebufferNV) + +#define GLEW_NV_framebuffer_blit GLEW_GET_VAR(__GLEW_NV_framebuffer_blit) + +#endif /* GL_NV_framebuffer_blit */ + +/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) + +#endif /* GL_NV_framebuffer_mixed_samples */ + +/* --------------------- GL_NV_framebuffer_multisample --------------------- */ + +#ifndef GL_NV_framebuffer_multisample +#define GL_NV_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleNV) + +#define GLEW_NV_framebuffer_multisample GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample) + +#endif /* GL_NV_framebuffer_multisample */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ----------------------- GL_NV_generate_mipmap_sRGB ---------------------- */ + +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 + +#define GLEW_NV_generate_mipmap_sRGB GLEW_GET_VAR(__GLEW_NV_generate_mipmap_sRGB) + +#endif /* GL_NV_generate_mipmap_sRGB */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 + +#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) + +#endif /* GL_NV_geometry_shader_passthrough */ + +/* -------------------------- GL_NV_gpu_multicast -------------------------- */ + +#ifndef GL_NV_gpu_multicast +#define GL_NV_gpu_multicast 1 + +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +#define GL_RENDER_GPU_MASK_NV 0x9558 + +typedef void (GLAPIENTRY * PFNGLMULTICASTBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAPIENTRY * PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAPIENTRY * PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (GLAPIENTRY * PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); + +#define glMulticastBarrierNV GLEW_GET_FUN(__glewMulticastBarrierNV) +#define glMulticastBlitFramebufferNV GLEW_GET_FUN(__glewMulticastBlitFramebufferNV) +#define glMulticastBufferSubDataNV GLEW_GET_FUN(__glewMulticastBufferSubDataNV) +#define glMulticastCopyBufferSubDataNV GLEW_GET_FUN(__glewMulticastCopyBufferSubDataNV) +#define glMulticastCopyImageSubDataNV GLEW_GET_FUN(__glewMulticastCopyImageSubDataNV) +#define glMulticastFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewMulticastFramebufferSampleLocationsfvNV) +#define glMulticastGetQueryObjecti64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjecti64vNV) +#define glMulticastGetQueryObjectivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectivNV) +#define glMulticastGetQueryObjectui64vNV GLEW_GET_FUN(__glewMulticastGetQueryObjectui64vNV) +#define glMulticastGetQueryObjectuivNV GLEW_GET_FUN(__glewMulticastGetQueryObjectuivNV) +#define glMulticastWaitSyncNV GLEW_GET_FUN(__glewMulticastWaitSyncNV) +#define glRenderGpuMaskNV GLEW_GET_FUN(__glewRenderGpuMaskNV) + +#define GLEW_NV_gpu_multicast GLEW_GET_VAR(__GLEW_NV_gpu_multicast) + +#endif /* GL_NV_gpu_multicast */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* --------------------------- GL_NV_gpu_program5 -------------------------- */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 + +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F + +#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) + +#endif /* GL_NV_gpu_program5 */ + +/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + +/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ + +#ifndef GL_NV_gpu_program_fp64 +#define GL_NV_gpu_program_fp64 1 + +#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) + +#endif /* GL_NV_gpu_program_fp64 */ + +/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) +#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) +#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) +#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) +#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) +#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) +#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) +#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) +#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) +#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) +#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) +#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) +#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) +#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) +#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) +#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) +#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) +#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) +#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) +#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) +#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) +#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) +#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) +#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) +#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) +#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) +#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) +#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) +#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) +#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) +#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) +#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) +#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) +#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) + +#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) + +#endif /* GL_NV_gpu_shader5 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* -------------------------- GL_NV_image_formats -------------------------- */ + +#ifndef GL_NV_image_formats +#define GL_NV_image_formats 1 + +#define GLEW_NV_image_formats GLEW_GET_VAR(__GLEW_NV_image_formats) + +#endif /* GL_NV_image_formats */ + +/* ------------------------- GL_NV_instanced_arrays ------------------------ */ + +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorNV GLEW_GET_FUN(__glewVertexAttribDivisorNV) + +#define GLEW_NV_instanced_arrays GLEW_GET_VAR(__GLEW_NV_instanced_arrays) + +#endif /* GL_NV_instanced_arrays */ + +/* ------------------- GL_NV_internalformat_sample_query ------------------- */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 + +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) + +#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) + +#endif /* GL_NV_internalformat_sample_query */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* ----------------------- GL_NV_multisample_coverage ---------------------- */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 + +#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) + +#endif /* GL_NV_multisample_coverage */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ----------------------- GL_NV_non_square_matrices ----------------------- */ + +#ifndef GL_NV_non_square_matrices +#define GL_NV_non_square_matrices 1 + +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + +#define glUniformMatrix2x3fvNV GLEW_GET_FUN(__glewUniformMatrix2x3fvNV) +#define glUniformMatrix2x4fvNV GLEW_GET_FUN(__glewUniformMatrix2x4fvNV) +#define glUniformMatrix3x2fvNV GLEW_GET_FUN(__glewUniformMatrix3x2fvNV) +#define glUniformMatrix3x4fvNV GLEW_GET_FUN(__glewUniformMatrix3x4fvNV) +#define glUniformMatrix4x2fvNV GLEW_GET_FUN(__glewUniformMatrix4x2fvNV) +#define glUniformMatrix4x3fvNV GLEW_GET_FUN(__glewUniformMatrix4x3fvNV) + +#define GLEW_NV_non_square_matrices GLEW_GET_VAR(__GLEW_NV_non_square_matrices) + +#endif /* GL_NV_non_square_matrices */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* -------------------------- GL_NV_pack_subimage -------------------------- */ + +#ifndef GL_NV_pack_subimage +#define GL_NV_pack_subimage 1 + +#define GL_PACK_ROW_LENGTH_NV 0x0D02 +#define GL_PACK_SKIP_ROWS_NV 0x0D03 +#define GL_PACK_SKIP_PIXELS_NV 0x0D04 + +#define GLEW_NV_pack_subimage GLEW_GET_VAR(__GLEW_NV_pack_subimage) + +#endif /* GL_NV_pack_subimage */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------------- GL_NV_packed_float -------------------------- */ + +#ifndef GL_NV_packed_float +#define GL_NV_packed_float 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float GLEW_GET_VAR(__GLEW_NV_packed_float) + +#endif /* GL_NV_packed_float */ + +/* ----------------------- GL_NV_packed_float_linear ----------------------- */ + +#ifndef GL_NV_packed_float_linear +#define GL_NV_packed_float_linear 1 + +#define GL_R11F_G11F_B10F_NV 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_NV 0x8C3B + +#define GLEW_NV_packed_float_linear GLEW_GET_VAR(__GLEW_NV_packed_float_linear) + +#endif /* GL_NV_packed_float_linear */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 + +#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) + +#endif /* GL_NV_parameter_buffer_object2 */ + +/* -------------------------- GL_NV_path_rendering ------------------------- */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 + +#define GL_CLOSE_PATH_NV 0x00 +#define GL_BOLD_BIT_NV 0x01 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_PATH_STROKE_BOUND_NV 0x9086 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_FRAGMENT_INPUT_NV 0x936D +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 + +typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); +typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); +typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); +typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); +typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); +typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); +typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); + +#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) +#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) +#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) +#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) +#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) +#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) +#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) +#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) +#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) +#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) +#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) +#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) +#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) +#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) +#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) +#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) +#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) +#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) +#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) +#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) +#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) +#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) +#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) +#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) +#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) +#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) +#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) +#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) +#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) +#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) +#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) +#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) +#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) +#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) +#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) +#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) +#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) +#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) +#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) +#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) +#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) +#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) +#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) +#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) +#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) +#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) +#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) +#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) +#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) +#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) +#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) +#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) +#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) +#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) +#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) +#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) +#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) +#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) +#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) +#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) +#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) +#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) +#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) +#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) + +#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) + +#endif /* GL_NV_path_rendering */ + +/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 + +#define GL_SHARED_EDGE_NV 0xC0 + +#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) + +#endif /* GL_NV_path_rendering_shared_edge */ + +/* ----------------------- GL_NV_pixel_buffer_object ----------------------- */ + +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF + +#define GLEW_NV_pixel_buffer_object GLEW_GET_VAR(__GLEW_NV_pixel_buffer_object) + +#endif /* GL_NV_pixel_buffer_object */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* ------------------------- GL_NV_platform_binary ------------------------- */ + +#ifndef GL_NV_platform_binary +#define GL_NV_platform_binary 1 + +#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B + +#define GLEW_NV_platform_binary GLEW_GET_VAR(__GLEW_NV_platform_binary) + +#endif /* GL_NV_platform_binary */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* --------------------------- GL_NV_polygon_mode -------------------------- */ + +#ifndef GL_NV_polygon_mode +#define GL_NV_polygon_mode 1 + +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 + +typedef void (GLAPIENTRY * PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); + +#define glPolygonModeNV GLEW_GET_FUN(__glewPolygonModeNV) + +#define GLEW_NV_polygon_mode GLEW_GET_VAR(__GLEW_NV_polygon_mode) + +#endif /* GL_NV_polygon_mode */ + +/* -------------------------- GL_NV_present_video -------------------------- */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 + +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B + +typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); + +#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) +#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) +#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) +#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) +#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) +#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) + +#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) + +#endif /* GL_NV_present_video */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ---------------------------- GL_NV_read_depth --------------------------- */ + +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 + +#define GLEW_NV_read_depth GLEW_GET_VAR(__GLEW_NV_read_depth) + +#endif /* GL_NV_read_depth */ + +/* ------------------------ GL_NV_read_depth_stencil ----------------------- */ + +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 + +#define GLEW_NV_read_depth_stencil GLEW_GET_VAR(__GLEW_NV_read_depth_stencil) + +#endif /* GL_NV_read_depth_stencil */ + +/* --------------------------- GL_NV_read_stencil -------------------------- */ + +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 + +#define GLEW_NV_read_stencil GLEW_GET_VAR(__GLEW_NV_read_stencil) + +#endif /* GL_NV_read_stencil */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* ------------------ GL_NV_robustness_video_memory_purge ------------------ */ + +#ifndef GL_NV_robustness_video_memory_purge +#define GL_NV_robustness_video_memory_purge 1 + +#define GL_EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB + +#define GLEW_NV_robustness_video_memory_purge GLEW_GET_VAR(__GLEW_NV_robustness_video_memory_purge) + +#endif /* GL_NV_robustness_video_memory_purge */ + +/* --------------------------- GL_NV_sRGB_formats -------------------------- */ + +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 + +#define GL_ETC1_SRGB8_NV 0x88EE +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F + +#define GLEW_NV_sRGB_formats GLEW_GET_VAR(__GLEW_NV_sRGB_formats) + +#endif /* GL_NV_sRGB_formats */ + +/* ------------------------- GL_NV_sample_locations ------------------------ */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 + +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) +#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) + +#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) + +#endif /* GL_NV_sample_locations */ + +/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 + +#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) + +#endif /* GL_NV_sample_mask_override_coverage */ + +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + +/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 + +#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) + +#endif /* GL_NV_shader_atomic_float */ + +/* ---------------------- GL_NV_shader_atomic_float64 ---------------------- */ + +#ifndef GL_NV_shader_atomic_float64 +#define GL_NV_shader_atomic_float64 1 + +#define GLEW_NV_shader_atomic_float64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_float64) + +#endif /* GL_NV_shader_atomic_float64 */ + +/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 + +#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) + +#endif /* GL_NV_shader_atomic_fp16_vector */ + +/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 + +#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) + +#endif /* GL_NV_shader_atomic_int64 */ + +/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 + +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 + +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) +#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) +#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) +#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) +#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) +#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) +#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) +#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) +#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) +#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) +#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) +#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) +#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) + +#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) + +#endif /* GL_NV_shader_buffer_load */ + +/* ---------------- GL_NV_shader_noperspective_interpolation --------------- */ + +#ifndef GL_NV_shader_noperspective_interpolation +#define GL_NV_shader_noperspective_interpolation 1 + +#define GLEW_NV_shader_noperspective_interpolation GLEW_GET_VAR(__GLEW_NV_shader_noperspective_interpolation) + +#endif /* GL_NV_shader_noperspective_interpolation */ + +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + +/* ----------------------- GL_NV_shader_thread_group ----------------------- */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 + +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B + +#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) + +#endif /* GL_NV_shader_thread_group */ + +/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 + +#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) + +#endif /* GL_NV_shader_thread_shuffle */ + +/* ---------------------- GL_NV_shadow_samplers_array ---------------------- */ + +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 + +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 + +#define GLEW_NV_shadow_samplers_array GLEW_GET_VAR(__GLEW_NV_shadow_samplers_array) + +#endif /* GL_NV_shadow_samplers_array */ + +/* ----------------------- GL_NV_shadow_samplers_cube ---------------------- */ + +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 + +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 + +#define GLEW_NV_shadow_samplers_cube GLEW_GET_VAR(__GLEW_NV_shadow_samplers_cube) + +#endif /* GL_NV_shadow_samplers_cube */ + +/* ---------------------- GL_NV_stereo_view_rendering ---------------------- */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 + +#define GLEW_NV_stereo_view_rendering GLEW_GET_VAR(__GLEW_NV_stereo_view_rendering) + +#endif /* GL_NV_stereo_view_rendering */ + +/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 + +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 + +#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) + +#endif /* GL_NV_tessellation_program5 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* -------------------------- GL_NV_texture_array -------------------------- */ + +#ifndef GL_NV_texture_array +#define GL_NV_texture_array 1 + +#define GL_UNPACK_SKIP_IMAGES_NV 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_NV 0x806E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_NV 0x88FF +#define GL_TEXTURE_2D_ARRAY_NV 0x8C1A +#define GL_TEXTURE_BINDING_2D_ARRAY_NV 0x8C1D +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_NV 0x8CD4 +#define GL_SAMPLER_2D_ARRAY_NV 0x8DC1 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC) (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 (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERNVPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DNVPROC) (GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DNVPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCompressedTexImage3DNV GLEW_GET_FUN(__glewCompressedTexImage3DNV) +#define glCompressedTexSubImage3DNV GLEW_GET_FUN(__glewCompressedTexSubImage3DNV) +#define glCopyTexSubImage3DNV GLEW_GET_FUN(__glewCopyTexSubImage3DNV) +#define glFramebufferTextureLayerNV GLEW_GET_FUN(__glewFramebufferTextureLayerNV) +#define glTexImage3DNV GLEW_GET_FUN(__glewTexImage3DNV) +#define glTexSubImage3DNV GLEW_GET_FUN(__glewTexSubImage3DNV) + +#define GLEW_NV_texture_array GLEW_GET_VAR(__GLEW_NV_texture_array) + +#endif /* GL_NV_texture_array */ + +/* ------------------------- GL_NV_texture_barrier ------------------------- */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); + +#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) + +#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) + +#endif /* GL_NV_texture_barrier */ + +/* ----------------------- GL_NV_texture_border_clamp ---------------------- */ + +#ifndef GL_NV_texture_border_clamp +#define GL_NV_texture_border_clamp 1 + +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D + +#define GLEW_NV_texture_border_clamp GLEW_GET_VAR(__GLEW_NV_texture_border_clamp) + +#endif /* GL_NV_texture_border_clamp */ + +/* --------------------- GL_NV_texture_compression_latc -------------------- */ + +#ifndef GL_NV_texture_compression_latc +#define GL_NV_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_NV 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_NV 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_NV 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_NV 0x8C73 + +#define GLEW_NV_texture_compression_latc GLEW_GET_VAR(__GLEW_NV_texture_compression_latc) + +#endif /* GL_NV_texture_compression_latc */ + +/* --------------------- GL_NV_texture_compression_s3tc -------------------- */ + +#ifndef GL_NV_texture_compression_s3tc +#define GL_NV_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_NV 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_NV 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_NV 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_NV 0x83F3 + +#define GLEW_NV_texture_compression_s3tc GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc) + +#endif /* GL_NV_texture_compression_s3tc */ + +/* ----------------- GL_NV_texture_compression_s3tc_update ----------------- */ + +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 + +#define GLEW_NV_texture_compression_s3tc_update GLEW_GET_VAR(__GLEW_NV_texture_compression_s3tc_update) + +#endif /* GL_NV_texture_compression_s3tc_update */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ----------------------- GL_NV_texture_multisample ----------------------- */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 + +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + +#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) +#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) +#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) +#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) +#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) +#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) + +#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) + +#endif /* GL_NV_texture_multisample */ + +/* ---------------------- GL_NV_texture_npot_2D_mipmap --------------------- */ + +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 + +#define GLEW_NV_texture_npot_2D_mipmap GLEW_GET_VAR(__GLEW_NV_texture_npot_2D_mipmap) + +#endif /* GL_NV_texture_npot_2D_mipmap */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* ------------------- GL_NV_texture_rectangle_compressed ------------------ */ + +#ifndef GL_NV_texture_rectangle_compressed +#define GL_NV_texture_rectangle_compressed 1 + +#define GLEW_NV_texture_rectangle_compressed GLEW_GET_VAR(__GLEW_NV_texture_rectangle_compressed) + +#endif /* GL_NV_texture_rectangle_compressed */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); + +#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) +#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) +#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) +#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) +#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) +#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) +#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) + +#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) + +#endif /* GL_NV_transform_feedback2 */ + +/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 + +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 + +#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) + +#endif /* GL_NV_uniform_buffer_unified_memory */ + +/* -------------------------- GL_NV_vdpau_interop -------------------------- */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 + +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE + +typedef GLintptr GLvdpauSurfaceNV; + +typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); +typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); +typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); + +#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) +#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) +#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) +#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) +#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) +#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) +#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) +#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) +#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) +#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) + +#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) + +#endif /* GL_NV_vdpau_interop */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); + +#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) +#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) +#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) +#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) +#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) +#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) +#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) +#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) +#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) +#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) +#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) +#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) +#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) +#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) +#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) +#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) +#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) +#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) +#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) + +#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 + +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 + +typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); +typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); + +#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) +#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) +#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) +#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) +#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) +#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) +#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) +#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) +#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) +#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) +#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) +#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) + +#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* -------------------------- GL_NV_video_capture -------------------------- */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 + +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C + +typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); + +#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) +#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) +#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) +#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) +#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) +#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) +#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) +#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) +#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) +#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) +#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) +#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) + +#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) + +#endif /* GL_NV_video_capture */ + +/* -------------------------- GL_NV_viewport_array ------------------------- */ + +#ifndef GL_NV_viewport_array +#define GL_NV_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLDISABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayfvNV GLEW_GET_FUN(__glewDepthRangeArrayfvNV) +#define glDepthRangeIndexedfNV GLEW_GET_FUN(__glewDepthRangeIndexedfNV) +#define glDisableiNV GLEW_GET_FUN(__glewDisableiNV) +#define glEnableiNV GLEW_GET_FUN(__glewEnableiNV) +#define glGetFloati_vNV GLEW_GET_FUN(__glewGetFloati_vNV) +#define glIsEnablediNV GLEW_GET_FUN(__glewIsEnablediNV) +#define glScissorArrayvNV GLEW_GET_FUN(__glewScissorArrayvNV) +#define glScissorIndexedNV GLEW_GET_FUN(__glewScissorIndexedNV) +#define glScissorIndexedvNV GLEW_GET_FUN(__glewScissorIndexedvNV) +#define glViewportArrayvNV GLEW_GET_FUN(__glewViewportArrayvNV) +#define glViewportIndexedfNV GLEW_GET_FUN(__glewViewportIndexedfNV) +#define glViewportIndexedfvNV GLEW_GET_FUN(__glewViewportIndexedfvNV) + +#define GLEW_NV_viewport_array GLEW_GET_VAR(__GLEW_NV_viewport_array) + +#endif /* GL_NV_viewport_array */ + +/* ------------------------- GL_NV_viewport_array2 ------------------------- */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 + +#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) + +#endif /* GL_NV_viewport_array2 */ + +/* ------------------------- GL_NV_viewport_swizzle ------------------------ */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 + +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B + +typedef void (GLAPIENTRY * PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); + +#define glViewportSwizzleNV GLEW_GET_FUN(__glewViewportSwizzleNV) + +#define GLEW_NV_viewport_swizzle GLEW_GET_VAR(__GLEW_NV_viewport_swizzle) + +#endif /* GL_NV_viewport_swizzle */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* ---------------------------- GL_OVR_multiview --------------------------- */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) + +#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) + +#endif /* GL_OVR_multiview */ + +/* --------------------------- GL_OVR_multiview2 --------------------------- */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 + +#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) + +#endif /* GL_OVR_multiview2 */ + +/* ------------ GL_OVR_multiview_multisampled_render_to_texture ------------ */ + +#ifndef GL_OVR_multiview_multisampled_render_to_texture +#define GL_OVR_multiview_multisampled_render_to_texture 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultisampleMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultisampleMultiviewOVR) + +#define GLEW_OVR_multiview_multisampled_render_to_texture GLEW_GET_VAR(__GLEW_OVR_multiview_multisampled_render_to_texture) + +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* --------------------------- GL_QCOM_alpha_test -------------------------- */ + +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 + +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); + +#define glAlphaFuncQCOM GLEW_GET_FUN(__glewAlphaFuncQCOM) + +#define GLEW_QCOM_alpha_test GLEW_GET_VAR(__GLEW_QCOM_alpha_test) + +#endif /* GL_QCOM_alpha_test */ + +/* ------------------------ GL_QCOM_binning_control ------------------------ */ + +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 + +#define GL_DONT_CARE 0x1100 +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 + +#define GLEW_QCOM_binning_control GLEW_GET_VAR(__GLEW_QCOM_binning_control) + +#endif /* GL_QCOM_binning_control */ + +/* ------------------------- GL_QCOM_driver_control ------------------------ */ + +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 + +typedef void (GLAPIENTRY * PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar *driverControlString); +typedef void (GLAPIENTRY * PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint* num, GLsizei size, GLuint *driverControls); + +#define glDisableDriverControlQCOM GLEW_GET_FUN(__glewDisableDriverControlQCOM) +#define glEnableDriverControlQCOM GLEW_GET_FUN(__glewEnableDriverControlQCOM) +#define glGetDriverControlStringQCOM GLEW_GET_FUN(__glewGetDriverControlStringQCOM) +#define glGetDriverControlsQCOM GLEW_GET_FUN(__glewGetDriverControlsQCOM) + +#define GLEW_QCOM_driver_control GLEW_GET_VAR(__GLEW_QCOM_driver_control) + +#endif /* GL_QCOM_driver_control */ + +/* -------------------------- GL_QCOM_extended_get ------------------------- */ + +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 + +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC + +typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void** params); +typedef void (GLAPIENTRY * PFNGLEXTGETBUFFERSQCOMPROC) (GLuint* buffers, GLint maxBuffers, GLint* numBuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +typedef void (GLAPIENTRY * PFNGLEXTGETTEXTURESQCOMPROC) (GLuint* textures, GLint maxTextures, GLint* numTextures); +typedef void (GLAPIENTRY * PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); + +#define glExtGetBufferPointervQCOM GLEW_GET_FUN(__glewExtGetBufferPointervQCOM) +#define glExtGetBuffersQCOM GLEW_GET_FUN(__glewExtGetBuffersQCOM) +#define glExtGetFramebuffersQCOM GLEW_GET_FUN(__glewExtGetFramebuffersQCOM) +#define glExtGetRenderbuffersQCOM GLEW_GET_FUN(__glewExtGetRenderbuffersQCOM) +#define glExtGetTexLevelParameterivQCOM GLEW_GET_FUN(__glewExtGetTexLevelParameterivQCOM) +#define glExtGetTexSubImageQCOM GLEW_GET_FUN(__glewExtGetTexSubImageQCOM) +#define glExtGetTexturesQCOM GLEW_GET_FUN(__glewExtGetTexturesQCOM) +#define glExtTexObjectStateOverrideiQCOM GLEW_GET_FUN(__glewExtTexObjectStateOverrideiQCOM) + +#define GLEW_QCOM_extended_get GLEW_GET_VAR(__GLEW_QCOM_extended_get) + +#endif /* GL_QCOM_extended_get */ + +/* ------------------------- GL_QCOM_extended_get2 ------------------------- */ + +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 + +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar* source, GLint* length); +typedef void (GLAPIENTRY * PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint* programs, GLint maxPrograms, GLint* numPrograms); +typedef void (GLAPIENTRY * PFNGLEXTGETSHADERSQCOMPROC) (GLuint* shaders, GLint maxShaders, GLint* numShaders); +typedef GLboolean (GLAPIENTRY * PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); + +#define glExtGetProgramBinarySourceQCOM GLEW_GET_FUN(__glewExtGetProgramBinarySourceQCOM) +#define glExtGetProgramsQCOM GLEW_GET_FUN(__glewExtGetProgramsQCOM) +#define glExtGetShadersQCOM GLEW_GET_FUN(__glewExtGetShadersQCOM) +#define glExtIsProgramBinaryQCOM GLEW_GET_FUN(__glewExtIsProgramBinaryQCOM) + +#define GLEW_QCOM_extended_get2 GLEW_GET_VAR(__GLEW_QCOM_extended_get2) + +#endif /* GL_QCOM_extended_get2 */ + +/* ---------------------- GL_QCOM_framebuffer_foveated --------------------- */ + +#ifndef GL_QCOM_framebuffer_foveated +#define GL_QCOM_framebuffer_foveated 1 + +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x1 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint fbo, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint* providedFeatures); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint fbo, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); + +#define glFramebufferFoveationConfigQCOM GLEW_GET_FUN(__glewFramebufferFoveationConfigQCOM) +#define glFramebufferFoveationParametersQCOM GLEW_GET_FUN(__glewFramebufferFoveationParametersQCOM) + +#define GLEW_QCOM_framebuffer_foveated GLEW_GET_VAR(__GLEW_QCOM_framebuffer_foveated) + +#endif /* GL_QCOM_framebuffer_foveated */ + +/* ---------------------- GL_QCOM_perfmon_global_mode ---------------------- */ + +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 + +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 + +#define GLEW_QCOM_perfmon_global_mode GLEW_GET_VAR(__GLEW_QCOM_perfmon_global_mode) + +#endif /* GL_QCOM_perfmon_global_mode */ + +/* -------------- GL_QCOM_shader_framebuffer_fetch_noncoherent ------------- */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 + +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); + +#define glFramebufferFetchBarrierQCOM GLEW_GET_FUN(__glewFramebufferFetchBarrierQCOM) + +#define GLEW_QCOM_shader_framebuffer_fetch_noncoherent GLEW_GET_VAR(__GLEW_QCOM_shader_framebuffer_fetch_noncoherent) + +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +/* ------------------------ GL_QCOM_tiled_rendering ------------------------ */ + +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 + +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 + +typedef void (GLAPIENTRY * PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +typedef void (GLAPIENTRY * PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); + +#define glEndTilingQCOM GLEW_GET_FUN(__glewEndTilingQCOM) +#define glStartTilingQCOM GLEW_GET_FUN(__glewStartTilingQCOM) + +#define GLEW_QCOM_tiled_rendering GLEW_GET_VAR(__GLEW_QCOM_tiled_rendering) + +#endif /* GL_QCOM_tiled_rendering */ + +/* ---------------------- GL_QCOM_writeonly_rendering ---------------------- */ + +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 + +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 + +#define GLEW_QCOM_writeonly_rendering GLEW_GET_VAR(__GLEW_QCOM_writeonly_rendering) + +#endif /* GL_QCOM_writeonly_rendering */ + +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + +/* ------------------------- GL_REGAL_error_string ------------------------- */ + +#ifndef GL_REGAL_error_string +#define GL_REGAL_error_string 1 + +typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); + +#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) + +#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) + +#endif /* GL_REGAL_error_string */ + +/* ------------------------ GL_REGAL_extension_query ----------------------- */ + +#ifndef GL_REGAL_extension_query +#define GL_REGAL_extension_query 1 + +typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); +typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); + +#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) +#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) + +#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) + +#endif /* GL_REGAL_extension_query */ + +/* ------------------------------ GL_REGAL_log ----------------------------- */ + +#ifndef GL_REGAL_log +#define GL_REGAL_log 1 + +#define GL_LOG_ERROR_REGAL 0x9319 +#define GL_LOG_WARNING_REGAL 0x931A +#define GL_LOG_INFO_REGAL 0x931B +#define GL_LOG_APP_REGAL 0x931C +#define GL_LOG_DRIVER_REGAL 0x931D +#define GL_LOG_INTERNAL_REGAL 0x931E +#define GL_LOG_DEBUG_REGAL 0x931F +#define GL_LOG_STATUS_REGAL 0x9320 +#define GL_LOG_HTTP_REGAL 0x9321 + +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + +#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) + +#endif /* GL_REGAL_log */ + +/* ------------------------- GL_REGAL_proc_address ------------------------- */ + +#ifndef GL_REGAL_proc_address +#define GL_REGAL_proc_address 1 + +typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); + +#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) + +#endif /* GL_REGAL_proc_address */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* ------------------------- GL_SGIS_clip_band_hint ------------------------ */ + +#ifndef GL_SGIS_clip_band_hint +#define GL_SGIS_clip_band_hint 1 + +#define GLEW_SGIS_clip_band_hint GLEW_GET_VAR(__GLEW_SGIS_clip_band_hint) + +#endif /* GL_SGIS_clip_band_hint */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_line_texgen -------------------------- */ + +#ifndef GL_SGIS_line_texgen +#define GL_SGIS_line_texgen 1 + +#define GLEW_SGIS_line_texgen GLEW_GET_VAR(__GLEW_SGIS_line_texgen) + +#endif /* GL_SGIS_line_texgen */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* -------------------------- GL_SGIS_multitexture ------------------------- */ + +#ifndef GL_SGIS_multitexture +#define GL_SGIS_multitexture 1 + +#define GL_SELECTED_TEXTURE_SGIS 0x83C0 +#define GL_SELECTED_TEXTURE_COORD_SET_SGIS 0x83C1 +#define GL_SELECTED_TEXTURE_TRANSFORM_SGIS 0x83C2 +#define GL_MAX_TEXTURES_SGIS 0x83C3 +#define GL_MAX_TEXTURE_COORD_SETS_SGIS 0x83C4 +#define GL_TEXTURE_COORD_SET_INTERLEAVE_FACTOR_SGIS 0x83C5 +#define GL_TEXTURE_ENV_COORD_SET_SGIS 0x83C6 +#define GL_TEXTURE0_SGIS 0x83C7 +#define GL_TEXTURE1_SGIS 0x83C8 +#define GL_TEXTURE2_SGIS 0x83C9 +#define GL_TEXTURE3_SGIS 0x83CA + +typedef void (GLAPIENTRY * PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURECOORDSETSGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURESGISPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSELECTTEXTURETRANSFORMSGISPROC) (GLenum target); + +#define glInterleavedTextureCoordSetsSGIS GLEW_GET_FUN(__glewInterleavedTextureCoordSetsSGIS) +#define glSelectTextureCoordSetSGIS GLEW_GET_FUN(__glewSelectTextureCoordSetSGIS) +#define glSelectTextureSGIS GLEW_GET_FUN(__glewSelectTextureSGIS) +#define glSelectTextureTransformSGIS GLEW_GET_FUN(__glewSelectTextureTransformSGIS) + +#define GLEW_SGIS_multitexture GLEW_GET_VAR(__GLEW_SGIS_multitexture) + +#endif /* GL_SGIS_multitexture */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 + +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 + +#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) + +#endif /* GL_SGIS_point_line_texgen */ + +/* ----------------------- GL_SGIS_shared_multisample ---------------------- */ + +#ifndef GL_SGIS_shared_multisample +#define GL_SGIS_shared_multisample 1 + +typedef void (GLAPIENTRY * PFNGLMULTISAMPLESUBRECTPOSSGISPROC) (GLint x, GLint y); + +#define glMultisampleSubRectPosSGIS GLEW_GET_FUN(__glewMultisampleSubRectPosSGIS) + +#define GLEW_SGIS_shared_multisample GLEW_GET_VAR(__GLEW_SGIS_shared_multisample) + +#endif /* GL_SGIS_shared_multisample */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_bali_g_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_g_instruments +#define GL_SGIX_bali_g_instruments 1 + +#define GL_BALI_NUM_TRIS_CULLED_INSTRUMENT 0x6080 +#define GL_BALI_NUM_PRIMS_CLIPPED_INSTRUMENT 0x6081 +#define GL_BALI_NUM_PRIMS_REJECT_INSTRUMENT 0x6082 +#define GL_BALI_NUM_PRIMS_CLIP_RESULT_INSTRUMENT 0x6083 + +#define GLEW_SGIX_bali_g_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_g_instruments) + +#endif /* GL_SGIX_bali_g_instruments */ + +/* ----------------------- GL_SGIX_bali_r_instruments ---------------------- */ + +#ifndef GL_SGIX_bali_r_instruments +#define GL_SGIX_bali_r_instruments 1 + +#define GL_BALI_FRAGMENTS_GENERATED_INSTRUMENT 0x6090 +#define GL_BALI_DEPTH_PASS_INSTRUMENT 0x6091 +#define GL_BALI_R_CHIP_COUNT 0x6092 + +#define GLEW_SGIX_bali_r_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_r_instruments) + +#endif /* GL_SGIX_bali_r_instruments */ + +/* --------------------- GL_SGIX_bali_timer_instruments -------------------- */ + +#ifndef GL_SGIX_bali_timer_instruments +#define GL_SGIX_bali_timer_instruments 1 + +#define GLEW_SGIX_bali_timer_instruments GLEW_GET_VAR(__GLEW_SGIX_bali_timer_instruments) + +#endif /* GL_SGIX_bali_timer_instruments */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* --------------------------- GL_SGIX_blend_cadd -------------------------- */ + +#ifndef GL_SGIX_blend_cadd +#define GL_SGIX_blend_cadd 1 + +#define GL_FUNC_COMPLEX_ADD_EXT 0x601C + +#define GLEW_SGIX_blend_cadd GLEW_GET_VAR(__GLEW_SGIX_blend_cadd) + +#endif /* GL_SGIX_blend_cadd */ + +/* ------------------------ GL_SGIX_blend_cmultiply ------------------------ */ + +#ifndef GL_SGIX_blend_cmultiply +#define GL_SGIX_blend_cmultiply 1 + +#define GL_FUNC_COMPLEX_MULTIPLY_EXT 0x601B + +#define GLEW_SGIX_blend_cmultiply GLEW_GET_VAR(__GLEW_SGIX_blend_cmultiply) + +#endif /* GL_SGIX_blend_cmultiply */ + +/* --------------------- GL_SGIX_calligraphic_fragment --------------------- */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 + +#define GLEW_SGIX_calligraphic_fragment GLEW_GET_VAR(__GLEW_SGIX_calligraphic_fragment) + +#endif /* GL_SGIX_calligraphic_fragment */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* --------------------- GL_SGIX_color_matrix_accuracy --------------------- */ + +#ifndef GL_SGIX_color_matrix_accuracy +#define GL_SGIX_color_matrix_accuracy 1 + +#define GL_COLOR_MATRIX_HINT 0x8317 + +#define GLEW_SGIX_color_matrix_accuracy GLEW_GET_VAR(__GLEW_SGIX_color_matrix_accuracy) + +#endif /* GL_SGIX_color_matrix_accuracy */ + +/* --------------------- GL_SGIX_color_table_index_mode -------------------- */ + +#ifndef GL_SGIX_color_table_index_mode +#define GL_SGIX_color_table_index_mode 1 + +#define GLEW_SGIX_color_table_index_mode GLEW_GET_VAR(__GLEW_SGIX_color_table_index_mode) + +#endif /* GL_SGIX_color_table_index_mode */ + +/* ------------------------- GL_SGIX_complex_polar ------------------------- */ + +#ifndef GL_SGIX_complex_polar +#define GL_SGIX_complex_polar 1 + +#define GLEW_SGIX_complex_polar GLEW_GET_VAR(__GLEW_SGIX_complex_polar) + +#endif /* GL_SGIX_complex_polar */ + +/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 + +#define GL_CONVOLUTION_HINT_SGIX 0x8316 + +#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) + +#endif /* GL_SGIX_convolution_accuracy */ + +/* ---------------------------- GL_SGIX_cube_map --------------------------- */ + +#ifndef GL_SGIX_cube_map +#define GL_SGIX_cube_map 1 + +#define GL_ENV_MAP_SGIX 0x8340 +#define GL_CUBE_MAP_SGIX 0x8341 +#define GL_CUBE_MAP_ZP_SGIX 0x8342 +#define GL_CUBE_MAP_ZN_SGIX 0x8343 +#define GL_CUBE_MAP_XN_SGIX 0x8344 +#define GL_CUBE_MAP_XP_SGIX 0x8345 +#define GL_CUBE_MAP_YN_SGIX 0x8346 +#define GL_CUBE_MAP_YP_SGIX 0x8347 +#define GL_CUBE_MAP_BINDING_SGIX 0x8348 + +#define GLEW_SGIX_cube_map GLEW_GET_VAR(__GLEW_SGIX_cube_map) + +#endif /* GL_SGIX_cube_map */ + +/* ------------------------ GL_SGIX_cylinder_texgen ------------------------ */ + +#ifndef GL_SGIX_cylinder_texgen +#define GL_SGIX_cylinder_texgen 1 + +#define GLEW_SGIX_cylinder_texgen GLEW_GET_VAR(__GLEW_SGIX_cylinder_texgen) + +#endif /* GL_SGIX_cylinder_texgen */ + +/* ---------------------------- GL_SGIX_datapipe --------------------------- */ + +#ifndef GL_SGIX_datapipe +#define GL_SGIX_datapipe 1 + +#define GL_GEOMETRY_BIT 0x1 +#define GL_IMAGE_BIT 0x2 + +typedef void (GLAPIENTRY * PFNGLADDRESSSPACEPROC) (GLenum space, GLbitfield mask); +typedef GLint (GLAPIENTRY * PFNGLDATAPIPEPROC) (GLenum space); + +#define glAddressSpace GLEW_GET_FUN(__glewAddressSpace) +#define glDataPipe GLEW_GET_FUN(__glewDataPipe) + +#define GLEW_SGIX_datapipe GLEW_GET_VAR(__GLEW_SGIX_datapipe) + +#endif /* GL_SGIX_datapipe */ + +/* --------------------------- GL_SGIX_decimation -------------------------- */ + +#ifndef GL_SGIX_decimation +#define GL_SGIX_decimation 1 + +#define GLEW_SGIX_decimation GLEW_GET_VAR(__GLEW_SGIX_decimation) + +#endif /* GL_SGIX_decimation */ + +/* --------------------- GL_SGIX_depth_pass_instrument --------------------- */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 + +#define GL_DEPTH_PASS_INSTRUMENT_SGIX 0x8310 +#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX 0x8311 +#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX 0x8312 + +#define GLEW_SGIX_depth_pass_instrument GLEW_GET_VAR(__GLEW_SGIX_depth_pass_instrument) + +#endif /* GL_SGIX_depth_pass_instrument */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* ------------------------------ GL_SGIX_dvc ------------------------------ */ + +#ifndef GL_SGIX_dvc +#define GL_SGIX_dvc 1 + +#define GLEW_SGIX_dvc GLEW_GET_VAR(__GLEW_SGIX_dvc) + +#endif /* GL_SGIX_dvc */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_blend --------------------------- */ + +#ifndef GL_SGIX_fog_blend +#define GL_SGIX_fog_blend 1 + +#define GL_FOG_BLEND_ALPHA_SGIX 0x81FE +#define GL_FOG_BLEND_COLOR_SGIX 0x81FF + +#define GLEW_SGIX_fog_blend GLEW_GET_VAR(__GLEW_SGIX_fog_blend) + +#endif /* GL_SGIX_fog_blend */ + +/* ---------------------- GL_SGIX_fog_factor_to_alpha ---------------------- */ + +#ifndef GL_SGIX_fog_factor_to_alpha +#define GL_SGIX_fog_factor_to_alpha 1 + +#define GLEW_SGIX_fog_factor_to_alpha GLEW_GET_VAR(__GLEW_SGIX_fog_factor_to_alpha) + +#endif /* GL_SGIX_fog_factor_to_alpha */ + +/* --------------------------- GL_SGIX_fog_layers -------------------------- */ + +#ifndef GL_SGIX_fog_layers +#define GL_SGIX_fog_layers 1 + +#define GL_FOG_TYPE_SGIX 0x8323 +#define GL_UNIFORM_SGIX 0x8324 +#define GL_LAYERED_SGIX 0x8325 +#define GL_FOG_GROUND_PLANE_SGIX 0x8326 +#define GL_FOG_LAYERS_POINTS_SGIX 0x8327 +#define GL_MAX_FOG_LAYERS_POINTS_SGIX 0x8328 + +typedef void (GLAPIENTRY * PFNGLFOGLAYERSSGIXPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGLAYERSSGIXPROC) (GLfloat* points); + +#define glFogLayersSGIX GLEW_GET_FUN(__glewFogLayersSGIX) +#define glGetFogLayersSGIX GLEW_GET_FUN(__glewGetFogLayersSGIX) + +#define GLEW_SGIX_fog_layers GLEW_GET_VAR(__GLEW_SGIX_fog_layers) + +#endif /* GL_SGIX_fog_layers */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* --------------------------- GL_SGIX_fog_patchy -------------------------- */ + +#ifndef GL_SGIX_fog_patchy +#define GL_SGIX_fog_patchy 1 + +#define GLEW_SGIX_fog_patchy GLEW_GET_VAR(__GLEW_SGIX_fog_patchy) + +#endif /* GL_SGIX_fog_patchy */ + +/* --------------------------- GL_SGIX_fog_scale --------------------------- */ + +#ifndef GL_SGIX_fog_scale +#define GL_SGIX_fog_scale 1 + +#define GL_FOG_SCALE_SGIX 0x81FC +#define GL_FOG_SCALE_VALUE_SGIX 0x81FD + +#define GLEW_SGIX_fog_scale GLEW_GET_VAR(__GLEW_SGIX_fog_scale) + +#endif /* GL_SGIX_fog_scale */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* -------------------- GL_SGIX_fragment_lighting_space -------------------- */ + +#ifndef GL_SGIX_fragment_lighting_space +#define GL_SGIX_fragment_lighting_space 1 + +#define GL_EYE_SPACE_SGIX 0x8436 +#define GL_TANGENT_SPACE_SGIX 0x8437 +#define GL_OBJECT_SPACE_SGIX 0x8438 +#define GL_FRAGMENT_LIGHT_SPACE_SGIX 0x843D + +#define GLEW_SGIX_fragment_lighting_space GLEW_GET_VAR(__GLEW_SGIX_fragment_lighting_space) + +#endif /* GL_SGIX_fragment_lighting_space */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* ---------------------- GL_SGIX_fragments_instrument --------------------- */ + +#ifndef GL_SGIX_fragments_instrument +#define GL_SGIX_fragments_instrument 1 + +#define GL_FRAGMENTS_INSTRUMENT_SGIX 0x8313 +#define GL_FRAGMENTS_INSTRUMENT_COUNTERS_SGIX 0x8314 +#define GL_FRAGMENTS_INSTRUMENT_MAX_SGIX 0x8315 + +#define GLEW_SGIX_fragments_instrument GLEW_GET_VAR(__GLEW_SGIX_fragments_instrument) + +#endif /* GL_SGIX_fragments_instrument */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* -------------------------- GL_SGIX_icc_texture -------------------------- */ + +#ifndef GL_SGIX_icc_texture +#define GL_SGIX_icc_texture 1 + +#define GL_RGB_ICC_SGIX 0x8460 +#define GL_RGBA_ICC_SGIX 0x8461 +#define GL_ALPHA_ICC_SGIX 0x8462 +#define GL_LUMINANCE_ICC_SGIX 0x8463 +#define GL_INTENSITY_ICC_SGIX 0x8464 +#define GL_LUMINANCE_ALPHA_ICC_SGIX 0x8465 +#define GL_R5_G6_B5_ICC_SGIX 0x8466 +#define GL_R5_G6_B5_A8_ICC_SGIX 0x8467 +#define GL_ALPHA16_ICC_SGIX 0x8468 +#define GL_LUMINANCE16_ICC_SGIX 0x8469 +#define GL_INTENSITY16_ICC_SGIX 0x846A +#define GL_LUMINANCE16_ALPHA8_ICC_SGIX 0x846B + +#define GLEW_SGIX_icc_texture GLEW_GET_VAR(__GLEW_SGIX_icc_texture) + +#endif /* GL_SGIX_icc_texture */ + +/* ------------------------ GL_SGIX_igloo_interface ------------------------ */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 + +#define GL_IGLOO_FULLSCREEN_SGIX 0x819E +#define GL_IGLOO_VIEWPORT_OFFSET_SGIX 0x819F +#define GL_IGLOO_SWAPTMESH_SGIX 0x81A0 +#define GL_IGLOO_COLORNORMAL_SGIX 0x81A1 +#define GL_IGLOO_IRISGL_MODE_SGIX 0x81A2 +#define GL_IGLOO_LMC_COLOR_SGIX 0x81A3 +#define GL_IGLOO_TMESHMODE_SGIX 0x81A4 +#define GL_LIGHT31 0xBEAD + +typedef void (GLAPIENTRY * PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, void *param); + +#define glIglooInterfaceSGIX GLEW_GET_FUN(__glewIglooInterfaceSGIX) + +#define GLEW_SGIX_igloo_interface GLEW_GET_VAR(__GLEW_SGIX_igloo_interface) + +#endif /* GL_SGIX_igloo_interface */ + +/* ----------------------- GL_SGIX_image_compression ----------------------- */ + +#ifndef GL_SGIX_image_compression +#define GL_SGIX_image_compression 1 + +#define GLEW_SGIX_image_compression GLEW_GET_VAR(__GLEW_SGIX_image_compression) + +#endif /* GL_SGIX_image_compression */ + +/* ---------------------- GL_SGIX_impact_pixel_texture --------------------- */ + +#ifndef GL_SGIX_impact_pixel_texture +#define GL_SGIX_impact_pixel_texture 1 + +#define GLEW_SGIX_impact_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_impact_pixel_texture) + +#endif /* GL_SGIX_impact_pixel_texture */ + +/* ------------------------ GL_SGIX_instrument_error ----------------------- */ + +#ifndef GL_SGIX_instrument_error +#define GL_SGIX_instrument_error 1 + +#define GLEW_SGIX_instrument_error GLEW_GET_VAR(__GLEW_SGIX_instrument_error) + +#endif /* GL_SGIX_instrument_error */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ----------------------- GL_SGIX_line_quality_hint ----------------------- */ + +#ifndef GL_SGIX_line_quality_hint +#define GL_SGIX_line_quality_hint 1 + +#define GL_LINE_QUALITY_HINT_SGIX 0x835B + +#define GLEW_SGIX_line_quality_hint GLEW_GET_VAR(__GLEW_SGIX_line_quality_hint) + +#endif /* GL_SGIX_line_quality_hint */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ----------------------------- GL_SGIX_mpeg1 ----------------------------- */ + +#ifndef GL_SGIX_mpeg1 +#define GL_SGIX_mpeg1 1 + +typedef void (GLAPIENTRY * PFNGLALLOCMPEGPREDICTORSSGIXPROC) (GLsizei width, GLsizei height, GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLDELETEMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGENMPEGPREDICTORSSGIXPROC) (GLsizei n, GLuint* predictors); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERFVSGIXPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPARAMETERIVSGIXPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef GLboolean (GLAPIENTRY * PFNGLISMPEGPREDICTORSGIXPROC) (GLuint predictor); +typedef void (GLAPIENTRY * PFNGLMPEGPREDICTORSGIXPROC) (GLenum target, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLMPEGQUANTTABLEUBVPROC) (GLenum target, GLubyte* values); +typedef void (GLAPIENTRY * PFNGLSWAPMPEGPREDICTORSSGIXPROC) (GLenum target0, GLenum target1); + +#define glAllocMPEGPredictorsSGIX GLEW_GET_FUN(__glewAllocMPEGPredictorsSGIX) +#define glDeleteMPEGPredictorsSGIX GLEW_GET_FUN(__glewDeleteMPEGPredictorsSGIX) +#define glGenMPEGPredictorsSGIX GLEW_GET_FUN(__glewGenMPEGPredictorsSGIX) +#define glGetMPEGParameterfvSGIX GLEW_GET_FUN(__glewGetMPEGParameterfvSGIX) +#define glGetMPEGParameterivSGIX GLEW_GET_FUN(__glewGetMPEGParameterivSGIX) +#define glGetMPEGPredictorSGIX GLEW_GET_FUN(__glewGetMPEGPredictorSGIX) +#define glGetMPEGQuantTableubv GLEW_GET_FUN(__glewGetMPEGQuantTableubv) +#define glIsMPEGPredictorSGIX GLEW_GET_FUN(__glewIsMPEGPredictorSGIX) +#define glMPEGPredictorSGIX GLEW_GET_FUN(__glewMPEGPredictorSGIX) +#define glMPEGQuantTableubv GLEW_GET_FUN(__glewMPEGQuantTableubv) +#define glSwapMPEGPredictorsSGIX GLEW_GET_FUN(__glewSwapMPEGPredictorsSGIX) + +#define GLEW_SGIX_mpeg1 GLEW_GET_VAR(__GLEW_SGIX_mpeg1) + +#endif /* GL_SGIX_mpeg1 */ + +/* ----------------------------- GL_SGIX_mpeg2 ----------------------------- */ + +#ifndef GL_SGIX_mpeg2 +#define GL_SGIX_mpeg2 1 + +#define GLEW_SGIX_mpeg2 GLEW_GET_VAR(__GLEW_SGIX_mpeg2) + +#endif /* GL_SGIX_mpeg2 */ + +/* ------------------ GL_SGIX_nonlinear_lighting_pervertex ----------------- */ + +#ifndef GL_SGIX_nonlinear_lighting_pervertex +#define GL_SGIX_nonlinear_lighting_pervertex 1 + +typedef void (GLAPIENTRY * PFNGLGETNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint* terms, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint* terms, const GLfloat *data); +typedef void (GLAPIENTRY * PFNGLNONLINLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLint terms, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNONLINMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLint terms, const GLfloat* params); + +#define glGetNonlinLightfvSGIX GLEW_GET_FUN(__glewGetNonlinLightfvSGIX) +#define glGetNonlinMaterialfvSGIX GLEW_GET_FUN(__glewGetNonlinMaterialfvSGIX) +#define glNonlinLightfvSGIX GLEW_GET_FUN(__glewNonlinLightfvSGIX) +#define glNonlinMaterialfvSGIX GLEW_GET_FUN(__glewNonlinMaterialfvSGIX) + +#define GLEW_SGIX_nonlinear_lighting_pervertex GLEW_GET_VAR(__GLEW_SGIX_nonlinear_lighting_pervertex) + +#endif /* GL_SGIX_nonlinear_lighting_pervertex */ + +/* --------------------------- GL_SGIX_nurbs_eval -------------------------- */ + +#ifndef GL_SGIX_nurbs_eval +#define GL_SGIX_nurbs_eval 1 + +#define GL_MAP1_VERTEX_3_NURBS_SGIX 0x81CB +#define GL_MAP1_VERTEX_4_NURBS_SGIX 0x81CC +#define GL_MAP1_INDEX_NURBS_SGIX 0x81CD +#define GL_MAP1_COLOR_4_NURBS_SGIX 0x81CE +#define GL_MAP1_NORMAL_NURBS_SGIX 0x81CF +#define GL_MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0 +#define GL_MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1 +#define GL_MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2 +#define GL_MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3 +#define GL_MAP2_VERTEX_3_NURBS_SGIX 0x81E4 +#define GL_MAP2_VERTEX_4_NURBS_SGIX 0x81E5 +#define GL_MAP2_INDEX_NURBS_SGIX 0x81E6 +#define GL_MAP2_COLOR_4_NURBS_SGIX 0x81E7 +#define GL_MAP2_NORMAL_NURBS_SGIX 0x81E8 +#define GL_MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9 +#define GL_MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA +#define GL_MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB +#define GL_MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC +#define GL_NURBS_KNOT_COUNT_SGIX 0x81ED +#define GL_NURBS_KNOT_VECTOR_SGIX 0x81EE + +#define GLEW_SGIX_nurbs_eval GLEW_GET_VAR(__GLEW_SGIX_nurbs_eval) + +#endif /* GL_SGIX_nurbs_eval */ + +/* ---------------------- GL_SGIX_occlusion_instrument --------------------- */ + +#ifndef GL_SGIX_occlusion_instrument +#define GL_SGIX_occlusion_instrument 1 + +#define GL_OCCLUSION_INSTRUMENT_SGIX 0x6060 + +#define GLEW_SGIX_occlusion_instrument GLEW_GET_VAR(__GLEW_SGIX_occlusion_instrument) + +#endif /* GL_SGIX_occlusion_instrument */ + +/* ------------------------- GL_SGIX_packed_6bytes ------------------------- */ + +#ifndef GL_SGIX_packed_6bytes +#define GL_SGIX_packed_6bytes 1 + +#define GLEW_SGIX_packed_6bytes GLEW_GET_VAR(__GLEW_SGIX_packed_6bytes) + +#endif /* GL_SGIX_packed_6bytes */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ----------------------- GL_SGIX_pixel_texture_lod ----------------------- */ + +#ifndef GL_SGIX_pixel_texture_lod +#define GL_SGIX_pixel_texture_lod 1 + +#define GLEW_SGIX_pixel_texture_lod GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_lod) + +#endif /* GL_SGIX_pixel_texture_lod */ + +/* -------------------------- GL_SGIX_pixel_tiles -------------------------- */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 + +#define GLEW_SGIX_pixel_tiles GLEW_GET_VAR(__GLEW_SGIX_pixel_tiles) + +#endif /* GL_SGIX_pixel_tiles */ + +/* ------------------------- GL_SGIX_polynomial_ffd ------------------------ */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 + +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x1 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x2 + +typedef void (GLAPIENTRY * PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); + +#define glDeformSGIX GLEW_GET_FUN(__glewDeformSGIX) +#define glLoadIdentityDeformationMapSGIX GLEW_GET_FUN(__glewLoadIdentityDeformationMapSGIX) + +#define GLEW_SGIX_polynomial_ffd GLEW_GET_VAR(__GLEW_SGIX_polynomial_ffd) + +#endif /* GL_SGIX_polynomial_ffd */ + +/* --------------------------- GL_SGIX_quad_mesh --------------------------- */ + +#ifndef GL_SGIX_quad_mesh +#define GL_SGIX_quad_mesh 1 + +typedef void (GLAPIENTRY * PFNGLMESHBREADTHSGIXPROC) (GLint breadth); +typedef void (GLAPIENTRY * PFNGLMESHSTRIDESGIXPROC) (GLint stride); + +#define glMeshBreadthSGIX GLEW_GET_FUN(__glewMeshBreadthSGIX) +#define glMeshStrideSGIX GLEW_GET_FUN(__glewMeshStrideSGIX) + +#define GLEW_SGIX_quad_mesh GLEW_GET_VAR(__GLEW_SGIX_quad_mesh) + +#endif /* GL_SGIX_quad_mesh */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ------------------------- GL_SGIX_scalebias_hint ------------------------ */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 + +#define GL_SCALEBIAS_HINT_SGIX 0x8322 + +#define GLEW_SGIX_scalebias_hint GLEW_GET_VAR(__GLEW_SGIX_scalebias_hint) + +#endif /* GL_SGIX_scalebias_hint */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ------------------------------ GL_SGIX_slim ----------------------------- */ + +#ifndef GL_SGIX_slim +#define GL_SGIX_slim 1 + +#define GL_PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B +#define GL_SLIM8U_SGIX 0x831D +#define GL_SLIM10U_SGIX 0x831E +#define GL_SLIM12S_SGIX 0x831F + +#define GLEW_SGIX_slim GLEW_GET_VAR(__GLEW_SGIX_slim) + +#endif /* GL_SGIX_slim */ + +/* ------------------------ GL_SGIX_spotlight_cutoff ----------------------- */ + +#ifndef GL_SGIX_spotlight_cutoff +#define GL_SGIX_spotlight_cutoff 1 + +#define GL_SPOT_CUTOFF_DELTA_SGIX 0x8193 + +#define GLEW_SGIX_spotlight_cutoff GLEW_GET_VAR(__GLEW_SGIX_spotlight_cutoff) + +#endif /* GL_SGIX_spotlight_cutoff */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* -------------------------- GL_SGIX_subdiv_patch ------------------------- */ + +#ifndef GL_SGIX_subdiv_patch +#define GL_SGIX_subdiv_patch 1 + +#define GLEW_SGIX_subdiv_patch GLEW_GET_VAR(__GLEW_SGIX_subdiv_patch) + +#endif /* GL_SGIX_subdiv_patch */ + +/* --------------------------- GL_SGIX_subsample --------------------------- */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 + +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 + +#define GLEW_SGIX_subsample GLEW_GET_VAR(__GLEW_SGIX_subsample) + +#endif /* GL_SGIX_subsample */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ------------------- GL_SGIX_texture_mipmap_anisotropic ------------------ */ + +#ifndef GL_SGIX_texture_mipmap_anisotropic +#define GL_SGIX_texture_mipmap_anisotropic 1 + +#define GL_TEXTURE_MIPMAP_ANISOTROPY_SGIX 0x832E +#define GL_MAX_MIPMAP_ANISOTROPY_SGIX 0x832F + +#define GLEW_SGIX_texture_mipmap_anisotropic GLEW_GET_VAR(__GLEW_SGIX_texture_mipmap_anisotropic) + +#endif /* GL_SGIX_texture_mipmap_anisotropic */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_phase ------------------------- */ + +#ifndef GL_SGIX_texture_phase +#define GL_SGIX_texture_phase 1 + +#define GL_PHASE_SGIX 0x832A + +#define GLEW_SGIX_texture_phase GLEW_GET_VAR(__GLEW_SGIX_texture_phase) + +#endif /* GL_SGIX_texture_phase */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ---------------------- GL_SGIX_texture_supersample ---------------------- */ + +#ifndef GL_SGIX_texture_supersample +#define GL_SGIX_texture_supersample 1 + +#define GLEW_SGIX_texture_supersample GLEW_GET_VAR(__GLEW_SGIX_texture_supersample) + +#endif /* GL_SGIX_texture_supersample */ + +/* --------------------------- GL_SGIX_vector_ops -------------------------- */ + +#ifndef GL_SGIX_vector_ops +#define GL_SGIX_vector_ops 1 + +typedef void (GLAPIENTRY * PFNGLGETVECTOROPERATIONSGIXPROC) (GLenum operation); +typedef void (GLAPIENTRY * PFNGLVECTOROPERATIONSGIXPROC) (GLenum operation); + +#define glGetVectorOperationSGIX GLEW_GET_FUN(__glewGetVectorOperationSGIX) +#define glVectorOperationSGIX GLEW_GET_FUN(__glewVectorOperationSGIX) + +#define GLEW_SGIX_vector_ops GLEW_GET_VAR(__GLEW_SGIX_vector_ops) + +#endif /* GL_SGIX_vector_ops */ + +/* ---------------------- GL_SGIX_vertex_array_object ---------------------- */ + +#ifndef GL_SGIX_vertex_array_object +#define GL_SGIX_vertex_array_object 1 + +typedef GLboolean (GLAPIENTRY * PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC) (GLsizei n, const GLuint* arrays, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSSGIXPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYSGIXPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC) (GLsizei n, const GLuint* arrays, const GLclampf* priorities); + +#define glAreVertexArraysResidentSGIX GLEW_GET_FUN(__glewAreVertexArraysResidentSGIX) +#define glBindVertexArraySGIX GLEW_GET_FUN(__glewBindVertexArraySGIX) +#define glDeleteVertexArraysSGIX GLEW_GET_FUN(__glewDeleteVertexArraysSGIX) +#define glGenVertexArraysSGIX GLEW_GET_FUN(__glewGenVertexArraysSGIX) +#define glIsVertexArraySGIX GLEW_GET_FUN(__glewIsVertexArraySGIX) +#define glPrioritizeVertexArraysSGIX GLEW_GET_FUN(__glewPrioritizeVertexArraysSGIX) + +#define GLEW_SGIX_vertex_array_object GLEW_GET_VAR(__GLEW_SGIX_vertex_array_object) + +#endif /* GL_SGIX_vertex_array_object */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* ------------------------ GL_SGIX_ycrcb_subsample ------------------------ */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 + +#define GLEW_SGIX_ycrcb_subsample GLEW_GET_VAR(__GLEW_SGIX_ycrcb_subsample) + +#endif /* GL_SGIX_ycrcb_subsample */ + +/* ----------------------------- GL_SGIX_ycrcba ---------------------------- */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 + +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 + +#define GLEW_SGIX_ycrcba GLEW_GET_VAR(__GLEW_SGIX_ycrcba) + +#endif /* GL_SGIX_ycrcba */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------------- GL_SGI_complex ---------------------------- */ + +#ifndef GL_SGI_complex +#define GL_SGI_complex 1 + +#define GLEW_SGI_complex GLEW_GET_VAR(__GLEW_SGI_complex) + +#endif /* GL_SGI_complex */ + +/* -------------------------- GL_SGI_complex_type -------------------------- */ + +#ifndef GL_SGI_complex_type +#define GL_SGI_complex_type 1 + +#define GL_COMPLEX_UNSIGNED_BYTE_SGI 0x81BD +#define GL_COMPLEX_BYTE_SGI 0x81BE +#define GL_COMPLEX_UNSIGNED_SHORT_SGI 0x81BF +#define GL_COMPLEX_SHORT_SGI 0x81C0 +#define GL_COMPLEX_UNSIGNED_INT_SGI 0x81C1 +#define GL_COMPLEX_INT_SGI 0x81C2 +#define GL_COMPLEX_FLOAT_SGI 0x81C3 + +#define GLEW_SGI_complex_type GLEW_GET_VAR(__GLEW_SGI_complex_type) + +#endif /* GL_SGI_complex_type */ + +/* ------------------------------- GL_SGI_fft ------------------------------ */ + +#ifndef GL_SGI_fft +#define GL_SGI_fft 1 + +#define GL_PIXEL_TRANSFORM_OPERATOR_SGI 0x81C4 +#define GL_CONVOLUTION_SGI 0x81C5 +#define GL_FFT_1D_SGI 0x81C6 +#define GL_PIXEL_TRANSFORM_SGI 0x81C7 +#define GL_MAX_FFT_WIDTH_SGI 0x81C8 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFSGIPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERISGIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMSGIPROC) (GLenum target); + +#define glGetPixelTransformParameterfvSGI GLEW_GET_FUN(__glewGetPixelTransformParameterfvSGI) +#define glGetPixelTransformParameterivSGI GLEW_GET_FUN(__glewGetPixelTransformParameterivSGI) +#define glPixelTransformParameterfSGI GLEW_GET_FUN(__glewPixelTransformParameterfSGI) +#define glPixelTransformParameterfvSGI GLEW_GET_FUN(__glewPixelTransformParameterfvSGI) +#define glPixelTransformParameteriSGI GLEW_GET_FUN(__glewPixelTransformParameteriSGI) +#define glPixelTransformParameterivSGI GLEW_GET_FUN(__glewPixelTransformParameterivSGI) +#define glPixelTransformSGI GLEW_GET_FUN(__glewPixelTransformSGI) + +#define GLEW_SGI_fft GLEW_GET_VAR(__GLEW_SGI_fft) + +#endif /* GL_SGI_fft */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* ------------------------- GL_WIN_scene_markerXXX ------------------------ */ + +#ifndef GL_WIN_scene_markerXXX +#define GL_WIN_scene_markerXXX 1 + +#define GLEW_WIN_scene_markerXXX GLEW_GET_VAR(__GLEW_WIN_scene_markerXXX) + +#endif /* GL_WIN_scene_markerXXX */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + + + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; +GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; +GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; +GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; +GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; +GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; +GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; +GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; +GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __glewMultiDrawArraysIndirectCount; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __glewMultiDrawElementsIndirectCount; +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERPROC __glewSpecializeShader; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewFramebufferSamplePositionsfvAMD; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC __glewGetFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC __glewGetNamedFramebufferParameterfvAMD; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC __glewNamedFramebufferSamplePositionsfvAMD; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; + +GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; +GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; +GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; + +GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; + +GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; +GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; + +GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + +GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; + +GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; +GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + +GLEW_FUN_EXPORT PFNGLCOPYTEXTURELEVELSAPPLEPROC __glewCopyTextureLevelsAPPLE; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC __glewRenderbufferStorageMultisampleAPPLE; +GLEW_FUN_EXPORT PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC __glewResolveMultisampleFramebufferAPPLE; + +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCAPPLEPROC __glewClientWaitSyncAPPLE; +GLEW_FUN_EXPORT PFNGLDELETESYNCAPPLEPROC __glewDeleteSyncAPPLE; +GLEW_FUN_EXPORT PFNGLFENCESYNCAPPLEPROC __glewFenceSyncAPPLE; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VAPPLEPROC __glewGetInteger64vAPPLE; +GLEW_FUN_EXPORT PFNGLGETSYNCIVAPPLEPROC __glewGetSyncivAPPLE; +GLEW_FUN_EXPORT PFNGLISSYNCAPPLEPROC __glewIsSyncAPPLE; +GLEW_FUN_EXPORT PFNGLWAITSYNCAPPLEPROC __glewWaitSyncAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; +GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; +GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; +GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; + +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; + +GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; + +GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; + +GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + +GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; + +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; +GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; +GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; +GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; +GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; +GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; +GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; +GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; + +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; + +GLEW_FUN_EXPORT PFNGLSPECIALIZESHADERARBPROC __glewSpecializeShaderARB; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; +GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; +GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; +GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; +GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; +GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; +GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; +GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; +GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; + +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; +GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPPROC __glewPolygonOffsetClamp; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; +GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; +GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; +GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; +GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; +GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; +GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; +GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; + +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; + +GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; +GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; +GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; +GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; + +GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; +GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; + +GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; + +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; +GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; + +GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; +GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; +GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; +GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; + +GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; +GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; +GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; +GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; +GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; +GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; + +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; +GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; +GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; + +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; +GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; +GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; +GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; +GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; +GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; +GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; +GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __glewDrawArraysInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseInstanceEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __glewDrawElementsInstancedBaseVertexBaseInstanceEXT; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __glewBindFragDataLocationIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXEXTPROC __glewGetFragDataIndexEXT; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __glewGetProgramResourceLocationIndexEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTPROC __glewBufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEEXTPROC __glewClearTexImageEXT; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEEXTPROC __glewClearTexSubImageEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAEXTPROC __glewCopyImageSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; +GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; + +GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; +GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; +GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; +GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; + +GLEW_FUN_EXPORT PFNGLDISCARDFRAMEBUFFEREXTPROC __glewDiscardFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSEXTPROC __glewDrawBuffersEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIEXTPROC __glewBlendEquationSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIEXTPROC __glewBlendEquationiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIEXTPROC __glewBlendFuncSeparateiEXT; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIEXTPROC __glewBlendFunciEXT; +GLEW_FUN_EXPORT PFNGLCOLORMASKIEXTPROC __glewColorMaskiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEIEXTPROC __glewDisableiEXT; +GLEW_FUN_EXPORT PFNGLENABLEIEXTPROC __glewEnableiEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDIEXTPROC __glewIsEnablediEXT; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXEXTPROC __glewDrawElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __glewDrawElementsInstancedBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __glewDrawRangeElementsBaseVertexEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __glewMultiDrawElementsBaseVertexEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEEXTERNALEXTPROC __glewBufferStorageExternalEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC __glewNamedBufferStorageExternalEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC __glewVertexAttribDivisorEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC __glewFlushMappedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEEXTPROC __glewMapBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC __glewBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC __glewCreateMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC __glewDeleteMemoryObjectsEXT; +GLEW_FUN_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC __glewGetMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC __glewGetUnsignedBytei_vEXT; +GLEW_FUN_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC __glewGetUnsignedBytevEXT; +GLEW_FUN_EXPORT PFNGLISMEMORYOBJECTEXTPROC __glewIsMemoryObjectEXT; +GLEW_FUN_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC __glewMemoryObjectParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC __glewNamedBufferStorageMemEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM1DEXTPROC __glewTexStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC __glewTexStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC __glewTexStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC __glewTexStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC __glewTexStorageMem3DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM1DEXTPROC __glewTextureStorageMem1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DEXTPROC __glewTextureStorageMem2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC __glewTextureStorageMem2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DEXTPROC __glewTextureStorageMem3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC __glewTextureStorageMem3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYFDEXTPROC __glewImportMemoryFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC __glewImportMemoryWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTMEMORYWIN32NAMEEXTPROC __glewImportMemoryWin32NameEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC __glewMultiDrawArraysIndirectEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC __glewMultiDrawElementsIndirectEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __glewFramebufferTexture2DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSINDEXEDEXTPROC __glewDrawBuffersIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VEXTPROC __glewGetIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERINDEXEDEXTPROC __glewReadBufferIndexedEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; + +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLDELETESEMAPHORESEXTPROC __glewDeleteSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGENSEMAPHORESEXTPROC __glewGenSemaphoresEXT; +GLEW_FUN_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC __glewGetSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLISSEMAPHOREEXTPROC __glewIsSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC __glewSemaphoreParameterui64vEXT; +GLEW_FUN_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC __glewSignalSemaphoreEXT; +GLEW_FUN_EXPORT PFNGLWAITSEMAPHOREEXTPROC __glewWaitSemaphoreEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC __glewImportSemaphoreFdEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC __glewImportSemaphoreWin32HandleEXT; +GLEW_FUN_EXPORT PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC __glewImportSemaphoreWin32NameEXT; + +GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; +GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; + +GLEW_FUN_EXPORT PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC __glewClearPixelLocalStorageuiEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewFramebufferPixelLocalStorageSizeEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __glewGetFramebufferPixelLocalStorageSizeEXT; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTEXTPROC __glewTexPageCommitmentEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DEXTPROC __glewTexStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DEXTPROC __glewTexStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DEXTPROC __glewTexStorage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWEXTPROC __glewTextureViewEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLBINDARRAYSETEXTPROC __glewBindArraySetEXT; +GLEW_FUN_EXPORT PFNGLCREATEARRAYSETEXTPROC __glewCreateArraySetExt; +GLEW_FUN_EXPORT PFNGLDELETEARRAYSETSEXTPROC __glewDeleteArraySetsEXT; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC __glewAcquireKeyedMutexWin32EXT; +GLEW_FUN_EXPORT PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC __glewReleaseKeyedMutexWin32EXT; + +GLEW_FUN_EXPORT PFNGLWINDOWRECTANGLESEXTPROC __glewWindowRectanglesEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; + +GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; +GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; +GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; +GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSKHRPROC __glewMaxShaderCompilerThreadsKHR; + +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; +GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLLGPUCOPYIMAGESUBDATANVXPROC __glewLGPUCopyImageSubDataNVX; +GLEW_FUN_EXPORT PFNGLLGPUINTERLOCKNVXPROC __glewLGPUInterlockNVX; +GLEW_FUN_EXPORT PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC __glewLGPUNamedBufferSubDataNVX; + +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERFNVPROC __glewStereoParameterfNV; +GLEW_FUN_EXPORT PFNGLSTEREOPARAMETERINVPROC __glewStereoParameteriNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTPOSITIONWSCALENVPROC __glewViewportPositionWScaleNV; + +GLEW_FUN_EXPORT PFNGLCALLCOMMANDLISTNVPROC __glewCallCommandListNV; +GLEW_FUN_EXPORT PFNGLCOMMANDLISTSEGMENTSNVPROC __glewCommandListSegmentsNV; +GLEW_FUN_EXPORT PFNGLCOMPILECOMMANDLISTNVPROC __glewCompileCommandListNV; +GLEW_FUN_EXPORT PFNGLCREATECOMMANDLISTSNVPROC __glewCreateCommandListsNV; +GLEW_FUN_EXPORT PFNGLCREATESTATESNVPROC __glewCreateStatesNV; +GLEW_FUN_EXPORT PFNGLDELETECOMMANDLISTSNVPROC __glewDeleteCommandListsNV; +GLEW_FUN_EXPORT PFNGLDELETESTATESNVPROC __glewDeleteStatesNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSADDRESSNVPROC __glewDrawCommandsAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSNVPROC __glewDrawCommandsNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC __glewDrawCommandsStatesAddressNV; +GLEW_FUN_EXPORT PFNGLDRAWCOMMANDSSTATESNVPROC __glewDrawCommandsStatesNV; +GLEW_FUN_EXPORT PFNGLGETCOMMANDHEADERNVPROC __glewGetCommandHeaderNV; +GLEW_FUN_EXPORT PFNGLGETSTAGEINDEXNVPROC __glewGetStageIndexNV; +GLEW_FUN_EXPORT PFNGLISCOMMANDLISTNVPROC __glewIsCommandListNV; +GLEW_FUN_EXPORT PFNGLISSTATENVPROC __glewIsStateNV; +GLEW_FUN_EXPORT PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __glewListDrawCommandsStatesClientNV; +GLEW_FUN_EXPORT PFNGLSTATECAPTURENVPROC __glewStateCaptureNV; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; + +GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERINVPROC __glewConservativeRasterParameteriNV; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATANVPROC __glewCopyBufferSubDataNV; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSNVPROC __glewDrawBuffersNV; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDNVPROC __glewDrawArraysInstancedNV; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDNVPROC __glewDrawElementsInstancedNV; + +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + +GLEW_FUN_EXPORT PFNGLDRAWVKIMAGENVPROC __glewDrawVkImageNV; +GLEW_FUN_EXPORT PFNGLGETVKPROCADDRNVPROC __glewGetVkProcAddrNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKFENCENVPROC __glewSignalVkFenceNV; +GLEW_FUN_EXPORT PFNGLSIGNALVKSEMAPHORENVPROC __glewSignalVkSemaphoreNV; +GLEW_FUN_EXPORT PFNGLWAITVKSEMAPHORENVPROC __glewWaitVkSemaphoreNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; +GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERNVPROC __glewBlitFramebufferNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC __glewRenderbufferStorageMultisampleNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLMULTICASTBARRIERNVPROC __glewMulticastBarrierNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBLITFRAMEBUFFERNVPROC __glewMulticastBlitFramebufferNV; +GLEW_FUN_EXPORT PFNGLMULTICASTBUFFERSUBDATANVPROC __glewMulticastBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC __glewMulticastCopyBufferSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTCOPYIMAGESUBDATANVPROC __glewMulticastCopyImageSubDataNV; +GLEW_FUN_EXPORT PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewMulticastFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC __glewMulticastGetQueryObjecti64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTIVNVPROC __glewMulticastGetQueryObjectivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC __glewMulticastGetQueryObjectui64vNV; +GLEW_FUN_EXPORT PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC __glewMulticastGetQueryObjectuivNV; +GLEW_FUN_EXPORT PFNGLMULTICASTWAITSYNCNVPROC __glewMulticastWaitSyncNV; +GLEW_FUN_EXPORT PFNGLRENDERGPUMASKNVPROC __glewRenderGpuMaskNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORNVPROC __glewVertexAttribDivisorNV; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVNVPROC __glewUniformMatrix2x3fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVNVPROC __glewUniformMatrix2x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVNVPROC __glewUniformMatrix3x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVNVPROC __glewUniformMatrix3x4fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVNVPROC __glewUniformMatrix4x2fvNV; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVNVPROC __glewUniformMatrix4x3fvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; +GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; +GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; +GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; +GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; +GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; +GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; +GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; +GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; +GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; +GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; +GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLPOLYGONMODENVPROC __glewPolygonModeNV; + +GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; + +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; +GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DNVPROC __glewCompressedTexImage3DNV; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DNVPROC __glewCompressedTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DNVPROC __glewCopyTexSubImage3DNV; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERNVPROC __glewFramebufferTextureLayerNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DNVPROC __glewTexImage3DNV; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DNVPROC __glewTexSubImage3DNV; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; + +GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; +GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; +GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; +GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; + +GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; +GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; +GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; +GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; +GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; +GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; +GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYFVNVPROC __glewDepthRangeArrayfvNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDFNVPROC __glewDepthRangeIndexedfNV; +GLEW_FUN_EXPORT PFNGLDISABLEINVPROC __glewDisableiNV; +GLEW_FUN_EXPORT PFNGLENABLEINVPROC __glewEnableiNV; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VNVPROC __glewGetFloati_vNV; +GLEW_FUN_EXPORT PFNGLISENABLEDINVPROC __glewIsEnablediNV; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVNVPROC __glewScissorArrayvNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDNVPROC __glewScissorIndexedNV; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVNVPROC __glewScissorIndexedvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVNVPROC __glewViewportArrayvNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFNVPROC __glewViewportIndexedfNV; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVNVPROC __glewViewportIndexedfvNV; + +GLEW_FUN_EXPORT PFNGLVIEWPORTSWIZZLENVPROC __glewViewportSwizzleNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __glewFramebufferTextureMultisampleMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCQCOMPROC __glewAlphaFuncQCOM; + +GLEW_FUN_EXPORT PFNGLDISABLEDRIVERCONTROLQCOMPROC __glewDisableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLENABLEDRIVERCONTROLQCOMPROC __glewEnableDriverControlQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSTRINGQCOMPROC __glewGetDriverControlStringQCOM; +GLEW_FUN_EXPORT PFNGLGETDRIVERCONTROLSQCOMPROC __glewGetDriverControlsQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERPOINTERVQCOMPROC __glewExtGetBufferPointervQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETBUFFERSQCOMPROC __glewExtGetBuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETFRAMEBUFFERSQCOMPROC __glewExtGetFramebuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETRENDERBUFFERSQCOMPROC __glewExtGetRenderbuffersQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC __glewExtGetTexLevelParameterivQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXSUBIMAGEQCOMPROC __glewExtGetTexSubImageQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETTEXTURESQCOMPROC __glewExtGetTexturesQCOM; +GLEW_FUN_EXPORT PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC __glewExtTexObjectStateOverrideiQCOM; + +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC __glewExtGetProgramBinarySourceQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETPROGRAMSQCOMPROC __glewExtGetProgramsQCOM; +GLEW_FUN_EXPORT PFNGLEXTGETSHADERSQCOMPROC __glewExtGetShadersQCOM; +GLEW_FUN_EXPORT PFNGLEXTISPROGRAMBINARYQCOMPROC __glewExtIsProgramBinaryQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC __glewFramebufferFoveationConfigQCOM; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC __glewFramebufferFoveationParametersQCOM; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC __glewFramebufferFetchBarrierQCOM; + +GLEW_FUN_EXPORT PFNGLENDTILINGQCOMPROC __glewEndTilingQCOM; +GLEW_FUN_EXPORT PFNGLSTARTTILINGQCOMPROC __glewStartTilingQCOM; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + +GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; + +GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; +GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; + +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + +GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLINTERLEAVEDTEXTURECOORDSETSSGISPROC __glewInterleavedTextureCoordSetsSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURECOORDSETSGISPROC __glewSelectTextureCoordSetSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURESGISPROC __glewSelectTextureSGIS; +GLEW_FUN_EXPORT PFNGLSELECTTEXTURETRANSFORMSGISPROC __glewSelectTextureTransformSGIS; + +GLEW_FUN_EXPORT PFNGLMULTISAMPLESUBRECTPOSSGISPROC __glewMultisampleSubRectPosSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLADDRESSSPACEPROC __glewAddressSpace; +GLEW_FUN_EXPORT PFNGLDATAPIPEPROC __glewDataPipe; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLFOGLAYERSSGIXPROC __glewFogLayersSGIX; +GLEW_FUN_EXPORT PFNGLGETFOGLAYERSSGIXPROC __glewGetFogLayersSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLIGLOOINTERFACESGIXPROC __glewIglooInterfaceSGIX; + +GLEW_FUN_EXPORT PFNGLALLOCMPEGPREDICTORSSGIXPROC __glewAllocMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLDELETEMPEGPREDICTORSSGIXPROC __glewDeleteMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGENMPEGPREDICTORSSGIXPROC __glewGenMPEGPredictorsSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERFVSGIXPROC __glewGetMPEGParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPARAMETERIVSGIXPROC __glewGetMPEGParameterivSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGPREDICTORSGIXPROC __glewGetMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLGETMPEGQUANTTABLEUBVPROC __glewGetMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLISMPEGPREDICTORSGIXPROC __glewIsMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGPREDICTORSGIXPROC __glewMPEGPredictorSGIX; +GLEW_FUN_EXPORT PFNGLMPEGQUANTTABLEUBVPROC __glewMPEGQuantTableubv; +GLEW_FUN_EXPORT PFNGLSWAPMPEGPREDICTORSSGIXPROC __glewSwapMPEGPredictorsSGIX; + +GLEW_FUN_EXPORT PFNGLGETNONLINLIGHTFVSGIXPROC __glewGetNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETNONLINMATERIALFVSGIXPROC __glewGetNonlinMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINLIGHTFVSGIXPROC __glewNonlinLightfvSGIX; +GLEW_FUN_EXPORT PFNGLNONLINMATERIALFVSGIXPROC __glewNonlinMaterialfvSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLDEFORMSGIXPROC __glewDeformSGIX; +GLEW_FUN_EXPORT PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC __glewLoadIdentityDeformationMapSGIX; + +GLEW_FUN_EXPORT PFNGLMESHBREADTHSGIXPROC __glewMeshBreadthSGIX; +GLEW_FUN_EXPORT PFNGLMESHSTRIDESGIXPROC __glewMeshStrideSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLGETVECTOROPERATIONSGIXPROC __glewGetVectorOperationSGIX; +GLEW_FUN_EXPORT PFNGLVECTOROPERATIONSGIXPROC __glewVectorOperationSGIX; + +GLEW_FUN_EXPORT PFNGLAREVERTEXARRAYSRESIDENTSGIXPROC __glewAreVertexArraysResidentSGIX; +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYSGIXPROC __glewBindVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSSGIXPROC __glewDeleteVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSSGIXPROC __glewGenVertexArraysSGIX; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYSGIXPROC __glewIsVertexArraySGIX; +GLEW_FUN_EXPORT PFNGLPRIORITIZEVERTEXARRAYSSGIXPROC __glewPrioritizeVertexArraysSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVSGIPROC __glewGetPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVSGIPROC __glewGetPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFSGIPROC __glewPixelTransformParameterfSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVSGIPROC __glewPixelTransformParameterfvSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERISGIPROC __glewPixelTransformParameteriSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVSGIPROC __glewPixelTransformParameterivSGI; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMSGIPROC __glewPixelTransformSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_6; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_3DC_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_compressed_ATC_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_framebuffer_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int16; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_program_binary_Z400; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_explicit_vertex_parameter; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_gather_bias_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANDROID_extension_pack_es31a; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_clip_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_color_buffer_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_copy_texture_levels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_2D_limited_npot; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_format_BGRA8888; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_max_level; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gl_spirv; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_spirv_extensions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_mali_shader_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_rgba8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_ARM_shader_framebuffer_fetch_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EGL_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EGL_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_EGL_image_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_YUV_target; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_buffer_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compressed_ETC1_RGB8_sub_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_discard_framebuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers_indexed; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_external_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_float_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_frag_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_memory_object_win32; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiple_textures; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisampled_render_to_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multiview_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pvrtc_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_read_format_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_render_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sRGB_write_control; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_fd; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_semaphore_win32; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_framebuffer_fetch; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_implicit_conversions; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_io_blocks; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_non_constant_global_initializers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_pixel_local_storage2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_samplers; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_astc_decode_mode_rgb9e5; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_format_BGRA8888; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_norm16; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_R8; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_RG8; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_type_2_10_10_10_REV; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_unpack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_setXXX; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_win32_keyed_mutex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_window_rectangles; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_conservative_rasterization; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_sliced_3d; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_shader_integer_functions; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_blend_equation_advanced_multi_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_linked_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_3dvision_settings; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_EGL_stream_consumer_external; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_alpha_to_coverage_dither_control; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bgr; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_clip_space_w_scaling; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_command_list; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_pre_snap_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_vulkan_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fbo_color_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_generate_mipmap_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_multicast; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_image_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_non_square_matrices; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pack_subimage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_float_linear; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_platform_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_polygon_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_read_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_robustness_video_memory_purge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sRGB_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_noperspective_interpolation; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shadow_samplers_cube; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_stereo_view_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_s3tc_update; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_npot_2D_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle_compressed; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview_multisampled_render_to_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_alpha_test; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_binning_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_driver_control; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_extended_get2; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_framebuffer_foveated; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_perfmon_global_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_shader_framebuffer_fetch_noncoherent; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_tiled_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_QCOM_writeonly_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_clip_band_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_shared_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_g_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_r_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_bali_timer_instruments; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cadd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_cmultiply; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_calligraphic_fragment; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_matrix_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_color_table_index_mode; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_complex_polar; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_cylinder_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_datapipe; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_decimation; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_pass_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_dvc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_factor_to_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_layers; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_patchy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_scale; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_lighting_space; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragments_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_icc_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_igloo_interface; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_image_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_impact_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_instrument_error; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_line_quality_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_mpeg2; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nonlinear_lighting_pervertex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_nurbs_eval; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_occlusion_instrument; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_packed_6bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_tiles; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_polynomial_ffd; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_quad_mesh; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_scalebias_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_slim; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_spotlight_cutoff; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subdiv_patch; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_mipmap_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_phase; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_supersample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vector_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcba; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_complex_type; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_fft; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_scene_markerXXX; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ +#define GLEW_ERROR_NO_GLX_DISPLAY 4 /* Need GLX display for GLX support */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* ------------------------------------------------------------------------- */ + +/* GLEW version info */ + +/* +VERSION 2.1.0 +VERSION_MAJOR 2 +VERSION_MINOR 1 +VERSION_MICRO 0 +*/ + +/* API */ +GLEWAPI GLenum GLEWAPIENTRY glewInit (void); +GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#ifndef GLEW_GET_VAR +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLEW_GET_FUN +#define GLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/Thirdparty/glew/include/GL/glxew.h b/Thirdparty/glew/include/GL/glxew.h new file mode 100644 index 0000000..7e39c2f --- /dev/null +++ b/Thirdparty/glew/include/GL/glxew.h @@ -0,0 +1,1775 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 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. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif + +#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) +#error glx.h included before glxew.h +#endif + +#define __glxext_h_ + +#define GLX_H +#define __GLX_glx_h__ +#define __glx_h__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXContextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +typedef unsigned int GLXVideoDeviceNV; + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef struct { + int event_type; + int draw_type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + unsigned int buffer_mask; + unsigned int aux_buffer; + int x, y; + int width, height; + int count; +} GLXPbufferClobberEvent; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------ GLX_AMD_gpu_association ------------------------ */ + +#ifndef GLX_AMD_gpu_association +#define GLX_AMD_gpu_association 1 + +#define GLX_GPU_VENDOR_AMD 0x1F00 +#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 +#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define GLX_GPU_RAM_AMD 0x21A3 +#define GLX_GPU_CLOCK_AMD 0x21A4 +#define GLX_GPU_NUM_PIPES_AMD 0x21A5 +#define GLX_GPU_NUM_SIMD_AMD 0x21A6 +#define GLX_GPU_NUM_RB_AMD 0x21A7 +#define GLX_GPU_NUM_SPI_AMD 0x21A8 + +typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); +typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); +typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); +typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); +typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); +typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); + +#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) +#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) +#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) +#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) +#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) +#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) +#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) +#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) +#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) + +#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) + +#endif /* GLX_AMD_gpu_association */ + +/* --------------------- GLX_ARB_context_flush_control --------------------- */ + +#ifndef GLX_ARB_context_flush_control +#define GLX_ARB_context_flush_control 1 + +#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) + +#endif /* GLX_ARB_context_flush_control */ + +/* ------------------------- GLX_ARB_create_context ------------------------ */ + +#ifndef GLX_ARB_create_context +#define GLX_ARB_create_context 1 + +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); + +#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) + +#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) + +#endif /* GLX_ARB_create_context */ + +/* -------------------- GLX_ARB_create_context_no_error -------------------- */ + +#ifndef GLX_ARB_create_context_no_error +#define GLX_ARB_create_context_no_error 1 + +#define GLXEW_ARB_create_context_no_error GLXEW_GET_VAR(__GLXEW_ARB_create_context_no_error) + +#endif /* GLX_ARB_create_context_no_error */ + +/* --------------------- GLX_ARB_create_context_profile -------------------- */ + +#ifndef GLX_ARB_create_context_profile +#define GLX_ARB_create_context_profile 1 + +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) + +#endif /* GLX_ARB_create_context_profile */ + +/* ------------------- GLX_ARB_create_context_robustness ------------------- */ + +#ifndef GLX_ARB_create_context_robustness +#define GLX_ARB_create_context_robustness 1 + +#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) + +#endif /* GLX_ARB_create_context_robustness */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 +#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_ARB_framebuffer_sRGB +#define GLX_ARB_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 + +#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) + +#endif /* GLX_ARB_framebuffer_sRGB */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ---------------- GLX_ARB_robustness_application_isolation --------------- */ + +#ifndef GLX_ARB_robustness_application_isolation +#define GLX_ARB_robustness_application_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) + +#endif /* GLX_ARB_robustness_application_isolation */ + +/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ + +#ifndef GLX_ARB_robustness_share_group_isolation +#define GLX_ARB_robustness_share_group_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) + +#endif /* GLX_ARB_robustness_share_group_isolation */ + +/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ + +#ifndef GLX_ARB_vertex_buffer_object +#define GLX_ARB_vertex_buffer_object 1 + +#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 + +#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) + +#endif /* GLX_ARB_vertex_buffer_object */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* --------------------------- GLX_EXT_buffer_age -------------------------- */ + +#ifndef GLX_EXT_buffer_age +#define GLX_EXT_buffer_age 1 + +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 + +#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) + +#endif /* GLX_EXT_buffer_age */ + +/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ + +#ifndef GLX_EXT_create_context_es2_profile +#define GLX_EXT_create_context_es2_profile 1 + +#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) + +#endif /* GLX_EXT_create_context_es2_profile */ + +/* ------------------- GLX_EXT_create_context_es_profile ------------------- */ + +#ifndef GLX_EXT_create_context_es_profile +#define GLX_EXT_create_context_es_profile 1 + +#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) + +#endif /* GLX_EXT_create_context_es_profile */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* ---------------------------- GLX_EXT_libglvnd --------------------------- */ + +#ifndef GLX_EXT_libglvnd +#define GLX_EXT_libglvnd 1 + +#define GLX_VENDOR_NAMES_EXT 0x20F6 + +#define GLXEW_EXT_libglvnd GLXEW_GET_VAR(__GLXEW_EXT_libglvnd) + +#endif /* GLX_EXT_libglvnd */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ + +#ifndef GLX_EXT_stereo_tree +#define GLX_EXT_stereo_tree 1 + +#define GLX_STEREO_NOTIFY_EXT 0x00000000 +#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 +#define GLX_STEREO_TREE_EXT 0x20F5 + +#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) + +#endif /* GLX_EXT_stereo_tree */ + +/* -------------------------- GLX_EXT_swap_control ------------------------- */ + +#ifndef GLX_EXT_swap_control +#define GLX_EXT_swap_control 1 + +#define GLX_SWAP_INTERVAL_EXT 0x20F1 +#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 + +typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); + +#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) + +#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) + +#endif /* GLX_EXT_swap_control */ + +/* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ + +#ifndef GLX_EXT_swap_control_tear +#define GLX_EXT_swap_control_tear 1 + +#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 + +#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) + +#endif /* GLX_EXT_swap_control_tear */ + +/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ + +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 + +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB + +typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); + +#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) +#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) + +#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) + +#endif /* GLX_EXT_texture_from_pixmap */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_INTEL_swap_event ------------------------- */ + +#ifndef GLX_INTEL_swap_event +#define GLX_INTEL_swap_event 1 + +#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 +#define GLX_COPY_COMPLETE_INTEL 0x8181 +#define GLX_FLIP_COMPLETE_INTEL 0x8182 +#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 + +#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) + +#endif /* GLX_INTEL_swap_event */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_query_renderer ------------------------ */ + +#ifndef GLX_MESA_query_renderer +#define GLX_MESA_query_renderer 1 + +#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 +#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 +#define GLX_RENDERER_VERSION_MESA 0x8185 +#define GLX_RENDERER_ACCELERATED_MESA 0x8186 +#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 +#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 +#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 +#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A +#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B +#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C +#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D +#define GLX_RENDERER_ID_MESA 0x818E + +typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); +typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); +typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); +typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); + +#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) +#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) +#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) +#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) + +#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) + +#endif /* GLX_MESA_query_renderer */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* ------------------------- GLX_MESA_swap_control ------------------------- */ + +#ifndef GLX_MESA_swap_control +#define GLX_MESA_swap_control 1 + +typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); +typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); + +#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) +#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) + +#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) + +#endif /* GLX_MESA_swap_control */ + +/* --------------------------- GLX_NV_copy_buffer -------------------------- */ + +#ifndef GLX_NV_copy_buffer +#define GLX_NV_copy_buffer 1 + +typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + +#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) +#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) + +#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) + +#endif /* GLX_NV_copy_buffer */ + +/* --------------------------- GLX_NV_copy_image --------------------------- */ + +#ifndef GLX_NV_copy_image +#define GLX_NV_copy_image 1 + +typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) + +#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) + +#endif /* GLX_NV_copy_image */ + +/* ------------------------ GLX_NV_delay_before_swap ----------------------- */ + +#ifndef GLX_NV_delay_before_swap +#define GLX_NV_delay_before_swap 1 + +typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); + +#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) + +#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) + +#endif /* GLX_NV_delay_before_swap */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ + +#ifndef GLX_NV_multisample_coverage +#define GLX_NV_multisample_coverage 1 + +#define GLX_COLOR_SAMPLES_NV 0x20B3 +#define GLX_COVERAGE_SAMPLES_NV 100001 + +#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) + +#endif /* GLX_NV_multisample_coverage */ + +/* -------------------------- GLX_NV_present_video ------------------------- */ + +#ifndef GLX_NV_present_video +#define GLX_NV_present_video 1 + +#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 + +typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); +typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); + +#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) +#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) + +#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) + +#endif /* GLX_NV_present_video */ + +/* ------------------ GLX_NV_robustness_video_memory_purge ----------------- */ + +#ifndef GLX_NV_robustness_video_memory_purge +#define GLX_NV_robustness_video_memory_purge 1 + +#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 + +#define GLXEW_NV_robustness_video_memory_purge GLXEW_GET_VAR(__GLXEW_NV_robustness_video_memory_purge) + +#endif /* GLX_NV_robustness_video_memory_purge */ + +/* --------------------------- GLX_NV_swap_group --------------------------- */ + +#ifndef GLX_NV_swap_group +#define GLX_NV_swap_group 1 + +typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); +typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); +typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); +typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); +typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); +typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); + +#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) +#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) +#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) +#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) +#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) +#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) + +#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) + +#endif /* GLX_NV_swap_group */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_NV_video_capture ------------------------- */ + +#ifndef GLX_NV_video_capture +#define GLX_NV_video_capture 1 + +#define GLX_DEVICE_ID_NV 0x20CD +#define GLX_UNIQUE_ID_NV 0x20CE +#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF + +typedef XID GLXVideoCaptureDeviceNV; + +typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); +typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); +typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); +typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); +typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); + +#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) +#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) +#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) +#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) +#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) + +#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) + +#endif /* GLX_NV_video_capture */ + +/* ---------------------------- GLX_NV_video_out --------------------------- */ + +#ifndef GLX_NV_video_out +#define GLX_NV_video_out 1 + +#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 +#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 +#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 +#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 +#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 +#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA +#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB +#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC + +typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); +typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); +typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); +typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); +typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); + +#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) +#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) +#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) +#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) +#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) +#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) + +#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) + +#endif /* GLX_NV_video_out */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#ifndef GLX_OML_sync_control +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 + +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 + +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; +} GLXPipeRectLimits; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; +} GLXPipeRect; + +typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); +typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); +typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); +typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); +typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); +typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); + +#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) +#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) +#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) +#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) +#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) +#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) +#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) +#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) + +#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) + +#endif /* GLX_SGIX_hyperpipe */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT +#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; +GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; +GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; + +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; + +GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; + +GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; +GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; +GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; + +GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; +GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; + +GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_no_error; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_libglvnd; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_robustness_video_memory_purge; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; +/* ------------------------------------------------------------------------ */ + +GLEWAPI GLenum GLEWAPIENTRY glxewInit (); +GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); + +#ifndef GLXEW_GET_VAR +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLXEW_GET_FUN +#define GLXEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/Thirdparty/glew/include/GL/wglew.h b/Thirdparty/glew/include/GL/wglew.h new file mode 100644 index 0000000..2097c0f --- /dev/null +++ b/Thirdparty/glew/include/GL/wglew.h @@ -0,0 +1,1447 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2017, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** Copyright (c) 2007 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. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(WINAPI) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +#include +# undef WIN32_LEAN_AND_MEAN +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------ WGL_AMD_gpu_association ------------------------ */ + +#ifndef WGL_AMD_gpu_association +#define WGL_AMD_gpu_association 1 + +#define WGL_GPU_VENDOR_AMD 0x1F00 +#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 +#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define WGL_GPU_RAM_AMD 0x21A3 +#define WGL_GPU_CLOCK_AMD 0x21A4 +#define WGL_GPU_NUM_PIPES_AMD 0x21A5 +#define WGL_GPU_NUM_SIMD_AMD 0x21A6 +#define WGL_GPU_NUM_RB_AMD 0x21A7 +#define WGL_GPU_NUM_SPI_AMD 0x21A8 + +typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); +typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); +typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); +typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); +typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); +typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); + +#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) +#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) +#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) +#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) +#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) +#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) +#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) +#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) +#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) + +#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) + +#endif /* WGL_AMD_gpu_association */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* --------------------- WGL_ARB_context_flush_control --------------------- */ + +#ifndef WGL_ARB_context_flush_control +#define WGL_ARB_context_flush_control 1 + +#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) + +#endif /* WGL_ARB_context_flush_control */ + +/* ------------------------- WGL_ARB_create_context ------------------------ */ + +#ifndef WGL_ARB_create_context +#define WGL_ARB_create_context 1 + +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define ERROR_INVALID_PROFILE_ARB 0x2096 + +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); + +#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) + +#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) + +#endif /* WGL_ARB_create_context */ + +/* -------------------- WGL_ARB_create_context_no_error -------------------- */ + +#ifndef WGL_ARB_create_context_no_error +#define WGL_ARB_create_context_no_error 1 + +#define WGLEW_ARB_create_context_no_error WGLEW_GET_VAR(__WGLEW_ARB_create_context_no_error) + +#endif /* WGL_ARB_create_context_no_error */ + +/* --------------------- WGL_ARB_create_context_profile -------------------- */ + +#ifndef WGL_ARB_create_context_profile +#define WGL_ARB_create_context_profile 1 + +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) + +#endif /* WGL_ARB_create_context_profile */ + +/* ------------------- WGL_ARB_create_context_robustness ------------------- */ + +#ifndef WGL_ARB_create_context_robustness +#define WGL_ARB_create_context_robustness 1 + +#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) + +#endif /* WGL_ARB_create_context_robustness */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_ARB_framebuffer_sRGB +#define WGL_ARB_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 + +#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) + +#endif /* WGL_ARB_framebuffer_sRGB */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* --------------------------- WGL_EXT_colorspace -------------------------- */ + +#ifndef WGL_EXT_colorspace +#define WGL_EXT_colorspace 1 + +#define WGL_COLORSPACE_SRGB_EXT 0x3089 +#define WGL_COLORSPACE_LINEAR_EXT 0x308A +#define WGL_COLORSPACE_EXT 0x309D + +#define WGLEW_EXT_colorspace WGLEW_GET_VAR(__WGLEW_EXT_colorspace) + +#endif /* WGL_EXT_colorspace */ + +/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ + +#ifndef WGL_EXT_create_context_es2_profile +#define WGL_EXT_create_context_es2_profile 1 + +#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) + +#endif /* WGL_EXT_create_context_es2_profile */ + +/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ + +#ifndef WGL_EXT_create_context_es_profile +#define WGL_EXT_create_context_es_profile 1 + +#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) + +#endif /* WGL_EXT_create_context_es_profile */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ + +#ifndef WGL_EXT_swap_control_tear +#define WGL_EXT_swap_control_tear 1 + +#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) + +#endif /* WGL_EXT_swap_control_tear */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* --------------------------- WGL_NV_DX_interop --------------------------- */ + +#ifndef WGL_NV_DX_interop +#define WGL_NV_DX_interop 1 + +#define WGL_ACCESS_READ_ONLY_NV 0x0000 +#define WGL_ACCESS_READ_WRITE_NV 0x0001 +#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 + +typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); +typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); +typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); +typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); +typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); +typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); + +#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) +#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) +#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) +#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) +#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) +#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) +#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) +#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) + +#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) + +#endif /* WGL_NV_DX_interop */ + +/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ + +#ifndef WGL_NV_DX_interop2 +#define WGL_NV_DX_interop2 1 + +#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) + +#endif /* WGL_NV_DX_interop2 */ + +/* --------------------------- WGL_NV_copy_image --------------------------- */ + +#ifndef WGL_NV_copy_image +#define WGL_NV_copy_image 1 + +typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) + +#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) + +#endif /* WGL_NV_copy_image */ + +/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ + +#ifndef WGL_NV_delay_before_swap +#define WGL_NV_delay_before_swap 1 + +typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); + +#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) + +#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) + +#endif /* WGL_NV_delay_before_swap */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 + +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 + +DECLARE_HANDLE(HGPUNV); +typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +} GPU_DEVICE, *PGPU_DEVICE; + +typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); +typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); +typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); +typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); +typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); + +#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) +#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) +#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) +#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) +#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) + +#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) + +#endif /* WGL_NV_gpu_affinity */ + +/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ + +#ifndef WGL_NV_multisample_coverage +#define WGL_NV_multisample_coverage 1 + +#define WGL_COVERAGE_SAMPLES_NV 0x2042 +#define WGL_COLOR_SAMPLES_NV 0x20B9 + +#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) + +#endif /* WGL_NV_multisample_coverage */ + +/* -------------------------- WGL_NV_present_video ------------------------- */ + +#ifndef WGL_NV_present_video +#define WGL_NV_present_video 1 + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); +typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); + +#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) +#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) +#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) + +#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) + +#endif /* WGL_NV_present_video */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* --------------------------- WGL_NV_swap_group --------------------------- */ + +#ifndef WGL_NV_swap_group +#define WGL_NV_swap_group 1 + +typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); +typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); +typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); +typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); +typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); + +#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) +#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) +#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) +#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) +#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) +#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) + +#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) + +#endif /* WGL_NV_swap_group */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_NV_video_capture ------------------------- */ + +#ifndef WGL_NV_video_capture +#define WGL_NV_video_capture 1 + +#define WGL_UNIQUE_ID_NV 0x20CE +#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); +typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); +typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); + +#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) +#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) +#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) +#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) +#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) + +#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) + +#endif /* WGL_NV_video_capture */ + +/* -------------------------- WGL_NV_video_output -------------------------- */ + +#ifndef WGL_NV_video_output +#define WGL_NV_video_output 1 + +#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 +#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 +#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 +#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 +#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 +#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 +#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define WGL_VIDEO_OUT_FRAME 0x20C8 +#define WGL_VIDEO_OUT_FIELD_1 0x20C9 +#define WGL_VIDEO_OUT_FIELD_2 0x20CA +#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB +#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC + +DECLARE_HANDLE(HPVIDEODEV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); +typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); + +#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) +#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) +#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) +#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) +#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) +#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) + +#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) + +#endif /* WGL_NV_video_output */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT + +WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; +WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; +WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; +WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; + +WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; +WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; +WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; +WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; + +WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; + +WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; + +WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; +WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; + +WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; +WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; +WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; +WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; + +WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; +WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; + +WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_no_error; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_colorspace; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; +WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; +/* ------------------------------------------------------------------------- */ + +GLEWAPI GLenum GLEWAPIENTRY wglewInit (); +GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); + +#ifndef WGLEW_GET_VAR +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef WGLEW_GET_FUN +#define WGLEW_GET_FUN(x) x +#endif + +GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/Thirdparty/glew/lib/Release/Win32/glew32.lib b/Thirdparty/glew/lib/Release/Win32/glew32.lib new file mode 100644 index 0000000000000000000000000000000000000000..b7f027dfdc0ecb16076d8790900f2879208f323b GIT binary patch literal 712098 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

    ;wL<2KVxaXKyg;^z#Lkw%qTAMlOmrVME1y< zD5g>}@~C`DYJ;>96gtm79iT5JS2UX=JNFZL}2YOv*B9 zO`(|M&w1QMe&E`FwGjCh4$Z31`((-&)h&rmVD+p*H;!NM=qqjpztp9gj69-W^vN{F zZXlgjhag|smpr2B*{}kP)smvQ^<|fv`q-%=4d2&$S8{5J!TIYeKDk3Pt4-BAolpTa zRq)oaZ}6)wl}Z}STishE?Q0=gRQwOBkot9(M!_yToW}lBqM)2Cw9VWM)iVm&R^RYi z(QD6kN}TyWiiz~pH(lmxF1=OvTofIhgTCd`Ij0^4{A}j1->8TIME$l$E$n7aI9K!C z$#)=?(r?)zn(CQ_bk%n;JN70+IA?Qo==TIN#dXDvFNm1@zQ=6Vmm8E#hN@A{&Bgg% z(cbq1mrI)gzai^H?%~j=tn-ch*)wkrayLx=~-;H zR_=IPt$O8b60*gdNb~n69+$EcH4nvUL?Gu+!@N?NUUfU=-_>%WNU@)J+N?{7R^qM( z9#V)NJ?SwUQ0OZ9ozw!_&&i%BTN|vJjQlpgm&kbuh;pOWX;S^&R?TuStJ{Dq*FT7D z;OYc{NvEbG8}g45o$3*H;`Uu|^81rSjgH1d@dJOBsOcUYKhuzZ{VyWB$7$2zU(5l& z^Iu(dmJ*Mi@y4wzB=6sRrtv~QJ_j}Or2JiAQ-%+&eH*98gx%^4(xm^uT+hJMYH<|t z^iP+)TxnNkO;NQpWUv1#NGk=OVrsd_iv4$xTQ`V3>AZS`XrCZ_v2y;lay^C((u3}Rex)Rhfo28TE zSRQM`(elx)<5eAg{^T(J-dfQ2{6_g|4wF43ei8+(l<2&9v_njDjHWr+vkMukd-WOu zXr-$==2U2Z?#j$S;QP_@kl zY?@oT%tKTyIR5QA7}Hy2#7lSW9>27-VQl9CGb@uRW}#zxYn!^8ixY9S`#_=~H5Yl8 zPBOXMCdW$iRI8T)+MAV{7fi1nS8#GZ+2T%b?-!70C-bopcESwi7e}YKRPJ87`YC0R z=7G*u%M8}-sUDrqlxeEEv=LEr3;7F9!(7VJ;|KU@<=!l;D1Og(`T#y<{Gj)^)&+=q zj-yJmw;8~1uM~_jhd|u};D!Bd-4>*Iu{fDaXT*7A&Tz?Qma6!w>p6#)brZi@$&%Hf8Fe|?Rh|&rP3`oNS{Q_2o!U> z#caX&fqmIkLxIYaI%dT+T+lbJbJs~0+%^r zyJ4HhE6Q#_7Wj5VrMSj4fIoT_BYSCw+ky@|5&{Q4y}bn1?--)e1G>n}2jHYTZjvW9 zjFqaj`C6BP*|QtWfZ$rag(75jy7c+-;$qZ&ILhR)%cCU?s)BpaGyv4n33eFA=U(XY zDDl8b2}~2JpG(4BDaWi%xYTq8r)rsN{zgfQ?!oT_xV;Vu9wjk)8*!0I-m||nb|8EG z8CU5BS$4ZcV&okFh-{d2n3ZO0xs=W*vtzaM7mes1hgeP6oS99?d{0U|t4y$Z4x^L# zUWc5j{6N^PR$9cIa+s-ub8fEIhRAq_A|<`dWbUQ%E}Yh|7>iMuOB~mH=ZwmNY^z+}tF@Dh zlI5g2*`wKfX|1tgJ^35VMXZ(>#GT#6WOHTlsdk!E(Lw4*7Tg2f)n(4miEFT~qC(TB~%M?G8nDTNnT8{sn8aYLe-#(#|~L&)(L$ZTlw74la_Kh}88Xq|S-d z4Y5?97v^0mrH|(tMKOJgUhXagc!y1xex(47P%~(BVX~YnJx9@M=MIW$xTisE_qVam zbkZSfrO}PkMCfF7(BkHDu5cZJ)qRYzi`Fgj{j|eP zb_CXrFv=#-aEN(goVyEw8CSH_uDI)lizl2FeibXM*TW=HMi zsKyle|C8HpRP{ z6Rb$;;Q%!ibYjoG@!c_0w68Ba)Rbt#)bki=#4AFyZF?wi(nP9z71&Al3KAprp>T`B znTYNk;!SY2Y`e5ykuu)LVa{-LZ{$vjG{Suy-ag6;(BVjqok>!irK>q}FxB%1>B0LA zBF9P%^#A<_v2BH@{49g+21pa~!7a@lvcBddRHi>sc`z&3o4L8V;e zsZlzUMB9eIAMjv@*rmsev%8yFoL1ay2KRFhK~%@#qU~R#^B-z+xA*2KomZ5U=&to) zAzGw#$j*Owh_~HIm!e-KK<7U~B05V`JBH}q@sSeKUY2?}fi`$lh`Be-${i~ySeuWQ zsj;#G9rTzGb(*3Ct;=imhypnuD-xZ~)sHEdyN?s8cIT=k1%3PY5VPYhQ8f|VQ#>I^ z^oCR4v*5JSc1X9i6J4=5hN~#m!A!O$55?=^`<}i>-2>|-V~LT z;vDNynh;nPFS4nb588jorSDlF>5FA%)5E(Mkw>nOM^5^`KkL9 z`LteU^GFHoN*Y(n%6z#;=Df1bK&oX$_QETI#7oG*9kWW1W%x>wD0Oj>bLmw^d-9#N^bx=`0Zh$ z-LdMiMc(#zIK&;CrPdTrO+()HcZO)r5US@5u=3yK@W!bciCa=t%>$b7-2%@MQQfC# zUwx0j%pF>hF#+gI{$7DRleFk$-iq1P^>2z}az*%m=vp?qv-_~Xj_Yak#_J;zF|vmd^P>_owr7F8`Z0&O zlj4MnSwTqBj|Zql=qz+1_yk}&9jxCS1Us2Cgnbfl3+id$iT@O!$E_Z;FMS$OBUcdO zeg<)!LDuRgWW#+nz>Vu&WW#+fM2qZI#QS`R7ulOgJAA?6t@waywi&J+LFDuLqRFgv z={B~IJ2G(p`z4X+1w5+t5jx3zS>!rHs;3HCkmDY|B2pvA6!h>{ZRQ>t(yB19dRYPY zYX&!so!VBd@@uX%p1>AY%|%-1>n@k$38HLKq!qpqqD5*Ubjtds%bTL>-5t%v#afqd z(PPQLU;8beoL_s^JZGX>Cjr~++b(xHO=UXXD9_eM7cKl9mpVgn?XlSfz={340xwn@ zq4VqaB<5kdT&AZYv25hS{Jy}ROcouidM*J!%nv+jZ`M^0Y91KX9|}BYnX2_4vKxN1 z%G^<|*I74|8`a&l&IsS<{n%hGB$b24{xZ`ocYBsATrDj+kN;#4IdV3k`?{YxYE|%_UA?mxVYwMeYU>{(VT^(?O$XI|I*}9MzQRABU)R4Q|hmR z#2H^jsYel6Fux8`=d6R9x?h0~{!N${RT~z`_uC+^7RLj3C%+5wdNxo$g5X~H_YN^# zhZ8kt>8r;O>}!7r5_>LEFQs6Aa!sp0hM3mldbNaLmj211jU}z_Le)ODsChuTKZkf$ z>FpwEe+kjz`VyQ3|LV}veKM?0)iVa2mHvjgk?RAI|1OgQ>Rdars1ox(29h1I3+?fL zhUkVd7`LmS9{<-Ma+JPDH$Alvu94tt8z-SVrAdVWy$ zHUq8XXixv2L#M!xG|t_0^Qd`Xzgu&awAL&C${lsG1^c|%wS?lIkMNnKJ3KMf>ldBM zkCd5?sOsJY9-gC2YK^^E70!~DNAtvtDT-yi3Zyy*3w1A}wR6=lIe)I4#!@*6BecDZ zd0Z9Mv>*OLHxQ#sOg)=CVbyVQ%J<$P9E~ z)?8bpE;(5BI11DgXg9x(OI?UNZJ<%SuE$!kVd_ytHtDerZR6aYG<34K(L~zzdIRaB z9M$W)^bwBg4Lnxts3Ke8hAyo)n=Q`u?&8$05){93Bbn+Bqk0Y_X>TlXJylesv^SBd z(b8@d?x~L>U362IYpHm(guu^oGl#U3HACc01sccWT;7$EbMttSI?9}zCy3POoSVWv zb_&g%n>*CWa_3+k;pG^Y+IfU_v|9wImJ3_24Zy5DF+_`%PUus%4c0omsSQ0#xFUP< zmI0RKJW==LMj+X(T-wIbNp|Z1D^4Uo1aK&LuXa*gccfRLC|7V^fNCh(j^ua*(%w9_4?C!m^!dh|9Snj@ZewxTH2 z+lF{6L5_3Q!c=pC*Yu15Tza8sP9k+5Bbm>H?9q9O&lK7wM>TJ#O}#+S~}#asrKUJAoH{>mZz2IOExQ0&}84`J$_dgVsum>eS!fCUX!t zSKi682&ETV>&6^ILp{2Pe}{qm^&{n8t=w7Z|xOX7kUSw*?g?k`=wLK-UIrm!Fa4V92@gRD%#enXOrw7ra ztp!A%0rY}2oN(G+N8`S4D0;Nb4rbmZL$n}L(*gPS4@DoP{Fe^Vf=G=AC17A!UEJpG{BK<+Vs8!a>F?eYM& zb?u{H&%lnF9Yl7-R<9``BJ?!cPb-)mb(fD`cvlB-9g+3@4MsW{z#iR5&kZ6wVrxel zy}q6|*{$X5l@l3k(eFlu7z&QKSpZCXgDg_gnoUg~9g?8lCAFFg_je4|~PTJ((<*n4|`>^V*J zG6O4XDNJ5YV8EhpAYn?1$yuS_dzn(n^J0dfku3Akh?osO6nc&>8E;pkx%C# zLGtSQ9hFb#p#!+Fa~jF~FvyOyo`E0h;RCp%l=%^m9jCXDN9U0PxY06${(h9nUP{{J ziKYT{-Gzxpr(14R5+^;5dR?KY-bV}UNSz7JW{+`*ROF<2km4^3lo#xYj}_^05~Drw zaSoHhO(&bxUOg>UVPn-}i)`n|BW~(uvEkaC0@-&@FxXVYrkkwPQ9m42=LXN6D_T0t2q`f@aw@^>>xLMuGC|d(qS5FssSrQ&=c`N6>j&H& zyiB0ZMN`q8)XPn3yG^rqs$5UH-GnNCw`+%;O;)R^HVX0{PkX>CR>^#6&0DK!Na$A$ zuuNZRu#(x{{3JaM;(7*@w|ur-IT*!7z56Q6jjdG&USqs^0C{@5DYSN6QFPU71af?K zGPLi#7E+yQte#tFr+;0ToYjqp9ATszUmxa@lO$I$mQo}1=g6Q)kT03v?s2wtBCd=)ENxL&rdEe@iGY>^p zc_prw1>LxocAmF|sg^;Z)`)_K@7Bb7yTFUpO2|j>4wqS^F9!G%-|2F9Cgid8FGJM* z3vA+dg_*W9PrXjjzW#2Hn5Xy3o^wZLRYe-&JpppRcA7PT_40!Iwf7>bV-#yg7M(rb z=W-{f#&=D%lWMI(Ws>4`6Vi(B_t;mKfA0e>IgPZSdx2VGK3Zphb@agyx8rQ;>Uo83 zTR!9xi}8;LGIB2S4|~K4r6uUldxzZ77O6FmZ|@^6n=g4BM}>OzfK~fZk4Jvu$!4R* zYsVQ@Ef?)Q9}97>1poBMJ??1z)1MG{1$l|VF8fJ=+;P-{dQ^cG^C^ir!WHvrmsx~2 zT<}SpOxocy0QyS-T%AaAe#xW8-*X`E`&OND)CYz?WZAHT>gKskN?c1b<357LOcy9;^gNp(NFcL*E(Qj{KDqd>SQ@_N+)MsK=2FiH&OM_YKa9->kbuO&M6^WB@GJdtpXgB*6;zw5rMHbVqJ@Qza@`kkY zB1{+W*lQ(1S4)jzNq^(9!(FXit!Siw>oND2+qH6|YYe!viK}Hs{rx+iPuHBu;dGPR zmR1%sC%K+2tSrt>_4~nWM|5@13tE|TI{X3AW4XeKnLVX{l(=bUdq%3h#{v6KnB8ud zmq#|*e;&+^^s=F-n7?>*D`|(imp2JBi}(A#`mD(LgwE}M^J$T`6FP1D-J(^>?Wz$J z9w{Zd(fEhOZI!!~1-f~qwD4ANlUhFj?etHPxU1dlwPtEpMCV)1R5s-d;{-y-aLn`kv1Idlu0iLUMkGy+G# zRz#D99f@t7t3a~7U8r>l@MK)o<`x%)B*@CU@6|#~D}+NWp)j-f{^RH%Ep{~_zuVQr z#C>s9ZxHbsLEoGxMF{d%K_gyo{jawhcn!1+F%VWtp+p1MAvJl5bBYN#H*9Pi! zAF!sb6DFn(je_I_p2q7UdaTrfE@HiVtj!&-CtQFfJ6lgp?H-TW?@+Ax^#Ipa6k1(~ z_P6T?sU6b14ypWt@`v!x^j0qnvoS)up0P#bQhXoEB9)hiC!^v4a+4u8>W z*WFfOG|s1l(NtvTWU)tcxL5>^VId2T**i(*@WPQ14m(28ibFhkgf za^e8Cz42@3CW^gSYm?J!W4QUN*Cy)oTMnYzCV-la?oe(ev!l*nsMf-*0W)lTsK;8c zExFdhNkh?N=Q*-KP6jQA<_ha;ElGZg&CTPfB3Bi#rcZTvZY-5)UKTmRrw!oty;oJU z0qRwS;+jq$(1OT52j{li3?S3%iKM(}3a;(>EyAwK*3NB*q8HQu$S-h)-H!bS(_Fi8 zy^b>bp1H~!ug)hs>*e{K^hUDm6v0)`G4ulJET1_QEP1Y`qBG;!A~jIqM%(DQlT%e_U@c8$$(?sOdm!Zvb>Rltj%Hb|<#}Ho9CGNTMa9 z)w{_hhaH#d*^I_`v&$S9MxvD%?N3`gItn6DlZ73Ey%AdnlA|pk!S>^N2Im5LEEo0n z?F4Q(ghbunU{#$5$!-9NnhZwz_5;bWw=Nq6JLotX={vY|D||#NCyM7d-y_A&q>aKo z_z5J}9X(p4RRdPb1tzOX5q;Gf7sM*pvo}(v5vkXW!rPtGNycrMYYVI=gVnNq5ZOw3 zp`AtOOt`}$Q;bep`aSrJUM(@Qs>UqtUh@&~vfa^YX@%9v)mFwWDyMDCpX0{9#s$os z9y9zDS1TuqV%udgQ(n}nL1&%|eU|6i*UE;X<|YC>+nKMX2{%Uk{_IXZEw|Fl4pkEc zJDB4VF0zO-m86k4id{_;G|yV1?Y3z9YIVwS;08~tc|f;M+C1c%QR^FI3GKn$$R0)~ z*S(l*D?7E!=%hYnk+WNt;BzlM73jN*ZECHWG4-5*P?nozTm|6_lc-EpDXS%g;Vr7qJ5S@ytcX*Ubj^*JAzEIbqweC8Gqvc6tDaq8jPL3)=^iAlRI-xa zwB{`-HD9nRIL7F10e-(;NpxR>xb3?KxV#&9ovmL{;4D|Ns1qG)LAm1U$%2K$_k8!T z$TY~=OUE>VZ7;o0YtxQci*5lrTa~RAw9Az)KY?gAD5NaX&Osi6*;Q(qb8f~-3!$CM zC@!%QV0rF%^{AqAa@8P`Qm#{v&ej@9d!j*aOCtAR^qwWLxV6s0HqH%6Z%X4l0>GA< zbBXC_7SOxGPOz5N%zTh(cdL5-0R6w<^77Zn(Xp0*S#z2BJ^0Ked!oh?Sv2=Fn3QF0 zfsE8vQq9Bb%Z+*KQIvYUpnHacgUH^5(vB~xG*cf$kJN)m^2H$ADAt%p`IyHNwd7#; zX$(bo#Mh5Jurr!Y3#Mv^lR9S@PvwqW)4)^Ha=6pwPB&@CYDyHnb-6>#PS|PGb}Fkk z#r6Fx=uEbr+XLv4Jq>n2Viu&J~Kau#;hcCChCdA=+y)4)+Lcz zM4SV%-wyd?D^N+RrBH5;!vR)ouOeT~a)1|^BS%=7Y|UH|qB-JedlQY^y?kC=))--a za(=se2Uw11YAuIG?mhwD=tl0oA(|tecI41q#{GPrQ&?F|17mmp0L@8Hr5-yZ-2*IM z5xH>CJ=6m&+V1jlAbGyFH#Z7#^EaWD@F0t4B~DWJ;znWTyD4!VY;&y1uayURdmmzO z@@wE7&3dy5g$6gr(f+$Zm@ z%`bGR7-v$Si|%hA^CKX6l)e2(NOnst6*<2jg~_ha`uQzrUXCnzG-A8Kje0T|>Bm5_ zE3~@50r|0zJj#)N945O$tNR<>TRmQ2yUSVI)99q~1c@0hDe&t*QKGs-tM6ao7UdLL zNly}~uCVGJ2EMx|3siUMs+pjFpCU0`LG}F$s85xsBOTSJiBwlubq@=^GLFi9x=-yJ zJMMB-_c3~r{S3g3l^1cJ3Apa?YWo@4InP2|S73Edqg$J2%Vc-ys=27Ap98qA!0Mg` zzSrjh?kGq2d5G%@tnX=HSv}t(FDCnv_9ETSQH7OV)8mulW0#rkK{XkjH(%h8@7!#9 z#p%>zE1WkuqrnRu-fVAfE@^X$uIxT1`n({VK{;>6iw3aWblz&Yg}s-vf4(@#-kDHl zzwKqZO;6hHWxAR!>=AsM|B^7hxs;SSCY^%Q=W1TSqEm(;jDIlH#XqJ}+ zTd@L1zV7ZE|^fY+{kWwJ)*9&gjI9VT6+WL zI@4V{*O0_-MCA3OllV=T8!0i`*WQfDlf8PEQra)J>aJo}k2vc0x1d&R7+t@=6>}r| z9i2_yhRCtn6j%^%N8DI>1q*_0*LNW9&T=I>J2POva}YaLZs31?7hM|4; z^X`FUXPT*3G@`#}Al>P7Jsphrdk4~Ob3xnhTZI*Ndz$I*Lu^Bzrhid!WYOmAnEn1-%Y6%hRLmn&c78>>D zhgVsTzqw~=a%~4fa=};8=$1I*us9i6ipdt8e z>Bj@aIDLdHjZfG#>uq@_at)%G`A@psV1ah^NP=6FPl?3ny+#;Ke$n%3i;7FLtECmV zJc~YKaXGR%wwg7XMW3~3R;GYj;yk(3N{MvO=PYiZRJeX+f*JIAo3@&n!0lQ+72KwN z!KP;Ax`XAjwLOdU-WNkuw{*5%PQeylOEdOML1LWdLv!cL7B5gVTQ8kpb8?P?uY_pv zIT%2Helo;wh zR3Ka5uVC(c%VsVw&Nl0@_eV(EeB0vXo=X>~mJsb&-?52qjtk3x)s80eUVe7~H%{Ln zi|cz9*?0#NB`fmVeP1NTzq&!^pdW}__nKQfvWWV_05yNI9;=IlTQ9Cz^COE&5wYE5 zvesHGx8iiJaM#QEnSLx0Bc(*K$3F=$+4oGEB9k_jEoghT;D73~a|Pvhw01tBSnr<= z;5s7fwIlEh{oG`Cw^h1Swsl*#xmc_0pvvGBYn~nRYgVAUx&=sE{UX?cZo4*XPHb&| zqg%9JibTh~pq3Nu2fqqXDdPiGCG67Ebw0Pn$h#Sg@vkBIl16Qg-V3@7(915Ir_QF8 z^_yW@5Ie_!W%b(tKbPC=bhXTAm-wB`bf%ehZX^Bqdzreu-mDyShgr=QY)O8*@rMCy zdw{iMWPkioCc6R`I>vvJxt&O9h1GO2_4A(tR7xDYOv&PGqq0z0|6)@)X>8`jr-+BR zEZArj{Z*pYVyWoN@Hd;$QSZ#L^mxsm6PjE%`fw;BHqacd>ZtkU)`it_%C%}b+G zSK|XWZ?wSb9!9$OzmOcqMfTPIFxQz>>b@2{ejL-V=4vZ7dRNo(mD^;|k^S7OQD@s~ zS<6N*oQ?>wvjPxSSF4#|?H&o3PB-gk7O>)u3UJAS=4>XWn$k0Y-|;Fk(-BqO!-6HX zmL}9yE$WVXtu<9IHxldex=7yD!aVB&yGY*AHjf|n?&A^{<}j*xVCGz1;6VXy_1;B!6^yFjb$kT>y0E`PDys9s2qQ4%LvMWIsP z*rm3(_IOfFqY24tot8R_)iuCZeiMP;M~_Oo-*f=iG0OCP4($A!$!t!cn|67W+=6F- zJ*dYG!FGmQFFW8LkNN%7#isabJ~~yN;P4wu%{n>Gn~j~dI-Rnjxad@QbIf(RT&q`* zC-)W-+0bgH*lIQy?GuM!JEE&c8_B+QAm29Pij@79L$IS|2Yr7lho2=sqAWzcdiu&P zJt)~Gjk@pAes*h%KbFk)<|k=uq3v{cbKabAYAW)}orI{7FX|BYWXO$-p%UyS_J5w@ zaJ%JNo%YU9S~hh*BRzVm&29GR)GfF_^;{t{0B0&ZEx>i$pL(9KS928J>0zF;aMgN4 z@GquAJkvqTT6o;kK-ZT6JR2 zzVXN!Kf+0ms~)a%*oTv<F@eRIt=8MDdb8XW)TEj!oT@mMe}hkTl%$#_cqlod zY-5n-s7SSzLbqU>f<$}K6e;0mo7bE#W`7lS0gjE{;u6EDPxZYDm|JZoz3kyDk#xF7 z*=y)t{#=>qOd$1mf>n9DAhn3QYIK)+9;7>bLjEi&QoyO-ni#ds~epz60Wt zL)R*iQK-b{%jDW9CB7r##!D<{VZJB2AV^+Gedh|T?`^?K=9}wn1K6(M+O>= z4R)b&?-;<2l^f+y8gtqG_mJDtFe6^zD+Xnpmt%|IWjL2ceq7axXdNfCggu)(rIxJp zf|pXK(7CW{AU|#tHUrr&9D*I&_h=SOi2NZ^dg(_&IMZ=X<~vy}+0`z$7HXBwbka$> zT&t~TJzde0feyTA5ZSp>(CR=`d1JT5zK|}C>TUuQwXBFYY4d8GZgZaEl;W&Jp>Np> zvnR}RrnI(4k-vU#m}uw{Q&=@wu)^8@Gc}Oxh^-!3B=^Mw=#e@M$UQxf94j~SKh0S5 z^a?JxjI<+-A|3WgO#2|KA78;=%=he<_{@F%r;NtrzHrK%-i5Yc|1d46Ek(8fc@HkN zThN$m(v3u{b_Uw(fWzx1^GSR2##oOGi2J)NOpNn#3HArSB)GG{i+{C=PPKOlQH%1f zf!@7qh#Nbaf@Wl2(A@-Hv_1qLlDmhP9D_`9+UiNI5y1XIur;vyU0qnYoX>mSrg0Kyy0q+c3mjcx zhh_iMf=n-Fgn{HWnO)E*BM<96Eqa!#v=7SUT09xW9@KquJE_(x zlr%hAV#HnaxEJ?mey4#nz1hgM1!i}{=9XLJ;iIQ@hPfWMBclka<^c96_r{jX&ch(m z60wmv!qDD$xyvoArxCR+Qe*oVorO9Mm0}>NDxkelsP|#PuH;DjuFXppo9+Dh?@A|o zE_*E>RaNcT{90qN9QQg&(2yLfv=m@P+w8*Go@2od1$ZmH8v9BJ*f@tV*AZDenn)ur zBeLzP((iph;wvyWR$^iOa6HMqY;vB`X1uW!eUFQD)4e5X^jbyK`vj?!sJ0qwHzVqO zCF)3f_CU~rG3ytw32h**?ntE;vo^Xyrc+?Q=QEIkF599|DN$AI3 zuzL9h{xM<;0_i05WN=P?>>#q!@#=9GB5pb7-{T~9AhCp+3!=UrKY;6qtnTkE!Y+Cq z$@~PLy_2(*WcAAih9RljvQ@Ci&!@ILQQsD)YqX=XMQF`NYR!{iYgUw?7m%cF1A5c_ zJ)ZW3ffB_O?(fo;GYNe8Wq< zO3>Snrw`cIzNJADzc9dEje>X4MN0f4i)@yr@={x>S2gPC7mHjk zxuu>ftYv=p^^yR0cX>9cn?VbDB3QRCm57eA(2gpaPcI8FR}>`;Y~;^6H6^EIK92fW>zZo9=|?LU!%s}zMLO=XioHV?)-Fe^zdpch zwxfxH=ZRx5-{29)%AJL6oL@P19sxPu=uvkkjrs0^jZ}}O;C0|z&Nq3)$%MioD%0i0 zd}3qudyjC2<0#BG3tVRs>6t**w|Gor=ZTdSaNjC(-G!=`7xeMlJnl@ZTqz(QInWMo z_n4GFr3gI;nC}pnZs%&(4YFh2X)`I=LSC6;f&$>ZgbQl2pqbbw{w|L^*=*D(S}Sh= zzcP1H^QdPPdL8%f0etR&XuhzT_`dT!1NiyTb273nxuB)ll6>!g7P#dIiyZy;N$g!z zvZPgz?1C?rBXHjj`O%UCtMUULIW;KLqzZ0=6LpV+(f(kVJ5k-f%vW*oYaPh^A%R_l zjzONS58GURb{cxu6nRcWE%?ZAEg%O(%$W_f;G@H|z;iHaXC7+7$A)V`WFMe7|Bu@( z$gUiVdJ_aJmrsPa^j5~1aO!;xou)o%GuzF|wrZ8rx5j790+N2prSi+)?Uc-_y=+cw zwWR2c&Zk363VK_yhO5zj7{OZOw+){eM343YA%DncLv%J-oHUBsb&OWg=fX@14xTGl zlDOLeln49sA+CK<7eCU1kDjBGzc82|J=Vxl{bGophR+x?J@VX#_+J{#cilt!bq;K` zFNgS|=;|2{$X|hES7aj;_?YoE^xz>>V@VyW>Eo)#ywX+Oarr!@UIeTs7eHn^%{eeu4+%r)woF9g$ zcGv3Xk+5Iz&BBkuyx4vP_q;z26C?W+#pe9PBBoxGtbTBIsqO|3tNRyeh@TE%TcN{x zvM{pjrTZBsr-8ds`y#M^em;n8iLKTZ!s&`*aem>G^YgmBh}2BMBh7bZzx0_!%`DKz zze3b)dv--0GgPcqq>&e|1(cB4N7W_&**d-X4f zY)@!)FQdFAfAzWcMxdr`682oSrv4V9c^#`AQS{>e??Iy7p<3Q%K?n1R_a7E-h;UzZ z|00jxKZl_^i&iZ?&=&u)_*p)u_KHV|qW(>TN-sIs?f;F*6y9Z`)iQ$}@IR1jKQ=6q z`(Mb7lvmgT*=zeho0}|B(${8twQ66w6-Lf6bnaYpv{|=#CTURy9x8`ZL`5+$%10n- zth9nYVVmwqo4ddT3IlFR{aOO{#!&(0R6D8EI7)M8nySrQOlmgTA+8c&&!mn@6RBNC zXg*z4BszzDy_~{);+i2>3s581tU%-Ul1IC=b}MNJg{#zk3-ROq~OJ(rg4-^En=0W0?UE_Y>Qqpee+Z(0A|08wMD2f+7(8ZV_$D9lG7}9lmawfcOaj|O+!Vz(Sbj+GktZ*GOzvAY#mYquUqcEr}tHeeZ? z1nH69BVgs8Jb*h&nNNXidugln3Xu8K0o-Vr!7Mv1#LgY0!OdDf%fQM$eIVW5w6(pC zcF@}d*}YkB+g3}AsJFGL?Q-QHr6p+B4!e)O)KnBXeTGYIbofNRGfAqm)PnsKwN3sA zbK}>EC7s20S{HI$3)Y|N)fmQvh30NBCK8NiMt1B+qZ0J0^r ze!hdZcI$m|z1&TzGpV0C^V@pYd+HV-Kf(s91-S=od%amX=mmDFx#)f8#vr#hHt6D1ZqwTV&bok)vUulY(Ec~{ByDVXR*@t=I0DAmw78>b^5WS$vXDBZ9P9bhF zRk45<>7o#|sCrm{yF0|~U$r<3Sv#|l)j#QS`B>ezM{O0U*B`=u$Jw^`*xZDRVC`)s z?Q)kQW87qida_`{uy1y+LvDAI!|77aqxY#)WR#{xmg&?0b|hKY2l*}d#WFdq=ohcG zkvCy_06kiF1IcG3cD}ksEBU?w^jOJJ-G)mfwmr?%s|&pp-5+A6W#7c>e$r*pMZq8;V&2D9FrE!VfzTMOl#Wxl1Jow;OB zln)j}0XzY4t0Uw-5pd^5$bAyv)<(#EGT?S%xx&89Q4dc6+@3qJ)T;>DDo;gZx2p>! zKMj%H&Q_CAc7>;}l2^`YF)J5&aGnuhIoEP(+0ZTIGgo;N^YvzvLzL1a_wlhaf(5~m zXwNdJi*^5N3-0A8O7c4!FQF}4w2fAHLM<>pgcyvm~;|z0=yq6lh1|>Pl(t$<# zrv=-Cy@)S!c|A`&^=v|CqL(|oel2UKOZ80P^?!xK%wr}TqileD`#nv1PwBWbwLs`R}pyiw!|rmuFX<4Z)GEVmCPZKsRXTolpw z8k0+APCY3vrB@t$`MRS?Lfn*2DEs}GN|it6i3>QcF0s}eNJ zC(pI`OkvgijiR4kFLUV?or~7aYjo~@Lx{YSu2+)T^g*a8vYIQ*Y_4?q#t=8HUu3{t z!PR}fMeqe~q!zqsm=+Y#`@rUTbEpl(H2T0C0JZ$+JoA78kfD)jQTOnsWo{JqjN@sBz1?JHS|n~X1wR&NzisMLm8fujq$OX1YgYzKFiUanziiEvyZW4gbghcI3!{Q_e?C^5oR`E=poe zX)@?GBzDI_yX40#YU**yp4&PDtewMXy?oqcvIXcASl60ETikXUd1o52 zS{AYlz7Sx=YWGb-pR&#T#Q-m^Cy{RbQh+v<7jKQ}(T#!zIF2OzvdK&rVGIe4-B&zP zeC{k{BY)NB#cERFoX#;AUo&ZDVH~qN)fx@Wmaj|15$?p_FqwINM^ixcS_eJ)O^emP zZE=KC_bA#UzGV^9ByXm0dX`|loj~*D+ZL-!PQ*yP0xXN~Sgc-)FAJ0E^!ToAyW`{& zm^UN&zH2ebnG!`pI{JGq$veEMXC*i*e&3{#FO1#Yv2zk-x%okWSMcdZ@TYKIjvo%B zN6uPdh43xTk1Te(Y$qEvr;~Pkk@xY(kUBbPe`0d;WJb9=$(deSX_0r}rxum&tn#!g zF};gy|DOpwZ^^24E!ru6E>L67$!OjFBEU>jZsda+FEKjB{&JPRd)L$@JDRQK)Gv}> zR_xh-AZmmKz0arEU)kg|1d8*OI!N{SqIXZfwwdW2QFe?iNM2y2{KjCHXOnu+8KRaJ z+0nl>h_(5JE)}w=IVwWW181P$IlRecHK|+WpVS%&?61EM(&8eSHwyEW?UX+_JWDWj zKcbV?A6=3ql(rAi$>&cdsgYb-t9BRSpDh|c>g2a~QThd}x4#5wu|5Elcl@s= zvC|!Emk;GPOPv|E+dDhzwfI{t)PlbmEohdj6MTtQ>n@KaoP9k_&PFfS+|5iqchMOC z-EKjaYu=ht+WCvDl7HB=d`3muUP7b+$I$%K=A{9&t!5|5#H^ZAS>3B>m;M*#I+I%6 z!$9JHL-O3nB>oTP#!4*Q)2yX2{;x@{9843Rb)0Qe+rwyV|7Y^%C+Pt=g=X(4*Xvv< z!8>|u$;jGWbM=)9vRB%z&=EHC;vS`9P2bt~W}|jF)Wb&_%<{oJ25V2VQP52dSUpFD z$YHErUkE2+js?Do%{6X14Y4EF5UR|1)nWLyn%2uN*lPUJ;c6nk-}#R4dOGlh96gY3 zi>_VMsOPV4vyBsuG4eLPP}#2`^7}n+!?m)bNYi6%cJ6b_d|-z3&d_UHfb6ep4%Y&^ z3-tXj#EEg`$7_KW^hdzy06ky0CE`~A*B*jzi?8i}bi;TZliu>fRi9_-h=sYP8WSm`EtE0lS& zFw;%5re_M8o+E;evzYm2yMAn9&%SZ%varaxbiBpfpIt+w&hmBD0{rBHw~^m|pCFUx zMoYfANM1i;nQtMJ3y>M@<0qPAdNWij$N7vVgI zv3d~QRNl&EreWv#>pI6|(XLixKioRVrGx$mnJ0yrUgE4GemyUFh6BHO$-)%S3bcv=FoJ*LD_-wtvx0;prjniobWmVOMB1Tkt?~r1)(h zJNnf=Am0{}=OX(Xoo>zukzG;svl-a@XNHKbhoAw+gXRgW+tZVVA!5ep@5a*2D}-G!#3kn}{s z;^&MDn_c2mvlYz~bnjZ?ZSi=$&VmC}&l;eOwz|COCSOv=&l|uzH_VKmIf6Hyvt{4T zWzJN}^z<^eX94lNAkh_4J(j?;b9Q3$VJs#$4HBs~-8s9iEMQcIv%!3!|`cP$z}lorHG(du%H4e#R4{p(wl-^QM!WCo6?kCgx`HL+1+=~yXQM|e&=21uletD zzvrBL?s>PGYH*Mxl8z(prDzAzzAV*D#YQFbey&C@8r2pwB$FfZV%>8XYwv2TJ=Boi z85MGQv*)d=SXJNmf^KM9*mO(m2~=t9p}jea8n&Tkg=8qmy}{(~7UPY@&GD7}9Yy1Q z4O^h@g-rbs?+V-BLGQ_j6K0ciE$Qgj@z83>0X)5&bh$X`U2J{fX%_QS9IXB(`c4!l9b)=MV?8ditWqPrt$v4NsdY`+!8Z^Pmg4osOg(xGOZDf`Pw-44HA{~k%Tc{m49BrVA~REu9?w$!dGwP!lSmbN z6jThK;;0@gh7(w(&x+whj_R#qIEf_^hh`ePC$m(4vHNMBNu-Kn7gP+Va8z#BvP~V=w}&ftG9~bb1ad_%+#Z&vs8Z`{XEYkQnU2v7dWc7is6ea zk;u%{qhDgF{ycgH&m>aC9t9P{mpQ7(is36P(`Uu-RgUVdV)zk(sGSzs*wp zdGtFxlSs|dqvvu|ZxzFNERo2})T8IKRDT}5fM*h^VvmA~;kz8wW5w`2mg%!%_&!JV zRx$j5B@%~b8oL*=RDZF15zi!2#jy)2h97cNZxzFjSR#>`sYidzQvG@KCp?o#&C;Vk z<*3$y0x=Qfzl#~-;H;{*yl@F%Dm@C6UdmBh{3*Q*F#Re08AomPr}XE5=}+n99JS4# z(klQ{rxcwixRRsBkBFrn^cH6bFv?t&CYy`pwI@E&E~l&AM6c)Zu5mKy_4#7Eg549> zx`|#@UYBOh4GZeC(Lm+(ZlYI}H#nI-Blbo&(W}Z|IGH{p_Lpv=UM1MUbyJ#IyWMzJ zH`z`quQ&nqW`^40mHI1&+N!3ak>%HE>WVYaeW^px(hP`pDgOqMt0}bD!|0^@Zvk7I zDbVehze8MgPeO`+56IfAffWA%arKIsQxNgJT7OKFlkYE*1R{=X=Hy-c;_9E$Wb@#V zJ8@;ny@ltdQdgGTKl9vF@{)4VF3GFo zOeTx@zz=sf=4mdq<%4P-p7thY?k4X^=Y}A>35epk;%4?NP!`jM?#V-1M^{a*Knp^08*WSfum%0WGW&W}u?0{@eyKS=F@dxPq87YNS}^m3Zaiy|Ur`XW zX;%d2Ft?(#nizbgxfZBrhLIIsZK@60bpT|A*P3gA-U`4IuQ$_%zBalzAny^(9DRIK z(SMt412u%WPk=VO(Oes<)DYq}FkhmxjUC=>whhz}nR;WDx2<>~xHik;%ns$YQQC+s zEwO4-Z7^X;8zHv@s2EpkvK8rNN~tZ-yv$qNt%&b#E{rKh3A8f1I^ial%`%yb0^iGP zG-fN6qc4Ru8`I-gT%!8ir>0Kcg{jjzOg30c)QYa+R2WYW60^wr15-K0H@m)7)FN$5 z&|4&LBQ2?S2JP1)ntNV5K@4Z6i!!(mpRsm4_q>ip%=9Horsu^sG`&4REf(@op+6cM zuZ&L7OX8&&4&B(fE@hhQzH9IQrLp38Mk^@mCAp=EAm2J#zZ|u7bZF5$O}|EJ-@#L- z2v)2Xy?OY~6qg)t5z}TfyB{_&arCYATYSnr{% z-lB<}iali{CL+(hml6lbCT=kedG38KnzgA}>N&K}_x&lFb2GDCAu|WDmGR*E46{Ef zSJby+GBe@vTg)F|xKrx)bJ1O#8&IklEW==;b+}_;pDM>O{V^W9KFBer2vqJ@Fm`Ro zP;&$-j$fd3BaZ1+>BbCo)T7c(IHp&nA7ZGHN2Qx`Os`5eW2j}1N;l`2dZnN?*kUEM zUe@*p!(m>Pi@9s=XbM^eOUX)Fwe^P&E=0kq3@OUhkTn9Poh-agtY zL5|;Ow2s1yZHq`-6OyvdV`hKi+lRMVNgABD&^$+8Fyls9onZlSTPIPS=>T!N1TiR= z&B|Zx%4}`MVP-Yr`(n3G5-TI)E7luEtrAllGw9oW2aaiNdJtCyAm{985y!iV`C`c& zvQmB{pc#>!C~;yUDCEjoBC~Q3zm>W(B^FD19>}V*D9=oIb%&Fc@!l%k@R(`zwAkG4 zpgdlCImR}vIC_9(TWw-*aZDdOXok7X=FQD7n;bVUmW0z8=tSJv9JlsFgVMer2emu6 z4x~JafKTT*nA+Zn-Ynh4=9ztr#nQ4&J&V5TceUv&lf3OzxrM>k-)HC4kbg#aj*94!)7yBMn1M@jPfl6(Ts=UDjGhUtQ$QKJ^gF!{TehM<`zJ$3l zt!c6fI*YV`C93yTFu5#VDH>v_Bz?=H2#k>nS*mgt3atJu;+e$2;@Ab$#XOZ5SWE@c zyB|l@&A2gRLcDKff0k&MT4I$TiVk3z$|wT;`Du@Jw2YKN*gZb1JCQoQ;EMOWS&R8NW&TNTY@4kM~I&w>mz!f**vtQD;^Jbj|g0Nf( zN|oB8M>0udsdz~PuFlq|vd{Bm8!C<~WakNsS}YkC9~I7=EiID-CAKq@6XWxZ1sAuz zueY|I6<<+e4R>PIv%z>*Owx;E<~Atv?tM^Nriv5`_#P@vdwukJJ2)LJ>7_{?PVa=mNj5kiEweOfqZ^c zLpBjEw>qF74e5?!keSkt!Swh5q&DI}Zv8|fx<0c5%O9Jf(*x@2ECaM3*O0ExGeGF6;Pc@)tkY$1P6B^S=mlNkYKtHh|U7cw`EqPKCbRu4!?EwGe2K-F2 zE#QB;5kHH33u@_88uRrT7mV_sN%89!00i-!w&p};n|3|`WV}-wvel6Xl%Lj!K57rM z;yw?Qf3_i8s~nw1{alKk_g~ATpi!kdwh!^;HMi zY{fTMP)wM)>ppYvsFK>;C+^2g){M`Qd@aS#=ne?LJTt{yREXj|XS1xwT*Y=q`(3`y zGp&WtEN%M@mZ>|}h3;bbCeI{YSF99d$Fq2<&blBwo(-5psyvcF^q#|Vt${$yL~8)w z;+gGjWGE2(71;ROh^wt?z)0{N#HAn2nOgc>NVX-5EzOJr@tp?e@mvzjVk+pj=kru= z{q_RDBvQqmMI*p>S+4GVL$n(GJ-|$LT(Me|F}@GUx;RGb(LaD(+I6L|jBI@&Cfkz5 zwnp{xMS!f1Xl9-z-t+lGz_q%sSS^aIA0aA{EA=nhJ^W*i+v2Zk{0Yyr44kFTpR!DU zRpZ4xQ|nPM`dq?Ob=CzH&82`zq>6hDir&juuD`1BXFM}C_=qDI*!bs&tIWe_1h^b= z>ChwgF3O2lK(Z}aY-vz6UdeMwFpH_6-(JO2z4hCx0h34-dlprV*RWiFRpYgQnd-P= zwJ46SgJfMCqpIoocJe5wk3-#4XValcrFQMF%|UNKl4;? z{q`?_Nu-KBi>k(3S+2jT@ixFrbzHGp6vwwivM!EM)p!Tw(yl9wWt21S#AI8t*w(0O zybF-k5e=%wy8+kgzGAf~vi^#wM6T4oXx#l9$8GahHQvKBEdyt%^In$euWI}|&(wMp zj6VP1sXFU|isnARBvQq_21W1vEZ1Mv_yEsL4L;%s1~z^Wag})(jQ|fJE**Nr-bFd_ zVMw+mi!BYR#z%NA31%@B^xH>ys<(do7+?~qV$Y(g@o|>xuWEb(FjE~@tQN)bKOtEc z$Ea%j7v$2eD~)B8GoHj`Te8^JsA_x)kkt_ls>Y`Q*Xq7vwJ5TlK~y4F>|Z8V#b;=r z<+yvBE2Q&bHA;0TF`e0$7N6JtcVoIT!q8oI|7lF8T}$qBVEgBq;M?-Wwr5VOZ)*{H9&qXF3cwT5hec7MGIw%YC>!~7TXwb2g9Z!{n)Z4NTbn+?fo zi-TxeW$hL3_s%@sJ9A2*p3_^^Ssk!fZOB$y9b}l*nqd31`&%0EJ!Y8I8?yb`eT^pA zYP*Aez9!~ttq#a*H6SZ(4l>MJ89_|iD1M{@J zmX7Z4e4kBsU#BUKV`Sy`+eH3CO*xf0ix528@ad(!m+4WNSaq3PfWEDpOV_xW-g9$VR0~i z(50+>B_6&0y@^dN)QL%v()dNW=tE8#IT)O&RX0r%N5hhN$SNGn2Zd05D=6xxnvadJm2i5$sL&x|w5qUqiaj(Qm5mC98 zlatcLEttc66||ccY}ITF)T1D3#nw%?VsKD57SCb4vAeOwHqEx8t7u*>H34aN1i4?B znTa;jmTjAD3kgqYZ=A!_U#+GM+cnz;r5#Y--9Fid$$T&p#<$aSnHLCV-gO{DsZ>Au zirRr?SBD8!?0b~&cLdxi0+#AUy>KU<8`T~_ZXK;vswKi-|b(jejv6tpB-)y@W zyR-?~K@B4AJHQ^ZK|30RNv8H_7qmlb50pFSfOe4NA=bYu(`)xO@vsZvnx_l8ispgT zmeE=^%e?>Y%Jknp)2>}L?V^qnTWl95ayv}Rc5A9-S;z1$OrP#FE!zG6)go#naqnin z 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
  • P#&Yh@gM(12s3}4DQQR`Se-X9@W2kUo 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 WWG?pZxC*na0@JzV!-T+n_iL%t+<-1K|hP4((w zw(-z{pA4gVm%E;J{F7(zX(il-@+_Md#EtoKKsZ6^<^~rfx|FL{n~QN*LX&s9IOyA; z^rOFLa8TjE15vR{>%HcKx?o~{xm?W2#{VUj;WZTQX$uTtPbF+O&t*>%A$v@eZVGF3 z#5Ys8@$Va4!p2ICP66j=J9(yr$iB}kRVT})Qia6^YxrpLG)N|e-B~xOF?Aj$>6Q|1 zPXcv%=CFFWcu#P@)?|v#k}%Y>_px@mPWnZpms98%kA0vZGo=sG15wFFG|>}$Eq zDLd<0W&WlL##KMqj!NJmYxS*0CVd1&NaQ@k8erhTJ6<{_XSy{UalX>2qID{|0(JE4KJvjwc3S^XcH=YNllaK2 zV>eT-Q1hG;e)uFUX=y~-!o}!HJ5zIQKj;>(P#Wi!Kbj#-kP2eqv=TX3Xo%aQjHR#b zhA+H*!c-$q!g>m+L?o+!!pA81My{DhsJ^D6ls!9&S}*g{lbPiQyLufbW16GyrImk= ziHwnG2GZ6qC%2khd9@`Uj3-a1kUNfx4qK{grcit|L&6{w`E(+-;NjG^7|M8fD!=2A zQ_T;hV)4r@@>4ow%8w%!>5?i9Y(FWC2a*nu&AV`oSus4Du!EC>P~@mJZ}!jSI4&e> zywmy?e=|B_?&io{3bcwFKXiDMeyEJ1H~RkPt%bjMQ)_nr7G6jQ_l{6BBn^h<97Slb zMH*y_-YII@8n`ylG(TvdVON;+(!^0Qk^oshytfGQM_-XO{xyIW#q!RbJCa+T z7~JCPXvB^n|6>Cas3RwrAWi39>Dwaw_`OD39V@scl^h1G?_1?#k$D=eA8LY`Fp;5@ zm8}v{Qa|e%0@?KZPnh%;Lohj_0#)Qqxpk6_@K}GX-7ffycL{}Z?_U8wX%fo@76G=W zUGFEuvr7Xkc^))I&A0@b$OLLl6m#Q z);#JggXM*==CqA98)OZwX+{d`u1n=GYvL}}*Lw@xB#-s*PQ*7v$r%k~6cjX-l}h6vF3Czz&K-`6Up=;LfF4E~<(Xvq6l$p;tyRcHXMfO{{GfpD|wMcG6Fz!(^HNTTc^ri>9w3%%B3Sr#!t; z&eCw>(Y;I8bta>leo=cnd({D6A2_u08S20bRY`nHtNI(CLNkhoMbdsoWN8>0$P$NB zwi!}gYS$zw!hhIC;j-Lk8Acytd$FaS_nF+^i3(fah22Fc^OI`rxxPdy=uhQkdBdOjtuI~ zNX-AAv$uiPd^_vHMibMdT!@LL#H6qYq)CaSaA!`g(9p=4^D*;s&ll%CXYSmTI?la! zCU<1+onhwQNrJcl(I~5|X2HTm3W~AVtfq}ko7J>&MN?5~1cavI2Z|sF2BWB@#TAQT z+28MZp5L>dz2E=;Jy&(P%$;|i|9|u;bytZG zt&yDbCa@&%7(odIX1XRH-n6IRteX)TXE5{w>}l6nZhec5iZ=fLSA(_~PU1|vPPWgx zY?BD<+U_oxn5@ID+f8D3)L=bKGd-AoT8#LqPtja6w}Os6S#3PV@ZGZo6is;)&}l*7 zHl6KKGDq#wfpz{Vi!n!*)F-IMi27Hq;US;@Ov5xGB?KCG1EgD~ z;|0epy5%tY47UyAPCjGXQ7|1Y6H9KmPT*n)?U|aBO`X4c9(Ys_tT2X|0`Z6|S!mQf zJx*_~!Kn*5ar)|YI5oLEQ-AUGs>$HbF)D?A-=C8_(~e@cKlzV{AJu^)-jo5)|FQx0 z{`|M5Z44jCKnDHUr>^BR`Rh+TuxSnE3jEygQQyM=Uq+5d&7uMDqa2A~ot zeVBEu=30p-S+{EA;Q7XDqeEYV4XDydcKjjC0)xbXe zVQv}6u4}0GT-d+;{D4_f;zmq23u ziwDfqE&b^MGR$a7`yKDw4Vg)%nx)KrT$V!86#9e*U;W#Yt771L_U7Q(_;C?CQwzcd z+qXvk?hkGx;mJp?=uVEukNKa{G;sF&8rlTev60s6r2n>q4ewp@&1A5wJ9&zN( zeoIg4thL>)PMInj8#5|Wqq`iNa@@f*&cZ6_#vZR2G4uHXlqH{qr4e6i?4nhX>(<&j zG&xgSFoXQ9gSJ5Bcfsx?%w_UcGrx~!cMT{O)8~ph0&+oy@z)Kk&}00T9c21L?|$-$ zCo#Ds>N`BhT2mL6?o54#s~*N!>mTOe8?GQ9#q5lQpavGwssGjCsFfq4piER>oI)L* zmYH+4J+;@5P9iUlLe^vUzU6a&Z~%#2mhPXkEJL7pBSDmoh#_GmRwF&Pc>e4Hg< zBe!uC5>7YYs-IM2T+8{NF_q5VQ$3Rq7vANBV6VU%hf_P>>guzp#2+4(fY-f5=hz`u z&fL--BgTOle!XeMAopL$FYOr?9op@@@RR5a?*loowl-pA8kWDtP z05rb$huRYc>{yNpvxe^F5Ol-wsK@fOe(QKFyxKgVLzP18W-5p^k2W-On8y05;RLE` z>-r#b4}Wx66OX3W&2HV`@SMrfZ8+@p+jpP7&WUnQ-htJ`6V2Bk8i+-Cbk6_6<&1}3 z@h@I|F8&X$9^ZK94kp4sOX7La%T(v*20$=aXywSS0l+IN7BKMXK=ST1UU{j^ur&_g z6h5AszCz3oL(A|9q^h~_Pxd4aQ2fv<{_)Jg^bj;XjqxT|r{0dxjcKrtWs3yPd19g= zu0xL#i9XVJD{5uC2j}=a(j*?&92fL_9_a--3=zb<@nu_YJ>7 zJM`c2drN2I5Z#D#3b>I__Lqz@)@l+izo7dy17L%a<>~0;@Q&N;2fx2CO3aDw47i|lGX$j?Xzls@4g#D z@EI(f&Ag^yDOTfGytr*Ad492;bT>^gOapoM-I0y37{(#;~h^+O-7Cmw9nT2z@8qvHROq0=k@LhYE~P_s{g^VE$S zSvEy0FIBdpDkahncvw=rrrby{@j`>-i^Uh01~VZVh7dV*_Ej{0akt$%}c31zZF`n1x96 zHl97ed@|ae_e>vg{{|Gxlh!951b_Qkr*H-GUF*I_<{?JL$Yzk6kc*F>aa!MSk`du@ zXKIuT^u!s!Lo|qt8Ew;iK_MEk}8h)8dK9NfO)VwOUnn(-~OiS&w8uq*+?@* zHm5UhV5~bHhQEW6Q$*Pe$zd5~UKqJPvzC9%dqggemHzRui^mWe-+3pV+C$q4_nSe! z?`N2wY<7bT})DfjndkVE=YmReZ2Qh5d5CK8HCZ-cb>oZUD57u_LFA#1n`ov&AxA|m{nRIiSd_3^{m$LWy0!l&nB;nef!zZfF zbCGP~;;yTb+06X7@Vx1c7Y$psQ!HZ0{X9aLe+xpc)qjk>c)T(CNxEFPX&9YGmhWOX zq8v;zrkXGV2OB0*6Za*z?>vv}8pi?Cm7CvhBo0$XFJ$9uckZ(0W!ul{HdH$d9TT>3 z_x2qW%>W+F>%nlrzs5+xFk^(&FzT7TwJ?_g@jY0(Z?f>^vjaaYy;Cq)dJPjkgO|4L zz3;WCSi{Vj%XUIMSi#kH}08)v0w!nuHmZ&Te0@U+OH23(tE=}qO}T;y(E<9 zu}wkW2)y2$G?4B6i`lAEhtmc(tUnHpB9w(<;{k}78f#7&=Qh2^WNQk!C>Fq{1XAe- zj-ovtaHhi-Z1E1vt-lAS2P2N}vQOFOTM(rA2|cqaHy`p$y+jT6rzTkE((QNOMXnXk zXe;6-sn>YBEFd#JUOSJ+(7nzrRT+9pPbBcJC;TnX_pgOr0WD!)<0x|1$pK7;{yTVr z6b}M~cDj50{{82kzIW&OcRX#J`@?epXm28Ax_atW7>`RP56qSTGOg9gDMufe+l-O+ z{6;JVqwr_gpS1$$)FvMI{O`!ksIgi#*_7lO2a|tKX`VYwavjyo2Pe+5Z_f^{@*dfJ zqOvIjQtPhsR|VJGhLH*s^bCXLMx6otTTB&A03#%m*Vg!_@?>@3&zS~4(>iA5Iz$y~6>%3QCc6{Kb!z>5z@XsrA|o zPA5-5_LxG%)95+7))JO)9h~_BSeR-;G(kfX)EG$a6_u&o{1UD=x%uPDYkXmXP3^OC zBiWF3&vQd_o>*qcbZLg1Fsp>(N({+7QS~opV+EF|T;p(xUp_RUXfW4d%Zr56oK!D! zsKh>Vrh%P|tyeI-wQ>dL!*d&lS2mZ!_BUvsx&AKZfPB^wweo86z}eo|ZdU!lwp_ z^m$v-s-BqM@pxkE?^6e0_V~^5KaY+`?kVPC(Cmjy;H}$+r$06X({ZB6Et5L*=SEKq zN{d%&0^g+bXefey?L0X5oKF_Oxz*tbCJJv*0vDfuroBK3FA=akg2kVh#^lMi!zz+>-Vhin(NB~D_X|B*)55}(38`tj{vyZ)+fvgpffip7u z`zJRK-;bPu+(zGu-rsfZ-+RTU(Q5dj zb4PdHdE?$G8Wi@gzw6dB&p%@!;fVQhdq?|RL1N}$=O-C8nk<4&MCQoKzM^pQIBI^A z9i!5Mhj$+)OAxkkI{Qe(h8mD@u6lPD8a8^e)&Df6w=CyI7b#56l=|DgQPkgDcDUb* zfh3;~;kak(KKSGy55u|7^W3wHZjYb#j7F{SvTCiq-*!@@;OFh ztDhWLzyKz+MQ8cVgK-B~ zSNM^bW=uYt-jI*K*_aAE;CUT)%P99F|G455C7V?77-wFjFxeZ$6#1Ri&&>s@oZ8|3 zj3Mqrs}u<9ymk3lo{djt3!y!2-G~P-hr~KUEZ*v`e?40vrxQz+AlqC zqV(fyj`1kR0pbj__G99FiI;aHGIAtu#bb4Zmqon^+WSI~p6cgs4Kj?Qdb-5JIDTgG znlkcpelMICyj>^g!q(mA@4;A2$?DO)kZ3eiP@pZNj*}6P30Vzws;g?VOkvZPmA#oN z?pWA59*dIk;Z<>sO;H3SRHJSfPY|p%I%^0_VDfIkP1l6O16ScYCBs~cDM`i&BU5WaMw4irTz#!ba^+W_#UT*ryf%yde;q%WS*p4Hv z*y0A&t#w=yM|=j4v|VGF=^iwH%Y9I!{?c%k@L=nuF>XMGK2bBSr$QlnazGlG^}fI7 zh}NfPFv-hqh4smJp4pK zx*i@JOC$9&gFst)!+Bp=oX`pNL*SsfPRfbXM*e(ckCkKS-MP`*nAbHOC1V$q0L4$%1h#C*Ohs&nQ6Y!7|JWvklp)ZN>sX;fuck52kgoI?9yCN4r zK6?k#neOA^W%KHAt{eBPg-tyfe{s|VhR-n1#OefTDg~W31pC$?1+!pV?SrA}Yla59 z@)xcL`;!ufFF2W)k)*T^z^7$ujSQ+WB&K=sDCVzf_@boUS9V6oF~BC6{UZIZPuKM)Oj!is5d!|CFLpbyS{-no~);@6PwJl@$lIrjzeA0VRr_wUAke+5+B z(eA;ey-PbMS9Xq1cCKz7A8$T>bjay*$BS!M@WR&7@!=M1%}Xr=wZ&VPceWngJ>J~k zxp=y}yK}re**rO2YUvxXloFxu?k^7ZH?JOTay>tq-+Vn5GI?bSw|DmN>(=4^{^r5< z-eP&OJh);z|0h^QSHgEbJXr1=U%}ABT$~|=7aJqB+_~ObYaIjJvH-@m4iAsF zH!fd^{a=eU3Gd$G(&dx=Lmcj^eSo{a0ZkV6@r#Rt?Lgqg&86>7qR>$LY4;X82Pd0b zJgq~rJUQOk+{f|lYhQxJbe;;RnmZ0>L8F<&Dn!5Kl7%R8IfJI8U%*Wt_mT5EU`2QbcKpCKj|!q#J0a`+fFyRe&> zn1p>JKz{^({oj0HfPTDlw70pnvk!D^0h_0Z_w&2H?}gpv>4AOtEAV%p(vkN!9|c!k zJvlwzxlF#=Io??=wu#i^i?;ed!s^#)^~JrNgYDhZgDnsP?0T}ZsLPTmb`CbNa?6NA z*56r(^VCN=OO7q z`TrP;UJ7etUjdUJY#kn4Iovy?EbK1!pjxz&&2+ZfzcsH=Rm}|AkIUf_^>pH(-41(jM0BoS6J>9iASD z=*0U~VPgpmda%8D{P@=4-r@0uQ)hA_?3|WV_IY^e{Po3Hz#ILB3)jRX^im3excYVh zURmJe@E9lD$NvpG(b2}_=^`x3V&@n`^o*6cAZ6hg^0sq)>F9KSbNOiDbv6 zj^U z?sPOv+wwB?B9!FO0t)8jGF0^TQq04}50Zr2S3yG1@$mF`YX^TPwN%c|#}g+GwE+Rp zH^~-k-?C*O60}IMgHBSi1)V}$vsfNp{Cb?*(I{~wU-PwJTXJRlX!CTjT%I29LeU01 zT=7cjV41p3<-7qa_(bgl#2`ZhnPg{%%GN>JLVlV!@=PhSRefB*n$TTjQ#x|`$nM@D zeriq%!DSR-zlR9=k;R_m2aYkY6@#!`)FOT+Su{R#VA@nGs2BMJhJA*F2T7MZ+gQ6i zy%<6-V)1LgUl=lD3dua71<}{Y%D*P*@}q|XMn7nA5ub;NppJQ!K;J&ze9Szx<>CM) z2)1N9NX8Sg0w5gGk-M~WOj-a_vFJa)JK*C)v6nFribAE-$v0rsLe76atB!B*)ev5JZ)8xP7_@;vXKw zkw}tPrknxKX4{-s-B!W|hU%wm@P%93+)WR>lbx%l%UsfVflmCR3*iNl4ZlRHhn6D^ zwu>Gq{>e%LS^;-I0$6&}$4H|X0Kg9|is3j-z=r5a<%DmUa=LbOa%`CU;XJ5$Ud57Z z?_61=_)_TDA>`)_cNMao>XC?GeZv+sca+|!n3GHR-nT7jf?Mq|MVE~mT5_~`a(R1` z+6|#ZIq{by)R5cl?Zpy4og1o79Ed))o!aM)4)-3vba-&My9>oxVVbmO8%uFGE!I!z z=!>Pv6TMC}iIo;iX7qGeYDD>F1<`nM>NO^hEzZViV`s6Re7ccE?BV4^iOhXSK zG5%6}AH=w<+M9>r)H)XElqa-Dhe!7JmyQolkBnSY1IuC@jmI{&;f1=Jz{93DZn`j~ zd)H4u`Fxj{^y1#aojYeb+k!ej4ZXQ^CMo%yP}pRg)R0H;hdnlNwYR;qy9v=33CK7p z@=m0~qlfh?&y+{5?pu(D0DW8#F>fm zT(L>_c3$$)PdG~9?_SzD*gM>M)SV@GrJIj0F0=rZwOeT%KZh@rk|*_e1IX4mP8qJ~ zXX2iX`}T91!1K)lkbG|y$YL*mgg`fZU9u4S`t1{dpIW?;#tuZW|6Z|kC(GxrUf6an zpvC?nt?A4OLLPzpyRhi*mqn3OQS4Zeu{hX;^M6Ty$%EdMY)&DH2VHdr5QZ}Vuv0LQ z=Y@_y_kjhk%Fpo6r^7WtK$d%-{(OJ)$cdp}i6YMZwU4_XI^#aPou}s+GH`6f>KFW| zh-HEj%q3b;%MUL7;no&nM|cq7+XstNcQU(Y@EjZ->@j`Cyw&F3?v)HNd1^NO1WF=F z6BJIQr2`Iqcw$(KO~~l)kOP3AY-5DUk zgmmAPZrf-`dJC4aZPJz^cXqIaF!wV4Kl)S%K@T5A+T-N%=uvjA(AFM!+!0LPqrTu% zw)V+5eT`Iz%!l;5=}$1#67JB}=H4FFxuJ>-@(P`S5&$M?kpXo_>QNXY_$eja*_Fj- z+A;GFu;Z7QENb~T<}^Gz!0$btu83PJ)7{RO(lOLwud_TN+U1x?ynuiBgA#Z1);xUm zKMTu0+IKNKg@7*h_K51>1}@6jN2z#>%v2g;`Uo+z;19(Bda))0Qk?V2x zESwF3k?mh8>94CIxk-Z76u2ds{V0u~#9Z=qPxbH*=wY%`PWUgGmy~b#LvBV0`6L5u z9F(|*n9l6VzAo7kxjf1zuA!;N*b@;5yf*rsrX_sd76riWg0Usn6ozq7ZJ%Piw*cl z=B>Jw}m*4F{I-#v^j2OANLP%VeqsS#gcKa11MZ^={L)M6~O3DBX7%8nU-?nHwlR3v9ZW`e-1WuEiNJY@3p<4?_v_H>azArt&QVH~#jaBKf) z2f-1LL=R+{){?4j)s1PD3+}|%*bHECh}o`(T?$@_1w;I0hUHa4D-28Z4B)z^7*;l= znJP>gnwU7rgCco!iW;Np844L=DZSXLlwJ1+PY~}f5l<|ZUgFtymZBU?YK%R|st`)^ zT)*yg?L63T701HA-Q2p|n>NZ3$D`5`aWXZ3UOe~Lfwh#irF?9MHOEU403HPENt79xqdNbD6#59Y3N0$## z+11vTQ`B;9J}q?T!$1-rsZD7aP<_Gwr~ZK;6TS9o57t=HX4J?p>oajzS$K{-0O|L7 z;i+<9#GnBQjaI4v524goK%x!)qzbo6Msdk&B?Z2TFWJa^6%q0h$ytSC51H$%C3pGG zx(enIbt3AKC`$8Ozo9Kd@Zbm`0S4ZLstxfbrG7)lw<0l=fCW@S5EW=quEF1-W3`C8 zWnsG1Vv{|*Z{R<`vOlBUP_Kd}F;*lLX{SyZK^CQEE6Dbv63CBJ{)0}0HUor;pasY! zXvra8CJQ#LQ5Hy{#3!l3csb0JyXy*?Go?^yjK4`AD`FI0Mk^qb!mpa5a95L~M&y7= z+ilSP2n7roT*G;2E9Pd2m@J_FO04-KLbYLY6*eU0&{GkDK+L5BI&8eFMI=P-H^@kKk09Te5QATT#R+jqZhthpDj}WIrW&iM4HJnc2I=~Yi zEZwYE3A)f4>FATRoQP`#fiFQRpvQ*FUy(lEov;<26APG;rj{}!e%YO?&&cmY;;X4; z68}2{h_P=qOM{<7Cxm0J?29Onp;HM(S{AUHyzpX-{SHdI^A?%RQZGoat3||O3M(HO z6(8KW^%Ndbd8u`P+85>4?8-)y#_U+u3B3udY2WyRkOzJ%O$)S!`QO>KW{#r}0iK}u zQ&WURQIS5KE7E!bV=G#*3{cF9Wqd+!;4$qp!*3|}N^Xbo6J5AS+#z+->4_$6p8;cI?P zm&#=`5xdZe)=lnBU|<$g|8bAhy6lt-!E}eP%4T(aO^94v;2(#moata8lx>ns#>xo8 zRnm~OXh)ATZQ*8hEnso@70dWHhCd+WqxZtkB$i^2u|lG`FuF@1XbxQ{>PU zjrKup2c1W>F=N%GQ3-Z36WJQsg=V6X-=-r(xskMBoC@qpD(d|_x!As=KT})8PJl@W z{(=H|8WfKxBQ;_Wa7hM6RV>ir7m*f~+>7y*y`wF-r&c3R7jkqVxJe|>?elcizh*^$ zC^>`TwOKZ{DeR$$5MYyHRZ%KlTO1sn!n`O;CZC2F$Y>E|QgmQ$9_+Yl`P=c^T~p9c zVgdn9glUg2eZ_Z5s)8zEI4;x@zwk@7@=1wnaMp!p@mX-+l>4@eGSA8BzSks(+0+z$ zS0*g9VTT^upA>e$MiCyeMwo4+164^FOjq!-gJ;@#M+0xo(^&wMoVp}=|E_6w}bVx~{F9U&2vr~^g{l88N z!EWEM3R|bgu=XUGA&*Yb2l7PCs2Ptp{84~@MKVwseD7f|Jd@krDNsv*(Yy&XNN?_G zTk^x-&~gak^6~wPhkMz0$n8Ecu*<_t=u4XD!c=o?ISZVSEni}QE(}e2L_0^Efqsl& zT4N~?uxJ$#Ruv(9bI(dx&t12y0@&45(N-Tq%5(f<@j<%a%Fp4;k1q}`i5)1SP1{H5 z^{TsJTW`hJqx`pgZ1c$4S&E^msgmMV_l%LjnUrmcYEt~nT=how zKhU~om^m6A^B$UjQvUu&X;2*99NqJ~?uVi>Ws=?Q0?^WDQUJ+xJlaUxP2aFFue;{>V}Vy55L%l-SV(ymbOE%g9E`|EK9j zKm&3S^*e65q%P@ve9s`4OdJJcvR;RzMHK89&S&ROr?2z6gO^FfYjj_So{7MqXZA_s z+ISLjcCf6aXumxWzdj_erZt*#~#L{ygA9Rc)O z4-X<8XM2&o8@jzSaGN)`P;mw89`0rGpL{pe2SN&R39(si1a@Eq8u28tR1M8=TP);_ zQj{FxNAkE2QG!^2F-2Zth)wz=KNEN|Nd){4bP_Ce@~|`}K}#&GU|cOaT=i|D%czL1 zXcZZ__HSh%DBfh+BvqB=FM~VPW|LMZ`YTVg}17!N4T8L1CCEBjAWO>wezDlEvhVUjHrMkjUm^aDEhTmCrV_8|!!x9t zzG&FoN-FQX1Jjod;=uJT3>C-EO8R;LpyFZ1gNG=K?UERB9ntkjzq^S1NA)SXUeULX zYA1U`OTQ97mYoh2GY{uwug+pHw_>f8)_`BO5?C=J#q$?K3lBI5hRN5Fk7 zWTpps27{mA<(0`WGfkKh739c?Eg@_|7E?KyyJ84EbB$bbz>WEKf{PVMd1>!)I_}T} zmNW?V;j)1SPA=yo?M}w{tc29H>jYa9AK8iB3jxTU_^5uaBG>SAWx?s1XMD1U3znwa z!ZTBR;;E-G$6zkZc+EgbD6&&R*pzbX#-IWCLn3L?3;n(*%r8#ZWhIo5WPe$?7X0gK ziya|L+|J#z)VB*$KD~0>8oC*z{+nVUE*>5t06D-tKjRh3?BA9g;$P@>hlu%A zsL~a{!1`jEW0VHA7nc^uQJYmxke70QsCqb}+N6VN2=~TmHF+n`wx=09)|!EvGX=&Y z{38j*VxLtv7JzhoVy1Ks5RK9@o#Y|BTCK(!6y%HaF$rlPLVgcvS*>h{Ww}+#M$CSO zLVRNI5n9rS3h*~YPg+06Jt{zU@7I)w0Y`!VP*pMz0;Nbp!B7Y?YG-z2C4J@zF#8@i z{%�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

    Jt%VLqS_=%*T40zuwvBX*<0c|!Ef8fh zw;6Y*N7>B%#w|2%v2ja``y?9gicRlRQViM^-pqx}`7qy? zVX9{zsVD6XBG&{GWi!tkM+J1;yT*NJTrboHckWsqWiy(j*9%TDe~3g*z&H{j~zRU>N;^Wdb^9O0lGC4J+i~*uH$K_6n{D|~ zcsd@zL)GDe7Ct=@c9t+(`xehq@I6_>^0E_7_9a5WWPG zhVZ43G=wjMWM2Oa@**E*{xQr7*w-o`k*k12*$f@0j^pz=?qlOPN8&g-PF*_AkvNWy zQ^#?R#Bp?-I&P40beuYFKjY{)b=*Yb=s0y;qj8^Jg|1jh*Y3xPwgEEcFDNp%J;i$B zs=z%cj+JynaqMj#5ywipi8xl$C&aOmeoh=K>C@uyU#H5)>Y6;_$~Pk!2^?2GPM;-@ z*krl|k)xx^$9qx%Y0nmiw6zk_V|VdeqDtU%jZ1tM}4h$x$R+Q;^mLFG95 z|6Dp6RF3Nom3ABrD#vYP91SYRu`hG!b})|9jgH&bxO!Z<{Ps;-_M?Wf-!82&c?tPa zeuFILO7ftV@xTe%fb4k4_`9}n&c=v4vZ9s@&c(Zc$9jTGgu{>H*6?9At)-@uwJRLF zKTEnBBwkj>Jd_l{d`LdmoxbGyspO`DA#y7oh_ac>jl0q#x8lL2yWP01b9x)xJkIGQ z-9M?E&MhOSmsKP2Lg84Yoc@c?>3e-nKj3qEJIiSzm(xTprya+fcHBIVdS{r^j$5_H zzG4I3S4G7J{2dh#t*q_DRRMh{jw-f;I5yzjpogU@Qwt^>Y|4{I+%T`IkNjL*JYE3F zd$J)LhrgpLC_*)MvelN`T*TaIf@Rgm3A7R>;4d6}E>=Z0H^V*o2o!?P`WPgu>f?}X zbf1761^FZ-hY1YxeHdmV+g}RAw9FBnOGFL7oixI^_9~Z$MrH z`6lGukZ(ag0r@s0_3ItT-nj3(kX4ZHLGA|mKIDOrA3#!XK8CFGVd?_IY{s{@W}L`1 z<3!oaQ$Du0{63C*!?<@m%4WD*mOGbzAD51G$Z?w*$KA3Vx4m(LjpH-BbN4rHlyQ@c zJH)se|g+*ade7aeBq*&hI$A9awe3j7Ze_83fsReJL&L#@V`u8ESr>Wc-kx7$2RB>P3vxqn zYeI6iXf4P=KD?_Bvu^C5x-ruuH(Nx`?Nmk7JHtN5aSJWoBgQQ;?oH$Bfy$2s^Zod| zG|oz6!S+-sB7q%jO_E1E7G$3qf9)U6;h3wYQYqn=0r6Wh{#OP&^#zIBb~!j%t{odT zM9%YKn?UlJJ_pI1-%&X~)gw1LA(zcuWZY#Qxg8rA+dDJQxUO@#woEP`x6-*xKSZSs zlWQyFa!n)Lp!}WoxB}ps;pi%VY1$76i6B|B)c52lyN}P^ZGGDn`Xa4WbByXJ!u+L0kPcHHIC7 zKfK1Q?SrAoMEU9n;n2v3@YqCrsYzuO3>RTlFvb%Np{0uLfP}#_Jw3OJPeZE@Nh_W!wj<< zW|%s%vvh>rFp=wqiJSw_aku-}Z024|_n>jl8@JfFdZ6;%@T`8FyWy)-rH2G|Y+}fP zxEr1UI^HThoWm}!u43slwD5;_+KSDMpHwGt0CJg6J|2?K^A(@#Ur?^I{u8-Qf+(xK z^c{DJkIkxUa2zKpT)M7v`0HhI_{Npa;p1?}cn^VO4%b)8Vg0s}Z(H5(KgUfgt{#rA zI^*TrEN80E>BD?ZAL(;?7t3iPm(xUU>kh~L9FO3*c^)}etm9U`9s7n#q8F}NYRBeT zJN7NbrrWVQQsp!pXNH4yJ$bBXJN9jy92=~>W@yJ6DwgB)miD%S|7q?{b)|dhxt6mb z!wJjNmK9Kje7<@}wq*^FY|9!U*_JWPwv1u6WnWZTvn?ZXZ5ffLBbE*W9z>ZLB0ui@ma}g1*00`%>?KpZlN~j}WY~X5e_rv75 z)`r=gJ>TK}kX=?emd=1gLOut3nr@Kcom!FWOws|#=bPnAVSq}3Z5xrRaYWe+?KH>z z)+4t)mE-O)uIn5>1vifeaSyI^j(6aW`$f~f$s9kXVve`W3O}N^GL72uD#jbPl)Uj>9VCaO1LaSij!c zsl~xn!_lP*FV_(H44=bi`W!yX=kOrQVIr5qMA^*wxUu6d^2p_|8#0OgK0|NgiyzI5_E!KQ_|& zWF+v44&tuBIk73nd-5I})J(6SD*uhYdUGCBiO+sMBpa0rAUSxu5OM_MPa%(hyabYi zH-`D146`#EEEPQ0BR6;>=YI8usJFbxj(gS8z2TAj)f<NO~a$gP-ZnXZf(2v)n$@htKk11%58^zo8eYI0JE> z3{V=cAIkux@p`_vDxmIgaQ4u6^rzxzysj;d#_J{GXuPg3?r@;X#nF7+Ok5G@=i)eV zS0(NgpkIpnE>M4Q7XbZQ++{!m#Bqw|x8k@MW~ew$OkOAMKA^qDEdshx+;c#~#k~!5 zv$&6d#);!%m_LZ43HB9nTnzI^aa;`ZRdHMlbGtY#h7rfbFnrDL^lYI|Art zag9K)h-(F!C+=H7uZjCM&;oJ%iMcn$T?llaxL*OiBknq&zl*ya=zVd226{}~BS0UC z`xnqt;+6nqwxcG#1N4%(9^K#*5w|wb8{)PE>LHFl!SSxRK|pJY+XHAdxQu#aMgy%S z?jWF^;*JDbS6l&TJ#lS78;JWF(8l6UB@*{Npe@Dy6lgPXR{-@DcRkP+;(iablQ`}Y zwzaqifCh`>PG42xUI5xt+`B;i#4QCHCT^YXSPUX=W1!LE`T^}E?(;z7#O(?61#!cG z4i+~7Xn?pwfQ}G14QQ~q=|HvOz78~0+zCMS;`m|P9^!rkbga0a0qrgB*Fdwx{Q>C9 z;_d)CP8>f;*iYP}Ky$^t2sA?6Ye1)o%dCMn64w*x2jaNo?f`LH0sTlEm(7hAHyG$* zar*&%Mcf#mE5uC&nk+5{^c!(aK!=Fq(u3>8od|TOxYK}c5qBQY5#lZax?LP+NsbbC z1JGZ@-3e49?k_+Oiu)(fG;vP>JuL2Zpaya80X-qE7c{d`+`2%|i`yEgS=@F&uZkN2 zR1~)t&|Bih0=0`{`}Kjiqkv|Ls{>lS7j?V?=xgHG-ekp{4s^V@vw$`fcQMd6#r+&; zGjTTpoha^Bpg!XM3UsnK*4^#IJq>iKIM&H8hV%C^fPgP0%{ev5a<`;9s`;!ZZXiW#JvG@f;i^(Z^W$$bgDS!;0783hxqyhezQMJuaUm~=23V+6doCc50ApdD11s3z90%;8-*7{;YCsS?I^q! zTC`;T^o_#1N8#~NxHbyUj>5FVlh?mI3f~fi?~lUIN8yj7@J8rglGmsGm<;b5g{MT} z#wh%)D12@d{#6vF-IKiEBT;xs6z<`Bn4sTVM&UtGcyuCMT9vi0uQj|g`yXm~0eFb# zuY`l14Z~HCbnO2Ml8*gfLymyF8j_37e*<|e|R1+oV6_mHz7{{Z=2$Xg*VgPaF>Gvps3?}NMz z@;S))kRL(b4!I#-;10+gA@79zGUT5i4~D!8@)*dwA^FSl3m|_8`DaM}kn%l{^CABN z`47myLcR+5H^?=RNB2T*0eK(fK*;+cM?pRSc?9Hxkgbq^hx|6=LP&1e{}AMLkPk!t z8S)>H|AKr3@*T)WA=gG({1b9p$j2b}fP5VCAjl^m3y_N-zXtg)$nQZu33&zNQ;@%h zd>Zlr$Y&s5fP5BmDdcmI8>0q45BYh>7a)g0z6f~;+=^e~0V^`4Z%skgGxevyhuY_J*W&y%yyDkZVKIrdtn^mM+7z(-`Ii))1S( zB61U0L~iw=<6iXX+|LL)j;jw{I<7u+99JJYj;jwH$JK|9MHyL-QaSM!FXxt;lJ!{;H z#=ULa`^NP^t#tX4^$4psjoaL~{>ITS|zLF>$&JI%PGjq5OO zwsCWfJJq;zj62V`%ZTVUKm;~p{YS>s+b?rr1VH;&#NpMM@9|BTz* zxc`6anBm}qH%8<_r7sG(5m|U^9cE8+~&shH*P26h8jm-lGCe^#*H;@igAY; zN3W8*FD+JgZijKRjhk!Ssm7gS+~rWtp%aUI6ZHg2wQry6&T zapxI#xp7w-cfD~p8F!~~3yfQ6+#|+4Yut;*y=~n4#`Qq&==0AbyNOe zE`;Nik24SvFZ~JUaAje0CC^VWKf|xX>+JFgH-zkJo!IiM!`l=V4KKAhB%fz1Z{h4J z3x_KmiQFnNBDad$ahLd5w@S=$TqWkxeGV=x%YGXq%TR>RK@2s0qN!*h!d=;$tTvS41U`*hzR5BID)gyeIl>trBZl zPF2Zak!(|Kr-g-huW)#US=)!hm=eXSBZQazrH>XOQc1$W=jEW1Hyh{4eo!gC!}gF= z{T(1VsN4~91msST%$qMjaT8%lU9B(3@RO4fprN;gzZd!BN<-~2;`6*~KTgzps@(`#dRe3i^ zs`BoTROLM&M?mfgNmc$5BvqMVsxre=<=sq`iJU4EWiyL?Y;XN!n&Un+j;l}|#~F5a z?s~>?#}mi(F^&rCIL@`Zb0^i~g6U3A%(`dKU&^*$ziQ5vSiMesw7vVFd56uvdbPvo z4#_+$y@E<5zV>)V8nzL*M-{u3#r6eyNwGoyhJy*m&;Yz-Gm1ydFfCIsPxrZaasC>4J$OI(n+WI1pe?XBuoe$p+$^8AE(ZY_Gu{iZfyQ|-rgi|3`g1X zy+%RuOOMfz{L9-&I5uP4(ya$}l7_oV9GkHo;#e?m;jb2d;rOJR zvFmW7_!rfa%~)#%HB0`gb5nCJ-`19|sh^GywmX|~$cJ!zy1nv5s2{8L!H{gqra-bO zI|OnBh^_2?dU>DYidjvK2u?vqgG|Av)h|I5!%(RhDRRi4eox~lSQE?yQ_1+5XV(=2Z&n))JxoRK$FG24b)p4tH9yn*oUtpj;rLV#c`F~`r^1s zu3j7!e#wGi-Pn)Sl(HM!QCtLof8C&s@NG!z_O zQ+pfDScblYpQUPTug;bKP#*;wj(?-K=pvLipYc*idW$ZDq_^m2kb``f-Xeyn7hjTI z%=E~4i^#d%Cy08>7IPe}HOKwaBe%n{0USmXo@&GBzlXx0O+gY=#W@f9F^*Dadb#*B5natP8=N)+lX5PR4tD7Nq=!~ z0~N%51oTC5bV$^TqgAr2I65Sb5w|1IUgGGGXc9+<#J=L_kT_P{!9b(M(IL?$jt+?l z;^>f=A&w4-L&dQf;2^FRf8n5OB6-Ay#1EqQ*wOI4C_Z*HoQnAP*9v)0cFJ7fHmg#T z)6(vZ+uXF4p`WyY`@imGa8}dn$oIPv1;rkCY&DxW@|V>`oa>P@*2rZuPa5~EM_IX17~4C;y6Mub zj;lGYhez4W2F7h-9BZjd*Wb87#tk)YKjTIk$8E{oxl@d*Hg1}6MdLb*`<8KYjr+cF z=NNafahDtSTjQ=b?l$A@H12-m78>`YanBm}x^ZtCw-(gJz1w;oWiy|3yYt#U-46D% zyP-n=SMQ2b(FB^U?wTf0jk;@^K*x!z0%{aT6KIY&nn3O1MgpB6jwaA-aWsMEilYhi zO>s1VzAcU>&|Gmefle1k6X-N?G=aV=jwaAq;%EYWUmQ)KABkH4^aF7;fzB7V2$G|{YG40po_%O1iD@vO`uD~(FFQ~IGR9Lh@%NKUmQ)K zE5*?SS|E-l&{g7S0^KK$b23+pW5@T1I5w5nh~u2hGvc^&!S&)e3|lOY4dm~{(X0BV zIPP3?f`VhH+1cNAy>qOQ^u-vM}>=O2NIOZ|NelBW3MkTk`gfTStD2$H7wzaVLfKM6@w{3%G9;!i`; z6n_SiruegvG{v8Tq$&P9Bu()bAZd!f2uV}?B}kg$iy>)>zYIxJ{1r&f=e-Ka8LB0a z{6g?GNPZ#sIwZdkd;^kS2)+r)F9hF$e`Gw$8NPZ!h*$H35L3V@O#)nzg8RpPnUmF?_xuF4(n@n&V zdn(7h;Zbk>T(aZ3;VoP`P9`{xeU{@kHEvtuwl{9Dam-V9?*7J&GH#M_hZx6PclW3> zuGP31#+_i?$;O>!+z*Yr#JDSryT-U1jGJ%VpNxCJxQC2;%DCr@d&9VQjO&Kda_`a8 zBTU8^x2bX48n?Z1gN@tGxc!Y|59#uBl5vL^S7ThAajnM9Fzy87PB!i=<9=w|CB|K0 z+%?ACVBCD;{$$((#yw=*Q^q}K+#ANdV_Y|Av(G<|kblN)YTVAo4KVJrA=qa_uuIUU z{dW(FR%F;(aR9Y>ADY@6K)r|=1owN=&&n{Z0ykcUDF;w5h~ofilDLsTi^XvOHB}r3 zP_K%s0m_Nv0P1yd96%MsaRBv}I1ZqW7RLe9yW%*2DvIL(>H~2cK+P1l0O(_J96%i> zZV}LG+w)sHSQ7P9yjhq z<6bfDed9hhE{hWK`R5Vx&$z9PW3S}WaT79^FMArdk8xv-8*kj9#vN(g(Z)3yH`}=5 zjXTx2?-+NUaTgeOrE$M9?k3~@VB7-Z{%YJK#yxHvw>ER{`>t^-zo==X`cU>brA19^ zsW;sS+!)1fWwCvMHc0ig!@-1OXaHWauSIcY*e_EK@q7^MYhA2cF7q9P;%x+ZO`f|e z{=QzRFZEx&kb6N6gxm*mkPq|u z8D@L4AL?$;%uJ8mq9$_g_fv`7@25I$p`~MMsRa`bn*7NlHpmW0MgqqM*{CQ!HpqUA_}DAWd!nvrCFOAy zl?dBVHq{hrbNOO1KdZ9_t(s+KUdRcFci^+J%y0k|i=+B{J0`x0;SzHgkn>zwpR?0n1qT z8+I;T*Ev14OimA6>71T}r-)aSCUg25E11)RIt^=ZgK%__)vqIdKu810`?GGq!Dj0g z^FF6*eNNZ;oE~90P2_T#D4Y2i&UV}{J#snixZ90ewFY!Wyej3>R&0U~Q(?0S-d#n^ zCiqBkRY3cQW7g%xu?gN!+(@8WacpQti=(flP8@wL2Z<{J9W9Q&mV?Ey6267MTKt8B zUYFz%H{WL@BZ1@Q``b}`+^VcX0J0W3m#2SW4`0DkW~93B%AzJNRHLo zAURfRhvZnT1Cn_;3-UA{X8tgY!pn?QbzoOOPU1f2W?AF7jwX|DX6q~kN^C_Jkj#S|o z8i1E8YPT}~W0Ql|#B0iK{bmK7ot|$AKVeJrR;N>&cLVe3&*X!_=oy(kI%iM9yX<%4X&p_a~3CnFow}$hgJE zEivxXYjP_#uB}oRHm>zj5;m?K;;MkAi(}(DOB@^5HgRlRzb=lA>nw4s(BBZp#`Sn{ zEW@}VWiy*R;)ZlaG7>m$NL!=$xFP)=;^SY9J_vuxPm9Ry=CG}=?nJe{Xbva2~70{{TSY1vL$LeyXI98X_#Id@ZD~{FWJK|Vf zej=_2^gVGb^h?E+t3vEYlSf>IR@D}{0~e2f0+sg+w#W&Us!)4lTSE??<9*UQl`YG? zpQujDvOz9Hb>O>Q49V(r2_&o2rI4&nmqD^RT@Fbb*)9H`+KZ_;Kl0 z-Uc~aI-0gYu9UXY2Kk|4(>BP}DP10pRN-JBojg|523eNx?8Ig2YAv^8{5NhMwS2y_ z-#}MT6q#!wX@^_~Njv05NZKI`(+**nIyF{0#m1Y+*&#&Ecjh?G^Ez&!rK9i6aZ8M& z@62(k8E%uXljdClIukw!JWr+A6HLjSab2nu`!TscSZk68OOXd#FKTrM{wn=!^-0Sr zrPloPmd4IKGA(0}y`{{L$wRB@bfz8Vu6PPeEDq2csXaaBNn z6vrxhi8vZgcZ#Fobh$VhPJaQijR#sFjtgcs5yu5He-Xz8Gh2$A4Ro)#ZvyoZ#|1MF zh~t8p{^Gb`W}!GPnAuqz7tH)a92d+C62}EI{}jgsGkc2Tf|)18aly=&#c`7INpV~- zGg2HE%seBG3uX=ww-eCw;<#XDqPTs5UJ}OzGlz)df|*yualy=y;<#YuHE~=pQ!S1Q zX5JLX1v3rexM1cTaa=IdB90S{?~CJtnRanpF!PZ(E|{4uj?;@={@f#@Cj-P!DM)^#>6$ z_a2x<)Xl#^(u}$nk^`mtAUROFACd#52Oy7yd=TaER&9Jh^e+giFW8aLQD_BHOl`x|$Vag&V88OQu~_h>e*)wpjMcY<->HSR3qE;Q~E z<9==2HOAd)+ENXxw1qs4YJK zj62A0NjJwddON{%qan~4kt8w#<`yc3!^0WzH52(f9r$mie_mynE*6P=gI`2S=vKf70?;tXqK)ij%Mju;%JtxCGJ3= zABm$`x~@2yr5A{!S-OEZnx&VEI|XQCaWqSRA&zG0X5wg;UM;SiIYI+9dBo<(?~;+g zu{m;G6d#)-FCsqPLxcB(He_zX-^mrsk>;A3#`e~R=B6&z8}!2Y{_rDpyrz!O!=qhH zg@;7pu~GP_C`=y%k8r(87Kw8XzK+!NsDy*>$}W#hccUlYM^n!C{|J&@-p7#a@|Hrf z%gcP;b$P2nvddc?l3iXmNOpPMA(`(zA#dS*E|*TW;Xr-b7+F^+=}$I*6j=MFM%sB!xlH_|v-Q|{a;#x)w(Vq86* zs{HbpEu`N)5nb{pU7ynQemvJ7%<1G2`;)$f$nh1H$DC3@Q@K#Cv9W+{rt0&xg<`Iz zd3sC3C+J&R2PMsSSs!v^$c=o-k5|c01w-U~OGMesmB#(bqip7O%iWz8agyHZ&; z<16Za^U_DQ3ZuirLh}9CD)fNd+w)tX4Eb(bL(+S@4dg(`zL0}_cvl~0Ek8(Q&9;Wf zd2fl_EVASNN-$m9?oO3pKc4H4W!1K2Ek--FVhJ_Q zsza~PJZ)NQp)FU_2uE(G;c9pg$gbSDER_L?bbMx(3ak?I;_istXOf*ES<}7<$=siy z+-FTAay5;}Ek<+PFMO<9BIUT-jr&h~aVwfJ+pDlQz{B3FBBmL$lej9N2gNb#z95cf z%%kFH#taa5AkZRlG-C#fqZ#w8xFXO{aWrFI7Kfbg>zSx2a)^C z!*Q?p*ldQ*7{`5VTo&!0X*ibEzF~ZrMv5 zr(2E^w;|9laUAK?h~sq2XmOlwnI`VbK;y)5x}`xJr&}hA<8(`-I8L{GRUD^Vn#FOt zVw&A{E``Ge8av+SlqvRnEp zBs>2@A=&vK2FcFk1W&IDeoY5)H_baJ0l2;pWtRLE3O$Z$oIj2Yr)IGyS= zX*`{hOl3$iW(XlFg{~CeAoW=w9au#!}YuV?U#JM>%I4L zp8c$OefQdH(aGBh%Di?KlzFl%lnz{mna>zzXX8XQQS5Bcvd#uAn-67dZa8cEOc`6` zjOE=}Is9GwY^7k?d?;g_4`tW!cNp8t8RtV8JH%N7XZ)r1+2+p9a8}@~i?bfi&Ue<| z*;UR4JGACNVOup4Cm_Xie84^E7X|{aaDTMOO2pw+sklu8FivfKFaUhtxZ8O zJe(zKMpp9S2wgln3wWf?$ZajC@bbrP0aEz;Snm13g9&i-Lis_$C4HduGModg4LuK9 zCxq*UFw5CVDrbFyWnKm{^D@xNOxgFPw)H{ zQm`678xGc7*#}dQ2P2OqoqdUT;&%EOc6hH@c?!{^SK7i7_;h;wQ5SsG=80X5nCD*_ z0OdVh4rR=rte8JFSk?(A%Ot~{u@7X7op4{*RB6aMFxP%5(n++P`!9pFop9oYfC zL@W>1AhBAoE)!!1_!=>GfCq`O13W~G9pJ0P*a03Y#t!hcV$8I|#RkHXZSgNX*cHw`;*RJc(fPO|%9ot7kGLb+4CmtqO8ic=EeS{d*RHfk z7v!GYZZ-BD1cq5dZ#UW637H@*~fZhycXYm#& zJBvf1>@402WoPj=C_9U{Lz#buLD^Zn1DXfD6Uuxr5_(VwGi@1W)z|{bU=O%xS?7W97AY5k;xQsEc+jSe@uNmV5E@PWJ;{z^Z%=LC1A8;At11@8Hz-8=kXMDhAj1Rc% zIzHes*4kM+XGP9>JG;o)0B6@Z8{%w)v(e5Tb~eG;%g$bNw!V4zbIrs51s~1&dq5Fh zKgoL5NJPW>c=&yt$3vN2!vCl{#D?;1b%)p`d_XJ@)`w#35{?yPm+%uYb_vIcu}k>5 z7`udzim^-hjTpOx6UEpiTr4&a)>C5a5-t@R25XWSyM)Q69PzPB_?#HKggIjD5>6Fk zmv9rYIj~+7W0!CXF*cJgi?K^sRg7K2SH;*R+(B$-Sg(t*OISmUKGCPB}Sjv6o@(BlZTYkHkKPRY&Y|So6ewf>l@ScUWJDZG!IX0b*5PeJ558)z*-_! zAJ(B_4PY%3J04a8u~T4efWbvh(hgQbu`aMOV&}nXB6cyXO~tN*)lBRbSX+tR1M3*E z2Vre1_B5>H#iqd8S?o<%CyKoXtA^M@SS`dB!P-+SDG%SRSOr-7ifsk!bg}JW9Uz7e zlo+b*i?i8BJXEV4osWlVdqwBtp;{e$Y5Z`V--(Qv)PWAhorNR6edofnkL=p9IKRo! z`3+7uJilil=Tvd^5t~u9e#n*%G1H0jY4`-xUOduphbVkO6#oBdeNR5{;c9=`@xwL$ zvcnnF6WQUNqHw(^d~_6U9fkWu;j5$YT~T;q6n-rVFNngwM&Zp_v~i^AzgrYOGzy;- zg*!!I4*s+M-jFDKUle{e3cnMDzmCEig<2!M->O;RE2pF*o3 zy+4Dpefa{qPYAQkV3;nTQ``ka%UnRTY_gHDufugV*~r*3XPj(gjFXM*vsIn#;Ea=v z>^e?1vgzA_JFgA z&YpHQ-PsIhvz>kDY@xHSoh@~?%vlDx&F*=VVA-0o#&&SVUbC^ioz-`CsIz9yj&;`3 z*_qBdIqT}Iud@rB4RUt1v!Tw0IUD2b0cR7PJ?(6|vl-52JNwYtLT6t)Tk33?GqyV+ z{(^=0bGC!Cn$GriR^Qp7&YC$p)>%tu?4$GBGD#{(SV%6?*v9 z_}OrDUHuJoMr;*pkmwvc7)Jo|ArunxB7c zF_h0qe+n(ZsmRqfS&^1KC#981?!{Hc?hlr|^I&Y6v(=xC&|0anG5*r>*$9o58k~(# zsI%Mq*_~k>wL)4o1WAv2sS%WEg~~QTrjVwOn$pWS8q0p?;W~uk(H8$E|3+Q>yMEqy(+l*fdZI?}@!Re)3=f9KRzi zd7m5XX|obGgw{ql2U-WpFn(M%)ofH{woEx)JlBbR+Hzr5kY5N4ghFgxfi(HXZHTC~hPN6S_L zHa0(8XR81kW1QJ_#TvZM$Vc$V_pmK=d93K4`;ocF*n+GTce}2-GnN!%b)7YE*2vlE&RRL^fD%x; z>j(R2qt8$QraWmysK(ERgSA=q5xag^i=9}8>*vOmxBm1I6tpi)*W9;9wCn0c z{KHVQ@b?@6tpaTvYMRqj({P$REpz|S$|MguV-0O=nzNUk{Vxss%N$H$Lv>^j4yF!Q zw%}mu6R|v4O~h)!!ba-2j)SRV#5kD3ChA}uOr0pk!4x)72WtbXr5FcO*gPGKgQ-?x z986*3bTAI43dM%O!lvn9987f$loJjjJQ(s1g*OT%k(vN-!Z-{ITn z6H5>NR(5#UAa@S%7!(`+{^OynBAP?l;W+`y4$p~Dc6d&L_JE!YWmVAv$_~#dP{w;p z=%XRbwTBqy_neL&Z4EyyYxrqpl6m25Zt_{MG6}tKb{)NNcHKs3!i;SktW2_{vu&JJ zbGDna{hV3tFo1o>sm?k(W2ezR`&U;DWfu3JRK!@^i&Vr|+Y_>BY9HV^^#x*7mP1%^IPwxOTw5^x$t| zam_%P9y|(AtoS?ILRnl3p)9WLpe(NKp)9T)pgo`+p^VSYP_EIzFyn|}7SA)hc+#@s zNh_0l5zgjn%}8UvIQuuxb-TkKzrY{Ew60Wmfz*tI0VW#y#+cvgc(l^v$1KV0(5h*tg#`> zByT%=FIbu6Q)g_7?7APFu_-cE0nG%hTs1|;wsyv*$k?vV*c2I~>&-sPrpVaw&e#+g zTm2aU)s>H#@XKceOjnNH5)8YnBbTo@BVgtV`Mn{oN{@P}5tR8Ix0oRLr0IAfy^Q%i zdqw~o{<8LfzO{_}T#VIP3Oje!;sjw1c8ToG`v^zK-Z>$dj&Qck3Y%A!&0f<$Dg2Gh zkNo7p1UT+Q{^9Q&3EcvE7qm9?ZfKnlt{cM4X9dbYz1p?I;;yUh=USDR zej>#5(;=oOhnQ~TF-^;2nwD+JYwSM!Mq`tLWt$%xTm3q%wo+onI&Gd(f_2({I=f<> z_W26w)DTytN4?Yt`e*Aj_7LJttob)tU$9OXw(9BlU)>{g8q$&X_!5+L+RM<|&{v_X z(-`LcGt83JR_V<;jh5AEv@%+4#n?;XthJ}c*q+*T-}+}+ry2Vn?2zuS?6o<5!nev) z?2y(M%Y(I8jMdj6V(gIqBE}BsVPf=hB=`e48dV=5#tvx(u_9QF#n>UOC^irl_K6Q2 z(#^$KT`$JJw)mGG>$*ewA-*VXz_UA~oG%iN664b_Y|>KHMQF^i$WV#qfkiqTe^vj~ zp3(#k_FBd1}mdEJ$BtvXE`X-#xlXmBwIPF>a2#dn$GGutM9C_vu4g( zIpb4nyT5f&kjoqw9?0oA6=a`;9gpqKh|b4jy9aPSE=v4PW~Pj{23XF_xmf98SytLGvYERe}B2Xl72^qFn<%n%z*7Z1Jbe#NXypp zF~-{1*muFoRc&l+17s(=j#<&zcFuNkwq}`aHGF9Wo&^v0EZEkwU{lY6?L7+~C&oIn zlNclVWU;@Z&YXa6KOypmW!IS_Ry|wh|6i;-H%1m@md%AS%T|Ok%T|K2?%V{*y0bEr zbtl8DI~iuy?ciCLmStU9ndIwmHdoynW6PW|!y4NpSh>mO&USFd$-#CVpJvj^)wXHI zI^ge>?w{zQyu-q|e4@x{E99bT{A@V*%d?NzKXEor#v2NzpP?^cSaO zed!-LC%(fqwX&|`_p;*I5SspmZIBwgWLqfjXNQnF9T8vlUJxxCG1JN<>=GIq87zB9 zVvJr2yKc=Yj51rN?n)x0Nzz&g!`7*%SRSnQV*KH~#n?J^6~k{YF$!7NtX7kEs1^eQYmr$qX%S(j}qL79Pehq9R0gtBGY3(A&>VYW;R zvv_w>2IA;|mKASWndC!f9|y~dyj}O5vt@oAi@beyn_%T8Y@>{=Sw<_pWm?7{3vD9ZDad(aNL-rAO*O>hASc2clOm-Lk@s*8mlpL1B>(sMdx1uij z?FtLqwk~LMR-Lt6FxGTY^yLMsd-^M&{C%u>v!5I7hl0Z2yg!r$>i{SV)`3vApY@>} zmLCM=u>4@?Wza*QjN`+g!$X+y#xM)sStw*ShlrLHJX$s;F}5&VXJZm$9Fy2}>GFhvmjNEVt`8EH~EJ8HeS@I4rm8I4n1|E(&s)#qeqs2b6?ln2H12 zk-=hluttip9l1e_?Z`c1EQU9Uu^2ueR$5VFfy_SQqEwK55_Vja)^u1t`cD<5eb;eO zT3$3(HY{&~tjwa(49cQ$6qH5dXef)uF;K?M@lbXx8EzfIECQXq2+*=3K+B4Nv4!C} zD+0z?1nfE%0b?uz##jW5u?QIBu-q7j<;GV3QNd8L@^_kf)stj;<@S)Fx)vN}5p%Id5ul+_u-{H+W# zYj#!Eyg67_osne{W?y{)b)1*JzD#{)e$Wov~swwl1>p zns=|){4bQ*Gq}%-(K{*%EJhD{G5S!9#pq!#MhnDPjK+I0`a+By^vA@Qk-rlwg7t(L zJLo@(v4j4!*fp@0i4B7_S&UuC4N;NVo7K;YJpq;xn-1#*v6-+o5i70ueu}f%N8BTs zpM4T`+#{JAosT>Bn<3l869xF4%>E1T@7^+sZ?CQ$)wOS3=0t(DTZUPtTj9QVq|Hrl z3wrpJM=>6BhY@(7oq*3Osh+vtRxs_{4>ldrJGkNw5&>@mC@@3#=Z>K zWfHb*#@Mpib$q?R7~jk{#?iSkj?Rto^#Wt8T#V5nXN)iY8sqB)#*TJ&s6RmE71ye7uhcqcJdBX5YYHQr6E zwBpPPCHshrb3yh=*l}@YtCM}i#d&4V{l=70oNe>Pe9WyXIOmUM{jA->yy^ptD^Ltr z+^&YQxLpHfal01E;x-t{xVZt!7MbDJAo~wL z#sP*g4ls;yfMJa7urUrWjIE1oyyorcn*W6|i_$C=2NtD0y(qmamIt=47p3>bSd{8} zQTj-XMd?s6w#Xlgu>ds|D}ps&j4g6AG1l6jiLpg)E;bC-7h-IYPZ1jj>uWK#$Y+R6 zhqXwIEpltI(u(l9Zjt$rBzCuDx5)olg(6&x-gN8ydi%BRSiFw=)c=k47=19L$jVye zTT$d$MGS+oins&HD&kHktBB!Hw#Xx(Y>`Jo*&^QsWs5ut`UrG1lr8ez(7DhtP`1bn zvqff@RZ0)9QfOI~Ld&WYV++G|R;3tYm15ViN-@SN#Tcs;W2{n))o@nR8Qpev9o=?z zU1Mj>oV9S)(pfuaot*V{*4G(ZWcv=b$o3t7*Q)H#REA|%dq1cOVYSymRS0_!KZ@nS z>Mq6}#8NR*NS0pE4wYQ-dtG$6@EE+jttoE)JW3~4W zF;;umiLu(ND8_2<7P0BDHWg#FH%x2}tj)z(@r)K*0;`JHZ?OI&R$BGQQEK)P_i!pl z=i?qurRaRz!(sax4_Nq}Ec$$^%*CR@QQ~Pt+QYHxv319;rEYb%cKbN%x`O22pBH{` zIv`>d!-L^;KtpdtdN95?pkY*98Q@q{YmCEjP*$Jgp{zb9Kv{i03T5^A7?joL<4{(g z6QQg=pMX9BeG8uZcjt$lX?cqw0#!JS1B20dNIuEw8*PdT2`IXvH^~V+wsvB0N+luAEdQ^;6=?-G7 zN}m#ARhlQps`NQAR;AU%*n@mgj8*BbVysGMh_NcIDaNXFmKdwjy~J3R&K6@;T1$*o z=^QaurTdDpDqSE}S{2DkHT#IG$obhPVaHYE+~|B1NsQ`O(?6rx1da;ccAP!GR$~qm{na*uj*)7RYxn6u);LP&l&s1+4s(VcSc9C zUB^n*KFjLe7~fAfwu>{qpKfelXM8{1*b&Z-b9SP$d}nQ(b#vC!8LK+`d#vhcWs<*Z z6;^uBvCN9Co+=4eY+tI9V8wQzSRSnJ#aOW&EXIm$sTeD^e~GbTTPDVe?Qk(xY~{C1 z`-qLiSg~cqSO}Vmv0~dyY#6Mg#8|OyB{mM$v0|*)b`WF5)?ADg+b&{rV4Wn!B2`nY zw91aX#q1-l?0(5U2|KRrevHn?l^wHq{Du_2lLeZ6g9lcjvilqPujB5ZSAy4O#UtZ~ zmEfk(O9KB0l@sIaV<;=ZPoS&>=RsKs&WExRTmWSy_$ic?;Ac=)f}cYlfi8ry68r+n z>g-D>)9@SU&mqioVVIR+F)9a}{X)wsLt6HRw6QP3b(w^J$r$sEUB~9m7#Hg>#wTRP z_=dExU7hg_X=8jt+OFdp(#D!NJIdK9&Q5dI-q~5s&USXLv&)=a;p|RlcRBn2tAZ@O z+FVbOt=Dh(xz0DbT%XVW{`suTF4!sRy08njx4JG{!)hs(2dl0ayI^OC?GNi9cYZN%6GYbwUEWjir;!HyPV7p$WgyI?1Yu?yB&j9svnV&hLtc5*jZw9)AbQ!Bi}=;BAS?U#W*tPEykBEE)e5N>=%g93DRGT>F55iE$-%?5_@19=(^zVqA&+4l%C8{-PLH zVjm$^8`i60hrt>p#+BIL7UN3n_lR*N_7BCl68nF|xDxvUF|NdpP1x|gT#5ZFF|Ndp z4cNfA68raJT!|f_YgZ17B*J{<9gBi zig7bjY^(;x%}ncyaeE|ess=U~*5P7z!or4XV0Xi6D#p!Bv6&heH#0p>jGLKaBQ-E? zW_q$1H#5a1YGB;V^mH+9W;$1lo0+x|+XUTIY@UYexS45ZF>YpxjnlyPfYn`$TO2JE z<7TFP#JHL1S7O}Ew7(cPGyPVq3#@@++|2ZQv5R3{CC1H6mxysQ(;LLNnd#4B+|2ZL zv8Q4ED#p!B?-Ju?rr6>I_s7jl$A~S2h3#IzxS8q0Vo7-n*u=P*>EmMD%yeThZf5$F z*q*R*#ke)#6tTl$Z6bCgte3^`hf7TV%g5R5BOZR85uJ~RU;mEI$HT89@ul&KXZ%iN z*yK#;gDW3?bua4HzNnzf|M-K-c;LlwwjZA1%}`nKNd5GDu$LV^I0~N-h3RR|zW#zJ z%*S-u=f_0hNl|!K6#g;_Z@^TvYBRUz5E~8K1R6Ws>Hf##v#T3#2FgyM=7PFK1msSH z0m@wrHipvw`41>}F~~r#f#yO-K`TO^fL4NXP5VutpF%fkpemHR7;FpWE(Y5{xr@Q}P_E6s z1GEWrM<_Q#-3iLgQ1hVN40UHHH$&Y8%FR%#LAe=fb?97Z4JbE5-4$91X|Wr07wGO# zZiZSD%FR&sfO0d`J)ztTbuTD4L){z7%~1D&ax>IgP;Q1=8_La4>p-~~>b_8JhPoeg z4`^Lz186-c+o1!Yr-d-v7KSS#y?VI|iI%yLXxZ)y#^#6XZ1)9YOl!NY98$$t`C!@Z z3&yHAV{R~3-C1pCb)7YE*2r0NXY5Ja_ZB!Sbk@UJFK7LoUFvMGvm2cacQ(q|SZCv% zO?EcL*-U3|Ih*TjzOzNn7CS44+!x|6Sho8@h(Bj}eqD8E?2p@Zb)7YE*2r0NXDlNj z{+ty$>*1`IGnOLzj!T^lc6Ot);m$@m8|!Smv&qh;IGgG0EoXC`&3CrQ*Km)&fao1*V%k$i<~WXRt~j?{oeAyLjH5ck%Prcp0n!CYCEgz zjAMupf6kgaJK0%*GuC_d9X*`&a@OD3rOpOByV2QjXQP~rbvEAF%g$bNwr1|*GMy!r zHPE25J06fUiO$CZ z63%mp7rEwlqO56gnTJ+BAnB>yzSi=1B%OzIeAfN*zSy~`0BsofVQAENuSY=HxoHSx z=cW;qzr88+$Phj{geyXOdm~888bMl_WKKAnt33&fee3LpU}f~CpnY~DRP1)$Ho>yj z_l>PtMqBTBMTD>S@c)18;V-kQ#ZGFdLRr;*>QyavQ3GRD`>j{C*g-8+wTs2*m)=E; zmC70FP#w^1`E5T;kr?L{nFSF28@2`gT&~U#%3^J z^h+NiM!z&Rf&rsnx`7z|(*G8tU%HVP{nDq4(Jy_Z82!@uV&zerA1g+`bZasCrJIY< zFO6L;@Ex^bog#J^EbMRrM!)pwV)RR&B}TvW8DjKHcNL>wy0sYn(mllJmo5~eU%FU~ ze(BC)^h=*D#$IiAG5V$ZiqS9KLyUgu^TpVg?JY*XGM1i5UITmy6LaeVJHk-2{55vyZr&a7=VQ?j{@=osYW-?4vi27W?9N0w>2p zxxZ{U{%9I;@j2ZK^Xuf-t`+_(D(tdmpqD{Uh0=%iZz!kxw1m=!b{dpEw9}!Bp=UtpLpu|i$GQ+oA6hFYeP{(x z`p{ZK=|gJ+r4Owwl)j5XD1B({p!7_%hth}E0ZJcQM<{)0ouKrgodu;2tuypwXcs7b zXkDTGq1~YLp>>DSht>m1A6gNVKD3@t`p}A@=kD-oqgbJuCuS4Epqmo zvvNqY5P!i!{5jj+S)Q}KoUz5V&mQ8efwN+CCMi=6%DtQ_;Q@+sSG`)!q-ZSO44*<$o5k3rzgesetlPvm)#O$&cIodFW0!uI7`ybt#fH%mW0(GJF?Q*(-w3{gUHW^) z*rmtbBVg>(KPXmO7mc0!>?7`?(dC|f#9g$x*(YJgU9^9okjIaf`JKqSdX3@Xvbtzk zfwOzJqGEfS{eQe$mes5?UDJbc!Dc=CRfhg(ju=0eK#_3CrBF8O1E6fyFN3mK9|&c$ zemRuQ`XDHq^(&xk)~|%JS-%R(bh;M$NeC|p;fl~cDE>BkmzFhqwCvG~G3Enfi-MIa zub{DVNM*aOe6Z}%i?J%s^8C8$&T2cW>#TvZM$Vc$<6zOgx4>DUvmVZRIpYfqb}t+@ z+Gqc+)!6?9-&~nh=@?Z@tV+kJT4GgtzgQlu31X~D9};6#`nVXY(nrKtl}-|4RXRb8 zRq3;0tV$mjV^um;j79EAF;=D1#aNX-BgU%qRWVkj&x)}seO-)I=@crr)9^N9HV<3EzK;OMO{m5h_d}t`6v?enHV?N!**x41W%Do$%I4t?D4T~n zp==(8L)koxfU-#yS{p!Y(VC+>r`4`Jp5hAZOp z=Xi5M%bF8fndF0THaD3YEE`$bb!=GdI+h<}|Qz`u1a509XrmTE~IDZiQN;8b2Ej=A`U{wFnQ^I82$d@h^TKHT?`6 z)ycR&ss&CuGQVw6!P)t?z*xz80G~~duo7kY5T>_A<>EU4wg~CL?`5gLkR(Ze!z0Lj zJU;=-`*}R%#=gppr-IP3CDm!!lIq4rhO@S$y0IsntyxE*%%%{V{~(Fj6fRN1uqm7) zmIvz>G5+vR#Ml%jxFko3!lK%iBphrMvyZqLSl7>F$Cr@-3Og5eDeSs#I`YgR%pk{S z{dmR&GYB((!@wsYL$KO>4$2JlJe1Yu6lfFZG$^0RGJJFhSA?Fc48$kWw5&R#WzS@d z%?oEU$+v#p56%)4R=bYRWbLzjCTnavXKR+xO7HiTnf(?hTQU1>q-@3Phs}AA!SZ0` zh%x(NqaLvRVO11kPYj#%fH9&s5kqWiK+qPN9_*84A90o}$UX@>?wOnsosWAa_u_m! zxa4;-nOox@E0A!k=>JEZRM@q5mxAu7mAZ6?uH)WGR_o51C_Q+u%%&Sdj}GuvWIx{j z>riIXH=xX>Z$jC+zXfHyyaUY-Vg6QzD?-on>`KeBD=iz$8Ji!jvw3vJSe@8)<&Ytb zl@FE;=8RQwwx?fL%h|ff!lh^IzXvU|cw)aR6fqXh%~izkzhtpk9;|J|SUi6c+aFd{ zF&58X#8^DH7vn$)+Zy5TG1KiVRs;)M8i8@3w5u2gN*jrBpj1p-z3u(l9mNAF)^94Kui#(~liVjL*_Q;Y+pCSs*k zGaNEyA8|EvNOV4~W)6(b$JI=2_L{TRU!;FK)dOrOmoL(Pq-q2Xjd#@9?fvY|u#R1! zzGw)N9`#ZqDC-N{V#2zGx?kX_u)eUfHWa!Np{9{TgnyHtt&4w;l~EtC&taP}hXGNE zo(JzD9AP|^6N2f}>us~bY45jb`WYzih2@E#J2>#4k&k(Qze2Zw{syhhbNkrB{0#Hn z8D@UJK>58-uxw#|vP|;4vuVM~ByT!<$Jv+8zIC?x>A!O+>3^c9KekK4uU#?yPg!T_ z&w3^v3TLPP<7K3O_pbR^*0Z2%`_6?Whr)k8>Gi73%F@09(v)eRfimrLp-lTtpmjo+ zY0ogz{z6ZCT9)>-GRZUHY;N*guxz6SyY3BVpZRsn1@_t1PkU^Fh1A^`e`$Hy|F@_8 z9;KxHnd>a=ufSczJ0)bN{lqfTzGq?gf}(=r!u+1agn*eZ&UB!WLFw?C$p!8wTqLF?RR+iLtxiSd88MOT^gSKT>QatV_k_z`}k(_bSvntPJCt4Zn$RB5J)mqt_k^;mz8CZn=-yCv)%St2t6mGr zJW?CVwA~N7DU@NR7sITs`m4I)UDC3yIW1em+1SEx*4A(~#$RjK<>0Rw%LL1IL^oE| zSq;Cgrn7p^>N{)fj6+BJjuy^ZI&0^wle6B=IP2LyJHXi>XG5F~b@q@mE;?$TU9)Pp z%nIuS6>3&kOokk~rjwJ!@?bHG)(_5o4qGh zW}|SLDtk5xY!0kZI8!VS;qAm~;r|6kUW~oi-No38?Igxt zEDU@Hd$C=_*o)m;Y#9FEU5r)#zGCdf_7r0;mfxL|uov4~jJ??UVsr3+>;;9h?8W{| zjJ;Uw0|mxj?BQZ`T3;x}ei45`PO>vAKruS4`Oq~d;q0DE#pvohPK>jA28wZZ&xvAu z_X(Ti;1itpaf%pw0oX7HtUoOFqjC~XV#DS*u=ws%E3whAuyGF9{jeBcISJo=x=D=h zKD8Hn9oA4WzWdZgjPnX^7vsB6-NpFs6L#IeU*Wq?#bSK-X`~q6ePVAkC*iwK*lhz= zZCK}t9R}-OF~0lMPmJ$A-6wVitV_iB?$d)}eD~>cF~0lsuo&Ncx=M`iK4B?)di^J1Js zJyMMCKD{8ucc1PSiePUdb3+qkeJNTBySTU~2g|()^3SlwlO%&srTfZg(Y9{_qZn43t}7L|MAF* zt8--^@yP1a=zKh~`Xo9ZkE|FI@pD*yCn7ib4Eof{J6Ao6iwX<6lyr&F>l2RP4XqS{ z>7WRm7aeJMzbM=+3b%^F%*H&@&tGXl508k#Yci~eAlZ3l<#_Vg!YGag7RIjv!HyNrZbf9dUb*FU9YZCzU$Qu%6GlG zL;0>(4=CShDS~pnq@GZ&msAYpdP%*YmqU9)xn9!QP_Ajx2g>!5&VjPNI}bWPgjt6% z%mLKJsBdhtJS`hQ(X#m!#^#6XY<`6?#<5+;p_DPsuQ0};lrhe)Fve6cR^3@`XLX%5 zaMs9Kb7$;b*xxH~R_LsUvtG{nJG<1`U}rZv8}4kBv$4*`JDcominE!{-f}kA*?eb< zoGo@%4ykVO!k&r!w#v?`ILmWZ-5L8R_Sw458aQj@thqDh%@BXi3Z3{4fgo!#hcxU*5to^&?J*_t^b${g%q zoqcq^IM{gw|7@^>HTGfUAv{xzgB`4|55@t?7`^t?T)lPyazDt(Y~DYuOft;bh+x^gf4lBUXMY^SKb8{1 zOx4wk;fwIeW6Ox)$t#WF!XCW}iaU1enxD=vSZA^QK#1+JA-2bb*uKnTo0i2ktxPfo zzs}eL!Llht#-=%2hm|LmmPOLAmF8nWt30u+EUY|)zY$Y5gXhp%X?E6^CuUoO(&L!a z2)edgX=cv&AvM2~l@TkNXIGjT+V$$%Ccm%`rkJ!XT-&?9EiabG<6hE(_s3$%DyLz9 zPatFPo}Y%Y*ggYg1v&}Z1o|A56)3~}T@14V9jJ`Nhq<(@0;OdSbB!?-jV&b-a`ddeqRwvbXLp8GUS~Ig#agl<{-sB~)CkIwfQu7e zOHDnq;j~`&$(~nxIZniGWd2Qlwl4lnDJ%VK`?sFO-7w+4utW;-7QzvF8#y7Ex&^n* z3TL_Hnx-Fv@?Kca@uLR^J`ZWg`}-8S1@tp0-F9C<>x3}xonh8*S17If1k2{uk!6y} z&ZYz_qY)&}=4#w%*L~^Nee2h)e)?}(O8T<~we;V-l=P>QaC!M$o9RCgzb9VxH9P&M zmXZE#Iu{lcs7QilAq;yWoiE%(v)ex7|OI?0%h9&3}xCg%(Q2iX@8}sJuORn zTA5^0IGd{nJH}pf_GYkb7iIe_bAesA`e|RKl(gs52}^q{P!DUxvd?K(>n812R`y>g zEA2VJ$nV*!buovI|Gl!0v5C@uLnzaKBPi3q0+i{`Fw>u5rvFu*{Kwk8B^XqOAnQOcFhJ)f9F|BWx8+kl*KnkH14E~y)~?AVtKU0YQfr7j9xW9 ztj*C(5A2r#i$fnydCN&ohlRZ|V6}m@k5~~b?2`e;xhi$U*vRcGb`31f49Ss40{dgY z8U&_EF7VSS1AP39v(`Wjx?NhN7Hb#=zOav+&cg1wA}33UlDY zBfUO*qQLTj_no@N{>OM@hqN++Hw3;NDjLS+j?k^3J3%?{&Vx3B?hHK*x(l=iv>Nm> zXmu!`6W4$~0^Jq*B6K$>eaX8+nOAB;*#+DK%Cz1aT0MlBehjmsyG9k=&B3yPJXt3B z(Ameq$|PSqW2I}?EpxU3{;si2f|aWo`^I)~#<^FCu8|G|;v&Woqj+TAz>Nn&~RjyZT$WO-KwT|3TI=f;= z?i8I(%YQ?}bb7GS%|8C@AZ}$ZNKG%Ze0M8q+p#NOk-~e^UDirhj`^u+)(_(EiwALa zk!KMh$pKI{;s-+6h#w5C6T)o78D`$T7CEaz!a*D@Ys6{U3sS~j2xsjDDPwOt`_ezl z=G;Ep0aocA{bQAaD>|fFu8@M&_}Or<)Mp>DL#h`}#_M^dpQ(a#FO``>-OtJI*rl`~ zcGg$^p+jHKUTS4s$?s)qWP9|FKrHi;#!%kRks;OxE7ng1p=E9oTA76Pma*Z%GLOD7 zx=HN1|6Vt#%x*_>CFkb2t$ZaSyB%1v8O1dZ7AqZlZvx9T!(z9iomgX7SgIL}-Hy&; z>~>(8W-xX;x``n^OEl~3fMg$Wvwn8=N!W3--ZMHMH|vk$eC&JUcd{vBL3w#)nd*;* z?(4Q)SG&q8q80w72k)Di@*mKX0z4j>kiX?bC^PLzP&TV4L)omhfU;RV1Nh)B1|0cr#b$@iqcuBibausNr;pC2`LiK@NqW>vji7(F*%^S(#obE& zO?;tzhp&{C|9W-q9LA0%x|O`waICW9a8;U|0^|qYTU#iboI)s@oDNVnISkhgVdk6b zm2a4nXjzj(E0a9!?Ac&tk{QlkclMbxHa_;*)ld6&rKJ6Np7tF}N&5@`vb3L3M%uS6 zY~8DUe&>SLg=^(?>{WUnyBpG$X&3y)mY} zF{ZsSroAzyy)mY}u{CQ9%WU8}EBQCaS6!?`X9I_|`%y9E!5S#WUO5`)MX!W!?mWwlnv8G&?eAJp+|-=e-FdVR5vP9u_2;m4G}GCh>WozGWLyM z$A-ul8zQ@o4Uw^Jf@NEc8S8-SO7GWVe+H!biv8NbE98V~{A@V*>#~oyUwa--#>=v# zpJ6}pwK7w(dvS;S*4=t_ZQB!15qcJvXb7^t`476c-{BJG>h$1uGqpB^roZD##6Hho z1LZwk7gA%0QsYz*TGqFvl}YY$c2BS}34645-6UsgR-FINF2MD_4Vh&9OPGJNmoV4o z>h-xA&FcDGZQYCY@vuG~E_ttbgGb7(kB9Z~u)e>uzGYZn6BMuSBd+fwuJ0qR?-NW~ z3pGKR4&OfR@a41zd&A~jclh2cM%UN{?(iKd#wVKC?GB%yYje05pJ-kp)&>@*OxT9! zmx=M&+-R|Zu(0DD&RzrSKCxl2u-hFNCsI8i#)(we`3{T|sU8uV4(occnXn!gn*(cz z*r%{2iYA6qNoy0c*Mb@-g5FaG}@vHq~$7P}Vze?aUeSRaTnCdP_!(VsbDoKP}O zjQ945*z5TJqheh2hs!eLB%k5`6UDxP^{v=4{QoJj^6)A1<$FBKgN40QU~$o(C1PCk z=Q*+3u=uH*&BQqCZE7anT>FGLOHv3#=o>xabd7mV-o5Etg%t>~Dg#}_@Rflz`*nY6EI1Jc9uo{UqgN21*z?#E4MywUA7GmvTog~&9 z78ZoTb?3w4GAcRAm9VfF46N&6wH6xz3k$)3-3zOe*ke2^_6)4pHQ6VPUZsup?j% z6*~de*<$~O#gdkjbb!@YtQ#yYA(4|@0PB3QOJUt7b^|OvQOikgh4rx57+6@30BkI* z$HgYW!rBC2FTi?6Y!E_Mj4>S9O3dQ$8}Sgf;hlGd>BhAFI$uxg9- zf%UA|g|PM)yBgLMu^V9>EOr;HX=49@)lh6Ate3VEe%8Aa*D$ycG!62o~$qoa7`}bHq-A z)l;k!tWU&x!0Id357q*)%V1q7HU!q^Vz_8-z3u~lURan1><-xjFtQM?gV*A5-K&&yWa_AVM z{|9S=*y*tF<_uUHSWk)-!NOZKVCTSkR%{@wjMz1>ril%MRY`0Vte3^c!P-ph30SX- zO^3CG*i2aOip_zwmDs1SJ``I5>z`u3!CD|z5l_!C$r|^v1*|W{c7}xs*I>KDVw;3T zA7Np#HLQQZS|WBVtm?T;7 zij9U9oGJ0@50(i>@!&P#lC^Ho7gf~hlrK0gl`ku64qg2 z+rna-iA5h_VVWka+OQ4~I}8@4Y=Sj`^)Im&urPfS>kR8?v7WGw61xc2ablOl zIzjAaT4Hy=Y9aOjEX=sW-y09>bg}1QohtScthQpaVVx#67gh(cZ(*G&_9LwBVmX^& z!7{N*uzHJa2Me>Z@EyCrx=^eRtoC9D!eWb`lQf0ZN$faSSBaeotBY76tifW%u)2$# z3+ooKL9j5(2Y+QSEcOx5|AU1YKd|nGb+_0ASm%g61#7I>%dpN9djl5x5;@7our3t) z9M&^pKf%Hz5S;xT7JC{w$tIhkH5ID@Ylc`gSOdlOfc1u0eOOnBHGnl+?08sLi=6_C zeG~NmU=0@Q0_#(;^I+W|b}_84#jb;Olh`e=mWbU0YpB?RuznMJ8rJP%Q(%=xFCZs* z6V{z#@4?CyTL^2U*dkb4h$Wk0WGGevR#maBVBIUWJ**wY_Jnnx*uJoK6FVH%gJMU* z+DGhESPzTk!(uNA{Xbaa#d^UyMC=k+kBMCY>j<%-u$~Yb4(lkfhhRM|_9(0q#iqiV zEXMhXEydo4^}N_8uv&?I2kQl~pJ8I|$af zV$EQ^A=VsLf3a4uW{I_jHBhWKtaruEhjpFUm9X9yyB^jpVk2OEBz7;XJH#G?^|9D9 zuttl`fHhz2Em-%9&4cxs*cY(Ii!Fuqg;+VvB70J7Ggx1XZ4K*Lu^O-ziR}ezn%Kdx zeh@nX)@x!X!1___->}{hL*-jymUK6q%|7DEW?iE5@hs_%(fN3m^bFKI@mdi4P7FAb zuF#pA`M0mIVI|k#YTL1>uuU=cj^XPO1#Q|C_FTVO>VcIxkD12=#2i;wJs}Erh{Akn zC;R$zdCm0mW1{nuqVTLJ{ACp0fJuoX{d?O);k~19!zfHYLiXpoN8tfc__ip_F?jap zr$ylpqcF$6+1LMHUM-dBy8z>n?EC#S3UAJ0jU$c!-J)8j&4i`n?fl+u^6do6ar$^yAQJ8Ia z_V-mpU78)GoeQX=D!>>o-&!X_MD7+=c;Mt$A8HEpv z!Y!h3=O}zp6uvnMKM;kVkHWK~@V8Mo2V>~$``s=I*NMVSqwtwgxHt+Aio$nB;R#Xr zL6R6z&~`uZ+SY zqVQu;ct#YS7loHb;mt52&A$H{QTX5}d_olN5QQ&@!Z$?WF;RF@6rL4@zl_2gpof=z zzuQFNy`yl$DBLm%caOpYqVR1|_~9r#Eed}ag@1^`8H^RP?|-K#TrUbA9fey*;XYCL z>L`3y6rLD`UyH&EqVTU#cyo*gv+sYmD12xXJ}C-!io*S(@Q^5cUle{e3cnMDzmCEi zg&u!eKC4FIT2Z)h6h1u)7e(QLQFvGs9v6kv*R#|6nG>B~5``;bq?R4uJ4fLIqVTa% zxNQ{f8-=fp!lR?`lTrBfDEwIzUKWM73?sJm_tuQUhehEQS>ff2GNio>#stT6>^07Y z{eI|e+=ACU*wMZX%GW~Rn#-YY=__ItmKkhZgUD z2s#ttu~0rGhW|s0_df#V;{D^GeCi4xh!*dk06iJuN1Z`pMt_y((euEo6ygpZ$W>D!e7#lUe~vwdqCfTHh{us((e@LY-ktgd(exa@SF6b z2k-;vgU}D5Q=ssj^m`9F2f7G47g_;%2mX_O+e1Hr?hBmeGB>{^b6=u&~oVU{S4h2x)iz>^cUz6&|jhdhW-Za23-cd z6#6^#R%lW?={FWy4*CLg1Lz0P4WZvdH-i2HJ+$)B9ichUy3h*Hqo5l@3!wjio(;`F zuY%@6M?xz?ABR?gz6#w0Iv=_z^cU!6(8}mRRfg^g-5h!dbPMQ-&@G`Ip;e$4Lbrn6 z2;Ca`ALusF$Wt+d=;c-5$CRbO&f7=#J3SpgTc(K=YuNL3f7U z4&4R%2(%jXMQC;CN6;G3#n4@$x#)@P2F-)+4&5JG6M77E4`>_cp3rlkdqJ;(?hPFU z-3R&vv=($Gv^MlpXdUQp(0!p>pr^1Oba!Z7=)a)#peIB3hn@vJ0NNjVAoM0^edztr zgP_kr4~D)AJp}p<^iXJdwBY}OZVNpOS{vE`+5~zy^bF_`(4NqS(95BXpm#tUL&rm# zKwpA3h0cW@3H=e;3|a{-?orTPphrUwgdPJu4tgxK5PBT+TzcFsCE>+Ov5 zuIye0I2+__h_j*2MmrnhY=X0i&Zat>?rfH`+0GU?Tj*?wv!%{BzbeFEu&`yVv#QQ& zIOCix`)&1{)pyp|SuTI;LG0rA9o9Jw+ zv+2%eIh*ZlfwP6qmN;ALj5EJN`~?f~=d7x;8qR7utLLn~v&PPvIcwpprL%U2a=&PF>M<7|SniO!}v zo9=9uv)RrTI9up!iL<57a?s1;o#yK4zTNXy&gca;R>N6MXZ4)bcSgUk{k>++S~zRz ztevw?&U!oR>ui9tLC%Ia8|rMdvoX#lIGgBfsMRGn*bslg zLjH5cr@tZooYizz&slwEjh%6BoPD;1Gd`I$*3MZcXPhNx_d@TrT{pnlAZJ6I4Rto! z*%)UNoK18#)!B4svz*O#w!qm!XG@$db(VwPy4`aoScpGoRh@B$on1%Ixc#vz;w)w$RxU zXG@*Y4U3um0qXK~-oStn<`o%MA#z!^RI_SqrM zhB_PVY>cxB&L%pW>TJ5RSzcFsCE>+P(svjNTqIUC|^sI$?|#yFecY@)NN&Zaw?a zTjFe~vmA^nL;M8`@#n0nvl`B7I;-cbzO%;8nmKFXtfjMd&Nv6r;=Z@DzRm_X8{}+= zv!TvLI~(I{g0qRvraGJMY?iax&K5XZ=xm9zrOt9NY7X%iEX1EP&R?|OR>N6MXZ4)b zcgC5F_V@S%#Xj4@SxaZ_oON=>XDasDzRm_X8{}+=v!TvLI~(I{g0qRvraGJMY?iax z&K5XZ=xm9zrOt9N477XB1Pk%!tg16Uud(ZDI;-cbzO%;8nmKFXtfjMd&N?~k?Tqs# zE$#<68{}+=v!TvLI~(I{g0qRvraGJMY?iax&K5XZ=xm9zrOtBT{Rr_FEX1F)s?KUS z&X^_?B>>?CI$;H@Zq;VSqw zF&hw_fvhdoK1APY`4VQ;_}Orzi%_NEc;TuGa3Y=+mVSndM7<7=P&i7N71py&K~Y;< zFSoTeL0OHZtKjLy7vM+v!SCl&3=H^u@v3v-{ow@{KzU#NgE#1AjAJS!T)c{wEnY>- zb_g;yCY;SAll;2po&9l4!&6)$rsuDAOrMQ!j2C;$j_Ehbis_<)v-2&6OHRDQ-%XD{ zSRHJYVt8PP;VVK6Umarj7LQ?C7Q?h`hah7kaRbI43s$Zc3N!XsFArAc>!V3+CNlhs z2?s6q`Y2rfu=2ou5M$=d5#xG+e28J|@Wa&)>lm=##rXPYMX@%p{(&-TuaCmT4~wsl z^1;XQg4z}&J+4WOpz-w2tD^Jq^v}zq^YQf0X*eHmaKrC}S1P$0|K421>{q8m5l6o| zJwpCNO{pV&u!-EVLU>J9zvqKbRv0R_;qUTyu);tOOM4*@--ztX-*z*U#q1X7KG31i zM$lWKeC&A}v=oKN%cwrbVXEId9fNp16=60r)N#;147cAS#)vo)&Spo;D zv5kV2Nx06wu`QkL zf#t#4L5#(68!;BkYGRFHZ7arNxrZ2w&&c3tl zG4O;7)+n$>V#sMFW^eQT?(8EjzK>_0gdG>(@zMFX_1<);SpJ3UxKtxfE4~-7IPNI&ICB_M)71E zjDfP4{|Cxqejk*@{C+5l`2)}%&6C z=$n9? zTS#__(}VZSqQkcO=m4KU7U%DH8p@*c43tG@5|l+}GL-T2JTyOq`I{ML(YVcv1}!TZ zv@*$;;cRa5ZLl)Qug=&G+I3paLZ4+jXl%P+I3^AtUoj?@ zZ#&sZIc!TXOdr76?fvY|u!>g5e+@y>qh4wRW&Xp>Cd{kUw5JnJ|LJWf-(Fe%>ev-8 z<#cURN`=l_2uJ9ap^vH~t)REf3fp|LRa!#)C8R%p+YBg|5PublNK0Oa)(PRdA}&DVyFfiK~uqq6bnC zNtQK0K6`}}tj5d3!JMCcFa>!q`WE5e1^8Fi0QsGjrBG2p*Y<_^X+2P)?Bma;M@Xjf zA!rfJjkQ&8Ru)0Bnu;J_Ck4S9c`Ls`-mLJ?`nS5THT zhI#J{Gp+AXTC>YU%SsxpO!BO=slm!5uRELNj3v!J`>nHe(P=1soKR+00`smAIh*6Q zu2LppR|0dc!17>SC&of@lo-1bd{Sov^<%}@mAF%kBLd8`!dW(qW5k$#WZ#;%7kuBm0$ z{r3t)>BVF{MS@~c`7*1ElT^G}T|A`X&FTVEB|~-bm>8=IOp^p-b@8+qM;@3W3C8Mz zkM3=M%~oQpE~bkW!NSx?oMq;JU2GsMOp64&2G)CG!(d@bB-kiebHzBSz;sBkCt&fh zzwNJysgST{f_)`62Ud~Tr?5B`ASYP@tC!esuznL`X6_@#W#KkN`OitXEZn(bTo#T? z`(RlRSQm(KS-8!_xGWr;={U<};r=PcW#KLnI}28xSYKF|iS>uIn^?5u+uf+Lyrwx85s~S#{xw5-XYl}Q-e z#y$&HCi%hHPtNG!wd*zxRwmif**4DT;kD~_bH*me7|ScIjP~0#Mz622ll;0sleU z_YJXKFU0mpk8N5O+q5zXN7Tk12v#O}-q|!~>${R`V}0O1(;+Ui(|E12I6IApC}XqJ zc)eI2ti#3FX&fTPP9xViurVecFv4P|@dPoBG4XH_jGe|)#n@@QLyVoqe6fMBMu@S~ z*iLL1tWjd@G@d2KPUAgd>@;%i1nV^7i3hBiVCRU@+?l#!llXv9_?_I>z5)r|~|qjqq)3 zpxfeKda(PLeZ(C^?$wxm#2v(Qqw{eG@qC;=GOAekooGkoP5E#YE0%7pJ7LYE^*zKt zwaihL8+lSzA~OEjDP&Xi|JXYdIIYSm{=Xptz9TLOxGSS%rlx?1OJ-=OsAyzrWa=<5 zgN(8c145cxrnsYNSt%mnzGQA$nvs%AnTcCksi-JwWPrHk_Wym)dG6tzJ2NjZi1`2i zeLkO=bDriRZkYb32$=n`zhV7$uS&!hJFHFgTN zYp}h8?H7!C=%4*=u-agC!Nv!}5%z2RDA<|7E)MpyU{?maHrVaKejDsh!5#|sWUyy~ zy&UYdU{q889c`0VEUZ`~S=Qj+X9f#{&(>dG{d2#uN--Wd>#xIp$QTCy4=oxtOn+&} z8@2;V4@%D)wtaKQ^M>sgI-d7Sxh9opfc~B@W7v+a9X+zPp?*@;xZ%|`we`I}VY6n{ zev$5Bp#HMJy;14gOZH3fa8)Yq_ee=9{ZW!s`YK6&{}9RjQk>sJoJx3QR6;bbglI*3 zVYRb)>AYg$&7@V>guI`(nu?g8$Ar8y2K<~c;ODIMvmFmx8By^lnO9^ZxzBcJmQ32F zadZo5k2ESvSsLkp%?2Q|Kv~i)7L=SOduIodq%8SSpS8L`u>*6BU>`BQV<-J(kJgad zWR&FSG2^So)Q>*8zItTUm}>p6)$B*pWry5K3dyt)lSPq!kO#1ba3ZJ$OHl9=v~c#f;AKc%+}7t3?0& z9igk}ErMm6M@{L=Xwf`AVWx`y(38e0rSWtOZyujEM)UZRF$U59X^ckTHDmOLo-;;& zh$m|J;@B6A(H~-mR=dJvX>*OyANt7HRB7{!(I4ut2It{NY64Um{UM(1=KUc}hDw_) z*2UNyX$y?eKx}G^{?MDo=nrjSjQ-Hu#^?`iV~qZg=BxC5UzWCmG5SLv7^6S5voZQZ z9~(PV8qbSwSD-)CM)u14Lwg%z5M6_zVtB+nO}<@WiZl(3N@M8sU}Nm;*Py5v?^gMq zvAd;dKvaxX4ug&HZWRrNis4lqZH$364TOsEZk5r-cuR@~LB)8t$^>J){bVC!yz_)- z+3DHZ(l#~5yH!p%)>m3LW4v4CY-5K>(-4$C!Mjy1GRB)kG#n+yyH(hw=I>U~(3CXZ z3v#(J-mS8oG2X3ml`-Dvv4b(*t#Y$5-mTKh81GiO-57iAcQVGiRqirIJA}VqqrWWh zmX*?wcg5by9nZUB3v1&@V`H}T@(i#`BzXqd&m`}Y{JA900Q-d` zb$qJin<-AcC5}sZwYik^`O&<)fmSR$7wpBP6$@_!BQN~CkAk(){X1JLX%&S|!8Qv< zTjS?#AFNlfJ%a5Oj8=zFR1|pfw14)fU_*k93RWNN#9*feJ1^LU!KMbA9_*%Iw*8ky2BX-dCfn+4k<7|*%(bmmh9qW4N%78^eXwkfdA}T-axf;lgS- zQVbXNd1Lj`G!!X@3;U`uTv!c5is8b(VQi{24MB?G!oFz?7gocKVz{t81kPPp4LwSm zEyinnmdvk}x;Qwqr6KR)FgRHn@-EH`r3a{);AHC?$j>a01~jj0NuH44m1;Ifmunn%5g7Xd8`?6#t50SZo#$-)*~2>hM(6r*nnUIgB=lUaIg`<#soVp*yLct zb}ljORTHreo4>3x?j4m6ys7 zrd0k*O65mVDqk0=jOM9~RxFUV&am*#NLyz!gSDK>M>LblytHje3$Q%p_;_70KVMK< zj$baD%4u6kRds!R^`xewzxwVhv{afG>4c?~0HP9c?mjwzb;#g$(cvUoOW zk=eUNIyx|&gW$d}b{O)00EHJ-Ah_3;B`LhGNYb>T_% zZz9orySB5r>8NklcE(hIpGU*!3|Gk62Ek|;owa_#XtmOabQU|-j&2%9 zw~)4bqjHp`kq)fzgb`cb^Twi&n0}^B7|knFPDWObNjqbzY_n4nqpUp5LMkflQamdf z8<)gmGO>U5AxZ9qvcU&;Pkf>Bn)_QU$wbjxk{X09yep~1v-nOaPMNsT%EZK^`9u+{ zShz3P14%0u9uM~SVDp152)1H|=Cj+Y`hVlj${O-fR>e9gD|vN_&;E}!Rw=fxu^!SI zjA6*XX>1>98dB3IFj>52#rFtkcug98!y(4%rDzG=_Jt;WII& zH!d-@g)|MFi7~x#xiO|UG;Aiu^u`Qh2T9YAnHbX>JZ#*jH#A%(jpbgvD#l+Oe}yro zH-2MminJNVnBKVC81~>T{nh9%3ruvBhI~VKeeQU^KYMlVc)mY-iH_$RLas^Ua)acn z?^E=tnJu8?F1dre8oVn<1a zu-B4g2zzZwhOpO>WC(j*NrtdHNiu}Jo+Lxqoh2!I>q}mn;*=-iG&(m~qk|)Y=8g!O zJ0i~JrlanNIKvU~^Js&e;fOd}Cs^lT-GX%w)+1Q&V10x23pOy=A;AU*s|hwHSVORr zgPj&^O0bK9O$#<7*v-Li3pO*@tYD7@dm`AJU~_{l2(~yFRXn9%(uxIMjp%HXV8fN- z&5ti!ZT73Z4lfyBnAOOVb?37w;HH*_{P@Ds`em;zt0k%$)^zV@$%T`v)nt@mk}IsFa;%p$=;<0rRUdIohO!mDgfWfci?iq zzRY=eT-~T0n?6&E`$%C~J>~-Wx-^%0TjeA7xV({~n%kr0iWy$|tm9OOg?vmvH*CfgRzLMlWaq^!y`Ty(4e>Bg3 zG~dnQ?7?(ivG7FFDhf{rn;(pl;Gb=M{@>9|{=X6V|J!Er|IL+_|4Xw0^Or6EHDqjW zSN+Xy88}FiGC-U%K%6pgOOydLF9T?91DyRio#!^d88*Pr zBj=rA1Dv(K4BXvJ8Q|f{ZUg?%Od0rirImrx^?ULQfl6(_f0kATTG+X^{I%a7qq;Qv zf2i`5ydNY<-hWq;ygx#cyeCfH6DRL)jl4(myhke*?ny^0?AapD9trkX(u##wgJB8$ zyy4QC_q6V{+-vM^*C3n)2-?eNHx*e*N=gWpkc9E=0IdPli1fCa~dtPY8!moqfp0r}&;b4yjTd{$v zvI8l9vTW<5ORZ^{MaNAOD9W}S~Ykrn{vl@^)Bq3#l-4OeE_uE8{F=@yy>O zUNRLpFr9|r9&yvD9Q^R~!h69OPV)2CkQG6zD0EC(vCuu(*1=Y+&^12>S+*!@o=!!KqPR&E#o195 zyGK!cB8uXdjWMS8cVi?pFUVVBb4rURqkE+xUp%Wz4@%D$&m(ik^TqRe9nTNMb4{{& zi2fFoDV}4hN7Obn)Yi0UrBG^6wQ(YSJ)dB}I|M)hpNwLBa z=goyFG}+KJrfy>Gh^hw7O^q8ix_)F6NBfhl71WZ!=~goHKA|M;=6#XK@I(>(7OIUr z)p&&U`6~YWz6&L(Hb0i6+FT?_wYgZ5A{G4`b|_LG_OWz z#lnl}XoW59a>gC{d2c7JSZJe4;jCTKinf;3S=V4pEI8wFGib#^uV8(G4G1pizyCXcdML{>`R=V^Q?5?{Aku& zM;kjo7dI+<{d86q`eaIy%j^7{q0i-Cb;Nh-XPWc#PMNYbZfNbO+NzP&^~cuMH!=2Y z(+x?aQicCQ$V$z|9<_M%Px~i`;65<^rH;=l%6snZHOciPUzf!3`H!Tkw8e3Jh*L&> zZ)F6>2hANHv|`~8!R||1vGBKGj|Y1-7%q^1c4e5b=6jT%QziP+9w4g)Au1#o_)D## zVBobFM66QUbYmEJEd&w6z+Y_)1K-sc2L1+P^sF~DhKaq!SiQ7OjNysiX>78z&5h9? z{DZNn(zY;$M>osZZPLDI>@I1%Rna#NZEb9}*rUegNYj+Bj?RzA@@9 z=CVeASzwu1X~;KnEBY)j_S@%24Y(!^1U3HMa)zjO=;%>3)mry8bo7YPO>GgTHib{1 zg~tAgDU?2cgf2D?AlW5J#Z_F}MCf_)H-%Id%Ov)MqF?Ima(g^VDL zNE?+QAD;b&u}ZOa#%M(LF-9Y@mN6QU{fyCwbT&pKGQb#($Ogt}M80W^Mr3niG$IEZ zqY>$DtU2RLb5a`e#`l+{2c_qG7?c(DA;x*;lSfWuKwH_sSYyZ7LW(`V-%F zlApp@UbBl?Tcmp*qrWWhn=oo><)U$0S4M;1*;x{!)RUtw!S1rZ39V++J=%C zwT&c6*G(m_NO97NxH7WvhcH5DZiLW$=cltd={(>0>1;u;50a+4RTcBk(){~*>jYzi zi?eRQm>qFO-^D-6T3}~=gB=oVP_W^;Zu4{ghgw-}uft1*^|onLYP<8<6iCg|K&d4t z18i9DILUn9Bl`@^&i|IB)UCvomEDz-x{bn@B)Ok$QqIn_oE;>B=0hN8{+d;1)JSJE z_0AX!an}02qgI0y@_ol1mIL%1zh_4q_Z@d`lt2A+Ru=kXN|MXlcRWj<%e!oRrwWqw z9p7K3{QGoQRrXXKa(}%g*W*4V=|Aow*(=3&N^xrOA1$vZCe8bgFn>=ET7|8zboN-B z_f*onX8U>6Y(Hbh?$4ArMuPf&JFY%2B z>VC4oJ<^O|2(t?Hbrm4)doM|h*f%6;M*2yT4*N>(m*V_3;!60!y;i{RRnfeeKr0qr z5B5gViUs-se%?pHiYm{})=HYM?{LQY4*$N^8=a%AtdNpR2CN2Jsln(RV@Desox|*? zlF0gzSsE$2!n+?Y)OX~|OsUcNuw0q3C#qJ}jjYyd-bReBuBp<)FPd>&xbGB}b?j=H zmUAAYJXdxUz9qSyv1S=qq&pt51(fEwCqJZ%^+zJ53M+=|SVpU2TVhrP>MNncGpQ9TUlp2vNtZd_Rl`eE}&gU&P zJ|8W;Ao*&A5u=CdeRGr~6|1KE13oPSbc6~G2B=CB12k9?15_=E0jiP201+RM;!6C& zEGuLfAT&2XX#TJ)XN%I&V&S7WuZ>EwpNHA;^Ew5?>^Q>{_48V9fF@XZX>5Q-SjoWv zO|qkn4bZqoVaU2{CpT^B6r!&g0s+3#&afnO#k?g?dabEv*_~tkmb5 zE|KJ3ej!ONJZQN`bExWB+Vb8<%~fXKd-2Yx$oP33`>t!Uxs3+#jdqSH?!EIgFc@^Du5kRG@H;=d9jeid*|Z&=i-BN@d+jIC4(|n zh0_s!3yo+|l6)ZCts>0t`-3D^Zl)xS=pQ8++rL+mvHklb$4btUBpn}+JUhin8{*2i z!e6W^(72*`bVdW>?CoImnw+&unlHL)s46^uJCYFH#DzqXvM+{>1c($*~{6&V3<~Cc(DFimijqc zHyBI(oUz)#&--Gqp22nsMs@S^sBZpQOO<9RM2)Gf*AoJVRE^T+n(CGKNX|LRL4M0ilHA)XDM$ZmIf`G5=Dq}4 zv2bm$8z^GBUTmgCD7csp}8;N3}3<-cj)Zx zVE7Ww@Fn~_Mqr)cOE|-qaE3483}3<-zJxQ3n=_1?vzCq9pRF7=Hf~)SmB{5WZpZ0Y zm0Jt2#xj&Bc6&D|PWs*~w9q%Qrfq2*{g0Jvd{3L5+@P&4NiP1)auI`u<^~PT*8({E zWjgBJP-k>Q{k+zXivQJefcmmzT5e;@0Y=3iwWEzk#VZ@-Pd}ZNg+7^*B#n;>K>_Q6 z%>4CqxXC8E({-TS(>03a@~>{BwkV7pUt2$^N%nF56jJuJOVO++v2jU!Nzb5v_9;nz z8$AO)xqISkD*yOhYfG*txsGH{$@L_ArT9)MPCh?s`8+XcJ|YhDr)!}3(>0tu66ZaZ zG=I8=pEp0)s&34h?^>7bEfEk;oKQSv8}2|Jzulw8M;1z27iK^*+KF)qA0_1Emc$ zM)lT`@l?H!F-G;)@^LY$_b6jjZ!H}cqk1FUr#~V{AY*OX#5-Sb)D*xNk zgVOU={`TDQ{HWPH9nbqET$AGeJN>O$rpo&U%@#(-S8Zjd@=w?86B^B1(!ynd-$~V{ zYK}N4_<3t5t-_up;%xI^TgG`i1lutf+h_Ph zMd2I4z8UP>!FZCcpEn}dikXG7?JyphFIPX+DhCx+`zFLHrA;jFqTLJNO3;8uSS_oJ*X>fx4G0 zaDNp3_LBV)+*5^=d+sMm;on=5!oQCsX|SKE-^+0 zSvxAo<;G~qIvJw~%rHhv*2Nf(>UG9w$u=-XOZIDHv}79_qb0l37=?c`W3*(yH+Gw} zN@LjA`;0NB(%sl>X@530N7|Q+&6D5rdQf`40>6_xp0B{0set7x zFxR9qe4xLzmZ1VSG}PA(sp`{vNL|yXaD28JLmJ0BQ;KB0OnP*LEI!wxOBzpeoTns; zAbl_(YfGL6P#7qKK$?A95(9FGBnISANm|dtBxyarBT4HyNb(HH?@H2o9xi#S1u13ATT*!-5?iY*?^kf=vj1=by^{WJd+qs?^jM0iMjj_M~5My*uwl>E8{_hw& zR9X*Xj8PnJjQ#z6jA1s9Gc=4o?(o4 z+fOmZyY031QuoZe?JqXQyY0_4#=Gq=HMT(76l1*Ad%Cf9tLaIA#yU#7#@Hs(eqwA( zX*U_`CGBU%c9nLEvHsF7HTF$uzcY4}w9AdvO1sBcgEXy?)BPPU?S5ltNz-~cu?wU< zY^*uA@oF6{4SBcm%G~k1+jvFpc;0Q~&Bpn)g}L1hEf?>Tix0@fhvecDbMf;^;*2mX(#=dxX~=z159l6jFa3nXkCwa6Z5|^@ z_uyDbx(6d9=^l)fqijR}&h zcsWjz=W9%qs-l=CC`)WDS5u+zLHZUkCePXa-8Ial4nZ(SP~oc6UkquICh6P-J&O>TZHD_A~b*D zle4+$Jb&Snv&F#*`qj?bCaqYYCOhjKjIkPLjMbnO3q6AIP%&qHgY^qGFc_Ql{k*}! zXy2WU3Dywo!3G99 zB-r3!HNnON!zb~ypB(I*U@O)IFWXVj<^VZ8om4#^HK&J;!u7@~r9EYgj>1jG=qNnf zqH}bhj+TbJbF`v^;=jHC=LF$txup5GOt$#WB23sml9+IGP(?G=ECGGrCF6 znA>soPO#NvLY(oGct4M=NzS?jYyIk)Ut1YrWOB*snz>e5I*Z+AM>mb5TS$AgQCZ5; zNC#GU(>u;*x%XGCTc)ho^EIlDt(~No4U8PG4N*-Bi!wC}%ecmdve7^LjAS4EQ8wC1 z?w3Ze@b`M>JnygXYUXojsV2`unS#JsoU* ze0D*w;nJGlbNU<0K}z$IJ*NvApjFsbA7^*Rc{7t%^tF@CE`k1CGpW3|)v5e_T`|9hr8Je-E0f9- zd-kjvH)+(+mfj7kug*dXX}oN21$rQ*@}E;G|23uZGm*+@p2}#&!gO8N*;PsNoxRRx z25Y%2|Gt@2e!tbJe3GtM?m^(4TS(=758nI0z59K)YFK^sNH)3GkE|P2t;ZrXF*y4E zEVPu=SeT`i=OBuoZIzSA68WtShN4Vab(jZ`q40dB3qrX&sGGKp!%OE7{o? zW6lp7!(rOM*b&nHW^AamZpP}RX@88a!I<+Gjb%lsMkEX8XG)TJH}u@x@%$LwnYrWn zF*?Qx%I#C?+CmZRKQKK<=d<;)mSx(f^oEKsZtFrxs^}ug9VFkBWSnKOB;zb^Nsg6# zTat8qPx9;(KQF~;K>uY`;gY1eI}7uDN@%`M$=Sj<4|Cz{3-XlwJXSC|W1o^URxmna z)W#Vr7@e_C$r&pcow1bP*}!0}cZHv{a@s+6yTldV#!75wv8U~5V^_FWqw?HOXJw&J zrX)#u)-9U(MC!{L1p*`B{>afawX5KDuJV!1 z9bQcmcet%&Ps#R@xWmM`f8vy>XRS=(4x_m{j8-f>80_Js740Rie%`-=Er|0L2V2!9 zcX^ClhB3_ZTw|E${fuFr=NZF1A7l*k z{JJsB^C8A2OVchOne6kW9bs&$H0=lyV@hy{vF6M;lY^xpZ^nOHdQf`ajNhI+o;TzF z(eeD!bgqe+`q=tkJ4x;!xt=7ZzOy8zzKi5o$*z)TNUkr*kopFa zr2WQ{ze#b@lQ`FTPQTknGSJ-gqxq6`XRoF6e95}A_kv;Yov~!yKa0V4#*%es7<^|; z0z1RtJ7dYZv%Q0{WZl`J!M+=8Ot6MvD`p zY<-KBiK<%~@|9^thvsO>^YfNmlY%rre;c+`nGQN+?*a10$F%r_uNA9DSx0}M?jZ}@ z7lodIjI5pALWPri{h}m=ek(}|{g)*7mE1;hzZB>95T`IdAB7ps3p1L}hd7&?&hz;Y zXN!Z;3_EL^v|@p02RUPa4y{;Nv4YloD^j-jeGtWOViZ5^=~I!c)Xkq1#jlOpU|%kM zx-r@d?e!BQq0cg=)V7{pjbs*RIZ8vmNLH5~l%BWmN9K;_?fVTno*!T0nq>13{cTjX zNb;!E5hL_w#TMRRzhcEQKb@Wx(?PngEO4(BQ?5jjBlJ|Ud4v}`r%U{wLPYl>9`tayd7N@+hah815cs?lY}s7C8XHJWY=x2v-;3dgm^ zaJ$wwhTC9D$j}Sc#=wXR5xlrQL6=x#~Ml zM@vJ#`o3IxP>g0a5G&)X(gpJ2NM+b7um!43;{c(7r?jtMp) z7%Tp`TCp%C*hRrwKQgeD)h$Zjl97Rjt(J8b`?4L~G>&c|?eRu+u%Ad4`eaIy)Ir^1 zf%=M6Yuza1M+PX7`6iO@bw!X{ru`FzpJ=ftG>r~u3-$;wL?R9v`B-t~Kav|Wthe=jhGC0&&utIEHwxnSo1^=8gi)hhotx3jaz+ z{n;PR<_CK>KKns1dLe!u+W`Fg=!H0=`|ND%VDwC!u_3_E+dWwSU`z=3d4qx-5o~y{ z5y5De{QFJ|)^bB}pw*Se4aG){YE5QX^6?!$^PISf#YBjrEXrm@$m>SBzn#wM9{%#Yp!u)>hhE`m51j7BJVPA#W_JOAkuV z_p%raC=K~u7A8Ia%x|uVVHl#nZe@y1{pca%$2E+q9k;RvzrFKgMT^3b1@03cq=V#u z1TR)m;@&Tjq{{qE5~KEWNsQVrBuSI0k_?a#=XVmvNWEf35F>@=MheZJ1@7#Hbkv^( z?rdSO5971UQ2J*(Cat2t45c#+l7AM1MCQE(!Or2 zhqNKaDAfIoQK)N;QK$zP!}Az!jO_ZBvE~XoK1gZE7xd#w4@%D$^l`c4`GS6@j^_uc zxh92WqW&sdD(Hs{s!ETNuCF~>esmM}nc|niN|@-$x`GB^w#li5u zoH17DpIs*yV};JT1?wJ+7TG^bi|psM+=6PehstT=7W6xfN?3Q@RTh@kf_`5omRl*e zMGGb5z`eh{r&c14tNVU!Dk)9vVRjFasf?_i5MALVgF8J+PUL>c<<%s!-*Ja>iBo1F^Oh6MSIRlNDjoHea?WN3`}9mt^9Jd2s;u~o>~1dGIA|wTY8;NT zsz&3WT~uO~(rS!RjJ1PGjK<*@V>AxhJtaotFxnW6gLY1d(Kw7ZMz>VEro=FF-#0c{ z8cRKV8NsQ>riy8|lo&qDWMgzoPd7%l^c-V!OSMZ%=gpROp|Lp}HActqXU5)^rrl9G zj~0BYu{C9cv@=SKoyAufV`uTj#+X#T-WX=<5@YNvzS$T%i+^E^sbs2oyF!h$sm9n@ z{Ci`JGhSir6lt@JG2%GG7(0s}GwXj@_oyGHv$=WpWK-ptl8uAVEhPmVUhPg}bc)nqNMfZ_^3?|p) zV;kw;mgUT@R_e13e9Y*kCU@mF%XH!=q-4oPGtbGzr|06hAcXAv((!%1Z>}GXPwR54i>CfcrMtBN%I%VakRpEKYrdvab6o;&l$62eqN_wJc7s>Hp|c3K3K0{ zdj#7n7}m=_ODXct9u;gzuu;M4gPj=c)L`cYyD-?)VAF%$6zrB@_XN8)*dxIn3-(;F z7lXYKY*Da}g0Umpf7@C~t0;5|wpp+(g0V;2)1_CiJ%a5O?4V!=2OA!YCocGPTR)F< zhuLnd+>&{u`DVpCi~ZJ)ZW>3okoIOH8{bbP3w<&rNo>3lsX%*x?45Wf^7BaN>Og)e z9pA}kbt8rDE!gmb4jZJwrcpI@Oi<{JkoB6dXy#oh+(rt^IFY2Y83OH}eN2-3!Pc~s z+&%Gms*~K~>yqn9{#&xAs{7ayW5HZ!&AH&++RQU2V<3DysxvJ?HRe(7|t5+v{|wm5C2ysuauT0QQQeq@@pU=*r>`pW|M zN1>t*+AqPkR9Lv@cO_}S-jk#O`=8{#k{?R$m*N9boWk{QD_k@TXx=cO6$?12&iYbMlj+V1QIr@bTw zr-Niq$qGpf4sj)-#VHf>txQZznj0Kgv2b6o2a;ASJRa=t!R80U^!R66pZ|YpCjVI{ z?fL&mGx^VK+seuRpXm4G-$q=T|6gi3|A(mCpiQIW+*tV52BA9klQtROYei95rpBj} z@>*50&_$B6&{dMMu%RSnfjDJ>IA!5KQ5Mj=ET9z&bR?WTmNa)JoxKu8H%->>B1Kg+?!}KIpKjXaH8uON&44B_GQ>dbDITW?Gg)lB6BZEXj6J;@ivE zke)pyyGr(w#F^bulF^vnl8naeBso^HkK`GWJ4;?Bxr^kjlDkUMGulm((U`AFQeJkK z#995CB>CM}l5IQ0$wT58yZ@T8!#PHC=NQdj{p9SGbhK#AuQST8pVvm;=B!=P{56u! zSa0g*Z4u`&zUHh~FxHzo+bh^U!43|_dQ(4dNU&kS>VvV~)XzIL*y+J84EB>?(}P_V zjB#MTrJ^u1SnC`1kF0JtcJfcOT8@+d1+}aBhW%7Kn%RJUIx7o0xlveNC;tL{I{yYg zzEeN5pxZ2LqbsM-q>eA+@<(nvg=Ka1mu+-mUzJ_%bAL%1^aCV&N**LhgHD{^K%6qZ zz{)tzKAJb^Xhj=SaQ4@9v{+zF!P&FH76-%C^Un^K*8ECU?VnXnw%6e$D^<^Gl#|{0 zYzkd7B}sCUK=Lir---Imuh-8$(?!R&Z8@igj;I?`HEv9`*6JUp)x_26%{N_yr?1FD z%BIy*obmA`7L8Um3tS(IRyu`xs8XBbgCx1H@1@jVXsJI)1kI;V(Tatug0WuJ+00w&7-toEPc^8l7F+VxTHE~I> zt=s9&QplTsEn?L6pBmep-K0-XY4;)8SX3Ay+=x%l*4 z{LWl_RZb2rF{U%qT_H$!j44Kw@=F*Z<4IoBN_LeTCW(7^v?T7~a7o<5I?1t;$4KHH z9xI7^I6@NlaHJ&e;V4Pm!_ktIwK0;ohhrrxCF>=btQ#lEWL<+KlXc@IDN7S2e~{vo z58^bfiHQNarR<5&nMlSEeiHg(kcpV^u7MswUVYuqhOl_qyG7M+Xw3v zY>!}j1*0bVbq@}9RInkzMg^-6c4DwogPj-b!eCQ_O%HZcuv>!N6YSn#j|6)x*mJ>N z4EAoY4}!Jc9o^0BP-A!WZL>(7l_y`bqnk=|CuR$2|7&Eg`iW#gCpQYq>yA>3%WatY zN;!M966U!mpZ!aI5xx!#7|NkP&O1!mBbDGp=3|V(8Ou2IeR+T{P^sGV8f*~?}qlZ9Bk}{w&}!g&=0W|r#qibp=+ijnRi2f zAfBI!%szwVVt6KnrY**(akcdmv|DOIZB@NykeZo_%swmGq8Do2&!xGc=PLF2vMG|> z*N-Jh{l%90xS?q7hN2a1nUk|?)6rsKW}G)GSj#E>jb>81U8__2G+l9EZp^hbrFU4a zl&-3&8&TcRnmq^9fu*JP&r@n&mQs6KO6|8Iwb4Aa(Tar|^sUZrPMVj0XOw?GujSO% zhFg{4#^rjgR;Tt9UGa!Asoi7wQhQ8&ZPmC@Ja(hLZlyj!^XioH*QJ!dF{S+5k@9Gs z@@W3XXJ>coH#>VYX%&Shg0-CT+S1%4s3Zr=nqZJEyUe2yany0!mQr*vMIfb=3yh#dg)an#&&=vcZ zDcil4lEQT(tB+n;mgA2pb!Vm2eITXoyOFwRp1Nqo!ln8(&ZZ@;X#TP@{Cq!e#fA&Y zc74BT*`xd@bhAvM>wB=VN@-s-hRHnC7+v3O8)aUNNEYY>mxg>7Z$+1VkX(6}ifhuX z7@)r$Th9EN+A$5ov)viPMvSg*I#t&}-;hEpI(l@37U|;yv+t1P-f*!n?EMmdM1_L; zoh{i_@-a!eL61xBEBTZpOFoG6n~2lczh{N$lB9XJ1m@FqXcdK5(@}pMi?erwwUuY* ztV7a@g-wEW3)XT~9%N;paWmDkQEBL|t7U;-R~qu}*90BRci6Mf;O6u$lbiL`$F1}Y z6wfNO()(%e}3c^FGSuk{_A?^zB|QkSgc+r@H# z4$e__v~dS#k4E{El|r4o!i#Dq>pSw>q;vxX6(k#PXC^a+y!%{3{?&~drzdhZ_mqLQ z+2_J@rjtU*hFCWCsKv9I*FP}?_d(4o?cBVs{NvvKBT47x4auI83nhD{_)aNKjeFnn zd1BJMa|3f%8qFVS>l291ic^HK`cgz+Pe ztsdo%Hg4kOcF-53(2DkVY4hkdP`OCoKRCOHB==6iTto7Z#8=$ z3DqO?c%aesO;^CK+?q?xo}hapWbOYs9*sCH0wFt2yFehG`3EN(@qhegDt<@FhQzz7 z;*t&av-o3MK!L|$5BN)cQ&%;>w zX9olu80?5(gM;ySTmS6DU@K;5%2x98tP-jI6fU(&L?yq#Sf#Y-#(GG*$QYIU+7>Gt z)x9+2E8B{8S1|bToh5pR?D~ zdH%RRXKZHl^V+FMIpcAE&M3;x*rniX#R}Z=v_Q*qZrOtT(jwr~N zMM1vH7_HSbV`SC6#%Qg6X^htD0b}*jt};ez^{_EoD?RK%*Pyj}+*ot15baiJ$XASC zmL8OzZ-v;NQyTKE5Uto(bAxzXlR`E_f4j9@F^1Ku$M`9`j!SER!nGWud(Q&Dhl(T{ z9m^ngQ^nvneoeBgE|)6?%#*g>1^X*wl>$UyKOKg-u=9< z2BRHuc1W<{Le2Mv_3#muQ_Rqk6=(lwRARgH*%V04(m;tNC~`T-7jI`iN$pVwrt~WD9-cMLI`+o6}LBfO7U=uvKj)%Nj&IRYn=E94*-XoRi?K>+ zFB>E2ZZ}5DKHnGy@lInH#0ADMh<6#oAiiy^UfMmzFo+)*Q_45#Lt`3CL*DqETY6A> z-uRuFJDxXwtli2lMdz9rhV%5d`!W>8G4-R5)@#64u^n9EL0C1`y%YE?6zQTQ`9L^a zMVQ}rq-0mgqa-nWRgxIK!IBuhYDo;=5J}RpR`To=CvAvh@Y+~apl^-l1`o}bcsqL~ z9rY#N&fX5zMkdG^K8Am`Q?RbVwg|RWuwKFX1jAkS@59Xb_qA-?{%GZ}v2km&9_2qP zk==EtSs=wqL*BS8?P)|`D_f#Q>N%FfhSk>V8L)LtCq+uG+k#2cIwYO6G@~{`ImdU6 zmc*#lr<`2PauTD4=0*+8pGM^Ds&v$!M&xW}u$EJKRx_!*Mypf#6kRdDygbVpe$gJw zmdYc?k7%fC!J*f;WTC~xUZ&KZlv4YIl-ehy)NUK8jpnJ1RxDhr3p=|pY2Ji5qY3fz zT25^}e4|N&y>_cp`z&4Yu$+rnn%ZAq?$nO~YJj-(X}4+ncRSj(xdN1HTB^{%Z>_2YHL{P=EZst(E7nx2g#hKshVvB}b&H-=-;*BApUFB+qlwYM=wSYI}Fm$U)KaJ61FHe1@k#^y-V zvpaN+dD0Fu_O>)Vw?phhX-65$8sZv}EHL<98uG3oPwXrWdDoCa>~B_EQ!LGpRY8ztY8yh)Ng z{k7!UlEld;;<%~p%_MP`Xzr$>6$^ZevzL-qEc`dvo54N~#$=FxmMi&Z`OVHY55{DW zvmJu%7>unP{@HH?`)06j2dfG;G}!21SSfxz*ET#4xwtH-@>zO1rr| z#Te#xHDj3D(~V(n+Zn^$o?{GiyM{5$?T?LNZr3!1x&67ZInvfPhPj<)>}_d!qD3;d zR~lOt=9V5^egV>YVwt(!tGu~w(b4Ik-ZXt{J&c*l7#Ruo&6LRs) z;AP+UiCbIibu7)?-YK(3+TA7DRq}30%N4lEhH{NfL8=za-}NA<4BRiDPbwV{SXhwEE5+G&i?szH`Ufi|IVyx#JA4)6e@T zX})vE*;=}SpU1VFZ5E920cYC>>lJK|V0#5SDA>WljtVv;*r;Ij!A=ZzYOwQyT^I~= z>-UVg_51tW+_WsD|O58p{m>Vw8;Qom%3CiQQ|Xi~Q^Mw9x4F`Cq` z7^6x3r!kt;9>!==UobXD+K$F(QeQPjld9)wq$c$ZV{5AF>scCNG-`{DVXpKX4KX(Q zzH5w)zF#+ncgWM(+7&QTdl_S+Z(Cz*^xfMS8+|K`@kHYO#@OjnXzTcDJ-|8M{wfcVmx9JH!}IB>u9oSEYT&*ng$nCQTbsb$>@nJJ1+U-qdDPv2oJAZR}KO z+K4K4rnEuEE|I29sA88(JIdHi(zF3p>~?82#%4*==2Nl1NE>17AJVk(RO|(5^~RcW zh2GK8(va_YzLh(k?|ClF9nbeXf28C2jVoM}kG-vb-ze`2`O9E-YBJ>W|CT32KXn}y zJVNGa;X{_jSxQqHr;RU-56{JE(Myl>+Q8EIb-DP=T>PnAe10z8h8$GL?stP+oQKqw z9`BcnAD)Yk$;D64#V^gpZ^^|U%*CH8iTiw#xtjgc&*0W5hxF{XlAa~+qjLH9kknFX;aLvpD0<82NIxX)w~w*;j(~4ED8P zdj=zA{rkQZ?8so%!A1rf8|(+cP6>8yunU4+7VL^(HwOE4u-^y!W3ayln;q=gU@rvw zPq2l-J`DB+<%_3F$E4|9KfyK)RvGLo!Dz+&vtJ9gXRrfO)eEOxNY}f91bEE0n9cOOz`qEA`Rw?ZV#^~CeVod)Erx~Mb zcbYM}c4r!+Yj=h*x^`2H(X~6v7?V>!Ge*}=PiK((PSyK9WyCQVOm z5Tk2%lQFt>KQTtv?lxm{r2WhoUAw!D(Y3qO7)|gjV|48*TEQFyWbn5Yqz#Bx^^>-(Y5PhjIP~%#^~B@ zVvMfc{lu!v$-9yIc+I__sUAu>k9VxAsF}iktGe*~LS7UVTv>8|TN7rsoV|4AF zG)C8MKVx+5o;F6;ZlE!`cK!5B{M5M%AsoXs`XQQEP_ zHjy^Z*p|}98S5oYTNrhJyGlFGSbu5S&M5XxX)LU1S2#-A0%Nt(eq^jc+MC9Xmv)}9 zv!uOk>;h>&Ha1P#d&aJo_6uWoNc+Ip@1;#Q_OP^%jXf^y8e=a?YqJY?@S3!njWySm z{a8m!L%u8fVeWXoEBjvVc)ly!PsjV_CQ-Sj61?z{WWScXvcs!K469lho5SfjewN1c zKkv!zy6(#C$&$W{DR2r|&%2n)Z5HpAi}%UJ2jt>Ia`B0|_<6bbj9mP8x%i{G_$wuG zdg6<8@7Kr{XMs9IH@ug?rHOx}?j=9-3%hzZyp1H?@YN*ghPRcZ8@{?E-SBpjbi>fHqhzJzT9S0b*Ooj`ave#!;p4tZaq|4S-l5Y6=l61&6kfa;Fp(Ne#jU?%YZ!AeSd=p8!;hRdHBDt9)-SEvN z>GX7yq#Ir-NjH28$^S}jDY?4RtGndJl3$eUDY=#8zLH;(JW_IN$#IfjmON8(8_CNh zx0SqIay!YtNPb1~1v20SeS zUKs;>OItU-cgvnqJiDW+y1u@8QqwKLTqlJUT2s4=EF0hRRZ0EO!XC-eRhXq4B!cFv zJ<)vKxU;L$QD5!pY-X^QQ&~Iz<;6Bm<$GG4%0JQ-zm@Yxvz*}}=TR z`jOQQRlaJxYV7#h`bkZuTJ%j>XfeT;Y3=ylDaHGz6h9!P_?nU8XrAI|#lnrcu(Mw$ ztyp+4*u%kA^$LWt!v}h-gEF1rg9j|D*O#`Iu}W!wF~;!0y2jM^DLi3};e*b`7(V!i zF@_J;H#St-9AgY0Xh*rO!SKOr#;AyI>90nASzsWcG*D?}6Rpy!Z7G~vdQf`4dvs>* zc)ok|R~^qk^pb0G4Yt_q+j4On#apn(j<44909738>xR}gt@j=D6)B`**fB*jzxR_| z`&2SxWYsxcir<5)T9hO&2nVYe^BWJ9r1~8uiL3e@NnF)IlDMkhl^iR1xFl(Lq$FFA zh?73VakV;Hb+{yH?rOn`g_nc9mb9YfGDj;4?*&_3+39SJq!kNYf^8V=i@_M!@oVf9 zY}a4|gR#HT&s)`1uKDrevK4Vtt0Yv!g;q(Zh~11;N_)o`6>&>rRKyRAQ4zN?Mn!C^ zJZ@*1|7BxT#P-Ihh}#*XBCcUlkaUa$c#Ur6FHAe_47^dcJaAo;#ke zoX_a^-lZ*q;#`x0J41i{Tdtg=hYlSv-dxE}=eJQ& z)!PUoSfdKY?>$;l8BrK6Nky%b+*|S(Nh<2Gl2p_YlJqG@N|L@~B(F$u(u_D2b}dyu zUmb|%6&9^ncp)9Fu&V29VK5A|voEMx`DdxR&ejb^)pce)Rl5dN*ICavkE-iz&tQ88 zJ0jTNU@KOM%T~5tR_Lj0>sq0wvh8H7Qd$>dRJL7=QQ0(Jb99QUgeghuYq_7Oo-+nDujxp8REn6#RDtiLt=pn~6_x`>Wt0X0be4y?p3)~}x z9EY-Bg2$;)a^K&Vq>vvkNg+Q$l5{vpa=#Skw-KihuN{RL%?mMFu|Qkn>_15>T3h3c zsRKWcw#HegKMOr}UL=vcDQl z_U6%K?-5P*7SUwuAu{r3X|lg$4F9;FF&d<8jL|vT*BJis4#x10_cw-r+|wBTu^vm3 z{Np~xnCI3bO2qKub~kpLG(E0FjCt;_8)KgPFk`c&?PY9^wC@_5Cv6{NZ%aGE7>(8b z#@1AGq-R9v`9PJohML%yWO=81vlq#+c{+fidQ} zCmLg(`($IxbDv<0dF~$?W1jm&W6X1(Zj5>E9~$c`?M!3Lb5AzLJhyh7D_xl9KFin$ zY3Cbbp8I@b%yVC8jCt-0jWN%Cu`%YkFE++J_a(-d=l+>7=DB}ijCti(GLzQNcg(zN+fjCt;xj4{uxjhAA~bKh!=d2VgG6l0$I zPGih--)xL|?z@aJ&wZ;g=DF`N#ys~O#+c`xWsEV|-x_0{`vGIjb8E+vuE9L_!^R$# zrrkVt~(2c&MLN0S{wBc+G#@1maQ|@q^)OckhHgqRY~h&Y?QQjjg6PKi80+k zlL51{b+k0(yB%ldj_11_Kgu1?cRPmbqWQ;Mb4?ZO!da60m+N-une+9vqiSmFn|n>+ ziuE==UsJH_y8l0|j{m=XO#%1+fvh7T8w>74g)WJ2or~|0iyxAUACrsI%`W}EpXA~< z$m*ro zalIsKE^d%y&Bcw9thu;Jk~J5CX@`h2M6^x}5uy1I z5n8b@CmpRQ%uQOcuprptU}o7z0RtjUK^z2kRTGUoa*s{2EMF z_-7gMbcUbqY)r6*U?&GVE!dP`7X_OZY(}t~gWVQvX0Tbo9u4+HusOlz23rtpaWGs1 z{~c|Urt}MjkMF;&Td?lIdIakotZ%S>!3G99B-r3!HNnONYY297u+xG~33gGiX~AX$ zyE)ix!Da@V73|SqPXwD2Y;Ldx!4?NAsJ5l_OPbOzSm$8ff^`qpBUtZXeS`H2HZa&B z!3GDb2{tAeeGAXGlY^ZWY)Y_;f=vrHBiPNsZVNUu*sNfW274mdoM3ZlTcDiT}19!FmVl8?0Y2dMJJk+GPLi;9xbu#sq5!c5<-Of=vl_QLt&j zW(2!A*lodP2AdV^(O^#mdo|enV6A@@&->Ol!G~Y+DxPlEOVJYef>uV-6N;l-NULnr zhv_Ghg+7^*Bz+i}lY(y3WbfQ@`Y?XfSMr>tSpJ!!d?(+rll~4U(?_YBSUaMsrn;e8 z@39=!%)8OJhZNF`zWRR_GB0T3lDN--EE4ITD1v)ASzp8_cLyjuruK^ads0&S&*0pwRV$%F|Jg{Qn-eC79typ+0*i*sg2cy;V&$d4QwdPg7r*Zy& zG4j8y9c`Td+pe_yKV82k|0J8z{2x#z|3}y9*~a6>)YmohM$MI#_j8n|-3rNG&%!6*gJhD&RHon3p&z4ki1 zWS!mijdHI$pG~1_rX)%2C6Iax^*2F(`P|7q(?!P)ESEbYCLOJ1HzP;aG=1v1KAMFV zmwYYK8BE}2f$LHe)mX#>r{7R2b9|vB_p>;q`g)e?gGA7L#TS~tipkmZbktvT=IriZ zt9lZ#>_B?aGP#p(wx?yS{;|+pmAX>eF2+c@b&TySZ8u~4NYesyoyS1>*Nicc-qqMp zX?q&0m$sp?Nz(Q)Mv-_+e>M8c0!vOx1I0(akQE;)$+@KmrRN8*&deRp4`4l@=hBs4@2mLo+dh({ zxPL532f47DcaXmzNe8)&&TG)`3KPQo%)&P$b7S0S*;sc=kMdL)r$q|n?B2$%9p~j zdNP!^{@I5lxfjY?sUy=-<%IiNN0P>DUCEx3oh5svIE@)`%2O9BPdGAY-k6~k3-<-1 z&N_QM*x!TEg!yN2Wc<8UZEBZie)H2kw`?Pz9Xra*PD;jaS)tZHcI${$N;}LLjlkB% zc9wR8F&cqwjnN2H8KV)<4jp}#Mxe%6y)^C45t}5f*4Siey^UeMjy1+?>dwZlls3lL zZPIo##%yYXF=kW0W^A^!@y6yz>uYSDv`NO^mi7%}A4)sX7_+JS7-Kf|6l2the1pWi zYH7$fNMFhw&o@XIuhNijkapMc{A+xC2pAxeE(_D{6ocA9Qvg7Nd^dz2*5>K-;{2ytDQ6kwcN_=A(8`5(#$*z){OVS8- zliXXfQj$h+3(2vPTS}fG*4GLBhY_#@ApU%nx4P9wi-i92fHNVY(@6^wokL8N->=HU)hGXKq_#ICI*f zAciwXk!n}KnbY{LhWJw>vnBZ>MpxG~vGX)$DI`1JF-0@yh@2s0aZ-_x#rOAU#0Tf% z6LRr$a`EZ8_?@}>+l@-oT8 zC2{7yCrM*;gyi#*M@mv&j*`TgtCGZ-8zPA_M||rP$JlLX#tvr=&7CKg$59pGO1ci~&$*m?38jfI4FU)ESlC83UlsELA@4qAL}CH1n5;wJ(}^pANGE zN~N~Fv?a4Sq}39yx4U9lAjL`prIA3%U8q0Ga(<6y_8G2z=+aBm5EZAo+WIEtNuSO_ zYVB4}@vQ5wC?$YenFX#*30O@s`yIzC=Qw_%B=>Ym%E^r_C#i{OKBI$HEL;%`m&MuL z!Da?q)t+ftgQg{I%G6G}*=qf{LDOuJ+872+%h$vvNh7wT2-PT-g_Uj4{;CV*JJ(#3N>9Z-Z0SX?+-nFwU8l=e3|O&V znqix)V$5$mTasdbjwFWdTuBVud6F2m^CdBCQzS8LKbFL>5hs0!W7sya>VQ9k=7tT; z_wYM=Egkhe{LbDBwz}+#vo(_Dd-$EPhaat2z?*W0Kkkf;z|Ppi?`&W&yclPzy2^cq zM(edkR8@`&ew_Zif@^)Kv`WQ~H%0~5+E6hn_({g7;93_dMg{+&F)Fy$go;tYCmW+m zYdxsgBxw|xc6LN-L8Vc}C_e29bnvteR2tUuVq$}n zmL&hKlYB45$rIuju1#fB{8Yt#aR4hyTOgdB9mwU4Q)9 zR(vZKY>5VB6{Dh}A~sY+1qDRx4TWW4mnJN*6akf3h$1R#G>H<$-cYee#YPmnVmFqE z*h}oO7ySRe=gb`5&h9=CMNR(9=d=4e_dE02+;i_e_so6s63ZuI&VCcDMI5(5ur|TA z3DzMPu^G>j&(VeX^BokdGFbm$BZ7?%Ha^&dVCMuoKiIFcb1WLA%(TW&Cr0Pto!I@x z%2dA87@gQd#^}VZHby7*s4+URYmCu}J#LIn3|I0j)lF|yUw``|#QQ=P6*-q!Y%>Hbr^OE*wBNtwiMs%_M4*DUTPTk7_zih8l5XlVHXGu3c zA00=jv@(I$sUh>3ZS}pv@yDZe;cDKc+ME{j8*~a5jg7$#)xOMB2bKYW{xr98LbW! zdqURh#^l*`VizKt!Y$j4yivGQcD5UNC9^-24mB(%n2HrMr1pN_X>! z^aSanQsR_ZQU;gDq{JzYOR1x$q^~7q&O2qgp|ztM!t!ni%QHsKc$~8j6RR{w#>mpGDgnG7&#+jve&Hv%P8C>!4D)ZIv2{()RQga~zAdNq8!> zJ>Tp3t&>&C&I@=>9=oOfx)*6%RW(YOdb0E<`!>NR_I~s)*?2GbcZqcSguNiYjZ`ejMlD*++5Q|LPF- z;|IZC!!r~eh`+NY#z6eB{(KfmmyU#TbY`H^x9*VvK?KTVo8w%Nb)J zrrr2Jyu7h7LQ5K>(_YaS12NH-Cl;C*V<6@ZT_rgN;?;~X5Yq|zmE+$SdxE{j=Ez#h z7(>A7#(0;_jD5#mV_Z2dGiKeWF>b1&rC)kxqB%+>IVN{n_9ctXlSP02yO3JqC2N0` zTN)#V({e8{ZmP1GF>b1|nXzMJ5f_%^PSgJ_jB!&HzEWI&_LSSJ6mHqz;mXYZZ18Yd zW`8z#xJ3K2H{|6t86dBc9y0$9ZiMcB+S`JNep-vTRh!-e>aI4XH&3=Cncp}mrWuO= z=1bRPTo&bT9~R7|9#2oBlzO7`Uqd!sHQU?j)Tz6FOIMe^CndOfUrKQEft29pL+LQ- zM^b{DkEH}RpGXOA{v##0`BeI{^fM_lq|c>X9sfdFCjC;1_kJbaL;AIpVBs6-80ojt zQ>EWY%@?=J9eqVo#=o?H!v>);8-&gh!15po%YT2*8NHD++OM-E^c>C_CzgIcE?CoG zyjMSNlVIG2(%BBdb_&L)@z>ZpSdU;8!3GB#7VM~C#{@ei*y+K}4R%4WtAkw^?2cgn z2=-{OCxX2c?3G~e2m3hKcfppBvn1y)vHbVZ^1Nf7wLE3Lwl#qin1SdA>L$P;7u7nx-vU-o~+gC%?$m#)o2UJy- z53U+Kq^9mo-v8*EarKLwi-?80ET1YXbBr7>24W?!o<5sj^8sk>9_ZZ_= zw9E`ka@>mcK4a_3T3W}JXcM#u&GvRa#rG!L4YwH^!}K zmC_dDRP!QF z>08nEnC~=jXw8s*`YDY6^6Q=?A79t`XG@c*UwbjiE2&kprTZ6UvXb{h4_^3sGcx68 zGi7?L!sC~eR~44&MGDKUGG$tO;r{NK^3Y8A_)PhnO!@ju`GHJ%cBahj`U+qFzv<^~ zsjtPiqODzj3v(;lwUxfW4c3v8Hd$9n+N6cFqjWv#A=2MVNt>)MC2g{Sl(fl)Qqm?Z zrKC+ZlD;h6SW4Pt6DgVZR?;%*rcyHRn@RVOZZ0MB-dalLeG4g>_cl@@uPvqAigqjM z6Vk1vZ%Mb2GU{(Dl|}ingPaThZ<+k0?JVV1v|Xg!igtG?x1#MTq_^LZY$ka%B^VklX5HC{iR1p50G*z+5@HBiuNEW zx1v2*%B^U-OSu*8AyRHdd#IFK(e{vXE83n?Zbe%zD^*KhE|FwqLMb!776> zBJqgQ+=yUD2OA&kv|wijJ3rXP!LAK^nhG+0i(Npk)Y%Wp-SoWEer<2dFe{@FGQ)+Si{U>$-n zL-FU^FIcZ&mBEGv8xid2VB>?G7VOMm=Lfqu*tNlK3^pU!%wUfPdpa1mqV@O8t!Vx8 zE>3gL=PKixHU%Ty^pF~;r<>pk#2Bk(6^e*mBI_Gtq?;6mh}|aZdt+Q>R0twQx~Y*G zg{PYoe#j!-MEb#R@1W2_7U`zdjL9qNOfN}16>dNERmS!8{Ml8tyrw>kT~+E?WO~UB zBFp|KqdESamzUtBQvy4C35XO9_vMNC}UJN;^u2Ne_|MNC}UJO9_uhNC}Te zN(qlgNePb+m%c0=EhRi2Bju{%ky5TIQf`uz3BOusu=Vf@%fl}$Uxn-Jwd6Se-nO&< z1p7X*{CnH}SYFAG!#A9*9c@LCf47P8u@?eDb{u)Dq4G;E*V8;bJ zHP{)!E)RB9u*Kc&e7alBdekM+-8Qu@i8WW6@rae-7RKmqHQN!RyWP+j-K}OiVsy8g z8Kb+^EJv)5thUB#WNC&YMt9rZ7~QRAH)3?RyBedr)yzhW?v|{puZh&GM%Ha&`x~RX z)r>}r?)DI4b7W~YBSv@I#~9gt&1A&rZU-3qCA!-UBREcuCrBxHIL(31lufFn_%sObqKas zu>FGd3RW3xXs{8%jt(|H*lEGe3`TeB@0sq_Kbv12T}_`gm$^MhZ)=OoYRA0Wa}2B1 zDqHZVWTR#aH-aEGTJXpE8>_$UPa&j_;njOBK&u*l_<*rv2i1*Z^zd{`mh>)@l=1U< z%Z=z2(~Z|YT5nDtC~nX3H+c;Er$~8E7bG6^d-I@!M6mq!99a1r?aA4tiIul+aXOn3 ztl_gE%2eah|D6Qc%H9bP9+)RU%L1Lv21V18%! z^5pDZnVj8e$=O{$&MuapU97x)G2hwwdVXgF^v>wJoHcxQ``2@J|FFVuXc8OutgCP7hOQ2nUN}v z5Ob1M7a^u*MPg;LNMHF48#N=6MTq$~V}zKR4T%wAUQny5D@D?+PiiEZoiSHr_Gj1S z_Q>qduFIXO{n^2W*CY(-t-s1*u2NYuV3gg-x_U&-kU@3YVW6%P zWZvM!@RDx4R|Y3ut7`%ulRNSLpOn(2KP4rMdRj^t^^BDB@|?6hDf3w=69%<3H#{q` zJPd;6bFT(_GqLj4rLecuzEI`IEvcZvSxI8$E&t$*FE;sc8^>`3Kh73~3;!Z(tHwst zU|onOyN-&caiuXv!lR>UTxX1?p-4Ds8q;N;7?3N;7>!dWiH*=`iVAQf51EOPTGwBjudGC%ri-a~>)4IvYhZ#`0#2 z<+B-QuP4X(Y{nV089y$kM(J$n#PZpUvsHsNkK|G9dOuGBLT$zy-&%DR)dU+B1wGh40_!mbm-Fn6$_guTgA*@bd znkg@$o11rc0WQ}0-32uHl+`r$t|RMn+naXt9YoS?tJFvoztdaHaV**<;i=$vg?AS? zO{K1xsSVG`W4F{_zhZvXS4-Ebl5aBg9Wtt_VnkKlTSoIvk}ZjwN|IvQ{jOC|PP^Mq z>0_k4AG%u}w|&Bw+TQOlP$FGLY+32%(!8{FQs(_r##c5mU!fDn@;eM*Bl zKh%;wWF%Hr*4bAvx2lx)xkgeOt*kcaAFzCCgyp|l=ZtBPv&Z8&rlHOjzV%&JPwQJk z@7r77)OuRqvbIq)u}?> zaI!66!?Rv{el4$=>X6={OiIgJM@q|EPfE+9Ov|H8%iGlInwE#RMpn^~^lIyB2uWEx=rhV|jg^TtF-8Y_gE2zV z-xy;?`FCT4q|J>nqrBBvA6dUQRwL_nW6UU98k->NE@R9nTN`6WsT`Kx!6mY`GIpaZ z<+H?Ylhw``*YlLy5_>|{&c^1*df3=ovN{|4T-GdO-^tp`*z)Qzo-oE0wF8W;BTGpP zJs;oJImFmDvi@m|OVhoLb(8giF}|(S&se3bmyGdkooZuzM`@0+V`Q_b_s;VjAVZJkey z@ok;I8e3J?XU6!p&bh|;wvIwuJ%VrRTxhJltZ$6*Z5_UgQIg}^I&+QjZ5_UqQIg}^ zI!h?_Dar9|9o9FM*mpISHpaJgZZpQWbrcF|?|HIj7}LKx*#W*=QMhHND>r2JXQwOI zWcFvX1HH6A8&>j~JdD+W0~;9F_UX9WPF>48?z?&UX8fewQ2p9a?*W4bjQC&wYCKtr zmE=ckX;{4Y8xpn8N8vXlA^=U!8Asw@wB~hXleu8qSV0Irx2co>bu%eb%*~}tF8aTCxHxdy$B^kwO`($A!ArL2hGPFg12UdoF29i*&?ZzpBR z%#Ko4#J88SAZ8~iE8=&SvLb#LDJ$YTNLdlzQOb(=U8Ssu-%ZMj_)bz*#CMjmBEE~1 z74f@ESrOk=%8K|sq_ok!q}L^7+8t$rvdt_gJ1en#>I}>0-VR3CcgNmR z`zEFz_nTn9ORT*8fTSPCB-)Romv^>(uuj3c20JL&p~1)|`C|tK8y)P(U=xC!9PF%M z=LEYv*j2%933hw12ZB8k?73k73ifue_kw*H?Au_CR2%*|mQSp_eN)ld?}Bmv8)q8_ z+a?&_J7jM@*C|-nU)hUJ4MmJgcF7&M(RXgd2gSR*}~Gkn;O`%SRl1>;ryxQ&Bt6Kwln zoq}}@c2KZGgY^$KDA?#=M+Tb^?Brl)1v@9$<-x8BHY3=~VEy&UYp2N5{HOvjweDrL zd)^|mRcp267CbiDsP)1vn;)f5%3d8wA4A@8P|=oHRZ}yhrhK^WAz4ort>9%FNQCN$ zPxMFcnr^%{UR;<99V)M4|8ObqX_OSNYHeP1P-1y56z0DHg;i=3b7!~5aWfL@$6Sd} zxT{)dq-UCUC1NeBg;m8A^lER@*t?Fbb!yd72a$B!Dm4=Qp}EkL^|)g9IUZcR4!NQ{ zTt7`)K5S%FJ$F)5Wu)5zCPS&yPU&N$d_L;5@G8VnszW(@?r15w&|{>VOUFxFC*>`Z zGIhO$)%EDa@?0p)?{kb*YS$y2JsrnAmsokb&$J&$F4T`}xRq&oQm2)zU#kXN=vmS& zZ82#%+scM&$M!|8LR1&6p+Q6Hrl`|bk~Yw|7NljJq_fR4O_I{GPM31F+t}HrWnp>C z!phsyWoPFkd-J(#<2d3KKd#|3s|jA6GrP$`pV|5KUqgzXS=~gUPkBXUWlh!axkh6SNa+d#=oaHIWS>7_vGM1lZEbqUZU82`;c6(x#=4J$2_-i?uPOBDb z_g`(S7U;h;sn*`w{nxg&>ZpT`O1B@|e@)aAW!IkZob(U$0Ye+8!+m$_yl;7B)rg7# zgBn~5s%|IU7O?m7I-Ottb&2Yb_jkFJ{_6@U{nu4e`Y+17cgnP=t*ox;zp%Xj!t!6& zc6MK~*MD8x*|Wjki^tM``C}Kp{*@l7Q~&Lw{*@%DQ~wjq`>mty zvApiF^45}_%}kEV=N?b2QoCEfANO`JyujJQ*S%6*b?Uxr)cv0I)cxLztnQg@WWT9d zSobx>>b}@dKmPElU!ZHa|4^M$_cNu`{k>A^{sAdOx3P#=gW2t+8?4n5Z6it%sV@}aTZ-Bc>`4zYQjg^V@Ft!8 z>sjib+$s?vU#UI09a76{TJYFpstI%!~La44jM7Qzk5<= zcqw@81|vjjla`Tgyk}~2DQWsyURJHJ|5fQ~(l?S?YHPKGFJO6qh?TeB)^ohslnjk<_0!Z~#J3t&)tDZXOsC1)4FWi3U1b2RmeMZi&9*0&{ z|CA9Tb=s-m1M&H&(-NspjBW3!4(0H<52XwgA4wS~{v&Ojlo==}(;~OCx+Xxx@__=& z7yCH7KiTVxeVqL>7{i0JkAf|H{r9V<{{I;DKd_$q=bnM{7U}(z_5VkGo}Du7m~+ng zVJ7D^}nK&wojS*r%e6t5cQAc^^fIk-x+P+8KI#w z+P*Vt-5G7)*`f#%f5?Koq5qKTKsn7A0p*d# z2q^z<>`+;MFh;0!r?DDY#~LF;G}9RE{WJYl>Mz~6{#LkU1J6?mcgoHNo+oDZX9G`~ z?GBl)i`OK0o20+d4ZH6_-@M)f^~@FxPIi1UHESH zkLI6L=e!W>5%W|+tO>Tac8K*%EkEv{qtflihFIhEMA@&w7Y?ywiuq|}#fXZb1BTYU z&43&v-4<|!#m_pWkCE~ovZ2)m@(-Q<+(uHm*Nvr{OE;CaPRewzl<}h-&5sDJu)KT4 z@*590o006z+i%c1dpy|d@z}S6S!?j`t7L8ip{%<4vD%ZE7i-mA3q4D^(NYSx>?DTw zot?U-k6BIo#ulrYzJo>%@2?-Q9IoN7PDfJkstrtEs117IbmMiYjl#*xRyxb<-&V@| z**-bz?d_}|B!cCW7p#2l{9qR+mVbM}kGnnC!nZ74&rl82Zdr4pW$7wModD+DTJ_UG z?;+jrz{2f^PF{}JgR@`4=Q;6Uy!42o^{4FSpo%e7HFYmfs2b930o&GsWwv)w{qf#* zmD0L)lhV4nNNHV^dEb<2T{~GlMy0G%OJA>VwSb6(3XFu-AV6-V`gfafuhFjN} z^|Y=JYt>#0JxjW!EhQ~yTi4;*kl$M$Lu+M>WoXwMdqURM#^%Vn$=F-6+8O&?)-A>e!FD#b zy!w~hjIj)@voXHYaHlaAGVNoGg**Q+#&;SHGRAirlzi9w<2w!I#wumqZ;bCW^fgBJ z_?iAH^_OmZyP)Yu$o}wf*l)dQm{V-n-c88VAFzKAMDOxcL$pl?8#uWgS{H;gJ7QoYb2NO z&$fJG<$dZ~Z?ON6^*gnL{lT?*pcbl+bW1~vw44n`Mrubk)0sX7&mA|P9%OLU*dase z{wPZNa?*x^kp)}Ia)dmRCmSc_{T!2cXb1C9!VxSFN3ila+KICZ63fF8XSWAyIN*D< zo-;grq0jIUdd2J)hYQc}ABvsf0sRII8DhVdUDLOsPu=;ho;%$dI?uGz`Aw-NBxm`g zv>}YT&Ej5RMx+Y5pbPltVWhD?CJRkxTY8*;L=4tF#@hjj1h3@ zf}a=x*EC}cP;VO};JV%z0oT8cJt6B>V{>GEV2pt4AI3Ds)d_qEy$ZK%;PXx4PTASO z=Znn#Y~Zu9I?rsDlhLicYa;*YmM8S-PJ4 zt;y2$d}^#r)+}RmJzp53>v`7LuCjD(QC$UH&&$T@YwmPHg(17Zyg85DP(5f2UKTw&JMcfOdUz;ILNjKg%O_Khm zYXYxQ6XCO5Bc(}RE2T+ZC#6YVFXbHFBrQ+Md~V7#t=*z&VR_TS@|85sK246(1r#}= zGgi|0aeSlM87pa=H4oMz7&Bx)j<2@(aScaOx*jdxsU54nS<8!B=v}2-8WpAGY^=(# zR_v=I#}@N~p#w%&HN0v!eMxCUanypvtGBC0c(S{s#H)8FHPp#!2tUB`ND9lBUOQtr zc6NIlHzU}>C#N-1suu9Kd6#|OvszeHY$@B@H1@6|>*HE=)IlWOwn~jesUtZ;P7ZC_ zCbOTGUU(C$i7FLadVO5cIvg@+O!bh#11biU_wD;r+`ekT64Vc>4*86aNJ&sXD&1WA zxU_Xr-ZClE8arEEk4`L4P{VxbHCAcvzGSa2y>|9&u=nDz9|c?Z`Y)-c{=bg;U#_0| zUs6r>mswdezF7Sa8(E?CaaF_n*Xg!#zhq0=uRfn`X@Y94f^tEy)G5ITzD>`}L)CHF z_Rpm5Ur6fy#iZ_MCv{Jmx~ELtcZs^k^18?Jl{L=(ksRkMYn(k1?Cr!VwJ#9)V;k;a zm$%xh-NQDjReLS;eCam79`*q3By#fB`vve zQcPQNvrIW1a?<@>3ii)S&CV|b`$TR;2=}ET4NJ*zCm0=iUwWL9nlbkx=!=<~8nMmF8ARti0VY#n}eI8tx$0GCz@v zB!mA7vNo>eF+Ze(I7*N1oT>4&Q=u`QP^`vBRP-zNh0W!DC(1hAxSk>1eq0!~WIOL9 zmXY$l8cC_8J*<}S1uX9*u=17*adt(r*S{^}Y-X^9ABLM*P2k`2!m!P)CJ4i{21x@? z)7VQGwsoy~>L8MC3{{2O4-LbP*Mp0#5tvY{9!FL68KG}s4;lLNtr1vJ^(SY~HIWj6 zts>oAy1JAQjPjOAnR@PK^*lPUd>DrL8Ud`*+}+7uUnAh`$zX5CW8Vw5CdX#At}4jL{HxG)6=GgE1Q7&cQ!}#Bndy-^7L+r|z#aNTbS#ir)47eALg|CbJ6= z=0%Z1^%>HQ&qX6Gl~yKjQ#CF=YilWubPFksw2hQTx}}sxx|Nhhy0!EK={8c%?RL@& zk}~IuGL3aFHB7%CkL8UOE1x5#boOdu`9*qXbS!=xF{QI5)wrAyQ#xxBtXZ&ig0%|P zI#|14I|n-`827XB*Z41Nz`I*Rq5+>{4T%Qa%~+YN3yjf#wNx%?z*iWf0c+Wu7!7!u zF&eOz(23E2Z#G5)?rw|*e1|a_a1UcN;Cqb8x9W_pi@E{N(rdQOjIM;_O2h3Yy&x&ma4FMp_l|~( zTiye6H@bp4&uuv?dF(NAw(pO*Ccv6y%Ec07^P8Sz zdsNC77Ce7UUzlsB8=sTNhz@X20(+~;@Y$=RbP0W>bg=!Tbg=!Ubg%=Ybg%=ZCrA&I zo+}+B<(vs7R!IJ+u3W$UjM~zXa5QIeLQw4b%Op_eyrAy zW8tu~wS#d7LT8%>+aefCi2bp<1lu#%zQOtj8#IsUz0`lhf+Nhgz!RcF`-O8?TM$EG11p z$0*e>`^QLmPe&#-zMs`NoiCPmzF2viX*jz)+3N{^XETERIy>K@lgn{d{dBWUtkUUb zwI(v@X4f>v2_0{YZnl{*y4e$q(ao-JjBa+KF=EqJ#^`2GF-AALg|P{;PBTU~yPYxB z(a#>6KBw2reld+so^Iu0{heCGS#`(Ait2uYs3Pyqr57Y+J6|f(b?$Es ziLMjNyG|^>H;c2^lfAy8#M!68xb*Lg6(#;yR+KnnMTxWK!B|n^Y_ni(g0&CUAsCZO ze?BIc{@7n<1Fk=MT1@3G|1W=9=6|E+iw;X?*zmxx)WL=ahNZt4E0fjP7{ij*nkLcz z-o_Y~w9ZtFVd-FF3`<&LD#ozX(-^~&){}}cEcG)sL6+8*iZLuz8zcI^+!!5bjjf5eZ&utedPE#`rSXRAZI0?lH!f$!;*l59Hiu>=;?M89PmumLlo>{Z-c8 z#x9kmWl3UJ%ev3l?Xn&-c8{z_jq#z~Hnmi3IW4`t0ZHdoej#`uApSB>!l zIWHRH2Xfvu#t-CZ$%|f>AISOGSbJHo7~=V&wgZGW`139Z3n~63d^i;EiCVoDKl{^+&?Z;J~LCEnkmo7 zl%LI%-^-Mjr1rF>@BcTMa;r?aL#Et4Qy!WrAD=1n%OQoYcYUVJ?}QZYpPeaxnknZK zr%m5~^GtcGOu1{O+`FLcmt^c4?W2>^#9P6~37a>T&1{$>4VY>r7ue_l71$=Sjq*^OQdDeOQl@iyiCe> z2rifQkzOI?8v;|Mr%JDsULw6pdYklWDL*VUP09}oT_gQYdaaZn7P?N#4+~u{<%flC zkn+PqH%j?op_`=qu+ZP7{IJl?(yOJnNcl0_TcyuSr%OMS-X>i}=j(RqTGBhDn@jJM z?k2rU+Cw@+N`G^Y^zfuiA3~Yw!vQgU!1Cz>mVd9q*-OcB{=E)o?+5!Tu}X8_1zS#^ z+>dLVSpK~ZXHA1K-a6YP*tWrT2-Z0mb;2X^xr2lC2sR+t;9%66zs6C)P7HQRu(N}m z8|;c;R|mT_*d4(h4EAWS=Yzcz?44lm2m316cfpoZ4f}g;oLD-4!I}ocqmuI%Y};Tv z1nV4Zk6;G}V|4d(Iw08KU}J(E73{=drvy7Y*tx;32zGU_TZ7#Z?7?7<275l(OTpd= z_I|Lhf_)ckIeB<;{t`>)FIdxH8wT4X7%_rBc86e{gY6NlGFbm$i(*P!G;}{kO~DiQ z$7vm!-)VQeu`)HriN*-sPcTMC>2za+?h}m>x}RmNzEG!+_7-m0P^Y4Br|fK~(<8G# z8|qxB{lylcZn084ffDOghj*?XFrs|7uH^@G+-Kj;dv+_|y!_|+opmxiBrDU6^TJT2 zm^i)%w0;X8s#;1Jsy31`RBbF}sM_s{a|2yZQ=&*8% z4Gm<3&WmB?G-G9Am&UMihB1bft72IBi!p|kzZ)YXbha@%&FRL-2%Te$jL<#CCdfL^ z7#X35j7^bsp)oQ-Pa3;X)+NTs2t8+vjL_xA$Oye;Y>uoejgb+0!x$N%X~w>j^?@-m zLf081BlM{;GD0^R+fde5#>fcWY>bRhP8YLEa%6<28zUpMtT8e|cNilhw1P1*LNkn! z5nA0C8KHZOkr8TUjEvBI#)vo9Ge$<}L1ScuS{frG^oTK{%*~CF5qiuR8KLcrkr8^* z7#X4V#>fagV~mW@uExj+J!g!J&>qIf2)$^GjL?3@$Oz3g)3Cm16m^dDnngibX^ zM(A^6WQ6`~jEvA%#>fbrV~mW@x5kL}E-*$$=zC*igswD3Mrg_A)HE5P>x_+%wTv<5 ztG5`ND65gN(`C&tcD}4qW0%Rg&)DB(tzhg9S+k5iB5P%1Psw`9*sHQuHTI6I7md{y zo_(*qg{I71r=MSGtpwOxMm*GF`h!UzT=|ekScGCDXO5luXxdQZikg zqE+x~|RZ6C74=I_hZc;K`drHZ4?Ik61vA2{=*FMq>rTa?BbnPc4 z)3v{pOxFQYGF=Bs$#fkgB|C7iluTE5DRcirq-44dm6GY|Atlq*Q%a_*TuP>^m$Zkp zLONX9TY93jkMulgrSv9gmGoh0U+F8-ep33sfzof1GJP6lrej}gs^qJ-v3xp)<!un-XkluxY`j2fH)aL&0VRdm-5DVDAR|AlTQz<_62lBm6zD zkXZTLn!%a{Bck!+NUZyLX&bCvur9&61tZn&kL?+3V6f_7V}p$gHZjltiduY~YxHJYb6^jB=6#qyUmjg`rI*BCkUrp8Eid|-?mdUInWJ3co?vSVFiePr}X_+WXHzFNOml5>_%Ce8Y9`!*ci!<*2YM7tYU1AtSya^ z>{!Ft=d!jj_MNQX8Y9`UoiUOf&5V)kXlIOMM+;*lJ9aWgvSU4C-DGtzMzUigV)BiYf`7|D)(jgjnVZ;WKe0mevnbTCG; z<6vVXJ31L7NI29O$&RkZNOqJPBiXU1v6ixW8zb4VpRx9`s*I8BIKUXmj{e3-b{uSs zWXEB~NOqJPBiT`HjATb2V^RmK$&M3^k?c6$7=!i6#z=OY zWQ=6Tsm4floMwz6`cKA4cARdEWXGS4k?i=ZF_Il;86(*-*%--=zZoOhF~u0kjw!}S zc3foaOIa5fW2$tyvHB7qs{sqPYyxDJ%>HZwWW~(>YyxB-y?QnQ!fUD$a;r+WoNof8 z?$1ayn)iNxf%VEvcrQ%eK|0}GycWk#NP0e6QN7yI^8fN$oJE}g;rYK+D@xDjyoAWL z>aWv{Hg&ZAwh*{D;lnf$ry@p3)dA#2N=b-}l9CWPTuMS@w3LL%7%2&nvC?y;M@UJC z94RFsa+H*W$T;a|(mzN^h#V~?A##kAgvhZ{5+cV*Nr;S>k`Vc$l!VCfQW7F3NJ)rH zkdhENQA$E&qLhTlNm3FbCre3)oFXM5GD%88QW7G6m68xSOG-lIY$*wm$x;#`f0L3BIY&xDltiduH48@ct16_ zVsAIbB=$jLOk(dc#w2!@u{pBtHpV3ODPy0@y4TouvYs`@B=!MgOk!U!#w7M(V@zV_ z7-JGU%NUc`*Nkr3AItNeODNmlD+8ASI~1QA$vIlk{Ba-=ze# zH%kd>Z;=wz-YUfpr%MTHZ<7+#-YzAmy+cY+d#9A3_AV(w?F=bF?LVaW-Aw5fNf}?F zOwjkO1}hKxusrC)@}SQdL7y{%K4%1d&ItOP5%f9B>lK`>kXRn{IcpZIWgOQkSleLj zf^`W-JNMV<9;|1ufx)VS(c=Ae#|4`hY*Mhv!KMV88f;py>A~&{_E4}{!CnY9JJ`Fy zJ_z=8u(`oVZ~1%X8oqzt#e?{-c@VEZKfRc$OIUm@=KsaDn8m)n*w=MwY_YHRmmmD3 z=b`8X@ulYJ1o2CoxDb@iF;*t)Yhz3hUo*x8ajr2Yh;JHWg1CepR$_Oxea9FR#AS^! zL43~`6U4kRCWs#zV}iJnF(!zg7-NFCvN0xzpBZC8xXRhxSbJF;8RIHvFJoNgY-NnA zoV|^4m2-1rT;=R%jH{e&jB%B7pfRp;Zf%UKoYlt2+O;*tRn8h?T;<%s7*{z*86#KM z-WXRok1)nn&RvXgmGdZLT;<%=7*{!uHO5uW&c?XPIl&lLIlCI;D(A_@xXQVwF|Kl+ zW{k|+KE}Ap*;qbPlH)4p{>Hee7*{!)8{;Zxr7^B@u4jy^oc)Y(m2-V#D`>(v&=}W5Ha6Bm)?i~B$zr-#l4~n# zsIi@7wKlewtl`EEl(mhqzOqIc8!T&kV@JvwW9&FtI~n_vtRsz`Eo&EJm&^Ktv1?>? zGIpn|V~yP_tBbLxW&P3Ei?a4M_O7f6#y*y{pRwFBx+-F9Sy=}gTV2*9V@+lCFt)L* z(~WH*tEaJ@Wu0lPv#d&E2g&-Yv2s}hj8)5;Y;2^gfyTzmI@j1qvZ{?umUX_d3uKKn zcCD<7jNL42w6XhSU25!6S!0d;OV$;}UXyitbWK$hzOyU9zq)#_!2JWb7GPR~ma=)}zM$Eo+)FeuL<7V@oWn zcW-PZSx*^TL)PDo{a)6y#x{|4hq3KtJ#TCmS^qG$kF0+gJ6P5|#`?>8+1LzY^tocja?_}DPuEa{oC06vi@o8Sy>+#dr8(y#@>_l zv9bTinr%!@Tqn`DTqD7PEt}|DHnTsQ=vykYKbz=lt#h1B^zoYN9CMANThAxa*SdVO z#fiS3G||V^?5Rt5m8Yu%W@O5X?*vl&{1m$r$j`m{fY)n6Q`VN&-v*g-yG(h%OnG3Y zOp3Sg`TmkAUzI7}ohd(;DSwbDFRk&U@cGxwlsC(icg>U!&6I00estJEs ziG9YASyCd|$D~A-k4rmBpOA7P;z=nNBA$|-AbnbTuJjox7b2dOGBW>D%7uvMq+E!2 zURtW2@dYUtB3_hkE&Z323lT3#`$%U?xe)QP^i=5_DXVKYBHttgd-m%IcbTq^z!aSIX*|e@j_i^PZH|HSbGVUGssI)iobVSzYsy zl+`sKOIcm>iImkf|B0oJN>2cB(q-RT4lwKoUNqVnzW$BC3Cen|kt4Nns z%UD&~RJxjU3+d|8&eAoc<x=Jk;3=iRBlzoHYy9 zGLCB%tZlG%!MX(N7OZ=)p1}qNs}43c*tlR5gG~xHIoOn7Q-e(lHa*y#!5#`WE7%Lc zW(RvW*ayMB4mLMfUM(>>e~IO*nUeDtj4X$9f^YZt6bux`P+2kRMZV6f_7V}p$g zHZjmH1p3eW7Tnfx`XgN=>j#swq0;>S%2HaXaoU{ixl3pPF2oxvUo zHY?Z*!Da`0H`oWkz794wSYAD;zd!OZ{@KiFNSW$vEA1$4D`l#)os_B0_EOH@j?$Bo@}#6p$T&AbMl25*u{>mS zM#$)lkkJ_-qccKAXM~K-@=K&_g~U>m57sPL%V4d7bqLle*uHP;sdM9JtoY}95^H2~ z>AiUIfRnc5fp$_CU!`4Q@p%~k;)o@0SbQE9uUk>C@atWp)l+Y+(fAifF5P;@A@^Ln z#3AH%a&4O_VUeTH-pwp7&kixGrL3W5Z70ir)4RQ_l64rbca!xUrQ8AfznrlivgR5a zr2oqs8!l@p^|-nRzN{6EF>*9Ac9yIr#?F()qJ$E=c($4`E}5-tY^JQ=7<*V2OBPD( zcjwnK_6mEA5mhuZM%?f_V zr>sqk^~5q(C5sV8m&f&gGh;`{+QQgGEMuq3;yFul=j;Dg#x9e!gR#Hs|F*{Nki{~K zlH4QuzrC@iWbI|N!`iF*lM!&GS)&?Cu1AQ z+Rs>9S-TtCN!9_z_L9}j*nzTo80#x*Z)1aH^)hy(to@7~C#%xfpJW|q>}*;6ja@FQ zyRmCzu{5M4$CSQ@v3q4z8+%$-FJmvt8g7h>;U%OU})_*m1=zQ&f7b(FEyWeqUa zR2EB3N^%>^8f0t>S${Ofo!W*N>n!U;V+YBqF;*_?BxBXGMjGR;;3Qm2a^q!@PLxszhsR!_L{7VjC~^O1Y_KD=?Y_w z6sJuzwxX;njWv^Xim~-%U1O|`tkaBbC+j9-U1XhMY;Re3SxK&!tiKrRCyV59Np6&^ zvyB}kYlg9tWu0T}3|aRYyHM77#;%a{ps`zIU1;nsS&tfHdVGnoXJkEQ>~&d}8~eAc zr;W*|6VvB3y(`>^>2+|9V^OBhg&Q%w?^PR;b#rEaHl}}4XEqzt^O`(2so`zs6Vq?8 zK$nX<@TRn-m(RL;G0HNEub28=YGvx;|<=L6?r36Yck~tnKH@1!q>YoQzrFSxPMNj{CTFl zeA0^2&$CXZyiKOuEmN+{l*eYur)A2QX3Do`%1>s>Zx@v3&2d*sYQa9L+B9?A9aUI5 z;k#%1C#pl+mb%^gL-#DLr_(^kHc)=_}F- z=@-)8(#HBseWdG3E2Y~?tE78M`%0^%{iH`o`%6!k4v=0Z9Vop+dYJSn=^*Jl(!tX2 zrPb2aY z<&=qQzgOPDzn6vOxd<%JML44ebw)128Mz2&*ru2OAq~T(F73CIy=uY)Y`H!KMY99_-Fw4+WbQ?1f;n zgS{K|pN(`yklY!R7|btA|L=Ut;O}1tZ4x&(<EwCiVcsI@1X0rZejIr`M zV`S=IHpV!3qcJkYZy3|Zs}r}AvoGATx%f2VO^?au;>i~jZrQl~Lha1P?Y!oa`Xe9R zmJjJ$y+4AoMfrl{;@3!?B8_`C$&`1=ln*W_&x=EPB^2R35{FP5EbwNVq;ZM&eY#Yu zFLGx{H;|qwZ72P+lwV0qQCvlSA{e+KHs09y@gwL&YI5d(qpo7R@z7zRLT&ND9ALN-uPY zls@QEDKYouQu>-Jq{Q4)rN>FHmX1%#d{)Z%{t~KF_kAq)eJuBVXS0*z-1nW~`+gk0 z?`&?cRrOY#kxlgD`fG3fzf?cNe1jJ3{p<>|KGWk$aykjtL$;8n8&}l|H@t+6V?Wj( zJw>*b)5ol)ecR8smh1kGfF71^$!+w~^h)ho+$=px%4<@Kj3nv%zfosh#oWzO-pll) z7M9c*U)Fx~3Cn+>9xHEOvT!y<$2+?*u}X8d1pE0ebY})iPP*hovKvGT&LEOgFNW-mZ5e zSl*3bc{k#0c5<9|BhKhX{5ZN1XLExwggRpg_2bqI)+|_?VA}*+6b+)N>py9(itDdq zu1XB_jIlCVWZK;IpEHK*Z(%x9#GJ1;HQb$7;ccgAveb~ZaX&fVD=?(E0m&d%lr!=0Vs&VF2rU_^w@ew^zT zb<)}E;D$J9JDnfzpITb;v(y zXVxKkO}!zj=pEDdTv{$jRLCu-x&m-0_^vPL6ZObB5#jaX6l{xxom>oDq)saSexKrS0&H+Tqy2 z8Z;Iz92=o`(LT59%97YPBW#2~r_b9{Yr=V8=WgZ053d+n-hV*#h&uIX5BGl!1Z1CR zFP@xkye74@l(aFhmWN|l`5YINoSmOo`5fVxGr}=H zuHm!0LOo}-O2Tx-2?TbrdxFAT0VS4RZZ29@;*bVN7M`%v=Ham z7aGp*EO+kWXSu7Cv%II2vs@l$8OzTyRz7!OvbQvMX=3Gbw+EXM?8kMKzlKFNMLX-2 z%~j~EN1KBXQLJi=&iY7WocuM6(ODmFjEG`QV{}aujgfU~YK-yn3}ZF2nj0fD{F|`} zveq?rs;u*jO_B9`W0%Of+!#*3p|RU!U2ROQt4?tKgjnI09V8wr+$lRdNIaa`pB*H= z(f-{s4S?6A^L<=@e`}}#?6gOR@_s`{mRAfPKBUipiV*{bRM%+%gcQk^^fHZ;Vj7h< z%angel+O1Q=IJ3tMN^Kr10Zm_$Q z!RQcaN9mzbg8UxRVbY$`6Qt$RbEUncH%Kd_)JLWC(WJ~drc8tGWexhQ#PY!lme0Kw z?5)Jg=l&Dyi(ss8;t{2}WfLoJYm}U=5sbA)&ejjcS|MkA^$#m=>wTPYz0lddaomBy z`ULA2?8smwUXsVwUaJmY@4@m^_8^aNcKc$nOs_g^igISrB0oQ6s}N{2}~ zFC(PoNtw?|nPyTU*Yp?<%bN*SKKDwpw>0-gV&yHR<;Q&%YzaA}GcJ$&V_DwkY_(t; z2iq)I!;#50<}bD5z9(yWP7A$*bmNm3Zg>tGUiPv6<`y!I3qG~HX~TWXL-AN&hoz&`Ya!% zSL~c=Uun(oiKY}g%R04H)x*`chAR}T8BpD?&H$)qNVf*UZ0%+Uq7Ozi5zG7Q!qnWHdR?`Et_)@R0OC|!&(SbuMf!Fms44Avz&zn=Ww%NRot zx3!ozL97%>HzN1KEjxf8Ubs_sb^s@-TexN8YvR5gGaU@C$pA<-o?px{hx!O!#~o>N z$+igM>WGVbr7t4oJ>$H}W5o62i{zAij!UIO?VObPJd|xq@OFOd3i^r(Iu1CO(%6Dx0D z3~~0mV2jYv4h=`!FdVHs9Bq?uwBF%pTmE8>Hd!Ywn}#cNv;&l92;3v z^%HlNK9(UdGh4>maH@vu5 z?f;B(!&g-+db_zdq^n8aPHJg@)e^pd<#R(UpBp;6BH5eI&4}Y>23z>K;RvebUEGcD(SxU;>aA_&$ zX<6yWq>Kww#;Ff8r#>sOe5ir>+z_iY_j0n==Z4Nc491}2?E7F0I?k9IV)@+A8FNEt z3_8x38#?=O4WekgbfP&WPJXI6B~E^_u`*eIHOAcVRAV^#`3*WR?q0ZMop({s4KFL| zyubY1a0NLS4!W|GNT7)n2VF%9SUxv&_Ih%h_o&Y3 zQT;duFK5gRow2UO8G*aAg&%$YWd2cm^u5?Th0*uVwzu}^du1&@`YA`>33|nB4uKI} zAJa0kmlyLBTfoxL`U<-2WLv0_k44`O3|_{hjMRXy|GnoAjV%cP9DEu@UP zlo@p?;}3()ALz2MeALDAh|1Z_WN+RssXKc**xT{g_kt~a-JexY-QN&(|F?STe)=M- z`_uJ#_Q=ei3hVxghU&ia79BKy>Nj9S#h~(011gIwviadop!c*Oez1}17e8nv#Sb=> z;s>pz_yJ}7fHHni9e#l2et?y?n9JFt$#MA{F_*KKg3&`b`!d*%8*COL&YEHl(nN3I z9&-zZpbLzZ$$HQjL(s*>7=j)%wyUhmj4|;1(-?J=jj0y(l>Gv|<_;N`E1a@VE#`9l zDh3a(_=yup^-j{=1rO4DO}F}{>D$V+7^1e9GDPhlWr%7gC5GBj+C#dtv^*&@O{a`Y z4l$P`cEa+Z3d`Nk8SdxoojC6OU|$9MF4%Hv75-T6V&jix6|OT@;W}Fsu3NuD|9WZB zXm4sXwSQT2p{ZRRO^x62@F~r;(bV2IwyTc2A)4AJ#+cIl-58Gajj~|%SNcI$SB;h(<|JsaLZnLW06z#(i^WylWHQpvS?RORXu1( zpTib$XF%uBEBOrRmE=*G^2wRw5BG{(iL@+(iQC~WjeQ)beME+=?T((q~}WamEIuTPx_#Af9cE81EdTQ2TG~W z?oy^?l&K@ibY(-ME5q`x49lm1&Uij&Tq1P#VKAnF&b|-EG|(BZ>5nD%=!|KgvyFmn z8f?2@I|kc5*q*@-305BLuwX-i9TDsg!A=TxYOsrgT^?*vbhSmhu36T+i4s~{^QP;1 z!dRKCZH*BnJZ+39VMk+hUH>#jl(4I@`nrZi9VJ|@SI&wkP#(t*IA^5sbyt&bT_|k7X=$#?>ij zIIc6UPC5J8UHHv#;Q{7`^uX_g3-c3f?!xbd3y(HN5By=c@X^M8i5~bWy^l^s=4sOw z(1k}1S7-by>4lGxE8@cArMU1PrMU3%Qe5~1DK0!wiVIW5g(>60!^4HK+=a37w%EiO z$s%X;z0ST2M&IkKQDWtD^u5kVGWuh2VQ09ovqj;;i)v<8G&uPrn#TBO8lOeeI60ce zm(eu%O+sIF@J%!gex1;l5zaM6|9X)z=2c7V$X@1Emm8ZPYiVPr%DTqb6j{p}yF}Ja z#_DTo%&-c#>^$h!!kx0S^PrnD`?K?)H?)7JOjF}Eanw{G_ zLxwKmHuhs@LN?BLT4l68Q@Zgvnaj|;1|{%xH8(!{nNphRpQSX@zes7Of0Z60Jxe-F zdbacg>0~K$nZHRn=ToFNCuPnfWnO25nyd#?Sl*1W^7f0B&R$85%iB*9IQux*cZpS+ z#hH@uvU7QrVUslTk3rjJ=o`>rkGrG17B9aC;$c^xm+Bh&52t-!xT zwaYVIF6I4Pnbh`3t8JniEMH}TmCxZT&Mru-yxnlb+3msl%c}njH?HRl-@DLfn6={B zA-C`hUsvP|S5~o(S1b)H&naI-3#f=NsON4o)jsl`?aF#43`wZ53l>vYs%;Nm||5*0P>A zM%?yWW6YfA7$fQTJ7Ww^ZyD41tdn!M^q+XTWe1qU(;bOs2N?@>w`wplcFk(y{pK7EBC)+Q%&iyVqA)n=LDNcKjlmTO=lmX*jDFeoR zQqI+bQo1wBe16Id42Q3s4h&d6Fkt0v1%tEKlH>BZ4->1@zUk@5eIJa;inA3HtJJ>f z>5SBsKOad@XRKgwwtcW4*C>iQ`r11(65#0k=B2OwT*p|M*r&#D^!1G4=yMx%U|ha% z%R2C)UdwPp5eFVxQ#G9L4cTSNpV))b^v_-eAD(kTuc?z2>)aoggW;f0NpaApr8wv_ z(%q!bNmfwxOhBMYOIQwyq z_T#4!MO}3Rb3t5nY4tensv8+A6Du`_tF|(RtFCN}K6!IvRLUC0=#$$RqfcJjSdFZ$ zjnOOq-dKJ8^r_lgxMkh^l){~|v;Fjmnf=**`d;nNhFH8Nt}{u0Hx_Yo%Nq5o88Y&h zo(L2K`u+8u(~ZwTv&c)S1Gbmt?tHdar8JAzq%@1yrS#ixNa?rVln#@=CFLBxD?KSG zb6zOZT*j=OHWw^!E?6GeJ9{NL&I5aA9|t3_cSd0Ek0r2oMquxZz}^{wy)y!PX9V`n zItA+*Y~h!Vv^5`{Y_uvv#m$890OC6;e)K;~_j8wCM^%T`?U_C=M8(2H2W&`V4 zs@YE6Q8gP_d#GkxaT~t_`7QkU-#*!Wh9}zhrK7!1cAxsEjv2p|X~2m8g@07q_kAY& z-cTt#m*`*EP^c}pb>On-*~$7II;stt#XH7>W(m{=&621Mnx#-1G!v+u?3P9CWY-?s z$*w)Njy?X+!okug9xRRGbBnmPDVdAUE#jJW;y7pHL|n6Ti@0VlDaAFrtr^!cyjI6+ zcCs7i>|{62{omUu{{DRBA9t0r)U|C_>94MByGmEp4ub}%X1hvv)ofR}R5jaG&Q;BJ zl^oSL0)0z`(7*Ba~7V1JRRJ9hUbhP zk@G+OAElwa$NVwLcKOR^2Mykt=oa9or6?CZFj1Q+U|4^YP(Z4 zbR>E(YUdy|Q9B2*$94{4k8QV_aA@IfWfbpLM)5UdT(fJ)xb|a`;%msbw#RFB4H?($ z8Zw^NUhs-*b`2TV>>4tz9q+ZqUbAzMIA`Y|aqj=qyV`)(cF49}?RxD7wyO|2-R#?dswyqH+HpGdG>veRD17g z&lI(*opmOkZ8vt<1x0?c9jjFM^S^Lk=I{2kpLxE)h0lrp-L7^xyNK;-N20c?9fjJi zb~I|cT3yt3wM^7@wPR4*)s97NSF^{qtJ!1Q)g~TVxT_h(yP8pa1dD5S1dD5S8Wz{= z2o~4u2o~4u2o~4u2o~4u2o~4u2o~4u2o~4ug}J!a#A~*z#Wma2;#~J>Tc))y!{@W4 z<(`<4Q~JhiWb}?cFBbN=IxJ1$&%sGB&wh@hnM$Dccq_j{_&s5t8+kU3WvoSS^Bz-7 zpEcQu|8nd!d|0;;11|XQ*I>yP{?JL%qVjgp9F?qOPqWuWTy|jywdb+{v=rJTSufu@ z%C+ZDL+wPHd*Zn^z*as%^E@f~8La?wJsJ(i?$k+)ivsbzAvXN<0p zw`z3Rsizgo=0VOcf8Tl;Ol?0!wcdqzP4;QM3~ILYwfVjEZ(8sFwCQYr$mX~3Cj;2G zp+PbKGz)h9$lu!bF)2WCcjzxY;#*C zTL$Zkjp*+2PrS!;8#G|l1%ulcesGlT7ux&_e+rkA$Luued+jvCc*72F$t+*lA`_YI zWupg-8XZ-nV$Wd}J_lj%J!?eaOi^2=T%O2Ucwn;5xRPtj$(QcsrlWl9pI+JG+&MRc z$64sHDDQO4ZHsayt-FVuQf};r?K2mDVd=M&_+=+N1LbZKMnY;Z*8of)E4Js z^f>er)Rxie*8aBN#J3cT;#&$v<)ZhKZu#h=Bqc|}w8rmVQ;<`f)-Tgz+Qc#phBes& zmCl*=d%d5sULT!yeOlsV8y)jj<^0sQ_sb=-qG>Do{bx($F}K2>!lf?k$$M`J8vrwt z!9su0UR$C%o^~*_(BCOP-fpZ!RCS-}&(Wrh)3!(E^1JVrv}Lju%;NXhzuA(!eEeT` z?hBuvN%q>3BiJ?reM{QG>@q#FnU3H$-mbP)JM&xkW6z(`+8F&3wR6v}P+M;EE%%GI?lVb>_b#iIi|j1IsC;B+5pm7-t~1LtF1TiuZQT=# zjV_&?+p+{Hd7)mQ_D{Z#-+<3;1og&u(JV*oxT3t7q+?AKy*>ZZ9be zp?kG$yqDKTw4}AyI=Y(1%3Ox*!;}2oC?j)tdvvc8MZ@2rLmQ*P4_)~^`d4! zww(53?QOZj-?LTykN=`NySed>PGs0UbB95`KeJ>iJVex=q+DQ>z>9;d$)Kyr(CgCj}^PP?R*QlsoGMXi~pTZ`$USbDw+e$X1T*9yY6#CXnO3ICM17q9$y?aSEUdBHDzP)57 ze&c=idRr!2hEe<;U--n4@AcM8{`-s03cDfG?A1*sG5G*Ka5?TK_Jy0n;$CC3wL#&0 znYP{4YtG;MBqx_@;g2m-E|XV43)}2>N;XRTf!0BHpmqq_iQ37{pJ)?w584dn>@T;! z32N=eJ(AoDQ9dYE-+{(|zvT|+aT(Os-5%R&ZS$UG6!$En_@pPU*-1}aQ_rfxxRTbq z+Nf-X=XXaR!ywabTAwoKOshF<&y2JZ*Q}!FG&zxBsQlEjSrv0iWw%&C&zYFkw|9#b zIcZ$;6{|$osm5WrQ9%*MV%rt$r*QjN$FUAW8%a+$lb=F=?_=@7)Q^(;AAj#-@gaDJ z?c?uzEdINWW6NaA(1qUyg-`s~j`QE&6868)aRw)s-NcqDmqyw9#$6g4);bO^&*`wj zEwWr&T&~~kGe#m_tjj$a<%XGFW9L(Yb#`1G?L_@x)Yj1++v5M`9mFW^AVzTqiEGwD z;u;;K%e3xQ=n!c=rj@X3s}-Yqb7p4e$)hu;9ZF|8XGY2L8eW<-S0{p~lU(TAHCEy9W4S^5_=nojIeCz(10AuCKVH5~8K0Z~T`#g_vV`sC4GW+6ue~V# z7BXAN!k>7Sdh|av{PZuJH)_k2%k%Ah;Nl$+R*HB*SJzgYqp7#>vaW^~Zmnu~IT9U8 zE)yMz)7&$7JUWF3xE{{5ihUe!BR$_|lvU z^J@yy^G-TGiqfCz*kDikQ)f3QHhFV{$=^1(qSWLaWhWJH{O;uKWz(;#Nn-N$VmWDC zoK@jS*Viu6CvPu#Wu+W)iHT)jwi7bGrm%Dj#d1%whsC<}NYAtPeh|$mJ9$T`^cnVr zJ;|^Y%d}XXK7%24?;61p=`(&|`n`e_i>J@vTzH>ivGf@q{-v0n_txHzOT+TnmFDUUxktrNB*@? zV&X-O3cec@7mNL$$`i%nW&5Y;A1l_f*gduaoR>;l78`wpZBLf7_{8daEmp}Et0z`U zKK`!aU+3AlV9Be@<9VCWFAqJ)d2i0$#;>&BWx^0te#V)*x(u#$H9hSe4Xeox_t7=$ z)AL>-)A+aMIlIztcozJw#EcGf%M#Wt-<$SFk8f-q+(BYCC0>q-?fdwY7CE~nytA2E zNAWaOEkErYM!}I?3#XmYvUrORFB=d)p7u^sf1;aDd#m1SS8dN_l8G%Y&geShnhAUM z?CGrO_U6eeDbr(9by0Z!T$3DI>P?*gZ<|R`_B*9 z5&p-|4-Wb3_@YPu<4>~xCV(Bx_77tF2eJKw*#E{LwtsxtKfdfAU-uth_8(vNA7Az# zU;gJW680Zo_a9&PA7A$$U-uth_a9&PA7A$$U-c%o{V&q(f0I+(5%#}G_t%@~`|qFI z>GJ;ZVgLBBe|)eV;s5vJW5vIYZ&U66hoXG@qjya=F1TKmz5nW+@XzoD_DED2_^Ouu z+phhmV*HQm_Fq{W_+Nm8{z)OG@zmZ??RIFLXrb5a-RiHY_5rj~^d0o9i2qoMo)p=q zwLBuS|5bZH)Evqe*_Y7F7WIQ}77d4Hh;pGk(M)KP=zb_(mWQEu`JRO0WmyKr%d!HB zmt_?cFUvbnyeuC=@v>}y;$`_7ikIbkC|;Idp?Fz#Lh-T`FJ8DTY0wo~sw&V3QC(<= z=tSrOQ5&zF=C$t7B;Ht_hz3AkYI{t88Xs=8tD*SIs24)L$W@7+g?fuVhT<*w4P^fn zS|$1evX79cqJMC;k3XmqW$-^i_OG>7qWVxgmy@A*Epiy#inqcR=uhRg zd2OfXO7h<;@pemtb}LuaYc-*GJ?cR5maY%&QLd@iT6nG<6!(pekbN#jm8iSddV6jl z6!)f~P%-7~UjyUXc+cfQasQhR6<2PS*XDX|J{0%Zg-{9Q7JF@(=T<`TzVHTAQn@u= zTkp9|P`poXfl4X2&1*Y7SCUKW@6}_|poDT&y;c)SwjWfD|36Da^`X+rHT7Bx&$WY& zR<0vdM!D`@>+QLLP<`cwLS>c9@!ELLhFjn~$DZWDBga$BGZ%5C%7PS2I(lMpUbE)A-vTve~tgp%zC%}}mBl&)M; zueI=8JLoy(Izp9{>+ZGQo*M|QP|m(@ys~mRUK{VZJm_cTrb7oPH_K~tJvSdJ$3M&_ zqJ_|b$}RTVGS97qDl7K}R7JTpUR&?EO;9!Ewm?;t+vc^Mo-4`!TDDOx4LV4K?9ZR2pz0kcdzyK+(76O<%UAlmCNzkc+cfQBb1vC)lhDh z*XDX|J~TxU>=RQDRj#SmT6nG(Hxs}il%Dn;AQErXb)_ZOf^qX>9pd*#r=Cz%k zE6LbbhW}tpL}}1b%2oARO(@xZPzB}cLq{vu)N3s~*A6;RxsFg><+^*Vx90{z)s-6x zWh$5Bweg;_V`YYN)1hOOo8`5+o|_LHsoX-So^p%5w#;)Y%~kFVsJ?P*ytdwRo1jL@ zZGnzeZkyM3dafj6OEcxtpyQOQ>b06svi+dbm9tU*c;%XUt%c{>L7kNA2sKcyyVrVq zZXncOxuH-)<#N0>-g9}-h00Bb8Ywr+YjZs}9~!0HLa4EFi@mnYb1R{nlzRheqTCv< zt@qp}=vL*nKuwj~=Cz%kD@h-{Q@J##nQ~RVRuf9LA9SyB^`R4#YwEQYo@)m^pj=1j zMCH1Bt+(fFjNGE!P^h_bIbIv@xjg7+<)%Yf%FXiHT+hvib}6?IYN6a>uPyW3N~k24 zD~ae0sHJjiytdwRo1n7FZGlcwZkyM3dafkTnXX(K)JnOkUaJWu+YhRtTz#mua!tL~ z!gKAQ!X+YrQ=;5NfR4P^gV^IbIv@xjd-3a?_!cm7C?Yxt^O3wNh>&)K2bXG2nzo#fy)oV4OWcxvV_~rbM zzo#nK)N3uEIA_Z?kl%!!{WRsed#$(UEHhZSq5SQjT#nbqL-G9bpyB)`qUroSUAb9a zn+wIc`Op}CIe+2r8Okm8+A=84t%N4P73!!exE%w?n&#i<$Q|=AuY~|K?ZN291uBq2rc&;6k#@uN?=v?Kxd#$(U z213UxHx%lrT#nbqdoB-ZsoZp^mvXbbHrI3Wp-##zgnBEt*lWu?w-V~A+#Aq&%B}I* zde3cwE>~^~)JM5(Ufbz8`-ra_luLv9Dp%EOHKAntLANMp9~IY6xu#xg;kkCu6Uudj z`YYGnYrQ=;5L%+#P-uX1IbIv@xjd*qx#`gP%FXiHT+hviURQ1*bb)eb06svi+col&f!~TvM;L z@LW6SQsp{AgO%&&c9N&`{;pcx}DsHbFC$+X7vx+%~W6^jygUqUa9g(x73=RrOj;DA|6H z?IRpNpyA3j^;!$hwSyi}t|K%;x$a);?YV)_lgbT+Mk<%%wegh+0*57kOARD(6(MV{Da^t*~>$xe=H_FX~rYbkbYx$mA0R61oB50a&OTAX$xmC~~ z%B_Z`E4R*T8$Gufs>OJhh_*sAl-uDo``qbd`$2V-s|?+sTn(>fcrFuaqFh7hU&>{9 zE!%S)pq9#Yfo@c;m)H7xZV1#yxslLJ<;Hm}*K<>#)0CSD-K5+cujPAg0n|~sMbOR4 zE%jP~=T<>yE4LcDMY(le+vvH?(7DQOg=Q(Y!)x}*x5@T{`YBf#x>dOvUd!-YCUl{4 z4WZkV%ko;b=Q==_DAxtLUAbOf>+iWC&$P0@)Y3v;RVOD>u$-xt^N>*%#F@{z3OB zH^*!Fo?8GdRc;YfcrFwAM!AO2zm?1KTDIppK))*21$scaUS8|(xgk(7&If2eXn}I$yq4>^ zDNq^ZWu7=k#JeLU_qg+GiQRT9{mhHI?P$T8KK#wWc%WM5THw0>_+(>AV za^t*~>$xdVTjgd#k1IFFYx$mA0CiGs5%h#|OTAX$xm8dv2%L=B;*mCN#4w&yxPw<_1gYRdKUT7Sq`=se}NLN6(|!)p<*geUtSG+epL(96oz@LGoFGNB2|HH2PKF3W4# zp6dWzr(754Rpoklt-t4nKr@sZ39V9YoY!(aHwC&yxtY*w%FXdwzULM|dz4!Qy{_C+ zuN8Q16?8D?!HH-!^oDZlytdJEo1t3DZH3-cZim+*9w*xm>Z)92=q=@Hcr62pbD7YE z$~A=E=C_LOtH-r$&vk$9Ozg2W~7T0n;HwBuY+)U_Q zV0u9Y}f7P?!x%FqYO)$m$|=Q5#xE7uVEP`NCxWqYmz^ssVWppTTZ_rt`s{+=5G zJ)zu4XsvSNyq4>^DbOhA8wq`;+&Hi0dTt7Is&X@-&y}0wwS3PlfI2C+2>L>~rCuxW+$w00 za;u?D%B}O-M$c`AMk%)y`ck$P0zI$XNXYgU_Fu2%dTt7|M!A{Lx5~}&TE6ENK%XnO2>MRB zrCuxW+$!iBKMO?43|3cp@x5I1E;og2wLb=M&56ac>T88H`q4LT# zgnm>m%WK)5>i|_$t_$>&a=pCP-*ZEtTFQ-tY>c7(yq4>^DbNwh&4hkdZjRUTJ+}a= zuiPT&7v+|Et-y1upa#mVhJICUo!2&cZZp(axvkJP<#u?@K3zK5|DdMIRfc|3u7=k# zJeLVISFR!SyK-4x%l2FcsI78cpg)xB<+c8v8v>o7+(>A$xe=xysFiYy@Zg z^IE>=7C^m~TLkS?ZmHJ_Jhuw!tK4d6mvZa8w$XE&p@GV6h5l4-hu5My-hR-9%2kGT zD_6s78J^38hAY<)+M`^S*Rnm=0lHkdE>OgX%lPND{+=5GU8CGcsF-r&yq4>^DbRG~ zWLDDkbMv_$6v1%cy1MRzjCXglFF^~+D6Z9h8|LGD^yCk9bSu$ z^!9@uSFSRYP_Bm8GCY?FJ*QklsI+ofUd#4e2k1rRx*clno*M$$9VD)Qp|Z-2 z^IERwra&JlHxnwS+#Ijvdu{==LAgaxdF7URt-y1upiRoHhSHQ<=e3QV+YJ4p+*YW9 zayz_c-$9Vvf1z#4RfZ}mSHo)=p38*FbN`0p2b8W{me;a9*8!@cTo&(MR9(4oUd#2|6o|tm+ifOPL%BI#%lF&@h}%o#7C|+YTk5p}&#i)*E4Lat zM7ecd+vvH?PT%8mZh&=y2uccrD*^3!uxCTLc}U+)}RMGaEYyCYp1bSY%kx-^`rSDnrL9SHo)=p38(jQ?4O& zymDDy%l2FcXtQ!%pa#nI@>+k-4S~K>ZY0!Dxp7|0_1qNb7v*L`jg*_?wS3Plfc{W! z5!6_@rCuxW+$w0Na;u>x%B}O-M$c`A_9(X%YO350uSNB|{h%tvY}}{}HB+vJ*D^ep z3Gt;ZcKm=&P%g`B*`DhF**7C6qAt*h%JuSEf6onp>MA!9YOdTkujP7f3e-fonNXH; zbG(-Cxdjkk*=XY*)IzzXUMuk2D#*V4oaYLu7=k#JeLXGs$4^;wQ^Zr%l2Fc$o}7m_JgvO>*clno*M!^t=vecjdJ6>mg~7G z(5uSLgicm&j@R-%w*XqL+#;y0a!b8d;JH=M2g!*iKXb>$jDrz)4_wQSFIfSM`S1v*W+US8|(xgk(zhLyq52|1yFzG7C~nyx72F|o?8XYRBkoYQMq+q+vvH?(0t{# zLT4(s!)wuT-hR+`%2kFsDOba58J^38wkp>UI!n1MuVs6#19W5w^*^Yya=pCP-*ZEt z6On=KpOLtGKejKIDu-!V(+l?TZ{^NVtNHz8AHNNEme~*OkG}Hy6}0I--)(2hWY2vmI-6G*Erxxyi>*Rf-?qpL}dDW}3e)`PioSZ_RwBLOc`uYwM9qLq5sqWbb*kpN!;} zKsP{{E^3G#jy6I$Xhuy@CX1S(S?Gyq8?-sv7R^FCq9>tt*4!HHiN4h~%I$-;r=xasJ_F@TucD49Uo;$@iJpaaLI5evI1leu3Kaeuvug z{*2o5Zb$8TX>C1kY1E##EZPk{7(E+37VVC*G0?kK9p%0=t=o9D|^l9{RbSXLxeGwgxzJg9bUqfyBchD=*HR$!|=jc@Q zD|9;gGdctP4gD9o8@&-N%P4R&S{0pz)6#P8x`lES?HZ;2Xr2KCVCgz8MXQL zKq*^f7ch`UF~?KKm5f99@F;M4v^+qR*qV(G}w=~ zN2{Yf(L>O&=%MIr^l)?udL+6Qt&46)>!H=la(#d{M;oF&(I)6v^aOM^nuRVwPeRwC z+30q(En1zy?-aB-+5xry`|OC0MbAQKqg~M@Xm@lidM>&h?TuD1&z(oKIXVFCi4H`^ zq8FjF(TmX~=%wgdbOgE`y$rSg+Zuy5N5`T)(Fy2S^h$I#dNsNPy#`&2UXN}^r=isu z>ux~p|3YS>J<(gxvFL5+Y;+E~1iceoi{_)-(Rpqs!3h>AXIUHb-ATd!j4RvFI!4Z1gpB3Hm0w7JUcZj=qOhXTbjewRdH% zMSG$jqhrxe(b?$d=o0ixbS?S~x*h!vtzMbe2hir|R@ea9i5HtK$oC@qHEEp z4b!6~P`zsfZO(zFEZP%IL&u`&=xp==bO~A&U5g%!ZbxgPwGZU}2-*rg4DE~7K_{U{ zqw~;X(B`XkYYf)Lwn+fzCsFq07-e=mxYux*NR!t<5>eg=i~u2x@oHhoY0v;pjYc6uKPE zK{udRpu5rWsNF4`gtkJjLi?h5=p^(ybRIetU5?H`H=sA7yV0A`+6Qw5g|U359R2Hk*ugziSyqqS>tMTE9OKSTSXo6t$<*XTU- zTXZ@4J-Pw?3EhqUg4X67?l-g*x*hF{?m{P_d(e4k@spVzEro7C%b>f_@@VZ^oFJjC z(8_3EvF9FwOmqX<8QqO`Lu+SnevY<6d!l{O^Uz6X zKXe{?KDrzogl<3wqr1^d(AtM_9)Y$(N1}bv(dZ=fa&#U#4qc8;L^q(h=x%f}TKjO$ z*wI$#6tpio9i4>!3!R7Fgf2&Cp&QWK(cS1=wDu942cWIcyV1Vrd~_1}Z*(5|Ai5lV z7~OzAhVDk6Kx^0G_>ZZF(L>Nl=%MI5 z^l)@JdL+65t&8qP>!GzXIsT)q(1vJVvMQi|$5yqqXaC{6|}%1JJ(cKy(s%5jqdO7+sEDif%wh zpu5q_(AxDm{-dqXv1ng(0y+u35}k)$jV?#8K{ue+qr1^*XzgP;{-dqXnP^}17IYGN z8#)i2gDyw!L^q)M=x+30wDxfv|It?H0<5S@fRiq1nHN0+0E(GBP`=x%fwTKjm8 z|7a`p1+*Rd3fc*M6SZqvyI#5oZP7Z)wd+iKoEFh;htfx)XOa|u(XZ9YMd`(2x4eDj zv~uO5L%nu{*N*pEW3RRLT3fH3<+W~J8|<~AUbF8iZ(qjFwWAg}us~`qF{Wm!k@bz;i8>9$2O^77DFhmsFmvzJ)3Tp00E%bNYN_3TyYAg+eWUyM;o%;4%wU z4=i{m3x(D$(?S`6IhC|fsKq}WL8xY6PD?Emn$s)`RSe8&goSDZLT6a0S|D_kg+iO9 zn1zlA%<1FdghGA%=~O~DStzuDFSSsptDI(`qE1>y9~sdZB33*-?^#YbgPm;U zFhZdgzRNa>E?Xj0zD0JNJn#$81 zYoVey?Fz16F0Nd}mM=UcZyri0)Ql@F6k4ylEEMYU<17@~!@8&PbPX(2q_)NRJ zg+gZlUvXg{Jh;DLp-}I>!$P6`;#*!jLjpoUSH6Of}!OW3T?I777FbGqb(HLYGT00vh!rT8M zLPZ{DljF%U3x%HURttsJZlr}mqd-Rsg}U3(sXSeA3x!S-Ke>=lXg_(zLZQ>dn^Or5 zvruU5I#?)lw5(&H&_&grL4-n^Wu1jWn`N3x(G1xAO^w)^4?hLcL(2g+gn0T`HmTQ+c|REEKxUa6q0p%EeLq5>!^W!?3N_}v77F#JNfrtnTY6e3)aja7DAWY$77C3| z-}WUG8Zch6P^by=EfiX&@fHd-!8sNRb-ISBEK{0=LQU{>pA;5+g@r;*aHoZ8akBY$ zFFzGtMO|T`P^ar=q0s5tajAsLS}3$xHt|AxaBq3uLZO~H$3me&EXP8j`(B+b6xw$6 zEEMX#2@8d8Cw_3N6!_778_HT?>WUsYEJs+R%$Rg~rS! z77F#JTPzehA`G`ss27}Wp->YXnaZ3Z3xy6q>w6LkUEDlnq0sm=(?X$>(V?k?PE93r zxP^+k6<9d*{CO^+&<6gD|m30-fY(6+n4 zLZRWXm4!krUfn{WwfnU@q0nY|+d`oQf6zjqYpH826xzW3Efm`CT39Hw2Ongi(7?L& zY(k;K#v2w2HRiu96zVEhTPW1xeJm8(gHKE)bfASoCs{vqBNRF!tg=w37tFU%sApbj zq0k=OE0sAlwNU5`qmqR}mn7eHB^27gFQ*c^+d`pEH^D-O1x}EASSZxujVu(}r7Bn` z)StfTLMYS(FQyWjXQ9wCjkQo{+nsHp(B5*qg+gONISYkGl`lIJ3iZqa3x!6yxfTj7 z(-;edcFryqD(XO;p0|W+tl(CwVDkv=;NP4@DD*nwixvuvaq}#6RG@c{{iml(&%4Fe zE400u+B`ztqmqR}o&UQ|gbocX^2-(~dQ;>S#}4)At8E^k_3C4xQ13a>LZPwtKnsOd z{)aOOh3=)TvQTL4=36K8`Efg9d?@lE& z!9t-iq=$tP``1uT`58YsS(?Uf(NqXKH)v-h4*c6*b=yl$K77F$0 z))opqU5$TQLK}EwDk1)5INS@4wos@Eid!huRrpWt@Q(0|g+e>$%@ztZ zCjVd`o>PZZ=2Rz@Iq|s%;bmH9p-^Kkwoqum;NvL5``sm}Jl!d&%;_)-g*x4?Y(k;o z@IwpL9?XU4-~1C@;fdel77ATB&ahDEuI^w9g~su=7786UYFjAOGq<-U6zZ9L)KRz> zJZhoPsKSRtg>S74N@ba{Efnf>H7yis%->oO3ia{T77De~LJNgPmFp}N8tl(c<>^kc zP^cFiY@tv){c;ka(8bML778u+0tZ>IDf4g}U!&ClCtlQqNi_bdq(Og+ja3C<}#-!Dm`1w03nZ6dF}ZSSZw=HZ&s? zIwCBwP-yLLu~2Bihg&Fgu5!ACLZix&sf76GmT)gv-;_{j=y}RQp#fv2g+fEmPz!|` z^Hd9k8uM@qh5FNmP-rupVWFa~Q_}M`MA)G& zU)tso8v8$QKq$1x&siw+bhle5G{{_Lq0nyF$wEcGKyi9-Nh;d(p>^7PJfWiAIGLVT zq8N7Q=z5>cBh+*3Gr@z~ySIfxE!@mPp*~pILZKaa%W)~p=@knV-3M>877A_e$u^JB zOE!Hi6zZtWEmUNuD3{M35pAwwp(2NqWa!6Z356E?H4BB_(tn?YLMH_FH4(u#NcB!7 z)XYMM2TtiLTd1h5#>Ym4221ujOWUS7{ap>ybjg^E7zwXA|28YxyBLn!q2 zzB?@x+RLx7P*F=$czd~9Do=Nug+lv5Sqp^@vzsyrg@%IXEfiY2ITi|?%jH-obn4jI zLZMAtFO@kZEEH;j&*~Bi^~q-~6k5C6EEGCqje$-C^SgaO=X!%SSYyvA5ADU z+$^zBsGV-HP-wx2TPSq6JKaK|u5zS>LJJ2M1bb+{=URsKAZP^g_gvQVhSpGYNigM~sn!Vn9EcFuMd3T>7{QwiDEss=~8 zH5LlJO!%0ELJK}El{sCQ$}+XFP-yf$#6qF|^!pKnLXG*Zg+gohu!TbRF0Qvw=xpl( z3xzset5ibOEfm^zzaCB~w03V>C^U#YXra(paE*mRP0&A;WolueP>UaAq0kV$^)N!A zuJVS3LgxklwovGxc(sK>XLEfl6l$jvEfiYt11%KlPd{W33N8353x%3szJ)@A{goC9 zjlR7s6dE&|S}3&Ol`ItM3x#%s zZ)y_?t=)?j3eCyB)FZfA##$(JL49^A%XGYjLL0bTDo^)iE#?$@fvCVjp-wl~LZNe& zF%}99(Opt`y80FhZI;p&3SB1Im;ME>@1CZSJ1B*JE?BvULD>W~916k6og77F%%3x$q5+YTfY8kXL%P@TZGddNbdCb%}0 zryF3Q!0V8qMXr^~6a8_(KRi)kAAHY3p$+ngg+ePo#X_Om{R2~Zy4Dsds>?Fggbqe~ zD*w}x99i@*mVCYNd7Hkd=TFa@Qye?g(Z}07Libe8u~2AE4J{PfLTMHXZK1C#rLasZ zQVHE@q0lm2VWH4&+|5FvgYE7Y+z3DiR7U@|_k6E%Fr>3bjzTR6@sDD0Kc+HkCPTs=%B= z2k+-C6l#Jw77AU`P(COA~77De~s8r^3 zriDVArLKiSEndPxp(fa1J3{DCW#70R9OG`WP-r|EZlTa2{d5b3n&8M(LVV9!cuwof zrLf>nStzud&$LkJF2PU>h3@vAYN1fiJlsN|7XPy>q0oYVWT8;^eZoSa)N{qK+zshmC2egf6sD=-R%Gg+e>RAr=a? z`0u3&h1TxfR6-A1D0C>h-a?@kzraGFp4rMmp$%N!LZPnmYl2XykH2l9&|v?dg+j}8 zjfIN3wkhl?{ZpA!3kwx_zoA^dU0H8F$U>oAYHO(!mgx-(g-&SyZJ|($Uu~gKFX&^T z&}KQ&LZQ382U;l91V5A{6dHY3Stzti&9_i!m%1{QP%jIGcB!To3LQBsStvAMd{-ic zIlXM5P#?cLl{rnYP-x8TVWChjXk?+#E>*!oMeQxgcaMj9_bR)r4UJ6mEfhMTz0yLV zr|V^*&^cIB3kA2og^FzJ@Ec&?v0Gq8H=f=Y9@-73+dM+6d{HX*+D^7mX#A*Uq0qMa zgCR1wufAuYQ1^PoLPfXG_5b)prSq|)?=CI6rzaC<6y1QyL}t;WZ!%F@Uk`js0bc@q z&AZp_+0%R4m-cnwTo*-Kd3CgkzJ}e-#1ec_cNC2fHG*nqTdg&;O}Q@6VXF0oep77( zR7bUm(C@0<1Rbr~U0!<v<;#5~3r5S-EFGXUIL*-GR_bxg(%X zawobw1$s^HEU1gzd)$2ldPnY3=xn*KxceToPVT2r54l_1{R7${wOrBfpM9U3mTBnQrTT04Z6lY0m>N^YjRb`(B9ZW|~^ZYOu` zKweGmh0qmpFLT$<1!~Ei291|{ySsKeakSjWphdRdNT_yK(ckQI6iQFAf zp4`%$4aI9@=S5j^4~4FiTi;zfwQ3``9W+&L7kBOK>=d~}pc!(|Q4KaOe)X$GdCi z%VXu93f(35Yn&~tKMcGoTlpOd=*Dv_P`-8i7qhPz-1f$1Cau0;!k>)UHy=uon@mgjTw&}XWRg5oLc*j9?$Qi*6Pv`Ox5?%oTPllv(2wOkwj<7r=oD$9Kz`d02|?%D`i zP40H+d$|dgEuPj!ty*$xLqEx_=k5v65pvr?zsT+E?s?ELatA}d$<1;1D(E=5wr^~g zJI7t?x6R~QFWe>fd3RrjTFCtn+9P+9yFWo~b1yx1!wJ+`Sj-CHGPOR+js$yRSn1<-X6~ zDsn$__j_od-0l3WCO5&|+2odiE|FUssv);h<=*M;0_YLBi=h+cu5kA) z=t;TjpcZn!cJ~)(soXtKE4gXBjuNlY!O(KKb)YtK8@hWE^s?LzP&>KjxO+bIy4+#V zsdC4=dmXe|?#FUg)sBPWwakLP(G;gZJ>_!3k$zjpT*sEph_&|tY~yuz8>GEfD%bs+m}xkS{^-IJgL<#vFE$vwy2 z^P%c;he0Fdj(7JuC`0be&}g~&?kHx!jlBT@Bej%$9-1$^F*d-=Icvi&u`K ziE`7Sc#Ud8&Ey^p<;rd1ZZ>q1+>X#>xjo$-1lc%|h(-w*$0HZg=P@x#zn(3@VU24q77jI(Kh|UX^HW4+0K9Sqj-Ls%{xxJx{atFIR8mb~U7y3f(40mTkHRRq0P1WB0xVy`t z!{xpPeWhtXboUGBXt_T^o8|6uw+wI2JXUTMXp7v#pm>drg&NCk4*e+i6nDEq&E@um z;`7~0+`SxXC3iCPv!=b#-8-Omavy-U$zAO33s6V7Z$f{_UFYsski8Wl5&aD9l)J~> z^1S2rT)EYt-E!+d@ftON`p9hw6+7AH(!t&C&_KBZpptTjxjPOTEcaUIMs04Br zZbx^|g>H~L5IRuqNOvbfH_4p>9VGWwckhAh%_E8E5vaP{W$wNL<;#5!Iz;Y9cegdGDMZZ5Q3?sVuL zZKK)l-UrzkXChhz)zh@g-F*#uRqhASadN+K_ebb$xjUhTa?9`^4DlLOf!4^)fSSlX z*4^gN$8y_4C&=yUZeQp#xferOaxZsxGW3nye?ce7y~EuHpdaKu31!QD!QD5ZU*)ca z9#Ct1P)E5d-F*kDCHG_KEV-NA-3HkeKq4x} z-N&wSD?;%a)qswXdlb}NZew>_L&wWK13Fjkx$X{xn#dgi^_Dx)-6>E@xwD|Ya_@2X z5$I&OOQ9##8n3wf9(1bQPoV*tc8j}zK%L~4tj*XYw=xv3Q7x#e+)U^qxy{@?8R{js z6LhiM-tJxm^_6=WbgA52cc()a%Do*LA@@Fa7ePbiJ_lVU_ceDvfJVsu92z6{M|XEZ zm&+}ED0c$oR)OL*%77-xtq)C*+uYsu(A9FgKv&A`>+Z$S6uDz8CwH>D|AKCiI~RIR zTj2qBpM-9aTL4|7Y2S2rEi_l|m(cZce|C2_WY>g=s9Z)AO_N&F#OJ!*b7t;_K-F?p_K#A$Ke^Q`27S?oH4Vx$~e~@d!`nv1lWpsEhPyqW zT)7uOziQeM?oNR0o=zgV-fD7ZxqCM>UGBrs4!KL+eHof5_g&~uxu3fG9dw)A-=V0j zJx9r-3fHI-bcftSpb~O3-E9iZm)izP$nE5AFX#ce7eeu!w#(eT5_&}LG^nhmz1`jU z(35f>gVN+a=k6+KsoXVCy4=s*{Q-JG?hfbxxuuUTT%!Y_SL7ZFRh3)c-4mfV<+g(k zmfOYMKG3^zhd?#uj&b*D$nKaWq8p&va_74HZ)l_3C!oXR7P$Kc^rhU7pgMBDbayNC zt=vB$`?d{^J#`E39UcN5qgo~u?>$YSt(u|@bgbM??)Ea0dm+?7?q%*?3GI?Q4Qed+ zc6aAPCAedjh#rHQ$$ie6zkvCP6HtpHWj6xE^Da*uMi z5mZ%fE9hjoXSmw~Iz;XTPLT}2 zcgI5Q{HocLQYiv=h;{(0IAOyIbN| zdaT@ZXp-DRpm@%8p$FwQfv%F<#@#ca$L02f2DP#0xX|5E(9?1!L3x^Xn!C3_%jMn+ zT_^W3cb|pqU$YX?tI$-rYux<|dQI;4&OmjKJpsB= z)3$TBGqhgrdC<*rhq#*qZIpWzWM7BGsO;_>=o`8BL$l>R;qLR$4{~3J;#Vm?a(5H- zv)rGc_?3n~-7R}O_pjtuh3?Rt4~OD4Iu44sH=l^Ipu6Or>TWlvq}+bcJ#vS-dj(WZ zZXOiBN-@*jJD~&QE`aXSv`@La0y;?UThIe?*Sq^QR7>tJ&_i;g28GL<2Gx;!F!YGr zBi(HX)s=e^G)m_*r@MO&)Ijd}&>~Gc+}-hzy^@lMu7jSGdyBjIP)oTBq4-sbCGNfi zwUN6TdRo(NaQ9p2G`YV)OXZemShz;%kiA-yh-yO5$*t>d6X({RE0%rTEs}-=H7m7H`VCR5Wcm6pv;#pj zrv2XC?ND{OrJ5DKT5tdquTgEtUL8$D$3Vr~8J*y6Tj(gcXF>Ljeu?NjcLziEdTJsX z4V965mAf;bMsjCE<>lV*?&FZX0-K1ILlxz|?(T^ec#RH&PM3Qu)JM~1xqAxKNp4rDil*)7?j_JUaxaIf$<1^3MyQwEJD?hJ7r46^ z8X)%tsFvKf++7FRE6IuID=0(mFYfMvhRQ8}BJYHedoUEQQ61k*2K)#cOmlbf?_LQ2g3Sw!0mn`Et*N4%gNDAa_SX56Ybg#jlP`b@x{2 zF}e3ZP4&Ewy1NW|Qtm6ziE`g}cO&$y+$~TGx!c_>mBlr-+{#cZxwWBqjgEm{mfH+! zBe$))XF+eu?G3e)JJ{XP(ED<8p;P6~aCbJeR_=Y!>2e=;cR93C?rYGQazAwU3uu$v zAEC~2cez`p1!IZaDo{7Mhe7cg9Sd!h+Z;Ma?kVneh3rEu5>a0$er4qncQ1$jlsg&f zscCO?_YSD!fi~>}P<*w$*xeT(d&ff}dJ~FY;aKPHS5PInKSSqf&U@S~-;#Y=ZZ#-= z{i6;PuTcZ2rrefLKTX@g-R{ugatA=?%N^$KIOr(3*FuBj-t6vOki8Eh5j_MAmivsm zE1@QG-+?ZX`-!`op%dk9gNDg1ep2BwSA<&2tpUYXvq!tz7-}cCH8fJwc69e#=nT07 zA^ZAQjy>*9ggVQe0$ncmR(J1#&XxNJ^qfY~W$wNLohSD_D1I$rqq|$63*`O*jnkY< zwJKbr%FxAfYe5s`9^-B^Xt>;ypQb#gy|rpx`p-5;SDa(6=UYYAmq7p_qi=oYyd(7!b8vFg}{TX^n z?r!LIOf6u%D9-Q5AuYjQ7z=4#I4+`SfhNA69~ zJh^wd`w+B7?$c2G8pcX@-+?}s`!N*1hOyb*ZP4d(i*cdeME`sXHeGYm;bGBDs;yK&vA;-(L zS16v6`=h%%p(b)mbC$Y9ZWSn=HUnxQw?6c&T)UqdyLPX$ja<81_`KY{?p_R?Dt8RD zLhfXD{{?lDI~R&y|FC-k@to~CysKQh_KjcRc+=grP*1sELN95~KfAjd>Myq(PW<|Z zoj1mFwlld4<=WZP9(rgZYU%E2(8Y4khF;}25e;znQfP$SvC!*sZA^>jY~#oka%~@a zOYTGNJ`GKf`=U84VGdK5fr~# z(AwQIpgD4TK<{hL1Kk|~-7R+l^r74-?#_b#{r_-xCtx?#jo$dT=q6-{NGK7_88T)F z5h3#|B4aXTjHq2Gp+qVTN~MGdDWwuoN<@lMN~OV6BBB)UXZ;rII@fbf$9d27zUM#O z*VFU)-s`)6>)!jm_ugyXLi@DzMQG_ey45 zV|y@6%O}N;<6P;DFya#F$IwLT%c_~jAQB#VZjTx!ylD3@` zed?ZTDWcnjcAyl`Z;X^LOq(pl^P4Ue4I^et1w#93(!L{=3hhTyq0oMrv_DCghW0n9 zNN7{no|tn^seEY9lFkin$)qhSRSs=+sd#7`ByDTys?gpjl?-kFq`gh57utKI3qw0q ziXY|k(j{Tq%ToL(-Get4Tcv@a9V5l(rAC%YM&Xz8>l*mZEnzZjo zw}B{hPzf9Vnq`O1=n^ZltsfH)+b53buXwQ;rhPGtVmX)G&X){vQrK>~RK#G66 zZKZ3%wC+;;JGe!9EQ}Z>T^ri*Qaoas)F@1QPKrk?l%5SE-jbSxc8wH|*eW#-({@Vn zh=bDXFd|bUTQQ-{CB^O8Qgp6wMyiz5HndkH?N!o}&^DCfqpEF_wwv^JXa`6g!q`zs zd#|)Av=2$0Li>yq-_ylXmoROG6yKM1(z-BWixj=n+rN>t`=w2xJu3AKZI0_sj4dc_ z32h0fcWBEbZ8hn;(AJmwhPIUy-0HD329tt%Oq_zsYGb&OA|udDrvh&7lyX46h9+IB<X7|OdsLbj+UzZ?PlmAt zrT7t*kfJLbGE$|bWudK>wDqM2L)%hX5!x@CsxapbNxM~gCbT=GpTgLKNt>yqzjR8Xs=4z zhSGx2wvpC_wp-E;kfJL(GEyU@_=wKEN&AqrB(zUU8^YN6NxM{98rt`yXuUrp^-0oh zlimvLZfSF94<~JwR*qVRHjlI=v_+-(5nUv`AKD7i*3i~Y+Q!m{p=~ckTNxRto=H1M zS{K?or1(hE#H5`jeH_}E(syC(!lZpm`aHBBNI!&jbJBh%eHq$cq+Q`}bR=oBwsr(C zwE3hRVQeueengi_--ouc6m1V#_9SgH>BrD^lzs_q@1z|n?FsE&(!S76O4`SzUqd@f zIuP2$NxNM7EwpQ;>|q^lOVa)zMW2A~OrmI77<)8nv$wGiCA0;k_~=LpDSkwyrDLJ3 zDn;AW&dE>OmQv<|(X`IepJC2@lXkciT>+Gl8Y}%B+9^rwD6}=C)56$>N!vy` zC$wFqoS_|%v?HYwp&cg`3BTuulJ;q-RA}c(xx?6{N&B93X=pb}XM}cJ((aZ@hxU+k zW@xjtJMoC}NaaFXL^><97bR^4sbXkrNrgk(IBDBU)k51tIw!P)lJ*X%W@sl!=Y@7! z($19Xgm!^+erVrH+7G0AKLKE5+BWT$;3% zrRe&vj8q-zvM{z;(sq>EhV~{YzB*)R(%vO?2<`n+nK1V8q@5*o4DHL(6`@_8v}>iV zq5WK{7}_6_cAwNEw0}!gLYuwAiAPjG>J!@HQnk>QPTHzc-_X{Rt_p3-r0p!-652je zm+-tAp0s17=z6z|)MTl482e<>&XGoj_Eo8FXjdlfdg+ePeks)t?T(~9AVt^DWjLf@ zZ7H;;OYv*JkaSOIOG=GHTP|s9NaI7>Kx!7+Hc8u6x<9o2rIw)`nY81i>|XR4si{(% z&_12C^Q2s%eO-!=2fUZG8>KTt`?VBbm#{l&4@qZ*Hgm@l*CphU;zv|OIyN%4O9_DS1ADiPX&Qu}b9??~DS(uJXYM2hxTWu#^%?E>lI(7q{k4($g? zyGbe&+Ha+2SR%&X)|}RXD76|r3XV>M2hd#h0^%YmY3qQ%WEa=bS`L5Qctk;IMi@~-dLguBlD3-kOla#%b3@xIX}d@-gto6VKeQvH_@|AN7KUjL zN%2p6TAC9^%##*}c4^YSCoKr=MrlcCwBg#s2Q^T}jQaoa`lr@Z)BxMWj6H+{4zLX2}19i*b6?J1od z+QCVimd*?9M5$xV=#f8~w9iQ;Lc37PT03f&CG8sN!q9G(iq?zT?Mb^=x+Jtmq++3s zKAbxKZA2eXTsE}PKM`Caw3j7q6{&n^>q@0U+dOGINfkreTe>K;!;*HiR4ufVr1;9t zCzAFBsa9wgOYs>7E0T7dR5!F+q)Wq`e@xo_(lwzyDn-Z4GEzBiI`N1KN)1C>LMj*9 zGD%xaY7*M|QiagAlH%t}PpNX4Hdu;(Lusi+7%@?bj?4MWB<*uj+t4nQYJ_%K(yoy@ zgm$x3E415_cCXYav`3^mq0QF&#Lvwybq#GXDLM+6k-98tt4KXVTUTlj+U7~yNs2z7 zG$Ykpx-PWCl6JH-AheUDrlEZzXgZ(%voI7uqRO_s~9- zv~#5gLc2uj71~uvyFq#=v|FW{L%TC+4@wV*Hd7yGc7-;V6hES~rN={CO1dSqS0wFK z(o>;rD194V(`}Qsn=~`D1Ej%W?5L!@S9&3|4@tv9`%Kc#m*$0bsWc+AtCRK4IJ8;&`CEoIzZ5^B zV$#OYUMfusZIz_0D{T&KGwJcrc1qgb(ifo}Dn-Z8Gg70Ic9QgUXdjoJ4($s`yIA@z zw9BQLpTcn+#{Xv=)+Wkp;RN58V?EO!ycNUc5M^r-EAKKDVbUfb~DM?#DN}+8j z%?oXpr0pvm3+-@eL1^zz+9}ehr$qC6QhGVGbCY(7lryv|rReMdXQU+UR_Tn;?vP#& z?ZKqYG{CYkw5LmNhW2bJenh3D^FmurdONgNC2d2gRA}2s?}WBn(hiU=5A8@PUi#ge zv=2!YL;JM!ZWud1X_rdXL;IfeerP{Q+HF$Z(C(H#4DI2h&03?NDiQXz!A?hjvoZJ}x~R+F4S(rL;I{mrGBDcCGYd7`r8De~@N|cAvB}v`3RR zyA9&Gp)DZo32g}}enh3E#i6Y##pm_aPuiB!>!Ix|?G0o5Chc%(WoXAr`$Ib=X`htd z5A7W3U}%>l?Mi8VXxB@%YDIsetx3B>`Yf~uq{Crsrokuf^Xbyo&=!)8gtk=DmXo%J zwuW>xv<;KCjkG(oU8Q>A=MG5PkPIJEPmETLVRwC_o&%+ZLA zQr6IJOWNJiX`wwNWe;tZAtxSD9w~Qdi%8MgL>Z}zlD2}BKeV-^JfUqY#p`RGrF>yp zUn%~p4ws6A5o4tSp`DVnPf8_2J4Y%M+9gT5Qo1;_>!l*0-I}yJq;jD>Ae|f9OhZrn z+|#8>p)Dj84{fQWEhp6qZ4IepXd6oL<7g*E=S;b}Rf-?SK&gHhal3R$XeUVVi0M*% z{@NTV9`UNwD2#YVx;%_npR`{}twZ~hR5r8+k~THW8d+#_O3_(c8L2{2Jm->9x6qcA zDuuR2(l(HKg|@YHWoWx5ZGWkMXm69Mhjv`jPL+m+c7_z4BbJexC&iEQZRzSTZLJjF zm(Qh9VZ^u6HKF|_Y5$b&32o+Eo!b-IJW@Qih;(0QOG=GGTP|s9NDqcKi>LEJ|JCu| ziLdtBXnOQt^mTaw+nbEOk8JcW{id@_Jbvqa(s=(>NY%?5O+E1y%`+O?lFO1NQ_nu# zhh00U#gG95`VSo3y_derz=K-{kZesobd?dBYvaCZ(QYG=~|C z?&i}h$!A!aGufEW)5=(CHpg);qsRRsCvgGia1meR%UsAMT+7$_F_&^PmvJAL^LMUb zw7=n97O)nxnuYm3i*YTh@*~#ddPdukpRhAGu{)jPknYVdIF?&Eo?meizvUcm=S%#a z(K_=EuIDa(%H7;T=SQRua3BBRejerTjMjP%^Bn%c68xJrc#Kyw)jXB1&n)c94ECaP zEYf|MgVECUbl%5YoWe6WkIukIFXEY8!b050!i<(BMHnqLoS%_C#NzymC78)G{sKnt znHMv94|DcLx*9KI^sZHw(YwPH?85Tw!OFaoSMqLF2 z*5pyvVrK8(b$Je*pOmh`2CTt`yqZmT zBb##+oxPO4i>-JM+wmE8;4EIx7ulJsc_Y`dD?esW?%_?`$KH(owUvI%o83}~1$YY! za|kPP7_0JD*5pWb;O*?pJJ_A0ndVrIrL(Bg<2jzsaU$pNKEA}sT*C*so>TcLr*SVI z;{iU-=-+C1iurR`uCWlG;W>Ps)j6AOIhP&zB5&jZj^ZNT#g};xm+%?B&RJZ_7rBh9 zxtwdcg3;%;zso&b&3$~IzjH0~=JYya0j_6Ze!_~}#H!rPn*4$t==`vBXMV-*{FZ5M z=U9Hv@pSfB`Z@069PVcH>CSt(hWogl`}rw<=UyJ>0sg^1_&1}^1wO_?Ottj;V-|+b z-enEnXXVw*!A^93TDmK9G5XBfGdP<0IgV%YJ{IB&EX;W` zyoiT*G5_M_ESSsdj73ga4s8h z0k7jLY{m_2!A)$*FW8m`*`9y01CQ|ro|D__j8*6iymSqA=heK4op>|5vJZRF`FZKl z9LRAT#QQjmFK{^LaRe9fc1E8YmgYv@$ut@8+|dz?po2FK{mBZ~^D?6~4p`T*ysa#4q?N5Arqs z$=7*|Z}Ds^s&DgLF6a4N#jEHH#B?35=C%Bg-MEf7@gw%*M&8R$c|SMtL2luEe#w`) zm9Oy|e!}ngIkz+VjEkRmm^=A5ckz@n9F=2H{>tLq#|wCnwRwp3c$kg&7klz3`|ucV zVdhqrcRZDonZbvdoeP8%{XZ#k4das)G-X}QJ>j$#hp$x%=%BT1?XE3@dWG1)qd4A7X+{wAjVtaNTPvd;%;v!ze#f-LhU*Q#e zosIbhTkuUrXRpdXf~>;AY{{Z*$8*?;#W|ek z^LCcxXkNr8c?qB8rF?;9xRT}gKCj?9R^kp;;m^F1`&omh7qb4yGgylSS(oKlkCj-T z)!2w_*qGO|3A?ZbN3s>~WNY5d_I#Sx^LaX7IX#zM_#V6RLw4f^_Tp|jn>qa}Z{|Vv zXC5cq-NG|DkZ04m&glxgl~-~&ui_}S=N-I(X?Ein-od*$hWGGZPT)-5$JxA}^Erhd za4J9IL;Qq~@)tUrI{h1;;9<^SzQWcYc^02#QO;sz&SrJaVQtQ5M=s!vT*#h$g?DiY z@8N5l$TvBQ%lIPS=0dLITE5GV`5rfO4fk;^f9E~ z8875kUdm`s;^q8{rJ3m*uQL{51)j%>EX6BXi`94ytFs|%u?Mf_&8))#tj`H-zz5in z53vasuo+)rb1r3TZem-0!FJrnj{K81@EDy{pU!fw*BQ@c51!ASyofim4*T+2_G4oX zd@N?eFuQ;CH@qYfz2Y5;`%Qt4_LoCim zcmb#JQa-_Ye3Fg$6r1r`_Th89h0k*+T@jF;%oq7E=kaka$?|B_}vN3;Q zbDnm-?KS3NE9PT6Ud|4@g4eS$JF^9EWLvuSBi)fbc`I+?DE8)E?8oVJWk~uN-ojZN z!gn}~t9dKeawLD^?cBpVxR0Zmv!v}d=H=Zi!0{~0iLA)`Se296nh&xAr?NAr@isoj zG#}?!KE)Y)n$PhW&f)WXmoIP)XLCL0aTj0WUM}DPE@tjhw%eGWOIV0+usq*l6)s~9 zzQcB0#ZG*eUHJiT=Z754wH(I{e3q_^Nx#5PIFFz4eQx18e!-3Wnm_X!?&r5W#2~+Rm?9Y63-BS8;4&fCX%E}zU797d8 z9L0{jlecm-M{x}A;y6y{cs@hdKBZ@I65ruuuI3c3<-`1mu8d0W;iKHg>CAbF*BSG2 z1`BW|%kp_v?LK;Q8Fe3wi40USG`4OPHIbc`?hfG|RC( zE3yeIvn8vr9jkLNui|jlq-}nY|m9;!$J}%=~e1}(X6)W>yR_6z7 z%MaO+Yk4C#a1=N4E`Gv$_!*z!7S7@qe34&sHNW9ne#?*P+Qal7{=|LU!QZ)udCOUz zu>kk7Fn?o39%NPi&YJv_9rzbJ^KW)%rVie3n3-dlh2xox&(YP5={d~7mzbMtn3wB$ z20x{1AJcnz77wrx|6oz(zrub<7Gg1;!}D2%rC5U(@M>PdPP~j=c{zKr97nS}$FTzM zV->zYS68Ozu^Jb#CfBhxH}YzJM%P}Z_w!mFVgvrg#w=Lg@{C2;jOVcxtFaAhu`RFR z_3XkGm*Yq3wgqyjEUve|Q;TJr@txQ$2y~b1dEsJqGOY(bOOjpRJ>v9(xa5tN9 zFMD$z`*S}B^LI|-VNT^Ae3XB4F^}`aj9Iva8T^`Axt%$9l&3RuWy?2a;~6Z$ z{JfB7@-n(YH(j5Fc^!+eIg7C`i*q1La2PM(6kfzfcrl;g+st z4P44De496N6?P}=duLfV@ZC zm^U)tRrW*jEOuv6-o(nhnbp~cwK;$t=}P(ZjU2?D9LBpiocC}9C-QdAVwx}VPA=qF zuH`-anB%ya6S+)%K=CkZhSL~;I^97FO z9FFH)PU1_P!-af_i@2Dtay?(;r+l4T_!bZFZT`XKJjzupRLg!yp2O8F!4Fx3>v%Ok zVtsC8SANP~+{C`z!g2hP_i-zu&(QjY^Y|SXaXXjrCvN0Ue#Twg%3pYhzw$5cW2V|( zXDq@)JdcN2ihr>dkMbHGV?$={WPOOI@@D$Pg7g4p=LF{D13aA%F)tU;=NY75VSX;< zS=_|4`2`De8-3bA`cIz6V=T@rS9_iDTwciYc@Zz-Wvs)}yq0Ac{cBj|c@rzLA1iSX ztMYzU=Yy=lX{^ncS%#i8uO$?V66*`JSd5MQOwb4b6zpR!qGWsOH>5M)t?kPUX8GMp6 z`8uEHGS1>k&gIvf$L*ZY=rfiUG5QRkR~UVQ%@UU2YrK$e@@g()^cg2UlOlZ`SF#V^ zWAxbx?{gwQ;AF1ji(Joz+`w1)DL>|BZsuoQPc~*VvkGz8US(#@tI-|c3+p;h_vIuWvG2Y1%e1awUG)wV$Ud$D|l<)B}e#o-? zkymgx%kx)OW{ztu&zOf*c_y!78P;M2*5;MGhOJni?RhP4;B_3qCcJ}9IfgCyEZcAy z+i@k^^L=*Wc6R0tcHz(L&TI|5zIZx&@eKCiW$edt?9WOZ#O55rHXO?9IfBDDk|Q~a zck)g?!O?u0WB5GBaRtZoJx<_Mv1hzq%ZFY^^H=2E`KEqsFq_!j@*G9IN*NJ$rJWI4uj_%2KE z1J>Y&yqarSpBvbf8`+DWurEL3IBwy6{DM>XH5c+*uH|-q%69J-&vK1S(AUTF8^jXraF5*@f40>X5P!JoXOKTo7p*^x%dI|@FV8sCp?qC zupocqSv<@l%-7iZBG2NvEXoqB%#y6mQmoC3*^!s>Mqb9AEX%ui1@B>bPGn`y;+1@n zRk@H?aV=}{W7g(oUc-H?&)<11kMKGcXyWz7!feW7Y{{x@&6;e(y6nKt?8xry#NND- zW7&=4*`1Sk6X)<|zQjIU%mG}_f&7$%xP`-bfW!F*NAM_bXQ8GkKiu<=cd`V>vIg(r z)f~tAoXD=cpS?JVefc2A@gd&FhdG6haUP%GB2MQLKFy7MmY;DZxAFxZ;vD|Pxy;ne z`XY;PAd=W{zR;!mu@oxGO2*qFcYCjQEP+{ZyY$oqMS z5Aral@h`s2qkN6W_!cvFvHaqx{E8X;j@kJ)bMllH))$$Td0CwKcmea%IryowSdVA3 z5eu^!&t)H;$6HvOLs^QGc_AO>MRZPi>N38{(tLwuxSZwrB`fk9R^kt=%2Z41i#(Mz zn4Ps*l6817>#{VjWdk;36E>oAic?M5pUpX#EjXNQIF&v}Dg7wh^GSB%>+H;B?824o z&ac^%&S6dU;tuv<=2n(x%*OsaorCBc(9{rK#-S|75xkBg*_@-;hIeuxM{^j*a3sg^ z5sv2*oWQ3!iEnZ;S8xj7C9+tdBz-^LFeG5X3{xxspsijxzsFH z;9NH4JhtL|I(IF#h(oxTBlrrPQBamn2R6NIZLTcbdFK#Gdi~@^*JkZD_ihuI_D>~jUBn2xAF&$;*WF=PHGpY za}S^4&z!}5bPh}EH?HOZuH|9=#6P)*N4Ss2=-iJ~rW@@~;wf~FM=FD5nT^iHNS(&2 zJe{qXo6eC)$-h~bN7;a`2>wsTHMOr6I`NX}nb+Ob!p3=qk8nbdSts|vg;{{yGOZf)N@@+Qa z3O3_AY|Zz03*V<@e(D3>#&xu8POazT+(66V)Tgw}Ont`9+`=#U1;63fJi>2j8Ijsf z%ZAkVEXEzI%3buHo!U+B)v3Mg%zf<6{q!E1`kiC>2fa6?j_^7DMejkL5SA}Ih2ASt znYo@>xr?XKYdDpiUc0GW%-z-cBQIt?mS%pI=UHsRv)Ph`={cD?m$$MwALRM;H%*n~ zbY4Wi`_v_TixI8}yUu^hkS75s^n=su^aFe|TQPS)TBtV#1o)nZxJWh2&OGuCHo znwGwWjX9J}cpF>rVYcGqblda{w&xqXp3B*h@3ITOVORdZZrsIQJgvLe7td#3Uc`R9 zoCA3+2eUDUumy*+AKjPqAdcj%O!GnB#c3SP>AZ)p@m{{g@qCB(^D92U?>L!1@gbhl z!|RJ#IgL5_1TWxItj(uckI%3XpJz|b=3Si2d-x(JaslV^WxmH(_#t2A1}^1pzR6$t z77ua-^YpYFYPoVyqTWQ+WdfZ_z~;!6M9ake_=!Z#zs8M zrp(vd@{4EDb3I*@ZCIJ@Se@-zo1NH^op~d>uqV6oF81U-?8S-f!&&s&Nxw*+{Fz=z zuc7o>4&lcf%FP_XeH_W(If_SkCkx!{^~J&*!(trAsvOUnoWQ!A#Lk?|?wrEje3)bD zwVEE!M>&bpIfqa2CHmyi^kUBBdOpujIg493mj^hHe{epJauEylvHapWe1#?WI&1I^ zUd=aIpUc^m-W$@rxRQOjn&bEZ@8cRy;YXau4P3;JxrCdzk)QE1e$K7j%0u+IsOi7B zjhXsdj4nFlz4hdF_N@&O*%+$mB3ca_b zmokH!n2lfXG;ZVR{FAwPjCq))pXC_OWdWYgg1m@@S%*b=EzepgLo0| z=OuiQmvS1*@MV_cYrKMQu@XOL6@JAl`5kNUZ`R}~{VmU!m33L1-kZ}Gus$!P_vmyz zHfAF>VKcU1AGYExY|Wu;&&j-=53?g5XBWQ8u6%>txSYNCC42K5-pn7^pQ!=1&v+^a zGCPN|ByZ)#9L~}l#Rj~CO_*j&j$wb^&B3&6Ne|})PUU@kl=t&VPT}jE%4K|rEBPqD z=HuMXC%A(%nE4jVGiKwnJe{+6A!qY4&S5$F{M__)T)^gB$Tob11G$95_!>v@O+Lb9 ze1dQDX|Cj(e3vU|*_eKhYxphK@<*=YZhp*+fws?>gP$@FKj$U{mz zcWloeIfOenf;)K!f97M{%cp2roSw-8e4D>>6%X+P9^v==n>%@wzwnfv)^7&cK4UJP z%6vSHmoo>iU`|%1Wqi5?&tO~TV@DR`tt`Y*wCqpc#dA2F#rO=*<1CisJG_9ac_G*G zQvSrtxre2>k5@3~VB2TR%Ze;O>lEp-tj3D0&Z?}%*1Vb>ScjcipSQ6A(`?AGY{D6A z#^>0abJ&{ivMtxJ9oMrXchR~_dM`Wk0J|~w5ZhyAn^~THS%v*rg9F)-LwGBP zaTIUmT^z~jyq(X`x>0%-NAn$y^AKzEFzfJdHe~db&)r38xtNYILBHz;yW0w!fD7U=hJ6Tf4HtatA*qPC^rZE#XjNLeRd-EO9 zq|EO$ZGLP>wvb1!$`jrGRFhxwe;KLMr8h%5Puk-SWuz`l+Vavq)AFZkN{2(rA|3SK z`Tjfc)$n+Ty6Efj0)8x`@Avud3IA34mk)`H#zeQN=fBtU`oHj%X;}0rarL?nu6yg? z?)?Vc)W2UU`k1&A^}m?@4?iZZO5Vc9Z&&;*E8nRqdCxum{h@;K_oa@1f6({Q$HwjV zee`EI@fF>-v^yXDk*x28uS$(9WTYz@O|Q!6S6+=~ld8+;=Q_Zf_KQmS=PuLH&#lSJ zS&QZ9z;F6W)?xJ6qjAyvel;j-s_pTVBW3?un3g>?Gnw{6GHr1(?X_gus$|;x$+WG> zv~QAWEm}{g;G0yNUeW&_i?%o{Gvj>x88%_Vz2WIJB=^{jL$WT5y4{72ZT#0~S-8!F zUt8~pZZLXPmgA%EtCle&n}J!DWZHd7xnpfwho2B`bUZ&34G0s)N53m$&kB>qd^sfB znB_yVj5#(q|G%lnEYCePdd{Z)?W{(x%K1Ms=HK1r|IVHLcQZNpgwdd0v zBlq>cGn4<$U+4eMz5jP}{clVdy{dlrTO1$yA3v4<-F!!{I{$zBFZlnS-`oGU|LXr! z_x`{0_xk_anE&93|3C9~{(s~L|KFL(e=yhonKy&~2cKNI!uw*fu)d+w70WxUjMf2v zwvf+AWtXbfh*Gq=cS}fC6pycoo|B{tqP&hrNy^vA;s&d z(OOfyW^4N}H8hNk*6iYS*E^))VcHmJQMPE#_a^Nm={2i(8L3C26xtW08_tc^fafRe zlB8WGjSTZ!DaAkILuo}A8?AeF4r9NQ;yLe5+Gw5gjxhF+6puY7eGtax$z*p;7+XM! z$DS+2Z7J!lF!mBD9$QWt8>Ur~)`z)NOWHcprZBCQbYqxv2PvL&x1_yU8W-j=K#J!) zOqvj;jg+>Ax!jqwrn%5+*ZEz>DBz{8xgO7WcYNO4B2CV-ATJ&dMUJrq;jGCD`_)(y(|iCHYxg0R@;tYW_F}1CXiFz;C8=?kRzrFt-0te6Z6GZR)0#-F!tGinZ3k&ZXgf>oL)$%R z`$}EHwA-a#=SI)EF;e`yx-V&`N~^+L9+l!p^t9AFj9nz%6vjs5;;}1|_I+t}7`sl2 z$9^iU3DdSn{lZ+nPTC)(VPV=Ksdt$3-%>p13~!@xd%CnP%;gLzo^v5-Lzs4s6n*q< zMyf>8ULuVS)2c}~hdI}l;yE`=+UC+HVJ>Z?c+NLS4JNBSX* zy;h3HHj|cwu{TNs!q{F?Joc8Py;a%~#*UKWv16rWVeG@wEn(~vQatv#qdcPXCpv82t&YR^`fOAaZX^BGb`m{w5wE6k-x(w;A6vU-$}svzAO z=3G^Z=UgXg8%n2zxippHIk%B=hH2MFZJ0}!r0pf;4sBm4`q1i()WD=2A)OVbO^}9% zpF3HKf9_*R`?PdMn9K80{B!3^=Y+9uOC!SAccpmjM@hR$Ix~#@LW;+JCzT9if0J$t zWB-uiv8Py;$L(p-Sz&B0DIQxux;%`%KpGjwUM9t3D<*Aqsc;xuTZ+d_Dw{{QDC-P_I7z{fQl@sc3Dsrlr-1ujoFe z{gS$yQ2zLIm%2nNJE`j!?a^(_=;1cyWo*W>Y|e^o!RU^(e=FG~ZzpzRRwB zkE8hkCvh!b;5xp~4g8d!@MnI?(=A;-<9Ym?wfH4laVv*#8}H>eoXzcgi{JAr{=|LU z!MxsWce5n-urBwq8TYd{f8%)m&L??@%lIeP@NaJCQD*k;lj%B#>6nEV@>JGmHnwCA zc4sc$&fI*GXK)eoaU)$~mHv?hnc;PCHqT~ZUdeOVnCCKje<;rAwOoSHOZAsndBOH0MV_;0Q<<$Gsf2ao+@15hHs;uKz?%bU1Kbg0|x&C?Z>Yb1N zr-MuO&izk=v(Jbg%+7ZI+4$UJntFluKK&%~I5V2ZnJ2l?ubw*p{7{bHn-8NK6+FqD zqJ?$u0w=lAozaa7o#aN*szvX-C%I9j=tg-?a-(QP=%jP{*{kxOp9;r+1@A{U%6gI? z_iS{doF}=_?a__SILVEo_0*I8S;|K@Dt3}N<^HeSXqPv-e|#McZgA4OJ0}_+oy_0fplg_C|bfbTK=Q{qoj<(TH`gA>DF?`ae>-y+MC;Mg2`LE1r zY;>cO{hp#-DF4ZmhUP^#I@ufgxadYF z{rg8Z%KQ&cx7=f*b^MdQLe7nDbh4+%pBA08#u=td`dPns9q=wxr`ie(xiSg?JDV@wZQzTXnUxA&1hOD>Gv?LkJK?t8!jCR)9#m=hp~@K@$F_yt-`cd zliNi{F?!UD=J&Z2-|k1LZMfZUQarzCoije#5v_B!s1=PkONvKaEL~GKnid_Ch(}y4 z#YZukNM%ENebPqTUGcGtXv?cZ_-WCxhInjrgdskP5gk|P6x!#Lc99exomeJy3GIhT z8yz`_k4{9#3%Z3iI!X}F`7bFxI+4w*wP$G0l;ZY0X@9opaYV-fKCTs|E0Z=l4)8~4 zn@hdJ*c+1eW+^__FieX79%GU=+S4B&VTktc_YGrbC+#aze5_%GG$6FmzWn%JMSJk$ zqY2S|`$3`oEoqNQ@lk>t-h79K_ADtLd%hGOFDN6GtsOn0>PdU86dwm@C6y2DjY->2 zijM<~km_F@jlD;T|K<-#@qKwlihtUCDLyu^R2m-c%j%^4M2e3MY?B6F9nEi#6wmLd zG%}3HVF?<~ub>nkFDN115!y0I8|~$ej~vvO?h0+Ir0pWb#|!#OV?#S4X`}tv@$rIa z@AbIQK9#g{rTECf5-EO`M0={^dll`Uj*ksQd!^%NNwhCIZVyWFKL1S7%21edE-7x$ zmg4>UrKI>-az)Z!CB=L78%puBq;1l6lj8mR1Ely_675-z=NxTO$9wP}k|uY*y+oZ{%-IKJ3rFh?aw8waAXrt}&`0rLidL&FMBgOZnniTJQ zkM;>a7TQ)x+eM1^z4w)-hjv8LMtgnZz3b7w-Wj2NDruvAz489@CDOB@U6r&Oq<9bc zR_XcB?o8T)QoNTtlZ}(Ub))BBE-8K-#iZF`#AQ7_9CiKKl&iuYbGmKKHkvLb2MN%3CkEm0fBMtd6Kd$nJR_fH>{ zehFi9WINFol;Zu)C8RU1i5_K{q^%~!d!Xw}uhfs)R!Q4MiuWu>`zhkr?}((mTZ;EA zPmx}$AB}w~Y3EAuKISD-gYer}m9!hAcrSAF&i!DxS38sTpcL;3J}SLYKbmt6dl2Hs zTTqJk1Q(N@31csl;=fx}X;~OiUy4Vxl;ZurUW{R1Zylca8la7)NB>1%(OIm1Z1_I% z#((Mm^`AnX;5HTiWnXPH&uDD)zVLRkuQoo*_5b$2g&ggZ-QhKQ;w!o@X%B9x30sd( zw@w~SN@Xy*pSGvd(cR3(l01#2Y4tVTnAVrlH_>`?dJL^(rSE1wMvvbviS+ZdL6}~_ zB3#L$e4poWJJ07)mSVIo_5x<(CA@%_vo_1H9?P;3E3hXku@5Wr7FOd#*5G7b#b{sc z)m+HBe3jSm4L0CrHe$5z_BwvUW<0_cj8^Vj@>I5Ev@f?kOR@tm<_)aNE^NRX*@QjV zo4wedH*qlgauWMvIaPa3kmNGtT8!zQiM3 z#Q(+F+rUXyRQKP#E-DzJBoIVITo4r##GMzADCoY-?lQ8wj61u_BK&Q7rh8`E?dfj2 zduC@56eB1qMl>XUR5T<(gNhLiNr=H{67on48ca}$A&LcuM?!7dJd<%}x#PLsXT!-VIh>{{qJiINpZi792l|<3%|B zHI5A&{|3j`;P^QlufXx|aC{q%pU08roWF?UM{v9g$B*OqB^+;T9 z!SSDQycfrZar`=tKf&=EIQ|UBZ{he1+za2v@pv5n9mnV3_#GTyhU0@cZpQI@IG&B; z4{)5t@xO7TwcUqtT*UDa9IwRje{p;Vjz7im-8epmVXq zisM&tJPb#=Cw~#gALIBm93RE;2prcu2_8O<>u`KJjxWXW88~jh@mL&b?)!KgFT!yh zjtv}7z>(&_pNr!aI6faonhQS}$9Lj*3XUJa@l+f?j^m4PyamTG9RC5w({Q{S$J25A zXB=OGcmT%@IIiHh1;nFf7*!SN~_KaS%&aJ&V_cj5RCIQ|xncjI^sj{l6~wKzVE z<9l)Z36Af>@uxWcE{;c|UH&~BpNZq|RWEXIjtRhAEP{Zq=f#GM@r}~d89w+iG*(K}SUF8&r8JF|(}V`DkOgDqG~waKqEb0cm(w&}O4E2b zP2;6BjhE9jUP{wAr)j#j*ljg7ca|GH+`vfprdFd}-`r_+df{ZtYnN&RdX!3qTbJ6i z(~WMeR~t}(t(|$Uj8mOvd(fazfzTDkzo`y{6S}JScdQ)LaBS@LY6oLdiI`S|Elk1g zVgrUKk^-TqJff^A5K@|M%y!!KTJIoV=-5mKWz^_;3L&}33XBp~M48wqX$3VdwgRKf zD56YkOPOm}n#n0<>@MXDFJ&w*Nu6=I$Jxu}eqOU(?;M!w^tlZ%XOxU|O8H~XypU3t zgq*H)N+~jDE+pUMQ7HF!I(0VXzD`1CQ|{*^bT-HM`ZqP^o9$OFHF^h;o=v#uO-plg zoCEU5L~T$b2~+eKdOp!;q23CmSmm7JX*TG5OS>K--PUL)J)9&Z^f@Al_W|co!g3c< z)aVPDRpSTZn)<=lu}N+z29+Dxml zx6vCkRwPN>+8|zPXHtG|X%EvwzKB~Q!6o;E>}faWIz37xDRCY&>XH;HTY)|oz%=cX z?YYkO&b;U;3xy+bI1NG5ou%F^HNc2RNC={7F&PdOh1`9l(-6ewir&y#Ijn?RI|Q~Y zL};1Tn^ZEGs|Xchd$YYi2@01oji+{Jo2^0*qjX2Dzu#0ArRR1H(~BIT+dckG7ZOhB zR*!!h!Keu#u83-}6B7S6A=q6|fix)L#MqF=Lh>6b*5yIhB$j_THRI>59g8a?fg&#&>eTd6Wsr{j}GTZo0rSu}SCa^vcN~AH}Kg zJ?luZP^IQLm9q6>?u+;60%fj4x)ZNe%9P|l_-enBspX?9TF<4q)w^LOcZ=jS$8(zF zYKXh_&F~AG57DTJ-`Z%@XKJ(iklojH9-#95G@CMRl?-7hIryX!wKGkb3qE%RK>}o){H<(1rumXM5y66VuCR%LFu+I;y zb6Iq=F^V@&^Yn4bR|qCCT%K?AP9K;1&}PL%bGg|skHCYcL)Xva^x#8BU_B=X>10Q< zEyI2Cy5bGFtyk+VG-vy`G`i<&10MJxeeLYz771{DVXli#^^Qr?7dCV2%^rptn>$PG z0VRPZt9&kdh3Rf%wh6!G;xr1_EtyJ9;MfE{QcfeMnWgz1m<+^}#pYV8Ma}WX9TNqK zv=?QLg2fm>IFfH8gA*>?NVLH`Je7jwv-tu{s&? zPSii@jzTRg=@b=)Sh5u{#?h2i#PXAg8eAb4Z$TL5Y`j>8XOxJ3xTLl@o9xqxNX&>d zreH~vz}@r|=6`l{@U%*&Cn0n!n6TPFCs@+OfZDK_n1O*@UmHE@*h5+~Vj7jLB9;zx z6@{$nZN1J?cX&`1YrtvDD9mQk6~zNCuRhQ5g_?q!cN*D-TW7jk>-9CqwaLmz;y4S# ziKVEGiTGBF$Maijv#}I*(*(Wp9i6&rZ)!Ek#R&Cs0+HH7wGLA;0fzaQaGvI25^>WhXxWEIhVUio4DvzHtri7| z=sZkN;JZa@Y+z{E*#AKpg?R{>FbE2|bVL2r_QrCf)!#TZ#l>P;XTHfTx9d7isKucD zYX}ls3l+N{Q8+YGDV4355b5r9&He&2k7P}Vv~p(p)wUL_2wHi zdFAn*cDE>yHMa9=&B64+_H0m>47Y?c$pR!I`Yq8qAnBy!V7|vhTQoy;(+nrVd{an; zHbpKQX{4ohG_4Q>RY|ZB#Cn1Xki(OGLqjZFf`&WGhNpZFA&t-l%FQ)uNo8giRT9(2 z)1^Av36@a7)EG-g>ca$cLj+&CgRhFtsEBzAZwl^QlisYi z6=UHV`Ej1<+qqzaGR~otP!p3$?Ln{8Vudib zBw34=rdu1#F3^3q#OtvI5`1ukEl9-C#7IkGB8NcpB`#SJ<8-78wZo-2_LAGxj>;s# znnokg!B@DiY-}|6Vot@WRS{K$ni%pRISWmPU;Cwq{*FQu026*6sDTpMyuK8B~H;+KRbrDK2i#P^koE)EljLuDBWqsjKNE)H_-F-5PfDa)}v5y)^D)R8J9iFGZBSP7T2Q zjt?+4kq@9=le4PKnYH^>OLv-NFO3W68jE+YNJD1x-WM*{SSaQOm2D#A&d6+gNfgIW zCCTJ)(e|83jiiMG6Qhohaw!z8$CJ?QM1wKW>#LVW8wJAxM3~fWW@MJR^$DX(T=mTS zQ=bY!lBg-j4)&Y|mrPJ|;knAJ8avNV^{vNjHXs^o8YI`Mpm)fMw0SNz94YLwj0T1) zh+M}xVImcILc}&3g#2tP2)oH9VbMd@3AQvf%LUz_ZE7}Bq9(W%d5PYneEXRIiun#K zW4^u1c)K>5G?V8O2x5~!sSD1S^}V`g2)W@Q;?j|2>UcGwuJ_Yo?iN>E8;3TDW8x^B+Ovi}-}Cn63_aT=l)7wsfn zNPv#;d1X-l=50suZ@M$|WRw zfX~Y(v8|HX7kW;Cl_FnKp}k&JGPgxugPr$#0xAa^*+ zB|ujmG;o)vEL|djLIO3}83`vH&4J4%cb+bW(vTO0;bF;e2ockhiLERP(VgAw55k^p z7>=iM_okf%=4U8Sj-MnsI(l{!*)fQ2*ZNB7IuN6 z8Nwx|LA`kLrLn%?G{R2-j0fT(g6=R8{Dd$^li~qHkig9po0tycD$FE!uz9K1;Nm1s-N*tTW$_%TOoQ2{9aCqz(6Gm>e*ykY#uGo-}MnZfc>JX75 zO3X}L(rH0zM_d#lRvBNZtfW|(AQKzmu`Nlodty>h=21$$X#db)7KZ$Bs&hG2Y%P(j zbgJry@&zIjrPdNlwLIyhND=sE+5-3O_cdnoBFTW#?3LX~lG9PBoWS>@pWs zvt@^iUq-GpM@$=b7{%>6e1;LBlcF2p8D*WD)@VJYJvSOyl*4)0Z^ObJwG~;}4ols; z7qBK$*Hmy5l)5U3uK?A`RHt=tzSBN;ZVo*W?-|F9jTEWB%`NyGhJc|-SB`#)pZuBB zJ*X)}keIFL!-d0x(=3EbNr;ydf>bPb_G3OP&bq)xW)Er1No*qxPMT%Kr@5^xdKS`! zCsFLl6GBfBYAF)Z#%ZXDdKwCmPuZ(Tfv1`)4VtyKK?1Y2p&enUkQAF1;Pjx`#WS=i z)`IVl1ZV}h!$?G3V|xXPY?2h&D^U~^NfX$TO09^dSC-Bq)C$^B$`!dd+cZQCE|Ey6 z)}!1du<7VfS9IeL?=$S_gp35zvw@z)J0mW%lms#{jr=W2!a_@tbG5{dBe5Pk$6mo! zG1#OSDq?c|ON^YSA|#i;#7I&4VQC}uo&}{0)3dN53TmHdR4GLv`B_lce9h9(XoRTU z^MZvCnqLJ9t4g$L@kC7#QQ``WGOUO)YLs0Cwa}i>)1AR6@9i(>NkMtYvqeQzHp>r| z71X#M6<9fS@+d_?Et5KZn8GXalvNRxQ^!xE71T1R<7YDpYMH!~r!xwAxxC|fGp{Ez zRs~irS$X)XpjOU1S&%HKW%5oR+wh7yDaR9ISxF{`!bF}-r)5LwLtc4V?(##NxoZ~L zaBK49TFzFOL>wX;dTn8zF&}Pt8i!xmDq(c4GG{A1L6?^e&ynzuU3x$js}S?NDWve2 zYG}gHUZ4|@#&qMLv)G)~EzUA9;~Rh)RXYSj7`M$3=Q8&%Zl82r>bFS)tq2}me9+wK zvOrWVmj>DsdfMEQn0js7#1v6|JY1BuzXmUCAk;QI1{3wztA%bH0Sgl2CrHY5=XdaJ zH9f&0hz69Kh?Rs0&9mDQs2sh97|}68JXN0~oa?wCo_aC1q;gtS9LH?o+=q_iG!>8e z&~X$M#6EN!IjMNuhsIsv(lYKt$FYot)<&ZcNSli+O$Oql+qM!FZVs32@)XCWR%doU z-3YSA9BUn>S@0yu06VXeL$9t$lxV6SSAlOf#H@Ec-@1V%J7!3cpqdDkP3~%iNlUt^ z67CCkckE<)wzY&uOSp!}eaN1yJ~9(3`QxxqrRAxkx(!?kDGkmPJ#5xl#B+eOg-XoB zq0eEzyB?RU{xSBK;w0{=m%K>Z>E&E@(&KO0M2|nh{(1a4MSDF>6Hr3b8S9LbZnYL5 z*AP=Jr(q^51mGPmvVbmIS4%I~8kvwNs6=}1ZCs;6C1W`Wik=(pY=l9WjWY;Cw5XQl z)JQ5J;>n}FJ^+QR5RW}PP8|khqvic1oVv_D6J6;ITTJwn=Z6uSo`x+eQEHMQ>;n^K$Z2hi^VCmD5cFW;8K-K5*nP) z1a?UPj=7i;CjH5N34>16mimpH0Migli&;sU9pWY^KFV8)1-E&F-y{Oz8x)t>xaM z*#28tXy#q0Ap!b9S=+R@o6$zd8O*gJY!3iw;t?+}tCzYo`b$?pXoD{0JMU33OvlCr z5}&BiV7PeI;FXl^JjQUO^iq`VBV{EXd%9qz3bX5akQ$|QB zr|9Sci&AM1GtE%WWwN-U=zuFKTO^B{)IVCP6m8VN(THFH1u(W4R zO1Yrx4aRsk(RMbu!Om+m=NATUF-cHZMv}8IX(wmFxs$WtUdUOPG?cTr8l|URH?syM zsgfe6B|CeL-Y_A#EkrR6E5e(^BouA|kw+&Ym`@VjU0w*_EQObXiB4RtlT-6TFaeb1 z>N*OLgeuaM`aSwwbi5=cA>20oq7WU7j|yfhSGl9JDg?ud4QVTrXI z+RMw~ty7s|HTi9CNUd%<+JL$h8rv2dlNJXHlYN)znH&kLK3S0_B`4GVCM)v6d>$3- z6@{w?^)?GZLr!RlY|h)9!DEv=KJZM%PDH@b&BDBw{SFLI<8wf#f<4V0(OcS z({UlvDu#7P&oUPiM$S$#WUYf4({WwVD$<*>%2_^+mu2N>F5kv?F3se0V=L;-VZfNx z&PJV0Tc(`iI;gXiDW^D?cZ%60WpXgCcDm5{3(a3=>^y7?t|OzSShl6p9YhFgztc0w3Y zG*);RhY(296Ij!Dk{z#EiV^5}3he=>2;=H*2d@tzhuQ)SL~ABA z_9mTxNG-llHuM7qXp5DIwk!seRCF3Lsf0!*5p7`%D8>>xhNu!ZrzBELOPo$kD#f(K zDb=J>OiS!6Xowvg*4>j-i0P3FasMKfi79!hybI!YZk$EKylZgk(!jSUka z>sT}_NRbEqjjirN4eRXlG$D9ycSK?-(9tX%6Uq}8AqHKL;G|G9o#WiX20=7gplY%} z)ug!IAqr~~b0Rqm=i1}GqZv?;PnjcTu*IxsS;jQFu##yS%9LRy zjWm=gD`wJ2%X($SOd4s-Q&L3NmSH)?Od6?=D~Hack$SqaVkV8$-<1?G8qTnsVkV6= z)F_9}q>+{=%Ziya((r>7sSD;?ACE#(gN=7%(tL6_kvTfkPyhc?lUi1e7fn!@1?J_b zX}q9BEGCI;nH1`j1@S${y`MQRKB=lA?PqBYEewd%Z4(6;rQVO^%p=vAhOjr%1vX~w z1Fr^$)F_fGl|>&xya*{hqptM`=eLTW+vVjckHW&3QrdM1#Lt%mRCo?WFp|Dsid)Y2 zv|9yIdOT!gBE(qOsySK~BoC|4+pju|Z424GB z2^GcWkikQ=$3oFAwd|y*TC>pPk+>e)Ycq|ODDs~|1)x>I+gP{I3zv4(dixta!Bd?s zzn{o4ylAfkdC>R-uuMO#iuH(iw9nAY7JPh8ZhK)s|bNDViz?#gcgh%=CF?6AHTD@WO*MS)gHa zB5ejtuwC)xE)onQT7Gp?s8#aT058+B^CGj+B!o5nFn0;LTPeh>Gf`S@sUwLKR8f)V zs7iWa<|?VB>yI6j>48ETY50+>8Jf{W-qg#wpqUszGcoua3D%15W{TI4SIER0uMm$8 zltL#VCJu*7GZzs30(Tr_vi*RTy(?DKs5~=c- zG@HjIna$av&}3CnWXzfNHf@!O7gLs|t2eSt-jt;p5|eFQax$V2OP-k)SGKEe?Je~O zON&7lWxYbXl_u$RrOm;?B9D8O>O&=SMM+83X;90MkJU*^VO*@F>NL*n4Hh~!A@DTa zDV$7uzNQVC}dzvsfMY?oXo*>hv+d3?YT<30C=p-x) zJ%h5?w?sEs4f z3mJCB!^pPO=NnsFwfQ09@Qv*uVjgV`kp;hmUCtpovg|oT=(k4=Q9@R&WA-bl=z07MqKidVne{vEvc@oIXtj1S%k0urk?VQ9G(FeJL_L$s(UX|4pqlpanAfz%M9!*Ub)a>HZbja>B_eiJR*{FB z(5>SHsJ>`C)zS~=+K|Q5Al5xcT0BS%KA9(}flJNXk+#z#4D<=ER*0i4D8!b6Xc3m< z3O%)x0IwS1sH3H(RA(=Fa~f6X-uFY;F~*zFoX5&qxEvGz|OK%)LdDU#ZDWjY+zQ8Nl>VWY$L zpHfZ-=K{oH*laL$nW-;2bkv1~uiS#x6l)e%lqghrJ-^9)D+m~xf z3Y-Ijcc=)J*Hg(WRbq9aE%5MJ9o2bWJ4tWXro_4=E-^QM@gYZ$!!j9!yMJD?; zGD(vqrRdAf7}O;kvMF@9jm6M+IT*UF0xb2e{57dKNLdtF}6J~{Iq1v84{`!OuupneutKjT$EW5RDMW5V88!!=!re4H0V}GE5o*)4F&{u@nrq@d-v% z^BT;cXb`^{Q@MZlq`)u_jKR*5e35wPUOY!q##~k`h%_|-giZsSJsj%D2EDBz*H=QM zUt#nPit724L^raio=;2k8@#%69As!S-B`pY?K{1OMuZVW8DW2>YQ-AKZ$go>!@GBa zI27h8+SBOIYIsUeRU`zzwZ|iAT%(?Eb0Z$o?0R`>dF8RqFnW;p_Vnm=X7bRD6X5M@ z8A_uEo~lJ3MxBPFU-|`oiI5=Pe9U(~4@9&(4c?z=cS|~M7x&Mnh{X7JD@htOjX9Cz zgnq9)jkl<0j&B=^kpyIV+ki|T%GnamO}aG|X2B6ed?=Gu+`La}?dQxB5^@af5Q4?} zX9rx4$2-N*(8@a)RX6s+rwK8hm5XzK;{o2)W5eL1y`5fjfW7%% zP0wUzIOVm>n;DNstB%cl(Fu925viUDX}lT}+R#D_^f0C*1i4*!7gCO!Mt~dr*#B;A zH0m?8S@k<87p1&u)-mO*FguT&G>r?6{$ohQR400c?^@zDG z(jJLG$4s=%)DEAv+q`#z5$$RV&_^eayN~8n@raYNEUIHURXj(VQ4Ko}TmtZJfsCrp zJbWr!zh*A2w*;U(Sdy^8&iFFbR{KxnxAH!zM`zFvDdrL?1ge z+lnPJ-5M+pLuRD<_9ts;%gUfvo8=9;oi=u)Nkr7sA6%U2v|`BN--)g#HDmtELx#7)$-5}*WvL0~XnCZ#zCnBmoLtT@r*fHZ9{Mu>D}7t}jeDJ2pw;LU)-2QgceS zchtHFLQU}K#N^K1TeeflqVN?4#Cr%ziZ%n5gQ`n+q=j@v?vfQL`$bcY-WeM)S$-?*@1Ztosmsq?0n{k`I$PXPhppj1H(RbB3FiVh3^jXYs<}fcn@TdV^o6p zX(CO(QGqk@ly||m>9n=S0hQ`vWdz}`77$){P#|fVPU2*PeT+~FoPd5wX{?kcc#_4)$4Y6!=ChJgDNR^bDk+uHgy+$8 z!DTHemC}TrXCKJ);FykW2vOD+gL%E_s86w%fZE8>P zxmgKA5^|V&Ej;j?kX=NOEz=^y%tEixNnIw-B^F?lVVwBpu}u7;FnR3g%KKg?c3V0R zp4ZC9#LeE%7hO`tjmkZ>Ozm@MAniZ0Q078=MmE_uQG^Kwjw;R+h_;jMsO@ixdtyT$$Szsft`X2uG3(;oGeMBp+4IkCR}D|K1_*9y%yP<9x!JO^rj;Sz$+cp~+QyfUDN>CChRYEEM!h+)WsxyYOQL;!^}J*OpO~$p zOp&p6e-Sge2|4p5*;||KW`7~&CT2Q}6dA#1Y8<Wd(@%9CR8Rw*R5By`CwN_~RM(p3VN6755qWTSZ1iJ`BQ^OYo& z%2P8&Rp~?W_M#1Ti3)s(kA=6B2Ae*9`iyxde*U_7jt_|+`|a}a)A!CZ@$mQKb9_kr z*mswYpFVq@iHE<2p5sH}$L6^Zf5^!Yu{oC<4 zDg~BN9L*?>syP>06Ix)I7&YNeFTn_<`>yKo@_Cu!H2>UrJeIKW+Hb~u*uu968q1#CLHbJw_(;V?D@!}Y0kF56`mJIQV zhf#Wx(cZlQV?L*h`QgMI&T8|w1Iya{oFQW#l$|?^?|aecihUF2;te|iKKslfO#3)~ zkSV-lM}syp!tsO2TlYM81$fhHIXT*6$-H9h@cY=l!N!M)L!3k8n!n`xVLPLgF}t96 zD;-|`GFS-jUld2$iP$a^towBKH-@MuAqS9bCEYMI!WwWo!IJM_fg4q1r=|`WXlcqm zp*(L9B2&#yukOf1t-rvdPc11{+umr;>ou#19Su~+Ssuk&MZqq@SOPwc5&J|=cWblQ zOJU6{}h_Rz$ptN1ulp!%b_{sShc{AgH8Oj=`2LM_DRZ0kKr&bh#lj60|xJgZYvs zMfAPM>8P-+b+C(Sjn|l^3PEa#r}B?HgQPl;hHP3(;eEWZO6ZUh0TR-i*D@V8IF!_M zqZv=X$flEcVPOxN%?(+RO)5(>Zt{#$k69jeL(=s~HIzV9lQy%CtPqsXzm^w^?s=q6Z&==!etf z7AK-HVvZGiT6iQsu~chOj&jtPd5i+yQJ|FOBWUWefl0d_nj73vSqVc_yBT~Hw8vG& zk#m;@s67s)`(p@}6o)vYy5v_Gi#lerYBbGVNC)!4!5CX=+4J($P6xSM$|?~Q6jBW3 zv}IyhMM+}{3Bks70^B6!L;#kOU=sr7$uul)k4V)EGocX)bAS zq~fNRWD<;4y-FgzuFO|gS(5qgD)ao8S6PHxE%)tJmhGLG+PH_-C(;?RXL_kOhxc`9 zYsfm2*hZRk@Q8(|B!qPoWpZ&Gigt7K(R50KT?!M#+~t;}3O3H-`=TaJ-Y``*wWr-v zV>Tl88FZvhyN#3AkcCt=cx#}P{dVUDSV3x5oqn8QEm3KhJdO=m8E4ev1fbJS(|{i5 z<2F-*PCZTxmS`p+X_C-u56P1_Vd%8ew4ulObekzer!JodiuEy&5PaqiZ`Q`)yhWkftZroSlKAH+LhJHR~qI=Z9>M%MzNEw6q{BH8!{B7 zV`ZbEV4YgoD7MO#jV{gPSXoi;n38fIpTN$*Oy2i%#fy!Wnc%si>*orppDUJrt`PdU zERXk!&AE7=c$mq&{y3f+;EQLsl${K>jR-BJg=n?#fqCgiBv@8KoqE=QV`^hyM(q_% zA*d;dRkJZGGi_HXoM|78OsO@)rY#V=vH1$+Xksa7ggP-?L(TG}8TYU}L#N>qtQNNHxr7y=4?Qgpxp46E z5ReCE%P@5AUfL!;L_tPw1zq{VAm$cdx%pgr2txB`qK7G zrooEBeu!>`HjPO24jpVpYPHn z<3jXSsWF&c(Aj{HN{k$vtyFrr)ZW06SYuXDUDAWd@r-XgKBKQjjniN0UZgYlx8XoL z`SsoK^s!U@lcebda)mPr!otW`1hpIIHS2=~#&D^`pQAJU#jk;Le^VH`6^t5fMnVy@ zW6a6c)o}{PZ+fRB@*hOF%F?6ga$;UGK|o&XPJhYrXqd%dLhpB{KVS@di_Bk?D8N`` zEb8F_URo5Q6YN6mPPJ<71|=n)kOZ|To|Dj?t9&cwrR!t@GRZ+bi5aBlnyz$~5=4xz zJfSj)N|Zf%YoEJi8j9}XNNr26hcAn9bFpj7wvF^m5>kf;G8=fY4>n~hqw#&0UNFQiS*q|POpqV~+=aY-6bgY(GzPUMC4gU5xowh?1I-*p1@%fENQu(svT2D% z09H;=&)UjpxYonw+T})gK%VOro_FkrP>mKI$U}mtl?lR}EXU$BjS9`w92zrv(hvK= zRfelX1Jmm^+WzXZ5Gp*6H$I`E0YdW_8DgZUnk`(T$*COM*vBJg^5`HU+=on;0ifZO zP7=_x50-N&fD()XGkTMK166aX(`wm}I_{1RT;Dx4WW^3-?b!mYT4+;gaQ{qULZ(Hc-~cTvjz3b+f1%E~^-E`=Ubf)-*M3mQdw<%*Go06ay>H7;cxT{J3RM#RdT*6PgE zTHP11#pH%*lnQ=rf-&Q#&!qw z6UFwfhLZ)$CA^$h*Yp(Ck@K8$MV?O(Ug99?TxG}Rcw5+{)TpxDlRt{r3(&ZDNF^yH<8i}1zQJM=hg?arR1EO=Cj8B@%0&dl zVNnM8kTeFd22V-OR@0&4eDGmqQi!IkHYB=YRV>DnhKH(^q7ysi@PTUpjMK;^J-gY)0@Li^yvd!F1DG?RM|SD?_$}CrhCg_| zZERvY$>{MsnwP|g%*yv*r@q*_0-Q#Y*tKHq%no-keKx4E;IbhV!VVt zHk%)uau5+Kh>`L>ey^o3J}PQ%Ug%&qGdmozN}W<`Az$O%@+!h+5b~}XogPtrwT;_@ zCry;1`i3NO^ol7wrq|)w9OTxD9b3h zdSS{mVIJCIQ$1U3ii*V+tQ3n)IYmnQYPBr2*j5qBE4h%h2uV#05Bl*ixCY4}C{8rz zn}b?QeAO_5?@x|#cT7KbM$#!?7aNvsqC#Y{_97)fKwV!s-Z zg&EKEOh%}?&=$r7aY$L2K*Lcxm=n;hlpK$YwuMs)GVw#BXIF)xp0q!U3|V|iZotTQNY&~ zA!eA-_i4g-$(TjF=K>2fD!`I&4x{2R-a|9ws+yuN#4)jNa|?~-L}R(hPx@1zvX3r9 zmb++g03$h#8{mXtUfBl>yXZtaghjnZcf=({6VHwK{uhpA57(xGxwM7OMpb_Oj`o4I zgPUktsX@24SXFmmZVofcgM$;BH7%HUA2h<*miE#jo)wo%&?{Be-`eXeZY+cjGKq_4 zXlRAnW&x@2XJ)t^aWQidXm_ZcV~U6pp7!P2SkklxO{CLUVAg(acZUPTh-1W^y|os$ zO)2A&Wq+p+WdnJYLE0xHq1PFpqf4p^re`>8<-Bd%t78*e_f;2Z&9cvL0#UfVN{vRN zQ=Qcp!I3U}%<6o1sajLV7_*YB4#%V_9#@q%s~Sq7;W$_4@c86{j|*XDF&R5(Fosf$ z%HwLgQ^g8-r#DRA?RDnx%AsN6US|d$4R2!!FKWP;tPA#Wm9)hmO6JlRrKLo*;TrmARoyK>!7N01*QA!Cqs1k&4_RHNZo!2k={$LeoCSO)UQ|49 z(hF7fmW+^1ah6oc<;w9T>g8Fmb8mHGUlqgYMz7N?lhJ@?@n~?B%>_~?XRtcMT_|5( z5O5W@iGmGoO|)kWdZsbLWiRt5F@lVqa)J9LnG&GZRH--io`Hc?Ycb@UDSUT?*kBNG zRBN=%QN@Zt$`CCHd1F^p=i=$`Q)w@Y!5ep5oL(GOEjiyy|QOy?RZb1Y(Rd5;?4Z)dgK*XP zMjIDHE?uP)p0BUIcB#=jSZ$EYU%^5gx8PVEtS)xo2_oaV%{IOoRbAxIOI6U;(F57l z8Q!&3ebxB-^%aRhd&kbqYsjATwB};_*q})-VMGrzL!alU!d5H=y>z@wd9g{gYKd;j zYNy+;s07P8tqx-4+^RNKsAp*69+8Sn`OnY!1qF2M?b&9F6tNSgNHMfsY7}JDM`9bA zR+rt!b&AV1JxV#N~nqRc-R$bp2556(Do#*^6|GLmrZAM#w&V_dg*9*P+dG5AX^(P^p7YlFQJW&lmlqx@N8;j~#)Q@$5R1 z?kiBtzHlGXja*+Dj0_Wu4HKLe1=7L~niyC}<(6!vjbZh0lga3+vT$1ymU+#1VGRP8SH<{Rt?h!dlYUvGY!7Idfmdpjl@+bj5J&g z62I7|HQWv;vyk6X1)^nK8Xg1+{RipO=`y{d9|>1)nBK#T>KfnN8+?Ukn@gY$8GIY9 zR>sdkWoo7RE-ivyx}?_he`qkU0~*=9EW;dnrM7fBxP55sQ{$%qUGFF-p~I?jK}ekt zN$j??6Vs-p(r7Q#aR1b+Xa>;}2kb9~E7W)6C!1xh~v_Y+!c{mQkOr&ZCCJfihj>1x~U#~3k+SggQYu(hT2{1fu!!4D=}LB z=4@Xt#J0s%Eub#Fp~7Z?fIe@ls^C>M2j|hTb>`+Uqf}+L5wJhdUMCI#LJ4wS(YCu_ zve#Me>_>L1$AhMyM*K0G_zuH>WTCc<4@9Yy=L5_zIX|8@3dn)XI9ffqaA%>j5kHpl zizGE~Iu1G;~7G6l|Uq-w@%5OWw>$Qy@4OxpT}eAmL)z^K2Nf*7FA1od$DNdhFJ z;`Id~Ig1)YXmF@`gY&{27R#vQv6p>*iN?GmaJeafgX5#?sh2Jbnr*z-t1d}$AxNFe z4^g4%q8Q;%)bMf;y5H0R)~><3!=phOE%|@ zdh=F*kqlSxkPaH!5YUnfxY1s&*6L|UK<9`Qja4IBXV&ZV`^W|d>zzUJc`*q{1EU&t ze|NCV*=?p&sz?UCF$U?aLqcSX5`~LRnsbyKt`0B-iKVQ95M6Dr(Zv*I;%4?J#M?%e zbvp-;GB{U*1D&WWBSUqBgSJ95MoJTJL8nJ`g=Yq-I7il3Yk2-WBCS}-Wer|Y2ovs8 zJ3xstc|I&gMmJq%;Ds7g9ooIij4T^NJ zQj4lH=+mQLEnd#)<1-kE1ubFJ_0cV+RHh%oiMwkQ246-`^={O&!ND#yG;`IF5&4IK zT!@-wn95nN|FI|xG^NctfW+XUaix`wyLMF3d$*cJ_k@{P)!Bp!in?|Nw?wE)*5{d{ zr>}+z3S+m8yC?Tm(Y;cSEFEw^7Ph(d(p^Q6TJA=;LQR#-_24QvCUT__H3rY^WpPm! zyVSeU-%@VDk;YU>6Kf}xZrcp)QzxiHOsbD`k>ZRN8bjOWjMdX!uD5K529a7+>iKfU zhlVkfDL)q5uWX_DIea~aoLw>N)+%TYF|Hu!WUNg0$OyDTv$z$EIK>(4S2oXw#+zc6 z-c1Vr{5^Xyb&XN$pi)D{t#IX~s>y>At?fEL$AcjK8xPL2-<~GZ%;+m*o$9ta^Oz*U zl&z>}izg@OgK-yP{z-;gZWzO8xzoamW0eQ1vx^7!*ZgQcIljs%LLPxriNG(chdC#? z-cU~9TXt_AsbW3l402?{sEr0+WRjOIc))>aCU`~+CVt3O-AIL6#AZm2ct&SWA8(^l*}ai^H(4QW=W2M;~e zW9~e{L}q6mwFg}?k7?wNOT!zu=?idt=7}sKy>ocPz^=F<5_oe+C^8V^5*@pk8!Ixs z4`^@_oMGeQr7;V}C~(SoyhB5fIGZh#8Z-nUMuT_#6Admu+Nh@?*E!{}w6xZ1GwjZ) za~N6h9B8=P(a6EiSVaEQ@C~C+YC&Wi!nw;eL}z2W7?P_=CF(^}1xiyCroW<&7uSF} z(oP5|kxRgg7-^xtnff!C{FQQ$nK)EXsXJkY%gyQNiB3rAm?};^U@Syyd$D^fo}*&W zgqYkXeymgJF82nrvd-A!O&YdZRA`k^*9@hf(`)XxF=U67YYbLLv8dRp@W7Y;S3N)v zt8imRlMQ|PJ~%p5zCrp8n(m;PTxnkV;Zx8Ug`lOT&r?%LrV}Z}(8Qp_(3vz1E&~BG zf{+S^$+XZNH5YXiTLpG`D!w8)lVPqIw561J=@yVU&>`zsjnDB6Rj62T6dgQvow}-F zbQgU11Dz_pVlILMJsR1ebrd%(^swQGePAjnIK!dEBsUusViwgBV?2}}{uhI+rbG_m zuQ$?kuhqpIZ|WMrBdQdQrztpFsuq8*en6(lWm(Dzsq=Q}7wU3A%YZP}agR^g3O zLqPo(SNP~*&^nIy~|zh7Ay8IjdP%_IFz zW>q>5)XDH!P1H5oxe#vcv!|-IJFV&fktz<_dtMGsO;noq;a)OiMC_>WSxUI2)Lv3} zX)m?GmUarhE9yuSbsUqJ@HcpBD!5#{aN0r#)UQnL+_sC-MJ=F=gL(3Xp4UMOj!hK& zjY3X&{1g$^TybCZnitDlWx)xQg_2@#x_QUOjqGdcrKE`~O}1UT;~`e63z)>{V_Jwj zz@ooZt1t76>M)L`3Cmhkv(QG7X)I0JeJ<>sRO0@Xkk9ts z&(96bFX_g7KTACiFYTg*mX3@kR@H0ZApvF-Y1ah#Ff>GFE;PBh;4{ZX!+4X&5{s#iBF(wc z_D4gSxvreb*W2h zXt5)-UF@=Tebdx4cBDvyN%ssj;yTOgvC`#SfGSNy=Uz}5|9BIZA>1?!sdCGsmysLOmfL75mD< zFqa!Iy}xWn#?!s1k68Uv=X1bQZ|Uyg834S51KSsQmV}y9eti*b85yar=gOJpRfrWg zjWpUkugCkY(H8O^X}%sB!H0eYAN@vEzyyzcfE6}&V*6Ad+qZF-+Oos0lnM_r@pb}~ zEqhBdbXUntBl`_pd*PhW+m(X1!cGE>(fRf+bjcN7fX3Ye9wuGnR?_KhD@Q(3_hE{k z8Yz00QM9G^;dmOGODC9`0=sh!d&TBzv=*ChypkisvSDXKCR~=5}ZK(z>mK6?mWM@i76hfPq=?o;c5GLSCFS z-5-F>Crg+RMwm25g#^*$AlE)>#PEtSO!8y<6uF>bwwAW7Xvnb4H+vBI%~NtxBGf(8 zHUSjrEPO~VL2*61@R7`ASL(~Ny3I>Qeq8E&RZ{-EMU~un&H-k;1Pm_@KBR0L;6LFq z%q|?{KY4D9|I%VjK4KWqg6+RlR{nIQrZv*99AH&y0te1BNoMh~N9iTV? zXbO{B_Ih&}({HrAg)deFuU2}m*l*$Mnk} z)_ompiC->VZEO(ysTl-w@krBCNSJ+ErX-??1HKw*L&aw9sTiA1+&ktu6#J-&l!E3r z5{>4ao+H76S?-||dDsN~EblOq*+jhyiw~8UbJ=PvrjHI zw3ZyVj60-?${KXVJ#DdpZje)(^*{N*eU--^t5nujHq4>?PhG$MU6smZLQcg8<7WrU zjS7Bi@Ney!7tx>YcPdZboit7G3HY~m%}qaBTRHqVtE4)+iLGUwffe)Lr_NxkqQ66M zT)XCkk#KI0B%>c4$zG-MEc~OhM9#+9p^kKLcDN&#;f$^+g?c~Ej&S7TI6KObui)$$ zM}CYmy4V!Yp@?>!BPW2IWAnP6ZN04zxeh6}g zBWq#$Oh=9b+2F|OAQO)40im2t);l2E9eE?jX^wmlWXh4-K~8t%0T8MjDdsh}%zcjh zGRTFFoCf1-Z$Qn?Y`NkXs#j#*-?Q+Z-7I`K%-7f_%i0 z10c6M@-C2%I`UDFI~@5m$eoUS9po-Y{s-i4N1poRO649$UI22hBNHI^Inn^R-;pW+L1WWkZ2 zfV|w1qYp=G?8pm2x{mAs88|Wrvf{`aK@K|d2OyU?@)sbNIr3$Y%N_YH$d!&f;TO>w zJ8~Sz)sCD7as~ozwgL4*4at#*Q2da=0U7AV)Z| z9porS_JbVb$mJm9N2c`r0mxyFdcc*^^UYa z#vOSx$S*kZevmU9`83Fxj(i1VgCpMunQ-KYBheZ=@_dl(j%)$kVRvdXZ z$R&>426CArUjez?k?(;lIdbT)pfz@69Aw#%y&zXP(gwNOk#~b!3jEhdA;{kZ-t9cYz%0bRGmb+>t|$MQiNH(I7`TG755xBU2#9InoCCB}d*0vd)nY zf}G^Yr$J73S8F%CykRu(r0OSlu7D3K*3TWJ8~Py zf+JrAX*u#BNY{}kVDf9TBgcUZ92o;yapYW(OB|_zT;|B@K`wXXH$kp+pq7d;{b^9C;Mv5Ep9QiD-=-ISu4+M|ObF zOdtNMpee_10puu0-UxDxBOd@c&XHR|);aP8kY91+KS54%7tr9XaYGw8oB{0y5>u1jwW# zb&%bTTne(!kq>}e=*Xu)E^_3bKwjam2!Gkn0`!dyuy{@?Rh~ICALo(HcAQOpu!#Sr2lvBU?ajapct?w>r`V zxy_Mxf_&DI4}yHckvl+ccjR9{?r`LPLGEgtCCDE;(gL~LkvD_f zOc`3-lj_d~co+GaTdBl;+Kpu7E zeIS)5+B$z5$RUpW6UcwLP!EB8-;pQ%Dq3R~>I9I(9oYtQgdXjIr1%#XE^etUqfr`$g@FCabz>ddPn9##vOS*$gz&R2jmP#ZUQ;ek-I=P zIPz_fXFBpDkO@bgdJ0-&M}8G#yCa)GrW|R4>~`c$Ap0Eo2*`zw{0+z+N4^Gfkt06_ zsXKDy3(@vE@)D4}j$8oJa-wXz=Q;BGAOlA}143(8sCe2w{~O39jy&Buz5RgSzC&Ul3u5;uUUWE49krP3#cjToY zH#kxQxzUkjkheJUPLP`%`9qMK9k~`MX){!$oZg*r4$Q_RK zK|bNg`#?VF$frT>bmYq*cRBI{kh>ju+6dZbN1g|Ak0aYa?seoMkoz2Y9mxHTTm$le zBR7FO=*ZuJJmkoCK)&tBlSk1$J8}}pBaUnVdDM|tgZ#TAmx5HDWb6EUK@M@`lOTsW z@;4xdJMym}M>z7oAV)cJ&Oks8Rc zj$8_IW+bQf(uD!yx}L_VMy}p_Q#G_lmCA1;6#Yo&3H;YzfNY5I5c+432}gbia<(H! zpN8Hc5^Md*h+*xTU*fp2KKSWl>%kIsb08G`NJp%{8f1HnhhzhgDMzjX+3m<5g6xaL zT0ayqq-%fW_x@~auvDr1Eke&OQ|T8{h~NH-E|{V9kcS^w%QzIQ~hg!T!c z=tnwY{eM9QF&>f~`C{~Oj+_Ou;>aG5OCqt>e*rNh>zDk}i{20{Ar6G1AL)qo4}e@2 z<009ff?V#%KY?87$ag`mio{w!95E#8XRRBb3zm@MXHfiTaqv&9zX;^5F&>h=669(} zUITKCBUgf48;Q04i-;jvf5!4}eJ)tS&Jl#7AL)qoyFjjs@sR9(kheMV7|8XGJpI?v z=SE_!KNT?~>-)A{`SoC_QW--i`jL)UKOf}A7!S#MAU8Sk7Ld0)^7|k+M`Ep0JCm%x z@2C&{Pq2jk7NO`zI%565KyHcgknE{1LI3W^^FVHMWGl#LBeB*|#f|l^J@+pk43@B` z38CmmI%555klSNCB>Pj4I~@5c$eoTn1VVdvq*b@psg+CDe*MmgR|QMB=9g0Zm?g(Q zv3?rJT`?Y#?E$&lkwuWdbmYw-_e5f?|1x4o*1!3N>gHgnQuzQv(T{Y*`t2Z}iSdx^ zK9GAI`3cBc& z`4Gs%kyz_TA%21}L7|ASEUBOS5+Ajl&z9+Dk)7JM5=P6hd%Bjjs7u(h=(ygFHLN zL(*$OCLFm9OCJZweC8Eq95sq^?w98KgL6{2SF}!!@TRxo_IiSxR31Vo`jL*X6VVG?5aS`)MvxUpE&#d2k+*+2B1+BH^d`8!gV1O{np{1SYHCUCdNaut3j@HCm@ED^MCo0sq2EJO67+L zML*IJ>nCl&%t?%gWSc;)cjQ8l8yvX|^%D`p+BGLpMEL#b@!hWnOO?up5Q=`J zBi8=~>vYv?*U&vhzY{)mKbm~8RH^(3q3B0C!hUTVyto(- z$<74%v?J$%-08^0Aa_M#tv?qrtX)I>2>nhy?}^Y1*00Ck^dlW%cY)j;<007(K<;tm zn6u&6IWh)vZzR_G^AJO_{(|RR(hZi-f+7_CNJp$+4)U2856Nx-xzCZm1-ajm`#>Iu z#9DtoVn}z~AN|`gDCBVMKS3z^k&dtzPNHp%@sMmM$U}~FKpuAFDv(DavDQyU45^oC z{@=6ULI&$MBNY8eN7%PO9*yyk>`{>KIdar1fDa8`9O;|}a!4fB`U@akyN0|M`hD!I zZ|n`0FfONf@FN|ueg(*XIa?nBIW)#h+MfeC+>vjB91)4N{;SYWb^f;T7o*P#*S_W) zimg&19bu<~eBW8$1#(o3nY6C}ImVF>gB%x$wf<|+PdR`7>;K8L^S2`u{YXcw{}^Ol zjE7{uxE*(-Bd3C#?8x~br$l0{pMn_Ht|6b9ez#wBZ#7t|R4zp*`jL)U{|LzX7!S$r z0vUJYQIInndCm^pwUJosn5H+^-hTT(nQ}iJq3B0CV!a7+W{ihqSA%SD~3>4^1T+ll)x#zV4~gPiTi9LRP@t_GQk#9Dt5Vo0sc zyI;QUu3!m$1wzq}bj14oAiHBcBwKqfyf{aW1G&(V7lT|BiM76-Vu*d*xxamNJy^nA z6hhIDbj12qAoUmz$!-K$aO6&qmLm^ITnt`S|0^Tb^e0o-`N!`!D~P$`jL)U{{qM*F6OU;T;|A6 zK`wCQs8_-ti^N*T#5Am*Oh)iK_pX)ugC&$VLeY?KRJMvMG zYa+4M#}Pwn>-MeLkDFU8!AC$S`jL*X{{gu+#zV5FA+N4;I@cu%l|nu}2MBOS5+E|42yJS6*5kQ*KO0?18{dT)T!wEA%_~+YkMDu!Nl7Bb0Q+`k5g2 z#CS-0A;`UsTmo{RBfkUk`ADqwmmr4J(!T$PAG;=4!gV1O{YXcw-w*QlF&>gV3Ua?A zPe(uXfFmykc`y=d{iTRu?HcOA>36}`=1vWk&^jU%{YXcw|0c*oF&>iL2=cHae-HAA zBlm+m8i}=zVH>Q|`~dxa^IM;OC|H6ocAiku5$i7o`9X|_q^}^I!>kwA1v$i#w}2cP ziM4(f0w?Q#^U42yU9g1fqL}d`9kKo|AU|~0{|Dso7&B=fvkzXJBa*MFci*qrb19Gw>b&yjWxfEo5B-Z){#JqORI{cr0yB>NADxg@ZRNjwJ z^xJ@c!oCbL9^)a|e}lZxk;7hv7Q&H}LC%cCT89G->rbbM@Y{OrWuFL^(03yg{YXcw zFN17|@sRAdKqegdD9G87SX-N*pXLfacgL;BTZtEQo@$G9g#8R;dyI!{9e)8_4o6-J zvO5xMYct!TnFsok?2GY`>?V*49r--SMUhxr6VOlB^@{ty zb47@^Qu&VBA|0`H+=cMaVmxH)G>`>Hc7wDcv9>UUVQR~RwJ&@s#EU1(5sH4KBewnk zq#NTQ*OtJ8~Ulw zed8ZL{re$a%vQgeVndzAKe4qFwXz*F|D&O+r7}dh$^_{yfBsmR4<% zj@Y^vR44UQa+k>HJySX&rK!&bPvw;%Jr7!6Cj7^Nc={YXa`-pNzBDaJ#x zHptD6Tmy1TB-R#&yRh{u6b!$qrRV-#h!@_V+9DmX^(~NFV>}e%Cm^>ua@0leqav}k zFmN?___q^xJrLrpRDKt^~Qmk?TP2jKtca;brO>|Ly5N#jPCj z@GlXHexxJp2N%Knit&)_m>PU7M_veWPbAhB4JOka_sNs#Y2RRLD?-tabc8K~+#BN| z**ih*bL3+n_eWxFVaNwtp>Djk^*Pg${H@v|9kKN=$OADRvUT_j{3u6G0(mGBYYT%e z*b1YG_8Y1&EAgWKAr$>cN7x%c9**&l>~}yOapdD5k49o`(aNn?k&m%Bv}6{76S^y#wU%7!S#Q z59A0({uJb>NUSXyc%)UuXT1HV4~KXwl`p9+(h*xf2013iL$(gD!$)%DIUwsIv9>Tg zfUTn`7=8yEH(nRwg&&4c^dlXy)dD#w#zV5-06E!_Yd}tk#M&aaKFy~7)wWB|3-Mxp zQEicq*!m{O`WO${dKhHfks}-Me zuc{lGtx-x;-Cjtc+AhZum0MQ%MoMdQjd2{fsC;n zxn6;cPsm4*2}WX<4qx)FaaZkP2jX*iWioTA$Fqa4g(;PKysH~ztL12|A7pz%9)#>P61%i{&2JCCZ}`>? zA(zK<=2DM$eFoWOIdc7~o^tVCX3yUIe@0@LHhKB&;nn|CV1wjy+1oRvQjcdBK+0N< z)=D7d6EYT3!AR`VrXl}aK5fP6&xTx%kusNhylW+-lI6&?6;hax-H_@=Vwaw-dDpBS z_YVrWOmKgy)Z<;}LW(R$Yd1h@CuA6;u94Vv9sT+HaL0B1eh;}E(`GL9c-MQ7`j#Wt zMo5E%{0V7jBz9fzT;aKV#uX1d6>_<6Zd988-E-d67Shymw00Gwc|z`hv@{aC^f1bw z>utPi;{JKpqfDvP<6X-jtu04u-$U9a)2LN4!~ELIxl-~8uY zr$IVcj@B-LbV^7Gq_dIOr5{QDu`#OC3zI`G`@qblp6urZ>0&u@t%7t<$nTIIMq-!l zru;EmyPvCb=;w2JM{FOZ<#Our>=cN8Qy5Jd=?>|YkQ*VzMq-z~_58c?MprJ|CZyzY zV>6d}yz6yHiRFNE??d_}hZ2tkU^HCwQi6h z2`PaLGZMQLmwz1Yd+t3ShFp$Nv`FcHyz5>5Inr{p_BmusLjHh^Hxj#Ura%8KuW9d` zb9l(*8j%(${f~E@&Oawuj@I~#Zn?<`=?j@+BzBe1pFek4wynK;;WWMESZ8cnTjedG3K;lWQ*m{)}})$CFCnep^?}%fd2e8>Wu@Rt{QT=1$t0W>hZ1y zkm{DBwKE|_3F!f;Z6tOLq(A@I==?_OWg(Yykj$kX?^+0{YdLa#1*xBqGCY(T7>Qkj z=+7VbE^7Ds{E*9M{`3H(2JxSFoepVeIa=!qX_}CGAxAsj!?vxF*mbvaRnr(%{B_XBe83UbMd5dRc}?5 zvLToEEa{0wsmHqpLwZ<_)}}*xCgdGRFC(#QDE;}z;cdP3R%@TjYYLf5J)RxKQ?1x? zU?l6dMF1)vLMJX~D$N1yd^Zc>DQ~otC4uYaqK4 zGFVglhNB(zOo5a!65GeJnt!Y={;1Qb!IaA_QVyjaZ{GnaYdKo0#>TsRLQaBINJuA0 zB_px@0TS|$-ezyLo)Ao&8EUscsmI%=K?*HLYYQOy9nfX0XAPt%A-_Os8;R}Xn9A=j zDm~cqpkTtI9R;NxZ$ArC*K)Mh8&W?Z_dpsXWD2CAk=V`wH1P*7joe(mWwYKw2iG6{NM1*#001dHYFSPwf^=93yGRMXATzM?%_Kj@Dj; zv`fe`hEkfi5h$S@=E_wxw-`6KF? zug+W@+`MOrDV2Ks_fwf2@<_|k+6j;`2{{KcJ|WjZCK!qB6G_N#{ib}}pF?18%H;+! zrBaV)FG40~IsTR|hfJ|#b^i#Nnvl}$*rzAt5XcN8@%J-{g#7d3x+=RRenQtVvPbML6ue`Bh_h4er$&^Yx-d=`-h=rD;wK|Z+ z326pdnvjbi%Zsd^x)Z^__AuB9LYl|T(6S5w%CLw=A)*6ZJ zkCBjnSHtxsozD&?wh1GZ&nNZy&)XY7)>)3$+Cnxa4ykmg2W`&1J0_x$QbBW45>N4ZR? z)Z^{dI1FrQIa)gj(mEj*LfR&zAEcd;*#0yL`A6N>u^(*@CbsBIsnp}`3n3jWM{D0g zIwhnuhl-sOQWMg}NNk@*LjFv1Snu8ggNb`yhn$ppyuBFG-Ey=x64E0fGax+^vI5e} zNNj(Gg#2~C_lA%7HJG?&&Xh_$-d>f1&|=HcT4P8_LOMhGCFFKUeOs*mE+aQjcfvK?Yfl*1m-dNyy)jVF@{iL)Vc;V*9fs$MBIAlUX=0YYLiS5skkiRl{{Dh4SgNgkKQ!4d%`!2{7%h6g@4vMEH zhbnRATupTYcE4)C*&i@+=ToBnQtVv z^Yq4Es37W`zkf&LO}rSd!);1Eo;8Ckv>dH z38q}`4W?A;@%G;#D=bHA`*TRXG9kx6)+FRS$XX+@{Y4V;XPQ6EX|g?-cqTEWQjfPk z3t4A5T6+(&F(E%eHYa2+4%@dFiR~|ukblN?XnXjgVB)ck4&l5L&_V8 z?X!r>KjSvsx?^21aScr_N6DOOkj@Di0_kETw!cO~ z{+@6AVgFje#PJ+cD)o5#DoA(B(b`r>kAzg<)Td`c4u|wI65HpHP`co71yM~N{*J3a z-o$$*bqYnP$FrLt#g?PBagdUPyaef&kmZp6Mq>M167okEk3F?}bujUc7p7F|@%D}s=r*tzdM{5lsvlG$*GB+W&LFOBY?ej^Dm3lmT8?w-HwDtvLaYFurEKSJ4Q`o;7iR}wW$RFFBvQIIGQNiArDV2IWyJ`yi zcgq3i20&IOi zHYa2NWQ&p5{uT-OPj24zQX!Wi!)adAha7bh8}(rC#FT0w|9N(wNQHR+{tQHa(~fUC>sbLQn~-gg@4JIC^OsUl4 z?WH)KEwUV~9R{hLkmiuO3F!u@ZzQ(ALqh(w(Whbm$Aq^}?YfB*w z6S4`?G$Exq32tsAwl5|j+QDHKOfT4acW+|9&Xh_$o~?&;upF)Jf^V}= zY8gy?VxB3Ldc1usq`T#4Z4RVILRLX~CgdMTFC(%2JreR;o1L$oP&b%(EOV5lQjfQv z4k@-At@VPGBxDGrUqU89`WuPuOG(H--z)4mwjh|;S1_egkGKB{8Du$HE6>UOkc1o# z8J3XKAtQ~%c6R5{Z6EXfxx<2qd!8wkdc1ukWQ^r#Z3bj~LY6@$BxECGvXR)njD-9? z?%T7jWQXQW996RAQK`qXVN89bD~*VB+`FGNn?Fw~v4dHX zgDg(S0?5*Yd;wW*B({G@LVh1Nb#V8M!Nl)iU`nMPZ?D5;j1`unwKE|r6LK|VO+p4k z)*6ZJACZuM#{E?Fw+n-bE8|S5)Z^_dAnPngYkxvECZv!{9h(z!G-QjB*#0pI`P*LH z_0cSqvNIv8A-jyk_7x=LuM!Xb?wlpTL@HA%^?3Uc zx`vK*}qfYeUNlaRUzSpcbT zB({G>Lg|7c{;z6evuikK54ZhGrc~ESAP9tBet(1A#eYn{(vuoiPv11 zQmMz=?}T))9IZ`)bV|tEkj@GD64J#;Z0D2}`+f?dp51!%*kIy$!<0%r-dzgmi=SOvq43FC(%2a}x46_AleV*3{)T@@G<)wChnnn7CTVluA9` zz6!F{aLq67rAvmcPEfBAD3HGNoF_f8JgqazNN(^Y7e4 zkTMB*9a1(SYa!*0#CCqn*sCjuYVyl(mjx5Q*-I`;J>Gse7Y-{}j@HhER7%K|kivuv zhEz8a+c%JqKc*efwqbN+HH|5idc6HBNRj1eZ6~C5LaK3bv2H?IK&AqycB60!<1*+^{vk%auVuKLny7X}k&kxZ%7|*q zT3>%(FtOcbN~IoezaFyCaVp7qIWXS8ms`aDmk_;wplm`;hmPwrCA#9w7$ zN~Ippj(>;!yX9!@EJ*Ey^nlb&$RJ34Be8uO3Hd9ft#*$7I+)moF{M(Ew|@X>U^!ab z2x*v*y%w{7Pe^S@b0e{RI|=!%&Gn;?84yhT_9~`S>hbnIkd~ICwfiBh6Y?~qZ9+bR zv@;Uh{~)1sK@tB~HSnOXZU`ohX_!)}$J-Bnm;JltXstP6wtjxenILNNnFhLjGK)+b5I91{1$Q zl_`~ayuBDwY&lvR3n@v+3`oC(ybI}XB)0D)A#Xo(-*(G`iDMe3RO<2es_(IXw;ZjV z2pN))^C80$QUV!iB)0!WLjKkN?Kh8lF_^erOsUl4?QcNFSdP}dfs9W`sio}S6H)}3 zY$Ue-O+x-!<#l}}+<$P~-b+9Qyu37HLFg9&fMtKKpme(OMJ8?1XfH%uUFRkoiVp`z{jl$2K38dG*L(;*%Cksnp}` z^B@Z?M{8d|7ANE{$kK#VSjPU{NNoR?g#5Wot-?MWH+mC)4T33^dOYh6Sz$R^>knC( zkV%j=37H33Yb3VsCLw>@w+=tCZ!mGCj473RynW9P*uPtj)`}n-6Vej0IU$!qwit=+ z|B;Y?EpqOo>+cRGezyWsD)o5#Q;@BeqqVmn+Y_=DvNIt&AiIpj_FRGNEV*jAwq~bb z;{BpL_g&HB?Wc-ViudoALdqnh52S2DCPT^_iR}f>esHE~cUq69f{FKA$VI8g+qXh0 zSdP{ze8{(xkmiuWgj@irZX~vsO6>dIG?4Q|Z{jZzF{M(EXRkquEJtfAAhi?nE2M5h zYJJ51-AHUN?d-J`MD0;Habqy?$pxlV>hbpekOr2cwV9BH3Hcb(G$Fr2nj4AjWt{y; z1yOHqKC(hE@%gxqJynmlH;1&e9Ic)YX`PUskhTfA3)0R=Y~RD#3%w@S=#f$92NUOL zOsUl4?Q0<&EJtg5uVDY4kb02L326)IVkEZj>FhNWL|tG0fyaZ1-#E&YNT%G((@;zr;*scm$M(FAgW~6JNE_?Z(aSwQ}uXzOGq!v(P|e+aYF8d zlq6&#q@R)4Ue?*eGw!`*HTfZU6R-L+rBaV)e?$6Pj@GJt${s% zVy`{-pfiJs_r^1&QjfRKg$%PCt^ElZnUKQII0i^aW5^9gV*5VM9)9k_ZrQvcnD|^I zQ!4d%`#q5HmZP=#kO>J{2e~mJrB`xvVI;Pfb9RkFBhkg<^I37HLhboPt9X=Kj@C|vJe`nhAhQ!P z6f)OHY~R<}t0;)tr)YY#t$T$jm3q8=J!HP+XsyC(jyDog7cwm&?I4Sd#Phbnzkgb-ZwfT_k30V)>nUH5!0{Ae|C&Kct0`*nW_+*H933&dbYqq6GUJ zOsUl4*;Ytr%hB5Y-*9}Bkb02r326&C*+^`!=IqrJMBP;Q)Qn)_Sd1x^dc1uiq=)5b z?N!Jr3Hb`rGa-9@%XYy?Y(Lo9>ne!qzV6KN!NfatnNq38+dD&wEk|o5kdlOqf%Hqr z0!V)&vAw#pv$1m3pxVttgNb*#Fr`wDw->DAD9&=URs%95Ax$8|64D8Br;*rR!`WGK z^;7qEb_EmPFHA;KIEu3ztu2O(NyrAs_=FU!=N(Z-V*4S^9v<@-6?Cp0Ol(D% zQmMz=FN9369IX{Y1}0=UWO72LLZ%pr?KKPHs|OcdQ=VPDH}QE1rc~_^B{%hB4N z8`vr(qz+_8LQa7^Yb3T8Ir~8hq8h%@G}^;RQmLnu``5nTaeQbwLPtU7C*%ys>j~)sS!g7-*K+po zn18p$cb5kfuQxHJQjfR40$FT1T3ZEKnvkuKc?sE{Bh@#I#P-9Sy--2a7oXIKj;Ie~ zN~Ioe?+96LIa<3BvLYeFAfF^;GGwKZ*k0S&!?y0B<2(KsOnml@DV2J>{X58~mZPhbnIkad=$wfi6&6Y?}u;;1yP&2AFv^qxVM;6smI&PZQ|(EaEVKvfXmDwi5D3LN-HoCZzQD9EBK(?RA}<4R%8aKE96(N`Fb#hVa@vg0qvPp8e z%^VRWJy)&g!kGFpZX>K`M+v_LZUzm`C zAtxl{L`X{`v0a}~$-gFb-QM2}2`1i4!<0%r-aZu4+H$n^2;}sH%!IT}$TCPfBeA`K zvsYA*YWrl)*}aLa8dECucvg7}e}B+&w01P4Lqgg@IwhnFq>Yi-ew?#cRS7I~Hkc*AP_T!yBoWE~gQuD!J;?*FgRO<2eBYtKp zU^!ZA0=Xn19Uzw`b_gPxj&fL<1wXDkGH=B>18=udmB=mkkycq zg!~BUVhbmlkbah<)mD(35^@Qoe?qQ@+-xMaH%e}M z_q9*n6HL4g%alqz-u?P- zG9e)caQ)$tgfxOoHWJ&LI(s;_d8bDCYlDgBC{rr+c>4gz6wA@tXvoxrJOi1SkmZm` zMq>Mk&K~yf-=1~%JHf82%hB4Wke3qj8)SAu_Wqs6Ax~-^Qn}I^$~A$^wVwFBqGsx0}TmX41AvZvl8;R{LlG{G_=-pg#3ie@4snp}yYmgO|qqWZ=D--ey zWKBZ$+|F@{k=TB6V((OL{JFuzF%(lO^?3U^kkyu>wPMKHgp7c!GZMQ_ajvkXty^Js ztB}j@FUwr&@vaq+jg}+VkC4w3vezG+%NU7WEuAZzwY}GJbI*{=nJQB%^>|k&$QH}d zS|7;Pgp7u4Hxj#AIoIAAqmH=i_3S1K}>dP?QusZ-rl*!EU__plxLsrRxe_4w~_ z2V|$&<*EE9XD$gj7V@)^*mat79jGyC)-^}4h4Hx@voNJnPx>9Uc2oQM<=m_e)33`< z-I-0P$0t1@!U0VF3}^}Dmnt#Y1Sw-Z@ppK-a}{N-58C|LJmiA7XH@D*zr!=!RQM@x zdv4a#`KeQ~DfRg8un*+d+c?*u{#(h_9(FJP4ENzXOsUk9 zeur({RM^X`xMS|1{M3KhlzMzpPf%Dv)mMSi>t~Du8H@;*_3*G(t1c`vumW_FV4RbQVmjMB>oQ1cCK*My6F5q zr-xk5T9{I)$GfhDRIwbb4TjWC$YYSYMq*bx=L+XCcWfO|5^~vBWG?l1*B_9omLpf? zzd375NFzuCBeAQ!bA`v@{`a5zX2|9J8%(Lx<6T1_4J}7&Qz15z~sA)SoG zuJfFWJI>Y9hc$UO9+Q_rDx@+VM|pKi}EIPjH{c z^Qs3EXOT>))Z^`)Aw81hTOd6XG9J>^NbKsExYiC^7adu>ow?NGU0Wc%EJxo*x!vsJ z6LKWvG9$68lXHc8b@;2dzY%hIRx_nik9XY)DX|=_O@Z`F$O4G|`m*1r#I6gR>mZF$ zpZva8>yXRmkusNhysOH8oRL|MCK^HpCFFd_5F@ecLgzYIV^qCKx1JetxdlwA)Z<;x zK!#b4)>c4%-Bkh>t`jl{0b z&J})MC8Zm2RVuh9W-j%3wghso<;e9TWI{s97Zl_s8;M;PJJ+5XqYn9_)dL|{*D+b7 z)RXR;E^$+p-72?xLwOg9pLhnG56xcz-P6?4TP z{C^*1F7>3}VHY>W6WG<0$Nb6pLYUf=O{vGTYNZNtGt91$rV#zzqx?}*PsmIo@psrY z`3_&+tLu`G%irB$N~NCkJG{(I9qLv&6DvJ{Cr$VcCuURX@$6&BG_z~ySIF#ylq+43 zn`Pf%D?rtg^fo!?BXnlU_)ND#UKDQV$-|R}f2l7lp zra=}OiNC|kohv+-|M>pB?ID+QxXh&<@A?O_*mC4Lv`j&6X+lniEH@Inu5d1vTrK!_ zZL5&W-h(NXdc5mC$O_BR+LMrX6Y>FMrIFZmrE`US%J~Ck^$oe4jb$$NcvrbS3UW&< zN3I5tH3?}8S!*PA^>D6=8l#SGS88&|Wgp0tNIqdo&~whmZP;}AX^f0I%KPn*mbpYg?-B0S_=sEx%`}%QmMzY zaggnnqqXNCKO|%YWT%nXb&Yd{Bda!hUlJX4Z)QrR9`7pLt01?_asseJN@LWHQ%9c~ za`^;T=2DM$)hSz$D{ncPI2lqQA(uib8HrujIaf7}QAaP|eL~3PYAaJJ^?29QkV4DR z+I&d$gnSFBXe4%B?_4ao>bFSmj`O*^uV8QQQjceiAqQBFM!G_Z5;6!<+eqx{JK zb!DHqbwV!JJ2RJhyz2uXW$s*|z&1%jGZNu}G=My9Pr#S&r78fpkvD>yR!+ zV%JU16}I!u{`l*ckjquT%%vXh`VZ3Ga^$MMZ$Yj{LK;K58i`#uJ6CwjpSVw*P9c|b zA*NL7@vfneo|dDvDUeQkdohuyMwEITq0zQ|0BvUH&c=iCKpXF%n1xWvdybl>y-Pjb)e!Q8 z<;c|$GCd*JLuMF>U3WMaORf(6pMEcn&*iK)bE(I(*^rr*qmlO^PbOp|WVVsm)!(_o zbGbst<0pn(KGm7I)Z<-8A5f5c%5vm74Kg<&7eeM6iCuR(S9pFEJoET~kjwLmDV2J> z>nX@W%hB2*$l`>230Z0+b`5Z@aD3S0ussR&xxCLPbE(I(BM#)~-E!n=4OyO$iy*L4Q-XCUF%! zk9XCn#Cd_`$aNZIT|%yeyk{hK-Q`?iU-`uEdR-&jhr^jtsmHU~kd2n3wT~g26Y>*e zi;>uMw{sn;G3td;-J)~zij}=fJ>GQ&WUJ+9;tI(2gbarKY$SFKcCI5dMpgRkmp4N$ zuWe;6^?27B$S;O za{F11T!%rbC*%}Jk&)On%(=pLe&C0pbV%Koz z;z#M~!8-k34Y|BJkh#?3UF8qrOu=$AQWw%7A*~?|jl`}I&K0&%1sCq~XvpRI22(2a zc-Lr1Bg@g+3y`J>Sq5otBzE2BT;V)r?@^`i3%R^XoVnEFT?bU-Slx2uIv&z8A?H9^ z8;M;bo$D}-QQseQ^N5hk)hnh{>hZ4ekhYeiwONpM33&_B#7OMA-?_ri>*X6?h#vFb zW-j%3*Zv1{USK(L9S!M}koJ(yMq<|}=L-AE1NXWqI$yq$DV2J>Yb>OThZ2NkolIQwH}a#2^kAnY$SF~bgr;ZIpFcTUJJRryDf96$Gg6P zEVUfDc0-mYhZ3dAnPngYY##;CS*2bvys^Km~(~e*w4TIPt%agwk~t2$Gi5fU6A{q<;Zm?WJ^Mt zK(-o*U5_WOw_g5vUdZLVfGL%Fyz3FjCd<* z*O^N_-qq-E&I>F@6X!v4JU#RK${QfxTTkqI!ns&-Rl2a%Cn1+(P~}kS@vhe)Ws>Ai zA!QTtJEXjk*!84yh2y9mK{*V9`T92;^u^Q*%mr5^7(6S9}( zXzfZ!Q9|y3)HV{ko^~#lT>X0Q8?{3&`~J+O9`9NVscShJSqrJ3knNBLMq<}A=L-Af za_fG*IOOu#ow_Vi>hZ2qAq_1@YnMWrCZrg0oRQe|jB|0vxw`DgAi)=2Dn z*15uCJzGa-QXA?HWkugbajqF%r9;cdoEc`D)r94~1Ml*~*kkJ>Inp(%o{j_C4hMgp@jp zV}2vCYld@$eaeGn`aTtMIqzmlr5^7(AJWlsw00w;XF`TSdKrmbFF04YzVY=-8*dG{ zJk~Rpdc12bq}X!g`V&%;kb~=Ugl{Bvz35!w`0&?9Cv^_Fe7=P#m3q9ZJEX7WXzdhZ2$AVVxiuChmSgrATjAh#HaT{E34>{Es` z-x0l*-JU6xdc11@WTfS2Z9HU5LSBO0Y9w~ea;~tAy0+H8H-}t4Wt+Lw<6WhX;k>|d zhX^=@qV%MwA6^?sLw_Q3U# zT;V#~&sX-jKIHN#5~ft@@vb`{i!DcM4?&hDhZ22kasLcYfnH{CS*Qj zjgi>(x^r=1$km)D^jmX%F3+#br5?}99?yA!2#I83ISMJ6e-VeEa@*{Jp$Gd8uz znM*z1Ri`2UD_P&Wxn72pw;Zi~2&s^e zpCAQBV%J;F6}IyuHsAbP-c`1dcd5tUuBMPmmLu2skWvY`5mIO*b}e+Sa11b{!{5V0 zF2`({OFiDT1XA5{9dc12Hs{vxkHdP^hx37wa39uZN~IppxGRI zq>JTfZ4{(?LZ(B`Hxj#+I#)P1KYm<`XF@LTE67~x@h*Mvw1?%$RT zdc5l<$QaAf+DORwgiM7@FcP~ya;~tQUp1@Gi6NKw?PM&8kjq~u&0Om7u7Z}F7g&x) zszc@^q!DDLk=V7$xx%*h;5kRE54l`7W=f?V?-~YKV>w!T60$ZSb0F)C#IDuO70$mF z{|msQ#miN9J!8y>`cfRknfDdt}mP` zTtDppLCs|$m+Qt%snp|L6Ck@RM{9G{!)_vfg#Rg|jFH&&rE`Vn@}{#FT^Vxu9C_wa zk9Qq(T0!pL#B~~^tR>6d6;j?v?E1>N!m((%iRaxGa{0_3Q!4d%*He%RmZP;rkll&> z3rHpFiCt@*D;#5g)u2@L*!VMZsmHtOw&uLRa^z|Q`7d#mK&o3$?E2cd!sGD0d3Q$V zuw$4~smHtCf)rVf*49F5CuBFIu94XFjdO*cSJ#JI?h$f%jGgXX>hZ3NAoVRrt^trE z6EX?Xz)0-+*15v|YjpKl141tEEzDf%@vbe9hL$7OK4)+|pO9LRdPZW`I_KgJceV2N zRgFU~`xK^B>hZ2(NOQ~4+9*iNgggg1%1G>5pSb!?Ys_Je&*d+{XD;=4_7|kJ<;Yc` z4M+G1IRVnnNbK6+Tw!~-_|bmdLN420rc~GQ^q^IS`)fLh!A$LNGjl`}^&J~`^ zZ#HjRE9CO|g3P5J@A?>0VmWgC0O^;Ig0l*8eT>Ae@12V!S1TSKup{JhfrcrSdc5mg zNPo-G+I5gY2^j#n$w=(l>|EjJwPX6ND?=`?-DEEHWVZ`4#B${N4svrsc0q<2iCsT9 zS2*4{qSph_`<5%7%_5~9?`jJfX*pW!0vVH#TOs3(#I7HmE1aiP`|Af9`lzP0Y4P=VtXstWsp@a;9Of?d_ zwm4UK9A5OuThV)#o?uF)9`9NKdDwEa_6uZsLdv%1nBPe3`q{a{etFK~iXB2OSGAc^ zsmHs{hs?Abt@VY>PRMA;TqCjT7v~Ds97b(E>)(*e>y%8X)Z<;>K;~PH*8YPmOi1-} z3UaR-iCw=sS9olkU-$W!LoUBpiz$_Qyz3gsV$0Fm2#9_!L;g5w24ty`*tONU!hQJV zA8notxm*XxT1 z9NVlsymhOP%eIawm3qAEA;@aW(b}t!%?bGwvc*X3+U{K8`PJ~iC%K6}m)~iSxzyv? zLFaK^U^#M~0NI|9c974F#I8S_tG33ddw>siQ7%hB3fkX;G+Qd2yM z{3A1V{pnn_G)6u6(X0D}Ts~irxzyub4bJD+^)t~z8M`yJ(#)F<6TQ2hggnW z>mUshvJKMENbK6>Twxovc0x@)7UOgIZGacBNU6uO=8&3}qqU15O%qZKX>KHT{p(y@ zly~*doX5+DT+RzJmwLSG9Y{;d(Z~i!>xArvv^5gDb~_hKuKs%L(Pu+0ucBYbBBdVh zY6CglaxGAsvjwuK%2CUyV_}KHF-0$mNyN%%vXhnh!a{ay0P;q*Frvgmg9% zyA)Eopn}Gz>K9HpJmhj7cagtc>hZ4QAzds-6Q@DiB;;~PcO$W@z`4R>qtU)MJ|A*9 zmdIS{@va$=9+o55LP*bqd;;lZBzBc@E^dsgk8Z6J9b<3FT4!)Q(1pUP;L1cSkU#Qjd2{fef=8t-THz znUJp_V~oTueV(#(0WUVVI{2maH-ucC0hufRnakRja9&_J8aWj*At7BL_Zx{_dpTFw zr~Ll&f8Fw~Axx>%<8Rk2$YjgW+WU|x3E2o4Wh8c$b*^x{QL{sZOG7UA-KE~89`9-h z8ErXob%IPyNN>n=Be6@r$u<8sF6SN8@-c`Aazg_C_x2rW|uI0#e6=Z%w218yj61&Pd*P$AtN)=pue#qs$o0&^J z-t{%)Ma$8|-;jj~soa%gej~A~ymN))`J0PZw+gxZo*brB>hZ2iAxkYsYsHY|2^kA{ z$w=(l*SW%ZN`v>G+Arkt9<0oz9`D)!Sz$SH?S`yONcGD&!Z#AT_H(Y|HAWpi_@oO% zF29G0DV2J>t2bn=UiGS(Bj4s@>Yx|k!NLkBKa(l?1iR&6jdFzQ? zm7FVle!1?}-n~OE?=8$+>hZ2OAv==fFCY~xS@vC!N=9N=W#{5V$kowjuDLVh^1gyA z{OwYYcQt|(T8>6KLaHaEKcvV=?5g5i;XZ8p;93sfd@g5WnM*yMErZmy9Jw|^Y9yrW zl^pXMiCtBl>qw1J9pCuuzL3jjCz(>I$Gf^h>RXQ1`a%v#$b*muMq*c?bA{*Ekgvu) z5psE7Z{|{ucYOK`M z8xCoikY^yRjl`~M&J`YqThH6JCFJrcoXn*j@A?dqDRUyolDf2R1e%%vXh+70P! zIdavynj`##G=sD;61!?RS2%}lGp^bNA(w40Q!4d%*HB1z%hB3YNRNapfb=vHyAE-# zaJyQZdgxOjm)8z6mwLQw&ucg@upGIHAeSek1*F(W?5gQp;W7WsHQ!GTxqNn#DV2J> zYZ#=&a^juB!sGCZ)2E*oa{0U!Q!4d%*BHnU%hB5NkYNdV4>Hn7?5gElhiZ%(_nkgp<#YM_ zpP5TNo>jV*^8(A!#4(WJ326fvZzOgd=3GZ>j2fF;j5fHsGo@0GXAeRqSdP|SfJ{!v zQpgA+v8%Rog>$`6ets>wMzk(-smHtaxvn60pXJC^4>Bbor$MF~iCu>~SNM7Ly8pD* zA(z(_m{O_7yB>f{w;Zj#0GW}HC6Jj$V%HJQRZ(Nqi7P8k4Y{0GW-j%3*Z$XYUSK(z zs0W#qkdBbKMq*bT=L+Xvhwf-PG34?ZB2y~$c-KV8e9O_=Ymk={vJtY-NbIWXT;cik z+&=Gd6MZg64w*|mp4IPFkbA{);Qjd2{ zhb*@ot-TFdk&rJSD~-gidd?M&Mc4HHY(vQ9dT-`Zk9Qs0n``fuBUgLKnuPR*tTht5 zj&iQB?d|zimFq(;=LJlu)Z<;VAge7$Yo9>YCFBRlMkBGSzH^1gMx)yXy&H1*T+$8R zr5^8U1o_-@|)zU1wi*`4=IVzde+>)Z<-qAzLj+t}h|m6S57m z(@5+(#<{}r{Kb3M+Yxd(Ke^H0F7pVz# z%h5lzs1$kjv-wGM9S1>kCLF%aLmvq%a}-^x+8KNbEY^ zxx(|S)tA+mgj^o$OsUl4UELr>mZP;nklG1(7*g3t>^i}@xOnaA{SRNdC*<-PQ07vP zcdduiwH%H73#p%wLvAX_RWTB~8ah{aetq#`t>|{0&Xh_$-gOhCf#qmz9HeSOUW7C> z61y5XS9pFs*uK$%kjpi+%%vXh+74-IIdYY|nIrs!)PuA%61y5FuG*8kJs5I%FELXp z^?28fkk*!?wc(Hx6Y?yit&!N(#JLXD7*(a#anW_rrI|}T-t{k}o#klakdlJjNeO8I z>0l&wHFd6VEZTlT&$c0#Ge4$O>hZ3-A+{YWC#_KOwClJ&eSzlM>gd)AoNQK;(WVq#MVi#m&LMry-nBPe3I>oud z&+Ck5|N1cGvdv{mr5^9<2^nuWS{n`-k&q`L6O6>Jmd+Kf1B`CoY(vQ9cVA~N^?277 z$YjfrYv0>Ao=?bOko%0pu2#+!_FwgOc4F7s03o&*f&ncby$_IeyMu>hZ2kkeQYv*B-ZXH9jGSLS`F@U8gx$cpOf6W$J$+m&ZC& zD)o5R^^m!iqqVV+`3ZR*@}iO0)!MmgX^d)L`|s`{mwig+Qjd4-hAgxkO;ovqtMLh` z2U%<+cAf5A96Y(&x!=(GA(w3eQ!4d%*A0-RmZP^j4_!oKq5b4q^~ za`~P4nM*z1^$p~G%aQ9J$jXEq*qkhPYhwce0* z3AqQd%t-8N>s&<|qo%BTzJ18e<(|%5>hZ3xAsa166aPRyNJ#ZNIl?y*yUuj3@HqUw z&v(&lZ6`3LQjd3C0oh_XS{n%2nvka;+l|Dovz#lO>%DNyYb!!7?~%@2>hZ4sL4LCw zx%M2unLQT|P<%UeD)Z<-UMT)|Cf!0bOWfC$H^85ekYUff~$G7`Ja zb*^yD;i&(8{bb1HZx}PBQjd3ahg7p1t=$2soscn*x<+DG2j>d=l-oP~5WUB2dgfA( zcYOt^Z#k%Pze5@%q~cu#xr2?wuJfEL?3eFaI{3?w%X`R~QmMzgdP5poj@E`knkHl_ zq`8sUb-r^|(-?KcwfnCRxm-`kTk*k=WJIxvJn%J@xU+ zZ-iW)S4^qY<6XBw+7`vGv5A zKbSLxgd7IxWF&T7;9TLcam~RO&JDR7TQj9nk9YNkbhaF=4S{q?$Ye-&BeCm3=L-9; z1&dl;8FJZwF{M(EcYOotVL4j+1JW}g<%SgSn+n7I9J?-ZuJG7cd%@_1A(wYBF{M(E zcbx<2RTOfxb~WUZgbacd8;M<=ohv-%$DUpDmypYGZ{|{ucYO#cu^d#n^^krE*$KJS zNbI`Ux!6>?+PwLp>q0J{cNpq#mwLRbC8WRQXrwD-P(p5k3^5YBE^)5P8lygbcXjWO z%ln@*mwLQw4rEwSd>?)U8JUm`kUNdUu1lTkP&}&V=j{{iEC0@1>hZ2)@8P_lD0a1m zj88}x$N(d;tBZ4m$Hpg}+m8*oT$5o+r5^8k88X3gwDvw^azeg_3^WqEx;j_bf6eN9 z<&7biYciQjJ>FISUd|LO2UV^WWNJb#hfFsTyDoFCu#LLpud~k!x%^E6rc~T~*wxLs!gF~_jU9tSE}uQfT3)hupCsm`jEK^X$_fXBzARA zT+?TEiQdE6l_`~aylWU_zU64`S;)eKEPy;?Bz9fyTw&Y0`mCR$&sMC-TgejGJylXJz-J1c2k(6zayb`b zN~Ip}x&`uHQS2HAS(lL6kc~!S*Hz9H9*1XbI(l5l~a=9MLluA9`brod05Yr7MTSpYdx{+TIUKsufHB|ep|@pv#yy-J>Ip~{hTRSj*@FZDkP)>q>_=? zb)9pCZSTG{hn5bxyg!O5m3qAE2}otj(b`9l!i4OGR5ud4u6M3*ANGB&?GquF_oIv| zP+U$u-gOS7$a1uHHKcYz?t)Y?61#diR}GC(Ek3UISjgqt=v+k_qqdFs@|KXx`-qrQsmHr+hP1XE zt&NAYO~^dRNk(E}Xqmbuj9U3-k>`n=`HRRhv4A*~=CjKr=!&K0&% zojbg>Jmm6zTBcO$@ves;oh(Odb0D1)vI5e@NbI`FxsKEr)pJ9+Eg?6T+nl-7<6Si# z;BR|bjwTvIx+kOyq=%8%b+dCFrZKAXH?Msaa=B*CluA9`^*p4fE9`uD;F{9`og@Z|E6vIm^sk z>hZ46A^j{zuD>Du6H;wFNBBl!*DZ$GdKUjJF)EjfM#ZsFA z9JvmLtVzhxkVQsf*Pz68X<`599JV!6D)o5R9gww_qqT=2?n`UyLSxk3 zUmg;j>n+J#>hZ3BAR8@56BQ?NgrAUOAX|*YuDhKpT(?>5f)>4LDY{PFQKjt;qeRw#3+ zhc9ZM$($Ehjz}#?`GlMdsbC~_-9t!eeI(h{jF(69wtbMROPNxs$FnhzO10wK^&F%y zA#Xz}8i`%^5>mP#Y!9zIvf=iS%k{dNV%Km&N*7et7>5Ex>4LEBeWXfZbWN{4Q!4fFMcn~8&T>S?L7FCHCZxHM z*mWNvdDogcrQZ*^{Jpl!r5?VhGLIMJT3U`sHOTP^IUds5NbDL(Na=!bj9p<()#!Zr zJf>9Y;fuN(a)RZEOn|ga$Q(#JBeCm#Lh{eA4?C9M8glu0WiIvbMeRL>^8(8esRQYh zkTW2ijl`}|gp@7_=di7B=rSnea(>E`NJ>;Y z%Mn=xxilfaLW+&VuCavVe_oSc`mk}xOdY5|mqS`=8EJx%TNWX*(f%G>LyB;8< zbOB4QK6&=zXxsaE=28z|)Jn)8n#=HSPqsjAOURy2afELqc8y~szl}PiUZqn)N-kH# zluA8(Q5QgNw;Yk1Aj1+e6f)9C>>5u9FdKX@d^1G za)*)F^&lbn?fj%}?Z$>&wslke?NSe4RBOlt%MrO8GC3i)K&BXpT@MkG-$uRkar^Zl zm-{YrsfRD>ZOBy15m^P9o{%3Qj~Izv4-=B#S6+DDiw}of_QFs5+oc}9s8b*_EJvgx zWMV>YfXp-!yCx8lzg@rVzHn#A&E@XPToG#|&*cUMXGPnMr!$v&_@Y)pwpfnHFOc;KsrD?#{6=Ee z<%rw}*_n_LkPSv+*AznXzklPvAD7${a{2sD z=28z|)GEk#mLu}#|6}Yt;C#5cKK{2#^iD+GuzFj9h#;$XK@db)U9{+ytX`v&jTS^F zvSEqdqb^p7-lJ?-C3>&#IcLtjbI*I9XP*Cj-Y1`ZzyDvExzp!AyMVkAmiWzf~5H^o-c_eX4fL>Qtx6V@m;N>a$&i^g%fI=u0}vI=^Xs5 z2au$KOaziu6SHeEbp@jhrgsGk8P5S$a2INvuD^i<>Kt^u0TLw0hmrAo$uu#$mQa^k zt`jeo#aFp-lmHh_sByYl1Iedz@Uw6rg#?)nBv=!(YbkZ9=QeqE-hHET;rTpwp~mUD z1f+z{!LHXpN(++icev))#Ozu|UFv(H(79n>t6X?K4=$Wg<8*ZZQe5ZYXCr`=6=Wfh z5KYXk<MK&oqEcKu3S>UdZ?O$oT2 zb#mcs1umRW>QY&ej5f-C{jP!qFj1$C)=y>BnRDynkfStWO&#_4(tq>0YK zuB5Br3SW?1KpJUccKt?O>RzvY|6=DE7|2LL)&Uu-iP;rJU1|)=C4bsd z<-%PFccI4VO1uW{3v>>4Wd`!SASHoJ(ZuXpOwMKNk4CwJn<-))5#9gRyx_p1YeSyxwu8ctD3Q`itVol7hKd37; z+F+Vd|7v}m>uU%uoKWL*g#%fxbMUhtfkXb3bF^t zPEE|N_0*LDZ7{8>nW~V=_4)qcF4Q<(N!G!AfzClkK_Ht1sSG4q6SHdrb*VAT6`g34 z%7u58z=acPoUTbgVss9EwhG8GK@I}htclsRk-F5gog%fI=uIWH7>Ky!R6_6`}90C%niP^Q8 zy41O{Oz`zeDi{9V7k8n?>B_zV{uVs%bq;>k9Y|_HrT|H(iP^P-y43pG)Fy?oTpPIyHBMJ7kVHBM zyW($#dj~;s0m-C^*|k%2<*n0qugZmMHgMsD8mFrrkgPffKN}3>13`WU5~zvU^(S?y z^|kMIA!E6Aa2INvuDd{jbPjf<+5%Vjg5&{GNE5Sb7j>y)RECmOyQp0FckRK26Kb5U zu|Nvz9Qr`&}ahvnM}cM3WOyS@NYM39a^ z%4%YE?V&DpJWN{X;KwQ#o^OB)C)7AyJAf3`Ir!OSAR&Up+XmPCnwVXCsY`A1Rkr=D zb75Zw7fz^gx@rKau5<9SP$0Dh833f7CT7<@>QeW5-71`b)25RP&lj$P zu77|u6yz9J^M?Jo}ypqa=_rA6}%Y_=Jt1*z~ItROY0tpplERedIm|fA- zrPkN7R=<6(a^aqVyHMkFT?X={&cUviK-vkCW(Qp1YhrdCpf0t(s@3lZU;jF}@OQDm zg%fHV)&xjbor9nC0n$T|DM0#YVs;&*E_IAbKJOXSs;(&RLXE>N0twSO*!2WRxF8vJ z!oL@wiP?3Cy3{%4b)^bBR4)8IYH;C%8mFrbkfAyUKN|t0mmu?jjMT*JilHv}LxeQt zUp#TT%7yz%?m~^zbqB~;or9M2f5H{MAf_=IK3BOAwA<-I zjnnlBkVu__U5$bKEJzO^QJR=te^FNsw82#KlX=fnE_`>xU8r%o{sOXA=b+;*kd1<* z+5=bknwVY3sY{JvOsOfqt6ZP27`SjkjnmZ*$TppWpZx@6ry#3#e-)HXkDf74nj7yd3ExNt&^)3pT1 z4xNLa9RzYrko!PRYGQVsqAv9g%s1^nIjnNw`OiM53pGwx2#~Wn2fNw>xhTjmAXhXo zyG~P=x`*u;ZyP)kaB|_DF785&!*&8Wr*p9DA0V-Uyap1diP?3Ay3}%&|7VPGoKL^s zSuWH#T{VH6*E!hr9gw?%i~;gM6SM0qb*XLsede!2R4zPI<}TDYUFU&Z&^g%k9>^0x z(niA-z9weZIqFi^Yn)Jvf}}nG|3;XeAG7NMb)`WYO#4HQR8+Ze z{sI?HsByZQ14%8CzXOt9knup?{l~70)TQ>Xgq2@Msa#kt?m~^zbsk72k^CIUd!3AP zmg*o}^J|T{T$iXzE!W+bZI`KBc=rihIHAVrss$ua=iq0pfCLE=4kVu@X4hrvQpc#a z-@Y;4ftkr&sByY>11Y3)uXWlnF1&>TE}T%~bX5dWS?Azq?SNDlWB`!bnwVYJs7u}JjXBw`o63dX zso^fvI9pFpxev z2fJ9P$kY1XYU2)W< zwvA@T<~3KjuzztEYMicJKt}2u>^cjiw;->9jMc>Kx=zLFZss6ChIr=?Wx56SM0!bp@ggrcE_#zErvJJsNkR#_8G&WTMVN$6r8Z3K9oo zjwWW;9qNKda5UxU_uCDX3*P{97iyfYPyUMMo3C@wQUk~&LD~RWtclrmm%7w>dH#qV zeN`^JF99x`P~&t(0-3CH@Uv(j%LTa#BvKQz>tE_p+s2Gvwi(}lJ?AdeI9(qfhx-DZ zgI%8jSu03GAR9F?yY5k!+BWjlZ?aD1!g7HNC)7Ayi-2s^Ir!OLAnOGA2gpuM%&z;? zrLF-|3@Lv{<-+&x+=UvatI!F!FVH#IRRPF)LD~a}*2L_3KwawDSNI>1%T+GC^$ISW zP~&v{4kSkB;Ah8x924XQkPVucT@R^CZ5yZ0)w-#2A?T#jg&L=;B#@Ij2fOM6IV(s< zAQv?;yB<*&JcOcY$*ZEqHNZITLXFe41;`bhgO=k!P6=`kNUSDi*JJ8Z+hLM=vy68* z)17jb3pGwxIUsR52fG>oxhqJ2Ag47kyPi;&dX|#+Y|R-e7oM|m7iyfYBS0SL9PEk( z@{ z4Wzmtsn5fexgbG63Tk4uzZLDvv(GK2n&2-uf(s|qIPG15)YCcm*(e|l1(^+`i6EPS zG}pvze@E@=N!O|Lw_;Qi+_ixVC)7CYNiV<^wa&rM3Ib^-NL3&$1ZfAPlO|^Sdumt5 zsA~h>4_8g_-4?iTLXFcN1*EIa!OvoVv=rnvkRF1>zX(^$nwagr_;{zOt_r?emw2CQ zf(IGkq6sukdwn3SbPj&j4M>r| z+Y?Z`dU8_#dJ^MKd>y!OLXFdY8Azng!Oxxpi4r8u-|$yA1t|n%ttMuBLTXp*{hvVx zx2Y!hdtczf2{lgpKp-1+4t^E^WUC-6f$S9I5Rg5ZnC*$EJrxGQlrW^+MAZaOi@=2w zYMl1?SK!K1=ip~KfW!z=8ptt0Y601#iP`>vSoZGk>h@Ai@cSv?!U;7_`*a|ibq;>E z639tG4gxtVNGyO!??S72QHjY%IJe41cR8c)Jf=IHAUAuLtCf&cV+*q9(7p_Cpd59PeD_3qFp$(*W40%!c6F?qmvh)#)datH11_9U zn4y1%2JAmXD zohUj(@=XZ41y_T zu?a9Es=Wlba6*m4z6H`y=iq00XCTc5*$gC96SF-nwW}-Yoinx=Pu^m{g%fI= z_INkpDo*F%XPJO>5~LuIu7Xqs(n1rnJsq{HE9%1SQ?^u1@OR?Cg%fI=_VGYk>Ky#+ zS0FtE*#e}GAg6$YX=1jg7wx}qo83Y+!Cxo>7fz^g+B3(&b)C+^&&mJ^7oJp;9?E9zkje>$j|e7-^8!U;7_dlZndItM?C1~NgA8$hNA;=2XcW15)l8L3@8 zA%8IRLIc$V>l<7+p~h*i3S_3v!OvO%nJCCGAaewn17yA?X8VWKuI?f~ocXP>zpnxp zPN;F(&jVSkbMUiAK$Z)V;x;_J6r>E0NKMT4Ok&w*T>ZSCYJ#UU;KB(tPWvbzQ91`d zn+IgAAe(?}6yz9?$(oq$A5puyuKRn?H^wvkN8rKp-ept%FI6u5UN&~Ygc_%7E|5o}Yafv0IvLehfTR}W6_E6rnC*eo zu15Zo`0LN9COFpJciK_ow3h~wN#|f!10Y!i=>i1bJ9o!tIFQGBp3U};sa=iy-o6)( zs3!P55OCpy8mIjdkRXx#97sMv(ma5xI6?9Q3D(4H&q?j-ZTV6IYki=a;O%s9;e;Be zy*-c;ItM=s2U1#)=|FM|vIa<5P0aRO)UM8P)%qQWueF^fcqRiboKWMi_dr5)4t|#L zVLV?RL5c#YEJ$@A)ip8OgQ#6yT@>rS$an)M6kIr=#%Z4fB(KiF&sG4bEyyk)^#nNw zq@gBedv0nE#2}br(r`FggP&!20@rMUdPiPwnbh7aafCcd7~gtqpMDgc_%P4Uh>s2R}Os zWQrg+fkX%r|0!ILX=1h)pmuc!{rmoG#%~zq1Q$-IaoWEGGE3*+XI+5I5o8RI`GU*^ zvRD(dy&$!#^LyKYtBhxr8^DDVYMl0qK$hzq{OkpgNI{Z5gSSitDF`G=6SKXLSoX-} zU1zE$_&X=y!U;7_dmkWcbq;1=$DWtROdl?A63^6z z`U8m-WGs;VfzkOzXKdI{HBg5(GCLXfY4yb+`i z5Fh+8QunH06p#dhECP~PkgY&oik!1Rk_*jkAgKk3_X@s?6s{m3>4l~|kW7L!0g_da za3HTm&T=4uLh~n(AVJOp$tTErAcX|U{u-`H1Stumgdkr6DJ@7xAcX}P0;H@U3xR|P zvIR&HK`sEPEXX4u)dflL2F~w-WCv1DkYFGU1*r$5s34tyG!bMdkmiES1QII9Z$R1! zvI|HjK`sO7D#!~UJp{@87S5G|d;;WKLFxku6XaVU;ew0=GE|VcKspPu705_I{sJ;q zkbi)55hU3=IL8SR1Z0XJje$f6(h0~+K?VVtBgjucrV0`XWWFGKfh-o}9FXOLJOL6Z zNRs#QeA5KU2P8_6NokhegN z36cShxF-e459F*Mm4F-;q&1L>f(!(5MUbgLVg*?WBut3JCC} z7bG8$M1q6>$s|ZqAXx?J3nWmGi9mt`Spp=VAUlA3Ajm}^g#>vDBv_DS@dJD%1PKCC zT967r$_mmDNQfZafD{vCDv-*8{0gMHAlrb{7UTku;)1*eQcsZd2?Bf#1<3=Xi69|B znhWw3kWU2Z10+=>?>VAmf0H6=W`u34*KxGDVR6Kq3VB7syOO;w1|3%@HI$kokfX z0khOwb1F}(&XF#?JlH`K`-%de31~NmC z@<8?o(f~-bAiaUa2r?bWF+o-UIVs3CAZGCL4E{sRFI88o(OUX$O}RK2J%Lb*Fby)&7*PlBycnqqy&(}f>Z~R zT#!&8sRii;B%UDifTR~>9gs|d><5xnkPAQp1$hD_K#=rF;b<&K9w6}rsRSgSAfZ4C z3DOTpupr}sln`VgkkW!|2U1p$3qV2yc?je)K{6$Sqp={tK&lH;1xOh|S^}vpNG~Au z1Q`RQp&;{s;J;h!-T|!y(p-=|Kt31bB9Kr)-UDeTNSfquG!`TukgkG+0O=t}6CiyA z=?o-HkfA_&3bF)9xFFks^b+JekfDM+12R&O6e-}?D@bl2y#*-?WP%_KfJ_mj3y=sw zMgo~B$YLOK1lbB?z91)nEEePzkmZ5|q=cifAen(I5#$pfQG(O}vR055K$Z$J0LVr` zrU2P0$ge$l3X(bl9D4;R0;HE9HGzy3qy>-( zf(!&QMUZJgA_Q3lq_-dkfy@--7LYlD1Z0Gxu^^d&EEc3BkmZ8Z1`;VqJ0MYl3<0uM zkXb+$2(lW;MnMh%*(%5tAPWU~31p`r=|6;{u^@&aimNC=Q>g0u$GNsvK6x(YHINDo1F0O=#hF(6@r+yN3UNTO_T>=h&TL6EsXrU1o;xkWkGrXc_PR}ATKm2(x-h`pP+8t@ms-Q`o6Lb`~=5hU$b8QCc*E}z)wZm zwQtk6W6)Rdqpuigh62WK6LAWTk3X3?#YyuSeF|?hq+i&_&iRBip+-(|E2ji$azGBw z&(hb+m)bccN%ICiSMyWC$|*$}{F@k<^I3r(F4;MsS~;bxoYJJhH)r4n->*eyZm@Gc zBTX!P4zCo^RNBfZLz=emX%hHfwr@h7**Tw+2FE#t6XPpm<&^a!ryOa<8aZXHobrC; zd_kHiMoxJvCxkTK<5Ph&4`7+p_=H$F6-iSHH1LJFFMUH_Z+m=m?oKVtifgF72CZbmLDRxe4(p-cb^)^_jmD7ea-up#c(wN7eHdanM zKXTfW#@wFUSveg@RKF{P~tNdjP9<^*UKO zok`<8K3zy-9ydB$IbBK97Utl;p9i~<#yo#@wQ{jKR=SjyuX-ca^{f6dpn#<8gu`eW97{AV}5=i%@kvP=29Qc34`F#Ot z62pHB^K#9%au$-NEqwmp$9WNHMjG?8(8^g%8t?PP64IFG<;7OcQqp*j^D@$y$N8mJ z&T`UtZ->8<#ymbRw{ljHW(F)fo}2y-EkD~H=if+k63$<^E^u05dVO$o@Uh9NMmv~r?I<2}x+Nn?(4 zl$EoFG~Vm|57L3mUeeTq{Q~zv zoc35b`$*$`U%8(&_(vJkedRtYCz>?g%XNS>=JSMTE9W3-yvO+vY0T~Cpp_Hj$NU^7 zjk$ltSUE>XE>oBx=X>#UV? zo;05%^!f1EQLJwMop#Oz(!{_6*g>3g-paX18t>)0L>hB@zG&rKCXM$v|4kb6Imu-! z=L%`?iOQES&;RBelG9$UtE7p6{hhwf0NoWU=Nf6em+Lxd%=?0CR!%HwypJ3Ikj6Z2 z#9BEwNaMYK-6V~Rx+?viE+tbR;0Agl%3ukGgB++#`+m_H&;!=6UCymGgi!-sAI-H0E+WuyP*xk@J`|=5h6rmGgu& z-plorH0E+Wv2vb~#(SKfljfK)&d;oz7o=$m>*~MX7rZ2mdH?mo%6UZ^@9V?Yq%p4# zUs*YCNYmDHe%_MCyl;AA<-8+}_j-R%8gsvRXXW6F4)No8FIPO$n9s+23E)61zCR5h zjraPBPa1Q51z0%=NaH;|2}xtFuLM?3BGPzohaZq81hyaCHgHO0D|P3XXDt)fFG{)guh$w-4Q6@7#=15;8fC%GTv`0w9WW+09E zePwzpCnITE!Df!v60b@Rdv7n-hopG|*Birdp$I8h{8t?5e8)@LxOg+w7t(@$n@qQkjgEaFYCpXVe zb}J{4G~UOtk4a-5#{#XKoTTv{=Uk*Q$2q5!6GR&C<4m6L}w-q*c(Nn>93 z=CN|}k;eNtmY+1{^?W`nr+^y#68t?U0jx;@t z^;Oo&DeuSpd_fxXdbPZj6XHis1=5(~6Jq65B#rleT8T8~ep=DWsq9Bi71EgdX=N*? zsvkMktof;G-p+dPEFF}hjp3-_MMUQ>cgLwf&WK5=dVSYCUCyM_vdh` zY30=RV}9z8#vJF`R!&{gc<&cqlEz%`b*&tH3Ku^fK9j&>%YS|kq&{h8!s6mRBTn_K zoCc)v-hRF!jk(?%SUC;-$Z2HdG_-OWlg4{L{hBo9ajdbG(}XnMn{v?Go8^-p`!nBOzDvvN9+#(R72 zNE&lL?O^3}B8~U<^DSx2_0`GB>Fme+bg|~Avz618G~WArH_}AFIII1=tCiE8G~VCG zeMcJe`?&5_P7l&}k55n1nEO``E2ozqIlW0^p5J>}Iekbo43<3??0;c#i)z~YXuXjraZ6Akx4uA?y3Ea4TmpX}s6_5Ym{(pTSnnP(N~pk;dG9hFUqp{m2<%uWq|%yAxPDR}!?Y~?H^jrTY&BaOK|FST-(lg9ge`YUO+ z8t2pHR?Z62ct4;2jWl~;xzzVoE3BMI(s-};-$`ShcOtEvm89_=pH-wWx5JfIP84ap z_tVv+G56CbD`$-#^YaI3%K=4Tyg%;!;St(^6K%+ChWnB%kF%GpR7@Ab8b zH0FM~(aPCO8t-x5LK^eDyxGdx>c{+SBTcMveBNs1Z1*E)2WiahaJ!YW(~q1#Nn;*= zc3L^RNaKBc-c6dd#_@TVm9xi>oV`}g9xG=bX}s6_e$trN^ZTrvXg}uXfHgnSR?a~` z=I0P;%=LB9%84P3_i^JeY0TqljFoeQG~UOa!!)Q`}?m`q%pt$I%(ycCJnx!+6eZ;3cpmnY+v`DAx&y{ z9^RDCgQu;Wv!wA}u5+X@@8ix|Ip;~^z1}a7#ylRLw{k9$#(TfGL>lvWc+twa>_^Vu zR?cNB=ZYUWS4m?Yf38?L*Zj!2Zq3g%D<_sT-p8?jNMjzyVy&DTr14%~H%VjOr`)h| z;z;AYf88QYoUwn!Svj{!;lHFYujlVtIrm88{T$#vY0UQl z?pZkxNaH=u4@qP07Z0qQN2KxIFCLS|JYPJra-NXJd%2#HCb98+Lq zD+crY`e^R{_VM{WX+q%`UXqvVot1-sf*^i8@9ifZY0Ul9mk^MA|A#c*`xm}^6hEGM z{tB>ia0dU^{Gcg*Jac@*nZS|M2W4Oq@?lw{wo=2 zn!`F(-+v{wa+3QoKPgCK-lrtDa#E7Udpk@;8uPr9(#pZJfBbmf_orz{v(dOeO>O0* zC5`uXn2t2&dQWTRq$iE{a%CWmxm@Y3oQ!_td`KGec$m@3$>c}QN2I~8L)G)BOjb^2 zKXS5=#=L&cY~^J2BPSbaVqp(g^OM!e$xa&Y{XGY1%VvHU$8Flnau9M+HfiZ zgZSP&KWUx-#&_Ou%4g*iAdUC>Do7gh_*}rsDMXqj(1G*(pWlBjOq!iAKk7MBAuFc{ zX}tH-qNFkRuOe1XFloH6SBsHmEzFO4E*fm*6!&9(@V5`*$1~5%#jTtYe&m!Sjk#PU ztejGQZDl$%lzN>_Zp;$G4}WBR!&XQ zcpraik){visOK9st(@AV84v#*2JR3? zk7q7dODiXoG~Vm0HEGQC6>82{9Dh1lIh{#!6LRnw?0^3Ki!P)wf4`u!m4j!2 z|F!*eBaONJbhUE2lg9hKg6~N40>($ZSJ2(c=|LLr^Kwtp)HBY@J*=Ewr13tk_9l&a zTS5Ym|Ei@{dTP||om9~(v*^Lge_D`z-qyr0vKAk7t6F7-Xg za4Tn|AM-QHnxBzY&S=tjpTEYC#ynq)wsOXj#(Vqufi&j*`&cVyoFDUpd!Kx+HO|VJ zK$>;1FMk2Yv3xZH-`Uqc6G@XAu6rwi2B!&D&Lq-!pT8!PCKS5V^QcKy&J@ykkIz)n znETfhD`y&Myw}%{q%n`H)2y5bKj!Br(p-UYQTtbfl{4LsoEfAsmutF}Gm|vl%QcHM z=5o!na%TIH^D}A8>&)3!&Ky5-=2|&(teknI@jh<+LYkqlzo)>B5TKP#>zS3N6t~wn9s3~SUJZ? zpdB1%=MMj%1KU|QZV}P!+-gAMpBT*TwlqpoRp;TUSFw5 zW3I21R!(Ztc(1QCq%qf5YAYu#X}p&!9cj$#%(PZcdOvb9kftoGFLj@r-pa{H8t?V~ zA!*FxYDOz36KTAk&wu3151ik#!8*k$la-U%kNL?$8uNKeW-BMFA351bV;;w{S~=PM z$jM>lWVdnxN#lLp`!Q+E>)t>sCnssV_pe-}F`rB1v~q&{$jMC_^Y|QO<>Voa_x_ca zG&5m4ROk0RR!%=~VseqMJh&0~&X<^cs$Dcx0 zP7%_0k55t3nB!B#$_XZo_i_~@jk#RGR!(t0az3$gid#7)NR!FgjeYg=<9qNhpyGa~ zBx!K_!Luk%C9IrMqzR-?;rHm@9vE%sd`cSJo>fjME2lJRnu8`j{I6ik4BhOU&q%Wv zW>e*qwsOjlrZ~^fwrL~2v2#8rO;#hPjFnTCG-Wxb*}&reVSdVyriYPJ*2*bQnk<|X zk|iPBBK-ex{(>}kovD_qyphs~##wrmdhuJwbND~MLG59~4s#`fVNrUSP>U@*ZPlDH%@F(-%>8nK=#OiyQ znpRG2(%`>~hwko6K7!lt|DRKbH27YeTCUnwPF>P`#5vPW27GPjd`TMfJ-xbCPCe4V zA2ag7>DzbnzzkT#|35$VNfTqtPdzKA0co1S3X6h^l72N8T(xt)BFzLi8K~uIVC6I< zO)cnxAAHx(HE(L?G$Ktym`!yb*U-voOq%YA;amW^j_G5=?VPVkgMYC>t@p-OP7~7f zfMwbS^D`t#`&o8QQ_`G-|ElF`LOEdY{R02;qnezb)?4HdlX{5)X)XACXP7k5Q*{B)OdBJD*U^Pc9}GH7UpBvL;_MxuQu=Cf76> z&m>lpB}{H;vV%#SCg+&k*5omhyPBlHuPk7?r%7HW4>YO3O@=b5uE|m+H8nZFq_!rvnbg(f!#n}h zUQd%sOd4p?iAh6EBA7JRWD}Dnnw(?OOp`=;1E{OHCPkRE)TADhP)#~BX`{(hChauY z#-xKL*O+wD>7~hbCVe!CWztWRr1=A=D@>CD zOa^LFhe^05y_pQwB!bCMO;#}(uE{ATBQ<%-WV9yf3k1;ojMd~bCgU_|#$pYm%4AOigMtnXO3}lR28qWHL{ay-en7a+}FQO;X^? zgD@@Dq&SnMnlxjwT$8>`R%kMVNu(y5nXJ_0B$FsjUNKptNw&fPG(T%Ksmx@(CS93q z)MP4?&6=!bvQ?8)Otx$Ch{;Y(G8GA+_FbBkVzNh*Moji;(w|ARCJUGx)MO8n7)|al zIig91q5;%?Oq0?~j%(70$w^JZn4H#R7L&7@Y+-UCfbmCciLwqRBoc&osHq zAIEod)#L?}^qS--;k0MeB!o#OO+uMu)?^}+teUK3l3kNSOae8z z%_OHLNlQBIL7Eg~l1Gy|O!8^clSu(hrZ6d_$sbILXmXB8uqKI0Iqk(Y$;+gKCe@gf z(xfw!(wdBAQbvT?zD$%l9S0`O}=09ZnXbu0CNnijU(RWttw|{+b2MqnWS%AinatN@ z0h5KA>|wH4lUq!dYLd9T)4p7j0!&tDQk6-hCheK5)MN~kC{0!~S)<7XCTlfG@`cmB zUXub$HfmCb$!1MDGuf)iXeQe=S;}OmCP$d;(&Pb?J({Emapq^ACS{mJYto#_K~27A z5~Im1CPy^c&g7UTmzW&aBz^^_{iG)OnVi<729vXzbY*g0lPOFtYO)18Zb$qNna+3G+D$Xu_kAjB-P|4 zljNG@tm3q%)TBC-)S7f)l2(&(Owwzzib+OIE-=ZYNxG^|S7uFunPkQc{I7tB%db9syXvhK$Buj3TaZENfAx@FbURVI+Nm>Y-CbGldDWh zX_BtG(_UJWQcTKd(uhe}O?opaugMf9A(})osi?^jCY3dL&7`U(fi;}@sjf){CN(wb z%%rv^q$88gnv7=BRg)D=x@&TVNe@jD)^@sjX_A{sA5AJV z>8D9MCSjV4W-?Hdg-pUVxx{3!Ca;+c)g)UTXMTojQjW<;OQ{%WSk~f znM}|mNnNLFk|xENOwptPlWCgtV-lgsBqq}}S;b_gCVw%Rt;s_sb2Lf)r87VCGzn%h zUz5g67HTqp$zn~WGg+$1CML@@InHE-Cij>`YLc>^Ge0XeDa0g7lUhvHXflAwT1}=i zS+B_^CL1+5&SbMD0rj2st(xRwvR#uZOm=G0hRH5XMlso=$uCUyX|jh&v?kY>9MmL9 z1806>G|9{4h$iKj9MhyFljE8UVscWG1x!wB@+XtCnw)3yM3ZMsipN*aE>e8u%we!5 zK}QjJM!O*%43tH~H9={1RB zl2MZbOfqQ_%OtZV2^u@|lU0+vOtNcIi%Fm+otWg*WE7JiO@3vPN0VqK`80`RQb3c0 zUpw+&gzFpO%97$0{N*?0I>av2NLO=mrQohk%Xf#muIKDRjdZmjS88^B zU9-qu*OjG-(~27DYAIY_mTv@K{i->v#4glGS1WSi8(cV57!?LDAt_fEcA-YPLdm7x z+ueM0DZCD&T(j7P8tG~+T-SSEx$U~5*@YVEY9m}Hv*f(vx}LKOHPY3VT$!E4@_n^F zSz6bXr>QfqsF5ywD?WZaH1cQsFAK7qU+F| zqwva}>Ke!{)JRuP(RHChCfJabYYDqhBVD~jSGU81JGri->_Uxn^%h;}zrO@8(W_Uxn^$}hD&MbsieU&Syx$_fhq^qy!n*PxpcrQx1zGN3_q^qCk$`n6OsOuWQF4Ra@ zf6>)6VejRxYcab}BVA#lD|h9AU0l}@cA-YP28gcV?_0vbKrPoxcA-YP28yl`Z4M1| zUAbB~e$+_U_o6FTnjBeOS6z0YM!Ld9SGuU|7hG2uyHF!tgGASY-udA?td?sLyHF!t zgGJY%cC*jAuEXp?jdTqWUERN1{j2MG!7kKD*HFrOK|P~uA-hl`T_Z);im?Z(x?M5sLXC8d zB9}V$2DR@{&~-g$7iy$yG`ZBVcTe*=Rb1D{t(U3Uh&i*#MJ*@YVE8Y{Y9 zW=T`mb@gKxYNYE2(G@)6gt5&pU>9nnYn!{Z9A$Flgy2g_WPW&`2d=zFJ zqn@z~HPSVKTvpOuN2v1?YNTr-xzzRHvSej%xUNddVoMv6vD=ee#K>_UxnO(9ou9*yUtQ=W8PJK2RA>6%I|H5xTGbZX|h zuCog@(lt$V^^Glk!*zYo+8IOCNY{_#QeAo5-fil-3a|?`(iK52H5%6r{A28ub=id) z>H3LWYUB^R&GCiX6~->qNY`}HHR0qqc$Zjh8;jY68tIxrF11&#`uUmRI?OKANY_l! zRVg~HapmxWU8s?+S)yy&#TC=tIn3F{nOD?E*KFZ>RqfbK*HwpIsFALp$)(1yWQN;8 zt}BdPsFAKYqAUE$IOA%0F}qMBU2{d(m~T4%FkTaNp_(|x)ux9PyGwSaH{3ms{QBV8-VrS2<>C4X!jqms0DmJl`4^&7cT@)7&~+<6<_uFu$o8tIB8 zmwFF9!H!NfTvtnWp+>rX7hT=nFCXW+MzRYv(zQ}_b?$PvrtA8ZU8s?+RibO*^j}G1BVDUS*MN_*8Bbs`cW_!!BVB7m*Tbao>bYHCunRTP z^@r#>`@H!k*VUd~sFALs43fJzct?s$5b?icobZrx^HUl1Y zbY17zg&OJFPA+v-xnb1V-mdE{yHF!tJA^A}!!O2lZ|+Xc$fHKOb_!RW=qtumN*#8g zM!NnaS28|E6)pAIQFjjevI{lRwToP853+on!^iyZyM*y$?QUnbR8g<8u>=Gf4J{RcIr>&>5CS4VcCM!JrYOI_O}ZqsUj>zc?e)JWGca;a;8b9d|f z>AE(v3pLX97rE3CV95EMxn0+7cA-YPjtf`91NW=DuC!g8F+`1YogkMQje`@L8P}p^ z*o7MDIw`suj>~hv?P|#`)JWGU(Um<-D&vlRG`mnEU8jX>#LB*D+^$G=p+>sSkPCm~ z5~q)+1Z38tFPmF1S^rX;azwaNtp{0_;MK zbe$)cx`*9g{=TuzH)j`Wr0W8?)X}Eg#NfAX*JyU3M!GJNOKrWSTa`ZNx>mCbHPUs7 zTP$ONJg)4uzI{V$Oq}`lxL5+0%O)j+^mRfedkLxPMF4RcZ6>_Q3 zXc_dZj_Yd9F4RcZRdT73fB9|X3D-4-U8s?+YvfYf#=E{fcet+A>_UxnT_=|s`EMGe zhp+h5wsD$WsFAK%a;ecs*=}$_*A>6J<428j{UcnT$64w>~J7)}0BVBjMrOtY-GgkWAb>(3fYNYEfxzx6?Z~y$$uB$q`P$OOc zl1r`S(@9!pb6wrog&OI)M=scmX!@mdmV~bBM|Pn`y6y|tn1ch1v)-TVLXC7iAeUOp zA2$7KiraOcU8s?+hvZTt-?!BAFI`ub9?r<4M!Fu6OI@WreO$#j9+qbpYNYG2=-ON$ zINI%M!!FcF*Avkdz4oI9u4@##P$OMWMOUG*_l%>>uk1pNbUhPYS(-nn<#xre3pLX9 zTy$NJ=y%X{Jzy7Vr0a#~%9ABB#C4_X>5M#Tr0b>V%5tqxZP)cFyHF!tuSD12&uc$+ zUCr2q8tHm1x=y}Zd&qSSVi#(p>y7BD6rTEp>zdCl)JWG`(KYW$TjQz7Zg!zYy55Pd z{qcV`j)yncg&OI4FS_c-y*}d3VbWgC$fHKO@J~I&kEgczSC#j-cU^_qg&OIKM=o{N zyFTdNHrG|3U8s?+0O1;)xq)%q2xk{+q$|E~eUWpNalgEbU8s?+1msf7)qc_nV|^WG z7iy#{A-U9fIbX80O;F)XPuYbU=}JT{xG1D4>ajWUIeI&O)JWF{qAS((gKONb>g+;| zbR`yD#it&Aq^ttSwhrES31!(vgPhfuB!~YP$OOGMOX7GHQu|fcI-lpbY&1-x5rh3+aopd6WN6t z>B=a&sxNwDoMAVx3pLX9q3G&)X9fHn71ecxU8s?+Oyp8Wwuig&8Bg_-_H+EGk*<$~ zD|O*PFWs(^>_UxnWfrdW$ztMMS17wsBVAd9tN#4^yIj|JcA-YPvXV<(N3E%M$T-fg zXBTRuE1PhAwPW75Zr3$-p+>s03)jZ={QP$OL*i>`7V(vNbxCbA1P(v?$mo%<@$E7!GwU8s?+T%zl%HB&~r zt}E<9jdTSGSNEqe6J1x*FlP)=BVD=4rAFiMx<8B~KnZrCM!NEduILkk=D1xg*o7MD z%1bV_r_|pTaNKo`W*2ItE1z&hHTe3n>srk&)JRu;;mX+O#!=UGkzJ^ft^(vz_bHpE zCNqv39}IBD5H-?OkX-71x$cWy#ywFrj3RkJ{yuIByyu~imNLR3MeU;^B;~F62KxYh5BVEPF z^^tQyjk?|BVDD0EA#VW_Uxnl_r-u0{ofu{$H-E2fI)sU7wLljYh%H#vNVPEOwzry2_9%8L#D_!Z*jd zu5Ii>jdXoZF7ysmRy;|S1#U8s?+FUX~iHkXQ&AL-8FNOqw{xsuimo@W=Pq@-;tz4g5H-^ErRX}4uV0|+%EvC$NLM}4Rr~l`Wi)(sTUZ}H+r%QHPY2UbTv_UxnH6fQ;u9_K7pL4q=vkNuS)l|54R>Z$Gtd?styHF!t&B&#eYj~vZ zn(O+9U8s?+Z^)&V>rB45jjk)rFsBtY($$1r*y zrq|f^#_dWw+!;gENLL%-3jQwnzpkqsyHF!tZONrZWB2+D#>jVK7iy%do#@J%?Lv^- z6~QjlNLPE&m9uF`H`leDU8s?+4#G8Z$V1~ybemnMk*<#9QddMX7i?+lc4Zvlj3H{I zs}s4@xianUPmJrRD(pgybbU*%Oni2TzOrJV+tr(0sFAMD!gc<7!hc-XB6guhy1I}{ zeRoqZ{~h?zSsI`31iMfpU0ungt{nCZulCq=J!2PYq^ldb)P2h2{rR@Ku3RIXR@6vW zcXFw1{=wMrQm(5ZyHF!t-;qm=eA}7_jqfW5vkNuS)q`AW4tqU+Sj+8-WEX0rt0%eC zUBJroU5x$f61z|%UA@Sq#<1Ir!*$%QM5CP1K#g?uCYQS2SeT%wv2A?9F4Ra@A9AVV z;pDV`e(ZLA%`VhPS6_0e(WsMd=Umq{j9sXau71KbeOR2aSFT|fYNV?_xl-{qU*gR0 z0dCiIcA-YP!pNnrdq2Nk$T&MB8SRWAYNTrbxpHvVneZ^<*jtQUsFALLac zbvA6!TAX_()9zmva)N-cQ+flu14%a zjdYD87i@eq&Hbw>iz4wwzCU0(lvox>WCfh#$w~n_bIzj zBV7~8rS95t-8}>=T+Lzjan4Vuk*-PPQfJur~=-73pLU;ja=$V?^U+#5w7bwyHF!t zKaxwG^^)8Ux$C-ejd#WnHPRJ9F13~?9V=edb=6}RYNYEY;i|U0{(09mhFz$UuIc1b z$N6zN`h4ZOwzCU0(lvuzYJIitHvWa{ddx1=NY_kqspV>0eY3I6=bhk;25O{h7P-{% zFl2DS)oxcycA-YPW{a-&12cc=x~8xTHPZDnxzrX_VEElUu4_NLP$OM)ge&Q=0@C8P$OM)$)%QSeEWWIxvgBeCOSW%M!M#aOKpdH$6x!ybv0raYNYEIa;a_pkS`}( zQmL+C>_Uxn%_o-{jg`Ycyym)AvkNuSwSZje-XYPDOY2?N-|Rw-bS)$o3^z^b0yj=| zT`4Cy^NJejT0}1RqL-$k{n{E&U@EZ-HPW@1Ttz9&il@F-C`GNr0aKbsq6XozqT@-Vr8A;%qwc7YbCkVX#DtM(|)(B z4!ckzU8~5I%GnHkZ^!hw@4EW43pLUeMJ}~3KivHNaMv}LU8s?+)#Oq~?ANPX8|Rb* z>_Uxnts$2hjpqLhG@d!UV;5?q>ko3N_4WDcoJZX`EIQR0L)1vuT5_rV>*MmhXSuFc z>_Uxnts|E@+LTIFZh`BHU>9nnYrW`dUvc0)*R_jXsFAJ>_Uxn zZ6udkUsrNPu5?|6ra7a58tK|ZE_F}z`S9V!Hs6F@sFAMCvTNB82yhyFz7gy~jdX1x zm%7r+nS0C{*R_gWsFAL%slBqzv0Q^)S6z0YM!I&AOKrVT318lHU197(jdcArPkxQMwPIp*p-0NLt7iy$yH@R~2c6jSe(Y$y7rSx?aTkv z>AS&oU1S$(q$`?SYAvrX)}piPO8S#C8mN)31LRU$)TMNrjH}8L>_Uxn9VC}J!_GO- zexKXbf?cSQu0x{hbh;c#T-P{up+>r5$ffS2R*k}c%Utctf3OQR(sh_zYX7?PtO=X| zmFq0KP$OMO$fd5a*HoKpTr={i9!wU!GtxC0xq8pDU| zLXC8tB$qmW&B@-Rxa-P3!||g=x=smKm44-qxUR3*g&OHPO)hneiu__iJl8drU8s?+ zGvrcNL?hoXG@goVWEX0r>nyp{$OnyYWjr&#!!FcF*Ew>j(YQZ*xp7X(Hq#jm)JWHP za;f9Smh)kAQQ=Gt*o7MDx*%NB4&8)TIh1PzyHF!t7lo_IrRT=EaxJ@1BVCt-t7l9n zE+I0hFQ+MqDH#@7Op#6%-`8B!!FcF*A;T9wY;O|_#$ps zD|Vqqx~`H-ZBcm&%`4!#rm+h((shko>KdTNh6RgV*DiLUM!K$xt}_)sGVY|}*o7MD ziY1rY4hLr5ZX9hg&348RHPZDDxpMM0^ddoy`|cdpWEX0r>jt^tVwa{(Gp1H@T|?M~ z8tJ-8E*Nf_o@}Ty&vmV37iy#{j$G;}+AQsy3fIWqvqN3i3U;AJy8b1X zn!}!@4u0plF0l(W(shqqfzH7DUQ8SI*mb3yD@ywwnyHF!t56Gpq zsBu9bzHqySunRTP^^jcZ3|sxh=r3H?T6UpEx*m~BT~#K{P$8M?y2CEiNY`W0m1T2g zV+=o@>x>3!r0WT})OmSD^{K`&stLPLBVA9)rH&gb53Jkd&fyq#p+>r%30KVqYfreY z4eUaVbUi1RIy=Oq%nm;~O9TJTD!Wi4T`$O`#<0+$&c?a&!+DM$HPZExTyRRDsehZx z#>m%U7iy&I6}i;a*XhK~%eiwH#xB%I*K2aA{cCf|Re!jy`RqcCbiE;0TAsr}1#%yB zT_@Ou8tHmVE_H3QA>Rn&yMVXsLXC92BbPe%&dGYycyGDDFU}aEM!MdUOYO@mx_*An zox|qrLXC9!;C;jR@zfZuD!I9?>zc|g)JRu6a;fz-Xw0&_u4@y!P$OLdhz)JRuCa;cF|Soo5$ z%{OBgYNRU>xzsj4Jn;B*w`&5sP$OL*kV~D3BKnWp;ktIQ3pLV}m|SY)$DcV?+I8Jy z7i#{Gs(XyGYhCs*-mz^b9otFAwv8Rzwr#s(+qP{R9UFVcKC5b0oqGT4!yV_2@%(Ph z^{(mO`&?AvSn2m#RindIQ}GsgYe)^M@T~LK&5ux;U5QPiM{#7ckVHZ?~THFZ}MHK-!9(sS>Yh!HQE3cc7{4QfzDVWq!v z()mA}yOf-ws6iDKX3cJSWTee%D~cLa(OBv4b$iyN3Z?=@QG+TvsAiM@lreQi6g8+~ zfcmjusdJD0TNE{@VuCtx^V>w5m3fJ`hSZ>n#Y)e;m-;vCY^t#+YEZ>yr7It|uoJC#Z)a()SyZQvy!w-vB}ghQPiMH%}UQv2V&d`G_^w% zHK@|C(qs8;qZ!W1zZ69cs1NC~Wb%y|c!WQDgH)SyboO5edYZri+vZDA!*)Sybw zO1E%w(H8qm4G~2Rsthpe&AidKP3;s#4XTW+bf3SztKSJzZ$wdpDibSRjVQA-EHjm8 zrMDW?pvufDz1+dRNl?bOBkPe;K@>Hpvar&>WEHIbc#WwcqNqWYm6gBDT6g8V^Y^bE zqNqVd|L#kOV7kxOnSG+L&3Yrs`}bqq|1TcdS?L-^OSR2;%1*M%`-arutQ@R#-)R2x zazC3@Srj#>abPcyvIQq_1DN)p*%F9Yuqk5H`7fkgMMGdNataR@! zT{M_;byzKm8dUi~bq`hFIg8#FMGdL~tn^o2-2KO0+rsc`yw#uvRY6wzy@u!L;9SiM zilPQpAy&GE6(jw0ey>iVs6kbjm2P3ahX3`lEnFmu8dODC=@#A?GM5YQaJwps8dODD z>9fP}ByF5Gx1ra1t3eH_VyyHG@V(u;rnZGyMNxyQI4gap_q|oRMW$Maq6Sq7R(gf) z+T!v$Q*%U7gQ_Gey_%O#(X4@~qoSxmRf?4!mD5r!&1~vlQPiL+%}TGZ%QqLyZYse# zZw;wIRR+|FLc9B$DlLi{RApJ|8DMUyC3#JC7ex)Ka;)_Fm8j6| z^Ae^Wh@u8n1yB{9E-z;)=6Y{6s6kbcRT8;6WE^s@_ZswkW(`xBMNxyQ4$SJ@vXJu^ z@Oq-CK~)!K?OS-pId6;-MGdNdSm{}GPtn*BZ40-Fq6SqxP>+69j%+GO6g8;ov(jUE zao908Ohwq_tsyn28o;b;Gp0l_RYVjus2akot1pL_HPucOHK-b~(qFmgy*FJ=Efz%$ zs>YxaG+pgHNu3u(4XP%fGK6c@$!7f!MGdN^taJ_I$1SqURI1J18d8I*87nI65#Y(T0;|iV4VJe3x zYEboNrN7tHV)r-ELE_*)}W34sQ*qK{bGto<$EXjO%=_`l6^oH4tX~4w2J& zk{Tt78dQT=>E7FQ_?-c^g_}iDgK97<-8a^(ci#~`7DWxJA*}T7D}9*!&YgLbo!)9t zgK8)%J+oz;oPL*WVF6Lppc=+X_rn#T=lUKabnopbiW*eILH*fz+jjv}HD44ps78P~ zbvdr@09AEP6g8+uveNH$rBmBcrhbW{2GuB5x<_SA74@X4OuM|P)Sw#8O82Pm5vIO1 zRa+D_sK&6;^ZbC5Cw&jW`n`sVq6XDiR{9jM=tGvXrq+t02GuxLz8{G{J$pr1Z0eyX zYEX@5rDyE^sp>gTZLxQI+e!_p39R&cEnC{tH&ee?K~dD8n#fA`-s|5Q_zoIXEk#j- zY7#4bd+@Alhi|5)i=qbAWLA1Uoc68TcT=ZDQG;p!2*I_nrbYH8dTF+>3-P1{FSYyCW)d3)eKhpD;FPn);TKo zh@uA7Ojdg5u)R~DGwYEkYEaE$rT4v)h8~_^TNrt-w;I%-3S_0{!&oy9q%&1Q6g8-3 zv(i1PV7}$fGf@{&)S#Nf%J)dapGF&hq_J5GMNxxlE-T-o8h^f4pWolqQBl;On#am_ zd&i$SsSnjP^;{G+sOH10^{;LYG!pjyaEzgOU(_|EmK zswiquEn=nLE9(1`A8b~4QPiMX46_o>sNuXlm??@HR7+sisvAk#+pOK9s6n-ql^!YM zSGC!1>b@vyP%UGn`(e@yC7ml#xc%PBQ-f+bsKA($ohOc5qNqW&f|YLJi}T+92MBLZ zX)1~uR4ZXt(5&UoYD^GC4XRb3@}D?YnhNi;M-(-vRdw>n-$}LHe%s=shEen)u0B|4p51DC8}+zgeYoI?PR6jYg5zNZ%p+NMGdN5tn_sRQp-!_nH{H`)*TnMNxz50H~S4!Z`1H&xxW2)j?MJy}ra4 z_Rwbi5k(EEL#*@;_Wb9!&K71l;;kVys1CEzXNRg$7k{)_bwp8v>IkT^VJG!&~XvAMrOGQzG>Jlq`;&{+@sB=ej zK@>HpF0<0R$_RBY`W8Uf@T(|lP+eiA=P18sJ6oAbaNP6Mpt=gGK=LO|O_dWx4XSIb z^lJW~_6g^1xvwZ{P+bQ#;@RMSHfxnAYEa!^rQa)H`1%#5Ziu1=)lF7qg zPI#+94XRr(>uX@Hq^1HyQG@C>%&IwYZe3HYL{Wq44lBK9`xSV}xqbzTq6XDnR(hmt zEp&9M%{nHE8dUdK>D8gVk*ihZ#Aev^#oMKMaKe76%$1bs;8{<+5AAV9^*{)6h#fHXRP#B4(eOJwyAld zs6q7{)V=&stC>14iW*ceSVffID{4S&-^O}t;OF;O6g8+`veK2mGjE>LV*XW3TDc=e(&aqNqXj ziItu=0%s)dZ7SqhZ#Aev^%-W}j@EjcsobKdLG^`|UiDt}%;EekyOk(vP<>^k*RQi( z-GB0PhA3)KePg9Z%9*;ioqhheC~8oBXQgL=3;Ek;qQd)p7DWxJAFOl>D_>r;*Hr3r zo~H)YPgc6}I~TueVyc!XYEb=RrAOuESOa}OxNhMXQPiON%}Td$Ylo1bOzjXw4XQt^ zbdS0=BjQn0&qYy#>MtujD$jOo?d-jA&wJZS4Jtq1!5<=+u6&8LxzpOLBBH246^xaB zuTL{#Ju=l*6g8-Vv(jTZ?&0Y}Of3;b4XO~J?qsX_!qf#()SwCpDpiamWljAQMGdM@ ztn|+O{KU`KOr^fytsyn2LbK9)?DlsTA2(G+6g8;Au+r72efx1zQ~g9ygDNa5y~1ui z6~pEss3Ne^J<9(~*W0F&(j$TI zLk+5ktn@Br=hZVeO;r^|4XQ}2bPJ;;=$XOP2vO9aip)xXuTpdGZ7{W26g8-#u+pRQ z`RsMiP2Cek4XUWD^t@4a!MW6?B46@WgBn!PSm_x%SkG6^*(RSTYEVUoS?SJ3s&BJe zi=qZq444)Ex_@<3Gel8?DkjYO`A_`^rjCfB230JW^`Kd|Wu`ueq6SrLn051Nq|c@j zU-s6J8dPy$mVb#nVN8`1MGdOBFzd)JUGY|f8dM2kR*kf$>X^zbiW*djU{=uqbElcACyE+WiD6cc z<$+yIjS)o+D*Er~2@y>9`2!6vInP8pM0x*RKJLH$krZYXDHzK6XGNZhq6TLrgIQ@> zbe~{b82zfZhSZ?)hgr$mAM-sddaa*dVNukeN)EGph^L=KKz*OJhjac zMGdNyFzZYA*Ul5-Nm10GN(Hm7bU(J!w(yH6YEY$ySrMu)pJdAanzt_0ph^R?zDM@! zX{xd)YEY$xS<7o*E@!I0C~8opgIR&~5BgqB>F>2h6g8;Q!>o1R<-waiv$)?-oBpvuNdpAb8IxZylIM84szAvLJ7v(hbW z^zw@D_Dz4~?4qbam4lU@ZMy6o=evneRaX=>sB*H>r<>9zQ#x-QM~R{aRW4S#g#m^9 zoV%1AqNqWYo0Yyz9W}Pt7~8@JqNqU?z{>Y$Z~o*tod1-m5I4PVNDZnytn@CWexp;) z`7nZHQVxlt22}x8 zdN0~;Z8GO?qaQ?3gQ_4a-yZ<@)3#@>H@1cTx4bo^22~+e{-UaWJbTMjEm72Tstl+rrEfV`y-cF0K~)x1=pPfE zf1a(nC~8oZW2I-CiP4%le^KotiW*eqS?TXJI_#vyRCu4oqNqVtft8*&22b32z|?tB z)S#*es^9wW&fnU8h@u8nC02R{IM}tS?^TCxVd}fyf1(CeWmbB8ZHYc%m8n{ys6kbQ zl^!WUF}pM}HA)mUsH(EkJt}0THqOd#7DWxJYM`P_T0_VPWlqhOY z)n?^;NaoL>&s&_gJ^MsagQ^ZIy%M#`mF$CU;eVp2K~_r1!mbp$64I ztaLTjz6xq@s)Q(NP}PH36M`l-G1Wm7HK^*d(!ICB>F>^+`BYKVplZNMuX?{@hw5ju zj*6lNRYO*KeDx138p6~UQPiMn1gh};#QcWQ`}I;i@YawTRE=3hlwUbdsf{^oR!vdV zplZTOf8{o@=Vvt4TNE{@nzGVsW!a;%Z<$&liW*eSSm}|He8<%5rml;k232!bdOqBi z|ElvuA3Vrg4Qf!efLU+WM5to3GK-=HRZEyPs_&?arv4E{4XReGbPXH$*S=wDlqhOY zwFZ^vahm+5wu_<$RU1~i@~PgPnriBaC~8o(Wu^Ok$PcNqnu_tzTSID4wPU5tvqC-g){q)hJz43o z+`LH(=bz%vDvBCZy;$k*6*fzby*8_XC~8pkW~KW^mnOk`ni?&N8dQB?)|jfnou{^K zqNqXD7iJ~gKBAk=3KB&Ps(vu5M8(-$cqj0PPrNmx233Dn`n{6U}BiS({Z*6g8-Z!K^MRYCG5EHlnCOH5_IYpV8uk z&6+NX8dM`doj>fC#MB{C)Sw#4N`J3VS(k@0^;Q%$s7A5U-)ndIUCtd*{Ab=8QiEzV zEB(FJ7ieA8W|a^{4XQCPDRFhcg zz3B1;trnWj)Ku{(67bsw=m?&yc(KRGQFrD@F%VlQ^dy4X| zGwxq}=70+Huj#IaC~9!lTvob?36g8;kfr>e4r1J(Q+AD80s6jQKm42_O zfqRqNtYV_5LA3zX?+O7)P4yH-4XTBpzWninJ8*dEoT)~W^L)1&-uH=!4DrCW;zVD_Q9lwo7x!dAjj` z*bB#IhT8(HbTQGUbe(xyg;q6XC_R=UrBY*@kH)Ou0WpxO*7)!PKl)ged} zHK?|*((CfV1=AbatmyB&HKYdBR#v)(Zx1)_XR44WYEW%srTfOt-0icO>L`jDRNFzd zAD+*76BsCp8dN)2MU(xtc+jLWHtUEeYEbQDrCXSy#p$}H-iV?G)h<@LZ`A$vX}qb} z@4Ypo2Gwp>x^Dz;@YVUZtMZGY2Gt&zHMZkY-&k*gpIM+boU#ZnpQ{6;SgX##(8g#y0QB!k8QG@Cz%=+`Y zU=ve^MNxz57|eRvI*;>4`jseZP#uR^%Q|1EX|tmK>#aOBs7}DFfIqFB^G1LuYEYeo zS)GmqI?v_}L{Wq46e~T?53X4In{D9;QPiM14Jv1e%neL!6-5oIGobeL9p&5+JrqR^ zs`hO zDLZAUq0W<3eo@q*y247=@KNm})ofNPQPiNi%1XCzLr`zu>sVdG>7uAXb&Zv-;nHaL z%9%PViW*ecS?RTMMT&z1P5lu?4XPV3YryY+eK&o&g_%Bi|A`t@H(B|<41XGDn(rKy zjYLs{>J}?q`PAD_q_kNRMNxz5HY+_Uvwz()%hVoG)S$Y<%J*gX6Ds-==M3;t6g8;s zveK)0P_ov2Y*x(A-fB>T>K-foy|Qfzd)`z5QPiNi&q~*@!p6CUO?4DS4XOvMbPEf& zd@$YAd{NY(3S#AZS;L?7ZM=Us&->p_h@uA7Lst6tugqsF9kN-kMNxz55i7k`9;!Bc zzNyGxyfvf-)nk~I=z0fdpU)+V8dOhM`Thrgl1v%kJo(lUMGdN_tb8{a{OOW3wuVq6XC$P~RsOb?&kIiJ}J8 zS5~^uhYmY?w#`~AiW*ekKsDTc*SV%#7DWxJ@1R=UO&n;mzKNm+)ely>&o_BAbcw0N zKfE=h2GvhcF++@V-f&hHMGdN7tn@x=XR05*h4Ci%`3(_84XWRue!i{e?1wubP6d~aOrpSmBsc;ir01w>JUDi|x> zH>N$9=6tWVqNqU?oR#jqbw)3Bj^)Xss6iEil^&HfcRqBUi4KXP231Iy6O z`JL0+JAVz_B8nPR;aKVYVXm*kAKMl_6-5oI@T?Ncs`ZQE{&xjO`|Yg;HK-!6((7`M z-^rc(!&0KCK^2jeZehAvT`$`fb{0hqsz|K#sLb8-fU_UY6GaWG$gF%1Li}mI`rA~S zbx9O8sG_jamCxDjuCwx?|9GoG4XUW1YNSrM-DU-dq6SqoQ2UOK@f|d}_qGv54XWs% z?#(RQ#ME3-)S!yNO7Bu`zj-y>)Ok_Vpo+;#f90-m(%d!mRTMR-VzKf)?(!!|9QWVL zPWIRPhSZ>n%}Q5(`Ofz3Y*r0X)S!yPN}mG!7v();YNRM?P{n1X$8w&*>yMb)E{Ymd z@mT4d`KMN`%b0p1iW*e$S?LyDNZ4|%sfd0dc#Wt*m4KBVDY>3scdickL{Wn(AuIh} zS)Md;wy>orYEUI&rN8ol5}z{L7ETvM4XVVf^h%U*Dm2TnbI0rMCDkzE?RQ{}VHI8>ln8#FGQPiMH&MJoN z^COr2<9j^PV|ltLYEY$sSqskA&1dSMC~8opgjub_zw=#Qbk-|T)SyZQvsNyjmDg0P z;NBWigDN%5irBvDB2$G#QG+TC%*wd&Mj=yeL{Wn(EzH_hV|ad3(?n5&Djh35zHU6p z;5+f?Y8((n4XX4o>si43o~GW3q6Sq4R(d6>wr}MOQ}IH0Ye)^MjI2_~zL9d{QG+TgE8j~f z{^aYQw5=)sklt!ggDM*&u zgQ^rOJu2IjEs)gI9#PbwD$PpI8y7M?YGdk^C~8oZVWr1czdZ$=eLikjZw;wIRhE_R zhe@VJE@ra|h@u8nIaYe!h}1j%PE$=qQG=>HsKPCKUN<#P6g8+Su+n?c@#919GPO+< zHK;1G(&x$>ZN~pK^-vTws4B72_lIXgtzK^`Ryc1BsXaH<^YQ27$Cxc`)&o)0psEh)Th+ViOvMTB ztp+uyYOvD1H(7)HJ4{s)MGdN&tn|Kj($dq;-@p2cq6SqhR{DF5>K8ni%~~Of8dSAe z=~0>Q;FO`J?uw!YRUJ@S8rMB6g8+?!mJv15BMG<^jF?4iW*d{VAhVX52u-WB#IhTtzp)RqX)*B ziW1pd4Qf!efmsXY{5WAMpD1cjwS`%8e!sqHs+A~eP_=_u$+jGF-uF%uMGdOHxFSMGxm(Q{IZA231Fx6>fWaF1$lKeiUyFsX^6=mF^qC2S@*6TUb&Q zHK;nX(*3YtrX9W=S@(^uqNqXD1!hg(xxJ#P1)``y)fHwn=-;!osk5S}LDdar&5t+0 zw*b0@-$YS^syobD+q~x?Qz@f*Ye)^M9x!YBnC6vDRS`uEs-CR$TAA|ALTBX%h@u8n zFHp}Cww!CT){3GARc}xU3ZyG&>b59qQ1t;-{C$l6rou+^R)ZQ;eOc)hw#Trre@x{P zMGdNcptg0p;G8#_i=qZqe^8}s49R7)rir2k)c{ty&xdYa+Bx?g5k(EEfvj|&ACY*o z?{-`Fs1Ks3K{W_wB^VKHtf_?2y)~o;)nJ(QtU{M=rpkz-2GtOl6*cuO=bx(TE{Ymd zLqQ#zJ~6k=S}ckhRKr;5YQ(J3<*umMGdOatb8v+`7^xI%{{h-n?zBAY78si z?E-%W{koFD)FV;Upc>0c_ug>hDmm}IqQ~@BgBn!hSm{yO=kiErm|Iu8E=s)jU@Etk<~I9%t_j5yx9YYEaE*<=bWX^F2q5 zVzz~8MNxxl0nD2CBJw3uRYXyPY9Y)@TX9QBQ$0mdgK81XdNpygbI-Ow6g8+8!>quT zSMu1bW1^@*wFG8W+tK`!skfr2LA4ZSjo$Ooxh}_u>#aOBsFtzPr?z`>KM$~3`9x8J zYB?)C+XNfld$6e%qNqW&0%m33QMjF{DWa%BwGw7s`s>~U>=Q)|s#P$n=EYxEZPrUs z)Sy}ovl?ID_0v?$c-|UPgK7=TdjBH5^Oxd6qNqW&7G`x0ALytyqNqW&j+LG_4g>^l zvn`w>e5rgn>>2Gs_bb-Q6o-&j4*-xoyA?<3Oa+hctsyn2 zHo>f>E&rQjDzzwTP;G`;pA%MGXR4eiYEW%qrTct=+Yk1e>LiL9R9ji;KHvUrl(nYj zh@uA7HdcB*ob_t|9aASnQG;qbEB(FdHV$&GL~lh=gK7sWJ&UHxGuby*f3Ii>yp^X0 z)lOFWzPC)O_L)uP5k(EEU99vCXOpsJdzfk>iW*eAVb+nXY1W$>CyE+Wdsyl3l_<~q zeWtdFq6XDoR{DEQs(;^krxzrO8dUpO>1t%jndh&~ikQ$_Luyd%XQit#I>Dn=rgDm+ z2Gs$WRk_9Y;iejjq6XDLm^EZ~x+kVaiJ}J8A(%Dz-&J8uZ5Blhs>3j=R@i>Nn+V;b z?ueoW)e)Grc)<6Jra~q1){q)hM`70Lv{`qU$|Q;!RL5Y}^k>a;n5r#`8dS$&R)MI~ zog-zCC~8ohfLWinEvsm=R*Rwr)k&C@Yg7HArml#h2GuE;mBRn?SyR77QG@C<%z7Lm z!WL7h5_>C84XQIRE6loO&rDSoMGdO6Fe|ZtN#8-E`$lh3)Sx;Cv#MRp@XFK@QPiM1 z&r0t_dyRPL?1yJXQG@CND}AfKX~kmad;Jha4XTT*^t|zN>@D9P6ZCs!NaC#_HK;D( ztf3c6nW`;{8dR4-HOo3;yQ#6Fs6lmwl|E&c&)dm&;?XVKFNzveS3w1iO7+;(J5ki2 zy2eUZK6aMc)l4N$>a7MfsIG%LUiO=BIdu!miJ}J84NyIr&Pr>lwdf}*ks;nP=o3YsOzmuEi{!&6g8;s zf@)DX^*mF}L{Wq49xMIJ{+YGWN12);iW*e+S?Rl!39;@wf1x`niW*c8Sm_!Th+liD z&H5;c8dO27^jcXhn_p{F$^E@Gqz2VPR(c zs6q9Zl|C<*KY3=hsnw#WLG^@{uHk~7XJ?tZA&MGQPg&_|oa^&=nyJvqz15%w)iY2D z-)`~kl6rh)7DWxJ=dAQd>HKZ}7*lmbQG@CQEB#(Ye>Hh!YK$mqP`zZO_fawXX31@8 zmndpby<(-u*TfPhop&h@MNxz5HK-iL_Bi(&QBrtoNDZntpdSAF)_LDsKom8o-m=ow zxR&v<^W@uB6g8;cf%020tP>U9Cr}hMsNS3QSopQsUS)>u*0p!x*r zMeMP?Ozjax4XV$q{ACSqerVy`5xo{g4XQ7oA{EV2)Mh0~<*f!asJ^n&-z&|~j?Vo? zby3uy`o=1;Y+>0m1-S73*U_S=LG_)L{$7b5Gx33x7Jla$ix@pb81{o~P=$e6Zwh`rLWTFqB#IhTVPRID2EUwt&Y`X-YEXrPSp`F?#AWJw{L6(EWlRFPrUhNpL@nQA7A8dOnWR?+fJOPHE0iW*c=Vb;>(F>jgL zCyE+W(O}lpJK0Z|dL@b)RMBBp=PyOmn2Md=TSID4#ei8Gt2cdXs+cHhP{o8<<8DM5 zW2&PlYEZ?3StHN>{bXvcC~8o}hFJ;Tt;uHUgeYoI#erGR7ZjRc>XRsHP{oB=Q7bha zXewz2Zw;wI6%S_R3fs}S2dE&58dULN*0J9?oh|GwiW*c2U{KW>r<$rQiW*c& zVb=W4M|YbVCW;zV$zaxmfHuzCo{gfYLFEs#${m?f&Su>eMGdOttn?hUZb#mHrov_N zR)ZQ;DOla7MfsB*xpM(1Lb zvsu|iQG+TcD_!}m<6b*Yz70fCgDMv*U5(83A2hRB<3v$|DmN=#`F*kT{Wi5j6g8*< zSn1yTWzfIHOg$4t4XQk>qRW0*{pyyDrXpwa){q)hd0F{x3i;D^U#N$s0z^@RDj%q0 z7bZJzv096w233AmdVJ-HSGj`Cnk|YNR0UZ1UU~B;>!+S)O`Q`(4XT1L>%|1W3#Ni) z_f~@%RE1#Hlak2_n93oF8dQZ@=~H&wT(xqVY9)#qR7F4?D}H2)sd=KPK~`}u+QG=>HD_z3@xij{)E!-%I z8dMcPT`aN7IY&JZMGdNopt{d^>g*elb9t*l4XR44^!Ex=`0!fW!UCeGK~))4#E0RX zb5t8q)S#-uN>@I9${c@f)=W{N6{}&5EDfTSID4)nKJ-c=^sN=NY!7C~8pEWToG0$dq!>wi>fdofbt6syeLnN)+nWC}$1-ilPQpT~>N#+qI!kC7YEc zz*|FVQ2hfc&b>9xIjW^7YEab!wK+2V*QDtk(R@+VpsLTx-@APImF)34ovCZ0s6o{L z)QgY!o5H7=f+rn<5s6o{j)WN%2`ZCyE+W%|Xpt zA9||I8YGGuR4rKP-n%w%Z3|P|L{WpPC8*%91A<=dA`c zs9J-%lxtK?Q{_ZagQ^XvZcneyGc`~YHK^LM(tCh7!>(L4wM7&)sM>+r^`(^atoK+H zHK^LN(!0v>H4ZuNQljVgR)ZQ;9Y7^dU1OnbVF^*xpy~)}#HVm=P4yB*4XRG8^c=N& zVw%*Z)`+48RcBVZN4@Pi-#G(35=9NFF0Axej=#C5^HwBA0dF;^LDiL&{$9oE&UgOu zSVj~zsJg+dJdG2sqr&_27DWxJ?l3Dyq0=2rZ4gBbsvfNL9y{2*%7slm5Je5Do~-n` zyx+g}FjFxLdaFSVs$Q)0Y_qpYymO|CilPQpZ&tb=_PMdmcVXAn=qZXCRDD?KvAk?T zg4d>2i=qZqUsgKn#o}e%Ox+hn4XS>ubk@?Lm5Z5*R>)foYEbouStC{)bM9bEh@uA7 z09Hw5Z@68q(O{d^OB6Mz2C~v4W&Eigk4$Y8MGdM!tn^o|Q?a`5Ay`-bxhQH-4Q8d! z%W0GUXlp8VVQ)34K{bSx-Vq&aHp2HK=&Zt`s6jQ9mEL`gs@L5)QaXsD2GuZDx*A8f z6@F~9W{RQ))o@n2g~`&M%xmhrC~8oR0QG6k{4=J0iJ}J8NKn-}tgCD)T@h~$sX;Xg zRP77ReTTKKVJ%VApc)NoeE;lkObr)B4XQDq8W)M}+x>Oc7E#oo8p}%00O2Zb?Pcnr zC~8oR19kV;qtT{f7xh+y8dT$1>6xu|>Mcc0l@&z|stK(0JfG7qyYo*v4HQKUs)?-h z3=p$ms^m6nn<#2fO#*djT&K&XUW%dy)nrz>_s(8*D9BWzV%};{gK7%Q`jjd7XH(Th zQG;qKD?K0X4LxhIsZpY+K{bt4COJoCsNTV93zgWJm9n_E8q}bg$x7e%M%^*{fo)-3QPiNC1u8-8s#8o&5Je5DKvuej zReO{iXzGY4YEaE)rRUx<*HK-P_N-DE{9=+n+eLWII z4XTBpGW8f9WV7Oz^j3o!REt>YvAm?X_s`aNqpOIb2GwF#dbT;-IHvRW%Hg7@LA8XH z?i*VsbiHF+xLXu8sFs3ikw2yLHK>-c(lcAU;9s5l-lV0x)u0B|a#p$;Ps=9v z9iX~L)f7bysueIRQkgMFO^p#n4XTweD^yTM=jrC4C~8oxV&%IjPsMfL4 zH`4QChH%boYei9mYCWhwrH-_-S@%UzgK7gSy^pH2@KAG8QOkI%K@F;npfZ09=DR5A zYUB|`4XRD7^m|pv6LPYtCZec8wHZ{#Hb-BZnkI@GR9jf-_uBg7;BQmMMNxxlE2yih z{6?C3FNzve+dy^w5!yKe#4YQsAvLJBvx*}7(8C?ga@njRqNqW&gH=>fTZ6xI-rKYk zMGdN*taR^P)oQ>Jn>A4sHK=xhI+bt#EmONiQG;qXtLUDlJf@ypJW?{rbr zpgO=x_xY(w!#Th5AyL$zI><`bu+^GR6>SSYilPS9Ay)b;Kg=4}d5e{(ytjtbpgIh* zcI97s)@GF!MGdMWFe}HFspa^sdG%t6-5oIV=!xKkN&$&9TP7q^ND-2~pIbIt%K^r9{s2*C$cbpgPA&_xYsH z5>~NU$trqlNDZp^RN&CqK`Nq6XDnP%jesMYLI=s(7nG4XS&fDx9x(!c=}y)S$Z0N}p54oiDu2 zR98{dpnAYc-`iZix57ETR*IqqRS+v(!#g(y)V5joL{Wq4A*dedANnq3dZa|J>a7Mf zs2;IOE-N2AURmdvsFWybP(6lOv3n(JZL|7`q6XCym=$j4kd~%4iJ}J8Q&1Hao^g)l zXQHS<^^8>t`CjX8CvdKn395OkK@F zgjwfO7al-`_t_G^QO zg=fybQCk!>sNS;D=jCxJwmW<8C{fg)ddDiOY+=|Q`_|hQ?iWQ3s`sqYikcMRkMkb; zKT*`6`oK!>d++=X<2%Xe%BQa3tp+uy{$-_amIf#FA7ZM8C~8ps2eZPrsWso!P*K#N z`UtbCPwCdx)Fx5Xp!x*rdF6{wO$CXf2GwU)`YW#)yVY64C^fy+pa#_!R=S4WCr+Jh zvkHl#2Gv(qx`qk!p59`ry(nr>eS=v`;~w#Cto~keMNxz5JIp#YYHm?er$teN>IbMk zWdoddDc?m=gX$+MUBlAj@+G%fX=-_ENDZoAtaJ@8*1O=`>D3lR4XWR)bPZQ#-RHX< z(A5|&iW*dZU{%T|`lXv!b)|-AeN3SJ<70Osx<_4XPNd^leX$DdkR^x-5zsR53x#4th}D)E`mQ zpo#^mQ1+oCO{J^ntsyn2Vzbg`*gb6)o-$Qa6g8;gu+rzs-3#~3Gc{5aHK^jU(z8v} z@DctowM!H=sN%8GW4U7PD-%q;5Je5D_%Q3xynmdxj&bXIt3eH_1TbsP@Zke(Rw+@` zpi0O}*KmH8$Cpg?6h#fHM67f*#)cU2$J9zu)SyZXDrM*By-eK@MGdMXpaw0j=-h9F zZs4s3HK>xZ()0YwLe+ZOtem2#L6wY^J}*Cb6{4=GrlP1p<EgTD(EE)%qNqWYij|&i zs!t2_oeWfU5Je5D)U5PLDn*lc&hNEE6g8;Qu+lY5y0M3IeBBg94XU)P^m~OHIcl|S zVU$MRYEXkJ9jGCNnmPMnaZ%KuO3x~}oJBMI9__p5(becJiW*cISm_$hY!&aMsr90$ zL6wn}o;Qw0Te!&7V^P$g%EZd|a*aRzE(c6C6{E4Y8q}c5%u0`x?IE)}Pi^@{QG+TA zE4@0z{Wthxo7F}XHK?+((ks!ch}~|QnjwlBRM}YRYE-=OWvr<~qNqWY9n|F7&75oH zzoMu?m4lV8MxIcOUfHZwze0P~`ztt9QdArouG!R)ZQ;d09o4{qV-P z&AwLxdZc6)MGdNatb8wP_;Y3LAm{p3T@*E_^0U(KmGNh#VK%FmC~8m@V5PrTw_Wq5 zm|7@`8dL>Y>6z_r&`RG+3;kYKMNxyQ5G&sU1Am^K{^s22g=^-mAvLH9gX(bRcov&g zP!u(&im=kF`R{viDx2ymiW*c!S?S*$E@bWc+|*K0)SxQHO78*wvD z%*wF#pmQ%8s=2os)SxQCDyghtp$2Ik6(EWlR3%yIoA#PrV+2v*eL9Jv2309m`d8_M z0kxg$@;p)0peoHu_rqFgVmf!Qhec6?stnBP*LIfkd%Y4x4XUy*tKR6lr>XEhQCoOx zNDZoTtn^ntwsu@tQvsr=K~aQqjP*rB7=iUu3%cU`uwWYU))S#-uO82OZw+37@RbLb} zsH(!O0Rs{^cPV2;QG==)%xc~?jqf%`f936>s6kbol^&IC?#yUp>ai$lP}N|i*OYzP z0t%Xn-pX4IYEadLS$oPKe`KntC~8pEf?2Hwb+}-vvnXm%)dtn8-wWrh{vuJ-psE9E z-TD2$Y}O@F)S#-%N{^JnV`sHB6|A+l8q}cr2h{XD=bg8yIYd!|svavn+f>g|-S;Et zuiR1;HK^*d(*3Y}K$eT9#*3l`RRdOfw|ryxG2e}t&e|=C8dMEo)_?>9ohOd>qNqXD zh?U+)9sb=Tzs*Y6##=*bP&HLDiI% zp4nbU99G=aI#JZ1YQ{?M=S$u^^u*MCQPiMn&PvaRCHu8#YAQxsZ#Aev)dJLu$p1NS z0!xUZ231Q?74EHf?t6QRq6SqfR=P*^s@CPTZQ&|W)Szn3N`K{x32P)ZbzKxSsM@g7 zbMK2pMQ)l3+0I)HYEZRhrGF>7x2pXQQ&~h&gQ^`X-)8ZrW`Y3cUbML=YEZRj_5bIT zbhF;tta+lSLDhkkey{ZvBAhXGQWQ0)ISh6q6SrWR(gERDeTwYW~J!htp+uyda%-!&;5INLsKMx8dU$zE>oLDQG;qY zD?J0$?^bYtsUT6*pc=tSzgLpJOBb4o(%D->YEX@2rQd7)@R^BC6ezt{e*n?9JDC5jqUV_50;+P(6dbANb36g8;EveNGre?rhsoApT)HK@jc zT2;Qdb2azx;;kVysK&F>@0GM`0_X0lvM6d$O@LXo3J>!AAJF}9peSlkO=P935q#F~ z9;Vibq6XC@m^E!)O$OC^a`*=}D{NP9HK;)~g_W+xk1_G;naU-K8dOtZ zR_ZQ~ojaoDqNqVN4QA!(b3d2OnktGKRMSBn{b%YlQ-?)SgK7pVz3M$JlE`_Y|5p?> zsAjT?F6a4#xyv};D|t6>4XHsji!gBn!xSm_pK zueHbbQczW4QPiNC&&u~d_%m-_z)DliMNxxl0V}<$Jn;CebEJ$CMGdNjtn><-{%ilO zHfyUWYEUg=rQhpq@|D|6-4jI(s>Q7Ij_BIme9jplL=SHbsX?`bmEPNo+a5B#&B`Q- z8dOVJ>E4^A^6+7%8j7L@)iO{|YECR_YP2Y7P%USrXSPds>r^teMHDrtR1v!AxN4lK+@h#KwSkqc{C``fI#<}{qNqW&k(Hhgvlfk<$7W3yMGdM=tn|%N>IfYc zm^v3(={!n}c|zKfy;)fP}4euevPDphZ94XHu3m6iTpv2y*>(Nr~2)S%i1 zv(99$k>Xq90UX?{rgK9U-DzmuSP20lZqNqW&2WHLQGT1q9Y!^ihs=cgq@7#YVgsP?ncy|>8nSH6>+UiHe0q6XCgR=W3g$~w+@ zULGil8dL{a={?)xPS+RPthJ)3L3N0gelNd|y`8^|+z~|$s>7_3$T=$H&qU6z9JQaf z8q}aV!b+b;8;{TKs8XV+L3NasUMnL+yH$}2@6%BfHK>lU(!V@bd=u=BsoA2aL3Ny! zo<;Yjd+D6#&xxW2)d^O*g+zK2Qvyd774jH%V4s6llWR6xPteN6?4q6XDD zR{k>UzXsc#Upe*wZ#AevbskjeH$ew%Ryk4Bpt`_Hzt_|Wr+hzx?ok6pQG@CtE8XWS zr_S`l)HYGnpt=OJipC3c&b@C$QG@C-%o;wuR|K2oKhRqZYEWHarRR+ZCzkql6a8Lw zL{Wq4Dl5GQ=vd`YWyR5w}a@fCDp?|4)BMNxz57Aw6MjhDIa5L2y1QG@C>E8RCb6!QSbyilPS9T~>Mq__TX{Pg8$IQG@CptH^SEb^bedqp8$`y)~o; z)qPgFZ!Fv#ezK|ZqNqXjfR(O%pW(eqnCc^n8dO0r%db>f-vO$7?L|GgX%HNYIowLa}SV16g8-xz^qL}Z$GnHO+`_I>M6|H z)%`$bQ=tJ~kimuyzpVcu#`gX$ft1aeds%MgE`sQ^*bpnA_rkIKWtM=dhdRuna; zKCsfWP1Mn;H<=0)MGdNdStXS%Oc?9qz2U|R(f^lajT#6R-~>dYEXSUK`}&hMYosV@P<>&gN6Mj}37vgo zvnXm%ePyL<7~m-z)6-1in+g9$%G2 zQG@CSD}6#7-f@g`SJ_7tHK=~F(*1BiyV9#{)*4aNp!x->^0<2aP2Cbj4XWR)^n2x* zd~}$pFeAOypa#_+R=S3*0tZYol}!{isQ$9@y{zF+!o2ZbnQA498dQFf=-*G#zqVJ5 z)}pzod7`L66^xbcQ3>Mw>s(VVi=qZqa8`QWDD$mCahnxvl(!nxpb7!A9wzB_(9cj}SNYAT8vRG~l>ja=Wk!cGuH4XV(fp5F`R?DM-sQG+TBE4?Es-szb0 zT=_&4HK@X}(zDH^Q2x%}Mk9{)){q)h;aEkHeWOUx9JQ$MK1D=PgDO0$=+eEM@bsIh zmZGRZ6@itm{Glq_?wXn`iW*cAS?Lw_-=bN5n%XOh8dQ;3=@}s5tU=Bb#~V@9po+{& z&%Jq`FHdf>5{>cJkQ!7`Sm}8qU-9SjO_dcz4XUWDbPMZd$mHxBy+l!iDjF-j5=F_m zsi)0aC5jqU(OKy`qIYQv6*F~N6g8+~z^n|JV>UGPM-(-vVzSabYRU6c*-fP$>#ZR* zsA93wU-`d={^d+n5Je5D*sOGqDwgzKJyZQfQG+TDE8TlD9?5^!)Jjp*po$A>=%$rr zO*BmA(gf zHnB+tQ*}jAgDN#EJ-$ZAPvq=}lSNU3Dh;Rw%O{4lS$jlLgDNd6y;gpmRQ-&pr=qAq zm5!CJ{P97%LYs;-(OV5_P^D+3-z#0MFUw8k6-5oI46O7V)%wHHrKXyRq6Sq)R=R~_ zl5KJBh$f1n2301Qwcv4gXAAd=q6SrFR{Fgzrm3>bw(z+qYEWfirAJE37j=V~iZ;nx zLuycEWu@Qi!@tFnnkpcQ8dTX>>3QQ+{Pw<$)xEckC~8n;XO%+s`GZrlhch)>6g8-F zu+lAD@o3gKQx`;0gDNL0Jp+s$;=Z5%C5jqUxnNefNfE=_taOvTHKYbrZkQEw)=TGp zzLqFzPzAuOwZ$qQvRT7LQG+TE%vv~getA=yMNxw)FU*SBwT5%27bJ=rRQX_5rgeEn z+pI`ayw#uvRen}_KKz_(zw=C#PZTw%3b4}Wlv-<(?X_9$MNxyQAS>Mu19R_LXKJn} zYETtorB63^*YZ~YgP!(pS=Z$eCyOuHaTNE{@im=ja<;`0^o#&J^Q@u5$231j3 ziRDO%mA}?hn^i{?HK>ZQ(tW<{_VU|IO%z29s^YA44gZ-R+d0qg6GaWG60Gz})aJ@W z-%qD!fVZNkK~<8Key^7W+<((Q#WZg(|bpsufIa6GaWGvaEF0=!^%Bn7Sv58dT+2>5Srq5Om7XTK~;;D-fs+g8ndXW+M=jIRU2lFuUK@xsUf1MK~;y9K8<$jSKe9qjiRVQ zRTtF4&~JP%&-7QmE{Ymd|A2~`d7ST*uj;2LYEac<<@+D}IXpdzb5tgq<*gw#sOq!Q zyRXb6Yv;3BB}7q!ssSrqjllyu|6{7NC~8nO1T}YVn(?M)ilPQpBTzF71RXTBPZTw% z8iOi2aeG!%k3~^~stKqA>wh}euW*6h8d8I*DJwnqril17yUofhiW*eSKt2EEU&mA} zQPiMn4l4e=jz3Ke6h#fH7OeF53V!YVTT?4UQG==_E4>HkQmV=>Q|ClcgQ^uP-|37$ z0d05mG4)3jHKuS`;;?ITsvFFT`TMT(oKi{@HK@A7tO;ovJNrgIQPiO7!AgIx z%(K>1wk_N&iW*csStXE_kJmoIAXAS;QG==%EB%$nHg8(rRP1@)YEXl!H!I!3p-Y1A zGF40zHK_W48Z@`adQ;s*QG=>4E8W6r6Y54ZwM-N>sQR(eC#k<-HrF+EMHDrt`m@se z`GrRZIDf4OKHpmnYETVerK{0$PpQi`D~~8@Pz_|ITi9z|luxGGh@uA7AXa*2+mh!} z6;pwts6jQDm7YaQ4m;J!)G<-ipc=wTSH4rw?|h~{h@uA7P*!@+mbm=(7N!y}@YawT zRKs9a{A5vYn<^)Y8dSqs>3#42sJiF)y8300<4sfBwr$(C`P8;;BPmncwrv}!?KU-2 zo;9;(&aChLBlq0<`n;dt+OrpTa_)1a$+xto`iY_j)o57jQ_!UyrdErh2Gtl)dzXhh zVd{n`YEX@3rJr*5CK1Y-3cbjk1~sV0fhxOT^(xgK9FYH7jS{siww@q6XCzR&it++amlsW@?WpYEVsO zrB58|_B@ZK@ZP)!3BD_mI5@fCfEI}K`3O=qS1;k1wuJ->M@D2f_X0j%_WRcn8I zj%{IkQPiNC!Aj2n72d}fYigD#YEaDtwQ|vmm!^)3q6XD0R?cHQzk2kn`NPyFQPiNC z%}S4yC_fM8GnH_uJ40$v&0(c~-52WEjSi;DilPS9Tvob;r#nS&W2&PlYEaE%rFVK= zhhF#mt}Q?mHK^vpS{W0Rb{_QfS#Q56YEUg;rFTSY;(YpJ>bWRtP%UJoTUa~qD$hN3 z!e#CZsX?^}RNJm!HrZMwMNxxlF)N*6h>PL#n(82m8dOVI>F2e0$4}2$bebq?P%UMp z`+Tp&V^`T)yF^igY8flt=UZ3y+h*#yC~8nGXQkKWf=|CVrz`!uVk~!ONDZnLtn|DQ zC0xsErV5Lq2GvSfD@N>j>rJ&0MGdM|tn^6f^EA{yQ&UAzgK9M^-NOBa7Th+qUlcW{ z*09oP><#MG*3=78)Sy}mYweg{XQrtbE8H1UgK8bDHTBPH&-*GUiW*ewVXYQfLwL@; ztwm9TY6Gk_z;B7?o7>5vs6n+6)>;syvgewzR}?j&ct_ZuxlQG@CbtTnJ~ z3(wQ2pD1cj9cHEXqCKZhcTT8!RPGW*4XPuo^d5V?Z`EI>f<#e+>L{p4e+qb>IFhV! zXGjgIW32StJNnL5&tE!K6GaWGI^IAYchUq zpR&rc_jVUW4XU%OGKvc8U$wlgwNex{sLrv{&nro;EuO2xT~XAaI?qZcUuna>kG59W zb?!8%L3M$Ze#+4wof}{(mndpbU1X(uZ-UQB@0n^NiW*dxV6B=tmin2REs7dcms#oe zHZx=Rc+LRlMNxz53M+kId;SdbOg_|lcN)~7y2?tw;jCA@t!JOlCyE+W*I4O2cFMeo zJfBxbQPiNi&Pu=GtS~NJCo0_65>eEk3S^~g)vTA*^PS!eQPiNi!AkFYOZuH}W@|;> z;7)@YR5w}abLHpI|C~cjx3HinYEa!`rT6oBV&1J|s=X*`P~B#w_o80|dU&>QnkZ^e z-C?EQZ*(6Yl-kxhD2f_XcVVq$@%KG2^+^;psP3`SZz=-%pL0Gcoko(4?hL6xb)S{a zuvy#tp8Jg|qNqXj0Mv&1K|gJ+L87QZ^^lcLe%R+R%S^2kMGdM)u-4pJ%{|wY>!PSZ z^%&M#)Uf?7TPxHicN)~7dcsO)czSfEdZsdqq6XDdSgS(%lFoyvPQH;SYEV66rAJE3 z3l*!H8YPMvRL@!I=M|#%Xy-vk*V-$J8dNV>>AAO0kC1Cjy%t3cs+X+vNov-Gzr#$$ z-R#bg8dR@9wf)>`sj1?ks6q9bm2*SGuM+`51xYsy=A4x^6kfiKbQ& zhc#7A6g8+mu+nMdneoPR)f+B~8dM)aH61;6l&!T>6g8+mvC=bk%qpuZn|dXR8dRTI z>3&$WWopm4H||z<8q}cr!b-pGxlv(PZCk69C~8oBWu>3;>=*U!nCd8s8dTq4t@T~5 zduA9QiW*ekK}Fs1$8!&`UlcW{ez4NB&8HaygKP_*iJ}HoFe}|RCN4ae+f?jr?hL6x z^^=v(@cZKWD@>IYMGdN7pl!}R6eZqPA~4mQJy`johWKhg#>k?&-Es@)_hUapz>vmVbvWlVxRTx%!1_%m{xXV;yQPiLc%SxX(ZibBa*wi>t z)SwCnDttgW&os7)q6SrXR=S1Xc9(QMI=#X^5Je5D2&{C5^ z;gS)RdzmUAiW*drSm~MVQP!QF?`>L(q6SrDR(b{~(yq}`TWgXiYEVUC<^15+(bP9R z-yiN2MGdN`tfGpFJ2cHkTkEbUYEVUErS|~aj*We5D&#JAhSZ>n&PtEUkAC4=nMy5+ z8dNb@IY0QdIqlqOrpk+=231T}dhWeFf7*FdokdZDDi*7xvet)>|9NJ(NE9`wVuPBz zWI+#G>xL+5P{m=TXPbIkZyqugWw$#+YEZ>xl~}eg`K^K*OqCEt4XSvobgiocE_?oB zp^qqPP{n7ZYZV{=>zb{#Runa;60p)ErA^S^4W=H7q6QWHccXoMQp)?96L`L^sYrX= zX}JIWY45*LE)gsJRwUxw(VjCvaZ%LZT8UZdoq2;1kv&(U-lC{Mm4ua^Z4x%`?kuZk zo8_XYL6wx1&Tw9ZpcDp1n=26h#fHRIHMTs*r2#4^wwVQG+TqE8W7i zE2dO46>Fb64Qf!OVWs!j-_D(K9<%lHsvwFQRB2i143mG{>)E4*h@u8nI#zm3SyRy8 zv(^q#)SybwO7FhDly4Bxw(zMaYEWfhrTfOf&Yw1$in8CG1~sTMveGj^=D6jjnkp`e z8dRA;waJjOsHt9}s6myPmG1MSqAqc6b9C~nMNxw)3#b_BVwE;^UlcW{va-^BW6Y44 z8%)JK;7)@YRM}YR7G@pQp|h#-qNqWYot3UN*8fXWQ-eiOgDMB8BU=}Eu0-2JQG+Tc zE8PzVJPSHtYrPgl4XRwAf{rwJVk-GTcN)~7%FRlT%HHobeKA!}6g8;wu+lrdj(vSj znwl(%8dP~%>D8g^lb_Bwb>G-4iW*e;Sm_yi*{0c7OuZ0A4XXUC^d38QniS6MfUXti zkUI@(P!#~xaCLp>Hb+$%QPiL+$V$IG7#99-UQ@kAQG==wD}7)2*L3rIUModWgQ_qq zeP7>_ub*yf1&X2uRS{6THUthg73Q!z4QfyoWu@<{RPG*JxF_&DqNqVtjFrAGzr|rZ z$8sA{)SxQPO5a!8Xz<^=N_P@C~8oZ0abM6?ozhaa8cBtD$7dW*M&;$ z2ASF-iW*eqSm_f-w|2?Tn0g|L8dT+3>C?^3T_b`_MLg-bNef2yTsky0*qNqVt1yq4-eR`U@ zDT*3YRaxo#3hbTJc|6kn(C3&tLuyb}W2Nt_Uf%HBIFHT_^yV$afoaA&ryeEnpRE=0UKlpXH zY3vcEd``GCqy|-ER{EVojG}APno1*z8dU$W(mRJre_nStRZ$c*sG6|Sr?wbHYi={u zM-(-vn!;N1##G2{YN;q{P&I?K_EkQa!_-Al)Szk(Yh~Jy!SkKoZ&B2sY5{A-Uobb= z)=GEMojf(DTEbd|x<}Y!sH&r0{+ z;C_)7o2ns-8dM!v>6tBH!35_YplkINMGdNsuvU8Cb5RW$WN6g8*@ z!dj_&4R38K=2>@!)Swy!Yqj=IKh#taQPiLs3~S|Hz2usy_M)gkH3ZhWe<0I*Qvsr= zK{b?>o)2SWEB3(DVNuke8U|`#iEH&uy%R+Zs^OsGPZ>MaRKj!a45>ji0@UKgev?d< z6GaWGk*xIYtH7orM@{t-MGdM^taR_KQ*@-~NLeU~8dRfM=~G+2@`b9{T4zL2gK7*b z{f=l>)5*?1K+p3(MNxxlEGvDk9MYtpXYb8+-kl*esK$Xh*=1lITdRpEYEX>_Rchj- zN~ZipQG;p%sQO(3=a||riW*cCK{Xy#p^T{@QPiOF1NEa$96wVDFSyg729-Z6{k-06 z9^|=?Dkq8>RFhaGl=FPgOy>oc}DTe26d5tJ)P)%W_TNs@2!zo+q zrYLGqO$Ak<=pBDk;V!z3QSL!(mxXwG%}RssL6= zWrjXuSJgH(LliZrX0S>oDtP#Q=a&h3q?{K;4XT-}^!Q2`KFc{%p)a}9pa#_}R?cD1 zuj0-7e=}836g8-3v(kNIWrZW28U81V8dP&w={YKW|3;qk;S^ESpqk4{zmcA@`(a(% z!abs>K{bz+USStje>=?7dr{P&n$Jq_MWZ~da@179%kB)RLA8LD&amva{p(DX6h#fH zg{<^QIg$QG8dGgVQG;p`sJI8be}5PtiW*dlS?M%t6d36_vmF&h4XP!q^z%CYpvq<2 z!uO)6LA8{X9w}dc?YeF%{uOtI)Sy}hYc;y+{k!EdqNqW&oRwZ3Mnu`R-qz|WiW*ca zSm{-7e94f_Of3{e4XTx}R>Czg@0&U!iW*d_K%FUEvXQA^QPiMX%}Td$Y5j~HO{Kf) z&X5{ZYgp;0oMY6TH>PTeq6XDkP)}k^@H}x05k(EEb*%I(+9PcUXQT8SwN?~0sMfR6 zeWT)^cb@yGyP~K;wSiScIY-^v;=LCQf6bi+HK;bS(&MY)(OjN=Bcmv4P;FwRSE99p z>t~_DebpC54XVwo^z-Ud^XWrV<3v$|Y73~7{YTz2wM`T?sJ61w-&bB3zt-~%`#=;m zsJ6jcuPerwXKTg0?#_@JRNFx{Xx`oPL|;S{HK=y5(k*OyvYF@Ep`9pdQ0-);-&KA& z^U3pEIbRetsCI!0Sf9c95cKmpA&MGQyIDn*&-L}eeaR|uV0Z~6*HCehC4%QP#tEa_cke? z)c2fwON*ig)e%;@h4Yh4YHMo^5Je5Dqpb8Sx^>rl&u{2fh@uA7F<9$tl%Q<3))i6I zpgIm~HP3q9^PA#7qNqW2f|cHV9qqC%nXQ%nraMDwP@ROeesq30%Tyy#)Sx=WN{aP=o3&E1kyN z!1)DCWfnyZs(Y;T9w1ceOjAtN7DWxJ`>gZ~Fyu$x!lnj`q6XCiR{AM-O?$ktsb!+5 zLG_T8zOOCC+s-$2K@>Hp9HY>-k;4H&N7}dJ8Ju)nA^o zXqE@=45>l&j#YA5YhJ5_p7UXAQPiM%532H~itnj#UvouKgX#mT)Y5J4@B7`;~gs6q9GmCmql z=8z9<3s;Jw2Gv(qdWAhw?WpIvd{-1TsJ^k%=dT=LmpKQhPCoi0cN)~7`p!zP4(IYl zn`x@FC~8psV5RTt(zuCNO?4AR4XR*PdbSyqWVGkHyh0Q;sD852Gu!;<*PTBiD~cLae^}}L#*-^UJm>jVqNqXjmz92A zgHce*PW*RiJ}IT4=cUuCCt~V zzp1QG+!<1XDkLktnh)(+tGKDUqNqXT%Sx}6=lfm@HZ@cfHK;Sm7eCkev8dPCfIY0Qd;lsHnwpLkD)SwE- zO0TdPf5-W1s*@;cP=#luSJ*=BXYMvNQxr9*BCtv!Tliz${hy|eh@u8nL{JY-{~BQG zyC`ZjCnU#JIP$l`FFSb@QQPiM{0&Dedddbh!3{lje zqNf>OA6@Igrho>f&WduMc)Wk-5RH|7UVl=z{$$GMx%!hqm`Hl~EKm zsA90vPdQg3f6w2+{wInWR54lUx%Xi1J1=dmaiXX}6^oT#9gd_=WBLg*!uPP{n1HO!nSiIo5fumBmC+gDM^?J&XQ& z67bE|>MM#GRPkBqokOPsAugI)DT*3Y30UbKRj9z>(x&c;q6Sq$R(jP-ee8$l`}r6z z-DyyRDiJH)!hkXd4%%9!L{Wn(F|5_;@q`kl`iY_jRT5AQ&Q_^oYON@0P$gxhSEBJT zl6d~M=dLJfP$grfM@o!TS^l%NBE52_K@F)G7OrizN922~1H&LxyzQO7s( z+++6;MGdNytn``^XZ$A58DN$uYEY$uwIa}I$x0JQTav` zHK@|C(&MZBzVm^mV!w80NDZpAtn}XIR=qn5O_dNu4XSjkbe|tnBjC8HzM`l>m7bLz zm3r3L{Wn(BP-pb-u>(I$5f;@?lh=Dm5G%emGe{Nnr*76 zC~8n;W~GzQnJNDVQ{6;SgDMLvJ&P{eoZ+jf1)``ym6erlVWi=GCYZV?iW*eeSn1xo za%=Y!rhJ0jX;6bIJ1hOX*3BzA!cT%3c0j3&@q6Sq?R(jrune_H3Qxio| zgDMv*eP0Du&+%MS_KBhfRc==LzN*gM6xr5#Es7dcc|iHZI_vCQdQ`@L>&}oGRC!tH z`wC21cb}HE4oH^E_3%SBOxssN~kv6|g5bxjmC zs0y;u_Z5&g(^^x$@7!rngQ^fKeP1EwRhVunrzmPr6=tRH>(tZ-o+tWdqNqVt1k~un z%kJ4)lSNU3swgXcUyT}6zG&*8C~8m@19dl5_~oYFi=qZqaaQ`iUe^y-#Z=Pw?hL6x zRf3g1wbkl*t+%NvqNqVtl9gUlt~Dyu)KqU#)SxN_YGr`mQB#XWQG=>9EB%ziR!?2V z)HzYqpen;k-&gSIFPQm%4=S)=*MGdM3pi<7s>p6=K z6h#fHhOG1{p#1e)p1;OiBZ?YSjaca(6+Y>?s9_fbzpQG==lE8P!AZu;kWl8W`!odz|iTC&p5Yx~2M+ik6K zqNqXDij|(D{>+~4IkR;YMGdOftn|B-jz^+<{vKeiC~8o(fwg*9pa0vo@T4eeP_>1% zB2Bs6-P9*h)SzkyYu)+QV6Leo-`p8egQ`8O^>^Im+osBkq6Sq5SS$0BT+ZoAKjmJc zs6o{c);h9jl)tG(qNqXD3D#PXv9RYJ;G8IGP<4j2mOLr_#n$>RiW*d1V6BJ~f8I5f z;=4OTYEX5BwW|Fp-N;mBQPiO725ZefQ!A6Hexj&B)g9Jq)8bZXQ%glrgQ^Ft6(?ll z(WWknq6Sq@SSxI{_(e_q6h#fHUa;2Q<#QgHO7p{=AvLIa!&+a{#rNDfR2M}Jsy?um zU!0x`Y^_0}s6o{i)_PF$Zaq`0L{WpPAFLJT{-9i@u8E=sRexCPV2DI1O#Kr@4XOdK z*4lo1YMROz?9PxHR0CnH%JC9;?y>8Lq6XCQzT=+P}{-{ zqNqVNgq2>2vZZ>R%G4cE)Swy)YsI{`$+>;gvrWXG?lh=DH4Ib_|E`{AqI{yLK{XuI zuo+!X*;=hcQG;p(sQnvL%`-Js6g8+ug1Yzn>2p&DMNxxl6sW9EpL*_yf<#e+YBZ>L z1N(aJD&zlhXGjgIF`)Wp-Idw4u#6~bP>lsOKJPBi9Z?Ta)Swy%YEh*@6>P0VqNqVN z9@L?v`?HxkFNzve6F}t%yMLCcpQ5NiHIbFx_fC9XxR|N5zug&9gUS!o%WpBVnyM{| z8dUzQ^mp{@C&j#FYJ@0iP)%axoMQM@>hq++rgn*<2GwL%dT&!Z)&b9X{;eo#P)%W# zNY=`eKe6Y!9RH6y4QfzL1y!g0J`?@F4 z)OJzSpbB86&tCyY+T}6zL=-isX0X!9zgsXpyQv6&-DyyRY9=WE^R+6PDk_Q^RI@-e zX%OnPsh*;!K{cC|PNUC?`oX4Fi=qbA99H^tldiz2t)^~>q6XDmR?Zi%{L0kjiZdAf zyu$o*r$G&>d8{Idx=^&6vrDSVAc`7P^I7Rrz{}a8Jm2<-ou6oX*Q$xdVvo6?L z$3#(sY8@-R`x?_MaIvXiQPiMX&r07{u9^OxzdcAF(w!kSs5Y?DPr2`uj^}NyhN7rJ zwUL#6=P)#ZZx~Z!L{Wok6Dyrznzi{nzj@pxiW*d#StXOn=l$FGxUKbC6g8-}u+kYe zE7u{XsT98MG^jzfm6aY}yE+%{WU7WJYEW%srTcuW!#S&)8X}4sRNGnU`zcN)~7+Qmvg<^S#-SZAt~C~8pc zW~I~EF}%ljQ@un{gK7_})bc669zMf!Z?i@eHK_Ko(%*m&ZB_oKt@S_@HK_Kn((}fI zj9+t`iWSy&iiO; zyeMi=9Rk&HPJGW*Z=)z`P#tC!LDpK@sdWxp>zXKPP#uA_a*b@{`OBFvqNqW2l$CRG z=hymM8?)M4@x!>2rv}wAR?gwUuiqOoUpAFT6g8-hvx+Dx_qbe-Ow|%a4XP8MUhnAT z**AKNq6XDTR{D8$37^UHBsEJEHKO3pG ztMr?=J(;NvqNqW2ft7Ayv+0#yoAMV$4XTT*bPKDrUQyZ97E#ooy2MJ)0KXcf{b%Zi zC~8n$W~KXKw$2TEoAL?gPM#W6S6Jz%oG88TX;UdhQG@C#sH1U8IJX{pXI?@SHK?w! z(iv{LQ_1s`-Bc7csIIe$F8kq?q*->`S|deKgDQ}f?uWPg-I!x)y(nr>-C(7YKUF^Z z15@WkQG@CxE1hAkf+d@n`YwtZRJT~^77ji)$+LxV!n>arHK=a0(ocCzFZomYei9m>KQA&XFC(^ z$sJRdL{Wq4IV(L4Ridat^@f$sFkIDWo_*u0C~8mz!CEi7 zxA|*Z_)ioysNS;Dr<)Bd4MNxz53oD(*iG*3cnrbA98dP6drI72_s^HK6OpOsm4XSUf^xM?zlNxyT zjeVl1LG_)LZeiyv*&oIWwR@(vi=qbAZ&tc*q-!-J(9~m5)S&vqN@sYZ z=C#?TB1UzmK@F68>LBQ+Y*EgX$lwl^|iaOQu?jq6Sq6=fdFYqvzh+@gF!} zpz5`9swiqu`LNQb>?i4VdhYc0iJ}HoNLZ_V@ZvAF)>~23pz>v6G zz8V!ia?I30QPiLc$4Wo1oaH-vCjUqjHK@X~a(?h@?3~nVZLNsW-5FAYDgrCLer>K@ zz|p#Is)(%gNEsh<{Q^_}iJ}HoBvyI`2-~+9L&ja@Al{ ziDJ9cpaxYkR(dQKtDeyF{b3bR)SybvO83L_XOfJuwT6kJ22~1Hx*z&=4sve9^nAEk z6g8+)f@+y$*)>y-MNxw)6)U|5_!qWE15+{MxYM8pRccU~j;(oWs)Q(NP^Dp|=Zz-i zqj?VpDRB2i16}E2dKZk9tg`%iIl@8R%z*Iv_ofSn5s`RXM@*fkn?qlk^C~8n; zV5Ku0lJUz@Q|aQmGo%JpMpn8XeqZwBiK)7xs6my9l}_VE{{Hz)jT1!;s?4l(3yXCf zSjN9cZSrU$^&baUHs^}snVjTL6sNQ z8Wfy+xv8F_s6myFl^)C8t8ag3YMCf%P~~T($Jg8CX$zaWB8nPR1z@c+{fezJ<(t5r z1~sS(vPvR*)aYU%W|_(^iW*dfV66%J;>|PFMie!u3bWGpHMLb|XZP1Lc7P~qP!)l- zR`)vC&eRD})SxQLO3wfWe69P!(gP&&&NAL@r<|SweS))SxQPO0Rm^8vH45 zs*uCQi=qZqSyuXV6EHTR=iX+3C~8oZW93}<`StMr zm8-Va3Q^RcDi11m$C1uIK;PFLQPiNSz)GhvEXw-vrlKWwr$G&>imZ~#7M569!Sj7@ z8Bx@rssw9QoBhZ0oBctes6ka3)|weR(G1(dt)i$wRfU!A8;iO$eQ)ZeC~8nu1yyb2 zFy|zvGmMqQodz|iss6ka1)XLi9N|>4=iW*e)Sn1Wg;krj*OdSzL4XXOA^qDAIk;hd{y%$9dss^m| z9w0`%I%!O$Oy{SiW*eSSm|BL zv_=#6+7@;aMGdOvtn^x$B}M5grsj&G22~4IdKPUm`=sZ$6_-R&gQ_Jf-NIU7A_d!8 zVN$r$paxYdR=P*kFIT9Dsa&F{LDd@8`gpxs4pS{eQG==tto62JMbCZI6j9WmY71+H z?B_q();c7L8dU9A>HB(7q_OAQo_C_CLDim>b5QZ?;LfHCY^}s8-5FAYsspREqT(eT z5#Ce{QPiO7$SRAdRA09~H8n;QHK;nV$|`Ec=v1C>D)xz@232QPx`q8`G#P4ZeH29v zsxGXY(=@-r#F_TkRGL)oG^jz<71kP8U|0%M4MkCdsvE2osl%ufrY4J`232=f`D6=Q zy-(-)ypD^a22~GM`9+QIII4@S^-~lzsCu%>E-FKtv!3ravZi*YK@F;2tenGxU%ppU zjI*^`ilPQpZ&v9=g%5rFq^a4Ws6o|-RR&Qp*WJu$>Vhb0Q1xY{cVCmMHtK82H;wzg zs6o|_RWey?cam*OOcfAC4XXaI*6*zAoNRN zDGwDz4XUBAR>9}L&QsyOwu_<$)i7AA>(S7j?}*-tq6XD)R(j{K?s=OJwpNOC?lh=D zHG-Aiv(2nu)6Y~5QPiLs$x1)3n?(+eF*QOIHK<0h($A}Xu1dE}?Gi-|s?n_UeJz>4 z$hjTR8NL-o4XQD$^nJbA8l}Cd#Od8>P=jhLE4|-%pD=q$Q&mJ!gK8Wry+2(0D)w+w z14L1SYCJ2w-=Lf%h z8`dvn>ZK@ZP)%W_-vpLx-ZzS=Xc^sUP=jhJD`$t`*S?iax|_-`iW*eYSm}QF`MUS- z^g4^82Gw*>(HDCE&7liLQG+UgRRY<<#|;K7vMszMiW*ciSn1tYyfB;Jms6jQCm418h{CnwbroM@y2Gu-Pdfv!?FPZ0>k|MJ^LuydXXQkf}-7mH0 znypn;6g8+8fEx5AAOU;~$>0%{5WfpjymI z&ul))8nm{xLS=EMK@F-Upsr1gG}BamQPiMX%1UQ=;LMjNraFtF2GufFdXCD}df!G< zvqe#ZYB?*NVV*FtZLA8>Vp6AOR8}4~u8M3-F zqz2V0R(gMU|IyeEwuMbaQG;qVE8W6tfop1*nkkAJRBKr2v0Slht7@jsilPS9T2?y4 z`+X`8GxbXpHK^9H(qnmhlC?KYrO)P0gBn!pS?RI7saiVcc3VHM2BN4zwSko$%U$|c z{%C5nC~8n`WTpGz*e5qCnA$3e8dRG=Wh`~=l&Slos6n-vmCkT&_OCrnh0pFzgBny@ zSn07`B>gX#b)oyOw#Pgo@0=6g8+0 zvC{KK{~HAh+gguBQG@C*taWu#gAJx)=5nV&4XPuo^nIP9scD2f_XCs^s(W_+JXJ57bp?M{Ol zR3|}Aixv>hR6bGEpgP4$pRyl>iok_?khT#;4XV?i*2l}>IRnfSMGdMmtaOiBv?YY+ zTjI;2s6lm>mF`h5Dzy%#!hQMVai>8Is&lOLx?Ez%($S`Jh@uA7c~(04oU_tsRJT~^9@Xv8^CPCFiJ}J8ZB}~y%CLW^=ehE*C~8pMVWroU z*`uRWwY9#Bq6XDnR(dS&S@GXdQ>pU1Go%L9Jy!a@3M{^T(^M@{)S$Z0O1Cig(u03Y z4HrcXst2%E=;k4vlblX|qbO=nJ!Iv4J;ASy%c@l~bx#yEs2;J>ePj6Feosw>EZ|Oq z8dQ&2={052k~XtVWf4UUswb>;3;Sd!;rs*ieKi+F4XUTCbcPL1jQeG3j3{bQJ!7S3 zn*`H$XEU`;6g8-xv(jU^X6qb>O}!9B4XPKcbPL~K+j`7Yyn^lwsX_IUm7W1Q{+#;V zRB2Jvpn3&sofx$InW?U#s6q9bmG1LpmoNNjYQ89HP`zQL`^L|M7d-pMc~R7$3SyRE`C~8oBXQg{@dA|j1OocAuPJJ5$p|QG@CiE1mq;upvBG^ZlZzLG_!J9$#syO!NE}=9MUFQ2k-0 z-@t6xI<%;5VVt7w45>l&mzBP+){B1+H&sp)HK_i9Iy-abAXD8$QG+Ukvy88gkIc~h zA3FItqNqXT!%C;|Zc+r#_feZgQG+TZE8RCD`T55A#q6SqsR(iHc(LQb%Q{jrc)1U@bcvgBAjWXobT2n5IQ>kyQGBr*VHK^jS(tEZ}W#?rzbwCs~sN%9pDQlH%cf_;SOHtIIipNTi zlsOA_AGEa+mvW~;4XXI8bU!>j=v7}+)kRT*Dgi6KBkDUOPj*v-L{Wn(AuBy9e|9hH zoaFS3y;&4Bs1mW#qq6Mq313Y;5k(EE#IRPpJAt!I#VYMigBnyxSm`u;n)rF{*~*Bb z231m4dQ{f`?ftuy?xLtcm5h}hm3<=a-ECVqM-(-vlC#oJdEvF%wM?B5MGdMHu-2s` zhdt-0U!tf%m6DZyUIh-+;%l(GTc#`H&X5{Z^zYNNf7{^KMwdJ@Y#@pnRH<3%vtHw% za?W6M-EzSbt?jw1+%Ae5RB2i1C3 zoaaX#xH!qSFkE?e8q}bof2)A~H`G2Bj`z=0F;VWndBFSMP|M9qkL9`p`)xASUKBOB zRvuP5jb6W(d%kCzCyE+Wd0FYF{If-6&vy=|MNxw)AFTCrQ@T&Kg7lP@HS8dL>gt$a(u9Y6`gNmH3bQG==! zsIBdzv^7;m6g8+ygZk7kb~jT^MNxyQ45+c$-h2M?v%e^6P?ZIB+ULuCTWh)~YEYE} z6`{thucp?Cq6SrYP!(Go@jR!T5Je5D3ZN!_9kJBbdMJt-R24y;KQ?QRsh^^#K~)J< zl$qP7n2J@&-8ZN~Rhg9@l|Qz0zF;bgC~8nuVHHV^BE4{bb+cdLhhRsA#gQ^ZI=XQZ# zb!K)SZ);5yMGdODtn{iE_2tQ^rZ$P9230*)x`khEeepbh-4jI(s`{)F%NCCQ>od~U z3RlIQAvLHPu!<Z{Xx5A>RLDi6zezSC@ozHnwO+-ktZkvcC~8o(V5QGQr^D>> zJg4jtMGdN!u$J$b;6t|715wnVY6U9kiR+t9MXct|kQ!92Svf!WmAGHUnx^uKq6SqP zR=Up*>GjC-JzG;z)Szn1O7CDJ<-eQV)(Q|s4XSpmbcS_)e{%k#9w{e9QG=>IE9ao% zSIlr3o&TvSNE9`wIaRGnb0Xm{RJ zH#I^OHK;nXa!zOb+LbAe^N6YMYm+EyP<3IIP*j_}&pr15fug8E)s>Y#FVES%*mD*Q zSHqnKHK@9=a(?hD#s7zM6v*)_J zUlcW{2C#B|@T+9R6Q1AeJr+d`s)4L@KOFwyl5?o(9u={cJ40$v4Pxc|;Maw;(>?d1 z1w~PVYA`FkBg%NmKew&bQWQ0)hOpA3@@9yco^KDPiJ}J8P*!?>cy-=y&r|kpQPiLs z2CDksGdFAtUyGs!)o@TZ>Q5eKDq(GRhSZ=M!Ad{n498;?GF3?wHK<0i(tGUV3xcYf z>L!XBRHInwG-8L3e96>wQPiLs%}V#)W7VoxGId-OHK@k0(r@R&zb)c#>ai$lP>p4! zpR!Ml8xc%Js^iX(8dT$0=?uT0nS0t)4pG#g8qZ44Hd`BY@O*DmR}?jGRj+!SkK}s7K{(QPiOFXQlV^f1Aeh9LwKC zQG;p{E4?#6ySqzMTPs0bck)2YIMNxxl zDl2_L+!pV==R7}E6g8-(v2u1Je%(uP)VWaT3^$3Q2Gw*{df%JxY&y@?;i4#NPzA8k z=gP8c?=G{ozKfy;)eKg8?%kSt=nzve>baAr2GvYZ6VF!j+;5Z+MGdN1tn{c%xA>6f zw`Sc%QG;qWE4}K)-rw)0ZQ(po)S#NfO85CR$!oMQby^fPsOGZLGeD>1gSVJ^CyE+W z^H}Lo`R?$J38rGzcV|cqs`;#RpRZk{^dM8kL{Wok0V_RkBy4z~r>PF2s6n-mmF|bB z5;b-Pqx<1}QPiMX#7g(5XB*a3FtuM4HK-P|(ocDGlrl?9-4sO)swJ#+hVAbJ6)+XD zfjdKLP%Q;Dt4k_pocg}9h@uA7GFG~UaTjKBE@i43h@uA7a#qd{e%=2v(DOt;QWQ0) zR!qm0Sm9w=vh@uA7I#xQvN?{gx zKINIBs6n-!m7eD-mYu!J*4ihE8dMut=}}p>?A5HM9*Uv{)kapjg(?5VE^jJABX@?> zpxVSrpJB__DD%-&R#DWT+RREnuWNf2c+LPVMNxxl3oGYC;@9`kO()q}<3&+}YAdMA zt)BXrIv|P~RNGiN2Nl1{=PJ3v)F)BYpxVwVqNu&aGQ2PqyRkb%YEbQ9rIWu^w#*4r zc|}o!Y9}lGl&?qK)ZSDhQPiN?#Y*2-*(eoun;IjE8dSSstv~IqdA@U4BZ?YSdsyj_ zQp5k_C|m2gC~8pcWu^Q4$?As#O!@rh&X5{Z`&j8UWkHOwo;$tNqNqW&pOsEN-TtLx zZLPYZs6lmrmF~TJU#?$kYM>};P#t9D{NPuQwNpBnS|W-XREJpU6UXy0ckh}yD~cLa zhgs<~O8VvUT=jm7q6XCwR{9N0u0GB~fK#}yEKS_WQ-kU#E4}-wd3oJMQ_VzCgX$P7 z=Lf&~JZ$ROd#8w^2Gwy^x>k$M4?X9NJ))>Vb%K@Niw-Q)YPoIUYf;poI>}0B82MN9 z+oobPb*DiMs#C0Vh6#qY>~E@+C~8ohW~ImS?Bw%2M`a&T)Sx=U%K5>sfrkc7v9*?n zq6XDjP)p9PyJzaGC~8ohW2Ia8^KU{wQ(r_;gX%mh{jRcMtHPe|ZIU)~XGjgI3#|0I zylB+0-nLd{QPiNi$V$&_xxbgZYO13sYEWHbrTfOW8A*Pdnk0%ERF_#fKltU>{oi9# zJ4I20>Iy5pXB!#&&UsT0MNxz5Dl2_zyH;Y^6H^hIyECK))iqXn?j6u@f#-=MohWKh zU1z1wDgUy)^gQd;5=9NFKvw!GpR3vBkZs{GQPiNi!Ake2`lr&2H?>g|HK=Z~(kw?$Ed>J}^K2fx~eP3GC7!nSZ{NDZpntn@s8vOwFxwpKP#)S$Y!e_PpFr$kYM>KQA2U)>%KA8G2V zC~8nWXQh+>(t2@IQ^{MoGo%L93s%k#e&z4A-gDnuT@*E_Ub1q&l;_vC&3EtHTKz>) zgX$G4-RJA)ev{hNCQ;O&dd*6o9hy`O%4F(_C~8o>0X6$>IM4lI*w*ees6iFP%K5>s zylwoPW%b^skSJGAdMP3>%^+K8eC)fZN}g%?JQ^ZeDv1X0wW`pQaY7_V5XKwE2%C~8oBW2G}p zSa^iz`Rl1DYEXTLwYtWL@42SLYU|FB8dN`6=^iyXaqIoIg+)YBgDRMn^MhXtTIVZc zs--AuQ2k`(T*CR)p#E&nvFs;`8dSen=?o)2Ug`OU^N1*FQ2mCr{KvE`Zd({6iW*dZ zSm`}Ll)8Ibn@Zl!ogp=-{<6~V0d{4`R5lf*y*mwRQ2Dab-!6qp za4dqUqN1ol6^fPahYdO=aBeX5eKitA4XV(r^m)1U(UeO}4HrcXsxYkdeE6i_&2*+# zilPQpSXTOZm45Qpb7s3JiW*emSUDdfzmi^B?72Gp7DWxJ@T{C4{MvRdc~aZL)E(T( zQ-dl3D?K0fD0}{(sj8x=K^2jeP9x5aJ9$hE5Je5DNUU@k)gE|%zr0iwHK-!9ilgsq z{vyw@d`T2FsG_ja=kjuPACz#bl*>l>h7ZyKJo>QPiM{#Y(SV zi&yu4XexFmcN)~7ip@&*jS5rxZZcI$6g8;m?`wR0bcPqtpWkPyqbT=paJ+x3AD5MW zUO9SIIBjZ{C~9!6c&v09S(3zVX6m>oYEZ>zrQeFgeb^v{sdu8NL6v}&?!6^C7Jp_9>9*^|gdr=fMsFJeMPr1a%F>g)%6GaWGWUTZ^Dctcwu&In)+!<1XDmg3N zH~c4@++nJbC~8opVCDSa*TGb0x|kX(iW*cYL9PCgAcv_fqNqWYij_WbIDBlbslTGAL6wG;?(<7NWm#t`eOGse)SybsN{{7Pjc;5uRYMdtsM4|0 zb8pFXKR=l2FNzve>0zxEml{qpwLug$s4}q9JM-G{^LVa$fug8Em64V1hpoz;&t_}= z6h#fHOrTQr3rue+O*eOj)S$}DN{_E!M_PF9U~7n?22~bT&MAgp^-uTBZflJZMGdN~ ztn^b}AGN9HSl%a!8dTX>={aigtuUTvy=S7RL6x1A^Mha0O9k|^EsWXSodz|ia@kH70$PuBLK| zq6SrdR(kz{f&gQ@^4eP3gKHS{+%TNE{@3bN8OTkE4YPMSI>iW*dfScR57 z>gKC&p69PeqNqVtn3e8Pcajh8X>0u!MGdMVtn@7Uxz^UQrqcCvCr=HkqO6=>%kk@T z>c&e<)f7bys$#74`js$hB+qwxT|`lXsyHj>rjTE?N+)uUmqM6js>DjK4!eqb z{|$iEMNxyQGAsR*7pHr+%+~5BiW*c^Sn2&?=e)Cvm|7u<8dOzT>9IVtLaKSD0!2}S zsv0XjvmH4a!*g8@*~gtBHK?ky(oeZZe!m*FR&G($psK-2_o(5+dt5QqP!u(&YO>Pb zAow;vztU81QPiNS#VWb%8|$8*+iYr;C~8pEW~Ey=B5$EnrtXQN22~wadd99%zj;AZ zKSWW3sxB+%%Nl;=yuE&}sRVu9$y0->9;;}gevA(7oQCzPS3ndssOq!QExa^iX$DhG zMNxyQ0V|!xvXw!tObr)B4XTEqsz#pN+0=Yd)Szm_N{_D!c?e!?&PUK)r6HEU$JUUx?n1oC~8nOWu-@oe^lS& zrkaYP230dwdXB2Nz1avilPQpTUL6vymefKi>79Xq6SqvR(iJayB7VAsbiw3LDim>?!9+ApDSc4SQIs= zINVa?hL6x)sdC%QE|E*-EFG0C~8o3Vx?PnEJxT}rrL?3232QJF(x+l zoUtd0q6SqLR=R}+Uif>i<{L#(gQ_bl=Lf&etnvQ0@2`rY230p!dMsbv6e1-R?(2^z zYEX4&rFVKck34&6D*Zrr^3HIS7~{`NxOp{5Rsq6XCQ%mZ|!ps6jQ1m43?Y&$RY@doW5AHK>NO(ld6# zE{#1;0V_pOgK7jTJt}vd2$*kMcwQ7Ws78YNa=FJ5Q=ddpgK8A0P90v)HWhb>J9%nQ zjb^21?9?v?)-zQ|6g8;Eu+qu5EwinTsaB$>K{b|@&ah6L7`aSM5k(EEajcvl{K_;S zh3EL%DT*3Y<3U|J`D47T^+*&os3x$|`}u4OSHCqCai}{(YEVsN<$OWOudO~8d`%S= zMGY!HR>?$_>6_5=8@isNs6pk=N{`C@)5dPKwbqHE2Gt~1dY)hLac)yncSKQxYBDRm z>cz-3!?X8>8|F@f8dOtQ={}$EPV*pJE0ZW{P)%i}`{9(-Pk)=LE{Ymd(^%=5?fuCz zgH81pMGdOytP;uOw_VAU%G453)SwDrrF(Cw9sl~73KT^Rsu`^GY_s=TwY#Q%i=qbA zOjdf|yDj6?&8CtJcPCE`s#&abhHb;A9Ac`xC~8p6W~HBUzaNFJnCdQy8dP&w=`?l} zjT~rdhA3)K&1K~r!2J61CaA5ceWIvAHIJ1}BT~G8G^TEdq6XD`R{Fk5EH9Pcl+Orv zhSZ>1z)JV1FM-EOno2E-8dM8e>Gf;UpCM07RTf1Jszt1H3s0qNFUJw0fYPTqAP%UMpM@rs989SPKC5jqU%Rqfg`*@hC#3S9w zQ-f+bEB%xkw!gK(RCQ6*pjyF7_xY%gdpLv9yOe>Vs6n-oRXUkQX8*}eOf45h4XRbF z^!unZJvaE9x-E(tRI6F(41WyyT+~$LQSLOTLA8dJ?i+2t_`Eh%Tog5^*0R!lqetaz z-s`d`YEZ3XrPq`nb=oGewfsa;gK9l1=Lf$Qw!G^3c5a_2YEW%prJq-)WX%fLTF*sM zgK8ryokq+p+dao}l+o@CsX?`gm7aUQ2F!DAOLgDKA&MGQn^`$GyZj0+vpT$~TB4{y zwS|?Q0kX9Yerc+^C~8n`Wu@23alKl3-q%!7)S%kNDz$9k)6#x5Y^|N5s6n-zRVGo% z-hO##Do7MHsCKZ5FY5A#XkASuALCA*8dN($tJTeED);XW)y~uzQPiM1%t|L8^I2-=F+xADccQ34b%d2pe*O1Z=S;;O=gyEC zR7Y9qb4uPG6Fq0_BBH24b&Qo>E0@2oxW?9MFNzve$64vIyzEtAF;jCyQG@CPE4?~o z4N$=qZX=}9?MGdO6tn^b(lVhc4?+p+|4XSgjoFDwk@85c-t#v>YHK@*m zDmf^I=cs%siW*cGSm_Mw^@@DM)`~H~ogp=-F0yhiB>Z|8kmZW00-~rvb%~WuBf`|! z7fsa{MGdOUtaLxDlcjAlQ^Q43gX#(^cl$$x2u@nmIq~RGxl$B0sIIcot3#7$8#|gh zEQ%Ub*I4Nc3*7JH**89kq6XDk*8dNt~>G$(Z3Vl6fYPcwBP~Bps@2hs?EHzAR5=9NF+pP4e zx7xS*2~&Zhs6lmym7X__W^aDYRIn&&P~ByvzZt3Ay3$-zsr=l@Q-kUrE8W6YS$!^> zDkh2=RQFlwG~(QDlfqOBQPiM%z$&a9Uw#`49yT>r6g8+GveNtc#(!=$G__n5HK-o3 z(tUo;FYkXNIo~I;mvmIdYQ^0iW*c;S?TfR zGo^{=_g}R|QG@CkE9VElUW|?W*wz{(iW*eUS?O9;hs5n;YNaS@P`zNK$JfOrvpm1! zxG0JmR4-ZSbvaqJv(DIbhOb3YgX$G4=K$u{yn5dbnMyFpojf(DUbE6;x&EO6i%nG( zMGdMqtn^4paqoYWeF>bUNm1vp=yC{-BA2oroN{J{%*)pQREyNUwK%8iJkfLzKg!U!HLtX#^jprWX(atJC8$f4p2xb8n9BQhht?|VJ7 z_1kTSs{DWX&&bHg$jHdd?|D!{{kWj0j7NQ*Q93&`UwIB4uI+k>ps0*TeSuNmE$w>5 zCm&{39PbbmmGP*5aH!e!kKajkeL+xE#-qN-D0CA4e0}nFhY5AB=LQ*48ISrBqqLVF z@!@x`C)BlqqB0)!Wk%`z_0y-mVWK@x5)_s3sIM?eEx?Tr{VU_8yhu<~#-skx)phjL zzcqH_t%9O59`#R*(q4Z32k&|#l?Xo{6BL#4sDEaZj^$5(WB0`g^^bz0G9L9+MyWk~ z;rHF`0SR^2=LN}A8ISrGMyZWz)SmFBgnFo;sEkMbA4aL<-#vZB8xm?)P*ldF{*_VM z%kO)}15C`}d4i%c9`!XwVR-P*TVMDuW_Eakps0*TeVtJ{f4%9ezhyj!PYH_3c+@u- zr8ep>{{ByYluCr3J3K$gkji+}zcETzZ67}x{&qsG3yR8k)c<8v_~vDoz4&2&{zD1% z1VK?5kNS5;;UE6_{7c{e<%GIHP*ldFE`uO$eJiy9#~&@dFQHx~C@SMow_=pq!`i=| zD<{;S3yR8k)PG=RXx*O{m8SipqEtWgFf4R=Q5P;+;3VJE5L0sF0ClPn!HkMrkkq^u>?;OhVl#C@SOY zx{a&r`EU5@;}Ytx1w~~%>b8thAK)|J`$aP^-{yruhE&F*ZpSEHNj>TDv*)F{t`HQJ z@u=G~N`0F*zw-R66Y8;oqB0)!EsXkp(ZlOMeg2w+dXAu|j7QypQOfYWKl>AyHno@E zD<~@CQFmmNTDCWD-{qeY>Pv#6G9LAS+YZL1Ef}%1Wbtgut9=`q4 zw}(5R4BsXwD&tY#!6=o+&wTc^4@{^}35v>i)SVfnlE3!q%YP-IF8|peLn`A@cVU#u z@FB1KbTy%_6cm;5sJlAUvlh=VtL#S!ipqG@-590X`@oIIekj%Tn{XFWjyM;7^S}G-JkR%GZTH&i-QcQj7QyrQQsxH z@z9-Tm_6ThK~Wix`cI5fi~ZMEKH?7&!)-xP8ISsIMyW>Kbf=g6?}YjVK~Wix`W{B9 z48MHuRt}@*ynv1pI6jeP*ldF?#(FeuNVCOfBjNIy+BY@#-r$# z#9QA=?fhTf?k3}lzE4o$CPh0F-Iq~nHy-_`-!@2f{ez&WjIZl{j8YkX;?ExR%7ps1 zmjoG78ISsYMrnV&`ZITeC{!9(3W~~j)cqNSfB5IjCtvsH2{jWGmGP(tFiQ3Cx88N1 zQwjA#K~WixdLW~8eAS=#ItWG?zDH10#-kp@D4mI(z4!wR8by6sP*ldFet=Ob!*{&9 zV`if7{`nw7D&tW<=;}Hgpu1vS6+uxMkNP1-X}hku(^Y0Sa9>bV#-o0iQR>g%{R4xq zrn-JfP*ldFu3(hf`SO{s-#Vc_EGR1DQ70Isw)e$f+nFcSKMRV=c+^Qosm?#^j`n_l z`~O0aA(io{HAbmt{`nj3`dsEkKl#VECh|L~#roB8WKf}%1W^&^bZv3$i_zhqYQHwlW$c+`U#g@5?x2matK zX8m=?mj)S98ISr=MyWJDd)u$=QHk*LU_ntCk9r8B@DKmo=83QRXhJk zU+w=;(9#vx$ zoG1R-IQ6o}Ce;0YDaeq@cvPKH%JA1e_hc9YZP#N2MP)py!6=pC2k!l-rzO3xL1jFu z<4_Mic=byY>fwT-G9J}sl-j7)T^{hDggP%MD&tW-MyZY3{o$8ks42te2#U&hRG(4b zC%yczhd=Wp3H44vQ5laKFiPjIZ-3a)vlHsef}%1WHDr`Z{vMy|za^pW`SKt`D&tWj zMyce_J@H3o3Dp-AmGP)YGU{&9uG>EStv{DgPZkuF@u*Xb(n!UV?=!w3pg?zUnSHh1Vv>$>I|cF*8AZX9sfl_ee)}VG^mV6UE@&uuiE?Fg!(~2Q5laq z%P6(IU;Msn_Y>+GK~Wixx|UI@hl{^?tC@+OB`7N6QP(j_Ex`KQ?(o%A*INWdWjyLp zj8b3puJ8C>sIF@7#|1@YJnGSm(*F8SZ+z%O66*3_4l<-N9`zVT=}39xvp3Azye23r z<57=gl=jzm_U?UCs%u|RRK}wo$0*gquWUURAyRGE&kBmlc+}%vUDy5igN<+VK0#3# zj~YAF%Wk^(JE^WO2#U&h)Dsw`z5LqVN1mKecX?%yA(io{iL2{&-+8ZJN~nhjipqG@ z2BXwJJn@-7L#SS*u^}ib<58Q8g5db)vp2rQcn;4J6qWI)Emzk!ez5($sjk-uipqG@ z)Ya9z;VJ);P#+c)mGP);M%`W*e&T)mKbcT}FDNSGQ9F#%9iLl&;SF#VRT{T{RggTD z@u+jIuGViHUr4A22#U&h)QnLo!&lztueKAaEhsAEQBQPr-TiUruSlpZK~WixI?pIH zhJS8&?GOClgnF8wsEkMLG71|T{PVXz_Qkg*)N2GqWjtz+QQEFwxb7W4mQWuT6qWI) zeMTw6Z~uUeNPksORK}y`j8b3pCr>wiJ=JyhSBL(hG9GonDBUOem4A5g;}hy(f}%1W z^(00q!}GU(@>W7!Cnzf8Q42c?DN7w$QFUaITz*9I9< z8ISsLhx*)G9&92N4;2)Z@u;UTN*Vsvdpc&-wj(Gi<55p#lxoypKJGPNObnkUC@SMo z|Cv!L`A2-$OYWCYzal6q<5B;GQK8kBUH1MT{Q#U`{JnHF;(ssS?!FTwRgnFi+sEkKFgHdX2?tJ6J z|64-6T2NHRqn^nq1W@?rDeXs_8TLbhqB0)!UtL{qSpIZB)%68IQ5lbV7NfM6U;b;) zH1_a2el^IJ%6Qa&W0dOQ?_K@}#zy^!ps0*T{S2eDU0?q5lfRc3js-i)C(D< zlCRwtf=7w)vnwbn<54eSlxpvvyzgZP3H2O7Q5lc=Sw`tdxzEQQWn$)U7ZjE8s24lb zJFY+6Np=09ps0*T{T!oI@(;OT8`WyNz91+n<54eRluF|}H$Q)ULfz%{LGo0_qkf)I z_=kV~=l4AMs)Ty5ps0*T{enaNuig_snoyg9qB0)!Qby@Y>e}C0dwoJZTToQSqkhrV z^`}?1D+%>Gf}%1W^-GLW@9QpC+jk!SPEb_Fqh7`+mHgXxUTk)1w~~%>a~p0{<_y^t~4G|Pf%3GqkhHJ^{#(;|COn(LqSm)kNQfZ!KWjyMQj8cnzk0%X`wYle;0tYJNQEy_D`n@mu(xb4crP^B- z6qWI)H#16Qc>ZsnXhzDOps0*Ty~Uw+|7P#AsjlY;ipqG@uQ}9nYrkgV8^0zfD&tXa zWt2+eztv~P&i|31sEkMbI-}I~mVfLaFGvi(A}A{3QEy|E#$f;MS>OKi33Zn@2gy?z zk9s?!?ja-P8IS#$S0_|mP*ldFZe)~>%DaEyjM)pgASf#1QNO_`l}7pY9plfxT2NHR zqu#+NmB!Ef;rP>u;rj$dWjyMgjMB0Ez)yVX_Y>;x1Vv>$>Ngps9?{i5`QKlaP~Y~J zAVVtSQNP6~mB#)r&i^2x9wI0z<59oOD2;vX|Cetv+PfntD&tYV!zlGPzN7O!#v^*J zps0*Ty^B%Wu8%$B_GT>KC@3o9QU9G$YO#OzncsaAl?Xqd6cm;5sCP3;eVe^|{*;mY zH~(6YA(io{_c+v>7QbTF%l8x%mGP+m!6=RQ{`#lB-^Ax1E+{JFQNPP5wHx>9|Anb* zAt);2QSW7x_VVlg_H#yiUnnRl<5BNpl*;h&?I)UO>U#u5WjyNrjKV+s^WnQ)VLbD{ z5fqj2s1Gnod-)aZ&p(?=gr9GFYmhvZ@u&|nO2^mlUwOHi^&TQ9D&tYV$0*gq7w>d2 zthKJk35v>i)bBG&Ex>DDa@W@<)K3bE%6Qa=7^P$R5AXX5GrnFaC@SMo|C3S5@DIQE zOCLyeeMnGL#-sihqjcr_sUP{+bqV!lK~Wix`U6JkSpLO3R*aW&hhGnpr!pS(VMg6X zdg$sGeBRV`rJ$&cM}34*IxqkJ>tFJW#PF1$sEkMbA){0`D&PAU<2f7)ipqG@A2CWL z|FByw)JnBywrK9pS|N8zXB-En>MP)qdV~oN-{PPR1=-oG=o+2nJ z<57RcDD`cg`SP=GPN>%kipqG@pEF8r)aKnEYu3wuEGR1DQGdZG)%lygc=?x7UH>d7 zD&tWfXOuGh#PsZ+B-B0L9%M*mJnDZlO6~k7>VN!03Dp!7mGP**WRz;u-LJm-T?w@* zC@SMof5j*rDSy*=)e{ryS%RW69`y-E=~(XG>+TOtsMiXL%6QZ#8KvW^{K4P-sf2ou zps0*TeTq?PMIZ9D|I8(VrhHaVRK}w|%_vO#{PVm&x&Mu+uG`)iBu`~L>aQ843_tTb zH~mpU-A_BPc54QJ-a$>c-uk(Kj>EmY}GNNBs?>R5zab zpf^1}F?_C|sEkMbEu(Z)KJlH;eo#WaK~Pl2qyCOj+RK0O`sRBR>LY@pG9L9gMyU+H z@1vuaCDcuVqB0)!_l(j}`KmWwYjorC-w3j$G9Gmkqty1^ssG7Grn*iDipqG@=NY9M z_0;!{elwvSBPc54QD0z`%J84=`VAxbrwEG5c+@{IO2^l)e)GD~jaLea%6QZl8Kshc z_-Aix`s>|-qB0)!B}OU3PmFgrsYLksxS*(vM}3)5YByegkJo=Vp)PwzkUW*~sIM?e zd--eq`YRLa{(_=19`%omQZMEBX%F2qrS!{jV%54*IxCugsKaQ%6Qb*8TDPF zLr?sP{!tw>NSF*G9LAB4)v7xzViVI^$|f)8IStEj8Z%Q z%5%T{mW2A6ps0*T{X3&nd;iOSej}F%&Aj_>1{qQrkGc%T`qsC?uleWe@A~ zP*ldF=rNvK-%2%V@`j(o0M${sBPc54QU8Ha>gm1V?7Mz9p?*eCRK}xj%_y~^59^+J zT0*@`P*ldFzKK!lA6_+RJv*U3DJUxAQQyoc)s5FR-}L!}`i|cUGNdvd^&c6fw)eFk z{h_UdstbzBc+_neg@5?xcQ1d*a}w&Dps0*T-Ih_x@XdFuzznP8UnnRl<59O`luJ}UdHHs~6C_V%JnB0brP_P#-|xRD)%74jQ5lcAGow^D?*GQSJtUz9f}%1W zbr(jd41fBr&-g$>T@VzN@u<5pN>^mK~Wix zx;vwk;Xi-hCx1BAb(5f|j7NQ^L*3=f(|L zhi9h?e5HJNxR`B}7mLZo;l>lEn}^%S|iYPWtfRubt~ zcW2Z6!!jCqJPjW{eYluT_Evmt1D~5s7y3Q4ihE>r)3S6n=8LWAV!XMFj?=FQt2OQd z?qzhyWH%65+c2HgUWS@ZO_#GR@J_wmUK%3#KM&j&ZO6pQStMDyoAbSc#dNuZ3XFFr zhnq^dKRG`QR0i{XU)`lXv0O`^aFn)8Bb8CqgjAWYi9{6(-zH>p4~Q$c2tT6==yeH3#a?XV|3ESY=640&B`!aDYW${VORUi z&>Ah~I~cDbWg4v5l2 z8umHb=JWjttm1`}#Zuirm>-T$*2a6YgS|<1oMsG{uU#9G70?29bh3~7m9%gRG}ZzQ zq8E%%Wp}#2Ro_3hD&i2L4uq)67@cmNnOIXmL?3W`;xwng@E5 zi_=9im%hGLofcZVrWFQIm`+bb!DWS>Ix!gV6SfciC%l3$CYZo6fX3U?>DI<%^E}lX zWsv)8l!I%FGaW0W<4Cx9|0p;E;|-pw$MipE)2;E|bZ@?hlc=jt6@^+YqOOEFGAnG6 zTUOKM*X-eFV~@8ECP(8LX8*-Jjy_+lcA3=6dUmqbPsX7-Kb|fy7W_!S?+&LIf>SVt zNO$6Rbf33IB>X{Xa+ldk*H%|*WO8%-sHkV44U96$G0!MKV0bd>rR9Bc%c^vqRN&>B~ItY_|p_KdECjHAMKtsn34#W`t%X0qSDWGm^NZj;^e%P#q4! zET?UE)vp@8GION%iXhwo6u)w^xH#M2$x2QHa^ldQ9k@SXFyYE#Z;R$D5M_nr@VEeShm_dna^i z&IJgqT(biU%Z*#0QEOhKX4C5r=8HqW5V9%`$!ABH!({A?@LDx4)|OE@K{war67Q-;gyXE)rCyed>FHRzf++kN`I;9aJAgn^C``a_O;n}eC(|5JLB$nJ~g|Yi?zZd4e-N|NDCf8|kcm*CPk9C@Ji(PRY zEO}x_8>+0N_&IV(ezoZ?*6q0hLOXp}B)QbSj0BfQ8$}FNLPw^Hhi6ZX+0#EpM=L)& zT-OIj#XY!g2TW}-$@gMvQRaiGi<;BCQFYy8=@pKTbw8+FdqT^CD7MgT`xFs4oKwWd z+K%=zC+jTrAnNs1V{tu5G2vzy)&ij?M1<1c zQh(_ewP*M*)QtB2EH^DmGqS@%ew`)-rUX?Zz1te^Ouc~GOKEnJ5{)7bA1>SbORQoy zr&~1d>;I@JjYz&VM5013keftZU1Z`L$3n-AR*n_KddUnIqii*dA5;C1eB2+?W z$)|Arky?8&U2N|mEVr{e-^B{8{2nm~G}qi_N%Wl4b3PorvMioM_fnBTUD!N##iSla8h- zT*6w>INIMV&Z$3bB}8&tojl0`)aK2DR~Wb1}u9SAjEaBJHPhwN`hhlLeOi z9IdcoJiRuyTMkv)bzxJX!f||0#{Oo>oNl&HW20tvFy5fpHhC=y(+V~AXe7XY3gX$0 z@%3CaA{A2)8L*;=RG1-pC%yc+5vctPjm8zVM^~vjKe%`c0AUVFl(wdali6<8EA>su z3^e!0wJ1)~7}%@x!HFoQEAD)%etW(%-o~)8fro4McZ)ugtJWwTH@rVtp6AX;pU2)R z;)7VZ`51oui=IYg0Jxw{9D`I|}QupE3k8>k-5{6d*|x<=&{F@nXt%w-wKHw(PIfF( zB#~1!iOiT*7_PB3+o}Y40#j6$Hv98`-)6h9elrzhwM={~Ba6m-r%Dm1f=0Dd5(UOd zSP0~a?9Ss-iBy7}SJ=UzF}^>n#+i;}SIX9(uVje`(q^1QQIGqSX-=kor+s0+wWy-& z#*^j6{g|WBUIweU6;&JlGjCAKlEgG?g>s&u0Py~yFR$&A>fjhG4|$hdd-3#i6V4a{ zojDC9J)<$njtZu4a^!_Y_N#0!^^2fa*u9Q+W(K_uZp-d$yn{F*oMpsVOc;ka0LwJu zq($UbjetU@(Ds40OurhtEVYa2EQ;ueKA$*>J>?W*MLp_##Rg=mI-Knxu2RtYR9&1l zLVeka$_w46USi>p$+(fPz%kQa5~(V$A`#HGzJ#XsW?1ZAP;B~IR>mnKSKmqzHed*^$XL@qqwK< zP0V%J64~9IA&cbT+-#G=3Ol5VO4xCWhSYP55>CR#A;_^F*4*M~H3Q5=4>UHNtATGdUnR!Gbi*)aLmRB2a9eTh1PC9&NzgPx(Bx z>A~T-%KT`5YiTruhESh8G?+39$D2Q)X4`z37R+M9{psnP`x6y0Vt( zszB{9yC0Lcti@!asium0^NBafMgqstS#j-MOU=!iruD5fMm;7;KHq$uk_x8EZ3;>v z@Idiz75?fETtbAo;YJI17^?j^Ipy18v^w|4?bOiKe4?b2P&sZe*+h_t_SASANZaKE zwqkRv9kL?*_jW0JEc!rss-_)@tJsfAsi!TnTC~{S^2UOiIOo&|ZCRGm68n!ye)+%Z z0QSv1K!)$RIDvU-rQm*X3u8}^&Yzkh1iCy_r%CEJ9z*UMm(ozQb_pjU+D1>zZ04-| zs*|mmJc5Y45Hh1aQ(4APs5^sr!Opou+T&Xum>v6-gq*Z&6(?4WZ+I-x26}+$X#0ou z`jPFkgNx1<7Fhyu&Cmq6bMO*kqcYkjnZkW&a ziaB&&!&F{GPnsvYmL+=qapN2ni`Y zZ2^O*8-{^h8m~w*1dFS$9#>1_D@LVOt6i>^%k5ILH$GcGb-Fzqj8BYDUVWc( zxukNgaMpTe1C%Xhu6tD{=?@Zf51#31II>7B$Zcx!`iGzf1x%H7wwKC|oTkWBzv+n3vomvy)ouoi@#^em{X<{B3=UKS= zYwdoe*X(C{=gLdepKCPo52*jmyfj7*#4#^=RRjC8{nMNTcNzy3%m#6Y1Qu&plu@Hq zt_=sxx|Pw%@fE8%nwcP1fo?h^0q!3yHkRY*@q`nANbxbYn;|Yj@g<7H(;_Z)T76h) z5Bk-HCzKRAeS5yS2|pgj>SmTw$j)@8W#4%yZ1PoeCF*I@? zvq1cIA`NqX9@`;TQ37RjuB{T<#ZHcnQ?F68TkrMiWltnYDrl?+y0#nFGjnqdCx&S4BjY4j7gDHPW-h7*i{q_F0}QRKKGQYdZp2@$VAX zD5plJ-WXO|Jx|K(mL(MixKI-7n5>fuh0Tb_B=N>UWy(w2oQ@B6C;QQdcA~~Q(RO2{ zS+2KQy}qaCCqx*A#6ViQih$2-whaqmUDGg2OV&b`*{CwAH%9|c%+Hh{R+}FoxFU{{ zjp^I3FHhv%XkJQh%qB~h(L!G|8q%BZ5aHOF)q1U3Y1Ewius*&jPK~K6uuZ)+k15;E zBNVbm60sfdY>lG(Ca|#(CY5@rRqt18uv#P^8U}VdJ@OI#Y3$A?VdXS+`yRdmofET- z7*BAn*6dZd#%MN|X_Rs-mwMf9YuIYEBFDopbRECwLzzz$Sp8+eQfRq5iz{KskeewY z6cW`+soU$6+f}yhET_W|&a}(EapSr(C)j;AZO7SHj%JLpr-LYyngXgP#hcSgYGuc{ zWlU`BCFIsC)f?qDYz9x`P?HcoM1~ISl#Q`EMo`a*5S-L7&|%rtR0_Hn4t+WaZdw-n z$I*Pr*>t#4!3>1Tur#VQDvkCiQq)B>9GSIRRRaf+rIG8=#@6f@@ovP}RHjZ3aSq4Y z*FtFrHliiI^&v?>b#PefGzQIftx-g@d?rs+Moe~JA@=jCnz1Jrhn8!sH;BHaZb)}a z^;V~gLCv<9x*gl+*aY-3+vj;j_6RePS=mu*~OSLcO`CI;0~ z;nqvtL9adPc6d2MjJL>kj^~^|Uc^;~9(HQSII&;I)VZWqT(Jvgq=|*}eBbv=_1a+2 zXeA{L`x$)c#CR!*$&se?ybdHg!O@@i_jylJxTG#m=0#6JrNkHdj&0I1cz`O;ZmHj| z*IIC_$Y8QO;R{Q*E`t?_bn`XBTZHdBDfHcz>sA3`Te7}vv1EJG<7wJCcREn5m+HM* zr%~%ft=&%6Q5Exmtw@ZIm;viQ?Gk*vpn}^Xy&g8;NsX5)d2D5<2fVfK$LB0s>-%k8Z~?ES~tXLh;|qbTV%taQoQhvtVINQ*`($iW1)`S z%lSdHXoaoNMRWntaO8${TUoYBn6k>lW+iICKFkP?f9+%PqJy20p(SE&OPKTBQD*+h z%T@RI10&o2tA&anx@N&C)j_G(==8yr179T26yD;a6$qliEniI-SDR2ikm1U`Xq-Gm zNGF@;NS`vDnxe<mXvk;seb5)8cswn7L)HFl4V*`%EpHy4{5kvJq?Yc#9Pu;3x3IS98p zz;Nv&7jyjR^(!)=TsmAQ6H%tJ%+SiWQuR5*X1vTEafXamw>~(|D*9fjUu|`pt+2|b z76fGvOUH2-f3X8HHBVI8FCjudJTJk^O;5g;ImIjWv2t&h5Z@n`yLAp*5O;CSg9ikE zJ`&HXB7ZY0QOR`+$#vSe8l?ful{J1Qf-8;WguY0$f;Hx#-fj+~Hyk{) z@#GM}#7$rj!v#~!50R+szR1yL)eRKoq(2p(Dq}bx7W66(uuS8^!aDS#UjxHL^qT`j zVdCmX_#we}cb?2L2_OXZ%!zB#rZ78+MAQMxavmREOxbX7hUC=O>4V8)IVJO={n{># zs?A=d8g?OA_1K{u<4&^O+2-s}kDVV(T%-dr*_eeY&Q`7tGaCfbK2C+kXz0bbF@w^e z-7nXA?dTthe2`*=4YOS$h6_2e141}tmtUs?Xn1gTvU|i07g8y`-A@-9f+*CjTB$m$ zHW1B=<~_p=yHiI~W*Bt~trTv4(c-Mc>CM>^d(b>AO&H@0hSzi#HwR*Cs=@Ia>N>O_ zboVs_%4y|8<%eTRfz)2ba-h}kHb9o+SEg6#unL*;5EP0+)bG*f^qiC)|DdDM)|D!3 zjZ=S1yAQOGCXJSciuRgrZY&x_B+;_2YJWtk^py&Bu&p~X0Dm(|g<%|*rt-%9iq3xsJtl ze7#87r7hd6}J%aJiw{!XkmOd&TFIGzO+ zJ1y3B6j|$Q1~^5I?U7@?=ZE*J;#O^?UFx?xwSKD})m7=r|IMzi@HGT+;R{mQc#P#{ z>o+5*fVxvzYI=%lxW=mz^h(uE1p(GhbV?7gjP!TTt?|jXFtNlQ#F)c!6FKLU31QS! zA{CT!AUP`DK5BDLhf8{bog($OAr8r23H_wq-z#Cap4UV!hGy_Zq z6zlIXloj`}Xeka#@CrJsD*5KQ6;-d)8Md00Q9I6qp?VEkaMEa0PZs92?ZNoq+?>(` zF-MvF1oW<{O=d_h%oVK(qp_%AVP#7#n;~4p!&Nn*QtAwvoo>0!yK^L7PaXU5!EDbL z(HxZNLKRB+pes96c!j)mN~fO2YTwH?%3-;Q6Szpnr-KgHT^DyV;ipv_mHx2Zi9^YA zqweDit!Dd?8)8kaoiasYkDlGPuza`CE9!`t=7@A!ZIAd-HNKOj8m?sF_NwH{rT(B* zZFG_KM4`$-?bNVc3#OCPFDR#BJYBAxn8cnZF?c31RX`^~rgJ?!P6Y4v=XA=vHyuc9n>gtP=0PVY&w~#~hh{k{lvCfP3y_hJbqPL8O9eY(oj$T@Dvh96 zG$7n9Cmgj2!zn6OIAcQ9A!~SliPcQJYJ<8p%hrpne&G-WBz7br8OsR588k+nZllc` zg+V%WUX8EV2~(zDH`yd$`kh_IXh5B#0{BQy&iAu1_G?X3q)ApXO9>2 z>&JX!wds38z7iyS`gbn7&)JWlf! zBf>DG@dQ3(rDOkC;RIrsq`ZecJGSZqSGZB>bgJbBXQ+kVx;c6U73U>_iZz#&D-@+N ziKNVHSssnxrm88d!bPvOTLUwkZjMcCCnXpcC=Ch7%EdS}>{>bkuyE~e7YaNw>Z1&f zD9^=dPm)AN0BC)%p_G0%9YXOJaPekV62v1I?GS`6Ak#pG>|j_QVgBNYfvih7f%+th z&KFP_E)LJljr9`mO(y@)ROyKzH;M6KzW@uMpk!J7Xd)4)Rgt-gDUjJ>-Bh=PFTjcF z>%LsjBRB_WD6*Sz=}zgDx|P-t2@t`gkj9KBM;B!3kyVG625lZ)Lc-3((J@0qD9{hX z&W&Yw04;C>BwPt2*B$i0gNn-Bwc^W}$O% zQ5}-;E@quwKjRrXRseAL3i`@&p)1SeCTc4a7>#PB-04eV3^zr$mcoqdI;OqMcM4qE zGq{#(Kgil?XPOB}M@1J#SbGmzt(F9+xY^sJXs)Kyh$Yc4op5217Kb-m84E@guUYE% zTEl9uY5JUZPQ$?oFI~hr3Tlm>emrl&;~sW0Inr8Pzf^6Hs{PR**x=AOK2j(u2K$pS z#C$^%UyYFaK3{Sm2GERhqG?r6Du+jh>3Y=Z4Z{j7RBpV>J+dqrkB)2SxNNLlJT!fn zWahd+n@;&frc>d&b%*_4w=oKfX|8+DTV&&dqs7jY&S<+1wjZ)9B$G`Xi10+?IIytR zFQ`Ic3$IO1Q)_5!Y)GIDLU;9Acc&nXL&SCUV<>9+IyqP=ik&D_N|kE0(;L-I^A|fC zl9}Y6`-`Gdx6mr*W_+>$5 zqA`N=Thv&X5@+Z@_&7?sQ>ryv^;WqYW_9l6xNZ#lw60cJBgLdSZ8BA2n=I5+QCuU3 zrS`Bn==Q21vn14sdre$L=EK%5hVNdpA63vbS=hy1!~kk^;P4IyMv>Hm!t)o%GDMCX zp7lUVV4NU&bkdQ6qPwwU!?}uUC$q!T;OVNgJXru~?Do5@QMWt{QF3mjR?QowhvQ1~ zRQbX9iB+4AS^YGOVro^G&l4S0pk4{5V9L0R)|d>fmXZv43R)#;7jR>1ohp!dfVo5g zBVVwM`L2a^XL19yx-|J_(pt2cycOUMmqDrHVKA@Fq28ppEkt;bsE9*1`HJ%<+0_`2 ztI^o+;l$0gv#rB(v9rN}TCJl=1=}tSyTkTS4uh}`n3x^KH43H5ZH&j$!a^}GRII;) zBakFJD0N1oQMqg<9tjjpC?J{LFQrcxYbabd#5a>Rt1zPBkm$R%v|p+<2JLz~ob3uN zbv5VZON&Hv{gupcz6bNw`n_=oAn=TxT&wi z4mN}cG*Lqhd^e@1CLyI(6gFZ^iKnvZ!j4@Flf}K(|P%pz>y^QR{cRwMIyY zpw@@?iHa8T+(?RC1!p>68;lBk`N%8|0IoPt+46mkC~3Xk?^Yzi5A|yF=4t%g?D$NQuMLM~gq5PgZPIPGDuS@&aJ`?cciYu#ZE6%kmJABf zBoW4}GC_o^)*9ecOB{cJ$zdq$IK+i;tRlk-4+dRI8bTn9StU?MxV%~Kwg$l&=YGKL zyx8%lTlHQ2+1k7e;IAHx=%83MyDJ3XMbJp^e17tZuNw24R-=(h zB$sS&0~@#fHZrWjnw~3OHPx)B6Ui5uo2+6zvF5bS+tvk86^X;`GR|hip{H?hEDNOL zN6CCAW5$aS32j#{{rPx(Ls)oOjv#on;mUm}Fd=On!8 zw16v>*qzUeT(?WUQ^@3k5f2qt@i`m>wRcA}a6A+TgGCMDb=4ZfKHTfzbxCg!h2sev zNv!+FJ9Ks0csYwQ3EvKpTXk{JR`uG&5MGL}TRhcDy&je@gH}kEXA1H9Z+%f@wtozN zCsIIl#)VWji?cc6AJ0WJa!tRu+|7{Rvq9WOBwGr;mg+$Nvq5+ zU`|oNT&iBXh(?QGC&-w`&Z*Q&?Pk4&1F>Pj#as|!EQpJ&t_4>>8I`2SG{^gkU!hRa zflPE845cb^BL}@%w*@YIu*+G#I$eJgw&VHThMRBr5?XI5q-F$fa*;V9xjRxfP%FdrmxU`d8!ghgJ0?T?f&ET*x& zG-`zqCH4gIP;_EU59J(CBFc0t5LU7DD1UcQZP%ik5RQOg-w8{2O87!{jS~)DdI~;N zka0m}IFFq@oRr#^tD^VK92Lb{=~X4f8dA&<-S=Usw`b=3>x#DtVrOA!T%VJD#JMIvq)n8 ziqmla@u22p0=z!iYD5|yc*0E*ZJZOTBcZVt^<}z$F67Q2_YQ|~y;l2AB@V}igfD~Z zZH;yWJ4m;0&>i)T|Z7jR2o6_PMfR zX}CF)g88jcwKb3vl+e*g zpx2M<*KNILaFcGVC&NrjY51KhSe>*ZC!D&-)M!QIW*OWl9&}6x%?LT0qh`I0ZD7jM zfQ%v=PS-?sZ^$lmeU<;Fm4u^Ysd#0=bqLnjL3t6;sn;YE-!eG}2bUa$%(twA>gwl( zH|?KTA{2i`sG;cHC{^PM60RG)?xB}rK(BW@dXR5YYHx~5$-YJ$Iz+VaaHQF&E}ZR92Oo9$ur zV|J$Vz3Cwi)CA2;N%c_*hD1J^nr(rdF!L;Q2od?C#e&qgNZ*xgw}jcOk8u=|sGyiT zQ@V+fU)zv#ol%}D6&8m*gvXLp?OV}{Zupm%7-He#d#LJlI;`PnwaevdyIYSQG|@Q> zt~(w5ELzjUMWj(3zevXKx|J+ce6}%iLRV~)wno)9vMZNr!(Oe4dz#ef?Cc`PeYQCE zA|hWfCw1+Oa5#&)J|uiGabc{S;yP^^)=b86p|~Gur95()H$Ceva8$!esorYWs?j${ zw-Tfauejb|`@&ENQ7Tg{w%2Z%g#9WzJqJhMQl-Prd8=Bh)Me+KlrCMBuziqjN?0Wi zJ4%BET0y(LG^|&vg^xzfaKSWE+bB$lkYi+xIPIX1kuB*Io;5b#6K%d$5c^-dwr}~D z*afoR#+1t|iDG3<(E^qO78ICYr`eXOP+@j(UUX2AbV$%kS9*l_aa2-LnhcY0=os6D zrq5;FiSwYFe8&f~IE|YkvJ_<8cteHTw5>DNA?IgM!F{bdb_~6+tc(1NI_eZHb5)8B zGuxr*N(gMj*-0 zUPTu#D@=d(;+3Y+i=4Jk>1+XZtg&aUeHxdhMcc*2-%JLBDUN3eP7@_b<{75EKNeLD24OM3n6ImlJiYTOc9V1(!m^a;Ho_!lS`tvy zg|i}cOM{!KgyA=I`<2?DV!9rAFf*Jm#y%15VZ%UkV@N-lGRd}8ZbYY;a?%YdLu)LN zI@Zm6N>a64WDqo5Ird9~8cuR_)4F&M=f6VF;MI!R&OWvA=2#wEnzS%sXU!~2)V35g zAvJ)R^6?teU&^#y>f*k;Ze7m%LqQGGe6CYomNQGTkcjDirXo9XPH^h~tbY9_Dl9e$ z+r3`3)`@G`z3@iU0kYb$N_A2#aFK$d4irkp$xjBxFjp&Zqu$f7^tir`1 znpShz>$IXnzDJo)oZoRtn#S5kJu_ACl!SX5(y*bE6Y$T-=jK29$A3tLU2DStP?{9e zuJvkzW^^tCO$qrGgdAlogxS~(ZC{C#X6gwP(nV8vM0aHqk%nlb35Rk}AGUFgidrhB z8A8r0#A)k_n_G^h(_d*9&$uzCiRp<2;J;W>^%Ay6hogSV;9ydR!9+(^{0&ijR1!a< zleJhqHc>MtH%rN7ITZ>N&xmNR;!ddU5NB;u#4vNwQY1&}VXKK5o6H(PAhjE;T1M*% zDIm<49bsz6z1rar&#>R`k5Zf`LohSxP#2Kzh*%!a4!P%%;WaPlY_pnbT}7RU7b{9D zx1e+^^T@w_{A6JfhuQynHKxAIerhdVv#c_M=7mmiYJ>Ev*9z zTXd3J#N88S{X)42ajY3z*x+a(qhALOJw`^??ene`&MeI~m*GC57y`=Cj!Mb3iUUws zt@l!5+ibXKWy98DoDC~9jP&vl$HfzCdSzH<(V~zL9p$|gCCVJj2Ru|;$%(V$a62~H z43N~Ej6d4#@L-E3^nlI;7x~OAKh%|7X&W<|W#TP@Ik|cB8tzs?^-`rg7*uL0zcH{} z@^!gRZ3`+1N=LFV{4!%@Mc>E3uQuMT4Xk62YXaMia;Mpei#5DyNZFk7CRVt1^ya8S zjf6=7)g(=3lXv?~Pl&;=n~at%X3lDNSZ}7KB@U6}vKvk!*u>#I=u8_GdiH=+&`z}UZ4kV(+3y*CqsKZEiB5cz$MQvJ{P=QM@ z@G}qxwV8Mrlza~lx6&^VtjOBPvuh0o%~o7sg5dG|JXXGPPlaPv#;sGEeY!Ipk8989 z>cqItG^0`l7TWi#5mXn*oYqS-1he%w58>|cNqM$#8 z5YcM>p%ckD$2A_Lvn)O9tQ*;3f4VX14=Pyys7YMRH*jx*atql9 z&F5J&WJQZOxVEf6ZbXIH+s$#eLn8^XTEg=t-46EqJyQreMGwMw$U4xb`XHUKVVYj( zL$@+14M%u8ZQ84kfu|PEMi21C)3_vsjS!aec>zB1 zXtICEKA(9M&@k=Gp^}UYWgZB)VM!Xm^jzmqM%$#j13fVPavO4O|qmf<-enb1wyXPc4oLs zgKv_I&djo%W=xl`&nJ4=?JsDEe+oS{NLhDqheUnY7*?aHcb76!q`}#G;+^Z|AoN?n z+Z?quJ|3UVDBzB9oKY0D4fRr|(x?op-RLbl)*xMUm1Mz#DOxLOjO!9NgBit;{|pQG z@a$V=%rz%_dlMc5)L|-T?Cw|l{Z_jXolm_6UKb`sS^`}_@)71fUUaTBqLx%U^|8^Y zM5<7qP*2X?=k>4h$NHq&uXOtzxhV!QC|OTk;!e!SKJS34#w1=wyH|+YHB8K-(W2Ne zep*oFj`N@GHVzAR}bHf7f<4M%u{qm`U5 zWrwRiaf8C#8RUFN!4cGq1#UnvW_kWKB>08sm3_vFCvsQ@ly~O0UTWZO{c^9B1{f!z zU@-!*I2$H$>*aZ#INdE9Dl;P%%n|vUs-qOAlIp`d%G?}jNbrbGA>eJzz_8RCRm!8m zC`R%{b{xk$PNn*7Yo?F!a5tPh0`y+McUm>4J05tJ_GvqZKZ4%UXj@ zx8BGKcZOX%+?|NX17AIpR(qnHmH8Zrbo)X>_d)VP_44EuKv2*j&+u$`Oao|lek-ih zk{EGi;i%FaCXXvhsUKIE@yPZHCDlO8c^c77ozhpi_^g!*QW{NO+|G1i z8?7wiZS{JMay@O0h?ZvOs4T@o)jQ3Ri`e;YV<+CBn^%FNrg74`&PmAi!Jb{a-$?mL zLK6YGaCRxmlG>c*;X+5nwM9u*3LjR@&iv9*EQPFc;!@%&E=jI*vpui(z!qFeoMG(3 zk{~SWoG?+_$=>oXI_nx?gHE_It5v}XH(VbO7Xm>o<$$LyUeW(C`j`mt-DIhMqtLSS zoxqt4XGh6%IGTIKIu-T8Obe==IC@^jUFSGIlO=n!fn#5I1Uxf_c!bD@`jZRc;;sS% zDf0BqNyafUR;Hv>XC^ygUlw)~e*Ln21D<2>5i^`~-8rHO=tSoIgQ(xRKhZ6(o%$%O!-(a0jtmH&aA%{p1yNFN(9A)Ir%G1tz<39O>k$$?bVd zI(HVxS@S45!G2ZG`>7%RX4(_hUfTPVR@ds3aWKX9z7yDrBNRQ;ck4eGO}!u zY!Pnz%+Xe9<{BQF&3zS=#5Ky$?zemGX1Xkal-AKEIp<;*Q7PP4Wx6Nkyjor$QH+6=nydSVw`owb*b`bWLAUopToy=*5o^=xm8ef?iJG}BAYpYYSv0= zpVOEHNL|er4(B2BZrCfQ+Y^xGM|Zn!a28PHDH;`)WCb(|D&jb$u0_zhrj4O-qz+cr zQQfHlI-xd8xLu)vGu6qr4+O>bM~3vZ#DdzmN-you2QQZFHFP7W5o>#2Q-XN0&1Hf} zczLMoT6j!vh@;JN#}3&n$1d$av+l3_s9APWL7A_^nFQMBql7Qltp{ccTiVK9ltzH< zB&CbD|AzHiqnpk|dAga+G5%uhy6P@6RBF>>Tu7fTX*V$lJx-YCiB+H}ryT;Br;b{o zmq?YzYPnTQ=MgzsIo+l0SE0V57_*ZGkWCM(AoC`>M$6^=uaRyszo5=4$xdm6o8NFz zWZY&{S2^gVHJ#L>TARIDz|~_rv36ZxTjs-{g)+BV*hl=i3odaALOQt{7N!rRue2*7 zEw`>j{W#r{?Qzfz@eQ4HR&*Wqzp#}(tiTA0M-(rNM_@ogbB>>~usi&#YjbwRHZ2pn zsa;2@;4}pUX+nBRaG3$f0L7KL&1TBnk6iig?aY`ZWm{Djt#J(HYk29N9~ea$lxBFW z7Dw6=!C{C|2gk*_F~=^F4wv)HIVcgeK!kYB{vz9DV#KqRM%|mKDz9iXtxL5C`jB%& zO(G|?OSFPq`ECOqMm>gT3Q3P~lVx<}v%Dx-IaqJ4bQLe{47Lt=Vs1cEG6nnGGEW#) zhHF0>l$+H-^guJDF z+&QCqS}x&MRy=|@ip$|5l8YTflH|p0w;@k67jPr$`$v1tgQH;g%}m+MGTt(beLJ1y z!i3bUjq06rO-JO3C)IMhcdPjEzHHd8j6Ez=mvq#zsGl7xUBQwNa&6hBwy2Imp!FdR zuBZH_EaQS(pnY9#+$znafM#D6g2a)JcO`~2!G_!e zN}93kZ~_x|3E;t2g*A1TceT;s~9GmI-6 zk8vb8SYnSnYI86hK85XyG=z#qetldpz5 zJ8@TP){0_fd*X`mh5c)WSl|+62Q*G$bC|Dr%LJW2@Ay54*@lkEinzxBMGI z`I=lVyorv7#7`0lqKLT`(3|XOuJB@aV;%7fbTQs)ALg9%Wr!?~_tfY|Z!P;hJDzhC z!+}L&NV3W|&}Y+I-HzR$I@!Ygb69y->v7*a$}&6;>be>G<)${P|2d9rPjbaD=lR1D z%<3UL4_rNmE3R|0q&r#|FN!I?R0Wa>+_%8rjqHmfJiQu*Ps{|Y^@ zFi4&e9=%%>9MwQAy!`6V4)!Mcd>3=W80jxJDJu+b*J!V1C(Rjah@V_U0gUWLdFA!i zXx4EzKJK8vjn#>z29w9zl3?z)Ow2cBThT9_Z;qZ5J{m~(Bb}vJte2*Z!SB?0y)dWF zJ5deXHILUbbVwA3|>24t2M4m6U{FBI)#GF+D)U=uCX(Fe7b{Vdt4KwPcUHv7JZJXBgE;(8#{}1 zmxJ=@A<>d9rPEtq)zleP6JMZ#HNNTlm}FHfZ@;LXW!uBOr-DW_9ND1Fmb|f?<(=6c zA$jR}Gfl(Qpi)!@%2#9Az#NCB($md!J<&w2(L#V-+nUogw3yE`oZJpBK%qmN*dyD% zUuiVso})^g&mN4gTHnaL-24AupH+5gJJ#LNoMrArws{08XMi)BA zef%uYEcI&G!Nt-4Ogjz=uJXKuu=Lw@WMHDtz zbX>4o$0f~pEm9ICEa#J8E&p%fqM6oA7y99-wy%iyC-$Hiaz0XTrvTw z5eN(8u+p$9FRIamC70nAY>A~$*syaNC7CsZid1Bl-K0&OqhCvn*u$M$E zLE51iZ}X8LWl1xQ^-T5mLTJrhwV7>Fp_2_xgJGvO6pyt}=@}Cr70Lv}wa(R_S5XzW z1=BJ%YV<3Kxm#eB;a2o|a7-o0*4HzMcGzvxJH!RbxZt&iULKmMNp2^UMR#gMb}luF zR~*IF{)Nq~R(h>Q1M3wwM60=uc`=p5k}PrN)cYK-iW_$`A41JH%4*{3R&m!Pqtw6+ z_pMGnbpDz4br{{arvh1+$n%}1aZcLpCaG{&d`^Z%vlFLwSe@n7X`u`-BFs^Gm4UJy zlt$%drQMc`$B6BrY@eFl@)S8B(#DWm3M#!!n~FuKjml{CnYO&m6h^3MwUWh{$2MgH zkNC1qWXaN5mK1`|i#LvAkrOKON{#<1fqZR?_W6483S@mnNExv38d+55cBx%$bg{`5 z3@TAS4vRvuSm2K9QAt%|Y{SS|KA3K+@j_017Pb0jNqeEg?!$rJ#U&(sGpPz2u6m<^ zU`EvA@PI@x@Lr4aMAKG=BYM&<5EIQ%CJHlj57Y9#;&gd3`in}lQL0yK?MAnwI-yTo z6u1BxE=8KTE}Jd5Y0%iJd;>%FQ*_@8$>z8=@g7}!SRcuC%+NoKF$6rZ3f!Z>XSBN1 zi?}Y9;#4h|4!VT?+BPR-CE0}gc%0ey?ThM8U&}tUS*UL>aw zg2gErLD+yW-XX0tka^w+YZd9@Be-SUUT5}w192-5Ez7bUg}0lPRK8{k5KGLxxQ$S- zNzB|u`b`^W94igEE7_2f{H6K+<|Vu;@A>E1@I)zeGJ-XR7pI)?mLFf@gEc&|I%9w6 zFhQ13x!LOsdm$tWn#VS%eoKPW#Vpp6RuYRHx{XGKo9PUn_*KPmn`*b+lS3|sQ3yEW z)P_Fl&Muv6{rW1kI&yjiJ1r4fEK(IEK>Jc-iP zTIaPtgg~0E=nomTtW`87A-fii+VImGG>DWHrGR&lP9L^PiPhlj*en`@{$XyPr?4Ep zmAmgp@8>JvkkKjAnj<>Xr_HepW1IY)@YPbKk8pWsz{_BAGuKbT3FbW0Xg4wv;K?rx zeYC80UAUfoeqgFS6XrSFgsjLSA*b~?Qa-G-`y*VgO=~bBRNcwCiUoDYUO9b$t0oXj zx!5zAgKX$gcngH+Ot9Y=<>82M(-Mp7$I5``Eb+mk z6dI-4paK7`7rSI*0s z(?9b;#F3v}J_^s=#r}!XpuFMW0DPT z5@jgmL>3!q9^#E_F-HVi4lzm60&+ysyd_P7jFB!vW9Vx3kIfUlrK?X|eKmCkra1fS z(vOyYRGU@Cm82KXgo((uhjw-FIAyudetc@r?tEvqIi9B|NmNDg7$*l5bkom!k{3wP z)bO(WvC$|-Y#Bzc0)YjFE4O)TEb$71KI&u?FuO0ort+0Fcx4^iJh%rp(h5?PwKdL9 zpprO7yQNwiH!@Vh-5a6$85W&|ZKK@2lf#>-U=*AR1qv@eotZYw&0u1ko z`;;aO?lt>MJjR3DI4>SfXJZW@h#*8e=;}Rky|oDy^+AJ-?seRTlb3EoNwJu> zk*zeWV!K$E1nfpA|1^M|`ecYI&Dg%oyBTACJJhvuMw>+OS$1j35VOaqS#9H5scZJn z@6WH_FVuB};yXwtshI)EGAC0>o>`b$x>dVa{~Hk z)DhVy!(jvOsPyA1Gw+k-MH9|7$&?!+LaH$N>g-EHnDUd|4u>s7HptYdRoYEFkYbsT zNu+r^QlLJ_RG|+!OM6`v@svf>u5ilDI0#xl4&Ne&zK6(u(i7aVfoKq324fc^l1Lvz zuxFQUec!~HcG@?A?&?gZ0?F_(QCg$F1x>P6qf#yP%dKj)T;rfzuw1%8E}#`+?D-3j z3pvGu8hP2C%xFu!g!8q7I$khNG6Idm;9Eu_#UD~VNYV>5!_~nnsAa?z{9n4hbbrUX zzVaLPdbLBLP@VdqT<)Y_!QIOZ2uNx@y=*N>*-@M^}T)yW+wl~JE+hnC<- zfQ%s>2AM{w(y4BPRJm4e592u83YTUFLlq2j0@bX5E*kBF)7vz~MRA%#GP(i2!s8Etra~o$ark3^yvR zw3zGOP+dt6-gbKkot`8Yas7%wK*=JNq1+t~>CT@JS+!jK5hULaRE^3bN>!U8|2Hlk ztgyHZG*eRxgvJS6Y=?~&TnjE$Dm~olgS4hDDk$QIATt6*nb=2$rm73ZWul450zc*v z4_mE``R$stbFEsyqdO%CTh6UEtQQWEmrgj5Vgb?Vj|RAcAq`sUe|XIFRwWkx6r>Dh z(R()elRHs>kw#s^$jd7}~ocZU{&JO;H>xb7p}3CKI!Fe!rGr}*Gh7F zFra2zYJ2${YpmMZ;jVXCJ*x$zgWoup)9=L1IQu1PWE2E7=@e4GLz7I4;%H?iae#*~ zYm5t8{%$yoO8rW`H|m8KwnY#z)yOo)G2z^HeqtrB1C)7z#7B${n8F2e(fJ0yOmC^v zB$BA&&};)q19EZNC1{M(wRF-Z>j@ckIdDr!tsY(BxocOzd9Doy?LoM8B}U^q8WAanBE*!>9CnPGj>v*T46|OMIQlirgu}^OPv%G`6nqZ7v zQ4!lTr!2S$t6CcjaGS2$^PTA&ubso2l$2!qe1g=r;%>kw5>unPH(sY#2+D5Xj@p$@ zdC-n-Vx$!&t|+HVQ;I?;5U1N`7Xd{#NtFmmY3(xJxoySyE<cWRI_+PytXDU#klV#MwUxKGQ5Uc+GpaQ!<#1Fpv|R4s7q6kPYB~=ji9*`Gs$?$o z=UYeNEKIuS!-y<#z|QW~<7#Pq1?t98D=ekL4Qxb${Vt6UL{kM*s@uF06>?W*gRgw`d*KgEY zDbFJW=_PGFk}|Cfj>`Dp2^AealCOYMJ`MoI1opfZ2I{+ z?tV06f)-IzW7kDPq0(-as>rGtb}Dh#Y!AVvF;-QJ*+%vtP@tdrSk5Sr_q%~jv*?EV z#~{}>NLE@uElFz4LA4&e7}lE*VB##aWS~vMm&kv^;9DT-z)3=wim0{D4^^pTt7oIG z^-};4tMytfW;vPqVVQV=U8HlgMZcnkl{di`nFJis=nebLVK|M&8b@oX1LQe~NlXHu zCT3c*Wv3|D{8(9Tl&WiavIg_BhtqUh!DczdX3r`S50u&l5 zjuRI!Q0r`afm~}+4bGX+p=R0H9@O!ScQ7htgt@{Ktwcry9<~|8VZM|S$INlV1#=eq zPy9x|C0a-*bq}6@M>Mcq>4sa}4IzJMVO3>8)Wv#o#FjLfzL2n}iUDV%jT`LB(d!pM z@Vw-03fd5`R-&uw)De|utjnz_?fhVW67OykX7 zV8jYEC!VP?d@gQoY%X|W)cP^Qw%argWAdn-o{L=zT!c_ReUdXpqn%MT%#2unaun>t zHA2XM2or9U17^8KztISnFtIZ5@uL_gk5UM&VG1~=a?42QAR;NHA*^-+_sI2Ib=;#7 z!x%vXv2IjC`7(!-6l}^iGmZ_aLevd<;>cztrd07L-S?cG zFP6VQcR}2I9&!{vcKPTqWTzY*t%I;q!mYF0xHCA4KYpX2k-;mWduqdfDW{Ohb(&HI z&LQ2LdqW!!vs7=^uo8|Fhp)KcsSljE^xujDk|Y*Y%er4s7nd&{+YK*gfLqnt^_ZH1 z9LhrpB4{SIYkZ%akhDwG7Eg%pQ?@67@ZXfTvc-uKGL%&yJPt$}(XwzL1)3kZwc!Dl z5g-ZIJn)#%C0@~Xek7LN1u3S+`PeS4SlP9gQM{H8&Lj28?VfRd4vrUxn|%J%NhqT8 zO|wHn7E~G*kxsOdl~t%u+-dfPwRWo?$I612GWNDLM~1$a1Y*9ZN`q9k$!?@f4YnjV zcO@}Q^%ZK`ZC7f@rqh@a-M}I@e&i1V(3NwS_&BAAiX8mp8P@ROb|J~hwqn5J%Gk*5 z4|{Rch=;Y@hhN|X5cXpuhp>O`n`jbMRR^G+l7TU-nZn|47 z>XF_=t8hxOeS->FWTQTgq|{RsjTnrtr+YY*tm}*N=Hcvkia-rzwdGXJy6ur-d_FDI zj~J$-P%q(8ly0Zij_SCibuLb`=ki%nQyS^?xEHcKN|SsKxh*3zMnit^X->2;jnN^} zD%E-j_B1PXL3mY*pL@=FDippeH*G#j0_OVlrNYn__2a!20AxA}?xUfX%uHjC2QttYQ95BAPPcpi~@U`^7&*xWjl>xBq2v5<(3e{33V$CWH;7Z zII!AHdK~io!s$$YQa(&rhbGPdRh4AAa4y8n0!A8Gt%xLuWw6$#L-v?ni>gKrN$I^x zyVeZ%+(NjjxP}Os&6Md)pR{!?wJsy7gTr&d;nl7(W8CEpBZ-SF3w-D32uWYe_6~Mu zo3q3J$Jx7X$C2acqUVv?mQSylf0=R1jLf)=?XIra3#;9xKX0^>z^Wyxx?|B|dB$B(I^+<(0h_Osn%>d9TJbD+=P@%eb4nwkfM~>y8Fee5f(;{T)DOryvW)m5 zw4~_D{Jy`X^WpZ#q7+v@? z;iGnR{i{zqkHjASvl{i;rT&+SBOoC*;pc#d2X%V*b_Mt0Ej4RL3ZOp|!fNWvi{xR7 zy)EqtKMBmO%MRB=v=z^>E-6=>-wq<~Psrgz%f;FIIujsVLC2( z`tCNO|MvOhR*FLHXH+rqm%3jCbOP@72`PjyE4cz5BqLNWt^-m95hjdM{(hTWe6-70 zyt1KgboLzBNG35y1}w9y%p<}vqP}jb=huEyqtgv?0(^M62FIht(IqX;ZxIniEJ(U~ zhey6@XJ=LJut3*Bz z;&o=v0R&Me!ohYmUG)7$8U=R8Rkdb%1$^q|Fu)Vy1(Qw_6NUmq4WnYVh&H)8`xVOI z)7>*0)pCNx?Iq~JiNLVqq4SRa5(bFxNyDoU$M?%_8Xj@Yxl={d3FU7wA&FE zR0u~eAz*s_2D&U4kI3UAxN==%K0LqMNVD+ z(4(I$Cf??6xHYT+k8>=-VS@f{>b$eUV^eA_Y>wrHN(N7=kT)$>K0VDGy7O6m z%$;jd6x}1x^!B(%kTROdFiHsJN}B8dG8~#J4%}5b;Z{U!L33|FmrR+)b5x{x4V1wY4sjc^3iPD`wEkFY@Ov3M8 z$98_z`UrtDp3FJ8ExjIY3HBwH5|p*l?)H`~(;qp4WP|#YycUe=7sRRvntGEB zP%^I@=Y1D)DPtrcuCC)o$Pps3UqQNcDKa=68OYyYH^#0w%4Nq3RZe5Y4mlKPOj;k7 z?2J&A#=Mzu%I6MR>@l_!QdQ*5^}N?Ji+6fe@4Fp>ZB^Y?BB3n>2$8lAj;2Mhz}+pS zVdDb9|M&SlTPpnLd|Ini5uu}!163@Rsp_Y#_ZKBteCNtihI9F`o;#2YH9llgB?^@U z`d=SN_fle@l0#FC19G~((aNJio}(8Z>0}TIF2VHlM8L3*p@2|=qhXN!rh@Xfmm0~K z(8~-mgnmtOfbB#oF!*pl!gTjnUoCE}k`k1K};r7YCFo(JSCVob^7@V=DyZk2_iPOf z^2XOGVgW3_5I%P&-3*TrU7Yv#Xu9E^oTMgG!ykp;Zsu+}_RHRT40P>fck$ER(}@y< z+4PINiMyM#y`yj~#-t&xz_lfeArAXNVowzV+|gsR>{0JHy#m->{LwbD(Bl#G&+P><9*SEjCW57l7|L(e@>Y$K}TOS z5$G(C$?w5_Gr$ChX49FLBrXGMeH*X-`osqQTF%z<=Wi7Bk{?C)#AcTwid3HL!7&J5 znEcy4nnt#WHqTYbbDpvrzT_b>uvyh(Axo+tb^OJ!k=B9gissO$Re>c?Hkkk2!Z z^qeF}GR2fXk(WLmcW8SUY$GA@&|{Lxf|c7blt5P4IHNA8qbEBdaZD6u1cmunRr?BB zgLCbKfJ|+iYmf-j!94!>`h0U@ZHS;H)Ow)eMOUZ~c_;3K%e%8Su5o+EH=xi)SU=l~D>Nf-SvN7pCy$rQk)nVs zr51rRVB)QHIFcGbk9frZt;QNu{Mm=3dV>LCTYvxkcS9J0^7-@^?$;ESll6{ib;l$E z+wYa&@$3w_A<}!;EX_b!Wj^0i5m{>>3OI2_UrYtyNA^Bs{f4AW$5sK6xJ(yWWjswf zDzc3-o`cuJ9V$e;Z;iQ;-iP4}JTU;$n zcM1Od{TA76i+>q9jQ%{O^%tV`Jwf;Lp;q?` z$7(=6JV%;U2l+di#&0<5_9^FkU^~X74SxedzFumP*i1V*!JxC?x512Prq8 zC`eb#QXD2R41kD1&m0s!e9#f2jsz6z{`dFm$9oerzn~^O3WY2?7A5+J z*gy@*+oTzs1MHPlk!BC^X6UOcoH4w_c}tZaRVGK&ORSIsCIBVJU%4-ez4U>Yr-0|DP6zTnSc zWE{PvGB?J(qts`kC?WcynYW14XN3T0KuC~ymLz5{i>E_MSb-M@n#O3_c(fP?QkY<@ zGFTvwrJHvPWEb7FeKkt`UlF7p14nAQ>+fq9tF*EkN-gvZS=kaf-a!(;&WPrOb>}ho zPIe+<#bVxS370_KNGdq}^%K%Rk^i}Z3|yBtcjUYD?6Je!e?RSZlH5cTk!%6vc;J}b zS?2)AYlsq)xNuB0Ucr^|i;zuHoCsSzFAbXE45(}>*2XB4A%u$8QWBc*5N>q|h4-+(*c%O-dHM}Bkk(~jE7Q0|xYC8fmBNuyGJ0a5oHN=2PRRHU)eW4}4pZHfLLfuM-kSU>E~ZpTC$(RZ-H1|kw+Xb)ds!R=@O?c0P= zm}A=vi1TDkRnYLUMebJS`|j?+zRT%1GwX-<|DZRTaw{yP{xXU*fGz}8e`4OyH__QT z;P5zwXlW`*BK3IrsE>NwZp~iNGlu%j>xkm)shBYfxO=#{f4%j`4GS>hiWZ@4)NQ(E z+wNO2@(FgNc{@Heh<)N4etvovQ32Pm;730KiITuIxDjRX2amu3?cY%qaTI@(AVBH^ z8)})+!m&1tfCwokNfod65nlAv5X3_FlK}x72u9v695CTPMYXiqKvP`tg_}7+;PMKN zOY&MdMC7^Pzy?u4x;X0h)U6X0bU;)NoN*7GBegR?01*&{DCQysKsp}tTJZgT6029d zr^{y8qD0Cdok6J46`l)dsp7krT;2ZQcuv386sp5c!Mamvtu;=JI(!z@_zZ2i5h^QKde4GG(>67n5dPhulRSb|pz5r4{rVXxoITcU zbOA}JfIviXXc)`>v}wmPg%>?45h#}!9H2LYlNtaM|9@lfMQG% zUqN&Z*2~g*!OM}DO7Zz(wn2r&HRRwO>ZdxGxN&zN_I8qt4uYv8iO|nkSRRo(gJh4C zPT-z|ti+@Xm#qp&%vIGNkYJqKW+9lq#8&Lq(*-zC$T21e5S%+#f&xuA24p=_|O(G6h@11ev(< zi%Tft)8lN2WzLW+B?)OzmPA{XUAy$i`5~%|?Wb*MrH)6$%^w~Gf97;u(boChk5Pfw>^i<}xJ*)C_y%>g2Ixn8KL%;mkFYBm2Kc3IHZ~X2c9e8LcfsZ+a5TeLkS6j{W9MAS!!{`E!uAy}2P$I9 z2{-K!rr?l5BkCV)T0$!O3sr+ok5PHXwLNh-OVFJXGDX*uh@8_qbn+Rb?=ISeQae%@ znBiFAH#yp8J+pfGERWyCth+!K7#1sJkf0qY+xLLT)&0}AD=O=yrBcvk znL8VZ>Yr_v^gYlOuR&br8;AwBMgO@&M9(9%evY6*g~(HbTt5yfI>WqF zJRxxe9Ib_dhZV(SQ(o^BJ~m|;rU8{}SlELW5C&50g>9Z<@5G;Qi+SOa%~n>|5*wW2 zVwU7HYa=OjGIuXqlDUSe8DCN2?bG9*N~IkRw$K*oC-WV?%}!MlH4UZFja z9*2Zw!VjNq6suBC_W}-q9WEMYW+g;WumP?8a0y12USW-?^+Z)j=a%>nMNA$>3E31n zz4HO_>*!zZUbDjfG-gCc< zTO3bO&gdrlb(P4pTa6@@x;+XK>l3tGhl|AoX(Yq2Mfh1jBsFt;R-m2u7n(4qt16O0 zjCe{4%OV$FloHfLX6d^cTF^QIxL2u|x)%$v`28WvDWO0n{x$giDy=8j{aGo&dhai>G|xG<7cfjy~R2n2@r~xf`qKpmINO8s_)?YnwES2%prBpOZ!_ZZ`H-1LC zeBYwBw&2dX?uL0Ub~%rN^$5}w2yDqoQJCAB17BUe0c#)A<&T@ggd{8c*RiH>C7XsW zQD1^m+@hvfo&+E=ZUpB>rS|kn1H2%+yXW&u!1UI$Pzl$-7|o`g5jF-{rKm(zL-I{9 z7&!NHQK$RhWe0GZa9L!iDKStXf7rtxD7oXb6H>>+G50zSQGlJ&Az`>6D##WA4&kDS zr)RQ!*xLen|9HT2Y|>-ONPyUM$^8rkdLu-J_XLTcH8>>rgj2mYivl-NMxP+DMJgSB zyx#wD^&k;A9uL~mc(NW{d&w2)_dMko){j?+6pM)prvi`mN5r&HF-QZ>f84N=9Tq>PE2uZ@) zpf|NFoGMIP8N-&~5ZwfT z9=6B+i0+W?q)>}D?F-{U(cze|fLym4AD!U=(*yHrDso7CeF%GF>8 zDfUCvEwAVnS8Ut8e{@JWTRUVdGKQ66Sk25y{{!`!_2fVTb=T}Egi^_&sJK(_N#b?` zp<`dKul%#hPrJN4%gk@l;4gZ&tDHc`<-=~kC8igMk7se9Z9Ske0Z2g!=MZ6J;*!Nw z8ek$d0hJ6T8ld#}(o~1$z#%@wjR_4tcp?yA$Q1E$zIRjqS^c=5pqsTKn(E@dgzn;;NmT+ki=28p_KmvMP6{UfuQ5} zI_nL%ma^sKHzR7E^CILv*prpwOc8%Rvl0YC1|1auU|(^95efjphA%e5U@Q;&y!OZSlks!v>@VPgQ8x)}k z%kYvSb030K8Z_+*GRE&%q!WM@-V}Eq{vsjj)*gW}CLmzuD(JcENcjfwQPos+oiuU= zDZZjUFsDs?zk8yfFp~yLj1h(LDO42Ub!X_)3&eEf7bUn4KWLuo*Y7l+XIO|AB-D+2 zsqxBywK<>=+KQLoaIa9c0|!T4u!MnfO%PDRHi})v{_>CPh<8DT9*aGCYA&#CP|-s2 z0b=7^5_YH=Y=>`|oij+oy=h_EtWa4w+7O{)*bmPJO4ri;D2L8qNAwGj zzZk$3ijX6lca*ZpAV4U0WR~8XEGIbzi>8$Yr5i%T5cjE)91+vqVK;RWIt7S#-$|pD zYQ*6RB&5BVaklh`{{rB(b+OP;4QmxIW(%a z+Dl%ZIEMTDK3vH04XYLMN8ud~0Y;eo{}dnymx&06dnld!ujj|`#-a98`yLHWl@2jF zE(GBlwrCBblrs{Pd>)xc2|ORdBvJG8_VlPRCES5f8HK9$Rwzc&&x#rOZ^ic~Cfl1l zbxkDoC(i3GZN`P1e?6y&XQDnw+M!Z;0~tXhI;~eelp-XI<$>a1cfO>wa0gej1I*?C za{X1qOcij8;+v>Jf|Auv5SA0hg_f9swpauR9|ye7 zbxVI95Cr5@!IZdHuxCfCbO47}Et=TpfGCs*oecZ}6L@|le&M!BkUNbj=P7Y#cu(iH zKYB|r1xRy(r1~cw+45k(yWM*iSFP~G{otiQz=&-33UPt$dAA)cJINQl$>`4tP%F&^3^@vc zZI!xUSd6-^r<5qQ@1n6`1dk3Gmuo=?iC36CfbxpMQBENHL<&_#6$^-~vFc_jc&KF0 z3+$Lp4jbw(@o4F`J}C(*2}-fem~_uk8l`SVw98P{U5czz!XUC4QS{6}c8kYbI6XBH z48K6f;1RlZyK#>lreQD5u^`=_;DhGIgJNUzkP}MYKYm3@F*)>V+5*jx}!K3zqt)U{f`4)s%o~^{$rH2Y5=n1wGL4V zA7K_hJtJaK*Xb5?p=UcG3l(^#%ySQ#x;TydIs~ziYK_bzxjH@UFpb28Cm|MaJN^<< z%n`~}JxsCFuEt4LGCxzpQ);yU93cCHR^Y+A`rz(q>3B!itjC!)0fPTu)Df4TqMxK= z5s^uOqkSpZs_vyaJ82Dg=Et&lVNTj;o%o2qV>Nw0s(lCaPVca-?4+=Su1mK?88@Q?5w$(Tnr5*Opi0hc!~6|Ot# zyoY5tiXguRGJKC>0m}00x@vltcxPWKR0U%?*mSolq8_LA{=~J%`&F#qm+8>J;&{;T zXEw(bAB}FG1s7NZ9WK8>1U6&IhDMvmW%6#-btYP-at|sT&6LR?d1l}qF_(q{K>nPX z2`Nbl+GYE>euqkO)qhYyBsF^fGI1hoX>DfNmdUZD4O&`J30fz`9Gc&+&VO7|pvg1d zAb1zyfB7w?C*5~E%;h;5vAH*K$~!0D>L@0P^=IX*3QUfkfD5cYiiUV&Y_*s00*`3s z3$G}7fZk`3uqlFxfiyns2w*}#hi)q=nY3L7fn4c!DlJN*fD+X`#48<`C^8|S@kx^P zVr(M(k$X)gR$%5JMbuLSiqZip6P|cQiZDX|w5Heo9Bs=-*WV&z+Cr}_msREK5pcmM zJ@nhnVOuZt)`xZ_lzDphPn-bilygJOpF2-;>Jkb9tZCWje32c$@GogA}QZXeuy z!qZfGK1e^nb-xDiv44rFyxtNEFC$QDIF^qabh0TfL+7d_s%RoBgN$90WLoA%(fE&iT z>to8qSWwOUw~_Git=R@TT9HH&`#3A5l8P4NfHGOT?QuSA)k;FT7_4&?AH4E>2S+56 z#X^mP-sA+Fsgu?T-d?3u94`bisel1K>O$|Pkw*HG{Y(2{r}ukuDJsl_dS z1~7Ifr+i80XD2lk8C2OMZiVs2@hb#09HW;f)Y>{1Zfc&D%tdir)pc#beBpB)i}o9|qOk z6bF|VpC1X<8pKwjK-}4j5D5r;PCH=6(1%T39r{D>A1EHWR8O&=j}U@(6HO zFz)gk6*v%oT7*^f4uL0ZkJuLEUTR3Mg1(7-Yo@&lv4C^YQANOr$a3f@vw;u_XhN-% z_q5+~m<|v95nb+8M=e3k8kxxa$wE>{^u+O%&Xh16UeqT>OjR-3aO4@xK9qS4gUeTc zpStx$tB%*`gDEKdMFB%Lkj((u*3?5<&-=VNZjbw8E7{^KeWXHLO!OZ~8y8GPD+r1d zy)zv#&fDADXL(>I^zc|k?iP>708M?1#3vuwq(q2Zo~d4}+e>T^V~`y9=zfg5q2s`y zY9aUM_ReZt*UNF+OfbR(@y7-0;2@*yBPu_gH1dvlytoNs?AC3F5k<@hxHb?>HwA?r zkY<4POKQ$mVnmelVt`h^py|*ze<6gRm>k#}wBhDiio<KV^~g?Gdk4^NLTm+u=i zGNqsvg9X^aF~J_{7Fhsw(H6gu3rE_Mk2`r1gC+$zDHaIm?(sxHYm8(&%HgS><$)N5 zV)za5P(=Sy#E6qAaECQq;OhWG$AxtrMHB|r3v>rOV2C^M`1>;n=px%mp2obN!2Y1X z`?DjLyQOs1D5-%mS)KRXC~QI9kQ@bVh=-D0jUp@x{c}8?AIVCtOGaUWevgET-UrWH zum!Ueff1bik}x+N7oh{sk1f{q(lT?7l#;H2_CVw?Pw4ABrra;EE(`&9`SsNkK`l^0 zKJh)bKyQxH2=!>+HSz6-x878vNzP86Hojn|&#CgzJ!^f#vbb@*t}}=7o}qvz=&-Jt z%l%Fu4|Q8D6$&&c*F#-7vwuPBdxzbi8OxULb#yKi9lr+FR7J~C8=Im-74N#LtI_St zq4R1pbLgLUux=rg$Daj50=%5~l`XW6PlkXc|BfPyvFyiLaL~B0Ky`N&D+xdbCC%nR znyErA{kVO)dX-{;k5(MP`0vvdKcZB^={ZP9VHKiX5mUck34y-jtf5S62qi#fIh-=% z(T949I_)UQTBc{1RcLG5;SQjZ=8g5x6F{X0++n+Ep3&9BZC8$x6EKmmm#R5#Rkcz~B%Fop6;%7>pC7L8JmUZvwi1iMQf@N82@K2I2kLoh{+$`>n+?-&x zxD883QbmIZ=?NW}?IyVAoZ$(`Og>0eT@=u z3DF(ocbB0*qNl5w>GF$zurhF#;tn>ku%dfm&{gm|xN;5y;z(3>Ig&f@mh&*xCo#3Y zYy5(tN(w_cb$$iQKkpu*DpYu_Hd|_3Tc-E>G%nsP#6f@0&;uYCRwygz`RkgMzfI<$MxcaXG3RJl;R0&R#68L#Lq6UeNu(D*g znsWeNUn--7Q@fgQa{l;b(f=|-;Rl;IuWEe}P6{_PJw5-G*C7?U7Y6WsDxhzmQPW&U`fI_S5C{ z-|&mDwSZkD!Ky?wpy$+Yf5a0RnHN$N3K)8OAU26pM8#u8ZB6w~fKq)#Fz8T8pW%5# zG#Pu+QQ^XK3E|PA%iwtR6xkH)q}-vD)^DlDhQnK&5N8q!EDDcH*Vi3X7djvW7|&$( zA$hods!}wX(wc6_t0!qM6%?At;K?g@5&F@xy9N%`M%<|c{rq~JfTv}XyUUk=(jKQ~ znGQGcYr7*`#OaQ3QZ4}5Cj_v}M-~tBZy)6;PUP~-C-^cGRGk+@Y;tvuXa~gVk)ao| zF6i!d_^}olsE-T-bkRVU5q5GL`1WWD0vTbWt>Mmvx9O>1si=CoC!AY8f_BD3H|+M( zyvTr$Z4$)Okt+01UTUC|N0VtCGou7UIYlQ?5fF}yWN~Ck^If&O1}yZv<7vYCS+$Ck=32+qK3Gx(Ona(+Cc13g>o-13XtfIMeg+oZdDxI2GS zl|#{hgR*OuYOeWp&uGA@{N+0W&%fS3qN@xyOflS81Sh+m0Y#l6AuUwe*}o;xmfL0o|c0 zW!+0d3P$1u-7{6`h+}&F#yE}XOh#gzygw_!-Ch+iHL-B03V>j&zLm&y2K*=G>^?r+ z|Lt_L7&sjYRJ@OXMCh<_+u5uYA<}9~lu~|}V0=Oe%!61yKeh;~zHC3eyZi@a!*@g( zJ2lfVL}5-1^(6d0L!_1vObpI5ss{E_xIBP;_Xb$fRphBi4bY9ip{XyKZYt7r{hiC@ zt||BlmfxB#he%P`A|K({&7H(r2qGtL7iE?lVDtM}X9q9gZGh19@9diN!v8kCqs}+T zHiezx`HxWP8kW!Feuw^ftRXtk&(FBKkbM(xy5Hh6dV(T+{rPXK63h4*7J6~GD@EdC zobQ~2od{_?hrnVva*J-33=SO<%+yLosuX#WL>RdjK!i&UCrHjBwLV0qlnEJ{eY-Rh zD~^H%;;21jTFc5L8O`-|5}7!#VFo=z0VKuDXbp~JT~gTvHsm>s1LEWQ1th+N%Q6LZ zP9lHK9zAQ@K(0zXZ0l)sY%w+PT0NiOlwW&8mFc0oAMF(>G;j5Za}LA1OaFdCfxxlr z=S92(pDr#l*Jy=TC=Qu=`^@@dUSnl~xTJs&LYiLhuSgvsu2#{6On*d-%&;!ec6{3P zpQJqDHF@St!d944;{D9UdV;S^xii)p+`~V5_Lp!6+IPsp@<@@Htz8Z~v9}3QtZzd1 zE$1MV!V2HULuHlVlP<2%{tIP{w}_vYj*5)aEz&vf?)A~)88@Bljv_!2&5CF#xhbK6 zD6L53{l?|9*bJtBcFZQf3=}L6Gzob{ zVR(k^(3|IY+o&S4^ZrFhK-r$>!+elwwhbCi%!;s>PIq#bPVPTN3_p=if+R}dcD zbxVDaUJ?xddw5=W`0ko;Gq61r9lQy2hS?*$=?Iqf?;?-a8~y{R!l!C}fmg6Nbq8!_4TcKB45QE}6FYyrVp_wVF zWK2r2J5>d=y)n&`9v2ute}YvlI%LCUM2>Zj>iV8yn46N&O01QV&22d(j~6#J`Z?x_f#h4_!ot z9y&cr5VTTW!~mCcZ|fg1BzF~p?OF|1{-C&7iqB;${dK8x9j;|w)B<~w!RtVG^Sj1RmtPvhA$K0cn;({uUT%pg4R5T5tig#bR zi0(72psDrPL88m;J~CTMZ)uk@>sO81_xQeJ@S6pGwH(?)kz*dLHcMj641XuJm5G5uwA2}FF| zQiN;_U5#S8s@!OAnj5^iJ!ZtnF(Ak01nGZ;G}SKr&yx=iD`Kc;S}{bMKiF-TT6*V3 zG`wL&=jr}$kLH`W#2ug30Q+N^F4!FgPd2LShGq_~+5;nnQ-^pN=}_;hB>fs{w|~97 z(_IrXTTa*CpnA9$J-Jw;UEFS#qLdMQuH$^y9F=%i5Sw#Ey*n7w{B=Sn`W_e{w?8Te zlB1CH-xAQi9ei}JC>2~5m68GduaEPLauqRXpW~Tt%F2vROw+Hfi=3{06=f&F6%nM^ zw`i<9_uSb*_QNgC^JbXdXVB#My!UBh8EER0BMPlQpQ!maqGl$l*ay=8jrSTySlCy8 z8I)Uj4(q|c2!tZik~}Q;Q0>4bl&0FL(xAdM{0Zf{qpulP^;I#*ydY;83lH(?htx8FlQ*wQ7xPv5vbAbf8jb@ z;`1|$PZprUymXI$VXgVH+I`&q2mYfQAqYBS5aFn3)YM65n%cd-zJG^F^Q)vu863p! zDD#-IZt?!RU{!@`@%~^5fZhZHx&R}*z;8brJ+CO8ngXg=+cG%h^F^W#KGdIJhu0(8 zY+VKW70OK2#~zLK?BcnhxsCC_O)8Un75$CF_~8v95O)jnn}Dh{%W>(pJ?Fc#xFu3N ze))oaafSi`4+^z7J+DgyMq*7Okni=~KO^{HfM%&9ZGhmzk9qSgr~o8#J^YB3+{LeV z+PVPD0&LLh5|xQ&yJ~jFnng!5uPq49c*F!=CtlqCESnZHJQaPYP(oEws64GxnUkG+ zpVFetjo6+rdqM+y*5R$K(De>04KFbGS~%s=XTDu>`zXKe9KP?jtmKHq0BsHT6$%)+ z1CHqKYI__fbU6>lOkq<}JbREhWITkIldyGXZB5$7ffWuRch{?AL4ZOv4M;&?hnx`F z0j8W^ecP?Cn7z{OxIw*~WvL}h zLcp`{EP5jwN1hf_JyzYeIdJ%ZY)@?b37HttVJCzfMJ(|VU zn$)5|T7T;u(L!#EoMve)!hqQ~geHO%BEI4)7u(c-zn)B!2)Fe{DR8@|+JMp?v2;{b z0Z_$S_Bo#2oI(x=y7-ouLth^#u9$+R*#WJjhTUaGZromi_&l@_Ht3i7BWgUQi*%su zcE^aBLk4k=z;zT$jf{$LXwuHY$S)Ti;zyw{{D^~y%}UKSl5h4iQgB>)Ua-J2ULR5t z#4C^hI^B3^dB|X2&@a(%`~!5BGxt6+QqavDt(bxdIfP2nTa-Ay;dILK1`nu_zyBU8 z=uNPL?RE!O+L!ku6tWEx$>7wv?xk+Mbm~AA_Av`dvOSdiHOgCiQEUqm@&g;Jltw$W z2;RdEB)tR~GZ(4;Ps)d|N_la%nE8v_<`?3~o8m3LUS(ZGo9%Xx5nHKBEf^KA4WbBp zV*!=>yuOP_CDBv(g)&#(qJ~BUrda)Xy8HT#T1R`tP=n%t*oea+=vU@G!&4^-R4>uX z%WOhll8iH4JuVz^b@|8XZ}wNepxTkU5t4OBf(Cy031Q<1SqyJ1i)QN6tDX5g&ORnM zF&0#Z$1CL4;jGkuA5q^e+}?HyLXr5f72r7B|^Oa z7M2I5fstl6RmKy4l-FPab8BQaB74J2ei}k=iU# zrE|!TOcoKdB$VQ&L+&LihKaxbcQ6yOSgGa+6{&p)RzF5#zi@mK>Uff6?$X5skUPh- zo?DI4KKMk%%&bUCB4s8o_$txuMkdfwA;TY5!hmBT6Dht2-^I3nv;GgtiMk%Xp3$Vk zWz6e2F47d7qgcT&zCED+NEfVz{9GriNFw_Ui?!}KQ3N`NL4q$BMNhiJ zGDkX$mdz0rAciqIwj{qFZMsw;n%oD_7*tgH5+({Pz9z6BNIjC_UXzGuvn*9rcad^0 zs9avb^a{VPXMf%Vbcd2svvN`E5(}vM2I3agm}<7mbxa_#DHlCy(bo;rqR-`M+&xQ?=woKNb35{>kCX@Il06#irfYE zlPSe40x?wz7(9jNJZ8^k?8lr19fWonO36HOnxU%n>#`*qifYmPOzGG)Ek4c;kb^M62{`gWL5GYk`7tThxj?ARE9&IT3i`)0$9f@ zIbVh9KRu!2U+0{kQ^bhRo3t}yxu1lpFfZRpd?M(GW5a*2u)Dw;Uzih5KTP_ z?gwjz66)z2@{K$u5%m!lh^ULxeNrSvma9iG$44ob9hNwz70E&ExHLXkIxv;ZG>FlG zA(Xskr2QGYjwPIzWr}CSZH71FgNTUE8i#PZL_r=(AIUo-)yWenUs_b#MfMj|iT zht%-h!Dra~t_j*)2Hiag&8FI^RygOw{dFv*0EriVs7K~0?$PS4DI^8bQ41oxQa{VmoSbMb-e4x22sy& zi27Y)tX4`;#M^VB&pSdc{sD-uv(yDkG{0}s&p<;W5denrl$Y11Z&yEHm)8AUP!xGz z&D$kda~R1hPrGEk2h5^NH}W)UN@_5U%r@rlW(TPZDJt;pT6p>7dF&K6319QbWb{x% zc`Q}#(JoOzPI};T(B`*WFIz3%zNVEy&nWSDvmcR}?b@T@mUh^2G@D26=Q!L494xS0 zzRRV3ey0n}*%b28iC7eKt>74iTP_ff1Kd1nDc#QNXDfa(TS8fhwMu9_M{n>5!9mv> z0JgXpPwC2=T=@)903P{~Jd#4c&j@{$LS@t>A_+-ETA9} zWbSM+;Rrrgfx+A22X2QF-9Du6`Mb}~woU0Iiqme>9`+p?CW}$%UlZb3HG7O6y>`PG zE>0RU$=t?y`5^0ds780B*{~0Z9wvfZ961#EJ+-fn)WZX6pCfG-ZgkyRu2>=MBH6QGmBeH+9BkRrbibYN zG=80-XVjW*D>kuWH*ZT!6KsY;0Zk{R&uEuf@^MtJwZ~ETjWD66Jg(_pVEZD`E~uS( z#JaQ+oPb*{Cl7Z4v|Pm0`hAAcsh*K#Dt+<@HF(jHn2j28WRbC3O>Tht1{k|LjR6 zV9ce2Ivl~&!je}&FJ?-HjC z#b6hNd`6&g!yy5N^b2@n$&=@gU$P3}cjx8cRkU!S5IRa5RIS^g91WU_aBLCb5?9KA ztJh$|b96|}{B$DaREjk^f^er$_*YPih^00%l%BcOG|3UAi(iiCHm;g9-`pT#6?k#J zYjj2-(DqY{{$2cpWArrA3~_}9H<=nS5(-P*vr$GN?X*OH8HjgU%3hZu={blT<(5s9 zq7R10la3Zfh0;9vU>)0{x%f^>t}=dq!n9$EBM?y3Q8Ez!Hb;uQ`--(+hNqCOBjkUg z+95))xvy9(KJX_k9LX@Xc8Ip3FL@T1cR9f%=bWZMFqT2v6N-K`;)&*AjFp6MAqXyVmgmvL9+d zXAqxIW*1RnoMP*f@$Br`I^d9g{Nq$u39ZzAdvR^{vY;+Fswba$gR=cQp<)*na7mYz zITw^hF6I{-5!JWUH;4*B&ndZ+0v7 zornufQ?xy6#LvD=%eajz|CSjc5*`kA zxTNgMMjl}lwYchaSfW#75X0Zi@nFPW>;pDkqUWI$ulU5c-##ID5%*P~uz?<(nhZ#e z){ocwKdv4w&FM*}Ghdxhn;GwhM-=RFG1_8#*x(@F-AYZARByLg$F^^Ya2$N9+`ViWQs^wVBm3kdcx0 z8Pewu1^Nlia^N!$dmDY}BQWA_Z~@Dpm)z2oJo#~P1wKeoG6epL(y?5((*^9r8H+MC)(lA-FsQ+j#W!n-S=6MfBZ(|h&8 ztxU&R{pj!e`1;is_4JEMCN+uPhCF2SO--hLmgvTm8OSII%aiV3gsZNdNCFcZTMzSL zch(fo7TeOsjHmC9&wsCO4;V)FqJW8U>eEVsj%g1OS&JQP|MJGft4mbBnct4+dorA} zg%!Ny-_90zqToi*FTXtf)AI)8r7X>(9i&tsw{f``IB|tCTvh}|xX-WA&td}Z0$i7b zuA66Pj|_bD!zZbK#$syb%=U1Q{fuh|CW)H^w%@Mqzg(JkSOg@9LE5uN>k}|t0QFN-4VbSQ2bq|`ogr1{6YC_6 zfFBKykxyLEImXxKW$Gn`TUH!z>S&A?&iBHvAri>%Fbpq<0*=O~Rq{!>l)qcHQz6(G zO?164$|2<5s1a>&LY|PT6_y?mETAKp>JB(SMvUNGfn}@L?@wN=;{3|)M^k?Oc6u=O z+QLE$Q{l=9Q%P55$1mw_K_g_m$YY7rRoxj!;0%1&0@v%gzyefn9O6L(W?VfE#|;0g zMF)ZwmYvSz*Br=R#3XtFQKOKEE<|_HD(v=d?-69Ihira&7tuDQQ@}W70TewFe|Y3s z;D-&}3Rbu@s1IH~UGXGzi&B+Ws&J*-mSFncVd^QuDW%sE$Yl2=`SK!KW3y6*LV-#s z4J{$MH&|a+nh80J$WZ8x?dupxLxs>$$)bgjCp|aOB-j2<%Kh62zzjpgCx0p0HYl)_ zG8y_aiv)jW6XoWKR2BGyaNiQ{Qq3B>?S`8<9dVLN;b5Ul5@t1g!pWgv7(8is^ znCWz}TqP$_>{-PtVC6X2%@*>*QUn5QXd4htr)Spe3XHTF=yTlNM(>r}uFX9(V zItMqu$Ruxbm~cFzBcNZ!)bm}MKQuCpVl7F7~Qa` ztW*mVL~|u1x01oGj`0i6@C*xg^$=6#za<5CL87y78q^4C1XH*U81>xv=Lff8+3=xAQ2d(Os9uO zN>4&C8DCNS*kz{;1;;sFlXY5g2@GPA8Oq?dG79R~O7N6Jmmx}{3g?HgN{HslNtLzm z1k*KQB}gQw{&q!zCMLRBu|t!}|LdVDpb2x~356TDZ;q#}T#Ml_>JLC0jq?(Y%4n1j z!a+EHgW4PXSePouKc&MPz+zfB!76#kG4!Z~ge!gPxCilG*Z&{b%UoKtx6|p*m0y&5 zJ|PDg&O`UKN&S>`&||1KsHdyc^Jsbr|F0*g-=$;j7Xk5ldgKPq`RgTO=`vEZAO-5Z zg{*M*iePN z@MpZ)@Fv^9;7JJgXhF02hx^~>Pp?npjX2%v&zPpw*va^B)EdrCgpuJ70`5;nqkes+ z{6FNf0!;h^1R8g;#=2>0j1K6?KP*1{w-g~>1OOu*1hdl=_(yI3g^-}|8+L(M#EqnX zQN8i#pQOD-|GdzD!d!6k%@f1@mBHpT>oZmJr|d2>-n$>=fmaNdOlqKGg;3?(;<^bPEPXEc5D!C zb^VHBuB@w-evX1+B;BAe=nF{|ciTEu4*44#&QD5KOkD!W7bCiw{2(jD{YhgJ(qU{6 z)%Y0`g{&JwlRW@5TFgFRA!L>*fJ+RSC}<{@;}jn5ZdS-C(;BT)?<5X29rX+AL#E-E;k$p=Vc3PC-T^gwz_IvDEk3zEy6D&~b7Cs&)X69k}CO>$e|e8q1Mip2&UXDmYN^Xmwk@qL1Oz-7{&m*%aQb zuFm^6M(9I39YX9N?uqOdM^=P*xR*z1OZBMVuG}%$1lAdR@~C%7=J4?HNQR|~7a}(( zs~BZ;=@ml-49J;KpbZt2aYwHxM==k3SJ8UKb;`@>D@qIrtP%i_RlAXsUmR&HSCJ($!%7B91PGb1 zxD{z>Tim|=6y};`X9Y6O1tPLus4Yv*){a=0C`bAAm2w&H5Xt|_9mKNfL>rcaRGLbD zUuWTx&V*y(HDS`9g$9M$RXkopZ@NQLalRBkB5`k~>qy3}Ndz56#|XX?N*O1b^{k8eH(0G9o+}KW|aWYU?@tOUeUrwjnYgB|N3D%cv)J19e*(k5>mEyig(gN!G^H2EC4RfM% zeV)~$;3i0`-9Mj7dI7NrS+L5lD;&Q+v0PuL!BFONFIU=%3WuNHe7Vu@4?pDY{Z9Sn z(xqYmv@GdQQeG@Z(D$;vjwK4SJfV}Y`n(E12choWt?4=)N#A;t0T&%5eDZ69&z$t0 z-XPS?=&i>Q|Bj7eCEp#1WMw>rA4i&B7cVOO>IyZ`a<554I%Qvpdkdo6; zmV^Z5t%nx>&MzrkYFvb-uo$QJ-1_aJhjwwCuhmlg6>*DHu=*tLhT@Qw7nGnGj31?M zUy)oR{8ac=o?rJ@*Cz@{OGzlde!qJDBfAF)vc$7p!#8?+rpuKg53?!wjr7(7j%T_< z@xW)izJv9oG*@I<{K?PhMZ-X%&vAKZDoTd&FFpkQl>RNUh7(`>D#A(!lx%tQ1}O_3 z0`vvxM_lN%0K`6X3% zvMK1Iy(k?3R`ukje-^#odeqQ4%y`$fL%hF=y5R26b0YxiM)M%vaCcVXBkP@3~ ziL>AIpYU|fe-bsT&&UuuvFF#A<6Ta~Pe0T*7oVvD?e%wO7+O8&I*v>nsKxfiOh26h zULxB*a1G~m?MSgHy!?ou>;4=5RgYiX;VH#ImE0ArDgK#COi{z1d}DOf`n!wpaifa5 zfAo83N|OU(=1+RXq$_eS9G}Wu60murm3S8I5W`KzA_GS=Q{-)c`F-{7MfA^Nd;{789p<}0N$+ECkHaf=UjjG5A zUNn-`+``{IwoYu7?VL2jszLEsDCZd?TCN_Mjc|-5B@W|XR|?@-_I;yFoSmy!(k&U{ zJ!wDJ6p+>S)@WQ-Qh#d=LYb3jR(_58_hwX}JDF;w*it&mRzJ#qg&ssM_fTgrB`;P| zD*2O7lr|j*^?ZI|Y_WJx_T8E%4rF6DdC3un-`rbH-pnPpA&rS1P|0!8U%ke>^84zR z^4v*DkYsJ9{zv+o*63I_X9C5Ncc1>OwjoXCCT+E3>xjpet!gsjt*2Hp;%$7(Pcq;J zd7QhSF|~hnIrP%^5)Hwti=nzokqITEPrbj1Yb+ny}ULIS>=L6*$)gp?x_mYDv|=}zPn^chC!2%E2y{c6%?(qAQ`!e_%| zKj$ef$q*_feTFsx&IxH0KOK{5+Mw7^oMSXXyiiWrb&=EwDAg@X8Z)NQpUWPYXuz9? z$E!VSIw(z)>8XV^|G0g+dKLD3Oijy}!>C4V>d9rFju9=@DfpM#N;0928|)}ZHrYEw zL5US$b?Q}dB!z@;uAW?{#uV6FR(o2V{(km-dE*)8-#&^kDLfO*Z}9{7=SG45LW{*q zSN=4&EAp?m&q(SDrBLma%p){H4ni@tOlH5Q+s*?bYa|SCKhRSu3%BEOj^)kp6I#ua zl!~fi#&qNFUf?uWTI7D9k1hHcBarIdk?~Z&8(yp!uAFC2X*(k5~QE%ZQD7rYQ^L**Y zq$7K22sdXg{jk>Bm?BzBXb+)AH^ zWG=G)u@QK{M4<{-OMM($paR4E4$5qWy)RIh!UfQ(qXP&QdKb zYbfMPpeG-i`ql2YRx=@Ll7!xjS)Gfi0db}RauR}Ujen5rYd8M{2BPAIdhY1o)8m8t z6QPYHQ93;o=EvC-ekuP(4#Gt-A^bjbvobHyvdJ=3(K;+m-Hfrg2 zDL_z?H-rJ1+)zvpt!bUbI%i!S_S4nSTt8h64O&?Z|HSHhc{TL=nX0L;Y;1pljEK9h zcP}sxI9wYX74&0B(qQEv@pFlo@MuJl5A}~91{+BOzI6OvuaZ^y(Q=IN^ zXn@Zde@)y=e^lL?O_Q1a?I5gb!RGfor-go=M;vZyjcqxg)pO<~jJA(yH_HJnYRBzv z^A#DXPk(7tQl0bwi}3v73X-2r18m{&ehVnORNT+G-Bja1tnU4%Le z#gxVQwwr0UJ1+Aw$)Gj3+s$#Vs{T0BWTrp5fr)1E?e2*6qdzj%a!*}<-xy6@9F{}X zZYvt?qS@lM=XP=o-w$XI*7e2V?-N>K_-;>RU5dj~(jGT$UG>WzEprlNlql~K0Qh3t z&Fx{_uYHlCgfFVYSU2e1vH~N;3Qf_L?KB|$17F}a%Bhsns2PvL)Gjr~4{(@$rWY#( zwv8Ou=DMUSKkd;@X&QEW!ly9W^&k$Tr}}uvr^#eazpXyRz3>ocnuqZ@nI9uE6G@wXkCfXAf!U3);&z-DX2GnzkJpxOaWFQRvQ-PKw6rXbv=I zlzN}hw4M8DkG{DX_`7V>GIF{r0p`))q#YTA^$~2 z(`B9y{jSd@MK!;4`NM8R$Cw=cMMl$QLO=6*&Nv!vbJ9ths_VLC8Z%5Ynl8HrH^r0@ z>Y_l?YTqBbEeSol{EVjazTY+tx=dyxGfewxXq!Dcfh9vfWHjA1%{Gu7A zs|b_vAZ^KH$F-XQVzKXMxpku%qLD3|f8iR)>P6LVrglW9x|TLB9hyyhX!p~E zmiGBryVsBr)3%+q(?SIjJaxYRz&~9)x_Ej?%_Te?z zvu@MwXXyC@UD*k`Xoq1ACUyds=CLkp*=s@tOglg;typZP)28AOLS#Du<)wsgLWgdH zeuCo;iemxalo0)u&&HCoeVK*JC0bSg_-v1lXjgKg1hb9na5c&XD zZHt?ms1OaZq?*x{eIECRj(9eVvMh+H>JeJdo=#yjD4nWq_E6T)`Ys-2367}_hY{z5 z$P%VXD2)Y@d|Fy!<1osSc-f#++_dawy78hxDOQJl)l+BWcvPYhEt~1E^mV&8Q>Drf zXa)7AYIcSUi5`Thj(a?f&qR~F3Clxf9j60^kHlSJIC{dd)=&F|x8 zn)a|rpl2{N+N-Amqs^PS+wGyD6CI)|(Po}yGc@A>TMpfyQor*PyY|f}Sfj@MvF-Xj zF-8T(mI{A^D;8)6_nQN7n+|LmGiqm9rQB|sU60FtA~8#*5?>G5&btM79tUW8#51M{ zu^9)^hh?+3O#@}2gQNjsaj{)9 z7f1~0H_Uk4(Xf>wxaJc`!g+r+XI#ydc$b<=a zG%gxzM>bG|#{Dp`EcPQ^JuEvEUB>rgv+G*o5gKZ%!P>#?rfQenp&7&As0wR37O&C$ z_Q3WSOzbww)h{(;7np9wrW?@In{jYMlj8>w0a=cNKe}PEr=G*s_9Jofhpu}bL{732dj~ca+E9{B(N2Ds)u=&Cv-!Tx9zg&xAU~r4m~$0 z1$#tq`oq{xgA;VW70Ps))j;Axyo`sjryB^%iN8qob&N%0+P0qyvnS}%ypU_#WpbpC z=S{F4H~oZW=nX#ud_hTr=CB!?W`JCxdqImuni2D6>F2hEhK><41q;pCaWf8m zy~UdYL*0hIvq~wwiO0D;vJKAezw#l*c2C&PU?#cx3X#1(pq16xU{oW#${e!Z8wdHqvg*l-a_Yp<1S? zNokpJ5VmJQbRX2fbjobub%on&WJ`;Io!S8~<*9SH?2xkdmvzz!WU=Yn%s+#w051UCkWg<7h&lO&iW5*sLGiAD`bVR_WLyl&~ zeDJT%4Vx^@j43VgnBFg4Kjd4VZ6}5f$1S`A+16*f35GgWRa^HN@4co7>^27ooN3AA zL&^4scj~ce$X6fTr|ynJ5onhCo94mPxr zF1eZ-JQtl-Gt4LL#80>y)nK3H(fh@!Jb+kF`>t&UVz+o)vKJV)t0}04ZlY*hes*Tq zqcM);aWpPvUZ`wvc}xiYp>b3^gp_)V+yLv=0eVbByX0Q_cEo?e;L*bBK}gAy-Tsaj z|FMRGgGd-20r%dUJGb8q(2J*uEd{XL{bb*^n|XVjX0}1%aaTP)g3u4>U~0E_2k*+< z@3v}o`^oMu{cxx&eFaLuRI;oNUXAL|?Hi&pAS1-d8~yrpOYnjspYc&2{$_BxFSx^J zy!@eWxtS@1CgxmJ`2HI)qIQL_1NAt0UGFR*?yzQ)L$EB(g!|gP+hd_wz#C4>riO(< zP%(qksi78+yW?(V3rl|%X1GnrMtU)P2hb2Pqai~|GX$?RFl-!gV&*$F;>s zT6@MYj$HQQzzIGsE!@sT21l!RiQ8y~19g8O526`kS&OXcc$DuZT9BIvZOzT*%((L* zav>Ydm~^5E#)JdRoM8~UJtq?l-GCPo8^|0m>IiKHO$gAbj|h~aBk2aAk+T^yZ}x{n z4~8*A>^$^3X!?E}x2b~Ozq7MJ1w*7s+b`?@H%#&_K@LM3=)Tjyo&`HJ!4YKdy8ejk zC%uPz>{O0x1*bsWk-#_8<^ep*h-+s%rFw1uKAjY=$F|+?TlTfvNpoDQx;~CQJ5|!5 zIj-C7SoLfnF=G?g5Qx>bhp9!_VY;f+KZK!&aT%(np)+77&2h!Ggn-I6qie=Xn0D$A zZ2${vI&G$df?aTnZD;nu84NyT>;fOialf!JIvJVJ3d()I43HQZu35whH1?`lrg}*A z(EdX~#e-<62X>TM1ae{>rX4i!oCk2G5@eydF!-J{q}oe z-)sA=@wIagQLkB8&|;q@Tivx~>7HF4*yyhb&izFF{I4%AUvJc_f3|r3tamr~cYl=I z-s{`-*E_V+d;eUt&ja^wyw!O3=;A|R=hQ!Z_=yj;=(1(gzpmJS?>@J^)z7&l)Zac} z$&vG(tQ$9H*S#9H;a1VXQRepCHU})sl)df{9&t;oqLP=*C(&B!$V_U*>|@&l^?WU zboRB*Z3UmzY>f+s9k_I2v%{{~;K+wAKX~IedpS2M*1x=C@s|bH&wgh7z!kSm+@jRE z>!@$==mwvC@xZY&Z!CFYkG1O7|J}Lwsekt9us?UK?%MLOxh>yYr_DtdI@e|+yZ+3k zO+WAQ=?^eh(i0W0S$oZL_gmzg6c)&i(j^Z(5IhuEV8+&aXQP8y%_t^MrNAu5-<0UksUh z*J-!j^}=D!T}{3C(Ta-Mb3Plt_VvT|xN!J_?VbC8`e9=(x^U7bH?-boTH$e5zy0F? z=XOHah3kL3>)6xpJ9Nh#USIHL^~@Cqz>iVyTkvY{-t{3+|?SeD@bnYwaCvS2_^~#@Te|mn)ejgRRI(LC{J0kvSw#NE%?s|CW zgB>0kd}9BX%4eQ^q;n&vANb3QdptY#vrit`YmcU#E~Pyn?fP$gbM7a5jeF#dCpWxu_Gi7u zPQ&%7_uskG{Pz!j=a3`&-MjVycfNVFb2n0tMlE=)Me+Q{@4U3^+N(eA4S%(g`r_@k zK7HQeuixLR>o0FMDcXLfbKj#MZ-8-30+ldq)P(BM6}64~_qBDCDkqM`Yt&ZMHSP)%M@*=w zMLGVDh5*k{F{TkuAVZo^InkWU|8j}CDbWdg!r>f_KwjH;-uts6I~0=-e=E+cc3^V+X*FTzf5awGn&_uG{d@$_RxOsK3n zwh>oBQKIXi3y-}||P9M*8j{kI+GsJdfoDjL4b>RKZHRy(DU zp@**9xEp&H@IO_Yx1iDEM~@!A+5q&wEy{{%qiPz{O~eghQbi-fmys0{{?7jX+cy|B zsSe%$YWm*)_CmEIsv1|daO$;<8o{6tG4!deu3CM+|KGju&h+t3iUcPqQ3A7M^}#wMg4zG zQK+-3m^h{3d;hmB7o*(94bSinHpU!XQ(3cmAM$tQICgSn;~!ya_0)YjHQEe(yQ!Eo z5eX?9DK=c74Za2nB5})&eiU3~LdAsYNsWvd^(Hn*t*af~xVM-vYFgv|A&O>VRU?ZI z|JEM5aW|e^S6TJHl=$cobrtd>jeCHq%8{1AteDiewyau+Z4pU98!2LrMxp(>hrhO=i+x^pslD)6-Dkc5T*_ByDLSJdlZBzNoY$%k^2mUX+daT ziXvBldA#kYZ6u1^ULZ_k;CG!wkvj^s1GSN&$ejV&k=i+;$lVUwiQ3(w$h`vEjoQCN zC<9PiYJZ3#w-x4>cc-?kD01CEdr<2oLK%SCQJX4?+!de>)aHvK_XwyXwI@W8`!}c) zwXZ~xYtaOAgw$G!B6k1?Q!prlgGDF<5T0rjHRMijX|px)FD5k+o1s1LPjQRFTJ^`$mP6uEmrh1BjBp)G*= zQ~OYa*3#5DOi|(8))qx>M^G`fT}6>A1eH+hFN$0>=um34qR3qgDyMdt2sQ~CL~V&E zavy;(^@jU?CW_qJXv~;igSM_Ha(jY?Q0pj)+#nF9xA426qR5>B!jv7fGeoEl&@gIu zh$8nEXgIa^M3Gws8cpplQRKG6oOlJbokWp43^az?5u(VQ1{zE4EK%eZfW}k1Qxv(E zKvmRU6QM1DCQ$oB6uB)?B@?N&5}_@CCR6Jrid+R~3bjg6WuS|x4Hm%{gD#=f z_b(CJIp+BvqqeRna{GcFr*@zya>GDRP#YzJe*rC_c9|%0i$PCOdt4MbTip9JwI4*0 z+ZHjxGt{;h!N-FBNzIn>8lj&7y+CcMC~|W_FH)N)LYoG?M9sEz7{Q)FuTWbPVS-WQ z_5l5hnr*^0ikuxC`Z~37BKR=S8`RDaMeZ&Trp{4*_leM_fZm~IEAovZ_XjABb!;n< zQRH?9y~p3}C5qe-(EHTvI8URU`Hb2+ zqR6!deMxNx5o{Oq6}7>l$l14vzovG&2)+}vlG>f3$o&)a9kmxks9(_c)P4{}ZkJ6R z*B%zQ-9?eJeRn_dcf&=In-2Pw+KHmbT@U(=+RdWKEdi~f_LL}cKZAa!X5SbwLVvj# z{)33F!0jr6-vF&at&b>jm7q1LO%Nf51Fc2Pz8_+Q_yrVEvy)(rB4^*sE}-^-C~_NY zjyRTDb5Z2>23b^F;Pw|qZXBouwJK5ME&**yZLSD0186g9_lqL;CTMeN?}*S*v_w2f zZEX>34YVz_y+o*UP-|*~MUk5XYD3M|%o;_`zOc3nwVOofD?qzadsT${Zh?4`+S;PX z?F4E|Z8uTm?2z(3sr3~_ZUSg8YR8BoHxtyJ+H6teo&?!gpujyXirkkV8x<6|Z$$8u z2+;SXwyh{~MWFqtm53sDG-!Wn6Gf4m4LXS0#iGdF4?39I!y>eEP#0<|M3GwygMhBo znu;RV9@LZC-lE7AgL+Xb6Gd(^s5iA^MUlG-)Q8%&BJ`J_L#VwZiri12B5J>h5VLNL zc#>KhQRF&<22krNg8hMPELGsDM2J;DWz;Sd!PkKXQoBzSx#gg8YHy0re{6%8klMN; z#0;RJ)Y^(7Hvn`vwNep$9q0&Z$BQC24>X+GH6qvnXau#VMUnd)G?LoaB8(wgVc8P3 zmLkN;pt02Yiy~J88b_^86uC=5mDH{fMQ#!3Xlf6MBKI+9BDH^uBDe0gScge%eNp7v zfoiCA5Fu6u9YbxX2=N+dGPP4gk-H5vh1y*r#0;RR)Ls`MRt8O@_LnGfty(*diwoR# zqR4dtoxtDq5Fus-ok*=x6uGlOGpL;>irjsmQ>i^5iro94)2Mwcid@q+&Ye!JKoq&Q zpfjlLDS{n<&Y@N+Lfj5Im)cn(j2A#Nsof!h9|E06?Nt%tCeQ`ceilV;v+bO_klL0a zv<1*b)VhiyHwttywXq`D0q8PnSBN6_1ZXa`Wg?7WL6=keN));Ew|DLeYRyEE>k67r zt)~cf54xJ#@uJAh2VFz$I#J}F1zk(+MN#Bdf^MYtohWh}?|?X#+Ge82^#HP#YscKLdJ# z+H4Vg9cT%)`$XvDK~GZqKm>okvvW(SH5I|eLC;XzQxv(Opnp<3N))*npl7L_D#G{( z^c=NYMUi_3^b)n_MUnd&^fI+?MeudIAflz#QiOa7$TD2WmxxdXpx3F55k>AC&>Pgw z7a?Z^dXw7SBKRE83Tm&5BKI5UU21=dBG-CX#J1FS5Jm0~(EHSiMaWTrKA=`BLhJ+j zgxXwDid;G9YidJ8kvk5wlG+Rr z+92o~YS)P(_cG{vYRg5D`vvp^wckbPf7>FqrPfA-HVFEOT0arW0Q4KRS`o%kpjFf^ z6GiSJ(C^e95uwimS+=skeJzUICc7iHUDLG9MUmSNv?jIABJ}&9wWw8zB6lumZECYb z$WegSrM5^Exz|AJQF}uKI{-!0{uE(Mw+Ehs+V&#Y0cay?#UjM~pk~xg6h-bDP;+WG zh|uqYHm3HpC~{wbHlwyugxI?s;$mveMUm?WYDsNh5yo4fEvOwSirnd-ZK$0s!ng<2 zirSr`$h{8QmfBk)^uM6i)cz77SG6Z{wA6MIVSEX)jBM2Tm{&54El$#6Fb;2aTatErP9qj;1zGg!l?Hp4u`I?hC4-wo(+iUH3tbmf9X7#FL<7 zsFjNFZlFojri(B)0kV0U0ykd-{{pI`_OuA`6=)i@??jPnwy$%?QfncK+`*vf)VhoC zzM$i%Rf{km0GdHWa zC}+@B)E0{(_aW$7YM+WQb~zCHxTqC~kjnsFPi;35#_^yVsFjJ(mw|4fcA_Y9H-K)X zc8e%-&x00Fds&2WJm@xRzljjrc1BE1ZCg>~dV%hyRw#!a>hd zyIq8_73c+OFN!eM0KG`<7ZJudT@X`K+fIaj74#alej>zIpykx6M2N3I|DrZag!l@y zg4!Yxa!a7MsI3rT4hZx%wY9p&gl7T0Lv1?|=72ySP%9Fle*=9;tx|;c0s4sAg(9>M z(8tskix6jn{!Q&85$5Q-IrllW4Mdm=1bsoRqX^?3(3jMX62TXPzM(c<1m6Vu54D>_ zs1MM$)Ls-t?mN(T)P547eRM}mO>J8da*Uv#sr40MUI_FHwHi_6E(iTe?J5!S%Ah}} zJtd0VC!jy6eJ+A8?t#6h)HV~rCxYBsX7^o0@J*n#sf`z5j00*yZLSFOB%pPuJuX69 z05zqyQiO3{Ph6i`OA-1W(E8N6i(r4C4X9O#kjnsVNbL#{a$2B`sXZjZ`+_#1_PGf2 zV7-v1rna#N>oP#L=NRiUM2M+DTTnYvgqRw%CAG6f7+-?6qIS0k`5e&J)Ls=~&IZ() z+M2y%irn^~Hq>?&AmCNrXD@iySw# zmZHcV1hTUT3S2i4+Bs-HYLz0ib5Lh$7m82@po6F_6k%KoI+)sW5$16~U8wyairnUf zh^eViZHesfE+iqR-(xD z1D!x^fGBdufKH?~SroYoK&McM70 zVcrk)5Vd1P$a#PsrgpsuaXaWA)SeL`{{mV}?OPGzl7Wb+scj}g9vJilwSz_QO`s*z zCWu2sv(QZA6jl4tj%HZxLcq(3{kz zi;!ypy+iF95&A~ZyVRD8F#iF1kJ>5`V$s3KaZ}q?gs~dvV`_yWjMYG&P@5#enhwyX z)NT~P|A9WE_L>N`2KtiPuOj&3!;s^qwv7m75Bi!~cM)Pj&`N4mBCK%$eMjv|5%O!G z@2Nc}f~|pmp!Tf@wl)MgZfcu}5SM^{rPfV^`+|O>RwY7S0JMtQ1tRzy(C^e1i7-9~ zxwWl+KNVp-I21W~DLX;naGG5J!NHpjIP7 zdjlOwZH@?Id(ctTo)TfLDQG0M??v!yqmbjKwwVZPAVH(49VkLO2USoTCBj@PsFK?G zB9uMoXle^Zm_GuIr}mZzb`Pqewn~JxGoukxQ)?^2S|-pj)JjAs1JERDH6p}ypjv9P zM6f^5RB8{3F#ZKiqxPN%Wl(_}H?_?~CYdKqpaq zNQC=>PNw#r2zEaPF*UVFgmrVEGpOw^g5878q&7?hy9b>`?Hm!_7c`UFgCf{H=sapG zM94FM&ZoBK*qD%K0L`Mdvj}Amx`Jut z;up}})Vhmc9JH?_?~$RmN?rq)G-^%0==snv?m zuYx|Hc7+J*azP(bdqRYm2J{iN4@41?7Ko{-tt~_VaZ}q@1V0Xns0|Y#UkoascD4v}@1XUm-6e|L3eX1B z-W8#oYY|gZTSpYR-9Q^tYbQdU8ng+uBSq-9K(_C!z|9t+enGYat-#$cLVgmo1+@=F zk!w7s zO|7*Exk%8?)QUxj%|N?QJ5hxB574gEt`Z^F0@{PxG7)?js2#PBMHmZBL5`c+`Xa3J z0PRJsvj}tGpib1PMaXl3_NF#Zg!xd=KGa?oVXO<hV+7gG!2)-y2;UjIBUJsZA5Xc0slWv%p;~!dfBFFltLg z$RB`)Q~Oqgy&1`enrr*^pr?*=-K+AQ4CJ_}tt&!Zg3h6~s|bAx=v->UMaZ*)W>Gs! zgmMPWrgozU?GkhWwUH%ak>jSetq9{3(1X-^iEv-gL)1^fa|)BFw#m zo}sojSel?XW~&e?;he&P0xz zT00T!3iJ`RauL>$fHv~`cTlW)VhhVW*f8{wQ(ZMV}sgK zJ6D9UIA~953q@Ej588{`8zQW)J0E#!Y6T+LIB0Kb2Z&&6pna$vDZ<`d(7x187h#+N zI*{7^BG?+JGqra`n6m~QMC~sT+W9QxnyIxDp`1b8sf`q2JP7JR?KBZ$YEU0)w~Ekr zgZff?Nre6qR7h==2xFJo$Td@IEkgeR8bGa=2=NQ3nA*`Ij3Gc})aHp`YoLMD9v9&( z3s5<=&qRnBE;pg$U~fK*OkAB0_ru4X3t9ggOU}p!S9c z@ja-5n!7M2^ktwi)V330t`ansT5l2NYe9CtNP(Lu!dw=}zPC}}E)Zdy44OdgE)nv7 zpkt{0ON3YoG>O_zB0S4Qh;6BDC&IIUrc&!I!a85jG-_i+7(0WGr8ZlHeN>$KQ#)CNz7}*gwQEGkKZDMp z_K*m98qm4a-V?zeT!Q$N+Ge82bp_3))>8z30J?zMI1%~)&?VGP5h1Pv&7n45gg6^? zDYYj>Si29pg4)+2>|>dOoG-QJB8;&?^Qd(eVg3zt4YeU6tSbOrOYK+@$^~>CwQEF( zeLy!+TPDKVbI{Gyz7WA*U5cD9wE_|RGw60|dx|g?2i-w!pa}5+=uT==MOc>xvU6|> z+=U|K>OuEWdr*YF0<@6Y`y#B#0zF9WcM)RX%MfEy+g^k=4SJYbcM;k&=uv7FB8&q- zk5QW`!rBkePeSh%lD`dXw5D z5qvD@9cuGL7?XhBrS^;nIepN3)V>#C{p1yh6R9;5VIBwcF}3|guouuL)CP*MUJvv+ zwHYGh9YJ4ETOdLX1@tAgS43z>pl_&sEyDhVE0KGpwz&vvS3%!W+eZZ30R2d&Xrt)ljU2yJE_GOpALM95!({-CzA2xqu})@W*N;ZPCQs)5#| zHd%zV8lbhPT`59+fSOW!MudDFXkBU_iy{|Yh4l>7HWVS=0Bu0+01^BeXhUk_MCkWH z8&Nw=6uCP=n^3z~gnl2?g4#den9iVGjprCu(IPv<1-4)Fz2AuLf#M z?K%*Q2=P5=e`;@w(63&LSdZFzBJ7(09Zc;Y5ppA-F4V?~5MzRRP&-|OJPoKPwHrlP z9|r10ZK()(IFOx5R^WaUAvbaza-h_<79q9(9YU?Q2;&M+F}3L;+!s_r?M4y&ALvkO zZ;4=QpmJ)fL|8L%J=PUa+e?Hssi48sMvIU?1szW991+G4pd+X~CPLc+9ZBtD5ps+- zAl9R{r3iCbppn$Nh~U>iqo~ag!MB6PQd=m(yMe}0drO4z5vY>dS~tdo_6wRo?En$t zcF;s>BSn~t2HAOV1@1Bt)*gXssXZ)0Ukj?E_Pz+d^CsjmsckMoy@8IU)?0*mI?!}# zwIbvmK*v#=D?*+hG=tj9BGen`Bx@gl5^2R%XUCK1kh0WG2SZxMX^9frrbVLQDgCjoLmU%&&r$QyV5i&It4- zwX;PS!-7^&TO`6<2k0$o?}(5iy9==%wWcDhQ3AbBt*r?CD(C}hWg_HbL7z~YB0@|9 z`jpz0BFrCwKBKlogxn42OKM+ZK1UsLNULYxiymRh9{s8=zmQbr7LVgZ`j4NQCh!=uc`VixAs_{-U-( zgjfo+*1F~+UJ@ZU46<`L3)~MPl)=5o2~ukz!Wa>>9<|OQ^m(9&+Gr7SrJw?8=ZSFE z0cay?cZx9o0cu8Vxd`WDf|^tNLxgqL_aWA!)<%Rq2%ycV^$=lB7_>RHY7y!Kv=z0> zL}=%rt*JdN!h95H8)~16u=imhVm)dbi%G6jPi>?Kz7DiAwHYG#c94A| zx4>O5!rF7tuGC%?A;tvlLG5P|&Z%64xpHb-h>+6)*;%Otu9paH0c5A97Pu)Q_#BXZ zm$bm$Btnb{+MC)dBHS0WKeeAl*yn#g)}K<_Nrbs4(1FwnMd+tNU8vQH@V=m~)UFp{ z?G~sTwHHM2v7lbmeixyiegNxFsqG>{J_6K-+7J=ufIx>(J3)lpA*hJjts;~&s6Vw= zMOecEI+WU)55|O?C8(5II}v;xsEpb$5yo$z!PI7nFdqOqjM@XD$bA4BLhTa~azPIv z)}ywW2ss7NQPjGNFy8|jM(r38>=`tQ+GQfF4+D*+wpfJwf-0zeB0`_?Fd{r^%|(dY zK}SG8c%Js2r&bwn%X%cj8{Q5)b0@>9s(Uh?F|uPhJPT|qqepPYXU)2sO=^~ z%mA87ZLkP_4Rjo}lSP>S03A>5ZV|>QpcAOQEkd8N7_lC;rXsAX2idv71+Kja`9IL9 z)Q%Lvhk?$dcAg0J3p$J110syiL1$C@K!kFB1hF2q<|6nF(D~Fli!eR{&7w9|gxo9W zB5D_iu&y3-F|~h)u#W(A3AIl}*r)U;Vm)dbi4Ze@E~mD?2=@hDL2axE_XW+Tc7X^n zA?Rvq4~yU@LDx|GT!g;jF~oY*T8I!cfNrF=j|lAubQ85<`qQ(Gd!+5pgUYTt@5 zHhmIv$JDkIVSOj)b!sId7DiLCVrC5(i zt&Irv3;Kv!e-Uy^pwFnCCPKde`Zu*(MOfPi`kdMd5%O!x5bIGZ5Mh4`$iB&4;Pw__ zo*48Ewc#SpNR>v1*kc-okYkXgEpo%K!o{F&?eN*6`?Lcn^U`0 zgmDF^CAD`%$QS<;IYDa8MDR_ZZK&-d!dxJz6}6*9=;J}#Qkx}0eiF1jwR=UlFK7p9 z?}(5CcosQ9YLN)zbI`8T_7Gve3urfLhlvn7g4$A>A;P*`(4N$85g~>H?M3Ys5prap z_SAk8A(na$u^zQuL>RAv_MuiP!dgzyzSK?>VZH)%Ahp{>h}%J(sVx^_9S`UrYQKuG zj^}yAdepWRp?*Q#sSOap7lV3GnO~5!T;>%BWo=LO%!^NbO+}a%rG)YHx`UZ@h?Dk6Kd^+7@Ui zwS7exzkv>?Hb{gs-9f{sog_jTfQD1MR)jrHpb^ymDZ=;-R6*?r5$0T9!u&6_?L_d; zpt00SL|8Kh8c*#w5pvR?Dr(n>;3q*7sI3rTP4vr%^{A~QLc9T*L~VZ&`h8F>wP7N} zlc1^8&Jkgr4m6G0gCdO2LB~@2N`$`W6~ubfwiF?E2s)8kZ_)o_@6O+?o*#ezuf0iW zpp=AAGNehRNCU}KGE}BgC=Dvj8A6Ce88h`xrpzHEQ!-_aLPR1`5|IcYGMxLm_xPUc zI@k666ZZMxbKTDUbI!H(+H1XD&uOjA_!(Vd8yT_ggT~wLj5wEuF1Ia+I6s6Y*w#lp z;}XZ%2>Wnnui1(Brm#5zh+rr0wd6 zJ$m$%ZEnO~GCiCye!Ml_TyOXs)eY#IpiDZyOvjmO?MvrbXd^=x}YtaG6^ZO2DE_t9In%OloL(E{77h;tcep>0XTz3Efd1a0Lb)|Su* zw&oFM!O(}c(;|K@T5P*K;^(4IY_lSME?R0^5^**KeQGOwwpq-<&=ME}@+i#U(;1!KL6#qr;+5&MIv)OJ|J`xk9t8y2z0g38-&jhGvt3bxlG-bZL_ z+xHQ3lI4u>Y}F#pPNQvXZ6elB(YCfh5o0b?-FAJ%8ZxS3dnV%h!_fA&RT1ysFB$9E zDo2dU4*3fRYi4l9ksE+N?h}Sr(Yg-brZie=>{SmPrzk>Z= z+ujlT@n~;b*NCwXYG@l1@jFM2YbYY07VJ1Ao95Y4h(8nGsgp0Lf1SSv+O+rEj|+gZo{ zuWh@CHF)%_twY2)8T7pEiiqbCdcpQg#5yo~(Y7+;Y|4*}^=!2x=KJVXTla{2F?!8* zQN$VGib;x&#I+a8ZN zzkxoot%x}HwVpLW+cptnbo8mMX~Z}deP%m8;tUX4W}6T($3|b;o{zZSqZPJw5zn`u zSrfGF6>+~ut8E=4-oNM@+hq}-9YNpP?vEIwqqVlTBi32b54Im8){%Z;P0&^~;`M@l zwsnX&YlVKX4TyN%qhD>eMy%@JRD7<^iCC{gTiU*i*o)r4nxJj#h;cjG+SV*$?*vt}of`3TQ6<}i zi1`BA);23*uLxDOEsYpE{>GZ1ty;u+B(%M)b;Nh1pqjS65$ls^2ir9f<0iDT?ahew zdsN%@Q^cO!@2m;hYDVn&qq?^C5zij9yKP{^nh~mJyD4JL7wv6(IpRKq>f64Fcpv@2 znxJi)hUsl)Y{e}VxJDRv7H<-Zbt{(u8(+bq4u_yBCY{C#P&_Z-1JYzdbaWr_Y!o3t!c#g z3LR*(lG+a(dt095>o zrF>s*#61Fyx4juLuSHkdzK>W}{+In<+s+aHEohRhZN%p#(Y3a-BJNG-I@>i7dkN@z z+mjJ{Hs~hXR}p&&|FQpTs~B-M3f*FB7%|pEx7v=5*!M%zY(pcSN9Z=&tr2Tv=q}sb zi2E~|Zd)3$K8fzO{Ts2DUnnWuZ)*@SH$V^AIz?O;^q}pmi0gtLv0W3f)`Di*9*($& zp+{}=Bj!iw3EQTKwc(PI!fe}45%+QQq^*6#bwSVChDLlY0nM@95ph-*J!hL2@t#31 z+LlL*!_Z5%|03otr6q-zZTm*-f1uZF$3}dQA$r|5Bw{}vyY z_IboS3N5geZn0U6(b4<1#u3jHw8+*o;+cXzu#Jlti=vNh_eI>p&=T8%h=5%+QQxvgu&eFJ@A8x!#vC$!RbSHyli`pWih#Qro|W&1hed0wuh@U5+8 z#Ca*S#&&qbwMXCChD5Agqjk0$Bi63bkGAI`)}YW&wp9^($6J*YezjGK*gHlWY%L@9 zj?r(n-Vx&_^rvk?#JCClWt$c8y*Ox-?URV}z~xH{|Jlk#taqZ~AHA={N&n4a%^a23 z`bDgnqjI*ZBleTgR<@@iUiYZHZF$7tvO-Crl5NX~&-$Xuwnh=JHB`mcGvaxPs@X1! zn17({Y>!9mH=^pck0aK;&I3tI4wLKUy zw@16#K8m>ip?bD|Bksi&OA33~8b-|R(Vn)GBIbE$AKOI{XI)SO+l+{H3sn3o*p--_ zZ5I0mXkXi(5%-r$C55K8eIve83^lX$i8#xITH3CSxUZr8ZSx}5(a{06ZzIOzl}ie3 zY}F#3d8n&qW<<^CF)6=uq3*i1oE9C50nxdq&(hP)A$W zh;=U1$u>6P+$%c9_DID1935+08S!4-rlfG3ty09Z0v&H_AMxBmC)m!4IOl;*v`vZl z%nIsZdn4i*g-)?;ig=xFTT?Iz|0$A4S{` zs+JT6*vdtW<(536fU;ah*;M{m)H)8_^v-R z-Zmm)jE*k1-5YUD(FEH^5$mF8l5Jze8c+3-!d14~5o;~zYFoF6&mf@dZD&WU1Ea~d z2O^%U=my(@h`nfZi*0?x{z8qC!W7%y5$nL{f3_|W^CNVdZFIzQ72R&TD`LGJ-C=tz zV*Lf(ZCe*{KiIycaF4B8#GVqm*LGOM-VS=uHYnn`ie}hujF=;$hiorJJXg`9wp9_Y z=b9yj$86;yo^R-J+W`@u_d})o6z`pK=W*~BGz8fE4HsA=6*Yt6kfGeiCFhRui2VKJZI4BwmuPa zPV|OtV#N6&^rmfQ#Ca+7mhFp(F)NyHE8S_c*t0)0#CB!Gbw*2VGb8R{=u_KA5&P5VGuuBA z_mW*0quch5xM!o!Z5<=-+2{+~@Q5{OwA}Vy#CJfTFKxd^oCVvpq_D!aTf}!9p_R6y zBIW_;E8Cceb5LlN?VgDD4Eox(DB_x;)wWF$>lV9}6uz-FiMXcdTifXoV_>w#c6G#i z27PCn6|w(|zPBxjcrKu|wv7?{p>;|MKiKL-d}al$vmF}odPYCm21M*Rpr344MC@yz z^|sj&<8kz}ZF$7!Ingh+E$VI-<5TpjtzpFY6m77b6mjj*Z?-WJ_eu1-?e2)rGoe3h zuSD!ep^dihBIaPbGoP{5j5sfa{<0k$F$Y7NY(pZRQRr{mT@l~&g#NL;6>)z?|Jv3^ zjIZi37qZohSQ|lwD#ho*(Gl|iRARdzVjh4>Z4XAwx6l^0Pa@{~XiM9F5p(Q4m`B+f zM_gyLmF=X6GtsEL?YxNnH&nqkJz~uRZEc$$vGR=dmYqFx##XXU|b(+mR7_ zv#5&g+=%xU+QxQI#Cr>EYg-gC|3Fo3e@1+UcQ58|wjCnI&uBYa`-t;WsJd-%#P1i? zu-z5$??v0&=0}Y6P)*y<5wEMgnfuvlMvV1PE!!ax<94*8?W~9~2-?YZW5ilL+S&GU z#Ah;5ZQGiNwc+~A8*N)f+_TZHwx$ttPPCh?bHsZK)v=9<7?vG&@Cd9tly#JCe3U^^gU{|&XWoe}X& zK?mBdj<}Db*0$LZXKPU#+h-AbF^!pH+bTzlhfq7){t@5ViVm{%iWrBXgKZNd_We+M z+nk6wF*?MyGU7Gfg!#E`tBCs=I@H!UVmyQnv-ODh{&sY@ZG6OCg-txCi`Hag$dJYu~GU0^#c z;(moLv`vh79-*vF>B55HaRQm)M#_+^^6$TaSqO8@kjsF5>=- zF0;*!cn+fRwof9S3kR}hWUCnQ97GdrEhF|N(G|8+BhKBRD{YrYtb3!0w#OsZLC_@I zs)+k@Yu1}=TSfeP(bcvl5px`LjqUV^*BZLkHX-8YqU&srN6c~1^|mDu>)vRx?cazq zfo)i;vek{am!KPM-6HNK=qB6w5#vsDv+bUUXEM6Q_FBZ+Fq&dp8}Y1Y%Q}~B`-s;# znriD9F&03#+J;A*4M5XuH%E*+(QUT*5%UUkyKQ~Mx=%aS$ZRzt#=GcFTlCk<)h7o72(EYaKBjz~h0ow%; z>yGF_+XE5vcr?TIUc_1fddT)q#2VDWC54A=dq#Zz5pzBA%h> zY1`t6Yk;1y{S#Fz)H#IpKieJ=>-T7m?bwKQIP{!tY{XtFnrpi+D*jDs*8gnpN1W$J zFW7#IxVLv;{m)iAVvK}dvbBpCBcYdV{Ui3-(LCEV5zkfhitV|GF(G=@wlZSOe<5v>2&>PDQcK%dw;MT}3;Qrpmo{WtWf z?Usn&Ir_}@T*UhgEwe3;_?;ig`k$>*#P1w^VQU`oenZP`JtD3F`qFl3#61VCussm5 zmycH3-i=t_KwsH@iHd)xn)N?ht%&m2dkM?cucM*Li~&h~i3dmsI1dp}~W1^s0E zGvZ!%6zhMseIv%U=x1Bkh|ln%Uu+jgTzmAZ?SY7Ek2cuejX1x7ezW}%v2NR$^*`Hg z5$7n-AGX6I-h*hPZCJ$X5B+JoCE^?&`pfog#Jn4AvaOCdS8z1zf3__n&K014Y>gsb zf9PLZkBI$C^q*}~#Q7#v*rvGtH#g#5he~WKBgT`*u>NPO5V6LCwy-sg*k?jp+D?gB zmq+DnS4QmDqOEL?MU1addE1hR@$<2)|JkZU?AM~LZ7m|^`>3L=SH$=kRkBTt*bhLJ zZ8IZ&E~;W%60z@swy~8Sw^__X(YCg>5ziD<)z&}a%qOa5yFTI`i?*}96tO;zs@pb3 z{4Tq&{%30xu~v${#NG~SWIHNiOo$rWhDZEd)WkL=;x&Z!wY?NEE=EmlUq-Bv zoyhv1t#ZU#6>4s495F6N``M0<`0hp2!gfx?e+z19n-cNgg7&w)6!G~0bb#&0h;xT0 zvHoYtkWH7)o%KIk^@y=3I^5PS;@^vou$>uI zEZl^SwEZvQwT3#{-i%oLN1bdxN6h_tu>NP;K4MIWI@=D8`2C`zZRbSnv7lpY(6KwM%el9xE zwk~4M*^~7@TaAd{FFM)QI^w;By4!|F>~)|Xwi_d!gXk37+=$l|>SwmU#5%*_whHbBixfSYbJ2qlY zhx*yZMf`qIf7|qkbzn5W_DaNaADwAi8SxxM18t?JZ5Hc^XppTz#624gwjC3(MvKm} zogJ~xfQHy^jyOYwhT5Kt`2GVl%(g75SojAGx0Rf}Sv)V%2wS6w^+Yt%);(hEjYion zjaX|zqiy#@>@%UWZHpr2ALtz0UlHebd$ay$+c{$Vht9Jd9`X7^V{F4CKFf&Cw@r?C zcB2byk422V(S^28BmP^^SleF_|1Eu3|Fi8J@qHucV%vccXH(E6wmuPiUTB={s)(^D zy43b;#D5FA%=T%-I0B8gZHkzeox%E_t!~6K4^6Ng74aP;=nC7&h;?*yrR}bW*D0E4 zdnIB{j3(K>joAC_%le*QcR|x_uSTqGqPuNtBYwYUvi@hQ8S#8W_u3AQ7{j6aZ2cpCF1p`# zW5oR)Jz$#~F_uCP+P;kVJnTT$|7_bu%(2l!w)PQgo9JQN;D~)N^oZ?_h_zfa)Am}# zxEMWZ`y*maYY^*yw%QRt13hjV9I>8*X4$4i?6sjMY;Q+=whzs={S@&G9nAWltwzLW zDA7~4HW5D;J#8BtaZS-Pwi_dUm*`pBs}avoG{?3kVvKYa>wmWD5oJ*&$eU4_amWswj(0u?C2HSu!zqFp;v9U zMy%JN*K99GjLp#Nwx1(jyF*$3v(=0^mx1229TM^HMQ_=LN30c~`LwmTi5qmM{LtB%GH43!Y)+1v4f6V`q=hx#Jm`?KC=yt7$2ZzwtFI8Yv^;^TM_Rq^o8xGh_$(qtpC|+Mckj!m$r5h z_er$E)-U3jj8@vNirDuXQNpEv+W)+w@2UDj*FNZ zpl@yGL_Cwx8rxkF*8qKIdn;m$j=s08i+EOyX8q5$Q^d0Z{b1`5v8I65*~UctT=b*u zu83z8`pGsw;#?nEZ`|ECWY&%4pD?tC+4vV;tqyKD!BkrfDux)YuZ%V{x3s8yejfkI%N^NT+=A7rT{%6}h z;w&fH(spRX`ZFqL8x%1HMqAk?M?8~JdE4BG`x>fXTNClz8pHaZtwzM06IHaejd*XN zO16FxKNnTDO^z7vqAIp$Bjz7y8{4vo&;Fm!`k!sbB=1#;Y2UZR?|P7z~jw1aJA#On&xvfUc-{6IU}UW_;c zgm$uh7jb^$Le~FmRU`hrsJ88Zi0h1YvGt4i_o7{GlOx8|XgAwS5uYbUb!^{9toe>* z{m)h64*PosLaZV}H9w1;h6#M}z)X?rZth4>=tYHnK^*`IT5w9!M!qzEb4uM+Q&Wd%#5F*N*g8eLw@?S$$cQ~_bg1pVh|kKP!)yy8&i$jqZNEpn zr!Qmu&$e^KJq#UbYa1~(Lmh2>BCY}IWVwmV|5px`LtgU^->mD6v>l?Ahg1XoyM!erpSKDI|>+-0Z?X!q=uFF~fvz3eZ`@iS} z+kO$>r+~WKPL5d5K|O4jMx0SXr`TpkoKZrj**=N*xf582vz3eZd+MmSZJ&rWE!59; zOvLK|^|y_Tc!r_@wkZ+!STxx7V#IqNon>1c@l3gb^)TDk5o2^T!nS|JGX;&b^^AD$ zqfxdA5!V2nYnvUhet^!ieG_rdxsr7$Tlt8yGia=>VZ9)Tj&f8wanul%Ih_Mv9$98DMz5#l`c4owRYV@G(>WKFsnqhk^;+}|R+7?F4SJ9)k zpCjfjSF`qDs}*rw&}>`Vh%D`JfTJ!gA6VvLFA+SW#l zL9SsQZ>t)y|BGI>wTSpT>1dwq#E3Iq=ylr#5qp*B4cqMzYmDek+ba=kU+5j%FA?+j zYne~mYDSEQ&_de*5#u4W$ks37vrFg$+Z7S(-snTylM&x7f|l5pMvP0)C$_?Mn^mz; z2Q9Vj5wZS^KDQkn@p?gD*v^btcSOr=*F?N_(O0(F5o08@%C;h64IX`ME4hBNxObv8 zwtXVbV4&}8T_ZkkioUm96!F?XKick!nD?NcY;Q)4i_v=9w-M_|lbNg8sz-d@6#Zsv z6>%m3{cbxY;`f36vRx4|$3~lMvm(v_p}%d*BhJ5|Le=7&>A#5g?+whEY`aGMK2WLc z@QB|B+RAoj#NSg#!9GNl<0mvWUIj8=1SYiv8I4_vK<$3?gs5@yEtMU3GHT^6LGE& z)v^5+@m#o>vAk`Ui01;@)7BwkUW@j!4UTvwqXxDq5oanooq)&tdXIkY(pb{ zE;`nBW5n+l9cP;pac@UmY-=Od)~7Povuzjg`$Z?(Iz;?jbdqgo#NIJF#dc@Jco+4w zy&G|64E3`88L^joD`P#|UJ++(P#@b#5ob=&8Mg5e-+hb**dC2oi$rJI7Dw!jp@Ftd z5uYcX##qm`cf=kp8frT>;&YH_nC-lXJzO-(Ha+4#iALMrjF{t~vuzt9#yPh!*0b#p zG2cSx+uB9Ep3w!i{t=(4K^NPmMtt@GU1FOTF}6kHY^x)Fzqd2ivuzjgSpYP_)-qyj zi>|QsjF?xTt85b^{=OBu+V(`mJrP}FTNW|4y@Royt$f7#0lLA~C}PZjZnT{kalb-S zY!^qY38Mem?vD7I@@T5<^@zDHy4|)eV*GL^dt)CdUnCqgqZ0#eSmuSANU&I;@T4=i=;(3YQwLKMarUSia z`yyi8gg&&D+_PD%%cI4%-6KAajXts+9r4{PXsK;P#FznnYP&9CzJ)%sy%ce#11-0$ zjQGsJz3fBSwu(5*iB{N}M$Gro*S5Y9<0iD)c16Uw7W9qnk%)OW`rh_Q#JmTswfz-w zFTRic0NY*>?*+8pc6`M968&tuIAUK2{bGAK;^(5@ZJ$K^d+%pm-nLc5`Wo73YY_1a zK!4j#ikRo2e{7Q?o^R-1+nk88GAgZB922gHSm%0x^>N#_5p#RArEUL+^>I|eHYj5J zg0{9ziMa2gine(X?{l<`ZB4}b>4U6O+p0vo&rwxdi-`L!s$uIHv8I5ww@rxnZb($q zc7McLAKJWKq?QHuwVw^aG^dP|w&-x%o)PDz&=I!o5%+s^lx=Lp7zA~;O^+D+prdVzBi?T_8SB}$iZ~;Oy4ntk z_*@L?W;-q7{(?@jT@i6+8=Y*M88O~K-EFHQuJfae^=y?R*0j*6wuTY+7j&BK_=vF{ zI>R&lbi0`37gKb?R?rUh6?c#_vEi~LV zBjWdqM%X@%_^v;6w(akzVxi9CoK>^!5i!O@=h}{q*mFe}*v3TcccTk!_e6XT0UB$2 zCt?j5jkEm`@p*_@oEfw27P0q^) zBSX_{Z6od_=uX?alQn-W7`<9Cio0vJzLF){}%MV?ZAk8J6dGxA2FUpAK7k**tac5}p90a|H$He$~ZePvq} zai(YvV?A57i19P}*494a=b|;X0TF8>=m*>N5&I-)o$bYldpr8kwmRbb;GbixXWJ%X z4vT)ZwTsvzKpSksBKD%uM%(0w@BBu8+MbEHx1+yoUq;N|<}%i^RgD-kp#N+gBIfL< zuw8NdcV5K#KeVOoj)=J$Drb8m;*2%g%2xXPX7PCqRMFNr;_ND_WIH3`d5J39u83GW zL{)8%N9;qOYPKa2_mUS_6SS3&SUW^DZA~KH(`W}%GRBpl$DnJqI+{c1py32%Tk{95K#8Lu@ZcTxT@GwmM=S^*Z~%wi*%V6woMJr--#u zbgpe^#P?~T^KADX5OMzH4fcO+^&-Y~=wjOu5$_pvnQd&ua}|xZ z&5ZcD=yKcQh|iV3$ym=;G2-)iXp*gY#QhIlWjiC{8H%p6-4Jn2(e<{MBYtmavhAOU z*UMY13EK9ESQA9I*iMYtw?b2F7e$ zyHC)aw#y^#r|2%*GZFhy=w93Mh-cK>j1z5DBgP=;e%pZ&^DXp%?X-yV#pq$%EfLQs z^oZ?^h%rB!Y5ODMeCIpt9ou$_7z>~$Z0#dH3x#IeMn#PI(UZ1m5x+O|lxi)cdfqlHVm%wZY?~T!?hwth&5aoIqgQNSM|_TSA!AJ2 zmJ!cO^ro#z#5pbWmaRv`cfFwbw(}$QqS4#7+avbq(Yv;V5ziF#o~`8F&0;+py>Dw2 zv37_S*^Z7ltAReSofENsiaxg89dT|6EwL?#_^uc9iEVwvYwbPOB5hS8)^pJ3wl)#Z z8T5s1K*U-GT5h{CVvdczv^^1VrW~!XeI9XU=Y7^9ZRH~7A8560uZa6S`o`8ZV*Y`? zwOt&sc8J#69*(#M=m*<^h-v8MzNx$F$Xn__?UO?eK`XE~;P~9PzznXlvU|5p!%*(e_fr{yy5q_HD#m zV=?QPwrUaku&Ao-fQa`Ss%GmEv7Uprw~deZouitzha<+tXb0Ppi1i#)%U1Ykvv{AQ z+O{SU=hDzFwv!{qr)XE(Wf4CY?Phy8Vr+rx+1`)1$D%!Ke?;t8e9V5gZO4euj-b74 zheW*JPy^e5i18I_XqyyqCKWZZJr^-XM~!V?Ma)T1Gh6AB&0F%hpn)XH{S#Qh!}XnQ$g+>Tn?Rz>VveZsidwq3+r7aeSC88Kf#?QPv7-uvhf z+r<(4R;YvR(TLv%I>PpT#C#teY1!9G-_S_g7ZJ}|G|E=;`DU@chDO^O zM10=}I?vWC;7BkpxyFs8Oui`cV4m)KfF{9H87)+^$k zgD$mQ7IB@?1luDKpKV50*cL@RXV8_l4H0X(%NdW`c8gf^K-bthM9g8)wYGr~b69kp z?dFKjJfiDuuSMMN(M`5*BgPhAvi54L8gbu6x7eCQ+;`Cw+sP5v9!;}d95JUux7qHC zSYt%D+un{CW1>53Ya)IhD>#p7s}}KoL-*KPN1Rbd_u6_#{I{U{Y!^qI&qnv#9*X#G zIrNb2y@)de=waKsh;wc$8IRklN31oYnYOkO=P}Wvwo@ZMONO4XT@~?~M6+!VM_d>5 zr0wm9GqdO^+pkga?^(0IZ>tk=P8vODJ0{|@RcNm5!ie=S^t|nki199Z!L~5s8lV?# z>mugAs~C^lYDD}#(5trA5$_N5nypvFa}d35n-sC0gWj;siMaovw{2fVye7Y9&DT~n zV($(uu(gVK9iWA_-Vyg*^sepdh;x?c1KaF~`#t*5wk%@3eKltTY+FU#|IkOah7sdk z^s%jL#2PpH)HW{S^@l#QJrr?2K+9~4BJR8Bb6e>*o5frlePL@Jv3HDC+ImLJVbNE% z%On21Xq9bt#M(Og+O{-e4d7eG^0tZ*b6E79?ZAk=a`e4zP{ch4t+m}8u~&|Mu+58D zM@Q>y-$blmt>IjOtxCjRCHlp7P{dgX^sB9J#JU;UV7oqI{T}^hdpcr02mNVV9q~N> zj}RsH8@5d_OZ{tp%0Z7Ds$u5^Z7I;``0w z`G&T%HHcWFK;>*FM0{=$ZEYJJF^@+TZPOy|_o$NXwTLxKRN3}j#5v2goL#kT9r0R2 z)ojfp?)PXr+sP4YGN`)kqKNNvLp5v+47S=4-(QDz zwsnq}TcO&vkr88Cw2SSwh;>_3*YO%14ZSP-|O@i1z|&W9uGq#viq{T@dj)K<#V~ zL_BBEA-07P=aEnc+g}l5pY@!Xwe1$MriBi(wT~Fzqr+_jBEGK*b+TO>G44c1*&dI0 zU!u;o#Swe?=xE#D5o?D(Gl#J49&yGRb+sKAG2cSnY-1umpNEdO-5N2+K_}SWk9aSj z6KxwJKAZLnYwNb1Bj%jw6x$&Y_e9jw);HozIqGG*CgNN@I@LBSVtozuv3(tJKlqh7 zgl+4HaSrNhYa8)%Q9oPXhWZ@WHXF98j*Jr*(7K!a@`MyxGuU=Cp`7jaGo4YBPR zaX&yqZJi_5Hql7isEBb68fCj9;_sTH(Y6;N=DO%?+p37?(QlmJuvLk;C!+Ih%_F{J z6*{ zwsRuZHqivz?GfkT(IngR5qqxaD%+P4W3E3q=WDAPG3G+o*jh#0574!??h*Tv=my)R z5%&XhqwRr+Yk+RDy%+Jl6&sm<*eXPvi$u5Bnnvsqpj&MxMm&?zG~2j{pNnp@JrMD8 z(e1YPB0g(`?y&t5aaQe5<{!4Y5&JIa9@`O7@$Y;y|FDgYcpjnqY_~;>htU1Dc@fth zJ!JbbVtjxewr%m(X7OG?kJ$E%crT!tw$2gzYUokhxe=f5K~LE3iZ~;TX4~dR?46(| zZ9hkxt=Po;!&Wn5ofSQ8J2K+)5a>DEkciJEpt-giBgXvbdE1>EL+BM-+lVngdezoD;`}6f%{C!ozJ*@5Jsk13&(IsT4QyC`CvAH8e4JL23X`oQ*9#OHg^hqfOge(t}_KWw{4>^Gv1Y@H&` zCZmsSBO>;c(5JRrBHsJxGu!hK^DVT@_Ep4t@IPi9wh9q@9q0>NqlhsGT4@^?@eDv; z*{+Y+Lqn@<&qU0((ATzQ5%V6j+E!X9RqQXI?`(TT-2c$`wxc4(glMg8WW=}_{a~9G z@i{}Z&h|>gxETFx`!3?XTT)v1#kOO_Sr_!HtzE=(5N)vajhO4A-)xg2o&o4j+hY;u z3DIA+k0bt;0or8yH)7ABw6yTItzN|I5B+01GGea{m26*}e+-M*YeS{BsS*38Xban` z5ug1+TiSk$*yG!xv{25rQ^Xn++S=A3V$T6pv<;59_NbC=TEtp2s%(2X;`xiJ*j7c% z%eE{nRI^ozc>bd8Y|SI~_fd7*DG}>%sD|ybh|g=F?QIW6%)8N!wnY)2Q$jo0{){RX z>Xa)j>}=a3;&qQ|+XhCQD?q#0CP%FAqPn)HBL40n+THe1#P1x{v;7({^;kxD)MT8xwKQK@DtoN8EEzL)%*sdyA-%ZGFT#SNYOHV_WrzH6GN=);i*K zkDA;1Mw|mc``K=Y7I{8Y2i@Y_7Tq>beOGe#QF<5+}1PV*@HUS zCPb{iprdTFBVK=~vu#nt_zxXz+Ym7ZsaRS###T4tb&tB*PKkKkqi(j#B0isojWXx;tW;g(n4R`ei7qN)X&yE;u@g-w#y>U%cDWI=@EO(Xs~TT#P|=L zW&0)KGx$|X3qx$RBIaOdsO^x5F$fxI>m9M?i$>Y5ig*T~(YD7T-V5k#+wzF9&o-rn zb8O`zp1Mb&qba-5K#aM>pCQM63m&n`}QtoN=vITDaM^O~m{I-C}DRu^xtQwVfRC z-bd4H6C(CM&~3K+B3}3CcH0LL-%o??u>Bsf2C!Xe;cnZ`5$ho69$Wi}*B`pq);nSy z7~N;PJYwvP?zhc}7<;3KY%3#P2h~dp58En4?D?ZdYzIWV{?JU@sS)pe^r&rO#P|T*C;JKX{#9V+(%E@nn%3%(bKl>5&vHFobB?6xgVNqdm!RDh@Q8- z6|n||UazOs#oScgNaY_~?7c}HK{UW`}|L#u6HN34hK$o#{$b;Mdd z`rg(c;4$(K_1$5$mGpXWPPvu^IZswm#wv#!k#XY}-Yg13(*W zEhEMy=r>!>i2Zo7;#QhnS)GW?F zI!3%UP^oQr#A^d>VY@kEY=*Y9&5anFp>nnr5wDHf%s*`9BKB-hMO(9odjzUv>mIQ# zg(}-Fjra@wWpq*_WMVz}vwQZXs&cy7>{KK|u#P0*uwRMb`Bck1H!y?A*sGjYH zh|i*+J#5cLJS)(iwv`djirtuh*eXQ)K2QT&vxxTxYG~^k@p%o@$aY@D?*lcq&4~DY zpk}srBmT|>YHs^6V$NQN`G;-Ci1j+u!gfT&Jp#3~jffaGp#yDGBKA&DYunQi=SEN) z+vgE$MyRdr?}&RuUFILQ1`(g(K!@16MXVj74z|$|=k?H`wwofxQs^+-6A`};bhvG0 z#9R_}vi%z|kJ_F2hi&hO>w-Glj)*w7j*hksjTqOVV{F$(To=^U_H@JJ#8;UTo=^Kwldsf^AB6S zi1!CN%hokwJrNDDT@Lzmm$ikR1;3AQy6_pAEMKWr5u#(L-~Tf>NP4!YXbIpX($uCZMd zv9^w`wcQo5#)xjPy%O=?f^M{}i8$Z15AzROwTSU9y4lt|Vy^?;VmmQn-h*znjfr@F zplP<-BlbGbZMOF!?w#m%+m8{S2W!Cm!?tb2ng_bu);8iZl;|E?|A@6_bg%7}h_N2J z&-PNp`x4!6TN$zDiypF-Hry=MS<%C`b`k3g=n>l)5zlip({^dZI08Ltn;S95Mo-w5 zN6b0VY}-E(&(KE9KWw{36$|arQ?|n*#!~2M+a(cu{^&W|%!oNBnrmASvCfK~xBV8e z-`$w`hi$irbyoDEtwY3E3cX?*9`Wo(ui9>iIQM{Fv%Mbi`a`eV)97(MsE-h%p@c%Jz7~dl0R%y%(|Ggub@@5^)Zt8S@X@4iWD`^qsA3#P}Y4Z|fQH z--6cKCPlm^(GRwn5$^@G&bB<_d~tK;AGR$c*80#dw#E_P&4PZlofL8Q18uNf5OGgL zzuE4JcrTzoZ3`lv3+OM~?-6?r`!WBp?G$l8K!4lXMXW!ge{6jtt^q39p*a7T6tVVz zN^Q?XtbL&^Y+psJKeu51VJjc;TtMY)4I}29XlvWC5uY(Z6>Von%sEjd+pQ7%AE>hJ z<%n}>sETcM#51ZT^AB5vi0^kq+u8Psct)Y>w$2g%EvSa=?1;5+w7qR=#QhoVXnQH* zzXk1NTOIM=vOn_=TZM@8z^JyZNyPb6w2SSSi2F0DYr8aJ+=OO_m9cX(YVy=N&+dhx@-b>WR_Fu&7 z^g!kxwuTXFbEuu|)QGV>I>dHu#QG5GV0$!TeFz<6R{@Un)!#VQN-&2 zb+R23F~>ni*+xg~52DVtX%S;MbhPcQh;zv37~8stu}T}}AGU2H*2qvdTlFgNX~fzC>SgO5F?K|!+AfMX zlYsiz9*(#-p)+h>Mf`i)G5@e_8?i2r`q^4XjN4IvTd#=MJsM=281bA&gKf`7tjnXb zY)d2F`v)=quvLiooui?)MiI{iG}3lb#A_UlvQ3VdH=@zDrz6(?(Al;xBhDTj%>2Vv zHDX+h&bKv>_zod-f$jK+H8*sj?ZSxX5gKc|D`Ni*U1VDnu?C7RwfzyX2H&3fhi&JG z_c4H@32-{@Xv4(WehDTMrzRjBVI(z5{|2LE{d^ zG+_9sq5roJ=|8OB>3xR}89wU&P5non!_OE#?DWz7NAwxh=j{If@BezhIm7y%-ha&5 z{QvIX@Bin2^?(0=@y{&#KV?^->2y8>lbpzI2iU4gPIP<92% zu0YupD7yk>SD@?)lwE2y8>lbpzI2iU4gPIP<92%u0YupD7yk>SK$A-0wejq@t3#w zpBJjC{Lcxh7XR~lRfqq1t7^*s+=`Fm@b{QdRn;Etq&lKKR2S5;Qt|&?chp+-Mu(_@ z=m<3ebyj20@oF6Et|p>W)nwF9O+{y^>1c$SfzDC0&{#DGU8d%tiE2K&RxLuesHNyu zwE|67YtRE~J$h7aL{BRIQH5t!1@w|CUWqqUE%c76gWgy5(Gt}ZEmN(~SE@bwR&_)_ zsxIhP)g5h8y-}fZ@tO`q<WDT7*tiOVKH61v*`=LH*TwG(>Ggqg0`^P&iLjKo_g3XuPV0u2OZ-^@=Z^ zC`?g&(gRSTW2>Y%==KI*TUqQR;a8mii(VX7kWwZ`1JOll1iDm>LF3gpG*L}NSF6eBS~V5jpr)gn)C}}LH49BsbI=`X9=cP_ zM|Z15=mE79%}^`QBWewLRINv|)JF8QDwN~?rz)Visw#R>)k5=B9rUWIkKRyC(L1UY zTAW!AEf#^#$0)3^%ps&?9^sSnR)~dkE!9#~Uadft)EcynT939<8&M5a*s4&dr7EDERaLaB zs)g#RI%s!QAMK@@q6VrJYOLC$rm7=quDYQ8Rd;lt>W$i{fvBAtfjX!$=x{X-9jPXw z&T29`T1`b=)pXQN%|IusS?Cls2lZ6*(CKPE>Z=x^erhQis8*oCY7H8y)}xVXBO0v= z^+wawKy;TH zf$mXb(0ytgnxQ75hty;=Q%yy))O7Tunt`5Hv(R&D4thb&LociO=ry$ny{VR>x77-? zP_04ltMzD++K4_<#lhYussj21qy|q2{4S)qM1nT7>4PrD&d7f! zq7G^@I!aAN$ExY*L^T8TQnOGWH3tn)^Ux4AAB|Rv&;@EKx>&71SEx1UDzzR>RvXb2 z#n%KC?o<`fy{amDNYz5KR2}q;s*j#mP0_2W6`HTwqjyzDv{-dPpQ_?aY`N-2po(fes-`xgTB^WUsJ5zr>Zz)zfvSa?sN%e! zr7F$_TC3v7{}9y*9iiHzV^v4gO?5#%RCm-{^+x^GKr}>+K%>+cG)9d>7paM8yqb)z zQd80OYC4*tW}w^EEOf7$gC0@y&=YDtnxht>d1@(oTdhDJs5NMbT91l|3k&U z6<$(kkM>j@QA5=QHB;SD@o#6B6ndlLU$|!d02TjUHGkC@75{=X&tG(+8i!6*6Hz}k z85RGca!Fw-D*lb*lEQR!ftrDee^eyI32Qn`LS35tL5lC)EY*uDYX!syAw(2BNlV1UgKOL7mk& zbiA5~PF0gpKQ$E%RnyT(H3OZmW})I=NGtK_TKwB)TtC`PYCgI{Ekeb=$W>BUii&@8 zi|dDqfANazhh9|cQSmQNas5#7?>=$;xHlL7ViVU7eW9wN;$KAK`k~_ABjWm@;$IEo z`k~_A`{DYbE%^3qt{lltAJ-36R_#%B)e-HYiqEXwRd>`#^+x-tfvBx2KB*2>V^C)`4xOkbq8@58 z>Z7Kjp=vrBsb-)H)hsk#%|TbId8qgeuv|Y>{GL{>A1Z#ED%TIqR4Y*N+eNv4sQCS% zynj*g+dH{_sQ6u+TtDt}#c$E%`k~@?SaSVP@f#$$eyI4}k6b@g{B}pKA1Z#|BG(U< z<6EP+eyEaakBZ+WSW@VSir?i|@_*Pn7x=#B`~QE@5pijZ5o5$X3`@1h7}9DrrLCx2 z=F)F&-zL#qzH({PqRS{k)iRfx9H*X#8;=lwnB z-{;m&;9c`pYuJjA`pL>5A)9;{w^NsKM;S>4)q_1zeR`o55!-Q zL;VNh@4w*-=^+048opx=;_soM{{rGKl%f6u@%P41|AF`mV5`Lzf%uzTsQ*CxH7%51 z5PvTV`45D~6VwGlHUM>lHWMueZ7=Ep?JVjAjTEf}?Jep9O%TOUlN};r>rgDp0v#)2 z>yQxTfToLbK{G^opp!*x6XuE7CY&oO1YIsF0$nXC2Hhws0o@|10^KP}g6HxhfS_Jw)v>5b>XbETyWER99XkAekXd_WKXe-fj(2k-W z&b1F90`f|8;<&`eQ2=og{_&?%xq z(3zql&^e-F5a-;H|3FuWszBF>k|55xBmaSJ7qxcpcrPJQU8I~6va@Jts}|+Z6wM9Z7#|NZ6nG7 z?I6kp{X~=p+C!8N+DB9X8Ye0Q9V99O9U>|Q{ajQ6DiKwIszpgqy{H8=L(~d7QPc)H zMbr+OCt3hHN7MnjK(q*Sg=jJ88qpHaO`=ZFt)ec_-J)*L{i5ZdM@2oLr$oJ==S3?) zuZa3UZ;E25Ro@k5fIbvufj$*wgI32}HQEo*+M-<0`l38gwkRL8xu^iNji?Z`lc)$Z zLR1XO7nOjSp^?+^?^@4scS_!&W)CYP{6wAhVUz7oQT9gHPQIrjOO_T$A zOOy-ZlK`~8ppQiPpf5xPpfxbNjrJFmDJlYOC@KbJi%LLSi>g37h?1aPMJ=E`M6IB` zMQxxlqIS@Mq6MHLQ3vQq(IQY>v=~$+S^}yQb%Gj2U7!<0-JrRm<)AY}J)mEUdO^Pt ztps(5`asu+Vw+-QD9QlcF3JMkEy@NxAj$zfEXoBvDar%=Nt6%zi>Ltfrl=6~uBZs~ zfv5y@B>L{?wSbNlB|+t)7EraQ6;v;312v1IO|0Ee9Ph>H*CZ^@2_k ztpuGS>I0o2Vt4UZq72aaqAbwGqHNF=q8!jQqFm4oqCC*8qI}Suq5{ypqC(Jvq9V{^ zqGHffq7u+^qAJi!q9o{bQ48p8Q7h>0qBhV+qIS?{q6MJUFakiY8MKyY5okTpV$g=7 zC7?}3ouDm6U7+nm-JlP>DgwXffzK z(Gt+bqE672qAt+yMBN~c@X%`p{a(}qS}N)VJt$fUdR){8dR7$M0(G4z1N6Em3$#L% z4SHXc1L9Z@qh8RLqCC)=7{6fD3tCT90NO}Y2--|k1ln3u4BAmt0?HFrf%X(7LHmkY zK;uNMpoyY3(4nGs&{3iVpi)r>s7ka5R4-Z#nju;OI!V+Cnk(u8%@cKl&JisKT`1}S zaU_UY0}w}om^A=#B#8V6;z$sqjx90cD#`$HB#2Q5h$BIaIzSu=qSpuFND%P{;z$s^ z77#~*h(8cVf|xZ0#W1EpuLYDLDgtGRib2_;5>Sq)3Y05Kg7QQypnOp)s6f;PDipPY zibM-Q#i9;SiD(h1O0*c16fFU@h&n;7qApOIs2kKSS`Jzu>H&3#dO?dsD?y7zeV`?x zSPtS(lmY4zWr4ay*`Vd398ixa7t|}t1FaP0gZe}Tpcuw9h(Az5;qHa*T zXgO$ss0Y*`>IE$ltpqI=^?{a%Vp}2pL>ZtiQ5L9Mlnq)g$^rF=azVYKJkUx}KB!Mr z0E%HugZKkwh>Ad2qGC|Cs05TFssiPTlAt_M3n*XI3Mvq_feJ*B}Gd>Euv0PtEdaqCh7*YiPW#$^)$w<%9Y}1)vzlG>AV?hNuXXB`OAGi%LK_qAF0XC<)3FwSe+P zt)K!?8>mp!4k{8Y02PZmKqaC@peoT~P*Su6)FSExwTikxZK7^ayJ$IR1Ka>+ok5$5 zdO?UTXe&WGiuyn!M6qqqa*8rQV?|k@iK1-KVWJ$+F``^hxhM~GoG2gEBq{*S5fy^k zL`9%;M8%*>L?xiBL{*?`MM==jq888+Q7h-{Nh!%lf7cB;@ z5G?_{FX{yKiMl{vin>8-uf`Z!4%$%E1NxDu7qo+DC1_VsA82<`Y+KBki!wm_i?Tom zin2k6h;l&1qFhj1ln0t7$_Leo3P4SwLeL4KBGAdAV$d0)5>UIS3Uq-e3A#+w0=in% z3c6m@2D(+$4&uiTFzXDuPt*b8I$X?Jf&M634EnQZ3FswJC+H1P7w8>PH|PV=a?mHD z9#Cv`9>ib2()5>Qf91)3>Jg64=?K&OgYL1&5DK0@UXbI>KqE65s2B8>XeH=9Q6K0d5hwXS z7iECfSVQp#$`oaTHW1~2vPHR|Ek${t?M3;ZT|@<-QKCZ7-l8JV7*R23f~W*kB&q@( zDN2H-idsMkQ7foM)COu4wS#7h7Jz;!>Hu+FFX9jME74-mZ$wK#mx?+;3q@U^>qOn4 zTSUu2cZzyIouXdQ!=ja-Cq;drKZ#;HpxzK=fL<46fmVpJLGO!lKwRsK{vYT|Q66Z` zVbtxl|L8;J@*n~91*TZ@W8JBms`d7>)No}wgZUr`HaoTwEvQPc)HRMZYSO0)n} zD(V1Li57wCMTk?V!Cx3qYeq9iT$dBGAF2#h@cZOF+kpIzbhpF3@yQ zH>g3h95hSR18NoZf=(B$1f4DF1D!8ogM5i719X)r3v{h08+5ZM2gJ3*$bX=FMR}ly zMERg6Le2lRbWFDP5I610V=545c)_G7fQq6|=;C=0ZQC>!)MQ4VN~ zC>K;H$^%Un<%13r6@ZQs6@p4cMWAV-Vo;5!1k@m^0=0;epgE!z&|Fa~=uA-?s9n?! z`i*D-=n_!}=t|Kd5LZ4U{y;a1mVj;(b%O2^b%8oX-Jpj=%R!HedO%N$dO=(bjs7#} zWlHw9A7J;fni$QgwC7>oz zCup{)3)Cv=2Aw8a4mwNJ13E|43tAvr3A#+w2U;kK?Si^almX&8Ys4Su4pBDf9#IbH zeo-!nE3VQ113f9q2R$n)0KFh81aa*(=I=poii$z+ib_Bqh^jzbg^ltH`a;wK8n!mI zR#2v>4U{En2W>1`0NPyC0oq!$2$U;Y4BAz+1T;$23EE541u77AgANca2Tc_9fToCg zLB*n#psAuhP=zSAE9yT{1}G`Y0?iO*gH9CXfKC?Wg4#rRptD8!pz}lppo>I>Ag<*` z{DFQeDh6FIDgoUhsseFUH{uVpRMY}mCTayeDry69eK+bq(4R#MKz|W+fL;?V0&%4` z$}i|W(Gt*yqE67KqApM@li|8SYl@bG))n=DzAx$pWs6pVwh;A!wiU&Gg8EOC0m>6) zf%Xt(gMKE;0gVymf(k`>pvj_q&|#ti&{3j7P>HArG)+_tsu7id8bno~7Euy3N7MqE zD{2LuDQW|?i`qfI5iI~+BI*ELDOv>L%5lUW=tj{J&~2hl&|RV~5Z90+{y-0jmV+J_ z^?;rh^@6yX9Q7aQWlqBc;Gs2y~KXaVRLQ3t3@ zvG*Q$8nj-226^mAari%JN6{6T~sQ*M6prj}ZG((gPI#HAZI$4wpY7^yw&KBi^ z&Jz`YE)o@jIz&aF--?Ps*NaL(w}||&JL)TrHT9L%)fJu&$vu2rQq)8cOb z!|SHk;iH?8>*v=n|;>c;ZYh6;C~E{V+5P&(5~wZ@pfX`0Tn8w!(`n=1l4#PQwIL<{o3 zh>#Z_KCMmEH8sY|@cmQ&F7rY`s_R_#w6Bxuunnbkm5I2&yT1cJWZFi-kdn38y5|s*)EMuc@xAYC^sb1g%91sHm0IR9mzvaXr1Zxu&VQ zv9vas%6J2~ab49&i}F(B$#iF^FFOv2mCn!o&M(H|uqf+6uRBg?2Pf_BhpIxAq9gc%Qr{J|I6qrk z+GIy`E`EnL92j8|4b`QV!(F&Y;jql%j%^23l0{2WZE4c4b(DSl^VKG5>k)I|hz^PI zX_ho$eP(stNXzfFC_C}erlyAKvgXuxc9j$2%CxF#>>2|O+?$G|T@iB+vW|ZT;eEo{ zDv;BVqid6>lgg@*rL0a11gMBN@I$|74C?(uhfe8^oF-K29(iRmsuMHa9l6|YmzOLp zpN^{2RXmOOsBn3;rJv{X>wA6K*wd2LE%(JNFaKLNvueA>l%X} zMUKes^T_c~Yv77Y|9qaTubEYeuO`<|o7R}H(ic|alfP2QcC*Q34;RO={C zGwP?K2Jve+uYyd@XlN>r2a9n-DPpZ59!N6(@C}Jl)XFM4p$|fP3EEf}_!u-=FjgmV zYN-MgJP$cOv!NPIQh9w{Q$xKaQ)79eE)fqmB#j9KswhPn34LI?F@X|QRiElpm=Gv0 zDJ@i1{O?M~UCrSYKFb3scQS!a3c4@hGpi;GHd66viKcREguR1SHq2a_s{oCrvv zkl}DVws%eO%9{Ezv}DzF)lH}cQJ<$OVec?5d*eU|7U}X09KuSn7sRVj5gAs+(NjM& z&MG-{h0t6D5xSCwR7pj9p`z>O*+!HrH0zN%JFKRz$5j_7RO+pkT662wBk`u0^=Q{B zQYqo>Ftef53L!gt;eKxV&5>jMYxM6w)D84SuQ3l-HolXUE&Gc6xH^h$ISPMyeFe%6 z{u4d=U}578m1RFoSlgNI@MXy+YaP@1D_WYYUzN^ZQ#$zm4V8oY8%L(`Hvh{jr?ZbrPc!t!MxB#KFGS#@2%c;+4z^-UwAN19e$!+N!} zuDY=vwOz8hUvzpQ!lNwzj9$GvX8e@V`S^<--7D!)8AU2yR$Xdk$Uj*``=O1tYjj-TYN;G_x~y5j)5sk`ba!Yv~NwP>qjN)8&S%tRYg%n!`g(Im5S0P z&Q<6r{s~=~MC3Ijk_k;n$n7T&=Lj$kY;?nx36sZ9!A)~^!KyN8tOy!vO3M>COsVRv z36l>SH&KncO&7RptDcQ(adQMNj14!vhFS6GjXEuajXU?BGP32me=v5QG9% zb~76BvP4zsjOx@)xIlH@WCxGx-)+CvxvD~We$X&ALkQD|J|gneNEcIw75i7%kf`+1 ze$u!@M;F_LAcMM^hca#&6;Cz0mx@7Y=y0Gb=p9D|OtKd(ewUM7H|DNX0IwQAiC~;* zpIPN)<)LZ8$w%M8de1Qa=ykAKgwBQFqMft~hNX-dM+~3-dhesrboV&S_9rnCa*3Wi0Y|0;=zm4vl z@*>7jL3@)u2v&*dlLk)p*H$OlEc<@gw^z>V$?fcNCQ2u-zhj*hSP8!&9C779nlG4UorInA#mzI1sjQ%x@3J*e7CV)(-(0@I~@M0Oy{*| zLe*L!KZwgnk>fehFVEqiBmJ=c6QR(w4)3L(!#_}SUA3$4-1A*-R-^iM;~4L-Gb)m$ z&93=!t2A)L&`d$F2JP?gPvv{u+>bwYvpJyDLA_#{{#x8BhH!VwJF+K^h>!3uJQO%` z9bV|&!hNmqq5OyqtA6fLMISFOP5KK>cnc_yT>cR%G-1)M!w=e+n&vxr+@bNZS$a(6 zFQQPTd+?-*E&({(!n>n@CdHn(a~qR(0pW-#uG`>G1s)s}bPXXT*vCloM3m<&8b1Mf z9S?ok!O&$<@#4m`L-s#-QrsJ!dW$e5q1@G>jzYG#2XN9W8qhq3#;uY$-enIBJRRb~ ztXN-HGb>yVPZ>9U^u+kMLr28(RMOFyq@Gi!oFfKuChGiEJT9>2hd3+X)$^XpSke@N z_2QfZi>erFZUb2zPwFcwkYSW;Q^rjmi{WxZ0xf}7g=n>oT!)T~`_=EE<0l;IM%ZPn z9Q|IUlQr(LaxbkS(NtPp<4^AJ?2ik4%eHz&fZjuM)I?-t+I& z12F}4kG#_z7|GB6V!Gqgl|<}BPvLEk8fz!@YhrIA*qT0_+joW^1BG0!&#o#ZqBF#T7Re7EfBM-^dEr7rcVL_HXtn_x~dZiYuA;J^))G6?U+n?R!*OmPx>HBsGP_6yERI*qNTs-&S58e#>7Xob zw)D#sH<8BqLZy$LgrRFnXL&ty3!YjAViLw$SwQ0t`C zSXYDWCoFGen`35zeCt5yqax`A9u7|H!po9Z;BHZ{fJZ|)Y)3kJq& ziQwkQuyqn%P|O{r%@ zZrk;AkwsD~vkoXeOm{kZ(pc|#T)#(YboslW`#W;%{(i1x6h*wF4@=_>Jp8gbOz!6v z>en|n;W3+kEH`beZgJdS=4iga^QBa$g+~ew$-IgZ&vNzLRauu|D$6mqjV$P9p`>8u z-zo9%M191Gu7F!~)L(Z~hSb$xz~a0ah@;@bd-~LCb&tn_&rs>A!$TE56+vWRaiFRI z%Bkj712we8URy&a$EaMp$|enC)oSmVr(75{bBv-j+kU)xQy1POb^NGNdCKez?~d-x zprj_)=^7{=8}Xc3Plh?Y$Y(gXoM?{lVl_OQ>sQ!1xDo>IHPqD9TiSbj*&{x$Qnv>I z{{492yjgBN{BSenfg}4)K0m~p5LjK+F9^rRT(z4Td}x21F1#vJs<)bw6Tj+}haL$r zgx|td;>iOdMBNCl3lnsE!BnoL_nT@PiHa13|;uRzc$nzd4LeA&<72n zia8vjxzT&<>B-?`b)Lx7$MiOete>gtn;YDiV{}mwBCxc%rT?Qe=R$9W&yNCYn@vxK zo=khP`X^pd_j>I1D8&zwdci7Qg9vu79XO{~siis!PPRwq-liUur#cP3$|X(SxvdZA z`38Qj>;kxIDXwQv{v?<4xB)||nR6-@497?9rZ(9VkVR~0;v_!2(Zc!E6Cuyx&5^h* zKR;mB9^HF9&cmcXy7tOaN*+Iedkz*4E`bdnflp}_qy6_ypBDa+Be9jL1pNMxJC9e2 zqaENh&d3419sM#BUU1=dcT1uCD4j9})0DfZOAwl*94!a>MgzMB*^6be-{EvOjd;t% zWja?A;xu|4&aWR7p%hVLsa^77&U8&CaY`{(NW~mMFQ(!@pzh&4o)dO0jYXlRNI= zqP_Lzt|z*P2^|<^1xyn2 z*hF2G)`xN?4V_=h)zQ{_-QVh{$tD(K=h`$U|5NbrJ08 zQ@;avwZTBT8Y?#?5;|%)8`{adrp@(`y>&?5ezu|rOIjn#vZ5ivB`?^0@D~wrk94br zoR0Z9@4d~`Vh!Kp7c#!f9LmL&cy}mS-JppT1-2oBYw>wTlWZ+eI3$M#-Z%llQzMPk zBs;?gbXO(&kZh(F3tyVNv*3m?FgJ`OsyocM?Y?#{yx`q>RjkP zSM$j^XFvRD2JXgwzgL?fL}eWx3iziB_)=|+_Cb#u)90zTpmZcRiGg4 zOG|!mGyj{uN1{(Rn^_AS&v{Dheq5sPkK5ND^M<++7NtIk|zs| zR+(-6s|`8Q4P&)4Q;xac4Od+il)4b74lv5){^)w?r7!y zQcm5T(^Odc=Q8j7;TJsvySXPCdeM^|3pe|ax(Mg?UzQK-mp&di!K(G?7RB!3{GoVY z5S}`R*P-z%lW-;PT|ep`tn0*z_vi)s)wXw`nk9}#uOG%Ai>FR)LtWPxs?H2vI-(v; zbX{dL#&LLc%FUU0yN7(EcFSWQe!zXJu}-?#z4hovVrYNv97*R?I)yYnOul1^Ooo ztOnzyn5=PpxZ*RP>#B$IM_MOe7oa&bZ~1TJ2~V03feEs}MTSN( zepI^Iujmy7U+LsSWv*{X9|nDw)GKDeONmYq1ule(mXq}}G3kbZB3^@z9@({Yf$5CE zzMjv$-5orit-FgJtwB#ELP0Cb@NQ-4Zq3!vuwKol*Fl4OL`HFbg7_r2kM&b;0VipK7wZ$$e(7O@-Qv~2&{&8EeTaW&j;!>m+_)bw*0QLpeGc+ zarfxRKZEz9KBEtt(C;X!?On#eU@s`?J>;8oOE z&ge(EALFhJ28tT?@)EtH}dJxcjw@@$qVQ2gCEC?4c{_$(EMQ=7S4OD@WR3$-(UDt-^6)c zh4VIgxR>5jJ7=vqY5vc@d}qx$*^}lUvf8A*pPAELcuLooh4YTtHm~rMWjXN&Cd|7p zu*DBbOdgJ(28`_qD#k}(hT(ti(+Ul+d&dsg0LK1mLHPB@SQ-AEm-65_e`4ksjBy&u ztH$|@K4Y85zMqwYfNA~;Ho#XcHrN0^ny7C}AG{hLOvYB%hqpd}m<;U0bN1p#tnoXB zu?kOrbKe-h-X41kHV5_{*ll6oh20zWZ?NNF--A5}_HEcA*!N-i`HK%=P_npzaw+6`+l+hi5Z1o z-v7>DM|M7dIDcRXKAWK5PuGVkeu<4}Y~nXd^@rbnjh!2bO^e3;IaQ6p5@XW~A2o>0 z;fPKA(5)AnjUyy5d@qg_!4LjDhuA=#i@geqU#5;d z4~uUh#a@KPcjjU*!Qy*gu^w1NlfrEU`x>^lfqfm8sqr%G4&HVy>|e0Wd!?VT&HUzK zo0J(_U>ZLu;xrV5TxIUUQ#)I-3g`1WV}V=5c- zruK;-qM?~;C z{soJlz>R$Y%OV-uFV>0=TE)J^c8<5r2s_#$jO4PX)0jP-7K*UpeuS+tNPMln<5$HO z6O-48lg7>;B)$&iL+(mt)m4r!o--O>A9?ZhPcObchQ;SLW1qm{18T88SY9Ky8DB?P ze34vyIgRn)KIWdyB>4Oaq5nX!7)csEXKGmVkvw1Pv`K)KTBMVnVN z1F`pj=W(%#cx@Us_r<2wZ(S`M-$Qn+#(jwRLYdobuBc}qbv<*hVt9q37U@gG&}*TC){N%ncr zSk6zyzcB+OI~PNQ9#9S5Tr%lZ_u-ICdTz6B<)6QOfZMd~L}1&pN{J`Z@H&}Q7>8^Y z`S%5~2Csd!?Omn6I_!SfUITV2>@e69VAq5_33e^mQ@m~7FSikCv9&B~kuqb80&7|Wu|qR_CJ9bs6K zBC>f+BVZBBu~A;+XIkWwGGk0Ir}565cAjY*y*Tabmh%DoH|Hy=!zGnpdKnhW!AZZb zNDr6PABGa*Y=k;6k`R-iF^7)FzXJwIh;*xoSFMnxhWSM}xBtiMVP9k|*s-3tHxh!^ zxGyYA(SES|z>bDxX&M7N&fDgFa2wGQTgMWPlo^|C+8mEEV`rMi*m2<&nzqQaubY@( z(bXL=tuIcK)|XjYZS~66kFGF2Prc)!!+g-r=4aR^NG`bV;W=8X^Ty}&9oubp9^s<(GlgI zp~Py%Aty!>D_DOP4w6`r)hFH>!+*a59m?pk7!k`1b~G$vG&a?X==Ch3Ntv+|;d5H6 zN0~9!pH5@_>B4R=DhPkKbQA%&>iw#ZQkoarSdKX-6`)f^F9Vj$omrL z9(i9k?+Q?@yq|;am3Q^k{PXe?!87FD40OM|TbVZ(G+W-iKo81WVBYbdljZfR)-9k! z8`%nItg5EMP8g)LrhCWco2_11-6n7){PX7v=DJPWW~Y&VzW;u=Y1^+xw(&I~{rTay zjBM{4*iJS2Ea(0oEdqvkA6OrZ8)oK?ZHdas6M^?n@eRM_dT>@wHDUIJSSdpB$y z>zl2`>n-wTF1Uan%b46X&Z+ z#zG_pOU5;@EE$VnSu(DLWy!b>cAU4(lEH13jPG0Gkuqbgrp@&zGuCbzW5|VDWZLzn z4Y6drpd?ujyQQXwZV4p>8}aBAb+BYi9w;I73TSW^Q15zvYbD|qL?TPX?XZZw7`|Pv zNZrsPmE@+7oyI$J8l%!_?DjZqh!OZwnh3lz6oE{;Xig4B;K4(Vz~CCde?K0FQmx$U zMdJNlBtGax;zkyUB$qRt#=CPGqt0opV4U`KtCg=91L1C3>U8vYdxnv%9o(ti_Y)heU(Gc!Y)nt2?l%4_~3 zEbFIkSk_BV!5#zq4D3|cXJIS6ZQdWZ5lOKhSZ*M>BIPs|DW|dBcG`T?_*BMej7b;n zHq(}v_ATX_ugFyYXWavqmbaDT!=>e2X*o!X=hBpxSFE)BUE#u|<*)LVV&4zs4bLpB zkhc}ykK{cKl$u%iP~OX-@gwEKVpp5@dTR161$`#(GV^j~;R|_RBFX!@c{vjM9ASU)kv9IXXmsQ&zl)z zYv;5!)7W`%8t>5UyU;ZD&78)X&V^%5=QQSHr*)b3tZB^q<&$MB#Cs(sFP|KURu{`o$#bztjFF%fPqVMINw#ZK;eNE?`?r z%RzLFN9qrYg$vjuX)IvdDO|XK9VRaeSgyR`0(O+Vt?>R>-qS#-0v4B--PB#>z1qCj zgA(#C1&xq*nR(ewoh~oCsiWi#cT*eX^^5Ln2(@pdGr1O;Y6Oa{27CCRMc4iQ(tozd zvYUAou8x2Hqo(`arft6(*iIGkR!^njJ+g?e2X6B8AE9XSzH?w%#J7TF5#JhiD(p6} zEaKb3vS@Dy%Z}mpurI*w0Q)iQj}|7V|AuAc$68NW7^54 zoo(7Vrd?**m8RWj+AXFnHH~rQ&ikZkPn-6#X|I{aZlAm6&rSQf)y9B@Z%<{_aN*la zS`JRyqD&hud~-q>`Bw-PU0pT_8WWUrpGORyk@Y5+_pYUTPkYsJwQ}7DIByaD`G33~ zX1cXt$9m!jWC~v6C|G8?-C_5E-4m9XFCTWCx6S+DHZ##?TlkNpNNzQn(|+N3Gqs@G zX^b5gj%|?B7Mb>qC+0qB60^V(^OQ7+IWLr$?5stnGJ}bEm7EdWsGuLH9!f zF+s<`GC}u;WrB`_Wr7|6%LL^%6O`Lb(9JDDNp9-XX>&cVo0NANW5|VLGCGYdgVVll zf__E2J7D46KTUccVCnsKFW0EgP)Dbm%0cG_Sb`mO0}PSmuZ+u;G3mnHX4(?dzNK9A6`AT=bq|-|m|bL^Bf zIrc_*OW{3S-b#?`&9QaAP2N^evAn05cRuKDc`pYYE$`LlWr^;TcPVJ9yvxkXzTSiK z4g+x@_7wg_-)`)MhCng4=RY5`r05eJ-)!kv)j7eyGJzIczyHU3VnezvENcS(9fMNB z`;5b~bd|uebd|!gRF%Q9oRq_|_f`SR-dh58Icy~?dvR5;J>E9sjN2@ITUhBMWyWev zJKm$r7?1D5{n9k1u+x5R8q1;6t}yKe({48H52oE`+7qTRwcWKaKHTx%HSOz`<^hXL z=`Ji3;T~Frv>crDF=fPX5ACT?=HwVQI!iDK8WW8T;ZcKTPJe>w8|$16Y3)fp5}()C z0Lx6(2)hq#Gb}UL3|Kbi+~z%So0(-x%Pb@}x_8=a&+A6_PGiita2>YqLesu(LatiH zI$$=aOp^_cvuyBOnr!frG}fH83KwqcUze9PXHwp9&ACEezkXYcP|=CXdC(9@Z&w~Y zXcqE+GD2UB_kK;{+pX?ceX-A2f`9%Wua|Y#+OUUt;z`Ihya&7=uWa^9SZ1%2VW+~L z0?UoV*p}G!qH)54K$|CH2gbe=sE10 zsHxKSHkqS}@z4L`^)W|fz)tkU`N$!>=5|~ zb}P$CBsaWt+Aln>8(un%!%G+LV%wK7=`{8=T{!kNo%Su|npLawR&DPAbL@#}a_lcG z$F8wf|Gwth(wJjUPLpGY%gY+`RC&WS=0@_i!rLbAX`s}+;->O4ZRW{)wRx`x<;c4f zbhf-K?`~iAHMf)3FDY+AnGzY5u^+-*$9~hXLn$f#Z$$-u`TN_gky)VT;_CS4&mImo zo0ytC{Hp%vB`7((_sd~f;yPei;;w*YNxKr3b@x@UtZx^>vj2HCEc>6=z_S0j2)4)D zW;}A6C30&kk)+Jn$)+)dopz3Cd`#f9D^2^YX}6fh#{@3i{iZ!++S8`}*)(1g_gE+P zrfHv>7F*3f-v49?AFz!6TKPTPxjj!>4(@Gd<@|7~GE&+YcrQ@6aIfa4^0JIxByS}s zH6Gko-d1Rr%F7f?mC^m>^~>2k@D)bN86WekiGK_6Z|Xqh3_m*8|F`o0v!%=L|5V{R z{XbqiTdPc1wnY5933;6Na|j)6B)G#^e9%nL|GNmx2D#WT&EG)pPYh{^Lnjh|*Yp4^uj?T% zLAJ$)dx3)F-lB2Z9E5V(c^<8!6+BKGVgz25CIS!sw<56QDr1e#=U#?o zJ@*RiF|e<~PKA99w!+)yeQ|qd*zGMBklfNSr?q%qw{*;DZKg42IE^vr_GNA6w8f@< zOSxs$`qkgy$nY^!?cLnIz@_r6_Sl;kj-3#UA zTHQzG4X@R`R9>#teL~&>kh>$k1$>pfKL>To8#nJX(C_4J0X-w{9P^$Ex=G#(K!29^ zQu8hZ-68KCpy%bi$Gi`K{vhw4K!1_qO}eTN47mTRxDEdK<2#N?g4=_=n9Ti;jf6ijvVC!6`>x3L^MP%RA30&u zsY`JGVO+Cm;13Mm=IL*vif8=43(KbAZ?J3{-h*Y6@OM~tfmgz^bNW6khmRk?a@hC} zSS~vG5SHt2KZ50|&9Hs2=fQpgdn@dxuusE&2K#r|f5E;F`vvUB-Zt|D zx7h^kU`-Ioy$b6zPEb1SbPLDHPN!X98mEYyc8zJ*nf80rcy}(`!=|xhJMB5sUNr43 z)7~-dW79q}jf;PHlyze3c$692#59(Bca9xQ`>|<^Q@8Klrm@^R?I6>RH0@~9DotYv zbmwR_ZLVoww;3L=SN4jkgmACyHEB7Bltk3r{EDP1zu=~KS1Ixm-F6=mOoA<$OX7XIi zt6bI8e_+WTWI@o)abM!4q^VP*3qxPIBkfL*PABto)1M{ zBMv^;&#@*3i9Guz-`9vXR{eSS=l?Omm`m4y-PRLxyhz)|i?r>%NZZLGjpTlg)oHvN zr?HRkw6je6y4A<3b+iYpeBM#wge#x-q~+j}Ur{oJhlFoR_;cn^87tk_1tvO?Ppb}H;h*b`uPhh?u}57<+@ZQeJxS<(I2vKYx# zbWWS&d0j>4G*)yj94FzNcA06M*mD|V-Gy6bT9;{GH+v44!9Grt!9KMN_OUWVID>r| z$|Nj9(OHE_(EQe|@+&imw>aTH^xFSENIYI!0W1@LG%Q=S{b892#=?&Cw#R$hOzfR4 zu}N~8oabS8Y!A50FmYE^?q zesxkGb7-iq`HG(zXVF^+r{W)rp7qP~oTmS#tDFx)Wb#@k!y?vVhrlv2cd^JMxgRuk z8t=$ytdgD9ZrTtdF19NpDI9U@gd&c`I=U({7;)8uMO^T6%z_a`P;5N$v@+(|CtYV_odD4%3Dhk?W?3$gM*WIRl3rGssh> znn5En^_KkohEE(b?|&I;@Z84JJ*Z2-7MlrnX%(>A5P;PIgJtLG)A1$zHS}- zEsZd~uLKI$;6IR-gG=63Nfqt@j*`X^Mz+Egf?N;fV9?(3a)hy&yp`sy0~N^Y_g}7o z679bPM;LX3B>n&52Olm%)?mwUDJ)xt%V60eTn;-GwgZ+Uiz{K-P+tXminq<0pWAFH zMq1V)x&D#U*gtX__jB6mrk!ir1*TnP8e`k-dyi?Iru}!a<*H@s@AgLWebZ03zKhiF zBGvn9)2e@G=)27HU1s_&Gp*vsy1pw!-xZ?o3ek6kh%=h~dwT;;?Qfy+S9oN%m9!ij zXS_yY;gQ`$X&l*Yt8j&&)X45oc{#G%LEiAl?nrrC;oV7IPP@2$=Yx)w_j1rK@?LG; z>p=;5mxA)-U1r|LK-KcT1R5#t>*nQZq~qoN9JGhL;nhepBT#a;) zyf1=WOma2SmsY?{1*O5 zyhoaMD(Fsmlc1yIonhXSK=;b~E6}m>o^ReuKo7`!BdA2)+su16=n;9J0F}%8jCo%G z{ZZa`LDS^@z`UP;o|AW-HIPf>-2mk7HyiY#ygPwv7VVGkN)eu1n<2G4Bqb(enNjbh*6ynfCzDczKIKSIRrpy!-~r!Sc=o zT`liP=A8>VT;AV+7Rh^wd9MN;E${81>*T%Ly!V4j<$V@(qr5Me_f=3r-hY5@miH6$ z@`-A#y!^e>+vLp#xzyhh)F>~1x9<1y?rGkAL9^s70^KF=5#~J>bdtRFpg+jlY~B+= zbLBl7)G6q&btZdDtUJV{ZZbZn0F7*HS!jMo|bpAc@GEOBrjLw{z+c0!*xe)0^KU_ zX`touo@L&1L3hi0HRwfouQTs0pnK(A26|cEN6q^b=s|g32fZrq+vZ&fdR*SsQ3Jdo zZwAO+)o{==@@@rsOI}W+J1=KxpO=^Ot1IL^z`T<{FUcFHCNEoDw{H#Tb$RE2R?0iq zyz@XSO14|%UL@3o-!<-G^=PkHY*FYEP>( zAIf_^XdQW(3*A*+3EEQL+d%8fdzX3d18pZSQ)&ZwnJRAI9?;J6egN7?-ahkw3EEBG z4e;MhN#EhyUit+hpDoKojJh zkN<8X@44o^2*hI!i(QZZZZGdG=Dicd^9+kUhX3v;?^EVo4&u3o#a7_IJIlM$ydQ(g z704n70u$OWspK zd&@h|yyt*^A@4%azVcpc-kU+E$&2PlYr**|YS9%^Pa+iLSQl*lV9zhA8xrMB@y4do zrbN87ygbp^xQa_)zG{UO{c~|;{PR~(UF9}y`~JxGtC8*h=5laee;<0g{PVAW6Z8Rt z+j~T|507j&MYhk4Y~K>uek!uPGO|4!eX`*Bca3aMifq?Jw&z8*uZ?U!64~yJY_G+v zh(A9*wvTL&i)>d!woi#{Um4lHFS6Ye+5R%Jy#@L!!Rz6d?}FRMM7B?eY+n@F=2tp` z`!A1de;nE7ue}Gu?;hFa&x!{9{6Wv)_BoO5nAs;p^@!|$o8)z+lwRHe~fIu7ujA9tw8Yn zJ4dz;ifkVj**+t(y(qAqTJc)w)e1Zl+aIoYod*7yr(cWb%FL)Y!1B5Djj((!eG@F7 zOD~4y^XQvlxk%;~*t=nGh2{G(x54uLnA>6be#{-Pe3#?*uzWve2`t}_xf7P}$J_{YOj!QK!1IP9yiPr#x>5_=MMOV~fc?hD%udo1iz zuqVPk4SO-{Gq88TJ`4Li?4Mx!VE+ue3F7!U*gasE!yXR%JZux}3$W+Hz6i??HT?ya zU#WQsb|vh~u)~ocufXmK+XKs=Lw*&u2KF^r{;22cu-C%A0s9E-UtxP;--KNYCI2nh z?O}Ui$HBf0TLHTQ_7vE6V6TLI7nX0a{SCGU_B~iGpxSyTGmnI}vtu*y*rqz@7;^4EA@h--GRfT@&^#*tKBSM1IeJ-41qb z*s-vgu;sApz@7}dF6%lIC9S++Gn+5xjx6S?=RMQ3vrW6mw98Dp*0dW< zyUVntrafxflcv33+RLV`Fzr3lJ~izN(=t)txHwqfBgCI+TbQRT`VJVN}LwuNb&ops^ZcXn~GmudT&cA#mKO*_i8siqxg8fR?X@n)Mg z$Fws|JKMC2OuNjqYfZb+w7X1OYTBcwJ!#qtroC+13e(;*?NigfFf9}9j2C|%A^uF; z!nB=C+tswaOk?Zj;^08jINR&AqfDD>+Ht1UnKs+BIi{Uy+S#UEWZGq>U2EEnrrl-Q zQqvwa?Mc&KFzsd2R+#plX`h<*g=v{+XTA9I2=Qkc$0;rjb~0^O)AllLU(*gWZL(=c zna0^;cf8|Ft21r3X>&|F)3mcqyU4W5OuN>!8%?{*w56s!YTA>gyQXI$Lz zI0xV?$_|$j7~1v5zA zjtX*m?1!*u*<(NQIxf3o!~Ikc$t@gp8W)Z_jcbyf#x==K`|m9N9Pr8YSS8SKT%I={ z2pTUf2Xu~-YDe?tfi9Fb26Ujp6`J>8&}H(Lf+opZY2G@}!cfxR044fr&^&0!WP0oI z_#q~Jyo~Q|f6G&PfwxvlaDDzCuQ&SEZ!)gz~IFQ=Vh;rQ&|X&0JyscFA6jj`^+Ei9Xi3WI1NhJz<$e^I@4qe+tVix)&_7=+9u8+4g~D7Uedx zD7TqK_p~fZ%8a#|HrFHfH3%1u@5#Av9Tsk(X^Tx`%)4;Rm~P+4P5Zi8big|B7-faw zI6*3t#iivydmv3FdnA-m+7N267jqlGDx=`HYV?R=6*C8`C?5zRTJu??VRb znWjOqPw;!)&V&ryx5qyB!Y8>~@5g&5nefitS=p)-^}L zvaUHAmURucS=Vrz+3%;8{YdWnlTKqOr~TT(op0I|rd@5?&89K--M*}0-0`|i`|o7a zRm?}OUGNa#Ch51JKyhEwbYcRT6*8ArI~4}rBCE-MdZzv z_cV}e5!tu=m%NvQPLh{}$$75_eQzCJ%TiFQyvxk{7>FwmhQ(e2og(k+=3N2eFCMrr zQlBPocwOlaBaJf*Ol%kFV~e`CNJki-FdmLlq)TU z#kj8Y3VFlpN+-(8b)^gC4X-PmA}`mKUL$XKUFnhX4nvId*Y$3|S)-$`6R;<%>SoyH zAvQbzkuOyI|GuCi(A@SQef&SB7khV`LU`5_%g|gh4HK|zZl}SrS62zk=C%r!&1^L+ zduGSM@(JX0SUv@*f#nm(T39}Ttb^qf$a+{lflR{k3FPsxd;-}3%O{YHuzUj91j{Fo z&9Hm|IRlnYAZNl(hHZhJ4m%r`Pa;o%ZS=O8@3_t8elKh8NpAG(G+w>aIQn%OYbd92 z^y{=sP2=d-X&n8!aCe&a2h$!g?FrMKH|-_U-Zt%TrZLXkIsRqZ+K30It>;l@Y*W*I zWZI6V?PA(bP20z`38qaljkTLQ$FZhWn^tSuEYnUh?F`fAn|7gTmzwrF({3MSM6Q6 zi%q-6G{(3K*J&ENAx`_2vgUw!?+)dV;W&RP@7*aa2inYan3KYJ?<8r=d-o_@IPd*Z zUcd3a6rrMxcMUYA&NTd+IcV-`iu)flDXXq4ZJ6~9=dVCxRg7!#|9E|DtTJFHdg3|A z5xnN}VVR?T1IrwB0qilb7s4`UT?AXtrjmheU87gzRI8d6uRe4@@6C#ea#4WIhvDociMDA-5Npio^=``Mr)7m^*M_*ra z+Se@s|HH%W?=B7L{7p}g3|QlJrK#~Avl{Q>G&SDk(%29_sc?lLR}>EhT`ey=VNc0h zX~hd^@?LG;>p^$QyAtj!#SO@oo2$|F2I%xPBX3^KSg} z|Cko+wy_yxiQwNoXjGU!_rkI@?}TM5ejn^q*!yAG0eb+Ja}3L1ImhrIEaw;=g5`Mm zVOY*Fbis0t;SpHQF+2*(IflnzImhrgEaw=WfaM&+ldzm)_#-Um7`kD1fqfd5a}CeH z?(S_f4{@8liT$h*B)RY1I&HS+b>F*n+L@;P#`e9)wBMR`t!a0dc9&@nnf9n@e>RP= z;jZOP(>N#Uw11lRscCECzTNd@dXyR4*t8#-w!LXPnYM>%tZm#m4lwON)0hVC97mbP z?}9k(IMZgBHruq*Ogq!G4%1lgxbuG3u|Sf>zWcF}?|y7V)lJI=YdeX+gJ51ri-Ovr?E#p7OFAx~aV3Zs^|f zvSHX<-f%Z`jJ)iIZYgiL8#-QIc0;$8H{1=KEHAsE+sPa5h8`;K9q{JL8}5c4Eib#F zKbAM#4K0zE-Oyd-{S@TlnUB&cy{E3!R<>e~^1@eY}qU8*E`4cVs%lnM&%U1+`EiZqf z!}8~%xwd*pos-l_6(NxwTUf1+in zy!?rlQhC<~IWK>r<$ig$235$LYhM0D%Y*XrCt51y4gW;T!}7wZAqroRi_YawhjUH% z6R;;_0o-4_vL-QeLS1!JeEh`tXnfnYGBrf0u50>kjDk1I??NHvpFf}Yd}O;Xvb_nS zKN$YIH_yZI5q$GJ^(@DWL#!WOyaCH0++SfignJW~L%6qKIeh4aAH(uR z)jn9hsQL-)T-Z-x`J(D)uzXSVb6CEp`Y%|{MSKCv7gfK6-4`~tQ>^u9*wtbA!s;5Z z<=!^SJhyj7umT%WlH9W_r}0^q(@wW=^GxHjEEkT?vRt@pOuNps-^xsGt>B?Id?7m(40HRCZ@5!;52?{&V}QL=A6bfciP^j@k4V?&4 zxFbzF+BAM>&V}QL=3Ka$rk!Bg>88yy?E=#-HtibIt~2fTrrmAY!=^oE+H8Zdcy6yw`t=|JIFNlKU}z@O{+9*x@j{_ zC1X&$J6nyV$gAOuNpsPSci|_TA7OMd!Prd*^pU_y5m^?gNglFGJU2SS&oc zK2H7W9F&xOen4+{bp4om*kj-2ryvsoD$ZSiO%gfRAiSoW~UQWusBriwTzmPXPy6%y8GqegP%NrhD zza}q7*Qd%G9$mj7FGtsH@`gv(Z_CTk^*njQqw9C&WqWwGyy4OH-{s}#`q%P?N7pOm z<>>l6dD-^4*mw=}p}ZVjUm$OIbloQ}N7on08y;PMDlbRZm&zL+UH?m7j;=f8W$Wh7 zI~BwaiVcf#bbXb);nDRlc{#fNt-RsU^_uc>bp1Pd!=vj=c{#eiUf%HNdOdkLy1q%? z@aQ^AUXHGBkvBZL-auZCu5Xt&Ji6XUUXHGp$QvGAZz?ZG*LTYs9$jxPFGtr)-*#lkFK|tm!s=t@`gv(+sMn&^~3UpN7p;Zi>|K5zzv9%eIwrvS|3i1Au?c3 z%mTQ-eq&%RG^wtu{Dzkq@o`+jJEcFAoEzD`DzbflWc$^~b_{u)fBx~djBM{4**-S1 zePU$$;>h-QL*H=x4)&vKsmGCpUMzB7<~fdKw+H{s(=#y^V?JCDmSfrVVL6r^4$HA@ z7A(iI8^Cfb`+ZoBrZ$A-Sau^=j%9xU%dzanuzSL80?V;%HY~@oo5FG|`$JfcWjBN6 zSax$*j%9xY%dzYhupG;73Cpo;4lKvATfuTHyEQC(*xSHzEW0f%$FkeOaxDA**!vOy zE2sbcOOu$CCCQpmqNr4akR_#}NDH#eG&NI3(@ae>B}+!DP*OrgdlE@SD2!HQi6Uf) zO2`r-WXb<|p7Y*M_q^`Rq~+`T{r~2Ezj;3AdEPtseb4ea>wC`eK=x%%0J1Mz9mu|H z4IulnCj!}*JqgIZY)v5hvbBKR*5YI!`?Pg{`v4hc8D+R8p7VU`v(ie8uugScPGBWQ z`Wn~IxM9YPFm9Z2lZ=~b+#KTyj9X;fa^qGSx5l`2#%(fgvvJ#uV=e5SqkLeMjT~%T zW#g(CSKGLH#<66(IA~LT!C?m zj9YHpO5@fTx6Zgt#%(rkn{j*ZZSfaah(F^h8&}1++QzYdcX5A?agB^)-gj}@+Bnwl zj_YV#mT|0Q+~2$1IF=a4?QFlZ&}Qqas`mV5>l@;dkiBZC0`!}$HN8ra1tPpFX-jZ) zMosbWmZB=f;HBS`?x{JcSni#kv#alHZg-fi@Y~T3?}rYv46t!Po=(RA`%EAm=2^go zz=l9N&U1iGf-s+hVLFaRm7|+p&~m$VIj(P@y4|`Q$JlY#O|kDjV%*LqW-&9Hg{Jje zanky2OY6FE(z>3wM!4g5b)DZuIbABes+vb*f#E5FOmK|l&iL2&K>Wvj{@y&w!q&7| zozl}%Qgd=r`|N5q2ru`yA>rZ{V>dx6^M0EFnJbzDnHw$wUIT0aOa`_DrUhX>8^g>U z7g+9~<%U8XcT=DyMh4q;cN)i`PYPP`{Mg1=jX4o2F9p!F?@tkf}pqT`YAx ztW8pUT0iT7;%V+EXq5|@M@ZC&o~1C?#XMKd33t#Ccx5*!nTEv0@%WWH{x-GklA zQgTwWx}@)7*0XxO6@EAR;k|@gd-+Ic-d}$pGtK~DL*O7FGtgilTYC)i85m~9XlfaQ zmaESl#|p=Btj`^%n9+3;jGJQD?QBBsn(r&-+lA(mU*hDF-z=A087G%qC62D~PhID` z#$>5_>cSi&H16d zl9O=*`Wu<)xw*TV`@*fv;zr|Q9Nl%%I|TCHnO_ruY-92>4Ec}Ga}SXDbp(+4bR;kt zcrTEyX%uh_@O~g2-UGl%L6~vDF!OOU%g3}5BYDR439LlDlIyOct8>?J3mM1J)j5t8 zljG>>9LFtW9LLmg+*`)IW88mb8Q9q(vX8Q=?@0F(mxKrIqD)%@mdnT}6Orr0v54%i z>--|pRVs_f0aE=U(p_pk)Ptq^MWlyRwjL@CFaNmFc)v2r`XYT^xBSl#ID=HPHSZ)2Vy-a`Rw)g^%9{Mm`0(J zUlklZ1AaX+sJKMvncA&;rmHur^d=D;O{cBO977y_!kj*yq85l-p|q? zGA~BJ?KDd(F_Ht#aeN}j-DTWx<94sD;HA3pguuhY@-c&B)871`(SPi7^y;t-v?+5Dvsa(W!wp4!+&seEk#B;7x ze-Y1ksa(XfWGhHed@mws`U&J#*Di`rw zBGq5S^Mq6`;<-$!zldj!R4(FaE7f1b^Q2Tx@?9a-U&QmYR4(GVN~*tzXP#6p;<;9; zzli5~sa(X~U$3QN)SOes;pHF~X_VX!_%YN1Zx%6QjkjsA7 z1G$LdGa#4!YyfiE&*wlc`}qRMWj|j6x$I{n@Iv5MKrZ|F8pvfo-vGJn=UX6`{cHkq z+0S=C_F}#V9u3?KgKmS2Y1J8NMb3R>>y3di*h)Wk@CyKb;?BaP#Xt^4j| z6R} z9WJ#CEZ20%g7v-Bd{`r;`px&vQrUdJPpaR1|3xaB@1vzIf#v=(o9|ntvibg?RJsJG zvibhIRCqHrS;&Mp4=RI9&T3&V;O#{;S+YBI%FOGTk)0K@h$9K#i}MM_b@0>rL~G3x zLg5QT;q*{=KqyS-$xrm}EpkB%uZ;=2Azu#Ks}}bHvRd35$ZD|^kkw)WkdAgAAgjkRz`uepNeAH+#SZ)5gs=?j_@1HSS&Gc=zt_eQq3ch~wDibN7-ESc#Dx z99$f)jL1lK8L<+qZC*y~2j-Gc+qo(@W>myZWJnPikqZDbGt;p#;B~2K={YH#vb%N9 z*nu7z;`mTM;9qf*^mi1M7}bnm+>xR7BasL!wUvP^wZ{NC)P5|GrMC*O zNf2%tgjotNwM3)kCg~l=NqWZ(w(A%(j+=?QBW-H-~=Iv&=1seXIn2&vK1zYS<``FC+#=(a8^;uNzwxDU z-x#-pUh4&A9KQ}f%F8%(nBlcuv32;+qBBmf?5=ppEhXlhx9a$VaXy935^lz|bz-jP zZ-*xdn;}7%(JuxfB_fvu3Dg<^H%Um#RRfOWQ#o#UV3m!~cRB8V(PRCa-m>Jkk#+v@ z>}R2M%mNikzooZWToQif7!^;yrB_uP>zJ2xonOaPlgc_~nN+`ysUbBV>g!VdI;N&n z)-i8N_3N0ErP5EWl)41g_C9M}sqC|^lDghh_CHRQ`UkA{rTSA&XGrCg(}z<1DW@}~ za>{9qRDa6p9I2dgS}WC`aynlsr<^{M>Q6Z}mdc^1FQocYPR*op%IPbq{*+U5sho29 zR;oYcbcs|>IejnHpK@v?m4i(`O7*9l+Dhe=)6Y`{9|R1Pe;RN#AMS4xex z1E%8l!z;bGCkpGwJm9b*+<8uR$Go1oS?N7@_sclNEtCAeHklE#lI>HZOZ3BZV%2vz z2ri)HryZ&~rrni5wr$!2*|xa~m<+rc$hOTjK(=kJ1+q<(4CKf_3XtO&9e^C}PX(S1 z>rIuAFn+LgSVix5Btp z#;rAOgK<9?x5YS)1Mx4Hjg$_o#K=L$RWy#i%w1Q_xVpyGH|~7nnizMPaqWytH7?z_ z9>y{C-1FXM+(6^*F>aJ`6OEf{96g=8=LN>?Y%{6QitmrQ9K`S|zQ4pJA(F3^Bl9c1 zWY4)3H^gyw5zfu6V@t`*?v$E~;m=)laogwXaOcraOBgJ`Wq^$XG7klS1^5Oa3veGG zhd6EmvLN3KY!ZZ<24NPMwpL(hxwft2*tT`tV7rbnacE=$|iSJseY5Yzf?B4kC*Bmg zzsY^OR5rP5O7)xEcS&V|WtGd__`_3M3&GKYJ_o#~SO=4n;?CyWRR{mSz947&@YyWH zUG&4aWDUidi1h zn38Xoq}YGzt%#Dm7B{aI+Ko6_4OqV$QBPbF{?OfO%K8HsBgL^BQD4{j-H1_AQ=y(A z)$c|;AT=NASyBhVat-#Ou*OPdH{u+rem7#A)B>pIOZB@E6Qr^m(O9bAjhHNz-H4`A z{cgm=QrV5TNUGnBcuXoAEG?z_-H6AfvK!G#s^5*6EtTDfHd6g=#2l&YMqDn{??yZ$ zl_U4SGU zeu-3$++QcvAGv>7Dqj}qD%F2kwNm-ANPnsR z%OdNf@@0`hQvH`jK9|auMTSWAUl!RYl`o6jCDngf$f1{>viYOXbTVBc%E- zi~J~+=c$a6>Yt~wMJmrzc|fXvp2}9K9iWbt+8LHhg>JBZmwGF#aZ(4GdKav1QpdrX zD0PadkHOjtE+`@L0<0-g7n}MjtkP0Hf;CO*I#V~o+E?oDupX7V7rKM)uJ(mhR_YP3 z9+#SA>ItyQOKkvameg}iy%5#`Qm=&dq|{_n(_vMR+8fr>Qg1PJ0IZ5q?}If@>Vu|E zhIP2qxv-v>`kbkYU>z;>9at|){lL_S?gfm5Pj`p_+Oy!Yhv2;41t`q$O}fQA0K9T>i=ZsNCYuk|CSuYUuf>d-#clSBJvC zhQgKL#bd88IVQ-Dk0#8n_(bC~Efnq_3Qr1!7ly*0hQfb^!j<7&Vt=n;D11#Qd{Zbq zCKR3*3cnu;{}Kux%HoGl^m*%t!fiw0o}uuFP{XFmo;0r*`dKUmW>-{2-v)&7U zob6r+Gt{Y+8IO8T6H`BN|#uXU1$hhUktu$_paqEoRWZY)swi(Ahle_2gf#vq+c3frS zs@Qe4jjLzeImR_I?h@l#8<%WcN8_@L%Q22Usv!Q18)n=H&FyXS3W9LulcS{ui8 zRF3OtT$XV;#`QI>pK-&C8)4iy<0ct5)3`at6&Sb3xaG#JG;WP?>x|oE+-Bpp8MimQ zhl_*qfra=puCj4ejH_*2J>$+Xu90z<7}wgkWaBy-$KIWb(;Vaa8rRRbVaAOxZk%zG zjGJlP9ODX%TV&jF<5n8C#<+FHZ8C1NaoddB8(uSrzraHL8CTgj_6*&1wT)xT*m2E_ zYq6c{|4sE~-mvt*1;KdV0rxIw)_+O$#qfZU_4WR~7^9Kb0KW}awJhT8tC2-Dz+JmL zH8;CkMkl;`mB*$3Zpw6zEXvpnhmIJCYynmV{u(&=D-m!Go>pRnmAd2jbdKYjCXQoO z@3@_v-zs!u?{h^r;y36G9SUosxFlFjUBAfGIx1))>bRrL-fOY3NKOm3yHz|+`Fc0ZIuExM7T7Nt*(85O@eUK zAk5miy(JzkS35hdU!c0$*>Q{^cikiQT`qWV+|DLw$p|*0uw;IVkrb68!wF@jaW|sx) zN~!snP^pMI~ zq6DdXqwVhQid%~HmdaV8GE)6nqFbbLmMBrGKTFhKDrbqxN%d!mhDhZs(ScI?!g9aM zRnNnua+auqRDYIelvK_V9V*qIB^oQ0vqXnW^=FADN#!ijQBwU`qG?h&OLUA>f0k&b z)Ot{>NcCrl=1Ao%Q8lUlEYUovoF%F*)t@DLQ7UJNPLk@+5-pL+o=0t|{w&dJQaMXh zSE@ft^p;f45}hiQy$l!6+*0g)shlM`U8+Az^pRA~5}hg4pCwu^m9s<*rTVi(UrFUG z(Ros{V7cGTgY}(M&JtZ9)t@EWB9*g57fSVKiT;qvS)%4r{aK>D(LzgzaF(crRDYJJ zj8x7NT`JX|B`PPCeSy|e{aK=erE-?2om798=rE}rpk67}pCw9?%2}eTrTVi()ueKk zC|RmMOH@-TM2*+4MyiF^ZodMNEx$#;QMfwz{B0BUl3{ujdw!zBswKnpetZ;lq#;+* zmSHZ$CmMgphr+uuOz%26+WLUCLiEGD&7KZ>DwzRa4m}y>_XB|yfCmLVoP&YM2v-2I z3wj8Uoz03sjw>GuPay1~wm5&E#*8*}}xi*j^Bqswou3QHQXBVjpjOEid>Zgs z;2A)UFE;=#2*UIo3^SguvK}EV_l||*_>P6+2HJH)jN`jq?z+*&v8Cd;>BjNhF2~I? zZmDt0jN`jq?z+{+Z7^=5aeTMSUANV^(nuf2u^mGzF;daE!;PzETn*#u8`r?NCdM^4 zuAOmg<+$HSH!j0C<|TJ8eT*Au+z{hN88_Ovsm4t=Zmx0jj9Y5lGUHYmx7xT3#%(li zi*Z|xD~IRvGBbi;qCBZsF*`|i6bzn6V*9g}2y3X%?ULZ9UYB#BV z@3Xnoe5l=}`n}IqQrY|LDV09mWnuO{FPB;XtC!Rzrn2{WwN&;#`$%1HDtn(Dr7{cg zwV`kDuURPj$L@%CKdufwg|%&QGFnb{UT#L#u8zCz=@*CC+}VtW$&Wq}Fy4-MEm5S{ z)@cQ-0K5#y(cIR+WMCU0+d6H5EK==&Z0lSOWLxJ7Aa}%T4^-_4{3{6WMQ@KV>-=l1 z$kIxT++f_zft47!-MG7qDmcCa$Pz~f&`;MjgXN0prLc0O(g6&V z>N|iwQuCqSF4cDcJXACxLI-fCRNn#c*r5dc&lTdgftQ8~F`IPE#EbFo0bCt?;ud1= zLzIal=JHsJWn^KW%d~&HEURn6!rDE0=RiIaJ0@j;X#t;#!o=rH16Ba016f!*16f$R z09jbC1G2be0NDiY3S^jOt8x7UD=~7naU+dmin;GjHtq@I zo;2=7DMECbt5FNLJjh|tsFq8O=AMR$hJ>$^hG!A8)s^FNh@YIpf zMP(c;MC=)D^z1}yhlyJU|DqrME)%yD@VJ2NiNxT&^aApJ`UHuSY>7iFQG1y>j!)#c zy8^3hWVmrV7;*Q+i8wCG+#Yd#@F&AVLa`Ayruc}9-Tl5g{#=|-VLN~A*z5er#)`cD zLF5ezA}_@vkCy9dI*w1}I7XS{_&UGi{uf<+!hjERi3yccu1;W6Fe$4AL<0DeoZh_D*ei2seVoHl+*&K4@+GF z%iS}Zg7c-a2(ht8|8iESxYNJTf3Cy7vA8<;{Joy&lhx_J?4$;(BUtF8A3hJ=$o|00 zfEn)gQP4Vx+A~I$!cHK(P z%+%gA!K(OO%%^Txl=V|9{EL2gKg?KVfQDM3G7K$u;GN_82C6&o&T)(#cij~G?jy$SV4e1alEZHdyzV8!jrfz{9VBAwGhIl$lJy7qaA5cJr_h^K@fopg9z+o5lG7&aql=jnd8_L zaNGmN?RHl(S5fV|l4r#w;YUAEr2DSq6E7j|##Q0Hq+?yl_#ID(|LCdPuOK1lN?rq2 z0KN{SD_IVtD|r)0SHdt|3Bzzl9v(Mw?v#-Umg||@GHG{Rium6Kow(yon?P4mIn*1y^AJ)rK2bnq) z)}KnX}kpnSfskK85;l zo+prlN)>y(?P5i`y9e~PSIot=_})e7;4`lVRsengWGVU(m<;>~$QIwnK(_eS0NJAY z1jrWOS|D3|>wupIVa6ZBEOqH9Yi{)|Emwg%u5X~a3fyt5z}KfwEC zTXa8Q+koGQtjTBi23P_3Es$A$6EGS09q=aL4?t%9&A|Ran9t2Hvv%jo(X36&Wo^gx z4OEx49mlNgu4C4A+&JTywH?P;ch}K+6$N#g!ya?GZ%HSTtv$?$Q^fMpt>!{9CwFt_t|$Di|)I# zjC;zsJ(OdLX{r>Op*F$29*Ksmb6RC7)o22>I@c_1Czfj~O8gMf5w4AZeO%q)4GWl36z zk$%Pv3arG)2;-O$-F1_Ud)T-+#xeHYb*~%umT^1Szx+Xo?03#D^Afo?{$%*D)!5EC z2N;7-p$)rU8R@-urf0q*{mR1-$*f_I1R{1Lm4isnut=xn4v%ykpU81{1(qABcibK- z--Q<7pOgZAjqr=OB;4JVN(;Y5a;-SFNPg3GevOdkr5-a=qfime1jlUM8ULmhm3kT7 zu&AU*UV2WSf2}sChScP}RtHu9)&Q~yo(N=ZP!pI8tOaCkz%ZYSVHUmXEf>&AjN};C zE3jN~bk_|sj>XY&j6wI^8OF^rZV%;_VrqjuDi@kl|BRDUBd4;9n1uMaE>2F(wwzi@ z*ZDcMmsD0Y`$+Yxnj59&L)}j*)5djr*>TO6Iv&>kQm2~AR2n3;0M-Fg+49>yH8E5w zeZ~*?w+8>ht@1CyG1slbzlVz|AsDFX**QC>TT18j^t6ttovt zoE_T%!Jm#U%$*zxFNz6oZ+8{faXl3!hR=LDkR|O5AWK>UU^4JbAS=1Efb6)Q4P?i) zA&?!{bAcZK&jWrMgc*Mfvm|y!`EwmtTCR2PxW0kvTKA4)>)u_*)|lhQ8OPSWhe6BWfJ;g;`JmiDWO(c)N5 z9H#61!Z%JT3*V7a{lYgzYP5(jlEXzLww*Wa9~F^P_HYr|p5;5>zN4Rb9oMGFn#}SS z0h#451~SXH044)l0@=R16v(XK3dr^y!))I%%&eVRIhwU;xvcHDzJcnpw&R$!-F3{` zjvHqjv$o?H>+U+bFUP%N+|FjtLNi$9I2r6%%V3Yi$zZd*OmaVNExepHcKG{|f0RkE z7^r7%YF4N8v|Y?C$_;Esw!**YhxZkpQM&?($;@ySkeT6XU_;=wKxT?$V3Q!+Gzc^C zyIJDXa?4*GH#kreBO~oP#*({^^_07AmT^0qsJqr4C^SnP7bi=cU|HhnI9Z}V9DUA- zy3Y4GOQh20)ROA^oL9W;^cb!RpK%xKbEX%Uow{dZjZnAL+?j z`ibXn(vgLj#jXP~i)92^>v~`^!d-#%H{F2rH(5aX8;0p`7-p8svMfi-oipM%e%o=( ze2(LtIF6amabt~}W*lSOUAMqEdLGC9J6UtrGWNgu?LrGxoj8T+6f0EA;}oiQtWcd6 zr%-)lg{ncELbX1JMZ6uYMVS6k3C#fHUYa(^M zsb9g`D)kRo&7}Ho8b=OhuYqqGUo6#s(>OtDwDEBut_sg@Hvz|jbS{ufn1avW#vk&s zGSoW%`}+||(eL>9FSO9Mkj|zLkoDM&KsuY7fOIl91KFOx1^67WFOY5ITY+3do)6@EbGHHO1N#H{{@egy z!ywFbV3^J++nf_EH=pmg{6I~N+-2ACDcp6u2Y1~B<5)*JZkBP+8@Ir?*NuD2xQ~qc z)VObq``)-ejAN|3d)Ys*%0`&`9Cw^?JbJ}(|Bh2E)U{lq!sPc6E)$o8hb*gN<@XT| z6vz6yt*-Oy>qDicLcKz&Utd?28ZD;9^${LB5P!yf{#H!gNwg_g!IRo2_9dpI=r?@a z4TW^a`v`X;TeBDq1F{(14P-GI4rDR92gq7?B#_1FULfmihFNDbToc&ciUlp#M{r!< zKy`ft$FYy#u45m;apR0*AHi{qb$1<|v*XxDaNNI>J^#&Gch`Qq(1LYUoPu?&6|5?8 z3RVp(SRLXNtU6Y(I>jkir%KI7GIo~g*V$)FWu2WN)vvS9lUe{ZQ!2B?_By+%RMy$q zQvEu+rBwRE9I1Yt-9{?w>^!M{oqeU$s52;!tHJ{Yv32&09dHJ@Xt{SxIqlSr8M%A7 z{r*qK)OM!Ec8d&$BW|Ogcy;zzI14(PaX>no@jyD83BY9FL?E5aB;bR<$w1cGQ-G|q zrvh1LKMZ7@Jq^e@dpeMH_M<@7*$k`g1f+B7Q8_w*LCZNO$Mp?V=bRiz=j5)Vb8_4` zQZlz6Y<+BH;GHa?Ip{d_-&QW;@DQ{tLyx>%JouHq24CdZ>#i>nh$k= zRNtlcl1i64SgP+*`$}cTy+f++QU^$-OC2iJcd55arAr+y)px1GrP8I2l8_sz(p}F3(p}F7($zf&q`Q6|NO%1LkZ!sF$gN3U1oi|j1m*!30dESzOgDz< zzH=%^-8U`Q<#Jqppt>%X<5&r~>v&I&n_%1w<7OH6ym1SRd)>IVjQhyAPmTM=xbKbo z!#H-i+`X{NLc^z|j`~fhbksAY`i}ZN zsdUt{rTUKgW2wxTPf7J1^=DG)sGpJQJL<2cMx8C+>kqG&iEaDxrMlo#SVy>HW_s4H z&U?_uT^RgM)W@ZV!UIC#$)WI~P&f(d9ro(Kmr~qHh5o1g-$miLM0FiM|b_6MY9rC%OvAHt%~tI@9-oZ1XbAHZQ|; znmx^F(sJvA9LM!Rj_YsN4K{A1aU4!}*D>PUcc&Tmq;by}x7fIsjeFa;_l#R_+!x0E zXxuNxmBRD5-({|I_d=)XI66(ol{iC0**|cG#S9}9>MQ5VJNUlx1#wCE{U7Bgd|&yS zIQq&3y3Y5Nr7CcoJQeC&w=!?UjXT0zXa05ZUoZ9eg&k5{TfKm`VFuxa1)Tt)$f4U1YxER!}PSd z=4olU7sVWRYoNLp#T<9HabxYf%*F1zoTPNuJz*U0)p0Kx_nL8U8uy`bpBVSGao-vD zyK#RRR~FCXe&c|^O4R(7&`H)#QP!|cc1qy#yOYBjP1WFmc)6T7kK-&AiUH5KY- zQvIfSTdDa_zmV!T)sv;Nk@J;Qzp36)Y5~-5rTR_vOsQ! zscfqMEY)wS-zt?&^{rChDlN^5@CiMnbe@XQ>{2wXxeyDrbX9wpY z`|cE24@rF*R%xmJhW`_#u7bL+)DP{u>tM~0$_@X^O8w1L9t%BJDmVNuFZFO(?w)zL z;XJ9_@c$sG{)YdHrEwq=e_5&A@c(3~{)YdDNacqA^`!b6{vRoo8~)dq>Tmd8RVp|9KSQd&;eSo3pFurK zs=wj?DN?!N|2b0q4gVWTtpfFYss4ulO{8+e|He}N4gXt6?Etl@RDZ+&c2c?F|3y;$ z4gcFq<%a()rTQEGcaq9up<78^49n#W9t)i*mB&K2k-E-Q9t+)5DvyP}T&jO8^es|( zEOdLR{;|*lr1DtkYoz+eLfK_X|St^f( zzD}xtEcD}2c`S5Sss6FhbENWE=q#!JvCz*+<+0E`r25A~FOkY)p>w7B$3nj$mB&K& zmg*l1{kBvd3w@(h|5)e`rSe$lTcrBOLVqTe$3o{z^^b-AMk(057okA>b(YBQ*JOT7e^%XRHwRgl^R)(ENHOwEOL zgj8fYy*||(MtDEMdvFzQI&vp)R`G*0-E*?LW4=0nJElH=wx} zkOP`~1392s3dn)X1R&?zO9Oc%$UZVfIJc;5y&G!$^v;L$o@bc z2~rNoBSFdoc_hdIKpqKlAaEn_ARvzfIT*+zK`H=wB*-B^9tlzrH~@GkkVk@40`f?Z z!+<;zjTq(rvYyRo&oF+Yycb*gjvTh z%z@@S48girOli6OWgXWiP!l5q?YbexjWTYuaZ`<(Zrohs<{7utxMjwzGH$hT8;sj% z+!o`u8dn%jB8?CbK}|>*WS2v<1&oPGp>(u1C1ME9Q%Xr{ze-&)wt=# z%{6YGaZ8O`X51>{RvWj$xQ)hbF>b4IrQuhC_zNt=pK*s9SIxK@#??2jfpJZYV_(w6 zeLLgY8%KZVemBE79v(x#OdVL#MyX~ylLNv1-_&qmc} z|H2>V3d+y^1=pYKdzEYpkyG$It3Z#p9?~!70t~_VAhDP+4f(lG(-g zD%|;ZySY;lT^V>K?j!o)eX)hIFR(>Go`)KV_j&=4EtJMUwosY?uK_j%CIg!R(}Hm4 zAk3Pq7t-0)WVGBi^NzbAP!si{m*Z|X?q2&YW6*tfhHd~upX5<$W-n-bhT7Y)jTeh-30f$bhD{a3t-KXy2MnjN9ih+Q#DUYU2iH^Rpm;{i&K;q;jfeo>YITW}s9~)jTiNpQ;%uwLR1qrTSAfqoi`GW|35Xs%DH-PSq@x z>QB{7lFF%?SETw=HPfZCG5?xWf2!t5shp}=F4do^nJ<-7H7leZ4$H+er)m~UZN5aCqKH&XqnnsQQ`L;X&wKUH&(R8G}w zmg-N{93hocHCv?mQ#Hp* zMqL)#J8wEfHtZ$?=M>)v&F#}YJ*8es-8#YlbJBb5<`yZ3)zWc8{6vS<2DqSwCx^m| zLgBTca0G>tpXlG?^0wIUIic{ip>WACw;x}3q7cN!-=m>0d!DiSm!a_PJc&7Gn6-P5 zZ2W2FYj$Ezg3UFg{9KC83G;euAUiQ_fb7Jy1+w$f4#;8F%Yhtby#mN#)+>P=W^E7T zz}8hj4zpejnC^9A>=^$YItDAO}0H2XdITE0DvinLrM+b_1pZvw$3C%?5IqwL6f*tUZ7n zX3YV@MMZi7In0_18#mXug~ly4ZiR8Hj9Y8m2IGD(Zi{hy?G?S}(t(v2Imoz* z#<5M}o~@d3b&acU-1){eG43+s+8LK>T)J^RjAPCT;?KB&#@%DwDB~s?H`Tb=#?3Wu zp>a!%TVdQPt`XEjb)Da7xuWou(;L*=edS)$cStDwUn4lcXLC z%l$6519(y@{IVK*`+*6sV`u`772vtNx~Rq;wzuw{os;W!u=yWv;Kei$hU3|zAI1e6 z2+UCf0`fLgXpEl$KsFEt0@*+q1Y`qYFpv#|+ktE#3<0u%a0ieLggb$3AlwCH17Rqz zKJacJ8w$gLe07gurUApOKyR=Ll$M+4b6lT5b@P0V8)6)*Qpb%pj(O2>(~VbQBv zEj4bLajZ(+b*qirVBALISe3f#wi;I&&*M1eJX(p7B;$@VuEZfC%Km{v{NEiOE7XusKhY@j(@d~ z>W_bwlgjb0OQrhbUx!HL_*ZMG{`l7sQaS$BPO3ltRZS|#zpj+(kAKya%J$;bQvLC- zQ=~?#pLASxerT-WFK~3PoZRMNtHI}QZ;kiHrX1P5Q?TLb|9I8Iv5Y-Awh&XbEr`Y@ zknzl_ts?BF0{(tfHH`Z)Kvr#ISp@+f1SSI?0}U~0+3bPL?E60Bp|D{ z$v{?VQ-JLIP6g%x9|p4TI}OOb?;}9=eWwGz13m_1pJE2^mmtjiz%Z-AKBzd{L?Nxj zNDt%k0?YL;-E{+vyT`5@W!yyLSgPIMn{C`&;}#mX)VLMKtuk({aT|>L!MH8P?SAyUe(D#-$p^(&xU*p)2K&LN_FN6z#Ld2cY`ts$y{qZ2^tMdlV($lEqgNy|y?o#OT}b;Z0oz7XdVyvSTO zkT`^=Y`+-S(D2`0wpfnGv1( z8m!}_vKw`$)b*xvM69+{cB6(#^}A80N@X|d9;s|nxxdU2u`{Kz8+ET#zZ=y=D!Wnl zOZB@^mr7+fYK&CB8+CUX13q$c3MY#v^OtHOs^E(AyC@f`5kBAj36oYXF= zX!pqKzyGzlR_C4BHef9q{V*=+oauz81mq`hu8iMxK=SK>bk3gv>6|wJ>6AYQvb*yI zklmdxf$Z*V1hTvH6_DMXuYv6Dd;?^6=UX7VJDY&)?tBNF4g3MfZqH`mydcapW|+?Y z7IXHr++m)MyD?DRVV;h=!?^qGyJL)d*tkcHd)m19#=T_RtH!-+9G}+R%jd?i+&S)N z<9;)4A3Tq{KW$sh*v39OA#uq11tuDK1*D??R|qXpDm=@i5~x#lLw)6l^wWvO8X%-YGZe z1npwOCfaCjh2M>ScrPp%Wq^$Xaw{?-@9z&F3&x+ohQPmoEFh7S-Kjtf^BEXs#_ekv zmsVngO=QR299W4FHjy32m~q!lFpfpjal1VsAC8ld(=8!;eb- z$oWMiWcRETZ0wzy)g?21SBIU+^zNxSsk!MXJ#*8uI%Q<;hQg>9|B6e8}2{x_7ATL_e6JgJdp0}1R&j5bzm~E2JjZ( zi9psVCjpt)Y695~tp#MOyEc%m?vsIRb=Lv1)m<0Z6L<=ct?yHTHwEEaf-v3VZRQ?n zx#J%k*Edkz@eht0X51M2?l|MvwszOeG;Y3e1;(*$?XFvH9G}T?Ym8&t+HsqV`^~s* z#<6YfuH*3!v=Sq1TRX0@aco;Vj=9=h*Vs7jAMUt4JyLinb0#?EzRvjf!VZ*RcOc6iJfz7L95n=r8_PZmIhpr< z4v;11Tp&x%dBAIcjeyC(3xH`sn9s>Db9_JK57!`|<)+9SH!x7$5=_T&=+Ip^(Z0(V zb=>pDEii5m<(^_H%Muw0@Q<4qC9zf#YyTUY8J6VKxH+}ZI`xw{b?Q2+Q@N#cxK8D` zTtb9(>V`OVDqDeWJN7T7`h5hpEZm6y*HQ=JuWaul)RQ_M+$O1hAEANN0;oSoU1Hy5 zAAxHi6C!NS|0LD#BXE&JLWF&UU!?kdgcefSNBB*u-$!UIm1B#4O7;5)S4m|bA#yr@ z!|x+-%rPOt5&u$B{Sp5zQaR$kk5qreKU?b4`0svF{e@G#q^`n$_m}!1EEkjOV6o+z z5aEl12T1+R)V=n`T2!fgaqwWN{)>ZmO67}#6{Y$w4vv(18Pvn1`Y#TSmdY0gkCf`a zI5c2SnyHvh7*hH%T;$Q;e zFd@Ph2b)RtUmV;|Y6qwnOZ8tIN-<5!m25idpuqx)!*ZhIXNN1Jsz)>>hJN`Kq~im>>$>a^$2fkfTBEfE*3F9LUk2D}a{+uLN=ws6CK#uvY;&_j)yu zzWy5E55Q}I^mfTWzHXTUqx3&__kvw?iwvOAEkTlN6*b;}$e zU$g89mOVs#|E}I8L~@>o{8AxY5Q%DC0WZ7^=5aa)Yr zYFufgr@I%vW#WFfqH%{CSIxK@#??2DtyA}1wl&?~Yi?XS%cu*MdR4E zbX+y#Y8Y4FIM&1Nx+caoH?Ey=?Tt$}F2lGyyFHt8W}zA1?k{8Q0dhJv7!< zXs@!fT1);&ZH8-oq1>_e5bjl8DXtOJOkL-X)TT&y0qLXW5;m`h2sX;b+;SG$!&KXW6)hU!?;<-{ikzFcAVUjW4WbMoZQmY za!X#E+>+zvma%xQ@FadFIHmw&bwN?N1+NXI;;6}#ysV7Q**Uv=|82E=b|lA)Ku+NO zjsh~r+y`WixgW?JGaASoGX}^U!!VzXVdj{DmSbqS$$iJ&6sU<2PVPI7ll$(v`;B8P zI*$3oUB?+;$L-+jA2%qm%HeCS<5vmR4PIjP0@En8{;4WB7Jb}#WMNT>#UnveI%Q{O z=cr&;$MtbOg}wdZwpEV#0)LkcPb6!@bl=K_0?kFvNcb}2#I%_-Pvz|k$(q|O_>9bx0 z(q}CI(q}CKCIc4(>9ZK7&tjN9>vrS;H~&b>&A2CpPvkf{ea8(qZfE^fq0Q}~ield(4HuV$ADyAd_8robUIGlk zRpFt_*maIC6_o()_}HGg*?6yDS6kFELqV-@PtgzWCA{kRGb94t%NIbpmoI@0fnNdX zX1)eC3BpZ-Fx|?XmT0uxkcH#=1gaada2#XCT{pqLJH@!&o{%HsB;?`(6_<#ckw{F$EkGvX&p;;PuRtc^Rv;6R zVJ0HOOvJk^5ox&|kmGI$RJZrD;}|RMI<^@cH^I2wo`|F4B;tdXh%d)U#Miw^05T!>0Wu-W0GW^sGa(sfLJqZrq~%JZ z<5(IUH_)zQ%s6g>aV(9F+wBQCK2AbTvV?pmPC|a*CFF42T8mJdJhn70D>5Owb~PWBR3nDA6SVx zaNAwS*m2h}2_5%{aXXusCF?&Bg}ZxwSD_7$sc}lkBUVDz$0;FSiED&=d`#E*J)!TU zrb3-5wF@lQi^_uatJHj0v!xC)bttTDQpdx3O6pWoXTVB8FFqks0P7j4OHAeJk#bT$ zhBaU6dQ-W!_F$=hzUpr-6E%fZU21z+FG=-R zk8mY|TRpN&s=s>V45s!`}!GoJ<18a?IJYSBvyDS-r9|^Vs>{MGq4m5oI_X zcfe0{Dsg}dT6l6OyeJf28w&5vspsvzS$dx6hw;Yd=D{G?V&LZ}_&CPpF+lpnBp`j^ zvA|?t72qwvsz83{I3Q;ps{uLlcs!7EPA334^H?3ona3JH&ODw7%mbbT909BalZ<=VxH-l>Z5&g^{l-hitu*dk z!`39mjQC?(elSZfEO}LS5eL zDvEwz>rHVutUj@!Y}hLuW+a`>7{fJ(3~@)95qOn4iys^I8JahH+Ti%fv-eNr;IMLW9H zae16ip(D&YG{k%XB9HfSA&~deJc!JDEHY`iZLA!}Cvx0ff#r4>a@@|AfIZrhDztd5 zic`Gax8l`0PVu@@Tq8XBhq}&hQKU#sg}O$n-=g5kJ+~fpt<*ud&gC1nD7cz$`}-l! zfC-OM@l75U3}(|eipw{!mxQk7-?MtzvUPx73`j>29t%315iw30e|t&hQiMLY?4(7QQehZ2tbrfF$s~=0;6Pwn5ax3+%$zaGat1Bu-yPRGP@R8w++gEI+IJa) z?z=OLn`PV%Hu$zGp%_Ek8+?y=33W5H@SZAF!LgBrJCCd=GNHQXUYF7_J1;A(C&tEm z=F00<$G75q3TgMT@~sndIe(jpft$2-1$QA*c|Ugpc~2vPNWRY^nU>ol#c_Np#|;mx zvJuYGIc^UXwPH$QiHro;-Ggr>ky;X|CGTG5mK1}MVo*{HN{WHn!hcm{VJOKCCE1}Q zJCqcI1trCxq!^SGgOXw}w4@l66oZmtP*My^`UV3_ia|*+C@BX2KNo{S=RN<>l$gIj z;V*GX7&YNOQ{lPox#BqQx%U}V{dv#%Qn`kvwA3!J++-V9lLZv zVU?9S)l|;;y(zT-R(YvQOy#QF_oaRe>maG?P35ZGkEQ+r>kz42P3Z1wKUf>2a!9BG_4jluBlT&h z$4h-4mb>T0unv&Qy*O$}_4jnEB$a!*)s*_1eV2Q>aTl0`2={b5S?b}i++XI-TE|J{ zPFVG%o?+^_uxd%=t_=01`g^*aB9(i(ogvlV)2)G2?&)@xRPL6PL z_4jnkl**N1t)%*Uy7iRGJ>A+!_4jnUQ7ZRzyIiWjryF-hONcCm+Fq)^r`zpPKZAOW zRDVymyQP-Ge^aFTd%E2xwF>^*QL4YE+Zd_m9#~F_jKzm)!)!LUY1 zJq(t+t7Bl5lUf(nD5XW9SR+N zh4qls=V84gb&;vdU`>(wA*}bLt~K>bSTm&l2I~W|p% zOFaYDr&7-`wF#_+Qm=ruUh1``romb!wHK_cg7v=Cr(k^} zb-t+!VSOz1ZCKw)U2W>8us)Nz8P;a0znc0NtgodWgvGd9q*j9EVxuywAEefS^{dp= zOl=5@ej*`qDXib6wlnn_Sbs^)g0)R*uBkV{NT9sdNL^v-`>^Pr5+Yy0N|gG&slULgEOo!K@LW<4faRX|P*_!^R)=+<)Y_)j zhjpUVrm!kVZE0#-SSL&E4C_#-nWpxHRbT2rScgl!)6@~L&Xzg_)=^R)HFY+uMp75U zI!5X;Q{RHsTUXd%k-FFZcpFG+8CdRl%fo6TH3?RAsmGgI3s!rn=fXNk zY7x46C-(G*i36>LT?PSaqfLH}wu!-K0JU>r|KCwXk-8ODL#cn6x(^0u2S_~()_GDZ!*a1v4b~k}Plt7Z)P|-uhBaL3 z<*+W4dX1@_VBIG*4_0%jH<{WG7Hh18$i1*yNF8J9L|BuhJ_+kmsq;)-0Bf4mm9Sb% zec#kiV6g^Fi2MMnoz!1U-3E)bVnXD=@~B;;9tz7n@6oX4Nj(|X)l%!5dN!;VrCtIn zS!!ETuZH!q)NZg+rS>%SMp&$Q6C!uPN|QRm)X}h58z)2_gVjaqY*U|w#Tq&x@+z$B zrM_kAd$86>-3Y6j)bC9F8P*1=`=a~VU21t)?s+T1+9>q|SUsiIGWAqg-$}g?Rxhb7 zOl<>ei_~;jeWZ3ZH3!z8QU}1gS?V38-UDlI)UpYY$*^vfI^EP+u=bU@2v$F-ubBEK zta4JL;dt4y%dOUtvvSH2x#v9!)~!-&!zz$^s;Ote8Z5OXtc6nBn0ghg zp;9wpEs>gIY9Cl5q}~bZWvTa=`T(r^r9KMlRjIQ~eFoMzsmox!A@xmD--X5YZ9?Qr zSZ_()Wa<`Jk4i0r1>&rSUn z)`wF6g7vl3(uYK!cYj!)O05iQlhor(JqgwqQX9hhLFxsjUIgoFsn@{zNoq$^Ghl6& zdK0W)q~2!g?XZ58ItJEnQYV-?4c0cP^I-ic^+i)(f>j!=?u5wuuy~kpLS&7p8(<|$ z{RLJjsehW9fHhYKN<9?TK2nc@!>TTI1gwLlK49v2SSL%J4XdKmXG|@Cb&AxtU>zp)T~j}X)j;ZZu#S|v z#neAwoh!Bcp=h&8Jp`6}-XmeLr zwI8fTQg1i)Zdi9qod~Om)M=*9gf&X)0$9zYzGUhfu*ORL1lGk;H<msYk=QOlnnAPlPo?>e;Z`N^N9nb69hvUJdICsi~%32kRNBH^RC~YQCw1 zVZ9)AG^}f-jyLsTSWBfo3#)_F0#ld5dQIwkusTWo*woKpt&sXNtj<#ZFtya-@Yzx; z!pe|(BrKQuRbYK2^;B4yQqMH?d|2zHwtpQ9Uz{-<) zzp3M3{Umi3tQ(|0ZR!iKIEIiAc@x%6QdgP!5v;w?yWai=?{c)p!yEN&#Z_oHMt%gY zL`x?4q~Pq`-p#Wza#NbNNa4Q0X&E^@SQ+~UvGF%16rL9fbIdIE`d>ofLs|6jiRK@U(8Pw@hQd8V;Sr(m>`?fvP?-J8*uP&M zEv49Stx&i{DBLv^z9ST#9tyt_3bRER`+NJqd&P#Ug~E+PVb<-j*RxiQ4YNLr4KE0V zKM94mg~CU}U&em_>`?gXQ254BcyuWIY$*I*DExCMToI##vA=(6DBLC#&IyI@3592c z!f%Gcn?m7o7_E!_{hFch#i8)^q41DU_>oZf2xKQ|lP`G0#d|N0y zAryWw6kZbw{}~D&g&H&Ve$EPouL_0xgu)Mm!q0@l?}ox#Lg7O&o)r80r-Z_-L*X8w z@bFOhiBNcXDEw_Gyg$ZwVt@anQ23%yI3pCkJrtf63cnNzZwQ4Gf)+{CKUNKe8->ED zp>TdEJU$eTo=Fw``yYq&KSJRnG2#&$A7_Tb?L*-kLgD*E;ip64RiW@tp>PF^K*auj zy-@hFP`G<2e0L~3GZcO!6#ga@E{k!1*xx@f6mA|0Ul$4w4uu~Mg_nlHpM}Du&>N5a z{VJjG`Jr%!Q25qRcw8v_LMZ%EDExaUd<6Q)vG>y;6uvSP?i~u>7Yfe}h2IH^#x_{;3iadU+aVSg6zqp_I+%?E)jP!9pQ)5SPoGH^VQI~z>^J_wu$eIAWsdO1>~t=vw=J{Yz~m8hCK=78A4A1_eGCnE|8~&Jq_fkVb1{5fzJZD zbIm*;PYs(7Tm*a$$Wz0f2ckP1c>&1vVg*2+8ulWPE2b6zd1}}~AWscj1mvkOW)2OI-j51a@54ER291MnB%=fFeJg8c$m zANVD(EpQ{SC-5ua2;kSi*}!jrZvnpreh1tHERPoGcfeY}?}06VKLEP|Hv{hg{s^27 z{0aC9a0~DY;LpH)(1QF0SPl3qurY8euoLh%U_apRz=^;=fD3?s0zUz618xKU1w5K9 zzq*n9vw?d7uLkZ7yb)LmI2xD$d=^+5_#SW{;LpG^z=~+O?F&2=xF4_$FcFvoEDO8` zxIb_fupIDBV0qvs-~qsLXn7q7tO+~_crox`;Pt=?z#+gxfR6wx0$&Cm3j7>c30N8} zr^A590S^aW06YTN5qKoMKuqyCOU?bpJz*OMb zKsvyN!12IyfCa#Ffgc0U1O5R#A9y5c`bNMrffoSV0~-Tx05$>M54;fgG_Waf6|fob zCt!161=Q3R0qX%T23`hi0qhQJ3A`J432-LxQs5iFR={t7mjTP7rfm&85!eRU9M~3k z9k3m6Fz|BV!@w(mOMzDcKLfT0mO@Q=6|f5MYT)_6Yk(bq*8*<^CIiO-Q-Ci3I{-fd zrUHKlb_5=Q8m<$t0Wb}CB`_V>8`v3mAFvB>F7P_wJHQO!kHG7J2ctgf3aksv1hxWp z17-uWfWv^1|40)Gg?9H(TsCW`C*wmA?jcW{T}`Ua{yA;odS zj2mO$9cSF5#?3TtzHtS{y=vTY<5)+!-&kYZSH^8J?lmpVp)>o{* z*ifmtVW<^KQm73(iHRBX7|Xt8l(lf|Zr%@CU@HcxE6*dnnH z#8!x{6k99ygIFfUgHifLA*7#J9kCAl6*0rC3|BY_Tq4MPhx$`il(}8!k3lY@FC+ zv8iG+#Ab@k6Pqu#NbCc#6=EyJ){6ZgmWlJ=DE*=k(od|8*b!n!i`5t7Jpi7j&Ba=Z zwH3=2>mpVp#;aMrFa5=aiVYVVEjCVUve;Cy8DcZV=84T0TO{^@*b1?gVr#{I5X;0o zK$Lz_2w@aIw*1R_q6{Ow4~o=@*5NeqwdRju7Mh2%e_(#Ttk;7i%fjRxDeL zR}TGmi^Teh^%ol|He779*f_DtVpGLth|Lt6CpKSfk=O@fE5ufctrh!0EEDrTQTjz8 zq@P$Fu_MHe7OOATK&-h~OR=_MywkzczKd9q80V^dU;2v;6&o%#T5O!yWU;AYGsI?! z%@dn1wn*#)u@zz~#ny`bAeM>wuPFVZ5YkVK_eS{f9wBzLSbebuV$H=`it#F~|3=U>JJiM^i>xOBXE2A^WQOX7kyGJ`s&^xwnKX7dFSD^g; z_!FQn$D|JTsXr9svBZFAl4q0+&iHMHe3Hi*kIdP~C{!ykN-WI;9FQUbcL)-&7yirm zbI!{r;DX8$uq3xvjwhTimpcsqS&C1?T@zehgjU5qOYvXoIp$R*+>j{Yu8R_Gc$9Fr zE8!UO=aW0*5jh(ch5UUf&i)%8on7IhAO>3YVs1OCADA6YTw^Q?pZJfrng#! z2&?Js#&Dwp}y1tfpt1%W8V3xnVVJW^NhWyUh)&X$x~% zO(&WgR#RTz^!F%EGMAa{d-V!JZO!EqTOKg?Be^RO$}u+sAy)B!CcY&OUuR8pOrChje zIMbDJHVtFcG%%EzxLoYYD3qDFPV5G;F=8wu{@n+}9ung|`ENWc#xmmUZ({F>{X^_u zVk{;88yVPl|8C7Fl$rQtnve>s@l-4HJ7br(s6$TO6gC=+ANb~Zw6q}X_|31ZX4nDYKz_ILgpuZmT-h*nt0W~3-& z&!~{~w?c6^etvylF(@b~*TQQOD=00%n84@YZ(&shrJx9R!4!4a=oZ%(aHaM3s#lPK z+`suy7J$D&&w#!GWkGlo+9Zne7#L@U-=Pd=$X_q+tWV@-TIF!Yl=1Dx>$}WwXK9{L z&9bZr&qz6mnEn~*yH#aCNp4Z6{G4Qc-E3#1?;;U1aQN>-k$Q=LM2R|1iOP_lkvi*- zt(>v$IOF)y*(R?E&!?yfb5#>YSfU?}pI=`S_-vQ;88H-I(@JW>qDnF%zjtYVNl|WL zbauOurx{)q*c7(HU-H9R$)<2SXyXWej7(rn_!P>TumZ}O@EMdf;d3Z!0^_U+jI$=( zsZ3)iGtpD5ZxqT*3>IU`_;%yPSQDI8HzPN0@La{WD{L=cPEkr;RVf*pqLkcajGgk| zY`d^io@6dN8v8i}4qn zO%r3TIAeG2{~x<^XTQp_Uq#i}Vk7&0=GU@S*c>giW+6OBc+XfCc9NG2;}2)$r+um(9^qbHnE7HFL}0E;Bc5j@~f$PPm_#I}ssotfnBuoAvxue}%bo&)$skRQSSr0Tf18K!hVHmy{e_Q1l_$C|EQ=sox)+vFC_A|wp-(|~f-ZvY z4CPeKE>PZJvMZD~nCu4S4JNxod4tIwP~Kp&CzLms)Q0i~lf9t4!DMeJZ!p;h`djF4 zpuEv!Kj=wOoMnh{cB*%&Q)S5CF6yjb@cyT#7-4EU96edd17tE+KF`* zD-`Q3#!|^WK>CRd6B{o!K`hPF%blzN2~RH%4H}Tkku>MTMwNBJ*uY?q5{oNuK)T}P z)EztKm*liBEU3=gZqvHhSr-M6`*R4C`*e6zAn!(`R^nI?hB6bpQs<0EYXl_cH=X(nFR9)+a^-E+HkE6m?)=jX>piFiVkh$lyhc#jg1 zq0B^o9FsF1oio;8XRN`_whV2N6kFb(Gpn@1vFjdIf5NfrUdFPJawk|#IvgP%`LG(F zYOE1L``UKRbHlM~6LZVpW|OB&bB>~tAErM? zq`cbnbOg^pU%)(R2<3?MEGS2$jiA}kv!NW3HiohXXaao-+7!wW={Zo2NSi_TW}ZVi zB5e-ki1hbRj!4ggazxq!$`NTxC`Y8{LpdUC1>FhzcL9_m(?3FMM{$-H#*f19Oh8ZN z9X~^v2~N*D<6b(uR*X|=&TbdGL+pOB2gRNgdq(VKvDd`j6 zecmw&WhV9!+h6Q(vEPcFCU%C{xneEE*mn4DTr5@~)>W*J7;CJj74ylzJ4$Rb_4yU{ zAm>;M6ZRm@jb$MnZ?m@MaD>+PAa@vR1lGc~3ww}zg4Ssawu%pZ3&B_uI^u6hC9PAZ z{Nk?pr6qlGx_8da%P%=`6SqxPcR9h|27k#9_l-5TCiJ`rwndHL{$31a&CQ0g=H@`# zL35$3!R?`WQJlxdIBU{G)g*>|2<`0h$jwY#qwRRL)wjD%jH&2sniwZVomIEQR9GZh zS+<5n;*Z9%@S|K89-k27Q=Qg#NjGAv7O^g=1sD_Y9Q<)&A^QAe9Z9EdJ#xC06n84g z?V8gq7ystts?Nqf*sokO-75LZQ0@~mdpl_3h!-H!xSxekW_DNT8PH-VGrb$MNfhU? zFwRWASDDOEX5tF50Z}M3alIH*$hVs$Hbtzu8MTw(4V*v`|6Gl|>OqRX?uGIPVT zz)W*_7I?L};aMPG!jh5TS>RxE!?QrXm?gtrFL$lE;T4Si%;oFlhM60_UhY71`Fgn< z%>5HWzR%eR@kK8giEaqpWN!F+x!;=0*UQ~vZuok+6U^lU14fw}zFzJ$bNPC?G3JJ^ zmuqM)UoSV#-0<~sP0Z!%!e7ziBI^(aGn_zDEdbvNC%h$`@XKwgd zw+JCmjUEVPo6FbBJ!o$DdO1GSCnLev%S|&ke7#(OxqQ9cqvnRMm%Gf|WpE!impAzP z@2*0qr@7l?;Nel`hOd{q++3J;g=#R;tWj*h#a9S&Aaf}6!zu<`n`eN{Yf1Uo1Ada% zk_LKI@q1$N*|GT2SUiE+z)$l3`!!vg;_?1}etfczvTey!luOJhmO~D*4@J0f#Cu`T z%(B@R%0c$!P!6v9L9?M(KskW!59M6QmC&c4Wl+wA41n@{|0*cwLav5#E@U8-b0LGE zoC_HYP|k%6fpRY7S}5m2hC(?9avhXc<%U69La&GN@o&SSeEi!DP(J=`1eA|E zxe?08zug4oTLOhw|}nqoHU%5@VqI zL+^m{F>vFc2S;(%U&eWoai2~y7|KkPh;i|lv#Z3|FFU(Q>{hY6#qJe*MC@^~*_f4S#l95#MvT3-A4iQSl$qE~thU%eVuy$wFLtt6BeAAp7l^Smcp9`9>nK(t z)>G^%vB6?DiQOu8x7fX6kBB`kHd}12*qdT+i+w2evDlYl--vC!wbCyNA^pTSljp~K zkk}z&91nQfvz_wo8i_R(yFlzBvG!se#Y)6_id`kfUdexhFP`<^9WS=!Bo|d;1FmgV zIQW0sh6mwn&9la`@B>%dKp~vK<1?{+`O<9LE*$*dU~VqH`+~XQ;D4mKWpH0ImyL`M zS~&RUeegc`f5qHz@Xse6`tqgu=FZV~UqR?Tb2<2b!`zSLu0ZGkb2<25VD8qa5dOQI z!!p#X1t`Gjp`29EK6Yif?CR|s%gQlb)w{Y_% z-b+#9y%Htf{3!7zEAbfe`)QoV94*tch);{{f>NRL&R7foG}IcyHmubiB-3>R9GB7OHmyD zt>UmWMRE8v$nfj1Yw;@E0*r}x4*r%`lHpx*yG1ux<=9Pc8#xfNIRlPFTH!DG;l9ML z%dJ9YasO6BnaN*6&wzdlWoEB|Hi_aq2F97W4=QsR@+$7^^2qgzug;hvBwlW`inO%=cxAdi}NPHQ!qvzwW-;7@PSuwq4lFe`jtk-0#f|&*XkI zw+!wN<_<<^{h3^i9g=5qTb<5OcqUiN+?n`BhPiX}-B%FW&0L)>XZ z8=lG4F_&j@JDMAw$sKGiFXQZDZg?5z2y=NEXLobM%Q(lH%gZ>m%?&T(oNVrGaQ87c zyo_^(xt!G5&)o1b&ROR2GR^_!hL>@gnaj&K2bmjQ#%Ww}tXty9RVD zbUWx%(3()5Yi|$bxppR$=b5#jJjdPvdJ%L-C?~~tf^t%PXDBDdcY$(3a#tuP#dm{p zQhawPC&l-Go(HWB<>dHY(AH6$<%;p6@Vish(=z14C}$i-IUA_$IE-?}VU%yjVU#oW zxy~kuO&5DYjO~tZ_mbEGv4vvG#FmS#7F#36Gj;#}YDS^V#2#WyRo}mQVuy*HD0Zq? zW3gspt;O1i<%x9`D;4W4Hc)Jc*hsNaVpGJXiKThQcce8m;XFfb(9m3tFD=LABO)h#b;w4L01QbG6VnTfl!pjM7^kxKBPj*kPio)@u-}Qh(fgzESk=$ zJM^n?41csGb9hR3oUttYXh%!%@RY7=kO{-FRs11}<;U>oQFl$B;kb!dd^w^*3uc zW9s;JY)PE4C2_XNGxNk0nR$vbvwMon>>Xt0Fzj0V4%70P`B`O|$@`je^7#0za+4@o z_#abz(l`rGc2`wp#;B;(A;hn0~G`5lhV`bDna z;pmJhI?%*@|InVBu1%*>WhW+vmzOvag+k0>)4@>=Pvf8=_tbjH;2?U;qmSSy`v z^2}_QA~VlcW?q*fGe-oOIT*VZUsY4SR<5inGt1p=n1%l<#V5`B=+CRIszzRjOkpOr zfie^S3}q(%1{cH$ z#)8$xwhIduUwP>PT0>Gr?Rh1OGZn=f|rKS0K zLDP|iFQxcYqrk{KA}4T>a_ZvACq`MvhVAjc~k9 zFg_4_#7}ZI?jDcoBBA%r-6Bfiv9QwAg60w6a{~%JkMAZZE6vSNR+^DeR+?L&tSq-e z$3ky|J_)@Y`V@3D^tmX`G-CWH=wDTd81m=%IqMs_{v1DNL&a{@cSnoeD>hl|aj_X< zbH$jG{<}-WmWfrjvQ=2%yIIi+Tk`J4vhbs?TOkVz{F_0+V;d50jmwXzzpAX@6&K(^ zN}Kkkz;rG>-i3^2!I=PM!I=oH;#S?37COH ze*}t@OFR}O=#xrNhJ3AyGai+*5mCq|@0_KXczseN9$zH0KJl)^e;$88dR;K?EO(Tz z9F9IeS?kiRxP0Q}bST85Xsqqrz*7;H*khBw0_E?ssoMrxFXB%}3HWT3fU~0noS_6{ z$R9B7j7R2-bDqvdiKUr<{Zb_0`#}P-;K!?f`2_r?vIHzC?pb^(9-&tLN!Xhq@m`J+ z@6{;r{uU+PQ%XFBygEDMQ8{DjbH-$JR^2wZiZMwQc7-kYm6l0i3x1WcEbQ_>EW5%M ze5o-GSq9m5;aL1*b2(%gVs0md){n)P2igB1y!f+9*zU1)9fZGcE6M(n-0oOomlJ=C zQx?9K;lL$e+34jNfv0t+u;f>~^s`#O@bks{426h`l6M-Qrnc0lO|m0UNFY#7!?i^Rnwx>t;I*l~*eZU` zU;aU1-&NMG=65JA%FD$Pp$^4`#T(nSZtOWfzdsvC#7}ZgV5vtH|25qx>=VlzxU<_$ zeo{RoY&H4@_9fp!*_W(=vJd$VnhjkGz=ve4F=u^=DK)D9!2k3XuAEA3AzY{0= z8lbJ9Tm!Tq?_lj}u!x`s3d^^s4IGZcRxesS=i!l|PeJsY7 z!Pz%rYsG5dcmt@ujJ4JO zzY${0F=zjS{e6W!*Boov!V{Jkjb$MZ54JWgJYhM+SR=UeY`d`MI?~)+xUZQT_FPAs zTL$-ab6I-V&#@k3E_<%On;Z6ACzv}E?%U>uJ=aO*CR^hL*eZS(;&QMW`1=rlYb$My zu?oL)@g~3FVngR%#%ck^(tZy9)}@sJKktgXY?w;QkTvPL#?W@qrqFEYIncZ)&SPYp zrDV2B2}Azqb7xmYZlEC@q>}j#;mYfQU#=k6k!zN&*u`K-Pc`1s< z`9bFM5aOBN0*r~s>hnWonQsp|%_-=bi?_)Y7U$;W;Bf;R-OaDh>{j^wIcmm_p7biA@o!ZiZI3 zDOi;vzgH{2TcybF3yn3x9)D}wg-yYq%w;dflkR)*cR_3!TOk-zxg-95thzLGv+M1J z#U1c!I~E6&jg4KdUH#^u9dexeo&#kGxdh6Rkqd1H?EuY&=0VvUFwWy-oF!$BN(w{1 zuF%=w$jwZ!d^qE2qHo7Wz}dZGPm9eGt8VG3usK+3SsXS8|1p+@AN_NR;&E|M061MA zf3`piFeW0aP-0j9W1pW6$i5 z?-<2dtzJ|qV91}3;*8HnaW+8Pv4T0fQH&|*Y>L=4u{5jN4k@ZyVUSTgyN=Iklt2C4 zrjm?`a_NM|)mRgeP8GWaiOMQA3W`)rjDa$7UsB>S=^A450(f9W3{Hgv!jl6QO$MPL#`5 zbC9`gLRR6AmmcC1Juic?oqwL1M&ZM1#{5njy-p$CF)^NxJ>VyKacrPR6~CukeEr#B zw}?`BEG)<@@a&WLc^U|U|SVvmc>5SuH;ob>;1iP$o+|EbD$ zs1@t5vK?V83kQ6S74WdKU2BY$?YFjFSlNb|%gT1FxnX4+VQv}R6U=26uD_Bp(p*-y zlg$k)+pXp%D;o=A{2Z!$W!o-|%2uw4&%%F~;G zmF-O^E8E|ptZWOQS3uu_va-DmWo26kWo3I8%F4z#D;wjiY_F=aG34iH&UlXIY>>9Q zR*XYP-|luX=9#nm#U2ym-uVCbf*5nn*%C2UHfL!L4NkKHgA!8iI>_xoff)cVeydqs zFcv5rb)se(1*Thm37%=zKBoxxIBd=b`z=AnaKAo+a^F6VGU_#D6hnTCm@^)oGY$%z zu?RT(pK7sAx2z6ZtTT;e;ef|lrXP-ww<{cpjW@;?tC4LNwpjO=%NDDNxnYYn!Q3*q z&CCs3tozJmi}ibR!xn3@xy;CPh6mfHQ2?X4zKvYQ`11`9K1ac2i}eMRE!HY1TdXgk z+0d_`S3p-oSzNz{vW@r_$`)%4lr0wHY_S+;i#1;rfgv9rIOFiZ8FR`RhX>9$JaES0 zfwOzXI6QF1;el_*;eoTcVjLbgTO!65%UPN&R!b`|C?Vxqtf@hPsp`sYW*P;C_s3S_ zB+$B}s!n2lL}svXZ+()tQrkkAIe$~;FyvQmo$-jA4byfb#H!m$Rd^!t2TS6xrD$y| z3qSg>C3e_SOb;@EC8)BS{cBa00R>&LGX1h1`6YcevbL@tjJLx6BtI<>h+nGN0U1yO zd}klwK|DesJ_;@h#tIvX!m-AvrL zbIHy6?F!4+pHh^swklswq$poc8Dmd$v27RjL^I80Pjrd7VNdj|xn*!Wn9F=vKX#sD zE_+a!K~6~}KRiCxrX8S#5!@HGgU7r-l(nf2l(pypXf`wp zdIj`AC~Lw&Q1)4Mp$nl0Ll;30fi8*SOh3k1>)ueUW5{ppaK``D*|pm4dNGc*eY-ov z?iYJdjQyx@_l(%fVy}t4E4El{wb&Z5|G}DFMYB<1#V>$@QvLr?6w0 zZ;Tbc#I_47{u}19;`cB&toU!4TL!ncxnaeB*IZWo%gqfd{vvZ(@%x(_R{X{0E`~e6 z+>a3QCS?UeOU+F-3!i|**O6_vl{X7pL3gaAS?G!Lru^RJrlhm*pQZTx45!=i27&RV z(XOb0VDnH`ZvS|kY#xvx30?x==eMZFY#xqC;a8!w9eUF;n(mKWcSrNj4SofwzfJKIc6M}_rspq1vZeqLiN3w!rZE7xKDTyBi@ zbEs_>*3VCanlKJq#UHcBPJ^YPBmQ&%@A_fB)e-V9IaMX$UV?%n3Hbz0w>ZEY@F zr-|lG&k8#*1=Zs)`5?5WlhV5?wm&JP+D42 z&_3tn6WbT~6BV-X-4vf+L3hdSb3<;cTHiX2DtACkAGS`rfDMayE3`69vp+)FI<|g&3W&he1%6|1PP~P^`4$4O#Ukq&x&4Kb3oJ*kXqB!%1 zakg#?>hMYz=Rg?p*3DUeF-|Nw8!pDy&Dl6HPAoZ_DmFuGrWhxde7pH#JQimkh;el0 zY^B&*u^+^E^OA43QxwWf>?_8SN;flcqS&coTUuWv;|9Eo?SHo4*m7Vj2tV$*r8wA| zD*nF~hYE*JQ*B5Po@_j9EDJ?u=bbnx2~Re5F~*aP>9$>XvazSRxp4n#Za93}%iJ=! zGt3Q#Py3k5;nOqbhQp`*&1H8p%iM7Ilx6N>xX+s#4xj3o%i+^pbHm}&q2_Y<^s>3( z@aZsfIedE6+;I4Gq`AC{{%_`nchMhhF7Kj$)7<_D`JiqPLMNEZyXfCCH@u7fBy%5! zyU^V5F8Wi<*}x7r#Hur`-(=vZoQ_=b*#=JE|4%ghbm z&~di8e9`(R=7uj?Z)z@Iw7$aJo(TExUV%_^bNQn6&&>^AwBEv8zG(dmbHf*{pKmT- zwEmU3;fvP)Xf9v0{*Ad`@;CNp+5HZo3(e(=*1t11e9`)!%{>C{I&;Gpt+z9mFIxZ6 z-0(%~mzc{Jt#93czZSk|J=a{mXnk9A!xydRn|m+Zn&yTtTJK~oU$kD!-0(%~h34`_ z>pPhnzG%J3+-)$X-__jkMe8Nz9t3v}a}Ptv)9M(6dYF3_LVKBej@*_A^)~ksg!VPJ zquj0tU2g7`2<>m~Ai2X3>SyjagtE+?Aol@;2AKN{LUql3UhX`Et}^$1gbp$HL%E+K zbd9;+BXqdATVXKnM^qD`q2|K0>)3p`b$oH^!Pts}^#h>0RDFWu@0Q=h6CXSk$;UqM zlg=Wys%8Q=^wfsiUyN3w{O|XR#mB_rGh*?Ld8Z72|3cK&^1ojii{BiJKN5?-5sQBj zi|>rQFaQ4^9gDY!#S3Hc>tgZAvG~ie`0`kMI~GEGlKFc`EZ!s*&x^&cj>Yee#h;7C zm&D>fmW%ULmJ`K%7DMvGdcYIeV*vPG7JfS6gpzfm3zR3amqK|WTL{gDc7dh{h)kz&lOO<*uFoMFSfrD$`{+0LHT0)0Z_i!{wgTz{?$;v*nS|iDRdB& zFSZ{H<%{jFf%3)nL!f-I{k2fO*nTJ!4SeD{C|_tl4B7yCJ@jJeaA-g14bU;r5zraX z8=>z)Z-TCY-VEInX?zQGFX*k%{i8VBAI5nC|5lyk2|Po-7~NU#$n{q^IvXN3Qs3ni zg@1Q~*d#GdS^9T5W$D|^5qn8&f!IQ^Wn#<4R*S6>%Rs*QZ`6!J{_Y`XEDip<^|ak# zVmzt$?RZk}+cg$zCe~W4jaZ&oXR%VT-eLpAhKR8Y`tObsn;BMj@o17@u0>=~7SZFtHQGIDU)LPpp|(Yq2(Bd19T#*cSV~ z^cEW^HbiWs*eJ0HVw1$Ci#;JWN9-lB1!4=umWeGFTP?OmECcm6O1~(Snb=P(OKdYu z7FBr8b(D=#!gH=;jAfzjTxa8z@SJP7u|{x@x9yrC9##X!| z{&uZ;gwrd(pi}2kJeYJ74{~h&l)X+H{3So!xA?`KJJ1Spf5$`F>)ZupuX8uF9drUT z8#)o17sYvOjI;H8yH2w8WXNwbbar{<`a4pcT_?tijn0^g{@rO}Y%`rzx5QLfBu=ty z4U5F7#+f4~#+32x#_PN65S^vD z-0^po6}WyA)w;b98XIH)e>$E4b-^<5hrLYfUU>%O75Bn>T{@KJ7IiAjug+V;S*tkR zpZxH*S*y^<>89KnNKo$2Gf?i+EGQFnAtHXUfFVy%XFMurBedN}u{0B}K?5d3n0R*t ziPsnZW&GZw@`<-cC5hMjxZ`rV_bKX7{#Boc;r~nVso<8k^d8~;Vw8CEqQrYGO1yWK zcntYsUS~WiXG}b2Ogv|4Cf->o67Q}c@vg*wS=l4J_pBiC&bgpTizbc#oYS!+w<~YS zFX>uPl#8b^Snc1y6ilb|Er=5EohShpMG3e_3CNH?!rK{-%o&r-*(k9z6R>fL1e_Qo zU{zJOb`=TO9oIYY4DWK!=-sf?ODFM`Mv1p9O1w{^#CuPP$B$f`Z2uA%3HI3ovF3M_PMVQ1H%e)WRQE-?ca|{}*^eXX0cp zJljB7cru_IG1h>x5N!u-62*BOjI(eoMt1oChatZ)-C0@WX4=XPXG|U6Zi2o$Nvyh= z`AfE(8~5847Q>tr#jw4K;j9$J@Ht~_ck^w#u-$#ZT(-NN%?;b#m&`4Ld#Sl$yF1TZ zw!1~Lg1fLq1dQtas%4Oue%qVjPS+V+#6rr-)4x+f1dUiaw#j z!c=AjA{={MZ7hqsoT4y&q{1}VwhIf>C+6njyVsfNjPqJ|Gj@dT|f4`}; zsPQqRg@t(2-zIshc)Ym9+umgHy9E1{{BU16DYHGabp($?G2;H82xaj*3CiMkGBg`{ z3Y3$Ur$O1o)rVdk#d*w(vluR^lPrb|`I(?Io(Vc*;d3@jjD^n`n`Pf_k{DCm*(@=3 zp3Z)mqFF`B{T164R;poE^utPZgRv|m_PK1duO10YDGW^e@ z%pHu-`ZL%y=H3Z5#@vZ=Ss2!tI}@RC=CUxXA4&aaE_=kg%ne6UTjKyT66@ejFgIL< zwT-!4g>|2~;VP^e=4Rl#tMJDK!SQA4O~6=@&V=q)c|(w2!uNdU7InzqB=rg0jHr!L74(}Rr-OI7mM&q8CtG-?cGW77o6#-=GW8+s0u zjZ8Brn}c(q9Hljfa+LOaC`V`KLHEZ0-vW9P^n56<>bHWP5yhDgjI(iCS|`~!G33k9 zo%N4gzuCswaIw+)?l>_nNB8Zfip>z4DaPgKzTJE=9)q(F#5l%xwo+`Z*bib{j_%vB z^f8o~s3&%qSalo43LA&X4SqU&d(c=Gc5ZvC7~$}3$Dp#Xt&jJbEx=e1c$U0>rIjUm zjA2gq4h7x2Z}f|DlD%Rp{BH8YePKb}4%#?^e?r0G{1vVSnB#QGG z7-vEI5ZU5q`V4t5=#0IfGxmbcm@>}Bi%k$qbAoxAWyOy8nzw_zHndBS0at;P*t7^;nF2BqaB%GnD&w zX_T-ZA>s+kkUtRH8IR5xhZ4@%b~vkUZTJ=U;+u8XDr^NFZSd1p;BjMFNbKEGv;un> z<4N3;wp}g(Wp~;S z$|1oOP!0+DLpdZUgK|hP0Lmc&;~Ww&&X#&von(W;P^LY&!dbV-^?6!nWnyfzopG?^ z-{pQe8!t9RY?|29Vzb0v6?aZs{ zHYn6p^(0x96l$IR`ub(O_pWQVg2HM&0X(gqWC${vmGL?#ayT(O%J_dO;~Dav#2Jsy z8G90E%vxu^Oixl_d%VCh3%L`ui?tDY$5<9ZCt9|Jqq0+tu{~a7+lB3MeRFf+E;cu8 zk54x@*|xF0jXyuU{5;5kl@x=L;`TkdmloxB-`tbWepX^dO zsAeKG8#Jr5isDdVPxPfV2xtMy^+aDA%K~d{O+(ldwKc|`XpLexKFr)x5%T}}OoV2d%Nvi6G&j8Q_yu!$5r{<}{h^p3f_@%R*T!yAtmo69a?75+ZPamOFI`Ypc6et#9TUS(Yvmf>?1 zc(>xsJuu(gGY|a#8z3e4NsgfYmu@Xxf4L=jQHDp#eCC*Me}q>P;PX6&2h97qP>%Ut zgrX27UV>&rUxsqbHxJ6O-YZbft-K25+{$ZE&aKRcayH>_P|m5m4&}|0Z$NqTlqqC`0}TUT1s+ud}PP9ot@KH;LUUcDLBQVvmSDE;d_i zuGpJmZ;O2>_OTe}#eDz15o62jtVR^dOzb9BTkIgQL&T03J6WueSW~eJ#F%@Y2JOW< zij|1<6uU}nu-Hvvw~E~@cCXkYVvmc>7Mm;frr6tJABue}woVMIY@*|+?ohVE0YZIi zZqdF*jd5*+&M=mR(1+IWh6998gU0xJY!zRr*8;2t{?5VQ!4)*dEiY<=xv`?W0$y;z z8!Ah10cNA$X;W@8q!oTU`QiS=FMWN2O2vI#0cE4{FX$Q2&!KEQRzjOZaUKWbtb{96 z2^sR0an9JpIJ;KcF?F2r|5!3= zLeGof*T`w^^BO2i#&=L0d}1w>(+umN+0g$$^P)J9k8zfef2o8pR|KhIbeesrr{=!Q)|4P(ji7!M|XD{T2D z;Lr*)KIeqIo(0``#TAb^<(;q_J1A2oS5^HpPVr3M4$4ff31#)qgyPT>wV{4wui! z!z#|m_83;j#2WW$JFoB-Y$Lq0H3UP-g1hP-f~rP-ZIQ z%v8pish=xT8S?iSI2#q42a^`OkyL!ivqL!r!A#+k8?$$U{@c(&xgj$=+`L3SkhVxx*&E6rkcQCFQJi_nINRHQtG#8&FVHyS1sZ3pBhH43u}gI}TI^miUgz`gJ}x#x zY_8ZmvA4x|l>Xh1#a4)YBeqto29C$~g-cQWyS2sk6+1-i2(gpJSo;0Dt;AZ3Rktsx zu-UuHsv}Ov%ALgzGL{8aY85ja!uJj;>y6kd{^G;(gM=e1sjQVOo#cEh_88T%|)zbK}Pfki7&aY3&vIzdzm<@;*97}SkNt} zd$(LHx9^2@#JM=9_SJQV;d?1Q8}*!y3z3N2r#4XT*I%MUU4@7*U}eacpgZf2t(=XF zLbYt{<*d3jV$1LeiMheUr(bcZRoKK`m!gRqt|o3!iYD$lV;tGtXxoJ&yBp2Tg*(#R zaAY^i+%mYgnL8LEud^K4jWzd9ghrbij_mF>cP89B%ne6&lg#DFZoIkS$nGI?IkLOQ z+;C*~n7JI;-D_?*vU}QG_B{8S8;nXn zLw{RI+gRKcHzMWP?co2=r0n|9=u7^e*uPA7cEq(2dphFn z(FZUu@}caAJ3^7EiB8aLXlE!#qXkfoM!P^c8odh7~2QmKaN{{|8^6r zEq0I?$F08I@nR>7H46%441H&(XH^8{G=N7UWr0n0~=fgWo5e>%2Dqi zC@bAyC`Y}FbJWW?3;kCr^bGl}Th97Lu1}LWW6Jn;OH2?4CtO;(i8V>^~}#H!DXZ9BI1S)ded5Le?1bBz0n9LQZI3Hl&Gtfs0{f< zL1#QNXB_o9{OAkNZE#Ca(aF$2kxVdqw> z@ZXKVU%N^Y@wg33#BL?|Io*r+;Ej@k&HBK}`=SJ$93|+3QG$M>1ZBvdz2uBX>TE(3 zs+E`|mS%#!mLfsmB&|>pxydJ>x^x@wppt4^eEx}8YSF}DB-?U z!ZGAGI5^`GIb+M{jEU(i&4hbBMZ)og2P%@Fc)l=BhdT|nz|j?GehC{YN;uDT=sPOLcR^76Ztc23@8(Xp^NcVn-v z#pk^_l4k?m27k#9_l*s7P3U?k}LMA*-MqbTiKVXPhHi*zR7?C2CFVLMCPQBOo$-jA zvGhA*>33G$(qBbKvvGEXRcm>Qs`W2bturkr!*klE#@J1*wC$Q9w7#2aZf-8vDs#i> z&I`;fgS*IdarYf3QBX%IWMQ> zMZPSkXOF^5bBp}hxhE-(|y?v0;qPxXpk6UvIdJroI($b@D? zYe9Kxw*z!EbSEe)>(0=-qd3!oaW(+|QJH1PmyJ2&vN31ZXge+&b9S597_s}r9uWJh z7<0$J`?}Zyv0r5!*tibskwK;tzqs&guG@?LFjUGXCkz{xpU-lA;|!97bCQTxgW{p zW$I8E{wOZ#DknCncOrWWCRV;^|q*PrTme_slKCqjic) zHg{xthES|uz@WcNvIb> z*ayn?VqYiax2<4=0T_~r(>p|;8ai%fj zY)^hrd%}>PY&qk}ma{T##}skK-q5!jDK=hgg4i^%>0-0Q=7_P4@&9ju*b=d2Vqb`@ z7UPpz{kuCvp`ZVmt-Cd3T?}jap2o7UpEp_g4{P}-W31(S+je0szth|dxU29t4uA2B z`GsICDIM|0@mTcvNsZ~=3QG&R=XUKDJwqfb`HfK1805z5&iV^GRheGHVP`&ei@=Qx`e(7a%lQrdUAis-Ecr6EGsr!%~ zwvImWn$j^JCxAcmIFePVvTjA=OrG8)KRh1x8#_SR3h+}OHH61_29!0c0hBfCOlUT= zA(Z{bSy1*HjiBr|&W0|8Hi5GLXbN2t#hG4=v*slZNM7P(C^K=XSaB5c`%`?oE5)wU zb~lJ|1nS$}DfWQaLt@-N-|ks4=D0KFG((w*WnxSjXK9|?9@~(WU`Kq*3l!H;y&e>( zfgqJ#5IMb)0#%aRscU{wDOR}SQSz8b%_%KLxUgF9?BU7AvG_}V>LS2Gunn|c1Y01p zSP@!5>p=e)W!_duCci$-kY5mS#-npKDhky~uy{E8Z)^@LZ0}BJ_|x|8WMf%4;I}N( z!}jhyV{GqEv+bH8`IOT?CmrP*RNY53C?YfVsKcqs7#!`6ZY zimgI}N()R^JWH`-$NUmJ$+W<)8ytr3r1)&qlw2V)g!@wrImC(T4u z7h0`rxastrgQLW}HcHH4QDSbZ#AL{u2WLD=XXB$#Et|G@ybsDQa1xY5$NQm+pp&7TNPPgx3DhZ2t|5L9%GIk= zq1~a=pj=D*F!b^$&irDWL(c8c@cFqHLz#*0V!fhJX5wnGYs79AyG`sKvHQdx75l5$ z^I|WG{ax%GG1dd$zfZ)z68lzc8yt^s$5)B@aqKR(msnjfmS*4XbTQTqXIq+gByFPE zwJ5TXsvpX?ah*ej&3liAKW*N78_U9ewYBCcY~FK>v3bATwhNp0Jacp5_BXc^Lf#k_ zA#|y^We5#u$lnc{_ipC0c^_zQ*u3{Lm(BY%=7!CCKXci<4>gy?+JBeL`&H($dB5J= zuzA1MTsH3`%nh6O8_i|&ezUn@^FGR4Ht)BZ8#eFb%uP1$yw($6AymG3KfChgJs7}c zB~pH>F?0W`Y~AhLXMDLsOx3(Uf##LX`%}=}p-)5EygvhF^F9;G=KWbHoA+5zHt)|t z*}Tt&vUz_V%I19zl+F7KP&V&#p={n?g0gvk8Or9JaW?Oavw5$n=A9v5L*lGw&1G1ds*zZy}xBuYb*=-GI2M$ z;Xvd;V;qRwY1@SZk?H2C zbHjni>*jJGGS%F0Ao7;E9Edz@Za5J6z+4VQrkfiMME+?m2O@tpHyntpG?xRB8Rmuq zk+03|4fh#y!#i@}d!4m>WJ@_*`>8gS*t+FA?(8_zt0#=GNK< z_ad9SD?;w>jnGBr9)Zv&<{m5e6olHDdoDsN%spT3MF@2;w=*bC_=rVKfMd&MYr^tO2p`fY3MQz9RQcg!-Gi459DLT_JZBLPN~m2IJp#=5CLW zAMY**-C!;PHeWml=@Y-b=eICxz&{k)xbnfVzaZzNU-;@4$I`R0!~7&ykS+D7;t5m% zev%<4?N|cwNv_aC@JsyhNju38%OU5M4h3i&@z*i< zXW9Ha6a_i40D30$EhtYu-iGqz;~gkZJ{CfG^6@T|Cm)NTJo$JJ%9D@xp*;Cm4CTqk z2T-1L`~%AS)0aSbfBI7Bo6rxTyg&UTDDO*O2IX_2{|V)DqCbZ6Inkd$`JCwGP(CO6 zQz)Mky#mVTL;nj}6G`$J^ib&M(5BFp(0u5>p#z~`K<|OBg3gA130(^P3X1L_u^PHR z^c&~_&~Kp!M{(9)#(A=|Jx-B)E{q|+9nKkVhjTVS+YJ)CQS276yTsT-`*$A}dra&( zu@}VN5PM5(sn|coR*8Krw$)b2?QEVz-FhB{os)VX?==o)ddP>adfHr0EbMCT9J#!J{hYa+ zSlGkdkL2ZMH=J1b$Xre=WSJXI zEPQS*Cl>0O8%`{&HkT6%hnO2qEPQV+Cl(GjH=J15b`Rze2Ny?~8%`|jU@j*Xjxjf! zSlH8CPAnX6ZaA^9kGY&!ILX{_V&PzOIea+P+}Ol|xtv(|ow?z}!b#?GVxfV#w;<%{ z%;CfD%;m(wS>}cl3ul|liG{}I#wHfb<;21{=7tjs7nsY5h34jl6ANw4<-|e@bHj;+ zd~-Rm(8}C!V&PJAIkE6ZbHj;+5_37RaFMy;#6mxFIkE6(bHj;+LFRH|p`E$m#KJIh zIkAvqZaA@Ui@BUwXm4&fu`t@)gW%?ydl*8V3&$XIm$_#l)Y;r~ol=~?{ z3(Wlua-Ld#{vG|f${Kr_l4$6A@-#;T3Zx@SS zUM|j+O`Lq1ww3=M{FilzlTRlgJR#ygU^0dEYOB+H@@Z=*C!e-~a`Gty%E_l~p`3iG z0p;Y=c2G_})r4~LX?rLqpE9AGe5wWIb>|P)b==P)Y>wFLVhhBUh%FQQLTt5I0{QCuk`aY66T67*A(kap zPwZH+6U7>eH5O|n)>`Zmu{^PEVx?kbVgtoSh>a8*FE&AJn%H!)Sz>d{HQTaesdYtpjZkHDI;WfHCCv-Z(t`l$n>sVaUHMca!Z*$MNtVe!HpX%K6;Fp1p#cw7*+zqv1fKRUhKbdO1Z+Rmm4g*!+QsAGM0q{-qSKZ zoO;>ESR=T%*mmL6OFeUQ;f^vloO(IZ+%mXh%nherjx+a8xZ}*7h>+J{PQ9FNZn6fy z1`>aQ?8{&ray^f~W)&C0BEEj^vL3m3Tqg=)NkNDFU-~H}e#fO<)9i+QPkwkjEX=i_ zc@ew-g_p;8Arx~niHo3TLjMHiu(A!5!^%HHS$Nw*pM{@Nd6*$gr7rR63ez6C|xDWpSJtM~BbH?2C|8JStao zE-U$AeVkw{3+d6s>cHU$dA(rMcb+lU$NOx%us;65++4Vm%?<10#pag5ebC&nKIWOr z`Z&$pus#-;I}`4s=FUOL_li@YJH z*sjop&|)Z047)*>L~*7aF`mRY+f22(!kYECmC~?gJ!vcp`_yMo4q(EXHNY5a*3-6K zShI$in=IjXVXOEJ$;^4?ct`y4aeUDyKBDZFi+ld_F)&I#3%0m@myLgmCg)k2M!y(a zH`6A$Cs6JqOKMH%c@gi062<-Q3uQ^Y9Lkc~584jeAIcJYB{VOJ^B5UtN!(c_ks-ga z+1Y@|^%pHUyHSiih%=_9fAs zw=_Ll%G&=#S*vhx_N)!C!ok^WV_C@hn^O$V#%OT%f^8QL&h9Zc7vFu!-0-w#vbkk& zUom$uLVoJP6Wi(L-igqBb2%7ZKMnDuxjgN8!`$$+XSTVE;Vv-uBYoFafS9`u>>YE% z6(D~%mn%RPnH#PEdCy#~09kBqLxg;<&OzuSbGZU!iMinlkQL@~1;|I{hATi;nadR* zADbJl09j`)SAcwKZny$u>)ISPa|Os}=7uXkYMIM<_kWukTLEG&SAcwJZfpgJxm*GA zwYlL6kh-t^j$#T&@5)(cI?|^4#YNkXOv*3XoIG4Of7?X)afQ)HgR=0rI}NTmf>1x#0?s zW#)1PNJDeO6(FCR%M~DJn;WhGS#2&?fHXBXTmkYQb8m%vuDN3o@*}zjp{;OjBqQ+{ zLg$(Ll-$_}ZEx-Zgw8j2k=&&S?P~5<2whKco{$lP$axX^ccyo&p$~L!$+SFFHxoZ&mi@BNGVZz4TT@do)-3y^ya}P(To4Lox zJsF__bDJU5-Q1RPFGT1vb2}l_)7-9dOA+d4?qG!am^)1F%?J%JcOthl_W`+&AT-Qe z6j-|`))|5L%Q^mrt#ELOm!ZF}YzhN!vMI?g%F8cFzJxdn-%9cM1?K2D6S6egmE?+( z#8wWH@dIM<2C?|Xv3S2&d`v7pBNl%*7GD#KZ@I%O%#Z)(6+$d;qtO=flPq6P#^MWO z@o!`C+N^ZtzJF3I-Z~cV9*f@;i$5HTzaESKI~Lyw^}YP>|27ssFBZQv79Sdm-(N1C zTtU@vYyS=Y%XWs-kWCOiG2(+Uoygs~7RqVJp-@gkUI*p$<1i>E%&&)X!hATC6XrKS zIZ-|W`W^H}C|6M31my~6WrXZ6H*SAeq<#ZDD#EY?h{wOAXmJh9GV zrDDCs28s<48!0wQY=YP%vFTz@h|LjuNo;}GLa}9H%f(iUtr5#WJ&V#W3S}nt5Zha< zp4eexY;XL#Jje7jZ7kMIthHDhu{^QPVx?le#RiHE5gREsN^FAIB(dpYPl(MCdr548 z*g~;oV#~!=i>(pMKsytqUlc<6iSf|~o-Xyo4in=#t|&iSg{! zS*ciWv4LVk#72sZ5}P14No=~<6Jm43UJ_d%woq)D*mAMeVr#@QGLmUfGYTR7#P$}e zC&u$#Ki(6?P8Dk`)=aFmSR1iCF^=B-|6^akP%T?O=B&Dx%qpC)yRs2a9K#8_tBhr# zQQHZB@vEuq!q>0B8;V$b1zrm<^b>fDE>6WNIoT-aonM%fms^^P_dgd!?>)`JcT#-P zINk6|`1U-3a{mGMg#!}wGdL;o&ztCQxPNa!c{FcB&wwt3a$xc!YFBko z4Ec&ZXI!!8Y_PUt$~YS@HbHEYXXKz189785xi5Y=o{$ znucj6)3nfHT7^Vqk2Xa}hd3nZR60j?!jYw@EFF8l+(o_OX4QwYYoeqMtfK-rDovYTcu{Z%IA8rPo^Y_@b4W`*+T8T*TXsw ze<_K{`1dZUGhCeoi>s~8jqVww;*UV)_8<1Dr}5Xmj7C?G)rY^d(k~}7D}Osb2uMQ) zhyC)lT>gYc%X8ZVlxF!b%@JiE z?*z2$k;BIIk5qf)uyI#AH^JX~t8;fdcdv7gIQO`7{C@j9)}npyyUxAu+?IBz9a8bf>ldG9I+WGua(d+y=Jd-#gc3g=T(Gr2v+WJ1 z1CA;A;<3d2h22omY&d%W*>Ls*a;n)I$Og0zkW&rQt)es=#=hP#XxZcVjT;!LsR=d* z<5)75Z;EsD7mVA|irk(f=I{2qOYI%^l+Ziw^WM=HwHfanMdFYpF-!Tvsep55N`h0t zU!`WlvcaCc>Sn1$_;-%fQLr{o1yhi+so-x?!>NERD<#3p-*crdfo1RIuHOfxuE4)f zN?qeBFMt0{>PGy#Kx%mTd%jd&{$3T^=V%isT!nu34V;ja;LwT|sno(7Kn_)g$CrH?ZOS=l*#xQ(-Wey?shd0GE;KYq%< z_10Vn;lRiVbte9jFP0t0#l1jqa^&mJ81Gn~HGv!#4+3&LOas!@I2gzYwHA=?IRwaw zv^J1|-9v#4>>dU@0H1$2kb&JgKn8Z}0vXsn0yrL656EEEQNTN*H0zRSj<@^ycuOla zF~GS&k(HVl?Hv1-<-5%}9;I{Rd%?No&b{m0TIW7*?);lx(rFFx#j zBre%m>AA*l0xIql@K?^GSA5g;|L&{}x6&WAC8#}^F!`;(k{pBM(D2v+P6V<8oCKs} za0-we;Zz_U1E%R1FkKJ0zc*A`c9V{A>@LP#}GR94Dj#X;hmR98N*2~(SCsyiE_f`qL z<6Z9^9LM9mV+V}8DTwai`J&3#8kTulTEz~TWNzi0 z5x+@?=`55UU&*ZlBP{7@F7^3J>WeMu=~c0G0_V$DGXHPk;dQ_`$8qsoAjic{K#qs! z0qNnL59E|}0q{=Xg+O|Ee*x0Ny9h`R?_wamn9e}9txJIP@VWr$;iUuV;bj2n;dKMj z!(*Br9@89e|LEf_E%We<8x*PL;Tbo^IeK`;@hI)RoI;J8wj8GP~J>Z|vMeH%wv@E`A9OJ9T4flLk zJ2$~O##b%h-OkkKxk-S9S>z4wPTCTJ{I zfQjE(eF!)A14Xq_7t3b`A4&GA2E4qwYEs{8u6kF~zDE1D1H`n_+0&7S7 zKvWQqX9$qTG!)1R`myQHA?NPDh@}f1H`4_ggL3jM=9<# zHOKJJ$`_7Olci?hy)~s~!?MQ1(BDj{MX(N*8je!4rA~%gTWUB;Jt{RhO1+3&@wIpH zt3Vf&-|*tUzMO`SEa6pwYxrC1M-^+#<&9RO(RevpT?gc7H3rxecs-D#)mR`$s~dnE zt!@Nzv>FfOXf*-2C`vyarP&z{^v*!b*7nBn(~RTV-Z-x9jl12syPUhvxd)x&G1z;b za*p+79Bb1)?*r%Pm>Bop*x|P4DzKdIF4bc>T)i$F3yu(%hPs%q{#O^4^=A&dPm80+ za+LCgW5IJ$GoUt*8jc08N-ctVtkiHU;Er{>3~++fa4dLF>H@s?WT{JF*->$k$e$KS zNvwd?Na`9_c^TkKsdQ|cN(~o@-$~^nv6<9xk+@MR7l|#ThKs~1RrtNh5$ZtXiZAps z!Lj#t0bW?f2!)MBefW^7^d4DRncXtFU$&i{DGqSka-qioj{z<&aFQ>U4X5rsK#YmV zJ1|P%KrZC&1#;PO zACL>W`+=RKH0y?Gj*2yWRHS7KH{%9Hsx91%<562ao|kbvD&uB4H_N%X&dqmjsdFzl zx7@jRo#Xgu-|?Aq8=Twd92ahuj|(?D7M6u^Y^BCEaPBzgeupD(siR+O_2_W)J6l{D z%CegJb~yU&F0L8WcFGrye!QR5E`pvTH5~nFN-e^BJ4p>kzeA-?hI)b2aP+G$m80K9 zQp3^jIH}1|h@)WKPh!hquUd`2zx-cDp{>0}v9*3ud>AU`Hx0nKBwsu~jwHJRb0hL$ z^k|;*qd<-%e*acN%x?nhLbQPC|!ah}LZm-(*UWV z({!cOc_-Ex@sJHU(Z(`he6gvv)?{bZpwqD#-8sU+xiU=%Ne62t)G4a^S$l z)-)m_mtcTl**pW}z_k>}f$Lcy2d?LUgMrTjIdHuIngR7%soAhLM@xA(o?X+qUg{`U=|A#bUyG33 zC^ekyACk(+euC6+vY#iFll?7H*Z3!MvR@>Xll|>d!^!@iQaRb*DK(tzUzW-U$z-Wv zgyc1;ydXYJYC0@C-yX2ukvag@45{H|^wm;tg*sDe_?#f#UuZu;{eaZ@{>h9{eI@k` zShJ8%wVj$Pl25AJ_B;5`y5Eu>k z&AtNCHCqRyYqlOp*X(N`U9)e1bjiL2GAi{Qkk@s;2i^qS0OS(_egN_b0Y3uygn*xb zd*Jvs0{Mi1pMh_>Ht+t)dcNX8xN+%eA4 z`L*La-8nkm#+~EbdCp}xm*w2$&asBD)NyZgy^}b2FUdcxA`D(78%)237x? z{djDtlm0vn?4dLNl(;k;-rgGG!xjFY#WjPvQ2D}1KTT=|)TgC}lRh88W|RIurG}G! zeW{c2-e;w<1KM;m3)b;cIqAP3HJtPtN#&&fveY&HUQYUaB#7;uTP8J}^xH_~r2mH0 zgJIeCa=%X}shsqeOAROei=}eXe@ALK>35TwoFY#^u8y($ABKbDFgqA{$(}Im72i_b z&lW!2`u6C7sj+WfPLG_d%=BJaz48m}*FDmb?+o!bxV{^YTW;$)(&j8K(xwzUHCXz3x^!46hc{e0tP+=o_SQqL zZ@6^mEsjfv50o!lI`o&C0rg|4;nHEC)FP;#NTn-fPCDa-!=!TQ@VV4*>2QryE*-v- z8ZI4fl**;U*HYK;Q)+O*z@@`&QW-D&PHMPxm?D)+haaSdONSX!xpdelHC#G8D3wcx zU!;ahhexF{URb3$k0p#3&X>w~;UA=i@xnz?AA`EH)G%Ji=SYcEDkUASyn$$;KeG(SF6#w(N;)h6OoYubgZCHG!SW4nEScgen@9Gb* z_K;c)pI=vM_+0UQrE*bQPig~L_Q@y0sv(un6+c>P_+0TrrS^o{P->pPw=b+CrCtr| zc&XRBdJ`-@)hs1(53G}<&T{n;Sf@z+2dq=2vcB!8mcin4zf%&dizZS(adjOmJ`pV? z!RLyfE;W3vczda}@NaXebzs>i^Oxl>z+Z|!zm?SRx#FFrcE!JENe!PX-d!r6E8bRW z_+0TzrSiGr9i&c&W#7wRmhX+flmwqEer|JG;d90NOMMsro-cJZEPF41S$+uqQW8Jm z-@i1c6+TydlvF-fytCBsx#DA`^10&aQp4wpPms#zig%M5K39CAR6bWcOKSLB@w=t+ zx#B&ghR+q}Ioor^FOwQRSNtKVe6Dz&)bP3DbEWdR;+IPepDVslDxWJ}C^dYp_%l-Z zT=D)=!{>^>AeGM*zfx-WT=6%g^10%JrH0QHe_JY_D_$fue6IK^seG>ZaH-*Q#aW9f z2|ibRl+^IK;$KSTbH%Tb8a`M2JE?rG_!z0-bH#s=%IAvTAT@lhcnZoeCBf&4kCz%g zSG<~3K3Du^so`_Q_mRryir*$Re6IK(rSiGr6QzdF6=xgVybrf$O4-j9?^13^sdqts zHhv@RzkJ6DgHHcR7g~5c+_1z~@EAkXH?l1@fxlaX?-zJRZpBik|=+13VGPy#^-%`CRdnfqbs`DZri4-cJP{4r~PE zMTEw{EMODh2w+nnpDTVEa53<7;3{AuE1%)3?QE?-W|y2if01(TyduPTydruB0t1KHb#)YQZX&o|mR zhWahvZO%=1Zl-gOIycw3CC)8%?seyuJNJQeYn}VXxed;xpq<&V@Gb;9kA0kD>ou;n zbG)2n+;PsG**ZlX3ICgxe?BdcJ3zUZgXzBb2FWL)VaCNEpcwCbFVwM+_?{&TkG66 z&TVim1>=kzGe;^bgMFMkz`5Ga)p71P=T362xpS?Z>*U;p&Sg5+)44+D1~@muxzWzu zviw*9_`(4=OUFZp^VVE;p zD#M)frG{b7T&WCm{#|Mq=A;v|c{zJHa>ehTD854?y^Q57AA6kMJ)<`t((yZA&HDWn zQ&3;YS4le}E`z%TFD{V>q&uDuYzpiRq&t2&knVT^knVUNAl>moAl>o4K)U1ofCr#% z`UB~X4*=2~zXHe|5d(pA%Lf6uBZ6t}h+vxTUTsX!_P7vQcE5#j{Ug;L$86ly&Q0+5 z-s;@l&fV+WBhEeU+|$lI z_qU~n!~3IBc@=Ag)Npv8CzZqd`%=T7= zYk1G<-#fpc@IT`5OTWdIH*VCLg1_Xeq~U!yhF1>nqkww@uLd>+js|jgzXr(R{aPT0 z_v?Th-p2qryk8IG@IDsE;r#|6hxZ$S9NxzPIlNB*a(KT9$l;x74)08Jcs~?_p$+e} zY&CD(fJn8~ym6zQ<7(cx+nk&3+)U@Vnzwv&om=AEQs=muw|vW;`@p%i&T%zw`8GJ0 zg7YzM=g7ipz&Vx<)zn07=h&K!FuLe1;;(wHy0qZBJp_`Y$th{+udp~l;NAT;waq1q4 zzpS#VKC=M7uEO6v$SW+!&;6Abwww3bcg1lfUp!V0Ub_H0MdZt99z6bKK)N2U0h=wh$u6~9Y*OP5yTuMI*m%=WTvbuS@!(dfIIezDlrQWSdq`!s*hy;GE&eFA z2x_X-QLwB_F}TIwuD5%Bcau89RSw6sr7nQAhg4Rly_c(>x>C9N*<0!wR~g)DAT2|Z%=GN6|MZ(v*_r8w6yY!V;(4+w)8V8y!Pk4} ziaht#Kz8LdKz8L1fb7a20@;N>0&*4cF_5c>wZON5{{}Kl@+pw3iO+z)L}`{M)9mU; zdRM1qs|4c)M5?V4j2rFTP5$27oSW|4Oy?eTZmx4|CH8qsoqOH6<<5QJ99xGSA6Luv z-UQCVxa~7^l-hmwQ)3Ui?;pjb;o!MJE8cxi702#-pz^hbwRu)MLuv-NgQSMtx3$z1 zsO(1f;V=Gl+~TuZc163RUkh2=oBcn8%dOdIIwCw4-#$6GqshatXyT&=*hHTvJ&dqR+C2pU$&^b16 zSEmfE;#sR@LQ>rioN_|o=j40T~y^PyvYUeG|euxk@rMzjUT0&a!Bo@F(V9@vwX z72WRGBfno(Mq$?0{vbedJnVq)PQG|N91nK_Hjl_18(AZ$3S=YL3D_983y_T=6^LR` zn&-hZEBz?1bXuv2LCzILR;pHOmXD=l`KEh5j%CJGaM@8u)xp8sDuL01i~m<8bdFWR zA;`sEToZpeWmQ5S`%Q+RF0u-{_e{^r&+DGwGphiS-KP!dQBokEPtF z7Hw(cNe%BL`O-r?^iC8on!||r5m;me_e5Aaetn73*y8Q&jBwh#bfE%qSfhb(p#K+OnL+Ud~0v~ zj$pT(+?>MS`-4k(m3RU}bhSG`XG@@n^~z?*=LfV{_`F_8BdGy(D+gQh^ zfV{`x3?T0@Xb$8(1}%WR$Dk#U_ZYMS?u_$m4dgurX99VT!C64wV{kTb1h5T|_ZYMV zE(Ep*@?L`uK<&VZ*xp;@+!*I>bnZ^)rZ_jtxrdya@7zM?UU2Re=iYVhedj)N z?knduI+sAJvUA%tvZ^K6LXA7nxishMIoH6sM$Vn)TpQ;)ILD_3TDf#}uF$yw&Q-41 z(7=DQjc(4V=bb&bE5SAx!w$`R)tsi6;k zfmHh7_el+X@Xk`{gU^zB8Z0}bR9I2rXo-Z}&XYq66e%3T_ zobx!w87v0O?0` z0rEZRK>86~f%GFXfb=7}0qI9{2hxwo1k#Vl0@9D@0UQtP38X)f1H2sWxvL$9dcG@z{);;vD;lah$g;-+bp5I`@KeoVP9CyUxAu+-J^l-nM)j zolD>>jN3J`Fz+~bpmS-?)pM?abB&y153tYcN6RWG$S+9mgJ%{;0oXctO9`)1c8DQoMdIMS(KvWKeSkcseo{NSefs5nv$pzCn8}f&1CA;AY6~NNg=jD;fg?u|kR!)XU}NBLU{l}-Ac{cgR#Cbh z@K~=jTJ~!I#tn*8`!xXLSTdGxiobWda~13b3rgq(eDK8P-ATRik&Vi@LX=--1?1-2 z)rbFE2LOjk3kyfgH1j#s_iE$%5-)QG5SYV4vC@?;sV{?I( zH*EASv%v7Yjqd3gnVAJyeflI0OzgGC|E=V3Iu$9r+oHmo7!}^6sPK;W!lPxwhH*SA z<2Y;>$6>>`Z9Z%)Q89w?Zb_we^-Psg-mozPmB8bh3FNSGACSYw1Hh)h zSwIwl(mV&I+2T*|N~2|a=@%uK5S7M*CDskKWRI$2ZMJjO-DutD}1jtJK2auKc43L$$6v#?s znw7{jEAb?+L|S$qqjCKs)$U_7j-_JxSc%3>ac)a1v77~dIdZ9f+`md_0&jT}cwE&T z_T%~Dxc+}v`C7xW^>BMwi=}43dQWP$tGoucRBCbzm z0p!kyH-UqJ%YnnAG|!i5Hn)?#xzVyQ!#Iu^#&OIrj$?*#oVSg;&AI8$v9vAUeCHNA zS3x&vbqkIOoENRix%247pi+l`Ijao6vTs?Hik(LVe87F*+`=5Yhh&Rd;kMD=rOR`i2TU?3r%| z6~Pu-)=r~-p(4NVid9HPFe3tEBRz*f5 zy+=+iekb&}ZBdmK zsmPsCF|5dHKvv|gKvraRU{m1kKvpEvtVpI=k&V3~X<2VHj=j;it34k}#<(fYu{RpG zr4?C@KlH20r4H%em(YlQ^hWeU361DyadftRR=&{L+Hq&j#&ou@D29~{!{%i=Tf0at zg0-X6QLbJOYj>%WVO5nn!_`@^_La){aUK2^;jeLQ1bP-+Rs21Tzbi^_ycect^tmFh z`&KsD@;o%^BXA&mB|W&iEm>@_uF;FpqU4L`KqsymFf$_eLnG#S{SnAU|0f_D`=5by z;tmATd8+~B$Ws&e1TYQA%LE4lSzb)DY?x-JXyToMR%)V`a~$W4DX! zxVGR}F|F`-Wmyd_Govu0cTVrEeHu{G>n|@dPzM#v<2n+^22&5%7+4?3hI2F!eOGB7 zJJW0sO}#d`U|nTYoDcTmPBBrogj+Z2e5L^)t=Zf4Wx~ExW(mINo1w+%V6_ zQZbHg-ttXxu7a)q098ZS`cDZ8pV6FnJga!?A6#DH7mr8O!H1Rbib|hT4qu$DJbu-{ zIQ`4-<=nI*uy(|sgTiC$?*wG)zaT2iW?q=IEIwr%&&W8oe&cR*ZcAJLuj)NjemLsq zH@<74)QSAh>NDYRR#RLW4)XL8hO-vp=&>HGe63;GY||dr*-|rL)s`B1tmjBAf_k{r zQLya2*TcF{>SS0)NS)#8ELiDM7r;77>JnF;r5_> zsoWlPg4A$(P=Bf19(1x)Zep-w=Jue$Qn@{-k<@T|&`_z|9@JE7xIO4q)(QhGjJ}mp*r(sQy$}Re>rG{Jd?~uwZ`e#f1(cjA-hn^ypPc+dY|4|-TUTd6r|_oWcMsgZkarD*6 z1;eUXI)O9iE2$q8OaGQXJg|8}UTO!We_0QlBlbgTe#CddoWQ!t0CGa^25buK4(tNV z1P%sf0XdoW0CL@u4dnKwp1>b~IY4f2x)jLmO_u?=y(t&S?M=Oa+}4x_{m058x^UkiSeF~&;PJ|)114TwwLITp&NX!I1m~JL*V4I; z&auSpe7iZyO|x|6z3}FG_`B_zXSd=f&qfTxp;W8xYKl1IRiwm ztSj^L?T1L};G;@-mF6;4Y)`~MG&BxoLx6OehDHsqxi>so7H%|-XJj0mCgbQd8CSuA zJEw$#dmtz{2E*b3`r-vwR93;|WasARr|0BhsnsK+`xZUojjg*pk8^ZXc-KXRH#RD~ z7G8L?EW~FV&&oI!nQ^>cVqB%iiK5tco5D-=+d8TBg?`%w;?nT_533!90hqbsnnArt z`C7v=e}aD70;w6WE|D7gZA+vULG3Da6fAo${kG?%PKMQ8YUsDUB9(qy52>Nw_J&mY zZ8=gyziow7`fa&Vt6+4q@7)E~Dyj6_@}-7;+s9Jrw-rbY{kAWpCVikikt-hm%mh~z z-`oW_w5*=mt9MrRG21!*xvkwDb4L_UWjHGNVwun%*#iWJPQGr&h{1BY4M>0Fc3@NB z9YFdc6M^(c?gY{wxeG{tWD=16$Ydb>ktsm>BU6F&N2UR}O?Wzxv*Zk5=P1oOVVeF$ zOCPCdS=`mQ%Of>4!S6S2sB>(&#*K6CF6X8?_n>nRJNJ}xi=2DWxmTTA;oK_cK6h@N zb3Z$`!wz;-sfpbpt6GAs)6R{LCbeVcMr-4?&xl*crEgYBzh)csseywg74op9Y zT$#&H0! zeAAtq>D;5vvGgt93(mdbTm`+Vp{nHF@HT4#+<&rLP|4iTTGsCV;bm2F@0c>g(|h#T7Egbw*tUgdQ3>olF96wl zUIaD)5*&xat8_k01p9ZE$8Scu}WmSKl-UT^@TYCw-yeRADsAN|hYw}f+YqB2AqAD_c z3uM3i4%ig-+1|S>8k3hO6KLP2QFwNe^H2Y~AZ&tKY6D&333L+~tF~qrH&W&|$ zymOPBV@ccR(Mhq-o9|o&`}1T~XxN|63@Vf-c4n+X4*|#i!@e`RtO_m6$WFH{vFY}F z#4WhOj_;^Q(5Ffh>(hS#^0;;evhdq_;nPY@&?zyFXJ#CGvT^hajoZ>bU23nKrlJme z%c6)_50Sr^%_DXSv-Wpyva9iaKWf4ht9yQ2cC;+XdWviIx_ z7 z>v5?wT%850zf_J8>+tt7{?3k#AkTuUiod7vcWv1Xmupq~C7tyAZkM7RZ>3{a-uys) z1P+U@Y~QbzS9pbGSJ6$A!ul z_Qz|avOhj8HSCY$q!vN_r_@ofHuuL{rLtb1l^XWPyQD6F`hwIY{$AGWG^r`D*jssV zF+R<(eyiedHU6$Ey|>~?9=Vug3NyMzKi`vv{3X1$!=>`gPTzoH2gLJYuiX`x8}Ub@ zm+@R10@-Vi1vUj92V}239>`vM0+7A-L?C<2NxDwREYxzw;nKOwaU>N`?L!P?xT7fNN1 zUMV%~(f^dn9=%Fx*rT79n(WapA=fFf`L}qF9#ck-?$Kj=Pq*=_Ko#%F&Cuhj;@n#R z*^^rW*^^rV*^^rX*^|!%vL~MfWKTXD$e!F5$e!E|_ZScb6nsV z$7q`68{!PtueTgL50%Caa3QcJ@M0hD&vw$31djOjPvw>ZJJ%JosbATLMF9mXJy$r}PH5d3jFc0_xFdz6!l;-7PrrBN3 zMJKgi>!f9y#Es)7apQ)2zN?*^;M}dwaS>i0ZImX>kMk6f9!exzq`rUC|FWi#n z`LJPd8IyeRyXijf2&^5E{ZMf{o-2Snra@6fcJhj(Wsj3Gj%Q^Y$6ez%?i%+y9Cu4y zP*!R6zunJ2h)Y9xR99Q53v2Vhy0176tUD`TII#XvDhJkTQnUTNbWqZy7Qw16b(E_d zSPzpr8P=Xs!-4fksT^4Mk-Eg+%LU~zQrQaD;g7CV{O+vc?&pnVv|2o{E+Y@S8n6R9 z`Z>uod|C;w?X;w1k0@_JIUGHJL**zShsvvgO@X6<94fB?a;Ur($f5E&Acx8^K$hKD zAcxEwfbU0Xx}i*Sh&<1G7A?Dr%s3vIaU(q6Xy@3+EZ=R;O?PglbB{VV*E!a=y?3c| zuRF)1w(tGSxv!l29royQJgG_{cNd4unv(LPUsz^azZ~$ zYB-@^Ae9q(U8x-4?Rz<)Um}$&rFv57`EFh*Wk{vxd$iPWLvxN)ZfI^OHQdnLODZ=s zA20PZSoX=h5v@=vZ$vvuYIq~sl~Q>l+Nn~*8_|lS@giI$8_}+p z${W#|OAT*C8z+@FqP3D5-iUUaRQ^`XSyIE_ikU2xzZKI~YWQ0*GoeMBn7>NpZ^fK1HTU$r1H07I!g_ID`t_@&!DDD4Sy?U zsZ{<}OgE|FZ^gVMmA@5}B{lr5nAfE8w_p49NS zVm_3557f)0hQAf_xzv9^EtL8^ENgYkV6B(>0j&N~KXG*(tPN6kOu_RUr0xRC-n$2^ zU!>N8HCSpLSC593QjHG&>9BakJ0;P|)poF|N$m=2xYQo5_JXyC)T>~Pk~-4WF|hWR zItkV_Qm4E60IV8PpMo_;>eH@12dkD;7;@KFp`PQn4SWodF6=7cxH8=J-(+KPdDmyl zi*Zor;+(JK_1*1xmn4tp_xw{iJilkraf+As+E{ugwm!U)^>J7%-6EFGjHQRi($iw; zMa9x~0YQ6;ilSz~uVx!(FykoLg%N)XmRM}}w*$F!y93Cj+e9FjZg&E?bh``4rQ0MR zmu{1RT(V68GP*St$lE}s0eKt9-9X;{F&)U;QfB~pTk1VP-j;eVkhi7I1oF1j`+&S1 z^?o3Kz2^ZSf4yfGkiXvZAaD$DHjuyG^H(5$z2_kyf4%2nAb-7Q4v@dz^9Zmd@KGRt zz2|Sh5x~cQ{Pmv4f&A5;xxiJxCx95P67zru0iOgm0nP_r0(=TM2)F<^5%_oDJm5m$ zo501uw}4Lr-;2^5OPJ;o_IzK$(z4rKjJrHi?RFRAhC0VUg>mDYyUV$$&OPYd!_GbB z+#=^*bnaE>==Iolta9#i=hiv*vvZ7J@*Q@&i@le(yBJp^vZ^KM2^n{kbH_N>*tyf4 zYwO%O&RybMhI74~yWF|K&JA_$dgsPDcb9WhoqN!^hn;)Mxkb*s=-jK$t#EFYbDul6 z&bgnR8*Vwt!oonkHeJuNqOPtGaj(v)1wZ!Gl4R&s* zbJsgJ&bhmso9f(y&OPkhQ_d}N?nUQbb#8@otDM{5+(zfNPgteYrOzL*u8Cht-&tH5 zI?6PRrtzmV-!HBi)N0BXE`8=m&45~6YBnr$ySVh3Clw=#T$pLVvi2Y!hbtY?E4XFq z{1zS0J+png^kdS0o1b}S^ssC4NPySjk5kYtz)lf=cx{`4jsW5$6GsA@0_y=e1sw$( z2s|1%7}x+fJW7v@(i~!csKMsU=shjlgKS)Zb3;7eFz3cPH{Q8P&atHJ^B5bn&ztYu z_Gyy8>QcY*!%@4Hp*$ACuO3#aY-^QmZJUKKOP#3q)N~rgDEASUhT>nWi51CcvgHKw zyf{wO`zv2KQNJpc6ZM~@h7q#g{*KAAVCr%Gjv@@T1HjB;bp>{k-FO7`)^n&`?CN31Z#}c9pFUUC+`evSE+x3b%WG2 zR}Y7^kJOW4jhEWg)t0boNWBo&%~HF#ng#0+sr_NyCUvl@BVg5&ii6Ukq#5cez9^ZB zT#PSG1Rh`RqU6~B@XceDfz^}u{0buwU&%n`?x^+R>H4vB+gLg`mcA~QzCV`!PYSHE z{@-VF$18dMzr@lt(b9|SjbrJ~vGl-V>CHR8AHuwre6bI4(R?fj&YFCkh($2_)hR$s z{E1V6Tr@WVa?#uv$i;FKAmg@8fsEUp24vj!bRgrl&47&Co&jXswmFb-+ZI5^ZCe5v zw`~Pv+_p84aoaP2jBK3+WZd>_Amg@efQ;L=1@;2A12S&g9>}7wq1aX z+ol5Ir@v1Z?SVPIk(KYmCmhp z?hEJEJGaR>`jB=k)g!A~VlU@vI#Ry+5FbL*YkBTkqT^=c=HGTNzZ3ER>&fHJz*F9A_UZmxj(YagH8}ecpx6b#|^Y zn1_zP?H+D>c?PQLEH2);CF98cOI`tyhtZ*3OLe zH5S(l)>P#SV|}Mf&44;xY8dM~TWS&1d!>f4zVoCq)_1?u8L({4J_}Z7sr20*l)A)K z#`?0PGS>Hy)HSX$*4IlaV||ZEtpbn3KA8_#Es)As-(yn4Sl>XYjP*SsHH`I*kjhx! ze5qlq?;5F$_5EGy5LouTBVmn~%2?lGsbQ?|E~$+5{X=RP>zgW-vA(5J!&u(~QW@)e zUTPTYdsr%CeJ@E3V|`CaZ3y*MsbQ?|A5t0XdtGW6>w8WrV|{N*4P$+8NM)?=ZK+|b zZ-rF)ODm*?vAz$bGS>IL)G*ffxm3pb)<~sqWaaz=tZ$?;*7uRrFxL08RL1)LEj5hw z?YJM~NR0J;CN+%prAlS2?@Os+tZyHwjP5H@zS>e5>)RkTjP)HM zm9f5`q=vD+W27?Hw@GRk>pN8{V|_au!E*~^eWy!htS?1s80%{zwJX$}q=vD+bEIAc zHC1XD>$^xQV|}|xoespM_t80))MDr0>INeyFt6QnZMS4(Ob>zgR`7O00xy%Uz5@7=IwNW~#5 z64((n8IJ@mL@q`w<^fMAHxjtDKc>h?O-pDE6~LAR~i) zfs73H19k!S2Qo4^0LaMT6+lJ?uLLqOI1tFl;2+3&_aeBp@S$lYxv3P60A9I2Fi<;56Vv!0Es_z!|`~QJP~O z(~J=Q26*xz~ z)Q)+Wb7P$w@7yHkra3p;xjD`)aBi`4FFCi&xs}eXcJ2%3);qV!xhhq>{36RDgi-l9 zSIhI&caA=-#OPhH`&Eem9mykuT1O#>3*8 z!K$x(VMOBzsToj@ks3xc7D+9FdYsfSqVa-MMl?>8Is=xi0T|JEO)BS_Q=~3&l@X1% zq^^L~Sn3*AKY_JcDkB=FNv(nr(mt6HjekpJMB@ypVMJrSR7NyfN)00#8>KR$ai-KT zqOs%tTr)DF(MIYJSoXb)XrxMIM5DdbFru-qR7Ny9N)00#2TEl`<2#z z8b&mZkjjY0#ZtqF#xYVGLhT|ojA)!J6^@HmVw~&ZE3wXaCq2aTfhU%`5<9+fPsX0} zP>OsdS9)*7(i>vwvTkbS@0NHPk#l{lYaB;{MNKgJTAU*lVf%N3(0_n*=0i-8C4@gh`NgzG>`9ON|PXX!EECAAz z|2vSL{6Zi-`9;7sz^8%jfJ=a#qBPqS)AV#V!Y{N9`LxW_HLf61&C@k*m~-@WjT`UW zB6m~&&D8}Hmq=eSO^^QiP(P`Q zmDk?bj4H45vM*I$=WTucZk5epo88kpt75vX5;^A1gIplc6^4uenNU7_Z^so@S3#voG?+=23>)NlvN zBT~5oWr5Ui2g*FD+<~%4YPbVskyP$LSt2#uf%2?W?m&4)YPbW1(Fc1X)^k$B9Vl-~ z?TYulC^g)H^1jropuQq?BrGcpJ`w9bp?i zk{a$n`BCamP~Vjr?m*$bhm-_&pu8tF4VE1h?>0-7${i@HrG`6D_La&VC?84QJIv)*RZ~k z`h%+sls1>T7p(849stWe`5;(rr5*$8N2w>e+5}c7sU2YbEcJX>FM-urYCf#QkvxLF zt`35gA$2UQ9i`sn>O@#MQXhm>Rq7+I&V$8RQA*+kSi4AF=IUFp81GI=d-c16EC`54bu9);&^}z&cp!bFRJ$>p`h&VAYoTZ&$y9^|;h3 zJL7k$r0xvM&UbfMPf0x())7(9}CBa{tIY;U|R~NymA@wy_out0y>ie(`m%1L-1yVP- z`U|WhrS6%Edk56eoUCamM7Hh^`B)Dv8746BjU_OQB2J^$u8!tEVJp!OD?3$JHlbG0L8jcpg@+)K^_y4(k%BpTNqO`jxBS z!^)JpOEv5hmbyDEJF5L)ac2(pP{QgfwZ5yz!@685rUhMFYKXBSer>5Ea)C~?0iIOO zwWWsX4JxlKZPRN@+%WHu8wW`8cdO|EcCzgISmi{W1uDstjEZ?oU-#5O?kLf4i zd+?R4zvZ#?_p$VT>~6*KA0JD1ilzI+(&J<4hhyniV(Bkq>FSt4i+}%7v2>eQ`m$L1 z+F1I&SbAwJ{c$W^74ul}?>{t_ZXQc_kEMsj(oXh{mcBTa zzA~1+J(ivuOTQUQe-}&di!r|V_a7HapBqaT#M0wp>4#$Jmt*NKV(Hy5@)!U9dd1S4 zuYK3SN-O!|oWX0~-9Q`|@z3KLG8@`UKwkTP8OUqjuK>FMUj+^ZE(7w~_iI32`+gnB zYu|4GdF}gOKwkTP6Ub}d%YnT1{T7hdzTXD&+V?v^Ui*F*xD2=g$ZOv#fxPzp9+20* z-v@GTUIpY_xf;k_tZRVW#rgq|yI4O2au@4IK<;Aw7|30$Yk}Ow`fnh2v3>&NF4j+h z+{OACkh@qv2XYtd7eGwNi7$Z%0lxw^0j>jH0$dLq1pFE}5%>*|yI8*kau@4&K<;Aw z9>`s+8-U!!`U8-=Sbqd^7wbJ#J56W8hxE&cMBa1A+Sh?*Q%#d;+*1a5->);P=1-fcv4x{1JFO@K3-_ zz&``~01pI?2i5>S46F%!1$YqfOJEwXI$Hd}z@vb*fNg+>051d923`w16v(HU9|q*} z!w(0346FmJiuPU?cqs4)U^8GnU~}M6z_X$>eJG~6m*QvaJg~hKv}`YhaRrfTdnt?? z=G<6+?|A1JW3hbGoSW_39Oo7|x7ayGGwi*~oLlMKYUdbzuzc&C+vFUhg;Z@Xh2`7J zxtft>dnqhmedii_KCasBz0I6!=UhkUx;WR(Ij)cGy#>y3-D})1=f*lW-nmK6O>=Ix zb900B+(SKm3tAuV4M=bAak zvCYb$qjO!H>*idZa|O-~ac-D%W1SoC+$86wIXBz6InFI`Zn1MOIk(KYmCmhp?hEJE zJGaR>?i#i-;I3giU+x+*8ED=klB@aBhfm!<-xI+<50EIXBI@+0M;zZh>=)oqNf-WzMa1Znbk?IJe%p zP0m$;M-i1@WTE_=tLa=V=jgLonKEi&?``c|8|VHT_r#TYDRRJ(4CaKFA_s~~!&E#F z!(sdh)mMpY26c$?wT5NEq4uz@k(vQ(sMKs%^I-8ZR7#=<)(EMiT)iIFO;UL&@@lCw zT;*k(JEfw3D6q5`7!NEx3l6oEcp85vmm63*W;+L#HZOE~<9L%Vo&y&;)qt51c^n)( zp4W*$E_6-;a-nlFunX`M;9%gXKrVC|0iOUi0dm396u2l#vuv2A!?+2~MzE@jVGpg{t>9DSsn&oOPtox)6fpw$Q5w2bb>tU&P!I~iTZddPz^@P;< zux^pM*j4%~3#GmT>vpNDT;(*qR4TWN+$oh?L+qIOlj_`DgiFb=CQIc5GE6-T)*Di} zF=Lw4Ca$)C^{&(lV9k(viL05g_(L%%iGHwVN*(0ta9E#8y&2X6QYX5~fDHozxReZQ zw$yp9E`r7FO(}`jU_C6Aw|dzz^OF0|QW=tYRO$v-e}VM}ERa#Z$n&^VUbMFN)`V4E zY6DpFq@LhvV_5r2Z4c`ysl1G5@8zvwf0CL9YoSzL)H9V{{J~PMhxN2nUg9(L4p?=i z&Vuz%sSL1~%9=k$>hrLkmCDP1rY?tdqSQ}dy&#nr15N!NRuiea;NO>}^3tHG`@uRx zDg*t?q}F%!cvyTaFn%5o|GpuWX?t%cSm#RZfq$1vQ1oisH(#n zA~g-xCsGe{^(a_8+LT07a#CBk+6LAbsa;@wB{kF4%V15AIvCd1Qir>GEv!4F-U;hF zsSIk^QQZe?veYMG{UCLbt4m>Vvs_BzZCD$nzVGVCux3mB0oE^4e{r=cRxyuBJpfh} zEI3jUHDTHJ9t!IzsVBnvgH%5J#MI`nSpF%A^I`2Ql@CQWwL2`<2{uE)swQ=ys|-vq zaFvp{308Hfcepwg)|*lvfwiYpUQV@7UI>e!u9O5r5Bo^v#Z^<^gY~i0b+GoA%1f=L zGW77N)IG3R`;$~&cr~>KtgodW4XcJ!UWPTb5v-r2wu6->l^11Ay%^SxDA$xkFIb02 zPqG1TT|!4+E40pu5F6OD`V-~W9hlE^qaBtcd_)o7$=K=|8cSOxv_LXEIlrkekhiHIhJPNyZHC* zhFUG2t`|$69ZO#tOJ5U9&y1y?iKRb^rT@U@g;%otYsb=O#M0ej>7lXolvw)ju{49R z#lP?8So%Qp2G7{eb}AwN|wj5v2@2+`tn%%##s8V zvGhyD(wn1D2Slxc-^@PEDAZ}Nca8X#h#K*YX9C&H&jKCi0geEE02~GU2zWK{vnb6mooP%AiC;WgNXw#y#xYuG99I{{4Rems zLgN@Mw0x7Co8}y&g_e)eLd&wWu2N})@iU#RV!=> z%i1?1jf_!Pq_K(AELU@3@%FWp#1L4gOC90rb+9@}#XoAnEaP|!o(YaEfo0vO+!kDs zUny>mPvR@tg1cMN)2jVQ-`rvcM7an&CbrmJfjmdPrl6(qIPV7XFsB3Q5zheD2i^mu zM?4eAR(>Cl9`XIa+kmrx>Cazj3piYd!q4I^m_#kqe`%hP&Uiu=VgIb)IHOx;c&|CBaKc)&MvhbP6hwhZC>F zL%^|;apZ}{YcYl=F$*~nR(MolhHNxUUw+#@$)@ z!p6-Trc)AZ-04!o#(k4i{8Osu#o3M3J`#UT%Wb~D_Cpgl50PDQJjoZ2kzlwXz~w;BTWrcq#t6f{m7QfXN;HIB{HxFMd8 z&D1zHQ_II@YTP8}*i4P1$7T8GaT)h3HOW%jTsO6hu+3$OOT#hUr8ZI*mJNHHoTiFn zo9n53VVmRimlXV0x;K;yjkVJQf2Wn(s!rI(yV^Flq6_i;$rq1_t!QUpn}}SER>0%@ z5Xe^a5sa7At$&&s$Po#PtRxL;{(`tN-h zQ>mls&1yg4sCt{YG?eD8YDwX!dY3qksuPv3HLT5U>OE39lTVVG?P?yZ`=u7anksda zt8`Q6NSzF8y3`r2ax9rAbpfnQY86CN?U?xh z>ldXaXM&%Qt5vMOa7PSB*fijsrS+H7+creQWRCge61kD82jM6M?ra2CD^>Kh!YNEe$ z^p1?X+Bte!#@*`NMCa~x?g8f>caBGC?|sHOwlCw}bnYGJK6dU?=e~FDC+GIS`S4S! zCH9G|)Wr4~r%D|R9%{vjBODAK5toM3Sgvjo4hHXu<6!WZ@`Z!J$5Jz(J|Q(5mUTN0 z2A@eycDwt)w1{;(RwSF*Nc`PZYPajyEWKOb9zC)O(hIV(fBjBpewn7Vt~jpbi^m#w z?=M61?XZ|>?W532Lk&5*xr~tcr0n$oMu)P|`Gc%6G zW*kGa#%<}qSnANWSVbKUZT}FLhA-U#y)z!M*hO4&c%pw2uZXtb*uC*Fi791OM6Zm? z(1!aK6lCQUVvx$n+)BTo*bvkK-<^E%csK;@1Z*CWH=`nWjJE+f1laetT%X8FOdn z=U6MoEp_e%=YFNOUux@pQ>`d$y>E+4!!aF;qK%Jpr-)to>pfj+vITO0ZXRoa zx!_oHJ@7ZJ%odn4AS*Y$M}9%C44cW*@QxB*Q4nUgNJ=)d!(-{<&5+G(J@oP-WsjnD z@K_%Q;=~ejflYx=06PPp1hTcw2WCcTo)^<>RXxy_ESN(pHNg;$aRVYNHNoa@+-T=G z#TmyEwD-<(?jh%X>(=sq39V&~x0co=w3fEsT0SbFwOkOi7WUJ4%Erw~fm~3w` zw9JDvjvl0OqdecW&fVf1OVRSNo!EOHb?#ScG389Xr4B#;E}=nv<_+rN5*k#NH>fX5 zXi%3)<>a|uYBsFRlV@+K$-#+3^4YP$srU+VdTGtA#f6>HGjsa%&ds<2D~;TIw7QIL zx!bzU#e+9KHFm{uCtoG4BA1~lu?fBb#0e+<1!NO^6Ue5w9LQDV+dxi{?*KWWF+DO$ zvnlrUrbsI_!S@(H^QVpDnHk4f!Z^+n#%*c; zF13elP*H~t!cXGT@TEgl=yhRPMKpkQbx;v>OXC&M793kBJ|=NbSrxGz7eZg6B6y7J zf$T+J0~-Us1vUkK2joJCX`Tnuthh_P;%HgL8OMqx1Ql)ZI zv^K~xeL!k*q<;iVSqq_i%W8xF;R~Uk(eBtzF_o#E?f_)_tODd{zax+>F9k@~pem3H zp`CzS2ri*+R&;K9On*A>%l2SU!&b#!YZ;vU6MrSw4>cmXEb!+*0RW zaPC)X`=z$t-PDT0ac&QBX*i}w_Ws`sp(n+$_3o{F_@`LwT_QEv0y#jJwGf(FW((Z@ z3!&<09c*QL0&!xAy?|_Gdjsj#?h9mV+Ygu-rF%qawyIojRkUm&WE>Yl#*OfNqn+av zXZcuymT#7Gba0K^($-RHbJ$N+8a9VNic7crB=Ko^eczOq zu|mksDa^=C@0XJq+Yyn5k1gR+-xezU{LXSiRu|n$uS)oS*S)s=OS)mPqtWc&| zp-i(v^SnZ7r6xFc7&kPsQWKnEjbjN}zM0Oke;T)?75XbVD78vx4u^Vk_^gEH@U1uw z@pY6B{}dbIf0RlGE}~v>F51q?!OZ2{Z+AvG_miy$^hk_5S~V;l0e5Stu%*OcAR_ zl1wa<$(EL+Ka(SbG7QU6bC3zmPVLBXL`P+nPIhVuDTPc?R;_;$r9X2b-^#8b7uJYoEd(8%?v-k_OPp&PW!bNTy2f3{db1s|7<}2|M%X< zJ-uEa2Tb+TYrNEA*j07p(5e2c@>HprL-Ata_@~ODc$TE*Q0ydW^+U0Rq*F;Rlk{G9 zUo({ABwdW_D(T}cH8WXzNngQrm$cZWZ{j*j`U$Rwq+hz!yp1SP(j&MlC9VE8qEt!E z=c@IVwEE|&rAc}jX^N!XasKn0UbvejHJ_{2SJLXAt9GlTl~YeksAHe~m_Mvz4&lk@ zvR|EghK(LIX2>1?;mOBLM&>HPd{w@FZ=N!kugcr6`ZwL}&yTrX^^HkpdFJmEnXk(G zUw+JO^EZepbNAZXBYsW(H9azyNv1sy+InxMF4MOZ)J%P;sG0h%M$OdM7d2DfHK@77 zNkd;kuSGvb`=REIOxL024NUz}^Ox+eN3TZ*pypTUZ$!;sw7&_x+uk<&%G@?n=U6v& z8s|St^K0X6>OV{KYi9EGx%=IH=en91`95b_?sLz$+HzN0>uMWZ?QK_k&((Ii+Lx|& zz|{`AT7|3CV$1x;jk2z;*U;6>j`Y{hjAWm?)YZ(N0P$=8ovHn}Q{1(3U`DZ#{$Xo= zp{KvpVsN+1AzFQkn;T5Y2_im6zbS#A62h53V-d8 zADJ_{vmv+T5m|<@YyP;@9bQszVy$v;o-Eh=gag0RG;deV~ z2EDm$t~ktXbJ%1yul#wOasIOvzh<7T_%$;R`L$WD_Moeor=dPq;A*DZe$8BG`1f7s zYX8fIZQ5 zx5`!>mVf=VVJT0FZyPr_W7weo3uh#EM)(cuT=}I9%}j=t8JZJNGc>bMGc@l+&Cr~P znxQ!fHAC|*)C^5?+YC)}+YHTdZfF|kzh%|0nS1-SnT|7S;@9T8+Co=*($!4IeQuqr z6}#I1vY~mq44~>mGec@ItnxBtXcoDlIaWCSsWLQQbVGBzq}7M!#%e>;Tujc4-wUovY>V`!P7nS+|4IRiCA^Ip^p&6%hfT(eO#H19*r&@{Kr&@{Kr&>ZiE zrg0ITnJfKTwsjHm4sgFV$JNYS>DSDqkbmE$u4X#!*Veh38Jd3WzcV!do6oe4dm(YB z4BqO8#U!c4(5^R>!=lt37TLn_PnE-Bn>#F~NLu}{*d^&y?s1Q#_qzL<=Suq}U5uL{ z>EkXnyR%%mxG`h@!^h$O^jV9XWBiv~rm|g?UuHYa^NvUg6KpY`L(y#e zgQz)_=b`3M{v&D*<@u;Ng#Uz^gKYu&68aEoo_8!n%`X`|jGE^ke?}|pZPQP4+Z^f> zIKcfkEEyN!WxASq54m5P=4xh=@N4<5X5K^Y*B*5>GfMngk*lq6we_yH(bY;_?E_c) z+|_ou+7VYXPyhVKIKlT2{9Xp3X|g{E&3gzU8&@5KSyYZ4ge|F=%bBzJE{f(K|Lf?l z51QYEV-OA*Gj`G-xssMa*t!y|uJ$G0y0&Vbs#X~k7gd4HEG0W{lgSaCQj1}W&XT=Z{aHW@shMX14++OVRn95rOFEd^!;)4%r?i)JD(NGVRzIh7 zmedU7a=usb-Q$><-@F0X%zg!YFaMRXBfm{|+ifHHHQq`8m*;->d|?FZSovkv+Z?nJ zXu2(~Wt^F9c@;G?`3AHbT8x^Rd?RXR^4C!F^ZHHbB6KtQn7wWKU~Zckd!ie!#zlDJ zU2URu5#DrHo9SwEU2VRrEpfFcU2VCmnLXn_#uit5$JPErLd6Gsl~8P zJ!DK(AHlt)W=8N+!tqa)5!|oZC^VO@$G(6vikjJTxAFb_uZ+U6~x zLo>`ye$8C` z`?Va$&2lv}ANri>pwBIHwP#)JKQvnYqu1}p9g53jI8`5t&qytX4ZcwsibLE`d`>w2 zsWKFAm()zADEkXnyJ5PdA)J|NH}ZY#_048# zX5eh#d&RE|a(Ojo__#4y|Lu$HD%VS6S?9_xvmIvYHJ4UqfSa$K3~sY+U!dlo_!2b- zMHy-ihFz$cdjE!+DfcUMHM$2i7t>#(>+NmRA9LFrER)>9Vw``y<=3)o8sSZI+zeOC zceQ!0_Nc3wJ?Ag4$kkT3npqG3G0a}{xgD4 zpLZXWTIHZKgY?(l54!SK2Hl;*#_|6CL4(JQ;}UV);L-o%S6ZqJo@-dI%CA(689cSo zBwH+JXPd$EEouhOcW77i5NZa|4`@$&yO+If2FG1)a2V&mAJngzq2||SJI-{+uNAo3 zQdj#|cjkX*S}ayZ%Ij{VEKo*Dfz-?y`VHaur^>WgDCuBoC6ZR37N3)JD(O3tR-YEv zNLo1tUw}IH>|XU6bJeenLI3SMgU9{{e$C|A_hcOV0z>85e+27a`K4WBRxlRLSgo1j zkJVbJ8KWW8OmtzW8GWaq<{C2`H4|PP)Ldhl+h+Wk+hz>k?Z&Wi{?&kAGgkwCEyr=Q zT+Lh!_?)>K@Hw+wzqZuXo_95~XMApptC?#|zxKa!{Qr}K>$nr?dooO`Poy78Erty) zmH}IRB7IY8=J41i9RE}~Jl>bo93DF)t$uiHlXNQSPD!gD9$!ehnDh%t&AG>aRb&}% zucVa+&+AlPdE(~RraNw?tIc&a^Tf^P%!c{*ebUvIyPA38=5yxpea`GfzhG%^YZZh2x(p2U-n&lJEcV!EYoT?o#u633Vi$iYu42 z`hj+;q~<{TR?_MR+F6oT9%!4Ojy+3NJeugW9sL=LobI55nC)(SNT+PSDX(9T26fz}!|2U;7{ z9BAjG=0IzQngcBkH3yoxZ3eozZ4R`_?m#onKYRH#bN2FUX8rxzELSsUFTZBaUOrdg zYD-)QjTU7HTUNx;)&#ehRBl4j$tFBvQ!WKeFqiqr*wU8}Qbp z8Y7SXL8tCjaPwH^YMB4Mi*3DbH*c!3k*KNHN1LEgs9C25sOkMc*L&k4A@LMD{CagOlTO@ygQ#FJE3mW%ETJA@8hbyFW!dG;%+z)X?jPc=!hI_)WKzD(Ip?xt_P|tXXYg&b10%_P$NJo)CT68xtZc*5z)xB5Gwl zFK2Vs0e6hw$(`CC)7Gj3JC3clUw&IBjO&py%>R3FmBBGu<4>|hN1Fx3@ZGn@ z5c{*H6B+2+{Jrb(vqTx_+tCP?vI8{({ZrJm#S9z2EyhL2U*q;`57^Xi%Nr@VrO7ki zop5f{$_P5sB=?=f%Qj7ju2^@)ta_)K_JrrYLxaAiSFeSlJ=Z65Ha)gam2*-DvI~?x z@sl_icEs9Ol|GH-^wYP-P}e7a7><|QW_BCPclEv{S6QN24>R1%Im`?t^YuA>G5Q4> zj(&+oqGh&UyHK;v2JQYxR>>VYtk^# z_+tiBQ)=eRY(~3alm5Str7AC-bTU+oh3`zI1|5%)f^JhuFHr1vPUe6Bi_RQUslDjQ2_f^w|PG%Hc(R0SS3FoG?{rI*A5*a%U&4@~h zT3NFvr;;cJR#rsCy5x#i6T7S*x08SPlldFCTUK4}mUT*^`N&X@`@QNKsEx9LK;|o* z?+b$s>}Texv%FJ}CPKS^s*E!KXdLWDnSc9MH_EcOQ{Nh+s~nv-xW#Zr#hV73(UfBA z`)HuC`_X#nHz=2q-rvzgl!;q@$A=?*su{5dP_rH8wrRYX;{C=O=Z`wS_J~d0=_xz5 z!Su_#-nl=d)>yo3EtRG*ucit5>l4sYd zh{*apsdL1*ozNsDFVs1eJs8E^y-RCm)vj2d*k$v$PxvS6 zv_zm9wR*Ox`)mz!0t+{%tp*#8+V<<*Zd<@gbU0?*FQjHBs^9Z{(b1h#If`_>rD-#heY(JYxQM*BO`jN{53X@D4R+Z}nU-IMZbTfeRHAZFdnt~9%B zl&v3Pmzeea0X660pU|%8Vbtu(pV2GP3RET^&P(ID&6_x;nq~7=>Z!j&L+CU#44sbh zcS~hgf9H0!aS`6LWPa^=>#FYRcHdlVE+HEv=QfRM?)A>A=kFt?LiQK?=v}jqYF=97 z=sq$BQ3JE1+9!36n!sgdEe^m&HK+a*Gcktg@aT~($8sb`V(%KYWN!}I(0<*ZUp?+} zSW`3C-@|u%ec$iYCL6|y;+p%ai+6pztTN`vL+8Q<6Y;Lzh z54nA5oWC#qn%S3rEqU6$rQBFuljjEhhh{x@L9#i?ZQ4!QOUiwR^Hk&uW{ypsR&3A> z6`PW0FN%Eu+hIGGOO3)4nP{(!S{VwT{`EzP(|7azL!G3kUK^(WR3~a?!G-+j@247B zP0R@|Ca*`$P_Bx2xQ&Wgp?y zYBlo+EX=gB@)2su`mwMlsurVi{>;su?KdaQGM8U$N6kv^{wiF}sGONqZq|^NgiW4Y zxp2P_nmoRGq1NP)?bq!cZX5QmN@7tByLP{}glB6c)R-lEhRYb=B-EJD((GQd|7uQd za&+Co*eR2v{M&o$S6^y!o-AZ_J+?P_HcvNi;K}C=4U+S^cSk?s`!l|G^Zj?ee@L#_ zoJH{{H~R+s^ReqpyKaa{p1mga5p2(#%~3hCFpSP;k>t)Ym?kt#&U;V_tDA9j*iVMb zlU-qN@Emu>x~QBj+^MsF->BcO1#Gk86UrtKF{H z(8a%Z_U1iPxx0T)GaGy6-rOrg_}m|oYyFtq90>pR>w~kZ&o6T8-~J#cUj#5Gvy+q9$w}&f%$$@A;U^Xtj;>&f%$$@A;U^J`agIz0J9x|45m@(04nAJSES z5&h)r=O^cflk?-r^TYo$=ZE^$=eMYp^3LX{m2x#)`DT0n&D#F^&;5Tptn;<Z@|9iRl)E4mT3n9<^&XaLr-Xpj?acgk%Bz?!$Lf$UiEUEDu zMczH)%!e&xi#r>aC9XYgtT^*ABX@{P#|;%X1~*V#4(Z%zZz_?UMa*(7B&*tJ<2>{DD^gFQ;6DyNS20hrI5%o5c;m`TKG#&i`%eX*lyM z@gZ*x&iqz*$a@-Re(f{lt-$$9c^&63@SZkDZuyx%)+KF;5Ri*dgQx75}`-d`QJ3TO6tn70;JA>1Zg3wdujZY$1=SVkDm z{ITAUx7*f2-Zzdrg!9K$1+Ip0;T*K47V_%jZ2xfnNNkR)DO_t?qkoR;g!9L4H(V{@ zl5LItIc@-Mo~+*>Tu8VPwnqOPHxcI_-BWO3!p*WZ`scX$xF=+Ji*ct2x760?pW{~H z-VkmruC{QSY>oaoZY%CX;dbJ}h1+dw^v`jJaNC8ez||2hoRMj2^bcqIhdV4>b6kXQ zt!<6|Ij$4V{5oWq*9})!xMW+Se~ue~3lnY-uAXosY>oaoZlXzrn}UlJZkDalKgZ3- zMGLnWS6{fLwnqOPw+h!*xV5+_;WpVC{d3$_+)cvm#5E9Zx2@4X#~s2A60QOlEnGOi z8f|Ly4|h8CFz1xINLwmcHx@i&JeD(t^e^wnqOPHxbudxGA_+!p*WZ`scX$xYoig#+@tN zQd^^cj$4I0U%0in^Mu=EYxK`?TXAv1?ZmYfZnv$`KgS)yT_juuu8nZv{K~Sa(LbE+ zAMRq|n&ZwFuC=YvKgV^#T_RjJTwCFiZH@jpZUC;caD#B|gd1UN^v`hQKO?S*S?YxK`?op9;Gb;ETKF4@-TpW_DLGK3q1yI8mp zwnqOPHxV~lxGA`f!p*WZ`scX$xN*WQ#$6)ZQd^^cj$4Jx5^gQ7lW?1Cjs7`qD{i82 zJ8_o^x7*g}pW_bU9ulqs*IBr5<`Gk)e>mGe+{3~($6Y2|Yg?m#j_ZVbRJd-qF2W_- z8vS$J0NfM8nKM;_a3gGu{yAj;ljCXYV?nPZU1oV_~!bVf3FbE z%r~Y+|M=JEI^kaBo9h?;?IB#UtA3B}HOE~gTx(mSe~#;fGml9BaD9YJ zwl(_axB<8?gd2oQ5pIO7(Lcvc#FYs*1(zz^EL)?0j+>9$E8Jq-)xs^cHTvhcRk&}3 zTZ`)}+$LM2e~#OV`$@Q+xNC&lZEN(;affiGbMz0FCR})wU!#9G+do__2*w}oTH#vT z8vS!zCtO|Oy5af>muzeF&v65Ajf5M7yH2{;bsfh4L3x%WLu+ujvIh`K)6A; zp~8)@HTvhciMV{>rr?GNH_O)OpX1Em{WC`-^B?Xu;g;GO{d3$ZoH;g`|8T>F+hl9> z&v9FE9}Bk=H$u4GwnqOPcL?{Ha22?b!iAse*XSS4_77JkTyxy*!nL+F`scV#xLv|^ z!`&fVvaQiS#|^-JE!-g7DB(uf8vS$JMBF~%rrs z;l>Hq+Scfw<2vC&!ga%q7cSY>=%3>T;A#su2sc5v5w=GE95)dcA>0&PmT3O*|_e)<=`d@muG7sZ?5AO;gWW{ zZi;XvwnqOPw*%KlxH8;S;r81a{d3$A+&JMv{IQT}!kJG4Gd22$v;D)}DO@b>9^v9_ zjs7_<0hcXY5^lP1skTP{9G8wO6mBRkN4N}IqkoPwpX>30a5=ac!sXc-{d3$R+&bY3 zaQ6yVXlwM(acgj|30I7pDO`!I(LcxSz-PUxNKZQ z&T(O04lYl)JX@oGj$4E~L%0Im?}aP0HTvhcHMsMIE5_X~T#2pGKgaFBnZJJ(=9S?d z5N^M%(Lcu>!F3WYbUNoe;UaOSM*ncOf4Iwqi^csxxHwy*e~wGQT_Ic&Zmw{twnqOP zmyWwixS_ZQh0Cxt`scW8+||P6;N}UJXKVD&af@*Mg)6}QQMf`|qkoQDgG(2#7&l+I z5?iBxj@yA7EL<7xPr~iDHTvhcBe>gy3-LF?76=!KGd22$v;D)35-t|^kZ^IfM*kd_ zfEzDd5^kYzskTP{9G8x}OSqx9MZ#s+8vS!zHtu)A<=`F`F3;BJpW_zc?iH>8_h;b> zZH@jpZVm1};fisKg)6Z&`scVExIYS4hI>S~{kBH`9Crk_M7R)t!t+t#B5|fh|8TZ{ zIP(YD!n|1AW5UJR8vS!z0`6Jil5k6eOSLun=eTs-OTrDs6$qDMYxK`?*|_(F%fUS^ zT%N7bKgTV?Z4<5l_k?hTwnqOPw+8pAaK*SMg)6Z&`scVExUYpP!z~qVzpc?f#~s0$ ztLZQ=#GgWbO1MazsnI{2?H}$J;bL)r5iZWw=%3>faCNw*Wd6fFEnKRt(Lcwfj;m#7S0QXnn3T=)4Ic^OuMz~_!Gs2bF8vS$J z4qR*D%5cvLx8K(2pW}|;+6xytlTX$ZE)r*I^bcqIhwCg{Ebcks;%trnIW7U0BwP}1 zxp1krM*kd_j=M&2=eTU#EyCsCRtT48YxK`?i*Q-O72sA1S7>YW&v9#T z_Xt;vTP0kHtSxE$Qe!sXc-{d3$R z+{eNd;9e1~(AMamnPk%T(NK&wnqOP zmyNqtxE$O@;qq*a{yAi`6i*O@_E5N z!EF;R6oV5k(l~1L4`=&_`$D)_+{ePj*&6+GTmtTE;gWFMg-f+H`scWGoO$le{D(7p zoAGCB^v`kGxHEW;$@34~C&J~~8vS$JB3y!S1-MUzE3`HG=eRYv4B?7#JB2H;HTvhc z9k@*4%5a|vx8K(2pW}|;CJ7g6!Jn-cE)r*I^bcqIhnp^3Eba^8;%trnIW7TrpKwXI zFNI6BHTvhcbll^@4aJ#bg#OtY{c~J4?s?&IaJz)dvo-qXxJ9`2!WH2DCS0Md(Lcwn z!F?`VG43njN^Fh(Ic^8;C*jI)yM^0tYxK`?M{sp{4$S%E96m8pxJaC-(LbE+AFh>f zvAC~=i?cQQ=ePvi#lj`w_6nD3YxK`?>9{V!4aMyfF2mO7pX0J|Hwl-6Gc!=g%d<85 z=eR|A3bxFfiH;X*BW zEmF8hoT<@2ob4aZyvD)v58OY5i?cQQ=ePviGU1YNW}apKvo-qXxOChK;fCVA6)wZp z=%3@VaW4s%gZoanJX@oGj$4FVFI)lcd*KRgjs7`q4Q{h=#kfPlmDn2nbKDM`c@2iw z4{$#Sx8K(2pW}|;_6Zk?<(+`SMdD12{^4x@aACaGK>u(*2^VK;^v`h#xO&1R;SLLz zYHRe*ap|~*!VSflvlz#(t{d3$7To2*Oa2{s~&cC)s{~UJ&H(0n(E8YnxTqMra=pWAZ50@caEYAGJ zZmwT!js7_<0rv;tl5pnF7c>5Bjs7_<9ru`ULvbPDGHi|hIW8NwOt>6em~eTvM*keQ z2=}6J1-Mg$E3`HG=eRYvQsIhmwS_COHTvhc9k}hnmEppL+iz?1&v8d^KM5B)muIfR zMdD12{^4x@aACYw!}!BR2p4B-^v`h#xQ4lsFI=Im(Lcwn!QCNTF^)e{%~qD!8vS$J4%}qn%5V*Y z+iz?1&v8d^^%$U>KhEQsgK&{JQ=@-4+dmvn^-TY8rwSKmYxK`?2{;xBmxOC5T&k_n zKgXrx+6gxl*GRYwTcdxD%f@vOE(h0GxI9~(js7_<9e1^GLvd#bmtkx4&vDtfDZ=I8nhBR@YxK`?i*VD0E5MyC zT%oPeKgX@X{Xw{5Tyx<{Y>oaoZU^p9!j<7-gxhax^v`iea8C*sYQsALg^R?Q8vVoB z{^6b#E*5u=aB;Rq{~VWqGrtAE_`|gnF4flPpX1VTp9(h=7b{$bt z!CfX?=zQJ@C|o4Y)aW11_7B%fxLDlz!o}Gd{c~IbuCH)OxVFNj+8X_HTsm%ma6@tJ zgv+os`scW8T)J>MxH#eRY>oaoZV_&ja0R#vge$Z)`scVcxCz1)<1Q4g#MbDa<96Wg z5v~k(k#PHMjs7|A2yUiup|-peP`F5(snI{2?H_KQaIv`d!o}Gd{c~Ib?qT7Qa2T*0fmdinHv4W z+5X|`grtACD};-)HTvhc1Y8s0l5jnQOSLun=eTrSOW}s%l7!2!HTvhcY+Sr>Ik=v} z<=GnjbKD}_9l{mht`x4&*65$(*5H0CTrsYfa3!`z{~WgiH&3`ST(WTcZH@jp?g;J~ z;X)ViPC(%zai&K9aJGLq^IJTee{oj{7iVkq&v6Mj^E*DAKX847OSLun=eTs---R2B zOA#)^*65$(vT?P-%<^(@slw&i8vS$JBHUHN72vKGuF%%#pX1ixt`V*n*H^d_TcdxD z+kwjwuFRyu?YA}h=eQ%dKMEJRkaq$K7l|`9`iHaq!#ycnEbdz2;%trnIW7UWLbxPc zKjBhsjs7_<9k)Tap}6aW%dj>2=eTT~`TZdJhwCp~o~_Y8$1TErAY1|Ndf^Ifjs7`q z4elSp72^g7S7K`+?|qzk))Dfy<93PLgWD%pa|dvDOYJ+HdA1Yse#UL(ydUB}W<9>& zdMKSa&reuA3E zEkn)Y?nTYx{sT3S`y*-|moCcV)<(_aMx*9&o1o@#o1^A&&qdAS#-ZkMFGTyH-O=mN z{%C)6xV=5v-p)dAr2Zy)Gx|O{5Z#X6j+UW!poh@WXl-`z7_5DC^kVc* zv@<#pO+fELlhC`--e@+Of|~meK&PPT=q&Vh^geV9ItQJE=Al#3`_UQb1LyxDDNpzY8IGzE=BN1+YSIcP(48G0JJ1#OD%L(f9%)#3RZ+73MjO+j0sqtMpq z9JDRE47~u|g2to!(2LP}5nNBA?a<566tpWk3hj>0L3^Of&@0g`Xm4~Mnu6A=%khA= zL$5_s(EjKs^agYedNaBVy#?KZ4o3H(L(zK7e8bUp=0v(0EfX+c*LYJYhpj*)O=svU8{D;tX=uc=0`ZGET^%A*1S_@r!AD4dT70dyq<-&Lr+Ch z(8lN}vLN5B?SK}cm!PF+XS5tm zK%+T9c0=RQE6_BwCz^>Sqxonbv0@#r`-4b4I`(chx^=-p@$`a84~orad9IcPK|?3rjhdLNpG z=AoJB186=v7cD~nh?b%Y&~kJU8qGV27Nha#V`v)sIGTwrMf1_8(IWJ(XenBRmZQ(3 z(Y%vp6&jDeh^C=0qnYSBG#}l77NM`9rRZj~9NmIO^YY@`XgvBZnudOWW}+XV`RI1E z2>lc-ML$Q&(K0lecT#+X#-m@OY3P156a71yj~+ye(C^Vw^hdNDJ%UCzJ^W6*rGC0c}@iM6W^f(SB$V zdOcc--iVf?>1cEdezOCOM{h;b&|zpMIs(l{??8*t(P$}}iI$@i(CBlxUO?l~yU;Xr zGMb4_Mf1_=Xc2lZT8hp_%h5S#bW5%e(0KF@Xc{^X%|!o%=A#SIBJ|H_Df%c{juxQN zv7GWtI=|F4I15w^FJDozKW)y8_`U36Pk~{i58)6 zp`~akT8_StMxV?1AB{&pM$^zw&`k6*G#~vEEkgf>mZE#ma&#XWeIDn3G#>p2nudOd zW}-i!`RHM^2>k^uMQd<P7(RefhO+zEmOtb--k2XY$(9_UTv?*GSo`puY z;rx%rqvxP$Xe%@mZH?xmZP6n10<;v3N6XQR(dhFz|D*BfWoR1O70pDuqxonLv5Jw2Tem~pqc0_G#|}Hi_qVrrD#4{jy{M+U%>ev zjYl6s)6j>}O!N^nA6Dpx(toJkn=wpk3NT{p)1f#^aV5@eF-f>UqMUJ z_2@_F>*$YY30mVK|9Mj#vr#Qw=h@uAGmH@gg4XGa;=N-=DXTLS9{Xc zo_4iWuJ)3vz3ysny4q*1R_1EC>sN=kk=$i{RIl~P{^zkK=Z4mAXh5|a-$$QL-_NZ} zyqBVU}kyfsG?^K`n`un9fKjTy|FZRObKdqJ>iznw5_^!SluMoY_>60|Q`#(&Xf<-=(!FGBD!_MWta zIg4udD)%yvXPRQx?qXYS$apmC& zlj9ayS7l`JA>DP%fZ9Xk4==Ot%uEsDP~obd#U4E{ucdOqF)ge*#$Ku3LiYmK@yC`w zkW5RG`L6t`97m^6NU+7pY`WQ%_n>ARO-Ccq2T=2{_n~H-o7<)}U%A#87vYU?wNcj5 z20p~TN&o8yBwm-;Kk@oRKIeWP#~hz9otnHG$ctLZU5#}0rK6FgsFjr}Wp1~!bxsRh z;PmYNY>nHZnkTW2le>FS_b#}Xvz`AD*vWbQyC>(RCMTL#JUn>}{*rah2#pA@O61i1 z^<|jpVZ)yDwB?u`Y9DDro$gU9U*F?tSd|qL?6p1HW&|G7EhjN*>Ol*!GqhsV?)!DS>SdEbW6Jlek*lFHdWvI)0{Uq+Cz4Jzmbb32vqsppoiU z$7y5?iwkT~Esa$7&Ni;00yBnOnjE{H&uFB&%o!SKE{6l_d9z0Hx>=Bn*GOI=43f1q zQr(-MOjfqNrMArF8mW%A*+DX})x&~J;%aqlbkRt4yhUqdc$IBAKd_h8xngs+(vwq; zE+;ByUk!y&$LnNmS?ZqXr;+O3ZKILuGAr&@)>A#heV~!*czs$U)pPZ1315beI z9Apw#tKE*$NcGxe7tf#qqe0z@mo&24XteWX}jjVDdeDv)4<3wfK)h@jqBm-;sbdX70t&a9-8mZ2>12j?{ zZ*dx_9znG2`XFFY<1#lb@Xi1$Z%~>FVsl&(K9tt z-S%D@sm?*oG*TVA2gfVhu0Hx^jf~N@eX&NW{mjxx#&vK8>=PsdBlElB8Pb1Z5yH9DP+Q}&zsqV-A8hNVLpSBvQZcz=5RM&HBrqU(#(F--Qp|+mWHB#O7 z8#PjW^b0jooqxkLQr-6LW0h@J$8eEGsx#6|jclTIX`n``Thu`#&(M}xMPDFX0Ar6S1^M$Qr-4W8mVr3q(-V^>C4e4y6vljWMD>`7i5kzBi*5qjkTU9 zYNUD&I$a~xIbnZ>veoL|*`Sf?*jNxG1O3SgGRL`==%bP9RdoxEROg~Yqm->yx1~fQ z8)1)h)VNBh^Qb*T`nt2&t`+5gPf)2xZ%2G;(>649s%(2btr%iatyu)uXbDMyjJd zS|g*iZTV`rvejp4R383OxbqzsNATL>e+3fMyg{eQzO+a>ZOtDGMj0ndTu>9 zRM~d*8R%w>RAbB=;qT}+v8mW$r1A~-pSC90K8mS)X3pG-mt1~rHJ@@s}NVW6LG*TUJ2X9ff zUEN2UHBy~D76-||7`{8mB(7GkMbk7=J(r!Qk?JV=d7!e@>S%vYBh`81DUDQ@IYlGY zYpwnosXk9^tC8y1s1YOsd*_pMr9bNEU9OQWJmnSa*&3ddzHrodJwu0B)SkLxv3oq^|T zq`ICN8mZ0(Jv6e)l}S|2yR3BJeFy5EK6Il(sxwQ8MuutKS)!5Z%sWXV&()UMS0k%D zdQ{F*ZJX8oTuWP)I?A@)pmaw)ww}?*=GvCb(8y|guehf2sOs_3SzDI6%~2Yuj>BC8 zlt)+R@Ru}F?M}W%*4DZ+TqD(O@2ZjNT-s10)iJ*3dS%hXPgkPOV^2m32qt?4~dPyVI zE3d`$YNCwuh zOOQ!it*&9TMym7VS63@r-ALP(mo-v7ht1VUb)1jXNVPxRG%`wC&&C?5j*7jh%C@U# zz4aQYj^6nisg8{djclN8Q4ft&XPBlM*-~5PffQxi)!AU9Myl(%P$Sj7nW>TL-t483 z>Z3Q)$kViKKiEgvc6Eeo4w8YR^6?;(xLO@WcWb2DpEQkB$J==tsUB-TU!`nyq}HGJ zG*a#PQyQr*bBac)%j~a_>N4AEq`J%+8mV@EYj34XYCj7#Qa#eAYoz+U};yP)hx}K35sgC3?uT-{O?fhzuRJZ+pja1ijm_|lud$Ws1s^_d| zjZ`1~tDefXt7GY9ja2(NS0mNuo+C9<-J)(9sjg>ZjZ{b7-Xvw)>u8-{uaWAb&(}!x z(K9qsy{hREBzLox)!s2+{`N%R6_zI2wtUw^A=NqdO^sBK%11R)-Ij?OsV*~BBh|6d zQX|#T{^J$Owx6eU>1~ZvUn6^5Bh@XsTO-viO4CSnyq%|!>UjG(QQ3C&O!S^csz>@$ z8mT_|6pd6zU4M;K_hws-RJ&9|Bh@)}Yj>qfwY3pasFCXIFQoR<|J(pMwZD~(nfsU9zfyDHnR&S|9@sgA=ZHBz1VCu^j-?fo=T z-J&)csb0BNBq-ai&S@V6$-uZR3NptTMKd*0o%aT6q&i1+&`5ROtD})>&v$lF`lI%I zg+{6)Ggl+ku`yU9)fuvrMygvB86*SyanEJSR-dWOjcYYh?fE>7RA+-bG*X>m5;aoY z>eDq+UC;fUm2Fo?<_3*a_xOS!8R&UdkU7pzK>BE;Iwo6aq`EDKE)8sTU=803GKs6z zZa<}w;Z?>@@TZ>Y`VZEYqmO@$tabDekMq8WCP#^*KjYckDbS1KZ0CB7RA3^*5=XZ)Ut5+s28U~;I$pYJq`J)wHBvo( z_gt)Okveaz)kt-j^E9&BxHg|P5*XL&c7Pt9=+9BkO7Fd8nB8C5?>H z)-zut)iF6-Bh{XF)kt;Q8)~Hbs@5KU_I1pDJkDz|Yc*0Gz4LuP)FAZMDuR!3;$W{r&0$i*6|u4k4;s(Yu8MyltO78Pr%N<4O6$@jja2*DS0mLeYNe6t$UGdYY`eNe=2N2rBSh`elNza>rzUHpdZy^7 zk?P#uMkCcNs%WWfkvcv<&`5P}KCO{z=cfh9z??8J$Q)-b>Y$P8oLNUB)gyf;&pHBo zTs_uSXr#K;xf-c1bFfCL`>~Tos;{3!YNWcJU$#)TT^$>%HBx=_`!$m1uff0aI7}ne zZSSIy>h)W+MyhB3uVR#KS0DXlja2vMT#aOJ1h;*pMyk)#yJ@7lo{cq9?b6=nfo%^Q zm9Gbx<9x2d!y2hR?)V@Xc-+20<~XxKD~(iVgTrSBw)Z&8G@sfSm<`l9@JWqS&r_2% zQaw}j3zC8UTo_~$SJR2$7z@)#^<1`{BRR0u>b96q#|)6_zMiR(>bM=Kk?M@mK_k^Y zUPmL<<7+3?z!s@z=M@^Mj*Z+P8Q71*gUoUMT4Yy^R6E&FBk4qNZ0zB>GqBa__1IdC zRA;|=8mX@59U4h3xSoj`$yNr*(=}4vkNdfz3T(SNiZ*DZy2lr2q&kMjXr#K#o03) zqH?~esSxThv_xB$`pVlRjZ~M}S0mNVw$ey-zaFNefo)dTvouHs#%N)XInHk*PuECw z=D1NK)oYRqHIiCzJ_yrDwLjZ=q(Fbvb6k-|GBSgYK2syr^&F^?>Uwt2NOeEf(MWZ? z?c_Qmu^MP$wmszTjoL7U7{-j2#$M$56RF9c{8X2xV zdK-;Y`&khjy@{*UWqzQM>fU@>Bh`LR(@1K;eh$#cs^>R%28+{3^$bx4 z5Y8{b^?XJn)h^8ll7XXg@Ch(ogUoS$&%U8Xs&mU8s)6n0+BvwrYc-N*ok4P*Mylid z4vkdzOQJ?n3qJbk8mS%;``KH8ZRdOuT;>LiRJUk>Mlvf0mpMiw)ot&oksSBIWuB># z>K2vrNP%rvkH^Aak5o?xt&`x?gV8NOhcFsFCWZ2-8S<7VPA9&YFS#sK-u`M)EkpWzN({bv*}a zWR>TbM@L!*jZ~LeMR5`@NOf<1 z$?+W6c3x8ouBZ9z_W-GO>3)q=&lkfqQaygVXrwx8MF+{Q%u4jZ|l?F&e2Zv!_O?qy0>cRF_%K6;)u{=~-}(zpjz$D0)~U8H2%Pj@L-my^=i6 zZ~mx9&UxCh)EV<cmx~FzzzDBA?K!!%DGg%LfRQGXHja0jHfSnXL0@TsEQ6sDMagjz; zebhQpE6on{_GSkjvg)Dau>Jw8YOfu3K>(|I%5Yfi>65#AQ4g-mSr;{9;G~L*q9uyTGz81h=;I?~;ccRubiaq&2F4Ic731t-=50ot`!L5_@W0&s2 z4VAPUw?WchTv~@C&^*Tpd5v+eNqP>>U;8-RSV=qMHcNV?OVe;!k`Baek@R+#X5q3W zorZf`(%-vu0q!12AIH5b>2of988=JP&A1OF{m`YKb zJxOQcno0VQOCQHYOIn1Bk+j&QZ{tpvbUUu4q~EyoM_e;W!?-3mSJG2){yI0qwUo3C zu8pJ#F71VDD``JmJ4tVIX(sMMNhcd8=>slZi0dfnleqShzUb18xCBW{4JT=tOAp|B zNO~A|sigIJ7Ur*WQ(SLJTj9D$dZ|l$;QC717k9a&x4JX~*I&{}xI{_kxO6`5CP|mz zk|bT}()GAOl9u3lN&1;f_u__0dI)!wq!D#0*SRrnl%y?isghpo(r&nMlJ>z}Bk3(J z9f_MLX%?=Zr1!Wq5BEDs7vQd!beT(6;igNv0e7RMAG-8&+axxPvh>8^c9zG z#yuwK2e{Fa?sn-x+)_y^aG8>x%F$^@Htw&Iw!ux1G{L34aL-F>&hHZ?z0IYWIP>>+ zL*8WEU6S7CQgfboQPM|olO_GDOIPF8N^0iKsgi!=(l2rAB|U(fE@@3}`|BKuE0(k= z|K2NUJC}CCZIaX+8?z<79_RPojJ-Kh`z_92p4szn@EwwUcE6;ipMF}1drMNYt$&bo zi%YlSN+tc0f9Fa1y-RCw75KiSk+?re8iVtf+!ptNq@8dJB{e@~^3(n}^Llj18;tw2 zq!U~^1-D(&T->9Q{@JBZ;Xajg1+GBSO)h;8XVy04?Zo+`=^rlr8MjN)Iy}pKQto>e z&R?tZa9>H<0rwY4uXJe|Zm*;RafOnOb?M!>{gTeaJuB%$E`1zVE@=^NxunG|eH(XB z((SmFl78dTA91GZAuo&z>eZ4q!TIal5_eeA3vp{CO>k*1+%J;$!>yI{HkW4N%wA-S z<6f2Y0hcbs)s*x}+(t=Xbm>N1ZAnXUnc3FNe|=Rl(astrTFXI6jx8uR=Bq$ zz0{>WaP=kaiz}7%R+nbr8cI3|_r9caTsj|jnxso`TP0nI^N){>xR0gw5zb$iFL9^K zJr3YLk+dey)ciCOcZQ@*ai2+gu1n)_%_Z%M`%=n-VQT%@FnT>2!= z%t|3|Ij(`E>s+U4IRCo%YnOh9OOvz)ujnS)>)agIPtvxy(`Q3xFM37 zcMSRG=?45%(_iN^al<4v?>st3?t7U_d*W`F)VzbKm83&mItG^^>D{>2lK$SM3vi<) zeH`aM4|u_)8*t+!eH+(S?)!yH_v5l8{SkM8r1kiDwZG1%<0eYl5*IJ&B`!_G-7RS< z?qW%Q&q>m=!YE}e%nKids?kK!(q^m&)A#Z8y=O4I!*!Q5 zoS!}V>)a4$&TJvCIj)DK?OoaxmnUg&+?A51yL31%U()fo-jd$y(tO-pNgu|gNcyZx zU&76o^mSZcNk4Y!F5E+smgBCKG{h@r{yInD9+vb>Tz^R~aA{|pIYWoMp12z%z1F1z zagRzm5_hwt*)E-ldqUE=xLYKB!lgyHrINmk8!YKNF5QkZKdBFSU*U#I`jbn;cqeV4 zq|vzHlE&ivExHi*tfXCV{4Sf z$BmWrHJ6s+UY7I|+;~a1CAc>weFis0(pOztf_q2OZMb_R-RIInxOXM3#XHnzNO~I1 zU*{IM4<(Jm&62dcOZ(uqN;&}NKcBwcrCGS`l1{_=VrLCByEFxP|^gK_QLIzv>$H1q_?>=6Sq&& z$+(9keZZv)apjUeiF;Vm7hSp$_pPL*xJM){bLj!x_mUpQEs?Z7uPXZM+!Xhdq^)pI zNP4MDd*FVSv@h-{NpE#&2ChQVNw{T_&T;8{TrI9bL*5dc|N6m7m#)W!BrU-`BlrEx zrF(I;B{ggLoTL%_){eiBTPXhN~}WAKVL)-r&+9xKkw^gL_HRdt91_ zYb5Cc+$)kUbLlEv6G=DV)=T=KOFze*Dd~P(v7{cqf8?)oUEJA{o{sZh5jo$b9dRur zO~kz}_r1=ggK+0adI!#bz2tW;osBzJ(s{TynUkxod5bzic1IJ zdPzD2w@dDOr%R{d`be6G+b!uME`1u8BIzpJUP<3@=?6ITOfckqj{8Q^Z(Uk}yH?V= z=Wv`$dN$5q=Qg+jl6J&>D`~Pz`{8bqbdae@I?kn&aW_jk8~2l>e{|`ixIvN@;(nI& zMVD^G4Ux1I=cSmnFLUVu+)zmm<7!D-zh&h*H^q&Rv=#0YNiTJ258UmN_Qm;ebS^GO(#5zlC4J7NFXQf&bTjU3 zNq4yPE8J{J58_%#dP=Lxb&kg6N!kn-E9pfp?Sgwi(q6dpB)!R{!*KbMX5!A5G{>d) z;~tcBAudkRr7m5LTOjFL+(nYU>(Wnf=2eW4w+Gij(jzXdeXi#%mb4-65=qa+*;xhm zn512Coh7}-r8naWBpr@Rkn}E>&cH2|G#}SZ(gK%0gL_KSmvC1|`j$(#;g(6d3)fT9 zA6#1NJg)jAjlv~MdJfLcD!Ap6cErw_4IXT$-ehxb$h< z8cA2-u9Nf)mwtd-E9vLB0g`^}(hA%LN$a*|j*#?hoSjv0uSwbwH&D`Km-fSLmUIyA zH148!746F8vPozN9tU@Vd98 zjd1=tH^*(2v@LFoq?fz2H|}Fe`{Tw*I>M#nai2&!1(zl1A6)t{?lVcB!uhYRu5sz> zxH3uK!~It7`!|=C<912R@pq+J>t^Z?Km4q+7P!`(sOZkR>4I}+7&0|JvavxW7v6?>K*54&%;}d(@8Or}dJaf%DT=xaN|^ zZIHD71(m7!%X$|`+6woYq?fwX{Dr>ulJ>=Imh@JaX5czVItjN$(m6PP zT^8c}*Mk0v^VelHu9MtjBhLTHz(+3q64yo21Gu+kc{MMryl*7#a!H%w{8vBPxwI3m zyQDpE@5+6zcj;hUlB5~943ZCDN#A$rPFx>J_u~9( z!e3lk=OWGqk~YSDD)()T^SjXjXI`5RdEIcIOM0zK&EL(uQPPn(f4^nB)cpO;TO^%} z^Uq~ZxYYa|PxD%T$a@)ACQE+DrRMK}j*|2%oIh`T>(UC`I7#cq^GsOodp6Er=Qg-I zCGCj&TGC{f_QPdMItaI4(s4L{L`=s0U1|^D{N*jg<;Xpr#2u9MMVD^G-6v@&?t4kg zjN|!a$UBJpQEI2OuUuX<&iouBTJRT_uE1@PbUm(--1jY)Zo`?M?}WTv zxYH&5!KJk>=J}wcQMfZCJqPFS)i~Uzl6J;5lQhMp190Z&MImnp&i^UJSeM?7+b!u# zod1)Chg|wN?i)#qa51vvVwb*+`(D!RxR#QB(ak!RbIHo^Jp+!FVH*t-*` zujcq)^gnv26q1x7Ns)@8sEAUj6ipgvLR5-UX)cwYCMt!HM2a#cgb;<4F$&2Pq7bFb zQO5h)pI!T$^S|fZyUtl>-TS|5T^6r*``vdx`}sY;Vb4#lM6y&TO6gIGMp@fZDiUoc zsY;CPo3+EF;?a(iPKb6!*4`r>9PK00iP0|4+Bc=cqy12-8SU1r-655WcCXsLx8}+6 zm6FnBK1!+-?eS8r7+XJUn@d%r?I4{RZSSldB-M=e8maWT$(*NW?QE$|v=2$A$Jk|A z`YoC!WiFT!welmTKwHu|&qTMdFjIp^>_bhWUsc*Dp zq&Cr3&DvVhplBOP=`oDJ)=rYfM0=amF6R7T);=jsjP^z8{Akx^ z?Pt>DXtzk6qWvpt3!mnlFxrEquF+PK(q~Q$X-2g5q>H0%leJx>yQA$TT^jAkteqew z$5;z;H%sX`9rLsHG3lXbmr8xkN&eoNto>M86z$hi&zSShtSwa6HhZ)OO6hTk3exU( z6=`X-r%CB?h!$CUfwUsp?o#iV^U$olR(d_!sZyV4=VtB0(&}iRkAh$- zO8sK&uUY%A^l`MsPPbPh+Hz95%vGcf(bkgEqZEy@wx#rSw4J2EF}82k4wJSSt|pDY^c*AlE?}7h`*8?I7vEXs?mdqXpBmcD7V1+J~fxF?Lzjz9yB8_C0A*w41Z` zC#ih2e@iz+TcX~cWj;cx9PM$^jnUT4+9p!9XwQ?TN82N7`%5*Wy;@3-LrlxsJEYU1 zy-&I=#xBX)l~RLf-7HmOXYFm$MbX|P&5w3**1jlR8tt3X1JQ2C+AY%M(e98IL|f#{ zJREf5G%MOBQhMy9W7c+;=0@9J zN{^0=&DyEb{n6ebJsV$lVb(q)Er@odv@F^WvUa2NM6}zb7o*KJ+_TKZq-UZnBdv(G zYSz}0mPOl8dL`QSS$naxGTJ`U>(P$M+DX!?Xm69=jP}8-eNuWm+83oY(XP$f&!i8c z-6Fjk?O$12xRHG~(H<{fWCrIB%d$W`t zS(%@;k4e8oyHxrt#=f4l?@50|`?-{EZU3CLe@p*FTlB0wM>xt#=`tTD?OQT=4W2B0 z5p!;uwdYCuMSG!?9{(7SwO30AMSGp}WsIGbwf9MfM*Fz5Iog-A_HC(bw4X>@qWwN= zcS#ka-KViVPthJKrORAVsv7Ny(ht!#%G#Dv^=LauKS$d)Yllg-q8%rtTeCB=_8zHj zw2w$TV(jv)eN$=}?T6CNXt!qV4ykFhdo{6EA8jdV_a~0jD%#_v^jJdutZgo}jkbf7 z9!uz*wS%PO{vrjrYovc-&eOAYw$v@!horq)C4X;O*1jh7jP^aLAll7Y`;*i++P|g3 z(UxesXPJ+X21a|Fv|qG!v$lyeJlgZ5{iE%Xwf&{h(OxZ;h;~}m-XSITRw>BcCzXq> z)FoNFQkop?+tR@?c2m}Fmu`%9msC31;%Dz!<}%WZXe&zT(Sq7p+fceI+Lls!R&3|2 z?J3QR_A2SHnDdydog^h^ffeL#lhPv%_h#)Q(&N!SE0vA0uV(GL(voODlhWf5KW6Qp z((-5vH`{X@;&3T_<{T@%5p50WsF-u(tZgkN_q-{{b&)DW+b?TJNFPKyK}wHd%*@(( z(ihP_CZ)$PR%GpJX>+t6OX*RHZCU%fv_0BFw%F366s4tfnU9u|^WO?`)ui+&MT4w8 zSK1Zr1yXue=M`ByMB4k{WbC!lvGE<WiaqV1No$u_|8(I(HS z^f<)itWC}>t`Ti=wr_eIVsX|c=dGR^ZL*)LPRw~j)+YN|8bq6%%~&_uBDQ4HWlqk^ zYZ`5GE?m86Yi4adDY+X{LF`Lx5N+42P0kqV5N&dn&RNk;%-ZCfkqe_u)O^bZk9I1h}qH=(Jso`rBZTk zX+iEa>B?x=`+qvWEz*FP_Lu*s^DEriQKJ}fu#|j7S5HZ4TSNLQ+IrH^Xxn6M7b!Vw z)w#*ih-gP;>WE0Q#w4_!fmYI zM|-%Gjy+bY5N!=JjZr(%fj*W$owEmC=4D&5QP*tS#EsUWjN9 zk?xPSvXm~>$GQ_=pMwSP;=8O;T`qV22!L|ax$=X{)WU$iGn$!nw_*EDO-lNLmKp_HDb zHy~@TmKH~Qos^!JHY;oIlb(wcfLyQDXx-KV|37i~!? zUFIXDwb53QUXJ#RtUX)$EZTNb@>(y*T_&ZE?p4yNm^NNY=XayDu~hQ+?vz$X`>2$T zcvgBRroAPlBR-VAE0v7+QhG1i-=uWJJ{_#_#I!@DbVNnzml$!P^l`L}vbLr4N3@-! zPowRdwZo)Bha_KZoRl6_osqToNX4RkMEX3&F3;LGrIOKpC~b;%tCTM3F6rx-R{Z=u zOIk)s&Qo_SxAbkawX?RNbZoROrSGEcmbHDPD$x#;zK?ct*4`$a674f`?G`D0CI6MRg**BriS}SAeI-|t z((kv1G&0(HQhEh)o2>03jg7XKv~Mic$gG_pO^)_vsc5wGv-UCR=4h8n#iL!5wI54& zMf8WVDONT@|G;6PwmPR{O zIyBn3S^Kb*+&i`)_l%URXBOmEW$pXY8_{l*j)<|pX6?Vy+GvY)-gDfgoRlte73tGx zYf0r|Y_qIwCw&#|#ZuY$x&yOzw6rbSNm8=TTaddeYaftyMEj(4bj%(-#aww4Z#wu^LJwEePngmh%I z6Qruq&dl0*QiW(AlhUg+R%GpJ>4a!Mma4_rZCU%fbaJ$Xy4tFYwzQNk^U=~7(N>ev zs}LJx?YYuf(Ow{(9AmG@+9A@p(OxUnj`r59og;OK_F?I?XqRN|N~u${Z%b!HyD4k8 zOP55uOG>W}DSqLeWiBIK8Er-B%otlcYa2>eMcYzp6m93M?I~Ry?Nw5fXvb&mjncSi z@08MOM;^`EXQe68z9OZ^dp^qAFQw_x{vb7rIq!YZo@L%&nicI~QhGG#gsiP2-5c#$ z(z!AA{H(o1S{Ut>Qmbh5Svy5~D%#tn^P*jlwNFXUMf;MJ9?@BswVz8bNBf=BKF0o& zwM8%XNgVAV(go30meOa=$5-&gv-V%B=hD*dcNM8;wAG|*qivA2=SqE| zy+9ft?G;%&L>e6JwbFIb-kP;@q|wnnEKQE~g{*x;8XxWZQhMCw+pPUXniTE7($pAR zviqK8K2j>4OTMEj(oNBxk+o+_J{Gj?r1Ywk%d++=>4<1YOSi<>$ys}wR4Lkfq#4mJ z&e|8H6QX@nx+B^RS-V9#Ioci4UC|clv1geNmQIiMC}~c#HM6#!WEYlYZZ6#$ZP%>r zCD~Zg4wCMRc4F4vELpwK&XyjGc2U+YmAuJmUy~k=c74`3rt9#8wW~# zqCG-NuUV;{wWmo#qirHR9%DOZZFgyGwEd;@>X5NnJ5`zz?H$tM7`rfQpOJ2fcBS-8 zv>#;cMrls8+ok8C&0V%@@jwVz3=qTM3B5$#`DTez34qG%76-io%ol>QWs zmp+QNj`Vi4=VWaM>GNnWk=8~#IBTzwzK(W^^nSE6vv!`eE!xMVkD^_XwX3C{qy1R= zB-(9R`@6I&+Cshe91kch?S5C03hk9V2GyiP?RP84HOSg?rQ*?EAf?wOT#>ayq*Bpd zE2VqwZ_U~{($UdAET#M9mt^fqsYa%QzkJU!myv2mTT%Kd z+S*y$P&zZ(meM!TcFWp6(%I1tlhX6$Cui+#Qmbh1k+#Oz#aa8J)FIk8rF38OhOFHp zb%}O|v^~Zaxnj>UA1rl`_9!XYhgFcPnYHz#-qALfeu=hg*7lMHL_0|OE!uq6PLYO1 zd%KkGdtH#VPf6EA`;s&~e!lCn_H$`mwBJd)V$T0$ZBcJ2lcPOE`YYPXQu@p}S(+a0 znbMkblJBT()?O&hjP`Qr-xxb8Yp;{;iS`z0Z~Mdwa`$KLPP?K@ffiL@x% zZ>01b@ISJ4pT5@IqCH3|5@U~%(q%qTdLi1=rDD;x%GyrSE7A6p4v2Pm){c|ji1tS5 zplI*S+DD}KqJ35>74558`>yn1w4X_3qWv*z|CBaFTlh-vi7k>x<8Ucm=3}LAqOBn% z`!@@6jkC73v@O~$(vi{j%i0mrj%X)H<)fV`rTZS{Nfl$-(^C4?UXuQf5v!$2(S9MN zBfgWW#I%2;bVSj9-a+EX?wC%B-%5j6QgaLwHHbUMSHnaGuly7`qi$J zYQ?l!QaZo;q|!0sap}}(U(VXMrK6(#L^?g%@3VH7bWF7S^tZ1$+C!!Et5uX5#Yl70mXxB^Wh_9tdF>R-mjwm$9KJFNCpmamD6{K`T4e7?1)>ukMw3c3o z5nZI|(e}&Q5z;HsPLOVkc4pSjlh#E0n3NnBDaftJ+SO8WZ^VM!$I_kAZp+%=rO%=* zG}yk8XiH1!QXMUQ6>T*sJ>#uz);5v0M0=i;UYFk^Yx_$-MSHb$Pt18**4~k%Xz!Ee zN4q3zS4z1;$uhq!JrM1ttlci{8|^M>LA1q(>{;eAQn6?&N{>WaJ8K(CrJ`*qrE5^# zvbK*@HrioQdWON|ti4UD80|gMqL}mItbI{R?&MpLdsBKc+6`H|MLIFs9n#a$7O@eK zKF$YAwWB>sdN$gcQu=&pC@qU=t)z5BC#hbH=qbGz?eMG}CpC%oMkzTKR*<_lYafx$ zjrLjTm1y6}+7G4kqWw~OJ=!0$_D`u(w1tN`Iuh;SQo2;fO5LKZA+3qFan`n$E|0d0 z^lr5MvUY^jKiUb>x@c!+?L28{w2w(2M!Od^V}#bYv-VtRdbAfvUq*XH)((+wkM>$=bF{Z+?HuWzXdjlgMEgS4z9A*| z1TDzDFKvtV+pPUXdMw(1r5~a#IbzQ;A1OT5ds)_AC9Q~d zw3OZ(=%%c_Q(6`61JceI`&`z(A|-b!Ey%qq{Tc07S^IEDaUEaH+NY#HqJ2r) zKiYL!`?<7tK{DbysYJB@WNp!_9m9zB5b5A(D@*A!=Va-CXwQ^NN82`QFO&|A_Hya4 zXh&u3byC@AZ%IkCD=4 zK2bU~+S8@V(YDIkPEw<2drHSgJ3MR0Nll}@QA*c4@6Fmrq*l>BD^-uNZ)NR=()rPT zDb53ytx(L|a6vINN*$xEowW_6*nA9c4PR`of zq}9>hBjsX?YH`-SD6Nh5O{q|{8?ttb^hvZkq>EzCMe=)=`Cw^Nv`0zFc^J0iv$me} zO|;FW9?^Eq+FsI+(GHS&MLRKTZP( zf6Lmv#@RlKc7G{33&*>PwEJB}>K$zzXwal$4G=N}3ey@zUIA>t}6q zDY^T#YjmV}(e}>TLDGz9uaWMLc6!#%mgYwLkn~Wr%cS)CcuiUu)7DGrvV1K)5F>t) z9*eeM!k!TaOX>M*m85h;4e8;1lI5!>JrN_?WNjDesc3s8DcX@)J3(3+?ak7XXy<3` zW75iKmr6^cU6ZvRORq)ywe&)?JF~XXMC+%~9w;SeUKQjjNa-?HlirW^H0kANTS)2S z(nWeLruCE35hJ8eW5if#RkXKd?ObVdv=2$Eqg|G@uSwgYeMfpH+Ap*Adnvguxp$D9 zEh_)rYIytee9lo_j$Q|vW#}Q(4n6I-3 z-{L5)VV-Yu0^j3ozRzT@=?A=@>zVA${FKRl%g?xq8@Y*JatpuW_xzUo?rpy|_vd#k z$sbsiKd}aXW^Mk)R@})B+{MoPn*;eTll?cjwz>Qm7H|glWwN)VFz;nCKF9s}5)a_3 zEXfTl#joj{!u(bq#=Q&KT4qs}TFFXAG0W3nD}374@a*RvNlvNt!gFAF@!`>`1Nvjhh*`6L~}S{%x{9LbJ! zmSsNqTpG-G{cuwQ>T*%3MlFrG@FX4@Rhd1*>PG|DoGlPF{CimLczIg7- z**u1Gcs%FwB+h3m-p>wvfSvg;hw~9$!$&!uPw-wY=0kKAX#Phy`|(2#;YS?FPdSqtIET(V&ClnTT*0sT z1~+pJw{jb|@fU9APX5HwMI7hhk^GevxRVX|2hZl8Y{7qd1@~%~%U{L4Ih6bIRuZ+I)WaVGaGZf%YS@lKZJ z9G=2^cslQ81K!U|`4IDbnAdS3Z{Q*>;1hhDPx5I#!*zU?pYS<;!58=smvf)}eV%bY zzQW3UjVJPTCU^UOi*31vo#^c6{6&0^qxe3@@dIAZ^}L^-@)3T~AFt=#JXpJ&{cKkyj-#N+uhPvUQE#hvWHUF^)iIh_CU8s^%2|6u{|<-UA~h50Cp z@h$Gp_jmw5qI0$Lzp)hm<{{ksK%ZwU&m(vo%kl)4XJb}ia-W}yY{TQ&kIwVX4`Ee~ zWOdHuNu0wPoX=WZ!8&|{r*aLQ9iHFD`uv4wawpGXY3o-_cqE&$0?%Osw&2-p$re11 zSJ0W|`K#ETL)nqHvNP{w7tZCyT)|8E1$*!t_T)BR&i$-2_TfS7%hDXc>Kw>g9K^aD z#*Q4pi#d`#IEG`H=OkXsX`H}?ypB)udM@D&{D9N=8Jz*2-^5#(D`^i23v&jGa~7-e zF4o{|*5*BI&w1>^`Rv9AIfe^3fe&*sALE03oR9GdF6Pr*%O(7n&biNT;Pd>8FS5|V zUT-YImsyFgvKn7wO}@!CT+Iu(hF!UqBe{;(@_kO^$DGek_%J`^B7VWwxruM{ORnQL z{Fz(0i(B~*zh~J}_Gz#pe`00sU{n6imfXp<{EGwl4~Owzj$)w>x%@1;f*^kn_vQWE zk1w-0-{k&$hX?U{9?Tsq#Xsn}gZ!a~I7ZH+cm$8(QEbGc*_;*Fij|n0vtF6W+38g{ zoYgpku35;>=1IJlr*JuI^EKAtTRfdxS&u)lK7V5)mMU%ikw>rz%d3V_!OVxv;2rl`8k*I zD=z2WhgpAQQLf|xe2pjY4W7(ZJe6yBKHuSme3zHb4ffy~_U1NT!C&aQp!`nuXXzuYKk`TpWCado z0}kie9KjYG%`12fuVS7~=VGx!u2^BFGX5-#U5Zr}_2nlExI zSF*@a)+2c!Uu7w-Vokoq)3}=T`7XQiJ$C0h_U1>N$n~7cPdJ^Qa}hW48E)b-ZsvM^ z%Z=Q^&D_p{^423+j6bpje`R(4##;QHb@?Yd@^4O*n=y08Q)+pu3;Z;&gC?|z?=9AZ{{kxdM^JhZ|4u3$zORFOCIB_ z7aqnrEXR2~gZJ?)-p^)Sz{|LhSMm`Kkd}$Fmzx zi5$hroW&b>52x~ey3#ZMGH>CVyp`{8Ccoz_ z?%QRt#`XN38~Fn_^A{GJV7raQ_!~>`4_4=2ti``smwR>cx}z&( z^B1##Jy?WexgRI77^l(ov-yQQh)=R4m#{R~^Dyq@5&V~BSy0XA8Y|FMxA`ip$m%?f zEm(!^Sd|@FokMvNN3#aUvKHsE4jFPe$cqE&%0$Z{H zTk~wTVGFkB6+E9;(N)0tq3pt$yogV;8=vPTT*03Fg1z_+dvhE6a=#P3&Ug^}vor_s z6b|9(bY*eA0Y~y8j$%)a<`uk_*K-_i-hvH^I1;e3%rq^@@9U?>HL;6xbI0` zXWXB6uq0>mB+g+S&gB`L&(6G`m+%2zMproJ$MX?R;iJ5XPw-JL=2Lu%&+%D)#HIY4 z%lH+S^DnMop&HgBS%j~#65n7ox_UZalWW+9@9+Y?%dT`yb$%p2;!LjR9Dc(2{G2Pe zk#BGl*Kjj`%KiH4|@CN2O`yAz7oXLIo zGz;^27U2pO=NCMH-|#?g@?<4R|y!Vnz1kF}#A6c|EK0 zMjp>wc_N=+4L-}7e1Wz30Z-*;JdK-JkGWI4&RCcYSe%Vnl}%ZLXR|iXWqY<{7q((I zw&ifP=QZrW@$AHV*@X|WD<5SyzQs%V9=r1+_Tq26oPYBQ?p@34jO96i$MGtjz#%+` z!+0Kt^L&otV2ALBh-#QV9JFY{@>$!GWum-2f)&mDY$e{cm$ z*7149!}toz@eQ8AH+dG{Vl%$O%earo(FLwOL8+yv*0xQAz6%vu>_A~bsoi9EYG?;h8c4G&Q;RT$) zj-1S{e2^FMF<#8Y?9R39$&Yy%H}DGn#l9?by6rU<;Z>}}L9E8XtjXa#ha-6&ujcu@ zhJ$%6ujW|hIgxksdfvxLT)?S(oj3Ar-o$mhl|OR^cky=q!#i2_44-SP$h%pY_p&MH zvnB6iTRy}Ae3-+ykfXSWv-kw>;gh_d&+uhF%QyKP-{A}Vp3Av|FYyn)!b9u%T;oxE zoyYJkHsTsK=i6+>_t=;3a}Yn^aIWVJe#+VWjQ4UQm-9=$#;^DmzvWhL72wxoWf^#1DEk8uIF@aCKjlmOgDbh$Sw7#mFJI>|T*c%0CQqWftK?hp zU3TDFcIF2h&X0HvKjwIT#(ViWAL18$lwa{JZsvRZh9B`e{>JV6o8NQq#$IPE&tG{Q zckl%6;yL`2=kYI|Pq!1u59Z#ynuVBWVcyN6ypQ{F0T1BoEWx*V5ZCb#{!I6X$?xK! z{D);(wu$|atjMESnHAZT$Fe0Wu`R1|08ijBR^uqv;4GfZdw2@(=c#;|b@?Vw=Q}); z-_u=b@;lgwf3PVJZEAasN3l7NVM{h*Yc^*awqkqs<@p@M3pkuzID;2*HZS76yp+q? zgRjwjZ}M;Pa&BcG{=~lgjRRQfZ2KX31P8G^hp|3Kun9-<9FF0o%=2Dw4j^+~_%cnV)OZWiY+b6$}&vO-D6_yzCcCeGuRe30MpRc_&GZsl5j&mZ|Cf9Fs9i#vGuIkww) zGyV%=pyfz+=u7^Mu4E~`&O^DG zhjTlR;LkjYCC;_o#xktHNRZCQuycm^+EXLjNx?99t}5y!I| zr_eo`@;9+3li!ini%+pPpJQKs#D4so{rMFKG5HNkLs*nUc>qT;`TaSgcrr)xR9?&E z_n(a8g&fc1_mW)CjqNp7;0`8NdHu%f{DUp{7u)e~cH~|cd;eh}#?{sw z>(50vm-{ifhPN0O@<6U)Nq);xOs;Tr2d@0DJd7pJ^ZMdpEX#5%&jzf>i+C)1vJ#Uk zaH=x72IK_Z$ZAZk&8WfTx&wFf$~z}KcM6>go;#J!)y~zWbF*`&(>d8W_xj2^XFAuA z`?C?98=Y&)lh}-P*qmpuC7nZ@Yfa}2=i2Zxwx@G=a~IG#wz*Dxgq`VJ+T2BSu4}Fv zo!gqbgrBk}opYM&#l6~jeQ{s*rE@=X{dhe4^CS*pD-K}?4rOPKNCm^?z&H>2n;@$k4%bDwD`+xm*M{znUauJW^GpxjA ztjhH~fg4$kn^}Ve9lgF-jHj>!Pi1x1Wi6i0x;&E|*^n2r5qq#H$FdnGu{o!)B^R@VS9eS^Z6Ms;3jrqu9Nje7Uo4P&P(aoM6L%Ni^%n4ZC*~t3UYneg?;ImKyCoX za3Cje5bc}K4da6x!N)j~_L1kta4qxvnAdUxC-5&`$3mUG&S;-;?gm!kG*;t{wC^@| z3)}EEUcec&4>dQ7BY79EKJ8P?J;*g&!1wtu?c2*e#+`he|MCgi z$Ci7V6}W^|_$=+~%015(e39+Aoc1~8Ugl7~%F%p{_Wk7EcxsUlPKjEMJl=eyFzF;|S;<5aa_6_8|VKZ)FYi^}&^xXFx$R9a^Khd^wZU^t; z@0`b-w9T6Pi_7^BU*o@gi-j)nI^#b4iTm<5?#EIWT3_T5+@Ixn5bN_`Heo5A!$WBs zCFeeedD|qpBiN5e(Y8YFXxcW&Rp3lkqILFMWm-qiRpAO&qjl%piL|bqJBizP3a!KD zYSTJvt`1A{bXu3p)uVOCTzxiRBU-1+HKujAToYcw=Cp2=JD1j_axHi(+t4~rt}UNs zJ6e~?UBFM-iC?latyAPK;=UJq+v5Jbgg)bQJ$Vv)u?~Cl4ECkZ!kl|K=6&|%`tvdl z;usF$1P-Ooq})h8$WeTZqv^9DcP+h#=f=@{c5XbqSLd$hU!2TB-F%+02ydkKwA{_~ z9+sQVnw&xJExDQWUXr_mT{)X0Ifq`;xw)Lk`Se=L-A}Kr+yh+1hv_+=dxW0jxktI4 zPtbEOx0wI(DHdGfbws!wGj3yRZfAS`#DV;U zBWRxaG2F?!_y_0F*T_G}fB7o+y43a__vTve%O6>Uzq2U+;{H6myY)sM%@VA{Qf$o9 zJeOtIhDWd;kK_>gUh*SZfzx>m@1XB3e>bae8IR{mp1{|65;wCZxASEF%sMR5!+w62 zVO^GGeb!|IHe^FKWfS(`+3Z7)VSWHxa2i|jHhN6+v)GPH*nuzde7?-i+{CWj!VCF5 zFJbYX_Ve>#_TZuH&Dy+z_1K4v*q_~a6?@UoF5j0!Ihn(GGyN>{GdP-yc@38`&*dD? z4V=iYc^$WM3X5E3KR*xTG?wCY*5s``jkmEr?_gKn$?o)=$@k`5PUO9uO3$JEbUwgE ze2C9*0hjSnuID0d@V5!S(r|}3L z%QBc>@=40T=RdKEkK@IM?t=zR$&6&n4W+=lCy|vfxUuGgjbBtilzn&R5xj-h1=y z_y#+2HHY$Tj^;ZY%XOT~5BUN=<||y!RouXDxsm(!^SQ?T`4vm@Tb{(Nti$hk27h2@ z{=`e@JwJaLf8%)W;=TNn5AiQP%3KexC+^MnSco67Fn?oF{>}ZkcYoV!EYE{jp9ixE zOYs~Y%HBMj{doij^C-?>1uo_>T*_m)oK?7i$Mb8Rz^y!qMF#jh@_EK$ypSb$ z39GX^Ytd(CzAk&SD}9FMNAgNu%YK~5fxMf8c^`*x0Y~t4Ud^{TitCu?&m7BL9LIln z9m@{%`eH>+W@S!eQ{KduyqRt3vpYY4w{sY0auo04EY9H)-oqDpFJI>U+{A~N8)Uta zg}IQ$xro*IBwO$)w&T<6$mcke%Q%|Pb1YxtT(0B;wC<2!$k(}wtN1S8EHS&(|SdUp#_^Se}JhpGDb(`|%tez}_su{yd0-c?hSo4DX-W@G1TjeWmt`6S%dX?3eTr?u>6Ir!%KNO^R!NuzmD~J z1Ff6o7qBrOXA?fn=3K{f`3YO_3%21-w&lNU$AV$D&sc$-ScRQgofokMt^4KM@e+1q zPYz`-j%II;rFFvmT=wGwbU*U^LJs084&l2T$`3e_zj74+RF=uHYQ5;lkc@uI1+?yr2FHfR%`+OZ1wK4+`5w1(9e?IWERnaq$TIwdW%)Vl(l%tiAvdup zZA<2R@LTrb77pNcPU8=}jX!c0f8`SX#uxcJU*@0O#J{CY|G2oiM@Cc`*0Mm+(r<=Svy@*zcPE^jvO zxt{`<~%2mX6V`d41hLbD0W2Y>c$I`!SgQ8F_1N!l5yAerXByZu+^KimZFLeuv3UpxOjcaZ<3{|rm+ z0(W-L!A*t_?%8k9<^B8R{_k%CmpnTE)otJo$eni3al2=iKh&zVKOevQ&mDIE`IOy% zZs*U*E#a)-o08u>H6dBPZ#{_nGg+Tc{&6BoK3V3vJea5RC^|7Ee>9sg`O5WKg?<@w zKKaTGSdR_ah-dL^HfHkuC*wNq{&Vs}|IwqD{?L=OU(R~Y?rA=mBJG!(oK2gSO`DZX zOCIrb?BZ6Gi^OULvBpZ4HbGmk0bKN(VV{BpAy zzkTo_|8+fn`GL2_-}pbz`2UTO|IJeTSKrM4`m+3w=J-E5{eS-w{AZfuf2L*mpZ&@F zXZ!pA>yPFC`pEy$WALA8j{ljK<$wR<^}qhz{r@B5gX;g{ljuLwPwRjGviv_c$N&9b z>Hk~L-DXp)!!?^?ZEpN0&8AqvOBesYtQs8EXRh5#>fP&Z-N!vQRr|pwVR%+8tgErFd&62;@RZ2G!dhY&v1vv-S zcKBgQU}(oKlRrN3j^^U|@lK?-s!vi1$Bj5YFt+}l!>Xg5k1 zTPrWfeVet(Mo8N3l#=TN3UY<^+VeGvN~grwBcyIIwt|$-`S`4@DHV#b^`vz9&XVfI z*bdSqF}ACej_sMXeWiV4>@X=EJ4PxR(A;xwsnkB^vN3DFl}bkYt8`(syRz2yQ0|aui%UJDJxEIDTt?~>)2c|_ zW2sJ((xo~rYa2+1#$3*o(y?u&BVyV`(vX--_pH5K8Wq#7mU_gT$4cp(r)2GPDY?R< zAbzV>I_LSO9UapaN!P|)o|4jbsdPh3TP^jBIj@t_Ie(V5UrEQrTz-(!u{)%jV{G9< z_RhrE1Eh3p87XbcNyo+5DpET3Bq_P}q#$>OG&|eEHz}R-qUFMQfqiD-XpG8|SYpY64qOC1$jP~@b zZ76MxY3-!m@mO`1(#NWM)?OhcSNRm=hDhnxy;|B4W2Z`&$Jkq?bnNV`oiCjmV;_^! zu}@2_V%iF6SIp(LtX(bbT_*WzpG#N7oHtA9oPWsL-=yM$P3K%hO0GXD$d!_c z$6OA}+M}eBF|CHwC+2*rl+L+f);5zah`F?r(m8jM4vVpUq`onBpp=fiI%~&Don!1& zDIJ?^DPI`V=1LV}F85{a!%~%)_Plgu%=u+0o%8CfT_<&mxqL3AbKWdDY&*4l(w5>8kY6kkYZMvv!@-KgND8rDMOA zI>p%ErGYW_A1NJMxbU9#04cdTtsr-pl#V@0>KZ~0r4Ue%?rF87A($z6-t~4;_a$nXyoU}3Rd1*-cXh`XtS7+@y zDY?GRYew4rXh`E??C;Xh^wE%ZKN>~$vLW9@pX$! z>DN6(O53v1jONMMrd5ys^d(=6O8vKkQ&W#NSH#VqE$kb}%>ZclqGhv0T|-`0xDF;Go!ReE9Ba zV~KPxa`pf4=ks^}dCy+v&b$A-XD@U2-G9#ZGABEk8~Bvm^G~vj-+J%sX~HSHr#G`R z*teQ%$?|N)WOsENHsg70$+m3Ic1#weJ(Hct9hfZ0`5eRxIDwsb7rXFLUc^^{u=aE{>v0TQ^IBfXvAmHJ zcn`1Vi=4!byn(wol}C7NT+JE3x#Jd|>(96HO5V=wU z77!6pqehlRL}4`sL>9wCL_{_qA|fK9VuFBxyhMckp2t1++~2*w3cG)7f0DW9ch33V z_v74i@9$R#{|@2n5PluuZz9}|j`2o>k3{$;gnJOa8Q~hj-$VF(gtsC5b%bw0_|{8NN4NB9ARZ$kLz2tS1I zPK5t}@GlUahPnSE2p@{@uMqwSLcE=N(=!qN4Z=-?pFsEv2=TV+O>aW@DTE(F_zwv0 zMu@jpZ@M>T&3{JtP=t3O+=K965Iz&(=MX+0;lCn$Il?a^d=tWdL--+tUqg5|!mlH| zH)fe{BK!e_|B3KN5PlosGZCJ404LlCw;_B9!h0cn6T-6*z7yfS5&ktoyfu5%*AZ?< zNWTnmUxYglUV!j0!uumUj_^W+FF|-Q!vBu&0SNyD;Ux(F0pWuXo`Z4n5QOI=d?-RX zB>4h%sB%a`)VYnO@m7>Nw}Fd#T~KQ1F~#=VpD0gPP_VH5_7E}~&kt8V&G?O< z*>lyKPg~voparabKYmqX`wQteEB2G21_SpcN3Xj2B?qpa{{!?w-sCp0p}+Z|B@F^_ zE^fYK@`wz7Zznx_`|a<(`!lHTOv|M*d1NNNkBj4+tG3_%CwJ3ypQ%lcWP2r&_ul=C zdx&KF%`e5=kR?OMS)sh=%x}N_y?0+wiil37yxO1K{kgLXu_a|gZ11_7ei9{16h=o9 z+aKS3OG)kiPVKzyw{u(GJt=8^e@XM2k|wQdcj15ZfQiLPHc^&IEMd9k*D&5Q&0?G% zC~5lsW2xU-(gZJ0{bWg#+)!DG4wf{@B+E1(R?_tCX!-mm=FF_@mzLtZGuO=0ePgbZ zjL*rDEUjYx+ogCeD&^|&B~3TXw%@$JG(s>-jeDQOnRz@(&E90S*sG>bKVX-Tsf z=ht8leRpO5KuHtngdVc}=5OI4i_1^6Hu7#N#fA0?amAVJSV^;3kB=#77R!8kNz*St zmd}rs#!s;i{Z2^}>4Xw(znT1@S?v_Z;&Mr|*vqagX%^$WPf4@b$Nv$QdzQ~)J-#j1 z%w~&MC#-FJPyM!uP zt#K2mufkm4)*zGnlThB)xE0jbnD^VD{+@YvfciS~{sI(!v=Vxs0VR500`=F-+lD3< zJ!H6f+L4~g$3 zpybfy7eO6;GD+WP(zk$;!<2V}`T}D=YEs%t%dyJmK}qd4Ff~cc_XZ`$C3KX5AMr%Y zk2dKQpyc3$jxD~z(jz8qf|A3J^Gy0PpniqR`}3f_$9CZ8& zDCs3{Ht8RN(gO@o(n~&W(tiRaM;TuNCB0-D3{1&0IpyVu;sKzfmt1Dj$AOZ=iansD zmt1es6;N^N!Y6n*AtTZ4Y&Q>2@q#6ABLpzhD3=anY?RZ!xnCnxnRW9bJ!1^cI<#1&5t z>7Cb7%;bg^DLJ3T#r_?VGM1drBE1k4t(mws0BXe8ohF?Jbzhbq0QD-C-e6L41ktLq zt#Ja><2dFQne^vDJ(Q*7TafWfKME@8{t>9hvh>eD(MPVfH9l$5yFu+_=~qF0kY|4S zfl$F-0O|=WeGsS%mk3Kg6Dratg4)N@y`b>ZzK}lEq-{_DfVTna5sbYFl(gH=g4)H1 zTR=&CzX|H8jKIXej_a2r+*xs4{{^(jrSJ}fcYH4h`Qw|>|6hI|8|i%+|C3`n{866h z`E6i)LizW?6?MwznFt?%@GOLvB0L-64G7Oc_-ustM)+cc--GZC2+v3OK7{v0_-6<& zKzJv@3lWkbb}_>9u&O=~;rR%E0O9u`d@#aUgbzdb6oijJNS7`iiSTI%e-Pnw5nhJy zH3%<9cniWE2!8|N6$syn@P`rpF~Tbmz8~Qe5Ym;1Cn5YC!XHKWC4{>XZpWIr2jK+> z_aeLq;WY?%BHWLV9NPyF?n3w!gf}2OjBpJhK6`Le58?F)Uxe^!2w#ry=?Gtiu!-p!XHPtg7A3=*Acz|;R_MojPNB0e+uC%5dI9pHzWL6gl|FkVuWu;_%ehaNB9ba ze~<9z5Pk;XFChFj!e2yqFLdbFAUqf0EeIcl@YfOUMfe*C4>>3IDQ5q=)w+Y!>{9iNHdpR#@z!VA$i z-;I#A|M+YK|CIHgBBUep_ah_+!Uqwy5#EWAj>tcRkX#UdiSVTe{|e#HBm5Xba$I6X7KYk087h;nNX57~u^FACB;O z2p@^?rw~30;foMH2I1=wUWSkk5Pk^ZZ3t%(ei-2u2>%-4PK2LC_;`fhLihxPXJFlU zBEqu~&Ley@!Ucp^BixJdT7>%$9zpnIgd>Cp5S~JK5aII>9zyub2#+BA4TMJ#z8>LI z5xy7U(-HnT!e=1-Fv1%Uei7j^!mlG-LHI3%YY6X$HKB{}0SKRs@KS_*gik^^M7Rgx za}ZvGa1-G=!V?Gw2u~uMAbc*uS0H>I!e2!Ae1x|k{7HmwNBC0+-;MBv2;YbBMF`2! z{$hlmNB9ziUq<+Hgml31a|ka)_)3HiMEGiik4N|#g!2f03E^&pzlyMh@YfNpBfJ&i zvk|@y;ZGy{O@yyQ_*)2n8{r!fz6s&~M0h*GbI`wNjkyiakHNhAudsLJK!vDt8?QIs z8CTZzvn#&b}&{#)B;ne-o^`=It@j+aPB^h3un&%;(b1K-ks;( zarW@68_uMKvvJXXrGMq``4)pv6vK-phMF|#)f-7uC_=mQAGF5YG~X>xsVP=Nm#OLbRu*@x6u+iV)A9n#O$%Arv8oQ`5M>5JC}R zYbxS?h7gJn&lQ9#xo^SmGlWotctM8n?QwrY2t|mW7DP>ZTxbZP2=UUXh>Hv%6d_(I z2v-h2mwdk=gd)UiGQ?S~UtMenp$PG78N&CH2N*&qLcDG&;(>+`iV$zi5WYQrzz{+a z;&(H|UEqelOAH|tA>Mjvb=3NDJjf725#k*g!q0G*8bT;SyeC8Way-}&LJ{Kq8R9N* z!{0*;Arv9*ytG;l-{ucBgiwU|s32;3;=>Ff6d^t_74dLG2t|lb3&Qn8U-Cy7LMTGq zl_9?4dg3DuArv9LkRf~vKFSb65#lR?s44k>F@#Wr_~ul^qYWVxAsP>^wukQ}KWGS{ z2yteH@a1@nA%r5td4i}Z$72m46d~?A6>*s%gd)U6Q*-r0h7gJnmrPCLazhA3h=)x@ z>@b8-gn0B+#EcT!k;iV#oB5I^Sj29Gy{P=vT4L-;g) z#1KLeVl_kfx#S6k5Q-4J4B<=uL_-Kgh>;*_M%0rGArv7_W@(TwIsE;oA%r5t^D@M7 z+Cb{xRfZ6X5I1Lt`#8kBA%r5ti!y{S`7T2UMTnPW2w%Iq4IvaEUL}Z{x>_)VP=xs9 zsfay>5Q-4DX1VhF!M%nMiV&~Q5WeL53?URDekVitmGf#t2t|n7GKA07q9KGL#M?52 z&($@C5Q-3Y2%@HTpKJ)B2=U%5jmNrPvfmIw5#j?G!dra@3?URDK0Gy72Mr+Uy;c_ft}}#Cgt(6&YI@@Jh7gJn z_si1oC4Z_Rgd)Vn8RC7e?>@~CLJ{K9skwT(A%r5tBeFDnZ-0g%gd)UaGKB9}&oqQk zgqWF{t7jQPC_-F0711<=P=t6=maDtK4SzQnLMTEkWC-6LEkg)Jh-;?iYS|D%5n^d7 zV#N?b5#rd?T(u1$6d|6GA?^Y<{B;Z=6d{%~gtszQ4IvaE)-!}(2iFWC6e0QKZ~QLfn|8;dAwDLkLBPn=-^*;D*2Bh7gJnFU%0W96dt_MTi$?2;Z+Z z3?URDUXdYu8ht|uMTl2th&^tG8yG?;Lfn!ed>TVT2t|n3W(c3ga||IAA>NQ7e$wS? zWC)=M@#YNS(-<2zxA=)mDi6Mj{#M?6jy&x9;HVq*ZA>NfCe81Wgd)VJvNU|jf6Nd<5#lo$ z!uPA^8bT;Sd@e)y)%nK_Arv9LoFV*(dY&PKBE&bQBA#yup$PHqsfe2lArv9D;qW3o z|M0#2Ck!DJAdx`C_?;nmd3w-KiK;B3x*Ji5HFpY#;Xk>6d_(Y74eIP5Q-45$#Uf_{nr>m zC_?;NhVZ+IUowPHgm_(s@axAf8$u{TyfH)gHvbhv2t|nB6+}&Y++ql!2=UgbY5b}o zgd)T{GKBBDzh(%b2=Sf_;eBMkZU~_W@&2jhxYZCs5#r9Nh~F@TP=xqsma9un2V4JM zYY3qT@rexK$H#v+giwU|bcXOP_&P%fMTomHg!kh74?_q=h%aOaZ(qIM5JC~+D}t!$ zCBJD1p$PHKsfafiLMTEs9>z99O&Y&t2%!jZrXXt0ir#1lp$KtahVZrf+lCN|5ckax z{tnCU7(ysQTr{;DZ!&~Xgt#P2!{_SFh7gJn51WekpN0^M5RaaU_+3K?MTpC%B7V;h zLJ?x8AZl9hHbV$Sh$m!e`0?@kh7gJnyE25I6K^+!P=vTTL-?8cErt+^5C=1aZ;!Vc zLMTEU5kyVN|G*GJ5#ni65pOeuP=vT)D&h|fArv82vvT;ldb=TnB1A7k_>%uGLkLBP zQHJny;yVl>6d_J#h`YcIe}7~Mp$PFjLDbal9flB!5I1LO_;S3{5JC~+MH#~P#CI7& zC_=m}L-;h_Z3v+V@v02r(|C^|gd)T*X9%Ch9~(j_Lfk5dn!0+gA%r5t>$5a`uKvUj zLJ{J3rl#>eLkLBP+omG^)DS`u;%!qA?>B@{gt#LshacyEW(c7O@!qM34;VryLVRFq zuKwH*LJ{J_Q`7jMA%r5t$EK$7zYQT2AwHR<;d{xQh7gJn|Ck}}0yq49$Phvi;Msl-6d}HrA=+-|^$|k|MTl=@h=)5Lz+W0dC_`zWC)=M zv7Dvh>*_Ox5Q-4%8N%=G{@D;h5u!geS9cjgC_+rKG`{Y3UUwTpC_>zrA$)s$)(}Dw z;-(DY`_;b~LMTGKFhlq>K4%D_2=U^nh|e2BC_=nqD&h-<5Q-45&Jf;z^{<8yiV(MC z2w#pb8bT;SyjBo3efLX-5Q-3Q$kOn3;+G8}6d~T6A$+d>%@9Hng1)2%uX9bVzG4WW z2=Vr*h_4z#C_=nzD&lK~5Q-4*n~M0lA%r5t2d5&wVF;lJ@ex6|ncDZ=e>a3sg!uT> zG`?vFp$PG*EDhft|6vHB2=SSzX?)8NLJ{I~SsH#W`AC- z2=601#}Gmh;_(^6zaMq3A%r5tRf4FQeeP`tp$M^eD&jmt2t|nfS+0C9`5r?EMTkQg z;x2H*-+c@r6d|t95Pp1YH-u1xcvgn^-|iIod_xFDh<1kXbIJD_LMTE!dn)3-h7gJn zLqXKE#|4HEiV#~_8oqY#X9%GP@!SmI%kh1N5Q-2l$Pj*YzP}-aBE(N;2%pAW{Ogm`0y zXuH+m2Mi$;A$~VQ+y!p?A%r5trGhx?^u}4I$@g2XFn#P}4IvaE9>ItQpM84c z>^b`89lmnK|Ds+Hir#rf(f4EoL0T`s|KYC`_hTe(`ZCb}RooQsTb=*A6!(n8eZjWI z1(W+V&Te1Cxe2H=$AYIX9SMrGzUnNnQv6qH-ldcwUg}Dsoz{-TOL3lad8m<~nPQ&w z|5zs!?kCCCxJD4piuc~d8w?>7A(k?PpHo|g5Q-4T1W_}-mJJ~k zA)YZ6v0@0J2(c^(R}Mc5w+$f_A=Wd5_r!J#Arv9{8N&OGRt+H(AtqB1YlaYt5I1HB zU%Tsu5Q-2t38JQUyM_>o5HHNq@OAZULkLBP7iS1xSH}$@6d_)bA$(o+3?URDUY#L) zt~LxI6d`Vzis&0cC_=n8L-^Vq7(ysQydgt)kHF9nLJ{K48N#RW97702h})+kMurfI z5O1G~7#l(;LcA+O__cas2%!k^K0(y-A%r5tw;8e4+dUYbI?_3LcyoDiqqWwVU1+TJ7DlZThg$u$&YoUpqtl;^!Glgz zr~>9!Cf%(LxRcFM2g}u-Dl= z*y@ZhfKj+zy-vTqd(azPbq(i8{ zp%NNReIPtgsf@PHK@-RPXw*7oStX8}ML2~eq`T2ULKI1bLs6wHs+tOiln!@R2K{zx zbczc)yIf!u)TlfaBsW=wM;WWK3b9evDr($p6&_Val~sssvrvZ3<&t6{-OWO;YEUg-4DZ-q;- z$}`2&?a=d{emg|EuhWluc!)|^b3|g}fa@r-WfW4?7%yf4EKcIuxb7{ZK)Ad4_Kq_^8Ud}GL3|3#Z4u&ns$2~ z1MePnFvl#725T7eNMD{!EEO2V^6bP(P8Pc3)^e|NtTUQ)PD++|wn4l!&&2xP)34J* zy@**NaH&1v9PM{k2P4WPDRCWi+L9G&TVbZP0G{T3vA;UlKUfnz<%PzPI1&wE9Ug3s zR%il7Ji-YO&5NsWs3?<{kN6lMzE*TVYv=G1p6vkkybz)1X}^grgI{0>9b$jCe>@5* zML9g_^jEsQ$_k_01Fi9K*IAT%?a=YGkUMC&8%+fX4>Z(`c7hp)5K~08*a$J&A=q3{ zflMgj!KERSi3)fzH`+zT3wRK4-RXnaj!Axml_V%EF$|85-EcY9>UG=60P>B*#$(E$ zJS7~em6VaGQ14Duc!}^FUJX)4H5RV^M1{Lm!l@=CcAi(^B_L%~6XI4&RI-HFdP`KY z63rdtmDMZF9pr{fSp^`k)2Ws$(-mGJHd%ZVy*wLaqa-RkW)n`eQKjc3DtYSF+866F z0Ts$2%So!0RZ27<(r$mU(935|YCo6hR!76h(hwvg)0n?^4FQ$d{9@`T=3;+5Y4uk+ zG;{h5r{^z?x*M1kwmOG8P##SdF*BTmK6;&*!5Bmvon^N9!B$@u4K`-k;OXw1qk4s4 z5!>ap&S>YHj6+`)3*D{mINyN>ONYwO`}AN#8^c>p36mZUbo;X1C#%Z_+A%Fd%bBhEhU+{I&qmG#9zVMaX?vAk4*ge?nPbdrItV(M+RX9BCtaM?w z+!%KON2F3|3Y=Zodp%-VKs~P=fHM#-i`}hWkEY}K0}B<2%ojNy4U0X1@R5BV8H{k@ zC$-D1-Dwvjp+RyDYKStoh;f}qnh3jSUWUf2Tb5I&WZlV$52F9kauj-Drc+g@Ny&Fa zi=!*Ku=W#24NAz(TM-7IO)8e{8D(M|iqv;ci(`5aiQAD{4mLFlyi6~_|8ro_?@k6I zLFisEvNa7Xf|)Kh)Q)GFnK&l**UpF*_K??tn094T#Ik@+Q79(8Z#38()c_wC<4y%cZIN5{<>X_VDw7CUI5a3y&LGGTU$r4AZP;0FAn!0f57)bQd za@hXi@jz!|FgmrXHNqS_+I8v>Hr0HlWVZD#*ob77?i!q&KeP*o!qmSD2?fJkHL?}p zyVa5UtY}mJrlahuTm3f15$8ktE6tQ;uGmqdiqJRLewpbxw#Bha00Y0nO?}B96-qK*C*2Zp4Ju=+dQx-PqK8y+z5+^q z7&X4pNziZda!^wYwu{Vv6~je&?e3wqvtq|6Hiu{$p*H>O}cxo zKSFVn1IS4fJB@- zZl8}hMO*D`Lwg%3!gW@S4DAw*F~S`i?~;uoohrg@f^Q z2pkLyT$z}JdrJqpL!5##KfM%0H5-O9W+E3;G$+g@RFtZ_$jg#LUMGmdG$iF(MouN^ zN>)tS$L&%EzYt?II=XU^CYuR(nUqQ_$P}ghz*VYpcpqaK3kQ=$A&=0w zt{cca(29xz8My^WB^^Up64hRciV2SQ%tdW3`COuN)?@m>NN{s5vNZ_7V+lnV^>7xywwAo&8f| zZ!xqQEHv^jw`dB6dr51N90b*L_ZKq@qrU*i3dAGYeTA zY|%B#4c(z@YCclpI=C055*?&G{2V~pJOXnz5AU44UnfoSUIV;IxrXRix}e~dGEft$`%E>^7=83#EZo^{=ub5-W{YuKKMI84QHi&{OjlYAiqy2Iy_L8bZHk)x-@V>p$0NrlLqmNY2eC2 zx#TP;Lgs1^#4iKt(!jL@gSZNphHwmxHE?2do|7uY%2pj$%Yl={h3KyCjwj*HHWIeSERtLjqQG61jTT+80bb|~Tww>Kn4;)J z((;JHQUPu8!oBTs1_?7vT#1FN+YHFmPUMqU8Plc_4A5XSI-SC)hJd|k8qPS{B2r_X zeOBQxJGfBkIBtaNisT5xfxI?$g^OtjMU0zzvE;M8zOdsCKLVTul0*dEIuY!I;G>E0 zfC)(8I~SWI9rji5B&3Ypo1+nXu3(%_^rbqjbAG`N6^$cB@rz}ATq4VPIIZL=6eED~ zxG^R?GOHzh-h!aSjuY}oEG~!|L}Z8(&p9sXu_E<5E<#wBNjsI7R67%7l16xKOER6j zF)6IVtCU*k^rgWfGt^I_x>{1j)e@=7L{;rjE+8sF-dMC+PgHeFnW~1yNVqu0%#(s$ zR^pcOikreE)lyz@nX;r>$}8@o7gT3Ud4chxMeP??#d1~zwBJeM@$!Xm}S>>_z640M2cmEJ<95v z)@V~M-MLY)D2L~8--d+;S|{aXI~;W%S;v`3TXVrvP+Y1cz6w)QSsL_CtquCuuC8Jw z;ydFQ*vOIE+dPA>Vhb3ibme26;x~U5^$u!81c|$fUN5YNlNTb%Nr;y-f?RA3j>Dg2 zUKgZMxI=0+iEE_6Nb|hv+uUAemW3?gQDiH5WMQQUy%ZVg<1zF^eGHArk8D*$@KX0= zhrHGv5_rBh^ox=rFNv}&ljOjb zTxv&jtFkN>p;yq2QtrrAZ&QsLOd^p`uSdHJ*e!JED|&H=?-`ENAtNAtn&^{_3_EDa z1mc)R{Z=L6pry*^ZiyR5lDaL9qe@y;*rFsnQKb}x)MrIq>$S)YlSYU-d0()C(E6%yk*adEYq6uI%A(9wcvN9kRzZ!b ztD+X>6MDNdB+7UDD|*sUDU-cLRaTxXzgSjL<9<}(<++nrDJp7(-08~{sUo|qs;oSB z{5D!et&lr@H>09fs5^N(qoP-;JNBEUdg8IF@bZ?Gm#->ndELo@WJRq|clz2!s;Evm zc8nDzg&GQuJaMNLQTmcsSyn23h_h5?k=3UrZ?2Wn3QoitS#8;ZpRtUq&trYbreM@p zSxPIsL06X5*GPEDF210OQ;0Rb6jFIjHB4ccFR%#6WI8_?Y;;%jinDCYcmU9(>bGFP zB-ae_EWUp+`()`-yGT zc-DP^J*Hw@N#(q%*!FDUIYrw(O~tb*+ICSvoT6>#q~f_0jZu>1WiCbAUPjS6X;eTu zT@<-70ef}ZccRMRNUB}l;@H(2tQ@C-AZN_h>)>X=nrWC zqn?Lu;Kg*@mLf7WiO|_(R4X%T$ugC($HGrW>|%eVw~1FvxQEC%WJ^|GnF*cz9(bWk z%Uefn56+M>;VjY1W`hm92S`__BzYM0C3bqd9z|CB823x@V0Y@JF5-21d6t{>pyd)h zh;V-%6x1T4$^6F8Y|Gg|s^9ia3Fb>K(r`c^rA0byT_lj^m0Guvf@dD55 z#U+g>JprK$x>WCcN5%1UZ(QNn8#M|;;Z=iAQugy6BjIEpMcKb2SK_^A0+WjY35&OY z6%OqH6Bh5pDx6G7Pc?vz6(Ox0qoV>=r7|CA?4;lm(%PM>Blpavs^~SfsXBUJtwu*P zqNiGk5;u~{V^Nt~y#mL~?9QCDaz!^y(Bj=i*V$x%UDxTZtxuA}Bw>YPBzX!>J9!Gm zoje8eLY{)tP@e2GN*`0*!Woq0N}8OG?EEuU!^o0hA&R!G2wxHt6o!Dv&4>ueM~U7p zuK<#i!bibG$4=|y(R~n17*yqIItoKFsw~ZEdPkp|j*r9ykzCWS3bDYXaiJ{A*wf## zl7@~Pf?^)CSEps?PTYmNm_+=vdw&=SjDm~eutjXu^GnX-l^x_qFwB<^OT$!w7acy&EZ0^a0c z>mnbDm9H*kyj&5!^$e{3_7p97$#{8;lDAY*z0e2g{!CAc6(1;$^!ux-k~2xQQb_-p zh^1&I)>7HC6v#g&Xeow?wFF6{OC?uX6idRBd{kMPn&c-@11nRLd?jj0-j;lF^bljv zS`{okIFXNbNh6G}r?Ztn+L47FMdu`M1JSP+2AjAIW_yvny#e|?zkziaZ?fYvOBR7X zM|8^I9ARHQ9N_aoWKesCg6PbI_THouSfpkjlnv{EW9W<(IXbgAMy8@}$fyz~naI%@ z#xbg~goVLW>~c!vRP$o))TmO;i@8*zN;NOGSkM+b7_3JYsS)EV7h?VyR~%FFQF$lQ z+fiYbV|BDT2FI?=jiH%uSjOr^s5%zaL8|qU+mIs|lm1Wwtroi@IVh+@?wkP8EHaqQ!h;vDRp z$eBlnZJcZ6{5)!j1O@Puw=1G6ON~azT#Z-~@D~zAQM_eZ23~@NGrL^k=}493Sryv_ zMQoV3O%p}!Iw`NDs68rC48=>BIuuf##wf*Ow*oeyns&<6bbLi%hr$_8c}bK~Y@D#= zilLPfbSafknnY1clky5lV+qTWrmalQEaZ{4GPzy9$Rn+Exnd!YwBBWk*bNtWCB;G>X{(W=3wfj?%3QIKN7{a{A}zr@^zkYrP1yK0 zCi#=YgZSv&I{p8oCcP|=7gJF10`qayVSJ!OQj8M0GAZ0dSy(*gc=dD7)i+gDr0XpC z(87jD%{Ea$qO|&vocYF8PeZsHnSfog{)Jb^4!Kd5lvECVgvE!DvNGyfkMQ}cB3O3$ zcq(OugE8gOtxK@@{gS|{yoVxeWc|1_w>%&1_bQz1^^hG4A;!v8&6!*fEwBs|Mfw7) zOUPv1dRW(Bg*Rkk9t*;dPc*MfQ?8pzda1;6v#Lqfh(nGbuG|8ZSS!qs4VZhf`xMu! z=pLaTQNqVMJg@peo=`XZu@*g0&3PdiLZk15j^b;`v1_zvL(^{dyi-(D^GsJqVtVXv zEq8jN$fR(EfmsD#W8Fg^TsqJi9q){Uy)+o|_lXi7KD3uHdDF+A4jT)SOy{t{r?XVy zPWe=jD#))+vAbiTv)aP(n+oixJH%S4=Wr69h+`!d#a5YFNNWn|<*uAti=8$x4#FU`d|Z>Gm8w389{UjmcGm=^)z%W+FxVwqIa zN)BnNNo7Jw$-M&R);xC!1v^+bu36=Abe~_EBYe!E+VWV)<=>aw|~CBW*uoYK~jbMcuS> zU2qFAfLn+mt&xyg_1jEVhO$B-UMnG99mvp82*+W)v``2`I-Ki>_axS{QcKc7F}TTW zOhv9+$~Dl+_qbARH8RP#jBBnhKPOk#@)c39<{Gv;pU$a%AtE#HVCFkbbcvZ##BQ4o8!smM$koDpQPJLi}bnD?&MUJZ+Dg2wUX7UBvVZ^ zXl5wKnn*HC5-X`D8rO~{>jR$=SenTrj7rb^67bhs@1J#HVr zaf2>0Oh4zDw3PDv?<{H@DxoPp=Y+!~xMreC87#6eh%-Q?JO-#%qMz>4$_y4?Fa|>sfnP0k z;D>^{Q5+W+$4nL-=F_H69SMFxVwqcw@+?<1bUq6?uMvj=)QFRExa2i*sjM0-eGh4> z0)G_AX%rX6Iqlw@NR5ULoGB{Wb*5?DV zx@cN`VI)<#<(SJEiG4PW#op;DYNmK5u#QueXwS*m+C){pcH)eks{6@B zYDEEIi4F^6g+J2d)@sDzH@0iUyxXdg1-pbz z&Key#_N)=6*Q08bP*u|s(2`1*lb=M(s>kar)+FO~rmA=$9A_)7k^ez0Njo~B)YHTb zL~j)7?p4*~=Y|uWxWEz?oJRUE7(4CYoZi$FZl_~Nt2$OT1z*Jk*9<}wuvrc687{q$#NSg<_!B6H% zZeUXLb)^0D3IqKFS1-ho3o5Zih&Ev!S6HbNNhyJ_CMAlcXsa<|MdZ>{A~kj;&w*cw z+Ssa&(UjyQWUtB(xpDjuRRI!20mT(aTWaky>4$iQ=~of8crz1KFMkEEx5m~@zw|5I z@~3@8W;eY;L^@vy-)E%cGRNV9e)3#mL;Zz#bb$-&T`mbrUM>l%9y|d~sOf`Q$Q8Ka zt><4@kjzN?g#1i*r1~h$s0dA#eB@W+Uc@h9RtxVr$v(vuLTjb2w&Lbht;?7ffhZgO z$0Tt>roz+_9L3?fpufi8YbyDLViV{d$jm6zs$VJ1@T&3+5H?Z4o{rBt?v#POh9nxF zQw8h+5{0-YPy}rAL?PPhNsf1@R)wjFrQ8r>m0MB{8?Hpx_FE~p7;oHdCCam<{Mz;@ zRV~IFD=JaOFYrorrQA|#=3q!w$HfTnEsU+?)N#mCHgZaM`E|?m1SMofMpW%0Oylaf9Ackow%KmZ<09`u^;U ze3T{!u#l=-TZPUT$QbuG$vC^-LNDrKJn)YQSA@|(_u_EJe0*Hgh$ z5vy%oC)Kf6Bi1#fP8z^;E*^6%4a0MMWSXk`3}#StEdDa4^3!im3N!eDvDw*_UnD+w z4DXTTY;G%-aZ_!%l=?bmmqn+_)$&%@ zI_|36va+^ZMLBec3R_#M$}PvN<*X=&rMkl2ESJ!%gQ|KtCuT-g)ysJ?yCGFi3jDG4{s@(I&a=SShE39+A* zADNY$QELMd8(Id9vf_|Q8TeL@$KXeM2czx;ck@#V&av+M|&g!-80cOQ@?%M@9RDh?9ipQ z!c3!+*WG7Is(8gINm*29OR9K}wxAkr9wZsSw*?BSY31Rkvh~-@W%d>T)hTZSZ32n> zuo*0f3M{lD*2uDeMi!hf(U^;gNI86#qyYw9=p2SRVAO?|Rw4>!Cgd+f^UUI1SGgbu%xo z!@7na7zrCp>CEz}rZkIqZKZQk1ZtOi-H^HYmFH|?d;8?hsSaLCAq4HJr5X-(@Y~?y zvJ7hN!HGki6}*5)?>!4bEl7MwQl8l)Ino(z;3wX&fbKiA=fIwYr(!CVt2XlXOypAk zreC+WHN?jJ>ekgufYmE>MWGJP=sMw4Xm=V^Q)Nd2on}Q3!{V+3$ZsMrj{%GPvbP^U zNF;#DQWpi`j7{4(3j8`4xyf1>*~Ps{6jzqZD3G3$rG20^1cavGnT5rJNA~QemPO+$ zGqCs$L8j;{U@NF5`8IAPU&c?eWn8w4mO7(VHm5?&;w#M9vLs||7(f{hoo{b?6{Oz+AwO==j@-cE!*<;> zJ^AWGXfFQ?_q$uY9+{9;_Mkr*4SE%>%+X*Xzdn-vgEe8gck4W3X)@xM?7&Mk)FT_k zxcSTx^E-7=U&1Y)gi-fXCsH!xEBx*tf41B`hwnfJId&z8pB!oW8x?pGOZgCNn?YY! z9B`$(co{KauU1(2+(CsC-EH1M*iZ68JWQ$`LMQ|{1ROTrV?L>BZjrqL9GV z4W`G*k~P}ubGmiHEtZxs8CR730>EfySf7#Z5k3%wS%`b`b^NjjtJ4xeUm0)F-flb* zUVJ{>;oCjZgUEjG_V}aZi8}ABT_mc_Y<_c87&6sndcyX4n0-}iJl}4QLI@DC2@2cwoo9eg+pGtjPXE3^c?#lA&9zu1w}18ebBPL8&RH44%tvbQu8Hax}S z1xb?$BTQ@>M*P})o1fhq@Q%UGCVjT$QyU)7VLBPh_dO&c@Z)4umFUn%=6U#_`zKjWiBe#-!EdG3_`9v$@boE zzdK%!wFys$lcFN{NfXDdrVhT^B5A5flNyU6KVkF8vq?BA;|&8#5TDM8ycSw{+g7(l zu~tV>HYa_tMkeu=g))L_WCE=G<~^6e*J(KTk1g_DsDx@^RZU(tMEkq=6$obYLcfCZ zLbdrT%=89eMJOMAaRb{TD^CWAIGYtr>P{(S*(PTV*-PWlTd5W(&uHa}Lp;r4MXr6l zjApm_G&r^ZsW|+q1#_jb_6;{_a4<(J++T;ot4C8rNf%0Cn^SNhUxoDeU8lMfodV7>ouXZ~(Y$KJ(65wpNg^w@r&f%r(hte|LOXVnslczX zvG8@$kY*Y`{fv1be*Sgy62B&X+_x*oPrr9wh=+eazQnJIANTIc@zc+q7vkYxLoe}b z;>YE=5Pzu25V3of8V?MM$}j&;i3kOtSnYZsu61^ zFsk`*^}(yu>^i5Qw4~1ub51a~E`s3N6OlcMkmpS-!F-IhLsTlfg5pd;aYmC%(3;T- zuMneVJW&h<5T~6+6&@sx)ZwTqRi>y`3K<_$u@)_eL#e{ECJ`S~v=$?XLkVQv)TqOQ zAmvG;4G&(VQHm&yP|QMYHBksGAA|6c)B`J5OL8J=v)Zygg(O#^R?6FWM*%wymFgoL zmr@z0ams0f^gY2UCohIxBjsU&X`S61_ABvX80dEb%MafpZEVIyHBwK+lcUCtUVhgveBLFlr~9 zh1PhTcc0o)thT??U(+&c5(hfyjw`&2^@_qyBD5Ar^JwfelZS_`72KupabmK{N+>)B z9S!JbYT;AjAK%ubcvKAs^ihvkbNJZ}R2(M&k}g6n_Cp({+)8`MP@|8m(70k%&zh~W z_!N(R9%>eY)~VAPQi(xWnN}WyZ(WWuYgl1etIFe6M?4aAI%2T2rAZNMFKXHp_VrE; z(XH_rv)Ca>E%Iag8^6Gk?m!xHX)WT@c&$t5mJ)!-(!uL_x@|~UQB5zJvHL|Xomj!b z9W-AXav~d5HkT9U8RZ^c9yUW_d88W(hW&-d(e^f4u0w#9U=7fA~w@1MsW`rut=gFN8^sQwTATE9u*{Y%CAN6 z?L=~?xvoThy$UP2!mM2(F8+M`MJK6?a;A zC%>@S>QRky)bKo-fNvBim;4drdhEbyH^Ov-5ml5h6WwkZzY03yu99%B-JGEJB&;|- zYS@zF5T~h2edTOXhc~N5ZthAxP!9>yVv93-Ssv%B(;jmlo9<@-P6(c3-bF_M`bw&x#oqbuRqeA%EFLX5Y@V;~v z{R!1@9P1=>+#~GLNly*H<)DOe;v^TT8-cRS9X4l64^*Sq^xU)c=*lmg&Mt%@5CxdA z*%N27sjiIbPnNVX8DdjoS;7G+x&tw9lQ?E>< zfjX% zQHd;^qbN@b$0)kZF~-y>6Ly9PVqS7HsWRqQ@cW`JPQEaeCv~(x(!_j3Y%}Oioo*XP ztD(rGuEAFWrS118W`GyOX*JO|4{OGii792<1eUW4>gE7Uw4)m^WtZc2F2O|I9D^CR zkdf#lOtow3#2ki+c61x2>~g-H3o%ibp9kemD07A$TE}MQJ+M;?cL*ITI29cW{lG1- zc+r)UVB5@Ti8s$NQs12uVAki&fn)h{)Ufq8QDuyA?{kWHM?}|0dq+g-0dtWG_*oqV zvfGehwC7}J1-Dtf7IqyWHb$WW^w}(l?EKIq(J)es+b+e3qLqd@Z{@h`jw938hu)=> zTCa@Bm<^AJS@2wq-F{1xi$;5NU-W7@)5A_HBrZ-dJX6>GXxPrFu^60aRrPUQJoG^b zPT)}IIh)uE1OrJUkd|{b$GX0-JH)q?vLwocC;3fT1vQ;<-K4i;oU6^`iQ-j@EN|)& z@rmNgXt`RRD1IO&Q=82b#Z|jpEiY;CkNS+v=857aT^5^m3y%yAF@6HOz%11LxYWG3Xjy=lnr>WbsBx)T#-&CWm#W;ximy2vCn>W~ zdE+^}H^7Bwvy_dDaJ+1;7})iXDO9nd{jTxo+JZ#*d|x`v?FzqK~wI%!_R_W!b1g(&^fya zN|#6Mz_1NH%>Mn7+{KDYkeAUM&nyIqM`Lh>-wWp`Zxzu*tKCr5B?TLCA$qUWnXIg< zHz4E^JI8J>wjPQ)nj{?SF(=Vo;)}@k!~>6?=vSlWh>By8o?zdGfNt{Zx8do>PL(8S z{D55Li6AUA{z+l=JJ)sFlXYgpq!N3Mo89QwXH5l9SoiyTFn0@Ip|MI*exONT=AfLo}; zrCzJwp{&>gNzjYznS}mX<$K|mZc`GFNe$|QRggYwzT#8N5b?O=k(F~yiK<73_O*Ks zLoq2FsqGn!@XKO6T^!o8Z=T*sLhkTFW(Obk!KG~F(f)o&ADHR10}HRN9Kb#tUaIgW zOpqV~j6%LX3WdO3=uBE&$^d_=a^E6l2bv`|I%uktGNeW6a@k>tMi@9bK|kv&kG5+g zT&~^fgcszwU*UbnaX@u?cp(oNqFE*gOR^Hr+%zh5t~pF*^rj!~gR2as!~`=McKT`Q zi%h7nA8&3!(O`t>(RhfFqU!cgMpsiM-uxJ^n8~Yyi12z;x@-U)pYllpa{J&omjKGa zF0i1tICf0cTpILx9;y3oI-u=PnmC|Y>JEuy4~%}5MbjOuu@5!m1EoWQCoGhVS_$ls zSG(?tIWCN!iY!iHtM!ttT2Z%NQUnzfSuLs-qwZE!L$Rt68@~=vjXnS@1*&2H2~o>s zRZv2N*h-)vGaN5=Pa6z2v@#dhdV>LvO>!tIbH3LbtQ=U{vkymN?d}TReGOef`f5>x zzFEVcFh8EsXeuaMBCtFLK}bB+f669))R(^}gxv%BFFs@DbE?X9yej(eiPkXD4JAb; za6*EGpL?yZTVaQqHAzXkMwQPK6)l9~8KF6sec3}tDEKapB=(zVD$q7Iei z7oZxA5N(Z^`UYAUbI%=M4uF5ZG2p@3}b?&mWt1?n%wKgkEuR6D?8;24k7beinWl3hnCj-Ax;1-pW zJee}wT9W^AZmL{WuGUSrQqXb@R<))^mRG^FNOSG!k%zhpl~OKHUQ3x?wSsCgSyijc z9R@WU`7`*u0PTxwI!Ts|d&J#yg4Hb6lq9B91>AEI>EM`Bh@e;(Wsuk8F^Cl&vs~<^ zwc;|ou1zY@vgjn8 z93S`!z&?#k(yP0D95Ag+u3J3VI02sty|PR1$M3;iG!X1>n_bvXGI~9a{F2y_IZxL7 zfdvxEcSGjKw{TCEN+|3c}&q-a<&|pAF zMW6A75siYbH)Y@usV|&ZoAOzT`9r&?)RN_b0B3fv7xdax0yzxFL;)c67ivxGMG`@d z_XM}hSUfhGd@Mb!^9#F`O(oKpLOCQR{kY3Azq4pX7~`_}silO8h?QZH@;&}kOFw*6 z)!e;4z-?wWIOLQ%=GHU0jH_Eygxw(ITQ%w)QGHDt!-JhB%0>4LS>))IO?bH1VcDGG z*@_Kg`t*`@+&bw3+7Y!=C#DTlovhGonq;-vl$|$Ql0_|;@-$;9(>I&y`DRmAwb?={ z)n-#ZMN0Q-wJo*TrU>PeT&P+gX^P=ZKVAk`NPz{#h3;B+(&~w=8g}sG#aW(Q(5zGC z!0&6}tp#pZ#Uwo2p12q@1X78-41s2*BP;Br;j%cciO9iB%F`#=p&r6qXc=OpoJ?Ti zXq_qv=vGRJZ#=pdPB|#VZz4YYNRvoqNh+yG6S70Nv~b*=lttea%2KkKl!v8EbbGci zKZlx^Imk&hLG94FK)b6GB=Kpx@QQ?6d}+&6xmK#GfXih}c$l&FX~y`-m_>Z&0tYlI zz>#l>jgH6cqvRo1)fjyxj)m)Y_b^#5bhf(ura!GI*Hba%xQp%vFiRfo0-W&RS5AT9 z7M*AZEc!K;BW@{jJa_E-FC5EJ?oE~C;uSg{RsQ)MT?1REc9C1DLql6qRdZl<6`tkE zsfFE|7dYN0o$$1$zqx^T#ia;ZQss^Jjs_d^6?BkET5_+0Fi-i4*d{s7^i{4Oa2V zp*rzsu#6uK@8by1G?18_3yx7rx?*6G)%c52&GDgqyG*bFE3~;H#yJYvYDY<>?x-?` zQX8f-B$K0wNoAuIi|LuDpn(%%3xLlKHL2=wTx8M2qBL9h5f*$fgB-)n?wH>8^VRMY z$23Vc*G7ZQVO8}vJkln_(`lNd+yQ)Rdq-jlat~qX_CoR;&0L_ z&w_);nhV!Av7PRW2E&{)6Id&FHMq&i1x}lc!R9hApYFm44&L3=){yiy`Mq;n5LdLxPB-*`i~PCQbxmg=kC27rRWI zn`gjpsWA_;a+A)Ut;sMp8prk=I=p!8!DeGebB6wJ?!dpZ_}9X}k_)g}$f=3qE(s07D4y#Zq7+G=)A z(#p`q7?F-l_0RA51qCeZ{grNy6mb)#%Ei`pvs01L8i{LY+G!e?^GD-O%%8?L2q%?5 zgVpY|8=)tz;bm9kc^TiP!`u`3DxYgi!qHoERe#c8wuwXJ&bW!RxPIlA@ zX6po3m_TOuNf#Rn>D*GSbTOlcicF& zvb-|l(vgwb*mHP>=XltD%eZSfIRy?@j{>ixN1ZAnIRoS7U^Vp6WxUOZk)f@M8I8XZ zYh7PfkyTvyjiX&#DfSDUI9KT7kf9B=+`c##pGlCXfa_iPV zOc=NUjcVSKZ4P}>TNWJ*AKLr0_$|O>b(Dv&U^TfRq)&*%mMvYxbZTjI`s*!>pLP?| zAXZ`wuCNl|M&YQtOje(46HKt#?@~vP5-iF5`9<_0%t-hbb z*AAO8xETf~B41|f>a!S|Y?*q)0J}eAzqPV1%eNP4SMn_0v#oUoSn#l3NkVgtwa$cg z8E$Q6R_HwA&1E%V*LuzIusg#2C^I>(aCCEZ2(u#EAhLb(3~eVeh-q6HnhGn4F2ZB6 zO6;pgItjC>QenMA@+O*R|B98YxBu`NJoL9Q#hb{CQy4YmfyQQd0sVCttGzf}{D zFlnD3!85z-^Pu`)Q|u8Yt|e)shP%3yY1|u~c8w0pt=Wf z$u?OvhT&Kfu-iokBUXRfP8e%Rd&G3ZLgl z)wD85a@bnP7l%VkI{Sut*Tz>c`Y&7%6ZDy&9!8&JKq|`07ldRiY7Ak*q3I3A3olqK zqn5{A_O(sg^X`DjO@M?sH*-0y(z&49$9KKjlBEPe>fC;a3R4%w2z#Q1kAu*7Qv+C+ zhSVIM3DQsm>Cil_$Wloc(os;gnnjJ$GE0@rJSnsp8Otbc7Y1U8beZi%9W2IV&tMpJ zMQ#)3(d4YLntn{MhGS+mntHsLMIk$|RSkMw4 zEqye^lq>Fs@Q{oeWd>VDA9Xb9)8y2UCYsgejvewpHgX|qmcf;Cx&FtZu+fw`>jW}` zLZhUO`9lYqSiO7Qs(HdZNmacG4K#J@N}h?(mAuWfN^f7)3MzZI`6G+hH?h3ZiYyE8 z*c#gny*R3fNi%mRlu&aez8;i$R)m>5Hw@@ui<#vby|;n!ox*p+0H zvkLMd+6jU>W5wMgJJ1GsaU0liiZM8D>|P6#H^nTgn>74Wj~;{T8oSm>qlJ#!;Lb~3 zlQ$*W+tokEn;@m};yl~!(V6CUU!m$$w>MaWlL#(bQPCMs9p}A z4=0XI-mI={oI2i0ck|KkRX#FMa1zWB0 zN(=iKH(Zjf)=cswjv%QI}0SVQl@lFWM=8F6uY12cUc zhR+&tHjv*{ykg)_+z<(@Ib;+Sh<%CfUEIJjo{j_BoCIUonRs!}f;|e1a^COI7R0>S z;?$rm2=Qq1t|TU0ezj2_L#=bpt+lk*>olA^HCM5-U>|50?U>|XXKbMUY5RuVC(R(T z58>M79-`jZA-3e2q;k}XrVbQc6mGqug%@Rjk8}`_61e~iV&sL^W?Ik0`77-po;Y++ z={v#0mH2e@K^;=Mr!vFXUkjl86AThVlqzBy-s7eHJYr*Ipc^gY4~o@pi@RY zGn92s%RKI5%MK~`7@UscP_ftGjW7MvJV7t3@MK2LhB5s0ofCh2^Nbq0VUbB#hMbRUD>UeCiEe z<&&m9z+k}Hlg^E3dZ5ojBRy{h^pb)hPVV55sc zPeVZBz=EuMHGalBRH0+pE;?B3>bh!ScNc8<6N4swV$K*RMzpiT>?mehSYbnmdtfT5 z7{g)4Br_WwVg=n2dpxus{xQfjB{B#f*NN_4uL~b=_$0cIz9%+s($LPKpznP-vY(!XwTNaLm0Nx^iH1m-Y|ML(ZtBu6}4=g(1~t>7bRV zA?culevdWsc?5;1t0vo_J;w^xDy&hO2x$G{4sR9)of9SxSf(e}Uw?hzo#=%5pGQ;k zIQ{A-20D^&s3~YB{4N$!yBvfj$|2Rug@VZZ3qOef3h)FQ-l2AX3M{ ze9y;bVQ;W&Dwte+aN5HH zG;S;&+;@obMKhr6gV}jQ@9SU&$0Z8>jY7`3{S*<-TrsXj-5bSMSuq0TprpE*?mjR- z&$gx(B|5G&+y3m1w^*?+z=<)2TZk;cs=d`}Z?Q+Uj*qDc$6D00Fh^0+IGXhLT-Z8k z*!`7I&wlLjC|_^K0hI}R(}ZIj^`SS-wi{1A0=r&~3%!IxzfcEeNEU4c9|$qA0idod zj&52>Fqf)bV>7A_bhZ-20W7Bvp@#AEbG7v)%UHV3(#pd}yO^P6A!Em?S`EAJ8UhWEuq5A-wf` z{z$Dviy|A}FoO8Vm6NI*2$NA>Cq%3`fz>WChG`C;8C%bM6{d-G1d9-LP_!idWE#$w zPz-8TI)hNV?F#BK)h=J+A?tKDR}{em*Btk;!@^9UXQX^gA+`*c9|I3&aR(~05@F>L zsaUsI{^*oGn7pBF*+Sde>>Y36auLlP4R;7-hX-77vS>C|m#MaCm?zG9d?Of*9WD;3 z$;<|DV-+^D9U9sow-&S9n@DSJCK}etnaeoX|L~q7F}Pu-!Ntk$Sw74tn&KgS*x~pZ zF>OXRy0noMBh3tPOW8QV*ud4e$vXDSYwOazX%gjr?2L9CNJI->&KE+rpqm8oK+UOD zj~;YRj~2b`PUKmOseTo);_2Yh7DCr_Hb}ey-BgDe?*z#PlYTCa8GN=<<_}v6y}8WC z_HfhL#-!p8uHn;J15VauW}wlNKGK$&mvZvLiA6_ij^59~s}K_^d2p2kGn>t(^vV#< z9OS#yND31o?mw`Z&4a>`Fe2rwo2BtVKKqF}lg~tt0jaX+=sDatEcpxANDu8M{Soy# zKF;nidKEpkh;}MH0}yv*frm4x3U|0;r=50-v8{1nR*%}cT9EHQM9`;89AxJ6i6t-A zs7zUjH4Suc+L*|lsgyTf$Joa45OJMB?R@o~OAcYOnCX@&@5^H2C$8`?HfSNEOFEs6 zWw?UF)2M?Kk=+_+HQBb!%^{tk*+S@-*e!4RM%OcLq{xIxV}>Si-DU+Y-4$r!?tsh= zrfhQ^^$@;$g{d`Qq^>HD@T6)&BA%^!J;^Q9C4*6}7;UwOtxc@ls5Urx5|fLk^cmxc z=QAwhiC0t`z8baO7m|b09k_O;(Q5-()ZsZyv#Hu_1%^vHa)VLt&Dl8)n`VeKct^+T zd&VbzU|Hbm1}YIg74`{@8+5G>?g^BetVc3hcq*q|mQwg=nOdzBW!&%kt-qW23QmH? z(muE_*=a#D-#C;+9_Y(fxDF%61$mcXCG;^>A)8`WwE1Ia_K0@nTTr-JHjzt3xDrJV zyoA~Ev&x^~LO&rJ75B=*HkT(a9bbMSV|Oq5BToO+_?)ooEsh@c0N^7WxW33<5}Ho= z^F?%JWJmLI?wrxDLcHpwkxrledVKF1b0Oc6=JL=EKCCPF(QkAGIC$g-Sdqp-T%Q`_ z`Zh+XZ#&#dY49c!UnfA@vbD5Kqe?uDY&UT4g>gb(R|?h&8ws>W=iyyhk{f&gjnM;s zaJtA)Qunr(qaJDbaLrGX6n)Fc($aA_7x(6}2*#gV4$j24yTU~q_D(fmePYFj z17aN;vtT`Oos&aej5NI;fXgSFa0mkveN@O0IS0A-(IkdXjKRr|>r-Tc25&80TTx^< z=36<1`ev7$v_&TQMX!0u&W~H2OC{~kS5(QI=Ne!h z9|6OPgAFOy2AG7&u(E!NN%oB~rOg^`#IVbSH;X2cP(#tV6%47%JUgM~H|*hJtW z1Ksz6>Atpu|DC}$lRmpcH?2Ye=oYEW&5b_%D`Q;8!tN+;{$uKF&tZJ*lpAwmU}+{{ zRH3(~EE);Q!Q2BW?r`*RJr#SqRX7llV_LAr>zJnXdpb?nXms{ZUT(ey%0nO9*A1MP z4$qrO@(}35+XJ6QrDkF+oN^LYY z?PR^?_JuouJPbVEH{cbMeWq+_wQJ#Bd-xO9@f$#V?nR4@cRG_N%>2d}unoR(&#g~y zjo=zP{!uG1ETpvW@$VR=F9bExM=XUpcq)9XO_;&4bw;7oBaZdKo#w@xzV;qa{$faY z`9r$9*zMZ)b+aXQxh%CdA*7FP6U@ycQ%@yh{%x5|M2-V4jm)8vX6daMpHGY(_a2IW z)kIoB>l>NI^iJ=Q;J~c((uurmf_0W}7>PGgM`87)689`ujThouB$33qTlSU+H+py# zM5|8<8)i$6TlO8&Mdb{-k-Tkj6%CNfy6xY;7@kBKdb-ouF zzT7xIKWCEeX_Qy`yY=T!AaO~%(fA=MCjLlAcujDw#8Zs<1UU2*IWGl=N)S2!1DvZ8 z&O5=m+BiNxXMuahX&2yM`aA8ukGm|S-Dvz3Q1nMSlAqHMEa54pbrCp}-^jTVod3ht zdB8_iZGC$}P(#z$AWDlgBZ@{42nran5U~Yo?D1lW3K9zvy(&>rqf%l)VkL@b6idKD zK*3x^iGUhJFoH_J78NyuXt3b-tg~mYv)Awa*6+p3`|P#;&rD`!&zUnbp}>$+A%%uq z36WGc6?Nd{_^IxfVy0*XEyScrXl9C?x*Ms zO2W(278+lku}8H*?A(dOW~QX1$Fc5QkV^i)`0^aiUvDzx6v)j=4vrr>iFVM`l;Zx0 z#0hc}n;IvPRMZpw?NLY-f0G4ge}%tRD+#ZKJRVb1I`Uts&z4M^?q?E-_maud<8pq3 z)bRhs$?4qTYYpiGxy6tpA$5kF3YnxNygVJCsVRH$U#XU_6Aj+YZOW9C^tj9OD5ReM zFTOl4Ll_Cjdyqy$K8G|J@*CuPCE?}S6&nA1YWnT?+`IXSCvOYsahGQZq*-(LOX5sO ziy>oWipO(&nI}PhFg=e!epC`(p537FBB5z70wlO6oJFtLkuZr~8%PhBVYKlC{q~_&UT@g>6 zmzMz?cB|YvkUkoWzyR6*`DL3R{$gPGff>bC8FLMS7sVVzO5Y?;fF8=C& z&TE*Gk{)}R_kqOEu=W3~DUGLgm+hRA9+#8{xlQe|b}6LNkXs>DhCB|bRuW!jc^svt z$lfLO!%Opj_a=4{rlh3DUS@gzjrX6u7hiU8JheVKB|Yvkx8bRyM(yB4H%P4^gCMsX zaweosNqCvNME0%{L}i|O^|9WRNL0wPDKv3(vS(~y;rEG3~mGqTGgNa~#_)tkJDpD0sOnfzgx%H#d-_8K-jql@$&{4zFifq0DI<^-oBN z_Jo(Gr}XISl(vHw@qnW-s?PHCOG%Go$3aRpN7lwe$_$wVIogm}ka8uVy%!0w{qwTM z>E4t`EMQ7XdKjiQK`Jyy$X}33L%MLo9%IN6kSZmiy*CN*ZE^Q&H@@LbiNuM?JBai! zOqD>YHAl#UkYf#b6;fkJ1Ef|-XzxQpYKlA~NUhqk%Q4=>PQ#Rx^e{~A!(m08<_H-M zInIy^AoYga2x(9f+V>|Re!bK8(TT@EW&&?*KC(X@3_Qy&P4kJZom2a5NJ|x>*o_8QQhI|A0Q!gQ-iGLxv+7n*pgCe`j z=DGRw;-9>U$7k~8ru5j$+%KAvXK<;f4*q>hJT){qB|R>;81k37Jkue0dU+&c79`)0 z1&{(I;blIU{!}@!64m@&&VSFFc$6?DB|Y{s9|DPw{ZdnJ;Q{J1nvzq}<5*V?LJQRn zP8ahuQ1+!#+)Ca0vw z<$ee$F_&jE<=kZ5?<#1kzI}wrM7*y>^E;pBnBs+{l14u|sNnXjs;(tCr%9}X2dZ-NUi3`+CoU3A~q@>5OCPhaq`}R73I&`2ey;FHdMc zJhIDkjnp3_rjPKZMB+E5q@>5$58x$Kfk_?#k@K*?WY4*fLen!AQluobAHh`ox~bpF z9Xz<5DUq1Ml$7*1wgghFIkNT%q{NWTkWbC!*_jt!rP>qPhmsJV|0#KUV}mzw-;tMV zl=L`zKBP=@WUUxdZpht`3PWZ?DwTxxVI;&yO=GUE;Q-BF_Zp_8q{p!zAyt|qYdav- zhIHgbUX39KK^|5T+J}=6@3ceL9vAF&$IFXFN_w2V1oDXH$l61YT0>rj)EV+Fq+UsA zKazy_C;!a**$;YCBC(DsDd}!5kjG8(MUXU2mi`+ca;~4Y`5DeEF(oBE&fW;g z)ErrB+k@TDke-ky%q2VulC3?V{b&;6=eQ%bZU5PuI2+HDl=QTU{x%7cqd9_RKxP@& z8<1Sn^93YNNoYTYg!mCRr0xEvdlN@GOi4*ktLSf8J=sMyN6;`xfgzVc3JocR6e$Vq z$C3~~!=C!cx@WwJb3{x@NsqIyf)s0xtZju{Zb3A4x*|dgt@{TR-w9_6(+^q{rE}K`J#z z*4p)E_cNp~q}q@XkSmph_B;~e-DY|3w5{HhNSw!%l=L|J6v$Z3k+l~gHHIvO)Ee>y zq)tg_=cRaX-OHC8JI7#G9Cq(;<}fIQtmL0h%LgH$!p^nE}Z)WG*C6NoYTr zg!u8E^6aczyeX0Rh$$)QarS>8`I;kZ9XVxEU`RhmUqkXBg-SyEDI~LW(p;*5*Qr4S5GrV#wE!1C@mKd=lcH{7uvDJKmdEkdrZ#^f>zfNU7$? z+9*hwA!8v28FDM6TuEpjO+tL#KbrOVRBz%KiYY1SarPCEewrg|8z2>i`~j&nWY+`P z50!-WQ%Q)Q-=Ey_$2M=`8Zad#Jq*`-itprkI$bFE54S5Dqt0c6aMnZhP<;7_i zZt*70Ix;0CJ0S{kRF>I}(*)EklmX;2c{c{<15M}nxmR{y-jn>e~)N=ka1 z{a#3;=E&M?NRuJ|gESlRDWpY7Xg`C5)Rg45lGt$7UVnHK8B9q@kF)pYRN1eZBWq_v z61#+Z-2_OQAyXmgN<#aY49CZ`6<4%g=S^HMNv5R7**}A1XpXG?49PTP7hVN#F_*9_ zBujfjJ1<$WCtofm7EimImk!RvD=4ON7gz+elzy|5c$kR{7iHVq(Dh%KbwU3Id0Mi*9Z5y zvzd~T9%r8nDbyTUdje8q$g7ZILsmkz=_L&9=a3LT$IaNkNzRZ-A^f-G4ryGCQ z99bIxDKV}SA*F^~04Y-v+Rr5+-f2_LZ2P!3B@)*$B_%!1{w$rIKo-iJy)$9Md3_M;(HniH)-stvgYQe(&zNUf64em)VY zDaix(#CQ8#dyhBqZWmKh(&Ox#AqzD});jcOuQQ|KJ0WkFo&}IJ?FsFL49C08j{MC>cvB+rp(Im<{BibHhp}gBj;wWoWEe64 zl4;1vkT>=6g!YR_i0|`lwzbalCSLt8B_%!1{x~GdB+r8^)@12k1<5u&&5#@=q5VJf z$G7{iiH8REHUlLsk&qr|9|FnM99cURl4r=(kbFa?L*%nxZublAV@QZ!!`?o5Gr*a6 zBrzo=J&vt|6qw|HA#Z82bZ2r>xzO|sffOkT?HAJ@pDj$h*BspLr!plaJ92bef0vRT$1(=9*J+Nd9SXVHkP{#khFlJ* zR1(@RB_V!}TmF3AOWu@7+|QJh^f>zxNR{TuS_7ookY6F!7_uuTxoeb!_RC0!AMYEd zl|JT8ylP=eN_w3AEJ&^9$l6tqYYmwMsWapeNWGHKUPMCt>Gbu7e_85H?6gctNsqIC z25Hb7S^FJwogwL*P;WHkKuD94(0(}y@x88Q+aE7@6KBepl9C>0zYfx@IkHv`X)$Cj zWP%~fC8y2*?-6$e3-Rs#>mSv}dQ&3ttxQqUwYB(@iXimvu=Ien|PcvB_%!1em`WQalHu1)MV*i2FWsHJtSL6Xdg>|e75k-)hAE) zCT>%vq@>5$yR#eQXpXE6hU6M@DkRU4%OUwnLi;!p;-CD4zse8rCSIE}B_%!1{v4!0 zb7XBPq|lHC$Ph!eLW-1x_Nz#UfAY^h`pyJz;{DvAlFy@xKh8cJQmi?$Rsbn6WGtlA zkXs>#D+%r6Nr>N*n!E5X9zo8;YgneFq{p#UkTT7YweKM1hP2|Xj0!{cgdCwHv=@^Q z+uxf1(;{!;^&(SJ(&OxxLMk;!)+Ruz3@L|H8}cG#sFKirH3_LHnfzC(?(Zkg^`=DP zU8ba@$JzgZ)M$>Z?Zc7SFhdT7)EaU!q)tg_zlMbP>_KYAQLDU(V_Bx8q{rE(Lh3a~ z)?R=#81f!uxFH)LjY>lMwIsyHv=_I#?rm@4(0Un``o-!o};ANYcnBPhRlQPV@N$DTS;iYo`m>W=9jzP=;cj(OModU z>2daMNAdYz&5^akAvuPe3CT5NA|y{qXrD+zd~DOM@t3o`iAOe5Qqtq>3n2NLBWn$i z0z}NrWG)LAZK#C2Kcd<(hnGNZp zB(&c^LTXA638Fq6w;TU$75$w(oGB^kacn!JRC8o4{b+thhV+M&8*&DutCG-uBMI>% zZtklu+~-Z)*O`)%9%p|J(oJ(@?OjNPAx)42dZuAsLz@Yn71I##IB!G(8_dvXq4OQWD~y{7%`Af8k9W(=sJh${%On zdnBLpFs{QO*_tffCqi-z84Jl(654O2KYoUtJoJx)y@}7oGbJTG&RzqNZ+Em-QV)^u zjl|>^NWSTjw-XDLg!bFWiFew|d;G)GsWY)ZF(oBEj-3c8)Ers646@eP?|~GVp2r}? zN<#bXB*c%n%EqI(UwQjHrlh3Du`eJcnj>r5A*F`2J)Ygqklv6_^%92m$t1*Q4?cJ| z^A&I6eRrm$q{rE>f|Q%&Qb>g%k3uR9nGdN_658(|IW5$ zH$$p5N7i;4#m;6(N63?g^oP_c3GH{15Wkj5&8y>z`k(yqOi4+PW7k0HG)LC%hCF4+ zTu8kkOCb$PLi=4L#OJ7g8guoP-o(9$DJki3_S6&DGc`xnIzeU|av-G1kfR~ZN1iK6;@*TjZF;_hq-jrRznkIIl!GLQ z`u(20>%57}E6J4fID79C*)ugq){cf`7;*t*jfx!K$aW^)(_>0XdK|kH zlB+qgHVKkv$U~5PL*_!B)yo{(r;rfa6XUOX-5$XF^IeN7m*+N)1^BDKq3d$mL2x`!o__`>+W^ zp7AF5DUzQ^NRP800l7kRWGx?3Zpamo3PYwtDwTxx=_JJVlBI(-coX+8rlh3D*}sHT zX^yP@1-a6YJ@VNP4LJx>qa?JKlMp}0-P3gKuinI?i76@RarSE=wVESqQz2swc^Oh? z$TCR1lF-fpH1=*1L`}~BlLxmm@d}YCDd}-6b2NLV=E&O7kVZq!hKw`hT1b_vvnEVQNsqJN2FcYNS$iCkXUIE{ zLk;-~lCLDR^U?)-h6GW4yWE}SO`JJlN=ka1z3=Jlb($kX+kV;6oAqyZCN<#a?B*bTp`adx2S#RPyBTPw2kF%$r$)2e> zvX%|0GUN=%KtryCR4WPXkB|`G=eM5t=M-<^NSY}r>2daXkQ&XAwY891LwKh8q@8uqQ59_Z^$JSWQ( zB|XkQ6Cz)zk9W2jhaA>M7ay->K(oA?=Xd@ChA&OQLLi{{8$KBU5s zaga(wCPS)}g!ZRNh0zZ_DpIkI*;q`{D0Z+8KEo#x0|7NpsbTu6%{V<3x^gm#|Nuya?7s`lTv_wXjpRWT(cJ5zSrHdm%PvGO#Dut3uTsj41XNUg=A=step*!-}?~n zv{yskH1^veS=tlYpCci*=RVx+Qg7n+W=cwWoc$9>w&uv%kC4U2^$#S+^z2%gNaQLB z?az}CpP#>JMfc_2#8DnoQqtq>7Z$Q-YL2W;ge)=kN=UxxSpX?e658jI5brkMp78b< zZ{pa7DJki3_MI+b&(s`Q>jEh@y)Hnj>p9kWxeHA!UaA1SwY%+Fv9gekHX&yH#+n+x0(^&o?vp5$FM-r)j;u|F)En|B0-}PelOwEzC0gxs`PJ=WXawX&@C82#D3GqJv$&G6Uc@wV`n39qnXMYpY zqB*j*UV75Q-DV5qX4BL5681yw3GMS4j_nhk8Pw66_&qXANlA~hpANajB#(!rYqE6T z1<5evSxBam(EbYj@jk!w@e+0_XJQXyN=kYh`vH=rIkJ|<-Z;rz9@#CkP0t`mj*`&+ zDhcuPdyniRg8Td#Oi4+Pv)=*9)f`!S5|U@gyO4ZCHbM%Ng!b1+i0^eh){dz5CSE}^ zB_%!1e&A*7b($k5$S3*iON7lZB zlo}!*Njue$&X6)Cp?v`f@ouwZXkHI*;uRZHQqtq>mqJd{99g>oQf|mhNQEIULMoMn z_8Jo6*KzeTZ~4QUcxQwuDd}Kgj8ZXkCQ1%dYoO}GfLAOS-S_4Zpds%h9U1kGL?k( z#U#Y{`LiB=i>Fh6-5Z&bk{-u)CFwC%>F2sapOx)&eQk99i4rDt13Z20+>y zQUEDc659VqLj03ow{7H8-o)qXn39qnXMYURL33nnA*9TZk0IrTY=cxN3GHu_5I^28 z{YieSuru+As_~M~_xt(d*l0+l=E&OhkSasUA=QS=f$XXzw7)|_d`!Db>Ie6E6Yq#I zB_%!1z5`ODIkMKhm=|`2pqQ6F*~_qNK;!e}b$t$?dOU_tRwQJ_wR-$Z?PiCE;~n zMt^*Me#VEdwe=>xrNfkz^f>zikoCs?3M5mLrF%6b%aC6n*-Aot9sTjW?!Dq;hI6XNYkD4lz2=SkmFwG;iYbbrU3w-$}_IXP4i>QmQ$!b}nRtxjg@cl$oA6ka8uV zeI*I;bsscl3C~c@#O=+Ll=L{Z9a5n=vexZ-c0WUohg2Cd9#X9&w0}TCywiSOA-~zc z+izt`N_rftfz)V@tbGZoHDm{5o+0~A0SiMH)Iv0KuKu-g#P%QkvUIXJI|XEiEo&ak{)N@?Z51qnj>pj zkRn5JA;pHA1}RYz+SiZ}Kf{j99q^Yo@r?zhq@>5$pM{iaj;yVKlo_%SQf|mUkQx5~NB=X#bRi)Revw zM0I|7BgdcK{w`Be(&N~lkZR45wY_g<_cLT5q}Gs=Apcbo+8aoSpJBKB^lxz1=n|%+ zq{rFshtz3~ti1`TH)J*BCPTi5G$;w}pOFwB*LBZNKi8XhG;!uoN_w1q2&7SSWUTo0Ww2btJ^cw2Sr`{HHf@c92dZ3$Ss;9YrjBR3~4h7yjOVN$bzIP z3GM4?jjwyJ`m_hViQnlXIh6D`dkJKcaoq<=*JSB_1(IRN3P`4s(Ed67@o(E`m2&o} z-oz)Jn39qnXYXFhBV2Q2?NCUzA!kBz3>gc_RTA32AR&GocWv?7;MK$wrlh3D*%y@Z zT|~{1wR%XNAzL8%hV;0V`-hUy{v`?VYuN1fXYcAwe5;HpDd}V5m+XL=JyR7^=pkF%%T#-6D;vepSwYRDmw0}UAoDN_>K z8%c@C)M}2n zK8Ms9(gLYh61u*MTp2P(^*O0&u+L>XnCz(ZIM*?d2F;Px|3DfInFMK461u*oKYmy7 zy3@wj`dmIW!jzQsIM-@Ov*yU!kB}Ba+S~!&+wWST>l+s0-%FF#JdX1@E|>EOGDS&` zW2ZyXG)LC1hNK&ECnQ5j==zra)D&LaM%C~52A(y%>tUv(q{p#^kW9^ywN;RQ=6Y>{ zWSO2nAlXVn`*$S7Kh?Y$pLg&kel&MVKIiHA5W z#zKlTN7n9u6dUpgq(n*R`houVlSN;**|f&zaul3&Nsn`FhLmcKxKhg4wG8P4DOVD@ zevDlE%NW%>dh2GN%Wnf@N=ka1>n2Er=E&N8kV-@5LaLO6E~2?!`^p%#{oG4`_qn_h zOS+`Txl-J51X z(x4=C{Y-y+hGFCb`<~%*IigOwq{q2-KpHhiTpjOWk1}Kcq*+Pm`XzF4029@)5&O;d zxqS1NDJki3t_hG9&5^Y!($mrJQ9@=z(v*a*W>(|-{Fj$~_n6P+r5ONsuhfk+m6+Y(t)h5O zYas=iBWrg-3JrN2Qlunw{YHOkNsGo)B^WFloMJCY%LKuVQ_ zu5I+kuX9)Z^!gm1%kdghQqtpGr$fp#N7gQdlp8V`QlTVt{Z4;;dySoX^je?G=X#Sa z>2a==kV?%F*O!ngL;i$RD+yhkEWow9j8Q{A+5Kss%k4hRQR#86A&?r)k=1-its&Py z>Xd}87W(7YjQjnO^N7#or=E04k8`~Usn;BFeF|wX-23HhlWlBA?4Eex{_P$GM&s(ka}LmO|1D zSqDj161x6kI6gXU7`J+p&*dm5>5?Aj+P9n?Nprx710b1(p5R$7Tbp1nreBT&&L+QIdmwQvvB|Xly4U(rh;@agt z?u&-(2Psezx^_e^f4xq);G)lbE|-@nDd};pF_1#dk+mBjMTSg)6e|f`|I#0SzUAyT zegE*ed}cT4k{;*!7*e7+;`$y^YRC>qnUc_zNDRm?{`#s96JnB zt~s)L5~RYAOCgm?LRU)U>YfbkSk*e$=khxQk}m0SuDOsZ&5@y{kZMELKx&kPu2zw& zbJBHP+OkzXmvatDm-IMS*9X{@Jr}mvl*wV_P82nj;f?Kgf<`$YBuq zhXq^nKlWdE*(q{yXcX0FFZBqn*Re81Nsn_~14+{yS-S_4Zpbr`3?Hrw)v?E+*ZEvN6`XWQk8`bqc9TtaIiB|Xmd4x~|YWUU_3WXNVnvy#xY zo4H0EXHGkhxPk{-v_Kyo!lT;D?S3`u>Iy+ujr+B0%-6GU~y zmh)frxtw2QN=ka1>r6<2=E&N$kU~QyLyDAyuDv3czaLh-@-zoB{(3!|bV-k6Yazv& zBd$LnC5E)&6?dtU(6x8u>LFv)Nxl9o^tqfTVM-hExX=vkk94ySJEXt&h;LoQgdWt9i++-`BGrDlF-#Da{1@V`6s7xy4U5h&od<@ zJ&uin)M$>Z6+>zbnF6U(61p;sYwM(pKYcF8>PeUMIM*^rz2=B(9i+jKA0drOLf1Z# zD^td(%0~H(4gPxV@r0w&le}J#Ce4x63n0yg+z4q=61w({T>gIe-PQ74Ht(uTx}?Xk zkA&>&_aAZn1W7YwuUYIZN3jscEg zN=ka1tGJRKNpocFE=ay13n2wcLRYuQg6_Rua0plM{am?mye!?&ova!KVCM zimK1$yKVHj9AhV4(&Jp8LK-wjMp__^hID+Iy+ujr>J_;6*$bTStNdBBwL#}{SDG6N%MXvo^XkzZ7w!w2{dD104&h;*&T61J*1Ej`~e<8I>LRY`Y zoqt4lW!f2n%xm>2Cq{q3=gtTamtX(fXUHpzD zIo z?T~yWp=&_o@~^*o?c4OC&*e4w3zEinRn;{dQlL4qb|$3IknxZrC86uE$mNd@=l5B0 zO65?9Iy5pavi0l$GHYW$}~sT z3Lxc%TnnjC61oOOE`L89^=-cgd@i4nPP(MWxn74Xd}8oXF+(sPtP>Uh%nn@{uVi>2a=?AoZFf zYfB*whOC7&DhXXfB3CaNqn_M!!3v+tPLp&=k8}0rS~qEqOdJVmHsl;gi;~cFc;xc8 z*Y;UMZ}7Q%o02Ih>2a=yg>(&fqNXFMfolGJn0+C0)|v*sdHEmuQZR^njEa zk_#zQ61s9DS7v15QwH~}yWZ#WFGnyXB|XmdD5P9-WNitg!jSclN+qG|sL17ihGWk9 zD$nQg4cVkidYr2lkMt_d5!bPhYD3O})F=sEBO;gIdkga4TIq9nerHNbdYtQ7NUi3` z+Hy#pA>Tskm4vRNBi8{kMip&px7p{i&%f%Z^f=cMkOs|>)w3auhTH^cQWCn3iCjHh zXrkcD*Vp@8&d(=Z(&JpqAkCU1L*GJL3`uzn%t8DAef@Q8b3`mBO@Om8=x%_>;U6)NoK9}!aBwfbA zZ%DS1&^6Myj=y*6BA?3+!IYHrIM+>(9LKP)X=I-dwLv7u~Vl=kh&!rlh3Dx$cG(X^yNt3n@0F z7E+=lbd55u-%jaP>~pzyCtcFxTJ2F~WEiAeN$5Hua_uE!)P|dujPtpC zrh+Lc>2a>RAQhS;YqKDghAe?pDG6OCMy?DQqn_C@ufgYXE|)1O>2a>M3)zu0N7fF4 z)EII+q*h7jI>}tGZe6xa^0|EWi76@RajyFzb($k9_Kn4 zlB+qgdIcoUkb5BcNFr2S&{7A2wU z^vKoOsS@kjl?MBKCR0+<<6NgfiZw^p#zIOAxeHRNBy^n-xw^<0_4FB2?(n%h0+KH2 zajs7wWtt-sTOj3zbXdaPq9k;k8M*eAG3tj|$My5MoQGmcN_w2@JV>SH$eR3Xq*aE@ zfK)39U1vqEt};fwFn>y0pUZDpOS+`TxxR$dXpT(mfYchY?_2CGNUbNK`lQ&Q67Tz}NEBV~rJJ^qK>ki#KaN1h@H?T~lakupQq36N4liXdf5LRVqr^2avcOz-`J&t>mnN=ka1>rF^`X6X79 zQenuykV++?>!QfD4~bHJkLbU%&*kZs=V&SEajtwwRc7eA3Q}#z3`mWV(Dk3l5?Aj`W{lNISH!GyX;7Y><6h=61v7jt{yT*t$OaGVDBBll$7*1*F;D| zW_Z0Ggftpb4QWymx-O1fJxP@6)_1QXeJ2Ql+ea@v@jjo+?_Wr| zq{q2-Kr%H)Ts@buBN>th$yO4&E+Z%2qh9{#q>Vn8`#Mun(&JpyAUT>NYp+6b4Os!n zQxdw0$ccZ$!n_my->k8^dbV@J{)arK837&01Cs3decndA+JMnl!UHp z%=J3(gA*_Dxx9CrbV-kM{RPR@9C7XT0Xvc*2SDC;41%Wu~O0$GNsaiZw^pcKeVW$&egKsglq& zA#!EQ7`5ZTgLsyAxx5x)N=kYhyBAWXIkHv_DL14JQlTVtU2m?}>Xv6yeJpVAhm|9htw$v zT_urgPZ^^MA1^t}=W;BXbV-kM_2!jDz2?ZoF^~pB&V@8830*ftF8^9@pWD|y;&b`5 z6jM^t<6O@}nlwk&mOz>f`3%ycBy`;vxjM-hb>i-a@p9JXa!*ORq{p#-t7zh&t2O`Q z$Qh6{L#~6QD+yiyja>dX>hjP3JjAE)T~|q_q{k&Mgk)%rtbGB=G-L}TOG)UuDRTMO zdZQ;E`kBw=w-bCUX}oW#t`U%I&5^b9AUTFifaEF(T{lNAe;(k=uU5{ET{Dv|>2cR< zB_vOC#I*sEZ^-YE0wtmAmdNGLrQ|$ReTC2EH%hLSG=5`?x^f|fnj>pxLy8O;2Psw( zx+X=gelkX_fBpPQm#3&b|s|3kg1SLC86uq$mM^A!`g4Vz~}OAbJ8U}&b0(zubV!{c^C0y~Lf7rawY^pGpFWq@4oR2v zI9IE+>`0m;uAY!aLym(qDG6PZBUieNQ8Pzx9PM)xiHn(%k{;)p0%_J9S$i7NV#qR? z>gD&A&~-=T>L_E>&PA2y`&_=~B2$#~IM?o znj;h0kX%Dfgybm+U1gEW{|tN9?Yz+Ea=n<6k{;)J0FtjcvbGpfV8|Lsp_0&bcjWTt zmhUJXxWMOfjyma*9_Q-C&RnE9;u;1iHe@uUL`mqnCvvruF>1z>nOQ!U*9=TaNsn_) zhm>lLtUV7YGvqx;xsuRzZ{+GEW7Of2a=I*RdmMj!a}hDh)XXQl%tx zO^IB4$rv?g%O%0F=tWFPNsn_)g;Z;ftW`m340#t)t0Z(yHP`F5Z3VaaT=s*cOL~&m zYdt%X=7_5gq~4GbkOn28Yg**mTgIq`BOl@!+~smEk0~kXacl~tQFCOi3esfA{~*mu zLf7=jl_6tP>F1x`?{j$%G3k;X=W6>oJCf$eL?1|k*N3h7AJ=mnBuz=^DvwGCi;a#80F;dbcJHuxHRZNFy82xH6#}NDq{q1?Ly9#= z)@DIU40#<=sw8yHh+LgzjB0z(^8I`+&oD`s^f=e<8`zOFM<)6~$_+UMQlTVtJrue8 zeg4?R8who|{3Mu?k{-t@AeEXUYt@h{LzY9Tm4vRDk!uebqsASzdLN&gNPLxaNsn`N zXkd%b&98pU^ts$#UrQSMkh%s#N;F5-PKA^jG8R&%By?3q zE`Oh2+x01qXWVt*bIVDW^ftQf#4}qUB;+U1D^QZ=knRYq)U37E9F~uB+ZeD?vOe|MnmeA zgs$1we^rjL;i#`DG6OqN3K0(jJoKpIY0YczWe>1 zqtfGCLm|zYBden!Erwh!Q~Ue9C3MY+T>d_P|FW}B@VPuk$`mC%&b1Vhra7|K3`sX6 zy@|a=N$7eeaXpdA?vuN_rd{1Ig4JS(^mOGURzkwvy2GY~=E(&Jp;Lvl1nTy4HjBytVu4arjyx~k0e8ve~)!9G8lDJki3uDc-lnj>pZ zK?)3c9a5+ybUhcj{C)o4eb37ExqOx;>5?AjI^YL(B+U`mrI2Dn?t+vk30==eE`Q9n zx$o^i`CMM(GbJTG&h;^*RC8o)mmk@Y4CxCgR}#ABMlOF0FlyPcSNU9iT1-hvk8|At zsn8r*n+>TnvMS*ohd2l zajub&M$M76F_0!h?u0Ze30*HoF26^Ox%}_3iRYxwrZ!CSW_lrK4BLb$Rq{q1~grsYZtlb95FytwSoK0xWs{KCfyvXJ6^K(CY z=2f4|@BB==K4=KR&lvJl9Ddz zaqMqMndZpI9>3xu8d0y?(w<&Zp@@hdYtPINR8%*D}4()k|DhzbxJ~4jd6XwbTVoFXE=%}Dd}-+ z0;FDZWNjLx!I0-6jY>k-!pOCUj8W&*KXIPV<$GjINlA}${S0Z+99e6>l^w~DK9CkA zp=(j(^2gX;|2=G}&*k%nOi4+PbBz~rfZr2j?QTe#A+JKxm4vQ0B3Gu2Q42?n+U|4t zHgnP?J% zzsTj!ecklR3spXs^K40%^f=eQkP4H$&mZhsh8zs3QWE|Q-;P}VzOnYR6Tb7g+`>#r zNsn_)g;Z;fti1%OF{BRiq>|9}PUPYwR8({RJR~>c@n0iq{q2RAhR_`*6xMW8&U~rP!hV{ja;2%jM~3p)J&ht z-jsAnk8^zwY1AB2a=$AkCU1Yj;BC z81gWrMM>yd7P&gg7}a&}HEVn>|E@>UB|Xly5%P@Y$i#2b)7L+mgzWk!yRnkcRTsH- zl_u)%EjI<{9QraPB|Xk{3M5@~WbF#bv&MciBtv^b*ZanGZvwSYs;4ep|$GMJ$~ zIM;x`*-bP@T%#ca47nIms3dfK5V`#QaLt;hj`g|h=uAmTk8?c(DbgHSTLL-EkX4Xk zC86s>!ZlkS;nX}dwsvs=kom> zrlh3Dxn@BIX^yPThm;wz0#dFdbk#?$ePxW=bi=>5`CL9%nRH2yb9LLnbBgB3L=L3V zkP{$-m4vQUk;^|XkAE#KxNls*l$7*1*FBIb&5^aoA=QSw0jW_Ex;~Cve(#;VP5wnu zm&<1=k}m0S>>o(2=7_7qzkC~lF5WlBnVoNFAUUUOva z7Rd94+z)9`61qN#Tp2P({eH)IUd{RIH7Dtk9>>-|8Z}2IzJW9uvJEmS%Y7bqXMXnAqMrD8f?F668 zXZ4wqk{;*UsZ~lM+az~{#>h+gz^0|DMm?${C&Rny7zf1bGf`0O1h-Su`Q4q%@Nmb zJEtUS4atJkDG6PhB9}i8u>5?Aj+I5$d#B$A%i31>wh8zoNQWCnpj$Hnjt=}cPUf^^2t|L=Y(&JqB zK$uE{F8B4MOM0BEU0O4q$vqq z-$pKf%y#QjGnV^YzFQ$Vl=L{)G{^_W^(-V^lcoEAkPIcE>$}L+MVhGQ()FkMT<#M| zm-IMS$2KX64~=UeBvX?m<8(-tlF-!@x%_K~P8F92kFR2;q@>5W9))~lT#F#tnk?O) zLUNRZuJ0q4zg{yp9&x?TqukUT@qhU6;=T|Y!F|Gd26=5z1y zxxDAgl$7*1*KEjW&5^YgkOD(~ffOnUT|Y)Hf4!bLc0Fe_T`qfgJLi%f$Bu%WsyX7i z6jEf!BuKH6(6u>o`Pa)QKh!sPu6&d!Dd};pT1biJ$l4c>(+v3?QmQ0${S>+UK7Zt_ zUuXGTjt|>Am-IN-C`g&+i0d*)xgnDwrz;6vKSwTq4Del-^MCTWye3Gxq{q3|LMk*z zT)#mo4cWazO5zM9q3f5(HM`{_zZF|WVI%XeH0{3dqUT?$mO3a54~!3H=oOU0g_Bfk8{n0q-&0> zy$bonxW0m9Xiw<+J#uBr7`1Y*1#DNz+a~dM(j`5P9kzQ)VvR{Y4U(zJl5rIzOG)VZ zBXars#2a^pZ}b&1bq@7=?> zq{q1iLq0Xh=RtBcS?rS_c}hap_Q=J7T2!T_wfFm6KH;8pNsn{A2g%nQ8TlMiU`Xpd zc}`Ihy8et@e&5JWtsn1mIlIY}l=L{)(U7w>N7gQb6d7_0q*zJl`YUqz*F-Na>&j2a z<#N4}F6nXXZAgjci0enlIfm@K7tbk5Lf7As%RhgOx$))TyiI4Oq@>5Wav|qxj;vh( zDKq3cNV$^G^-tvT*XxCz_^f=dINQLHzYc=FNLs}q}N;LAU~d*F>2a>%kSfiQwX-4T8!{16tt52)8@c@BYtFelCi+}n?<8H)<6Mg%HJT%? z4qg{O^AqmsJ$JpR!9wcfF*?xw0X3nj@~`AQu|)A4t6+H$WN;nGVTk zTK4=@iAl_XG@71ekS0TZf_!hto}JkF4H*b&G2}!@g0lee`GjjAX@=Yd`N2%R2uU|R zt06y{o}VEZrl)lVyQm?3Ae+t9k&rCYa|R^akP=9aA=4p0nVi=kxu)k+$j_$dcSxS; zX}b?Uc|-a^3Je(z`Nia%11U5;*F%a7nGPv7bkp-DB*Tz(kW52bAU~R%-MaEfF+B%BHk+Q~Alatp97v8K6CgjCsk~utB_JdRzq$z zWE-T+klniTNHOFPNQEJzAeDxk54p{d5=fOH_d{+s3duH8Lm@eajE3YI zG6wRu$(aPnGd&MO@(rnm6c|zm`N!mJgcO>dU3#V@c9@=?kRsDF5>jl)c*wtIY8s@( z^vs5o8nP5pX2_S2azp-tR2Z^vFCHm|41nBi$Vf<)As0aIG2~`QwIPo{Y7BV|a<3sD zLTU|Zg47w(zBi8xL$V-K49SH|HRJ+FgCV7mMnfKjG#N4BzQkQzW1ICNi$>|B;Am^AQ^@{3E9VxI!LA=8zEVS`~}(9kRJQ5fI!KEl>md&r zvK^A>A3jprAIKxckRFhkW@;oP-Sk`t$uOh@l4;0vNR}ZlLb45cAF_`jUqNyVNj-?i zmm%FDxrPjeql33mwWfSCe)3XDTW_mKRd88O}FeJl}JV>S?7eN-7*%#gDo<%V1f8DvN~q{5IYNTnhFgA6w06G)XIKSQbw*<}Ea9Ygv+Y7NPS zEHvaiNSz@QAoYek09j^o*{LRd_y)sh8VH~Qea4@K|C%D$%YgeG756IAs0c44Y?6gV#s}vBMf;CQfkOM zkfDZr2`Mw=H%Pf5X@mLvk0HGv6^0CjR2p&yq{@)7kl}_*ha73htB`6#-hUg^AO(q zGd+DEX{Ki|B;AnFkWb81F(kwE+z(k}dR~KMnw}3KS%!QE$u=bAaNb!nIb9*28Zs1; zW2Vl43jr_6hnqUMj3Jmq{NU?NU0%@ zLCOqS3^~D&?;+)e>^3wdaiSpyLMjXy1*tUTGDwvnw?IxZqykcH$ZL=qL+T+X8}cKh z){vB8JW>ql2|2}(Tu8kkg^&hAZiF-%@)TsFA@4$(4EX}mY{+&#~L1*tLQ zXGpCftw-=kF(eaml_7bM@rGOisW)U2q`{DfAdQC1hcp@TKBU=@Um?F5vfI%-b__WX zk{BF5Qbs`13^^B)ZpgKeEhgs?NQUWo8Iozp`;e_>>U+p@Q7bTgIwKi756xt!}heE+}mn(p8IKA-dXT;Hej{r|?BKL!oDKZb_21QnY zlq<3Uq(YHhAeD;z2{KWU7H8l{QKSpVW<@eUZd4=-q*{?NAT^5I2~w-b0+3j`f25Rw zBr38RBuSBNAb%*Izd(|eCOH$Yo+wQ^NQ%-721!+9G{{~x>Q0a}r6~eQSL8L23`N#} z>{CAf1<6#JMgwuADAEz+Pc>=)$bLmG2gz2WZUxCvkRnB%1u0hK4UiH=z66=B$e$pkiX@+j<3f=WK<-r} z3#43;T#y-x+znEp$WtJdij;v=De@J_eTw`EGEk|Kwkg(F3gjvx&bIRzv|ksOeQirfs6s>mFWG({GJq$~0X z$U%zy0g|D}p+j(_DAEa}ks@b-WGONhBwLX?Kn_-99!QQN%RzD#`2r+Qk)J^tE7I(2 z94U%)2AQhJK#)TexeBB}k=sBD6`2iEq(~V^u_B*=lqj+TXuq!UP)BK<&S zDUuB`Tak$%<%-M%sZiv3kV-{Xg3M85Gf0&pdqFlUa@aWuu_qMi0#dEW=^!{Kq?h^9;8Z<4?s36@*T(=Mg9V*RwQ{ijub_D zfIOkdFpyeB#)HI8@{g1mAaj-G8IVM!Sqbu_(tHJyq%^;RBrDQn1dbg=x`U)DG7uz9 zkvx!eMeYU3P~>@#;}!V?BvX-}LAoh&P&SSoMLK|VSL7s+Y(>ro$x&oHNUkFHg7i>i zAxNGg6(ISFRD+zL$bskMNKxcSke-Tk1}RXaKS-e>qd|%knFeyAA|)WjiYx;uQDiMh zsUis%;7C!V4am!ioCH#?$oU`@id+LysmSdhuP8Dfq)L&uK{hM06{K2`x)OAQ_6h43eqHdXOwdegf&GNTZ8zTqx2Gq_-kHL2?v13*;n4 zE(gg~f>zrM$4{*Nt zCJmcK8k4mEq*8n+YZ*wDBArQ(2GR@>>Jvi%*BzEYg^)q#Vo%;zL=TK&lnV z09hu)&pJS5eLiSclJmtcEMOEh(wM9}L2AT@`sRStDpCgWh7dpNK$SJ=(Bq~!Uwl5- zW|78Z{Ry&Md?>5krKsm*e@5yFk|@N_s;{z6PU&%l^TjtSk`EebOxAdiH&xaQkR)*? zbumb?5I-wXWgRi`A@5tTUbk7KF@v)> zLj2`ANM&v4uwtk4#kX5w6gASAtRW!T;zNCxgXAc38^}3A{H#VQt9VHN3!E>0?Z9S{ z#$+uA87e-M^*KncBD+BHg!owptE_LPTymQ8#b<~{o8=;n$vOt)T=Ai-Q$X?+84fa4 zh@aJ1Wwq@*KG*r;8=PzwX-w9GAO+$>StTHaio6LjOo*R#h|0R`sH?7XzWAi1%_5D- z`W2)|d?>5o<@g-5BJDtmh4@)XDr>>LsePR&uY$DN0JDw&*1xtoiBc=!Df-hWF3&3 z5ZkDnTZ1HtGkKfU$7`j+4Ka^f{2P zq#i#jS!K28*JX_J#rJ{OEYg^)-$Bxp^Wj(FoT5l4kWK%Xbp&U%pc2u3zT=+5oiBd% z5~HY*#$-(d`C5FauMi|dWxWWJDa2o{7M$hw`CW4#yvX_Dn{#XyX-w9SAX(x=S@p-@ zETc#ZkQ^a?){&gml7^ve|9U9SsKysB|6mj~(ik=tBv*W>?+%bWMIHk=M~I)*lC#`8 zT+usgj`NMhUb9)GF6>Bs(UrgDT=fMnJUE3I*PN}(=fCpt@1WGUtDis6gASA ztgAuJ6(8!G1X7^LBOrxB{H#`-br=mpyQ9mPe$E%)if6M(W3oO2DH0zVu@j_Nk-tEO z3GuU9bJkHb46V&G+pwD$Uo6j9vs|PxY$(Wi;zJ{D04Y)A9*|NYepU)+CDSmpt|JaO z!};P@wrv(^Ox8CbW#U64_JRyoq}eq%rwH-0+Ni8!+D*!HzPOgaC~BlJS=WM8h!6GM z15&BT5|9x>{H(T|<@Wg(wql_=Ek!%)e3_EBX&Q0P&Sto*QR^$qhY9W4BJI-=* z?^TbT+{F3DVpB1S8fi?{s~|PvLw&12Y8BZA@`VsTt3797V&e9~$zKn5zWCp3O%`cP z*6|=4#D|7tlI9eD?!6QwQHY<_fwSCxxV*=Sr#fH!daunQjmdfmBuRWIYb{8!B0qtA zDfReS9XZRb!}BM9=FNu(<(cIojmhc@lA@ePf@~CLN*@oBDjGlQXwGUzBD9q=HeTX< zF^AhM(wM9_LDIyBMtlX5u1KBhaQ>2XKP#29+;WY(_cL#MwZJH9q%m1%fou{V>KhG` zp|b7<$rR#e9iy_wulmcoK3r(CNMo|T0?85|%K8%|TajktagLLE{H#u#<>rkCPf4kC zzW9PLjG{&wlQj|~M>$Ub$yMZWkUSxN*0G%B=J~T9DID#5@y)I_i!>(dJCJe*Yn-)e< zBaO+L4KiAMsP9#f5=A}+DHY;p9miR2-pEe4+WU5tA8ZzBOjgPb39-w?hq8KslqoU{ zq+E!fmBv}_TLEilw5@W!vDmd3MU6BjYXL}w_)y<+kSi3~2vRA;&pMv7+;Z)0+PJ{^ z;%d=mk;Y_ooQQLZ_)u0~kj;u@gIp=Z&+5im&1o3g{XO=Mb-wsDJ&dA88k6-rNVWJ- z-+Lf6ifja_72;=g=d89g3~k%jtw%XuoZoF0Y4C@Zb|ca={4>buAc=}x1oHhqX7zwc z-GtU;gm%*-HA|f@uE)q3jWj0fRgfLxLw##Nk}~}C9U#d<{N*}cv@YNQCysJ5{+3GSRy_VjtB&KJK7g;CTdCr_@;E5MH<6e--2^WhQC~$K?)T)734M{epVmOa@U6g zil)BoeDOW*7)6aVChJL%BJrWV7eQ`UWHm^!5I^f=&T4^C)IO*v%XYr_wG^908k5y} z63!qQ{&MvMDOKbgkUNCr~Ei^I>kMTQ6|F_!e}VMH-XUbTZB< z;uAw_4|2C613+qo_*wlpt1S&ftNTftubeNw{S~9Ak;Y^dg4AaC%k?a2PW8#VAc;c! ztkYE1ZLc2wlk>$lvDz%sn5?6w;0z)@R7W?EKUDfakYv&LS^ZU3{ibJm=dUXTdE!IP<3Rq(a7#gCI!L}~ z{H#Ho<@Sy1#(v<<8w+d}X-w8q9Q$UJ^_*sKF%Uxp+AN=-N&Nmi&$YznoWL1Eah!16L11VMH z50L3X{H(J$%dNx5n+#v%eDOq*{@6AT>h#taCW4 z4Glwk;^IkfIbZx5tj!{g$vXNjoKwVyMw||EzapbSV*T6^=VuM&tQIs3Eqztd zv7u3Dq%m0wK@!D>`YJ$@6xj%pEX2<`7bbNR-1hppSC{q97gxbHi!}H{JNjl z^aV*#VA_w1>5L+O`&$r$BfJs*D8`fZ! zeDQlGHj6YS>t~Q;}sgD*9p+HPV=@>p;@Phx+aT zNmpbp$T33vtkEj#<``OX*D5;lu8CaV@CM|>!& z`2z{D&Wdyc$ra*fUCCMQx!$(hX5q5b_~IG~qo|R_u<;;W#E1H(gXAeP3nX8NpOwp5 zZn-+1K)1J#pD(5>HdfehJQIk;Y{G43esxn>~iJj3RwN(uMe0*K<}oDiQ6`6MlHt z`Qo_{Mo}Y;$+`z5Lwu-jK1ik_pMo4C#Lt?bvP#dp*1Ny)lg%QH$!cGO^OyKg)|nt# zid+hkEyT~dfwSCx*mK<%-s@kJFp3&!OxBAaIpRZoAAlUI$PSQPA%50G&T`N7R!=OQ z?|gC2ecWV`#$JO5y$mJlNh4@)Fa@Juq3~kc-Q@s6fhRq_4$yx%^MSN() zI*_S~{0dSa#Lvp-EO&erHO|4Q%=qHkZb)>nxD2id+R!B*f3UiL=}s z^+uDY@if9^&9GUdF{})vSbQjJ14xM?H6X_c@w0B`EVplDztMk{^Tm6WW}D?AjmbI> zq*Qz;>lTnQMV(@|vXkSyMU7t;3tH ziM4jVvDgI|MU6BjYX-;?@u9wFK$2C~n;;*udDRFAZeoUvu@`sw;x`$`_AFc7thHtiW+H5)^w0`@u9w_Kr$408zfVR zpLGXkxpU?2w@MZ|U;F}>%_5D-YE+Cfi1<)eXOMx4WP)T1@w29Jmb;$+;p8dbJ6~L@ zVH7pen5-v2a>R%F-UG>1WIM#^f-&pKnjG{&wll39URPmv{pFs)~X)+JrgD1q#x|_4w z(lE4Uncr`5zPN9LQPfC-KeP)$3dM)WB#^Tdc>ttHh@VvelfU0@lYL~&JC>K)EYg^) z8jxb~p{&E^U{Cb&NhoQCM$UX&Q0P&L()Mi6v+jtROB|0Dj|OQy`1ju@^xxm zAJ?!Z3HvEVQ6r6EpMh)^AL`o$@}VN_pT^lik<&qHg!t(*IK2%Sp{-mqte;E5-7t)z zMjDg;1js7!p}x04Y8BZ^qwuNGdgwKy>OX^7U5KB49|Uz1+L964NpJNpa%1Sd>L#5u z#%DOlM=I-PkR)*?k4Hd~6_~mtsqDC6S>OYG)TzshS z7?9Pfp0hyGlx7r2x)4A8eol9L__pB>;iAT+-;7bzNMqPSkdIZ?8juWeCUrGPrXqiV zWC`)p3srjWi~3#Sl5iip#H5qPqz?pHqtdSd$rfiyp8}Gj$kQOXLj3dxINh!J8wb(v zS(zm4Q5Z#yG=}{Ok|#dYSN}Qu60WMJ9Z0^?oB%Rah@bu-r@Q;l50pMP!6n6F=U@~y z(wOwSKnlc%`sRZaD)Jggks_-=iiP;;4{^G?19R`^zkAER6Qih+#-ul0h#69RsP80@ zQcLO*h-HJ6Da{y=az*Y0c}j?1&%<1gyP__At#rN1#*$(bHPV=R)__!q5B2Q;nWsp? z^O*eO)7|V>ymk_H3X_C)hhh{p(inCL$Y$$fmVFXPwK$XdevlePo(HK_ zqyl8V5Wk*BxgK{^_Wkt_@AIBpF^U>#Og&8&f#43>-*a6@5W1)KH#rStfn?G6Q6Nd8 z@zWnu>CLtsn&Xmi;^kMa+KUOzP$!S&H-k$rj?L&*F6VoM>p)iC%gZMo}Y;NxuUmM|`NS7$jGbH$d_f z*#wd=#802i>29wZ{_@S~E(yOui&4}_W70dkgqclzsIL#mb&8AtDNtkrNTCoveGaF) z*T{+zKJ?B7_hS?_(wOvjL5jqO`o0D!R^)e(5=9Ow#rJRu@zbB+bT=Cxc-LO9|=+_KGb&uNSPuJfs`xq63F#J{Pek;?#@K(CVkq;CE+ti7)6aVCOzS0%zolS zeJw#M73l>sL6LJos)YFIPjb3j^XuQ4?!9Yh3`S8SjY*#ivRQnnuMDJGk<}nKD6$=- zMu?wY%;|2gt9f9}ZkL45?_d-)(wOuvuV5AxAL{D|GEtGyAhAq;_L~BdD8x^HiqqXQ z&4O#Lnc|Xg?k68K(wOwOKyFl78$pu9nbbdlBr9^ztC$ak`04XF-QD;5;GXF}xujSu z1*52u#-tAdNfjUJ%K=GKWFknqB9DP&2=UYBbGn;tx)iR!YA{K7Uj{}|BaLBSgJg;i z_3Z{ZMv+E~G1n>51teRDpT2<8-5Gz!;-ytC32&3dC~BlJ>0?1Ui4XPN4U(hClOVZ@ zECIF$nDx1w!5Tv9Cd5k^rXjYg)7=p_WX~^>gkxrj zNhgg-?*URGK9oKTq*ReykS>bc3sNS;PcPwg_dNHVLk=I}l5m`36gASA^v^-c#fSR- z0I5)<@$0xFt;o?Jl|uaV=QzC$8KHgu`ib6bGZ3Swk;bG?202cAsPA!*Dn(ud*{sMX zAk{+r^o5-6j<~GM4)3@md@l_~Q6r5>?^uR8Q+%jz07$JOBSB&V{kiT&kVGMV`tzLb zwtLsTU;o!7;k-^hXrwXeAAux^5A}TwlB~#|ASsHpS(*?_5aOpV;&gY!ZMpIH%`OR( zHAYb*jY*#Xk}5vbcMnLKBJ)A&DDnnKx)4A81x|P8xZ7KOeY8u8#nxjKHPV>$hRYIS zb;XDJ+JIyzaw15kBEvwkg!t(%a=P2@**_eML*FFf^?Qt>MjFHBfMkmg^(_Xer^u%u zIg0!Wk}Jede~HuG5%<@kgP(Ot_$28YCY>}UJp&|9d?@`wkbFh1201{HyFjK2@zYB= z-R*TxZ9VM{mxQYdjG{&wlfD+@K=Glz??4I^*$+~v$RW!y`w8*WU*>eT=6ilTsjW-G zr+G1o8fi@WMIgoELw)%mC5jY+lqymTQeTlbLCS>q^}NFMbRcWA6Cc|;&1K_NJdC17 z8dFb$H!=H(5B0SGsZgXFNTniYfmA7y1F~6&U(c&tkGleyJAc3Tyn6~pQ6r71=Q)sS z@u9vqKx!0O4N|K}HOM!L)L#K-ya&!aKlSTb%=M&_HQLoj^!m_c<4!V-LL-f-=R%M~ z@u9w3K#~->A0%0kQjioy-UZnr75eqOrs{cN=2v+x8?PK;6gASAdJcUHvzBr`1|&_9 zlR?rI83~f1$gLn-|FNDWT#q}NUi$g6`7RshCXAv+8dJ}QAeqYfdyp(e>Xu`+QRFC) zZIVuoy+LwBZw|<}Dr+f7p3+o;vRRP~kZK`*J#TP5?%dSs z*xrj>b}V*2Mo}Y;sizR+6Y-(GS3znNSp`z7NHzK3PKudrXjE(^<_#f!JKvG5H*YhUVv69FAO709N|%j$ zo)|@qG^U>AAX(x=eg6TWduo4giyDv|MH1h~ETKpXkaeU#x6gAQqHU*?oe5mgc zkSax<1KF%dIY_l4RUkD&{CeKydffbz^!srr!PT=Hqo|R_uwy^O+#){I*AFB%*x#Qo z07+EjdXR6_s7FDPMB~@9lIwBnr|`S83tTpymr@oQX-qvEK$69W`u+e(QRI+Sm|GNS z2eL)gb1F!hX#9HK<9gir{p&%OdGB;OAET&|#?*5+NV@n?-?JbYimU+1ROAzot*V~y zL9#^S*YiHt=oPX*W0 zo~+Rp+>x`*W#gG9Mo}Y;sb?-ok@!&G5|Cm=R)Lf#@-0ZIB6~r$OU-^gA96izfBxa{ zpNG3_Jg5HH)I%Cm&rpyu<$M)Lxgs+`DinDZU z`v4e4jWnj7gVtcS5g+Pn1F~6>0U*_iWP{Wwk_S>N#INTguE*W^zhmo=_gyybcwiJY z(wKVQ0Qp0FsIQ7Nc*ku$JT{u|K@t_Ivlg?BBCSA@h4}TX=6c$ZHQE;~-h9aU;(Urx z)JS8p#(?Zm_1puJBF?0K5+qfTQntjv7qFPDw)eZ(kgq%rlh zsKjg|KGb(SNTwpgK=!JduLH?an&}|fLi~Exa6KtxjW*+?D<5~+xQB*O)JS9M`3xjS ze5mhxkbNq>(I=Q~l%^v{o+9ZW`9l19)~b3=eR@Wf%Z|m)#VBf|G4-fPcd%@@$0En^?cNM@&=cU=Q0>YjWnj7b3ls4hx*2Wlqhl+NU0*l zAZ3ay0ogA#`}KUn^|(*AK3CJ_0hf(Wl42A!(wKVofs`xfCZA!pQKTD4r6PktsuZ~l zRTm6gASAdgg&_R?cN0)rzbJsZnGbNUb6X>)?$0>}Hnm z*Ux8MkGq~fdinvATsB@+q)}+3G4%`tNfaOI8x4}A$P|!dMIHtDUe&V{Bte5mhZkW7`e4J1pEy&&0&G+mE*Lx^9`dalRKhiyMyeZ0%Y zT!&HANMq``93)qKsP9&gJVhP`*{Nz?4wA1lpMp#k;@9&z*W<3o?jCTqcV~MCMo}Y; zsi(!~m~F&|`i=+LrP9v_DO8&AAVrGY3sNk^ucwOZan~EedfoVq%f?)XQPfCd>iG<$ zM0}|42ar-l>Q!O3QKThExgy;_ew3x~>-mD~X++j&*>hJ_sC~BlJ^>qFMvyJ#rUq6r< zMJ@!XRb(Pa>})sN(5U-C5{3Bne985=<16E*rQZF7=g0?*G^U;^kRGkbW~s|S2(>LHD(r#DEJ_)tB=L9!JY53*NP_!vlz(!2wHvc-q`4*3SZ zC$7?ag5)U8*&w-!n^|<3}`}?DhbJ_S52}V&Pjj87)kbLo>zBM3I71;z* zpvZ2JLPeTv!Ed0;Quy_J$Mv}R=e+(`-|MpREk+ncjWnj7@gPOYc?QUT#hKKzK#G;- zb&wK8DnLqw`1MqCJ#K$qQm}Wc%f@vNMo}Y;sV8wOW*hOLzBVAgsd_R&%9SPuq(YJF zKq`g!^?c9uv?Xh_o?qWw?y~VMVHib?G^U<+K&r%t`o0ADUDcDg4fBuEv<9hGQis>t~uhbnRlNSY!KgQN@b>)FZmxaVJc zUw{1`myP$wU=%gdn0meh$q*mv+YfS>BFAjUY@^7jAX$o>50Wj!uV)w6#Og+zl`cG-B}21ZdMjj5*^BvpK92PcRg(|iW+I~hjuQ=k>W#S8c41pkAUPU@*GIMB5#9C72?RSPFlp-5JN)`DHq)d@UKVsex;@4Bl^|*#_)y;=KVh~}q!UQ3A{ij96*(UycCMQ@{Cf6qJ?{MpWlwx_yUWJ$MWfJ2W9pd$ zk|;jZ_Yz2wA{8LXifjW(Q6!-T^M(+=p1oX86S79j*w}iQ%f{;k7)6aVrk?&FY2rhD z7l5QIG7cm|kvl*#6`2jvMu=a}KCZ`|PY0hidcMoX`$RE{8fi>D+d#6!hx+z{WGm9- z=Y&{WMY@CJC^7^jSBPKFpQ@gN$4^=2vhj^(7)6aVrk+_KdE!HTuY%+&vI=CXB3nQT z6xjpPPKaO6ey+z|j~$RaYn#i)XCi(v^^nHYGXSJee5jt$AVrGY3R0{{5lDMQUIr-< z;@9&R*Mmui+luOAl3X_KM`08-(wKVw1Su6C>TC8Z<`zXdfpk#hRFHB-&IhRw;@1-(_A)|9iym`#?(^`a+UZ{ z-y0zLimV11qsX@)Qx*9gq(F#YPkpY(J-;~Yt24dp`9o_>J)|-9oDNbbK2%RONRc8F zK#CQ)3*>4=7J`fw;@6YN^|(qDC51&rcxNh!6E0_y=ZMMUp{E6*&&1 zOpy$baYFoh8gM=C{>C@&4EoGv;~P{liW+H5J%u3GiVyX@22!p_1xSS=8$c=*`5B~2 zh+j`buBRPYqisLpy*@4*uTAVR^^nHYGZ+|k!o&iZ$WGP675Wk+rT#q|nywdF~ z@A=?I7)6aVrk?#Enc_ozP5#7etVjot;}sbQ(oKk?TOFDsl%%fg+EB^c3RPb12u7Le^;K?HE$yvN5+{6gASAdUk;n ziVyWA{*@3rQISp{MT(pbQmn`YASFWldJf}y@T8qvqj@KK_YbeZC~BlJ^~?i#Tzsf+ zEl8;%+d;|{`5k1IB5mPUF2t{=3D@I}_lr*asDaDIH%i$mNMq``0{>efK2*<*AeD+t z2dPqI9>{D()`H9t;@8uZ>v7i`Lta^h3mKD*`>OU4X$)(ZP$#xoe5jrtAWtZg1yZfZ zSdbb;ZUdPs#IL6r*W-?_@yYWSxomt|8KbC?#yt8Iq*i>WZ#&47iX2o2+Ts5E+y*33 zkvYE4BK#>ZN6h*!UNmb-mkcLA1 zdJgA$nvykIT8r!NblLcYg}SB+(wIj*K@Jih8ZiVUO_57M(iOP@q>&uJgL975J;=MUgr`3s|{k;Xjw93)LS?*jQwoJrlJA?9bLNdw7H z%lG)@9>$6pW%q8vE!V%)R16eceIw6d44PuSgEaNs8PK(npA2PkXM%J->LU zY|afSjyIawE*fiu3{LE5xs-gR1Ax?myn(vSYD} zF^U>#%%cZDP7xpKn-5Z?$eSR=ihK@IqDU=BsSv-Oj$BV$vPL^9d4YF-?4W~96{Inb zGC&>|9~zMjQl`jtAmxe_f>bC{0y0a8U(eB8Pjj+HoB#ggYL|`YRv1N%H0IF`kV^5P zzJnWM?p5R%klBi4f^1eK2V{;Azn)aCrwv)7Ek9`K1ecB9rp730q%n_P1bISysBaZW zwIZ89Y80sjnXAYlhhTmd;@5Kw*W<2N5BYp)p3BCsvttxB(wIk=5y|%F=lehs6f z8$OxAnp!-;e%xNwJMiffhtJ8ZY47>;34Hp-;d2UWI(t5S1D_1m zw8Jvt!N07ZQ(3bT{cina1U~&(gAcs0=Hj&WSBC57G}i2fCK3Np>lgU+XU$mj;r3N* zdFSUL#R91P`E=GK0yjhtwf=$60M@iaA0GV6a-G2%f4K$(KAEf;jjT5CS-a|wSHgM* zvSu|j?%7Lb;4_Fd?IPjRYgT*p z3<-R)SQA~(Ijo`i$8Gnlz-K6H+C|oLE^GYlH8k)U7KhJytf}ypYgphjoHfz=;Rx0= z^7g~wfloGTqW7QkS+mmHf3gFg3s}=Ga{XM$8h?9T5crIY!{;K_`0IIO;Bzr+7NQ=y z!_qYQ<@(`qaS3bEv0ROzp>}cLlf#<&&?KY(tQo&N8v0zyntW*7-IJWaXB2Cq_ruFr z6wP*7*C+6@gDKYpSts=*pn^14mvKuAi$|lY{l+ zuC8(epE0b7UO!i}#-BIF1U_R~6MY`MhBf~AYi!^%jy2Ki=UUeI>t|fxlgFCq^>ZC- zCV1;7FYp=9n&|!cde->+^Z3AL0&Ch~Tj9aKoOf%*ym&+V*w|?#lda^1@sfBu;s z_{@l-p8Hs{+FPy}fzQl1eC}tBzkX&0K811kJP`O420jn6CVKyQh&BH6iw6Urhgq}c zAl&Q3v3kN=wKs>y=_9P!hzsoZv5u%c9QZuSns(^JgMZn79%GHaejW{cidYl9T#vKH zKQ4*_pILGE%w|n0mb(!x6xyu7XAWzk_roVx;~!sh0-w2Y)bk{3I(zlZ4Sb4Oa|`Co zKB#y8_1TNU?e!FE7C_UPmkRff1D|$ zXHE2V=9{eXuQQhiJ}X!gyqFL5px<3*Rs=q)SQEXTKVpr)|EvmpR_96TSbe zWlgrX|EvjoXm+Zb&@Qr`Pgqm#t)I%k=Tp{1p9eo<%^dGM_-Wv?jy2Ki`9G}j*Ymo- zXFY4$MK0Iptnrs?ec)5YnzykIJHe}P!&_P5{`>`N=p~{QXsA^MJ{wqbF7C1{M*q%v z^jpd>Rp+lSS(A&Ma1xoIZ3uievZfvS@Zewe=dW1f@6Q_ppG~ZZUe8~%#=lRpDe&2B zvT(fP<>=U@<9_TNF4s4#$%SSpG}JZ+K3iDR4t;p=FUz%+HLKC@j?*oH&od82?9|zYb!}V&G)!(=hO96h}P=v&LUPjRGHf z=2bT#x}HOVdKw2lNvyd8HMd92SGNA7ZMa;AvSu4JE$wn81wMzdCc2&`tXbr(pTh#5 zrmPtaO&etW^Xrw(ShE@$_j+a1z^6HD9>Dd+GWh&F_1u@kp7A&Bk?aTvbePfd|I+5dOaV-no`u` z_QRHePb=0$-w$uinm)L$Yj5jm75LCyg8%ROxeaUlc`POHY0H}Ed8{34{Po;6@M+JQ z==rAuYy9KAec;oPHPP3-N3+Ji?(G=(q_QS@9y^9L{`Gun;L|A%pJQ3G6Whwohn)hS z&T;tAv)8%_em$K7pRTNlo;QwTjX!U64SdpA6TRJ!XH8S@_(}_Wy0PYVoYwBf^6&lT z?2p3Zt2=9I@h`qglUujIrw41I>p6in{(jga@aY+c&xx$@uQz%IKIyE9zE0@H8vpo8 z4}5yZ;d2seDzIkU^NZerPaoDqub-1y)5zOieFC4pany4PYgT&o^bLG6;_x|@HU9d^ z2z>gnCi*x%jWzyp(J%1nABWHBtnrW2{(;YcIDF0s>KPFDWX9n$kTw4Gd}iP?h&A)D zO^?R*=(qRwOT**qOydKM`_{-ofzRML>N$%w{(2r9_zYo9^l@=EYy9m#B=E^%P4xZD zb6C>@%jMn&k`?$2Wli+{b1rNA?LIW{85W1nd4bQcz-KsXqL0%Ntnufu;ek&!Yogcl z`K&4Tj??VG=K|LJfsa?+j_ZkTohLsR?mri@W?fVK3M1AvwF?3tx;py*t~V}X%}R`S z^VrD1=i)egE@6$o|6CmS6qMDNd6vc^A7uLykTuGjy!y{=--N-UAvUb%tK7}iABL$7M- z>y|Nr&sf$(AMe+&Ce1tE#|A#*SQGtv+_kLnUymCX_~fxB`uMtzHRay=$qRhO$Ki85 zYy9*3_`qiZYg*wL?T)<1mesTjkJB4iGZLDP&`_HY_)KI?^!#%pYy9hk@R`h-=Z7TS-3yn!vytnSoDX96k>O^%Mp^560p15NrJFp9cexKgpVM)ZzB$xq(k{96nF6W~Jv-9Qe$O!)HEg{CegEJ_}eA zy}h1hO?#~8MyQF}g23k))4%e`*3Fz{K#n&|ER0&D#9&Z5BQMb<>GpO;wU?}sl2KBcUQK2Bd|jene$20pLE zQO~Qa@vjqJ349jEQO|3v@$W}14t$oxQP1nF@z>9iz^9Bg(c5b&Ys#^2xZ|`e@L9&1 z==J;tYy9)_vcP9~9QC}(8k}gQp5=khia31UVvWBat_Xa}{CRbC;IoD`(evS2){OP$!!?0VC2OLecYnf~N$_#cyDI~qPfZr~u?G0> zpI=}8j5Yp!(N6=Pb*veUtTyoZ=hwgf!^c zd^W}5^L5~}De&1GhtD^xS?SfYIq=yMhtF2l_{+5=@Y%+i=y~j0*7)<-w!mjQYofQ; zcdYTBr)&>=s#z0#e0|TFY2NWw9r)~EP4s^F18e;A*N(tvCu^dw4|lP~znk4X4Qry;^UtjDkBgeX=NHyQ9~Zx}#y?;D68P+9P4sg8mo*Epy^^s{ zQ`;T*{1!(&zX$dF7WmY%CVG4Q!5aT_CAERi9@a$P_uI=F|33eoz-J$8qSy1EtSQHO zar4ie==TURpW0{1DE ztcgCp=*>rU6a4d6oxq0*{Qv5qLHa&zy};+dIDG1}W*?R$kyZ}cfq_qA96k+L6T|-O zd=dknhOCKx{p%ps)WXNT{?#z>X%t622OA$OkE^Fq;M15j(fi>ctXWCxg;ow)*p4MPs=!bj$)1f{HtZ)(~33G$9rqm_}6u<0-uyP z>S@Cof4NcupSG-t-hbM$W+&FOJ1*J=KJDYEr$bOr`@p9oYogB=N3+KNoJ+^RCzUlF zF(=SBskPm6C{AVgKk9vh$FQal*nN9fYT(m}HPPGaSl0OSbEm+kGi$0*!N1=}>cSfT z{m-2PpRTNlK2DEgjemS~4SdpA6MemUJZt>x)wIB;TO9RtXH7Yl-5u}U0-qjn_?*BR zf4O=DK0V{`IgvG$UOhbnpY%9C?toD5R2R;K>6MbBq!J1*%UP7Fh=OWhl%QZ6a zxtKN4%XJBB{N=hh@X29K^!B=xHU9R>34BJeCVKz5j5Xyr9^CvhD)1Q{M?IIb#-BGv z2R>J@Ci*_)m8_}2e(3H)UJ>}@vL<@|xr#Mo;p66?+`wlHYohN~cxiRpW82IF~Ci=Lzi8bX|zwWrm4}5Np!{-*( z_|Kbe4tyrX;d3i%s=Rt81wNDG@R`CI|9mky@R`b*==)>0vBtljIW_RPoi)+-Y42do zB6v&*7(og3j&|%any4! zYy5d*df+pIHT0?Ti?IHl@A3Ms@cQRI)+~aiAFt(DY)0TSlQq%julrfE58KP#kD3|y z6tX6I{XD>$a@69Eufo9RLDocXuZLLUub&44pNHe9=MmN{_Ud^!@Od;2pT}6^FV~}i zPZ4XPm+NuX_{&uk_{@sKXEtm6>&#h!&zv}Xo(O#A1U_?F6FqM{$(okfe;Q$3Q=1$3 z6tgCJ|Dk7Rbrbyib;W_tJk~_7=lQJh*Ymup#!=5ptnt_L zi-AvR9QC{$)KePxyuzC3``E9tX0&%7`<1|FaUAu$7Syvi@L3Xv&+Duy$F_3w>XN{x zj5X2M;Y*DV_8)g0UKaQ)V@>q&{swD0d&m2-z-KvYqW7OSO+DUnEf0KFuqOI=e~UH# z@xCJPDUZYFZPxhvVR_*54r`*9>s{9P+v}acXC-T**YkU)x=^O1D{Q-q1od;Xuhle?A~y>zGh7d{vBm~HU&PLSrdI9;2YLV_3i^~ z4t%z-X6Qlq?N_Yc^RvIg+qV99J#S@AUV~U{g{@~x;IoZ2(Z}hxtnsfmwgo=hS+g4_ zrst6L%)!_059|4kHFWYCZ|m6}_*AoI7Wxmyf8)m;aZc#-J!|~ur`3Va4%U=dpL(Y+ z|0DGIL44f(=N*C1PS!*p@4Hyz-v`(k`25J4g{bG>zd!sZ)}&!Gy3dXN82Hq%Ci=Me znKk}#Q4{$5!kV$D2fN3=y#Mf5*3fR{*3U12&u-R4ub=<2#$P|X1E1gG@cErJ<*3(P z|NIvC)Uqb}_0vCCQ-tMmubjXaaSQEV;9>AJ<-hNmw z@HsFJpZcsx^n4Bsd=gm`z1|oaT z+pAIF)0j2U+v^b4_}i;-;FH9f=@cC7L5OSBDq+Q;G3fi>mW zfAD}?`@p9oYod>@qgms>U$kT3lggUt?I%7WnjFjXRFN z?s@#l;dSN-tSQHygQq;)dIUZ_Sws6XwX%{A4+?!wWDV`l&ZlSKlg^r{(A33$bK5n2 zEcEHcnnu{}&L=(a>8+0~N~`1E7V zY<9u(um1m87W$mVnpAH+_X~Xbvxbg$YLolTUKjeD&Ki23jH{=A;4^?V(~M1Q-Eo5+ z34P9B4bAh;XF%YS$(mMa*avaRH~4e<9fJSeUISTEj6K3VPst2?2C;^=7mdE;m^mFo zpEFs51(tbrP~bC|HS}Ic^7;6ljksm`zxABOnw98x%QZOg8N!-2(BNrxY|MW8jPd{a zoXwgl^y2}yA%Ra8Yp5RbdG&#;n?s*-SW}9AS5H>pGn6&S`0}w*JOTUbwlVL7KIgKg zKPF%2Gc@oS#v0n6@gO$-!jt-hKIgH9=GBJKP#YHb3};O<2o8g8(YCEiL!S|>p>J4q z+kJT8lg*mX;PWPO4jq{K5A)dhtfB8wbjy{^K2+H(`^%5?nAR|Ums61|$6kKpz;Rbi zpq{J)Q>>=kYK97_v}CZ5Z!8%kWVad6x7QGS`v}AuBEEC**re`U`1zcpcu_1B4uJNv4qDmJAY- zZ^>XGMV1T^veJ?)AwO9%R7jKLI-EXCNMB2a3mIiewvgK_xj@JZmW&j#&XS9T{MV8k zA&rly!|9`h^sr>KkV`DNLdYGK$rvHaEg36ht0m)vG-y$W)ANM%v}C-H^DUVm zWU?g_h0M1kU&uR_+$?09C6k0SII<3>PZn~FB~yi*X36bBaxIxA=Etw&tdCNLn&rBiREh!Xowj~b=xyF)*g*<4s}mXr&bVaYo}p0i}7kPj?*Ur4nj z6+#Y8sl)ZG64Kq0)k4m-gelv}b+$QDc13#rql4yRWMX=lj>A%iX1 zC}e^qn}j@J$z~yMTCzpR50-2b(ztCMPTwvh-I8h{BP`h=-kN{>6X+A8Dq&FA@^FcPe_?1`-QBxBv#Lz2YPSThd6#7nU>@vfq*!r zO+9Hs`dQLV$S6yC2)WIYo>_4a)ne|GDb*)V@>*4A?+<0C*%xE z@`PMv$#@|TS~5Y%5=$lusj?(rNUXC-zgfspmP`_oZpmaJ!z`I9WP&BP3whL%X+mDJ zW5Hi@3RYJyCvRcU9maGx-yd{-FKD6XhAwOEOPDqn(rk?dex>-^sWSAuz zgxqM!Mj^8-*(Br*OEwGn#*!^U>UB5i+k~{YWV?_vEvXiAttC5z%(P^uke4m_QOJ5r zYJ~h@$uC0M_AvGA7ShX---L{^q*lmeOZEtP!jgSLR#>uM$d{JH_n5^O2`S8qzD;mNn0V;S<+s}OiMZnDYYb3$VZlR5>jJHXCVisn|itm zIo^^qAww$GVY_%j;Nc}!0eTI1gzU3qfso`3Q{gj0dRtN=WT+(zg-&l?6zdFkfc*hJxhdiv!qPOAWN1Bxyh2{LLRqdg^*>IlnYsJ$vZ-7Em#Qk65xs$U;jhg{-pVQz6xstP^t3X{Mg_LONMeC8VDv zyMQ0-o^EnqzSpllAc1IvZRNQrA{NSgH$+;kPVh(3fW=FZ&J@e{p;|3l3F2M zEZHOEEKBwY8E46UArD#-ldL6{)Dco?Nj)JyS#qF|q|;43i9&i>(oo0+mNXJF*^x0kTgqL2szu5mO`$xq?M3|ElCklYDrrmt1W3S z?oznBLjebOcXxMpcP|QecXxL$+`VuLE!+xsI_6w+t+_|<{BfV| z`;7N|87p?|h)m#gBVWt>={B`Wi{cHm8bj-A+j9qY6v{gpr@jE1FhE3`t4Ejv#LUr zHrF9(EM#WI>Rrbcmu8O(7G`^Z&g*X%b4qsH_+Azda%5FiMezn&y?ib6ucD~cRTOWa)f-w{kKf6zYKkb{K&y|hW&Y(9 zwYG@j4Yc|~YeK7eX;l3!iZ{^e=WCgNT}7=AqId(X{?JMthy`s=QRq@K1=ZiPc8sTf1 ze-TElJfe65tv|5!eMN6obw%+8S|g!FpV`d68lzTUQM`fHpU~Rc{7X+&b42k5TBD#v z_YLze%c!+S6mOt48d}A^jm@j-wkX~}YmBdD{`DEPeu&}?w8lbT&WYj;v}Qt!o-b8DMDYe%v!F%KR}t4rSJ9jyZ=f|B zTKTTd*rckaDBeJ8j;~eBwT6n~4YcM$i$5PawMGZmB*Kx-AW=y6qXt~yn)slU#psH zRTRY=Xsz|NR1Fcu8)&VA7M)=Y*V-bAH_%!SEqX1hx+{t|(AwZ@)pD%}Rn2Me23i}T zMXxVa*+lUMTAQFn&sQDSswIjy(Ao?wdcIVR5ycy5ZSl40xz>JByn)tMUrW_1QM`fH zHfYiF)xfn9R5NGD8)$8Z7JZIVRa_KrptZx-YUEn&Mezn&JE65U_@*_g#);w$w08Mg zO91-au=Quhq=8!c{kC$Qx+w^|e&x6U7^7?en!-xK;;Iyn)t! zXwmCS)htoGfz|&Vxhij#%WzLW{&^qU9sj4iBH_$o{ExPyia;^TNcmu5q(4uQY z)e=#>f!0M|tB-4)6vZ28U4mAXNcje-dM}DM(7Nnv^>eL+wappw23mhZi(bpB%823( zw5~vlu8je%)k73-pmh~mbZw}bCyF=Fy5?&Qa;+nxcmu8LzLu)TqId(X8_=R_V~A^o ztz*uRH_*BXExJdk${~t3(7NSo4Rfu=qId(X+t8xtOVvnGyn)s~(4yySglnx6#T#hd zffhYqsxFJ-4Ycn1S|eTSizwbe>z=QrDrH@B^1Ol8eQ441HOjRriQ)~k9zcuEP*pEc zyn)t3Xweytajp5Hcmu6}p+#q?>ar-_KfhgWU>m{^) z1xw#vRn+?C*U!;tjOkK#R_BhHL#HiZ{^u4_b7F zsy2(_4Yc0+TC-g1A5px4);nKIRkQ}?40!{s_rBH~*D5NCH_-Y3EqX1hY9op_(E8|W z&2y~@qId(XPtc+>RCQPsZ=m(r*IM9OpG5HnT3?{`dd|`os**P}XUH39ef6~#xmE>H zyn)s?XwlwYlCa`7sVTBg@YDd8>&``;tjOI`&ye^>xwAeKq~^Y=$cm*)Wn=2Z=e+s zTJ)Z>#kJCk;tjMSL5r?KRW(KN23nDQt!=I~OcZaR6~)(5wOJHzpcNHbbj|N@t$U() z1FdM#qCa0&6{)E?L*76uy05j%wQ`B#4YXoFi>?h-O+@hqS}}dCJ+3uc6mOsv3tIHE zxvI^gcmu82zSch1x*>`;(E1HpbcU*aisB8l;`mwzTq|iabMm}_R$OS&8LFxviZ{@T z2Q9kh54u(#QM`dxd}z@%uWG(1-asn>wCFlK>{^FJ@djE6p*5vyzG}OJhR0p2p(x%!D=D<-3{_1K#T#fPgBG3PN!L0c ziZ{?o4lTMiR6P^L8)&6~7Co-ht`(z&IYZt+DWe7eKr0=z=y6?itz<3D8S(~N>7hlR zMOBp$#T#g4@U9#Oo3R%U3?8LE0HiZ{^8 z0xdejYpxZcl{rJ+Kr1V>5|-;5RaJITyn$9WU+acz)f2@VX#EbY)h8n-QZ-f-Z=jVO zT6BiDTx+i=-asn{wCD^~y%fb8Xyt?!o#8*Om7ujbL*78^f6$_9LsfZEyn$9OU+b=G z^%un(Xyu01#9k5Wt6D0GH_*xhEjq*du60@zZ=jVIT6Bi0g10fJ!5e7hgBG3PL)ZGB zDBeITKeXsQMO70~yn$8$U+a-;jS;S<+-Es8hLDhw?; zLshZcnlt1Lw2Jsz&s-~?DBeJ;sIR4}nJC^ss~EKC`Fi16qebxsTE(G7e@>)or6}G& ztAwxh%C(M);tjM)LW^Ess@{p>4YW!@i=MAHu9di*IeFedt2DIe`BGI%6mOta#@Bl5 zTAf7k23lo(EmiYH@djGupheHud)GQ6iZ{?I4=p-FRo_JM23i$-t&gsiroA~s-axA& zwCLJURb3QspjFA&`s`YRMezn&m7ztyBT}_a6mOta#n<}kS~o=T23l32ML#dA3emxw z25+EM&DZ+wTIogc23pmjMUP8WBT>A8Rt;#;HUHDKrikJVv}!_&u6b3vMDYe%wV*}U zVNgi>_eJlB;tjNFLyOK(RmhI!40!{sI=)tL*GeObH_)mJExHa>RTsq@Xw~zzLb}#q zQM`dxeQ441rD~lh-axB?uNB(0ZiwOyv>HN-UdyVYb~0zk8)!B1wZghqaZ$X1R%2+< z<5Ja86mOu_#McV%S~EoP23k#_mH$}yW2%mc;tjN#`C1WO>w_rXK&v^l=y9n^*4dmP zZ=lt}*NW^~6-4m{S}mbPk4sfwQM`dxD_<+BYb_VW8)&tL*4RG}^;LC66mOu_#@CAO zS|Pib)8GxX+CqySm#TE4cmu6=zE(`vswj##&}t7Y`g?k+`itTXv^w}&v0ZDGDBeJ; zBed>~8kf&p~bFC7hcmu7j(AsjX zd|_36MDYe%-F&SCuC-PaZ=ls3T6Arw`dbulpw+|IO5|GKMezn&J)uQ^FGW?7ZsrVm z1Fc@rqW8)qu2obNZ=ls1TJ&D2svwu<5nwEFp4 zDO~HODBeJ;KeXt6s47HvbB4Tu)&O5Cm20IF#T#f1gckkIK~+^zyn)srUn`Ak^%cb% zXbpxIy;rJQCW<%E8sclEbFK5Dcmu7WzLu(wqId(XVZK%d*NWf6oIG!!HQd)yRa_Kr zpf$qR%H&!dMDYe%e?W`gQ&i0s#T#gi^tH0M)-h4Mf!3eUqHA8&H&MKS)+k>qn`>q2 zY0i*0&>9V`ptY%rs;VK1H_#g6Yh`z>{-SsTt+CLe$E9kCDBeJ8oUfJBwN8rS4YbDl zTB_cQ;tjMWK#T5&xm+t@FLQ>xf!0K5(fv?W5mCH>)+Apmk88CM#T#f%_O(<^7sVTB zO@S8Od-J*0F;TpM)>LTG^QG#&DBeJ88noyP3%FL2-sTK>1Fh-MqBB%gUKDSjHN)2` z77yn)t2UrW_LqId(XMZQ)U z*NWKJoFQ+ZwHR8(pC_)MDyt~oKx>JwRnE1li{cHmmO_iJ4OIh0@djGUphd5*3a+(6 z6mOul99s1HQgvDsZ=kgTT6E1!(Ao$sx;9i55ycy5ZGskE8+BZ(ohaTwYcsU^U1<_s)l5;mfz}pi z(c`M;T1Q0j23lL8MUP9>TT#4$);3?OfomliV9t;?(Aw^6sVXLlH_+MvEjq(SuGLx; zZ=kgkTJ&c(swRly4YYRoT1{MQn<(BuYd5s$&!kj66vZ28?eVpmxmL7+<_viQt-a8q zpTATU6U7^7?en!-xKjbpu`BL?}DBeKpq_5S*wd#rD z4YW@ATB^p1;tjM;LyNABZmzXg6mOt)23lFNt^29!sVLq+>#VQU!?j`#F=xmdXq|%= zy??1HAc{B8I`3=sa;=u4cmu5q(4uQz)pSw3f!0M|tB-3P6~!B9U4j<<9WzzWMezn& zmwl~%t`%jdIYZt+>u+e$?+;aF6U7^7U4a%|^8;L~nke2t>ngP9npf3J6mOt)&DR>_ zTC+v*23psBEmem^@djEqe61m_^-L6Rpmo#NQWbNUIeFed>lU==^)<}3@{8gPv~EL- zu6b3>MDYe%|M*%XTx*ml-azXPwCI{wwM7(fpmo>R8tGcMMezn&_n<}py;!P34mW4W z8))5!7F~yyfWD z&b6+H;tjMO`&z1kjWB1(8)!Z8wI;Y$dQrTA)>B_gRV`7xfz~r$Ym#dX6U7^7J@>U# ztrW!@XuW_IT^mze>x?MgKJM{py7G=U!DuMDYe%Z+)#Mc0O^U7~mctUNw7&UTs#=KR4Ya;Pi>~=4t~Fj1Z=m%9T67(%+AWGV z(E90XEpx3$qId(XU(lj!Lsi64<_viQt)RevEvEkWv(e*P;aXWm@djG-Uz!{unEm%( z^to469Z|f2R&ZZym1_+V#T#gafEN9I8&yk1@djEUp+(pH8rM1|iZ{>-1ueSfRlO9& z8)$`w7M->uYUrt)`-Q1Fdk-qI<8ZDWZ4-t?<6q zCf7PFiZ{@T04;i4sy>L~4YVTqT3cKz^P9@pwAiZ{@T1uc49s%DAe4YXqWTKimUk0{o;FZ)dNwyfmR$} z>ws&88)r_QH_(dfYpKd5iZ{@T2Q7NO4!TwgQM`dxd}z_<4OQbs@djE6e67Q-wOtf% zpq0?qQgufZZ=jV3T6Aq3b*<3j%^C6rT8W`W*M_Q`qId(XB+#NWJnmY}Mezn&Nufn& zsA`-j-asoEwCHi2bggZocmu8E(4xns>XsaZ$X1Rz_&i-#=8jviMrpTtpcKW1FheoMc2Hl z)}nX=t?baE*YYjbnkWVdM&HkCyF=F%IRzU<62Kd@djG|^R-k(n{3XIH_*!E zYu$CN+@g2`t=ztrs+OX71Fby1)_vESB8oTA%Ij;X+AoSX(8>obx*tAtt*4@R1Fihf zqWiq6Xj9A?@&;N3e62^Wl}i+Fpj8lBbRDW{DT+7HD&%WDajmJMcmu7%(4zaHs=q|> z23kdYt!J+FLKJVHRTNtET2>WfsyRd6K&zOq^}@Asi{cHmibIQjURKpi6mOta!q?on@DE1xLd zK&vdY=pLo2y(r#5s~oiG_4VGh=8EDCw8}$^&QR4JQM`dx1!&RZ`si9WMDYe%6`@6s zOI3vF<_viQtxC|M$MxB@@`~aOv?@c3u0vG~Mezn&ReY_lt~EpyZ=h8bTJ&eWs#c2P z4YaC3i_Y-7Yn>Ct8)#LB7M-E0&!Tt(ts2mxGyLgVNoJUn=MA)KLaR^2tW8uE7sVTB z)$+B1LfL=+)mjv9pj8`M^!idYRTOWaRmax~?pg;#@djFTp+)yYRj)+x23qxet&px2 zf2KJ@-axB9wCHiEDlUpQ&}!gog?6nDqId(XhQ5}n#iDovtwz39Sl7BLiZ{?|>}#ot zKFgd2Z=lu0*9z}iQ%>Z=f~E*Gl7B1x4`&T7#k0yitdl zs+x%64YY>%TIpPCm?+*rYbdnnI#jh$6mOt4%-71`TDL{<23o_RMZeQi^-UCSpfv(o zbZumEtvCzJ$@2zUe?W__4OL}D@djEWp+(n57T4-8iZ{^u6I%3p09DIG@djF>phb@> zn`@mF#T#gih88_8Ri8xh23li$t?aIqc%eB%-au=tucfM@DBeJ8oUfJBwFZdd4YbDl zTB^2-;tjMW_*%JK>$ND}Kx?9}r7G?sa~iyX)+A`rwUNiQiiqM3v?fD~{vD#KR-$+V zttq}%KGzy6iZ{@j>T9XmB#JlCn&xX2aIGt%cmu8J(4xOrsp_jJ-au=HuT{vk5-v6; z&l_mXgckkZuT)h?6mOt43tII0D&ksAMDYe%v#}L;eW@BPiZ{@j<7*Xjt<9o%1FgBf zma501cmu6@(4ydCj)j?6bfz~!(tAT4h6U7^7ZHE?}p{iIb%o*|qT04BLMy^#*6mOul z6Iyf~s%kEZH_+MzEqZ-5ajj9Jcmu87(4yCus!gJJ1Fb#KqSse5*Sao>H_+M(EqYw4 zLaj7s$Qx+w^R-&IRu)mbf!2O#(Vu0jsw;{&&^q92wQ{ZDqId(Xzo13$U#d2W;tjM8 z`dV#V>y{|qK}$1it<<7;1Fa*_qSvyjDx!D;t)sqH2iNK+ ziZ{?Y1}*wG2&y)S;tjNp`&yk`>wzfVKn`_M!#T#gyffhY3Rr^Kp23lu*tsbuRP!w;Vb&X70Iy5egMaIG?;cmu7gzLu(vqId(XYtW+m{2oK(G^P#HTqId(XC(xqjYl3UF6vZ28J%tuMU#iB7;tjN(L5rTRNv^d`6mOvQ99r~z zsk$eMH_&rmBK zQM`fHS7_0-vBvDv9C^w7&aVOI)kBDBeKphp(k-t|;C>>!+`^ z%(V`P;tjNZ`C6);iQ)~kg2MU!{g-RS*kaC*H_!^k%KrN=`nht2Q@@Mi4YY#$TC1F@ zB8oTA3IQ#8zEpJ=#T#gagcecmu64 z(4xnsD%@6c^1OjoSZLAX+TdClMezn&;h;s2OI1}-yn$ADXwl=^X=nN0LR%21TfmT9j(Y2v! zh$!AbD-pElaUFH7MWT2Et;Eox$EE75DBeIT3AE^O9e1rSqId(Xq|l;kLsg=k=Hz(; ztz^E|N!KbOiZ{?o4lR1GRMkloZ=jXJ*E;Q5b4Bq6S}CDLzZX??P!w;VmCDyT>spUQ z@djF{eJxcXc9}Ee4Yblgi>{6Hu9a96Z=jVHT6ArwDk+LL&`Jj_x;8GlRtHhMfmV8G z(eF1@O%cT#Xk~yFJ+8~HwNn&tpp_9?^te<#6vZ28Wr7wxt}Ct;dAB)v-asoewCLJU zl|vM7pq0hfy5?GSMezn&S)tW7Y@Pn9`ikNWw6Z~q&hWi!%@V~MX#EZ?Izv@^Mezn& z*_{dse5E{7J7pI4f79fSDBeIThf^T}s?F9{WmWwU#T#hl^gXVet`%>OdA@i9t^Yx5 zO}l*kRpk-I8))V7wX(ZbZBe{|R&HozYd3A9s@|e_1FbyJ8l1lQ>r$cZ-_@TXiZ{^8 z3$3{IGoDekK@@MGm5)`-z^T*8hZx&!q^e`0cmu8c(As=x%3M`*%M6-Sj(LA&NK9 zD#0r7<1c^FedD9MZ~P^SH_$2xExK>0dM1iD&?*Hjy7zu|t?2vAv&1FiDVqBB%=TNH1gRl(Q# z=~|)on=|AMv?}^qsj>O+gJLseZw@djEAe67f?HCGgGpw$psbRDYNFN!zNYUFE0b*;Oi zcmu7*(4y;5RhWb340!{sCcaj5*UBi0H_&PdEjmM0)kN_ITFrc|n6A}F6mOu_+}BdI zN)&IP)xy_`?ONAG@djEgp+(ocsxP8=1FcrRRvg!gbI6=LZ=ls0TJ-lEROJ!H8)&uh zwc@!}T~WM&R$FM%<5D$56mOu_&euxdS}R2H23qZXEmapq@djEQe62*T^-UCSpw-dW zQkCkkIeFedtCO#l#I-7k;tjMqLyLZfRn<)tZ=lr$T68~5=33K5@djF5p+)yYRl7y; z23p;GtrV{Hk0{Ip6W_e4(B7R4KA_42jS zI5j{NZ=ls1T68~DwNw;upw-9MO6OXqMDYe%eW69ak5cto6mOu_&)3S}TG5Z1ljjYz z`a_HEy{Za`;tjM0_*$7;#%88@djFhp+#q?>Xs

    GvmCdz+9W!Uh8)yynwN#}M#T)+Vr$XTWXF;u?ppb$8EksbJF3lQuYixcl8pi)Q z^b;9W(Pdpc)CPVu9*=RfRcj9wBW|{mCk}Nd*-i-Yc4_%%W(6Y80#AMD04a z?1`%SqG*F^G^hui?>0q3L0>6G{XSV+gGA8=)kIeIai%=pjry8UmIAUQx6`wH8{-!c_9KT8N?zs&&v>HS$CWZA}nG8&vC|m7;lz^s07? zq7AAI&^lbNd~sF(ilPmwjnI1D`{x=}QO}t(qz$S~(E1WTS_M^kM9~J-W@u#@ddYLm zHy1@4R9m3cF#m#v+8Qs4HmJ6;3cT_2*P^$*Jol(wqG*F^8!P+yu;kt8;kETZ6m3v# zXJtPhE{~A!k*YA~%^A`L)ectnbMKrNGs>#UEQ&U$cCxb9e5C5j=BcVHiZ-Zrv7)~h zM_->tM82$Qm?+wy+Re(IM(ORX>Zn>SiZ-bBK&$)1T%OZ7C5kqv_ChOl(-*b1^-2_N zQ0-%7PvicHe?70t=oie%(+1UkR`%pi{776-TlqxM2Gs#*jk!E(uBuj|XoKo6R`$-e ze)dO?nkb4ks18D_=<(>DPY!!T(FWBaXid7cYMOqBk3`W1)nQOyOP+tMD%wSJhO|L- zgq1zR9I>9IP?b*NWJfD_ZiJ}dvW6=7eb;~5$nkT)Y`ZdEfx(FWC7P*Zzm3|z?eaUB*#8&v05#o~KSP|)cqF}|pJ zBZ@Yt&O@ugy6bOLCA@5^v_W+NS{eJ6_@Jt!DB7U92(97O-WO8UO%!cVU4qu=`kx-E zS|Exxs4lazKUZdr_|9{WIwOiUsQzXZSpcXoKoHv=%+c5_o&DSJY%tv_W+PS~W9l zD6DFSDB7U939a676MB9F^N%Rnpt=RE|H22Wq^%HF%=bzgRJWmZ?Nhy-s?v(04XS^j z)%e=w|5Q~FMH^IipjBsTo6)MeiJ}dvyU>afvC>;rGeyw`)jeoU{qt?$Lxg?4_KTto zs{7E&RyLyN4)9PEZBRXcR)wy2_Gl~oRa2!6s)x{;(tfY!cVC%B(FWDOtn6o-u?5G@ z&{lO(v_bU<)S(g$U#aRXiZ-YogKEiMbQS;6IS+9<@Vv%x~lq16m3vF1(jm^ ze9!0Jr=nKUl=$M1SRr9``CPM$WXp0kP|cbm*PbDz`iFt;e$pnAc|o_za-?L7D1 zx}s=<>LsX<|HSZIy#qzj2GuK8_P28>8r+?gf(WsZ4%Uj8A9HmLps6(jMZKed(Sx;c5;pnA*7eup=^KlZ#=Rux4XRPR{XldoRx z&)3@OFN!v(-m|jL@{wVqv#MGsiZ-Y|unPS6#9vc3uk)xwqG*HaBP;uJ%7zoQYisL) zDB7U<#LB*Z^_ZLdl&a7-%o)-K)n``r{VT+t$Fo(X7eyOXUs&1CHes7I?5(P@DB7U< z%F2EQxc;L2U#bR(q7ABVtn3|N;Ee+*Rjm_68&uyxg*x%Nl&UMDXoKnpD|;Fz$JX(D z7X2xTHmH6=tJrfl@Uc7RH0eft2bA}T-Q}~7eyOX zVOZI_&Av~!JfC|PiJ}dvu%ObmFMmv1XGPHlRXA4mSFe`z&7x*C3&)tfFXx zDh{i_WyD|e+r$s0s-`H~po$CXkCVMU?|Q>U(FRpKR`yx`t@ecp+S)9NHmKsWvM1j? z=ZcD|?ueodssya;r<4!xihJ&d!S9+gqz$Ts(At$Q%W-X`5=9$SiJ*0SOWZ1|N{gZm zs>IOBF!Gh>Zqr^AZBQkFR{VNz%4%zZDB7S(3atlIdYn|XMHFpNC1YjJFjf3Dg;ZS? zMH^JfS=r|+{{0N)RDBag8&oNvH6U-fcd8QIGtU=oP^E;{<)2$lsVXdrHmFiTt7yNd zpH(#zMH^J9p*8P))6%N`5JekQX`pp1#B9&~aFr<9ph^p^%1^$X)z(>2v_X{)T3?GD zYp&`)QM5soo|S#qd(i*YURAN~o0F#vstlk;#H-@DZxj+m8&nxV6-+kV^Ye0BQM5so ziIu$$n~z)NdA_EJq7ACdtnB-8nh4Qr(ZYP~6h#|USy%-=6!O=GcixkKAc{7qvO+7$ zw3C~(74dud7GtF^UB6m3xDgx1sYdrzynC5kqv{s*mlxd$##73!fmL)xIq1+BK3NB>lnSrlzh z<%ZVym){nvswIjxsPaH-;E4h!R1FbD8&r9r6?07NovK!gq7ABi(E2C!z%#1;7DXFW z`Jpwe!J#;+eu|``R%^A`LRat1|ZxM62 zwknIF4XSd`x?VN(S5+C>4XP@jHdLwkkE-sXXoIRM zsMy^eol~_y6m3vdV`YC%**P(S=e}`D6m3vdXJvn0uJHMw=VziXqG*Gv2B=R5Vhz&o zFx69YhO|Ld6V$kJ$vmI*s*0iws#>6`#3=3gJU>VjZBW$)m9t;!uKFFW6-66VbwE{( zKil&e;D#vLpsLF%uK7R|G`#!3%GwI^%$x>oP}KufCDtm>pS9%@MH^K0S=ryTufBbF zo3>huq7AABtnBB*trwn;Ry9KuZBR92Wq&U^>`U8ss`iMY4XQ?<;(f|mK-EK0v_aJv zRO$`wbEt~=+?*k8P&Hv??*M;=e|bKIz9`zDYQ`#pJj*FE zJ|3y9!J=q`syVB`|HEI0e?^<2YOyHVplZR&KFfVuT*$2IkSN-qY6)sh=#ZY@!M+tm z8&s`W*=Kocn+l#gK++fH1G#K~+T22303k_Hjk-aK!UU87PW2s5-N-h=sf+*Uc>dMN#R}TCBZx3yK6GaD4XW;}?BgnOci<>hbwtqyRS#B?rIlfD{(Gthh@uUuo~&$ZO~sSm*Rm+upy~y! z@89Mw)7CLjv_aJyS|`%UUUM6m3xTXJxObo!{H-R@Gk=ZBPwhWv{3uJDYl5U&}?&2Gu}NnO=qp z{0G?A*F{mZK{be#{n??)l?6*x{SZYPRD)UB$91iepY;Zaq7ABHtnA|&vL@)hwpNOw4XWX+?Blwc=E)9Ke~Y3Gsu8U0 zR(kYMbQS;R95!S0@9~_9{3;4_Z1X0T@-ClO=D$0IUF8R@|~((qG*F^IxG8g%J^ex z_NaO+iZ-Zbu(H?uo00u;s*3a8e6O@YHItP+`KDz~dj7n!h$z~in#Ia~hh0AXS5{k{ zM9~J-Y*zNCfOR+8dR|`(MbQS;99H%W+fP4JURx(c(FWCAR`xT%qL7(A*TyGNv_UnG zmAxO1kN#IuZN>j!&X6{!=CiV=Q9j0jxvGkbq7AAApr#Fe;(1l}5JekQ3t2^xYd-tc zA-%P=Toi3kEn;Oq_vU?&!Sn8LMigyOEoPNiT37q^^4xnrh@uUuC9DDm$6v!woSUWJ zVTO<93~7UEDJy&OD@Nb)d}eDbiZ-a0v9i~Erj@UEX={uq+Mrs_DxQ3YO=4G=s%o1k z+Mrs&%HC}@gnge-)e}*)LA4T8!Tf7Ik1Nh6a~iZkwF=aS^b0+&%2J|egK9M^`?zY9 zpT9)E!(O6jgK7<{WO5oshpgzOYLzJ3pjyky-Zu{Qo9Ovec}Em&P_1KSe`;$wbU_ns zMfz+`gEpwvv$Ee|n^ViPswygqHmEkRvRChz2X)V=>LrRcs5Y_+ysh%rp06W6sah|J zHmEkSN-b)5r6_?X!91FvpogMpgK9IY1fq6#d|XXc+%Lw{2Gtf;fs2p7=KhvFaBH-! z@}g*iYAY*y8Z#4DdZ}uNDB7Uf#>(EYgFRZ}`N?;uDB7Uf&dUDOmi)!3z!Pr2!~3FW zgK7sW`wshSRLp6r!hAKJHmG*8vS--*@{jSV(utxCs$Hz?)m!pcbkA=^8i=9|s@<&Y z9UyA7&o#6)MigyO?O|m<>3vPOZ;GnjqG*F^FDv`57w%c17pfkMq7ABjtn9Nq?tHcq zs$zaKXGj}V`$3glQTc|dvZ82%>HsTypC6UDTUAvnIDeWmOaMH^JdSlP!lx_OVl$8D<~i=qvx?(DM-**P zor6~0AE|q)>L`jfsLr#ppKYcL`>TH;f!-)Q+N;d)i4MbQS;MOOCn;r3ZW zlc@S4iZ-Y&v9jOcj}~n`_l=~#%o)-K)n!)p>OFL&THrsxY=eTzilPmwzggMqF#Ohe zJ5}`;MH^ICSlMTJ>&tl^Rjn088&p?W+0XO8RyOqf7VEAk+Mv3|%AUsL&pSPTzc(8H zx8Vi_(FWCZR#D7l81&?0HWa zD~dL#Zn3hbQSaYAp5Hkf6h#|Uw^`ZeEAPf+=kz;#CyF+x{$XWbUr7seovA8$un>Go zv_W-;mA%{KjFNw$s#>CGgX%7{niuKwO4SHav_W-`RWf#L+F+MxQEmHnibEae}Y zRCN_a8&r>2*{iqA@&9?Arg?X59TY_yR8Lsh?=aKzXt`896Gaq?7do}cv=iJ}dvm#k9Cb@=pq<|Ep=DvCC!Ua_*DzS^A0>-n2A5ks2Opbe_mtnB-8 zwE2aTYpakb+Ms&F%HB7cf9$zNRYy^@LG>Ri`&$0DeE03D7Kow^s<*7{v%D>9{Whx3 zilPmwcdYCcbvwpR&!@`IqG*HaJuCYTJLg36quNRu%A6r>Pbl^BV`sj47~HmE+b zvOh_!AAU2Gs-B`~gX$A2`}%tRu~y&>(B1*&h@uUu&#dfc>`f)-dOqnL5=9$SUs%~Y zTaWT>e%IDlQM5tzm6g4sUI&j;UsbBm<_u|r>KiNj$>HOz`?*zB7eyOX-=THz;aJb# z2lzu2ZBYGSWuN5?Rh|bfWP65NMbQS;PgeH*YfhqC*;L&ZMH^JVKo##%;H;|O!kE*b z4XU6B^zXmyJ!(zCF~L-o6Ga z3eU3zw)GA&NGrB0=kF zk+`0pq}GU{4XVhj>~+{D-agOW=9Vbhpo+pOnVj|KkcnUGcNjUmIStyNipnbRVVA#l zPM=s*RZ&s2K^2Wv;JEqg{r2+nRP_=?8&uI**}G_+c&|Kv(`l_J+MtTT%Dz{|NwM#~ zwyuk!4XT)|?5i?S?^mBxg^6HJgEpvQv9edxl67&WsLCsfHmG8Q8rF4IBUK$l(FWCT ztn7E#Ip@iasuqf(4XQY-l9+=J`aEgyJ5^Ui(FRpqXf>&D&GS2l$PvwH&<0gJR`!Y- zmEyP0+A1oFHmKsWvhT2^K94A?O;NN#m7G=JErGv!Hu;Aa=6{P8*_;M# zP^DmHKYd*ZTQ9$UhxtU&231N{_Vu+Z^7_rHnu($fs#L6^%Xip6UCNWHri-Ets?@CP zXPfP5hI;-i;4e|ML6wG;z4y*Z@YwVBmS2gY4XU)P>}z>dyS&%+J4_PAoFQ#crDJ8! zaD9$l6;xFhMH^J)XE(FWD;tnA}jS-rz$Rkuaa232-e z_70G{>p;)riW1G725nH~U}f)7?+1+aT!)23(FRpcPz72IKB(VeCsDLP^*>hjS#DEf zWD!*hM9~ISE>`y5yE$US^QumYq7ACttn9O#WZu`Js=kP#4XQlQn$_~qAF47(H)lv2 zRC!t1=j+Cd3FTGQ7eyOX`9L+B__MUC@uFyhDnF>N^Otx&WB(pX%0LRr;9b zG-!jWIH+9Rvw1#m)D=Y=R3$(~N&KdRwnmGh4XTo??7g@9`x@(1?G{BFRHazicfF&# ztBh6kKoo6Im1bqnFkb&|164(hWln=OsLHUi-(iB$X#>AG#uka>xq7FGq7AC@pzi$&JwjXiMbQRT1y=TzQX=QdS*o6hq7ABw ztnA6x+me5hs`#i`(t!)vzEYyaF{eQrRCQR{KglXk?ZIkQB}CB%Rb5ueq_y_aS?A2SUNHEX4LkCf`LDd3O z_fYjcchPyGXoIRHEBh=j>i+eXeurm8(FRp3R`ziX&)&iFZXP_oIStyNYR$@?VTDNF zJkM8lQM5tThL!ye^EQ0jOTWYBqG*GvEi3ySUL7*W^RLEch@uUucC75r4o4HW;oo$d z7wJh+v_aLLmAwOeY4@tBeup1K(FRoqR`z##Us|PGs486obB44*)sdBbhwa+p;#yS= zMbQRTCsy{|yj+TA4OER3MH^I|S=m?RlvGPHtJ*4xHmJI=vhT3VHWm0?)g4i^LDd!1 zv4Xq$tBRP=oCa-Bbz^1k0CP$%&Z8=~DB7Uv&dR=jC9E;=hpG;uXoIQ;v{qkiUR>2; zQM5tT6IA(smz7m@O%!cV^#%+GEuPO&`9;wN)j(GEl`?7K;=bByBZ@Yt2C=d~FFzQ%s*S1{ zqG*F^Ff04}jeUKWr&o1M6m3uqVPzlJpvTjzt9mDjHmHWOvaQZ73wr(pJV_FBhO|L7 z3|e~^obuc^%88;4s^P5cU37Pm*b((R>@A8ms78Rg|GiRVRZB$C2Gt*|>}z>Z*ilzi zofAbHR3oAF_q0h-RE0`vPJ=e6{)E=$r^Cyr$|8z3s7A4}Ctu|Di>|6#h@uUu(V*ft zUFG>nYLY10pc(@zL%3F*w6#wZZBUJ6WzR5PoWeU*JrhM6RO49Ld({61bSkMTNiuVW zv_UnVmAy6|Jo++KRZUT}K{bJuz1w75`Q7s=Wr!%+pqj|a-VZlcEV5TyTSd_Z)g)+j zzEz>Os>h;egK9FUSQowjox1Uoo712Tswu4OXPYpgH#N~#c~P`MH5FPz8Y~^EYOpBU zpqj?Yp2m`C4NIxoB8oPsrbDYr^m~7+dL)WAsAjOTpHk9wuO3NN+!W?CXoG4dD|;Hl z?!EMUhebru2GuN9_Vsl!(zx&1>LH3YsAjXWpRr#@4;8qf+MiPvilPmwIjrnEQJR_a zW~;g&iZ-a`va+9hgF1g-tm=y>+Mt@p%Kn5HDsBtUcbG1vIYZi@n$OCxRH&qmEP%UH?__p{f@5vJ@XkoriiJ}dvMXc<5<(Pt}v#a_niZ-Yg zv$D_EzeV#+SCu-IIStyNTEfa+QMYcK^1LtC6h#|UOIg`Z=I_@`zOJp&qG*F^8LK4n z_^+QUT~^frQM5s|oR$5I-EL#AS*kvZq7AAQtn6L%z=AlQ$CWg-IStyNS_!QmA#!+r zk}4;PHmFvyvR7}{;Wr29ci2M|ZBVUdWv`9Z>%6}sS}uw;fGen}K< zP_1QU?`#<-rr)XGVX!pjG-!ir9V>esE)P8?@MDC%dVd#18&vB-{oHXQ@CImA6H&B5 zwE@(Li*W)kP^%`2q7ABztnA~u)T!-ARR=`T2Gu53_KM1yD(Z1nZ$;4t)n-=qiuw{^ z@=H|-(wZ}*4XQ1y?0tT~@#BFXg6-ofDT+3zwz9H61uT4%<+Q3!qG*F^8>_&R#9uvo zMOdV2sVLf@+Rn<}vHPd0=lQAahA7&g+QG^`uBA(Q2AcM91y5&AgEpvkva(n2mCp?V zFB+@Ti=qvxU99YH4<2>x@L5%DQM5s|o0YvEPWjyJi>h&=XoG4GD||t2Gu@R_VpDk*WIV8Ql>X&NE=l9S=sBbf4NIrR8xiLG>3a`^jNjrUKB+eREJpE`(do< z`_rikm%*F{ZBQL%Wv{3Ld6#*9Cdw&_HmHuU3j9dJUyU|=O{1-5qG*HaD67DaYW(%7 z+Pwa%Mv9^hs$;AIAMf~UcIvNKo#>1x+MqfQYG%xdL$&o)6m3vlU}e9< zCugsOR+T!FIeFTkx(KbiGnRQyqlzfnpt=Mq-?1~EYh$1&+Mv43%6^BHKL+!Bo?j!1 zHmLrFR;?9_JJG^?T@^(eR98UdKbP3^z8o^MIStyNy2{GlqeAa|bX{9nMbQS;HE7-5 zJ+!;3`l4uq>N=>fDXwi-HA)n1P~Bi+hhoFQ#cJz-@Z*ZA1ocd2S5iZ-a8f|?#I zOnOxlMbQS;GgkI-eT*^eo~nbQXoKoGEBgud?1z`0@9@1S+Ms&D%Kq$7CF-Jg+DiDl zIStyNdI_pbnDb3kl@vuARIgasd+*FP>jTGWpRdlMXoKoCEBm-IzHO3S)f`c@LG^}} zeO%KsWIn0tuqfJ~`VZ9jy!GpwGPUX4xP7_5NR3BN{$F*cvoxl$S_W3#>iZ-Y| zv9gbA)wf8V(|9h5HmE+cvX3ia^&C636*Gr9L)xJF0xDFIlAh1K1w_#X)mK*baot`x z;+M8siJ}dvZ>;Q39Cz9d9ja=wDB7U<&dPpTj!@@(-~jCz?iNKGR6khRdsI-f9j#Q| z5k(tRKSAYB{;;X4C^^j;(gxKpR`%WePOW2}Ps;^G(FRpe;Kzm#!K@nbXmCGmwHHMj zRKZx;$CYdNy5*{7i=qvx;H>Pux9#x*l~tV*MH^Hhp!I2H&Lpb7i=qvxkkG0zeoh@# z8UAO^kT$47v9h1pzR$eidH<>}iZ-Z1v$C(0Ed>ux*4Ce*XoD&YEBo%ybJ#A={cw{g z+Mo&xDpQ{CIkojr6m3w2V`Z=T5gX=@R~0*#IStyN3ePIOdy2315>_ID1`#&^x8ttFypgDMg$`&*H&k7iC%bx9O$P(=n+Vd0UPs>0+p zr$HN3QCQiZ&G#qmF-BEhQM5r7m6d&#@AfTMOI2f0v_TaO)a`sxtE!qLiZ-aCvkLq_ z{1r7D+6tD}oFQ#c#b=dF zS{p)^zo{ytDB7S(z{>u~$dw@nd#P$7iZ-Ycva)yV)qVP$RW)4{ZBQj*W$zm^rzPsG z>bNM{ph^s_8_`;CRrO62ZBQj)W#7M^^~~=1v+NA{%o)-KRZ>>={p)ns2dlMJM-**P zC1Yh@DW~e(@LcnwM9~ISa#r>Za4ui_Oxgv7?%3LM_1+Ri8&v67*^@86=6`9m6{>(a4ceee&&oco_tRqC zSM@(pv_X}Dm3=M8IXHEQs+OW?gDNAao7t*7Q8ifRPurp3gRuM9~ISc2@Q~Ec7m7dHoJ|h@uUu9IWgWmF!g48>$|Pq7AB? ztn834WV6m3wI zgI3b^M*=@A+Rp$Xi<#4)4XX0cN`7qbAyrvL(FRooXubJ5)$>zZLs7IrRS{YryFd5* zgg8bNZBSK$)}`)8cIbDwOB8KTRfblCYRe|5dL)WAsH#BgOXQ%Qs$v#5XGj}VRiU-4 z*2S`_3X7r*s%p@hS^q%bS5x-+>L`jfsH#J2?U#6-Ki8WhiZ-ZfK&#Zr37&V@lcH#Y zswT90l`Z#4zr#PycgQ^Luz#n__SMG!PJb%`9OcZTUHDzT#rPOb9!gD|TA&NGr znz6EHnET^|S^6EOD`n1*HmI6IYgXA(-&NHTMH^HtSlORAQXY-t`IItT6m3woWMw~# zwp)|b^Jk-5M9~ISD^`I&0N}5-J#)U$@9>c*+MsI9Dw(J%?@nJ=6~DAO4cee;!^(cD zjJq-Mf2t~pq7ACHtn77oXiA&hss@Xq4XSpm>`ynV4u|x7GT$JIHmKUOvY*T|c8|>q z^Du9Sq7AAJtO748{wh)8&t3W*MlNGcgEpu-va+oXufu**l}8k9P<3Kuf1;1qv}aLO z9YoOvRcBWA9`z&5^XIA-ilPmwF0Aa&U)P>S%cJVFDB7Uv3hGj+>z;SLx1wl+svD@# zU&oKoR-Cft3~7U^J1cv)86T~g=TB4%h@uUu9<1#1^=H@#i?r236m3xTWM%IggU4^# zuWFJg+MwzMs^7XVo~4Ei;VPKZpbe@K&>DAld=pjKM9~J-AFS-vTmIx1&nNSmqG*F^BrE%_ z_akdBq7ACCtn7PbnZvWLt7pA0?}uCSUH1G$e^eB0P)&f=i`5Y-YwMjT+Mt>Ut&x34o>!H)k~u@#pqj+Wo?(Mz zwXUivCyF+xCWFfTAWc41eMHd))f86t?V?|$<9#1Xc#IStyNn$F68-Y9hYw&%A8IYiM0)eKhladi*AVS|2$twqrW)l63Q zimG0<`YBa2M9~J-ELQeCrSiBg`&1nkMH^JJp*82scF*sKUW=j)syWcQ^rF}pZN;x* z&X6{!=CZPn>uucMTc|1_iZ-a`v9gaV!5j1U8qNKnizwQlnh&jW4LW-6y>ms;2Gs&k z#lwf&s^8%WQM5s|kd=KcH*eCy^S8J^h@uUuMXc=O3Y#VS9&IJ7YR-^0s1~!bXV|4l z@Sdv5i=qvxCD0mGCAjCOw%(#>gK8+s z)gV!{LA9EdeZGDRweOs&)uL#FY7MmZ<~rc{9nn=$v_Z8NTD>piIjyb#qw1cc?MjnA zj>k4SxJf#;ZQC8&wr$%<$F^ex~+$&USj<4pH4- z4Qf!WXQkh(OY&OIbvdIbYEW%prQfUgj20(sR&7z#pxOxP{NZ4Kni?*O8dRHD>F*Uf z%kt2sHi@DJ)n-=uy>^%1<=he77ex)KEv)o=tuN5Jip>gN!(T&cP;G@-xie05-oWG# zMGdNLFzeu}x6akPktk|VZHHN3vc~aV{OIvDP82n$cEGHl^_%LL+98S>R69ZS{C;DI zsVAbSLA8sO{$8=)j@V%;YE6F)sX?`ymEMak4`{W}R6bGEpxOiK7^w4b!dKRnXKGQPiM10;)v+ z0tHNkt?jP{HK>k)`ttd*vxWIYQG@Cjs98yCxT_(G8dS$w=^FMa9&)&C;Sy2QpgI96 z)})cn8<=aNs6lm-m9F8`S$mV&tgvI|rvX@|`;wL}y(sLry|b8pQO=bSV44N=sfI>$;^e)Y4)-ow4_hau|vt3eH_^Q@Bi zH-y15Mf$wRRCZC+pt`_HxA5bcswGUd7DWxJi>#u_tSue$Ie+gkO%ye#F0s;gL=n># z`qyUd6-5oI%dB(@+oe9_Jl#AOMGdMetn`_v)&BR+6G!xV{u)w)>MASm@Zis$OWx}! zukb%bMNxz58Y}%?AvW)Fu3ue5QG@C_sNGwBJ9n^iMNxz51}lAPn_hZm1lz*nqNqW2 zla+q2YUv7oGxbRnHK=Z}(l@u;Gv=6QDtUc>4XHtOo0aYxU>LQ97RCht8d>i0g9hQos2Gu=QdR<<)V0uHFbzKxSsP41UHGF%xaX(Wb8~Ce1 z4XOvMbl=#St9@2e*+fx;>LIB1!}A?6RbLb}s2;J3F8gcohm*>f8YzkzRF7d+@)oD- znA#|c8dOhM>Aq3t>!NiW*ceVAiKGjUt-rA&MGQFJab#;(z8aHCGfhs9wRW6bUnrHg!}K zHK<<0tg@fWIRC8UYf;podIPims-6F!&5F^;UwLX!1;VU!m0C?Tm0J`wsNTY?LFd~Q zHPuKIHK^XftY1L|o0u9QiW*e^z^qrT^Ehv$*NdVC)xR)nS?3EiY}Qp#)S!9~vvU7x z?VLA$ilPS92bk6A$SmjCJZWQp<*7mSk(Hk32Uo21)wZy#C~8oB0+pjgrUs^ZiJ}J8 zf1vjC9p&5+EfYlzs?VUN?#t$!qppae2Gti@Kt@s2p!&v2uPHr>wY*@ei70ANeP^ZjQ31KGJ9l5xL{Wq42P^L}os);CSP(@(n{lTAfZEia6*~W^Z2315>-j2qfOlK<{vRNBM zQG+THE4|-1RCV}#QkX6j#2)S!wF>hbNL#Z0AW<*y+%r~*Kh3cqlasXC&lL6v}2fNWv! zIH{Z~>_k!2pi0O}_uio0<5JqJ!=k7`m55aone}Z^4rk>9MNxz5Pgc5bOzcphw#|y( z+FuQ7P$dTSZDLX99=ot8YEUI%rTcuCaIpA;jUs2ScO3h05jW6%wWV2ZtL{Wn(4J*Bm8WiPI22)o> zQG+TiE4>F8ym;eKQ^DK%t3eH_bgcAOp7vmx^Sv^Oq6SrZR=W4r9=)`f&8jYn8dMor z=}}o@=OgEtXt*e9P-TQ!Nk?9PX|r~Uq6SqaP+N_?Us6myDmEIrb{4)HBsa2w=L6x0V zA~{F(i|PLV3ce2K1+ZN^!MGdN4tn{eN z)$@R}A2t?64XWI%yayrvG++I7s?C}%iW*dTSn0~==yumx`O~7PL6sL&^;8MA+pM3W zs6mwv)V`x*yn{y1HW@qkYe)^M{GjgrUABp-Mxv-eRe+V=5#0`aJ>1k3QPiL+$Vz|Z zu5nV|HMK_+HK+=)@*a2j^Jg6Qf0zAC6g8*{v(lAczO#Khn-#C4zZ%q_D#A*i0+KGu zd&X2bQPiL+%1V#rJcHLCG1W&DHK>ZQ(mV4{ty-5cwNex{sEV`FExeGRsKa=y6kTpfOkq6Sq-R{Fg%KW*Y{VY*KK8d8I*6f6Ce50vMxiTseP42rb2e{*N_@iRbW8dTL->G5^rX?pL(qpLAg6g8--!>s4I=l3+VSrj#>YOvBPQPq7b zXPCMtiW*ckStXZ!BgMwc9ZbdO>aQU+sA{oFChFDq{mo645=9NF+AynB?yCJv^%F%6 zsyd)TPYcC`KYEiWYEac><-LUBPrm+%+uE$>qNqVtkCmRI`sQ!yJoyH6^H+l!RP|Zu zv7Go!x3o5^v?yv&HGo;E%3S(os=Fv^P&EWqtW=imrk04J22~?gx*t|;U*MssOQNVj z)tHrDmn#f8=bWR0b@x|;8dObK>Di|1kbC`YRvJ;%plZrWpE%k^o9x`PRTD)Gs%D^i zd_39NX7v_D4XWm#`d10&9Lw`XQG==lsFe?EoU>U+L{WpPC8+9$0y>&{DT*3Ytyt;P zO~P9R92L2Tzw*?eY7Odsn(v`)RyI-8plSmuS-2g}%GVY}4XU=R^r{!F*`dNVYoI7< zP_+ZKV)@}#rdEie2331jx<^ILnRSq<3!hRS-oDs?MzRsBBZVKw?t^MNxyQ3oAWGUC8*@`6tHLi=qZq zS5|s__1ja>+2`+yq6SqrR=OYlIWda}}c(edNM>@w9`6g8-NvC`+t8*Rq_HnmI?HK=;C()WjFL$6+M>Xs;K zQ1xM@t5IoehGnLr^!C?~8dQB*=@vfDls2`gT%xE!)eqFG36GuYa(hwKpz6=c+xhtO z@nfu(HfxC}YETUT^|i`f=c;!{6g8*@veLabNrU`5Y*x%Z{%TNzY7i^E@13;twDb30 zMMP19YA`GPy+-v55!`0A6-5oIA*}SM%y)3gP*V#-lK!)TsBpyF^igYBbEsT(rY$Q-PwWK{bYz{>p6|Ts&YZaX)`Gs6jQB zl^$R7`vg=sRb3P{sK&vph>@cmGc{HeHK@kJtm${IIPX#pilPS91Xg<0dsH&8zRmh9 ziW*cCS?T#O$HajROeN{>uLd=!Cb7~x*uAUL+%i=`6g8+O!>sCe4|tCe`YZPlMGdMc zFl$G+N7GC#7ex)KsW5BB(F5a5T@ghMs%bE5!JO|WO#K!`4XWudYfjLco2Jqa@Yj$U zR5M^!k}Zdv_r0}5QG@DlnDt|Qy2UnYxF~8+&4gKLV}y6EDVs!5gK8Gc3co#F1eka4V|+FhVW7Vn)S#LJvkGS1;qAz}Z{!k14XU{?Yx>UZ6-_l2MGdNXFsniT zo~=zy5=9NF`7mpKJX!$V!o8xXLA3y8t!>`(kf~Rqs6n+5W^EtSyt1j-gZwq52Gt@~ zdaX>O*qctXiU|LA8>Vo)5z`FYTOr zM~b2b)hbqc?j4b6vv<3#d(>7@)Sy}ovjRp$A8YENC~8oxfmzQhbm?X)@(_PDs6n+B zW<^VN%lW6O@`$1a)jCkerccaevs#Fv2Gx32x*D;nce!h7swiquZGc(1w;rBu>VPO} zP;F$TN6PqwN9&mi6h#fHO`s~i4e9I~@rL?qNDZpZpthW?=$)gvP;F)iL25Je5D12C&$#A>^3R%cPvpgIV%5*?2?#MC@d z)Sx;9vz})gn#$B^QPiM146~xdPnX%$XHnFkI>O5PgFhjco_C)0l8x}!kQ!7+S$U^v z{&XnP{-Mn(C5jqU$5`pFd?&@Z3Z~kLq6XD*R(g&KA2*Hj?rWAPYEYeErO$eeOYL#? z-V>szL3NUqx6AV9TlSd6YzyCtq6XC|m^JZbluM>!kM!4&8dRrYR+@@iLYc}ZiW*dB zVAku2o1J^MrlP1pbrxpLYI!A(%^EF=8dT?CR@EKNKbhJjiW*esVb$`rKx+#hpRM%kEKQGfce^VTCw7(kEpt=sT zI!Bo0sEnehL3M+b_XmFtMU2GwI$`o6bJ%J!K|1&N{t)e~0whOF+hE{(a}2-cnK2pnAbd zS0i(dJil$$MN!nCddW&xV|2jdRi?g)q6XC~m{qyOx8bIejq}%#8dR@g){xz4pPDK! ziW*dJVAkOGtHPSK!Xx!_{fB z>@f8~6g8;+VWq#<^ykg9n@TX=Uqfn8{R^`SM4Rp$DaA!mgX%rZ`fuB^iZ-i*C~8oB zfLS>=)h}x5Z&B2s`UtacS5s6q7~%nG}1*>h8|CirVe z4XV#DD^b#t-jAUBMgdXOp!x!{s$NX*yfbepiW*d3S?RrKuMv-&{cw^fYEXS+rGJC4 zX~kmad+irR4XW>~^t|z7>@Dvv6ZCuiD~cLaKXBI2i=|8@nCPz|HK=}qYL;chc2ku^ zQG+Uol|E&c&)dm6XmksQh@uA7FHo~arF>#)vnXm%{br>r|3~IpRZTq>MGdN8-lfa_ z{a?q+e)X19w=n7?e>JE<6&zHLrZdx+DjDWkT%xQ%sE#MGdO(taJ?v#ILo~)DBV9po+js&+}EY25W8V zg(zxJMP#M-Q3+1|SHx8GDgJ6ugDMg$?*^1V8}o;4X)2c}YEVUHrO(UdPo9}=s)HzM zP(@*-Yq+52*_o#1h@u8nR93ng=lVREX6m#kYEVT3mEi3bZ!T=YP(^2@M@r|f z^T(JsrQfUQ&nC_pyP_y+P{m}W*X3A!Gv~5d{Y6oODi$j}z9yD9>AXu> zCW;zVu|Z`owkLzlx+01iRDXba^!}~$zBl+Ze>JE<6^E6s#X0aEPzA8ktKOzCbIY3gEQ%Ub z30Ucovhvvq=Sq}xy1$0hpi0O}&l^{NMT=y!Dv6>7RU%L?{}|iL)Id?xp!$3*2?cXsEW2RJ5*8dOtX*9b+n+C~8m@f>|Ta{&voyjYLs{sxZt7 zc(*32%^E9;8dODK){6y&CYahOiW*c!S?RGHty0s0rk;wT230XudfvzxuA_4g5Phz{ zhSZ=c4zrF0<(Ocz3W%ZxRS8x)EB44jDNVHzMGdNwtn_>3zS}FksTrcEK~)N775e%8 zm8m15s6ka4W=+2s>5HjUj&Y~j7`0aZ+;Sm3V)HK?ky(!Y0znWRf~ zQWVxm<`o%@ZVqNqVtmzA!3+(q;}pmz?PMNxyQ9;iZ- zH)k_7R}?j<>a)`4uT%%FIrrEnL{WpP0nBQ2E~axVe-T9us)np|<+qM|<2?B$UF5GJ zHK-cFtW5PEG^4`*R2D@Is>ZBz<@f!OFUVA1QPiMn!b}hiXq!n z?dq0|rY?)3230dw-c2EY+U^Ve$kb0!)Szk(>ez+J&ReVui~TjE22~4IdVJ-HSGj`C zY9NXlR4rL~ue|w_RY63#N{Vq6SrKnDw+|k^-i_ilPQp8&>+1 z-8N^<9H!DQ@mGTyRBb^WD}H2)sm7wHLDi0xo_kYd$~V{43{ljeYR^jFI+lF?!8v1} z6h#fH4xpx1Tbk2m{T4+Hs*bGmSgyH0_bF33m-?$g4XRG8^hmjIzs4L>Eksd+sxvFS zBdXuG;~-PhMNxyQ3oE_*nl_`xSW|~ZQG=>0D?M+7$lGh1sdu8NLDdarwM*8}`IQqa z^H+l!RNX-x{_BjhN0k;u4XPfjbPWgO%Fx%gu$w4qQ1t|LvBWOt9JNFgHK=-l>OSL{ zvu|7$MGdOntn~K^Tlnx=+rr?>{nelbRUc519z}4@Q5i*1gQ_np{gvaV$o|`A)fGhz zs(!5WE%DkHwGWyaA&MGQ{aNYC*Lv2)S&a>%s6jP=m2TmvJ~PAEtox#R{Fh$OeyEwi{=tV4XVMcbf3S}Y|kv)!bYN~K{bSx-Vrs~R(-aq z38JV$HI$WJi9+8R<*eZmQPiLs#!Am@yEYW6WV1erq6XD)P;u_9an4ccR{Cp54XP2K zHb?p5-2mu4Koe2apc=_4sekzjRq6XC{P%lFbbdHqsqNqVN8dQZF$(-wQ z$W{LLq6XC%R{FlTL-_RbZ3}aYq6XDiPzU?&^iKJ@8XZJYgK8Y8<}06GF|||_HK@k3 z(miTw)bsaE-4;a+stKS9^snQ*O^v$RUkz$dO$0S_eVC~>tGFm?P)%Z`d+*v=Yg?G= zEs7dclR<@ell!5m)uO0DHHDSl5e+P!;G(HJqNqVN71X7iqiUFny2f7(YEVrB)$Q5U zd8Ueqq6XD;R(cN*XV{girh1B^2GtBuyFQn4p7mCUq6XF9tn{vOeDy=lyOisqs6jOo zRI*gn7uptvU+b?1HK=BR8u2N7TT}T(QG;qWD?LZ;o|rn7sg9zkK{bb!?on@h&UelL z%SBOxYA!21mg8^k>AV%WA&MGQ^H}NcRjkf@=WiY(uk%-f8dURPR-VQQ)=}Yq3W%Zx z)dHB6z0m27rn-uv2Gv4VdXF9aUgg53mWZMT)go4UUEZIx)-Y2yMNxxlF)KaW?ENd= zIa6WQ`>R0>swJ#+KkRd3n|EQ?)yOA`8dOVJ>9M?QLckkS9Yj%sY8lLWxp-MOQ;S7W zgK9aQG;p)%o?%cm~#gkeuKXn)Sz0)DzWShx63seY_sxrs0R`VW$b>-KHq6XC(R{Ff0CfRrASiUWa8dPgp=^fF*W+S{G zTxW&a=&uGfsMfL4yRT98x;sZoR#DWTTF**X;h5?)WHKYdB7Et5+XA3k{ zMie!uwt{M06xuo zsx3uLMcM4H1~sU5veNT>j$qlGf6}R#C~8pcVx?!BSOrrivst}GQG;qXs6*pAT{g8& z6g8;!u+qJE_Nqer=)M|Cx%r#a|6-Q0-%-=ia?xW-c~WUKBN`_Or?; z=cx46`gsS9?i&L|QG@CLEAJ+QKaVQzb5>)kC~8n0WaVA>`O__QB4^esQPiM1#7f`y zM%yv_fo)-;t^R6IgX%D-fIq5CF;ztrHK>lT(lxBoqvSwSBSlez>L@Ec_m;`#|I^|A zx7;m?8dS$v>Gyi_^^W&npez4M6g8-hv-8hqG zilPS9Nmlxl9qwMllBRl#q6XC|R*7ZSkE2(dyRYSG`ojI%l>{qNqW26V$I#N7~t} z#iFP|b&HkWM^##QsJW@DqNqW28&sx`!M%%;u11h3YEa!_rQfSUo=}rbrQGGOAvLJ( zg38e5sB=GGOB6Mz?y=JEwe|bKAe%Kt6g8;sgSxsZ*ho`bL{Wq40jRFu!%Q%BR}?j< z9RTV`IswbdM z<=cPD)BsV`pnA$GhHT-*L-|&iS|y4aRL?+dobuzIsVkzWLG_%KcX;sU@%0vmOa+Oe z2Gt8tLxwNkV=CPqf90t`^^%pIZ9W~p>^%9_7DWxJSFCiOpPD$l^D7S*MGdOgtaJ@q zt@%{Zws40iYEZplrN8o{EODK;SdT~=)c?4Xi?Ol`WI%!>s9rUsjZ@@LG>PH&AhSg zi>dpfs6q7sW}W;eWK&b&_xWo`4XTeYt3vZ9&fQlwQPiON#7gg@PIkKHTwxoCq6XD} zpjw0|Qq;C^tSD+weFk;pQbOnXYo{n`P<>&g`+VZ(3I4KK&qPs!>MJX~Bl=$B*LPEY z?DyA@8dTp{=@oY5hO~1{l@Ub^s_(4y9w1V*fe%gf7DWxJA26#%?mpfvmG1MaMNxz5 zC(OFFIE{BvQgvGtHK>AE=^BRK+pvtO2nYPtpa#`1R=OGqmaoWTD!(XdQ2hqA`D(TU zrrL?3230Wc(q;etuQ*{lI&aM8ilPP;{Yy|n2G_lJ@SbyDZPr;))SwChvx*$Z?HrZg zL{Wn(BrCmxecO7&6`PgjpudLHpbEt*sa#VcN0@irRDDs@pbE{(yA9$`$&S;UfAVvR zC~8oJ0rfIrut+xRlqhOYg#}gNe7zHb4W{5-9=G@Dk`W73(q*m@@i4kpo+#SxqPp6 zw*#DO}$`_xRS}KYfRDZJ4UwO^gtVL&F#EP*(Zt`R4G{L z8kQcHFPY5>6h#fHl&o|OFV?%@-03Aa;jbYzs8X@gHC&lxpLaW;t5HT2HKZHFK)Sybw zO4qPeyVK=OWfw&astl}j4O2#q?>y@@5k(EEj4*50kJ;yK)?`uCpvnZZKJF{;JnJ10 zMGdOVpb8Isxx;3?6GaWGEUa`5FAT5doBYB=%E3yvu+8%o&QtckqNqWY6K1_B7k?=g{wKw0 ze>JE8dUjM=@xb_u`;8noM-&ipaxZbR^F{7e}0DBdB{{-QPiL+z)IitWS>&*w5b`Q zs6kZ_)a-{3oMZX0C~8m@0#zv6(2+LlohWKh6=tQ+uzT7pJY_2WS${RCK~;p6K3DEu zxM!ZJa-yg~Rg{&UZK6epSl3j4QPiL+#!8Rnin*>#Ftt_`HK>ZitV8qaI&U5CilPQp z379o!`0#-?E8;nSHK;*Vl9jIE{LD`-naU@M8dRlN>1vD(IpUY8cA}_3RT@-^&M|tK znj?xDRAoR7T3pe&-#9Ib8dPOj={4n5p{hM?);Ceqpen~opO+uJ4q3-ks`LIDQiG~I zD?N*bpH%6Isk)-5K~(`%$>0y2JM$@`s6kbcm2P3K*fT%atW%<>K~;&BK1ns7(#1Q4 z>RB{M6g8+Sv(mFowP~}wlYy$N7yQ+r2Gw7z^hqjtlX%YW)lw8SsH(8iHB7v*hjV<* z6-5oIs;u;Tg&#R;wQb=QQPiNS25Ly5X3l;X?xO#_s6kboRWdn?rVkq3*k%RBCxyGM8dP;z>6Pepq;5A&)e%Jvs(P$+H7eftJl523 zQPiNS4{CC)X3n*8n<#2fHDINyktcMc*EZ{!C~8nOWTi*t<&uN0n~HhaUqfn8HDaY} zIBfNkCZq6SrCR=OIywzYCrqpK)tP&Hwte`_|N;K$H5Yl$doP&EZrvv z230dwQDi^7F>bT>NtR3WBzv5o;*N_@iEm-OI%J8GoFq@TM z6g8+?veMtH+pc+2Of?fl4XReG^vrhm;Y#nNg?_J@qNqXDnw9s!z@O)*zdCn%=R{G1 zstu?PXO3sKSs||at3eH_wygAO9&|5GWmCCCQG==-EB$+i3t76pFx5&FHK^LN(tChk zEy6ng3((o3s6o{MW~ER8Sl>pz6*_f8}Fq$AvTXQxr9*da%+xD&56S{Y_=M?yn&=sCu%} zd+d$Neibs+NE9`wdcmykr4s)(HANIPsCvV!=5bb@H+4i5HK_Wq(sS>ISLITh`cD)! zsQR+fJ!<2v0oP0=x#6z{HK_W*tN{Z8oV%2YqNqXDA7(Xgo7%h0(O#ZanOY%=8dL*W={03v*4zb6T^B_SszESoPx<4IO@+DXuLd=!2E(jYgF0L=l|vLY zsD^;*)zAO`Gwbj3%|%gzYAC36=lB1#S<^*PgK8KnJyHsfo!QpZF;Uc@8V+iDp7YMz z)UTqbK{bMv_XmHfWv=G^2>L6hyXCJTHK<0i(*3Y}?#vfW{UwSTRHInw-SUm$$GjUc zoi#udHK<0ztN{T7ohObhqNqVNhLzq&9S-V|-)21&MGdO4tn|9v<=4O7&8%)=l-vGl zP=jh5E8Tk=uRQ&isiLB&K{cM0p4r|+8dls?XHnFkn!rl$=S$u^^wiX1QPiNC$V$(L zCHu8#YU+k4YEVrA^)ku_=S^VvJN{}=gK9FU3isAK_r3WE9FGTh;!%sZXM)K{bPw zw^{tD5s=%t7fo~5Uqfn8{mttC&nanVzO`A6MNxxlCM*43>nlV&V``izYEaE$rTgKS z=)s(~SUW{ggK9P_-RBQCjMvg;y%I$YsyVFm`1;j7o^!T|ch6r9YEaE(rPq|23&uO| zQYwg|2Gu-PdZg68-C&7rVLwsSpqkH0-vg}39L;%7*(8b@R0~+?@inJ#u=Y0Vr6_7p zEo7xDpDSp1LsRkZ`>R0>szt1H-?)73?@p%5iJ}J8VpjTlZA^K_xf1mdMGdMYtaJ+p z#Hbg+W-S**4XUNA^!_mG=vG0dZiu1=)iPGz370=IxUJCRBKr28deDS&$+^W5Je5DwXF2qyD5BT?=Sgv3j-edYe)^Mb*%K(fD{)#ZtEN0jD?zlPMH+7Gkx^tqqYX4Mo$4XOj6j@F$z z&D01{)Sx=ZO0Rm)iX?QN=(mZY2Gt=}G330NAXgdZd%X}v4XVSe^lF|a>wD))6#c2c z8q}aV0_x|W6+fu(KP5#`gX$MSe0Bf54spK}H{ zA&MGQ=UC~z&A9EM(%GyJqNqW2o|W#snJW(;W-8fpf90t`bph1V8WW3}svwFQR2Nz4 zneEcu+LcW86h#fHORV%B`}eK-&KfQiMGdOUtn^o2FdfH>Yh@~nC~8n$19f`zUgs{Qi70ANU1yb8ws3EI(XZUZXUW=jz z)qPg_d&SOKx1*^zul&`Z2Gs*rx`k&lRnKawk|=6WJ!GY`Y6JznG}TWOHK-o3(!IB6 z$T`zZZ4pHcs>h%LJ4bcy%%6&)2GtW*`o`>5uT;+WiuKxG4Qfz5g;`}5SG{RlSVj~z zsGh;B*;@v0Gu1~FHK?Am(!F$PFcn|&&$O`QG@C=E4^o1-0Avao7G7aHK^XO((e`QWAD?Z z7Kow-RUoTB?}82pZ@2BN4z^)D+ui|$SP$~n(Z7DWxJ_pEdai>%F&&t@GGMGdMCtn~M4 zx$9V7Q-PwWLG_W9uHpU@jc%I?cOWTA!z6#+j;l7t zR0mPip!y6dcfk;SO)V8g4XQ7!lFFJE<^^KK& zuc;GGc|U?4mBmC+gX%jg-RCQ(%J|(>Z&B2s`T?_w#+&7wdpC-r2GviPHGF!nh&JoF zC~8mzvC{KK#1l)s-9*1v!hihLpa#`1R(cQ6@vopzrpk(<2Gws?x<@s+T4<1|UZSW$ z70lZr``>>(%CL8=sU@PQK^2^pey>(VmbWu?MHDrtLa@@~>*0yL<4pzo*Ix~4P=#cr z_oDGK^&Mg=gD7fHg<_@qMu!5wMw@CZiW*d*S?L-+Y?f-2shOgvK^2CT_XmGI?Oxy0 z)DcnCpbE<>im1-N=WaChMie!u!m-kQW8vlqlTAf?@2?>>sKT?-mG3jWR|!)EMNxw) z0?Z0ls;qZ_>fYO46g8+K!mO4pl1w!Vv{0VXQG+TD%|ds^s%8m^vtm8dM2c>AmRWZfmocdL@b)REb#W)uG3&e$HEwMF07#K@F-uS?Oww z`L_O~%_=8~8dQl{>6z`&j|9%X(L)q9sFJYKHH^0Ew{z87CW;zVNm=P#%85`vHrN*4 z6GaWGWUTaig*zYMo$~egiuu`J4Qfy&XQfYw!#j>~?kWq4q6Sq8R=OV!Xjgib&FUzM z8dNDkRUTKbzo~hms6myAm42^0laCHFbw(65s8X}iHEcC&z$8ufwN*v_O`YMVVR2f<6$_Ms4_1I>m`s%L+HK;OyDjKD}bA_!UiW*dzLA|&a z+}Y>*i=qZq7FOOL{3+h)nDbn@QWQ0)va-^%&7{yt+fdpr7Kc2drecJ zzxk^{4XW&{Vu*S*;n`PH=|oY3DhDfF`9ptgyKAbtC~8pUWTjWw_eC@RFf~XNHK=m2 z(lbDUnS-1sj*X(IL6w`8o_q7WSf0#gJrYF?sywXpypgZ?i}|LaeD~Lo8dP~%=@!;W zpV8Sj@{6JdRX$dFC5oD3Q%{@KUKBN`^0U%+MDNlRDrRbiC~8m@fLZA?#cF8kuqbL! z6=bD*)RGscvYC1#iW*dfSn03)p<&W;rlSAw*N_@ig<0tyRV?wndZvnqq6SqFR=W3Q zIFjGFt86EV8dOC=4c)Y|tj(GsiW*eKK&5Q*X|Sn-qNqVtoR#iT{f;O7$JA?4)SxN> z>hjj@txd)K>8~L*s7iwB+4A*bQzb=FgQ^rO-4CaAj`PG+H&N7}D$PoN<<6C^UNbdM z6g8;Iu+k%CSk>4oOq~-&4XU!N^vO4Ey!-=9{SrkDs&cIKNZDL^XHrvHg8Vh4232`h z`g?UP<^KQrs4t2dR25k1+2-B0Y&~q&7*W)qs>mw7oO?fxdNJA54pG#gs>CXZsGx0k zybHTt9bSo|232KN`X1o<#3t!YCHm#B1~sVuVx`B|==cep{jjAj{6GaWGx~%kj{rkRHVpG9`h2me48dUXI>3QQ+{Py0)>fW1C z6g8;ovr6vo8o>@u%@*EN15wnVYQRdjaK+=9<4jEzMGdNktn>^pdWide{-7voP&I;C z;U`6kV6)zdq6SrCm=$a0E9ZVbAh^GV)Szktv(^@?e8^^%5k(EErZ8*a)cNI2^$r6EgMGdOftn}&T?%ICOOidC+4XQS*^t>^yWY;pL4vC@$ zRa;hit-N{bM>A7_qNqXDj#VN#Qex+?In`9ckp5~=gQ`6%-RH}0FTc%HRZ-NS>cC3Z zu2 zbKXc4%3lp?P<3IYt5ITZ_XoCxGD?L&go=C=pKly?vYEboHrN39)bSv}Qtl**j)u0AdPgXjs?&P)Jt)l*3SwvBT zsuwH$y*j+ySJhNgQPiO7%}Vd|#wA)h)6^_c)S&7Ev)b&>TE)~kQPiO7%Su<{aIC)Zt9RIYETVgrQfUkgN*%5y%R+Zs==)Eeq+$HSVc`G2Nbtnn3# z&No$36g8-ZveKu~PW{R|E8k5NHK>MxS{NqKdwHh6@@!Gmpc)P;TBdQ{DPPqAQPiLs z!78$U7zR5$Jt`Oee|#p28dM`$>D^bRk+t&KtnlIdHKYdBC|0@}g9mo5Ybu8*YEX>^ zHFs`m=kHVMilPS97*Kx~czDoe4HiWWsC?&xFcuqbL!O=YF~;k9I?_LzDriW*eY zSm_yiP{{coO~s4guOT(4rh}ST^xa}p6+}^kY6dGkM+M$nmD{CR&hgb&6g8;kveI|UMc*EnWwREFq6XDGR(dsWcpyt+Q`baMgK9o2ofRwS zuJfD{F_OO;)Sz0xN@q<--PqYT3X7r!)k0SKdu5urrm}5e4^h;hTEr?qRz6<)fI+5K zh@uA7VpjSqk8R$xzNy=ys6n-am2TnCB_Vd13LDv94Qfy=1vO}Hk@co>i=qbAGFG~U z(TglhpjyF7@8=gD9pLgQkQL3 zkSJUO{I$FuOT(4wz1OlM!N0~;+v`}iW*egS$Qdc=KR^Kkf{-( zs6n*@)Ta+UoR!}xiW*cqS?RC*A@3#Ud%YG#4XRzN^lIMc!jfUOh4G{Nt3eH_-7srr zwp>$8RTM=Hsy(d!kk!~4;rCHf14L1SYA-8&;#j-;;Z##=MNxxlAE;R2!aB#-HBr={ z+RsY&!>J)6I)C%{TNE{@4zSYiRk_Wv*|volWB6-G4XT5z^bAn;pBSS|)e}Vxszabw zEPV0O)M!!EpgPRTdyMB#*KSq6n%XXk8dOJE>5&rU`+?l19*Cj_)lpXZPxpm7dZVqW zh%x=upa#`3R=S0!+DC6`DzhkRP#tIG{lTA3gRVJ$*H&8;HKbX`r_t+0aQG@CUW>MWcg~_UMNxz594p=DyC)pA(q{D&MGdO+taP7mQDOX6 zQ>#T$gX#h+y)Nf_`pG+8>F;%26g8+WveNTLlyJ?inhGA3jZ@u6g8-B!>k__Bb_$2N)$Dy?!c_@xn4PM%&v-}2Gw1dl_K!LQk(Tl6g8;s z!K@H7l4LQJCXT;`)S$W#vmyl*&St8rC~8nWfLS+^_dIB7fGBEEJ%m}$#)ms*YNaS@ zP(6ZKX+!62V(N-0YEV6fS~0#spI-mwy?h_YEV6gS+PG2&tqzZC~8o>fLXQUUkq*PvM6d$y@Xjmhn>4% z>Zd4bP`!d#OY_Zh{`rkm@%%NU2Gwhr)vr`j=V|mWQPiM%!%FW(yG@zqolx~y?k9>G zRDrDY9(!HLNVeQFBrn-uv2Gx5|OZTpE_W6aPs6q9CRdP9Rz8kfsrGo$YJtt0-zvePgA2Z~Tvc z-ZPahfxm{-p!yE8s%Bl{yw$HSiW*cuSm}G4zheY<&H$4|QG@Cy%-S6^*jf3LqNqU? z#7f_A)+*A<+2?OIdmotE zE{YmdVOi;$is^mMdf!ifug9XOK^2abu3_U=_nrHV7=QY!K@F<#pw`z8{BE;~h@u8n z1XkW3{2BalmO4XUWD^hjxTzFZ}nRYnvwsG_mb)d*I7 zg!iDMzw$s))S!yaO3%GLyM|b8YP~3GP{m-SPf|0_{~B!SjwotS#RS#rWAi1ZLMQQ8 zgBnz^Sa~-z{5d{7FrTSRqNqU?o0XmqXAZmQTq~=Hq6XC;th_(?lcCR?y*6v4C~8o} zVWr3N?Z*TDHMLO`HK^jU()aVTqW}J7>WL_7P{m`V*RPwgqlYyWE2+PR)S!ybN>?N2 zj5p3zucRnyPz8W$G-A|no7GnoHK-D>(ld6epskk3g_H=M-(-v z60!0QD*oIkyR*7&VYp=eYEXmfPgdR^{F(Kl)*VxsMNxw)F)N+5uH!Xl4Qq>{22~PJ zQMU&<_W*-MQG+TeD?QtMn9(oLws4gwYEUI(rTfOX1!r@Zx+RJlRLNQC_xiG^_Ht7Z zllyB(4XPBNZuJWH$W%5_)SybqO3xcNmQAQmwROvw-?|H4E&1x))8dMor=^mB5-n>Spri-EmRYq32 zhH>Mc3}@$Iz2>cdtr>P_<{WYWpRTftI#Bno3+{dOW zh@u8nR#4%mmv&a8mndpbWn-mV_<2_`@2Ar%>=IGbpvull*Rb~MZwF0X6h#fH9ISLd zTs*WwcT>MaQG+TcEAJ2fJj%4gd2f?8mA{76pvuKc&j1Bm*K@ARRYg&QDmN>Ak9{P? zP3Qe#Us2Sc%EKzEY+;;1DK}8ze-?_O231~GdJnMm=%}}*j*FrORX$dFRK6b{uDPjK zqNqWYpOt>EO{wNgH5ECvzlPMHD!@w5y|?F0J!dMbC~8m@Wc8*Yd3pq@{#Lr z?`K<>Bb~p7)S#-sDy^t>XS($;)m9WWs4B8bEUIkwHD66F6h#fHO00AX*DRl0+0;!@ z)S#-&O7F2hpFQb4X6x@2CB6T>s6q7?D_z4R@Ao)+R54N1psK=3uPLkZO>k!Q5k(EE zs;urOOet6Wy-ffPqe0x#UpsEEbM(S84Of42g4XWC#bl(^`Fs5_1xgm-g zRCQohrr~Wn*sRDI{nelbRb7}hYQm>RrizN9230*!hqugku0*{=QG=>JE8P$KJ`3D$ zv(}5E22}%4frslnG4)IoHK-c0(xbA+yN#brCCKEj1~sS}vC=!ecD;h1FjY+yHK-c1 z(yK$MC*QrFPWO$0qNqXDgq5DLmu{SO+0+_Q)Szn0O7F2_r%dYI4(P1gqNqXD3{>4! zwY}RMRS`1#t3eH_=B)JX!Qk+}a+%62iW*ccSn2o5v%0hMd$kos4XT!`^m~0yvTmBq znk|YNRINbmTz`FtsnepULDia-ey`#=x<)beT@*E_+OX2^HGWYT=U7gc#a}~eP_<>H z->X%Uu(fPf9Z}SvY6mLi`hFEnjTS`>s`jk(dxcFB&ig<0SKcLx8dM!v>Guk`V9_8` zuS8LUsv|4?UY%1PcJ2YYxXmgliW*d%S?TvWU%qvJQ$0jcgQ^QF zed6fcI>~8MD@0L)sw*q+5B~hUb7-Kc3!y&iHK=;9((e`6_0$hj37 z@9nf%g+)<=sy{3JUelYDcFw)6MNxxl04x1o*GtBmX|tw^q6XDKR^A`{`MAC5Qd4_G zQG;p_sC{|jZZ`E)6g8*@v(oQXFKU_rrXuI?*N_@iLs)qi68;p7{@-C!xkOQeYA7px zUVfMPWdu`oL{Wok7|hCe?ph~P14L1SYBOTKc6g8-(vC_TwTklAVO#PAD zUqfn8O=qQNw(0Z7djADFE59geP|bi@X+o}jZmO9mYEbM6jngz4w7b;fN)J;*;pqdS{Mt=@$Z7NtEe+{WYH3w#;j9Rjxsg$CqK{c0^ z?uYTN3l}K6Cc`K4e6g8-pu+lSj z`%I6{*{o`!s6n+9W=*g6xUQ)|qNqW&3}zjv-@TlvHKM3NwH#)p=su){sT-oGLA3&A zwV04*kf{*){57No)k>I^W7XoTrZS462GuH^;0A{F#kgBn!3SOv%( zY`2a7y|P*PMNxxlH!Hn!c>W=VbGO_<6g8;!u+lC3mhRt^HfydZYEbP3RkqNb38v19 zq6XDIR{9>GM(b8*O#Ku^4XXXD^t|!r;owZBG8FRHkQ!76Sp6w$7<|;q>Za<5q6XDL zR*6M@8?w*)%LF}ACX1p5)ge}TdpXE36GaWG>#X!F+BH?MkT$EMC~8pMV5R#;xuAE>ebhox z)S$Y_Dx#dDZf$n&MbC+%2GuQAdVJMAlHJ)i{t-nDs@tseO0;G`?Tl3TpM=HzHKYdB z9aj2#^{o2zp{WX@s6llX)QLXB?wRT(iW*e+Sn1zao*%Qud4^pgiW*e+Vb<$%G3MH= z8=|N|^#D|zCS9B-`Vb}j)u0B|Lsq(ljZQRno*goXq6XC?R^A`{`E>e&^IX|j6g8+G zgPOiBt@k77?=?mgHK?AjiYl{SAK2?%qE&4XMGdN_tn_R%B6W?$rf!L%2GuiGdS>e! z;>AT%;Y#{zNDZpztaJ-A4r}D>y;((3gX#q<-FpkXYU2GD==Z86iW*ceK^+?LqpYb> zqNqXjik0s3zw*TRWNN1syD3k-X__T+RnK*d?|kosX-OU zO1E%cqKU0+Rv}T;pnA(n&!Ss)&U5~Tu8k;aP`!g$XQBjVwplYoQG@CqnAIfHIp=SR z4~e1%)xWIt?(0a$wTW%kTT#@YdJnU{c6d3{RN~V98d8Jm11tT#ZiOA-tYLXk)S&tZ zv&#OR)44P6B8nPRpIGUUGH+SxY_^5-MNxz5KUTVhITHoTWa^|SYEXS9=n zHK@L`(kG4v)Bb#DYNIG>Q2k(~*UC+e&;2y@LKHQqezNjzTltf=Y*g<@(6deKvi@pN zgDQxXu12(bF`U2uDl3W_RKHlImRWV?oV#VS28yBv)o)h18i||SagML8qNqU?%-aP+ z2G{*CQk5I+ZPpu6)Sw~|GPpiFWwIBP(^0t9aQ`& znvP+5mV(vQG+TfEAJ2fv>v&rp{ZV?s6iEtmF~U87S@?> zYOyG4P(^2@cVGST9d(YBbE2q06@!%?U%iqvo?^3pilPQpOjbH8ZMqeQOr@{ruOT(4 zVzJU$tF~wHb`w1x))hq!s@O1VcH6hko!(ec)S&uvhYJ7GP!u(&;G!%gdfXLLIYd!|Dj6$1+w@N~!nrQD5k(EEr5xCIMNaCdhGcei1H85kI5 zU<4Ql?jC|ma0$URNN{%z?jGD--ae<#$?0pq?|u7^-hHyykE%XhRbAaT`)pM1_Jd7* z5=9wQ*;wg*-6c6Za>Xj(UpvuikpXLK18dWfrrlDI6%Am@_N}rX- zdY%1XsWl)u4rE~dcp~8Kwt;M1!gQ`3$?P1iF67Ni%7eyIV6vo?Lrn-ot464ekbo7=kxvPq)xuPh8 zstPN8>Sf*g-t&F_oG8kms>(`xIJxTf9oAOtW^OeogUT1$>UwK*MN?%&Q3h2tP%Vzs zX<{l=6lG9VXQfY~QAyHuFf~^cWl+^%r86Z-mb`6DofJhGR5e-Y(_z}(nYB$tZ|+uu zGN@{?N+2UD;iy)gJ$5lsltERSl|EBaj9UHD+G-_=GN|gX(zfDFuQ=D#C{dI_RhN~n z0A;Gybv}^j^J|qT%Al&pO6OPSzmJ_Wbx{;$P}OIpdz*{RF3&L)vxQqj%Ajh%O2_>0 z29x)hDlLjKs2Z};S=p;)wCbk9L{SD+BT!GqBwA={o+!$oYRpPU)YET0znD5HiZZC0 zu+mxid#1wEO+|0%R)aFAnzGW$7s_4Yxv3(eD1)jQD_unwuF3hvR69|WLDig<_AuU{ zo}*1o6h#?SEm-O3U9v80zo~tqD1)jcE4^RKXO;8pmS2gY460V3ZY8Ze+1kq3%B>+~ zP_<^I>qgS_mxh|ECyFwt+OX2=D!Fuq=b17<6lGBPvC`|RJ9Bk>Yip$_%AjfsDq6B5 z&fwBnc~ul;Q2Ddc>pGXY>EEW}wRWpP8C309>2-~p|D?XD(xNDXsy!>cu2VBp?=lr6 ziZZA=fSQxc|GcSbq9}tZfR$d?2>+csxisbJ5iKD)sdB6*TLVe zd*0}?wsC7n8C0D>4f|=~Rcot}D9WG;Vx`yBszq(j9$>I2%Ao2D>PnV4i>$46q9}u^ z3oE^@hs|TxF?CxMWl#mP(zmuo5oddtO5*2MgEFYPveIYD*;b|7nkp%ZGN?j8Etx!a zkEsArltC5BO7C*4`dO=*`c)KVP<3Oa*Y)AhYtI|~c2Sf;)t!~Tjqd!e$X09Xo+!$o z3S*^fZ`9ubk4+_P>(-DmsKQxk4R80}e8*IIQItUy!AkG)+q&nSmqlGSx`?6-sz_Ek z4yQfKP|4H`QItW|gOyg}X@b2^OdS?Q8B{%?t$eG$T{rbg6lGBLVx{*hYuulkn9A($ z){ru&qF8ASU;Vsws;QcyD1)jusGtJF+L`JhiZZDBu+kpRA9m%Wsd=I(gX$Mn`h;!M ze&8)rheS~ZRbNnL^H-Q=>XRtSpz6m;cMhL6-SEuiJnh^XQU+CjR(h8YjjY+!+G-(+ zGN=YXTa#X%iZV4=6lG8iWTkuTy}6&|HMLq4Wl#-br7OU1ZI)~_bw?CsPz?t4GJeOS zrjoRGt3er5LqKJoQOvW7mKQ}CR6|+m&b<0R7d?L)Gei_+Pz__HBPve%qjjx^zlov@ zs^P431t@y+C(qtyizv#V8o^3efZX*WoC4^&@jw)1P>qDPw&h5c&s53|ZVf4eY813p zEBg9=rhG+F2GwX*x{7}9J2}KuPf?UXH3n2bvc}Hm2feO8L{SFSSXMd?hphhQd6T*z ziZZCivC{js;l`2;)>ga#w;Gf|HJ+8OQD3G{@~muyMNtOTudMW2O7QN)p1%*^CyFwt zCO}&~>i_=PdN^7XWl;SFZN-~#D$LYIQItV7k(FN8<+m+nnz|*5GN>l8((C#<^3)|$ z@dMo&QU=vzXe-a{!p?G~ce#Wp%AlG8ZS7t?beyRUq9}uEDzvpYR~gS9;8#(UK{XB9 znt!{>Yinz(D9WIk4sHD~=HnGp_e4-lr<9OeOB<){ru&We&8b6;mBWQ3loT&{m4?S`RZdQ50oR&4#vO}#!!S{lLA8{XKK1fvd6>o298r`(^(VBI^y+G7`=+bS z2~m_mwG34FxNe?zqR*lzgK9abfm6C2w6=0|c56r(R4YJjTa{&&sV1T*gK8zHtDo=O zGc{NgWl*gGmG90S&yHxdD9WH(4Jzd?y*#_htD-1_Y7MAf`8MUT9>(qBR)aFA)`A*U zY?Eh4R7@0QP^|+sw^rX8)>a2mltHx~)XwzV@|&6(vUz2wS6*aX)6lGBDWTlmV zI(t$9Q^!S72GuT5`|6r=CD9WJP z%SzvFvX?x#&eTj%ltHzRmGj}1kKCcBox*744~wDtyUaq?{Bvm~XMHy5F zSm|59gXu9mUwaaVx;3N>s)MYYk2QQuSlHS5x7t<-QItV-h?R5VV`<{ii%t27q716T ztaN9-H%7w%QzJ!D2GtQ(Ix9bn&E{FL*NdVIs-w`>@NSQ@Sz9+mQ3lm9R{Au*9es>v z%*XBK){ru&jQItV-f|Xv^h;wQCm3Vo{^nv%LCWxX8 zs#C0-jWr+3;^UNfc#Jone(m+S+qB??h9XySp`{463uN zoDB^h?I)b^tfEasQ3lmNtn`=SLPe(?x3)%zq715YtaSG^-2dD>Q`L5 zj`RH8gD0XWgX#h+z018O1Rt}u(ucX#pbV;utn{11fYi}rnyM*^GN>-G(i;A}thncw z$6rKI2GwO&8Km;XzP8?HZLJhV8B|wTX$}3Wbtz=(o+!$oy2?uD*QSs%T}`D3cdJ1e zRM%MPm`}E=P<>OCL{SFSbyj*^GXqO{zEt!QMHy5#SZNQZeSKKU+FC7&GN^8{(z|?N z)bv-Tu8N`zs#~n|F1NY5eYvUF^dZbSD1+)YE3L-HLE-OAl@LW4RCicq>MNtOTQ&!IO;N$bk zJg2OOA4O3H)iYK?dY!-1kGgX$HlIC5S4{6>VCS|W-vs9v+uyPT+Ps^3iQ7eyIVZ&>N* z?Z0e_XFq>W6lGAoWu?_v)xU%1_sY0E-O5u2)jL+Ys~kIKLk8<%K2elG^`4dX(0@{` zho%~cq714Jth9%90vFdd)k73zP<>?OocQ?EBHK4pGeuDb)hAXu4)ce!>|tu3D9WJv z%u4Ta+8ogjnYu5EGN`_Q+LNN9v-Qy3a?DdUn}Z`oNyQ3lmFR*9t= zr_<-%Y;9E&MHy5+&h|QbG#!VRqR!7S)m;>2P(@?q{9$|?te*I~sR^PegX%k0TEoJn zD*2h(DvC0wqO;N-_B%S>)5A-mD1#~nE4|CZ<5xUxZG99)8C2i1(kD^sSaWNbN*m?g zFUp{b$x826kH1QI_J@^4Q3h2kP!+x$zF=*25=9wQu|dt=J=&R|I-bw-74{O3(wQ%^-v231N{TEi;&uZ%O5;TN}tltGn>m0nl>r`f8Qsw0Xrs8X}iZ$#%m zFTG}}wO2bM=@5M*K7fme{MHy6SS?OI~+46yBWjij4GN^t6l{TtKGi&ReD9WHp z$4aZQKTX~@rZV((Ye*SX=~-oxyZpz8SKmz46h#?S8CdDp)B@vMc*e#6QItWIk(Kr^ zByWN1*4BDaltGn=m3}=qx@KsEsT-mwgDNvC?P03lGI-YcDb5~Fy)-7#iA&KDjO@U;rWJVr<*zo5KP~~K$Ywx90*Q1+iB8oDoal!g5>oRNWgec0OD$L3`@v)|HN#|d6AN5WYWl$Air88wz(iO8! zWg6&Ko-(M4veFeGRGLZ_&Ea`W^%q4MRK;28SI2GRQ+n3cgok*47EAbkDZN}u7{DLD1)jts1E5Co;9^t6lGA= zVWoS3Z?VE#m^v?tGN|f;%Dwl`JEmd|bE`oaRP|Wty5Uznf#<7Z5mA&uRiBkUVVfrZ zvdh|PFN!j#8h{#dE=zw?<3&*hRYO)<`4?#ddz#uRiZZAgvCx$i66lG9#g0_}M?g%n9N)%;K1+mf<;C{S-E~Yk# zq716etn_`kcZ>KXP2CYi8B|?Z=~FL%i!aqpr5f#4gEFXsLEU|@Y?G;4q9}u^D=Xat zEccD!YpTB}%Ag8irPUa}p~+}dOGHryRVXVR8{gvPcP5SAuQQ@3gQ^>-oZAEMnTj*U ztp;UKb!X+A_?SE*jc0FDP84NOg|TuT{CwQFcKVF9)mao}P=$jk5XdvDyaZZ#-_st2@HZ~7O{FZ&flQ3h2{XlrWn zv{S5yJw;IlRWDXLHs*%5eP(L8D9WIU0#$FwKxdKD8eR}Z8C1Pl=_*?C^^HhVF~+&o zpbV-$pk_py`_WWkQItXT3#g9`+72+)K@??B^#zq{Uw-GJ^tvXAq715jpkmi(o88o2 zQItW|pOvnMlOM%#hKaWIS`=ka4FEOd(#1}uvW$0YNEuWEK`m)KvZATRq9}uE5G#F} zw_JWRrm10~D1&M+D}5)*U-p*gJN7zJltDFwl|Gk~q-^rDwRK+!UfiAtG%a2!)9Cc4$245}%t@`}pxX5AfAHAPVd z)l^pbL`@l%#q*_NfGEnKn#M|d*n5iK0BdW5D9WIk&dOP)`G}cf;w@7TMNtOT3}|a) z$$^*ROS3^)hup6lG8?V3k4I+MI6vd{bXVQ3lmQXzO#n zhMV#gMHy79Sn2)hT)5UHQ@@C!464ECqsa#a8Z;& zwSkrHHxj+eyvNiZq9}uEBde@3@^T-1^2*dTQItXT7b|TmZ@im>O(mV-R)aFAHnGyZ z&7{P)rkScPiZZA+v&tkr3=gS$!&FaEltHzHm3}>l-m-aRQ_DqB2Gv$p`X#VhyIu)Q zofSnHRDZK_1_U2}FYyaA^+gnAP;FzSwj;jI>Z=2{OYiJ}auovd_MnKI^@N2d0Rq715Ctn?dEj&^IE8?LkRjVQ{X+RaLP z_|y5=$4zCQo&7D| zR8wC>Q3lm9R?dl!?T26AHdS!8TSLmAI?hVhsN8{nuQJtI6lGAIV5K!Ix-+)(LZD-Q zv?$7;I>}0(4nNKHJ!5K%D9WHZ#Y)#+-@Su8*Y#8sWl)`FrTfEcH%D}_wzAA|t3er5 zXIND1+)eE1k=$>t%Pg+j_s!&2_6m8B`Zo>0A!&UHgTp8lotJ>LM%W#K(x+=WCei zDT*?vE`iEb`RqYc^F>hx)n!&%!(|2DM3_1ziZZCKu+q6)_T%K%rap_J463WFbS^g? zUhKW8T=U!-QU=vEP=kv2d)~7BL{SFSbyhkn{Z2(Ww@&ZZBvF(>b%T|2;$y*q94k!i z7DX9UH(6y6b^mZV&wI)fQItV-3sj-3(~DVKndiIJpbV02Gu=Q+E(vN$xfPjAc``m?z7UF5|Fe+cT?#W zxYeKxst2sJ8uOmr?qI5>D9WJvmz9p*vA-YjJoS2tq715staRPzeZEu~YiqG6%Ak4# zZJin4Vx_6`q9}vvF)O{UWz)+6w_l%7~q9}vvDJxyEV=b<} z#@Y%LMHy7jpslgdnkF&8VK^|1xz<6lGAo05vhucv2Tb{*kH7JAXJu6*BCuLmkd49DL zMHy5dSm|}8d%M4Y^>CCZ%AoqlN=NVNyVHxC+A4}Ns6Ihk>+ijuVCtzT%AoqpN~@7* zZmIUB(l2qVK^atESm~@RUUruADAN&DM-*jHePyN97(X%St*PFkD1+)7E9b;V{6|fT zm|7-^GN^o<&P9)=s^Wp)J?s2AQItUyjg?;4ntq?10_b%``@^jUWl(*`Dv9)P!RIW_ zlCLU{D9WIU&PqpA_nr54n`$bGGN@v((q~G}Z38^-l|w~Q2G#eh^qDe!Sc1CN)>cuJ zK^2pg&gCtO+w3v*Kon(A#bTw`RdU{?3#L*ob!$i&RIyoU4~s0=@x@eCQItUy2ip3+ z-FMC+rYLj}>=KQ95 ziJ}auM67f!Hw-Me%hWPaltGo4mG!tOT@ghYR7qIrTn_&D+dETnmbulS463Bi z*8aYW?wTqriZZB@vC=W`yJ*fwQ~shTgDN>I=fuay9mhRmV}dBkpi03?tFdC7_y6O> zHc^y8^&>0i#K*7Ka;&o+J`_b6R4G|G4}LzXc8pWPREp(p4Jm^v6)PRReVf$&Y^tm% z%AiWkDwDLe>D2+x*a#Cv8B}SYt)Ct(uVrm55k(nPX<6x;RR254JkQF@q9}vvCsw+1 zNLX&IXAh8Qg~)ph^$w-)jfrG^(XEO~0GnJCJj%F4<)@$n{>kLPJVP!wfQ{me?|*Uxn(dVYmjA&N4nva!-H zFe}#$C}%yqB#JVqva{0b3Y_G-&w?@^JWD1$0DD;*p0#*V#gJ)AF!GN|&f(s4MbTGb#^r$kW(RbE!Q zbBI=J%U4s;R=YK%461yrbVqcf$Bk8{@`<7hs{E|SroI6lG8qV3k2C|29jN z6Q(AKq715ntaP=>)cMDlrjClD45~t`bQMj||KDY%qOWnQK^atqS?TDFcD;yarW6-N z8B|4B>C^mjiVtP2tQ3h2pR?dl!8mabp{to9cQItVdoRvPm z;)mSGV{Ls9MHy5jSm~J0adlcVQyJH~HKYuxlB{$`w7OQXXI9n`MHy73Sm}uR{CSo~ z4HQKgRHa$z-*b3dcEmaB;c8KoK~)A+{-wd8rtXTO463rM^tu-P-o3u5)a%@8PzF^w zRvG1f9n5<14^y>8Q3h3cR=Q{F>N_i+sX?MBgQ^0n%+gk+pxvIfmW!ecs*0?1rp%bV zd55)iQxs)TRbu6w_&C(}-(IGYuXn3K8B~>7>5iyZ|Dpvnw7* zVn>Ri463TEbXNKf8vVx95>b>vltER4mCnkZKWyD>J!~V2GN@{@(z`t8Y~x0zMv0;fs#>hHt&_WV zdDf^Mq9}u^HY>efCAT+nE>Z8-V^NerRfm;6iQcq2>8WA5jcyGogQ_koeb;OKxSG>h zZL5(e%Al&pN-LkEX=Bf>GD;L>P}OIp)!6kUiRWwTJW-TE)qs^g&C8x`wbpugToh$c zHDslucmDptpGDT8+rhi#*@i z+KQqKDt}haiI0!%YkR&qj1@&0RP9)4TOU_ve`!73EQ&Iy+Ou-6+Q(;W_1wdQH=f~P@ZKW4Q8B~F+oXsvDu}*&+XR3rK%Ao29 zZADE?>v`j7EQ&IyI)U2$ed|fqR){Fdpb7%@t#DP(8{!C2ltI-QRHM)#x2&!Cq9}u^ z3#jC6=6Ke_zeQ07RWPUmv5U8`w$6#7463f6x|PUW$<%XEltC2&YF+09olM2u>W&S{ zpb7=`vSsq_rm~2l461IRM&y6y`J10*MNtM-cTk6-y}o8`H4{Y{RAHdvHn{l4R5wwS zK@|?FX8YZq_mokhD1#~j)R;Ge7g$>hMNtM-B&cJ1r)@E{T@+V^rXE{LKG zs-CQLR=!^wa@^EQQItW|i&Z?C%b{;;Ts4*8Z+C1^22~U*=SNCDng_luY^s1L%Ao4a zN}sSnaR%)-RaX>cQ1xN;y|guZa_g$528f~zs$W<+CqC+zUsBZ6Oi`3U)t8mN>kai? zR?5@?QItW|4^-A!xm%lhD~d9x`m@r#&DOSg3Y*Hh&8<9TPz_+^Y!~=wGBs?Jsd}O) zgK8iveG(;na3G?Pz`0JUzQFBMLT9Hvna}-8pbNI{OR)&hwL>~Ule6f4F|P2 z;Kx^{dW)hAsu8TT^1lC!^}KN`5JeeOBUw2oK4Q%Laj3O*QWRxSjbf$m4qGDAdcMJa z7DX9UqgiPUn|?a&d9Tc}!>v4JP>o^bocJgl_Th;2uz@Jbpc>0c--!;z+~j#r=_iUZ zsK&8!PJBck{$Z!JwLlbQP>lzbe*ZsfOq~!#8C1Wr(y{SVRLzE_K8d0XstK%g%=eGH z>G{rl9(i%4T{L=ZiI#WiAq714@tei>3N7C52 zoPSldS`=kaO=hKIW8Lv_o+s>GQItV7g_XXi#9Z>za%(H;F1H$#K{XZHN_6>AeN(=o zD1&MmD`z?5V^i)F&TE8TSA;0apqkDqji`=W?|JqBGel7a)eKhpzC2^|JkKh6R1{@U z&19t`D#`l&&f`UU_*oQXP|aeMMS57UVx{M%vhH?kNEuYWvvN*++4*KE-}M%Yq716VtaKa>dVbQGYIW6LG=eK z-4W$FIj)Gcm3^;UdCH(#%1USD1)r&&uLn&!K)wY6UC3%Q^QYD{U&#KDQc_LA8>V?y>jHe(YJ6Ga(Rt6Ayj-CM7IEmI>!Q3ll-R{8}d&Xcm^Of42g8B}Xo>0OT2 z;Cx(DCq+>P)jC#M!*_>g9y0Y-6lGAYXQivnx>j90-)++DcPmdBR2x`1Cq6d*m3f7= zRa+EgP;F$TJxsqL?sZd9q9}vvFIM{gb*kU*&cD@JIa?HEP;FwR`}wbJQ+np|7EzQz zwV9Rf%#UmiZEI~^6Ga(RTUhC8b7<%d&zO&Mz^x%=P;F(UJ?v5X_a@d>K~a=J^*1Yh zLtLNom}i}DB8oDowy|=C5g%7G?QtFyTEhrYltHzfmF|0sAIa`{I!qKr8B{x1>3gN` zvMUR%t*xRcgK8%$U3=GM9njy@IZ>2BwF}gkBlSG{jhF}B%2Ni_ZdN)gv(MY<`PHnb zD9WJP!%Cle$+tyaupYJ*MHy6kS?QSnIb(zNrpAh*461#sbOq?TsNY&sYei88)qYma ziI1ndHjXxRK@??B9blznzH!+qeNDwUwMxPZVf4e>K|6liI1#}j#jg_@`<7hs&lNghP7hO_1xu_ zq9}vvJS$!2Yx+*#WNi%)MHy5VSm~_v^*xi%)Iw2|L3NRp_Av9eHRB;GN|se(#mJwwqS&{mFBox zL&~6fz)DB&)(0z=nJO=eGN}G#rE72avI$*G1&X2!s)wxfjpN?%D_2a77eyIVk639n zDvd4ddFt&HMHy6&S?L#;!abdr04L!dFGW!X)e}~_`)YV<`3X~5Pq;Ot463KBv>H8c zwDpYM#-b>L>KU}vKIBG(wbf4)Wl%k5rF+p|ss=1FwNeyiP`zNKHH`l$@g-B|L{SFS zOIBLL)B`&7HWmA%TMf#fdc{iT^7M?eJhQTtD9WIE%}Q(d%g(+NtgS#%ltJ|d)chmM zubLV!iZZC)veF)Y{F-L0sZF9NgX$eC{Z`pBpp56c&23SXLG_-MK9}bX9oWO#N_@(# zA!Sf~V5KWtk$08On947TGN?YX(y{S&O1jUc8j7L}s!y!6@?*ok-7?ij6lG9-W~FbNM%p!&+nIq}h_cVhCyM$rf!O&45}Yk>FABBG^W0(q-Wh4QU+B#R(f3zL{SD+N>(~6gBm8OWvZ?y%AiWcN}mqfTV$VPs;4N*pi0e3$42s- zQ^HNn6-60TX;|qm2-80%a~_*ojgz7%gDNd69lhyaT%T_0n<&bl`iYg!ucwb1=Qow> zyjyw7pi0L|dw6{CNYCH;s4I#xsM5328m25CaL(H5CyFwtGO*GbrYSSn^ZxaRD9WJ9 z2yJyslFIW;xgd%%s4}tA5%ud&f!nNy-(7I4K^at;S?TDV9ay}osqCUCgDMLv=Mm0F zi{{fkbGg1K%Am^1N^AJTttFl>oWn#>2G!5d*0|vvDp(I!i=qswY^-z-kf7<7KvQ=` zQ3h3ZR{9-aQ_iBE-vSa{bZbZ%R5@5VCq5QLt@TvCvM9=+%E?OKzmC@lb6ys8rgRfU z8C1DIML#*cuBmyVD1$0DsFBUP)HZcm6lGB5VWqz=#Ynw3uBqsk+-gt;RbEy)4qF7L zb~c!LT^U4C230;*`o0{vC-Zz$RYg$-Ren~w9^Q_+klj=lQItVdfR%INqsr|ko|SE) zD9WHJ$Vz8Q`jhh}TU$FtQ3h2ZRyyX_AI+HF)W4!AgQ_qqT@S;3kL@s(^s-xd%AhL3 zN~@7#=TiWA>sf(g0gQ^@W9UCPJ9%MtZ~RxD^Zj|RgsleBX7Fo{-#EX zq714^tn{nMk2hLmGPPC|Wl&XSrK7iEaD|(u?uw!esw%8>jk@}K*T<%kUUO?m8B|qS z>3X>S#@Z34ii@HQDqmLmge^QQxo4)d5k(nP)mZ6%qej8Z&g+q`y%R-I232)ddY3B> z8UDo79#ND*RfCnzlrq7`KbU$ZiZZBbvT{y*j2nGmqp1wn-5OE`RV`M!itfmAIMh@v zQItVd8`RSGsSBFwA&N4n>afx`jzV{5wl+0a6lGA=Wu^O#`@8neG__k4Wl+^)rDJ~n z%e>1?JrPA2RP|ZuT%OkY{0UPjZn!n145|jKbnUH_{o`{}Wkpd2RYPcN@yV7GO@)b~ z45~(~bZ6c;RZ-7VZ-yw!plZxY$6-LVWBIME?V>1ystKqpQRi})dMJuAsG73U`Sodc zd(RFw#Z9+{ltI;um9xa~(fm-a0@hYdQItW|oR!|?6$#sV=JEhhltI;km9A0qF2?k{ z>n#;U8B{G<=}ehad2*EX@VqF>plZcRD<6N|YR?zxXt&&IPzF_NR@%dg3x4rbBabM` zplZWP$Hu}-37jQF*Ql1FD1*w6m2=`F@^R-gruvJb463%QbnUIubH!a#%SBNJl|L(8 z=jVv)JS~bcsM@j8`87O8oo=SyiJ}au_N?^z^|buIMNQ?r?N**Ls5-FH>l*&4 zlF(K=sKk3~@iRS+xZXE{DzWooBnumlBo@%D1$15m2=|b zO3!%TOkEO18C0RHblsRdc0_{Zj$G3 zA9WH%8B}4c{u}dOm(8}e28*H$s&H0%U7b&6++b>{D9WIUVCB5H^3h_>Q_oB}BZ@Mp zB3bFmRw_rDp!$WCj;KL{!cUt@f8VVkWl;5HrN1CVZ+C2osgj~7gQ_2^j8ggK_l~YH6)cJ} zsQR}V6lGA2fwrE_ z3ZG(ag@~dIs`(sHU*e5tX9*p3SD> zJaTJD8B|kQX%F`nj8)iF9#ND*H4RjfF|9o-c0Ey)K{cI~_ORsrah|7nxG2h?n!!qU z4u}8r{ z8C3IF>GLaHyF$;ct&O56gK9o2eG>gJEmLz-=R{Ek)dE&}mlyP&?mU$Ae!Uk(8B_~d zWs%DFxcAEQ{L1vitvqE=En=mWPt&37BWtUvD9WH(%t|YNX-@P3rUr|m45}rp^eb_v z^N*d)tX|hLQItXT2P?f_5&N4RHg!o9Wl$|;rS~iL<%5GveGx?&RDZJ4YE(!+ZzkO$ zA&N4n*0RzXHc64Bu&KtPD1&MpE1h4t`(*OWuRfwEgK9mfvj^UfvbGk9q714HtaLx0 zf6me;rcQ{W462Q+oDYTyFQ++IlXE zGN}G$rQ>iy);pg~C4b@8kTR&YvC@_8*@3G4OqCTy8C2U@rIl)|Kb<>^sX$SbLA8UG zj^4@}zeSmvA&N4ncCymdX6xB{S4`~`MHy7PSn0lZeXifun7Sp3GN^X5(i(P(lexdC z_%GcWQU=u?R(hAC-k0{g`4$yL8B}{&X*D*Mi+|4AY9Wd;sP?gPCNLkbA3g45YJe!p zpxVz$s}V2dR(ZmL3N0gKEK9) z>3`c);#Y3vDTC@TEA8R_r5zfZDjQ z6lG8yW2G~t*v?$RrdEie465Ux-e$Ws(9}&)ltFcZmEPr+oiDC5mHf3^L&~5!$x6q3 z!du}^VRV;LUKC|eonn<;s*z{huYRV2L{SFSX;%6@>gR}+<4nyKMHy6QSZNL4_kUH+ z)G1MvL3Nguj*U*QqdheB{TsI$ltJ|mD;*o*wex$Q%c3ZQ>KrS5ro3;`DV?=dUle6f zooA)bYBm7q_y>@D9WI^$V#h`bnOPuTs|#|GN>-G(zW-^ zN!urEyH9eCt-8GN`Vw(iI?o;D-mMii)BPs;jK@SvfK? zz;j(qL{SFSHC9=rhj*%Yzi{>uMHy7rS>+a$;mPY8*2C4JD1+(-t5l*+Jx|ol)Ll`O zL3I<F9kr@75Yq+eA?Y)jd|uiI4SXqjxcNPZVWP-Djmw*ayebwKbLW zy<0=dpn3qR=i7x9O_dNu8C3tW(iPx&wJ-Hd`H7+os)wv}R&LuIBgoV^QItXTh?Q18 z>D{c(YlPmfwW274>M<*={EBzej+(kCiZZC4u+sOGV&P*vEB1FE+!|5_)l*jbtX%Z0 z=AYJ9UQv`m^^BFy<%R#AD{rceD9WIE&PtyS`FzTEFf~{dWl+6fr86b;YTMPO{t`tQ zR4-X+W=hNP8^{PNI-AFZvtq9}vv4J*CN zKNno$8NJO#Q3lmpR{A6=F)r{gYip1w%Ak4&s#4!1o>{qE6lGAoXQef478(D%wRKJu zWl()!UeSAKoFXt>gIxD+~q714ptn}&NmuOY6siC4MgX$|QtzpS)Jw0P%qbSOt`o>Dv z!`RItob8+T@R}&fpz?7(mq(ALHC)!S+GJDTeU|HWGN|akFcv+UzNZX(GspRSu5INK zMHy7zv2sp)_?3RM(^OSaltC4pm0nll_<0+ciV#H^R54iTQ*UYX`uk1I5JeeO-?P$n zV^4v0XH9JrMHy5vS?Mn$wF7I-H1$9fWl+Upr9BMD7wwd(7+>7VQwCLRR$7e|mpW!L zl}!|7P{m;tODaEhRjFO3YKfu@s<^ClKi~Sxg_fp*L{SFS53F>|&-mp1Z)D68MHy7_ zSm`*dm}r>uu+28yb!cJ($rf~ltGn%mCmnd6Z|~Cf2I2BR-Q7b60*`& z^!|wWx2&xSq9}tZ5wume|BpRQbrD4wREb&X{5mmzn&&r;iJ~ZjDhVrnE@!BB#JLo$ z;Yv}IL6wx1GlBV-)$Hv~Q`baM230av&WVraJNwKtmGqliL&~5^&Pr!WrmN|4nW`X) zGN@9p(x-#(f=D*P+jO+H)`+4Es#L6; zo5aT_{|6DK?unuds?@CXE|)#Av#_Z&KJGuK45~D&^!YWc!Dr9co+6?sgDNd6T>&h3HO*OiZZCuv(mYI>vQl_Q-6t~ z45|#QbUmDu;l~`NE{UQHs*J33jjCF??MhSML{SD+CRSScodNTfo60XwL&~7a%u4U_ zz7aW^m})GFGN`h!a;66#YbU+)JRQ1;q7166tn~S{^6gg7&S8-#%Aoq0m9B@E9-b>< zJv=FjGN`h#ayArvT#l^!x2gA{D1$0HD|dbH@tIosVqQ~OzH_TY8B{q~>Dv2v*8Uf! z%8H^4s+_EJ1?X|M{615iL{SD+E>^l8R{qebf~ns{Q3h3RR(f5{KWz8Rl+&UpgDMXz z?O}~1ubj^+I#V8tq716MtaP<${)2BRQyHVXHKYuxe5~|6CI9B$J54naMHy82S?OIK z7Il8CsotU}gQ@_u_1p5dtxYWvMHy5DS?M0&PWoq_=kgIzltER9mA*-JZxb}Z+IlUD zGN=l((!I^91zi@I$`He?A!Se%VUFCYbuGJB1tAZ%XpsL79?^lA8eLTC$2vL+lRSDFHo*5&pt=Xa|gQ_ws-HWE| z-re&gIw*=VsH(6^E%&Qb#}S_2eBXAKP4T%tPG)>=`NK~;~H*6{j;TnkK{6-60T^;zltT68CgQ$VfZ z2T_zk)qs`mz8c;5^P;IdaooyN2312=Iu5sP&(gqDGf|X5)rghOuPPJ%bPA(A94d-3 zs2a1NvOSzqVq=b*n)cRLxlF zbu~^>)bnd#K~a=J)tr^?=Tjc2^VZsGCyFwtTCmb}zCxo<(M?ShMHy5rS?St4^<&3S zQ=3Im230FoI_5{m_x}F}cr1!Cs9Lkqo%!S5SzB6L$$xNbNEuXZSm_E7tIg<_rpkz- z3@SfXdY3C??(KPBZYzp1sM@m9_3-JD{hsI7P*IdY<B|G3Q?3n)d||VcBhi(NpwmSWl#mN z((5`I_h-*DC02a58k9lRnU!~(~ zkJQRE!qh}jltI;%m5!)vjSv21YKJJwpbBB-Y@YaN*I-U7Qx8Q^23064?cutA`#6h% zURU}AZVf4esv9fk#K(cm&4-w(DT*?vx`P_JzGxFuQKBe=DvXsriG13K9h}rJ_$3zuu-oL{SD+ zUsn2reYEo9HB$>jQ3h2%R{GS-H@U|pQ-?%R233DhAq%_iG4(c7LltDF| zm5#%g9e#EGc)hL`q9}uE1hmzxZ*kAwW~3;}pc)Bk&ZDSp*47$PltDF$mEPqgwNCai zbx{;$P>qJR;-tzn+tgQ4ltDFymF^D<+_~U%+q>U8Qxio|2Gy^u;>v1seP766Q!7PL2Gs;s`ioEW zC(E6!qE_R$D9WJv4ce;qSC3w%o`|9hs)?+$h6}P>3p5o!nfuQvgK84Am9ll0{HC&t zq716ZtelJCqxX{BUrkjLMHy66SUEpz@Nxf_XKPJ$7DX9UQ(5VC&1|;m7gKXYQ3lmC zR@%eF2fSaTw}_$)s_CqBFFLqk)pgd^6;YHyHG`G@PV~pqsclU8BzJpG8B{Y_X%D+Z z@6*9lT2YiiHH($5QE$JkuWG8SD9WJvos~Yn+7+m>)Ks7-%AlIfN~>{e#OBMU#)zT} zsyVE5wOJ9eYJsWMq9}uEE-T$REG^N$j;Vh{Q3lmKR{A8`wCi7gQ{SaqocpltHzW zm5!*ZtrtJD9##`Y8B~9=(#n@jJ^g1>!J;UGY8fm2C2N0)1I}hv*WO8@D1&M_EA8R? zFFu|Xd!;DKpjyF7SAbeY^4_qvPK%-ps+Fwttu24Dpgg9YilPjvRjl;7(rwwe+f>Sw zZsjS1YBekOKlSn1RAg@jQw2p)2Gtr?dR_a9$NR@rZBdj#wU(8xHpw=Y8DlC)6lGAY zW9586;iF&m7M>^Ucu|x=wI1499zLwLwY5eRWl(KkrFVJmnvtIM@VqF>pxVev$Kj!b z$31J*CsC9^^%pC>t``>z9wL{SFS7FIeAhc5i~tEtJND1&M%E3HPnkp0(8?G!~BRDZM5ebk0-8=shZAc``m zwn1A72KDod`Pix58d3(;c2-*X%2}PlI|=v5FN!j#cCgaX`_H~P-ApwUMHy5(S?Ns4 za=y9en|YKd%Anc>YE#dMj@H&>QItWoo0V3+WbZ(yS-q|`q9}uE4=b%ks`ih2nz|^8 zGN|^l(y?(gU7w<+K8vCZs(ql2)#`lKRJJtk{h|!2{jBs&s_E83%S<&8MHy5FpsjO7 zs#i2MP!wfQ9b~1uujJ*t|2vP%MNtOTAy!)X4IQU?e#ts6iZZAUvvN*+%~g=eXQmVoMHy6=Kn36Hde_=&D2g(uE`$2D z@*2Mkp-M#%4> z$4z||MHy80Sn0Q~kbyBgqc>LuxAK%hb)S{)HJGnadd zq715kS?P*BW#mtfDB&IpMNtOTLsq)C>6&q%zPPqECDuPDl(dc#WR@~N!zJoBrgD9WIE z%SwBA>e=iA*4B7YltJ~5mD_(GpPR+bH#407{#1(iK}>;yl%RiX^4gsgOI{5Ybv=Sh@Z6lG8)Vx?oF zf3B5ntcQ(6Q3h3FRyr#?ZyuM+R5wwSL6wA+-sMZneD|7~B#JVqlCshoW;k1Kj;U3m zD1#~)E1i`KS2XpEjWePsgDN>IU3-(%zER)WdLxQ5s8X=f5!HWhy)CBFXLGNYGN^uJ zr8Rt=;`D1$0BEA8QRzu@+i zaF02nD1#~uD_u91rCD~u)Lv1PL6w%3-sO+At1K|}SQKSY{lrRlDLsaiYG*1@cK3QI zgDM>>tw!6b4G)^iFN!j#(u0a#ypd-Gs40pvs4}q9b-s1G*!!%lKv9%Im64U!u=CoS zn@x=oMHy6?psgF_59T(tUKC|eWoD&sqgiv5zhLU3D9WJ9!pb@E@%P7t>rKVU;ntQi zsIsz3EvoaN+Wk!x7eyIVKeN(VIjd{-C8j!yq715Rp!)6IoWs;4QItWIot3Wh3p)M1 z+SGPYltGn)m5$zl16FvRDOW^M231a0x=Z=Aea0(m%O|H>L&~7a#Y#t%|MF?h1l3uY zOB7{L6(p(m>MLCGN|&h(*0r4I@QLRS}2M#sPeJW zvGJ$x%EzY8i=qsw{H%2CU2-;W2UBr!xizE=ssgO^S-B_S^zo*0i=qswf~>TMtKwI5 zmSL@YGf|X5Rfv_2ji0NZKVoW>D9WHJ%u2_6t9hm7nOZ4|GN_8MaBXjCg^Wos*AZnqDVK~~P6-60T6%Mbw^o&=es!Aob?g@D=N}jt6cQ8><^1!G!2vxh26PMx zsT$_rv1>p`M8i)09Rk8CG^+0WhibY7^$G~~>);>Z?-%AD(lJ0>T2RK0rLs`VtEN%;E14b|E}GF1N_>D_6TsgrS1KH{$S~TP)LXWXYYgkBLYLiy85*X3h@uq zi>?yl-!3?yNkCXcK(7iB5n(~?DujjkM`>p(Rxe+*MwJ>hD^#oVUw55$$oNHu1ksE~UE%*jRRA?U&)FZ&{?0@~NT)tNAx|OQbsQ6zug9Ac3IHhy`Aa4)< z^Nro!dwUY*h=4G^4guXFI{7*Eh=>f+n*UFS3R;K$=aPH;&ou`}bqo#h>l)f2;J>cc zD_^f(y_!|(Rx(3m0blMM(@DGcS8(%pf*cmx`=e?6qZ$6LFTA}T^RNlK6-qXLE zU&pY}$Znqg)~!~(cHP>QY_9RB;Qs#qRk_OldkTdG_;+xJhqqy8ayrHI^QU^5qJYD<_xW{m11?lrJHd?u^WOVWG}i(6xF;++T%?HJVFFSHxpg#TI9!fo_Ajq)EJ`QIJ-Z=CRa^lR_m%`*+G zk3l`0?&-p4b@2;#20{Cv;Qu;W#aZnt)vR8jdQI$T*PxKD{=Kl9+7)-GNVVKCfF-Ht zA0FN)pjV~P(6A2fwfs-7Ln9-)Mbemp9{z9Ne9Kp_RjImf<(k#7Z{d;cBEtOJM|gWz z&z(-r$m|+WInqD4YEW=6&o}61!_dgE_BxXq^6FjNznj}d>q^HUrzc^~+SJuqiruG% z+yA+GyI?$h#r$`aZxGCU$AAUxcC68Lou=o%Up<<~7T?Eg^quH9|qNSg3pYF(<% zyq}6pUXx5Fb1awJvtM{9iIVwR5;>%#visNX6E`4$%#^)-X3ut8QpSToAP|Uay!lLP zd=jNmLf`xd3xIH{QV;6EKrRR4vZ;o}Fi7Fu)Bd=*dwartj@{V4+_iXk{xmB#bir+3 zP1pVnneAADihvS-pp!xW)MRMm@%^u|o;0)Nd_JfTfBmr|H6eU5yyak76*Z1`iue8S z^!B{le8WZR`8rZTDqkS<%np+SH6Wf;UD`UD`txbeO8@+j?5-}sZSQzcPwQe@jEcc( ze?CK%{q@JJ`s)uUy)*8r1a>`GEJx$@ViiT<`RDgw+bEm7t-+V)?qnRZg{=AbhK+S_ z_o>k6`kuGv?;A3bPPlBMxuo2L_OF*kv#u8loSwh_xcKY(;;%opFZX}_@pi<2Iqm-X zuOV|U8Q{M(Q|CyUje8Mbmo8})8Za>u2c!>j%CTG!iJ6j{C|KJ@@c zc{wW^l0G*0?+(w${nPG#1Bnfmg9q3CUTQsMSdJHe;!}6H3KUOyR!c(v_w=;e<(k(H zM>&{{7K`y{JoWH!+noV$@_BTzfgb!X;^BrKD0+w;`ySpS1Ix4A4@MU+jVD`7hjvN? z2uckMHLfiO>-BVn|BNE6moroa>^@kHY@-{?GJ(`{iDP-MII8{2_mm^JE8G(HZVC8F zf;gTxZ-0#kX{7q9$YVnBaZVC8$~O?a(AcW0gp2Lh2j+EB}N3`_?`32 z?nS!yNXtRBF4xtfh)S8vChW}XZu3CqjKS5dwbhFfPM0tH-=W~JfNU4kGBGWA;EP|^ znJr4#Z#zF4tcLT^XgCf}xx2&h=Vt%x?3|CG^7@0Qe%aDp=eOH4QP;A<4Pwfwy_VN+ zY~iMli^*U-E$Yd<4%Q>%)OVFL3G2w3J^E_U{AWj{Ry+Ts&kvJ^ZtgtNV18caw6YJbPg$y<$=^ z9xRu|yjo9!7~k)1-ySzl+uPlf$5!wD$-g0@U~+x)3PJja%O2d_+pU@NVJ+cWDkg(T zH67MP6U=e}^}IcO-z9E`zmISmwREsMG*AY+11#U&KX?(78v>SA6q66J(_t`h`@pcp zU^*JlhvQ{9M&j4Fg;{ZbhIxKYj23>_h~|`ci`mfUhxG2jAD(wlqP8|id9ePWNZSGy zuZDmyvacE}SIuZVn}tX0{hr(rc-4?{+TPuPmhG*b1DvnN-OFb8e0w;XZB#>xk?-pn zB0+w*?iHxg@Fs@41H4jDtd|dgn}9kT56g8p>v%QXZBO^2L4|4$($fwH6*@m?`S5i! zdvTn4KxG$G!K(|hYmat2Ba=a~D4N-P82Jg;q-x;6NGC3r`zT^1?xV-u$-XIPrU#bn zs@oBA5$HiyFn`pm`D$5BMuST-x3B*t+%c%r!DP5xuSda=bnlQ}8YdH|#;wuQ9_~VM z0t!ATyWRG=8`SLo&Bg0o)xoUT{YuDCKR=) zKcF^vl;Ih!u@CxWasWD1@-=%`@)hh}-p!k4PqGZY+XKUdH}kR>O-8fu?tM5s;xjm< z9+67-wW-Pkp}HdoxxO#-*GY}C|Dpx;#}S@~%?lrNI}F8W0I&M8Da&wJVVOUsubgfo zayhqH=P!=1f-Z4$ai)M~F(@WwU5{6I8_J87(2&~LJnbL9y^<5CZ_k`>IcEid)PGxT z;T8XJ*}0i7$HVL9a=dxoAK`5apvu8~G@Fc93lGXJd06D&TUde@3kl0UN-ktL;AtO>w{DR@f>T`GhdH18FC(zZn zQ?3GRItcnF#=B89m`s~RF&hWv)dO{NYj;5kG;_O|au+{@-DT%p`o>PM-@M&M_;v*G z&KR%jvR;SyjK?KU#)Ny@r#;!xDIISFT&NPycU6#@6MTdRCHUEisT`D(x@qPyDBv-X zQ`jS##x2JO$qcHtKX)hIBHF(cTaU;IxGUwO{E37&FYav*5qn#W#&x|K1$FhfJ0Q$T zE^>*i?*EfKe{Ol1$VDF1RyCjURTq``hi^_W)=%q^TUN%Hg_M&4ZL@fUa{yZxRDG9|ir-J-l8Lc}TWHOtK57 z?{&Kiu`ja?*WGj4Vm(-_7uC8MMs6VkLElfCqlL^9D?Qm3dg~Y`-|vsxH}N1H%#=)c z=+(c;!R2@ra|%Y9QUKh>zVTo+FGkH|6kh+7BOzPa;@rFQTqem72@H1`q-!A&BY`w* zSHHvt9kE!!Dz_UcV*A5(RX<3FkX23Jg1r#wzUG%fdwHp-%Kl!)(^iVhY`RpuL!wE8)P1 zxax81IN6sy+K@~XgESi;jy+opr{TgENC*(ZU9(NRP_ogw6<(w1yA=sIu%fb^Q>jW$ zdIJ1na}m%?2lHaS1c!n>Bxqjc8uC0!r0#5IkJFt#n@*mpde0!~3bOlOcTm}R889Ji z*^Fn!uyA4~!PR>awV>X*H|7$V3(iqeU`6u0EAUwDL8ihLuQ%c1RXm&1!3Z(Qre23v zJ6o|`5o*t=D?Xp}-H2oT@Nk9;;Y*hUsj}-{*_GqbY+R1U!zxG-tX#W+_&I4?*Zn1X z;3QD(ghr&FH0iA4Jc_b2sfHX)httVCCU|M!JvF}q7)s~KvO*>=_rH=O-4r(X<5r1u zT_vij98BtZT@RZOZB6iO9+KA?96G-~QCG={f{T@+youjgm}ziWq>Mk+U=Fq3AQ)v= zPm1TC{mWHwSVb;*BI(_sRC*N7RXCqmT8pc2u&UlLc(cI>`FZO_5!nULBx1;v%J-J$ zkR_}1O3BO8b$#m%K=Md4yUzdY|MQ=aB}Ohw!D4=5916ok@5k}19!-L+!>^$YdrV+2 zZGQ$m5M@CmnEE z=5XMkaM%NFM=;_rcwu|`_QvBtIuD2Wp0*(=DA|KF{IVFpKwQn%Rj}|G8D)T~QV(pC zW#aR2t#Ou7heEpQvA(YBw_E*nQWvdtxQ#^e$8b1YO=2jH5eZ4pBT3t9eM)!{nW&qY zSX-R)^mf~^3}g8l1X4u{UQH;f)ugIZ9?4(x(--m7+daGiKj|eaeERZf!?;P76GjCJ zokDl*9D-xGr(4U5oEjk?Z?P_``83?dj#Kv<(%HNou#@QvJ3t76HQT+kD0!jstLf4# z*J5uO$L0fgl@_xp@{84(^C7Y}$Aovn;dCWFLAE@%K=XmjH~+dv?_I}DhAJCPks(_l z-NQrX;27%=F&)Ech%}U&7Wemu4L%iThBmVj4kjo{%B7;~fxgjf-_E0_@8O{YFk#J9!#j*}o zg(6EbcOs+YBwpJ)k$3&SN9)yQ`*i%a<>;WDlyNis8_`}#=8j)b4DtCrMR25<4|CRV z(tNsA^hI1CH*cp0C`K197H-*>%}`Bv=&dXUe7k>nfhmo%pQcQfgY{xEgM&9bXOCOt z79+dMw5jb=T>SkBnHiLrDWCEzSB9DDVm{D1N)!-eg0A>o5*=)avTT}a5|Zeplt7p4{Q6xQZ zg74L?T4PmMHc~m2T(0AF^{mb!XFY0DT7+++;V1)j--8f=!ue`GsopqK)=R^#b%7Uh6l zcirwE9Ff1pK_!o%8#wrA)4W(3_;`VN@SNK1vBwQTD$>I-uzS7xhTzD{-QgP&B3^=o zv!=AgLbjYnp3KJZy@Y!=g(}h31hD&*rk^TD6J|R`6Gu7oH<9?bj#tj*i&-0n4VGqI z7SnPPUc<-3`Bm=9J)WiV+HlWoYS&rBFrgaVeCX3f4vOUCIpn zG?@(%V!FB5{42HI!VZrHNZc+fXM-N!PY8?Vo_Mll;f;T!iYt4QloF74+>G=tGJ46W zqBlxJ+G6Athpud&>4I60%lRst>eH4~hc}#zm2S~HuDnv&!&x!#3_3C}Vf@vP$awsT z@>NP=w1UG>;Xo|QVvMw9Q<$8?CceI;=B%~6Yaf{tj&Y7U@^aF&q=bH&IRbPVrGZJq zRT0Ui(E1GNWH3c0$ZB1MGb}>BIa8F>ILB9yJG<3|g;+cAlboydulT7riIWii_iY!7 z-&l5ip0sgcx>IlhS1=x2bLUymbjrPr$cG;0%CBI-Ekz6`r@@T>Kt znnY(ZmrAgXGTX^Br%l7Hy5rPF(Dit8zC-Tv3qET(tA^a=Cfu|!P6pL{oYNcXPFIi6SFP+F{k)wUd`3iYCzW!MK9Aak31-fb$MErh@q>o)9T>KxVEcu_oAld>m@rd-@H1uDcO#6~^#sr4YPoPxumB@->`{pJ z*PmvyCj!6Uy>9nUX5V-2lxZnr3`H>)tI05?M@K}7Yp3b&DmLh_jU`{k*Fbh2LrG@dwSDy2J<+(gzPrxG>B z@R?<47tLU_Dynr6%atQ2q_V#~q0}ppY2woumCKNZPRYE=r02!5=220HOY>sv&mbL* zC)CK%mI9%PGb(zjdIs$rGnM;{Nt5pO_L(GjE;!eSoxwu}@KOQN2c>vACW$Q&LY)`u zMNA1%Se!Y&c|WB7SZI4&e8}m1i1L$c;)l?vd{h-d5IKq%^qnX%r#8#tvfksmy21svv&gC`s-hgv*5TRS21%s_ zL2c1Kz}P4b2PpEF{l;E#UCiA_5GiwmOuCiv%dAWI;1z`un@r*>E}%wqj}wehIc7#Ek!h6<>74mi?6vYmi0$j z%W27NKzw0k?3mfYnkrbr<8fBgwN3ai1dMUs$gp>Qn-Slbu=!ogY zw2Vd#>_kSnr3HpPsPwiG??6eDoDDCGusI4^SF>o1N$FQN-u5>i_-?rV7}7pHQ2KC+ z%$^<|xnex9z%Je;dPl4%lP|=pl$|OxP>p%e(Phg+Ql&eNDc@;8pFc;m1b)|(FUpzBA$e1WKsrG&X_T3j!61wSvR8) zY$QgxdKrJ)N}_BBrmveV6}c;v@+`OLy;%!*$a8Y6I%nt@8T~cIGMX7KSSR65NxKjz5G-8b>$XC2Rp7xtZ z1T68&M+_o{MF=hEGhj2%NO$xp4tt?_2@7Ii02ippM}Hs`!m5&}%*#cD#M$KxBGP96EuOXey>pzDLm0sk#2)@|s%vh7bdfh+6 z71ZWxgk~0tU~7S*r|hgkQfj=!l~ezmwn?Lp;mI;%&v3d}p@>L|lDiC?P>ve<4yJOe z6p05(w~ioPqrs?JO`7REIOESKv2G_GMWVLGjOtZp?L!Kg>K(ikx?|+mQ%_QS&o%?( z?GKA}tn}`nK0@(gxUcTr<)EC6ga`C54pbUGFp}ot0U^HZR^u5!P6$f57m0z@vgV@Qib^b_HKXLO!98O|J*a2n;d~Xn3r77` zlKk2cE__{4xGiGt&=Q%XP|tNEKQ`gVp#lOb5qv|Z7Tc=`EpTSE8dQ_jx){ftG{a_z z@>H4xhwYuOZ_lx55hP(ls0wb#$vZUUit9YP5pu@?oO_gnNpwZHnkb-)z{2qu-uPKP ztm^RY`4DE5T3W>uXizEnDQ=xEK&lmPcSi6b^ZiJrz>qsT9%JefR&X&b2|$EYA+(>ecRoAXD2NJ8&(#B+UwW1b6j19-pk#1v4R&MCZl&jBnPc$qn3tpJY>9k*n*?^ z;k@77!QJ7KOtTfZgPwwO>JDkHHB7yF8UlL(oXUs?l@Vx3xa5u;(bCFU33`xo2=N-V z8XuDyXPuc=UJvHDBhmOF*nm0A_T><3c9IX9barI%f@_wV-BNZ5Jh%;hms@9N2D9*j}r6eQP#r{ zq|Fev8~Wu;IU{zR9Zh275qIG?v*1#$hn&dn#fnszx@*vqXH}thObEjVgzT-{6thpm z|H6O#E`LJPO?1Mr=aNE>IZZ9XADmvSh2z7Wa_Ev+agqy|>hnp9mE?>-*^dX<3&8KR zGiN#&tZe9p6)aFBC&8yZT+Cu4DB~aeSZEr%4Gt$KMR{E?`n$$l=U(h~ob&7CqDP(L ztr1KE1nLl2MdyfEiElWc_tZ)6s0gW^Uv zvU)NdkCrVV%rQC(HSb_tD&&(Hp{(;==OJa=4tB? z^ow|+JF^ZySW?Qi#Q>!{>uC`i85qD&fZg8LJ(BDWFz#@zQ^Knf%iBYi^i=!+NbjLJ zdp(U#0?XC7oVHKLDLB*|*EsTbr#BQH!jAsu)@{{(!CuA#i(i)@OxVoHU_GsuWit=) zM&nhUyy9L6O0@@vS9)IdQDc}XzWp;4(d#CSPnz(&2WC z9e7Q&9bWG;z3Aencf~bS6*63-KW=V5AwEIzf!&Ye;ROyGkFek-3|Zo0m!J5O510tQ zW;Vz}lU}n(r{<DsNjcRHLI3cED^+HTN#nhnCnKBpT_6o?$LHp;ppL@OiK|% z;$XzIt|q9`YQHM949#z(KW0~Q%pyaGvL&1c@CLdK#etxFi4~eWj@ujc`t!KkTy8G@ zrT_QIjPevp&IQDeNi2{tW5&V;*V;QLHL8fO_AfVF&~<~r8sg>p&k`c*mOA6vWUv^o zOE|<@hky!adKngP#ugDxmx#=K!3})g?B2IeiVNyuCf;j`IH071{X1bB(e`JxoGn+2 z=so0U2&-)+a%PrI#dQ)KH6ULxp1 zfFcpn9o+KHi6@UPp-P2L;q;ejHE6~a)u)H-Rl_B{DYz$v;c^sEBJzU9)yO<~c(CBz z7nTsM+enVBWEQ>W||LCM&AVAgW~#U z*U>P`Llb2nz*NCReP--obtBw~;L%r-N@VVKo8!~=#a?mR|I zIKg%EoyGtlw+v>8ZEFjOuDl0GQoQR|C$X})I*(4Ds|mpQayWw@HaJEAkkU)S+bXyq z6yW&qcKc)|n2YdwI%j+GN7k{MhCCWR+ZuP7hmHXpgxi=mM{A1$P1=URO8RkeA;TK_ z9?T?@hksPG5>rlX#>f|<%}asJ9Zx~J3bxV>4mwemO;I#5|6}%Pf+Fqzky0u=gHLeA zp^JRtNCJr|b*fj|y=3&1I%e@QHd_pF39#SQ>0nx{(XLSPKY%P+ZoaRuq~TCBCRM! za!L+`tkdtV)E&*a(0B zx~NCffbyBb({w<(+ITp;%54OuHVCV9p_RZw+ZGI*-zSREb{Y`Vou0wJG_Pkfsj4PU zO6Uw#mRwI`%+$NWzT@sN`U(GY+pZJ{?RCXMB+YScuS4S;#>w#j9eVLODMTljNFaVi zz7K`c4P%>-Io&%s==M9{&u!RFCRV%mT}+Bfx4c0pZ&Ft45o<^SYDY&L>o5{dyCVvy z4RprX^xHlgH#rX1VwDKrB)f`a_T0yDDM)b+C>>z{=EPa#f_PEe`B%`w2Sx4$#Ff}n}O$aUt9y?BhhT2WD*YuIY4NSEw3;KZa!Gd(I6Uj1S=u}$1ZB}5@Msb zNnp8)s=sBrX{y!8s=Y1YxW__)*?&`2rX+lYRlTtu&|@@0hl{3KE+Z%FLgPD^xY` z14U3igjf+jQa0QMeE&i|qYjjBa0w-M31E6+vYYO{)C9$dQ%{l#Jl_YokD8^$6cl_Q zP^9BRT6YA@mb0@Nt%gH?ls5Dgl+IX1WPr!HrYQ8KaepfUQ9lCs0;@RAA`!aFYkyv>aW`|o9u&yY3U-7au#!huk@g@pdSf#eT9GU<~%Q4Uk1iH|2 zb2L%iO8USQ_xTQ^%39B#_BSOvGGWpO5ECWqSs+I;>`W^b_4Dp@cN>5=gKCI=gp~}@ zT+Tmf&T|<5xxIfUwkP`c19It6YA>>Nu`(R;C+2FVf9+!ND(mq)FHluBpH}=9{$K^0 zyHv?B<*kbO2TMv0q)cq+lp22nrDuS%PviEQ(9|e88_$*#83;aZlhv{qF8C}G!h3RLWr+M2 zydt>aBA;Fvp!Gy#`o>N@u(}w|UN%U@aDaAx7_TdJ5d`YxAYo9COQR`n>MvZ*_#Wpc zXSz+g8;F-L9Gr9|^28GvO`o60^ua8@DLUqp|#aoB6m&d z5i#X#z&8}^QS`89ZeR$&qj&>~=bh6>BXk)>+`XAgQYe8s@kC2&?J3i2Hn+QPTYo6v zEH$5sT1zbo;jyN86CV+l!EPP=V>ClBPXIIB&>dEi1|t|6uj!eBzgDW*tLR2bOxDLQ z+ov~Pr=W<{T8Z8dnpd*(6X}8FHp5m8YpItdFm&SRN$wI4S{e9?D}7Y>1Aik*p3hhG z9(=|MZ9LJG^8-b_%eMYqqvpaYIO+XmA`X!2q9_-rjy9S45Tt#MzGgMti5Dr#d*?#D zsC&pX#yQ?cxN3?q`oJ9;CoRFRKQ zH#!uO1xNN33q(CC$<<PK-iR_31M6Xb=Zn>Jw`7Oo(^?IOpF11&;798iOk+B_O!YV#@Wb`1j zbiP9t*Iz#AFR>4RpRk!sw3n7VY>-Sd8KLfH%~>^!P$M4jVVU$X`~F?l8+2go-EYs)2ZcXLpoy8AuxK?{&(;NON_ICA1SH2$GgU@HuD3f> zLiFR{{w@BzNj+DEI*^iPq#*&SAI~{~Lh7}iA;C?dY!Hvwb0P|&@HFly97YnMNQWz+ zaa4Er2_?rYTsa=%AlqPc1QCZtm4Lkk;KpVoM=ev#!!NBxaG-s5zT?F9t zOg9S0qw>rwN<{Mio1uFxx*zFLrd$ob_xuOy*^s{z(nshi@{5F&q_{h7wZbEBY9s;x zwl`H>p^qeA6 z5LCEUQX_Z&o`?jxsbf$XT2!$u^;_6F$hMdPvX*_y$MOoH%&vg2Jo-UfCWtGJ8P4Kh11}|vme9*$u_~9Gu}g%xSi7a@y~so^q>IPO zMJ?V?{^lCjJ&lduJ1!6w(ZSN5whai;JEYF9F&CaK@P0rzHYPEGXMKA8c8KaijV!$k zWzn(~!antTz`u^}aUx(|IuHUuQpdDdj>EZO#z-~J2I=Nm8bI>Z_NJgfIAUY#;NyKk z*>Z(`w#6`I!x@=1sXY+B)x%e>v#5MHq7cM#!je;q?l%=G1rY7!^g`?bIZ>qoWrG33 z@GnAjdx;R+W=csjD%gS5p-NFW?Sw(L?bCsTh2_=mcm(!lxHU8)LF5n5aG2h+dF#ni z_w4gGChIrYf7nT=Q>0VwSBwV}OpJ&9W3us3)J0WRs~J1tg!&OVJT_A*8H*&OZom=FMt|!zmURT~Z&KIbWObd7s-g+Tqh0V&HMA5ECOjT{l=?I2PKS^AW^mlgb zZ{VRJiSrzW<~hCoiZFA?2-kz6tg2Zlp-$dz>O=63NHT`W%UZGZJ2Xu-!tg7!DF?gU zN=^7+LM2Ai*W?=`nCj`MMr((#R?K0ShrDMiH>2d9IQciZWsRz~c%TWF7doT2#Cby3 z8hAfFJuN9F`@?n4q|2Y_vOCl0s$pfr)b^g`woXcqaXVUIM@Pe=Moyup%BePfk^ax! zlf~uE3UTrI@}()##EiNAVG;z_$Y`<}ue5j^8+pImg-}-7I>g&69j*~a#G!LN?xL$V zl1JF2!9W{nGr`o+#=yKYtziMv!=v%mlW+_`+V|nEqc!hhReI3-8ZYCRV} zV4%(OkUgtmnu>S?odYAaW3f;h&VC@Mv0i00Sk$OX#{cQAiWr?JM(3~`f)QQ~|ncvMjiDtQ*4Y%`^j;NRQ*>kT?_^)Oc)ShjmGkyi`6O=>$Q zOs~W2bBlAb=rCAPkle-*fKfsrYJ~wpD0}y8e1CiTzC~p~o&)d6xs76#8^0|~WDt>s z1q2fB&qB(Ez(T5Qc%#J0^u0%KQD{hZky|M!Z6gFV6iX!%Ds-YWBKHs(UkzFk>xxj1 zB%LC+l2c6``=}>{KL)liCTkU4M7BZ=$-npauitDpfrD0Rr^NVJA%76l9H(Ow$3XR& zRwSpjm!j2V5ykS{;v}AxVpK$SqSMX-(+xCd4D5WkRjp0qs5E|^aJEwbadpx(JzJcy zAt(cNP3tOGgHbtcCV{gLbk+JrfjQW_@Ym*b>XP~JOJx%3#X1F1+)y085+SH)`k_q! z32vP`96m72(+6>S|FrIf*1DV~pr7U3MT-iI&z@J34NBalY~GIRm{V~i@1BdRIy5KW z%ea%&-ck7u%g+yfHC&dhPB}=cz^foiaNRaV zHNsV4mfeHp&;&08x<0T)VAc*4bsuSda^;FWtXACKc4*LUV>+HskSDB1HBdgDTH`!z zP5z>ec20SAfV{jhp0HRH-dBrR1x0R}H79xLxokA;@$MB83pb4kv8`qE#G!CfXbZ-i zoMv1s#tY7?qU|+S>w>R8qVDxlBSS)D*oPr-#3RSkYjZuQC(H4AvFKyDPKES1+-KdI zM4siTW&m=2iC)vyBM$&sgHts8Gk;rHy$cnbs2{DTe#0etBXx)wCFeo5~0Ly8hNNcH~&}a*#7@ClcvcMO{p% zGdmBDX>az{=#%hNH8L5l%MbaX7~~`y251FTzOLrdiyoU2Mrn6yg_QportA0*Tl3gZ zg_3FD9wsCQ6P`wdneg6)YnDSh5r7=bL@V`tF{-(HZ|I-*Xadkf7>NgN6ap-eK+VXt=!;G;QLEKTEzRuDTG|do{CL)E_gX2OvKb?BEaa-k7c@OG$sE zeUD52gJNPFa6!Z_$;bnGXBY~})$aLl`l+6(;wQ}z3oSK1fRp$mC@Y~_EtfKHHbt{} zIR2SzLg*pFjR@h!Dh@w}p9*EkMHYLP%QZPr76Vxd% zSc{h!nzlGy%<8Em3jq$lN_BWba$9DU?852=D%V&CYDx+xdx_CMHcD7lq2eA0M*+>4c8+tZrBBm0S*A}B%p(b*hiLY<@}Xw3tp ze!2Lw$%trzxDK%uPjNZ6PXN-)R?T8;*L-SYyki_oTJ4W-dMl@r0C?Ck{1~AUnR4~p znA08O$*c2ni0ouN_8ybAqN5xHf9U+i#B5e!LwRQJg)APfLheZ&r3`+Bw%9ccI^BNn+mJv_h(dSav35=Lt1 z-u1SP$l$fH@s@s!ARf3e4_yNPxh)JP_5@p^Lbi21u4W_KMQxHHzF2Lo?)j$5S6f$H zIFAUp)uyADE|{I{e#UN-DR^gR6>OW4=MUaEEvGlJC;4ETK{-&Tf8d91F=9Db;7k=0 z1RKPtQbvdi2jM65gz4vl$TXeycyhoGPe?eCp-OIrHNu7KNx2N}+oMHE%=v%dX5YU9 z<2~ZYNjgS|;-eN0NCS^T(ZG)kSx1-Tzzcet!NryWNt_-k5nY@RG7UV8$cbS}oy!`eZw7=%opFnXCa`4__z^f099ak8GW=|k#pF)}1h;brzmT%1l zA2GM9en%F??uEo3)`KTmY%!Qaz(%D^jDdtv(XEUJ_C!4EHfQ(qH??yA?CHoU8-@ z%fWhFjK)oECWwt~jsTKtPZD$(fg??>AI&-L1as~E2`FrVN}r=yhe^1UB~c}i)*NWo z@A1v<7lcxNYt_lSD^5uDR|<82TVdj-CHb=Nvg@H-o*hZI*i^6*pTZu!hLIRVUM1u` z1tz0|+M3e-rC1HSEG9FCcu9;k*<-{ko^t-eUGF~(wT!gSFghy-|3dKcnr$9d%60L_J$nV&t@Z{VH^%b{m=mVY(FgI~eCQ9ZFd!F+QQ&va{*Ktdmun zbPBVCLD4!VDmD&kec~?p$?=BOvVi@9XJhBOnSSa%g9*+4QGc*~52(;LEIhJPMkzQN ztL`=cftAH@)QpB9ktt)u@#0SundF(7-Jed*Sb|Ne4x*UIlfbPf?n{9?rkI7?*%S_} zij*r|Ky-z2-9fdHhX&kp2i0TKwqMS)Tnwla@UqDF=2ptW5Xw%RtDO*NDtVLwEZ38y zc3okY$fBa8aL&ClFRhmqv^bfg^Bw{|riqm&F9#%)Q^5zD0ANi#sP<9zGIKV~gIj(# z;$-*8=v3C>;D)A!xPnJ@Rm^7#v-A|pSxh?rEHb6hf#uzSp;|w-3-Egu!usHJDat4> zWwBf!8{QmKiU*+&GEg3AfRHy(+FgcH{|q?fT4yPT8}%`-|ouPmp+NQsjJXq*2q=puxj+zP7m4t1ATV%!y8E_|GQ)#Ibl!J0YJ-X-S zNl@}=6iK5$v-C1DoAAUz?UI7Am(2zB$RvT&e-Ckzq$aopMHpxTF&UIiU84TiTnWHJ zcSieEVOnO#u8M}m#3PVi4s>~oW9JgE8VrdOt3rUAe1Ssxl*~`hRh@%>e zibc67gXJG^a5tcKLntzi+|w@A73wsgD~@lYhYyi@+XV5vIdW}K_-Bc+1_VzamIsIl zX4|B5wQ_oUPmhp(mfiiO2qktZJb{aHIYF*xJT5FF9!hJ(SDPBPTLjj@3@5}RRg_^5 z6W_y#LyR?s#TkOL2@j=?rDM-~!6a-`Fy71VY)C|6mc!+IIg#pW7}H&7-qUS@ z06*{k4<>ZD>sQIdor&sRTsU$G#FFz0R{RhpJs}&*2&0>yJyVkybcqfC2ljT-aEpG@ zi6(_5@w#KYVgW|_(BsSDxQ1gSlL}<7QgMw82lltw@Ci@5RfArcaFp)JtoHVN#(+fI zG77!z=_x~=_=p5e7LcWn@rUNAHcq&pn8)$=%X3E=F=;U-7Ffy!(Q<3|8N;>kM9%w$2L65#rg zB}kG}>5$-g!yfw<66$V&o@mn$%`qTiC;JUi0B~J%OZn+;cTat&b0{Xa?(jGu>=$mM zn4zyEDjdp?CZEDc97)Rk|9->d`p;CjK;x)HPdP&D#s;^tWy|l$QrvGx@tC1kXg!@R zR{22@hFp1$q`8oB`a>IyBn8KH3ykudNHBBEj1D|9>k$UL&FmrdYK-4JDCa$t_J@Q- zk~jGg!gL^bL~3|Yn>j3+0u2i6*tGB@yF`Gxw#XG3Ig{WM#Y5U`Yww>OAj(=PrXx(% zR5))hdkJXBBb@%{9syDK1ML7oVIU3R)xx3D_*`k;pdmrRLa%k5oald*M~(F9@E09W zq4V6jl9}$f=-%&-+c#-Nc}TPygczY+=;*f1(?hO|dm>wlPqeHxeoF+ci)w2`T~^DG z6#LGp^kTQRV^9H8r@_$!s{@tW*Jz&5B%vrvvst}fWAv16UK>{;O9TwofKCaB-?U@@ z+nkJGO^!INrx-7XX15s>-eTT4YOX?a0-_uxXteWz3KCSp-S$NBID1*f8%tnj%rzj$ zRa_L~auggD3PhbsPM$-?ZpxO_s-~nYwT2>qhC-k?Q#c8Uu9*(TNE@$L;bEb)kL@Y} z^+KJ$vm*BexQ50p9gqKZr$=MdPQ#cnq)`r5^?ZbmcG+GijEhY&`PlcyfPaDdJJPcd z>B8>j=>XLhA64USMJA{-1a%e_@?=curHttmQg3y%X^B2|q~t6kpXXaa9;w%F$EAd zO46WR#M+*S42E|^00ndaJx=Ae5D84ECr{hi03*IIBwA)awy5TZK);=~0eP@R=D0k2 z7y?IkcSo4kue$^WhE|}x^JE^+qAk8-j8Almr|(9?3y0(SHk- zRFgIPUXVe$q2Wj{(&6%;`4njiU(k~7>wxry<0NZ%C^aAbthbK7n(g zVQXi-s>GzA?$%!R`oFI#E``&gNX|Jsbcp**%h43J3`snZgoBNrL7w99wEGgv^Js1s zXGOY|iNgDsFr>rCB7*I1Eu50(ad?!Q2|@DeEPl zZ8SoYJ~?!@JW2Y9nY{M)f$qdyL6IJx22DB70wrF)?TW%gz)-M(nL8L&#G&m3MRvlH z(m=OL4*)?cDV^>@(z%j29}!79tHrdM&1Lvn0!3IOazGvQ%_bt+Y{Of|dKcYLKSl2l z2fPzc6bYDUC=EviHD5ms+OR&u$l~^4Y4}?v1tQ$+q`=$p{3P^T>H-Nc?$7nA!2HOF z2Y0~=Mv4?#6P$OslPQ-t0o3^^d??CGRz?tog%t=tZiB?KlOdcFOx{4U&9ahw8)_tC z&8?8>x66JPm_B)G`<6fpKP~M%U(#(*HU}`N=`7DDy92t} zkA&2y00+|4LK()pe{hBJdK!MK|dgE1pOLEr3`9e7&I`C zbaqDolRxB-S$I7vM|!}Jd7ber$sR#qd4zneaw1vt4C5cl`Go7^XE&5SN@OS+sjiHO zD53p}iC(@M-YoQtT!{ab%O^IIn~TlA*zF4I>=uobUX#4o{Ig;IZ2)Tzax%R$;4bTe zV8>&#M&G_t`ng9;7r&3`6JC&_z&_qLFGSdO&M$GGk|5gGPB&bj7a$Gu!(qt3W8!?flZhKRBqs^qDli8@JUarpL9Bq}Bst|TC;(R+jL*-Af$ zsJ{`mWq}|L1`TS;ks=_?&P_F2^)d+vf23InNy{qkWOoY;A4A~$C&N*rqPCng zf$?-mTEg*4Jcm=YHp>y*M+7PAL;z4Mw62F#K}|0KA&jU0-3DW^DCq9RpbvpdD(~8L zXT`TbJ`hL~22|mUs^O?!sWjAMw8lH_b}u+1oiDLuU0xb=my^@dqP=&t(V%ZNE!T~N zC~mGcc{JBZ1qWYLNv#i`Bj*z!as}IJ(MkciFl#uVi1Rp9H_{dGmSTr_>6(5gs3m$o zs^IGh55WAjmdnH&i=`nTPu!$g%)})p2&i>g+j-m~A2U5#tAAs@c7sdKK05mjkwGuh zTbcSj7id`k*^6Edz^c>pZSg|TM#dXst4FZ1nbl}n&N(nl{{j7C9?)|u&p^S2ZG_aL zA9ufn%r=J9HBSyOmY2SILbxLQ|jdd|uS-cw{+LdAJ^XA>_PM2mgkr*Y}d>;LO`C`-5G= zSv{!cNMETiqQmYVrETLuTKx`<&HAyh>%2k?NT)E(Q@T=hhoHGennja}!U7MwW+XM# zo(r2DiV52(XDwHqT=eAe(cKV#oZk;O2fYU_b1e$RWQ5KM6KS!MV3O+cBrwqf$iKOT z=-aJ`!6l19xFk(1Jz&ov%zP>9RkNJ)^EW|*>6>0s^3bT&+hEe3VKbnNed$2+~9kh(8 z#KR>}xlg-HSCDS)Uf{a9)&}CZ*RwLqHAD03?u!~(6xDQuuC->q*c6pJJXSp>3IhnY z&au>{L;#DtW4D|`6z|TS1(>Ez)DSu#qPSz;jAW9tW6vF1Eyt(CtMtoHJEkNdTAQ`L zkMKQswR60PQExg79ni)N3=BQgpZ1TZ?eQCG=^pf%=-K4htjhWWuH=d(8sQ0YMr>+h zIB1$hH4QH;%$7k#XqF1vMv*op3&Gq@rX+n+*)K^tsng}*wGvjCHYw_ks0AI29GWHi|G{(RSjuA*H>k%?dxd-eG~c!; zTnaGl+tv>;gtKDwFJQ%>_~m+y_7xs$oQX%%$nxFSS3}Z$Aqv0;aZ$A_{vVc{NGb~M zCm0vLE;*xG1Ob&%=qQxr8S*oyXNTmz)t4~EQiz4**ogQ)Kqo3X*L~|1I*_6RecbDx zcsW9+c6bebaffJR6l;@Qc&d}N{jH|0znG63jE)Rw5L4V9ksR-J96qeq z4d?tNl|e0te%1PL0e~1P%^-}?XbCmMjT8QR^eTil$tswfiVMfg0t>w$Qtl*+P#zg8 z*6^Fw>)EPwtk_Yrd};&f%nQ$#Oi6TEU?MyAY>2?k!KE99<}4&q1_lo0@qD;I!}qu^ z4Cb}%TZvzAPRm|oDMNC{zQgC>Aa008jW7|-$@g`0|DL=W`o9woN(QNI+(dn)OVUOr z#uVz}Qz9wWNy-C{@okU(_$4jJhDgluFY|PSjTzAZoVuRO&DZdi`(xjdb>}66{@xoK zs>+nsm2Y2>W9_z?FyWxW1ZE^O1c_irE5}JT=#I^%Wdb3c0ICT3skK=Gn2A}7mRh4_ zi79vK;-9uZv;G3QOl?#kN+1&Mzo)uAG=cf(k<%=j>9FLAe^%(kgTuoE=C=8zi{rv6 z46}+OFt^wJ$e1N2e&|*@fvy}m!-uGI?})_ONwmy`3*1CP9XgVoJ6>dBD0T!dA5`>k zovs^c)Muw9~y4#ZjhLI;3 zE@|Ba1bzz)s{RiA4 z4*CW}72RfO5{ku0>ISYqG}(>D7dGm7_aD?N`lE_&CsbK7hXb7&X<_tbm$+svtrFjm z$p-35C)4=|5s|1O_jh+)?&oyPiLsRXcYucHl75+dxcJg6O5Oee}x62b>)1BB5fJ4!bCZ& zg#mw*?b8aWcYHn#8)cMC)H1xu!jYawjW&?P5SUC8q|w!3e?VqbxNDP7Uttj<#p$Qd zPNB7R7I}u0-{_c$(K+*p3>W5=V`kLj2V6!`rC7Ha5L;uL9QkAtlH)Zh^yZQT7)U1h zhv{nkmD>J1YhZD9WsrgjfjUN(JQ~M3FX{_d*`dE)yg`u`_#QHsTi%;a5?7tKA5+#YuzylnM3NHJVsL&!uQ!*1u>E9VQ zP49w?+CmNz?Mo;9^nJ1%)X4HidSHB?r1Y~e-whf+Ve}Nz;cvKgnaH&gTkTQb|D)r8 zUvK^h@&(g)hE&!ubeLOhC3zJsFM=Xb-B9I(ELG z(;KpPA0Co7sQ&rIy>05%c>2{R2K3@c*-B&AQFpO&kvm)mR5*P8=1)$bN4^bSGZTE3 zSb-AjlwKH8<0(oA(WgtI=wFff`hb=~7&%3aSYHxD%I^$qmeRdU*ZC@M2X7i}re8lt z>kUOMO@T`GB6>2r>UYA|&0~WKp6n3nYKN<_&MB4vkB;LF!h#s^aDi4E)97L1C*19R zdrmG^<{f>_8XO>><7zxIn@Ty!IC^+-b#GLg!4jPds+E&aO13^Eg*zqr#Hp;ziF-zW z_&KMqjKS=5qlJFHO;Z%3sk6w0*k+4{n+R`qh|4u?8*L+luoS2k5I6ml`-vM(ym+P< z%}~2o()nqhJTVmLHGsOEy5HTt!FTZXif)pMz^i_ZlX@MCELRMkD^Y(Nr1Xs59Q>x+ z+`YZR4`J&IJ1D)+IR|8O)|x$~rm(PLgiS6P9I;_|MEpxtprelNIjC5`xIIri?+u)O z@&|2=UoqUU+FkA}f~rWAT1D??M-q)M7Q+&a%$+fKe!IQjzl+nOwOD@O$!WJPoX5i% z?R5_?=73RB={CDVtlaoPn`MSD%)sevT8u`~5C)8PrJd`WAaP619LXf<@eY#(Slf4P zgBRu{+#aa$g1bI!_v;qU1+MT@KDJmuvt;D+Ze~d*CAa0MG06bi(vek#y3&O=N=>gJ zTDw7y9z)RL;T7}HZNGztH_OGJib^Q!(*P4~oB*I%IashpsF;hp`Fb<*F_~C0i^!)D zq&_9}r`_$+Q$(ibNM*H4pGaiaZ~tO2Y8Im^s_b@58;hrTPXzv}K%<~Hx zx&r~VyyUor`v%@PPRB4IgnI{h%`k18u#yp!XrhXq@PluzqcVMyjwT4?>Zdb=H zj(Xcb*QEPw$`n4(CK{;EDB*FcCF?)g8~L6bM3axO$`?3cP;K>s&eN1mrcwZ`e50{-PhH%+w4xmp14 z0o)cIn})So0G5+gGY%Q3Q8rM66x+v##Z$QxB`uL%fwHGPYS@$r8qGMF5v8HHUvwAp z)x+Gy$rv^+GH=W0dp(iO2mv*Kl%L7e;tGvOHs!^G$^^&+0R=?$bTTa0@n#4x-mu_Q zQAQjRlh^k4oBwnDFMB|9FsDl`$UUvE6=li=xZ*_ub4w?S^>STCH>mW!MIVN6Py-0r zY>`x*IG`+PQ*pxvKBFc zcB~~iuPam?PA99{rADN{y3J6%(9(v|w4Ytje8;sE&t)nqYxLrut&8D2%I(j))7`Bx zhfZJn11bfPb9|RmBHh!$6h^|Tt8vCE+a%NvjFAnBxJuY1rr%vok8e^aA{V=^BLQc% z&2GtIhLOz1cI%I3_e_H}v-4t&fr=@p?FU@RR7MMFTW*DC+IgP`Vx2;NVrtKbzNWJY zT=?=B!!v~HS)SQY^*A~xWxVcU&s8sX3=oaw-sQ0HN?W34R7W@9zEfD7)#Fj6GDFl- z&5>@SiEF-7R5=Gv5(??b4G^~nPsSyA;3IE1QO5&lv85$~?(Rpd>U8F^0m9X({NM>s zbu7FNYrM0H;Oyat;uF%EUVp~KjkqEi@PGrWT{Xgh!+vs(W#u!C?2?OU%EiZef-1~= z!+((CZOnLh2rs-q{Z-%LkC<}=2MKemDfFrC$THsW8!r~IW=BFQV~U% zyrnPNt?aJ2zT~`tVDiv$Q@(uSVv3K0gkWj2L|rk8q$5UxpM0)|Z39MpD z;0xXp;YB_Ev@XY@G`OIb9NC-Q`Rc;v@Cb=!%R{-^%Wnw+91ElM40BP$-v{C*)e!Qu zIY&FnahYG}CLI{0I+1xgndzkbYuO*DSgM+pjEE!-2s7=V>f-66-myXRxmDuacb&eZ zvnbXxrk`RPqywC7{d6#zAv`~-*@KI4_vZNRKsgJzle1cF`+UCbyiO14IZmrqWO!|r z(k)D1az-9jIa)wq_yEVqiTwEv;b&a#r|-Md*RNk~^(1$(R^BZn;WmX(=rMIKXUKGt zN1g~iG{C%`U?L8`4wyWA@NdX*r8Fu}n-hJxy^F|`+YJ`K6JCgPah}llo_lJidtye0 zts9<)*QS0vxEBPa?uKiyo`Bp~??4P4)B-+rjRQ_ERlvos-m#>Yqhtp~JmmKYU<5P##y;Kd4O z44O$Ckk4eij=${0z-Uo9Z2V`>XvR%X;LSZ0J*kfFzj3_mpv1+~9w9$a)QzBFR-XTp zEd-s3>}uFNL4iD(!oqwlvx{VcTBw4?#HgQ-hnLtERh~4hKj4Hi2T2`>q8Gy&-M4sv zR*N+c6!NlPKONo=-*G8?VdsJTu54658@Ze=RYr{-Ns{6kp)s+6m}LWnOD16bMJc(} z#1B&JK&a(^$8z=IA5&hoV}_*Z>i)22E_}Pal6-T2dDGc++_#3>2XKB zSrmd!mSQ8xxuZiDtLz*V81nvdLw9Ct@0i;f7zpe0y|7ZIoE~pC*OwO9pS;|=uL|Gk zZv%faxfFcaPjexp%aOAU6i(W~`s%i|gpjBxK0E!hiZ!krOBTGW(NXH^uDJ@W1e% zo-gOX!>0ps?*G~GeHvNLx~iLertL^@GN!rYQRZ2jbm&Eq|7D6ggzmeM_;a0oNY9mD zof#2qf+^DgFVIN&(y=Vd|8XCMp2Dt(%1yn=onOvnCHeCYR`aIkhCt!N5`vFQkpKNl z{AuECh~#bZV^|T_A-(m{~Aw{ z>P2+YJP!rtk}mwBIk<2}B|`cRl3?TwdGx;>PCK_?T z36VNIMl|%%rRm|nQlRIaV+^XfbVZQhfFy_&zu2R}5vb&@j!rsU=}aAfazA5v4wT}z z!#{Nq4|}M#Lu!LYuUDv8lr_`#(GMeBeWu1A-yqhxeG0_=O$c7yJtYyye{c7ZNv&U{ z%t^&3HimNc3#%jP(V*!hk-qp71ATF<+6BW1=(DY@qF4P1z~$Bnr$75zrzaH~o&7bO zpI(UBEWeZ1q{+W~>)Om}VsRH$bBl`Y7+Z=KTrke@xSY z_*3UFN*7_%!;Gn#sGf?Hq$u2QfF!}j>kUm;K|G~HKmPlyd4$Oy1`#F|gu%5j`=s@g z_bq(8P^vO>adSpuqKZ;n-e(?k2=ZZ@N=}ZL(!8bKEMa%Jx;{xBdGTy`()LX%|Iuc5RB>zkYH< zavaSx$OqY^0hKD5QQ;W{f1d2|jF0g@x4*g|r&LQVHg7{cNT%60fYfCM@N{5#7 z_M^bidc>n13_toO{pH@z=P7-{sQ6hvw(LwP6IT+kgHWo+0;z#yXNW1Pkcqt9X3G86 z67dVn2>k;`%k%6;E}!kjzy(*&mSxLCe7 zlP?f!6I2OaW)ObN9W*ZP<0>(kKtB_v5@Z_l!3r2T+mEA%P;IzQjDb!rqo8F3bL|j5 z%E7xZphFiaCbQw{!=o=GF9KnO4{?Plk_V^SV1NH64Zg1r|8$blo+Uxd!qUX8tAA6T zl~f;#yv}Vxi~e8XQ`a$Et-BK><$EVW*Sbf)C)L+&##-4QCN6FuyE>J~Hag{`X?ztt zwE$Y09qb5S4VJNIR`}`p)2!&if9b>(_?3`d3E@+ZyTkMD71+ zw@jhyQe1L~Ehi|h@FkTnN1lq)xQCgh)9G697w&@{uwU)oqokw6Hc1$cN$63i(~lbd z2<8d(&-;^kZ`1GO0vi)`EeNAu|ANsTJ>q(4;u=ZDr00iY$o7R2{cp^;{3%(ulxflT zK_{dsTrX$o=iCFe3kD8Fz>$3NN(CzX(Ko!MHqKkFJI8L`Rzt#`1t4oYQ|0cft&3Ey zP_ke8K9|cE*{rd_AL(5AMjn)iKVdsaJ|9+US2U9M>0ClsZrs$lk@D5G zZ-OhkhjR{#f5vWn%#H3|a}L@NnJ>u10t5Q^Wdg}(xaV)3?ardcBYfV50#ym>{u%o- z&b>ETb+P8n&}Sd9$dkA{!gqcIdBTI>b!Y$X&X1UAL;>@QGa95@o}PBNgCxh4oE|8J z1mLh1YA(e!<@9Dk5O{xgP80ytheJ=h0+k@_6kl59!$A52O72d6C)bTI_<9g?nXI0v zV5KNo2BH_36Vimzg@&`@0=XM>OUq_|q_<)AS7#p1r~8{plpFV%1%(j-4sIkPh zEA`1p1R$Y)<<`chDZCGzUdsNWh1UY<@l_kx{=a0Rm`Y8yKl$i&Ka5;SoDR2d;E!o( zb_r~5ci*<}XkVZlPqGR)6F`5E5p^b0@{?}8B9t-H+%9$qkoqFo^Glo#F5~z!#56el zgjFwa1m48&ZMLXN+{9^35r`tGyzs>$8Fj2{oK1^*mTtZMv*`KN2(Ot8h zagj=RYvhY3jc^)%{E5#Namdu9M@~{q%E?aj+1H;?gGBvvuyrQAPsv4qND;S87oAT~ ziD~Vfk8AgzB{L)~YjMAKx*{Oah9;@%-vMIF$9>qp#t=B|{$f%VGx>q6 z?mO=NaCk{v)P!-hJ+_`P${@6DK&k27!3nVbMeD7ge{ts=5)|tE`FwkLawdfSxm{AS zV>-3*hId7OIf{tv6`Oe^EXe}~pQAViZ<9{;b()ijaoD_@Nsp()+i~-L@WqfX98dsH z`c_D9vK^EN(zYprWSYPunc}Cf`CX(8l0SD59s+4J6DPd?B583<08ZCNTJs6XDln&B zY_4(o8}Y*}!&2e24qWn4zYsfIdV}4(?r}44QyX`2=vR*?^w*$_@u*Fb@21Pix7wfVX8~Ac5fmBD9K5Pa76p9 zj~DTuknkeN=x118hZaj#O-mM2BY_iq*hbeKU6+3KWfsNh#9iIy3yMD^2-Xpz6*qW?M zi~nR{A{NAQ{d=GPt^Z`XR*^L>ky8kCu(-wijK86N3fF;}c`6P{Hsr%ObofTx;hX|Z zFAEq=*WE(LAXz~_-TISc%fsJr{YbKjhRJxrLYl2T<~Tzj!nedX7cLL_!+%qo7OTIK z6bLcs{=K7)E6H1~lTbHmPicc>;;SIEoOdK2cPXtJ&1XAG-xr-6l<%6Su*G5W=pdEN zUF&`^ULHxQD4|AuK3xRe2RFCJSIZgh$i%Uj#_;Zc-wS4gS(!TC;6Qa-_R z1^0UI&qZBj(2^U}w$o!fJujb)Y#vy%>^mgZ3AK_TZcB^X~MFB4=2yvrp(SGyb2hFQdf_O|jI)mFEmo z-=BbSx6wknp=#>K71x+WS|scGIW;7>RT=#=p!0(*L;`}wd3c{Uy+luk^BEeT@8|c2 z*DGB}KY_gv=mOVy4j=YUa2mw!FMAW0`q)XTQy2A;leUAC z{d=bd<5-w}rw7Wudkdt(`xk%O%iSQG>q?wtlLk zz2pt9HT|ytD$m$!(QC=tS)K;nP)v0FA$m6=txwTwwC6kB3i8S}G!e%R0z83?PesCI z3q@}pcDwsqyvoc%OHa#HP<@$z1WF{J$yO&n$-c(o78lT%sV$)Aqc8-W=Qx8Jlq0YPoRrvaA0@8% zpOt7(N8T9wc}^65!Iy3UMKyM|29f*^R*-LRdy6CyI=1h`5x#-b^L#i_Kh-{vM|mN1 za$3LW>H(oM~2JZ%N~!Oz2uT@e2?=YKi>1X?+VsmTyrZx5S`3;BQO z#h{SJ)Kqna*CFM?BN2d<-baf}dQ`?`GKEXf(Ep1BQt44v{lH|31Sb?d`HYj-Py(%8 zM|j!{%6U1Z3R_@d7rxZX{ul+xv(jnKTY~qe$tPN zgrwgFruFUr51Xjk-tL|vr&i=P*qSX7eye#s*)R49%+(L1Bz~~5Y4cHFQ&>JD^kMgU z_f5Z%!Xv8kFAj=IVgIK(TOo8a&dbYZOu;>J#)jlxe6;`Z&S(xt-sTy_j*Jm+=WoeB z3S=UHtAOk(YS>Dpk@PgSYq$%c;3GElB~-}C?AxB}L^N^$6uqE#QiPXi7ww5`Oo>HE z5D@E9`Qhe+`Y(R&ZOG51lplzyHSRlFL1}k#>Id=_mH+NwG_U)M_Z|Wa>!D&YRpZ%5jd;H%);2)WEqPYw9v3)`-0ZbBn zp-`6HSXhJj>4vZ9>3*k|to(jpgxEO#Bc3GT6yqRuyVG;J_iuLaA3WFtksNpO^cS)9 zUq51=JH=TcdbU?dnV7PsMs9#xr2m4o!A9H^LFGN^Ba&m9QdGr zoLD2B>TviT&fiFKj&Asllpu+Gn8K{`>GNuGGfcqnFNgCPLuG2h%02DKN0Fd29VWu2 zE^YDjHHY)%JrmR}M9pA6FNdSykb6JHi9*T15AXNvrAxZR`zEjM&FkbyzkAx4`Hkju z%W5o>>m2b-7;zG${R4F+vgd&jk0aFwPZUio*NdvaFjnew7HMAjPEX@qw!6Sh2y0T$0#L{-aeNRBd6}B19fN#M91Z-sAel}*BOca z;fcCW+fs;UgoTBBcQ5QrvgDw(y3GARcRC-A*R^z*HM$t&V|2q-+DF8`=Ll@OHNuuE z!@GDP=OqxGVDLn}l75eoXj^{lK6yp*-?OO+tXDnQos<%3ZP0DIYRcu1hg2IW%=oeO zB|>*4r%dz+$Ot=~%UB39PbLsVT%J_RBnOx$NLmqKSZOoE5Tt6t{rMvKu+oftwyha` z3#SMA^%t})qa;B})zhwj&)g4My3<7Is_SyGE=!(J5n&|y0_zoxcf(119lX7gGpPp% z5e8}kA=S@e#vuC6PSBKYAu~QAspO;vLB^e{heQQgkCTPYJ-X(YgURrMjzqH5e~#=)qGrzn?wm+XKIhw@;`rn*}QJi z9>|`+?u*?EmaPqhCd28v9*()Up79W~du&yy)Yx4_|61)|zN_t#@oo#>L1f!>fqwkO zyz=VwdegH>XTu!0+0{WJ7oM<~0?qQ~^NOb*#Kk1)R5#(mrQ!ybUE86I)X57HKHn70 z1T7%bl?1&R{|L4S*Tlbx$3?A$K-uL)JJPc9Kx;G^k1*Yf+n~m!{MorL*LGTHUyO{e zn<7bJCj)c{`Xbwk&^H;w!$xBqB3e^EYsb?HU+n}R&Q|0BchuNn=nmzj#5p3mK1^q* zmdp8iKIN{8e&~*;8rfqvoLk|guQ`er1ygnUk+A?$Io$Xkt*ROyFLP< zeT;PaJ?dikyz@=92o`6r$qUFWRqQ3@%{9w{0vKVGYBgR=b@n6y@SdA9XTp%L4829d z;1|*wch5h+o2MInBTlCTF>828 zL&hPX`LoL&5Hz8X^f%Veeh%JA$78M_LRV}TNeNuSB#YHzK3j?fNw@$8b@1u*o{o*P zl7P+R^XOuOvh)Aq(rbO={VsB2q@Rhf|*2PN4o}e-9^OE~V|BLYin7(!@#o1`yN18iPTrnT%i| zt{nY9pp<;V^8|oON=`~8ktw?O-kocF8<2n<yKXkwAtga+fYF zIg(K}dSC>HG=bh!Z=Zepz?fc{0d zeno-1w<&7O)r#jPsm>zzF65S7mS$cPClZngFC19vv~-K!fcKaqu{+x{7so1sQ4zAI ze1KKJ0InzHY#nTpv-nQiVLb=b>UrN#|Gse!PPi}aoAo-7LK<&*YTvi-tYTFq)a zx`Jh>kfiL%Hj8AX56XLboY9o}ZhN}-){gFK3+I`D+Mbn|c0a3%k@%}va)dddr;pxZ z$8BOS-8-``CDg&K#J^oiJwd8)>vA<5S2Fv`flx;~63i(oYHW#O;Xqi1iY_;z5JnLz z#RJSHrQ~%w3>cF)T92l9Z->{4Zi!)_mZmb>$D{;8kbTT)F3%ub@jOmJ8CAGIHFnX2 zq8`jw%PCLBgN!KjHG8#TC~u9BFw-o{{DS~Ijf3U!s(ylO7*LB3_%&{GnMSZ2h?^aU z)yQxbg(|O`v@f0$Obkq3m5cFeJ_%xBSoHr7hHTgjek&wh)${~99DzR6Z!d97iyAEo z_$(H|^1uUIhA4#GFrDv{s0Yl%fRhR4j4o12P`MjvtjUmok;CL)6BSRjpRC2NOFE%V zIjo$dO2bc7J8Y7^`tGbzB#0y)M?U_8DzLVrm zVq){D@Oyk*h3zgDfRP%JD1rmKn7Qc zj}=pqgcg0rJSPdd@pA;gcc-9GQfwj3nQWra?o9JmC`BW3pq@61dB~! z;wDw?#66>Zt;EZ-(-e_7l>2NlE*hDKr?iu|jHd~qrxTxUDfw8A`X{)e)ADlgNKk&_ z_DQy6Z1Q;7Oh&a_Z@k-jnIyq^jOa$Y@5s_lhHe#W^Z)(k4*@ne9Gk#a@cSnBxM2*3i5K$?ThXOa-~25cD6?4 zL}7Rph6+Xr3{46bcb#v8DN+o=S$RD)$P zUn5v0N}_v+(Jz_PvlA+BVFP;?Lk7NW6b7u1CPh)tm4(ADzKxef4`8b#eZp2IP?m@VfsH4>F< zYc!Kzv?-lSKl@L~^7jjNY7iB7Xf&rntq9xl`CwEG7b^{4%HR!s#mQ+l!hx;HcQy}Z zjWc1s5`-=t4+ENve6@{k@F1(_^SOEnc;P(o$tdaAs(7ugY$ya(7nG(Xj7 z!P~p4=Ic>4bDJwK8rB=Zm6g(r6DP>fc!oQKn!%!xv80UBFB6&}b#lOX!!wWY@|%lk z4ZPwZhQQbEjX?uHu2*`4@(*XKb0F-W7}`gkCBTO0z{{AD>sX3EpHIva%}S8 zE0j$0MJl;~bpeDf_Pwr&ANYXYq9$d_!E(K-meWR_e2hW_F;1W|E~HzKijLfTMB~eM zKE|1d6W`E)#SVSEf@Xt~ETZ|^=~~`-J-S9bU7m+$sB0$$TiYCj~$@ zXv<*G+UZgB<-7loS7}l8cfd369rlDvTh{C|r`Eg1jrE{h&+270l2AU2)Hw8tNMYmv0TY5qnFP;_Zd{rm2w+^ z08qL?MjIu%D0%UkJ8dfmj@5GBEQf0etn$(gM>fRE^a4enLJ7JxqxDOV7i6ds?!@+g zIeXLfICC6Lv@fPEplqr8%>0`8_I;UjR(76WdSp3l>!d7c6p}Nuul~FMcM^Gjpbo_zoPUN8``VYkAPObSv)7lW2QKz>YomM^36VB=oz%Fd zQt5q521Eg8aE}YCvpNhJ{=8C3VwPJ;(5+v;MB9ZmB-x(CX3IvyjvkI1WY!>!Hl>5j zi;#dvajvv+6q_t@%yUmnedT9TU=0n!VVkyL)A^=qi#kWycf^)`BGAx1nT^uZkjiwK z9DBIcsKsknVm*xez88gh6<3X}T}Xbyu1~^#`*u2>p~7l z#&W3Jb!Y~awk^;TEQ_0--1ii*D5RvkhgN@=z&P!E@%1iASH(3o_ll7CuK%oLf&!6(b8`f`JKe+P=FL7&dGj@ zo2WjSeCz&RM8d>ecIAwuPgcNN$W z&ZdG9Ze4?B-nrp!37$Oy*KN}*Q>jywFuZyGP9FFd_JXQq#D0hEkHqdD96Gee&X?%e z@n4y@GCd#aZ7bj;vtp%^H}&k*b;;0RSM_wn^uACeSLI)yCq$nD+CET;Dmu8$2}VS= zB?xZ2x?hn;Z8uqvO)8KAR|viAs5uR8q$5}zC^G8WzdSdGwe6azUzOXCR{~FE>*X}V z(_AvRVy>Iph;v%RBnI=J4(nbwb5*D_kH+`iLF_)bOvP7w0LFuzm>1qkYWCfPu8S7o z(q%v{j&fZv85x}`^C3R^O=`I*LspVyd<>vcNA>P+>_w>>;K(SD^KADd>3s^!A>Z4Y z$!yRW^P|MIlN)P!r>vGcU*gzG2sSSFGo_aSpO1HVn)^iyw$Vu4p{km7ss|?(AO#K? zJsqZk1b#n!$lpl{fo+2k*tCL0vr<6$$iO<A0p^y{DPt3 zjn4p5VJ?z;o*JXGLX$;jba;(>HLpP0JmX@u_9~;7NyBK;6Np4w%(8nfHR7(m>S)A+ z(Ryza)xU8nDm%aQU$y+HA7*-C+Ec7Z%4V~CpRX2($JA0RPlDWB29-EM-Ly8&aJHu0`!peR>|z4_Aqth zTq6;}STNXW?$t#zy56oD13NzP+Jq!1PcRFRpK5f7C5mba)cNcPGek6ptsnNjU+nQB zRWbxTPfHZE-~}Xd-@KS})cp&qKn~JZl+->UDGnJ_*b1mx|1Wy{$B;E05HE&jL}#Z! zK9tWzAH#vxj|WlLNpJ$lNgNRw)&yFPcq&m{l}u{k$vc~)=~y*f)`xLywjLQ>X5kcZ z-1N;~wg7|czDB05-Z=uT#$jfO#aR$}&b*C;d_xpa*PTuvwv5upfuSbmkvT0~ad~by zb$pWmM6+@Hm|!cSEMr#jDkdR*%F@u0;BigB3|G)^iR{`$ibFQA$Is)#OsSx2HPqHj z5VAB46#+Lep7Jo;x2J-My8bE|4k72#qXU_;L%qz1VOiOLpIjTyL4d=eGZ`nqqSQq& zzUwfh8ALq*&GMOdjoh|r_Oh;)*&fSZywTOIA!Wj|pZ_P*K>CK(PMwV1^BegV+_d4y zEazrJf}`@RlMK+nQYNA~euG)+c5xWRtxZ6d*%kV5YaV}EyMDO#qo>#qL%%Jk+6fkb z&Ub3TXJ${6amT09j(U#r5V0Andl+kD{PvqwUEKjk{kE5zJz<#@HU{fcAP)7WvOOIm zOuOVipYZ;&?bogOM^UeMB9IhI&VZ7K28n*P6^Z!aQJ)|WslPtjJR-bG4l;yinDi&! z>o5dW1#0K&1yzgIlC}xSDy(OpLGcL_20UTm6YUf~y412aK@sjaisB>X?YC4RBGB(u zzv{9p2(YE5=F# zbMM8d?U4>-gO`~#pWQr+dfAamxp&Qgq!vmc0h26A;lruI$|XcavSL&kdzZD8C6sA7 z)GyaZVh-0#Q|lyepR{M?4De|ZWIGh>nA&(x8fvvYqAqVnm?+7(ou|F8Qa)*7`22tR z)6n!M$q5`rpWtdcJ~c4e@n1L>>Z+!emsWDkxaQ(VwbwAP?_eI`Efn+}#QzJK#|EQX z%1cwE6){WQAC|2h(11ZjrhI-X)5VZZl>6+|;{V?zn%aK-&m*OFF)!%eTB&vzo~?!q z+H-R-3PI0-qHFM+6u5mQ;%Y7~T%ZS=IksbvcHkp2nAmA(#BWR@+Fvr}cM zI?;@cz@Q*|?B}&ntp>Diur!B$Ge)g$mKiRd6?mkJnUpg9 zwr4XGm?e_Dl}4=35}@0z^EALYz5Y~dT{|HNI_W#&w2s!?{-8>a3=;=rT`k?PSt}|| zI(-*;rz^`JMZ{;_)WH(`_5yeKYlipUndMRGD~IWTgL1*fQpsVE&u_>0xnV=88I!rg z5+kXzuwT8R+JBxV;+n45GHhE9Ls3-2)L5gN=rP;)WS%iLBncBVf}*S&{Z2u|HLj)q z`lMDkl@C1y6$7!`qJTent~>PlFgoa)ehk@A!wjNoxnwyiy-cL_3>zEMW(*m_)WF^e zmLl3z1f_HQXsX;2(y2#z6ymFKoof1_hP9?odY2(=8=}Z#WX^STtJB+45o(@&;)yAZ zs;qF;f{x~8mKV|ZzN*VcN8?G{TuD5=?yOmvC4)zEm>!?7)tEHup4wSbIF>8O}4 zL4c`=B0Wi9NQS3&U9gpPVn;|aLid(t)mV%l-N5N^maIHu;ZreB8!*`jZ<8A?rrQx$ zqdsvhb#5n!bNvET4<;j>^5%`oUD7~mYaKCulAX}NKNrw|lj zlyIwv%gJp{8m=PshZN>*rUkV=Omo}y-qkh~rkj@0Dd94dXwCBr;;~QxVI71~t6x=| zw(Nc>{s;a?Z*Da=?PsJfozQg+BG-sroAtFfVjVX2DfBm<--8ZY+3Iy{BPx5sz)Uu& zP%REdaawT*CGR?vJfw#fO*f1>8IKl~%)&>!!mg(Hf9O3{pSl#C$3CUY_Rs7Ic1s9H zw&G20I&j4yo_yalW>I8TI?QQ+A^Y#%2i=}Vv%M|RnI>tIM44ig$S zO^q%PhqQSl1xZY_Q@uem>K}FYNK5_f5(-!j^m9W2Q`9tulVZNVHxbPn=DDgzdtXJF z1p3!QeIP~V^=KHBOgVnkV!3^G*fk@n?@vhh*eNWjuAy$Z&Fmt5hQgh`+vc&iX7CS6 zq2g?dJSp@JhR-r5JVvYeH1L7pck1J}9~|*!xyY|v&-L0_`%TfJeR{G}QH!yfXu>p| z2$ZGD-%MlpE-K9XS5!i!?gSOdBd-oj)(? z^kQhE$>|q!Rg8`$!{QUH8m311TSAdzO}Bd&j0M1m7ivP#^{QP4>q3Vs9tHPD z++0)`pWIJ)O5NunsbJ-3^L_LF9nK>%qsvTk7R!q|N5x5NLUE_+5q9X2(r@;`vwqZ# zn{%L$@BZ$jTDFLOk}x`G=(BRjWatxBq(dnjdFFA;C2ZDWLru1$6bjKCMS^>TlF`l# z>JyveX7EgnqcZeusueOzkJD-7ZDZA)s^=vEP|q9tYp#jV_LSE57%0A^Izi1*VKi}~ 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 A4gdfE literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/lib/glew32.lib b/Thirdparty/glew/lib/glew32.lib new file mode 100644 index 0000000000000000000000000000000000000000..3d780d9af26b5f50f11bd58436948a51667e2f07 GIT binary patch literal 701288 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

    #YseChOo-_{xHL+b)N*S73DyTER3x3Mp_ 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 +!nJX^U+?bWhQBz;1jX7hP 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 PARS&c0GDUWLo&pqqYRgO~4f$pew zJJi?|kJ{6WTTzGNS^SiOVlHE|n70IbTyCoqA5NBV7F$oH6?OU|gS$UKOvo#5`OYj?d!j}=$6XNB6IVLB(a7GF zJa;Pfup*v z$U^&fk!KFEf2%xoi2Zv{j_R6rh4$}3o;k$+t?^W4|03PA5=!vnZ#nVFSoUVp53?D}$}Mz4A3v0Jr9S@k@$c-1gg zvAOTN(ji}5ZFd?bU89x=?)&cL5T~MME@husK0v#-Ps=6fE0T5}pGNK%_ldWd#+;?h zjoW=)T2f-%!--cWI!WBm;Z2(ax-@*b4wW;(?dko4O!ByRf{ObUFdq_IY@Ss6F!n2_F&WX(a@D;E^F>AONSxUVT)Msk@~^_a=`H z^R&GR{OFGf5kn47`Fdn5to5{4J~m8sI#xW6z;b>Z!}B^;E+g1O9^Yry8go%?Tdlbm z?TE~6^W5yd-73#2y32n8&#erT`$V2QKTPhEcy4u=+$Zzgww8-*gs1S_u0OG)YY1_l z3b=kp7s-7Z;QAdc<)ZusPhaJ(p2Ku&7T90U$g{jFHmPLjHu0IOw8@29qhSJ!l2q~P z*cZlLFfnA$>NA%p^+%x8$Hmij_e$kOZ+4zNkiG1}#rpt?+!QV~wR|qaN4&M^ECuWnK=NY89{cm=nvyn~GWougcQea-lrOytn(St`A4^TG1@49?YW2#|NsB}qJ&JkqoU7IV?t>o*3t zNwpsf?h7vM@hwb`k5G@lX$|}$`W|JHcypi)#I$TGq$v-JU=<_adBBj}X$ zL7P?3E{)C+9}4rlsUjUav?qSpA}0Gn>SySw8Be*1$;_HCHrPinSv#uWB=b>=JT*PB zlhQ#`nhLtvQ14M_U;LO&O?*k|<5zER#q$@fm5*CYW9@kb$Hgr44&W0WtCDWSy_uvP zPsTfI;*LJ)ld~G%%4iwJcVlANK4lTpQA~y1wpUke8QGAZwwdK}t!omPCsnN6u9dD) zWLJI0Vw!`Xj)ZK0&)OtYMtRc2tJU&Q@tj4sji1X?Y3?)*CZ}FkSTPr^%g@`~RuUy= z8?0g$vIV}7XDPKhvX8%*rz!gp>C`XfY13IrQ&oSCGHd@hTKiwNn91@}kIs>!}aFX0hyYGIm!=^%$BbUuSs3+`o)!8d3&*R4Dse9 z-FIywxk^;M$oPUzBF^_bPVRsvpN-%=_J%*!oTsSZMWUq`n5w$?t9XMYEjYxo8&irb~G2) zg3b=9tjJpaZJ$?NSnN;%n5w55q%?HS`JGFfYEG(Q)89< z!KFE3iTeA&sr|XPadnR+=|(I-LSm*M4lg(y#IkzwY-AOfs~$%;;biIkme{FY49>teqnR zL5rnlEHm>C;Tjyh*YTd{Vm9z~96gBb ziY;EvsMoLQu&r~9HR>+DNXf6o(R;n_qUDk^_J+v}d5pu(ylJU_%aYw2c6ke!b#Cft zTzgF|aJxX<`;1S-)JD7x&+qlWC%%}@oKZ}a{&fe_UD3sTkM0StXVIJaz&0@pou99t zXDR!26F9dVo2Si0^@Uhtb0K@+1`JPY{h%BB8`{jVMxAb!Ye}HKHl7;v>y2!tr6`Bh zuQz6R>V9Qx0OR?-3B$}yAo2P@FGz2SsGhh|4TNUV&1^0RHW4!!JHvP?Z*DVJ%Q^Zf z)QTh?7bN;A%)~@Svzr*6<85NLv2Gln+`V^Vm%UgDokJ(s%>C(wLgM(|P|^Fm8UNu~ zB4odW9}jk?#SVd^R5A1Tuue7!22t>c*K>8&Y&!~JGC|2R3K0SHewmoXKs&Pxl1D5u-FmLK8+kvQf6%af{tv+-~M@XVDL^k?RX! z=}tIA^OUa=`#`aTU_5v9dDVLQP{XWTs^w@;Au$o?rkyNNs~u2O-^Dg{DRP3Aq|zZD z*rdnt7KV7PpeW2c^;vX2DI^+;xd}CSfi7`qt0#paM@Q{~RPBsGdD*5Ad1%p5yCGFA zFR+dFIOM7cZcIa@Y(*fRzvymfnj?CPM!G&x#L%T2lU%IT7S)qgNsIQenL%XldAd~U zEld=_R$9BWgV@`v^-7H*)W#ZJZFUuu2WjtG+u=Gz#j_4Y)9f46hNKVdX&@a5l;>>! zn&{efj^^QIgIb_neT=nXBDfCZ*%P&RiNcr@RinO*Lw6gOv+TA#*z&o?+_IYZnLG2$ z?NK{U??82QX2&+MOLtidT{+rl2fZuLS5lE*^KLw~7#+{(Sre^w_rYwfmS@KM0-~1& z(~H#ej4iQ=T5^xIw?wPynf@^IKN{Q$wXR3I-P{`aYHbf@WO;BKv}=*^QkeM7N}isC zDM6(#*T9UI*u;LsZVSvywZ3KRrEdMd-p)HPva0&yAianUrNaVBm9j}T3n)r9WeIL} z!)A8@D=(RsyTw0qvI;&Gn&j*st?9(Hr5gqM|MG|r9KWV5%YzIBqgS!`uAPcoWf*6wVb zZ5^7C6PdViv04Yb`TXS>}ku zonn>D7gW4AwZbvIMQxQO5}9(_0&h+*RNc24nvGh)5sAz!y*bG-y?JvbOC&Ng_2v<7 zYKy=A;7E>0WM=8jqd2BFZywDOiOfvB`ALTAuRl13BNCZedh=M0>CKy;Vu?hi+?$|3 z_%uWH*&iIoF+KJN$1_ZS{lN(wk+?Idn*L)K-7}!5JKp$js84XL3w$-uw(pBr-Gg=4TnIzy9DXj!0x? z>CLk_rZ;b%!xD*1xi>+7@HvL+vp@Je$Mo1AoXar%^#@LZfcvq{@|+|k;u%_n_uIY-n@As zOC&Ng_2$a#!iCdc&HAAE~p`s)wA z%@K(^vy9sBa7=Ge`(2huWXhu!^atN#sQ&tcOF1HunWZ-`>6+F|M&MO&at4Ezb=9%7f{)Az+dDQt+ zo~hD__WA#eVaAVZr5>`DR|YV${5(ZAm$9qQU7~$Szi<+Lo{RgXi%2h=ms=I=d-#=; z=u_jbQ^fgUL4P_KX#9Y(QB;!)=5-r1pBRimm=2g2A6v$Hvz6zFN*1#Q{3b`grsPQV;a3VdP|CI9^-Krt4z6n zWVxw=l_~d6EH_oO%If^uc*N(%eHjkIc@lZAhAF!NERr}1>Sk`2yV-0EOg zhlj(`^jlBKV|HTIjHTl>n@v~awr70Di`96Np%bZWx+tBYw z(-YpVUnjAkI8=L@rc5u;75|cU=9k1TBixz(CG*2d?SUje@_RNr+By!w6yLq@n9WX%)A51W^z#~0d!xJA9-jeQxAKPi(kEE@^q0J~Xd_k* z^7_dcuzh;{DVD$3TxOPm*O|z*i=)yAoXgal_%4QLX8tRb-4e3JKb!mt(=kOAb8(^hN>JXAf#yB_#r}$^Coq!1 zC?DTJF8sS0Sv^;a?mYTWGkR(gL>hsJ{@-Tw)KrL=&SYUc?mgR#PD+574Zh2sYsT&g zhC(eLMBVev_zQxS_9dla^-M1v-~RE!jOawZJnO(Oc+vg^Q%}goGZOjfp}$SNrZ<_;q@8)hAK6K{5LS)nQbN?-k9NUpoYlO7ptwe>UG@O?1{4~l-q{sPsr2`tIy;& zn2@ADLTm@n8NO*|zahQUD7FMz5n99fE8?4v3nS{Wfr-TUhNd-bZgK%EgE=PjHM~|+ zvQ{_x9$336J$~&Zs?TSt`r*Bpu53SJ{dFY2qO&*=#*==;EaF^XI;HrA)O97lNBKL@ zs~zjvzoVW8%CAE-le~U|7fwwAWpRT%W9fJ%d4nV|%NHG))tUGXqzxO)Vj&+D7DOYX zmEj3`vAVpjF};6$U-p{`(_EBYdlN5>mBukz3)v_^EsX{F*5UdkqpiaOOBbrL8Qt{x z7M40euu`q)4ZycjDmii@W-(p#R>qreOR>m;mN<6Wm>k*M(B4jI)<$-zE>v&cK}bDC z6EzikB1pw;h~ z%?w}uV}|*fi_fIAS+x22mE)u4J&$lQ6P18FhvC*9GSFHV)SdP; z*MSsA5b)>RG*Ow8Xcl}gi)Qv17E3EL_A0RM-WI)4)NO}~tqZ>F_F;(Hc_cI^@jf>* z@~86s3{k5Ros-+wVh&Wo!cdg2Roq3x!{typn}ud2KHws!%Y3F)_k)BPuao)n=YBS= zI%r<>bqv;Wg`mglNHfy|wwwqm-#m+Gx=Qs(hQ4C6mbywkV0DP6md0qrk5pgEn07iSeSuE!_vKGck^-cN)4zMv_c zNYB*oeNE{;{l2g{orstE9gY2q7&<|U?Tz}m{suE%UFyge3nTqOMY-;Y<{}QXiH%~W zswLQ)Dj5F{ zVyMbFG-e!#_m~{a5$(20t`fx1AskZ|Lm*Q=%o1&x;!FX){0PIeCekyt>qj}F&aNO! zK4udKq9elo`UZkU-MVwcXg9{k(^Si-VlU2~HT8Gs`ev{18|DSj6EEE4m_xQP`SFPa zE1&Nuo7355s61FVjsV`FN#4qlVj+I}(+*O3%z(@YD6c;G(3v*}!;>P#HU)E&gMg{7 zuAuG=xw!->Rti=qa&DrxXbls*@vd;NIx@dhtXhtgM-Lc1hLgM+sxK%l*WXl#<{?HJ z%u-l3kFeLy1b0<~d{30m+o>YysyiT%rH7@-i^FmyC{=0;7|G(0sp93BtF$%h;qxrnhKi#KSa~eTES8Lej|itu zb(TqCl3SUnh4J~qf`eP%b6Z=PiZ24O205{2Fvb-V?Ba;IXUV+p9+Xz!aKwy&@p+XprJHMIrw!kh zBLz$vW$jG=9p7|Q!Q=^omfIYtu0r-OL1(FY0+YR}UV+%=RG1y)S*o6FLRRM&h_jWL zT_v*RaR#dR5zW{{xY*`^eI#N#4kBjBJ_@qq1Bl941NHRiChQEVIk5UCDV-h**VY!G z{Fr8JeRToKk8MI%S5=_=Q_a|3m46!3^_3MUKdvd8q?)|G0s8UH==$mk`ojnSe^fiY<-Qeun1~2WP4F zvw*5r%ZwrM3fEaISGlSN_EMkCGnM@r^6NP~l}sf`{fg#eKgUwbZ8_rDEV-WtTsoy8 z=7O>5+%(s0k~bGUjG4LUUULYjlG=tR&t9fZ#wR69+wg8A(6#u75$5|3W~eAH-Q&`Rj;l%avQ1sr>OB0^eY{B#7ly zkgpf9RDbz;G0!AY#eM}!FX5=lSN>28f0JjXQdX=LRElpQt}=$vdh)jsmnN+^j*+Fm z1Ie~zv86$6{4USc#xgU167S9Y9#6H>R;(1n)TMw)q>4R@_V-@Ka9h0fhnKTN%ea}U z{65F@)*t?WC91s%s_+k4s?xR~M}NdKiBxgEfd23bj_R#HypkoR1{-#r-*CIm0KC~hd*PvB#7lykgq>yss8fy7d(?l75fz^{Ut~B*dP9i zXQonCtQExYuMt-n!>B*}4dT+I6~{5E7FR*CEm>@7P#dr2x!PC;{oyq{)k<5jQV>(W z1xzAU>{-+w{*K|cdg~8=&k`-;W~%ZJ9MfBWcr8m*dlOXQ>sYGNwjf8Z=b1#RIA1`2 zcmqfE)*s%;5>tbXJa&P7ZvtFh+IP6he; zCzk3jU;oTAiBz#)fzrQlRFD1PtvoZ8vSO_uhHpb$WelVK@OH$dNh^+HR4wj+WLvV> z(x5ip$#b=_4En>nc&e4QVx=Ia?gmUERqR>RAKt@o+r0IM_p(IGxS6WFk7Ii45ASD* zYHxxn`~XW;+7{&KgFKT+73T}+4Cik;g8u?_U8|S9wvz{~Msvp+@Xi zPzN7DTwAW(%Ah}dl;x5jmQz8#KE_i0%SQ8{^t7Sd{~WAi6o~pqkMc)`rl3Iy4XT@#Qmo!o2Hc1-{_XM|2C)F(&ct%PKobq z?EWl6H!o6^qREz=73P_epTlJP3UxUd#M<-C$Ry3g-UeqsUcl_hR;|SW`^9E#t<9NA z8s84^QggOPtH0cYZnn_t?nMArf2A4Qqt#z+&emET)RxyET^;Fw{5mFUEe>kS8_mdC zdxJ<@ZT(em*G@fKJ9UDfUdvnc)f})_Z^qWz9MqOKHD`OY`Wj8>K5NUG&Db8TzE*R# z*6JX`*M@Yp%>j8GOx9W))RuLdk+t>)`Mn-yd#x?&H)CsU4rih8}+d+n-|6F9UQ=`K^FT4tR>chLGB~QEvT$vIX%ycuKWQ zbj9zHy*){tC@wcQ?bW%eJ{;XU_YRJzjHGr@u{UlotL4$od}I!`H%cI6Kk(YMa^2`oogb_a;=Mj=nAx8?6{`KFwYnl#N{n%x$&i)j(~` zf?3`z8pJTj&8uA?Si1)^%xS4imd0njw{%d`58aC+3FOLF7I9gW3yb~n<0ob9i|EX} za{Nm9))uo+=jmdHxtnj6p>5-$k;A!JT69)|HyoDCGf!cEJ}89R8#YmHZku4{!=N12 zuBq*-R>H}HqC#s630ZMnK;6Q2lszyS^Si39flzuQY$W+830U z+l_*p2-a)gO^AcFsxVL~n#&+URs5oLuJ<4+ajZ0s+nEZur^%Zg5Vy~C3{kmOg_FXi z{JD&O=NSHuGvw<>J@hMfn(43T?^lk!a~WUkV{EbW41Yyu(Y)emg3(R_u~(QmhgS1T zcA4QXA%Q8*!?{ea)nb0bt~2}%IxC=h``*Ma7|#boVSE=%r@6U*>NNy1c#74ducX~L zc6E?orG7_Mes`WaL9k-ADF60gxl!!_;MU>#$6D*K`d2W0S-Xk2J!kwYs4=8I*o(=% zea)|!-Q-ua4KFme^aT0rY_b>ASAD?znilb|(b{G%@K9^BUsD}q0!8Yfxy*OjTw{~A zng0rE40+Z7Ys}$)N0SiA(i-hE{}pO$po%${{~e@gNY(GnWb1qr3w!ZYbK!sOLHL&8 zS`EuSZ}(>Mc7OA`_E!8Z>L#hZ_F`goKl8ixnaS_UIC}SDa=F9&p7;HKeh)Q}Jgb>+ z^}Wn5djCv*QC3xs`3~CK{EmGkze8;iv|s82{4dGK4(O$a4>qT()uWzlKc27WGG8M* z82@*$T&0M>S;8{gXWN)=zyVx!l)1 z(2;baSmRt~gl{wX*_&h*^AllWwx;%YR(;~CgHBmUb)$XZ2PA((bqqfrE>@57^+V0b z_OyVQ-Ny6`n;FY5Xt0Zwz|6j?e2gkX-!!Sd7P4yQCkd4L6UFgDhDRpS#nwcx`YvLa zN~!<{wXRqH?)dsy(b|$&$wmvpyE@Tl$2X=dqF>N{Lg0 zhbj{p&&9PhV0gAfu@8Yw2N|N$i%iED@8lWch_*<1F>8cp5~~pGS*4lSmcY7xX^k9Cg$#^ESF>y^kAIqY_88 z8p|womRTZkXr{4SVX6LNx5_h#RIz=5M<+OH*;mJ~f+Z4}nR;}RrTX*eN}friiaiQ? zqa!$K)oKFe)&;%MkvvnY6x7|Lc&g=8v2~d>jU7!_e>7kcsd5VguYQu{TBTRc1YSLc zXA-Gm3j?nn%Tv91^;3XJq{=M}y!vUDYn5L)6L|GFo=K!;>DA+TsyDBm0GLFo*urRE z_lXR*C*H%SJ?{oG=Ol*P-)dirCH5=mLr(@w%duh$qa6dMaMWT%4`+$F?acb?E~fgQ zin%1Hq;^L8VNS#31!n(1@4P-u&xYuyC+PWbsL~&nhWmQZ0qGjdlZJMZZ1*D)gCdwwj4fbbiLoTv7@O<@mKu3K!d&`5uVx$og!8 zJr<0Q7E9suicowuc|sZEX#MM~1bf`P&^?$Bd!oEqbZb$bKLn%U**sIL6s#zmlb}|5 z;)7(VEgRyx)yAmY(s=cADV}a-0@aGoTdb+qbXT1mE0imNIi9Rsd1q=xymoSKlHOaG z2uhIw5?6|Ci{5_yLXx0mW<67d5Ek;ZPLh&EC%X@RbZ9 zalQbZ7qdid&Y-h1mn5jAsM2WjhE3!itkMeR&%Vi0Cn#1POH2n8?`;1T$Bigf>{+1p z+blH$wIEl&)8JNuQe{b$Hx=-}&PCP-qTIgBm+>rP-|r@gm9R4yk3Z4uG?iKweItD@ z!884Hls8`rd9y`tw71rK4TU)!8-1r-%CT*v+`gbjT$WQ{Pp|b+&*MFX*m&`>>rfiReW@c;HAM+O+Gg2}^mi;opESZ+0FDNZH z_xCLB?(6P4B-v8ReapmUg^_NWNUXF@|c~PJ}#fQenUpL4rg7Loo z?)iqCi-yeSXIa}(i%G<^awh20f7@WzPwvHiPHR_>_4y?y zf-jQaHHcxk9Om;u#iU735QnUG^hZAZy_4H#F4j>~!B@#2l2m4*T^hOQgwnNXo?UF^ zz68;8okgo(+nB*R0#o0&Ftys&_mnINATavuWjEi5lr*UePeolMQU z2XNJT8E$-z|K2p$V`ab3LDN=t)P>xi;idgY_EVxY?X z(9C}Y4PcblcXylicpYgzjFb zHpZKq8*l!HlB~dy`Vh@8|2Ijh?`w8#6BFAJ`R~~zvvgx**7MVO0TNiotMF;PH;nkNgHzTj29`a?! zFR+71>{l>L`$~$|)@7EURQH>q9eJ-NdHp6?%}XohfwcGq0`1H<*n#pIPbEPtwk=q@ zc-^K>Er+Y`9AhedJZ`_i5w$A8+UaT=ta>fiteZ~Hx%X=CIAd05;+p_hXNg3nydr@L z_$DV+H)^As2iI`(yp7#!CV7j)_)((zdaYf20)bBKoffq^So;{($1@%@ z1yLToK;fot9!VH+jQ}-xGdEG&g@K*&o4bhV&p^3d!FT5tNoIVEW?oP#MfQW6Vygl_ zZprX$vxw zHArG6vipt<^M7miotpm&t=+*$yECOPh(<>B_h^8MxeF!snUjs?_KrL$UE)dtM!sDs zv%YmqNklhDy_XX0d0r(M?ZDqHP0nc66|G$Ej;LC-U{-q%o~xXFMROs0LMo9fu34x~ z&SuHhwbF7XuyG5|BvQpW3+hBGPu0!;GV7V~t)FdxNuFkL-3u^@)J(m)H|5s83iKy;P#xYU#Z0VX5V2yvf)Vz8lsk~g3_qA(dOu4f zGUYx6I`?I$%9(zk^8+kVs}p?@G_VC=)M1xfCTxK?|)pQy25jWv*Vsd%J zF{`BUd6ND4-;ny)&r*9Y;%2Fxv44Dj!2!%~$Y@mr^p_t>k*8NiR5cv!a$3MMNq|ZH zjJ}WhII2BBi(?uoUC1*%DqX};?LjJ2rTsipsT7^IKaf(FMd1ov+=5k^#V(ps9a_yB zXz)tG&~h^yR*EK-Gk)kswIxYj{i5lfFw6}ac1Ojq2gyY$((FY2#!{YLzhz)vP__=o zi=!8vr(V{Ku3oi4cb6W-)0dgcb66z31p^|3TdHD`l#eLTfd&Tle3 zX?)iB6KR%mA2zb$p=p}RifC*J94sPD9w8ta2U9%d{3RHthtjO}HX=?sb|G8lTs&nJ zL3Jy1@g|5svG>q!>tQF+mMFF;$h(m=kI0kKP~MHEY2NZKa>s-#%{y0B`RMM|bv8MCGxzmzkPrm3um zI)@bw7Lg{7eiV(9DW1PBY-O628Vsa^)Swj&c%hiDHX_ zF6`(uj|8WbhB}o`rfJ^t?idG)NE3SwX*)K>^Vfxa%E3w{o>(1<%TGIr%D4nw*l|uC zO+9IBqAu)sH_?_Tw<+ktPH+%OnRK_Lf!oK9>(bSX1ChEez>?Yb0&0iPx)ild8WR|+VmSXwq!Y)j+NXZl{16|nH z(=?S8QRnat2a8A(M?Z?ji&8v)UD(BGR%$Si`VHCg5*JTfCqWnXO&5<21!C`^+Vw3b z(UvH-DCokzo#v6?l+sYA@|`rzTi$)w!6MScoE(1 zC{<%(?#V(I6UTHhJnlCzRDOX4pW;;@bgvhZG>ff?Tl!u`1laGW}WiM!-~B7v$(oZmQO{fOs=Q zR9Y5Pg6_5@?ey*6)QFc#+062(L?mfXh@wO&N$ zh>u zu)kCsF?atZkIH9h*@qphsn_Wj&r3qZ3eg?Ee|1m?D&`d(>-cn*I{%g=4vYroRgfvm zYO@8^yho;~%ewkImi9!2NIQmritwmSn;%vNs-@vzD2&KJBK9TH_?S)YEkqTqMo?!T zC$#dEL>noN9MEe$VH5j;@hPPCjs=FfyQu(A+RVk_NK`f#tS+in#;dEGs#A>4`ak8S zFN<=+sf%SwwQ>fdeZ(t>GGGV(LirR-w-{0~YkO?ldBW^q)5 z{_mLvImk!x=;jz`altK7|DoJ|=Yywm&w?En|E0{q2{NdPBNxz~rL>$++H;gP?34C9rA0nz zFHl-pO#@%lFH%}H6(;hi1iY70yp%CB<-MHZrOYYkfo|`W1}_{k7qu=L4@*HMDi-K- z4q__W6ZC3=S~7Ryw2(`9q?wL7%hysYbsr19x?U%=R*%ZwNU?k>TW!NtFIz4PW1qEo zRJMAGrB#M*=zkNT)dt!64QTVCLeAXBl^kfLv57j1HF$E5xxp!@B*EegM4H#+$-QZ` zSTpEW*W$?wG9WX#xu@wJ*LIO(57z^_KL4cbIncdt>u`J%VO`NgWS;xf`J3s~cQxAA zb+J2(c~kL+hs&Y*oey;9+Z>Yca;xvFb=9u}V z_nK^bi;F$|8g!Jp_+QFKZ^ggW#m?xx0koIwZ7f$e$26B2OWKT`-|k`#ghRzb&RnF) zmp7@sQI@~M^&4QAOX(=nHg?hLtzlCv&uCxUjy42jXN<++pJ=h%(vgRhPX3B^cSzYa71EQu}ZK? zwJXQ84V$Si-|J>7=R#41-Hjn?XGGB`vb&q98ZnW^Js2Jdo=iQtC&RRZM;xypD`zuA ze_7eW5s6{NDnVAZa!lK>a$kZ`q|M2+uinj4;~a)Z%qrIiMv-=gX`5B762$9VhUhO| z_u`1euws=UUiaphwqfPI1o66$o9V6Vc^|_gW|eCM@%ny-X`5B-Nf595GDLsz`T>qe z3@cU%;`M_Z(>83TzTD5v^w{-uFhrkS&pbENTi4Uc@JR4v>d7vKX$OxuUO`rNGemz` z*~1ZuVZ|yzR?g>`wqfPI1f$6QPNsd;ZI&8)86GjKTq77o4q%wJS;ZSVSp9JEX;RtfeKb%K@t!-iTNANL5IaSNsH}S+cE&j(F|1f6sCtKUOxv(>UxIioxtZQ(4$2IVm{qP3#A}6N z+GZ7d62xnjA^MBg364k%D^>~Obp^+?4V$SiC*4esGY2afqI%{4#Lp3KrndV5_3lWH zsEr>`dyaB5z0Hpt&G3lCOyl*F4AV{#aaMxZIffznt3AhZL}FO6N>F<~#W8Ke%6$o# zpLR2=gIXpSyN=_SmOI6k1#>dTvqa)fxotuHIf13x#uY0Cwmp$y+GSQu1hzeiC8}); zbe_ym?N7`sb)Lc!wK~!1fK#1R{$iIb6`$s0I}W+avj)V|=}u}UC!U#cJH8d^3`Ff% zIDbL6X5OuxIr+1bA)g7!_Jw#-?;`GJ5SJXcl5)|B)6XKVT^QwY1*-8`POknA0d&LH z*??(F6je3EAxpI!Dz`1j&#&`LB2^qmVEp`so7(CxKQH2lT9qJfFXot* zJH>Vd`FROTBr@eO1ay9rq58|uZ?QzRPLQA9W~r7#<+cU+`5m4~q>AGRc=Wq&YMZ_6 zDkg%+{T@psGUe6aPx6#u153v2B4jFXxz6*ouk3o8M=NM5f%EK<5t_s=pbl zAF@QXPEdz_#8A!EtH~)8xotrmx`JmCsp2>S9=(#IS_vv9g2??bOC&Po)&(B@2}||o z(Vy~6B2{c(p!8=P)lO2mbwTX@oM&p4f=K#>o0^^ulWPSxl>ZV@?FlhC7ufh$Ztm1Q z<;k)njV5%P(XSzuI9IM0bPm69k{8$)`^br42JkA5NMuUwi*EM0nqyjJNlXM;a}7%* zGUc`f)Za4H3|W=9Y5N z8q9TwYs-~e8Puig-CXahu|y(MZd;J2_cK(#dHMiPC7~-&vwgC3->WA8uw~p0*Cn%eGNRUsrPKSDr0kEPuw$ zu0M>aqN4eveXG>@ z!z_DbKIdk(`1I%V4AZASUtpL%{rMup^y$x++{{*={(PBX`t;{34AZASUuBp+{rQ@k z+2+%quQN=a{(OUB`t;{&Z?<1dtv|?BZd3acbSbMdOtV) zI)vA+`~pRAqKxvh^rU`PGS(t?yv@Q?>!6DZez4vJD+9oiels<;|2<|H32F zP15*BX9_oR6Bk6~O7FZrRb>Gq#arCeiQa`vx)&s&@~>zx&-GS99jKJTU~G1dlruRK z)X=vv%n1S&`xNMWyPHXeicEFBgJJsAxv`r`ho?++zLR14)cGzqvrIxLQ=OYIOrJV8 zbuwGL=I3S%)2GhO-Au3fxdp@YsdGy=(`$Zi#V~#9+}h3bnxES+OrJVuIhn0q^K)B< z=~L%+Zl>4#+@4|j)cI~V(`$adhhh5Exr3YOH9vP`m_BvxYkuy*Fts|-dg`8pc~BUQj8>*LvS`2Y!Cs5mPVTUl z2);mD+{6ijlz*{+-HWYGCb{-hP6T#sa}&vAxA@B*%#O}!5TjgJ>$)l#UN9c^b; z;%A##?sg}yK5x>$YUcx8t`XZ9{ernO`2}?GCevTA*GzsvM4T@E1?WZOy%WD6TrplO zRcbf(S<{f>CN8JhQeUy9gU$c2+(PIt>Tn3sD$OH`@^RdHXIX}MA!J7A{u z13c3fDyFtGbt=C9@PjF8f3X}@qGI8ofuSI;tXSwZ@BLEbffdmaM^L0#EsEZbY34ye zR2c}zg7MK}DI|lPG(+2%=-u4dcb-jLSr|%AnoCJ@X3v`XJ9PckR(s=()mF=$c;P0; z9I}leb*4xi{r&d!m2z8x9O<%n%a%`DQyHyDV|RmD@5qA6Xj#hx^|goc>Z?4;)nl}Z zHJ=a%>2Xl84-svDLd$uj^%B~!SK0xD7I~$8h|tPv+8pNY*sV>jFCa9tZ$lZAh}K7G zDN~B;7|^zm(o&|B(ohC0YS5xWuDHUCe%e#X%xF8y_^sbX(|QhkX&va|^>q()BnKgJ zMM1H$*hRFOCaL%40DS{a8ZoF`9~cpqIEmDxQjI7=mpX`6vn|&LB6OLHMhq%dhdg+Y zi$~2VR|x9M!7ie=2tC9}BLO&NvA8`<^tFYwyK!kqOMI#24szVX_ zF&B@TQ?3w1=*L||ZxQ+lCyf|Xt`9`$p-v(-snmxkLIVfUdYVVB4@Bsoi$)A8Rfi&U z$i<`Plq&=gnsX7oMQG@x5rfM0fe0OT5~)e0K12~Zk|t_z-2f3f>Y@>YO4XqVja)ox zPPqp`gdXN1dW+EIP8u<&Tpx(gypu>xD)k|X&@l(mUmsd<(TG8%>QIChT|8<|xd%an zj=PB7BJ^-4jTls}4@79mNu(x~`Vd8E*+KNzhgMuPVo<3%6roiYkD62NK@g!6E~2*x zUE!n=gUa=R2%U5isY#_iL=n2uLG;&$9^s-9gG$w*2tCrpqvn)*5Jc!vE~2*xJ=#el z29@gr5&B6dk(xA1A0Cq?w&f@=Q;o;Eh!YfgIM;e@kAFgndDIIl+nZ5v(Mi zQlqVi|I3bizBm*ZVmMYTtyHe;wlimu_cSXprzV)?a&ag!(B83NB%D_r9u7<06JeoJ z?rpU$ijitYI}A^2@aKgiQK2WkoMuTW7+M|`MzmaJ#bj5b`}73YEO>QAE`(IZ$5e<VtkiO7 zu$I5%iYKvNW~b$jCW_B#uscVK#d6pmO@{gU>30%VV$JC8?#}@(Db8{(7=b>Y;1vsPU{#N3d;m3_a)OuZfo-O>lSl7EV#@n zCxQ{-8%bhZkILpQ$GTdNBf>>V>Ofdo9F~jK(oi@s8kEBQgF;TfUm0}F7bodU3+CG> zqi6yZ=@Oe+%F@zvfYxs&xS{zbnHLV5t=aKMg6&>u=AiNZTNcw?4%(6Rc#p=~Z&P}P zV=bD6{to5pdn(4SyPHb!-6XACDHT^X8(_sAW@a*WGW74I===aH<)Uc5G{tofuvs!M zZoOc@#hB(W_JMz zm5+K%ce=e%`a?=}3zaj0Pk)qT=CYibLS4)iNosX${&=oVvaud{i<*jP|oTBs zh<|buNdcB>L@TO)wuy-)&DsJ?>Zo>>?7uW)d(?d^W~)y+Bb(pWjIGp-`qxWPTJ8kSa0DV@@7yIRUcD;9qx+}bx-XR%tS=$NQ;{hNy! zS1hyR)Qm>T9uh^>BQA1Q`!AV#8SguNlyIkNWnVBkzBPGILRP^CTfo8`e%Bad(4y$fpRi+2A0JrFLc&E?(Jvy1`x?=EI=(f2<|YB{X$WzJ&sW#&KQdFKCG%!=7<12&+DBMas3vkmewPHUP-V`KUYuW zvY8ttQ!7%vsHc0?W-=2G?aCxDQ*M)A9Kry AdH?_b literal 0 HcmV?d00001 diff --git a/Thirdparty/glew/lib/glew32s.lib b/Thirdparty/glew/lib/glew32s.lib new file mode 100644 index 0000000000000000000000000000000000000000..584c462e57f3a1bc85a38a823d3b6c3d21619718 GIT binary patch literal 2584968 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 z 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 z%0D+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%0A^Izi1*VKi}~ zEaPVvercSKvN@E+x|X#|0o29E&y;bNAyhGocDN zx{jFUPspU=vVizzt;aOPecOFmOWXvEf>Z6J4XL+x$ksaDd_I2XZbOP7w5q-S?pRSH zWXy@2rj*XCRcy^VcG|}uBU>w=|8#u){dd_%tF+9+FC(ug%I5edh5w#TxpH zv0a#VYQMzBts*TE3_kyFgr|)B!}6Ma*yeB}F|5#L)P>Z&2Hm%K;rw2`34L>aisFAE zPH!K^%g<9FHRu`V+Awx3wro%f6;DlB1ZGPkMX^IJ6>LJAqv%l$SUeJ-Qsf-f3mNwy zjbHlv;JB^QR`COs-Dy=Lm>8-{sJH3j$(RRwW6J+zuN!6k8GS?v?d`gtF3w1XGO2Au zI*<>M7R_zL*-wAoJ`a4!y?t;jRh<&z`C0ln^YrEqdP){~_pj)~rVNdUQNAYa4rr!0 z!e47sk~HPCJf43_?K_h+3f{6V;HqAKc)SUVWPI}|tl5V0WCE%_y5-aC39XGl#1TfW zdh%PjEK;3`qidloyDe>hefV%gwSlHsN?^=Ktx?Pp)c4=+UvD3NL*|6*{CXO!{>#wm zZJWww*&2qSB-zN!h%OV&)^3$OErQl~bi4PJN{WjK;R)(zXjP{-xVg+zxYF|LQ;sKz zd&d9WB>n0Jw1pVUw%n@88q>iUB|6gAa7T^*k&ydcdwSEA6jd@X0oi!iZI*zoijtxrI=fpe^yU#QzYHwpy_$~ zW@56D4Ehm?7m-WZ7L>k>+9;&6BmQi<)fs;sIyz-3=eIw$74u%@(xX4Cx z3LAc~rR3UjX#o`13*u|okLt}~K#|^L!*C+i;jRYv-OX1wfK2HQ*`#)TIAd?W;zSEb zWgVyIpq|a--DAjxmuaie9;~xRmL@xF*~moUMn*SpT$~?}HQ=6M+5wqf6^^0A zJ66F9XnQ*DZftKcL*J2QAk6n+ z>Dhha?jOG(N5icYZOgdU%9G%EFN=NMt;=0AncaQqC0Org76$d!3EXP8f2+~#BB&BN zT)hxvy*GXSL)ty23Iv*k!13dZBqJCo<==`Lp_O>oxl#n5-GN%NkDEKp5&My<4JXPC zo)j}Z)P2G~`ijOdo!@++m!gRchDxN4_3Jn_ZOmDvYPh_CgO+D#r2uluaksP~WtydS z70k|(AJR4qU<1YwJyPqyz3et;4=N#6MAI8yhFne8t6@S$@|>L;ucw;>J|MnUZH)(J?9PJa{1I0Tq-=TnlxD zT{Ka0*TY(&jcz%`LSQ3l&)6aOBD0`mf0uTdQn({1}x`|=SDX4M4yDl}>IXr(0P;d}#~ zVQ97aVbxO5LwzKE>N8(ifZ5x&BGbCHK^Z;0SAC>wr2)-gm>m%QktCJbY7>Fja8WU- z<|o|t-mS$D;C4hX6K!XBOegzYQ(~1es%$zO(^V78hanj;X~Sp_6`g||4G<1vtrr}R zR7Vv1@B&Xzx%R!;x&0Bb#1@&LimpRW?Ofr}K%J4K*=t*wsuX0gI6p+oxn0`4@k}1=EC(|I6>W_SM6ucCo*Je0sHd4A&dwM zlM7g86}wigcPh*)Og6adbqDlnXi=@B%9FvRohS1zdZ#_htgN73 zk^Z)8pN&2Iy!T$m>+zn}hDvDN&WDs;K(`ISM|devpm`DqAPzZ!Roc>vCx30U9naov z0AF6TUO>>e*_yhYTn$%9s4}~AY&Omv9;p7kdO$i(ef){?c^4=n**2#KtvWRou(c)M zzZiKBr)yej2K&>GVW4A50}nu7yK2bO^Zml=57^IGzpCGNoz z7m|^jbLs#*eeeQK(R8e_flRg?-SN zg8m*76zJaU>YNY=LZAS8N{h>aSil70?MdkM(o>TB>+i<$f8qDO1*tum%_)#2O1bg+ z>V@2%kB?T!j2zF01=$5#>6&QR4)`Q&O6wSjNCxIg*qD1KBi%eRdI8qGY!BbX-5?>%RR?0Z16GyF~7oYCo#M-*Lam^CUDtv~Sd4GH{v}#0f#3S{ZuNj{x)TN#(iNrzW zQ+x4NBAWZ*A@B4jF8vb4`ob#k#0f3(SkcM2>s+aUrB=DLgZgw$^1s-3m25et2}%GS z4lOE11fGpP)5tl1tYNM(r^~gOS2O`p#&zLl(77sJ_5fbV%w1ZPFFNcfYPbzg)9bPL`jxs_{EY{9e-l^7 zCU>K*rtP|RDxJ4Ln9vPX9hzC0bwJNL4?iUas;S`UWN%T%I=*J>IAP7zU$|(x<)qo) zxkp-cw^?(tfa-m2@PyuO9R?EBR32xjW+5T0RI;O+R^LBnki7qey}+bFDX^y65oJ8vWR_+S$hzN)t&EomtULt=$Q0f8G}qadnB3Cf-sZn4!w9C>K+ ztHLwGcX0qymClReE~4Rkvf-SO=`KxKj~xjJZpCKzwdl5m>-Oe61(sYy0Id_oQ9^Ee z!y>oom>9|yEV$>tPYUACcW5{}()mWl5eM3*w!}N4vC8lZx=8sPjg04} zVuZztJ2PBK*$onQQFn^v;0450Nc(g`QDW6-xnr&h3H45DcJd;Oljo-~OAy6!gSDXI zGB--FMVaOkjx)|HWMYel2eO}z%kjt4i&BuZ1{pSZ)?`RG9Rx<$@$ei4EGpLp#F9-) zO{KaSk_|s8Lx9{+2wtKu75cc~fY$pd~X9gYl==~mE58Y4`L+SYwi65`qI39x2=bR zg9wK&z30fWZh6XhOJU-ZXHxUq}nS9nGI6{ps2qYV`s0`~GyU@F zvoHICaj&;4x!%~s3FhW$!Vx7^{jx9V9n7YR8W9nwu+dG{UgAK?pbHm@<{hkzn|LHV z?rkLXDm{Jz{H=J;R} z8etNV=*ZI~c87bMBah5(VPTyyG8~Z2iy9}_zQpiZdr$vIO0;eIsrO^J`pTou#NdYK z8Q_)}yFSV!A^HGGlVi&q6AkH#D zeKfQ__XGL|Tz)O}(QNJ6foL}t9}lu`$u-5KZu~H32%XqGf({d(<&wGy23%sL8>=wW z0##lW>_{W3J^CHOkx?}^Rl_n=m7j?W)tfpYI}|j_O}H;Z0>2!OHk*O-rvTDR)35&|T;>5%ulqJ6oH)c1-vuT=#W_&#zC+b^gt4$h2Xp%uM)Y3^Vb* zL`hG6tj77F;EfK$kZg7pTe|S%0y>$X zFS?^EsRgsaGNQzHb85|Lh@sbAf1?MtPl}#!T=qQPz)SFeG#Q&Fpr^YWp~o;4yhWMY zLGaLeRJVAa01v;qyHP@Qcq8T8D0`nz;F;rBFuqfo(eAZ3(0KN~?%+gH70a~(%6VFA z-L{@(kWh-?0JY7vyPasAZ~s2NsM|(Ja6*|mLiJ2MyEv3tYT9Z0a%gD@rbB90i)#gg zrfgBB?>b$+resr<;nxRqt%z~ivxb_WqCJ3RyA=zfNUM~L^cw$FJU7<9W^3U!ow=A6 zPoEO0^b`eZ5+GK83ES%v%y5|BR@MUIohFT$&5l+UcRi_3pS3InlluAg@W<^VH;{4N z{>cch#~R1KIr-mo_emu)y6(j%Hm1s#HuD;dZEdT0gp^*UlUz7xNHv(q(??AXtzSzK@Skv-JpH*poj487JD?P)(GA-6 z=Dbyfb$oY&w@;GT@JhBL3AyX_gWNH_X~@YV%iluEv^TN7(1Gq6huR|=?-DacZ`oek+4E_-E#hR;s@?#?9Q$P&ttaSDWXpPQe}pTHI7>t|XX z%I5`tZ|}a-Yv;7f^c280EsZ*SY&O|?DDmhqazU)d4GAUR7&eqosz-ofuo7sZ-WTPs z^a4yk135;KNN}T`ax`vIB~GXdg$anAYe<6)(4dpYfKlHn@JEF- z6qAaS?yd~7Eaey&>)`Y#2wUfJA6)-2cl z!IhdpmS9&EYq$!Ve}Q`dspdAgrfKFL2p|6W_2$C|^?#hC3u?Hc*mCkPX%h3MZFeWmd5u*VH`Y) zWGE)e{F}Mm<8ClNtY9V1%iMUuNlz&~Zt~CSDALmNNo79k-C&k{qOdjg)u?@(no5l~ zB+|poFX^Zra6s?z%?j3Mv?*(g>=nfZ$%%-*WyDdSwlV%u$A;B22~n0neLwV0Arf1~k}KIw8p zA@H`Q@GmdANV;)o_|_73CsL~U!CR;+*9YJ?y=4Qn=S|caPf(^+IrnXg=p@$-fZ~oXQUf%{cf3u9=j*lE6 z$BQ`6RA&}uR`>At zGolK3U()$#=r=17A9X2{Ufy2^)#ubaHW-LH4ze9l$`%hrv&h60BU~GH7gBsi0l22v z4HC-k87t9rv2h%ILc1jdGL(*z=gJ2^R#VFddT$I>J0aktlrhn*k7BLqKsZ7ZBsAte z?il1(4B@!9+}58yKrk^< zxeD~f$dD`yc0>KCwJgAZQXIAXvR4NuCMPc^G$2a73gcERHQ)8>?|90jo6&7orQs04 zM+E4<+5oP@;h){Cw4GH!i>LNJJ<1TQzh4*X=0qnE>Q^;zNV?BY>NB#8(5}jm0C~@k zEL#{P+ln@8+cloBcDP z5~js~%s^&^S$`T}F>Qp6G9lekJUl&qBWff%qP^@Bg5w=}>E=670G&K@NaXE{UH=)0 z8feVguJ*JyywvGZPw->;^m@I6HN}*ircck}*8zVt%S=f%D)UIi9q0{H#r9n}m1%~p z-WtOr%r#@NE6PzB2Ui+*w1VFPEv@Y089pQJsOaW#o0St5eAY(bEhWoE0R)Hi8?{>U z2z@dcw0d(WB57Va9gQt*H91-{t*DK6GfeRz0AyyvmHdg7lVLToFR27%n02+1N33#f zdo+{DYPd*Muzp8J!cR9ImHmxO7XOAuG_#HRF2X&nNW8|?hFuPZyKsH(6Z}WBY98na zh6@e(%fTH?v&8vhQ>Fxo)k0=8O%%#PS!W2GJl@@#ZK`LZV>N0a+;Xau8~v+o8wsbGB$C-4ebrJO$^}7)ab<4=oekF?aS0($lO#IH46N=`gIm@+ z2J1e(CPJg^R8Xg;1J>2QtM?6_OednV>_@wWtsIse4eRMLOcYn&w29%Xz?kJZp%=(7 zp5K@bvk({NW1rf3T@4tS#dA)u4cC@+CL=-!9 z$uJ6z!}{ncSZ~3wL4`9enKzi|%1fPymp-@Kvur(kTpqG1^1 z1pS-&?^W;*h^qYsMO0W}ngBkbf8dQc?_bzc-oLK&zo5wOzPs5n2$6?l`R2FgmrujC z-h8;x-=;rkH0ckxAJb^*54d?sKYYCTXYL0*jTqHc?u)CN>=&7NT-{{mah)6E`X)1v z>zn@w=fQavulmpqrcP-C{=?kicl;|Q%BWA#W|=bFQ<&hoj|8g+WGO$L_$7K+p+2h# zBVUz}#QGD5+4141lK^5UHnrmdofzm55=N#J=70x9wB(sZqOl@t^9JeLWUj|}{8m0c zo*;UZc^Lz#=*PL4h20Yb49d_#M2y_p@b!D%qIk5>!)oi<6T((#MAg|?Oq2P=y$_qi%Ncjy^{dxq89_@`f?95e2W!Ot#T2_?P zKmyRI909F7fXd|1{CT0Uw)nXh+08SE5o#~p^BYc3>f0%yqjtj5-_1m`bO_ff2~Pla z37K|LLjI8=iDs{qxE1gT0kP)OM=ZsUXGrGfdjufkb!8AJw)X&C#1tHsDJ_Vds%kgQ zEdhd55m(#iHWBF6OK#ueh^Kt_AZi4Bsovk#-y35${TxS^i8`eua?Op+A4)#vL?}Ii z_S&Q{s^&v&Az=hv6Y}#GiTIF1-25CqBFuP zrYX_iq?bhnF#XD>@QZb<>)1d%Z|8ZZBbcHGF$7&-IA16EK{L~P_fPnm6N#y33}1i* zZt}_RoTSp>0d7f9ks{%0=tLaN)<*{fR_d|^*9%fAY)wF2Bz|WV3KPOsXG=5kdP4D5-$65R$c{* z2QqF=SF(3=2bnR7bpNAtYzyFLu3iMoY*RfNVRU1>2d^XqwW(@+ zzKXuYujlSn^mCBmk$w&n=^NeQ<-H9ANm@gS!;jRbzsAAw6hbr7i|WLee9&Qlk_b>9 z_N0O@;eh0lJac{FpRpKhk89x<5b*Vdiy?A9+HMnO{yD&}NPo;+f|wY0Q@Vu7JSXi7 z5Tj7rK-6;dySgoD^_7yTYCcYHpLI%2j9%Lcmm{a&(r^gQVbka?0CW+!}BLQQR)Lqha171zeh5J zOMJ`T#0;D|bFNdGzoTI0=^Lh&{=^H*K9$^WxGo|6k-BHatgve--u{Rxm5GwwWasZ{ zgn(nQCet9LAo%&_tFY!F1WwE=LDbpaQ%9zBk7YvmQh4U#XMxl`M4**0s2{)BO!TL` z24bSf1UPe+)1dlc?Js#uDrd-Af+=a|?}|J~@cyWT;nH1_v7Egk5`=oJ;{3)s-62OD zCWd$89g0BzotqQ#ebQB=;~ENbX~8+&nZuVTc2Y?p?l()aIjC=y`KdpD&m!2O}c_Rk4`mLqr-LJBiYWCKwp z7`Zj7KMXQ#gl?q~gpEOY76B|IA*uj$=YVneaC^oaeo=A=CtutytR^K3iM`#T(QwD| zx}YULVqO%G#+jmOi(<}W4rwE-i1QK*E-J{Z*!~2KL$-XVz%XivKZJlq{w<90VKq|>958wW2ykX+VhA# z7F2X(DO^!)YKp-EoF&z}Qh9J#J1AOCfs7E_OOYlmy3l~Or~`8Ry}L5WpQ;lv%A^5W zuWTb;FDnS*RR`Zj5iA|75W-!66%)6kNt_J?0f!CjoHMH!&dp z91RQ`cC=(clwqk&ar4-`j7~F-+@ALc1gi^o4slM~==y`(=k)S{sh@L%`#+ylpSW=F z?YCdleKIxYgP;6M=fw;9|E{*h^x00Fc>Lp+7YMg&xgD$p1CS>RUN!V{KSsiz{2VPb z|L(h&zCx8!-c>kp2Gi0VKp$W4zLOGiO@jTE<@1#t3yfB=W!4ap1?Unq8{Knx|{P5M*FDRrRYEe z#P2t^X%LtHPN%~2{d1(*`6rcKr<^qj%YH`{B88sOP%g6O)wlRD#}RyLOqkR25id?7 z*GhKQDpX`z{MXY{2D zlHY{Up;y-5k550~LB07Jdng$I&7(`sa|6F$J-;hzW!n6_iz7rreoLp zw-4Y|?f7v1pFMD2`}lanzv~ZNfsn@R{o(HW?fv6FuKwZuNl_X6NkLtwP{E&q;e5gs zMm2>0cmIQsa_@`q2mJ}lysb&n(~ABmfPOT*@XFohIn$AMc5qTxI!_9G=a+@ zjC{emekq4G1D!)I)j{S^i?BJw@0N@dFpE+ps~hh@j?5?#LfovhiF6YTsWvl_C z0n`~}{O88$dx@bDTpnR?E!Muk zJb5DYJCR=^Il!%fFQV3AC%+c@BK6WY;z011rFGOIdKog0G_AbOqZMG!A&#rH&mm4= zbBMzdi5$uZDvJzO8J-!VEP0iZn8lX>W>LDb2zLBY&(17X2{wy3ESAXPjKFf}Y>j#j zkpsx1pgMJ}SI=!&^7g{OPGHX?zO*J`b%<;l@yK|h()z-bLnrVbP}OfxQ=dnb*4Aga zCxB+BtIO?`^_Gfh(8>09h1KtBNe9815Yi z;rBsni+5nufH{<;!YFo|!(@NYA`p6JWRXd*dBnOJ+oT`nvBrRTl&X+UHAU80HF>lW z@P7xj>{nJzJyP5mFLR~`NS^AXT}XCYCZ%XOq$yyI4N;$wJVIm){AJ3xWY;oHT=^g= z={zf-K1h}-p^z<0ngn|mvGV1eC(yv0MRdu)|n{n-^v z0dq8abu2k1_#inn+H39digU22fVzDJ!eWn6! zL3)x1jixUV??awLN?RA1i{IYpbqdpk=p4i453)n3h>%WW%Hj>7E+Dg~O2&A8S9l2r zcHW0;f6P&0gG62frQGC1*gRtOT$ZU-$Rmy5E+SN}EpwsDu+H2$BEQr-k)Lr5gQF4d zbFN_znjAOOAsLL$ioC%bz+R#`hXu_;@=v~(8kod|<0^mif;zqvFJ7hqh% ztbnqpyyELDCLbn?2=Wm(&&nc{VBe2e&WItCJ}v3VWXH(B(5L#gmlxfHbpNBXbMQNS zo#jjbm_sSI1k2&gK_3lIix|Gyc~%kP!5%APot8UvgDZpe(8=O&}*n5m*jg6pPPb zi=eW|IChTPzbg65O*Cr%D7rXEFz8CfrN(CWa#N%{RuMW+t7{&aN9n=j5k-wA^Vnj* zJW3Zc&#j1SZgPfyKy%Jvp_uFgWhwGHUS{X#!{iXDD8A~BnL`x7oJXX)J)Os7fbyu~ zwwrl;31k+jlw6QmOsT17c2!Zkm^Amy(ksDcDfV&=vdTKN|K5X24(^fY`M5Gcy%-D^ zRMl%VJ7aGW4)`pcasotdsR+OP#o0m5-^T4UJ+QOr*nwr~IKNskYz{GHz4_f!b1Y8a zatK|w)f_4hB8$XW;VDkh+QIv?kAZ=n?k+=Da2RxID7|M2YVK= z$@0i8I?-uh-hs$8BchIWm+W0n*NUH=9ggA;f!UH@L7IX9oBS{H91cL1$@vSNaLa#taBWdKyzq=7T7t2Ay5`o)Gs@WEr!b@ghJ>3+IdtK;v$lBirF>fChdJ0)p>>N zuw78b#usEd2P*R`Z~SE8vlOemmNf4qqf3<)r28NHc`X+PP+B2sE1q36MU?zab|95_ zaYP)ohjJ09n7=D>M~sin5EFQJkKKYKyqmG4AC7uhsA@qfaFXxh?t-e8K_Ih zqEw5F2pOai^d;n!$49-|FH9P@bPab2p}ERjAk% zn<3#Zd_F^hq5SNJ99=$4mL_8@*yqLa%PfHA(7wyj8v?xtm1&iqTVfxhg}sD02<2yZ zX%Gjn7Z989^Ldm8>H;#?!2iPBJ-{4FKKX)<|2doj$o9jo2Y&HX1**u<{0P1SugE9y^dImB1u)`L_`ytY@He$ju({UR20o zmOw?c$s-IR#uO@#jFRpj9*$@|Np#Bgocy?hXnW=!dC1f0w^vb}!_Oc#C$@PQB9AtK zlvr@?DG3SnS@_%l9Q6@T5kjYb&3$Z_N1MAkbeKh#h0hJ(XZ;KNGkOCE#Rwod_pQk^!N(&7+Z7WIl|9DDx_Zgf9o0Ln}VykwYv4%czCdKV-BLU{SLl|a(*r#f8r02jh z=*2ftGPq^f9Af_+l^ntVCW{Du*6_`hEV>jjk2HQ(CAU)2gD#@#ft(7k=3$pS%`qYN zi}%wmJqh#Q7*KdnCO<=@MVzS|VJ3JW**O4)eKmQuJBSPt;kBB~q$S84QZG=RqsKs*8Rme(`2edHf5CyO71>9j?^n!vevb;rF7l$q$cFESIipV(w=dD1Cd9^vH}zM5SG z_YQA) zx>w)-OWKL3@|R}$pAk;*w7kiHaaCdCo3dXJuO7a+oA=+s^i9kAhN z%Q6g=ATvm{$z@_o@?MUBE}%MBX^ikJN>|2j?54!i|Y92^V7@g`CUp;LLcf9GV^v`mNbpd!bu2& z2lYf{96?+};$Nb~WG-R124h@AAd$dt;N3nvf4_x-%9z0kOcqh}6rjXmMi#?m5t`E?}cANxI zLg`*dj2}^y@ScG_k34>Q@jUVbI*&YfurZG{1UrMyJScXigOvOdq-dVI7a{Yc(R-0+ zK88kj??&dagkaJH@e*G0%%p@*gv%lfo~6v93!$>e0#ixQs7zV_bRLzq>ckVk;j&O! zWZ1Fs`;?5zZ_!59AV>8}nZ0C1egTgVH?knL%WK&VFv+ z0nK7?5LqO_i=kOWAygijdtWq<%7ZzJ$V#Cs_v$rM3zSD?Jgn)%rFk09d~0$2teTJ?Kx^=6PoKsi+D z!@fCu0%Q(p_!MvsVFZ;!rf&K&-`%^yqD2|LFD%g!LHINzZw~w4r$73i`tM?X;ta%q zeCg-h=lcC(e{BDA^Rxb(-ZQPdSB&*%$)C+jnaL08F#ab$gc=}HUwlk|P+tf?s4uQ_ zUkE>_FaACEh46#=;{VBgA^hO;nV(st*JFj}oqdL%g%c4<&q0eAML-!Pnulpentnf8 zMwo(S(M8WqXYs{wS%mDYpq`E=^E`DHrvREoo4y2{MJs@2(VEAjv&bw!9)f4t(`>|!-)u~CP8|OTf~|L&Y~8UFSg@pV-aEjG>cYPz8qQsG>g_QWDc1H$fF3> zFpDRE$|4J1AJ48x2qhxRzf~?`Jp-Oa|BatG&!W>m=RZF_BKY=4aQ<0+%1@{pfGi4C zkf(HC9#06BMdm%9ex9xb@I5HsPGY(VZH4G{cMT~bMSRYC!(C*31d>DJJ@=kN7j0aj9%Kz(s-BgF0f0oT* zAKPwSith03p+ZltUypx%diy-!v6$mk{lETE6o-FvutUEV-PnzQt&w*43&mEOhvSdq z<&#g zVfyU`xa#2^RGoqD4_&*DWmA*{ts7+@zZhaaM3V=2Kkw7j4kGx+6uj$+t-A;wvvxW( zRXOba$fWzk7^cMZ;EST&nsMpl0n8UMN%*21m#W^2+!rxb!(rKrb;j$V_yYH#luO|P z^oM$x=C#=?z|VMs;8#j3pbpB*E$(N3eTl)hahs> zvR5mSB7jH8tHaRu``+%fTm*g(IjEk{@9slHbbV->t-yas4kE~(A;r~UZkuuJdy?-E zG#VaA`>q+Mj&@-LnINsJwH)TzOw3Vw9}W+sOFgV>ORE~mF) zq_l$ZuM(c_+cpl}kRZMKk|3SCWo_zo{Huhg``WE-wIvdLCGfOt+jd`vLq z9h32|6P|XElWuC$;RT*H<>hPT8l&aPZ~O7F9Fv z9Z8%448>wSOw(2uTTKgSK|*<04qa7N>&hmKfe8fxXhxU}Q%k~SK|(Yo&Z)8}VY1o1 zLUvfeCB5MU8=T#BJC3u}X#^=6Yrxue+t$>?H)g_a5|u*|p&;g=D5te1wndOBrPbc; z!%mti1WjahuG@8+3KGBwGD2D(ma6J;P7#kjnVvl?GFPAD`LE4VU{lk=#h?k=vFX>f z+elYMu;E%mN32D&7VAz2Kn$9oow{b8n~wMz!A6V)+IksRESCV9psmWao`#7y8=;L@ z3$z2Y#l}Z)44R-F%YAFBUf^w{2q0THfFTOJyTfIOH9>R0-ssDE6V~A^TC?`h^c(E_ znU3s;+_%pWy|}r++N^{ndyBXLv@@*IlGSF6HdcpFBE<@lcZuGJ5AC6yilu|$D9{@- zVmLJIveqMOr;rL3`bhC?hp}6ya$bp!|Kzgf{pl20PWz!Nn+7L0alr!$S+yOeW?TBP zC7E?lp$Gz1wZIDMX%~7xF{-NWVXTcLBn~QMI8cq_f_*}4@ql7fBk8BTAu)DPA&d7z zKUC}9ZFJ&!Knbe89Qu+^8w(X#MEhYK_n~U~099-ZfmbkZ%DM~K5ZOUMHTAd}mBHG? zCeU`Ms<|uniH0*1zh4}_r_XPkm$O*m9Budsfw42M7%VsmFbbVJb% z9p3`WBc6o)-*3m4zXRpD9?A{3xP9h>6tY)xGxi7uvNA3>j6jn5y}o_D4PbC`cg48C zxZ{(Xk>GYJ!PUz;7xh2`*62?BdQ>RG83Nz1O-;YBGEs0u{rxe7n-A^Wz)-A-6V2ln zX@+yLL1uuFZnlroXzQVZ{ftQ}5NRL?K)DRf(2m3f+>jL>dwizKWm-poFC<+KT-hC= zOyjKGS7^?qB%WAUk$v@HTFMgClC2L=p6~Yg|2vYeBwP`w?zJo@H76hNErNs$>_xS= z73pGwGlH41Sx5=5B$mTTO+Fa!f5PUOtA^KqIHl{b9M-jmN1|eT=Jr`Yu^qOy>tUf2 zAO7`-=6V9qewgcJhA)TC&*Js<_U`*9Zs`_K18>yQPfa`YBp4+G8=x=upXaAL!JHfp zBWPPkc8vvQr)*Ldhq@bZ*sr8!$yI{Z{}K@eq;r~K>5?5E-EEu_M10c?g$KRPCq{!f8$aI z#Z9(GgQ-9hZv8mbtS`w7RVx^7+7kY$zAXB+Cp%h2+|Q$h-MW+oZDgVZGOE0Nii&^$ zY^HTs`gvwuY$5;kcuz%!A!rLn-%@vNLo!03EKSERieVAW&7o}eZmbsvoRz2MfZJ$a zjO>pAV!cqq03a=4%f|6w{xZUz6Oo9A7%wzj*Y))Fh!z-5Ugru(o+qsEe2Ph zpPt@c?m{mrjv6>ku&ZfLTflha_Am|G-ob06pfo4NjRdiRObu|)GC~a+-EH^7P;Bd7 zY4S8sJnVF+w{dCKSt~kUKC}^)=sT#FWn2b2fiNBai`Wm+9QvY%Hs1v75xKYr^w4X? zzG~L{cq6Kp!?4cVSo1YtI7$0+J}h-TLod;}Fr0+FxgGXlYZ_SSfSB(e|B%oSr+esZ zmWS*LV!A~WQ4A8 zw!=6syn$j16s*}tSpE%ZRD&fZW*FzC<*UDiNN8CRXIKjoJq;5%u@LUrpoyoMtXK;Y zqiLqKT+4;*eFGB{GeYg|>p*t31qsnW=|Pu3kNF%{;f2JnTOXJpq~C5I?vX<-Lzc9!;Z5g|iLXTB zxI=ZQrV1DNnG{(F7%`|kK>l#o;kZfw8E!66S&h@wS1XB72$-OR-*@Q8jsz)yjLyUA zP}exc>xQ@!0;VXZ2~OvUB;1FLuDGDGhKS>u*dPknppSbsL~eCSK3wzOHr5 z%S3{(JbQ&5ltLyGuS%R=3wv6Ev12~~P|h797$YefA2PbHV&VhzM7Py+aE5>hFBceY zP+qh{1IT3JLp{~A3Sx$U2}*^&wM;B zVJ|^#wkzKS0zwm!D!0BF;4_I)MtT$ST;evlv>Xu%P{wOYTLfY{r(`C=hxqDNv&%BT z81oXB>3(mAIbHf>IRQFP1)>AV(kH74ftt#)sfI-M-eLl}!w7}5?umYoe1Ev7PIXPO zdha~dXWU=O(bd8z-nM<>+kbF$ef%pvynq>-aO}H1!F=^sqWxL~Ugip>6U{Hcd?jIC z)^%yXxET0a!rZrA0afjt^lF0F=>$hy3>#RW>~m+A6>_FctGQpelSy!U!Zv7e-Q1dr zNZ}7SS%B_(?eX~K^X=Uq;Ri@um~qB*><%KoK#STXa#M*HniaNx2Oru(hg?NZG>Ac~ z4epa>F$fysAo8jFWVaL?8O8TZBLi|rSJQ{dCh$wYs4}Zsvf2v^MAQOfm z5Z*hxa{Xb3UA(UBDS+qh!nzfQt(ex0eUP}^l}}G#^yB?a#JdjBm2Kz><955Sy8AGX zRcUU4Dq$*`R*R@cIktUGT*k=A7O_shAzl*PpeSZMnTvk_9Ip$`@C`SA*jpO2>C9my z_qW@ZztL|wE=KGC79ubPY>0V=`ZLXy!sG@jWz^O`;j7u0Zb@bRpthE}p?>cj2Aq0(R1l!wom~i~W=kS1)N@*<-6sTHK_yO89foETE z>=bKk*A7Vn4{nc5)AtR>+C!u%tz}hB%fLaE7&N7|D3)?y4@m%fmGHG`#==!q-HW$YgJkZ2%8zj5e`BAuc$@ij8A%0R?Gp3SuBr zzq2zsf{b_t<9^s@XpDr`B;y1Yds**mHOF@7a4nd4P%YKWfwGW*lv(52!2(ZZ0DCGT z7PdWtSS4~r5@sdlV1Iy1uz?dOzBLV^J=h@(y0rsLH=uSIAH$=5BriM+2AB$CgO%fB z+spdM!p~zpuU$dHv%lyDWxt>`%=Y*&!ERg;QGj6zXffgw?ND;H^hhn>#F5~G2oRQZU3c(*(G86OeTQoZjFWVl z8W=&u4htK?U}rXnQRC+rwvMA`f!SGp2!~P zhOOG!-^@vFzQC)O{3>b+9-znNyWDYI$C*tWp$uL>-w9I8PXO|VE~A~ieid>@% zJshB*DG+%~^{=2$ja%vW{$dq4@|SWDZkEi4Qmt&gAIzAeWSRjgEa zfPwBFs74IGKx#<2K+ABlxc`N+q6GM*8S7$TUF*YRgCh_pz_0tbmm9mt!FvA_gq{-k z>998gc*&RlK&)9C9KXb0;G(s3RaYYE4|5K_Fs^_5rQ<%d8gwAinQ3!cLAQVrlMt9f zDl_hM;ugw$1;PgS+Hmuy#qbo7+Azqd;g02}uRn{$5eA7yq;SS8@e%mteP^{2eGyWK zlw_pPlr!9<>a!JUk8YAi`FY>kv2X$IkYU))oc0%g5mISCg2{`_l40xF*!E8_JH&lV z9YXM1Il}hhV1V5qDs>RtQ=5fvBlaVcMVS4pJXAdb_CrGqRPkn-+9}4r z9U#Sf2Tvb!>`??-4kcpOGtLJ94JU$$@qi(F0rL-zTEKYe50)QqDMRR1ND&{d=wL6w zeth}5JU!mOKD{I(49Ky7!sXmoH6sr?nHa2B%PZng;17_uRd?CL@GRBT58EmeZ%NE4XC~O>m2CWLEM5zj-AjQwr^%x)e z(uvcf+1j2|vG|cRtpVQF(jFq-w7Qq4w`V&{s5vJHbv@L(3Gc?ANdv72iNU8u7l2Pl zHM$d6n0^LbRn`*)<@vK$-U}yAY)&-+RU#qkyzH=p_@4U-5`_cc)AQ}iDHUEyeCS$S zHb`%13+en94e&1rz|X{C8)ZeH=`F=R;CL=Ux4ucAPREA_&UR^U?<7I*P_?p@%fg2A zuQ<63{POfA#ZI2Hp(1kyl#~zmzOF3RZf=70f+KN9VtUiGw3n6ZP93Fsz8+hhJk2;K zHUvXE)+RRJ*;=#dI8b)gTu?d?T^vF~K%30MM>DeQ5SCSGeZE%J#-i{^h43AeH&V%I z`Zk+RfNT#X>RXV7>Qti6C=-B@N`&ApeCotilfWjxA*-Vr_O|0pOQf;oF+#>D^$}Jb zFk(-7I+E;b0r!BstEm_YPG^d~kl<&St#DryJDtxV{99&-5!qiI-16+_k3W&dK%)8% z6CD9qZ;X2Zaz~;UP6Gt%0jLwtggGLMqiV}_V`nL|MC;HL7DIO9Rw2}(=f|EV>?D&J zq;hHaLnpf9p{^RZrr0*t<&|^+nvXw^52petmf;3LRCz=;@6c@IoACsf&uIZ34ybh< zkZMZ`n&ADK%-lz`3pZp)vMHqxbA9g=hd{?6LkvPXK zxP0KIg_zR)OC7T9@$n9JL&_-fc=XtL96xUFAMa1!8CC$L6!aFgaEw-gs^mxkwmcxy z1@&DWDGuzY-1s}i66d;MkJE6<4UGg?_)wdM^Q1n(lBDT~!)`^1%o5@jbZ!=|I&9t2 zZw1#%5ny&A1Cmu>4ygjv_(m;Iu;ECdTupY(whwQo@5}A;^HHb%^1`KGLG2+srzns| z0K(s?&nu`x%(jPu z5q0{5x0i26%2*V@$HNTQG(5hfG!*#19-q&AfY}#Qjle76R|Uuad3*o*>F>uo0X@!& zY95QS;H?eIj;s!Q67+Jy8|nY4`9M6 zu?^Xp^SBrFNX7+{(d5}66}wz;rjRB+GwJ;>&fSb8NoCsxffAFkC-4es%5?*=VqR&J zC?kXLa-r0qM53fO>)+N2DA{0{~Y_#`{20H9g!yD4RBk;1{3~VnG@! zJRP(q!^wjdh*@!O-f={5?1Fcl2cMfTGQTEDl=3r3XtHiI2qVD^#O^L8z9GG1koiyz zRgdH;K3Ie--*mf8RPT&rK`z!15_r=uR#fa4^;B?*i{%yPWa|KuFcWfUA>jb-MKBmj zN>7Hr`tU{kpj?oU2OpL2!B_DE*beXz)6}B@KFR}(2)*IBqsidQ}&H{PFbi zcX|7Q(u|k#?_XdT$Hki1hV=x84qsuc)47CWk6f7L(_h6eWiSFviWb!^IGjn9kg3DA z$H`s;O3Xw5!DEY$eXYQko964)KDF0gSBbGb+5w2Hbzo3526il!S zw7;b{6yvGjemElu2dkiO$Xdf?pt0W@#8$Y|1D4p_5c%@?lKBRACg`}ro(%pbnUy^r z@fV^rAlS2RyyJ(HM?YM}=uU!e8u2GcBAAghu}n(W1=GlVgm_-r_Du~ZH`Z~v{p0A3 zv_3uNzQbLpsd`kOsfyO{yWB?*ng+#abI%t}8Z4kO7|t!_jljtv zA|$)Po7-?a5?jH1#K3{JpuCz5Z88>B>Z3}}louw1L#G~g`ccs> zO^|vhBKUbr^mYJmycC^ocG|gC$0bcAa*cFfWXiMyV?)jno~ye1P6yN5Ygnj4^+G5P=oVw4 z_>d3?c4&t*K(C{Ya>M-^lt#Ffml46Agd#ZGcAS?r$HV9juU14{!x{;eRgZ2(WSbBy zvr7b>aMSG968Td^j1(q{wJi)Ey69I89o)eeis1?6*u*XFs54j9_#fyvQ9J;g56DGF zEj~#gwwM12#ff5gy5x6DhXWSyWO-}l3Uw6O9ArYb^{T7`auc$kdN;jzp=MN;wulS> zarOOp_eTsb1uk*j8L^D4y;IoWBoJ@J_s)tgL?850gupM4I;B@Tlkfu`~C9~?}bNo&^QEqVR1(BB_O!VvXg+Xjv-4B#2@iN#XhRwE}Q!T z$6!ev8z$Q8o&(L3T)x1C<3Q!2n-;1~X^G%(#7nBL#ztN4pMTswhwuwjG`h{0&|0z$ z)8iRtX;Y1)>Qs?jsO?5Vbj!XioCV%AoSz|5UhwCa4T6)LL_ zeamXvc~^xWNV^>8SlQJ(`peO7G4S4gQMI~1V6^Sln#XZaZD>OP%H)r{>9~)`#%mBk z>Pf!LNdBg9U)hgv=%b4h8f35o5g&0xL2+8S6DbZ7uIGpV=FqM^7sZI5L?0}u@q{yj zO+E>p?{?uBFq9CAM_Ln!zx+)!2wat8O+pjiPX*yZChgL+lUWeGzd5{NITROy!082z zx0V%l1P4BT_2%Bix)(`dXnw9vO^q+j%N3+(0-V z=L#L#X#a$8f<{Nz#~zVqTx|jEp-e5%7KPypILSR8JV+f24{1Q_in_t2jZ5EsV5y%9 zb{HB|_A9%U8Q4>j_>UCK{R7o2p!ozp|SxN?ycAXy%5T zG_p71kA6AcO8sV_EpWr!S1?xm2=0QH&uN<)h$zzP(L09&r14lWyy@UNRecSULr#e| zIqE~!AQujG6sVu0(=qdvAneHcEzoSFU>k}%3h~~PHW4=Uh$5h%X4zc;$mNmbTO%b6 zE<9W;Jy)pvL<-2@29IexfHK zCdAK_zEGeUj8|ArbI~~?635_H8IUikB*ddk{a5J=@EGN`GxC!|!u&6yQwO2!8L0rs zfyF28JUb;GDp<=sPU4YMKg7J``{WzMo+ktixaK7IBn3s{HYz6&m7uM|ut8dXf*L_{ z#Gkbt| zaFUZBn?B;ba$zW}64H9mZJ^=sO`K?-ArLnr+}tYErJAu!@J{m6q6%~zYcwP!QzV>? z1dcZ4)KLZTM1XsSj#KXevyd!Ywurc+x)AU%U&T+t69EP$gc{i-rr%F&7r3#0S_UK1 zg)H)=L*NAi<-bT=^r$sJ$09WrZBLKDa3-h%LHqm>8RQs%Abpb~1V!dhf%{F(3lJr0 zhLG?wp<)*{ES;+CeD%hc{I2j}!F|-Qt4n8Xxuo}K=XTUA7cGprR!{-^G)K_Tr6XFH zt3a$rh5t!Ne2<3*76i?)$bl^A^Cv#f0A3Akhxn=p9v^7{M|%@=$)v;Hqeo+pPc=Am z2XrAs;-?5M7?E&06zGVlx^`3gS(cGh8rLCZi%()e`YegKh|-uI?aw-P!5SZv;9P<| zIw8%T+IfK9aASC$748jeg&bko7J=-hnrM>v$S1_x72z@=2-Tq#2aaxhg!DN#%@7WX zzUz93jDquVhk(eqhW>-;NC%=1CK}%50Zw@&6!Qf{fcA_rH&Ijoz>SE!0NTwS#d`4* zWsjN!xb|8oW)U9g*J-Q?MH*`mbCjY1#8eh|H&Hl%cU#C*6+TFZpt$+IlGaJS z_$bc-{o|4K!?_UQ2n3%FfDSktZVl)No(_r9RHIO2?XwQMY+oF#+7~(^wNU6jVZw7HuriK({os*^DBSzN0MJWq8YKYN= zsX#9`4>Ch0{0sYr6uk&iB6HbR#47k13Qead&qx$(;T9VF=AN=3BkQF>lF8nC=Qvtt z2)YXF#Fc!2>=(hmBJup7=0o;)L+q5 z9FR3$(|{Wqd`xA>dE5eg6iGssZ8hQvIvmQ3|MBP3!yCOC)80SenV0w~2xxdur-1{8 zNMQ@1F4aB78Ie9=brjCR!1a7*hreb5vYSxD2P39*9y&k_J{-Qe<_*3|>$^Z;@Ko$ZW?K z-L~VvWp4wcj=qRl4-urt0#r>M-ytA{0xjrMKA?j;au`8N0B3m^OBg;uVKq`VwVm@0 zA%m|9xhn|!lh)!V-f(4K4V3}amo}tA^>JCG8!ScoP-2$)sF)DN{M5@59*gZ zqx6s6xpr;=$p6@2e4+~gErm20M6b&QZW+GiAXD7qQGjQoCcO<>!qEaToP-S_6qx=f z-zIsCD37)UT)-XGIHHoANHc!f(9O!#t;H|arvbMnPDecG6_#ll7cde4q^>DQ^BK^S zd**~9a?hGUOlftTCrSa1aYl(t9+ZpWQMMMfdjWm`V+a8rGEpIlhzH^T?`6L!4hcaxWD(*`2si=h_(4)d77)C| zV^a`Q+H%#~%L`?9-J*K(Rlh2lToF&r98bIAEm|gp zUMgjH^bHeW@z4-F#+(D};YQF~fCUlgf}vja;}=jB-ct$-^Aqo~%)2UAxHnJkaKI;A zd34)DHS>m~IZ#VJf5o|zz+(j7sfmy3`$M3-aN2nmI*HNp26e1;JCUX#P%)(w$4U>I z4ZVRhl!yzZP-v^v;YCflxe>B6p*$Qx(B^pbi;TdG+6ozfJSudwN0WV)9HZ!BofUoq zPN4B{4}T6uQByPT5hlx4gCbOfpoc$Tg9n5YP-LZ{$_lY_0#yaT=RbfS1rI?WlgQEz z4)WuJs9a1{TC>$q=^Q>_);Qo)f~X}a(mgs3w};SQ1=L8RgrnJ>6&5qPnZ$J9MU)b| z1Md@?C9=?I=n}mJ;GID;L=usZ3}K7V(`@KPu(8;M&}lFij@@G0^#w5kmZ&awST=~> z$Ao;8Slz?Vhl)&+j{r5if)YbeG=!r$MJ=+rLd6N*rA$zZyxy>F&~=rJ){qd1*SK23 z8QhX8h=3)k(Z&h>K|Yj1Xo=Uzo$OKMlul95Ug#=~Kx6^0b4fubS0QI%RYHEIn#t8}0a7qheJ>wOcu4kuvh+1NGOHG3C z3Qo)q^c)vZBRL*Pf9b+pORS!ds6};c32IS=pbrO9VN@$bIu49>x|Vnijer6wKIuc) zlxWm&;C0%fhoI-ziA?@YY?q=T9|2<^n> z>%~`uaO0Z=ZphHy8~jv?aT*?1Jbr6yAVV}9059#qPeBhzh+l{;=;^kH^h6j=v`4V` z(JZhj5^(_Vs9$GL0?ki_(@>lcW7`y>J8yS57XouRBxa+ zH9~W=ITilMm6LpeBn({lsjrv*#5xUPPz1iwfwhEdT|?r^ld51?;X9sOXt=cnkpQSv zo5Bj;aO!t#7iy?V78TKMt zxy)$76@f}B1ozDvEnFJYa?s*MH{^r}WYVo2UXL(EA&VCrvVi> zheHDI(HCe~6=D?@4uU?zEZ$AFgTX2>8Q~&S1S8{#ln15GD=sJM6bge{kdkFbX@XYRLqJ)p)1h()?r)7{u)T4}M;2Je}wGC#=F6l^o)Hg-z0RT=0lYClLs0aM~8+ZJLhA8p<9oLM;)! zA%@o;^yW=Iz{-RK!+nCQ{Dk+ZF)heY{6*~41Uw#`LE$f5u>|-C|ANrYIQ1KQA<&}f z_6PPz*tP{nBAz;h&x(W0@%YIUQJ~!{@RM?!EP+nuheQJymB^)_Q!WNiQu@){axc`g zO9^bmxCS|?xGo_$E+CFV9=Mm{vV>X7+u!|UR4D1-tFc~U_C{~wrWryf9EnL42 z!POmaS+G4pVyU4_ooxt>SAe&%gTIoF0ac6|;Ev`vB6M1I=zvBFMoDvoKJ?8{AgiJl z+e-W%&jV9-D|CKqjs^BJXd5epq&CJg7`(>#Johc6%1~K7RmUqFIvjHp$s8( zAwb7?z-qi&p+-4W)IkR?xr;#~v@l@cNnX&|F5zzc77GlRp~GPbeJ;U9h{0XFuiN4I(*!um zxC0w%l(Tg>B?Qm}E$moyV&$+~IJfAHPeMyi9HS9SidK+aG-@s(z$t9PUGz~}c8H_^ z8c~Z75j=W$crx7*$Ylr>A%bmlyW%AeT5n6$}=(mqbpmYnz51arkloOg_rDBtm(o*aJig(j* zZ*Yv(WnjeIr6;>osdz+fq8L#2SoBDGSotn(=21V(&Oqe@buM1K*p1jRKK^3P#Z zCQ_uoNE18p4PF6kN+I3Pev^(f?eLGO&h_G4(sWD&2^M;6LJ%%9PVzP$>g4fAINJE7 z=a2d($+yH8xFF-~Pj#yPBAp95K-05YIi3l5s0d5rbqy3;(p^WI|Nl?fn>DwQBx$?n zCyhi-PtVn-L?)I5avQ0-y3Th)gGfliDU#p-q`GQ;{dwFYa*6Oru%=9AB^f-{jK#zK z_16=r`)Ys~I6PXV@=2F5xKzsUM%bm+tsjle`bUTZ!ETxJW2f3Ntx!U;)1*#o*NXWr zHDR8_DZ!I4Gky{b#;ch!u%p+j)*hU`6`Pb0oCR5|fZNV}O>z_3c7UN(lH+c+Zzf?Q z*C3>q8%O9jrVu8y=6g)wg7b5;0dSzFPLxPEsc#9}#S-f4t@;E|<(#UUy`G+q_nzF^ zISh|upc3!cb+&_}Ro!Ev?oJ(r;USdqj>T63tdRlNQ=Z3A4g(bj>td&-XBR!vk zs`;#B+mWD_{1qzsy1)N1BZ=FJdk#ie|MGWV#2@lzh!SOz!3C``WAgo8rRu|jtK7Wn zJ0b;97l-JZ89GSfZ7M=Pt3IcXe+8J|?5L`FbTD9XXT- zu|#cT$i+w+fO=DX1E_}sR*&AkHv1`HU5B`kFf2KIyja2wNSJMwW6vx_4IRW1eOvE{ za?JJd)QhG1wpn0GaRi-%SfVzNT0q>VNaNeoye%aUF(CD^ZwZeXiFYLPpv!*f8%?;% za8WH$3CYkhsm;zC76f8_P+!%o;;VD_AW47CI+kR`fLm2}3WT}J62g%307==&b`GQy z!=fXE7lJu-fk&6a_2XNkhBxcRrPT9GFmt;P^`$@|E!9}*cb{YYTs)rcf0t`55v;%M zh;$|W4xN|N_8zF1FyN7M<`q6Q;}YS1B}K>zubV8vLlDg~!t78N%^hU_K^$1PvMSi;+j6F2n$%EH{BJP(I&3zL9_?z93+K=P?gy zrR)HAW2>RsCk%?k0RpYyaO4xZkzbR=sR(@@E>JlMnWc$rVvFGmAOj}8WvSVvsd|{{ z1lYHlrwQ;BL?^YH!9ilhr44JptQ)7cbts8U%+vApDaB2@!4X;)7%ycR;No~koYh<~ z$gN^R!VCt%rw7kp3j9HhirxSZOKu>;Gi9~LHRMvQNumo$9T14%lY;VyI5K^fGNog} zf{HOB9KeuAI^^v-I#BQviiQR{?e zcB1EmqBxIW!B|5xKy9IDWC0-~BrKWCgM3=%UpOc|4|-4~H`!u?=BC#Ga_-}r1t2*a z;ATNtaMd}n1k{gk0ZBRKlQy|#l?};pI>gMupzg_Ou)u{zy|T~FlIThJTUGP_P?(+& ziVwvWiH>CoY>AJl5;@U@Ra?o1uqAG635d?gR0Tz^DZvpl*D+#d;jDt(M~?8InZ8h> zZ$euKkgU-AFj*+kJyIg<2t4HT(h`d|C^zRzEH>D_d;hS4YA))jhztXg-EgxYUQbjO z=OnTD*m?Hggj!(^M5zB(SEz%CODs1vuTy^*Xdma9fOt!g_y+gAEDEakq4QCo3{n|9 z9su?OsR)ja6flU~F_?^XS%!oTLfKuR7S>Vh%9vQW?Y1M_Lhj$O#QdnZvCG|Ni>p{} z2udg|tWykvcA()HZfpv{K?P>dw=yXcv@|W#La?(ca2?2D?c4eFc=%Va?=e6_w1m%7 zf!i#i2@Xf1xI$r46td@VR>~I%g(Z+Hl;%;9fq-$Ul~(KD`(d2~+;-a?;i0l9L@6@F zNufOSJP=JR$nlE2JNiwD$X^8j8#V?^R$}B5yuT?BHo=>hgxt8q+>7wph)4B<_2=zD z$eLWt<;94HwUgDC)F=WdrN>XBo~`f<(Xt8GUdCzAb|@sg3!D671v zD?ky5Cc84w2aP)eAXyE~-9kgWl7(FVDLNEl?GTp^yjpYdRHE_$zof1?U z`&D^W5hVx2N{;$S()M&y6eVF)v1sg0#NrHvlkmk_$*58gPz!2>*&`P9(L~{LDZtY4 zn&N?j__(m#DG`Wr_M#xcz@gWYADJwGxYSg|AYPBKV}f?|*)S)!fByxi9L#^?R-m~oNz3J(-=BNBD+Pa zH7)tkxUj#W5O$=RXzg5+XH3W8#e=C9oeRef*?8lPk>W|jR3`T0jpl@(R-GhbBn2SP zSu8tdeWdD!tBDYdYOPWJuI^xb5rm5+Qj*=Xo_uX34K$B4mK{lWQM$xK_|L=f`;XU| zU^lc6z$GxojgmIXjr?RV0};0-r;e-6f*(Dt{1txP4v|*0iJQI7#zrwgL6j@C|4Ix)EQ9>DJAAS(KDRV z?FtwN5V}j=mM~T-5(>=YoE&~vlAS~4>5Yj_ZZLV+S>kelaSIBCM$QfHUthvA`J3Ub z0g+)MaJfkb@tG0I>e-MXR`2%m;;N3T>_Fk=fbV@CE*~QrO97NBp+7^baCiSxA55AM zY%@$k&e|m(bk39vUJI)q?@X!DO}`hl^WRE3J+P1>8KjobOIkytO-JC&lZ-+xKX{N` z;z}Xt$_ofwozlXGzS5(H5PgE`{0qPfE}wr6U)yeH9{tV2PVb=fTdJjwA_*Mu;OSmFyOV#sQu{qZWGgw7SQ6H}3#j%+gI zeVr*|UsfbG!SM`WT2Ag%&k|EaMnD44pg)w)n_NMO@xXe!YqP3S_w!64J0dYnR>TY` z&OTkrj)~h3$R)@nIYwp**`_2?U{OgP;<41s`UYu+N0*0>oaxgAl87b-Eluyy&*fAI zWo;jDliBnL-OapIGKcLQO8xhGb=KiHEM27A&a?|9h76>!oLDHE>hTtI%)&Xu z0^!tDRNPfL=!K}qDIYR0*9D4}V>}KjPEAGIlBO=JWz&bUw#O**3$AC#);{C=gEV!vZ1; z;P#W}qAEbC=wtz!^UB$3SXNMRYVq-|h9}KD4^xl?AmLD-?K<_H1r;Zzj$=mHEunCV zr!KWpi89@mt=WgSiAg3UFs~b&Uva&u@6FP~*MK8x@}hSWmw4^SvZfn65aT!MZR*tn z#;(D5-)fBCbUJ2UlsKipvNxRS@)bp^c0@frgutwA$N~s)B+gvcHfoczExJNRn3Y|E zl-jCaOoVlqb9KXwOQJX4%u=<6hjuYWy+L8^h{V)oG>C*&ACM&QD3PLBcD9qbjiB!6 z1H5)Jh>)ftVKv-IZ3g-1M)RQs0reeeabp_=35;Y5%SmNqO~nMN<`5UiT^bzvS@ph2`i%2t^kD!Co)oB4)>?$2MDo;1rmNN zp1K`@x`cZqg~O_G^+OQD-R*seO7~(H0M-UL&B{zIGq?{2vADJlURP28dH1UmGhbbx zgTnBvgeF66h{d%5#V3falVfKPGv68;1DT>kw01*AHdYN;|7HPtRj2##8AWX&w1mk|2D#pNGYYi5$( zc0}qBVHn>GW5ke(~giJNvaTFHwk2zEV_N13>yb+*}(cz9G`x_E$?E;%5{ z;56z)A`@1`oRX`pY+=`97K+2m>ksw0sU0Q~mGn_LMBEy4K8lutmy5i%KCUsCc6r)G01jpb0Oh^J}VY34DXI(c!OpLEpHEu7rwg36Mq= z7hh*DYTB;>_h70M*?%6NA5Q=3PM5?34R7}%!%*%Fw4!YQ;9!Bj6X$fNo?w?jYaH>s&Cx4WF9N3`Ct%H&i6ndFSs zh+9E4^d|IQ%J|xs?5-eZWQIi0lg>FKZ!8UPCMOPI0KqsU-s3@Wo8o`V;u7eKfFyuD zil*S}?zQe%7Pb;VtT}!&WI1fOl^1VMFN4jMuVIT|Pb{{MQaDkBg&P-vmIKy>3}_3j z{Dme!{t%plZA~u0SUyod97ZKfnTmbL9$$X!VW#*l6V$$ZFr5*?BO(Nr3jK13BP$WAu;AZ%`3VWAV&pYzG?=mrRC^kUV%DzB) zsNIGsguLK+wq4>qjJ?Pp+3kcuED()|rUc-zf@duG?q#!Rd{pdlGFR>KYIb>iY9#`+p z7tQabYs!rdZfqf)eKp0fV`893E7eEU{>8;UdCye*`I!53IB)34SFl1vPmC1MoZ+(26W}hn3ZIn^oTP zauB)_i4zOb4s-yhaAY<@>BM0I_Pr!jL?Pb@Py3OmdqZMaaxpLa(2uEjqH;3)kfxo~ z%JM3u_Fwn%5#Q;*`1#29!;5;ZP@*ODc$!)}dwO}9_RCB@980xCIBH;gbNJU)VbH^D zGC=I2QU2rQflTx7$mh!n6RxsW*zv}l!O4c<2qT8Sk*3eE=ra#E4$1&phZ0=@?lP^1 z^XuUcZwwmOhD_5?h-5>H9PbiohZx9AiMV&XEIMET*-lURDOanjz=0M`DGV17r9uiW zU(gv3oaD_{BMZy~3LQ|-qoJXfwKpq|50C&$F8sLSheXB8T}B37RfmI4;ID{JCM=Xd zyB1JE#1-4q1`iA8lH)rM>P_qyd`$wc#6A?)YtJUhoCG5Wv5-bK)nN#%wizJZSlC__ zcy1ud15+YrbkJk;x_Bn!doag9BM^39S>ZD{!c$YRAhIcgBg+We@d-X)(FkGpAnd+0 zemC0-f~J7us!B9nYafyy53?ecT?Kpx!l@pwcr>rU;KZFse!U92C?tupDuRmb=!7U7 zo0@~(hO%~&p~1nI02SeAT=r9u{Cc1%9YcLkZ{p(t{zMOk!a}Zka)ImJ*)0xO!h(%ejZOieK!bs*7-W(q1!UI+`k zvBlKm;YaEymkc#78 z@)f717_TiPWfNCTFPo~kBViLHUgM7T!l@}{##*Al#!I4?O;rpEoG4buv!Hj77fwyF ztR7Nw#4G+LImJZhXM&21z6ZzzJICNRAayefNZetu@RDfPMFx1^RGgY)V#AiilE!^V zuHtsF%vPLOv2bdNv4ImRT*Qk4nwvz2iB8K%L2ZOnQw+8fxAeq5={|>e&Z3zB#7lZ- zNjD_JlUKPa8%$ zK%d7(D(esprw6?&PVmd|e-0-7FW!Y!28n^H24e}wP-~=ti)>m_j!cs`xkrl;%?JV@ zzbj~Jx}sO1J}r$LC?WiL>qY@&?#le{H%ytQ=l-=27Xez#$3j`uOeOtuSfGu)tFClb zRSJ$%gHIeU544f~EXR2lfdDGQke6?XOS{hljjkvP|=5* zM%29@3sV3K8ccLxr{tDOWz70!iom;x^?XBI&s>q8ri?_53J^vOMX6?vric(eK~W0t z+DtP?+e`y(U`P5<#lpD{7EQqiI|cZGHtUkhS`PbUp~SrH1iHzJRuDTIaWW?Nam;w2 zKUicuCHoMkNr{QQGEoc?cuoj?+=dMe#S$|?)aweiok}+`#Uf^4(+pR^8Z*jDF_DpQ zV)*#IL6owQ^bkEhJEyY)MVq?OgkYiSa$WDgVDypXH8Zk6Tlwl6(g6C8p-k*OzoQ*hL096a` zmFO+q>17S)$jgi@59*3E@}yxA*|*D&Yr;fz!onc03xw6Lxj4N&KU_=?00wC?UHuwz zY4^ws33raAC144LFfvu>D*AD_|6T7gF72noSEtRq?qA=enehUK>sEr29SgCyx+sLF zIDFd^qZzk?@fI3daCJV_;FD)2=zFGnBC!sIIUSY+@+vdtF)%+UmROG+kwF<&dG(^q z6tn9RtCc{-TP(oI*7^+~{T!x(LW`VqLEP6@3rR1hg@mADNv@u&g`|%|A&vy#Vfd-k zI6aPv6GA@h+!P90nUI*B@|2}ZC1$V%5J!4F7xI-Zm6$*w^yUzlvAKD7J7>Jj1H+EDY zF>OTs@@}eY^-fJ&2*w_|A8YcNLh8wzR@cJVNM9z|PRq+kqRwW@*pGv4tptHZ&R)0X z^lG`baL8S^frVI|y#7od#1mbDnuU;F0?gz=G?DK|k(k~Jyh;PhoLV0eMUt(Qghj3J zk)&Hmj9WM>8jy@?5Am@)?#P01>6JI6;zG=cMJfU!3QAm4v}B7}^^T23*U)bDd=6rU z)Ge&%qiKe(g7JFYX(VhIX(XkLJVAUps1O1f>6VKz`U`_0CoiUgY^RueQ_7A7_7z?# zq&k$f5=1gx845wQ8Ez;wewi}yK-j^=^%I+;x6~xH;N&IMliZ9umn*nP;7Bipj<@s=CZT06%eSE={ z7*7FjAnapVMm_;%8IP)#@yB_(2mw~>jYQP+TJU)E^=+kJln~D?!Q0~5)TTm`n_*j< z9`Z>U6Ak)e4j|>Xj8(sI`xK}%K(WA0*T(9{%EHCrzTC-Ktdexe2l zmZ_Fuax9Y6(|2ITA(mx3K7EDAM=x*Q2DeV<4t-YvLB$)=U5 zS#cuF=YB|4z1&qrxzNa;P&(O>s%lrz9r>@*cZ9l=9a&a5PF#ZXN!`f>!}cVN56B@6 zW0^=-ho6U0U)N3z+mk{yxmUO9<(@60T^q{qEUL&sh^NpS()vLR-;1Oc<~wr=LUmIE zhII?g76L(NN(tjI6y9s4MVs_*Xeu$s+~^HaZ%ajFrOG7QVHK_=ahOI!QD$#m*%{kBa%|Tr(uD&<##OXH*KyaPf-OEiQtg4QOAD16$7azQ|;w;H8C{R?s@# z@Rjg=3Wf}#EV&K)Ldn>-ax8?IZp(2^EXe<&kmQc!4czZwox5a14`V}=*$VMQkK>## z^ld1_>C16gpb+^@KP`k=8m@(S>WK9Ow@H}4T5zISupbl?HtaZnzx#Am+QMfx{^9Ii zR^w_IyM;TSM4MX@K)6Zsc7@rq5koP&fXzZ*_Vmfi15h>H=eb!DOtjH#w1`e$4zVyd z4Us{hE;Jd-jKsr5V9f$4e{C0VLdor_x%8coiG}f}j zoTxBKl@A05g;-odL0cpCSO`|}S;%w3)hM^z)m{_-N6u@7BPUAOHn^`VNN1L6l^IK*p!~pUJNst zk%LcYP2ev9vO{&BPx896Lm{ApXcj`JVo^I7VQ1s=U+62_wf+SHghZuKM3H4{m%Ajq zniE_lZJj8OBzWJJYMOF&>L-0nb{69?DK=}zLlH^ax-m=h04HmKekGp=b!LM?xG3qL z@s7)kd07{AG-JpH2gWu67NT3)mk?8Jz*BPwGzV($KXpc>=-O8H(B`DPArD zVH_WI-(TuXoV|QDnucw7Ql+TdiGB)I1D!mFb&DG&T4phw*%& z83d-1_CV#iBya342#KT8)Zp`ih&Vt*;g}Mm2mG}oxQh7OiRheh5RCxnBM%OFLG+zf z;e_o47YR{>t&1cGgcDX5NTqo{he?Nr3o~_@SJ33>Zs#r} z|NVv{_S1+tkA&6>)lEzjiHjecJY-0OgX&okH()=LI4if@Olfhu0GK2UAizBJM)mbi z6-2XSOFZA`hAu&7KZGkLHjH>6H_6N}T{yjb;v2*4T?*JS=ut19_{?bDU=N7B6}4@m z5TsrnSRi+mB+O74+(dZhrGh$yy&`MjGwv%FBcVIcX3AiW7o}#qRm+vOF?rgAQ#cW}PEtTG4 zrnPvzh@E^(UZzr6*k%f?$ahS^VLF&Ypv|PQP~L%=Le>6Haehq;K`TXa1`VpzLdjR# zEywU!sQ5%^so13DPPta-=Y+$KiwJy1TWKWMl|mc<)0T+7!e6cC>1&0iEx{$;;cqK7 zMbUhr^7c6C9%}L`2W%qd{HtZgOg(sX&5w|q+B8T>8 zvus+&45xE2-QzP*9F)_7e1(oMY_56&A8gW}aeJ9H%*>`1agz_I#^8z*lqqm;3v2?0(Qb`fvq9GuWxa~UO zCB%fTNPB9#l2EV6sJq1kPkL}Go}8FXmq{vV*=|u^QYwv5fM94)j9@5!lbRQ3NT7Vx zM|>=unwL^M&MSRPMdGP>SqncdEcd48H_3V7p(NRh?P?_aJ-(ON=PYxe#CqdKeM!&D zf?FcbHT!fZf18>Z(ope7eRr{RYGRZmRi2y}lF5>2 zNR^mKJUua-&Xt2>7;)S8M&Oe?`;|;Fly~n%G69*{hbgn*FyE*}Bw6SW_?!~O$hfwF zgi4gjbTO_CQw&m-GK20wJ#eXF>9*u%<500DiW`?^M>K7TZdJf)tSV-*ElGB0ia|Jn z5xvc4^Eajn(H2+&&!wAciv)&=wuobNFC%#+q>H5{q#-;z6R(226$C5vS70{04nUoi{q9BQo{hw^Vc0Io1`x?6v|Wr6$`PYL=4rhN6?Y57i6g;1 z-M#Gao=ZI%F_Hmi=0zvRt0|B=NJuQSCfJA!CW#XEBq_;5B(ybKIqu^I5+7F*uA@1x z^+_Mg+p|OxDFL0MM56k{VS-r|z7|sLh}FhdKUG7_!WPD{hR2YG#rOjKb1w0sK}%qA zc$`e?@5K|}mIULH1q$wmu{*tZ;`0hH9GozV3~`OFRpo1DL4u2s+lL@Bq$gHwML5r( z=GFfTXk`+Wr8f8F!}r7LasPd`ScNVEC^c$ob^5L*v6*5x>>5T-#+|T->Z?hY5lw$n zkfCrAv86ri-}008MyYXp2H^lVh;f6K$qY=>|6zg2QA3 z9&pvlj+rUsCuAsuk6H3zkf2zWwJDUIKU5US;EaAPiyLIl{r)T=@;xdto&#tmcB>q0 znSuyLK#E0|tUq*W zox!5DEGfG0mA z&H!<5mUJ1YmVdyH{k%7*bG+k3w2}o+?Xi>FueVgpl;e%R0$oUetGrVCYsq_R<9NX%mSgeFcfWedymTBm&? ze`UlK38(R4I-;XQ5!*`l39xHf*9sogo{Psb-tQa^B$I$D<5(PEA4U!c|_^ z&H+7rJNP5WnK1WHFOQQ{S)zeaDAb>^)-6EBPv@#ike|05ZTRT8?gk=-toGg)eaFNKpt%#&iP>5|K@#f;< zfD4i27!HpmtWEuB?6?K1S{C4J9X9HDI$kR+-0Wyc+pR1L+|~~AoP;`KJzrOXdg*b? zlWt7#hMHMoR1>&V$c;yMxhxGf%(Od$S-|cZ%%PCEb&Fcn;PNtQ%X~B*E;v#0t%ih@ zmuU+|R;&}C88P0_ovCDhdB^EkLETq5JmnhtH|d365vBpQ0tlN9x}D^D@P4{*EAV39 z0XTqhhBDroG|r7_0_vg-;0%tsQJgbnC?S3yQwTpNCZu(t{qk){VD^XuP8MTBKyE`E zmMZ9+15AMig7-n)rXf^3AReTcm>k;EXme8lE?L-8NMS3N4lBg_R#Ju^Ip9gX7$~X^3t&`*k%7Z-0r7Fa3Ld>i( zMR-BDTTR1MNLby1Z0X}jgyYo+qM(%6i3@eI1z+fct(DUXECJ6PS^AN%tr{p5=schS z6U&DC_|OiUj&7X#T`uZsLSf>VvC5B$DIr;G z2ZfPyR)$q4`@Lx-MbLzSrms8Q?`8#eBuSCtVcw+r4VUMd5CU0`K~GW+A-)a-9vNxT zjC8W!WR+P$8X=cwSa+)5OkpM)Uwtrv`0ZEw>A_+1^oL8xbOpzKd}w2&+`%0TSAN_R z=uZ;TrSLDIzZmI@mB#qIkYq&5iNVmV!CUeHBq|5vumbBN8#^3jdJ4f_!jms&VJvMc zCqAB7;*y9hE1u~3j$CxyeVL{%3u>Qvg#szt6tEX>`e=~N@$#y!H8W1UFD=PqFn`b$ zj@m(TxRw%^5`_Rp!j?K$#(ph~n;Qa@dWGe+KEm+$hv^P#84x;V-Kk7o>{?$0VN9kw zxFcO>T*X6)R8Jb>-^t63{4m@DNFriyWi4kfFOR~5AYp2zYGEy2!>g!Dh8J=#rFdgw-dcc+Tq|jemz?c!{Ryh^ z99Ow~(Mfcov+|@N?2@)ACt#wLZvp20nk=Wx3LZPpC(S`d|U?zzVTvkjYG+ zNauq@79O5XXV0){HFM@W1FKRx?j(KiTrGfEY9Z{@jtqevIF-J#j0MrxY`8*vmO}Ke z%kld&OgMkO3XQt?T3lw8Y(cfF(#}-gN@Fu2#{x(lITy;yv{R;Lh*Fvzu{NrsP9?8( zpBFhHvAeZi+twOKHKrZz60*dQ3qigGtEhi9AD$8qJf6)PQhKJ+wl#EhiwTh z6y-M(o;=DEJt9ve#BA#43Ch{$AdR5=lS|w5{-(Ir#umT;p*DFT`;j(eD_$KrPi`o6 zFfXR$6N6{(Y}POlYvhY*;N!G&!}}1+AVe2jkc#>@g%YFZ#hPLH00EckRxkx)D?AaG z>vqY9p-}lGPH3JxgmyWXB9v(Q$@XOUuGEc>OWBbGLe7H~Xdypal zk_pWbV%p$#NEgE#j_)4wa=8e5>gUVvW(Y(FRe789d>Q1r{j1p6V^Q=0tp228K+rz9 zrweKP!o1Uo@5C+LdkWmi4QX7O8h}L8Eom-yeFoJl5nYhSY__{~uJ(m7e0;8E;$492 zZovA}eKm{!vj3V`GTgn(5)2O!iK;PO5hao7ic}6wZwMVlhm$d(U6GZ8r01PW4#q*9 zC}p)8oD*G!+5{W5>sELCCwu85voPCm=MHTG*`+t21_e1$*ysn;u4B8 zPFuXzd7rOHHcs4xT602STeT)C#^tLs-JKr){C;|#^?h^e<_lJsbbczDKVlj-9U=Kw zzG@)l^j4^!r{9U6b_2NYdP?&Oe7VN} z8V{AsF)a%Y0t#w`VLvIvSFG3g1Z%y(Lv+T?*SJb{JPbhO2vGoPENwr!7#rYAcG++u zaeII9C?szK%)jy-W9d}o)AyR}mUHHP4>cWZqgUxs34tMVpUksrcYsRprkYR3e+g1fPB3z^r{ zp3mloYgz!`Ng!*@!BsCt9D~e$u8(1t0c5TK>j#!U==;U! z_K(ZqJ!$Z0k^n>&s5mbb1M43brZZd_3&mThuB>nJ#r}LgCU^nSBDzw-=jDJ>`d3v7 z)Q{qyQr4&k?*XCkIaSNmH%y`0@DwE6)3Hg+Do+FIRq@)j!GvK}2C5#Em^Bus1NH|qB ztZZA795qVCk)02Ij&a;xj>7+7W)PY&;SYwEkm_YW`w~VFOgo930B6W39jKtM+{og> z+h)Kad`_C@IYAUrz8x9n<#sG30aDV2S(4Qgd*@C`-@EhibUwbqAU;ab7P({YjJ9Ll{zXKpqQaZWtvKTZji6XenYGLnBgRX8-~%J07a~ zu=X9D?*Rnq?Hcd8+Ok9GL@zkju|MaK{*060>rV6pl1Z-O4G4r$S~4J-2}7aT63`3v zAA)R-|9U(0cGjdaz=9;f^DfuK*r9w{d#G6x1++-A%=G0jypLCh!^7A8y|sQ|2hBnL zIp$Yc!|t>YoTTYL(}MTU?bT6q=9wpsG2F(TA~;6rw0Te_Qt0k96hVzu-oRyM z2$oma0Jps88HXN{bDAd(cr?`7C?i??VmdDutb*U2ssVs#A)E zX-<->3gv<{>M|2@rqHMsi_0X>PIUo%a*qqdi|A69Y|V&#B^h2FA=T!)?e zsIquft`U+#lk0qv7DFo!%DMe8E;^_!@-@&cJy8S65B8CaPR1LyhHq?`Ki?g4|Cotk zaV%l@*eMz{sQP27>Z*ZrX03E6k#MSN!ojdFD%U|EeUqwsQNdc+Ov6Fc_gs)h8i{iQiZ<9k<nfls$ zj#`%}Z^AumI>k`Pr72W{bjk%Z_;hpEO0i$a_|UBs48S#WwP$Qa2q&;T%98@n{ds?{ z)TXEBlrBg*3z$$=0G5yz+rXbsUr&$r$bqA2iMm_p21jn%1uKp7pHyoQ1-n{b%jchN zZhT0M-2p(QxuNkPcr*D>LRnC)JS}jvgPZq9;2`fE54Hrf2sP0X_!4xaulmX)KZB;o zob4AuBhZI|50Kg9s0~WZ^o^E4iR0yT_Li{BZ2vga$;6zKddjur*TrnlPz~33%gKro z$j|giu8d8wDf+||zV<7J90ux{0MEViBFl+qD06{Gb0xc(F)e0p1?3ugqgO z>2ZC$mk}!=_8CPjVyYtqFIzHDS@ym{d%1NukLsG(a@Bv_x3(@Y-fjSeXjL|Yugki; z&{he)U*+mu^HK@3C#Hl98!rUxV`VAC7pa^;BS4HdnUT~p7&m?ivTm!6Y~SpgZ5P1P zsxFA}lQI00SLHz>4dc1RFN{e9K&qM?-C_67g9O;jUC6i}VH3y1Eh}YOz#9F@sR&Q~ zl4KvTsNGk@(?S_jasnZn-T(I+PUGF-&jSf8UJrk$)zS35CVK!rg`F;p&sc|f6unml zXkrIZd7)qfmqYwBPHmUG*R(*O6d2}?bOZFtTQvVn;Guv#@O*{oKqf`aK))Q$Psisy zAz|y!1Y{NeZ>R>-4HySVW-cGw@!PmOAt`AdQ>3wjR&Q`RKVhI7UQ~lZ@$DzhnE&Vh z{GYr0)7`&Os9NTrVl>Exlg$}3`$yGK=r}DzcVNTDA+FB$nG)YNT{xIlz{>Ewss2A# zh-Si4U=3E#(K`6rOsQjB2op2eGXyE4A0#;qGNQ042_J;}d8>+*A`~QiY<$&W=?e=~ zLbb+$s5(_ppodPFB5MfF2sKf|$n<4d0ev*Wvg-}l$srhO0)J#ePP6cKLAD2vP@Z3y_Lt}yIU`rxRS-pq*)AIwb`M)q~08Zr0 zR^&qTQcbo4g8_-3paz!v)15Wf#te`MzPMGR?$LVx;??Jm7>9pZR^bR(CjmQyW;K=eVLlJC)dkWSHuTxh}rhkeYj? zC{Xw8za|b?YmJ+&P);cx0@q}D!U2yY!qRKhtK<3dIu>|HbY7xF*Ti3`W0a$@!8rR~ z34&l&L??JPQKWNHFp1gx`P(VchA+ zl5NzIE*@eYKEkw(nLhEjK_dWbFNXpP=*#`_0xg3;d=s_jpTL+AT;lCYUN|Y(ks*sX z6xmA}VecJbyUpit*FmB#3@l_@MY15r)c5*uxrn!E|M)2O&rn>b!eF_B#wHd&J-?n$ zkD)Y%97*KKwvMEonjQv%M!SkNj! za8f!Fg`hxip%R)CBnwmq{?-#p|KYTKdFmV=59eQgu;U*t=KE$OU~GxH?+MnQePGbH zpJ6YMD=K2W`jjNS+%b}a!jedZMIYkTi=h?=^`U@}3zs*a>`p=2J*$uO5(r_c;-J8u zs3)@rXdk|VJMs^*P+C%Eui+AwCzd;~rbR;8;#0BBFh%IT618Gp6t-vrFZiCaLYl)B zNldkbSQ6MPJ&-}oSBe2PZ&CE*77=gQ{~Vm`rCxr?!miSOP6{F3ddNEcw>w=vK3GW{ zs|}{&odzmQB!5~_Au}eQiy~4-$!}H=&QBsDC0;pb{adrss4Al0MfPer*1jthDGhTNq*FMjb`dbBZa5oT1_HFNsPC zF(zFG#P72CRKde4_<+0l1kT9CG&jHg79JNndDVcGQ<@VLvA~MC2^&#Cgcew-6fh^E)4+|H>LrONdfQr=@d2Hj z52xYr`z?l#!k|u~Zs1Q$Q6zheWU;Tx5rLIO6y^csikC)^rSEfp;^|B6PdrlYG0e_O@#|jxOFO#11fRDIGtPVWo zJYZzk4v-61`&=1_9Jifh=oO8$-v91$Y5E?WU_o%$65CWk2rB4$*>+K}nKBq;fY)Le z6%9>_gcCMxYy2LP;RS&FTGcgEXr?8sI6}w+)IgM5kB#%1m>ZeE6XGFZ&Cj7t-RjDm zEA%riCDwUZuz&*7)Vpl}rrlydcBn`rZ7K(A0}7bDF#05YJb-@KE5a`B1&&_=FhNzx zLr7mB!xoRXEx@=MKojl+wa0=3k*FSYAUz2Gsi`|`^*LcW1iQ(}DNhvv#}UvYMvGV$ z@)@#2d+O_n+?T_50n=S#c_70j-uprocduVhidk_|%ApfZeC-oyQ#;x7;3Fr?fUE?M zn3UWoMo`}KMI#_l1f9Nnz21^clu+@>j5u-4sA=lOAG63oSII>tnz66+l07_}dHTh} zgDqf<0|YcdBp(a5JWeYz+9{B2TCwZKO!bn}5RwM?o1*H|ohMl}kuYS8@sC8``3=hW z;T-o!p;52~^qHcl^1I70Y9$MzwV{iUlc2mz<~foiIeiBZI zNM*7h?PNHYYxC=PtPl>oBflS!%M{XT^Zkq9)1unhESSFmF{oL7PG<;J1_-svx@$A_ zsHIhgumIuZ8~n?T%p4`*MIwhfLd}jBRFlPVAFmR|yn@JxQOmg?uFb>wClMq+4=!?J z*!x`X!&K z36>4Oi8X*=FZb*3std$&Icdk%JIFHS_D9F~^>;3@dpQWKhHufMMj z3@erti~&}9veQi@2k3k(%`H?dNj9tNMG*PF{yry5ct8u4DHLc_y!^RGA$W zbqIB(H#;HYz((T&H&-Ua0U0rWAO_ql*fK{`h8Rc=|MgaB%9%OJutmhcrq*`TFMJCf zoF~g(n?wFek3a~)9Li}YbLeUxq-|f|GlScq(8uI^{ScHmv?NPq0=eD^j2Ww{<3TAF zqN!-A2beqvuvEK?^jC88T$B{;o0&Q+s+%1Ao#KtgAXfDF!yk5&z}T=_gJ#l?!*ZVz zNyUo^Lmf%icm?aSKL~M|E>ZI}*hg?G0%4HDaCLk>UVfz3GWI-DdhZJVk)M;5f%e(Z zs&H#6xlm>J`i|EyA&t*g0sRE7)k4%A)~7Atl2V-ZUMgCGt&vIb4!LxUa#u zkyKKhMz~g0i|T^`)xQ$Y9MPBHVEKr0xiJW@%j#2cSa}cTQvwZuCbnBN*NWK{Ab0c% zT4#+UN;Y+C4ojH0;Jj^#lBb6=WlaA752J5&jvpyq$UJ9>NzY(TB44$Gxe zs)`v=3Py7c=QE)oxPDbLo-St($DVAS;aQPSWzgURRzrtZkT1hz!{qUVj zusRZ`5_OEevjF*{8jkkjo~X{5=R@;phYtm21nJNy9I`3KEmVM&@vuVa9Take9=$Ch zy!FAA;PV$wr)d$B*eY&`fNTu=o*iQ7-a9G=YACUPa7~RF$z%p5F)Hr36710UX^4wM zh1rs1eA+`cQG|uJT?9t5<7|_!GjuU37cXg4GT5+Wb;?09Q%aHaQ>~0MYKJuhwv}sz z;ggh;`xsCpS$wW}6_aJ&OgjLvi2f~B(?mXD*Knl7og*hVyAxtH(Kr(g zNunoH2w27f)~r^;H`0ZYO_A}Icui&T_N5fcHk{Il$s?{Bujn+V@DA7Sc-m6Wn zJb5!s*$ISA8CI=ot*NRuN1iMc-~W%v{^PpEHv(PhuLr)G9O+g%)%g-?1%m#qe7f_X zJ;+{LCF)Q1UMS6Z&k`{~16LM3p=G!e0XfQkn#h?RW2NE2$Ma)aVXCY6{e)BjR)9&3 zGkt7@e-I;=>FSmJ0QeTFR9sbHdyq`GUmTrnG7GPOp< zl!~5TDs|^X&QwSrml^3-6a>)=ru#^8Cj40%WIPp&tK{+r`bXG?tY3Ze-28}+b|?{d zz(hz7JBrw9xHmg^$cJifZ8a^>wQ8$Qe{JdZM_i4-{<-d5Y+8>+j4J{n2s0s1Sh_RF z#5F;6ROYBCF0N1&KwiZf!1f`o5RHB(+@_kwBN9#2i_Me=mdDm3$Ae{ED$!|h>8IQtZ)eqs%+n5 z`?1Iz3(rNx3z~Wz!qD`Thq$CEgduq%W9F3MESAs;rubpZq(VJ|fs-sBQe}t`wSz~a zhb@+@2O``L#V!E!BRNShVFY4vM*+Trh3Q}#oQT=a4zzp6V}R(4K+M)g3bhRK@~N1a zLEu;5v>;v7+r1w`YNQ;+Sq91Mq*42UIW}w9a{=%MVsYOZ0?aA^o=TtZ-oj>_ydBx9 z#4O6B^)j|1=(HemRBA>iWQGV{ZC3#XRHsERV=IEODceF_J+x*<$6H|oonWgl1Xqz= zwm6~--fIiOVTPKV?bEIcNcym8FP)<5D(pq${z>>eF!lA$@EDtkW2=+pgXnof)topM zFfYRYzby1|Iqia(Mye(4MM2`uaf)1T?P{U7lFSrqRy+x2QmGBl!kYALvSg+`NX#uZ zR(J`pEQ>}kmA!nh2NP}$ESzMbkmE5BPRs)YeAwxEG0ABY2q#7dUURVlmv27tCDCWd z3@Tzy$j3a??BZ0+(F30h4;<(x$I*F7vl<{@fTel^pW;xd`xc&?Ho9YldTv903vz!T z&+|!vDu8Dsu6_UN>?!tfj3U1V&P)^trTjHdpy~Pe$45!E88-qJAJkv9oa!UJI1K$( z9K|_<*(5-^Wbt)`PV@HPrDAtA<=N(K*XGqPdx0gVJ-+~-zjZyk0EQp=A;7N*G zqOY6KtJCj?tF?1rlTJkD))tBz;N8gWPJTaG(r%4P-LcOG`+rSPYp2=1H6+~1V6fZ> z^n0T`mmD@yk!s`=Ff)sE2euMtwG1tiHeX%tHh6(@y-7#VB9mVlFY}fVs&${eQKrMm+AfgDWL2QO_5c>YQNfL! z-p=<2J4Ctd7b}*#+$MUxy__KD)EyE}Uxj17+jY=}iR?xC5syn4X<87^3e-SEXiCfH zenZF7l4o+g!GtBdXOJGZXe^KaSCYD{^!j$UQgzxt$h~Jpd5-d}S8~%&MQ@BKC_>>b zfb=yG)o{y~)8%l(U1qDVNb9+2H0zM7Ufyu&o|H?t8kRb1Q&C$h9zR&wVGxlEV-&sG z6RZ>v-f`(k8Mmz;i9tOWa#hL8QUI}5c%>6e?tk)-fka*wjyYD(pw!+MqG=R=E`_1p zp9cqOk?^8;!Z=ijf&hgfdqY~EJ12M>GFN1#>c@jIAu$?s2_T3~t!jYSM8jnbgGJkqOeN#JL%X>4bC?O$+)RfZ zulPIN=1388UiX@pZV$(gS&|&_B+P3Z4m%W$l>puu3z*7^Qh9j;S>sdUvBl-gV@pl1 z(;nE<2Zar$Fi`Yzm`Jsr@=xJOj)o^*7d&Ii8qkYoW1JL8tRZ*}AR+^Rts02deoh{( zy!dJsrfg@e@$G95LX2A%MFNj5wN7Od%N-97d2@0FA4;9>{Ee$)TJdgGj;USGzU=Yz z{9Ot}qTIt331V5rs2xKRi+uCaZ3#o0@m8ewyS z4-U_ao(*7^0dp&uqIlZ_yLx<#M+8a^92t73-iVU|N>LF@6Ya3%Ho!M4^K=$Si{M#7 zMeWb1Ox$B}33%T+PI%1ui4w6e^RWQ|M+`Q?9DiSrq-@kvC6+8Od+qpQ8W`J4wr{T- zK(Q#a!sP60GvzYsMTd1`ZX}j3^!5u_T_=4Q#m$U^jE5E&twNTLsopG09MIs_I7DRy zS@A^mc}5l{vI`>*Zf-vmO3jO&(AYs*eJHc=`W94peiW1|PzE+Qa%pC^oVh&d72f3% zo_RSwCgt3x2pSxYDhh!XX9`q(pD!e>jfKQ$2PkRR1J~_b46RKI?Z7eOm68QTOMj&h zJAuexqGa{i*-s$w^Y6SbJPECNk|0Yq@tC^{HQA;tHfSKeCR59gFDUlnH- z^qV_xcANyg4fEy;j-4WsZMy-YsYF=i#r28vM5%J)oh(Vr2s9w}jS-ZWNdxmG8azQ< z1ES_iV3KQ~nT9dNcoM#2=T79Yz+C@}4s+aJv4SCXFI-~28_DzKZ zSOBfSi0ceePcLTzX%0eetho4_BJQzZ!b#wYi-ellK4XEA0Xr^(>9oW0xGUUY{US-& z=B0V5LXUt7E2hxNj-il5l_(8%)B^TOt_}kHWLwYo9Tsdn-zen{Bz&b0u>aTVjQDQv zG?RwYcu#29mjpTTq?H-$+x|FBG}Qx)n_)vy2DcZt^eok;I4xznIBjXSA_31rP1v)AqNdPn*E@+o zQ(6v3<_-^;u=&Q4)hDPFaZBklUrqdjBHZ%;$3=(+hH!Gdb2K!^DdBM}iXWW3^RP_H zx|T>=cLvS9EFr^bmqf?}!b!zhGFE4hQz%ITeuH;Ajc=THE)-z0ptudMO$ryl%&|Mi9 z@-3QDWP27?-<2ldlMi8r6n{Ek3HX&ZF1x)ml$$b%X2{kJ=ck%$HDW04VBCyGB{9+N zvGDwU6NJK);u2KiFG7glYXA_qO!8LoAl?4$GSafmE$|w?VJH|HRWZ1e-k#nqBYC_Q zu*>OT{44t8KTx-f0?eZubWH7Te3fExeR(^7Bg2BxFTn-0*?K|r3@cWJOIT*(`Gc>6 zCk&LmgV4oS7)xUN$3|DeY}$(wW#eVdha^HHCsB*OceU-$@UUD6&3DS}OcS`Ab{HcH z1sMm$^vyO?3h(QZg~{ag9rJ?O{e2<;6+7lu-3PJ(v=L?eni~nB4CsAuK+2`<#m{~) zGaZ5h86X+C3uPPYE8aWG&*%N0pCKYNZ(~jua?XJbl4bm!Fxo+}ki@ZG8J&9JtHgsE zH%U{imq4K89mI+W3Z(Q=fzs1L$I=-4m-R!>A)S# zNYHHC+GnPnkiNRf6-ypepF&#FcMO6{7g=MZQ+>}c1FzNf5Q?Y!zU6^TLLNO34(C@~ z1a9>Lu1|bbD8(tTSf~#zsD7oekN70yz=7DZB!Mt9?=%u0jh@`xJP%e|;bW46Q~kT? zYBBwP7eB+^knS*u~9t4>> zHAg>El9Q^NCZgQrAFL zt6mdPrhI`|4nrMr(TmJwF4X|hzG^EMOs(KS2)=~|!YzpBxhhGN zE_q3E#T&D5yxd@qu<@1Ld&E+cYE?d6qJ**hfO91$O~qFflj~RlJALA*fw_k~$R!xe zK-efgQtL)IcrsPkag*_6*tvmyoYm% zSRJ|cWBChYVezaGZ3M1h#bQax+wTGuHJMn!-^+>j`S9Ow818#}lW)&x!H^(I+H04R zcCrfNzJOUR);!7#sPcmeEEae=uRgDZPtH8Dlh|sp@=M63YPwTdGu;By?y~toxZUDlLPcy|QVnrWR)8gCygV-6g+Jx-VHTJ9+7iAj2VL{XM$ny zBXFIvs}cGT$TQ%-oGoJ)B^E@&gEqie=Grl;AU2y4#2dTMnL>lUS!sMxThedquAU4c z8ZdVj;n;%lIhtoPeyt*?Ba7b~{N)?^P^RT+vTH9C^% zSOn}30hxeJdx~pKYh<6^FcA=NyW%}dRprGqR-4)+!Qi?B_#$)b3EOqJ=A_4*z_W%N z6mm%P)b4YvMdXZaINBza`dLX-o0Dn|4-U0Tj!ofKOm~2Trz8>FR&DdW=*(oxmt27f z>_5M&w-+{@KwYg0sIxn_Se*11mxw4{!mM=A$;(##@YZvwk(fUjNc-#OVPU}@4cRj+ zY8po{Q|O|MQT0%WFD+?aOHK&pCVPDOu@_L|f90*oJ+fKvNY|&YUca)6Ghm>zC*`t5 zcH)wTf?DBrZf(3%0_PC+p$s4(o#Cho#N7kiHiIRM8+^4~d1Fyf=wjt7q9H2$>LN~p zHkxsVa{q9)B_xy&Et{a4s7RuAu5pum7Kc34PUb2**^%a?3JqUzWN5~LwE`OJ@cGj+hu8Zb9#3Gp$L7wVFW?y` zSF(7FkB``>teix>KI)8dZ+QX_en8aN=7hi}Xf9t%NX z*epPf(zB6iG8FnxFs1NnD+0_#{fEC}NdlXk<*KZXH)$yJwyXIV=u^QUS9i{t+$zeE8?_ z;q^yY2ce`*o^|f}6SJGMK!!pPKrUfrbP!Sm4(H=O8c+k6fO+Es)7Bso_J?Gg1yndB zQW6>BQc`URs)N@j4hEUwkbxlVRR!Nr&J!H+x8Ayc6H5HO$+}gYtL42tzy3Id-}3KZ z5?I|Kj-mG)SB_$CD z=`cYlQ1P|C0^V4YViW8kg3I&ybasl}XYi3xHZ(Fd5{#NxJxG}w`S2`(*a=y|grNE^ zRjq@R`t3!O{KG>+6pgEEafz!VlB`NmvZq7|$YQq;khYq6lW&2tp%lI#H4@Si+9cMKz`h~B)^+jrQwLcb1d6h9xUbT6qLhG8Cp=!ZnJnjd zLAc1scBn5wcghHtpzS5xn5E8BMgXh|JjK0j$ST6V7uhv;C8s7K07cCcyJFb^ zN@WXi%@J0CAwgEO-aPK{gu*PjIpOBFWpFTU#aODbElfR{=K1CDJp1{4&+*^{L!-Veydlf$=D>M+SRI+Lz>y8=1M)+*$wZ*Jw z65gT43mMiGSqQnfHga;DP<3{J&(b9mrNh64hX))4;=^z>Q4V)Ek(YUn3ZNB$BdJ}U zc|n~K&MggCNs09Z9I*D8t)H*g%kXeH?667EW(j=1cy9myB%52b@RhW@x$@Tn-;l;Dj;v1 zv9hYz{R(tW%p#m5M5nR>{Y7*|lt8GmY8H+1t?=DtFC%W-7Czv*!#u6M9Eg#L_U&&& zTV{u~gT&D;Ck&69?~;;2Z&=lpzu6M#-QBjyIRRvZw!}|cgixj$>?|1$l0}ZT1m6Tl zH33_)er+SiL?aU3Ag(YaP!EbE27xJ>NC=X=h#@W%PF9USd&Z0bNd(RG~t75Pbl zzZ>C1)%aIHVL<2a-Z^gm`_Gl=IBsYVuROn}wGZ;i2FNhB#poysZ{PR6K%)Dc2cU28 z$xLTvkWVzQ1--a~R!<#ea^+2z#J6Mt2=2(7q6AcNfz+4fiYhn2JoR}sDbV*S)d&W; zmgJ9xu7*UJR6AmMh3n99E-;Lz!~Z>LV#H?^KQzii|+&jnDKV1Q}-w9kC?PF9`@nzt=$DJYjj+euah2$KCM8N1Myoj<537|Ahj!4Qo z=OM8>aiapgUy{j*cd=wUxK1$JwV;o-=6)sGw zj-?aFBF_={vQc|gsSayToYMkA&EO_boOx7zYD2PRfS4~FX6TpwclVZX=6Bn7u9<4V zC))Z0;#aip)46>)ob}V#0_b|A1S&v+GTL{gu|M&oK_8H@f`Ig%W5K%*D9BVBbp_!w z2N9*zUF%>OQp`%@4IrU2hnAd)?iigmV+)YDjHfBon9hXod|g^oyP%6}pj3I82-}(^ zw+q~QnIh^4CvwJ+@-1hVzP)q7BFgm3wiy-L*$X7E303U!J*UTp&J>cK4TW$R z5H5s4*fHiy@~YvjJ2n&d4}eO z4&BSC^OXW&=Sy&s+mi?FIUy-d$k_x2yb43J#3T^?6&Cy1Cq0?csth@xV|ZS^3( zppzjrfm~I3THbtfm&1)+oV+jLgC}eBa4(F)wrcYItXq<|s2f772EQm#Dvx6+GhEIu z(l&6U$O4@yWSbIj4bc+Bmky=gzPe$2w8Pk-+^)$-s@Jn?W0X!+&JhPStdd`Z;)yvT zW{iyXTXJieu7IU8<6RQ~Kys>$LP+189biH5zO*ihN-S+EXOo~9L7t*oYrGhaI+XrX z3^xeISip|3|EcNhuNLA4CBqh8IB^%H3-up=YzaOmK^u`u<9|_TBTO@#+4|0yX~}=h zu_e)m;VE;;+5T!Fv|`ZUpdu4z4e42?D|y-y@k78l6+&fNN*96+tRfl>k6voi9=W^J z9{%wgUu;aL25x1uUYT$B zryyn&a?ihBh@p@Y8>5dVYVEsr>+kDZGhYk^uM`o-OI_w+K@uAL5tbGk3A+$?U$R&=>E|=5&5v;+3uOKdk!i}DSTZbe>S4wGsz_2pq z`2@lM@5oXL^**V0n!+YXD9UohGLTaG6x2bjyMKW4j)udl1RpK0+1==(_bOiF(Y<(fE`w~}<|D^z8yyoFJk$e7jiUq;Tlwc<_(#?yYkQ$lxbKkGA7h-VF z$<;)-@-U~)jw7TAr|0bRBK&l0CU|+*EuPU~KCc$oed;puTVMs10z|Fx3iEVMGfiN> zMa^s)EF6^hg4g+K0}urhi(GeLXNDp4OUOlwm_d;Bvt2+C0sM_3eBJ?(Ko)EX|1>2C zzQ@M^-c>%`{M-BvAzdgOtYCj4i#L2iybBf-)XUXcwzmf-+m?vama5-;-KB< z6HQytLPuK&lMnROr2Et95j!BKsygIN{eq(rh_zb+e$2DdyitkMC%(8pOZ%zRo|wu3 zDbyH)x#wlX(hsoNJZvYXvE^^Sgj*36y@os)jEag9?=d6I(be*XlRU4~Z}*rfuq2%t z4;q-4q(HF8j4Y%m9lRwOp$^D~d&~$!Dn)EDS*wQS>UM6CCqw~e79`fudZ&BLi1IEH zW_*CD(uH`B8F3f}pcn3d6v^P?EoQ_qBZH?Cnjpkeo8{ZjL>cJsz|nvtn<;d(g`j#P zx_FBz(iajHM17p(B{xlQiIL{MTewYjO;q&n9Z)m<`V62rem}nMUG&ai7`>D?q3S`Y z22==tVEIDf4izRJz2!-vs-;`RRNX|E>hxCvAau*5rYqWTe!vhy9I0pT)h1trbo z(y_5rqJ_L;lE?*bWUsUUH30`58{h4GvX0{p#p{L}`FGOqj+MxQfPi$4f%R9qNSc?}UjKimIl3h>w`GO*g=#GW*u1%#@^$P=ed z?jI-=y=vt;r1C}pFq5poI8?zEG%+m2%wsGjSvYX%OppE zX=q2#4fcvuGiD$#C1fNJ=)JP*hC&>QEomQ##?nIW*qxLx0}%pBEDa6rd#2YPz1Ipr+MIDS z`FqeGl#>EOpTg@?bQt2N3vxb5J8nDZtEEb92rQCotknKV;5Nj(G;3VEPtco7<-^yQ zFF-UCDEnoJ$Cd(mF$}_hIeC92CW;)0pfo`MP(-6zwTO~Epv0O2aAmd7d_gHE1&AZL zE{@j)!~AMTY&YT@u`2$L3xv9+YCc-F5|h7vNae+E`6D`Eark+> zHw0zqXuCBCPCP{_Dxb&2BqhS!JIpJ*_w>{%esf}JE;hnTc~!9^-EsIE4(aD~2Ov=) z&k11}`Z0^&20pp3{~yojDCSR&f980DUg^5aQO>JJ&jvw;9ya^uhetC=__h~ZthH0V zi{JjCr_jtWMV}_pmRyN%W@J|jByh0 zC24(iGFIoqj2zHFas)K(dYIv9D0uSAWBP$2e~SfEk1<)R~gg*w*oRD_PEcu)9{bCaM01@DNs}rW+7ywTvJu~9T z1rH~A;e?EaCb%TD`s8E*CDDvDhwhzxNnqeIYv-;jndN4HZyBE}4?`fJ5*L zVD?}4j}SH)S>R$&n&Rx&+0f1GB892k2tzfCbqFiNNf_}h6MkQf?vLxKKvUbC=E1k`KM5iA`G_XEwaMV@XvL1cT=o>yL%!G z5QXaL5yZ!5+? z8Oo!iZMoEQE@9~lW|lkmVejOEjHQXi<$+IFlIyuhOD`~9-+dEYe!5SrHF)V*#_OSt zd$5DAhrV#oB_4rT>rozHobJ06ir+n-?ue>Bor7|CrM4tEE-+Hgm3uj#z8#|pW^3Wz z+>ph*nk#lbeI)|+`7jAe1{})L0{c`Cg_r~vqjli}iAgl<9r|qvSPEA5p~SZ_3Bujw z^E$E{;|N?-8!R8=mwCc0dUx;asC=LOL)Zj+2?NhYGII74H@mDzgTVxopVloa`I0a0 z!-sXUR@X$UZu<2ka$;J%L%n(0zlOrlim3{*thSF!|g#Kj67|#M)~WzH7Rrv74z=9 z-1L(|n6U_o<;rZguFx-KF!01!!dx!P#`{6-9!SHp_xf|j{yV4((GW!>9y7V#3v`Z{w2Nx)5HN2qJ%PK;EcJa2Ha-vXP?Q}S=}ZVwCO zz_{_3z&57^nqTjV-|lb@AI_(jP?Bv8L&J&}rhm?+L~)x0Xx;q-Y^_)qQq4<4;m|5GC&h zN$gUP$DLpmAfgp&(ufZ>O zAA(A6fCg1qBlzhi{9(Ccd#+F=KHS}gzYq)FESB6RAMXA=`~@pP$5PvT`gr$m;V;nq zldzajA=3dex)x-)%|G45WypP30(39UhS?JQxQ!7p(ew~~X~m1hyZM6I9$5tt7T%5B_=D0Iz=Y=^h;tgT@H2HVo|OEhas z38UIz8oRywTQF2`>Ah_yYi;UlUgLuIyicYz(yh8rfpVme$~#ge6ZS&)gFK#ac>_Lr!pg>}acu6{uyC3_LpYT#n)ss;TuR*T@@ z!lMBlhwZm+fvkMeo7S-^+<~AF)O$D_7R_c=G^jXhw}kI>(lGrUMfDB`h8EYXO03!0 zr)Q!~@4g?N`J`fD4dn#d1bwmqwodo=Jac6!|M%PB{O29aW6x2oLb@f%NdbBgucfaf zV%qMWPS|&&WlPTCrsI+$miy)S{LG4dIy{}ue}>IdA&id1(jw(3!|%Q-N7&u}z5TcF zNM!i1SHl~{6WDdozvWMAcMt28e0&fZ;H3TJ><%+aL=0(oG?pEPvp6^ zLeXT1=`Du&g)F~Z5sOcL#q3{CPe-|+u#!^h^b&qLCL@E31`6)J0C6afr*L+8VwLz! z0jCYs9{!Lw-w`dsUB$AAp7@3%q?Q%D%b{wN)BwIOSWqN$?j42UN(tu$>hJ<4{f=c3 zN#lNhJ0#0UDv$;;3#L+c(480npmFnOR?q+mykQ=~Pf7iB_Hsy1pr-0t$eGi3_SDD! z(FOYdaEPA&l5-n)EeF7G_0}3~)FLV&G?Mc9QQ%4E8Vni2G154fMEtPz zKDT9jH*qFqvYvRA3@_I^d7<$Hzxfb8b^cbb;48*ZPF)!5!&?rLG|83&=EvU!{tE=X z;jDymj9hwXk<*j?E7;Lc5Hl^>TrDcrRB-M#r(%?Bz_CQL9Lce~=cIaY%51nfxiP_I zkv$uJFCFHYlTViJ`ShKK$_- zY71x;fJRw}90M~2ZsHb*G?MJ)o4Ep^-h?NTJSosX=Yza`1#&>Fc;8A+vezTt3wIa9 z4NLwT;BUytmJv#@hyLz#uFasp-(ZK#HyK+O9)Wm~(3=Ib)HE1m_HTbUy+f?Pa)t%f zKub$vfE}c{pY9)z^0pH2X#5l-LUhxRzZ5MFsTVQW=%){=!b*e11$H8m45&q_w+l}U z5z*>{EQ!buNC%gc;04=%qem9YW4NFQo5atBQ)lzZU*vAt1zq@e2x;Ir1Q7U*p@z3I z>Bj3VXD;>w_oP*0N!SRswdHCn6oeH*VxI0z+xDS`@gKBmSz%mrm*w5d+xh#!7_S=4 zb&EA&{uOt&*g+F&@PBMFY(6C>o%8pvcefuyP5(a^^3;I-QTEQ)KRLI8L38cUKuvC# zocn>)Fpv8)cbn09Z;4gF3`z`;y!*l`i0A~M!^@-|mhs1ea~fDWtMK_Hx>Y%RDu7g- z(DL=)%$axZ7VFR1-}x`BA1VNHO>Gyv@p^gD%=J5mlF&S@0cmcyuY1Ya^#iFTNHfeP z?I3Gk)EN1pJArG;Z!GEO-47JQuw4n5-qxgb9Bvf%L{BL~*i{K$$au~67sTvye)owK zTMZDPbuZeVZwFBh=6^0oi~`!f`Sj=g*ZZ?s47V8g(RqlQ5DR=b24;D;XYlT-?A3Y+zlL{}_b=84>b=r~ z1?2L)3U|!6PTuA2^euIfuAt^c4U!S8wX*VKeecV3V&uq3VMDK;!hwC!8W| zR$Y#1n74_0BYuNxF0CGMG!lFM|F?H8J(4A9nLatyqv=N7n(h^>z(FObf~h1TEcYH6i# zn$FQfkgSXY@;I`rFoTZC3Jgn1Ry5WD(ryx{in7$TCvnuJhba+52M4i#4p*Hi;&ted ztd%aVpDOOoUK`UmrfyRT8yv}s-SB2Uj%;XhX>JO?KiRFixVuy{>8hftBH=IuZUaYc zovsDjV}$HZFF`%|N%&Muv~Z*gs;JYRAJS&i>aP$(YZo{1d6 z5ZJalkaA*ASz}BUO+pF^M{T{oyj*h$a)V6Uu%dG@TU|Yy@ao_LQ9wk)mfS0A^?qLg znEHh7o@-h(Zyi)KG~UDeABD+M;jVD#Xc>nL|6 zMlH?V>1qt{QUn@KOva(v z?FNaE@zB(7#goiXX4W@YzwC|ho27`FT|z?qHJrJ*!Bx0XR1A@UqhqcxEG zg}EQwgFd;}TNGa1Wjb-(^9Uviw!My0pSgp=Sdv8<7#jfsNP9zE&KT$^|8Vn`t(2J; z{YGH3Y`|~|5g5vxFhcnfHMcZ=**CKX_@=z4Fu9Y{rpIVx4`Ds?M+*@RP}Y=u4C7J} zAKkLL!KA=dm5XRRM2btQCYXO6x~1|E6NtPBe*)@MW(0P(rr#vgE(BkG4O}@by2=ql zh%S)`6GE=DV%T|&>DjLhg9fQDVBf_cTec`4vvIw#;_4-93@Ok?yf^cYxaA(Ln3#?R zNJX?RXNmRA&Otj2UvLK$^4JwW!IF%z;il3ztl%Wwfp&wgSsU-XdX35tHOAqt;k1Q} z?6hWAFbr*oYUH(X#Vri!;U+kZB!UcvV|3KED``;>0ID!6p>_sRHE5E_6q;Bf_p*lA z@)h};iIwo!z~`J5jE*ZxLkjiLj;+LJv|GPTz*0#~(L(T7k9Af+?tgJFkjiH0pn(<-dn>Guwtlbh_OlJyM*Pa* z5ZNCPa1Jb~Qv2c>Z`5fpLOcL*J((8mSbA?z_2Hh~#hBGoRvlA+AaSBJr(|_a5h?U` z3|6zN6WJBLMozFIcY)=?rk;5;A{rT2VGEPYh%||=R5o?N4F^sHGZ2|7aq+Nm3jav# z8sMZvMPXmEfhDb3-CxTxSOdha^kAD9!L;Z6Dfac@c*uta4=pr4GFfFl1?tO=9k1i` z2~*S*QM)j-ov=a{fjwM4%qFRh04(IDtrKH5kM&7pj)=>UgBFF?ni+sh5K5>FiiH;^ zlauUDJH`gNRUP7fhqT4r@C8+ANgh@DXix@jt4Yw1*`TudA+`n93@om&3zo_rpWNOB zhDx{*M*H|6*_n~bX?pko4vPtNfXd92KY%N;dT|h|Hde3*0#H~mVriC~)*_TaiiazH zcKvWXJN0EgEshZw-hBu^%H`-K@?o$Op~MC@g8iTvX4N@g-mF%v5`QJ3GxiXE$|hSC zKE1iy@(T{ZfML8R^KRY(FwOF)&LD%o0TF(?2u4|ay$l6eD#AxBq{4f_1g>EsURkU~ z;RN&fZEf4 z2rJd{>=xX(UtZ3`!FYn~UzA@5+*G8b=)NI>aCKj^wQq0UF@9Jq@7~?`m6H_@;5tsH zyu9_RM_d}*=6EKF)`DHYRh|_NJ+I9=M%9UusplngWU%*sCL5;3fdZplmCFEEPTG0= zC}^#Pi;EqLJSe_^59g<<~D2pXrOE#G9#fAVh;%tiP7+#(Km9TohgAB zGfkD?*SrZ`Mu(ZyQol)1<|F^1XHV+RzU3YBerd!%Qr`F4kY-ssfj#q%Pq32sB{2#N zgzq8N*p;;Qw%u(+VZSUWhc5gIiY@WWN;eMgQ6^9ffVk*f;Rs|2_s|%_f#8u@jq5u# zMK0(AelOl0v#Fty0sTvH47wVv80z-~LpAZ24K&T{wRd0MN?JQV-rTgmad7*O5V6?m za+0C$m!AQ9xRL!IKEfeMyfgiEQG}bguVfd6;74UL*)AeyKZioGCG15V zFxi4gLGNuCVz@1#IcDsxGt3U|HLnbZ(y#@*n@g|Ixg%f$hL}BMtj1=Dj~}&313qq& zw-#dad_Kyu;nry&w4j=ExHk#G&dX=A!%c_<;2I^7CT3f_0RF*bwp+|{MVzPj5(%qw zPY|<(DZ(F#ZSrML`nYEiNdn|Fa^Wsq=-{j;!xd>?F28DNuDNwFQ?Gz}5_8UG$Z=Rgds;n;8f9=WLc#1iARzF4Ea zv>T)xX7$rOt3byND7Ox&E#w#?Zd;EgwGTNG9c zs1hSS^fBG6ym1`6i8|CLWdURhw&=snCGpf%Jj70aiZiGI8fkv@<=a36 zz_tXvRfBw~_(};qbC#OI*$|8e+E;hVq-Mp{iwaIguwmFzM&zQPm@!PBI*4X<}rbhFXSF@o|}Ackg6Se2CT< zgvImY;gFASMwQu%+hu2 zH4e=VDgyEifIBZi$pbl=Lmd}mmjnV{DGQPeA*afCLiXG)(`KqP_JcLhY*g&tc$^CD zEX?E*mr}OUyjFs)+lRXd&d3bdRTUfeCL<-KCSL0N=E6E}y(+j4h{MF-XI;EjxbRA# zs}XgeQ8S22>jlQG^ahKguU}!Yfy9vXQ@Ha=16z*Q28)l;n6b}SCbQB&^G{Q;yE;GS z8qomL!#<%14CM(lN%ZE@@iu8rm{3*eIbXNHa|_xn-{593SP40$UeC)FzQcoeT_` zTMPVhzy^kpTcTftKbr>R~e+4WV$8e z#Dp@OjVxJ}nfaIDcBj!I2pD0ZiUnzrZ>mYC93Ce`fa7;c_+-TFkn_S2GfsII(HHYG z{M)e`l?BV8Li8a%iZjH8Q$=S~1<5@UI6~MXFM;A)-h_@d;J+QvAt^}gyg=ow(1|{3 zLdjb$R6QrSo{0FKz!9Q0=^Pgh!a;tkZNuD#5dZ>zq@_&jEI9$~sSLi?n+BdiQy*h( z%%fQraEzFM83|2*_>q}{T?eJ)kPHjZ=j87}xw*hZdKH?bh#?U@1bKb(qBq=!L|XfG zV#b3B5++fM4_Vt~c%=!#f8HHmn6xtp8Q}klYjjA!D%+4`0`4J;xt5O_*h2)`PJi1e z)W&3NdE^oQP*TcvBIw8HvuYX^7+qd|``PNSTeV5OY29iRvS(|6_r(&)7V6=#HvJ^e zpgTXKC=-r$VgbqYg{R-Sr7W=YZsyA&Y|arm^iYHHf*7l@Gz9)XZH5-`UWHL*K~C?M zfmhwobf6cKm{qd7HLrTh<~aa`Hr{@$l96xs$Rr^Gn>@%fpbRC70>{e~$DDgS;&LIf zn}dryCs-b{m#`di#}bS+9A~F&)zh=%d_^=zIEs)@sB9$cys_w6%w&8SQq7b1v9$Qiop*c?SSg7^ zrGZm2dFEqdu91UoP!Rtn6k(WANEFV(>`-W9=|>Nk^#L!UjD+b68{>Ou=W@QGP9KDPP58k4T&36t=JB~*xa`y?i<+X14$k+^%D4NR6maLC1#yUh#`S1)8=TL=)yh;O&X%$g<8X%zs=cK{4Egj7dO?H>5U zk8s|>Dvd#b(U&l8!tsNF8~`fol9but29CRe|*#q&BdVp0I3kc zDI;5nL%AjR&2xAi%Tq1Q?e%3~j$xa445}GQgnzSX|#w0bc?;Mfc9HpsO zGcq9@^Tat?UqUwRUJ(`zaZbZ#2M~%RQ-d>&>!xVg;9ya+%i-?E@g3IKg`|{Zk)?wc z1lcNpM{YL;xU&WbL^7-URS@A!FkhFXF`<=rcKTq#3cT{j$p~#EzCjoatirB5A_oD| z9Nf8xfi5!bl1E{JIh&c%;5=f~-|2RmVBLt3G{!vd^)G<35;Q=CalSg_PP`Ul*bVZX zR}p~ToCbG3cVr7zb&#^_AG!=4Lfh@*Na1XML~2^06mah5YZ`Ah&oH_^J#fM`VqAyQti*|xazQF3KW zgjFLmRaM-8s5%OWnBw6D5&o8WH>CxenIm|6b#9T322GwgHoR8eH{9J_m=ee>HK}i% zJ{UBpgaH{*gMr5C-I$O*kQd6=WSwnB{S*JILG8&P>{ZY9#cMo-00_s@RM6SjtH`eu0~3Kvie-wG zWfBzF?mfb?htCzk*M#0xst2Kfk>eT{Hb&8W#E>k>SKB9ps2Wd5pEdKD`Q}RYUI4iO z#L>W^!Baj5M`_aXv#D6t;G3ElG5df! zU>7n(*Vxd6?ub}w#Q?dFn2PDBa2nabwxG940X%?#62&qvncZKvF#X=W0l0GEqj1ns z+C*kF0M4&J>cMPbC_sj^w?}lSIYmht+0-sjMe!qMAbcpfP`DV%g>)aqqqC7+0h|mC zSgQ2IaV2by3v@s-;65nwHU4StXsE3_6T~X39L4-qXx+Hj$6ckcG%`Jxk1dzYek?8s zeFH8R9%^TPCy^dRHGlRugu(>66WkYDA^tK)tcCjxgb==^0=ase!Fprl2Kd_AXe=Wn zOMvO-cCo0zd7vr+H5rg*vWq`$z3$KH%N-974QB7M>%=hogg|9*Jgv0f?DYpmF)&n1 z4lxkXv1Ln3djz<5aZ$M7Fu%ON=?OU?_KJ9feab_QW<3nyjR@qY4<@A3!$jv76VSz2 zWGcX7OcFRVInk)uPKv+Y%5ZFDmd}A1(t0|!HNKt=|VfcV~8ovYv zgGX^tUf){MUEwCP;=)T5*3=2LH3j|78;=8Na>g}=Mw@Ym0`5EoiEb(JZ_$A@? zP7lb!#;PtvZexfkdI)2=%cER2jPfOMBDO8KSSqD&H+N&aF0`cwUWHIy>uF%Xv-&xw z!rHL|HnEApTI|}L;b#>W=5>)JGZFIt%<&tJ zk$Ez0H?++%3A+$ab*z}EqChmqk*tu)CS2R@8N0mvs>y9fxIz=k<)Bz_@(|hp*4C^J zzq&2Iz6n`+2crq36(QbU5XFTo)K#uVnFo-BQ$l+mPH$)T=#;F$04c}@M<^Vp+%6VD zmceR_eiF3SNGXbHPxG=Cov(`Jkd2`9@c>T9H$$|WdnP**9%(p|HZBNgSkUvbMr9jd zGhndA!azY?Fk#7{>A;n65)NTy4QhNA707W@ke7=v?Hpd8H6WN5?2?lfLMq%Eenb6r z%ubaD53@Shd&5*7BU~mHg{%Mr5zzSv{h%)(cN%!-lmG z<19WK@p9Eg`o(g`h-=`8{`s*Dy9B0m)}1(=y+ygVudE^D0x8VU-uEvcuS13d&x`P2 zE|?}fySQ)g@MDTNyRM*}G3CR`Gik%=Y7*1Pz!^50 zle2~Ph_|F|Cr`+mh?==YEcJ+pnNA&`xwp$uz2PSW0EDk)c>}QU^puV6ulgNg`CCA_ zQ^sZ-(w0g&0K+KeSu*M%zpOiiAbux=3Z9lav~OM;2u1?L3B0ymK|$>74?%Kuv7sGy z`@!)?EL2-OQFzCUwev(0MMbmax+7i+Ya>QL*|^M==)E3SEzY4n6q#7{?q*Q$P>O_V9)z*v%yF*+c7g2%z; zl>-sBTVXw8mNqWsB0$}mAN*?--zKb`4NT&>loe7a$mtAXnBy)l0xxe!zP*FgOR{&) zR@O@3B-w!lXTPbikXe=5GDYHq)&dE~e#;_?VV7}nf;}J@b3ZF)CdThGwC=4w8O?Nh zD<19wagBY8Ln6FNj2eu#JRtVa6kV<_iut?SC47$Dd8VkPh<&7Hlm&v9kp``=z}_{H z=n?Ync1Q|Khw4ifB_GC72y758?-xPOz{+mp0<4~Z+BvyXAVACNn%aEiYnE~8s)}aA{`vvwsSh)ZtfeL2Y zGy2cyh@u2RZh()@a)sM-GLnanIBijFA(+({<#RIN@`lw8O9Kc(j-5oU?Q`j)nM+ci+e6-=>#>za{;I<86H?@0-KRa^pIb<$PQKIB5n ztna%KT4qDCa+?sWJ0rSLR$?O9cbD(y)u7USi)cB0|jni^~va zH$>!xnGq1iDmZNrR)_l{3v_+6!5*4Af52de7uzMdoQk6NvOrfY6&%J;9xE3XMjkPr zSF(iw0_dYFx3CK4W}veQh>)8N7tsjhcg|RWiP0z^l~uKa$R+@H3uMo7e&V-XXt*A_ z7sdtn<@8-k$pTxo>x1AYs2CNviT0 zSiA+gquN?+2R0Q<C>*@7N3eNy4#nIF7(1af19^w{NzM#wAv8yzzh?2XL-vFvpVLI}I3rW~ zCk_ePm3284A(hF1LZDLxo3jg%1uR+w!9;G8ZPD&d#++E6_JjV45g&$NrOYD~3G0$9 z-x0gQ7)g}m?-=$<@lPQn8>JYs0+4B(YA(nK@yS~Od%a0pd;|1XX(TI~1UdqMk(>%9 z>74iIHheimcS5JV)e1~9CW5|=LWe$UJu)%-7w05uEQ&Vpe?b7&r7Q+PHfaknU-z>D zd#wQwLNF@uA4n|xVi>3*LJOV@a_4aOX#21zvQRUYx)2Vi!v0P{V1kc;C{z-Q1jP$~ zrr#i>GDtZHJrq+lkvS&rDrzSJAJga<#2-{2k0tzl4$umT3{!Y4`zT-z5ivq~l-=&u zU+T9CXkoWI?kn!yiU1i1qU!fV5+HkxF~(Y>TwF*6wA_)U9N?&5tnl=BEkLVBoz=J{@`(=!Cy54%HUddO51o6r#`g|s~xqb^u=tU3Ukff5-=Y-2+0 zkzTR@!pIrO`T%&`AcV+8d}iZXhF5swAVm&l%M@C-a#B{W3^E5M^yz*>!EL29ugpZC z6K`Y1C*X+(lvvfTM1I;7E=Iaz_ z5w9ALs*fF*BFqc`tGGyvSIe>vdGm`x1C)Vm*SO&;2|<5#>v^sGYjbBq|8H&Yls~Q2 z;4R(V-L2L3b~gD_zkcthPJj48^51{@k3aw6he`6S#Qb{l)S%u!JhVS1$)7(-l0S1l zWPjI_?>3$;SIhZ_8=LN{&-llO{~<~Kkl*^nV@aL=vvSY$nfdh#N%F(2jQglgxo_~p z-}3vFK5Tyf^-EB!tJl|y3-S!TZr!|NJFsR`mE1o$=Po>$m^4z4yGc`D|zF zlh*e0-A}e*W&GsD?oR8Iz4ZAm!`H=BuNF_F?j;$!~lwnZG-&G~_GBBRTuxOwUX$)Uei(5?K4_ix;~e zzb;<%YOz8=uN~gqpDu1{o6i{1SIyVpfL_lZU`|>+RV~4=m&qA5Unl3u4FzAAG8@Tu zvXSiZdpkMd&m{T%pZ)khKS`RDx#GVw%HJhgMMudSeyY)`Tk~l*8S+y*`GW6NYQ-CF z_`AkBS|&68bz$DP)gRPV&2aerEow(Xu7)`OSavyJtK;wC zQm>zy7R{)0#%KCe?NVE=_@ww$tvKbm6WU^1_@lN&eIHW81Ak9>&x3j6%*@7v=}&4} zP%Dk4#%0MfD}FC|;*2&tHDxvS2j=Gm-`e$YlHBtzH+yR3DbL@Vr)zw!o~?NEeKrO) z(-W0Zudew?vsyFjYDxcBX1?C>-5ss8V_!?$&#FhWt(II->nY{V`8}r|*9!GnwQ9X- zwW(Isrj@4m-tvh?V!==L6TL~#*Z6JMsaCn28NFGnvBoZx!?T=SV)s+FfP(U{fv zPtR-qYV^>~qie~!9@;r|?~RR(MrFmDw38OJT%&H+%=?Uk?N@v~gyUdm@077ozls_A z*FG9*5Y1+FUAtXVjFO$F z>dr0Z>L}X*+L>ybTN|$3GqVHVWNlJAw0loXNxSQ{$L{#P#%EeNYQ4@9)uguDc53&k z2kvJ(qxMvGD^>eIJ+x<#&Is+?E1pqn>>AeDa?a21Xo=nPuGj9YSnPeMq^6ivQ4k*#(vm-w1@!8On*F9dN#<6))Wyh3I*+%k`e@*zeO8gT4rRHCH ztA4Vp#yzRO_11Rs8E;ej4ozu2ua=JZbjaVfg|-g|=DkPe(?fG&NRnt$?j^0!zq{sB z+maeTPfY7o&xqegS#4^i&KuWb&F1^OQPM$&=SI|XzxTSS^fNZI6V``XsJGkJt)J5dAjv*{q_^Bkao5nG#a0qa<;7+A=_S!*Kad=wl@28joMS5Oj#FNUy{MT z-ion%M>D4WX%_5g+jXJV9P(X*KQ*&Q{99|T#``Dy*D`IeEmwOF%r0#5ufycmC^aAXtGZZYX}(G{W;#c- zYBUyhh57Z_KH5`8rDF4`-Oy&lRfFbTCxqs}KC2VKw&qj5*Z6*%?=$_Zk?T@ge-}O0 z`D6R48FhVj=ZBrA@~5h)dID=i+#b~%be5#73Z2DjiOyn;rsmAmZO;O=%Rgi6sB5+9 z9P(FsaT}yaR7u+Z_?h)Nkb8|CG&hj-FJ^9MqZtjlxK2O$?=bSnl zriCie1q1 zoQr!oZs!X=)Av?7P%HJky>WGq>;Ao= zRwwH^$$Mr-#L2j>*2iQ3r-#f;>m_MPPI4N+W3rdD3F*4(=SMtY^#R?mhqSFMY3Q?$ z>5pd0_DJ%Iq_I%e3!kj&Ga4_aQO&8%${iXjje+Fqd!u<+O(c|Xw7#s4Q%I4vRkrno zo~&Nkwpv+DZ*b$Pe-}E{mu9A{B=6?!mR6k57OjFe=KHEVX=iwqmz0z){a&A|O}eeui3Pp*0?5>+MI;X3AsXq~c;c%DcC$5vuLl zm3H*4{9ayb>a*s{>SnH7I7`cX477SRCtAC958TqzrTJMs{_0sR&Q*6hzrT!Km4`Ju zx`R~LgmYZ?iZACDx2uzu2b7mArDuJ~StDU@IA4-gNj>9B$&&f)8y}OA3(3)Mm!$GT z>a};!)iBR%WUVwV zDO}?sS;0vkarstbX{B(DZYX1haz;^`FUzcxjckjoTx8`mH_|bwsgQ-j_d5ATZIs+x zmTok56C?wD=hmK`O}B>1a+>5RNoB4zZq*j+qq+}lJ#L>A5|Y(3?C1KoED)g;p{R$9vMU9ty65o>FHZ`oSflqmvvG`^~tX%XQ)N*BWb8zKUq0LE&0(T4RB}9uKdfe7w%BP^{v@Riwd1SgjvAV@q$_6$(a*N6?`wa1 zf2l+5vG>+vQb%!L%EqD@ReP)?r7_g~{#BOOua-~LmY(mL&o!J5=QpwdE%# zq1X`{n;9;*CX`R?YN_sQ~%Wt7Ueb}h^W}B9EcHTm zwl;c;e*GZ%70Sw+YdyqO=`2b92kX4*0blR`{zb~`TrB&i^>g8azBcdvh(F8kKH`ZP zck&q)13mo~iBG@k$+sytF{6B8bVv2a&4KeNCDbn)%R6jl&v^1FHAxRmXpP=8HP6de ztx;*9i_0c+%6FG$PW8RKr1AmYl}78wJD1yLF8z0fGaAmPZU3Q>5v6F5@c)y4`X?bm>gT{UpKfdj zgkwJ`qmrKR=?71QOY(n}5lKRbeDFk=B)?c0jr4&jll+2T3++DGFu(M A4gdfE literal 0 HcmV?d00001 diff --git a/Thirdparty/glfw/include/GLFW/glfw3.h b/Thirdparty/glfw/include/GLFW/glfw3.h new file mode 100644 index 0000000..31b201a --- /dev/null +++ b/Thirdparty/glfw/include/GLFW/glfw3.h @@ -0,0 +1,5912 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2019 Camilla Löwy + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * @brief Functions and types related to OpenGL and OpenGL ES contexts. + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan support reference + * @brief Functions and types related to Vulkan. + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * @brief Functions and types related to initialization and error handling. + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * @brief Functions and types related to input handling. + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * @brief Functions and types related to monitors. + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * @brief Functions and types related to windows. + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* Include because most Windows GLU headers need wchar_t and + * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +#if defined(GLFW_INCLUDE_VULKAN) + #include +#endif /* Vulkan header */ + +/* The Vulkan header may have indirectly included windows.h (because of + * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. + */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GLFW_APIENTRY_DEFINED +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Include the chosen OpenGL or OpenGL ES headers. + */ +#if defined(GLFW_INCLUDE_ES1) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES2) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES3) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES31) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES32) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_GLCOREARB) + + #if defined(__APPLE__) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif /*GLFW_INCLUDE_GLEXT*/ + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#elif defined(GLFW_INCLUDE_GLU) + + #if defined(__APPLE__) + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) && \ + !defined(__gl_h_) && \ + !defined(__gles1_gl_h_) && \ + !defined(__gles2_gl2_h_) && \ + !defined(__gles2_gl3_h_) && \ + !defined(__gles2_gl31_h_) && \ + !defined(__gles2_gl32_h_) && \ + !defined(__gl_glcorearb_h_) && \ + !defined(__gl2_h_) /*legacy*/ && \ + !defined(__gl3_h_) /*legacy*/ && \ + !defined(__gl31_h_) /*legacy*/ && \ + !defined(__gl32_h_) /*legacy*/ && \ + !defined(__glcorearb_h_) /*legacy*/ && \ + !defined(__GL_H__) /*non-standard*/ && \ + !defined(__gltypes_h_) /*non-standard*/ && \ + !defined(__glee_h_) /*non-standard*/ + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#endif /* OpenGL and OpenGL ES headers */ + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling a GLFW Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Unix shared library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW header. + * + * The major version number of the GLFW header. This is incremented when the + * API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW header. + * + * The minor version number of the GLFW header. This is incremented when + * features are added to the API but it remains backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 3 +/*! @brief The revision number of the GLFW header. + * + * The revision number of the GLFW header. This is incremented when a bug fix + * release is made that does not contain any API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 8 +/*! @} */ + +/*! @brief One. + * + * This is only semantic sugar for the number 1. You can instead use `1` or + * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal + * to one. + * + * @ingroup init + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * This is only semantic sugar for the number 0. You can instead use `0` or + * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is + * equal to zero. + * + * @ingroup init + */ +#define GLFW_FALSE 0 + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup hat_state Joystick hat states + * @brief Joystick hat states. + * + * See [joystick hat input](@ref joystick_hat) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_HAT_CENTERED 0 +#define GLFW_HAT_UP 1 +#define GLFW_HAT_RIGHT 2 +#define GLFW_HAT_DOWN 4 +#define GLFW_HAT_LEFT 8 +#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) +#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) +#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) +#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) +/*! @} */ + +/*! @defgroup keys Keyboard keys + * @brief Keyboard key IDs. + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 + +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * @brief Modifier key flags. + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + * + * If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + * + * If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + * + * If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + * + * If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 +/*! @brief If this bit is set the Caps Lock key is enabled. + * + * If this bit is set the Caps Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_CAPS_LOCK 0x0010 +/*! @brief If this bit is set the Num Lock key is enabled. + * + * If this bit is set the Num Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_NUM_LOCK 0x0020 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @brief Mouse button IDs. + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * @brief Joystick IDs. + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup gamepad_buttons Gamepad buttons + * @brief Gamepad buttons. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_BUTTON_A 0 +#define GLFW_GAMEPAD_BUTTON_B 1 +#define GLFW_GAMEPAD_BUTTON_X 2 +#define GLFW_GAMEPAD_BUTTON_Y 3 +#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 +#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 +#define GLFW_GAMEPAD_BUTTON_BACK 6 +#define GLFW_GAMEPAD_BUTTON_START 7 +#define GLFW_GAMEPAD_BUTTON_GUIDE 8 +#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 +#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 +#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 +#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 +#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT + +#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A +#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B +#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X +#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y +/*! @} */ + +/*! @defgroup gamepad_axes Gamepad axes + * @brief Gamepad axes. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_AXIS_LEFT_X 0 +#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 +#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 +#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 +#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER +/*! @} */ + +/*! @defgroup errors Error codes + * @brief Error codes. + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief No error has occurred. + * + * No error has occurred. + * + * @analysis Yay. + */ +#define GLFW_NO_ERROR 0 +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @analysis Application programmer error. Initialize GLFW before calling any + * function that requires initialization. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @analysis Application programmer error. Ensure a context is current before + * calling functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @analysis A bug in GLFW or the underlying operating system. Report the bug + * to our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation backend. + * Below are a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. + * + * @analysis The machine does not support your requirements. If your + * application is sufficiently flexible, downgrade your requirements and try + * again. Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @analysis A bug or configuration error in GLFW, the underlying operating + * system or its drivers, or a lack of required resources. Report the issue to + * our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @analysis If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @} */ + +/*! @addtogroup window + * @{ */ +/*! @brief Input focus window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUSED_hint) or + * [window attribute](@ref GLFW_FOCUSED_attrib). + */ +#define GLFW_FOCUSED 0x00020001 +/*! @brief Window iconification window attribute + * + * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). + */ +#define GLFW_ICONIFIED 0x00020002 +/*! @brief Window resize-ability window hint and attribute + * + * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and + * [window attribute](@ref GLFW_RESIZABLE_attrib). + */ +#define GLFW_RESIZABLE 0x00020003 +/*! @brief Window visibility window hint and attribute + * + * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and + * [window attribute](@ref GLFW_VISIBLE_attrib). + */ +#define GLFW_VISIBLE 0x00020004 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_DECORATED_hint) and + * [window attribute](@ref GLFW_DECORATED_attrib). + */ +#define GLFW_DECORATED 0x00020005 +/*! @brief Window auto-iconification window hint and attribute + * + * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and + * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). + */ +#define GLFW_AUTO_ICONIFY 0x00020006 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_FLOATING_hint) and + * [window attribute](@ref GLFW_FLOATING_attrib). + */ +#define GLFW_FLOATING 0x00020007 +/*! @brief Window maximization window hint and attribute + * + * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and + * [window attribute](@ref GLFW_MAXIMIZED_attrib). + */ +#define GLFW_MAXIMIZED 0x00020008 +/*! @brief Cursor centering window hint + * + * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). + */ +#define GLFW_CENTER_CURSOR 0x00020009 +/*! @brief Window framebuffer transparency hint and attribute + * + * Window framebuffer transparency + * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and + * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). + */ +#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A +/*! @brief Mouse cursor hover window attribute. + * + * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). + */ +#define GLFW_HOVERED 0x0002000B +/*! @brief Input focus on calling show window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or + * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). + */ +#define GLFW_FOCUS_ON_SHOW 0x0002000C + +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). + */ +#define GLFW_RED_BITS 0x00021001 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). + */ +#define GLFW_GREEN_BITS 0x00021002 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). + */ +#define GLFW_BLUE_BITS 0x00021003 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). + */ +#define GLFW_ALPHA_BITS 0x00021004 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). + */ +#define GLFW_DEPTH_BITS 0x00021005 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). + */ +#define GLFW_STENCIL_BITS 0x00021006 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). + */ +#define GLFW_ACCUM_RED_BITS 0x00021007 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). + */ +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). + */ +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). + */ +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +/*! @brief Framebuffer auxiliary buffer hint. + * + * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). + */ +#define GLFW_AUX_BUFFERS 0x0002100B +/*! @brief OpenGL stereoscopic rendering hint. + * + * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). + */ +#define GLFW_STEREO 0x0002100C +/*! @brief Framebuffer MSAA samples hint. + * + * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). + */ +#define GLFW_SAMPLES 0x0002100D +/*! @brief Framebuffer sRGB hint. + * + * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). + */ +#define GLFW_SRGB_CAPABLE 0x0002100E +/*! @brief Monitor refresh rate hint. + * + * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). + */ +#define GLFW_REFRESH_RATE 0x0002100F +/*! @brief Framebuffer double buffering hint. + * + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). + */ +#define GLFW_DOUBLEBUFFER 0x00021010 + +/*! @brief Context client API hint and attribute. + * + * Context client API [hint](@ref GLFW_CLIENT_API_hint) and + * [attribute](@ref GLFW_CLIENT_API_attrib). + */ +#define GLFW_CLIENT_API 0x00022001 +/*! @brief Context client API major version hint and attribute. + * + * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +/*! @brief Context client API minor version hint and attribute. + * + * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +/*! @brief Context client API revision number attribute. + * + * Context client API revision number + * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). + */ +#define GLFW_CONTEXT_REVISION 0x00022004 +/*! @brief Context robustness hint and attribute. + * + * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) + * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). + */ +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +/*! @brief OpenGL forward-compatibility hint and attribute. + * + * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) + * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). + */ +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +/*! @brief Debug mode context hint and attribute. + * + * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and + * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). + */ +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +/*! @brief OpenGL profile hint and attribute. + * + * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and + * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). + */ +#define GLFW_OPENGL_PROFILE 0x00022008 +/*! @brief Context flush-on-release hint and attribute. + * + * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and + * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). + */ +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +/*! @brief Context error suppression hint and attribute. + * + * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and + * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). + */ +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +/*! @brief Context creation API hint and attribute. + * + * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and + * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). + */ +#define GLFW_CONTEXT_CREATION_API 0x0002200B +/*! @brief Window content area scaling window + * [window hint](@ref GLFW_SCALE_TO_MONITOR). + */ +#define GLFW_SCALE_TO_MONITOR 0x0002200C +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). + */ +#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). + */ +#define GLFW_COCOA_FRAME_NAME 0x00023002 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). + */ +#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_CLASS_NAME 0x00024001 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_INSTANCE_NAME 0x00024002 +/*! @} */ + +#define GLFW_NO_API 0 +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 +#define GLFW_LOCK_KEY_MODS 0x00033004 +#define GLFW_RAW_MOUSE_MOTION 0x00033005 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 +#define GLFW_OSMESA_CONTEXT_API 0x00036003 + +/*! @defgroup shapes Standard cursor shapes + * @brief Standard system cursor shapes. + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +/*! @addtogroup init + * @{ */ +/*! @brief Joystick hat buttons init hint. + * + * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). + */ +#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). + */ +#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). + */ +#define GLFW_COCOA_MENUBAR 0x00051002 +/*! @} */ + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 3.0. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa @ref glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function pointer type for error callbacks. + * + * This is the function pointer type for error callbacks. An error callback + * function has the following signature: + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * + * @param[in] error_code An [error code](@ref errors). Future releases may add + * more error codes. + * @param[in] description A UTF-8 encoded string describing the error. + * + * @pointer_lifetime The error description string is valid until the callback + * function returns. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int error_code, const char* description); + +/*! @brief The function pointer type for window position callbacks. + * + * This is the function pointer type for window position callbacks. A window + * position callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); + +/*! @brief The function pointer type for window size callbacks. + * + * This is the function pointer type for window size callbacks. A window size + * callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window close callbacks. + * + * This is the function pointer type for window close callbacks. A window + * close callback function has the following signature: + * @code + * void function_name(GLFWwindow* window) + * @endcode + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa @ref glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow* window); + +/*! @brief The function pointer type for window content refresh callbacks. + * + * This is the function pointer type for window content refresh callbacks. + * A window content refresh callback function has the following signature: + * @code + * void function_name(GLFWwindow* window); + * @endcode + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa @ref glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); + +/*! @brief The function pointer type for window focus callbacks. + * + * This is the function pointer type for window focus callbacks. A window + * focus callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa @ref glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); + +/*! @brief The function pointer type for window iconify callbacks. + * + * This is the function pointer type for window iconify callbacks. A window + * iconify callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa @ref glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); + +/*! @brief The function pointer type for window maximize callbacks. + * + * This is the function pointer type for window maximize callbacks. A window + * maximize callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * + * @param[in] window The window that was maximized or restored. + * @param[in] maximized `GLFW_TRUE` if the window was maximized, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_maximize + * @sa glfwSetWindowMaximizeCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); + +/*! @brief The function pointer type for framebuffer size callbacks. + * + * This is the function pointer type for framebuffer size callbacks. + * A framebuffer size callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window content scale callbacks. + * + * This is the function pointer type for window content scale callbacks. + * A window content scale callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * + * @param[in] window The window whose content scale changed. + * @param[in] xscale The new x-axis content scale of the window. + * @param[in] yscale The new y-axis content scale of the window. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); + +/*! @brief The function pointer type for mouse button callbacks. + * + * This is the function pointer type for mouse button callback functions. + * A mouse button callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases + * may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa @ref glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); + +/*! @brief The function pointer type for cursor position callbacks. + * + * This is the function pointer type for cursor position callbacks. A cursor + * position callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the content area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * content area. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); + +/*! @brief The function pointer type for cursor enter/leave callbacks. + * + * This is the function pointer type for cursor enter/leave callbacks. + * A cursor enter/leave callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa @ref glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); + +/*! @brief The function pointer type for scroll callbacks. + * + * This is the function pointer type for scroll callbacks. A scroll callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa @ref scrolling + * @sa @ref glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); + +/*! @brief The function pointer type for keyboard key callbacks. + * + * This is the function pointer type for keyboard key callbacks. A keyboard + * key callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future + * releases may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa @ref glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); + +/*! @brief The function pointer type for Unicode character callbacks. + * + * This is the function pointer type for Unicode character callbacks. + * A Unicode character callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa @ref glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); + +/*! @brief The function pointer type for Unicode character with modifiers + * callbacks. + * + * This is the function pointer type for Unicode character with modifiers + * callbacks. It is called for each input character, regardless of what + * modifier keys are held down. A Unicode character with modifiers callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_char + * @sa @ref glfwSetCharModsCallback + * + * @deprecated Scheduled for removal in version 4.0. + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); + +/*! @brief The function pointer type for path drop callbacks. + * + * This is the function pointer type for path drop callbacks. A path drop + * callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] path_count The number of dropped paths. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @pointer_lifetime The path array and its strings are valid until the + * callback function returns. + * + * @sa @ref path_drop + * @sa @ref glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); + +/*! @brief The function pointer type for monitor configuration callbacks. + * + * This is the function pointer type for monitor configuration callbacks. + * A monitor callback function has the following signature: + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref monitor_event + * @sa @ref glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); + +/*! @brief The function pointer type for joystick configuration callbacks. + * + * This is the function pointer type for joystick configuration callbacks. + * A joystick configuration callback function has the following signature: + * @code + * void function_name(int jid, int event) + * @endcode + * + * @param[in] jid The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref joystick_event + * @sa @ref glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int jid, int event); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * @sa @ref glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @ingroup monitor + */ +typedef struct GLFWvidmode +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa @ref monitor_gamma + * @sa @ref glfwGetGammaRamp + * @sa @ref glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWgammaramp +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + * + * This describes a single 2D image. See the documentation for each related + * function what the expected pixel format is. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + * + * @ingroup window + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + +/*! @brief Gamepad input state + * + * This describes the input state of a gamepad. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +typedef struct GLFWgamepadstate +{ + /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` + * or `GLFW_RELEASE`. + */ + unsigned char buttons[15]; + /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 + * to 1.0 inclusive. + */ + float axes[6]; +} GLFWgamepadstate; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GLFW_TRUE` immediately. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with the @ref + * GLFW_COCOA_CHDIR_RESOURCES init hint. + * + * @remark @x11 This function will set the `LC_CTYPE` category of the + * application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwTerminate + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. + * + * This function has no effect if GLFW is not initialized. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Sets the specified init hint to the desired value. + * + * This function sets hints for the next initialization of GLFW. + * + * The values you set hints to are never reset by GLFW, but they only take + * effect during initialization. Once GLFW has been initialized, any values + * you set will be ignored until the library is terminated and initialized + * again. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [init hint](@ref init_hints) to set. + * @param[in] value The new value of the init hint. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref + * GLFW_INVALID_VALUE. + * + * @remarks This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa init_hints + * @sa glfwInit + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI void glfwInitHint(int hint, int value); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersionString + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns the compile-time generated + * [version string](@ref intro_version_string) of the GLFW library binary. It + * describes the version, platform, compiler and any platform-specific + * compile-time options. It should not be confused with the OpenGL or OpenGL + * ES version string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Returns and clears the last error for the calling thread. + * + * This function returns and clears the [error code](@ref errors) of the last + * error that occurred on the calling thread, and optionally a UTF-8 encoded + * human-readable description of it. If no error has occurred since the last + * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is + * set to `NULL`. + * + * @param[in] description Where to store the error description pointer, or `NULL`. + * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR + * (zero). + * + * @errors None. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * next error occurs or the library is terminated. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI int glfwGetError(const char** description); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error code is set before the callback is called. Calling @ref + * glfwGetError from the error callback will return the same value as the error + * code argument. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @callback_signature + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * For more information about the callback parameters, see the + * [callback pointer type](@ref GLFWerrorfun). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * @sa @ref glfwGetError + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @param[out] count Where to store the number of monitors in the returned + * array. This is set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * monitor configuration changes or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa @ref glfwGetPrimaryMonitor + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa @ref glfwGetMonitors + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Retrieves the work area of the monitor. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the + * monitor not occluded by the operating system task bar where present. If no + * task bar exists then the work area is the monitor resolution in screen + * coordinates. + * + * Any or all of the position and size arguments may be `NULL`. If an error + * occurs, all non-`NULL` position and size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * @param[out] width Where to store the monitor width, or `NULL`. + * @param[out] height Where to store the monitor height, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_workarea + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 On Windows 8 and earlier the physical size is calculated from + * the current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Retrieves the content scale for the specified monitor. + * + * This function retrieves the content scale for the specified monitor. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * The content scale may depend on both the monitor resolution and pixel + * density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution. + * + * @param[in] monitor The monitor to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the user pointer of the specified monitor. + * + * This function sets the user-defined pointer of the specified monitor. The + * current value is retained until the monitor is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwGetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); + +/*! @brief Returns the user pointer of the specified monitor. + * + * This function returns the current value of the user-defined pointer of the + * specified monitor. The initial value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwSetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmonitorfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths), then by resolution area (the + * product of width and height), then resolution width and finally by refresh + * rate. + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 Changed to return an array of modes for a specific monitor. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoModes + * + * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates an appropriately sized gamma ramp from the specified + * exponent and then calls @ref glfwSetGammaRamp with it. The value must be + * a finite number greater than zero. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + * This function returns the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while + * returning `NULL`. + * + * @pointer_lifetime The returned structure and its arrays are allocated and + * freed by GLFW. You should not free them yourself. They are valid until the + * specified monitor is disconnected, this function is called again for that + * monitor or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The size of the specified gamma ramp should match the size of the + * current ramp for that monitor. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwWindowHintString + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only integer value hints can be set with this function. String value hints + * are set with @ref glfwWindowHintString. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHintString + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only string type hints can be set with this function. Integer value hints + * are set with @ref glfwWindowHint. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintString(int hint, const char* value); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. + * + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is + * recommended that you pick the primary monitor. For more information on how + * to query connected monitors, see @ref monitor_monitors. + * + * For full screen windows, the specified size becomes the resolution of the + * window's _desired video mode_. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video + * mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called _windowed full screen_ + * or _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. This will not affect its + * OpenGL or OpenGL ES context. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * As long as at least one full screen window is not iconified, the screensaver + * is prohibited from starting. + * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` for + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_APPLICATION` icon will be used instead. To set a different icon, + * see @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @macos The OS only supports forward-compatible core profile contexts + * for OpenGL versions 3.2 and later. Before creating an OpenGL context of + * version 3.2 or later you must set the + * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and + * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. + * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @macos The first time a window is created the menu bar is created. + * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu + * bar. Otherwise a minimal menu bar is created manually with common commands + * like Hide, Quit and About. The About entry opens a minimal about dialog + * with information from the application's bundle. Menu bar creation can be + * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. + * + * @remark @macos On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the + * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) + * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the + * application bundle's `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remark @macos When activating frame autosaving with + * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified + * window size and position may be overridden by previously saved values. + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @remark @x11 The class part of the `WM_CLASS` window property will by + * default be set to the window title passed to this function. The instance + * part will use the contents of the `RESOURCE_NAME` environment variable, if + * present and not empty, or fall back to the window title. Set the + * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and + * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to + * override this. + * + * @remark @wayland Compositors should implement the xdg-decoration protocol + * for GLFW to decorate the window properly. If this protocol isn't + * supported, or if the compositor prefers client-side decorations, a very + * simple fallback frame will be drawn using the wp_viewporter protocol. A + * compositor can still emit close, maximize or fullscreen events, using for + * instance a keybind mechanism. If neither of these protocols is supported, + * the window won't be decorated. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size or refresh rate. + * + * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol + * to be implemented in the user's compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwDestroyWindow + * + * @since Added in version 3.0. Replaces `glfwOpenWindow`. + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * If the context of the specified window is current on the main thread, it is + * detached before being destroyed. + * + * @param[in] window The window to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwCreateWindow + * + * @since Added in version 3.0. Replaces `glfwCloseWindow`. + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, so this function does nothing. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @wayland There is no existing protocol to change an icon, the + * window will thus inherit the one defined in the application's desktop file. + * This function always emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the content area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the content area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the content area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to retrieve the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the content area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the content area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the content area. + * @param[in] ypos The y-coordinate of the upper-left corner of the content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to set the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the content area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the content area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * content area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the content area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The size limits will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the content area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The aspect ratio will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the content area of the specified window. + * + * This function sets the size, in screen coordinates, of the content area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * + * @param[in] window The window to resize. + * @param[in] width The desired width, in screen coordinates, of the window + * content area. + * @param[in] height The desired height, in screen coordinates, of the window + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwGetWindowSize + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Retrieves the content scale for the specified window. + * + * This function retrieves the content scale for the specified window. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * On systems where each monitors can have its own content scale, the window + * content scale will depend on which monitor the system considers the window + * to be on. + * + * @param[in] window The window to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * @sa @ref glfwGetMonitorContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); + +/*! @brief Returns the opacity of the whole window. + * + * This function returns the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one. + * + * The initial opacity value for newly created windows is one. + * + * @param[in] window The window to query. + * @return The opacity value of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwSetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); + +/*! @brief Sets the opacity of the whole window. + * + * This function sets the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. + * + * The initial opacity value for newly created windows is one. + * + * A window created with framebuffer transparency may not use whole window + * transparency. The results of doing this are undefined. + * + * @param[in] window The window to set the opacity for. + * @param[in] opacity The desired opacity of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwGetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); + +/*! @brief Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwRestoreWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window if it was previously iconified + * (minimized) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * By default, windowed mode windows are focused when shown + * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint + * to change this behavior for all newly created windows, or change the + * behavior for an existing window with @ref glfwSetWindowAttrib. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Because Wayland wants every frame of the desktop to be + * complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is + * updated after this call. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwHideWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to + * disable this behavior. + * + * Also by default, windowed mode windows are focused when shown + * with @ref glfwShowWindow. Set the + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * For a less disruptive way of getting the user's attention, see + * [attention requests](@ref window_attention). + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland It is not possible for an application to bring its windows + * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * @sa @ref window_attention + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Requests user attention to the specified window. + * + * This function requests user attention to the specified window. On + * platforms where this is not supported, attention is requested to the + * application as a whole. + * + * Once the user has given attention, usually by focusing the window or + * application, the system will end the request automatically. + * + * @param[in] window The window to request attention to. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos Attention is requested to the application as a whole, not the + * specific window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attention + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window content area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * content area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * content area. + * @param[in] width The desired with, in screen coordinates, of the content + * area or video mode. + * @param[in] height The desired height, in screen coordinates, of the content + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise + * affected by any resizing or mode switching, although you may need to update + * your viewport if the framebuffer size has changed. + * + * @remark @wayland The desired window position is ignored, as there is no way + * for an application to set this property. + * + * @remark @wayland Setting the window to full screen will not attempt to + * change the mode, no matter what the requested size or refresh rate. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa @ref glfwGetWindowMonitor + * @sa @ref glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwSetWindowAttrib + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets an attribute of the specified window. + * + * This function sets the value of an attribute of the specified window. + * + * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), + * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), + * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), + * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * + * Some of these attributes are ignored for full screen windows. The new + * value will take effect if the window is later made windowed. + * + * Some of these attributes are ignored for windowed mode windows. The new + * value will take effect if the window is later made full screen. + * + * @param[in] window The window to set the attribute for. + * @param[in] attrib A supported window attribute. + * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark Calling @ref glfwGetWindowAttrib will always return the latest + * value, even if that value is ignored by the current mode of the window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwGetWindowAttrib + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwGetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwSetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the + * position, in screen coordinates, of the upper-left corner of the content + * area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland This callback will never be called, as there is no way for + * an application to know its global position. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowsizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowclosefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @macos Selecting Quit from the application menu will trigger the + * close callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the content area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz, Aqua or Wayland, where + * the window contents are saved off-screen, this callback may be called only + * very infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowrefreshfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowfocusfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowiconifyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland The XDG-shell protocol has no event for iconification, so + * this callback will never be called. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/*! @brief Sets the maximize callback for the specified window. + * + * This function sets the maximization callback of the specified window, which + * is called when the window is maximized or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowmaximizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_maximize + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWframebuffersizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/*! @brief Sets the window content scale callback for the specified window. + * + * This function sets the window content scale callback of the specified window, + * which is called when the content scale of the specified window changes. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowcontentscalefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 1.0. + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like @ref + * glfwPollEvents, i.e. the events in the queue are processed and the function + * then returns immediately. Processing events will cause the window and input + * callbacks associated with those events to be called. + * + * The timeout value must be a positive finite number. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the + * content area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + * If sticky mouse buttons are enabled, a mouse button press will ensure that + * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. + * + * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to + * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, + * callbacks that receive modifier bits will also have the @ref + * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, + * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. + * + * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` + * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is + * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, + * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref + * glfwRawMouseMotionSupported to check for support. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns whether raw mouse motion is supported. + * + * This function returns whether raw mouse motion is supported on the current + * system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on + * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. + * + * Raw mouse motion is closer to the actual motion of the mouse across + * a surface. It is not affected by the scaling and acceleration applied to + * the motion of the desktop cursor. That processing is suitable for a cursor + * while raw motion is better for controlling for example a 3D camera. Because + * of this, raw mouse motion is only provided when the cursor is disabled. + * + * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref raw_mouse_motion + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwRawMouseMotionSupported(void); + +/*! @brief Returns the layout-specific name of the specified printable key. + * + * This function returns the name of the specified printable key, encoded as + * UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead + * keys, it is typically the diacritic it would add to a character. + * + * __Do not use this function__ for [text input](@ref input_char). You will + * break text input for many languages even if it happens to work for yours. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, + * otherwise the scancode is ignored. If you specify a non-printable key, or + * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this + * function returns `NULL` but does not emit an error. + * + * This behavior allows you to always pass in the arguments in the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * Names for printable keys depend on keyboard layout, while names for + * non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text. + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The contents of the returned string may change when a keyboard + * layout change event is received. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the platform-specific scancode of the specified key. + * + * This function returns the platform-specific scancode of the specified key. + * + * If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this + * method will return `-1`. + * + * @param[in] key Any [named key](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref input_key + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetKeyScancode(int key); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback. + * + * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is + * not a valid key for this function. + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. + * + * If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function + * returns `GLFW_PRESS` the first time you call it for a mouse button that was + * pressed, even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the content area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the content area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the content area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPos + * + * @since Added in version 3.0. Replaces `glfwGetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the content area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the content area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * content area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland This function will only work when the cursor mode is + * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwGetCursorPos + * + * @since Added in version 3.0. Replaces `glfwSetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwDestroyCursor + * @sa @ref glfwCreateStandardCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * If the specified cursor is current for any window, that window will be + * reverted to the default cursor. This does not affect the cursor mode. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * content area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specified window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWkeyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on macOS or Alt key + * on Windows. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * [error](@ref error_handling) occurred. + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharmodsfun). + * + * @deprecated Scheduled for removal in version 4.0. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmousebuttonfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); + +/*! @brief Sets the cursor enter/leave callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the content area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorenterfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new scroll callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWscrollfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); + +/*! @brief Sets the path drop callback. + * + * This function sets the path drop callback of the specified window, which is + * called when one or more dragged paths are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWdropfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland File drop is currently unimplemented. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * There is no need to call this function before other functions that accept + * a joystick ID, as they all check for presence before performing any other + * work. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int jid); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * For backward compatibility with earlier versions that did not have @ref + * glfwGetJoystickHats, the button array also includes all hats, each + * represented as four buttons. The hats are in the same order as returned by + * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and + * _left_. To disable these extra buttons, set the @ref + * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); + +/*! @brief Returns the state of all hats of the specified joystick. + * + * This function returns the state of all hats of the specified joystick. + * Each element in the array is one of the following values: + * + * Name | Value + * ---- | ----- + * `GLFW_HAT_CENTERED` | 0 + * `GLFW_HAT_UP` | 1 + * `GLFW_HAT_RIGHT` | 2 + * `GLFW_HAT_DOWN` | 4 + * `GLFW_HAT_LEFT` | 8 + * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` + * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` + * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` + * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` + * + * The diagonal directions are bitwise combinations of the primary (up, right, + * down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction. + * + * @code + * if (hats[2] & GLFW_HAT_RIGHT) + * { + * // State of hat 2 could be right-up, right or right-down + * } + * @endcode + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of hat states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of hat states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_hat + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int jid); + +/*! @brief Returns the SDL compatible GUID of the specified joystick. + * + * This function returns the SDL compatible GUID, as a UTF-8 encoded + * hexadecimal string, of the specified joystick. The returned string is + * allocated and freed by GLFW. You should not free it yourself. + * + * The GUID is what connects a joystick to a gamepad mapping. A connected + * joystick will always have a GUID even if there is no gamepad mapping + * assigned to it. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to + * uniquely identify the make and model of a joystick but does not identify + * a specific unit, e.g. all wired Xbox 360 controllers will have the same + * GUID on that platform. The GUID for a unit may vary between platforms + * depending on what hardware information the platform specific APIs provide. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickGUID(int jid); + +/*! @brief Sets the user pointer of the specified joystick. + * + * This function sets the user-defined pointer of the specified joystick. The + * current value is retained until the joystick is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwGetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); + +/*! @brief Returns the user pointer of the specified joystick. + * + * This function returns the current value of the user-defined pointer of the + * specified joystick. The initial value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwSetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void* glfwGetJoystickUserPointer(int jid); + +/*! @brief Returns whether the specified joystick has a gamepad mapping. + * + * This function returns whether the specified joystick is both present and has + * a gamepad mapping. + * + * If the specified joystick is present but does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check if a joystick is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickIsGamepad(int jid); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * For joystick connection and disconnection events to be delivered on all + * platforms, you need to call one of the [event processing](@ref events) + * functions. Joystick disconnection may also be detected and the callback + * called by joystick functions. The function will then return whatever it + * returns if the joystick is not present. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(int jid, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWjoystickfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); + +/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. + * + * This function parses the specified ASCII encoded string and updates the + * internal list with any gamepad mappings it finds. This string may + * contain either a single gamepad mapping or many mappings separated by + * newlines. The parser supports the full format of the `gamecontrollerdb.txt` + * source file including empty lines and comments. + * + * See @ref gamepad_mapping for a description of the format. + * + * If there is already a gamepad mapping for a given GUID in the internal list, + * it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in + * default. + * + * @param[in] string The string containing the gamepad mappings. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * @sa @ref glfwGetGamepadName + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwUpdateGamepadMappings(const char* string); + +/*! @brief Returns the human-readable gamepad name for the specified joystick. + * + * This function returns the human-readable name of the gamepad from the + * gamepad mapping assigned to the specified joystick. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `NULL` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the gamepad, or `NULL` if the + * joystick is not present, does not have a mapping or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, the gamepad mappings are updated or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetGamepadName(int jid); + +/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. + * + * This function retrieves the state of the specified joystick remapped to + * an Xbox-like gamepad. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * The Guide button may not be available for input as it is often hooked by the + * system or the Steam client. + * + * Not all devices have all the buttons or axes provided by @ref + * GLFWgamepadstate. Unavailable buttons and axes will always report + * `GLFW_RELEASE` and 0.0 respectively. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] state The gamepad input state of the joystick. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is + * connected, it has no gamepad mapping or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwUpdateGamepadMappings + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwGetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the GLFW time. + * + * This function returns the current GLFW time, in seconds. Unless the time + * has been set using @ref glfwSetTime it measures time elapsed since GLFW was + * initialized. + * + * This function and @ref glfwSetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current time, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW time. + * + * This function sets the current GLFW time, in seconds. The value must be + * a positive finite number less than or equal to 18446744073.0, which is + * approximately 584.5 years. + * + * This function and @ref glfwGetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of GLFW time is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. A context must only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * When moving a context between threads, you must make it non-current on the + * old thread before making it current on the new one. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) + * hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwGetCurrentContext + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwMakeContextCurrent + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current OpenGL or OpenGL ES + * context, i.e. the number of screen updates to wait from the time @ref + * glfwSwapBuffers was called before swapping the buffers and returning. This + * is sometimes called _vertical synchronization_, _vertical retrace + * synchronization_ or just _vsync_. + * + * A context that supports either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap + * intervals, which allows the driver to swap immediately even if a frame + * arrives a little bit late. You can check for these extensions with @ref + * glfwExtensionSupported. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @remark Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and context + * creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified OpenGL or OpenGL ES + * [core or extension function](@ref context_glext), if it is supported + * by the current context. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader and an ICD have been found. + * + * This function returns whether the Vulkan loader and any minimally functional + * ICD have been found. + * + * The availability of a Vulkan loader and even an ICD does not by itself guarantee that + * surface creation or even instance creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan + * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to + * check whether a queue family of a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contain `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remark Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa @ref glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function currently always returns `GLFW_TRUE`, as the + * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide + * a `vkGetPhysicalDevice*PresentationSupport` type function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader or at least one minimally functional ICD were not found, + * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref + * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether + * Vulkan is at least minimally available. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface cannot be shared with another API so the window must + * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) + * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error + * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE + * + * @remark If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the + * `VK_MVK_macos_surface` extension as a fallback. The name of the selected + * extension, if any, is included in the array returned by @ref + * glfwGetRequiredInstanceExtensions. + * + * @remark @macos This function creates and sets a `CAMetalLayer` instance for + * the window content view, which is required for MoltenVK to function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa @ref glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally + * defined by some gl.h variants (OpenBSD) so define it after if needed. + */ +#ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/Thirdparty/glfw/include/GLFW/glfw3native.h b/Thirdparty/glfw/include/GLFW/glfw3native.h new file mode 100644 index 0000000..7be0227 --- /dev/null +++ b/Thirdparty/glfw/include/GLFW/glfw3native.h @@ -0,0 +1,628 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 Camilla Löwy + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if !defined(GLFW_NATIVE_INCLUDE_NONE) + + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/Thirdparty/glfw/lib-vc2022/glfw3.dll b/Thirdparty/glfw/lib-vc2022/glfw3.dll new file mode 100644 index 0000000000000000000000000000000000000000..733404cf4a8b7e78334d3e6a18acc6c681077e3c GIT binary patch literal 216576 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䞧n4FwwHms&J6i*z1MWHn`e4XD0z;2fchB9+98>D| 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 VRZmtw+45xU$pcTK?*9?|{vY>;ojw2n literal 0 HcmV?d00001 diff --git a/Thirdparty/glfw/lib-vc2022/glfw3.lib b/Thirdparty/glfw/lib-vc2022/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..2a52eb4ebbf7d3c34f4f20022914ae9bb3ef1ccf GIT binary patch literal 634898 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≷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 + + + + +irrKlang: Class List + + + + + + + + +

    +
    +

    Class List

    Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + + + + + + + +
    irrklang::IAudioRecorderInterface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function
    irrklang::IAudioStreamReads and decodes audio data into an usable audio stream for the ISoundEngine
    irrklang::IAudioStreamLoaderClass which is able to create an audio file stream from a file
    irrklang::ICapturedAudioDataReceiverInterface to be implemented by the user if access to the recorded audio data is needed
    irrklang::IFileFactoryInterface to overwrite file access in irrKlang
    irrklang::IFileReaderInterface providing read acess to a file
    irrklang::IRefCountedBase class of most objects of the irrKlang
    irrklang::ISoundRepresents a sound which is currently played
    irrklang::ISoundDeviceListA list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list
    irrklang::ISoundEffectControlInterface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound
    irrklang::ISoundEngineInterface to the sound engine, for playing 3d and 2d sound and music
    irrklang::ISoundMixedOutputReceiverInterface to be implemented by the user, which recieves the mixed output when it it played by the sound engine
    irrklang::ISoundSourceA sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings
    irrklang::ISoundStopEventReceiverInterface to be implemented by the user, which recieves sound stop events
    irrklang::IVirtualRefCountedReference counting base class for objects in the Irrlicht Engine similar to IRefCounted
    irrklang::SAudioStreamFormatStructure describing an audio stream format with helper functions
    irrklang::SInternalAudioInterfaceStructure for returning pointers to the internal audio interface
    irrklang::vec3d< T >3d vector template class for representing vectors and points in 3d
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classes.html b/Thirdparty/irrKlang/doc/cpp/classes.html new file mode 100644 index 0000000..251f3e4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classes.html @@ -0,0 +1,85 @@ + + + + + +irrKlang: Alphabetical List + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder-members.html new file mode 100644 index 0000000..7757b4f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder-members.html @@ -0,0 +1,93 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IAudioRecorder Member List

    This is the complete list of members for irrklang::IAudioRecorder, including all inherited members. + + + + + + + + + + + + + +
    addSoundSourceFromRecordedAudio(const char *soundName)=0irrklang::IAudioRecorder [pure virtual]
    clearRecordedAudioDataBuffer()=0irrklang::IAudioRecorder [pure virtual]
    drop()irrklang::IRefCounted [inline]
    getAudioFormat()=0irrklang::IAudioRecorder [pure virtual]
    getDriverName()=0irrklang::IAudioRecorder [pure virtual]
    getRecordedAudioData()=0irrklang::IAudioRecorder [pure virtual]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    isRecording()=0irrklang::IAudioRecorder [pure virtual]
    startRecordingBufferedAudio(ik_s32 sampleRate=22000, ESampleFormat sampleFormat=ESF_S16, ik_s32 channelCount=1)=0irrklang::IAudioRecorder [pure virtual]
    startRecordingCustomHandledAudio(ICapturedAudioDataReceiver *receiver, ik_s32 sampleRate=22000, ESampleFormat sampleFormat=ESF_S16, ik_s32 channelCount=1)=0irrklang::IAudioRecorder [pure virtual]
    stopRecordingAudio()=0irrklang::IAudioRecorder [pure virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb2f19d00f5ad8337fdd01211e63c6de9dbb1481 GIT binary patch literal 1031 zcmV+i1o-<$Nk%w1VU_?;0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0G0qy000C22)Z!-jxh-3qR%QEH6L2Tg&#S3XQ&9Qz_jiHzb(z$@mkBfe)B(H z4ln}_i$a{zs6rBZ&tUWjby}-f=~bJha=+f=GRZ8H&(m?*yhd-s>Nl;?uFKhXcQ?Mr z_w`>6d3JwZSJX|S3Kld(O!pO|#5QK*xoT3y>NKUR$||VhwTCocOo)mgMG~44U(Oahv zJ9FkG<>2VkBDXzW9h&s!A*Nqf22ESEY}U1B+t%%xH)`Khfd0n4n|N>I!+mJI-8y;g z)+46 zzy5y!_x&f}fCLukp8*IOsNjMODu`f!4Mr&8gz!C>AcYua7@>s_YUtsI0(J=Eh$P}C zVu>iGXrGEKwy3~~F2?8~j55|ZA&oZXxFC)?_BbGqJ_gAjkU|z&ACX2TS)r0l>W5^L zPy!g`luJ@+r36o2S!9-42FYcYJ$?yhj$)2kW0_{gh-R8CuF0l~ZoY|PoN|&#XPqG4 z$)YHH_UY%JfCeh)poA7`=%I*Ogr||uEE;5^j`j#?q&ZGXX^oTG5`w0h3dkvbZEdP3 zgPqD}si_i_>R&@g&8I2@tdgob~>+9)}j!rE%9)z}IRF}@B9>#n=1&vi^X z$#U9hu+S(&EU?iE8;~;8Vw){E*iIX(x3y-wj=bcCu!t-`5RtB7^hOHa-9h+BURw%1~NnCRJPr>*wdY>Scr06RY; B4OjpG literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.html new file mode 100644 index 0000000..3998265 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_recorder.html @@ -0,0 +1,368 @@ + + + + + +irrKlang: irrklang::IAudioRecorder Class Reference + + + + + + + + + +
    +

    irrklang::IAudioRecorder Class Reference

    +

    Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function. +More...

    + +

    #include <ik_IAudioRecorder.h>

    +
    +Inheritance diagram for irrklang::IAudioRecorder:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    virtual bool startRecordingBufferedAudio (ik_s32 sampleRate=22000, ESampleFormat sampleFormat=ESF_S16, ik_s32 channelCount=1)=0
     Starts recording audio.
    virtual bool startRecordingCustomHandledAudio (ICapturedAudioDataReceiver *receiver, ik_s32 sampleRate=22000, ESampleFormat sampleFormat=ESF_S16, ik_s32 channelCount=1)=0
     Starts recording audio.
    virtual void stopRecordingAudio ()=0
     Stops recording audio.
    virtual ISoundSourceaddSoundSourceFromRecordedAudio (const char *soundName)=0
     Creates a sound source for the recorded audio data.
    virtual void clearRecordedAudioDataBuffer ()=0
     Clears recorded audio data buffer, freeing memory.
    virtual bool isRecording ()=0
     Returns if the recorder is currently recording audio.
    virtual SAudioStreamFormat getAudioFormat ()=0
     Returns the audio format of the recorded audio data.
    virtual void * getRecordedAudioData ()=0
     Returns a pointer to the recorded audio data.
    virtual const char * getDriverName ()=0
     returns the name of the sound driver, like 'ALSA' for the alsa device.
    +

    Detailed Description

    +

    Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function.

    +

    It creates sound sources into an ISoundEngine which then can be played there. See Recording Audio for an example on how to use this.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + +
    virtual ISoundSource* irrklang::IAudioRecorder::addSoundSourceFromRecordedAudio (const char *  soundName )  [pure virtual]
    +
    +
    + +

    Creates a sound source for the recorded audio data.

    +

    The returned sound source pointer then can be used to play back the recorded audio data using ISoundEngine::play2D(). This method only will succeed if the audio was recorded using startRecordingBufferedAudio() and audio recording is currently stopped.

    +
    Parameters:
    + + +
    soundName Name of the virtual sound file (e.g. "someRecordedAudio"). You can also use this name when calling play3D() or play2D().
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::IAudioRecorder::clearRecordedAudioDataBuffer ( )  [pure virtual]
    +
    +
    + +

    Clears recorded audio data buffer, freeing memory.

    +

    This method will only succeed if audio recording is currently stopped.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual SAudioStreamFormat irrklang::IAudioRecorder::getAudioFormat ( )  [pure virtual]
    +
    +
    + +

    Returns the audio format of the recorded audio data.

    +

    Also contains informations about the length of the recorded audio stream.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual const char* irrklang::IAudioRecorder::getDriverName ( )  [pure virtual]
    +
    +
    + +

    returns the name of the sound driver, like 'ALSA' for the alsa device.

    +

    Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM", "DirectSound" and "DirectSound8".

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void* irrklang::IAudioRecorder::getRecordedAudioData ( )  [pure virtual]
    +
    +
    + +

    Returns a pointer to the recorded audio data.

    +

    This method will only succeed if audio recording is currently stopped and something was recorded previously using startRecordingBufferedAudio(). The lenght of the buffer can be retrieved using getAudioFormat().getSampleDataSize(). Note that the pointer is only valid as long as not clearRecordedAudioDataBuffer() is called or another sample is recorded.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::IAudioRecorder::isRecording ( )  [pure virtual]
    +
    +
    + +

    Returns if the recorder is currently recording audio.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::IAudioRecorder::startRecordingBufferedAudio (ik_s32  sampleRate = 22000,
    ESampleFormat  sampleFormat = ESF_S16,
    ik_s32  channelCount = 1 
    ) [pure virtual]
    +
    +
    + +

    Starts recording audio.

    +

    Clears all possibly previously recorded buffered audio data and starts to record. When finished recording audio data, call stopRecordingAudio(). All recorded audio data gets stored into an internal audio buffer, which can then be accessed for example using addSoundSourceFromRecordedAudio() or getRecordedAudioData(). For recording audio data not into an internal audio buffer, use startRecordingCustomHandledAudio().

    +
    Parameters:
    + + + + +
    sampleRate,: Sample rate of the recorded audio.
    sampleFormat,: Sample format of the recorded audio.
    channelCount,: Amount of audio channels.
    +
    +
    +
    Returns:
    Returns true if successfully started recording and false if not.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::IAudioRecorder::startRecordingCustomHandledAudio (ICapturedAudioDataReceiver receiver,
    ik_s32  sampleRate = 22000,
    ESampleFormat  sampleFormat = ESF_S16,
    ik_s32  channelCount = 1 
    ) [pure virtual]
    +
    +
    + +

    Starts recording audio.

    +

    Clears all possibly previously recorded buffered audio data and starts to record audio data, which is delivered to a custom user callback interface. When finished recording audio data, call stopRecordingAudio(). If instead of recording the data to the receiver interface recording into a managed buffer is wished, use startRecordingBufferedAudio() instead.

    +
    Parameters:
    + + + + + +
    receiver,: Interface to be implemented by the user, gets called once for each captured audio data chunk.
    sampleRate,: Sample rate of the recorded audio.
    sampleFormat,: Sample format of the recorded audio.
    channelCount,: Amount of audio channels.
    +
    +
    +
    Returns:
    Returns true if successfully started recording and false if not.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::IAudioRecorder::stopRecordingAudio ( )  [pure virtual]
    +
    +
    + +

    Stops recording audio.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream-members.html new file mode 100644 index 0000000..25dc102 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream-members.html @@ -0,0 +1,89 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IAudioStream Member List

    This is the complete list of members for irrklang::IAudioStream, including all inherited members. + + + + + + + + + +
    drop()irrklang::IRefCounted [inline]
    getFormat()=0irrklang::IAudioStream [pure virtual]
    getIsSeekingSupported()irrklang::IAudioStream [inline, virtual]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    readFrames(void *target, ik_s32 frameCountToRead)=0irrklang::IAudioStream [pure virtual]
    setPosition(ik_s32 pos)=0irrklang::IAudioStream [pure virtual]
    ~IAudioStream()irrklang::IAudioStream [inline, virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b153d40a3e430f898f13cf2c3099346662be280 GIT binary patch literal 788 zcmV+v1MB=pNk%w1VTb@w0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0Ehrk000C2IJ(^aFv>}*y?BVtyZ>M)j$~<`=&7V^>%MR-ta5GNcu41b@2i@h za5&t30wrWeiBkriPf~OPWx}i?Y{%HbYGux4R?PXP%pNqCEI@|c)Hrq8Zd;?~aJf8% z%0YgAZ%%!5c6B;IfP9Q~OnQiYa*~mMm6Lmmn3H;toob3lnSytsh?l2nbAhLxA&-Kw zsIG})mXD>Yw6L1Ic7eXCo3ot2qaSOdxsI8<&c|fATET3)&6ctt$=R)&&)#{rvdhGg z*4^eJ+vwSFtIVXAoz-++tiMa{&V+aF+Mz^7pb1ED!@7Xf3Mw=Ra3Ma25N9-uNYUZJ ziWr4l%*g&R$HtBzWqb@tvPFiIC{wCjnG%4@moQ_>oJq5$&6_R_;M~cxr_Y~2gWl9B zw5ZXeNRJv=nzX6Yr%sm=g-W%mRhm+nUfs&|Y1XM-!-@?GcC6X6L(!^TE3+)yw`1MH zox4>o-Mdij;@yi>FW zKhq5@8ZPP5Y)_+Bt9td>)~@5mP7Hf?*V<~U=-$n{x9{J;g9{%{yf|;$gP$N5tbF<3 z=Fay*kA8Q$%K$jB!_@AS`*ok%z00ifQan`aJjI(o>K*%fn(w#E2M|9gdhYJO=coVu zI@@&j?d><7eC?H2-hTM~H(qlHP6vg7;mvg4ffVwGUw{137h#4B_IDwMABMN#hZ@F| zAc!cIsGNBdVwhox2AY^6i87}6;)WdB=wFOC@)+ZY3l8Ywi9C|mvY_~48`>ewWR zMk)#9ixtjC<%JlmY%Xr-Of%S!Hh2nOL7yG&YJ}SW7m#sHJaBiYZ!}ZfaJio{9x( Ss9hOn>Zz!vsw%1p002APDx13i literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.html new file mode 100644 index 0000000..727a97d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream.html @@ -0,0 +1,239 @@ + + + + + +irrKlang: irrklang::IAudioStream Class Reference + + + + + + + + + +
    +

    irrklang::IAudioStream Class Reference

    +

    Reads and decodes audio data into an usable audio stream for the ISoundEngine. +More...

    + +

    #include <ik_IAudioStream.h>

    +
    +Inheritance diagram for irrklang::IAudioStream:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + + + + + +

    Public Member Functions

    virtual ~IAudioStream ()
     destructor
    virtual SAudioStreamFormat getFormat ()=0
     returns format of the audio stream
    virtual bool setPosition (ik_s32 pos)=0
     sets the position of the audio stream.
    virtual bool getIsSeekingSupported ()
     returns true if the audio stream is seekable
    virtual ik_s32 readFrames (void *target, ik_s32 frameCountToRead)=0
     tells the audio stream to read frameCountToRead audio frames into the specified buffer
    +

    Detailed Description

    +

    Reads and decodes audio data into an usable audio stream for the ISoundEngine.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::IAudioStream::~IAudioStream ( )  [inline, virtual]
    +
    +
    + +

    destructor

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual SAudioStreamFormat irrklang::IAudioStream::getFormat ( )  [pure virtual]
    +
    +
    + +

    returns format of the audio stream

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::IAudioStream::getIsSeekingSupported ( )  [inline, virtual]
    +
    +
    + +

    returns true if the audio stream is seekable

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual ik_s32 irrklang::IAudioStream::readFrames (void *  target,
    ik_s32  frameCountToRead 
    ) [pure virtual]
    +
    +
    + +

    tells the audio stream to read frameCountToRead audio frames into the specified buffer

    +
    Parameters:
    + + + +
    target,: Target data buffer to the method will write the read frames into. The specified buffer will be at least getFormat().getFrameSize()*frameCountToRead bytes big.
    frameCountToRead,: amount of frames to be read.
    +
    +
    +
    Returns:
    Returns amount of frames really read. Should be frameCountToRead in most cases.
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::IAudioStream::setPosition (ik_s32  pos )  [pure virtual]
    +
    +
    + +

    sets the position of the audio stream.

    +

    For example to let the stream be read from the beginning of the file again, setPosition(0) would be called. This is usually done be the sound engine to loop a stream after if has reached the end. Return true if sucessful and 0 if not.

    +
    Parameters:
    + + +
    pos,: Position in frames.
    +
    +
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader-members.html new file mode 100644 index 0000000..372cf6e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader-members.html @@ -0,0 +1,87 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IAudioStreamLoader Member List

    This is the complete list of members for irrklang::IAudioStreamLoader, including all inherited members. + + + + + + + +
    createAudioStream(IFileReader *file)=0irrklang::IAudioStreamLoader [pure virtual]
    drop()irrklang::IRefCounted [inline]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    isALoadableFileExtension(const ik_c8 *fileName)=0irrklang::IAudioStreamLoader [pure virtual]
    ~IAudioStreamLoader()irrklang::IAudioStreamLoader [inline, virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..57bd20d37fbff5f82fe6894aa1a3291a84d0cf90 GIT binary patch literal 876 zcmV-y1C#tmNk%w1VXy#D0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0I&d1000C2IJ(^aFv>}*y*O(py8mD(j$~<`XsWJk>nUz5&vb3a@U8EB?{~SM za7Ziy2gamwi9_xJC+J72lLoF=Q?`Sp%Dg0SEvN*GY1V02?K!X9Ab68Ug{JM?Ja;Rw zd$Vq7ZEagvdLo90cUFabeRw-$Hg%MFb&7j>jGCN-eV&(yprC?+pQnyCk~N`ck14r_Y~2g9;r= zw5ZXeMGYWb%CxD|r%(;Me!-}=qwd&ZjXw!-<>s77Ww{V-X zH5<3C-Me(}>fM_*FW`kD%sBDl#*ha;j!b#)}rUdN}dZ#*dFquKY9e z=A55%?n1q~_3PNPYv0bjyZ7(l!*7S~`wIEp=Fi_wubwvh_Oajh3~-eGPy1T&&u?m9 zfBw)eKKX~0fKL%m?4P&rKjS1Sd{1?iub{2qlxpuh~tMOrpTj-8KT(Vj6+U1;`=Zb|+380<`#%U#)aP~=}lYT-9X{2si`sJ8?UV5UOVsdI| zphOyYB%7sTYG<6661i!oc_!*;m!e8KVvM))=<1(M*7@h4gl0)6u(*yIETT2OG$`n& zHSSd*d<;Gd)~wKGg`ir%R-2!++G2KXx1fCsZfD|-n_0Q$RwmxM?6&LfyYRZ3002A5 CfYP)8 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.html new file mode 100644 index 0000000..f126989 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_audio_stream_loader.html @@ -0,0 +1,175 @@ + + + + + +irrKlang: irrklang::IAudioStreamLoader Class Reference + + + + + + + + + +
    +

    irrklang::IAudioStreamLoader Class Reference

    +

    Class which is able to create an audio file stream from a file. +More...

    + +

    #include <ik_IAudioStreamLoader.h>

    +
    +Inheritance diagram for irrklang::IAudioStreamLoader:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + +

    Public Member Functions

    virtual ~IAudioStreamLoader ()
     destructor
    virtual bool isALoadableFileExtension (const ik_c8 *fileName)=0
     Returns true if the file maybe is able to be loaded by this class.
    virtual IAudioStreamcreateAudioStream (IFileReader *file)=0
     Creates an audio file input stream from a file.
    +

    Detailed Description

    +

    Class which is able to create an audio file stream from a file.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::IAudioStreamLoader::~IAudioStreamLoader ( )  [inline, virtual]
    +
    +
    + +

    destructor

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + +
    virtual IAudioStream* irrklang::IAudioStreamLoader::createAudioStream (IFileReader file )  [pure virtual]
    +
    +
    + +

    Creates an audio file input stream from a file.

    +
    Returns:
    Pointer to the created audio stream. Returns 0 if loading failed. If you no longer need the stream, you should call IAudioFileStream::drop(). See IRefCounted::drop() for more information.
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::IAudioStreamLoader::isALoadableFileExtension (const ik_c8 fileName )  [pure virtual]
    +
    +
    + +

    Returns true if the file maybe is able to be loaded by this class.

    +

    This decision should be based only on the file extension (e.g. ".wav"). The given filename string is guaranteed to be lower case.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver-members.html new file mode 100644 index 0000000..9077d4a --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver-members.html @@ -0,0 +1,85 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ICapturedAudioDataReceiver Member List

    This is the complete list of members for irrklang::ICapturedAudioDataReceiver, including all inherited members. + + + + + +
    drop()irrklang::IRefCounted [inline]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    OnReceiveAudioDataStreamChunk(unsigned char *audioData, unsigned long lengthInBytes)=0irrklang::ICapturedAudioDataReceiver [pure virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_captured_audio_data_receiver.gif new file mode 100644 index 0000000000000000000000000000000000000000..3db3a079f49ac8c6e741345bffaf8a3f6bff2680 GIT binary patch literal 999 zcmV}*y*TU5v-n^rj$~<`XsWJk>%MTjDspY#c&_g|&Huol za5(f4kI1AFXc)cj_=ew1aP3J0zs%D+jwyqXE2f6rqB5Fk2=}z%rqe_)v?c zX7d8_$fN$Tqlt_j%{UB6k_5<-FCwB`xs0XDmqAX#oJsTJz?wL7rjV(#r%RqbgOcn( zw5ZXeNRujEssMn~r%ajQ-Me`6TAiy_uiw9b18?O^SFqv3i1QNeo4B##$7C5po=my&RLPbzYi^8rv**ux zJA)ogx~=Has8feMt-7`As;pnjmK}Sx?bNkz>js^Bx9`loe+!2ke7JGM#g8iooP4=+ zyv?6WhZ}vm^|jTnYmdCWyJGL)>t+v69(MWjXvd>puYUdc_U_5Uj}Lynb29kz>)+46 zzyAOK00t=FfCLt3;DHEwLEnN|Dahc1R5=LYgilFG;e-}m_+W+r1b~%?P=UCXh#h|M z6^Ub^h~iZsu2>-%ELMe|SuTRbVS`cCm|}$?dZnX}J^q;Ehds(@B#()4D58fgcIf1j zOG?Nji3--(WQ0q@|`B;;gRbnJJ={+F7KIv6jjxoV<1#tEs}iuWD?u z!R}ftv8yiIW{$Yp*=4QK+WKpRl(IVPkiGVr?YQ738}6vCrVHwvW8V6ywY17gtCgIN z>*$}SHkz)!P}og VAFW-2OgHWH(@;k(HPZ + + + + +irrKlang: irrklang::ICapturedAudioDataReceiver Class Reference + + + + + + + + + +
    +

    irrklang::ICapturedAudioDataReceiver Class Reference

    +

    Interface to be implemented by the user if access to the recorded audio data is needed. +More...

    + +

    #include <ik_IAudioRecorder.h>

    +
    +Inheritance diagram for irrklang::ICapturedAudioDataReceiver:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + +

    Public Member Functions

    virtual void OnReceiveAudioDataStreamChunk (unsigned char *audioData, unsigned long lengthInBytes)=0
     Gets called once for each captured audio data chunk.
    +

    Detailed Description

    +

    Interface to be implemented by the user if access to the recorded audio data is needed.

    +

    Is used as parameter in IAudioRecorder::startRecordingCustomHandledAudio.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ICapturedAudioDataReceiver::OnReceiveAudioDataStreamChunk (unsigned char *  audioData,
    unsigned long  lengthInBytes 
    ) [pure virtual]
    +
    +
    + +

    Gets called once for each captured audio data chunk.

    +

    See IAudioRecorder::startRecordingCustomHandledAudio for details.

    +
    Parameters:
    + + + +
    audioData,: Pointer to a part of the recorded audio data
    lengthInBytes,: Amount of bytes in the audioData buffer.
    +
    +
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory-members.html new file mode 100644 index 0000000..4e78302 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory-members.html @@ -0,0 +1,86 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IFileFactory Member List

    This is the complete list of members for irrklang::IFileFactory, including all inherited members. + + + + + + +
    createFileReader(const ik_c8 *filename)=0irrklang::IFileFactory [pure virtual]
    drop()irrklang::IRefCounted [inline]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    ~IFileFactory()irrklang::IFileFactory [inline, virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_factory.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f7d81db628a910e20a59ac5808914b3a17cb0a9 GIT binary patch literal 966 zcmV;%13COhNk%w1VS)fq0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0D=He000C22)Z!-jxh-3qR%QEH6L2Tg&#R;LMkxoy0oksr?acTubk7n4d6Fj zkT>)Jf5KvI*<&i3(5Dnhq#BdQY|`rFM!i#QReT*|&*roZMDDh~?=ZSdch4__IC!t` z-{F69Y7==x0b~I=hjxPthXMhSkz$dKl8khTa*HnxjY^s-nu2vNkE4)jqX3U9p@Cel zsxfRVkF2aIhlz=)kd~ahx2(Hni?6|xkd?W{%+0^Klf)@ZrR|;_mC!Q&gj^*vjT$q+{1=Rf}|z`VmCJX^296y>1Qsw=Lk7 zgN|f`ns)wgStVcZ3O1SeFJVW6?3z6cHZP$%Xlr8K7}hJ*%8U@_y~7caM^7IjLCv&x zZzVm99r5sFXd~#)n?+sKG*mHaK$`q49wSForB-?Xl~U~rO<}TP551iNOSa%geB_={ zYg%llzPXm*{_s?a6eb3({sQ{M2bPvvgZmbyv5~MJ$A%;O@SE6)B*>T*Kh}IvGUv>K zDT`jLm~?2BU$N-8es>ouCCcX%xh%(OTVU0Fwh+~cx?#QErKK|%nkU}a*WRVCSi6ntaF8N=R zPEHu5i&LfuWtHT!ObJd30u{r+n#PH>f#;vUjH=fAYd;KhFpQn4}scYJsNIK$@vsmvkzs zIhej9!K36@LaL|zr1~c@lg7HKtgoKR>aC_y%BZQA&bn)^tL(|?uzAK+DXo3Rj>##m zxq8a0s?8z$}X_wb?=on6u4VYc8{kdMm52*wTtFxuu@UuC&_j zN^D5!hWqNdzSgR#wYa&YV>|n( + + + + +irrKlang: irrklang::IFileFactory Class Reference + + + + + + + + + +
    +

    irrklang::IFileFactory Class Reference

    +

    Interface to overwrite file access in irrKlang. +More...

    + +

    #include <ik_IFileFactory.h>

    +
    +Inheritance diagram for irrklang::IFileFactory:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + +

    Public Member Functions

    virtual ~IFileFactory ()
    virtual IFileReadercreateFileReader (const ik_c8 *filename)=0
     Opens a file for read access.
    +

    Detailed Description

    +

    Interface to overwrite file access in irrKlang.

    +

    Derive your own class from IFileFactory, overwrite the createFileReader() method and return your own implemented IFileReader to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::IFileFactory::~IFileFactory ( )  [inline, virtual]
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + +
    virtual IFileReader* irrklang::IFileFactory::createFileReader (const ik_c8 filename )  [pure virtual]
    +
    +
    + +

    Opens a file for read access.

    +

    Derive your own class from IFileFactory, overwrite this method and return your own implemented IFileReader to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.

    +
    Parameters:
    + + +
    filename Name of file to open.
    +
    +
    +
    Returns:
    Returns a pointer to the created file interface. The returned pointer should be dropped when no longer needed. See IRefCounted::drop() for more information. Returns 0 if file cannot be opened.
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader-members.html new file mode 100644 index 0000000..56d07e0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader-members.html @@ -0,0 +1,90 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IFileReader Member List

    This is the complete list of members for irrklang::IFileReader, including all inherited members. + + + + + + + + + + +
    drop()irrklang::IRefCounted [inline]
    getFileName()=0irrklang::IFileReader [pure virtual]
    getPos()=0irrklang::IFileReader [pure virtual]
    getSize()=0irrklang::IFileReader [pure virtual]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    read(void *buffer, ik_u32 sizeToRead)=0irrklang::IFileReader [pure virtual]
    seek(ik_s32 finalPos, bool relativeMovement=false)=0irrklang::IFileReader [pure virtual]
    ~IFileReader()irrklang::IFileReader [inline, virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9d8667fd1a3275fe5defae1ec666b6fa750ba04 GIT binary patch literal 961 zcmV;y13vsmNk%w1VS)fq0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0D=He000C22)Z!-jxh-3qR%QEH6L2Tg&#R;LMkxoy0oksr?acTubk7n4d6Fj zkT>)Jf5KvI*<&i3(5Dnhq#BdQY|`rFM!i#QReT*|&*roZMDDh~?=ZSdch4__IC!t` z-{F69Y7==x0b~I=hjxPthXMhSkz$dKl8khTa*HnxjY^s-nu2vNkE4)jqX3U9p@Cel zsxfRVkF2aIhlz=)kd~ahx2(Hni?6|xkd?W{%+0^Klf)@ZrR|;_mC!Q&gj^*vjT$q+{1=Rf}|z`VmCJX^296y>1Qsw=Lk7 zgN|f`ns)wgStVcZ3O1SeFJVW6?3z6cHZP$%Xlr8K7}hJ*%8U@_y~7caM^7IjLCv&x zZzVm99r5sFXd~#)n?+sKG*mHaK$`q49wSForB-?Xl~U~rO<}TP551iNOSa%geB_={ zYg%llzPXm*{_s?a6eb3({sQ{M2bPvvgZmbyv5~MJ$A%;O@SE6)B*>T*Kh}IvGUv>K zDT`jLm~?2BU$N-8es>ouCCcX%xh%(OTVU0Fwh+~cx?#QErKK|%nkU}a*WRVCSi6ntaF8N=R zPEHu5i&LfuWtHXp*-lcXV#2r+n#PH>f#|2rB5J{rt%bqy0Q13}BOLkf;TlQq$88xEN=%-Rg4*gTd)~?@sS@;QsjYDxi9774 ztm?YxuA2H}xaZEwE4Jmb zJFK;?s(Wg>z~1X`NZdY)YQ6qeI;pdn;+n0k%HAv2C9WFmuBOixSn-mD`X_Fh8Ef1z j#uwK~;Kw5WM{>#ios2SmDz7}>nJ~vJ^UO4pnE(Jg_jT(y literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.html new file mode 100644 index 0000000..d31686d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_file_reader.html @@ -0,0 +1,260 @@ + + + + + +irrKlang: irrklang::IFileReader Class Reference + + + + + + + + + +
    +

    irrklang::IFileReader Class Reference

    +

    Interface providing read acess to a file. +More...

    + +

    #include <ik_IFileReader.h>

    +
    +Inheritance diagram for irrklang::IFileReader:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + +

    Public Member Functions

    virtual ~IFileReader ()
    virtual ik_s32 read (void *buffer, ik_u32 sizeToRead)=0
    virtual bool seek (ik_s32 finalPos, bool relativeMovement=false)=0
    virtual ik_s32 getSize ()=0
    virtual ik_s32 getPos ()=0
    virtual const ik_c8getFileName ()=0
    +

    Detailed Description

    +

    Interface providing read acess to a file.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::IFileReader::~IFileReader ( )  [inline, virtual]
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual const ik_c8* irrklang::IFileReader::getFileName ( )  [pure virtual]
    +
    +
    +

    Returns name of file.

    +
    Returns:
    Returns the file name as zero terminated character string.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_s32 irrklang::IFileReader::getPos ( )  [pure virtual]
    +
    +
    +

    Returns the current position in the file.

    +
    Returns:
    Returns the current position in the file in bytes.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_s32 irrklang::IFileReader::getSize ( )  [pure virtual]
    +
    +
    +

    Returns size of file.

    +
    Returns:
    Returns the size of the file in bytes.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual ik_s32 irrklang::IFileReader::read (void *  buffer,
    ik_u32  sizeToRead 
    ) [pure virtual]
    +
    +
    +

    Reads an amount of bytes from the file.

    +
    Parameters:
    + + + +
    buffer,: Pointer to buffer where to read bytes will be written to.
    sizeToRead,: Amount of bytes to read from the file.
    +
    +
    +
    Returns:
    Returns how much bytes were read.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::IFileReader::seek (ik_s32  finalPos,
    bool  relativeMovement = false 
    ) [pure virtual]
    +
    +
    +

    Changes position in file, returns true if successful.

    +
    Parameters:
    + + + +
    finalPos,: Destination position in the file.
    relativeMovement,: If set to true, the position in the file is changed relative to current position. Otherwise the position is changed from beginning of file.
    +
    +
    +
    Returns:
    Returns true if successful, otherwise false.
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted-members.html new file mode 100644 index 0000000..455ee9a --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted-members.html @@ -0,0 +1,84 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IRefCounted Member List

    This is the complete list of members for irrklang::IRefCounted, including all inherited members. + + + + +
    drop()irrklang::IRefCounted [inline]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.gif new file mode 100644 index 0000000000000000000000000000000000000000..32f145caeec50101619f89027c2e4cb5dc3adcd3 GIT binary patch literal 4695 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 Zmdn&o?Xgci)sJ)1z8K0{J+cV^06V2spwj>V literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.html new file mode 100644 index 0000000..97755a4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_ref_counted.html @@ -0,0 +1,205 @@ + + + + + +irrKlang: irrklang::IRefCounted Class Reference + + + + + + + + + +
    +

    irrklang::IRefCounted Class Reference

    +

    Base class of most objects of the irrKlang. +More...

    + +

    #include <ik_IRefCounted.h>

    +
    +Inheritance diagram for irrklang::IRefCounted:
    +
    +
    + + +irrklang::IAudioRecorder +irrklang::IAudioStream +irrklang::IAudioStreamLoader +irrklang::ICapturedAudioDataReceiver +irrklang::IFileFactory +irrklang::IFileReader +irrklang::ISoundDeviceList +irrklang::ISoundEngine + +
    +
    + +

    List of all members.

    + + + + + + + + +

    Public Member Functions

     IRefCounted ()
     Constructor.
    virtual ~IRefCounted ()
     Destructor.
    void grab ()
    bool drop ()
    +

    Detailed Description

    +

    Base class of most objects of the irrKlang.

    +

    This class provides reference counting through the methods grab() and drop(). It also is able to store a debug string for every instance of an object. Most objects of irrKlang are derived from IRefCounted, and so they are reference counted.

    +

    When you receive an object in irrKlang (for example an ISound using play2D() or play3D()), and you no longer need the object, you have to call drop(). This will destroy the object, if grab() was not called in another part of you program, because this part still needs the object. Note, that you only don't need to call drop() for all objects you receive, it will be explicitely noted in the documentation.

    +

    A simple example:

    +

    If you want to play a sound, you may want to call the method ISoundEngine::play2D. You call ISound* mysound = engine->play2D("foobar.mp3", false, false true); If you no longer need the sound interface, call mysound->drop(). The sound may still play on after this because the engine still has a reference to that sound, but you can be sure that it's memory will be released as soon the sound is no longer used.

    +

    If you want to add a sound source, you may want to call a method ISoundEngine::addSoundSourceFromFile. You do this like ISoundSource* mysource = engine->addSoundSourceFromFile("example.jpg"); You will not have to drop the pointer to the source, because sound sources are managed by the engine (it will live as long as the sound engine) and the documentation says so.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    irrklang::IRefCounted::IRefCounted ( )  [inline]
    +
    +
    + +

    Constructor.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual irrklang::IRefCounted::~IRefCounted ( )  [inline, virtual]
    +
    +
    + +

    Destructor.

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    bool irrklang::IRefCounted::drop ( )  [inline]
    +
    +
    +

    When you receive an object in irrKlang (for example an ISound using play2D() or play3D()), and you no longer need the object, you have to call drop(). This will destroy the object, if grab() was not called in another part of you program, because this part still needs the object. Note, that you only don't need to call drop() for all objects you receive, it will be explicitely noted in the documentation.

    +

    A simple example:

    +

    If you want to play a sound, you may want to call the method ISoundEngine::play2D. You call ISound* mysound = engine->play2D("foobar.mp3", false, false true); If you no longer need the sound interface, call mysound->drop(). The sound may still play on after this because the engine still has a reference to that sound, but you can be sure that it's memory will be released as soon the sound is no longer used.

    + +
    +
    + +
    +
    + + + + + + + + +
    void irrklang::IRefCounted::grab ( )  [inline]
    +
    +
    +

    Grabs the object. Increments the reference counter by one. Someone who calls grab() to an object, should later also call drop() to it. If an object never gets as much drop() as grab() calls, it will never be destroyed. The IRefCounted class provides a basic reference counting mechanism with its methods grab() and drop(). Most objects of irrklang are derived from IRefCounted, and so they are reference counted.

    +

    When you receive an object in irrKlang (for example an ISound using play2D() or play3D()), and you no longer need the object, you have to call drop(). This will destroy the object, if grab() was not called in another part of you program, because this part still needs the object. Note, that you only don't need to call drop() for all objects you receive, it will be explicitely noted in the documentation.

    +

    A simple example:

    +

    If you want to play a sound, you may want to call the method ISoundEngine::play2D. You call ISound* mysound = engine->play2D("foobar.mp3", false, false true); If you no longer need the sound interface, call mysound->drop(). The sound may still play on after this because the engine still has a reference to that sound, but you can be sure that it's memory will be released as soon the sound is no longer used.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound-members.html new file mode 100644 index 0000000..2ce5ba3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound-members.html @@ -0,0 +1,109 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISound Member List

    This is the complete list of members for irrklang::ISound, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    drop()=0irrklang::IVirtualRefCounted [pure virtual]
    getIsPaused()=0irrklang::ISound [pure virtual]
    getMaxDistance()=0irrklang::ISound [pure virtual]
    getMinDistance()=0irrklang::ISound [pure virtual]
    getPan()=0irrklang::ISound [pure virtual]
    getPlaybackSpeed()=0irrklang::ISound [pure virtual]
    getPlayLength()=0irrklang::ISound [pure virtual]
    getPlayPosition()=0irrklang::ISound [pure virtual]
    getPosition()=0irrklang::ISound [pure virtual]
    getSoundEffectControl()=0irrklang::ISound [pure virtual]
    getSoundSource()=0irrklang::ISound [pure virtual]
    getVelocity()=0irrklang::ISound [pure virtual]
    getVolume()=0irrklang::ISound [pure virtual]
    grab()=0irrklang::IVirtualRefCounted [pure virtual]
    isFinished()=0irrklang::ISound [pure virtual]
    isLooped()=0irrklang::ISound [pure virtual]
    setIsLooped(bool looped)=0irrklang::ISound [pure virtual]
    setIsPaused(bool paused=true)=0irrklang::ISound [pure virtual]
    setMaxDistance(ik_f32 max)=0irrklang::ISound [pure virtual]
    setMinDistance(ik_f32 min)=0irrklang::ISound [pure virtual]
    setPan(ik_f32 pan)=0irrklang::ISound [pure virtual]
    setPlaybackSpeed(ik_f32 speed=1.0f)=0irrklang::ISound [pure virtual]
    setPlayPosition(ik_u32 pos)=0irrklang::ISound [pure virtual]
    setPosition(vec3df position)=0irrklang::ISound [pure virtual]
    setSoundStopEventReceiver(ISoundStopEventReceiver *reciever, void *userData=0)=0irrklang::ISound [pure virtual]
    setVelocity(vec3df vel)=0irrklang::ISound [pure virtual]
    setVolume(ik_f32 volume)=0irrklang::ISound [pure virtual]
    stop()=0irrklang::ISound [pure virtual]
    ~IVirtualRefCounted()irrklang::IVirtualRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..10d9d7089e4e2e6251e99118fb993be0936040c5 GIT binary patch literal 821 zcmV-51IqkINk%w1VW$940P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0H**@000C2IJ(^aFv>}*y*OXNyZ>M)j$~<`XsWKJ!oF}U&ot}Sc&_jJ&Huol zu;UvVk4ROK6EHPB&)hT0tb(XcW?+lGM!8*9_zGI0u;bYDlNPkeZs>?gpS`Uf^EV!E zuK8|T9e#9vB71myV1QqOR&`oaj%i$jmVJ_$P=+6RgN;>)qJNT)iI5rgtIM*!U7oF=sEf#`%9fDTiIv6M+{wVF+F*ag z(7KAu-Rom@+0NqS>(hto<+S0QxYy{+_wicl@ec{ zbg0pz9CjjIic=}mrz$l_ol3Q;)vHtiXx+-StJkk!!-^eCwyS}%Xw#})%eJlCw`I@5 zolCc_-MecI=*7#ouiw9D^~wcIxUk{5g7+R?%((H_#Dg76o?JLG<;$4wTF%V5b6(G& zL&p_Ox-{3#rc-A|t-7^j)~;h8hAq4HU)r{FYu3#hFz(*K+5Qere01^SZigdZeww*+ z)+46 zzx@36$ZY}OaRLrVT!97xhhT!dEm&9pWI@Q4gm+O023`~%=3r(S0?;8{5@z_}TO$It zp@~~T7@~(PwrC-ODvGEgSSx;aAGMZV^#KrW{W!J z2Squ*4RdUjhI-Lk+Kp literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.html new file mode 100644 index 0000000..1353932 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound.html @@ -0,0 +1,714 @@ + + + + + +irrKlang: irrklang::ISound Class Reference + + + + + + + + + +
    +

    irrklang::ISound Class Reference

    +

    Represents a sound which is currently played. +More...

    + +

    #include <ik_ISound.h>

    +
    +Inheritance diagram for irrklang::ISound:
    +
    +
    + + +irrklang::IVirtualRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    virtual ISoundSourcegetSoundSource ()=0
     returns source of the sound which stores the filename and other informations about that sound
    virtual void setIsPaused (bool paused=true)=0
     returns if the sound is paused
    virtual bool getIsPaused ()=0
     returns if the sound is paused
    virtual void stop ()=0
     Will stop the sound and free its resources.
    virtual ik_f32 getVolume ()=0
     returns volume of the sound, a value between 0 (mute) and 1 (full volume).
    virtual void setVolume (ik_f32 volume)=0
     sets the volume of the sound, a value between 0 (mute) and 1 (full volume).
    virtual void setPan (ik_f32 pan)=0
     sets the pan of the sound. Takes a value between -1 and 1, 0 is center.
    virtual ik_f32 getPan ()=0
     returns the pan of the sound. Takes a value between -1 and 1, 0 is center.
    virtual bool isLooped ()=0
     returns if the sound has been started to play looped
    virtual void setIsLooped (bool looped)=0
     changes the loop mode of the sound.
    virtual bool isFinished ()=0
     returns if the sound has finished playing.
    virtual void setMinDistance (ik_f32 min)=0
     Sets the minimal distance if this is a 3D sound.
    virtual ik_f32 getMinDistance ()=0
     Returns the minimal distance if this is a 3D sound.
    virtual void setMaxDistance (ik_f32 max)=0
     Sets the maximal distance if this is a 3D sound.
    virtual ik_f32 getMaxDistance ()=0
     Returns the maximal distance if this is a 3D sound.
    virtual void setPosition (vec3df position)=0
     sets the position of the sound in 3d space
    virtual vec3df getPosition ()=0
     returns the position of the sound in 3d space
    virtual void setVelocity (vec3df vel)=0
     sets the position of the sound in 3d space, needed for Doppler effects.
    virtual vec3df getVelocity ()=0
     returns the velocity of the sound in 3d space, needed for Doppler effects.
    virtual ik_u32 getPlayPosition ()=0
     returns the current play position of the sound in milliseconds.
    virtual bool setPlayPosition (ik_u32 pos)=0
     sets the current play position of the sound in milliseconds.
    virtual bool setPlaybackSpeed (ik_f32 speed=1.0f)=0
     Sets the playback speed (frequency) of the sound.
    virtual ik_f32 getPlaybackSpeed ()=0
     Returns the playback speed set by setPlaybackSpeed(). Default: 1.0f.
    virtual ik_u32 getPlayLength ()=0
     returns the play length of the sound in milliseconds.
    virtual ISoundEffectControlgetSoundEffectControl ()=0
     Returns the sound effect control interface for this sound.
    virtual void setSoundStopEventReceiver (ISoundStopEventReceiver *reciever, void *userData=0)=0
     Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.
    +

    Detailed Description

    +

    Represents a sound which is currently played.

    +

    The sound can be stopped, its volume or pan changed, effects added/removed and similar using this interface. Creating sounds is done using ISoundEngine::play2D() or ISoundEngine::play3D(). More informations about the source of a sound can be obtained from the ISoundSource interface.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISound::getIsPaused ( )  [pure virtual]
    +
    +
    + +

    returns if the sound is paused

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISound::getMaxDistance ( )  [pure virtual]
    +
    +
    + +

    Returns the maximal distance if this is a 3D sound.

    +

    See setMaxDistance() for details.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISound::getMinDistance ( )  [pure virtual]
    +
    +
    + +

    Returns the minimal distance if this is a 3D sound.

    +

    See setMinDistance() for details.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISound::getPan ( )  [pure virtual]
    +
    +
    + +

    returns the pan of the sound. Takes a value between -1 and 1, 0 is center.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISound::getPlaybackSpeed ( )  [pure virtual]
    +
    +
    + +

    Returns the playback speed set by setPlaybackSpeed(). Default: 1.0f.

    +

    See setPlaybackSpeed() for details

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_u32 irrklang::ISound::getPlayLength ( )  [pure virtual]
    +
    +
    + +

    returns the play length of the sound in milliseconds.

    +

    Returns -1 if not known for this sound for example because its decoder does not support length reporting or it is a file stream of unknown size. Note: You can also use ISoundSource::getPlayLength() to get the length of a sound without actually needing to play it.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_u32 irrklang::ISound::getPlayPosition ( )  [pure virtual]
    +
    +
    + +

    returns the current play position of the sound in milliseconds.

    +
    Returns:
    Returns -1 if not implemented or possible for this sound for example because it already has been stopped and freed internally or similar.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual vec3df irrklang::ISound::getPosition ( )  [pure virtual]
    +
    +
    + +

    returns the position of the sound in 3d space

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ISoundEffectControl* irrklang::ISound::getSoundEffectControl ( )  [pure virtual]
    +
    +
    + +

    Returns the sound effect control interface for this sound.

    +

    Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can be controlled using this. The interface pointer is only valid as long as the ISound pointer is valid. If the ISound pointer gets dropped (IVirtualRefCounted::drop()), the ISoundEffects may not be used any more.

    +
    Returns:
    Returns a pointer to the sound effects interface if available. The sound has to be started via ISoundEngine::play2D() or ISoundEngine::play3D(), with the flag enableSoundEffects=true, otherwise 0 will be returned. Note that if the output driver does not support sound effects, 0 will be returned as well.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ISoundSource* irrklang::ISound::getSoundSource ( )  [pure virtual]
    +
    +
    + +

    returns source of the sound which stores the filename and other informations about that sound

    +
    Returns:
    Returns the sound source poitner of this sound. May return 0 if the sound source has been removed.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual vec3df irrklang::ISound::getVelocity ( )  [pure virtual]
    +
    +
    + +

    returns the velocity of the sound in 3d space, needed for Doppler effects.

    +

    To use doppler effects use ISound::setVelocity to set a sounds velocity, ISoundEngine::setListenerPosition() to set the listeners velocity and ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing the doppler effects intensity.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISound::getVolume ( )  [pure virtual]
    +
    +
    + +

    returns volume of the sound, a value between 0 (mute) and 1 (full volume).

    +

    (this volume gets multiplied with the master volume of the sound engine and other parameters like distance to listener when played as 3d sound)

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISound::isFinished ( )  [pure virtual]
    +
    +
    + +

    returns if the sound has finished playing.

    +

    Don't mix this up with isPaused(). isFinished() returns if the sound has been finished playing. If it has, is maybe already have been removed from the playing list of the sound engine and calls to any other of the methods of ISound will not have any result. If you call stop() to a playing sound will result that this function will return true when invoked.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISound::isLooped ( )  [pure virtual]
    +
    +
    + +

    returns if the sound has been started to play looped

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setIsLooped (bool  looped )  [pure virtual]
    +
    +
    + +

    changes the loop mode of the sound.

    +

    If the sound is playing looped and it is changed to not-looped, then it will stop playing after the loop has finished. If it is not looped and changed to looped, the sound will start repeating to be played when it reaches its end. Invoking this method will not have an effect when the sound already has stopped.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setIsPaused (bool  paused = true )  [pure virtual]
    +
    +
    + +

    returns if the sound is paused

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setMaxDistance (ik_f32  max )  [pure virtual]
    +
    +
    + +

    Sets the maximal distance if this is a 3D sound.

    +

    Changing this value is usually not necessary. Use setMinDistance() instead. Don't change this value if you don't know what you are doing: This value causes the sound to stop attenuating after it reaches the max distance. Most people think that this sets the volume of the sound to 0 after this distance, but this is not true. Only change the minimal distance (using for example setMinDistance()) to influence this. The maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setMinDistance (ik_f32  min )  [pure virtual]
    +
    +
    + +

    Sets the minimal distance if this is a 3D sound.

    +

    Changes the distance at which the 3D sound stops getting louder. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setPan (ik_f32  pan )  [pure virtual]
    +
    +
    + +

    sets the pan of the sound. Takes a value between -1 and 1, 0 is center.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISound::setPlaybackSpeed (ik_f32  speed = 1.0f )  [pure virtual]
    +
    +
    + +

    Sets the playback speed (frequency) of the sound.

    +

    Plays the sound at a higher or lower speed, increasing or decreasing its frequency which makes it sound lower or higher. Note that this feature is not available on all sound output drivers (it is on the DirectSound drivers at least), and it does not work together with the 'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when using DirectSound.

    +
    Parameters:
    + + +
    speed Factor of the speed increase or decrease. 2 is twice as fast, 0.5 is only half as fast. The default is 1.0.
    +
    +
    +
    Returns:
    Returns true if sucessful, false if not. The current sound driver might not support changing the playBack speed, or the sound was started with the 'enableSoundEffects' parameter.
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISound::setPlayPosition (ik_u32  pos )  [pure virtual]
    +
    +
    + +

    sets the current play position of the sound in milliseconds.

    +
    Parameters:
    + + +
    pos Position in milliseconds. Must be between 0 and the value returned by getPlayPosition().
    +
    +
    +
    Returns:
    Returns true successful. False is returned for example if the sound already finished playing and is stopped or the audio source is not seekable, for example if it is an internet stream or a a file format not supporting seeking (a .MOD file for example). A file can be tested if it can bee seeking using ISoundSource::getIsSeekingSupported().
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setPosition (vec3df  position )  [pure virtual]
    +
    +
    + +

    sets the position of the sound in 3d space

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ISound::setSoundStopEventReceiver (ISoundStopEventReceiver reciever,
    void *  userData = 0 
    ) [pure virtual]
    +
    +
    + +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +

    This event is guaranteed to be called when the sound or sound stream is finished, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. There is an example on how to use events in irrklang at Using Sound Events .

    +
    Parameters:
    + + + +
    receiver Interface to a user implementation of the sound receiver. This interface should be as long valid as the sound exists or another stop event receiver is set. Set this to null to set no sound stop event receiver.
    userData,: A iser data pointer, can be null.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setVelocity (vec3df  vel )  [pure virtual]
    +
    +
    + +

    sets the position of the sound in 3d space, needed for Doppler effects.

    +

    To use doppler effects use ISound::setVelocity to set a sounds velocity, ISoundEngine::setListenerPosition() to set the listeners velocity and ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing the doppler effects intensity.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISound::setVolume (ik_f32  volume )  [pure virtual]
    +
    +
    + +

    sets the volume of the sound, a value between 0 (mute) and 1 (full volume).

    +

    This volume gets multiplied with the master volume of the sound engine and other parameters like distance to listener when played as 3d sound.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISound::stop ( )  [pure virtual]
    +
    +
    + +

    Will stop the sound and free its resources.

    +

    If you just want to pause the sound, use setIsPaused(). After calling stop(), isFinished() will usually return true. Be sure to also call ->drop() once you are done.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list-members.html new file mode 100644 index 0000000..c4136ef --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list-members.html @@ -0,0 +1,87 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundDeviceList Member List

    This is the complete list of members for irrklang::ISoundDeviceList, including all inherited members. + + + + + + + +
    drop()irrklang::IRefCounted [inline]
    getDeviceCount()=0irrklang::ISoundDeviceList [pure virtual]
    getDeviceDescription(ik_s32 index)=0irrklang::ISoundDeviceList [pure virtual]
    getDeviceID(ik_s32 index)=0irrklang::ISoundDeviceList [pure virtual]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.gif new file mode 100644 index 0000000000000000000000000000000000000000..7543d6ed9299518418d0e30ddc054a865713a7c6 GIT binary patch literal 845 zcmV-T1G4-_Nk%w1VV?j{0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0G|L*000C2IJ(^aFv>}*y*NL?yZ>M)j$~<`XsWKB!oF}U&ot@Qc&_j9&HupQ z&L=Dyk0zojU}AclIcH!xEmb*GXiPies+2mecP4#y&7JY`q&|UBP-a<vMND&0Y zioq~yw5a}YqsNaUE`l6cQ6$Ne3r(V2DMTg9mqRqjoJq5$&6^Ye=-kP(r_Y~2g9;r= z6o7%ENRujE%CxD|r#+8Col3Q;)vG}bXvNC4tJkkSwMqp`wyfEtVz-`M%a(20v2EkZ z?Fx6U-Mdih;@!)asNTMS1MB=NxG-MAh7-p{thljR#*QOKP!PccPgik%&%dr=yr6N~EDN_Ni!?8(_Bn+mGa literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.html new file mode 100644 index 0000000..cc65ee4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_device_list.html @@ -0,0 +1,186 @@ + + + + + +irrKlang: irrklang::ISoundDeviceList Class Reference + + + + + + + + + +
    +

    irrklang::ISoundDeviceList Class Reference

    +

    A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. +More...

    + +

    #include <ik_ISoundDeviceList.h>

    +
    +Inheritance diagram for irrklang::ISoundDeviceList:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + +

    Public Member Functions

    virtual ik_s32 getDeviceCount ()=0
     Returns amount of enumerated devices in the list.
    virtual const char * getDeviceID (ik_s32 index)=0
     Returns the ID of the device. Use this string to identify this device in createIrrKlangDevice().
    virtual const char * getDeviceDescription (ik_s32 index)=0
     Returns description of the device.
    +

    Detailed Description

    +

    A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list.

    +

    The function createIrrKlangDevice() has a parameter 'deviceID' which takes the value returned by ISoundDeviceList::getDeviceID() and uses that device then. The list of devices in ISoundDeviceList usually also includes the default device which is the first entry and has an empty deviceID string ("") and the description "default device". There is some example code on how to use the ISoundDeviceList in Enumerating sound devices.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual ik_s32 irrklang::ISoundDeviceList::getDeviceCount ( )  [pure virtual]
    +
    +
    + +

    Returns amount of enumerated devices in the list.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual const char* irrklang::ISoundDeviceList::getDeviceDescription (ik_s32  index )  [pure virtual]
    +
    +
    + +

    Returns description of the device.

    +
    Parameters:
    + + +
    index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual const char* irrklang::ISoundDeviceList::getDeviceID (ik_s32  index )  [pure virtual]
    +
    +
    + +

    Returns the ID of the device. Use this string to identify this device in createIrrKlangDevice().

    +
    Parameters:
    + + +
    index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.
    +
    +
    +
    Returns:
    Returns a pointer to a string identifying the device. The string will only as long valid as long as the ISoundDeviceList exists.
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control-members.html new file mode 100644 index 0000000..211662d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control-members.html @@ -0,0 +1,108 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundEffectControl Member List

    This is the complete list of members for irrklang::ISoundEffectControl, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    disableAllEffects()=0irrklang::ISoundEffectControl [pure virtual]
    disableChorusSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableCompressorSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableDistortionSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableEchoSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableFlangerSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableGargleSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableI3DL2ReverbSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableParamEqSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    disableWavesReverbSoundEffect()=0irrklang::ISoundEffectControl [pure virtual]
    enableChorusSoundEffect(ik_f32 fWetDryMix=50, ik_f32 fDepth=10, ik_f32 fFeedback=25, ik_f32 fFrequency=1.1, bool sinusWaveForm=true, ik_f32 fDelay=16, ik_s32 lPhase=90)=0irrklang::ISoundEffectControl [pure virtual]
    enableCompressorSoundEffect(ik_f32 fGain=0, ik_f32 fAttack=10, ik_f32 fRelease=200, ik_f32 fThreshold=-20, ik_f32 fRatio=3, ik_f32 fPredelay=4)=0irrklang::ISoundEffectControl [pure virtual]
    enableDistortionSoundEffect(ik_f32 fGain=-18, ik_f32 fEdge=15, ik_f32 fPostEQCenterFrequency=2400, ik_f32 fPostEQBandwidth=2400, ik_f32 fPreLowpassCutoff=8000)=0irrklang::ISoundEffectControl [pure virtual]
    enableEchoSoundEffect(ik_f32 fWetDryMix=50, ik_f32 fFeedback=50, ik_f32 fLeftDelay=500, ik_f32 fRightDelay=500, ik_s32 lPanDelay=0)=0irrklang::ISoundEffectControl [pure virtual]
    enableFlangerSoundEffect(ik_f32 fWetDryMix=50, ik_f32 fDepth=100, ik_f32 fFeedback=-50, ik_f32 fFrequency=0.25f, bool triangleWaveForm=true, ik_f32 fDelay=2, ik_s32 lPhase=0)=0irrklang::ISoundEffectControl [pure virtual]
    enableGargleSoundEffect(ik_s32 rateHz=20, bool sinusWaveForm=true)=0irrklang::ISoundEffectControl [pure virtual]
    enableI3DL2ReverbSoundEffect(ik_s32 lRoom=-1000, ik_s32 lRoomHF=-100, ik_f32 flRoomRolloffFactor=0, ik_f32 flDecayTime=1.49f, ik_f32 flDecayHFRatio=0.83f, ik_s32 lReflections=-2602, ik_f32 flReflectionsDelay=0.007f, ik_s32 lReverb=200, ik_f32 flReverbDelay=0.011f, ik_f32 flDiffusion=100.0f, ik_f32 flDensity=100.0f, ik_f32 flHFReference=5000.0f)=0irrklang::ISoundEffectControl [pure virtual]
    enableParamEqSoundEffect(ik_f32 fCenter=8000, ik_f32 fBandwidth=12, ik_f32 fGain=0)=0irrklang::ISoundEffectControl [pure virtual]
    enableWavesReverbSoundEffect(ik_f32 fInGain=0, ik_f32 fReverbMix=0, ik_f32 fReverbTime=1000, ik_f32 fHighFreqRTRatio=0.001f)=0irrklang::ISoundEffectControl [pure virtual]
    isChorusSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isCompressorSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isDistortionSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isEchoSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isFlangerSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isGargleSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isI3DL2ReverbSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isParamEqSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    isWavesReverbSoundEffectEnabled()=0irrklang::ISoundEffectControl [pure virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control.html new file mode 100644 index 0000000..2341f30 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_effect_control.html @@ -0,0 +1,1087 @@ + + + + + +irrKlang: irrklang::ISoundEffectControl Class Reference + + + + + + + + + +
    +

    irrklang::ISoundEffectControl Class Reference

    +

    Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. +More...

    + +

    #include <ik_ISoundEffectControl.h>

    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    virtual void disableAllEffects ()=0
     Disables all active sound effects.
    virtual bool enableChorusSoundEffect (ik_f32 fWetDryMix=50, ik_f32 fDepth=10, ik_f32 fFeedback=25, ik_f32 fFrequency=1.1, bool sinusWaveForm=true, ik_f32 fDelay=16, ik_s32 lPhase=90)=0
     Enables the chorus sound effect or adjusts its values.
    virtual void disableChorusSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isChorusSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableCompressorSoundEffect (ik_f32 fGain=0, ik_f32 fAttack=10, ik_f32 fRelease=200, ik_f32 fThreshold=-20, ik_f32 fRatio=3, ik_f32 fPredelay=4)=0
     Enables the Compressor sound effect or adjusts its values.
    virtual void disableCompressorSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isCompressorSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableDistortionSoundEffect (ik_f32 fGain=-18, ik_f32 fEdge=15, ik_f32 fPostEQCenterFrequency=2400, ik_f32 fPostEQBandwidth=2400, ik_f32 fPreLowpassCutoff=8000)=0
     Enables the Distortion sound effect or adjusts its values.
    virtual void disableDistortionSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isDistortionSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableEchoSoundEffect (ik_f32 fWetDryMix=50, ik_f32 fFeedback=50, ik_f32 fLeftDelay=500, ik_f32 fRightDelay=500, ik_s32 lPanDelay=0)=0
     Enables the Echo sound effect or adjusts its values.
    virtual void disableEchoSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isEchoSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableFlangerSoundEffect (ik_f32 fWetDryMix=50, ik_f32 fDepth=100, ik_f32 fFeedback=-50, ik_f32 fFrequency=0.25f, bool triangleWaveForm=true, ik_f32 fDelay=2, ik_s32 lPhase=0)=0
     Enables the Flanger sound effect or adjusts its values.
    virtual void disableFlangerSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isFlangerSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableGargleSoundEffect (ik_s32 rateHz=20, bool sinusWaveForm=true)=0
     Enables the Gargle sound effect or adjusts its values.
    virtual void disableGargleSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isGargleSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableI3DL2ReverbSoundEffect (ik_s32 lRoom=-1000, ik_s32 lRoomHF=-100, ik_f32 flRoomRolloffFactor=0, ik_f32 flDecayTime=1.49f, ik_f32 flDecayHFRatio=0.83f, ik_s32 lReflections=-2602, ik_f32 flReflectionsDelay=0.007f, ik_s32 lReverb=200, ik_f32 flReverbDelay=0.011f, ik_f32 flDiffusion=100.0f, ik_f32 flDensity=100.0f, ik_f32 flHFReference=5000.0f)=0
     Enables the Interactive 3D Level 2 reverb sound effect or adjusts its values.
    virtual void disableI3DL2ReverbSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isI3DL2ReverbSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableParamEqSoundEffect (ik_f32 fCenter=8000, ik_f32 fBandwidth=12, ik_f32 fGain=0)=0
     Enables the ParamEq sound effect or adjusts its values.
    virtual void disableParamEqSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isParamEqSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    virtual bool enableWavesReverbSoundEffect (ik_f32 fInGain=0, ik_f32 fReverbMix=0, ik_f32 fReverbTime=1000, ik_f32 fHighFreqRTRatio=0.001f)=0
     Enables the Waves Reverb sound effect or adjusts its values.
    virtual void disableWavesReverbSoundEffect ()=0
     removes the sound effect from the sound
    virtual bool isWavesReverbSoundEffectEnabled ()=0
     returns if the sound effect is active on the sound
    +

    Detailed Description

    +

    Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound.

    +

    Sound effects such as chorus, distorsions, echo, reverb and similar can be controlled using this. An instance of this interface can be obtained via ISound::getSoundEffectControl(). The sound containing this interface has to be started via ISoundEngine::play2D() or ISoundEngine::play3D() with the flag enableSoundEffects=true, otherwise no acccess to this interface will be available. For the DirectSound driver, these are effects available since DirectSound8. For most effects, sounds should have a sample rate of 44 khz and should be at least 150 milli seconds long for optimal quality when using the DirectSound driver. Note that the interface pointer is only valid as long as the ISound pointer is valid. If the ISound pointer gets dropped (IVirtualRefCounted::drop()), the ISoundEffects may not be used any more.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableAllEffects ( )  [pure virtual]
    +
    +
    + +

    Disables all active sound effects.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableChorusSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableCompressorSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableDistortionSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableEchoSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableFlangerSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableGargleSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableI3DL2ReverbSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableParamEqSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEffectControl::disableWavesReverbSoundEffect ( )  [pure virtual]
    +
    +
    + +

    removes the sound effect from the sound

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableChorusSoundEffect (ik_f32  fWetDryMix = 50,
    ik_f32  fDepth = 10,
    ik_f32  fFeedback = 25,
    ik_f32  fFrequency = 1.1,
    bool  sinusWaveForm = true,
    ik_f32  fDelay = 16,
    ik_s32  lPhase = 90 
    ) [pure virtual]
    +
    +
    + +

    Enables the chorus sound effect or adjusts its values.

    +

    Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + + + + + +
    fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
    fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f;
    fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f;
    fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f;
    sinusWaveForm True for sinus wave form, false for triangle.
    fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f;
    lPhase Phase differential between left and right LFOs. Possible values: -180, -90, 0, 90, 180
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableCompressorSoundEffect (ik_f32  fGain = 0,
    ik_f32  fAttack = 10,
    ik_f32  fRelease = 200,
    ik_f32  fThreshold = -20,
    ik_f32  fRatio = 3,
    ik_f32  fPredelay = 4 
    ) [pure virtual]
    +
    +
    + +

    Enables the Compressor sound effect or adjusts its values.

    +

    Compressor is a reduction in the fluctuation of a signal above a certain amplitude. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + + + + +
    fGain Output gain of signal after Compressor. Minimal Value:-60, Maximal Value:60.0f;
    fAttack Time before Compressor reaches its full value. Minimal Value:0.01, Maximal Value:500.0f;
    fRelease Speed at which Compressor is stopped after input drops below fThreshold. Minimal Value:50, Maximal Value:3000.0f;
    fThreshold Point at which Compressor begins, in decibels. Minimal Value:-60, Maximal Value:0.0f;
    fRatio Compressor ratio. Minimal Value:1, Maximal Value:100.0f;
    fPredelay Time after lThreshold is reached before attack phase is started, in milliseconds. Minimal Value:0, Maximal Value:4.0f;
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableDistortionSoundEffect (ik_f32  fGain = -18,
    ik_f32  fEdge = 15,
    ik_f32  fPostEQCenterFrequency = 2400,
    ik_f32  fPostEQBandwidth = 2400,
    ik_f32  fPreLowpassCutoff = 8000 
    ) [pure virtual]
    +
    +
    + +

    Enables the Distortion sound effect or adjusts its values.

    +

    Distortion is achieved by adding harmonics to the signal in such a way that, If this sound effect is already enabled, calling this only modifies the parameters of the active effect. as the level increases, the top of the waveform becomes squared off or clipped.

    +
    Parameters:
    + + + + + + +
    fGain Amount of signal change after distortion. Minimal Value:-60, Maximal Value:0;
    fEdge Percentage of distortion intensity. Minimal Value:0, Maximal Value:100;
    fPostEQCenterFrequency Center frequency of harmonic content addition. Minimal Value:100, Maximal Value:8000;
    fPostEQBandwidth Width of frequency band that determines range of harmonic content addition. Minimal Value:100, Maximal Value:8000;
    fPreLowpassCutoff Filter cutoff for high-frequency harmonics attenuation. Minimal Value:100, Maximal Value:8000;
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableEchoSoundEffect (ik_f32  fWetDryMix = 50,
    ik_f32  fFeedback = 50,
    ik_f32  fLeftDelay = 500,
    ik_f32  fRightDelay = 500,
    ik_s32  lPanDelay = 0 
    ) [pure virtual]
    +
    +
    + +

    Enables the Echo sound effect or adjusts its values.

    +

    An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + + + +
    fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
    fFeedback Percentage of output fed back into input. Minimal Value:0, Maximal Value:100.0f;
    fLeftDelay Delay for left channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f;
    fRightDelay Delay for right channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f;
    lPanDelay Value that specifies whether to swap left and right delays with each successive echo. Minimal Value:0, Maximal Value:1;
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableFlangerSoundEffect (ik_f32  fWetDryMix = 50,
    ik_f32  fDepth = 100,
    ik_f32  fFeedback = -50,
    ik_f32  fFrequency = 0.25f,
    bool  triangleWaveForm = true,
    ik_f32  fDelay = 2,
    ik_s32  lPhase = 0 
    ) [pure virtual]
    +
    +
    + +

    Enables the Flanger sound effect or adjusts its values.

    +

    Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + + + + + +
    fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f;
    fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f;
    fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f;
    fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f;
    triangleWaveForm True for triangle wave form, false for square.
    fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f;
    lPhase Phase differential between left and right LFOs. Possible values: -180, -90, 0, 90, 180
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableGargleSoundEffect (ik_s32  rateHz = 20,
    bool  sinusWaveForm = true 
    ) [pure virtual]
    +
    +
    + +

    Enables the Gargle sound effect or adjusts its values.

    +

    The gargle effect modulates the amplitude of the signal. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + +
    rateHz Rate of modulation, in Hertz. Minimal Value:1, Maximal Value:1000
    sinusWaveForm True for sinus wave form, false for triangle.
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableI3DL2ReverbSoundEffect (ik_s32  lRoom = -1000,
    ik_s32  lRoomHF = -100,
    ik_f32  flRoomRolloffFactor = 0,
    ik_f32  flDecayTime = 1.49f,
    ik_f32  flDecayHFRatio = 0.83f,
    ik_s32  lReflections = -2602,
    ik_f32  flReflectionsDelay = 0.007f,
    ik_s32  lReverb = 200,
    ik_f32  flReverbDelay = 0.011f,
    ik_f32  flDiffusion = 100.0f,
    ik_f32  flDensity = 100.0f,
    ik_f32  flHFReference = 5000.0f 
    ) [pure virtual]
    +
    +
    + +

    Enables the Interactive 3D Level 2 reverb sound effect or adjusts its values.

    +

    An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + + + + + + + + + + +
    lRoom Attenuation of the room effect, in millibels (mB). Interval: [-10000, 0] Default: -1000 mB
    lRoomHF Attenuation of the room high-frequency effect. Interval: [-10000, 0] default: 0 mB
    flRoomRolloffFactor Rolloff factor for the reflected signals. Interval: [0.0, 10.0] default: 0.0
    flDecayTime Decay time, in seconds. Interval: [0.1, 20.0] default: 1.49s
    flDecayHFRatio Ratio of the decay time at high frequencies to the decay time at low frequencies. Interval: [0.1, 2.0] default: 0.83
    lReflections Attenuation of early reflections relative to lRoom. Interval: [-10000, 1000] default: -2602 mB
    flReflectionsDelay Delay time of the first reflection relative to the direct path in seconds. Interval: [0.0, 0.3] default: 0.007 s
    lReverb Attenuation of late reverberation relative to lRoom, in mB. Interval: [-10000, 2000] default: 200 mB
    flReverbDelay Time limit between the early reflections and the late reverberation relative to the time of the first reflection. Interval: [0.0, 0.1] default: 0.011 s
    flDiffusion Echo density in the late reverberation decay in percent. Interval: [0.0, 100.0] default: 100.0 %
    flDensity Modal density in the late reverberation decay, in percent. Interval: [0.0, 100.0] default: 100.0 %
    flHFReference Reference high frequency, in hertz. Interval: [20.0, 20000.0] default: 5000.0 Hz
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableParamEqSoundEffect (ik_f32  fCenter = 8000,
    ik_f32  fBandwidth = 12,
    ik_f32  fGain = 0 
    ) [pure virtual]
    +
    +
    + +

    Enables the ParamEq sound effect or adjusts its values.

    +

    Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    Parameters:
    + + + + +
    fCenter Center frequency, in hertz, The default value is 8000. Minimal Value:80, Maximal Value:16000.0f
    fBandwidth Bandwidth, in semitones, The default value is 12. Minimal Value:1.0f, Maximal Value:36.0f
    fGain Gain, default value is 0. Minimal Value:-15.0f, Maximal Value:15.0f
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::enableWavesReverbSoundEffect (ik_f32  fInGain = 0,
    ik_f32  fReverbMix = 0,
    ik_f32  fReverbTime = 1000,
    ik_f32  fHighFreqRTRatio = 0.001f 
    ) [pure virtual]
    +
    +
    + +

    Enables the Waves Reverb sound effect or adjusts its values.

    +
    Parameters:
    + + + + + +
    fInGain Input gain of signal, in decibels (dB). Min/Max: [-96.0,0.0] Default: 0.0 dB. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    fReverbMix Reverb mix, in dB. Min/Max: [-96.0,0.0] Default: 0.0 dB
    fReverbTime Reverb time, in milliseconds. Min/Max: [0.001,3000.0] Default: 1000.0 ms
    fHighFreqRTRatio High-frequency reverb time ratio. Min/Max: [0.001,0.999] Default: 0.001
    +
    +
    +
    Returns:
    Returns true if successful.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isChorusSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isCompressorSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isDistortionSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isEchoSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isFlangerSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isGargleSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isI3DL2ReverbSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isParamEqSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEffectControl::isWavesReverbSoundEffectEnabled ( )  [pure virtual]
    +
    +
    + +

    returns if the sound effect is active on the sound

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine-members.html new file mode 100644 index 0000000..a50de30 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine-members.html @@ -0,0 +1,120 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundEngine Member List

    This is the complete list of members for irrklang::ISoundEngine, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    addFileFactory(IFileFactory *fileFactory)=0irrklang::ISoundEngine [pure virtual]
    addSoundSourceAlias(ISoundSource *baseSource, const ik_c8 *soundName)=0irrklang::ISoundEngine [pure virtual]
    addSoundSourceFromFile(const ik_c8 *fileName, E_STREAM_MODE mode=ESM_AUTO_DETECT, bool preload=false)=0irrklang::ISoundEngine [pure virtual]
    addSoundSourceFromMemory(void *memory, ik_s32 sizeInBytes, const ik_c8 *soundName, bool copyMemory=true)=0irrklang::ISoundEngine [pure virtual]
    addSoundSourceFromPCMData(void *memory, ik_s32 sizeInBytes, const ik_c8 *soundName, SAudioStreamFormat format, bool copyMemory=true)=0irrklang::ISoundEngine [pure virtual]
    drop()irrklang::IRefCounted [inline]
    getDefault3DSoundMaxDistance()=0irrklang::ISoundEngine [pure virtual]
    getDefault3DSoundMinDistance()=0irrklang::ISoundEngine [pure virtual]
    getDriverName()=0irrklang::ISoundEngine [pure virtual]
    getInternalAudioInterface()=0irrklang::ISoundEngine [pure virtual]
    getSoundSource(const ik_c8 *soundName, bool addIfNotFound=true)=0irrklang::ISoundEngine [pure virtual]
    getSoundSource(ik_s32 index)=0irrklang::ISoundEngine [pure virtual]
    getSoundSourceCount()=0irrklang::ISoundEngine [pure virtual]
    getSoundVolume()=0irrklang::ISoundEngine [pure virtual]
    grab()irrklang::IRefCounted [inline]
    IRefCounted()irrklang::IRefCounted [inline]
    isCurrentlyPlaying(const char *soundName)=0irrklang::ISoundEngine [pure virtual]
    isCurrentlyPlaying(ISoundSource *source)=0irrklang::ISoundEngine [pure virtual]
    isMultiThreaded() const =0irrklang::ISoundEngine [pure virtual]
    loadPlugins(const ik_c8 *path)=0irrklang::ISoundEngine [pure virtual]
    play2D(const char *soundFileName, bool playLooped=false, bool startPaused=false, bool track=false, E_STREAM_MODE streamMode=ESM_AUTO_DETECT, bool enableSoundEffects=false)=0irrklang::ISoundEngine [pure virtual]
    play2D(ISoundSource *source, bool playLooped=false, bool startPaused=false, bool track=false, bool enableSoundEffects=false)=0irrklang::ISoundEngine [pure virtual]
    play3D(const char *soundFileName, vec3df pos, bool playLooped=false, bool startPaused=false, bool track=false, E_STREAM_MODE streamMode=ESM_AUTO_DETECT, bool enableSoundEffects=false)=0irrklang::ISoundEngine [pure virtual]
    play3D(ISoundSource *source, vec3df pos, bool playLooped=false, bool startPaused=false, bool track=false, bool enableSoundEffects=false)=0irrklang::ISoundEngine [pure virtual]
    registerAudioStreamLoader(IAudioStreamLoader *loader)=0irrklang::ISoundEngine [pure virtual]
    removeAllSoundSources()=0irrklang::ISoundEngine [pure virtual]
    removeSoundSource(ISoundSource *source)=0irrklang::ISoundEngine [pure virtual]
    removeSoundSource(const ik_c8 *name)=0irrklang::ISoundEngine [pure virtual]
    setAllSoundsPaused(bool bPaused=true)=0irrklang::ISoundEngine [pure virtual]
    setDefault3DSoundMaxDistance(ik_f32 maxDistance)=0irrklang::ISoundEngine [pure virtual]
    setDefault3DSoundMinDistance(ik_f32 minDistance)=0irrklang::ISoundEngine [pure virtual]
    setDopplerEffectParameters(ik_f32 dopplerFactor=1.0f, ik_f32 distanceFactor=1.0f)=0irrklang::ISoundEngine [pure virtual]
    setListenerPosition(const vec3df &pos, const vec3df &lookdir, const vec3df &velPerSecond=vec3df(0, 0, 0), const vec3df &upVector=vec3df(0, 1, 0))=0irrklang::ISoundEngine [pure virtual]
    setMixedDataOutputReceiver(ISoundMixedOutputReceiver *receiver)=0irrklang::ISoundEngine [pure virtual]
    setRolloffFactor(ik_f32 rolloff)=0irrklang::ISoundEngine [pure virtual]
    setSoundVolume(ik_f32 volume)=0irrklang::ISoundEngine [pure virtual]
    stopAllSounds()=0irrklang::ISoundEngine [pure virtual]
    stopAllSoundsOfSoundSource(ISoundSource *source)=0irrklang::ISoundEngine [pure virtual]
    update()=0irrklang::ISoundEngine [pure virtual]
    ~IRefCounted()irrklang::IRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.gif new file mode 100644 index 0000000000000000000000000000000000000000..120c1bd5f31512d4e078c4f75e403e5c5e7f5279 GIT binary patch literal 994 zcmV<810DQFNk%w1VT%Az0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0E+-n000C22)Z!-jxh-3qR%QEH6L2Tg&#S386&KM%DOAuF6^w-a!$W{+}i-$ zPj}-LeMexD7&JDKPoQu)tWvL0<}_>NYMt9KcnlSn$x`(9%m#wY>GnEKpWD0e`(}{G ztNn6-b%J_ch5`;`0Zairi+xx%ivR(Yl|+>+mW_W{oP&>JiGz`x3!kKiFO#2?SE!Rg zri3)JuV!yKlLC#bl)NphnwKlRyS$6XK994ZmI{`|RngMW(!|e{nK75GT~yAo+sQYa z;>E(i+OpN=Htx{u!Qf4euJV_^yz#~J+JTrfG5D0Pp9*uQs_BDbZj(T3>Re4B$WPra zgbRHc{AT`$VmWT1_Cbqw517b>2Ne=@coNmXhaR2z+m!C4p*LVm9kb^uCd_*NOuDeQ zGw4HaV#AXaS7w|UnKI6n z9f$6$)5zwlg_<|w(i@%Wv8CKHaKt8$bAo&++o5A z3nfrsFfm;^1?tzWSJ0jUdiN0E!;2qJeu07V=+moT&%QnT^X}uzpHJVtf&2CI>)&7h zKK^|E00tEZrP!iHFgPRf?{4s)0t?dspgt&w&~`ZaK`!Om@wu;=ZbdT zd19V=j>u=9AO0B&c!S=PpE%jn2iPX*6^h=UA=Xgm=LYN;>e+=Hk%>)d6i z1eIElD5yOR+6|_phB}g`@#LB4K#n3RYEPCL3K*ul!m6vJxuTj+rNe4atf#~hs+%jV zrY`&IK+WpP>ZGH(Dr~UW@=DXR-1_Qmt+hI9>#~eWYi_iyntLs;*{1s~yV}nBs=KOg z+HR@%hEVFe>fXyLwD9`6uD;>^yKcVyx|(ji2_Gx)zT|2fFv85z3$V1G;yP`o%8n%K z$Na9dXf~*dJn>zVLh2y3byCW*fF;WqGkYo@D6h;lKl(DD6Xwjbgg*cLV9-K0NOaK% Q%Bl3yOgHWH(+L0oJDWEHBLDyZ literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.html new file mode 100644 index 0000000..09ef187 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_engine.html @@ -0,0 +1,1299 @@ + + + + + +irrKlang: irrklang::ISoundEngine Class Reference + + + + + + + + + +
    +

    irrklang::ISoundEngine Class Reference

    +

    Interface to the sound engine, for playing 3d and 2d sound and music. +More...

    + +

    #include <ik_ISoundEngine.h>

    +
    +Inheritance diagram for irrklang::ISoundEngine:
    +
    +
    + + +irrklang::IRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    virtual const char * getDriverName ()=0
     returns the name of the sound driver, like 'ALSA' for the alsa device
    virtual ISoundplay2D (const char *soundFileName, bool playLooped=false, bool startPaused=false, bool track=false, E_STREAM_MODE streamMode=ESM_AUTO_DETECT, bool enableSoundEffects=false)=0
     loads a sound source (if not loaded already) from a file and plays it.
    virtual ISoundplay2D (ISoundSource *source, bool playLooped=false, bool startPaused=false, bool track=false, bool enableSoundEffects=false)=0
     Plays a sound source as 2D sound with its default settings stored in ISoundSource.
    virtual ISoundplay3D (const char *soundFileName, vec3df pos, bool playLooped=false, bool startPaused=false, bool track=false, E_STREAM_MODE streamMode=ESM_AUTO_DETECT, bool enableSoundEffects=false)=0
     Loads a sound source (if not loaded already) from a file and plays it as 3D sound.
    virtual ISoundplay3D (ISoundSource *source, vec3df pos, bool playLooped=false, bool startPaused=false, bool track=false, bool enableSoundEffects=false)=0
     Plays a sound source as 3D sound with its default settings stored in ISoundSource.
    virtual void stopAllSounds ()=0
     Stops all currently playing sounds.
    virtual void setAllSoundsPaused (bool bPaused=true)=0
     Pauses or unpauses all currently playing sounds.
    virtual ISoundSourcegetSoundSource (const ik_c8 *soundName, bool addIfNotFound=true)=0
     Gets a sound source by sound name. Adds the sound source as file into the sound engine if not loaded already.
    virtual ISoundSourcegetSoundSource (ik_s32 index)=0
     Returns a sound source by index.
    virtual ik_s32 getSoundSourceCount ()=0
     Returns amount of loaded sound sources.
    virtual ISoundSourceaddSoundSourceFromFile (const ik_c8 *fileName, E_STREAM_MODE mode=ESM_AUTO_DETECT, bool preload=false)=0
     Adds sound source into the sound engine as file.
    virtual ISoundSourceaddSoundSourceFromMemory (void *memory, ik_s32 sizeInBytes, const ik_c8 *soundName, bool copyMemory=true)=0
     Adds a sound source into the sound engine as memory source.
    virtual ISoundSourceaddSoundSourceFromPCMData (void *memory, ik_s32 sizeInBytes, const ik_c8 *soundName, SAudioStreamFormat format, bool copyMemory=true)=0
     Adds a sound source into the sound engine from plain PCM data in memory.
    virtual ISoundSourceaddSoundSourceAlias (ISoundSource *baseSource, const ik_c8 *soundName)=0
     Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings.
    virtual void removeSoundSource (ISoundSource *source)=0
     Removes a sound source from the engine, freeing the memory it occupies.
    virtual void removeSoundSource (const ik_c8 *name)=0
     Removes a sound source from the engine, freeing the memory it occupies.
    virtual void removeAllSoundSources ()=0
     Removes all sound sources from the engine.
    virtual void setSoundVolume (ik_f32 volume)=0
     Sets master sound volume. This value is multiplied with all sounds played.
    virtual ik_f32 getSoundVolume ()=0
     Returns master sound volume.
    virtual void setListenerPosition (const vec3df &pos, const vec3df &lookdir, const vec3df &velPerSecond=vec3df(0, 0, 0), const vec3df &upVector=vec3df(0, 1, 0))=0
     Sets the current listener 3d position.
    virtual void update ()=0
     Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode.
    virtual bool isCurrentlyPlaying (const char *soundName)=0
     Returns if a sound with the specified name is currently playing.
    virtual bool isCurrentlyPlaying (ISoundSource *source)=0
     Returns if a sound with the specified source is currently playing.
    virtual void stopAllSoundsOfSoundSource (ISoundSource *source)=0
     Stops all sounds of a specific sound source.
    virtual void registerAudioStreamLoader (IAudioStreamLoader *loader)=0
     Registers a new audio stream loader in the sound engine.
    virtual bool isMultiThreaded () const =0
     Returns if irrKlang is running in the same thread as the application or is using multithreading.
    virtual void addFileFactory (IFileFactory *fileFactory)=0
     Adds a file factory to the sound engine, making it possible to override file access of the sound engine.
    virtual void setDefault3DSoundMinDistance (ik_f32 minDistance)=0
     Sets the default minimal distance for 3D sounds.
    virtual ik_f32 getDefault3DSoundMinDistance ()=0
     Returns the default minimal distance for 3D sounds.
    virtual void setDefault3DSoundMaxDistance (ik_f32 maxDistance)=0
     Sets the default maximal distance for 3D sounds.
    virtual ik_f32 getDefault3DSoundMaxDistance ()=0
     Returns the default maximal distance for 3D sounds.
    virtual void setRolloffFactor (ik_f32 rolloff)=0
     Sets a rolloff factor which influences the amount of attenuation that is applied to 3D sounds.
    virtual void setDopplerEffectParameters (ik_f32 dopplerFactor=1.0f, ik_f32 distanceFactor=1.0f)=0
     Sets parameters affecting the doppler effect.
    virtual bool loadPlugins (const ik_c8 *path)=0
     Loads irrKlang plugins from a custom path.
    virtual const
    +SInternalAudioInterface
    getInternalAudioInterface ()=0
     Returns a pointer to internal sound engine pointers, like the DirectSound interface.
    virtual bool setMixedDataOutputReceiver (ISoundMixedOutputReceiver *receiver)=0
     Sets the OutputMixedDataReceiver, so you can receive the pure mixed output audio data while it is being played.
    +

    Detailed Description

    +

    Interface to the sound engine, for playing 3d and 2d sound and music.

    +

    This is the main interface of irrKlang. You usually would create this using the createIrrKlangDevice() function.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::addFileFactory (IFileFactory fileFactory )  [pure virtual]
    +
    +
    + +

    Adds a file factory to the sound engine, making it possible to override file access of the sound engine.

    +

    Derive your own class from IFileFactory, overwrite the createFileReader() method and return your own implemented IFileReader to overwrite file access of irrKlang.

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::addSoundSourceAlias (ISoundSource baseSource,
    const ik_c8 soundName 
    ) [pure virtual]
    +
    +
    + +

    Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings.

    +

    This is useful if you want to play multiple sounds but each sound isn't necessarily one single file. Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.

    +
    Parameters:
    + + + +
    baseSource The sound source where this sound source should be based on. This sound source will use the baseSource as base to access the file and similar, but it will have its own name and its own default settings.
    soundName Name of the new sound source to be added.
    +
    +
    +
    Returns:
    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::addSoundSourceFromFile (const ik_c8 fileName,
    E_STREAM_MODE  mode = ESM_AUTO_DETECT,
    bool  preload = false 
    ) [pure virtual]
    +
    +
    + +

    Adds sound source into the sound engine as file.

    +
    Parameters:
    + + + + +
    fileName Name of the sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D().
    mode Streaming mode for this sound source
    preload If this flag is set to false (which is default) the sound engine will not try to load the sound file when calling this method, but only when play() is called with this sound source as parameter. Otherwise the sound will be preloaded.
    +
    +
    +
    Returns:
    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log. Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you want and drop() it then later of course.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::addSoundSourceFromMemory (void *  memory,
    ik_s32  sizeInBytes,
    const ik_c8 soundName,
    bool  copyMemory = true 
    ) [pure virtual]
    +
    +
    + +

    Adds a sound source into the sound engine as memory source.

    +

    Note: This method only accepts a file (.wav, .ogg, etc) which is totally loaded into memory. If you want to add a sound source from decoded plain PCM data in memory, use addSoundSourceFromPCMData() instead.

    +
    Parameters:
    + + + + + +
    memory Pointer to the memory to be treated as loaded sound file.
    sizeInBytes Size of the memory chunk, in bytes.
    soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D(). Hint: If you include the extension of the original file like .ogg, .mp3 or .wav at the end of the filename, irrKlang will be able to decide better what file format it is and might be able to start playback faster.
    copyMemory If set to true which is default, the memory block is copied and stored in the engine, after calling addSoundSourceFromMemory() the memory pointer can be deleted savely. If set to false, the memory is not copied and the user takes the responsibility that the memory block pointed to remains there as long as the sound engine or at least this sound source exists.
    +
    +
    +
    Returns:
    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log. Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you want and drop() it then later of course.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::addSoundSourceFromPCMData (void *  memory,
    ik_s32  sizeInBytes,
    const ik_c8 soundName,
    SAudioStreamFormat  format,
    bool  copyMemory = true 
    ) [pure virtual]
    +
    +
    + +

    Adds a sound source into the sound engine from plain PCM data in memory.

    +
    Parameters:
    + + + + + +
    memory Pointer to the memory to be treated as loaded sound file.
    sizeInBytes Size of the memory chunk, in bytes.
    soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D().
    copyMemory If set to true which is default, the memory block is copied and stored in the engine, after calling addSoundSourceFromPCMData() the memory pointer can be deleted savely. If set to true, the memory is not copied and the user takes the responsibility that the memory block pointed to remains there as long as the sound engine or at least this sound source exists.
    +
    +
    +
    Returns:
    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundEngine::getDefault3DSoundMaxDistance ( )  [pure virtual]
    +
    +
    + +

    Returns the default maximal distance for 3D sounds.

    +

    This value influences how loud a sound is heard based on its distance. You can change it using setDefault3DSoundmaxDistance(), but changing this value is usually not necessary. This value causes the sound to stop attenuating after it reaches the max distance. Most people think that this sets the volume of the sound to 0 after this distance, but this is not true. Only change the minimal distance (using for example setDefault3DSoundMinDistance()) to influence this. See ISound::setMaxDistance() for details about what the max distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMaxDistance().

    +
    Returns:
    Default maximal distance for 3d sounds. The default value is 1000000000.0f.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundEngine::getDefault3DSoundMinDistance ( )  [pure virtual]
    +
    +
    + +

    Returns the default minimal distance for 3D sounds.

    +

    This value influences how loud a sound is heard based on its distance. You can change it using setDefault3DSoundMinDistance(). See ISound::setMinDistance() for details about what the min distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMinDistance().

    +
    Returns:
    Default minimal distance for 3d sounds. The default value is 1.0f.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual const char* irrklang::ISoundEngine::getDriverName ( )  [pure virtual]
    +
    +
    + +

    returns the name of the sound driver, like 'ALSA' for the alsa device

    +

    Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM", "DirectSound" and "DirectSound8".

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual const SInternalAudioInterface& irrklang::ISoundEngine::getInternalAudioInterface ( )  [pure virtual]
    +
    +
    + +

    Returns a pointer to internal sound engine pointers, like the DirectSound interface.

    +

    Use this with caution. This is only exposed to make it possible for other libraries such as Video playback packages to extend or use the sound driver irrklang uses.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::getSoundSource (ik_s32  index )  [pure virtual]
    +
    +
    + +

    Returns a sound source by index.

    +
    Parameters:
    + + +
    idx,: Index of the loaded sound source, must by smaller than getSoundSourceCount().
    +
    +
    +
    Returns:
    Returns the sound source or 0 if not available. Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you want and drop() it then later of course.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual ISoundSource* irrklang::ISoundEngine::getSoundSource (const ik_c8 soundName,
    bool  addIfNotFound = true 
    ) [pure virtual]
    +
    +
    + +

    Gets a sound source by sound name. Adds the sound source as file into the sound engine if not loaded already.

    +

    Please note: For performance reasons most ISoundEngine implementations will not try to load the sound when calling this method, but only when play() is called with this sound source as parameter.

    +
    Parameters:
    + + +
    addIfNotFound if 'true' adds the sound source to the list and returns the interface to it if it cannot be found in the sound source list. If 'false', returns 0 if the sound source is not in the list and does not modify the list. Default value: true.
    +
    +
    +
    Returns:
    Returns the sound source or 0 if not available. Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you want and drop() it then later of course.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_s32 irrklang::ISoundEngine::getSoundSourceCount ( )  [pure virtual]
    +
    +
    + +

    Returns amount of loaded sound sources.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundEngine::getSoundVolume ( )  [pure virtual]
    +
    +
    + +

    Returns master sound volume.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISoundEngine::isCurrentlyPlaying (ISoundSource source )  [pure virtual]
    +
    +
    + +

    Returns if a sound with the specified source is currently playing.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISoundEngine::isCurrentlyPlaying (const char *  soundName )  [pure virtual]
    +
    +
    + +

    Returns if a sound with the specified name is currently playing.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundEngine::isMultiThreaded ( )  const [pure virtual]
    +
    +
    + +

    Returns if irrKlang is running in the same thread as the application or is using multithreading.

    +

    This basicly returns the flag set by the user when creating the sound engine.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISoundEngine::loadPlugins (const ik_c8 path )  [pure virtual]
    +
    +
    + +

    Loads irrKlang plugins from a custom path.

    +

    Plugins usually are .dll, .so or .dylib files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which make it possible to play back mp3 files. Plugins are being loaded from the current working directory at startup of the sound engine if the parameter ESEO_LOAD_PLUGINS is set (which it is by default), but using this method, it is possible to load plugins from a custom path in addition.

    +
    Parameters:
    + + +
    path Path to the plugin directory, like "C:\games\somegamegame\irrklangplugins".
    +
    +
    +
    Returns:
    returns true if sucessful or fals if not, for example because the path could not be found.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISound* irrklang::ISoundEngine::play2D (ISoundSource source,
    bool  playLooped = false,
    bool  startPaused = false,
    bool  track = false,
    bool  enableSoundEffects = false 
    ) [pure virtual]
    +
    +
    + +

    Plays a sound source as 2D sound with its default settings stored in ISoundSource.

    +

    An ISoundSource object will be created internally when playing a sound the first time, or can be added with getSoundSource().

    +
    Parameters:
    + + + + + + +
    source The sound source, specifiying sound file source and default settings for this file. Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
    playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to ISound have no effect after such a non looped sound has been stopped automaticly.
    startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to modify some of the sound parameters and then call ISound::setPaused(false); Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound object anymore. See 'return' for details.
    track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
    enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). Only enable if necessary.
    +
    +
    +
    Returns:
    Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISound* irrklang::ISoundEngine::play2D (const char *  soundFileName,
    bool  playLooped = false,
    bool  startPaused = false,
    bool  track = false,
    E_STREAM_MODE  streamMode = ESM_AUTO_DETECT,
    bool  enableSoundEffects = false 
    ) [pure virtual]
    +
    +
    + +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    Parameters:
    + + + + + + + +
    sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
    playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to ISound have no effect after such a non looped sound has been stopped automaticly.
    startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to modify some of the sound parameters and then call ISound::setPaused(false); Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound object anymore. See 'return' for details.
    track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
    streamMode Specifies if the file should be streamed or loaded completely into memory for playing. ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the engine, this parameter has no effect.
    enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). Only enable if necessary.
    +
    +
    +
    Returns:
    Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISound* irrklang::ISoundEngine::play3D (ISoundSource source,
    vec3df  pos,
    bool  playLooped = false,
    bool  startPaused = false,
    bool  track = false,
    bool  enableSoundEffects = false 
    ) [pure virtual]
    +
    +
    + +

    Plays a sound source as 3D sound with its default settings stored in ISoundSource.

    +

    An ISoundSource object will be created internally when playing a sound the first time, or can be added with getSoundSource(). There is some example code on how to work with 3D sound 3D Sound.

    +
    Parameters:
    + + + + + + + +
    source The sound source, specifiying sound file source and default settings for this file. Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this.
    pos Position of the 3D sound.
    playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to ISound have no effect after such a non looped sound has been stopped automaticly.
    startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to modify some of the sound parameters and then call ISound::setPaused(false); Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound object anymore. See 'return' for details.
    track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
    enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). Only enable if necessary.
    +
    +
    +
    Returns:
    Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual ISound* irrklang::ISoundEngine::play3D (const char *  soundFileName,
    vec3df  pos,
    bool  playLooped = false,
    bool  startPaused = false,
    bool  track = false,
    E_STREAM_MODE  streamMode = ESM_AUTO_DETECT,
    bool  enableSoundEffects = false 
    ) [pure virtual]
    +
    +
    + +

    Loads a sound source (if not loaded already) from a file and plays it as 3D sound.

    +

    There is some example code on how to work with 3D sound at 3D Sound.

    +
    Parameters:
    + + + + + + + + +
    sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg".
    pos Position of the 3D sound.
    playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to ISound have no effect after such a non looped sound has been stopped automaticly.
    startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to modify some of the sound parameters and then call ISound::setPaused(false); Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound object anymore. See 'return' for details.
    track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details.
    streamMode Specifies if the file should be streamed or loaded completely into memory for playing. ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the engine, this parameter has no effect.
    enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). Only enable if necessary.
    +
    +
    +
    Returns:
    Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::registerAudioStreamLoader (IAudioStreamLoader loader )  [pure virtual]
    +
    +
    + +

    Registers a new audio stream loader in the sound engine.

    +

    Use this to enhance the audio engine to support other or new file formats. To do this, implement your own IAudioStreamLoader interface and register it with this method

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEngine::removeAllSoundSources ( )  [pure virtual]
    +
    +
    + +

    Removes all sound sources from the engine.

    +

    This will also cause all sounds to be stopped. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::removeSoundSource (const ik_c8 name )  [pure virtual]
    +
    +
    + +

    Removes a sound source from the engine, freeing the memory it occupies.

    +

    This will also cause all currently playing sounds of this source to be stopped. Also note that if the source has been removed successfully, the value returned by getSoundSourceCount() will have been decreased by one. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::removeSoundSource (ISoundSource source )  [pure virtual]
    +
    +
    + +

    Removes a sound source from the engine, freeing the memory it occupies.

    +

    This will also cause all currently playing sounds of this source to be stopped. Also note that if the source has been removed successfully, the value returned by getSoundSourceCount() will have been decreased by one. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setAllSoundsPaused (bool  bPaused = true )  [pure virtual]
    +
    +
    + +

    Pauses or unpauses all currently playing sounds.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setDefault3DSoundMaxDistance (ik_f32  maxDistance )  [pure virtual]
    +
    +
    + +

    Sets the default maximal distance for 3D sounds.

    +

    Changing this value is usually not necessary. Use setDefault3DSoundMinDistance() instead. Don't change this value if you don't know what you are doing: This value causes the sound to stop attenuating after it reaches the max distance. Most people think that this sets the volume of the sound to 0 after this distance, but this is not true. Only change the minimal distance (using for example setDefault3DSoundMinDistance()) to influence this. See ISound::setMaxDistance() for details about what the max distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMaxDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    Parameters:
    + + +
    maxDistance Default maximal distance for 3d sounds. The default value is 1000000000.0f.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setDefault3DSoundMinDistance (ik_f32  minDistance )  [pure virtual]
    +
    +
    + +

    Sets the default minimal distance for 3D sounds.

    +

    This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMinDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    Parameters:
    + + +
    minDistance Default minimal distance for 3d sounds. The default value is 1.0f.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setDopplerEffectParameters (ik_f32  dopplerFactor = 1.0f,
    ik_f32  distanceFactor = 1.0f 
    ) [pure virtual]
    +
    +
    + +

    Sets parameters affecting the doppler effect.

    +
    Parameters:
    + + + +
    dopplerFactor is a value between 0 and 10 which multiplies the doppler effect. Default value is 1.0, which is the real world doppler effect, and 10.0f would be ten times the real world doppler effect.
    distanceFactor is the number of meters in a vector unit. The default value is 1.0. Doppler effects are calculated in meters per second, with this parameter, this can be changed, all velocities and positions are influenced by this. If the measurement should be in foot instead of meters, set this value to 0.3048f for example.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setListenerPosition (const vec3df pos,
    const vec3df lookdir,
    const vec3df velPerSecond = vec3df(0, 0, 0),
    const vec3df upVector = vec3df(0, 1, 0) 
    ) [pure virtual]
    +
    +
    + +

    Sets the current listener 3d position.

    +

    When playing sounds in 3D, updating the position of the listener every frame should be done using this function.

    +
    Parameters:
    + + + + + +
    pos Position of the camera or listener.
    lookdir Direction vector where the camera or listener is looking into. If you have a camera position and a target 3d point where it is looking at, this would be cam->getTarget() - cam->getAbsolutePosition().
    velPerSecond The velocity per second describes the speed of the listener and is only needed for doppler effects.
    upvector Vector pointing 'up', so the engine can decide where is left and right. This vector is usually (0,1,0).
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual bool irrklang::ISoundEngine::setMixedDataOutputReceiver (ISoundMixedOutputReceiver receiver )  [pure virtual]
    +
    +
    + +

    Sets the OutputMixedDataReceiver, so you can receive the pure mixed output audio data while it is being played.

    +

    This can be used to store the sound output as .wav file or for creating a Oscillograph or similar. This works only with software based audio drivers, that is ESOD_WIN_MM, ESOD_ALSA, and ESOD_CORE_AUDIO. Returns true if sucessful and fals if the current audio driver doesn't support this feature. Set this to null again once you don't need it anymore.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setRolloffFactor (ik_f32  rolloff )  [pure virtual]
    +
    +
    + +

    Sets a rolloff factor which influences the amount of attenuation that is applied to 3D sounds.

    +

    The rolloff factor can range from 0.0 to 10.0, where 0 is no rolloff. 1.0 is the default rolloff factor set, the value which we also experience in the real world. A value of 2 would mean twice the real-world rolloff.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::setSoundVolume (ik_f32  volume )  [pure virtual]
    +
    +
    + +

    Sets master sound volume. This value is multiplied with all sounds played.

    +
    Parameters:
    + + +
    volume 0 (silent) to 1.0f (full volume)
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEngine::stopAllSounds ( )  [pure virtual]
    +
    +
    + +

    Stops all currently playing sounds.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundEngine::stopAllSoundsOfSoundSource (ISoundSource source )  [pure virtual]
    +
    +
    + +

    Stops all sounds of a specific sound source.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundEngine::update ( )  [pure virtual]
    +
    +
    + +

    Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode.

    +

    This updates the 3d positions of the sounds as well as their volumes, effects, streams and other stuff. Call this several times per frame (the more the better) if you specified irrKlang to run single threaded. Otherwise it is not necessary to use this method. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver-members.html new file mode 100644 index 0000000..c7e7dcb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver-members.html @@ -0,0 +1,82 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundMixedOutputReceiver Member List

    This is the complete list of members for irrklang::ISoundMixedOutputReceiver, including all inherited members. + + +
    OnAudioDataReady(const void *data, int byteCount, int playbackrate)=0irrklang::ISoundMixedOutputReceiver [pure virtual]
    ~ISoundMixedOutputReceiver()irrklang::ISoundMixedOutputReceiver [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver.html new file mode 100644 index 0000000..8eab171 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_mixed_output_receiver.html @@ -0,0 +1,166 @@ + + + + + +irrKlang: irrklang::ISoundMixedOutputReceiver Class Reference + + + + + + + + + +
    +

    irrklang::ISoundMixedOutputReceiver Class Reference

    +

    Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine. +More...

    + +

    #include <ik_ISoundMixedOutputReceiver.h>

    + +

    List of all members.

    + + + + + + +

    Public Member Functions

    virtual ~ISoundMixedOutputReceiver ()
     destructor
    virtual void OnAudioDataReady (const void *data, int byteCount, int playbackrate)=0
     Called when a chunk of sound has been mixed and is about to be played.
    +

    Detailed Description

    +

    Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine.

    +

    This can be used to store the sound output as .wav file or for creating a Oscillograph or similar. Simply implement your own class derived from ISoundMixedOutputReceiver and use ISoundEngine::setMixedDataOutputReceiver to let the audio driver know about it.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::ISoundMixedOutputReceiver::~ISoundMixedOutputReceiver ( )  [inline, virtual]
    +
    +
    + +

    destructor

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ISoundMixedOutputReceiver::OnAudioDataReady (const void *  data,
    int  byteCount,
    int  playbackrate 
    ) [pure virtual]
    +
    +
    + +

    Called when a chunk of sound has been mixed and is about to be played.

    +

    Note: This is called from the playing thread of the sound library, so you need to make everything you are doing in this method thread safe. Additionally, it would be a good idea to do nothing complicated in your implementation and return as fast as possible, otherwise sound output may be stuttering.

    +
    Parameters:
    + + + + +
    data representing the sound frames which just have been mixed. Sound data always consists of two interleaved sound channels at 16bit per frame.
    byteCount Amount of bytes of the data
    playbackrate The playback rate at samples per second (usually something like 44000). This value will not change and always be the same for an instance of an ISoundEngine.
    +
    +
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source-members.html new file mode 100644 index 0000000..6dd79d8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source-members.html @@ -0,0 +1,99 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundSource Member List

    This is the complete list of members for irrklang::ISoundSource, including all inherited members. + + + + + + + + + + + + + + + + + + + +
    drop()=0irrklang::IVirtualRefCounted [pure virtual]
    forceReloadAtNextUse()=0irrklang::ISoundSource [pure virtual]
    getAudioFormat()=0irrklang::ISoundSource [pure virtual]
    getDefaultMaxDistance()=0irrklang::ISoundSource [pure virtual]
    getDefaultMinDistance()=0irrklang::ISoundSource [pure virtual]
    getDefaultVolume()=0irrklang::ISoundSource [pure virtual]
    getForcedStreamingThreshold()=0irrklang::ISoundSource [pure virtual]
    getIsSeekingSupported()=0irrklang::ISoundSource [pure virtual]
    getName()=0irrklang::ISoundSource [pure virtual]
    getPlayLength()=0irrklang::ISoundSource [pure virtual]
    getSampleData()=0irrklang::ISoundSource [pure virtual]
    getStreamMode()=0irrklang::ISoundSource [pure virtual]
    grab()=0irrklang::IVirtualRefCounted [pure virtual]
    setDefaultMaxDistance(ik_f32 maxDistance)=0irrklang::ISoundSource [pure virtual]
    setDefaultMinDistance(ik_f32 minDistance)=0irrklang::ISoundSource [pure virtual]
    setDefaultVolume(ik_f32 volume=1.0f)=0irrklang::ISoundSource [pure virtual]
    setForcedStreamingThreshold(ik_s32 thresholdBytes)=0irrklang::ISoundSource [pure virtual]
    setStreamMode(E_STREAM_MODE mode)=0irrklang::ISoundSource [pure virtual]
    ~IVirtualRefCounted()irrklang::IVirtualRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_source.gif new file mode 100644 index 0000000000000000000000000000000000000000..4536c22cf78a735019d2175a08769251964ea1a0 GIT binary patch literal 867 zcmV-p1DyOvNk%w1VW$940P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui0H**@000C2IJ(^aFv>}*y*OXNyZ>M)j$~<`XsWKJ!oF}U&ot}Sc&_jJ&Huol zu;UvVk4ROK6EHPB&)hT0tb(XcW?+lGM!8*9_zGI0u;bYDlNPkeZs>?gpS`Uf^EV!E zuK8|T9e#9vB71myV1QqOR&`oaj%i$jmVJ_$P=+6RgN;>)qJNT)iI5rgtIM*!U7oF=sEf#`%9fDTiIv6M+{wVF+F*ag z(7KAu-Rom@+0NqS>(hto<+S0QxYy{+_wicl@ec{ zbg0pz9CjjIic=}mrz$l_ol3Q;)vHtiXx+-StJkk!!-^eCwyS}%Xw#})%eJlCw`I@5 zolCc_-MecI=*7#ouiw9D^~wcIxUk{5g7+R?%((H_#Dg76o?JLG<;$4wTF%V5b6(G& zL&p_Ox-{3#rc-A|t-7^j)~;h8hAq4HU)r{FYu3#hFz(*K+5Qere01^SZigdZeww*+ z)+46 zzyAF8$ZY}OaRLrVT!97xhhT!dEtpmSWI@Q4gm+O023{6&A)12~c159G5`OsMTp>;v z8i!?B2tbJtmbl_p8fw*|h%JKUqE|7#DC3R`3V5T32&%}Vj6I^5;)rNv2qTLy?&xHJ zE<*X_k{&jxqmEKysicWhI=SMFV76uCSVDT)BaUXK`PGO)S}Ek4R#K^EnPtX_ + + + + +irrKlang: irrklang::ISoundSource Class Reference + + + + + + + + + +
    +

    irrklang::ISoundSource Class Reference

    +

    A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings. +More...

    + +

    #include <ik_ISoundSource.h>

    +
    +Inheritance diagram for irrklang::ISoundSource:
    +
    +
    + + +irrklang::IVirtualRefCounted + +
    +
    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    virtual const ik_c8getName ()=0
     Returns the name of the sound source (usually, this is the file name).
    virtual void setStreamMode (E_STREAM_MODE mode)=0
     Sets the stream mode which should be used for a sound played from this source.
    virtual E_STREAM_MODE getStreamMode ()=0
     Returns the detected or set type of the sound with wich the sound will be played.
    virtual ik_u32 getPlayLength ()=0
     Returns the play length of the sound in milliseconds.
    virtual SAudioStreamFormat getAudioFormat ()=0
     Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc.
    virtual bool getIsSeekingSupported ()=0
     Returns if sounds played from this source will support seeking via ISound::setPlayPosition().
    virtual void setDefaultVolume (ik_f32 volume=1.0f)=0
     Sets the default volume for a sound played from this source.
    virtual ik_f32 getDefaultVolume ()=0
     Returns the default volume for a sound played from this source.
    virtual void setDefaultMinDistance (ik_f32 minDistance)=0
     sets the default minimal distance for 3D sounds played from this source.
    virtual ik_f32 getDefaultMinDistance ()=0
     Returns the default minimal distance for 3D sounds played from this source.
    virtual void setDefaultMaxDistance (ik_f32 maxDistance)=0
     Sets the default maximal distance for 3D sounds played from this source.
    virtual ik_f32 getDefaultMaxDistance ()=0
     returns the default maxmial distance for 3D sounds played from this source.
    virtual void forceReloadAtNextUse ()=0
     Forces the sound to be reloaded at next replay.
    virtual void setForcedStreamingThreshold (ik_s32 thresholdBytes)=0
     Sets the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
    virtual ik_s32 getForcedStreamingThreshold ()=0
     Returns the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.
    virtual void * getSampleData ()=0
     Returns a pointer to the loaded and decoded sample data.
    +

    Detailed Description

    +

    A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings.

    +

    It provides some informations about the sound source like the play lenght and can have default settings for volume, distances for 3d etc. There is some example code on how to use Sound sources at Using Sound Sources.

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual void irrklang::ISoundSource::forceReloadAtNextUse ( )  [pure virtual]
    +
    +
    + +

    Forces the sound to be reloaded at next replay.

    +

    Sounds which are not played as streams are buffered to make it possible to replay them without much overhead. If the sound file is altered after the sound has been played the first time, the engine won't play the changed file then. Calling this method makes the engine reload the file before the file is played the next time.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual SAudioStreamFormat irrklang::ISoundSource::getAudioFormat ( )  [pure virtual]
    +
    +
    + +

    Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc.

    +
    Returns:
    Returns the structure filled with 0 or negative values if not known for this sound for example because because the file could not be opened or similar. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundSource::getDefaultMaxDistance ( )  [pure virtual]
    +
    +
    + +

    returns the default maxmial distance for 3D sounds played from this source.

    +

    This value influences how loud a sound is heard based on its distance. Changing this value is usually not necessary. Use setDefaultMinDistance() instead. Don't change this value if you don't know what you are doing: This value causes the sound to stop attenuating after it reaches the max distance. Most people think that this sets the volume of the sound to 0 after this distance, but this is not true. Only change the minimal distance (using for example setDefaultMinDistance()) to influence this. See ISound::setMaxDistance() for details about what the max distance is.

    +
    Returns:
    Default maximal distance for 3D sounds from this source. If setDefaultMaxDistance() was set to a negative value, it will return the default value set in the engine, using ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing the default max distance of the sound engine to take effect.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundSource::getDefaultMinDistance ( )  [pure virtual]
    +
    +
    + +

    Returns the default minimal distance for 3D sounds played from this source.

    +

    This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the minimal distance is.

    +
    Returns:
    Default minimal distance for 3d sounds from this source. If setDefaultMinDistance() was set to a negative value, it will return the default value set in the engine, using ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing the default min distance of the sound engine to take effect.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_f32 irrklang::ISoundSource::getDefaultVolume ( )  [pure virtual]
    +
    +
    + +

    Returns the default volume for a sound played from this source.

    +

    You can influence this default volume value using setDefaultVolume(). Note that the default volume is being multiplied with the master volume of ISoundEngine, change this via ISoundEngine::setSoundVolume(). !

    +
    Returns:
    0 (silent) to 1.0f (full volume). Default value is 1.0f.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_s32 irrklang::ISoundSource::getForcedStreamingThreshold ( )  [pure virtual]
    +
    +
    + +

    Returns the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.

    +

    The value is specified in uncompressed bytes and its default value is about one Megabyte. See setForcedStreamingThreshold() for details.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual bool irrklang::ISoundSource::getIsSeekingSupported ( )  [pure virtual]
    +
    +
    + +

    Returns if sounds played from this source will support seeking via ISound::setPlayPosition().

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual const ik_c8* irrklang::ISoundSource::getName ( )  [pure virtual]
    +
    +
    + +

    Returns the name of the sound source (usually, this is the file name).

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual ik_u32 irrklang::ISoundSource::getPlayLength ( )  [pure virtual]
    +
    +
    + +

    Returns the play length of the sound in milliseconds.

    +

    Returns -1 if not known for this sound for example because its decoder does not support lenght reporting or it is a file stream of unknown size. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void* irrklang::ISoundSource::getSampleData ( )  [pure virtual]
    +
    +
    + +

    Returns a pointer to the loaded and decoded sample data.

    +
    Returns:
    Returns a pointer to the sample data. The data is provided in decoded PCM data. The exact format can be retrieved using getAudioFormat(). Use getAudioFormat().getSampleDataSize() for getting the amount of bytes. The returned pointer will only be valid as long as the sound source exists. This function will only return a pointer to the data if the audio file is not streamed, namely ESM_NO_STREAMING. Otherwise this function will return 0. Note: If the sound never has been played before, the sound engine will have to open the file and decode audio data from there, so this call could take a bit depending on the type of the file.
    + +
    +
    + +
    +
    + + + + + + + + +
    virtual E_STREAM_MODE irrklang::ISoundSource::getStreamMode ( )  [pure virtual]
    +
    +
    + +

    Returns the detected or set type of the sound with wich the sound will be played.

    +

    Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the sound has been played the first time.

    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundSource::setDefaultMaxDistance (ik_f32  maxDistance )  [pure virtual]
    +
    +
    + +

    Sets the default maximal distance for 3D sounds played from this source.

    +

    Changing this value is usually not necessary. Use setDefaultMinDistance() instead. Don't change this value if you don't know what you are doing: This value causes the sound to stop attenuating after it reaches the max distance. Most people think that this sets the volume of the sound to 0 after this distance, but this is not true. Only change the minimal distance (using for example setDefaultMinDistance()) to influence this. See ISound::setMaxDistance() for details about what the max distance is. This method only influences the initial distance value of sounds. For changing the distance while the sound is played, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    Parameters:
    + + +
    maxDistance Default maximal distance for 3D sounds from this source. Set it to a negative value to let sounds of this source use the engine level default max distance, which can be set via ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing the default max distance of the sound engine to take effect.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundSource::setDefaultMinDistance (ik_f32  minDistance )  [pure virtual]
    +
    +
    + +

    sets the default minimal distance for 3D sounds played from this source.

    +

    This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. This method only influences the initial distance value of sounds. For changing the distance while the sound is playing, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    Parameters:
    + + +
    minDistance,: Default minimal distance for 3D sounds from this source. Set it to a negative value to let sounds of this source use the engine level default min distance, which can be set via ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing the default min distance of the sound engine to take effect.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundSource::setDefaultVolume (ik_f32  volume = 1.0f )  [pure virtual]
    +
    +
    + +

    Sets the default volume for a sound played from this source.

    +

    The default value of this is 1.0f. Note that the default volume is being multiplied with the master volume of ISoundEngine, change this via ISoundEngine::setSoundVolume(). !

    +
    Parameters:
    + + +
    volume 0 (silent) to 1.0f (full volume). Default value is 1.0f.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundSource::setForcedStreamingThreshold (ik_s32  thresholdBytes )  [pure virtual]
    +
    +
    + +

    Sets the threshold size where irrKlang decides to force streaming a file independent of the user specified setting.

    +

    When specifying ESM_NO_STREAMING for playing back a sound file, irrKlang will ignore this setting if the file is bigger than this threshold and stream the file anyway. Please note that if an audio format loader is not able to return the size of a sound source and returns -1 as length, this will be ignored as well and streaming has to be forced.

    +
    Parameters:
    + + +
    threshold,: New threshold. The value is specified in uncompressed bytes and its default value is about one Megabyte. Set to 0 or a negative value to disable stream forcing.
    +
    +
    + +
    +
    + +
    +
    + + + + + + + + + +
    virtual void irrklang::ISoundSource::setStreamMode (E_STREAM_MODE  mode )  [pure virtual]
    +
    +
    + +

    Sets the stream mode which should be used for a sound played from this source.

    +

    Note that if this is set to ESM_NO_STREAMING, the engine still might decide to stream the sound if it is too big. The threashold for this can be adjusted using ISoundSource::setForcedStreamingThreshold().

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver-members.html new file mode 100644 index 0000000..9535aff --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver-members.html @@ -0,0 +1,82 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::ISoundStopEventReceiver Member List

    This is the complete list of members for irrklang::ISoundStopEventReceiver, including all inherited members. + + +
    OnSoundStopped(ISound *sound, E_STOP_EVENT_CAUSE reason, void *userData)=0irrklang::ISoundStopEventReceiver [pure virtual]
    ~ISoundStopEventReceiver()irrklang::ISoundStopEventReceiver [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver.html new file mode 100644 index 0000000..cf2405e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_sound_stop_event_receiver.html @@ -0,0 +1,166 @@ + + + + + +irrKlang: irrklang::ISoundStopEventReceiver Class Reference + + + + + + + + + +
    +

    irrklang::ISoundStopEventReceiver Class Reference

    +

    Interface to be implemented by the user, which recieves sound stop events. +More...

    + +

    #include <ik_ISoundStopEventReceiver.h>

    + +

    List of all members.

    + + + + + + +

    Public Member Functions

    virtual ~ISoundStopEventReceiver ()
     destructor
    virtual void OnSoundStopped (ISound *sound, E_STOP_EVENT_CAUSE reason, void *userData)=0
     Called when a sound has stopped playing.
    +

    Detailed Description

    +

    Interface to be implemented by the user, which recieves sound stop events.

    +

    The interface has only one method to be implemented by the user: OnSoundStopped(). Implement this interface and set it via ISound::setSoundStopEventReceiver(). The sound stop event is guaranteed to be called when a sound or sound stream is finished, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::ISoundStopEventReceiver::~ISoundStopEventReceiver ( )  [inline, virtual]
    +
    +
    + +

    destructor

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    virtual void irrklang::ISoundStopEventReceiver::OnSoundStopped (ISound sound,
    E_STOP_EVENT_CAUSE  reason,
    void *  userData 
    ) [pure virtual]
    +
    +
    + +

    Called when a sound has stopped playing.

    +

    This is the only method to be implemented by the user. The sound stop event is guaranteed to be called when a sound or sound stream is finished, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. Please note: Sound events will occur in a different thread when the engine runs in multi threaded mode (default). In single threaded mode, the event will happen while the user thread is calling ISoundEngine::update().

    +
    Parameters:
    + + + + +
    sound,: Sound which has been stopped.
    reason,: The reason why the sound stop event was fired. Usually, this will be ESEC_SOUND_FINISHED_PLAYING. When the sound was aborded by calling ISound::stop() or ISoundEngine::stopAllSounds();, this would be ESEC_SOUND_STOPPED_BY_USER. If irrKlang was deleted or the sound source was removed, the value is ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL.
    userData,: userData pointer set by the user when registering the interface via ISound::setSoundStopEventReceiver().
    +
    +
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted-members.html new file mode 100644 index 0000000..6efa488 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted-members.html @@ -0,0 +1,83 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::IVirtualRefCounted Member List

    This is the complete list of members for irrklang::IVirtualRefCounted, including all inherited members. + + + +
    drop()=0irrklang::IVirtualRefCounted [pure virtual]
    grab()=0irrklang::IVirtualRefCounted [pure virtual]
    ~IVirtualRefCounted()irrklang::IVirtualRefCounted [inline, virtual]
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.gif b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ce59ee999f881d21d5b721256eadec5d5222c8b GIT binary patch literal 1292 zcmV+n1@rnxNk%w1VORlB0P+9;|Ns9000960z@MLBkN^MxkN^MxkifveA^8LW00000 zEC2ui09XM~000C22)f+|~xH#+0yZ>M)j$~<$RjRIR>%MTT1afWPcuvuJ@Bcs; zFGwsJg~z0F=^8ShP@pqPtrDl!thR#PdcUeJc$^iJ&t$B5F}d6t){A~n{valsIRV@v%$E^&Z5k-#mI}kxx3g=y^VU@h^WVi)W*@1 z#J1qq-pkd@>9XqC@=4pd)}FENxa*kf`uNGnbqWa2pTKt-1oE55ut+^}{|?537s_5a ziOmX*BXs_8oHC2z8j6&{k)k_{?5r&;gppuMZ~8KNyfw3?%6%hq;&`~RVyjTc@=Rk1 z^4Bkb{bc@BcSjE>cG6hgx}>wJ4Mje%TD_rltJjc6!hO9mw(N?oS8tlly0)zaw`0-5 z9VvG%n!0x9;mr$XFW+5$|MC*-HZb8Th7X@P!ML&G$B-j8R!o_pfy$UOXSuAov*#lQ zLVq4jT1RNkrBkbBaa#21*RUb9Mjg9$ZQ8bTzs9Y*H)-C!gKGvZytrcG#*_0!uDrQh z=FX#!g)Y5%RqEEWH^i=e_w4WB!;2qJzP$PK=+moTpT0W~?(TEIkH2C*{TlY~Q^>FX z1^)m3vH@7ce*!i@V1X4Jh#&w8E*L?B1w!bc0}=vQ;e-oZsGo)ya!8+t4ua^OhzOFX zorwaXXq}4vu_&F3_rd6#jPcR9!~i(vsN;@2_UPk}Kn5w~js^^A7xWnHtFP( zL_#U$lt&6+<&{`wspXbjcIoApV1_B?m}Hg-<^W8Zspgt&w&~`ZX5t9voOIS{=bdOq zFu7{Nuis`1Do{4CupoWU2 zrhoN~fwB)Tt_=lRi*snXhtLYprjxih-+Fw%RGFmfmV7s;}b8rm=p;{_4Q2 z!)A%>u~rtlYP6~T%515<3P7y3+;*!gtJ)T8Dze*dxhu8kjw^1rg(};?wPJ$1?YQao zdO^1L+RLu9=xTW`yYsGFuD|&LjBm6Bhx_c8!1}4HzTARqaJcnS>}|gZPb_i1#6475eH6n-F7=}INgQS&yBa%Psb^; z&RRP?dEk3b{rJn4%RDH^3vB)+<1kZBEV)2`o-*hIkN*1Qg5#{Z-<@CnZR0$*Zg0Z> zQjGY$M%#(H0=sv~`oRd(Yc;(@e=DxQXd^%T^{G-{IPsyM*}SMDldrtmp(bzs>Eo{- zwEFJzjXtJ%$8Tug_B$JX{$nl=K>Lg;9{=tKzyTVtP5vw30T-w{20E}#34EXg--N#j zTChtIyr2gAr@#$bFoPZpA(tvB!V7}1geVjMl~%~Y7P|0-IbsqFXGp^u+He2~0028O Ce5z{z literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.html new file mode 100644 index 0000000..028bb1e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1_i_virtual_ref_counted.html @@ -0,0 +1,175 @@ + + + + + +irrKlang: irrklang::IVirtualRefCounted Class Reference + + + + + + + + + +
    +

    irrklang::IVirtualRefCounted Class Reference

    +

    Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted. +More...

    + +

    #include <ik_IVirtualRefCounted.h>

    +
    +Inheritance diagram for irrklang::IVirtualRefCounted:
    +
    +
    + + +irrklang::ISound +irrklang::ISoundSource + +
    +
    + +

    List of all members.

    + + + + + + + + +

    Public Member Functions

    virtual ~IVirtualRefCounted ()
     Destructor.
    virtual void grab ()=0
     Grabs the object. Increments the reference counter by one.
    virtual bool drop ()=0
     Drops the object. Decrements the reference counter by one.
    +

    Detailed Description

    +

    Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted.

    +

    See IRefCounted for the basics of this class. The difference to IRefCounted is that the class has to implement reference counting for itself.

    +

    Constructor & Destructor Documentation

    + +
    +
    + + + + + + + + +
    virtual irrklang::IVirtualRefCounted::~IVirtualRefCounted ( )  [inline, virtual]
    +
    +
    + +

    Destructor.

    + +
    +
    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    virtual bool irrklang::IVirtualRefCounted::drop ( )  [pure virtual]
    +
    +
    + +

    Drops the object. Decrements the reference counter by one.

    +

    To be implemented by the derived class. If you don't want to implement this, use the class IRefCounted instead. See IRefCounted::grab() for details of this method.

    + +
    +
    + +
    +
    + + + + + + + + +
    virtual void irrklang::IVirtualRefCounted::grab ( )  [pure virtual]
    +
    +
    + +

    Grabs the object. Increments the reference counter by one.

    +

    To be implemented by the derived class. If you don't want to implement this, use the class IRefCounted instead. See IRefCounted::grab() for details of this method.

    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d-members.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d-members.html new file mode 100644 index 0000000..1b50e44 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d-members.html @@ -0,0 +1,123 @@ + + + + + +irrKlang: Member List + + + + + + + + + +
    +

    irrklang::vec3d< T > Member List

    This is the complete list of members for irrklang::vec3d< T >, including all inherited members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    crossProduct(const vec3d< T > &p) const irrklang::vec3d< T > [inline]
    dotProduct(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    equals(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    getAs4Values(T *array)irrklang::vec3d< T > [inline]
    getDistanceFrom(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    getDistanceFromSQ(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    getHorizontalAngle()irrklang::vec3d< T > [inline]
    getInterpolated(const vec3d< T > &other, ik_f32 d) const irrklang::vec3d< T > [inline]
    getLength() const irrklang::vec3d< T > [inline]
    getLengthSQ() const irrklang::vec3d< T > [inline]
    invert()irrklang::vec3d< T > [inline]
    isBetweenPoints(const vec3d< T > &begin, const vec3d< T > &end) const irrklang::vec3d< T > [inline]
    normalize()irrklang::vec3d< T > [inline]
    operator!=(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator*(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator*(const T v) const irrklang::vec3d< T > [inline]
    operator*=(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    operator*=(const T v)irrklang::vec3d< T > [inline]
    operator+(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator+=(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    operator-() const irrklang::vec3d< T > [inline]
    operator-(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator-=(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    operator/(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator/(const T v) const irrklang::vec3d< T > [inline]
    operator/=(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    operator/=(const T v)irrklang::vec3d< T > [inline]
    operator<=(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator=(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    operator==(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    operator>=(const vec3d< T > &other) const irrklang::vec3d< T > [inline]
    rotateXYBy(ik_f64 degrees, const vec3d< T > &center)irrklang::vec3d< T > [inline]
    rotateXZBy(ik_f64 degrees, const vec3d< T > &center)irrklang::vec3d< T > [inline]
    rotateYZBy(ik_f64 degrees, const vec3d< T > &center)irrklang::vec3d< T > [inline]
    set(const T nx, const T ny, const T nz)irrklang::vec3d< T > [inline]
    set(const vec3d< T > &p)irrklang::vec3d< T > [inline]
    setLength(T newlength)irrklang::vec3d< T > [inline]
    vec3d()irrklang::vec3d< T > [inline]
    vec3d(T nx, T ny, T nz)irrklang::vec3d< T > [inline]
    vec3d(const vec3d< T > &other)irrklang::vec3d< T > [inline]
    Xirrklang::vec3d< T >
    Yirrklang::vec3d< T >
    Zirrklang::vec3d< T >
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d.html b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d.html new file mode 100644 index 0000000..6089f06 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/classirrklang_1_1vec3d.html @@ -0,0 +1,1142 @@ + + + + + +irrKlang: irrklang::vec3d< T > Class Template Reference + + + + + + + + + +
    +

    irrklang::vec3d< T > Class Template Reference

    +

    a 3d vector template class for representing vectors and points in 3d +More...

    + +

    #include <ik_vec3d.h>

    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

     vec3d ()
     vec3d (T nx, T ny, T nz)
     vec3d (const vec3d< T > &other)
    vec3d< T > operator- () const
     constructor creating an irrklang vec3d from an irrlicht vector.
    vec3d< T > & operator= (const vec3d< T > &other)
    vec3d< T > operator+ (const vec3d< T > &other) const
    vec3d< T > & operator+= (const vec3d< T > &other)
    vec3d< T > operator- (const vec3d< T > &other) const
    vec3d< T > & operator-= (const vec3d< T > &other)
    vec3d< T > operator* (const vec3d< T > &other) const
    vec3d< T > & operator*= (const vec3d< T > &other)
    vec3d< T > operator* (const T v) const
    vec3d< T > & operator*= (const T v)
    vec3d< T > operator/ (const vec3d< T > &other) const
    vec3d< T > & operator/= (const vec3d< T > &other)
    vec3d< T > operator/ (const T v) const
    vec3d< T > & operator/= (const T v)
    bool operator<= (const vec3d< T > &other) const
    bool operator>= (const vec3d< T > &other) const
    bool operator== (const vec3d< T > &other) const
    bool operator!= (const vec3d< T > &other) const
    bool equals (const vec3d< T > &other)
     returns if this vector equalsfloat the other one, taking floating point rounding errors into account
    void set (const T nx, const T ny, const T nz)
    void set (const vec3d< T > &p)
    ik_f64 getLength () const
     Returns length of the vector.
    ik_f64 getLengthSQ () const
     Returns squared length of the vector.
    dotProduct (const vec3d< T > &other) const
     Returns the dot product with another vector.
    ik_f64 getDistanceFrom (const vec3d< T > &other) const
     Returns distance from an other point.
    ik_f32 getDistanceFromSQ (const vec3d< T > &other) const
     Returns squared distance from an other point.
    vec3d< T > crossProduct (const vec3d< T > &p) const
     Calculates the cross product with another vector.
    bool isBetweenPoints (const vec3d< T > &begin, const vec3d< T > &end) const
     Returns if this vector interpreted as a point is on a line between two other points.
    vec3d< T > & normalize ()
     Normalizes the vector.
    void setLength (T newlength)
     Sets the lenght of the vector to a new value.
    void invert ()
     Inverts the vector.
    void rotateXZBy (ik_f64 degrees, const vec3d< T > &center)
    void rotateXYBy (ik_f64 degrees, const vec3d< T > &center)
    void rotateYZBy (ik_f64 degrees, const vec3d< T > &center)
    vec3d< T > getInterpolated (const vec3d< T > &other, ik_f32 d) const
     Returns interpolated vector.
    vec3d< T > getHorizontalAngle ()
     Gets the Y and Z rotations of a vector.
    void getAs4Values (T *array)
     Fills an array of 4 values with the vector data (usually floats).

    Public Attributes

    X
    Y
    Z
    +

    Detailed Description

    +

    template<class T>
    + class irrklang::vec3d< T >

    + +

    a 3d vector template class for representing vectors and points in 3d

    +

    Constructor & Destructor Documentation

    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    irrklang::vec3d< T >::vec3d ( )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    irrklang::vec3d< T >::vec3d ( nx,
    ny,
    nz 
    ) [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    irrklang::vec3d< T >::vec3d (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::crossProduct (const vec3d< T > &  p )  const [inline]
    +
    +
    + +

    Calculates the cross product with another vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    T irrklang::vec3d< T >::dotProduct (const vec3d< T > &  other )  const [inline]
    +
    +
    + +

    Returns the dot product with another vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    bool irrklang::vec3d< T >::equals (const vec3d< T > &  other )  [inline]
    +
    +
    + +

    returns if this vector equalsfloat the other one, taking floating point rounding errors into account

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    void irrklang::vec3d< T >::getAs4Values (T *  array )  [inline]
    +
    +
    + +

    Fills an array of 4 values with the vector data (usually floats).

    +

    Useful for setting in shader constants for example. The fourth value will always be 0.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    ik_f64 irrklang::vec3d< T >::getDistanceFrom (const vec3d< T > &  other )  const [inline]
    +
    +
    + +

    Returns distance from an other point.

    +

    Here, the vector is interpreted as point in 3 dimensional space.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    ik_f32 irrklang::vec3d< T >::getDistanceFromSQ (const vec3d< T > &  other )  const [inline]
    +
    +
    + +

    Returns squared distance from an other point.

    +

    Here, the vector is interpreted as point in 3 dimensional space.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::getHorizontalAngle ( )  [inline]
    +
    +
    + +

    Gets the Y and Z rotations of a vector.

    +

    Thanks to Arras on the Irrlicht forums to add this method.

    +
    Returns:
    A vector representing the rotation in degrees of this vector. The Z component of the vector will always be 0.
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::getInterpolated (const vec3d< T > &  other,
    ik_f32  d 
    ) const [inline]
    +
    +
    + +

    Returns interpolated vector.

    +
    Parameters:
    + + + +
    other,: other vector to interpolate between
    d,: value between 0.0f and 1.0f.
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    ik_f64 irrklang::vec3d< T >::getLength ( )  const [inline]
    +
    +
    + +

    Returns length of the vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    ik_f64 irrklang::vec3d< T >::getLengthSQ ( )  const [inline]
    +
    +
    + +

    Returns squared length of the vector.

    +

    This is useful because it is much faster then getLength().

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    void irrklang::vec3d< T >::invert ( )  [inline]
    +
    +
    + +

    Inverts the vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + +
    bool irrklang::vec3d< T >::isBetweenPoints (const vec3d< T > &  begin,
    const vec3d< T > &  end 
    ) const [inline]
    +
    +
    + +

    Returns if this vector interpreted as a point is on a line between two other points.

    +

    It is assumed that the point is on the line.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::normalize ( )  [inline]
    +
    +
    + +

    Normalizes the vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    bool irrklang::vec3d< T >::operator!= (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator* (const T  v )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator* (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator*= (const T  v )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator*= (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator+ (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator+= (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator- (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator- ( )  const [inline]
    +
    +
    + +

    constructor creating an irrklang vec3d from an irrlicht vector.

    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator-= (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator/ (const T  v )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T> irrklang::vec3d< T >::operator/ (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator/= (const T  v )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator/= (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    bool irrklang::vec3d< T >::operator<= (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    vec3d<T>& irrklang::vec3d< T >::operator= (const vec3d< T > &  other )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    bool irrklang::vec3d< T >::operator== (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    bool irrklang::vec3d< T >::operator>= (const vec3d< T > &  other )  const [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + +
    void irrklang::vec3d< T >::rotateXYBy (ik_f64  degrees,
    const vec3d< T > &  center 
    ) [inline]
    +
    +
    +

    Rotates the vector by a specified number of degrees around the Z axis and the specified center.

    +
    Parameters:
    + + + +
    degrees,: Number of degrees to rotate around the Z axis.
    center,: The center of the rotation.
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + +
    void irrklang::vec3d< T >::rotateXZBy (ik_f64  degrees,
    const vec3d< T > &  center 
    ) [inline]
    +
    +
    +

    Rotates the vector by a specified number of degrees around the Y axis and the specified center.

    +
    Parameters:
    + + + +
    degrees,: Number of degrees to rotate around the Y axis.
    center,: The center of the rotation.
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + +
    void irrklang::vec3d< T >::rotateYZBy (ik_f64  degrees,
    const vec3d< T > &  center 
    ) [inline]
    +
    +
    +

    Rotates the vector by a specified number of degrees around the X axis and the specified center.

    +
    Parameters:
    + + + +
    degrees,: Number of degrees to rotate around the X axis.
    center,: The center of the rotation.
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    void irrklang::vec3d< T >::set (const vec3d< T > &  p )  [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void irrklang::vec3d< T >::set (const T  nx,
    const T  ny,
    const T  nz 
    ) [inline]
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + + + + + + +
    void irrklang::vec3d< T >::setLength ( newlength )  [inline]
    +
    +
    + +

    Sets the lenght of the vector to a new value.

    + +
    +
    +

    Member Data Documentation

    + +
    +
    +
    +template<class T>
    + + + + +
    T irrklang::vec3d< T >::X
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + +
    T irrklang::vec3d< T >::Y
    +
    +
    + +
    +
    + +
    +
    +
    +template<class T>
    + + + + +
    T irrklang::vec3d< T >::Z
    +
    +
    + +
    +
    +
    The documentation for this class was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/doxygen.css b/Thirdparty/irrKlang/doc/cpp/doxygen.css new file mode 100644 index 0000000..9e3cb02 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/doxygen.css @@ -0,0 +1,374 @@ +table.irrlicht { + width: 100%; + background-color: #AA0000; + text-align: center; + margin: 0px; + padding: 0px; + border-spacing: 4px 2px; + border-color: #b0b0b0; + border-width: 1px; + border-style: solid; +} + +table.irrlicht a:hover +{ + background-color: #2A3798; +} +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { background: #e8eef2; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; + white-space: nowrap; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { font-size: 9pt; font-weight: bold; } +.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } +.directory > h3 { margin-top: 0; } +.directory p { margin: 0px; white-space: nowrap; } +.directory div { display: none; margin: 0px; } +.directory img { vertical-align: -30%; } diff --git a/Thirdparty/irrKlang/doc/cpp/doxygen.png b/Thirdparty/irrKlang/doc/cpp/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/files.html b/Thirdparty/irrKlang/doc/cpp/files.html new file mode 100644 index 0000000..0846bfa --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/files.html @@ -0,0 +1,101 @@ + + + + + +irrKlang: File Index + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions.html b/Thirdparty/irrKlang/doc/cpp/functions.html new file mode 100644 index 0000000..86490ef --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions.html @@ -0,0 +1,131 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - a -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x63.html b/Thirdparty/irrKlang/doc/cpp/functions_0x63.html new file mode 100644 index 0000000..eb45566 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x63.html @@ -0,0 +1,128 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - c -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x64.html b/Thirdparty/irrKlang/doc/cpp/functions_0x64.html new file mode 100644 index 0000000..b219be9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x64.html @@ -0,0 +1,150 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - d -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x65.html b/Thirdparty/irrKlang/doc/cpp/functions_0x65.html new file mode 100644 index 0000000..2cd6719 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x65.html @@ -0,0 +1,143 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - e -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x66.html b/Thirdparty/irrKlang/doc/cpp/functions_0x66.html new file mode 100644 index 0000000..5b173bb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x66.html @@ -0,0 +1,119 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - f -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x67.html b/Thirdparty/irrKlang/doc/cpp/functions_0x67.html new file mode 100644 index 0000000..ee52f14 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x67.html @@ -0,0 +1,260 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - g -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x69.html b/Thirdparty/irrKlang/doc/cpp/functions_0x69.html new file mode 100644 index 0000000..e8e6f01 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x69.html @@ -0,0 +1,167 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - i -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x6c.html b/Thirdparty/irrKlang/doc/cpp/functions_0x6c.html new file mode 100644 index 0000000..9838eaa --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x6c.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - l -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x6e.html b/Thirdparty/irrKlang/doc/cpp/functions_0x6e.html new file mode 100644 index 0000000..082c93f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x6e.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - n -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x6f.html b/Thirdparty/irrKlang/doc/cpp/functions_0x6f.html new file mode 100644 index 0000000..15b5a27 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x6f.html @@ -0,0 +1,161 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - o -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x70.html b/Thirdparty/irrKlang/doc/cpp/functions_0x70.html new file mode 100644 index 0000000..fa28e05 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x70.html @@ -0,0 +1,134 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - p -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x72.html b/Thirdparty/irrKlang/doc/cpp/functions_0x72.html new file mode 100644 index 0000000..385e007 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x72.html @@ -0,0 +1,137 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - r -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x73.html b/Thirdparty/irrKlang/doc/cpp/functions_0x73.html new file mode 100644 index 0000000..cec2f8c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x73.html @@ -0,0 +1,219 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - s -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x75.html b/Thirdparty/irrKlang/doc/cpp/functions_0x75.html new file mode 100644 index 0000000..6cbf51c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x75.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - u -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x76.html b/Thirdparty/irrKlang/doc/cpp/functions_0x76.html new file mode 100644 index 0000000..860b5e5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x76.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - v -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x78.html b/Thirdparty/irrKlang/doc/cpp/functions_0x78.html new file mode 100644 index 0000000..557cd75 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x78.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - x -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x79.html b/Thirdparty/irrKlang/doc/cpp/functions_0x79.html new file mode 100644 index 0000000..f5fd4ed --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x79.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - y -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x7a.html b/Thirdparty/irrKlang/doc/cpp/functions_0x7a.html new file mode 100644 index 0000000..96aaefa --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x7a.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - z -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_0x7e.html b/Thirdparty/irrKlang/doc/cpp/functions_0x7e.html new file mode 100644 index 0000000..4e84e8d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_0x7e.html @@ -0,0 +1,137 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all class members with links to the classes they belong to: + +

    - ~ -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_func.html b/Thirdparty/irrKlang/doc/cpp/functions_func.html new file mode 100644 index 0000000..fad1f94 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_func.html @@ -0,0 +1,685 @@ + + + + + +irrKlang: Class Members - Functions + + + + + + + + + +
    +  + +

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - u -

    + + +

    - v -

    + + +

    - ~ -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/functions_vars.html b/Thirdparty/irrKlang/doc/cpp/functions_vars.html new file mode 100644 index 0000000..4791828 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/functions_vars.html @@ -0,0 +1,124 @@ + + + + + +irrKlang: Class Members - Variables + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/globals.html b/Thirdparty/irrKlang/doc/cpp/globals.html new file mode 100644 index 0000000..22c0818 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/globals.html @@ -0,0 +1,95 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all file members with links to the files they belong to: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/globals_defs.html b/Thirdparty/irrKlang/doc/cpp/globals_defs.html new file mode 100644 index 0000000..ab70a56 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/globals_defs.html @@ -0,0 +1,95 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/hierarchy.html b/Thirdparty/irrKlang/doc/cpp/hierarchy.html new file mode 100644 index 0000000..ccacbff --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/hierarchy.html @@ -0,0 +1,103 @@ + + + + + +irrKlang: Hierarchical Index + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h.html new file mode 100644 index 0000000..5e9762b --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h.html @@ -0,0 +1,105 @@ + + + + + +irrKlang: ik_ESoundEngineOptions.h File Reference + + + + + + + + + +
    +

    ik_ESoundEngineOptions.h File Reference

    +

    Go to the source code of this file.

    + + + + +

    +

    + + + +

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Enumerations

    enum  irrklang::E_SOUND_ENGINE_OPTIONS {
    +  irrklang::ESEO_MULTI_THREADED = 0x01, +irrklang::ESEO_MUTE_IF_NOT_FOCUSED = 0x02, +irrklang::ESEO_LOAD_PLUGINS = 0x04, +irrklang::ESEO_USE_3D_BUFFERS = 0x08, +
    +  irrklang::ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER = 0x10, +irrklang::ESEO_PRINT_DEBUG_INFO_TO_STDOUT = 0x20, +irrklang::ESEO_LINEAR_ROLLOFF = 0x40, +irrklang::ESEO_DEFAULT_OPTIONS = ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT, +
    +  irrklang::ESEO_FORCE_32_BIT = 0x7fffffff +
    + }
     

    An enumeration for all options for starting up the sound engine.

    + More...
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h_source.html new file mode 100644 index 0000000..b801c7c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_engine_options_8h_source.html @@ -0,0 +1,120 @@ + + + + + +irrKlang: ik_ESoundEngineOptions.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h.html new file mode 100644 index 0000000..626ffb3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h.html @@ -0,0 +1,105 @@ + + + + + +irrKlang: ik_ESoundOutputDrivers.h File Reference + + + + + + + + + +
    +

    ik_ESoundOutputDrivers.h File Reference

    +

    Go to the source code of this file.

    + + + + +

    +

    + + + +

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Enumerations

    enum  irrklang::E_SOUND_OUTPUT_DRIVER {
    +  irrklang::ESOD_AUTO_DETECT = 0, +irrklang::ESOD_DIRECT_SOUND_8, +irrklang::ESOD_DIRECT_SOUND, +irrklang::ESOD_WIN_MM, +
    +  irrklang::ESOD_ALSA, +irrklang::ESOD_CORE_AUDIO, +irrklang::ESOD_NULL, +irrklang::ESOD_COUNT, +
    +  irrklang::ESOD_FORCE_32_BIT = 0x7fffffff +
    + }
     

    An enumeration for all types of supported sound drivers.

    + More...
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h_source.html new file mode 100644 index 0000000..ea8a772 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_sound_output_drivers_8h_source.html @@ -0,0 +1,116 @@ + + + + + +irrKlang: ik_ESoundOutputDrivers.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h.html new file mode 100644 index 0000000..84d90d7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h.html @@ -0,0 +1,96 @@ + + + + + +irrKlang: ik_EStreamModes.h File Reference + + + + + + + + + +
    +

    ik_EStreamModes.h File Reference

    +

    Go to the source code of this file.

    + + + + +

    +

    + + + +

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Enumerations

    enum  irrklang::E_STREAM_MODE { irrklang::ESM_AUTO_DETECT = 0, +irrklang::ESM_STREAMING, +irrklang::ESM_NO_STREAMING, +irrklang::ESM_FORCE_32_BIT = 0x7fffffff + }
     

    An enumeration for all types of supported stream modes.

    + More...
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h_source.html new file mode 100644 index 0000000..4e1e5b5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___e_stream_modes_8h_source.html @@ -0,0 +1,101 @@ + + + + + +irrKlang: ik_EStreamModes.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h.html new file mode 100644 index 0000000..1f29d4f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h.html @@ -0,0 +1,95 @@ + + + + + +irrKlang: ik_IAudioRecorder.h File Reference + + + + + + + + + +
    +

    ik_IAudioRecorder.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_ISoundSource.h"
    + +

    Go to the source code of this file.

    + + + + + + + + + +

    +

    +

    Classes

    class  irrklang::IAudioRecorder
     Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function. More...
    class  irrklang::ICapturedAudioDataReceiver
     Interface to be implemented by the user if access to the recorded audio data is needed. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h_source.html new file mode 100644 index 0000000..0b2a064 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_recorder_8h_source.html @@ -0,0 +1,142 @@ + + + + + +irrKlang: ik_IAudioRecorder.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h.html new file mode 100644 index 0000000..d853c6d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h.html @@ -0,0 +1,93 @@ + + + + + +irrKlang: ik_IAudioStream.h File Reference + + + + + + + + + +
    +

    ik_IAudioStream.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_SAudioStreamFormat.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IAudioStream
     Reads and decodes audio data into an usable audio stream for the ISoundEngine. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h_source.html new file mode 100644 index 0000000..57de16e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_8h_source.html @@ -0,0 +1,113 @@ + + + + + +irrKlang: ik_IAudioStream.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h.html new file mode 100644 index 0000000..ea40e80 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h.html @@ -0,0 +1,93 @@ + + + + + +irrKlang: ik_IAudioStreamLoader.h File Reference + + + + + + + + + +
    +

    ik_IAudioStreamLoader.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_IFileReader.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IAudioStreamLoader
     Class which is able to create an audio file stream from a file. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h_source.html new file mode 100644 index 0000000..3b05e80 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_audio_stream_loader_8h_source.html @@ -0,0 +1,109 @@ + + + + + +irrKlang: ik_IAudioStreamLoader.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h.html new file mode 100644 index 0000000..7fc9514 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h.html @@ -0,0 +1,92 @@ + + + + + +irrKlang: ik_IFileFactory.h File Reference + + + + + + + + + +
    +

    ik_IFileFactory.h File Reference

    #include "ik_IRefCounted.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IFileFactory
     Interface to overwrite file access in irrKlang. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h_source.html new file mode 100644 index 0000000..7bd5de2 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_file_factory_8h_source.html @@ -0,0 +1,104 @@ + + + + + +irrKlang: ik_IFileFactory.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h.html new file mode 100644 index 0000000..889130e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h.html @@ -0,0 +1,92 @@ + + + + + +irrKlang: ik_IFileReader.h File Reference + + + + + + + + + +
    +

    ik_IFileReader.h File Reference

    #include "ik_IRefCounted.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IFileReader
     Interface providing read acess to a file. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h_source.html new file mode 100644 index 0000000..0265a7d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_file_reader_8h_source.html @@ -0,0 +1,109 @@ + + + + + +irrKlang: ik_IFileReader.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h.html new file mode 100644 index 0000000..9c46818 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h.html @@ -0,0 +1,92 @@ + + + + + +irrKlang: ik_IRefCounted.h File Reference + + + + + + + + + +
    +

    ik_IRefCounted.h File Reference

    #include "ik_irrKlangTypes.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IRefCounted
     Base class of most objects of the irrKlang. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h_source.html new file mode 100644 index 0000000..06deae2 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_ref_counted_8h_source.html @@ -0,0 +1,125 @@ + + + + + +irrKlang: ik_IRefCounted.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h.html new file mode 100644 index 0000000..7a54f50 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h.html @@ -0,0 +1,94 @@ + + + + + +irrKlang: ik_ISound.h File Reference + + + + + + + + + +
    +

    ik_ISound.h File Reference

    #include "ik_IVirtualRefCounted.h"
    +#include "ik_ISoundEffectControl.h"
    +#include "ik_vec3d.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISound
     Represents a sound which is currently played. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h_source.html new file mode 100644 index 0000000..c4cfdbb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_8h_source.html @@ -0,0 +1,174 @@ + + + + + +irrKlang: ik_ISound.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h.html new file mode 100644 index 0000000..51c11f4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h.html @@ -0,0 +1,92 @@ + + + + + +irrKlang: ik_ISoundDeviceList.h File Reference + + + + + + + + + +
    +

    ik_ISoundDeviceList.h File Reference

    #include "ik_IRefCounted.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISoundDeviceList
     A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h_source.html new file mode 100644 index 0000000..d91b9cd --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_device_list_8h_source.html @@ -0,0 +1,107 @@ + + + + + +irrKlang: ik_ISoundDeviceList.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h.html new file mode 100644 index 0000000..4dfaccb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h.html @@ -0,0 +1,93 @@ + + + + + +irrKlang: ik_ISoundEffectControl.h File Reference + + + + + + + + + +
    +

    ik_ISoundEffectControl.h File Reference

    #include "ik_IVirtualRefCounted.h"
    +#include "ik_vec3d.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISoundEffectControl
     Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h_source.html new file mode 100644 index 0000000..d107e2d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_effect_control_8h_source.html @@ -0,0 +1,205 @@ + + + + + +irrKlang: ik_ISoundEffectControl.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h.html new file mode 100644 index 0000000..08f0a3c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h.html @@ -0,0 +1,100 @@ + + + + + +irrKlang: ik_ISoundEngine.h File Reference + + + + + + + + + +
    +

    ik_ISoundEngine.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_vec3d.h"
    +#include "ik_ISoundSource.h"
    +#include "ik_ISound.h"
    +#include "ik_EStreamModes.h"
    +#include "ik_IFileFactory.h"
    +#include "ik_ISoundMixedOutputReceiver.h"
    + +

    Go to the source code of this file.

    + + + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISoundEngine
     Interface to the sound engine, for playing 3d and 2d sound and music. More...
    struct  irrklang::SInternalAudioInterface
     structure for returning pointers to the internal audio interface. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h_source.html new file mode 100644 index 0000000..3818b50 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_engine_8h_source.html @@ -0,0 +1,252 @@ + + + + + +irrKlang: ik_ISoundEngine.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h.html new file mode 100644 index 0000000..43809c4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h.html @@ -0,0 +1,93 @@ + + + + + +irrKlang: ik_ISoundMixedOutputReceiver.h File Reference + + + + + + + + + +
    +

    ik_ISoundMixedOutputReceiver.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_SAudioStreamFormat.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISoundMixedOutputReceiver
     Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h_source.html new file mode 100644 index 0000000..7cf1781 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_mixed_output_receiver_8h_source.html @@ -0,0 +1,109 @@ + + + + + +irrKlang: ik_ISoundMixedOutputReceiver.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h.html new file mode 100644 index 0000000..377e449 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h.html @@ -0,0 +1,95 @@ + + + + + +irrKlang: ik_ISoundSource.h File Reference + + + + + + + + + +
    +

    ik_ISoundSource.h File Reference

    #include "ik_IVirtualRefCounted.h"
    +#include "ik_vec3d.h"
    +#include "ik_EStreamModes.h"
    +#include "ik_SAudioStreamFormat.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::ISoundSource
     A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h_source.html new file mode 100644 index 0000000..3a13e33 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_source_8h_source.html @@ -0,0 +1,138 @@ + + + + + +irrKlang: ik_ISoundSource.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h.html new file mode 100644 index 0000000..a468231 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h.html @@ -0,0 +1,101 @@ + + + + + +irrKlang: ik_ISoundStopEventReceiver.h File Reference + + + + + + + + + +
    +

    ik_ISoundStopEventReceiver.h File Reference

    #include "ik_IRefCounted.h"
    +#include "ik_SAudioStreamFormat.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    + + + +

    Classes

    class  irrklang::ISoundStopEventReceiver
     Interface to be implemented by the user, which recieves sound stop events. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Enumerations

    enum  irrklang::E_STOP_EVENT_CAUSE { irrklang::ESEC_SOUND_FINISHED_PLAYING = 0, +irrklang::ESEC_SOUND_STOPPED_BY_USER, +irrklang::ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL, +irrklang::ESEC_FORCE_32_BIT = 0x7fffffff + }
     

    An enumeration listing all reasons for a fired sound stop event.

    + More...
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h_source.html new file mode 100644 index 0000000..4b687fd --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_sound_stop_event_receiver_8h_source.html @@ -0,0 +1,121 @@ + + + + + +irrKlang: ik_ISoundStopEventReceiver.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h.html new file mode 100644 index 0000000..4f296ca --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h.html @@ -0,0 +1,92 @@ + + + + + +irrKlang: ik_IVirtualRefCounted.h File Reference + + + + + + + + + +
    +

    ik_IVirtualRefCounted.h File Reference

    #include "ik_irrKlangTypes.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    +

    Classes

    class  irrklang::IVirtualRefCounted
     Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted. More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h_source.html new file mode 100644 index 0000000..729401c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___i_virtual_ref_counted_8h_source.html @@ -0,0 +1,113 @@ + + + + + +irrKlang: ik_IVirtualRefCounted.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h.html b/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h.html new file mode 100644 index 0000000..a3e460c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h.html @@ -0,0 +1,98 @@ + + + + + +irrKlang: ik_SAudioStreamFormat.h File Reference + + + + + + + + + +
    +

    ik_SAudioStreamFormat.h File Reference

    #include "ik_IRefCounted.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    + + + +

    Classes

    struct  irrklang::SAudioStreamFormat
     structure describing an audio stream format with helper functions More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Enumerations

    enum  irrklang::ESampleFormat { irrklang::ESF_U8, +irrklang::ESF_S16 + }
     

    audio sample data format enumeration for supported formats

    + More...
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h_source.html new file mode 100644 index 0000000..55ee767 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik___s_audio_stream_format_8h_source.html @@ -0,0 +1,135 @@ + + + + + +irrKlang: ik_SAudioStreamFormat.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h.html b/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h.html new file mode 100644 index 0000000..b4ea7dd --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h.html @@ -0,0 +1,118 @@ + + + + + +irrKlang: ik_irrKlangTypes.h File Reference + + + + + + + + + +
    +

    ik_irrKlangTypes.h File Reference

    #include <wchar.h>
    + +

    Go to the source code of this file.

    + + + + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Typedefs

    typedef unsigned char irrklang::ik_u8
     8 bit unsigned variable.
    typedef signed char irrklang::ik_s8
     8 bit signed variable.
    typedef char irrklang::ik_c8
     8 bit character variable.
    typedef unsigned short irrklang::ik_u16
     16 bit unsigned variable.
    typedef signed short irrklang::ik_s16
     16 bit signed variable.
    typedef unsigned int irrklang::ik_u32
     32 bit unsigned variable.
    typedef signed int irrklang::ik_s32
     32 bit signed variable.
    typedef float irrklang::ik_f32
     32 bit floating point variable.
    typedef double irrklang::ik_f64
     64 bit floating point variable.

    Functions

    bool irrklang::equalsfloat (const ik_f32 a, const ik_f32 b, const ik_f32 tolerance=IK_ROUNDING_ERROR_32)

    Variables

    const ik_f32 irrklang::IK_ROUNDING_ERROR_32 = 0.000001f
    const ik_f64 irrklang::IK_PI64 = 3.1415926535897932384626433832795028841971693993751
    const ik_f32 irrklang::IK_PI32 = 3.14159265359f
    const ik_f32 irrklang::IK_RADTODEG = 180.0f / IK_PI32
    const ik_f32 irrklang::IK_DEGTORAD = IK_PI32 / 180.0f
    const ik_f64 irrklang::IK_RADTODEG64 = 180.0 / IK_PI64
    const ik_f64 irrklang::IK_DEGTORAD64 = IK_PI64 / 180.0
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h_source.html new file mode 100644 index 0000000..a342486 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik__irr_klang_types_8h_source.html @@ -0,0 +1,154 @@ + + + + + +irrKlang: ik_irrKlangTypes.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h.html b/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h.html new file mode 100644 index 0000000..6d0e2cc --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h.html @@ -0,0 +1,101 @@ + + + + + +irrKlang: ik_vec3d.h File Reference + + + + + + + + + +
    +

    ik_vec3d.h File Reference

    #include <math.h>
    +#include "ik_irrKlangTypes.h"
    + +

    Go to the source code of this file.

    + + + + + + + +

    +

    + + + + + + + + +

    Classes

    class  irrklang::vec3d< T >
     a 3d vector template class for representing vectors and points in 3d More...

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Typedefs

    typedef vec3d< ik_f32 > irrklang::vec3df
     Typedef for a ik_f32 3d vector, a vector using floats for X, Y and Z.
    typedef vec3d< ik_s32 > irrklang::vec3di
     Typedef for an integer 3d vector, a vector using ints for X, Y and Z.

    Functions

    template<class S , class T >
    vec3d< T > irrklang::operator* (const S scalar, const vec3d< T > &vector)
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h_source.html b/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h_source.html new file mode 100644 index 0000000..e1796b6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/ik__vec3d_8h_source.html @@ -0,0 +1,302 @@ + + + + + +irrKlang: ik_vec3d.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/index.html b/Thirdparty/irrKlang/doc/cpp/index.html new file mode 100644 index 0000000..2295966 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/index.html @@ -0,0 +1,667 @@ + + + + + +irrKlang: irrKlang 1.6.0 API documentation + + + + + + + + + +
    +

    irrKlang 1.6.0 API documentation

    +logobig.png +
    +

    +Contents

    +

    General:
    + Introduction
    + Features of irrKlang
    + Links into the API documentation
    + Tips and Tricks
    +
    + Programming irrKlang:
    + Starting up the Engine
    + Playing Sounds
    + Influencing Sounds during Playback
    + Using Sound Sources
    + 3D Sound
    + Removing Sounds
    + Using Sound Events
    + Memory Playback
    + Sound Effects
    + Overriding File Access
    + Adding Audio Decoders
    + Creating irrKlang Plugins
    + Using irrKlang as static Lib
    + Enumerating sound devices
    + Recording Audio
    + Unicode support
    +
    + Short full examples:
    + Quick Start Example
    + Quick Start Example 2
    +
    +
    +

    +

    +Introduction

    +

    Welcome to the irrKlang API documentation. This page should give you a short overview over irrKlang, the high level audio library. In this documentation files you'll find any information you'll need to develop applications with irrKlang using C++. If you are looking for a tutorial on how to start, you'll find some on the homepage of irrKlang at http://www.ambiera.com/irrklang or inside the SDK in the directory .

    +

    The irrKlang library is intended to be an easy-to-use 3d and 2d sound engine, so this documentation is an important part of it. If you have any questions or suggestions, please take a look into the ambiera.com forum or just send a mail.

    +


    +
    +

    +

    +Features of irrKlang

    +

    irrKlang is a high level 2D and 3D cross platform sound engine and audio library. It has a very simply object orientated interface and was designed to be used in games, scientific simulations, architectural visualizations and similar. irrKlang plays several file formats such as

    +
      +
    • +RIFF WAVE (*.wav)
    • +
    • +Ogg Vorbis (*.ogg)
    • +
    • +MPEG-1 Audio Layer 3 (*.mp3)
    • +
    • +Free Lossless Audio Codec (*.flac)
    • +
    • +Amiga Modules (*.mod)
    • +
    • +Impulse Tracker (*.it)
    • +
    • +Scream Tracker 3 (*.s3d)
    • +
    • +Fast Tracker 2 (*.xm)
    • +
    +

    It is also able to run on different operating systems and use several output drivers:

    +
      +
    • +Windows 98, ME, NT 4, 2000, XP, Vista, Windows 7, Windows 8
        +
      • +DirectSound
      • +
      • +DirectSound8
      • +
      • +WinMM
      • +
      +
    • +
    • +Linux / *nix
        +
      • +ALSA
      • +
      +
    • +
    • +MacOSX (x86 and PPC)
        +
      • +CoreAudio
      • +
      +
    • +
    +


    +
    +
    +

    +

    +Links into the API documentation

    +

    irrklang::ISoundEngine: The main class of irrKlang.
    + Class list: List of all classes with descriptions.
    + Class members: Good place to find forgotten features.
    +
    +
    +
    +

    +

    +Tips and Tricks

    +

    This section lists a few tips you might consider when implementing the sound part of your application using irrKlang:

    +
      +
    • +If you can choose which audio file format is the primary one for your application, use .OGG files, instead of for example .MP3 files. irrKlang uses a lot less memory and CPU power when playing .OGGs.
    • +
    • +To keep your application simple, each time you play a sound, you can use for example play2D("filename.mp3") and let irrKlang handle the rest. There is no need to implement a preloading/caching/file management system for the audio playback. irrKlang will handle all this by itself and will never load a file twice.
    • +
    • +irrKlang is crashing in your application? This should not happen, irrKlang is pretty stable, and in most cases, this is a problem in your code: In a lot of cases the reason is simply a wrong call to irrklang::IRefCounted::drop(). Be sure you are doing it correctly. (If you are unsure, tempoarily remove all calls to irrklang::IRefCounted::drop() and see if this helps.)
    • +
    +


    +
    +
    +
    +

    +

    +Starting up the Engine

    +

    irrKlang is designed so that it is very easy to achieve everything, its interface should be very simple to use. The Quick Start Example shows how to play and mp3 file, and there is another example, Quick Start Example 2, showing some few more details.
    + To start up the sound engine, you simply need to call createIrrKlangDevice(). To shut it down, call IRefCounted::drop():

    +
     #include <irrKlang.h>
    +
    + // ...
    +
    + // start up the engine
    + irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
    +        
    + // ...
    + 
    + // after finished,
    + // close the engine again, similar as calling 'delete'
    + engine->drop(); 
    +

    The createIrrKlangDevice() function also accepts several parameters, so that you can specify which sound driver should be used, if plugins should be used, if irrKlang should run in multithreaded mode, and similar.
    +
    +
    +
    +

    +

    +Playing Sounds

    +

    Once you have irrKlang running (like in Starting up the Engine), you can start playing sounds:

    +
     engine->play2D("someSoundFile.wav"); 
    +

    This works with all supported file types. You can replace "someSoundFile.wav" with "someSoundFile.mp3", or "someSoundFile.ogg", for example.
    + To play a sound looped, set the second parameter to 'true':

    +
     engine->play2D("myMusic.mp3", true); 
    +

    To stop this looping sound again, use engine->stopAllSounds() to stop all sounds, or irrklang::ISound::stop() if you only want to stop that single sound. Influencing Sounds during Playback shows how to get to that ISound interface.
    +
    +
    +
    +

    +

    +Influencing Sounds during Playback

    +

    To influence parameters of the sound such as pan, volume or playback speed during runtime, to get the play position or stop playback of single playing sounds, you can use the irrklang::ISound interface. irrklang::ISoundEngine::play2D (but also play3D) returns a pointer to this interface when its third ('startPaused') or fourth ('track') parameter was set to true:

    +
     irrklang::ISound* snd = engine->play2D("myMusic.mp3", true, false, true); 
    +
    + // ...
    +
    + if (snd)
    +     snd->setVolume(someNewValue);
    + 
    + // ...
    + 
    + if (snd)
    + {
    +     snd->drop(); // don't forget to release the pointer once it is no longer needed by you
    +     snd = 0;
    + }
    +

    The irrklang::ISound interface can also be used to test if the sound has been finished, set event receivers, pause and unpause sounds and similar.
    +
    +
    +
    +

    +

    +Using Sound Sources

    +

    To be more flexible playing back sounds, irrKlang uses the concept of sound sources. A sound source can be simply the name of a sound file, such as "sound.wav". It is possible to add "sound.wav" as sound source to irrKlang, and play it using the sound source pointer:

    +
     irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); 
    +
    + engine->play2D(shootSound);
    +
    + // note: you don't need to drop() the shootSound if you don't use it anymore
    +

    The advantage of using irrklang::ISoundSource is that it is possible to set default values for this source, such as volume or distances if it should be used as 3D sound:

    +
     irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); 
    +
    + shootSound->setDefaultVolume(0.5f);
    +
    + // shootSound will now be played with half its sound volume by default:
    + engine->play2D(shootSound);
    +

    It is also possible to have multiple settings for the same sound file:

    +
     irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); 
    + irrklang::ISoundSource* shootSound2 = engine->addSoundSourceAlias(shootSound, "silentShoot"); 
    +
    + shootSound2->setDefaultVolume(0.1f);
    +
    + // shootSound will now be played with 100% of its sound volume by default,
    + // shootSound2 will now be played 10% of its sound volume by default. It is 
    + //  also possible to play it using engine->play("silentShoot"), now.
    +

    Using addSoundSourceFromMemory(), it is also possible to play sounds back directly from memory, without files. Of course, it is not necessary to use sound sources. Using irrklang::ISound, it is possible to change the settings of all sounds, too. But using sound sources, it is not necessary to do this every time a sound is played.
    +
    +
    +
    +

    +

    +3D Sound

    +

    There is nothing difficult in playing sounds in 3D using irrKlang: Instead of using irrklang::ISoundEngine::play2D(), just use irrklang::ISoundEngine::play3D(), which takes a 3D position as additional parameter:

    +
     irrklang::vec3df position(23,70,90);
    + engine->play3D("yourSound.wav", position);
    +

    But to make it sound realistic, you need to set a minimal sound distance: If your sound is caused by a bee, it will usually have a smaller sound radius than for example a jet engine. You can set default values using sound sources (see Using Sound Sources) or set these values after you have started the sound paused:

    +
     irrklang::vec3df position(23,70,90);
    +
    + // start the sound paused:
    + irrklang::ISound* snd = engine->play3D("yourSound.wav", position, false, true);
    +
    + if (snd)
    + {
    +    snd->setMinDistance(30.0f); // a loud sound
    +    snd->setIsPaused(false); // unpause the sound
    + }
    +

    There is also the possibility to change the maxDistance, but it is only necessary to change this in very rare cicumstances. If the sound moves, it is also a good idea to update its position from time to time:

    +
     if (snd)
    +    snd->setPosition(newPosition);
    +

    And don't forget to drop() the sound after you don't need it anymore. If you do, it's nothing severe because irrKlang will still clean up the sounds resources after it has finished, but you still would waste some few bytes of memory:

    +
     if (snd)
    + {
    +    snd->drop();
    +    snd = 0;
    + }
    +

    To update the position of yourself, the listener of the 3D sounds, use this from time to time:

    +
     irrklang::vec3df position(0,0,0);        // position of the listener
    + irrklang::vec3df lookDirection(10,0,10); // the direction the listener looks into
    + irrklang::vec3df velPerSecond(0,0,0);    // only relevant for doppler effects
    + irrklang::vec3df upVector(0,1,0);        // where 'up' is in your 3D scene
    +
    + engine->setListenerPosition(position, lookDirection, velPerSecond, upVector);
    +


    +
    +
    +
    +

    +

    +Removing Sounds

    +

    irrKlang manages the memory usage of sounds by itself, so usually, you don't have to care about memory management. But if you know you need to reduce the amount of used memory at a certain point in your program, you can do this:

    +
     engine->removeAllSoundSources(); 
    +

    This will remove all sounds and also cause all sounds to be stopped. To remove single sounds from the engine, use:

    +
     engine->removeSoundSource(pointerToSomeSoundSource); 
    + // or:
    + engine->removeSoundSource("nameOfASoundFile.wav"); 
    +

    Note: Only removing buffered sounds will reduce the amount of memory used by irrKlang, streamed sounds don't occupy a lot of memory when they are not played.
    +
    +
    +
    +

    +

    +Using Sound Events

    +

    In order to wait for a sound to be finished, it is simply possible to poll irrklang::ISound::isFinished(). Another way would be to constantly use irrklang::ISoundEngine::isCurrentlyPlaying to test wether a sound with that name or source is currently playing. But of course, an event based approach is a lot nicer. That's why irrKlang supports sound events.
    + The key to sound events is the method setSoundStopEventReceiver of the irrklang::ISound interface (See Influencing Sounds during Playback on how to get the ISound interface):

    +
     irrklang::ISound* snd = engine->play2D("speech.mp3", false, false, true); 
    + if (snd)
    +    snd->setSoundStopEventReceiver(yourEventReceiver, 0);
    +

    The optional second parameter of setSoundStopEventReceiver is a user pointer, set it to whatever you like. 'yourEventReceiver' must be an implementation of the irrklang::ISoundStopEventReceiver interface.
    + A whole implementation could look like this:

    +
     class MySoundEndReceiver : public irrklang::ISoundStopEventReceiver
    + {
    +   public:
    +     virtual void OnSoundStopped (irrklang::ISound* sound, irrklang::E_STOP_EVENT_CAUSE reason, void* userData)
    +     {
    +        // called when the sound has ended playing
    +        printf("sound has ended");
    +     }
    + }
    +
    + // ...
    +
    + MySoundEndReceiver* myReceiver = new MySoundEndReceiver();
    + irrklang::ISound* snd = engine->play2D("speech.mp3", false, false, true); 
    + if (snd)
    +    snd->setSoundStopEventReceiver(myReceiver);
    +
    + myReceiver->drop(); // similar to delete
    +

    The irrklang::ISoundStopEventReceiver::OnSoundStopped() method is guaranteed to be called when a sound or sound stream has stopped, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.
    +
    +
    +
    +

    +

    +Memory Playback

    +

    Using irrKlang, it is easily possible to play sounds directly from memory instead out of files. There is an example project showing this: In the SDK, in /examples/03.MemoryPlayback. But in short, it simply works by adding the memory as sound source (See Using Sound Sources for details about sound sources):

    +
     engine->addSoundSourceFromMemory(pointerToMemory, memorySize, "nameforthesound.wav");
    + 
    + // play sound now
    + engine->play2D("nameforthesound.wav");
    +

    Or using a sound source pointer:

    +
     irrklang::ISoundSource* snd = 
    +   engine->addSoundSourceFromMemory(pointerToMemory, memorySize, "nameforthesound.wav");
    + 
    + // play sound now
    + engine->play2D(snd);
    +

    Note: It is also possible to overwrite the file access directly, don't use this Memory Playback feature for this. See Overriding File Access for details.
    +
    +
    +
    +

    +

    +Sound Effects

    +

    irrKlang supports the effects Chorus, Compressor, Distortion, Echo, Flanger Gargle, 3DL2Reverb, ParamEq and WavesReverb, when using the sound driver irrklang::ESOD_DIRECT_SOUND_8, which selected by default when using Windows.
    +

    +

    Using the irrklang::ISound interface, you can optain the irrklang::ISoundEffectControl interface if the sound device supports sound effects and the last parameter ('enableSoundEffects') was set to true when calling play2D():

    +
     irrklang::ISound* snd = engine->play2D("sound.wav", true, false, true, ESM_AUTO_DETECT, true);
    +
    + if (snd)
    + {
    +    irrklang::ISoundEffectControl* fx = snd->getSoundEffectControl();
    +    if (fx)
    +    {
    +        // enable the echo sound effect for this sound
    +        fx->enableEchoSoundEffect();
    +    }
    + }
    + 
    + snd->drop();
    +

    This enabled the echo sound effect for this sound. The method also supports a lot of parameters, and can be called multiple times to change those parameters over time if wished. There are a lot of other sound effects, see irrklang::ISoundEffectControl for details.
    +
    +
    +
    +

    +

    +Overriding File Access

    +

    It is possible to let irrKlang use your own file access functions. This is useful if you want to read sounds from other sources than just files, for example from custom internet streams or an own encypted archive format. There is an example in the SDK in examples/04.OverrideFileAccess which shows this as well.
    +

    +

    The only thing to do for this is to implement your own irrklang::IFileFactory, and set it in irrKlang using irrklang::ISoundEngine::addFileFactory():

    +
     // a class implementing the IFileFactory interface to override irrklang file access
    + class CMyFileFactory : public irrklang::IFileFactory
    + {
    +   public:
    +
    +   // Opens a file for read access. Simply return 0 if file not found.
    +   virtual irrklang::IFileReader* createFileReader(const ik_c8* filename)
    +   {
    +     // return your own irrklang::IFileReader implementation here, for example like that:
    +     return new CMyReadFile(filename);
    +   }
    + };
    + 
    + // ...
    +
    + CMyFileFactory* myFactory = new CMyFileFactory();
    + engine->addFileFactory(myFactory);
    + myFactory->drop();
    +

    For a full example implementation, just take a look into the SDK in examples/04.OverrideFileAccess.
    +
    +
    +
    +

    +

    +Adding Audio Decoders

    +

    To add support for new file formats, it is possible to add new audio decoders to irrKlang. The only thing to do for this is to implement your own irrklang::IAudioStreamLoader, and irrklang::IAudioStream, and set it in irrKlang using irrklang::ISoundEngine::registerAudioStreamLoader():

    +
     class NewAudioStreamLoader : public irrklang::IAudioStreamLoader
    + {
    +   // ... returns NewAudioDecoder and the used file name suffices.
    + };
    +
    + class NewAudioDecoder : public irrklang::IAudioStream
    + {
    +   public:
    +     // ... decodes the new file format
    + };
    +
    + // ...
    +
    + NewAudioDecoder* loader = new NewAudioDecoder();
    + engine->registerAudioStreamLoader(loader);
    + loader->drop();
    +

    There is an example audio decoder and loader with full source in plugins/ikpMP3, which adds MP3 audio decoding capabilities to irrKlang.
    +
    +
    +
    +

    +

    +Creating irrKlang Plugins

    +

    irrKlang plugins are ikp*.dll (Windows), ikp*.so (Unix) or ikp*.dylib (MacOS) files which are loaded by irrKlang at startup when the irrklang::ESEO_LOAD_PLUGINS was set (which is default) or irrklang::ISoundEngine::loadPlugins() was called.
    +

    +

    The plugin only needs to contain the following function which will be called by irrKlang:

    +
     #ifdef WIN32
    + // Windows version
    + __declspec(dllexport) void __stdcall irrKlangPluginInit(ISoundEngine* engine, const char* version)
    + #else
    + // Linux and Mac OS version
    + void irrKlangPluginInit(ISoundEngine* engine, const char* version)
    + #endif
    + {
    +   // your implementation here
    + }
    +

    In there, it is for example possible to extend irrKlang with new audio decoders, see Adding Audio Decoders for details.
    +

    +

    There is an example plugin with full source in plugins/ikpMP3, which adds MP3 audio decoding capabilities to irrKlang.
    +
    +
    +
    +

    +

    +Using irrKlang as static Lib

    +

    If you don't want to use the irrKlang.DLL file and link irrKlang statically, you can do this by simply linking to the irrKlang.lib in the bin/win32-visualstudio_lib folder. This folder will only available in the pro versions of irrKlang, which you get when purchasing an irrKlang license.

    +

    To use irrKlang in this way, just define IRRKLANG_STATIC before including irrklang.h, like this:

    +
     #define IRRKLANG_STATIC
    + #include <irrKlang.h>
    +

    Of course, IRRKLANG_STATIC can also simply be defined in the project/compiler settings instead of in the source file.
    +
    +
    +
    +

    +

    +Enumerating sound devices

    +

    irrKlang uses the default sound device when playing sound when started without parameters. But if you want irrKlang to playback sound on one specific sound device, you may want to enumerate the available sound devices on your system and select one of them. Use irrklang::createSoundDeviceList() for this. This example code shows how to print a list of all available sound devices on the current system and lets the user choose one of them:

    +
     int main(int argc, const char** argv)
    + {
    +        // enumerate devices
    + 
    +        irrklang::ISoundDeviceList* deviceList = createSoundDeviceList();
    + 
    +        // ask user for a sound device
    + 
    +        printf("Devices available:\n\n");
    + 
    +        for (int i=0; i<deviceList->getDeviceCount(); ++i)
    +                printf("%d: %s\n", i, deviceList->getDeviceDescription(i));
    + 
    +        printf("\nselect a device using the number (or press any key to use default):\n\n");
    +        int deviceNumber = getch() - '0';
    + 
    +        // create device with the selected driver
    + 
    +        const char* deviceID = deviceList->getDeviceID(deviceNumber);
    +                
    +        ISoundEngine* engine = createIrrKlangDevice(irrklang::ESOD_AUTO_DETECT, 
    +                                                    irrklang::ESEO_DEFAULT_OPTIONS,
    +                                                    deviceID);
    + 
    +        deviceList->drop(); // delete device list
    +
    +  // ... use engine now
    + } 
    +

    In this way, it is also possible to play back sound using two devices at the same time: Simply create two irrKlang devices with each a different deviceID.
    + Note: createSoundDeviceList() takes a driver type parameter (such as irrklang::ESOD_DIRECT_SOUND8), which you have to set to the same value as the first parameter you want to use with createIrrKlangDevice(), if it is other than irrklang::ESOD_AUTO_DETECT.
    +
    +
    +
    +

    +

    +Recording Audio

    +

    irrKlang is able to record audio from sound capturing devices such as microphones (currently only supported in windows). Use the irrklang::IAudioRecorder interface to do this. The following example shows how to record some audio and play it back again using the engine:

    +
     int main(int argc, const char** argv)
    + {
    +        irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
    +        irrklang::IAudioRecorder* recorder = irrklang::createIrrKlangAudioRecorder(engine);
    +
    +        if (!engine || !recorder)
    +        {
    +                printf("Could not create audio engine or audio recoder\n");
    +                return 1;
    +        }
    +
    +        printf("\nPress any key to start recording audio...\n");
    +        getch();
    +
    +        // record some audio
    +
    +        recorder->startRecordingBufferedAudio();
    +
    +        printf("\nRECORDING. Press any key to stop...\n");
    +        getch();
    +
    +        recorder->stopRecordingAudio();
    +
    +        printf("\nRecording done, recorded %dms of audio.\n", 
    +                recorder->getAudioFormat().FrameCount * 1000 / recorder->getAudioFormat().SampleRate );
    +        printf("Press any key to play back recorded audio...\n");
    +        getch();
    +
    +        // play the recorded audio
    +        recorder->addSoundSourceFromRecordedAudio("myRecordedVoice");
    +        engine->play2D("myRecordedVoice", true);
    +
    +        // wait until user presses a key
    +        printf("\nPress any key to quit...");
    +        getch();
    +
    +        recorder->drop();
    +        engine->drop(); // delete engine
    +
    +        return 0;
    + } 
    +

    In order to select a specific audio capturing device for recording, it is necessary to enumerate the available devices. Simply replace the first to lines of code of the example above with code like this to list all devices and select one:

    +
      // enumerate recording devices and ask user to select one
    + 
    +  irrklang::ISoundDeviceList* deviceList = irrklang::createAudioRecorderDeviceList();
    +
    +  printf("Devices available:\n\n");
    +
    +  for (int i=0; i<deviceList->getDeviceCount(); ++i)
    +           printf("%d: %s\n", i, deviceList->getDeviceDescription(i));
    +
    +  printf("\nselect a device using the number (or press any key to use default):\n\n");
    +  int deviceNumber = getch() - '0';
    +
    +  // create recording device with the selected driver
    +
    +  const char* deviceID = deviceList->getDeviceID(deviceNumber);
    +  irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
    +  irrklang::IAudioRecorder* recorder = 
    +     irrklang::createIrrKlangAudioRecorder(engine, irrklang::ESOD_AUTO_DETECT, deviceID);
    +


    +
    +
    +
    +

    +

    +Unicode support

    +

    irrKlang supports unicode on all operating systems. Internally, it uses UTF8, and all functions accepting strings and file names take UTF8 strings. If you are running irrKlang on Windows, and are using the UNICODE define or using wchar_t* strings directly, you can do this as well. Use the irrKlang provided function makeUTF8fromUTF16string() to convert your wchar_t* string to a char* string.

    +

    This example shows how:

    +
     const wchar_t* yourFilename = L"SomeUnicodeFilename.wav"; // assuming this is the file name you get from some of your functions
    +
    + const int nBufferSize = 2048; // large enough, but best would be wcslen(yourFilename)*3.
    + char strBuffer[nBufferSize]; 
    + irrklang::makeUTF8fromUTF16string(yourFilename, strBuffer, nBufferSize);
    +
    + // now the converted file name is in strBuffer. We can play it for example now:
    + engine->play2D(strBuffer);
    +

    Of course, you can use any other unicode converion function for this. makeUTF8fromUTF16string() is only provided for convenience.
    +
    +
    +
    +

    +

    +Quick Start Example

    +

    To simply start the engine and play a mp3 file, use code like this:

    +
     #include <iostream>
    + #include <irrKlang.h>
    + #pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll
    +
    + int main(int argc, const char** argv)
    + {
    +        irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
    +        if (!engine) return 1; // could not start engine
    +
    +        engine->play2D("someMusic.mp3", true); // play some mp3 file, looped
    + 
    +        std::cin.get(); // wait until user presses a key
    + 
    +        engine->drop(); // delete engine
    +        return 0;
    + } 
    +

    A mp3 file is being played until the user presses enter in this example. As you can see, irrKlang uses namespaces, all of the classes are located in the namespace irrklang. If you don't want to write this in front of every class and function you are using, simply write

    +
     using namespace irrklang;
    +

    in front of your code, as also shown in the next example.
    +
    +
    +
    +

    +

    +Quick Start Example 2

    +

    The following is a simple interactive application, starting up the sound engine and playing some streaming .ogg music file and a .wav sound effect every time the user presses a key.

    +
     #include <iostream>
    + #include <irrKlang.h>
    + using namespace irrklang;
    +
    + #pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll
    +
    +
    + int main(int argc, const char** argv)
    + {
    +        // start the sound engine with default parameters
    +        ISoundEngine* engine = createIrrKlangDevice();
    +
    +        if (!engine)
    +                return 0; // error starting up the engine
    +
    +        // play some sound stream, looped
    +        engine->play2D("../../media/helltroopers.ogg", true);
    +
    +        std::cout << "\nHello World!\n";
    +
    +        char i = 0;
    +
    +        while(i != 'q')
    +        {
    +                std::cout << "Press any key to play some sound, press 'q' to quit.\n";
    +
    +                // play a single sound
    +                engine->play2D("../../media/bell.wav");
    +
    +                std::cin >> i; // wait for user to press some key
    +        }
    +
    +        engine->drop(); // delete engine
    +        return 0;
    + }
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/installdox b/Thirdparty/irrKlang/doc/cpp/installdox new file mode 100644 index 0000000..9b89fe0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/installdox @@ -0,0 +1,117 @@ +#!/usr/bin/perl + +%subst = ( ); +$quiet = 0; + +if (open(F,"search.cfg")) +{ + $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; + $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; +} + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ "tree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/Thirdparty/irrKlang/doc/cpp/irr_klang_8h.html b/Thirdparty/irrKlang/doc/cpp/irr_klang_8h.html new file mode 100644 index 0000000..109ceda --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/irr_klang_8h.html @@ -0,0 +1,175 @@ + + + + + +irrKlang: irrKlang.h File Reference + + + + + + + + + +
    +

    irrKlang.h File Reference

    +

    Main header file of the irrKlang sound library, the only file needed to include. +More...

    +#include "ik_irrKlangTypes.h"
    +#include "ik_vec3d.h"
    +#include "ik_IRefCounted.h"
    +#include "ik_IVirtualRefCounted.h"
    +#include "ik_ESoundOutputDrivers.h"
    +#include "ik_ESoundEngineOptions.h"
    +#include "ik_EStreamModes.h"
    +#include "ik_SAudioStreamFormat.h"
    +#include "ik_ISoundEngine.h"
    +#include "ik_ISoundSource.h"
    +#include "ik_ISound.h"
    +#include "ik_IAudioStream.h"
    +#include "ik_IAudioStreamLoader.h"
    +#include "ik_ISoundEffectControl.h"
    +#include "ik_ISoundStopEventReceiver.h"
    +#include "ik_IFileFactory.h"
    +#include "ik_IFileReader.h"
    +#include "ik_ISoundDeviceList.h"
    +#include "ik_IAudioRecorder.h"
    +#include "ik_ISoundMixedOutputReceiver.h"
    + +

    Go to the source code of this file.

    + + + + +

    +

    + + + + + + + + + + + + + + + + +

    Namespaces

    namespace  irrklang
     

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Defines

    #define IRR_KLANG_VERSION   "1.6.0"
     irrKlang Version
    #define IRRKLANG_API   __attribute__((visibility("default")))
    #define IRRKLANGCALLCONV

    Functions

    IRRKLANG_API ISoundEngine
    +*IRRKLANGCALLCONV 
    irrklang::createIrrKlangDevice (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, int options=ESEO_DEFAULT_OPTIONS, const char *deviceID=0, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates an irrKlang device. The irrKlang device is the root object for using the sound engine.
    IRRKLANG_API ISoundDeviceList
    +*IRRKLANGCALLCONV 
    irrklang::createSoundDeviceList (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates a list of available sound devices for the driver type.
    IRRKLANG_API IAudioRecorder
    +*IRRKLANGCALLCONV 
    irrklang::createIrrKlangAudioRecorder (ISoundEngine *irrKlangDeviceForPlayback, E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *deviceID=0, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates an irrKlang audio recording device. The IAudioRecorder is the root object for recording audio.
    IRRKLANG_API ISoundDeviceList
    +*IRRKLANGCALLCONV 
    irrklang::createAudioRecorderDeviceList (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates a list of available recording devices for the driver type.
    IRRKLANG_API bool IRRKLANGCALLCONV irrklang::makeUTF8fromUTF16string (const wchar_t *pInputString, char *pOutputBuffer, int outputBufferSize)
     Converts a wchar_t string to an utf8 string, useful when using Windows in unicode mode.
    +

    Detailed Description

    +

    Main header file of the irrKlang sound library, the only file needed to include.

    +

    Define Documentation

    + +
    +
    + + + + +
    #define IRR_KLANG_VERSION   "1.6.0"
    +
    +
    + +

    irrKlang Version

    + +
    +
    + +
    +
    + + + + +
    #define IRRKLANG_API   __attribute__((visibility("default")))
    +
    +
    + +
    +
    + +
    +
    + + + + +
    #define IRRKLANGCALLCONV
    +
    +
    + +
    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/irr_klang_8h_source.html b/Thirdparty/irrKlang/doc/cpp/irr_klang_8h_source.html new file mode 100644 index 0000000..795bd2c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/irr_klang_8h_source.html @@ -0,0 +1,172 @@ + + + + + +irrKlang: irrKlang.h Source File + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/irrklang.png b/Thirdparty/irrKlang/doc/cpp/irrklang.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c18505268103f3e4756474aaa5f4eae019d97c GIT binary patch literal 3161 zcmV-f45ssmP)WdH}(2^R?tJ3Tc-kN^Mx2XskIMF-af0S6ik4`Szn_ds+6=|M+{!ryEs|p}5?N zDvY$qXd+_>krBVJuQV^|Sn?N5(?&~G>HC@CB@cC74~0Ss>*^d&@t>9yuic=yJc=SL z+FwTySAkYgG+HR+Vv)Ny4CBU)8?CLa_DnqPS@BoJ<5f6Tg#7!fESpVL)zM8!7(R=F z+#^y=O^uyp5Cy7R7(6kb1Ce60{WP%VYu3f;Ph=UBQYx>)%lK^+{z6E#&RLV%i<-WdV?3B8iymVn?#JL+CzFvQSAQrArG73;DTc&z^hly|=!;K2Q1Vg5#TS zzPV({k_8JEWDn1tJzG^(HD=71T*^zAE)^6M)YaAH9wII0=g*(_cs%px&*uanhCL#g zNL$)#$)pjFrL7;eW!}XT#;OILJUJSwD*m~*74fxbM2dw0XV+CXRF(?m=6qqZ`9lL| zE?rJ1lltI*t*8WR1H|W_e?EKmY?o^YxMRnTan2^0OrkkCeERh1?6Zk2PYqt5H*eml zQ>X5~|Ng8~T)%!De4lydncTOoUAyLXy8%eG5*e4DJbCi?@#7OFOsK7`jYgyRK1dCD z1V+{qaV>2wEtS;cQ7xTfABo2NNlg{0JdZlp*3MJ70a?cGU=N!>EbfjM=7}CpYn?qk z=C$dR5sxaMY#8Wlvyz1jffFZAAl##mK8oh%wTd!0IEZ=(_k%zHQ!p6BeK4ut@6Wmb z?_Ruk@ry6Mc<{jov&4x+qNu2dM{tZpBKY0-@#9ymT7?Z94u`O6r=@q=^aw%&DRoUl zG6RWY5yRRaJ^TGP=P!&1Es?f5BE@01C!;B+Q@7UJ`~N*sY~9F6Q@d56N5V=f!B4ox zVli|G1OjKyoI$3CAAT4_^x=gKfna3c#Ubw=IB?*RM;<|qsZ*yC4lOM$5-;F;>Zzv= z9z4j4U?F1)M#aU&ob>ni@7S>exV>I45dkhTL6|CASPbO|BNnwO6iu7ZH9Ze!2@2Gk%$_}IE)c191g$!`s?`T^5x5&PAAUE zB~o+j=Cr^a2?Q?l)?07U1)?565Mn(&J)j994Gj%MD3^f6mtTJQ(MKOGUc8ulpds&Y z+lL>1h!X({ywF){jxmsgWHjUv=zte^3fv{d#ZFbx2g4qhll|nH%4Ux$hT8K< zO`C?GyLa!teEIUMS+k^LOPk}&hPC8Lt~(G5B+-czC$a}$TbhMm6w-ez3;yJ4pn2(D59etx`7M%j17(e z!IUXekX!m7(bU-3*xA_$G-!*@%eVt3j7%=R^$o4?CdyH9a>l#N!v@?+uQ9nH909_sJdcP%p_%)^J|MJcstnZAJjJw^fXP5 z6~y9phZ~mo;hlHhDYGMYVqv7j1tc_BjDW|UoJg&l)_UlnhpgOWlW%3S)nku6My7zC z7(p?fW`ST&`j8ospL7#r$BvbyiWec1K*(qvDxaC)*+kft7!c`*&xoW_5mzFjqy~LP zG-Wt%Dh8|TZQBpp6KS#KaM#>LNljPdA%|TRao_cLz%b``bBYIK0Vaz|oLf3!w{!&+Hun?7YNxknjnp8GVra2Cjt?r+{+xH z%qa0B&6GaW1SraIH}LZyFfp~MMov$r7J1WURlk#O#kml$A#n=&t?c6!D^|#~bk|*X z(fJ9hHKf?koMvel`$+Xa#^CYCAD3*He_nq1}G5(o5^tub(kv2BkNT{-%*0<>@^Lp2LR^lR{p2;RV{2 zojZ4~UcGwqwro7SQJ^SplxE4JeY381L?vadX{y|Uz!Tdvyfd1UJZ{I%3 zI6}Pk+G~}Sm220o<#Mit9aAGGGiS~O2$~3rF*h(x&JS~>)ZxYvo#~Fj9z(%~u^;2?+O_MQcixc%#22>O zxN#$K2YY%4W(uI;5!S#9@F^~&1;BerpUgs~rKOMwYq&x&9swfz)2C0kE^2z zBLH?|M!?qy3YcOp=&9$pJ+Bj$q@-iVj`1S$AOl_i3p9imI^YFNB~L&7^e3Nuf`(j( zz`TW@qADkVODtTtV17dYVsJlq?i`9BBw9cNc7!eFya@@M>IahzqW{@iq>0;1V86|x ztwv_d^J4@EES>B27eTH3PU_jHuRs3pb7=h!J9Yi#SsR1|00000NkvXXu0mjfyn+!= literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/logobig.png b/Thirdparty/irrKlang/doc/cpp/logobig.png new file mode 100644 index 0000000000000000000000000000000000000000..00c57567cde6ffb3c38d33af29a8b8eeb7ac41d6 GIT binary patch literal 14460 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 O0000 + + + + +irrKlang: irrklang Namespace Reference + + + + + + + + + +
    +

    irrklang Namespace Reference

    +

    Everything in the irrKlang Sound Engine can be found in this namespace. +More...

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Classes

    class  IAudioRecorder
     Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function. More...
    class  ICapturedAudioDataReceiver
     Interface to be implemented by the user if access to the recorded audio data is needed. More...
    class  IAudioStream
     Reads and decodes audio data into an usable audio stream for the ISoundEngine. More...
    class  IAudioStreamLoader
     Class which is able to create an audio file stream from a file. More...
    class  IFileFactory
     Interface to overwrite file access in irrKlang. More...
    class  IFileReader
     Interface providing read acess to a file. More...
    class  IRefCounted
     Base class of most objects of the irrKlang. More...
    class  ISound
     Represents a sound which is currently played. More...
    class  ISoundDeviceList
     A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. More...
    class  ISoundEffectControl
     Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. More...
    class  ISoundEngine
     Interface to the sound engine, for playing 3d and 2d sound and music. More...
    struct  SInternalAudioInterface
     structure for returning pointers to the internal audio interface. More...
    class  ISoundMixedOutputReceiver
     Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine. More...
    class  ISoundSource
     A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings. More...
    class  ISoundStopEventReceiver
     Interface to be implemented by the user, which recieves sound stop events. More...
    class  IVirtualRefCounted
     Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted. More...
    struct  SAudioStreamFormat
     structure describing an audio stream format with helper functions More...
    class  vec3d
     a 3d vector template class for representing vectors and points in 3d More...

    Typedefs

    typedef unsigned char ik_u8
     8 bit unsigned variable.
    typedef signed char ik_s8
     8 bit signed variable.
    typedef char ik_c8
     8 bit character variable.
    typedef unsigned short ik_u16
     16 bit unsigned variable.
    typedef signed short ik_s16
     16 bit signed variable.
    typedef unsigned int ik_u32
     32 bit unsigned variable.
    typedef signed int ik_s32
     32 bit signed variable.
    typedef float ik_f32
     32 bit floating point variable.
    typedef double ik_f64
     64 bit floating point variable.
    typedef vec3d< ik_f32vec3df
     Typedef for a ik_f32 3d vector, a vector using floats for X, Y and Z.
    typedef vec3d< ik_s32vec3di
     Typedef for an integer 3d vector, a vector using ints for X, Y and Z.

    Enumerations

    enum  E_SOUND_ENGINE_OPTIONS {
    +  ESEO_MULTI_THREADED = 0x01, +ESEO_MUTE_IF_NOT_FOCUSED = 0x02, +ESEO_LOAD_PLUGINS = 0x04, +ESEO_USE_3D_BUFFERS = 0x08, +
    +  ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER = 0x10, +ESEO_PRINT_DEBUG_INFO_TO_STDOUT = 0x20, +ESEO_LINEAR_ROLLOFF = 0x40, +ESEO_DEFAULT_OPTIONS = ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT, +
    +  ESEO_FORCE_32_BIT = 0x7fffffff +
    + }
     

    An enumeration for all options for starting up the sound engine.

    + More...
    enum  E_SOUND_OUTPUT_DRIVER {
    +  ESOD_AUTO_DETECT = 0, +ESOD_DIRECT_SOUND_8, +ESOD_DIRECT_SOUND, +ESOD_WIN_MM, +
    +  ESOD_ALSA, +ESOD_CORE_AUDIO, +ESOD_NULL, +ESOD_COUNT, +
    +  ESOD_FORCE_32_BIT = 0x7fffffff +
    + }
     

    An enumeration for all types of supported sound drivers.

    + More...
    enum  E_STREAM_MODE { ESM_AUTO_DETECT = 0, +ESM_STREAMING, +ESM_NO_STREAMING, +ESM_FORCE_32_BIT = 0x7fffffff + }
     

    An enumeration for all types of supported stream modes.

    + More...
    enum  E_STOP_EVENT_CAUSE { ESEC_SOUND_FINISHED_PLAYING = 0, +ESEC_SOUND_STOPPED_BY_USER, +ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL, +ESEC_FORCE_32_BIT = 0x7fffffff + }
     

    An enumeration listing all reasons for a fired sound stop event.

    + More...
    enum  ESampleFormat { ESF_U8, +ESF_S16 + }
     

    audio sample data format enumeration for supported formats

    + More...

    Functions

    bool equalsfloat (const ik_f32 a, const ik_f32 b, const ik_f32 tolerance=IK_ROUNDING_ERROR_32)
    template<class S , class T >
    vec3d< T > operator* (const S scalar, const vec3d< T > &vector)
    IRRKLANG_API ISoundEngine
    +*IRRKLANGCALLCONV 
    createIrrKlangDevice (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, int options=ESEO_DEFAULT_OPTIONS, const char *deviceID=0, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates an irrKlang device. The irrKlang device is the root object for using the sound engine.
    IRRKLANG_API ISoundDeviceList
    +*IRRKLANGCALLCONV 
    createSoundDeviceList (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates a list of available sound devices for the driver type.
    IRRKLANG_API IAudioRecorder
    +*IRRKLANGCALLCONV 
    createIrrKlangAudioRecorder (ISoundEngine *irrKlangDeviceForPlayback, E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *deviceID=0, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates an irrKlang audio recording device. The IAudioRecorder is the root object for recording audio.
    IRRKLANG_API ISoundDeviceList
    +*IRRKLANGCALLCONV 
    createAudioRecorderDeviceList (E_SOUND_OUTPUT_DRIVER driver=ESOD_AUTO_DETECT, const char *sdk_version_do_not_use=IRR_KLANG_VERSION)
     Creates a list of available recording devices for the driver type.
    IRRKLANG_API bool IRRKLANGCALLCONV makeUTF8fromUTF16string (const wchar_t *pInputString, char *pOutputBuffer, int outputBufferSize)
     Converts a wchar_t string to an utf8 string, useful when using Windows in unicode mode.

    Variables

    const ik_f32 IK_ROUNDING_ERROR_32 = 0.000001f
    const ik_f64 IK_PI64 = 3.1415926535897932384626433832795028841971693993751
    const ik_f32 IK_PI32 = 3.14159265359f
    const ik_f32 IK_RADTODEG = 180.0f / IK_PI32
    const ik_f32 IK_DEGTORAD = IK_PI32 / 180.0f
    const ik_f64 IK_RADTODEG64 = 180.0 / IK_PI64
    const ik_f64 IK_DEGTORAD64 = IK_PI64 / 180.0
    +

    Detailed Description

    +

    Everything in the irrKlang Sound Engine can be found in this namespace.

    +

    Typedef Documentation

    + +
    +
    + + + + +
    typedef char irrklang::ik_c8
    +
    +
    + +

    8 bit character variable.

    +

    This is a typedef for char, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef float irrklang::ik_f32
    +
    +
    + +

    32 bit floating point variable.

    +

    This is a typedef for float, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef double irrklang::ik_f64
    +
    +
    + +

    64 bit floating point variable.

    +

    This is a typedef for double, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef signed short irrklang::ik_s16
    +
    +
    + +

    16 bit signed variable.

    +

    This is a typedef for signed short, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef signed int irrklang::ik_s32
    +
    +
    + +

    32 bit signed variable.

    +

    This is a typedef for signed int, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef signed char irrklang::ik_s8
    +
    +
    + +

    8 bit signed variable.

    +

    This is a typedef for signed char, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef unsigned short irrklang::ik_u16
    +
    +
    + +

    16 bit unsigned variable.

    +

    This is a typedef for unsigned short, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef unsigned int irrklang::ik_u32
    +
    +
    + +

    32 bit unsigned variable.

    +

    This is a typedef for unsigned int, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef unsigned char irrklang::ik_u8
    +
    +
    + +

    8 bit unsigned variable.

    +

    This is a typedef for unsigned char, it ensures portability of the engine.

    + +
    +
    + +
    +
    + + + + +
    typedef vec3d<ik_f32> irrklang::vec3df
    +
    +
    + +

    Typedef for a ik_f32 3d vector, a vector using floats for X, Y and Z.

    + +
    +
    + +
    +
    + + + + +
    typedef vec3d<ik_s32> irrklang::vec3di
    +
    +
    + +

    Typedef for an integer 3d vector, a vector using ints for X, Y and Z.

    + +
    +
    +

    Enumeration Type Documentation

    + +
    + +
    + +

    An enumeration for all options for starting up the sound engine.

    +

    When using createIrrKlangDevice, use a combination of this these as 'options' parameter to start up the engine. By default, irrKlang uses ESEO_DEFAULT_OPTIONS, which is set to the combination ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT.

    +
    Enumerator:
    + + + + + + + + + +
    ESEO_MULTI_THREADED  +

    If specified (default), it will make irrKlang run in a separate thread.

    +

    Using this flag, irrKlang will update all streams, sounds, 3d positions and whatever automaticly. You also don't need to call ISoundEngine::update() if irrKlang is running multithreaded. However, if you want to run irrKlang in the same thread as your application (for easier debugging for example), don't set this. But you need to call ISoundEngine::update() as often as you can (at least about 2-3 times per second) to make irrKlang update everything correctly then.

    +
    ESEO_MUTE_IF_NOT_FOCUSED  +

    If the window of the application doesn't have the focus, irrKlang will be silent if this has been set.

    +

    This will only work when irrKlang is using the DirectSound output driver.

    +
    ESEO_LOAD_PLUGINS  +

    Automaticly loads external plugins when starting up.

    +

    Plugins usually are .dll, .so or .dylib files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which are executed after the startup of the sound engine and modify it for example to make it possible to play back mp3 files. Plugins are being loaded from the current working directory as well as from the position where the .exe using the irrKlang library resides. It is also possible to load the plugins after the engine has started up using ISoundEngine::loadPlugins().

    +
    ESEO_USE_3D_BUFFERS  +

    Uses 3D sound buffers instead of emulating them when playing 3d sounds (default).

    +

    If this flag is not specified, all buffers will by created in 2D only and 3D positioning will be emulated in software, making the engine run faster if hardware 3d audio is slow on the system.

    +
    ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER  +

    Prints debug messages to the debugger window.

    +

    irrKlang will print debug info and status messages to any windows debugger supporting OutputDebugString() (like VisualStudio). This is useful if your application does not capture any console output (see ESEO_PRINT_DEBUG_INFO_TO_STDOUT).

    +
    ESEO_PRINT_DEBUG_INFO_TO_STDOUT  +

    Prints debug messages to stdout (the ConsoleWindow).

    +

    irrKlang will print debug info and status messages stdout, the console window in Windows.

    +
    ESEO_LINEAR_ROLLOFF  +

    Uses linear rolloff for 3D sound.

    +

    If specified, instead of the default logarithmic one, irrKlang will use a linear rolloff model which influences the attenuation of the sounds over distance. The volume is interpolated linearly between the MinDistance and MaxDistance, making it possible to adjust sounds more easily although this is not physically correct. Note that this option may not work when used together with the ESEO_USE_3D_BUFFERS option when using Direct3D for example, irrKlang will then turn off ESEO_USE_3D_BUFFERS automaticly to be able to use this option and write out a warning.

    +
    ESEO_DEFAULT_OPTIONS  +

    Default parameters when starting up the engine.

    +
    ESEO_FORCE_32_BIT  +

    Never used, it only forces the compiler to compile these enumeration values to 32 bit.

    +

    Don't use this.

    +
    +
    +
    + +
    +
    + +
    + +
    + +

    An enumeration for all types of supported sound drivers.

    +

    Values of this enumeration can be used as parameter when calling createIrrKlangDevice().

    +
    Enumerator:
    + + + + + + + + + +
    ESOD_AUTO_DETECT  +

    Autodetects the best sound driver for the system.

    +
    ESOD_DIRECT_SOUND_8  +

    DirectSound8 sound output driver, windows only.

    +

    In contrast to ESOD_DIRECT_SOUND, this supports sophisticated sound effects but may not be available on old windows versions. It behaves very similar to ESOD_DIRECT_SOUND but also supports DX8 sound effects.

    +
    ESOD_DIRECT_SOUND  +

    DirectSound sound output driver, windows only.

    +

    This uses DirectSound 3 or above, if available. If DX8 sound effects are needed, use ESOD_DIRECT_SOUND_8 instead. The ESOD_DIRECT_SOUND driver may be available on more and older windows versions than ESOD_DIRECT_SOUND_8.

    +
    ESOD_WIN_MM  +

    WinMM sound output driver, windows only.

    +

    Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver.

    +
    ESOD_ALSA  +

    ALSA sound output driver, linux only.

    +

    When using ESOD_ALSA in createIrrKlangDevice(), it is possible to set the third parameter, 'deviceID' to the name of specific ALSA pcm device, to the irrKlang force to use this one. Set it to 'default', or 'plug:hw' or whatever you need it to be. Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver.

    +
    ESOD_CORE_AUDIO  +

    Core Audio sound output driver, mac os only.

    +

    Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver.

    +
    ESOD_NULL  +

    Null driver, creating no sound output.

    +
    ESOD_COUNT  +

    Amount of built-in sound output drivers.

    +
    ESOD_FORCE_32_BIT  +

    This enumeration literal is never used, it only forces the compiler to compile these enumeration values to 32 bit.

    +
    +
    +
    + +
    +
    + +
    + +
    + +

    An enumeration listing all reasons for a fired sound stop event.

    +
    Enumerator:
    + + + + +
    ESEC_SOUND_FINISHED_PLAYING  +

    The sound stop event was fired because the sound finished playing.

    +
    ESEC_SOUND_STOPPED_BY_USER  +

    The sound stop event was fired because the sound was stopped by the user, calling ISound::stop().

    +
    ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL  +

    The sound stop event was fired because the source of the sound was removed, for example because irrKlang was shut down or the user called ISoundEngine::removeSoundSource().

    +
    ESEC_FORCE_32_BIT  +

    This enumeration literal is never used, it only forces the compiler to compile these enumeration values to 32 bit.

    +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    enum irrklang::E_STREAM_MODE
    +
    +
    + +

    An enumeration for all types of supported stream modes.

    +
    Enumerator:
    + + + + +
    ESM_AUTO_DETECT  +

    Autodetects the best stream mode for a specified audio data.

    +
    ESM_STREAMING  +

    Streams the audio data when needed.

    +
    ESM_NO_STREAMING  +

    Loads the whole audio data into the memory.

    +
    ESM_FORCE_32_BIT  +

    This enumeration literal is never used, it only forces the compiler to compile these enumeration values to 32 bit.

    +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    enum irrklang::ESampleFormat
    +
    +
    + +

    audio sample data format enumeration for supported formats

    +
    Enumerator:
    + + +
    ESF_U8  +

    one unsigned byte (0;255)

    +
    ESF_S16  +

    16 bit, signed (-32k;32k)

    +
    +
    +
    + +
    +
    +

    Function Documentation

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    IRRKLANG_API ISoundDeviceList* IRRKLANGCALLCONV irrklang::createAudioRecorderDeviceList (E_SOUND_OUTPUT_DRIVER  driver = ESOD_AUTO_DETECT,
    const char *  sdk_version_do_not_use = IRR_KLANG_VERSION 
    )
    +
    +
    + +

    Creates a list of available recording devices for the driver type.

    +

    The device IDs in this list can be used as parameter to createIrrKlangAudioRecorder() to make irrKlang use a special recording device.

    +
    Parameters:
    + + + +
    driver The sound output driver of which the list is generated. Set it irrklang::ESOD_AUTO_DETECT to let this function use the same device as createIrrKlangDevice() would choose.
    sdk_version_do_not_use Don't use or change this parameter. Always set it to IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks.
    +
    +
    +
    Returns:
    Returns a pointer to the list of enumerated recording devices for the selected sound driver. The device IDs in this list can be used as parameter to createIrrKlangAudioRecorder() to make irrKlang use a special sound device. After you don't need the list anymore, call ISoundDeviceList::drop() in order to free its memory.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IRRKLANG_API IAudioRecorder* IRRKLANGCALLCONV irrklang::createIrrKlangAudioRecorder (ISoundEngine *  irrKlangDeviceForPlayback,
    E_SOUND_OUTPUT_DRIVER  driver = ESOD_AUTO_DETECT,
    const char *  deviceID = 0,
    const char *  sdk_version_do_not_use = IRR_KLANG_VERSION 
    )
    +
    +
    + +

    Creates an irrKlang audio recording device. The IAudioRecorder is the root object for recording audio.

    +

    If you want to play back recorded audio as well, create the ISoundEngine first using createIrrKlangDevice() and then the IAudioRecorder using createIrrKlangAudioRecorder(), where you set the ISoundEngine as first parameter. See Recording Audio for an example on how to use this. Note: audio recording is a very new feature a still beta in irrKlang. It currently only works in Windows and with DirectSound (subject to change).

    +
    Parameters:
    + + + + + +
    irrKlangDeviceForPlayback A pointer to the already existing sound device used for playback of audio. Sound sources recorded with the IAudioRecorder will be added into that device so that they can be played back there.
    driver The sound output driver to be used for recording audio. Use irrklang::ESOD_AUTO_DETECT to let irrKlang decide which driver will be best.
    deviceID Some additional optional deviceID for the audio driver. If not needed, simple set this to 0. Use createAudioRecorderDeviceList() to get a list of all deviceIDs.
    sdk_version_do_not_use Don't use or change this parameter. Always set it to IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks.
    +
    +
    +
    Returns:
    Returns pointer to the created irrKlang device or null if the device could not be created. If you don't need the device, use ISoundEngine::drop() to delete it. See IRefCounted::drop() for details.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IRRKLANG_API ISoundEngine* IRRKLANGCALLCONV irrklang::createIrrKlangDevice (E_SOUND_OUTPUT_DRIVER  driver = ESOD_AUTO_DETECT,
    int  options = ESEO_DEFAULT_OPTIONS,
    const char *  deviceID = 0,
    const char *  sdk_version_do_not_use = IRR_KLANG_VERSION 
    )
    +
    +
    + +

    Creates an irrKlang device. The irrKlang device is the root object for using the sound engine.

    +
    Parameters:
    + + + + + +
    driver The sound output driver to be used for sound output. Use irrklang::ESOD_AUTO_DETECT to let irrKlang decide which driver will be best.
    options A combination of irrklang::E_SOUND_ENGINE_OPTIONS literals. Default value is irrklang::ESEO_DEFAULT_OPTIONS.
    deviceID Some additional optional deviceID for the audio driver. If not needed, simple set this to 0. This can be used for example to set a specific ALSA output pcm device for output ("default" or "hw", for example). For most driver types, available deviceIDs can be enumerated using createSoundDeviceList(). See Enumerating sound devices for an example or ISoundDeviceList or details.
    sdk_version_do_not_use Don't use or change this parameter. Always set it to IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks.
    +
    +
    +
    Returns:
    Returns pointer to the created irrKlang device or null if the device could not be created. If you don't need the device, use ISoundEngine::drop() to delete it. See IRefCounted::drop() for details.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + +
    IRRKLANG_API ISoundDeviceList* IRRKLANGCALLCONV irrklang::createSoundDeviceList (E_SOUND_OUTPUT_DRIVER  driver = ESOD_AUTO_DETECT,
    const char *  sdk_version_do_not_use = IRR_KLANG_VERSION 
    )
    +
    +
    + +

    Creates a list of available sound devices for the driver type.

    +

    The device IDs in this list can be used as parameter to createIrrKlangDevice() to make irrKlang use a special sound device. See Enumerating sound devices for an example on how to use this.

    +
    Parameters:
    + + + +
    driver The sound output driver of which the list is generated. Set it irrklang::ESOD_AUTO_DETECT to let this function use the same device as createIrrKlangDevice() would choose.
    sdk_version_do_not_use Don't use or change this parameter. Always set it to IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks.
    +
    +
    +
    Returns:
    Returns a pointer to the list of enumerated sound devices for the selected sound driver. The device IDs in this list can be used as parameter to createIrrKlangDevice() to make irrKlang use a special sound device. After you don't need the list anymore, call ISoundDeviceList::drop() in order to free its memory.
    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    bool irrklang::equalsfloat (const ik_f32  a,
    const ik_f32  b,
    const ik_f32  tolerance = IK_ROUNDING_ERROR_32 
    ) [inline]
    +
    +
    +

    returns if a float equals the other one, taking floating point rounding errors into account

    + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    IRRKLANG_API bool IRRKLANGCALLCONV irrklang::makeUTF8fromUTF16string (const wchar_t *  pInputString,
    char *  pOutputBuffer,
    int  outputBufferSize 
    )
    +
    +
    + +

    Converts a wchar_t string to an utf8 string, useful when using Windows in unicode mode.

    +

    irrKlang works with unicode file names, and accepts char* strings as parameters for names and filenames. If you are running irrKlang in Windows, and working with wchar_t* pointers instead of char* ones, you can use this function to create a char* (UTF8) representation of your wchar_t* (UTF16) string. Works for filenames and other strings.

    +
    Parameters:
    + + + + +
    pInputString zero terminated input string.
    pOutputBuffer the buffer where the converted string is written to. Be sure that this buffer has a big enough size. A good size would be three times the string length of your input buffer, like wcslen(yourInputBuffer)*3. Because each wchar_t can be represented by up to 3 chars.
    outputBufferSize size of your output buffer.
    +
    +
    +
    Returns:
    Returns true if successful, and false if not. If 'false' is returned, maybe your buffer was too small.
    + +
    +
    + +
    +
    +
    +template<class S , class T >
    + + + + + + + + + + + + + + + + + + +
    vec3d<T> irrklang::operator* (const S  scalar,
    const vec3d< T > &  vector 
    ) [inline]
    +
    +
    + +
    +
    +

    Variable Documentation

    + +
    +
    + + + + +
    const ik_f32 irrklang::IK_DEGTORAD = IK_PI32 / 180.0f
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f64 irrklang::IK_DEGTORAD64 = IK_PI64 / 180.0
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f32 irrklang::IK_PI32 = 3.14159265359f
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f64 irrklang::IK_PI64 = 3.1415926535897932384626433832795028841971693993751
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f32 irrklang::IK_RADTODEG = 180.0f / IK_PI32
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f64 irrklang::IK_RADTODEG64 = 180.0 / IK_PI64
    +
    +
    + +
    +
    + +
    +
    + + + + +
    const ik_f32 irrklang::IK_ROUNDING_ERROR_32 = 0.000001f
    +
    +
    + +
    +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers.html new file mode 100644 index 0000000..ebcb527 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers.html @@ -0,0 +1,296 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +Here is a list of all namespace members with links to the namespace documentation for each member: + +

    - c -

      +
    • createAudioRecorderDeviceList() +: irrklang +
    • +
    • createIrrKlangAudioRecorder() +: irrklang +
    • +
    • createIrrKlangDevice() +: irrklang +
    • +
    • createSoundDeviceList() +: irrklang +
    • +
    + + +

    - e -

    + + +

    - i -

    + + +

    - m -

      +
    • makeUTF8fromUTF16string() +: irrklang +
    • +
    + + +

    - o -

    + + +

    - v -

    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers_enum.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers_enum.html new file mode 100644 index 0000000..1f9da61 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers_enum.html @@ -0,0 +1,105 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers_eval.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers_eval.html new file mode 100644 index 0000000..097cc81 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers_eval.html @@ -0,0 +1,174 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers_func.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers_func.html new file mode 100644 index 0000000..d80f45e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers_func.html @@ -0,0 +1,111 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers_type.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers_type.html new file mode 100644 index 0000000..75c0784 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers_type.html @@ -0,0 +1,123 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespacemembers_vars.html b/Thirdparty/irrKlang/doc/cpp/namespacemembers_vars.html new file mode 100644 index 0000000..7391826 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespacemembers_vars.html @@ -0,0 +1,111 @@ + + + + + +irrKlang: Class Members + + + + + + + + + +
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/namespaces.html b/Thirdparty/irrKlang/doc/cpp/namespaces.html new file mode 100644 index 0000000..e67d371 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/namespaces.html @@ -0,0 +1,81 @@ + + + + + +irrKlang: Namespace Index + + + + + + + + + +
    +

    Namespace List

    Here is a list of all namespaces with brief descriptions: + +
    irrklangEverything in the irrKlang Sound Engine can be found in this namespace
    +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_61.html b/Thirdparty/irrKlang/doc/cpp/search/all_61.html new file mode 100644 index 0000000..7c29184 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_61.html @@ -0,0 +1,56 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + addFileFactory + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceAlias + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromFile + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromMemory + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromPCMData + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromRecordedAudio + irrklang::IAudioRecorder +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_63.html b/Thirdparty/irrKlang/doc/cpp/search/all_63.html new file mode 100644 index 0000000..90a9efb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_63.html @@ -0,0 +1,74 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ChannelCount + irrklang::SAudioStreamFormat +
    +
    +
    +
    + clearRecordedAudioDataBuffer + irrklang::IAudioRecorder +
    +
    +
    + +
    +
    +
    + createAudioStream + irrklang::IAudioStreamLoader +
    +
    +
    +
    + createFileReader + irrklang::IFileFactory +
    +
    +
    + +
    +
    +
    + createIrrKlangDevice + irrklang +
    +
    +
    +
    + createSoundDeviceList + irrklang +
    +
    +
    +
    + crossProduct + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_64.html b/Thirdparty/irrKlang/doc/cpp/search/all_64.html new file mode 100644 index 0000000..89a6e7f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_64.html @@ -0,0 +1,95 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + disableAllEffects + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableChorusSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableCompressorSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableDistortionSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableEchoSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableFlangerSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableGargleSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableI3DL2ReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableParamEqSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableWavesReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + dotProduct + irrklang::vec3d +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_65.html b/Thirdparty/irrKlang/doc/cpp/search/all_65.html new file mode 100644 index 0000000..97747e6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_65.html @@ -0,0 +1,284 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + E_SOUND_ENGINE_OPTIONS + irrklang +
    +
    +
    +
    + E_SOUND_OUTPUT_DRIVER + irrklang +
    +
    +
    +
    + E_STOP_EVENT_CAUSE + irrklang +
    +
    +
    +
    + E_STREAM_MODE + irrklang +
    +
    +
    +
    + enableChorusSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableCompressorSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableDistortionSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableEchoSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableFlangerSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableGargleSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableI3DL2ReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableParamEqSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableWavesReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + equals + irrklang::vec3d +
    +
    +
    +
    + equalsfloat + irrklang +
    +
    +
    +
    + ESampleFormat + irrklang +
    +
    +
    +
    + ESEC_FORCE_32_BIT + irrklang +
    +
    +
    + +
    + +
    + +
    +
    +
    + ESEO_DEFAULT_OPTIONS + irrklang +
    +
    +
    +
    + ESEO_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESEO_LINEAR_ROLLOFF + irrklang +
    +
    +
    +
    + ESEO_LOAD_PLUGINS + irrklang +
    +
    +
    +
    + ESEO_MULTI_THREADED + irrklang +
    +
    +
    +
    + ESEO_MUTE_IF_NOT_FOCUSED + irrklang +
    +
    + + +
    +
    + ESEO_USE_3D_BUFFERS + irrklang +
    +
    +
    +
    + ESF_S16 + irrklang +
    +
    +
    +
    + ESF_U8 + irrklang +
    +
    +
    +
    + ESM_AUTO_DETECT + irrklang +
    +
    +
    +
    + ESM_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESM_NO_STREAMING + irrklang +
    +
    +
    +
    + ESM_STREAMING + irrklang +
    +
    +
    +
    + ESOD_ALSA + irrklang +
    +
    +
    +
    + ESOD_AUTO_DETECT + irrklang +
    +
    +
    +
    + ESOD_CORE_AUDIO + irrklang +
    +
    +
    +
    + ESOD_COUNT + irrklang +
    +
    +
    +
    + ESOD_DIRECT_SOUND + irrklang +
    +
    +
    +
    + ESOD_DIRECT_SOUND_8 + irrklang +
    +
    +
    +
    + ESOD_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESOD_NULL + irrklang +
    +
    +
    +
    + ESOD_WIN_MM + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_66.html b/Thirdparty/irrKlang/doc/cpp/search/all_66.html new file mode 100644 index 0000000..1c2066a --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_66.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + forceReloadAtNextUse + irrklang::ISoundSource +
    +
    +
    +
    + FrameCount + irrklang::SAudioStreamFormat +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_67.html b/Thirdparty/irrKlang/doc/cpp/search/all_67.html new file mode 100644 index 0000000..7ad33cf --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_67.html @@ -0,0 +1,321 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + getAs4Values + irrklang::vec3d +
    +
    + +
    +
    + getBytesPerSecond + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getDefault3DSoundMaxDistance + irrklang::ISoundEngine +
    +
    +
    +
    + getDefault3DSoundMinDistance + irrklang::ISoundEngine +
    +
    +
    +
    + getDefaultMaxDistance + irrklang::ISoundSource +
    +
    +
    +
    + getDefaultMinDistance + irrklang::ISoundSource +
    +
    +
    +
    + getDefaultVolume + irrklang::ISoundSource +
    +
    +
    +
    + getDeviceCount + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDeviceDescription + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDeviceID + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDistanceFrom + irrklang::vec3d +
    +
    +
    +
    + getDistanceFromSQ + irrklang::vec3d +
    +
    + +
    +
    + getFileName + irrklang::IFileReader +
    +
    +
    +
    + getForcedStreamingThreshold + irrklang::ISoundSource +
    +
    +
    +
    + getFormat + irrklang::IAudioStream +
    +
    +
    +
    + getFrameSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getHorizontalAngle + irrklang::vec3d +
    +
    +
    +
    + getInternalAudioInterface + irrklang::ISoundEngine +
    +
    +
    +
    + getInterpolated + irrklang::vec3d +
    +
    +
    +
    + getIsPaused + irrklang::ISound +
    +
    + +
    +
    + getLength + irrklang::vec3d +
    +
    +
    +
    + getLengthSQ + irrklang::vec3d +
    +
    +
    +
    + getMaxDistance + irrklang::ISound +
    +
    +
    +
    + getMinDistance + irrklang::ISound +
    +
    +
    +
    + getName + irrklang::ISoundSource +
    +
    +
    +
    + getPan + irrklang::ISound +
    +
    +
    +
    + getPlaybackSpeed + irrklang::ISound +
    +
    + +
    +
    + getPlayPosition + irrklang::ISound +
    +
    +
    +
    + getPos + irrklang::IFileReader +
    +
    +
    +
    + getPosition + irrklang::ISound +
    +
    +
    +
    + getRecordedAudioData + irrklang::IAudioRecorder +
    +
    +
    +
    + getSampleData + irrklang::ISoundSource +
    +
    +
    +
    + getSampleDataSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getSampleSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getSize + irrklang::IFileReader +
    +
    +
    +
    + getSoundEffectControl + irrklang::ISound +
    +
    + +
    +
    + getSoundSourceCount + irrklang::ISoundEngine +
    +
    +
    +
    + getSoundVolume + irrklang::ISoundEngine +
    +
    +
    +
    + getStreamMode + irrklang::ISoundSource +
    +
    +
    +
    + getVelocity + irrklang::ISound +
    +
    +
    +
    + getVolume + irrklang::ISound +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_69.html b/Thirdparty/irrKlang/doc/cpp/search/all_69.html new file mode 100644 index 0000000..355b2a4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_69.html @@ -0,0 +1,445 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + IAudioRecorder + irrklang +
    +
    +
    +
    + IAudioStream + irrklang +
    +
    +
    +
    + IAudioStreamLoader + irrklang +
    +
    +
    + +
    +
    +
    + IFileFactory + irrklang +
    +
    +
    +
    + IFileReader + irrklang +
    +
    +
    +
    + ik_c8 + irrklang +
    +
    +
    +
    + IK_DEGTORAD + irrklang +
    +
    +
    +
    + IK_DEGTORAD64 + irrklang +
    +
    + + + +
    +
    + ik_f32 + irrklang +
    +
    +
    +
    + ik_f64 + irrklang +
    +
    + + + + + + + +
    + +
    + + + + + + + +
    +
    + IK_PI32 + irrklang +
    +
    +
    +
    + IK_PI64 + irrklang +
    +
    +
    +
    + IK_RADTODEG + irrklang +
    +
    +
    +
    + IK_RADTODEG64 + irrklang +
    +
    +
    +
    + IK_ROUNDING_ERROR_32 + irrklang +
    +
    +
    +
    + ik_s16 + irrklang +
    +
    +
    +
    + ik_s32 + irrklang +
    +
    +
    +
    + ik_s8 + irrklang +
    +
    + +
    +
    + ik_u16 + irrklang +
    +
    +
    +
    + ik_u32 + irrklang +
    +
    +
    +
    + ik_u8 + irrklang +
    +
    +
    + +
    +
    +
    + invert + irrklang::vec3d +
    +
    +
    +
    + IRefCounted + irrklang +
    +
    +
    +
    + IRefCounted + irrklang::IRefCounted +
    +
    +
    +
    + IRR_KLANG_VERSION + irrKlang.h +
    +
    +
    +
    + irrklang +
    +
    +
    + +
    +
    +
    + IRRKLANG_API + irrKlang.h +
    +
    +
    +
    + IRRKLANGCALLCONV + irrKlang.h +
    +
    +
    +
    + isALoadableFileExtension + irrklang::IAudioStreamLoader +
    +
    +
    +
    + isBetweenPoints + irrklang::vec3d +
    +
    +
    +
    + isChorusSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isCompressorSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    + +
    +
    + isDistortionSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isEchoSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isFinished + irrklang::ISound +
    +
    +
    +
    + isFlangerSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isGargleSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isI3DL2ReverbSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isLooped + irrklang::ISound +
    +
    +
    +
    + isMultiThreaded + irrklang::ISoundEngine +
    +
    +
    +
    + ISound + irrklang +
    +
    +
    +
    + ISoundDeviceList + irrklang +
    +
    +
    +
    + ISoundEffectControl + irrklang +
    +
    +
    +
    + ISoundEngine + irrklang +
    +
    +
    +
    + ISoundMixedOutputReceiver + irrklang +
    +
    +
    +
    + ISoundSource + irrklang +
    +
    +
    +
    + ISoundStopEventReceiver + irrklang +
    +
    +
    +
    + isParamEqSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isRecording + irrklang::IAudioRecorder +
    +
    +
    +
    + isWavesReverbSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + IVirtualRefCounted + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_6c.html b/Thirdparty/irrKlang/doc/cpp/search/all_6c.html new file mode 100644 index 0000000..0f99162 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_6c.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + loadPlugins + irrklang::ISoundEngine +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_6d.html b/Thirdparty/irrKlang/doc/cpp/search/all_6d.html new file mode 100644 index 0000000..ad7e715 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_6d.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + makeUTF8fromUTF16string + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_6e.html b/Thirdparty/irrKlang/doc/cpp/search/all_6e.html new file mode 100644 index 0000000..1710a9b --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + normalize + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_6f.html b/Thirdparty/irrKlang/doc/cpp/search/all_6f.html new file mode 100644 index 0000000..b4a6e5c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_6f.html @@ -0,0 +1,132 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + OnAudioDataReady + irrklang::ISoundMixedOutputReceiver +
    +
    +
    +
    + OnReceiveAudioDataStreamChunk + irrklang::ICapturedAudioDataReceiver +
    +
    +
    +
    + OnSoundStopped + irrklang::ISoundStopEventReceiver +
    +
    +
    +
    + operator!= + irrklang::vec3d +
    +
    + + +
    +
    + operator+ + irrklang::vec3d +
    +
    +
    +
    + operator+= + irrklang::vec3d +
    +
    + +
    +
    + operator-= + irrklang::vec3d +
    +
    + + +
    +
    + operator<= + irrklang::vec3d +
    +
    +
    +
    + operator= + irrklang::vec3d +
    +
    +
    +
    + operator== + irrklang::vec3d +
    +
    +
    +
    + operator>= + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_70.html b/Thirdparty/irrKlang/doc/cpp/search/all_70.html new file mode 100644 index 0000000..cbc1adc --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_70.html @@ -0,0 +1,68 @@ + + + + + + + + + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_72.html b/Thirdparty/irrKlang/doc/cpp/search/all_72.html new file mode 100644 index 0000000..5aed2fa --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_72.html @@ -0,0 +1,71 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + read + irrklang::IFileReader +
    +
    +
    +
    + readFrames + irrklang::IAudioStream +
    +
    +
    +
    + registerAudioStreamLoader + irrklang::ISoundEngine +
    +
    +
    +
    + removeAllSoundSources + irrklang::ISoundEngine +
    +
    + +
    +
    + rotateXYBy + irrklang::vec3d +
    +
    +
    +
    + rotateXZBy + irrklang::vec3d +
    +
    +
    +
    + rotateYZBy + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_73.html b/Thirdparty/irrKlang/doc/cpp/search/all_73.html new file mode 100644 index 0000000..f18c871 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_73.html @@ -0,0 +1,248 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SampleFormat + irrklang::SAudioStreamFormat +
    +
    +
    +
    + SampleRate + irrklang::SAudioStreamFormat +
    +
    +
    +
    + SAudioStreamFormat + irrklang +
    +
    +
    +
    + seek + irrklang::IFileReader +
    +
    + +
    +
    + setAllSoundsPaused + irrklang::ISoundEngine +
    +
    +
    +
    + setDefault3DSoundMaxDistance + irrklang::ISoundEngine +
    +
    +
    +
    + setDefault3DSoundMinDistance + irrklang::ISoundEngine +
    +
    +
    +
    + setDefaultMaxDistance + irrklang::ISoundSource +
    +
    +
    +
    + setDefaultMinDistance + irrklang::ISoundSource +
    +
    +
    +
    + setDefaultVolume + irrklang::ISoundSource +
    +
    +
    +
    + setDopplerEffectParameters + irrklang::ISoundEngine +
    +
    +
    +
    + setForcedStreamingThreshold + irrklang::ISoundSource +
    +
    +
    +
    + setIsLooped + irrklang::ISound +
    +
    +
    +
    + setIsPaused + irrklang::ISound +
    +
    +
    +
    + setLength + irrklang::vec3d +
    +
    +
    +
    + setListenerPosition + irrklang::ISoundEngine +
    +
    +
    +
    + setMaxDistance + irrklang::ISound +
    +
    +
    +
    + setMinDistance + irrklang::ISound +
    +
    +
    +
    + setMixedDataOutputReceiver + irrklang::ISoundEngine +
    +
    +
    +
    + setPan + irrklang::ISound +
    +
    +
    +
    + setPlaybackSpeed + irrklang::ISound +
    +
    +
    +
    + setPlayPosition + irrklang::ISound +
    +
    + +
    +
    + setRolloffFactor + irrklang::ISoundEngine +
    +
    +
    +
    + setSoundStopEventReceiver + irrklang::ISound +
    +
    +
    +
    + setSoundVolume + irrklang::ISoundEngine +
    +
    +
    +
    + setStreamMode + irrklang::ISoundSource +
    +
    +
    +
    + setVelocity + irrklang::ISound +
    +
    +
    +
    + setVolume + irrklang::ISound +
    +
    +
    +
    + SInternalAudioInterface + irrklang +
    +
    +
    +
    + startRecordingBufferedAudio + irrklang::IAudioRecorder +
    +
    +
    +
    + startRecordingCustomHandledAudio + irrklang::IAudioRecorder +
    +
    +
    +
    + stop + irrklang::ISound +
    +
    +
    +
    + stopAllSounds + irrklang::ISoundEngine +
    +
    +
    +
    + stopAllSoundsOfSoundSource + irrklang::ISoundEngine +
    +
    +
    +
    + stopRecordingAudio + irrklang::IAudioRecorder +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_75.html b/Thirdparty/irrKlang/doc/cpp/search/all_75.html new file mode 100644 index 0000000..9df3aa1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_75.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + update + irrklang::ISoundEngine +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_76.html b/Thirdparty/irrKlang/doc/cpp/search/all_76.html new file mode 100644 index 0000000..55eb308 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_76.html @@ -0,0 +1,48 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + vec3d + irrklang +
    +
    + +
    +
    + vec3df + irrklang +
    +
    +
    +
    + vec3di + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_78.html b/Thirdparty/irrKlang/doc/cpp/search/all_78.html new file mode 100644 index 0000000..dc2cb05 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_78.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + X + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_79.html b/Thirdparty/irrKlang/doc/cpp/search/all_79.html new file mode 100644 index 0000000..07637f6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_79.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + Y + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_7a.html b/Thirdparty/irrKlang/doc/cpp/search/all_7a.html new file mode 100644 index 0000000..f48a618 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_7a.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + Z + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/all_7e.html b/Thirdparty/irrKlang/doc/cpp/search/all_7e.html new file mode 100644 index 0000000..906da72 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/all_7e.html @@ -0,0 +1,68 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ~IAudioStream + irrklang::IAudioStream +
    +
    +
    +
    + ~IAudioStreamLoader + irrklang::IAudioStreamLoader +
    +
    +
    +
    + ~IFileFactory + irrklang::IFileFactory +
    +
    +
    +
    + ~IFileReader + irrklang::IFileReader +
    +
    +
    +
    + ~IRefCounted + irrklang::IRefCounted +
    +
    +
    +
    + ~ISoundMixedOutputReceiver + irrklang::ISoundMixedOutputReceiver +
    +
    +
    +
    + ~ISoundStopEventReceiver + irrklang::ISoundStopEventReceiver +
    +
    +
    +
    + ~IVirtualRefCounted + irrklang::IVirtualRefCounted +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/classes_69.html b/Thirdparty/irrKlang/doc/cpp/search/classes_69.html new file mode 100644 index 0000000..2b02979 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/classes_69.html @@ -0,0 +1,110 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + IAudioRecorder + irrklang +
    +
    +
    +
    + IAudioStream + irrklang +
    +
    +
    +
    + IAudioStreamLoader + irrklang +
    +
    +
    + +
    +
    +
    + IFileFactory + irrklang +
    +
    +
    +
    + IFileReader + irrklang +
    +
    +
    +
    + IRefCounted + irrklang +
    +
    +
    +
    + ISound + irrklang +
    +
    +
    +
    + ISoundDeviceList + irrklang +
    +
    +
    +
    + ISoundEffectControl + irrklang +
    +
    +
    +
    + ISoundEngine + irrklang +
    +
    +
    +
    + ISoundMixedOutputReceiver + irrklang +
    +
    +
    +
    + ISoundSource + irrklang +
    +
    +
    +
    + ISoundStopEventReceiver + irrklang +
    +
    +
    +
    + IVirtualRefCounted + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/classes_73.html b/Thirdparty/irrKlang/doc/cpp/search/classes_73.html new file mode 100644 index 0000000..9887d89 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/classes_73.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SAudioStreamFormat + irrklang +
    +
    +
    +
    + SInternalAudioInterface + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/classes_76.html b/Thirdparty/irrKlang/doc/cpp/search/classes_76.html new file mode 100644 index 0000000..631d95e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/classes_76.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + vec3d + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/close.png b/Thirdparty/irrKlang/doc/cpp/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/search/defines_69.html b/Thirdparty/irrKlang/doc/cpp/search/defines_69.html new file mode 100644 index 0000000..3bf6f80 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/defines_69.html @@ -0,0 +1,38 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + IRR_KLANG_VERSION + irrKlang.h +
    +
    +
    +
    + IRRKLANG_API + irrKlang.h +
    +
    +
    +
    + IRRKLANGCALLCONV + irrKlang.h +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/enums_65.html b/Thirdparty/irrKlang/doc/cpp/search/enums_65.html new file mode 100644 index 0000000..a4fe1b1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/enums_65.html @@ -0,0 +1,50 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + E_SOUND_ENGINE_OPTIONS + irrklang +
    +
    +
    +
    + E_SOUND_OUTPUT_DRIVER + irrklang +
    +
    +
    +
    + E_STOP_EVENT_CAUSE + irrklang +
    +
    +
    +
    + E_STREAM_MODE + irrklang +
    +
    +
    +
    + ESampleFormat + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/enumvalues_65.html b/Thirdparty/irrKlang/doc/cpp/search/enumvalues_65.html new file mode 100644 index 0000000..b733d7d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/enumvalues_65.html @@ -0,0 +1,188 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ESEC_FORCE_32_BIT + irrklang +
    +
    +
    + +
    + +
    + +
    +
    +
    + ESEO_DEFAULT_OPTIONS + irrklang +
    +
    +
    +
    + ESEO_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESEO_LINEAR_ROLLOFF + irrklang +
    +
    +
    +
    + ESEO_LOAD_PLUGINS + irrklang +
    +
    +
    +
    + ESEO_MULTI_THREADED + irrklang +
    +
    +
    +
    + ESEO_MUTE_IF_NOT_FOCUSED + irrklang +
    +
    + + +
    +
    + ESEO_USE_3D_BUFFERS + irrklang +
    +
    +
    +
    + ESF_S16 + irrklang +
    +
    +
    +
    + ESF_U8 + irrklang +
    +
    +
    +
    + ESM_AUTO_DETECT + irrklang +
    +
    +
    +
    + ESM_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESM_NO_STREAMING + irrklang +
    +
    +
    +
    + ESM_STREAMING + irrklang +
    +
    +
    +
    + ESOD_ALSA + irrklang +
    +
    +
    +
    + ESOD_AUTO_DETECT + irrklang +
    +
    +
    +
    + ESOD_CORE_AUDIO + irrklang +
    +
    +
    +
    + ESOD_COUNT + irrklang +
    +
    +
    +
    + ESOD_DIRECT_SOUND + irrklang +
    +
    +
    +
    + ESOD_DIRECT_SOUND_8 + irrklang +
    +
    +
    +
    + ESOD_FORCE_32_BIT + irrklang +
    +
    +
    +
    + ESOD_NULL + irrklang +
    +
    +
    +
    + ESOD_WIN_MM + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/files_69.html b/Thirdparty/irrKlang/doc/cpp/search/files_69.html new file mode 100644 index 0000000..eb8256d --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/files_69.html @@ -0,0 +1,125 @@ + + + + + + + +
    +
    Loading...
    + + + + + + + + + + +
    + +
    + + + + + + + + +
    + +
    +
    + +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_61.html b/Thirdparty/irrKlang/doc/cpp/search/functions_61.html new file mode 100644 index 0000000..7c29184 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_61.html @@ -0,0 +1,56 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + addFileFactory + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceAlias + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromFile + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromMemory + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromPCMData + irrklang::ISoundEngine +
    +
    +
    +
    + addSoundSourceFromRecordedAudio + irrklang::IAudioRecorder +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_63.html b/Thirdparty/irrKlang/doc/cpp/search/functions_63.html new file mode 100644 index 0000000..dc115ae --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_63.html @@ -0,0 +1,68 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + clearRecordedAudioDataBuffer + irrklang::IAudioRecorder +
    +
    +
    + +
    +
    +
    + createAudioStream + irrklang::IAudioStreamLoader +
    +
    +
    +
    + createFileReader + irrklang::IFileFactory +
    +
    +
    + +
    +
    +
    + createIrrKlangDevice + irrklang +
    +
    +
    +
    + createSoundDeviceList + irrklang +
    +
    +
    +
    + crossProduct + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_64.html b/Thirdparty/irrKlang/doc/cpp/search/functions_64.html new file mode 100644 index 0000000..89a6e7f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_64.html @@ -0,0 +1,95 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + disableAllEffects + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableChorusSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableCompressorSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableDistortionSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableEchoSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableFlangerSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableGargleSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableI3DL2ReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableParamEqSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + disableWavesReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + dotProduct + irrklang::vec3d +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_65.html b/Thirdparty/irrKlang/doc/cpp/search/functions_65.html new file mode 100644 index 0000000..5dabec1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_65.html @@ -0,0 +1,86 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + enableChorusSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableCompressorSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableDistortionSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableEchoSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableFlangerSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableGargleSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableI3DL2ReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableParamEqSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + enableWavesReverbSoundEffect + irrklang::ISoundEffectControl +
    +
    +
    +
    + equals + irrklang::vec3d +
    +
    +
    +
    + equalsfloat + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_66.html b/Thirdparty/irrKlang/doc/cpp/search/functions_66.html new file mode 100644 index 0000000..5d72024 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_66.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + forceReloadAtNextUse + irrklang::ISoundSource +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_67.html b/Thirdparty/irrKlang/doc/cpp/search/functions_67.html new file mode 100644 index 0000000..7ad33cf --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_67.html @@ -0,0 +1,321 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + getAs4Values + irrklang::vec3d +
    +
    + +
    +
    + getBytesPerSecond + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getDefault3DSoundMaxDistance + irrklang::ISoundEngine +
    +
    +
    +
    + getDefault3DSoundMinDistance + irrklang::ISoundEngine +
    +
    +
    +
    + getDefaultMaxDistance + irrklang::ISoundSource +
    +
    +
    +
    + getDefaultMinDistance + irrklang::ISoundSource +
    +
    +
    +
    + getDefaultVolume + irrklang::ISoundSource +
    +
    +
    +
    + getDeviceCount + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDeviceDescription + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDeviceID + irrklang::ISoundDeviceList +
    +
    +
    +
    + getDistanceFrom + irrklang::vec3d +
    +
    +
    +
    + getDistanceFromSQ + irrklang::vec3d +
    +
    + +
    +
    + getFileName + irrklang::IFileReader +
    +
    +
    +
    + getForcedStreamingThreshold + irrklang::ISoundSource +
    +
    +
    +
    + getFormat + irrklang::IAudioStream +
    +
    +
    +
    + getFrameSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getHorizontalAngle + irrklang::vec3d +
    +
    +
    +
    + getInternalAudioInterface + irrklang::ISoundEngine +
    +
    +
    +
    + getInterpolated + irrklang::vec3d +
    +
    +
    +
    + getIsPaused + irrklang::ISound +
    +
    + +
    +
    + getLength + irrklang::vec3d +
    +
    +
    +
    + getLengthSQ + irrklang::vec3d +
    +
    +
    +
    + getMaxDistance + irrklang::ISound +
    +
    +
    +
    + getMinDistance + irrklang::ISound +
    +
    +
    +
    + getName + irrklang::ISoundSource +
    +
    +
    +
    + getPan + irrklang::ISound +
    +
    +
    +
    + getPlaybackSpeed + irrklang::ISound +
    +
    + +
    +
    + getPlayPosition + irrklang::ISound +
    +
    +
    +
    + getPos + irrklang::IFileReader +
    +
    +
    +
    + getPosition + irrklang::ISound +
    +
    +
    +
    + getRecordedAudioData + irrklang::IAudioRecorder +
    +
    +
    +
    + getSampleData + irrklang::ISoundSource +
    +
    +
    +
    + getSampleDataSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getSampleSize + irrklang::SAudioStreamFormat +
    +
    +
    +
    + getSize + irrklang::IFileReader +
    +
    +
    +
    + getSoundEffectControl + irrklang::ISound +
    +
    + +
    +
    + getSoundSourceCount + irrklang::ISoundEngine +
    +
    +
    +
    + getSoundVolume + irrklang::ISoundEngine +
    +
    +
    +
    + getStreamMode + irrklang::ISoundSource +
    +
    +
    +
    + getVelocity + irrklang::ISound +
    +
    +
    +
    + getVolume + irrklang::ISound +
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_69.html b/Thirdparty/irrKlang/doc/cpp/search/functions_69.html new file mode 100644 index 0000000..2146011 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_69.html @@ -0,0 +1,131 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + invert + irrklang::vec3d +
    +
    +
    +
    + IRefCounted + irrklang::IRefCounted +
    +
    +
    +
    + isALoadableFileExtension + irrklang::IAudioStreamLoader +
    +
    +
    +
    + isBetweenPoints + irrklang::vec3d +
    +
    +
    +
    + isChorusSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isCompressorSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    + +
    +
    + isDistortionSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isEchoSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isFinished + irrklang::ISound +
    +
    +
    +
    + isFlangerSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isGargleSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isI3DL2ReverbSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isLooped + irrklang::ISound +
    +
    +
    +
    + isMultiThreaded + irrklang::ISoundEngine +
    +
    +
    +
    + isParamEqSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    +
    + isRecording + irrklang::IAudioRecorder +
    +
    +
    +
    + isWavesReverbSoundEffectEnabled + irrklang::ISoundEffectControl +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_6c.html b/Thirdparty/irrKlang/doc/cpp/search/functions_6c.html new file mode 100644 index 0000000..0f99162 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_6c.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + loadPlugins + irrklang::ISoundEngine +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_6d.html b/Thirdparty/irrKlang/doc/cpp/search/functions_6d.html new file mode 100644 index 0000000..ad7e715 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_6d.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + makeUTF8fromUTF16string + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_6e.html b/Thirdparty/irrKlang/doc/cpp/search/functions_6e.html new file mode 100644 index 0000000..1710a9b --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_6e.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + normalize + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_6f.html b/Thirdparty/irrKlang/doc/cpp/search/functions_6f.html new file mode 100644 index 0000000..b4a6e5c --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_6f.html @@ -0,0 +1,132 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + OnAudioDataReady + irrklang::ISoundMixedOutputReceiver +
    +
    +
    +
    + OnReceiveAudioDataStreamChunk + irrklang::ICapturedAudioDataReceiver +
    +
    +
    +
    + OnSoundStopped + irrklang::ISoundStopEventReceiver +
    +
    +
    +
    + operator!= + irrklang::vec3d +
    +
    + + +
    +
    + operator+ + irrklang::vec3d +
    +
    +
    +
    + operator+= + irrklang::vec3d +
    +
    + +
    +
    + operator-= + irrklang::vec3d +
    +
    + + +
    +
    + operator<= + irrklang::vec3d +
    +
    +
    +
    + operator= + irrklang::vec3d +
    +
    +
    +
    + operator== + irrklang::vec3d +
    +
    +
    +
    + operator>= + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_70.html b/Thirdparty/irrKlang/doc/cpp/search/functions_70.html new file mode 100644 index 0000000..99fa911 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_70.html @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_72.html b/Thirdparty/irrKlang/doc/cpp/search/functions_72.html new file mode 100644 index 0000000..5aed2fa --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_72.html @@ -0,0 +1,71 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + read + irrklang::IFileReader +
    +
    +
    +
    + readFrames + irrklang::IAudioStream +
    +
    +
    +
    + registerAudioStreamLoader + irrklang::ISoundEngine +
    +
    +
    +
    + removeAllSoundSources + irrklang::ISoundEngine +
    +
    + +
    +
    + rotateXYBy + irrklang::vec3d +
    +
    +
    +
    + rotateXZBy + irrklang::vec3d +
    +
    +
    +
    + rotateYZBy + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_73.html b/Thirdparty/irrKlang/doc/cpp/search/functions_73.html new file mode 100644 index 0000000..22f3e00 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_73.html @@ -0,0 +1,224 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + seek + irrklang::IFileReader +
    +
    + +
    +
    + setAllSoundsPaused + irrklang::ISoundEngine +
    +
    +
    +
    + setDefault3DSoundMaxDistance + irrklang::ISoundEngine +
    +
    +
    +
    + setDefault3DSoundMinDistance + irrklang::ISoundEngine +
    +
    +
    +
    + setDefaultMaxDistance + irrklang::ISoundSource +
    +
    +
    +
    + setDefaultMinDistance + irrklang::ISoundSource +
    +
    +
    +
    + setDefaultVolume + irrklang::ISoundSource +
    +
    +
    +
    + setDopplerEffectParameters + irrklang::ISoundEngine +
    +
    +
    +
    + setForcedStreamingThreshold + irrklang::ISoundSource +
    +
    +
    +
    + setIsLooped + irrklang::ISound +
    +
    +
    +
    + setIsPaused + irrklang::ISound +
    +
    +
    +
    + setLength + irrklang::vec3d +
    +
    +
    +
    + setListenerPosition + irrklang::ISoundEngine +
    +
    +
    +
    + setMaxDistance + irrklang::ISound +
    +
    +
    +
    + setMinDistance + irrklang::ISound +
    +
    +
    +
    + setMixedDataOutputReceiver + irrklang::ISoundEngine +
    +
    +
    +
    + setPan + irrklang::ISound +
    +
    +
    +
    + setPlaybackSpeed + irrklang::ISound +
    +
    +
    +
    + setPlayPosition + irrklang::ISound +
    +
    + +
    +
    + setRolloffFactor + irrklang::ISoundEngine +
    +
    +
    +
    + setSoundStopEventReceiver + irrklang::ISound +
    +
    +
    +
    + setSoundVolume + irrklang::ISoundEngine +
    +
    +
    +
    + setStreamMode + irrklang::ISoundSource +
    +
    +
    +
    + setVelocity + irrklang::ISound +
    +
    +
    +
    + setVolume + irrklang::ISound +
    +
    +
    +
    + startRecordingBufferedAudio + irrklang::IAudioRecorder +
    +
    +
    +
    + startRecordingCustomHandledAudio + irrklang::IAudioRecorder +
    +
    +
    +
    + stop + irrklang::ISound +
    +
    +
    +
    + stopAllSounds + irrklang::ISoundEngine +
    +
    +
    +
    + stopAllSoundsOfSoundSource + irrklang::ISoundEngine +
    +
    +
    +
    + stopRecordingAudio + irrklang::IAudioRecorder +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_75.html b/Thirdparty/irrKlang/doc/cpp/search/functions_75.html new file mode 100644 index 0000000..9df3aa1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_75.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + update + irrklang::ISoundEngine +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_76.html b/Thirdparty/irrKlang/doc/cpp/search/functions_76.html new file mode 100644 index 0000000..c61762e --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_76.html @@ -0,0 +1,30 @@ + + + + + + + +
    +
    Loading...
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/functions_7e.html b/Thirdparty/irrKlang/doc/cpp/search/functions_7e.html new file mode 100644 index 0000000..906da72 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/functions_7e.html @@ -0,0 +1,68 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ~IAudioStream + irrklang::IAudioStream +
    +
    +
    +
    + ~IAudioStreamLoader + irrklang::IAudioStreamLoader +
    +
    +
    +
    + ~IFileFactory + irrklang::IFileFactory +
    +
    +
    +
    + ~IFileReader + irrklang::IFileReader +
    +
    +
    +
    + ~IRefCounted + irrklang::IRefCounted +
    +
    +
    +
    + ~ISoundMixedOutputReceiver + irrklang::ISoundMixedOutputReceiver +
    +
    +
    +
    + ~ISoundStopEventReceiver + irrklang::ISoundStopEventReceiver +
    +
    +
    +
    + ~IVirtualRefCounted + irrklang::IVirtualRefCounted +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/namespaces_69.html b/Thirdparty/irrKlang/doc/cpp/search/namespaces_69.html new file mode 100644 index 0000000..dfc5f13 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/namespaces_69.html @@ -0,0 +1,25 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/nomatches.html b/Thirdparty/irrKlang/doc/cpp/search/nomatches.html new file mode 100644 index 0000000..b1ded27 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/search.css b/Thirdparty/irrKlang/doc/cpp/search/search.css new file mode 100644 index 0000000..d263b97 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/search.css @@ -0,0 +1,198 @@ +/*---------------- Search Box */ + +#MSearchBox { + padding: 0px; + margin: 0px; + border: none; + border: 1px solid #84B0C7; + white-space: nowrap; + -moz-border-radius: 8px; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; +} +#MSearchField { + font: 9pt Arial, Verdana, sans-serif; + color: #999999; + background-color: #FFFFFF; + font-style: normal; + cursor: text; + padding: 1px 1px; + margin: 0px 6px 0px 0px; + border: none; + outline: none; + vertical-align: middle; +} +.MSearchBoxActive #MSearchField { + color: #000000; +} +#MSearchSelect { + float : none; + display : inline; + background : none; + font: 9pt Verdana, sans-serif; + border: none; + margin: 0px 0px 0px 6px; + vertical-align: middle; + padding: 0px 0px; +} + +#MSearchClose { + float : none; + display : none; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +#MSearchCloseImg { + vertical-align: middle; +} + +.MSearchBoxLeft { + display: block; + text-align: left; + float: left; + margin-left: 6px; +} +.MSearchBoxRight { + display: block; + float: right; + text-align: right; + margin-right: 6px; +} +.MSearchBoxSpacer { + font-size: 0px; + clear: both; +} +.MSearchBoxRow { + font-size: 0px; + clear: both; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #A0A0A0; + background-color: #FAFAFA; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + } +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} +a.SelectItem:hover { + color: #FFFFFF; + background-color: #2A50E4; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; + } +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000000; + background-color: #EEF3F5; + } + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} +.SRPage .SRChildren { + display: none; +} +.SRSymbol { + font-weight: bold; color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #153788; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + diff --git a/Thirdparty/irrKlang/doc/cpp/search/search.js b/Thirdparty/irrKlang/doc/cpp/search/search.js new file mode 100644 index 0000000..2ed0ceb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/search.js @@ -0,0 +1,744 @@ +// Search script generated by doxygen +// Copyright (C) 2009 by Dimitri van Heesch. + +// The code in this file is loosly based on main.js, part of Natural Docs, +// which is Copyright (C) 2003-2008 Greg Valure +// Natural Docs is licensed under the GPL. + +var indexSectionsWithContent = +{ + 0: "000000000000000000000000000000000000000000000000000000000000000001011111010011111011011011100010", + 1: "000000000000000000000000000000000000000000000000000000000000000000000000010000000001001000000000", + 2: "000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000", + 3: "000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000", + 4: "000000000000000000000000000000000000000000000000000000000000000001011111010011111011011000000010", + 5: "000000000000000000000000000000000000000000000000000000000000000000010010010000001001000011100000", + 6: "000000000000000000000000000000000000000000000000000000000000000000000000010000000000001000000000", + 7: "000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + 8: "000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + 9: "000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces", + 3: "files", + 4: "functions", + 5: "variables", + 6: "typedefs", + 7: "enums", + 8: "enumvalues", + 9: "defines" +}; + +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var hexCode; + if (code<16) + { + hexCode="0"+code.toString(16); + } + else + { + hexCode=code.toString(16); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + if (indexSectionsWithContent[this.searchIndex].charAt(code-32) == '1') + { + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location.href = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} diff --git a/Thirdparty/irrKlang/doc/cpp/search/search.png b/Thirdparty/irrKlang/doc/cpp/search/search.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd2396db13f27c7b5e1844540d12e0e54977189 GIT binary patch literal 527 zcmV+q0`UEbP)`f0005jNkl4#8 zyRJb|5QfiY3nD}#O1IDv32{lhg2F4H)+uxzLhBJkK|@6+NC=S-QMwdDA(0T5^Rb+r z6PJ@S#oDuG{{Np@Gh4b|uU~h&TrSex#PvU?tS~#BPQTxuPNziNZnxj>4~N5lOGu~F ziF(y)wOlTr&u8jGP^naEwK|bV#N%`jJS4I$EukQckB6(ORuWistd(@>L9MGMR8v)@U^9^?IF7hr?B*-qJ)+ z1|i-_O<8`-j|U?Gf)q9yjf%zMZ<*i*e;r)?T0%FY-erEE4^ zE|)WzOa!sPV4yI$s`L3g9J}3aHk&~s1mENFu%YdCOBdtuI2a5v5ztnv^``M-l6VPq z_WS+ea1aGG8V!n@&8AQ&tk-LY!;#HqS-}tM@x8SzUWE##TnVDJSS;Y9lF4KOfxt6a za0LG;M+*LYKA+8Iu~>{>;0g9<8{AVu2oXOXkIav?zy4Z%002ovPDHLkV1iB-@74eS literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/search/typedefs_69.html b/Thirdparty/irrKlang/doc/cpp/search/typedefs_69.html new file mode 100644 index 0000000..c91cb1f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/typedefs_69.html @@ -0,0 +1,74 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ik_c8 + irrklang +
    +
    +
    +
    + ik_f32 + irrklang +
    +
    +
    +
    + ik_f64 + irrklang +
    +
    +
    +
    + ik_s16 + irrklang +
    +
    +
    +
    + ik_s32 + irrklang +
    +
    +
    +
    + ik_s8 + irrklang +
    +
    +
    +
    + ik_u16 + irrklang +
    +
    +
    +
    + ik_u32 + irrklang +
    +
    +
    +
    + ik_u8 + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/typedefs_76.html b/Thirdparty/irrKlang/doc/cpp/search/typedefs_76.html new file mode 100644 index 0000000..d9a44ff --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/typedefs_76.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + vec3df + irrklang +
    +
    +
    +
    + vec3di + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_63.html b/Thirdparty/irrKlang/doc/cpp/search/variables_63.html new file mode 100644 index 0000000..7952e42 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_63.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + ChannelCount + irrklang::SAudioStreamFormat +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_66.html b/Thirdparty/irrKlang/doc/cpp/search/variables_66.html new file mode 100644 index 0000000..7b660c0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_66.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + FrameCount + irrklang::SAudioStreamFormat +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_69.html b/Thirdparty/irrKlang/doc/cpp/search/variables_69.html new file mode 100644 index 0000000..ea7418f --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_69.html @@ -0,0 +1,62 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + IK_DEGTORAD + irrklang +
    +
    +
    +
    + IK_DEGTORAD64 + irrklang +
    +
    +
    +
    + IK_PI32 + irrklang +
    +
    +
    +
    + IK_PI64 + irrklang +
    +
    +
    +
    + IK_RADTODEG + irrklang +
    +
    +
    +
    + IK_RADTODEG64 + irrklang +
    +
    +
    +
    + IK_ROUNDING_ERROR_32 + irrklang +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_70.html b/Thirdparty/irrKlang/doc/cpp/search/variables_70.html new file mode 100644 index 0000000..043ae84 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_70.html @@ -0,0 +1,50 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + pALSA_SND_PCM + irrklang::SInternalAudioInterface +
    +
    +
    +
    + pCoreAudioDeciceID + irrklang::SInternalAudioInterface +
    +
    +
    +
    + pIDirectSound + irrklang::SInternalAudioInterface +
    +
    +
    +
    + pIDirectSound8 + irrklang::SInternalAudioInterface +
    +
    +
    +
    + pWinMM_HWaveOut + irrklang::SInternalAudioInterface +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_73.html b/Thirdparty/irrKlang/doc/cpp/search/variables_73.html new file mode 100644 index 0000000..b807d19 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_73.html @@ -0,0 +1,32 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + SampleFormat + irrklang::SAudioStreamFormat +
    +
    +
    +
    + SampleRate + irrklang::SAudioStreamFormat +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_78.html b/Thirdparty/irrKlang/doc/cpp/search/variables_78.html new file mode 100644 index 0000000..dc2cb05 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_78.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + X + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_79.html b/Thirdparty/irrKlang/doc/cpp/search/variables_79.html new file mode 100644 index 0000000..07637f6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_79.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + Y + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/search/variables_7a.html b/Thirdparty/irrKlang/doc/cpp/search/variables_7a.html new file mode 100644 index 0000000..f48a618 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/search/variables_7a.html @@ -0,0 +1,26 @@ + + + + + + + +
    +
    Loading...
    +
    +
    + Z + irrklang::vec3d +
    +
    +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format-members.html b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format-members.html new file mode 100644 index 0000000..2983c38 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format-members.html @@ -0,0 +1,88 @@ + + + + + +irrKlang: Member List + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format.html b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format.html new file mode 100644 index 0000000..9f435eb --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_audio_stream_format.html @@ -0,0 +1,252 @@ + + + + + +irrKlang: irrklang::SAudioStreamFormat Struct Reference + + + + + + + + + +
    +

    irrklang::SAudioStreamFormat Struct Reference

    +

    structure describing an audio stream format with helper functions +More...

    + +

    #include <ik_SAudioStreamFormat.h>

    + +

    List of all members.

    + + + + + + + + + + + + + + + + + + + +

    Public Member Functions

    ik_s32 getSampleSize () const
     returns the size of a sample of the data described by the stream data in bytes
    ik_s32 getFrameSize () const
     returns the frame size of the stream data in bytes
    ik_s32 getSampleDataSize () const
     returns the size of the sample data in bytes
    ik_s32 getBytesPerSecond () const
     returns amount of bytes per second

    Public Attributes

    ik_s32 ChannelCount
     channels, 1 for mono, 2 for stereo
    ik_s32 FrameCount
     amount of frames in the sample data or stream.
    ik_s32 SampleRate
     samples per second
    ESampleFormat SampleFormat
     format of the sample data
    +

    Detailed Description

    +

    structure describing an audio stream format with helper functions

    +

    Member Function Documentation

    + +
    +
    + + + + + + + + +
    ik_s32 irrklang::SAudioStreamFormat::getBytesPerSecond ( )  const [inline]
    +
    +
    + +

    returns amount of bytes per second

    + +
    +
    + +
    +
    + + + + + + + + +
    ik_s32 irrklang::SAudioStreamFormat::getFrameSize ( )  const [inline]
    +
    +
    + +

    returns the frame size of the stream data in bytes

    + +
    +
    + +
    +
    + + + + + + + + +
    ik_s32 irrklang::SAudioStreamFormat::getSampleDataSize ( )  const [inline]
    +
    +
    + +

    returns the size of the sample data in bytes

    + +
    +
    + +
    +
    + + + + + + + + +
    ik_s32 irrklang::SAudioStreamFormat::getSampleSize ( )  const [inline]
    +
    +
    + +

    returns the size of a sample of the data described by the stream data in bytes

    + +
    +
    +

    Member Data Documentation

    + +
    + +
    + +

    channels, 1 for mono, 2 for stereo

    + +
    +
    + +
    + +
    + +

    amount of frames in the sample data or stream.

    +

    If the stream has an unknown lenght, this is -1

    + +
    +
    + +
    + +
    + +

    format of the sample data

    + +
    +
    + +
    + +
    + +

    samples per second

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface-members.html b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface-members.html new file mode 100644 index 0000000..f8bb1de --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface-members.html @@ -0,0 +1,85 @@ + + + + + +irrKlang: Member List + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface.html b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface.html new file mode 100644 index 0000000..95f5523 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/structirrklang_1_1_s_internal_audio_interface.html @@ -0,0 +1,183 @@ + + + + + +irrKlang: irrklang::SInternalAudioInterface Struct Reference + + + + + + + + + +
    +

    irrklang::SInternalAudioInterface Struct Reference

    +

    structure for returning pointers to the internal audio interface. +More...

    + +

    #include <ik_ISoundEngine.h>

    + +

    List of all members.

    + + + + + + + + + + + + +

    Public Attributes

    void * pIDirectSound
     IDirectSound interface, this is not null when using the ESOD_DIRECT_SOUND audio driver.
    void * pIDirectSound8
     IDirectSound8 interface, this is not null when using the ESOD_DIRECT_SOUND8 audio driver.
    void * pWinMM_HWaveOut
     HWaveout interface, this is not null when using the ESOD_WIN_MM audio driver.
    void * pALSA_SND_PCM
     ALSA PCM Handle interface, this is not null when using the ESOD_ALSA audio driver.
    ik_u32 pCoreAudioDeciceID
     AudioDeviceID handle, this is not null when using the ESOD_CORE_AUDIO audio driver.
    +

    Detailed Description

    +

    structure for returning pointers to the internal audio interface.

    +

    Use ISoundEngine::getInternalAudioInterface() to get this.

    +

    Member Data Documentation

    + +
    + +
    + +

    ALSA PCM Handle interface, this is not null when using the ESOD_ALSA audio driver.

    + +
    +
    + +
    + +
    + +

    AudioDeviceID handle, this is not null when using the ESOD_CORE_AUDIO audio driver.

    + +
    +
    + +
    + +
    + +

    IDirectSound interface, this is not null when using the ESOD_DIRECT_SOUND audio driver.

    + +
    +
    + +
    + +
    + +

    IDirectSound8 interface, this is not null when using the ESOD_DIRECT_SOUND8 audio driver.

    + +
    +
    + +
    + +
    + +

    HWaveout interface, this is not null when using the ESOD_WIN_MM audio driver.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + +
    + +
    + +
    +
    + +
    + + + + + +
    irrKlang Audio Library
    The irrKlang + Engine Documentation © 2003-2018 by Nikolaus Gebhardt. Generated + by Doxygen + (1.6.1)
    +
    +
    + + diff --git a/Thirdparty/irrKlang/doc/cpp/tab_b.gif b/Thirdparty/irrKlang/doc/cpp/tab_b.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d623483ffdf5f9f96900108042a7ab0643fe2a3 GIT binary patch literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/tab_l.gif b/Thirdparty/irrKlang/doc/cpp/tab_l.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b1e6337c9299a700401a2a78a2c6ffced475216 GIT binary patch literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/tab_r.gif b/Thirdparty/irrKlang/doc/cpp/tab_r.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce9dd9f533cb5486d6941844f442b59d4a9e9175 GIT binary patch literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/cpp/tabs.css b/Thirdparty/irrKlang/doc/cpp/tabs.css new file mode 100644 index 0000000..a444163 --- /dev/null +++ b/Thirdparty/irrKlang/doc/cpp/tabs.css @@ -0,0 +1,105 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs #MSearchBox +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : 80%; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; + text-align : center; + margin : 2px; + padding : 2px; +} diff --git a/Thirdparty/irrKlang/doc/doc_cpp.html b/Thirdparty/irrKlang/doc/doc_cpp.html new file mode 100644 index 0000000..67cd795 --- /dev/null +++ b/Thirdparty/irrKlang/doc/doc_cpp.html @@ -0,0 +1,12 @@ + + + + +irrKlang Documentation + + + + +This page should redirect to the C++-Documentation + + diff --git a/Thirdparty/irrKlang/doc/doc_dotnet.html b/Thirdparty/irrKlang/doc/doc_dotnet.html new file mode 100644 index 0000000..d703626 --- /dev/null +++ b/Thirdparty/irrKlang/doc/doc_dotnet.html @@ -0,0 +1,12 @@ + + + + +irrKlang Documentation + + + + +This page should redirect to the .NET-Documentation + + diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.BytesPerSecond.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.BytesPerSecond.html new file mode 100644 index 0000000..2c04faa --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.BytesPerSecond.html @@ -0,0 +1,57 @@ + + + + + BytesPerSecond Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.BytesPerSecond Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property BytesPerSecond As Integer
    +
    + [C#] +
    public int BytesPerSecond {get;}
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.ChannelCount.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.ChannelCount.html new file mode 100644 index 0000000..8f92962 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.ChannelCount.html @@ -0,0 +1,58 @@ + + + + + AudioFormat.ChannelCount Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.ChannelCount Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ChannelCount As Integer
    +
    + [C#] +
    public int ChannelCount;
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.Format.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.Format.html new file mode 100644 index 0000000..2d7765e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.Format.html @@ -0,0 +1,58 @@ + + + + + AudioFormat.Format Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.Format Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Format As SampleFormat
    +
    + [C#] +
    public SampleFormat Format;
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameCount.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameCount.html new file mode 100644 index 0000000..ec35c6a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameCount.html @@ -0,0 +1,58 @@ + + + + + AudioFormat.FrameCount Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.FrameCount Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public FrameCount As Integer
    +
    + [C#] +
    public int FrameCount;
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameSize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameSize.html new file mode 100644 index 0000000..f54cade --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.FrameSize.html @@ -0,0 +1,57 @@ + + + + + FrameSize Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.FrameSize Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property FrameSize As Integer
    +
    + [C#] +
    public int FrameSize {get;}
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleDataSize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleDataSize.html new file mode 100644 index 0000000..d87d6b1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleDataSize.html @@ -0,0 +1,57 @@ + + + + + SampleDataSize Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.SampleDataSize Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property SampleDataSize As Integer
    +
    + [C#] +
    public int SampleDataSize {get;}
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleRate.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleRate.html new file mode 100644 index 0000000..964fc27 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleRate.html @@ -0,0 +1,58 @@ + + + + + AudioFormat.SampleRate Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.SampleRate Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public SampleRate As Integer
    +
    + [C#] +
    public int SampleRate;
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleSize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleSize.html new file mode 100644 index 0000000..d2200a4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.SampleSize.html @@ -0,0 +1,57 @@ + + + + + SampleSize Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat.SampleSize Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property SampleSize As Integer
    +
    + [C#] +
    public int SampleSize {get;}
    +

    +

    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.html new file mode 100644 index 0000000..a782ab2 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormat.html @@ -0,0 +1,68 @@ + + + + + AudioFormat Structure + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat Structure

    +
    +
    +
    +

    +

    +

    For a list of all members of this type, see AudioFormat Members.

    +

    + System.Object +
       System.ValueType
          IrrKlang.AudioFormat

    +
    + [Visual Basic] +
    Public Structure AudioFormat
    +
    + [C#] +
    public struct AudioFormat
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + AudioFormat Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatConstructor.html new file mode 100644 index 0000000..86ca83c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatConstructor.html @@ -0,0 +1,50 @@ + + + + + AudioFormat Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat Constructor 

    +
    +
    +
    +

    Initializes a new instance of the AudioFormat class.

    +
    + [Visual Basic] +
    Public Sub New()
    +
    + [C#] +
    public AudioFormat();
    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatFields.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatFields.html new file mode 100644 index 0000000..49c3c4c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatFields.html @@ -0,0 +1,52 @@ + + + + + AudioFormat Fields + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat Fields

    +
    +
    +
    +

    The fields of the AudioFormat structure are listed below. For a complete list of AudioFormat structure members, see the AudioFormat Members topic.

    +

    Public Instance Fields

    + +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatMembers.html new file mode 100644 index 0000000..fcffb2c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatMembers.html @@ -0,0 +1,95 @@ + + + + + AudioFormat Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat Members +

    +
    +
    +
    +

    + AudioFormat overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + AudioFormat Constructor + Initializes a new instance of the AudioFormat class.
    +
    +

    Public Instance Fields

    + +

    Public Instance Properties

    + +

    Public Instance Methods

    +
    + + + + +
    Equals (inherited from ValueType) + Indicates whether this instance and a specified object are equal. +
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from ValueType) + Returns the fully qualified type name of this instance. +
    +
    +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatProperties.html new file mode 100644 index 0000000..f1ab46a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.AudioFormatProperties.html @@ -0,0 +1,52 @@ + + + + + AudioFormat Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    AudioFormat Properties

    +
    +
    +
    +

    The properties of the AudioFormat structure are listed below. For a complete list of AudioFormat structure members, see the AudioFormat Members topic.

    +

    Public Instance Properties

    + +

    See Also

    +

    + AudioFormat Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarder.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarder.html new file mode 100644 index 0000000..a112477 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarder.html @@ -0,0 +1,67 @@ + + + + + EventForwarder Structure + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    EventForwarder Structure

    +
    +
    +
    +

    Internal class, do not use.

    +

    For a list of all members of this type, see EventForwarder Members.

    +

    + System.Object +
       System.ValueType
          IrrKlang.EventForwarder

    +
    + [Visual Basic] +
    Public Structure EventForwarder
    +
    + [C#] +
    public struct EventForwarder
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + EventForwarder Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarderMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarderMembers.html new file mode 100644 index 0000000..d834fae --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.EventForwarderMembers.html @@ -0,0 +1,67 @@ + + + + + EventForwarder Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    EventForwarder Members +

    +
    +
    +
    +

    + EventForwarder overview +

    +

    Public Instance Methods

    +
    + + + + +
    Equals (inherited from ValueType) + Indicates whether this instance and a specified object are equal. +
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from ValueType) + Returns the fully qualified type name of this instance. +
    +
    +

    See Also

    +

    + EventForwarder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarder.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarder.html new file mode 100644 index 0000000..e7b6821 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarder.html @@ -0,0 +1,67 @@ + + + + + FileFactoryForwarder Structure + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    FileFactoryForwarder Structure

    +
    +
    +
    +

    Internal class, do not use.

    +

    For a list of all members of this type, see FileFactoryForwarder Members.

    +

    + System.Object +
       System.ValueType
          IrrKlang.FileFactoryForwarder

    +
    + [Visual Basic] +
    Public Structure FileFactoryForwarder
    +
    + [C#] +
    public struct FileFactoryForwarder
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + FileFactoryForwarder Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarderMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarderMembers.html new file mode 100644 index 0000000..2026967 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.FileFactoryForwarderMembers.html @@ -0,0 +1,67 @@ + + + + + FileFactoryForwarder Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    FileFactoryForwarder Members +

    +
    +
    +
    +

    + FileFactoryForwarder overview +

    +

    Public Instance Methods

    +
    + + + + +
    Equals (inherited from ValueType) + Indicates whether this instance and a specified object are equal. +
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from ValueType) + Returns the fully qualified type name of this instance. +
    +
    +

    See Also

    +

    + FileFactoryForwarder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AddSoundSourceFromRecordedAudio.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AddSoundSourceFromRecordedAudio.html new file mode 100644 index 0000000..220ed70 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AddSoundSourceFromRecordedAudio.html @@ -0,0 +1,54 @@ + + + + + IAudioRecorder.AddSoundSourceFromRecordedAudio Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.AddSoundSourceFromRecordedAudio Method 

    +
    +
    +
    +

    Creates a sound source for the recorded audio data, so that it can be played back. Only works after calling stopRecordingAudio().

    +
    + [Visual Basic] +
    Public Function AddSoundSourceFromRecordedAudio( _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromRecordedAudio(
       string soundName
    );
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AudioFormat.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AudioFormat.html new file mode 100644 index 0000000..08067f9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.AudioFormat.html @@ -0,0 +1,56 @@ + + + + + AudioFormat Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.AudioFormat Property

    +
    +
    +
    +

    Returns the audio format of the recorded audio data. Also contains informations about the length of the recorded audio stream.

    +
    + [Visual Basic] +
    Public ReadOnly Property AudioFormat As AudioFormat
    +
    + [C#] +
    public AudioFormat AudioFormat {get;}
    +

    +

    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.ClearRecordedAudioDataBuffer.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.ClearRecordedAudioDataBuffer.html new file mode 100644 index 0000000..994a3c1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.ClearRecordedAudioDataBuffer.html @@ -0,0 +1,54 @@ + + + + + IAudioRecorder.ClearRecordedAudioDataBuffer Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.ClearRecordedAudioDataBuffer Method 

    +
    +
    +
    +

    Clears recorded audio data buffer, freeing memory. This method will only succeed if audio recording is currently stopped.

    +
    + [Visual Basic] +
    Public Sub ClearRecordedAudioDataBuffer()
    +
    + [C#] +
    public void ClearRecordedAudioDataBuffer();
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.Finalize.html new file mode 100644 index 0000000..fe25583 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.Finalize.html @@ -0,0 +1,54 @@ + + + + + IAudioRecorder.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.IsRecording.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.IsRecording.html new file mode 100644 index 0000000..b4954c5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.IsRecording.html @@ -0,0 +1,56 @@ + + + + + IsRecording Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.IsRecording Property

    +
    +
    +
    +

    Returns if the recorder is currently recording audio.

    +
    + [Visual Basic] +
    Public ReadOnly Property IsRecording As Boolean
    +
    + [C#] +
    public bool IsRecording {get;}
    +

    +

    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.RecordedAudioData.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.RecordedAudioData.html new file mode 100644 index 0000000..100bf45 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.RecordedAudioData.html @@ -0,0 +1,57 @@ + + + + + RecordedAudioData Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.RecordedAudioData Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property RecordedAudioData As Byte()
    +
    + [C#] +
    public byte[] RecordedAudioData {get;}
    +

    +

    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_1.html new file mode 100644 index 0000000..2f03695 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_1.html @@ -0,0 +1,55 @@ + + + + + IAudioRecorder.StartRecordingBufferedAudio Method (Int32, SampleFormat, Int32) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.StartRecordingBufferedAudio Method (Int32, SampleFormat, Int32)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Function StartRecordingBufferedAudio( _
       ByVal sampleRate As Integer, _
       ByVal sampleFormat As SampleFormat, _
       ByVal channelCount As Integer _
    ) As Boolean
    +
    + [C#] +
    public bool StartRecordingBufferedAudio(
       int sampleRate,
       SampleFormat sampleFormat,
       int channelCount
    );
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace | IAudioRecorder.StartRecordingBufferedAudio Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_2.html new file mode 100644 index 0000000..cf4c7e4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_2.html @@ -0,0 +1,54 @@ + + + + + IAudioRecorder.StartRecordingBufferedAudio Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.StartRecordingBufferedAudio Method ()

    +
    +
    +
    +

    Starts recording audio.

    +
    + [Visual Basic] +
    Overloads Public Function StartRecordingBufferedAudio() As Boolean
    +
    + [C#] +
    public bool StartRecordingBufferedAudio();
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace | IAudioRecorder.StartRecordingBufferedAudio Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overloads.html new file mode 100644 index 0000000..889bbf6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overloads.html @@ -0,0 +1,49 @@ + + + + + StartRecordingBufferedAudio Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.StartRecordingBufferedAudio Method

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StopRecordingAudio.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StopRecordingAudio.html new file mode 100644 index 0000000..4d4c00c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.StopRecordingAudio.html @@ -0,0 +1,54 @@ + + + + + IAudioRecorder.StopRecordingAudio Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder.StopRecordingAudio Method 

    +
    +
    +
    +

    Stops recording audio.

    +
    + [Visual Basic] +
    Public Sub StopRecordingAudio()
    +
    + [C#] +
    public void StopRecordingAudio();
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.html new file mode 100644 index 0000000..abaaf10 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorder.html @@ -0,0 +1,67 @@ + + + + + IAudioRecorder Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Class

    +
    +
    +
    +

    Interface to an audio recorder.

    +

    For a list of all members of this type, see IAudioRecorder Members.

    +

    + System.Object +
       IrrKlang.IAudioRecorder

    +
    + [Visual Basic] +
    Public Class IAudioRecorder
    +
    + [C#] +
    public class IAudioRecorder
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IAudioRecorder Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor.html new file mode 100644 index 0000000..ede36ea --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor.html @@ -0,0 +1,58 @@ + + + + + IAudioRecorder Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Constructor

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor1.html new file mode 100644 index 0000000..f05854d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor1.html @@ -0,0 +1,47 @@ + + + + + IAudioRecorder Constructor (ISoundEngine, SoundOutputDriver, String) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Constructor (ISoundEngine, SoundOutputDriver, String)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal engine As ISoundEngine, _
       ByVal driver As SoundOutputDriver, _
       ByVal deviceID As String _
    )
    +
    + [C#] +
    public IAudioRecorder(
       ISoundEngine engine,
       SoundOutputDriver driver,
       string deviceID
    );
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace | IAudioRecorder Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor2.html new file mode 100644 index 0000000..acb8f57 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor2.html @@ -0,0 +1,47 @@ + + + + + IAudioRecorder Constructor (ISoundEngine, SoundOutputDriver) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Constructor (ISoundEngine, SoundOutputDriver)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal engine As ISoundEngine, _
       ByVal driver As SoundOutputDriver _
    )
    +
    + [C#] +
    public IAudioRecorder(
       ISoundEngine engine,
       SoundOutputDriver driver
    );
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace | IAudioRecorder Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor3.html new file mode 100644 index 0000000..0283e17 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderConstructor3.html @@ -0,0 +1,47 @@ + + + + + IAudioRecorder Constructor (ISoundEngine) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Constructor (ISoundEngine)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal engine As ISoundEngine _
    )
    +
    + [C#] +
    public IAudioRecorder(
       ISoundEngine engine
    );
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace | IAudioRecorder Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMembers.html new file mode 100644 index 0000000..83847af --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMembers.html @@ -0,0 +1,98 @@ + + + + + IAudioRecorder Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Members +

    +
    +
    +
    +

    + IAudioRecorder overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + IAudioRecorder + Overloaded. Initializes a new instance of the IAudioRecorder class.
    +
    +

    Public Instance Properties

    +
    + + + +
    AudioFormat Returns the audio format of the recorded audio data. Also contains informations about the length of the recorded audio stream.
    IsRecording Returns if the recorder is currently recording audio.
    RecordedAudioData 
    +
    +

    Public Instance Methods

    +
    + + + + + + + + +
    AddSoundSourceFromRecordedAudio Creates a sound source for the recorded audio data, so that it can be played back. Only works after calling stopRecordingAudio().
    ClearRecordedAudioDataBuffer Clears recorded audio data buffer, freeing memory. This method will only succeed if audio recording is currently stopped.
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    StartRecordingBufferedAudioOverloaded.  
    StopRecordingAudio Stops recording audio.
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMethods.html new file mode 100644 index 0000000..55b0ed0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderMethods.html @@ -0,0 +1,72 @@ + + + + + IAudioRecorder Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Methods

    +
    +
    +
    +

    The methods of the IAudioRecorder class are listed below. For a complete list of IAudioRecorder class members, see the IAudioRecorder Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + + +
    AddSoundSourceFromRecordedAudio Creates a sound source for the recorded audio data, so that it can be played back. Only works after calling stopRecordingAudio().
    ClearRecordedAudioDataBuffer Clears recorded audio data buffer, freeing memory. This method will only succeed if audio recording is currently stopped.
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    StartRecordingBufferedAudioOverloaded.  
    StopRecordingAudio Stops recording audio.
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderProperties.html new file mode 100644 index 0000000..eb04fbf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IAudioRecorderProperties.html @@ -0,0 +1,51 @@ + + + + + IAudioRecorder Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IAudioRecorder Properties

    +
    +
    +
    +

    The properties of the IAudioRecorder class are listed below. For a complete list of IAudioRecorder class members, see the IAudioRecorder Members topic.

    +

    Public Instance Properties

    +
    + + + +
    AudioFormat Returns the audio format of the recorded audio data. Also contains informations about the length of the recorded audio stream.
    IsRecording Returns if the recorder is currently recording audio.
    RecordedAudioData 
    +
    +

    See Also

    +

    + IAudioRecorder Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.html new file mode 100644 index 0000000..eb4b69e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.html @@ -0,0 +1,62 @@ + + + + + IFileFactory Interface + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IFileFactory Interface

    +
    +
    +
    +

    Interface to overwrite opening files. Derive your own class from IFileFactory, overwrite the openFile() method and return your own System::IO::Stream to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.

    +

    For a list of all members of this type, see IFileFactory Members.

    +

    +

    +
    + [Visual Basic] +
    Public Interface IFileFactory
    +
    + [C#] +
    public interface IFileFactory
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IFileFactory Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.openFile.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.openFile.html new file mode 100644 index 0000000..7dd0621 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactory.openFile.html @@ -0,0 +1,55 @@ + + + + + IFileFactory.openFile Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IFileFactory.openFile Method 

    +
    +
    +
    +

    Opens a file for read access. Derive your own class from IFileFactory, overwrite this method and return your own System::IO::Stream to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.

    +
    + [Visual Basic] +
    Function openFile( _
       ByVal filename As String _
    ) As Stream
    +
    + [C#] +
    + Stream openFile(
       string filename
    );
    +

    See Also

    +

    + IFileFactory Interface | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMembers.html new file mode 100644 index 0000000..9de7a72 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMembers.html @@ -0,0 +1,56 @@ + + + + + IFileFactory Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IFileFactory Members +

    +
    +
    +
    +

    + IFileFactory overview +

    +

    Public Instance Methods

    +
    + +
    openFile Opens a file for read access. Derive your own class from IFileFactory, overwrite this method and return your own System::IO::Stream to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.
    +
    +

    See Also

    +

    + IFileFactory Interface | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMethods.html new file mode 100644 index 0000000..618acc5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.IFileFactoryMethods.html @@ -0,0 +1,49 @@ + + + + + IFileFactory Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IFileFactory Methods

    +
    +
    +
    +

    The methods of the IFileFactory interface are listed below. For a complete list of IFileFactory interface members, see the IFileFactory Members topic.

    +

    Public Instance Methods

    +
    + +
    openFile Opens a file for read access. Derive your own class from IFileFactory, overwrite this method and return your own System::IO::Stream to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.
    +
    +

    See Also

    +

    + IFileFactory Interface | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Dispose.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Dispose.html new file mode 100644 index 0000000..6766dad --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Dispose.html @@ -0,0 +1,59 @@ + + + + + ISound.Dispose Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Dispose Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overrides Public Sub Dispose() _
        Implements IDisposable.Dispose
    +
    + [C#] +
    public override void Dispose();
    +

    Implements

    +

    + IDisposable.Dispose +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finalize.html new file mode 100644 index 0000000..7880e7c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finalize.html @@ -0,0 +1,54 @@ + + + + + ISound.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finished.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finished.html new file mode 100644 index 0000000..a8eacc1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Finished.html @@ -0,0 +1,56 @@ + + + + + Finished Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Finished Property

    +
    +
    +
    +

    returns if the sound has finished playing. Don't mix this up with isPaused(). isFinished() returns if the sound has been finished playing. If it has, is maybe already have been removed from the playing list of the sound engine and calls to any other of the methods of ISound will not have any result. If you call stop() to a playing sound will result that this function will return true when invoked.

    +
    + [Visual Basic] +
    Public ReadOnly Property Finished As Boolean
    +
    + [C#] +
    public bool Finished {get;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Looped.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Looped.html new file mode 100644 index 0000000..d5b8a0d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Looped.html @@ -0,0 +1,56 @@ + + + + + Looped Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Looped Property

    +
    +
    +
    +

    gets or sets if the sound has been started to play looped. If the sound is playing looped and it is changed to not-looped, then it will stop playing after the loop has finished. If it is not looped and changed to looped, the sound will start repeating to be played when it reaches its end. Invoking this method will not have an effect when the sound already has stopped.

    +
    + [Visual Basic] +
    Public Property Looped As Boolean
    +
    + [C#] +
    public bool Looped {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MaxDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MaxDistance.html new file mode 100644 index 0000000..883f52a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MaxDistance.html @@ -0,0 +1,56 @@ + + + + + MaxDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.MaxDistance Property

    +
    +
    +
    +

    Sets the maximal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.

    +
    + [Visual Basic] +
    Public Property MaxDistance As Single
    +
    + [C#] +
    public float MaxDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MinDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MinDistance.html new file mode 100644 index 0000000..ab2a728 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.MinDistance.html @@ -0,0 +1,56 @@ + + + + + MinDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.MinDistance Property

    +
    +
    +
    +

    Sets the minimal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.

    +
    + [Visual Basic] +
    Public Property MinDistance As Single
    +
    + [C#] +
    public float MinDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Pan.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Pan.html new file mode 100644 index 0000000..1da8d35 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Pan.html @@ -0,0 +1,56 @@ + + + + + Pan Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Pan Property

    +
    +
    +
    +

    sets the pan of the sound. Takes a value between -1 and 1, 0 is center.

    +
    + [Visual Basic] +
    Public Property Pan As Single
    +
    + [C#] +
    public float Pan {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Paused.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Paused.html new file mode 100644 index 0000000..d55a25e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Paused.html @@ -0,0 +1,56 @@ + + + + + Paused Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Paused Property

    +
    +
    +
    +

    returns if the sound is paused

    +
    + [Visual Basic] +
    Public Property Paused As Boolean
    +
    + [C#] +
    public bool Paused {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayLength.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayLength.html new file mode 100644 index 0000000..ab35078 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayLength.html @@ -0,0 +1,56 @@ + + + + + PlayLength Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.PlayLength Property

    +
    +
    +
    +

    Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support length reporting or it is a file stream of unknown size. Note: You can also use ISoundSource::getPlayLength() to get the length of a sound without actually needing to play it.

    +
    + [Visual Basic] +
    Public ReadOnly Property PlayLength As UInt32
    +
    + [C#] +
    public uint PlayLength {get;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayPosition.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayPosition.html new file mode 100644 index 0000000..e7b3297 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlayPosition.html @@ -0,0 +1,56 @@ + + + + + PlayPosition Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.PlayPosition Property

    +
    +
    +
    +

    returns or sets the current play position of the sound in milliseconds. Returns -1 if not implemented or possible for this sound for example because it already has been stopped and freed internally or similar.

    +
    + [Visual Basic] +
    Public Property PlayPosition As UInt32
    +
    + [C#] +
    public uint PlayPosition {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlaybackSpeed.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlaybackSpeed.html new file mode 100644 index 0000000..441cf8c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.PlaybackSpeed.html @@ -0,0 +1,59 @@ + + + + + PlaybackSpeed Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.PlaybackSpeed Property

    +
    +
    +
    +

    Sets or gets the playback speed (frequency) of the sound. Plays the sound at a higher or lower speed, increasing or decreasing its frequency which makes it sound lower or higher. Note that this feature is not available on all sound output drivers (it is on the DirectSound drivers at least), and it does not work together with the 'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when using DirectSound.

    +
    + [Visual Basic] +
    Public Property PlaybackSpeed As Single
    +
    + [C#] +
    public float PlaybackSpeed {get; set;}
    +

    +

    +

    Parameters

    +
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Position.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Position.html new file mode 100644 index 0000000..0cddf56 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Position.html @@ -0,0 +1,56 @@ + + + + + Position Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Position Property

    +
    +
    +
    +

    sets the position of the sound in 3d space

    +
    + [Visual Basic] +
    Public Property Position As Vector3D
    +
    + [C#] +
    public Vector3D Position {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.SoundEffectControl.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.SoundEffectControl.html new file mode 100644 index 0000000..1be2907 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.SoundEffectControl.html @@ -0,0 +1,56 @@ + + + + + SoundEffectControl Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.SoundEffectControl Property

    +
    +
    +
    +

    Returns the sound effect control interface for this sound. Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can be controlled using this. This can be null if the sound has not been started with the flag 'enableSoundEffects' or the driver doesn't support effects.

    +
    + [Visual Basic] +
    Public ReadOnly Property SoundEffectControl As ISoundEffectControl
    +
    + [C#] +
    public ISoundEffectControl SoundEffectControl {get;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Stop.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Stop.html new file mode 100644 index 0000000..8f33317 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Stop.html @@ -0,0 +1,55 @@ + + + + + ISound.Stop Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Stop Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Sub Stop()
    +
    + [C#] +
    public void Stop();
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Velocity.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Velocity.html new file mode 100644 index 0000000..bce63b9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Velocity.html @@ -0,0 +1,56 @@ + + + + + Velocity Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Velocity Property

    +
    +
    +
    +

    sets or returns the velocity of the sound in 3d space, needed for Doppler effects. To use doppler effects use ISound::setVelocity to set a sounds velocity, ISoundEngine::setListenerPosition() to set the listeners velocity and ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing the doppler effects intensity.

    +
    + [Visual Basic] +
    Public Property Velocity As Vector3D
    +
    + [C#] +
    public Vector3D Velocity {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Volume.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Volume.html new file mode 100644 index 0000000..05ca45b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.Volume.html @@ -0,0 +1,56 @@ + + + + + Volume Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.Volume Property

    +
    +
    +
    +

    returns volume of the sound, a value between 0 (mute) and 1 (full volume). (this volume gets multiplied with the master volume of the sound engine and other parameters like distance to listener when played as 3d sound)

    +
    + [Visual Basic] +
    Public Property Volume As Single
    +
    + [C#] +
    public float Volume {get; set;}
    +

    +

    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.html new file mode 100644 index 0000000..2522db0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.html @@ -0,0 +1,67 @@ + + + + + ISound Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound Class

    +
    +
    +
    +

    Represents a sound which is currently played. You can stop the sound or change the volume or whatever using this interface. Don't create sounds using new ISound, this won't work anyway. You can get an instance of an ISonud class by calling ISoundEngine::Play2D or Play3D.

    +

    For a list of all members of this type, see ISound Members.

    +

    + System.Object +
       IrrKlang.ISound

    +
    + [Visual Basic] +
    Public Class ISound
        Implements IDisposable
    +
    + [C#] +
    public class ISound : IDisposable
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISound Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_1.html new file mode 100644 index 0000000..ffc6608 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_1.html @@ -0,0 +1,62 @@ + + + + + ISound.setSoundStopEventReceiver Method (ISoundStopEventReceiver) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.setSoundStopEventReceiver Method (ISoundStopEventReceiver)

    +
    +
    +
    +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +
    + [Visual Basic] +
    Overloads Public Sub setSoundStopEventReceiver( _
       ByVal reciever As ISoundStopEventReceiver _
    )
    +
    + [C#] +
    public void setSoundStopEventReceiver(
       ISoundStopEventReceiver reciever
    );
    +

    Parameters

    +
    +
    + reciever +
    +
    +
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace | ISound.setSoundStopEventReceiver Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_2.html new file mode 100644 index 0000000..dbdceeb --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overload_2.html @@ -0,0 +1,66 @@ + + + + + ISound.setSoundStopEventReceiver Method (ISoundStopEventReceiver, Object) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.setSoundStopEventReceiver Method (ISoundStopEventReceiver, Object)

    +
    +
    +
    +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +
    + [Visual Basic] +
    Overloads Public Sub setSoundStopEventReceiver( _
       ByVal reciever As ISoundStopEventReceiver, _
       ByVal userData As Object _
    )
    +
    + [C#] +
    public void setSoundStopEventReceiver(
       ISoundStopEventReceiver reciever,
       object userData
    );
    +

    Parameters

    +
    +
    + reciever +
    +
    +
    +
    + userData +
    +
    A user data object, can be null
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace | ISound.setSoundStopEventReceiver Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overloads.html new file mode 100644 index 0000000..3d08360 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISound.setSoundStopEventReceiver_overloads.html @@ -0,0 +1,49 @@ + + + + + setSoundStopEventReceiver Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound.setSoundStopEventReceiver Method

    +
    +
    +
    +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +

    Overload List

    +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +
    + public void setSoundStopEventReceiver(ISoundStopEventReceiver); +
    +

    Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.

    +
    + public void setSoundStopEventReceiver(ISoundStopEventReceiver,object); +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundConstructor.html new file mode 100644 index 0000000..d70389a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundConstructor.html @@ -0,0 +1,51 @@ + + + + + ISound Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound Constructor 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Sub New( _
       ByVal nativeSound As ISound*, _
       ByVal nativeEngine As ISoundEngine* _
    )
    +
    + [C#] +
    public ISound(
       ISound* nativeSound,
       ISoundEngine* nativeEngine
    );
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.DeviceCount.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.DeviceCount.html new file mode 100644 index 0000000..d8dc05c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.DeviceCount.html @@ -0,0 +1,56 @@ + + + + + DeviceCount Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList.DeviceCount Property

    +
    +
    +
    +

    returns amount of enumerated devices in the list

    +
    + [Visual Basic] +
    Public ReadOnly Property DeviceCount As Integer
    +
    + [C#] +
    public int DeviceCount {get;}
    +

    +

    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.Finalize.html new file mode 100644 index 0000000..3b4840d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.Finalize.html @@ -0,0 +1,54 @@ + + + + + ISoundDeviceList.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceDescription.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceDescription.html new file mode 100644 index 0000000..0933ba0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceDescription.html @@ -0,0 +1,54 @@ + + + + + ISoundDeviceList.getDeviceDescription Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList.getDeviceDescription Method 

    +
    +
    +
    +

    returns description of the device. Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.

    +
    + [Visual Basic] +
    Public Function getDeviceDescription( _
       ByVal index As Integer _
    ) As String
    +
    + [C#] +
    public string getDeviceDescription(
       int index
    );
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceID.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceID.html new file mode 100644 index 0000000..e649625 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.getDeviceID.html @@ -0,0 +1,55 @@ + + + + + ISoundDeviceList.getDeviceID Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList.getDeviceID Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Function getDeviceID( _
       ByVal index As Integer _
    ) As String
    +
    + [C#] +
    public string getDeviceID(
       int index
    );
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.html new file mode 100644 index 0000000..719e07f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceList.html @@ -0,0 +1,67 @@ + + + + + ISoundDeviceList Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Class

    +
    +
    +
    +

    A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. The function createIrrKlangDevice() has a parameter 'deviceID' which takes the value returned by ISoundDeviceList::getDeviceID() and uses that device then. The list of devices in ISoundDeviceList usually also includes the default device which is the first entry and has an empty deviceID string ("") and the description "default device".*/

    +

    For a list of all members of this type, see ISoundDeviceList Members.

    +

    + System.Object +
       IrrKlang.ISoundDeviceList

    +
    + [Visual Basic] +
    Public Class ISoundDeviceList
    +
    + [C#] +
    public class ISoundDeviceList
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISoundDeviceList Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor.html new file mode 100644 index 0000000..b4152cd --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor.html @@ -0,0 +1,54 @@ + + + + + ISoundDeviceList Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Constructor

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor1.html new file mode 100644 index 0000000..c722a33 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor1.html @@ -0,0 +1,47 @@ + + + + + ISoundDeviceList Constructor (SoundDeviceListType, SoundOutputDriver) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Constructor (SoundDeviceListType, SoundOutputDriver)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal type As SoundDeviceListType, _
       ByVal driver As SoundOutputDriver _
    )
    +
    + [C#] +
    public ISoundDeviceList(
       SoundDeviceListType type,
       SoundOutputDriver driver
    );
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace | ISoundDeviceList Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor2.html new file mode 100644 index 0000000..e2053f7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListConstructor2.html @@ -0,0 +1,47 @@ + + + + + ISoundDeviceList Constructor (SoundDeviceListType) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Constructor (SoundDeviceListType)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal type As SoundDeviceListType _
    )
    +
    + [C#] +
    public ISoundDeviceList(
       SoundDeviceListType type
    );
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace | ISoundDeviceList Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMembers.html new file mode 100644 index 0000000..ad8e2cd --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMembers.html @@ -0,0 +1,94 @@ + + + + + ISoundDeviceList Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Members +

    +
    +
    +
    +

    + ISoundDeviceList overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + ISoundDeviceList + Overloaded. Initializes a new instance of the ISoundDeviceList class.
    +
    +

    Public Instance Properties

    +
    + +
    DeviceCount returns amount of enumerated devices in the list
    +
    +

    Public Instance Methods

    +
    + + + + + + +
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    getDeviceDescription returns description of the device. Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.
    getDeviceID 
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMethods.html new file mode 100644 index 0000000..267e41c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListMethods.html @@ -0,0 +1,70 @@ + + + + + ISoundDeviceList Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Methods

    +
    +
    +
    +

    The methods of the ISoundDeviceList class are listed below. For a complete list of ISoundDeviceList class members, see the ISoundDeviceList Members topic.

    +

    Public Instance Methods

    +
    + + + + + + +
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    getDeviceDescription returns description of the device. Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1.
    getDeviceID 
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListProperties.html new file mode 100644 index 0000000..3915763 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundDeviceListProperties.html @@ -0,0 +1,49 @@ + + + + + ISoundDeviceList Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundDeviceList Properties

    +
    +
    +
    +

    The properties of the ISoundDeviceList class are listed below. For a complete list of ISoundDeviceList class members, see the ISoundDeviceList Members topic.

    +

    Public Instance Properties

    +
    + +
    DeviceCount returns amount of enumerated devices in the list
    +
    +

    See Also

    +

    + ISoundDeviceList Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableAllEffects.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableAllEffects.html new file mode 100644 index 0000000..8e1a2dc --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableAllEffects.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableAllEffects Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableAllEffects Method 

    +
    +
    +
    +

    Disables all active sound effects.

    +
    + [Visual Basic] +
    Public Sub DisableAllEffects()
    +
    + [C#] +
    public void DisableAllEffects();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableChorusSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableChorusSoundEffect.html new file mode 100644 index 0000000..e24c899 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableChorusSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableChorusSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableChorusSoundEffect Method 

    +
    +
    +
    +

    Disables the Chorus sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableChorusSoundEffect()
    +
    + [C#] +
    public void DisableChorusSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableCompressorSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableCompressorSoundEffect.html new file mode 100644 index 0000000..45de1a6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableCompressorSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableCompressorSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableCompressorSoundEffect Method 

    +
    +
    +
    +

    Disables the Compressor sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableCompressorSoundEffect()
    +
    + [C#] +
    public void DisableCompressorSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableDistortionSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableDistortionSoundEffect.html new file mode 100644 index 0000000..724d770 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableDistortionSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableDistortionSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableDistortionSoundEffect Method 

    +
    +
    +
    +

    Disables the Distortion sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableDistortionSoundEffect()
    +
    + [C#] +
    public void DisableDistortionSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableEchoSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableEchoSoundEffect.html new file mode 100644 index 0000000..46ec536 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableEchoSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableEchoSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableEchoSoundEffect Method 

    +
    +
    +
    +

    Disables the Echo sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableEchoSoundEffect()
    +
    + [C#] +
    public void DisableEchoSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableFlangerSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableFlangerSoundEffect.html new file mode 100644 index 0000000..42b72d7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableFlangerSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableFlangerSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableFlangerSoundEffect Method 

    +
    +
    +
    +

    Disables the Flanger sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableFlangerSoundEffect()
    +
    + [C#] +
    public void DisableFlangerSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableGargleSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableGargleSoundEffect.html new file mode 100644 index 0000000..e7a21f7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableGargleSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableGargleSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableGargleSoundEffect Method 

    +
    +
    +
    +

    Disables the Gargle sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableGargleSoundEffect()
    +
    + [C#] +
    public void DisableGargleSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableI3DL2ReverbSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableI3DL2ReverbSoundEffect.html new file mode 100644 index 0000000..b403fdc --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableI3DL2ReverbSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableI3DL2ReverbSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableI3DL2ReverbSoundEffect Method 

    +
    +
    +
    +

    Disables the I3DL2 sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableI3DL2ReverbSoundEffect()
    +
    + [C#] +
    public void DisableI3DL2ReverbSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableParamEqSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableParamEqSoundEffect.html new file mode 100644 index 0000000..fc6fe7d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableParamEqSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableParamEqSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableParamEqSoundEffect Method 

    +
    +
    +
    +

    Disables the ParamEq sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableParamEqSoundEffect()
    +
    + [C#] +
    public void DisableParamEqSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableWavesReverbSoundEffect.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableWavesReverbSoundEffect.html new file mode 100644 index 0000000..6917872 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.DisableWavesReverbSoundEffect.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.DisableWavesReverbSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.DisableWavesReverbSoundEffect Method 

    +
    +
    +
    +

    Disable the WavesReverb sound effect.

    +
    + [Visual Basic] +
    Public Sub DisableWavesReverbSoundEffect()
    +
    + [C#] +
    public void DisableWavesReverbSoundEffect();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_1.html new file mode 100644 index 0000000..cc3d167 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableChorusSoundEffect Method (Single, Single, Single, Single, Boolean, Single, Int32) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableChorusSoundEffect Method (Single, Single, Single, Single, Boolean, Single, Int32)

    +
    +
    +
    +

    Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableChorusSoundEffect( _
       ByVal fWetDryMix As Single, _
       ByVal fDepth As Single, _
       ByVal fFeedback As Single, _
       ByVal fFrequency As Single, _
       ByVal sinusWaveForm As Boolean, _
       ByVal fDelay As Single, _
       ByVal lPhase As Integer _
    ) As Boolean
    +
    + [C#] +
    public bool EnableChorusSoundEffect(
       float fWetDryMix,
       float fDepth,
       float fFeedback,
       float fFrequency,
       bool sinusWaveForm,
       float fDelay,
       int lPhase
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableChorusSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_2.html new file mode 100644 index 0000000..9a83619 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableChorusSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableChorusSoundEffect Method ()

    +
    +
    +
    +

    Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableChorusSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableChorusSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableChorusSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overloads.html new file mode 100644 index 0000000..65020da --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableChorusSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableChorusSoundEffect Method

    +
    +
    +
    +

    Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableChorusSoundEffect(); +
    +

    Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableChorusSoundEffect(float,float,float,float,bool,float,int); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_1.html new file mode 100644 index 0000000..b9596a4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableCompressorSoundEffect Method (Single, Single, Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableCompressorSoundEffect Method (Single, Single, Single, Single, Single, Single)

    +
    +
    +
    +

    Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.

    +
    + [Visual Basic] +
    Overloads Public Function EnableCompressorSoundEffect( _
       ByVal fGain As Single, _
       ByVal fAttack As Single, _
       ByVal fRelease As Single, _
       ByVal fThreshold As Single, _
       ByVal fRatio As Single, _
       ByVal fPredelay As Single _
    ) As Boolean
    +
    + [C#] +
    public bool EnableCompressorSoundEffect(
       float fGain,
       float fAttack,
       float fRelease,
       float fThreshold,
       float fRatio,
       float fPredelay
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableCompressorSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_2.html new file mode 100644 index 0000000..91d1c40 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableCompressorSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableCompressorSoundEffect Method ()

    +
    +
    +
    +

    Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.

    +
    + [Visual Basic] +
    Overloads Public Function EnableCompressorSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableCompressorSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableCompressorSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overloads.html new file mode 100644 index 0000000..8d649a6 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableCompressorSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableCompressorSoundEffect Method

    +
    +
    +
    +

    Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.

    +

    Overload List

    +

    Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.

    +
    + public bool EnableCompressorSoundEffect(); +
    +

    Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.

    +
    + public bool EnableCompressorSoundEffect(float,float,float,float,float,float); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_1.html new file mode 100644 index 0000000..9d881d1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableDistortionSoundEffect Method (Single, Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableDistortionSoundEffect Method (Single, Single, Single, Single, Single)

    +
    +
    +
    +

    Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableDistortionSoundEffect( _
       ByVal fGain As Single, _
       ByVal fEdge As Single, _
       ByVal fPostEQCenterFrequency As Single, _
       ByVal fPostEQBandwidth As Single, _
       ByVal fPreLowpassCutoff As Single _
    ) As Boolean
    +
    + [C#] +
    public bool EnableDistortionSoundEffect(
       float fGain,
       float fEdge,
       float fPostEQCenterFrequency,
       float fPostEQBandwidth,
       float fPreLowpassCutoff
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableDistortionSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_2.html new file mode 100644 index 0000000..981b662 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableDistortionSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableDistortionSoundEffect Method ()

    +
    +
    +
    +

    Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableDistortionSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableDistortionSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableDistortionSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overloads.html new file mode 100644 index 0000000..ca5cf59 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableDistortionSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableDistortionSoundEffect Method

    +
    +
    +
    +

    Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableDistortionSoundEffect(); +
    +

    Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableDistortionSoundEffect(float,float,float,float,float); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_1.html new file mode 100644 index 0000000..1428817 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableEchoSoundEffect Method (Single, Single, Single, Single, Int32) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableEchoSoundEffect Method (Single, Single, Single, Single, Int32)

    +
    +
    +
    +

    Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableEchoSoundEffect( _
       ByVal fWetDryMix As Single, _
       ByVal fFeedback As Single, _
       ByVal fLeftDelay As Single, _
       ByVal fRightDelay As Single, _
       ByVal lPanDelay As Integer _
    ) As Boolean
    +
    + [C#] +
    public bool EnableEchoSoundEffect(
       float fWetDryMix,
       float fFeedback,
       float fLeftDelay,
       float fRightDelay,
       int lPanDelay
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableEchoSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_2.html new file mode 100644 index 0000000..37470ef --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableEchoSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableEchoSoundEffect Method ()

    +
    +
    +
    +

    Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableEchoSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableEchoSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableEchoSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overloads.html new file mode 100644 index 0000000..3ea9f80 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableEchoSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableEchoSoundEffect Method

    +
    +
    +
    +

    Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableEchoSoundEffect(); +
    +

    Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableEchoSoundEffect(float,float,float,float,int); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_1.html new file mode 100644 index 0000000..7b68935 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableFlangerSoundEffect Method (Single, Single, Single, Single, Boolean, Single, Int32) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableFlangerSoundEffect Method (Single, Single, Single, Single, Boolean, Single, Int32)

    +
    +
    +
    +

    Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.

    +
    + [Visual Basic] +
    Overloads Public Function EnableFlangerSoundEffect( _
       ByVal fWetDryMix As Single, _
       ByVal fDepth As Single, _
       ByVal fFeedback As Single, _
       ByVal fFrequency As Single, _
       ByVal triangleWaveForm As Boolean, _
       ByVal fDelay As Single, _
       ByVal lPhase As Integer _
    ) As Boolean
    +
    + [C#] +
    public bool EnableFlangerSoundEffect(
       float fWetDryMix,
       float fDepth,
       float fFeedback,
       float fFrequency,
       bool triangleWaveForm,
       float fDelay,
       int lPhase
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableFlangerSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_2.html new file mode 100644 index 0000000..3e7c9a9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableFlangerSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableFlangerSoundEffect Method ()

    +
    +
    +
    +

    Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.

    +
    + [Visual Basic] +
    Overloads Public Function EnableFlangerSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableFlangerSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableFlangerSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overloads.html new file mode 100644 index 0000000..d321405 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableFlangerSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableFlangerSoundEffect Method

    +
    +
    +
    +

    Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.

    +

    Overload List

    +

    Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.

    +
    + public bool EnableFlangerSoundEffect(); +
    +

    Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.

    +
    + public bool EnableFlangerSoundEffect(float,float,float,float,bool,float,int); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_1.html new file mode 100644 index 0000000..56b95b2 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableGargleSoundEffect Method (Int32, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableGargleSoundEffect Method (Int32, Boolean)

    +
    +
    +
    +

    Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.

    +
    + [Visual Basic] +
    Overloads Public Function EnableGargleSoundEffect( _
       ByVal rateHz As Integer, _
       ByVal sinusWaveForm As Boolean _
    ) As Boolean
    +
    + [C#] +
    public bool EnableGargleSoundEffect(
       int rateHz,
       bool sinusWaveForm
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableGargleSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_2.html new file mode 100644 index 0000000..a317d9e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableGargleSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableGargleSoundEffect Method ()

    +
    +
    +
    +

    Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.

    +
    + [Visual Basic] +
    Overloads Public Function EnableGargleSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableGargleSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableGargleSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overloads.html new file mode 100644 index 0000000..563d395 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableGargleSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableGargleSoundEffect Method

    +
    +
    +
    +

    Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.

    +

    Overload List

    +

    Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.

    +
    + public bool EnableGargleSoundEffect(); +
    +

    Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.

    +
    + public bool EnableGargleSoundEffect(int,bool); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_1.html new file mode 100644 index 0000000..f84495c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableI3DL2ReverbSoundEffect Method (Int32, Int32, Single, Single, Single, Int32, Single, Int32, Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableI3DL2ReverbSoundEffect Method (Int32, Int32, Single, Single, Single, Int32, Single, Int32, Single, Single, Single, Single)

    +
    +
    +
    +

    Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableI3DL2ReverbSoundEffect( _
       ByVal lRoom As Integer, _
       ByVal lRoomHF As Integer, _
       ByVal flRoomRolloffFactor As Single, _
       ByVal flDecayTime As Single, _
       ByVal flDecayHFRatio As Single, _
       ByVal lReflections As Integer, _
       ByVal flReflectionsDelay As Single, _
       ByVal lReverb As Integer, _
       ByVal flReverbDelay As Single, _
       ByVal flDiffusion As Single, _
       ByVal flDensity As Single, _
       ByVal flHFReference As Single _
    ) As Boolean
    +
    + [C#] +
    public bool EnableI3DL2ReverbSoundEffect(
       int lRoom,
       int lRoomHF,
       float flRoomRolloffFactor,
       float flDecayTime,
       float flDecayHFRatio,
       int lReflections,
       float flReflectionsDelay,
       int lReverb,
       float flReverbDelay,
       float flDiffusion,
       float flDensity,
       float flHFReference
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableI3DL2ReverbSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_2.html new file mode 100644 index 0000000..7da673b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableI3DL2ReverbSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableI3DL2ReverbSoundEffect Method ()

    +
    +
    +
    +

    Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableI3DL2ReverbSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableI3DL2ReverbSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableI3DL2ReverbSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overloads.html new file mode 100644 index 0000000..3a80a54 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableI3DL2ReverbSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableI3DL2ReverbSoundEffect Method

    +
    +
    +
    +

    Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableI3DL2ReverbSoundEffect(); +
    +

    Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableI3DL2ReverbSoundEffect(int,int,float,float,float,int,float,int,float,float,float,float); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_1.html new file mode 100644 index 0000000..53e90e5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableParamEqSoundEffect Method (Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableParamEqSoundEffect Method (Single, Single, Single)

    +
    +
    +
    +

    Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableParamEqSoundEffect( _
       ByVal fCenter As Single, _
       ByVal fBandwidth As Single, _
       ByVal fGain As Single _
    ) As Boolean
    +
    + [C#] +
    public bool EnableParamEqSoundEffect(
       float fCenter,
       float fBandwidth,
       float fGain
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableParamEqSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_2.html new file mode 100644 index 0000000..9deb255 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableParamEqSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableParamEqSoundEffect Method ()

    +
    +
    +
    +

    Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableParamEqSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableParamEqSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableParamEqSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overloads.html new file mode 100644 index 0000000..f770b74 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableParamEqSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableParamEqSoundEffect Method

    +
    +
    +
    +

    Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableParamEqSoundEffect(); +
    +

    Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableParamEqSoundEffect(float,float,float); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_1.html new file mode 100644 index 0000000..e58c2a4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_1.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableWavesReverbSoundEffect Method (Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableWavesReverbSoundEffect Method (Single, Single, Single, Single)

    +
    +
    +
    +

    Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableWavesReverbSoundEffect( _
       ByVal fInGain As Single, _
       ByVal fReverbMix As Single, _
       ByVal fReverbTime As Single, _
       ByVal fHighFreqRTRatio As Single _
    ) As Boolean
    +
    + [C#] +
    public bool EnableWavesReverbSoundEffect(
       float fInGain,
       float fReverbMix,
       float fReverbTime,
       float fHighFreqRTRatio
    );
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableWavesReverbSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_2.html new file mode 100644 index 0000000..73b99e0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_2.html @@ -0,0 +1,56 @@ + + + + + ISoundEffectControl.EnableWavesReverbSoundEffect Method () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableWavesReverbSoundEffect Method ()

    +
    +
    +
    +

    Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + [Visual Basic] +
    Overloads Public Function EnableWavesReverbSoundEffect() As Boolean
    +
    + [C#] +
    public bool EnableWavesReverbSoundEffect();
    +

    Return Value

    +

    Returns true if successful.

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace | ISoundEffectControl.EnableWavesReverbSoundEffect Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overloads.html new file mode 100644 index 0000000..648d356 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overloads.html @@ -0,0 +1,49 @@ + + + + + EnableWavesReverbSoundEffect Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.EnableWavesReverbSoundEffect Method

    +
    +
    +
    +

    Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +

    Overload List

    +

    Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableWavesReverbSoundEffect(); +
    +

    Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.

    +
    + public bool EnableWavesReverbSoundEffect(float,float,float,float); +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.Finalize.html new file mode 100644 index 0000000..2f6a334 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.Finalize.html @@ -0,0 +1,54 @@ + + + + + ISoundEffectControl.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsChorusSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsChorusSoundEffectEnabled.html new file mode 100644 index 0000000..376fc39 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsChorusSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsChorusSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsChorusSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsChorusSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsChorusSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsCompressorSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsCompressorSoundEffectEnabled.html new file mode 100644 index 0000000..53c075a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsCompressorSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsCompressorSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsCompressorSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsCompressorSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsCompressorSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsDistortionSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsDistortionSoundEffectEnabled.html new file mode 100644 index 0000000..74ae278 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsDistortionSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsDistortionSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsDistortionSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsDistortionSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsDistortionSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsEchoSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsEchoSoundEffectEnabled.html new file mode 100644 index 0000000..0afd627 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsEchoSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsEchoSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsEchoSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsEchoSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsEchoSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsFlangerSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsFlangerSoundEffectEnabled.html new file mode 100644 index 0000000..d7355bf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsFlangerSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsFlangerSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsFlangerSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsFlangerSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsFlangerSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsGargleSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsGargleSoundEffectEnabled.html new file mode 100644 index 0000000..fecd63a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsGargleSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsGargleSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsGargleSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsGargleSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsGargleSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled.html new file mode 100644 index 0000000..3c6e6d3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsI3DL2ReverbSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsI3DL2ReverbSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsI3DL2ReverbSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsParamEqSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsParamEqSoundEffectEnabled.html new file mode 100644 index 0000000..d956adf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsParamEqSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsParamEqSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsParamEqSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsParamEqSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsParamEqSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsWavesReverbSoundEffectEnabled.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsWavesReverbSoundEffectEnabled.html new file mode 100644 index 0000000..0346abd --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.IsWavesReverbSoundEffectEnabled.html @@ -0,0 +1,56 @@ + + + + + IsWavesReverbSoundEffectEnabled Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl.IsWavesReverbSoundEffectEnabled Property

    +
    +
    +
    +

    returns if the sound effect is enabled

    +
    + [Visual Basic] +
    Public ReadOnly Property IsWavesReverbSoundEffectEnabled As Boolean
    +
    + [C#] +
    public bool IsWavesReverbSoundEffectEnabled {get;}
    +

    +

    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.html new file mode 100644 index 0000000..05ea97f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControl.html @@ -0,0 +1,67 @@ + + + + + ISoundEffectControl Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl Class

    +
    +
    +
    +

    Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. Sound effects such as chorus, distorsions, echo, reverb and similar can be controlled using this. An instance of this interface can be obtained via ISound::getSoundEffectControl(). The sound containing this interface has to be started via ISoundEngine::play2D() or ISoundEngine::play3D() with the flag enableSoundEffects=true, otherwise no acccess to this interface will be available. For the DirectSound driver, these are effects available since DirectSound8. For most effects, sounds should have a sample rate of 44 khz and should be at least 150 milli seconds long for optimal quality when using the DirectSound driver.

    +

    For a list of all members of this type, see ISoundEffectControl Members.

    +

    + System.Object +
       IrrKlang.ISoundEffectControl

    +
    + [Visual Basic] +
    Public Class ISoundEffectControl
    +
    + [C#] +
    public class ISoundEffectControl
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISoundEffectControl Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlConstructor.html new file mode 100644 index 0000000..aceb154 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlConstructor.html @@ -0,0 +1,51 @@ + + + + + ISoundEffectControl Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl Constructor 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Sub New( _
       ByVal nativeSound As ISound*, _
       ByVal nativeEngine As ISoundEngine* _
    )
    +
    + [C#] +
    public ISoundEffectControl(
       ISound* nativeSound,
       ISoundEngine* nativeEngine
    );
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMembers.html new file mode 100644 index 0000000..326367f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMembers.html @@ -0,0 +1,120 @@ + + + + + ISoundEffectControl Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl Members +

    +
    +
    +
    +

    + ISoundEffectControl overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + ISoundEffectControl Constructor + +
    +
    +

    Public Instance Properties

    +
    + + + + + + + + + +
    IsChorusSoundEffectEnabled returns if the sound effect is enabled
    IsCompressorSoundEffectEnabled returns if the sound effect is enabled
    IsDistortionSoundEffectEnabled returns if the sound effect is enabled
    IsEchoSoundEffectEnabled returns if the sound effect is enabled
    IsFlangerSoundEffectEnabled returns if the sound effect is enabled
    IsGargleSoundEffectEnabled returns if the sound effect is enabled
    IsI3DL2ReverbSoundEffectEnabled returns if the sound effect is enabled
    IsParamEqSoundEffectEnabled returns if the sound effect is enabled
    IsWavesReverbSoundEffectEnabled returns if the sound effect is enabled
    +
    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    DisableAllEffects Disables all active sound effects.
    DisableChorusSoundEffect Disables the Chorus sound effect.
    DisableCompressorSoundEffect Disables the Compressor sound effect.
    DisableDistortionSoundEffect Disables the Distortion sound effect.
    DisableEchoSoundEffect Disables the Echo sound effect.
    DisableFlangerSoundEffect Disables the Flanger sound effect.
    DisableGargleSoundEffect Disables the Gargle sound effect.
    DisableI3DL2ReverbSoundEffect Disables the I3DL2 sound effect.
    DisableParamEqSoundEffect Disables the ParamEq sound effect.
    DisableWavesReverbSoundEffect Disable the WavesReverb sound effect.
    EnableChorusSoundEffectOverloaded. Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableCompressorSoundEffectOverloaded. Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.
    EnableDistortionSoundEffectOverloaded. Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableEchoSoundEffectOverloaded. Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableFlangerSoundEffectOverloaded. Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.
    EnableGargleSoundEffectOverloaded. Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.
    EnableI3DL2ReverbSoundEffectOverloaded. Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableParamEqSoundEffectOverloaded. Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableWavesReverbSoundEffectOverloaded. Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMethods.html new file mode 100644 index 0000000..9585254 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlMethods.html @@ -0,0 +1,87 @@ + + + + + ISoundEffectControl Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl Methods

    +
    +
    +
    +

    The methods of the ISoundEffectControl class are listed below. For a complete list of ISoundEffectControl class members, see the ISoundEffectControl Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    DisableAllEffects Disables all active sound effects.
    DisableChorusSoundEffect Disables the Chorus sound effect.
    DisableCompressorSoundEffect Disables the Compressor sound effect.
    DisableDistortionSoundEffect Disables the Distortion sound effect.
    DisableEchoSoundEffect Disables the Echo sound effect.
    DisableFlangerSoundEffect Disables the Flanger sound effect.
    DisableGargleSoundEffect Disables the Gargle sound effect.
    DisableI3DL2ReverbSoundEffect Disables the I3DL2 sound effect.
    DisableParamEqSoundEffect Disables the ParamEq sound effect.
    DisableWavesReverbSoundEffect Disable the WavesReverb sound effect.
    EnableChorusSoundEffectOverloaded. Enables the chorus sound effect with default values. Chorus is a voice-doubling effect created by echoing the original sound with a slight delay and slightly modulating the delay of the echo. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableCompressorSoundEffectOverloaded. Enables the Compressor sound effect with default values. Compressor is a reduction in the fluctuation of a signal above a certain amplitude.
    EnableDistortionSoundEffectOverloaded. Enables the Distortion sound effect with default values. Distortion is achieved by adding harmonics to the signal in such a way that, as the level increases, the top of the waveform becomes squared off or clipped. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableEchoSoundEffectOverloaded. Enables the Echo sound effect with default values. An echo effect causes an entire sound to be repeated after a fixed delay. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableFlangerSoundEffectOverloaded. Enables the Flanger sound effect with default values. Flange is an echo effect in which the delay between the original signal and its echo is very short and varies over time. The result is sometimes referred to as a sweeping sound. The term flange originated with the practice of grabbing the flanges of a tape reel to change the speed.
    EnableGargleSoundEffectOverloaded. Enables the Gargle sound effect with default values. The gargle effect modulates the amplitude of the signal.
    EnableI3DL2ReverbSoundEffectOverloaded. Enables the I3DL2Reverb sound effect with default values. An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableParamEqSoundEffectOverloaded. Enables the ParamEq sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    EnableWavesReverbSoundEffectOverloaded. Enables the WavesReverb sound effect with default values. Parametric equalizer amplifies or attenuates signals of a given frequency. If this sound effect is already enabled, calling this only modifies the parameters of the active effect.
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlProperties.html new file mode 100644 index 0000000..f151905 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEffectControlProperties.html @@ -0,0 +1,57 @@ + + + + + ISoundEffectControl Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEffectControl Properties

    +
    +
    +
    +

    The properties of the ISoundEffectControl class are listed below. For a complete list of ISoundEffectControl class members, see the ISoundEffectControl Members topic.

    +

    Public Instance Properties

    +
    + + + + + + + + + +
    IsChorusSoundEffectEnabled returns if the sound effect is enabled
    IsCompressorSoundEffectEnabled returns if the sound effect is enabled
    IsDistortionSoundEffectEnabled returns if the sound effect is enabled
    IsEchoSoundEffectEnabled returns if the sound effect is enabled
    IsFlangerSoundEffectEnabled returns if the sound effect is enabled
    IsGargleSoundEffectEnabled returns if the sound effect is enabled
    IsI3DL2ReverbSoundEffectEnabled returns if the sound effect is enabled
    IsParamEqSoundEffectEnabled returns if the sound effect is enabled
    IsWavesReverbSoundEffectEnabled returns if the sound effect is enabled
    +
    +

    See Also

    +

    + ISoundEffectControl Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddFileFactory.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddFileFactory.html new file mode 100644 index 0000000..496ec9e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddFileFactory.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.AddFileFactory Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddFileFactory Method 

    +
    +
    +
    +

    Adds a file factory to the sound engine, making it possible to override file access of the sound engine. Derive your own class from IFileFactory, overwrite the openFile() method and return your own implemented System::IO::Stream to overwrite file access of irrKlang.

    +
    + [Visual Basic] +
    Public Sub AddFileFactory( _
       ByVal fileFactory As IFileFactory _
    )
    +
    + [C#] +
    public void AddFileFactory(
       IFileFactory fileFactory
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceAlias.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceAlias.html new file mode 100644 index 0000000..e197707 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceAlias.html @@ -0,0 +1,67 @@ + + + + + ISoundEngine.AddSoundSourceAlias Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceAlias Method 

    +
    +
    +
    +

    Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings. This is useful if you want to play multiple sounds but each sound isn't necessarily one single file. Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.

    +
    + [Visual Basic] +
    Public Function AddSoundSourceAlias( _
       ByVal baseSource As ISoundSource, _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceAlias(
       ISoundSource baseSource,
       string soundName
    );
    +

    Parameters

    +
    +
    + baseSource +
    +
    The sound source where this sound source should be based on. This sound source will use the baseSource as base to access the file and similar, but it will have its own name and its own default settings.
    +
    + soundName +
    +
    Name of the new sound source to be added.
    +
    +

    Return Value

    +

    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_1.html new file mode 100644 index 0000000..d8325d4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_1.html @@ -0,0 +1,63 @@ + + + + + ISoundEngine.AddSoundSourceFromFile Method (String) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromFile Method (String)

    +
    +
    +
    +

    Adds sound source into the sound engine as file.

    +
    + [Visual Basic] +
    Overloads Public Function AddSoundSourceFromFile( _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromFile(
       string soundName
    );
    +

    Parameters

    +
    +
    + soundName +
    +
    Name of the sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D().
    +
    +

    Return Value

    +

    Returns the added sound source or null if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.AddSoundSourceFromFile Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_2.html new file mode 100644 index 0000000..64f0032 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_2.html @@ -0,0 +1,67 @@ + + + + + ISoundEngine.AddSoundSourceFromFile Method (String, StreamMode) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromFile Method (String, StreamMode)

    +
    +
    +
    +

    Adds sound source into the sound engine as file.

    +
    + [Visual Basic] +
    Overloads Public Function AddSoundSourceFromFile( _
       ByVal soundName As String, _
       ByVal streamMode As StreamMode _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromFile(
       string soundName,
       StreamMode streamMode
    );
    +

    Parameters

    +
    +
    + soundName +
    +
    Name of the sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D().
    +
    + streamMode +
    +
    Streaming mode for this sound source
    +
    +

    Return Value

    +

    Returns the added sound source or null if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.AddSoundSourceFromFile Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_3.html new file mode 100644 index 0000000..a097dad --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_3.html @@ -0,0 +1,72 @@ + + + + + ISoundEngine.AddSoundSourceFromFile Method (String, StreamMode, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromFile Method (String, StreamMode, Boolean)

    +
    +
    +
    +

    Adds sound source into the sound engine as file.

    +
    + [Visual Basic] +
    Overloads Public Function AddSoundSourceFromFile( _
       ByVal soundName As String, _
       ByVal streamMode As StreamMode, _
       ByVal preLoad As Boolean _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromFile(
       string soundName,
       StreamMode streamMode,
       bool preLoad
    );
    +

    Parameters

    +
    +
    + soundName +
    +
    Name of the sound file (e.g. "sounds/something.mp3"). You can also use this name when calling play3D() or play2D().
    +
    + streamMode +
    +
    Streaming mode for this sound source
    +
    + preLoad +
    +
    +
    +
    +

    Return Value

    +

    Returns the added sound source or null if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.AddSoundSourceFromFile Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overloads.html new file mode 100644 index 0000000..69de301 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromFile_overloads.html @@ -0,0 +1,53 @@ + + + + + AddSoundSourceFromFile Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromFile Method

    +
    +
    +
    +

    Adds sound source into the sound engine as file.

    +

    Overload List

    +

    Adds sound source into the sound engine as file.

    +
    + public ISoundSource AddSoundSourceFromFile(string); +
    +

    Adds sound source into the sound engine as file.

    +
    + public ISoundSource AddSoundSourceFromFile(string,StreamMode); +
    +

    Adds sound source into the sound engine as file.

    +
    + public ISoundSource AddSoundSourceFromFile(string,StreamMode,bool); +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromIOStream.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromIOStream.html new file mode 100644 index 0000000..eefacca --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromIOStream.html @@ -0,0 +1,56 @@ + + + + + ISoundEngine.AddSoundSourceFromIOStream Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromIOStream Method 

    +
    +
    +
    +

    Adds a sound source into the sound engine from a IOStream. Note that the stream is totally read into memory when adding the sound source. If you want irrKlang to dynamically open and close custom file streams without loading everything into memory, use the addFileFactory with your own IFileFactory implementation.

    +
    + [Visual Basic] +
    Public Function AddSoundSourceFromIOStream( _
       ByVal stream As Stream, _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromIOStream(
       Stream stream,
       string soundName
    );
    +

    Return Value

    +

    Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already existed with that name. If not successful, the reason will be printed into the log.

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromMemory.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromMemory.html new file mode 100644 index 0000000..d71e6d3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromMemory.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.AddSoundSourceFromMemory Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromMemory Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Function AddSoundSourceFromMemory( _
       ByVal soundDataInMemory As Byte(), _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromMemory(
       byte[] soundDataInMemory,
       string soundName
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromPCMData.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromPCMData.html new file mode 100644 index 0000000..0033476 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.AddSoundSourceFromPCMData.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.AddSoundSourceFromPCMData Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.AddSoundSourceFromPCMData Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Function AddSoundSourceFromPCMData( _
       ByVal soundDataInMemory As Byte(), _
       ByVal soundName As String, _
       ByVal format As AudioFormat _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource AddSoundSourceFromPCMData(
       byte[] soundDataInMemory,
       string soundName,
       AudioFormat format
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMaxDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMaxDistance.html new file mode 100644 index 0000000..e8f6642 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMaxDistance.html @@ -0,0 +1,56 @@ + + + + + Default3DSoundMaxDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Default3DSoundMaxDistance Property

    +
    +
    +
    +

    Sets or gets the default maximal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMaxDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().

    +
    + [Visual Basic] +
    Public Property Default3DSoundMaxDistance As Single
    +
    + [C#] +
    public float Default3DSoundMaxDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMinDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMinDistance.html new file mode 100644 index 0000000..9163d89 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Default3DSoundMinDistance.html @@ -0,0 +1,56 @@ + + + + + Default3DSoundMinDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Default3DSoundMinDistance Property

    +
    +
    +
    +

    Sets or gets the default minimal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMinDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    + [Visual Basic] +
    Public Property Default3DSoundMinDistance As Single
    +
    + [C#] +
    public float Default3DSoundMinDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Finalize.html new file mode 100644 index 0000000..d350499 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Finalize.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_1.html new file mode 100644 index 0000000..c8e131c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_1.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.GetSoundSource Method (String, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.GetSoundSource Method (String, Boolean)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Function GetSoundSource( _
       ByVal soundName As String, _
       ByVal addIfNotFound As Boolean _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource GetSoundSource(
       string soundName,
       bool addIfNotFound
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.GetSoundSource Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_2.html new file mode 100644 index 0000000..ba8571b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overload_2.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.GetSoundSource Method (String) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.GetSoundSource Method (String)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Function GetSoundSource( _
       ByVal soundName As String _
    ) As ISoundSource
    +
    + [C#] +
    public ISoundSource GetSoundSource(
       string soundName
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.GetSoundSource Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overloads.html new file mode 100644 index 0000000..97b939d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.GetSoundSource_overloads.html @@ -0,0 +1,50 @@ + + + + + GetSoundSource Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.GetSoundSource Method

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsCurrentlyPlaying.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsCurrentlyPlaying.html new file mode 100644 index 0000000..a403ab1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsCurrentlyPlaying.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.IsCurrentlyPlaying Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.IsCurrentlyPlaying Method 

    +
    +
    +
    +

    Returns if a sound with the specified name is currently playing

    +
    + [Visual Basic] +
    Public Function IsCurrentlyPlaying( _
       ByVal soundName As String _
    ) As Boolean
    +
    + [C#] +
    public bool IsCurrentlyPlaying(
       string soundName
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsMultiThreaded.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsMultiThreaded.html new file mode 100644 index 0000000..31c1dd8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.IsMultiThreaded.html @@ -0,0 +1,56 @@ + + + + + IsMultiThreaded Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.IsMultiThreaded Property

    +
    +
    +
    +

    Returns if irrKlang is running in the same thread as the application or is using multithreading. This basicly returns the flag set by the user when creating the sound engine.

    +
    + [Visual Basic] +
    Public ReadOnly Property IsMultiThreaded As Boolean
    +
    + [C#] +
    public bool IsMultiThreaded {get;}
    +

    +

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.LoadPlugins.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.LoadPlugins.html new file mode 100644 index 0000000..8451131 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.LoadPlugins.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.LoadPlugins Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.LoadPlugins Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Function LoadPlugins( _
       ByVal path As String _
    ) As Boolean
    +
    + [C#] +
    public bool LoadPlugins(
       string path
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Name.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Name.html new file mode 100644 index 0000000..7e8e5d0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Name.html @@ -0,0 +1,56 @@ + + + + + Name Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Name Property

    +
    +
    +
    +

    Returns the name of the audio driver.

    +
    + [Visual Basic] +
    Public ReadOnly Property Name As String
    +
    + [C#] +
    public string Name {get;}
    +

    +

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_1.html new file mode 100644 index 0000000..2df861f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_1.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (ISoundSource, Boolean, Boolean, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (ISoundSource, Boolean, Boolean, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal source As ISoundSource, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal enableSoundEffects As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       ISoundSource source,
       bool playLooped,
       bool startPaused,
       bool enableSoundEffects
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_2.html new file mode 100644 index 0000000..49d7e0b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_2.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (String, Boolean, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (String, Boolean, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal soundFilename As String, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       string soundFilename,
       bool playLooped,
       bool startPaused
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_3.html new file mode 100644 index 0000000..530960e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_3.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (String, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (String, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal soundFilename As String, _
       ByVal playLooped As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       string soundFilename,
       bool playLooped
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_4.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_4.html new file mode 100644 index 0000000..5a57379 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_4.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (String) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (String)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal soundFilename As String _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       string soundFilename
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_5.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_5.html new file mode 100644 index 0000000..14989c9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_5.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (String, Boolean, Boolean, StreamMode) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (String, Boolean, Boolean, StreamMode)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal soundFilename As String, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       string soundFilename,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_6.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_6.html new file mode 100644 index 0000000..419cf7e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overload_6.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play2D Method (String, Boolean, Boolean, StreamMode, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method (String, Boolean, Boolean, StreamMode, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + [Visual Basic] +
    Overloads Public Function Play2D( _
       ByVal soundFilename As String, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode, _
       ByVal enableSoundEffects As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play2D(
       string soundFilename,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode,
       bool enableSoundEffects
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play2D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overloads.html new file mode 100644 index 0000000..300a453 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play2D_overloads.html @@ -0,0 +1,65 @@ + + + + + Play2D Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play2D Method

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +

    Overload List

    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(ISoundSource,bool,bool,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(string); +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(string,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(string,bool,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(string,bool,bool,StreamMode); +
    +

    loads a sound source (if not loaded already) from a file and plays it.

    +
    + public ISound Play2D(string,bool,bool,StreamMode,bool); +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_1.html new file mode 100644 index 0000000..aa01e1d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_1.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (ISoundSource, Single, Single, Single, Boolean, Boolean, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (ISoundSource, Single, Single, Single, Boolean, Boolean, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal source As ISoundSource, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal enableSoundEffects As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       ISoundSource source,
       float posX,
       float posY,
       float posZ,
       bool playLooped,
       bool startPaused,
       bool enableSoundEffects
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_2.html new file mode 100644 index 0000000..0e067ab --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_2.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Single, Single, Single)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       float posX,
       float posY,
       float posZ
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_3.html new file mode 100644 index 0000000..79a2441 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_3.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal playLooped As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       float posX,
       float posY,
       float posZ,
       bool playLooped
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_4.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_4.html new file mode 100644 index 0000000..2b32665 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_4.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       float posX,
       float posY,
       float posZ,
       bool playLooped,
       bool startPaused
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_5.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_5.html new file mode 100644 index 0000000..0552002 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_5.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean, StreamMode) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean, StreamMode)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       float posX,
       float posY,
       float posZ,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_6.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_6.html new file mode 100644 index 0000000..920e7bd --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_6.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean, StreamMode, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Single, Single, Single, Boolean, Boolean, StreamMode, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode, _
       ByVal enableSoundEffects As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       float posX,
       float posY,
       float posZ,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode,
       bool enableSoundEffects
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_7.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_7.html new file mode 100644 index 0000000..48b0b6c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_7.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Vector3D, Boolean, Boolean, StreamMode, Boolean) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Vector3D, Boolean, Boolean, StreamMode, Boolean)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal position As Vector3D, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode, _
       ByVal enableSoundEffects As Boolean _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       Vector3D position,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode,
       bool enableSoundEffects
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_8.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_8.html new file mode 100644 index 0000000..50fac12 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overload_8.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Play3D Method (String, Vector3D, Boolean, Boolean, StreamMode) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method (String, Vector3D, Boolean, Boolean, StreamMode)

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + [Visual Basic] +
    Overloads Public Function Play3D( _
       ByVal soundFilename As String, _
       ByVal position As Vector3D, _
       ByVal playLooped As Boolean, _
       ByVal startPaused As Boolean, _
       ByVal streamMode As StreamMode _
    ) As ISound
    +
    + [C#] +
    public ISound Play3D(
       string soundFilename,
       Vector3D position,
       bool playLooped,
       bool startPaused,
       StreamMode streamMode
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.Play3D Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overloads.html new file mode 100644 index 0000000..8e980c0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Play3D_overloads.html @@ -0,0 +1,73 @@ + + + + + Play3D Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Play3D Method

    +
    +
    +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +

    Overload List

    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(ISoundSource,float,float,float,bool,bool,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,Vector3D,bool,bool,StreamMode); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,Vector3D,bool,bool,StreamMode,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,float,float,float); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,float,float,float,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,float,float,float,bool,bool); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,float,float,float,bool,bool,StreamMode); +
    +

    loads a sound source (if not loaded already) from a file and plays it as 3d sound.

    +
    + public ISound Play3D(string,float,float,float,bool,bool,StreamMode,bool); +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveAllSoundSources.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveAllSoundSources.html new file mode 100644 index 0000000..df1bec1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveAllSoundSources.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.RemoveAllSoundSources Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.RemoveAllSoundSources Method 

    +
    +
    +
    +

    Removes all sound sources from the engine. This will also cause all sounds to be stopped. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.

    +
    + [Visual Basic] +
    Public Sub RemoveAllSoundSources()
    +
    + [C#] +
    public void RemoveAllSoundSources();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveSoundSource.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveSoundSource.html new file mode 100644 index 0000000..a9ba245 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.RemoveSoundSource.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.RemoveSoundSource Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.RemoveSoundSource Method 

    +
    +
    +
    +

    Removes a sound source from the engine, freeing the memory it occupies. This will also cause all currently playing sounds of this source to be stopped. Also note that if the source has been removed successfully, the value returned by getSoundSourceCount() will have been decreased by one. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.

    +
    + [Visual Basic] +
    Public Sub RemoveSoundSource( _
       ByVal soundName As String _
    )
    +
    + [C#] +
    public void RemoveSoundSource(
       string soundName
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetAllSoundsPaused.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetAllSoundsPaused.html new file mode 100644 index 0000000..affcc39 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetAllSoundsPaused.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetAllSoundsPaused Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetAllSoundsPaused Method 

    +
    +
    +
    +

    pauses or unpauses all currently playing sounds

    +
    + [Visual Basic] +
    Public Sub SetAllSoundsPaused( _
       ByVal bPaused As Boolean _
    )
    +
    + [C#] +
    public void SetAllSoundsPaused(
       bool bPaused
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetDopplerEffectParameters.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetDopplerEffectParameters.html new file mode 100644 index 0000000..c7dd158 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetDopplerEffectParameters.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetDopplerEffectParameters Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetDopplerEffectParameters Method 

    +
    +
    +
    +

    Sets parameters affecting the doppler effect.

    +
    + [Visual Basic] +
    Public Sub SetDopplerEffectParameters( _
       ByVal dopplerFactor As Single, _
       ByVal distanceFactor As Single _
    )
    +
    + [C#] +
    public void SetDopplerEffectParameters(
       float dopplerFactor,
       float distanceFactor
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_1.html new file mode 100644 index 0000000..13364dc --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_1.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetListenerPosition Method (Single, Single, Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetListenerPosition Method (Single, Single, Single, Single, Single, Single)

    +
    +
    +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + [Visual Basic] +
    Overloads Public Sub SetListenerPosition( _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal lookDirX As Single, _
       ByVal lookDirY As Single, _
       ByVal lookDirZ As Single _
    )
    +
    + [C#] +
    public void SetListenerPosition(
       float posX,
       float posY,
       float posZ,
       float lookDirX,
       float lookDirY,
       float lookDirZ
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.SetListenerPosition Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_2.html new file mode 100644 index 0000000..11c9cef --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_2.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetListenerPosition Method (Single, Single, Single, Single, Single, Single, Single, Single, Single, Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetListenerPosition Method (Single, Single, Single, Single, Single, Single, Single, Single, Single, Single, Single, Single)

    +
    +
    +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + [Visual Basic] +
    Overloads Public Sub SetListenerPosition( _
       ByVal posX As Single, _
       ByVal posY As Single, _
       ByVal posZ As Single, _
       ByVal lookDirX As Single, _
       ByVal lookDirY As Single, _
       ByVal lookDirZ As Single, _
       ByVal velPerSecondX As Single, _
       ByVal velPerSecondY As Single, _
       ByVal velPerSecondZ As Single, _
       ByVal upVectorX As Single, _
       ByVal upVectorY As Single, _
       ByVal upVectorZ As Single _
    )
    +
    + [C#] +
    public void SetListenerPosition(
       float posX,
       float posY,
       float posZ,
       float lookDirX,
       float lookDirY,
       float lookDirZ,
       float velPerSecondX,
       float velPerSecondY,
       float velPerSecondZ,
       float upVectorX,
       float upVectorY,
       float upVectorZ
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.SetListenerPosition Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_3.html new file mode 100644 index 0000000..0b1ded5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_3.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetListenerPosition Method (Vector3D, Vector3D) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetListenerPosition Method (Vector3D, Vector3D)

    +
    +
    +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + [Visual Basic] +
    Overloads Public Sub SetListenerPosition( _
       ByVal pos As Vector3D, _
       ByVal lookdir As Vector3D _
    )
    +
    + [C#] +
    public void SetListenerPosition(
       Vector3D pos,
       Vector3D lookdir
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.SetListenerPosition Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_4.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_4.html new file mode 100644 index 0000000..de962f7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overload_4.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.SetListenerPosition Method (Vector3D, Vector3D, Vector3D, Vector3D) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetListenerPosition Method (Vector3D, Vector3D, Vector3D, Vector3D)

    +
    +
    +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + [Visual Basic] +
    Overloads Public Sub SetListenerPosition( _
       ByVal pos As Vector3D, _
       ByVal lookdir As Vector3D, _
       ByVal velPerSecond As Vector3D, _
       ByVal upVector As Vector3D _
    )
    +
    + [C#] +
    public void SetListenerPosition(
       Vector3D pos,
       Vector3D lookdir,
       Vector3D velPerSecond,
       Vector3D upVector
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine.SetListenerPosition Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overloads.html new file mode 100644 index 0000000..989fffb --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetListenerPosition_overloads.html @@ -0,0 +1,57 @@ + + + + + SetListenerPosition Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetListenerPosition Method

    +
    +
    +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +

    Overload List

    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + public void SetListenerPosition(Vector3D,Vector3D); +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + public void SetListenerPosition(Vector3D,Vector3D,Vector3D,Vector3D); +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + public void SetListenerPosition(float,float,float,float,float,float); +
    +

    Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + public void SetListenerPosition(float,float,float,float,float,float,float,float,float,float,float,float); +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetRolloffFactor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetRolloffFactor.html new file mode 100644 index 0000000..a65faa8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SetRolloffFactor.html @@ -0,0 +1,61 @@ + + + + + ISoundEngine.SetRolloffFactor Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SetRolloffFactor Method 

    +
    +
    +
    +

    Sets the roll off factor for 3d sounds.

    +
    + [Visual Basic] +
    Public Sub SetRolloffFactor( _
       ByVal rolloffFactor As Single _
    )
    +
    + [C#] +
    public void SetRolloffFactor(
       float rolloffFactor
    );
    +

    Parameters

    +
    +
    + rolloffFactor +
    +
    The rolloff factor can range from 0.0 to 10.0, where 0 is no rolloff. 1.0 is the default rolloff factor set, the value which we also experience in the real world. A value of 2 would mean twice the real-world rolloff.
    +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SoundVolume.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SoundVolume.html new file mode 100644 index 0000000..dc9823f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.SoundVolume.html @@ -0,0 +1,56 @@ + + + + + SoundVolume Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.SoundVolume Property

    +
    +
    +
    +

    sets sound volume. This value is multiplied with all sounds played. Volume set to 0 is silent and 1.0f is full volume.

    +
    + [Visual Basic] +
    Public Property SoundVolume As Single
    +
    + [C#] +
    public float SoundVolume {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.StopAllSounds.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.StopAllSounds.html new file mode 100644 index 0000000..48fa736 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.StopAllSounds.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.StopAllSounds Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.StopAllSounds Method 

    +
    +
    +
    +

    stops all currently playing sounds

    +
    + [Visual Basic] +
    Public Sub StopAllSounds()
    +
    + [C#] +
    public void StopAllSounds();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Update.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Update.html new file mode 100644 index 0000000..4734a58 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.Update.html @@ -0,0 +1,54 @@ + + + + + ISoundEngine.Update Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.Update Method 

    +
    +
    +
    +

    Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode. This updates the 3d positions of the sounds as well as their volumes, effects streams and other stuff. Call this several times per frame (the more the better) if you specified irrKlang to run single threaded. Otherwise it is not necessary to use this method. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.

    +
    + [Visual Basic] +
    Public Sub Update()
    +
    + [C#] +
    public void Update();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.html new file mode 100644 index 0000000..4bcd663 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.html @@ -0,0 +1,68 @@ + + + + + ISoundEngine Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Class

    +
    +
    +
    +

    +

    +

    For a list of all members of this type, see ISoundEngine Members.

    +

    + System.Object +
       IrrKlang.ISoundEngine

    +
    + [Visual Basic] +
    Public Class ISoundEngine
    +
    + [C#] +
    public class ISoundEngine
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISoundEngine Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.internalGetNativeEngine.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.internalGetNativeEngine.html new file mode 100644 index 0000000..150696d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngine.internalGetNativeEngine.html @@ -0,0 +1,55 @@ + + + + + ISoundEngine.internalGetNativeEngine Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine.internalGetNativeEngine Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Function internalGetNativeEngine() As ISoundEngine*
    +
    + [C#] +
    public ISoundEngine* internalGetNativeEngine();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor.html new file mode 100644 index 0000000..c9c8b6d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor.html @@ -0,0 +1,62 @@ + + + + + ISoundEngine Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Constructor

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor1.html new file mode 100644 index 0000000..99e94b7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor1.html @@ -0,0 +1,47 @@ + + + + + ISoundEngine Constructor (SoundOutputDriver, SoundEngineOptionFlag, String) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Constructor (SoundOutputDriver, SoundEngineOptionFlag, String)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal driver As SoundOutputDriver, _
       ByVal options As SoundEngineOptionFlag, _
       ByVal deviceID As String _
    )
    +
    + [C#] +
    public ISoundEngine(
       SoundOutputDriver driver,
       SoundEngineOptionFlag options,
       string deviceID
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor2.html new file mode 100644 index 0000000..376ec49 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor2.html @@ -0,0 +1,47 @@ + + + + + ISoundEngine Constructor (SoundOutputDriver, SoundEngineOptionFlag) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Constructor (SoundOutputDriver, SoundEngineOptionFlag)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal driver As SoundOutputDriver, _
       ByVal options As SoundEngineOptionFlag _
    )
    +
    + [C#] +
    public ISoundEngine(
       SoundOutputDriver driver,
       SoundEngineOptionFlag options
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor3.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor3.html new file mode 100644 index 0000000..d01c522 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor3.html @@ -0,0 +1,47 @@ + + + + + ISoundEngine Constructor (SoundOutputDriver) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Constructor (SoundOutputDriver)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal driver As SoundOutputDriver _
    )
    +
    + [C#] +
    public ISoundEngine(
       SoundOutputDriver driver
    );
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor4.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor4.html new file mode 100644 index 0000000..4bb2257 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineConstructor4.html @@ -0,0 +1,46 @@ + + + + + ISoundEngine Constructor () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Constructor ()

    +
    +
    +
    +

    Initializes a new instance of the ISoundEngine class.

    +
    + [Visual Basic] +
    Overloads Public Sub New()
    +
    + [C#] +
    public ISoundEngine();
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace | ISoundEngine Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMembers.html new file mode 100644 index 0000000..ca401d9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMembers.html @@ -0,0 +1,116 @@ + + + + + ISoundEngine Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Members +

    +
    +
    +
    +

    + ISoundEngine overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + ISoundEngine + Overloaded. Initializes a new instance of the ISoundEngine class.
    +
    +

    Public Instance Properties

    +
    + + + + + +
    Default3DSoundMaxDistance Sets or gets the default maximal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMaxDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().
    Default3DSoundMinDistance Sets or gets the default minimal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMinDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
    IsMultiThreaded Returns if irrKlang is running in the same thread as the application or is using multithreading. This basicly returns the flag set by the user when creating the sound engine.
    Name Returns the name of the audio driver.
    SoundVolume sets sound volume. This value is multiplied with all sounds played. Volume set to 0 is silent and 1.0f is full volume.
    +
    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    AddFileFactory Adds a file factory to the sound engine, making it possible to override file access of the sound engine. Derive your own class from IFileFactory, overwrite the openFile() method and return your own implemented System::IO::Stream to overwrite file access of irrKlang.
    AddSoundSourceAlias Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings. This is useful if you want to play multiple sounds but each sound isn't necessarily one single file. Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.
    AddSoundSourceFromFileOverloaded. Adds sound source into the sound engine as file.
    AddSoundSourceFromIOStream Adds a sound source into the sound engine from a IOStream. Note that the stream is totally read into memory when adding the sound source. If you want irrKlang to dynamically open and close custom file streams without loading everything into memory, use the addFileFactory with your own IFileFactory implementation.
    AddSoundSourceFromMemory 
    AddSoundSourceFromPCMData 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetSoundSourceOverloaded.  
    GetType (inherited from Object) + Gets the Type of the current instance. +
    internalGetNativeEngine 
    IsCurrentlyPlaying Returns if a sound with the specified name is currently playing
    LoadPlugins 
    Play2DOverloaded. loads a sound source (if not loaded already) from a file and plays it.
    Play3DOverloaded. loads a sound source (if not loaded already) from a file and plays it as 3d sound.
    RemoveAllSoundSources Removes all sound sources from the engine. This will also cause all sounds to be stopped. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.
    RemoveSoundSource Removes a sound source from the engine, freeing the memory it occupies. This will also cause all currently playing sounds of this source to be stopped. Also note that if the source has been removed successfully, the value returned by getSoundSourceCount() will have been decreased by one. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.
    SetAllSoundsPaused pauses or unpauses all currently playing sounds
    SetDopplerEffectParameters Sets parameters affecting the doppler effect.
    SetListenerPositionOverloaded. Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.
    SetRolloffFactor Sets the roll off factor for 3d sounds.
    StopAllSounds stops all currently playing sounds
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    Update Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode. This updates the 3d positions of the sounds as well as their volumes, effects streams and other stuff. Call this several times per frame (the more the better) if you specified irrKlang to run single threaded. Otherwise it is not necessary to use this method. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMethods.html new file mode 100644 index 0000000..40007b4 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineMethods.html @@ -0,0 +1,88 @@ + + + + + ISoundEngine Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Methods

    +
    +
    +
    +

    The methods of the ISoundEngine class are listed below. For a complete list of ISoundEngine class members, see the ISoundEngine Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    AddFileFactory Adds a file factory to the sound engine, making it possible to override file access of the sound engine. Derive your own class from IFileFactory, overwrite the openFile() method and return your own implemented System::IO::Stream to overwrite file access of irrKlang.
    AddSoundSourceAlias Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings. This is useful if you want to play multiple sounds but each sound isn't necessarily one single file. Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances.
    AddSoundSourceFromFileOverloaded. Adds sound source into the sound engine as file.
    AddSoundSourceFromIOStream Adds a sound source into the sound engine from a IOStream. Note that the stream is totally read into memory when adding the sound source. If you want irrKlang to dynamically open and close custom file streams without loading everything into memory, use the addFileFactory with your own IFileFactory implementation.
    AddSoundSourceFromMemory 
    AddSoundSourceFromPCMData 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetSoundSourceOverloaded.  
    GetType (inherited from Object) + Gets the Type of the current instance. +
    internalGetNativeEngine 
    IsCurrentlyPlaying Returns if a sound with the specified name is currently playing
    LoadPlugins 
    Play2DOverloaded. loads a sound source (if not loaded already) from a file and plays it.
    Play3DOverloaded. loads a sound source (if not loaded already) from a file and plays it as 3d sound.
    RemoveAllSoundSources Removes all sound sources from the engine. This will also cause all sounds to be stopped. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.
    RemoveSoundSource Removes a sound source from the engine, freeing the memory it occupies. This will also cause all currently playing sounds of this source to be stopped. Also note that if the source has been removed successfully, the value returned by getSoundSourceCount() will have been decreased by one. Removing sound sources is only necessary if you know you won't use a lot of non-streamed sounds again. Sound sources of streamed sounds do not cost a lot of memory.
    SetAllSoundsPaused pauses or unpauses all currently playing sounds
    SetDopplerEffectParameters Sets parameters affecting the doppler effect.
    SetListenerPositionOverloaded. Sets the current listener 3d position. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.
    SetRolloffFactor Sets the roll off factor for 3d sounds.
    StopAllSounds stops all currently playing sounds
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    Update Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode. This updates the 3d positions of the sounds as well as their volumes, effects streams and other stuff. Call this several times per frame (the more the better) if you specified irrKlang to run single threaded. Otherwise it is not necessary to use this method. This method is being called by the scene manager automaticly if you are using one, so you might want to ignore this.
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineProperties.html new file mode 100644 index 0000000..1b8e35b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundEngineProperties.html @@ -0,0 +1,53 @@ + + + + + ISoundEngine Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundEngine Properties

    +
    +
    +
    +

    The properties of the ISoundEngine class are listed below. For a complete list of ISoundEngine class members, see the ISoundEngine Members topic.

    +

    Public Instance Properties

    +
    + + + + + +
    Default3DSoundMaxDistance Sets or gets the default maximal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMaxDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().
    Default3DSoundMinDistance Sets or gets the default minimal distance for 3D sounds. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. It is also possible to influence this default value for every sound file using ISoundSource::setDefaultMinDistance(). This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
    IsMultiThreaded Returns if irrKlang is running in the same thread as the application or is using multithreading. This basicly returns the flag set by the user when creating the sound engine.
    Name Returns the name of the audio driver.
    SoundVolume sets sound volume. This value is multiplied with all sounds played. Volume set to 0 is silent and 1.0f is full volume.
    +
    +

    See Also

    +

    + ISoundEngine Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMembers.html new file mode 100644 index 0000000..34bb8ba --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMembers.html @@ -0,0 +1,108 @@ + + + + + ISound Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound Members +

    +
    +
    +
    +

    + ISound overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + ISound Constructor + +
    +
    +

    Public Instance Properties

    +
    + + + + + + + + + + + + + +
    Finished returns if the sound has finished playing. Don't mix this up with isPaused(). isFinished() returns if the sound has been finished playing. If it has, is maybe already have been removed from the playing list of the sound engine and calls to any other of the methods of ISound will not have any result. If you call stop() to a playing sound will result that this function will return true when invoked.
    Looped gets or sets if the sound has been started to play looped. If the sound is playing looped and it is changed to not-looped, then it will stop playing after the loop has finished. If it is not looped and changed to looped, the sound will start repeating to be played when it reaches its end. Invoking this method will not have an effect when the sound already has stopped.
    MaxDistance Sets the maximal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.
    MinDistance Sets the minimal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.
    Pan sets the pan of the sound. Takes a value between -1 and 1, 0 is center.
    Paused returns if the sound is paused
    PlaybackSpeed Sets or gets the playback speed (frequency) of the sound. Plays the sound at a higher or lower speed, increasing or decreasing its frequency which makes it sound lower or higher. Note that this feature is not available on all sound output drivers (it is on the DirectSound drivers at least), and it does not work together with the 'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when using DirectSound.
    PlayLength Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support length reporting or it is a file stream of unknown size. Note: You can also use ISoundSource::getPlayLength() to get the length of a sound without actually needing to play it.
    PlayPosition returns or sets the current play position of the sound in milliseconds. Returns -1 if not implemented or possible for this sound for example because it already has been stopped and freed internally or similar.
    Position sets the position of the sound in 3d space
    SoundEffectControl Returns the sound effect control interface for this sound. Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can be controlled using this. This can be null if the sound has not been started with the flag 'enableSoundEffects' or the driver doesn't support effects.
    Velocity sets or returns the velocity of the sound in 3d space, needed for Doppler effects. To use doppler effects use ISound::setVelocity to set a sounds velocity, ISoundEngine::setListenerPosition() to set the listeners velocity and ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing the doppler effects intensity.
    Volume returns volume of the sound, a value between 0 (mute) and 1 (full volume). (this volume gets multiplied with the master volume of the sound engine and other parameters like distance to listener when played as 3d sound)
    +
    +

    Public Instance Methods

    +
    + + + + + + + +
    Dispose 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    setSoundStopEventReceiverOverloaded. Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.
    Stop 
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMethods.html new file mode 100644 index 0000000..8501b5d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundMethods.html @@ -0,0 +1,71 @@ + + + + + ISound Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound Methods

    +
    +
    +
    +

    The methods of the ISound class are listed below. For a complete list of ISound class members, see the ISound Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + +
    Dispose 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    setSoundStopEventReceiverOverloaded. Sets the sound stop event receiver, an interface which gets called if a sound has finished playing.
    Stop 
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundProperties.html new file mode 100644 index 0000000..643c308 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundProperties.html @@ -0,0 +1,61 @@ + + + + + ISound Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISound Properties

    +
    +
    +
    +

    The properties of the ISound class are listed below. For a complete list of ISound class members, see the ISound Members topic.

    +

    Public Instance Properties

    +
    + + + + + + + + + + + + + +
    Finished returns if the sound has finished playing. Don't mix this up with isPaused(). isFinished() returns if the sound has been finished playing. If it has, is maybe already have been removed from the playing list of the sound engine and calls to any other of the methods of ISound will not have any result. If you call stop() to a playing sound will result that this function will return true when invoked.
    Looped gets or sets if the sound has been started to play looped. If the sound is playing looped and it is changed to not-looped, then it will stop playing after the loop has finished. If it is not looped and changed to looped, the sound will start repeating to be played when it reaches its end. Invoking this method will not have an effect when the sound already has stopped.
    MaxDistance Sets the maximal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.
    MinDistance Sets the minimal distance if this is a 3D sound. Specify the distances at which 3D sounds stop getting louder or quieter. This works like this: As a listener approaches a 3D sound source, the sound gets louder. Past a certain point, it is not reasonable for the volume to continue to increase. Either the maximum (zero) has been reached, or the nature of the sound source imposes a logical limit. This is the minimum distance for the sound source. Similarly, the maximum distance for a sound source is the distance beyond which the sound does not get any quieter. The default minimum distance is 1, the default max distance is a huge number nearly to infinite.
    Pan sets the pan of the sound. Takes a value between -1 and 1, 0 is center.
    Paused returns if the sound is paused
    PlaybackSpeed Sets or gets the playback speed (frequency) of the sound. Plays the sound at a higher or lower speed, increasing or decreasing its frequency which makes it sound lower or higher. Note that this feature is not available on all sound output drivers (it is on the DirectSound drivers at least), and it does not work together with the 'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when using DirectSound.
    PlayLength Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support length reporting or it is a file stream of unknown size. Note: You can also use ISoundSource::getPlayLength() to get the length of a sound without actually needing to play it.
    PlayPosition returns or sets the current play position of the sound in milliseconds. Returns -1 if not implemented or possible for this sound for example because it already has been stopped and freed internally or similar.
    Position sets the position of the sound in 3d space
    SoundEffectControl Returns the sound effect control interface for this sound. Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can be controlled using this. This can be null if the sound has not been started with the flag 'enableSoundEffects' or the driver doesn't support effects.
    Velocity sets or returns the velocity of the sound in 3d space, needed for Doppler effects. To use doppler effects use ISound::setVelocity to set a sounds velocity, ISoundEngine::setListenerPosition() to set the listeners velocity and ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing the doppler effects intensity.
    Volume returns volume of the sound, a value between 0 (mute) and 1 (full volume). (this volume gets multiplied with the master volume of the sound engine and other parameters like distance to listener when played as 3d sound)
    +
    +

    See Also

    +

    + ISound Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.AudioFormat.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.AudioFormat.html new file mode 100644 index 0000000..f7a9fef --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.AudioFormat.html @@ -0,0 +1,56 @@ + + + + + AudioFormat Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.AudioFormat Property

    +
    +
    +
    +

    Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc. Returns the structure filled with 0 or negative values if not known for this sound for example because because the file could not be opened or similar. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.

    +
    + [Visual Basic] +
    Public ReadOnly Property AudioFormat As AudioFormat
    +
    + [C#] +
    public AudioFormat AudioFormat {get;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMaxDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMaxDistance.html new file mode 100644 index 0000000..9146c9e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMaxDistance.html @@ -0,0 +1,56 @@ + + + + + DefaultMaxDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.DefaultMaxDistance Property

    +
    +
    +
    +

    Sets or gets the default maximal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().

    +
    + [Visual Basic] +
    Public Property DefaultMaxDistance As Single
    +
    + [C#] +
    public float DefaultMaxDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMinDistance.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMinDistance.html new file mode 100644 index 0000000..bc3926d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultMinDistance.html @@ -0,0 +1,56 @@ + + + + + DefaultMinDistance Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.DefaultMinDistance Property

    +
    +
    +
    +

    Sets or gets the default minimal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().

    +
    + [Visual Basic] +
    Public Property DefaultMinDistance As Single
    +
    + [C#] +
    public float DefaultMinDistance {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultVolume.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultVolume.html new file mode 100644 index 0000000..4684787 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.DefaultVolume.html @@ -0,0 +1,56 @@ + + + + + DefaultVolume Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.DefaultVolume Property

    +
    +
    +
    +

    Sets or gets the default volume for a sound played from this source. The default value of this is 1.0f. Note that the default volume is being multiplied with the master volume of ISoundEngine, change this via ISoundEngine::setSoundVolume(). The volume is a value between 0 (silent) and 1.0f (full volume).

    +
    + [Visual Basic] +
    Public Property DefaultVolume As Single
    +
    + [C#] +
    public float DefaultVolume {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Dispose.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Dispose.html new file mode 100644 index 0000000..08331ac --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Dispose.html @@ -0,0 +1,59 @@ + + + + + ISoundSource.Dispose Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.Dispose Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overrides Public Sub Dispose() _
        Implements IDisposable.Dispose
    +
    + [C#] +
    public override void Dispose();
    +

    Implements

    +

    + IDisposable.Dispose +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Finalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Finalize.html new file mode 100644 index 0000000..7e84611 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Finalize.html @@ -0,0 +1,54 @@ + + + + + ISoundSource.Finalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.Finalize Method 

    +
    +
    +
    +

    Destructor

    +
    + [Visual Basic] +
    Overrides Protected Sub Finalize()
    +
    + [C#] +
    protected override void Finalize();
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForceReloadAtNextUse.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForceReloadAtNextUse.html new file mode 100644 index 0000000..c02ebaf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForceReloadAtNextUse.html @@ -0,0 +1,54 @@ + + + + + ISoundSource.ForceReloadAtNextUse Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.ForceReloadAtNextUse Method 

    +
    +
    +
    +

    Forces the sound to be reloaded at next replay. Sounds which are not played as streams are buffered to make it possible to replay them without much overhead. If the sound file is altered after the sound has been played the first time, the engine won't play the changed file then. Calling this method makes the engine reload the file before the file is played the next time.

    +
    + [Visual Basic] +
    Public Sub ForceReloadAtNextUse()
    +
    + [C#] +
    public void ForceReloadAtNextUse();
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForcedStreamingThreshold.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForcedStreamingThreshold.html new file mode 100644 index 0000000..691cc22 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.ForcedStreamingThreshold.html @@ -0,0 +1,57 @@ + + + + + ForcedStreamingThreshold Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.ForcedStreamingThreshold Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Property ForcedStreamingThreshold As Integer
    +
    + [C#] +
    public int ForcedStreamingThreshold {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.IsSeekingSupported.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.IsSeekingSupported.html new file mode 100644 index 0000000..b3c71da --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.IsSeekingSupported.html @@ -0,0 +1,56 @@ + + + + + IsSeekingSupported Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.IsSeekingSupported Property

    +
    +
    +
    +

    Returns if sounds played from this source will support seeking via ISound::setPlayPosition(). If a sound is seekable depends on the file type and the audio format. For example MOD files cannot be seeked currently. Returns true of the sound source supports setPlayPosition() and false if not. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the information from there, so this call could take a bit depending on the type of file.

    +
    + [Visual Basic] +
    Public ReadOnly Property IsSeekingSupported As Boolean
    +
    + [C#] +
    public bool IsSeekingSupported {get;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Name.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Name.html new file mode 100644 index 0000000..7dd04e7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.Name.html @@ -0,0 +1,56 @@ + + + + + Name Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.Name Property

    +
    +
    +
    +

    Returns the name of the sound source (usually, this is the file name)

    +
    + [Visual Basic] +
    Public ReadOnly Property Name As String
    +
    + [C#] +
    public string Name {get;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.PlayLength.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.PlayLength.html new file mode 100644 index 0000000..38e7cf8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.PlayLength.html @@ -0,0 +1,56 @@ + + + + + PlayLength Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.PlayLength Property

    +
    +
    +
    +

    Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support lenght reporting or it is a file stream of unknown size. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.

    +
    + [Visual Basic] +
    Public ReadOnly Property PlayLength As UInt32
    +
    + [C#] +
    public uint PlayLength {get;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.SampleData.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.SampleData.html new file mode 100644 index 0000000..f38db9f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.SampleData.html @@ -0,0 +1,57 @@ + + + + + SampleData Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.SampleData Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property SampleData As Byte()
    +
    + [C#] +
    public byte[] SampleData {get;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.StreamMode.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.StreamMode.html new file mode 100644 index 0000000..9452443 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.StreamMode.html @@ -0,0 +1,56 @@ + + + + + StreamMode Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.StreamMode Property

    +
    +
    +
    +

    Sets or returns the stream mode which is used for a sound played from this source. Note that if this is set to ESM_NO_STREAMING, the engine still might decide to stream the sound if it is too big. The threashold for this can be adjusted using ISoundSource::setForcedStreamingThreshold(). Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the sound has been played the first time.

    +
    + [Visual Basic] +
    Public Property StreamMode As StreamMode
    +
    + [C#] +
    public StreamMode StreamMode {get; set;}
    +

    +

    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.getNativeSoundSource.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.getNativeSoundSource.html new file mode 100644 index 0000000..ec62f6b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.getNativeSoundSource.html @@ -0,0 +1,54 @@ + + + + + ISoundSource.getNativeSoundSource Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource.getNativeSoundSource Method 

    +
    +
    +
    +

    for internal use only

    +
    + [Visual Basic] +
    Public Function getNativeSoundSource() As ISoundSource*
    +
    + [C#] +
    public ISoundSource* getNativeSoundSource();
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.html new file mode 100644 index 0000000..c71263b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSource.html @@ -0,0 +1,67 @@ + + + + + ISoundSource Class + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource Class

    +
    +
    +
    +

    A sound source describes an input file (.ogg, .mp3 or .wav) and its default settings. It provides some informations about the sound source like the play lenght and can have default settings for volume, distances for 3d etc.

    +

    For a list of all members of this type, see ISoundSource Members.

    +

    + System.Object +
       IrrKlang.ISoundSource

    +
    + [Visual Basic] +
    Public Class ISoundSource
        Implements IDisposable
    +
    + [C#] +
    public class ISoundSource : IDisposable
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISoundSource Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceConstructor.html new file mode 100644 index 0000000..cb8cde5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceConstructor.html @@ -0,0 +1,51 @@ + + + + + ISoundSource Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource Constructor 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Sub New( _
       ByVal nativeSound As ISoundSource*, _
       ByVal nativeEngine As ISoundEngine* _
    )
    +
    + [C#] +
    public ISoundSource(
       ISoundSource* nativeSound,
       ISoundEngine* nativeEngine
    );
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMembers.html new file mode 100644 index 0000000..a486221 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMembers.html @@ -0,0 +1,105 @@ + + + + + ISoundSource Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource Members +

    +
    +
    +
    +

    + ISoundSource overview +

    +

    Public Instance Constructors

    +
    + + + + + +
    + + ISoundSource Constructor + +
    +
    +

    Public Instance Properties

    +
    + + + + + + + + + + +
    AudioFormat Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc. Returns the structure filled with 0 or negative values if not known for this sound for example because because the file could not be opened or similar. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.
    DefaultMaxDistance Sets or gets the default maximal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().
    DefaultMinDistance Sets or gets the default minimal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
    DefaultVolume Sets or gets the default volume for a sound played from this source. The default value of this is 1.0f. Note that the default volume is being multiplied with the master volume of ISoundEngine, change this via ISoundEngine::setSoundVolume(). The volume is a value between 0 (silent) and 1.0f (full volume).
    ForcedStreamingThreshold 
    IsSeekingSupported Returns if sounds played from this source will support seeking via ISound::setPlayPosition(). If a sound is seekable depends on the file type and the audio format. For example MOD files cannot be seeked currently. Returns true of the sound source supports setPlayPosition() and false if not. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the information from there, so this call could take a bit depending on the type of file.
    Name Returns the name of the sound source (usually, this is the file name)
    PlayLength Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support lenght reporting or it is a file stream of unknown size. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.
    SampleData 
    StreamMode Sets or returns the stream mode which is used for a sound played from this source. Note that if this is set to ESM_NO_STREAMING, the engine still might decide to stream the sound if it is too big. The threashold for this can be adjusted using ISoundSource::setForcedStreamingThreshold(). Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the sound has been played the first time.
    +
    +

    Public Instance Methods

    +
    + + + + + + + +
    Dispose 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    ForceReloadAtNextUse Forces the sound to be reloaded at next replay. Sounds which are not played as streams are buffered to make it possible to replay them without much overhead. If the sound file is altered after the sound has been played the first time, the engine won't play the changed file then. Calling this method makes the engine reload the file before the file is played the next time.
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    getNativeSoundSource for internal use only
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMethods.html new file mode 100644 index 0000000..05b3d86 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceMethods.html @@ -0,0 +1,71 @@ + + + + + ISoundSource Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource Methods

    +
    +
    +
    +

    The methods of the ISoundSource class are listed below. For a complete list of ISoundSource class members, see the ISoundSource Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + +
    Dispose 
    Equals (inherited from Object) + Determines whether the specified Object is equal to the current Object. +
    ForceReloadAtNextUse Forces the sound to be reloaded at next replay. Sounds which are not played as streams are buffered to make it possible to replay them without much overhead. If the sound file is altered after the sound has been played the first time, the engine won't play the changed file then. Calling this method makes the engine reload the file before the file is played the next time.
    GetHashCode (inherited from Object) + Serves as a hash function for a particular type, suitable for use in hashing algorithms and data structures like a hash table. +
    getNativeSoundSource for internal use only
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from Object) + Returns a String that represents the current Object. +
    +
    +

    Protected Instance Methods

    +
    + + +
    Finalize Destructor
    MemberwiseClone (inherited from Object) + Creates a shallow copy of the current Object. +
    +
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceProperties.html new file mode 100644 index 0000000..4da8179 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundSourceProperties.html @@ -0,0 +1,58 @@ + + + + + ISoundSource Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundSource Properties

    +
    +
    +
    +

    The properties of the ISoundSource class are listed below. For a complete list of ISoundSource class members, see the ISoundSource Members topic.

    +

    Public Instance Properties

    +
    + + + + + + + + + + +
    AudioFormat Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc. Returns the structure filled with 0 or negative values if not known for this sound for example because because the file could not be opened or similar. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.
    DefaultMaxDistance Sets or gets the default maximal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMaxDistance() for details about what the max distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMaxDistance() and ISound::setMaxDistance().
    DefaultMinDistance Sets or gets the default minimal distance for 3D sounds played from this source. This value influences how loud a sound is heard based on its distance. See ISound::setMinDistance() for details about what the min distance is. This method only influences the initial distance value of sounds. For changing the distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance().
    DefaultVolume Sets or gets the default volume for a sound played from this source. The default value of this is 1.0f. Note that the default volume is being multiplied with the master volume of ISoundEngine, change this via ISoundEngine::setSoundVolume(). The volume is a value between 0 (silent) and 1.0f (full volume).
    ForcedStreamingThreshold 
    IsSeekingSupported Returns if sounds played from this source will support seeking via ISound::setPlayPosition(). If a sound is seekable depends on the file type and the audio format. For example MOD files cannot be seeked currently. Returns true of the sound source supports setPlayPosition() and false if not. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the information from there, so this call could take a bit depending on the type of file.
    Name Returns the name of the sound source (usually, this is the file name)
    PlayLength Returns the play length of the sound in milliseconds. Returns -1 if not known for this sound for example because its decoder does not support lenght reporting or it is a file stream of unknown size. Note: If the sound never has been played before, the sound engine will have to open the file and try to get the play lenght from there, so this call could take a bit depending on the type of file.
    SampleData 
    StreamMode Sets or returns the stream mode which is used for a sound played from this source. Note that if this is set to ESM_NO_STREAMING, the engine still might decide to stream the sound if it is too big. The threashold for this can be adjusted using ISoundSource::setForcedStreamingThreshold(). Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the sound has been played the first time.
    +
    +

    See Also

    +

    + ISoundSource Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.OnSoundStopped.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.OnSoundStopped.html new file mode 100644 index 0000000..bc5eb7b --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.OnSoundStopped.html @@ -0,0 +1,56 @@ + + + + + ISoundStopEventReceiver.OnSoundStopped Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundStopEventReceiver.OnSoundStopped Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Sub OnSoundStopped( _
       ByVal sound As ISound, _
       ByVal reason As StopEventCause, _
       ByVal userData As Object _
    )
    +
    + [C#] +
    + void OnSoundStopped(
       ISound sound,
       StopEventCause reason,
       object userData
    );
    +

    See Also

    +

    + ISoundStopEventReceiver Interface | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.html new file mode 100644 index 0000000..31efe00 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiver.html @@ -0,0 +1,62 @@ + + + + + ISoundStopEventReceiver Interface + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundStopEventReceiver Interface

    +
    +
    +
    +

    Interface to be implemented by the user, which recieves sound stop events. The interface has only one method to be implemented by the user: OnSoundStopped(). Implement this interface and set it via ISound::setSoundStopEventReceiver(). The sound stop event is guaranteed to be called when a sound or sound stream is finished, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.

    +

    For a list of all members of this type, see ISoundStopEventReceiver Members.

    +

    +

    +
    + [Visual Basic] +
    Public Interface ISoundStopEventReceiver
    +
    + [C#] +
    public interface ISoundStopEventReceiver
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + ISoundStopEventReceiver Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMembers.html new file mode 100644 index 0000000..95c8230 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMembers.html @@ -0,0 +1,56 @@ + + + + + ISoundStopEventReceiver Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundStopEventReceiver Members +

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMethods.html new file mode 100644 index 0000000..a1eeac7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.ISoundStopEventReceiverMethods.html @@ -0,0 +1,49 @@ + + + + + ISoundStopEventReceiver Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    ISoundStopEventReceiver Methods

    +
    +
    +
    +

    The methods of the ISoundStopEventReceiver interface are listed below. For a complete list of ISoundStopEventReceiver interface members, see the ISoundStopEventReceiver Members topic.

    +

    Public Instance Methods

    + +

    See Also

    +

    + ISoundStopEventReceiver Interface | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SampleFormat.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SampleFormat.html new file mode 100644 index 0000000..f52b1cf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SampleFormat.html @@ -0,0 +1,81 @@ + + + + + SampleFormat Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    SampleFormat Enumeration

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Enum SampleFormat
    +
    + [C#] +
    public enum SampleFormat
    +
    +

    Members

    +
    + + + + + + +
    Member NameDescription
    Signed16Bit 
    Unsigned8Bit 
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundDeviceListType.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundDeviceListType.html new file mode 100644 index 0000000..8eee1d9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundDeviceListType.html @@ -0,0 +1,80 @@ + + + + + SoundDeviceListType Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    SoundDeviceListType Enumeration

    +
    +
    +
    +

    type of a sound device list

    +
    + [Visual Basic] +
    Public Enum SoundDeviceListType
    +
    + [C#] +
    public enum SoundDeviceListType
    +
    +

    Members

    +
    + + + + + + +
    Member NameDescription
    RecordingDevice type of a sound device list
    PlaybackDevice type of a sound device list
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundEngineOptionFlag.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundEngineOptionFlag.html new file mode 100644 index 0000000..b5fe857 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundEngineOptionFlag.html @@ -0,0 +1,110 @@ + + + + + SoundEngineOptionFlag Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    SoundEngineOptionFlag Enumeration

    +
    +
    +
    +

    An enumeration for all options for starting up the sound engine When using createSoundEngine, use a combination of this these options parameter to start up the engine.

    +
    + [Visual Basic] +
    Public Enum SoundEngineOptionFlag
    +
    + [C#] +
    public enum SoundEngineOptionFlag
    +
    +

    Members

    +
    + + + + + + + + + + + + +
    Member NameDescription
    DefaultOptions Default parameters when starting up the engine. A combination of MultiThreaded | LoadPlugins | Use3DBuffers | PrintDebugInfoIntoDebugger
    LinearRolloff If specified, instead of the default logarithmic one, irrKlang will use a linear rolloff model which influences the attenuation of the sounds over distance. The volume is interpolated linearly between the MinDistance and MaxDistance, making it possible to adjust sounds more easily although this is not physically correct. Note that this option may not work when used together with the Use3DBuffers option when using Direct3D for example, irrKlang will then turn off Use3DBuffers automaticly to be able to use this option and write out a warning.
    PrintDebugInfoToStdOut 
    PrintDebugInfoIntoDebugger In addition to printing debug info to stdout, irrKlang will print debug info to any windows debugger supporting OutputDebugString() (like VisualStudio). This is pretty useful if your application does not capture any console output.
    Use3DBuffers Uses 3D sound buffers instead of emulating them when playing 3d sounds (default). If this flag is not specified, all buffers will by created in 2D only and 3D positioning will be emulated in software, making the engine run faster if hardware 3d audio is slow on the system.
    LoadPlugins Automaticly loads external plugins when starting up. Plugins usually are .dll files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which are executed after the startup of the sound engine and modify it for example to make it possible to play back mp3 files. Plugins are being loaded from the current working directory as well as from the position where the .exe using the irrKlang library resides.
    MuteIfNotFocused If the window of the application doesn't have the focus, irrKlang will be silent if this has been set. This will only work when irrKlang is using the DirectSound output driver.
    MultiThreaded If specified (default), it will make irrKlang run in a separate thread, updating all streams, sounds, 3d positions and whatever automaticly. You also don't need to call ISoundEngine::update() if irrKlang is running multithreaded. However, if you want to run irrKlang in the same thread as your application (for easier debugging for example), don't set this. But you need to call ISoundEngine::update() as often as you can (at least about 2-3 times per second) to make irrKlang update everything correctly then.
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundOutputDriver.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundOutputDriver.html new file mode 100644 index 0000000..11fbf70 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.SoundOutputDriver.html @@ -0,0 +1,105 @@ + + + + + SoundOutputDriver Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    SoundOutputDriver Enumeration

    +
    +
    +
    +

    An enum for all types of output drivers irrKlang supports.

    +
    + [Visual Basic] +
    Public Enum SoundOutputDriver
    +
    + [C#] +
    public enum SoundOutputDriver
    +
    +

    Members

    +
    + + + + + + + + + + + +
    Member NameDescription
    NullDriver Null driver, creating no sound output
    CoreAudio Core Audio sound output driver, mac os only
    ALSA ALSA sound output driver, linux only
    WinMM WinMM sound output driver, windows only
    DirectSound DirectSound sound output driver, windows only
    DirectSound8 DirectSound8 sound output driver, windows only
    AutoDetect An enum for all types of output drivers irrKlang supports.
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StopEventCause.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StopEventCause.html new file mode 100644 index 0000000..7f8f3d1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StopEventCause.html @@ -0,0 +1,85 @@ + + + + + StopEventCause Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    StopEventCause Enumeration

    +
    +
    +
    +

    An enumeration listing all reasons for a fired sound stop event

    +
    + [Visual Basic] +
    Public Enum StopEventCause
    +
    + [C#] +
    public enum StopEventCause
    +
    +

    Members

    +
    + + + + + + + +
    Member NameDescription
    SoundStoppedBySourceRemoval The sound was stopped because its sound source was removed or the engine was shut down
    SoundStoppedByUser The sound was stopped because the user called ISound::stop().
    SoundFinishedPlaying The sound finished playing.
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarder.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarder.html new file mode 100644 index 0000000..2919264 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarder.html @@ -0,0 +1,67 @@ + + + + + StreamForwarder Structure + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    StreamForwarder Structure

    +
    +
    +
    +

    Internal class, do not use.

    +

    For a list of all members of this type, see StreamForwarder Members.

    +

    + System.Object +
       System.ValueType
          IrrKlang.StreamForwarder

    +
    + [Visual Basic] +
    Public Structure StreamForwarder
    +
    + [C#] +
    public struct StreamForwarder
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + StreamForwarder Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarderMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarderMembers.html new file mode 100644 index 0000000..764df8c --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamForwarderMembers.html @@ -0,0 +1,67 @@ + + + + + StreamForwarder Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    StreamForwarder Members +

    +
    +
    +
    +

    + StreamForwarder overview +

    +

    Public Instance Methods

    +
    + + + + +
    Equals (inherited from ValueType) + Indicates whether this instance and a specified object are equal. +
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetType (inherited from Object) + Gets the Type of the current instance. +
    ToString (inherited from ValueType) + Returns the fully qualified type name of this instance. +
    +
    +

    See Also

    +

    + StreamForwarder Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamMode.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamMode.html new file mode 100644 index 0000000..0695eb3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.StreamMode.html @@ -0,0 +1,85 @@ + + + + + StreamMode Enumeration + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    StreamMode Enumeration

    +
    +
    +
    +

    An enum for all types of output stream modes

    +
    + [Visual Basic] +
    Public Enum StreamMode
    +
    + [C#] +
    public enum StreamMode
    +
    +

    Members

    +
    + + + + + + + +
    Member NameDescription
    NoStreaming An enum for all types of output stream modes
    Streaming An enum for all types of output stream modes
    AutoDetect Autodetects the best sound driver for the system
    +
    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + IrrKlang Namespace +

    + + + + + + + + + + + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.CrossProduct.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.CrossProduct.html new file mode 100644 index 0000000..6e639fe --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.CrossProduct.html @@ -0,0 +1,63 @@ + + + + + Vector3D.CrossProduct Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.CrossProduct Method 

    +
    +
    +
    +

    Returns cross product with an other vector

    +
    + [Visual Basic] +
    Public Function CrossProduct( _
       ByVal p As Vector3D _
    ) As Vector3D
    +
    + [C#] +
    public Vector3D CrossProduct(
       Vector3D p
    );
    +

    Parameters

    +
    +
    + p +
    +
    other vector
    +
    +

    Return Value

    +

    cross product

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.DotProduct.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.DotProduct.html new file mode 100644 index 0000000..82befbc --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.DotProduct.html @@ -0,0 +1,54 @@ + + + + + Vector3D.DotProduct Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.DotProduct Method 

    +
    +
    +
    +

    Returns the dot product with another vector.

    +
    + [Visual Basic] +
    Public Function DotProduct( _
       ByVal other As Vector3D _
    ) As Single
    +
    + [C#] +
    public float DotProduct(
       Vector3D other
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Equals.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Equals.html new file mode 100644 index 0000000..6ce3a24 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Equals.html @@ -0,0 +1,54 @@ + + + + + Vector3D.Equals Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Equals Method 

    +
    +
    +
    +

    Compares the vector to another vector.

    +
    + [Visual Basic] +
    Overrides Public Function Equals( _
       ByVal rhs As Object _
    ) As Boolean
    +
    + [C#] +
    public override bool Equals(
       object rhs
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFrom.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFrom.html new file mode 100644 index 0000000..6bfb6af --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFrom.html @@ -0,0 +1,54 @@ + + + + + Vector3D.GetDistanceFrom Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.GetDistanceFrom Method 

    +
    +
    +
    +

    Returns distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.

    +
    + [Visual Basic] +
    Public Function GetDistanceFrom( _
       ByVal other As Vector3D _
    ) As Double
    +
    + [C#] +
    public double GetDistanceFrom(
       Vector3D other
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFromSQ.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFromSQ.html new file mode 100644 index 0000000..ce004c5 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetDistanceFromSQ.html @@ -0,0 +1,54 @@ + + + + + Vector3D.GetDistanceFromSQ Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.GetDistanceFromSQ Method 

    +
    +
    +
    +

    Returns squared distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.

    +
    + [Visual Basic] +
    Public Function GetDistanceFromSQ( _
       ByVal other As Vector3D _
    ) As Single
    +
    + [C#] +
    public float GetDistanceFromSQ(
       Vector3D other
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetInterpolated.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetInterpolated.html new file mode 100644 index 0000000..0f1fd49 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetInterpolated.html @@ -0,0 +1,65 @@ + + + + + Vector3D.GetInterpolated Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.GetInterpolated Method 

    +
    +
    +
    +

    returns interpolated vector

    +
    + [Visual Basic] +
    Public Function GetInterpolated( _
       ByVal other As Vector3D, _
       ByVal d As Single _
    ) As Vector3D
    +
    + [C#] +
    public Vector3D GetInterpolated(
       Vector3D other,
       float d
    );
    +

    Parameters

    +
    +
    + other +
    +
    other vector to interpolate between
    +
    + d +
    +
    value between 0.0f and 1.0f.
    +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLength.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLength.html new file mode 100644 index 0000000..4d8851d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLength.html @@ -0,0 +1,54 @@ + + + + + Vector3D.GetLength Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.GetLength Method 

    +
    +
    +
    +

    Returns length of the vector.

    +
    + [Visual Basic] +
    Public Function GetLength() As Double
    +
    + [C#] +
    public double GetLength();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLengthSQ.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLengthSQ.html new file mode 100644 index 0000000..815de6a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.GetLengthSQ.html @@ -0,0 +1,54 @@ + + + + + Vector3D.GetLengthSQ Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.GetLengthSQ Method 

    +
    +
    +
    +

    Returns squared length of the vector. This is useful because it is much faster then GetLength().

    +
    + [Visual Basic] +
    Public Function GetLengthSQ() As Double
    +
    + [C#] +
    public double GetLengthSQ();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Invert.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Invert.html new file mode 100644 index 0000000..2d61ab1 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Invert.html @@ -0,0 +1,54 @@ + + + + + Vector3D.Invert Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Invert Method 

    +
    +
    +
    +

    Inverts the vector.

    +
    + [Visual Basic] +
    Public Sub Invert()
    +
    + [C#] +
    public void Invert();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.IsBetweenPoints.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.IsBetweenPoints.html new file mode 100644 index 0000000..7d7b1d3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.IsBetweenPoints.html @@ -0,0 +1,67 @@ + + + + + Vector3D.IsBetweenPoints Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.IsBetweenPoints Method 

    +
    +
    +
    +

    Returns if the point represented by this vector is between to points

    +
    + [Visual Basic] +
    Public Function IsBetweenPoints( _
       ByVal begin As Vector3D, _
       ByVal end As Vector3D _
    ) As Boolean
    +
    + [C#] +
    public bool IsBetweenPoints(
       Vector3D begin,
       Vector3D end
    );
    +

    Parameters

    +
    +
    + begin +
    +
    Start point of line
    +
    + end +
    +
    End point of line
    +
    +

    Return Value

    +

    True if between points, false if not.

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Length.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Length.html new file mode 100644 index 0000000..ff28736 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Length.html @@ -0,0 +1,57 @@ + + + + + Length Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Length Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property Length As Double
    +
    + [C#] +
    public double Length {get;}
    +

    +

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.LengthSQ.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.LengthSQ.html new file mode 100644 index 0000000..257b020 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.LengthSQ.html @@ -0,0 +1,57 @@ + + + + + LengthSQ Property + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.LengthSQ Property

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public ReadOnly Property LengthSQ As Double
    +
    + [C#] +
    public double LengthSQ {get;}
    +

    +

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Normalize.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Normalize.html new file mode 100644 index 0000000..cec6f99 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Normalize.html @@ -0,0 +1,54 @@ + + + + + Vector3D.Normalize Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Normalize Method 

    +
    +
    +
    +

    Normalizes the vector.

    +
    + [Visual Basic] +
    Public Function Normalize() As Vector3D
    +
    + [C#] +
    public Vector3D Normalize();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.SetLength.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.SetLength.html new file mode 100644 index 0000000..c7dd6cf --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.SetLength.html @@ -0,0 +1,54 @@ + + + + + Vector3D.SetLength Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.SetLength Method 

    +
    +
    +
    +

    Sets the lenght of the vector to a new value

    +
    + [Visual Basic] +
    Public Sub SetLength( _
       ByVal newlength As Single _
    )
    +
    + [C#] +
    public void SetLength(
       float newlength
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_1.html new file mode 100644 index 0000000..d674a6a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_1.html @@ -0,0 +1,55 @@ + + + + + Vector3D.Set Method (Vector3D) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Set Method (Vector3D)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub Set( _
       ByVal p As Vector3D _
    )
    +
    + [C#] +
    public void Set(
       Vector3D p
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3D.Set Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_2.html new file mode 100644 index 0000000..0fd026f --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overload_2.html @@ -0,0 +1,55 @@ + + + + + Vector3D.Set Method (Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Set Method (Single, Single, Single)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub Set( _
       ByVal nx As Single, _
       ByVal ny As Single, _
       ByVal nz As Single _
    )
    +
    + [C#] +
    public void Set(
       float nx,
       float ny,
       float nz
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3D.Set Overload List

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overloads.html new file mode 100644 index 0000000..9b0ba01 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Set_overloads.html @@ -0,0 +1,50 @@ + + + + + Set Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Set Method

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.ToString.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.ToString.html new file mode 100644 index 0000000..839a6ef --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.ToString.html @@ -0,0 +1,55 @@ + + + + + Vector3D.ToString Method + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.ToString Method 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overrides Public Function ToString() As String
    +
    + [C#] +
    public override string ToString();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.X.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.X.html new file mode 100644 index 0000000..08c8dfb --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.X.html @@ -0,0 +1,58 @@ + + + + + Vector3D.X Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.X Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public X As Single
    +
    + [C#] +
    public float X;
    +

    +

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Y.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Y.html new file mode 100644 index 0000000..6e57847 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Y.html @@ -0,0 +1,58 @@ + + + + + Vector3D.Y Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Y Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Y As Single
    +
    + [C#] +
    public float Y;
    +

    +

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Z.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Z.html new file mode 100644 index 0000000..0e144f8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.Z.html @@ -0,0 +1,58 @@ + + + + + Vector3D.Z Field + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D.Z Field +

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Public Z As Single
    +
    + [C#] +
    public float Z;
    +

    +

    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.html new file mode 100644 index 0000000..34f9ce0 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.html @@ -0,0 +1,67 @@ + + + + + Vector3D Structure + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Structure

    +
    +
    +
    +

    3d vector class with lots of operators and methods. This class has been ported directly from the native C++ Irrlicht Engine, so it may not be 100% complete yet and the design may not be 100% .NET like.

    +

    For a list of all members of this type, see Vector3D Members.

    +

    + System.Object +
       System.ValueType
          IrrKlang.Vector3D

    +
    + [Visual Basic] +
    Public Structure Vector3D
    +
    + [C#] +
    public struct Vector3D
    +
    +

    Thread Safety

    +

    Public static (Shared in Visual Basic) members of this type are + safe for multithreaded operations. Instance members are not guaranteed to be + thread-safe.

    +

    Requirements

    +

    + Namespace: + IrrKlang +

    +

    + Assembly: irrKlang.NET (in irrKlang.NET.dll) +

    +

    See Also

    +

    + Vector3D Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Addition.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Addition.html new file mode 100644 index 0000000..0253b4a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Addition.html @@ -0,0 +1,48 @@ + + + + + Vector3D Addition Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Addition Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Addition(o1, o2)
    +
    + [C#] +
    public static Vector3D operator +(
       Vector3D o1,
       Vector3D o2
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Division.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Division.html new file mode 100644 index 0000000..3730821 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Division.html @@ -0,0 +1,48 @@ + + + + + Vector3D Division Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Division Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Division(o, scal)
    +
    + [C#] +
    public static Vector3D operator /(
       Vector3D o,
       float scal
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Equality.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Equality.html new file mode 100644 index 0000000..829fb2d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Equality.html @@ -0,0 +1,48 @@ + + + + + Vector3D Equality Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Equality Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Equality(o1, o2)
    +
    + [C#] +
    public static bool operator ==(
       Vector3D o1,
       Vector3D o2
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_1.html new file mode 100644 index 0000000..dfdc913 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_1.html @@ -0,0 +1,48 @@ + + + + + Vector3D Multiplication Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Multiplication Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Multiply(scal, o)
    +
    + [C#] +
    public static Vector3D operator *(
       float scal,
       ref Vector3D o
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3DMultiplication Operator Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_2.html new file mode 100644 index 0000000..eb69be9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overload_2.html @@ -0,0 +1,48 @@ + + + + + Vector3D Multiplication Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Multiplication Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Multiply(o, scal)
    +
    + [C#] +
    public static Vector3D operator *(
       Vector3D o,
       float scal
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3DMultiplication Operator Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overloads.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overloads.html new file mode 100644 index 0000000..967e333 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Multiply_overloads.html @@ -0,0 +1,50 @@ + + + + + Vector3D Multiplication Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Multiplication Operator

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Subtraction.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Subtraction.html new file mode 100644 index 0000000..3f2076e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3D.op_Subtraction.html @@ -0,0 +1,48 @@ + + + + + Vector3D Subtraction Operator + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Subtraction Operator 

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    + returnValue = Vector3D.op_Subtraction(o1, o2)
    +
    + [C#] +
    public static Vector3D operator -(
       Vector3D o1,
       Vector3D o2
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor.html new file mode 100644 index 0000000..a511b44 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor.html @@ -0,0 +1,54 @@ + + + + + Vector3D Constructor + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Constructor

    +
    +
    +
    +

    +

    +

    Overload List

    +

    Initializes a new instance of the Vector3D class.

    +
    + public Vector3D(); +
    +

     

    +
    + public Vector3D(float,float,float); +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor1.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor1.html new file mode 100644 index 0000000..cd5baca --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor1.html @@ -0,0 +1,47 @@ + + + + + Vector3D Constructor (Single, Single, Single) + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Constructor (Single, Single, Single)

    +
    +
    +
    +

    +

    +
    + [Visual Basic] +
    Overloads Public Sub New( _
       ByVal nx As Single, _
       ByVal ny As Single, _
       ByVal nz As Single _
    )
    +
    + [C#] +
    public Vector3D(
       float nx,
       float ny,
       float nz
    );
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3D Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor2.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor2.html new file mode 100644 index 0000000..3fc3647 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DConstructor2.html @@ -0,0 +1,46 @@ + + + + + Vector3D Constructor () + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Constructor ()

    +
    +
    +
    +

    Initializes a new instance of the Vector3D class.

    +
    + [Visual Basic] +
    Overloads Public Sub New()
    +
    + [C#] +
    public Vector3D();
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace | Vector3D Constructor Overload List

    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DFields.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DFields.html new file mode 100644 index 0000000..d24a3a9 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DFields.html @@ -0,0 +1,51 @@ + + + + + Vector3D Fields + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Fields

    +
    +
    +
    +

    The fields of the Vector3D structure are listed below. For a complete list of Vector3D structure members, see the Vector3D Members topic.

    +

    Public Instance Fields

    +
    + + + +
    X 
    Y 
    Z 
    +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMembers.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMembers.html new file mode 100644 index 0000000..c4d110e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMembers.html @@ -0,0 +1,109 @@ + + + + + Vector3D Members + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Members +

    +
    +
    +
    +

    + Vector3D overview +

    +

    Public Static (Shared) Operators

    + +

    Public Instance Constructors

    +
    + + + + + +
    + + Vector3D + Overloaded. Initializes a new instance of the Vector3D class.
    +
    +

    Public Instance Fields

    +
    + + + +
    X 
    Y 
    Z 
    +
    +

    Public Instance Properties

    +
    + + +
    Length 
    LengthSQ 
    +
    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + +
    CrossProduct Returns cross product with an other vector
    DotProduct Returns the dot product with another vector.
    Equals Compares the vector to another vector.
    GetDistanceFrom Returns distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.
    GetDistanceFromSQ Returns squared distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetInterpolated returns interpolated vector
    GetLength Returns length of the vector.
    GetLengthSQ Returns squared length of the vector. This is useful because it is much faster then GetLength().
    GetType (inherited from Object) + Gets the Type of the current instance. +
    Invert Inverts the vector.
    IsBetweenPoints Returns if the point represented by this vector is between to points
    Normalize Normalizes the vector.
    SetOverloaded.  
    SetLength Sets the lenght of the vector to a new value
    ToString 
    +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMethods.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMethods.html new file mode 100644 index 0000000..a2ff24d --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DMethods.html @@ -0,0 +1,68 @@ + + + + + Vector3D Methods + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Methods

    +
    +
    +
    +

    The methods of the Vector3D structure are listed below. For a complete list of Vector3D structure members, see the Vector3D Members topic.

    +

    Public Instance Methods

    +
    + + + + + + + + + + + + + + + + +
    CrossProduct Returns cross product with an other vector
    DotProduct Returns the dot product with another vector.
    Equals Compares the vector to another vector.
    GetDistanceFrom Returns distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.
    GetDistanceFromSQ Returns squared distance from an other point. Here, the vector is interpreted as point in 3 dimensional space.
    GetHashCode (inherited from ValueType) + Returns the hash code for this instance. +
    GetInterpolated returns interpolated vector
    GetLength Returns length of the vector.
    GetLengthSQ Returns squared length of the vector. This is useful because it is much faster then GetLength().
    GetType (inherited from Object) + Gets the Type of the current instance. +
    Invert Inverts the vector.
    IsBetweenPoints Returns if the point represented by this vector is between to points
    Normalize Normalizes the vector.
    SetOverloaded.  
    SetLength Sets the lenght of the vector to a new value
    ToString 
    +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DOperators.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DOperators.html new file mode 100644 index 0000000..dd8ede7 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DOperators.html @@ -0,0 +1,53 @@ + + + + + Vector3D Operators + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Operators

    +
    +
    +
    +

    The operators of the Vector3D structure are listed below. For a complete list of Vector3D structure members, see the Vector3D Members topic.

    +

    Public Static (Shared) Operators

    + +

    See Also

    +

    + Vector3D Class | Vector3D Members | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DProperties.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DProperties.html new file mode 100644 index 0000000..c2e60d3 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.Vector3DProperties.html @@ -0,0 +1,50 @@ + + + + + Vector3D Properties + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    Vector3D Properties

    +
    +
    +
    +

    The properties of the Vector3D structure are listed below. For a complete list of Vector3D structure members, see the Vector3D Members topic.

    +

    Public Instance Properties

    +
    + + +
    Length 
    LengthSQ 
    +
    +

    See Also

    +

    + Vector3D Class | IrrKlang Namespace

    + + + + +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlang.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.html new file mode 100644 index 0000000..c332838 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlang.html @@ -0,0 +1,190 @@ + + + + + IrrKlang + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IrrKlang Namespace

    +
    +
    +
    +

    the main namespace where every class of the sound engine can be found

    +

    + Namespace hierarchy +

    +

    Classes

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ClassDescription
    + IAudioRecorder + Interface to an audio recorder.
    + ISound + Represents a sound which is currently played. You can stop the sound or change the volume or whatever using this interface. Don't create sounds using new ISound, this won't work anyway. You can get an instance of an ISonud class by calling ISoundEngine::Play2D or Play3D.
    + ISoundDeviceList + A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. The function createIrrKlangDevice() has a parameter 'deviceID' which takes the value returned by ISoundDeviceList::getDeviceID() and uses that device then. The list of devices in ISoundDeviceList usually also includes the default device which is the first entry and has an empty deviceID string ("") and the description "default device".*/
    + ISoundEffectControl + Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. Sound effects such as chorus, distorsions, echo, reverb and similar can be controlled using this. An instance of this interface can be obtained via ISound::getSoundEffectControl(). The sound containing this interface has to be started via ISoundEngine::play2D() or ISoundEngine::play3D() with the flag enableSoundEffects=true, otherwise no acccess to this interface will be available. For the DirectSound driver, these are effects available since DirectSound8. For most effects, sounds should have a sample rate of 44 khz and should be at least 150 milli seconds long for optimal quality when using the DirectSound driver.
    + ISoundEngine +  
    + ISoundSource + A sound source describes an input file (.ogg, .mp3 or .wav) and its default settings. It provides some informations about the sound source like the play lenght and can have default settings for volume, distances for 3d etc.
    +
    +

    Interfaces

    +
    + + + + + + + + + + + + + +
    InterfaceDescription
    + IFileFactory + Interface to overwrite opening files. Derive your own class from IFileFactory, overwrite the openFile() method and return your own System::IO::Stream to overwrite file access of irrKlang. Use ISoundEngine::addFileFactory() to let irrKlang know about your class. Example code can be found in the tutorial 04.OverrideFileAccess.
    + ISoundStopEventReceiver + Interface to be implemented by the user, which recieves sound stop events. The interface has only one method to be implemented by the user: OnSoundStopped(). Implement this interface and set it via ISound::setSoundStopEventReceiver(). The sound stop event is guaranteed to be called when a sound or sound stream is finished, either because the sound reached its playback end, its sound source was removed, ISoundEngine::stopAllSounds() has been called or the whole engine was deleted.
    +
    +

    Structures

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    StructureDescription
    + AudioFormat +  
    + EventForwarder + Internal class, do not use.
    + FileFactoryForwarder + Internal class, do not use.
    + StreamForwarder + Internal class, do not use.
    + Vector3D + 3d vector class with lots of operators and methods. This class has been ported directly from the native C++ Irrlicht Engine, so it may not be 100% complete yet and the design may not be 100% .NET like.
    +
    +

    Enumerations

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EnumerationDescription
    + SampleFormat +  
    + SoundDeviceListType + type of a sound device list
    + SoundEngineOptionFlag + An enumeration for all options for starting up the sound engine When using createSoundEngine, use a combination of this these options parameter to start up the engine.
    + SoundOutputDriver + An enum for all types of output drivers irrKlang supports.
    + StopEventCause + An enumeration listing all reasons for a fired sound stop event
    + StreamMode + An enum for all types of output stream modes
    +
    +
    + +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/IrrKlangHierarchy.html b/Thirdparty/irrKlang/doc/dotnet/IrrKlangHierarchy.html new file mode 100644 index 0000000..a1a2436 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/IrrKlangHierarchy.html @@ -0,0 +1,88 @@ + + + + + IrrKlangHierarchy + + + + + + +
    +
    + + + + + +
    IrrKlang.NET +
    +
    +
    +

    IrrKlang Hierarchy

    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/MSDN.css b/Thirdparty/irrKlang/doc/dotnet/MSDN.css new file mode 100644 index 0000000..11a962a --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/MSDN.css @@ -0,0 +1,405 @@ +body /* This body tag requires the use of one of the sets of banner and/or text div ids */ + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + background: #ffffff; + color: #000000; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 70%; + width: 100%; + /*overflow: expression('hidden');*/ + } +div#scrollyes /* Allows topic to scroll with correct margins. Cannot be used with running head banner */ + { /* Must immediately follow . */ + padding: 2px 15px 2px 22px; + width: 100%; + } +div#nsbanner /* Creates Nonscrolling banner region */ + { + position: relative; + left: 0px; + padding: 0px 0px 0px 0px; + border-bottom: 1px solid #999999; + /*width: expression(document.body.clientWidth);*/ + background-color: #99ccff; + } +div#nstext /* Creates the scrolling text area for Nonscrolling region topic */ + { + top: 0px; + padding: 5px 20px 0px 22px; + /*overflow: expression('auto'); + width: expression(document.body.clientWidth); + height: expression(document.body.clientHeight - nsbanner.offsetHeight);*/ + } +div#scrbanner /* Creates the running head bar in a full-scroll topic */ + { /* Allows topic to scroll. */ + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + border-bottom: 1px solid #999999; + } +div#scrtext /* Creates the text area in a full-scroll topic */ + { /* Allows topic to scroll. */ + padding: 0px 10px 0px 22px; + } +div#bannerrow1 /* provides full-width color to top row in running head (requires script) */ + { + } +div#titlerow /* provides non-scroll topic title area (requires script) */ + { + padding: 0px 10px 0px 22px; + } + +h1, h2, h3, h4 + { + font-family: Verdana, Arial, Helvetica, sans-serif; + margin-bottom: .4em; + margin-top: 1em; + font-weight: bold; + } +h1 + { + font-size: 120%; + margin-top: 0em; + } +div#scrollyes h1 /* Changes font size for full-scrolling topic */ + { + font-size: 150%; + } +h2 + { + font-size: 130%; + } +h3 + { + font-size: 115%; + } +h4 + { + font-size: 100%; + } +.dtH1, .dtH2, .dtH3, .dtH4 + { + margin-left: -18px; + } +div#titlerow h1 + { + margin-bottom: .2em + } + +table.bannerparthead, table.bannertitle /* General values for the Running Head tables */ + { + position: relative; + left: 0px; + top: 0px; + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; + width: 100%; + height: 21px; + border-collapse: collapse; + border-style: solid; + border-width: 0px; + background-color: #99ccff; + font-size: 100%; + } +table.bannerparthead td /* General Values for cells in the top row of running head */ + { + margin: 0px 0px 0px 0px; + padding: 2px 0px 0px 4px; + vertical-align: middle; + border-width: 0px; + border-style: solid; + border-color: #999999; + background: transparent; + font-style: italic; + font-weight: normal; + } +table.bannerparthead td.product /* Values for top right cell in running head */ + { /* Allows for a second text block in the running head */ + text-align: right; + padding: 2px 5px 0px 5px; + } +table.bannertitle td /* General Values for cells in the bottom row of running head */ + { + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 3px; + vertical-align: middle; + border-width: 0px 0px 1px 0px; + border-style: solid; + border-color: #999999; + background: transparent; + font-weight: bold; + } +td.button1 /* Values for button cells */ + { + width: 14px; + cursor: hand; + } + +p + { + margin: .5em 0em .5em 0em; + } +blockquote.dtBlock + { + margin: .5em 1.5em .5em 1.5em; + } +div#dtHoverText + { + color: #000066; + } +.normal + { + margin: .5em 0em .5em 0em; + } +.fineprint + { + font-size: 90%; /* 90% of 70% */ + } +.indent + { + margin: .5em 1.5em .5em 1.5em; + } +.topicstatus /* Topic Status Boilerplate class */ + { + display: block; + color: red; + } +p.label + { + margin-top: 1em; + } +p.labelproc + { + margin-top: 1em; + color: #000066; + } + +div.tablediv + { + width: 100%; /* Forces tables to have correct right margins and top spacing */ + margin-top: -.4em; + } +ol div.tablediv, ul div.tablediv, ol div.HxLinkTable, ul div.HxLinkTable + { + margin-top: 0em; /* Forces tables to have correct right margins and top spacing */ + } +table.dtTABLE + { + width: 100%; /* Forces tables to have correct right margin */ + margin-top: .6em; + margin-bottom: .3em; + border-width: 1px 1px 0px 0px; + border-style: solid; + border-color: #999999; + background-color: #999999; + font-size: 100%; /* Text in Table is same size as text outside table */ + } +table.dtTABLE th, table.dtTABLE td + { + border-style: solid; /* Creates the cell border and color */ + border-width: 0px 0px 1px 1px; + border-style: solid; + border-color: #999999; + padding: 4px 6px; + text-align: left; + } +table.dtTABLE th + { + background: #cccccc; /* Creates the shaded table header row */ + vertical-align: bottom; + } +table.dtTABLE td + { + background: #ffffff; + vertical-align: top; + } + +MSHelp\:ktable + { + disambiguator: span; + separator:  | + prefix: | + postfix:   + filterString: ; + } +div.HxLinkTable + { + width: auto; /* Forces tables to have correct right margins and top spacing */ + margin-top: -.4em; + visibility: visible; + } +ol div.HxLinkTable, ul div.HxLinkTable + { + margin-top: 0em; /* Forces tables to have correct right margins and top spacing */ + } +table.HxLinkTable /* Keep in sync with general table settings below */ + { + width: auto; + margin-top: 1.5em; + margin-bottom: .3em; + margin-left: -1em; + border-width: 1px 1px 0px 0px; + border-style: solid; + border-color: #999999; + background-color: #999999; + font-size: 100%; /* Text in Table is same size as text outside table */ + behavior:url(hxlinktable.htc); /* Attach the behavior to link elements. */ + } +table.HxLinkTable th, table.HxLinkTable td /* Keep in sync with general table settings below */ + { + border-style: solid; /* Creates the cell border and color */ + border-width: 0px 0px 1px 1px; + border-style: solid; + border-color: #999999; + padding: 4px 6px; + text-align: left; + } +table.HxLinkTable th /* Keep in sync with general table settings below */ + { + background: #cccccc; /* Creates the shaded table header row */ + vertical-align: bottom; + } +table.HxLinkTable td /* Keep in sync with general table settings below */ + { + background: #ffffff; + vertical-align: top; + } +pre.code + { + background-color: #eeeeee; + padding: 4px 6px 4px 6px; + } +pre, div.syntax + { + margin-top: .5em; + margin-bottom: .5em; + } +pre, code, .code, div.syntax + { + font: 100% Monospace, Courier New, Courier; /* This is 100% of 70% */ + color: #000066; + } +pre b, code b + { + letter-spacing: .1em; /* opens kerning on bold in Syntax/Code */ + } +pre.syntax, div.syntax + { + background: #cccccc; + padding: 4px 8px; + cursor: text; + margin-top: 1em; + margin-bottom: 1em; + color: #000000; + border-width: 1px; + border-style: solid; + border-color: #999999; +/* ------------------------------------- */ +/* BEGIN changes to dtue.css conventions */ + font-weight: bolder; + letter-spacing: .1em; + } +.syntax span.lang + { + margin: 0; + font-weight: normal; + } +.syntax span.meta + { + margin: 0; + font-weight: normal; + font-style: italic; + } +.syntax a + { + margin: 0; + font-weight: normal; + } +/* END changes to dtue.css conventions */ +/* ----------------------------------- */ + +.syntax div + { + padding-left: 24px; + text-indent: -24px; + } + +.syntax .attribute + { + font-weight: normal; + } +div.footer + { + font-style: italic; + } +div.footer hr + { + color: #999999; + height: 1px; + } + +ol, ul + { + margin: .5em 0em 0em 4em; + } +li + { + margin-bottom: .5em; + } +ul p, ol p, dl p + { + margin-left: 0em; + } +ul p.label, ol p.label + { + margin-top: .5em; + } + +dl + { + margin-top: 0em; + padding-left: 1px; /* Prevents italic-letter descenders from being cut off */ + } +dd + { + margin-bottom: 0em; + margin-left: 1.5em; + } +dt + { + margin-top: .5em; + } + +a:link + { + color: #0000ff; + } +a:visited + { + color: #0000ff; + } +a:hover + { + color: #3366ff; + } + +img + { + border: none; + } +table.dtTABLE td img + { + border: none; + vertical-align: top; + margin-right: 2px; + } +/* Not in dtue.css. Used by NDoc's "ShowMissing..." options. */ +.missing + { + color: Red; + font-weight: bold; + } +div.Hierarchy +{ + margin: 0.5em,0.0em,0.5em,1.0em; +} \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/contents.html b/Thirdparty/irrKlang/doc/dotnet/contents.html new file mode 100644 index 0000000..7f998fe --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/contents.html @@ -0,0 +1,1145 @@ + + + Contents + + + + + + +
    sync toc
    +
    +
    +
    + + Overview +
    +
    + + IrrKlang +
    + + + + +
    + + IFileFactory Interface +
    + +
    + + Methods +
    + +
    +
    +
    +
    + + +
    + + ISoundEffectControl Class +
    + + + +
    + + Methods +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + ISoundEngine Class +
    + + + +
    + + Methods +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/default.html b/Thirdparty/irrKlang/doc/dotnet/default.html new file mode 100644 index 0000000..40ea70e --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/default.html @@ -0,0 +1,97 @@ + + + + + irrKlang.NET API Documentation + + + + + + +
    +
    + + + + + +
    IrrKlang.NET
    +
    +
    +

    IrrKlang.NET documentation 

    +
    +
    + +
    +

    Welcome to the irrKlang Sound Engine API documentation. Here you'll find + any information you'll need to develop applications with the irrKlang Sound + Engine. If you look for a tutorial on how to start, take a look at the homepage + of the irrKlang sound Engine at www.ambiera.com/irrklang + or into the SDK in the directory \examples.net.
    +
    + The irrKlang library is intended to be an easy-to-use 3d and 2d sound engine, + so this documentation is an important part of it. If you have any questions + or suggestions, please take a look into the ambiera.com forum or just send + a mail.

    +

    Overview

    +

    This documentation is only about the .NET part of the engine, for languages + such as C#, VisualBasic.NET, Delphi.NET and similar. If you want to know how + to use the native engine using C++, please take a look into the other help + file, which is named irrKlang.chm. +
    +
    + irrKlang .NET can run as stand alone .DLL and does not need the native irrKlang.DLL. + But please note that plugin .DLL files like the mp3 playback .DLL file ikpMP3.DLL + will still be needed if you want to use the features of those plugins (mp3 + playback in that case)

    +
    +

    How to use irrKlang.NET

    +

    Take a look in the /examples.net folder of the SDK, there you'll find some + examples for C# and VisualBasic.NET which are using irrKlang.NET. Copy irrKlang.DLL + and all plugin .DLLs (ikp*.DLL) into the folder where your application is. + The following simple example shows how to use irrKlang to play back a music file: +

    +
    +
     
    +
    [C#]
    + using System;
    + using IrrKlang;
    +
    + namespace HelloWorld
    + {
    +   class Example
    +   {
    +    [STAThread]
    +    static void Main(string[] + args)
    +    {
    +      // start up the engine
    +      ISoundEngine engine = new + ISoundEngine();
    +
    +


    +      // play a sound file
    +      engine.play2D("../../media/ophelia.mp3");

    +


    +      // wait until user presses + ok to end application

    +

         System.Windows.Forms.MessageBox.Show("Playing, + press ok.");

    +

       } // end main()

    +

      } // end class

    +

    } // end namespace

    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/Thirdparty/irrKlang/doc/dotnet/index.html b/Thirdparty/irrKlang/doc/dotnet/index.html new file mode 100644 index 0000000..a45efa8 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/index.html @@ -0,0 +1,21 @@ + + + + + irrKlang.net + + + + + + + <p>This page requires frames, but your browser does not support them.</p> + + + diff --git a/Thirdparty/irrKlang/doc/dotnet/intevent.gif b/Thirdparty/irrKlang/doc/dotnet/intevent.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d27ba57ef13045eb8646b04a3fb35056ae9db27 GIT binary patch literal 887 zcmW-gy=#;K4925%P^h#+1q*(lLY3&&MG>hw_yI)_%+Se?p_7C5AILcMT(riyn*ArT#_fx^W?p&*RPyCcXwEZWm_s*&8O8o zT4b%(D)DV~>C+Y!5fw2J7YUK9OjXoGT{J|qil$;F=3*h1)$1y5;w~QIS)-v6CgBnx zkswK`q)EDDNRogJG*}GNowcXJR9!Vxv(}QCskvIHWwD^>rta#Yo<)k@Fb&rTjf5kk znx^TRp~+TQ0|seWLW>%U!3G*EhO-1!PPkc^W$9xrnY($IXUT;H#c+$TNYq1$UQ4$O zOXT4PG?~T@^g{xLum%j$u%s0pECw5Bu(F)1GC2|MSw^CdwPX<@k(Wu2r{D3CY*a0U5qY&1BL7GWu!GpzM1D$oE>ZVLiBp1U-^s$yKGV6fN`HMw! z(Yj}Iq$1V$UgvGBERKykb?ruQQEoKU@f%vDpxFd8uLD=YJTx_{WN>hBbaZrVY;1gd zd}3l^a&mHNYHE6VdS+$@gWB!(!ootQ(^+0#URhb`cDoxJ8=IS(yDiL71n@38kW$a#$vF628-cHL75Y#>Z+0YSW9N6=4z30VL{PN-PHs2kfK+^ zG+YCD_yJ9(u><{(Kq0IFgETB@g$Ikl1{$nL=dw&rxLKr;=wmIJyLsR%a$!Ny!Y%L- zr!fFtv|}`Cu@XO^$uxGr3Bf3YHDHit5?b(JG1x#yo+!I1lM}(kFcN*NCG&_pU~~Rt z(Ofj|*&HcJHNNM08!MAz<4#_?5uB784SD>ARw`&V0nO{cl`s!Y%_`~Z>ua@ILqkKu z!^2}^V-ph-larI}cDvK*V9?CW%>4ZP($doM@^ZJ^U0+|{*x14|Fve{^?$wm zus;3sLGRmd-Dd-%=NDIJr#{Zf$i?qFXI`#6s_)#tG|*{(m_B#l%ZZb7$5)>p9KU^Q Z`tXnO7iW(={xtCG-rDP%gZp}9^gnwAcPjt@ literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/intmethod.gif b/Thirdparty/irrKlang/doc/dotnet/intmethod.gif new file mode 100644 index 0000000000000000000000000000000000000000..f7dce34ef3dc7933b769b53a1d63c757a5d28ceb GIT binary patch literal 904 zcmW+#KZuiY3{63yN`>MLQY?o$6b$0h<&Fcd2jbu2bO8%4Di$5Du0lSY4k->gNT(LD z9WouA+*(JqlVs>1++sl;LaL-j>M?3eCS*!xWDX>9 zCKqxgH*zGv1~jlRjBbxT5yGs@#_X{cnFx!r7>frB6jfN2)mS}9q1S{>*^JG>5u@zF zuI$E+tzZo>kOoW8LJf<74QOCt*h5g{2o*6A4}DmROjXoGJ>-G~il$;F=1>n(=oMFS z6Nfzb0h*YG9ncRFPzcrl18J~CD|lcrumKG$59gwc9AT;+MnWIfA~RES_zJmTfug#p z!$&v`1HcRIFdAxMCHw$QOv4Uvf?y~FYk+|?CP524uo&2Y_Bc^=ql_HkxEPFtKCDG% z?s33${$P2`n*fd10at=~(3DnDsZ^>| zDz#dzUaxO%ZZ@0ER;$%+w>zB<4C;2fyR z`R@;Z?cKfjZ1u#oTSe->dqIuS=iQxt0HM b_t?pQAHFW{%wDbSe5}41f7^asDA2}#kG6J& literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/intoperator.gif b/Thirdparty/irrKlang/doc/dotnet/intoperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..865746a2a99f6d02a224377b8ddd3bc5c9e9e4ae GIT binary patch literal 884 zcmW-gKWJ0|48|ikw9=s<3N5G=>J34s4)qUmPF10U9Wrzh9XdMHNf7cx5Tu2I4pML^ zXhkw5sJh-77|q9*F1A(~Y*6*Dmx3$d(TS8)?}@et1%4V5qnmk5aj zNm3-mds4e)j}iYWn#>U3x=4P+g+uPgg_xp#3hl9TdYiqBYrWx=q z4`k3jc=C-n`{(G9`uTjl>GhwuHZ&)L;iD7p*0vuH9Uq^(acjT(@b~GN&tDI2?>sqi z;qr%}wO3zOPM!PrZTi{W?WKvU_j+&V_IDmlOz*xNe&5-7G5+(%(#QK}KCPU5aBTAF K^M0?9EB^rl9&&;J literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/intproperty.gif b/Thirdparty/irrKlang/doc/dotnet/intproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d0ab67ecd2af9eacd3358d09961b3d3a60a55bc GIT binary patch literal 909 zcmW+#KWLM25Isd`Dp8|but*Cflrw{v#j2RNC`u3U$p#)JlB!gfP;^a_*U_*!a?spKrT<-4Od+)wnzj5ut>RN#c^p7I4^vTjA zLzZRRh#%XpcJ@#qVj>|@A|vw1n2Cj0iH+E!C`=+GN@64)y~?CQs-#BhF=|XEWJ+da z4kU6W7jh*xawNb8G_Wv?ZjU_?!mP~3?6DS^2#c~9iw6r7RalkPSUpIg*Mv>kjLpFj zqwK=2?8c6*U=1*k220RF4U2&dXkcO3Lr~-h6)_PHeOQZ3Rn$a1q`wzzgj#8fsxB`~Xc%!wztQU?>D@fPpk7K?^*v7}$XJI8k(?j2z*(7>tBI ztVL$-almx`V395w_e@6$Qpxu?Z?ZBtCU@f6NpMh38shkgRwziD0FBoHSAu!alvYtb zpDz}RrBbOGXQNe!o8$42HwuXfzs+$CJrqcCgp& zZe>|E!@E4AS$g1!Z-}MokwfuwIo|a6PtpN^8sC$o$TWPGylU{Rhlmdhq}N literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/ndoc.log b/Thirdparty/irrKlang/doc/dotnet/ndoc.log new file mode 100644 index 0000000..63e3425 --- /dev/null +++ b/Thirdparty/irrKlang/doc/dotnet/ndoc.log @@ -0,0 +1,296 @@ +Building documentation... +Initializing... +Merging XML documentation... +Building file mapping... +Loading XSLT files... + namespace.xslt + namespacehierarchy.xslt + type.xslt + typehierarchy.xslt + allmembers.xslt + individualmembers.xslt + event.xslt + member.xslt + memberoverload.xslt + property.xslt + field.xslt + htmlcontents.xslt +Generating HTML pages... +IrrKlang.html +IrrKlangHierarchy.html +IrrKlang.AudioFormat.html +IrrKlang.AudioFormatMembers.html +IrrKlang.AudioFormatConstructor.html +IrrKlang.AudioFormatFields.html +IrrKlang.AudioFormat.ChannelCount.html +IrrKlang.AudioFormat.Format.html +IrrKlang.AudioFormat.FrameCount.html +IrrKlang.AudioFormat.SampleRate.html +IrrKlang.AudioFormatProperties.html +IrrKlang.AudioFormat.BytesPerSecond.html +IrrKlang.AudioFormat.FrameSize.html +IrrKlang.AudioFormat.SampleDataSize.html +IrrKlang.AudioFormat.SampleSize.html +IrrKlang.EventForwarder.html +IrrKlang.EventForwarderMembers.html +IrrKlang.FileFactoryForwarder.html +IrrKlang.FileFactoryForwarderMembers.html +IrrKlang.IAudioRecorder.html +IrrKlang.IAudioRecorderMembers.html +IrrKlang.IAudioRecorderConstructor.html +IrrKlang.IAudioRecorderConstructor1.html +IrrKlang.IAudioRecorderConstructor2.html +IrrKlang.IAudioRecorderConstructor3.html +IrrKlang.IAudioRecorderProperties.html +IrrKlang.IAudioRecorder.AudioFormat.html +IrrKlang.IAudioRecorder.IsRecording.html +IrrKlang.IAudioRecorder.RecordedAudioData.html +IrrKlang.IAudioRecorderMethods.html +IrrKlang.IAudioRecorder.AddSoundSourceFromRecordedAudio.html +IrrKlang.IAudioRecorder.ClearRecordedAudioDataBuffer.html +IrrKlang.IAudioRecorder.Finalize.html +IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overloads.html +IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_2.html +IrrKlang.IAudioRecorder.StartRecordingBufferedAudio_overload_1.html +IrrKlang.IAudioRecorder.StopRecordingAudio.html +IrrKlang.IFileFactory.html +IrrKlang.IFileFactoryMembers.html +IrrKlang.IFileFactoryMethods.html +IrrKlang.IFileFactory.openFile.html +IrrKlang.ISound.html +IrrKlang.ISoundMembers.html +IrrKlang.ISoundConstructor.html +IrrKlang.ISoundProperties.html +IrrKlang.ISound.Finished.html +IrrKlang.ISound.Looped.html +IrrKlang.ISound.MaxDistance.html +IrrKlang.ISound.MinDistance.html +IrrKlang.ISound.Pan.html +IrrKlang.ISound.Paused.html +IrrKlang.ISound.PlaybackSpeed.html +IrrKlang.ISound.PlayLength.html +IrrKlang.ISound.PlayPosition.html +IrrKlang.ISound.Position.html +IrrKlang.ISound.SoundEffectControl.html +IrrKlang.ISound.Velocity.html +IrrKlang.ISound.Volume.html +IrrKlang.ISoundMethods.html +IrrKlang.ISound.Dispose.html +IrrKlang.ISound.Finalize.html +IrrKlang.ISound.setSoundStopEventReceiver_overloads.html +IrrKlang.ISound.setSoundStopEventReceiver_overload_1.html +IrrKlang.ISound.setSoundStopEventReceiver_overload_2.html +IrrKlang.ISound.Stop.html +IrrKlang.ISoundDeviceList.html +IrrKlang.ISoundDeviceListMembers.html +IrrKlang.ISoundDeviceListConstructor.html +IrrKlang.ISoundDeviceListConstructor1.html +IrrKlang.ISoundDeviceListConstructor2.html +IrrKlang.ISoundDeviceListProperties.html +IrrKlang.ISoundDeviceList.DeviceCount.html +IrrKlang.ISoundDeviceListMethods.html +IrrKlang.ISoundDeviceList.Finalize.html +IrrKlang.ISoundDeviceList.getDeviceDescription.html +IrrKlang.ISoundDeviceList.getDeviceID.html +IrrKlang.ISoundEffectControl.html +IrrKlang.ISoundEffectControlMembers.html +IrrKlang.ISoundEffectControlConstructor.html +IrrKlang.ISoundEffectControlProperties.html +IrrKlang.ISoundEffectControl.IsChorusSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsCompressorSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsDistortionSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsEchoSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsFlangerSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsGargleSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsI3DL2ReverbSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsParamEqSoundEffectEnabled.html +IrrKlang.ISoundEffectControl.IsWavesReverbSoundEffectEnabled.html +IrrKlang.ISoundEffectControlMethods.html +IrrKlang.ISoundEffectControl.DisableAllEffects.html +IrrKlang.ISoundEffectControl.DisableChorusSoundEffect.html +IrrKlang.ISoundEffectControl.DisableCompressorSoundEffect.html +IrrKlang.ISoundEffectControl.DisableDistortionSoundEffect.html +IrrKlang.ISoundEffectControl.DisableEchoSoundEffect.html +IrrKlang.ISoundEffectControl.DisableFlangerSoundEffect.html +IrrKlang.ISoundEffectControl.DisableGargleSoundEffect.html +IrrKlang.ISoundEffectControl.DisableI3DL2ReverbSoundEffect.html +IrrKlang.ISoundEffectControl.DisableParamEqSoundEffect.html +IrrKlang.ISoundEffectControl.DisableWavesReverbSoundEffect.html +IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableChorusSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableCompressorSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableDistortionSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableEchoSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableFlangerSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableGargleSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableI3DL2ReverbSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableParamEqSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overloads.html +IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_2.html +IrrKlang.ISoundEffectControl.EnableWavesReverbSoundEffect_overload_1.html +IrrKlang.ISoundEffectControl.Finalize.html +IrrKlang.ISoundEngine.html +IrrKlang.ISoundEngineMembers.html +IrrKlang.ISoundEngineConstructor.html +IrrKlang.ISoundEngineConstructor1.html +IrrKlang.ISoundEngineConstructor2.html +IrrKlang.ISoundEngineConstructor3.html +IrrKlang.ISoundEngineConstructor4.html +IrrKlang.ISoundEngineProperties.html +IrrKlang.ISoundEngine.Default3DSoundMaxDistance.html +IrrKlang.ISoundEngine.Default3DSoundMinDistance.html +IrrKlang.ISoundEngine.IsMultiThreaded.html +IrrKlang.ISoundEngine.Name.html +IrrKlang.ISoundEngine.SoundVolume.html +IrrKlang.ISoundEngineMethods.html +IrrKlang.ISoundEngine.AddFileFactory.html +IrrKlang.ISoundEngine.AddSoundSourceAlias.html +IrrKlang.ISoundEngine.AddSoundSourceFromFile_overloads.html +IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_1.html +IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_2.html +IrrKlang.ISoundEngine.AddSoundSourceFromFile_overload_3.html +IrrKlang.ISoundEngine.AddSoundSourceFromIOStream.html +IrrKlang.ISoundEngine.AddSoundSourceFromMemory.html +IrrKlang.ISoundEngine.AddSoundSourceFromPCMData.html +IrrKlang.ISoundEngine.Finalize.html +IrrKlang.ISoundEngine.GetSoundSource_overloads.html +IrrKlang.ISoundEngine.GetSoundSource_overload_2.html +IrrKlang.ISoundEngine.GetSoundSource_overload_1.html +IrrKlang.ISoundEngine.internalGetNativeEngine.html +IrrKlang.ISoundEngine.IsCurrentlyPlaying.html +IrrKlang.ISoundEngine.LoadPlugins.html +IrrKlang.ISoundEngine.Play2D_overloads.html +IrrKlang.ISoundEngine.Play2D_overload_1.html +IrrKlang.ISoundEngine.Play2D_overload_4.html +IrrKlang.ISoundEngine.Play2D_overload_3.html +IrrKlang.ISoundEngine.Play2D_overload_2.html +IrrKlang.ISoundEngine.Play2D_overload_5.html +IrrKlang.ISoundEngine.Play2D_overload_6.html +IrrKlang.ISoundEngine.Play3D_overloads.html +IrrKlang.ISoundEngine.Play3D_overload_1.html +IrrKlang.ISoundEngine.Play3D_overload_8.html +IrrKlang.ISoundEngine.Play3D_overload_7.html +IrrKlang.ISoundEngine.Play3D_overload_2.html +IrrKlang.ISoundEngine.Play3D_overload_3.html +IrrKlang.ISoundEngine.Play3D_overload_4.html +IrrKlang.ISoundEngine.Play3D_overload_5.html +IrrKlang.ISoundEngine.Play3D_overload_6.html +IrrKlang.ISoundEngine.RemoveAllSoundSources.html +IrrKlang.ISoundEngine.RemoveSoundSource.html +IrrKlang.ISoundEngine.SetAllSoundsPaused.html +IrrKlang.ISoundEngine.SetDopplerEffectParameters.html +IrrKlang.ISoundEngine.SetListenerPosition_overloads.html +IrrKlang.ISoundEngine.SetListenerPosition_overload_3.html +IrrKlang.ISoundEngine.SetListenerPosition_overload_4.html +IrrKlang.ISoundEngine.SetListenerPosition_overload_1.html +IrrKlang.ISoundEngine.SetListenerPosition_overload_2.html +IrrKlang.ISoundEngine.SetRolloffFactor.html +IrrKlang.ISoundEngine.StopAllSounds.html +IrrKlang.ISoundEngine.Update.html +IrrKlang.ISoundSource.html +IrrKlang.ISoundSourceMembers.html +IrrKlang.ISoundSourceConstructor.html +IrrKlang.ISoundSourceProperties.html +IrrKlang.ISoundSource.AudioFormat.html +IrrKlang.ISoundSource.DefaultMaxDistance.html +IrrKlang.ISoundSource.DefaultMinDistance.html +IrrKlang.ISoundSource.DefaultVolume.html +IrrKlang.ISoundSource.ForcedStreamingThreshold.html +IrrKlang.ISoundSource.IsSeekingSupported.html +IrrKlang.ISoundSource.Name.html +IrrKlang.ISoundSource.PlayLength.html +IrrKlang.ISoundSource.SampleData.html +IrrKlang.ISoundSource.StreamMode.html +IrrKlang.ISoundSourceMethods.html +IrrKlang.ISoundSource.Dispose.html +IrrKlang.ISoundSource.Finalize.html +IrrKlang.ISoundSource.ForceReloadAtNextUse.html +IrrKlang.ISoundSource.getNativeSoundSource.html +IrrKlang.ISoundStopEventReceiver.html +IrrKlang.ISoundStopEventReceiverMembers.html +IrrKlang.ISoundStopEventReceiverMethods.html +IrrKlang.ISoundStopEventReceiver.OnSoundStopped.html +IrrKlang.SampleFormat.html +IrrKlang.SoundDeviceListType.html +IrrKlang.SoundEngineOptionFlag.html +IrrKlang.SoundOutputDriver.html +IrrKlang.StopEventCause.html +IrrKlang.StreamForwarder.html +IrrKlang.StreamForwarderMembers.html +IrrKlang.StreamMode.html +IrrKlang.Vector3D.html +IrrKlang.Vector3DMembers.html +IrrKlang.Vector3DConstructor.html +IrrKlang.Vector3DConstructor1.html +IrrKlang.Vector3DConstructor2.html +IrrKlang.Vector3DFields.html +IrrKlang.Vector3D.X.html +IrrKlang.Vector3D.Y.html +IrrKlang.Vector3D.Z.html +IrrKlang.Vector3DProperties.html +IrrKlang.Vector3D.Length.html +IrrKlang.Vector3D.LengthSQ.html +IrrKlang.Vector3DMethods.html +IrrKlang.Vector3D.CrossProduct.html +IrrKlang.Vector3D.DotProduct.html +IrrKlang.Vector3D.Equals.html +IrrKlang.Vector3D.GetDistanceFrom.html +IrrKlang.Vector3D.GetDistanceFromSQ.html +IrrKlang.Vector3D.GetInterpolated.html +IrrKlang.Vector3D.GetLength.html +IrrKlang.Vector3D.GetLengthSQ.html +IrrKlang.Vector3D.Invert.html +IrrKlang.Vector3D.IsBetweenPoints.html +IrrKlang.Vector3D.Normalize.html +IrrKlang.Vector3D.Set_overloads.html +IrrKlang.Vector3D.Set_overload_1.html +IrrKlang.Vector3D.Set_overload_2.html +IrrKlang.Vector3D.SetLength.html +IrrKlang.Vector3D.ToString.html +IrrKlang.Vector3DOperators.html +IrrKlang.Vector3D.op_Addition.html +IrrKlang.Vector3D.op_Division.html +IrrKlang.Vector3D.op_Equality.html +IrrKlang.Vector3D.op_Multiply_overloads.html +IrrKlang.Vector3D.op_Multiply_overload_2.html +IrrKlang.Vector3D.op_Multiply_overload_1.html +IrrKlang.Vector3D.op_Subtraction.html +Generating HTML content file... +transform the HHC contents file into html +Compiling HTML Help file... +Compiling Html Help file +Microsoft HTML Help Compiler 4.74.8702 + +Compiling c:\Development\irrTech\irrKlang\doctemp\netdoc\ndoc_msdn_temp\irrKlang.net.chm + +HHC3000: Warning: Invalid syntax: A tag appears outside of an tag. +HHC3000: Warning: Invalid syntax: A tag appears outside of an tag. +HHC3000: Warning: Invalid syntax: A tag appears outside of an tag. + +Compile time: 0 minutes, 2 seconds +257 Topics +1,702 Local links +1 Internet link +6 Graphics + + +Created c:\Development\irrTech\irrKlang\doctemp\netdoc\ndoc_msdn_temp\irrKlang.net.chm, 147,150 bytes +Compression decreased file by 734,302 bytes. + +Html Help compile complete +Done. diff --git a/Thirdparty/irrKlang/doc/dotnet/privevent.gif b/Thirdparty/irrKlang/doc/dotnet/privevent.gif new file mode 100644 index 0000000000000000000000000000000000000000..01b05907469af44594dc2862f217a53c8920bfcc GIT binary patch literal 897 zcmW-gu}ju*5XMh2H82vV1RZK{_!1SGVFW1-R$vstK`vn!&f(PX!uQ_vPm)6_FyMA|~P@ky$BHREkM)DUn4jqAF^lE*jZuMNGv^%*7%{y@;#0iMx1! zBvB+(!X#XR1Z<$eVwmp8JsDbxmExsDt|e0~YDK+hBnyhB#jKbYizG#_YjG>?#RHCv zme3Mb!b`9f)__48me8WcVz7Y*i{VH?nG>e!s*(CwOJ=6#YLRkbLD5a!)dTgAqF2K- zTmyOd0Zpc{1O1RdA*=y|G%RU_2aCZ58mvg?vP@36S)`HZV=bAxdEhH@VL{QtE$|Vi zF#uk)V>D{956T!tW5`C;C^N2iPJ%6&O z7tMRtBPFTod!DyinH;M-dF?7VDOU}7{7Neo)J;J1I&dY-LsMNP0|NuY!^2}^V-ph- z)6>)Q^YaS}3(L#PD=RA)w6U?Vxw*N$y}h%uv%9-{czAepbkuIQ&(6*||4z5IJ~vI% z;a%=Xr#^V{jkx@`rz?NHns0jkCuaJeN$32?{jXayt-hY_OZ|%{-(L4#xYc@fdeS9* z*XE9&zP$3o{>%=2?_2ye+Zydmu1>vqaqxa*$y*2GANM~Djow{dyRr1}ZTH31k@Y9- W{q^gU?{2P*e|og}_*`#~-1!g5op8zk literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/privfield.gif b/Thirdparty/irrKlang/doc/dotnet/privfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab932619e60ea3914fd74be2d8fb4fb201ecf692 GIT binary patch literal 904 zcmW+#F=&%v5WQ5P6#|B$lz>Q88sVsmsaWZdf}#fE5b%bKg3aUG$Rn1YLxfCx84a8j~|AQ&ka-+c$+&*kpkz4z|VgX;awJ5LH!pg$CmrB9X~8L})p zM*KMba56!Kh>3(qiHyi2VcEFLUSRAE(CWAz|~UK2KDGd2fDjIs;6 zvKu?Lf;GTE8Z1EzH7o`;pn-*94?&S5RK!F)^kFSBRZ$c5kP8+lnu?j2Lp?~LS6szS z9P;1?Xkr?6KtD)8Ay@+pq`?xc;DN=!1~jldoQpDYgsFNM34K_L%uLPUE98O&it45g zAK^3%057z|XsCsi@B=h44LiUIf}s$s0S3~T1TFBuVqgQ><3!PoGIE6DVlWc=uojuQ z#{tv%gGIV%+%p|1NG0FnyvfSonB0kLC&58EX^7(|TA?6q0yJI+TnXkuQ(8s&e7;yL zmP(~^xm>AKYPDLU(P%cCtyT*LwcG7Zr_<~8`u+Z3Fc=PpqtR$Q9#5y!`RSzFJ;<_b zj(2%Z^Yp+I-w;>+p3TM2>+zY!YoA~Hw^caWsqU^8Kh|dTgGZg)#rNygZ&y$DFJ9Y!wp3sH bd}iVL@~yq+t6$#StnkM7BYylUm!qx!Z(nn) literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/privmethod.gif b/Thirdparty/irrKlang/doc/dotnet/privmethod.gif new file mode 100644 index 0000000000000000000000000000000000000000..c932525ccb0925053faaa2e14c5224bbbddd518f GIT binary patch literal 908 zcmW+#F=&%v5WS{VQpgZ+G2&nagB%V@7h{E1kk&$$AUAYOhoCr!nM?22L6;2bWWb>m zQ|L`GF6xqk)qn(XxFLf>mx693i-^MSyYC?Ux!m2m_ul0}I3G_Sh34%*t%c9&3?_uqcbMc(6cGg;iON)q@mzP1uyp*c==& z$}a56ZtU0!)&K)(ummmCuo&2Y1{Q`r1VxTe5fkyyhqcI5MNQO0E?A&wDrRC1^&o{_ zaTPal$b%oCiD}pY{U8B_U=1*k21~Sp2NnYx(7^I=F3QLers`oN^kFSBGc|{=kP8+l zs+&4|gwrqpywDD#p%zxc575Lk>;NYShC;9g7)WChw7>(4femPn6Gb=5$Ptc-GA^#zw2vYPZ`ksMG0myWL)|Hy8|t!{K;5o=hgk$H&v@H2-_D zv-2j)vK;SnPI-FZiEoI7KXWtj^Obnh<3F)dyifW3`8)lim964@;qv!~%^5mJp+dpZ$%@(vQX%NnMR90dw1o~*jaYEep?^R}5%N$d2nBT!ZYyGo zWRkDnqi-bs4rYdTpE*hd)MN=^obFmQ1>U9-2aTgEqtkF;jlW>WUNRT8| z(j;9nBuT&q8Z3tC&e~I9s;(NUS!>D6)LbppvRF`bQ+M@H&mu){n1*YFM#7O%P1AJE z&}1vD0fRIwp+$|wU;_;n!&!nVC)_N|vh=Z*%-uZ9v*f~pVz@3Pf}&@5;v-ID0K90& zXw+gQen69H?0^%3Q3z|mAk8GS;K5?BfzCQnbyFrMl8a#^`dCXAnRUSS{KcZZXx+0t zQjuzXuk*H67RT0|x^^qLD7PBw_${qc&~5^n*MTcx9-7)!GB!3gIXO8qGc!9oJ2yAC zw6wIcva-6my0*54K^q$zola+KYpdJs?(FRJdcA(XzrVkKbaXWMd$76rwrQFH@A5zf z?Sm)Zhzoy4PSnqr>rJo!#Qf-88JrxMe!uzg+402r2lro2-&h|y{5L#*D4*6(Upn(- z^wpa$FQx|P78aHteSSW1>fMLY!@b?tXQ!U-^}E~O{P^DE-onp|KVHi6(Cx)LGv7N` IhKJ<(e<=%b8~^|S literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/privproperty.gif b/Thirdparty/irrKlang/doc/dotnet/privproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..84a5986ba42c50a5149f6c0ab387afec99c0bdbe GIT binary patch literal 908 zcmW+#KWLM25It#!20{(eAwfYKY0$$zLlBe-u~gJT7E2DAMGzt2nu@sH2U!ZuU>$@^ zW@sF45i$!Yh(k5tazh3uOZJ+@e?xrtI|yGcclYkScV8ZEJ-B`6X@Ls#iz2f0$;yoT5U+L_(xQM&yw(6AQ5t8?i@Gm_$gF#7I1Pl}UwENsZKF)R;`jl+4H+ zNaRc|>;uojuBsEK;W1q&2S#Z1hh9;DDK zuHq&RdGG@?F%3JQA0(gi|;Gmo|#PJiYP>?nO8m|Mc1oNONt)hHB zUn-R`+;czq>jmP83WHOyjXS3P--)X;p zm}S`<@A91H>47J{Ay)q^o{68Y#hV`giF-@WX`Z|A`)sz+nJ*Qt>=fR8>QHgHyMuqj ze(^f5?0x8O>@RMf`}pc-cD!)@a(U&^cKPeV^0ObE;_zhab$R#g-Q1;C~L=yFv6 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/protevent.gif b/Thirdparty/irrKlang/doc/dotnet/protevent.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac5512ab44d9275f9c039b94e795e5918cedfcbb GIT binary patch literal 899 zcmZ?wbhEHb6krfw_|5&2xXb23G5K#Qd!pOkD$e;uA4=7JKa3nA=bI5pXSm40UC?erdap8bdvw*CK z#(@tCt{oD}el;D1jm!+Ja#jWb4vroz%GyFD4GyWtdgK`y3L*=hoSbf^8D{g~fy3F^ fi~?E=3nnC&2xXb23G5K#Qd!pOkD$e;uA4=7JKaO5*EbI5pXSm40UC?esoqoIL;fk#Zi z#A3rk21aHMAD#yb4!CtGXbVLM7#(0@laM!ZcyYjik(E`9Ys!z03QeW>^XE^TIC0>>fqC=hO_(sj#>PfL zK>?&{6pV(z@CpINpDc_F42%pqAa8;4gabz=12cz=#|DLiY>Ywz3=9bk4Q1u^lT?ngGKxJ|V)1DaLkkxl ni|K`i6^AGC`l_)k*zmMr32V2I!vd2hA+y*dPw)r`FjxZs{+mI4 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/protoperator.gif b/Thirdparty/irrKlang/doc/dotnet/protoperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..e83f74014113cf1b17124da3d4e8c6d3a77fb1b5 GIT binary patch literal 887 zcmW-gziU(h498P@gTg^8f>==NFFFLbI#e8LK@{Nz2QzfDpq)#nx|pXf3I!KIic67J zC4-dy11*RO+QA`1L6?HvL~0R46wXgx;CPoy^3C`A&AV&YuTET?8J1!BEfr1sY1&6a z)-;>M*Ugt7_o#@dh>5sJh-77|q9*F1A(~Y*6*Dmx3$d(TS8)?}@et1%4V5qnmk5aj zNm3-mds4e)j}Upx*7o-H?(XjX{(k@O-tzKF(=>hF z<-YXW2T#5cr~h;Y>gV(Irq_Ss^1++ZKh!z3wmkK)GxYuJ!rIQ{gYJo=owecS-Q#1U zXP!=ce(~YS$izdty1<=g9@D{milr{3JYJ15P+g(C-UEF8Y`>G`>td;dm$ N-ReC%K6pSb{RhKSZh`;+ literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/protproperty.gif b/Thirdparty/irrKlang/doc/dotnet/protproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..389e1c5617a575ec0800cd2b6ef8bd576a6718d1 GIT binary patch literal 923 zcmZ?wbhEHb6krfw_|5&2xXb23G5K#Qd!pOkD$e;uA4=7JKa5ynAbI5pXSa6Vmk4vJUV8a4tW-dvy z5`~Qq9oZR-!c2Z_aA52b6V&7J+_c2AMb16S=f}h+Og)0mb|E__Jv%vDjG2kS8UW;` BHt_%e literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/dotnet/pubfield.gif b/Thirdparty/irrKlang/doc/dotnet/pubfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c68c179bef72db8679d4f8038d8e54c9d7794a1 GIT binary patch literal 881 zcmZ?wbhEHb6krfw_|5CM zz{sEj@+2rvIB@teFmuRwY*=uRiHV1UAz{G*#%3070SSi%3`d&y^_{k?Fl;!&$mGCu uV#h=VhIZNDRUw)a7a!|a01_JoqaiTdLqPE-3nK#q zBZCgeqo6$Dz!Ap4%pv2kVSxh^tAH3sK|%uq13$ZrfyIXghIV01sWU4kD!4bYinWPU zFf4NJVHR$SIZ?pC&?%dIYR<`k1MXd7{3Xi2O1h06ciM|B4D{uVl)JXbqFZ_WMO1r zU}Vq%`4W^T95|vFm^oxTHY{*p2FgfqG#qehVdLk^@K~V4$jHPbapT0s$HzKYY}pR1 z2uwIUnU9mlz(Hu?p%$)qCl=4m%X~YQSFaW{-|3LH~#2N*oAuz;4K=CIFBLjmFgAT|apgiHgk;S0OA>*+j z!I7C+Nu$Ssp~5 element with the specified href value +// + var el; + var anchors = node.getElementsByTagName('A'); + for (var i = 0; i < anchors.length; i++) + { + el = anchors[i]; + var aref = new String(); + aref = el.getAttribute('href'); + + if ((aref.substring(0, 7) != 'http://') + && (aref.substring(0, 8) != 'https://') + && (aref.substring(0, 7) != 'file://')) + { + aref = base + aref; + } + + if (aref == href) + { + return el; + } + } + return null; +} + +function selectAndShowNode(node) +{ +// Selects and scrolls into view the specified node +// + var el = findNode(node); + if (el != null) + { + selectNode(el); + do + { + expandNode(el); + el = findNode(el.parentNode); + } while ((el != null)) + + //vertical scroll element into view + var windowTop; + var windowBottom; + var treeDiv = document.getElementById('tree'); + + var ua = window.navigator.userAgent.toLowerCase(); + if ((i = ua.indexOf('msie')) != -1) + { + windowTop = node.offsetTop - treeDiv.scrollTop; + windowBottom = treeDiv.clientHeight - windowTop - node.offsetHeight; + } + else if (ua.indexOf('gecko') != -1) + { + windowTop = node.offsetTop - treeDiv.offsetTop - treeDiv.scrollTop; + windowBottom = treeDiv.clientHeight - windowTop - node.offsetHeight; + } + else + { + return; + } + + if (windowTop < 0) + { + treeDiv.scrollTop += windowTop - 18; + return; + } + if (windowBottom < 0) + { + treeDiv.scrollTop -= windowBottom - 18; + return; + } + } +} + + +function resizeTree() +{ + //var treeDiv = document.getElementById('tree'); + //treeDiv.setAttribute('style', 'width: ' + document.body.offsetWidth + 'px; height: ' + (document.body.offsetHeight - 27) + 'px;'); + //treeDiv.style.width = document.documentElement.offsetWidth; + //treeDiv.style.height = document.documentElement.offsetHeight - 27; + + var treeDiv = document.getElementById('tree'); + if(!window.innerHeight) + { + // IE method + treeDiv.style.width = document.documentElement.offsetWidth; + treeDiv.style.height = document.documentElement.offsetHeight - 27; + } + else + { + // Netscape/Firefox method + treeDiv.style.width = window.innerWidth; + treeDiv.style.height = window.innerHeight - 27; + } +} diff --git a/Thirdparty/irrKlang/doc/dotnet/treenodedot.gif b/Thirdparty/irrKlang/doc/dotnet/treenodedot.gif new file mode 100644 index 0000000000000000000000000000000000000000..c135603338ece20cec773129105161e54d1593d3 GIT binary patch literal 829 zcmZ?wbhEHbgbBX M^XE!9f*2UA0nx1yDgXcg literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/doc/readme.txt b/Thirdparty/irrKlang/doc/readme.txt new file mode 100644 index 0000000..c5b6246 --- /dev/null +++ b/Thirdparty/irrKlang/doc/readme.txt @@ -0,0 +1,2 @@ +This documentation is also available as html version at +http://www.ambiera.com/irrklang \ No newline at end of file diff --git a/Thirdparty/irrKlang/include/ik_ESoundEngineOptions.h b/Thirdparty/irrKlang/include/ik_ESoundEngineOptions.h new file mode 100644 index 0000000..df65607 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ESoundEngineOptions.h @@ -0,0 +1,78 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __E_IRRKLANG_SOUND_ENGINE_OPTIONS_H_INCLUDED__ +#define __E_IRRKLANG_SOUND_ENGINE_OPTIONS_H_INCLUDED__ + +namespace irrklang +{ + //! An enumeration for all options for starting up the sound engine + /** When using createIrrKlangDevice, use a combination of this these + as 'options' parameter to start up the engine. By default, irrKlang + uses ESEO_DEFAULT_OPTIONS, which is set to the combination + ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT. */ + enum E_SOUND_ENGINE_OPTIONS + { + //! If specified (default), it will make irrKlang run in a separate thread. + /** Using this flag, irrKlang will update + all streams, sounds, 3d positions and whatever automaticly. You also don't need to call ISoundEngine::update() + if irrKlang is running multithreaded. However, if you want to run irrKlang in the same thread + as your application (for easier debugging for example), don't set this. But you need to call ISoundEngine::update() + as often as you can (at least about 2-3 times per second) to make irrKlang update everything correctly then. */ + ESEO_MULTI_THREADED = 0x01, + + //! If the window of the application doesn't have the focus, irrKlang will be silent if this has been set. + /** This will only work when irrKlang is using the DirectSound output driver. */ + ESEO_MUTE_IF_NOT_FOCUSED = 0x02, + + //! Automaticly loads external plugins when starting up. + /** Plugins usually are .dll, .so or .dylib + files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which are executed + after the startup of the sound engine and modify it for example to make it possible + to play back mp3 files. Plugins are being loaded from the current working directory + as well as from the position where the .exe using the irrKlang library resides. + It is also possible to load the plugins after the engine has started up using + ISoundEngine::loadPlugins(). */ + ESEO_LOAD_PLUGINS = 0x04, + + //! Uses 3D sound buffers instead of emulating them when playing 3d sounds (default). + /** If this flag is not specified, all buffers will by created + in 2D only and 3D positioning will be emulated in software, making the engine run + faster if hardware 3d audio is slow on the system. */ + ESEO_USE_3D_BUFFERS = 0x08, + + //! Prints debug messages to the debugger window. + /** irrKlang will print debug info and status messages to any windows debugger supporting + OutputDebugString() (like VisualStudio). + This is useful if your application does not capture any console output (see ESEO_PRINT_DEBUG_INFO_TO_STDOUT). */ + ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER = 0x10, + + //! Prints debug messages to stdout (the ConsoleWindow). + /** irrKlang will print debug info and status messages stdout, the console window in Windows. */ + ESEO_PRINT_DEBUG_INFO_TO_STDOUT = 0x20, + + //! Uses linear rolloff for 3D sound. + /** If specified, instead of the default logarithmic one, irrKlang will + use a linear rolloff model which influences the attenuation + of the sounds over distance. The volume is interpolated linearly between the MinDistance + and MaxDistance, making it possible to adjust sounds more easily although this is not + physically correct. + Note that this option may not work when used together with the ESEO_USE_3D_BUFFERS + option when using Direct3D for example, irrKlang will then turn off ESEO_USE_3D_BUFFERS + automaticly to be able to use this option and write out a warning. */ + ESEO_LINEAR_ROLLOFF = 0x40, + + //! Default parameters when starting up the engine. + ESEO_DEFAULT_OPTIONS = ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS | ESEO_USE_3D_BUFFERS | ESEO_PRINT_DEBUG_INFO_TO_DEBUGGER | ESEO_PRINT_DEBUG_INFO_TO_STDOUT, + + //! Never used, it only forces the compiler to compile these enumeration values to 32 bit. + /** Don't use this. */ + ESEO_FORCE_32_BIT = 0x7fffffff + }; + +} // end namespace irrklang + + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_ESoundOutputDrivers.h b/Thirdparty/irrKlang/include/ik_ESoundOutputDrivers.h new file mode 100644 index 0000000..bc3e0ea --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ESoundOutputDrivers.h @@ -0,0 +1,59 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __E_IRRKLANG_SOUND_OUTPUT_DRIVERS_H_INCLUDED__ +#define __E_IRRKLANG_SOUND_OUTPUT_DRIVERS_H_INCLUDED__ + +namespace irrklang +{ + //! An enumeration for all types of supported sound drivers + /** Values of this enumeration can be used as parameter when calling createIrrKlangDevice(). */ + enum E_SOUND_OUTPUT_DRIVER + { + //! Autodetects the best sound driver for the system + ESOD_AUTO_DETECT = 0, + + //! DirectSound8 sound output driver, windows only. + /** In contrast to ESOD_DIRECT_SOUND, this supports sophisticated sound effects + but may not be available on old windows versions. It behaves very similar + to ESOD_DIRECT_SOUND but also supports DX8 sound effects.*/ + ESOD_DIRECT_SOUND_8, + + //! DirectSound sound output driver, windows only. + /** This uses DirectSound 3 or above, if available. If DX8 sound effects + are needed, use ESOD_DIRECT_SOUND_8 instead. The + ESOD_DIRECT_SOUND driver may be available on more and older windows + versions than ESOD_DIRECT_SOUND_8.*/ + ESOD_DIRECT_SOUND, + + //! WinMM sound output driver, windows only. + /** Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */ + ESOD_WIN_MM, + + //! ALSA sound output driver, linux only. + /** When using ESOD_ALSA in createIrrKlangDevice(), it is possible to set the third parameter, + 'deviceID' to the name of specific ALSA pcm device, to the irrKlang force to use this one. + Set it to 'default', or 'plug:hw' or whatever you need it to be. + Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */ + ESOD_ALSA, + + //! Core Audio sound output driver, mac os only. + /** Supports the ISoundMixedOutputReceiver interface using setMixedDataOutputReceiver. */ + ESOD_CORE_AUDIO, + + //! Null driver, creating no sound output + ESOD_NULL, + + //! Amount of built-in sound output drivers + ESOD_COUNT, + + //! This enumeration literal is never used, it only forces the compiler to + //! compile these enumeration values to 32 bit. + ESOD_FORCE_32_BIT = 0x7fffffff + }; + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_EStreamModes.h b/Thirdparty/irrKlang/include/ik_EStreamModes.h new file mode 100644 index 0000000..62d4a0f --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_EStreamModes.h @@ -0,0 +1,31 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __E_IRRKLANG_STREAM_MODES_H_INCLUDED__ +#define __E_IRRKLANG_STREAM_MODES_H_INCLUDED__ + +namespace irrklang +{ + //! An enumeration for all types of supported stream modes + enum E_STREAM_MODE + { + //! Autodetects the best stream mode for a specified audio data. + ESM_AUTO_DETECT = 0, + + //! Streams the audio data when needed. + ESM_STREAMING, + + //! Loads the whole audio data into the memory. + ESM_NO_STREAMING, + + //! This enumeration literal is never used, it only forces the compiler to + //! compile these enumeration values to 32 bit. + ESM_FORCE_32_BIT = 0x7fffffff + }; + +} // end namespace irrklang + + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IAudioRecorder.h b/Thirdparty/irrKlang/include/ik_IAudioRecorder.h new file mode 100644 index 0000000..49b4085 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IAudioRecorder.h @@ -0,0 +1,110 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_AUDIO_RECORDER_H_INCLUDED__ +#define __I_IRRKLANG_AUDIO_RECORDER_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_ISoundSource.h" + + +namespace irrklang +{ + class ICapturedAudioDataReceiver; + + //! Interface to an audio recorder. Create it using the createIrrKlangAudioRecorder() function. + /** It creates sound sources into an ISoundEngine which then can be played there. + See @ref recordingAudio for an example on how to use this. */ + class IAudioRecorder : public virtual IRefCounted + { + public: + + //! Starts recording audio. + /** Clears all possibly previously recorded buffered audio data and starts to record. + When finished recording audio data, call stopRecordingAudio(). + All recorded audio data gets stored into an internal audio buffer, which + can then be accessed for example using addSoundSourceFromRecordedAudio() or + getRecordedAudioData(). For recording audio data not into an internal audio + buffer, use startRecordingCustomHandledAudio(). + \param sampleRate: Sample rate of the recorded audio. + \param sampleFormat: Sample format of the recorded audio. + \param channelCount: Amount of audio channels. + \return Returns true if successfully started recording and false if not.*/ + virtual bool startRecordingBufferedAudio(ik_s32 sampleRate=22000, + ESampleFormat sampleFormat=ESF_S16, + ik_s32 channelCount=1) = 0; + + //! Starts recording audio. + /** Clears all possibly previously recorded buffered audio data and starts to record + audio data, which is delivered to a custom user callback interface. + When finished recording audio data, call stopRecordingAudio(). If instead of + recording the data to the receiver interface recording into a managed buffer + is wished, use startRecordingBufferedAudio() instead. + \param receiver: Interface to be implemented by the user, gets called once for each + captured audio data chunk. + \param sampleRate: Sample rate of the recorded audio. + \param sampleFormat: Sample format of the recorded audio. + \param channelCount: Amount of audio channels. + \return Returns true if successfully started recording and false if not. */ + virtual bool startRecordingCustomHandledAudio(ICapturedAudioDataReceiver* receiver, + ik_s32 sampleRate=22000, + ESampleFormat sampleFormat=ESF_S16, + ik_s32 channelCount=1) = 0; + + //! Stops recording audio. + virtual void stopRecordingAudio() = 0; + + //! Creates a sound source for the recorded audio data. + /** The returned sound source pointer then can be used to play back the recorded audio data + using ISoundEngine::play2D(). This method only will succeed if the audio was recorded using + startRecordingBufferedAudio() and audio recording is currently stopped. + \param soundName Name of the virtual sound file (e.g. "someRecordedAudio"). You can also use this + name when calling play3D() or play2D(). */ + virtual ISoundSource* addSoundSourceFromRecordedAudio(const char* soundName) = 0; + + //! Clears recorded audio data buffer, freeing memory. + /** This method will only succeed if audio recording is currently stopped. */ + virtual void clearRecordedAudioDataBuffer() = 0; + + //! Returns if the recorder is currently recording audio. + virtual bool isRecording() = 0; + + //! Returns the audio format of the recorded audio data. + /** Also contains informations about the length of the recorded audio stream. */ + virtual SAudioStreamFormat getAudioFormat() = 0; + + //! Returns a pointer to the recorded audio data. + /** This method will only succeed if audio recording is currently stopped and + something was recorded previously using startRecordingBufferedAudio(). + The lenght of the buffer can be retrieved using + getAudioFormat().getSampleDataSize(). Note that the pointer is only valid + as long as not clearRecordedAudioDataBuffer() is called or another sample is + recorded.*/ + virtual void* getRecordedAudioData() = 0; + + //! returns the name of the sound driver, like 'ALSA' for the alsa device. + /** Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM", + "DirectSound" and "DirectSound8". */ + virtual const char* getDriverName() = 0; + }; + + + //! Interface to be implemented by the user if access to the recorded audio data is needed. + /** Is used as parameter in IAudioRecorder::startRecordingCustomHandledAudio. */ + class ICapturedAudioDataReceiver : public IRefCounted + { + public: + + //! Gets called once for each captured audio data chunk. + /** See IAudioRecorder::startRecordingCustomHandledAudio for details. + \param audioData: Pointer to a part of the recorded audio data + \param lengthInBytes: Amount of bytes in the audioData buffer.*/ + virtual void OnReceiveAudioDataStreamChunk(unsigned char* audioData, unsigned long lengthInBytes) = 0; + }; + + +} // end namespace irrklang + + +#endif diff --git a/Thirdparty/irrKlang/include/ik_IAudioStream.h b/Thirdparty/irrKlang/include/ik_IAudioStream.h new file mode 100644 index 0000000..97bfbd4 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IAudioStream.h @@ -0,0 +1,49 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_AUDIO_STREAM_H_INCLUDED__ +#define __I_IRRKLANG_AUDIO_STREAM_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_SAudioStreamFormat.h" + +namespace irrklang +{ + + +//! Reads and decodes audio data into an usable audio stream for the ISoundEngine +class IAudioStream : public IRefCounted +{ +public: + + //! destructor + virtual ~IAudioStream() {}; + + //! returns format of the audio stream + virtual SAudioStreamFormat getFormat() = 0; + + //! sets the position of the audio stream. + /** For example to let the stream be read from the beginning of the file again, + setPosition(0) would be called. This is usually done be the sound engine to + loop a stream after if has reached the end. Return true if sucessful and 0 if not. + \param pos: Position in frames.*/ + virtual bool setPosition(ik_s32 pos) = 0; + + //! returns true if the audio stream is seekable + /* Some file formats like (MODs) don't support seeking */ + virtual bool getIsSeekingSupported() { return true; } + + //! tells the audio stream to read frameCountToRead audio frames into the specified buffer + /** \param target: Target data buffer to the method will write the read frames into. The + specified buffer will be at least getFormat().getFrameSize()*frameCountToRead bytes big. + \param frameCountToRead: amount of frames to be read. + \returns Returns amount of frames really read. Should be frameCountToRead in most cases. */ + virtual ik_s32 readFrames(void* target, ik_s32 frameCountToRead) = 0; +}; + + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IAudioStreamLoader.h b/Thirdparty/irrKlang/include/ik_IAudioStreamLoader.h new file mode 100644 index 0000000..dd90ae2 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IAudioStreamLoader.h @@ -0,0 +1,40 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_AUDIO_STREAM_LOADER_H_INCLUDED__ +#define __I_IRRKLANG_AUDIO_STREAM_LOADER_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_IFileReader.h" + +namespace irrklang +{ + +class IAudioStream; + +//! Class which is able to create an audio file stream from a file. +class IAudioStreamLoader : public IRefCounted +{ +public: + + //! destructor + virtual ~IAudioStreamLoader() {}; + + //! Returns true if the file maybe is able to be loaded by this class. + /** This decision should be based only on the file extension (e.g. ".wav"). The given + filename string is guaranteed to be lower case. */ + virtual bool isALoadableFileExtension(const ik_c8* fileName) = 0; + + //! Creates an audio file input stream from a file + /** \return Pointer to the created audio stream. Returns 0 if loading failed. + If you no longer need the stream, you should call IAudioFileStream::drop(). + See IRefCounted::drop() for more information. */ + virtual IAudioStream* createAudioStream(IFileReader* file) = 0; +}; + + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IFileFactory.h b/Thirdparty/irrKlang/include/ik_IFileFactory.h new file mode 100644 index 0000000..4160acb --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IFileFactory.h @@ -0,0 +1,41 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_FILE_FACTORY_H_INCLUDED__ +#define __I_IRRKLANG_FILE_FACTORY_H_INCLUDED__ + +#include "ik_IRefCounted.h" + +namespace irrklang +{ + class IFileReader; + + //! Interface to overwrite file access in irrKlang. + /** Derive your own class from IFileFactory, overwrite the createFileReader() + method and return your own implemented IFileReader to overwrite file access of irrKlang. + Use ISoundEngine::addFileFactory() to let irrKlang know about your class. + Example code can be found in the tutorial 04.OverrideFileAccess. + */ + class IFileFactory : public virtual IRefCounted + { + public: + + virtual ~IFileFactory() {}; + + //! Opens a file for read access. + /** Derive your own class from IFileFactory, overwrite this + method and return your own implemented IFileReader to overwrite file access of irrKlang. + Use ISoundEngine::addFileFactory() to let irrKlang know about your class. + Example code can be found in the tutorial 04.OverrideFileAccess. + \param filename Name of file to open. + \return Returns a pointer to the created file interface. + The returned pointer should be dropped when no longer needed. + See IRefCounted::drop() for more information. Returns 0 if file cannot be opened. */ + virtual IFileReader* createFileReader(const ik_c8* filename) = 0; + }; + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IFileReader.h b/Thirdparty/irrKlang/include/ik_IFileReader.h new file mode 100644 index 0000000..818fe1a --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IFileReader.h @@ -0,0 +1,50 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_READ_FILE_H_INCLUDED__ +#define __I_IRRKLANG_READ_FILE_H_INCLUDED__ + +#include "ik_IRefCounted.h" + +namespace irrklang +{ + + //! Interface providing read acess to a file. + class IFileReader : public virtual IRefCounted + { + public: + + virtual ~IFileReader() {}; + + //! Reads an amount of bytes from the file. + //! \param buffer: Pointer to buffer where to read bytes will be written to. + //! \param sizeToRead: Amount of bytes to read from the file. + //! \return Returns how much bytes were read. + virtual ik_s32 read(void* buffer, ik_u32 sizeToRead) = 0; + + //! Changes position in file, returns true if successful. + //! \param finalPos: Destination position in the file. + //! \param relativeMovement: If set to true, the position in the file is + //! changed relative to current position. Otherwise the position is changed + //! from beginning of file. + //! \return Returns true if successful, otherwise false. + virtual bool seek(ik_s32 finalPos, bool relativeMovement = false) = 0; + + //! Returns size of file. + //! \return Returns the size of the file in bytes. + virtual ik_s32 getSize() = 0; + + //! Returns the current position in the file. + //! \return Returns the current position in the file in bytes. + virtual ik_s32 getPos() = 0; + + //! Returns name of file. + //! \return Returns the file name as zero terminated character string. + virtual const ik_c8* getFileName() = 0; + }; + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IRefCounted.h b/Thirdparty/irrKlang/include/ik_IRefCounted.h new file mode 100644 index 0000000..f86e8b9 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IRefCounted.h @@ -0,0 +1,119 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_IREFERENCE_COUNTED_H_INCLUDED__ +#define __I_IRRKLANG_IREFERENCE_COUNTED_H_INCLUDED__ + +#include "ik_irrKlangTypes.h" + +namespace irrklang +{ + //! Base class of most objects of the irrKlang. + /** This class provides reference counting through the methods grab() and drop(). + It also is able to store a debug string for every instance of an object. + Most objects of irrKlang are derived from IRefCounted, and so they are reference counted. + + When you receive an object in irrKlang (for example an ISound using play2D() or + play3D()), and you no longer need the object, you have + to call drop(). This will destroy the object, if grab() was not called + in another part of you program, because this part still needs the object. + Note, that you only don't need to call drop() for all objects you receive, it + will be explicitely noted in the documentation. + + A simple example: + + If you want to play a sound, you may want to call the method + ISoundEngine::play2D. You call + ISound* mysound = engine->play2D("foobar.mp3", false, false true); + If you no longer need the sound interface, call mysound->drop(). The + sound may still play on after this because the engine still has a reference + to that sound, but you can be sure that it's memory will be released as soon + the sound is no longer used. + + If you want to add a sound source, you may want to call a method + ISoundEngine::addSoundSourceFromFile. You do this like + ISoundSource* mysource = engine->addSoundSourceFromFile("example.jpg"); + You will not have to drop the pointer to the source, because + sound sources are managed by the engine (it will live as long as the sound engine) and + the documentation says so. + */ + class IRefCounted + { + public: + + //! Constructor. + IRefCounted() + : ReferenceCounter(1) + { + } + + //! Destructor. + virtual ~IRefCounted() + { + } + + //! Grabs the object. Increments the reference counter by one. + //! Someone who calls grab() to an object, should later also call + //! drop() to it. If an object never gets as much drop() as grab() + //! calls, it will never be destroyed. + //! The IRefCounted class provides a basic reference counting mechanism + //! with its methods grab() and drop(). Most objects of irrklang + //! are derived from IRefCounted, and so they are reference counted. + //! + //! When you receive an object in irrKlang (for example an ISound using play2D() or + //! play3D()), and you no longer need the object, you have + //! to call drop(). This will destroy the object, if grab() was not called + //! in another part of you program, because this part still needs the object. + //! Note, that you only don't need to call drop() for all objects you receive, it + //! will be explicitely noted in the documentation. + //! + //! A simple example: + //! + //! If you want to play a sound, you may want to call the method + //! ISoundEngine::play2D. You call + //! ISound* mysound = engine->play2D("foobar.mp3", false, false true); + //! If you no longer need the sound interface, call mysound->drop(). The + //! sound may still play on after this because the engine still has a reference + //! to that sound, but you can be sure that it's memory will be released as soon + //! the sound is no longer used. + void grab() { ++ReferenceCounter; } + + //! When you receive an object in irrKlang (for example an ISound using play2D() or + //! play3D()), and you no longer need the object, you have + //! to call drop(). This will destroy the object, if grab() was not called + //! in another part of you program, because this part still needs the object. + //! Note, that you only don't need to call drop() for all objects you receive, it + //! will be explicitely noted in the documentation. + //! + //! A simple example: + //! + //! If you want to play a sound, you may want to call the method + //! ISoundEngine::play2D. You call + //! ISound* mysound = engine->play2D("foobar.mp3", false, false true); + //! If you no longer need the sound interface, call mysound->drop(). The + //! sound may still play on after this because the engine still has a reference + //! to that sound, but you can be sure that it's memory will be released as soon + //! the sound is no longer used. + bool drop() + { + --ReferenceCounter; + + if (!ReferenceCounter) + { + delete this; + return true; + } + + return false; + } + + private: + + ik_s32 ReferenceCounter; + }; + +} // end namespace irr + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_ISound.h b/Thirdparty/irrKlang/include/ik_ISound.h new file mode 100644 index 0000000..3f267b9 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISound.h @@ -0,0 +1,194 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_H_INCLUDED__ + +#include "ik_IVirtualRefCounted.h" +#include "ik_ISoundEffectControl.h" +#include "ik_vec3d.h" + + +namespace irrklang +{ + class ISoundSource; + class ISoundStopEventReceiver; + + //! Represents a sound which is currently played. + /** The sound can be stopped, its volume or pan changed, effects added/removed + and similar using this interface. + Creating sounds is done using ISoundEngine::play2D() or ISoundEngine::play3D(). + More informations about the source of a sound can be obtained from the ISoundSource + interface. */ + class ISound : public IVirtualRefCounted + { + public: + + //! returns source of the sound which stores the filename and other informations about that sound + /** \return Returns the sound source poitner of this sound. May return 0 if the sound source + has been removed.*/ + virtual ISoundSource* getSoundSource() = 0; + + //! returns if the sound is paused + virtual void setIsPaused( bool paused = true) = 0; + + //! returns if the sound is paused + virtual bool getIsPaused() = 0; + + //! Will stop the sound and free its resources. + /** If you just want to pause the sound, use setIsPaused(). + After calling stop(), isFinished() will usually return true. + Be sure to also call ->drop() once you are done.*/ + virtual void stop() = 0; + + //! returns volume of the sound, a value between 0 (mute) and 1 (full volume). + /** (this volume gets multiplied with the master volume of the sound engine + and other parameters like distance to listener when played as 3d sound) */ + virtual ik_f32 getVolume() = 0; + + //! sets the volume of the sound, a value between 0 (mute) and 1 (full volume). + /** This volume gets multiplied with the master volume of the sound engine + and other parameters like distance to listener when played as 3d sound. */ + virtual void setVolume(ik_f32 volume) = 0; + + //! sets the pan of the sound. Takes a value between -1 and 1, 0 is center. + virtual void setPan(ik_f32 pan) = 0; + + //! returns the pan of the sound. Takes a value between -1 and 1, 0 is center. + virtual ik_f32 getPan() = 0; + + //! returns if the sound has been started to play looped + virtual bool isLooped() = 0; + + //! changes the loop mode of the sound. + /** If the sound is playing looped and it is changed to not-looped, then it + will stop playing after the loop has finished. + If it is not looped and changed to looped, the sound will start repeating to be + played when it reaches its end. + Invoking this method will not have an effect when the sound already has stopped. */ + virtual void setIsLooped(bool looped) = 0; + + //! returns if the sound has finished playing. + /** Don't mix this up with isPaused(). isFinished() returns if the sound has been + finished playing. If it has, is maybe already have been removed from the playing list of the + sound engine and calls to any other of the methods of ISound will not have any result. + If you call stop() to a playing sound will result that this function will return true + when invoked. */ + virtual bool isFinished() = 0; + + //! Sets the minimal distance if this is a 3D sound. + /** Changes the distance at which the 3D sound stops getting louder. This works + like this: As a listener approaches a 3D sound source, the sound gets louder. + Past a certain point, it is not reasonable for the volume to continue to increase. + Either the maximum (zero) has been reached, or the nature of the sound source + imposes a logical limit. This is the minimum distance for the sound source. + Similarly, the maximum distance for a sound source is the distance beyond + which the sound does not get any quieter. + The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f. */ + virtual void setMinDistance(ik_f32 min) = 0; + + //! Returns the minimal distance if this is a 3D sound. + /** See setMinDistance() for details. */ + virtual ik_f32 getMinDistance() = 0; + + //! Sets the maximal distance if this is a 3D sound. + /** Changing this value is usually not necessary. Use setMinDistance() instead. + Don't change this value if you don't know what you are doing: This value causes the sound + to stop attenuating after it reaches the max distance. Most people think that this sets the + volume of the sound to 0 after this distance, but this is not true. Only change the + minimal distance (using for example setMinDistance()) to influence this. + The maximum distance for a sound source is the distance beyond which the sound does not get any quieter. + The default minimum distance is 1, the default max distance is a huge number like 1000000000.0f. */ + virtual void setMaxDistance(ik_f32 max) = 0; + + //! Returns the maximal distance if this is a 3D sound. + /** See setMaxDistance() for details. */ + virtual ik_f32 getMaxDistance() = 0; + + //! sets the position of the sound in 3d space + virtual void setPosition(vec3df position) = 0; + + //! returns the position of the sound in 3d space + virtual vec3df getPosition() = 0; + + //! sets the position of the sound in 3d space, needed for Doppler effects. + /** To use doppler effects use ISound::setVelocity to set a sounds velocity, + ISoundEngine::setListenerPosition() to set the listeners velocity and + ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing + the doppler effects intensity. */ + virtual void setVelocity(vec3df vel) = 0; + + //! returns the velocity of the sound in 3d space, needed for Doppler effects. + /** To use doppler effects use ISound::setVelocity to set a sounds velocity, + ISoundEngine::setListenerPosition() to set the listeners velocity and + ISoundEngine::setDopplerEffectParameters() to adjust two parameters influencing + the doppler effects intensity. */ + virtual vec3df getVelocity() = 0; + + //! returns the current play position of the sound in milliseconds. + /** \return Returns -1 if not implemented or possible for this sound for example + because it already has been stopped and freed internally or similar. */ + virtual ik_u32 getPlayPosition() = 0; + + //! sets the current play position of the sound in milliseconds. + /** \param pos Position in milliseconds. Must be between 0 and the value returned + by getPlayPosition(). + \return Returns true successful. False is returned for example if the sound already finished + playing and is stopped or the audio source is not seekable, for example if it + is an internet stream or a a file format not supporting seeking (a .MOD file for example). + A file can be tested if it can bee seeking using ISoundSource::getIsSeekingSupported(). */ + virtual bool setPlayPosition(ik_u32 pos) = 0; + + //! Sets the playback speed (frequency) of the sound. + /** Plays the sound at a higher or lower speed, increasing or decreasing its + frequency which makes it sound lower or higher. + Note that this feature is not available on all sound output drivers (it is on the + DirectSound drivers at least), and it does not work together with the + 'enableSoundEffects' parameter of ISoundEngine::play2D and ISoundEngine::play3D when + using DirectSound. + \param speed Factor of the speed increase or decrease. 2 is twice as fast, + 0.5 is only half as fast. The default is 1.0. + \return Returns true if sucessful, false if not. The current sound driver might not + support changing the playBack speed, or the sound was started with the + 'enableSoundEffects' parameter. */ + virtual bool setPlaybackSpeed(ik_f32 speed = 1.0f) = 0; + + //! Returns the playback speed set by setPlaybackSpeed(). Default: 1.0f. + /** See setPlaybackSpeed() for details */ + virtual ik_f32 getPlaybackSpeed() = 0; + + //! returns the play length of the sound in milliseconds. + /** Returns -1 if not known for this sound for example because its decoder + does not support length reporting or it is a file stream of unknown size. + Note: You can also use ISoundSource::getPlayLength() to get the length of + a sound without actually needing to play it. */ + virtual ik_u32 getPlayLength() = 0; + + //! Returns the sound effect control interface for this sound. + /** Sound effects such as Chorus, Distorsions, Echo, Reverb and similar can + be controlled using this. The interface pointer is only valid as long as the ISound pointer is valid. + If the ISound pointer gets dropped (IVirtualRefCounted::drop()), the ISoundEffects + may not be used any more. + \return Returns a pointer to the sound effects interface if available. The sound + has to be started via ISoundEngine::play2D() or ISoundEngine::play3D(), + with the flag enableSoundEffects=true, otherwise 0 will be returned. Note that + if the output driver does not support sound effects, 0 will be returned as well.*/ + virtual ISoundEffectControl* getSoundEffectControl() = 0; + + //! Sets the sound stop event receiver, an interface which gets called if a sound has finished playing. + /** This event is guaranteed to be called when the sound or sound stream is finished, + either because the sound reached its playback end, its sound source was removed, + ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. + There is an example on how to use events in irrklang at @ref events . + \param receiver Interface to a user implementation of the sound receiver. This interface + should be as long valid as the sound exists or another stop event receiver is set. + Set this to null to set no sound stop event receiver. + \param userData: A iser data pointer, can be null. */ + virtual void setSoundStopEventReceiver(ISoundStopEventReceiver* reciever, void* userData=0) = 0; + }; + +} // end namespace irrklang + + +#endif diff --git a/Thirdparty/irrKlang/include/ik_ISoundDeviceList.h b/Thirdparty/irrKlang/include/ik_ISoundDeviceList.h new file mode 100644 index 0000000..bda2090 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundDeviceList.h @@ -0,0 +1,41 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_DEVICE_LIST_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_DEVICE_LIST_H_INCLUDED__ + +#include "ik_IRefCounted.h" + +namespace irrklang +{ + +//! A list of sound devices for a sound driver. Use irrklang::createSoundDeviceList() to create this list. +/** The function createIrrKlangDevice() has a parameter 'deviceID' which takes the value returned by +ISoundDeviceList::getDeviceID() and uses that device then. +The list of devices in ISoundDeviceList usually also includes the default device which is the first +entry and has an empty deviceID string ("") and the description "default device". +There is some example code on how to use the ISoundDeviceList in @ref enumeratingDevices.*/ +class ISoundDeviceList : public IRefCounted +{ +public: + + //! Returns amount of enumerated devices in the list. + virtual ik_s32 getDeviceCount() = 0; + + //! Returns the ID of the device. Use this string to identify this device in createIrrKlangDevice(). + /** \param index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1. + \return Returns a pointer to a string identifying the device. The string will only as long valid + as long as the ISoundDeviceList exists. */ + virtual const char* getDeviceID(ik_s32 index) = 0; + + //! Returns description of the device. + /** \param index Index of the device, a value between 0 and ISoundDeviceList::getDeviceCount()-1. */ + virtual const char* getDeviceDescription(ik_s32 index) = 0; +}; + + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_ISoundEffectControl.h b/Thirdparty/irrKlang/include/ik_ISoundEffectControl.h new file mode 100644 index 0000000..86ade35 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundEffectControl.h @@ -0,0 +1,243 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_EFFECT_CONTROL_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_EFFECT_CONTROL_H_INCLUDED__ + +#include "ik_IVirtualRefCounted.h" +#include "ik_vec3d.h" + + +namespace irrklang +{ + //! Interface to control the active sound effects (echo, reverb,...) of an ISound object, a playing sound. + /** Sound effects such as chorus, distorsions, echo, reverb and similar can + be controlled using this. An instance of this interface can be obtained via + ISound::getSoundEffectControl(). The sound containing this interface has to be started via + ISoundEngine::play2D() or ISoundEngine::play3D() with the flag enableSoundEffects=true, + otherwise no acccess to this interface will be available. + For the DirectSound driver, these are effects available since DirectSound8. For most + effects, sounds should have a sample rate of 44 khz and should be at least + 150 milli seconds long for optimal quality when using the DirectSound driver. + Note that the interface pointer is only valid as long as + the ISound pointer is valid. If the ISound pointer gets dropped (IVirtualRefCounted::drop()), + the ISoundEffects may not be used any more. */ + class ISoundEffectControl + { + public: + + //! Disables all active sound effects + virtual void disableAllEffects() = 0; + + //! Enables the chorus sound effect or adjusts its values. + /** Chorus is a voice-doubling effect created by echoing the + original sound with a slight delay and slightly modulating the delay of the echo. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f; + \param fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f; + \param fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f; + \param fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f; + \param sinusWaveForm True for sinus wave form, false for triangle. + \param fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f; + \param lPhase Phase differential between left and right LFOs. Possible values: + -180, -90, 0, 90, 180 + \return Returns true if successful. */ + virtual bool enableChorusSoundEffect(ik_f32 fWetDryMix = 50, + ik_f32 fDepth = 10, + ik_f32 fFeedback = 25, + ik_f32 fFrequency = 1.1, + bool sinusWaveForm = true, + ik_f32 fDelay = 16, + ik_s32 lPhase = 90) = 0; + + //! removes the sound effect from the sound + virtual void disableChorusSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isChorusSoundEffectEnabled() = 0; + + //! Enables the Compressor sound effect or adjusts its values. + /** Compressor is a reduction in the fluctuation of a signal above a certain amplitude. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fGain Output gain of signal after Compressor. Minimal Value:-60, Maximal Value:60.0f; + \param fAttack Time before Compressor reaches its full value. Minimal Value:0.01, Maximal Value:500.0f; + \param fRelease Speed at which Compressor is stopped after input drops below fThreshold. Minimal Value:50, Maximal Value:3000.0f; + \param fThreshold Point at which Compressor begins, in decibels. Minimal Value:-60, Maximal Value:0.0f; + \param fRatio Compressor ratio. Minimal Value:1, Maximal Value:100.0f; + \param fPredelay Time after lThreshold is reached before attack phase is started, in milliseconds. Minimal Value:0, Maximal Value:4.0f; + \return Returns true if successful. */ + virtual bool enableCompressorSoundEffect( ik_f32 fGain = 0, + ik_f32 fAttack = 10, + ik_f32 fRelease = 200, + ik_f32 fThreshold = -20, + ik_f32 fRatio = 3, + ik_f32 fPredelay = 4) = 0; + + //! removes the sound effect from the sound + virtual void disableCompressorSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isCompressorSoundEffectEnabled() = 0; + + //! Enables the Distortion sound effect or adjusts its values. + /** Distortion is achieved by adding harmonics to the signal in such a way that, + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + as the level increases, the top of the waveform becomes squared off or clipped. + \param fGain Amount of signal change after distortion. Minimal Value:-60, Maximal Value:0; + \param fEdge Percentage of distortion intensity. Minimal Value:0, Maximal Value:100; + \param fPostEQCenterFrequency Center frequency of harmonic content addition. Minimal Value:100, Maximal Value:8000; + \param fPostEQBandwidth Width of frequency band that determines range of harmonic content addition. Minimal Value:100, Maximal Value:8000; + \param fPreLowpassCutoff Filter cutoff for high-frequency harmonics attenuation. Minimal Value:100, Maximal Value:8000; + \return Returns true if successful. */ + virtual bool enableDistortionSoundEffect(ik_f32 fGain = -18, + ik_f32 fEdge = 15, + ik_f32 fPostEQCenterFrequency = 2400, + ik_f32 fPostEQBandwidth = 2400, + ik_f32 fPreLowpassCutoff = 8000) = 0; + + //! removes the sound effect from the sound + virtual void disableDistortionSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isDistortionSoundEffectEnabled() = 0; + + //! Enables the Echo sound effect or adjusts its values. + /** An echo effect causes an entire sound to be repeated after a fixed delay. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f; + \param fFeedback Percentage of output fed back into input. Minimal Value:0, Maximal Value:100.0f; + \param fLeftDelay Delay for left channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f; + \param fRightDelay Delay for right channel, in milliseconds. Minimal Value:1, Maximal Value:2000.0f; + \param lPanDelay Value that specifies whether to swap left and right delays with each successive echo. Minimal Value:0, Maximal Value:1; + \return Returns true if successful. */ + virtual bool enableEchoSoundEffect(ik_f32 fWetDryMix = 50, + ik_f32 fFeedback = 50, + ik_f32 fLeftDelay = 500, + ik_f32 fRightDelay = 500, + ik_s32 lPanDelay = 0) = 0; + + //! removes the sound effect from the sound + virtual void disableEchoSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isEchoSoundEffectEnabled() = 0; + + //! Enables the Flanger sound effect or adjusts its values. + /** Flange is an echo effect in which the delay between the original + signal and its echo is very short and varies over time. The result is + sometimes referred to as a sweeping sound. The term flange originated + with the practice of grabbing the flanges of a tape reel to change the speed. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fWetDryMix Ratio of wet (processed) signal to dry (unprocessed) signal. Minimal Value:0, Maximal Value:100.0f; + \param fDepth Percentage by which the delay time is modulated by the low-frequency oscillator, in hundredths of a percentage point. Minimal Value:0, Maximal Value:100.0f; + \param fFeedback Percentage of output signal to feed back into the effect's input. Minimal Value:-99, Maximal Value:99.0f; + \param fFrequency Frequency of the LFO. Minimal Value:0, Maximal Value:10.0f; + \param triangleWaveForm True for triangle wave form, false for square. + \param fDelay Number of milliseconds the input is delayed before it is played back. Minimal Value:0, Maximal Value:20.0f; + \param lPhase Phase differential between left and right LFOs. Possible values: + -180, -90, 0, 90, 180 + \return Returns true if successful. */ + virtual bool enableFlangerSoundEffect(ik_f32 fWetDryMix = 50, + ik_f32 fDepth = 100, + ik_f32 fFeedback = -50, + ik_f32 fFrequency = 0.25f, + bool triangleWaveForm = true, + ik_f32 fDelay = 2, + ik_s32 lPhase = 0) = 0; + + //! removes the sound effect from the sound + virtual void disableFlangerSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isFlangerSoundEffectEnabled() = 0; + + //! Enables the Gargle sound effect or adjusts its values. + /** The gargle effect modulates the amplitude of the signal. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param rateHz Rate of modulation, in Hertz. Minimal Value:1, Maximal Value:1000 + \param sinusWaveForm True for sinus wave form, false for triangle. + \return Returns true if successful. */ + virtual bool enableGargleSoundEffect(ik_s32 rateHz = 20, bool sinusWaveForm = true) = 0; + + //! removes the sound effect from the sound + virtual void disableGargleSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isGargleSoundEffectEnabled() = 0; + + //! Enables the Interactive 3D Level 2 reverb sound effect or adjusts its values. + /** An implementation of the listener properties in the I3DL2 specification. Source properties are not supported. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param lRoom Attenuation of the room effect, in millibels (mB). Interval: [-10000, 0] Default: -1000 mB + \param lRoomHF Attenuation of the room high-frequency effect. Interval: [-10000, 0] default: 0 mB + \param flRoomRolloffFactor Rolloff factor for the reflected signals. Interval: [0.0, 10.0] default: 0.0 + \param flDecayTime Decay time, in seconds. Interval: [0.1, 20.0] default: 1.49s + \param flDecayHFRatio Ratio of the decay time at high frequencies to the decay time at low frequencies. Interval: [0.1, 2.0] default: 0.83 + \param lReflections Attenuation of early reflections relative to lRoom. Interval: [-10000, 1000] default: -2602 mB + \param flReflectionsDelay Delay time of the first reflection relative to the direct path in seconds. Interval: [0.0, 0.3] default: 0.007 s + \param lReverb Attenuation of late reverberation relative to lRoom, in mB. Interval: [-10000, 2000] default: 200 mB + \param flReverbDelay Time limit between the early reflections and the late reverberation relative to the time of the first reflection. Interval: [0.0, 0.1] default: 0.011 s + \param flDiffusion Echo density in the late reverberation decay in percent. Interval: [0.0, 100.0] default: 100.0 % + \param flDensity Modal density in the late reverberation decay, in percent. Interval: [0.0, 100.0] default: 100.0 % + \param flHFReference Reference high frequency, in hertz. Interval: [20.0, 20000.0] default: 5000.0 Hz + \return Returns true if successful. */ + virtual bool enableI3DL2ReverbSoundEffect(ik_s32 lRoom = -1000, + ik_s32 lRoomHF = -100, + ik_f32 flRoomRolloffFactor = 0, + ik_f32 flDecayTime = 1.49f, + ik_f32 flDecayHFRatio = 0.83f, + ik_s32 lReflections = -2602, + ik_f32 flReflectionsDelay = 0.007f, + ik_s32 lReverb = 200, + ik_f32 flReverbDelay = 0.011f, + ik_f32 flDiffusion = 100.0f, + ik_f32 flDensity = 100.0f, + ik_f32 flHFReference = 5000.0f ) = 0; + + //! removes the sound effect from the sound + virtual void disableI3DL2ReverbSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isI3DL2ReverbSoundEffectEnabled() = 0; + + //! Enables the ParamEq sound effect or adjusts its values. + /** Parametric equalizer amplifies or attenuates signals of a given frequency. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fCenter Center frequency, in hertz, The default value is 8000. Minimal Value:80, Maximal Value:16000.0f + \param fBandwidth Bandwidth, in semitones, The default value is 12. Minimal Value:1.0f, Maximal Value:36.0f + \param fGain Gain, default value is 0. Minimal Value:-15.0f, Maximal Value:15.0f + \return Returns true if successful. */ + virtual bool enableParamEqSoundEffect(ik_f32 fCenter = 8000, + ik_f32 fBandwidth = 12, + ik_f32 fGain = 0) = 0; + + //! removes the sound effect from the sound + virtual void disableParamEqSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isParamEqSoundEffectEnabled() = 0; + + //! Enables the Waves Reverb sound effect or adjusts its values. + /** \param fInGain Input gain of signal, in decibels (dB). Min/Max: [-96.0,0.0] Default: 0.0 dB. + If this sound effect is already enabled, calling this only modifies the parameters of the active effect. + \param fReverbMix Reverb mix, in dB. Min/Max: [-96.0,0.0] Default: 0.0 dB + \param fReverbTime Reverb time, in milliseconds. Min/Max: [0.001,3000.0] Default: 1000.0 ms + \param fHighFreqRTRatio High-frequency reverb time ratio. Min/Max: [0.001,0.999] Default: 0.001 + \return Returns true if successful. */ + virtual bool enableWavesReverbSoundEffect(ik_f32 fInGain = 0, + ik_f32 fReverbMix = 0, + ik_f32 fReverbTime = 1000, + ik_f32 fHighFreqRTRatio = 0.001f) = 0; + + //! removes the sound effect from the sound + virtual void disableWavesReverbSoundEffect() = 0; + + //! returns if the sound effect is active on the sound + virtual bool isWavesReverbSoundEffectEnabled() = 0; + }; + +} // end namespace irrklang + + +#endif diff --git a/Thirdparty/irrKlang/include/ik_ISoundEngine.h b/Thirdparty/irrKlang/include/ik_ISoundEngine.h new file mode 100644 index 0000000..fdb25e8 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundEngine.h @@ -0,0 +1,436 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_ENGINE_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_vec3d.h" +#include "ik_ISoundSource.h" +#include "ik_ISound.h" +#include "ik_EStreamModes.h" +#include "ik_IFileFactory.h" +#include "ik_ISoundMixedOutputReceiver.h" + + +namespace irrklang +{ + class IAudioStreamLoader; + struct SInternalAudioInterface; + + //! Interface to the sound engine, for playing 3d and 2d sound and music. + /** This is the main interface of irrKlang. You usually would create this using + the createIrrKlangDevice() function. + */ + class ISoundEngine : public virtual irrklang::IRefCounted + { + public: + + //! returns the name of the sound driver, like 'ALSA' for the alsa device + /** Possible returned strings are "NULL", "ALSA", "CoreAudio", "winMM", + "DirectSound" and "DirectSound8". */ + virtual const char* getDriverName() = 0; + + //! loads a sound source (if not loaded already) from a file and plays it. + /** \param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg". + \param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to + ISound have no effect after such a non looped sound has been stopped automaticly. + \param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing + parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to + modify some of the sound parameters and then call ISound::setPaused(false); + Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound + object anymore. See 'return' for details. + \param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details. + \param streamMode Specifies if the file should be streamed or loaded completely into memory for playing. + ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the + engine, this parameter has no effect. + \param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, + reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). + Only enable if necessary. + \return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or + 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, + you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this + will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or + 'enableSoundEffects' have been set to true, if the sound could not be played.*/ + virtual ISound* play2D(const char* soundFileName, + bool playLooped = false, + bool startPaused = false, + bool track = false, + E_STREAM_MODE streamMode = ESM_AUTO_DETECT, + bool enableSoundEffects = false) = 0; + + //! Plays a sound source as 2D sound with its default settings stored in ISoundSource. + /** An ISoundSource object will be created internally when playing a sound the first time, + or can be added with getSoundSource(). + \param source The sound source, specifiying sound file source and default settings for this file. + Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this. + \param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to + ISound have no effect after such a non looped sound has been stopped automaticly. + \param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing + parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to + modify some of the sound parameters and then call ISound::setPaused(false); + Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound + object anymore. See 'return' for details. + \param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details. + \param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, + reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). + Only enable if necessary. + \return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or + 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, + you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this + will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or + 'enableSoundEffects' have been set to true, if the sound could not be played.*/ + virtual ISound* play2D(ISoundSource* source, + bool playLooped = false, + bool startPaused = false, + bool track = false, + bool enableSoundEffects = false) = 0; + + //! Loads a sound source (if not loaded already) from a file and plays it as 3D sound. + /** There is some example code on how to work with 3D sound at @ref sound3d. + \param sourceFileName Filename of sound, like "sounds/test.wav" or "foobar.ogg". + \param pos Position of the 3D sound. + \param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to + ISound have no effect after such a non looped sound has been stopped automaticly. + \param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing + parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to + modify some of the sound parameters and then call ISound::setPaused(false); + Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound + object anymore. See 'return' for details. + \param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details. + \param streamMode Specifies if the file should be streamed or loaded completely into memory for playing. + ESM_AUTO_DETECT sets this to autodetection. Note: if the sound has been loaded or played before into the + engine, this parameter has no effect. + \param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, + reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). + Only enable if necessary. + \return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or + 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, + you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this + will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or + 'enableSoundEffects' have been set to true, if the sound could not be played.*/ + virtual ISound* play3D(const char* soundFileName, vec3df pos, + bool playLooped = false, + bool startPaused = false, + bool track = false, + E_STREAM_MODE streamMode = ESM_AUTO_DETECT, + bool enableSoundEffects = false) = 0; + + //! Plays a sound source as 3D sound with its default settings stored in ISoundSource. + /** An ISoundSource object will be created internally when playing a sound the first time, + or can be added with getSoundSource(). There is some example code on how to work with 3D sound @ref sound3d. + \param source The sound source, specifiying sound file source and default settings for this file. + Use the other ISoundEngine::play2D() overloads if you want to specify a filename string instead of this. + \param pos Position of the 3D sound. + \param playLooped plays the sound in loop mode. If set to 'false', the sound is played once, then stopped and deleted from the internal playing list. Calls to + ISound have no effect after such a non looped sound has been stopped automaticly. + \param startPaused starts the sound paused. This implies that track=true. Use this if you want to modify some of the playing + parameters before the sound actually plays. Usually you would set this parameter to true, then use the ISound interface to + modify some of the sound parameters and then call ISound::setPaused(false); + Note: You need to call ISound::drop() when setting this parameter to true and you don't need the ISound + object anymore. See 'return' for details. + \param track Makes it possible to track the sound. Causes the method to return an ISound interface. See 'return' for details. + \param enableSoundEffects Makes it possible to use sound effects such as chorus, distorsions, echo, + reverb and similar for this sound. Sound effects can then be controlled via ISound::getSoundEffectControl(). + Only enable if necessary. + \return Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or + 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, + you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this + will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or + 'enableSoundEffects' have been set to true, if the sound could not be played.*/ + virtual ISound* play3D(ISoundSource* source, vec3df pos, + bool playLooped = false, + bool startPaused = false, + bool track = false, + bool enableSoundEffects = false) = 0; + + //! Stops all currently playing sounds. + virtual void stopAllSounds() = 0; + + //! Pauses or unpauses all currently playing sounds. + virtual void setAllSoundsPaused( bool bPaused = true ) = 0; + + //! Gets a sound source by sound name. Adds the sound source as file into the sound engine if not loaded already. + /** Please note: For performance reasons most ISoundEngine implementations will + not try to load the sound when calling this method, but only when play() is called + with this sound source as parameter. + \param addIfNotFound if 'true' adds the sound source to the list and returns the interface to it + if it cannot be found in the sound source list. If 'false', returns 0 if the sound + source is not in the list and does not modify the list. Default value: true. + \return Returns the sound source or 0 if not available. + Note: Don't call drop() to this pointer, it will be managed by irrKlang and + exist as long as you don't delete irrKlang or call removeSoundSource(). However, + you are free to call grab() if you want and drop() it then later of course. */ + virtual ISoundSource* getSoundSource(const ik_c8* soundName, bool addIfNotFound=true) = 0; + + //! Returns a sound source by index. + /** \param idx: Index of the loaded sound source, must by smaller than getSoundSourceCount(). + \return Returns the sound source or 0 if not available. + Note: Don't call drop() to this pointer, it will be managed by irrKlang and + exist as long as you don't delete irrKlang or call removeSoundSource(). However, + you are free to call grab() if you want and drop() it then later of course. */ + virtual ISoundSource* getSoundSource(ik_s32 index) = 0; + + //! Returns amount of loaded sound sources. + virtual ik_s32 getSoundSourceCount() = 0; + + //! Adds sound source into the sound engine as file. + /** \param fileName Name of the sound file (e.g. "sounds/something.mp3"). You can also use this + name when calling play3D() or play2D(). + \param mode Streaming mode for this sound source + \param preload If this flag is set to false (which is default) the sound engine will + not try to load the sound file when calling this method, but only when play() is called + with this sound source as parameter. Otherwise the sound will be preloaded. + \return Returns the pointer to the added sound source or 0 if not sucessful because for + example a sound already existed with that name. If not successful, the reason will be printed + into the log. Note: Don't call drop() to this pointer, it will be managed by irrKlang and + exist as long as you don't delete irrKlang or call removeSoundSource(). However, + you are free to call grab() if you want and drop() it then later of course. */ + virtual ISoundSource* addSoundSourceFromFile(const ik_c8* fileName, E_STREAM_MODE mode=ESM_AUTO_DETECT, + bool preload=false) = 0; + + //! Adds a sound source into the sound engine as memory source. + /** Note: This method only accepts a file (.wav, .ogg, etc) which is totally loaded into memory. + If you want to add a sound source from decoded plain PCM data in memory, use addSoundSourceFromPCMData() instead. + \param memory Pointer to the memory to be treated as loaded sound file. + \param sizeInBytes Size of the memory chunk, in bytes. + \param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this + name when calling play3D() or play2D(). Hint: If you include the extension of the original file + like .ogg, .mp3 or .wav at the end of the filename, irrKlang will be able to decide better what + file format it is and might be able to start playback faster. + \param copyMemory If set to true which is default, the memory block is copied + and stored in the engine, after calling addSoundSourceFromMemory() the memory pointer can be deleted + savely. If set to false, the memory is not copied and the user takes the responsibility that + the memory block pointed to remains there as long as the sound engine or at least this sound + source exists. + \return Returns the pointer to the added sound source or 0 if not sucessful because for example a sound already + existed with that name. If not successful, the reason will be printed into the log. + Note: Don't call drop() to this pointer, it will be managed by irrKlang and exist as long as you don't + delete irrKlang or call removeSoundSource(). However, you are free to call grab() if you + want and drop() it then later of course. */ + virtual ISoundSource* addSoundSourceFromMemory(void* memory, ik_s32 sizeInBytes, const ik_c8* soundName, + bool copyMemory=true) = 0; + + + //! Adds a sound source into the sound engine from plain PCM data in memory. + /** \param memory Pointer to the memory to be treated as loaded sound file. + \param sizeInBytes Size of the memory chunk, in bytes. + \param soundName Name of the virtual sound file (e.g. "sounds/something.mp3"). You can also use this + name when calling play3D() or play2D(). + \param copyMemory If set to true which is default, the memory block is copied + and stored in the engine, after calling addSoundSourceFromPCMData() the memory pointer can be deleted + savely. If set to true, the memory is not copied and the user takes the responsibility that + the memory block pointed to remains there as long as the sound engine or at least this sound + source exists. + \return Returns the pointer to the added sound source or 0 if not sucessful because for + example a sound already existed with that name. If not successful, the reason will be printed + into the log. */ + virtual ISoundSource* addSoundSourceFromPCMData(void* memory, ik_s32 sizeInBytes, + const ik_c8* soundName, SAudioStreamFormat format, + bool copyMemory=true) = 0; + + //! Adds a sound source as alias for an existing sound source, but with a different name or optional different default settings. + /** This is useful if you want to play multiple sounds but each sound isn't necessarily one single file. + Also useful if you want to or play the same sound using different names, volumes or min and max 3D distances. + \param baseSource The sound source where this sound source should be based on. This sound + source will use the baseSource as base to access the file and similar, but it will have its + own name and its own default settings. + \param soundName Name of the new sound source to be added. + \return Returns the pointer to the added sound source or 0 if not sucessful because for + example a sound already existed with that name. If not successful, the reason will be printed + into the log.*/ + virtual ISoundSource* addSoundSourceAlias(ISoundSource* baseSource, const ik_c8* soundName) = 0; + + //! Removes a sound source from the engine, freeing the memory it occupies. + /** This will also cause all currently playing sounds of this source to be stopped. + Also note that if the source has been removed successfully, the value returned + by getSoundSourceCount() will have been decreased by one. + Removing sound sources is only necessary if you know you won't use a lot of non-streamed + sounds again. Sound sources of streamed sounds do not cost a lot of memory.*/ + virtual void removeSoundSource(ISoundSource* source) = 0; + + //! Removes a sound source from the engine, freeing the memory it occupies. + /** This will also cause all currently playing sounds of this source to be stopped. + Also note that if the source has been removed successfully, the value returned + by getSoundSourceCount() will have been decreased by one. + Removing sound sources is only necessary if you know you won't use a lot of non-streamed + sounds again. Sound sources of streamed sounds do not cost a lot of memory. */ + virtual void removeSoundSource(const ik_c8* name) = 0; + + //! Removes all sound sources from the engine + /** This will also cause all sounds to be stopped. + Removing sound sources is only necessary if you know you won't use a lot of non-streamed + sounds again. Sound sources of streamed sounds do not cost a lot of memory. */ + virtual void removeAllSoundSources() = 0; + + //! Sets master sound volume. This value is multiplied with all sounds played. + /** \param volume 0 (silent) to 1.0f (full volume) */ + virtual void setSoundVolume(ik_f32 volume) = 0; + + //! Returns master sound volume. + /* A value between 0.0 and 1.0. Default is 1.0. Can be changed using setSoundVolume(). */ + virtual ik_f32 getSoundVolume() = 0; + + //! Sets the current listener 3d position. + /** When playing sounds in 3D, updating the position of the listener every frame should be + done using this function. + \param pos Position of the camera or listener. + \param lookdir Direction vector where the camera or listener is looking into. If you have a + camera position and a target 3d point where it is looking at, this would be cam->getTarget() - cam->getAbsolutePosition(). + \param velPerSecond The velocity per second describes the speed of the listener and + is only needed for doppler effects. + \param upvector Vector pointing 'up', so the engine can decide where is left and right. + This vector is usually (0,1,0).*/ + virtual void setListenerPosition(const vec3df& pos, + const vec3df& lookdir, + const vec3df& velPerSecond = vec3df(0,0,0), + const vec3df& upVector = vec3df(0,1,0)) = 0; + + //! Updates the audio engine. This should be called several times per frame if irrKlang was started in single thread mode. + /** This updates the 3d positions of the sounds as well as their volumes, effects, + streams and other stuff. Call this several times per frame (the more the better) if you + specified irrKlang to run single threaded. Otherwise it is not necessary to use this method. + This method is being called by the scene manager automaticly if you are using one, so + you might want to ignore this. */ + virtual void update() = 0; + + //! Returns if a sound with the specified name is currently playing. + virtual bool isCurrentlyPlaying(const char* soundName) = 0; + + //! Returns if a sound with the specified source is currently playing. + virtual bool isCurrentlyPlaying(ISoundSource* source) = 0; + + //! Stops all sounds of a specific sound source + virtual void stopAllSoundsOfSoundSource(ISoundSource* source) = 0; + + //! Registers a new audio stream loader in the sound engine. + /** Use this to enhance the audio engine to support other or new file formats. + To do this, implement your own IAudioStreamLoader interface and register it + with this method */ + virtual void registerAudioStreamLoader(IAudioStreamLoader* loader) = 0; + + //! Returns if irrKlang is running in the same thread as the application or is using multithreading. + /** This basicly returns the flag set by the user when creating the sound engine.*/ + virtual bool isMultiThreaded() const = 0; + + //! Adds a file factory to the sound engine, making it possible to override file access of the sound engine. + /** Derive your own class from IFileFactory, overwrite the createFileReader() + method and return your own implemented IFileReader to overwrite file access of irrKlang. */ + virtual void addFileFactory(IFileFactory* fileFactory) = 0; + + //! Sets the default minimal distance for 3D sounds. + /** This value influences how loud a sound is heard based on its distance. + See ISound::setMinDistance() for details about what the min distance is. + It is also possible to influence this default value for every sound file + using ISoundSource::setDefaultMinDistance(). + This method only influences the initial distance value of sounds. For changing the + distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance(). + \param minDistance Default minimal distance for 3d sounds. The default value is 1.0f.*/ + virtual void setDefault3DSoundMinDistance(ik_f32 minDistance) = 0; + + //! Returns the default minimal distance for 3D sounds. + /** This value influences how loud a sound is heard based on its distance. + You can change it using setDefault3DSoundMinDistance(). + See ISound::setMinDistance() for details about what the min distance is. + It is also possible to influence this default value for every sound file + using ISoundSource::setDefaultMinDistance(). + \return Default minimal distance for 3d sounds. The default value is 1.0f. */ + virtual ik_f32 getDefault3DSoundMinDistance() = 0; + + //! Sets the default maximal distance for 3D sounds. + /** Changing this value is usually not necessary. Use setDefault3DSoundMinDistance() instead. + Don't change this value if you don't know what you are doing: This value causes the sound + to stop attenuating after it reaches the max distance. Most people think that this sets the + volume of the sound to 0 after this distance, but this is not true. Only change the + minimal distance (using for example setDefault3DSoundMinDistance()) to influence this. + See ISound::setMaxDistance() for details about what the max distance is. + It is also possible to influence this default value for every sound file + using ISoundSource::setDefaultMaxDistance(). + This method only influences the initial distance value of sounds. For changing the + distance after the sound has been started to play, use ISound::setMinDistance() and ISound::setMaxDistance(). + \param maxDistance Default maximal distance for 3d sounds. The default value is 1000000000.0f. */ + virtual void setDefault3DSoundMaxDistance(ik_f32 maxDistance) = 0; + + //! Returns the default maximal distance for 3D sounds. + /** This value influences how loud a sound is heard based on its distance. + You can change it using setDefault3DSoundmaxDistance(), but + changing this value is usually not necessary. This value causes the sound + to stop attenuating after it reaches the max distance. Most people think that this sets the + volume of the sound to 0 after this distance, but this is not true. Only change the + minimal distance (using for example setDefault3DSoundMinDistance()) to influence this. + See ISound::setMaxDistance() for details about what the max distance is. + It is also possible to influence this default value for every sound file + using ISoundSource::setDefaultMaxDistance(). + \return Default maximal distance for 3d sounds. The default value is 1000000000.0f. */ + virtual ik_f32 getDefault3DSoundMaxDistance() = 0; + + //! Sets a rolloff factor which influences the amount of attenuation that is applied to 3D sounds. + /** The rolloff factor can range from 0.0 to 10.0, where 0 is no rolloff. 1.0 is the default + rolloff factor set, the value which we also experience in the real world. A value of 2 would mean + twice the real-world rolloff. */ + virtual void setRolloffFactor(ik_f32 rolloff) = 0; + + //! Sets parameters affecting the doppler effect. + /** \param dopplerFactor is a value between 0 and 10 which multiplies the doppler + effect. Default value is 1.0, which is the real world doppler effect, and 10.0f + would be ten times the real world doppler effect. + \param distanceFactor is the number of meters in a vector unit. The default value + is 1.0. Doppler effects are calculated in meters per second, with this parameter, + this can be changed, all velocities and positions are influenced by this. If + the measurement should be in foot instead of meters, set this value to 0.3048f + for example.*/ + virtual void setDopplerEffectParameters(ik_f32 dopplerFactor=1.0f, ik_f32 distanceFactor=1.0f) = 0; + + //! Loads irrKlang plugins from a custom path. + /** Plugins usually are .dll, .so or .dylib + files named for example ikpMP3.dll (= short for irrKlangPluginMP3) which + make it possible to play back mp3 files. Plugins are being + loaded from the current working directory at startup of the sound engine + if the parameter ESEO_LOAD_PLUGINS is set (which it is by default), but + using this method, it is possible to load plugins from a custom path in addition. + \param path Path to the plugin directory, like "C:\games\somegamegame\irrklangplugins". + \return returns true if sucessful or fals if not, for example because the path could + not be found. */ + virtual bool loadPlugins(const ik_c8* path) = 0; + + //! Returns a pointer to internal sound engine pointers, like the DirectSound interface. + /** Use this with caution. This is only exposed to make it possible for other libraries + such as Video playback packages to extend or use the sound driver irrklang uses. */ + virtual const SInternalAudioInterface& getInternalAudioInterface() = 0; + + //! Sets the OutputMixedDataReceiver, so you can receive the pure mixed output audio data while it is being played. + /** This can be used to store the sound output as .wav file or for creating a Oscillograph or similar. + This works only with software based audio drivers, that is ESOD_WIN_MM, ESOD_ALSA, and ESOD_CORE_AUDIO. + Returns true if sucessful and fals if the current audio driver doesn't support this feature. Set this to null + again once you don't need it anymore. */ + virtual bool setMixedDataOutputReceiver(ISoundMixedOutputReceiver* receiver) = 0; + }; + + + //! structure for returning pointers to the internal audio interface. + /** Use ISoundEngine::getInternalAudioInterface() to get this. */ + struct SInternalAudioInterface + { + //! IDirectSound interface, this is not null when using the ESOD_DIRECT_SOUND audio driver + void* pIDirectSound; + + //! IDirectSound8 interface, this is not null when using the ESOD_DIRECT_SOUND8 audio driver + void* pIDirectSound8; + + //! HWaveout interface, this is not null when using the ESOD_WIN_MM audio driver + void* pWinMM_HWaveOut; + + //! ALSA PCM Handle interface, this is not null when using the ESOD_ALSA audio driver + void* pALSA_SND_PCM; + + //! AudioDeviceID handle, this is not null when using the ESOD_CORE_AUDIO audio driver + ik_u32 pCoreAudioDeciceID; + }; + + + +} // end namespace irrklang + + +#endif diff --git a/Thirdparty/irrKlang/include/ik_ISoundMixedOutputReceiver.h b/Thirdparty/irrKlang/include/ik_ISoundMixedOutputReceiver.h new file mode 100644 index 0000000..8f6d58e --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundMixedOutputReceiver.h @@ -0,0 +1,46 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_MIXED_OUTPUT_RECEIVER_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_MIXED_OUTPUT_RECEIVER_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_SAudioStreamFormat.h" + + +namespace irrklang +{ + + +//! Interface to be implemented by the user, which recieves the mixed output when it it played by the sound engine. +/** This can be used to store the sound output as .wav file or for creating a Oscillograph or similar. + Simply implement your own class derived from ISoundMixedOutputReceiver and use ISoundEngine::setMixedDataOutputReceiver + to let the audio driver know about it. */ +class ISoundMixedOutputReceiver +{ +public: + + //! destructor + virtual ~ISoundMixedOutputReceiver() {}; + + //! Called when a chunk of sound has been mixed and is about to be played. + /** Note: This is called from the playing thread of the sound library, so you need to + make everything you are doing in this method thread safe. Additionally, it would + be a good idea to do nothing complicated in your implementation and return as fast as possible, + otherwise sound output may be stuttering. + \param data representing the sound frames which just have been mixed. Sound data always + consists of two interleaved sound channels at 16bit per frame. + \param byteCount Amount of bytes of the data + \param playbackrate The playback rate at samples per second (usually something like 44000). + This value will not change and always be the same for an instance of an ISoundEngine. */ + virtual void OnAudioDataReady(const void* data, int byteCount, int playbackrate) = 0; + +}; + + +} // end namespace irrklang + + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_ISoundSource.h b/Thirdparty/irrKlang/include/ik_ISoundSource.h new file mode 100644 index 0000000..087d295 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundSource.h @@ -0,0 +1,167 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__ +#define __I_IRRKLANG_IRR_SOUND_SOURCE_H_INCLUDED__ + +#include "ik_IVirtualRefCounted.h" +#include "ik_vec3d.h" +#include "ik_EStreamModes.h" +#include "ik_SAudioStreamFormat.h" + + +namespace irrklang +{ + + //! A sound source describes an input file (.ogg, .mp3, .wav or similar) and its default settings. + /** It provides some informations about the sound source like the play lenght and + can have default settings for volume, distances for 3d etc. There is some example code on how + to use Sound sources at @ref soundSources.*/ + class ISoundSource : public IVirtualRefCounted + { + public: + + //! Returns the name of the sound source (usually, this is the file name) + virtual const ik_c8* getName() = 0; + + //! Sets the stream mode which should be used for a sound played from this source. + /** Note that if this is set to ESM_NO_STREAMING, the engine still might decide + to stream the sound if it is too big. The threashold for this can be + adjusted using ISoundSource::setForcedStreamingThreshold(). */ + virtual void setStreamMode(E_STREAM_MODE mode) = 0; + + //! Returns the detected or set type of the sound with wich the sound will be played. + /** Note: If the returned type is ESM_AUTO_DETECT, this mode will change after the + sound has been played the first time. */ + virtual E_STREAM_MODE getStreamMode() = 0; + + //! Returns the play length of the sound in milliseconds. + /** Returns -1 if not known for this sound for example because its decoder + does not support lenght reporting or it is a file stream of unknown size. + Note: If the sound never has been played before, the sound engine will have to open + the file and try to get the play lenght from there, so this call could take a bit depending + on the type of file. */ + virtual ik_u32 getPlayLength() = 0; + + //! Returns informations about the sound source: channel count (mono/stereo), frame count, sample rate, etc. + /** \return Returns the structure filled with 0 or negative values if not known for this sound for example because + because the file could not be opened or similar. + Note: If the sound never has been played before, the sound engine will have to open + the file and try to get the play lenght from there, so this call could take a bit depending + on the type of file. */ + virtual SAudioStreamFormat getAudioFormat() = 0; + + //! Returns if sounds played from this source will support seeking via ISound::setPlayPosition(). + /* If a sound is seekable depends on the file type and the audio format. For example MOD files + cannot be seeked currently. + \return Returns true of the sound source supports setPlayPosition() and false if not. + Note: If the sound never has been played before, the sound engine will have to open + the file and try to get the information from there, so this call could take a bit depending + on the type of file. */ + virtual bool getIsSeekingSupported() = 0; + + //! Sets the default volume for a sound played from this source. + /** The default value of this is 1.0f. + Note that the default volume is being multiplied with the master volume + of ISoundEngine, change this via ISoundEngine::setSoundVolume(). + //! \param volume 0 (silent) to 1.0f (full volume). Default value is 1.0f. */ + virtual void setDefaultVolume(ik_f32 volume=1.0f) = 0; + + //! Returns the default volume for a sound played from this source. + /** You can influence this default volume value using setDefaultVolume(). + Note that the default volume is being multiplied with the master volume + of ISoundEngine, change this via ISoundEngine::setSoundVolume(). + //! \return 0 (silent) to 1.0f (full volume). Default value is 1.0f. */ + virtual ik_f32 getDefaultVolume() = 0; + + //! sets the default minimal distance for 3D sounds played from this source. + /** This value influences how loud a sound is heard based on its distance. + See ISound::setMinDistance() for details about what the min distance is. + This method only influences the initial distance value of sounds. For changing the + distance while the sound is playing, use ISound::setMinDistance() and ISound::setMaxDistance(). + \param minDistance: Default minimal distance for 3D sounds from this source. Set it to a negative + value to let sounds of this source use the engine level default min distance, which + can be set via ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing + the default min distance of the sound engine to take effect. */ + virtual void setDefaultMinDistance(ik_f32 minDistance) = 0; + + //! Returns the default minimal distance for 3D sounds played from this source. + /** This value influences how loud a sound is heard based on its distance. + See ISound::setMinDistance() for details about what the minimal distance is. + \return Default minimal distance for 3d sounds from this source. If setDefaultMinDistance() + was set to a negative value, it will return the default value set in the engine, + using ISoundEngine::setDefault3DSoundMinDistance(). Default value is -1, causing + the default min distance of the sound engine to take effect. */ + virtual ik_f32 getDefaultMinDistance() = 0; + + //! Sets the default maximal distance for 3D sounds played from this source. + /** Changing this value is usually not necessary. Use setDefaultMinDistance() instead. + Don't change this value if you don't know what you are doing: This value causes the sound + to stop attenuating after it reaches the max distance. Most people think that this sets the + volume of the sound to 0 after this distance, but this is not true. Only change the + minimal distance (using for example setDefaultMinDistance()) to influence this. + See ISound::setMaxDistance() for details about what the max distance is. + This method only influences the initial distance value of sounds. For changing the + distance while the sound is played, use ISound::setMinDistance() + and ISound::setMaxDistance(). + \param maxDistance Default maximal distance for 3D sounds from this source. Set it to a negative + value to let sounds of this source use the engine level default max distance, which + can be set via ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing + the default max distance of the sound engine to take effect. */ + virtual void setDefaultMaxDistance(ik_f32 maxDistance) = 0; + + //! returns the default maxmial distance for 3D sounds played from this source. + /** This value influences how loud a sound is heard based on its distance. + Changing this value is usually not necessary. Use setDefaultMinDistance() instead. + Don't change this value if you don't know what you are doing: This value causes the sound + to stop attenuating after it reaches the max distance. Most people think that this sets the + volume of the sound to 0 after this distance, but this is not true. Only change the + minimal distance (using for example setDefaultMinDistance()) to influence this. + See ISound::setMaxDistance() for details about what the max distance is. + \return Default maximal distance for 3D sounds from this source. If setDefaultMaxDistance() + was set to a negative value, it will return the default value set in the engine, + using ISoundEngine::setDefault3DSoundMaxDistance(). Default value is -1, causing + the default max distance of the sound engine to take effect. */ + virtual ik_f32 getDefaultMaxDistance() = 0; + + //! Forces the sound to be reloaded at next replay. + /** Sounds which are not played as streams are buffered to make it possible to + replay them without much overhead. If the sound file is altered after the sound + has been played the first time, the engine won't play the changed file then. + Calling this method makes the engine reload the file before the file is played + the next time.*/ + virtual void forceReloadAtNextUse() = 0; + + //! Sets the threshold size where irrKlang decides to force streaming a file independent of the user specified setting. + /** When specifying ESM_NO_STREAMING for playing back a sound file, irrKlang will + ignore this setting if the file is bigger than this threshold and stream the file + anyway. Please note that if an audio format loader is not able to return the + size of a sound source and returns -1 as length, this will be ignored as well + and streaming has to be forced. + \param threshold: New threshold. The value is specified in uncompressed bytes and its default value is + about one Megabyte. Set to 0 or a negative value to disable stream forcing. */ + virtual void setForcedStreamingThreshold(ik_s32 thresholdBytes) = 0; + + //! Returns the threshold size where irrKlang decides to force streaming a file independent of the user specified setting. + /** The value is specified in uncompressed bytes and its default value is + about one Megabyte. See setForcedStreamingThreshold() for details. */ + virtual ik_s32 getForcedStreamingThreshold() = 0; + + //! Returns a pointer to the loaded and decoded sample data. + /** \return Returns a pointer to the sample data. The data is provided in decoded PCM data. The + exact format can be retrieved using getAudioFormat(). Use getAudioFormat().getSampleDataSize() + for getting the amount of bytes. The returned pointer will only be valid as long as the sound + source exists. + This function will only return a pointer to the data if the + audio file is not streamed, namely ESM_NO_STREAMING. Otherwise this function will return 0. + Note: If the sound never has been played before, the sound engine will have to open + the file and decode audio data from there, so this call could take a bit depending + on the type of the file.*/ + virtual void* getSampleData() = 0; + }; + +} // end namespace irrklang + + +#endif diff --git a/Thirdparty/irrKlang/include/ik_ISoundStopEventReceiver.h b/Thirdparty/irrKlang/include/ik_ISoundStopEventReceiver.h new file mode 100644 index 0000000..511a8b0 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_ISoundStopEventReceiver.h @@ -0,0 +1,72 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_SOUND_STOP_EVENT_RECEIVER_H_INCLUDED__ +#define __I_IRRKLANG_SOUND_STOP_EVENT_RECEIVER_H_INCLUDED__ + +#include "ik_IRefCounted.h" +#include "ik_SAudioStreamFormat.h" + + +namespace irrklang +{ + + +//! An enumeration listing all reasons for a fired sound stop event +enum E_STOP_EVENT_CAUSE +{ + //! The sound stop event was fired because the sound finished playing + ESEC_SOUND_FINISHED_PLAYING = 0, + + //! The sound stop event was fired because the sound was stopped by the user, calling ISound::stop(). + ESEC_SOUND_STOPPED_BY_USER, + + //! The sound stop event was fired because the source of the sound was removed, for example + //! because irrKlang was shut down or the user called ISoundEngine::removeSoundSource(). + ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL, + + //! This enumeration literal is never used, it only forces the compiler to + //! compile these enumeration values to 32 bit. + ESEC_FORCE_32_BIT = 0x7fffffff +}; + + +//! Interface to be implemented by the user, which recieves sound stop events. +/** The interface has only one method to be implemented by the user: OnSoundStopped(). +Implement this interface and set it via ISound::setSoundStopEventReceiver(). +The sound stop event is guaranteed to be called when a sound or sound stream is finished, +either because the sound reached its playback end, its sound source was removed, +ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. */ +class ISoundStopEventReceiver +{ +public: + + //! destructor + virtual ~ISoundStopEventReceiver() {}; + + //! Called when a sound has stopped playing. + /** This is the only method to be implemented by the user. + The sound stop event is guaranteed to be called when a sound or sound stream is finished, + either because the sound reached its playback end, its sound source was removed, + ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. + Please note: Sound events will occur in a different thread when the engine runs in + multi threaded mode (default). In single threaded mode, the event will happen while + the user thread is calling ISoundEngine::update(). + \param sound: Sound which has been stopped. + \param reason: The reason why the sound stop event was fired. Usually, this will be ESEC_SOUND_FINISHED_PLAYING. + When the sound was aborded by calling ISound::stop() or ISoundEngine::stopAllSounds();, this would be + ESEC_SOUND_STOPPED_BY_USER. If irrKlang was deleted or the sound source was removed, the value is + ESEC_SOUND_STOPPED_BY_SOURCE_REMOVAL. + \param userData: userData pointer set by the user when registering the interface + via ISound::setSoundStopEventReceiver(). */ + virtual void OnSoundStopped(ISound* sound, E_STOP_EVENT_CAUSE reason, void* userData) = 0; + +}; + + +} // end namespace irrklang + + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_IVirtualRefCounted.h b/Thirdparty/irrKlang/include/ik_IVirtualRefCounted.h new file mode 100644 index 0000000..86b589f --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_IVirtualRefCounted.h @@ -0,0 +1,48 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __I_IRRKLANG_VIRTUAL_UNKNOWN_H_INCLUDED__ +#define __I_IRRKLANG_VIRTUAL_UNKNOWN_H_INCLUDED__ + +#include "ik_irrKlangTypes.h" + + +namespace irrklang +{ + + //! Reference counting base class for objects in the Irrlicht Engine similar to IRefCounted. + /** See IRefCounted for the basics of this class. + The difference to IRefCounted is that the class has to implement reference counting + for itself. + */ + class IVirtualRefCounted + { + public: + + //! Destructor. + virtual ~IVirtualRefCounted() + { + } + + //! Grabs the object. Increments the reference counter by one. + /** To be implemented by the derived class. If you don't want to + implement this, use the class IRefCounted instead. See IRefCounted::grab() for details + of this method. */ + virtual void grab() = 0; + + //! Drops the object. Decrements the reference counter by one. + /** To be implemented by the derived class. If you don't want to + implement this, use the class IRefCounted instead. See IRefCounted::grab() for details + of this method. */ + virtual bool drop() = 0; + }; + + + +} // end namespace irrklang + + + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_SAudioStreamFormat.h b/Thirdparty/irrKlang/include/ik_SAudioStreamFormat.h new file mode 100644 index 0000000..cc6d343 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_SAudioStreamFormat.h @@ -0,0 +1,71 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __S_IRRKLANG_AUDIO_STREAM_FORMAT_H_INCLUDED__ +#define __S_IRRKLANG_AUDIO_STREAM_FORMAT_H_INCLUDED__ + +#include "ik_IRefCounted.h" + + +namespace irrklang +{ + + //! audio sample data format enumeration for supported formats + enum ESampleFormat + { + //! one unsigned byte (0;255) + ESF_U8, + + //! 16 bit, signed (-32k;32k) + ESF_S16 + }; + + + //! structure describing an audio stream format with helper functions + struct SAudioStreamFormat + { + //! channels, 1 for mono, 2 for stereo + ik_s32 ChannelCount; + + //! amount of frames in the sample data or stream. + /** If the stream has an unknown lenght, this is -1 */ + ik_s32 FrameCount; + + //! samples per second + ik_s32 SampleRate; + + //! format of the sample data + ESampleFormat SampleFormat; + + //! returns the size of a sample of the data described by the stream data in bytes + inline ik_s32 getSampleSize() const + { + return (SampleFormat == ESF_U8) ? 1 : 2; + } + + //! returns the frame size of the stream data in bytes + inline ik_s32 getFrameSize() const + { + return ChannelCount * getSampleSize(); + } + + //! returns the size of the sample data in bytes + /* Returns an invalid negative value when the stream has an unknown lenght */ + inline ik_s32 getSampleDataSize() const + { + return getFrameSize() * FrameCount; + } + + //! returns amount of bytes per second + inline ik_s32 getBytesPerSecond() const + { + return getFrameSize() * SampleRate; + } + }; + + +} // end namespace irrklang + +#endif + diff --git a/Thirdparty/irrKlang/include/ik_irrKlangTypes.h b/Thirdparty/irrKlang/include/ik_irrKlangTypes.h new file mode 100644 index 0000000..e2b1560 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_irrKlangTypes.h @@ -0,0 +1,96 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __IRRKLANG_TYPES_H_INCLUDED__ +#define __IRRKLANG_TYPES_H_INCLUDED__ + + +namespace irrklang +{ + + //! 8 bit unsigned variable. + /** This is a typedef for unsigned char, it ensures portability of the engine. */ + typedef unsigned char ik_u8; + + //! 8 bit signed variable. + /** This is a typedef for signed char, it ensures portability of the engine. */ + typedef signed char ik_s8; + + //! 8 bit character variable. + /** This is a typedef for char, it ensures portability of the engine. */ + typedef char ik_c8; + + + + //! 16 bit unsigned variable. + /** This is a typedef for unsigned short, it ensures portability of the engine. */ + typedef unsigned short ik_u16; + + //! 16 bit signed variable. + /** This is a typedef for signed short, it ensures portability of the engine. */ + typedef signed short ik_s16; + + + + //! 32 bit unsigned variable. + /** This is a typedef for unsigned int, it ensures portability of the engine. */ + typedef unsigned int ik_u32; + + //! 32 bit signed variable. + /** This is a typedef for signed int, it ensures portability of the engine. */ + typedef signed int ik_s32; + + + + //! 32 bit floating point variable. + /** This is a typedef for float, it ensures portability of the engine. */ + typedef float ik_f32; + + //! 64 bit floating point variable. + /** This is a typedef for double, it ensures portability of the engine. */ + typedef double ik_f64; + + + + // some constants + + const ik_f32 IK_ROUNDING_ERROR_32 = 0.000001f; + const ik_f64 IK_PI64 = 3.1415926535897932384626433832795028841971693993751; + const ik_f32 IK_PI32 = 3.14159265359f; + const ik_f32 IK_RADTODEG = 180.0f / IK_PI32; + const ik_f32 IK_DEGTORAD = IK_PI32 / 180.0f; + const ik_f64 IK_RADTODEG64 = 180.0 / IK_PI64; + const ik_f64 IK_DEGTORAD64 = IK_PI64 / 180.0; + + //! returns if a float equals the other one, taking floating + //! point rounding errors into account + inline bool equalsfloat(const ik_f32 a, const ik_f32 b, const ik_f32 tolerance = IK_ROUNDING_ERROR_32) + { + return (a + tolerance > b) && (a - tolerance < b); + } + +} // end irrklang namespace + +// ensure wchar_t type is existing for unicode support +#include + +// define the wchar_t type if not already built in. +#ifdef _MSC_VER // microsoft compiler + #ifndef _WCHAR_T_DEFINED + //! A 16 bit wide character type. + /** + Defines the wchar_t-type. + In VS6, its not possible to tell + the standard compiler to treat wchar_t as a built-in type, and + sometimes we just don't want to include the huge stdlib.h or wchar.h, + so we'll use this. + */ + typedef unsigned short wchar_t; + #define _WCHAR_T_DEFINED + #endif // wchar is not defined +#endif // microsoft compiler + + +#endif // __IRR_TYPES_H_INCLUDED__ + diff --git a/Thirdparty/irrKlang/include/ik_vec3d.h b/Thirdparty/irrKlang/include/ik_vec3d.h new file mode 100644 index 0000000..ce56669 --- /dev/null +++ b/Thirdparty/irrKlang/include/ik_vec3d.h @@ -0,0 +1,261 @@ +// Copyright (C) 2002-2018 Nikolaus Gebhardt +// This file is part of the "irrKlang" library. +// For conditions of distribution and use, see copyright notice in irrKlang.h + +#ifndef __IRR_IRRKLANG_VEC_3D_H_INCLUDED__ +#define __IRR_IRRKLANG_VEC_3D_H_INCLUDED__ + +#include +#include "ik_irrKlangTypes.h" + + +namespace irrklang +{ + + //! a 3d vector template class for representing vectors and points in 3d + template + class vec3d + { + public: + + vec3d(): X(0), Y(0), Z(0) {}; + vec3d(T nx, T ny, T nz) : X(nx), Y(ny), Z(nz) {}; + vec3d(const vec3d& other) :X(other.X), Y(other.Y), Z(other.Z) {}; + + //! constructor creating an irrklang vec3d from an irrlicht vector. + #ifdef __IRR_POINT_3D_H_INCLUDED__ + template + vec3d(const B& other) :X(other.X), Y(other.Y), Z(other.Z) {}; + #endif // __IRR_POINT_3D_H_INCLUDED__ + + // operators + + vec3d operator-() const { return vec3d(-X, -Y, -Z); } + + vec3d& operator=(const vec3d& other) { X = other.X; Y = other.Y; Z = other.Z; return *this; } + + vec3d operator+(const vec3d& other) const { return vec3d(X + other.X, Y + other.Y, Z + other.Z); } + vec3d& operator+=(const vec3d& other) { X+=other.X; Y+=other.Y; Z+=other.Z; return *this; } + + vec3d operator-(const vec3d& other) const { return vec3d(X - other.X, Y - other.Y, Z - other.Z); } + vec3d& operator-=(const vec3d& other) { X-=other.X; Y-=other.Y; Z-=other.Z; return *this; } + + vec3d operator*(const vec3d& other) const { return vec3d(X * other.X, Y * other.Y, Z * other.Z); } + vec3d& operator*=(const vec3d& other) { X*=other.X; Y*=other.Y; Z*=other.Z; return *this; } + vec3d operator*(const T v) const { return vec3d(X * v, Y * v, Z * v); } + vec3d& operator*=(const T v) { X*=v; Y*=v; Z*=v; return *this; } + + vec3d operator/(const vec3d& other) const { return vec3d(X / other.X, Y / other.Y, Z / other.Z); } + vec3d& operator/=(const vec3d& other) { X/=other.X; Y/=other.Y; Z/=other.Z; return *this; } + vec3d operator/(const T v) const { T i=(T)1.0/v; return vec3d(X * i, Y * i, Z * i); } + vec3d& operator/=(const T v) { T i=(T)1.0/v; X*=i; Y*=i; Z*=i; return *this; } + + bool operator<=(const vec3d&other) const { return X<=other.X && Y<=other.Y && Z<=other.Z;}; + bool operator>=(const vec3d&other) const { return X>=other.X && Y>=other.Y && Z>=other.Z;}; + + bool operator==(const vec3d& other) const { return other.X==X && other.Y==Y && other.Z==Z; } + bool operator!=(const vec3d& other) const { return other.X!=X || other.Y!=Y || other.Z!=Z; } + + // functions + + //! returns if this vector equalsfloat the other one, taking floating point rounding errors into account + bool equals(const vec3d& other) + { + return equalsfloat(X, other.X) && + equalsfloat(Y, other.Y) && + equalsfloat(Z, other.Z); + } + + void set(const T nx, const T ny, const T nz) {X=nx; Y=ny; Z=nz; } + void set(const vec3d& p) { X=p.X; Y=p.Y; Z=p.Z;} + + //! Returns length of the vector. + ik_f64 getLength() const { return sqrt(X*X + Y*Y + Z*Z); } + + //! Returns squared length of the vector. + /** This is useful because it is much faster then + getLength(). */ + ik_f64 getLengthSQ() const { return X*X + Y*Y + Z*Z; } + + //! Returns the dot product with another vector. + T dotProduct(const vec3d& other) const + { + return X*other.X + Y*other.Y + Z*other.Z; + } + + //! Returns distance from an other point. + /** Here, the vector is interpreted as point in 3 dimensional space. */ + ik_f64 getDistanceFrom(const vec3d& other) const + { + ik_f64 vx = X - other.X; ik_f64 vy = Y - other.Y; ik_f64 vz = Z - other.Z; + return sqrt(vx*vx + vy*vy + vz*vz); + } + + //! Returns squared distance from an other point. + /** Here, the vector is interpreted as point in 3 dimensional space. */ + ik_f32 getDistanceFromSQ(const vec3d& other) const + { + ik_f32 vx = X - other.X; ik_f32 vy = Y - other.Y; ik_f32 vz = Z - other.Z; + return (vx*vx + vy*vy + vz*vz); + } + + //! Calculates the cross product with another vector + vec3d crossProduct(const vec3d& p) const + { + return vec3d(Y * p.Z - Z * p.Y, Z * p.X - X * p.Z, X * p.Y - Y * p.X); + } + + //! Returns if this vector interpreted as a point is on a line between two other points. + /** It is assumed that the point is on the line. */ + bool isBetweenPoints(const vec3d& begin, const vec3d& end) const + { + ik_f32 f = (ik_f32)(end - begin).getLengthSQ(); + return (ik_f32)getDistanceFromSQ(begin) < f && + (ik_f32)getDistanceFromSQ(end) < f; + } + + //! Normalizes the vector. + vec3d& normalize() + { + T l = (T)getLength(); + if (l == 0) + return *this; + + l = (T)1.0 / l; + X *= l; + Y *= l; + Z *= l; + return *this; + } + + //! Sets the lenght of the vector to a new value + void setLength(T newlength) + { + normalize(); + *this *= newlength; + } + + //! Inverts the vector. + void invert() + { + X *= -1.0f; + Y *= -1.0f; + Z *= -1.0f; + } + + //! Rotates the vector by a specified number of degrees around the Y + //! axis and the specified center. + //! \param degrees: Number of degrees to rotate around the Y axis. + //! \param center: The center of the rotation. + void rotateXZBy(ik_f64 degrees, const vec3d& center) + { + degrees *= IK_DEGTORAD64; + T cs = (T)cos(degrees); + T sn = (T)sin(degrees); + X -= center.X; + Z -= center.Z; + set(X*cs - Z*sn, Y, X*sn + Z*cs); + X += center.X; + Z += center.Z; + } + + //! Rotates the vector by a specified number of degrees around the Z + //! axis and the specified center. + //! \param degrees: Number of degrees to rotate around the Z axis. + //! \param center: The center of the rotation. + void rotateXYBy(ik_f64 degrees, const vec3d& center) + { + degrees *= IK_DEGTORAD64; + T cs = (T)cos(degrees); + T sn = (T)sin(degrees); + X -= center.X; + Y -= center.Y; + set(X*cs - Y*sn, X*sn + Y*cs, Z); + X += center.X; + Y += center.Y; + } + + //! Rotates the vector by a specified number of degrees around the X + //! axis and the specified center. + //! \param degrees: Number of degrees to rotate around the X axis. + //! \param center: The center of the rotation. + void rotateYZBy(ik_f64 degrees, const vec3d& center) + { + degrees *= IK_DEGTORAD64; + T cs = (T)cos(degrees); + T sn = (T)sin(degrees); + Z -= center.Z; + Y -= center.Y; + set(X, Y*cs - Z*sn, Y*sn + Z*cs); + Z += center.Z; + Y += center.Y; + } + + //! Returns interpolated vector. + /** \param other: other vector to interpolate between + \param d: value between 0.0f and 1.0f. */ + vec3d getInterpolated(const vec3d& other, ik_f32 d) const + { + ik_f32 inv = 1.0f - d; + return vec3d(other.X*inv + X*d, + other.Y*inv + Y*d, + other.Z*inv + Z*d); + } + + //! Gets the Y and Z rotations of a vector. + /** Thanks to Arras on the Irrlicht forums to add this method. + \return A vector representing the rotation in degrees of + this vector. The Z component of the vector will always be 0. */ + vec3d getHorizontalAngle() + { + vec3d angle; + + angle.Y = (T)atan2(X, Z); + angle.Y *= (ik_f32)IK_RADTODEG; + + if (angle.Y < 0.0f) angle.Y += 360.0f; + if (angle.Y >= 360.0f) angle.Y -= 360.0f; + + ik_f32 z1 = (T)sqrt(X*X + Z*Z); + + angle.X = (T)atan2(z1, Y); + angle.X *= (ik_f32)IK_RADTODEG; + angle.X -= 90.0f; + + if (angle.X < 0.0f) angle.X += 360.0f; + if (angle.X >= 360) angle.X -= 360.0f; + + return angle; + } + + //! Fills an array of 4 values with the vector data (usually floats). + /** Useful for setting in shader constants for example. The fourth value + will always be 0. */ + void getAs4Values(T* array) + { + array[0] = X; + array[1] = Y; + array[2] = Z; + array[3] = 0; + } + + + // member variables + + T X, Y, Z; + }; + + + //! Typedef for a ik_f32 3d vector, a vector using floats for X, Y and Z + typedef vec3d vec3df; + + //! Typedef for an integer 3d vector, a vector using ints for X, Y and Z + typedef vec3d vec3di; + + template vec3d operator*(const S scalar, const vec3d& vector) { return vector*scalar; } + +} // end namespace irrklang + + +#endif + diff --git a/Thirdparty/irrKlang/include/irrKlang.h b/Thirdparty/irrKlang/include/irrKlang.h new file mode 100644 index 0000000..33f9ea0 --- /dev/null +++ b/Thirdparty/irrKlang/include/irrKlang.h @@ -0,0 +1,1040 @@ +/* irrKlang.h -- interface of the 'irrKlang' library + + Copyright (C) 2002-2018 Nikolaus Gebhardt + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. +*/ + +#ifndef __IRR_KLANG_H_INCLUDED__ +#define __IRR_KLANG_H_INCLUDED__ + +#include "ik_irrKlangTypes.h" +#include "ik_vec3d.h" + +#include "ik_IRefCounted.h" +#include "ik_IVirtualRefCounted.h" + +#include "ik_ESoundOutputDrivers.h" +#include "ik_ESoundEngineOptions.h" +#include "ik_EStreamModes.h" +#include "ik_SAudioStreamFormat.h" +#include "ik_ISoundEngine.h" +#include "ik_ISoundSource.h" +#include "ik_ISound.h" +#include "ik_IAudioStream.h" +#include "ik_IAudioStreamLoader.h" +#include "ik_ISoundEffectControl.h" +#include "ik_ISoundStopEventReceiver.h" +#include "ik_IFileFactory.h" +#include "ik_IFileReader.h" +#include "ik_ISoundDeviceList.h" +#include "ik_IAudioRecorder.h" +#include "ik_ISoundMixedOutputReceiver.h" + +//! irrKlang Version +#define IRR_KLANG_VERSION "1.6.0" + +/*! \mainpage irrKlang 1.6.0 API documentation + * + *
    + + * \section contents Contents + * General:
    + * @ref intro
    + * @ref features
    + * @ref links
    + * @ref tipsandtricks
    + *
    + * Programming irrKlang:
    + * @ref concept
    + * @ref playingSounds
    + * @ref changingSounds
    + * @ref soundSources
    + * @ref sound3d
    + * @ref removingSounds
    + * @ref events
    + * @ref memoryPlayback
    + * @ref effects
    + * @ref fileOverriding
    + * @ref audioDecoders
    + * @ref plugins
    + * @ref staticLib
    + * @ref enumeratingDevices
    + * @ref recordingAudio
    + * @ref unicode
    + *
    + * Short full examples:
    + * @ref quickstartexample
    + * @ref quickstartexample2
    + *
    + *
    + * + * \section intro Introduction + * + * Welcome to the irrKlang API documentation. This page should give you a short overview + * over irrKlang, the high level audio library. + * In this documentation files you'll find any information you'll need to develop applications with + * irrKlang using C++. If you are looking for a tutorial on how to start, you'll + * find some on the homepage of irrKlang at + * http://www.ambiera.com/irrklang + * or inside the SDK in the directory \examples. + * + * The irrKlang library is intended to be an easy-to-use 3d and 2d sound engine, so + * this documentation is an important part of it. If you have any questions or + * suggestions, please take a look into the ambiera.com forum or just send a mail. + * + *
    + *
    + * + * + * \section features Features of irrKlang + * + * irrKlang is a high level 2D and 3D + * cross platform sound engine and audio library. + * It has a very simply object orientated interface and was designed to be used + * in games, scientific simulations, architectural visualizations and similar. + * irrKlang plays several file formats such as + *
      + *
    • RIFF WAVE (*.wav)
    • + *
    • Ogg Vorbis (*.ogg)
    • + *
    • MPEG-1 Audio Layer 3 (*.mp3)
    • + *
    • Free Lossless Audio Codec (*.flac)
    • + *
    • Amiga Modules (*.mod)
    • + *
    • Impulse Tracker (*.it)
    • + *
    • Scream Tracker 3 (*.s3d)
    • + *
    • Fast Tracker 2 (*.xm)
    • + *
    + * It is also able to run on different operating systems and use several output drivers: + *
      + *
    • Windows 98, ME, NT 4, 2000, XP, Vista, Windows 7, Windows 8
    • + *
        + *
      • DirectSound
      • + *
      • DirectSound8
      • + *
      • WinMM
      • + *
      + *
    • Linux / *nix
    • + *
        + *
      • ALSA
      • + *
      + *
    • MacOSX (x86 and PPC)
    • + *
        + *
      • CoreAudio
      • + *
      + *
    + *
    + *
    + *
    + * + * + * + * \section links Links into the API documentation + * + * irrklang::ISoundEngine: The main class of irrKlang.
    + * Class list: List of all classes with descriptions.
    + * Class members: Good place to find forgotten features.
    + *
    + *
    + *
    + * + * + * + * \section tipsandtricks Tips and Tricks + * + * This section lists a few tips you might consider when implementing the sound part of your application + * using irrKlang: + * + *
      + *
    • If you can choose which audio file format is the primary one for your application, + * use .OGG files, instead of for example .MP3 files. irrKlang uses a lot less memory + * and CPU power when playing .OGGs.
    • + *
    • To keep your application simple, each time you play a sound, you can use for example + * play2D("filename.mp3") and let irrKlang handle the rest. There is no need to implement + * a preloading/caching/file management system for the audio playback. irrKlang will handle + * all this by itself and will never load a file twice.
    • + *
    • irrKlang is crashing in your application? This should not happen, irrKlang is pretty stable, + * and in most cases, this is a problem in your code: In a lot of cases the reason is simply + * a wrong call to irrklang::IRefCounted::drop(). Be sure you are doing it correctly. (If you are unsure, + * tempoarily remove all calls to irrklang::IRefCounted::drop() and see if this helps.)
    • + *
    + * + *
    + *
    + *
    + *
    + * + * + * + * \section concept Starting up the Engine + * + * irrKlang is designed so that it is very easy to achieve everything, its interface should + * be very simple to use. The @ref quickstartexample shows how to play and mp3 file, and there + * is another example, @ref quickstartexample2, showing some few more details.
    + * To start up the sound engine, you simply need to call createIrrKlangDevice(). To shut it down, + * call IRefCounted::drop(): + * + * \code + * #include + * + * // ... + * + * // start up the engine + * irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice(); + * + * // ... + * + * // after finished, + * // close the engine again, similar as calling 'delete' + * engine->drop(); + * \endcode + * + * The createIrrKlangDevice() function also accepts several parameters, so that you can + * specify which sound driver should be used, if plugins should be used, if irrKlang + * should run in multithreaded mode, and similar. + *
    + *
    + *
    + *
    + * + * + * + * \section playingSounds Playing Sounds + * + * Once you have irrKlang running (like in @ref concept), you can start playing sounds: + * + * \code + * engine->play2D("someSoundFile.wav"); + * \endcode + * + * This works with all supported file types. You can replace "someSoundFile.wav" with + * "someSoundFile.mp3", or "someSoundFile.ogg", for example.
    + * To play a sound looped, set the second parameter to 'true': + * + * \code + * engine->play2D("myMusic.mp3", true); + * \endcode + * + * To stop this looping sound again, use engine->\link irrklang::ISoundEngine::stopAllSounds stopAllSounds()\endlink to stop all sounds, or + * irrklang::ISound::stop() if you only want to stop that single sound. @ref changingSounds + * shows how to get to that ISound interface. + *
    + *
    + *
    + *
    + * + * + * \section changingSounds Influencing Sounds during Playback + * To influence parameters of the sound such as pan, volume or playback speed during runtime, + * to get the play position or stop playback of single playing sounds, + * you can use the irrklang::ISound interface. + * irrklang::ISoundEngine::play2D (but also play3D) returns + * a pointer to this interface when its third ('startPaused') or fourth ('track') parameter + * was set to true: + * + * \code + * irrklang::ISound* snd = engine->play2D("myMusic.mp3", true, false, true); + * + * // ... + * + * if (snd) + * snd->setVolume(someNewValue); + * + * // ... + * + * if (snd) + * { + * snd->drop(); // don't forget to release the pointer once it is no longer needed by you + * snd = 0; + * } + * \endcode + * + * The irrklang::ISound interface can also be used to test if the sound has been finished, + * set event receivers, pause and unpause sounds and similar. + *
    + *
    + *
    + *
    + * + * + * \section soundSources Using Sound Sources + * + * To be more flexible playing back sounds, irrKlang uses the concept of sound sources. + * A sound source can be simply the name of a sound file, such as "sound.wav". It is possible + * to add "sound.wav" as sound source to irrKlang, and play it using the sound source pointer: + * + * \code + * irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); + * + * engine->play2D(shootSound); + * + * // note: you don't need to drop() the shootSound if you don't use it anymore + * \endcode + * + * The advantage of using irrklang::ISoundSource is that it is possible to set + * default values for this source, such + * as volume or distances if it should be used as 3D sound: + * + * \code + * irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); + * + * shootSound->setDefaultVolume(0.5f); + * + * // shootSound will now be played with half its sound volume by default: + * engine->play2D(shootSound); + * \endcode + * + * It is also possible to have multiple settings for the same sound file: + * + * \code + * irrklang::ISoundSource* shootSound = engine->addSoundSourceFromFile("shoot.wav"); + * irrklang::ISoundSource* shootSound2 = engine->addSoundSourceAlias(shootSound, "silentShoot"); + * + * shootSound2->setDefaultVolume(0.1f); + * + * // shootSound will now be played with 100% of its sound volume by default, + * // shootSound2 will now be played 10% of its sound volume by default. It is + * // also possible to play it using engine->play("silentShoot"), now. + * \endcode + * + * Using addSoundSourceFromMemory(), it is also possible to play sounds back directly from memory, + * without files. + * Of course, it is not necessary to use sound sources. Using irrklang::ISound, it is + * possible to change the settings of all sounds, too. But using sound sources, it is + * not necessary to do this every time a sound is played. + *
    + *
    + *
    + *
    + * + * + * + * \section sound3d 3D Sound + * + * There is nothing difficult in playing sounds in 3D using irrKlang: Instead of using + * irrklang::ISoundEngine::play2D(), just use irrklang::ISoundEngine::play3D(), which + * takes a 3D position as additional parameter: + * + * \code + * irrklang::vec3df position(23,70,90); + * engine->play3D("yourSound.wav", position); + * \endcode + * + * But to make it sound realistic, you need to set a minimal sound + * distance: If your sound is caused by a bee, it will usually have a smaller + * sound radius than for example a jet engine. You can set default values using sound sources + * (see @ref soundSources) or set these values after you have started the sound paused: + * + * \code + * irrklang::vec3df position(23,70,90); + * + * // start the sound paused: + * irrklang::ISound* snd = engine->play3D("yourSound.wav", position, false, true); + * + * if (snd) + * { + * snd->setMinDistance(30.0f); // a loud sound + * snd->setIsPaused(false); // unpause the sound + * } + * \endcode + * + * There is also the possibility to change the maxDistance, but it is only necessary to change this + * in very rare cicumstances. + * If the sound moves, it is also a good idea to update its position from time to time: + * + * \code + * if (snd) + * snd->setPosition(newPosition); + * \endcode + * + * And don't forget to drop() the sound after you don't need it anymore. If you do, it's + * nothing severe because irrKlang will still clean up the sounds resources after it has + * finished, but you still would waste some few bytes of memory: + * + * \code + * if (snd) + * { + * snd->drop(); + * snd = 0; + * } + * \endcode + * + * To update the position of yourself, the listener of the 3D sounds, use this from + * time to time: + * + * \code + * irrklang::vec3df position(0,0,0); // position of the listener + * irrklang::vec3df lookDirection(10,0,10); // the direction the listener looks into + * irrklang::vec3df velPerSecond(0,0,0); // only relevant for doppler effects + * irrklang::vec3df upVector(0,1,0); // where 'up' is in your 3D scene + * + * engine->setListenerPosition(position, lookDirection, velPerSecond, upVector); + * \endcode + * + *
    + *
    + *
    + *
    + * + * + * \section removingSounds Removing Sounds + * + * irrKlang manages the memory usage of sounds by itself, so usually, you don't have + * to care about memory management. But if you know you need to reduce the + * amount of used memory at a certain point in your program, you can do this: + * + * \code + * engine->removeAllSoundSources(); + * \endcode + * + * This will remove all sounds and also cause all sounds to be stopped. To remove single + * sounds from the engine, use: + * + * \code + * engine->removeSoundSource(pointerToSomeSoundSource); + * // or: + * engine->removeSoundSource("nameOfASoundFile.wav"); + * \endcode + * + * Note: Only removing buffered sounds will reduce the amount of memory used by irrKlang, streamed + * sounds don't occupy a lot of memory when they are not played. + *
    + *
    + *
    + *
    + * + * + * + * \section events Using Sound Events + * + * In order to wait for a sound to be finished, it is simply possible to + * poll irrklang::ISound::isFinished(). Another way would be to constantly use + * irrklang::ISoundEngine::isCurrentlyPlaying to test wether a sound with that name or source + * is currently playing. But of course, an event based approach is a lot nicer. That's why irrKlang + * supports sound events.
    + * The key to sound events is the method + * \link irrklang::ISound::setSoundStopEventReceiver setSoundStopEventReceiver \endlink + * of the irrklang::ISound interface + * (See @ref changingSounds on how to get the ISound interface): + * + * \code + * irrklang::ISound* snd = engine->play2D("speech.mp3", false, false, true); + * if (snd) + * snd->setSoundStopEventReceiver(yourEventReceiver, 0); + * \endcode + * + * The optional second parameter of setSoundStopEventReceiver is a user pointer, set it to whatever you like. + * 'yourEventReceiver' must be an implementation of the irrklang::ISoundStopEventReceiver interface.
    + * A whole implementation could look like this: + * + * \code + * class MySoundEndReceiver : public irrklang::ISoundStopEventReceiver + * { + * public: + * virtual void OnSoundStopped (irrklang::ISound* sound, irrklang::E_STOP_EVENT_CAUSE reason, void* userData) + * { + * // called when the sound has ended playing + * printf("sound has ended"); + * } + * } + * + * // ... + * + * MySoundEndReceiver* myReceiver = new MySoundEndReceiver(); + * irrklang::ISound* snd = engine->play2D("speech.mp3", false, false, true); + * if (snd) + * snd->setSoundStopEventReceiver(myReceiver); + * + * myReceiver->drop(); // similar to delete + * \endcode + * + * The irrklang::ISoundStopEventReceiver::OnSoundStopped() method is guaranteed to be called when a sound or sound stream has stopped, + * either because the sound reached its playback end, its sound source was removed, + * ISoundEngine::stopAllSounds() has been called or the whole engine was deleted. + *
    + *
    + *
    + *
    + * + * + * + * \section memoryPlayback Memory Playback + * + * Using irrKlang, it is easily possible to play sounds directly from memory instead out of + * files. There is an example project showing this: In the SDK, in /examples/03.MemoryPlayback. + * But in short, it simply works by adding the memory as sound source (See @ref soundSources for + * details about sound sources): + * + * \code + * engine->addSoundSourceFromMemory(pointerToMemory, memorySize, "nameforthesound.wav"); + * + * // play sound now + * engine->play2D("nameforthesound.wav"); + * \endcode + * + * Or using a sound source pointer: + * + * \code + * irrklang::ISoundSource* snd = + * engine->addSoundSourceFromMemory(pointerToMemory, memorySize, "nameforthesound.wav"); + * + * // play sound now + * engine->play2D(snd); + * \endcode + * + * Note: It is also possible to overwrite the file access directly, don't use this Memory Playback + * feature for this. See @ref fileOverriding for details. + *
    + *
    + *
    + *
    + * + * + * + * \section effects Sound Effects + * + * irrKlang supports the effects Chorus, Compressor, Distortion, Echo, Flanger + * Gargle, 3DL2Reverb, ParamEq and WavesReverb, when using the sound driver + * irrklang::ESOD_DIRECT_SOUND_8, which selected by default when using Windows.
    + * + * Using the irrklang::ISound interface, you can optain the irrklang::ISoundEffectControl + * interface if the sound device supports sound effects and the last parameter ('enableSoundEffects') + * was set to true when calling play2D(): + * + * \code + * irrklang::ISound* snd = engine->play2D("sound.wav", true, false, true, ESM_AUTO_DETECT, true); + * + * if (snd) + * { + * irrklang::ISoundEffectControl* fx = snd->getSoundEffectControl(); + * if (fx) + * { + * // enable the echo sound effect for this sound + * fx->enableEchoSoundEffect(); + * } + * } + * + * snd->drop(); + * \endcode + * + * This enabled the echo sound effect for this sound. The method also supports a lot of + * parameters, and can be called multiple times to change those parameters over time if wished. + * There are a lot of other sound effects, see irrklang::ISoundEffectControl for details. + *
    + *
    + *
    + *
    + * + * + * + * \section fileOverriding Overriding File Access + * + * It is possible to let irrKlang use your own file access functions. + * This is useful if you want to read sounds from other sources than + * just files, for example from custom internet streams or + * an own encypted archive format. There is an example in the SDK in + * examples/04.OverrideFileAccess which shows this as well.
    + * + * The only thing to do for this is to implement your own irrklang::IFileFactory, + * and set it in irrKlang using irrklang::ISoundEngine::addFileFactory(): + * + * \code + * // a class implementing the IFileFactory interface to override irrklang file access + * class CMyFileFactory : public irrklang::IFileFactory + * { + * public: + * + * // Opens a file for read access. Simply return 0 if file not found. + * virtual irrklang::IFileReader* createFileReader(const ik_c8* filename) + * { + * // return your own irrklang::IFileReader implementation here, for example like that: + * return new CMyReadFile(filename); + * } + * }; + * + * // ... + * + * CMyFileFactory* myFactory = new CMyFileFactory(); + * engine->addFileFactory(myFactory); + * myFactory->drop(); + * \endcode + * + * For a full example implementation, just take a look into the SDK in examples/04.OverrideFileAccess. + *
    + *
    + *
    + *
    + * + * + * + * \section audioDecoders Adding Audio Decoders + * + * To add support for new file formats, it is possible to add new audio decoders + * to irrKlang. + * The only thing to do for this is to implement your own irrklang::IAudioStreamLoader, + * and irrklang::IAudioStream, and set it in irrKlang using + * irrklang::ISoundEngine::registerAudioStreamLoader(): + * + * \code + * class NewAudioStreamLoader : public irrklang::IAudioStreamLoader + * { + * // ... returns NewAudioDecoder and the used file name suffices. + * }; + * + * class NewAudioDecoder : public irrklang::IAudioStream + * { + * public: + * // ... decodes the new file format + * }; + * + * // ... + * + * NewAudioDecoder* loader = new NewAudioDecoder(); + * engine->registerAudioStreamLoader(loader); + * loader->drop(); + * \endcode + * + * There is an example audio decoder and loader with full source in plugins/ikpMP3, which + * adds MP3 audio decoding capabilities to irrKlang. + *
    + *
    + *
    + *
    + * + * + * + * \section plugins Creating irrKlang Plugins + * + * irrKlang plugins are ikp*.dll (Windows), ikp*.so (Unix) or ikp*.dylib (MacOS) + * files which are loaded by irrKlang at startup when the + * irrklang::ESEO_LOAD_PLUGINS was set (which is default) or + * irrklang::ISoundEngine::loadPlugins() was called.
    + * + * The plugin only needs to contain the following function which will be called by irrKlang: + * + * \code + * #ifdef WIN32 + * // Windows version + * __declspec(dllexport) void __stdcall irrKlangPluginInit(ISoundEngine* engine, const char* version) + * #else + * // Linux and Mac OS version + * void irrKlangPluginInit(ISoundEngine* engine, const char* version) + * #endif + * { + * // your implementation here + * } + * \endcode + * + * In there, it is for example possible to extend irrKlang with new audio decoders, + * see @ref audioDecoders for details.
    + * + * There is an example plugin with full source in plugins/ikpMP3, which + * adds MP3 audio decoding capabilities to irrKlang. + *
    + *
    + *
    + *
    + * + * + * + * \section staticLib Using irrKlang as static Lib + * + * If you don't want to use the irrKlang.DLL file and link irrKlang statically, you can do this + * by simply linking to the irrKlang.lib in the bin/win32-visualstudio_lib folder. This folder + * will only available in the pro versions of irrKlang, which you get when purchasing an irrKlang + * license. + * + * To use irrKlang in this way, just define IRRKLANG_STATIC before including irrklang.h, like this: + * + * \code + * #define IRRKLANG_STATIC + * #include + * \endcode + * + * Of course, IRRKLANG_STATIC can also simply be defined in the project/compiler settings instead of + * in the source file. + *
    + *
    + *
    + *
    + * + * + * + * \section enumeratingDevices Enumerating sound devices + * + * irrKlang uses the default sound device when playing sound when started without parameters. But if you want + * irrKlang to playback sound on one specific sound device, you may want to enumerate the available + * sound devices on your system and select one of them. Use irrklang::createSoundDeviceList() for this. + * This example code shows how to print a list of all available sound devices on the current system and lets + * the user choose one of them: + * + * \code + * int main(int argc, const char** argv) + * { + * // enumerate devices + * + * irrklang::ISoundDeviceList* deviceList = createSoundDeviceList(); + * + * // ask user for a sound device + * + * printf("Devices available:\n\n"); + * + * for (int i=0; igetDeviceCount(); ++i) + * printf("%d: %s\n", i, deviceList->getDeviceDescription(i)); + * + * printf("\nselect a device using the number (or press any key to use default):\n\n"); + * int deviceNumber = getch() - '0'; + * + * // create device with the selected driver + * + * const char* deviceID = deviceList->getDeviceID(deviceNumber); + * + * ISoundEngine* engine = createIrrKlangDevice(irrklang::ESOD_AUTO_DETECT, + * irrklang::ESEO_DEFAULT_OPTIONS, + * deviceID); + * + * deviceList->drop(); // delete device list + * + * // ... use engine now + * } + * \endcode + * + * In this way, it is also possible to play back sound using two devices at the same time: Simply + * create two irrKlang devices with each a different deviceID.
    + * Note: createSoundDeviceList() takes a driver type parameter (such as irrklang::ESOD_DIRECT_SOUND8), which you + * have to set to the same value as the first parameter you want to use with createIrrKlangDevice(), if it is + * other than irrklang::ESOD_AUTO_DETECT. + *
    + *
    + *
    + *
    + * + * + * + * \section recordingAudio Recording Audio + * + * irrKlang is able to record audio from sound capturing devices such as microphones (currently only + * supported in windows). Use the irrklang::IAudioRecorder interface to do this. The following example shows how + * to record some audio and play it back again using the engine: + * + * \code + * int main(int argc, const char** argv) + * { + * irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice(); + * irrklang::IAudioRecorder* recorder = irrklang::createIrrKlangAudioRecorder(engine); + * + * if (!engine || !recorder) + * { + * printf("Could not create audio engine or audio recoder\n"); + * return 1; + * } + * + * printf("\nPress any key to start recording audio...\n"); + * getch(); + * + * // record some audio + * + * recorder->startRecordingBufferedAudio(); + * + * printf("\nRECORDING. Press any key to stop...\n"); + * getch(); + * + * recorder->stopRecordingAudio(); + * + * printf("\nRecording done, recorded %dms of audio.\n", + * recorder->getAudioFormat().FrameCount * 1000 / recorder->getAudioFormat().SampleRate ); + * printf("Press any key to play back recorded audio...\n"); + * getch(); + * + * // play the recorded audio + * recorder->addSoundSourceFromRecordedAudio("myRecordedVoice"); + * engine->play2D("myRecordedVoice", true); + * + * // wait until user presses a key + * printf("\nPress any key to quit..."); + * getch(); + * + * recorder->drop(); + * engine->drop(); // delete engine + * + * return 0; + * } + * \endcode + * + * In order to select a specific audio capturing device for recording, it is necessary to enumerate + * the available devices. Simply replace the first to lines of code of the example above with code + * like this to list all devices and select one: + * + * \code + * // enumerate recording devices and ask user to select one + * + * irrklang::ISoundDeviceList* deviceList = irrklang::createAudioRecorderDeviceList(); + * + * printf("Devices available:\n\n"); + * + * for (int i=0; igetDeviceCount(); ++i) + * printf("%d: %s\n", i, deviceList->getDeviceDescription(i)); + * + * printf("\nselect a device using the number (or press any key to use default):\n\n"); + * int deviceNumber = getch() - '0'; + * + * // create recording device with the selected driver + * + * const char* deviceID = deviceList->getDeviceID(deviceNumber); + * irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice(); + * irrklang::IAudioRecorder* recorder = + * irrklang::createIrrKlangAudioRecorder(engine, irrklang::ESOD_AUTO_DETECT, deviceID); + * + * \endcode + * + *
    + *
    + *
    + *
    + * + * + * \section unicode Unicode support + * + * irrKlang supports unicode on all operating systems. Internally, it uses UTF8, and all functions accepting strings + * and file names take UTF8 strings. If you are running irrKlang on Windows, and are using the UNICODE define or using + * wchar_t* strings directly, you can do this as well. Use the irrKlang provided function makeUTF8fromUTF16string() to + * convert your wchar_t* string to a char* string. + * + * This example shows how: + * + * \code + * const wchar_t* yourFilename = L"SomeUnicodeFilename.wav"; // assuming this is the file name you get from some of your functions + * + * const int nBufferSize = 2048; // large enough, but best would be wcslen(yourFilename)*3. + * char strBuffer[nBufferSize]; + * irrklang::makeUTF8fromUTF16string(yourFilename, strBuffer, nBufferSize); + * + * // now the converted file name is in strBuffer. We can play it for example now: + * engine->play2D(strBuffer); + * \endcode + * + * Of course, you can use any other unicode converion function for this. makeUTF8fromUTF16string() is only provided + * for convenience. + *
    + *
    + *
    + *
    + * + * + * + * + * + * \section quickstartexample Quick Start Example + * + * To simply start the engine and play a mp3 file, use code like this: + * + * \code + * #include + * #include + * #pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll + * + * int main(int argc, const char** argv) + * { + * irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice(); + * if (!engine) return 1; // could not start engine + * + * engine->play2D("someMusic.mp3", true); // play some mp3 file, looped + * + * std::cin.get(); // wait until user presses a key + * + * engine->drop(); // delete engine + * return 0; + * } + * \endcode + * + * A mp3 file is being played until the user presses enter in this example. + * As you can see, irrKlang uses namespaces, all of + * the classes are located in the namespace irrklang. If you don't want to write + * this in front of every class and function you are using, simply write + * + * \code + * using namespace irrklang; + * \endcode + * in front of your code, as also shown in the next example. + *
    + *
    + *
    + *
    + * + * + * + * \section quickstartexample2 Quick Start Example 2 + * + * The following is a simple interactive application, starting up the sound engine and + * playing some streaming .ogg music file and a .wav sound effect every time the user + * presses a key. + * + * \code + * #include + * #include + * using namespace irrklang; + * + * #pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll + * + * + * int main(int argc, const char** argv) + * { + * // start the sound engine with default parameters + * ISoundEngine* engine = createIrrKlangDevice(); + * + * if (!engine) + * return 0; // error starting up the engine + * + * // play some sound stream, looped + * engine->play2D("../../media/helltroopers.ogg", true); + * + * std::cout << "\nHello World!\n"; + * + * char i = 0; + * + * while(i != 'q') + * { + * std::cout << "Press any key to play some sound, press 'q' to quit.\n"; + * + * // play a single sound + * engine->play2D("../../media/bell.wav"); + * + * std::cin >> i; // wait for user to press some key + * } + * + * engine->drop(); // delete engine + * return 0; + * } + * + * \endcode + */ + +#if defined(IRRKLANG_STATIC) + #define IRRKLANG_API +#else + #if (defined(WIN32) || defined(WIN64) || defined(_MSC_VER)) + #ifdef IRRKLANG_EXPORTS + #define IRRKLANG_API __declspec(dllexport) + #else + #define IRRKLANG_API __declspec(dllimport) + #endif // IRRKLANG_EXPORT + #else + #define IRRKLANG_API __attribute__((visibility("default"))) + #endif // defined(WIN32) || defined(WIN64) +#endif // IRRKLANG_STATIC + +#if defined(_STDCALL_SUPPORTED) +#define IRRKLANGCALLCONV __stdcall // Declare the calling convention. +#else +#define IRRKLANGCALLCONV +#endif // STDCALL_SUPPORTED + +//! Everything in the irrKlang Sound Engine can be found in this namespace. +namespace irrklang +{ + //! Creates an irrKlang device. The irrKlang device is the root object for using the sound engine. + /** \param driver The sound output driver to be used for sound output. Use irrklang::ESOD_AUTO_DETECT + to let irrKlang decide which driver will be best. + \param options A combination of irrklang::E_SOUND_ENGINE_OPTIONS literals. Default value is + irrklang::ESEO_DEFAULT_OPTIONS. + \param deviceID Some additional optional deviceID for the audio driver. If not needed, simple + set this to 0. + This can be used for example to set a specific ALSA output pcm device for output + ("default" or "hw", for example). For most driver types, available deviceIDs can be + enumerated using createSoundDeviceList(). + See @ref enumeratingDevices for an example or ISoundDeviceList or details. + \param sdk_version_do_not_use Don't use or change this parameter. Always set it to + IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks. + \return Returns pointer to the created irrKlang device or null if the + device could not be created. If you don't need the device, use ISoundEngine::drop() to + delete it. See IRefCounted::drop() for details. + */ + IRRKLANG_API ISoundEngine* IRRKLANGCALLCONV createIrrKlangDevice( + E_SOUND_OUTPUT_DRIVER driver = ESOD_AUTO_DETECT, + int options = ESEO_DEFAULT_OPTIONS, + const char* deviceID = 0, + const char* sdk_version_do_not_use = IRR_KLANG_VERSION); + + + //! Creates a list of available sound devices for the driver type. + /** The device IDs in this list can be used as parameter to createIrrKlangDevice() to + make irrKlang use a special sound device. See @ref enumeratingDevices for an example on how + to use this. + \param driver The sound output driver of which the list is generated. Set it irrklang::ESOD_AUTO_DETECT + to let this function use the same device as createIrrKlangDevice() would choose. + \param sdk_version_do_not_use Don't use or change this parameter. Always set it to + IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks. + \return Returns a pointer to the list of enumerated sound devices for the selected sound driver. + The device IDs in this list can be used as parameter to createIrrKlangDevice() to + make irrKlang use a special sound device. + After you don't need the list anymore, call ISoundDeviceList::drop() in order to free its memory. */ + IRRKLANG_API ISoundDeviceList* IRRKLANGCALLCONV createSoundDeviceList( + E_SOUND_OUTPUT_DRIVER driver = ESOD_AUTO_DETECT, + const char* sdk_version_do_not_use = IRR_KLANG_VERSION); + + + //! Creates an irrKlang audio recording device. The IAudioRecorder is the root object for recording audio. + /** If you want to play back recorded audio as well, create the ISoundEngine first using + createIrrKlangDevice() and then the IAudioRecorder using createIrrKlangAudioRecorder(), where + you set the ISoundEngine as first parameter. See @ref recordingAudio for an example on how to use this. + Note: audio recording is a very new feature a still beta in irrKlang. It currently only works in Windows + and with DirectSound (subject to change). + \param irrKlangDeviceForPlayback A pointer to the already existing sound device used for playback + of audio. Sound sources recorded with the IAudioRecorder will be added into that device so that + they can be played back there. + \param driver The sound output driver to be used for recording audio. Use irrklang::ESOD_AUTO_DETECT + to let irrKlang decide which driver will be best. + \param deviceID Some additional optional deviceID for the audio driver. If not needed, simple + set this to 0. Use createAudioRecorderDeviceList() to get a list of all deviceIDs. + \param sdk_version_do_not_use Don't use or change this parameter. Always set it to + IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks. + \return Returns pointer to the created irrKlang device or null if the + device could not be created. If you don't need the device, use ISoundEngine::drop() to + delete it. See IRefCounted::drop() for details. + */ + IRRKLANG_API IAudioRecorder* IRRKLANGCALLCONV createIrrKlangAudioRecorder( + ISoundEngine* irrKlangDeviceForPlayback, + E_SOUND_OUTPUT_DRIVER driver = ESOD_AUTO_DETECT, + const char* deviceID = 0, + const char* sdk_version_do_not_use = IRR_KLANG_VERSION); + + //! Creates a list of available recording devices for the driver type. + /** The device IDs in this list can be used as parameter to createIrrKlangAudioRecorder() to + make irrKlang use a special recording device. + \param driver The sound output driver of which the list is generated. Set it irrklang::ESOD_AUTO_DETECT + to let this function use the same device as createIrrKlangDevice() would choose. + \param sdk_version_do_not_use Don't use or change this parameter. Always set it to + IRRKLANG_SDK_VERSION, which is done by default. This is needed for sdk version checks. + \return Returns a pointer to the list of enumerated recording devices for the selected sound driver. + The device IDs in this list can be used as parameter to createIrrKlangAudioRecorder() to + make irrKlang use a special sound device. + After you don't need the list anymore, call ISoundDeviceList::drop() in order to free its memory. */ + IRRKLANG_API ISoundDeviceList* IRRKLANGCALLCONV createAudioRecorderDeviceList( + E_SOUND_OUTPUT_DRIVER driver = ESOD_AUTO_DETECT, + const char* sdk_version_do_not_use = IRR_KLANG_VERSION); + + + //! Converts a wchar_t string to an utf8 string, useful when using Windows in unicode mode. + /** irrKlang works with unicode file names, and accepts char* strings as parameters for names and filenames. + If you are running irrKlang in Windows, and working with wchar_t* pointers instead of char* ones, + you can use this function to create a char* (UTF8) representation of your wchar_t* (UTF16) string. + Works for filenames and other strings. + \param pInputString zero terminated input string. + \param pOutputBuffer the buffer where the converted string is written to. Be sure that this buffer + has a big enough size. A good size would be three times the string length of your input buffer, like + wcslen(yourInputBuffer)*3. Because each wchar_t can be represented by up to 3 chars. + \param outputBufferSize size of your output buffer. + \return Returns true if successful, and false if not. If 'false' is returned, maybe your buffer was too small. */ + IRRKLANG_API bool IRRKLANGCALLCONV makeUTF8fromUTF16string( + const wchar_t* pInputString, char* pOutputBuffer, int outputBufferSize); + + +} // end namespace irrklang + + +/*! \file irrKlang.h + \brief Main header file of the irrKlang sound library, the only file needed to include. +*/ + +#endif + diff --git a/Thirdparty/irrKlang/lib/Winx64-visualStudio/irrKlang.exp b/Thirdparty/irrKlang/lib/Winx64-visualStudio/irrKlang.exp new file mode 100644 index 0000000000000000000000000000000000000000..1bc0d7974e452a4cea693373ea8d09eaef227024 GIT binary patch literal 2329 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

    A`!7h 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/media/MF-PANTS.MOD b/Thirdparty/irrKlang/media/MF-PANTS.MOD new file mode 100644 index 0000000000000000000000000000000000000000..b33bc10704a099a3cde49a5ff5821a939fef104f GIT binary patch literal 91666 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/media/MF-W-90.XM b/Thirdparty/irrKlang/media/MF-W-90.XM new file mode 100644 index 0000000000000000000000000000000000000000..e1f374bd2b8368f76b37ff27a6f724808978440b GIT binary patch literal 53096 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/media/getout.ogg b/Thirdparty/irrKlang/media/getout.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f39d78bcbc891dfd784a50986b367a3c20540d5e GIT binary patch literal 464460 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 EPQ_!y+OK=1UmX--tg4g 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

    GVTy0!!s0@SbKBTt@#(hKHrB!LWG$ekglKcQy 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


    e_qk2ar1nOhEVW_ZeJ+%@0@as3z2tO2?*1%`J5T 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 z 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 CLW>F{%sa_C~@t$Bdfv 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

    L^lgtzFo?J7o^KO=5=PXZUg{;)VZvg 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℘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

    WG}G-Yp}x0@7~$9_OIx4fV6ewd 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/readme.txt b/Thirdparty/irrKlang/readme.txt new file mode 100644 index 0000000..9dfc25d --- /dev/null +++ b/Thirdparty/irrKlang/readme.txt @@ -0,0 +1,191 @@ +========================================================================== +The irrKlang SDK version 1.6 +========================================================================== + + Welcome the irrKlang SDK. + + Content of this file: + + 1. Directory structure overview + 2. How to start + 3. Release Notes + 4. .NET version dependencies + 5. License + 6. Contact + + + +========================================================================== +1. Directory structure overview +========================================================================== + + You will find some directories after decompressing the archive in which + came the SDK. These are: + + \bin The compiled library irrKlang.DLL and some compiled demo + and example applications, just start them to see + irrKlang in action. + \doc Documentation of the Irrlicht Engine. + \examples Examples and tutorials showing how to use the native engine + engine using C++. + \example.net Examples written for the .NET version of irrKlang, in C# and + VisualBasic.NET + \include Header files to include when using the engine. + \lib Lib to link with your programs when using the engine. + \media Sound data for the demo applications and + examples. + \plugins Source and documentation of the irrKlang plugins. + + +========================================================================== +2. How to start +========================================================================== + + To see the engine in action in Windows, just go to the \bin\Win32 + directories, and start some applications. + + To start developing own applications and games with the engine take + a look at the 01.HelloWorld example in the \examples directory. + + Windows Users: + There are Visual Studio as well as CodeBlocks projects for the examples. + + Linux users: + Just go into the /examples directory and run 'make' for every + example you want to try out. You can run the examples directly from the + directory they are created in. Some examples may print some special + hints after a successful make and might help you starting them up + by typing in 'make run'. + + Mac users: + There is a XCode project for each example available in + the corresponding example directory. To run the precompiled example + applications from bin\macos-gcc, doubleclick the run_0x_xxxxx.command + files from the finder (this will change the working directory to + bin\macos-gcc) or start them directly from a terminal. + +========================================================================== +3. Release Notes +========================================================================== + + Informations about changes in this new version of the engine can be + found in changes.txt. + + Please note that the included sound files are copyright + by their authors and not included in the irrKlang engine license. + + +========================================================================== +4. .NET version dependencies +========================================================================== + +There are four versions of irrKlang.NET available. They have the same +functionality and can be used from the same .NET projects. +The difference are only their dependencies and target platforms: + +irrKlang.NET2.0 in bin\dotnet-2.0: + Compiled for .NET common language runtime version 2.0, depends on + the modudles MSVCR80.DLL and MSVCM80.DLL. (32 bit) + One method to redistribute these is using the visual studio 2005 + redistributeable (vcredist_x86) + +irrKlang.NET4 in bin\dotnet-4: + Compiled for .NET common language runtime version 4.5, depends on + VCRUNTIME140.dll. (32 bit) + One method to redistribute this is using the visual studio 2017 + redistributeable (vcredist_x86) + +irrKlang.NET4 in bin\dotnet-4-64: (only in the 64 bit irrKlang SDK) + 64 bit version, Compiled for .NET common language runtime version 4.5, + depends on VCRUNTIME140.dll. (64 bit) + One method to redistribute this is using the visual studio 2017 + redistributeable (vcredist 64 bit) + +========================================================================== +5. License +========================================================================== + +irrKlang's source codes, documentation and binaries contained within the +distributed archive are copyright © Nikolaus Gebhardt / Ambiera 2001-2018. + +The contents of the irrKlang distribution archive may not be redistributed, +reproduced, modified, transmitted, broadcast, published or adapted in any +way, shape or form, without the prior written consent of the owner, +Nikolaus Gebhardt. + +The irrKlang.dll, irrKlang.so and libirrklang.dylib files may be +redistributed without the authors prior permission in non-commercial +products, and must remain unmodified except for compressing the file. + +For the included plugins which can be found in the \plugins +directory, different licenses may be applied, as specified in the +actual plugin directory. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +irrKlang may include Xiph.org Foundation code (Ogg Vorbis and FLAC). +It's license is the following: + +Copyright (c) 2002, Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +irrKlang may include code from the + Dynamic Universal Music Bibliotheque, Version 0.9.3 + +Copyright (C) 2001-2005 Ben Davis, Robert J Ohannessian and Julien Cugniere + +========================================================================== +6. Contact +========================================================================== + + If you have problems, questions or suggestions, please visit the + official homepage of the irrKlang Engine: + + http://www.ambiera.com/irrklang + + You will find forums, bugtrackers, patches, tutorials, and other stuff + which will help you out. + + If want to contact the author of the engine, please send an email to + Nikolaus Gebhardt: + + office@ambiera.com diff --git a/Thirdparty/opencv2/include/opencv2/calib3d.hpp b/Thirdparty/opencv2/include/opencv2/calib3d.hpp new file mode 100644 index 0000000..ec4c275 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/calib3d.hpp @@ -0,0 +1,4094 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CALIB3D_HPP +#define OPENCV_CALIB3D_HPP + +#include "opencv2/core.hpp" +#include "opencv2/core/types.hpp" +#include "opencv2/features2d.hpp" +#include "opencv2/core/affine.hpp" + +/** + @defgroup calib3d Camera Calibration and 3D Reconstruction + +The functions in this section use a so-called pinhole camera model. The view of a scene +is obtained by projecting a scene's 3D point \f$P_w\f$ into the image plane using a perspective +transformation which forms the corresponding pixel \f$p\f$. Both \f$P_w\f$ and \f$p\f$ are +represented in homogeneous coordinates, i.e. as 3D and 2D homogeneous vector respectively. You will +find a brief introduction to projective geometry, homogeneous vectors and homogeneous +transformations at the end of this section's introduction. For more succinct notation, we often drop +the 'homogeneous' and say vector instead of homogeneous vector. + +The distortion-free projective transformation given by a pinhole camera model is shown below. + +\f[s \; p = A \begin{bmatrix} R|t \end{bmatrix} P_w,\f] + +where \f$P_w\f$ is a 3D point expressed with respect to the world coordinate system, +\f$p\f$ is a 2D pixel in the image plane, \f$A\f$ is the camera intrinsic matrix, +\f$R\f$ and \f$t\f$ are the rotation and translation that describe the change of coordinates from +world to camera coordinate systems (or camera frame) and \f$s\f$ is the projective transformation's +arbitrary scaling and not part of the camera model. + +The camera intrinsic matrix \f$A\f$ (notation used as in @cite Zhang2000 and also generally notated +as \f$K\f$) projects 3D points given in the camera coordinate system to 2D pixel coordinates, i.e. + +\f[p = A P_c.\f] + +The camera intrinsic matrix \f$A\f$ is composed of the focal lengths \f$f_x\f$ and \f$f_y\f$, which are +expressed in pixel units, and the principal point \f$(c_x, c_y)\f$, that is usually close to the +image center: + +\f[A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1},\f] + +and thus + +\f[s \vecthree{u}{v}{1} = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1} \vecthree{X_c}{Y_c}{Z_c}.\f] + +The matrix of intrinsic parameters does not depend on the scene viewed. So, once estimated, it can +be re-used as long as the focal length is fixed (in case of a zoom lens). Thus, if an image from the +camera is scaled by a factor, all of these parameters need to be scaled (multiplied/divided, +respectively) by the same factor. + +The joint rotation-translation matrix \f$[R|t]\f$ is the matrix product of a projective +transformation and a homogeneous transformation. The 3-by-4 projective transformation maps 3D points +represented in camera coordinates to 2D points in the image plane and represented in normalized +camera coordinates \f$x' = X_c / Z_c\f$ and \f$y' = Y_c / Z_c\f$: + +\f[Z_c \begin{bmatrix} +x' \\ +y' \\ +1 +\end{bmatrix} = \begin{bmatrix} +1 & 0 & 0 & 0 \\ +0 & 1 & 0 & 0 \\ +0 & 0 & 1 & 0 +\end{bmatrix} +\begin{bmatrix} +X_c \\ +Y_c \\ +Z_c \\ +1 +\end{bmatrix}.\f] + +The homogeneous transformation is encoded by the extrinsic parameters \f$R\f$ and \f$t\f$ and +represents the change of basis from world coordinate system \f$w\f$ to the camera coordinate sytem +\f$c\f$. Thus, given the representation of the point \f$P\f$ in world coordinates, \f$P_w\f$, we +obtain \f$P\f$'s representation in the camera coordinate system, \f$P_c\f$, by + +\f[P_c = \begin{bmatrix} +R & t \\ +0 & 1 +\end{bmatrix} P_w,\f] + +This homogeneous transformation is composed out of \f$R\f$, a 3-by-3 rotation matrix, and \f$t\f$, a +3-by-1 translation vector: + +\f[\begin{bmatrix} +R & t \\ +0 & 1 +\end{bmatrix} = \begin{bmatrix} +r_{11} & r_{12} & r_{13} & t_x \\ +r_{21} & r_{22} & r_{23} & t_y \\ +r_{31} & r_{32} & r_{33} & t_z \\ +0 & 0 & 0 & 1 +\end{bmatrix}, +\f] + +and therefore + +\f[\begin{bmatrix} +X_c \\ +Y_c \\ +Z_c \\ +1 +\end{bmatrix} = \begin{bmatrix} +r_{11} & r_{12} & r_{13} & t_x \\ +r_{21} & r_{22} & r_{23} & t_y \\ +r_{31} & r_{32} & r_{33} & t_z \\ +0 & 0 & 0 & 1 +\end{bmatrix} +\begin{bmatrix} +X_w \\ +Y_w \\ +Z_w \\ +1 +\end{bmatrix}.\f] + +Combining the projective transformation and the homogeneous transformation, we obtain the projective +transformation that maps 3D points in world coordinates into 2D points in the image plane and in +normalized camera coordinates: + +\f[Z_c \begin{bmatrix} +x' \\ +y' \\ +1 +\end{bmatrix} = \begin{bmatrix} R|t \end{bmatrix} \begin{bmatrix} +X_w \\ +Y_w \\ +Z_w \\ +1 +\end{bmatrix} = \begin{bmatrix} +r_{11} & r_{12} & r_{13} & t_x \\ +r_{21} & r_{22} & r_{23} & t_y \\ +r_{31} & r_{32} & r_{33} & t_z +\end{bmatrix} +\begin{bmatrix} +X_w \\ +Y_w \\ +Z_w \\ +1 +\end{bmatrix},\f] + +with \f$x' = X_c / Z_c\f$ and \f$y' = Y_c / Z_c\f$. Putting the equations for instrincs and extrinsics together, we can write out +\f$s \; p = A \begin{bmatrix} R|t \end{bmatrix} P_w\f$ as + +\f[s \vecthree{u}{v}{1} = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1} +\begin{bmatrix} +r_{11} & r_{12} & r_{13} & t_x \\ +r_{21} & r_{22} & r_{23} & t_y \\ +r_{31} & r_{32} & r_{33} & t_z +\end{bmatrix} +\begin{bmatrix} +X_w \\ +Y_w \\ +Z_w \\ +1 +\end{bmatrix}.\f] + +If \f$Z_c \ne 0\f$, the transformation above is equivalent to the following, + +\f[\begin{bmatrix} +u \\ +v +\end{bmatrix} = \begin{bmatrix} +f_x X_c/Z_c + c_x \\ +f_y Y_c/Z_c + c_y +\end{bmatrix}\f] + +with + +\f[\vecthree{X_c}{Y_c}{Z_c} = \begin{bmatrix} +R|t +\end{bmatrix} \begin{bmatrix} +X_w \\ +Y_w \\ +Z_w \\ +1 +\end{bmatrix}.\f] + +The following figure illustrates the pinhole camera model. + +![Pinhole camera model](pics/pinhole_camera_model.png) + +Real lenses usually have some distortion, mostly radial distortion, and slight tangential distortion. +So, the above model is extended as: + +\f[\begin{bmatrix} +u \\ +v +\end{bmatrix} = \begin{bmatrix} +f_x x'' + c_x \\ +f_y y'' + c_y +\end{bmatrix}\f] + +where + +\f[\begin{bmatrix} +x'' \\ +y'' +\end{bmatrix} = \begin{bmatrix} +x' \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} + 2 p_1 x' y' + p_2(r^2 + 2 x'^2) + s_1 r^2 + s_2 r^4 \\ +y' \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} + p_1 (r^2 + 2 y'^2) + 2 p_2 x' y' + s_3 r^2 + s_4 r^4 \\ +\end{bmatrix}\f] + +with + +\f[r^2 = x'^2 + y'^2\f] + +and + +\f[\begin{bmatrix} +x'\\ +y' +\end{bmatrix} = \begin{bmatrix} +X_c/Z_c \\ +Y_c/Z_c +\end{bmatrix},\f] + +if \f$Z_c \ne 0\f$. + +The distortion parameters are the radial coefficients \f$k_1\f$, \f$k_2\f$, \f$k_3\f$, \f$k_4\f$, \f$k_5\f$, and \f$k_6\f$ +,\f$p_1\f$ and \f$p_2\f$ are the tangential distortion coefficients, and \f$s_1\f$, \f$s_2\f$, \f$s_3\f$, and \f$s_4\f$, +are the thin prism distortion coefficients. Higher-order coefficients are not considered in OpenCV. + +The next figures show two common types of radial distortion: barrel distortion +(\f$ 1 + k_1 r^2 + k_2 r^4 + k_3 r^6 \f$ monotonically decreasing) +and pincushion distortion (\f$ 1 + k_1 r^2 + k_2 r^4 + k_3 r^6 \f$ monotonically increasing). +Radial distortion is always monotonic for real lenses, +and if the estimator produces a non-monotonic result, +this should be considered a calibration failure. +More generally, radial distortion must be monotonic and the distortion function must be bijective. +A failed estimation result may look deceptively good near the image center +but will work poorly in e.g. AR/SFM applications. +The optimization method used in OpenCV camera calibration does not include these constraints as +the framework does not support the required integer programming and polynomial inequalities. +See [issue #15992](https://github.com/opencv/opencv/issues/15992) for additional information. + +![](pics/distortion_examples.png) +![](pics/distortion_examples2.png) + +In some cases, the image sensor may be tilted in order to focus an oblique plane in front of the +camera (Scheimpflug principle). This can be useful for particle image velocimetry (PIV) or +triangulation with a laser fan. The tilt causes a perspective distortion of \f$x''\f$ and +\f$y''\f$. This distortion can be modeled in the following way, see e.g. @cite Louhichi07. + +\f[\begin{bmatrix} +u \\ +v +\end{bmatrix} = \begin{bmatrix} +f_x x''' + c_x \\ +f_y y''' + c_y +\end{bmatrix},\f] + +where + +\f[s\vecthree{x'''}{y'''}{1} = +\vecthreethree{R_{33}(\tau_x, \tau_y)}{0}{-R_{13}(\tau_x, \tau_y)} +{0}{R_{33}(\tau_x, \tau_y)}{-R_{23}(\tau_x, \tau_y)} +{0}{0}{1} R(\tau_x, \tau_y) \vecthree{x''}{y''}{1}\f] + +and the matrix \f$R(\tau_x, \tau_y)\f$ is defined by two rotations with angular parameter +\f$\tau_x\f$ and \f$\tau_y\f$, respectively, + +\f[ +R(\tau_x, \tau_y) = +\vecthreethree{\cos(\tau_y)}{0}{-\sin(\tau_y)}{0}{1}{0}{\sin(\tau_y)}{0}{\cos(\tau_y)} +\vecthreethree{1}{0}{0}{0}{\cos(\tau_x)}{\sin(\tau_x)}{0}{-\sin(\tau_x)}{\cos(\tau_x)} = +\vecthreethree{\cos(\tau_y)}{\sin(\tau_y)\sin(\tau_x)}{-\sin(\tau_y)\cos(\tau_x)} +{0}{\cos(\tau_x)}{\sin(\tau_x)} +{\sin(\tau_y)}{-\cos(\tau_y)\sin(\tau_x)}{\cos(\tau_y)\cos(\tau_x)}. +\f] + +In the functions below the coefficients are passed or returned as + +\f[(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f] + +vector. That is, if the vector contains four elements, it means that \f$k_3=0\f$ . The distortion +coefficients do not depend on the scene viewed. Thus, they also belong to the intrinsic camera +parameters. And they remain the same regardless of the captured image resolution. If, for example, a +camera has been calibrated on images of 320 x 240 resolution, absolutely the same distortion +coefficients can be used for 640 x 480 images from the same camera while \f$f_x\f$, \f$f_y\f$, +\f$c_x\f$, and \f$c_y\f$ need to be scaled appropriately. + +The functions below use the above model to do the following: + +- Project 3D points to the image plane given intrinsic and extrinsic parameters. +- Compute extrinsic parameters given intrinsic parameters, a few 3D points, and their +projections. +- Estimate intrinsic and extrinsic camera parameters from several views of a known calibration +pattern (every view is described by several 3D-2D point correspondences). +- Estimate the relative position and orientation of the stereo camera "heads" and compute the +*rectification* transformation that makes the camera optical axes parallel. + + Homogeneous Coordinates
    +Homogeneous Coordinates are a system of coordinates that are used in projective geometry. Their use +allows to represent points at infinity by finite coordinates and simplifies formulas when compared +to the cartesian counterparts, e.g. they have the advantage that affine transformations can be +expressed as linear homogeneous transformation. + +One obtains the homogeneous vector \f$P_h\f$ by appending a 1 along an n-dimensional cartesian +vector \f$P\f$ e.g. for a 3D cartesian vector the mapping \f$P \rightarrow P_h\f$ is: + +\f[\begin{bmatrix} +X \\ +Y \\ +Z +\end{bmatrix} \rightarrow \begin{bmatrix} +X \\ +Y \\ +Z \\ +1 +\end{bmatrix}.\f] + +For the inverse mapping \f$P_h \rightarrow P\f$, one divides all elements of the homogeneous vector +by its last element, e.g. for a 3D homogeneous vector one gets its 2D cartesian counterpart by: + +\f[\begin{bmatrix} +X \\ +Y \\ +W +\end{bmatrix} \rightarrow \begin{bmatrix} +X / W \\ +Y / W +\end{bmatrix},\f] + +if \f$W \ne 0\f$. + +Due to this mapping, all multiples \f$k P_h\f$, for \f$k \ne 0\f$, of a homogeneous point represent +the same point \f$P_h\f$. An intuitive understanding of this property is that under a projective +transformation, all multiples of \f$P_h\f$ are mapped to the same point. This is the physical +observation one does for pinhole cameras, as all points along a ray through the camera's pinhole are +projected to the same image point, e.g. all points along the red ray in the image of the pinhole +camera model above would be mapped to the same image coordinate. This property is also the source +for the scale ambiguity s in the equation of the pinhole camera model. + +As mentioned, by using homogeneous coordinates we can express any change of basis parameterized by +\f$R\f$ and \f$t\f$ as a linear transformation, e.g. for the change of basis from coordinate system +0 to coordinate system 1 becomes: + +\f[P_1 = R P_0 + t \rightarrow P_{h_1} = \begin{bmatrix} +R & t \\ +0 & 1 +\end{bmatrix} P_{h_0}.\f] + +@note + - Many functions in this module take a camera intrinsic matrix as an input parameter. Although all + functions assume the same structure of this parameter, they may name it differently. The + parameter's description, however, will be clear in that a camera intrinsic matrix with the structure + shown above is required. + - A calibration sample for 3 cameras in a horizontal position can be found at + opencv_source_code/samples/cpp/3calibration.cpp + - A calibration sample based on a sequence of images can be found at + opencv_source_code/samples/cpp/calibration.cpp + - A calibration sample in order to do 3D reconstruction can be found at + opencv_source_code/samples/cpp/build3dmodel.cpp + - A calibration example on stereo calibration can be found at + opencv_source_code/samples/cpp/stereo_calib.cpp + - A calibration example on stereo matching can be found at + opencv_source_code/samples/cpp/stereo_match.cpp + - (Python) A camera calibration sample can be found at + opencv_source_code/samples/python/calibrate.py + + @{ + @defgroup calib3d_fisheye Fisheye camera model + + Definitions: Let P be a point in 3D of coordinates X in the world reference frame (stored in the + matrix X) The coordinate vector of P in the camera reference frame is: + + \f[Xc = R X + T\f] + + where R is the rotation matrix corresponding to the rotation vector om: R = rodrigues(om); call x, y + and z the 3 coordinates of Xc: + + \f[x = Xc_1 \\ y = Xc_2 \\ z = Xc_3\f] + + The pinhole projection coordinates of P is [a; b] where + + \f[a = x / z \ and \ b = y / z \\ r^2 = a^2 + b^2 \\ \theta = atan(r)\f] + + Fisheye distortion: + + \f[\theta_d = \theta (1 + k_1 \theta^2 + k_2 \theta^4 + k_3 \theta^6 + k_4 \theta^8)\f] + + The distorted point coordinates are [x'; y'] where + + \f[x' = (\theta_d / r) a \\ y' = (\theta_d / r) b \f] + + Finally, conversion into pixel coordinates: The final pixel coordinates vector [u; v] where: + + \f[u = f_x (x' + \alpha y') + c_x \\ + v = f_y y' + c_y\f] + + Summary: + Generic camera model @cite Kannala2006 with perspective projection and without distortion correction + + @defgroup calib3d_c C API + + @} + */ + +namespace cv +{ + +//! @addtogroup calib3d +//! @{ + +//! type of the robust estimation algorithm +enum { LMEDS = 4, //!< least-median of squares algorithm + RANSAC = 8, //!< RANSAC algorithm + RHO = 16, //!< RHO algorithm + USAC_DEFAULT = 32, //!< USAC algorithm, default settings + USAC_PARALLEL = 33, //!< USAC, parallel version + USAC_FM_8PTS = 34, //!< USAC, fundamental matrix 8 points + USAC_FAST = 35, //!< USAC, fast settings + USAC_ACCURATE = 36, //!< USAC, accurate settings + USAC_PROSAC = 37, //!< USAC, sorted points, runs PROSAC + USAC_MAGSAC = 38 //!< USAC, runs MAGSAC++ + }; + +enum SolvePnPMethod { + SOLVEPNP_ITERATIVE = 0, //!< Pose refinement using non-linear Levenberg-Marquardt minimization scheme @cite Madsen04 @cite Eade13 \n + //!< Initial solution for non-planar "objectPoints" needs at least 6 points and uses the DLT algorithm. \n + //!< Initial solution for planar "objectPoints" needs at least 4 points and uses pose from homography decomposition. + SOLVEPNP_EPNP = 1, //!< EPnP: Efficient Perspective-n-Point Camera Pose Estimation @cite lepetit2009epnp + SOLVEPNP_P3P = 2, //!< Complete Solution Classification for the Perspective-Three-Point Problem @cite gao2003complete + SOLVEPNP_DLS = 3, //!< **Broken implementation. Using this flag will fallback to EPnP.** \n + //!< A Direct Least-Squares (DLS) Method for PnP @cite hesch2011direct + SOLVEPNP_UPNP = 4, //!< **Broken implementation. Using this flag will fallback to EPnP.** \n + //!< Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation @cite penate2013exhaustive + SOLVEPNP_AP3P = 5, //!< An Efficient Algebraic Solution to the Perspective-Three-Point Problem @cite Ke17 + SOLVEPNP_IPPE = 6, //!< Infinitesimal Plane-Based Pose Estimation @cite Collins14 \n + //!< Object points must be coplanar. + SOLVEPNP_IPPE_SQUARE = 7, //!< Infinitesimal Plane-Based Pose Estimation @cite Collins14 \n + //!< This is a special case suitable for marker pose estimation.\n + //!< 4 coplanar object points must be defined in the following order: + //!< - point 0: [-squareLength / 2, squareLength / 2, 0] + //!< - point 1: [ squareLength / 2, squareLength / 2, 0] + //!< - point 2: [ squareLength / 2, -squareLength / 2, 0] + //!< - point 3: [-squareLength / 2, -squareLength / 2, 0] + SOLVEPNP_SQPNP = 8, //!< SQPnP: A Consistently Fast and Globally OptimalSolution to the Perspective-n-Point Problem @cite Terzakis2020SQPnP +#ifndef CV_DOXYGEN + SOLVEPNP_MAX_COUNT //!< Used for count +#endif +}; + +enum { CALIB_CB_ADAPTIVE_THRESH = 1, + CALIB_CB_NORMALIZE_IMAGE = 2, + CALIB_CB_FILTER_QUADS = 4, + CALIB_CB_FAST_CHECK = 8, + CALIB_CB_EXHAUSTIVE = 16, + CALIB_CB_ACCURACY = 32, + CALIB_CB_LARGER = 64, + CALIB_CB_MARKER = 128 + }; + +enum { CALIB_CB_SYMMETRIC_GRID = 1, + CALIB_CB_ASYMMETRIC_GRID = 2, + CALIB_CB_CLUSTERING = 4 + }; + +enum { CALIB_NINTRINSIC = 18, + CALIB_USE_INTRINSIC_GUESS = 0x00001, + CALIB_FIX_ASPECT_RATIO = 0x00002, + CALIB_FIX_PRINCIPAL_POINT = 0x00004, + CALIB_ZERO_TANGENT_DIST = 0x00008, + CALIB_FIX_FOCAL_LENGTH = 0x00010, + CALIB_FIX_K1 = 0x00020, + CALIB_FIX_K2 = 0x00040, + CALIB_FIX_K3 = 0x00080, + CALIB_FIX_K4 = 0x00800, + CALIB_FIX_K5 = 0x01000, + CALIB_FIX_K6 = 0x02000, + CALIB_RATIONAL_MODEL = 0x04000, + CALIB_THIN_PRISM_MODEL = 0x08000, + CALIB_FIX_S1_S2_S3_S4 = 0x10000, + CALIB_TILTED_MODEL = 0x40000, + CALIB_FIX_TAUX_TAUY = 0x80000, + CALIB_USE_QR = 0x100000, //!< use QR instead of SVD decomposition for solving. Faster but potentially less precise + CALIB_FIX_TANGENT_DIST = 0x200000, + // only for stereo + CALIB_FIX_INTRINSIC = 0x00100, + CALIB_SAME_FOCAL_LENGTH = 0x00200, + // for stereo rectification + CALIB_ZERO_DISPARITY = 0x00400, + CALIB_USE_LU = (1 << 17), //!< use LU instead of SVD decomposition for solving. much faster but potentially less precise + CALIB_USE_EXTRINSIC_GUESS = (1 << 22) //!< for stereoCalibrate + }; + +//! the algorithm for finding fundamental matrix +enum { FM_7POINT = 1, //!< 7-point algorithm + FM_8POINT = 2, //!< 8-point algorithm + FM_LMEDS = 4, //!< least-median algorithm. 7-point algorithm is used. + FM_RANSAC = 8 //!< RANSAC algorithm. It needs at least 15 points. 7-point algorithm is used. + }; + +enum HandEyeCalibrationMethod +{ + CALIB_HAND_EYE_TSAI = 0, //!< A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration @cite Tsai89 + CALIB_HAND_EYE_PARK = 1, //!< Robot Sensor Calibration: Solving AX = XB on the Euclidean Group @cite Park94 + CALIB_HAND_EYE_HORAUD = 2, //!< Hand-eye Calibration @cite Horaud95 + CALIB_HAND_EYE_ANDREFF = 3, //!< On-line Hand-Eye Calibration @cite Andreff99 + CALIB_HAND_EYE_DANIILIDIS = 4 //!< Hand-Eye Calibration Using Dual Quaternions @cite Daniilidis98 +}; + +enum RobotWorldHandEyeCalibrationMethod +{ + CALIB_ROBOT_WORLD_HAND_EYE_SHAH = 0, //!< Solving the robot-world/hand-eye calibration problem using the kronecker product @cite Shah2013SolvingTR + CALIB_ROBOT_WORLD_HAND_EYE_LI = 1 //!< Simultaneous robot-world and hand-eye calibration using dual-quaternions and kronecker product @cite Li2010SimultaneousRA +}; + +enum SamplingMethod { SAMPLING_UNIFORM=0, SAMPLING_PROGRESSIVE_NAPSAC=1, SAMPLING_NAPSAC=2, + SAMPLING_PROSAC=3 }; +enum LocalOptimMethod {LOCAL_OPTIM_NULL=0, LOCAL_OPTIM_INNER_LO=1, LOCAL_OPTIM_INNER_AND_ITER_LO=2, + LOCAL_OPTIM_GC=3, LOCAL_OPTIM_SIGMA=4}; +enum ScoreMethod {SCORE_METHOD_RANSAC=0, SCORE_METHOD_MSAC=1, SCORE_METHOD_MAGSAC=2, SCORE_METHOD_LMEDS=3}; +enum NeighborSearchMethod { NEIGH_FLANN_KNN=0, NEIGH_GRID=1, NEIGH_FLANN_RADIUS=2 }; +enum PolishingMethod { NONE_POLISHER=0, LSQ_POLISHER=1, MAGSAC=2, COV_POLISHER=3 }; + +struct CV_EXPORTS_W_SIMPLE UsacParams +{ // in alphabetical order + CV_WRAP UsacParams(); + CV_PROP_RW double confidence; + CV_PROP_RW bool isParallel; + CV_PROP_RW int loIterations; + CV_PROP_RW LocalOptimMethod loMethod; + CV_PROP_RW int loSampleSize; + CV_PROP_RW int maxIterations; + CV_PROP_RW NeighborSearchMethod neighborsSearch; + CV_PROP_RW int randomGeneratorState; + CV_PROP_RW SamplingMethod sampler; + CV_PROP_RW ScoreMethod score; + CV_PROP_RW double threshold; + CV_PROP_RW PolishingMethod final_polisher; + CV_PROP_RW int final_polisher_iterations; +}; + +/** @brief Converts a rotation matrix to a rotation vector or vice versa. + +@param src Input rotation vector (3x1 or 1x3) or rotation matrix (3x3). +@param dst Output rotation matrix (3x3) or rotation vector (3x1 or 1x3), respectively. +@param jacobian Optional output Jacobian matrix, 3x9 or 9x3, which is a matrix of partial +derivatives of the output array components with respect to the input array components. + +\f[\begin{array}{l} \theta \leftarrow norm(r) \\ r \leftarrow r/ \theta \\ R = \cos(\theta) I + (1- \cos{\theta} ) r r^T + \sin(\theta) \vecthreethree{0}{-r_z}{r_y}{r_z}{0}{-r_x}{-r_y}{r_x}{0} \end{array}\f] + +Inverse transformation can be also done easily, since + +\f[\sin ( \theta ) \vecthreethree{0}{-r_z}{r_y}{r_z}{0}{-r_x}{-r_y}{r_x}{0} = \frac{R - R^T}{2}\f] + +A rotation vector is a convenient and most compact representation of a rotation matrix (since any +rotation matrix has just 3 degrees of freedom). The representation is used in the global 3D geometry +optimization procedures like @ref calibrateCamera, @ref stereoCalibrate, or @ref solvePnP . + +@note More information about the computation of the derivative of a 3D rotation matrix with respect to its exponential coordinate +can be found in: + - A Compact Formula for the Derivative of a 3-D Rotation in Exponential Coordinates, Guillermo Gallego, Anthony J. Yezzi @cite Gallego2014ACF + +@note Useful information on SE(3) and Lie Groups can be found in: + - A tutorial on SE(3) transformation parameterizations and on-manifold optimization, Jose-Luis Blanco @cite blanco2010tutorial + - Lie Groups for 2D and 3D Transformation, Ethan Eade @cite Eade17 + - A micro Lie theory for state estimation in robotics, Joan Solà, Jérémie Deray, Dinesh Atchuthan @cite Sol2018AML + */ +CV_EXPORTS_W void Rodrigues( InputArray src, OutputArray dst, OutputArray jacobian = noArray() ); + + + +/** Levenberg-Marquardt solver. Starting with the specified vector of parameters it + optimizes the target vector criteria "err" + (finds local minima of each target vector component absolute value). + + When needed, it calls user-provided callback. +*/ +class CV_EXPORTS LMSolver : public Algorithm +{ +public: + class CV_EXPORTS Callback + { + public: + virtual ~Callback() {} + /** + computes error and Jacobian for the specified vector of parameters + + @param param the current vector of parameters + @param err output vector of errors: err_i = actual_f_i - ideal_f_i + @param J output Jacobian: J_ij = d(ideal_f_i)/d(param_j) + + when J=noArray(), it means that it does not need to be computed. + Dimensionality of error vector and param vector can be different. + The callback should explicitly allocate (with "create" method) each output array + (unless it's noArray()). + */ + virtual bool compute(InputArray param, OutputArray err, OutputArray J) const = 0; + }; + + /** + Runs Levenberg-Marquardt algorithm using the passed vector of parameters as the start point. + The final vector of parameters (whether the algorithm converged or not) is stored at the same + vector. The method returns the number of iterations used. If it's equal to the previously specified + maxIters, there is a big chance the algorithm did not converge. + + @param param initial/final vector of parameters. + + Note that the dimensionality of parameter space is defined by the size of param vector, + and the dimensionality of optimized criteria is defined by the size of err vector + computed by the callback. + */ + virtual int run(InputOutputArray param) const = 0; + + /** + Sets the maximum number of iterations + @param maxIters the number of iterations + */ + virtual void setMaxIters(int maxIters) = 0; + /** + Retrieves the current maximum number of iterations + */ + virtual int getMaxIters() const = 0; + + /** + Creates Levenberg-Marquard solver + + @param cb callback + @param maxIters maximum number of iterations that can be further + modified using setMaxIters() method. + */ + static Ptr create(const Ptr& cb, int maxIters); + static Ptr create(const Ptr& cb, int maxIters, double eps); +}; + + + +/** @example samples/cpp/tutorial_code/features2D/Homography/pose_from_homography.cpp +An example program about pose estimation from coplanar points + +Check @ref tutorial_homography "the corresponding tutorial" for more details +*/ + +/** @brief Finds a perspective transformation between two planes. + +@param srcPoints Coordinates of the points in the original plane, a matrix of the type CV_32FC2 +or vector\ . +@param dstPoints Coordinates of the points in the target plane, a matrix of the type CV_32FC2 or +a vector\ . +@param method Method used to compute a homography matrix. The following methods are possible: +- **0** - a regular method using all the points, i.e., the least squares method +- @ref RANSAC - RANSAC-based robust method +- @ref LMEDS - Least-Median robust method +- @ref RHO - PROSAC-based robust method +@param ransacReprojThreshold Maximum allowed reprojection error to treat a point pair as an inlier +(used in the RANSAC and RHO methods only). That is, if +\f[\| \texttt{dstPoints} _i - \texttt{convertPointsHomogeneous} ( \texttt{H} \cdot \texttt{srcPoints} _i) \|_2 > \texttt{ransacReprojThreshold}\f] +then the point \f$i\f$ is considered as an outlier. If srcPoints and dstPoints are measured in pixels, +it usually makes sense to set this parameter somewhere in the range of 1 to 10. +@param mask Optional output mask set by a robust method ( RANSAC or LMeDS ). Note that the input +mask values are ignored. +@param maxIters The maximum number of RANSAC iterations. +@param confidence Confidence level, between 0 and 1. + +The function finds and returns the perspective transformation \f$H\f$ between the source and the +destination planes: + +\f[s_i \vecthree{x'_i}{y'_i}{1} \sim H \vecthree{x_i}{y_i}{1}\f] + +so that the back-projection error + +\f[\sum _i \left ( x'_i- \frac{h_{11} x_i + h_{12} y_i + h_{13}}{h_{31} x_i + h_{32} y_i + h_{33}} \right )^2+ \left ( y'_i- \frac{h_{21} x_i + h_{22} y_i + h_{23}}{h_{31} x_i + h_{32} y_i + h_{33}} \right )^2\f] + +is minimized. If the parameter method is set to the default value 0, the function uses all the point +pairs to compute an initial homography estimate with a simple least-squares scheme. + +However, if not all of the point pairs ( \f$srcPoints_i\f$, \f$dstPoints_i\f$ ) fit the rigid perspective +transformation (that is, there are some outliers), this initial estimate will be poor. In this case, +you can use one of the three robust methods. The methods RANSAC, LMeDS and RHO try many different +random subsets of the corresponding point pairs (of four pairs each, collinear pairs are discarded), estimate the homography matrix +using this subset and a simple least-squares algorithm, and then compute the quality/goodness of the +computed homography (which is the number of inliers for RANSAC or the least median re-projection error for +LMeDS). The best subset is then used to produce the initial estimate of the homography matrix and +the mask of inliers/outliers. + +Regardless of the method, robust or not, the computed homography matrix is refined further (using +inliers only in case of a robust method) with the Levenberg-Marquardt method to reduce the +re-projection error even more. + +The methods RANSAC and RHO can handle practically any ratio of outliers but need a threshold to +distinguish inliers from outliers. The method LMeDS does not need any threshold but it works +correctly only when there are more than 50% of inliers. Finally, if there are no outliers and the +noise is rather small, use the default method (method=0). + +The function is used to find initial intrinsic and extrinsic matrices. Homography matrix is +determined up to a scale. Thus, it is normalized so that \f$h_{33}=1\f$. Note that whenever an \f$H\f$ matrix +cannot be estimated, an empty one will be returned. + +@sa +getAffineTransform, estimateAffine2D, estimateAffinePartial2D, getPerspectiveTransform, warpPerspective, +perspectiveTransform + */ +CV_EXPORTS_W Mat findHomography( InputArray srcPoints, InputArray dstPoints, + int method = 0, double ransacReprojThreshold = 3, + OutputArray mask=noArray(), const int maxIters = 2000, + const double confidence = 0.995); + +/** @overload */ +CV_EXPORTS Mat findHomography( InputArray srcPoints, InputArray dstPoints, + OutputArray mask, int method = 0, double ransacReprojThreshold = 3 ); + + +CV_EXPORTS_W Mat findHomography(InputArray srcPoints, InputArray dstPoints, OutputArray mask, + const UsacParams ¶ms); + +/** @brief Computes an RQ decomposition of 3x3 matrices. + +@param src 3x3 input matrix. +@param mtxR Output 3x3 upper-triangular matrix. +@param mtxQ Output 3x3 orthogonal matrix. +@param Qx Optional output 3x3 rotation matrix around x-axis. +@param Qy Optional output 3x3 rotation matrix around y-axis. +@param Qz Optional output 3x3 rotation matrix around z-axis. + +The function computes a RQ decomposition using the given rotations. This function is used in +#decomposeProjectionMatrix to decompose the left 3x3 submatrix of a projection matrix into a camera +and a rotation matrix. + +It optionally returns three rotation matrices, one for each axis, and the three Euler angles in +degrees (as the return value) that could be used in OpenGL. Note, there is always more than one +sequence of rotations about the three principal axes that results in the same orientation of an +object, e.g. see @cite Slabaugh . Returned tree rotation matrices and corresponding three Euler angles +are only one of the possible solutions. + */ +CV_EXPORTS_W Vec3d RQDecomp3x3( InputArray src, OutputArray mtxR, OutputArray mtxQ, + OutputArray Qx = noArray(), + OutputArray Qy = noArray(), + OutputArray Qz = noArray()); + +/** @brief Decomposes a projection matrix into a rotation matrix and a camera intrinsic matrix. + +@param projMatrix 3x4 input projection matrix P. +@param cameraMatrix Output 3x3 camera intrinsic matrix \f$\cameramatrix{A}\f$. +@param rotMatrix Output 3x3 external rotation matrix R. +@param transVect Output 4x1 translation vector T. +@param rotMatrixX Optional 3x3 rotation matrix around x-axis. +@param rotMatrixY Optional 3x3 rotation matrix around y-axis. +@param rotMatrixZ Optional 3x3 rotation matrix around z-axis. +@param eulerAngles Optional three-element vector containing three Euler angles of rotation in +degrees. + +The function computes a decomposition of a projection matrix into a calibration and a rotation +matrix and the position of a camera. + +It optionally returns three rotation matrices, one for each axis, and three Euler angles that could +be used in OpenGL. Note, there is always more than one sequence of rotations about the three +principal axes that results in the same orientation of an object, e.g. see @cite Slabaugh . Returned +tree rotation matrices and corresponding three Euler angles are only one of the possible solutions. + +The function is based on #RQDecomp3x3 . + */ +CV_EXPORTS_W void decomposeProjectionMatrix( InputArray projMatrix, OutputArray cameraMatrix, + OutputArray rotMatrix, OutputArray transVect, + OutputArray rotMatrixX = noArray(), + OutputArray rotMatrixY = noArray(), + OutputArray rotMatrixZ = noArray(), + OutputArray eulerAngles =noArray() ); + +/** @brief Computes partial derivatives of the matrix product for each multiplied matrix. + +@param A First multiplied matrix. +@param B Second multiplied matrix. +@param dABdA First output derivative matrix d(A\*B)/dA of size +\f$\texttt{A.rows*B.cols} \times {A.rows*A.cols}\f$ . +@param dABdB Second output derivative matrix d(A\*B)/dB of size +\f$\texttt{A.rows*B.cols} \times {B.rows*B.cols}\f$ . + +The function computes partial derivatives of the elements of the matrix product \f$A*B\f$ with regard to +the elements of each of the two input matrices. The function is used to compute the Jacobian +matrices in #stereoCalibrate but can also be used in any other similar optimization function. + */ +CV_EXPORTS_W void matMulDeriv( InputArray A, InputArray B, OutputArray dABdA, OutputArray dABdB ); + +/** @brief Combines two rotation-and-shift transformations. + +@param rvec1 First rotation vector. +@param tvec1 First translation vector. +@param rvec2 Second rotation vector. +@param tvec2 Second translation vector. +@param rvec3 Output rotation vector of the superposition. +@param tvec3 Output translation vector of the superposition. +@param dr3dr1 Optional output derivative of rvec3 with regard to rvec1 +@param dr3dt1 Optional output derivative of rvec3 with regard to tvec1 +@param dr3dr2 Optional output derivative of rvec3 with regard to rvec2 +@param dr3dt2 Optional output derivative of rvec3 with regard to tvec2 +@param dt3dr1 Optional output derivative of tvec3 with regard to rvec1 +@param dt3dt1 Optional output derivative of tvec3 with regard to tvec1 +@param dt3dr2 Optional output derivative of tvec3 with regard to rvec2 +@param dt3dt2 Optional output derivative of tvec3 with regard to tvec2 + +The functions compute: + +\f[\begin{array}{l} \texttt{rvec3} = \mathrm{rodrigues} ^{-1} \left ( \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \mathrm{rodrigues} ( \texttt{rvec1} ) \right ) \\ \texttt{tvec3} = \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \texttt{tvec1} + \texttt{tvec2} \end{array} ,\f] + +where \f$\mathrm{rodrigues}\f$ denotes a rotation vector to a rotation matrix transformation, and +\f$\mathrm{rodrigues}^{-1}\f$ denotes the inverse transformation. See #Rodrigues for details. + +Also, the functions can compute the derivatives of the output vectors with regards to the input +vectors (see #matMulDeriv ). The functions are used inside #stereoCalibrate but can also be used in +your own code where Levenberg-Marquardt or another gradient-based solver is used to optimize a +function that contains a matrix multiplication. + */ +CV_EXPORTS_W void composeRT( InputArray rvec1, InputArray tvec1, + InputArray rvec2, InputArray tvec2, + OutputArray rvec3, OutputArray tvec3, + OutputArray dr3dr1 = noArray(), OutputArray dr3dt1 = noArray(), + OutputArray dr3dr2 = noArray(), OutputArray dr3dt2 = noArray(), + OutputArray dt3dr1 = noArray(), OutputArray dt3dt1 = noArray(), + OutputArray dt3dr2 = noArray(), OutputArray dt3dt2 = noArray() ); + +/** @brief Projects 3D points to an image plane. + +@param objectPoints Array of object points expressed wrt. the world coordinate frame. A 3xN/Nx3 +1-channel or 1xN/Nx1 3-channel (or vector\ ), where N is the number of points in the view. +@param rvec The rotation vector (@ref Rodrigues) that, together with tvec, performs a change of +basis from world to camera coordinate system, see @ref calibrateCamera for details. +@param tvec The translation vector, see parameter description above. +@param cameraMatrix Camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$ . If the vector is empty, the zero distortion coefficients are assumed. +@param imagePoints Output array of image points, 1xN/Nx1 2-channel, or +vector\ . +@param jacobian Optional output 2Nx(10+\) jacobian matrix of derivatives of image +points with respect to components of the rotation vector, translation vector, focal lengths, +coordinates of the principal point and the distortion coefficients. In the old interface different +components of the jacobian are returned via different output parameters. +@param aspectRatio Optional "fixed aspect ratio" parameter. If the parameter is not 0, the +function assumes that the aspect ratio (\f$f_x / f_y\f$) is fixed and correspondingly adjusts the +jacobian matrix. + +The function computes the 2D projections of 3D points to the image plane, given intrinsic and +extrinsic camera parameters. Optionally, the function computes Jacobians -matrices of partial +derivatives of image points coordinates (as functions of all the input parameters) with respect to +the particular parameters, intrinsic and/or extrinsic. The Jacobians are used during the global +optimization in @ref calibrateCamera, @ref solvePnP, and @ref stereoCalibrate. The function itself +can also be used to compute a re-projection error, given the current intrinsic and extrinsic +parameters. + +@note By setting rvec = tvec = \f$[0, 0, 0]\f$, or by setting cameraMatrix to a 3x3 identity matrix, +or by passing zero distortion coefficients, one can get various useful partial cases of the +function. This means, one can compute the distorted coordinates for a sparse set of points or apply +a perspective transformation (and also compute the derivatives) in the ideal zero-distortion setup. + */ +CV_EXPORTS_W void projectPoints( InputArray objectPoints, + InputArray rvec, InputArray tvec, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArray imagePoints, + OutputArray jacobian = noArray(), + double aspectRatio = 0 ); + +/** @example samples/cpp/tutorial_code/features2D/Homography/homography_from_camera_displacement.cpp +An example program about homography from the camera displacement + +Check @ref tutorial_homography "the corresponding tutorial" for more details +*/ + +/** @brief Finds an object pose from 3D-2D point correspondences. + +@see @ref calib3d_solvePnP + +This function returns the rotation and the translation vectors that transform a 3D point expressed in the object +coordinate frame to the camera coordinate frame, using different methods: +- P3P methods (@ref SOLVEPNP_P3P, @ref SOLVEPNP_AP3P): need 4 input points to return a unique solution. +- @ref SOLVEPNP_IPPE Input points must be >= 4 and object points must be coplanar. +- @ref SOLVEPNP_IPPE_SQUARE Special case suitable for marker pose estimation. +Number of input points must be 4. Object points must be defined in the following order: + - point 0: [-squareLength / 2, squareLength / 2, 0] + - point 1: [ squareLength / 2, squareLength / 2, 0] + - point 2: [ squareLength / 2, -squareLength / 2, 0] + - point 3: [-squareLength / 2, -squareLength / 2, 0] +- for all the other flags, number of input points must be >= 4 and object points can be in any configuration. + +@param objectPoints Array of object points in the object coordinate space, Nx3 1-channel or +1xN/Nx1 3-channel, where N is the number of points. vector\ can be also passed here. +@param imagePoints Array of corresponding image points, Nx2 1-channel or 1xN/Nx1 2-channel, +where N is the number of points. vector\ can be also passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvec Output rotation vector (see @ref Rodrigues ) that, together with tvec, brings points from +the model coordinate system to the camera coordinate system. +@param tvec Output translation vector. +@param useExtrinsicGuess Parameter used for #SOLVEPNP_ITERATIVE. If true (1), the function uses +the provided rvec and tvec values as initial approximations of the rotation and translation +vectors, respectively, and further optimizes them. +@param flags Method for solving a PnP problem: see @ref calib3d_solvePnP_flags + +More information about Perspective-n-Points is described in @ref calib3d_solvePnP + +@note + - An example of how to use solvePnP for planar augmented reality can be found at + opencv_source_code/samples/python/plane_ar.py + - If you are using Python: + - Numpy array slices won't work as input because solvePnP requires contiguous + arrays (enforced by the assertion using cv::Mat::checkVector() around line 55 of + modules/calib3d/src/solvepnp.cpp version 2.4.9) + - The P3P algorithm requires image points to be in an array of shape (N,1,2) due + to its calling of #undistortPoints (around line 75 of modules/calib3d/src/solvepnp.cpp version 2.4.9) + which requires 2-channel information. + - Thus, given some data D = np.array(...) where D.shape = (N,M), in order to use a subset of + it as, e.g., imagePoints, one must effectively copy it into a new array: imagePoints = + np.ascontiguousarray(D[:,:2]).reshape((N,1,2)) + - The methods @ref SOLVEPNP_DLS and @ref SOLVEPNP_UPNP cannot be used as the current implementations are + unstable and sometimes give completely wrong results. If you pass one of these two + flags, @ref SOLVEPNP_EPNP method will be used instead. + - The minimum number of points is 4 in the general case. In the case of @ref SOLVEPNP_P3P and @ref SOLVEPNP_AP3P + methods, it is required to use exactly 4 points (the first 3 points are used to estimate all the solutions + of the P3P problem, the last one is used to retain the best solution that minimizes the reprojection error). + - With @ref SOLVEPNP_ITERATIVE method and `useExtrinsicGuess=true`, the minimum number of points is 3 (3 points + are sufficient to compute a pose but there are up to 4 solutions). The initial solution should be close to the + global solution to converge. + - With @ref SOLVEPNP_IPPE input points must be >= 4 and object points must be coplanar. + - With @ref SOLVEPNP_IPPE_SQUARE this is a special case suitable for marker pose estimation. + Number of input points must be 4. Object points must be defined in the following order: + - point 0: [-squareLength / 2, squareLength / 2, 0] + - point 1: [ squareLength / 2, squareLength / 2, 0] + - point 2: [ squareLength / 2, -squareLength / 2, 0] + - point 3: [-squareLength / 2, -squareLength / 2, 0] + - With @ref SOLVEPNP_SQPNP input points must be >= 3 + */ +CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, + bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE ); + +/** @brief Finds an object pose from 3D-2D point correspondences using the RANSAC scheme. + +@see @ref calib3d_solvePnP + +@param objectPoints Array of object points in the object coordinate space, Nx3 1-channel or +1xN/Nx1 3-channel, where N is the number of points. vector\ can be also passed here. +@param imagePoints Array of corresponding image points, Nx2 1-channel or 1xN/Nx1 2-channel, +where N is the number of points. vector\ can be also passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvec Output rotation vector (see @ref Rodrigues ) that, together with tvec, brings points from +the model coordinate system to the camera coordinate system. +@param tvec Output translation vector. +@param useExtrinsicGuess Parameter used for @ref SOLVEPNP_ITERATIVE. If true (1), the function uses +the provided rvec and tvec values as initial approximations of the rotation and translation +vectors, respectively, and further optimizes them. +@param iterationsCount Number of iterations. +@param reprojectionError Inlier threshold value used by the RANSAC procedure. The parameter value +is the maximum allowed distance between the observed and computed point projections to consider it +an inlier. +@param confidence The probability that the algorithm produces a useful result. +@param inliers Output vector that contains indices of inliers in objectPoints and imagePoints . +@param flags Method for solving a PnP problem (see @ref solvePnP ). + +The function estimates an object pose given a set of object points, their corresponding image +projections, as well as the camera intrinsic matrix and the distortion coefficients. This function finds such +a pose that minimizes reprojection error, that is, the sum of squared distances between the observed +projections imagePoints and the projected (using @ref projectPoints ) objectPoints. The use of RANSAC +makes the function resistant to outliers. + +@note + - An example of how to use solvePNPRansac for object detection can be found at + opencv_source_code/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/ + - The default method used to estimate the camera pose for the Minimal Sample Sets step + is #SOLVEPNP_EPNP. Exceptions are: + - if you choose #SOLVEPNP_P3P or #SOLVEPNP_AP3P, these methods will be used. + - if the number of input points is equal to 4, #SOLVEPNP_P3P is used. + - The method used to estimate the camera pose using all the inliers is defined by the + flags parameters unless it is equal to #SOLVEPNP_P3P or #SOLVEPNP_AP3P. In this case, + the method #SOLVEPNP_EPNP will be used instead. + */ +CV_EXPORTS_W bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, + bool useExtrinsicGuess = false, int iterationsCount = 100, + float reprojectionError = 8.0, double confidence = 0.99, + OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE ); + + +/* +Finds rotation and translation vector. +If cameraMatrix is given then run P3P. Otherwise run linear P6P and output cameraMatrix too. +*/ +CV_EXPORTS_W bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints, + InputOutputArray cameraMatrix, InputArray distCoeffs, + OutputArray rvec, OutputArray tvec, OutputArray inliers, + const UsacParams ¶ms=UsacParams()); + +/** @brief Finds an object pose from 3 3D-2D point correspondences. + +@see @ref calib3d_solvePnP + +@param objectPoints Array of object points in the object coordinate space, 3x3 1-channel or +1x3/3x1 3-channel. vector\ can be also passed here. +@param imagePoints Array of corresponding image points, 3x2 1-channel or 1x3/3x1 2-channel. + vector\ can be also passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvecs Output rotation vectors (see @ref Rodrigues ) that, together with tvecs, brings points from +the model coordinate system to the camera coordinate system. A P3P problem has up to 4 solutions. +@param tvecs Output translation vectors. +@param flags Method for solving a P3P problem: +- @ref SOLVEPNP_P3P Method is based on the paper of X.S. Gao, X.-R. Hou, J. Tang, H.-F. Chang +"Complete Solution Classification for the Perspective-Three-Point Problem" (@cite gao2003complete). +- @ref SOLVEPNP_AP3P Method is based on the paper of T. Ke and S. Roumeliotis. +"An Efficient Algebraic Solution to the Perspective-Three-Point Problem" (@cite Ke17). + +The function estimates the object pose given 3 object points, their corresponding image +projections, as well as the camera intrinsic matrix and the distortion coefficients. + +@note +The solutions are sorted by reprojection errors (lowest to highest). + */ +CV_EXPORTS_W int solveP3P( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + int flags ); + +/** @brief Refine a pose (the translation and the rotation that transform a 3D point expressed in the object coordinate frame +to the camera coordinate frame) from a 3D-2D point correspondences and starting from an initial solution. + +@see @ref calib3d_solvePnP + +@param objectPoints Array of object points in the object coordinate space, Nx3 1-channel or 1xN/Nx1 3-channel, +where N is the number of points. vector\ can also be passed here. +@param imagePoints Array of corresponding image points, Nx2 1-channel or 1xN/Nx1 2-channel, +where N is the number of points. vector\ can also be passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvec Input/Output rotation vector (see @ref Rodrigues ) that, together with tvec, brings points from +the model coordinate system to the camera coordinate system. Input values are used as an initial solution. +@param tvec Input/Output translation vector. Input values are used as an initial solution. +@param criteria Criteria when to stop the Levenberg-Marquard iterative algorithm. + +The function refines the object pose given at least 3 object points, their corresponding image +projections, an initial solution for the rotation and translation vector, +as well as the camera intrinsic matrix and the distortion coefficients. +The function minimizes the projection error with respect to the rotation and the translation vectors, according +to a Levenberg-Marquardt iterative minimization @cite Madsen04 @cite Eade13 process. + */ +CV_EXPORTS_W void solvePnPRefineLM( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + InputOutputArray rvec, InputOutputArray tvec, + TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 20, FLT_EPSILON)); + +/** @brief Refine a pose (the translation and the rotation that transform a 3D point expressed in the object coordinate frame +to the camera coordinate frame) from a 3D-2D point correspondences and starting from an initial solution. + +@see @ref calib3d_solvePnP + +@param objectPoints Array of object points in the object coordinate space, Nx3 1-channel or 1xN/Nx1 3-channel, +where N is the number of points. vector\ can also be passed here. +@param imagePoints Array of corresponding image points, Nx2 1-channel or 1xN/Nx1 2-channel, +where N is the number of points. vector\ can also be passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvec Input/Output rotation vector (see @ref Rodrigues ) that, together with tvec, brings points from +the model coordinate system to the camera coordinate system. Input values are used as an initial solution. +@param tvec Input/Output translation vector. Input values are used as an initial solution. +@param criteria Criteria when to stop the Levenberg-Marquard iterative algorithm. +@param VVSlambda Gain for the virtual visual servoing control law, equivalent to the \f$\alpha\f$ +gain in the Damped Gauss-Newton formulation. + +The function refines the object pose given at least 3 object points, their corresponding image +projections, an initial solution for the rotation and translation vector, +as well as the camera intrinsic matrix and the distortion coefficients. +The function minimizes the projection error with respect to the rotation and the translation vectors, using a +virtual visual servoing (VVS) @cite Chaumette06 @cite Marchand16 scheme. + */ +CV_EXPORTS_W void solvePnPRefineVVS( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + InputOutputArray rvec, InputOutputArray tvec, + TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 20, FLT_EPSILON), + double VVSlambda = 1); + +/** @brief Finds an object pose from 3D-2D point correspondences. + +@see @ref calib3d_solvePnP + +This function returns a list of all the possible solutions (a solution is a +couple), depending on the number of input points and the chosen method: +- P3P methods (@ref SOLVEPNP_P3P, @ref SOLVEPNP_AP3P): 3 or 4 input points. Number of returned solutions can be between 0 and 4 with 3 input points. +- @ref SOLVEPNP_IPPE Input points must be >= 4 and object points must be coplanar. Returns 2 solutions. +- @ref SOLVEPNP_IPPE_SQUARE Special case suitable for marker pose estimation. +Number of input points must be 4 and 2 solutions are returned. Object points must be defined in the following order: + - point 0: [-squareLength / 2, squareLength / 2, 0] + - point 1: [ squareLength / 2, squareLength / 2, 0] + - point 2: [ squareLength / 2, -squareLength / 2, 0] + - point 3: [-squareLength / 2, -squareLength / 2, 0] +- for all the other flags, number of input points must be >= 4 and object points can be in any configuration. +Only 1 solution is returned. + +@param objectPoints Array of object points in the object coordinate space, Nx3 1-channel or +1xN/Nx1 3-channel, where N is the number of points. vector\ can be also passed here. +@param imagePoints Array of corresponding image points, Nx2 1-channel or 1xN/Nx1 2-channel, +where N is the number of points. vector\ can be also passed here. +@param cameraMatrix Input camera intrinsic matrix \f$\cameramatrix{A}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param rvecs Vector of output rotation vectors (see @ref Rodrigues ) that, together with tvecs, brings points from +the model coordinate system to the camera coordinate system. +@param tvecs Vector of output translation vectors. +@param useExtrinsicGuess Parameter used for #SOLVEPNP_ITERATIVE. If true (1), the function uses +the provided rvec and tvec values as initial approximations of the rotation and translation +vectors, respectively, and further optimizes them. +@param flags Method for solving a PnP problem: see @ref calib3d_solvePnP_flags +@param rvec Rotation vector used to initialize an iterative PnP refinement algorithm, when flag is @ref SOLVEPNP_ITERATIVE +and useExtrinsicGuess is set to true. +@param tvec Translation vector used to initialize an iterative PnP refinement algorithm, when flag is @ref SOLVEPNP_ITERATIVE +and useExtrinsicGuess is set to true. +@param reprojectionError Optional vector of reprojection error, that is the RMS error +(\f$ \text{RMSE} = \sqrt{\frac{\sum_{i}^{N} \left ( \hat{y_i} - y_i \right )^2}{N}} \f$) between the input image points +and the 3D object points projected with the estimated pose. + +More information is described in @ref calib3d_solvePnP + +@note + - An example of how to use solvePnP for planar augmented reality can be found at + opencv_source_code/samples/python/plane_ar.py + - If you are using Python: + - Numpy array slices won't work as input because solvePnP requires contiguous + arrays (enforced by the assertion using cv::Mat::checkVector() around line 55 of + modules/calib3d/src/solvepnp.cpp version 2.4.9) + - The P3P algorithm requires image points to be in an array of shape (N,1,2) due + to its calling of #undistortPoints (around line 75 of modules/calib3d/src/solvepnp.cpp version 2.4.9) + which requires 2-channel information. + - Thus, given some data D = np.array(...) where D.shape = (N,M), in order to use a subset of + it as, e.g., imagePoints, one must effectively copy it into a new array: imagePoints = + np.ascontiguousarray(D[:,:2]).reshape((N,1,2)) + - The methods @ref SOLVEPNP_DLS and @ref SOLVEPNP_UPNP cannot be used as the current implementations are + unstable and sometimes give completely wrong results. If you pass one of these two + flags, @ref SOLVEPNP_EPNP method will be used instead. + - The minimum number of points is 4 in the general case. In the case of @ref SOLVEPNP_P3P and @ref SOLVEPNP_AP3P + methods, it is required to use exactly 4 points (the first 3 points are used to estimate all the solutions + of the P3P problem, the last one is used to retain the best solution that minimizes the reprojection error). + - With @ref SOLVEPNP_ITERATIVE method and `useExtrinsicGuess=true`, the minimum number of points is 3 (3 points + are sufficient to compute a pose but there are up to 4 solutions). The initial solution should be close to the + global solution to converge. + - With @ref SOLVEPNP_IPPE input points must be >= 4 and object points must be coplanar. + - With @ref SOLVEPNP_IPPE_SQUARE this is a special case suitable for marker pose estimation. + Number of input points must be 4. Object points must be defined in the following order: + - point 0: [-squareLength / 2, squareLength / 2, 0] + - point 1: [ squareLength / 2, squareLength / 2, 0] + - point 2: [ squareLength / 2, -squareLength / 2, 0] + - point 3: [-squareLength / 2, -squareLength / 2, 0] + */ +CV_EXPORTS_W int solvePnPGeneric( InputArray objectPoints, InputArray imagePoints, + InputArray cameraMatrix, InputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + bool useExtrinsicGuess = false, SolvePnPMethod flags = SOLVEPNP_ITERATIVE, + InputArray rvec = noArray(), InputArray tvec = noArray(), + OutputArray reprojectionError = noArray() ); + +/** @brief Finds an initial camera intrinsic matrix from 3D-2D point correspondences. + +@param objectPoints Vector of vectors of the calibration pattern points in the calibration pattern +coordinate space. In the old interface all the per-view vectors are concatenated. See +#calibrateCamera for details. +@param imagePoints Vector of vectors of the projections of the calibration pattern points. In the +old interface all the per-view vectors are concatenated. +@param imageSize Image size in pixels used to initialize the principal point. +@param aspectRatio If it is zero or negative, both \f$f_x\f$ and \f$f_y\f$ are estimated independently. +Otherwise, \f$f_x = f_y \cdot \texttt{aspectRatio}\f$ . + +The function estimates and returns an initial camera intrinsic matrix for the camera calibration process. +Currently, the function only supports planar calibration patterns, which are patterns where each +object point has z-coordinate =0. + */ +CV_EXPORTS_W Mat initCameraMatrix2D( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints, + Size imageSize, double aspectRatio = 1.0 ); + +/** @brief Finds the positions of internal corners of the chessboard. + +@param image Source chessboard view. It must be an 8-bit grayscale or color image. +@param patternSize Number of inner corners per a chessboard row and column +( patternSize = cv::Size(points_per_row,points_per_colum) = cv::Size(columns,rows) ). +@param corners Output array of detected corners. +@param flags Various operation flags that can be zero or a combination of the following values: +- @ref CALIB_CB_ADAPTIVE_THRESH Use adaptive thresholding to convert the image to black +and white, rather than a fixed threshold level (computed from the average image brightness). +- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with #equalizeHist before +applying fixed or adaptive thresholding. +- @ref CALIB_CB_FILTER_QUADS Use additional criteria (like contour area, perimeter, +square-like shape) to filter out false quads extracted at the contour retrieval stage. +- @ref CALIB_CB_FAST_CHECK Run a fast check on the image that looks for chessboard corners, +and shortcut the call if none is found. This can drastically speed up the call in the +degenerate condition when no chessboard is observed. + +The function attempts to determine whether the input image is a view of the chessboard pattern and +locate the internal chessboard corners. The function returns a non-zero value if all of the corners +are found and they are placed in a certain order (row by row, left to right in every row). +Otherwise, if the function fails to find all the corners or reorder them, it returns 0. For example, +a regular chessboard has 8 x 8 squares and 7 x 7 internal corners, that is, points where the black +squares touch each other. The detected coordinates are approximate, and to determine their positions +more accurately, the function calls #cornerSubPix. You also may use the function #cornerSubPix with +different parameters if returned coordinates are not accurate enough. + +Sample usage of detecting and drawing chessboard corners: : +@code + Size patternsize(8,6); //interior number of corners + Mat gray = ....; //source image + vector corners; //this will be filled by the detected corners + + //CALIB_CB_FAST_CHECK saves a lot of time on images + //that do not contain any chessboard corners + bool patternfound = findChessboardCorners(gray, patternsize, corners, + CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + + CALIB_CB_FAST_CHECK); + + if(patternfound) + cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), + TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); + + drawChessboardCorners(img, patternsize, Mat(corners), patternfound); +@endcode +@note The function requires white space (like a square-thick border, the wider the better) around +the board to make the detection more robust in various environments. Otherwise, if there is no +border and the background is dark, the outer black squares cannot be segmented properly and so the +square grouping and ordering algorithm fails. + +Use gen_pattern.py (@ref tutorial_camera_calibration_pattern) to create checkerboard. + */ +CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners, + int flags = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE ); + +/* + Checks whether the image contains chessboard of the specific size or not. + If yes, nonzero value is returned. +*/ +CV_EXPORTS_W bool checkChessboard(InputArray img, Size size); + +/** @brief Finds the positions of internal corners of the chessboard using a sector based approach. + +@param image Source chessboard view. It must be an 8-bit grayscale or color image. +@param patternSize Number of inner corners per a chessboard row and column +( patternSize = cv::Size(points_per_row,points_per_colum) = cv::Size(columns,rows) ). +@param corners Output array of detected corners. +@param flags Various operation flags that can be zero or a combination of the following values: +- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with equalizeHist before detection. +- @ref CALIB_CB_EXHAUSTIVE Run an exhaustive search to improve detection rate. +- @ref CALIB_CB_ACCURACY Up sample input image to improve sub-pixel accuracy due to aliasing effects. +- @ref CALIB_CB_LARGER The detected pattern is allowed to be larger than patternSize (see description). +- @ref CALIB_CB_MARKER The detected pattern must have a marker (see description). +This should be used if an accurate camera calibration is required. +@param meta Optional output arrray of detected corners (CV_8UC1 and size = cv::Size(columns,rows)). +Each entry stands for one corner of the pattern and can have one of the following values: +- 0 = no meta data attached +- 1 = left-top corner of a black cell +- 2 = left-top corner of a white cell +- 3 = left-top corner of a black cell with a white marker dot +- 4 = left-top corner of a white cell with a black marker dot (pattern origin in case of markers otherwise first corner) + +The function is analog to #findChessboardCorners but uses a localized radon +transformation approximated by box filters being more robust to all sort of +noise, faster on larger images and is able to directly return the sub-pixel +position of the internal chessboard corners. The Method is based on the paper +@cite duda2018 "Accurate Detection and Localization of Checkerboard Corners for +Calibration" demonstrating that the returned sub-pixel positions are more +accurate than the one returned by cornerSubPix allowing a precise camera +calibration for demanding applications. + +In the case, the flags @ref CALIB_CB_LARGER or @ref CALIB_CB_MARKER are given, +the result can be recovered from the optional meta array. Both flags are +helpful to use calibration patterns exceeding the field of view of the camera. +These oversized patterns allow more accurate calibrations as corners can be +utilized, which are as close as possible to the image borders. For a +consistent coordinate system across all images, the optional marker (see image +below) can be used to move the origin of the board to the location where the +black circle is located. + +@note The function requires a white boarder with roughly the same width as one +of the checkerboard fields around the whole board to improve the detection in +various environments. In addition, because of the localized radon +transformation it is beneficial to use round corners for the field corners +which are located on the outside of the board. The following figure illustrates +a sample checkerboard optimized for the detection. However, any other checkerboard +can be used as well. + +Use gen_pattern.py (@ref tutorial_camera_calibration_pattern) to create checkerboard. +![Checkerboard](pics/checkerboard_radon.png) + */ +CV_EXPORTS_AS(findChessboardCornersSBWithMeta) +bool findChessboardCornersSB(InputArray image,Size patternSize, OutputArray corners, + int flags,OutputArray meta); +/** @overload */ +CV_EXPORTS_W inline +bool findChessboardCornersSB(InputArray image, Size patternSize, OutputArray corners, + int flags = 0) +{ + return findChessboardCornersSB(image, patternSize, corners, flags, noArray()); +} + +/** @brief Estimates the sharpness of a detected chessboard. + +Image sharpness, as well as brightness, are a critical parameter for accuracte +camera calibration. For accessing these parameters for filtering out +problematic calibraiton images, this method calculates edge profiles by traveling from +black to white chessboard cell centers. Based on this, the number of pixels is +calculated required to transit from black to white. This width of the +transition area is a good indication of how sharp the chessboard is imaged +and should be below ~3.0 pixels. + +@param image Gray image used to find chessboard corners +@param patternSize Size of a found chessboard pattern +@param corners Corners found by #findChessboardCornersSB +@param rise_distance Rise distance 0.8 means 10% ... 90% of the final signal strength +@param vertical By default edge responses for horizontal lines are calculated +@param sharpness Optional output array with a sharpness value for calculated edge responses (see description) + +The optional sharpness array is of type CV_32FC1 and has for each calculated +profile one row with the following five entries: +* 0 = x coordinate of the underlying edge in the image +* 1 = y coordinate of the underlying edge in the image +* 2 = width of the transition area (sharpness) +* 3 = signal strength in the black cell (min brightness) +* 4 = signal strength in the white cell (max brightness) + +@return Scalar(average sharpness, average min brightness, average max brightness,0) +*/ +CV_EXPORTS_W Scalar estimateChessboardSharpness(InputArray image, Size patternSize, InputArray corners, + float rise_distance=0.8F,bool vertical=false, + OutputArray sharpness=noArray()); + + +//! finds subpixel-accurate positions of the chessboard corners +CV_EXPORTS_W bool find4QuadCornerSubpix( InputArray img, InputOutputArray corners, Size region_size ); + +/** @brief Renders the detected chessboard corners. + +@param image Destination image. It must be an 8-bit color image. +@param patternSize Number of inner corners per a chessboard row and column +(patternSize = cv::Size(points_per_row,points_per_column)). +@param corners Array of detected corners, the output of #findChessboardCorners. +@param patternWasFound Parameter indicating whether the complete board was found or not. The +return value of #findChessboardCorners should be passed here. + +The function draws individual chessboard corners detected either as red circles if the board was not +found, or as colored corners connected with lines if the board was found. + */ +CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSize, + InputArray corners, bool patternWasFound ); + +/** @brief Draw axes of the world/object coordinate system from pose estimation. @sa solvePnP + +@param image Input/output image. It must have 1 or 3 channels. The number of channels is not altered. +@param cameraMatrix Input 3x3 floating-point matrix of camera intrinsic parameters. +\f$\cameramatrix{A}\f$ +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is empty, the zero distortion coefficients are assumed. +@param rvec Rotation vector (see @ref Rodrigues ) that, together with tvec, brings points from +the model coordinate system to the camera coordinate system. +@param tvec Translation vector. +@param length Length of the painted axes in the same unit than tvec (usually in meters). +@param thickness Line thickness of the painted axes. + +This function draws the axes of the world/object coordinate system w.r.t. to the camera frame. +OX is drawn in red, OY in green and OZ in blue. + */ +CV_EXPORTS_W void drawFrameAxes(InputOutputArray image, InputArray cameraMatrix, InputArray distCoeffs, + InputArray rvec, InputArray tvec, float length, int thickness=3); + +struct CV_EXPORTS_W_SIMPLE CirclesGridFinderParameters +{ + CV_WRAP CirclesGridFinderParameters(); + CV_PROP_RW cv::Size2f densityNeighborhoodSize; + CV_PROP_RW float minDensity; + CV_PROP_RW int kmeansAttempts; + CV_PROP_RW int minDistanceToAddKeypoint; + CV_PROP_RW int keypointScale; + CV_PROP_RW float minGraphConfidence; + CV_PROP_RW float vertexGain; + CV_PROP_RW float vertexPenalty; + CV_PROP_RW float existingVertexGain; + CV_PROP_RW float edgeGain; + CV_PROP_RW float edgePenalty; + CV_PROP_RW float convexHullFactor; + CV_PROP_RW float minRNGEdgeSwitchDist; + + enum GridType + { + SYMMETRIC_GRID, ASYMMETRIC_GRID + }; + GridType gridType; + + CV_PROP_RW float squareSize; //!< Distance between two adjacent points. Used by CALIB_CB_CLUSTERING. + CV_PROP_RW float maxRectifiedDistance; //!< Max deviation from prediction. Used by CALIB_CB_CLUSTERING. +}; + +#ifndef DISABLE_OPENCV_3_COMPATIBILITY +typedef CirclesGridFinderParameters CirclesGridFinderParameters2; +#endif + +/** @brief Finds centers in the grid of circles. + +@param image grid view of input circles; it must be an 8-bit grayscale or color image. +@param patternSize number of circles per row and column +( patternSize = Size(points_per_row, points_per_colum) ). +@param centers output array of detected centers. +@param flags various operation flags that can be one of the following values: +- @ref CALIB_CB_SYMMETRIC_GRID uses symmetric pattern of circles. +- @ref CALIB_CB_ASYMMETRIC_GRID uses asymmetric pattern of circles. +- @ref CALIB_CB_CLUSTERING uses a special algorithm for grid detection. It is more robust to +perspective distortions but much more sensitive to background clutter. +@param blobDetector feature detector that finds blobs like dark circles on light background. + If `blobDetector` is NULL then `image` represents Point2f array of candidates. +@param parameters struct for finding circles in a grid pattern. + +The function attempts to determine whether the input image contains a grid of circles. If it is, the +function locates centers of the circles. The function returns a non-zero value if all of the centers +have been found and they have been placed in a certain order (row by row, left to right in every +row). Otherwise, if the function fails to find all the corners or reorder them, it returns 0. + +Sample usage of detecting and drawing the centers of circles: : +@code + Size patternsize(7,7); //number of centers + Mat gray = ...; //source image + vector centers; //this will be filled by the detected centers + + bool patternfound = findCirclesGrid(gray, patternsize, centers); + + drawChessboardCorners(img, patternsize, Mat(centers), patternfound); +@endcode +@note The function requires white space (like a square-thick border, the wider the better) around +the board to make the detection more robust in various environments. + */ +CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize, + OutputArray centers, int flags, + const Ptr &blobDetector, + const CirclesGridFinderParameters& parameters); + +/** @overload */ +CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize, + OutputArray centers, int flags = CALIB_CB_SYMMETRIC_GRID, + const Ptr &blobDetector = SimpleBlobDetector::create()); + +/** @brief Finds the camera intrinsic and extrinsic parameters from several views of a calibration +pattern. + +@param objectPoints In the new interface it is a vector of vectors of calibration pattern points in +the calibration pattern coordinate space (e.g. std::vector>). The outer +vector contains as many elements as the number of pattern views. If the same calibration pattern +is shown in each view and it is fully visible, all the vectors will be the same. Although, it is +possible to use partially occluded patterns or even different patterns in different views. Then, +the vectors will be different. Although the points are 3D, they all lie in the calibration pattern's +XY coordinate plane (thus 0 in the Z-coordinate), if the used calibration pattern is a planar rig. +In the old interface all the vectors of object points from different views are concatenated +together. +@param imagePoints In the new interface it is a vector of vectors of the projections of calibration +pattern points (e.g. std::vector>). imagePoints.size() and +objectPoints.size(), and imagePoints[i].size() and objectPoints[i].size() for each i, must be equal, +respectively. In the old interface all the vectors of object points from different views are +concatenated together. +@param imageSize Size of the image used only to initialize the camera intrinsic matrix. +@param cameraMatrix Input/output 3x3 floating-point camera intrinsic matrix +\f$\cameramatrix{A}\f$ . If @ref CALIB_USE_INTRINSIC_GUESS +and/or @ref CALIB_FIX_ASPECT_RATIO, @ref CALIB_FIX_PRINCIPAL_POINT or @ref CALIB_FIX_FOCAL_LENGTH +are specified, some or all of fx, fy, cx, cy must be initialized before calling the function. +@param distCoeffs Input/output vector of distortion coefficients +\f$\distcoeffs\f$. +@param rvecs Output vector of rotation vectors (@ref Rodrigues ) estimated for each pattern view +(e.g. std::vector>). That is, each i-th rotation vector together with the corresponding +i-th translation vector (see the next output parameter description) brings the calibration pattern +from the object coordinate space (in which object points are specified) to the camera coordinate +space. In more technical terms, the tuple of the i-th rotation and translation vector performs +a change of basis from object coordinate space to camera coordinate space. Due to its duality, this +tuple is equivalent to the position of the calibration pattern with respect to the camera coordinate +space. +@param tvecs Output vector of translation vectors estimated for each pattern view, see parameter +describtion above. +@param stdDeviationsIntrinsics Output vector of standard deviations estimated for intrinsic +parameters. Order of deviations values: +\f$(f_x, f_y, c_x, c_y, k_1, k_2, p_1, p_2, k_3, k_4, k_5, k_6 , s_1, s_2, s_3, + s_4, \tau_x, \tau_y)\f$ If one of parameters is not estimated, it's deviation is equals to zero. +@param stdDeviationsExtrinsics Output vector of standard deviations estimated for extrinsic +parameters. Order of deviations values: \f$(R_0, T_0, \dotsc , R_{M - 1}, T_{M - 1})\f$ where M is +the number of pattern views. \f$R_i, T_i\f$ are concatenated 1x3 vectors. + @param perViewErrors Output vector of the RMS re-projection error estimated for each pattern view. +@param flags Different flags that may be zero or a combination of the following values: +- @ref CALIB_USE_INTRINSIC_GUESS cameraMatrix contains valid initial values of +fx, fy, cx, cy that are optimized further. Otherwise, (cx, cy) is initially set to the image +center ( imageSize is used), and focal distances are computed in a least-squares fashion. +Note, that if intrinsic parameters are known, there is no need to use this function just to +estimate extrinsic parameters. Use @ref solvePnP instead. +- @ref CALIB_FIX_PRINCIPAL_POINT The principal point is not changed during the global +optimization. It stays at the center or at a different location specified when + @ref CALIB_USE_INTRINSIC_GUESS is set too. +- @ref CALIB_FIX_ASPECT_RATIO The functions consider only fy as a free parameter. The +ratio fx/fy stays the same as in the input cameraMatrix . When + @ref CALIB_USE_INTRINSIC_GUESS is not set, the actual input values of fx and fy are +ignored, only their ratio is computed and used further. +- @ref CALIB_ZERO_TANGENT_DIST Tangential distortion coefficients \f$(p_1, p_2)\f$ are set +to zeros and stay zero. +- @ref CALIB_FIX_FOCAL_LENGTH The focal length is not changed during the global optimization if + @ref CALIB_USE_INTRINSIC_GUESS is set. +- @ref CALIB_FIX_K1,..., @ref CALIB_FIX_K6 The corresponding radial distortion +coefficient is not changed during the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is +set, the coefficient from the supplied distCoeffs matrix is used. Otherwise, it is set to 0. +- @ref CALIB_RATIONAL_MODEL Coefficients k4, k5, and k6 are enabled. To provide the +backward compatibility, this extra flag should be explicitly specified to make the +calibration function use the rational model and return 8 coefficients or more. +- @ref CALIB_THIN_PRISM_MODEL Coefficients s1, s2, s3 and s4 are enabled. To provide the +backward compatibility, this extra flag should be explicitly specified to make the +calibration function use the thin prism model and return 12 coefficients or more. +- @ref CALIB_FIX_S1_S2_S3_S4 The thin prism distortion coefficients are not changed during +the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is set, the coefficient from the +supplied distCoeffs matrix is used. Otherwise, it is set to 0. +- @ref CALIB_TILTED_MODEL Coefficients tauX and tauY are enabled. To provide the +backward compatibility, this extra flag should be explicitly specified to make the +calibration function use the tilted sensor model and return 14 coefficients. +- @ref CALIB_FIX_TAUX_TAUY The coefficients of the tilted sensor model are not changed during +the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is set, the coefficient from the +supplied distCoeffs matrix is used. Otherwise, it is set to 0. +@param criteria Termination criteria for the iterative optimization algorithm. + +@return the overall RMS re-projection error. + +The function estimates the intrinsic camera parameters and extrinsic parameters for each of the +views. The algorithm is based on @cite Zhang2000 and @cite BouguetMCT . The coordinates of 3D object +points and their corresponding 2D projections in each view must be specified. That may be achieved +by using an object with known geometry and easily detectable feature points. Such an object is +called a calibration rig or calibration pattern, and OpenCV has built-in support for a chessboard as +a calibration rig (see @ref findChessboardCorners). Currently, initialization of intrinsic +parameters (when @ref CALIB_USE_INTRINSIC_GUESS is not set) is only implemented for planar calibration +patterns (where Z-coordinates of the object points must be all zeros). 3D calibration rigs can also +be used as long as initial cameraMatrix is provided. + +The algorithm performs the following steps: + +- Compute the initial intrinsic parameters (the option only available for planar calibration + patterns) or read them from the input parameters. The distortion coefficients are all set to + zeros initially unless some of CALIB_FIX_K? are specified. + +- Estimate the initial camera pose as if the intrinsic parameters have been already known. This is + done using @ref solvePnP . + +- Run the global Levenberg-Marquardt optimization algorithm to minimize the reprojection error, + that is, the total sum of squared distances between the observed feature points imagePoints and + the projected (using the current estimates for camera parameters and the poses) object points + objectPoints. See @ref projectPoints for details. + +@note + If you use a non-square (i.e. non-N-by-N) grid and @ref findChessboardCorners for calibration, + and @ref calibrateCamera returns bad values (zero distortion coefficients, \f$c_x\f$ and + \f$c_y\f$ very far from the image center, and/or large differences between \f$f_x\f$ and + \f$f_y\f$ (ratios of 10:1 or more)), then you are probably using patternSize=cvSize(rows,cols) + instead of using patternSize=cvSize(cols,rows) in @ref findChessboardCorners. + +@sa + calibrateCameraRO, findChessboardCorners, solvePnP, initCameraMatrix2D, stereoCalibrate, + undistort + */ +CV_EXPORTS_AS(calibrateCameraExtended) double calibrateCamera( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints, Size imageSize, + InputOutputArray cameraMatrix, InputOutputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + OutputArray stdDeviationsIntrinsics, + OutputArray stdDeviationsExtrinsics, + OutputArray perViewErrors, + int flags = 0, TermCriteria criteria = TermCriteria( + TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) ); + +/** @overload */ +CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints, Size imageSize, + InputOutputArray cameraMatrix, InputOutputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + int flags = 0, TermCriteria criteria = TermCriteria( + TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) ); + +/** @brief Finds the camera intrinsic and extrinsic parameters from several views of a calibration pattern. + +This function is an extension of #calibrateCamera with the method of releasing object which was +proposed in @cite strobl2011iccv. In many common cases with inaccurate, unmeasured, roughly planar +targets (calibration plates), this method can dramatically improve the precision of the estimated +camera parameters. Both the object-releasing method and standard method are supported by this +function. Use the parameter **iFixedPoint** for method selection. In the internal implementation, +#calibrateCamera is a wrapper for this function. + +@param objectPoints Vector of vectors of calibration pattern points in the calibration pattern +coordinate space. See #calibrateCamera for details. If the method of releasing object to be used, +the identical calibration board must be used in each view and it must be fully visible, and all +objectPoints[i] must be the same and all points should be roughly close to a plane. **The calibration +target has to be rigid, or at least static if the camera (rather than the calibration target) is +shifted for grabbing images.** +@param imagePoints Vector of vectors of the projections of calibration pattern points. See +#calibrateCamera for details. +@param imageSize Size of the image used only to initialize the intrinsic camera matrix. +@param iFixedPoint The index of the 3D object point in objectPoints[0] to be fixed. It also acts as +a switch for calibration method selection. If object-releasing method to be used, pass in the +parameter in the range of [1, objectPoints[0].size()-2], otherwise a value out of this range will +make standard calibration method selected. Usually the top-right corner point of the calibration +board grid is recommended to be fixed when object-releasing method being utilized. According to +\cite strobl2011iccv, two other points are also fixed. In this implementation, objectPoints[0].front +and objectPoints[0].back.z are used. With object-releasing method, accurate rvecs, tvecs and +newObjPoints are only possible if coordinates of these three fixed points are accurate enough. +@param cameraMatrix Output 3x3 floating-point camera matrix. See #calibrateCamera for details. +@param distCoeffs Output vector of distortion coefficients. See #calibrateCamera for details. +@param rvecs Output vector of rotation vectors estimated for each pattern view. See #calibrateCamera +for details. +@param tvecs Output vector of translation vectors estimated for each pattern view. +@param newObjPoints The updated output vector of calibration pattern points. The coordinates might +be scaled based on three fixed points. The returned coordinates are accurate only if the above +mentioned three fixed points are accurate. If not needed, noArray() can be passed in. This parameter +is ignored with standard calibration method. +@param stdDeviationsIntrinsics Output vector of standard deviations estimated for intrinsic parameters. +See #calibrateCamera for details. +@param stdDeviationsExtrinsics Output vector of standard deviations estimated for extrinsic parameters. +See #calibrateCamera for details. +@param stdDeviationsObjPoints Output vector of standard deviations estimated for refined coordinates +of calibration pattern points. It has the same size and order as objectPoints[0] vector. This +parameter is ignored with standard calibration method. + @param perViewErrors Output vector of the RMS re-projection error estimated for each pattern view. +@param flags Different flags that may be zero or a combination of some predefined values. See +#calibrateCamera for details. If the method of releasing object is used, the calibration time may +be much longer. CALIB_USE_QR or CALIB_USE_LU could be used for faster calibration with potentially +less precise and less stable in some rare cases. +@param criteria Termination criteria for the iterative optimization algorithm. + +@return the overall RMS re-projection error. + +The function estimates the intrinsic camera parameters and extrinsic parameters for each of the +views. The algorithm is based on @cite Zhang2000, @cite BouguetMCT and @cite strobl2011iccv. See +#calibrateCamera for other detailed explanations. +@sa + calibrateCamera, findChessboardCorners, solvePnP, initCameraMatrix2D, stereoCalibrate, undistort + */ +CV_EXPORTS_AS(calibrateCameraROExtended) double calibrateCameraRO( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints, Size imageSize, int iFixedPoint, + InputOutputArray cameraMatrix, InputOutputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + OutputArray newObjPoints, + OutputArray stdDeviationsIntrinsics, + OutputArray stdDeviationsExtrinsics, + OutputArray stdDeviationsObjPoints, + OutputArray perViewErrors, + int flags = 0, TermCriteria criteria = TermCriteria( + TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) ); + +/** @overload */ +CV_EXPORTS_W double calibrateCameraRO( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints, Size imageSize, int iFixedPoint, + InputOutputArray cameraMatrix, InputOutputArray distCoeffs, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, + OutputArray newObjPoints, + int flags = 0, TermCriteria criteria = TermCriteria( + TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) ); + +/** @brief Computes useful camera characteristics from the camera intrinsic matrix. + +@param cameraMatrix Input camera intrinsic matrix that can be estimated by #calibrateCamera or +#stereoCalibrate . +@param imageSize Input image size in pixels. +@param apertureWidth Physical width in mm of the sensor. +@param apertureHeight Physical height in mm of the sensor. +@param fovx Output field of view in degrees along the horizontal sensor axis. +@param fovy Output field of view in degrees along the vertical sensor axis. +@param focalLength Focal length of the lens in mm. +@param principalPoint Principal point in mm. +@param aspectRatio \f$f_y/f_x\f$ + +The function computes various useful camera characteristics from the previously estimated camera +matrix. + +@note + Do keep in mind that the unity measure 'mm' stands for whatever unit of measure one chooses for + the chessboard pitch (it can thus be any value). + */ +CV_EXPORTS_W void calibrationMatrixValues( InputArray cameraMatrix, Size imageSize, + double apertureWidth, double apertureHeight, + CV_OUT double& fovx, CV_OUT double& fovy, + CV_OUT double& focalLength, CV_OUT Point2d& principalPoint, + CV_OUT double& aspectRatio ); + +/** @brief Calibrates a stereo camera set up. This function finds the intrinsic parameters +for each of the two cameras and the extrinsic parameters between the two cameras. + +@param objectPoints Vector of vectors of the calibration pattern points. The same structure as +in @ref calibrateCamera. For each pattern view, both cameras need to see the same object +points. Therefore, objectPoints.size(), imagePoints1.size(), and imagePoints2.size() need to be +equal as well as objectPoints[i].size(), imagePoints1[i].size(), and imagePoints2[i].size() need to +be equal for each i. +@param imagePoints1 Vector of vectors of the projections of the calibration pattern points, +observed by the first camera. The same structure as in @ref calibrateCamera. +@param imagePoints2 Vector of vectors of the projections of the calibration pattern points, +observed by the second camera. The same structure as in @ref calibrateCamera. +@param cameraMatrix1 Input/output camera intrinsic matrix for the first camera, the same as in +@ref calibrateCamera. Furthermore, for the stereo case, additional flags may be used, see below. +@param distCoeffs1 Input/output vector of distortion coefficients, the same as in +@ref calibrateCamera. +@param cameraMatrix2 Input/output second camera intrinsic matrix for the second camera. See description for +cameraMatrix1. +@param distCoeffs2 Input/output lens distortion coefficients for the second camera. See +description for distCoeffs1. +@param imageSize Size of the image used only to initialize the camera intrinsic matrices. +@param R Output rotation matrix. Together with the translation vector T, this matrix brings +points given in the first camera's coordinate system to points in the second camera's +coordinate system. In more technical terms, the tuple of R and T performs a change of basis +from the first camera's coordinate system to the second camera's coordinate system. Due to its +duality, this tuple is equivalent to the position of the first camera with respect to the +second camera coordinate system. +@param T Output translation vector, see description above. +@param E Output essential matrix. +@param F Output fundamental matrix. +@param rvecs Output vector of rotation vectors ( @ref Rodrigues ) estimated for each pattern view in the +coordinate system of the first camera of the stereo pair (e.g. std::vector). More in detail, each +i-th rotation vector together with the corresponding i-th translation vector (see the next output parameter +description) brings the calibration pattern from the object coordinate space (in which object points are +specified) to the camera coordinate space of the first camera of the stereo pair. In more technical terms, +the tuple of the i-th rotation and translation vector performs a change of basis from object coordinate space +to camera coordinate space of the first camera of the stereo pair. +@param tvecs Output vector of translation vectors estimated for each pattern view, see parameter description +of previous output parameter ( rvecs ). +@param perViewErrors Output vector of the RMS re-projection error estimated for each pattern view. +@param flags Different flags that may be zero or a combination of the following values: +- @ref CALIB_FIX_INTRINSIC Fix cameraMatrix? and distCoeffs? so that only R, T, E, and F +matrices are estimated. +- @ref CALIB_USE_INTRINSIC_GUESS Optimize some or all of the intrinsic parameters +according to the specified flags. Initial values are provided by the user. +- @ref CALIB_USE_EXTRINSIC_GUESS R and T contain valid initial values that are optimized further. +Otherwise R and T are initialized to the median value of the pattern views (each dimension separately). +- @ref CALIB_FIX_PRINCIPAL_POINT Fix the principal points during the optimization. +- @ref CALIB_FIX_FOCAL_LENGTH Fix \f$f^{(j)}_x\f$ and \f$f^{(j)}_y\f$ . +- @ref CALIB_FIX_ASPECT_RATIO Optimize \f$f^{(j)}_y\f$ . Fix the ratio \f$f^{(j)}_x/f^{(j)}_y\f$ +. +- @ref CALIB_SAME_FOCAL_LENGTH Enforce \f$f^{(0)}_x=f^{(1)}_x\f$ and \f$f^{(0)}_y=f^{(1)}_y\f$ . +- @ref CALIB_ZERO_TANGENT_DIST Set tangential distortion coefficients for each camera to +zeros and fix there. +- @ref CALIB_FIX_K1,..., @ref CALIB_FIX_K6 Do not change the corresponding radial +distortion coefficient during the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is set, +the coefficient from the supplied distCoeffs matrix is used. Otherwise, it is set to 0. +- @ref CALIB_RATIONAL_MODEL Enable coefficients k4, k5, and k6. To provide the backward +compatibility, this extra flag should be explicitly specified to make the calibration +function use the rational model and return 8 coefficients. If the flag is not set, the +function computes and returns only 5 distortion coefficients. +- @ref CALIB_THIN_PRISM_MODEL Coefficients s1, s2, s3 and s4 are enabled. To provide the +backward compatibility, this extra flag should be explicitly specified to make the +calibration function use the thin prism model and return 12 coefficients. If the flag is not +set, the function computes and returns only 5 distortion coefficients. +- @ref CALIB_FIX_S1_S2_S3_S4 The thin prism distortion coefficients are not changed during +the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is set, the coefficient from the +supplied distCoeffs matrix is used. Otherwise, it is set to 0. +- @ref CALIB_TILTED_MODEL Coefficients tauX and tauY are enabled. To provide the +backward compatibility, this extra flag should be explicitly specified to make the +calibration function use the tilted sensor model and return 14 coefficients. If the flag is not +set, the function computes and returns only 5 distortion coefficients. +- @ref CALIB_FIX_TAUX_TAUY The coefficients of the tilted sensor model are not changed during +the optimization. If @ref CALIB_USE_INTRINSIC_GUESS is set, the coefficient from the +supplied distCoeffs matrix is used. Otherwise, it is set to 0. +@param criteria Termination criteria for the iterative optimization algorithm. + +The function estimates the transformation between two cameras making a stereo pair. If one computes +the poses of an object relative to the first camera and to the second camera, +( \f$R_1\f$,\f$T_1\f$ ) and (\f$R_2\f$,\f$T_2\f$), respectively, for a stereo camera where the +relative position and orientation between the two cameras are fixed, then those poses definitely +relate to each other. This means, if the relative position and orientation (\f$R\f$,\f$T\f$) of the +two cameras is known, it is possible to compute (\f$R_2\f$,\f$T_2\f$) when (\f$R_1\f$,\f$T_1\f$) is +given. This is what the described function does. It computes (\f$R\f$,\f$T\f$) such that: + +\f[R_2=R R_1\f] +\f[T_2=R T_1 + T.\f] + +Therefore, one can compute the coordinate representation of a 3D point for the second camera's +coordinate system when given the point's coordinate representation in the first camera's coordinate +system: + +\f[\begin{bmatrix} +X_2 \\ +Y_2 \\ +Z_2 \\ +1 +\end{bmatrix} = \begin{bmatrix} +R & T \\ +0 & 1 +\end{bmatrix} \begin{bmatrix} +X_1 \\ +Y_1 \\ +Z_1 \\ +1 +\end{bmatrix}.\f] + + +Optionally, it computes the essential matrix E: + +\f[E= \vecthreethree{0}{-T_2}{T_1}{T_2}{0}{-T_0}{-T_1}{T_0}{0} R\f] + +where \f$T_i\f$ are components of the translation vector \f$T\f$ : \f$T=[T_0, T_1, T_2]^T\f$ . +And the function can also compute the fundamental matrix F: + +\f[F = cameraMatrix2^{-T}\cdot E \cdot cameraMatrix1^{-1}\f] + +Besides the stereo-related information, the function can also perform a full calibration of each of +the two cameras. However, due to the high dimensionality of the parameter space and noise in the +input data, the function can diverge from the correct solution. If the intrinsic parameters can be +estimated with high accuracy for each of the cameras individually (for example, using +#calibrateCamera ), you are recommended to do so and then pass @ref CALIB_FIX_INTRINSIC flag to the +function along with the computed intrinsic parameters. Otherwise, if all the parameters are +estimated at once, it makes sense to restrict some parameters, for example, pass + @ref CALIB_SAME_FOCAL_LENGTH and @ref CALIB_ZERO_TANGENT_DIST flags, which is usually a +reasonable assumption. + +Similarly to #calibrateCamera, the function minimizes the total re-projection error for all the +points in all the available views from both cameras. The function returns the final value of the +re-projection error. + */ +CV_EXPORTS_AS(stereoCalibrateExtended) double stereoCalibrate( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, + InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, + InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, + Size imageSize, InputOutputArray R, InputOutputArray T, OutputArray E, OutputArray F, + OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, OutputArray perViewErrors, int flags = CALIB_FIX_INTRINSIC, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6) ); + +/// @overload +CV_EXPORTS_W double stereoCalibrate( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, + InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, + InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, + Size imageSize, OutputArray R,OutputArray T, OutputArray E, OutputArray F, + int flags = CALIB_FIX_INTRINSIC, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6) ); + +/// @overload +CV_EXPORTS_W double stereoCalibrate( InputArrayOfArrays objectPoints, + InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, + InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, + InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, + Size imageSize, InputOutputArray R, InputOutputArray T, OutputArray E, OutputArray F, + OutputArray perViewErrors, int flags = CALIB_FIX_INTRINSIC, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6) ); + +/** @brief Computes rectification transforms for each head of a calibrated stereo camera. + +@param cameraMatrix1 First camera intrinsic matrix. +@param distCoeffs1 First camera distortion parameters. +@param cameraMatrix2 Second camera intrinsic matrix. +@param distCoeffs2 Second camera distortion parameters. +@param imageSize Size of the image used for stereo calibration. +@param R Rotation matrix from the coordinate system of the first camera to the second camera, +see @ref stereoCalibrate. +@param T Translation vector from the coordinate system of the first camera to the second camera, +see @ref stereoCalibrate. +@param R1 Output 3x3 rectification transform (rotation matrix) for the first camera. This matrix +brings points given in the unrectified first camera's coordinate system to points in the rectified +first camera's coordinate system. In more technical terms, it performs a change of basis from the +unrectified first camera's coordinate system to the rectified first camera's coordinate system. +@param R2 Output 3x3 rectification transform (rotation matrix) for the second camera. This matrix +brings points given in the unrectified second camera's coordinate system to points in the rectified +second camera's coordinate system. In more technical terms, it performs a change of basis from the +unrectified second camera's coordinate system to the rectified second camera's coordinate system. +@param P1 Output 3x4 projection matrix in the new (rectified) coordinate systems for the first +camera, i.e. it projects points given in the rectified first camera coordinate system into the +rectified first camera's image. +@param P2 Output 3x4 projection matrix in the new (rectified) coordinate systems for the second +camera, i.e. it projects points given in the rectified first camera coordinate system into the +rectified second camera's image. +@param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see @ref reprojectImageTo3D). +@param flags Operation flags that may be zero or @ref CALIB_ZERO_DISPARITY . If the flag is set, +the function makes the principal points of each camera have the same pixel coordinates in the +rectified views. And if the flag is not set, the function may still shift the images in the +horizontal or vertical direction (depending on the orientation of epipolar lines) to maximize the +useful image area. +@param alpha Free scaling parameter. If it is -1 or absent, the function performs the default +scaling. Otherwise, the parameter should be between 0 and 1. alpha=0 means that the rectified +images are zoomed and shifted so that only valid pixels are visible (no black areas after +rectification). alpha=1 means that the rectified image is decimated and shifted so that all the +pixels from the original images from the cameras are retained in the rectified images (no source +image pixels are lost). Any intermediate value yields an intermediate result between +those two extreme cases. +@param newImageSize New image resolution after rectification. The same size should be passed to +#initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) +is passed (default), it is set to the original imageSize . Setting it to a larger value can help you +preserve details in the original image, especially when there is a big radial distortion. +@param validPixROI1 Optional output rectangles inside the rectified images where all the pixels +are valid. If alpha=0 , the ROIs cover the whole images. Otherwise, they are likely to be smaller +(see the picture below). +@param validPixROI2 Optional output rectangles inside the rectified images where all the pixels +are valid. If alpha=0 , the ROIs cover the whole images. Otherwise, they are likely to be smaller +(see the picture below). + +The function computes the rotation matrices for each camera that (virtually) make both camera image +planes the same plane. Consequently, this makes all the epipolar lines parallel and thus simplifies +the dense stereo correspondence problem. The function takes the matrices computed by #stereoCalibrate +as input. As output, it provides two rotation matrices and also two projection matrices in the new +coordinates. The function distinguishes the following two cases: + +- **Horizontal stereo**: the first and the second camera views are shifted relative to each other + mainly along the x-axis (with possible small vertical shift). In the rectified images, the + corresponding epipolar lines in the left and right cameras are horizontal and have the same + y-coordinate. P1 and P2 look like: + + \f[\texttt{P1} = \begin{bmatrix} + f & 0 & cx_1 & 0 \\ + 0 & f & cy & 0 \\ + 0 & 0 & 1 & 0 + \end{bmatrix}\f] + + \f[\texttt{P2} = \begin{bmatrix} + f & 0 & cx_2 & T_x \cdot f \\ + 0 & f & cy & 0 \\ + 0 & 0 & 1 & 0 + \end{bmatrix} ,\f] + + \f[\texttt{Q} = \begin{bmatrix} + 1 & 0 & 0 & -cx_1 \\ + 0 & 1 & 0 & -cy \\ + 0 & 0 & 0 & f \\ + 0 & 0 & -\frac{1}{T_x} & \frac{cx_1 - cx_2}{T_x} + \end{bmatrix} \f] + + where \f$T_x\f$ is a horizontal shift between the cameras and \f$cx_1=cx_2\f$ if + @ref CALIB_ZERO_DISPARITY is set. + +- **Vertical stereo**: the first and the second camera views are shifted relative to each other + mainly in the vertical direction (and probably a bit in the horizontal direction too). The epipolar + lines in the rectified images are vertical and have the same x-coordinate. P1 and P2 look like: + + \f[\texttt{P1} = \begin{bmatrix} + f & 0 & cx & 0 \\ + 0 & f & cy_1 & 0 \\ + 0 & 0 & 1 & 0 + \end{bmatrix}\f] + + \f[\texttt{P2} = \begin{bmatrix} + f & 0 & cx & 0 \\ + 0 & f & cy_2 & T_y \cdot f \\ + 0 & 0 & 1 & 0 + \end{bmatrix},\f] + + \f[\texttt{Q} = \begin{bmatrix} + 1 & 0 & 0 & -cx \\ + 0 & 1 & 0 & -cy_1 \\ + 0 & 0 & 0 & f \\ + 0 & 0 & -\frac{1}{T_y} & \frac{cy_1 - cy_2}{T_y} + \end{bmatrix} \f] + + where \f$T_y\f$ is a vertical shift between the cameras and \f$cy_1=cy_2\f$ if + @ref CALIB_ZERO_DISPARITY is set. + +As you can see, the first three columns of P1 and P2 will effectively be the new "rectified" camera +matrices. The matrices, together with R1 and R2 , can then be passed to #initUndistortRectifyMap to +initialize the rectification map for each camera. + +See below the screenshot from the stereo_calib.cpp sample. Some red horizontal lines pass through +the corresponding image regions. This means that the images are well rectified, which is what most +stereo correspondence algorithms rely on. The green rectangles are roi1 and roi2 . You see that +their interiors are all valid pixels. + +![image](pics/stereo_undistort.jpg) + */ +CV_EXPORTS_W void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs1, + InputArray cameraMatrix2, InputArray distCoeffs2, + Size imageSize, InputArray R, InputArray T, + OutputArray R1, OutputArray R2, + OutputArray P1, OutputArray P2, + OutputArray Q, int flags = CALIB_ZERO_DISPARITY, + double alpha = -1, Size newImageSize = Size(), + CV_OUT Rect* validPixROI1 = 0, CV_OUT Rect* validPixROI2 = 0 ); + +/** @brief Computes a rectification transform for an uncalibrated stereo camera. + +@param points1 Array of feature points in the first image. +@param points2 The corresponding points in the second image. The same formats as in +#findFundamentalMat are supported. +@param F Input fundamental matrix. It can be computed from the same set of point pairs using +#findFundamentalMat . +@param imgSize Size of the image. +@param H1 Output rectification homography matrix for the first image. +@param H2 Output rectification homography matrix for the second image. +@param threshold Optional threshold used to filter out the outliers. If the parameter is greater +than zero, all the point pairs that do not comply with the epipolar geometry (that is, the points +for which \f$|\texttt{points2[i]}^T \cdot \texttt{F} \cdot \texttt{points1[i]}|>\texttt{threshold}\f$ ) +are rejected prior to computing the homographies. Otherwise, all the points are considered inliers. + +The function computes the rectification transformations without knowing intrinsic parameters of the +cameras and their relative position in the space, which explains the suffix "uncalibrated". Another +related difference from #stereoRectify is that the function outputs not the rectification +transformations in the object (3D) space, but the planar perspective transformations encoded by the +homography matrices H1 and H2 . The function implements the algorithm @cite Hartley99 . + +@note + While the algorithm does not need to know the intrinsic parameters of the cameras, it heavily + depends on the epipolar geometry. Therefore, if the camera lenses have a significant distortion, + it would be better to correct it before computing the fundamental matrix and calling this + function. For example, distortion coefficients can be estimated for each head of stereo camera + separately by using #calibrateCamera . Then, the images can be corrected using #undistort , or + just the point coordinates can be corrected with #undistortPoints . + */ +CV_EXPORTS_W bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, + InputArray F, Size imgSize, + OutputArray H1, OutputArray H2, + double threshold = 5 ); + +//! computes the rectification transformations for 3-head camera, where all the heads are on the same line. +CV_EXPORTS_W float rectify3Collinear( InputArray cameraMatrix1, InputArray distCoeffs1, + InputArray cameraMatrix2, InputArray distCoeffs2, + InputArray cameraMatrix3, InputArray distCoeffs3, + InputArrayOfArrays imgpt1, InputArrayOfArrays imgpt3, + Size imageSize, InputArray R12, InputArray T12, + InputArray R13, InputArray T13, + OutputArray R1, OutputArray R2, OutputArray R3, + OutputArray P1, OutputArray P2, OutputArray P3, + OutputArray Q, double alpha, Size newImgSize, + CV_OUT Rect* roi1, CV_OUT Rect* roi2, int flags ); + +/** @brief Returns the new camera intrinsic matrix based on the free scaling parameter. + +@param cameraMatrix Input camera intrinsic matrix. +@param distCoeffs Input vector of distortion coefficients +\f$\distcoeffs\f$. If the vector is NULL/empty, the zero distortion coefficients are +assumed. +@param imageSize Original image size. +@param alpha Free scaling parameter between 0 (when all the pixels in the undistorted image are +valid) and 1 (when all the source image pixels are retained in the undistorted image). See +#stereoRectify for details. +@param newImgSize Image size after rectification. By default, it is set to imageSize . +@param validPixROI Optional output rectangle that outlines all-good-pixels region in the +undistorted image. See roi1, roi2 description in #stereoRectify . +@param centerPrincipalPoint Optional flag that indicates whether in the new camera intrinsic matrix the +principal point should be at the image center or not. By default, the principal point is chosen to +best fit a subset of the source image (determined by alpha) to the corrected image. +@return new_camera_matrix Output new camera intrinsic matrix. + +The function computes and returns the optimal new camera intrinsic matrix based on the free scaling parameter. +By varying this parameter, you may retrieve only sensible pixels alpha=0 , keep all the original +image pixels if there is valuable information in the corners alpha=1 , or get something in between. +When alpha\>0 , the undistorted result is likely to have some black pixels corresponding to +"virtual" pixels outside of the captured distorted image. The original camera intrinsic matrix, distortion +coefficients, the computed new camera intrinsic matrix, and newImageSize should be passed to +#initUndistortRectifyMap to produce the maps for #remap . + */ +CV_EXPORTS_W Mat getOptimalNewCameraMatrix( InputArray cameraMatrix, InputArray distCoeffs, + Size imageSize, double alpha, Size newImgSize = Size(), + CV_OUT Rect* validPixROI = 0, + bool centerPrincipalPoint = false); + +/** @brief Computes Hand-Eye calibration: \f$_{}^{g}\textrm{T}_c\f$ + +@param[in] R_gripper2base Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the gripper frame to the robot base frame (\f$_{}^{b}\textrm{T}_g\f$). +This is a vector (`vector`) that contains the rotation, `(3x3)` rotation matrices or `(3x1)` rotation vectors, +for all the transformations from gripper frame to robot base frame. +@param[in] t_gripper2base Translation part extracted from the homogeneous matrix that transforms a point +expressed in the gripper frame to the robot base frame (\f$_{}^{b}\textrm{T}_g\f$). +This is a vector (`vector`) that contains the `(3x1)` translation vectors for all the transformations +from gripper frame to robot base frame. +@param[in] R_target2cam Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the target frame to the camera frame (\f$_{}^{c}\textrm{T}_t\f$). +This is a vector (`vector`) that contains the rotation, `(3x3)` rotation matrices or `(3x1)` rotation vectors, +for all the transformations from calibration target frame to camera frame. +@param[in] t_target2cam Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the target frame to the camera frame (\f$_{}^{c}\textrm{T}_t\f$). +This is a vector (`vector`) that contains the `(3x1)` translation vectors for all the transformations +from calibration target frame to camera frame. +@param[out] R_cam2gripper Estimated `(3x3)` rotation part extracted from the homogeneous matrix that transforms a point +expressed in the camera frame to the gripper frame (\f$_{}^{g}\textrm{T}_c\f$). +@param[out] t_cam2gripper Estimated `(3x1)` translation part extracted from the homogeneous matrix that transforms a point +expressed in the camera frame to the gripper frame (\f$_{}^{g}\textrm{T}_c\f$). +@param[in] method One of the implemented Hand-Eye calibration method, see cv::HandEyeCalibrationMethod + +The function performs the Hand-Eye calibration using various methods. One approach consists in estimating the +rotation then the translation (separable solutions) and the following methods are implemented: + - R. Tsai, R. Lenz A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/EyeCalibration \cite Tsai89 + - F. Park, B. Martin Robot Sensor Calibration: Solving AX = XB on the Euclidean Group \cite Park94 + - R. Horaud, F. Dornaika Hand-Eye Calibration \cite Horaud95 + +Another approach consists in estimating simultaneously the rotation and the translation (simultaneous solutions), +with the following implemented methods: + - N. Andreff, R. Horaud, B. Espiau On-line Hand-Eye Calibration \cite Andreff99 + - K. Daniilidis Hand-Eye Calibration Using Dual Quaternions \cite Daniilidis98 + +The following picture describes the Hand-Eye calibration problem where the transformation between a camera ("eye") +mounted on a robot gripper ("hand") has to be estimated. This configuration is called eye-in-hand. + +The eye-to-hand configuration consists in a static camera observing a calibration pattern mounted on the robot +end-effector. The transformation from the camera to the robot base frame can then be estimated by inputting +the suitable transformations to the function, see below. + +![](pics/hand-eye_figure.png) + +The calibration procedure is the following: + - a static calibration pattern is used to estimate the transformation between the target frame + and the camera frame + - the robot gripper is moved in order to acquire several poses + - for each pose, the homogeneous transformation between the gripper frame and the robot base frame is recorded using for + instance the robot kinematics +\f[ + \begin{bmatrix} + X_b\\ + Y_b\\ + Z_b\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{b}\textrm{R}_g & _{}^{b}\textrm{t}_g \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_g\\ + Y_g\\ + Z_g\\ + 1 + \end{bmatrix} +\f] + - for each pose, the homogeneous transformation between the calibration target frame and the camera frame is recorded using + for instance a pose estimation method (PnP) from 2D-3D point correspondences +\f[ + \begin{bmatrix} + X_c\\ + Y_c\\ + Z_c\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{c}\textrm{R}_t & _{}^{c}\textrm{t}_t \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_t\\ + Y_t\\ + Z_t\\ + 1 + \end{bmatrix} +\f] + +The Hand-Eye calibration procedure returns the following homogeneous transformation +\f[ + \begin{bmatrix} + X_g\\ + Y_g\\ + Z_g\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{g}\textrm{R}_c & _{}^{g}\textrm{t}_c \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_c\\ + Y_c\\ + Z_c\\ + 1 + \end{bmatrix} +\f] + +This problem is also known as solving the \f$\mathbf{A}\mathbf{X}=\mathbf{X}\mathbf{B}\f$ equation: + - for an eye-in-hand configuration +\f[ + \begin{align*} + ^{b}{\textrm{T}_g}^{(1)} \hspace{0.2em} ^{g}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(1)} &= + \hspace{0.1em} ^{b}{\textrm{T}_g}^{(2)} \hspace{0.2em} ^{g}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(2)} \\ + + (^{b}{\textrm{T}_g}^{(2)})^{-1} \hspace{0.2em} ^{b}{\textrm{T}_g}^{(1)} \hspace{0.2em} ^{g}\textrm{T}_c &= + \hspace{0.1em} ^{g}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(2)} (^{c}{\textrm{T}_t}^{(1)})^{-1} \\ + + \textrm{A}_i \textrm{X} &= \textrm{X} \textrm{B}_i \\ + \end{align*} +\f] + + - for an eye-to-hand configuration +\f[ + \begin{align*} + ^{g}{\textrm{T}_b}^{(1)} \hspace{0.2em} ^{b}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(1)} &= + \hspace{0.1em} ^{g}{\textrm{T}_b}^{(2)} \hspace{0.2em} ^{b}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(2)} \\ + + (^{g}{\textrm{T}_b}^{(2)})^{-1} \hspace{0.2em} ^{g}{\textrm{T}_b}^{(1)} \hspace{0.2em} ^{b}\textrm{T}_c &= + \hspace{0.1em} ^{b}\textrm{T}_c \hspace{0.2em} ^{c}{\textrm{T}_t}^{(2)} (^{c}{\textrm{T}_t}^{(1)})^{-1} \\ + + \textrm{A}_i \textrm{X} &= \textrm{X} \textrm{B}_i \\ + \end{align*} +\f] + +\note +Additional information can be found on this [website](http://campar.in.tum.de/Chair/HandEyeCalibration). +\note +A minimum of 2 motions with non parallel rotation axes are necessary to determine the hand-eye transformation. +So at least 3 different poses are required, but it is strongly recommended to use many more poses. + + */ +CV_EXPORTS_W void calibrateHandEye( InputArrayOfArrays R_gripper2base, InputArrayOfArrays t_gripper2base, + InputArrayOfArrays R_target2cam, InputArrayOfArrays t_target2cam, + OutputArray R_cam2gripper, OutputArray t_cam2gripper, + HandEyeCalibrationMethod method=CALIB_HAND_EYE_TSAI ); + +/** @brief Computes Robot-World/Hand-Eye calibration: \f$_{}^{w}\textrm{T}_b\f$ and \f$_{}^{c}\textrm{T}_g\f$ + +@param[in] R_world2cam Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the world frame to the camera frame (\f$_{}^{c}\textrm{T}_w\f$). +This is a vector (`vector`) that contains the rotation, `(3x3)` rotation matrices or `(3x1)` rotation vectors, +for all the transformations from world frame to the camera frame. +@param[in] t_world2cam Translation part extracted from the homogeneous matrix that transforms a point +expressed in the world frame to the camera frame (\f$_{}^{c}\textrm{T}_w\f$). +This is a vector (`vector`) that contains the `(3x1)` translation vectors for all the transformations +from world frame to the camera frame. +@param[in] R_base2gripper Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the robot base frame to the gripper frame (\f$_{}^{g}\textrm{T}_b\f$). +This is a vector (`vector`) that contains the rotation, `(3x3)` rotation matrices or `(3x1)` rotation vectors, +for all the transformations from robot base frame to the gripper frame. +@param[in] t_base2gripper Rotation part extracted from the homogeneous matrix that transforms a point +expressed in the robot base frame to the gripper frame (\f$_{}^{g}\textrm{T}_b\f$). +This is a vector (`vector`) that contains the `(3x1)` translation vectors for all the transformations +from robot base frame to the gripper frame. +@param[out] R_base2world Estimated `(3x3)` rotation part extracted from the homogeneous matrix that transforms a point +expressed in the robot base frame to the world frame (\f$_{}^{w}\textrm{T}_b\f$). +@param[out] t_base2world Estimated `(3x1)` translation part extracted from the homogeneous matrix that transforms a point +expressed in the robot base frame to the world frame (\f$_{}^{w}\textrm{T}_b\f$). +@param[out] R_gripper2cam Estimated `(3x3)` rotation part extracted from the homogeneous matrix that transforms a point +expressed in the gripper frame to the camera frame (\f$_{}^{c}\textrm{T}_g\f$). +@param[out] t_gripper2cam Estimated `(3x1)` translation part extracted from the homogeneous matrix that transforms a point +expressed in the gripper frame to the camera frame (\f$_{}^{c}\textrm{T}_g\f$). +@param[in] method One of the implemented Robot-World/Hand-Eye calibration method, see cv::RobotWorldHandEyeCalibrationMethod + +The function performs the Robot-World/Hand-Eye calibration using various methods. One approach consists in estimating the +rotation then the translation (separable solutions): + - M. Shah, Solving the robot-world/hand-eye calibration problem using the kronecker product \cite Shah2013SolvingTR + +Another approach consists in estimating simultaneously the rotation and the translation (simultaneous solutions), +with the following implemented method: + - A. Li, L. Wang, and D. Wu, Simultaneous robot-world and hand-eye calibration using dual-quaternions and kronecker product \cite Li2010SimultaneousRA + +The following picture describes the Robot-World/Hand-Eye calibration problem where the transformations between a robot and a world frame +and between a robot gripper ("hand") and a camera ("eye") mounted at the robot end-effector have to be estimated. + +![](pics/robot-world_hand-eye_figure.png) + +The calibration procedure is the following: + - a static calibration pattern is used to estimate the transformation between the target frame + and the camera frame + - the robot gripper is moved in order to acquire several poses + - for each pose, the homogeneous transformation between the gripper frame and the robot base frame is recorded using for + instance the robot kinematics +\f[ + \begin{bmatrix} + X_g\\ + Y_g\\ + Z_g\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{g}\textrm{R}_b & _{}^{g}\textrm{t}_b \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_b\\ + Y_b\\ + Z_b\\ + 1 + \end{bmatrix} +\f] + - for each pose, the homogeneous transformation between the calibration target frame (the world frame) and the camera frame is recorded using + for instance a pose estimation method (PnP) from 2D-3D point correspondences +\f[ + \begin{bmatrix} + X_c\\ + Y_c\\ + Z_c\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{c}\textrm{R}_w & _{}^{c}\textrm{t}_w \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_w\\ + Y_w\\ + Z_w\\ + 1 + \end{bmatrix} +\f] + +The Robot-World/Hand-Eye calibration procedure returns the following homogeneous transformations +\f[ + \begin{bmatrix} + X_w\\ + Y_w\\ + Z_w\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{w}\textrm{R}_b & _{}^{w}\textrm{t}_b \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_b\\ + Y_b\\ + Z_b\\ + 1 + \end{bmatrix} +\f] +\f[ + \begin{bmatrix} + X_c\\ + Y_c\\ + Z_c\\ + 1 + \end{bmatrix} + = + \begin{bmatrix} + _{}^{c}\textrm{R}_g & _{}^{c}\textrm{t}_g \\ + 0_{1 \times 3} & 1 + \end{bmatrix} + \begin{bmatrix} + X_g\\ + Y_g\\ + Z_g\\ + 1 + \end{bmatrix} +\f] + +This problem is also known as solving the \f$\mathbf{A}\mathbf{X}=\mathbf{Z}\mathbf{B}\f$ equation, with: + - \f$\mathbf{A} \Leftrightarrow \hspace{0.1em} _{}^{c}\textrm{T}_w\f$ + - \f$\mathbf{X} \Leftrightarrow \hspace{0.1em} _{}^{w}\textrm{T}_b\f$ + - \f$\mathbf{Z} \Leftrightarrow \hspace{0.1em} _{}^{c}\textrm{T}_g\f$ + - \f$\mathbf{B} \Leftrightarrow \hspace{0.1em} _{}^{g}\textrm{T}_b\f$ + +\note +At least 3 measurements are required (input vectors size must be greater or equal to 3). + + */ +CV_EXPORTS_W void calibrateRobotWorldHandEye( InputArrayOfArrays R_world2cam, InputArrayOfArrays t_world2cam, + InputArrayOfArrays R_base2gripper, InputArrayOfArrays t_base2gripper, + OutputArray R_base2world, OutputArray t_base2world, + OutputArray R_gripper2cam, OutputArray t_gripper2cam, + RobotWorldHandEyeCalibrationMethod method=CALIB_ROBOT_WORLD_HAND_EYE_SHAH ); + +/** @brief Converts points from Euclidean to homogeneous space. + +@param src Input vector of N-dimensional points. +@param dst Output vector of N+1-dimensional points. + +The function converts points from Euclidean to homogeneous space by appending 1's to the tuple of +point coordinates. That is, each point (x1, x2, ..., xn) is converted to (x1, x2, ..., xn, 1). + */ +CV_EXPORTS_W void convertPointsToHomogeneous( InputArray src, OutputArray dst ); + +/** @brief Converts points from homogeneous to Euclidean space. + +@param src Input vector of N-dimensional points. +@param dst Output vector of N-1-dimensional points. + +The function converts points homogeneous to Euclidean space using perspective projection. That is, +each point (x1, x2, ... x(n-1), xn) is converted to (x1/xn, x2/xn, ..., x(n-1)/xn). When xn=0, the +output point coordinates will be (0,0,0,...). + */ +CV_EXPORTS_W void convertPointsFromHomogeneous( InputArray src, OutputArray dst ); + +/** @brief Converts points to/from homogeneous coordinates. + +@param src Input array or vector of 2D, 3D, or 4D points. +@param dst Output vector of 2D, 3D, or 4D points. + +The function converts 2D or 3D points from/to homogeneous coordinates by calling either +#convertPointsToHomogeneous or #convertPointsFromHomogeneous. + +@note The function is obsolete. Use one of the previous two functions instead. + */ +CV_EXPORTS void convertPointsHomogeneous( InputArray src, OutputArray dst ); + +/** @brief Calculates a fundamental matrix from the corresponding points in two images. + +@param points1 Array of N points from the first image. The point coordinates should be +floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param method Method for computing a fundamental matrix. +- @ref FM_7POINT for a 7-point algorithm. \f$N = 7\f$ +- @ref FM_8POINT for an 8-point algorithm. \f$N \ge 8\f$ +- @ref FM_RANSAC for the RANSAC algorithm. \f$N \ge 8\f$ +- @ref FM_LMEDS for the LMedS algorithm. \f$N \ge 8\f$ +@param ransacReprojThreshold Parameter used only for RANSAC. It is the maximum distance from a point to an epipolar +line in pixels, beyond which the point is considered an outlier and is not used for computing the +final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the +point localization, image resolution, and the image noise. +@param confidence Parameter used for the RANSAC and LMedS methods only. It specifies a desirable level +of confidence (probability) that the estimated matrix is correct. +@param[out] mask optional output mask +@param maxIters The maximum number of robust method iterations. + +The epipolar geometry is described by the following equation: + +\f[[p_2; 1]^T F [p_1; 1] = 0\f] + +where \f$F\f$ is a fundamental matrix, \f$p_1\f$ and \f$p_2\f$ are corresponding points in the first and the +second images, respectively. + +The function calculates the fundamental matrix using one of four methods listed above and returns +the found fundamental matrix. Normally just one matrix is found. But in case of the 7-point +algorithm, the function may return up to 3 solutions ( \f$9 \times 3\f$ matrix that stores all 3 +matrices sequentially). + +The calculated fundamental matrix may be passed further to #computeCorrespondEpilines that finds the +epipolar lines corresponding to the specified points. It can also be passed to +#stereoRectifyUncalibrated to compute the rectification transformation. : +@code + // Example. Estimation of fundamental matrix using the RANSAC algorithm + int point_count = 100; + vector points1(point_count); + vector points2(point_count); + + // initialize the points here ... + for( int i = 0; i < point_count; i++ ) + { + points1[i] = ...; + points2[i] = ...; + } + + Mat fundamental_matrix = + findFundamentalMat(points1, points2, FM_RANSAC, 3, 0.99); +@endcode + */ +CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, + int method, double ransacReprojThreshold, double confidence, + int maxIters, OutputArray mask = noArray() ); + +/** @overload */ +CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, + int method = FM_RANSAC, + double ransacReprojThreshold = 3., double confidence = 0.99, + OutputArray mask = noArray() ); + +/** @overload */ +CV_EXPORTS Mat findFundamentalMat( InputArray points1, InputArray points2, + OutputArray mask, int method = FM_RANSAC, + double ransacReprojThreshold = 3., double confidence = 0.99 ); + + +CV_EXPORTS_W Mat findFundamentalMat( InputArray points1, InputArray points2, + OutputArray mask, const UsacParams ¶ms); + +/** @brief Calculates an essential matrix from the corresponding points in two images. + +@param points1 Array of N (N \>= 5) 2D points from the first image. The point coordinates should +be floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param cameraMatrix Camera intrinsic matrix \f$\cameramatrix{A}\f$ . +Note that this function assumes that points1 and points2 are feature points from cameras with the +same camera intrinsic matrix. If this assumption does not hold for your use case, use +#undistortPoints with `P = cv::NoArray()` for both cameras to transform image points +to normalized image coordinates, which are valid for the identity camera intrinsic matrix. When +passing these coordinates, pass the identity matrix for this parameter. +@param method Method for computing an essential matrix. +- @ref RANSAC for the RANSAC algorithm. +- @ref LMEDS for the LMedS algorithm. +@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of +confidence (probability) that the estimated matrix is correct. +@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar +line in pixels, beyond which the point is considered an outlier and is not used for computing the +final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the +point localization, image resolution, and the image noise. +@param mask Output array of N elements, every element of which is set to 0 for outliers and to 1 +for the other points. The array is computed only in the RANSAC and LMedS methods. +@param maxIters The maximum number of robust method iterations. + +This function estimates essential matrix based on the five-point algorithm solver in @cite Nister03 . +@cite SteweniusCFS is also a related. The epipolar geometry is described by the following equation: + +\f[[p_2; 1]^T K^{-T} E K^{-1} [p_1; 1] = 0\f] + +where \f$E\f$ is an essential matrix, \f$p_1\f$ and \f$p_2\f$ are corresponding points in the first and the +second images, respectively. The result of this function may be passed further to +#decomposeEssentialMat or #recoverPose to recover the relative pose between cameras. + */ +CV_EXPORTS_W +Mat findEssentialMat( + InputArray points1, InputArray points2, + InputArray cameraMatrix, int method = RANSAC, + double prob = 0.999, double threshold = 1.0, + int maxIters = 1000, OutputArray mask = noArray() +); + +/** @overload */ +CV_EXPORTS +Mat findEssentialMat( + InputArray points1, InputArray points2, + InputArray cameraMatrix, int method, + double prob, double threshold, + OutputArray mask +); // TODO remove from OpenCV 5.0 + +/** @overload +@param points1 Array of N (N \>= 5) 2D points from the first image. The point coordinates should +be floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param focal focal length of the camera. Note that this function assumes that points1 and points2 +are feature points from cameras with same focal length and principal point. +@param pp principal point of the camera. +@param method Method for computing a fundamental matrix. +- @ref RANSAC for the RANSAC algorithm. +- @ref LMEDS for the LMedS algorithm. +@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar +line in pixels, beyond which the point is considered an outlier and is not used for computing the +final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the +point localization, image resolution, and the image noise. +@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of +confidence (probability) that the estimated matrix is correct. +@param mask Output array of N elements, every element of which is set to 0 for outliers and to 1 +for the other points. The array is computed only in the RANSAC and LMedS methods. +@param maxIters The maximum number of robust method iterations. + +This function differs from the one above that it computes camera intrinsic matrix from focal length and +principal point: + +\f[A = +\begin{bmatrix} +f & 0 & x_{pp} \\ +0 & f & y_{pp} \\ +0 & 0 & 1 +\end{bmatrix}\f] + */ +CV_EXPORTS_W +Mat findEssentialMat( + InputArray points1, InputArray points2, + double focal = 1.0, Point2d pp = Point2d(0, 0), + int method = RANSAC, double prob = 0.999, + double threshold = 1.0, int maxIters = 1000, + OutputArray mask = noArray() +); + +/** @overload */ +CV_EXPORTS +Mat findEssentialMat( + InputArray points1, InputArray points2, + double focal, Point2d pp, + int method, double prob, + double threshold, OutputArray mask +); // TODO remove from OpenCV 5.0 + +/** @brief Calculates an essential matrix from the corresponding points in two images from potentially two different cameras. + +@param points1 Array of N (N \>= 5) 2D points from the first image. The point coordinates should +be floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param cameraMatrix1 Camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +Note that this function assumes that points1 and points2 are feature points from cameras with the +same camera matrix. If this assumption does not hold for your use case, use +#undistortPoints with `P = cv::NoArray()` for both cameras to transform image points +to normalized image coordinates, which are valid for the identity camera matrix. When +passing these coordinates, pass the identity matrix for this parameter. +@param cameraMatrix2 Camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +Note that this function assumes that points1 and points2 are feature points from cameras with the +same camera matrix. If this assumption does not hold for your use case, use +#undistortPoints with `P = cv::NoArray()` for both cameras to transform image points +to normalized image coordinates, which are valid for the identity camera matrix. When +passing these coordinates, pass the identity matrix for this parameter. +@param distCoeffs1 Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param distCoeffs2 Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param method Method for computing an essential matrix. +- @ref RANSAC for the RANSAC algorithm. +- @ref LMEDS for the LMedS algorithm. +@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of +confidence (probability) that the estimated matrix is correct. +@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar +line in pixels, beyond which the point is considered an outlier and is not used for computing the +final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the +point localization, image resolution, and the image noise. +@param mask Output array of N elements, every element of which is set to 0 for outliers and to 1 +for the other points. The array is computed only in the RANSAC and LMedS methods. + +This function estimates essential matrix based on the five-point algorithm solver in @cite Nister03 . +@cite SteweniusCFS is also a related. The epipolar geometry is described by the following equation: + +\f[[p_2; 1]^T K^{-T} E K^{-1} [p_1; 1] = 0\f] + +where \f$E\f$ is an essential matrix, \f$p_1\f$ and \f$p_2\f$ are corresponding points in the first and the +second images, respectively. The result of this function may be passed further to +#decomposeEssentialMat or #recoverPose to recover the relative pose between cameras. + */ +CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, + InputArray cameraMatrix1, InputArray distCoeffs1, + InputArray cameraMatrix2, InputArray distCoeffs2, + int method = RANSAC, + double prob = 0.999, double threshold = 1.0, + OutputArray mask = noArray() ); + + +CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, + InputArray cameraMatrix1, InputArray cameraMatrix2, + InputArray dist_coeff1, InputArray dist_coeff2, OutputArray mask, + const UsacParams ¶ms); + +/** @brief Decompose an essential matrix to possible rotations and translation. + +@param E The input essential matrix. +@param R1 One possible rotation matrix. +@param R2 Another possible rotation matrix. +@param t One possible translation. + +This function decomposes the essential matrix E using svd decomposition @cite HartleyZ00. In +general, four possible poses exist for the decomposition of E. They are \f$[R_1, t]\f$, +\f$[R_1, -t]\f$, \f$[R_2, t]\f$, \f$[R_2, -t]\f$. + +If E gives the epipolar constraint \f$[p_2; 1]^T A^{-T} E A^{-1} [p_1; 1] = 0\f$ between the image +points \f$p_1\f$ in the first image and \f$p_2\f$ in second image, then any of the tuples +\f$[R_1, t]\f$, \f$[R_1, -t]\f$, \f$[R_2, t]\f$, \f$[R_2, -t]\f$ is a change of basis from the first +camera's coordinate system to the second camera's coordinate system. However, by decomposing E, one +can only get the direction of the translation. For this reason, the translation t is returned with +unit length. + */ +CV_EXPORTS_W void decomposeEssentialMat( InputArray E, OutputArray R1, OutputArray R2, OutputArray t ); + +/** @brief Recovers the relative camera rotation and the translation from corresponding points in two images from two different cameras, using cheirality check. Returns the number of +inliers that pass the check. + +@param points1 Array of N 2D points from the first image. The point coordinates should be +floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param cameraMatrix1 Input/output camera matrix for the first camera, the same as in +@ref calibrateCamera. Furthermore, for the stereo case, additional flags may be used, see below. +@param distCoeffs1 Input/output vector of distortion coefficients, the same as in +@ref calibrateCamera. +@param cameraMatrix2 Input/output camera matrix for the first camera, the same as in +@ref calibrateCamera. Furthermore, for the stereo case, additional flags may be used, see below. +@param distCoeffs2 Input/output vector of distortion coefficients, the same as in +@ref calibrateCamera. +@param E The output essential matrix. +@param R Output rotation matrix. Together with the translation vector, this matrix makes up a tuple +that performs a change of basis from the first camera's coordinate system to the second camera's +coordinate system. Note that, in general, t can not be used for this tuple, see the parameter +described below. +@param t Output translation vector. This vector is obtained by @ref decomposeEssentialMat and +therefore is only known up to scale, i.e. t is the direction of the translation vector and has unit +length. +@param method Method for computing an essential matrix. +- @ref RANSAC for the RANSAC algorithm. +- @ref LMEDS for the LMedS algorithm. +@param prob Parameter used for the RANSAC or LMedS methods only. It specifies a desirable level of +confidence (probability) that the estimated matrix is correct. +@param threshold Parameter used for RANSAC. It is the maximum distance from a point to an epipolar +line in pixels, beyond which the point is considered an outlier and is not used for computing the +final fundamental matrix. It can be set to something like 1-3, depending on the accuracy of the +point localization, image resolution, and the image noise. +@param mask Input/output mask for inliers in points1 and points2. If it is not empty, then it marks +inliers in points1 and points2 for then given essential matrix E. Only these inliers will be used to +recover pose. In the output mask only inliers which pass the cheirality check. + +This function decomposes an essential matrix using @ref decomposeEssentialMat and then verifies +possible pose hypotheses by doing cheirality check. The cheirality check means that the +triangulated 3D points should have positive depth. Some details can be found in @cite Nister03. + +This function can be used to process the output E and mask from @ref findEssentialMat. In this +scenario, points1 and points2 are the same input for findEssentialMat.: +@code + // Example. Estimation of fundamental matrix using the RANSAC algorithm + int point_count = 100; + vector points1(point_count); + vector points2(point_count); + + // initialize the points here ... + for( int i = 0; i < point_count; i++ ) + { + points1[i] = ...; + points2[i] = ...; + } + + // Input: camera calibration of both cameras, for example using intrinsic chessboard calibration. + Mat cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2; + + // Output: Essential matrix, relative rotation and relative translation. + Mat E, R, t, mask; + + recoverPose(points1, points2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, E, R, t, mask); +@endcode + */ +CV_EXPORTS_W int recoverPose( InputArray points1, InputArray points2, + InputArray cameraMatrix1, InputArray distCoeffs1, + InputArray cameraMatrix2, InputArray distCoeffs2, + OutputArray E, OutputArray R, OutputArray t, + int method = cv::RANSAC, double prob = 0.999, double threshold = 1.0, + InputOutputArray mask = noArray()); + +/** @brief Recovers the relative camera rotation and the translation from an estimated essential +matrix and the corresponding points in two images, using chirality check. Returns the number of +inliers that pass the check. + +@param E The input essential matrix. +@param points1 Array of N 2D points from the first image. The point coordinates should be +floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param cameraMatrix Camera intrinsic matrix \f$\cameramatrix{A}\f$ . +Note that this function assumes that points1 and points2 are feature points from cameras with the +same camera intrinsic matrix. +@param R Output rotation matrix. Together with the translation vector, this matrix makes up a tuple +that performs a change of basis from the first camera's coordinate system to the second camera's +coordinate system. Note that, in general, t can not be used for this tuple, see the parameter +described below. +@param t Output translation vector. This vector is obtained by @ref decomposeEssentialMat and +therefore is only known up to scale, i.e. t is the direction of the translation vector and has unit +length. +@param mask Input/output mask for inliers in points1 and points2. If it is not empty, then it marks +inliers in points1 and points2 for the given essential matrix E. Only these inliers will be used to +recover pose. In the output mask only inliers which pass the chirality check. + +This function decomposes an essential matrix using @ref decomposeEssentialMat and then verifies +possible pose hypotheses by doing chirality check. The chirality check means that the +triangulated 3D points should have positive depth. Some details can be found in @cite Nister03. + +This function can be used to process the output E and mask from @ref findEssentialMat. In this +scenario, points1 and points2 are the same input for #findEssentialMat : +@code + // Example. Estimation of fundamental matrix using the RANSAC algorithm + int point_count = 100; + vector points1(point_count); + vector points2(point_count); + + // initialize the points here ... + for( int i = 0; i < point_count; i++ ) + { + points1[i] = ...; + points2[i] = ...; + } + + // cametra matrix with both focal lengths = 1, and principal point = (0, 0) + Mat cameraMatrix = Mat::eye(3, 3, CV_64F); + + Mat E, R, t, mask; + + E = findEssentialMat(points1, points2, cameraMatrix, RANSAC, 0.999, 1.0, mask); + recoverPose(E, points1, points2, cameraMatrix, R, t, mask); +@endcode + */ +CV_EXPORTS_W int recoverPose( InputArray E, InputArray points1, InputArray points2, + InputArray cameraMatrix, OutputArray R, OutputArray t, + InputOutputArray mask = noArray() ); + +/** @overload +@param E The input essential matrix. +@param points1 Array of N 2D points from the first image. The point coordinates should be +floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1 . +@param R Output rotation matrix. Together with the translation vector, this matrix makes up a tuple +that performs a change of basis from the first camera's coordinate system to the second camera's +coordinate system. Note that, in general, t can not be used for this tuple, see the parameter +description below. +@param t Output translation vector. This vector is obtained by @ref decomposeEssentialMat and +therefore is only known up to scale, i.e. t is the direction of the translation vector and has unit +length. +@param focal Focal length of the camera. Note that this function assumes that points1 and points2 +are feature points from cameras with same focal length and principal point. +@param pp principal point of the camera. +@param mask Input/output mask for inliers in points1 and points2. If it is not empty, then it marks +inliers in points1 and points2 for the given essential matrix E. Only these inliers will be used to +recover pose. In the output mask only inliers which pass the chirality check. + +This function differs from the one above that it computes camera intrinsic matrix from focal length and +principal point: + +\f[A = +\begin{bmatrix} +f & 0 & x_{pp} \\ +0 & f & y_{pp} \\ +0 & 0 & 1 +\end{bmatrix}\f] + */ +CV_EXPORTS_W int recoverPose( InputArray E, InputArray points1, InputArray points2, + OutputArray R, OutputArray t, + double focal = 1.0, Point2d pp = Point2d(0, 0), + InputOutputArray mask = noArray() ); + +/** @overload +@param E The input essential matrix. +@param points1 Array of N 2D points from the first image. The point coordinates should be +floating-point (single or double precision). +@param points2 Array of the second image points of the same size and format as points1. +@param cameraMatrix Camera intrinsic matrix \f$\cameramatrix{A}\f$ . +Note that this function assumes that points1 and points2 are feature points from cameras with the +same camera intrinsic matrix. +@param R Output rotation matrix. Together with the translation vector, this matrix makes up a tuple +that performs a change of basis from the first camera's coordinate system to the second camera's +coordinate system. Note that, in general, t can not be used for this tuple, see the parameter +description below. +@param t Output translation vector. This vector is obtained by @ref decomposeEssentialMat and +therefore is only known up to scale, i.e. t is the direction of the translation vector and has unit +length. +@param distanceThresh threshold distance which is used to filter out far away points (i.e. infinite +points). +@param mask Input/output mask for inliers in points1 and points2. If it is not empty, then it marks +inliers in points1 and points2 for the given essential matrix E. Only these inliers will be used to +recover pose. In the output mask only inliers which pass the chirality check. +@param triangulatedPoints 3D points which were reconstructed by triangulation. + +This function differs from the one above that it outputs the triangulated 3D point that are used for +the chirality check. + */ +CV_EXPORTS_W int recoverPose( InputArray E, InputArray points1, InputArray points2, + InputArray cameraMatrix, OutputArray R, OutputArray t, double distanceThresh, InputOutputArray mask = noArray(), + OutputArray triangulatedPoints = noArray()); + +/** @brief For points in an image of a stereo pair, computes the corresponding epilines in the other image. + +@param points Input points. \f$N \times 1\f$ or \f$1 \times N\f$ matrix of type CV_32FC2 or +vector\ . +@param whichImage Index of the image (1 or 2) that contains the points . +@param F Fundamental matrix that can be estimated using #findFundamentalMat or #stereoRectify . +@param lines Output vector of the epipolar lines corresponding to the points in the other image. +Each line \f$ax + by + c=0\f$ is encoded by 3 numbers \f$(a, b, c)\f$ . + +For every point in one of the two images of a stereo pair, the function finds the equation of the +corresponding epipolar line in the other image. + +From the fundamental matrix definition (see #findFundamentalMat ), line \f$l^{(2)}_i\f$ in the second +image for the point \f$p^{(1)}_i\f$ in the first image (when whichImage=1 ) is computed as: + +\f[l^{(2)}_i = F p^{(1)}_i\f] + +And vice versa, when whichImage=2, \f$l^{(1)}_i\f$ is computed from \f$p^{(2)}_i\f$ as: + +\f[l^{(1)}_i = F^T p^{(2)}_i\f] + +Line coefficients are defined up to a scale. They are normalized so that \f$a_i^2+b_i^2=1\f$ . + */ +CV_EXPORTS_W void computeCorrespondEpilines( InputArray points, int whichImage, + InputArray F, OutputArray lines ); + +/** @brief This function reconstructs 3-dimensional points (in homogeneous coordinates) by using +their observations with a stereo camera. + +@param projMatr1 3x4 projection matrix of the first camera, i.e. this matrix projects 3D points +given in the world's coordinate system into the first image. +@param projMatr2 3x4 projection matrix of the second camera, i.e. this matrix projects 3D points +given in the world's coordinate system into the second image. +@param projPoints1 2xN array of feature points in the first image. In the case of the c++ version, +it can be also a vector of feature points or two-channel matrix of size 1xN or Nx1. +@param projPoints2 2xN array of corresponding points in the second image. In the case of the c++ +version, it can be also a vector of feature points or two-channel matrix of size 1xN or Nx1. +@param points4D 4xN array of reconstructed points in homogeneous coordinates. These points are +returned in the world's coordinate system. + +@note + Keep in mind that all input data should be of float type in order for this function to work. + +@note + If the projection matrices from @ref stereoRectify are used, then the returned points are + represented in the first camera's rectified coordinate system. + +@sa + reprojectImageTo3D + */ +CV_EXPORTS_W void triangulatePoints( InputArray projMatr1, InputArray projMatr2, + InputArray projPoints1, InputArray projPoints2, + OutputArray points4D ); + +/** @brief Refines coordinates of corresponding points. + +@param F 3x3 fundamental matrix. +@param points1 1xN array containing the first set of points. +@param points2 1xN array containing the second set of points. +@param newPoints1 The optimized points1. +@param newPoints2 The optimized points2. + +The function implements the Optimal Triangulation Method (see Multiple View Geometry @cite HartleyZ00 for details). +For each given point correspondence points1[i] \<-\> points2[i], and a fundamental matrix F, it +computes the corrected correspondences newPoints1[i] \<-\> newPoints2[i] that minimize the geometric +error \f$d(points1[i], newPoints1[i])^2 + d(points2[i],newPoints2[i])^2\f$ (where \f$d(a,b)\f$ is the +geometric distance between points \f$a\f$ and \f$b\f$ ) subject to the epipolar constraint +\f$newPoints2^T \cdot F \cdot newPoints1 = 0\f$ . + */ +CV_EXPORTS_W void correctMatches( InputArray F, InputArray points1, InputArray points2, + OutputArray newPoints1, OutputArray newPoints2 ); + +/** @brief Filters off small noise blobs (speckles) in the disparity map + +@param img The input 16-bit signed disparity image +@param newVal The disparity value used to paint-off the speckles +@param maxSpeckleSize The maximum speckle size to consider it a speckle. Larger blobs are not +affected by the algorithm +@param maxDiff Maximum difference between neighbor disparity pixels to put them into the same +blob. Note that since StereoBM, StereoSGBM and may be other algorithms return a fixed-point +disparity map, where disparity values are multiplied by 16, this scale factor should be taken into +account when specifying this parameter value. +@param buf The optional temporary buffer to avoid memory allocation within the function. + */ +CV_EXPORTS_W void filterSpeckles( InputOutputArray img, double newVal, + int maxSpeckleSize, double maxDiff, + InputOutputArray buf = noArray() ); + +//! computes valid disparity ROI from the valid ROIs of the rectified images (that are returned by #stereoRectify) +CV_EXPORTS_W Rect getValidDisparityROI( Rect roi1, Rect roi2, + int minDisparity, int numberOfDisparities, + int blockSize ); + +//! validates disparity using the left-right check. The matrix "cost" should be computed by the stereo correspondence algorithm +CV_EXPORTS_W void validateDisparity( InputOutputArray disparity, InputArray cost, + int minDisparity, int numberOfDisparities, + int disp12MaxDisp = 1 ); + +/** @brief Reprojects a disparity image to 3D space. + +@param disparity Input single-channel 8-bit unsigned, 16-bit signed, 32-bit signed or 32-bit +floating-point disparity image. The values of 8-bit / 16-bit signed formats are assumed to have no +fractional bits. If the disparity is 16-bit signed format, as computed by @ref StereoBM or +@ref StereoSGBM and maybe other algorithms, it should be divided by 16 (and scaled to float) before +being used here. +@param _3dImage Output 3-channel floating-point image of the same size as disparity. Each element of +_3dImage(x,y) contains 3D coordinates of the point (x,y) computed from the disparity map. If one +uses Q obtained by @ref stereoRectify, then the returned points are represented in the first +camera's rectified coordinate system. +@param Q \f$4 \times 4\f$ perspective transformation matrix that can be obtained with +@ref stereoRectify. +@param handleMissingValues Indicates, whether the function should handle missing values (i.e. +points where the disparity was not computed). If handleMissingValues=true, then pixels with the +minimal disparity that corresponds to the outliers (see StereoMatcher::compute ) are transformed +to 3D points with a very large Z value (currently set to 10000). +@param ddepth The optional output array depth. If it is -1, the output image will have CV_32F +depth. ddepth can also be set to CV_16S, CV_32S or CV_32F. + +The function transforms a single-channel disparity map to a 3-channel image representing a 3D +surface. That is, for each pixel (x,y) and the corresponding disparity d=disparity(x,y) , it +computes: + +\f[\begin{bmatrix} +X \\ +Y \\ +Z \\ +W +\end{bmatrix} = Q \begin{bmatrix} +x \\ +y \\ +\texttt{disparity} (x,y) \\ +z +\end{bmatrix}.\f] + +@sa + To reproject a sparse set of points {(x,y,d),...} to 3D space, use perspectiveTransform. + */ +CV_EXPORTS_W void reprojectImageTo3D( InputArray disparity, + OutputArray _3dImage, InputArray Q, + bool handleMissingValues = false, + int ddepth = -1 ); + +/** @brief Calculates the Sampson Distance between two points. + +The function cv::sampsonDistance calculates and returns the first order approximation of the geometric error as: +\f[ +sd( \texttt{pt1} , \texttt{pt2} )= +\frac{(\texttt{pt2}^t \cdot \texttt{F} \cdot \texttt{pt1})^2} +{((\texttt{F} \cdot \texttt{pt1})(0))^2 + +((\texttt{F} \cdot \texttt{pt1})(1))^2 + +((\texttt{F}^t \cdot \texttt{pt2})(0))^2 + +((\texttt{F}^t \cdot \texttt{pt2})(1))^2} +\f] +The fundamental matrix may be calculated using the #findFundamentalMat function. See @cite HartleyZ00 11.4.3 for details. +@param pt1 first homogeneous 2d point +@param pt2 second homogeneous 2d point +@param F fundamental matrix +@return The computed Sampson distance. +*/ +CV_EXPORTS_W double sampsonDistance(InputArray pt1, InputArray pt2, InputArray F); + +/** @brief Computes an optimal affine transformation between two 3D point sets. + +It computes +\f[ +\begin{bmatrix} +x\\ +y\\ +z\\ +\end{bmatrix} += +\begin{bmatrix} +a_{11} & a_{12} & a_{13}\\ +a_{21} & a_{22} & a_{23}\\ +a_{31} & a_{32} & a_{33}\\ +\end{bmatrix} +\begin{bmatrix} +X\\ +Y\\ +Z\\ +\end{bmatrix} ++ +\begin{bmatrix} +b_1\\ +b_2\\ +b_3\\ +\end{bmatrix} +\f] + +@param src First input 3D point set containing \f$(X,Y,Z)\f$. +@param dst Second input 3D point set containing \f$(x,y,z)\f$. +@param out Output 3D affine transformation matrix \f$3 \times 4\f$ of the form +\f[ +\begin{bmatrix} +a_{11} & a_{12} & a_{13} & b_1\\ +a_{21} & a_{22} & a_{23} & b_2\\ +a_{31} & a_{32} & a_{33} & b_3\\ +\end{bmatrix} +\f] +@param inliers Output vector indicating which points are inliers (1-inlier, 0-outlier). +@param ransacThreshold Maximum reprojection error in the RANSAC algorithm to consider a point as +an inlier. +@param confidence Confidence level, between 0 and 1, for the estimated transformation. Anything +between 0.95 and 0.99 is usually good enough. Values too close to 1 can slow down the estimation +significantly. Values lower than 0.8-0.9 can result in an incorrectly estimated transformation. + +The function estimates an optimal 3D affine transformation between two 3D point sets using the +RANSAC algorithm. + */ +CV_EXPORTS_W int estimateAffine3D(InputArray src, InputArray dst, + OutputArray out, OutputArray inliers, + double ransacThreshold = 3, double confidence = 0.99); + +/** @brief Computes an optimal affine transformation between two 3D point sets. + +It computes \f$R,s,t\f$ minimizing \f$\sum{i} dst_i - c \cdot R \cdot src_i \f$ +where \f$R\f$ is a 3x3 rotation matrix, \f$t\f$ is a 3x1 translation vector and \f$s\f$ is a +scalar size value. This is an implementation of the algorithm by Umeyama \cite umeyama1991least . +The estimated affine transform has a homogeneous scale which is a subclass of affine +transformations with 7 degrees of freedom. The paired point sets need to comprise at least 3 +points each. + +@param src First input 3D point set. +@param dst Second input 3D point set. +@param scale If null is passed, the scale parameter c will be assumed to be 1.0. +Else the pointed-to variable will be set to the optimal scale. +@param force_rotation If true, the returned rotation will never be a reflection. +This might be unwanted, e.g. when optimizing a transform between a right- and a +left-handed coordinate system. +@return 3D affine transformation matrix \f$3 \times 4\f$ of the form +\f[T = +\begin{bmatrix} +R & t\\ +\end{bmatrix} +\f] + + */ +CV_EXPORTS_W cv::Mat estimateAffine3D(InputArray src, InputArray dst, + CV_OUT double* scale = nullptr, bool force_rotation = true); + +/** @brief Computes an optimal translation between two 3D point sets. + * + * It computes + * \f[ + * \begin{bmatrix} + * x\\ + * y\\ + * z\\ + * \end{bmatrix} + * = + * \begin{bmatrix} + * X\\ + * Y\\ + * Z\\ + * \end{bmatrix} + * + + * \begin{bmatrix} + * b_1\\ + * b_2\\ + * b_3\\ + * \end{bmatrix} + * \f] + * + * @param src First input 3D point set containing \f$(X,Y,Z)\f$. + * @param dst Second input 3D point set containing \f$(x,y,z)\f$. + * @param out Output 3D translation vector \f$3 \times 1\f$ of the form + * \f[ + * \begin{bmatrix} + * b_1 \\ + * b_2 \\ + * b_3 \\ + * \end{bmatrix} + * \f] + * @param inliers Output vector indicating which points are inliers (1-inlier, 0-outlier). + * @param ransacThreshold Maximum reprojection error in the RANSAC algorithm to consider a point as + * an inlier. + * @param confidence Confidence level, between 0 and 1, for the estimated transformation. Anything + * between 0.95 and 0.99 is usually good enough. Values too close to 1 can slow down the estimation + * significantly. Values lower than 0.8-0.9 can result in an incorrectly estimated transformation. + * + * The function estimates an optimal 3D translation between two 3D point sets using the + * RANSAC algorithm. + * */ +CV_EXPORTS_W int estimateTranslation3D(InputArray src, InputArray dst, + OutputArray out, OutputArray inliers, + double ransacThreshold = 3, double confidence = 0.99); + +/** @brief Computes an optimal affine transformation between two 2D point sets. + +It computes +\f[ +\begin{bmatrix} +x\\ +y\\ +\end{bmatrix} += +\begin{bmatrix} +a_{11} & a_{12}\\ +a_{21} & a_{22}\\ +\end{bmatrix} +\begin{bmatrix} +X\\ +Y\\ +\end{bmatrix} ++ +\begin{bmatrix} +b_1\\ +b_2\\ +\end{bmatrix} +\f] + +@param from First input 2D point set containing \f$(X,Y)\f$. +@param to Second input 2D point set containing \f$(x,y)\f$. +@param inliers Output vector indicating which points are inliers (1-inlier, 0-outlier). +@param method Robust method used to compute transformation. The following methods are possible: +- @ref RANSAC - RANSAC-based robust method +- @ref LMEDS - Least-Median robust method +RANSAC is the default method. +@param ransacReprojThreshold Maximum reprojection error in the RANSAC algorithm to consider +a point as an inlier. Applies only to RANSAC. +@param maxIters The maximum number of robust method iterations. +@param confidence Confidence level, between 0 and 1, for the estimated transformation. Anything +between 0.95 and 0.99 is usually good enough. Values too close to 1 can slow down the estimation +significantly. Values lower than 0.8-0.9 can result in an incorrectly estimated transformation. +@param refineIters Maximum number of iterations of refining algorithm (Levenberg-Marquardt). +Passing 0 will disable refining, so the output matrix will be output of robust method. + +@return Output 2D affine transformation matrix \f$2 \times 3\f$ or empty matrix if transformation +could not be estimated. The returned matrix has the following form: +\f[ +\begin{bmatrix} +a_{11} & a_{12} & b_1\\ +a_{21} & a_{22} & b_2\\ +\end{bmatrix} +\f] + +The function estimates an optimal 2D affine transformation between two 2D point sets using the +selected robust algorithm. + +The computed transformation is then refined further (using only inliers) with the +Levenberg-Marquardt method to reduce the re-projection error even more. + +@note +The RANSAC method can handle practically any ratio of outliers but needs a threshold to +distinguish inliers from outliers. The method LMeDS does not need any threshold but it works +correctly only when there are more than 50% of inliers. + +@sa estimateAffinePartial2D, getAffineTransform +*/ +CV_EXPORTS_W cv::Mat estimateAffine2D(InputArray from, InputArray to, OutputArray inliers = noArray(), + int method = RANSAC, double ransacReprojThreshold = 3, + size_t maxIters = 2000, double confidence = 0.99, + size_t refineIters = 10); + + +CV_EXPORTS_W cv::Mat estimateAffine2D(InputArray pts1, InputArray pts2, OutputArray inliers, + const UsacParams ¶ms); + +/** @brief Computes an optimal limited affine transformation with 4 degrees of freedom between +two 2D point sets. + +@param from First input 2D point set. +@param to Second input 2D point set. +@param inliers Output vector indicating which points are inliers. +@param method Robust method used to compute transformation. The following methods are possible: +- @ref RANSAC - RANSAC-based robust method +- @ref LMEDS - Least-Median robust method +RANSAC is the default method. +@param ransacReprojThreshold Maximum reprojection error in the RANSAC algorithm to consider +a point as an inlier. Applies only to RANSAC. +@param maxIters The maximum number of robust method iterations. +@param confidence Confidence level, between 0 and 1, for the estimated transformation. Anything +between 0.95 and 0.99 is usually good enough. Values too close to 1 can slow down the estimation +significantly. Values lower than 0.8-0.9 can result in an incorrectly estimated transformation. +@param refineIters Maximum number of iterations of refining algorithm (Levenberg-Marquardt). +Passing 0 will disable refining, so the output matrix will be output of robust method. + +@return Output 2D affine transformation (4 degrees of freedom) matrix \f$2 \times 3\f$ or +empty matrix if transformation could not be estimated. + +The function estimates an optimal 2D affine transformation with 4 degrees of freedom limited to +combinations of translation, rotation, and uniform scaling. Uses the selected algorithm for robust +estimation. + +The computed transformation is then refined further (using only inliers) with the +Levenberg-Marquardt method to reduce the re-projection error even more. + +Estimated transformation matrix is: +\f[ \begin{bmatrix} \cos(\theta) \cdot s & -\sin(\theta) \cdot s & t_x \\ + \sin(\theta) \cdot s & \cos(\theta) \cdot s & t_y +\end{bmatrix} \f] +Where \f$ \theta \f$ is the rotation angle, \f$ s \f$ the scaling factor and \f$ t_x, t_y \f$ are +translations in \f$ x, y \f$ axes respectively. + +@note +The RANSAC method can handle practically any ratio of outliers but need a threshold to +distinguish inliers from outliers. The method LMeDS does not need any threshold but it works +correctly only when there are more than 50% of inliers. + +@sa estimateAffine2D, getAffineTransform +*/ +CV_EXPORTS_W cv::Mat estimateAffinePartial2D(InputArray from, InputArray to, OutputArray inliers = noArray(), + int method = RANSAC, double ransacReprojThreshold = 3, + size_t maxIters = 2000, double confidence = 0.99, + size_t refineIters = 10); + +/** @example samples/cpp/tutorial_code/features2D/Homography/decompose_homography.cpp +An example program with homography decomposition. + +Check @ref tutorial_homography "the corresponding tutorial" for more details. +*/ + +/** @brief Decompose a homography matrix to rotation(s), translation(s) and plane normal(s). + +@param H The input homography matrix between two images. +@param K The input camera intrinsic matrix. +@param rotations Array of rotation matrices. +@param translations Array of translation matrices. +@param normals Array of plane normal matrices. + +This function extracts relative camera motion between two views of a planar object and returns up to +four mathematical solution tuples of rotation, translation, and plane normal. The decomposition of +the homography matrix H is described in detail in @cite Malis2007. + +If the homography H, induced by the plane, gives the constraint +\f[s_i \vecthree{x'_i}{y'_i}{1} \sim H \vecthree{x_i}{y_i}{1}\f] on the source image points +\f$p_i\f$ and the destination image points \f$p'_i\f$, then the tuple of rotations[k] and +translations[k] is a change of basis from the source camera's coordinate system to the destination +camera's coordinate system. However, by decomposing H, one can only get the translation normalized +by the (typically unknown) depth of the scene, i.e. its direction but with normalized length. + +If point correspondences are available, at least two solutions may further be invalidated, by +applying positive depth constraint, i.e. all points must be in front of the camera. + */ +CV_EXPORTS_W int decomposeHomographyMat(InputArray H, + InputArray K, + OutputArrayOfArrays rotations, + OutputArrayOfArrays translations, + OutputArrayOfArrays normals); + +/** @brief Filters homography decompositions based on additional information. + +@param rotations Vector of rotation matrices. +@param normals Vector of plane normal matrices. +@param beforePoints Vector of (rectified) visible reference points before the homography is applied +@param afterPoints Vector of (rectified) visible reference points after the homography is applied +@param possibleSolutions Vector of int indices representing the viable solution set after filtering +@param pointsMask optional Mat/Vector of 8u type representing the mask for the inliers as given by the #findHomography function + +This function is intended to filter the output of the #decomposeHomographyMat based on additional +information as described in @cite Malis2007 . The summary of the method: the #decomposeHomographyMat function +returns 2 unique solutions and their "opposites" for a total of 4 solutions. If we have access to the +sets of points visible in the camera frame before and after the homography transformation is applied, +we can determine which are the true potential solutions and which are the opposites by verifying which +homographies are consistent with all visible reference points being in front of the camera. The inputs +are left unchanged; the filtered solution set is returned as indices into the existing one. + +*/ +CV_EXPORTS_W void filterHomographyDecompByVisibleRefpoints(InputArrayOfArrays rotations, + InputArrayOfArrays normals, + InputArray beforePoints, + InputArray afterPoints, + OutputArray possibleSolutions, + InputArray pointsMask = noArray()); + +/** @brief The base class for stereo correspondence algorithms. + */ +class CV_EXPORTS_W StereoMatcher : public Algorithm +{ +public: + enum { DISP_SHIFT = 4, + DISP_SCALE = (1 << DISP_SHIFT) + }; + + /** @brief Computes disparity map for the specified stereo pair + + @param left Left 8-bit single-channel image. + @param right Right image of the same size and the same type as the left one. + @param disparity Output disparity map. It has the same size as the input images. Some algorithms, + like StereoBM or StereoSGBM compute 16-bit fixed-point disparity map (where each disparity value + has 4 fractional bits), whereas other algorithms output 32-bit floating-point disparity map. + */ + CV_WRAP virtual void compute( InputArray left, InputArray right, + OutputArray disparity ) = 0; + + CV_WRAP virtual int getMinDisparity() const = 0; + CV_WRAP virtual void setMinDisparity(int minDisparity) = 0; + + CV_WRAP virtual int getNumDisparities() const = 0; + CV_WRAP virtual void setNumDisparities(int numDisparities) = 0; + + CV_WRAP virtual int getBlockSize() const = 0; + CV_WRAP virtual void setBlockSize(int blockSize) = 0; + + CV_WRAP virtual int getSpeckleWindowSize() const = 0; + CV_WRAP virtual void setSpeckleWindowSize(int speckleWindowSize) = 0; + + CV_WRAP virtual int getSpeckleRange() const = 0; + CV_WRAP virtual void setSpeckleRange(int speckleRange) = 0; + + CV_WRAP virtual int getDisp12MaxDiff() const = 0; + CV_WRAP virtual void setDisp12MaxDiff(int disp12MaxDiff) = 0; +}; + + +/** @brief Class for computing stereo correspondence using the block matching algorithm, introduced and +contributed to OpenCV by K. Konolige. + */ +class CV_EXPORTS_W StereoBM : public StereoMatcher +{ +public: + enum { PREFILTER_NORMALIZED_RESPONSE = 0, + PREFILTER_XSOBEL = 1 + }; + + CV_WRAP virtual int getPreFilterType() const = 0; + CV_WRAP virtual void setPreFilterType(int preFilterType) = 0; + + CV_WRAP virtual int getPreFilterSize() const = 0; + CV_WRAP virtual void setPreFilterSize(int preFilterSize) = 0; + + CV_WRAP virtual int getPreFilterCap() const = 0; + CV_WRAP virtual void setPreFilterCap(int preFilterCap) = 0; + + CV_WRAP virtual int getTextureThreshold() const = 0; + CV_WRAP virtual void setTextureThreshold(int textureThreshold) = 0; + + CV_WRAP virtual int getUniquenessRatio() const = 0; + CV_WRAP virtual void setUniquenessRatio(int uniquenessRatio) = 0; + + CV_WRAP virtual int getSmallerBlockSize() const = 0; + CV_WRAP virtual void setSmallerBlockSize(int blockSize) = 0; + + CV_WRAP virtual Rect getROI1() const = 0; + CV_WRAP virtual void setROI1(Rect roi1) = 0; + + CV_WRAP virtual Rect getROI2() const = 0; + CV_WRAP virtual void setROI2(Rect roi2) = 0; + + /** @brief Creates StereoBM object + + @param numDisparities the disparity search range. For each pixel algorithm will find the best + disparity from 0 (default minimum disparity) to numDisparities. The search range can then be + shifted by changing the minimum disparity. + @param blockSize the linear size of the blocks compared by the algorithm. The size should be odd + (as the block is centered at the current pixel). Larger block size implies smoother, though less + accurate disparity map. Smaller block size gives more detailed disparity map, but there is higher + chance for algorithm to find a wrong correspondence. + + The function create StereoBM object. You can then call StereoBM::compute() to compute disparity for + a specific stereo pair. + */ + CV_WRAP static Ptr create(int numDisparities = 0, int blockSize = 21); +}; + +/** @brief The class implements the modified H. Hirschmuller algorithm @cite HH08 that differs from the original +one as follows: + +- By default, the algorithm is single-pass, which means that you consider only 5 directions +instead of 8. Set mode=StereoSGBM::MODE_HH in createStereoSGBM to run the full variant of the +algorithm but beware that it may consume a lot of memory. +- The algorithm matches blocks, not individual pixels. Though, setting blockSize=1 reduces the +blocks to single pixels. +- Mutual information cost function is not implemented. Instead, a simpler Birchfield-Tomasi +sub-pixel metric from @cite BT98 is used. Though, the color images are supported as well. +- Some pre- and post- processing steps from K. Konolige algorithm StereoBM are included, for +example: pre-filtering (StereoBM::PREFILTER_XSOBEL type) and post-filtering (uniqueness +check, quadratic interpolation and speckle filtering). + +@note + - (Python) An example illustrating the use of the StereoSGBM matching algorithm can be found + at opencv_source_code/samples/python/stereo_match.py + */ +class CV_EXPORTS_W StereoSGBM : public StereoMatcher +{ +public: + enum + { + MODE_SGBM = 0, + MODE_HH = 1, + MODE_SGBM_3WAY = 2, + MODE_HH4 = 3 + }; + + CV_WRAP virtual int getPreFilterCap() const = 0; + CV_WRAP virtual void setPreFilterCap(int preFilterCap) = 0; + + CV_WRAP virtual int getUniquenessRatio() const = 0; + CV_WRAP virtual void setUniquenessRatio(int uniquenessRatio) = 0; + + CV_WRAP virtual int getP1() const = 0; + CV_WRAP virtual void setP1(int P1) = 0; + + CV_WRAP virtual int getP2() const = 0; + CV_WRAP virtual void setP2(int P2) = 0; + + CV_WRAP virtual int getMode() const = 0; + CV_WRAP virtual void setMode(int mode) = 0; + + /** @brief Creates StereoSGBM object + + @param minDisparity Minimum possible disparity value. Normally, it is zero but sometimes + rectification algorithms can shift images, so this parameter needs to be adjusted accordingly. + @param numDisparities Maximum disparity minus minimum disparity. The value is always greater than + zero. In the current implementation, this parameter must be divisible by 16. + @param blockSize Matched block size. It must be an odd number \>=1 . Normally, it should be + somewhere in the 3..11 range. + @param P1 The first parameter controlling the disparity smoothness. See below. + @param P2 The second parameter controlling the disparity smoothness. The larger the values are, + the smoother the disparity is. P1 is the penalty on the disparity change by plus or minus 1 + between neighbor pixels. P2 is the penalty on the disparity change by more than 1 between neighbor + pixels. The algorithm requires P2 \> P1 . See stereo_match.cpp sample where some reasonably good + P1 and P2 values are shown (like 8\*number_of_image_channels\*blockSize\*blockSize and + 32\*number_of_image_channels\*blockSize\*blockSize , respectively). + @param disp12MaxDiff Maximum allowed difference (in integer pixel units) in the left-right + disparity check. Set it to a non-positive value to disable the check. + @param preFilterCap Truncation value for the prefiltered image pixels. The algorithm first + computes x-derivative at each pixel and clips its value by [-preFilterCap, preFilterCap] interval. + The result values are passed to the Birchfield-Tomasi pixel cost function. + @param uniquenessRatio Margin in percentage by which the best (minimum) computed cost function + value should "win" the second best value to consider the found match correct. Normally, a value + within the 5-15 range is good enough. + @param speckleWindowSize Maximum size of smooth disparity regions to consider their noise speckles + and invalidate. Set it to 0 to disable speckle filtering. Otherwise, set it somewhere in the + 50-200 range. + @param speckleRange Maximum disparity variation within each connected component. If you do speckle + filtering, set the parameter to a positive value, it will be implicitly multiplied by 16. + Normally, 1 or 2 is good enough. + @param mode Set it to StereoSGBM::MODE_HH to run the full-scale two-pass dynamic programming + algorithm. It will consume O(W\*H\*numDisparities) bytes, which is large for 640x480 stereo and + huge for HD-size pictures. By default, it is set to false . + + The first constructor initializes StereoSGBM with all the default parameters. So, you only have to + set StereoSGBM::numDisparities at minimum. The second constructor enables you to set each parameter + to a custom value. + */ + CV_WRAP static Ptr create(int minDisparity = 0, int numDisparities = 16, int blockSize = 3, + int P1 = 0, int P2 = 0, int disp12MaxDiff = 0, + int preFilterCap = 0, int uniquenessRatio = 0, + int speckleWindowSize = 0, int speckleRange = 0, + int mode = StereoSGBM::MODE_SGBM); +}; + + +//! cv::undistort mode +enum UndistortTypes +{ + PROJ_SPHERICAL_ORTHO = 0, + PROJ_SPHERICAL_EQRECT = 1 +}; + +/** @brief Transforms an image to compensate for lens distortion. + +The function transforms an image to compensate radial and tangential lens distortion. + +The function is simply a combination of #initUndistortRectifyMap (with unity R ) and #remap +(with bilinear interpolation). See the former function for details of the transformation being +performed. + +Those pixels in the destination image, for which there is no correspondent pixels in the source +image, are filled with zeros (black color). + +A particular subset of the source image that will be visible in the corrected image can be regulated +by newCameraMatrix. You can use #getOptimalNewCameraMatrix to compute the appropriate +newCameraMatrix depending on your requirements. + +The camera matrix and the distortion parameters can be determined using #calibrateCamera. If +the resolution of images is different from the resolution used at the calibration stage, \f$f_x, +f_y, c_x\f$ and \f$c_y\f$ need to be scaled accordingly, while the distortion coefficients remain +the same. + +@param src Input (distorted) image. +@param dst Output (corrected) image that has the same size and type as src . +@param cameraMatrix Input camera matrix \f$A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param newCameraMatrix Camera matrix of the distorted image. By default, it is the same as +cameraMatrix but you may additionally scale and shift the result by using a different matrix. + */ +CV_EXPORTS_W void undistort( InputArray src, OutputArray dst, + InputArray cameraMatrix, + InputArray distCoeffs, + InputArray newCameraMatrix = noArray() ); + +/** @brief Computes the undistortion and rectification transformation map. + +The function computes the joint undistortion and rectification transformation and represents the +result in the form of maps for #remap. The undistorted image looks like original, as if it is +captured with a camera using the camera matrix =newCameraMatrix and zero distortion. In case of a +monocular camera, newCameraMatrix is usually equal to cameraMatrix, or it can be computed by +#getOptimalNewCameraMatrix for a better control over scaling. In case of a stereo camera, +newCameraMatrix is normally set to P1 or P2 computed by #stereoRectify . + +Also, this new camera is oriented differently in the coordinate space, according to R. That, for +example, helps to align two heads of a stereo camera so that the epipolar lines on both images +become horizontal and have the same y- coordinate (in case of a horizontally aligned stereo camera). + +The function actually builds the maps for the inverse mapping algorithm that is used by #remap. That +is, for each pixel \f$(u, v)\f$ in the destination (corrected and rectified) image, the function +computes the corresponding coordinates in the source image (that is, in the original image from +camera). The following process is applied: +\f[ +\begin{array}{l} +x \leftarrow (u - {c'}_x)/{f'}_x \\ +y \leftarrow (v - {c'}_y)/{f'}_y \\ +{[X\,Y\,W]} ^T \leftarrow R^{-1}*[x \, y \, 1]^T \\ +x' \leftarrow X/W \\ +y' \leftarrow Y/W \\ +r^2 \leftarrow x'^2 + y'^2 \\ +x'' \leftarrow x' \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} ++ 2p_1 x' y' + p_2(r^2 + 2 x'^2) + s_1 r^2 + s_2 r^4\\ +y'' \leftarrow y' \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6} ++ p_1 (r^2 + 2 y'^2) + 2 p_2 x' y' + s_3 r^2 + s_4 r^4 \\ +s\vecthree{x'''}{y'''}{1} = +\vecthreethree{R_{33}(\tau_x, \tau_y)}{0}{-R_{13}((\tau_x, \tau_y)} +{0}{R_{33}(\tau_x, \tau_y)}{-R_{23}(\tau_x, \tau_y)} +{0}{0}{1} R(\tau_x, \tau_y) \vecthree{x''}{y''}{1}\\ +map_x(u,v) \leftarrow x''' f_x + c_x \\ +map_y(u,v) \leftarrow y''' f_y + c_y +\end{array} +\f] +where \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +are the distortion coefficients. + +In case of a stereo camera, this function is called twice: once for each camera head, after +#stereoRectify, which in its turn is called after #stereoCalibrate. But if the stereo camera +was not calibrated, it is still possible to compute the rectification transformations directly from +the fundamental matrix using #stereoRectifyUncalibrated. For each camera, the function computes +homography H as the rectification transformation in a pixel domain, not a rotation matrix R in 3D +space. R can be computed from H as +\f[\texttt{R} = \texttt{cameraMatrix} ^{-1} \cdot \texttt{H} \cdot \texttt{cameraMatrix}\f] +where cameraMatrix can be chosen arbitrarily. + +@param cameraMatrix Input camera matrix \f$A=\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param R Optional rectification transformation in the object space (3x3 matrix). R1 or R2 , +computed by #stereoRectify can be passed here. If the matrix is empty, the identity transformation +is assumed. In #initUndistortRectifyMap R assumed to be an identity matrix. +@param newCameraMatrix New camera matrix \f$A'=\vecthreethree{f_x'}{0}{c_x'}{0}{f_y'}{c_y'}{0}{0}{1}\f$. +@param size Undistorted image size. +@param m1type Type of the first output map that can be CV_32FC1, CV_32FC2 or CV_16SC2, see #convertMaps +@param map1 The first output map. +@param map2 The second output map. + */ +CV_EXPORTS_W +void initUndistortRectifyMap(InputArray cameraMatrix, InputArray distCoeffs, + InputArray R, InputArray newCameraMatrix, + Size size, int m1type, OutputArray map1, OutputArray map2); + +/** @brief Computes the projection and inverse-rectification transformation map. In essense, this is the inverse of +#initUndistortRectifyMap to accomodate stereo-rectification of projectors ('inverse-cameras') in projector-camera pairs. + +The function computes the joint projection and inverse rectification transformation and represents the +result in the form of maps for #remap. The projected image looks like a distorted version of the original which, +once projected by a projector, should visually match the original. In case of a monocular camera, newCameraMatrix +is usually equal to cameraMatrix, or it can be computed by +#getOptimalNewCameraMatrix for a better control over scaling. In case of a projector-camera pair, +newCameraMatrix is normally set to P1 or P2 computed by #stereoRectify . + +The projector is oriented differently in the coordinate space, according to R. In case of projector-camera pairs, +this helps align the projector (in the same manner as #initUndistortRectifyMap for the camera) to create a stereo-rectified pair. This +allows epipolar lines on both images to become horizontal and have the same y-coordinate (in case of a horizontally aligned projector-camera pair). + +The function builds the maps for the inverse mapping algorithm that is used by #remap. That +is, for each pixel \f$(u, v)\f$ in the destination (projected and inverse-rectified) image, the function +computes the corresponding coordinates in the source image (that is, in the original digital image). The following process is applied: + +\f[ +\begin{array}{l} +\text{newCameraMatrix}\\ +x \leftarrow (u - {c'}_x)/{f'}_x \\ +y \leftarrow (v - {c'}_y)/{f'}_y \\ + +\\\text{Undistortion} +\\\scriptsize{\textit{though equation shown is for radial undistortion, function implements cv::undistortPoints()}}\\ +r^2 \leftarrow x^2 + y^2 \\ +\theta \leftarrow \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6}\\ +x' \leftarrow \frac{x}{\theta} \\ +y' \leftarrow \frac{y}{\theta} \\ + +\\\text{Rectification}\\ +{[X\,Y\,W]} ^T \leftarrow R*[x' \, y' \, 1]^T \\ +x'' \leftarrow X/W \\ +y'' \leftarrow Y/W \\ + +\\\text{cameraMatrix}\\ +map_x(u,v) \leftarrow x'' f_x + c_x \\ +map_y(u,v) \leftarrow y'' f_y + c_y +\end{array} +\f] +where \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +are the distortion coefficients vector distCoeffs. + +In case of a stereo-rectified projector-camera pair, this function is called for the projector while #initUndistortRectifyMap is called for the camera head. +This is done after #stereoRectify, which in turn is called after #stereoCalibrate. If the projector-camera pair +is not calibrated, it is still possible to compute the rectification transformations directly from +the fundamental matrix using #stereoRectifyUncalibrated. For the projector and camera, the function computes +homography H as the rectification transformation in a pixel domain, not a rotation matrix R in 3D +space. R can be computed from H as +\f[\texttt{R} = \texttt{cameraMatrix} ^{-1} \cdot \texttt{H} \cdot \texttt{cameraMatrix}\f] +where cameraMatrix can be chosen arbitrarily. + +@param cameraMatrix Input camera matrix \f$A=\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param R Optional rectification transformation in the object space (3x3 matrix). R1 or R2, +computed by #stereoRectify can be passed here. If the matrix is empty, the identity transformation +is assumed. +@param newCameraMatrix New camera matrix \f$A'=\vecthreethree{f_x'}{0}{c_x'}{0}{f_y'}{c_y'}{0}{0}{1}\f$. +@param size Distorted image size. +@param m1type Type of the first output map. Can be CV_32FC1, CV_32FC2 or CV_16SC2, see #convertMaps +@param map1 The first output map for #remap. +@param map2 The second output map for #remap. + */ +CV_EXPORTS_W +void initInverseRectificationMap( InputArray cameraMatrix, InputArray distCoeffs, + InputArray R, InputArray newCameraMatrix, + const Size& size, int m1type, OutputArray map1, OutputArray map2 ); + +//! initializes maps for #remap for wide-angle +CV_EXPORTS +float initWideAngleProjMap(InputArray cameraMatrix, InputArray distCoeffs, + Size imageSize, int destImageWidth, + int m1type, OutputArray map1, OutputArray map2, + enum UndistortTypes projType = PROJ_SPHERICAL_EQRECT, double alpha = 0); +static inline +float initWideAngleProjMap(InputArray cameraMatrix, InputArray distCoeffs, + Size imageSize, int destImageWidth, + int m1type, OutputArray map1, OutputArray map2, + int projType, double alpha = 0) +{ + return initWideAngleProjMap(cameraMatrix, distCoeffs, imageSize, destImageWidth, + m1type, map1, map2, (UndistortTypes)projType, alpha); +} + +/** @brief Returns the default new camera matrix. + +The function returns the camera matrix that is either an exact copy of the input cameraMatrix (when +centerPrinicipalPoint=false ), or the modified one (when centerPrincipalPoint=true). + +In the latter case, the new camera matrix will be: + +\f[\begin{bmatrix} f_x && 0 && ( \texttt{imgSize.width} -1)*0.5 \\ 0 && f_y && ( \texttt{imgSize.height} -1)*0.5 \\ 0 && 0 && 1 \end{bmatrix} ,\f] + +where \f$f_x\f$ and \f$f_y\f$ are \f$(0,0)\f$ and \f$(1,1)\f$ elements of cameraMatrix, respectively. + +By default, the undistortion functions in OpenCV (see #initUndistortRectifyMap, #undistort) do not +move the principal point. However, when you work with stereo, it is important to move the principal +points in both views to the same y-coordinate (which is required by most of stereo correspondence +algorithms), and may be to the same x-coordinate too. So, you can form the new camera matrix for +each view where the principal points are located at the center. + +@param cameraMatrix Input camera matrix. +@param imgsize Camera view image size in pixels. +@param centerPrincipalPoint Location of the principal point in the new camera matrix. The +parameter indicates whether this location should be at the image center or not. + */ +CV_EXPORTS_W +Mat getDefaultNewCameraMatrix(InputArray cameraMatrix, Size imgsize = Size(), + bool centerPrincipalPoint = false); + +/** @brief Computes the ideal point coordinates from the observed point coordinates. + +The function is similar to #undistort and #initUndistortRectifyMap but it operates on a +sparse set of points instead of a raster image. Also the function performs a reverse transformation +to #projectPoints. In case of a 3D object, it does not reconstruct its 3D coordinates, but for a +planar object, it does, up to a translation vector, if the proper R is specified. + +For each observed point coordinate \f$(u, v)\f$ the function computes: +\f[ +\begin{array}{l} +x^{"} \leftarrow (u - c_x)/f_x \\ +y^{"} \leftarrow (v - c_y)/f_y \\ +(x',y') = undistort(x^{"},y^{"}, \texttt{distCoeffs}) \\ +{[X\,Y\,W]} ^T \leftarrow R*[x' \, y' \, 1]^T \\ +x \leftarrow X/W \\ +y \leftarrow Y/W \\ +\text{only performed if P is specified:} \\ +u' \leftarrow x {f'}_x + {c'}_x \\ +v' \leftarrow y {f'}_y + {c'}_y +\end{array} +\f] + +where *undistort* is an approximate iterative algorithm that estimates the normalized original +point coordinates out of the normalized distorted point coordinates ("normalized" means that the +coordinates do not depend on the camera matrix). + +The function can be used for both a stereo camera head or a monocular camera (when R is empty). +@param src Observed point coordinates, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel (CV_32FC2 or CV_64FC2) (or +vector\ ). +@param dst Output ideal point coordinates (1xN/Nx1 2-channel or vector\ ) after undistortion and reverse perspective +transformation. If matrix P is identity or omitted, dst will contain normalized point coordinates. +@param cameraMatrix Camera matrix \f$\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . +@param distCoeffs Input vector of distortion coefficients +\f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]])\f$ +of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. +@param R Rectification transformation in the object space (3x3 matrix). R1 or R2 computed by +#stereoRectify can be passed here. If the matrix is empty, the identity transformation is used. +@param P New camera matrix (3x3) or new projection matrix (3x4) \f$\begin{bmatrix} {f'}_x & 0 & {c'}_x & t_x \\ 0 & {f'}_y & {c'}_y & t_y \\ 0 & 0 & 1 & t_z \end{bmatrix}\f$. P1 or P2 computed by +#stereoRectify can be passed here. If the matrix is empty, the identity new camera matrix is used. + */ +CV_EXPORTS_W +void undistortPoints(InputArray src, OutputArray dst, + InputArray cameraMatrix, InputArray distCoeffs, + InputArray R = noArray(), InputArray P = noArray()); +/** @overload + @note Default version of #undistortPoints does 5 iterations to compute undistorted points. + */ +CV_EXPORTS_AS(undistortPointsIter) +void undistortPoints(InputArray src, OutputArray dst, + InputArray cameraMatrix, InputArray distCoeffs, + InputArray R, InputArray P, TermCriteria criteria); + +/** + * @brief Compute undistorted image points position + * + * @param src Observed points position, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel (CV_32FC2 or +CV_64FC2) (or vector\ ). + * @param dst Output undistorted points position (1xN/Nx1 2-channel or vector\ ). + * @param cameraMatrix Camera matrix \f$\vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ . + * @param distCoeffs Distortion coefficients + */ +CV_EXPORTS_W +void undistortImagePoints(InputArray src, OutputArray dst, InputArray cameraMatrix, + InputArray distCoeffs, + TermCriteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 5, + 0.01)); + +//! @} calib3d + +/** @brief The methods in this namespace use a so-called fisheye camera model. + @ingroup calib3d_fisheye +*/ +namespace fisheye +{ +//! @addtogroup calib3d_fisheye +//! @{ + + enum{ + CALIB_USE_INTRINSIC_GUESS = 1 << 0, + CALIB_RECOMPUTE_EXTRINSIC = 1 << 1, + CALIB_CHECK_COND = 1 << 2, + CALIB_FIX_SKEW = 1 << 3, + CALIB_FIX_K1 = 1 << 4, + CALIB_FIX_K2 = 1 << 5, + CALIB_FIX_K3 = 1 << 6, + CALIB_FIX_K4 = 1 << 7, + CALIB_FIX_INTRINSIC = 1 << 8, + CALIB_FIX_PRINCIPAL_POINT = 1 << 9, + CALIB_ZERO_DISPARITY = 1 << 10, + CALIB_FIX_FOCAL_LENGTH = 1 << 11 + }; + + /** @brief Projects points using fisheye model + + @param objectPoints Array of object points, 1xN/Nx1 3-channel (or vector\ ), where N is + the number of points in the view. + @param imagePoints Output array of image points, 2xN/Nx2 1-channel or 1xN/Nx1 2-channel, or + vector\. + @param affine + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param alpha The skew coefficient. + @param jacobian Optional output 2Nx15 jacobian matrix of derivatives of image points with respect + to components of the focal lengths, coordinates of the principal point, distortion coefficients, + rotation vector, translation vector, and the skew. In the old interface different components of + the jacobian are returned via different output parameters. + + The function computes projections of 3D points to the image plane given intrinsic and extrinsic + camera parameters. Optionally, the function computes Jacobians - matrices of partial derivatives of + image points coordinates (as functions of all the input parameters) with respect to the particular + parameters, intrinsic and/or extrinsic. + */ + CV_EXPORTS void projectPoints(InputArray objectPoints, OutputArray imagePoints, const Affine3d& affine, + InputArray K, InputArray D, double alpha = 0, OutputArray jacobian = noArray()); + + /** @overload */ + CV_EXPORTS_W void projectPoints(InputArray objectPoints, OutputArray imagePoints, InputArray rvec, InputArray tvec, + InputArray K, InputArray D, double alpha = 0, OutputArray jacobian = noArray()); + + /** @brief Distorts 2D points using fisheye model. + + @param undistorted Array of object points, 1xN/Nx1 2-channel (or vector\ ), where N is + the number of points in the view. + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param alpha The skew coefficient. + @param distorted Output array of image points, 1xN/Nx1 2-channel, or vector\ . + + Note that the function assumes the camera intrinsic matrix of the undistorted points to be identity. + This means if you want to distort image points you have to multiply them with \f$K^{-1}\f$. + */ + CV_EXPORTS_W void distortPoints(InputArray undistorted, OutputArray distorted, InputArray K, InputArray D, double alpha = 0); + + /** @brief Undistorts 2D points using fisheye model + + @param distorted Array of object points, 1xN/Nx1 2-channel (or vector\ ), where N is the + number of points in the view. + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param R Rectification transformation in the object space: 3x3 1-channel, or vector: 3x1/1x3 + 1-channel or 1x1 3-channel + @param P New camera intrinsic matrix (3x3) or new projection matrix (3x4) + @param criteria Termination criteria + @param undistorted Output array of image points, 1xN/Nx1 2-channel, or vector\ . + */ + CV_EXPORTS_W void undistortPoints(InputArray distorted, OutputArray undistorted, + InputArray K, InputArray D, InputArray R = noArray(), InputArray P = noArray(), + TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 10, 1e-8)); + + /** @brief Computes undistortion and rectification maps for image transform by #remap. If D is empty zero + distortion is used, if R or P is empty identity matrixes are used. + + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param R Rectification transformation in the object space: 3x3 1-channel, or vector: 3x1/1x3 + 1-channel or 1x1 3-channel + @param P New camera intrinsic matrix (3x3) or new projection matrix (3x4) + @param size Undistorted image size. + @param m1type Type of the first output map that can be CV_32FC1 or CV_16SC2 . See #convertMaps + for details. + @param map1 The first output map. + @param map2 The second output map. + */ + CV_EXPORTS_W void initUndistortRectifyMap(InputArray K, InputArray D, InputArray R, InputArray P, + const cv::Size& size, int m1type, OutputArray map1, OutputArray map2); + + /** @brief Transforms an image to compensate for fisheye lens distortion. + + @param distorted image with fisheye lens distortion. + @param undistorted Output image with compensated fisheye lens distortion. + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param Knew Camera intrinsic matrix of the distorted image. By default, it is the identity matrix but you + may additionally scale and shift the result by using a different matrix. + @param new_size the new size + + The function transforms an image to compensate radial and tangential lens distortion. + + The function is simply a combination of #fisheye::initUndistortRectifyMap (with unity R ) and #remap + (with bilinear interpolation). See the former function for details of the transformation being + performed. + + See below the results of undistortImage. + - a\) result of undistort of perspective camera model (all possible coefficients (k_1, k_2, k_3, + k_4, k_5, k_6) of distortion were optimized under calibration) + - b\) result of #fisheye::undistortImage of fisheye camera model (all possible coefficients (k_1, k_2, + k_3, k_4) of fisheye distortion were optimized under calibration) + - c\) original image was captured with fisheye lens + + Pictures a) and b) almost the same. But if we consider points of image located far from the center + of image, we can notice that on image a) these points are distorted. + + ![image](pics/fisheye_undistorted.jpg) + */ + CV_EXPORTS_W void undistortImage(InputArray distorted, OutputArray undistorted, + InputArray K, InputArray D, InputArray Knew = cv::noArray(), const Size& new_size = Size()); + + /** @brief Estimates new camera intrinsic matrix for undistortion or rectification. + + @param K Camera intrinsic matrix \f$cameramatrix{K}\f$. + @param image_size Size of the image + @param D Input vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param R Rectification transformation in the object space: 3x3 1-channel, or vector: 3x1/1x3 + 1-channel or 1x1 3-channel + @param P New camera intrinsic matrix (3x3) or new projection matrix (3x4) + @param balance Sets the new focal length in range between the min focal length and the max focal + length. Balance is in range of [0, 1]. + @param new_size the new size + @param fov_scale Divisor for new focal length. + */ + CV_EXPORTS_W void estimateNewCameraMatrixForUndistortRectify(InputArray K, InputArray D, const Size &image_size, InputArray R, + OutputArray P, double balance = 0.0, const Size& new_size = Size(), double fov_scale = 1.0); + + /** @brief Performs camera calibration + + @param objectPoints vector of vectors of calibration pattern points in the calibration pattern + coordinate space. + @param imagePoints vector of vectors of the projections of calibration pattern points. + imagePoints.size() and objectPoints.size() and imagePoints[i].size() must be equal to + objectPoints[i].size() for each i. + @param image_size Size of the image used only to initialize the camera intrinsic matrix. + @param K Output 3x3 floating-point camera intrinsic matrix + \f$\cameramatrix{A}\f$ . If + @ref fisheye::CALIB_USE_INTRINSIC_GUESS is specified, some or all of fx, fy, cx, cy must be + initialized before calling the function. + @param D Output vector of distortion coefficients \f$\distcoeffsfisheye\f$. + @param rvecs Output vector of rotation vectors (see Rodrigues ) estimated for each pattern view. + That is, each k-th rotation vector together with the corresponding k-th translation vector (see + the next output parameter description) brings the calibration pattern from the model coordinate + space (in which object points are specified) to the world coordinate space, that is, a real + position of the calibration pattern in the k-th pattern view (k=0.. *M* -1). + @param tvecs Output vector of translation vectors estimated for each pattern view. + @param flags Different flags that may be zero or a combination of the following values: + - @ref fisheye::CALIB_USE_INTRINSIC_GUESS cameraMatrix contains valid initial values of + fx, fy, cx, cy that are optimized further. Otherwise, (cx, cy) is initially set to the image + center ( imageSize is used), and focal distances are computed in a least-squares fashion. + - @ref fisheye::CALIB_RECOMPUTE_EXTRINSIC Extrinsic will be recomputed after each iteration + of intrinsic optimization. + - @ref fisheye::CALIB_CHECK_COND The functions will check validity of condition number. + - @ref fisheye::CALIB_FIX_SKEW Skew coefficient (alpha) is set to zero and stay zero. + - @ref fisheye::CALIB_FIX_K1,..., @ref fisheye::CALIB_FIX_K4 Selected distortion coefficients + are set to zeros and stay zero. + - @ref fisheye::CALIB_FIX_PRINCIPAL_POINT The principal point is not changed during the global +optimization. It stays at the center or at a different location specified when @ref fisheye::CALIB_USE_INTRINSIC_GUESS is set too. + - @ref fisheye::CALIB_FIX_FOCAL_LENGTH The focal length is not changed during the global +optimization. It is the \f$max(width,height)/\pi\f$ or the provided \f$f_x\f$, \f$f_y\f$ when @ref fisheye::CALIB_USE_INTRINSIC_GUESS is set too. + @param criteria Termination criteria for the iterative optimization algorithm. + */ + CV_EXPORTS_W double calibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, const Size& image_size, + InputOutputArray K, InputOutputArray D, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags = 0, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON)); + + /** @brief Stereo rectification for fisheye camera model + + @param K1 First camera intrinsic matrix. + @param D1 First camera distortion parameters. + @param K2 Second camera intrinsic matrix. + @param D2 Second camera distortion parameters. + @param imageSize Size of the image used for stereo calibration. + @param R Rotation matrix between the coordinate systems of the first and the second + cameras. + @param tvec Translation vector between coordinate systems of the cameras. + @param R1 Output 3x3 rectification transform (rotation matrix) for the first camera. + @param R2 Output 3x3 rectification transform (rotation matrix) for the second camera. + @param P1 Output 3x4 projection matrix in the new (rectified) coordinate systems for the first + camera. + @param P2 Output 3x4 projection matrix in the new (rectified) coordinate systems for the second + camera. + @param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see #reprojectImageTo3D ). + @param flags Operation flags that may be zero or @ref fisheye::CALIB_ZERO_DISPARITY . If the flag is set, + the function makes the principal points of each camera have the same pixel coordinates in the + rectified views. And if the flag is not set, the function may still shift the images in the + horizontal or vertical direction (depending on the orientation of epipolar lines) to maximize the + useful image area. + @param newImageSize New image resolution after rectification. The same size should be passed to + #initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) + is passed (default), it is set to the original imageSize . Setting it to larger value can help you + preserve details in the original image, especially when there is a big radial distortion. + @param balance Sets the new focal length in range between the min focal length and the max focal + length. Balance is in range of [0, 1]. + @param fov_scale Divisor for new focal length. + */ + CV_EXPORTS_W void stereoRectify(InputArray K1, InputArray D1, InputArray K2, InputArray D2, const Size &imageSize, InputArray R, InputArray tvec, + OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags, const Size &newImageSize = Size(), + double balance = 0.0, double fov_scale = 1.0); + + /** @brief Performs stereo calibration + + @param objectPoints Vector of vectors of the calibration pattern points. + @param imagePoints1 Vector of vectors of the projections of the calibration pattern points, + observed by the first camera. + @param imagePoints2 Vector of vectors of the projections of the calibration pattern points, + observed by the second camera. + @param K1 Input/output first camera intrinsic matrix: + \f$\vecthreethree{f_x^{(j)}}{0}{c_x^{(j)}}{0}{f_y^{(j)}}{c_y^{(j)}}{0}{0}{1}\f$ , \f$j = 0,\, 1\f$ . If + any of @ref fisheye::CALIB_USE_INTRINSIC_GUESS , @ref fisheye::CALIB_FIX_INTRINSIC are specified, + some or all of the matrix components must be initialized. + @param D1 Input/output vector of distortion coefficients \f$\distcoeffsfisheye\f$ of 4 elements. + @param K2 Input/output second camera intrinsic matrix. The parameter is similar to K1 . + @param D2 Input/output lens distortion coefficients for the second camera. The parameter is + similar to D1 . + @param imageSize Size of the image used only to initialize camera intrinsic matrix. + @param R Output rotation matrix between the 1st and the 2nd camera coordinate systems. + @param T Output translation vector between the coordinate systems of the cameras. + @param rvecs Output vector of rotation vectors ( @ref Rodrigues ) estimated for each pattern view in the + coordinate system of the first camera of the stereo pair (e.g. std::vector). More in detail, each + i-th rotation vector together with the corresponding i-th translation vector (see the next output parameter + description) brings the calibration pattern from the object coordinate space (in which object points are + specified) to the camera coordinate space of the first camera of the stereo pair. In more technical terms, + the tuple of the i-th rotation and translation vector performs a change of basis from object coordinate space + to camera coordinate space of the first camera of the stereo pair. + @param tvecs Output vector of translation vectors estimated for each pattern view, see parameter description + of previous output parameter ( rvecs ). + @param flags Different flags that may be zero or a combination of the following values: + - @ref fisheye::CALIB_FIX_INTRINSIC Fix K1, K2? and D1, D2? so that only R, T matrices + are estimated. + - @ref fisheye::CALIB_USE_INTRINSIC_GUESS K1, K2 contains valid initial values of + fx, fy, cx, cy that are optimized further. Otherwise, (cx, cy) is initially set to the image + center (imageSize is used), and focal distances are computed in a least-squares fashion. + - @ref fisheye::CALIB_RECOMPUTE_EXTRINSIC Extrinsic will be recomputed after each iteration + of intrinsic optimization. + - @ref fisheye::CALIB_CHECK_COND The functions will check validity of condition number. + - @ref fisheye::CALIB_FIX_SKEW Skew coefficient (alpha) is set to zero and stay zero. + - @ref fisheye::CALIB_FIX_K1,..., @ref fisheye::CALIB_FIX_K4 Selected distortion coefficients are set to zeros and stay + zero. + @param criteria Termination criteria for the iterative optimization algorithm. + */ + CV_EXPORTS_W double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, + InputOutputArray K1, InputOutputArray D1, InputOutputArray K2, InputOutputArray D2, Size imageSize, + OutputArray R, OutputArray T, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags = fisheye::CALIB_FIX_INTRINSIC, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON)); + + /// @overload + CV_EXPORTS_W double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, + InputOutputArray K1, InputOutputArray D1, InputOutputArray K2, InputOutputArray D2, Size imageSize, + OutputArray R, OutputArray T, int flags = fisheye::CALIB_FIX_INTRINSIC, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON)); + +//! @} calib3d_fisheye +} // end namespace fisheye + +} //end namespace cv + +#if 0 //def __cplusplus +////////////////////////////////////////////////////////////////////////////////////////// +class CV_EXPORTS CvLevMarq +{ +public: + CvLevMarq(); + CvLevMarq( int nparams, int nerrs, CvTermCriteria criteria= + cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), + bool completeSymmFlag=false ); + ~CvLevMarq(); + void init( int nparams, int nerrs, CvTermCriteria criteria= + cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), + bool completeSymmFlag=false ); + bool update( const CvMat*& param, CvMat*& J, CvMat*& err ); + bool updateAlt( const CvMat*& param, CvMat*& JtJ, CvMat*& JtErr, double*& errNorm ); + + void clear(); + void step(); + enum { DONE=0, STARTED=1, CALC_J=2, CHECK_ERR=3 }; + + cv::Ptr mask; + cv::Ptr prevParam; + cv::Ptr param; + cv::Ptr J; + cv::Ptr err; + cv::Ptr JtJ; + cv::Ptr JtJN; + cv::Ptr JtErr; + cv::Ptr JtJV; + cv::Ptr JtJW; + double prevErrNorm, errNorm; + int lambdaLg10; + CvTermCriteria criteria; + int state; + int iters; + bool completeSymmFlag; + int solveMethod; +}; +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/calib3d/calib3d.hpp b/Thirdparty/opencv2/include/opencv2/calib3d/calib3d.hpp new file mode 100644 index 0000000..b3da45e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/calib3d/calib3d.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/calib3d.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/calib3d/calib3d_c.h b/Thirdparty/opencv2/include/opencv2/calib3d/calib3d_c.h new file mode 100644 index 0000000..e2af07b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/calib3d/calib3d_c.h @@ -0,0 +1,150 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CALIB3D_C_H +#define OPENCV_CALIB3D_C_H + +#include "opencv2/core/types_c.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Calculates fundamental matrix given a set of corresponding points */ +#define CV_FM_7POINT 1 +#define CV_FM_8POINT 2 + +#define CV_LMEDS 4 +#define CV_RANSAC 8 + +#define CV_FM_LMEDS_ONLY CV_LMEDS +#define CV_FM_RANSAC_ONLY CV_RANSAC +#define CV_FM_LMEDS CV_LMEDS +#define CV_FM_RANSAC CV_RANSAC + +enum +{ + CV_ITERATIVE = 0, + CV_EPNP = 1, // F.Moreno-Noguer, V.Lepetit and P.Fua "EPnP: Efficient Perspective-n-Point Camera Pose Estimation" + CV_P3P = 2, // X.S. Gao, X.-R. Hou, J. Tang, H.-F. Chang; "Complete Solution Classification for the Perspective-Three-Point Problem" + CV_DLS = 3 // Joel A. Hesch and Stergios I. Roumeliotis. "A Direct Least-Squares (DLS) Method for PnP" +}; + +#define CV_CALIB_CB_ADAPTIVE_THRESH 1 +#define CV_CALIB_CB_NORMALIZE_IMAGE 2 +#define CV_CALIB_CB_FILTER_QUADS 4 +#define CV_CALIB_CB_FAST_CHECK 8 + +#define CV_CALIB_USE_INTRINSIC_GUESS 1 +#define CV_CALIB_FIX_ASPECT_RATIO 2 +#define CV_CALIB_FIX_PRINCIPAL_POINT 4 +#define CV_CALIB_ZERO_TANGENT_DIST 8 +#define CV_CALIB_FIX_FOCAL_LENGTH 16 +#define CV_CALIB_FIX_K1 32 +#define CV_CALIB_FIX_K2 64 +#define CV_CALIB_FIX_K3 128 +#define CV_CALIB_FIX_K4 2048 +#define CV_CALIB_FIX_K5 4096 +#define CV_CALIB_FIX_K6 8192 +#define CV_CALIB_RATIONAL_MODEL 16384 +#define CV_CALIB_THIN_PRISM_MODEL 32768 +#define CV_CALIB_FIX_S1_S2_S3_S4 65536 +#define CV_CALIB_TILTED_MODEL 262144 +#define CV_CALIB_FIX_TAUX_TAUY 524288 +#define CV_CALIB_FIX_TANGENT_DIST 2097152 + +#define CV_CALIB_NINTRINSIC 18 + +#define CV_CALIB_FIX_INTRINSIC 256 +#define CV_CALIB_SAME_FOCAL_LENGTH 512 + +#define CV_CALIB_ZERO_DISPARITY 1024 + +/* stereo correspondence parameters and functions */ +#define CV_STEREO_BM_NORMALIZED_RESPONSE 0 +#define CV_STEREO_BM_XSOBEL 1 + +#ifdef __cplusplus +} // extern "C" + +////////////////////////////////////////////////////////////////////////////////////////// +class CV_EXPORTS CvLevMarq +{ +public: + CvLevMarq(); + CvLevMarq( int nparams, int nerrs, CvTermCriteria criteria= + cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), + bool completeSymmFlag=false ); + ~CvLevMarq(); + void init( int nparams, int nerrs, CvTermCriteria criteria= + cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,DBL_EPSILON), + bool completeSymmFlag=false ); + bool update( const CvMat*& param, CvMat*& J, CvMat*& err ); + bool updateAlt( const CvMat*& param, CvMat*& JtJ, CvMat*& JtErr, double*& errNorm ); + + void clear(); + void step(); + enum { DONE=0, STARTED=1, CALC_J=2, CHECK_ERR=3 }; + + cv::Ptr mask; + cv::Ptr prevParam; + cv::Ptr param; + cv::Ptr J; + cv::Ptr err; + cv::Ptr JtJ; + cv::Ptr JtJN; + cv::Ptr JtErr; + cv::Ptr JtJV; + cv::Ptr JtJW; + double prevErrNorm, errNorm; + int lambdaLg10; + CvTermCriteria criteria; + int state; + int iters; + bool completeSymmFlag; + int solveMethod; +}; + +#endif + +#endif /* OPENCV_CALIB3D_C_H */ diff --git a/Thirdparty/opencv2/include/opencv2/core.hpp b/Thirdparty/opencv2/include/opencv2/core.hpp new file mode 100644 index 0000000..3cd5901 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core.hpp @@ -0,0 +1,3396 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2015, Intel Corporation, all rights reserved. +// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. +// Copyright (C) 2015, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_HPP +#define OPENCV_CORE_HPP + +#ifndef __cplusplus +# error core.hpp header must be compiled as C++ +#endif + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/base.hpp" +#include "opencv2/core/cvstd.hpp" +#include "opencv2/core/traits.hpp" +#include "opencv2/core/matx.hpp" +#include "opencv2/core/types.hpp" +#include "opencv2/core/mat.hpp" +#include "opencv2/core/persistence.hpp" + +/** +@defgroup core Core functionality +@{ + @defgroup core_basic Basic structures + @defgroup core_c C structures and operations + @{ + @defgroup core_c_glue Connections with C++ + @} + @defgroup core_array Operations on arrays + @defgroup core_async Asynchronous API + @defgroup core_xml XML/YAML Persistence + @defgroup core_cluster Clustering + @defgroup core_utils Utility and system functions and macros + @{ + @defgroup core_logging Logging facilities + @defgroup core_utils_sse SSE utilities + @defgroup core_utils_neon NEON utilities + @defgroup core_utils_vsx VSX utilities + @defgroup core_utils_softfloat Softfloat support + @defgroup core_utils_samples Utility functions for OpenCV samples + @} + @defgroup core_opengl OpenGL interoperability + @defgroup core_ipp Intel IPP Asynchronous C/C++ Converters + @defgroup core_optim Optimization Algorithms + @defgroup core_directx DirectX interoperability + @defgroup core_eigen Eigen support + @defgroup core_opencl OpenCL support + @defgroup core_va_intel Intel VA-API/OpenCL (CL-VA) interoperability + @defgroup core_hal Hardware Acceleration Layer + @{ + @defgroup core_hal_functions Functions + @defgroup core_hal_interface Interface + @defgroup core_hal_intrin Universal intrinsics + @{ + @defgroup core_hal_intrin_impl Private implementation helpers + @} + @defgroup core_lowlevel_api Low-level API for external libraries / plugins + @} + @defgroup core_parallel Parallel Processing + @{ + @defgroup core_parallel_backend Parallel backends API + @} +@} + */ + +namespace cv { + +//! @addtogroup core_utils +//! @{ + +/*! @brief Class passed to an error. + +This class encapsulates all or almost all necessary +information about the error happened in the program. The exception is +usually constructed and thrown implicitly via CV_Error and CV_Error_ macros. +@see error + */ +class CV_EXPORTS Exception : public std::exception +{ +public: + /*! + Default constructor + */ + Exception(); + /*! + Full constructor. Normally the constructor is not called explicitly. + Instead, the macros CV_Error(), CV_Error_() and CV_Assert() are used. + */ + Exception(int _code, const String& _err, const String& _func, const String& _file, int _line); + virtual ~Exception() throw(); + + /*! + \return the error description and the context as a text string. + */ + virtual const char *what() const throw() CV_OVERRIDE; + void formatMessage(); + + String msg; ///< the formatted error message + + int code; ///< error code @see CVStatus + String err; ///< error description + String func; ///< function name. Available only when the compiler supports getting it + String file; ///< source file name where the error has occurred + int line; ///< line number in the source file where the error has occurred +}; + +/*! @brief Signals an error and raises the exception. + +By default the function prints information about the error to stderr, +then it either stops if cv::setBreakOnError() had been called before or raises the exception. +It is possible to alternate error processing by using #redirectError(). +@param exc the exception raisen. +@deprecated drop this version + */ +CV_EXPORTS CV_NORETURN void error(const Exception& exc); + +enum SortFlags { SORT_EVERY_ROW = 0, //!< each matrix row is sorted independently + SORT_EVERY_COLUMN = 1, //!< each matrix column is sorted + //!< independently; this flag and the previous one are + //!< mutually exclusive. + SORT_ASCENDING = 0, //!< each matrix row is sorted in the ascending + //!< order. + SORT_DESCENDING = 16 //!< each matrix row is sorted in the + //!< descending order; this flag and the previous one are also + //!< mutually exclusive. + }; + +//! @} core_utils + +//! @addtogroup core +//! @{ + +//! Covariation flags +enum CovarFlags { + /** The output covariance matrix is calculated as: + \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...],\f] + The covariance matrix will be nsamples x nsamples. Such an unusual covariance matrix is used + for fast PCA of a set of very large vectors (see, for example, the EigenFaces technique for + face recognition). Eigenvalues of this "scrambled" matrix match the eigenvalues of the true + covariance matrix. The "true" eigenvectors can be easily calculated from the eigenvectors of + the "scrambled" covariance matrix. */ + COVAR_SCRAMBLED = 0, + /**The output covariance matrix is calculated as: + \f[\texttt{scale} \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...] \cdot [ \texttt{vects} [0]- \texttt{mean} , \texttt{vects} [1]- \texttt{mean} ,...]^T,\f] + covar will be a square matrix of the same size as the total number of elements in each input + vector. One and only one of #COVAR_SCRAMBLED and #COVAR_NORMAL must be specified.*/ + COVAR_NORMAL = 1, + /** If the flag is specified, the function does not calculate mean from + the input vectors but, instead, uses the passed mean vector. This is useful if mean has been + pre-calculated or known in advance, or if the covariance matrix is calculated by parts. In + this case, mean is not a mean vector of the input sub-set of vectors but rather the mean + vector of the whole set.*/ + COVAR_USE_AVG = 2, + /** If the flag is specified, the covariance matrix is scaled. In the + "normal" mode, scale is 1./nsamples . In the "scrambled" mode, scale is the reciprocal of the + total number of elements in each input vector. By default (if the flag is not specified), the + covariance matrix is not scaled ( scale=1 ).*/ + COVAR_SCALE = 4, + /** If the flag is + specified, all the input vectors are stored as rows of the samples matrix. mean should be a + single-row vector in this case.*/ + COVAR_ROWS = 8, + /** If the flag is + specified, all the input vectors are stored as columns of the samples matrix. mean should be a + single-column vector in this case.*/ + COVAR_COLS = 16 +}; + +//! @addtogroup core_cluster +//! @{ + +//! k-Means flags +enum KmeansFlags { + /** Select random initial centers in each attempt.*/ + KMEANS_RANDOM_CENTERS = 0, + /** Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].*/ + KMEANS_PP_CENTERS = 2, + /** During the first (and possibly the only) attempt, use the + user-supplied labels instead of computing them from the initial centers. For the second and + further attempts, use the random or semi-random centers. Use one of KMEANS_\*_CENTERS flag + to specify the exact method.*/ + KMEANS_USE_INITIAL_LABELS = 1 +}; + +//! @} core_cluster + +//! @addtogroup core_array +//! @{ + +enum ReduceTypes { REDUCE_SUM = 0, //!< the output is the sum of all rows/columns of the matrix. + REDUCE_AVG = 1, //!< the output is the mean vector of all rows/columns of the matrix. + REDUCE_MAX = 2, //!< the output is the maximum (column/row-wise) of all rows/columns of the matrix. + REDUCE_MIN = 3, //!< the output is the minimum (column/row-wise) of all rows/columns of the matrix. + REDUCE_SUM2 = 4 //!< the output is the sum of all squared rows/columns of the matrix. + }; + +//! @} core_array + +/** @brief Swaps two matrices +*/ +CV_EXPORTS void swap(Mat& a, Mat& b); +/** @overload */ +CV_EXPORTS void swap( UMat& a, UMat& b ); + +//! @} core + +//! @addtogroup core_array +//! @{ + +/** @brief Computes the source location of an extrapolated pixel. + +The function computes and returns the coordinate of a donor pixel corresponding to the specified +extrapolated pixel when using the specified extrapolation border mode. For example, if you use +cv::BORDER_WRAP mode in the horizontal direction, cv::BORDER_REFLECT_101 in the vertical direction and +want to compute value of the "virtual" pixel Point(-5, 100) in a floating-point image img , it +looks like: +@code{.cpp} + float val = img.at(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101), + borderInterpolate(-5, img.cols, cv::BORDER_WRAP)); +@endcode +Normally, the function is not called directly. It is used inside filtering functions and also in +copyMakeBorder. +@param p 0-based coordinate of the extrapolated pixel along one of the axes, likely \<0 or \>= len +@param len Length of the array along the corresponding axis. +@param borderType Border type, one of the #BorderTypes, except for #BORDER_TRANSPARENT and +#BORDER_ISOLATED . When borderType==#BORDER_CONSTANT , the function always returns -1, regardless +of p and len. + +@sa copyMakeBorder +*/ +CV_EXPORTS_W int borderInterpolate(int p, int len, int borderType); + +/** @example samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp +An example using copyMakeBorder function. +Check @ref tutorial_copyMakeBorder "the corresponding tutorial" for more details +*/ + +/** @brief Forms a border around an image. + +The function copies the source image into the middle of the destination image. The areas to the +left, to the right, above and below the copied source image will be filled with extrapolated +pixels. This is not what filtering functions based on it do (they extrapolate pixels on-fly), but +what other more complex functions, including your own, may do to simplify image boundary handling. + +The function supports the mode when src is already in the middle of dst . In this case, the +function does not copy src itself but simply constructs the border, for example: + +@code{.cpp} + // let border be the same in all directions + int border=2; + // constructs a larger image to fit both the image and the border + Mat gray_buf(rgb.rows + border*2, rgb.cols + border*2, rgb.depth()); + // select the middle part of it w/o copying data + Mat gray(gray_canvas, Rect(border, border, rgb.cols, rgb.rows)); + // convert image from RGB to grayscale + cvtColor(rgb, gray, COLOR_RGB2GRAY); + // form a border in-place + copyMakeBorder(gray, gray_buf, border, border, + border, border, BORDER_REPLICATE); + // now do some custom filtering ... + ... +@endcode +@note When the source image is a part (ROI) of a bigger image, the function will try to use the +pixels outside of the ROI to form a border. To disable this feature and always do extrapolation, as +if src was not a ROI, use borderType | #BORDER_ISOLATED. + +@param src Source image. +@param dst Destination image of the same type as src and the size Size(src.cols+left+right, +src.rows+top+bottom) . +@param top the top pixels +@param bottom the bottom pixels +@param left the left pixels +@param right Parameter specifying how many pixels in each direction from the source image rectangle +to extrapolate. For example, top=1, bottom=1, left=1, right=1 mean that 1 pixel-wide border needs +to be built. +@param borderType Border type. See borderInterpolate for details. +@param value Border value if borderType==BORDER_CONSTANT . + +@sa borderInterpolate +*/ +CV_EXPORTS_W void copyMakeBorder(InputArray src, OutputArray dst, + int top, int bottom, int left, int right, + int borderType, const Scalar& value = Scalar() ); + +/** @brief Calculates the per-element sum of two arrays or an array and a scalar. + +The function add calculates: +- Sum of two arrays when both input arrays have the same size and the same number of channels: +\f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f] +- Sum of an array and a scalar when src2 is constructed from Scalar or has the same number of +elements as `src1.channels()`: +\f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) + \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f] +- Sum of a scalar and an array when src1 is constructed from Scalar or has the same number of +elements as `src2.channels()`: +\f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1} + \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f] +where `I` is a multi-dimensional index of array elements. In case of multi-channel arrays, each +channel is processed independently. + +The first function in the list above can be replaced with matrix expressions: +@code{.cpp} + dst = src1 + src2; + dst += src1; // equivalent to add(dst, src1, dst); +@endcode +The input arrays and the output array can all have the same or different depths. For example, you +can add a 16-bit unsigned array to a 8-bit signed array and store the sum as a 32-bit +floating-point array. Depth of the output array is determined by the dtype parameter. In the second +and third cases above, as well as in the first case, when src1.depth() == src2.depth(), dtype can +be set to the default -1. In this case, the output array will have the same depth as the input +array, be it src1, src2 or both. +@note Saturation is not applied when the output array has the depth CV_32S. You may even get +result of an incorrect sign in the case of overflow. +@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array. +`add(src,X)` means `add(src,(X,X,X,X))`. +`add(src,(X,))` means `add(src,(X,0,0,0))`. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array that has the same size and number of channels as the input array(s); the +depth is defined by dtype or src1/src2. +@param mask optional operation mask - 8-bit single channel array, that specifies elements of the +output array to be changed. +@param dtype optional depth of the output array (see the discussion below). +@sa subtract, addWeighted, scaleAdd, Mat::convertTo +*/ +CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst, + InputArray mask = noArray(), int dtype = -1); + +/** @brief Calculates the per-element difference between two arrays or array and a scalar. + +The function subtract calculates: +- Difference between two arrays, when both input arrays have the same size and the same number of +channels: + \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) - \texttt{src2}(I)) \quad \texttt{if mask}(I) \ne0\f] +- Difference between an array and a scalar, when src2 is constructed from Scalar or has the same +number of elements as `src1.channels()`: + \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1}(I) - \texttt{src2} ) \quad \texttt{if mask}(I) \ne0\f] +- Difference between a scalar and an array, when src1 is constructed from Scalar or has the same +number of elements as `src2.channels()`: + \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src1} - \texttt{src2}(I) ) \quad \texttt{if mask}(I) \ne0\f] +- The reverse difference between a scalar and an array in the case of `SubRS`: + \f[\texttt{dst}(I) = \texttt{saturate} ( \texttt{src2} - \texttt{src1}(I) ) \quad \texttt{if mask}(I) \ne0\f] +where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each +channel is processed independently. + +The first function in the list above can be replaced with matrix expressions: +@code{.cpp} + dst = src1 - src2; + dst -= src1; // equivalent to subtract(dst, src1, dst); +@endcode +The input arrays and the output array can all have the same or different depths. For example, you +can subtract to 8-bit unsigned arrays and store the difference in a 16-bit signed array. Depth of +the output array is determined by dtype parameter. In the second and third cases above, as well as +in the first case, when src1.depth() == src2.depth(), dtype can be set to the default -1. In this +case the output array will have the same depth as the input array, be it src1, src2 or both. +@note Saturation is not applied when the output array has the depth CV_32S. You may even get +result of an incorrect sign in the case of overflow. +@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array. +`subtract(src,X)` means `subtract(src,(X,X,X,X))`. +`subtract(src,(X,))` means `subtract(src,(X,0,0,0))`. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array of the same size and the same number of channels as the input array. +@param mask optional operation mask; this is an 8-bit single channel array that specifies elements +of the output array to be changed. +@param dtype optional depth of the output array +@sa add, addWeighted, scaleAdd, Mat::convertTo + */ +CV_EXPORTS_W void subtract(InputArray src1, InputArray src2, OutputArray dst, + InputArray mask = noArray(), int dtype = -1); + + +/** @brief Calculates the per-element scaled product of two arrays. + +The function multiply calculates the per-element product of two arrays: + +\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{scale} \cdot \texttt{src1} (I) \cdot \texttt{src2} (I))\f] + +There is also a @ref MatrixExpressions -friendly variant of the first function. See Mat::mul . + +For a not-per-element matrix product, see gemm . + +@note Saturation is not applied when the output array has the depth +CV_32S. You may even get result of an incorrect sign in the case of +overflow. +@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array. +`multiply(src,X)` means `multiply(src,(X,X,X,X))`. +`multiply(src,(X,))` means `multiply(src,(X,0,0,0))`. +@param src1 first input array. +@param src2 second input array of the same size and the same type as src1. +@param dst output array of the same size and type as src1. +@param scale optional scale factor. +@param dtype optional depth of the output array +@sa add, subtract, divide, scaleAdd, addWeighted, accumulate, accumulateProduct, accumulateSquare, +Mat::convertTo +*/ +CV_EXPORTS_W void multiply(InputArray src1, InputArray src2, + OutputArray dst, double scale = 1, int dtype = -1); + +/** @brief Performs per-element division of two arrays or a scalar by an array. + +The function cv::divide divides one array by another: +\f[\texttt{dst(I) = saturate(src1(I)*scale/src2(I))}\f] +or a scalar by an array when there is no src1 : +\f[\texttt{dst(I) = saturate(scale/src2(I))}\f] + +Different channels of multi-channel arrays are processed independently. + +For integer types when src2(I) is zero, dst(I) will also be zero. + +@note In case of floating point data there is no special defined behavior for zero src2(I) values. +Regular floating-point division is used. +Expect correct IEEE-754 behaviour for floating-point data (with NaN, Inf result values). + +@note Saturation is not applied when the output array has the depth CV_32S. You may even get +result of an incorrect sign in the case of overflow. +@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array. +`divide(src,X)` means `divide(src,(X,X,X,X))`. +`divide(src,(X,))` means `divide(src,(X,0,0,0))`. +@param src1 first input array. +@param src2 second input array of the same size and type as src1. +@param scale scalar factor. +@param dst output array of the same size and type as src2. +@param dtype optional depth of the output array; if -1, dst will have depth src2.depth(), but in +case of an array-by-array division, you can only pass -1 when src1.depth()==src2.depth(). +@sa multiply, add, subtract +*/ +CV_EXPORTS_W void divide(InputArray src1, InputArray src2, OutputArray dst, + double scale = 1, int dtype = -1); + +/** @overload */ +CV_EXPORTS_W void divide(double scale, InputArray src2, + OutputArray dst, int dtype = -1); + +/** @brief Calculates the sum of a scaled array and another array. + +The function scaleAdd is one of the classical primitive linear algebra operations, known as DAXPY +or SAXPY in [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms). It calculates +the sum of a scaled array and another array: +\f[\texttt{dst} (I)= \texttt{scale} \cdot \texttt{src1} (I) + \texttt{src2} (I)\f] +The function can also be emulated with a matrix expression, for example: +@code{.cpp} + Mat A(3, 3, CV_64F); + ... + A.row(0) = A.row(1)*2 + A.row(2); +@endcode +@param src1 first input array. +@param alpha scale factor for the first array. +@param src2 second input array of the same size and type as src1. +@param dst output array of the same size and type as src1. +@sa add, addWeighted, subtract, Mat::dot, Mat::convertTo +*/ +CV_EXPORTS_W void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst); + +/** @example samples/cpp/tutorial_code/HighGUI/AddingImagesTrackbar.cpp +Check @ref tutorial_trackbar "the corresponding tutorial" for more details +*/ + +/** @brief Calculates the weighted sum of two arrays. + +The function addWeighted calculates the weighted sum of two arrays as follows: +\f[\texttt{dst} (I)= \texttt{saturate} ( \texttt{src1} (I)* \texttt{alpha} + \texttt{src2} (I)* \texttt{beta} + \texttt{gamma} )\f] +where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each +channel is processed independently. +The function can be replaced with a matrix expression: +@code{.cpp} + dst = src1*alpha + src2*beta + gamma; +@endcode +@note Saturation is not applied when the output array has the depth CV_32S. You may even get +result of an incorrect sign in the case of overflow. +@param src1 first input array. +@param alpha weight of the first array elements. +@param src2 second input array of the same size and channel number as src1. +@param beta weight of the second array elements. +@param gamma scalar added to each sum. +@param dst output array that has the same size and number of channels as the input arrays. +@param dtype optional depth of the output array; when both input arrays have the same depth, dtype +can be set to -1, which will be equivalent to src1.depth(). +@sa add, subtract, scaleAdd, Mat::convertTo +*/ +CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, + double beta, double gamma, OutputArray dst, int dtype = -1); + +/** @brief Scales, calculates absolute values, and converts the result to 8-bit. + +On each element of the input array, the function convertScaleAbs +performs three operations sequentially: scaling, taking an absolute +value, conversion to an unsigned 8-bit type: +\f[\texttt{dst} (I)= \texttt{saturate\_cast} (| \texttt{src} (I)* \texttt{alpha} + \texttt{beta} |)\f] +In case of multi-channel arrays, the function processes each channel +independently. When the output is not 8-bit, the operation can be +emulated by calling the Mat::convertTo method (or by using matrix +expressions) and then by calculating an absolute value of the result. +For example: +@code{.cpp} + Mat_ A(30,30); + randu(A, Scalar(-100), Scalar(100)); + Mat_ B = A*5 + 3; + B = abs(B); + // Mat_ B = abs(A*5+3) will also do the job, + // but it will allocate a temporary matrix +@endcode +@param src input array. +@param dst output array. +@param alpha optional scale factor. +@param beta optional delta added to the scaled values. +@sa Mat::convertTo, cv::abs(const Mat&) +*/ +CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst, + double alpha = 1, double beta = 0); + +/** @brief Converts an array to half precision floating number. + +This function converts FP32 (single precision floating point) from/to FP16 (half precision floating point). CV_16S format is used to represent FP16 data. +There are two use modes (src -> dst): CV_32F -> CV_16S and CV_16S -> CV_32F. The input array has to have type of CV_32F or +CV_16S to represent the bit depth. If the input array is neither of them, the function will raise an error. +The format of half precision floating point is defined in IEEE 754-2008. + +@param src input array. +@param dst output array. +*/ +CV_EXPORTS_W void convertFp16(InputArray src, OutputArray dst); + +/** @brief Performs a look-up table transform of an array. + +The function LUT fills the output array with values from the look-up table. Indices of the entries +are taken from the input array. That is, the function processes each element of src as follows: +\f[\texttt{dst} (I) \leftarrow \texttt{lut(src(I) + d)}\f] +where +\f[d = \fork{0}{if \(\texttt{src}\) has depth \(\texttt{CV_8U}\)}{128}{if \(\texttt{src}\) has depth \(\texttt{CV_8S}\)}\f] +@param src input array of 8-bit elements. +@param lut look-up table of 256 elements; in case of multi-channel input array, the table should +either have a single channel (in this case the same table is used for all channels) or the same +number of channels as in the input array. +@param dst output array of the same size and number of channels as src, and the same depth as lut. +@sa convertScaleAbs, Mat::convertTo +*/ +CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst); + +/** @brief Calculates the sum of array elements. + +The function cv::sum calculates and returns the sum of array elements, +independently for each channel. +@param src input array that must have from 1 to 4 channels. +@sa countNonZero, mean, meanStdDev, norm, minMaxLoc, reduce +*/ +CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src); + +/** @brief Checks for the presence of at least one non-zero array element. + +The function returns whether there are non-zero elements in src +@param src single-channel array. +@sa mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix +*/ +CV_EXPORTS_W bool hasNonZero( InputArray src ); + +/** @brief Counts non-zero array elements. + +The function returns the number of non-zero elements in src : +\f[\sum _{I: \; \texttt{src} (I) \ne0 } 1\f] +@param src single-channel array. +@sa mean, meanStdDev, norm, minMaxLoc, calcCovarMatrix +*/ +CV_EXPORTS_W int countNonZero( InputArray src ); + +/** @brief Returns the list of locations of non-zero pixels + +Given a binary matrix (likely returned from an operation such +as threshold(), compare(), >, ==, etc, return all of +the non-zero indices as a cv::Mat or std::vector (x,y) +For example: +@code{.cpp} + cv::Mat binaryImage; // input, binary image + cv::Mat locations; // output, locations of non-zero pixels + cv::findNonZero(binaryImage, locations); + + // access pixel coordinates + Point pnt = locations.at(i); +@endcode +or +@code{.cpp} + cv::Mat binaryImage; // input, binary image + vector locations; // output, locations of non-zero pixels + cv::findNonZero(binaryImage, locations); + + // access pixel coordinates + Point pnt = locations[i]; +@endcode +@param src single-channel array +@param idx the output array, type of cv::Mat or std::vector, corresponding to non-zero indices in the input +*/ +CV_EXPORTS_W void findNonZero( InputArray src, OutputArray idx ); + +/** @brief Calculates an average (mean) of array elements. + +The function cv::mean calculates the mean value M of array elements, +independently for each channel, and return it: +\f[\begin{array}{l} N = \sum _{I: \; \texttt{mask} (I) \ne 0} 1 \\ M_c = \left ( \sum _{I: \; \texttt{mask} (I) \ne 0}{ \texttt{mtx} (I)_c} \right )/N \end{array}\f] +When all the mask elements are 0's, the function returns Scalar::all(0) +@param src input array that should have from 1 to 4 channels so that the result can be stored in +Scalar_ . +@param mask optional operation mask. +@sa countNonZero, meanStdDev, norm, minMaxLoc +*/ +CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask = noArray()); + +/** Calculates a mean and standard deviation of array elements. + +The function cv::meanStdDev calculates the mean and the standard deviation M +of array elements independently for each channel and returns it via the +output parameters: +\f[\begin{array}{l} N = \sum _{I, \texttt{mask} (I) \ne 0} 1 \\ \texttt{mean} _c = \frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \texttt{src} (I)_c}{N} \\ \texttt{stddev} _c = \sqrt{\frac{\sum_{ I: \; \texttt{mask}(I) \ne 0} \left ( \texttt{src} (I)_c - \texttt{mean} _c \right )^2}{N}} \end{array}\f] +When all the mask elements are 0's, the function returns +mean=stddev=Scalar::all(0). +@note The calculated standard deviation is only the diagonal of the +complete normalized covariance matrix. If the full matrix is needed, you +can reshape the multi-channel array M x N to the single-channel array +M\*N x mtx.channels() (only possible when the matrix is continuous) and +then pass the matrix to calcCovarMatrix . +@param src input array that should have from 1 to 4 channels so that the results can be stored in +Scalar_ 's. +@param mean output parameter: calculated mean value. +@param stddev output parameter: calculated standard deviation. +@param mask optional operation mask. +@sa countNonZero, mean, norm, minMaxLoc, calcCovarMatrix +*/ +CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, + InputArray mask=noArray()); + +/** @brief Calculates the absolute norm of an array. + +This version of #norm calculates the absolute norm of src1. The type of norm to calculate is specified using #NormTypes. + +As example for one array consider the function \f$r(x)= \begin{pmatrix} x \\ 1-x \end{pmatrix}, x \in [-1;1]\f$. +The \f$ L_{1}, L_{2} \f$ and \f$ L_{\infty} \f$ norm for the sample value \f$r(-1) = \begin{pmatrix} -1 \\ 2 \end{pmatrix}\f$ +is calculated as follows +\f{align*} + \| r(-1) \|_{L_1} &= |-1| + |2| = 3 \\ + \| r(-1) \|_{L_2} &= \sqrt{(-1)^{2} + (2)^{2}} = \sqrt{5} \\ + \| r(-1) \|_{L_\infty} &= \max(|-1|,|2|) = 2 +\f} +and for \f$r(0.5) = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix}\f$ the calculation is +\f{align*} + \| r(0.5) \|_{L_1} &= |0.5| + |0.5| = 1 \\ + \| r(0.5) \|_{L_2} &= \sqrt{(0.5)^{2} + (0.5)^{2}} = \sqrt{0.5} \\ + \| r(0.5) \|_{L_\infty} &= \max(|0.5|,|0.5|) = 0.5. +\f} +The following graphic shows all values for the three norm functions \f$\| r(x) \|_{L_1}, \| r(x) \|_{L_2}\f$ and \f$\| r(x) \|_{L_\infty}\f$. +It is notable that the \f$ L_{1} \f$ norm forms the upper and the \f$ L_{\infty} \f$ norm forms the lower border for the example function \f$ r(x) \f$. +![Graphs for the different norm functions from the above example](pics/NormTypes_OneArray_1-2-INF.png) + +When the mask parameter is specified and it is not empty, the norm is + +If normType is not specified, #NORM_L2 is used. +calculated only over the region specified by the mask. + +Multi-channel input arrays are treated as single-channel arrays, that is, +the results for all channels are combined. + +Hamming norms can only be calculated with CV_8U depth arrays. + +@param src1 first input array. +@param normType type of the norm (see #NormTypes). +@param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type. +*/ +CV_EXPORTS_W double norm(InputArray src1, int normType = NORM_L2, InputArray mask = noArray()); + +/** @brief Calculates an absolute difference norm or a relative difference norm. + +This version of cv::norm calculates the absolute difference norm +or the relative difference norm of arrays src1 and src2. +The type of norm to calculate is specified using #NormTypes. + +@param src1 first input array. +@param src2 second input array of the same size and the same type as src1. +@param normType type of the norm (see #NormTypes). +@param mask optional operation mask; it must have the same size as src1 and CV_8UC1 type. +*/ +CV_EXPORTS_W double norm(InputArray src1, InputArray src2, + int normType = NORM_L2, InputArray mask = noArray()); +/** @overload +@param src first input array. +@param normType type of the norm (see #NormTypes). +*/ +CV_EXPORTS double norm( const SparseMat& src, int normType ); + +/** @brief Computes the Peak Signal-to-Noise Ratio (PSNR) image quality metric. + +This function calculates the Peak Signal-to-Noise Ratio (PSNR) image quality metric in decibels (dB), +between two input arrays src1 and src2. The arrays must have the same type. + +The PSNR is calculated as follows: + +\f[ +\texttt{PSNR} = 10 \cdot \log_{10}{\left( \frac{R^2}{MSE} \right) } +\f] + +where R is the maximum integer value of depth (e.g. 255 in the case of CV_8U data) +and MSE is the mean squared error between the two arrays. + +@param src1 first input array. +@param src2 second input array of the same size as src1. +@param R the maximum pixel value (255 by default) + + */ +CV_EXPORTS_W double PSNR(InputArray src1, InputArray src2, double R=255.); + +/** @brief naive nearest neighbor finder + +see http://en.wikipedia.org/wiki/Nearest_neighbor_search +@todo document + */ +CV_EXPORTS_W void batchDistance(InputArray src1, InputArray src2, + OutputArray dist, int dtype, OutputArray nidx, + int normType = NORM_L2, int K = 0, + InputArray mask = noArray(), int update = 0, + bool crosscheck = false); + +/** @brief Normalizes the norm or value range of an array. + +The function cv::normalize normalizes scale and shift the input array elements so that +\f[\| \texttt{dst} \| _{L_p}= \texttt{alpha}\f] +(where p=Inf, 1 or 2) when normType=NORM_INF, NORM_L1, or NORM_L2, respectively; or so that +\f[\min _I \texttt{dst} (I)= \texttt{alpha} , \, \, \max _I \texttt{dst} (I)= \texttt{beta}\f] + +when normType=NORM_MINMAX (for dense arrays only). The optional mask specifies a sub-array to be +normalized. This means that the norm or min-n-max are calculated over the sub-array, and then this +sub-array is modified to be normalized. If you want to only use the mask to calculate the norm or +min-max but modify the whole array, you can use norm and Mat::convertTo. + +In case of sparse matrices, only the non-zero values are analyzed and transformed. Because of this, +the range transformation for sparse matrices is not allowed since it can shift the zero level. + +Possible usage with some positive example data: +@code{.cpp} + vector positiveData = { 2.0, 8.0, 10.0 }; + vector normalizedData_l1, normalizedData_l2, normalizedData_inf, normalizedData_minmax; + + // Norm to probability (total count) + // sum(numbers) = 20.0 + // 2.0 0.1 (2.0/20.0) + // 8.0 0.4 (8.0/20.0) + // 10.0 0.5 (10.0/20.0) + normalize(positiveData, normalizedData_l1, 1.0, 0.0, NORM_L1); + + // Norm to unit vector: ||positiveData|| = 1.0 + // 2.0 0.15 + // 8.0 0.62 + // 10.0 0.77 + normalize(positiveData, normalizedData_l2, 1.0, 0.0, NORM_L2); + + // Norm to max element + // 2.0 0.2 (2.0/10.0) + // 8.0 0.8 (8.0/10.0) + // 10.0 1.0 (10.0/10.0) + normalize(positiveData, normalizedData_inf, 1.0, 0.0, NORM_INF); + + // Norm to range [0.0;1.0] + // 2.0 0.0 (shift to left border) + // 8.0 0.75 (6.0/8.0) + // 10.0 1.0 (shift to right border) + normalize(positiveData, normalizedData_minmax, 1.0, 0.0, NORM_MINMAX); +@endcode + +@param src input array. +@param dst output array of the same size as src . +@param alpha norm value to normalize to or the lower range boundary in case of the range +normalization. +@param beta upper range boundary in case of the range normalization; it is not used for the norm +normalization. +@param norm_type normalization type (see cv::NormTypes). +@param dtype when negative, the output array has the same type as src; otherwise, it has the same +number of channels as src and the depth =CV_MAT_DEPTH(dtype). +@param mask optional operation mask. +@sa norm, Mat::convertTo, SparseMat::convertTo +*/ +CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0, + int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray()); + +/** @overload +@param src input array. +@param dst output array of the same size as src . +@param alpha norm value to normalize to or the lower range boundary in case of the range +normalization. +@param normType normalization type (see cv::NormTypes). +*/ +CV_EXPORTS void normalize( const SparseMat& src, SparseMat& dst, double alpha, int normType ); + +/** @brief Finds the global minimum and maximum in an array. + +The function cv::minMaxLoc finds the minimum and maximum element values and their positions. The +extremums are searched across the whole array or, if mask is not an empty array, in the specified +array region. + +The function do not work with multi-channel arrays. If you need to find minimum or maximum +elements across all the channels, use Mat::reshape first to reinterpret the array as +single-channel. Or you may extract the particular channel using either extractImageCOI , or +mixChannels , or split . +@param src input single-channel array. +@param minVal pointer to the returned minimum value; NULL is used if not required. +@param maxVal pointer to the returned maximum value; NULL is used if not required. +@param minLoc pointer to the returned minimum location (in 2D case); NULL is used if not required. +@param maxLoc pointer to the returned maximum location (in 2D case); NULL is used if not required. +@param mask optional mask used to select a sub-array. +@sa max, min, reduceArgMin, reduceArgMax, compare, inRange, extractImageCOI, mixChannels, split, Mat::reshape +*/ +CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, + CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0, + CV_OUT Point* maxLoc = 0, InputArray mask = noArray()); + +/** + * @brief Finds indices of min elements along provided axis + * + * @note + * - If input or output array is not continuous, this function will create an internal copy. + * - NaN handling is left unspecified, see patchNaNs(). + * - The returned index is always in bounds of input matrix. + * + * @param src input single-channel array. + * @param dst output array of type CV_32SC1 with the same dimensionality as src, + * except for axis being reduced - it should be set to 1. + * @param lastIndex whether to get the index of first or last occurrence of min. + * @param axis axis to reduce along. + * @sa reduceArgMax, minMaxLoc, min, max, compare, reduce + */ +CV_EXPORTS_W void reduceArgMin(InputArray src, OutputArray dst, int axis, bool lastIndex = false); + +/** + * @brief Finds indices of max elements along provided axis + * + * @note + * - If input or output array is not continuous, this function will create an internal copy. + * - NaN handling is left unspecified, see patchNaNs(). + * - The returned index is always in bounds of input matrix. + * + * @param src input single-channel array. + * @param dst output array of type CV_32SC1 with the same dimensionality as src, + * except for axis being reduced - it should be set to 1. + * @param lastIndex whether to get the index of first or last occurrence of max. + * @param axis axis to reduce along. + * @sa reduceArgMin, minMaxLoc, min, max, compare, reduce + */ +CV_EXPORTS_W void reduceArgMax(InputArray src, OutputArray dst, int axis, bool lastIndex = false); + +/** @brief Finds the global minimum and maximum in an array + +The function cv::minMaxIdx finds the minimum and maximum element values and their positions. The +extremums are searched across the whole array or, if mask is not an empty array, in the specified +array region. The function does not work with multi-channel arrays. If you need to find minimum or +maximum elements across all the channels, use Mat::reshape first to reinterpret the array as +single-channel. Or you may extract the particular channel using either extractImageCOI , or +mixChannels , or split . In case of a sparse matrix, the minimum is found among non-zero elements +only. +@note When minIdx is not NULL, it must have at least 2 elements (as well as maxIdx), even if src is +a single-row or single-column matrix. In OpenCV (following MATLAB) each array has at least 2 +dimensions, i.e. single-column matrix is Mx1 matrix (and therefore minIdx/maxIdx will be +(i1,0)/(i2,0)) and single-row matrix is 1xN matrix (and therefore minIdx/maxIdx will be +(0,j1)/(0,j2)). +@param src input single-channel array. +@param minVal pointer to the returned minimum value; NULL is used if not required. +@param maxVal pointer to the returned maximum value; NULL is used if not required. +@param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required; +Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element +in each dimension are stored there sequentially. +@param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required. +@param mask specified array region +*/ +CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal = 0, + int* minIdx = 0, int* maxIdx = 0, InputArray mask = noArray()); + +/** @overload +@param a input single-channel array. +@param minVal pointer to the returned minimum value; NULL is used if not required. +@param maxVal pointer to the returned maximum value; NULL is used if not required. +@param minIdx pointer to the returned minimum location (in nD case); NULL is used if not required; +Otherwise, it must point to an array of src.dims elements, the coordinates of the minimum element +in each dimension are stored there sequentially. +@param maxIdx pointer to the returned maximum location (in nD case). NULL is used if not required. +*/ +CV_EXPORTS void minMaxLoc(const SparseMat& a, double* minVal, + double* maxVal, int* minIdx = 0, int* maxIdx = 0); + +/** @brief Reduces a matrix to a vector. + +The function #reduce reduces the matrix to a vector by treating the matrix rows/columns as a set of +1D vectors and performing the specified operation on the vectors until a single row/column is +obtained. For example, the function can be used to compute horizontal and vertical projections of a +raster image. In case of #REDUCE_MAX and #REDUCE_MIN , the output image should have the same type as the source one. +In case of #REDUCE_SUM, #REDUCE_SUM2 and #REDUCE_AVG , the output may have a larger element bit-depth to preserve accuracy. +And multi-channel arrays are also supported in these two reduction modes. + +The following code demonstrates its usage for a single channel matrix. +@snippet snippets/core_reduce.cpp example + +And the following code demonstrates its usage for a two-channel matrix. +@snippet snippets/core_reduce.cpp example2 + +@param src input 2D matrix. +@param dst output vector. Its size and type is defined by dim and dtype parameters. +@param dim dimension index along which the matrix is reduced. 0 means that the matrix is reduced to +a single row. 1 means that the matrix is reduced to a single column. +@param rtype reduction operation that could be one of #ReduceTypes +@param dtype when negative, the output vector will have the same type as the input matrix, +otherwise, its type will be CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()). +@sa repeat, reduceArgMin, reduceArgMax +*/ +CV_EXPORTS_W void reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype = -1); + +/** @brief Creates one multi-channel array out of several single-channel ones. + +The function cv::merge merges several arrays to make a single multi-channel array. That is, each +element of the output array will be a concatenation of the elements of the input arrays, where +elements of i-th input array are treated as mv[i].channels()-element vectors. + +The function cv::split does the reverse operation. If you need to shuffle channels in some other +advanced way, use cv::mixChannels. + +The following example shows how to merge 3 single channel matrices into a single 3-channel matrix. +@snippet snippets/core_merge.cpp example + +@param mv input array of matrices to be merged; all the matrices in mv must have the same +size and the same depth. +@param count number of input matrices when mv is a plain C array; it must be greater than zero. +@param dst output array of the same size and the same depth as mv[0]; The number of channels will +be equal to the parameter count. +@sa mixChannels, split, Mat::reshape +*/ +CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst); + +/** @overload +@param mv input vector of matrices to be merged; all the matrices in mv must have the same +size and the same depth. +@param dst output array of the same size and the same depth as mv[0]; The number of channels will +be the total number of channels in the matrix array. + */ +CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst); + +/** @brief Divides a multi-channel array into several single-channel arrays. + +The function cv::split splits a multi-channel array into separate single-channel arrays: +\f[\texttt{mv} [c](I) = \texttt{src} (I)_c\f] +If you need to extract a single channel or do some other sophisticated channel permutation, use +mixChannels . + +The following example demonstrates how to split a 3-channel matrix into 3 single channel matrices. +@snippet snippets/core_split.cpp example + +@param src input multi-channel array. +@param mvbegin output array; the number of arrays must match src.channels(); the arrays themselves are +reallocated, if needed. +@sa merge, mixChannels, cvtColor +*/ +CV_EXPORTS void split(const Mat& src, Mat* mvbegin); + +/** @overload +@param m input multi-channel array. +@param mv output vector of arrays; the arrays themselves are reallocated, if needed. +*/ +CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv); + +/** @brief Copies specified channels from input arrays to the specified channels of +output arrays. + +The function cv::mixChannels provides an advanced mechanism for shuffling image channels. + +cv::split,cv::merge,cv::extractChannel,cv::insertChannel and some forms of cv::cvtColor are partial cases of cv::mixChannels. + +In the example below, the code splits a 4-channel BGRA image into a 3-channel BGR (with B and R +channels swapped) and a separate alpha-channel image: +@code{.cpp} + Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) ); + Mat bgr( bgra.rows, bgra.cols, CV_8UC3 ); + Mat alpha( bgra.rows, bgra.cols, CV_8UC1 ); + + // forming an array of matrices is a quite efficient operation, + // because the matrix data is not copied, only the headers + Mat out[] = { bgr, alpha }; + // bgra[0] -> bgr[2], bgra[1] -> bgr[1], + // bgra[2] -> bgr[0], bgra[3] -> alpha[0] + int from_to[] = { 0,2, 1,1, 2,0, 3,3 }; + mixChannels( &bgra, 1, out, 2, from_to, 4 ); +@endcode +@note Unlike many other new-style C++ functions in OpenCV (see the introduction section and +Mat::create ), cv::mixChannels requires the output arrays to be pre-allocated before calling the +function. +@param src input array or vector of matrices; all of the matrices must have the same size and the +same depth. +@param nsrcs number of matrices in `src`. +@param dst output array or vector of matrices; all the matrices **must be allocated**; their size and +depth must be the same as in `src[0]`. +@param ndsts number of matrices in `dst`. +@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is +a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in +dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to +src[0].channels()-1, the second input image channels are indexed from src[0].channels() to +src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image +channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is +filled with zero . +@param npairs number of index pairs in `fromTo`. +@sa split, merge, extractChannel, insertChannel, cvtColor +*/ +CV_EXPORTS void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, + const int* fromTo, size_t npairs); + +/** @overload +@param src input array or vector of matrices; all of the matrices must have the same size and the +same depth. +@param dst output array or vector of matrices; all the matrices **must be allocated**; their size and +depth must be the same as in src[0]. +@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is +a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in +dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to +src[0].channels()-1, the second input image channels are indexed from src[0].channels() to +src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image +channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is +filled with zero . +@param npairs number of index pairs in fromTo. +*/ +CV_EXPORTS void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst, + const int* fromTo, size_t npairs); + +/** @overload +@param src input array or vector of matrices; all of the matrices must have the same size and the +same depth. +@param dst output array or vector of matrices; all the matrices **must be allocated**; their size and +depth must be the same as in src[0]. +@param fromTo array of index pairs specifying which channels are copied and where; fromTo[k\*2] is +a 0-based index of the input channel in src, fromTo[k\*2+1] is an index of the output channel in +dst; the continuous channel numbering is used: the first input image channels are indexed from 0 to +src[0].channels()-1, the second input image channels are indexed from src[0].channels() to +src[0].channels() + src[1].channels()-1, and so on, the same scheme is used for the output image +channels; as a special case, when fromTo[k\*2] is negative, the corresponding output channel is +filled with zero . +*/ +CV_EXPORTS_W void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst, + const std::vector& fromTo); + +/** @brief Extracts a single channel from src (coi is 0-based index) +@param src input array +@param dst output array +@param coi index of channel to extract +@sa mixChannels, split +*/ +CV_EXPORTS_W void extractChannel(InputArray src, OutputArray dst, int coi); + +/** @brief Inserts a single channel to dst (coi is 0-based index) +@param src input array +@param dst output array +@param coi index of channel for insertion +@sa mixChannels, merge +*/ +CV_EXPORTS_W void insertChannel(InputArray src, InputOutputArray dst, int coi); + +/** @brief Flips a 2D array around vertical, horizontal, or both axes. + +The function cv::flip flips the array in one of three different ways (row +and column indices are 0-based): +\f[\texttt{dst} _{ij} = +\left\{ +\begin{array}{l l} +\texttt{src} _{\texttt{src.rows}-i-1,j} & if\; \texttt{flipCode} = 0 \\ +\texttt{src} _{i, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} > 0 \\ +\texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\ +\end{array} +\right.\f] +The example scenarios of using the function are the following: +* Vertical flipping of the image (flipCode == 0) to switch between + top-left and bottom-left image origin. This is a typical operation + in video processing on Microsoft Windows\* OS. +* Horizontal flipping of the image with the subsequent horizontal + shift and absolute difference calculation to check for a + vertical-axis symmetry (flipCode \> 0). +* Simultaneous horizontal and vertical flipping of the image with + the subsequent shift and absolute difference calculation to check + for a central symmetry (flipCode \< 0). +* Reversing the order of point arrays (flipCode \> 0 or + flipCode == 0). +@param src input array. +@param dst output array of the same size and type as src. +@param flipCode a flag to specify how to flip the array; 0 means +flipping around the x-axis and positive value (for example, 1) means +flipping around y-axis. Negative value (for example, -1) means flipping +around both axes. +@sa transpose , repeat , completeSymm +*/ +CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode); + +/** @brief Flips a n-dimensional at given axis + * @param src input array + * @param dst output array that has the same shape of src + * @param axis axis that performs a flip on. 0 <= axis < src.dims. + */ +CV_EXPORTS_W void flipND(InputArray src, OutputArray dst, int axis); + +/** @brief Broadcast the given Mat to the given shape. + * @param src input array + * @param shape target shape. Should be a list of CV_32S numbers. Note that negative values are not supported. + * @param dst output array that has the given shape + */ +CV_EXPORTS_W void broadcast(InputArray src, InputArray shape, OutputArray dst); + +enum RotateFlags { + ROTATE_90_CLOCKWISE = 0, //! A = (cv::Mat_(3, 2) << 1, 4, + 2, 5, + 3, 6); + cv::Mat_ B = (cv::Mat_(3, 2) << 7, 10, + 8, 11, + 9, 12); + + cv::Mat C; + cv::hconcat(A, B, C); + //C: + //[1, 4, 7, 10; + // 2, 5, 8, 11; + // 3, 6, 9, 12] + @endcode + @param src1 first input array to be considered for horizontal concatenation. + @param src2 second input array to be considered for horizontal concatenation. + @param dst output array. It has the same number of rows and depth as the src1 and src2, and the sum of cols of the src1 and src2. + */ +CV_EXPORTS void hconcat(InputArray src1, InputArray src2, OutputArray dst); +/** @overload + @code{.cpp} + std::vector matrices = { cv::Mat(4, 1, CV_8UC1, cv::Scalar(1)), + cv::Mat(4, 1, CV_8UC1, cv::Scalar(2)), + cv::Mat(4, 1, CV_8UC1, cv::Scalar(3)),}; + + cv::Mat out; + cv::hconcat( matrices, out ); + //out: + //[1, 2, 3; + // 1, 2, 3; + // 1, 2, 3; + // 1, 2, 3] + @endcode + @param src input array or vector of matrices. all of the matrices must have the same number of rows and the same depth. + @param dst output array. It has the same number of rows and depth as the src, and the sum of cols of the src. +same depth. + */ +CV_EXPORTS_W void hconcat(InputArrayOfArrays src, OutputArray dst); + +/** @brief Applies vertical concatenation to given matrices. + +The function vertically concatenates two or more cv::Mat matrices (with the same number of cols). +@code{.cpp} + cv::Mat matArray[] = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)), + cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)), + cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),}; + + cv::Mat out; + cv::vconcat( matArray, 3, out ); + //out: + //[1, 1, 1, 1; + // 2, 2, 2, 2; + // 3, 3, 3, 3] +@endcode +@param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth. +@param nsrc number of matrices in src. +@param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src. +@sa cv::hconcat(const Mat*, size_t, OutputArray), @sa cv::hconcat(InputArrayOfArrays, OutputArray) and @sa cv::hconcat(InputArray, InputArray, OutputArray) +*/ +CV_EXPORTS void vconcat(const Mat* src, size_t nsrc, OutputArray dst); +/** @overload + @code{.cpp} + cv::Mat_ A = (cv::Mat_(3, 2) << 1, 7, + 2, 8, + 3, 9); + cv::Mat_ B = (cv::Mat_(3, 2) << 4, 10, + 5, 11, + 6, 12); + + cv::Mat C; + cv::vconcat(A, B, C); + //C: + //[1, 7; + // 2, 8; + // 3, 9; + // 4, 10; + // 5, 11; + // 6, 12] + @endcode + @param src1 first input array to be considered for vertical concatenation. + @param src2 second input array to be considered for vertical concatenation. + @param dst output array. It has the same number of cols and depth as the src1 and src2, and the sum of rows of the src1 and src2. + */ +CV_EXPORTS void vconcat(InputArray src1, InputArray src2, OutputArray dst); +/** @overload + @code{.cpp} + std::vector matrices = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)), + cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)), + cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),}; + + cv::Mat out; + cv::vconcat( matrices, out ); + //out: + //[1, 1, 1, 1; + // 2, 2, 2, 2; + // 3, 3, 3, 3] + @endcode + @param src input array or vector of matrices. all of the matrices must have the same number of cols and the same depth + @param dst output array. It has the same number of cols and depth as the src, and the sum of rows of the src. +same depth. + */ +CV_EXPORTS_W void vconcat(InputArrayOfArrays src, OutputArray dst); + +/** @brief computes bitwise conjunction of the two arrays (dst = src1 & src2) +Calculates the per-element bit-wise conjunction of two arrays or an +array and a scalar. + +The function cv::bitwise_and calculates the per-element bit-wise logical conjunction for: +* Two arrays when src1 and src2 have the same size: + \f[\texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +* An array and a scalar when src2 is constructed from Scalar or has + the same number of elements as `src1.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} \quad \texttt{if mask} (I) \ne0\f] +* A scalar and an array when src1 is constructed from Scalar or has + the same number of elements as `src2.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +In case of floating-point arrays, their machine-specific bit +representations (usually IEEE754-compliant) are used for the operation. +In case of multi-channel arrays, each channel is processed +independently. In the second and third cases above, the scalar is first +converted to the array type. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array that has the same size and type as the input +arrays. +@param mask optional operation mask, 8-bit single channel array, that +specifies elements of the output array to be changed. +*/ +CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2, + OutputArray dst, InputArray mask = noArray()); + +/** @brief Calculates the per-element bit-wise disjunction of two arrays or an +array and a scalar. + +The function cv::bitwise_or calculates the per-element bit-wise logical disjunction for: +* Two arrays when src1 and src2 have the same size: + \f[\texttt{dst} (I) = \texttt{src1} (I) \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +* An array and a scalar when src2 is constructed from Scalar or has + the same number of elements as `src1.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} (I) \vee \texttt{src2} \quad \texttt{if mask} (I) \ne0\f] +* A scalar and an array when src1 is constructed from Scalar or has + the same number of elements as `src2.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} \vee \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +In case of floating-point arrays, their machine-specific bit +representations (usually IEEE754-compliant) are used for the operation. +In case of multi-channel arrays, each channel is processed +independently. In the second and third cases above, the scalar is first +converted to the array type. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array that has the same size and type as the input +arrays. +@param mask optional operation mask, 8-bit single channel array, that +specifies elements of the output array to be changed. +*/ +CV_EXPORTS_W void bitwise_or(InputArray src1, InputArray src2, + OutputArray dst, InputArray mask = noArray()); + +/** @brief Calculates the per-element bit-wise "exclusive or" operation on two +arrays or an array and a scalar. + +The function cv::bitwise_xor calculates the per-element bit-wise logical "exclusive-or" +operation for: +* Two arrays when src1 and src2 have the same size: + \f[\texttt{dst} (I) = \texttt{src1} (I) \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +* An array and a scalar when src2 is constructed from Scalar or has + the same number of elements as `src1.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} (I) \oplus \texttt{src2} \quad \texttt{if mask} (I) \ne0\f] +* A scalar and an array when src1 is constructed from Scalar or has + the same number of elements as `src2.channels()`: + \f[\texttt{dst} (I) = \texttt{src1} \oplus \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0\f] +In case of floating-point arrays, their machine-specific bit +representations (usually IEEE754-compliant) are used for the operation. +In case of multi-channel arrays, each channel is processed +independently. In the 2nd and 3rd cases above, the scalar is first +converted to the array type. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array that has the same size and type as the input +arrays. +@param mask optional operation mask, 8-bit single channel array, that +specifies elements of the output array to be changed. +*/ +CV_EXPORTS_W void bitwise_xor(InputArray src1, InputArray src2, + OutputArray dst, InputArray mask = noArray()); + +/** @brief Inverts every bit of an array. + +The function cv::bitwise_not calculates per-element bit-wise inversion of the input +array: +\f[\texttt{dst} (I) = \neg \texttt{src} (I)\f] +In case of a floating-point input array, its machine-specific bit +representation (usually IEEE754-compliant) is used for the operation. In +case of multi-channel arrays, each channel is processed independently. +@param src input array. +@param dst output array that has the same size and type as the input +array. +@param mask optional operation mask, 8-bit single channel array, that +specifies elements of the output array to be changed. +*/ +CV_EXPORTS_W void bitwise_not(InputArray src, OutputArray dst, + InputArray mask = noArray()); + +/** @brief Calculates the per-element absolute difference between two arrays or between an array and a scalar. + +The function cv::absdiff calculates: +* Absolute difference between two arrays when they have the same + size and type: + \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2}(I)|)\f] +* Absolute difference between an array and a scalar when the second + array is constructed from Scalar or has as many elements as the + number of channels in `src1`: + \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1}(I) - \texttt{src2} |)\f] +* Absolute difference between a scalar and an array when the first + array is constructed from Scalar or has as many elements as the + number of channels in `src2`: + \f[\texttt{dst}(I) = \texttt{saturate} (| \texttt{src1} - \texttt{src2}(I) |)\f] + where I is a multi-dimensional index of array elements. In case of + multi-channel arrays, each channel is processed independently. +@note Saturation is not applied when the arrays have the depth CV_32S. +You may even get a negative value in the case of overflow. +@note (Python) Be careful to difference behaviour between src1/src2 are single number and they are tuple/array. +`absdiff(src,X)` means `absdiff(src,(X,X,X,X))`. +`absdiff(src,(X,))` means `absdiff(src,(X,0,0,0))`. +@param src1 first input array or a scalar. +@param src2 second input array or a scalar. +@param dst output array that has the same size and type as input arrays. +@sa cv::abs(const Mat&) +*/ +CV_EXPORTS_W void absdiff(InputArray src1, InputArray src2, OutputArray dst); + +/** @brief This is an overloaded member function, provided for convenience (python) +Copies the matrix to another one. +When the operation mask is specified, if the Mat::create call shown above reallocates the matrix, the newly allocated matrix is initialized with all zeros before copying the data. +@param src source matrix. +@param dst Destination matrix. If it does not have a proper size or type before the operation, it is +reallocated. +@param mask Operation mask of the same size as \*this. Its non-zero elements indicate which matrix +elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels. +*/ + +void CV_EXPORTS_W copyTo(InputArray src, OutputArray dst, InputArray mask); +/** @brief Checks if array elements lie between the elements of two other arrays. + +The function checks the range as follows: +- For every element of a single-channel input array: + \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0 \leq \texttt{src} (I)_0 \leq \texttt{upperb} (I)_0\f] +- For two-channel arrays: + \f[\texttt{dst} (I)= \texttt{lowerb} (I)_0 \leq \texttt{src} (I)_0 \leq \texttt{upperb} (I)_0 \land \texttt{lowerb} (I)_1 \leq \texttt{src} (I)_1 \leq \texttt{upperb} (I)_1\f] +- and so forth. + +That is, dst (I) is set to 255 (all 1 -bits) if src (I) is within the +specified 1D, 2D, 3D, ... box and 0 otherwise. + +When the lower and/or upper boundary parameters are scalars, the indexes +(I) at lowerb and upperb in the above formulas should be omitted. +@param src first input array. +@param lowerb inclusive lower boundary array or a scalar. +@param upperb inclusive upper boundary array or a scalar. +@param dst output array of the same size as src and CV_8U type. +*/ +CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb, + InputArray upperb, OutputArray dst); + +/** @brief Performs the per-element comparison of two arrays or an array and scalar value. + +The function compares: +* Elements of two arrays when src1 and src2 have the same size: + \f[\texttt{dst} (I) = \texttt{src1} (I) \,\texttt{cmpop}\, \texttt{src2} (I)\f] +* Elements of src1 with a scalar src2 when src2 is constructed from + Scalar or has a single element: + \f[\texttt{dst} (I) = \texttt{src1}(I) \,\texttt{cmpop}\, \texttt{src2}\f] +* src1 with elements of src2 when src1 is constructed from Scalar or + has a single element: + \f[\texttt{dst} (I) = \texttt{src1} \,\texttt{cmpop}\, \texttt{src2} (I)\f] +When the comparison result is true, the corresponding element of output +array is set to 255. The comparison operations can be replaced with the +equivalent matrix expressions: +@code{.cpp} + Mat dst1 = src1 >= src2; + Mat dst2 = src1 < 8; + ... +@endcode +@param src1 first input array or a scalar; when it is an array, it must have a single channel. +@param src2 second input array or a scalar; when it is an array, it must have a single channel. +@param dst output array of type ref CV_8U that has the same size and the same number of channels as + the input arrays. +@param cmpop a flag, that specifies correspondence between the arrays (cv::CmpTypes) +@sa checkRange, min, max, threshold +*/ +CV_EXPORTS_W void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop); + +/** @brief Calculates per-element minimum of two arrays or an array and a scalar. + +The function cv::min calculates the per-element minimum of two arrays: +\f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{src2} (I))\f] +or array and a scalar: +\f[\texttt{dst} (I)= \min ( \texttt{src1} (I), \texttt{value} )\f] +@param src1 first input array. +@param src2 second input array of the same size and type as src1. +@param dst output array of the same size and type as src1. +@sa max, compare, inRange, minMaxLoc +*/ +CV_EXPORTS_W void min(InputArray src1, InputArray src2, OutputArray dst); +/** @overload +needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare) +*/ +CV_EXPORTS void min(const Mat& src1, const Mat& src2, Mat& dst); +/** @overload +needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare) +*/ +CV_EXPORTS void min(const UMat& src1, const UMat& src2, UMat& dst); + +/** @brief Calculates per-element maximum of two arrays or an array and a scalar. + +The function cv::max calculates the per-element maximum of two arrays: +\f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{src2} (I))\f] +or array and a scalar: +\f[\texttt{dst} (I)= \max ( \texttt{src1} (I), \texttt{value} )\f] +@param src1 first input array. +@param src2 second input array of the same size and type as src1 . +@param dst output array of the same size and type as src1. +@sa min, compare, inRange, minMaxLoc, @ref MatrixExpressions +*/ +CV_EXPORTS_W void max(InputArray src1, InputArray src2, OutputArray dst); +/** @overload +needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare) +*/ +CV_EXPORTS void max(const Mat& src1, const Mat& src2, Mat& dst); +/** @overload +needed to avoid conflicts with const _Tp& std::min(const _Tp&, const _Tp&, _Compare) +*/ +CV_EXPORTS void max(const UMat& src1, const UMat& src2, UMat& dst); + +/** @brief Calculates a square root of array elements. + +The function cv::sqrt calculates a square root of each input array element. +In case of multi-channel arrays, each channel is processed +independently. The accuracy is approximately the same as of the built-in +std::sqrt . +@param src input floating-point array. +@param dst output array of the same size and type as src. +*/ +CV_EXPORTS_W void sqrt(InputArray src, OutputArray dst); + +/** @brief Raises every array element to a power. + +The function cv::pow raises every element of the input array to power : +\f[\texttt{dst} (I) = \fork{\texttt{src}(I)^{power}}{if \(\texttt{power}\) is integer}{|\texttt{src}(I)|^{power}}{otherwise}\f] + +So, for a non-integer power exponent, the absolute values of input array +elements are used. However, it is possible to get true values for +negative values using some extra operations. In the example below, +computing the 5th root of array src shows: +@code{.cpp} + Mat mask = src < 0; + pow(src, 1./5, dst); + subtract(Scalar::all(0), dst, dst, mask); +@endcode +For some values of power, such as integer values, 0.5 and -0.5, +specialized faster algorithms are used. + +Special values (NaN, Inf) are not handled. +@param src input array. +@param power exponent of power. +@param dst output array of the same size and type as src. +@sa sqrt, exp, log, cartToPolar, polarToCart +*/ +CV_EXPORTS_W void pow(InputArray src, double power, OutputArray dst); + +/** @brief Calculates the exponent of every array element. + +The function cv::exp calculates the exponent of every element of the input +array: +\f[\texttt{dst} [I] = e^{ src(I) }\f] + +The maximum relative error is about 7e-6 for single-precision input and +less than 1e-10 for double-precision input. Currently, the function +converts denormalized values to zeros on output. Special values (NaN, +Inf) are not handled. +@param src input array. +@param dst output array of the same size and type as src. +@sa log , cartToPolar , polarToCart , phase , pow , sqrt , magnitude +*/ +CV_EXPORTS_W void exp(InputArray src, OutputArray dst); + +/** @brief Calculates the natural logarithm of every array element. + +The function cv::log calculates the natural logarithm of every element of the input array: +\f[\texttt{dst} (I) = \log (\texttt{src}(I)) \f] + +Output on zero, negative and special (NaN, Inf) values is undefined. + +@param src input array. +@param dst output array of the same size and type as src . +@sa exp, cartToPolar, polarToCart, phase, pow, sqrt, magnitude +*/ +CV_EXPORTS_W void log(InputArray src, OutputArray dst); + +/** @brief Calculates x and y coordinates of 2D vectors from their magnitude and angle. + +The function cv::polarToCart calculates the Cartesian coordinates of each 2D +vector represented by the corresponding elements of magnitude and angle: +\f[\begin{array}{l} \texttt{x} (I) = \texttt{magnitude} (I) \cos ( \texttt{angle} (I)) \\ \texttt{y} (I) = \texttt{magnitude} (I) \sin ( \texttt{angle} (I)) \\ \end{array}\f] + +The relative accuracy of the estimated coordinates is about 1e-6. +@param magnitude input floating-point array of magnitudes of 2D vectors; +it can be an empty matrix (=Mat()), in this case, the function assumes +that all the magnitudes are =1; if it is not empty, it must have the +same size and type as angle. +@param angle input floating-point array of angles of 2D vectors. +@param x output array of x-coordinates of 2D vectors; it has the same +size and type as angle. +@param y output array of y-coordinates of 2D vectors; it has the same +size and type as angle. +@param angleInDegrees when true, the input angles are measured in +degrees, otherwise, they are measured in radians. +@sa cartToPolar, magnitude, phase, exp, log, pow, sqrt +*/ +CV_EXPORTS_W void polarToCart(InputArray magnitude, InputArray angle, + OutputArray x, OutputArray y, bool angleInDegrees = false); + +/** @brief Calculates the magnitude and angle of 2D vectors. + +The function cv::cartToPolar calculates either the magnitude, angle, or both +for every 2D vector (x(I),y(I)): +\f[\begin{array}{l} \texttt{magnitude} (I)= \sqrt{\texttt{x}(I)^2+\texttt{y}(I)^2} , \\ \texttt{angle} (I)= \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))[ \cdot180 / \pi ] \end{array}\f] + +The angles are calculated with accuracy about 0.3 degrees. For the point +(0,0), the angle is set to 0. +@param x array of x-coordinates; this must be a single-precision or +double-precision floating-point array. +@param y array of y-coordinates, that must have the same size and same type as x. +@param magnitude output array of magnitudes of the same size and type as x. +@param angle output array of angles that has the same size and type as +x; the angles are measured in radians (from 0 to 2\*Pi) or in degrees (0 to 360 degrees). +@param angleInDegrees a flag, indicating whether the angles are measured +in radians (which is by default), or in degrees. +@sa Sobel, Scharr +*/ +CV_EXPORTS_W void cartToPolar(InputArray x, InputArray y, + OutputArray magnitude, OutputArray angle, + bool angleInDegrees = false); + +/** @brief Calculates the rotation angle of 2D vectors. + +The function cv::phase calculates the rotation angle of each 2D vector that +is formed from the corresponding elements of x and y : +\f[\texttt{angle} (I) = \texttt{atan2} ( \texttt{y} (I), \texttt{x} (I))\f] + +The angle estimation accuracy is about 0.3 degrees. When x(I)=y(I)=0 , +the corresponding angle(I) is set to 0. +@param x input floating-point array of x-coordinates of 2D vectors. +@param y input array of y-coordinates of 2D vectors; it must have the +same size and the same type as x. +@param angle output array of vector angles; it has the same size and +same type as x . +@param angleInDegrees when true, the function calculates the angle in +degrees, otherwise, they are measured in radians. +*/ +CV_EXPORTS_W void phase(InputArray x, InputArray y, OutputArray angle, + bool angleInDegrees = false); + +/** @brief Calculates the magnitude of 2D vectors. + +The function cv::magnitude calculates the magnitude of 2D vectors formed +from the corresponding elements of x and y arrays: +\f[\texttt{dst} (I) = \sqrt{\texttt{x}(I)^2 + \texttt{y}(I)^2}\f] +@param x floating-point array of x-coordinates of the vectors. +@param y floating-point array of y-coordinates of the vectors; it must +have the same size as x. +@param magnitude output array of the same size and type as x. +@sa cartToPolar, polarToCart, phase, sqrt +*/ +CV_EXPORTS_W void magnitude(InputArray x, InputArray y, OutputArray magnitude); + +/** @brief Checks every element of an input array for invalid values. + +The function cv::checkRange checks that every array element is neither NaN nor infinite. When minVal \> +-DBL_MAX and maxVal \< DBL_MAX, the function also checks that each value is between minVal and +maxVal. In case of multi-channel arrays, each channel is processed independently. If some values +are out of range, position of the first outlier is stored in pos (when pos != NULL). Then, the +function either returns false (when quiet=true) or throws an exception. +@param a input array. +@param quiet a flag, indicating whether the functions quietly return false when the array elements +are out of range or they throw an exception. +@param pos optional output parameter, when not NULL, must be a pointer to array of src.dims +elements. +@param minVal inclusive lower boundary of valid values range. +@param maxVal exclusive upper boundary of valid values range. +*/ +CV_EXPORTS_W bool checkRange(InputArray a, bool quiet = true, CV_OUT Point* pos = 0, + double minVal = -DBL_MAX, double maxVal = DBL_MAX); + +/** @brief converts NaNs to the given number +@param a input/output matrix (CV_32F type). +@param val value to convert the NaNs +*/ +CV_EXPORTS_W void patchNaNs(InputOutputArray a, double val = 0); + +/** @brief Performs generalized matrix multiplication. + +The function cv::gemm performs generalized matrix multiplication similar to the +gemm functions in BLAS level 3. For example, +`gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T)` +corresponds to +\f[\texttt{dst} = \texttt{alpha} \cdot \texttt{src1} ^T \cdot \texttt{src2} + \texttt{beta} \cdot \texttt{src3} ^T\f] + +In case of complex (two-channel) data, performed a complex matrix +multiplication. + +The function can be replaced with a matrix expression. For example, the +above call can be replaced with: +@code{.cpp} + dst = alpha*src1.t()*src2 + beta*src3.t(); +@endcode +@param src1 first multiplied input matrix that could be real(CV_32FC1, +CV_64FC1) or complex(CV_32FC2, CV_64FC2). +@param src2 second multiplied input matrix of the same type as src1. +@param alpha weight of the matrix product. +@param src3 third optional delta matrix added to the matrix product; it +should have the same type as src1 and src2. +@param beta weight of src3. +@param dst output matrix; it has the proper size and the same type as +input matrices. +@param flags operation flags (cv::GemmFlags) +@sa mulTransposed , transform +*/ +CV_EXPORTS_W void gemm(InputArray src1, InputArray src2, double alpha, + InputArray src3, double beta, OutputArray dst, int flags = 0); + +/** @brief Calculates the product of a matrix and its transposition. + +The function cv::mulTransposed calculates the product of src and its +transposition: +\f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} )^T ( \texttt{src} - \texttt{delta} )\f] +if aTa=true , and +\f[\texttt{dst} = \texttt{scale} ( \texttt{src} - \texttt{delta} ) ( \texttt{src} - \texttt{delta} )^T\f] +otherwise. The function is used to calculate the covariance matrix. With +zero delta, it can be used as a faster substitute for general matrix +product A\*B when B=A' +@param src input single-channel matrix. Note that unlike gemm, the +function can multiply not only floating-point matrices. +@param dst output square matrix. +@param aTa Flag specifying the multiplication ordering. See the +description below. +@param delta Optional delta matrix subtracted from src before the +multiplication. When the matrix is empty ( delta=noArray() ), it is +assumed to be zero, that is, nothing is subtracted. If it has the same +size as src , it is simply subtracted. Otherwise, it is "repeated" (see +repeat ) to cover the full src and then subtracted. Type of the delta +matrix, when it is not empty, must be the same as the type of created +output matrix. See the dtype parameter description below. +@param scale Optional scale factor for the matrix product. +@param dtype Optional type of the output matrix. When it is negative, +the output matrix will have the same type as src . Otherwise, it will be +type=CV_MAT_DEPTH(dtype) that should be either CV_32F or CV_64F . +@sa calcCovarMatrix, gemm, repeat, reduce +*/ +CV_EXPORTS_W void mulTransposed( InputArray src, OutputArray dst, bool aTa, + InputArray delta = noArray(), + double scale = 1, int dtype = -1 ); + +/** @brief Transposes a matrix. + +The function cv::transpose transposes the matrix src : +\f[\texttt{dst} (i,j) = \texttt{src} (j,i)\f] +@note No complex conjugation is done in case of a complex matrix. It +should be done separately if needed. +@param src input array. +@param dst output array of the same type as src. +*/ +CV_EXPORTS_W void transpose(InputArray src, OutputArray dst); + +/** @brief Transpose for n-dimensional matrices. + * + * @note Input should be continuous single-channel matrix. + * @param src input array. + * @param order a permutation of [0,1,..,N-1] where N is the number of axes of src. + * The i’th axis of dst will correspond to the axis numbered order[i] of the input. + * @param dst output array of the same type as src. + */ +CV_EXPORTS_W void transposeND(InputArray src, const std::vector& order, OutputArray dst); + +/** @brief Performs the matrix transformation of every array element. + +The function cv::transform performs the matrix transformation of every +element of the array src and stores the results in dst : +\f[\texttt{dst} (I) = \texttt{m} \cdot \texttt{src} (I)\f] +(when m.cols=src.channels() ), or +\f[\texttt{dst} (I) = \texttt{m} \cdot [ \texttt{src} (I); 1]\f] +(when m.cols=src.channels()+1 ) + +Every element of the N -channel array src is interpreted as N -element +vector that is transformed using the M x N or M x (N+1) matrix m to +M-element vector - the corresponding element of the output array dst . + +The function may be used for geometrical transformation of +N -dimensional points, arbitrary linear color space transformation (such +as various kinds of RGB to YUV transforms), shuffling the image +channels, and so forth. +@param src input array that must have as many channels (1 to 4) as +m.cols or m.cols-1. +@param dst output array of the same size and depth as src; it has as +many channels as m.rows. +@param m transformation 2x2 or 2x3 floating-point matrix. +@sa perspectiveTransform, getAffineTransform, estimateAffine2D, warpAffine, warpPerspective +*/ +CV_EXPORTS_W void transform(InputArray src, OutputArray dst, InputArray m ); + +/** @brief Performs the perspective matrix transformation of vectors. + +The function cv::perspectiveTransform transforms every element of src by +treating it as a 2D or 3D vector, in the following way: +\f[(x, y, z) \rightarrow (x'/w, y'/w, z'/w)\f] +where +\f[(x', y', z', w') = \texttt{mat} \cdot \begin{bmatrix} x & y & z & 1 \end{bmatrix}\f] +and +\f[w = \fork{w'}{if \(w' \ne 0\)}{\infty}{otherwise}\f] + +Here a 3D vector transformation is shown. In case of a 2D vector +transformation, the z component is omitted. + +@note The function transforms a sparse set of 2D or 3D vectors. If you +want to transform an image using perspective transformation, use +warpPerspective . If you have an inverse problem, that is, you want to +compute the most probable perspective transformation out of several +pairs of corresponding points, you can use getPerspectiveTransform or +findHomography . +@param src input two-channel or three-channel floating-point array; each +element is a 2D/3D vector to be transformed. +@param dst output array of the same size and type as src. +@param m 3x3 or 4x4 floating-point transformation matrix. +@sa transform, warpPerspective, getPerspectiveTransform, findHomography +*/ +CV_EXPORTS_W void perspectiveTransform(InputArray src, OutputArray dst, InputArray m ); + +/** @brief Copies the lower or the upper half of a square matrix to its another half. + +The function cv::completeSymm copies the lower or the upper half of a square matrix to +its another half. The matrix diagonal remains unchanged: + - \f$\texttt{m}_{ij}=\texttt{m}_{ji}\f$ for \f$i > j\f$ if + lowerToUpper=false + - \f$\texttt{m}_{ij}=\texttt{m}_{ji}\f$ for \f$i < j\f$ if + lowerToUpper=true + +@param m input-output floating-point square matrix. +@param lowerToUpper operation flag; if true, the lower half is copied to +the upper half. Otherwise, the upper half is copied to the lower half. +@sa flip, transpose +*/ +CV_EXPORTS_W void completeSymm(InputOutputArray m, bool lowerToUpper = false); + +/** @brief Initializes a scaled identity matrix. + +The function cv::setIdentity initializes a scaled identity matrix: +\f[\texttt{mtx} (i,j)= \fork{\texttt{value}}{ if \(i=j\)}{0}{otherwise}\f] + +The function can also be emulated using the matrix initializers and the +matrix expressions: +@code + Mat A = Mat::eye(4, 3, CV_32F)*5; + // A will be set to [[5, 0, 0], [0, 5, 0], [0, 0, 5], [0, 0, 0]] +@endcode +@param mtx matrix to initialize (not necessarily square). +@param s value to assign to diagonal elements. +@sa Mat::zeros, Mat::ones, Mat::setTo, Mat::operator= +*/ +CV_EXPORTS_W void setIdentity(InputOutputArray mtx, const Scalar& s = Scalar(1)); + +/** @brief Returns the determinant of a square floating-point matrix. + +The function cv::determinant calculates and returns the determinant of the +specified matrix. For small matrices ( mtx.cols=mtx.rows\<=3 ), the +direct method is used. For larger matrices, the function uses LU +factorization with partial pivoting. + +For symmetric positively-determined matrices, it is also possible to use +eigen decomposition to calculate the determinant. +@param mtx input matrix that must have CV_32FC1 or CV_64FC1 type and +square size. +@sa trace, invert, solve, eigen, @ref MatrixExpressions +*/ +CV_EXPORTS_W double determinant(InputArray mtx); + +/** @brief Returns the trace of a matrix. + +The function cv::trace returns the sum of the diagonal elements of the +matrix mtx . +\f[\mathrm{tr} ( \texttt{mtx} ) = \sum _i \texttt{mtx} (i,i)\f] +@param mtx input matrix. +*/ +CV_EXPORTS_W Scalar trace(InputArray mtx); + +/** @brief Finds the inverse or pseudo-inverse of a matrix. + +The function cv::invert inverts the matrix src and stores the result in dst +. When the matrix src is singular or non-square, the function calculates +the pseudo-inverse matrix (the dst matrix) so that norm(src\*dst - I) is +minimal, where I is an identity matrix. + +In case of the #DECOMP_LU method, the function returns non-zero value if +the inverse has been successfully calculated and 0 if src is singular. + +In case of the #DECOMP_SVD method, the function returns the inverse +condition number of src (the ratio of the smallest singular value to the +largest singular value) and 0 if src is singular. The SVD method +calculates a pseudo-inverse matrix if src is singular. + +Similarly to #DECOMP_LU, the method #DECOMP_CHOLESKY works only with +non-singular square matrices that should also be symmetrical and +positively defined. In this case, the function stores the inverted +matrix in dst and returns non-zero. Otherwise, it returns 0. + +@param src input floating-point M x N matrix. +@param dst output matrix of N x M size and the same type as src. +@param flags inversion method (cv::DecompTypes) +@sa solve, SVD +*/ +CV_EXPORTS_W double invert(InputArray src, OutputArray dst, int flags = DECOMP_LU); + +/** @brief Solves one or more linear systems or least-squares problems. + +The function cv::solve solves a linear system or least-squares problem (the +latter is possible with SVD or QR methods, or by specifying the flag +#DECOMP_NORMAL ): +\f[\texttt{dst} = \arg \min _X \| \texttt{src1} \cdot \texttt{X} - \texttt{src2} \|\f] + +If #DECOMP_LU or #DECOMP_CHOLESKY method is used, the function returns 1 +if src1 (or \f$\texttt{src1}^T\texttt{src1}\f$ ) is non-singular. Otherwise, +it returns 0. In the latter case, dst is not valid. Other methods find a +pseudo-solution in case of a singular left-hand side part. + +@note If you want to find a unity-norm solution of an under-defined +singular system \f$\texttt{src1}\cdot\texttt{dst}=0\f$ , the function solve +will not do the work. Use SVD::solveZ instead. + +@param src1 input matrix on the left-hand side of the system. +@param src2 input matrix on the right-hand side of the system. +@param dst output solution. +@param flags solution (matrix inversion) method (#DecompTypes) +@sa invert, SVD, eigen +*/ +CV_EXPORTS_W bool solve(InputArray src1, InputArray src2, + OutputArray dst, int flags = DECOMP_LU); + +/** @brief Sorts each row or each column of a matrix. + +The function cv::sort sorts each matrix row or each matrix column in +ascending or descending order. So you should pass two operation flags to +get desired behaviour. If you want to sort matrix rows or columns +lexicographically, you can use STL std::sort generic function with the +proper comparison predicate. + +@param src input single-channel array. +@param dst output array of the same size and type as src. +@param flags operation flags, a combination of #SortFlags +@sa sortIdx, randShuffle +*/ +CV_EXPORTS_W void sort(InputArray src, OutputArray dst, int flags); + +/** @brief Sorts each row or each column of a matrix. + +The function cv::sortIdx sorts each matrix row or each matrix column in the +ascending or descending order. So you should pass two operation flags to +get desired behaviour. Instead of reordering the elements themselves, it +stores the indices of sorted elements in the output array. For example: +@code + Mat A = Mat::eye(3,3,CV_32F), B; + sortIdx(A, B, SORT_EVERY_ROW + SORT_ASCENDING); + // B will probably contain + // (because of equal elements in A some permutations are possible): + // [[1, 2, 0], [0, 2, 1], [0, 1, 2]] +@endcode +@param src input single-channel array. +@param dst output integer array of the same size as src. +@param flags operation flags that could be a combination of cv::SortFlags +@sa sort, randShuffle +*/ +CV_EXPORTS_W void sortIdx(InputArray src, OutputArray dst, int flags); + +/** @brief Finds the real roots of a cubic equation. + +The function solveCubic finds the real roots of a cubic equation: +- if coeffs is a 4-element vector: +\f[\texttt{coeffs} [0] x^3 + \texttt{coeffs} [1] x^2 + \texttt{coeffs} [2] x + \texttt{coeffs} [3] = 0\f] +- if coeffs is a 3-element vector: +\f[x^3 + \texttt{coeffs} [0] x^2 + \texttt{coeffs} [1] x + \texttt{coeffs} [2] = 0\f] + +The roots are stored in the roots array. +@param coeffs equation coefficients, an array of 3 or 4 elements. +@param roots output array of real roots that has 1 or 3 elements. +@return number of real roots. It can be 0, 1 or 2. +*/ +CV_EXPORTS_W int solveCubic(InputArray coeffs, OutputArray roots); + +/** @brief Finds the real or complex roots of a polynomial equation. + +The function cv::solvePoly finds real and complex roots of a polynomial equation: +\f[\texttt{coeffs} [n] x^{n} + \texttt{coeffs} [n-1] x^{n-1} + ... + \texttt{coeffs} [1] x + \texttt{coeffs} [0] = 0\f] +@param coeffs array of polynomial coefficients. +@param roots output (complex) array of roots. +@param maxIters maximum number of iterations the algorithm does. +*/ +CV_EXPORTS_W double solvePoly(InputArray coeffs, OutputArray roots, int maxIters = 300); + +/** @brief Calculates eigenvalues and eigenvectors of a symmetric matrix. + +The function cv::eigen calculates just eigenvalues, or eigenvalues and eigenvectors of the symmetric +matrix src: +@code + src*eigenvectors.row(i).t() = eigenvalues.at(i)*eigenvectors.row(i).t() +@endcode + +@note Use cv::eigenNonSymmetric for calculation of real eigenvalues and eigenvectors of non-symmetric matrix. + +@param src input matrix that must have CV_32FC1 or CV_64FC1 type, square size and be symmetrical +(src ^T^ == src). +@param eigenvalues output vector of eigenvalues of the same type as src; the eigenvalues are stored +in the descending order. +@param eigenvectors output matrix of eigenvectors; it has the same size and type as src; the +eigenvectors are stored as subsequent matrix rows, in the same order as the corresponding +eigenvalues. +@sa eigenNonSymmetric, completeSymm , PCA +*/ +CV_EXPORTS_W bool eigen(InputArray src, OutputArray eigenvalues, + OutputArray eigenvectors = noArray()); + +/** @brief Calculates eigenvalues and eigenvectors of a non-symmetric matrix (real eigenvalues only). + +@note Assumes real eigenvalues. + +The function calculates eigenvalues and eigenvectors (optional) of the square matrix src: +@code + src*eigenvectors.row(i).t() = eigenvalues.at(i)*eigenvectors.row(i).t() +@endcode + +@param src input matrix (CV_32FC1 or CV_64FC1 type). +@param eigenvalues output vector of eigenvalues (type is the same type as src). +@param eigenvectors output matrix of eigenvectors (type is the same type as src). The eigenvectors are stored as subsequent matrix rows, in the same order as the corresponding eigenvalues. +@sa eigen +*/ +CV_EXPORTS_W void eigenNonSymmetric(InputArray src, OutputArray eigenvalues, + OutputArray eigenvectors); + +/** @brief Calculates the covariance matrix of a set of vectors. + +The function cv::calcCovarMatrix calculates the covariance matrix and, optionally, the mean vector of +the set of input vectors. +@param samples samples stored as separate matrices +@param nsamples number of samples +@param covar output covariance matrix of the type ctype and square size. +@param mean input or output (depending on the flags) array as the average value of the input vectors. +@param flags operation flags as a combination of #CovarFlags +@param ctype type of the matrixl; it equals 'CV_64F' by default. +@sa PCA, mulTransposed, Mahalanobis +@todo InputArrayOfArrays +*/ +CV_EXPORTS void calcCovarMatrix( const Mat* samples, int nsamples, Mat& covar, Mat& mean, + int flags, int ctype = CV_64F); + +/** @overload +@note use #COVAR_ROWS or #COVAR_COLS flag +@param samples samples stored as rows/columns of a single matrix. +@param covar output covariance matrix of the type ctype and square size. +@param mean input or output (depending on the flags) array as the average value of the input vectors. +@param flags operation flags as a combination of #CovarFlags +@param ctype type of the matrixl; it equals 'CV_64F' by default. +*/ +CV_EXPORTS_W void calcCovarMatrix( InputArray samples, OutputArray covar, + InputOutputArray mean, int flags, int ctype = CV_64F); + +/** wrap PCA::operator() */ +CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean, + OutputArray eigenvectors, int maxComponents = 0); + +/** wrap PCA::operator() and add eigenvalues output parameter */ +CV_EXPORTS_AS(PCACompute2) void PCACompute(InputArray data, InputOutputArray mean, + OutputArray eigenvectors, OutputArray eigenvalues, + int maxComponents = 0); + +/** wrap PCA::operator() */ +CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean, + OutputArray eigenvectors, double retainedVariance); + +/** wrap PCA::operator() and add eigenvalues output parameter */ +CV_EXPORTS_AS(PCACompute2) void PCACompute(InputArray data, InputOutputArray mean, + OutputArray eigenvectors, OutputArray eigenvalues, + double retainedVariance); + +/** wrap PCA::project */ +CV_EXPORTS_W void PCAProject(InputArray data, InputArray mean, + InputArray eigenvectors, OutputArray result); + +/** wrap PCA::backProject */ +CV_EXPORTS_W void PCABackProject(InputArray data, InputArray mean, + InputArray eigenvectors, OutputArray result); + +/** wrap SVD::compute */ +CV_EXPORTS_W void SVDecomp( InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags = 0 ); + +/** wrap SVD::backSubst */ +CV_EXPORTS_W void SVBackSubst( InputArray w, InputArray u, InputArray vt, + InputArray rhs, OutputArray dst ); + +/** @brief Calculates the Mahalanobis distance between two vectors. + +The function cv::Mahalanobis calculates and returns the weighted distance between two vectors: +\f[d( \texttt{vec1} , \texttt{vec2} )= \sqrt{\sum_{i,j}{\texttt{icovar(i,j)}\cdot(\texttt{vec1}(I)-\texttt{vec2}(I))\cdot(\texttt{vec1(j)}-\texttt{vec2(j)})} }\f] +The covariance matrix may be calculated using the #calcCovarMatrix function and then inverted using +the invert function (preferably using the #DECOMP_SVD method, as the most accurate). +@param v1 first 1D input vector. +@param v2 second 1D input vector. +@param icovar inverse covariance matrix. +*/ +CV_EXPORTS_W double Mahalanobis(InputArray v1, InputArray v2, InputArray icovar); + +/** @brief Performs a forward or inverse Discrete Fourier transform of a 1D or 2D floating-point array. + +The function cv::dft performs one of the following: +- Forward the Fourier transform of a 1D vector of N elements: + \f[Y = F^{(N)} \cdot X,\f] + where \f$F^{(N)}_{jk}=\exp(-2\pi i j k/N)\f$ and \f$i=\sqrt{-1}\f$ +- Inverse the Fourier transform of a 1D vector of N elements: + \f[\begin{array}{l} X'= \left (F^{(N)} \right )^{-1} \cdot Y = \left (F^{(N)} \right )^* \cdot y \\ X = (1/N) \cdot X, \end{array}\f] + where \f$F^*=\left(\textrm{Re}(F^{(N)})-\textrm{Im}(F^{(N)})\right)^T\f$ +- Forward the 2D Fourier transform of a M x N matrix: + \f[Y = F^{(M)} \cdot X \cdot F^{(N)}\f] +- Inverse the 2D Fourier transform of a M x N matrix: + \f[\begin{array}{l} X'= \left (F^{(M)} \right )^* \cdot Y \cdot \left (F^{(N)} \right )^* \\ X = \frac{1}{M \cdot N} \cdot X' \end{array}\f] + +In case of real (single-channel) data, the output spectrum of the forward Fourier transform or input +spectrum of the inverse Fourier transform can be represented in a packed format called *CCS* +(complex-conjugate-symmetrical). It was borrowed from IPL (Intel\* Image Processing Library). Here +is how 2D *CCS* spectrum looks: +\f[\begin{bmatrix} Re Y_{0,0} & Re Y_{0,1} & Im Y_{0,1} & Re Y_{0,2} & Im Y_{0,2} & \cdots & Re Y_{0,N/2-1} & Im Y_{0,N/2-1} & Re Y_{0,N/2} \\ Re Y_{1,0} & Re Y_{1,1} & Im Y_{1,1} & Re Y_{1,2} & Im Y_{1,2} & \cdots & Re Y_{1,N/2-1} & Im Y_{1,N/2-1} & Re Y_{1,N/2} \\ Im Y_{1,0} & Re Y_{2,1} & Im Y_{2,1} & Re Y_{2,2} & Im Y_{2,2} & \cdots & Re Y_{2,N/2-1} & Im Y_{2,N/2-1} & Im Y_{1,N/2} \\ \hdotsfor{9} \\ Re Y_{M/2-1,0} & Re Y_{M-3,1} & Im Y_{M-3,1} & \hdotsfor{3} & Re Y_{M-3,N/2-1} & Im Y_{M-3,N/2-1}& Re Y_{M/2-1,N/2} \\ Im Y_{M/2-1,0} & Re Y_{M-2,1} & Im Y_{M-2,1} & \hdotsfor{3} & Re Y_{M-2,N/2-1} & Im Y_{M-2,N/2-1}& Im Y_{M/2-1,N/2} \\ Re Y_{M/2,0} & Re Y_{M-1,1} & Im Y_{M-1,1} & \hdotsfor{3} & Re Y_{M-1,N/2-1} & Im Y_{M-1,N/2-1}& Re Y_{M/2,N/2} \end{bmatrix}\f] + +In case of 1D transform of a real vector, the output looks like the first row of the matrix above. + +So, the function chooses an operation mode depending on the flags and size of the input array: +- If #DFT_ROWS is set or the input array has a single row or single column, the function + performs a 1D forward or inverse transform of each row of a matrix when #DFT_ROWS is set. + Otherwise, it performs a 2D transform. +- If the input array is real and #DFT_INVERSE is not set, the function performs a forward 1D or + 2D transform: + - When #DFT_COMPLEX_OUTPUT is set, the output is a complex matrix of the same size as + input. + - When #DFT_COMPLEX_OUTPUT is not set, the output is a real matrix of the same size as + input. In case of 2D transform, it uses the packed format as shown above. In case of a + single 1D transform, it looks like the first row of the matrix above. In case of + multiple 1D transforms (when using the #DFT_ROWS flag), each row of the output matrix + looks like the first row of the matrix above. +- If the input array is complex and either #DFT_INVERSE or #DFT_REAL_OUTPUT are not set, the + output is a complex array of the same size as input. The function performs a forward or + inverse 1D or 2D transform of the whole input array or each row of the input array + independently, depending on the flags DFT_INVERSE and DFT_ROWS. +- When #DFT_INVERSE is set and the input array is real, or it is complex but #DFT_REAL_OUTPUT + is set, the output is a real array of the same size as input. The function performs a 1D or 2D + inverse transformation of the whole input array or each individual row, depending on the flags + #DFT_INVERSE and #DFT_ROWS. + +If #DFT_SCALE is set, the scaling is done after the transformation. + +Unlike dct , the function supports arrays of arbitrary size. But only those arrays are processed +efficiently, whose sizes can be factorized in a product of small prime numbers (2, 3, and 5 in the +current implementation). Such an efficient DFT size can be calculated using the getOptimalDFTSize +method. + +The sample below illustrates how to calculate a DFT-based convolution of two 2D real arrays: +@code + void convolveDFT(InputArray A, InputArray B, OutputArray C) + { + // reallocate the output array if needed + C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type()); + Size dftSize; + // calculate the size of DFT transform + dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1); + dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1); + + // allocate temporary buffers and initialize them with 0's + Mat tempA(dftSize, A.type(), Scalar::all(0)); + Mat tempB(dftSize, B.type(), Scalar::all(0)); + + // copy A and B to the top-left corners of tempA and tempB, respectively + Mat roiA(tempA, Rect(0,0,A.cols,A.rows)); + A.copyTo(roiA); + Mat roiB(tempB, Rect(0,0,B.cols,B.rows)); + B.copyTo(roiB); + + // now transform the padded A & B in-place; + // use "nonzeroRows" hint for faster processing + dft(tempA, tempA, 0, A.rows); + dft(tempB, tempB, 0, B.rows); + + // multiply the spectrums; + // the function handles packed spectrum representations well + mulSpectrums(tempA, tempB, tempA); + + // transform the product back from the frequency domain. + // Even though all the result rows will be non-zero, + // you need only the first C.rows of them, and thus you + // pass nonzeroRows == C.rows + dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows); + + // now copy the result back to C. + tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C); + + // all the temporary buffers will be deallocated automatically + } +@endcode +To optimize this sample, consider the following approaches: +- Since nonzeroRows != 0 is passed to the forward transform calls and since A and B are copied to + the top-left corners of tempA and tempB, respectively, it is not necessary to clear the whole + tempA and tempB. It is only necessary to clear the tempA.cols - A.cols ( tempB.cols - B.cols) + rightmost columns of the matrices. +- This DFT-based convolution does not have to be applied to the whole big arrays, especially if B + is significantly smaller than A or vice versa. Instead, you can calculate convolution by parts. + To do this, you need to split the output array C into multiple tiles. For each tile, estimate + which parts of A and B are required to calculate convolution in this tile. If the tiles in C are + too small, the speed will decrease a lot because of repeated work. In the ultimate case, when + each tile in C is a single pixel, the algorithm becomes equivalent to the naive convolution + algorithm. If the tiles are too big, the temporary arrays tempA and tempB become too big and + there is also a slowdown because of bad cache locality. So, there is an optimal tile size + somewhere in the middle. +- If different tiles in C can be calculated in parallel and, thus, the convolution is done by + parts, the loop can be threaded. + +All of the above improvements have been implemented in #matchTemplate and #filter2D . Therefore, by +using them, you can get the performance even better than with the above theoretically optimal +implementation. Though, those two functions actually calculate cross-correlation, not convolution, +so you need to "flip" the second convolution operand B vertically and horizontally using flip . +@note +- An example using the discrete fourier transform can be found at + opencv_source_code/samples/cpp/dft.cpp +- (Python) An example using the dft functionality to perform Wiener deconvolution can be found + at opencv_source/samples/python/deconvolution.py +- (Python) An example rearranging the quadrants of a Fourier image can be found at + opencv_source/samples/python/dft.py +@param src input array that could be real or complex. +@param dst output array whose size and type depends on the flags . +@param flags transformation flags, representing a combination of the #DftFlags +@param nonzeroRows when the parameter is not zero, the function assumes that only the first +nonzeroRows rows of the input array (#DFT_INVERSE is not set) or only the first nonzeroRows of the +output array (#DFT_INVERSE is set) contain non-zeros, thus, the function can handle the rest of the +rows more efficiently and save some time; this technique is very useful for calculating array +cross-correlation or convolution using DFT. +@sa dct , getOptimalDFTSize , mulSpectrums, filter2D , matchTemplate , flip , cartToPolar , +magnitude , phase +*/ +CV_EXPORTS_W void dft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0); + +/** @brief Calculates the inverse Discrete Fourier Transform of a 1D or 2D array. + +idft(src, dst, flags) is equivalent to dft(src, dst, flags | #DFT_INVERSE) . +@note None of dft and idft scales the result by default. So, you should pass #DFT_SCALE to one of +dft or idft explicitly to make these transforms mutually inverse. +@sa dft, dct, idct, mulSpectrums, getOptimalDFTSize +@param src input floating-point real or complex array. +@param dst output array whose size and type depend on the flags. +@param flags operation flags (see dft and #DftFlags). +@param nonzeroRows number of dst rows to process; the rest of the rows have undefined content (see +the convolution sample in dft description. +*/ +CV_EXPORTS_W void idft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0); + +/** @brief Performs a forward or inverse discrete Cosine transform of 1D or 2D array. + +The function cv::dct performs a forward or inverse discrete Cosine transform (DCT) of a 1D or 2D +floating-point array: +- Forward Cosine transform of a 1D vector of N elements: + \f[Y = C^{(N)} \cdot X\f] + where + \f[C^{(N)}_{jk}= \sqrt{\alpha_j/N} \cos \left ( \frac{\pi(2k+1)j}{2N} \right )\f] + and + \f$\alpha_0=1\f$, \f$\alpha_j=2\f$ for *j \> 0*. +- Inverse Cosine transform of a 1D vector of N elements: + \f[X = \left (C^{(N)} \right )^{-1} \cdot Y = \left (C^{(N)} \right )^T \cdot Y\f] + (since \f$C^{(N)}\f$ is an orthogonal matrix, \f$C^{(N)} \cdot \left(C^{(N)}\right)^T = I\f$ ) +- Forward 2D Cosine transform of M x N matrix: + \f[Y = C^{(N)} \cdot X \cdot \left (C^{(N)} \right )^T\f] +- Inverse 2D Cosine transform of M x N matrix: + \f[X = \left (C^{(N)} \right )^T \cdot X \cdot C^{(N)}\f] + +The function chooses the mode of operation by looking at the flags and size of the input array: +- If (flags & #DCT_INVERSE) == 0 , the function does a forward 1D or 2D transform. Otherwise, it + is an inverse 1D or 2D transform. +- If (flags & #DCT_ROWS) != 0 , the function performs a 1D transform of each row. +- If the array is a single column or a single row, the function performs a 1D transform. +- If none of the above is true, the function performs a 2D transform. + +@note Currently dct supports even-size arrays (2, 4, 6 ...). For data analysis and approximation, you +can pad the array when necessary. +Also, the function performance depends very much, and not monotonically, on the array size (see +getOptimalDFTSize ). In the current implementation DCT of a vector of size N is calculated via DFT +of a vector of size N/2 . Thus, the optimal DCT size N1 \>= N can be calculated as: +@code + size_t getOptimalDCTSize(size_t N) { return 2*getOptimalDFTSize((N+1)/2); } + N1 = getOptimalDCTSize(N); +@endcode +@param src input floating-point array. +@param dst output array of the same size and type as src . +@param flags transformation flags as a combination of cv::DftFlags (DCT_*) +@sa dft , getOptimalDFTSize , idct +*/ +CV_EXPORTS_W void dct(InputArray src, OutputArray dst, int flags = 0); + +/** @brief Calculates the inverse Discrete Cosine Transform of a 1D or 2D array. + +idct(src, dst, flags) is equivalent to dct(src, dst, flags | DCT_INVERSE). +@param src input floating-point single-channel array. +@param dst output array of the same size and type as src. +@param flags operation flags. +@sa dct, dft, idft, getOptimalDFTSize +*/ +CV_EXPORTS_W void idct(InputArray src, OutputArray dst, int flags = 0); + +/** @brief Performs the per-element multiplication of two Fourier spectrums. + +The function cv::mulSpectrums performs the per-element multiplication of the two CCS-packed or complex +matrices that are results of a real or complex Fourier transform. + +The function, together with dft and idft , may be used to calculate convolution (pass conjB=false ) +or correlation (pass conjB=true ) of two arrays rapidly. When the arrays are complex, they are +simply multiplied (per element) with an optional conjugation of the second-array elements. When the +arrays are real, they are assumed to be CCS-packed (see dft for details). +@param a first input array. +@param b second input array of the same size and type as src1 . +@param c output array of the same size and type as src1 . +@param flags operation flags; currently, the only supported flag is cv::DFT_ROWS, which indicates that +each row of src1 and src2 is an independent 1D Fourier spectrum. If you do not want to use this flag, then simply add a `0` as value. +@param conjB optional flag that conjugates the second input array before the multiplication (true) +or not (false). +*/ +CV_EXPORTS_W void mulSpectrums(InputArray a, InputArray b, OutputArray c, + int flags, bool conjB = false); + +/** @brief Returns the optimal DFT size for a given vector size. + +DFT performance is not a monotonic function of a vector size. Therefore, when you calculate +convolution of two arrays or perform the spectral analysis of an array, it usually makes sense to +pad the input data with zeros to get a bit larger array that can be transformed much faster than the +original one. Arrays whose size is a power-of-two (2, 4, 8, 16, 32, ...) are the fastest to process. +Though, the arrays whose size is a product of 2's, 3's, and 5's (for example, 300 = 5\*5\*3\*2\*2) +are also processed quite efficiently. + +The function cv::getOptimalDFTSize returns the minimum number N that is greater than or equal to vecsize +so that the DFT of a vector of size N can be processed efficiently. In the current implementation N += 2 ^p^ \* 3 ^q^ \* 5 ^r^ for some integer p, q, r. + +The function returns a negative number if vecsize is too large (very close to INT_MAX ). + +While the function cannot be used directly to estimate the optimal vector size for DCT transform +(since the current DCT implementation supports only even-size vectors), it can be easily processed +as getOptimalDFTSize((vecsize+1)/2)\*2. +@param vecsize vector size. +@sa dft , dct , idft , idct , mulSpectrums +*/ +CV_EXPORTS_W int getOptimalDFTSize(int vecsize); + +/** @brief Returns the default random number generator. + +The function cv::theRNG returns the default random number generator. For each thread, there is a +separate random number generator, so you can use the function safely in multi-thread environments. +If you just need to get a single random number using this generator or initialize an array, you can +use randu or randn instead. But if you are going to generate many random numbers inside a loop, it +is much faster to use this function to retrieve the generator and then use RNG::operator _Tp() . +@sa RNG, randu, randn +*/ +CV_EXPORTS RNG& theRNG(); + +/** @brief Sets state of default random number generator. + +The function cv::setRNGSeed sets state of default random number generator to custom value. +@param seed new state for default random number generator +@sa RNG, randu, randn +*/ +CV_EXPORTS_W void setRNGSeed(int seed); + +/** @brief Generates a single uniformly-distributed random number or an array of random numbers. + +Non-template variant of the function fills the matrix dst with uniformly-distributed +random numbers from the specified range: +\f[\texttt{low} _c \leq \texttt{dst} (I)_c < \texttt{high} _c\f] +@param dst output array of random numbers; the array must be pre-allocated. +@param low inclusive lower boundary of the generated random numbers. +@param high exclusive upper boundary of the generated random numbers. +@sa RNG, randn, theRNG +*/ +CV_EXPORTS_W void randu(InputOutputArray dst, InputArray low, InputArray high); + +/** @brief Fills the array with normally distributed random numbers. + +The function cv::randn fills the matrix dst with normally distributed random numbers with the specified +mean vector and the standard deviation matrix. The generated random numbers are clipped to fit the +value range of the output array data type. +@param dst output array of random numbers; the array must be pre-allocated and have 1 to 4 channels. +@param mean mean value (expectation) of the generated random numbers. +@param stddev standard deviation of the generated random numbers; it can be either a vector (in +which case a diagonal standard deviation matrix is assumed) or a square matrix. +@sa RNG, randu +*/ +CV_EXPORTS_W void randn(InputOutputArray dst, InputArray mean, InputArray stddev); + +/** @brief Shuffles the array elements randomly. + +The function cv::randShuffle shuffles the specified 1D array by randomly choosing pairs of elements and +swapping them. The number of such swap operations will be dst.rows\*dst.cols\*iterFactor . +@param dst input/output numerical 1D array. +@param iterFactor scale factor that determines the number of random swap operations (see the details +below). +@param rng optional random number generator used for shuffling; if it is zero, theRNG () is used +instead. +@sa RNG, sort +*/ +CV_EXPORTS_W void randShuffle(InputOutputArray dst, double iterFactor = 1., RNG* rng = 0); + +/** @brief Principal Component Analysis + +The class is used to calculate a special basis for a set of vectors. The +basis will consist of eigenvectors of the covariance matrix calculated +from the input set of vectors. The class %PCA can also transform +vectors to/from the new coordinate space defined by the basis. Usually, +in this new coordinate system, each vector from the original set (and +any linear combination of such vectors) can be quite accurately +approximated by taking its first few components, corresponding to the +eigenvectors of the largest eigenvalues of the covariance matrix. +Geometrically it means that you calculate a projection of the vector to +a subspace formed by a few eigenvectors corresponding to the dominant +eigenvalues of the covariance matrix. And usually such a projection is +very close to the original vector. So, you can represent the original +vector from a high-dimensional space with a much shorter vector +consisting of the projected vector's coordinates in the subspace. Such a +transformation is also known as Karhunen-Loeve Transform, or KLT. +See http://en.wikipedia.org/wiki/Principal_component_analysis + +The sample below is the function that takes two matrices. The first +function stores a set of vectors (a row per vector) that is used to +calculate PCA. The second function stores another "test" set of vectors +(a row per vector). First, these vectors are compressed with PCA, then +reconstructed back, and then the reconstruction error norm is computed +and printed for each vector. : + +@code{.cpp} +using namespace cv; + +PCA compressPCA(const Mat& pcaset, int maxComponents, + const Mat& testset, Mat& compressed) +{ + PCA pca(pcaset, // pass the data + Mat(), // we do not have a pre-computed mean vector, + // so let the PCA engine to compute it + PCA::DATA_AS_ROW, // indicate that the vectors + // are stored as matrix rows + // (use PCA::DATA_AS_COL if the vectors are + // the matrix columns) + maxComponents // specify, how many principal components to retain + ); + // if there is no test data, just return the computed basis, ready-to-use + if( !testset.data ) + return pca; + CV_Assert( testset.cols == pcaset.cols ); + + compressed.create(testset.rows, maxComponents, testset.type()); + + Mat reconstructed; + for( int i = 0; i < testset.rows; i++ ) + { + Mat vec = testset.row(i), coeffs = compressed.row(i), reconstructed; + // compress the vector, the result will be stored + // in the i-th row of the output matrix + pca.project(vec, coeffs); + // and then reconstruct it + pca.backProject(coeffs, reconstructed); + // and measure the error + printf("%d. diff = %g\n", i, norm(vec, reconstructed, NORM_L2)); + } + return pca; +} +@endcode +@sa calcCovarMatrix, mulTransposed, SVD, dft, dct +*/ +class CV_EXPORTS PCA +{ +public: + enum Flags { DATA_AS_ROW = 0, //!< indicates that the input samples are stored as matrix rows + DATA_AS_COL = 1, //!< indicates that the input samples are stored as matrix columns + USE_AVG = 2 //! + }; + + /** @brief default constructor + + The default constructor initializes an empty %PCA structure. The other + constructors initialize the structure and call PCA::operator()(). + */ + PCA(); + + /** @overload + @param data input samples stored as matrix rows or matrix columns. + @param mean optional mean value; if the matrix is empty (@c noArray()), + the mean is computed from the data. + @param flags operation flags; currently the parameter is only used to + specify the data layout (PCA::Flags) + @param maxComponents maximum number of components that %PCA should + retain; by default, all the components are retained. + */ + PCA(InputArray data, InputArray mean, int flags, int maxComponents = 0); + + /** @overload + @param data input samples stored as matrix rows or matrix columns. + @param mean optional mean value; if the matrix is empty (noArray()), + the mean is computed from the data. + @param flags operation flags; currently the parameter is only used to + specify the data layout (PCA::Flags) + @param retainedVariance Percentage of variance that PCA should retain. + Using this parameter will let the PCA decided how many components to + retain but it will always keep at least 2. + */ + PCA(InputArray data, InputArray mean, int flags, double retainedVariance); + + /** @brief performs %PCA + + The operator performs %PCA of the supplied dataset. It is safe to reuse + the same PCA structure for multiple datasets. That is, if the structure + has been previously used with another dataset, the existing internal + data is reclaimed and the new @ref eigenvalues, @ref eigenvectors and @ref + mean are allocated and computed. + + The computed @ref eigenvalues are sorted from the largest to the smallest and + the corresponding @ref eigenvectors are stored as eigenvectors rows. + + @param data input samples stored as the matrix rows or as the matrix + columns. + @param mean optional mean value; if the matrix is empty (noArray()), + the mean is computed from the data. + @param flags operation flags; currently the parameter is only used to + specify the data layout. (Flags) + @param maxComponents maximum number of components that PCA should + retain; by default, all the components are retained. + */ + PCA& operator()(InputArray data, InputArray mean, int flags, int maxComponents = 0); + + /** @overload + @param data input samples stored as the matrix rows or as the matrix + columns. + @param mean optional mean value; if the matrix is empty (noArray()), + the mean is computed from the data. + @param flags operation flags; currently the parameter is only used to + specify the data layout. (PCA::Flags) + @param retainedVariance Percentage of variance that %PCA should retain. + Using this parameter will let the %PCA decided how many components to + retain but it will always keep at least 2. + */ + PCA& operator()(InputArray data, InputArray mean, int flags, double retainedVariance); + + /** @brief Projects vector(s) to the principal component subspace. + + The methods project one or more vectors to the principal component + subspace, where each vector projection is represented by coefficients in + the principal component basis. The first form of the method returns the + matrix that the second form writes to the result. So the first form can + be used as a part of expression while the second form can be more + efficient in a processing loop. + @param vec input vector(s); must have the same dimensionality and the + same layout as the input data used at %PCA phase, that is, if + DATA_AS_ROW are specified, then `vec.cols==data.cols` + (vector dimensionality) and `vec.rows` is the number of vectors to + project, and the same is true for the PCA::DATA_AS_COL case. + */ + Mat project(InputArray vec) const; + + /** @overload + @param vec input vector(s); must have the same dimensionality and the + same layout as the input data used at PCA phase, that is, if + DATA_AS_ROW are specified, then `vec.cols==data.cols` + (vector dimensionality) and `vec.rows` is the number of vectors to + project, and the same is true for the PCA::DATA_AS_COL case. + @param result output vectors; in case of PCA::DATA_AS_COL, the + output matrix has as many columns as the number of input vectors, this + means that `result.cols==vec.cols` and the number of rows match the + number of principal components (for example, `maxComponents` parameter + passed to the constructor). + */ + void project(InputArray vec, OutputArray result) const; + + /** @brief Reconstructs vectors from their PC projections. + + The methods are inverse operations to PCA::project. They take PC + coordinates of projected vectors and reconstruct the original vectors. + Unless all the principal components have been retained, the + reconstructed vectors are different from the originals. But typically, + the difference is small if the number of components is large enough (but + still much smaller than the original vector dimensionality). As a + result, PCA is used. + @param vec coordinates of the vectors in the principal component + subspace, the layout and size are the same as of PCA::project output + vectors. + */ + Mat backProject(InputArray vec) const; + + /** @overload + @param vec coordinates of the vectors in the principal component + subspace, the layout and size are the same as of PCA::project output + vectors. + @param result reconstructed vectors; the layout and size are the same as + of PCA::project input vectors. + */ + void backProject(InputArray vec, OutputArray result) const; + + /** @brief write PCA objects + + Writes @ref eigenvalues @ref eigenvectors and @ref mean to specified FileStorage + */ + void write(FileStorage& fs) const; + + /** @brief load PCA objects + + Loads @ref eigenvalues @ref eigenvectors and @ref mean from specified FileNode + */ + void read(const FileNode& fn); + + Mat eigenvectors; //!< eigenvectors of the covariation matrix + Mat eigenvalues; //!< eigenvalues of the covariation matrix + Mat mean; //!< mean value subtracted before the projection and added after the back projection +}; + +/** @example samples/cpp/pca.cpp +An example using %PCA for dimensionality reduction while maintaining an amount of variance +*/ + +/** @example samples/cpp/tutorial_code/ml/introduction_to_pca/introduction_to_pca.cpp +Check @ref tutorial_introduction_to_pca "the corresponding tutorial" for more details +*/ + +/** +@brief Linear Discriminant Analysis +@todo document this class +*/ +class CV_EXPORTS LDA +{ +public: + /** @brief constructor + Initializes a LDA with num_components (default 0). + */ + explicit LDA(int num_components = 0); + + /** Initializes and performs a Discriminant Analysis with Fisher's + Optimization Criterion on given data in src and corresponding labels + in labels. If 0 (or less) number of components are given, they are + automatically determined for given data in computation. + */ + LDA(InputArrayOfArrays src, InputArray labels, int num_components = 0); + + /** Serializes this object to a given filename. + */ + void save(const String& filename) const; + + /** Deserializes this object from a given filename. + */ + void load(const String& filename); + + /** Serializes this object to a given cv::FileStorage. + */ + void save(FileStorage& fs) const; + + /** Deserializes this object from a given cv::FileStorage. + */ + void load(const FileStorage& node); + + /** destructor + */ + ~LDA(); + + /** Compute the discriminants for data in src (row aligned) and labels. + */ + void compute(InputArrayOfArrays src, InputArray labels); + + /** Projects samples into the LDA subspace. + src may be one or more row aligned samples. + */ + Mat project(InputArray src); + + /** Reconstructs projections from the LDA subspace. + src may be one or more row aligned projections. + */ + Mat reconstruct(InputArray src); + + /** Returns the eigenvectors of this LDA. + */ + Mat eigenvectors() const { return _eigenvectors; } + + /** Returns the eigenvalues of this LDA. + */ + Mat eigenvalues() const { return _eigenvalues; } + + static Mat subspaceProject(InputArray W, InputArray mean, InputArray src); + static Mat subspaceReconstruct(InputArray W, InputArray mean, InputArray src); + +protected: + int _num_components; + Mat _eigenvectors; + Mat _eigenvalues; + void lda(InputArrayOfArrays src, InputArray labels); +}; + +/** @brief Singular Value Decomposition + +Class for computing Singular Value Decomposition of a floating-point +matrix. The Singular Value Decomposition is used to solve least-square +problems, under-determined linear systems, invert matrices, compute +condition numbers, and so on. + +If you want to compute a condition number of a matrix or an absolute value of +its determinant, you do not need `u` and `vt`. You can pass +flags=SVD::NO_UV|... . Another flag SVD::FULL_UV indicates that full-size u +and vt must be computed, which is not necessary most of the time. + +@sa invert, solve, eigen, determinant +*/ +class CV_EXPORTS SVD +{ +public: + enum Flags { + /** allow the algorithm to modify the decomposed matrix; it can save space and speed up + processing. currently ignored. */ + MODIFY_A = 1, + /** indicates that only a vector of singular values `w` is to be processed, while u and vt + will be set to empty matrices */ + NO_UV = 2, + /** when the matrix is not square, by default the algorithm produces u and vt matrices of + sufficiently large size for the further A reconstruction; if, however, FULL_UV flag is + specified, u and vt will be full-size square orthogonal matrices.*/ + FULL_UV = 4 + }; + + /** @brief the default constructor + + initializes an empty SVD structure + */ + SVD(); + + /** @overload + initializes an empty SVD structure and then calls SVD::operator() + @param src decomposed matrix. The depth has to be CV_32F or CV_64F. + @param flags operation flags (SVD::Flags) + */ + SVD( InputArray src, int flags = 0 ); + + /** @brief the operator that performs SVD. The previously allocated u, w and vt are released. + + The operator performs the singular value decomposition of the supplied + matrix. The u,`vt` , and the vector of singular values w are stored in + the structure. The same SVD structure can be reused many times with + different matrices. Each time, if needed, the previous u,`vt` , and w + are reclaimed and the new matrices are created, which is all handled by + Mat::create. + @param src decomposed matrix. The depth has to be CV_32F or CV_64F. + @param flags operation flags (SVD::Flags) + */ + SVD& operator ()( InputArray src, int flags = 0 ); + + /** @brief decomposes matrix and stores the results to user-provided matrices + + The methods/functions perform SVD of matrix. Unlike SVD::SVD constructor + and SVD::operator(), they store the results to the user-provided + matrices: + + @code{.cpp} + Mat A, w, u, vt; + SVD::compute(A, w, u, vt); + @endcode + + @param src decomposed matrix. The depth has to be CV_32F or CV_64F. + @param w calculated singular values + @param u calculated left singular vectors + @param vt transposed matrix of right singular vectors + @param flags operation flags - see SVD::Flags. + */ + static void compute( InputArray src, OutputArray w, + OutputArray u, OutputArray vt, int flags = 0 ); + + /** @overload + computes singular values of a matrix + @param src decomposed matrix. The depth has to be CV_32F or CV_64F. + @param w calculated singular values + @param flags operation flags - see SVD::Flags. + */ + static void compute( InputArray src, OutputArray w, int flags = 0 ); + + /** @brief performs back substitution + */ + static void backSubst( InputArray w, InputArray u, + InputArray vt, InputArray rhs, + OutputArray dst ); + + /** @brief solves an under-determined singular linear system + + The method finds a unit-length solution x of a singular linear system + A\*x = 0. Depending on the rank of A, there can be no solutions, a + single solution or an infinite number of solutions. In general, the + algorithm solves the following problem: + \f[dst = \arg \min _{x: \| x \| =1} \| src \cdot x \|\f] + @param src left-hand-side matrix. + @param dst found solution. + */ + static void solveZ( InputArray src, OutputArray dst ); + + /** @brief performs a singular value back substitution. + + The method calculates a back substitution for the specified right-hand + side: + + \f[\texttt{x} = \texttt{vt} ^T \cdot diag( \texttt{w} )^{-1} \cdot \texttt{u} ^T \cdot \texttt{rhs} \sim \texttt{A} ^{-1} \cdot \texttt{rhs}\f] + + Using this technique you can either get a very accurate solution of the + convenient linear system, or the best (in the least-squares terms) + pseudo-solution of an overdetermined linear system. + + @param rhs right-hand side of a linear system (u\*w\*v')\*dst = rhs to + be solved, where A has been previously decomposed. + + @param dst found solution of the system. + + @note Explicit SVD with the further back substitution only makes sense + if you need to solve many linear systems with the same left-hand side + (for example, src ). If all you need is to solve a single system + (possibly with multiple rhs immediately available), simply call solve + add pass #DECOMP_SVD there. It does absolutely the same thing. + */ + void backSubst( InputArray rhs, OutputArray dst ) const; + + /** @todo document */ + template static + void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w, Matx<_Tp, m, nm>& u, Matx<_Tp, n, nm>& vt ); + + /** @todo document */ + template static + void compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w ); + + /** @todo document */ + template static + void backSubst( const Matx<_Tp, nm, 1>& w, const Matx<_Tp, m, nm>& u, const Matx<_Tp, n, nm>& vt, const Matx<_Tp, m, nb>& rhs, Matx<_Tp, n, nb>& dst ); + + Mat u, w, vt; +}; + +/** @brief Random Number Generator + +Random number generator. It encapsulates the state (currently, a 64-bit +integer) and has methods to return scalar random values and to fill +arrays with random values. Currently it supports uniform and Gaussian +(normal) distributions. The generator uses Multiply-With-Carry +algorithm, introduced by G. Marsaglia ( + ). +Gaussian-distribution random numbers are generated using the Ziggurat +algorithm ( ), +introduced by G. Marsaglia and W. W. Tsang. +*/ +class CV_EXPORTS RNG +{ +public: + enum { UNIFORM = 0, + NORMAL = 1 + }; + + /** @brief constructor + + These are the RNG constructors. The first form sets the state to some + pre-defined value, equal to 2\*\*32-1 in the current implementation. The + second form sets the state to the specified value. If you passed state=0 + , the constructor uses the above default value instead to avoid the + singular random number sequence, consisting of all zeros. + */ + RNG(); + /** @overload + @param state 64-bit value used to initialize the RNG. + */ + RNG(uint64 state); + /**The method updates the state using the MWC algorithm and returns the + next 32-bit random number.*/ + unsigned next(); + + /**Each of the methods updates the state using the MWC algorithm and + returns the next random number of the specified type. In case of integer + types, the returned number is from the available value range for the + specified type. In case of floating-point types, the returned value is + from [0,1) range. + */ + operator uchar(); + /** @overload */ + operator schar(); + /** @overload */ + operator ushort(); + /** @overload */ + operator short(); + /** @overload */ + operator unsigned(); + /** @overload */ + operator int(); + /** @overload */ + operator float(); + /** @overload */ + operator double(); + + /** @brief returns a random integer sampled uniformly from [0, N). + + The methods transform the state using the MWC algorithm and return the + next random number. The first form is equivalent to RNG::next . The + second form returns the random number modulo N , which means that the + result is in the range [0, N) . + */ + unsigned operator ()(); + /** @overload + @param N upper non-inclusive boundary of the returned random number. + */ + unsigned operator ()(unsigned N); + + /** @brief returns uniformly distributed integer random number from [a,b) range + + The methods transform the state using the MWC algorithm and return the + next uniformly-distributed random number of the specified type, deduced + from the input parameter type, from the range [a, b) . There is a nuance + illustrated by the following sample: + + @code{.cpp} + RNG rng; + + // always produces 0 + double a = rng.uniform(0, 1); + + // produces double from [0, 1) + double a1 = rng.uniform((double)0, (double)1); + + // produces float from [0, 1) + float b = rng.uniform(0.f, 1.f); + + // produces double from [0, 1) + double c = rng.uniform(0., 1.); + + // may cause compiler error because of ambiguity: + // RNG::uniform(0, (int)0.999999)? or RNG::uniform((double)0, 0.99999)? + double d = rng.uniform(0, 0.999999); + @endcode + + The compiler does not take into account the type of the variable to + which you assign the result of RNG::uniform . The only thing that + matters to the compiler is the type of a and b parameters. So, if you + want a floating-point random number, but the range boundaries are + integer numbers, either put dots in the end, if they are constants, or + use explicit type cast operators, as in the a1 initialization above. + @param a lower inclusive boundary of the returned random number. + @param b upper non-inclusive boundary of the returned random number. + */ + int uniform(int a, int b); + /** @overload */ + float uniform(float a, float b); + /** @overload */ + double uniform(double a, double b); + + /** @brief Fills arrays with random numbers. + + @param mat 2D or N-dimensional matrix; currently matrices with more than + 4 channels are not supported by the methods, use Mat::reshape as a + possible workaround. + @param distType distribution type, RNG::UNIFORM or RNG::NORMAL. + @param a first distribution parameter; in case of the uniform + distribution, this is an inclusive lower boundary, in case of the normal + distribution, this is a mean value. + @param b second distribution parameter; in case of the uniform + distribution, this is a non-inclusive upper boundary, in case of the + normal distribution, this is a standard deviation (diagonal of the + standard deviation matrix or the full standard deviation matrix). + @param saturateRange pre-saturation flag; for uniform distribution only; + if true, the method will first convert a and b to the acceptable value + range (according to the mat datatype) and then will generate uniformly + distributed random numbers within the range [saturate(a), saturate(b)), + if saturateRange=false, the method will generate uniformly distributed + random numbers in the original range [a, b) and then will saturate them, + it means, for example, that + theRNG().fill(mat_8u, RNG::UNIFORM, -DBL_MAX, DBL_MAX) will likely + produce array mostly filled with 0's and 255's, since the range (0, 255) + is significantly smaller than [-DBL_MAX, DBL_MAX). + + Each of the methods fills the matrix with the random values from the + specified distribution. As the new numbers are generated, the RNG state + is updated accordingly. In case of multiple-channel images, every + channel is filled independently, which means that RNG cannot generate + samples from the multi-dimensional Gaussian distribution with + non-diagonal covariance matrix directly. To do that, the method + generates samples from multi-dimensional standard Gaussian distribution + with zero mean and identity covariation matrix, and then transforms them + using transform to get samples from the specified Gaussian distribution. + */ + void fill( InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange = false ); + + /** @brief Returns the next random number sampled from the Gaussian distribution + @param sigma standard deviation of the distribution. + + The method transforms the state using the MWC algorithm and returns the + next random number from the Gaussian distribution N(0,sigma) . That is, + the mean value of the returned random numbers is zero and the standard + deviation is the specified sigma . + */ + double gaussian(double sigma); + + uint64 state; + + bool operator ==(const RNG& other) const; +}; + +/** @brief Mersenne Twister random number generator + +Inspired by http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c +@todo document +*/ +class CV_EXPORTS RNG_MT19937 +{ +public: + RNG_MT19937(); + RNG_MT19937(unsigned s); + void seed(unsigned s); + + unsigned next(); + + operator int(); + operator unsigned(); + operator float(); + operator double(); + + unsigned operator ()(unsigned N); + unsigned operator ()(); + + /** @brief returns uniformly distributed integer random number from [a,b) range*/ + int uniform(int a, int b); + /** @brief returns uniformly distributed floating-point random number from [a,b) range*/ + float uniform(float a, float b); + /** @brief returns uniformly distributed double-precision floating-point random number from [a,b) range*/ + double uniform(double a, double b); + +private: + enum PeriodParameters {N = 624, M = 397}; + unsigned state[N]; + int mti; +}; + +//! @} core_array + +//! @addtogroup core_cluster +//! @{ + +/** @example samples/cpp/kmeans.cpp +An example on K-means clustering +*/ + +/** @brief Finds centers of clusters and groups input samples around the clusters. + +The function kmeans implements a k-means algorithm that finds the centers of cluster_count clusters +and groups the input samples around the clusters. As an output, \f$\texttt{bestLabels}_i\f$ contains a +0-based cluster index for the sample stored in the \f$i^{th}\f$ row of the samples matrix. + +@note +- (Python) An example on K-means clustering can be found at + opencv_source_code/samples/python/kmeans.py +@param data Data for clustering. An array of N-Dimensional points with float coordinates is needed. +Examples of this array can be: +- Mat points(count, 2, CV_32F); +- Mat points(count, 1, CV_32FC2); +- Mat points(1, count, CV_32FC2); +- std::vector\ points(sampleCount); +@param K Number of clusters to split the set by. +@param bestLabels Input/output integer array that stores the cluster indices for every sample. +@param criteria The algorithm termination criteria, that is, the maximum number of iterations and/or +the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of the cluster +centers moves by less than criteria.epsilon on some iteration, the algorithm stops. +@param attempts Flag to specify the number of times the algorithm is executed using different +initial labellings. The algorithm returns the labels that yield the best compactness (see the last +function parameter). +@param flags Flag that can take values of cv::KmeansFlags +@param centers Output matrix of the cluster centers, one row per each cluster center. +@return The function returns the compactness measure that is computed as +\f[\sum _i \| \texttt{samples} _i - \texttt{centers} _{ \texttt{labels} _i} \| ^2\f] +after every attempt. The best (minimum) value is chosen and the corresponding labels and the +compactness value are returned by the function. Basically, you can use only the core of the +function, set the number of attempts to 1, initialize labels each time using a custom algorithm, +pass them with the ( flags = #KMEANS_USE_INITIAL_LABELS ) flag, and then choose the best +(most-compact) clustering. +*/ +CV_EXPORTS_W double kmeans( InputArray data, int K, InputOutputArray bestLabels, + TermCriteria criteria, int attempts, + int flags, OutputArray centers = noArray() ); + +//! @} core_cluster + +//! @addtogroup core_basic +//! @{ + +/////////////////////////////// Formatted output of cv::Mat /////////////////////////// + +/** @todo document */ +class CV_EXPORTS Formatted +{ +public: + virtual const char* next() = 0; + virtual void reset() = 0; + virtual ~Formatted(); +}; + +/** @todo document */ +class CV_EXPORTS Formatter +{ +public: + enum FormatType { + FMT_DEFAULT = 0, + FMT_MATLAB = 1, + FMT_CSV = 2, + FMT_PYTHON = 3, + FMT_NUMPY = 4, + FMT_C = 5 + }; + + virtual ~Formatter(); + + virtual Ptr format(const Mat& mtx) const = 0; + + virtual void set16fPrecision(int p = 4) = 0; + virtual void set32fPrecision(int p = 8) = 0; + virtual void set64fPrecision(int p = 16) = 0; + virtual void setMultiline(bool ml = true) = 0; + + static Ptr get(Formatter::FormatType fmt = FMT_DEFAULT); + +}; + +static inline +String& operator << (String& out, Ptr fmtd) +{ + fmtd->reset(); + for(const char* str = fmtd->next(); str; str = fmtd->next()) + out += cv::String(str); + return out; +} + +static inline +String& operator << (String& out, const Mat& mtx) +{ + return out << Formatter::get()->format(mtx); +} + +//////////////////////////////////////// Algorithm //////////////////////////////////// + +class CV_EXPORTS Algorithm; + +template struct ParamType {}; + + +/** @brief This is a base class for all more or less complex algorithms in OpenCV + +especially for classes of algorithms, for which there can be multiple implementations. The examples +are stereo correspondence (for which there are algorithms like block matching, semi-global block +matching, graph-cut etc.), background subtraction (which can be done using mixture-of-gaussians +models, codebook-based algorithm etc.), optical flow (block matching, Lucas-Kanade, Horn-Schunck +etc.). + +Here is example of SimpleBlobDetector use in your application via Algorithm interface: +@snippet snippets/core_various.cpp Algorithm +*/ +class CV_EXPORTS_W Algorithm +{ +public: + Algorithm(); + virtual ~Algorithm(); + + /** @brief Clears the algorithm state + */ + CV_WRAP virtual void clear() {} + + /** @brief Stores algorithm parameters in a file storage + */ + CV_WRAP virtual void write(FileStorage& fs) const { CV_UNUSED(fs); } + + /** + * @overload + */ + CV_WRAP void write(FileStorage& fs, const String& name) const; +#if CV_VERSION_MAJOR < 5 + /** @deprecated */ + void write(const Ptr& fs, const String& name = String()) const; +#endif + + /** @brief Reads algorithm parameters from a file storage + */ + CV_WRAP virtual void read(const FileNode& fn) { CV_UNUSED(fn); } + + /** @brief Returns true if the Algorithm is empty (e.g. in the very beginning or after unsuccessful read + */ + CV_WRAP virtual bool empty() const { return false; } + + /** @brief Reads algorithm from the file node + + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + cv::FileStorage fsRead("example.xml", FileStorage::READ); + Ptr svm = Algorithm::read(fsRead.root()); + @endcode + In order to make this method work, the derived class must overwrite Algorithm::read(const + FileNode& fn) and also have static create() method without parameters + (or with all the optional parameters) + */ + template static Ptr<_Tp> read(const FileNode& fn) + { + Ptr<_Tp> obj = _Tp::create(); + obj->read(fn); + return !obj->empty() ? obj : Ptr<_Tp>(); + } + + /** @brief Loads algorithm from the file + + @param filename Name of the file to read. + @param objname The optional name of the node to read (if empty, the first top-level node will be used) + + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + Ptr svm = Algorithm::load("my_svm_model.xml"); + @endcode + In order to make this method work, the derived class must overwrite Algorithm::read(const + FileNode& fn). + */ + template static Ptr<_Tp> load(const String& filename, const String& objname=String()) + { + FileStorage fs(filename, FileStorage::READ); + CV_Assert(fs.isOpened()); + FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname]; + if (fn.empty()) return Ptr<_Tp>(); + Ptr<_Tp> obj = _Tp::create(); + obj->read(fn); + return !obj->empty() ? obj : Ptr<_Tp>(); + } + + /** @brief Loads algorithm from a String + + @param strModel The string variable containing the model you want to load. + @param objname The optional name of the node to read (if empty, the first top-level node will be used) + + This is static template method of Algorithm. It's usage is following (in the case of SVM): + @code + Ptr svm = Algorithm::loadFromString(myStringModel); + @endcode + */ + template static Ptr<_Tp> loadFromString(const String& strModel, const String& objname=String()) + { + FileStorage fs(strModel, FileStorage::READ + FileStorage::MEMORY); + FileNode fn = objname.empty() ? fs.getFirstTopLevelNode() : fs[objname]; + Ptr<_Tp> obj = _Tp::create(); + obj->read(fn); + return !obj->empty() ? obj : Ptr<_Tp>(); + } + + /** Saves the algorithm to a file. + In order to make this method work, the derived class must implement Algorithm::write(FileStorage& fs). */ + CV_WRAP virtual void save(const String& filename) const; + + /** Returns the algorithm string identifier. + This string is used as top level xml/yml node tag when the object is saved to a file or string. */ + CV_WRAP virtual String getDefaultName() const; + +protected: + void writeFormat(FileStorage& fs) const; +}; + +enum struct Param { + INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6, FLOAT=7, + UNSIGNED_INT=8, UINT64=9, UCHAR=11, SCALAR=12 +}; + + + +template<> struct ParamType +{ + typedef bool const_param_type; + typedef bool member_type; + + static const Param type = Param::BOOLEAN; +}; + +template<> struct ParamType +{ + typedef int const_param_type; + typedef int member_type; + + static const Param type = Param::INT; +}; + +template<> struct ParamType +{ + typedef double const_param_type; + typedef double member_type; + + static const Param type = Param::REAL; +}; + +template<> struct ParamType +{ + typedef const String& const_param_type; + typedef String member_type; + + static const Param type = Param::STRING; +}; + +template<> struct ParamType +{ + typedef const Mat& const_param_type; + typedef Mat member_type; + + static const Param type = Param::MAT; +}; + +template<> struct ParamType > +{ + typedef const std::vector& const_param_type; + typedef std::vector member_type; + + static const Param type = Param::MAT_VECTOR; +}; + +template<> struct ParamType +{ + typedef const Ptr& const_param_type; + typedef Ptr member_type; + + static const Param type = Param::ALGORITHM; +}; + +template<> struct ParamType +{ + typedef float const_param_type; + typedef float member_type; + + static const Param type = Param::FLOAT; +}; + +template<> struct ParamType +{ + typedef unsigned const_param_type; + typedef unsigned member_type; + + static const Param type = Param::UNSIGNED_INT; +}; + +template<> struct ParamType +{ + typedef uint64 const_param_type; + typedef uint64 member_type; + + static const Param type = Param::UINT64; +}; + +template<> struct ParamType +{ + typedef uchar const_param_type; + typedef uchar member_type; + + static const Param type = Param::UCHAR; +}; + +template<> struct ParamType +{ + typedef const Scalar& const_param_type; + typedef Scalar member_type; + + static const Param type = Param::SCALAR; +}; + +template +struct ParamType<_Tp, typename std::enable_if< std::is_enum<_Tp>::value >::type> +{ + typedef typename std::underlying_type<_Tp>::type const_param_type; + typedef typename std::underlying_type<_Tp>::type member_type; + + static const Param type = Param::INT; +}; + +//! @} core_basic + +} //namespace cv + +#include "opencv2/core/operations.hpp" +#include "opencv2/core/cvstd.inl.hpp" +#include "opencv2/core/utility.hpp" +#include "opencv2/core/optim.hpp" +#include "opencv2/core/ovx.hpp" + +#endif /*OPENCV_CORE_HPP*/ diff --git a/Thirdparty/opencv2/include/opencv2/core/affine.hpp b/Thirdparty/opencv2/include/opencv2/core/affine.hpp new file mode 100644 index 0000000..1806382 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/affine.hpp @@ -0,0 +1,678 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_AFFINE3_HPP +#define OPENCV_CORE_AFFINE3_HPP + +#ifdef __cplusplus + +#include + +namespace cv +{ + +//! @addtogroup core +//! @{ + + /** @brief Affine transform + * + * It represents a 4x4 homogeneous transformation matrix \f$T\f$ + * + * \f[T = + * \begin{bmatrix} + * R & t\\ + * 0 & 1\\ + * \end{bmatrix} + * \f] + * + * where \f$R\f$ is a 3x3 rotation matrix and \f$t\f$ is a 3x1 translation vector. + * + * You can specify \f$R\f$ either by a 3x3 rotation matrix or by a 3x1 rotation vector, + * which is converted to a 3x3 rotation matrix by the Rodrigues formula. + * + * To construct a matrix \f$T\f$ representing first rotation around the axis \f$r\f$ with rotation + * angle \f$|r|\f$ in radian (right hand rule) and then translation by the vector \f$t\f$, you can use + * + * @code + * cv::Vec3f r, t; + * cv::Affine3f T(r, t); + * @endcode + * + * If you already have the rotation matrix \f$R\f$, then you can use + * + * @code + * cv::Matx33f R; + * cv::Affine3f T(R, t); + * @endcode + * + * To extract the rotation matrix \f$R\f$ from \f$T\f$, use + * + * @code + * cv::Matx33f R = T.rotation(); + * @endcode + * + * To extract the translation vector \f$t\f$ from \f$T\f$, use + * + * @code + * cv::Vec3f t = T.translation(); + * @endcode + * + * To extract the rotation vector \f$r\f$ from \f$T\f$, use + * + * @code + * cv::Vec3f r = T.rvec(); + * @endcode + * + * Note that since the mapping from rotation vectors to rotation matrices + * is many to one. The returned rotation vector is not necessarily the one + * you used before to set the matrix. + * + * If you have two transformations \f$T = T_1 * T_2\f$, use + * + * @code + * cv::Affine3f T, T1, T2; + * T = T2.concatenate(T1); + * @endcode + * + * To get the inverse transform of \f$T\f$, use + * + * @code + * cv::Affine3f T, T_inv; + * T_inv = T.inv(); + * @endcode + * + */ + template + class Affine3 + { + public: + typedef T float_type; + typedef Matx Mat3; + typedef Matx Mat4; + typedef Vec Vec3; + + //! Default constructor. It represents a 4x4 identity matrix. + Affine3(); + + //! Augmented affine matrix + Affine3(const Mat4& affine); + + /** + * The resulting 4x4 matrix is + * + * \f[ + * \begin{bmatrix} + * R & t\\ + * 0 & 1\\ + * \end{bmatrix} + * \f] + * + * @param R 3x3 rotation matrix. + * @param t 3x1 translation vector. + */ + Affine3(const Mat3& R, const Vec3& t = Vec3::all(0)); + + /** + * Rodrigues vector. + * + * The last row of the current matrix is set to [0,0,0,1]. + * + * @param rvec 3x1 rotation vector. Its direction indicates the rotation axis and its length + * indicates the rotation angle in radian (using right hand rule). + * @param t 3x1 translation vector. + */ + Affine3(const Vec3& rvec, const Vec3& t = Vec3::all(0)); + + /** + * Combines all constructors above. Supports 4x4, 3x4, 3x3, 1x3, 3x1 sizes of data matrix. + * + * The last row of the current matrix is set to [0,0,0,1] when data is not 4x4. + * + * @param data 1-channel matrix. + * when it is 4x4, it is copied to the current matrix and t is not used. + * When it is 3x4, it is copied to the upper part 3x4 of the current matrix and t is not used. + * When it is 3x3, it is copied to the upper left 3x3 part of the current matrix. + * When it is 3x1 or 1x3, it is treated as a rotation vector and the Rodrigues formula is used + * to compute a 3x3 rotation matrix. + * @param t 3x1 translation vector. It is used only when data is neither 4x4 nor 3x4. + */ + explicit Affine3(const Mat& data, const Vec3& t = Vec3::all(0)); + + //! From 16-element array + explicit Affine3(const float_type* vals); + + //! Create an 4x4 identity transform + static Affine3 Identity(); + + /** + * Rotation matrix. + * + * Copy the rotation matrix to the upper left 3x3 part of the current matrix. + * The remaining elements of the current matrix are not changed. + * + * @param R 3x3 rotation matrix. + * + */ + void rotation(const Mat3& R); + + /** + * Rodrigues vector. + * + * It sets the upper left 3x3 part of the matrix. The remaining part is unaffected. + * + * @param rvec 3x1 rotation vector. The direction indicates the rotation axis and + * its length indicates the rotation angle in radian (using the right thumb convention). + */ + void rotation(const Vec3& rvec); + + /** + * Combines rotation methods above. Supports 3x3, 1x3, 3x1 sizes of data matrix. + * + * It sets the upper left 3x3 part of the matrix. The remaining part is unaffected. + * + * @param data 1-channel matrix. + * When it is a 3x3 matrix, it sets the upper left 3x3 part of the current matrix. + * When it is a 1x3 or 3x1 matrix, it is used as a rotation vector. The Rodrigues formula + * is used to compute the rotation matrix and sets the upper left 3x3 part of the current matrix. + */ + void rotation(const Mat& data); + + /** + * Copy the 3x3 matrix L to the upper left part of the current matrix + * + * It sets the upper left 3x3 part of the matrix. The remaining part is unaffected. + * + * @param L 3x3 matrix. + */ + void linear(const Mat3& L); + + /** + * Copy t to the first three elements of the last column of the current matrix + * + * It sets the upper right 3x1 part of the matrix. The remaining part is unaffected. + * + * @param t 3x1 translation vector. + */ + void translation(const Vec3& t); + + //! @return the upper left 3x3 part + Mat3 rotation() const; + + //! @return the upper left 3x3 part + Mat3 linear() const; + + //! @return the upper right 3x1 part + Vec3 translation() const; + + //! Rodrigues vector. + //! @return a vector representing the upper left 3x3 rotation matrix of the current matrix. + //! @warning Since the mapping between rotation vectors and rotation matrices is many to one, + //! this function returns only one rotation vector that represents the current rotation matrix, + //! which is not necessarily the same one set by `rotation(const Vec3& rvec)`. + Vec3 rvec() const; + + //! @return the inverse of the current matrix. + Affine3 inv(int method = cv::DECOMP_SVD) const; + + //! a.rotate(R) is equivalent to Affine(R, 0) * a; + Affine3 rotate(const Mat3& R) const; + + //! a.rotate(rvec) is equivalent to Affine(rvec, 0) * a; + Affine3 rotate(const Vec3& rvec) const; + + //! a.translate(t) is equivalent to Affine(E, t) * a, where E is an identity matrix + Affine3 translate(const Vec3& t) const; + + //! a.concatenate(affine) is equivalent to affine * a; + Affine3 concatenate(const Affine3& affine) const; + + template operator Affine3() const; + + template Affine3 cast() const; + + Mat4 matrix; + +#if defined EIGEN_WORLD_VERSION && defined EIGEN_GEOMETRY_MODULE_H + Affine3(const Eigen::Transform& affine); + Affine3(const Eigen::Transform& affine); + operator Eigen::Transform() const; + operator Eigen::Transform() const; +#endif + }; + + template static + Affine3 operator*(const Affine3& affine1, const Affine3& affine2); + + //! V is a 3-element vector with member fields x, y and z + template static + V operator*(const Affine3& affine, const V& vector); + + typedef Affine3 Affine3f; + typedef Affine3 Affine3d; + + static Vec3f operator*(const Affine3f& affine, const Vec3f& vector); + static Vec3d operator*(const Affine3d& affine, const Vec3d& vector); + + template class DataType< Affine3<_Tp> > + { + public: + typedef Affine3<_Tp> value_type; + typedef Affine3::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 16, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; + }; + + namespace traits { + template + struct Depth< Affine3<_Tp> > { enum { value = Depth<_Tp>::value }; }; + template + struct Type< Affine3<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 16) }; }; + } // namespace + +//! @} core + +} + +//! @cond IGNORED + +/////////////////////////////////////////////////////////////////////////////////// +// Implementation + +template inline +cv::Affine3::Affine3() + : matrix(Mat4::eye()) +{} + +template inline +cv::Affine3::Affine3(const Mat4& affine) + : matrix(affine) +{} + +template inline +cv::Affine3::Affine3(const Mat3& R, const Vec3& t) +{ + rotation(R); + translation(t); + matrix.val[12] = matrix.val[13] = matrix.val[14] = 0; + matrix.val[15] = 1; +} + +template inline +cv::Affine3::Affine3(const Vec3& _rvec, const Vec3& t) +{ + rotation(_rvec); + translation(t); + matrix.val[12] = matrix.val[13] = matrix.val[14] = 0; + matrix.val[15] = 1; +} + +template inline +cv::Affine3::Affine3(const cv::Mat& data, const Vec3& t) +{ + CV_Assert(data.type() == cv::traits::Type::value); + CV_Assert(data.channels() == 1); + + if (data.cols == 4 && data.rows == 4) + { + data.copyTo(matrix); + return; + } + else if (data.cols == 4 && data.rows == 3) + { + rotation(data(Rect(0, 0, 3, 3))); + translation(data(Rect(3, 0, 1, 3))); + } + else + { + rotation(data); + translation(t); + } + + matrix.val[12] = matrix.val[13] = matrix.val[14] = 0; + matrix.val[15] = 1; +} + +template inline +cv::Affine3::Affine3(const float_type* vals) : matrix(vals) +{} + +template inline +cv::Affine3 cv::Affine3::Identity() +{ + return Affine3(cv::Affine3::Mat4::eye()); +} + +template inline +void cv::Affine3::rotation(const Mat3& R) +{ + linear(R); +} + +template inline +void cv::Affine3::rotation(const Vec3& _rvec) +{ + double theta = norm(_rvec); + + if (theta < DBL_EPSILON) + rotation(Mat3::eye()); + else + { + double c = std::cos(theta); + double s = std::sin(theta); + double c1 = 1. - c; + double itheta = (theta != 0) ? 1./theta : 0.; + + Point3_ r = _rvec*itheta; + + Mat3 rrt( r.x*r.x, r.x*r.y, r.x*r.z, r.x*r.y, r.y*r.y, r.y*r.z, r.x*r.z, r.y*r.z, r.z*r.z ); + Mat3 r_x( 0, -r.z, r.y, r.z, 0, -r.x, -r.y, r.x, 0 ); + + // R = cos(theta)*I + (1 - cos(theta))*r*rT + sin(theta)*[r_x] + // where [r_x] is [0 -rz ry; rz 0 -rx; -ry rx 0] + Mat3 R = c*Mat3::eye() + c1*rrt + s*r_x; + + rotation(R); + } +} + +//Combines rotation methods above. Supports 3x3, 1x3, 3x1 sizes of data matrix; +template inline +void cv::Affine3::rotation(const cv::Mat& data) +{ + CV_Assert(data.type() == cv::traits::Type::value); + CV_Assert(data.channels() == 1); + + if (data.cols == 3 && data.rows == 3) + { + Mat3 R; + data.copyTo(R); + rotation(R); + } + else if ((data.cols == 3 && data.rows == 1) || (data.cols == 1 && data.rows == 3)) + { + Vec3 _rvec; + data.reshape(1, 3).copyTo(_rvec); + rotation(_rvec); + } + else + CV_Error(Error::StsError, "Input matrix can only be 3x3, 1x3 or 3x1"); +} + +template inline +void cv::Affine3::linear(const Mat3& L) +{ + matrix.val[0] = L.val[0]; matrix.val[1] = L.val[1]; matrix.val[ 2] = L.val[2]; + matrix.val[4] = L.val[3]; matrix.val[5] = L.val[4]; matrix.val[ 6] = L.val[5]; + matrix.val[8] = L.val[6]; matrix.val[9] = L.val[7]; matrix.val[10] = L.val[8]; +} + +template inline +void cv::Affine3::translation(const Vec3& t) +{ + matrix.val[3] = t[0]; matrix.val[7] = t[1]; matrix.val[11] = t[2]; +} + +template inline +typename cv::Affine3::Mat3 cv::Affine3::rotation() const +{ + return linear(); +} + +template inline +typename cv::Affine3::Mat3 cv::Affine3::linear() const +{ + typename cv::Affine3::Mat3 R; + R.val[0] = matrix.val[0]; R.val[1] = matrix.val[1]; R.val[2] = matrix.val[ 2]; + R.val[3] = matrix.val[4]; R.val[4] = matrix.val[5]; R.val[5] = matrix.val[ 6]; + R.val[6] = matrix.val[8]; R.val[7] = matrix.val[9]; R.val[8] = matrix.val[10]; + return R; +} + +template inline +typename cv::Affine3::Vec3 cv::Affine3::translation() const +{ + return Vec3(matrix.val[3], matrix.val[7], matrix.val[11]); +} + +template inline +typename cv::Affine3::Vec3 cv::Affine3::rvec() const +{ + cv::Vec3d w; + cv::Matx33d u, vt, R = rotation(); + cv::SVD::compute(R, w, u, vt, cv::SVD::FULL_UV + cv::SVD::MODIFY_A); + R = u * vt; + + double rx = R.val[7] - R.val[5]; + double ry = R.val[2] - R.val[6]; + double rz = R.val[3] - R.val[1]; + + double s = std::sqrt((rx*rx + ry*ry + rz*rz)*0.25); + double c = (R.val[0] + R.val[4] + R.val[8] - 1) * 0.5; + c = c > 1.0 ? 1.0 : c < -1.0 ? -1.0 : c; + double theta = std::acos(c); + + if( s < 1e-5 ) + { + if( c > 0 ) + rx = ry = rz = 0; + else + { + double t; + t = (R.val[0] + 1) * 0.5; + rx = std::sqrt(std::max(t, 0.0)); + t = (R.val[4] + 1) * 0.5; + ry = std::sqrt(std::max(t, 0.0)) * (R.val[1] < 0 ? -1.0 : 1.0); + t = (R.val[8] + 1) * 0.5; + rz = std::sqrt(std::max(t, 0.0)) * (R.val[2] < 0 ? -1.0 : 1.0); + + if( fabs(rx) < fabs(ry) && fabs(rx) < fabs(rz) && (R.val[5] > 0) != (ry*rz > 0) ) + rz = -rz; + theta /= std::sqrt(rx*rx + ry*ry + rz*rz); + rx *= theta; + ry *= theta; + rz *= theta; + } + } + else + { + double vth = 1/(2*s); + vth *= theta; + rx *= vth; ry *= vth; rz *= vth; + } + + return cv::Vec3d(rx, ry, rz); +} + +template inline +cv::Affine3 cv::Affine3::inv(int method) const +{ + return matrix.inv(method); +} + +template inline +cv::Affine3 cv::Affine3::rotate(const Mat3& R) const +{ + Mat3 Lc = linear(); + Vec3 tc = translation(); + Mat4 result; + result.val[12] = result.val[13] = result.val[14] = 0; + result.val[15] = 1; + + for(int j = 0; j < 3; ++j) + { + for(int i = 0; i < 3; ++i) + { + float_type value = 0; + for(int k = 0; k < 3; ++k) + value += R(j, k) * Lc(k, i); + result(j, i) = value; + } + + result(j, 3) = R.row(j).dot(tc.t()); + } + return result; +} + +template inline +cv::Affine3 cv::Affine3::rotate(const Vec3& _rvec) const +{ + return rotate(Affine3f(_rvec).rotation()); +} + +template inline +cv::Affine3 cv::Affine3::translate(const Vec3& t) const +{ + Mat4 m = matrix; + m.val[ 3] += t[0]; + m.val[ 7] += t[1]; + m.val[11] += t[2]; + return m; +} + +template inline +cv::Affine3 cv::Affine3::concatenate(const Affine3& affine) const +{ + return (*this).rotate(affine.rotation()).translate(affine.translation()); +} + +template template inline +cv::Affine3::operator Affine3() const +{ + return Affine3(matrix); +} + +template template inline +cv::Affine3 cv::Affine3::cast() const +{ + return Affine3(matrix); +} + +template inline +cv::Affine3 cv::operator*(const cv::Affine3& affine1, const cv::Affine3& affine2) +{ + return affine2.concatenate(affine1); +} + +template inline +V cv::operator*(const cv::Affine3& affine, const V& v) +{ + const typename Affine3::Mat4& m = affine.matrix; + + V r; + r.x = m.val[0] * v.x + m.val[1] * v.y + m.val[ 2] * v.z + m.val[ 3]; + r.y = m.val[4] * v.x + m.val[5] * v.y + m.val[ 6] * v.z + m.val[ 7]; + r.z = m.val[8] * v.x + m.val[9] * v.y + m.val[10] * v.z + m.val[11]; + return r; +} + +static inline +cv::Vec3f cv::operator*(const cv::Affine3f& affine, const cv::Vec3f& v) +{ + const cv::Matx44f& m = affine.matrix; + cv::Vec3f r; + r.val[0] = m.val[0] * v[0] + m.val[1] * v[1] + m.val[ 2] * v[2] + m.val[ 3]; + r.val[1] = m.val[4] * v[0] + m.val[5] * v[1] + m.val[ 6] * v[2] + m.val[ 7]; + r.val[2] = m.val[8] * v[0] + m.val[9] * v[1] + m.val[10] * v[2] + m.val[11]; + return r; +} + +static inline +cv::Vec3d cv::operator*(const cv::Affine3d& affine, const cv::Vec3d& v) +{ + const cv::Matx44d& m = affine.matrix; + cv::Vec3d r; + r.val[0] = m.val[0] * v[0] + m.val[1] * v[1] + m.val[ 2] * v[2] + m.val[ 3]; + r.val[1] = m.val[4] * v[0] + m.val[5] * v[1] + m.val[ 6] * v[2] + m.val[ 7]; + r.val[2] = m.val[8] * v[0] + m.val[9] * v[1] + m.val[10] * v[2] + m.val[11]; + return r; +} + + + +#if defined EIGEN_WORLD_VERSION && defined EIGEN_GEOMETRY_MODULE_H + +template inline +cv::Affine3::Affine3(const Eigen::Transform& affine) +{ + cv::Mat(4, 4, cv::traits::Type::value, affine.matrix().data()).copyTo(matrix); +} + +template inline +cv::Affine3::Affine3(const Eigen::Transform& affine) +{ + Eigen::Transform a = affine; + cv::Mat(4, 4, cv::traits::Type::value, a.matrix().data()).copyTo(matrix); +} + +template inline +cv::Affine3::operator Eigen::Transform() const +{ + Eigen::Transform r; + cv::Mat hdr(4, 4, cv::traits::Type::value, r.matrix().data()); + cv::Mat(matrix, false).copyTo(hdr); + return r; +} + +template inline +cv::Affine3::operator Eigen::Transform() const +{ + return this->operator Eigen::Transform(); +} + +#endif /* defined EIGEN_WORLD_VERSION && defined EIGEN_GEOMETRY_MODULE_H */ + +//! @endcond + +#endif /* __cplusplus */ + +#endif /* OPENCV_CORE_AFFINE3_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/async.hpp b/Thirdparty/opencv2/include/opencv2/core/async.hpp new file mode 100644 index 0000000..54560c7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/async.hpp @@ -0,0 +1,105 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_ASYNC_HPP +#define OPENCV_CORE_ASYNC_HPP + +#include + +#ifdef CV_CXX11 +//#include +#include +#endif + +namespace cv { + +/** @addtogroup core_async + +@{ +*/ + + +/** @brief Returns result of asynchronous operations + +Object has attached asynchronous state. +Assignment operator doesn't clone asynchronous state (it is shared between all instances). + +Result can be fetched via get() method only once. + +*/ +class CV_EXPORTS_W AsyncArray +{ +public: + ~AsyncArray() CV_NOEXCEPT; + CV_WRAP AsyncArray() CV_NOEXCEPT; + AsyncArray(const AsyncArray& o) CV_NOEXCEPT; + AsyncArray& operator=(const AsyncArray& o) CV_NOEXCEPT; + CV_WRAP void release() CV_NOEXCEPT; + + /** Fetch the result. + @param[out] dst destination array + + Waits for result until container has valid result. + Throws exception if exception was stored as a result. + + Throws exception on invalid container state. + + @note Result or stored exception can be fetched only once. + */ + CV_WRAP void get(OutputArray dst) const; + + /** Retrieving the result with timeout + @param[out] dst destination array + @param[in] timeoutNs timeout in nanoseconds, -1 for infinite wait + + @returns true if result is ready, false if the timeout has expired + + @note Result or stored exception can be fetched only once. + */ + bool get(OutputArray dst, int64 timeoutNs) const; + + CV_WRAP inline + bool get(OutputArray dst, double timeoutNs) const { return get(dst, (int64)timeoutNs); } + + bool wait_for(int64 timeoutNs) const; + + CV_WRAP inline + bool wait_for(double timeoutNs) const { return wait_for((int64)timeoutNs); } + + CV_WRAP bool valid() const CV_NOEXCEPT; + +#ifdef CV_CXX11 + inline AsyncArray(AsyncArray&& o) { p = o.p; o.p = NULL; } + inline AsyncArray& operator=(AsyncArray&& o) CV_NOEXCEPT { std::swap(p, o.p); return *this; } + + template + inline bool get(OutputArray dst, const std::chrono::duration<_Rep, _Period>& timeout) + { + return get(dst, (int64)(std::chrono::nanoseconds(timeout).count())); + } + + template + inline bool wait_for(const std::chrono::duration<_Rep, _Period>& timeout) + { + return wait_for((int64)(std::chrono::nanoseconds(timeout).count())); + } + +#if 0 + std::future getFutureMat() const; + std::future getFutureUMat() const; +#endif +#endif + + + // PImpl + struct Impl; friend struct Impl; + inline void* _getImpl() const CV_NOEXCEPT { return p; } +protected: + Impl* p; +}; + + +//! @} +} // namespace +#endif // OPENCV_CORE_ASYNC_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/base.hpp b/Thirdparty/opencv2/include/opencv2/core/base.hpp new file mode 100644 index 0000000..21a61a4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/base.hpp @@ -0,0 +1,664 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2014, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_BASE_HPP +#define OPENCV_CORE_BASE_HPP + +#ifndef __cplusplus +# error base.hpp header must be compiled as C++ +#endif + +#include "opencv2/opencv_modules.hpp" + +#include +#include + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/cvstd.hpp" + +namespace cv +{ + +//! @addtogroup core_utils +//! @{ + +namespace Error { +//! error codes +enum Code { + StsOk= 0, //!< everything is ok + StsBackTrace= -1, //!< pseudo error for back trace + StsError= -2, //!< unknown /unspecified error + StsInternal= -3, //!< internal error (bad state) + StsNoMem= -4, //!< insufficient memory + StsBadArg= -5, //!< function arg/param is bad + StsBadFunc= -6, //!< unsupported function + StsNoConv= -7, //!< iteration didn't converge + StsAutoTrace= -8, //!< tracing + HeaderIsNull= -9, //!< image header is NULL + BadImageSize= -10, //!< image size is invalid + BadOffset= -11, //!< offset is invalid + BadDataPtr= -12, //!< + BadStep= -13, //!< image step is wrong, this may happen for a non-continuous matrix. + BadModelOrChSeq= -14, //!< + BadNumChannels= -15, //!< bad number of channels, for example, some functions accept only single channel matrices. + BadNumChannel1U= -16, //!< + BadDepth= -17, //!< input image depth is not supported by the function + BadAlphaChannel= -18, //!< + BadOrder= -19, //!< number of dimensions is out of range + BadOrigin= -20, //!< incorrect input origin + BadAlign= -21, //!< incorrect input align + BadCallBack= -22, //!< + BadTileSize= -23, //!< + BadCOI= -24, //!< input COI is not supported + BadROISize= -25, //!< incorrect input roi + MaskIsTiled= -26, //!< + StsNullPtr= -27, //!< null pointer + StsVecLengthErr= -28, //!< incorrect vector length + StsFilterStructContentErr= -29, //!< incorrect filter structure content + StsKernelStructContentErr= -30, //!< incorrect transform kernel content + StsFilterOffsetErr= -31, //!< incorrect filter offset value + StsBadSize= -201, //!< the input/output structure size is incorrect + StsDivByZero= -202, //!< division by zero + StsInplaceNotSupported= -203, //!< in-place operation is not supported + StsObjectNotFound= -204, //!< request can't be completed + StsUnmatchedFormats= -205, //!< formats of input/output arrays differ + StsBadFlag= -206, //!< flag is wrong or not supported + StsBadPoint= -207, //!< bad CvPoint + StsBadMask= -208, //!< bad format of mask (neither 8uC1 nor 8sC1) + StsUnmatchedSizes= -209, //!< sizes of input/output structures do not match + StsUnsupportedFormat= -210, //!< the data format/type is not supported by the function + StsOutOfRange= -211, //!< some of parameters are out of range + StsParseError= -212, //!< invalid syntax/structure of the parsed file + StsNotImplemented= -213, //!< the requested function/feature is not implemented + StsBadMemBlock= -214, //!< an allocated block has been corrupted + StsAssert= -215, //!< assertion failed + GpuNotSupported= -216, //!< no CUDA support + GpuApiCallError= -217, //!< GPU API call error + OpenGlNotSupported= -218, //!< no OpenGL support + OpenGlApiCallError= -219, //!< OpenGL API call error + OpenCLApiCallError= -220, //!< OpenCL API call error + OpenCLDoubleNotSupported= -221, + OpenCLInitError= -222, //!< OpenCL initialization error + OpenCLNoAMDBlasFft= -223 +}; +} //Error + +//! @} core_utils + +//! @addtogroup core_array +//! @{ + +//! matrix decomposition types +enum DecompTypes { + /** Gaussian elimination with the optimal pivot element chosen. */ + DECOMP_LU = 0, + /** singular value decomposition (SVD) method; the system can be over-defined and/or the matrix + src1 can be singular */ + DECOMP_SVD = 1, + /** eigenvalue decomposition; the matrix src1 must be symmetrical */ + DECOMP_EIG = 2, + /** Cholesky \f$LL^T\f$ factorization; the matrix src1 must be symmetrical and positively + defined */ + DECOMP_CHOLESKY = 3, + /** QR factorization; the system can be over-defined and/or the matrix src1 can be singular */ + DECOMP_QR = 4, + /** while all the previous flags are mutually exclusive, this flag can be used together with + any of the previous; it means that the normal equations + \f$\texttt{src1}^T\cdot\texttt{src1}\cdot\texttt{dst}=\texttt{src1}^T\texttt{src2}\f$ are + solved instead of the original system + \f$\texttt{src1}\cdot\texttt{dst}=\texttt{src2}\f$ */ + DECOMP_NORMAL = 16 +}; + +/** norm types + +src1 and src2 denote input arrays. +*/ + +enum NormTypes { + /** + \f[ + norm = \forkthree + {\|\texttt{src1}\|_{L_{\infty}} = \max _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) } + {\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} = \max _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_INF}\) } + {\frac{\|\texttt{src1}-\texttt{src2}\|_{L_{\infty}} }{\|\texttt{src2}\|_{L_{\infty}} }}{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_INF}\) } + \f] + */ + NORM_INF = 1, + /** + \f[ + norm = \forkthree + {\| \texttt{src1} \| _{L_1} = \sum _I | \texttt{src1} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\)} + { \| \texttt{src1} - \texttt{src2} \| _{L_1} = \sum _I | \texttt{src1} (I) - \texttt{src2} (I)|}{if \(\texttt{normType} = \texttt{NORM_L1}\) } + { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_1} }{\|\texttt{src2}\|_{L_1}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L1}\) } + \f]*/ + NORM_L1 = 2, + /** + \f[ + norm = \forkthree + { \| \texttt{src1} \| _{L_2} = \sqrt{\sum_I \texttt{src1}(I)^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) } + { \| \texttt{src1} - \texttt{src2} \| _{L_2} = \sqrt{\sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2} }{if \(\texttt{normType} = \texttt{NORM_L2}\) } + { \frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}} }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2}\) } + \f] + */ + NORM_L2 = 4, + /** + \f[ + norm = \forkthree + { \| \texttt{src1} \| _{L_2} ^{2} = \sum_I \texttt{src1}(I)^2} {if \(\texttt{normType} = \texttt{NORM_L2SQR}\)} + { \| \texttt{src1} - \texttt{src2} \| _{L_2} ^{2} = \sum_I (\texttt{src1}(I) - \texttt{src2}(I))^2 }{if \(\texttt{normType} = \texttt{NORM_L2SQR}\) } + { \left(\frac{\|\texttt{src1}-\texttt{src2}\|_{L_2} }{\|\texttt{src2}\|_{L_2}}\right)^2 }{if \(\texttt{normType} = \texttt{NORM_RELATIVE | NORM_L2SQR}\) } + \f] + */ + NORM_L2SQR = 5, + /** + In the case of one input array, calculates the Hamming distance of the array from zero, + In the case of two input arrays, calculates the Hamming distance between the arrays. + */ + NORM_HAMMING = 6, + /** + Similar to NORM_HAMMING, but in the calculation, each two bits of the input sequence will + be added and treated as a single bit to be used in the same calculation as NORM_HAMMING. + */ + NORM_HAMMING2 = 7, + NORM_TYPE_MASK = 7, //!< bit-mask which can be used to separate norm type from norm flags + NORM_RELATIVE = 8, //!< flag + NORM_MINMAX = 32 //!< flag + }; + +//! comparison types +enum CmpTypes { CMP_EQ = 0, //!< src1 is equal to src2. + CMP_GT = 1, //!< src1 is greater than src2. + CMP_GE = 2, //!< src1 is greater than or equal to src2. + CMP_LT = 3, //!< src1 is less than src2. + CMP_LE = 4, //!< src1 is less than or equal to src2. + CMP_NE = 5 //!< src1 is unequal to src2. + }; + +//! generalized matrix multiplication flags +enum GemmFlags { GEMM_1_T = 1, //!< transposes src1 + GEMM_2_T = 2, //!< transposes src2 + GEMM_3_T = 4 //!< transposes src3 + }; + +enum DftFlags { + /** performs an inverse 1D or 2D transform instead of the default forward + transform. */ + DFT_INVERSE = 1, + /** scales the result: divide it by the number of array elements. Normally, it is + combined with DFT_INVERSE. */ + DFT_SCALE = 2, + /** performs a forward or inverse transform of every individual row of the input + matrix; this flag enables you to transform multiple vectors simultaneously and can be used to + decrease the overhead (which is sometimes several times larger than the processing itself) to + perform 3D and higher-dimensional transformations and so forth.*/ + DFT_ROWS = 4, + /** performs a forward transformation of 1D or 2D real array; the result, + though being a complex array, has complex-conjugate symmetry (*CCS*, see the function + description below for details), and such an array can be packed into a real array of the same + size as input, which is the fastest option and which is what the function does by default; + however, you may wish to get a full complex array (for simpler spectrum analysis, and so on) - + pass the flag to enable the function to produce a full-size complex output array. */ + DFT_COMPLEX_OUTPUT = 16, + /** performs an inverse transformation of a 1D or 2D complex array; the + result is normally a complex array of the same size, however, if the input array has + conjugate-complex symmetry (for example, it is a result of forward transformation with + DFT_COMPLEX_OUTPUT flag), the output is a real array; while the function itself does not + check whether the input is symmetrical or not, you can pass the flag and then the function + will assume the symmetry and produce the real output array (note that when the input is packed + into a real array and inverse transformation is executed, the function treats the input as a + packed complex-conjugate symmetrical array, and the output will also be a real array). */ + DFT_REAL_OUTPUT = 32, + /** specifies that input is complex input. If this flag is set, the input must have 2 channels. + On the other hand, for backwards compatibility reason, if input has 2 channels, input is + already considered complex. */ + DFT_COMPLEX_INPUT = 64, + /** performs an inverse 1D or 2D transform instead of the default forward transform. */ + DCT_INVERSE = DFT_INVERSE, + /** performs a forward or inverse transform of every individual row of the input + matrix. This flag enables you to transform multiple vectors simultaneously and can be used to + decrease the overhead (which is sometimes several times larger than the processing itself) to + perform 3D and higher-dimensional transforms and so forth.*/ + DCT_ROWS = DFT_ROWS +}; + +//! Various border types, image boundaries are denoted with `|` +//! @see borderInterpolate, copyMakeBorder +enum BorderTypes { + BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i` + BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh` + BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb` + BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg` + BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba` + BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno` + + BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 + BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 + BORDER_ISOLATED = 16 //!< do not look outside of ROI +}; + +//! @} core_array + +//! @addtogroup core_utils +//! @{ + +/*! @brief Signals an error and raises the exception. + +By default the function prints information about the error to stderr, +then it either stops if setBreakOnError() had been called before or raises the exception. +It is possible to alternate error processing by using redirectError(). +@param _code - error code (Error::Code) +@param _err - error description +@param _func - function name. Available only when the compiler supports getting it +@param _file - source file name where the error has occurred +@param _line - line number in the source file where the error has occurred +@see CV_Error, CV_Error_, CV_Assert, CV_DbgAssert + */ +CV_EXPORTS CV_NORETURN void error(int _code, const String& _err, const char* _func, const char* _file, int _line); + +#ifdef CV_STATIC_ANALYSIS + +// In practice, some macro are not processed correctly (noreturn is not detected). +// We need to use simplified definition for them. +#define CV_Error(code, msg) do { (void)(code); (void)(msg); abort(); } while (0) +#define CV_Error_(code, args) do { (void)(code); (void)(cv::format args); abort(); } while (0) +#define CV_Assert( expr ) do { if (!(expr)) abort(); } while (0) + +#else // CV_STATIC_ANALYSIS + +/** @brief Call the error handler. + +Currently, the error handler prints the error code and the error message to the standard +error stream `stderr`. In the Debug configuration, it then provokes memory access violation, so that +the execution stack and all the parameters can be analyzed by the debugger. In the Release +configuration, the exception is thrown. + +@param code one of Error::Code +@param msg error message +*/ +#define CV_Error( code, msg ) cv::error( code, msg, CV_Func, __FILE__, __LINE__ ) + +/** @brief Call the error handler. + +This macro can be used to construct an error message on-fly to include some dynamic information, +for example: +@code + // note the extra parentheses around the formatted text message + CV_Error_(Error::StsOutOfRange, + ("the value at (%d, %d)=%g is out of range", badPt.x, badPt.y, badValue)); +@endcode +@param code one of Error::Code +@param args printf-like formatted error message in parentheses +*/ +#define CV_Error_( code, args ) cv::error( code, cv::format args, CV_Func, __FILE__, __LINE__ ) + +/** @brief Checks a condition at runtime and throws exception if it fails + +The macros CV_Assert (and CV_DbgAssert(expr)) evaluate the specified expression. If it is 0, the macros +raise an error (see cv::error). The macro CV_Assert checks the condition in both Debug and Release +configurations while CV_DbgAssert is only retained in the Debug configuration. +*/ +#define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0) + +#endif // CV_STATIC_ANALYSIS + +//! @cond IGNORED +#if !defined(__OPENCV_BUILD) // TODO: backward compatibility only +#ifndef CV_ErrorNoReturn +#define CV_ErrorNoReturn CV_Error +#endif +#ifndef CV_ErrorNoReturn_ +#define CV_ErrorNoReturn_ CV_Error_ +#endif +#endif + +#define CV_Assert_1 CV_Assert +#define CV_Assert_2( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_1( __VA_ARGS__ )) +#define CV_Assert_3( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_2( __VA_ARGS__ )) +#define CV_Assert_4( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_3( __VA_ARGS__ )) +#define CV_Assert_5( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_4( __VA_ARGS__ )) +#define CV_Assert_6( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_5( __VA_ARGS__ )) +#define CV_Assert_7( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_6( __VA_ARGS__ )) +#define CV_Assert_8( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_7( __VA_ARGS__ )) +#define CV_Assert_9( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_8( __VA_ARGS__ )) +#define CV_Assert_10( expr, ... ) CV_Assert_1(expr); __CV_EXPAND(CV_Assert_9( __VA_ARGS__ )) + +#define CV_Assert_N(...) do { __CV_EXPAND(__CV_CAT(CV_Assert_, __CV_VA_NUM_ARGS(__VA_ARGS__)) (__VA_ARGS__)); } while(0) + +//! @endcond + +#if defined _DEBUG || defined CV_STATIC_ANALYSIS +# define CV_DbgAssert(expr) CV_Assert(expr) +#else +/** replaced with CV_Assert(expr) in Debug configuration */ +# define CV_DbgAssert(expr) +#endif + +/* + * Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor + * bit count of A exclusive XOR'ed with B + */ +struct CV_EXPORTS Hamming +{ + static const NormTypes normType = NORM_HAMMING; + typedef unsigned char ValueType; + typedef int ResultType; + + /** this will count the bits in a ^ b + */ + ResultType operator()( const unsigned char* a, const unsigned char* b, int size ) const; +}; + +typedef Hamming HammingLUT; + +/////////////////////////////////// inline norms //////////////////////////////////// + +template inline _Tp cv_abs(_Tp x) { return std::abs(x); } +inline int cv_abs(uchar x) { return x; } +inline int cv_abs(schar x) { return std::abs(x); } +inline int cv_abs(ushort x) { return x; } +inline int cv_abs(short x) { return std::abs(x); } + +template static inline +_AccTp normL2Sqr(const _Tp* a, int n) +{ + _AccTp s = 0; + int i=0; +#if CV_ENABLE_UNROLLED + for( ; i <= n - 4; i += 4 ) + { + _AccTp v0 = a[i], v1 = a[i+1], v2 = a[i+2], v3 = a[i+3]; + s += v0*v0 + v1*v1 + v2*v2 + v3*v3; + } +#endif + for( ; i < n; i++ ) + { + _AccTp v = a[i]; + s += v*v; + } + return s; +} + +template static inline +_AccTp normL1(const _Tp* a, int n) +{ + _AccTp s = 0; + int i = 0; +#if CV_ENABLE_UNROLLED + for(; i <= n - 4; i += 4 ) + { + s += (_AccTp)cv_abs(a[i]) + (_AccTp)cv_abs(a[i+1]) + + (_AccTp)cv_abs(a[i+2]) + (_AccTp)cv_abs(a[i+3]); + } +#endif + for( ; i < n; i++ ) + s += cv_abs(a[i]); + return s; +} + +template static inline +_AccTp normInf(const _Tp* a, int n) +{ + _AccTp s = 0; + for( int i = 0; i < n; i++ ) + s = std::max(s, (_AccTp)cv_abs(a[i])); + return s; +} + +template static inline +_AccTp normL2Sqr(const _Tp* a, const _Tp* b, int n) +{ + _AccTp s = 0; + int i= 0; +#if CV_ENABLE_UNROLLED + for(; i <= n - 4; i += 4 ) + { + _AccTp v0 = _AccTp(a[i] - b[i]), v1 = _AccTp(a[i+1] - b[i+1]), v2 = _AccTp(a[i+2] - b[i+2]), v3 = _AccTp(a[i+3] - b[i+3]); + s += v0*v0 + v1*v1 + v2*v2 + v3*v3; + } +#endif + for( ; i < n; i++ ) + { + _AccTp v = _AccTp(a[i] - b[i]); + s += v*v; + } + return s; +} + +static inline float normL2Sqr(const float* a, const float* b, int n) +{ + float s = 0.f; + for( int i = 0; i < n; i++ ) + { + float v = a[i] - b[i]; + s += v*v; + } + return s; +} + +template static inline +_AccTp normL1(const _Tp* a, const _Tp* b, int n) +{ + _AccTp s = 0; + int i= 0; +#if CV_ENABLE_UNROLLED + for(; i <= n - 4; i += 4 ) + { + _AccTp v0 = _AccTp(a[i] - b[i]), v1 = _AccTp(a[i+1] - b[i+1]), v2 = _AccTp(a[i+2] - b[i+2]), v3 = _AccTp(a[i+3] - b[i+3]); + s += std::abs(v0) + std::abs(v1) + std::abs(v2) + std::abs(v3); + } +#endif + for( ; i < n; i++ ) + { + _AccTp v = _AccTp(a[i] - b[i]); + s += std::abs(v); + } + return s; +} + +inline float normL1(const float* a, const float* b, int n) +{ + float s = 0.f; + for( int i = 0; i < n; i++ ) + { + s += std::abs(a[i] - b[i]); + } + return s; +} + +inline int normL1(const uchar* a, const uchar* b, int n) +{ + int s = 0; + for( int i = 0; i < n; i++ ) + { + s += std::abs(a[i] - b[i]); + } + return s; +} + +template static inline +_AccTp normInf(const _Tp* a, const _Tp* b, int n) +{ + _AccTp s = 0; + for( int i = 0; i < n; i++ ) + { + _AccTp v0 = a[i] - b[i]; + s = std::max(s, std::abs(v0)); + } + return s; +} + +/** @brief Computes the cube root of an argument. + + The function cubeRoot computes \f$\sqrt[3]{\texttt{val}}\f$. Negative arguments are handled correctly. + NaN and Inf are not handled. The accuracy approaches the maximum possible accuracy for + single-precision data. + @param val A function argument. + */ +CV_EXPORTS_W float cubeRoot(float val); + +/** @overload + +cubeRoot with argument of `double` type calls `std::cbrt(double)` +*/ +static inline +double cubeRoot(double val) +{ + return std::cbrt(val); +} + +/** @brief Calculates the angle of a 2D vector in degrees. + + The function fastAtan2 calculates the full-range angle of an input 2D vector. The angle is measured + in degrees and varies from 0 to 360 degrees. The accuracy is about 0.3 degrees. + @param x x-coordinate of the vector. + @param y y-coordinate of the vector. + */ +CV_EXPORTS_W float fastAtan2(float y, float x); + +/** proxy for hal::LU */ +CV_EXPORTS int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n); +/** proxy for hal::LU */ +CV_EXPORTS int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n); +/** proxy for hal::Cholesky */ +CV_EXPORTS bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n); +/** proxy for hal::Cholesky */ +CV_EXPORTS bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n); + +////////////////// forward declarations for important OpenCV types ////////////////// + +//! @cond IGNORED + +template class Vec; +template class Matx; + +template class Complex; +template class Point_; +template class Point3_; +template class Size_; +template class Rect_; +template class Scalar_; + +class CV_EXPORTS RotatedRect; +class CV_EXPORTS Range; +class CV_EXPORTS TermCriteria; +class CV_EXPORTS KeyPoint; +class CV_EXPORTS DMatch; +class CV_EXPORTS RNG; + +class CV_EXPORTS Mat; +class CV_EXPORTS MatExpr; + +class CV_EXPORTS UMat; + +class CV_EXPORTS SparseMat; +typedef Mat MatND; + +template class Mat_; +template class SparseMat_; + +class CV_EXPORTS MatConstIterator; +class CV_EXPORTS SparseMatIterator; +class CV_EXPORTS SparseMatConstIterator; +template class MatIterator_; +template class MatConstIterator_; +template class SparseMatIterator_; +template class SparseMatConstIterator_; + +namespace ogl +{ + class CV_EXPORTS Buffer; + class CV_EXPORTS Texture2D; + class CV_EXPORTS Arrays; +} + +namespace cuda +{ + class CV_EXPORTS GpuMat; + class CV_EXPORTS HostMem; + class CV_EXPORTS Stream; + class CV_EXPORTS Event; +} + +namespace cudev +{ + template class GpuMat_; +} + +namespace ipp +{ +CV_EXPORTS unsigned long long getIppFeatures(); +CV_EXPORTS void setIppStatus(int status, const char * const funcname = NULL, const char * const filename = NULL, + int line = 0); +CV_EXPORTS int getIppStatus(); +CV_EXPORTS String getIppErrorLocation(); +CV_EXPORTS_W bool useIPP(); +CV_EXPORTS_W void setUseIPP(bool flag); +CV_EXPORTS_W String getIppVersion(); + +// IPP Not-Exact mode. This function may force use of IPP then both IPP and OpenCV provide proper results +// but have internal accuracy differences which have too much direct or indirect impact on accuracy tests. +CV_EXPORTS_W bool useIPP_NotExact(); +CV_EXPORTS_W void setUseIPP_NotExact(bool flag); +#ifndef DISABLE_OPENCV_3_COMPATIBILITY +static inline bool useIPP_NE() { return useIPP_NotExact(); } +static inline void setUseIPP_NE(bool flag) { setUseIPP_NotExact(flag); } +#endif + +} // ipp + +//! @endcond + +//! @} core_utils + + + + +} // cv + +#include "opencv2/core/neon_utils.hpp" +#include "opencv2/core/vsx_utils.hpp" +#include "opencv2/core/check.hpp" + +#endif //OPENCV_CORE_BASE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/bindings_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/bindings_utils.hpp new file mode 100644 index 0000000..64f3465 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/bindings_utils.hpp @@ -0,0 +1,352 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_BINDINGS_UTILS_HPP +#define OPENCV_CORE_BINDINGS_UTILS_HPP + +#include +#include +#include + +#include + +namespace cv { namespace utils { +//! @addtogroup core_utils +//! @{ + +CV_EXPORTS_W String dumpInputArray(InputArray argument); + +CV_EXPORTS_W String dumpInputArrayOfArrays(InputArrayOfArrays argument); + +CV_EXPORTS_W String dumpInputOutputArray(InputOutputArray argument); + +CV_EXPORTS_W String dumpInputOutputArrayOfArrays(InputOutputArrayOfArrays argument); + +CV_WRAP static inline +String dumpBool(bool argument) +{ + return (argument) ? String("Bool: True") : String("Bool: False"); +} + +CV_WRAP static inline +String dumpInt(int argument) +{ + return cv::format("Int: %d", argument); +} + +CV_WRAP static inline +String dumpInt64(int64 argument) +{ + std::ostringstream oss("Int64: ", std::ios::ate); + oss << argument; + return oss.str(); +} + +CV_WRAP static inline +String dumpSizeT(size_t argument) +{ + std::ostringstream oss("size_t: ", std::ios::ate); + oss << argument; + return oss.str(); +} + +CV_WRAP static inline +String dumpFloat(float argument) +{ + return cv::format("Float: %.2f", argument); +} + +CV_WRAP static inline +String dumpDouble(double argument) +{ + return cv::format("Double: %.2f", argument); +} + +CV_WRAP static inline +String dumpCString(const char* argument) +{ + return cv::format("String: %s", argument); +} + +CV_WRAP static inline +String dumpString(const String& argument) +{ + return cv::format("String: %s", argument.c_str()); +} + +CV_WRAP static inline +String testOverloadResolution(int value, const Point& point = Point(42, 24)) +{ + return format("overload (int=%d, point=(x=%d, y=%d))", value, point.x, + point.y); +} + +CV_WRAP static inline +String testOverloadResolution(const Rect& rect) +{ + return format("overload (rect=(x=%d, y=%d, w=%d, h=%d))", rect.x, rect.y, + rect.width, rect.height); +} + +CV_WRAP static inline +String dumpRect(const Rect& argument) +{ + return format("rect: (x=%d, y=%d, w=%d, h=%d)", argument.x, argument.y, + argument.width, argument.height); +} + +CV_WRAP static inline +String dumpTermCriteria(const TermCriteria& argument) +{ + return format("term_criteria: (type=%d, max_count=%d, epsilon=%lf", + argument.type, argument.maxCount, argument.epsilon); +} + +CV_WRAP static inline +String dumpRotatedRect(const RotatedRect& argument) +{ + return format("rotated_rect: (c_x=%f, c_y=%f, w=%f, h=%f, a=%f)", + argument.center.x, argument.center.y, argument.size.width, + argument.size.height, argument.angle); +} + +CV_WRAP static inline +RotatedRect testRotatedRect(float x, float y, float w, float h, float angle) +{ + return RotatedRect(Point2f(x, y), Size2f(w, h), angle); +} + +CV_WRAP static inline +std::vector testRotatedRectVector(float x, float y, float w, float h, float angle) +{ + std::vector result; + for (int i = 0; i < 10; i++) + result.push_back(RotatedRect(Point2f(x + i, y + 2 * i), Size2f(w, h), angle + 10 * i)); + return result; +} + +CV_WRAP static inline +String dumpRange(const Range& argument) +{ + if (argument == Range::all()) + { + return "range: all"; + } + else + { + return format("range: (s=%d, e=%d)", argument.start, argument.end); + } +} + +CV_WRAP static inline +int testOverwriteNativeMethod(int argument) +{ + return argument; +} + +CV_WRAP static inline +String testReservedKeywordConversion(int positional_argument, int lambda = 2, int from = 3) +{ + return format("arg=%d, lambda=%d, from=%d", positional_argument, lambda, from); +} + +CV_EXPORTS_W String dumpVectorOfInt(const std::vector& vec); + +CV_EXPORTS_W String dumpVectorOfDouble(const std::vector& vec); + +CV_EXPORTS_W String dumpVectorOfRect(const std::vector& vec); + +CV_WRAP static inline +void generateVectorOfRect(size_t len, CV_OUT std::vector& vec) +{ + vec.resize(len); + if (len > 0) + { + RNG rng(12345); + Mat tmp(static_cast(len), 1, CV_32SC4); + rng.fill(tmp, RNG::UNIFORM, 10, 20); + tmp.copyTo(vec); + } +} + +CV_WRAP static inline +void generateVectorOfInt(size_t len, CV_OUT std::vector& vec) +{ + vec.resize(len); + if (len > 0) + { + RNG rng(554433); + Mat tmp(static_cast(len), 1, CV_32SC1); + rng.fill(tmp, RNG::UNIFORM, -10, 10); + tmp.copyTo(vec); + } +} + +CV_WRAP static inline +void generateVectorOfMat(size_t len, int rows, int cols, int dtype, CV_OUT std::vector& vec) +{ + vec.resize(len); + if (len > 0) + { + RNG rng(65431); + for (size_t i = 0; i < len; ++i) + { + vec[i].create(rows, cols, dtype); + rng.fill(vec[i], RNG::UNIFORM, 0, 10); + } + } +} + +CV_WRAP static inline +void testRaiseGeneralException() +{ + throw std::runtime_error("exception text"); +} + +CV_WRAP static inline +AsyncArray testAsyncArray(InputArray argument) +{ + AsyncPromise p; + p.setValue(argument); + return p.getArrayResult(); +} + +CV_WRAP static inline +AsyncArray testAsyncException() +{ + AsyncPromise p; + try + { + CV_Error(Error::StsOk, "Test: Generated async error"); + } + catch (const cv::Exception& e) + { + p.setException(e); + } + return p.getArrayResult(); +} + +CV_WRAP static inline +String dumpVec2i(const cv::Vec2i value = cv::Vec2i(42, 24)) { + return format("Vec2i(%d, %d)", value[0], value[1]); +} + +struct CV_EXPORTS_W_SIMPLE ClassWithKeywordProperties { + CV_PROP_RW int lambda; + CV_PROP int except; + + CV_WRAP explicit ClassWithKeywordProperties(int lambda_arg = 24, int except_arg = 42) + { + lambda = lambda_arg; + except = except_arg; + } +}; + +struct CV_EXPORTS_W_PARAMS FunctionParams +{ + CV_PROP_RW int lambda = -1; + CV_PROP_RW float sigma = 0.0f; + + FunctionParams& setLambda(int value) CV_NOEXCEPT + { + lambda = value; + return *this; + } + + FunctionParams& setSigma(float value) CV_NOEXCEPT + { + sigma = value; + return *this; + } +}; + +CV_WRAP static inline String +copyMatAndDumpNamedArguments(InputArray src, OutputArray dst, + const FunctionParams& params = FunctionParams()) +{ + src.copyTo(dst); + return format("lambda=%d, sigma=%.1f", params.lambda, + params.sigma); +} + +namespace nested { +CV_WRAP static inline bool testEchoBooleanFunction(bool flag) { + return flag; +} + +class CV_EXPORTS_W CV_WRAP_AS(ExportClassName) OriginalClassName +{ +public: + struct CV_EXPORTS_W_SIMPLE Params + { + CV_PROP_RW int int_value; + CV_PROP_RW float float_value; + + CV_WRAP explicit Params(int int_param = 123, float float_param = 3.5f) + { + int_value = int_param; + float_value = float_param; + } + }; + + explicit OriginalClassName(const OriginalClassName::Params& params = OriginalClassName::Params()) + { + params_ = params; + } + + CV_WRAP int getIntParam() const + { + return params_.int_value; + } + + CV_WRAP float getFloatParam() const + { + return params_.float_value; + } + + CV_WRAP static std::string originalName() + { + return "OriginalClassName"; + } + + CV_WRAP static Ptr + create(const OriginalClassName::Params& params = OriginalClassName::Params()) + { + return makePtr(params); + } + +private: + OriginalClassName::Params params_; +}; + +typedef OriginalClassName::Params OriginalClassName_Params; +} // namespace nested + +namespace fs { + CV_EXPORTS_W cv::String getCacheDirectoryForDownloads(); +} // namespace fs + +//! @} // core_utils +} // namespace cv::utils + +//! @cond IGNORED + +CV_WRAP static inline +int setLogLevel(int level) +{ + // NB: Binding generators doesn't work with enums properly yet, so we define separate overload here + return cv::utils::logging::setLogLevel((cv::utils::logging::LogLevel)level); +} + +CV_WRAP static inline +int getLogLevel() +{ + return cv::utils::logging::getLogLevel(); +} + +//! @endcond IGNORED + +} // namespaces cv / utils + +#endif // OPENCV_CORE_BINDINGS_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/bufferpool.hpp b/Thirdparty/opencv2/include/opencv2/core/bufferpool.hpp new file mode 100644 index 0000000..4698e5d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/bufferpool.hpp @@ -0,0 +1,40 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2014, Advanced Micro Devices, Inc., all rights reserved. + +#ifndef OPENCV_CORE_BUFFER_POOL_HPP +#define OPENCV_CORE_BUFFER_POOL_HPP + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4265) +#endif + +namespace cv +{ + +//! @addtogroup core +//! @{ + +class BufferPoolController +{ +protected: + ~BufferPoolController() { } +public: + virtual size_t getReservedSize() const = 0; + virtual size_t getMaxReservedSize() const = 0; + virtual void setMaxReservedSize(size_t size) = 0; + virtual void freeAllReservedBuffers() = 0; +}; + +//! @} + +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif // OPENCV_CORE_BUFFER_POOL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/check.hpp b/Thirdparty/opencv2/include/opencv2/core/check.hpp new file mode 100644 index 0000000..c9ce97b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/check.hpp @@ -0,0 +1,170 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_CHECK_HPP +#define OPENCV_CORE_CHECK_HPP + +#include + +namespace cv { + +/** Returns string of cv::Mat depth value: CV_8U -> "CV_8U" or "" */ +CV_EXPORTS const char* depthToString(int depth); + +/** Returns string of cv::Mat depth value: CV_8UC3 -> "CV_8UC3" or "" */ +CV_EXPORTS String typeToString(int type); + + +//! @cond IGNORED +namespace detail { + +/** Returns string of cv::Mat depth value: CV_8U -> "CV_8U" or NULL */ +CV_EXPORTS const char* depthToString_(int depth); + +/** Returns string of cv::Mat depth value: CV_8UC3 -> "CV_8UC3" or cv::String() */ +CV_EXPORTS cv::String typeToString_(int type); + +enum TestOp { + TEST_CUSTOM = 0, + TEST_EQ = 1, + TEST_NE = 2, + TEST_LE = 3, + TEST_LT = 4, + TEST_GE = 5, + TEST_GT = 6, + CV__LAST_TEST_OP +}; + +struct CheckContext { + const char* func; + const char* file; + int line; + enum TestOp testOp; + const char* message; + const char* p1_str; + const char* p2_str; +}; + +#ifndef CV__CHECK_FILENAME +# define CV__CHECK_FILENAME __FILE__ +#endif + +#ifndef CV__CHECK_FUNCTION +# if defined _MSC_VER +# define CV__CHECK_FUNCTION __FUNCSIG__ +# elif defined __GNUC__ +# define CV__CHECK_FUNCTION __PRETTY_FUNCTION__ +# else +# define CV__CHECK_FUNCTION "" +# endif +#endif + +#define CV__CHECK_LOCATION_VARNAME(id) CVAUX_CONCAT(CVAUX_CONCAT(__cv_check_, id), __LINE__) +#define CV__DEFINE_CHECK_CONTEXT(id, message, testOp, p1_str, p2_str) \ + static const cv::detail::CheckContext CV__CHECK_LOCATION_VARNAME(id) = \ + { CV__CHECK_FUNCTION, CV__CHECK_FILENAME, __LINE__, testOp, "" message, "" p1_str, "" p2_str } + +CV_EXPORTS void CV_NORETURN check_failed_auto(const bool v1, const bool v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const int v1, const int v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const size_t v1, const size_t v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const float v1, const float v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const double v1, const double v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const Size_ v1, const Size_ v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatDepth(const int v1, const int v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatType(const int v1, const int v2, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatChannels(const int v1, const int v2, const CheckContext& ctx); + +CV_EXPORTS void CV_NORETURN check_failed_true(const bool v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_false(const bool v, const CheckContext& ctx); + +CV_EXPORTS void CV_NORETURN check_failed_auto(const int v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const size_t v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const float v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const double v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const Size_ v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_auto(const std::string& v1, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatDepth(const int v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatType(const int v, const CheckContext& ctx); +CV_EXPORTS void CV_NORETURN check_failed_MatChannels(const int v, const CheckContext& ctx); + + +#define CV__TEST_EQ(v1, v2) ((v1) == (v2)) +#define CV__TEST_NE(v1, v2) ((v1) != (v2)) +#define CV__TEST_LE(v1, v2) ((v1) <= (v2)) +#define CV__TEST_LT(v1, v2) ((v1) < (v2)) +#define CV__TEST_GE(v1, v2) ((v1) >= (v2)) +#define CV__TEST_GT(v1, v2) ((v1) > (v2)) + +#define CV__CHECK(id, op, type, v1, v2, v1_str, v2_str, msg_str) do { \ + if(CV__TEST_##op((v1), (v2))) ; else { \ + CV__DEFINE_CHECK_CONTEXT(id, msg_str, cv::detail::TEST_ ## op, v1_str, v2_str); \ + cv::detail::check_failed_ ## type((v1), (v2), CV__CHECK_LOCATION_VARNAME(id)); \ + } \ +} while (0) + +#define CV__CHECK_CUSTOM_TEST(id, type, v, test_expr, v_str, test_expr_str, msg_str) do { \ + if(!!(test_expr)) ; else { \ + CV__DEFINE_CHECK_CONTEXT(id, msg_str, cv::detail::TEST_CUSTOM, v_str, test_expr_str); \ + cv::detail::check_failed_ ## type((v), CV__CHECK_LOCATION_VARNAME(id)); \ + } \ +} while (0) + +} // namespace +//! @endcond + + +/// Supported values of these types: int, float, double +#define CV_CheckEQ(v1, v2, msg) CV__CHECK(_, EQ, auto, v1, v2, #v1, #v2, msg) +#define CV_CheckNE(v1, v2, msg) CV__CHECK(_, NE, auto, v1, v2, #v1, #v2, msg) +#define CV_CheckLE(v1, v2, msg) CV__CHECK(_, LE, auto, v1, v2, #v1, #v2, msg) +#define CV_CheckLT(v1, v2, msg) CV__CHECK(_, LT, auto, v1, v2, #v1, #v2, msg) +#define CV_CheckGE(v1, v2, msg) CV__CHECK(_, GE, auto, v1, v2, #v1, #v2, msg) +#define CV_CheckGT(v1, v2, msg) CV__CHECK(_, GT, auto, v1, v2, #v1, #v2, msg) + +/// Check with additional "decoding" of type values in error message +#define CV_CheckTypeEQ(t1, t2, msg) CV__CHECK(_, EQ, MatType, t1, t2, #t1, #t2, msg) +/// Check with additional "decoding" of depth values in error message +#define CV_CheckDepthEQ(d1, d2, msg) CV__CHECK(_, EQ, MatDepth, d1, d2, #d1, #d2, msg) + +#define CV_CheckChannelsEQ(c1, c2, msg) CV__CHECK(_, EQ, MatChannels, c1, c2, #c1, #c2, msg) + +/// Example: type == CV_8UC1 || type == CV_8UC3 +#define CV_CheckType(t, test_expr, msg) CV__CHECK_CUSTOM_TEST(_, MatType, t, (test_expr), #t, #test_expr, msg) + +/// Example: depth == CV_32F || depth == CV_64F +#define CV_CheckDepth(t, test_expr, msg) CV__CHECK_CUSTOM_TEST(_, MatDepth, t, (test_expr), #t, #test_expr, msg) + +/// Example: v == A || v == B +#define CV_Check(v, test_expr, msg) CV__CHECK_CUSTOM_TEST(_, auto, v, (test_expr), #v, #test_expr, msg) + +/// Example: v == true +#define CV_CheckTrue(v, msg) CV__CHECK_CUSTOM_TEST(_, true, v, v, #v, "", msg) + +/// Example: v == false +#define CV_CheckFalse(v, msg) CV__CHECK_CUSTOM_TEST(_, false, v, (!(v)), #v, "", msg) + +/// Some complex conditions: CV_Check(src2, src2.empty() || (src2.type() == src1.type() && src2.size() == src1.size()), "src2 should have same size/type as src1") +// TODO define pretty-printers + +#ifndef NDEBUG +#define CV_DbgCheck(v, test_expr, msg) CV__CHECK_CUSTOM_TEST(_, auto, v, (test_expr), #v, #test_expr, msg) +#define CV_DbgCheckEQ(v1, v2, msg) CV__CHECK(_, EQ, auto, v1, v2, #v1, #v2, msg) +#define CV_DbgCheckNE(v1, v2, msg) CV__CHECK(_, NE, auto, v1, v2, #v1, #v2, msg) +#define CV_DbgCheckLE(v1, v2, msg) CV__CHECK(_, LE, auto, v1, v2, #v1, #v2, msg) +#define CV_DbgCheckLT(v1, v2, msg) CV__CHECK(_, LT, auto, v1, v2, #v1, #v2, msg) +#define CV_DbgCheckGE(v1, v2, msg) CV__CHECK(_, GE, auto, v1, v2, #v1, #v2, msg) +#define CV_DbgCheckGT(v1, v2, msg) CV__CHECK(_, GT, auto, v1, v2, #v1, #v2, msg) +#else +#define CV_DbgCheck(v, test_expr, msg) do { } while (0) +#define CV_DbgCheckEQ(v1, v2, msg) do { } while (0) +#define CV_DbgCheckNE(v1, v2, msg) do { } while (0) +#define CV_DbgCheckLE(v1, v2, msg) do { } while (0) +#define CV_DbgCheckLT(v1, v2, msg) do { } while (0) +#define CV_DbgCheckGE(v1, v2, msg) do { } while (0) +#define CV_DbgCheckGT(v1, v2, msg) do { } while (0) +#endif + +} // namespace + +#endif // OPENCV_CORE_CHECK_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/core.hpp b/Thirdparty/opencv2/include/opencv2/core/core.hpp new file mode 100644 index 0000000..4389183 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/core.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/core.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/core/core_c.h b/Thirdparty/opencv2/include/opencv2/core/core_c.h new file mode 100644 index 0000000..7b686b8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/core_c.h @@ -0,0 +1,3128 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + + +#ifndef OPENCV_CORE_C_H +#define OPENCV_CORE_C_H + +#include "opencv2/core/types_c.h" + +#ifdef __cplusplus +/* disable MSVC warning C4190 / clang-cl -Wreturn-type-c-linkage: + 'function' has C-linkage specified, but returns UDT 'typename' + which is incompatible with C + + It is OK to disable it because we only extend few plain structures with + C++ constructors for simpler interoperability with C++ API of the library +*/ +# if defined(__clang__) + // handle clang on Linux and clang-cl (i. e. clang on Windows) first +# pragma GCC diagnostic ignored "-Wreturn-type-c-linkage" +# elif defined(_MSC_VER) + // then handle MSVC +# pragma warning(disable:4190) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup core_c + @{ +*/ + +/****************************************************************************************\ +* Array allocation, deallocation, initialization and access to elements * +\****************************************************************************************/ + +/** `malloc` wrapper. + If there is no enough memory, the function + (as well as other OpenCV functions that call cvAlloc) + raises an error. */ +CVAPI(void*) cvAlloc( size_t size ); + +/** `free` wrapper. + Here and further all the memory releasing functions + (that all call cvFree) take double pointer in order to + to clear pointer to the data after releasing it. + Passing pointer to NULL pointer is Ok: nothing happens in this case +*/ +CVAPI(void) cvFree_( void* ptr ); +#define cvFree(ptr) (cvFree_(*(ptr)), *(ptr)=0) + +/** @brief Creates an image header but does not allocate the image data. + +@param size Image width and height +@param depth Image depth (see cvCreateImage ) +@param channels Number of channels (see cvCreateImage ) + */ +CVAPI(IplImage*) cvCreateImageHeader( CvSize size, int depth, int channels ); + +/** @brief Initializes an image header that was previously allocated. + +The returned IplImage\* points to the initialized header. +@param image Image header to initialize +@param size Image width and height +@param depth Image depth (see cvCreateImage ) +@param channels Number of channels (see cvCreateImage ) +@param origin Top-left IPL_ORIGIN_TL or bottom-left IPL_ORIGIN_BL +@param align Alignment for image rows, typically 4 or 8 bytes + */ +CVAPI(IplImage*) cvInitImageHeader( IplImage* image, CvSize size, int depth, + int channels, int origin CV_DEFAULT(0), + int align CV_DEFAULT(4)); + +/** @brief Creates an image header and allocates the image data. + +This function call is equivalent to the following code: +@code + header = cvCreateImageHeader(size, depth, channels); + cvCreateData(header); +@endcode +@param size Image width and height +@param depth Bit depth of image elements. See IplImage for valid depths. +@param channels Number of channels per pixel. See IplImage for details. This function only creates +images with interleaved channels. + */ +CVAPI(IplImage*) cvCreateImage( CvSize size, int depth, int channels ); + +/** @brief Deallocates an image header. + +This call is an analogue of : +@code + if(image ) + { + iplDeallocate(*image, IPL_IMAGE_HEADER | IPL_IMAGE_ROI); + *image = 0; + } +@endcode +but it does not use IPL functions by default (see the CV_TURN_ON_IPL_COMPATIBILITY macro). +@param image Double pointer to the image header + */ +CVAPI(void) cvReleaseImageHeader( IplImage** image ); + +/** @brief Deallocates the image header and the image data. + +This call is a shortened form of : +@code + if(*image ) + { + cvReleaseData(*image); + cvReleaseImageHeader(image); + } +@endcode +@param image Double pointer to the image header +*/ +CVAPI(void) cvReleaseImage( IplImage** image ); + +/** Creates a copy of IPL image (widthStep may differ) */ +CVAPI(IplImage*) cvCloneImage( const IplImage* image ); + +/** @brief Sets the channel of interest in an IplImage. + +If the ROI is set to NULL and the coi is *not* 0, the ROI is allocated. Most OpenCV functions do +*not* support the COI setting, so to process an individual image/matrix channel one may copy (via +cvCopy or cvSplit) the channel to a separate image/matrix, process it and then copy the result +back (via cvCopy or cvMerge) if needed. +@param image A pointer to the image header +@param coi The channel of interest. 0 - all channels are selected, 1 - first channel is selected, +etc. Note that the channel indices become 1-based. + */ +CVAPI(void) cvSetImageCOI( IplImage* image, int coi ); + +/** @brief Returns the index of the channel of interest. + +Returns the channel of interest of in an IplImage. Returned values correspond to the coi in +cvSetImageCOI. +@param image A pointer to the image header + */ +CVAPI(int) cvGetImageCOI( const IplImage* image ); + +/** @brief Sets an image Region Of Interest (ROI) for a given rectangle. + +If the original image ROI was NULL and the rect is not the whole image, the ROI structure is +allocated. + +Most OpenCV functions support the use of ROI and treat the image rectangle as a separate image. For +example, all of the pixel coordinates are counted from the top-left (or bottom-left) corner of the +ROI, not the original image. +@param image A pointer to the image header +@param rect The ROI rectangle + */ +CVAPI(void) cvSetImageROI( IplImage* image, CvRect rect ); + +/** @brief Resets the image ROI to include the entire image and releases the ROI structure. + +This produces a similar result to the following, but in addition it releases the ROI structure. : +@code + cvSetImageROI(image, cvRect(0, 0, image->width, image->height )); + cvSetImageCOI(image, 0); +@endcode +@param image A pointer to the image header + */ +CVAPI(void) cvResetImageROI( IplImage* image ); + +/** @brief Returns the image ROI. + +If there is no ROI set, cvRect(0,0,image-\>width,image-\>height) is returned. +@param image A pointer to the image header + */ +CVAPI(CvRect) cvGetImageROI( const IplImage* image ); + +/** @brief Creates a matrix header but does not allocate the matrix data. + +The function allocates a new matrix header and returns a pointer to it. The matrix data can then be +allocated using cvCreateData or set explicitly to user-allocated data via cvSetData. +@param rows Number of rows in the matrix +@param cols Number of columns in the matrix +@param type Type of the matrix elements, see cvCreateMat + */ +CVAPI(CvMat*) cvCreateMatHeader( int rows, int cols, int type ); + +#define CV_AUTOSTEP 0x7fffffff + +/** @brief Initializes a pre-allocated matrix header. + +This function is often used to process raw data with OpenCV matrix functions. For example, the +following code computes the matrix product of two matrices, stored as ordinary arrays: +@code + double a[] = { 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12 }; + + double b[] = { 1, 5, 9, + 2, 6, 10, + 3, 7, 11, + 4, 8, 12 }; + + double c[9]; + CvMat Ma, Mb, Mc ; + + cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a); + cvInitMatHeader(&Mb, 4, 3, CV_64FC1, b); + cvInitMatHeader(&Mc, 3, 3, CV_64FC1, c); + + cvMatMulAdd(&Ma, &Mb, 0, &Mc); + // the c array now contains the product of a (3x4) and b (4x3) +@endcode +@param mat A pointer to the matrix header to be initialized +@param rows Number of rows in the matrix +@param cols Number of columns in the matrix +@param type Type of the matrix elements, see cvCreateMat . +@param data Optional: data pointer assigned to the matrix header +@param step Optional: full row width in bytes of the assigned data. By default, the minimal +possible step is used which assumes there are no gaps between subsequent rows of the matrix. + */ +CVAPI(CvMat*) cvInitMatHeader( CvMat* mat, int rows, int cols, + int type, void* data CV_DEFAULT(NULL), + int step CV_DEFAULT(CV_AUTOSTEP) ); + +/** @brief Creates a matrix header and allocates the matrix data. + +The function call is equivalent to the following code: +@code + CvMat* mat = cvCreateMatHeader(rows, cols, type); + cvCreateData(mat); +@endcode +@param rows Number of rows in the matrix +@param cols Number of columns in the matrix +@param type The type of the matrix elements in the form +CV_\\C\ , where S=signed, U=unsigned, F=float. For +example, CV _ 8UC1 means the elements are 8-bit unsigned and the there is 1 channel, and CV _ +32SC2 means the elements are 32-bit signed and there are 2 channels. + */ +CVAPI(CvMat*) cvCreateMat( int rows, int cols, int type ); + +/** @brief Deallocates a matrix. + +The function decrements the matrix data reference counter and deallocates matrix header. If the data +reference counter is 0, it also deallocates the data. : +@code + if(*mat ) + cvDecRefData(*mat); + cvFree((void**)mat); +@endcode +@param mat Double pointer to the matrix + */ +CVAPI(void) cvReleaseMat( CvMat** mat ); + +/** @brief Decrements an array data reference counter. + +The function decrements the data reference counter in a CvMat or CvMatND if the reference counter + +pointer is not NULL. If the counter reaches zero, the data is deallocated. In the current +implementation the reference counter is not NULL only if the data was allocated using the +cvCreateData function. The counter will be NULL in other cases such as: external data was assigned +to the header using cvSetData, header is part of a larger matrix or image, or the header was +converted from an image or n-dimensional matrix header. +@param arr Pointer to an array header + */ +CV_INLINE void cvDecRefData( CvArr* arr ) +{ + if( CV_IS_MAT( arr )) + { + CvMat* mat = (CvMat*)arr; + mat->data.ptr = NULL; + if( mat->refcount != NULL && --*mat->refcount == 0 ) + cvFree( &mat->refcount ); + mat->refcount = NULL; + } + else if( CV_IS_MATND( arr )) + { + CvMatND* mat = (CvMatND*)arr; + mat->data.ptr = NULL; + if( mat->refcount != NULL && --*mat->refcount == 0 ) + cvFree( &mat->refcount ); + mat->refcount = NULL; + } +} + +/** @brief Increments array data reference counter. + +The function increments CvMat or CvMatND data reference counter and returns the new counter value if +the reference counter pointer is not NULL, otherwise it returns zero. +@param arr Array header + */ +CV_INLINE int cvIncRefData( CvArr* arr ) +{ + int refcount = 0; + if( CV_IS_MAT( arr )) + { + CvMat* mat = (CvMat*)arr; + if( mat->refcount != NULL ) + refcount = ++*mat->refcount; + } + else if( CV_IS_MATND( arr )) + { + CvMatND* mat = (CvMatND*)arr; + if( mat->refcount != NULL ) + refcount = ++*mat->refcount; + } + return refcount; +} + + +/** Creates an exact copy of the input matrix (except, may be, step value) */ +CVAPI(CvMat*) cvCloneMat( const CvMat* mat ); + + +/** @brief Returns matrix header corresponding to the rectangular sub-array of input image or matrix. + +The function returns header, corresponding to a specified rectangle of the input array. In other + +words, it allows the user to treat a rectangular part of input array as a stand-alone array. ROI is +taken into account by the function so the sub-array of ROI is actually extracted. +@param arr Input array +@param submat Pointer to the resultant sub-array header +@param rect Zero-based coordinates of the rectangle of interest + */ +CVAPI(CvMat*) cvGetSubRect( const CvArr* arr, CvMat* submat, CvRect rect ); +#define cvGetSubArr cvGetSubRect + +/** @brief Returns array row or row span. + +The function returns the header, corresponding to a specified row/row span of the input array. +cvGetRow(arr, submat, row) is a shortcut for cvGetRows(arr, submat, row, row+1). +@param arr Input array +@param submat Pointer to the resulting sub-array header +@param start_row Zero-based index of the starting row (inclusive) of the span +@param end_row Zero-based index of the ending row (exclusive) of the span +@param delta_row Index step in the row span. That is, the function extracts every delta_row -th +row from start_row and up to (but not including) end_row . + */ +CVAPI(CvMat*) cvGetRows( const CvArr* arr, CvMat* submat, + int start_row, int end_row, + int delta_row CV_DEFAULT(1)); + +/** @overload +@param arr Input array +@param submat Pointer to the resulting sub-array header +@param row Zero-based index of the selected row +*/ +CV_INLINE CvMat* cvGetRow( const CvArr* arr, CvMat* submat, int row ) +{ + return cvGetRows( arr, submat, row, row + 1, 1 ); +} + + +/** @brief Returns one of more array columns. + +The function returns the header, corresponding to a specified column span of the input array. That + +is, no data is copied. Therefore, any modifications of the submatrix will affect the original array. +If you need to copy the columns, use cvCloneMat. cvGetCol(arr, submat, col) is a shortcut for +cvGetCols(arr, submat, col, col+1). +@param arr Input array +@param submat Pointer to the resulting sub-array header +@param start_col Zero-based index of the starting column (inclusive) of the span +@param end_col Zero-based index of the ending column (exclusive) of the span + */ +CVAPI(CvMat*) cvGetCols( const CvArr* arr, CvMat* submat, + int start_col, int end_col ); + +/** @overload +@param arr Input array +@param submat Pointer to the resulting sub-array header +@param col Zero-based index of the selected column +*/ +CV_INLINE CvMat* cvGetCol( const CvArr* arr, CvMat* submat, int col ) +{ + return cvGetCols( arr, submat, col, col + 1 ); +} + +/** @brief Returns one of array diagonals. + +The function returns the header, corresponding to a specified diagonal of the input array. +@param arr Input array +@param submat Pointer to the resulting sub-array header +@param diag Index of the array diagonal. Zero value corresponds to the main diagonal, -1 +corresponds to the diagonal above the main, 1 corresponds to the diagonal below the main, and so +forth. + */ +CVAPI(CvMat*) cvGetDiag( const CvArr* arr, CvMat* submat, + int diag CV_DEFAULT(0)); + +/** low-level scalar <-> raw data conversion functions */ +CVAPI(void) cvScalarToRawData( const CvScalar* scalar, void* data, int type, + int extend_to_12 CV_DEFAULT(0) ); + +CVAPI(void) cvRawDataToScalar( const void* data, int type, CvScalar* scalar ); + +/** @brief Creates a new matrix header but does not allocate the matrix data. + +The function allocates a header for a multi-dimensional dense array. The array data can further be +allocated using cvCreateData or set explicitly to user-allocated data via cvSetData. +@param dims Number of array dimensions +@param sizes Array of dimension sizes +@param type Type of array elements, see cvCreateMat + */ +CVAPI(CvMatND*) cvCreateMatNDHeader( int dims, const int* sizes, int type ); + +/** @brief Creates the header and allocates the data for a multi-dimensional dense array. + +This function call is equivalent to the following code: +@code + CvMatND* mat = cvCreateMatNDHeader(dims, sizes, type); + cvCreateData(mat); +@endcode +@param dims Number of array dimensions. This must not exceed CV_MAX_DIM (32 by default, but can be +changed at build time). +@param sizes Array of dimension sizes. +@param type Type of array elements, see cvCreateMat . + */ +CVAPI(CvMatND*) cvCreateMatND( int dims, const int* sizes, int type ); + +/** @brief Initializes a pre-allocated multi-dimensional array header. + +@param mat A pointer to the array header to be initialized +@param dims The number of array dimensions +@param sizes An array of dimension sizes +@param type Type of array elements, see cvCreateMat +@param data Optional data pointer assigned to the matrix header + */ +CVAPI(CvMatND*) cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes, + int type, void* data CV_DEFAULT(NULL) ); + +/** @brief Deallocates a multi-dimensional array. + +The function decrements the array data reference counter and releases the array header. If the +reference counter reaches 0, it also deallocates the data. : +@code + if(*mat ) + cvDecRefData(*mat); + cvFree((void**)mat); +@endcode +@param mat Double pointer to the array + */ +CV_INLINE void cvReleaseMatND( CvMatND** mat ) +{ + cvReleaseMat( (CvMat**)mat ); +} + +/** Creates a copy of CvMatND (except, may be, steps) */ +CVAPI(CvMatND*) cvCloneMatND( const CvMatND* mat ); + +/** @brief Creates sparse array. + +The function allocates a multi-dimensional sparse array. Initially the array contain no elements, +that is PtrND and other related functions will return 0 for every index. +@param dims Number of array dimensions. In contrast to the dense matrix, the number of dimensions is +practically unlimited (up to \f$2^{16}\f$ ). +@param sizes Array of dimension sizes +@param type Type of array elements. The same as for CvMat + */ +CVAPI(CvSparseMat*) cvCreateSparseMat( int dims, const int* sizes, int type ); + +/** @brief Deallocates sparse array. + +The function releases the sparse array and clears the array pointer upon exit. +@param mat Double pointer to the array + */ +CVAPI(void) cvReleaseSparseMat( CvSparseMat** mat ); + +/** Creates a copy of CvSparseMat (except, may be, zero items) */ +CVAPI(CvSparseMat*) cvCloneSparseMat( const CvSparseMat* mat ); + +/** @brief Initializes sparse array elements iterator. + +The function initializes iterator of sparse array elements and returns pointer to the first element, +or NULL if the array is empty. +@param mat Input array +@param mat_iterator Initialized iterator + */ +CVAPI(CvSparseNode*) cvInitSparseMatIterator( const CvSparseMat* mat, + CvSparseMatIterator* mat_iterator ); + +/** @brief Returns the next sparse matrix element + +The function moves iterator to the next sparse matrix element and returns pointer to it. In the +current version there is no any particular order of the elements, because they are stored in the +hash table. The sample below demonstrates how to iterate through the sparse matrix: +@code + // print all the non-zero sparse matrix elements and compute their sum + double sum = 0; + int i, dims = cvGetDims(sparsemat); + CvSparseMatIterator it; + CvSparseNode* node = cvInitSparseMatIterator(sparsemat, &it); + + for(; node != 0; node = cvGetNextSparseNode(&it)) + { + int* idx = CV_NODE_IDX(array, node); + float val = *(float*)CV_NODE_VAL(array, node); + printf("M"); + for(i = 0; i < dims; i++ ) + printf("[%d]", idx[i]); + printf("=%g\n", val); + + sum += val; + } + + printf("nTotal sum = %g\n", sum); +@endcode +@param mat_iterator Sparse array iterator + */ +CV_INLINE CvSparseNode* cvGetNextSparseNode( CvSparseMatIterator* mat_iterator ) +{ + if( mat_iterator->node->next ) + return mat_iterator->node = mat_iterator->node->next; + else + { + int idx; + for( idx = ++mat_iterator->curidx; idx < mat_iterator->mat->hashsize; idx++ ) + { + CvSparseNode* node = (CvSparseNode*)mat_iterator->mat->hashtable[idx]; + if( node ) + { + mat_iterator->curidx = idx; + return mat_iterator->node = node; + } + } + return NULL; + } +} + + +#define CV_MAX_ARR 10 + +/** matrix iterator: used for n-ary operations on dense arrays */ +typedef struct CvNArrayIterator +{ + int count; /**< number of arrays */ + int dims; /**< number of dimensions to iterate */ + CvSize size; /**< maximal common linear size: { width = size, height = 1 } */ + uchar* ptr[CV_MAX_ARR]; /**< pointers to the array slices */ + int stack[CV_MAX_DIM]; /**< for internal use */ + CvMatND* hdr[CV_MAX_ARR]; /**< pointers to the headers of the + matrices that are processed */ +} +CvNArrayIterator; + +#define CV_NO_DEPTH_CHECK 1 +#define CV_NO_CN_CHECK 2 +#define CV_NO_SIZE_CHECK 4 + +/** initializes iterator that traverses through several arrays simultaneously + (the function together with cvNextArraySlice is used for + N-ari element-wise operations) */ +CVAPI(int) cvInitNArrayIterator( int count, CvArr** arrs, + const CvArr* mask, CvMatND* stubs, + CvNArrayIterator* array_iterator, + int flags CV_DEFAULT(0) ); + +/** returns zero value if iteration is finished, non-zero (slice length) otherwise */ +CVAPI(int) cvNextNArraySlice( CvNArrayIterator* array_iterator ); + + +/** @brief Returns type of array elements. + +The function returns type of the array elements. In the case of IplImage the type is converted to +CvMat-like representation. For example, if the image has been created as: +@code + IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3); +@endcode +The code cvGetElemType(img) will return CV_8UC3. +@param arr Input array + */ +CVAPI(int) cvGetElemType( const CvArr* arr ); + +/** @brief Return number of array dimensions + +The function returns the array dimensionality and the array of dimension sizes. In the case of +IplImage or CvMat it always returns 2 regardless of number of image/matrix rows. For example, the +following code calculates total number of array elements: +@code + int sizes[CV_MAX_DIM]; + int i, total = 1; + int dims = cvGetDims(arr, size); + for(i = 0; i < dims; i++ ) + total *= sizes[i]; +@endcode +@param arr Input array +@param sizes Optional output vector of the array dimension sizes. For 2d arrays the number of rows +(height) goes first, number of columns (width) next. + */ +CVAPI(int) cvGetDims( const CvArr* arr, int* sizes CV_DEFAULT(NULL) ); + + +/** @brief Returns array size along the specified dimension. + +@param arr Input array +@param index Zero-based dimension index (for matrices 0 means number of rows, 1 means number of +columns; for images 0 means height, 1 means width) + */ +CVAPI(int) cvGetDimSize( const CvArr* arr, int index ); + + +/** @brief Return pointer to a particular array element. + +The functions return a pointer to a specific array element. Number of array dimension should match +to the number of indices passed to the function except for cvPtr1D function that can be used for +sequential access to 1D, 2D or nD dense arrays. + +The functions can be used for sparse arrays as well - if the requested node does not exist they +create it and set it to zero. + +All these as well as other functions accessing array elements ( cvGetND , cvGetRealND , cvSet +, cvSetND , cvSetRealND ) raise an error in case if the element index is out of range. +@param arr Input array +@param idx0 The first zero-based component of the element index +@param type Optional output parameter: type of matrix elements + */ +CVAPI(uchar*) cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL)); +/** @overload */ +CVAPI(uchar*) cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type CV_DEFAULT(NULL) ); +/** @overload */ +CVAPI(uchar*) cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, + int* type CV_DEFAULT(NULL)); +/** @overload +@param arr Input array +@param idx Array of the element indices +@param type Optional output parameter: type of matrix elements +@param create_node Optional input parameter for sparse matrices. Non-zero value of the parameter +means that the requested element is created if it does not exist already. +@param precalc_hashval Optional input parameter for sparse matrices. If the pointer is not NULL, +the function does not recalculate the node hash value, but takes it from the specified location. +It is useful for speeding up pair-wise operations (TODO: provide an example) +*/ +CVAPI(uchar*) cvPtrND( const CvArr* arr, const int* idx, int* type CV_DEFAULT(NULL), + int create_node CV_DEFAULT(1), + unsigned* precalc_hashval CV_DEFAULT(NULL)); + +/** @brief Return a specific array element. + +The functions return a specific array element. In the case of a sparse array the functions return 0 +if the requested node does not exist (no new node is created by the functions). +@param arr Input array +@param idx0 The first zero-based component of the element index + */ +CVAPI(CvScalar) cvGet1D( const CvArr* arr, int idx0 ); +/** @overload */ +CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 ); +/** @overload */ +CVAPI(CvScalar) cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 ); +/** @overload +@param arr Input array +@param idx Array of the element indices +*/ +CVAPI(CvScalar) cvGetND( const CvArr* arr, const int* idx ); + +/** @brief Return a specific element of single-channel 1D, 2D, 3D or nD array. + +Returns a specific element of a single-channel array. If the array has multiple channels, a runtime +error is raised. Note that Get?D functions can be used safely for both single-channel and +multiple-channel arrays though they are a bit slower. + +In the case of a sparse array the functions return 0 if the requested node does not exist (no new +node is created by the functions). +@param arr Input array. Must have a single channel. +@param idx0 The first zero-based component of the element index + */ +CVAPI(double) cvGetReal1D( const CvArr* arr, int idx0 ); +/** @overload */ +CVAPI(double) cvGetReal2D( const CvArr* arr, int idx0, int idx1 ); +/** @overload */ +CVAPI(double) cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 ); +/** @overload +@param arr Input array. Must have a single channel. +@param idx Array of the element indices +*/ +CVAPI(double) cvGetRealND( const CvArr* arr, const int* idx ); + +/** @brief Change the particular array element. + +The functions assign the new value to a particular array element. In the case of a sparse array the +functions create the node if it does not exist yet. +@param arr Input array +@param idx0 The first zero-based component of the element index +@param value The assigned value + */ +CVAPI(void) cvSet1D( CvArr* arr, int idx0, CvScalar value ); +/** @overload */ +CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value ); +/** @overload */ +CVAPI(void) cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value ); +/** @overload +@param arr Input array +@param idx Array of the element indices +@param value The assigned value +*/ +CVAPI(void) cvSetND( CvArr* arr, const int* idx, CvScalar value ); + +/** @brief Change a specific array element. + +The functions assign a new value to a specific element of a single-channel array. If the array has +multiple channels, a runtime error is raised. Note that the Set\*D function can be used safely for +both single-channel and multiple-channel arrays, though they are a bit slower. + +In the case of a sparse array the functions create the node if it does not yet exist. +@param arr Input array +@param idx0 The first zero-based component of the element index +@param value The assigned value + */ +CVAPI(void) cvSetReal1D( CvArr* arr, int idx0, double value ); +/** @overload */ +CVAPI(void) cvSetReal2D( CvArr* arr, int idx0, int idx1, double value ); +/** @overload */ +CVAPI(void) cvSetReal3D( CvArr* arr, int idx0, + int idx1, int idx2, double value ); +/** @overload +@param arr Input array +@param idx Array of the element indices +@param value The assigned value +*/ +CVAPI(void) cvSetRealND( CvArr* arr, const int* idx, double value ); + +/** clears element of ND dense array, + in case of sparse arrays it deletes the specified node */ +CVAPI(void) cvClearND( CvArr* arr, const int* idx ); + +/** @brief Returns matrix header for arbitrary array. + +The function returns a matrix header for the input array that can be a matrix - CvMat, an image - +IplImage, or a multi-dimensional dense array - CvMatND (the third option is allowed only if +allowND != 0) . In the case of matrix the function simply returns the input pointer. In the case of +IplImage\* or CvMatND it initializes the header structure with parameters of the current image ROI +and returns &header. Because COI is not supported by CvMat, it is returned separately. + +The function provides an easy way to handle both types of arrays - IplImage and CvMat using the same +code. Input array must have non-zero data pointer, otherwise the function will report an error. + +@note If the input array is IplImage with planar data layout and COI set, the function returns the +pointer to the selected plane and COI == 0. This feature allows user to process IplImage structures +with planar data layout, even though OpenCV does not support such images. +@param arr Input array +@param header Pointer to CvMat structure used as a temporary buffer +@param coi Optional output parameter for storing COI +@param allowND If non-zero, the function accepts multi-dimensional dense arrays (CvMatND\*) and +returns 2D matrix (if CvMatND has two dimensions) or 1D matrix (when CvMatND has 1 dimension or +more than 2 dimensions). The CvMatND array must be continuous. +@sa cvGetImage, cvarrToMat. + */ +CVAPI(CvMat*) cvGetMat( const CvArr* arr, CvMat* header, + int* coi CV_DEFAULT(NULL), + int allowND CV_DEFAULT(0)); + +/** @brief Returns image header for arbitrary array. + +The function returns the image header for the input array that can be a matrix (CvMat) or image +(IplImage). In the case of an image the function simply returns the input pointer. In the case of +CvMat it initializes an image_header structure with the parameters of the input matrix. Note that +if we transform IplImage to CvMat using cvGetMat and then transform CvMat back to IplImage using +this function, we will get different headers if the ROI is set in the original image. +@param arr Input array +@param image_header Pointer to IplImage structure used as a temporary buffer + */ +CVAPI(IplImage*) cvGetImage( const CvArr* arr, IplImage* image_header ); + + +/** @brief Changes the shape of a multi-dimensional array without copying the data. + +The function is an advanced version of cvReshape that can work with multi-dimensional arrays as +well (though it can work with ordinary images and matrices) and change the number of dimensions. + +Below are the two samples from the cvReshape description rewritten using cvReshapeMatND: +@code + IplImage* color_img = cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3); + IplImage gray_img_hdr, *gray_img; + gray_img = (IplImage*)cvReshapeMatND(color_img, sizeof(gray_img_hdr), &gray_img_hdr, 1, 0, 0); + ... + int size[] = { 2, 2, 2 }; + CvMatND* mat = cvCreateMatND(3, size, CV_32F); + CvMat row_header, *row; + row = (CvMat*)cvReshapeMatND(mat, sizeof(row_header), &row_header, 0, 1, 0); +@endcode +In C, the header file for this function includes a convenient macro cvReshapeND that does away with +the sizeof_header parameter. So, the lines containing the call to cvReshapeMatND in the examples +may be replaced as follow: +@code + gray_img = (IplImage*)cvReshapeND(color_img, &gray_img_hdr, 1, 0, 0); + ... + row = (CvMat*)cvReshapeND(mat, &row_header, 0, 1, 0); +@endcode +@param arr Input array +@param sizeof_header Size of output header to distinguish between IplImage, CvMat and CvMatND +output headers +@param header Output header to be filled +@param new_cn New number of channels. new_cn = 0 means that the number of channels remains +unchanged. +@param new_dims New number of dimensions. new_dims = 0 means that the number of dimensions +remains the same. +@param new_sizes Array of new dimension sizes. Only new_dims-1 values are used, because the +total number of elements must remain the same. Thus, if new_dims = 1, new_sizes array is not +used. + */ +CVAPI(CvArr*) cvReshapeMatND( const CvArr* arr, + int sizeof_header, CvArr* header, + int new_cn, int new_dims, int* new_sizes ); + +#define cvReshapeND( arr, header, new_cn, new_dims, new_sizes ) \ + cvReshapeMatND( (arr), sizeof(*(header)), (header), \ + (new_cn), (new_dims), (new_sizes)) + +/** @brief Changes shape of matrix/image without copying data. + +The function initializes the CvMat header so that it points to the same data as the original array +but has a different shape - different number of channels, different number of rows, or both. + +The following example code creates one image buffer and two image headers, the first is for a +320x240x3 image and the second is for a 960x240x1 image: +@code + IplImage* color_img = cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3); + CvMat gray_mat_hdr; + IplImage gray_img_hdr, *gray_img; + cvReshape(color_img, &gray_mat_hdr, 1); + gray_img = cvGetImage(&gray_mat_hdr, &gray_img_hdr); +@endcode +And the next example converts a 3x3 matrix to a single 1x9 vector: +@code + CvMat* mat = cvCreateMat(3, 3, CV_32F); + CvMat row_header, *row; + row = cvReshape(mat, &row_header, 0, 1); +@endcode +@param arr Input array +@param header Output header to be filled +@param new_cn New number of channels. 'new_cn = 0' means that the number of channels remains +unchanged. +@param new_rows New number of rows. 'new_rows = 0' means that the number of rows remains +unchanged unless it needs to be changed according to new_cn value. +*/ +CVAPI(CvMat*) cvReshape( const CvArr* arr, CvMat* header, + int new_cn, int new_rows CV_DEFAULT(0) ); + +/** Repeats source 2d array several times in both horizontal and + vertical direction to fill destination array */ +CVAPI(void) cvRepeat( const CvArr* src, CvArr* dst ); + +/** @brief Allocates array data + +The function allocates image, matrix or multi-dimensional dense array data. Note that in the case of +matrix types OpenCV allocation functions are used. In the case of IplImage they are used unless +CV_TURN_ON_IPL_COMPATIBILITY() has been called before. In the latter case IPL functions are used +to allocate the data. +@param arr Array header + */ +CVAPI(void) cvCreateData( CvArr* arr ); + +/** @brief Releases array data. + +The function releases the array data. In the case of CvMat or CvMatND it simply calls +cvDecRefData(), that is the function can not deallocate external data. See also the note to +cvCreateData . +@param arr Array header + */ +CVAPI(void) cvReleaseData( CvArr* arr ); + +/** @brief Assigns user data to the array header. + +The function assigns user data to the array header. Header should be initialized before using +cvCreateMatHeader, cvCreateImageHeader, cvCreateMatNDHeader, cvInitMatHeader, +cvInitImageHeader or cvInitMatNDHeader. +@param arr Array header +@param data User data +@param step Full row length in bytes + */ +CVAPI(void) cvSetData( CvArr* arr, void* data, int step ); + +/** @brief Retrieves low-level information about the array. + +The function fills output variables with low-level information about the array data. All output + +parameters are optional, so some of the pointers may be set to NULL. If the array is IplImage with +ROI set, the parameters of ROI are returned. + +The following example shows how to get access to array elements. It computes absolute values of the +array elements : +@code + float* data; + int step; + CvSize size; + + cvGetRawData(array, (uchar**)&data, &step, &size); + step /= sizeof(data[0]); + + for(int y = 0; y < size.height; y++, data += step ) + for(int x = 0; x < size.width; x++ ) + data[x] = (float)fabs(data[x]); +@endcode +@param arr Array header +@param data Output pointer to the whole image origin or ROI origin if ROI is set +@param step Output full row length in bytes +@param roi_size Output ROI size + */ +CVAPI(void) cvGetRawData( const CvArr* arr, uchar** data, + int* step CV_DEFAULT(NULL), + CvSize* roi_size CV_DEFAULT(NULL)); + +/** @brief Returns size of matrix or image ROI. + +The function returns number of rows (CvSize::height) and number of columns (CvSize::width) of the +input matrix or image. In the case of image the size of ROI is returned. +@param arr array header + */ +CVAPI(CvSize) cvGetSize( const CvArr* arr ); + +/** @brief Copies one array to another. + +The function copies selected elements from an input array to an output array: + +\f[\texttt{dst} (I)= \texttt{src} (I) \quad \text{if} \quad \texttt{mask} (I) \ne 0.\f] + +If any of the passed arrays is of IplImage type, then its ROI and COI fields are used. Both arrays +must have the same type, the same number of dimensions, and the same size. The function can also +copy sparse arrays (mask is not supported in this case). +@param src The source array +@param dst The destination array +@param mask Operation mask, 8-bit single channel array; specifies elements of the destination array +to be changed + */ +CVAPI(void) cvCopy( const CvArr* src, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @brief Sets every element of an array to a given value. + +The function copies the scalar value to every selected element of the destination array: +\f[\texttt{arr} (I)= \texttt{value} \quad \text{if} \quad \texttt{mask} (I) \ne 0\f] +If array arr is of IplImage type, then is ROI used, but COI must not be set. +@param arr The destination array +@param value Fill value +@param mask Operation mask, 8-bit single channel array; specifies elements of the destination +array to be changed + */ +CVAPI(void) cvSet( CvArr* arr, CvScalar value, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @brief Clears the array. + +The function clears the array. In the case of dense arrays (CvMat, CvMatND or IplImage), +cvZero(array) is equivalent to cvSet(array,cvScalarAll(0),0). In the case of sparse arrays all the +elements are removed. +@param arr Array to be cleared + */ +CVAPI(void) cvSetZero( CvArr* arr ); +#define cvZero cvSetZero + + +/** Splits a multi-channel array into the set of single-channel arrays or + extracts particular [color] plane */ +CVAPI(void) cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1, + CvArr* dst2, CvArr* dst3 ); + +/** Merges a set of single-channel arrays into the single multi-channel array + or inserts one particular [color] plane to the array */ +CVAPI(void) cvMerge( const CvArr* src0, const CvArr* src1, + const CvArr* src2, const CvArr* src3, + CvArr* dst ); + +/** Copies several channels from input arrays to + certain channels of output arrays */ +CVAPI(void) cvMixChannels( const CvArr** src, int src_count, + CvArr** dst, int dst_count, + const int* from_to, int pair_count ); + +/** @brief Converts one array to another with optional linear transformation. + +The function has several different purposes, and thus has several different names. It copies one +array to another with optional scaling, which is performed first, and/or optional type conversion, +performed after: + +\f[\texttt{dst} (I) = \texttt{scale} \texttt{src} (I) + ( \texttt{shift} _0, \texttt{shift} _1,...)\f] + +All the channels of multi-channel arrays are processed independently. + +The type of conversion is done with rounding and saturation, that is if the result of scaling + +conversion can not be represented exactly by a value of the destination array element type, it is +set to the nearest representable value on the real axis. +@param src Source array +@param dst Destination array +@param scale Scale factor +@param shift Value added to the scaled source array elements + */ +CVAPI(void) cvConvertScale( const CvArr* src, CvArr* dst, + double scale CV_DEFAULT(1), + double shift CV_DEFAULT(0) ); +#define cvCvtScale cvConvertScale +#define cvScale cvConvertScale +#define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 ) + + +/** Performs linear transformation on every source array element, + stores absolute value of the result: + dst(x,y,c) = abs(scale*src(x,y,c)+shift). + destination array must have 8u type. + In other cases one may use cvConvertScale + cvAbsDiffS */ +CVAPI(void) cvConvertScaleAbs( const CvArr* src, CvArr* dst, + double scale CV_DEFAULT(1), + double shift CV_DEFAULT(0) ); +#define cvCvtScaleAbs cvConvertScaleAbs + + +/** checks termination criteria validity and + sets eps to default_eps (if it is not set), + max_iter to default_max_iters (if it is not set) +*/ +CVAPI(CvTermCriteria) cvCheckTermCriteria( CvTermCriteria criteria, + double default_eps, + int default_max_iters ); + +/****************************************************************************************\ +* Arithmetic, logic and comparison operations * +\****************************************************************************************/ + +/** dst(mask) = src1(mask) + src2(mask) */ +CVAPI(void) cvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(mask) = src(mask) + value */ +CVAPI(void) cvAddS( const CvArr* src, CvScalar value, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(mask) = src1(mask) - src2(mask) */ +CVAPI(void) cvSub( const CvArr* src1, const CvArr* src2, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(mask) = src(mask) - value = src(mask) + (-value) */ +CV_INLINE void cvSubS( const CvArr* src, CvScalar value, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL)) +{ + cvAddS( src, cvScalar( -value.val[0], -value.val[1], -value.val[2], -value.val[3]), + dst, mask ); +} + +/** dst(mask) = value - src(mask) */ +CVAPI(void) cvSubRS( const CvArr* src, CvScalar value, CvArr* dst, + const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src1(idx) * src2(idx) * scale + (scaled element-wise multiplication of 2 arrays) */ +CVAPI(void) cvMul( const CvArr* src1, const CvArr* src2, + CvArr* dst, double scale CV_DEFAULT(1) ); + +/** element-wise division/inversion with scaling: + dst(idx) = src1(idx) * scale / src2(idx) + or dst(idx) = scale / src2(idx) if src1 == 0 */ +CVAPI(void) cvDiv( const CvArr* src1, const CvArr* src2, + CvArr* dst, double scale CV_DEFAULT(1)); + +/** dst = src1 * scale + src2 */ +CVAPI(void) cvScaleAdd( const CvArr* src1, CvScalar scale, + const CvArr* src2, CvArr* dst ); +#define cvAXPY( A, real_scalar, B, C ) cvScaleAdd(A, cvRealScalar(real_scalar), B, C) + +/** dst = src1 * alpha + src2 * beta + gamma */ +CVAPI(void) cvAddWeighted( const CvArr* src1, double alpha, + const CvArr* src2, double beta, + double gamma, CvArr* dst ); + +/** @brief Calculates the dot product of two arrays in Euclidean metrics. + +The function calculates and returns the Euclidean dot product of two arrays. + +\f[src1 \bullet src2 = \sum _I ( \texttt{src1} (I) \texttt{src2} (I))\f] + +In the case of multiple channel arrays, the results for all channels are accumulated. In particular, +cvDotProduct(a,a) where a is a complex vector, will return \f$||\texttt{a}||^2\f$. The function can +process multi-dimensional arrays, row by row, layer by layer, and so on. +@param src1 The first source array +@param src2 The second source array + */ +CVAPI(double) cvDotProduct( const CvArr* src1, const CvArr* src2 ); + +/** dst(idx) = src1(idx) & src2(idx) */ +CVAPI(void) cvAnd( const CvArr* src1, const CvArr* src2, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src(idx) & value */ +CVAPI(void) cvAndS( const CvArr* src, CvScalar value, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src1(idx) | src2(idx) */ +CVAPI(void) cvOr( const CvArr* src1, const CvArr* src2, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src(idx) | value */ +CVAPI(void) cvOrS( const CvArr* src, CvScalar value, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src1(idx) ^ src2(idx) */ +CVAPI(void) cvXor( const CvArr* src1, const CvArr* src2, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = src(idx) ^ value */ +CVAPI(void) cvXorS( const CvArr* src, CvScalar value, + CvArr* dst, const CvArr* mask CV_DEFAULT(NULL)); + +/** dst(idx) = ~src(idx) */ +CVAPI(void) cvNot( const CvArr* src, CvArr* dst ); + +/** dst(idx) = lower(idx) <= src(idx) < upper(idx) */ +CVAPI(void) cvInRange( const CvArr* src, const CvArr* lower, + const CvArr* upper, CvArr* dst ); + +/** dst(idx) = lower <= src(idx) < upper */ +CVAPI(void) cvInRangeS( const CvArr* src, CvScalar lower, + CvScalar upper, CvArr* dst ); + +#define CV_CMP_EQ 0 +#define CV_CMP_GT 1 +#define CV_CMP_GE 2 +#define CV_CMP_LT 3 +#define CV_CMP_LE 4 +#define CV_CMP_NE 5 + +/** The comparison operation support single-channel arrays only. + Destination image should be 8uC1 or 8sC1 */ + +/** dst(idx) = src1(idx) _cmp_op_ src2(idx) */ +CVAPI(void) cvCmp( const CvArr* src1, const CvArr* src2, CvArr* dst, int cmp_op ); + +/** dst(idx) = src1(idx) _cmp_op_ value */ +CVAPI(void) cvCmpS( const CvArr* src, double value, CvArr* dst, int cmp_op ); + +/** dst(idx) = min(src1(idx),src2(idx)) */ +CVAPI(void) cvMin( const CvArr* src1, const CvArr* src2, CvArr* dst ); + +/** dst(idx) = max(src1(idx),src2(idx)) */ +CVAPI(void) cvMax( const CvArr* src1, const CvArr* src2, CvArr* dst ); + +/** dst(idx) = min(src(idx),value) */ +CVAPI(void) cvMinS( const CvArr* src, double value, CvArr* dst ); + +/** dst(idx) = max(src(idx),value) */ +CVAPI(void) cvMaxS( const CvArr* src, double value, CvArr* dst ); + +/** dst(x,y,c) = abs(src1(x,y,c) - src2(x,y,c)) */ +CVAPI(void) cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst ); + +/** dst(x,y,c) = abs(src(x,y,c) - value(c)) */ +CVAPI(void) cvAbsDiffS( const CvArr* src, CvArr* dst, CvScalar value ); +#define cvAbs( src, dst ) cvAbsDiffS( (src), (dst), cvScalarAll(0)) + +/****************************************************************************************\ +* Math operations * +\****************************************************************************************/ + +/** Does cartesian->polar coordinates conversion. + Either of output components (magnitude or angle) is optional */ +CVAPI(void) cvCartToPolar( const CvArr* x, const CvArr* y, + CvArr* magnitude, CvArr* angle CV_DEFAULT(NULL), + int angle_in_degrees CV_DEFAULT(0)); + +/** Does polar->cartesian coordinates conversion. + Either of output components (magnitude or angle) is optional. + If magnitude is missing it is assumed to be all 1's */ +CVAPI(void) cvPolarToCart( const CvArr* magnitude, const CvArr* angle, + CvArr* x, CvArr* y, + int angle_in_degrees CV_DEFAULT(0)); + +/** Does powering: dst(idx) = src(idx)^power */ +CVAPI(void) cvPow( const CvArr* src, CvArr* dst, double power ); + +/** Does exponention: dst(idx) = exp(src(idx)). + Overflow is not handled yet. Underflow is handled. + Maximal relative error is ~7e-6 for single-precision input */ +CVAPI(void) cvExp( const CvArr* src, CvArr* dst ); + +/** Calculates natural logarithms: dst(idx) = log(abs(src(idx))). + Logarithm of 0 gives large negative number(~-700) + Maximal relative error is ~3e-7 for single-precision output +*/ +CVAPI(void) cvLog( const CvArr* src, CvArr* dst ); + +/** Fast arctangent calculation */ +CVAPI(float) cvFastArctan( float y, float x ); + +/** Fast cubic root calculation */ +CVAPI(float) cvCbrt( float value ); + +#define CV_CHECK_RANGE 1 +#define CV_CHECK_QUIET 2 +/** Checks array values for NaNs, Infs or simply for too large numbers + (if CV_CHECK_RANGE is set). If CV_CHECK_QUIET is set, + no runtime errors is raised (function returns zero value in case of "bad" values). + Otherwise cvError is called */ +CVAPI(int) cvCheckArr( const CvArr* arr, int flags CV_DEFAULT(0), + double min_val CV_DEFAULT(0), double max_val CV_DEFAULT(0)); +#define cvCheckArray cvCheckArr + +#define CV_RAND_UNI 0 +#define CV_RAND_NORMAL 1 + +/** @brief Fills an array with random numbers and updates the RNG state. + +The function fills the destination array with uniformly or normally distributed random numbers. +@param rng CvRNG state initialized by cvRNG +@param arr The destination array +@param dist_type Distribution type +> - **CV_RAND_UNI** uniform distribution +> - **CV_RAND_NORMAL** normal or Gaussian distribution +@param param1 The first parameter of the distribution. In the case of a uniform distribution it is +the inclusive lower boundary of the random numbers range. In the case of a normal distribution it +is the mean value of the random numbers. +@param param2 The second parameter of the distribution. In the case of a uniform distribution it +is the exclusive upper boundary of the random numbers range. In the case of a normal distribution +it is the standard deviation of the random numbers. +@sa randu, randn, RNG::fill. + */ +CVAPI(void) cvRandArr( CvRNG* rng, CvArr* arr, int dist_type, + CvScalar param1, CvScalar param2 ); + +CVAPI(void) cvRandShuffle( CvArr* mat, CvRNG* rng, + double iter_factor CV_DEFAULT(1.)); + +#define CV_SORT_EVERY_ROW 0 +#define CV_SORT_EVERY_COLUMN 1 +#define CV_SORT_ASCENDING 0 +#define CV_SORT_DESCENDING 16 + +CVAPI(void) cvSort( const CvArr* src, CvArr* dst CV_DEFAULT(NULL), + CvArr* idxmat CV_DEFAULT(NULL), + int flags CV_DEFAULT(0)); + +/** Finds real roots of a cubic equation */ +CVAPI(int) cvSolveCubic( const CvMat* coeffs, CvMat* roots ); + +/** Finds all real and complex roots of a polynomial equation */ +CVAPI(void) cvSolvePoly(const CvMat* coeffs, CvMat *roots2, + int maxiter CV_DEFAULT(20), int fig CV_DEFAULT(100)); + +/****************************************************************************************\ +* Matrix operations * +\****************************************************************************************/ + +/** @brief Calculates the cross product of two 3D vectors. + +The function calculates the cross product of two 3D vectors: +\f[\texttt{dst} = \texttt{src1} \times \texttt{src2}\f] +or: +\f[\begin{array}{l} \texttt{dst} _1 = \texttt{src1} _2 \texttt{src2} _3 - \texttt{src1} _3 \texttt{src2} _2 \\ \texttt{dst} _2 = \texttt{src1} _3 \texttt{src2} _1 - \texttt{src1} _1 \texttt{src2} _3 \\ \texttt{dst} _3 = \texttt{src1} _1 \texttt{src2} _2 - \texttt{src1} _2 \texttt{src2} _1 \end{array}\f] +@param src1 The first source vector +@param src2 The second source vector +@param dst The destination vector + */ +CVAPI(void) cvCrossProduct( const CvArr* src1, const CvArr* src2, CvArr* dst ); + +/** Matrix transform: dst = A*B + C, C is optional */ +#define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( (src1), (src2), 1., (src3), 1., (dst), 0 ) +#define cvMatMul( src1, src2, dst ) cvMatMulAdd( (src1), (src2), NULL, (dst)) + +#define CV_GEMM_A_T 1 +#define CV_GEMM_B_T 2 +#define CV_GEMM_C_T 4 +/** Extended matrix transform: + dst = alpha*op(A)*op(B) + beta*op(C), where op(X) is X or X^T */ +CVAPI(void) cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, + const CvArr* src3, double beta, CvArr* dst, + int tABC CV_DEFAULT(0)); +#define cvMatMulAddEx cvGEMM + +/** Transforms each element of source array and stores + resultant vectors in destination array */ +CVAPI(void) cvTransform( const CvArr* src, CvArr* dst, + const CvMat* transmat, + const CvMat* shiftvec CV_DEFAULT(NULL)); +#define cvMatMulAddS cvTransform + +/** Does perspective transform on every element of input array */ +CVAPI(void) cvPerspectiveTransform( const CvArr* src, CvArr* dst, + const CvMat* mat ); + +/** Calculates (A-delta)*(A-delta)^T (order=0) or (A-delta)^T*(A-delta) (order=1) */ +CVAPI(void) cvMulTransposed( const CvArr* src, CvArr* dst, int order, + const CvArr* delta CV_DEFAULT(NULL), + double scale CV_DEFAULT(1.) ); + +/** Transposes matrix. Square matrices can be transposed in-place */ +CVAPI(void) cvTranspose( const CvArr* src, CvArr* dst ); +#define cvT cvTranspose + +/** Completes the symmetric matrix from the lower (LtoR=0) or from the upper (LtoR!=0) part */ +CVAPI(void) cvCompleteSymm( CvMat* matrix, int LtoR CV_DEFAULT(0) ); + +/** Mirror array data around horizontal (flip=0), + vertical (flip=1) or both(flip=-1) axises: + cvFlip(src) flips images vertically and sequences horizontally (inplace) */ +CVAPI(void) cvFlip( const CvArr* src, CvArr* dst CV_DEFAULT(NULL), + int flip_mode CV_DEFAULT(0)); +#define cvMirror cvFlip + + +#define CV_SVD_MODIFY_A 1 +#define CV_SVD_U_T 2 +#define CV_SVD_V_T 4 + +/** Performs Singular Value Decomposition of a matrix */ +CVAPI(void) cvSVD( CvArr* A, CvArr* W, CvArr* U CV_DEFAULT(NULL), + CvArr* V CV_DEFAULT(NULL), int flags CV_DEFAULT(0)); + +/** Performs Singular Value Back Substitution (solves A*X = B): + flags must be the same as in cvSVD */ +CVAPI(void) cvSVBkSb( const CvArr* W, const CvArr* U, + const CvArr* V, const CvArr* B, + CvArr* X, int flags ); + +#define CV_LU 0 +#define CV_SVD 1 +#define CV_SVD_SYM 2 +#define CV_CHOLESKY 3 +#define CV_QR 4 +#define CV_NORMAL 16 + +/** Inverts matrix */ +CVAPI(double) cvInvert( const CvArr* src, CvArr* dst, + int method CV_DEFAULT(CV_LU)); +#define cvInv cvInvert + +/** Solves linear system (src1)*(dst) = (src2) + (returns 0 if src1 is a singular and CV_LU method is used) */ +CVAPI(int) cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, + int method CV_DEFAULT(CV_LU)); + +/** Calculates determinant of input matrix */ +CVAPI(double) cvDet( const CvArr* mat ); + +/** Calculates trace of the matrix (sum of elements on the main diagonal) */ +CVAPI(CvScalar) cvTrace( const CvArr* mat ); + +/** Finds eigen values and vectors of a symmetric matrix */ +CVAPI(void) cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, + double eps CV_DEFAULT(0), + int lowindex CV_DEFAULT(-1), + int highindex CV_DEFAULT(-1)); + +///* Finds selected eigen values and vectors of a symmetric matrix */ +//CVAPI(void) cvSelectedEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, +// int lowindex, int highindex ); + +/** Makes an identity matrix (mat_ij = i == j) */ +CVAPI(void) cvSetIdentity( CvArr* mat, CvScalar value CV_DEFAULT(cvRealScalar(1)) ); + +/** Fills matrix with given range of numbers */ +CVAPI(CvArr*) cvRange( CvArr* mat, double start, double end ); + +/** @anchor core_c_CovarFlags +@name Flags for cvCalcCovarMatrix +@see cvCalcCovarMatrix + @{ +*/ + +/** flag for cvCalcCovarMatrix, transpose([v1-avg, v2-avg,...]) * [v1-avg,v2-avg,...] */ +#define CV_COVAR_SCRAMBLED 0 + +/** flag for cvCalcCovarMatrix, [v1-avg, v2-avg,...] * transpose([v1-avg,v2-avg,...]) */ +#define CV_COVAR_NORMAL 1 + +/** flag for cvCalcCovarMatrix, do not calc average (i.e. mean vector) - use the input vector instead + (useful for calculating covariance matrix by parts) */ +#define CV_COVAR_USE_AVG 2 + +/** flag for cvCalcCovarMatrix, scale the covariance matrix coefficients by number of the vectors */ +#define CV_COVAR_SCALE 4 + +/** flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its rows */ +#define CV_COVAR_ROWS 8 + +/** flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its columns */ +#define CV_COVAR_COLS 16 + +/** @} */ + +/** Calculates covariation matrix for a set of vectors +@see @ref core_c_CovarFlags "flags" +*/ +CVAPI(void) cvCalcCovarMatrix( const CvArr** vects, int count, + CvArr* cov_mat, CvArr* avg, int flags ); + +#define CV_PCA_DATA_AS_ROW 0 +#define CV_PCA_DATA_AS_COL 1 +#define CV_PCA_USE_AVG 2 +CVAPI(void) cvCalcPCA( const CvArr* data, CvArr* mean, + CvArr* eigenvals, CvArr* eigenvects, int flags ); + +CVAPI(void) cvProjectPCA( const CvArr* data, const CvArr* mean, + const CvArr* eigenvects, CvArr* result ); + +CVAPI(void) cvBackProjectPCA( const CvArr* proj, const CvArr* mean, + const CvArr* eigenvects, CvArr* result ); + +/** Calculates Mahalanobis(weighted) distance */ +CVAPI(double) cvMahalanobis( const CvArr* vec1, const CvArr* vec2, const CvArr* mat ); +#define cvMahalonobis cvMahalanobis + +/****************************************************************************************\ +* Array Statistics * +\****************************************************************************************/ + +/** Finds sum of array elements */ +CVAPI(CvScalar) cvSum( const CvArr* arr ); + +/** Calculates number of non-zero pixels */ +CVAPI(int) cvCountNonZero( const CvArr* arr ); + +/** Calculates mean value of array elements */ +CVAPI(CvScalar) cvAvg( const CvArr* arr, const CvArr* mask CV_DEFAULT(NULL) ); + +/** Calculates mean and standard deviation of pixel values */ +CVAPI(void) cvAvgSdv( const CvArr* arr, CvScalar* mean, CvScalar* std_dev, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** Finds global minimum, maximum and their positions */ +CVAPI(void) cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val, + CvPoint* min_loc CV_DEFAULT(NULL), + CvPoint* max_loc CV_DEFAULT(NULL), + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @anchor core_c_NormFlags + @name Flags for cvNorm and cvNormalize + @{ +*/ +#define CV_C 1 +#define CV_L1 2 +#define CV_L2 4 +#define CV_NORM_MASK 7 +#define CV_RELATIVE 8 +#define CV_DIFF 16 +#define CV_MINMAX 32 + +#define CV_DIFF_C (CV_DIFF | CV_C) +#define CV_DIFF_L1 (CV_DIFF | CV_L1) +#define CV_DIFF_L2 (CV_DIFF | CV_L2) +#define CV_RELATIVE_C (CV_RELATIVE | CV_C) +#define CV_RELATIVE_L1 (CV_RELATIVE | CV_L1) +#define CV_RELATIVE_L2 (CV_RELATIVE | CV_L2) +/** @} */ + +/** Finds norm, difference norm or relative difference norm for an array (or two arrays) +@see ref core_c_NormFlags "flags" +*/ +CVAPI(double) cvNorm( const CvArr* arr1, const CvArr* arr2 CV_DEFAULT(NULL), + int norm_type CV_DEFAULT(CV_L2), + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @see ref core_c_NormFlags "flags" */ +CVAPI(void) cvNormalize( const CvArr* src, CvArr* dst, + double a CV_DEFAULT(1.), double b CV_DEFAULT(0.), + int norm_type CV_DEFAULT(CV_L2), + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @anchor core_c_ReduceFlags + @name Flags for cvReduce + @{ +*/ +#define CV_REDUCE_SUM 0 +#define CV_REDUCE_AVG 1 +#define CV_REDUCE_MAX 2 +#define CV_REDUCE_MIN 3 +/** @} */ + +/** @see @ref core_c_ReduceFlags "flags" */ +CVAPI(void) cvReduce( const CvArr* src, CvArr* dst, int dim CV_DEFAULT(-1), + int op CV_DEFAULT(CV_REDUCE_SUM) ); + +/****************************************************************************************\ +* Discrete Linear Transforms and Related Functions * +\****************************************************************************************/ + +/** @anchor core_c_DftFlags + @name Flags for cvDFT, cvDCT and cvMulSpectrums + @{ + */ +#define CV_DXT_FORWARD 0 +#define CV_DXT_INVERSE 1 +#define CV_DXT_SCALE 2 /**< divide result by size of array */ +#define CV_DXT_INV_SCALE (CV_DXT_INVERSE + CV_DXT_SCALE) +#define CV_DXT_INVERSE_SCALE CV_DXT_INV_SCALE +#define CV_DXT_ROWS 4 /**< transform each row individually */ +#define CV_DXT_MUL_CONJ 8 /**< conjugate the second argument of cvMulSpectrums */ +/** @} */ + +/** Discrete Fourier Transform: + complex->complex, + real->ccs (forward), + ccs->real (inverse) +@see core_c_DftFlags "flags" +*/ +CVAPI(void) cvDFT( const CvArr* src, CvArr* dst, int flags, + int nonzero_rows CV_DEFAULT(0) ); +#define cvFFT cvDFT + +/** Multiply results of DFTs: DFT(X)*DFT(Y) or DFT(X)*conj(DFT(Y)) +@see core_c_DftFlags "flags" +*/ +CVAPI(void) cvMulSpectrums( const CvArr* src1, const CvArr* src2, + CvArr* dst, int flags ); + +/** Finds optimal DFT vector size >= size0 */ +CVAPI(int) cvGetOptimalDFTSize( int size0 ); + +/** Discrete Cosine Transform +@see core_c_DftFlags "flags" +*/ +CVAPI(void) cvDCT( const CvArr* src, CvArr* dst, int flags ); + +/****************************************************************************************\ +* Dynamic data structures * +\****************************************************************************************/ + +/** Calculates length of sequence slice (with support of negative indices). */ +CVAPI(int) cvSliceLength( CvSlice slice, const CvSeq* seq ); + + +/** Creates new memory storage. + block_size == 0 means that default, + somewhat optimal size, is used (currently, it is 64K) */ +CVAPI(CvMemStorage*) cvCreateMemStorage( int block_size CV_DEFAULT(0)); + + +/** Creates a memory storage that will borrow memory blocks from parent storage */ +CVAPI(CvMemStorage*) cvCreateChildMemStorage( CvMemStorage* parent ); + + +/** Releases memory storage. All the children of a parent must be released before + the parent. A child storage returns all the blocks to parent when it is released */ +CVAPI(void) cvReleaseMemStorage( CvMemStorage** storage ); + + +/** Clears memory storage. This is the only way(!!!) (besides cvRestoreMemStoragePos) + to reuse memory allocated for the storage - cvClearSeq,cvClearSet ... + do not free any memory. + A child storage returns all the blocks to the parent when it is cleared */ +CVAPI(void) cvClearMemStorage( CvMemStorage* storage ); + +/** Remember a storage "free memory" position */ +CVAPI(void) cvSaveMemStoragePos( const CvMemStorage* storage, CvMemStoragePos* pos ); + +/** Restore a storage "free memory" position */ +CVAPI(void) cvRestoreMemStoragePos( CvMemStorage* storage, CvMemStoragePos* pos ); + +/** Allocates continuous buffer of the specified size in the storage */ +CVAPI(void*) cvMemStorageAlloc( CvMemStorage* storage, size_t size ); + +/** Allocates string in memory storage */ +//CVAPI(CvString) cvMemStorageAllocString( CvMemStorage* storage, const char* ptr, +// int len CV_DEFAULT(-1) ); + +/** Creates new empty sequence that will reside in the specified storage */ +CVAPI(CvSeq*) cvCreateSeq( int seq_flags, size_t header_size, + size_t elem_size, CvMemStorage* storage ); + +/** Changes default size (granularity) of sequence blocks. + The default size is ~1Kbyte */ +CVAPI(void) cvSetSeqBlockSize( CvSeq* seq, int delta_elems ); + + +/** Adds new element to the end of sequence. Returns pointer to the element */ +CVAPI(schar*) cvSeqPush( CvSeq* seq, const void* element CV_DEFAULT(NULL)); + + +/** Adds new element to the beginning of sequence. Returns pointer to it */ +CVAPI(schar*) cvSeqPushFront( CvSeq* seq, const void* element CV_DEFAULT(NULL)); + + +/** Removes the last element from sequence and optionally saves it */ +CVAPI(void) cvSeqPop( CvSeq* seq, void* element CV_DEFAULT(NULL)); + + +/** Removes the first element from sequence and optioanally saves it */ +CVAPI(void) cvSeqPopFront( CvSeq* seq, void* element CV_DEFAULT(NULL)); + + +#define CV_FRONT 1 +#define CV_BACK 0 +/** Adds several new elements to the end of sequence */ +CVAPI(void) cvSeqPushMulti( CvSeq* seq, const void* elements, + int count, int in_front CV_DEFAULT(0) ); + +/** Removes several elements from the end of sequence and optionally saves them */ +CVAPI(void) cvSeqPopMulti( CvSeq* seq, void* elements, + int count, int in_front CV_DEFAULT(0) ); + +/** Inserts a new element in the middle of sequence. + cvSeqInsert(seq,0,elem) == cvSeqPushFront(seq,elem) */ +CVAPI(schar*) cvSeqInsert( CvSeq* seq, int before_index, + const void* element CV_DEFAULT(NULL)); + +/** Removes specified sequence element */ +CVAPI(void) cvSeqRemove( CvSeq* seq, int index ); + + +/** Removes all the elements from the sequence. The freed memory + can be reused later only by the same sequence unless cvClearMemStorage + or cvRestoreMemStoragePos is called */ +CVAPI(void) cvClearSeq( CvSeq* seq ); + + +/** Retrieves pointer to specified sequence element. + Negative indices are supported and mean counting from the end + (e.g -1 means the last sequence element) */ +CVAPI(schar*) cvGetSeqElem( const CvSeq* seq, int index ); + +/** Calculates index of the specified sequence element. + Returns -1 if element does not belong to the sequence */ +CVAPI(int) cvSeqElemIdx( const CvSeq* seq, const void* element, + CvSeqBlock** block CV_DEFAULT(NULL) ); + +/** Initializes sequence writer. The new elements will be added to the end of sequence */ +CVAPI(void) cvStartAppendToSeq( CvSeq* seq, CvSeqWriter* writer ); + + +/** Combination of cvCreateSeq and cvStartAppendToSeq */ +CVAPI(void) cvStartWriteSeq( int seq_flags, int header_size, + int elem_size, CvMemStorage* storage, + CvSeqWriter* writer ); + +/** Closes sequence writer, updates sequence header and returns pointer + to the resultant sequence + (which may be useful if the sequence was created using cvStartWriteSeq)) +*/ +CVAPI(CvSeq*) cvEndWriteSeq( CvSeqWriter* writer ); + + +/** Updates sequence header. May be useful to get access to some of previously + written elements via cvGetSeqElem or sequence reader */ +CVAPI(void) cvFlushSeqWriter( CvSeqWriter* writer ); + + +/** Initializes sequence reader. + The sequence can be read in forward or backward direction */ +CVAPI(void) cvStartReadSeq( const CvSeq* seq, CvSeqReader* reader, + int reverse CV_DEFAULT(0) ); + + +/** Returns current sequence reader position (currently observed sequence element) */ +CVAPI(int) cvGetSeqReaderPos( CvSeqReader* reader ); + + +/** Changes sequence reader position. It may seek to an absolute or + to relative to the current position */ +CVAPI(void) cvSetSeqReaderPos( CvSeqReader* reader, int index, + int is_relative CV_DEFAULT(0)); + +/** Copies sequence content to a continuous piece of memory */ +CVAPI(void*) cvCvtSeqToArray( const CvSeq* seq, void* elements, + CvSlice slice CV_DEFAULT(CV_WHOLE_SEQ) ); + +/** Creates sequence header for array. + After that all the operations on sequences that do not alter the content + can be applied to the resultant sequence */ +CVAPI(CvSeq*) cvMakeSeqHeaderForArray( int seq_type, int header_size, + int elem_size, void* elements, int total, + CvSeq* seq, CvSeqBlock* block ); + +/** Extracts sequence slice (with or without copying sequence elements) */ +CVAPI(CvSeq*) cvSeqSlice( const CvSeq* seq, CvSlice slice, + CvMemStorage* storage CV_DEFAULT(NULL), + int copy_data CV_DEFAULT(0)); + +CV_INLINE CvSeq* cvCloneSeq( const CvSeq* seq, CvMemStorage* storage CV_DEFAULT(NULL)) +{ + return cvSeqSlice( seq, CV_WHOLE_SEQ, storage, 1 ); +} + +/** Removes sequence slice */ +CVAPI(void) cvSeqRemoveSlice( CvSeq* seq, CvSlice slice ); + +/** Inserts a sequence or array into another sequence */ +CVAPI(void) cvSeqInsertSlice( CvSeq* seq, int before_index, const CvArr* from_arr ); + +/** a < b ? -1 : a > b ? 1 : 0 */ +typedef int (CV_CDECL* CvCmpFunc)(const void* a, const void* b, void* userdata ); + +/** Sorts sequence in-place given element comparison function */ +CVAPI(void) cvSeqSort( CvSeq* seq, CvCmpFunc func, void* userdata CV_DEFAULT(NULL) ); + +/** Finds element in a [sorted] sequence */ +CVAPI(schar*) cvSeqSearch( CvSeq* seq, const void* elem, CvCmpFunc func, + int is_sorted, int* elem_idx, + void* userdata CV_DEFAULT(NULL) ); + +/** Reverses order of sequence elements in-place */ +CVAPI(void) cvSeqInvert( CvSeq* seq ); + +/** Splits sequence into one or more equivalence classes using the specified criteria */ +CVAPI(int) cvSeqPartition( const CvSeq* seq, CvMemStorage* storage, + CvSeq** labels, CvCmpFunc is_equal, void* userdata ); + +/************ Internal sequence functions ************/ +CVAPI(void) cvChangeSeqBlock( void* reader, int direction ); +CVAPI(void) cvCreateSeqBlock( CvSeqWriter* writer ); + + +/** Creates a new set */ +CVAPI(CvSet*) cvCreateSet( int set_flags, int header_size, + int elem_size, CvMemStorage* storage ); + +/** Adds new element to the set and returns pointer to it */ +CVAPI(int) cvSetAdd( CvSet* set_header, CvSetElem* elem CV_DEFAULT(NULL), + CvSetElem** inserted_elem CV_DEFAULT(NULL) ); + +/** Fast variant of cvSetAdd */ +CV_INLINE CvSetElem* cvSetNew( CvSet* set_header ) +{ + CvSetElem* elem = set_header->free_elems; + if( elem ) + { + set_header->free_elems = elem->next_free; + elem->flags = elem->flags & CV_SET_ELEM_IDX_MASK; + set_header->active_count++; + } + else + cvSetAdd( set_header, NULL, &elem ); + return elem; +} + +/** Removes set element given its pointer */ +CV_INLINE void cvSetRemoveByPtr( CvSet* set_header, void* elem ) +{ + CvSetElem* _elem = (CvSetElem*)elem; + assert( _elem->flags >= 0 /*&& (elem->flags & CV_SET_ELEM_IDX_MASK) < set_header->total*/ ); + _elem->next_free = set_header->free_elems; + _elem->flags = (_elem->flags & CV_SET_ELEM_IDX_MASK) | CV_SET_ELEM_FREE_FLAG; + set_header->free_elems = _elem; + set_header->active_count--; +} + +/** Removes element from the set by its index */ +CVAPI(void) cvSetRemove( CvSet* set_header, int index ); + +/** Returns a set element by index. If the element doesn't belong to the set, + NULL is returned */ +CV_INLINE CvSetElem* cvGetSetElem( const CvSet* set_header, int idx ) +{ + CvSetElem* elem = (CvSetElem*)(void *)cvGetSeqElem( (CvSeq*)set_header, idx ); + return elem && CV_IS_SET_ELEM( elem ) ? elem : 0; +} + +/** Removes all the elements from the set */ +CVAPI(void) cvClearSet( CvSet* set_header ); + +/** Creates new graph */ +CVAPI(CvGraph*) cvCreateGraph( int graph_flags, int header_size, + int vtx_size, int edge_size, + CvMemStorage* storage ); + +/** Adds new vertex to the graph */ +CVAPI(int) cvGraphAddVtx( CvGraph* graph, const CvGraphVtx* vtx CV_DEFAULT(NULL), + CvGraphVtx** inserted_vtx CV_DEFAULT(NULL) ); + + +/** Removes vertex from the graph together with all incident edges */ +CVAPI(int) cvGraphRemoveVtx( CvGraph* graph, int index ); +CVAPI(int) cvGraphRemoveVtxByPtr( CvGraph* graph, CvGraphVtx* vtx ); + + +/** Link two vertices specified by indices or pointers if they + are not connected or return pointer to already existing edge + connecting the vertices. + Functions return 1 if a new edge was created, 0 otherwise */ +CVAPI(int) cvGraphAddEdge( CvGraph* graph, + int start_idx, int end_idx, + const CvGraphEdge* edge CV_DEFAULT(NULL), + CvGraphEdge** inserted_edge CV_DEFAULT(NULL) ); + +CVAPI(int) cvGraphAddEdgeByPtr( CvGraph* graph, + CvGraphVtx* start_vtx, CvGraphVtx* end_vtx, + const CvGraphEdge* edge CV_DEFAULT(NULL), + CvGraphEdge** inserted_edge CV_DEFAULT(NULL) ); + +/** Remove edge connecting two vertices */ +CVAPI(void) cvGraphRemoveEdge( CvGraph* graph, int start_idx, int end_idx ); +CVAPI(void) cvGraphRemoveEdgeByPtr( CvGraph* graph, CvGraphVtx* start_vtx, + CvGraphVtx* end_vtx ); + +/** Find edge connecting two vertices */ +CVAPI(CvGraphEdge*) cvFindGraphEdge( const CvGraph* graph, int start_idx, int end_idx ); +CVAPI(CvGraphEdge*) cvFindGraphEdgeByPtr( const CvGraph* graph, + const CvGraphVtx* start_vtx, + const CvGraphVtx* end_vtx ); +#define cvGraphFindEdge cvFindGraphEdge +#define cvGraphFindEdgeByPtr cvFindGraphEdgeByPtr + +/** Remove all vertices and edges from the graph */ +CVAPI(void) cvClearGraph( CvGraph* graph ); + + +/** Count number of edges incident to the vertex */ +CVAPI(int) cvGraphVtxDegree( const CvGraph* graph, int vtx_idx ); +CVAPI(int) cvGraphVtxDegreeByPtr( const CvGraph* graph, const CvGraphVtx* vtx ); + + +/** Retrieves graph vertex by given index */ +#define cvGetGraphVtx( graph, idx ) (CvGraphVtx*)cvGetSetElem((CvSet*)(graph), (idx)) + +/** Retrieves index of a graph vertex given its pointer */ +#define cvGraphVtxIdx( graph, vtx ) ((vtx)->flags & CV_SET_ELEM_IDX_MASK) + +/** Retrieves index of a graph edge given its pointer */ +#define cvGraphEdgeIdx( graph, edge ) ((edge)->flags & CV_SET_ELEM_IDX_MASK) + +#define cvGraphGetVtxCount( graph ) ((graph)->active_count) +#define cvGraphGetEdgeCount( graph ) ((graph)->edges->active_count) + +#define CV_GRAPH_VERTEX 1 +#define CV_GRAPH_TREE_EDGE 2 +#define CV_GRAPH_BACK_EDGE 4 +#define CV_GRAPH_FORWARD_EDGE 8 +#define CV_GRAPH_CROSS_EDGE 16 +#define CV_GRAPH_ANY_EDGE 30 +#define CV_GRAPH_NEW_TREE 32 +#define CV_GRAPH_BACKTRACKING 64 +#define CV_GRAPH_OVER -1 + +#define CV_GRAPH_ALL_ITEMS -1 + +/** flags for graph vertices and edges */ +#define CV_GRAPH_ITEM_VISITED_FLAG (1 << 30) +#define CV_IS_GRAPH_VERTEX_VISITED(vtx) \ + (((CvGraphVtx*)(vtx))->flags & CV_GRAPH_ITEM_VISITED_FLAG) +#define CV_IS_GRAPH_EDGE_VISITED(edge) \ + (((CvGraphEdge*)(edge))->flags & CV_GRAPH_ITEM_VISITED_FLAG) +#define CV_GRAPH_SEARCH_TREE_NODE_FLAG (1 << 29) +#define CV_GRAPH_FORWARD_EDGE_FLAG (1 << 28) + +typedef struct CvGraphScanner +{ + CvGraphVtx* vtx; /* current graph vertex (or current edge origin) */ + CvGraphVtx* dst; /* current graph edge destination vertex */ + CvGraphEdge* edge; /* current edge */ + + CvGraph* graph; /* the graph */ + CvSeq* stack; /* the graph vertex stack */ + int index; /* the lower bound of certainly visited vertices */ + int mask; /* event mask */ +} +CvGraphScanner; + +/** Creates new graph scanner. */ +CVAPI(CvGraphScanner*) cvCreateGraphScanner( CvGraph* graph, + CvGraphVtx* vtx CV_DEFAULT(NULL), + int mask CV_DEFAULT(CV_GRAPH_ALL_ITEMS)); + +/** Releases graph scanner. */ +CVAPI(void) cvReleaseGraphScanner( CvGraphScanner** scanner ); + +/** Get next graph element */ +CVAPI(int) cvNextGraphItem( CvGraphScanner* scanner ); + +/** Creates a copy of graph */ +CVAPI(CvGraph*) cvCloneGraph( const CvGraph* graph, CvMemStorage* storage ); + + +/** Does look-up transformation. Elements of the source array + (that should be 8uC1 or 8sC1) are used as indexes in lutarr 256-element table */ +CVAPI(void) cvLUT( const CvArr* src, CvArr* dst, const CvArr* lut ); + + +/******************* Iteration through the sequence tree *****************/ +typedef struct CvTreeNodeIterator +{ + const void* node; + int level; + int max_level; +} +CvTreeNodeIterator; + +CVAPI(void) cvInitTreeNodeIterator( CvTreeNodeIterator* tree_iterator, + const void* first, int max_level ); +CVAPI(void*) cvNextTreeNode( CvTreeNodeIterator* tree_iterator ); +CVAPI(void*) cvPrevTreeNode( CvTreeNodeIterator* tree_iterator ); + +/** Inserts sequence into tree with specified "parent" sequence. + If parent is equal to frame (e.g. the most external contour), + then added contour will have null pointer to parent. */ +CVAPI(void) cvInsertNodeIntoTree( void* node, void* parent, void* frame ); + +/** Removes contour from tree (together with the contour children). */ +CVAPI(void) cvRemoveNodeFromTree( void* node, void* frame ); + +/** Gathers pointers to all the sequences, + accessible from the `first`, to the single sequence */ +CVAPI(CvSeq*) cvTreeToNodeSeq( const void* first, int header_size, + CvMemStorage* storage ); + +/** The function implements the K-means algorithm for clustering an array of sample + vectors in a specified number of classes */ +#define CV_KMEANS_USE_INITIAL_LABELS 1 +CVAPI(int) cvKMeans2( const CvArr* samples, int cluster_count, CvArr* labels, + CvTermCriteria termcrit, int attempts CV_DEFAULT(1), + CvRNG* rng CV_DEFAULT(0), int flags CV_DEFAULT(0), + CvArr* _centers CV_DEFAULT(0), double* compactness CV_DEFAULT(0) ); + +/****************************************************************************************\ +* System functions * +\****************************************************************************************/ + +/** Loads optimized functions from IPP, MKL etc. or switches back to pure C code */ +CVAPI(int) cvUseOptimized( int on_off ); + +typedef IplImage* (CV_STDCALL* Cv_iplCreateImageHeader) + (int,int,int,char*,char*,int,int,int,int,int, + IplROI*,IplImage*,void*,IplTileInfo*); +typedef void (CV_STDCALL* Cv_iplAllocateImageData)(IplImage*,int,int); +typedef void (CV_STDCALL* Cv_iplDeallocate)(IplImage*,int); +typedef IplROI* (CV_STDCALL* Cv_iplCreateROI)(int,int,int,int,int); +typedef IplImage* (CV_STDCALL* Cv_iplCloneImage)(const IplImage*); + +/** @brief Makes OpenCV use IPL functions for allocating IplImage and IplROI structures. + +Normally, the function is not called directly. Instead, a simple macro +CV_TURN_ON_IPL_COMPATIBILITY() is used that calls cvSetIPLAllocators and passes there pointers +to IPL allocation functions. : +@code + ... + CV_TURN_ON_IPL_COMPATIBILITY() + ... +@endcode +@param create_header pointer to a function, creating IPL image header. +@param allocate_data pointer to a function, allocating IPL image data. +@param deallocate pointer to a function, deallocating IPL image. +@param create_roi pointer to a function, creating IPL image ROI (i.e. Region of Interest). +@param clone_image pointer to a function, cloning an IPL image. + */ +CVAPI(void) cvSetIPLAllocators( Cv_iplCreateImageHeader create_header, + Cv_iplAllocateImageData allocate_data, + Cv_iplDeallocate deallocate, + Cv_iplCreateROI create_roi, + Cv_iplCloneImage clone_image ); + +#define CV_TURN_ON_IPL_COMPATIBILITY() \ + cvSetIPLAllocators( iplCreateImageHeader, iplAllocateImage, \ + iplDeallocate, iplCreateROI, iplCloneImage ) + +/****************************************************************************************\ +* Data Persistence * +\****************************************************************************************/ + +#if 0 +/********************************** High-level functions ********************************/ + +/** @brief Opens file storage for reading or writing data. + +The function opens file storage for reading or writing data. In the latter case, a new file is +created or an existing file is rewritten. The type of the read or written file is determined by the +filename extension: .xml for XML, .yml or .yaml for YAML and .json for JSON. + +At the same time, it also supports adding parameters like "example.xml?base64". + +The function returns a pointer to the CvFileStorage structure. +If the file cannot be opened then the function returns NULL. +@param filename Name of the file associated with the storage +@param memstorage Memory storage used for temporary data and for +: storing dynamic structures, such as CvSeq or CvGraph . If it is NULL, a temporary memory + storage is created and used. +@param flags Can be one of the following: +> - **CV_STORAGE_READ** the storage is open for reading +> - **CV_STORAGE_WRITE** the storage is open for writing + (use **CV_STORAGE_WRITE | CV_STORAGE_WRITE_BASE64** to write rawdata in Base64) +@param encoding + */ +CVAPI(CvFileStorage*) cvOpenFileStorage( const char* filename, CvMemStorage* memstorage, + int flags, const char* encoding CV_DEFAULT(NULL) ); + +/** @brief Releases file storage. + +The function closes the file associated with the storage and releases all the temporary structures. +It must be called after all I/O operations with the storage are finished. +@param fs Double pointer to the released file storage + */ +CVAPI(void) cvReleaseFileStorage( CvFileStorage** fs ); + +/** returns attribute value or 0 (NULL) if there is no such attribute */ +CVAPI(const char*) cvAttrValue( const CvAttrList* attr, const char* attr_name ); + +/** @brief Starts writing a new structure. + +The function starts writing a compound structure (collection) that can be a sequence or a map. After +all the structure fields, which can be scalars or structures, are written, cvEndWriteStruct should +be called. The function can be used to group some objects or to implement the write function for a +some user object (see CvTypeInfo). +@param fs File storage +@param name Name of the written structure. The structure can be accessed by this name when the +storage is read. +@param struct_flags A combination one of the following values: +- **CV_NODE_SEQ** the written structure is a sequence (see discussion of CvFileStorage ), + that is, its elements do not have a name. +- **CV_NODE_MAP** the written structure is a map (see discussion of CvFileStorage ), that + is, all its elements have names. +One and only one of the two above flags must be specified +- **CV_NODE_FLOW** the optional flag that makes sense only for YAML streams. It means that + the structure is written as a flow (not as a block), which is more compact. It is + recommended to use this flag for structures or arrays whose elements are all scalars. +@param type_name Optional parameter - the object type name. In + case of XML it is written as a type_id attribute of the structure opening tag. In the case of + YAML it is written after a colon following the structure name (see the example in + CvFileStorage description). In case of JSON it is written as a name/value pair. + Mainly it is used with user objects. When the storage is read, the + encoded type name is used to determine the object type (see CvTypeInfo and cvFindType ). +@param attributes This parameter is not used in the current implementation + */ +CVAPI(void) cvStartWriteStruct( CvFileStorage* fs, const char* name, + int struct_flags, const char* type_name CV_DEFAULT(NULL), + CvAttrList attributes CV_DEFAULT(cvAttrList())); + +/** @brief Finishes writing to a file node collection. +@param fs File storage +@sa cvStartWriteStruct. + */ +CVAPI(void) cvEndWriteStruct( CvFileStorage* fs ); + +/** @brief Writes an integer value. + +The function writes a single integer value (with or without a name) to the file storage. +@param fs File storage +@param name Name of the written value. Should be NULL if and only if the parent structure is a +sequence. +@param value The written value + */ +CVAPI(void) cvWriteInt( CvFileStorage* fs, const char* name, int value ); + +/** @brief Writes a floating-point value. + +The function writes a single floating-point value (with or without a name) to file storage. Special +values are encoded as follows: NaN (Not A Number) as .NaN, infinity as +.Inf or -.Inf. + +The following example shows how to use the low-level writing functions to store custom structures, +such as termination criteria, without registering a new type. : +@code + void write_termcriteria( CvFileStorage* fs, const char* struct_name, + CvTermCriteria* termcrit ) + { + cvStartWriteStruct( fs, struct_name, CV_NODE_MAP, NULL, cvAttrList(0,0)); + cvWriteComment( fs, "termination criteria", 1 ); // just a description + if( termcrit->type & CV_TERMCRIT_ITER ) + cvWriteInteger( fs, "max_iterations", termcrit->max_iter ); + if( termcrit->type & CV_TERMCRIT_EPS ) + cvWriteReal( fs, "accuracy", termcrit->epsilon ); + cvEndWriteStruct( fs ); + } +@endcode +@param fs File storage +@param name Name of the written value. Should be NULL if and only if the parent structure is a +sequence. +@param value The written value +*/ +CVAPI(void) cvWriteReal( CvFileStorage* fs, const char* name, double value ); + +/** @brief Writes a text string. + +The function writes a text string to file storage. +@param fs File storage +@param name Name of the written string . Should be NULL if and only if the parent structure is a +sequence. +@param str The written text string +@param quote If non-zero, the written string is put in quotes, regardless of whether they are +required. Otherwise, if the flag is zero, quotes are used only when they are required (e.g. when +the string starts with a digit or contains spaces). + */ +CVAPI(void) cvWriteString( CvFileStorage* fs, const char* name, + const char* str, int quote CV_DEFAULT(0) ); + +/** @brief Writes a comment. + +The function writes a comment into file storage. The comments are skipped when the storage is read. +@param fs File storage +@param comment The written comment, single-line or multi-line +@param eol_comment If non-zero, the function tries to put the comment at the end of current line. +If the flag is zero, if the comment is multi-line, or if it does not fit at the end of the current +line, the comment starts a new line. + */ +CVAPI(void) cvWriteComment( CvFileStorage* fs, const char* comment, + int eol_comment ); + +/** @brief Writes an object to file storage. + +The function writes an object to file storage. First, the appropriate type info is found using +cvTypeOf. Then, the write method associated with the type info is called. + +Attributes are used to customize the writing procedure. The standard types support the following +attributes (all the dt attributes have the same format as in cvWriteRawData): + +-# CvSeq + - **header_dt** description of user fields of the sequence header that follow CvSeq, or + CvChain (if the sequence is a Freeman chain) or CvContour (if the sequence is a contour or + point sequence) + - **dt** description of the sequence elements. + - **recursive** if the attribute is present and is not equal to "0" or "false", the whole + tree of sequences (contours) is stored. +-# CvGraph + - **header_dt** description of user fields of the graph header that follows CvGraph; + - **vertex_dt** description of user fields of graph vertices + - **edge_dt** description of user fields of graph edges (note that the edge weight is + always written, so there is no need to specify it explicitly) + +Below is the code that creates the YAML file shown in the CvFileStorage description: +@code + #include "cxcore.h" + + int main( int argc, char** argv ) + { + CvMat* mat = cvCreateMat( 3, 3, CV_32F ); + CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_WRITE ); + + cvSetIdentity( mat ); + cvWrite( fs, "A", mat, cvAttrList(0,0) ); + + cvReleaseFileStorage( &fs ); + cvReleaseMat( &mat ); + return 0; + } +@endcode +@param fs File storage +@param name Name of the written object. Should be NULL if and only if the parent structure is a +sequence. +@param ptr Pointer to the object +@param attributes The attributes of the object. They are specific for each particular type (see +the discussion below). + */ +CVAPI(void) cvWrite( CvFileStorage* fs, const char* name, const void* ptr, + CvAttrList attributes CV_DEFAULT(cvAttrList())); + +/** @brief Starts the next stream. + +The function finishes the currently written stream and starts the next stream. In the case of XML +the file with multiple streams looks like this: +@code{.xml} + + + + + + + ... +@endcode +The YAML file will look like this: +@code{.yaml} + %YAML 1.0 + # stream #1 data + ... + --- + # stream #2 data +@endcode +This is useful for concatenating files or for resuming the writing process. +@param fs File storage + */ +CVAPI(void) cvStartNextStream( CvFileStorage* fs ); + +/** @brief Writes multiple numbers. + +The function writes an array, whose elements consist of single or multiple numbers. The function +call can be replaced with a loop containing a few cvWriteInt and cvWriteReal calls, but a single +call is more efficient. Note that because none of the elements have a name, they should be written +to a sequence rather than a map. +@param fs File storage +@param src Pointer to the written array +@param len Number of the array elements to write +@param dt Specification of each array element, see @ref format_spec "format specification" + */ +CVAPI(void) cvWriteRawData( CvFileStorage* fs, const void* src, + int len, const char* dt ); + +/** @brief Writes multiple numbers in Base64. + +If either CV_STORAGE_WRITE_BASE64 or cv::FileStorage::WRITE_BASE64 is used, +this function will be the same as cvWriteRawData. If neither, the main +difference is that it outputs a sequence in Base64 encoding rather than +in plain text. + +This function can only be used to write a sequence with a type "binary". + +@param fs File storage +@param src Pointer to the written array +@param len Number of the array elements to write +@param dt Specification of each array element, see @ref format_spec "format specification" +*/ +CVAPI(void) cvWriteRawDataBase64( CvFileStorage* fs, const void* src, + int len, const char* dt ); + +/** @brief Returns a unique pointer for a given name. + +The function returns a unique pointer for each particular file node name. This pointer can be then +passed to the cvGetFileNode function that is faster than cvGetFileNodeByName because it compares +text strings by comparing pointers rather than the strings' content. + +Consider the following example where an array of points is encoded as a sequence of 2-entry maps: +@code + points: + - { x: 10, y: 10 } + - { x: 20, y: 20 } + - { x: 30, y: 30 } + # ... +@endcode +Then, it is possible to get hashed "x" and "y" pointers to speed up decoding of the points. : +@code + #include "cxcore.h" + + int main( int argc, char** argv ) + { + CvFileStorage* fs = cvOpenFileStorage( "points.yml", 0, CV_STORAGE_READ ); + CvStringHashNode* x_key = cvGetHashedNode( fs, "x", -1, 1 ); + CvStringHashNode* y_key = cvGetHashedNode( fs, "y", -1, 1 ); + CvFileNode* points = cvGetFileNodeByName( fs, 0, "points" ); + + if( CV_NODE_IS_SEQ(points->tag) ) + { + CvSeq* seq = points->data.seq; + int i, total = seq->total; + CvSeqReader reader; + cvStartReadSeq( seq, &reader, 0 ); + for( i = 0; i < total; i++ ) + { + CvFileNode* pt = (CvFileNode*)reader.ptr; + #if 1 // faster variant + CvFileNode* xnode = cvGetFileNode( fs, pt, x_key, 0 ); + CvFileNode* ynode = cvGetFileNode( fs, pt, y_key, 0 ); + assert( xnode && CV_NODE_IS_INT(xnode->tag) && + ynode && CV_NODE_IS_INT(ynode->tag)); + int x = xnode->data.i; // or x = cvReadInt( xnode, 0 ); + int y = ynode->data.i; // or y = cvReadInt( ynode, 0 ); + #elif 1 // slower variant; does not use x_key & y_key + CvFileNode* xnode = cvGetFileNodeByName( fs, pt, "x" ); + CvFileNode* ynode = cvGetFileNodeByName( fs, pt, "y" ); + assert( xnode && CV_NODE_IS_INT(xnode->tag) && + ynode && CV_NODE_IS_INT(ynode->tag)); + int x = xnode->data.i; // or x = cvReadInt( xnode, 0 ); + int y = ynode->data.i; // or y = cvReadInt( ynode, 0 ); + #else // the slowest yet the easiest to use variant + int x = cvReadIntByName( fs, pt, "x", 0 ); + int y = cvReadIntByName( fs, pt, "y", 0 ); + #endif + CV_NEXT_SEQ_ELEM( seq->elem_size, reader ); + printf(" + } + } + cvReleaseFileStorage( &fs ); + return 0; + } +@endcode +Please note that whatever method of accessing a map you are using, it is still much slower than +using plain sequences; for example, in the above example, it is more efficient to encode the points +as pairs of integers in a single numeric sequence. +@param fs File storage +@param name Literal node name +@param len Length of the name (if it is known apriori), or -1 if it needs to be calculated +@param create_missing Flag that specifies, whether an absent key should be added into the hash table +*/ +CVAPI(CvStringHashNode*) cvGetHashedKey( CvFileStorage* fs, const char* name, + int len CV_DEFAULT(-1), + int create_missing CV_DEFAULT(0)); + +/** @brief Retrieves one of the top-level nodes of the file storage. + +The function returns one of the top-level file nodes. The top-level nodes do not have a name, they +correspond to the streams that are stored one after another in the file storage. If the index is out +of range, the function returns a NULL pointer, so all the top-level nodes can be iterated by +subsequent calls to the function with stream_index=0,1,..., until the NULL pointer is returned. +This function can be used as a base for recursive traversal of the file storage. +@param fs File storage +@param stream_index Zero-based index of the stream. See cvStartNextStream . In most cases, +there is only one stream in the file; however, there can be several. + */ +CVAPI(CvFileNode*) cvGetRootFileNode( const CvFileStorage* fs, + int stream_index CV_DEFAULT(0) ); + +/** @brief Finds a node in a map or file storage. + +The function finds a file node. It is a faster version of cvGetFileNodeByName (see +cvGetHashedKey discussion). Also, the function can insert a new node, if it is not in the map yet. +@param fs File storage +@param map The parent map. If it is NULL, the function searches a top-level node. If both map and +key are NULLs, the function returns the root file node - a map that contains top-level nodes. +@param key Unique pointer to the node name, retrieved with cvGetHashedKey +@param create_missing Flag that specifies whether an absent node should be added to the map + */ +CVAPI(CvFileNode*) cvGetFileNode( CvFileStorage* fs, CvFileNode* map, + const CvStringHashNode* key, + int create_missing CV_DEFAULT(0) ); + +/** @brief Finds a node in a map or file storage. + +The function finds a file node by name. The node is searched either in map or, if the pointer is +NULL, among the top-level file storage nodes. Using this function for maps and cvGetSeqElem (or +sequence reader) for sequences, it is possible to navigate through the file storage. To speed up +multiple queries for a certain key (e.g., in the case of an array of structures) one may use a +combination of cvGetHashedKey and cvGetFileNode. +@param fs File storage +@param map The parent map. If it is NULL, the function searches in all the top-level nodes +(streams), starting with the first one. +@param name The file node name + */ +CVAPI(CvFileNode*) cvGetFileNodeByName( const CvFileStorage* fs, + const CvFileNode* map, + const char* name ); + +/** @brief Retrieves an integer value from a file node. + +The function returns an integer that is represented by the file node. If the file node is NULL, the +default_value is returned (thus, it is convenient to call the function right after cvGetFileNode +without checking for a NULL pointer). If the file node has type CV_NODE_INT, then node-\>data.i is +returned. If the file node has type CV_NODE_REAL, then node-\>data.f is converted to an integer +and returned. Otherwise the error is reported. +@param node File node +@param default_value The value that is returned if node is NULL + */ +CV_INLINE int cvReadInt( const CvFileNode* node, int default_value CV_DEFAULT(0) ) +{ + return !node ? default_value : + CV_NODE_IS_INT(node->tag) ? node->data.i : + CV_NODE_IS_REAL(node->tag) ? cvRound(node->data.f) : 0x7fffffff; +} + +/** @brief Finds a file node and returns its value. + +The function is a simple superposition of cvGetFileNodeByName and cvReadInt. +@param fs File storage +@param map The parent map. If it is NULL, the function searches a top-level node. +@param name The node name +@param default_value The value that is returned if the file node is not found + */ +CV_INLINE int cvReadIntByName( const CvFileStorage* fs, const CvFileNode* map, + const char* name, int default_value CV_DEFAULT(0) ) +{ + return cvReadInt( cvGetFileNodeByName( fs, map, name ), default_value ); +} + +/** @brief Retrieves a floating-point value from a file node. + +The function returns a floating-point value that is represented by the file node. If the file node +is NULL, the default_value is returned (thus, it is convenient to call the function right after +cvGetFileNode without checking for a NULL pointer). If the file node has type CV_NODE_REAL , +then node-\>data.f is returned. If the file node has type CV_NODE_INT , then node-:math:\>data.f +is converted to floating-point and returned. Otherwise the result is not determined. +@param node File node +@param default_value The value that is returned if node is NULL + */ +CV_INLINE double cvReadReal( const CvFileNode* node, double default_value CV_DEFAULT(0.) ) +{ + return !node ? default_value : + CV_NODE_IS_INT(node->tag) ? (double)node->data.i : + CV_NODE_IS_REAL(node->tag) ? node->data.f : 1e300; +} + +/** @brief Finds a file node and returns its value. + +The function is a simple superposition of cvGetFileNodeByName and cvReadReal . +@param fs File storage +@param map The parent map. If it is NULL, the function searches a top-level node. +@param name The node name +@param default_value The value that is returned if the file node is not found + */ +CV_INLINE double cvReadRealByName( const CvFileStorage* fs, const CvFileNode* map, + const char* name, double default_value CV_DEFAULT(0.) ) +{ + return cvReadReal( cvGetFileNodeByName( fs, map, name ), default_value ); +} + +/** @brief Retrieves a text string from a file node. + +The function returns a text string that is represented by the file node. If the file node is NULL, +the default_value is returned (thus, it is convenient to call the function right after +cvGetFileNode without checking for a NULL pointer). If the file node has type CV_NODE_STR , then +node-:math:\>data.str.ptr is returned. Otherwise the result is not determined. +@param node File node +@param default_value The value that is returned if node is NULL + */ +CV_INLINE const char* cvReadString( const CvFileNode* node, + const char* default_value CV_DEFAULT(NULL) ) +{ + return !node ? default_value : CV_NODE_IS_STRING(node->tag) ? node->data.str.ptr : 0; +} + +/** @brief Finds a file node by its name and returns its value. + +The function is a simple superposition of cvGetFileNodeByName and cvReadString . +@param fs File storage +@param map The parent map. If it is NULL, the function searches a top-level node. +@param name The node name +@param default_value The value that is returned if the file node is not found + */ +CV_INLINE const char* cvReadStringByName( const CvFileStorage* fs, const CvFileNode* map, + const char* name, const char* default_value CV_DEFAULT(NULL) ) +{ + return cvReadString( cvGetFileNodeByName( fs, map, name ), default_value ); +} + + +/** @brief Decodes an object and returns a pointer to it. + +The function decodes a user object (creates an object in a native representation from the file +storage subtree) and returns it. The object to be decoded must be an instance of a registered type +that supports the read method (see CvTypeInfo). The type of the object is determined by the type +name that is encoded in the file. If the object is a dynamic structure, it is created either in +memory storage and passed to cvOpenFileStorage or, if a NULL pointer was passed, in temporary +memory storage, which is released when cvReleaseFileStorage is called. Otherwise, if the object is +not a dynamic structure, it is created in a heap and should be released with a specialized function +or by using the generic cvRelease. +@param fs File storage +@param node The root object node +@param attributes Unused parameter + */ +CVAPI(void*) cvRead( CvFileStorage* fs, CvFileNode* node, + CvAttrList* attributes CV_DEFAULT(NULL)); + +/** @brief Finds an object by name and decodes it. + +The function is a simple superposition of cvGetFileNodeByName and cvRead. +@param fs File storage +@param map The parent map. If it is NULL, the function searches a top-level node. +@param name The node name +@param attributes Unused parameter + */ +CV_INLINE void* cvReadByName( CvFileStorage* fs, const CvFileNode* map, + const char* name, CvAttrList* attributes CV_DEFAULT(NULL) ) +{ + return cvRead( fs, cvGetFileNodeByName( fs, map, name ), attributes ); +} + + +/** @brief Initializes the file node sequence reader. + +The function initializes the sequence reader to read data from a file node. The initialized reader +can be then passed to cvReadRawDataSlice. +@param fs File storage +@param src The file node (a sequence) to read numbers from +@param reader Pointer to the sequence reader + */ +CVAPI(void) cvStartReadRawData( const CvFileStorage* fs, const CvFileNode* src, + CvSeqReader* reader ); + +/** @brief Initializes file node sequence reader. + +The function reads one or more elements from the file node, representing a sequence, to a +user-specified array. The total number of read sequence elements is a product of total and the +number of components in each array element. For example, if dt=2if, the function will read total\*3 +sequence elements. As with any sequence, some parts of the file node sequence can be skipped or read +repeatedly by repositioning the reader using cvSetSeqReaderPos. +@param fs File storage +@param reader The sequence reader. Initialize it with cvStartReadRawData . +@param count The number of elements to read +@param dst Pointer to the destination array +@param dt Specification of each array element. It has the same format as in cvWriteRawData . + */ +CVAPI(void) cvReadRawDataSlice( const CvFileStorage* fs, CvSeqReader* reader, + int count, void* dst, const char* dt ); + +/** @brief Reads multiple numbers. + +The function reads elements from a file node that represents a sequence of scalars. +@param fs File storage +@param src The file node (a sequence) to read numbers from +@param dst Pointer to the destination array +@param dt Specification of each array element. It has the same format as in cvWriteRawData . + */ +CVAPI(void) cvReadRawData( const CvFileStorage* fs, const CvFileNode* src, + void* dst, const char* dt ); + +/** @brief Writes a file node to another file storage. + +The function writes a copy of a file node to file storage. Possible applications of the function are +merging several file storages into one and conversion between XML, YAML and JSON formats. +@param fs Destination file storage +@param new_node_name New name of the file node in the destination file storage. To keep the +existing name, use cvcvGetFileNodeName +@param node The written node +@param embed If the written node is a collection and this parameter is not zero, no extra level of +hierarchy is created. Instead, all the elements of node are written into the currently written +structure. Of course, map elements can only be embedded into another map, and sequence elements +can only be embedded into another sequence. + */ +CVAPI(void) cvWriteFileNode( CvFileStorage* fs, const char* new_node_name, + const CvFileNode* node, int embed ); + +/** @brief Returns the name of a file node. + +The function returns the name of a file node or NULL, if the file node does not have a name or if +node is NULL. +@param node File node + */ +CVAPI(const char*) cvGetFileNodeName( const CvFileNode* node ); + +/*********************************** Adding own types ***********************************/ + +/** @brief Registers a new type. + +The function registers a new type, which is described by info . The function creates a copy of the +structure, so the user should delete it after calling the function. +@param info Type info structure + */ +CVAPI(void) cvRegisterType( const CvTypeInfo* info ); + +/** @brief Unregisters the type. + +The function unregisters a type with a specified name. If the name is unknown, it is possible to +locate the type info by an instance of the type using cvTypeOf or by iterating the type list, +starting from cvFirstType, and then calling cvUnregisterType(info-\>typeName). +@param type_name Name of an unregistered type + */ +CVAPI(void) cvUnregisterType( const char* type_name ); + +/** @brief Returns the beginning of a type list. + +The function returns the first type in the list of registered types. Navigation through the list can +be done via the prev and next fields of the CvTypeInfo structure. + */ +CVAPI(CvTypeInfo*) cvFirstType(void); + +/** @brief Finds a type by its name. + +The function finds a registered type by its name. It returns NULL if there is no type with the +specified name. +@param type_name Type name + */ +CVAPI(CvTypeInfo*) cvFindType( const char* type_name ); + +/** @brief Returns the type of an object. + +The function finds the type of a given object. It iterates through the list of registered types and +calls the is_instance function/method for every type info structure with that object until one of +them returns non-zero or until the whole list has been traversed. In the latter case, the function +returns NULL. +@param struct_ptr The object pointer + */ +CVAPI(CvTypeInfo*) cvTypeOf( const void* struct_ptr ); + +#endif + +/** @brief Releases an object. + + The function finds the type of a given object and calls release with the double pointer. + @param struct_ptr Double pointer to the object + */ +CVAPI(void) cvRelease( void** struct_ptr ); + +/** @brief Makes a clone of an object. + +The function finds the type of a given object and calls clone with the passed object. Of course, if +you know the object type, for example, struct_ptr is CvMat\*, it is faster to call the specific +function, like cvCloneMat. +@param struct_ptr The object to clone + */ +CVAPI(void*) cvClone( const void* struct_ptr ); + +/*********************************** Measuring Execution Time ***************************/ + +/** helper functions for RNG initialization and accurate time measurement: + uses internal clock counter on x86 */ +CVAPI(int64) cvGetTickCount( void ); +CVAPI(double) cvGetTickFrequency( void ); + +/*********************************** CPU capabilities ***********************************/ + +CVAPI(int) cvCheckHardwareSupport(int feature); + +/*********************************** Multi-Threading ************************************/ + +/** retrieve/set the number of threads used in OpenMP implementations */ +CVAPI(int) cvGetNumThreads( void ); +CVAPI(void) cvSetNumThreads( int threads CV_DEFAULT(0) ); +/** get index of the thread being executed */ +CVAPI(int) cvGetThreadNum( void ); + + +/********************************** Error Handling **************************************/ + +/** Get current OpenCV error status */ +CVAPI(int) cvGetErrStatus( void ); + +/** Sets error status silently */ +CVAPI(void) cvSetErrStatus( int status ); + +#define CV_ErrModeLeaf 0 /* Print error and exit program */ +#define CV_ErrModeParent 1 /* Print error and continue */ +#define CV_ErrModeSilent 2 /* Don't print and continue */ + +/** Retrieves current error processing mode */ +CVAPI(int) cvGetErrMode( void ); + +/** Sets error processing mode, returns previously used mode */ +CVAPI(int) cvSetErrMode( int mode ); + +/** Sets error status and performs some additional actions (displaying message box, + writing message to stderr, terminating application etc.) + depending on the current error mode */ +CVAPI(void) cvError( int status, const char* func_name, + const char* err_msg, const char* file_name, int line ); + +/** Retrieves textual description of the error given its code */ +CVAPI(const char*) cvErrorStr( int status ); + +/** Retrieves detailed information about the last error occurred */ +CVAPI(int) cvGetErrInfo( const char** errcode_desc, const char** description, + const char** filename, int* line ); + +/** Maps IPP error codes to the counterparts from OpenCV */ +CVAPI(int) cvErrorFromIppStatus( int ipp_status ); + +typedef int (CV_CDECL *CvErrorCallback)( int status, const char* func_name, + const char* err_msg, const char* file_name, int line, void* userdata ); + +/** Assigns a new error-handling function */ +CVAPI(CvErrorCallback) cvRedirectError( CvErrorCallback error_handler, + void* userdata CV_DEFAULT(NULL), + void** prev_userdata CV_DEFAULT(NULL) ); + +/** Output nothing */ +CVAPI(int) cvNulDevReport( int status, const char* func_name, const char* err_msg, + const char* file_name, int line, void* userdata ); + +/** Output to console(fprintf(stderr,...)) */ +CVAPI(int) cvStdErrReport( int status, const char* func_name, const char* err_msg, + const char* file_name, int line, void* userdata ); + +/** Output to MessageBox(WIN32) */ +CVAPI(int) cvGuiBoxReport( int status, const char* func_name, const char* err_msg, + const char* file_name, int line, void* userdata ); + +#define OPENCV_ERROR(status,func,context) \ +cvError((status),(func),(context),__FILE__,__LINE__) + +#define OPENCV_ASSERT(expr,func,context) \ +{if (! (expr)) \ +{OPENCV_ERROR(CV_StsInternal,(func),(context));}} + +#define OPENCV_CALL( Func ) \ +{ \ +Func; \ +} + + +/** CV_FUNCNAME macro defines icvFuncName constant which is used by CV_ERROR macro */ +#ifdef CV_NO_FUNC_NAMES +#define CV_FUNCNAME( Name ) +#define cvFuncName "" +#else +#define CV_FUNCNAME( Name ) \ +static char cvFuncName[] = Name +#endif + + +/** + CV_ERROR macro unconditionally raises error with passed code and message. + After raising error, control will be transferred to the exit label. + */ +#define CV_ERROR( Code, Msg ) \ +{ \ + cvError( (Code), cvFuncName, Msg, __FILE__, __LINE__ ); \ + __CV_EXIT__; \ +} + +/** + CV_CHECK macro checks error status after CV (or IPL) + function call. If error detected, control will be transferred to the exit + label. + */ +#define CV_CHECK() \ +{ \ + if( cvGetErrStatus() < 0 ) \ + CV_ERROR( CV_StsBackTrace, "Inner function failed." ); \ +} + + +/** + CV_CALL macro calls CV (or IPL) function, checks error status and + signals a error if the function failed. Useful in "parent node" + error processing mode + */ +#define CV_CALL( Func ) \ +{ \ + Func; \ + CV_CHECK(); \ +} + + +/** Runtime assertion macro */ +#define CV_ASSERT( Condition ) \ +{ \ + if( !(Condition) ) \ + CV_ERROR( CV_StsInternal, "Assertion: " #Condition " failed" ); \ +} + +#define __CV_BEGIN__ { +#define __CV_END__ goto exit; exit: ; } +#define __CV_EXIT__ goto exit + +/** @} core_c */ + +#ifdef __cplusplus +} // extern "C" +#endif + +#ifdef __cplusplus + +#include "opencv2/core/utility.hpp" + +namespace cv +{ + +//! @addtogroup core_c_glue +//! @{ + +/////////////////////////////////////////// glue /////////////////////////////////////////// + +//! converts array (CvMat or IplImage) to cv::Mat +CV_EXPORTS Mat cvarrToMat(const CvArr* arr, bool copyData=false, + bool allowND=true, int coiMode=0, + AutoBuffer* buf=0); + +static inline Mat cvarrToMatND(const CvArr* arr, bool copyData=false, int coiMode=0) +{ + return cvarrToMat(arr, copyData, true, coiMode); +} + + +//! extracts Channel of Interest from CvMat or IplImage and makes cv::Mat out of it. +CV_EXPORTS void extractImageCOI(const CvArr* arr, OutputArray coiimg, int coi=-1); +//! inserts single-channel cv::Mat into a multi-channel CvMat or IplImage +CV_EXPORTS void insertImageCOI(InputArray coiimg, CvArr* arr, int coi=-1); + + + +////// specialized implementations of DefaultDeleter::operator() for classic OpenCV types ////// + +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvMat* obj) const; }; +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(IplImage* obj) const; }; +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvMatND* obj) const; }; +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvSparseMat* obj) const; }; +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvMemStorage* obj) const; }; + +////////////// convenient wrappers for operating old-style dynamic structures ////////////// + +template class SeqIterator; + +typedef Ptr MemStorage; + +/*! + Template Sequence Class derived from CvSeq + + The class provides more convenient access to sequence elements, + STL-style operations and iterators. + + \note The class is targeted for simple data types, + i.e. no constructors or destructors + are called for the sequence elements. +*/ +template class Seq +{ +public: + typedef SeqIterator<_Tp> iterator; + typedef SeqIterator<_Tp> const_iterator; + + //! the default constructor + Seq(); + //! the constructor for wrapping CvSeq structure. The real element type in CvSeq should match _Tp. + Seq(const CvSeq* seq); + //! creates the empty sequence that resides in the specified storage + Seq(MemStorage& storage, int headerSize = sizeof(CvSeq)); + //! returns read-write reference to the specified element + _Tp& operator [](int idx); + //! returns read-only reference to the specified element + const _Tp& operator[](int idx) const; + //! returns iterator pointing to the beginning of the sequence + SeqIterator<_Tp> begin() const; + //! returns iterator pointing to the element following the last sequence element + SeqIterator<_Tp> end() const; + //! returns the number of elements in the sequence + size_t size() const; + //! returns the type of sequence elements (CV_8UC1 ... CV_64FC(CV_CN_MAX) ...) + int type() const; + //! returns the depth of sequence elements (CV_8U ... CV_64F) + int depth() const; + //! returns the number of channels in each sequence element + int channels() const; + //! returns the size of each sequence element + size_t elemSize() const; + //! returns index of the specified sequence element + size_t index(const _Tp& elem) const; + //! appends the specified element to the end of the sequence + void push_back(const _Tp& elem); + //! appends the specified element to the front of the sequence + void push_front(const _Tp& elem); + //! appends zero or more elements to the end of the sequence + void push_back(const _Tp* elems, size_t count); + //! appends zero or more elements to the front of the sequence + void push_front(const _Tp* elems, size_t count); + //! inserts the specified element to the specified position + void insert(int idx, const _Tp& elem); + //! inserts zero or more elements to the specified position + void insert(int idx, const _Tp* elems, size_t count); + //! removes element at the specified position + void remove(int idx); + //! removes the specified subsequence + void remove(const Range& r); + + //! returns reference to the first sequence element + _Tp& front(); + //! returns read-only reference to the first sequence element + const _Tp& front() const; + //! returns reference to the last sequence element + _Tp& back(); + //! returns read-only reference to the last sequence element + const _Tp& back() const; + //! returns true iff the sequence contains no elements + bool empty() const; + + //! removes all the elements from the sequence + void clear(); + //! removes the first element from the sequence + void pop_front(); + //! removes the last element from the sequence + void pop_back(); + //! removes zero or more elements from the beginning of the sequence + void pop_front(_Tp* elems, size_t count); + //! removes zero or more elements from the end of the sequence + void pop_back(_Tp* elems, size_t count); + + //! copies the whole sequence or the sequence slice to the specified vector + void copyTo(std::vector<_Tp>& vec, const Range& range=Range::all()) const; + //! returns the vector containing all the sequence elements + operator std::vector<_Tp>() const; + + CvSeq* seq; +}; + + +/*! + STL-style Sequence Iterator inherited from the CvSeqReader structure +*/ +template class SeqIterator : public CvSeqReader +{ +public: + //! the default constructor + SeqIterator(); + //! the constructor setting the iterator to the beginning or to the end of the sequence + SeqIterator(const Seq<_Tp>& seq, bool seekEnd=false); + //! positions the iterator within the sequence + void seek(size_t pos); + //! reports the current iterator position + size_t tell() const; + //! returns reference to the current sequence element + _Tp& operator *(); + //! returns read-only reference to the current sequence element + const _Tp& operator *() const; + //! moves iterator to the next sequence element + SeqIterator& operator ++(); + //! moves iterator to the next sequence element + SeqIterator operator ++(int) const; + //! moves iterator to the previous sequence element + SeqIterator& operator --(); + //! moves iterator to the previous sequence element + SeqIterator operator --(int) const; + + //! moves iterator forward by the specified offset (possibly negative) + SeqIterator& operator +=(int); + //! moves iterator backward by the specified offset (possibly negative) + SeqIterator& operator -=(int); + + // this is index of the current element module seq->total*2 + // (to distinguish between 0 and seq->total) + int index; +}; + + + +// bridge C++ => C Seq API +CV_EXPORTS schar* seqPush( CvSeq* seq, const void* element=0); +CV_EXPORTS schar* seqPushFront( CvSeq* seq, const void* element=0); +CV_EXPORTS void seqPop( CvSeq* seq, void* element=0); +CV_EXPORTS void seqPopFront( CvSeq* seq, void* element=0); +CV_EXPORTS void seqPopMulti( CvSeq* seq, void* elements, + int count, int in_front=0 ); +CV_EXPORTS void seqRemove( CvSeq* seq, int index ); +CV_EXPORTS void clearSeq( CvSeq* seq ); +CV_EXPORTS schar* getSeqElem( const CvSeq* seq, int index ); +CV_EXPORTS void seqRemoveSlice( CvSeq* seq, CvSlice slice ); +CV_EXPORTS void seqInsertSlice( CvSeq* seq, int before_index, const CvArr* from_arr ); + +template inline Seq<_Tp>::Seq() : seq(0) {} +template inline Seq<_Tp>::Seq( const CvSeq* _seq ) : seq((CvSeq*)_seq) +{ + CV_Assert(!_seq || _seq->elem_size == sizeof(_Tp)); +} + +template inline Seq<_Tp>::Seq( MemStorage& storage, + int headerSize ) +{ + CV_Assert(headerSize >= (int)sizeof(CvSeq)); + seq = cvCreateSeq(DataType<_Tp>::type, headerSize, sizeof(_Tp), storage); +} + +template inline _Tp& Seq<_Tp>::operator [](int idx) +{ return *(_Tp*)getSeqElem(seq, idx); } + +template inline const _Tp& Seq<_Tp>::operator [](int idx) const +{ return *(_Tp*)getSeqElem(seq, idx); } + +template inline SeqIterator<_Tp> Seq<_Tp>::begin() const +{ return SeqIterator<_Tp>(*this); } + +template inline SeqIterator<_Tp> Seq<_Tp>::end() const +{ return SeqIterator<_Tp>(*this, true); } + +template inline size_t Seq<_Tp>::size() const +{ return seq ? seq->total : 0; } + +template inline int Seq<_Tp>::type() const +{ return seq ? CV_MAT_TYPE(seq->flags) : 0; } + +template inline int Seq<_Tp>::depth() const +{ return seq ? CV_MAT_DEPTH(seq->flags) : 0; } + +template inline int Seq<_Tp>::channels() const +{ return seq ? CV_MAT_CN(seq->flags) : 0; } + +template inline size_t Seq<_Tp>::elemSize() const +{ return seq ? seq->elem_size : 0; } + +template inline size_t Seq<_Tp>::index(const _Tp& elem) const +{ return cvSeqElemIdx(seq, &elem); } + +template inline void Seq<_Tp>::push_back(const _Tp& elem) +{ cvSeqPush(seq, &elem); } + +template inline void Seq<_Tp>::push_front(const _Tp& elem) +{ cvSeqPushFront(seq, &elem); } + +template inline void Seq<_Tp>::push_back(const _Tp* elem, size_t count) +{ cvSeqPushMulti(seq, elem, (int)count, 0); } + +template inline void Seq<_Tp>::push_front(const _Tp* elem, size_t count) +{ cvSeqPushMulti(seq, elem, (int)count, 1); } + +template inline _Tp& Seq<_Tp>::back() +{ return *(_Tp*)getSeqElem(seq, -1); } + +template inline const _Tp& Seq<_Tp>::back() const +{ return *(const _Tp*)getSeqElem(seq, -1); } + +template inline _Tp& Seq<_Tp>::front() +{ return *(_Tp*)getSeqElem(seq, 0); } + +template inline const _Tp& Seq<_Tp>::front() const +{ return *(const _Tp*)getSeqElem(seq, 0); } + +template inline bool Seq<_Tp>::empty() const +{ return !seq || seq->total == 0; } + +template inline void Seq<_Tp>::clear() +{ if(seq) clearSeq(seq); } + +template inline void Seq<_Tp>::pop_back() +{ seqPop(seq); } + +template inline void Seq<_Tp>::pop_front() +{ seqPopFront(seq); } + +template inline void Seq<_Tp>::pop_back(_Tp* elem, size_t count) +{ seqPopMulti(seq, elem, (int)count, 0); } + +template inline void Seq<_Tp>::pop_front(_Tp* elem, size_t count) +{ seqPopMulti(seq, elem, (int)count, 1); } + +template inline void Seq<_Tp>::insert(int idx, const _Tp& elem) +{ seqInsert(seq, idx, &elem); } + +template inline void Seq<_Tp>::insert(int idx, const _Tp* elems, size_t count) +{ + CvMat m = cvMat(1, count, DataType<_Tp>::type, elems); + seqInsertSlice(seq, idx, &m); +} + +template inline void Seq<_Tp>::remove(int idx) +{ seqRemove(seq, idx); } + +template inline void Seq<_Tp>::remove(const Range& r) +{ seqRemoveSlice(seq, cvSlice(r.start, r.end)); } + +template inline void Seq<_Tp>::copyTo(std::vector<_Tp>& vec, const Range& range) const +{ + size_t len = !seq ? 0 : range == Range::all() ? seq->total : range.end - range.start; + vec.resize(len); + if( seq && len ) + cvCvtSeqToArray(seq, &vec[0], cvSlice(range)); +} + +template inline Seq<_Tp>::operator std::vector<_Tp>() const +{ + std::vector<_Tp> vec; + copyTo(vec); + return vec; +} + +template inline SeqIterator<_Tp>::SeqIterator() +{ memset(this, 0, sizeof(*this)); } + +template inline SeqIterator<_Tp>::SeqIterator(const Seq<_Tp>& _seq, bool seekEnd) +{ + cvStartReadSeq(_seq.seq, this); + index = seekEnd ? _seq.seq->total : 0; +} + +template inline void SeqIterator<_Tp>::seek(size_t pos) +{ + cvSetSeqReaderPos(this, (int)pos, false); + index = pos; +} + +template inline size_t SeqIterator<_Tp>::tell() const +{ return index; } + +template inline _Tp& SeqIterator<_Tp>::operator *() +{ return *(_Tp*)ptr; } + +template inline const _Tp& SeqIterator<_Tp>::operator *() const +{ return *(const _Tp*)ptr; } + +template inline SeqIterator<_Tp>& SeqIterator<_Tp>::operator ++() +{ + CV_NEXT_SEQ_ELEM(sizeof(_Tp), *this); + if( ++index >= seq->total*2 ) + index = 0; + return *this; +} + +template inline SeqIterator<_Tp> SeqIterator<_Tp>::operator ++(int) const +{ + SeqIterator<_Tp> it = *this; + ++*this; + return it; +} + +template inline SeqIterator<_Tp>& SeqIterator<_Tp>::operator --() +{ + CV_PREV_SEQ_ELEM(sizeof(_Tp), *this); + if( --index < 0 ) + index = seq->total*2-1; + return *this; +} + +template inline SeqIterator<_Tp> SeqIterator<_Tp>::operator --(int) const +{ + SeqIterator<_Tp> it = *this; + --*this; + return it; +} + +template inline SeqIterator<_Tp>& SeqIterator<_Tp>::operator +=(int delta) +{ + cvSetSeqReaderPos(this, delta, 1); + index += delta; + int n = seq->total*2; + if( index < 0 ) + index += n; + if( index >= n ) + index -= n; + return *this; +} + +template inline SeqIterator<_Tp>& SeqIterator<_Tp>::operator -=(int delta) +{ + return (*this += -delta); +} + +template inline ptrdiff_t operator - (const SeqIterator<_Tp>& a, + const SeqIterator<_Tp>& b) +{ + ptrdiff_t delta = a.index - b.index, n = a.seq->total; + if( delta > n || delta < -n ) + delta += delta < 0 ? n : -n; + return delta; +} + +template inline bool operator == (const SeqIterator<_Tp>& a, + const SeqIterator<_Tp>& b) +{ + return a.seq == b.seq && a.index == b.index; +} + +template inline bool operator != (const SeqIterator<_Tp>& a, + const SeqIterator<_Tp>& b) +{ + return !(a == b); +} + +//! @} + +} // cv + +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda.hpp new file mode 100644 index 0000000..9d210ed --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda.hpp @@ -0,0 +1,1337 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CUDA_HPP +#define OPENCV_CORE_CUDA_HPP + +#ifndef __cplusplus +# error cuda.hpp header must be compiled as C++ +#endif + +#include "opencv2/core.hpp" +#include "opencv2/core/cuda_types.hpp" + +/** + @defgroup cuda CUDA-accelerated Computer Vision + @{ + @defgroup cudacore Core part + @{ + @defgroup cudacore_init Initialization and Information + @defgroup cudacore_struct Data Structures + @} + @} + */ + +namespace cv { namespace cuda { + +//! @addtogroup cudacore_struct +//! @{ + +//=================================================================================== +// GpuMat +//=================================================================================== + +/** @brief Base storage class for GPU memory with reference counting. + +Its interface matches the Mat interface with the following limitations: + +- no arbitrary dimensions support (only 2D) +- no functions that return references to their data (because references on GPU are not valid for + CPU) +- no expression templates technique support + +Beware that the latter limitation may lead to overloaded matrix operators that cause memory +allocations. The GpuMat class is convertible to cuda::PtrStepSz and cuda::PtrStep so it can be +passed directly to the kernel. + +@note In contrast with Mat, in most cases GpuMat::isContinuous() == false . This means that rows are +aligned to a size depending on the hardware. Single-row GpuMat is always a continuous matrix. + +@note You are not recommended to leave static or global GpuMat variables allocated, that is, to rely +on its destructor. The destruction order of such variables and CUDA context is undefined. GPU memory +release function returns error if the CUDA context has been destroyed before. + +Some member functions are described as a "Blocking Call" while some are described as a +"Non-Blocking Call". Blocking functions are synchronous to host. It is guaranteed that the GPU +operation is finished when the function returns. However, non-blocking functions are asynchronous to +host. Those functions may return even if the GPU operation is not finished. + +Compared to their blocking counterpart, non-blocking functions accept Stream as an additional +argument. If a non-default stream is passed, the GPU operation may overlap with operations in other +streams. + +@sa Mat + */ +class CV_EXPORTS_W GpuMat +{ +public: + class CV_EXPORTS_W Allocator + { + public: + virtual ~Allocator() {} + + // allocator must fill data, step and refcount fields + virtual bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize) = 0; + virtual void free(GpuMat* mat) = 0; + }; + + //! default allocator + CV_WRAP static GpuMat::Allocator* defaultAllocator(); + CV_WRAP static void setDefaultAllocator(GpuMat::Allocator* allocator); + + //! default constructor + CV_WRAP explicit GpuMat(GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + + //! constructs GpuMat of the specified size and type + CV_WRAP GpuMat(int rows, int cols, int type, GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + CV_WRAP GpuMat(Size size, int type, GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + + //! constructs GpuMat and fills it with the specified value _s + CV_WRAP GpuMat(int rows, int cols, int type, Scalar s, GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + CV_WRAP GpuMat(Size size, int type, Scalar s, GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + + //! copy constructor + CV_WRAP GpuMat(const GpuMat& m); + + //! constructor for GpuMat headers pointing to user-allocated data + GpuMat(int rows, int cols, int type, void* data, size_t step = Mat::AUTO_STEP); + GpuMat(Size size, int type, void* data, size_t step = Mat::AUTO_STEP); + + //! creates a GpuMat header for a part of the bigger matrix + CV_WRAP GpuMat(const GpuMat& m, Range rowRange, Range colRange); + CV_WRAP GpuMat(const GpuMat& m, Rect roi); + + //! builds GpuMat from host memory (Blocking call) + CV_WRAP explicit GpuMat(InputArray arr, GpuMat::Allocator* allocator = GpuMat::defaultAllocator()); + + //! destructor - calls release() + ~GpuMat(); + + //! assignment operators + GpuMat& operator =(const GpuMat& m); + + //! allocates new GpuMat data unless the GpuMat already has specified size and type + CV_WRAP void create(int rows, int cols, int type); + CV_WRAP void create(Size size, int type); + + //! decreases reference counter, deallocate the data when reference counter reaches 0 + CV_WRAP void release(); + + //! swaps with other smart pointer + CV_WRAP void swap(GpuMat& mat); + + /** @brief Performs data upload to GpuMat (Blocking call) + + This function copies data from host memory to device memory. As being a blocking call, it is + guaranteed that the copy operation is finished when this function returns. + */ + CV_WRAP void upload(InputArray arr); + + /** @brief Performs data upload to GpuMat (Non-Blocking call) + + This function copies data from host memory to device memory. As being a non-blocking call, this + function may return even if the copy operation is not finished. + + The copy operation may be overlapped with operations in other non-default streams if \p stream is + not the default stream and \p dst is HostMem allocated with HostMem::PAGE_LOCKED option. + */ + CV_WRAP void upload(InputArray arr, Stream& stream); + + /** @brief Performs data download from GpuMat (Blocking call) + + This function copies data from device memory to host memory. As being a blocking call, it is + guaranteed that the copy operation is finished when this function returns. + */ + CV_WRAP void download(OutputArray dst) const; + + /** @brief Performs data download from GpuMat (Non-Blocking call) + + This function copies data from device memory to host memory. As being a non-blocking call, this + function may return even if the copy operation is not finished. + + The copy operation may be overlapped with operations in other non-default streams if \p stream is + not the default stream and \p dst is HostMem allocated with HostMem::PAGE_LOCKED option. + */ + CV_WRAP void download(OutputArray dst, Stream& stream) const; + + //! returns deep copy of the GpuMat, i.e. the data is copied + CV_WRAP GpuMat clone() const; + + //! copies the GpuMat content to device memory (Blocking call) + void copyTo(OutputArray dst) const; + //! bindings overload which copies the GpuMat content to device memory (Blocking call) + CV_WRAP void copyTo(CV_OUT GpuMat& dst) const { + copyTo(static_cast(dst)); + } + + //! copies the GpuMat content to device memory (Non-Blocking call) + void copyTo(OutputArray dst, Stream& stream) const; + //! bindings overload which copies the GpuMat content to device memory (Non-Blocking call) + CV_WRAP void copyTo(CV_OUT GpuMat& dst, Stream& stream) const { + copyTo(static_cast(dst), stream); + } + + //! copies those GpuMat elements to "m" that are marked with non-zero mask elements (Blocking call) + void copyTo(OutputArray dst, InputArray mask) const; + //! bindings overload which copies those GpuMat elements to "m" that are marked with non-zero mask elements (Blocking call) + CV_WRAP void copyTo(CV_OUT GpuMat& dst, GpuMat& mask) const { + copyTo(static_cast(dst), static_cast(mask)); + } + + //! copies those GpuMat elements to "m" that are marked with non-zero mask elements (Non-Blocking call) + void copyTo(OutputArray dst, InputArray mask, Stream& stream) const; + //! bindings overload which copies those GpuMat elements to "m" that are marked with non-zero mask elements (Non-Blocking call) + CV_WRAP void copyTo(CV_OUT GpuMat& dst, GpuMat& mask, Stream& stream) const { + copyTo(static_cast(dst), static_cast(mask), stream); + } + + //! sets some of the GpuMat elements to s (Blocking call) + CV_WRAP GpuMat& setTo(Scalar s); + + //! sets some of the GpuMat elements to s (Non-Blocking call) + CV_WRAP GpuMat& setTo(Scalar s, Stream& stream); + + //! sets some of the GpuMat elements to s, according to the mask (Blocking call) + CV_WRAP GpuMat& setTo(Scalar s, InputArray mask); + + //! sets some of the GpuMat elements to s, according to the mask (Non-Blocking call) + CV_WRAP GpuMat& setTo(Scalar s, InputArray mask, Stream& stream); + + //! converts GpuMat to another datatype (Blocking call) + void convertTo(OutputArray dst, int rtype) const; + + //! converts GpuMat to another datatype (Non-Blocking call) + void convertTo(OutputArray dst, int rtype, Stream& stream) const; + //! bindings overload which converts GpuMat to another datatype (Non-Blocking call) + CV_WRAP void convertTo(CV_OUT GpuMat& dst, int rtype, Stream& stream) const { + convertTo(static_cast(dst), rtype, stream); + } + + //! converts GpuMat to another datatype with scaling (Blocking call) + void convertTo(OutputArray dst, int rtype, double alpha, double beta = 0.0) const; + //! bindings overload which converts GpuMat to another datatype with scaling(Blocking call) + CV_WRAP void convertTo(CV_OUT GpuMat& dst, int rtype, double alpha = 1.0, double beta = 0.0) const { + convertTo(static_cast(dst), rtype, alpha, beta); + } + + //! converts GpuMat to another datatype with scaling (Non-Blocking call) + void convertTo(OutputArray dst, int rtype, double alpha, Stream& stream) const; + + //! converts GpuMat to another datatype with scaling (Non-Blocking call) + void convertTo(OutputArray dst, int rtype, double alpha, double beta, Stream& stream) const; + //! bindings overload which converts GpuMat to another datatype with scaling (Non-Blocking call) + CV_WRAP void convertTo(CV_OUT GpuMat& dst, int rtype, double alpha, double beta, Stream& stream) const { + convertTo(static_cast(dst), rtype, alpha, beta, stream); + } + + CV_WRAP void assignTo(GpuMat& m, int type = -1) const; + + //! returns pointer to y-th row + uchar* ptr(int y = 0); + const uchar* ptr(int y = 0) const; + + //! template version of the above method + template _Tp* ptr(int y = 0); + template const _Tp* ptr(int y = 0) const; + + template operator PtrStepSz<_Tp>() const; + template operator PtrStep<_Tp>() const; + + //! returns a new GpuMat header for the specified row + CV_WRAP GpuMat row(int y) const; + + //! returns a new GpuMat header for the specified column + CV_WRAP GpuMat col(int x) const; + + //! ... for the specified row span + CV_WRAP GpuMat rowRange(int startrow, int endrow) const; + CV_WRAP GpuMat rowRange(Range r) const; + + //! ... for the specified column span + CV_WRAP GpuMat colRange(int startcol, int endcol) const; + CV_WRAP GpuMat colRange(Range r) const; + + //! extracts a rectangular sub-GpuMat (this is a generalized form of row, rowRange etc.) + GpuMat operator ()(Range rowRange, Range colRange) const; + GpuMat operator ()(Rect roi) const; + + //! creates alternative GpuMat header for the same data, with different + //! number of channels and/or different number of rows + CV_WRAP GpuMat reshape(int cn, int rows = 0) const; + + //! locates GpuMat header within a parent GpuMat + CV_WRAP void locateROI(Size& wholeSize, Point& ofs) const; + + //! moves/resizes the current GpuMat ROI inside the parent GpuMat + CV_WRAP GpuMat& adjustROI(int dtop, int dbottom, int dleft, int dright); + + //! returns true iff the GpuMat data is continuous + //! (i.e. when there are no gaps between successive rows) + CV_WRAP bool isContinuous() const; + + //! returns element size in bytes + CV_WRAP size_t elemSize() const; + + //! returns the size of element channel in bytes + CV_WRAP size_t elemSize1() const; + + //! returns element type + CV_WRAP int type() const; + + //! returns element type + CV_WRAP int depth() const; + + //! returns number of channels + CV_WRAP int channels() const; + + //! returns step/elemSize1() + CV_WRAP size_t step1() const; + + //! returns GpuMat size : width == number of columns, height == number of rows + CV_WRAP Size size() const; + + //! returns true if GpuMat data is NULL + CV_WRAP bool empty() const; + + // returns pointer to cuda memory + CV_WRAP void* cudaPtr() const; + + //! internal use method: updates the continuity flag + CV_WRAP void updateContinuityFlag(); + + /*! includes several bit-fields: + - the magic signature + - continuity flag + - depth + - number of channels + */ + int flags; + + //! the number of rows and columns + int rows, cols; + + //! a distance between successive rows in bytes; includes the gap if any + CV_PROP size_t step; + + //! pointer to the data + uchar* data; + + //! pointer to the reference counter; + //! when GpuMat points to user-allocated data, the pointer is NULL + int* refcount; + + //! helper fields used in locateROI and adjustROI + uchar* datastart; + const uchar* dataend; + + //! allocator + Allocator* allocator; +}; + +struct CV_EXPORTS_W GpuData +{ + explicit GpuData(size_t _size); + ~GpuData(); + + GpuData(const GpuData&) = delete; + GpuData& operator=(const GpuData&) = delete; + + GpuData(GpuData&&) = delete; + GpuData& operator=(GpuData&&) = delete; + + uchar* data; + size_t size; +}; + +class CV_EXPORTS_W GpuMatND +{ +public: + using SizeArray = std::vector; + using StepArray = std::vector; + using IndexArray = std::vector; + + //! destructor + ~GpuMatND(); + + //! default constructor + GpuMatND(); + + /** @overload + @param size Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_16FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + */ + GpuMatND(SizeArray size, int type); + + /** @overload + @param size Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_16FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param data Pointer to the user data. Matrix constructors that take data and step parameters do not + allocate matrix data. Instead, they just initialize the matrix header that points to the specified + data, which means that no data is copied. This operation is very efficient and can be used to + process external data using OpenCV functions. The external data is not automatically deallocated, so + you should take care of it. + @param step Array of _size.size()-1 steps in case of a multi-dimensional array (the last step is always + set to the element size). If not specified, the matrix is assumed to be continuous. + */ + GpuMatND(SizeArray size, int type, void* data, StepArray step = StepArray()); + + /** @brief Allocates GPU memory. + Suppose there is some GPU memory already allocated. In that case, this method may choose to reuse that + GPU memory under the specific condition: it must be of the same size and type, not externally allocated, + the GPU memory is continuous(i.e., isContinuous() is true), and is not a sub-matrix of another GpuMatND + (i.e., isSubmatrix() is false). In other words, this method guarantees that the GPU memory allocated by + this method is always continuous and is not a sub-region of another GpuMatND. + */ + void create(SizeArray size, int type); + + void release(); + + void swap(GpuMatND& m) noexcept; + + /** @brief Creates a full copy of the array and the underlying data. + The method creates a full copy of the array. It mimics the behavior of Mat::clone(), i.e. + the original step is not taken into account. So, the array copy is a continuous array + occupying total()\*elemSize() bytes. + */ + GpuMatND clone() const; + + /** @overload + This overload is non-blocking, so it may return even if the copy operation is not finished. + */ + GpuMatND clone(Stream& stream) const; + + /** @brief Extracts a sub-matrix. + The operator makes a new header for the specified sub-array of \*this. + The operator is an O(1) operation, that is, no matrix data is copied. + @param ranges Array of selected ranges along each dimension. + */ + GpuMatND operator()(const std::vector& ranges) const; + + /** @brief Creates a GpuMat header for a 2D plane part of an n-dim matrix. + @note The returned GpuMat is constructed with the constructor for user-allocated data. + That is, It does not perform reference counting. + @note This function does not increment this GpuMatND's reference counter. + */ + GpuMat createGpuMatHeader(IndexArray idx, Range rowRange, Range colRange) const; + + /** @overload + Creates a GpuMat header if this GpuMatND is effectively 2D. + @note The returned GpuMat is constructed with the constructor for user-allocated data. + That is, It does not perform reference counting. + @note This function does not increment this GpuMatND's reference counter. + */ + GpuMat createGpuMatHeader() const; + + /** @brief Extracts a 2D plane part of an n-dim matrix. + It differs from createGpuMatHeader(IndexArray, Range, Range) in that it clones a part of this + GpuMatND to the returned GpuMat. + @note This operator does not increment this GpuMatND's reference counter; + */ + GpuMat operator()(IndexArray idx, Range rowRange, Range colRange) const; + + /** @brief Extracts a 2D plane part of an n-dim matrix if this GpuMatND is effectively 2D. + It differs from createGpuMatHeader() in that it clones a part of this GpuMatND. + @note This operator does not increment this GpuMatND's reference counter; + */ + operator GpuMat() const; + + GpuMatND(const GpuMatND&) = default; + GpuMatND& operator=(const GpuMatND&) = default; + +#if defined(__GNUC__) && __GNUC__ < 5 + // error: function '...' defaulted on its first declaration with an exception-specification + // that differs from the implicit declaration '...' + + GpuMatND(GpuMatND&&) = default; + GpuMatND& operator=(GpuMatND&&) = default; +#else + GpuMatND(GpuMatND&&) noexcept = default; + GpuMatND& operator=(GpuMatND&&) noexcept = default; +#endif + + void upload(InputArray src); + void upload(InputArray src, Stream& stream); + void download(OutputArray dst) const; + void download(OutputArray dst, Stream& stream) const; + + //! returns true iff the GpuMatND data is continuous + //! (i.e. when there are no gaps between successive rows) + bool isContinuous() const; + + //! returns true if the matrix is a sub-matrix of another matrix + bool isSubmatrix() const; + + //! returns element size in bytes + size_t elemSize() const; + + //! returns the size of element channel in bytes + size_t elemSize1() const; + + //! returns true if data is null + bool empty() const; + + //! returns true if not empty and points to external(user-allocated) gpu memory + bool external() const; + + //! returns pointer to the first byte of the GPU memory + uchar* getDevicePtr() const; + + //! returns the total number of array elements + size_t total() const; + + //! returns the size of underlying memory in bytes + size_t totalMemSize() const; + + //! returns element type + int type() const; + +private: + //! internal use + void setFields(SizeArray size, int type, StepArray step = StepArray()); + +public: + /*! includes several bit-fields: + - the magic signature + - continuity flag + - depth + - number of channels + */ + int flags; + + //! matrix dimensionality + int dims; + + //! shape of this array + SizeArray size; + + /*! step values + Their semantics is identical to the semantics of step for Mat. + */ + StepArray step; + +private: + /*! internal use + If this GpuMatND holds external memory, this is empty. + */ + std::shared_ptr data_; + + /*! internal use + If this GpuMatND manages memory with reference counting, this value is + always equal to data_->data. If this GpuMatND holds external memory, + data_ is empty and data points to the external memory. + */ + uchar* data; + + /*! internal use + If this GpuMatND is a sub-matrix of a larger matrix, this value is the + difference of the first byte between the sub-matrix and the whole matrix. + */ + size_t offset; +}; + +/** @brief Creates a continuous matrix. + +@param rows Row count. +@param cols Column count. +@param type Type of the matrix. +@param arr Destination matrix. This parameter changes only if it has a proper type and area ( +\f$\texttt{rows} \times \texttt{cols}\f$ ). + +Matrix is called continuous if its elements are stored continuously, that is, without gaps at the +end of each row. + */ +CV_EXPORTS_W void createContinuous(int rows, int cols, int type, OutputArray arr); + +/** @brief Ensures that the size of a matrix is big enough and the matrix has a proper type. + +@param rows Minimum desired number of rows. +@param cols Minimum desired number of columns. +@param type Desired matrix type. +@param arr Destination matrix. + +The function does not reallocate memory if the matrix has proper attributes already. + */ +CV_EXPORTS_W void ensureSizeIsEnough(int rows, int cols, int type, OutputArray arr); + +/** @brief Bindings overload to create a GpuMat from existing GPU memory. +@param rows Row count. +@param cols Column count. +@param type Type of the matrix. +@param cudaMemoryAddress Address of the allocated GPU memory on the device. This does not allocate matrix data. Instead, it just initializes the matrix header that points to the specified \a cudaMemoryAddress, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions. The external data is not automatically deallocated, so you should take care of it. +@param step Number of bytes each matrix row occupies. The value should include the padding bytes at the end of each row, if any. If the parameter is missing (set to Mat::AUTO_STEP ), no padding is assumed and the actual step is calculated as cols*elemSize(). See GpuMat::elemSize. +@note Overload for generation of bindings only, not exported or intended for use internally from C++. + */ +CV_EXPORTS_W GpuMat inline createGpuMatFromCudaMemory(int rows, int cols, int type, size_t cudaMemoryAddress, size_t step = Mat::AUTO_STEP) { + return GpuMat(rows, cols, type, reinterpret_cast(cudaMemoryAddress), step); +} + + /** @overload +@param size 2D array size: Size(cols, rows). In the Size() constructor, the number of rows and the number of columns go in the reverse order. +@param type Type of the matrix. +@param cudaMemoryAddress Address of the allocated GPU memory on the device. This does not allocate matrix data. Instead, it just initializes the matrix header that points to the specified \a cudaMemoryAddress, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions. The external data is not automatically deallocated, so you should take care of it. +@param step Number of bytes each matrix row occupies. The value should include the padding bytes at the end of each row, if any. If the parameter is missing (set to Mat::AUTO_STEP ), no padding is assumed and the actual step is calculated as cols*elemSize(). See GpuMat::elemSize. +@note Overload for generation of bindings only, not exported or intended for use internally from C++. + */ +CV_EXPORTS_W inline GpuMat createGpuMatFromCudaMemory(Size size, int type, size_t cudaMemoryAddress, size_t step = Mat::AUTO_STEP) { + return GpuMat(size, type, reinterpret_cast(cudaMemoryAddress), step); +} + +/** @brief BufferPool for use with CUDA streams + +BufferPool utilizes Stream's allocator to create new buffers for GpuMat's. It is +only useful when enabled with #setBufferPoolUsage. + +@code + setBufferPoolUsage(true); +@endcode + +@note #setBufferPoolUsage must be called \em before any Stream declaration. + +Users may specify custom allocator for Stream and may implement their own stream based +functions utilizing the same underlying GPU memory management. + +If custom allocator is not specified, BufferPool utilizes StackAllocator by +default. StackAllocator allocates a chunk of GPU device memory beforehand, +and when GpuMat is declared later on, it is given the pre-allocated memory. +This kind of strategy reduces the number of calls for memory allocating APIs +such as cudaMalloc or cudaMallocPitch. + +Below is an example that utilizes BufferPool with StackAllocator: + +@code + #include + + using namespace cv; + using namespace cv::cuda + + int main() + { + setBufferPoolUsage(true); // Tell OpenCV that we are going to utilize BufferPool + setBufferPoolConfig(getDevice(), 1024 * 1024 * 64, 2); // Allocate 64 MB, 2 stacks (default is 10 MB, 5 stacks) + + Stream stream1, stream2; // Each stream uses 1 stack + BufferPool pool1(stream1), pool2(stream2); + + GpuMat d_src1 = pool1.getBuffer(4096, 4096, CV_8UC1); // 16MB + GpuMat d_dst1 = pool1.getBuffer(4096, 4096, CV_8UC3); // 48MB, pool1 is now full + + GpuMat d_src2 = pool2.getBuffer(1024, 1024, CV_8UC1); // 1MB + GpuMat d_dst2 = pool2.getBuffer(1024, 1024, CV_8UC3); // 3MB + + cvtColor(d_src1, d_dst1, cv::COLOR_GRAY2BGR, 0, stream1); + cvtColor(d_src2, d_dst2, cv::COLOR_GRAY2BGR, 0, stream2); + } +@endcode + +If we allocate another GpuMat on pool1 in the above example, it will be carried out by +the DefaultAllocator since the stack for pool1 is full. + +@code + GpuMat d_add1 = pool1.getBuffer(1024, 1024, CV_8UC1); // Stack for pool1 is full, memory is allocated with DefaultAllocator +@endcode + +If a third stream is declared in the above example, allocating with #getBuffer +within that stream will also be carried out by the DefaultAllocator because we've run out of +stacks. + +@code + Stream stream3; // Only 2 stacks were allocated, we've run out of stacks + BufferPool pool3(stream3); + GpuMat d_src3 = pool3.getBuffer(1024, 1024, CV_8UC1); // Memory is allocated with DefaultAllocator +@endcode + +@warning When utilizing StackAllocator, deallocation order is important. + +Just like a stack, deallocation must be done in LIFO order. Below is an example of +erroneous usage that violates LIFO rule. If OpenCV is compiled in Debug mode, this +sample code will emit CV_Assert error. + +@code + int main() + { + setBufferPoolUsage(true); // Tell OpenCV that we are going to utilize BufferPool + Stream stream; // A default size (10 MB) stack is allocated to this stream + BufferPool pool(stream); + + GpuMat mat1 = pool.getBuffer(1024, 1024, CV_8UC1); // Allocate mat1 (1MB) + GpuMat mat2 = pool.getBuffer(1024, 1024, CV_8UC1); // Allocate mat2 (1MB) + + mat1.release(); // erroneous usage : mat2 must be deallocated before mat1 + } +@endcode + +Since C++ local variables are destroyed in the reverse order of construction, +the code sample below satisfies the LIFO rule. Local GpuMat's are deallocated +and the corresponding memory is automatically returned to the pool for later usage. + +@code + int main() + { + setBufferPoolUsage(true); // Tell OpenCV that we are going to utilize BufferPool + setBufferPoolConfig(getDevice(), 1024 * 1024 * 64, 2); // Allocate 64 MB, 2 stacks (default is 10 MB, 5 stacks) + + Stream stream1, stream2; // Each stream uses 1 stack + BufferPool pool1(stream1), pool2(stream2); + + for (int i = 0; i < 10; i++) + { + GpuMat d_src1 = pool1.getBuffer(4096, 4096, CV_8UC1); // 16MB + GpuMat d_dst1 = pool1.getBuffer(4096, 4096, CV_8UC3); // 48MB, pool1 is now full + + GpuMat d_src2 = pool2.getBuffer(1024, 1024, CV_8UC1); // 1MB + GpuMat d_dst2 = pool2.getBuffer(1024, 1024, CV_8UC3); // 3MB + + d_src1.setTo(Scalar(i), stream1); + d_src2.setTo(Scalar(i), stream2); + + cvtColor(d_src1, d_dst1, cv::COLOR_GRAY2BGR, 0, stream1); + cvtColor(d_src2, d_dst2, cv::COLOR_GRAY2BGR, 0, stream2); + // The order of destruction of the local variables is: + // d_dst2 => d_src2 => d_dst1 => d_src1 + // LIFO rule is satisfied, this code runs without error + } + } +@endcode + */ +class CV_EXPORTS_W BufferPool +{ +public: + + //! Gets the BufferPool for the given stream. + CV_WRAP explicit BufferPool(Stream& stream); + + //! Allocates a new GpuMat of given size and type. + CV_WRAP GpuMat getBuffer(int rows, int cols, int type); + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif + //! Allocates a new GpuMat of given size and type. + CV_WRAP GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + + //! Returns the allocator associated with the stream. + CV_WRAP Ptr getAllocator() const { return allocator_; } + +private: + Ptr allocator_; +}; + +//! BufferPool management (must be called before Stream creation) +CV_EXPORTS_W void setBufferPoolUsage(bool on); +CV_EXPORTS_W void setBufferPoolConfig(int deviceId, size_t stackSize, int stackCount); + +//=================================================================================== +// HostMem +//=================================================================================== + +/** @brief Class with reference counting wrapping special memory type allocation functions from CUDA. + +Its interface is also Mat-like but with additional memory type parameters. + +- **PAGE_LOCKED** sets a page locked memory type used commonly for fast and asynchronous + uploading/downloading data from/to GPU. +- **SHARED** specifies a zero copy memory allocation that enables mapping the host memory to GPU + address space, if supported. +- **WRITE_COMBINED** sets the write combined buffer that is not cached by CPU. Such buffers are + used to supply GPU with data when GPU only reads it. The advantage is a better CPU cache + utilization. + +@note Allocation size of such memory types is usually limited. For more details, see *CUDA 2.2 +Pinned Memory APIs* document or *CUDA C Programming Guide*. + */ +class CV_EXPORTS_W HostMem +{ +public: + enum AllocType { PAGE_LOCKED = 1, SHARED = 2, WRITE_COMBINED = 4 }; + + static MatAllocator* getAllocator(HostMem::AllocType alloc_type = HostMem::AllocType::PAGE_LOCKED); + + CV_WRAP explicit HostMem(HostMem::AllocType alloc_type = HostMem::AllocType::PAGE_LOCKED); + + HostMem(const HostMem& m); + + CV_WRAP HostMem(int rows, int cols, int type, HostMem::AllocType alloc_type = HostMem::AllocType::PAGE_LOCKED); + CV_WRAP HostMem(Size size, int type, HostMem::AllocType alloc_type = HostMem::AllocType::PAGE_LOCKED); + + //! creates from host memory with coping data + CV_WRAP explicit HostMem(InputArray arr, HostMem::AllocType alloc_type = HostMem::AllocType::PAGE_LOCKED); + + ~HostMem(); + + HostMem& operator =(const HostMem& m); + + //! swaps with other smart pointer + CV_WRAP void swap(HostMem& b); + + //! returns deep copy of the matrix, i.e. the data is copied + CV_WRAP HostMem clone() const; + + //! allocates new matrix data unless the matrix already has specified size and type. + CV_WRAP void create(int rows, int cols, int type); + void create(Size size, int type); + + //! creates alternative HostMem header for the same data, with different + //! number of channels and/or different number of rows + CV_WRAP HostMem reshape(int cn, int rows = 0) const; + + //! decrements reference counter and released memory if needed. + void release(); + + //! returns matrix header with disabled reference counting for HostMem data. + CV_WRAP Mat createMatHeader() const; + + /** @brief Maps CPU memory to GPU address space and creates the cuda::GpuMat header without reference counting + for it. + + This can be done only if memory was allocated with the SHARED flag and if it is supported by the + hardware. Laptops often share video and CPU memory, so address spaces can be mapped, which + eliminates an extra copy. + */ + GpuMat createGpuMatHeader() const; + + // Please see cv::Mat for descriptions + CV_WRAP bool isContinuous() const; + CV_WRAP size_t elemSize() const; + CV_WRAP size_t elemSize1() const; + CV_WRAP int type() const; + CV_WRAP int depth() const; + CV_WRAP int channels() const; + CV_WRAP size_t step1() const; + CV_WRAP Size size() const; + CV_WRAP bool empty() const; + + // Please see cv::Mat for descriptions + int flags; + int rows, cols; + CV_PROP size_t step; + + uchar* data; + int* refcount; + + uchar* datastart; + const uchar* dataend; + + AllocType alloc_type; +}; + +/** @brief Page-locks the memory of matrix and maps it for the device(s). + +@param m Input matrix. + */ +CV_EXPORTS_W void registerPageLocked(Mat& m); + +/** @brief Unmaps the memory of matrix and makes it pageable again. + +@param m Input matrix. + */ +CV_EXPORTS_W void unregisterPageLocked(Mat& m); + +//=================================================================================== +// Stream +//=================================================================================== + +/** @brief This class encapsulates a queue of asynchronous calls. + +@note Currently, you may face problems if an operation is enqueued twice with different data. Some +functions use the constant GPU memory, and next call may update the memory before the previous one +has been finished. But calling different operations asynchronously is safe because each operation +has its own constant buffer. Memory copy/upload/download/set operations to the buffers you hold are +also safe. + +@note The Stream class is not thread-safe. Please use different Stream objects for different CPU threads. + +@code +void thread1() +{ + cv::cuda::Stream stream1; + cv::cuda::func1(..., stream1); +} + +void thread2() +{ + cv::cuda::Stream stream2; + cv::cuda::func2(..., stream2); +} +@endcode + +@note By default all CUDA routines are launched in Stream::Null() object, if the stream is not specified by user. +In multi-threading environment the stream objects must be passed explicitly (see previous note). + */ +class CV_EXPORTS_W Stream +{ + typedef void (Stream::*bool_type)() const; + void this_type_does_not_support_comparisons() const {} + +public: + typedef void (*StreamCallback)(int status, void* userData); + + //! creates a new asynchronous stream + CV_WRAP Stream(); + + //! creates a new asynchronous stream with custom allocator + CV_WRAP Stream(const Ptr& allocator); + + /** @brief creates a new Stream using the cudaFlags argument to determine the behaviors of the stream + + @note The cudaFlags parameter is passed to the underlying api cudaStreamCreateWithFlags() and + supports the same parameter values. + @code + // creates an OpenCV cuda::Stream that manages an asynchronous, non-blocking, + // non-default CUDA stream + cv::cuda::Stream cvStream(cudaStreamNonBlocking); + @endcode + */ + CV_WRAP Stream(const size_t cudaFlags); + + /** @brief Returns true if the current stream queue is finished. Otherwise, it returns false. + */ + CV_WRAP bool queryIfComplete() const; + + /** @brief Blocks the current CPU thread until all operations in the stream are complete. + */ + CV_WRAP void waitForCompletion(); + + /** @brief Makes a compute stream wait on an event. + */ + CV_WRAP void waitEvent(const Event& event); + + /** @brief Adds a callback to be called on the host after all currently enqueued items in the stream have + completed. + + @note Callbacks must not make any CUDA API calls. Callbacks must not perform any synchronization + that may depend on outstanding device work or other callbacks that are not mandated to run earlier. + Callbacks without a mandated order (in independent streams) execute in undefined order and may be + serialized. + */ + void enqueueHostCallback(StreamCallback callback, void* userData); + + //! return Stream object for default CUDA stream + CV_WRAP static Stream& Null(); + + //! returns true if stream object is not default (!= 0) + operator bool_type() const; + + //! return Pointer to CUDA stream + CV_WRAP void* cudaPtr() const; + + class Impl; + +private: + Ptr impl_; + Stream(const Ptr& impl); + + friend struct StreamAccessor; + friend class BufferPool; + friend class DefaultDeviceInitializer; +}; + + +/** @brief Bindings overload to create a Stream object from the address stored in an existing CUDA Runtime API stream pointer (cudaStream_t). +@param cudaStreamMemoryAddress Memory address stored in a CUDA Runtime API stream pointer (cudaStream_t). The created Stream object does not perform any allocation or deallocation and simply wraps existing raw CUDA Runtime API stream pointer. +@note Overload for generation of bindings only, not exported or intended for use internally from C++. + */ +CV_EXPORTS_W Stream wrapStream(size_t cudaStreamMemoryAddress); + +class CV_EXPORTS_W Event +{ +public: + enum CreateFlags + { + DEFAULT = 0x00, /**< Default event flag */ + BLOCKING_SYNC = 0x01, /**< Event uses blocking synchronization */ + DISABLE_TIMING = 0x02, /**< Event will not record timing data */ + INTERPROCESS = 0x04 /**< Event is suitable for interprocess use. DisableTiming must be set */ + }; + + CV_WRAP explicit Event(const Event::CreateFlags flags = Event::CreateFlags::DEFAULT); + + //! records an event + CV_WRAP void record(Stream& stream = Stream::Null()); + + //! queries an event's status + CV_WRAP bool queryIfComplete() const; + + //! waits for an event to complete + CV_WRAP void waitForCompletion(); + + //! computes the elapsed time between events + CV_WRAP static float elapsedTime(const Event& start, const Event& end); + + class Impl; + +private: + Ptr impl_; + Event(const Ptr& impl); + + friend struct EventAccessor; +}; +CV_ENUM_FLAGS(Event::CreateFlags) + +//! @} cudacore_struct + +//=================================================================================== +// Initialization & Info +//=================================================================================== + +//! @addtogroup cudacore_init +//! @{ + +/** @brief Returns the number of installed CUDA-enabled devices. + +Use this function before any other CUDA functions calls. If OpenCV is compiled without CUDA support, +this function returns 0. If the CUDA driver is not installed, or is incompatible, this function +returns -1. + */ +CV_EXPORTS_W int getCudaEnabledDeviceCount(); + +/** @brief Sets a device and initializes it for the current thread. + +@param device System index of a CUDA device starting with 0. + +If the call of this function is omitted, a default device is initialized at the fist CUDA usage. + */ +CV_EXPORTS_W void setDevice(int device); + +/** @brief Returns the current device index set by cuda::setDevice or initialized by default. + */ +CV_EXPORTS_W int getDevice(); + +/** @brief Explicitly destroys and cleans up all resources associated with the current device in the current +process. + +Any subsequent API call to this device will reinitialize the device. + */ +CV_EXPORTS_W void resetDevice(); + +/** @brief Enumeration providing CUDA computing features. + */ +enum FeatureSet +{ + FEATURE_SET_COMPUTE_10 = 10, + FEATURE_SET_COMPUTE_11 = 11, + FEATURE_SET_COMPUTE_12 = 12, + FEATURE_SET_COMPUTE_13 = 13, + FEATURE_SET_COMPUTE_20 = 20, + FEATURE_SET_COMPUTE_21 = 21, + FEATURE_SET_COMPUTE_30 = 30, + FEATURE_SET_COMPUTE_32 = 32, + FEATURE_SET_COMPUTE_35 = 35, + FEATURE_SET_COMPUTE_50 = 50, + + GLOBAL_ATOMICS = FEATURE_SET_COMPUTE_11, + SHARED_ATOMICS = FEATURE_SET_COMPUTE_12, + NATIVE_DOUBLE = FEATURE_SET_COMPUTE_13, + WARP_SHUFFLE_FUNCTIONS = FEATURE_SET_COMPUTE_30, + DYNAMIC_PARALLELISM = FEATURE_SET_COMPUTE_35 +}; + +//! checks whether current device supports the given feature +CV_EXPORTS bool deviceSupports(FeatureSet feature_set); + +/** @brief Class providing a set of static methods to check what NVIDIA\* card architecture the CUDA module was +built for. + +According to the CUDA C Programming Guide Version 3.2: "PTX code produced for some specific compute +capability can always be compiled to binary code of greater or equal compute capability". + */ +class CV_EXPORTS_W TargetArchs +{ +public: + /** @brief The following method checks whether the module was built with the support of the given feature: + + @param feature_set Features to be checked. See :ocvcuda::FeatureSet. + */ + static bool builtWith(FeatureSet feature_set); + + /** @brief There is a set of methods to check whether the module contains intermediate (PTX) or binary CUDA + code for the given architecture(s): + + @param major Major compute capability version. + @param minor Minor compute capability version. + */ + CV_WRAP static bool has(int major, int minor); + CV_WRAP static bool hasPtx(int major, int minor); + CV_WRAP static bool hasBin(int major, int minor); + + CV_WRAP static bool hasEqualOrLessPtx(int major, int minor); + CV_WRAP static bool hasEqualOrGreater(int major, int minor); + CV_WRAP static bool hasEqualOrGreaterPtx(int major, int minor); + CV_WRAP static bool hasEqualOrGreaterBin(int major, int minor); +}; + +/** @brief Class providing functionality for querying the specified GPU properties. + */ +class CV_EXPORTS_W DeviceInfo +{ +public: + //! creates DeviceInfo object for the current GPU + CV_WRAP DeviceInfo(); + + /** @brief The constructors. + + @param device_id System index of the CUDA device starting with 0. + + Constructs the DeviceInfo object for the specified device. If device_id parameter is missed, it + constructs an object for the current device. + */ + CV_WRAP DeviceInfo(int device_id); + + /** @brief Returns system index of the CUDA device starting with 0. + */ + CV_WRAP int deviceID() const; + + //! ASCII string identifying device + const char* name() const; + + //! global memory available on device in bytes + CV_WRAP size_t totalGlobalMem() const; + + //! shared memory available per block in bytes + CV_WRAP size_t sharedMemPerBlock() const; + + //! 32-bit registers available per block + CV_WRAP int regsPerBlock() const; + + //! warp size in threads + CV_WRAP int warpSize() const; + + //! maximum pitch in bytes allowed by memory copies + CV_WRAP size_t memPitch() const; + + //! maximum number of threads per block + CV_WRAP int maxThreadsPerBlock() const; + + //! maximum size of each dimension of a block + CV_WRAP Vec3i maxThreadsDim() const; + + //! maximum size of each dimension of a grid + CV_WRAP Vec3i maxGridSize() const; + + //! clock frequency in kilohertz + CV_WRAP int clockRate() const; + + //! constant memory available on device in bytes + CV_WRAP size_t totalConstMem() const; + + //! major compute capability + CV_WRAP int majorVersion() const; + + //! minor compute capability + CV_WRAP int minorVersion() const; + + //! alignment requirement for textures + CV_WRAP size_t textureAlignment() const; + + //! pitch alignment requirement for texture references bound to pitched memory + CV_WRAP size_t texturePitchAlignment() const; + + //! number of multiprocessors on device + CV_WRAP int multiProcessorCount() const; + + //! specified whether there is a run time limit on kernels + CV_WRAP bool kernelExecTimeoutEnabled() const; + + //! device is integrated as opposed to discrete + CV_WRAP bool integrated() const; + + //! device can map host memory with cudaHostAlloc/cudaHostGetDevicePointer + CV_WRAP bool canMapHostMemory() const; + + enum ComputeMode + { + ComputeModeDefault, /**< default compute mode (Multiple threads can use cudaSetDevice with this device) */ + ComputeModeExclusive, /**< compute-exclusive-thread mode (Only one thread in one process will be able to use cudaSetDevice with this device) */ + ComputeModeProhibited, /**< compute-prohibited mode (No threads can use cudaSetDevice with this device) */ + ComputeModeExclusiveProcess /**< compute-exclusive-process mode (Many threads in one process will be able to use cudaSetDevice with this device) */ + }; + + //! compute mode + CV_WRAP DeviceInfo::ComputeMode computeMode() const; + + //! maximum 1D texture size + CV_WRAP int maxTexture1D() const; + + //! maximum 1D mipmapped texture size + CV_WRAP int maxTexture1DMipmap() const; + + //! maximum size for 1D textures bound to linear memory + CV_WRAP int maxTexture1DLinear() const; + + //! maximum 2D texture dimensions + CV_WRAP Vec2i maxTexture2D() const; + + //! maximum 2D mipmapped texture dimensions + CV_WRAP Vec2i maxTexture2DMipmap() const; + + //! maximum dimensions (width, height, pitch) for 2D textures bound to pitched memory + CV_WRAP Vec3i maxTexture2DLinear() const; + + //! maximum 2D texture dimensions if texture gather operations have to be performed + CV_WRAP Vec2i maxTexture2DGather() const; + + //! maximum 3D texture dimensions + CV_WRAP Vec3i maxTexture3D() const; + + //! maximum Cubemap texture dimensions + CV_WRAP int maxTextureCubemap() const; + + //! maximum 1D layered texture dimensions + CV_WRAP Vec2i maxTexture1DLayered() const; + + //! maximum 2D layered texture dimensions + CV_WRAP Vec3i maxTexture2DLayered() const; + + //! maximum Cubemap layered texture dimensions + CV_WRAP Vec2i maxTextureCubemapLayered() const; + + //! maximum 1D surface size + CV_WRAP int maxSurface1D() const; + + //! maximum 2D surface dimensions + CV_WRAP Vec2i maxSurface2D() const; + + //! maximum 3D surface dimensions + CV_WRAP Vec3i maxSurface3D() const; + + //! maximum 1D layered surface dimensions + CV_WRAP Vec2i maxSurface1DLayered() const; + + //! maximum 2D layered surface dimensions + CV_WRAP Vec3i maxSurface2DLayered() const; + + //! maximum Cubemap surface dimensions + CV_WRAP int maxSurfaceCubemap() const; + + //! maximum Cubemap layered surface dimensions + CV_WRAP Vec2i maxSurfaceCubemapLayered() const; + + //! alignment requirements for surfaces + CV_WRAP size_t surfaceAlignment() const; + + //! device can possibly execute multiple kernels concurrently + CV_WRAP bool concurrentKernels() const; + + //! device has ECC support enabled + CV_WRAP bool ECCEnabled() const; + + //! PCI bus ID of the device + CV_WRAP int pciBusID() const; + + //! PCI device ID of the device + CV_WRAP int pciDeviceID() const; + + //! PCI domain ID of the device + CV_WRAP int pciDomainID() const; + + //! true if device is a Tesla device using TCC driver, false otherwise + CV_WRAP bool tccDriver() const; + + //! number of asynchronous engines + CV_WRAP int asyncEngineCount() const; + + //! device shares a unified address space with the host + CV_WRAP bool unifiedAddressing() const; + + //! peak memory clock frequency in kilohertz + CV_WRAP int memoryClockRate() const; + + //! global memory bus width in bits + CV_WRAP int memoryBusWidth() const; + + //! size of L2 cache in bytes + CV_WRAP int l2CacheSize() const; + + //! maximum resident threads per multiprocessor + CV_WRAP int maxThreadsPerMultiProcessor() const; + + //! gets free and total device memory + CV_WRAP void queryMemory(size_t& totalMemory, size_t& freeMemory) const; + CV_WRAP size_t freeMemory() const; + CV_WRAP size_t totalMemory() const; + + /** @brief Provides information on CUDA feature support. + + @param feature_set Features to be checked. See cuda::FeatureSet. + + This function returns true if the device has the specified CUDA feature. Otherwise, it returns false + */ + bool supports(FeatureSet feature_set) const; + + /** @brief Checks the CUDA module and device compatibility. + + This function returns true if the CUDA module can be run on the specified device. Otherwise, it + returns false . + */ + CV_WRAP bool isCompatible() const; + +private: + int device_id_; +}; + +CV_EXPORTS_W void printCudaDeviceInfo(int device); +CV_EXPORTS_W void printShortCudaDeviceInfo(int device); + +/** @brief Converts an array to half precision floating number. + +@param _src input array. +@param _dst output array. +@param stream Stream for the asynchronous version. +@sa convertFp16 +*/ +CV_EXPORTS void convertFp16(InputArray _src, OutputArray _dst, Stream& stream = Stream::Null()); + +//! @} cudacore_init + +}} // namespace cv { namespace cuda { + + +#include "opencv2/core/cuda.inl.hpp" + +#endif /* OPENCV_CORE_CUDA_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda.inl.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda.inl.hpp new file mode 100644 index 0000000..9390b3a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda.inl.hpp @@ -0,0 +1,763 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CUDAINL_HPP +#define OPENCV_CORE_CUDAINL_HPP + +#include "opencv2/core/cuda.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { + +//=================================================================================== +// GpuMat +//=================================================================================== + +inline +GpuMat::GpuMat(Allocator* allocator_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{} + +inline +GpuMat::GpuMat(int rows_, int cols_, int type_, Allocator* allocator_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{ + if (rows_ > 0 && cols_ > 0) + create(rows_, cols_, type_); +} + +inline +GpuMat::GpuMat(Size size_, int type_, Allocator* allocator_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{ + if (size_.height > 0 && size_.width > 0) + create(size_.height, size_.width, type_); +} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +GpuMat::GpuMat(int rows_, int cols_, int type_, Scalar s_, Allocator* allocator_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{ + if (rows_ > 0 && cols_ > 0) + { + create(rows_, cols_, type_); + setTo(s_); + } +} + +inline +GpuMat::GpuMat(Size size_, int type_, Scalar s_, Allocator* allocator_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{ + if (size_.height > 0 && size_.width > 0) + { + create(size_.height, size_.width, type_); + setTo(s_); + } +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +inline +GpuMat::GpuMat(const GpuMat& m) + : flags(m.flags), rows(m.rows), cols(m.cols), step(m.step), data(m.data), refcount(m.refcount), datastart(m.datastart), dataend(m.dataend), allocator(m.allocator) +{ + if (refcount) + CV_XADD(refcount, 1); +} + +inline +GpuMat::GpuMat(InputArray arr, Allocator* allocator_) : + flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) +{ + upload(arr); +} + +inline +GpuMat::~GpuMat() +{ + release(); +} + +inline +GpuMat& GpuMat::operator =(const GpuMat& m) +{ + if (this != &m) + { + GpuMat temp(m); + swap(temp); + } + + return *this; +} + +inline +void GpuMat::create(Size size_, int type_) +{ + create(size_.height, size_.width, type_); +} + +inline +void GpuMat::swap(GpuMat& b) +{ + std::swap(flags, b.flags); + std::swap(rows, b.rows); + std::swap(cols, b.cols); + std::swap(step, b.step); + std::swap(data, b.data); + std::swap(datastart, b.datastart); + std::swap(dataend, b.dataend); + std::swap(refcount, b.refcount); + std::swap(allocator, b.allocator); +} + +inline +GpuMat GpuMat::clone() const +{ + GpuMat m; + copyTo(m); + return m; +} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +void GpuMat::copyTo(OutputArray dst, InputArray mask) const +{ + copyTo(dst, mask, Stream::Null()); +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +inline +GpuMat& GpuMat::setTo(Scalar s) +{ + return setTo(s, Stream::Null()); +} + +inline +GpuMat& GpuMat::setTo(Scalar s, InputArray mask) +{ + return setTo(s, mask, Stream::Null()); +} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +void GpuMat::convertTo(OutputArray dst, int rtype) const +{ + convertTo(dst, rtype, Stream::Null()); +} + +inline +void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, double beta) const +{ + convertTo(dst, rtype, alpha, beta, Stream::Null()); +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +inline +void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, Stream& stream) const +{ + convertTo(dst, rtype, alpha, 0.0, stream); +} + +inline +void GpuMat::assignTo(GpuMat& m, int _type) const +{ + if (_type < 0) + m = *this; + else + convertTo(m, _type); +} + +inline +uchar* GpuMat::ptr(int y) +{ + CV_DbgAssert( (unsigned)y < (unsigned)rows ); + return data + step * y; +} + +inline +const uchar* GpuMat::ptr(int y) const +{ + CV_DbgAssert( (unsigned)y < (unsigned)rows ); + return data + step * y; +} + +template inline +_Tp* GpuMat::ptr(int y) +{ + return (_Tp*)ptr(y); +} + +template inline +const _Tp* GpuMat::ptr(int y) const +{ + return (const _Tp*)ptr(y); +} + +template inline +GpuMat::operator PtrStepSz() const +{ + return PtrStepSz(rows, cols, (T*)data, step); +} + +template inline +GpuMat::operator PtrStep() const +{ + return PtrStep((T*)data, step); +} + +inline +GpuMat GpuMat::row(int y) const +{ + return GpuMat(*this, Range(y, y+1), Range::all()); +} + +inline +GpuMat GpuMat::col(int x) const +{ + return GpuMat(*this, Range::all(), Range(x, x+1)); +} + +inline +GpuMat GpuMat::rowRange(int startrow, int endrow) const +{ + return GpuMat(*this, Range(startrow, endrow), Range::all()); +} + +inline +GpuMat GpuMat::rowRange(Range r) const +{ + return GpuMat(*this, r, Range::all()); +} + +inline +GpuMat GpuMat::colRange(int startcol, int endcol) const +{ + return GpuMat(*this, Range::all(), Range(startcol, endcol)); +} + +inline +GpuMat GpuMat::colRange(Range r) const +{ + return GpuMat(*this, Range::all(), r); +} + +inline +GpuMat GpuMat::operator ()(Range rowRange_, Range colRange_) const +{ + return GpuMat(*this, rowRange_, colRange_); +} + +inline +GpuMat GpuMat::operator ()(Rect roi) const +{ + return GpuMat(*this, roi); +} + +inline +bool GpuMat::isContinuous() const +{ + return (flags & Mat::CONTINUOUS_FLAG) != 0; +} + +inline +size_t GpuMat::elemSize() const +{ + return CV_ELEM_SIZE(flags); +} + +inline +size_t GpuMat::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +int GpuMat::type() const +{ + return CV_MAT_TYPE(flags); +} + +inline +int GpuMat::depth() const +{ + return CV_MAT_DEPTH(flags); +} + +inline +int GpuMat::channels() const +{ + return CV_MAT_CN(flags); +} + +inline +size_t GpuMat::step1() const +{ + return step / elemSize1(); +} + +inline +Size GpuMat::size() const +{ + return Size(cols, rows); +} + +inline +bool GpuMat::empty() const +{ + return data == 0; +} + +inline +void* GpuMat::cudaPtr() const +{ + return data; +} + +static inline +GpuMat createContinuous(int rows, int cols, int type) +{ + GpuMat m; + createContinuous(rows, cols, type, m); + return m; +} + +static inline +void createContinuous(Size size, int type, OutputArray arr) +{ + createContinuous(size.height, size.width, type, arr); +} + +static inline +GpuMat createContinuous(Size size, int type) +{ + GpuMat m; + createContinuous(size, type, m); + return m; +} + +static inline +void ensureSizeIsEnough(Size size, int type, OutputArray arr) +{ + ensureSizeIsEnough(size.height, size.width, type, arr); +} + +static inline +void swap(GpuMat& a, GpuMat& b) +{ + a.swap(b); +} + +//=================================================================================== +// GpuMatND +//=================================================================================== + +inline +GpuMatND::GpuMatND() : + flags(0), dims(0), data(nullptr), offset(0) +{ +} + +inline +GpuMatND::GpuMatND(SizeArray _size, int _type) : + flags(0), dims(0), data(nullptr), offset(0) +{ + create(std::move(_size), _type); +} + +inline +void GpuMatND::swap(GpuMatND& m) noexcept +{ + std::swap(*this, m); +} + +inline +bool GpuMatND::isContinuous() const +{ + return (flags & Mat::CONTINUOUS_FLAG) != 0; +} + +inline +bool GpuMatND::isSubmatrix() const +{ + return (flags & Mat::SUBMATRIX_FLAG) != 0; +} + +inline +size_t GpuMatND::elemSize() const +{ + return CV_ELEM_SIZE(flags); +} + +inline +size_t GpuMatND::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +bool GpuMatND::empty() const +{ + return data == nullptr; +} + +inline +bool GpuMatND::external() const +{ + return !empty() && data_.use_count() == 0; +} + +inline +uchar* GpuMatND::getDevicePtr() const +{ + return data + offset; +} + +inline +size_t GpuMatND::total() const +{ + size_t p = 1; + for(auto s : size) + p *= s; + return p; +} + +inline +size_t GpuMatND::totalMemSize() const +{ + return size[0] * step[0]; +} + +inline +int GpuMatND::type() const +{ + return CV_MAT_TYPE(flags); +} + +//=================================================================================== +// HostMem +//=================================================================================== + +inline +HostMem::HostMem(AllocType alloc_type_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), alloc_type(alloc_type_) +{ +} + +inline +HostMem::HostMem(const HostMem& m) + : flags(m.flags), rows(m.rows), cols(m.cols), step(m.step), data(m.data), refcount(m.refcount), datastart(m.datastart), dataend(m.dataend), alloc_type(m.alloc_type) +{ + if( refcount ) + CV_XADD(refcount, 1); +} + +inline +HostMem::HostMem(int rows_, int cols_, int type_, AllocType alloc_type_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), alloc_type(alloc_type_) +{ + if (rows_ > 0 && cols_ > 0) + create(rows_, cols_, type_); +} + +inline +HostMem::HostMem(Size size_, int type_, AllocType alloc_type_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), alloc_type(alloc_type_) +{ + if (size_.height > 0 && size_.width > 0) + create(size_.height, size_.width, type_); +} + +inline +HostMem::HostMem(InputArray arr, AllocType alloc_type_) + : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), alloc_type(alloc_type_) +{ + arr.getMat().copyTo(*this); +} + +inline +HostMem::~HostMem() +{ + release(); +} + +inline +HostMem& HostMem::operator =(const HostMem& m) +{ + if (this != &m) + { + HostMem temp(m); + swap(temp); + } + + return *this; +} + +inline +void HostMem::swap(HostMem& b) +{ + std::swap(flags, b.flags); + std::swap(rows, b.rows); + std::swap(cols, b.cols); + std::swap(step, b.step); + std::swap(data, b.data); + std::swap(datastart, b.datastart); + std::swap(dataend, b.dataend); + std::swap(refcount, b.refcount); + std::swap(alloc_type, b.alloc_type); +} + +inline +HostMem HostMem::clone() const +{ + HostMem m(size(), type(), alloc_type); + createMatHeader().copyTo(m); + return m; +} + +inline +void HostMem::create(Size size_, int type_) +{ + create(size_.height, size_.width, type_); +} + +inline +Mat HostMem::createMatHeader() const +{ + return Mat(size(), type(), data, step); +} + +inline +bool HostMem::isContinuous() const +{ + return (flags & Mat::CONTINUOUS_FLAG) != 0; +} + +inline +size_t HostMem::elemSize() const +{ + return CV_ELEM_SIZE(flags); +} + +inline +size_t HostMem::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +int HostMem::type() const +{ + return CV_MAT_TYPE(flags); +} + +inline +int HostMem::depth() const +{ + return CV_MAT_DEPTH(flags); +} + +inline +int HostMem::channels() const +{ + return CV_MAT_CN(flags); +} + +inline +size_t HostMem::step1() const +{ + return step / elemSize1(); +} + +inline +Size HostMem::size() const +{ + return Size(cols, rows); +} + +inline +bool HostMem::empty() const +{ + return data == 0; +} + +static inline +void swap(HostMem& a, HostMem& b) +{ + a.swap(b); +} + +//=================================================================================== +// Stream +//=================================================================================== + +inline +Stream::Stream(const Ptr& impl) + : impl_(impl) +{ +} + +//=================================================================================== +// Event +//=================================================================================== + +inline +Event::Event(const Ptr& impl) + : impl_(impl) +{ +} + +//=================================================================================== +// Initialization & Info +//=================================================================================== + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +bool TargetArchs::has(int major, int minor) +{ + return hasPtx(major, minor) || hasBin(major, minor); +} + +inline +bool TargetArchs::hasEqualOrGreater(int major, int minor) +{ + return hasEqualOrGreaterPtx(major, minor) || hasEqualOrGreaterBin(major, minor); +} + +inline +DeviceInfo::DeviceInfo() +{ + device_id_ = getDevice(); +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +inline +DeviceInfo::DeviceInfo(int device_id) +{ + CV_Assert( device_id >= 0 && device_id < getCudaEnabledDeviceCount() ); + device_id_ = device_id; +} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +int DeviceInfo::deviceID() const +{ + return device_id_; +} + +inline +size_t DeviceInfo::freeMemory() const +{ + size_t _totalMemory = 0, _freeMemory = 0; + queryMemory(_totalMemory, _freeMemory); + return _freeMemory; +} + +inline +size_t DeviceInfo::totalMemory() const +{ + size_t _totalMemory = 0, _freeMemory = 0; + queryMemory(_totalMemory, _freeMemory); + return _totalMemory; +} + +inline +bool DeviceInfo::supports(FeatureSet feature_set) const +{ + int version = majorVersion() * 10 + minorVersion(); + return version >= feature_set; +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + + +}} // namespace cv { namespace cuda { + +//=================================================================================== +// Mat +//=================================================================================== + +namespace cv { + +inline +Mat::Mat(const cuda::GpuMat& m) + : flags(0), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows) +{ + m.download(*this); +} + +} + +//! @endcond + +#endif // OPENCV_CORE_CUDAINL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/block.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/block.hpp new file mode 100644 index 0000000..c277f0e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/block.hpp @@ -0,0 +1,211 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_DEVICE_BLOCK_HPP +#define OPENCV_CUDA_DEVICE_BLOCK_HPP + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + struct Block + { + static __device__ __forceinline__ unsigned int id() + { + return blockIdx.x; + } + + static __device__ __forceinline__ unsigned int stride() + { + return blockDim.x * blockDim.y * blockDim.z; + } + + static __device__ __forceinline__ void sync() + { + __syncthreads(); + } + + static __device__ __forceinline__ int flattenedThreadId() + { + return threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x; + } + + template + static __device__ __forceinline__ void fill(It beg, It end, const T& value) + { + int STRIDE = stride(); + It t = beg + flattenedThreadId(); + + for(; t < end; t += STRIDE) + *t = value; + } + + template + static __device__ __forceinline__ void yota(OutIt beg, OutIt end, T value) + { + int STRIDE = stride(); + int tid = flattenedThreadId(); + value += tid; + + for(OutIt t = beg + tid; t < end; t += STRIDE, value += STRIDE) + *t = value; + } + + template + static __device__ __forceinline__ void copy(InIt beg, InIt end, OutIt out) + { + int STRIDE = stride(); + InIt t = beg + flattenedThreadId(); + OutIt o = out + (t - beg); + + for(; t < end; t += STRIDE, o += STRIDE) + *o = *t; + } + + template + static __device__ __forceinline__ void transform(InIt beg, InIt end, OutIt out, UnOp op) + { + int STRIDE = stride(); + InIt t = beg + flattenedThreadId(); + OutIt o = out + (t - beg); + + for(; t < end; t += STRIDE, o += STRIDE) + *o = op(*t); + } + + template + static __device__ __forceinline__ void transform(InIt1 beg1, InIt1 end1, InIt2 beg2, OutIt out, BinOp op) + { + int STRIDE = stride(); + InIt1 t1 = beg1 + flattenedThreadId(); + InIt2 t2 = beg2 + flattenedThreadId(); + OutIt o = out + (t1 - beg1); + + for(; t1 < end1; t1 += STRIDE, t2 += STRIDE, o += STRIDE) + *o = op(*t1, *t2); + } + + template + static __device__ __forceinline__ void reduce(volatile T* buffer, BinOp op) + { + int tid = flattenedThreadId(); + T val = buffer[tid]; + + if (CTA_SIZE >= 1024) { if (tid < 512) buffer[tid] = val = op(val, buffer[tid + 512]); __syncthreads(); } + if (CTA_SIZE >= 512) { if (tid < 256) buffer[tid] = val = op(val, buffer[tid + 256]); __syncthreads(); } + if (CTA_SIZE >= 256) { if (tid < 128) buffer[tid] = val = op(val, buffer[tid + 128]); __syncthreads(); } + if (CTA_SIZE >= 128) { if (tid < 64) buffer[tid] = val = op(val, buffer[tid + 64]); __syncthreads(); } + + if (tid < 32) + { + if (CTA_SIZE >= 64) { buffer[tid] = val = op(val, buffer[tid + 32]); } + if (CTA_SIZE >= 32) { buffer[tid] = val = op(val, buffer[tid + 16]); } + if (CTA_SIZE >= 16) { buffer[tid] = val = op(val, buffer[tid + 8]); } + if (CTA_SIZE >= 8) { buffer[tid] = val = op(val, buffer[tid + 4]); } + if (CTA_SIZE >= 4) { buffer[tid] = val = op(val, buffer[tid + 2]); } + if (CTA_SIZE >= 2) { buffer[tid] = val = op(val, buffer[tid + 1]); } + } + } + + template + static __device__ __forceinline__ T reduce(volatile T* buffer, T init, BinOp op) + { + int tid = flattenedThreadId(); + T val = buffer[tid] = init; + __syncthreads(); + + if (CTA_SIZE >= 1024) { if (tid < 512) buffer[tid] = val = op(val, buffer[tid + 512]); __syncthreads(); } + if (CTA_SIZE >= 512) { if (tid < 256) buffer[tid] = val = op(val, buffer[tid + 256]); __syncthreads(); } + if (CTA_SIZE >= 256) { if (tid < 128) buffer[tid] = val = op(val, buffer[tid + 128]); __syncthreads(); } + if (CTA_SIZE >= 128) { if (tid < 64) buffer[tid] = val = op(val, buffer[tid + 64]); __syncthreads(); } + + if (tid < 32) + { + if (CTA_SIZE >= 64) { buffer[tid] = val = op(val, buffer[tid + 32]); } + if (CTA_SIZE >= 32) { buffer[tid] = val = op(val, buffer[tid + 16]); } + if (CTA_SIZE >= 16) { buffer[tid] = val = op(val, buffer[tid + 8]); } + if (CTA_SIZE >= 8) { buffer[tid] = val = op(val, buffer[tid + 4]); } + if (CTA_SIZE >= 4) { buffer[tid] = val = op(val, buffer[tid + 2]); } + if (CTA_SIZE >= 2) { buffer[tid] = val = op(val, buffer[tid + 1]); } + } + __syncthreads(); + return buffer[0]; + } + + template + static __device__ __forceinline__ void reduce_n(T* data, unsigned int n, BinOp op) + { + int ftid = flattenedThreadId(); + int sft = stride(); + + if (sft < n) + { + for (unsigned int i = sft + ftid; i < n; i += sft) + data[ftid] = op(data[ftid], data[i]); + + __syncthreads(); + + n = sft; + } + + while (n > 1) + { + unsigned int half = n/2; + + if (ftid < half) + data[ftid] = op(data[ftid], data[n - ftid - 1]); + + __syncthreads(); + + n = n - half; + } + } + }; +}}} + +//! @endcond + +#endif /* OPENCV_CUDA_DEVICE_BLOCK_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/border_interpolate.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/border_interpolate.hpp new file mode 100644 index 0000000..874f705 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/border_interpolate.hpp @@ -0,0 +1,722 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_BORDER_INTERPOLATE_HPP +#define OPENCV_CUDA_BORDER_INTERPOLATE_HPP + +#include "saturate_cast.hpp" +#include "vec_traits.hpp" +#include "vec_math.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + ////////////////////////////////////////////////////////////// + // BrdConstant + + template struct BrdRowConstant + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdRowConstant(int width_, const D& val_ = VecTraits::all(0)) : width(width_), val(val_) {} + + template __device__ __forceinline__ D at_low(int x, const T* data) const + { + return x >= 0 ? saturate_cast(data[x]) : val; + } + + template __device__ __forceinline__ D at_high(int x, const T* data) const + { + return x < width ? saturate_cast(data[x]) : val; + } + + template __device__ __forceinline__ D at(int x, const T* data) const + { + return (x >= 0 && x < width) ? saturate_cast(data[x]) : val; + } + + int width; + D val; + }; + + template struct BrdColConstant + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdColConstant(int height_, const D& val_ = VecTraits::all(0)) : height(height_), val(val_) {} + + template __device__ __forceinline__ D at_low(int y, const T* data, size_t step) const + { + return y >= 0 ? saturate_cast(*(const T*)((const char*)data + y * step)) : val; + } + + template __device__ __forceinline__ D at_high(int y, const T* data, size_t step) const + { + return y < height ? saturate_cast(*(const T*)((const char*)data + y * step)) : val; + } + + template __device__ __forceinline__ D at(int y, const T* data, size_t step) const + { + return (y >= 0 && y < height) ? saturate_cast(*(const T*)((const char*)data + y * step)) : val; + } + + int height; + D val; + }; + + template struct BrdConstant + { + typedef D result_type; + + __host__ __device__ __forceinline__ BrdConstant(int height_, int width_, const D& val_ = VecTraits::all(0)) : height(height_), width(width_), val(val_) + { + } + + template __device__ __forceinline__ D at(int y, int x, const T* data, size_t step) const + { + return (x >= 0 && x < width && y >= 0 && y < height) ? saturate_cast(((const T*)((const uchar*)data + y * step))[x]) : val; + } + + template __device__ __forceinline__ D at(typename Ptr2D::index_type y, typename Ptr2D::index_type x, const Ptr2D& src) const + { + return (x >= 0 && x < width && y >= 0 && y < height) ? saturate_cast(src(y, x)) : val; + } + + int height; + int width; + D val; + }; + + ////////////////////////////////////////////////////////////// + // BrdReplicate + + template struct BrdRowReplicate + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdRowReplicate(int width) : last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdRowReplicate(int width, U) : last_col(width - 1) {} + + __device__ __forceinline__ int idx_col_low(int x) const + { + return ::max(x, 0); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return ::min(x, last_col); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_low(idx_col_high(x)); + } + + template __device__ __forceinline__ D at_low(int x, const T* data) const + { + return saturate_cast(data[idx_col_low(x)]); + } + + template __device__ __forceinline__ D at_high(int x, const T* data) const + { + return saturate_cast(data[idx_col_high(x)]); + } + + template __device__ __forceinline__ D at(int x, const T* data) const + { + return saturate_cast(data[idx_col(x)]); + } + + int last_col; + }; + + template struct BrdColReplicate + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdColReplicate(int height) : last_row(height - 1) {} + template __host__ __device__ __forceinline__ BrdColReplicate(int height, U) : last_row(height - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return ::max(y, 0); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return ::min(y, last_row); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_low(idx_row_high(y)); + } + + template __device__ __forceinline__ D at_low(int y, const T* data, size_t step) const + { + return saturate_cast(*(const T*)((const char*)data + idx_row_low(y) * step)); + } + + template __device__ __forceinline__ D at_high(int y, const T* data, size_t step) const + { + return saturate_cast(*(const T*)((const char*)data + idx_row_high(y) * step)); + } + + template __device__ __forceinline__ D at(int y, const T* data, size_t step) const + { + return saturate_cast(*(const T*)((const char*)data + idx_row(y) * step)); + } + + int last_row; + }; + + template struct BrdReplicate + { + typedef D result_type; + + __host__ __device__ __forceinline__ BrdReplicate(int height, int width) : last_row(height - 1), last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdReplicate(int height, int width, U) : last_row(height - 1), last_col(width - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return ::max(y, 0); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return ::min(y, last_row); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_low(idx_row_high(y)); + } + + __device__ __forceinline__ int idx_col_low(int x) const + { + return ::max(x, 0); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return ::min(x, last_col); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_low(idx_col_high(x)); + } + + template __device__ __forceinline__ D at(int y, int x, const T* data, size_t step) const + { + return saturate_cast(((const T*)((const char*)data + idx_row(y) * step))[idx_col(x)]); + } + + template __device__ __forceinline__ D at(typename Ptr2D::index_type y, typename Ptr2D::index_type x, const Ptr2D& src) const + { + return saturate_cast(src(idx_row(y), idx_col(x))); + } + + int last_row; + int last_col; + }; + + ////////////////////////////////////////////////////////////// + // BrdReflect101 + + template struct BrdRowReflect101 + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdRowReflect101(int width) : last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdRowReflect101(int width, U) : last_col(width - 1) {} + + __device__ __forceinline__ int idx_col_low(int x) const + { + return ::abs(x) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return ::abs(last_col - ::abs(last_col - x)) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_low(idx_col_high(x)); + } + + template __device__ __forceinline__ D at_low(int x, const T* data) const + { + return saturate_cast(data[idx_col_low(x)]); + } + + template __device__ __forceinline__ D at_high(int x, const T* data) const + { + return saturate_cast(data[idx_col_high(x)]); + } + + template __device__ __forceinline__ D at(int x, const T* data) const + { + return saturate_cast(data[idx_col(x)]); + } + + int last_col; + }; + + template struct BrdColReflect101 + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdColReflect101(int height) : last_row(height - 1) {} + template __host__ __device__ __forceinline__ BrdColReflect101(int height, U) : last_row(height - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return ::abs(y) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return ::abs(last_row - ::abs(last_row - y)) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_low(idx_row_high(y)); + } + + template __device__ __forceinline__ D at_low(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_low(y) * step)); + } + + template __device__ __forceinline__ D at_high(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_high(y) * step)); + } + + template __device__ __forceinline__ D at(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row(y) * step)); + } + + int last_row; + }; + + template struct BrdReflect101 + { + typedef D result_type; + + __host__ __device__ __forceinline__ BrdReflect101(int height, int width) : last_row(height - 1), last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdReflect101(int height, int width, U) : last_row(height - 1), last_col(width - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return ::abs(y) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return ::abs(last_row - ::abs(last_row - y)) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_low(idx_row_high(y)); + } + + __device__ __forceinline__ int idx_col_low(int x) const + { + return ::abs(x) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return ::abs(last_col - ::abs(last_col - x)) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_low(idx_col_high(x)); + } + + template __device__ __forceinline__ D at(int y, int x, const T* data, size_t step) const + { + return saturate_cast(((const T*)((const char*)data + idx_row(y) * step))[idx_col(x)]); + } + + template __device__ __forceinline__ D at(typename Ptr2D::index_type y, typename Ptr2D::index_type x, const Ptr2D& src) const + { + return saturate_cast(src(idx_row(y), idx_col(x))); + } + + int last_row; + int last_col; + }; + + ////////////////////////////////////////////////////////////// + // BrdReflect + + template struct BrdRowReflect + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdRowReflect(int width) : last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdRowReflect(int width, U) : last_col(width - 1) {} + + __device__ __forceinline__ int idx_col_low(int x) const + { + return (::abs(x) - (x < 0)) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return ::abs(last_col - ::abs(last_col - x) + (x > last_col)) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_high(::abs(x) - (x < 0)); + } + + template __device__ __forceinline__ D at_low(int x, const T* data) const + { + return saturate_cast(data[idx_col_low(x)]); + } + + template __device__ __forceinline__ D at_high(int x, const T* data) const + { + return saturate_cast(data[idx_col_high(x)]); + } + + template __device__ __forceinline__ D at(int x, const T* data) const + { + return saturate_cast(data[idx_col(x)]); + } + + int last_col; + }; + + template struct BrdColReflect + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdColReflect(int height) : last_row(height - 1) {} + template __host__ __device__ __forceinline__ BrdColReflect(int height, U) : last_row(height - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return (::abs(y) - (y < 0)) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return ::abs(last_row - ::abs(last_row - y) + (y > last_row)) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_high(::abs(y) - (y < 0)); + } + + template __device__ __forceinline__ D at_low(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_low(y) * step)); + } + + template __device__ __forceinline__ D at_high(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_high(y) * step)); + } + + template __device__ __forceinline__ D at(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row(y) * step)); + } + + int last_row; + }; + + template struct BrdReflect + { + typedef D result_type; + + __host__ __device__ __forceinline__ BrdReflect(int height, int width) : last_row(height - 1), last_col(width - 1) {} + template __host__ __device__ __forceinline__ BrdReflect(int height, int width, U) : last_row(height - 1), last_col(width - 1) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return (::abs(y) - (y < 0)) % (last_row + 1); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return /*::abs*/(last_row - ::abs(last_row - y) + (y > last_row)) /*% (last_row + 1)*/; + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_low(idx_row_high(y)); + } + + __device__ __forceinline__ int idx_col_low(int x) const + { + return (::abs(x) - (x < 0)) % (last_col + 1); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return (last_col - ::abs(last_col - x) + (x > last_col)); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_low(idx_col_high(x)); + } + + template __device__ __forceinline__ D at(int y, int x, const T* data, size_t step) const + { + return saturate_cast(((const T*)((const char*)data + idx_row(y) * step))[idx_col(x)]); + } + + template __device__ __forceinline__ D at(typename Ptr2D::index_type y, typename Ptr2D::index_type x, const Ptr2D& src) const + { + return saturate_cast(src(idx_row(y), idx_col(x))); + } + + int last_row; + int last_col; + }; + + ////////////////////////////////////////////////////////////// + // BrdWrap + + template struct BrdRowWrap + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdRowWrap(int width_) : width(width_) {} + template __host__ __device__ __forceinline__ BrdRowWrap(int width_, U) : width(width_) {} + + __device__ __forceinline__ int idx_col_low(int x) const + { + return (x >= 0) * x + (x < 0) * (x - ((x - width + 1) / width) * width); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return (x < width) * x + (x >= width) * (x % width); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_high(idx_col_low(x)); + } + + template __device__ __forceinline__ D at_low(int x, const T* data) const + { + return saturate_cast(data[idx_col_low(x)]); + } + + template __device__ __forceinline__ D at_high(int x, const T* data) const + { + return saturate_cast(data[idx_col_high(x)]); + } + + template __device__ __forceinline__ D at(int x, const T* data) const + { + return saturate_cast(data[idx_col(x)]); + } + + int width; + }; + + template struct BrdColWrap + { + typedef D result_type; + + explicit __host__ __device__ __forceinline__ BrdColWrap(int height_) : height(height_) {} + template __host__ __device__ __forceinline__ BrdColWrap(int height_, U) : height(height_) {} + + __device__ __forceinline__ int idx_row_low(int y) const + { + return (y >= 0) * y + (y < 0) * (y - ((y - height + 1) / height) * height); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return (y < height) * y + (y >= height) * (y % height); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_high(idx_row_low(y)); + } + + template __device__ __forceinline__ D at_low(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_low(y) * step)); + } + + template __device__ __forceinline__ D at_high(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row_high(y) * step)); + } + + template __device__ __forceinline__ D at(int y, const T* data, size_t step) const + { + return saturate_cast(*(const D*)((const char*)data + idx_row(y) * step)); + } + + int height; + }; + + template struct BrdWrap + { + typedef D result_type; + + __host__ __device__ __forceinline__ BrdWrap(int height_, int width_) : + height(height_), width(width_) + { + } + template + __host__ __device__ __forceinline__ BrdWrap(int height_, int width_, U) : + height(height_), width(width_) + { + } + + __device__ __forceinline__ int idx_row_low(int y) const + { + return (y >= 0) ? y : (y - ((y - height + 1) / height) * height); + } + + __device__ __forceinline__ int idx_row_high(int y) const + { + return (y < height) ? y : (y % height); + } + + __device__ __forceinline__ int idx_row(int y) const + { + return idx_row_high(idx_row_low(y)); + } + + __device__ __forceinline__ int idx_col_low(int x) const + { + return (x >= 0) ? x : (x - ((x - width + 1) / width) * width); + } + + __device__ __forceinline__ int idx_col_high(int x) const + { + return (x < width) ? x : (x % width); + } + + __device__ __forceinline__ int idx_col(int x) const + { + return idx_col_high(idx_col_low(x)); + } + + template __device__ __forceinline__ D at(int y, int x, const T* data, size_t step) const + { + return saturate_cast(((const T*)((const char*)data + idx_row(y) * step))[idx_col(x)]); + } + + template __device__ __forceinline__ D at(typename Ptr2D::index_type y, typename Ptr2D::index_type x, const Ptr2D& src) const + { + return saturate_cast(src(idx_row(y), idx_col(x))); + } + + int height; + int width; + }; + + ////////////////////////////////////////////////////////////// + // BorderReader + + template struct BorderReader + { + typedef typename B::result_type elem_type; + typedef typename Ptr2D::index_type index_type; + + __host__ __device__ __forceinline__ BorderReader(const Ptr2D& ptr_, const B& b_) : ptr(ptr_), b(b_) {} + + __device__ __forceinline__ elem_type operator ()(index_type y, index_type x) const + { + return b.at(y, x, ptr); + } + + Ptr2D ptr; + B b; + }; + + // under win32 there is some bug with templated types that passed as kernel parameters + // with this specialization all works fine + template struct BorderReader< Ptr2D, BrdConstant > + { + typedef typename BrdConstant::result_type elem_type; + typedef typename Ptr2D::index_type index_type; + + __host__ __device__ __forceinline__ BorderReader(const Ptr2D& src_, const BrdConstant& b) : + src(src_), height(b.height), width(b.width), val(b.val) + { + } + + __device__ __forceinline__ D operator ()(index_type y, index_type x) const + { + return (x >= 0 && x < width && y >= 0 && y < height) ? saturate_cast(src(y, x)) : val; + } + + Ptr2D src; + int height; + int width; + D val; + }; +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_BORDER_INTERPOLATE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/color.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/color.hpp new file mode 100644 index 0000000..dcce280 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/color.hpp @@ -0,0 +1,309 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_COLOR_HPP +#define OPENCV_CUDA_COLOR_HPP + +#include "detail/color_detail.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + // All OPENCV_CUDA_IMPLEMENT_*_TRAITS(ColorSpace1_to_ColorSpace2, ...) macros implements + // template class ColorSpace1_to_ColorSpace2_traits + // { + // typedef ... functor_type; + // static __host__ __device__ functor_type create_functor(); + // }; + + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgr_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(bgra_to_rgba, 4, 4, 2) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(bgr_to_bgr555, 3, 0, 5) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(bgr_to_bgr565, 3, 0, 6) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(rgb_to_bgr555, 3, 2, 5) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(rgb_to_bgr565, 3, 2, 6) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(bgra_to_bgr555, 4, 0, 5) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(bgra_to_bgr565, 4, 0, 6) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(rgba_to_bgr555, 4, 2, 5) + OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(rgba_to_bgr565, 4, 2, 6) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_rgb, 3, 2, 5) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_rgb, 3, 2, 6) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_bgr, 3, 0, 5) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_bgr, 3, 0, 6) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_rgba, 4, 2, 5) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_rgba, 4, 2, 6) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr555_to_bgra, 4, 0, 5) + OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(bgr565_to_bgra, 4, 0, 6) + + #undef OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_GRAY2RGB_TRAITS(gray_to_bgr, 3) + OPENCV_CUDA_IMPLEMENT_GRAY2RGB_TRAITS(gray_to_bgra, 4) + + #undef OPENCV_CUDA_IMPLEMENT_GRAY2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_GRAY2RGB5x5_TRAITS(gray_to_bgr555, 5) + OPENCV_CUDA_IMPLEMENT_GRAY2RGB5x5_TRAITS(gray_to_bgr565, 6) + + #undef OPENCV_CUDA_IMPLEMENT_GRAY2RGB5x5_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB5x52GRAY_TRAITS(bgr555_to_gray, 5) + OPENCV_CUDA_IMPLEMENT_RGB5x52GRAY_TRAITS(bgr565_to_gray, 6) + + #undef OPENCV_CUDA_IMPLEMENT_RGB5x52GRAY_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS(rgb_to_gray, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS(bgr_to_gray, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS(rgba_to_gray, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS(bgra_to_gray, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv4, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv4, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv4, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv4, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS + + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgba, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgr, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgra, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(rgb_to_YCrCb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(rgba_to_YCrCb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(rgb_to_YCrCb4, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(rgba_to_YCrCb4, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(bgr_to_YCrCb, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(bgra_to_YCrCb, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(bgr_to_YCrCb4, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(bgra_to_YCrCb4, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS + + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_rgba, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_bgr, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(YCrCb4_to_bgra, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(rgb_to_xyz, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(rgba_to_xyz, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(rgb_to_xyz4, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(rgba_to_xyz4, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(bgr_to_xyz, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(bgra_to_xyz, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(bgr_to_xyz4, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(bgra_to_xyz4, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS + + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_rgba, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_bgr, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(xyz4_to_bgra, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(rgb_to_hsv, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(rgba_to_hsv, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(rgb_to_hsv4, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(rgba_to_hsv4, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(bgr_to_hsv, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(bgra_to_hsv, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(bgr_to_hsv4, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(bgra_to_hsv4, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS + + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_rgba, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_bgr, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(hsv4_to_bgra, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(rgb_to_hls, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(rgba_to_hls, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(rgb_to_hls4, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(rgba_to_hls4, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(bgr_to_hls, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(bgra_to_hls, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(bgr_to_hls4, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(bgra_to_hls4, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS + + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls_to_rgb, 3, 3, 2) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls_to_rgba, 3, 4, 2) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_rgb, 4, 3, 2) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_rgba, 4, 4, 2) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls_to_bgr, 3, 3, 0) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls_to_bgra, 3, 4, 0) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_bgr, 4, 3, 0) + OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(hls4_to_bgra, 4, 4, 0) + + #undef OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(rgb_to_lab, 3, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(rgba_to_lab, 4, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(rgb_to_lab4, 3, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(rgba_to_lab4, 4, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(bgr_to_lab, 3, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(bgra_to_lab, 4, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(bgr_to_lab4, 3, 4, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(bgra_to_lab4, 4, 4, true, 0) + + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lrgb_to_lab, 3, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lrgba_to_lab, 4, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lrgb_to_lab4, 3, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lrgba_to_lab4, 4, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lbgr_to_lab, 3, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lbgra_to_lab, 4, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lbgr_to_lab4, 3, 4, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(lbgra_to_lab4, 4, 4, false, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS + + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_rgb, 3, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_rgb, 4, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_rgba, 3, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_rgba, 4, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_bgr, 3, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_bgr, 4, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_bgra, 3, 4, true, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_bgra, 4, 4, true, 0) + + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_lrgb, 3, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_lrgb, 4, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_lrgba, 3, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_lrgba, 4, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_lbgr, 3, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_lbgr, 4, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab_to_lbgra, 3, 4, false, 0) + OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(lab4_to_lbgra, 4, 4, false, 0) + + #undef OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS + + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(rgb_to_luv, 3, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(rgba_to_luv, 4, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(rgb_to_luv4, 3, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(rgba_to_luv4, 4, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(bgr_to_luv, 3, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(bgra_to_luv, 4, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(bgr_to_luv4, 3, 4, true, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(bgra_to_luv4, 4, 4, true, 0) + + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lrgb_to_luv, 3, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lrgba_to_luv, 4, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lrgb_to_luv4, 3, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lrgba_to_luv4, 4, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lbgr_to_luv, 3, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lbgra_to_luv, 4, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lbgr_to_luv4, 3, 4, false, 0) + OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(lbgra_to_luv4, 4, 4, false, 0) + + #undef OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS + + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_rgb, 3, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_rgb, 4, 3, true, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_rgba, 3, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_rgba, 4, 4, true, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_bgr, 3, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_bgr, 4, 3, true, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_bgra, 3, 4, true, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_bgra, 4, 4, true, 0) + + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_lrgb, 3, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_lrgb, 4, 3, false, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_lrgba, 3, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_lrgba, 4, 4, false, 2) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_lbgr, 3, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_lbgr, 4, 3, false, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv_to_lbgra, 3, 4, false, 0) + OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(luv4_to_lbgra, 4, 4, false, 0) + + #undef OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_COLOR_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/common.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/common.hpp new file mode 100644 index 0000000..1348096 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/common.hpp @@ -0,0 +1,131 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_COMMON_HPP +#define OPENCV_CUDA_COMMON_HPP + +#include +#include "opencv2/core/cuda_types.hpp" +#include "opencv2/core/cvdef.h" +#include "opencv2/core/base.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +#ifndef CV_PI_F + #ifndef CV_PI + #define CV_PI_F 3.14159265f + #else + #define CV_PI_F ((float)CV_PI) + #endif +#endif + +namespace cv { namespace cuda { + static inline void checkCudaError(cudaError_t err, const char* file, const int line, const char* func) + { + if (cudaSuccess != err) { + cudaGetLastError(); // reset the last stored error to cudaSuccess + cv::error(cv::Error::GpuApiCallError, cudaGetErrorString(err), func, file, line); + } + } +}} + +#ifndef cudaSafeCall + #define cudaSafeCall(expr) cv::cuda::checkCudaError(expr, __FILE__, __LINE__, CV_Func) +#endif + +namespace cv { namespace cuda +{ + template static inline bool isAligned(const T* ptr, size_t size) + { + return reinterpret_cast(ptr) % size == 0; + } + + static inline bool isAligned(size_t step, size_t size) + { + return step % size == 0; + } +}} + +namespace cv { namespace cuda +{ + namespace device + { + __host__ __device__ __forceinline__ int divUp(int total, int grain) + { + return (total + grain - 1) / grain; + } + +#if (CUDART_VERSION >= 12000) + template inline void createTextureObjectPitch2D(cudaTextureObject_t* tex, PtrStepSz& img, const cudaTextureDesc& texDesc) { + CV_Error(cv::Error::GpuNotSupported, "Function removed in CUDA SDK 12"); } +#else + //TODO: remove from OpenCV 5.x + template inline void bindTexture(const textureReference* tex, const PtrStepSz& img) + { + cudaChannelFormatDesc desc = cudaCreateChannelDesc(); + cudaSafeCall( cudaBindTexture2D(0, tex, img.ptr(), &desc, img.cols, img.rows, img.step) ); + } + + template inline void createTextureObjectPitch2D(cudaTextureObject_t* tex, PtrStepSz& img, const cudaTextureDesc& texDesc) + { + cudaResourceDesc resDesc; + memset(&resDesc, 0, sizeof(resDesc)); + resDesc.resType = cudaResourceTypePitch2D; + resDesc.res.pitch2D.devPtr = static_cast(img.ptr()); + resDesc.res.pitch2D.height = img.rows; + resDesc.res.pitch2D.width = img.cols; + resDesc.res.pitch2D.pitchInBytes = img.step; + resDesc.res.pitch2D.desc = cudaCreateChannelDesc(); + + cudaSafeCall( cudaCreateTextureObject(tex, &resDesc, &texDesc, NULL) ); + } +#endif + } +}} + +//! @endcond + +#endif // OPENCV_CUDA_COMMON_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/datamov_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/datamov_utils.hpp new file mode 100644 index 0000000..6820d0f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/datamov_utils.hpp @@ -0,0 +1,113 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_DATAMOV_UTILS_HPP +#define OPENCV_CUDA_DATAMOV_UTILS_HPP + +#include "common.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 200 + + // for Fermi memory space is detected automatically + template struct ForceGlob + { + __device__ __forceinline__ static void Load(const T* ptr, int offset, T& val) { val = ptr[offset]; } + }; + + #else // __CUDA_ARCH__ >= 200 + + #if defined(_WIN64) || defined(__LP64__) + // 64-bit register modifier for inlined asm + #define OPENCV_CUDA_ASM_PTR "l" + #else + // 32-bit register modifier for inlined asm + #define OPENCV_CUDA_ASM_PTR "r" + #endif + + template struct ForceGlob; + + #define OPENCV_CUDA_DEFINE_FORCE_GLOB(base_type, ptx_type, reg_mod) \ + template <> struct ForceGlob \ + { \ + __device__ __forceinline__ static void Load(const base_type* ptr, int offset, base_type& val) \ + { \ + asm("ld.global."#ptx_type" %0, [%1];" : "="#reg_mod(val) : OPENCV_CUDA_ASM_PTR(ptr + offset)); \ + } \ + }; + + #define OPENCV_CUDA_DEFINE_FORCE_GLOB_B(base_type, ptx_type) \ + template <> struct ForceGlob \ + { \ + __device__ __forceinline__ static void Load(const base_type* ptr, int offset, base_type& val) \ + { \ + asm("ld.global."#ptx_type" %0, [%1];" : "=r"(*reinterpret_cast(&val)) : OPENCV_CUDA_ASM_PTR(ptr + offset)); \ + } \ + }; + + OPENCV_CUDA_DEFINE_FORCE_GLOB_B(uchar, u8) + OPENCV_CUDA_DEFINE_FORCE_GLOB_B(schar, s8) + OPENCV_CUDA_DEFINE_FORCE_GLOB_B(char, b8) + OPENCV_CUDA_DEFINE_FORCE_GLOB (ushort, u16, h) + OPENCV_CUDA_DEFINE_FORCE_GLOB (short, s16, h) + OPENCV_CUDA_DEFINE_FORCE_GLOB (uint, u32, r) + OPENCV_CUDA_DEFINE_FORCE_GLOB (int, s32, r) + OPENCV_CUDA_DEFINE_FORCE_GLOB (float, f32, f) + OPENCV_CUDA_DEFINE_FORCE_GLOB (double, f64, d) + + #undef OPENCV_CUDA_DEFINE_FORCE_GLOB + #undef OPENCV_CUDA_DEFINE_FORCE_GLOB_B + #undef OPENCV_CUDA_ASM_PTR + + #endif // __CUDA_ARCH__ >= 200 +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_DATAMOV_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/color_detail.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/color_detail.hpp new file mode 100644 index 0000000..f4b4796 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/color_detail.hpp @@ -0,0 +1,2018 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_COLOR_DETAIL_HPP +#define OPENCV_CUDA_COLOR_DETAIL_HPP + +#include "../common.hpp" +#include "../vec_traits.hpp" +#include "../saturate_cast.hpp" +#include "../limits.hpp" +#include "../functional.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + #ifndef CV_DESCALE + #define CV_DESCALE(x, n) (((x) + (1 << ((n)-1))) >> (n)) + #endif + + namespace color_detail + { + template struct ColorChannel + { + typedef float worktype_f; + static __device__ __forceinline__ T max() { return numeric_limits::max(); } + static __device__ __forceinline__ T half() { return (T)(max()/2 + 1); } + }; + + template<> struct ColorChannel + { + typedef float worktype_f; + static __device__ __forceinline__ float max() { return 1.f; } + static __device__ __forceinline__ float half() { return 0.5f; } + }; + + template static __device__ __forceinline__ void setAlpha(typename TypeVec::vec_type& vec, T val) + { + } + + template static __device__ __forceinline__ void setAlpha(typename TypeVec::vec_type& vec, T val) + { + vec.w = val; + } + + template static __device__ __forceinline__ T getAlpha(const typename TypeVec::vec_type& vec) + { + return ColorChannel::max(); + } + + template static __device__ __forceinline__ T getAlpha(const typename TypeVec::vec_type& vec) + { + return vec.w; + } + + //constants for conversion from/to RGB and Gray, YUV, YCrCb according to BT.601 + constexpr float B2YF = 0.114f; + constexpr float G2YF = 0.587f; + constexpr float R2YF = 0.299f; + + //to YCbCr + constexpr float YCBF = 0.564f; // == 1/2/(1-B2YF) + constexpr float YCRF = 0.713f; // == 1/2/(1-R2YF) + const int YCBI = 9241; // == YCBF*16384 + const int YCRI = 11682; // == YCRF*16384 + //to YUV + constexpr float B2UF = 0.492f; + constexpr float R2VF = 0.877f; + const int B2UI = 8061; // == B2UF*16384 + const int R2VI = 14369; // == R2VF*16384 + //from YUV + constexpr float U2BF = 2.032f; + constexpr float U2GF = -0.395f; + constexpr float V2GF = -0.581f; + constexpr float V2RF = 1.140f; + const int U2BI = 33292; + const int U2GI = -6472; + const int V2GI = -9519; + const int V2RI = 18678; + //from YCrCb + constexpr float CB2BF = 1.773f; + constexpr float CB2GF = -0.344f; + constexpr float CR2GF = -0.714f; + constexpr float CR2RF = 1.403f; + const int CB2BI = 29049; + const int CB2GI = -5636; + const int CR2GI = -11698; + const int CR2RI = 22987; + + enum + { + yuv_shift = 14, + xyz_shift = 12, + gray_shift = 15, + R2Y = 4899, + G2Y = 9617, + B2Y = 1868, + RY15 = 9798, // == R2YF*32768 + 0.5 + GY15 = 19235, // == G2YF*32768 + 0.5 + BY15 = 3735, // == B2YF*32768 + 0.5 + BLOCK_SIZE = 256 + }; + } + +////////////////// Various 3/4-channel to 3/4-channel RGB transformations ///////////////// + + namespace color_detail + { + template struct RGB2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + dst.x = (&src.x)[bidx]; + dst.y = src.y; + dst.z = (&src.x)[bidx^2]; + setAlpha(dst, getAlpha(src)); + + return dst; + } + + __host__ __device__ __forceinline__ RGB2RGB() {} + __host__ __device__ __forceinline__ RGB2RGB(const RGB2RGB&) {} + }; + + template <> struct RGB2RGB : unary_function + { + __device__ uint operator()(uint src) const + { + uint dst = 0; + + dst |= (0xffu & (src >> 16)); + dst |= (0xffu & (src >> 8)) << 8; + dst |= (0xffu & (src)) << 16; + dst |= (0xffu & (src >> 24)) << 24; + + return dst; + } + + __host__ __device__ __forceinline__ RGB2RGB() {} + __host__ __device__ __forceinline__ RGB2RGB(const RGB2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +/////////// Transforming 16-bit (565 or 555) RGB to/from 24/32-bit (888[8]) RGB ////////// + + namespace color_detail + { + template struct RGB2RGB5x5Converter; + template struct RGB2RGB5x5Converter<6, bidx> + { + static __device__ __forceinline__ ushort cvt(const uchar3& src) + { + return (ushort)(((&src.x)[bidx] >> 3) | ((src.y & ~3) << 3) | (((&src.x)[bidx^2] & ~7) << 8)); + } + + static __device__ __forceinline__ ushort cvt(uint src) + { + uint b = 0xffu & (src >> (bidx * 8)); + uint g = 0xffu & (src >> 8); + uint r = 0xffu & (src >> ((bidx ^ 2) * 8)); + return (ushort)((b >> 3) | ((g & ~3) << 3) | ((r & ~7) << 8)); + } + }; + + template struct RGB2RGB5x5Converter<5, bidx> + { + static __device__ __forceinline__ ushort cvt(const uchar3& src) + { + return (ushort)(((&src.x)[bidx] >> 3) | ((src.y & ~7) << 2) | (((&src.x)[bidx^2] & ~7) << 7)); + } + + static __device__ __forceinline__ ushort cvt(uint src) + { + uint b = 0xffu & (src >> (bidx * 8)); + uint g = 0xffu & (src >> 8); + uint r = 0xffu & (src >> ((bidx ^ 2) * 8)); + uint a = 0xffu & (src >> 24); + return (ushort)((b >> 3) | ((g & ~7) << 2) | ((r & ~7) << 7) | (a * 0x8000)); + } + }; + + template struct RGB2RGB5x5; + + template struct RGB2RGB5x5<3, bidx,green_bits> : unary_function + { + __device__ __forceinline__ ushort operator()(const uchar3& src) const + { + return RGB2RGB5x5Converter::cvt(src); + } + + __host__ __device__ __forceinline__ RGB2RGB5x5() {} + __host__ __device__ __forceinline__ RGB2RGB5x5(const RGB2RGB5x5&) {} + }; + + template struct RGB2RGB5x5<4, bidx,green_bits> : unary_function + { + __device__ __forceinline__ ushort operator()(uint src) const + { + return RGB2RGB5x5Converter::cvt(src); + } + + __host__ __device__ __forceinline__ RGB2RGB5x5() {} + __host__ __device__ __forceinline__ RGB2RGB5x5(const RGB2RGB5x5&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2RGB5x5_TRAITS(name, scn, bidx, green_bits) \ + struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2RGB5x5 functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + template struct RGB5x52RGBConverter; + + template struct RGB5x52RGBConverter<5, bidx> + { + static __device__ __forceinline__ void cvt(uint src, uchar3& dst) + { + (&dst.x)[bidx] = src << 3; + dst.y = (src >> 2) & ~7; + (&dst.x)[bidx ^ 2] = (src >> 7) & ~7; + } + + static __device__ __forceinline__ void cvt(uint src, uint& dst) + { + dst = 0; + + dst |= (0xffu & (src << 3)) << (bidx * 8); + dst |= (0xffu & ((src >> 2) & ~7)) << 8; + dst |= (0xffu & ((src >> 7) & ~7)) << ((bidx ^ 2) * 8); + dst |= ((src & 0x8000) * 0xffu) << 24; + } + }; + + template struct RGB5x52RGBConverter<6, bidx> + { + static __device__ __forceinline__ void cvt(uint src, uchar3& dst) + { + (&dst.x)[bidx] = src << 3; + dst.y = (src >> 3) & ~3; + (&dst.x)[bidx ^ 2] = (src >> 8) & ~7; + } + + static __device__ __forceinline__ void cvt(uint src, uint& dst) + { + dst = 0xffu << 24; + + dst |= (0xffu & (src << 3)) << (bidx * 8); + dst |= (0xffu &((src >> 3) & ~3)) << 8; + dst |= (0xffu & ((src >> 8) & ~7)) << ((bidx ^ 2) * 8); + } + }; + + template struct RGB5x52RGB; + + template struct RGB5x52RGB<3, bidx, green_bits> : unary_function + { + __device__ __forceinline__ uchar3 operator()(ushort src) const + { + uchar3 dst; + RGB5x52RGBConverter::cvt(src, dst); + return dst; + } + __host__ __device__ __forceinline__ RGB5x52RGB() {} + __host__ __device__ __forceinline__ RGB5x52RGB(const RGB5x52RGB&) {} + + }; + + template struct RGB5x52RGB<4, bidx, green_bits> : unary_function + { + __device__ __forceinline__ uint operator()(ushort src) const + { + uint dst; + RGB5x52RGBConverter::cvt(src, dst); + return dst; + } + __host__ __device__ __forceinline__ RGB5x52RGB() {} + __host__ __device__ __forceinline__ RGB5x52RGB(const RGB5x52RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB5x52RGB_TRAITS(name, dcn, bidx, green_bits) \ + struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB5x52RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////// Grayscale to Color //////////////////////////////// + + namespace color_detail + { + template struct Gray2RGB : unary_function::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(T src) const + { + typename TypeVec::vec_type dst; + + dst.z = dst.y = dst.x = src; + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ Gray2RGB() {} + __host__ __device__ __forceinline__ Gray2RGB(const Gray2RGB&) {} + }; + + template <> struct Gray2RGB : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + uint dst = 0xffu << 24; + + dst |= src; + dst |= src << 8; + dst |= src << 16; + + return dst; + } + __host__ __device__ __forceinline__ Gray2RGB() {} + __host__ __device__ __forceinline__ Gray2RGB(const Gray2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_GRAY2RGB_TRAITS(name, dcn) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::Gray2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + template struct Gray2RGB5x5Converter; + template<> struct Gray2RGB5x5Converter<6> + { + static __device__ __forceinline__ ushort cvt(uint t) + { + return (ushort)((t >> 3) | ((t & ~3) << 3) | ((t & ~7) << 8)); + } + }; + + template<> struct Gray2RGB5x5Converter<5> + { + static __device__ __forceinline__ ushort cvt(uint t) + { + t >>= 3; + return (ushort)(t | (t << 5) | (t << 10)); + } + }; + + template struct Gray2RGB5x5 : unary_function + { + __device__ __forceinline__ ushort operator()(uint src) const + { + return Gray2RGB5x5Converter::cvt(src); + } + + __host__ __device__ __forceinline__ Gray2RGB5x5() {} + __host__ __device__ __forceinline__ Gray2RGB5x5(const Gray2RGB5x5&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_GRAY2RGB5x5_TRAITS(name, green_bits) \ + struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::Gray2RGB5x5 functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////// Color to Grayscale //////////////////////////////// + + namespace color_detail + { + template struct RGB5x52GrayConverter; + template <> struct RGB5x52GrayConverter<6> + { + static __device__ __forceinline__ uchar cvt(uint t) + { + return (uchar)CV_DESCALE(((t << 3) & 0xf8) * BY15 + ((t >> 3) & 0xfc) * GY15 + ((t >> 8) & 0xf8) * RY15, gray_shift); + } + }; + + template <> struct RGB5x52GrayConverter<5> + { + static __device__ __forceinline__ uchar cvt(uint t) + { + return (uchar)CV_DESCALE(((t << 3) & 0xf8) * BY15 + ((t >> 2) & 0xf8) * GY15 + ((t >> 7) & 0xf8) * RY15, gray_shift); + } + }; + + template struct RGB5x52Gray : unary_function + { + __device__ __forceinline__ uchar operator()(uint src) const + { + return RGB5x52GrayConverter::cvt(src); + } + __host__ __device__ __forceinline__ RGB5x52Gray() {} + __host__ __device__ __forceinline__ RGB5x52Gray(const RGB5x52Gray&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB5x52GRAY_TRAITS(name, green_bits) \ + struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB5x52Gray functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + template static __device__ __forceinline__ T RGB2GrayConvert(const T* src) + { + return (T)CV_DESCALE((unsigned)(src[bidx] * BY15 + src[1] * GY15 + src[bidx^2] * RY15), gray_shift); + } + + template static __device__ __forceinline__ uchar RGB2GrayConvert(uint src) + { + uint b = 0xffu & (src >> (bidx * 8)); + uint g = 0xffu & (src >> 8); + uint r = 0xffu & (src >> ((bidx ^ 2) * 8)); + return CV_DESCALE((uint)(b * BY15 + g * GY15 + r * RY15), gray_shift); + } + + template static __device__ __forceinline__ float RGB2GrayConvert(const float* src) + { + return src[bidx] * B2YF + src[1] * G2YF + src[bidx^2] * R2YF; + } + + template struct RGB2Gray : unary_function::vec_type, T> + { + __device__ __forceinline__ T operator()(const typename TypeVec::vec_type& src) const + { + return RGB2GrayConvert(&src.x); + } + __host__ __device__ __forceinline__ RGB2Gray() {} + __host__ __device__ __forceinline__ RGB2Gray(const RGB2Gray&) {} + }; + + template struct RGB2Gray : unary_function + { + __device__ __forceinline__ uchar operator()(uint src) const + { + return RGB2GrayConvert(src); + } + __host__ __device__ __forceinline__ RGB2Gray() {} + __host__ __device__ __forceinline__ RGB2Gray(const RGB2Gray&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2GRAY_TRAITS(name, scn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2Gray functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////////// RGB <-> YUV ////////////////////////////////////// + + namespace color_detail + { + __constant__ float c_RGB2YUVCoeffs_f[5] = { B2YF, G2YF, R2YF, B2UF, R2VF }; + __constant__ int c_RGB2YUVCoeffs_i[5] = { B2Y, G2Y, R2Y, B2UI, R2VI }; + + template static __device__ void RGB2YUVConvert(const T* src, D& dst) + { + const int delta = ColorChannel::half() * (1 << yuv_shift); + + const int Y = CV_DESCALE(src[0] * c_RGB2YUVCoeffs_i[bidx^2] + src[1] * c_RGB2YUVCoeffs_i[1] + src[2] * c_RGB2YUVCoeffs_i[bidx], yuv_shift); + const int Cr = CV_DESCALE((src[bidx^2] - Y) * c_RGB2YUVCoeffs_i[3] + delta, yuv_shift); + const int Cb = CV_DESCALE((src[bidx] - Y) * c_RGB2YUVCoeffs_i[4] + delta, yuv_shift); + + dst.x = saturate_cast(Y); + dst.y = saturate_cast(Cr); + dst.z = saturate_cast(Cb); + } + + template static __device__ __forceinline__ void RGB2YUVConvert(const float* src, D& dst) + { + dst.x = src[0] * c_RGB2YUVCoeffs_f[bidx^2] + src[1] * c_RGB2YUVCoeffs_f[1] + src[2] * c_RGB2YUVCoeffs_f[bidx]; + dst.y = (src[bidx^2] - dst.x) * c_RGB2YUVCoeffs_f[3] + ColorChannel::half(); + dst.z = (src[bidx] - dst.x) * c_RGB2YUVCoeffs_f[4] + ColorChannel::half(); + } + + template struct RGB2YUV + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + RGB2YUVConvert(&src.x, dst); + return dst; + } + __host__ __device__ __forceinline__ RGB2YUV() {} + __host__ __device__ __forceinline__ RGB2YUV(const RGB2YUV&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2YUV_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2YUV functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ float c_YUV2RGBCoeffs_f[5] = { U2BF, U2GF, V2GF, V2RF }; + __constant__ int c_YUV2RGBCoeffs_i[5] = { U2BI, U2GI, V2GI, V2RI }; + + template static __device__ void YUV2RGBConvert(const T& src, D* dst) + { + const int b = src.x + CV_DESCALE((src.z - ColorChannel::half()) * c_YUV2RGBCoeffs_i[3], yuv_shift); + + const int g = src.x + CV_DESCALE((src.z - ColorChannel::half()) * c_YUV2RGBCoeffs_i[2] + + (src.y - ColorChannel::half()) * c_YUV2RGBCoeffs_i[1], yuv_shift); + + const int r = src.x + CV_DESCALE((src.y - ColorChannel::half()) * c_YUV2RGBCoeffs_i[0], yuv_shift); + + dst[bidx] = saturate_cast(b); + dst[1] = saturate_cast(g); + dst[bidx^2] = saturate_cast(r); + } + + template static __device__ uint YUV2RGBConvert(uint src) + { + const int x = 0xff & (src); + const int y = 0xff & (src >> 8); + const int z = 0xff & (src >> 16); + + const int b = x + CV_DESCALE((z - ColorChannel::half()) * c_YUV2RGBCoeffs_i[3], yuv_shift); + + const int g = x + CV_DESCALE((z - ColorChannel::half()) * c_YUV2RGBCoeffs_i[2] + + (y - ColorChannel::half()) * c_YUV2RGBCoeffs_i[1], yuv_shift); + + const int r = x + CV_DESCALE((y - ColorChannel::half()) * c_YUV2RGBCoeffs_i[0], yuv_shift); + + uint dst = 0xffu << 24; + + dst |= saturate_cast(b) << (bidx * 8); + dst |= saturate_cast(g) << 8; + dst |= saturate_cast(r) << ((bidx ^ 2) * 8); + + return dst; + } + + template static __device__ __forceinline__ void YUV2RGBConvert(const T& src, float* dst) + { + dst[bidx] = src.x + (src.z - ColorChannel::half()) * c_YUV2RGBCoeffs_f[3]; + + dst[1] = src.x + (src.z - ColorChannel::half()) * c_YUV2RGBCoeffs_f[2] + + (src.y - ColorChannel::half()) * c_YUV2RGBCoeffs_f[1]; + + dst[bidx^2] = src.x + (src.y - ColorChannel::half()) * c_YUV2RGBCoeffs_f[0]; + } + + template struct YUV2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + YUV2RGBConvert(src, &dst.x); + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ YUV2RGB() {} + __host__ __device__ __forceinline__ YUV2RGB(const YUV2RGB&) {} + }; + + template struct YUV2RGB : unary_function + { + __device__ __forceinline__ uint operator ()(uint src) const + { + return YUV2RGBConvert(src); + } + __host__ __device__ __forceinline__ YUV2RGB() {} + __host__ __device__ __forceinline__ YUV2RGB(const YUV2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_YUV2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::YUV2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////////// RGB <-> YCrCb ////////////////////////////////////// + + namespace color_detail + { + __constant__ float c_RGB2YCrCbCoeffs_f[5] = {R2YF, G2YF, B2YF, YCRF, YCBF}; + __constant__ int c_RGB2YCrCbCoeffs_i[5] = {R2Y, G2Y, B2Y, YCRI, YCBI}; + + template static __device__ void RGB2YCrCbConvert(const T* src, D& dst) + { + const int delta = ColorChannel::half() * (1 << yuv_shift); + + const int Y = CV_DESCALE(src[0] * c_RGB2YCrCbCoeffs_i[bidx^2] + src[1] * c_RGB2YCrCbCoeffs_i[1] + src[2] * c_RGB2YCrCbCoeffs_i[bidx], yuv_shift); + const int Cr = CV_DESCALE((src[bidx^2] - Y) * c_RGB2YCrCbCoeffs_i[3] + delta, yuv_shift); + const int Cb = CV_DESCALE((src[bidx] - Y) * c_RGB2YCrCbCoeffs_i[4] + delta, yuv_shift); + + dst.x = saturate_cast(Y); + dst.y = saturate_cast(Cr); + dst.z = saturate_cast(Cb); + } + + template static __device__ uint RGB2YCrCbConvert(uint src) + { + const int delta = ColorChannel::half() * (1 << yuv_shift); + + const int Y = CV_DESCALE((0xffu & src) * c_RGB2YCrCbCoeffs_i[bidx^2] + (0xffu & (src >> 8)) * c_RGB2YCrCbCoeffs_i[1] + (0xffu & (src >> 16)) * c_RGB2YCrCbCoeffs_i[bidx], yuv_shift); + const int Cr = CV_DESCALE(((0xffu & (src >> ((bidx ^ 2) * 8))) - Y) * c_RGB2YCrCbCoeffs_i[3] + delta, yuv_shift); + const int Cb = CV_DESCALE(((0xffu & (src >> (bidx * 8))) - Y) * c_RGB2YCrCbCoeffs_i[4] + delta, yuv_shift); + + uint dst = 0; + + dst |= saturate_cast(Y); + dst |= saturate_cast(Cr) << 8; + dst |= saturate_cast(Cb) << 16; + + return dst; + } + + template static __device__ __forceinline__ void RGB2YCrCbConvert(const float* src, D& dst) + { + dst.x = src[0] * c_RGB2YCrCbCoeffs_f[bidx^2] + src[1] * c_RGB2YCrCbCoeffs_f[1] + src[2] * c_RGB2YCrCbCoeffs_f[bidx]; + dst.y = (src[bidx^2] - dst.x) * c_RGB2YCrCbCoeffs_f[3] + ColorChannel::half(); + dst.z = (src[bidx] - dst.x) * c_RGB2YCrCbCoeffs_f[4] + ColorChannel::half(); + } + + template struct RGB2YCrCb + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + RGB2YCrCbConvert(&src.x, dst); + return dst; + } + __host__ __device__ __forceinline__ RGB2YCrCb() {} + __host__ __device__ __forceinline__ RGB2YCrCb(const RGB2YCrCb&) {} + }; + + template struct RGB2YCrCb : unary_function + { + __device__ __forceinline__ uint operator ()(uint src) const + { + return RGB2YCrCbConvert(src); + } + + __host__ __device__ __forceinline__ RGB2YCrCb() {} + __host__ __device__ __forceinline__ RGB2YCrCb(const RGB2YCrCb&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2YCrCb_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2YCrCb functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ float c_YCrCb2RGBCoeffs_f[5] = {CR2RF, CR2GF, CB2GF, CB2BF}; + __constant__ int c_YCrCb2RGBCoeffs_i[5] = {CR2RI, CR2GI, CB2GI, CB2BI}; + + template static __device__ void YCrCb2RGBConvert(const T& src, D* dst) + { + const int b = src.x + CV_DESCALE((src.z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[3], yuv_shift); + const int g = src.x + CV_DESCALE((src.z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[2] + (src.y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[1], yuv_shift); + const int r = src.x + CV_DESCALE((src.y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[0], yuv_shift); + + dst[bidx] = saturate_cast(b); + dst[1] = saturate_cast(g); + dst[bidx^2] = saturate_cast(r); + } + + template static __device__ uint YCrCb2RGBConvert(uint src) + { + const int x = 0xff & (src); + const int y = 0xff & (src >> 8); + const int z = 0xff & (src >> 16); + + const int b = x + CV_DESCALE((z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[3], yuv_shift); + const int g = x + CV_DESCALE((z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[2] + (y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[1], yuv_shift); + const int r = x + CV_DESCALE((y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_i[0], yuv_shift); + + uint dst = 0xffu << 24; + + dst |= saturate_cast(b) << (bidx * 8); + dst |= saturate_cast(g) << 8; + dst |= saturate_cast(r) << ((bidx ^ 2) * 8); + + return dst; + } + + template __device__ __forceinline__ void YCrCb2RGBConvert(const T& src, float* dst) + { + dst[bidx] = src.x + (src.z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_f[3]; + dst[1] = src.x + (src.z - ColorChannel::half()) * c_YCrCb2RGBCoeffs_f[2] + (src.y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_f[1]; + dst[bidx^2] = src.x + (src.y - ColorChannel::half()) * c_YCrCb2RGBCoeffs_f[0]; + } + + template struct YCrCb2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + YCrCb2RGBConvert(src, &dst.x); + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ YCrCb2RGB() {} + __host__ __device__ __forceinline__ YCrCb2RGB(const YCrCb2RGB&) {} + }; + + template struct YCrCb2RGB : unary_function + { + __device__ __forceinline__ uint operator ()(uint src) const + { + return YCrCb2RGBConvert(src); + } + __host__ __device__ __forceinline__ YCrCb2RGB() {} + __host__ __device__ __forceinline__ YCrCb2RGB(const YCrCb2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_YCrCb2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::YCrCb2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +////////////////////////////////////// RGB <-> XYZ /////////////////////////////////////// + + namespace color_detail + { + __constant__ float c_RGB2XYZ_D65f[9] = { 0.412453f, 0.357580f, 0.180423f, 0.212671f, 0.715160f, 0.072169f, 0.019334f, 0.119193f, 0.950227f }; + __constant__ int c_RGB2XYZ_D65i[9] = { 1689, 1465, 739, 871, 2929, 296, 79, 488, 3892 }; + + template static __device__ __forceinline__ void RGB2XYZConvert(const T* src, D& dst) + { + dst.z = saturate_cast(CV_DESCALE(src[bidx^2] * c_RGB2XYZ_D65i[6] + src[1] * c_RGB2XYZ_D65i[7] + src[bidx] * c_RGB2XYZ_D65i[8], xyz_shift)); + dst.x = saturate_cast(CV_DESCALE(src[bidx^2] * c_RGB2XYZ_D65i[0] + src[1] * c_RGB2XYZ_D65i[1] + src[bidx] * c_RGB2XYZ_D65i[2], xyz_shift)); + dst.y = saturate_cast(CV_DESCALE(src[bidx^2] * c_RGB2XYZ_D65i[3] + src[1] * c_RGB2XYZ_D65i[4] + src[bidx] * c_RGB2XYZ_D65i[5], xyz_shift)); + } + + template static __device__ __forceinline__ uint RGB2XYZConvert(uint src) + { + const uint b = 0xffu & (src >> (bidx * 8)); + const uint g = 0xffu & (src >> 8); + const uint r = 0xffu & (src >> ((bidx ^ 2) * 8)); + + const uint x = saturate_cast(CV_DESCALE(r * c_RGB2XYZ_D65i[0] + g * c_RGB2XYZ_D65i[1] + b * c_RGB2XYZ_D65i[2], xyz_shift)); + const uint y = saturate_cast(CV_DESCALE(r * c_RGB2XYZ_D65i[3] + g * c_RGB2XYZ_D65i[4] + b * c_RGB2XYZ_D65i[5], xyz_shift)); + const uint z = saturate_cast(CV_DESCALE(r * c_RGB2XYZ_D65i[6] + g * c_RGB2XYZ_D65i[7] + b * c_RGB2XYZ_D65i[8], xyz_shift)); + + uint dst = 0; + + dst |= x; + dst |= y << 8; + dst |= z << 16; + + return dst; + } + + template static __device__ __forceinline__ void RGB2XYZConvert(const float* src, D& dst) + { + dst.x = src[bidx^2] * c_RGB2XYZ_D65f[0] + src[1] * c_RGB2XYZ_D65f[1] + src[bidx] * c_RGB2XYZ_D65f[2]; + dst.y = src[bidx^2] * c_RGB2XYZ_D65f[3] + src[1] * c_RGB2XYZ_D65f[4] + src[bidx] * c_RGB2XYZ_D65f[5]; + dst.z = src[bidx^2] * c_RGB2XYZ_D65f[6] + src[1] * c_RGB2XYZ_D65f[7] + src[bidx] * c_RGB2XYZ_D65f[8]; + } + + template struct RGB2XYZ + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2XYZConvert(&src.x, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2XYZ() {} + __host__ __device__ __forceinline__ RGB2XYZ(const RGB2XYZ&) {} + }; + + template struct RGB2XYZ : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return RGB2XYZConvert(src); + } + __host__ __device__ __forceinline__ RGB2XYZ() {} + __host__ __device__ __forceinline__ RGB2XYZ(const RGB2XYZ&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2XYZ_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2XYZ functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ float c_XYZ2sRGB_D65f[9] = { 3.240479f, -1.53715f, -0.498535f, -0.969256f, 1.875991f, 0.041556f, 0.055648f, -0.204043f, 1.057311f }; + __constant__ int c_XYZ2sRGB_D65i[9] = { 13273, -6296, -2042, -3970, 7684, 170, 228, -836, 4331 }; + + template static __device__ __forceinline__ void XYZ2RGBConvert(const T& src, D* dst) + { + dst[bidx^2] = saturate_cast(CV_DESCALE(src.x * c_XYZ2sRGB_D65i[0] + src.y * c_XYZ2sRGB_D65i[1] + src.z * c_XYZ2sRGB_D65i[2], xyz_shift)); + dst[1] = saturate_cast(CV_DESCALE(src.x * c_XYZ2sRGB_D65i[3] + src.y * c_XYZ2sRGB_D65i[4] + src.z * c_XYZ2sRGB_D65i[5], xyz_shift)); + dst[bidx] = saturate_cast(CV_DESCALE(src.x * c_XYZ2sRGB_D65i[6] + src.y * c_XYZ2sRGB_D65i[7] + src.z * c_XYZ2sRGB_D65i[8], xyz_shift)); + } + + template static __device__ __forceinline__ uint XYZ2RGBConvert(uint src) + { + const int x = 0xff & src; + const int y = 0xff & (src >> 8); + const int z = 0xff & (src >> 16); + + const uint r = saturate_cast(CV_DESCALE(x * c_XYZ2sRGB_D65i[0] + y * c_XYZ2sRGB_D65i[1] + z * c_XYZ2sRGB_D65i[2], xyz_shift)); + const uint g = saturate_cast(CV_DESCALE(x * c_XYZ2sRGB_D65i[3] + y * c_XYZ2sRGB_D65i[4] + z * c_XYZ2sRGB_D65i[5], xyz_shift)); + const uint b = saturate_cast(CV_DESCALE(x * c_XYZ2sRGB_D65i[6] + y * c_XYZ2sRGB_D65i[7] + z * c_XYZ2sRGB_D65i[8], xyz_shift)); + + uint dst = 0xffu << 24; + + dst |= b << (bidx * 8); + dst |= g << 8; + dst |= r << ((bidx ^ 2) * 8); + + return dst; + } + + template static __device__ __forceinline__ void XYZ2RGBConvert(const T& src, float* dst) + { + dst[bidx^2] = src.x * c_XYZ2sRGB_D65f[0] + src.y * c_XYZ2sRGB_D65f[1] + src.z * c_XYZ2sRGB_D65f[2]; + dst[1] = src.x * c_XYZ2sRGB_D65f[3] + src.y * c_XYZ2sRGB_D65f[4] + src.z * c_XYZ2sRGB_D65f[5]; + dst[bidx] = src.x * c_XYZ2sRGB_D65f[6] + src.y * c_XYZ2sRGB_D65f[7] + src.z * c_XYZ2sRGB_D65f[8]; + } + + template struct XYZ2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + XYZ2RGBConvert(src, &dst.x); + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ XYZ2RGB() {} + __host__ __device__ __forceinline__ XYZ2RGB(const XYZ2RGB&) {} + }; + + template struct XYZ2RGB : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return XYZ2RGBConvert(src); + } + __host__ __device__ __forceinline__ XYZ2RGB() {} + __host__ __device__ __forceinline__ XYZ2RGB(const XYZ2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_XYZ2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::XYZ2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +////////////////////////////////////// RGB <-> HSV /////////////////////////////////////// + + namespace color_detail + { + __constant__ int c_HsvDivTable [256] = {0, 1044480, 522240, 348160, 261120, 208896, 174080, 149211, 130560, 116053, 104448, 94953, 87040, 80345, 74606, 69632, 65280, 61440, 58027, 54973, 52224, 49737, 47476, 45412, 43520, 41779, 40172, 38684, 37303, 36017, 34816, 33693, 32640, 31651, 30720, 29842, 29013, 28229, 27486, 26782, 26112, 25475, 24869, 24290, 23738, 23211, 22706, 22223, 21760, 21316, 20890, 20480, 20086, 19707, 19342, 18991, 18651, 18324, 18008, 17703, 17408, 17123, 16846, 16579, 16320, 16069, 15825, 15589, 15360, 15137, 14921, 14711, 14507, 14308, 14115, 13926, 13743, 13565, 13391, 13221, 13056, 12895, 12738, 12584, 12434, 12288, 12145, 12006, 11869, 11736, 11605, 11478, 11353, 11231, 11111, 10995, 10880, 10768, 10658, 10550, 10445, 10341, 10240, 10141, 10043, 9947, 9854, 9761, 9671, 9582, 9495, 9410, 9326, 9243, 9162, 9082, 9004, 8927, 8852, 8777, 8704, 8632, 8561, 8492, 8423, 8356, 8290, 8224, 8160, 8097, 8034, 7973, 7913, 7853, 7795, 7737, 7680, 7624, 7569, 7514, 7461, 7408, 7355, 7304, 7253, 7203, 7154, 7105, 7057, 7010, 6963, 6917, 6872, 6827, 6782, 6739, 6695, 6653, 6611, 6569, 6528, 6487, 6447, 6408, 6369, 6330, 6292, 6254, 6217, 6180, 6144, 6108, 6073, 6037, 6003, 5968, 5935, 5901, 5868, 5835, 5803, 5771, 5739, 5708, 5677, 5646, 5615, 5585, 5556, 5526, 5497, 5468, 5440, 5412, 5384, 5356, 5329, 5302, 5275, 5249, 5222, 5196, 5171, 5145, 5120, 5095, 5070, 5046, 5022, 4998, 4974, 4950, 4927, 4904, 4881, 4858, 4836, 4813, 4791, 4769, 4748, 4726, 4705, 4684, 4663, 4642, 4622, 4601, 4581, 4561, 4541, 4522, 4502, 4483, 4464, 4445, 4426, 4407, 4389, 4370, 4352, 4334, 4316, 4298, 4281, 4263, 4246, 4229, 4212, 4195, 4178, 4161, 4145, 4128, 4112, 4096}; + __constant__ int c_HsvDivTable180[256] = {0, 122880, 61440, 40960, 30720, 24576, 20480, 17554, 15360, 13653, 12288, 11171, 10240, 9452, 8777, 8192, 7680, 7228, 6827, 6467, 6144, 5851, 5585, 5343, 5120, 4915, 4726, 4551, 4389, 4237, 4096, 3964, 3840, 3724, 3614, 3511, 3413, 3321, 3234, 3151, 3072, 2997, 2926, 2858, 2793, 2731, 2671, 2614, 2560, 2508, 2458, 2409, 2363, 2318, 2276, 2234, 2194, 2156, 2119, 2083, 2048, 2014, 1982, 1950, 1920, 1890, 1862, 1834, 1807, 1781, 1755, 1731, 1707, 1683, 1661, 1638, 1617, 1596, 1575, 1555, 1536, 1517, 1499, 1480, 1463, 1446, 1429, 1412, 1396, 1381, 1365, 1350, 1336, 1321, 1307, 1293, 1280, 1267, 1254, 1241, 1229, 1217, 1205, 1193, 1182, 1170, 1159, 1148, 1138, 1127, 1117, 1107, 1097, 1087, 1078, 1069, 1059, 1050, 1041, 1033, 1024, 1016, 1007, 999, 991, 983, 975, 968, 960, 953, 945, 938, 931, 924, 917, 910, 904, 897, 890, 884, 878, 871, 865, 859, 853, 847, 842, 836, 830, 825, 819, 814, 808, 803, 798, 793, 788, 783, 778, 773, 768, 763, 759, 754, 749, 745, 740, 736, 731, 727, 723, 719, 714, 710, 706, 702, 698, 694, 690, 686, 683, 679, 675, 671, 668, 664, 661, 657, 654, 650, 647, 643, 640, 637, 633, 630, 627, 624, 621, 617, 614, 611, 608, 605, 602, 599, 597, 594, 591, 588, 585, 582, 580, 577, 574, 572, 569, 566, 564, 561, 559, 556, 554, 551, 549, 546, 544, 541, 539, 537, 534, 532, 530, 527, 525, 523, 521, 518, 516, 514, 512, 510, 508, 506, 504, 502, 500, 497, 495, 493, 492, 490, 488, 486, 484, 482}; + __constant__ int c_HsvDivTable256[256] = {0, 174763, 87381, 58254, 43691, 34953, 29127, 24966, 21845, 19418, 17476, 15888, 14564, 13443, 12483, 11651, 10923, 10280, 9709, 9198, 8738, 8322, 7944, 7598, 7282, 6991, 6722, 6473, 6242, 6026, 5825, 5638, 5461, 5296, 5140, 4993, 4855, 4723, 4599, 4481, 4369, 4263, 4161, 4064, 3972, 3884, 3799, 3718, 3641, 3567, 3495, 3427, 3361, 3297, 3236, 3178, 3121, 3066, 3013, 2962, 2913, 2865, 2819, 2774, 2731, 2689, 2648, 2608, 2570, 2533, 2497, 2461, 2427, 2394, 2362, 2330, 2300, 2270, 2241, 2212, 2185, 2158, 2131, 2106, 2081, 2056, 2032, 2009, 1986, 1964, 1942, 1920, 1900, 1879, 1859, 1840, 1820, 1802, 1783, 1765, 1748, 1730, 1713, 1697, 1680, 1664, 1649, 1633, 1618, 1603, 1589, 1574, 1560, 1547, 1533, 1520, 1507, 1494, 1481, 1469, 1456, 1444, 1432, 1421, 1409, 1398, 1387, 1376, 1365, 1355, 1344, 1334, 1324, 1314, 1304, 1295, 1285, 1276, 1266, 1257, 1248, 1239, 1231, 1222, 1214, 1205, 1197, 1189, 1181, 1173, 1165, 1157, 1150, 1142, 1135, 1128, 1120, 1113, 1106, 1099, 1092, 1085, 1079, 1072, 1066, 1059, 1053, 1046, 1040, 1034, 1028, 1022, 1016, 1010, 1004, 999, 993, 987, 982, 976, 971, 966, 960, 955, 950, 945, 940, 935, 930, 925, 920, 915, 910, 906, 901, 896, 892, 887, 883, 878, 874, 869, 865, 861, 857, 853, 848, 844, 840, 836, 832, 828, 824, 820, 817, 813, 809, 805, 802, 798, 794, 791, 787, 784, 780, 777, 773, 770, 767, 763, 760, 757, 753, 750, 747, 744, 741, 737, 734, 731, 728, 725, 722, 719, 716, 713, 710, 708, 705, 702, 699, 696, 694, 691, 688, 685}; + + template static __device__ void RGB2HSVConvert(const uchar* src, D& dst) + { + const int hsv_shift = 12; + const int* hdiv_table = hr == 180 ? c_HsvDivTable180 : c_HsvDivTable256; + + int b = src[bidx], g = src[1], r = src[bidx^2]; + int h, s, v = b; + int vmin = b, diff; + int vr, vg; + + v = ::max(v, g); + v = ::max(v, r); + vmin = ::min(vmin, g); + vmin = ::min(vmin, r); + + diff = v - vmin; + vr = (v == r) * -1; + vg = (v == g) * -1; + + s = (diff * c_HsvDivTable[v] + (1 << (hsv_shift-1))) >> hsv_shift; + h = (vr & (g - b)) + (~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff)))); + h = (h * hdiv_table[diff] + (1 << (hsv_shift-1))) >> hsv_shift; + h += (h < 0) * hr; + + dst.x = saturate_cast(h); + dst.y = (uchar)s; + dst.z = (uchar)v; + } + + template static __device__ uint RGB2HSVConvert(uint src) + { + const int hsv_shift = 12; + const int* hdiv_table = hr == 180 ? c_HsvDivTable180 : c_HsvDivTable256; + + const int b = 0xff & (src >> (bidx * 8)); + const int g = 0xff & (src >> 8); + const int r = 0xff & (src >> ((bidx ^ 2) * 8)); + + int h, s, v = b; + int vmin = b, diff; + int vr, vg; + + v = ::max(v, g); + v = ::max(v, r); + vmin = ::min(vmin, g); + vmin = ::min(vmin, r); + + diff = v - vmin; + vr = (v == r) * -1; + vg = (v == g) * -1; + + s = (diff * c_HsvDivTable[v] + (1 << (hsv_shift-1))) >> hsv_shift; + h = (vr & (g - b)) + (~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff)))); + h = (h * hdiv_table[diff] + (1 << (hsv_shift-1))) >> hsv_shift; + h += (h < 0) * hr; + + uint dst = 0; + + dst |= saturate_cast(h); + dst |= (0xffu & s) << 8; + dst |= (0xffu & v) << 16; + + return dst; + } + + template static __device__ void RGB2HSVConvert(const float* src, D& dst) + { + const float hscale = hr * (1.f / 360.f); + + float b = src[bidx], g = src[1], r = src[bidx^2]; + float h, s, v; + + float vmin, diff; + + v = vmin = r; + v = fmax(v, g); + v = fmax(v, b); + vmin = fmin(vmin, g); + vmin = fmin(vmin, b); + + diff = v - vmin; + s = diff / (float)(::fabs(v) + numeric_limits::epsilon()); + diff = (float)(60. / (diff + numeric_limits::epsilon())); + + h = (v == r) * (g - b) * diff; + h += (v != r && v == g) * ((b - r) * diff + 120.f); + h += (v != r && v != g) * ((r - g) * diff + 240.f); + h += (h < 0) * 360.f; + + dst.x = h * hscale; + dst.y = s; + dst.z = v; + } + + template struct RGB2HSV + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2HSVConvert(&src.x, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2HSV() {} + __host__ __device__ __forceinline__ RGB2HSV(const RGB2HSV&) {} + }; + + template struct RGB2HSV : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return RGB2HSVConvert(src); + } + __host__ __device__ __forceinline__ RGB2HSV() {} + __host__ __device__ __forceinline__ RGB2HSV(const RGB2HSV&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2HSV_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HSV functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HSV functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HSV functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HSV functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ int c_HsvSectorData[6][3] = { {1,3,0}, {1,0,2}, {3,0,1}, {0,2,1}, {0,1,3}, {2,1,0} }; + + template static __device__ void HSV2RGBConvert(const T& src, float* dst) + { + const float hscale = 6.f / hr; + + float h = src.x, s = src.y, v = src.z; + float b = v, g = v, r = v; + + if (s != 0) + { + h *= hscale; + + if( h < 0 ) + do h += 6; while( h < 0 ); + else if( h >= 6 ) + do h -= 6; while( h >= 6 ); + + int sector = __float2int_rd(h); + h -= sector; + + if ( (unsigned)sector >= 6u ) + { + sector = 0; + h = 0.f; + } + + float tab[4]; + tab[0] = v; + tab[1] = v * (1.f - s); + tab[2] = v * (1.f - s * h); + tab[3] = v * (1.f - s * (1.f - h)); + + b = tab[c_HsvSectorData[sector][0]]; + g = tab[c_HsvSectorData[sector][1]]; + r = tab[c_HsvSectorData[sector][2]]; + } + + dst[bidx] = b; + dst[1] = g; + dst[bidx^2] = r; + } + + template static __device__ void HSV2RGBConvert(const T& src, uchar* dst) + { + float3 buf; + + buf.x = src.x; + buf.y = src.y * (1.f / 255.f); + buf.z = src.z * (1.f / 255.f); + + HSV2RGBConvert(buf, &buf.x); + + dst[0] = saturate_cast(buf.x * 255.f); + dst[1] = saturate_cast(buf.y * 255.f); + dst[2] = saturate_cast(buf.z * 255.f); + } + + template static __device__ uint HSV2RGBConvert(uint src) + { + float3 buf; + + buf.x = src & 0xff; + buf.y = ((src >> 8) & 0xff) * (1.f/255.f); + buf.z = ((src >> 16) & 0xff) * (1.f/255.f); + + HSV2RGBConvert(buf, &buf.x); + + uint dst = 0xffu << 24; + + dst |= saturate_cast(buf.x * 255.f); + dst |= saturate_cast(buf.y * 255.f) << 8; + dst |= saturate_cast(buf.z * 255.f) << 16; + + return dst; + } + + template struct HSV2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + HSV2RGBConvert(src, &dst.x); + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ HSV2RGB() {} + __host__ __device__ __forceinline__ HSV2RGB(const HSV2RGB&) {} + }; + + template struct HSV2RGB : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return HSV2RGBConvert(src); + } + __host__ __device__ __forceinline__ HSV2RGB() {} + __host__ __device__ __forceinline__ HSV2RGB(const HSV2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_HSV2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::HSV2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::HSV2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::HSV2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::HSV2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +/////////////////////////////////////// RGB <-> HLS //////////////////////////////////////// + + namespace color_detail + { + template static __device__ void RGB2HLSConvert(const float* src, D& dst) + { + const float hscale = hr * (1.f / 360.f); + + float b = src[bidx], g = src[1], r = src[bidx^2]; + float h = 0.f, s = 0.f, l; + float vmin, vmax, diff; + + vmax = vmin = r; + vmax = fmax(vmax, g); + vmax = fmax(vmax, b); + vmin = fmin(vmin, g); + vmin = fmin(vmin, b); + + diff = vmax - vmin; + l = (vmax + vmin) * 0.5f; + + if (diff > numeric_limits::epsilon()) + { + s = (l < 0.5f) * diff / (vmax + vmin); + s += (l >= 0.5f) * diff / (2.0f - vmax - vmin); + + diff = 60.f / diff; + + h = (vmax == r) * (g - b) * diff; + h += (vmax != r && vmax == g) * ((b - r) * diff + 120.f); + h += (vmax != r && vmax != g) * ((r - g) * diff + 240.f); + h += (h < 0.f) * 360.f; + } + + dst.x = h * hscale; + dst.y = l; + dst.z = s; + } + + template static __device__ void RGB2HLSConvert(const uchar* src, D& dst) + { + float3 buf; + + buf.x = src[0] * (1.f / 255.f); + buf.y = src[1] * (1.f / 255.f); + buf.z = src[2] * (1.f / 255.f); + + RGB2HLSConvert(&buf.x, buf); + + dst.x = saturate_cast(buf.x); + dst.y = saturate_cast(buf.y*255.f); + dst.z = saturate_cast(buf.z*255.f); + } + + template static __device__ uint RGB2HLSConvert(uint src) + { + float3 buf; + + buf.x = (0xff & src) * (1.f / 255.f); + buf.y = (0xff & (src >> 8)) * (1.f / 255.f); + buf.z = (0xff & (src >> 16)) * (1.f / 255.f); + + RGB2HLSConvert(&buf.x, buf); + + uint dst = 0xffu << 24; + + dst |= saturate_cast(buf.x); + dst |= saturate_cast(buf.y * 255.f) << 8; + dst |= saturate_cast(buf.z * 255.f) << 16; + + return dst; + } + + template struct RGB2HLS + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2HLSConvert(&src.x, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2HLS() {} + __host__ __device__ __forceinline__ RGB2HLS(const RGB2HLS&) {} + }; + + template struct RGB2HLS : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return RGB2HLSConvert(src); + } + __host__ __device__ __forceinline__ RGB2HLS() {} + __host__ __device__ __forceinline__ RGB2HLS(const RGB2HLS&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2HLS_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HLS functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HLS functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HLS functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2HLS functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ int c_HlsSectorData[6][3] = { {1,3,0}, {1,0,2}, {3,0,1}, {0,2,1}, {0,1,3}, {2,1,0} }; + + template static __device__ void HLS2RGBConvert(const T& src, float* dst) + { + const float hscale = 6.0f / hr; + + float h = src.x, l = src.y, s = src.z; + float b = l, g = l, r = l; + + if (s != 0) + { + float p2 = (l <= 0.5f) * l * (1 + s); + p2 += (l > 0.5f) * (l + s - l * s); + float p1 = 2 * l - p2; + + h *= hscale; + + if( h < 0 ) + do h += 6; while( h < 0 ); + else if( h >= 6 ) + do h -= 6; while( h >= 6 ); + + int sector; + sector = __float2int_rd(h); + + h -= sector; + + float tab[4]; + tab[0] = p2; + tab[1] = p1; + tab[2] = p1 + (p2 - p1) * (1 - h); + tab[3] = p1 + (p2 - p1) * h; + + b = tab[c_HlsSectorData[sector][0]]; + g = tab[c_HlsSectorData[sector][1]]; + r = tab[c_HlsSectorData[sector][2]]; + } + + dst[bidx] = b; + dst[1] = g; + dst[bidx^2] = r; + } + + template static __device__ void HLS2RGBConvert(const T& src, uchar* dst) + { + float3 buf; + + buf.x = src.x; + buf.y = src.y * (1.f / 255.f); + buf.z = src.z * (1.f / 255.f); + + HLS2RGBConvert(buf, &buf.x); + + dst[0] = saturate_cast(buf.x * 255.f); + dst[1] = saturate_cast(buf.y * 255.f); + dst[2] = saturate_cast(buf.z * 255.f); + } + + template static __device__ uint HLS2RGBConvert(uint src) + { + float3 buf; + + buf.x = 0xff & src; + buf.y = (0xff & (src >> 8)) * (1.f / 255.f); + buf.z = (0xff & (src >> 16)) * (1.f / 255.f); + + HLS2RGBConvert(buf, &buf.x); + + uint dst = 0xffu << 24; + + dst |= saturate_cast(buf.x * 255.f); + dst |= saturate_cast(buf.y * 255.f) << 8; + dst |= saturate_cast(buf.z * 255.f) << 16; + + return dst; + } + + template struct HLS2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + HLS2RGBConvert(src, &dst.x); + setAlpha(dst, ColorChannel::max()); + + return dst; + } + __host__ __device__ __forceinline__ HLS2RGB() {} + __host__ __device__ __forceinline__ HLS2RGB(const HLS2RGB&) {} + }; + + template struct HLS2RGB : unary_function + { + __device__ __forceinline__ uint operator()(uint src) const + { + return HLS2RGBConvert(src); + } + __host__ __device__ __forceinline__ HLS2RGB() {} + __host__ __device__ __forceinline__ HLS2RGB(const HLS2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_HLS2RGB_TRAITS(name, scn, dcn, bidx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::HLS2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::HLS2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::HLS2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; \ + template <> struct name ## _full_traits \ + { \ + typedef ::cv::cuda::device::color_detail::HLS2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////////// RGB <-> Lab ///////////////////////////////////// + + namespace color_detail + { + enum + { + LAB_CBRT_TAB_SIZE = 1024, + GAMMA_TAB_SIZE = 1024, + lab_shift = xyz_shift, + gamma_shift = 3, + lab_shift2 = (lab_shift + gamma_shift), + LAB_CBRT_TAB_SIZE_B = (256 * 3 / 2 * (1 << gamma_shift)) + }; + + __constant__ ushort c_sRGBGammaTab_b[] = {0,1,1,2,2,3,4,4,5,6,6,7,8,8,9,10,11,11,12,13,14,15,16,17,19,20,21,22,24,25,26,28,29,31,33,34,36,38,40,41,43,45,47,49,51,54,56,58,60,63,65,68,70,73,75,78,81,83,86,89,92,95,98,101,105,108,111,115,118,121,125,129,132,136,140,144,147,151,155,160,164,168,172,176,181,185,190,194,199,204,209,213,218,223,228,233,239,244,249,255,260,265,271,277,282,288,294,300,306,312,318,324,331,337,343,350,356,363,370,376,383,390,397,404,411,418,426,433,440,448,455,463,471,478,486,494,502,510,518,527,535,543,552,560,569,578,586,595,604,613,622,631,641,650,659,669,678,688,698,707,717,727,737,747,757,768,778,788,799,809,820,831,842,852,863,875,886,897,908,920,931,943,954,966,978,990,1002,1014,1026,1038,1050,1063,1075,1088,1101,1113,1126,1139,1152,1165,1178,1192,1205,1218,1232,1245,1259,1273,1287,1301,1315,1329,1343,1357,1372,1386,1401,1415,1430,1445,1460,1475,1490,1505,1521,1536,1551,1567,1583,1598,1614,1630,1646,1662,1678,1695,1711,1728,1744,1761,1778,1794,1811,1828,1846,1863,1880,1897,1915,1933,1950,1968,1986,2004,2022,2040}; + + __device__ __forceinline__ int LabCbrt_b(int i) + { + float x = i * (1.f / (255.f * (1 << gamma_shift))); + return (1 << lab_shift2) * (x < 0.008856f ? x * 7.787f + 0.13793103448275862f : ::cbrtf(x)); + } + + template + __device__ __forceinline__ void RGB2LabConvert_b(const T& src, D& dst) + { + const int Lscale = (116 * 255 + 50) / 100; + const int Lshift = -((16 * 255 * (1 << lab_shift2) + 50) / 100); + + int B = blueIdx == 0 ? src.x : src.z; + int G = src.y; + int R = blueIdx == 0 ? src.z : src.x; + + if (srgb) + { + B = c_sRGBGammaTab_b[B]; + G = c_sRGBGammaTab_b[G]; + R = c_sRGBGammaTab_b[R]; + } + else + { + B <<= 3; + G <<= 3; + R <<= 3; + } + + int fX = LabCbrt_b(CV_DESCALE(B * 778 + G * 1541 + R * 1777, lab_shift)); + int fY = LabCbrt_b(CV_DESCALE(B * 296 + G * 2929 + R * 871, lab_shift)); + int fZ = LabCbrt_b(CV_DESCALE(B * 3575 + G * 448 + R * 73, lab_shift)); + + int L = CV_DESCALE(Lscale * fY + Lshift, lab_shift2); + int a = CV_DESCALE(500 * (fX - fY) + 128 * (1 << lab_shift2), lab_shift2); + int b = CV_DESCALE(200 * (fY - fZ) + 128 * (1 << lab_shift2), lab_shift2); + + dst.x = saturate_cast(L); + dst.y = saturate_cast(a); + dst.z = saturate_cast(b); + } + + __device__ __forceinline__ float splineInterpolate(float x, const float* tab, int n) + { + int ix = ::min(::max(int(x), 0), n-1); + x -= ix; + tab += ix * 4; + return ((tab[3] * x + tab[2]) * x + tab[1]) * x + tab[0]; + } + + __constant__ float c_sRGBGammaTab[] = {0,7.55853e-05,0.,-7.51331e-13,7.55853e-05,7.55853e-05,-2.25399e-12,3.75665e-12,0.000151171,7.55853e-05,9.01597e-12,-6.99932e-12,0.000226756,7.55853e-05,-1.1982e-11,2.41277e-12,0.000302341,7.55853e-05,-4.74369e-12,1.19001e-11,0.000377927,7.55853e-05,3.09568e-11,-2.09095e-11,0.000453512,7.55853e-05,-3.17718e-11,1.35303e-11,0.000529097,7.55853e-05,8.81905e-12,-4.10782e-12,0.000604683,7.55853e-05,-3.50439e-12,2.90097e-12,0.000680268,7.55853e-05,5.19852e-12,-7.49607e-12,0.000755853,7.55853e-05,-1.72897e-11,2.70833e-11,0.000831439,7.55854e-05,6.39602e-11,-4.26295e-11,0.000907024,7.55854e-05,-6.39282e-11,2.70193e-11,0.000982609,7.55853e-05,1.71298e-11,-7.24017e-12,0.00105819,7.55853e-05,-4.59077e-12,1.94137e-12,0.00113378,7.55853e-05,1.23333e-12,-5.25291e-13,0.00120937,7.55853e-05,-3.42545e-13,1.59799e-13,0.00128495,7.55853e-05,1.36852e-13,-1.13904e-13,0.00136054,7.55853e-05,-2.04861e-13,2.95818e-13,0.00143612,7.55853e-05,6.82594e-13,-1.06937e-12,0.00151171,7.55853e-05,-2.52551e-12,3.98166e-12,0.00158729,7.55853e-05,9.41946e-12,-1.48573e-11,0.00166288,7.55853e-05,-3.51523e-11,5.54474e-11,0.00173846,7.55854e-05,1.3119e-10,-9.0517e-11,0.00181405,7.55854e-05,-1.40361e-10,7.37899e-11,0.00188963,7.55853e-05,8.10085e-11,-8.82272e-11,0.00196522,7.55852e-05,-1.83673e-10,1.62704e-10,0.0020408,7.55853e-05,3.04438e-10,-2.13341e-10,0.00211639,7.55853e-05,-3.35586e-10,2.25e-10,0.00219197,7.55853e-05,3.39414e-10,-2.20997e-10,0.00226756,7.55853e-05,-3.23576e-10,1.93326e-10,0.00234315,7.55853e-05,2.564e-10,-8.66446e-11,0.00241873,7.55855e-05,-3.53328e-12,-7.9578e-11,0.00249432,7.55853e-05,-2.42267e-10,1.72126e-10,0.0025699,7.55853e-05,2.74111e-10,-1.43265e-10,0.00264549,7.55854e-05,-1.55683e-10,-6.47292e-11,0.00272107,7.55849e-05,-3.4987e-10,8.67842e-10,0.00279666,7.55868e-05,2.25366e-09,-3.8723e-09,0.00287224,7.55797e-05,-9.36325e-09,1.5087e-08,0.00294783,7.56063e-05,3.58978e-08,-5.69415e-08,0.00302341,7.55072e-05,-1.34927e-07,2.13144e-07,0.003099,7.58768e-05,5.04507e-07,1.38713e-07,0.00317552,7.7302e-05,9.20646e-07,-1.55186e-07,0.00325359,7.86777e-05,4.55087e-07,4.26813e-08,0.00333276,7.97159e-05,5.83131e-07,-1.06495e-08,0.00341305,8.08502e-05,5.51182e-07,3.87467e-09,0.00349446,8.19642e-05,5.62806e-07,-1.92586e-10,0.00357698,8.30892e-05,5.62228e-07,1.0866e-09,0.00366063,8.4217e-05,5.65488e-07,5.02818e-10,0.00374542,8.53494e-05,5.66997e-07,8.60211e-10,0.00383133,8.6486e-05,5.69577e-07,7.13044e-10,0.00391839,8.76273e-05,5.71716e-07,4.78527e-10,0.00400659,8.87722e-05,5.73152e-07,1.09818e-09,0.00409594,8.99218e-05,5.76447e-07,2.50964e-10,0.00418644,9.10754e-05,5.772e-07,1.15762e-09,0.00427809,9.22333e-05,5.80672e-07,2.40865e-10,0.0043709,9.33954e-05,5.81395e-07,1.13854e-09,0.00446488,9.45616e-05,5.84811e-07,3.27267e-10,0.00456003,9.57322e-05,5.85792e-07,8.1197e-10,0.00465635,9.69062e-05,5.88228e-07,6.15823e-10,0.00475384,9.80845e-05,5.90076e-07,9.15747e-10,0.00485252,9.92674e-05,5.92823e-07,3.778e-10,0.00495238,0.000100454,5.93956e-07,8.32623e-10,0.00505343,0.000101645,5.96454e-07,4.82695e-10,0.00515567,0.000102839,5.97902e-07,9.61904e-10,0.00525911,0.000104038,6.00788e-07,3.26281e-10,0.00536375,0.00010524,6.01767e-07,9.926e-10,0.00546959,0.000106447,6.04745e-07,3.59933e-10,0.00557664,0.000107657,6.05824e-07,8.2728e-10,0.0056849,0.000108871,6.08306e-07,5.21898e-10,0.00579438,0.00011009,6.09872e-07,8.10492e-10,0.00590508,0.000111312,6.12303e-07,4.27046e-10,0.00601701,0.000112538,6.13585e-07,7.40878e-10,0.00613016,0.000113767,6.15807e-07,8.00469e-10,0.00624454,0.000115001,6.18209e-07,2.48178e-10,0.00636016,0.000116238,6.18953e-07,1.00073e-09,0.00647702,0.000117479,6.21955e-07,4.05654e-10,0.00659512,0.000118724,6.23172e-07,6.36192e-10,0.00671447,0.000119973,6.25081e-07,7.74927e-10,0.00683507,0.000121225,6.27406e-07,4.54975e-10,0.00695692,0.000122481,6.28771e-07,6.64841e-10,0.00708003,0.000123741,6.30765e-07,6.10972e-10,0.00720441,0.000125004,6.32598e-07,6.16543e-10,0.00733004,0.000126271,6.34448e-07,6.48204e-10,0.00745695,0.000127542,6.36392e-07,5.15835e-10,0.00758513,0.000128816,6.3794e-07,5.48103e-10,0.00771458,0.000130094,6.39584e-07,1.01706e-09,0.00784532,0.000131376,6.42635e-07,4.0283e-11,0.00797734,0.000132661,6.42756e-07,6.84471e-10,0.00811064,0.000133949,6.4481e-07,9.47144e-10,0.00824524,0.000135241,6.47651e-07,1.83472e-10,0.00838112,0.000136537,6.48201e-07,1.11296e-09,0.00851831,0.000137837,6.5154e-07,2.13163e-11,0.0086568,0.00013914,6.51604e-07,6.64462e-10,0.00879659,0.000140445,6.53598e-07,1.04613e-09,0.00893769,0.000141756,6.56736e-07,-1.92377e-10,0.0090801,0.000143069,6.56159e-07,1.58601e-09,0.00922383,0.000144386,6.60917e-07,-5.63754e-10,0.00936888,0.000145706,6.59226e-07,1.60033e-09,0.00951524,0.000147029,6.64027e-07,-2.49543e-10,0.00966294,0.000148356,6.63278e-07,1.26043e-09,0.00981196,0.000149687,6.67059e-07,-1.35572e-10,0.00996231,0.00015102,6.66653e-07,1.14458e-09,0.010114,0.000152357,6.70086e-07,2.13864e-10,0.010267,0.000153698,6.70728e-07,7.93856e-10,0.0104214,0.000155042,6.73109e-07,3.36077e-10,0.0105771,0.000156389,6.74118e-07,6.55765e-10,0.0107342,0.000157739,6.76085e-07,7.66211e-10,0.0108926,0.000159094,6.78384e-07,4.66116e-12,0.0110524,0.000160451,6.78398e-07,1.07775e-09,0.0112135,0.000161811,6.81631e-07,3.41023e-10,0.011376,0.000163175,6.82654e-07,3.5205e-10,0.0115398,0.000164541,6.8371e-07,1.04473e-09,0.0117051,0.000165912,6.86844e-07,1.25757e-10,0.0118717,0.000167286,6.87222e-07,3.14818e-10,0.0120396,0.000168661,6.88166e-07,1.40886e-09,0.012209,0.000170042,6.92393e-07,-3.62244e-10,0.0123797,0.000171425,6.91306e-07,9.71397e-10,0.0125518,0.000172811,6.9422e-07,2.02003e-10,0.0127253,0.0001742,6.94826e-07,1.01448e-09,0.0129002,0.000175593,6.97869e-07,3.96653e-10,0.0130765,0.00017699,6.99059e-07,1.92927e-10,0.0132542,0.000178388,6.99638e-07,6.94305e-10,0.0134333,0.00017979,7.01721e-07,7.55108e-10,0.0136138,0.000181195,7.03986e-07,1.05918e-11,0.0137957,0.000182603,7.04018e-07,1.06513e-09,0.013979,0.000184015,7.07214e-07,3.85512e-10,0.0141637,0.00018543,7.0837e-07,1.86769e-10,0.0143499,0.000186848,7.0893e-07,7.30116e-10,0.0145374,0.000188268,7.11121e-07,6.17983e-10,0.0147264,0.000189692,7.12975e-07,5.23282e-10,0.0149168,0.000191119,7.14545e-07,8.28398e-11,0.0151087,0.000192549,7.14793e-07,1.0081e-09,0.0153019,0.000193981,7.17817e-07,5.41244e-10,0.0154966,0.000195418,7.19441e-07,-3.7907e-10,0.0156928,0.000196856,7.18304e-07,1.90641e-09,0.0158903,0.000198298,7.24023e-07,-7.27387e-10,0.0160893,0.000199744,7.21841e-07,1.00317e-09,0.0162898,0.000201191,7.24851e-07,4.39949e-10,0.0164917,0.000202642,7.2617e-07,9.6234e-10,0.0166951,0.000204097,7.29057e-07,-5.64019e-10,0.0168999,0.000205554,7.27365e-07,1.29374e-09,0.0171062,0.000207012,7.31247e-07,9.77025e-10,0.017314,0.000208478,7.34178e-07,-1.47651e-09,0.0175232,0.000209942,7.29748e-07,3.06636e-09,0.0177338,0.00021141,7.38947e-07,-1.47573e-09,0.017946,0.000212884,7.3452e-07,9.7386e-10,0.0181596,0.000214356,7.37442e-07,1.30562e-09,0.0183747,0.000215835,7.41358e-07,-6.08376e-10,0.0185913,0.000217315,7.39533e-07,1.12785e-09,0.0188093,0.000218798,7.42917e-07,-1.77711e-10,0.0190289,0.000220283,7.42384e-07,1.44562e-09,0.0192499,0.000221772,7.46721e-07,-1.68825e-11,0.0194724,0.000223266,7.4667e-07,4.84533e-10,0.0196964,0.000224761,7.48124e-07,-5.85298e-11,0.0199219,0.000226257,7.47948e-07,1.61217e-09,0.0201489,0.000227757,7.52785e-07,-8.02136e-10,0.0203775,0.00022926,7.50378e-07,1.59637e-09,0.0206075,0.000230766,7.55167e-07,4.47168e-12,0.020839,0.000232276,7.55181e-07,2.48387e-10,0.021072,0.000233787,7.55926e-07,8.6474e-10,0.0213066,0.000235302,7.5852e-07,1.78299e-11,0.0215426,0.000236819,7.58573e-07,9.26567e-10,0.0217802,0.000238339,7.61353e-07,1.34529e-12,0.0220193,0.000239862,7.61357e-07,9.30659e-10,0.0222599,0.000241387,7.64149e-07,1.34529e-12,0.0225021,0.000242915,7.64153e-07,9.26567e-10,0.0227458,0.000244447,7.66933e-07,1.76215e-11,0.022991,0.00024598,7.66986e-07,8.65536e-10,0.0232377,0.000247517,7.69582e-07,2.45677e-10,0.023486,0.000249057,7.70319e-07,1.44193e-11,0.0237358,0.000250598,7.70363e-07,1.55918e-09,0.0239872,0.000252143,7.7504e-07,-6.63173e-10,0.0242401,0.000253691,7.73051e-07,1.09357e-09,0.0244946,0.000255241,7.76331e-07,1.41919e-11,0.0247506,0.000256793,7.76374e-07,7.12248e-10,0.0250082,0.000258348,7.78511e-07,8.62049e-10,0.0252673,0.000259908,7.81097e-07,-4.35061e-10,0.025528,0.000261469,7.79792e-07,8.7825e-10,0.0257902,0.000263031,7.82426e-07,6.47181e-10,0.0260541,0.000264598,7.84368e-07,2.58448e-10,0.0263194,0.000266167,7.85143e-07,1.81558e-10,0.0265864,0.000267738,7.85688e-07,8.78041e-10,0.0268549,0.000269312,7.88322e-07,3.15102e-11,0.027125,0.000270889,7.88417e-07,8.58525e-10,0.0273967,0.000272468,7.90992e-07,2.59812e-10,0.02767,0.000274051,7.91772e-07,-3.5224e-11,0.0279448,0.000275634,7.91666e-07,1.74377e-09,0.0282212,0.000277223,7.96897e-07,-1.35196e-09,0.0284992,0.000278813,7.92841e-07,1.80141e-09,0.0287788,0.000280404,7.98246e-07,-2.65629e-10,0.0290601,0.000281999,7.97449e-07,1.12374e-09,0.0293428,0.000283598,8.0082e-07,-5.04106e-10,0.0296272,0.000285198,7.99308e-07,8.92764e-10,0.0299132,0.000286799,8.01986e-07,6.58379e-10,0.0302008,0.000288405,8.03961e-07,1.98971e-10,0.0304901,0.000290014,8.04558e-07,4.08382e-10,0.0307809,0.000291624,8.05783e-07,3.01839e-11,0.0310733,0.000293236,8.05874e-07,1.33343e-09,0.0313673,0.000294851,8.09874e-07,2.2419e-10,0.031663,0.000296472,8.10547e-07,-3.67606e-10,0.0319603,0.000298092,8.09444e-07,1.24624e-09,0.0322592,0.000299714,8.13182e-07,-8.92025e-10,0.0325597,0.000301338,8.10506e-07,2.32183e-09,0.0328619,0.000302966,8.17472e-07,-9.44719e-10,0.0331657,0.000304598,8.14638e-07,1.45703e-09,0.0334711,0.000306232,8.19009e-07,-1.15805e-09,0.0337781,0.000307866,8.15535e-07,3.17507e-09,0.0340868,0.000309507,8.2506e-07,-4.09161e-09,0.0343971,0.000311145,8.12785e-07,5.74079e-09,0.0347091,0.000312788,8.30007e-07,-3.97034e-09,0.0350227,0.000314436,8.18096e-07,2.68985e-09,0.035338,0.00031608,8.26166e-07,6.61676e-10,0.0356549,0.000317734,8.28151e-07,-1.61123e-09,0.0359734,0.000319386,8.23317e-07,2.05786e-09,0.0362936,0.000321038,8.29491e-07,8.30388e-10,0.0366155,0.0003227,8.31982e-07,-1.65424e-09,0.036939,0.000324359,8.27019e-07,2.06129e-09,0.0372642,0.000326019,8.33203e-07,8.59719e-10,0.0375911,0.000327688,8.35782e-07,-1.77488e-09,0.0379196,0.000329354,8.30458e-07,2.51464e-09,0.0382498,0.000331023,8.38002e-07,-8.33135e-10,0.0385817,0.000332696,8.35502e-07,8.17825e-10,0.0389152,0.00033437,8.37956e-07,1.28718e-09,0.0392504,0.00033605,8.41817e-07,-2.2413e-09,0.0395873,0.000337727,8.35093e-07,3.95265e-09,0.0399258,0.000339409,8.46951e-07,-2.39332e-09,0.0402661,0.000341095,8.39771e-07,1.89533e-09,0.040608,0.000342781,8.45457e-07,-1.46271e-09,0.0409517,0.000344467,8.41069e-07,3.95554e-09,0.041297,0.000346161,8.52936e-07,-3.18369e-09,0.041644,0.000347857,8.43385e-07,1.32873e-09,0.0419927,0.000349548,8.47371e-07,1.59402e-09,0.0423431,0.000351248,8.52153e-07,-2.54336e-10,0.0426952,0.000352951,8.5139e-07,-5.76676e-10,0.043049,0.000354652,8.4966e-07,2.56114e-09,0.0434045,0.000356359,8.57343e-07,-2.21744e-09,0.0437617,0.000358067,8.50691e-07,2.58344e-09,0.0441206,0.000359776,8.58441e-07,-6.65826e-10,0.0444813,0.000361491,8.56444e-07,7.99218e-11,0.0448436,0.000363204,8.56684e-07,3.46063e-10,0.0452077,0.000364919,8.57722e-07,2.26116e-09,0.0455734,0.000366641,8.64505e-07,-1.94005e-09,0.045941,0.000368364,8.58685e-07,1.77384e-09,0.0463102,0.000370087,8.64007e-07,-1.43005e-09,0.0466811,0.000371811,8.59717e-07,3.94634e-09,0.0470538,0.000373542,8.71556e-07,-3.17946e-09,0.0474282,0.000375276,8.62017e-07,1.32104e-09,0.0478043,0.000377003,8.6598e-07,1.62045e-09,0.0481822,0.00037874,8.70842e-07,-3.52297e-10,0.0485618,0.000380481,8.69785e-07,-2.11211e-10,0.0489432,0.00038222,8.69151e-07,1.19716e-09,0.0493263,0.000383962,8.72743e-07,-8.52026e-10,0.0497111,0.000385705,8.70187e-07,2.21092e-09,0.0500977,0.000387452,8.76819e-07,-5.41339e-10,0.050486,0.000389204,8.75195e-07,-4.5361e-11,0.0508761,0.000390954,8.75059e-07,7.22669e-10,0.0512679,0.000392706,8.77227e-07,8.79936e-10,0.0516615,0.000394463,8.79867e-07,-5.17048e-10,0.0520568,0.000396222,8.78316e-07,1.18833e-09,0.0524539,0.000397982,8.81881e-07,-5.11022e-10,0.0528528,0.000399744,8.80348e-07,8.55683e-10,0.0532534,0.000401507,8.82915e-07,8.13562e-10,0.0536558,0.000403276,8.85356e-07,-3.84603e-10,0.05406,0.000405045,8.84202e-07,7.24962e-10,0.0544659,0.000406816,8.86377e-07,1.20986e-09,0.0548736,0.000408592,8.90006e-07,-1.83896e-09,0.0552831,0.000410367,8.84489e-07,2.42071e-09,0.0556944,0.000412143,8.91751e-07,-3.93413e-10,0.0561074,0.000413925,8.90571e-07,-8.46967e-10,0.0565222,0.000415704,8.8803e-07,3.78122e-09,0.0569388,0.000417491,8.99374e-07,-3.1021e-09,0.0573572,0.000419281,8.90068e-07,1.17658e-09,0.0577774,0.000421064,8.93597e-07,2.12117e-09,0.0581993,0.000422858,8.99961e-07,-2.21068e-09,0.0586231,0.000424651,8.93329e-07,2.9961e-09,0.0590486,0.000426447,9.02317e-07,-2.32311e-09,0.059476,0.000428244,8.95348e-07,2.57122e-09,0.0599051,0.000430043,9.03062e-07,-5.11098e-10,0.0603361,0.000431847,9.01528e-07,-5.27166e-10,0.0607688,0.000433649,8.99947e-07,2.61984e-09,0.0612034,0.000435457,9.07806e-07,-2.50141e-09,0.0616397,0.000437265,9.00302e-07,3.66045e-09,0.0620779,0.000439076,9.11283e-07,-4.68977e-09,0.0625179,0.000440885,8.97214e-07,7.64783e-09,0.0629597,0.000442702,9.20158e-07,-7.27499e-09,0.0634033,0.000444521,8.98333e-07,6.55113e-09,0.0638487,0.000446337,9.17986e-07,-4.02844e-09,0.0642959,0.000448161,9.05901e-07,2.11196e-09,0.064745,0.000449979,9.12236e-07,3.03125e-09,0.0651959,0.000451813,9.2133e-07,-6.78648e-09,0.0656486,0.000453635,9.00971e-07,9.21375e-09,0.0661032,0.000455464,9.28612e-07,-7.71684e-09,0.0665596,0.000457299,9.05462e-07,6.7522e-09,0.0670178,0.00045913,9.25718e-07,-4.3907e-09,0.0674778,0.000460968,9.12546e-07,3.36e-09,0.0679397,0.000462803,9.22626e-07,-1.59876e-09,0.0684034,0.000464644,9.1783e-07,3.0351e-09,0.068869,0.000466488,9.26935e-07,-3.09101e-09,0.0693364,0.000468333,9.17662e-07,1.8785e-09,0.0698057,0.000470174,9.23298e-07,3.02733e-09,0.0702768,0.00047203,9.3238e-07,-6.53722e-09,0.0707497,0.000473875,9.12768e-07,8.22054e-09,0.0712245,0.000475725,9.37429e-07,-3.99325e-09,0.0717012,0.000477588,9.2545e-07,3.01839e-10,0.0721797,0.00047944,9.26355e-07,2.78597e-09,0.0726601,0.000481301,9.34713e-07,-3.99507e-09,0.0731423,0.000483158,9.22728e-07,5.7435e-09,0.0736264,0.000485021,9.39958e-07,-4.07776e-09,0.0741123,0.000486888,9.27725e-07,3.11695e-09,0.0746002,0.000488753,9.37076e-07,-9.39394e-10,0.0750898,0.000490625,9.34258e-07,6.4055e-10,0.0755814,0.000492495,9.3618e-07,-1.62265e-09,0.0760748,0.000494363,9.31312e-07,5.84995e-09,0.0765701,0.000496243,9.48861e-07,-6.87601e-09,0.0770673,0.00049812,9.28233e-07,6.75296e-09,0.0775664,0.000499997,9.48492e-07,-5.23467e-09,0.0780673,0.000501878,9.32788e-07,6.73523e-09,0.0785701,0.000503764,9.52994e-07,-6.80514e-09,0.0790748,0.000505649,9.32578e-07,5.5842e-09,0.0795814,0.000507531,9.49331e-07,-6.30583e-10,0.0800899,0.000509428,9.47439e-07,-3.0618e-09,0.0806003,0.000511314,9.38254e-07,5.4273e-09,0.0811125,0.000513206,9.54536e-07,-3.74627e-09,0.0816267,0.000515104,9.43297e-07,2.10713e-09,0.0821427,0.000516997,9.49618e-07,2.76839e-09,0.0826607,0.000518905,9.57924e-07,-5.73006e-09,0.0831805,0.000520803,9.40733e-07,5.25072e-09,0.0837023,0.0005227,9.56486e-07,-3.71718e-10,0.084226,0.000524612,9.5537e-07,-3.76404e-09,0.0847515,0.000526512,9.44078e-07,7.97735e-09,0.085279,0.000528424,9.6801e-07,-5.79367e-09,0.0858084,0.000530343,9.50629e-07,2.96268e-10,0.0863397,0.000532245,9.51518e-07,4.6086e-09,0.0868729,0.000534162,9.65344e-07,-3.82947e-09,0.087408,0.000536081,9.53856e-07,3.25861e-09,0.087945,0.000537998,9.63631e-07,-1.7543e-09,0.088484,0.00053992,9.58368e-07,3.75849e-09,0.0890249,0.000541848,9.69644e-07,-5.82891e-09,0.0895677,0.00054377,9.52157e-07,4.65593e-09,0.0901124,0.000545688,9.66125e-07,2.10643e-09,0.0906591,0.000547627,9.72444e-07,-5.63099e-09,0.0912077,0.000549555,9.55551e-07,5.51627e-09,0.0917582,0.000551483,9.721e-07,-1.53292e-09,0.0923106,0.000553422,9.67501e-07,6.15311e-10,0.092865,0.000555359,9.69347e-07,-9.28291e-10,0.0934213,0.000557295,9.66562e-07,3.09774e-09,0.0939796,0.000559237,9.75856e-07,-4.01186e-09,0.0945398,0.000561177,9.6382e-07,5.49892e-09,0.095102,0.000563121,9.80317e-07,-3.08258e-09,0.0956661,0.000565073,9.71069e-07,-6.19176e-10,0.0962321,0.000567013,9.69212e-07,5.55932e-09,0.0968001,0.000568968,9.8589e-07,-6.71704e-09,0.09737,0.00057092,9.65738e-07,6.40762e-09,0.0979419,0.00057287,9.84961e-07,-4.0122e-09,0.0985158,0.000574828,9.72925e-07,2.19059e-09,0.0990916,0.000576781,9.79496e-07,2.70048e-09,0.0996693,0.000578748,9.87598e-07,-5.54193e-09,0.100249,0.000580706,9.70972e-07,4.56597e-09,0.100831,0.000582662,9.8467e-07,2.17923e-09,0.101414,0.000584638,9.91208e-07,-5.83232e-09,0.102,0.000586603,9.73711e-07,6.24884e-09,0.102588,0.000588569,9.92457e-07,-4.26178e-09,0.103177,0.000590541,9.79672e-07,3.34781e-09,0.103769,0.00059251,9.89715e-07,-1.67904e-09,0.104362,0.000594485,9.84678e-07,3.36839e-09,0.104958,0.000596464,9.94783e-07,-4.34397e-09,0.105555,0.000598441,9.81751e-07,6.55696e-09,0.106155,0.000600424,1.00142e-06,-6.98272e-09,0.106756,0.000602406,9.80474e-07,6.4728e-09,0.107359,0.000604386,9.99893e-07,-4.00742e-09,0.107965,0.000606374,9.8787e-07,2.10654e-09,0.108572,0.000608356,9.9419e-07,3.0318e-09,0.109181,0.000610353,1.00329e-06,-6.7832e-09,0.109793,0.00061234,9.82936e-07,9.1998e-09,0.110406,0.000614333,1.01054e-06,-7.6642e-09,0.111021,0.000616331,9.87543e-07,6.55579e-09,0.111639,0.000618326,1.00721e-06,-3.65791e-09,0.112258,0.000620329,9.96236e-07,6.25467e-10,0.112879,0.000622324,9.98113e-07,1.15593e-09,0.113503,0.000624323,1.00158e-06,2.20158e-09,0.114128,0.000626333,1.00819e-06,-2.51191e-09,0.114755,0.000628342,1.00065e-06,3.95517e-10,0.115385,0.000630345,1.00184e-06,9.29807e-10,0.116016,0.000632351,1.00463e-06,3.33599e-09,0.116649,0.00063437,1.01463e-06,-6.82329e-09,0.117285,0.000636379,9.94163e-07,9.05595e-09,0.117922,0.000638395,1.02133e-06,-7.04862e-09,0.118562,0.000640416,1.00019e-06,4.23737e-09,0.119203,0.000642429,1.0129e-06,-2.45033e-09,0.119847,0.000644448,1.00555e-06,5.56395e-09,0.120492,0.000646475,1.02224e-06,-4.9043e-09,0.121139,0.000648505,1.00753e-06,-8.47952e-10,0.121789,0.000650518,1.00498e-06,8.29622e-09,0.122441,0.000652553,1.02987e-06,-9.98538e-09,0.123094,0.000654582,9.99914e-07,9.2936e-09,0.12375,0.00065661,1.02779e-06,-4.83707e-09,0.124407,0.000658651,1.01328e-06,2.60411e-09,0.125067,0.000660685,1.0211e-06,-5.57945e-09,0.125729,0.000662711,1.00436e-06,1.22631e-08,0.126392,0.000664756,1.04115e-06,-1.36704e-08,0.127058,0.000666798,1.00014e-06,1.26161e-08,0.127726,0.000668836,1.03798e-06,-6.99155e-09,0.128396,0.000670891,1.01701e-06,4.48836e-10,0.129068,0.000672926,1.01836e-06,5.19606e-09,0.129742,0.000674978,1.03394e-06,-6.3319e-09,0.130418,0.000677027,1.01495e-06,5.2305e-09,0.131096,0.000679073,1.03064e-06,3.11123e-10,0.131776,0.000681135,1.03157e-06,-6.47511e-09,0.132458,0.000683179,1.01215e-06,1.06882e-08,0.133142,0.000685235,1.04421e-06,-6.47519e-09,0.133829,0.000687304,1.02479e-06,3.11237e-10,0.134517,0.000689355,1.02572e-06,5.23035e-09,0.135207,0.000691422,1.04141e-06,-6.3316e-09,0.1359,0.000693486,1.02242e-06,5.19484e-09,0.136594,0.000695546,1.038e-06,4.53497e-10,0.137291,0.000697623,1.03936e-06,-7.00891e-09,0.137989,0.000699681,1.01834e-06,1.2681e-08,0.13869,0.000701756,1.05638e-06,-1.39128e-08,0.139393,0.000703827,1.01464e-06,1.31679e-08,0.140098,0.000705896,1.05414e-06,-8.95659e-09,0.140805,0.000707977,1.02727e-06,7.75742e-09,0.141514,0.000710055,1.05055e-06,-7.17182e-09,0.142225,0.000712135,1.02903e-06,6.02862e-09,0.142938,0.000714211,1.04712e-06,-2.04163e-09,0.143653,0.000716299,1.04099e-06,2.13792e-09,0.144371,0.000718387,1.04741e-06,-6.51009e-09,0.14509,0.000720462,1.02787e-06,9.00123e-09,0.145812,0.000722545,1.05488e-06,3.07523e-10,0.146535,0.000724656,1.0558e-06,-1.02312e-08,0.147261,0.000726737,1.02511e-06,1.0815e-08,0.147989,0.000728819,1.05755e-06,-3.22681e-09,0.148719,0.000730925,1.04787e-06,2.09244e-09,0.14945,0.000733027,1.05415e-06,-5.143e-09,0.150185,0.00073512,1.03872e-06,3.57844e-09,0.150921,0.000737208,1.04946e-06,5.73027e-09,0.151659,0.000739324,1.06665e-06,-1.15983e-08,0.152399,0.000741423,1.03185e-06,1.08605e-08,0.153142,0.000743519,1.06443e-06,-2.04106e-09,0.153886,0.000745642,1.05831e-06,-2.69642e-09,0.154633,0.00074775,1.05022e-06,-2.07425e-09,0.155382,0.000749844,1.044e-06,1.09934e-08,0.156133,0.000751965,1.07698e-06,-1.20972e-08,0.156886,0.000754083,1.04069e-06,7.59288e-09,0.157641,0.000756187,1.06347e-06,-3.37305e-09,0.158398,0.000758304,1.05335e-06,5.89921e-09,0.159158,0.000760428,1.07104e-06,-5.32248e-09,0.159919,0.000762554,1.05508e-06,4.8927e-10,0.160683,0.000764666,1.05654e-06,3.36547e-09,0.161448,0.000766789,1.06664e-06,9.50081e-10,0.162216,0.000768925,1.06949e-06,-7.16568e-09,0.162986,0.000771043,1.04799e-06,1.28114e-08,0.163758,0.000773177,1.08643e-06,-1.42774e-08,0.164533,0.000775307,1.0436e-06,1.44956e-08,0.165309,0.000777438,1.08708e-06,-1.39025e-08,0.166087,0.00077957,1.04538e-06,1.13118e-08,0.166868,0.000781695,1.07931e-06,-1.54224e-09,0.167651,0.000783849,1.07468e-06,-5.14312e-09,0.168436,0.000785983,1.05925e-06,7.21381e-09,0.169223,0.000788123,1.0809e-06,-8.81096e-09,0.170012,0.000790259,1.05446e-06,1.31289e-08,0.170803,0.000792407,1.09385e-06,-1.39022e-08,0.171597,0.000794553,1.05214e-06,1.26775e-08,0.172392,0.000796695,1.09018e-06,-7.00557e-09,0.17319,0.000798855,1.06916e-06,4.43796e-10,0.17399,0.000800994,1.07049e-06,5.23031e-09,0.174792,0.000803151,1.08618e-06,-6.46397e-09,0.175596,0.000805304,1.06679e-06,5.72444e-09,0.176403,0.000807455,1.08396e-06,-1.53254e-09,0.177211,0.000809618,1.07937e-06,4.05673e-10,0.178022,0.000811778,1.08058e-06,-9.01916e-11,0.178835,0.000813939,1.08031e-06,-4.49821e-11,0.17965,0.000816099,1.08018e-06,2.70234e-10,0.180467,0.00081826,1.08099e-06,-1.03603e-09,0.181286,0.000820419,1.07788e-06,3.87392e-09,0.182108,0.000822587,1.0895e-06,4.41522e-10,0.182932,0.000824767,1.09083e-06,-5.63997e-09,0.183758,0.000826932,1.07391e-06,7.21707e-09,0.184586,0.000829101,1.09556e-06,-8.32718e-09,0.185416,0.000831267,1.07058e-06,1.11907e-08,0.186248,0.000833442,1.10415e-06,-6.63336e-09,0.187083,0.00083563,1.08425e-06,4.41484e-10,0.187919,0.0008378,1.08557e-06,4.86754e-09,0.188758,0.000839986,1.10017e-06,-5.01041e-09,0.189599,0.000842171,1.08514e-06,2.72811e-10,0.190443,0.000844342,1.08596e-06,3.91916e-09,0.191288,0.000846526,1.09772e-06,-1.04819e-09,0.192136,0.000848718,1.09457e-06,2.73531e-10,0.192985,0.000850908,1.0954e-06,-4.58916e-11,0.193837,0.000853099,1.09526e-06,-9.01158e-11,0.194692,0.000855289,1.09499e-06,4.06506e-10,0.195548,0.00085748,1.09621e-06,-1.53595e-09,0.196407,0.000859668,1.0916e-06,5.73717e-09,0.197267,0.000861869,1.10881e-06,-6.51164e-09,0.19813,0.000864067,1.08928e-06,5.40831e-09,0.198995,0.000866261,1.1055e-06,-2.20401e-10,0.199863,0.000868472,1.10484e-06,-4.52652e-09,0.200732,0.000870668,1.09126e-06,3.42508e-09,0.201604,0.000872861,1.10153e-06,5.72762e-09,0.202478,0.000875081,1.11872e-06,-1.14344e-08,0.203354,0.000877284,1.08441e-06,1.02076e-08,0.204233,0.000879484,1.11504e-06,4.06355e-10,0.205113,0.000881715,1.11626e-06,-1.18329e-08,0.205996,0.000883912,1.08076e-06,1.71227e-08,0.206881,0.000886125,1.13213e-06,-1.19546e-08,0.207768,0.000888353,1.09626e-06,8.93465e-10,0.208658,0.000890548,1.09894e-06,8.38062e-09,0.209549,0.000892771,1.12408e-06,-4.61353e-09,0.210443,0.000895006,1.11024e-06,-4.82756e-09,0.211339,0.000897212,1.09576e-06,9.02245e-09,0.212238,0.00089943,1.12283e-06,-1.45997e-09,0.213138,0.000901672,1.11845e-06,-3.18255e-09,0.214041,0.000903899,1.1089e-06,-7.11073e-10,0.214946,0.000906115,1.10677e-06,6.02692e-09,0.215853,0.000908346,1.12485e-06,-8.49548e-09,0.216763,0.00091057,1.09936e-06,1.30537e-08,0.217675,0.000912808,1.13852e-06,-1.3917e-08,0.218588,0.000915044,1.09677e-06,1.28121e-08,0.219505,0.000917276,1.13521e-06,-7.5288e-09,0.220423,0.000919523,1.11262e-06,2.40205e-09,0.221344,0.000921756,1.11983e-06,-2.07941e-09,0.222267,0.000923989,1.11359e-06,5.91551e-09,0.223192,0.000926234,1.13134e-06,-6.68149e-09,0.224119,0.000928477,1.11129e-06,5.90929e-09,0.225049,0.000930717,1.12902e-06,-2.05436e-09,0.22598,0.000932969,1.12286e-06,2.30807e-09,0.226915,0.000935222,1.12978e-06,-7.17796e-09,0.227851,0.00093746,1.10825e-06,1.15028e-08,0.228789,0.000939711,1.14276e-06,-9.03083e-09,0.22973,0.000941969,1.11566e-06,9.71932e-09,0.230673,0.00094423,1.14482e-06,-1.49452e-08,0.231619,0.000946474,1.09998e-06,2.02591e-08,0.232566,0.000948735,1.16076e-06,-2.13879e-08,0.233516,0.000950993,1.0966e-06,2.05888e-08,0.234468,0.000953247,1.15837e-06,-1.62642e-08,0.235423,0.000955515,1.10957e-06,1.46658e-08,0.236379,0.000957779,1.15357e-06,-1.25966e-08,0.237338,0.000960048,1.11578e-06,5.91793e-09,0.238299,0.000962297,1.13353e-06,3.82602e-09,0.239263,0.000964576,1.14501e-06,-6.3208e-09,0.240229,0.000966847,1.12605e-06,6.55613e-09,0.241197,0.000969119,1.14572e-06,-5.00268e-09,0.242167,0.000971395,1.13071e-06,-1.44659e-09,0.243139,0.000973652,1.12637e-06,1.07891e-08,0.244114,0.000975937,1.15874e-06,-1.19073e-08,0.245091,0.000978219,1.12302e-06,7.03782e-09,0.246071,0.000980486,1.14413e-06,-1.34276e-09,0.247052,0.00098277,1.1401e-06,-1.66669e-09,0.248036,0.000985046,1.1351e-06,8.00935e-09,0.249022,0.00098734,1.15913e-06,-1.54694e-08,0.250011,0.000989612,1.11272e-06,2.4066e-08,0.251002,0.000991909,1.18492e-06,-2.11901e-08,0.251995,0.000994215,1.12135e-06,1.08973e-09,0.25299,0.000996461,1.12462e-06,1.68311e-08,0.253988,0.000998761,1.17511e-06,-8.8094e-09,0.254987,0.00100109,1.14868e-06,-1.13958e-08,0.25599,0.00100335,1.1145e-06,2.45902e-08,0.256994,0.00100565,1.18827e-06,-2.73603e-08,0.258001,0.00100795,1.10618e-06,2.52464e-08,0.25901,0.00101023,1.18192e-06,-1.40207e-08,0.260021,0.00101256,1.13986e-06,1.03387e-09,0.261035,0.00101484,1.14296e-06,9.8853e-09,0.262051,0.00101715,1.17262e-06,-1.07726e-08,0.263069,0.00101947,1.1403e-06,3.40272e-09,0.26409,0.00102176,1.15051e-06,-2.83827e-09,0.265113,0.00102405,1.142e-06,7.95039e-09,0.266138,0.00102636,1.16585e-06,8.39047e-10,0.267166,0.00102869,1.16836e-06,-1.13066e-08,0.268196,0.00103099,1.13444e-06,1.4585e-08,0.269228,0.00103331,1.1782e-06,-1.72314e-08,0.270262,0.00103561,1.1265e-06,2.45382e-08,0.271299,0.00103794,1.20012e-06,-2.13166e-08,0.272338,0.00104028,1.13617e-06,1.12364e-09,0.273379,0.00104255,1.13954e-06,1.68221e-08,0.274423,0.00104488,1.19001e-06,-8.80736e-09,0.275469,0.00104723,1.16358e-06,-1.13948e-08,0.276518,0.00104953,1.1294e-06,2.45839e-08,0.277568,0.00105186,1.20315e-06,-2.73361e-08,0.278621,0.00105418,1.12114e-06,2.51559e-08,0.279677,0.0010565,1.19661e-06,-1.36832e-08,0.280734,0.00105885,1.15556e-06,-2.25706e-10,0.281794,0.00106116,1.15488e-06,1.45862e-08,0.282857,0.00106352,1.19864e-06,-2.83167e-08,0.283921,0.00106583,1.11369e-06,3.90759e-08,0.284988,0.00106817,1.23092e-06,-3.85801e-08,0.286058,0.00107052,1.11518e-06,2.58375e-08,0.287129,0.00107283,1.19269e-06,-5.16498e-09,0.288203,0.0010752,1.1772e-06,-5.17768e-09,0.28928,0.00107754,1.16167e-06,-3.92671e-09,0.290358,0.00107985,1.14988e-06,2.08846e-08,0.29144,0.00108221,1.21254e-06,-2.00072e-08,0.292523,0.00108458,1.15252e-06,-4.60659e-10,0.293609,0.00108688,1.15114e-06,2.18499e-08,0.294697,0.00108925,1.21669e-06,-2.73343e-08,0.295787,0.0010916,1.13468e-06,2.78826e-08,0.29688,0.00109395,1.21833e-06,-2.45915e-08,0.297975,0.00109632,1.14456e-06,1.08787e-08,0.299073,0.00109864,1.17719e-06,1.08788e-08,0.300172,0.00110102,1.20983e-06,-2.45915e-08,0.301275,0.00110337,1.13605e-06,2.78828e-08,0.302379,0.00110573,1.2197e-06,-2.73348e-08,0.303486,0.00110808,1.1377e-06,2.18518e-08,0.304595,0.00111042,1.20325e-06,-4.67556e-10,0.305707,0.00111283,1.20185e-06,-1.99816e-08,0.306821,0.00111517,1.14191e-06,2.07891e-08,0.307937,0.00111752,1.20427e-06,-3.57026e-09,0.309056,0.00111992,1.19356e-06,-6.50797e-09,0.310177,0.00112228,1.17404e-06,-2.00165e-10,0.3113,0.00112463,1.17344e-06,7.30874e-09,0.312426,0.001127,1.19536e-06,7.67424e-10,0.313554,0.00112939,1.19767e-06,-1.03784e-08,0.314685,0.00113176,1.16653e-06,1.09437e-08,0.315818,0.00113412,1.19936e-06,-3.59406e-09,0.316953,0.00113651,1.18858e-06,3.43251e-09,0.318091,0.0011389,1.19888e-06,-1.0136e-08,0.319231,0.00114127,1.16847e-06,7.30915e-09,0.320374,0.00114363,1.1904e-06,1.07018e-08,0.321518,0.00114604,1.2225e-06,-2.03137e-08,0.322666,0.00114842,1.16156e-06,1.09484e-08,0.323815,0.00115078,1.19441e-06,6.32224e-09,0.324967,0.00115319,1.21337e-06,-6.43509e-09,0.326122,0.00115559,1.19407e-06,-1.03842e-08,0.327278,0.00115795,1.16291e-06,1.81697e-08,0.328438,0.00116033,1.21742e-06,-2.6901e-09,0.329599,0.00116276,1.20935e-06,-7.40939e-09,0.330763,0.00116515,1.18713e-06,2.52533e-09,0.331929,0.00116754,1.1947e-06,-2.69191e-09,0.333098,0.00116992,1.18663e-06,8.24218e-09,0.334269,0.00117232,1.21135e-06,-4.74377e-10,0.335443,0.00117474,1.20993e-06,-6.34471e-09,0.336619,0.00117714,1.1909e-06,-3.94922e-09,0.337797,0.00117951,1.17905e-06,2.21417e-08,0.338978,0.00118193,1.24547e-06,-2.50128e-08,0.340161,0.00118435,1.17043e-06,1.8305e-08,0.341346,0.00118674,1.22535e-06,-1.84048e-08,0.342534,0.00118914,1.17013e-06,2.55121e-08,0.343725,0.00119156,1.24667e-06,-2.40389e-08,0.344917,0.00119398,1.17455e-06,1.10389e-08,0.346113,0.00119636,1.20767e-06,9.68574e-09,0.34731,0.0011988,1.23673e-06,-1.99797e-08,0.34851,0.00120122,1.17679e-06,1.06284e-08,0.349713,0.0012036,1.20867e-06,7.26868e-09,0.350917,0.00120604,1.23048e-06,-9.90072e-09,0.352125,0.00120847,1.20078e-06,2.53177e-09,0.353334,0.00121088,1.20837e-06,-2.26199e-10,0.354546,0.0012133,1.20769e-06,-1.62705e-09,0.355761,0.00121571,1.20281e-06,6.73435e-09,0.356978,0.00121813,1.22302e-06,4.49207e-09,0.358197,0.00122059,1.23649e-06,-2.47027e-08,0.359419,0.00122299,1.16238e-06,3.47142e-08,0.360643,0.00122542,1.26653e-06,-2.47472e-08,0.36187,0.00122788,1.19229e-06,4.66965e-09,0.363099,0.00123028,1.20629e-06,6.06872e-09,0.36433,0.00123271,1.2245e-06,8.57729e-10,0.365564,0.00123516,1.22707e-06,-9.49952e-09,0.366801,0.00123759,1.19858e-06,7.33792e-09,0.36804,0.00124001,1.22059e-06,9.95025e-09,0.369281,0.00124248,1.25044e-06,-1.73366e-08,0.370525,0.00124493,1.19843e-06,-2.08464e-10,0.371771,0.00124732,1.1978e-06,1.81704e-08,0.373019,0.00124977,1.25232e-06,-1.28683e-08,0.37427,0.00125224,1.21371e-06,3.50042e-09,0.375524,0.00125468,1.22421e-06,-1.1335e-09,0.37678,0.00125712,1.22081e-06,1.03345e-09,0.378038,0.00125957,1.22391e-06,-3.00023e-09,0.379299,0.00126201,1.21491e-06,1.09676e-08,0.380562,0.00126447,1.24781e-06,-1.10676e-08,0.381828,0.00126693,1.21461e-06,3.50042e-09,0.383096,0.00126937,1.22511e-06,-2.93403e-09,0.384366,0.00127181,1.21631e-06,8.23574e-09,0.385639,0.00127427,1.24102e-06,-2.06607e-10,0.386915,0.00127675,1.2404e-06,-7.40935e-09,0.388193,0.00127921,1.21817e-06,4.1761e-11,0.389473,0.00128165,1.21829e-06,7.24223e-09,0.390756,0.0012841,1.24002e-06,7.91564e-10,0.392042,0.00128659,1.2424e-06,-1.04086e-08,0.393329,0.00128904,1.21117e-06,1.10405e-08,0.39462,0.0012915,1.24429e-06,-3.951e-09,0.395912,0.00129397,1.23244e-06,4.7634e-09,0.397208,0.00129645,1.24673e-06,-1.51025e-08,0.398505,0.0012989,1.20142e-06,2.58443e-08,0.399805,0.00130138,1.27895e-06,-2.86702e-08,0.401108,0.00130385,1.19294e-06,2.92318e-08,0.402413,0.00130632,1.28064e-06,-2.86524e-08,0.403721,0.0013088,1.19468e-06,2.57731e-08,0.405031,0.00131127,1.272e-06,-1.48355e-08,0.406343,0.00131377,1.2275e-06,3.76652e-09,0.407658,0.00131623,1.23879e-06,-2.30784e-10,0.408976,0.00131871,1.2381e-06,-2.84331e-09,0.410296,0.00132118,1.22957e-06,1.16041e-08,0.411618,0.00132367,1.26438e-06,-1.37708e-08,0.412943,0.00132616,1.22307e-06,1.36768e-08,0.41427,0.00132865,1.2641e-06,-1.1134e-08,0.4156,0.00133114,1.2307e-06,1.05714e-09,0.416933,0.00133361,1.23387e-06,6.90538e-09,0.418267,0.00133609,1.25459e-06,1.12372e-09,0.419605,0.00133861,1.25796e-06,-1.14002e-08,0.420945,0.00134109,1.22376e-06,1.46747e-08,0.422287,0.00134358,1.26778e-06,-1.7496e-08,0.423632,0.00134606,1.21529e-06,2.5507e-08,0.424979,0.00134857,1.29182e-06,-2.49272e-08,0.426329,0.00135108,1.21703e-06,1.45972e-08,0.427681,0.00135356,1.26083e-06,-3.65935e-09,0.429036,0.00135607,1.24985e-06,4.00178e-11,0.430393,0.00135857,1.24997e-06,3.49917e-09,0.431753,0.00136108,1.26047e-06,-1.40366e-08,0.433116,0.00136356,1.21836e-06,2.28448e-08,0.43448,0.00136606,1.28689e-06,-1.77378e-08,0.435848,0.00136858,1.23368e-06,1.83043e-08,0.437218,0.0013711,1.28859e-06,-2.56769e-08,0.43859,0.0013736,1.21156e-06,2.47987e-08,0.439965,0.0013761,1.28595e-06,-1.39133e-08,0.441342,0.00137863,1.24421e-06,1.05202e-09,0.442722,0.00138112,1.24737e-06,9.70507e-09,0.444104,0.00138365,1.27649e-06,-1.00698e-08,0.445489,0.00138617,1.24628e-06,7.72123e-10,0.446877,0.00138867,1.24859e-06,6.98132e-09,0.448267,0.00139118,1.26954e-06,1.10477e-09,0.449659,0.00139373,1.27285e-06,-1.14003e-08,0.451054,0.00139624,1.23865e-06,1.4694e-08,0.452452,0.00139876,1.28273e-06,-1.75734e-08,0.453852,0.00140127,1.23001e-06,2.5797e-08,0.455254,0.00140381,1.3074e-06,-2.60097e-08,0.456659,0.00140635,1.22937e-06,1.86371e-08,0.458067,0.00140886,1.28529e-06,-1.8736e-08,0.459477,0.00141137,1.22908e-06,2.65048e-08,0.46089,0.00141391,1.30859e-06,-2.76784e-08,0.462305,0.00141645,1.22556e-06,2.46043e-08,0.463722,0.00141897,1.29937e-06,-1.11341e-08,0.465143,0.00142154,1.26597e-06,-9.87033e-09,0.466565,0.00142404,1.23636e-06,2.08131e-08,0.467991,0.00142657,1.2988e-06,-1.37773e-08,0.469419,0.00142913,1.25746e-06,4.49378e-09,0.470849,0.00143166,1.27094e-06,-4.19781e-09,0.472282,0.00143419,1.25835e-06,1.22975e-08,0.473717,0.00143674,1.29524e-06,-1.51902e-08,0.475155,0.00143929,1.24967e-06,1.86608e-08,0.476596,0.00144184,1.30566e-06,-2.96506e-08,0.478039,0.00144436,1.2167e-06,4.03368e-08,0.479485,0.00144692,1.33771e-06,-4.22896e-08,0.480933,0.00144947,1.21085e-06,3.94148e-08,0.482384,0.00145201,1.32909e-06,-2.59626e-08,0.483837,0.00145459,1.2512e-06,4.83124e-09,0.485293,0.0014571,1.2657e-06,6.63757e-09,0.486751,0.00145966,1.28561e-06,-1.57911e-09,0.488212,0.00146222,1.28087e-06,-3.21468e-10,0.489676,0.00146478,1.27991e-06,2.86517e-09,0.491142,0.00146735,1.2885e-06,-1.11392e-08,0.49261,0.00146989,1.25508e-06,1.18893e-08,0.494081,0.00147244,1.29075e-06,-6.61574e-09,0.495555,0.001475,1.27091e-06,1.45736e-08,0.497031,0.00147759,1.31463e-06,-2.18759e-08,0.49851,0.00148015,1.249e-06,1.33252e-08,0.499992,0.00148269,1.28897e-06,-1.62277e-09,0.501476,0.00148526,1.28411e-06,-6.83421e-09,0.502962,0.00148781,1.2636e-06,2.89596e-08,0.504451,0.00149042,1.35048e-06,-4.93997e-08,0.505943,0.00149298,1.20228e-06,4.94299e-08,0.507437,0.00149553,1.35057e-06,-2.91107e-08,0.508934,0.00149814,1.26324e-06,7.40848e-09,0.510434,0.00150069,1.28547e-06,-5.23187e-10,0.511936,0.00150326,1.2839e-06,-5.31585e-09,0.51344,0.00150581,1.26795e-06,2.17866e-08,0.514947,0.00150841,1.33331e-06,-2.22257e-08,0.516457,0.00151101,1.26663e-06,7.51178e-09,0.517969,0.00151357,1.28917e-06,-7.82128e-09,0.519484,0.00151613,1.2657e-06,2.37733e-08,0.521002,0.00151873,1.33702e-06,-2.76674e-08,0.522522,0.00152132,1.25402e-06,2.72917e-08,0.524044,0.00152391,1.3359e-06,-2.18949e-08,0.525569,0.00152652,1.27021e-06,6.83372e-10,0.527097,0.00152906,1.27226e-06,1.91613e-08,0.528628,0.00153166,1.32974e-06,-1.77241e-08,0.53016,0.00153427,1.27657e-06,-7.86963e-09,0.531696,0.0015368,1.25296e-06,4.92027e-08,0.533234,0.00153945,1.40057e-06,-6.9732e-08,0.534775,0.00154204,1.19138e-06,5.09114e-08,0.536318,0.00154458,1.34411e-06,-1.4704e-08,0.537864,0.00154722,1.3e-06,7.9048e-09,0.539413,0.00154984,1.32371e-06,-1.69152e-08,0.540964,0.00155244,1.27297e-06,1.51355e-10,0.542517,0.00155499,1.27342e-06,1.63099e-08,0.544074,0.00155758,1.32235e-06,-5.78647e-09,0.545633,0.00156021,1.30499e-06,6.83599e-09,0.547194,0.00156284,1.3255e-06,-2.15575e-08,0.548758,0.00156543,1.26083e-06,1.97892e-08,0.550325,0.00156801,1.32019e-06,2.00525e-09,0.551894,0.00157065,1.32621e-06,-2.78103e-08,0.553466,0.00157322,1.24278e-06,4.96314e-08,0.555041,0.00157586,1.39167e-06,-5.1506e-08,0.556618,0.00157849,1.23716e-06,3.71835e-08,0.558198,0.00158107,1.34871e-06,-3.76233e-08,0.55978,0.00158366,1.23584e-06,5.37052e-08,0.561365,0.00158629,1.39695e-06,-5.79884e-08,0.562953,0.00158891,1.22299e-06,5.90392e-08,0.564543,0.00159153,1.4001e-06,-5.89592e-08,0.566136,0.00159416,1.22323e-06,5.7588e-08,0.567731,0.00159678,1.39599e-06,-5.21835e-08,0.569329,0.00159941,1.23944e-06,3.19369e-08,0.57093,0.00160199,1.33525e-06,-1.59594e-08,0.572533,0.00160461,1.28737e-06,3.19006e-08,0.574139,0.00160728,1.38307e-06,-5.20383e-08,0.575748,0.00160989,1.22696e-06,5.70431e-08,0.577359,0.00161251,1.39809e-06,-5.69247e-08,0.578973,0.00161514,1.22731e-06,5.14463e-08,0.580589,0.00161775,1.38165e-06,-2.9651e-08,0.582208,0.00162042,1.2927e-06,7.55339e-09,0.58383,0.00162303,1.31536e-06,-5.62636e-10,0.585455,0.00162566,1.31367e-06,-5.30281e-09,0.587081,0.00162827,1.29776e-06,2.17738e-08,0.588711,0.00163093,1.36309e-06,-2.21875e-08,0.590343,0.00163359,1.29652e-06,7.37164e-09,0.591978,0.00163621,1.31864e-06,-7.29907e-09,0.593616,0.00163882,1.29674e-06,2.18247e-08,0.595256,0.00164148,1.36221e-06,-2.03952e-08,0.596899,0.00164414,1.30103e-06,1.51241e-10,0.598544,0.00164675,1.30148e-06,1.97902e-08,0.600192,0.00164941,1.36085e-06,-1.97074e-08,0.601843,0.00165207,1.30173e-06,-5.65175e-10,0.603496,0.00165467,1.30004e-06,2.1968e-08,0.605152,0.00165734,1.36594e-06,-2.77024e-08,0.606811,0.00165999,1.28283e-06,2.92369e-08,0.608472,0.00166264,1.37054e-06,-2.96407e-08,0.610136,0.00166529,1.28162e-06,2.97215e-08,0.611803,0.00166795,1.37079e-06,-2.96408e-08,0.613472,0.0016706,1.28186e-06,2.92371e-08,0.615144,0.00167325,1.36957e-06,-2.77031e-08,0.616819,0.00167591,1.28647e-06,2.19708e-08,0.618496,0.00167855,1.35238e-06,-5.75407e-10,0.620176,0.00168125,1.35065e-06,-1.9669e-08,0.621858,0.00168389,1.29164e-06,1.96468e-08,0.623544,0.00168653,1.35058e-06,6.86403e-10,0.625232,0.00168924,1.35264e-06,-2.23924e-08,0.626922,0.00169187,1.28547e-06,2.92788e-08,0.628615,0.00169453,1.3733e-06,-3.51181e-08,0.630311,0.00169717,1.26795e-06,5.15889e-08,0.63201,0.00169987,1.42272e-06,-5.2028e-08,0.633711,0.00170255,1.26663e-06,3.73139e-08,0.635415,0.0017052,1.37857e-06,-3.76227e-08,0.637121,0.00170784,1.2657e-06,5.35722e-08,0.63883,0.00171054,1.42642e-06,-5.74567e-08,0.640542,0.00171322,1.25405e-06,5.70456e-08,0.642257,0.0017159,1.42519e-06,-5.15163e-08,0.643974,0.00171859,1.27064e-06,2.98103e-08,0.645694,0.00172122,1.36007e-06,-8.12016e-09,0.647417,0.00172392,1.33571e-06,2.67039e-09,0.649142,0.0017266,1.34372e-06,-2.56152e-09,0.65087,0.00172928,1.33604e-06,7.57571e-09,0.6526,0.00173197,1.35876e-06,-2.77413e-08,0.654334,0.00173461,1.27554e-06,4.3785e-08,0.65607,0.00173729,1.40689e-06,-2.81896e-08,0.657808,0.00174002,1.32233e-06,9.36893e-09,0.65955,0.00174269,1.35043e-06,-9.28617e-09,0.661294,0.00174536,1.32257e-06,2.77757e-08,0.66304,0.00174809,1.4059e-06,-4.2212e-08,0.66479,0.00175078,1.27926e-06,2.1863e-08,0.666542,0.0017534,1.34485e-06,1.43648e-08,0.668297,0.00175613,1.38795e-06,-1.97177e-08,0.670054,0.00175885,1.3288e-06,4.90115e-09,0.671814,0.00176152,1.3435e-06,1.13232e-10,0.673577,0.00176421,1.34384e-06,-5.3542e-09,0.675343,0.00176688,1.32778e-06,2.13035e-08,0.677111,0.0017696,1.39169e-06,-2.02553e-08,0.678882,0.00177232,1.33092e-06,1.13005e-10,0.680656,0.00177499,1.33126e-06,1.98031e-08,0.682432,0.00177771,1.39067e-06,-1.97211e-08,0.684211,0.00178043,1.33151e-06,-5.2349e-10,0.685993,0.00178309,1.32994e-06,2.18151e-08,0.687777,0.00178582,1.39538e-06,-2.71325e-08,0.689564,0.00178853,1.31398e-06,2.71101e-08,0.691354,0.00179124,1.39531e-06,-2.17035e-08,0.693147,0.00179396,1.3302e-06,9.92865e-11,0.694942,0.00179662,1.3305e-06,2.13063e-08,0.69674,0.00179935,1.39442e-06,-2.57198e-08,0.698541,0.00180206,1.31726e-06,2.19682e-08,0.700344,0.00180476,1.38317e-06,-2.54852e-09,0.70215,0.00180752,1.37552e-06,-1.17741e-08,0.703959,0.00181023,1.3402e-06,-9.95999e-09,0.705771,0.00181288,1.31032e-06,5.16141e-08,0.707585,0.00181566,1.46516e-06,-7.72869e-08,0.709402,0.00181836,1.2333e-06,7.87197e-08,0.711222,0.00182106,1.46946e-06,-5.87781e-08,0.713044,0.00182382,1.29312e-06,3.71834e-08,0.714869,0.00182652,1.40467e-06,-3.03511e-08,0.716697,0.00182924,1.31362e-06,2.46161e-08,0.718528,0.00183194,1.38747e-06,-8.5087e-09,0.720361,0.00183469,1.36194e-06,9.41892e-09,0.722197,0.00183744,1.3902e-06,-2.91671e-08,0.724036,0.00184014,1.3027e-06,4.76448e-08,0.725878,0.00184288,1.44563e-06,-4.22028e-08,0.727722,0.00184565,1.31902e-06,1.95682e-09,0.729569,0.00184829,1.3249e-06,3.43754e-08,0.731419,0.00185104,1.42802e-06,-2.0249e-08,0.733271,0.00185384,1.36727e-06,-1.29838e-08,0.735126,0.00185654,1.32832e-06,1.25794e-08,0.736984,0.00185923,1.36606e-06,2.22711e-08,0.738845,0.00186203,1.43287e-06,-4.20594e-08,0.740708,0.00186477,1.3067e-06,2.67571e-08,0.742574,0.00186746,1.38697e-06,-5.36424e-09,0.744443,0.00187022,1.37087e-06,-5.30023e-09,0.746315,0.00187295,1.35497e-06,2.65653e-08,0.748189,0.00187574,1.43467e-06,-4.13564e-08,0.750066,0.00187848,1.3106e-06,1.9651e-08,0.751946,0.00188116,1.36955e-06,2.23572e-08,0.753828,0.00188397,1.43663e-06,-4.9475e-08,0.755714,0.00188669,1.2882e-06,5.63335e-08,0.757602,0.00188944,1.4572e-06,-5.66499e-08,0.759493,0.00189218,1.28725e-06,5.10567e-08,0.761386,0.00189491,1.44042e-06,-2.83677e-08,0.763283,0.00189771,1.35532e-06,2.80962e-09,0.765182,0.00190042,1.36375e-06,1.71293e-08,0.767083,0.0019032,1.41513e-06,-1.17221e-08,0.768988,0.001906,1.37997e-06,-2.98453e-08,0.770895,0.00190867,1.29043e-06,7.14987e-08,0.772805,0.00191146,1.50493e-06,-7.73354e-08,0.774718,0.00191424,1.27292e-06,5.90292e-08,0.776634,0.00191697,1.45001e-06,-3.9572e-08,0.778552,0.00191975,1.33129e-06,3.9654e-08,0.780473,0.00192253,1.45026e-06,-5.94395e-08,0.782397,0.00192525,1.27194e-06,7.88945e-08,0.784324,0.00192803,1.50862e-06,-7.73249e-08,0.786253,0.00193082,1.27665e-06,5.15913e-08,0.788185,0.00193352,1.43142e-06,-9.83099e-09,0.79012,0.00193636,1.40193e-06,-1.22672e-08,0.792058,0.00193912,1.36513e-06,-7.05275e-10,0.793999,0.00194185,1.36301e-06,1.50883e-08,0.795942,0.00194462,1.40828e-06,-4.33147e-11,0.797888,0.00194744,1.40815e-06,-1.49151e-08,0.799837,0.00195021,1.3634e-06,9.93244e-11,0.801788,0.00195294,1.3637e-06,1.45179e-08,0.803743,0.00195571,1.40725e-06,1.43363e-09,0.8057,0.00195853,1.41155e-06,-2.02525e-08,0.80766,0.00196129,1.35079e-06,1.99718e-08,0.809622,0.00196405,1.41071e-06,-3.01649e-11,0.811588,0.00196687,1.41062e-06,-1.9851e-08,0.813556,0.00196964,1.35107e-06,1.98296e-08,0.815527,0.0019724,1.41056e-06,1.37485e-10,0.817501,0.00197522,1.41097e-06,-2.03796e-08,0.819477,0.00197798,1.34983e-06,2.17763e-08,0.821457,0.00198074,1.41516e-06,-7.12085e-09,0.823439,0.00198355,1.3938e-06,6.70707e-09,0.825424,0.00198636,1.41392e-06,-1.97074e-08,0.827412,0.00198913,1.35479e-06,1.25179e-08,0.829402,0.00199188,1.39235e-06,2.92405e-08,0.831396,0.00199475,1.48007e-06,-6.98755e-08,0.833392,0.0019975,1.27044e-06,7.14477e-08,0.835391,0.00200026,1.48479e-06,-3.71014e-08,0.837392,0.00200311,1.37348e-06,1.73533e-08,0.839397,0.00200591,1.42554e-06,-3.23118e-08,0.841404,0.00200867,1.32861e-06,5.2289e-08,0.843414,0.00201148,1.48547e-06,-5.76348e-08,0.845427,0.00201428,1.31257e-06,5.9041e-08,0.847443,0.00201708,1.48969e-06,-5.93197e-08,0.849461,0.00201988,1.31173e-06,5.90289e-08,0.851482,0.00202268,1.48882e-06,-5.75864e-08,0.853507,0.00202549,1.31606e-06,5.21075e-08,0.855533,0.00202828,1.47238e-06,-3.16344e-08,0.857563,0.00203113,1.37748e-06,1.48257e-08,0.859596,0.00203393,1.42196e-06,-2.76684e-08,0.861631,0.00203669,1.33895e-06,3.62433e-08,0.863669,0.00203947,1.44768e-06,1.90463e-09,0.86571,0.00204237,1.45339e-06,-4.38617e-08,0.867754,0.00204515,1.32181e-06,5.43328e-08,0.8698,0.00204796,1.48481e-06,-5.42603e-08,0.87185,0.00205076,1.32203e-06,4.34989e-08,0.873902,0.00205354,1.45252e-06,-5.26029e-10,0.875957,0.00205644,1.45095e-06,-4.13949e-08,0.878015,0.00205922,1.32676e-06,4.68962e-08,0.880075,0.00206201,1.46745e-06,-2.69807e-08,0.882139,0.00206487,1.38651e-06,1.42181e-09,0.884205,0.00206764,1.39077e-06,2.12935e-08,0.886274,0.00207049,1.45465e-06,-2.69912e-08,0.888346,0.00207332,1.37368e-06,2.70664e-08,0.890421,0.00207615,1.45488e-06,-2.16698e-08,0.892498,0.00207899,1.38987e-06,8.14756e-12,0.894579,0.00208177,1.38989e-06,2.16371e-08,0.896662,0.00208462,1.45481e-06,-2.6952e-08,0.898748,0.00208744,1.37395e-06,2.65663e-08,0.900837,0.00209027,1.45365e-06,-1.97084e-08,0.902928,0.00209312,1.39452e-06,-7.33731e-09,0.905023,0.00209589,1.37251e-06,4.90578e-08,0.90712,0.00209878,1.51968e-06,-6.96845e-08,0.90922,0.00210161,1.31063e-06,5.08664e-08,0.911323,0.00210438,1.46323e-06,-1.45717e-08,0.913429,0.00210727,1.41952e-06,7.42038e-09,0.915538,0.00211013,1.44178e-06,-1.51097e-08,0.917649,0.00211297,1.39645e-06,-6.58618e-09,0.919764,0.00211574,1.37669e-06,4.14545e-08,0.921881,0.00211862,1.50105e-06,-4.00222e-08,0.924001,0.0021215,1.38099e-06,-5.7518e-10,0.926124,0.00212426,1.37926e-06,4.23229e-08,0.92825,0.00212714,1.50623e-06,-4.9507e-08,0.930378,0.00213001,1.35771e-06,3.64958e-08,0.93251,0.00213283,1.4672e-06,-3.68713e-08,0.934644,0.00213566,1.35658e-06,5.13848e-08,0.936781,0.00213852,1.51074e-06,-4.94585e-08,0.938921,0.0021414,1.36236e-06,2.72399e-08,0.941064,0.0021442,1.44408e-06,1.0372e-10,0.943209,0.00214709,1.44439e-06,-2.76547e-08,0.945358,0.0021499,1.36143e-06,5.09106e-08,0.947509,0.00215277,1.51416e-06,-5.67784e-08,0.949663,0.00215563,1.34382e-06,5.69935e-08,0.95182,0.00215849,1.5148e-06,-5.19861e-08,0.95398,0.00216136,1.35885e-06,3.17417e-08,0.956143,0.00216418,1.45407e-06,-1.53758e-08,0.958309,0.00216704,1.40794e-06,2.97615e-08,0.960477,0.00216994,1.49723e-06,-4.40657e-08,0.962649,0.00217281,1.36503e-06,2.72919e-08,0.964823,0.00217562,1.44691e-06,-5.49729e-09,0.967,0.0021785,1.43041e-06,-5.30273e-09,0.96918,0.00218134,1.41451e-06,2.67084e-08,0.971363,0.00218425,1.49463e-06,-4.19265e-08,0.973548,0.00218711,1.36885e-06,2.17881e-08,0.975737,0.00218992,1.43422e-06,1.43789e-08,0.977928,0.00219283,1.47735e-06,-1.96989e-08,0.980122,0.00219572,1.41826e-06,4.81221e-09,0.98232,0.00219857,1.43269e-06,4.50048e-10,0.98452,0.00220144,1.43404e-06,-6.61237e-09,0.986722,0.00220429,1.41421e-06,2.59993e-08,0.988928,0.0022072,1.4922e-06,-3.77803e-08,0.991137,0.00221007,1.37886e-06,5.9127e-09,0.993348,0.00221284,1.3966e-06,1.33339e-07,0.995563,0.00221604,1.79662e-06,-5.98872e-07,0.99778,0.00222015,0.,0.}; + + template + __device__ __forceinline__ void RGB2LabConvert_f(const T& src, D& dst) + { + const float _1_3 = 1.0f / 3.0f; + const float _a = 16.0f / 116.0f; + + float B = blueIdx == 0 ? src.x : src.z; + float G = src.y; + float R = blueIdx == 0 ? src.z : src.x; + + if (srgb) + { + B = splineInterpolate(B * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + G = splineInterpolate(G * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + R = splineInterpolate(R * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + } + + float X = B * 0.189828f + G * 0.376219f + R * 0.433953f; + float Y = B * 0.072169f + G * 0.715160f + R * 0.212671f; + float Z = B * 0.872766f + G * 0.109477f + R * 0.017758f; + + float FX = X > 0.008856f ? ::powf(X, _1_3) : (7.787f * X + _a); + float FY = Y > 0.008856f ? ::powf(Y, _1_3) : (7.787f * Y + _a); + float FZ = Z > 0.008856f ? ::powf(Z, _1_3) : (7.787f * Z + _a); + + float L = Y > 0.008856f ? (116.f * FY - 16.f) : (903.3f * Y); + float a = 500.f * (FX - FY); + float b = 200.f * (FY - FZ); + + dst.x = L; + dst.y = a; + dst.z = b; + } + + template struct RGB2Lab; + template + struct RGB2Lab + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2LabConvert_b(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2Lab() {} + __host__ __device__ __forceinline__ RGB2Lab(const RGB2Lab&) {} + }; + template + struct RGB2Lab + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2LabConvert_f(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2Lab() {} + __host__ __device__ __forceinline__ RGB2Lab(const RGB2Lab&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2Lab_TRAITS(name, scn, dcn, srgb, blueIdx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2Lab functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + __constant__ float c_sRGBInvGammaTab[] = {0,0.0126255,0.,-8.33961e-06,0.0126172,0.0126005,-2.50188e-05,4.1698e-05,0.0252344,0.0126756,0.000100075,-0.000158451,0.0378516,0.0124004,-0.000375277,-0.000207393,0.0496693,0.0110276,-0.000997456,0.00016837,0.0598678,0.00953783,-0.000492346,2.07235e-05,0.068934,0.00861531,-0.000430176,3.62876e-05,0.0771554,0.00786382,-0.000321313,1.87625e-05,0.0847167,0.00727748,-0.000265025,1.53594e-05,0.0917445,0.00679351,-0.000218947,1.10545e-05,0.0983301,0.00638877,-0.000185784,8.66984e-06,0.104542,0.00604322,-0.000159774,6.82996e-06,0.110432,0.00574416,-0.000139284,5.51008e-06,0.116042,0.00548212,-0.000122754,4.52322e-06,0.121406,0.00525018,-0.000109184,3.75557e-06,0.126551,0.00504308,-9.79177e-05,3.17134e-06,0.131499,0.00485676,-8.84037e-05,2.68469e-06,0.13627,0.004688,-8.03496e-05,2.31725e-06,0.14088,0.00453426,-7.33978e-05,2.00868e-06,0.145343,0.00439349,-6.73718e-05,1.74775e-06,0.149671,0.00426399,-6.21286e-05,1.53547e-06,0.153875,0.00414434,-5.75222e-05,1.364e-06,0.157963,0.00403338,-5.34301e-05,1.20416e-06,0.161944,0.00393014,-4.98177e-05,1.09114e-06,0.165825,0.00383377,-4.65443e-05,9.57987e-07,0.169613,0.00374356,-4.36703e-05,8.88359e-07,0.173314,0.00365888,-4.10052e-05,7.7849e-07,0.176933,0.00357921,-3.86697e-05,7.36254e-07,0.180474,0.00350408,-3.6461e-05,6.42534e-07,0.183942,0.00343308,-3.45334e-05,6.12614e-07,0.187342,0.00336586,-3.26955e-05,5.42894e-07,0.190675,0.00330209,-3.10669e-05,5.08967e-07,0.193947,0.00324149,-2.954e-05,4.75977e-07,0.197159,0.00318383,-2.8112e-05,4.18343e-07,0.200315,0.00312887,-2.6857e-05,4.13651e-07,0.203418,0.00307639,-2.5616e-05,3.70847e-07,0.206469,0.00302627,-2.45035e-05,3.3813e-07,0.209471,0.00297828,-2.34891e-05,3.32999e-07,0.212426,0.0029323,-2.24901e-05,2.96826e-07,0.215336,0.00288821,-2.15996e-05,2.82736e-07,0.218203,0.00284586,-2.07514e-05,2.70961e-07,0.221029,0.00280517,-1.99385e-05,2.42744e-07,0.223814,0.00276602,-1.92103e-05,2.33277e-07,0.226561,0.0027283,-1.85105e-05,2.2486e-07,0.229271,0.00269195,-1.78359e-05,2.08383e-07,0.231945,0.00265691,-1.72108e-05,1.93305e-07,0.234585,0.00262307,-1.66308e-05,1.80687e-07,0.237192,0.00259035,-1.60888e-05,1.86632e-07,0.239766,0.00255873,-1.55289e-05,1.60569e-07,0.24231,0.00252815,-1.50472e-05,1.54566e-07,0.244823,0.00249852,-1.45835e-05,1.59939e-07,0.247307,0.00246983,-1.41037e-05,1.29549e-07,0.249763,0.00244202,-1.3715e-05,1.41429e-07,0.252191,0.00241501,-1.32907e-05,1.39198e-07,0.254593,0.00238885,-1.28731e-05,1.06444e-07,0.256969,0.00236342,-1.25538e-05,1.2048e-07,0.25932,0.00233867,-1.21924e-05,1.26892e-07,0.261647,0.00231467,-1.18117e-05,8.72084e-08,0.26395,0.00229131,-1.15501e-05,1.20323e-07,0.26623,0.00226857,-1.11891e-05,8.71514e-08,0.268487,0.00224645,-1.09276e-05,9.73165e-08,0.270723,0.00222489,-1.06357e-05,8.98259e-08,0.272937,0.00220389,-1.03662e-05,7.98218e-08,0.275131,0.00218339,-1.01267e-05,9.75254e-08,0.277304,0.00216343,-9.83416e-06,6.65195e-08,0.279458,0.00214396,-9.63461e-06,8.34313e-08,0.281592,0.00212494,-9.38431e-06,7.65919e-08,0.283708,0.00210641,-9.15454e-06,5.7236e-08,0.285805,0.00208827,-8.98283e-06,8.18939e-08,0.287885,0.00207055,-8.73715e-06,6.2224e-08,0.289946,0.00205326,-8.55047e-06,5.66388e-08,0.291991,0.00203633,-8.38056e-06,6.88491e-08,0.294019,0.00201978,-8.17401e-06,5.53955e-08,0.296031,0.00200359,-8.00782e-06,6.71971e-08,0.298027,0.00198778,-7.80623e-06,3.34439e-08,0.300007,0.00197227,-7.7059e-06,6.7248e-08,0.301971,0.00195706,-7.50416e-06,5.51915e-08,0.303921,0.00194221,-7.33858e-06,3.98124e-08,0.305856,0.00192766,-7.21915e-06,5.37795e-08,0.307776,0.00191338,-7.05781e-06,4.30919e-08,0.309683,0.00189939,-6.92853e-06,4.20744e-08,0.311575,0.00188566,-6.80231e-06,5.68321e-08,0.313454,0.00187223,-6.63181e-06,2.86195e-08,0.31532,0.00185905,-6.54595e-06,3.73075e-08,0.317172,0.00184607,-6.43403e-06,6.05684e-08,0.319012,0.00183338,-6.25233e-06,1.84426e-08,0.320839,0.00182094,-6.197e-06,4.44757e-08,0.322654,0.00180867,-6.06357e-06,4.20729e-08,0.324456,0.00179667,-5.93735e-06,2.56511e-08,0.326247,0.00178488,-5.8604e-06,3.41368e-08,0.328026,0.00177326,-5.75799e-06,4.64177e-08,0.329794,0.00176188,-5.61874e-06,1.86107e-08,0.33155,0.0017507,-5.5629e-06,2.81511e-08,0.333295,0.00173966,-5.47845e-06,4.75987e-08,0.335029,0.00172884,-5.33565e-06,1.98726e-08,0.336753,0.00171823,-5.27604e-06,2.19226e-08,0.338466,0.00170775,-5.21027e-06,4.14483e-08,0.340169,0.00169745,-5.08592e-06,2.09017e-08,0.341861,0.00168734,-5.02322e-06,2.39561e-08,0.343543,0.00167737,-4.95135e-06,3.22852e-08,0.345216,0.00166756,-4.85449e-06,2.57173e-08,0.346878,0.00165793,-4.77734e-06,1.38569e-08,0.348532,0.00164841,-4.73577e-06,3.80634e-08,0.350175,0.00163906,-4.62158e-06,1.27043e-08,0.35181,0.00162985,-4.58347e-06,3.03279e-08,0.353435,0.00162078,-4.49249e-06,1.49961e-08,0.355051,0.00161184,-4.4475e-06,2.88977e-08,0.356659,0.00160303,-4.3608e-06,1.84241e-08,0.358257,0.00159436,-4.30553e-06,1.6616e-08,0.359848,0.0015858,-4.25568e-06,3.43218e-08,0.361429,0.00157739,-4.15272e-06,-4.89172e-09,0.363002,0.00156907,-4.16739e-06,4.48498e-08,0.364567,0.00156087,-4.03284e-06,4.30676e-09,0.366124,0.00155282,-4.01992e-06,2.73303e-08,0.367673,0.00154486,-3.93793e-06,5.58036e-09,0.369214,0.001537,-3.92119e-06,3.97554e-08,0.370747,0.00152928,-3.80193e-06,-1.55904e-08,0.372272,0.00152163,-3.8487e-06,5.24081e-08,0.37379,0.00151409,-3.69147e-06,-1.52272e-08,0.375301,0.00150666,-3.73715e-06,3.83028e-08,0.376804,0.0014993,-3.62225e-06,1.10278e-08,0.378299,0.00149209,-3.58916e-06,6.99326e-09,0.379788,0.00148493,-3.56818e-06,2.06038e-08,0.381269,0.00147786,-3.50637e-06,2.98009e-08,0.382744,0.00147093,-3.41697e-06,-2.05978e-08,0.384211,0.00146404,-3.47876e-06,5.25899e-08,0.385672,0.00145724,-3.32099e-06,-1.09471e-08,0.387126,0.00145056,-3.35383e-06,2.10009e-08,0.388573,0.00144392,-3.29083e-06,1.63501e-08,0.390014,0.00143739,-3.24178e-06,3.00641e-09,0.391448,0.00143091,-3.23276e-06,3.12282e-08,0.392875,0.00142454,-3.13908e-06,-8.70932e-09,0.394297,0.00141824,-3.16521e-06,3.34114e-08,0.395712,0.00141201,-3.06497e-06,-5.72754e-09,0.397121,0.00140586,-3.08215e-06,1.9301e-08,0.398524,0.00139975,-3.02425e-06,1.7931e-08,0.39992,0.00139376,-2.97046e-06,-1.61822e-09,0.401311,0.00138781,-2.97531e-06,1.83442e-08,0.402696,0.00138192,-2.92028e-06,1.76485e-08,0.404075,0.00137613,-2.86733e-06,4.68617e-10,0.405448,0.00137039,-2.86593e-06,1.02794e-08,0.406816,0.00136469,-2.83509e-06,1.80179e-08,0.408178,0.00135908,-2.78104e-06,7.05594e-09,0.409534,0.00135354,-2.75987e-06,1.33633e-08,0.410885,0.00134806,-2.71978e-06,-9.04568e-10,0.41223,0.00134261,-2.72249e-06,2.0057e-08,0.41357,0.00133723,-2.66232e-06,1.00841e-08,0.414905,0.00133194,-2.63207e-06,-7.88835e-10,0.416234,0.00132667,-2.63444e-06,2.28734e-08,0.417558,0.00132147,-2.56582e-06,-1.29785e-09,0.418877,0.00131633,-2.56971e-06,1.21205e-08,0.420191,0.00131123,-2.53335e-06,1.24202e-08,0.421499,0.0013062,-2.49609e-06,-2.19681e-09,0.422803,0.0013012,-2.50268e-06,2.61696e-08,0.424102,0.00129628,-2.42417e-06,-1.30747e-08,0.425396,0.00129139,-2.46339e-06,2.6129e-08,0.426685,0.00128654,-2.38501e-06,-2.03454e-09,0.427969,0.00128176,-2.39111e-06,1.18115e-08,0.429248,0.00127702,-2.35567e-06,1.43932e-08,0.430523,0.00127235,-2.31249e-06,-9.77965e-09,0.431793,0.00126769,-2.34183e-06,2.47253e-08,0.433058,0.00126308,-2.26766e-06,2.85278e-10,0.434319,0.00125855,-2.2668e-06,3.93614e-09,0.435575,0.00125403,-2.25499e-06,1.37722e-08,0.436827,0.00124956,-2.21368e-06,5.79803e-10,0.438074,0.00124513,-2.21194e-06,1.37112e-08,0.439317,0.00124075,-2.1708e-06,4.17973e-09,0.440556,0.00123642,-2.15826e-06,-6.27703e-10,0.44179,0.0012321,-2.16015e-06,2.81332e-08,0.44302,0.00122787,-2.07575e-06,-2.24985e-08,0.444246,0.00122365,-2.14324e-06,3.20586e-08,0.445467,0.00121946,-2.04707e-06,-1.6329e-08,0.446685,0.00121532,-2.09605e-06,3.32573e-08,0.447898,0.00121122,-1.99628e-06,-2.72927e-08,0.449107,0.00120715,-2.07816e-06,4.6111e-08,0.450312,0.00120313,-1.93983e-06,-3.79416e-08,0.451514,0.00119914,-2.05365e-06,4.60507e-08,0.452711,0.00119517,-1.9155e-06,-2.7052e-08,0.453904,0.00119126,-1.99666e-06,3.23551e-08,0.455093,0.00118736,-1.89959e-06,-1.29613e-08,0.456279,0.00118352,-1.93848e-06,1.94905e-08,0.45746,0.0011797,-1.88e-06,-5.39588e-09,0.458638,0.00117593,-1.89619e-06,2.09282e-09,0.459812,0.00117214,-1.88991e-06,2.68267e-08,0.460982,0.00116844,-1.80943e-06,-1.99925e-08,0.462149,0.00116476,-1.86941e-06,2.3341e-08,0.463312,0.00116109,-1.79939e-06,-1.37674e-08,0.464471,0.00115745,-1.84069e-06,3.17287e-08,0.465627,0.00115387,-1.7455e-06,-2.37407e-08,0.466779,0.00115031,-1.81673e-06,3.34315e-08,0.467927,0.00114677,-1.71643e-06,-2.05786e-08,0.469073,0.00114328,-1.77817e-06,1.90802e-08,0.470214,0.00113978,-1.72093e-06,3.86247e-09,0.471352,0.00113635,-1.70934e-06,-4.72759e-09,0.472487,0.00113292,-1.72352e-06,1.50478e-08,0.473618,0.00112951,-1.67838e-06,4.14108e-09,0.474746,0.00112617,-1.66595e-06,-1.80986e-09,0.47587,0.00112283,-1.67138e-06,3.09816e-09,0.476991,0.0011195,-1.66209e-06,1.92198e-08,0.478109,0.00111623,-1.60443e-06,-2.03726e-08,0.479224,0.00111296,-1.66555e-06,3.2468e-08,0.480335,0.00110973,-1.56814e-06,-2.00922e-08,0.481443,0.00110653,-1.62842e-06,1.80983e-08,0.482548,0.00110333,-1.57413e-06,7.30362e-09,0.48365,0.0011002,-1.55221e-06,-1.75107e-08,0.484749,0.00109705,-1.60475e-06,3.29373e-08,0.485844,0.00109393,-1.50594e-06,-2.48315e-08,0.486937,0.00109085,-1.58043e-06,3.65865e-08,0.488026,0.0010878,-1.47067e-06,-3.21078e-08,0.489112,0.00108476,-1.56699e-06,3.22397e-08,0.490195,0.00108172,-1.47027e-06,-7.44391e-09,0.491276,0.00107876,-1.49261e-06,-2.46428e-09,0.492353,0.00107577,-1.5e-06,1.73011e-08,0.493427,0.00107282,-1.4481e-06,-7.13552e-09,0.494499,0.0010699,-1.4695e-06,1.1241e-08,0.495567,0.001067,-1.43578e-06,-8.02637e-09,0.496633,0.0010641,-1.45986e-06,2.08645e-08,0.497695,0.00106124,-1.39726e-06,-1.58271e-08,0.498755,0.0010584,-1.44475e-06,1.26415e-08,0.499812,0.00105555,-1.40682e-06,2.48655e-08,0.500866,0.00105281,-1.33222e-06,-5.24988e-08,0.501918,0.00104999,-1.48972e-06,6.59206e-08,0.502966,0.00104721,-1.29196e-06,-3.237e-08,0.504012,0.00104453,-1.38907e-06,3.95479e-09,0.505055,0.00104176,-1.3772e-06,1.65509e-08,0.506096,0.00103905,-1.32755e-06,-1.05539e-08,0.507133,0.00103637,-1.35921e-06,2.56648e-08,0.508168,0.00103373,-1.28222e-06,-3.25007e-08,0.509201,0.00103106,-1.37972e-06,4.47336e-08,0.51023,0.00102844,-1.24552e-06,-2.72245e-08,0.511258,0.00102587,-1.32719e-06,4.55952e-09,0.512282,0.00102323,-1.31352e-06,8.98645e-09,0.513304,0.00102063,-1.28656e-06,1.90992e-08,0.514323,0.00101811,-1.22926e-06,-2.57786e-08,0.51534,0.00101557,-1.30659e-06,2.44104e-08,0.516355,0.00101303,-1.23336e-06,-1.22581e-08,0.517366,0.00101053,-1.27014e-06,2.4622e-08,0.518376,0.00100806,-1.19627e-06,-2.66253e-08,0.519383,0.00100559,-1.27615e-06,2.22744e-08,0.520387,0.00100311,-1.20932e-06,-2.8679e-09,0.521389,0.00100068,-1.21793e-06,-1.08029e-08,0.522388,0.000998211,-1.25034e-06,4.60795e-08,0.523385,0.000995849,-1.1121e-06,-5.4306e-08,0.52438,0.000993462,-1.27502e-06,5.19354e-08,0.525372,0.000991067,-1.11921e-06,-3.42262e-08,0.526362,0.000988726,-1.22189e-06,2.53646e-08,0.52735,0.000986359,-1.14579e-06,-7.62782e-09,0.528335,0.000984044,-1.16868e-06,5.14668e-09,0.529318,0.000981722,-1.15324e-06,-1.29589e-08,0.530298,0.000979377,-1.19211e-06,4.66888e-08,0.531276,0.000977133,-1.05205e-06,-5.45868e-08,0.532252,0.000974865,-1.21581e-06,5.24495e-08,0.533226,0.000972591,-1.05846e-06,-3.60019e-08,0.534198,0.000970366,-1.16647e-06,3.19537e-08,0.535167,0.000968129,-1.07061e-06,-3.2208e-08,0.536134,0.000965891,-1.16723e-06,3.72738e-08,0.537099,0.000963668,-1.05541e-06,2.32205e-09,0.538061,0.000961564,-1.04844e-06,-4.65618e-08,0.539022,0.000959328,-1.18813e-06,6.47159e-08,0.53998,0.000957146,-9.93979e-07,-3.3488e-08,0.540936,0.000955057,-1.09444e-06,9.63166e-09,0.54189,0.000952897,-1.06555e-06,-5.03871e-09,0.542842,0.000950751,-1.08066e-06,1.05232e-08,0.543792,0.000948621,-1.04909e-06,2.25503e-08,0.544739,0.000946591,-9.81444e-07,-4.11195e-08,0.545685,0.000944504,-1.1048e-06,2.27182e-08,0.546628,0.000942363,-1.03665e-06,9.85146e-09,0.54757,0.000940319,-1.00709e-06,-2.51938e-09,0.548509,0.000938297,-1.01465e-06,2.25858e-10,0.549446,0.000936269,-1.01397e-06,1.61598e-09,0.550381,0.000934246,-1.00913e-06,-6.68983e-09,0.551315,0.000932207,-1.0292e-06,2.51434e-08,0.552246,0.000930224,-9.53765e-07,-3.42793e-08,0.553175,0.000928214,-1.0566e-06,5.23688e-08,0.554102,0.000926258,-8.99497e-07,-5.59865e-08,0.555028,0.000924291,-1.06746e-06,5.23679e-08,0.555951,0.000922313,-9.10352e-07,-3.42763e-08,0.556872,0.00092039,-1.01318e-06,2.51326e-08,0.557792,0.000918439,-9.37783e-07,-6.64954e-09,0.558709,0.000916543,-9.57732e-07,1.46554e-09,0.559625,0.000914632,-9.53335e-07,7.87281e-10,0.560538,0.000912728,-9.50973e-07,-4.61466e-09,0.56145,0.000910812,-9.64817e-07,1.76713e-08,0.56236,0.000908935,-9.11804e-07,-6.46564e-09,0.563268,0.000907092,-9.312e-07,8.19121e-09,0.564174,0.000905255,-9.06627e-07,-2.62992e-08,0.565078,0.000903362,-9.85524e-07,3.74007e-08,0.565981,0.000901504,-8.73322e-07,-4.0942e-09,0.566882,0.000899745,-8.85605e-07,-2.1024e-08,0.56778,0.00089791,-9.48677e-07,2.85854e-08,0.568677,0.000896099,-8.62921e-07,-3.3713e-08,0.569573,0.000894272,-9.64059e-07,4.6662e-08,0.570466,0.000892484,-8.24073e-07,-3.37258e-08,0.571358,0.000890734,-9.25251e-07,2.86365e-08,0.572247,0.00088897,-8.39341e-07,-2.12155e-08,0.573135,0.000887227,-9.02988e-07,-3.37913e-09,0.574022,0.000885411,-9.13125e-07,3.47319e-08,0.574906,0.000883689,-8.08929e-07,-1.63394e-08,0.575789,0.000882022,-8.57947e-07,-2.8979e-08,0.57667,0.00088022,-9.44885e-07,7.26509e-08,0.57755,0.000878548,-7.26932e-07,-8.28106e-08,0.578427,0.000876845,-9.75364e-07,7.97774e-08,0.579303,0.000875134,-7.36032e-07,-5.74849e-08,0.580178,0.00087349,-9.08486e-07,3.09529e-08,0.58105,0.000871765,-8.15628e-07,-6.72206e-09,0.581921,0.000870114,-8.35794e-07,-4.06451e-09,0.582791,0.00086843,-8.47987e-07,2.29799e-08,0.583658,0.000866803,-7.79048e-07,-2.82503e-08,0.584524,0.00086516,-8.63799e-07,3.04167e-08,0.585388,0.000863524,-7.72548e-07,-3.38119e-08,0.586251,0.000861877,-8.73984e-07,4.52264e-08,0.587112,0.000860265,-7.38305e-07,-2.78842e-08,0.587972,0.000858705,-8.21958e-07,6.70567e-09,0.58883,0.000857081,-8.01841e-07,1.06161e-09,0.589686,0.000855481,-7.98656e-07,-1.09521e-08,0.590541,0.00085385,-8.31512e-07,4.27468e-08,0.591394,0.000852316,-7.03272e-07,-4.08257e-08,0.592245,0.000850787,-8.25749e-07,1.34677e-09,0.593095,0.000849139,-8.21709e-07,3.54387e-08,0.593944,0.000847602,-7.15393e-07,-2.38924e-08,0.59479,0.0008461,-7.8707e-07,5.26143e-10,0.595636,0.000844527,-7.85491e-07,2.17879e-08,0.596479,0.000843021,-7.20127e-07,-2.80733e-08,0.597322,0.000841497,-8.04347e-07,3.09005e-08,0.598162,0.000839981,-7.11646e-07,-3.5924e-08,0.599002,0.00083845,-8.19418e-07,5.3191e-08,0.599839,0.000836971,-6.59845e-07,-5.76307e-08,0.600676,0.000835478,-8.32737e-07,5.81227e-08,0.60151,0.000833987,-6.58369e-07,-5.56507e-08,0.602344,0.000832503,-8.25321e-07,4.52706e-08,0.603175,0.000830988,-6.89509e-07,-6.22236e-09,0.604006,0.000829591,-7.08176e-07,-2.03811e-08,0.604834,0.000828113,-7.6932e-07,2.8142e-08,0.605662,0.000826659,-6.84894e-07,-3.25822e-08,0.606488,0.000825191,-7.8264e-07,4.25823e-08,0.607312,0.000823754,-6.54893e-07,-1.85376e-08,0.608135,0.000822389,-7.10506e-07,-2.80365e-08,0.608957,0.000820883,-7.94616e-07,7.1079e-08,0.609777,0.000819507,-5.81379e-07,-7.74655e-08,0.610596,0.000818112,-8.13775e-07,5.9969e-08,0.611413,0.000816665,-6.33868e-07,-4.32013e-08,0.612229,0.000815267,-7.63472e-07,5.32313e-08,0.613044,0.0008139,-6.03778e-07,-5.05148e-08,0.613857,0.000812541,-7.55323e-07,2.96187e-08,0.614669,0.000811119,-6.66466e-07,-8.35545e-09,0.615479,0.000809761,-6.91533e-07,3.80301e-09,0.616288,0.00080839,-6.80124e-07,-6.85666e-09,0.617096,0.000807009,-7.00694e-07,2.36237e-08,0.617903,0.000805678,-6.29822e-07,-2.80336e-08,0.618708,0.000804334,-7.13923e-07,2.8906e-08,0.619511,0.000802993,-6.27205e-07,-2.79859e-08,0.620314,0.000801655,-7.11163e-07,2.34329e-08,0.621114,0.000800303,-6.40864e-07,-6.14108e-09,0.621914,0.000799003,-6.59287e-07,1.13151e-09,0.622712,0.000797688,-6.55893e-07,1.61507e-09,0.62351,0.000796381,-6.51048e-07,-7.59186e-09,0.624305,0.000795056,-6.73823e-07,2.87524e-08,0.6251,0.000793794,-5.87566e-07,-4.7813e-08,0.625893,0.000792476,-7.31005e-07,4.32901e-08,0.626685,0.000791144,-6.01135e-07,-6.13814e-09,0.627475,0.000789923,-6.19549e-07,-1.87376e-08,0.628264,0.000788628,-6.75762e-07,2.14837e-08,0.629052,0.000787341,-6.11311e-07,-7.59265e-09,0.629839,0.000786095,-6.34089e-07,8.88692e-09,0.630625,0.000784854,-6.07428e-07,-2.7955e-08,0.631409,0.000783555,-6.91293e-07,4.33285e-08,0.632192,0.000782302,-5.61307e-07,-2.61497e-08,0.632973,0.000781101,-6.39757e-07,1.6658e-09,0.633754,0.000779827,-6.34759e-07,1.94866e-08,0.634533,0.000778616,-5.76299e-07,-2.00076e-08,0.635311,0.000777403,-6.36322e-07,9.39091e-10,0.636088,0.000776133,-6.33505e-07,1.62512e-08,0.636863,0.000774915,-5.84751e-07,-6.33937e-09,0.637638,0.000773726,-6.03769e-07,9.10609e-09,0.638411,0.000772546,-5.76451e-07,-3.00849e-08,0.639183,0.000771303,-6.66706e-07,5.1629e-08,0.639953,0.000770125,-5.11819e-07,-5.7222e-08,0.640723,0.000768929,-6.83485e-07,5.80497e-08,0.641491,0.000767736,-5.09336e-07,-5.57674e-08,0.642259,0.000766551,-6.76638e-07,4.58105e-08,0.643024,0.000765335,-5.39206e-07,-8.26541e-09,0.643789,0.000764231,-5.64002e-07,-1.27488e-08,0.644553,0.000763065,-6.02249e-07,-3.44168e-10,0.645315,0.00076186,-6.03281e-07,1.41254e-08,0.646077,0.000760695,-5.60905e-07,3.44727e-09,0.646837,0.000759584,-5.50563e-07,-2.79144e-08,0.647596,0.000758399,-6.34307e-07,4.86057e-08,0.648354,0.000757276,-4.88489e-07,-4.72989e-08,0.64911,0.000756158,-6.30386e-07,2.13807e-08,0.649866,0.000754961,-5.66244e-07,2.13808e-08,0.65062,0.000753893,-5.02102e-07,-4.7299e-08,0.651374,0.000752746,-6.43999e-07,4.86059e-08,0.652126,0.000751604,-4.98181e-07,-2.79154e-08,0.652877,0.000750524,-5.81927e-07,3.45089e-09,0.653627,0.000749371,-5.71575e-07,1.41119e-08,0.654376,0.00074827,-5.29239e-07,-2.93748e-10,0.655123,0.00074721,-5.3012e-07,-1.29368e-08,0.65587,0.000746111,-5.68931e-07,-7.56355e-09,0.656616,0.000744951,-5.91621e-07,4.3191e-08,0.65736,0.000743897,-4.62048e-07,-4.59911e-08,0.658103,0.000742835,-6.00022e-07,2.15642e-08,0.658846,0.0007417,-5.35329e-07,1.93389e-08,0.659587,0.000740687,-4.77312e-07,-3.93152e-08,0.660327,0.000739615,-5.95258e-07,1.87126e-08,0.661066,0.00073848,-5.3912e-07,2.40695e-08,0.661804,0.000737474,-4.66912e-07,-5.53859e-08,0.662541,0.000736374,-6.33069e-07,7.82648e-08,0.663277,0.000735343,-3.98275e-07,-7.88593e-08,0.664012,0.00073431,-6.34853e-07,5.83585e-08,0.664745,0.000733215,-4.59777e-07,-3.53656e-08,0.665478,0.000732189,-5.65874e-07,2.34994e-08,0.66621,0.000731128,-4.95376e-07,9.72743e-10,0.66694,0.00073014,-4.92458e-07,-2.73903e-08,0.66767,0.000729073,-5.74629e-07,4.89839e-08,0.668398,0.000728071,-4.27677e-07,-4.93359e-08,0.669126,0.000727068,-5.75685e-07,2.91504e-08,0.669853,0.000726004,-4.88234e-07,-7.66109e-09,0.670578,0.000725004,-5.11217e-07,1.49392e-09,0.671303,0.000723986,-5.06735e-07,1.68533e-09,0.672026,0.000722978,-5.01679e-07,-8.23525e-09,0.672749,0.00072195,-5.26385e-07,3.12556e-08,0.67347,0.000720991,-4.32618e-07,-5.71825e-08,0.674191,0.000719954,-6.04166e-07,7.8265e-08,0.67491,0.00071898,-3.69371e-07,-7.70634e-08,0.675628,0.00071801,-6.00561e-07,5.11747e-08,0.676346,0.000716963,-4.47037e-07,-8.42615e-09,0.677062,0.000716044,-4.72315e-07,-1.747e-08,0.677778,0.000715046,-5.24725e-07,1.87015e-08,0.678493,0.000714053,-4.68621e-07,2.26856e-09,0.679206,0.000713123,-4.61815e-07,-2.77758e-08,0.679919,0.000712116,-5.45142e-07,4.92298e-08,0.68063,0.000711173,-3.97453e-07,-4.99339e-08,0.681341,0.000710228,-5.47255e-07,3.12967e-08,0.682051,0.000709228,-4.53365e-07,-1.56481e-08,0.68276,0.000708274,-5.00309e-07,3.12958e-08,0.683467,0.000707367,-4.06422e-07,-4.99303e-08,0.684174,0.000706405,-5.56213e-07,4.9216e-08,0.68488,0.00070544,-4.08565e-07,-2.77245e-08,0.685585,0.00070454,-4.91738e-07,2.07748e-09,0.686289,0.000703562,-4.85506e-07,1.94146e-08,0.686992,0.00070265,-4.27262e-07,-2.01314e-08,0.687695,0.000701735,-4.87656e-07,1.50616e-09,0.688396,0.000700764,-4.83137e-07,1.41067e-08,0.689096,0.00069984,-4.40817e-07,1.67168e-09,0.689795,0.000698963,-4.35802e-07,-2.07934e-08,0.690494,0.000698029,-4.98182e-07,2.18972e-08,0.691192,0.000697099,-4.32491e-07,-7.19092e-09,0.691888,0.000696212,-4.54064e-07,6.86642e-09,0.692584,0.000695325,-4.33464e-07,-2.02747e-08,0.693279,0.000694397,-4.94288e-07,1.46279e-08,0.693973,0.000693452,-4.50405e-07,2.13678e-08,0.694666,0.000692616,-3.86301e-07,-4.04945e-08,0.695358,0.000691721,-5.07785e-07,2.14009e-08,0.696049,0.00069077,-4.43582e-07,1.44955e-08,0.69674,0.000689926,-4.00096e-07,-1.97783e-08,0.697429,0.000689067,-4.5943e-07,5.01296e-09,0.698118,0.000688163,-4.44392e-07,-2.73521e-10,0.698805,0.000687273,-4.45212e-07,-3.91893e-09,0.699492,0.000686371,-4.56969e-07,1.59493e-08,0.700178,0.000685505,-4.09121e-07,-2.73351e-10,0.700863,0.000684686,-4.09941e-07,-1.4856e-08,0.701548,0.000683822,-4.54509e-07,9.25979e-11,0.702231,0.000682913,-4.54231e-07,1.44855e-08,0.702913,0.000682048,-4.10775e-07,1.56992e-09,0.703595,0.000681231,-4.06065e-07,-2.07652e-08,0.704276,0.000680357,-4.68361e-07,2.18864e-08,0.704956,0.000679486,-4.02701e-07,-7.17595e-09,0.705635,0.000678659,-4.24229e-07,6.81748e-09,0.706313,0.000677831,-4.03777e-07,-2.0094e-08,0.70699,0.000676963,-4.64059e-07,1.39538e-08,0.707667,0.000676077,-4.22197e-07,2.38835e-08,0.708343,0.000675304,-3.50547e-07,-4.98831e-08,0.709018,0.000674453,-5.00196e-07,5.64395e-08,0.709692,0.000673622,-3.30878e-07,-5.66657e-08,0.710365,0.00067279,-5.00875e-07,5.1014e-08,0.711037,0.000671942,-3.47833e-07,-2.81809e-08,0.711709,0.000671161,-4.32376e-07,2.10513e-09,0.712379,0.000670303,-4.2606e-07,1.97604e-08,0.713049,0.00066951,-3.66779e-07,-2.15422e-08,0.713718,0.000668712,-4.31406e-07,6.8038e-09,0.714387,0.000667869,-4.10994e-07,-5.67295e-09,0.715054,0.00066703,-4.28013e-07,1.5888e-08,0.715721,0.000666222,-3.80349e-07,1.72576e-09,0.716387,0.000665467,-3.75172e-07,-2.27911e-08,0.717052,0.000664648,-4.43545e-07,2.9834e-08,0.717716,0.00066385,-3.54043e-07,-3.69401e-08,0.718379,0.000663031,-4.64864e-07,5.83219e-08,0.719042,0.000662277,-2.89898e-07,-7.71382e-08,0.719704,0.000661465,-5.21313e-07,7.14171e-08,0.720365,0.000660637,-3.07061e-07,-2.97161e-08,0.721025,0.000659934,-3.96209e-07,-1.21575e-08,0.721685,0.000659105,-4.32682e-07,1.87412e-08,0.722343,0.000658296,-3.76458e-07,-3.2029e-09,0.723001,0.000657533,-3.86067e-07,-5.9296e-09,0.723659,0.000656743,-4.03856e-07,2.69213e-08,0.724315,0.000656016,-3.23092e-07,-4.21511e-08,0.724971,0.000655244,-4.49545e-07,2.24737e-08,0.725625,0.000654412,-3.82124e-07,1.18611e-08,0.726279,0.000653683,-3.46541e-07,-1.03132e-08,0.726933,0.000652959,-3.7748e-07,-3.02128e-08,0.727585,0.000652114,-4.68119e-07,7.15597e-08,0.728237,0.000651392,-2.5344e-07,-7.72119e-08,0.728888,0.000650654,-4.85075e-07,5.8474e-08,0.729538,0.000649859,-3.09654e-07,-3.74746e-08,0.730188,0.000649127,-4.22077e-07,3.18197e-08,0.730837,0.000648379,-3.26618e-07,-3.01997e-08,0.731485,0.000647635,-4.17217e-07,2.93747e-08,0.732132,0.000646888,-3.29093e-07,-2.76943e-08,0.732778,0.000646147,-4.12176e-07,2.17979e-08,0.733424,0.000645388,-3.46783e-07,1.07292e-10,0.734069,0.000644695,-3.46461e-07,-2.22271e-08,0.734713,0.000643935,-4.13142e-07,2.91963e-08,0.735357,0.000643197,-3.25553e-07,-3.49536e-08,0.736,0.000642441,-4.30414e-07,5.10133e-08,0.736642,0.000641733,-2.77374e-07,-4.98904e-08,0.737283,0.000641028,-4.27045e-07,2.93392e-08,0.737924,0.000640262,-3.39028e-07,-7.86156e-09,0.738564,0.000639561,-3.62612e-07,2.10703e-09,0.739203,0.000638842,-3.56291e-07,-5.6653e-10,0.739842,0.000638128,-3.57991e-07,1.59086e-10,0.740479,0.000637412,-3.57513e-07,-6.98321e-11,0.741116,0.000636697,-3.57723e-07,1.20214e-10,0.741753,0.000635982,-3.57362e-07,-4.10987e-10,0.742388,0.000635266,-3.58595e-07,1.5237e-09,0.743023,0.000634553,-3.54024e-07,-5.68376e-09,0.743657,0.000633828,-3.71075e-07,2.12113e-08,0.744291,0.00063315,-3.07441e-07,-1.95569e-08,0.744924,0.000632476,-3.66112e-07,-2.58816e-09,0.745556,0.000631736,-3.73877e-07,2.99096e-08,0.746187,0.000631078,-2.84148e-07,-5.74454e-08,0.746818,0.000630337,-4.56484e-07,8.06629e-08,0.747448,0.000629666,-2.14496e-07,-8.63922e-08,0.748077,0.000628978,-4.73672e-07,8.60918e-08,0.748706,0.000628289,-2.15397e-07,-7.91613e-08,0.749334,0.000627621,-4.5288e-07,5.17393e-08,0.749961,0.00062687,-2.97663e-07,-8.58662e-09,0.750588,0.000626249,-3.23422e-07,-1.73928e-08,0.751214,0.00062555,-3.75601e-07,1.85532e-08,0.751839,0.000624855,-3.19941e-07,2.78479e-09,0.752463,0.000624223,-3.11587e-07,-2.96923e-08,0.753087,0.000623511,-4.00664e-07,5.63799e-08,0.75371,0.000622879,-2.31524e-07,-7.66179e-08,0.754333,0.000622186,-4.61378e-07,7.12778e-08,0.754955,0.000621477,-2.47545e-07,-2.96794e-08,0.755576,0.000620893,-3.36583e-07,-1.21648e-08,0.756196,0.000620183,-3.73077e-07,1.87339e-08,0.756816,0.000619493,-3.16875e-07,-3.16622e-09,0.757435,0.00061885,-3.26374e-07,-6.0691e-09,0.758054,0.000618179,-3.44581e-07,2.74426e-08,0.758672,0.000617572,-2.62254e-07,-4.40968e-08,0.759289,0.000616915,-3.94544e-07,2.97352e-08,0.759906,0.000616215,-3.05338e-07,-1.52393e-08,0.760522,0.000615559,-3.51056e-07,3.12221e-08,0.761137,0.000614951,-2.5739e-07,-5.00443e-08,0.761751,0.000614286,-4.07523e-07,4.9746e-08,0.762365,0.00061362,-2.58285e-07,-2.97303e-08,0.762979,0.000613014,-3.47476e-07,9.57079e-09,0.763591,0.000612348,-3.18764e-07,-8.55287e-09,0.764203,0.000611685,-3.44422e-07,2.46407e-08,0.764815,0.00061107,-2.705e-07,-3.04053e-08,0.765426,0.000610437,-3.61716e-07,3.73759e-08,0.766036,0.000609826,-2.49589e-07,-5.94935e-08,0.766645,0.000609149,-4.28069e-07,8.13889e-08,0.767254,0.000608537,-1.83902e-07,-8.72483e-08,0.767862,0.000607907,-4.45647e-07,8.87901e-08,0.76847,0.000607282,-1.79277e-07,-8.90983e-08,0.769077,0.000606656,-4.46572e-07,8.87892e-08,0.769683,0.000606029,-1.80204e-07,-8.72446e-08,0.770289,0.000605407,-4.41938e-07,8.13752e-08,0.770894,0.000604768,-1.97812e-07,-5.94423e-08,0.771498,0.000604194,-3.76139e-07,3.71848e-08,0.772102,0.000603553,-2.64585e-07,-2.96922e-08,0.772705,0.000602935,-3.53661e-07,2.19793e-08,0.773308,0.000602293,-2.87723e-07,1.37955e-09,0.77391,0.000601722,-2.83585e-07,-2.74976e-08,0.774512,0.000601072,-3.66077e-07,4.9006e-08,0.775112,0.000600487,-2.19059e-07,-4.93171e-08,0.775712,0.000599901,-3.67011e-07,2.90531e-08,0.776312,0.000599254,-2.79851e-07,-7.29081e-09,0.776911,0.000598673,-3.01724e-07,1.10077e-10,0.777509,0.00059807,-3.01393e-07,6.85053e-09,0.778107,0.000597487,-2.80842e-07,-2.75123e-08,0.778704,0.000596843,-3.63379e-07,4.35939e-08,0.779301,0.000596247,-2.32597e-07,-2.7654e-08,0.779897,0.000595699,-3.15559e-07,7.41741e-09,0.780492,0.00059509,-2.93307e-07,-2.01562e-09,0.781087,0.000594497,-2.99354e-07,6.45059e-10,0.781681,0.000593901,-2.97418e-07,-5.64635e-10,0.782275,0.000593304,-2.99112e-07,1.61347e-09,0.782868,0.000592711,-2.94272e-07,-5.88926e-09,0.78346,0.000592105,-3.1194e-07,2.19436e-08,0.784052,0.000591546,-2.46109e-07,-2.22805e-08,0.784643,0.000590987,-3.1295e-07,7.57368e-09,0.785234,0.000590384,-2.90229e-07,-8.01428e-09,0.785824,0.00058978,-3.14272e-07,2.44834e-08,0.786414,0.000589225,-2.40822e-07,-3.03148e-08,0.787003,0.000588652,-3.31766e-07,3.7171e-08,0.787591,0.0005881,-2.20253e-07,-5.87646e-08,0.788179,0.000587483,-3.96547e-07,7.86782e-08,0.788766,0.000586926,-1.60512e-07,-7.71342e-08,0.789353,0.000586374,-3.91915e-07,5.10444e-08,0.789939,0.000585743,-2.38782e-07,-7.83422e-09,0.790524,0.000585242,-2.62284e-07,-1.97076e-08,0.791109,0.000584658,-3.21407e-07,2.70598e-08,0.791693,0.000584097,-2.40228e-07,-2.89269e-08,0.792277,0.000583529,-3.27008e-07,2.90431e-08,0.792861,0.000582963,-2.39879e-07,-2.76409e-08,0.793443,0.0005824,-3.22802e-07,2.1916e-08,0.794025,0.00058182,-2.57054e-07,-4.18368e-10,0.794607,0.000581305,-2.58309e-07,-2.02425e-08,0.795188,0.000580727,-3.19036e-07,2.17838e-08,0.795768,0.000580155,-2.53685e-07,-7.28814e-09,0.796348,0.000579625,-2.75549e-07,7.36871e-09,0.796928,0.000579096,-2.53443e-07,-2.21867e-08,0.797506,0.000578523,-3.20003e-07,2.17736e-08,0.798085,0.000577948,-2.54683e-07,-5.30296e-09,0.798662,0.000577423,-2.70592e-07,-5.61698e-10,0.799239,0.00057688,-2.72277e-07,7.54977e-09,0.799816,0.000576358,-2.49627e-07,-2.96374e-08,0.800392,0.00057577,-3.38539e-07,5.1395e-08,0.800968,0.000575247,-1.84354e-07,-5.67335e-08,0.801543,0.000574708,-3.54555e-07,5.63297e-08,0.802117,0.000574168,-1.85566e-07,-4.93759e-08,0.802691,0.000573649,-3.33693e-07,2.19646e-08,0.803264,0.000573047,-2.678e-07,2.1122e-08,0.803837,0.000572575,-2.04433e-07,-4.68482e-08,0.804409,0.000572026,-3.44978e-07,4.70613e-08,0.804981,0.000571477,-2.03794e-07,-2.21877e-08,0.805552,0.000571003,-2.70357e-07,-1.79153e-08,0.806123,0.000570408,-3.24103e-07,3.42443e-08,0.806693,0.000569863,-2.2137e-07,1.47556e-10,0.807263,0.000569421,-2.20928e-07,-3.48345e-08,0.807832,0.000568874,-3.25431e-07,1.99812e-08,0.808401,0.000568283,-2.65487e-07,1.45143e-08,0.808969,0.000567796,-2.21945e-07,-1.84338e-08,0.809536,0.000567297,-2.77246e-07,-3.83608e-10,0.810103,0.000566741,-2.78397e-07,1.99683e-08,0.81067,0.000566244,-2.18492e-07,-1.98848e-08,0.811236,0.000565747,-2.78146e-07,-3.38976e-11,0.811801,0.000565191,-2.78248e-07,2.00204e-08,0.812366,0.000564695,-2.18187e-07,-2.04429e-08,0.812931,0.000564197,-2.79516e-07,2.1467e-09,0.813495,0.000563644,-2.73076e-07,1.18561e-08,0.814058,0.000563134,-2.37507e-07,1.00334e-08,0.814621,0.000562689,-2.07407e-07,-5.19898e-08,0.815183,0.000562118,-3.63376e-07,7.87163e-08,0.815745,0.000561627,-1.27227e-07,-8.40616e-08,0.816306,0.000561121,-3.79412e-07,7.87163e-08,0.816867,0.000560598,-1.43263e-07,-5.19898e-08,0.817428,0.000560156,-2.99233e-07,1.00335e-08,0.817988,0.000559587,-2.69132e-07,1.18559e-08,0.818547,0.000559085,-2.33564e-07,2.14764e-09,0.819106,0.000558624,-2.27122e-07,-2.04464e-08,0.819664,0.000558108,-2.88461e-07,2.00334e-08,0.820222,0.000557591,-2.28361e-07,-8.24277e-11,0.820779,0.000557135,-2.28608e-07,-1.97037e-08,0.821336,0.000556618,-2.87719e-07,1.92925e-08,0.821893,0.000556101,-2.29841e-07,2.13831e-09,0.822448,0.000555647,-2.23427e-07,-2.78458e-08,0.823004,0.000555117,-3.06964e-07,4.96402e-08,0.823559,0.000554652,-1.58043e-07,-5.15058e-08,0.824113,0.000554181,-3.12561e-07,3.71737e-08,0.824667,0.000553668,-2.0104e-07,-3.75844e-08,0.82522,0.000553153,-3.13793e-07,5.35592e-08,0.825773,0.000552686,-1.53115e-07,-5.74431e-08,0.826326,0.000552207,-3.25444e-07,5.7004e-08,0.826878,0.000551728,-1.54433e-07,-5.13635e-08,0.827429,0.000551265,-3.08523e-07,2.92406e-08,0.82798,0.000550735,-2.20801e-07,-5.99424e-09,0.828531,0.000550276,-2.38784e-07,-5.26363e-09,0.829081,0.000549782,-2.54575e-07,2.70488e-08,0.82963,0.000549354,-1.73429e-07,-4.33268e-08,0.83018,0.000548878,-3.03409e-07,2.7049e-08,0.830728,0.000548352,-2.22262e-07,-5.26461e-09,0.831276,0.000547892,-2.38056e-07,-5.99057e-09,0.831824,0.000547397,-2.56027e-07,2.92269e-08,0.832371,0.000546973,-1.68347e-07,-5.13125e-08,0.832918,0.000546482,-3.22284e-07,5.68139e-08,0.833464,0.000546008,-1.51843e-07,-5.67336e-08,0.83401,0.000545534,-3.22043e-07,5.09113e-08,0.834555,0.000545043,-1.6931e-07,-2.77022e-08,0.8351,0.000544621,-2.52416e-07,2.92924e-10,0.835644,0.000544117,-2.51537e-07,2.65305e-08,0.836188,0.000543694,-1.71946e-07,-4.68105e-08,0.836732,0.00054321,-3.12377e-07,4.15021e-08,0.837275,0.000542709,-1.87871e-07,1.13355e-11,0.837817,0.000542334,-1.87837e-07,-4.15474e-08,0.838359,0.000541833,-3.12479e-07,4.69691e-08,0.838901,0.000541349,-1.71572e-07,-2.71196e-08,0.839442,0.000540925,-2.52931e-07,1.90462e-09,0.839983,0.000540425,-2.47217e-07,1.95011e-08,0.840523,0.000539989,-1.88713e-07,-2.03045e-08,0.841063,0.00053955,-2.49627e-07,2.11216e-09,0.841602,0.000539057,-2.4329e-07,1.18558e-08,0.842141,0.000538606,-2.07723e-07,1.00691e-08,0.842679,0.000538221,-1.77516e-07,-5.21324e-08,0.843217,0.00053771,-3.33913e-07,7.92513e-08,0.843755,0.00053728,-9.6159e-08,-8.60587e-08,0.844292,0.000536829,-3.54335e-07,8.61696e-08,0.844828,0.000536379,-9.58263e-08,-7.98057e-08,0.845364,0.000535948,-3.35243e-07,5.42394e-08,0.8459,0.00053544,-1.72525e-07,-1.79426e-08,0.846435,0.000535041,-2.26353e-07,1.75308e-08,0.84697,0.000534641,-1.73761e-07,-5.21806e-08,0.847505,0.000534137,-3.30302e-07,7.19824e-08,0.848038,0.000533692,-1.14355e-07,-5.69349e-08,0.848572,0.000533293,-2.8516e-07,3.65479e-08,0.849105,0.000532832,-1.75516e-07,-2.96519e-08,0.849638,0.000532392,-2.64472e-07,2.2455e-08,0.85017,0.000531931,-1.97107e-07,-5.63451e-10,0.850702,0.000531535,-1.98797e-07,-2.02011e-08,0.851233,0.000531077,-2.59401e-07,2.17634e-08,0.851764,0.000530623,-1.94111e-07,-7.24794e-09,0.852294,0.000530213,-2.15854e-07,7.22832e-09,0.852824,0.000529803,-1.94169e-07,-2.16653e-08,0.853354,0.00052935,-2.59165e-07,1.98283e-08,0.853883,0.000528891,-1.9968e-07,1.95678e-09,0.854412,0.000528497,-1.9381e-07,-2.76554e-08,0.85494,0.000528027,-2.76776e-07,4.90603e-08,0.855468,0.00052762,-1.29596e-07,-4.93764e-08,0.855995,0.000527213,-2.77725e-07,2.92361e-08,0.856522,0.000526745,-1.90016e-07,-7.96341e-09,0.857049,0.000526341,-2.13907e-07,2.61752e-09,0.857575,0.000525922,-2.06054e-07,-2.50665e-09,0.8581,0.000525502,-2.13574e-07,7.40906e-09,0.858626,0.000525097,-1.91347e-07,-2.71296e-08,0.859151,0.000524633,-2.72736e-07,4.15048e-08,0.859675,0.000524212,-1.48221e-07,-1.96802e-08,0.860199,0.000523856,-2.07262e-07,-2.23886e-08,0.860723,0.000523375,-2.74428e-07,4.96299e-08,0.861246,0.000522975,-1.25538e-07,-5.69216e-08,0.861769,0.000522553,-2.96303e-07,5.88473e-08,0.862291,0.000522137,-1.19761e-07,-5.92584e-08,0.862813,0.00052172,-2.97536e-07,5.8977e-08,0.863334,0.000521301,-1.20605e-07,-5.74403e-08,0.863855,0.000520888,-2.92926e-07,5.15751e-08,0.864376,0.000520457,-1.38201e-07,-2.96506e-08,0.864896,0.000520091,-2.27153e-07,7.42277e-09,0.865416,0.000519659,-2.04885e-07,-4.05057e-11,0.865936,0.00051925,-2.05006e-07,-7.26074e-09,0.866455,0.000518818,-2.26788e-07,2.90835e-08,0.866973,0.000518451,-1.39538e-07,-4.94686e-08,0.867492,0.000518024,-2.87944e-07,4.95814e-08,0.868009,0.000517597,-1.39199e-07,-2.96479e-08,0.868527,0.000517229,-2.28143e-07,9.40539e-09,0.869044,0.000516801,-1.99927e-07,-7.9737e-09,0.86956,0.000516378,-2.23848e-07,2.24894e-08,0.870077,0.000515997,-1.5638e-07,-2.23793e-08,0.870592,0.000515617,-2.23517e-07,7.42302e-09,0.871108,0.000515193,-2.01248e-07,-7.31283e-09,0.871623,0.000514768,-2.23187e-07,2.18283e-08,0.872137,0.000514387,-1.57702e-07,-2.03959e-08,0.872652,0.000514011,-2.1889e-07,1.50711e-10,0.873165,0.000513573,-2.18437e-07,1.97931e-08,0.873679,0.000513196,-1.59058e-07,-1.97183e-08,0.874192,0.000512819,-2.18213e-07,-5.24324e-10,0.874704,0.000512381,-2.19786e-07,2.18156e-08,0.875217,0.000512007,-1.54339e-07,-2.71336e-08,0.875728,0.000511616,-2.3574e-07,2.71141e-08,0.87624,0.000511226,-1.54398e-07,-2.17182e-08,0.876751,0.000510852,-2.19552e-07,1.54131e-10,0.877262,0.000510414,-2.1909e-07,2.11017e-08,0.877772,0.000510039,-1.55785e-07,-2.49562e-08,0.878282,0.000509652,-2.30654e-07,1.91183e-08,0.878791,0.000509248,-1.73299e-07,8.08751e-09,0.8793,0.000508926,-1.49036e-07,-5.14684e-08,0.879809,0.000508474,-3.03441e-07,7.85766e-08,0.880317,0.000508103,-6.77112e-08,-8.40242e-08,0.880825,0.000507715,-3.19784e-07,7.87063e-08,0.881333,0.000507312,-8.36649e-08,-5.19871e-08,0.88184,0.000506988,-2.39626e-07,1.00327e-08,0.882346,0.000506539,-2.09528e-07,1.18562e-08,0.882853,0.000506156,-1.73959e-07,2.14703e-09,0.883359,0.000505814,-1.67518e-07,-2.04444e-08,0.883864,0.000505418,-2.28851e-07,2.00258e-08,0.88437,0.00050502,-1.68774e-07,-5.42855e-11,0.884874,0.000504682,-1.68937e-07,-1.98087e-08,0.885379,0.000504285,-2.28363e-07,1.96842e-08,0.885883,0.000503887,-1.6931e-07,6.76342e-10,0.886387,0.000503551,-1.67281e-07,-2.23896e-08,0.88689,0.000503149,-2.3445e-07,2.92774e-08,0.887393,0.000502768,-1.46618e-07,-3.51152e-08,0.887896,0.00050237,-2.51963e-07,5.15787e-08,0.888398,0.00050202,-9.72271e-08,-5.19903e-08,0.8889,0.00050167,-2.53198e-07,3.71732e-08,0.889401,0.000501275,-1.41678e-07,-3.70978e-08,0.889902,0.00050088,-2.52972e-07,5.16132e-08,0.890403,0.000500529,-9.81321e-08,-5.01459e-08,0.890903,0.000500183,-2.4857e-07,2.9761e-08,0.891403,0.000499775,-1.59287e-07,-9.29351e-09,0.891903,0.000499428,-1.87167e-07,7.41301e-09,0.892402,0.000499076,-1.64928e-07,-2.03585e-08,0.892901,0.000498685,-2.26004e-07,1.44165e-08,0.893399,0.000498276,-1.82754e-07,2.22974e-08,0.893898,0.000497978,-1.15862e-07,-4.40013e-08,0.894395,0.000497614,-2.47866e-07,3.44985e-08,0.894893,0.000497222,-1.44371e-07,-3.43882e-08,0.89539,0.00049683,-2.47535e-07,4.34497e-08,0.895886,0.000496465,-1.17186e-07,-2.02012e-08,0.896383,0.00049617,-1.7779e-07,-2.22497e-08,0.896879,0.000495748,-2.44539e-07,4.95952e-08,0.897374,0.000495408,-9.57532e-08,-5.69217e-08,0.89787,0.000495045,-2.66518e-07,5.88823e-08,0.898364,0.000494689,-8.98713e-08,-5.93983e-08,0.898859,0.000494331,-2.68066e-07,5.95017e-08,0.899353,0.000493973,-8.95613e-08,-5.9399e-08,0.899847,0.000493616,-2.67758e-07,5.8885e-08,0.90034,0.000493257,-9.11033e-08,-5.69317e-08,0.900833,0.000492904,-2.61898e-07,4.96326e-08,0.901326,0.000492529,-1.13001e-07,-2.23893e-08,0.901819,0.000492236,-1.80169e-07,-1.968e-08,0.902311,0.000491817,-2.39209e-07,4.15047e-08,0.902802,0.000491463,-1.14694e-07,-2.71296e-08,0.903293,0.000491152,-1.96083e-07,7.409e-09,0.903784,0.000490782,-1.73856e-07,-2.50645e-09,0.904275,0.000490427,-1.81376e-07,2.61679e-09,0.904765,0.000490072,-1.73525e-07,-7.96072e-09,0.905255,0.000489701,-1.97407e-07,2.92261e-08,0.905745,0.000489394,-1.09729e-07,-4.93389e-08,0.906234,0.000489027,-2.57746e-07,4.89204e-08,0.906723,0.000488658,-1.10985e-07,-2.71333e-08,0.907211,0.000488354,-1.92385e-07,8.30861e-12,0.907699,0.00048797,-1.9236e-07,2.71001e-08,0.908187,0.000487666,-1.1106e-07,-4.88041e-08,0.908675,0.000487298,-2.57472e-07,4.89069e-08,0.909162,0.000486929,-1.10751e-07,-2.76143e-08,0.909649,0.000486625,-1.93594e-07,1.9457e-09,0.910135,0.000486244,-1.87757e-07,1.98315e-08,0.910621,0.000485928,-1.28262e-07,-2.16671e-08,0.911107,0.000485606,-1.93264e-07,7.23216e-09,0.911592,0.000485241,-1.71567e-07,-7.26152e-09,0.912077,0.000484877,-1.93352e-07,2.18139e-08,0.912562,0.000484555,-1.2791e-07,-2.03895e-08,0.913047,0.000484238,-1.89078e-07,1.39494e-10,0.913531,0.000483861,-1.8866e-07,1.98315e-08,0.914014,0.000483543,-1.29165e-07,-1.98609e-08,0.914498,0.000483225,-1.88748e-07,7.39912e-12,0.914981,0.000482847,-1.88726e-07,1.98313e-08,0.915463,0.000482529,-1.29232e-07,-1.9728e-08,0.915946,0.000482212,-1.88416e-07,-5.24035e-10,0.916428,0.000481833,-1.89988e-07,2.18241e-08,0.916909,0.000481519,-1.24516e-07,-2.71679e-08,0.917391,0.000481188,-2.06019e-07,2.72427e-08,0.917872,0.000480858,-1.24291e-07,-2.21985e-08,0.918353,0.000480543,-1.90886e-07,1.94644e-09,0.918833,0.000480167,-1.85047e-07,1.44127e-08,0.919313,0.00047984,-1.41809e-07,7.39438e-12,0.919793,0.000479556,-1.41787e-07,-1.44423e-08,0.920272,0.000479229,-1.85114e-07,-1.84291e-09,0.920751,0.000478854,-1.90642e-07,2.18139e-08,0.92123,0.000478538,-1.25201e-07,-2.58081e-08,0.921708,0.00047821,-2.02625e-07,2.18139e-08,0.922186,0.00047787,-1.37183e-07,-1.84291e-09,0.922664,0.00047759,-1.42712e-07,-1.44423e-08,0.923141,0.000477262,-1.86039e-07,7.34701e-12,0.923618,0.00047689,-1.86017e-07,1.44129e-08,0.924095,0.000476561,-1.42778e-07,1.94572e-09,0.924572,0.000476281,-1.36941e-07,-2.21958e-08,0.925048,0.000475941,-2.03528e-07,2.72327e-08,0.925523,0.000475615,-1.2183e-07,-2.71304e-08,0.925999,0.00047529,-2.03221e-07,2.16843e-08,0.926474,0.000474949,-1.38168e-07,-2.16005e-12,0.926949,0.000474672,-1.38175e-07,-2.16756e-08,0.927423,0.000474331,-2.03202e-07,2.71001e-08,0.927897,0.000474006,-1.21902e-07,-2.71201e-08,0.928371,0.000473681,-2.03262e-07,2.17757e-08,0.928845,0.00047334,-1.37935e-07,-3.78028e-10,0.929318,0.000473063,-1.39069e-07,-2.02636e-08,0.929791,0.000472724,-1.9986e-07,2.18276e-08,0.930263,0.000472389,-1.34377e-07,-7.44231e-09,0.930736,0.000472098,-1.56704e-07,7.94165e-09,0.931208,0.000471809,-1.32879e-07,-2.43243e-08,0.931679,0.00047147,-2.05851e-07,2.97508e-08,0.932151,0.000471148,-1.16599e-07,-3.50742e-08,0.932622,0.000470809,-2.21822e-07,5.09414e-08,0.933092,0.000470518,-6.89976e-08,-4.94821e-08,0.933563,0.000470232,-2.17444e-07,2.77775e-08,0.934033,0.00046988,-1.34111e-07,-2.02351e-09,0.934502,0.000469606,-1.40182e-07,-1.96835e-08,0.934972,0.000469267,-1.99232e-07,2.11529e-08,0.935441,0.000468932,-1.35774e-07,-5.32332e-09,0.93591,0.000468644,-1.51743e-07,1.40413e-10,0.936378,0.000468341,-1.51322e-07,4.76166e-09,0.936846,0.000468053,-1.37037e-07,-1.9187e-08,0.937314,0.000467721,-1.94598e-07,1.23819e-08,0.937782,0.000467369,-1.57453e-07,2.92642e-08,0.938249,0.000467142,-6.96601e-08,-6.98342e-08,0.938716,0.000466793,-2.79163e-07,7.12586e-08,0.939183,0.000466449,-6.53869e-08,-3.63863e-08,0.939649,0.000466209,-1.74546e-07,1.46818e-08,0.940115,0.000465904,-1.305e-07,-2.2341e-08,0.940581,0.000465576,-1.97523e-07,1.50774e-08,0.941046,0.000465226,-1.52291e-07,2.16359e-08,0.941511,0.000464986,-8.73832e-08,-4.20162e-08,0.941976,0.000464685,-2.13432e-07,2.72198e-08,0.942441,0.00046434,-1.31773e-07,-7.2581e-09,0.942905,0.000464055,-1.53547e-07,1.81263e-09,0.943369,0.000463753,-1.48109e-07,7.58386e-12,0.943832,0.000463457,-1.48086e-07,-1.84298e-09,0.944296,0.000463155,-1.53615e-07,7.36433e-09,0.944759,0.00046287,-1.31522e-07,-2.76143e-08,0.945221,0.000462524,-2.14365e-07,4.34883e-08,0.945684,0.000462226,-8.39003e-08,-2.71297e-08,0.946146,0.000461977,-1.65289e-07,5.42595e-09,0.946608,0.000461662,-1.49012e-07,5.42593e-09,0.947069,0.000461381,-1.32734e-07,-2.71297e-08,0.94753,0.000461034,-2.14123e-07,4.34881e-08,0.947991,0.000460736,-8.36585e-08,-2.76134e-08,0.948452,0.000460486,-1.66499e-07,7.36083e-09,0.948912,0.000460175,-1.44416e-07,-1.82993e-09,0.949372,0.000459881,-1.49906e-07,-4.11073e-11,0.949832,0.000459581,-1.50029e-07,1.99434e-09,0.950291,0.000459287,-1.44046e-07,-7.93627e-09,0.950751,0.000458975,-1.67855e-07,2.97507e-08,0.951209,0.000458728,-7.86029e-08,-5.1462e-08,0.951668,0.000458417,-2.32989e-07,5.6888e-08,0.952126,0.000458121,-6.2325e-08,-5.68806e-08,0.952584,0.000457826,-2.32967e-07,5.14251e-08,0.953042,0.000457514,-7.86914e-08,-2.96107e-08,0.953499,0.000457268,-1.67523e-07,7.41296e-09,0.953956,0.000456955,-1.45285e-07,-4.11262e-11,0.954413,0.000456665,-1.45408e-07,-7.24847e-09,0.95487,0.000456352,-1.67153e-07,2.9035e-08,0.955326,0.000456105,-8.00484e-08,-4.92869e-08,0.955782,0.000455797,-2.27909e-07,4.89032e-08,0.956238,0.000455488,-8.11994e-08,-2.71166e-08,0.956693,0.000455244,-1.62549e-07,-4.13678e-11,0.957148,0.000454919,-1.62673e-07,2.72821e-08,0.957603,0.000454675,-8.0827e-08,-4.94824e-08,0.958057,0.000454365,-2.29274e-07,5.14382e-08,0.958512,0.000454061,-7.49597e-08,-3.7061e-08,0.958965,0.0004538,-1.86143e-07,3.72013e-08,0.959419,0.000453539,-7.45389e-08,-5.21396e-08,0.959873,0.000453234,-2.30958e-07,5.21476e-08,0.960326,0.000452928,-7.45146e-08,-3.72416e-08,0.960778,0.000452667,-1.8624e-07,3.72143e-08,0.961231,0.000452407,-7.45967e-08,-5.20109e-08,0.961683,0.000452101,-2.30629e-07,5.16199e-08,0.962135,0.000451795,-7.57696e-08,-3.52595e-08,0.962587,0.000451538,-1.81548e-07,2.98133e-08,0.963038,0.000451264,-9.2108e-08,-2.43892e-08,0.963489,0.000451007,-1.65276e-07,8.13892e-09,0.96394,0.000450701,-1.40859e-07,-8.16647e-09,0.964391,0.000450394,-1.65358e-07,2.45269e-08,0.964841,0.000450137,-9.17775e-08,-3.03367e-08,0.965291,0.000449863,-1.82787e-07,3.7215e-08,0.965741,0.000449609,-7.11424e-08,-5.89188e-08,0.96619,0.00044929,-2.47899e-07,7.92509e-08,0.966639,0.000449032,-1.01462e-08,-7.92707e-08,0.967088,0.000448773,-2.47958e-07,5.90181e-08,0.967537,0.000448455,-7.0904e-08,-3.75925e-08,0.967985,0.0004482,-1.83681e-07,3.17471e-08,0.968433,0.000447928,-8.84401e-08,-2.97913e-08,0.968881,0.000447662,-1.77814e-07,2.78133e-08,0.969329,0.000447389,-9.4374e-08,-2.18572e-08,0.969776,0.000447135,-1.59946e-07,1.10134e-11,0.970223,0.000446815,-1.59913e-07,2.18132e-08,0.97067,0.000446561,-9.44732e-08,-2.76591e-08,0.971116,0.000446289,-1.7745e-07,2.92185e-08,0.971562,0.000446022,-8.97948e-08,-2.96104e-08,0.972008,0.000445753,-1.78626e-07,2.96185e-08,0.972454,0.000445485,-8.97706e-08,-2.92588e-08,0.972899,0.000445218,-1.77547e-07,2.78123e-08,0.973344,0.000444946,-9.41103e-08,-2.23856e-08,0.973789,0.000444691,-1.61267e-07,2.12559e-09,0.974233,0.000444374,-1.5489e-07,1.38833e-08,0.974678,0.000444106,-1.13241e-07,1.94591e-09,0.975122,0.000443886,-1.07403e-07,-2.16669e-08,0.975565,0.000443606,-1.72404e-07,2.5117e-08,0.976009,0.000443336,-9.70526e-08,-1.91963e-08,0.976452,0.000443085,-1.54642e-07,-7.93627e-09,0.976895,0.000442752,-1.7845e-07,5.09414e-08,0.977338,0.000442548,-2.56262e-08,-7.66201e-08,0.97778,0.000442266,-2.55486e-07,7.67249e-08,0.978222,0.000441986,-2.53118e-08,-5.14655e-08,0.978664,0.000441781,-1.79708e-07,9.92773e-09,0.979106,0.000441451,-1.49925e-07,1.17546e-08,0.979547,0.000441186,-1.14661e-07,2.65868e-09,0.979988,0.000440965,-1.06685e-07,-2.23893e-08,0.980429,0.000440684,-1.73853e-07,2.72939e-08,0.980869,0.000440419,-9.19716e-08,-2.71816e-08,0.98131,0.000440153,-1.73516e-07,2.18278e-08,0.98175,0.000439872,-1.08033e-07,-5.24833e-10,0.982189,0.000439654,-1.09607e-07,-1.97284e-08,0.982629,0.000439376,-1.68793e-07,1.98339e-08,0.983068,0.000439097,-1.09291e-07,-2.62901e-12,0.983507,0.000438879,-1.09299e-07,-1.98234e-08,0.983946,0.000438601,-1.68769e-07,1.96916e-08,0.984384,0.000438322,-1.09694e-07,6.6157e-10,0.984823,0.000438105,-1.0771e-07,-2.23379e-08,0.985261,0.000437823,-1.74723e-07,2.90855e-08,0.985698,0.00043756,-8.74669e-08,-3.43992e-08,0.986136,0.000437282,-1.90665e-07,4.89068e-08,0.986573,0.000437048,-4.39442e-08,-4.20188e-08,0.98701,0.000436834,-1.7e-07,-4.11073e-11,0.987446,0.000436494,-1.70124e-07,4.21832e-08,0.987883,0.00043628,-4.35742e-08,-4.94824e-08,0.988319,0.000436044,-1.92021e-07,3.6537e-08,0.988755,0.00043577,-8.24102e-08,-3.70611e-08,0.989191,0.000435494,-1.93593e-07,5.21026e-08,0.989626,0.000435263,-3.72855e-08,-5.21402e-08,0.990061,0.000435032,-1.93706e-07,3.7249e-08,0.990496,0.000434756,-8.19592e-08,-3.72512e-08,0.990931,0.000434481,-1.93713e-07,5.21511e-08,0.991365,0.00043425,-3.72595e-08,-5.21439e-08,0.991799,0.000434019,-1.93691e-07,3.72152e-08,0.992233,0.000433743,-8.20456e-08,-3.71123e-08,0.992667,0.000433468,-1.93382e-07,5.16292e-08,0.9931,0.000433236,-3.84947e-08,-5.01953e-08,0.993533,0.000433008,-1.89081e-07,2.99427e-08,0.993966,0.00043272,-9.92525e-08,-9.9708e-09,0.994399,0.000432491,-1.29165e-07,9.94051e-09,0.994831,0.000432263,-9.93434e-08,-2.97912e-08,0.995263,0.000431975,-1.88717e-07,4.96198e-08,0.995695,0.000431746,-3.98578e-08,-4.94785e-08,0.996127,0.000431518,-1.88293e-07,2.9085e-08,0.996558,0.000431229,-1.01038e-07,-7.25675e-09,0.996989,0.000431005,-1.22809e-07,-5.79945e-11,0.99742,0.000430759,-1.22983e-07,7.48873e-09,0.997851,0.000430536,-1.00516e-07,-2.98969e-08,0.998281,0.000430245,-1.90207e-07,5.24942e-08,0.998711,0.000430022,-3.27246e-08,-6.08706e-08,0.999141,0.000429774,-2.15336e-07,7.17788e-08,0.999571,0.000429392,0.,0.}; + + template + __device__ __forceinline__ void Lab2RGBConvert_f(const T& src, D& dst) + { + const float lThresh = 0.008856f * 903.3f; + const float fThresh = 7.787f * 0.008856f + 16.0f / 116.0f; + + float Y, fy; + + if (src.x <= lThresh) + { + Y = src.x / 903.3f; + fy = 7.787f * Y + 16.0f / 116.0f; + } + else + { + fy = (src.x + 16.0f) / 116.0f; + Y = fy * fy * fy; + } + + float X = src.y / 500.0f + fy; + float Z = fy - src.z / 200.0f; + + if (X <= fThresh) + X = (X - 16.0f / 116.0f) / 7.787f; + else + X = X * X * X; + + if (Z <= fThresh) + Z = (Z - 16.0f / 116.0f) / 7.787f; + else + Z = Z * Z * Z; + + float B = 0.052891f * X - 0.204043f * Y + 1.151152f * Z; + float G = -0.921235f * X + 1.875991f * Y + 0.045244f * Z; + float R = 3.079933f * X - 1.537150f * Y - 0.542782f * Z; + + if (srgb) + { + B = splineInterpolate(B * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + G = splineInterpolate(G * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + R = splineInterpolate(R * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + } + + dst.x = blueIdx == 0 ? B : R; + dst.y = G; + dst.z = blueIdx == 0 ? R : B; + setAlpha(dst, ColorChannel::max()); + } + + template + __device__ __forceinline__ void Lab2RGBConvert_b(const T& src, D& dst) + { + float3 srcf, dstf; + + srcf.x = src.x * (100.f / 255.f); + srcf.y = src.y - 128; + srcf.z = src.z - 128; + + Lab2RGBConvert_f(srcf, dstf); + + dst.x = saturate_cast(dstf.x * 255.f); + dst.y = saturate_cast(dstf.y * 255.f); + dst.z = saturate_cast(dstf.z * 255.f); + setAlpha(dst, ColorChannel::max()); + } + + template struct Lab2RGB; + template + struct Lab2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + Lab2RGBConvert_b(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ Lab2RGB() {} + __host__ __device__ __forceinline__ Lab2RGB(const Lab2RGB&) {} + }; + template + struct Lab2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + Lab2RGBConvert_f(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ Lab2RGB() {} + __host__ __device__ __forceinline__ Lab2RGB(const Lab2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_Lab2RGB_TRAITS(name, scn, dcn, srgb, blueIdx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::Lab2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + +///////////////////////////////////// RGB <-> Luv ///////////////////////////////////// + + namespace color_detail + { + __constant__ float c_LabCbrtTab[] = {0.137931,0.0114066,0.,1.18859e-07,0.149338,0.011407,3.56578e-07,-5.79396e-07,0.160745,0.0114059,-1.38161e-06,2.16892e-06,0.172151,0.0114097,5.12516e-06,-8.0814e-06,0.183558,0.0113957,-1.9119e-05,3.01567e-05,0.194965,0.0114479,7.13509e-05,-0.000112545,0.206371,0.011253,-0.000266285,-0.000106493,0.217252,0.0104009,-0.000585765,7.32149e-05,0.22714,0.00944906,-0.00036612,1.21917e-05,0.236235,0.0087534,-0.000329545,2.01753e-05,0.244679,0.00815483,-0.000269019,1.24435e-05,0.252577,0.00765412,-0.000231689,1.05618e-05,0.26001,0.00722243,-0.000200003,8.26662e-06,0.267041,0.00684723,-0.000175203,6.76746e-06,0.27372,0.00651712,-0.000154901,5.61192e-06,0.280088,0.00622416,-0.000138065,4.67009e-06,0.286179,0.00596204,-0.000124055,3.99012e-06,0.292021,0.0057259,-0.000112085,3.36032e-06,0.297638,0.00551181,-0.000102004,2.95338e-06,0.30305,0.00531666,-9.31435e-05,2.52875e-06,0.308277,0.00513796,-8.55572e-05,2.22022e-06,0.313331,0.00497351,-7.88966e-05,1.97163e-06,0.318228,0.00482163,-7.29817e-05,1.7248e-06,0.322978,0.00468084,-6.78073e-05,1.55998e-06,0.327593,0.0045499,-6.31274e-05,1.36343e-06,0.332081,0.00442774,-5.90371e-05,1.27136e-06,0.336451,0.00431348,-5.5223e-05,1.09111e-06,0.34071,0.00420631,-5.19496e-05,1.0399e-06,0.344866,0.00410553,-4.88299e-05,9.18347e-07,0.348923,0.00401062,-4.60749e-05,8.29942e-07,0.352889,0.00392096,-4.35851e-05,7.98478e-07,0.356767,0.00383619,-4.11896e-05,6.84917e-07,0.360562,0.00375586,-3.91349e-05,6.63976e-07,0.36428,0.00367959,-3.7143e-05,5.93086e-07,0.367923,0.00360708,-3.53637e-05,5.6976e-07,0.371495,0.00353806,-3.36544e-05,4.95533e-07,0.375,0.00347224,-3.21678e-05,4.87951e-07,0.378441,0.00340937,-3.0704e-05,4.4349e-07,0.38182,0.00334929,-2.93735e-05,4.20297e-07,0.38514,0.0032918,-2.81126e-05,3.7872e-07,0.388404,0.00323671,-2.69764e-05,3.596e-07,0.391614,0.00318384,-2.58976e-05,3.5845e-07,0.394772,0.00313312,-2.48223e-05,2.92765e-07,0.397881,0.00308435,-2.3944e-05,3.18232e-07,0.400942,0.00303742,-2.29893e-05,2.82046e-07,0.403957,0.00299229,-2.21432e-05,2.52315e-07,0.406927,0.00294876,-2.13862e-05,2.58416e-07,0.409855,0.00290676,-2.0611e-05,2.33939e-07,0.412741,0.00286624,-1.99092e-05,2.36342e-07,0.415587,0.00282713,-1.92001e-05,1.916e-07,0.418396,0.00278931,-1.86253e-05,2.1915e-07,0.421167,0.00275271,-1.79679e-05,1.83498e-07,0.423901,0.00271733,-1.74174e-05,1.79343e-07,0.426602,0.00268303,-1.68794e-05,1.72013e-07,0.429268,0.00264979,-1.63633e-05,1.75686e-07,0.431901,0.00261759,-1.58363e-05,1.3852e-07,0.434503,0.00258633,-1.54207e-05,1.64304e-07,0.437074,0.00255598,-1.49278e-05,1.28136e-07,0.439616,0.00252651,-1.45434e-05,1.57618e-07,0.442128,0.0024979,-1.40705e-05,1.0566e-07,0.444612,0.00247007,-1.37535e-05,1.34998e-07,0.447068,0.00244297,-1.33485e-05,1.29207e-07,0.449498,0.00241666,-1.29609e-05,9.32347e-08,0.451902,0.00239102,-1.26812e-05,1.23703e-07,0.45428,0.00236603,-1.23101e-05,9.74072e-08,0.456634,0.0023417,-1.20179e-05,1.12518e-07,0.458964,0.002318,-1.16803e-05,7.83681e-08,0.46127,0.00229488,-1.14452e-05,1.10452e-07,0.463554,0.00227232,-1.11139e-05,7.58719e-08,0.465815,0.00225032,-1.08863e-05,9.2699e-08,0.468055,0.00222882,-1.06082e-05,8.97738e-08,0.470273,0.00220788,-1.03388e-05,5.4845e-08,0.47247,0.00218736,-1.01743e-05,1.0808e-07,0.474648,0.00216734,-9.85007e-06,4.9277e-08,0.476805,0.00214779,-9.70224e-06,8.22408e-08,0.478943,0.00212863,-9.45551e-06,6.87942e-08,0.481063,0.00210993,-9.24913e-06,5.98144e-08,0.483163,0.00209161,-9.06969e-06,7.93789e-08,0.485246,0.00207371,-8.83155e-06,3.99032e-08,0.487311,0.00205616,-8.71184e-06,8.88325e-08,0.489358,0.002039,-8.44534e-06,2.20004e-08,0.491389,0.00202218,-8.37934e-06,9.13872e-08,0.493403,0.0020057,-8.10518e-06,2.96829e-08,0.495401,0.00198957,-8.01613e-06,5.81028e-08,0.497382,0.00197372,-7.84183e-06,6.5731e-08,0.499348,0.00195823,-7.64463e-06,3.66019e-08,0.501299,0.00194305,-7.53483e-06,2.62811e-08,0.503234,0.00192806,-7.45598e-06,9.66907e-08,0.505155,0.00191344,-7.16591e-06,4.18928e-09,0.507061,0.00189912,-7.15334e-06,6.53665e-08,0.508953,0.00188501,-6.95724e-06,3.23686e-08,0.510831,0.00187119,-6.86014e-06,4.35774e-08,0.512696,0.0018576,-6.72941e-06,3.17406e-08,0.514547,0.00184424,-6.63418e-06,6.78785e-08,0.516384,0.00183117,-6.43055e-06,-5.23126e-09,0.518209,0.0018183,-6.44624e-06,7.22562e-08,0.520021,0.00180562,-6.22947e-06,1.42292e-08,0.52182,0.0017932,-6.18679e-06,4.9641e-08,0.523607,0.00178098,-6.03786e-06,2.56259e-08,0.525382,0.00176898,-5.96099e-06,2.66696e-08,0.527145,0.00175714,-5.88098e-06,4.65094e-08,0.528897,0.00174552,-5.74145e-06,2.57114e-08,0.530637,0.00173411,-5.66431e-06,2.94588e-08,0.532365,0.00172287,-5.57594e-06,3.52667e-08,0.534082,0.00171182,-5.47014e-06,8.28868e-09,0.535789,0.00170091,-5.44527e-06,5.07871e-08,0.537484,0.00169017,-5.29291e-06,2.69817e-08,0.539169,0.00167967,-5.21197e-06,2.01009e-08,0.540844,0.0016693,-5.15166e-06,1.18237e-08,0.542508,0.00165903,-5.11619e-06,5.18135e-08,0.544162,0.00164896,-4.96075e-06,1.9341e-08,0.545806,0.00163909,-4.90273e-06,-9.96867e-09,0.54744,0.00162926,-4.93263e-06,8.01382e-08,0.549064,0.00161963,-4.69222e-06,-1.25601e-08,0.550679,0.00161021,-4.7299e-06,2.97067e-08,0.552285,0.00160084,-4.64078e-06,1.29426e-08,0.553881,0.0015916,-4.60195e-06,3.77327e-08,0.555468,0.00158251,-4.48875e-06,1.49412e-08,0.557046,0.00157357,-4.44393e-06,2.17118e-08,0.558615,0.00156475,-4.3788e-06,1.74206e-08,0.560176,0.00155605,-4.32653e-06,2.78152e-08,0.561727,0.00154748,-4.24309e-06,-9.47239e-09,0.563271,0.00153896,-4.27151e-06,6.9679e-08,0.564805,0.00153063,-4.06247e-06,-3.08246e-08,0.566332,0.00152241,-4.15494e-06,5.36188e-08,0.56785,0.00151426,-3.99409e-06,-4.83594e-09,0.56936,0.00150626,-4.00859e-06,2.53293e-08,0.570863,0.00149832,-3.93261e-06,2.27286e-08,0.572357,0.00149052,-3.86442e-06,2.96541e-09,0.573844,0.0014828,-3.85552e-06,2.50147e-08,0.575323,0.00147516,-3.78048e-06,1.61842e-08,0.576794,0.00146765,-3.73193e-06,2.94582e-08,0.578258,0.00146028,-3.64355e-06,-1.48076e-08,0.579715,0.00145295,-3.68798e-06,2.97724e-08,0.581164,0.00144566,-3.59866e-06,1.49272e-08,0.582606,0.00143851,-3.55388e-06,2.97285e-08,0.584041,0.00143149,-3.46469e-06,-1.46323e-08,0.585469,0.00142451,-3.50859e-06,2.88004e-08,0.58689,0.00141758,-3.42219e-06,1.864e-08,0.588304,0.00141079,-3.36627e-06,1.58482e-08,0.589712,0.00140411,-3.31872e-06,-2.24279e-08,0.591112,0.00139741,-3.38601e-06,7.38639e-08,0.592507,0.00139085,-3.16441e-06,-3.46088e-08,0.593894,0.00138442,-3.26824e-06,4.96675e-09,0.595275,0.0013779,-3.25334e-06,7.4346e-08,0.59665,0.00137162,-3.0303e-06,-6.39319e-08,0.598019,0.00136536,-3.2221e-06,6.21725e-08,0.599381,0.00135911,-3.03558e-06,-5.94423e-09,0.600737,0.00135302,-3.05341e-06,2.12091e-08,0.602087,0.00134697,-2.98979e-06,-1.92876e-08,0.603431,0.00134094,-3.04765e-06,5.5941e-08,0.604769,0.00133501,-2.87983e-06,-2.56622e-08,0.606101,0.00132917,-2.95681e-06,4.67078e-08,0.607427,0.0013234,-2.81669e-06,-4.19592e-08,0.608748,0.00131764,-2.94257e-06,6.15243e-08,0.610062,0.00131194,-2.75799e-06,-2.53244e-08,0.611372,0.00130635,-2.83397e-06,3.97739e-08,0.612675,0.0013008,-2.71465e-06,-1.45618e-08,0.613973,0.00129533,-2.75833e-06,1.84733e-08,0.615266,0.00128986,-2.70291e-06,2.73606e-10,0.616553,0.00128446,-2.70209e-06,4.00367e-08,0.617835,0.00127918,-2.58198e-06,-4.12113e-08,0.619111,0.00127389,-2.70561e-06,6.52039e-08,0.620383,0.00126867,-2.51e-06,-4.07901e-08,0.621649,0.00126353,-2.63237e-06,3.83516e-08,0.62291,0.00125838,-2.51732e-06,6.59315e-09,0.624166,0.00125337,-2.49754e-06,-5.11939e-09,0.625416,0.00124836,-2.5129e-06,1.38846e-08,0.626662,0.00124337,-2.47124e-06,9.18514e-09,0.627903,0.00123846,-2.44369e-06,8.97952e-09,0.629139,0.0012336,-2.41675e-06,1.45012e-08,0.63037,0.00122881,-2.37325e-06,-7.37949e-09,0.631597,0.00122404,-2.39538e-06,1.50169e-08,0.632818,0.00121929,-2.35033e-06,6.91648e-09,0.634035,0.00121461,-2.32958e-06,1.69219e-08,0.635248,0.00121,-2.27882e-06,-1.49997e-08,0.636455,0.0012054,-2.32382e-06,4.30769e-08,0.637659,0.00120088,-2.19459e-06,-3.80986e-08,0.638857,0.00119638,-2.30888e-06,4.97134e-08,0.640051,0.00119191,-2.15974e-06,-4.15463e-08,0.641241,0.00118747,-2.28438e-06,5.68667e-08,0.642426,0.00118307,-2.11378e-06,-7.10641e-09,0.643607,0.00117882,-2.1351e-06,-2.8441e-08,0.644784,0.00117446,-2.22042e-06,6.12658e-08,0.645956,0.00117021,-2.03663e-06,-3.78083e-08,0.647124,0.00116602,-2.15005e-06,3.03627e-08,0.648288,0.00116181,-2.05896e-06,-2.40379e-08,0.649448,0.00115762,-2.13108e-06,6.57887e-08,0.650603,0.00115356,-1.93371e-06,-6.03028e-08,0.651755,0.00114951,-2.11462e-06,5.62134e-08,0.652902,0.00114545,-1.94598e-06,-4.53417e-08,0.654046,0.00114142,-2.082e-06,6.55489e-08,0.655185,0.00113745,-1.88536e-06,-3.80396e-08,0.656321,0.00113357,-1.99948e-06,2.70049e-08,0.657452,0.00112965,-1.91846e-06,-1.03755e-08,0.65858,0.00112578,-1.94959e-06,1.44973e-08,0.659704,0.00112192,-1.9061e-06,1.1991e-08,0.660824,0.00111815,-1.87012e-06,-2.85634e-09,0.66194,0.0011144,-1.87869e-06,-5.65782e-10,0.663053,0.00111064,-1.88039e-06,5.11947e-09,0.664162,0.0011069,-1.86503e-06,3.96924e-08,0.665267,0.00110328,-1.74595e-06,-4.46795e-08,0.666368,0.00109966,-1.87999e-06,1.98161e-08,0.667466,0.00109596,-1.82054e-06,2.502e-08,0.66856,0.00109239,-1.74548e-06,-6.86593e-10,0.669651,0.0010889,-1.74754e-06,-2.22739e-08,0.670738,0.00108534,-1.81437e-06,3.01776e-08,0.671821,0.0010818,-1.72383e-06,2.07732e-08,0.672902,0.00107841,-1.66151e-06,-5.36658e-08,0.673978,0.00107493,-1.82251e-06,7.46802e-08,0.675051,0.00107151,-1.59847e-06,-6.62411e-08,0.676121,0.00106811,-1.79719e-06,7.10748e-08,0.677188,0.00106473,-1.58397e-06,-3.92441e-08,0.678251,0.00106145,-1.7017e-06,2.62973e-08,0.679311,0.00105812,-1.62281e-06,-6.34035e-09,0.680367,0.00105486,-1.64183e-06,-9.36249e-10,0.68142,0.00105157,-1.64464e-06,1.00854e-08,0.68247,0.00104831,-1.61438e-06,2.01995e-08,0.683517,0.00104514,-1.55378e-06,-3.1279e-08,0.68456,0.00104194,-1.64762e-06,4.53114e-08,0.685601,0.00103878,-1.51169e-06,-3.07573e-08,0.686638,0.00103567,-1.60396e-06,1.81133e-08,0.687672,0.00103251,-1.54962e-06,1.79085e-08,0.688703,0.00102947,-1.49589e-06,-3.01428e-08,0.689731,0.00102639,-1.58632e-06,4.30583e-08,0.690756,0.00102334,-1.45715e-06,-2.28814e-08,0.691778,0.00102036,-1.52579e-06,-1.11373e-08,0.692797,0.00101727,-1.5592e-06,6.74305e-08,0.693812,0.00101436,-1.35691e-06,-7.97709e-08,0.694825,0.0010114,-1.59622e-06,7.28391e-08,0.695835,0.00100843,-1.37771e-06,-3.27715e-08,0.696842,0.00100558,-1.47602e-06,-1.35807e-09,0.697846,0.00100262,-1.48009e-06,3.82037e-08,0.698847,0.000999775,-1.36548e-06,-3.22474e-08,0.699846,0.000996948,-1.46223e-06,3.11809e-08,0.700841,0.000994117,-1.36868e-06,-3.28714e-08,0.701834,0.000991281,-1.4673e-06,4.07001e-08,0.702824,0.000988468,-1.3452e-06,-1.07197e-08,0.703811,0.000985746,-1.37736e-06,2.17866e-09,0.704795,0.000982998,-1.37082e-06,2.00521e-09,0.705777,0.000980262,-1.3648e-06,-1.01996e-08,0.706756,0.000977502,-1.3954e-06,3.87931e-08,0.707732,0.000974827,-1.27902e-06,-2.57632e-08,0.708706,0.000972192,-1.35631e-06,4.65513e-09,0.709676,0.000969493,-1.34235e-06,7.14257e-09,0.710645,0.00096683,-1.32092e-06,2.63791e-08,0.71161,0.000964267,-1.24178e-06,-5.30543e-08,0.712573,0.000961625,-1.40095e-06,6.66289e-08,0.713533,0.000959023,-1.20106e-06,-3.46474e-08,0.714491,0.000956517,-1.305e-06,1.23559e-08,0.715446,0.000953944,-1.26793e-06,-1.47763e-08,0.716399,0.000951364,-1.31226e-06,4.67494e-08,0.717349,0.000948879,-1.17201e-06,-5.3012e-08,0.718297,0.000946376,-1.33105e-06,4.60894e-08,0.719242,0.000943852,-1.19278e-06,-1.21366e-08,0.720185,0.00094143,-1.22919e-06,2.45673e-09,0.721125,0.000938979,-1.22182e-06,2.30966e-09,0.722063,0.000936543,-1.21489e-06,-1.16954e-08,0.722998,0.000934078,-1.24998e-06,4.44718e-08,0.723931,0.000931711,-1.11656e-06,-4.69823e-08,0.724861,0.000929337,-1.25751e-06,2.4248e-08,0.725789,0.000926895,-1.18477e-06,9.5949e-09,0.726715,0.000924554,-1.15598e-06,-3.02286e-09,0.727638,0.000922233,-1.16505e-06,2.49649e-09,0.72856,0.00091991,-1.15756e-06,-6.96321e-09,0.729478,0.000917575,-1.17845e-06,2.53564e-08,0.730395,0.000915294,-1.10238e-06,-3.48578e-08,0.731309,0.000912984,-1.20695e-06,5.44704e-08,0.732221,0.000910734,-1.04354e-06,-6.38144e-08,0.73313,0.000908455,-1.23499e-06,8.15781e-08,0.734038,0.00090623,-9.90253e-07,-8.3684e-08,0.734943,0.000903999,-1.2413e-06,7.43441e-08,0.735846,0.000901739,-1.01827e-06,-3.48787e-08,0.736746,0.000899598,-1.12291e-06,5.56596e-09,0.737645,0.000897369,-1.10621e-06,1.26148e-08,0.738541,0.000895194,-1.06837e-06,3.57935e-09,0.739435,0.000893068,-1.05763e-06,-2.69322e-08,0.740327,0.000890872,-1.13842e-06,4.45448e-08,0.741217,0.000888729,-1.00479e-06,-3.20376e-08,0.742105,0.000886623,-1.1009e-06,2.40011e-08,0.74299,0.000884493,-1.0289e-06,-4.36209e-09,0.743874,0.000882422,-1.04199e-06,-6.55268e-09,0.744755,0.000880319,-1.06164e-06,3.05728e-08,0.745634,0.000878287,-9.69926e-07,-5.61338e-08,0.746512,0.000876179,-1.13833e-06,7.4753e-08,0.747387,0.000874127,-9.14068e-07,-6.40644e-08,0.74826,0.000872106,-1.10626e-06,6.22955e-08,0.749131,0.000870081,-9.19375e-07,-6.59083e-08,0.75,0.000868044,-1.1171e-06,8.21284e-08,0.750867,0.000866056,-8.70714e-07,-8.37915e-08,0.751732,0.000864064,-1.12209e-06,7.42237e-08,0.752595,0.000862042,-8.99418e-07,-3.42894e-08,0.753456,0.00086014,-1.00229e-06,3.32955e-09,0.754315,0.000858146,-9.92297e-07,2.09712e-08,0.755173,0.000856224,-9.29384e-07,-2.76096e-08,0.756028,0.000854282,-1.01221e-06,2.98627e-08,0.756881,0.000852348,-9.22625e-07,-3.22365e-08,0.757733,0.000850406,-1.01933e-06,3.94786e-08,0.758582,0.000848485,-9.00898e-07,-6.46833e-09,0.75943,0.000846664,-9.20303e-07,-1.36052e-08,0.760275,0.000844783,-9.61119e-07,1.28447e-09,0.761119,0.000842864,-9.57266e-07,8.4674e-09,0.761961,0.000840975,-9.31864e-07,2.44506e-08,0.762801,0.000839185,-8.58512e-07,-4.6665e-08,0.763639,0.000837328,-9.98507e-07,4.30001e-08,0.764476,0.00083546,-8.69507e-07,-6.12609e-09,0.76531,0.000833703,-8.87885e-07,-1.84959e-08,0.766143,0.000831871,-9.43372e-07,2.05052e-08,0.766974,0.000830046,-8.81857e-07,-3.92026e-09,0.767803,0.000828271,-8.93618e-07,-4.82426e-09,0.768631,0.000826469,-9.0809e-07,2.32172e-08,0.769456,0.000824722,-8.38439e-07,-2.84401e-08,0.77028,0.00082296,-9.23759e-07,3.09386e-08,0.771102,0.000821205,-8.30943e-07,-3.57099e-08,0.771922,0.000819436,-9.38073e-07,5.22963e-08,0.772741,0.000817717,-7.81184e-07,-5.42658e-08,0.773558,0.000815992,-9.43981e-07,4.55579e-08,0.774373,0.000814241,-8.07308e-07,-8.75656e-09,0.775186,0.0008126,-8.33578e-07,-1.05315e-08,0.775998,0.000810901,-8.65172e-07,-8.72188e-09,0.776808,0.000809145,-8.91338e-07,4.54191e-08,0.777616,0.000807498,-7.5508e-07,-5.37454e-08,0.778423,0.000805827,-9.16317e-07,5.03532e-08,0.779228,0.000804145,-7.65257e-07,-2.84584e-08,0.780031,0.000802529,-8.50632e-07,3.87579e-09,0.780833,0.00080084,-8.39005e-07,1.29552e-08,0.781633,0.0007992,-8.00139e-07,3.90804e-09,0.782432,0.000797612,-7.88415e-07,-2.85874e-08,0.783228,0.000795949,-8.74177e-07,5.0837e-08,0.784023,0.000794353,-7.21666e-07,-5.55513e-08,0.784817,0.000792743,-8.8832e-07,5.21587e-08,0.785609,0.000791123,-7.31844e-07,-3.38744e-08,0.786399,0.000789558,-8.33467e-07,2.37342e-08,0.787188,0.000787962,-7.62264e-07,-1.45775e-09,0.787975,0.000786433,-7.66638e-07,-1.79034e-08,0.788761,0.000784846,-8.20348e-07,1.34665e-08,0.789545,0.000783246,-7.79948e-07,2.3642e-08,0.790327,0.000781757,-7.09022e-07,-4.84297e-08,0.791108,0.000780194,-8.54311e-07,5.08674e-08,0.791888,0.000778638,-7.01709e-07,-3.58303e-08,0.792666,0.000777127,-8.092e-07,3.28493e-08,0.793442,0.000775607,-7.10652e-07,-3.59624e-08,0.794217,0.000774078,-8.1854e-07,5.13959e-08,0.79499,0.000772595,-6.64352e-07,-5.04121e-08,0.795762,0.000771115,-8.15588e-07,3.10431e-08,0.796532,0.000769577,-7.22459e-07,-1.41557e-08,0.797301,0.00076809,-7.64926e-07,2.55795e-08,0.798069,0.000766636,-6.88187e-07,-2.85578e-08,0.798835,0.000765174,-7.73861e-07,2.90472e-08,0.799599,0.000763714,-6.86719e-07,-2.80262e-08,0.800362,0.000762256,-7.70798e-07,2.34531e-08,0.801123,0.000760785,-7.00438e-07,-6.18144e-09,0.801884,0.000759366,-7.18983e-07,1.27263e-09,0.802642,0.000757931,-7.15165e-07,1.09101e-09,0.803399,0.000756504,-7.11892e-07,-5.63675e-09,0.804155,0.000755064,-7.28802e-07,2.14559e-08,0.80491,0.00075367,-6.64434e-07,-2.05821e-08,0.805663,0.00075228,-7.26181e-07,1.26812e-09,0.806414,0.000750831,-7.22377e-07,1.55097e-08,0.807164,0.000749433,-6.75848e-07,-3.70216e-09,0.807913,0.00074807,-6.86954e-07,-7.0105e-10,0.80866,0.000746694,-6.89057e-07,6.5063e-09,0.809406,0.000745336,-6.69538e-07,-2.53242e-08,0.810151,0.000743921,-7.45511e-07,3.51858e-08,0.810894,0.000742535,-6.39953e-07,3.79034e-09,0.811636,0.000741267,-6.28582e-07,-5.03471e-08,0.812377,0.000739858,-7.79624e-07,7.83886e-08,0.813116,0.000738534,-5.44458e-07,-8.43935e-08,0.813854,0.000737192,-7.97638e-07,8.03714e-08,0.81459,0.000735838,-5.56524e-07,-5.82784e-08,0.815325,0.00073455,-7.31359e-07,3.35329e-08,0.816059,0.000733188,-6.3076e-07,-1.62486e-08,0.816792,0.000731878,-6.79506e-07,3.14614e-08,0.817523,0.000730613,-5.85122e-07,-4.99925e-08,0.818253,0.000729293,-7.35099e-07,4.92994e-08,0.818982,0.000727971,-5.87201e-07,-2.79959e-08,0.819709,0.000726712,-6.71189e-07,3.07959e-09,0.820435,0.000725379,-6.6195e-07,1.56777e-08,0.82116,0.000724102,-6.14917e-07,-6.18564e-09,0.821883,0.000722854,-6.33474e-07,9.06488e-09,0.822606,0.000721614,-6.06279e-07,-3.00739e-08,0.823327,0.000720311,-6.96501e-07,5.16262e-08,0.824046,0.000719073,-5.41623e-07,-5.72214e-08,0.824765,0.000717818,-7.13287e-07,5.80503e-08,0.825482,0.000716566,-5.39136e-07,-5.57703e-08,0.826198,0.00071532,-7.06447e-07,4.58215e-08,0.826912,0.000714045,-5.68983e-07,-8.30636e-09,0.827626,0.000712882,-5.93902e-07,-1.25961e-08,0.828338,0.000711656,-6.3169e-07,-9.13985e-10,0.829049,0.00071039,-6.34432e-07,1.62519e-08,0.829759,0.00070917,-5.85676e-07,-4.48904e-09,0.830468,0.000707985,-5.99143e-07,1.70418e-09,0.831175,0.000706792,-5.9403e-07,-2.32768e-09,0.831881,0.000705597,-6.01014e-07,7.60648e-09,0.832586,0.000704418,-5.78194e-07,-2.80982e-08,0.83329,0.000703177,-6.62489e-07,4.51817e-08,0.833993,0.000701988,-5.26944e-07,-3.34192e-08,0.834694,0.000700834,-6.27201e-07,2.88904e-08,0.835394,0.000699666,-5.4053e-07,-2.25378e-08,0.836093,0.000698517,-6.08143e-07,1.65589e-09,0.836791,0.000697306,-6.03176e-07,1.59142e-08,0.837488,0.000696147,-5.55433e-07,-5.70801e-09,0.838184,0.000695019,-5.72557e-07,6.91792e-09,0.838878,0.000693895,-5.51803e-07,-2.19637e-08,0.839571,0.000692725,-6.17694e-07,2.13321e-08,0.840263,0.000691554,-5.53698e-07,-3.75996e-09,0.840954,0.000690435,-5.64978e-07,-6.29219e-09,0.841644,0.000689287,-5.83855e-07,2.89287e-08,0.842333,0.000688206,-4.97068e-07,-4.98181e-08,0.843021,0.000687062,-6.46523e-07,5.11344e-08,0.843707,0.000685922,-4.9312e-07,-3.55102e-08,0.844393,0.00068483,-5.9965e-07,3.13019e-08,0.845077,0.000683724,-5.05745e-07,-3.00925e-08,0.84576,0.000682622,-5.96022e-07,2.94636e-08,0.846442,0.000681519,-5.07631e-07,-2.81572e-08,0.847123,0.000680419,-5.92103e-07,2.35606e-08,0.847803,0.000679306,-5.21421e-07,-6.48045e-09,0.848482,0.000678243,-5.40863e-07,2.36124e-09,0.849159,0.000677169,-5.33779e-07,-2.96461e-09,0.849836,0.000676092,-5.42673e-07,9.49728e-09,0.850512,0.000675035,-5.14181e-07,-3.50245e-08,0.851186,0.000673902,-6.19254e-07,7.09959e-08,0.851859,0.000672876,-4.06267e-07,-7.01453e-08,0.852532,0.000671853,-6.16703e-07,3.07714e-08,0.853203,0.000670712,-5.24388e-07,6.66423e-09,0.853873,0.000669684,-5.04396e-07,2.17629e-09,0.854542,0.000668681,-4.97867e-07,-1.53693e-08,0.855211,0.000667639,-5.43975e-07,-3.03752e-10,0.855878,0.000666551,-5.44886e-07,1.65844e-08,0.856544,0.000665511,-4.95133e-07,-6.42907e-09,0.857209,0.000664501,-5.1442e-07,9.13195e-09,0.857873,0.0006635,-4.87024e-07,-3.00987e-08,0.858536,0.000662435,-5.7732e-07,5.16584e-08,0.859198,0.000661436,-4.22345e-07,-5.73255e-08,0.859859,0.000660419,-5.94322e-07,5.84343e-08,0.860518,0.000659406,-4.19019e-07,-5.72022e-08,0.861177,0.000658396,-5.90626e-07,5.11653e-08,0.861835,0.000657368,-4.3713e-07,-2.82495e-08,0.862492,0.000656409,-5.21878e-07,2.22788e-09,0.863148,0.000655372,-5.15195e-07,1.9338e-08,0.863803,0.0006544,-4.5718e-07,-1.99754e-08,0.864457,0.000653425,-5.17107e-07,9.59024e-10,0.86511,0.000652394,-5.1423e-07,1.61393e-08,0.865762,0.000651414,-4.65812e-07,-5.91149e-09,0.866413,0.000650465,-4.83546e-07,7.50665e-09,0.867063,0.00064952,-4.61026e-07,-2.4115e-08,0.867712,0.000648526,-5.33371e-07,2.93486e-08,0.86836,0.000647547,-4.45325e-07,-3.36748e-08,0.869007,0.000646555,-5.4635e-07,4.57461e-08,0.869653,0.0006456,-4.09112e-07,-3.01002e-08,0.870298,0.000644691,-4.99412e-07,1.50501e-08,0.870942,0.000643738,-4.54262e-07,-3.01002e-08,0.871585,0.000642739,-5.44563e-07,4.57461e-08,0.872228,0.000641787,-4.07324e-07,-3.36748e-08,0.872869,0.000640871,-5.08349e-07,2.93486e-08,0.873509,0.000639943,-4.20303e-07,-2.4115e-08,0.874149,0.00063903,-4.92648e-07,7.50655e-09,0.874787,0.000638067,-4.70128e-07,-5.91126e-09,0.875425,0.000637109,-4.87862e-07,1.61385e-08,0.876062,0.000636182,-4.39447e-07,9.61961e-10,0.876697,0.000635306,-4.36561e-07,-1.99863e-08,0.877332,0.000634373,-4.9652e-07,1.93785e-08,0.877966,0.000633438,-4.38384e-07,2.07697e-09,0.878599,0.000632567,-4.32153e-07,-2.76864e-08,0.879231,0.00063162,-5.15212e-07,4.90641e-08,0.879862,0.000630737,-3.6802e-07,-4.93606e-08,0.880493,0.000629852,-5.16102e-07,2.9169e-08,0.881122,0.000628908,-4.28595e-07,-7.71083e-09,0.881751,0.000628027,-4.51727e-07,1.6744e-09,0.882378,0.000627129,-4.46704e-07,1.01317e-09,0.883005,0.000626239,-4.43665e-07,-5.72703e-09,0.883631,0.000625334,-4.60846e-07,2.1895e-08,0.884255,0.000624478,-3.95161e-07,-2.22481e-08,0.88488,0.000623621,-4.61905e-07,7.4928e-09,0.885503,0.00062272,-4.39427e-07,-7.72306e-09,0.886125,0.000621818,-4.62596e-07,2.33995e-08,0.886746,0.000620963,-3.92398e-07,-2.62704e-08,0.887367,0.000620099,-4.71209e-07,2.20775e-08,0.887987,0.000619223,-4.04976e-07,-2.43496e-09,0.888605,0.000618406,-4.12281e-07,-1.23377e-08,0.889223,0.000617544,-4.49294e-07,-7.81876e-09,0.88984,0.000616622,-4.72751e-07,4.36128e-08,0.890457,0.000615807,-3.41912e-07,-4.7423e-08,0.891072,0.000614981,-4.84181e-07,2.68698e-08,0.891687,0.000614093,-4.03572e-07,-4.51384e-10,0.8923,0.000613285,-4.04926e-07,-2.50643e-08,0.892913,0.0006124,-4.80119e-07,4.11038e-08,0.893525,0.000611563,-3.56808e-07,-2.01414e-08,0.894136,0.000610789,-4.17232e-07,-2.01426e-08,0.894747,0.000609894,-4.7766e-07,4.11073e-08,0.895356,0.000609062,-3.54338e-07,-2.50773e-08,0.895965,0.000608278,-4.2957e-07,-4.02954e-10,0.896573,0.000607418,-4.30779e-07,2.66891e-08,0.89718,0.000606636,-3.50711e-07,-4.67489e-08,0.897786,0.000605795,-4.90958e-07,4.10972e-08,0.898391,0.000604936,-3.67666e-07,1.56948e-09,0.898996,0.000604205,-3.62958e-07,-4.73751e-08,0.8996,0.000603337,-5.05083e-07,6.87214e-08,0.900202,0.000602533,-2.98919e-07,-4.86966e-08,0.900805,0.000601789,-4.45009e-07,6.85589e-09,0.901406,0.00060092,-4.24441e-07,2.1273e-08,0.902007,0.000600135,-3.60622e-07,-3.23434e-08,0.902606,0.000599317,-4.57652e-07,4.84959e-08,0.903205,0.000598547,-3.12164e-07,-4.24309e-08,0.903803,0.000597795,-4.39457e-07,2.01844e-09,0.904401,0.000596922,-4.33402e-07,3.43571e-08,0.904997,0.000596159,-3.30331e-07,-2.02374e-08,0.905593,0.000595437,-3.91043e-07,-1.30123e-08,0.906188,0.000594616,-4.3008e-07,1.26819e-08,0.906782,0.000593794,-3.92034e-07,2.18894e-08,0.907376,0.000593076,-3.26366e-07,-4.06349e-08,0.907968,0.000592301,-4.4827e-07,2.1441e-08,0.90856,0.000591469,-3.83947e-07,1.44754e-08,0.909151,0.000590744,-3.40521e-07,-1.97379e-08,0.909742,0.000590004,-3.99735e-07,4.87161e-09,0.910331,0.000589219,-3.8512e-07,2.51532e-10,0.91092,0.00058845,-3.84366e-07,-5.87776e-09,0.911508,0.000587663,-4.01999e-07,2.32595e-08,0.912096,0.000586929,-3.3222e-07,-2.75554e-08,0.912682,0.000586182,-4.14887e-07,2.73573e-08,0.913268,0.000585434,-3.32815e-07,-2.22692e-08,0.913853,0.000584702,-3.99622e-07,2.11486e-09,0.914437,0.000583909,-3.93278e-07,1.38098e-08,0.915021,0.000583164,-3.51848e-07,2.25042e-09,0.915604,0.000582467,-3.45097e-07,-2.28115e-08,0.916186,0.000581708,-4.13531e-07,2.93911e-08,0.916767,0.000580969,-3.25358e-07,-3.51481e-08,0.917348,0.000580213,-4.30803e-07,5.15967e-08,0.917928,0.000579506,-2.76012e-07,-5.20296e-08,0.918507,0.000578798,-4.32101e-07,3.73124e-08,0.919085,0.000578046,-3.20164e-07,-3.76154e-08,0.919663,0.000577293,-4.3301e-07,5.35447e-08,0.92024,0.000576587,-2.72376e-07,-5.7354e-08,0.920816,0.000575871,-4.44438e-07,5.66621e-08,0.921391,0.000575152,-2.74452e-07,-5.00851e-08,0.921966,0.000574453,-4.24707e-07,2.4469e-08,0.92254,0.000573677,-3.513e-07,1.18138e-08,0.923114,0.000573009,-3.15859e-07,-1.21195e-08,0.923686,0.000572341,-3.52217e-07,-2.29403e-08,0.924258,0.000571568,-4.21038e-07,4.4276e-08,0.924829,0.000570859,-2.8821e-07,-3.49546e-08,0.9254,0.000570178,-3.93074e-07,3.59377e-08,0.92597,0.000569499,-2.85261e-07,-4.91915e-08,0.926539,0.000568781,-4.32835e-07,4.16189e-08,0.927107,0.00056804,-3.07979e-07,1.92523e-09,0.927675,0.00056743,-3.02203e-07,-4.93198e-08,0.928242,0.000566678,-4.50162e-07,7.61447e-08,0.928809,0.000566006,-2.21728e-07,-7.6445e-08,0.929374,0.000565333,-4.51063e-07,5.08216e-08,0.929939,0.000564583,-2.98599e-07,-7.63212e-09,0.930503,0.000563963,-3.21495e-07,-2.02931e-08,0.931067,0.000563259,-3.82374e-07,2.92001e-08,0.93163,0.000562582,-2.94774e-07,-3.69025e-08,0.932192,0.000561882,-4.05482e-07,5.88053e-08,0.932754,0.000561247,-2.29066e-07,-7.91094e-08,0.933315,0.000560552,-4.66394e-07,7.88184e-08,0.933875,0.000559856,-2.29939e-07,-5.73501e-08,0.934434,0.000559224,-4.01989e-07,3.13727e-08,0.934993,0.000558514,-3.07871e-07,-8.53611e-09,0.935551,0.000557873,-3.33479e-07,2.77175e-09,0.936109,0.000557214,-3.25164e-07,-2.55091e-09,0.936666,0.000556556,-3.32817e-07,7.43188e-09,0.937222,0.000555913,-3.10521e-07,-2.71766e-08,0.937778,0.00055521,-3.92051e-07,4.167e-08,0.938333,0.000554551,-2.67041e-07,-2.02941e-08,0.938887,0.000553956,-3.27923e-07,-2.00984e-08,0.93944,0.00055324,-3.88218e-07,4.10828e-08,0.939993,0.000552587,-2.6497e-07,-2.50237e-08,0.940546,0.000551982,-3.40041e-07,-5.92583e-10,0.941097,0.0005513,-3.41819e-07,2.7394e-08,0.941648,0.000550698,-2.59637e-07,-4.93788e-08,0.942199,0.000550031,-4.07773e-07,5.09119e-08,0.942748,0.000549368,-2.55038e-07,-3.50595e-08,0.943297,0.000548753,-3.60216e-07,2.97214e-08,0.943846,0.000548122,-2.71052e-07,-2.42215e-08,0.944394,0.000547507,-3.43716e-07,7.55985e-09,0.944941,0.000546842,-3.21037e-07,-6.01796e-09,0.945487,0.000546182,-3.3909e-07,1.65119e-08,0.946033,0.000545553,-2.89555e-07,-4.2498e-10,0.946578,0.000544973,-2.9083e-07,-1.4812e-08,0.947123,0.000544347,-3.35266e-07,6.83068e-11,0.947667,0.000543676,-3.35061e-07,1.45388e-08,0.94821,0.00054305,-2.91444e-07,1.38123e-09,0.948753,0.000542471,-2.87301e-07,-2.00637e-08,0.949295,0.000541836,-3.47492e-07,1.92688e-08,0.949837,0.000541199,-2.89685e-07,2.59298e-09,0.950378,0.000540628,-2.81906e-07,-2.96407e-08,0.950918,0.000539975,-3.70829e-07,5.63652e-08,0.951458,0.000539402,-2.01733e-07,-7.66107e-08,0.951997,0.000538769,-4.31565e-07,7.12638e-08,0.952535,0.00053812,-2.17774e-07,-2.96305e-08,0.953073,0.000537595,-3.06665e-07,-1.23464e-08,0.95361,0.000536945,-3.43704e-07,1.94114e-08,0.954147,0.000536316,-2.8547e-07,-5.69451e-09,0.954683,0.000535728,-3.02554e-07,3.36666e-09,0.955219,0.000535133,-2.92454e-07,-7.77208e-09,0.955753,0.000534525,-3.1577e-07,2.77216e-08,0.956288,0.000533976,-2.32605e-07,-4.35097e-08,0.956821,0.00053338,-3.63134e-07,2.7108e-08,0.957354,0.000532735,-2.8181e-07,-5.31772e-09,0.957887,0.000532156,-2.97764e-07,-5.83718e-09,0.958419,0.000531543,-3.15275e-07,2.86664e-08,0.95895,0.000530998,-2.29276e-07,-4.9224e-08,0.959481,0.000530392,-3.76948e-07,4.90201e-08,0.960011,0.000529785,-2.29887e-07,-2.76471e-08,0.96054,0.000529243,-3.12829e-07,1.96385e-09,0.961069,0.000528623,-3.06937e-07,1.97917e-08,0.961598,0.000528068,-2.47562e-07,-2.15261e-08,0.962125,0.000527508,-3.1214e-07,6.70795e-09,0.962653,0.000526904,-2.92016e-07,-5.30573e-09,0.963179,0.000526304,-3.07934e-07,1.4515e-08,0.963705,0.000525732,-2.64389e-07,6.85048e-09,0.964231,0.000525224,-2.43837e-07,-4.19169e-08,0.964756,0.00052461,-3.69588e-07,4.1608e-08,0.96528,0.000523996,-2.44764e-07,-5.30598e-09,0.965804,0.000523491,-2.60682e-07,-2.03841e-08,0.966327,0.000522908,-3.21834e-07,2.72378e-08,0.966849,0.000522346,-2.40121e-07,-2.89625e-08,0.967371,0.000521779,-3.27008e-07,2.90075e-08,0.967893,0.000521212,-2.39986e-07,-2.74629e-08,0.968414,0.00052065,-3.22374e-07,2.12396e-08,0.968934,0.000520069,-2.58656e-07,2.10922e-09,0.969454,0.000519558,-2.52328e-07,-2.96765e-08,0.969973,0.000518964,-3.41357e-07,5.6992e-08,0.970492,0.000518452,-1.70382e-07,-7.90821e-08,0.97101,0.000517874,-4.07628e-07,8.05224e-08,0.971528,0.000517301,-1.66061e-07,-6.41937e-08,0.972045,0.000516776,-3.58642e-07,5.70429e-08,0.972561,0.00051623,-1.87513e-07,-4.47686e-08,0.973077,0.00051572,-3.21819e-07,2.82237e-09,0.973593,0.000515085,-3.13352e-07,3.34792e-08,0.974108,0.000514559,-2.12914e-07,-1.75298e-08,0.974622,0.000514081,-2.65503e-07,-2.29648e-08,0.975136,0.000513481,-3.34398e-07,4.97843e-08,0.975649,0.000512961,-1.85045e-07,-5.6963e-08,0.976162,0.00051242,-3.55934e-07,5.88585e-08,0.976674,0.000511885,-1.79359e-07,-5.92616e-08,0.977185,0.000511348,-3.57143e-07,5.89785e-08,0.977696,0.000510811,-1.80208e-07,-5.74433e-08,0.978207,0.000510278,-3.52538e-07,5.15854e-08,0.978717,0.000509728,-1.97781e-07,-2.9689e-08,0.979226,0.000509243,-2.86848e-07,7.56591e-09,0.979735,0.000508692,-2.64151e-07,-5.74649e-10,0.980244,0.000508162,-2.65875e-07,-5.26732e-09,0.980752,0.000507615,-2.81677e-07,2.16439e-08,0.981259,0.000507116,-2.16745e-07,-2.17037e-08,0.981766,0.000506618,-2.81856e-07,5.56636e-09,0.982272,0.000506071,-2.65157e-07,-5.61689e-10,0.982778,0.000505539,-2.66842e-07,-3.31963e-09,0.983283,0.000504995,-2.76801e-07,1.38402e-08,0.983788,0.000504483,-2.3528e-07,7.56339e-09,0.984292,0.000504035,-2.1259e-07,-4.40938e-08,0.984796,0.000503478,-3.44871e-07,4.96026e-08,0.985299,0.000502937,-1.96064e-07,-3.51071e-08,0.985802,0.000502439,-3.01385e-07,3.12212e-08,0.986304,0.00050193,-2.07721e-07,-3.0173e-08,0.986806,0.000501424,-2.9824e-07,2.9866e-08,0.987307,0.000500917,-2.08642e-07,-2.96865e-08,0.987808,0.000500411,-2.97702e-07,2.92753e-08,0.988308,0.000499903,-2.09876e-07,-2.78101e-08,0.988807,0.0004994,-2.93306e-07,2.23604e-08,0.989307,0.000498881,-2.26225e-07,-2.02681e-09,0.989805,0.000498422,-2.32305e-07,-1.42531e-08,0.990303,0.000497915,-2.75065e-07,-5.65232e-10,0.990801,0.000497363,-2.76761e-07,1.65141e-08,0.991298,0.000496859,-2.27218e-07,-5.88639e-09,0.991795,0.000496387,-2.44878e-07,7.0315e-09,0.992291,0.000495918,-2.23783e-07,-2.22396e-08,0.992787,0.000495404,-2.90502e-07,2.23224e-08,0.993282,0.00049489,-2.23535e-07,-7.44543e-09,0.993776,0.000494421,-2.45871e-07,7.45924e-09,0.994271,0.000493951,-2.23493e-07,-2.23915e-08,0.994764,0.000493437,-2.90668e-07,2.25021e-08,0.995257,0.000492923,-2.23161e-07,-8.01218e-09,0.99575,0.000492453,-2.47198e-07,9.54669e-09,0.996242,0.000491987,-2.18558e-07,-3.01746e-08,0.996734,0.000491459,-3.09082e-07,5.1547e-08,0.997225,0.000490996,-1.54441e-07,-5.68039e-08,0.997716,0.000490517,-3.24853e-07,5.64594e-08,0.998206,0.000490036,-1.55474e-07,-4.98245e-08,0.998696,0.000489576,-3.04948e-07,2.36292e-08,0.999186,0.000489037,-2.3406e-07,1.49121e-08,0.999674,0.000488613,-1.89324e-07,-2.3673e-08,1.00016,0.000488164,-2.60343e-07,2.01754e-08,1.00065,0.000487704,-1.99816e-07,-5.70288e-08,1.00114,0.000487133,-3.70903e-07,8.87303e-08,1.00162,0.000486657,-1.04712e-07,-5.94737e-08,1.00211,0.000486269,-2.83133e-07,2.99553e-08,1.0026,0.000485793,-1.93267e-07,-6.03474e-08,1.00308,0.000485225,-3.74309e-07,9.2225e-08,1.00357,0.000484754,-9.76345e-08,-7.0134e-08,1.00405,0.000484348,-3.08036e-07,6.91016e-08,1.00454,0.000483939,-1.00731e-07,-8.70633e-08,1.00502,0.000483476,-3.61921e-07,4.07328e-08,1.0055,0.000482875,-2.39723e-07,4.33413e-08,1.00599,0.000482525,-1.09699e-07,-9.48886e-08,1.00647,0.000482021,-3.94365e-07,9.77947e-08,1.00695,0.000481526,-1.00981e-07,-5.78713e-08,1.00743,0.00048115,-2.74595e-07,1.44814e-08,1.00791,0.000480645,-2.31151e-07,-5.42665e-11,1.00839,0.000480182,-2.31314e-07,-1.42643e-08,1.00887,0.000479677,-2.74106e-07,5.71115e-08,1.00935,0.0004793,-1.02772e-07,-9.49724e-08,1.00983,0.000478809,-3.87689e-07,8.43596e-08,1.01031,0.000478287,-1.3461e-07,-4.04755e-09,1.01079,0.000478006,-1.46753e-07,-6.81694e-08,1.01127,0.000477508,-3.51261e-07,3.83067e-08,1.01174,0.00047692,-2.36341e-07,3.41521e-08,1.01222,0.00047655,-1.33885e-07,-5.57058e-08,1.0127,0.000476115,-3.01002e-07,6.94616e-08,1.01317,0.000475721,-9.26174e-08,-1.02931e-07,1.01365,0.000475227,-4.01412e-07,1.03846e-07,1.01412,0.000474736,-8.98751e-08,-7.40321e-08,1.0146,0.000474334,-3.11971e-07,7.30735e-08,1.01507,0.00047393,-9.27508e-08,-9.90527e-08,1.01554,0.000473447,-3.89909e-07,8.47188e-08,1.01602,0.000472921,-1.35753e-07,-1.40381e-09,1.01649,0.000472645,-1.39964e-07,-7.91035e-08,1.01696,0.000472128,-3.77275e-07,7.93993e-08,1.01744,0.000471612,-1.39077e-07,-7.52607e-11,1.01791,0.000471334,-1.39302e-07,-7.90983e-08,1.01838,0.000470818,-3.76597e-07,7.80499e-08,1.01885,0.000470299,-1.42448e-07,5.31733e-09,1.01932,0.00047003,-1.26496e-07,-9.93193e-08,1.01979,0.000469479,-4.24453e-07,1.53541e-07,1.02026,0.00046909,3.617e-08,-1.57217e-07,1.02073,0.000468691,-4.35482e-07,1.177e-07,1.02119,0.000468173,-8.23808e-08,-7.51659e-08,1.02166,0.000467783,-3.07878e-07,6.37538e-08,1.02213,0.000467358,-1.16617e-07,-6.064e-08,1.0226,0.000466943,-2.98537e-07,5.9597e-08,1.02306,0.000466525,-1.19746e-07,-5.85386e-08,1.02353,0.00046611,-2.95362e-07,5.53482e-08,1.024,0.000465685,-1.29317e-07,-4.36449e-08,1.02446,0.000465296,-2.60252e-07,2.20268e-11,1.02493,0.000464775,-2.60186e-07,4.35568e-08,1.02539,0.000464386,-1.29516e-07,-5.50398e-08,1.02586,0.000463961,-2.94635e-07,5.73932e-08,1.02632,0.000463544,-1.22456e-07,-5.53236e-08,1.02678,0.000463133,-2.88426e-07,4.46921e-08,1.02725,0.000462691,-1.5435e-07,-4.23534e-09,1.02771,0.000462369,-1.67056e-07,-2.77507e-08,1.02817,0.000461952,-2.50308e-07,-3.97101e-09,1.02863,0.000461439,-2.62221e-07,4.36348e-08,1.02909,0.000461046,-1.31317e-07,-5.13589e-08,1.02955,0.000460629,-2.85394e-07,4.25913e-08,1.03001,0.000460186,-1.5762e-07,2.0285e-10,1.03047,0.000459871,-1.57011e-07,-4.34027e-08,1.03093,0.000459427,-2.87219e-07,5.41987e-08,1.03139,0.000459015,-1.24623e-07,-5.4183e-08,1.03185,0.000458604,-2.87172e-07,4.33239e-08,1.03231,0.000458159,-1.572e-07,9.65817e-11,1.03277,0.000457845,-1.56911e-07,-4.37103e-08,1.03323,0.0004574,-2.88041e-07,5.55351e-08,1.03368,0.000456991,-1.21436e-07,-5.9221e-08,1.03414,0.00045657,-2.99099e-07,6.21394e-08,1.0346,0.000456158,-1.1268e-07,-7.01275e-08,1.03505,0.000455723,-3.23063e-07,9.91614e-08,1.03551,0.000455374,-2.55788e-08,-8.80996e-08,1.03596,0.000455058,-2.89878e-07,1.48184e-08,1.03642,0.000454523,-2.45422e-07,2.88258e-08,1.03687,0.000454119,-1.58945e-07,-1.09125e-08,1.03733,0.000453768,-1.91682e-07,1.48241e-08,1.03778,0.000453429,-1.4721e-07,-4.83838e-08,1.03823,0.00045299,-2.92361e-07,5.95019e-08,1.03869,0.000452584,-1.13856e-07,-7.04146e-08,1.03914,0.000452145,-3.25099e-07,1.02947e-07,1.03959,0.000451803,-1.62583e-08,-1.02955e-07,1.04004,0.000451462,-3.25123e-07,7.04544e-08,1.04049,0.000451023,-1.1376e-07,-5.96534e-08,1.04094,0.000450616,-2.9272e-07,4.89499e-08,1.04139,0.000450178,-1.45871e-07,-1.69369e-08,1.04184,0.000449835,-1.96681e-07,1.87977e-08,1.04229,0.000449498,-1.40288e-07,-5.82539e-08,1.04274,0.000449043,-3.1505e-07,9.50087e-08,1.04319,0.000448698,-3.00238e-08,-8.33623e-08,1.04364,0.000448388,-2.80111e-07,2.20363e-11,1.04409,0.000447828,-2.80045e-07,8.32742e-08,1.04454,0.000447517,-3.02221e-08,-9.47002e-08,1.04498,0.000447173,-3.14323e-07,5.7108e-08,1.04543,0.000446716,-1.42999e-07,-1.45225e-08,1.04588,0.000446386,-1.86566e-07,9.82022e-10,1.04632,0.000446016,-1.8362e-07,1.05944e-08,1.04677,0.00044568,-1.51837e-07,-4.33597e-08,1.04721,0.000445247,-2.81916e-07,4.36352e-08,1.04766,0.000444814,-1.51011e-07,-1.19717e-08,1.0481,0.000444476,-1.86926e-07,4.25158e-09,1.04855,0.000444115,-1.74171e-07,-5.03461e-09,1.04899,0.000443751,-1.89275e-07,1.58868e-08,1.04944,0.00044342,-1.41614e-07,-5.85127e-08,1.04988,0.000442961,-3.17152e-07,9.89548e-08,1.05032,0.000442624,-2.0288e-08,-9.88878e-08,1.05076,0.000442287,-3.16951e-07,5.81779e-08,1.05121,0.000441827,-1.42418e-07,-1.46144e-08,1.05165,0.000441499,-1.86261e-07,2.79892e-10,1.05209,0.000441127,-1.85421e-07,1.34949e-08,1.05253,0.000440797,-1.44937e-07,-5.42594e-08,1.05297,0.000440344,-3.07715e-07,8.43335e-08,1.05341,0.000439982,-5.47146e-08,-4.46558e-08,1.05385,0.000439738,-1.88682e-07,-2.49193e-08,1.05429,0.000439286,-2.6344e-07,2.5124e-08,1.05473,0.000438835,-1.88068e-07,4.36328e-08,1.05517,0.000438589,-5.71699e-08,-8.04459e-08,1.05561,0.000438234,-2.98508e-07,3.97324e-08,1.05605,0.000437756,-1.79311e-07,4.07258e-08,1.05648,0.000437519,-5.71332e-08,-8.34263e-08,1.05692,0.000437155,-3.07412e-07,5.45608e-08,1.05736,0.000436704,-1.4373e-07,-1.56078e-08,1.05779,0.000436369,-1.90553e-07,7.87043e-09,1.05823,0.000436012,-1.66942e-07,-1.58739e-08,1.05867,0.00043563,-2.14563e-07,5.56251e-08,1.0591,0.000435368,-4.76881e-08,-8.74172e-08,1.05954,0.000435011,-3.0994e-07,5.56251e-08,1.05997,0.000434558,-1.43064e-07,-1.58739e-08,1.06041,0.000434224,-1.90686e-07,7.87042e-09,1.06084,0.000433866,-1.67075e-07,-1.56078e-08,1.06127,0.000433485,-2.13898e-07,5.45609e-08,1.06171,0.000433221,-5.02157e-08,-8.34263e-08,1.06214,0.00043287,-3.00495e-07,4.07258e-08,1.06257,0.000432391,-1.78317e-07,3.97325e-08,1.063,0.000432154,-5.91198e-08,-8.04464e-08,1.06344,0.000431794,-3.00459e-07,4.36347e-08,1.06387,0.000431324,-1.69555e-07,2.5117e-08,1.0643,0.000431061,-9.42041e-08,-2.48934e-08,1.06473,0.000430798,-1.68884e-07,-4.47527e-08,1.06516,0.000430326,-3.03142e-07,8.46951e-08,1.06559,0.000429973,-4.90573e-08,-5.56089e-08,1.06602,0.000429708,-2.15884e-07,1.85314e-08,1.06645,0.000429332,-1.6029e-07,-1.85166e-08,1.06688,0.000428956,-2.1584e-07,5.5535e-08,1.06731,0.000428691,-4.92347e-08,-8.44142e-08,1.06774,0.000428339,-3.02477e-07,4.37032e-08,1.06816,0.000427865,-1.71368e-07,2.88107e-08,1.06859,0.000427609,-8.49356e-08,-3.97367e-08,1.06902,0.00042732,-2.04146e-07,1.09267e-08,1.06945,0.000426945,-1.71365e-07,-3.97023e-09,1.06987,0.00042659,-1.83276e-07,4.9542e-09,1.0703,0.000426238,-1.68414e-07,-1.58466e-08,1.07073,0.000425854,-2.15953e-07,5.84321e-08,1.07115,0.000425597,-4.0657e-08,-9.86725e-08,1.07158,0.00042522,-3.36674e-07,9.78392e-08,1.072,0.00042484,-4.31568e-08,-5.42658e-08,1.07243,0.000424591,-2.05954e-07,1.45377e-11,1.07285,0.000424179,-2.0591e-07,5.42076e-08,1.07328,0.00042393,-4.32877e-08,-9.76357e-08,1.0737,0.00042355,-3.36195e-07,9.79165e-08,1.07412,0.000423172,-4.24451e-08,-5.56118e-08,1.07455,0.00042292,-2.09281e-07,5.32143e-09,1.07497,0.000422518,-1.93316e-07,3.43261e-08,1.07539,0.000422234,-9.0338e-08,-2.34165e-08,1.07581,0.000421983,-1.60588e-07,-5.98692e-08,1.07623,0.000421482,-3.40195e-07,1.43684e-07,1.07666,0.000421233,9.08574e-08,-1.5724e-07,1.07708,0.000420943,-3.80862e-07,1.27647e-07,1.0775,0.000420564,2.0791e-09,-1.1493e-07,1.07792,0.000420223,-3.4271e-07,9.36534e-08,1.07834,0.000419819,-6.17499e-08,-2.12653e-08,1.07876,0.000419632,-1.25546e-07,-8.59219e-09,1.07918,0.000419355,-1.51322e-07,-6.35752e-08,1.0796,0.000418861,-3.42048e-07,1.43684e-07,1.08002,0.000418608,8.90034e-08,-1.53532e-07,1.08043,0.000418326,-3.71593e-07,1.12817e-07,1.08085,0.000417921,-3.31414e-08,-5.93184e-08,1.08127,0.000417677,-2.11097e-07,5.24697e-09,1.08169,0.00041727,-1.95356e-07,3.83305e-08,1.0821,0.000416995,-8.03642e-08,-3.93597e-08,1.08252,0.000416716,-1.98443e-07,-1.0094e-10,1.08294,0.000416319,-1.98746e-07,3.97635e-08,1.08335,0.00041604,-7.94557e-08,-3.97437e-08,1.08377,0.000415762,-1.98687e-07,1.94215e-12,1.08419,0.000415365,-1.98681e-07,3.97359e-08,1.0846,0.000415087,-7.94732e-08,-3.97362e-08,1.08502,0.000414809,-1.98682e-07,-4.31063e-13,1.08543,0.000414411,-1.98683e-07,3.97379e-08,1.08584,0.000414133,-7.94694e-08,-3.97418e-08,1.08626,0.000413855,-1.98695e-07,2.00563e-11,1.08667,0.000413458,-1.98635e-07,3.96616e-08,1.08709,0.000413179,-7.965e-08,-3.9457e-08,1.0875,0.000412902,-1.98021e-07,-1.04281e-09,1.08791,0.000412502,-2.01149e-07,4.36282e-08,1.08832,0.000412231,-7.02648e-08,-5.42608e-08,1.08874,0.000411928,-2.33047e-07,5.42057e-08,1.08915,0.000411624,-7.04301e-08,-4.33527e-08,1.08956,0.000411353,-2.00488e-07,-4.07378e-12,1.08997,0.000410952,-2.005e-07,4.3369e-08,1.09038,0.000410681,-7.03934e-08,-5.42627e-08,1.09079,0.000410378,-2.33182e-07,5.44726e-08,1.0912,0.000410075,-6.97637e-08,-4.44186e-08,1.09161,0.000409802,-2.03019e-07,3.99235e-09,1.09202,0.000409408,-1.91042e-07,2.84491e-08,1.09243,0.000409111,-1.05695e-07,1.42043e-09,1.09284,0.000408904,-1.01434e-07,-3.41308e-08,1.09325,0.000408599,-2.03826e-07,1.58937e-08,1.09366,0.000408239,-1.56145e-07,-2.94438e-08,1.09406,0.000407838,-2.44476e-07,1.01881e-07,1.09447,0.000407655,6.11676e-08,-1.39663e-07,1.09488,0.000407358,-3.57822e-07,9.91432e-08,1.09529,0.00040694,-6.03921e-08,-1.84912e-08,1.09569,0.000406764,-1.15866e-07,-2.51785e-08,1.0961,0.000406457,-1.91401e-07,-4.03115e-12,1.09651,0.000406074,-1.91413e-07,2.51947e-08,1.09691,0.000405767,-1.15829e-07,1.84346e-08,1.09732,0.00040559,-6.05254e-08,-9.89332e-08,1.09772,0.000405172,-3.57325e-07,1.3888e-07,1.09813,0.000404874,5.93136e-08,-9.8957e-08,1.09853,0.000404696,-2.37557e-07,1.853e-08,1.09894,0.000404277,-1.81968e-07,2.48372e-08,1.09934,0.000403987,-1.07456e-07,1.33047e-09,1.09975,0.000403776,-1.03465e-07,-3.01591e-08,1.10015,0.000403479,-1.93942e-07,9.66054e-11,1.10055,0.000403091,-1.93652e-07,2.97727e-08,1.10096,0.000402793,-1.04334e-07,2.19273e-11,1.10136,0.000402585,-1.04268e-07,-2.98604e-08,1.10176,0.000402287,-1.93849e-07,2.10325e-10,1.10216,0.0004019,-1.93218e-07,2.90191e-08,1.10256,0.0004016,-1.06161e-07,2.92264e-09,1.10297,0.000401397,-9.73931e-08,-4.07096e-08,1.10337,0.00040108,-2.19522e-07,4.07067e-08,1.10377,0.000400763,-9.7402e-08,-2.90783e-09,1.10417,0.000400559,-1.06126e-07,-2.90754e-08,1.10457,0.00040026,-1.93352e-07,9.00021e-14,1.10497,0.000399873,-1.93351e-07,2.9075e-08,1.10537,0.000399574,-1.06126e-07,2.90902e-09,1.10577,0.00039937,-9.73992e-08,-4.07111e-08,1.10617,0.000399053,-2.19533e-07,4.07262e-08,1.10657,0.000398736,-9.73541e-08,-2.98424e-09,1.10697,0.000398533,-1.06307e-07,-2.87892e-08,1.10736,0.000398234,-1.92674e-07,-1.06824e-09,1.10776,0.000397845,-1.95879e-07,3.30622e-08,1.10816,0.000397552,-9.66926e-08,-1.19712e-08,1.10856,0.000397323,-1.32606e-07,1.48225e-08,1.10895,0.000397102,-8.81387e-08,-4.73187e-08,1.10935,0.000396784,-2.30095e-07,5.52429e-08,1.10975,0.00039649,-6.4366e-08,-5.44437e-08,1.11014,0.000396198,-2.27697e-07,4.33226e-08,1.11054,0.000395872,-9.77293e-08,3.62656e-10,1.11094,0.000395678,-9.66414e-08,-4.47732e-08,1.11133,0.00039535,-2.30961e-07,5.95208e-08,1.11173,0.000395067,-5.23985e-08,-7.41008e-08,1.11212,0.00039474,-2.74701e-07,1.17673e-07,1.11252,0.000394543,7.83181e-08,-1.58172e-07,1.11291,0.000394225,-3.96199e-07,1.57389e-07,1.1133,0.000393905,7.59679e-08,-1.13756e-07,1.1137,0.000393716,-2.653e-07,5.92165e-08,1.11409,0.000393363,-8.76507e-08,-3.90074e-09,1.11449,0.000393176,-9.93529e-08,-4.36136e-08,1.11488,0.000392846,-2.30194e-07,5.91457e-08,1.11527,0.000392563,-5.27564e-08,-7.376e-08,1.11566,0.000392237,-2.74037e-07,1.16685e-07,1.11606,0.000392039,7.60189e-08,-1.54562e-07,1.11645,0.000391727,-3.87667e-07,1.43935e-07,1.11684,0.000391384,4.4137e-08,-6.35487e-08,1.11723,0.000391281,-1.46509e-07,-8.94896e-09,1.11762,0.000390961,-1.73356e-07,-1.98647e-08,1.11801,0.000390555,-2.3295e-07,8.8408e-08,1.1184,0.000390354,3.22736e-08,-9.53486e-08,1.11879,0.000390133,-2.53772e-07,5.45677e-08,1.11918,0.000389789,-9.0069e-08,-3.71296e-09,1.11957,0.000389598,-1.01208e-07,-3.97159e-08,1.11996,0.000389276,-2.20355e-07,4.33671e-08,1.12035,0.000388966,-9.02542e-08,-1.45431e-08,1.12074,0.000388741,-1.33883e-07,1.48052e-08,1.12113,0.000388518,-8.94678e-08,-4.46778e-08,1.12152,0.000388205,-2.23501e-07,4.46966e-08,1.12191,0.000387892,-8.94114e-08,-1.48992e-08,1.12229,0.000387669,-1.34109e-07,1.49003e-08,1.12268,0.000387445,-8.94082e-08,-4.47019e-08,1.12307,0.000387132,-2.23514e-07,4.4698e-08,1.12345,0.000386819,-8.942e-08,-1.48806e-08,1.12384,0.000386596,-1.34062e-07,1.48245e-08,1.12423,0.000386372,-8.95885e-08,-4.44172e-08,1.12461,0.00038606,-2.2284e-07,4.36351e-08,1.125,0.000385745,-9.19348e-08,-1.09139e-08,1.12539,0.000385528,-1.24677e-07,2.05584e-11,1.12577,0.000385279,-1.24615e-07,1.08317e-08,1.12616,0.000385062,-9.21198e-08,-4.33473e-08,1.12654,0.000384748,-2.22162e-07,4.33481e-08,1.12693,0.000384434,-9.21174e-08,-1.08356e-08,1.12731,0.000384217,-1.24624e-07,-5.50907e-12,1.12769,0.000383968,-1.24641e-07,1.08577e-08,1.12808,0.000383751,-9.20679e-08,-4.34252e-08,1.12846,0.000383437,-2.22343e-07,4.36337e-08,1.12884,0.000383123,-9.14422e-08,-1.19005e-08,1.12923,0.000382904,-1.27144e-07,3.96813e-09,1.12961,0.000382662,-1.15239e-07,-3.97207e-09,1.12999,0.000382419,-1.27155e-07,1.19201e-08,1.13038,0.000382201,-9.1395e-08,-4.37085e-08,1.13076,0.000381887,-2.2252e-07,4.37046e-08,1.13114,0.000381573,-9.14068e-08,-1.19005e-08,1.13152,0.000381355,-1.27108e-07,3.89734e-09,1.1319,0.000381112,-1.15416e-07,-3.68887e-09,1.13228,0.00038087,-1.26483e-07,1.08582e-08,1.13266,0.00038065,-9.39083e-08,-3.97438e-08,1.13304,0.000380343,-2.1314e-07,2.89076e-08,1.13342,0.000380003,-1.26417e-07,4.33225e-08,1.1338,0.00037988,3.55072e-09,-8.29883e-08,1.13418,0.000379638,-2.45414e-07,5.0212e-08,1.13456,0.000379298,-9.47781e-08,1.34964e-09,1.13494,0.000379113,-9.07292e-08,-5.56105e-08,1.13532,0.000378764,-2.57561e-07,1.01883e-07,1.1357,0.000378555,4.80889e-08,-1.13504e-07,1.13608,0.000378311,-2.92423e-07,1.13713e-07,1.13646,0.000378067,4.87176e-08,-1.02931e-07,1.13683,0.000377856,-2.60076e-07,5.95923e-08,1.13721,0.000377514,-8.12988e-08,-1.62288e-08,1.13759,0.000377303,-1.29985e-07,5.32278e-09,1.13797,0.000377059,-1.14017e-07,-5.06237e-09,1.13834,0.000376816,-1.29204e-07,1.49267e-08,1.13872,0.000376602,-8.44237e-08,-5.46444e-08,1.1391,0.000376269,-2.48357e-07,8.44417e-08,1.13947,0.000376026,4.96815e-09,-4.47039e-08,1.13985,0.000375902,-1.29143e-07,-2.48355e-08,1.14023,0.000375569,-2.0365e-07,2.48368e-08,1.1406,0.000375236,-1.2914e-07,4.46977e-08,1.14098,0.000375112,4.95341e-09,-8.44184e-08,1.14135,0.000374869,-2.48302e-07,5.45572e-08,1.14173,0.000374536,-8.463e-08,-1.46013e-08,1.1421,0.000374323,-1.28434e-07,3.8478e-09,1.14247,0.000374077,-1.1689e-07,-7.89941e-10,1.14285,0.000373841,-1.1926e-07,-6.88042e-10,1.14322,0.0003736,-1.21324e-07,3.54213e-09,1.1436,0.000373368,-1.10698e-07,-1.34805e-08,1.14397,0.000373107,-1.51139e-07,5.03798e-08,1.14434,0.000372767,0.,0.}; + + template + __device__ __forceinline__ void RGB2LuvConvert_f(const T& src, D& dst) + { + const float _d = 1.f / (0.950456f + 15 + 1.088754f * 3); + const float _un = 13 * (4 * 0.950456f * _d); + const float _vn = 13 * (9 * _d); + + float B = blueIdx == 0 ? src.x : src.z; + float G = src.y; + float R = blueIdx == 0 ? src.z : src.x; + + if (srgb) + { + B = splineInterpolate(B * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + G = splineInterpolate(G * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + R = splineInterpolate(R * GAMMA_TAB_SIZE, c_sRGBGammaTab, GAMMA_TAB_SIZE); + } + + float X = R * 0.412453f + G * 0.357580f + B * 0.180423f; + float Y = R * 0.212671f + G * 0.715160f + B * 0.072169f; + float Z = R * 0.019334f + G * 0.119193f + B * 0.950227f; + + float L = splineInterpolate(Y * (LAB_CBRT_TAB_SIZE / 1.5f), c_LabCbrtTab, LAB_CBRT_TAB_SIZE); + L = 116.f * L - 16.f; + + const float d = (4 * 13) / ::fmaxf(X + 15 * Y + 3 * Z, numeric_limits::epsilon()); + float u = L * (X * d - _un); + float v = L * ((9 * 0.25f) * Y * d - _vn); + + dst.x = L; + dst.y = u; + dst.z = v; + } + + template + __device__ __forceinline__ void RGB2LuvConvert_b(const T& src, D& dst) + { + float3 srcf, dstf; + + srcf.x = src.x * (1.f / 255.f); + srcf.y = src.y * (1.f / 255.f); + srcf.z = src.z * (1.f / 255.f); + + RGB2LuvConvert_f(srcf, dstf); + + dst.x = saturate_cast(dstf.x * 2.55f); + dst.y = saturate_cast(dstf.y * 0.72033898305084743f + 96.525423728813564f); + dst.z = saturate_cast(dstf.z * 0.9732824427480916f + 136.259541984732824f); + } + + template struct RGB2Luv; + template + struct RGB2Luv + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2LuvConvert_b(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2Luv() {} + __host__ __device__ __forceinline__ RGB2Luv(const RGB2Luv&) {} + }; + template + struct RGB2Luv + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + RGB2LuvConvert_f(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ RGB2Luv() {} + __host__ __device__ __forceinline__ RGB2Luv(const RGB2Luv&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_RGB2Luv_TRAITS(name, scn, dcn, srgb, blueIdx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::RGB2Luv functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + namespace color_detail + { + template + __device__ __forceinline__ void Luv2RGBConvert_f(const T& src, D& dst) + { + const float _d = 1.f / (0.950456f + 15 + 1.088754f * 3); + const float _un = 4 * 0.950456f * _d; + const float _vn = 9 * _d; + + float L = src.x; + float u = src.y; + float v = src.z; + + float Y = (L + 16.f) * (1.f / 116.f); + Y = Y * Y * Y; + + float d = (1.f / 13.f) / L; + u = u * d + _un; + v = v * d + _vn; + + float iv = 1.f / v; + float X = 2.25f * u * Y * iv; + float Z = (12 - 3 * u - 20 * v) * Y * 0.25f * iv; + + float B = 0.055648f * X - 0.204043f * Y + 1.057311f * Z; + float G = -0.969256f * X + 1.875991f * Y + 0.041556f * Z; + float R = 3.240479f * X - 1.537150f * Y - 0.498535f * Z; + + if (srgb) + { + B = splineInterpolate(B * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + G = splineInterpolate(G * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + R = splineInterpolate(R * GAMMA_TAB_SIZE, c_sRGBInvGammaTab, GAMMA_TAB_SIZE); + } + + dst.x = blueIdx == 0 ? B : R; + dst.y = G; + dst.z = blueIdx == 0 ? R : B; + setAlpha(dst, ColorChannel::max()); + } + + template + __device__ __forceinline__ void Luv2RGBConvert_b(const T& src, D& dst) + { + float3 srcf, dstf; + + srcf.x = src.x * (100.f / 255.f); + srcf.y = src.y * 1.388235294117647f - 134.f; + srcf.z = src.z * 1.027450980392157f - 140.f; + + Luv2RGBConvert_f(srcf, dstf); + + dst.x = saturate_cast(dstf.x * 255.f); + dst.y = saturate_cast(dstf.y * 255.f); + dst.z = saturate_cast(dstf.z * 255.f); + setAlpha(dst, ColorChannel::max()); + } + + template struct Luv2RGB; + template + struct Luv2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + Luv2RGBConvert_b(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ Luv2RGB() {} + __host__ __device__ __forceinline__ Luv2RGB(const Luv2RGB&) {} + }; + template + struct Luv2RGB + : unary_function::vec_type, typename TypeVec::vec_type> + { + __device__ __forceinline__ typename TypeVec::vec_type operator ()(const typename TypeVec::vec_type& src) const + { + typename TypeVec::vec_type dst; + + Luv2RGBConvert_f(src, dst); + + return dst; + } + __host__ __device__ __forceinline__ Luv2RGB() {} + __host__ __device__ __forceinline__ Luv2RGB(const Luv2RGB&) {} + }; + } + +#define OPENCV_CUDA_IMPLEMENT_Luv2RGB_TRAITS(name, scn, dcn, srgb, blueIdx) \ + template struct name ## _traits \ + { \ + typedef ::cv::cuda::device::color_detail::Luv2RGB functor_type; \ + static __host__ __device__ __forceinline__ functor_type create_functor() \ + { \ + return functor_type(); \ + } \ + }; + + #undef CV_DESCALE + +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_COLOR_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce.hpp new file mode 100644 index 0000000..8af20b0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce.hpp @@ -0,0 +1,365 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_REDUCE_DETAIL_HPP +#define OPENCV_CUDA_REDUCE_DETAIL_HPP + +#include +#include "../warp.hpp" +#include "../warp_shuffle.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + namespace reduce_detail + { + template struct GetType; + template struct GetType + { + typedef T type; + }; + template struct GetType + { + typedef T type; + }; + template struct GetType + { + typedef T type; + }; + + template + struct For + { + template + static __device__ void loadToSmem(const PointerTuple& smem, const ValTuple& val, unsigned int tid) + { + thrust::get(smem)[tid] = thrust::get(val); + + For::loadToSmem(smem, val, tid); + } + template + static __device__ void loadFromSmem(const PointerTuple& smem, const ValTuple& val, unsigned int tid) + { + thrust::get(val) = thrust::get(smem)[tid]; + + For::loadFromSmem(smem, val, tid); + } + + template + static __device__ void merge(const PointerTuple& smem, const ValTuple& val, unsigned int tid, unsigned int delta, const OpTuple& op) + { + typename GetType::type>::type reg = thrust::get(smem)[tid + delta]; + thrust::get(smem)[tid] = thrust::get(val) = thrust::get(op)(thrust::get(val), reg); + + For::merge(smem, val, tid, delta, op); + } + template + static __device__ void mergeShfl(const ValTuple& val, unsigned int delta, unsigned int width, const OpTuple& op) + { + typename GetType::type>::type reg = shfl_down(thrust::get(val), delta, width); + thrust::get(val) = thrust::get(op)(thrust::get(val), reg); + + For::mergeShfl(val, delta, width, op); + } + }; + template + struct For + { + template + static __device__ void loadToSmem(const PointerTuple&, const ValTuple&, unsigned int) + { + } + template + static __device__ void loadFromSmem(const PointerTuple&, const ValTuple&, unsigned int) + { + } + + template + static __device__ void merge(const PointerTuple&, const ValTuple&, unsigned int, unsigned int, const OpTuple&) + { + } + template + static __device__ void mergeShfl(const ValTuple&, unsigned int, unsigned int, const OpTuple&) + { + } + }; + + template + __device__ __forceinline__ void loadToSmem(volatile T* smem, T& val, unsigned int tid) + { + smem[tid] = val; + } + template + __device__ __forceinline__ void loadFromSmem(volatile T* smem, T& val, unsigned int tid) + { + val = smem[tid]; + } + template + __device__ __forceinline__ void loadToSmem(const thrust::tuple& smem, + const thrust::tuple& val, + unsigned int tid) + { + For<0, thrust::tuple_size >::value>::loadToSmem(smem, val, tid); + } + template + __device__ __forceinline__ void loadFromSmem(const thrust::tuple& smem, + const thrust::tuple& val, + unsigned int tid) + { + For<0, thrust::tuple_size >::value>::loadFromSmem(smem, val, tid); + } + + template + __device__ __forceinline__ void merge(volatile T* smem, T& val, unsigned int tid, unsigned int delta, const Op& op) + { + T reg = smem[tid + delta]; + smem[tid] = val = op(val, reg); + } + template + __device__ __forceinline__ void mergeShfl(T& val, unsigned int delta, unsigned int width, const Op& op) + { + T reg = shfl_down(val, delta, width); + val = op(val, reg); + } + template + __device__ __forceinline__ void merge(const thrust::tuple& smem, + const thrust::tuple& val, + unsigned int tid, + unsigned int delta, + const thrust::tuple& op) + { + For<0, thrust::tuple_size >::value>::merge(smem, val, tid, delta, op); + } + template + __device__ __forceinline__ void mergeShfl(const thrust::tuple& val, + unsigned int delta, + unsigned int width, + const thrust::tuple& op) + { + For<0, thrust::tuple_size >::value>::mergeShfl(val, delta, width, op); + } + + template struct Generic + { + template + static __device__ void reduce(Pointer smem, Reference val, unsigned int tid, Op op) + { + loadToSmem(smem, val, tid); + if (N >= 32) + __syncthreads(); + + if (N >= 2048) + { + if (tid < 1024) + merge(smem, val, tid, 1024, op); + + __syncthreads(); + } + if (N >= 1024) + { + if (tid < 512) + merge(smem, val, tid, 512, op); + + __syncthreads(); + } + if (N >= 512) + { + if (tid < 256) + merge(smem, val, tid, 256, op); + + __syncthreads(); + } + if (N >= 256) + { + if (tid < 128) + merge(smem, val, tid, 128, op); + + __syncthreads(); + } + if (N >= 128) + { + if (tid < 64) + merge(smem, val, tid, 64, op); + + __syncthreads(); + } + if (N >= 64) + { + if (tid < 32) + merge(smem, val, tid, 32, op); + } + + if (tid < 16) + { + merge(smem, val, tid, 16, op); + merge(smem, val, tid, 8, op); + merge(smem, val, tid, 4, op); + merge(smem, val, tid, 2, op); + merge(smem, val, tid, 1, op); + } + } + }; + + template + struct Unroll + { + static __device__ void loopShfl(Reference val, Op op, unsigned int N) + { + mergeShfl(val, I, N, op); + Unroll::loopShfl(val, op, N); + } + static __device__ void loop(Pointer smem, Reference val, unsigned int tid, Op op) + { + merge(smem, val, tid, I, op); + Unroll::loop(smem, val, tid, op); + } + }; + template + struct Unroll<0, Pointer, Reference, Op> + { + static __device__ void loopShfl(Reference, Op, unsigned int) + { + } + static __device__ void loop(Pointer, Reference, unsigned int, Op) + { + } + }; + + template struct WarpOptimized + { + template + static __device__ void reduce(Pointer smem, Reference val, unsigned int tid, Op op) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + CV_UNUSED(smem); + CV_UNUSED(tid); + + Unroll::loopShfl(val, op, N); + #else + loadToSmem(smem, val, tid); + + if (tid < N / 2) + Unroll::loop(smem, val, tid, op); + #endif + } + }; + + template struct GenericOptimized32 + { + enum { M = N / 32 }; + + template + static __device__ void reduce(Pointer smem, Reference val, unsigned int tid, Op op) + { + const unsigned int laneId = Warp::laneId(); + + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + Unroll<16, Pointer, Reference, Op>::loopShfl(val, op, warpSize); + + if (laneId == 0) + loadToSmem(smem, val, tid / 32); + #else + loadToSmem(smem, val, tid); + + if (laneId < 16) + Unroll<16, Pointer, Reference, Op>::loop(smem, val, tid, op); + + __syncthreads(); + + if (laneId == 0) + loadToSmem(smem, val, tid / 32); + #endif + + __syncthreads(); + + loadFromSmem(smem, val, tid); + + if (tid < 32) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + Unroll::loopShfl(val, op, M); + #else + Unroll::loop(smem, val, tid, op); + #endif + } + } + }; + + template struct StaticIf; + template struct StaticIf + { + typedef T1 type; + }; + template struct StaticIf + { + typedef T2 type; + }; + + template struct IsPowerOf2 + { + enum { value = ((N != 0) && !(N & (N - 1))) }; + }; + + template struct Dispatcher + { + typedef typename StaticIf< + (N <= 32) && IsPowerOf2::value, + WarpOptimized, + typename StaticIf< + (N <= 1024) && IsPowerOf2::value, + GenericOptimized32, + Generic + >::type + >::type reductor; + }; + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_REDUCE_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce_key_val.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce_key_val.hpp new file mode 100644 index 0000000..df37c17 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/reduce_key_val.hpp @@ -0,0 +1,502 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_PRED_VAL_REDUCE_DETAIL_HPP +#define OPENCV_CUDA_PRED_VAL_REDUCE_DETAIL_HPP + +#include +#include "../warp.hpp" +#include "../warp_shuffle.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + namespace reduce_key_val_detail + { + template struct GetType; + template struct GetType + { + typedef T type; + }; + template struct GetType + { + typedef T type; + }; + template struct GetType + { + typedef T type; + }; + + template + struct For + { + template + static __device__ void loadToSmem(const PointerTuple& smem, const ReferenceTuple& data, unsigned int tid) + { + thrust::get(smem)[tid] = thrust::get(data); + + For::loadToSmem(smem, data, tid); + } + template + static __device__ void loadFromSmem(const PointerTuple& smem, const ReferenceTuple& data, unsigned int tid) + { + thrust::get(data) = thrust::get(smem)[tid]; + + For::loadFromSmem(smem, data, tid); + } + + template + static __device__ void copyShfl(const ReferenceTuple& val, unsigned int delta, int width) + { + thrust::get(val) = shfl_down(thrust::get(val), delta, width); + + For::copyShfl(val, delta, width); + } + template + static __device__ void copy(const PointerTuple& svals, const ReferenceTuple& val, unsigned int tid, unsigned int delta) + { + thrust::get(svals)[tid] = thrust::get(val) = thrust::get(svals)[tid + delta]; + + For::copy(svals, val, tid, delta); + } + + template + static __device__ void mergeShfl(const KeyReferenceTuple& key, const ValReferenceTuple& val, const CmpTuple& cmp, unsigned int delta, int width) + { + typename GetType::type>::type reg = shfl_down(thrust::get(key), delta, width); + + if (thrust::get(cmp)(reg, thrust::get(key))) + { + thrust::get(key) = reg; + thrust::get(val) = shfl_down(thrust::get(val), delta, width); + } + + For::mergeShfl(key, val, cmp, delta, width); + } + template + static __device__ void merge(const KeyPointerTuple& skeys, const KeyReferenceTuple& key, + const ValPointerTuple& svals, const ValReferenceTuple& val, + const CmpTuple& cmp, + unsigned int tid, unsigned int delta) + { + typename GetType::type>::type reg = thrust::get(skeys)[tid + delta]; + + if (thrust::get(cmp)(reg, thrust::get(key))) + { + thrust::get(skeys)[tid] = thrust::get(key) = reg; + thrust::get(svals)[tid] = thrust::get(val) = thrust::get(svals)[tid + delta]; + } + + For::merge(skeys, key, svals, val, cmp, tid, delta); + } + }; + template + struct For + { + template + static __device__ void loadToSmem(const PointerTuple&, const ReferenceTuple&, unsigned int) + { + } + template + static __device__ void loadFromSmem(const PointerTuple&, const ReferenceTuple&, unsigned int) + { + } + + template + static __device__ void copyShfl(const ReferenceTuple&, unsigned int, int) + { + } + template + static __device__ void copy(const PointerTuple&, const ReferenceTuple&, unsigned int, unsigned int) + { + } + + template + static __device__ void mergeShfl(const KeyReferenceTuple&, const ValReferenceTuple&, const CmpTuple&, unsigned int, int) + { + } + template + static __device__ void merge(const KeyPointerTuple&, const KeyReferenceTuple&, + const ValPointerTuple&, const ValReferenceTuple&, + const CmpTuple&, + unsigned int, unsigned int) + { + } + }; + + ////////////////////////////////////////////////////// + // loadToSmem + + template + __device__ __forceinline__ void loadToSmem(volatile T* smem, T& data, unsigned int tid) + { + smem[tid] = data; + } + template + __device__ __forceinline__ void loadFromSmem(volatile T* smem, T& data, unsigned int tid) + { + data = smem[tid]; + } + template + __device__ __forceinline__ void loadToSmem(const thrust::tuple& smem, + const thrust::tuple& data, + unsigned int tid) + { + For<0, thrust::tuple_size >::value>::loadToSmem(smem, data, tid); + } + template + __device__ __forceinline__ void loadFromSmem(const thrust::tuple& smem, + const thrust::tuple& data, + unsigned int tid) + { + For<0, thrust::tuple_size >::value>::loadFromSmem(smem, data, tid); + } + + ////////////////////////////////////////////////////// + // copyVals + + template + __device__ __forceinline__ void copyValsShfl(V& val, unsigned int delta, int width) + { + val = shfl_down(val, delta, width); + } + template + __device__ __forceinline__ void copyVals(volatile V* svals, V& val, unsigned int tid, unsigned int delta) + { + svals[tid] = val = svals[tid + delta]; + } + template + __device__ __forceinline__ void copyValsShfl(const thrust::tuple& val, + unsigned int delta, + int width) + { + For<0, thrust::tuple_size >::value>::copyShfl(val, delta, width); + } + template + __device__ __forceinline__ void copyVals(const thrust::tuple& svals, + const thrust::tuple& val, + unsigned int tid, unsigned int delta) + { + For<0, thrust::tuple_size >::value>::copy(svals, val, tid, delta); + } + + ////////////////////////////////////////////////////// + // merge + + template + __device__ __forceinline__ void mergeShfl(K& key, V& val, const Cmp& cmp, unsigned int delta, int width) + { + K reg = shfl_down(key, delta, width); + + if (cmp(reg, key)) + { + key = reg; + copyValsShfl(val, delta, width); + } + } + template + __device__ __forceinline__ void merge(volatile K* skeys, K& key, volatile V* svals, V& val, const Cmp& cmp, unsigned int tid, unsigned int delta) + { + K reg = skeys[tid + delta]; + + if (cmp(reg, key)) + { + skeys[tid] = key = reg; + copyVals(svals, val, tid, delta); + } + } + template + __device__ __forceinline__ void mergeShfl(K& key, + const thrust::tuple& val, + const Cmp& cmp, + unsigned int delta, int width) + { + K reg = shfl_down(key, delta, width); + + if (cmp(reg, key)) + { + key = reg; + copyValsShfl(val, delta, width); + } + } + template + __device__ __forceinline__ void merge(volatile K* skeys, K& key, + const thrust::tuple& svals, + const thrust::tuple& val, + const Cmp& cmp, unsigned int tid, unsigned int delta) + { + K reg = skeys[tid + delta]; + + if (cmp(reg, key)) + { + skeys[tid] = key = reg; + copyVals(svals, val, tid, delta); + } + } + template + __device__ __forceinline__ void mergeShfl(const thrust::tuple& key, + const thrust::tuple& val, + const thrust::tuple& cmp, + unsigned int delta, int width) + { + For<0, thrust::tuple_size >::value>::mergeShfl(key, val, cmp, delta, width); + } + template + __device__ __forceinline__ void merge(const thrust::tuple& skeys, + const thrust::tuple& key, + const thrust::tuple& svals, + const thrust::tuple& val, + const thrust::tuple& cmp, + unsigned int tid, unsigned int delta) + { + For<0, thrust::tuple_size >::value>::merge(skeys, key, svals, val, cmp, tid, delta); + } + + ////////////////////////////////////////////////////// + // Generic + + template struct Generic + { + template + static __device__ void reduce(KP skeys, KR key, VP svals, VR val, unsigned int tid, Cmp cmp) + { + loadToSmem(skeys, key, tid); + loadValsToSmem(svals, val, tid); + if (N >= 32) + __syncthreads(); + + if (N >= 2048) + { + if (tid < 1024) + merge(skeys, key, svals, val, cmp, tid, 1024); + + __syncthreads(); + } + if (N >= 1024) + { + if (tid < 512) + merge(skeys, key, svals, val, cmp, tid, 512); + + __syncthreads(); + } + if (N >= 512) + { + if (tid < 256) + merge(skeys, key, svals, val, cmp, tid, 256); + + __syncthreads(); + } + if (N >= 256) + { + if (tid < 128) + merge(skeys, key, svals, val, cmp, tid, 128); + + __syncthreads(); + } + if (N >= 128) + { + if (tid < 64) + merge(skeys, key, svals, val, cmp, tid, 64); + + __syncthreads(); + } + if (N >= 64) + { + if (tid < 32) + merge(skeys, key, svals, val, cmp, tid, 32); + } + + if (tid < 16) + { + merge(skeys, key, svals, val, cmp, tid, 16); + merge(skeys, key, svals, val, cmp, tid, 8); + merge(skeys, key, svals, val, cmp, tid, 4); + merge(skeys, key, svals, val, cmp, tid, 2); + merge(skeys, key, svals, val, cmp, tid, 1); + } + } + }; + + template + struct Unroll + { + static __device__ void loopShfl(KR key, VR val, Cmp cmp, unsigned int N) + { + mergeShfl(key, val, cmp, I, N); + Unroll::loopShfl(key, val, cmp, N); + } + static __device__ void loop(KP skeys, KR key, VP svals, VR val, unsigned int tid, Cmp cmp) + { + merge(skeys, key, svals, val, cmp, tid, I); + Unroll::loop(skeys, key, svals, val, tid, cmp); + } + }; + template + struct Unroll<0, KP, KR, VP, VR, Cmp> + { + static __device__ void loopShfl(KR, VR, Cmp, unsigned int) + { + } + static __device__ void loop(KP, KR, VP, VR, unsigned int, Cmp) + { + } + }; + + template struct WarpOptimized + { + template + static __device__ void reduce(KP skeys, KR key, VP svals, VR val, unsigned int tid, Cmp cmp) + { + #if 0 // __CUDA_ARCH__ >= 300 + CV_UNUSED(skeys); + CV_UNUSED(svals); + CV_UNUSED(tid); + + Unroll::loopShfl(key, val, cmp, N); + #else + loadToSmem(skeys, key, tid); + loadToSmem(svals, val, tid); + + if (tid < N / 2) + Unroll::loop(skeys, key, svals, val, tid, cmp); + #endif + } + }; + + template struct GenericOptimized32 + { + enum { M = N / 32 }; + + template + static __device__ void reduce(KP skeys, KR key, VP svals, VR val, unsigned int tid, Cmp cmp) + { + const unsigned int laneId = Warp::laneId(); + + #if 0 // __CUDA_ARCH__ >= 300 + Unroll<16, KP, KR, VP, VR, Cmp>::loopShfl(key, val, cmp, warpSize); + + if (laneId == 0) + { + loadToSmem(skeys, key, tid / 32); + loadToSmem(svals, val, tid / 32); + } + #else + loadToSmem(skeys, key, tid); + loadToSmem(svals, val, tid); + + if (laneId < 16) + Unroll<16, KP, KR, VP, VR, Cmp>::loop(skeys, key, svals, val, tid, cmp); + + __syncthreads(); + + if (laneId == 0) + { + loadToSmem(skeys, key, tid / 32); + loadToSmem(svals, val, tid / 32); + } + #endif + + __syncthreads(); + + loadFromSmem(skeys, key, tid); + + if (tid < 32) + { + #if 0 // __CUDA_ARCH__ >= 300 + loadFromSmem(svals, val, tid); + + Unroll::loopShfl(key, val, cmp, M); + #else + Unroll::loop(skeys, key, svals, val, tid, cmp); + #endif + } + } + }; + + template struct StaticIf; + template struct StaticIf + { + typedef T1 type; + }; + template struct StaticIf + { + typedef T2 type; + }; + + template struct IsPowerOf2 + { + enum { value = ((N != 0) && !(N & (N - 1))) }; + }; + + template struct Dispatcher + { + typedef typename StaticIf< + (N <= 32) && IsPowerOf2::value, + WarpOptimized, + typename StaticIf< + (N <= 1024) && IsPowerOf2::value, + GenericOptimized32, + Generic + >::type + >::type reductor; + }; + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_PRED_VAL_REDUCE_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/transform_detail.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/transform_detail.hpp new file mode 100644 index 0000000..1919848 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/transform_detail.hpp @@ -0,0 +1,392 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_TRANSFORM_DETAIL_HPP +#define OPENCV_CUDA_TRANSFORM_DETAIL_HPP + +#include "../common.hpp" +#include "../vec_traits.hpp" +#include "../functional.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + namespace transform_detail + { + //! Read Write Traits + + template struct UnaryReadWriteTraits + { + typedef typename TypeVec::vec_type read_type; + typedef typename TypeVec::vec_type write_type; + }; + + template struct BinaryReadWriteTraits + { + typedef typename TypeVec::vec_type read_type1; + typedef typename TypeVec::vec_type read_type2; + typedef typename TypeVec::vec_type write_type; + }; + + //! Transform kernels + + template struct OpUnroller; + template <> struct OpUnroller<1> + { + template + static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src.x); + } + + template + static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src1.x, src2.x); + } + }; + template <> struct OpUnroller<2> + { + template + static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, UnOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src.y); + } + + template + static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, BinOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src1.x, src2.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src1.y, src2.y); + } + }; + template <> struct OpUnroller<3> + { + template + static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, const UnOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src.y); + if (mask(y, x_shifted + 2)) + dst.z = op(src.z); + } + + template + static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, const BinOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src1.x, src2.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src1.y, src2.y); + if (mask(y, x_shifted + 2)) + dst.z = op(src1.z, src2.z); + } + }; + template <> struct OpUnroller<4> + { + template + static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, const UnOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src.y); + if (mask(y, x_shifted + 2)) + dst.z = op(src.z); + if (mask(y, x_shifted + 3)) + dst.w = op(src.w); + } + + template + static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, const BinOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.x = op(src1.x, src2.x); + if (mask(y, x_shifted + 1)) + dst.y = op(src1.y, src2.y); + if (mask(y, x_shifted + 2)) + dst.z = op(src1.z, src2.z); + if (mask(y, x_shifted + 3)) + dst.w = op(src1.w, src2.w); + } + }; + template <> struct OpUnroller<8> + { + template + static __device__ __forceinline__ void unroll(const T& src, D& dst, const Mask& mask, const UnOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.a0 = op(src.a0); + if (mask(y, x_shifted + 1)) + dst.a1 = op(src.a1); + if (mask(y, x_shifted + 2)) + dst.a2 = op(src.a2); + if (mask(y, x_shifted + 3)) + dst.a3 = op(src.a3); + if (mask(y, x_shifted + 4)) + dst.a4 = op(src.a4); + if (mask(y, x_shifted + 5)) + dst.a5 = op(src.a5); + if (mask(y, x_shifted + 6)) + dst.a6 = op(src.a6); + if (mask(y, x_shifted + 7)) + dst.a7 = op(src.a7); + } + + template + static __device__ __forceinline__ void unroll(const T1& src1, const T2& src2, D& dst, const Mask& mask, const BinOp& op, int x_shifted, int y) + { + if (mask(y, x_shifted)) + dst.a0 = op(src1.a0, src2.a0); + if (mask(y, x_shifted + 1)) + dst.a1 = op(src1.a1, src2.a1); + if (mask(y, x_shifted + 2)) + dst.a2 = op(src1.a2, src2.a2); + if (mask(y, x_shifted + 3)) + dst.a3 = op(src1.a3, src2.a3); + if (mask(y, x_shifted + 4)) + dst.a4 = op(src1.a4, src2.a4); + if (mask(y, x_shifted + 5)) + dst.a5 = op(src1.a5, src2.a5); + if (mask(y, x_shifted + 6)) + dst.a6 = op(src1.a6, src2.a6); + if (mask(y, x_shifted + 7)) + dst.a7 = op(src1.a7, src2.a7); + } + }; + + template + static __global__ void transformSmart(const PtrStepSz src_, PtrStep dst_, const Mask mask, const UnOp op) + { + typedef TransformFunctorTraits ft; + typedef typename UnaryReadWriteTraits::read_type read_type; + typedef typename UnaryReadWriteTraits::write_type write_type; + + const int x = threadIdx.x + blockIdx.x * blockDim.x; + const int y = threadIdx.y + blockIdx.y * blockDim.y; + const int x_shifted = x * ft::smart_shift; + + if (y < src_.rows) + { + const T* src = src_.ptr(y); + D* dst = dst_.ptr(y); + + if (x_shifted + ft::smart_shift - 1 < src_.cols) + { + const read_type src_n_el = ((const read_type*)src)[x]; + OpUnroller::unroll(src_n_el, ((write_type*)dst)[x], mask, op, x_shifted, y); + } + else + { + for (int real_x = x_shifted; real_x < src_.cols; ++real_x) + { + if (mask(y, real_x)) + dst[real_x] = op(src[real_x]); + } + } + } + } + + template + __global__ static void transformSimple(const PtrStepSz src, PtrStep dst, const Mask mask, const UnOp op) + { + const int x = blockDim.x * blockIdx.x + threadIdx.x; + const int y = blockDim.y * blockIdx.y + threadIdx.y; + + if (x < src.cols && y < src.rows && mask(y, x)) + { + dst.ptr(y)[x] = op(src.ptr(y)[x]); + } + } + + template + static __global__ void transformSmart(const PtrStepSz src1_, const PtrStep src2_, PtrStep dst_, + const Mask mask, const BinOp op) + { + typedef TransformFunctorTraits ft; + typedef typename BinaryReadWriteTraits::read_type1 read_type1; + typedef typename BinaryReadWriteTraits::read_type2 read_type2; + typedef typename BinaryReadWriteTraits::write_type write_type; + + const int x = threadIdx.x + blockIdx.x * blockDim.x; + const int y = threadIdx.y + blockIdx.y * blockDim.y; + const int x_shifted = x * ft::smart_shift; + + if (y < src1_.rows) + { + const T1* src1 = src1_.ptr(y); + const T2* src2 = src2_.ptr(y); + D* dst = dst_.ptr(y); + + if (x_shifted + ft::smart_shift - 1 < src1_.cols) + { + const read_type1 src1_n_el = ((const read_type1*)src1)[x]; + const read_type2 src2_n_el = ((const read_type2*)src2)[x]; + + OpUnroller::unroll(src1_n_el, src2_n_el, ((write_type*)dst)[x], mask, op, x_shifted, y); + } + else + { + for (int real_x = x_shifted; real_x < src1_.cols; ++real_x) + { + if (mask(y, real_x)) + dst[real_x] = op(src1[real_x], src2[real_x]); + } + } + } + } + + template + static __global__ void transformSimple(const PtrStepSz src1, const PtrStep src2, PtrStep dst, + const Mask mask, const BinOp op) + { + const int x = blockDim.x * blockIdx.x + threadIdx.x; + const int y = blockDim.y * blockIdx.y + threadIdx.y; + + if (x < src1.cols && y < src1.rows && mask(y, x)) + { + const T1 src1_data = src1.ptr(y)[x]; + const T2 src2_data = src2.ptr(y)[x]; + dst.ptr(y)[x] = op(src1_data, src2_data); + } + } + + template struct TransformDispatcher; + template<> struct TransformDispatcher + { + template + static void call(PtrStepSz src, PtrStepSz dst, UnOp op, Mask mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + + const dim3 threads(ft::simple_block_dim_x, ft::simple_block_dim_y, 1); + const dim3 grid(divUp(src.cols, threads.x), divUp(src.rows, threads.y), 1); + + transformSimple<<>>(src, dst, mask, op); + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + + template + static void call(PtrStepSz src1, PtrStepSz src2, PtrStepSz dst, BinOp op, Mask mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + + const dim3 threads(ft::simple_block_dim_x, ft::simple_block_dim_y, 1); + const dim3 grid(divUp(src1.cols, threads.x), divUp(src1.rows, threads.y), 1); + + transformSimple<<>>(src1, src2, dst, mask, op); + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + }; + template<> struct TransformDispatcher + { + template + static void call(PtrStepSz src, PtrStepSz dst, UnOp op, Mask mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + + CV_StaticAssert(ft::smart_shift != 1, ""); + + if (!isAligned(src.data, ft::smart_shift * sizeof(T)) || !isAligned(src.step, ft::smart_shift * sizeof(T)) || + !isAligned(dst.data, ft::smart_shift * sizeof(D)) || !isAligned(dst.step, ft::smart_shift * sizeof(D))) + { + TransformDispatcher::call(src, dst, op, mask, stream); + return; + } + + const dim3 threads(ft::smart_block_dim_x, ft::smart_block_dim_y, 1); + const dim3 grid(divUp(src.cols, threads.x * ft::smart_shift), divUp(src.rows, threads.y), 1); + + transformSmart<<>>(src, dst, mask, op); + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + + template + static void call(PtrStepSz src1, PtrStepSz src2, PtrStepSz dst, BinOp op, Mask mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + + CV_StaticAssert(ft::smart_shift != 1, ""); + + if (!isAligned(src1.data, ft::smart_shift * sizeof(T1)) || !isAligned(src1.step, ft::smart_shift * sizeof(T1)) || + !isAligned(src2.data, ft::smart_shift * sizeof(T2)) || !isAligned(src2.step, ft::smart_shift * sizeof(T2)) || + !isAligned(dst.data, ft::smart_shift * sizeof(D)) || !isAligned(dst.step, ft::smart_shift * sizeof(D))) + { + TransformDispatcher::call(src1, src2, dst, op, mask, stream); + return; + } + + const dim3 threads(ft::smart_block_dim_x, ft::smart_block_dim_y, 1); + const dim3 grid(divUp(src1.cols, threads.x * ft::smart_shift), divUp(src1.rows, threads.y), 1); + + transformSmart<<>>(src1, src2, dst, mask, op); + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + }; + } // namespace transform_detail +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_TRANSFORM_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/type_traits_detail.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/type_traits_detail.hpp new file mode 100644 index 0000000..a78bd2c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/type_traits_detail.hpp @@ -0,0 +1,191 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_TYPE_TRAITS_DETAIL_HPP +#define OPENCV_CUDA_TYPE_TRAITS_DETAIL_HPP + +#include "../common.hpp" +#include "../vec_traits.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + namespace type_traits_detail + { + template struct Select { typedef T1 type; }; + template struct Select { typedef T2 type; }; + + template struct IsSignedIntergral { enum {value = 0}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + template <> struct IsSignedIntergral { enum {value = 1}; }; + + template struct IsUnsignedIntegral { enum {value = 0}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + template <> struct IsUnsignedIntegral { enum {value = 1}; }; + + template struct IsIntegral { enum {value = IsSignedIntergral::value || IsUnsignedIntegral::value}; }; + template <> struct IsIntegral { enum {value = 1}; }; + template <> struct IsIntegral { enum {value = 1}; }; + + template struct IsFloat { enum {value = 0}; }; + template <> struct IsFloat { enum {value = 1}; }; + template <> struct IsFloat { enum {value = 1}; }; + + template struct IsVec { enum {value = 0}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + template <> struct IsVec { enum {value = 1}; }; + + template struct AddParameterType { typedef const U& type; }; + template struct AddParameterType { typedef U& type; }; + template <> struct AddParameterType { typedef void type; }; + + template struct ReferenceTraits + { + enum { value = false }; + typedef U type; + }; + template struct ReferenceTraits + { + enum { value = true }; + typedef U type; + }; + + template struct PointerTraits + { + enum { value = false }; + typedef void type; + }; + template struct PointerTraits + { + enum { value = true }; + typedef U type; + }; + template struct PointerTraits + { + enum { value = true }; + typedef U type; + }; + + template struct UnConst + { + typedef U type; + enum { value = 0 }; + }; + template struct UnConst + { + typedef U type; + enum { value = 1 }; + }; + template struct UnConst + { + typedef U& type; + enum { value = 1 }; + }; + + template struct UnVolatile + { + typedef U type; + enum { value = 0 }; + }; + template struct UnVolatile + { + typedef U type; + enum { value = 1 }; + }; + template struct UnVolatile + { + typedef U& type; + enum { value = 1 }; + }; + } // namespace type_traits_detail +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_TYPE_TRAITS_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/detail/vec_distance_detail.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/vec_distance_detail.hpp new file mode 100644 index 0000000..8283a99 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/detail/vec_distance_detail.hpp @@ -0,0 +1,121 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_VEC_DISTANCE_DETAIL_HPP +#define OPENCV_CUDA_VEC_DISTANCE_DETAIL_HPP + +#include "../datamov_utils.hpp" + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + namespace vec_distance_detail + { + template struct UnrollVecDiffCached + { + template + static __device__ void calcCheck(const T1* vecCached, const T2* vecGlob, int len, Dist& dist, int ind) + { + if (ind < len) + { + T1 val1 = *vecCached++; + + T2 val2; + ForceGlob::Load(vecGlob, ind, val2); + + dist.reduceIter(val1, val2); + + UnrollVecDiffCached::calcCheck(vecCached, vecGlob, len, dist, ind + THREAD_DIM); + } + } + + template + static __device__ void calcWithoutCheck(const T1* vecCached, const T2* vecGlob, Dist& dist) + { + T1 val1 = *vecCached++; + + T2 val2; + ForceGlob::Load(vecGlob, 0, val2); + vecGlob += THREAD_DIM; + + dist.reduceIter(val1, val2); + + UnrollVecDiffCached::calcWithoutCheck(vecCached, vecGlob, dist); + } + }; + template struct UnrollVecDiffCached + { + template + static __device__ __forceinline__ void calcCheck(const T1*, const T2*, int, Dist&, int) + { + } + + template + static __device__ __forceinline__ void calcWithoutCheck(const T1*, const T2*, Dist&) + { + } + }; + + template struct VecDiffCachedCalculator; + template struct VecDiffCachedCalculator + { + template + static __device__ __forceinline__ void calc(const T1* vecCached, const T2* vecGlob, int len, Dist& dist, int tid) + { + UnrollVecDiffCached::calcCheck(vecCached, vecGlob, len, dist, tid); + } + }; + template struct VecDiffCachedCalculator + { + template + static __device__ __forceinline__ void calc(const T1* vecCached, const T2* vecGlob, int len, Dist& dist, int tid) + { + UnrollVecDiffCached::calcWithoutCheck(vecCached, vecGlob + tid, dist); + } + }; + } // namespace vec_distance_detail +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_VEC_DISTANCE_DETAIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/dynamic_smem.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/dynamic_smem.hpp new file mode 100644 index 0000000..42570c6 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/dynamic_smem.hpp @@ -0,0 +1,88 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_DYNAMIC_SMEM_HPP +#define OPENCV_CUDA_DYNAMIC_SMEM_HPP + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template struct DynamicSharedMem + { + __device__ __forceinline__ operator T*() + { + extern __shared__ int __smem[]; + return (T*)__smem; + } + + __device__ __forceinline__ operator const T*() const + { + extern __shared__ int __smem[]; + return (T*)__smem; + } + }; + + // specialize for double to avoid unaligned memory access compile errors + template<> struct DynamicSharedMem + { + __device__ __forceinline__ operator double*() + { + extern __shared__ double __smem_d[]; + return (double*)__smem_d; + } + + __device__ __forceinline__ operator const double*() const + { + extern __shared__ double __smem_d[]; + return (double*)__smem_d; + } + }; +}}} + +//! @endcond + +#endif // OPENCV_CUDA_DYNAMIC_SMEM_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/emulation.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/emulation.hpp new file mode 100644 index 0000000..17dc117 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/emulation.hpp @@ -0,0 +1,269 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_EMULATION_HPP_ +#define OPENCV_CUDA_EMULATION_HPP_ + +#include "common.hpp" +#include "warp_reduce.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + struct Emulation + { + + static __device__ __forceinline__ int syncthreadsOr(int pred) + { +#if defined (__CUDA_ARCH__) && (__CUDA_ARCH__ < 200) + // just campilation stab + return 0; +#else + return __syncthreads_or(pred); +#endif + } + + template + static __forceinline__ __device__ int Ballot(int predicate) + { +#if defined (__CUDA_ARCH__) && (__CUDA_ARCH__ >= 200) + return __ballot(predicate); +#else + __shared__ volatile int cta_buffer[CTA_SIZE]; + + int tid = threadIdx.x; + cta_buffer[tid] = predicate ? (1 << (tid & 31)) : 0; + return warp_reduce(cta_buffer); +#endif + } + + struct smem + { + enum { TAG_MASK = (1U << ( (sizeof(unsigned int) << 3) - 5U)) - 1U }; + + template + static __device__ __forceinline__ T atomicInc(T* address, T val) + { +#if defined (__CUDA_ARCH__) && (__CUDA_ARCH__ < 120) + T count; + unsigned int tag = threadIdx.x << ( (sizeof(unsigned int) << 3) - 5U); + do + { + count = *address & TAG_MASK; + count = tag | (count + 1); + *address = count; + } while (*address != count); + + return (count & TAG_MASK) - 1; +#else + return ::atomicInc(address, val); +#endif + } + + template + static __device__ __forceinline__ T atomicAdd(T* address, T val) + { +#if defined (__CUDA_ARCH__) && (__CUDA_ARCH__ < 120) + T count; + unsigned int tag = threadIdx.x << ( (sizeof(unsigned int) << 3) - 5U); + do + { + count = *address & TAG_MASK; + count = tag | (count + val); + *address = count; + } while (*address != count); + + return (count & TAG_MASK) - val; +#else + return ::atomicAdd(address, val); +#endif + } + + template + static __device__ __forceinline__ T atomicMin(T* address, T val) + { +#if defined (__CUDA_ARCH__) && (__CUDA_ARCH__ < 120) + T count = ::min(*address, val); + do + { + *address = count; + } while (*address > count); + + return count; +#else + return ::atomicMin(address, val); +#endif + } + }; // struct cmem + + struct glob + { + static __device__ __forceinline__ int atomicAdd(int* address, int val) + { + return ::atomicAdd(address, val); + } + static __device__ __forceinline__ unsigned int atomicAdd(unsigned int* address, unsigned int val) + { + return ::atomicAdd(address, val); + } + static __device__ __forceinline__ float atomicAdd(float* address, float val) + { + #if __CUDA_ARCH__ >= 200 + return ::atomicAdd(address, val); + #else + int* address_as_i = (int*) address; + int old = *address_as_i, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_i, assumed, + __float_as_int(val + __int_as_float(assumed))); + } while (assumed != old); + return __int_as_float(old); + #endif + } + static __device__ __forceinline__ double atomicAdd(double* address, double val) + { + #if __CUDA_ARCH__ >= 130 + unsigned long long int* address_as_ull = (unsigned long long int*) address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + __longlong_as_double(assumed))); + } while (assumed != old); + return __longlong_as_double(old); + #else + CV_UNUSED(address); + CV_UNUSED(val); + return 0.0; + #endif + } + + static __device__ __forceinline__ int atomicMin(int* address, int val) + { + return ::atomicMin(address, val); + } + static __device__ __forceinline__ float atomicMin(float* address, float val) + { + #if __CUDA_ARCH__ >= 120 + int* address_as_i = (int*) address; + int old = *address_as_i, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_i, assumed, + __float_as_int(::fminf(val, __int_as_float(assumed)))); + } while (assumed != old); + return __int_as_float(old); + #else + CV_UNUSED(address); + CV_UNUSED(val); + return 0.0f; + #endif + } + static __device__ __forceinline__ double atomicMin(double* address, double val) + { + #if __CUDA_ARCH__ >= 130 + unsigned long long int* address_as_ull = (unsigned long long int*) address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_ull, assumed, + __double_as_longlong(::fmin(val, __longlong_as_double(assumed)))); + } while (assumed != old); + return __longlong_as_double(old); + #else + CV_UNUSED(address); + CV_UNUSED(val); + return 0.0; + #endif + } + + static __device__ __forceinline__ int atomicMax(int* address, int val) + { + return ::atomicMax(address, val); + } + static __device__ __forceinline__ float atomicMax(float* address, float val) + { + #if __CUDA_ARCH__ >= 120 + int* address_as_i = (int*) address; + int old = *address_as_i, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_i, assumed, + __float_as_int(::fmaxf(val, __int_as_float(assumed)))); + } while (assumed != old); + return __int_as_float(old); + #else + CV_UNUSED(address); + CV_UNUSED(val); + return 0.0f; + #endif + } + static __device__ __forceinline__ double atomicMax(double* address, double val) + { + #if __CUDA_ARCH__ >= 130 + unsigned long long int* address_as_ull = (unsigned long long int*) address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = ::atomicCAS(address_as_ull, assumed, + __double_as_longlong(::fmax(val, __longlong_as_double(assumed)))); + } while (assumed != old); + return __longlong_as_double(old); + #else + CV_UNUSED(address); + CV_UNUSED(val); + return 0.0; + #endif + } + }; + }; //struct Emulation +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif /* OPENCV_CUDA_EMULATION_HPP_ */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/filters.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/filters.hpp new file mode 100644 index 0000000..bf3147e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/filters.hpp @@ -0,0 +1,293 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_FILTERS_HPP +#define OPENCV_CUDA_FILTERS_HPP + +#include "saturate_cast.hpp" +#include "vec_traits.hpp" +#include "vec_math.hpp" +#include "type_traits.hpp" +#include "nppdefs.h" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template struct PointFilter + { + typedef typename Ptr2D::elem_type elem_type; + typedef float index_type; + + explicit __host__ __device__ __forceinline__ PointFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f) + : src(src_) + { + CV_UNUSED(fx); + CV_UNUSED(fy); + } + + __device__ __forceinline__ elem_type operator ()(float y, float x) const + { + return src(__float2int_rz(y), __float2int_rz(x)); + } + + Ptr2D src; + }; + + template struct LinearFilter + { + typedef typename Ptr2D::elem_type elem_type; + typedef float index_type; + + explicit __host__ __device__ __forceinline__ LinearFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f) + : src(src_) + { + CV_UNUSED(fx); + CV_UNUSED(fy); + } + __device__ __forceinline__ elem_type operator ()(float y, float x) const + { + typedef typename TypeVec::cn>::vec_type work_type; + + work_type out = VecTraits::all(0); + + const int x1 = __float2int_rd(x); + const int y1 = __float2int_rd(y); + if (x1 <= NPP_MIN_32S || x1 >= NPP_MAX_32S || y1 <= NPP_MIN_32S || y1 >= NPP_MAX_32S) + { + elem_type src_reg = src(y1, x1); + out = out + src_reg * 1.0f; + return saturate_cast(out); + } + const int x2 = x1 + 1; + const int y2 = y1 + 1; + + elem_type src_reg = src(y1, x1); + out = out + src_reg * ((x2 - x) * (y2 - y)); + + src_reg = src(y1, x2); + out = out + src_reg * ((x - x1) * (y2 - y)); + + src_reg = src(y2, x1); + out = out + src_reg * ((x2 - x) * (y - y1)); + + src_reg = src(y2, x2); + out = out + src_reg * ((x - x1) * (y - y1)); + + return saturate_cast(out); + } + + Ptr2D src; + }; + + template struct CubicFilter + { + typedef typename Ptr2D::elem_type elem_type; + typedef float index_type; + typedef typename TypeVec::cn>::vec_type work_type; + + explicit __host__ __device__ __forceinline__ CubicFilter(const Ptr2D& src_, float fx = 0.f, float fy = 0.f) + : src(src_) + { + CV_UNUSED(fx); + CV_UNUSED(fy); + } + + static __device__ __forceinline__ float bicubicCoeff(float x_) + { + float x = fabsf(x_); + if (x <= 1.0f) + { + return x * x * (1.5f * x - 2.5f) + 1.0f; + } + else if (x < 2.0f) + { + return x * (x * (-0.5f * x + 2.5f) - 4.0f) + 2.0f; + } + else + { + return 0.0f; + } + } + + __device__ elem_type operator ()(float y, float x) const + { + const float xmin = ::ceilf(x - 2.0f); + const float xmax = ::floorf(x + 2.0f); + + const float ymin = ::ceilf(y - 2.0f); + const float ymax = ::floorf(y + 2.0f); + + work_type sum = VecTraits::all(0); + float wsum = 0.0f; + + for (float cy = ymin; cy <= ymax; cy += 1.0f) + { + for (float cx = xmin; cx <= xmax; cx += 1.0f) + { + const float w = bicubicCoeff(x - cx) * bicubicCoeff(y - cy); + sum = sum + w * src(__float2int_rd(cy), __float2int_rd(cx)); + wsum += w; + } + } + + work_type res = (!wsum)? VecTraits::all(0) : sum / wsum; + + return saturate_cast(res); + } + + Ptr2D src; + }; + // for integer scaling + template struct IntegerAreaFilter + { + typedef typename Ptr2D::elem_type elem_type; + typedef float index_type; + + explicit __host__ __device__ __forceinline__ IntegerAreaFilter(const Ptr2D& src_, float scale_x_, float scale_y_) + : src(src_), scale_x(scale_x_), scale_y(scale_y_), scale(1.f / (scale_x * scale_y)) {} + + __device__ __forceinline__ elem_type operator ()(float y, float x) const + { + float fsx1 = x * scale_x; + float fsx2 = fsx1 + scale_x; + + int sx1 = __float2int_ru(fsx1); + int sx2 = __float2int_rd(fsx2); + + float fsy1 = y * scale_y; + float fsy2 = fsy1 + scale_y; + + int sy1 = __float2int_ru(fsy1); + int sy2 = __float2int_rd(fsy2); + + typedef typename TypeVec::cn>::vec_type work_type; + work_type out = VecTraits::all(0.f); + + for(int dy = sy1; dy < sy2; ++dy) + for(int dx = sx1; dx < sx2; ++dx) + { + out = out + src(dy, dx) * scale; + } + + return saturate_cast(out); + } + + Ptr2D src; + float scale_x, scale_y ,scale; + }; + + template struct AreaFilter + { + typedef typename Ptr2D::elem_type elem_type; + typedef float index_type; + + explicit __host__ __device__ __forceinline__ AreaFilter(const Ptr2D& src_, float scale_x_, float scale_y_) + : src(src_), scale_x(scale_x_), scale_y(scale_y_){} + + __device__ __forceinline__ elem_type operator ()(float y, float x) const + { + float fsx1 = x * scale_x; + float fsx2 = fsx1 + scale_x; + + int sx1 = __float2int_ru(fsx1); + int sx2 = __float2int_rd(fsx2); + + float fsy1 = y * scale_y; + float fsy2 = fsy1 + scale_y; + + int sy1 = __float2int_ru(fsy1); + int sy2 = __float2int_rd(fsy2); + + float scale = 1.f / (fminf(scale_x, src.width - fsx1) * fminf(scale_y, src.height - fsy1)); + + typedef typename TypeVec::cn>::vec_type work_type; + work_type out = VecTraits::all(0.f); + + for (int dy = sy1; dy < sy2; ++dy) + { + for (int dx = sx1; dx < sx2; ++dx) + out = out + src(dy, dx) * scale; + + if (sx1 > fsx1) + out = out + src(dy, (sx1 -1) ) * ((sx1 - fsx1) * scale); + + if (sx2 < fsx2) + out = out + src(dy, sx2) * ((fsx2 -sx2) * scale); + } + + if (sy1 > fsy1) + for (int dx = sx1; dx < sx2; ++dx) + out = out + src( (sy1 - 1) , dx) * ((sy1 -fsy1) * scale); + + if (sy2 < fsy2) + for (int dx = sx1; dx < sx2; ++dx) + out = out + src(sy2, dx) * ((fsy2 -sy2) * scale); + + if ((sy1 > fsy1) && (sx1 > fsx1)) + out = out + src( (sy1 - 1) , (sx1 - 1)) * ((sy1 -fsy1) * (sx1 -fsx1) * scale); + + if ((sy1 > fsy1) && (sx2 < fsx2)) + out = out + src( (sy1 - 1) , sx2) * ((sy1 -fsy1) * (fsx2 -sx2) * scale); + + if ((sy2 < fsy2) && (sx2 < fsx2)) + out = out + src(sy2, sx2) * ((fsy2 -sy2) * (fsx2 -sx2) * scale); + + if ((sy2 < fsy2) && (sx1 > fsx1)) + out = out + src(sy2, (sx1 - 1)) * ((fsy2 -sy2) * (sx1 -fsx1) * scale); + + return saturate_cast(out); + } + + Ptr2D src; + float scale_x, scale_y; + int width, haight; + }; +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_FILTERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/funcattrib.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/funcattrib.hpp new file mode 100644 index 0000000..f582080 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/funcattrib.hpp @@ -0,0 +1,79 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_DEVICE_FUNCATTRIB_HPP +#define OPENCV_CUDA_DEVICE_FUNCATTRIB_HPP + +#include + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template + void printFuncAttrib(Func& func) + { + + cudaFuncAttributes attrs; + cudaFuncGetAttributes(&attrs, func); + + printf("=== Function stats ===\n"); + printf("Name: \n"); + printf("sharedSizeBytes = %d\n", attrs.sharedSizeBytes); + printf("constSizeBytes = %d\n", attrs.constSizeBytes); + printf("localSizeBytes = %d\n", attrs.localSizeBytes); + printf("maxThreadsPerBlock = %d\n", attrs.maxThreadsPerBlock); + printf("numRegs = %d\n", attrs.numRegs); + printf("ptxVersion = %d\n", attrs.ptxVersion); + printf("binaryVersion = %d\n", attrs.binaryVersion); + printf("\n"); + fflush(stdout); + } +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif /* OPENCV_CUDA_DEVICE_FUNCATTRIB_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/functional.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/functional.hpp new file mode 100644 index 0000000..9f53d87 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/functional.hpp @@ -0,0 +1,805 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_FUNCTIONAL_HPP +#define OPENCV_CUDA_FUNCTIONAL_HPP + +#include +#include "saturate_cast.hpp" +#include "vec_traits.hpp" +#include "type_traits.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + // Function Objects + template struct unary_function + { + typedef Argument argument_type; + typedef Result result_type; + }; + template struct binary_function + { + typedef Argument1 first_argument_type; + typedef Argument2 second_argument_type; + typedef Result result_type; + }; + + // Arithmetic Operations + template struct plus : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a + b; + } + __host__ __device__ __forceinline__ plus() {} + __host__ __device__ __forceinline__ plus(const plus&) {} + }; + + template struct minus : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a - b; + } + __host__ __device__ __forceinline__ minus() {} + __host__ __device__ __forceinline__ minus(const minus&) {} + }; + + template struct multiplies : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a * b; + } + __host__ __device__ __forceinline__ multiplies() {} + __host__ __device__ __forceinline__ multiplies(const multiplies&) {} + }; + + template struct divides : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a / b; + } + __host__ __device__ __forceinline__ divides() {} + __host__ __device__ __forceinline__ divides(const divides&) {} + }; + + template struct modulus : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a % b; + } + __host__ __device__ __forceinline__ modulus() {} + __host__ __device__ __forceinline__ modulus(const modulus&) {} + }; + + template struct negate : unary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a) const + { + return -a; + } + __host__ __device__ __forceinline__ negate() {} + __host__ __device__ __forceinline__ negate(const negate&) {} + }; + + // Comparison Operations + template struct equal_to : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a == b; + } + __host__ __device__ __forceinline__ equal_to() {} + __host__ __device__ __forceinline__ equal_to(const equal_to&) {} + }; + + template struct not_equal_to : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a != b; + } + __host__ __device__ __forceinline__ not_equal_to() {} + __host__ __device__ __forceinline__ not_equal_to(const not_equal_to&) {} + }; + + template struct greater : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a > b; + } + __host__ __device__ __forceinline__ greater() {} + __host__ __device__ __forceinline__ greater(const greater&) {} + }; + + template struct less : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a < b; + } + __host__ __device__ __forceinline__ less() {} + __host__ __device__ __forceinline__ less(const less&) {} + }; + + template struct greater_equal : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a >= b; + } + __host__ __device__ __forceinline__ greater_equal() {} + __host__ __device__ __forceinline__ greater_equal(const greater_equal&) {} + }; + + template struct less_equal : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a <= b; + } + __host__ __device__ __forceinline__ less_equal() {} + __host__ __device__ __forceinline__ less_equal(const less_equal&) {} + }; + + // Logical Operations + template struct logical_and : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a && b; + } + __host__ __device__ __forceinline__ logical_and() {} + __host__ __device__ __forceinline__ logical_and(const logical_and&) {} + }; + + template struct logical_or : binary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a || b; + } + __host__ __device__ __forceinline__ logical_or() {} + __host__ __device__ __forceinline__ logical_or(const logical_or&) {} + }; + + template struct logical_not : unary_function + { + __device__ __forceinline__ bool operator ()(typename TypeTraits::ParameterType a) const + { + return !a; + } + __host__ __device__ __forceinline__ logical_not() {} + __host__ __device__ __forceinline__ logical_not(const logical_not&) {} + }; + + // Bitwise Operations + template struct bit_and : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a & b; + } + __host__ __device__ __forceinline__ bit_and() {} + __host__ __device__ __forceinline__ bit_and(const bit_and&) {} + }; + + template struct bit_or : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a | b; + } + __host__ __device__ __forceinline__ bit_or() {} + __host__ __device__ __forceinline__ bit_or(const bit_or&) {} + }; + + template struct bit_xor : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType a, + typename TypeTraits::ParameterType b) const + { + return a ^ b; + } + __host__ __device__ __forceinline__ bit_xor() {} + __host__ __device__ __forceinline__ bit_xor(const bit_xor&) {} + }; + + template struct bit_not : unary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType v) const + { + return ~v; + } + __host__ __device__ __forceinline__ bit_not() {} + __host__ __device__ __forceinline__ bit_not(const bit_not&) {} + }; + + // Generalized Identity Operations + template struct identity : unary_function + { + __device__ __forceinline__ typename TypeTraits::ParameterType operator()(typename TypeTraits::ParameterType x) const + { + return x; + } + __host__ __device__ __forceinline__ identity() {} + __host__ __device__ __forceinline__ identity(const identity&) {} + }; + + template struct project1st : binary_function + { + __device__ __forceinline__ typename TypeTraits::ParameterType operator()(typename TypeTraits::ParameterType lhs, typename TypeTraits::ParameterType rhs) const + { + return lhs; + } + __host__ __device__ __forceinline__ project1st() {} + __host__ __device__ __forceinline__ project1st(const project1st&) {} + }; + + template struct project2nd : binary_function + { + __device__ __forceinline__ typename TypeTraits::ParameterType operator()(typename TypeTraits::ParameterType lhs, typename TypeTraits::ParameterType rhs) const + { + return rhs; + } + __host__ __device__ __forceinline__ project2nd() {} + __host__ __device__ __forceinline__ project2nd(const project2nd&) {} + }; + + // Min/Max Operations + +#define OPENCV_CUDA_IMPLEMENT_MINMAX(name, type, op) \ + template <> struct name : binary_function \ + { \ + __device__ __forceinline__ type operator()(type lhs, type rhs) const {return op(lhs, rhs);} \ + __host__ __device__ __forceinline__ name() {}\ + __host__ __device__ __forceinline__ name(const name&) {}\ + }; + + template struct maximum : binary_function + { + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType lhs, typename TypeTraits::ParameterType rhs) const + { + return max(lhs, rhs); + } + __host__ __device__ __forceinline__ maximum() {} + __host__ __device__ __forceinline__ maximum(const maximum&) {} + }; + + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, uchar, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, schar, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, char, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, ushort, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, short, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, int, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, uint, ::max) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, float, ::fmax) + OPENCV_CUDA_IMPLEMENT_MINMAX(maximum, double, ::fmax) + + template struct minimum : binary_function + { + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType lhs, typename TypeTraits::ParameterType rhs) const + { + return min(lhs, rhs); + } + __host__ __device__ __forceinline__ minimum() {} + __host__ __device__ __forceinline__ minimum(const minimum&) {} + }; + + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, uchar, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, schar, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, char, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, ushort, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, short, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, int, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, uint, ::min) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, float, ::fmin) + OPENCV_CUDA_IMPLEMENT_MINMAX(minimum, double, ::fmin) + +#undef OPENCV_CUDA_IMPLEMENT_MINMAX + + // Math functions + + template struct abs_func : unary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType x) const + { + return abs(x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ unsigned char operator ()(unsigned char x) const + { + return x; + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ signed char operator ()(signed char x) const + { + return ::abs((int)x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ char operator ()(char x) const + { + return ::abs((int)x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ unsigned short operator ()(unsigned short x) const + { + return x; + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ short operator ()(short x) const + { + return ::abs((int)x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ unsigned int operator ()(unsigned int x) const + { + return x; + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ int operator ()(int x) const + { + return ::abs(x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ float operator ()(float x) const + { + return ::fabsf(x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + template <> struct abs_func : unary_function + { + __device__ __forceinline__ double operator ()(double x) const + { + return ::fabs(x); + } + + __host__ __device__ __forceinline__ abs_func() {} + __host__ __device__ __forceinline__ abs_func(const abs_func&) {} + }; + +#define OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(name, func) \ + template struct name ## _func : unary_function \ + { \ + __device__ __forceinline__ float operator ()(typename TypeTraits::ParameterType v) const \ + { \ + return func ## f(v); \ + } \ + __host__ __device__ __forceinline__ name ## _func() {} \ + __host__ __device__ __forceinline__ name ## _func(const name ## _func&) {} \ + }; \ + template <> struct name ## _func : unary_function \ + { \ + __device__ __forceinline__ double operator ()(double v) const \ + { \ + return func(v); \ + } \ + __host__ __device__ __forceinline__ name ## _func() {} \ + __host__ __device__ __forceinline__ name ## _func(const name ## _func&) {} \ + }; + +#define OPENCV_CUDA_IMPLEMENT_BIN_FUNCTOR(name, func) \ + template struct name ## _func : binary_function \ + { \ + __device__ __forceinline__ float operator ()(typename TypeTraits::ParameterType v1, typename TypeTraits::ParameterType v2) const \ + { \ + return func ## f(v1, v2); \ + } \ + __host__ __device__ __forceinline__ name ## _func() {} \ + __host__ __device__ __forceinline__ name ## _func(const name ## _func&) {} \ + }; \ + template <> struct name ## _func : binary_function \ + { \ + __device__ __forceinline__ double operator ()(double v1, double v2) const \ + { \ + return func(v1, v2); \ + } \ + __host__ __device__ __forceinline__ name ## _func() {} \ + __host__ __device__ __forceinline__ name ## _func(const name ## _func&) {} \ + }; + + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(sqrt, ::sqrt) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(exp, ::exp) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(exp2, ::exp2) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(exp10, ::exp10) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(log, ::log) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(log2, ::log2) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(log10, ::log10) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(sin, ::sin) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(cos, ::cos) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(tan, ::tan) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(asin, ::asin) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(acos, ::acos) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(atan, ::atan) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(sinh, ::sinh) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(cosh, ::cosh) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(tanh, ::tanh) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(asinh, ::asinh) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(acosh, ::acosh) + OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR(atanh, ::atanh) + + OPENCV_CUDA_IMPLEMENT_BIN_FUNCTOR(hypot, ::hypot) + OPENCV_CUDA_IMPLEMENT_BIN_FUNCTOR(atan2, ::atan2) + OPENCV_CUDA_IMPLEMENT_BIN_FUNCTOR(pow, ::pow) + + #undef OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR + #undef OPENCV_CUDA_IMPLEMENT_UN_FUNCTOR_NO_DOUBLE + #undef OPENCV_CUDA_IMPLEMENT_BIN_FUNCTOR + + template struct hypot_sqr_func : binary_function + { + __device__ __forceinline__ T operator ()(typename TypeTraits::ParameterType src1, typename TypeTraits::ParameterType src2) const + { + return src1 * src1 + src2 * src2; + } + __host__ __device__ __forceinline__ hypot_sqr_func() {} + __host__ __device__ __forceinline__ hypot_sqr_func(const hypot_sqr_func&) {} + }; + + // Saturate Cast Functor + template struct saturate_cast_func : unary_function + { + __device__ __forceinline__ D operator ()(typename TypeTraits::ParameterType v) const + { + return saturate_cast(v); + } + __host__ __device__ __forceinline__ saturate_cast_func() {} + __host__ __device__ __forceinline__ saturate_cast_func(const saturate_cast_func&) {} + }; + + // Threshold Functors + template struct thresh_binary_func : unary_function + { + __host__ __device__ __forceinline__ thresh_binary_func(T thresh_, T maxVal_) : thresh(thresh_), maxVal(maxVal_) {} + + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType src) const + { + return (src > thresh) * maxVal; + } + + __host__ __device__ __forceinline__ thresh_binary_func() {} + __host__ __device__ __forceinline__ thresh_binary_func(const thresh_binary_func& other) + : thresh(other.thresh), maxVal(other.maxVal) {} + + T thresh; + T maxVal; + }; + + template struct thresh_binary_inv_func : unary_function + { + __host__ __device__ __forceinline__ thresh_binary_inv_func(T thresh_, T maxVal_) : thresh(thresh_), maxVal(maxVal_) {} + + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType src) const + { + return (src <= thresh) * maxVal; + } + + __host__ __device__ __forceinline__ thresh_binary_inv_func() {} + __host__ __device__ __forceinline__ thresh_binary_inv_func(const thresh_binary_inv_func& other) + : thresh(other.thresh), maxVal(other.maxVal) {} + + T thresh; + T maxVal; + }; + + template struct thresh_trunc_func : unary_function + { + explicit __host__ __device__ __forceinline__ thresh_trunc_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {CV_UNUSED(maxVal_);} + + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType src) const + { + return minimum()(src, thresh); + } + + __host__ __device__ __forceinline__ thresh_trunc_func() {} + __host__ __device__ __forceinline__ thresh_trunc_func(const thresh_trunc_func& other) + : thresh(other.thresh) {} + + T thresh; + }; + + template struct thresh_to_zero_func : unary_function + { + explicit __host__ __device__ __forceinline__ thresh_to_zero_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {CV_UNUSED(maxVal_);} + + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType src) const + { + return (src > thresh) * src; + } + + __host__ __device__ __forceinline__ thresh_to_zero_func() {} + __host__ __device__ __forceinline__ thresh_to_zero_func(const thresh_to_zero_func& other) + : thresh(other.thresh) {} + + T thresh; + }; + + template struct thresh_to_zero_inv_func : unary_function + { + explicit __host__ __device__ __forceinline__ thresh_to_zero_inv_func(T thresh_, T maxVal_ = 0) : thresh(thresh_) {CV_UNUSED(maxVal_);} + + __device__ __forceinline__ T operator()(typename TypeTraits::ParameterType src) const + { + return (src <= thresh) * src; + } + + __host__ __device__ __forceinline__ thresh_to_zero_inv_func() {} + __host__ __device__ __forceinline__ thresh_to_zero_inv_func(const thresh_to_zero_inv_func& other) + : thresh(other.thresh) {} + + T thresh; + }; + + // Function Object Adaptors + template struct unary_negate : unary_function + { + explicit __host__ __device__ __forceinline__ unary_negate(const Predicate& p) : pred(p) {} + + __device__ __forceinline__ bool operator()(typename TypeTraits::ParameterType x) const + { + return !pred(x); + } + + __host__ __device__ __forceinline__ unary_negate() {} + __host__ __device__ __forceinline__ unary_negate(const unary_negate& other) : pred(other.pred) {} + + Predicate pred; + }; + + template __host__ __device__ __forceinline__ unary_negate not1(const Predicate& pred) + { + return unary_negate(pred); + } + + template struct binary_negate : binary_function + { + explicit __host__ __device__ __forceinline__ binary_negate(const Predicate& p) : pred(p) {} + + __device__ __forceinline__ bool operator()(typename TypeTraits::ParameterType x, + typename TypeTraits::ParameterType y) const + { + return !pred(x,y); + } + + __host__ __device__ __forceinline__ binary_negate() {} + __host__ __device__ __forceinline__ binary_negate(const binary_negate& other) : pred(other.pred) {} + + Predicate pred; + }; + + template __host__ __device__ __forceinline__ binary_negate not2(const BinaryPredicate& pred) + { + return binary_negate(pred); + } + + template struct binder1st : unary_function + { + __host__ __device__ __forceinline__ binder1st(const Op& op_, const typename Op::first_argument_type& arg1_) : op(op_), arg1(arg1_) {} + + __device__ __forceinline__ typename Op::result_type operator ()(typename TypeTraits::ParameterType a) const + { + return op(arg1, a); + } + + __host__ __device__ __forceinline__ binder1st() {} + __host__ __device__ __forceinline__ binder1st(const binder1st& other) : op(other.op), arg1(other.arg1) {} + + Op op; + typename Op::first_argument_type arg1; + }; + + template __host__ __device__ __forceinline__ binder1st bind1st(const Op& op, const T& x) + { + return binder1st(op, typename Op::first_argument_type(x)); + } + + template struct binder2nd : unary_function + { + __host__ __device__ __forceinline__ binder2nd(const Op& op_, const typename Op::second_argument_type& arg2_) : op(op_), arg2(arg2_) {} + + __forceinline__ __device__ typename Op::result_type operator ()(typename TypeTraits::ParameterType a) const + { + return op(a, arg2); + } + + __host__ __device__ __forceinline__ binder2nd() {} + __host__ __device__ __forceinline__ binder2nd(const binder2nd& other) : op(other.op), arg2(other.arg2) {} + + Op op; + typename Op::second_argument_type arg2; + }; + + template __host__ __device__ __forceinline__ binder2nd bind2nd(const Op& op, const T& x) + { + return binder2nd(op, typename Op::second_argument_type(x)); + } + + // Functor Traits + template struct IsUnaryFunction + { + typedef char Yes; + struct No {Yes a[2];}; + + template static Yes check(unary_function); + static No check(...); + + static F makeF(); + + enum { value = (sizeof(check(makeF())) == sizeof(Yes)) }; + }; + + template struct IsBinaryFunction + { + typedef char Yes; + struct No {Yes a[2];}; + + template static Yes check(binary_function); + static No check(...); + + static F makeF(); + + enum { value = (sizeof(check(makeF())) == sizeof(Yes)) }; + }; + + namespace functional_detail + { + template struct UnOpShift { enum { shift = 1 }; }; + template struct UnOpShift { enum { shift = 4 }; }; + template struct UnOpShift { enum { shift = 2 }; }; + + template struct DefaultUnaryShift + { + enum { shift = UnOpShift::shift }; + }; + + template struct BinOpShift { enum { shift = 1 }; }; + template struct BinOpShift { enum { shift = 4 }; }; + template struct BinOpShift { enum { shift = 2 }; }; + + template struct DefaultBinaryShift + { + enum { shift = BinOpShift::shift }; + }; + + template ::value> struct ShiftDispatcher; + template struct ShiftDispatcher + { + enum { shift = DefaultUnaryShift::shift }; + }; + template struct ShiftDispatcher + { + enum { shift = DefaultBinaryShift::shift }; + }; + } + + template struct DefaultTransformShift + { + enum { shift = functional_detail::ShiftDispatcher::shift }; + }; + + template struct DefaultTransformFunctorTraits + { + enum { simple_block_dim_x = 16 }; + enum { simple_block_dim_y = 16 }; + + enum { smart_block_dim_x = 16 }; + enum { smart_block_dim_y = 16 }; + enum { smart_shift = DefaultTransformShift::shift }; + }; + + template struct TransformFunctorTraits : DefaultTransformFunctorTraits {}; + +#define OPENCV_CUDA_TRANSFORM_FUNCTOR_TRAITS(type) \ + template <> struct TransformFunctorTraits< type > : DefaultTransformFunctorTraits< type > +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_FUNCTIONAL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/limits.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/limits.hpp new file mode 100644 index 0000000..7e15ed6 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/limits.hpp @@ -0,0 +1,128 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_LIMITS_HPP +#define OPENCV_CUDA_LIMITS_HPP + +#include +#include +#include "common.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ +template struct numeric_limits; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static bool min() { return false; } + __device__ __forceinline__ static bool max() { return true; } + static const bool is_signed = false; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static signed char min() { return SCHAR_MIN; } + __device__ __forceinline__ static signed char max() { return SCHAR_MAX; } + static const bool is_signed = true; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static unsigned char min() { return 0; } + __device__ __forceinline__ static unsigned char max() { return UCHAR_MAX; } + static const bool is_signed = false; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static short min() { return SHRT_MIN; } + __device__ __forceinline__ static short max() { return SHRT_MAX; } + static const bool is_signed = true; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static unsigned short min() { return 0; } + __device__ __forceinline__ static unsigned short max() { return USHRT_MAX; } + static const bool is_signed = false; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static int min() { return INT_MIN; } + __device__ __forceinline__ static int max() { return INT_MAX; } + static const bool is_signed = true; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static unsigned int min() { return 0; } + __device__ __forceinline__ static unsigned int max() { return UINT_MAX; } + static const bool is_signed = false; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static float min() { return FLT_MIN; } + __device__ __forceinline__ static float max() { return FLT_MAX; } + __device__ __forceinline__ static float epsilon() { return FLT_EPSILON; } + static const bool is_signed = true; +}; + +template <> struct numeric_limits +{ + __device__ __forceinline__ static double min() { return DBL_MIN; } + __device__ __forceinline__ static double max() { return DBL_MAX; } + __device__ __forceinline__ static double epsilon() { return DBL_EPSILON; } + static const bool is_signed = true; +}; +}}} // namespace cv { namespace cuda { namespace cudev { + +//! @endcond + +#endif // OPENCV_CUDA_LIMITS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/reduce.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/reduce.hpp new file mode 100644 index 0000000..5de3650 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/reduce.hpp @@ -0,0 +1,209 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_REDUCE_HPP +#define OPENCV_CUDA_REDUCE_HPP + +#ifndef THRUST_DEBUG // eliminate -Wundef warning +#define THRUST_DEBUG 0 +#endif + +#include +#include "detail/reduce.hpp" +#include "detail/reduce_key_val.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template + __device__ __forceinline__ void reduce(volatile T* smem, T& val, unsigned int tid, const Op& op) + { + reduce_detail::Dispatcher::reductor::template reduce(smem, val, tid, op); + } + template + __device__ __forceinline__ void reduce(const thrust::tuple& smem, + const thrust::tuple& val, + unsigned int tid, + const thrust::tuple& op) + { + reduce_detail::Dispatcher::reductor::template reduce< + const thrust::tuple&, + const thrust::tuple&, + const thrust::tuple&>(smem, val, tid, op); + } + + template + __device__ __forceinline__ void reduceKeyVal(volatile K* skeys, K& key, volatile V* svals, V& val, unsigned int tid, const Cmp& cmp) + { + reduce_key_val_detail::Dispatcher::reductor::template reduce(skeys, key, svals, val, tid, cmp); + } + template + __device__ __forceinline__ void reduceKeyVal(volatile K* skeys, K& key, + const thrust::tuple& svals, + const thrust::tuple& val, + unsigned int tid, const Cmp& cmp) + { + reduce_key_val_detail::Dispatcher::reductor::template reduce&, + const thrust::tuple&, + const Cmp&>(skeys, key, svals, val, tid, cmp); + } + template + __device__ __forceinline__ void reduceKeyVal(const thrust::tuple& skeys, + const thrust::tuple& key, + const thrust::tuple& svals, + const thrust::tuple& val, + unsigned int tid, + const thrust::tuple& cmp) + { + reduce_key_val_detail::Dispatcher::reductor::template reduce< + const thrust::tuple&, + const thrust::tuple&, + const thrust::tuple&, + const thrust::tuple&, + const thrust::tuple& + >(skeys, key, svals, val, tid, cmp); + } + + // smem_tuple + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0) + { + return thrust::make_tuple((volatile T0*) t0); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4, T5* t5) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4, (volatile T5*) t5); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4, T5* t5, T6* t6) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4, (volatile T5*) t5, (volatile T6*) t6); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4, T5* t5, T6* t6, T7* t7) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4, (volatile T5*) t5, (volatile T6*) t6, (volatile T7*) t7); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4, T5* t5, T6* t6, T7* t7, T8* t8) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4, (volatile T5*) t5, (volatile T6*) t6, (volatile T7*) t7, (volatile T8*) t8); + } + + template + __device__ __forceinline__ + thrust::tuple + smem_tuple(T0* t0, T1* t1, T2* t2, T3* t3, T4* t4, T5* t5, T6* t6, T7* t7, T8* t8, T9* t9) + { + return thrust::make_tuple((volatile T0*) t0, (volatile T1*) t1, (volatile T2*) t2, (volatile T3*) t3, (volatile T4*) t4, (volatile T5*) t5, (volatile T6*) t6, (volatile T7*) t7, (volatile T8*) t8, (volatile T9*) t9); + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_REDUCE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/saturate_cast.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/saturate_cast.hpp new file mode 100644 index 0000000..c3a3d1c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/saturate_cast.hpp @@ -0,0 +1,292 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_SATURATE_CAST_HPP +#define OPENCV_CUDA_SATURATE_CAST_HPP + +#include "common.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template __device__ __forceinline__ _Tp saturate_cast(uchar v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(schar v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(ushort v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(short v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(uint v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(int v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(float v) { return _Tp(v); } + template __device__ __forceinline__ _Tp saturate_cast(double v) { return _Tp(v); } + + template<> __device__ __forceinline__ uchar saturate_cast(schar v) + { + uint res = 0; + int vi = v; + asm("cvt.sat.u8.s8 %0, %1;" : "=r"(res) : "r"(vi)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(short v) + { + uint res = 0; + asm("cvt.sat.u8.s16 %0, %1;" : "=r"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(ushort v) + { + uint res = 0; + asm("cvt.sat.u8.u16 %0, %1;" : "=r"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(int v) + { + uint res = 0; + asm("cvt.sat.u8.s32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(uint v) + { + uint res = 0; + asm("cvt.sat.u8.u32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(float v) + { + uint res = 0; + asm("cvt.rni.sat.u8.f32 %0, %1;" : "=r"(res) : "f"(v)); + return res; + } + template<> __device__ __forceinline__ uchar saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + uint res = 0; + asm("cvt.rni.sat.u8.f64 %0, %1;" : "=r"(res) : "d"(v)); + return res; + #else + return saturate_cast((float)v); + #endif + } + + template<> __device__ __forceinline__ schar saturate_cast(uchar v) + { + uint res = 0; + uint vi = v; + asm("cvt.sat.s8.u8 %0, %1;" : "=r"(res) : "r"(vi)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(short v) + { + uint res = 0; + asm("cvt.sat.s8.s16 %0, %1;" : "=r"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(ushort v) + { + uint res = 0; + asm("cvt.sat.s8.u16 %0, %1;" : "=r"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(int v) + { + uint res = 0; + asm("cvt.sat.s8.s32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(uint v) + { + uint res = 0; + asm("cvt.sat.s8.u32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(float v) + { + uint res = 0; + asm("cvt.rni.sat.s8.f32 %0, %1;" : "=r"(res) : "f"(v)); + return res; + } + template<> __device__ __forceinline__ schar saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + uint res = 0; + asm("cvt.rni.sat.s8.f64 %0, %1;" : "=r"(res) : "d"(v)); + return res; + #else + return saturate_cast((float)v); + #endif + } + + template<> __device__ __forceinline__ ushort saturate_cast(schar v) + { + ushort res = 0; + int vi = v; + asm("cvt.sat.u16.s8 %0, %1;" : "=h"(res) : "r"(vi)); + return res; + } + template<> __device__ __forceinline__ ushort saturate_cast(short v) + { + ushort res = 0; + asm("cvt.sat.u16.s16 %0, %1;" : "=h"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ ushort saturate_cast(int v) + { + ushort res = 0; + asm("cvt.sat.u16.s32 %0, %1;" : "=h"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ ushort saturate_cast(uint v) + { + ushort res = 0; + asm("cvt.sat.u16.u32 %0, %1;" : "=h"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ ushort saturate_cast(float v) + { + ushort res = 0; + asm("cvt.rni.sat.u16.f32 %0, %1;" : "=h"(res) : "f"(v)); + return res; + } + template<> __device__ __forceinline__ ushort saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + ushort res = 0; + asm("cvt.rni.sat.u16.f64 %0, %1;" : "=h"(res) : "d"(v)); + return res; + #else + return saturate_cast((float)v); + #endif + } + + template<> __device__ __forceinline__ short saturate_cast(ushort v) + { + short res = 0; + asm("cvt.sat.s16.u16 %0, %1;" : "=h"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ short saturate_cast(int v) + { + short res = 0; + asm("cvt.sat.s16.s32 %0, %1;" : "=h"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ short saturate_cast(uint v) + { + short res = 0; + asm("cvt.sat.s16.u32 %0, %1;" : "=h"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ short saturate_cast(float v) + { + short res = 0; + asm("cvt.rni.sat.s16.f32 %0, %1;" : "=h"(res) : "f"(v)); + return res; + } + template<> __device__ __forceinline__ short saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + short res = 0; + asm("cvt.rni.sat.s16.f64 %0, %1;" : "=h"(res) : "d"(v)); + return res; + #else + return saturate_cast((float)v); + #endif + } + + template<> __device__ __forceinline__ int saturate_cast(uint v) + { + int res = 0; + asm("cvt.sat.s32.u32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ int saturate_cast(float v) + { + return __float2int_rn(v); + } + template<> __device__ __forceinline__ int saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + return __double2int_rn(v); + #else + return saturate_cast((float)v); + #endif + } + + template<> __device__ __forceinline__ uint saturate_cast(schar v) + { + uint res = 0; + int vi = v; + asm("cvt.sat.u32.s8 %0, %1;" : "=r"(res) : "r"(vi)); + return res; + } + template<> __device__ __forceinline__ uint saturate_cast(short v) + { + uint res = 0; + asm("cvt.sat.u32.s16 %0, %1;" : "=r"(res) : "h"(v)); + return res; + } + template<> __device__ __forceinline__ uint saturate_cast(int v) + { + uint res = 0; + asm("cvt.sat.u32.s32 %0, %1;" : "=r"(res) : "r"(v)); + return res; + } + template<> __device__ __forceinline__ uint saturate_cast(float v) + { + return __float2uint_rn(v); + } + template<> __device__ __forceinline__ uint saturate_cast(double v) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 130 + return __double2uint_rn(v); + #else + return saturate_cast((float)v); + #endif + } +}}} + +//! @endcond + +#endif /* OPENCV_CUDA_SATURATE_CAST_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/scan.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/scan.hpp new file mode 100644 index 0000000..e128fb0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/scan.hpp @@ -0,0 +1,258 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_SCAN_HPP +#define OPENCV_CUDA_SCAN_HPP + +#include "opencv2/core/cuda/common.hpp" +#include "opencv2/core/cuda/utility.hpp" +#include "opencv2/core/cuda/warp.hpp" +#include "opencv2/core/cuda/warp_shuffle.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + enum ScanKind { EXCLUSIVE = 0, INCLUSIVE = 1 }; + + template struct WarpScan + { + __device__ __forceinline__ WarpScan() {} + __device__ __forceinline__ WarpScan(const WarpScan& other) { CV_UNUSED(other); } + + __device__ __forceinline__ T operator()( volatile T *ptr , const unsigned int idx) + { + const unsigned int lane = idx & 31; + F op; + + if ( lane >= 1) ptr [idx ] = op(ptr [idx - 1], ptr [idx]); + if ( lane >= 2) ptr [idx ] = op(ptr [idx - 2], ptr [idx]); + if ( lane >= 4) ptr [idx ] = op(ptr [idx - 4], ptr [idx]); + if ( lane >= 8) ptr [idx ] = op(ptr [idx - 8], ptr [idx]); + if ( lane >= 16) ptr [idx ] = op(ptr [idx - 16], ptr [idx]); + + if( Kind == INCLUSIVE ) + return ptr [idx]; + else + return (lane > 0) ? ptr [idx - 1] : 0; + } + + __device__ __forceinline__ unsigned int index(const unsigned int tid) + { + return tid; + } + + __device__ __forceinline__ void init(volatile T *ptr){} + + static const int warp_offset = 0; + + typedef WarpScan merge; + }; + + template struct WarpScanNoComp + { + __device__ __forceinline__ WarpScanNoComp() {} + __device__ __forceinline__ WarpScanNoComp(const WarpScanNoComp& other) { CV_UNUSED(other); } + + __device__ __forceinline__ T operator()( volatile T *ptr , const unsigned int idx) + { + const unsigned int lane = threadIdx.x & 31; + F op; + + ptr [idx ] = op(ptr [idx - 1], ptr [idx]); + ptr [idx ] = op(ptr [idx - 2], ptr [idx]); + ptr [idx ] = op(ptr [idx - 4], ptr [idx]); + ptr [idx ] = op(ptr [idx - 8], ptr [idx]); + ptr [idx ] = op(ptr [idx - 16], ptr [idx]); + + if( Kind == INCLUSIVE ) + return ptr [idx]; + else + return (lane > 0) ? ptr [idx - 1] : 0; + } + + __device__ __forceinline__ unsigned int index(const unsigned int tid) + { + return (tid >> warp_log) * warp_smem_stride + 16 + (tid & warp_mask); + } + + __device__ __forceinline__ void init(volatile T *ptr) + { + ptr[threadIdx.x] = 0; + } + + static const int warp_smem_stride = 32 + 16 + 1; + static const int warp_offset = 16; + static const int warp_log = 5; + static const int warp_mask = 31; + + typedef WarpScanNoComp merge; + }; + + template struct BlockScan + { + __device__ __forceinline__ BlockScan() {} + __device__ __forceinline__ BlockScan(const BlockScan& other) { CV_UNUSED(other); } + + __device__ __forceinline__ T operator()(volatile T *ptr) + { + const unsigned int tid = threadIdx.x; + const unsigned int lane = tid & warp_mask; + const unsigned int warp = tid >> warp_log; + + Sc scan; + typename Sc::merge merge_scan; + const unsigned int idx = scan.index(tid); + + T val = scan(ptr, idx); + __syncthreads (); + + if( warp == 0) + scan.init(ptr); + __syncthreads (); + + if( lane == 31 ) + ptr [scan.warp_offset + warp ] = (Kind == INCLUSIVE) ? val : ptr [idx]; + __syncthreads (); + + if( warp == 0 ) + merge_scan(ptr, idx); + __syncthreads(); + + if ( warp > 0) + val = ptr [scan.warp_offset + warp - 1] + val; + __syncthreads (); + + ptr[idx] = val; + __syncthreads (); + + return val ; + } + + static const int warp_log = 5; + static const int warp_mask = 31; + }; + + template + __device__ T warpScanInclusive(T idata, volatile T* s_Data, unsigned int tid) + { + #if __CUDA_ARCH__ >= 300 + const unsigned int laneId = cv::cuda::device::Warp::laneId(); + + // scan on shuffl functions + #pragma unroll + for (int i = 1; i <= (OPENCV_CUDA_WARP_SIZE / 2); i *= 2) + { + const T n = cv::cuda::device::shfl_up(idata, i); + if (laneId >= i) + idata += n; + } + + return idata; + #else + unsigned int pos = 2 * tid - (tid & (OPENCV_CUDA_WARP_SIZE - 1)); + s_Data[pos] = 0; + pos += OPENCV_CUDA_WARP_SIZE; + s_Data[pos] = idata; + + s_Data[pos] += s_Data[pos - 1]; + s_Data[pos] += s_Data[pos - 2]; + s_Data[pos] += s_Data[pos - 4]; + s_Data[pos] += s_Data[pos - 8]; + s_Data[pos] += s_Data[pos - 16]; + + return s_Data[pos]; + #endif + } + + template + __device__ __forceinline__ T warpScanExclusive(T idata, volatile T* s_Data, unsigned int tid) + { + return warpScanInclusive(idata, s_Data, tid) - idata; + } + + template + __device__ T blockScanInclusive(T idata, volatile T* s_Data, unsigned int tid) + { + if (tiNumScanThreads > OPENCV_CUDA_WARP_SIZE) + { + //Bottom-level inclusive warp scan + T warpResult = warpScanInclusive(idata, s_Data, tid); + + //Save top elements of each warp for exclusive warp scan + //sync to wait for warp scans to complete (because s_Data is being overwritten) + __syncthreads(); + if ((tid & (OPENCV_CUDA_WARP_SIZE - 1)) == (OPENCV_CUDA_WARP_SIZE - 1)) + { + s_Data[tid >> OPENCV_CUDA_LOG_WARP_SIZE] = warpResult; + } + + //wait for warp scans to complete + __syncthreads(); + + if (tid < (tiNumScanThreads / OPENCV_CUDA_WARP_SIZE) ) + { + //grab top warp elements + T val = s_Data[tid]; + //calculate exclusive scan and write back to shared memory + s_Data[tid] = warpScanExclusive(val, s_Data, tid); + } + + //return updated warp scans with exclusive scan results + __syncthreads(); + + return warpResult + s_Data[tid >> OPENCV_CUDA_LOG_WARP_SIZE]; + } + else + { + return warpScanInclusive(idata, s_Data, tid); + } + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_SCAN_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/simd_functions.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/simd_functions.hpp new file mode 100644 index 0000000..3d8c2e0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/simd_functions.hpp @@ -0,0 +1,869 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +/* + * Copyright (c) 2013 NVIDIA Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of NVIDIA Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef OPENCV_CUDA_SIMD_FUNCTIONS_HPP +#define OPENCV_CUDA_SIMD_FUNCTIONS_HPP + +#include "common.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + // 2 + + static __device__ __forceinline__ unsigned int vadd2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vadd2.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vadd.u32.u32.u32.sat %0.h0, %1.h0, %2.h0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vadd.u32.u32.u32.sat %0.h1, %1.h1, %2.h1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s; + s = a ^ b; // sum bits + r = a + b; // actual sum + s = s ^ r; // determine carry-ins for each bit position + s = s & 0x00010000; // carry-in to high word (= carry-out from low word) + r = r - s; // subtract out carry-out from low word + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsub2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vsub2.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vsub.u32.u32.u32.sat %0.h0, %1.h0, %2.h0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vsub.u32.u32.u32.sat %0.h1, %1.h1, %2.h1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s; + s = a ^ b; // sum bits + r = a - b; // actual sum + s = s ^ r; // determine carry-ins for each bit position + s = s & 0x00010000; // borrow to high word + r = r + s; // compensate for borrow from low word + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vabsdiff2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vabsdiff2.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vabsdiff.u32.u32.u32.sat %0.h0, %1.h0, %2.h0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vabsdiff.u32.u32.u32.sat %0.h1, %1.h1, %2.h1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s, t, u, v; + s = a & 0x0000ffff; // extract low halfword + r = b & 0x0000ffff; // extract low halfword + u = ::max(r, s); // maximum of low halfwords + v = ::min(r, s); // minimum of low halfwords + s = a & 0xffff0000; // extract high halfword + r = b & 0xffff0000; // extract high halfword + t = ::max(r, s); // maximum of high halfwords + s = ::min(r, s); // minimum of high halfwords + r = u | t; // maximum of both halfwords + s = v | s; // minimum of both halfwords + r = r - s; // |a - b| = max(a,b) - min(a,b); + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vavg2(unsigned int a, unsigned int b) + { + unsigned int r, s; + + // HAKMEM #23: a + b = 2 * (a & b) + (a ^ b) ==> + // (a + b) / 2 = (a & b) + ((a ^ b) >> 1) + s = a ^ b; + r = a & b; + s = s & 0xfffefffe; // ensure shift doesn't cross halfword boundaries + s = s >> 1; + s = r + s; + + return s; + } + + static __device__ __forceinline__ unsigned int vavrg2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vavrg2.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // HAKMEM #23: a + b = 2 * (a | b) - (a ^ b) ==> + // (a + b + 1) / 2 = (a | b) - ((a ^ b) >> 1) + unsigned int s; + s = a ^ b; + r = a | b; + s = s & 0xfffefffe; // ensure shift doesn't cross half-word boundaries + s = s >> 1; + r = r - s; + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vseteq2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset2.u32.u32.eq %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + unsigned int c; + r = a ^ b; // 0x0000 if a == b + c = r | 0x80008000; // set msbs, to catch carry out + r = r ^ c; // extract msbs, msb = 1 if r < 0x8000 + c = c - 0x00010001; // msb = 0, if r was 0x0000 or 0x8000 + c = r & ~c; // msb = 1, if r was 0x0000 + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpeq2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vseteq2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + r = a ^ b; // 0x0000 if a == b + c = r | 0x80008000; // set msbs, to catch carry out + r = r ^ c; // extract msbs, msb = 1 if r < 0x8000 + c = c - 0x00010001; // msb = 0, if r was 0x0000 or 0x8000 + c = r & ~c; // msb = 1, if r was 0x0000 + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetge2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset2.u32.u32.ge %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavrg2(a, b); // (a + ~b + 1) / 2 = (a - b) / 2 + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpge2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetge2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavrg2(a, b); // (a + ~b + 1) / 2 = (a - b) / 2 + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetgt2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset2.u32.u32.gt %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavg2(a, b); // (a + ~b) / 2 = (a - b) / 2 [rounded down] + c = c & 0x80008000; // msbs = carry-outs + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpgt2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetgt2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavg2(a, b); // (a + ~b) / 2 = (a - b) / 2 [rounded down] + c = c & 0x80008000; // msbs = carry-outs + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetle2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset2.u32.u32.le %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavrg2(a, b); // (b + ~a + 1) / 2 = (b - a) / 2 + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmple2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetle2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavrg2(a, b); // (b + ~a + 1) / 2 = (b - a) / 2 + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetlt2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset2.u32.u32.lt %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavg2(a, b); // (b + ~a) / 2 = (b - a) / 2 [rounded down] + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmplt2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetlt2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavg2(a, b); // (b + ~a) / 2 = (b - a) / 2 [rounded down] + c = c & 0x80008000; // msb = carry-outs + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetne2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm ("vset2.u32.u32.ne %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + unsigned int c; + r = a ^ b; // 0x0000 if a == b + c = r | 0x80008000; // set msbs, to catch carry out + c = c - 0x00010001; // msb = 0, if r was 0x0000 or 0x8000 + c = r | c; // msb = 1, if r was not 0x0000 + c = c & 0x80008000; // extract msbs + r = c >> 15; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpne2(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetne2(a, b); + c = r << 16; // convert bool + r = c - r; // into mask + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + r = a ^ b; // 0x0000 if a == b + c = r | 0x80008000; // set msbs, to catch carry out + c = c - 0x00010001; // msb = 0, if r was 0x0000 or 0x8000 + c = r | c; // msb = 1, if r was not 0x0000 + c = c & 0x80008000; // extract msbs + r = c >> 15; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vmax2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vmax2.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vmax.u32.u32.u32 %0.h0, %1.h0, %2.h0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmax.u32.u32.u32 %0.h1, %1.h1, %2.h1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s, t, u; + r = a & 0x0000ffff; // extract low halfword + s = b & 0x0000ffff; // extract low halfword + t = ::max(r, s); // maximum of low halfwords + r = a & 0xffff0000; // extract high halfword + s = b & 0xffff0000; // extract high halfword + u = ::max(r, s); // maximum of high halfwords + r = t | u; // combine halfword maximums + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vmin2(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vmin2.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vmin.u32.u32.u32 %0.h0, %1.h0, %2.h0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmin.u32.u32.u32 %0.h1, %1.h1, %2.h1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s, t, u; + r = a & 0x0000ffff; // extract low halfword + s = b & 0x0000ffff; // extract low halfword + t = ::min(r, s); // minimum of low halfwords + r = a & 0xffff0000; // extract high halfword + s = b & 0xffff0000; // extract high halfword + u = ::min(r, s); // minimum of high halfwords + r = t | u; // combine halfword minimums + #endif + + return r; + } + + // 4 + + static __device__ __forceinline__ unsigned int vadd4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vadd4.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vadd.u32.u32.u32.sat %0.b0, %1.b0, %2.b0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vadd.u32.u32.u32.sat %0.b1, %1.b1, %2.b1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vadd.u32.u32.u32.sat %0.b2, %1.b2, %2.b2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vadd.u32.u32.u32.sat %0.b3, %1.b3, %2.b3, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s, t; + s = a ^ b; // sum bits + r = a & 0x7f7f7f7f; // clear msbs + t = b & 0x7f7f7f7f; // clear msbs + s = s & 0x80808080; // msb sum bits + r = r + t; // add without msbs, record carry-out in msbs + r = r ^ s; // sum of msb sum and carry-in bits, w/o carry-out + #endif /* __CUDA_ARCH__ >= 300 */ + + return r; + } + + static __device__ __forceinline__ unsigned int vsub4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vsub4.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vsub.u32.u32.u32.sat %0.b0, %1.b0, %2.b0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vsub.u32.u32.u32.sat %0.b1, %1.b1, %2.b1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vsub.u32.u32.u32.sat %0.b2, %1.b2, %2.b2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vsub.u32.u32.u32.sat %0.b3, %1.b3, %2.b3, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s, t; + s = a ^ ~b; // inverted sum bits + r = a | 0x80808080; // set msbs + t = b & 0x7f7f7f7f; // clear msbs + s = s & 0x80808080; // inverted msb sum bits + r = r - t; // subtract w/o msbs, record inverted borrows in msb + r = r ^ s; // combine inverted msb sum bits and borrows + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vavg4(unsigned int a, unsigned int b) + { + unsigned int r, s; + + // HAKMEM #23: a + b = 2 * (a & b) + (a ^ b) ==> + // (a + b) / 2 = (a & b) + ((a ^ b) >> 1) + s = a ^ b; + r = a & b; + s = s & 0xfefefefe; // ensure following shift doesn't cross byte boundaries + s = s >> 1; + s = r + s; + + return s; + } + + static __device__ __forceinline__ unsigned int vavrg4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vavrg4.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // HAKMEM #23: a + b = 2 * (a | b) - (a ^ b) ==> + // (a + b + 1) / 2 = (a | b) - ((a ^ b) >> 1) + unsigned int c; + c = a ^ b; + r = a | b; + c = c & 0xfefefefe; // ensure following shift doesn't cross byte boundaries + c = c >> 1; + r = r - c; + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vseteq4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.eq %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + unsigned int c; + r = a ^ b; // 0x00 if a == b + c = r | 0x80808080; // set msbs, to catch carry out + r = r ^ c; // extract msbs, msb = 1 if r < 0x80 + c = c - 0x01010101; // msb = 0, if r was 0x00 or 0x80 + c = r & ~c; // msb = 1, if r was 0x00 + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpeq4(unsigned int a, unsigned int b) + { + unsigned int r, t; + + #if __CUDA_ARCH__ >= 300 + r = vseteq4(a, b); + t = r << 8; // convert bool + r = t - r; // to mask + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + t = a ^ b; // 0x00 if a == b + r = t | 0x80808080; // set msbs, to catch carry out + t = t ^ r; // extract msbs, msb = 1 if t < 0x80 + r = r - 0x01010101; // msb = 0, if t was 0x00 or 0x80 + r = t & ~r; // msb = 1, if t was 0x00 + t = r >> 7; // build mask + t = r - t; // from + r = t | r; // msbs + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetle4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.le %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavrg4(a, b); // (b + ~a + 1) / 2 = (b - a) / 2 + c = c & 0x80808080; // msb = carry-outs + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmple4(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetle4(a, b); + c = r << 8; // convert bool + r = c - r; // to mask + #else + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavrg4(a, b); // (b + ~a + 1) / 2 = (b - a) / 2 + c = c & 0x80808080; // msbs = carry-outs + r = c >> 7; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetlt4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.lt %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavg4(a, b); // (b + ~a) / 2 = (b - a) / 2 [rounded down] + c = c & 0x80808080; // msb = carry-outs + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmplt4(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetlt4(a, b); + c = r << 8; // convert bool + r = c - r; // to mask + #else + asm("not.b32 %0, %0;" : "+r"(a)); + c = vavg4(a, b); // (b + ~a) / 2 = (b - a) / 2 [rounded down] + c = c & 0x80808080; // msbs = carry-outs + r = c >> 7; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetge4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.ge %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavrg4(a, b); // (a + ~b + 1) / 2 = (a - b) / 2 + c = c & 0x80808080; // msb = carry-outs + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpge4(unsigned int a, unsigned int b) + { + unsigned int r, s; + + #if __CUDA_ARCH__ >= 300 + r = vsetge4(a, b); + s = r << 8; // convert bool + r = s - r; // to mask + #else + asm ("not.b32 %0,%0;" : "+r"(b)); + r = vavrg4 (a, b); // (a + ~b + 1) / 2 = (a - b) / 2 + r = r & 0x80808080; // msb = carry-outs + s = r >> 7; // build mask + s = r - s; // from + r = s | r; // msbs + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetgt4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.gt %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int c; + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavg4(a, b); // (a + ~b) / 2 = (a - b) / 2 [rounded down] + c = c & 0x80808080; // msb = carry-outs + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpgt4(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetgt4(a, b); + c = r << 8; // convert bool + r = c - r; // to mask + #else + asm("not.b32 %0, %0;" : "+r"(b)); + c = vavg4(a, b); // (a + ~b) / 2 = (a - b) / 2 [rounded down] + c = c & 0x80808080; // msb = carry-outs + r = c >> 7; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vsetne4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vset4.u32.u32.ne %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + unsigned int c; + r = a ^ b; // 0x00 if a == b + c = r | 0x80808080; // set msbs, to catch carry out + c = c - 0x01010101; // msb = 0, if r was 0x00 or 0x80 + c = r | c; // msb = 1, if r was not 0x00 + c = c & 0x80808080; // extract msbs + r = c >> 7; // convert to bool + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vcmpne4(unsigned int a, unsigned int b) + { + unsigned int r, c; + + #if __CUDA_ARCH__ >= 300 + r = vsetne4(a, b); + c = r << 8; // convert bool + r = c - r; // to mask + #else + // inspired by Alan Mycroft's null-byte detection algorithm: + // null_byte(x) = ((x - 0x01010101) & (~x & 0x80808080)) + r = a ^ b; // 0x00 if a == b + c = r | 0x80808080; // set msbs, to catch carry out + c = c - 0x01010101; // msb = 0, if r was 0x00 or 0x80 + c = r | c; // msb = 1, if r was not 0x00 + c = c & 0x80808080; // extract msbs + r = c >> 7; // convert + r = c - r; // msbs to + r = c | r; // mask + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vabsdiff4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vabsdiff4.u32.u32.u32.sat %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vabsdiff.u32.u32.u32.sat %0.b0, %1.b0, %2.b0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vabsdiff.u32.u32.u32.sat %0.b1, %1.b1, %2.b1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vabsdiff.u32.u32.u32.sat %0.b2, %1.b2, %2.b2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vabsdiff.u32.u32.u32.sat %0.b3, %1.b3, %2.b3, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s; + s = vcmpge4(a, b); // mask = 0xff if a >= b + r = a ^ b; // + s = (r & s) ^ b; // select a when a >= b, else select b => max(a,b) + r = s ^ r; // select a when b >= a, else select b => min(a,b) + r = s - r; // |a - b| = max(a,b) - min(a,b); + #endif + + return r; + } + + static __device__ __forceinline__ unsigned int vmax4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vmax4.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vmax.u32.u32.u32 %0.b0, %1.b0, %2.b0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmax.u32.u32.u32 %0.b1, %1.b1, %2.b1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmax.u32.u32.u32 %0.b2, %1.b2, %2.b2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmax.u32.u32.u32 %0.b3, %1.b3, %2.b3, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s; + s = vcmpge4(a, b); // mask = 0xff if a >= b + r = a & s; // select a when b >= a + s = b & ~s; // select b when b < a + r = r | s; // combine byte selections + #endif + + return r; // byte-wise unsigned maximum + } + + static __device__ __forceinline__ unsigned int vmin4(unsigned int a, unsigned int b) + { + unsigned int r = 0; + + #if __CUDA_ARCH__ >= 300 + asm("vmin4.u32.u32.u32 %0, %1, %2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #elif __CUDA_ARCH__ >= 200 + asm("vmin.u32.u32.u32 %0.b0, %1.b0, %2.b0, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmin.u32.u32.u32 %0.b1, %1.b1, %2.b1, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmin.u32.u32.u32 %0.b2, %1.b2, %2.b2, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + asm("vmin.u32.u32.u32 %0.b3, %1.b3, %2.b3, %3;" : "=r"(r) : "r"(a), "r"(b), "r"(r)); + #else + unsigned int s; + s = vcmpge4(b, a); // mask = 0xff if a >= b + r = a & s; // select a when b >= a + s = b & ~s; // select b when b < a + r = r | s; // combine byte selections + #endif + + return r; + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_SIMD_FUNCTIONS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/transform.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/transform.hpp new file mode 100644 index 0000000..42aa6ea --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/transform.hpp @@ -0,0 +1,75 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_TRANSFORM_HPP +#define OPENCV_CUDA_TRANSFORM_HPP + +#include "common.hpp" +#include "utility.hpp" +#include "detail/transform_detail.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template + static inline void transform(PtrStepSz src, PtrStepSz dst, UnOp op, const Mask& mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + transform_detail::TransformDispatcher::cn == 1 && VecTraits::cn == 1 && ft::smart_shift != 1>::call(src, dst, op, mask, stream); + } + + template + static inline void transform(PtrStepSz src1, PtrStepSz src2, PtrStepSz dst, BinOp op, const Mask& mask, cudaStream_t stream) + { + typedef TransformFunctorTraits ft; + transform_detail::TransformDispatcher::cn == 1 && VecTraits::cn == 1 && VecTraits::cn == 1 && ft::smart_shift != 1>::call(src1, src2, dst, op, mask, stream); + } +}}} + +//! @endcond + +#endif // OPENCV_CUDA_TRANSFORM_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/type_traits.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/type_traits.hpp new file mode 100644 index 0000000..8b7a3fd --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/type_traits.hpp @@ -0,0 +1,90 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_TYPE_TRAITS_HPP +#define OPENCV_CUDA_TYPE_TRAITS_HPP + +#include "detail/type_traits_detail.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template struct IsSimpleParameter + { + enum {value = type_traits_detail::IsIntegral::value || type_traits_detail::IsFloat::value || + type_traits_detail::PointerTraits::type>::value}; + }; + + template struct TypeTraits + { + typedef typename type_traits_detail::UnConst::type NonConstType; + typedef typename type_traits_detail::UnVolatile::type NonVolatileType; + typedef typename type_traits_detail::UnVolatile::type>::type UnqualifiedType; + typedef typename type_traits_detail::PointerTraits::type PointeeType; + typedef typename type_traits_detail::ReferenceTraits::type ReferredType; + + enum { isConst = type_traits_detail::UnConst::value }; + enum { isVolatile = type_traits_detail::UnVolatile::value }; + + enum { isReference = type_traits_detail::ReferenceTraits::value }; + enum { isPointer = type_traits_detail::PointerTraits::type>::value }; + + enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral::value }; + enum { isSignedInt = type_traits_detail::IsSignedIntergral::value }; + enum { isIntegral = type_traits_detail::IsIntegral::value }; + enum { isFloat = type_traits_detail::IsFloat::value }; + enum { isArith = isIntegral || isFloat }; + enum { isVec = type_traits_detail::IsVec::value }; + + typedef typename type_traits_detail::Select::value, + T, typename type_traits_detail::AddParameterType::type>::type ParameterType; + }; +}}} + +//! @endcond + +#endif // OPENCV_CUDA_TYPE_TRAITS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/utility.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/utility.hpp new file mode 100644 index 0000000..7f5db48 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/utility.hpp @@ -0,0 +1,230 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_UTILITY_HPP +#define OPENCV_CUDA_UTILITY_HPP + +#include "saturate_cast.hpp" +#include "datamov_utils.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + struct CV_EXPORTS ThrustAllocator + { + typedef uchar value_type; + virtual ~ThrustAllocator(); + virtual __device__ __host__ uchar* allocate(size_t numBytes) = 0; + virtual __device__ __host__ void deallocate(uchar* ptr, size_t numBytes) = 0; + static ThrustAllocator& getAllocator(); + static void setAllocator(ThrustAllocator* allocator); + }; + #define OPENCV_CUDA_LOG_WARP_SIZE (5) + #define OPENCV_CUDA_WARP_SIZE (1 << OPENCV_CUDA_LOG_WARP_SIZE) + #define OPENCV_CUDA_LOG_MEM_BANKS ((__CUDA_ARCH__ >= 200) ? 5 : 4) // 32 banks on fermi, 16 on tesla + #define OPENCV_CUDA_MEM_BANKS (1 << OPENCV_CUDA_LOG_MEM_BANKS) + + /////////////////////////////////////////////////////////////////////////////// + // swap + + template void __device__ __host__ __forceinline__ swap(T& a, T& b) + { + const T temp = a; + a = b; + b = temp; + } + + /////////////////////////////////////////////////////////////////////////////// + // Mask Reader + + struct SingleMask + { + explicit __host__ __device__ __forceinline__ SingleMask(PtrStepb mask_) : mask(mask_) {} + __host__ __device__ __forceinline__ SingleMask(const SingleMask& mask_): mask(mask_.mask){} + + __device__ __forceinline__ bool operator()(int y, int x) const + { + return mask.ptr(y)[x] != 0; + } + + PtrStepb mask; + }; + + struct SingleMaskChannels + { + __host__ __device__ __forceinline__ SingleMaskChannels(PtrStepb mask_, int channels_) + : mask(mask_), channels(channels_) {} + __host__ __device__ __forceinline__ SingleMaskChannels(const SingleMaskChannels& mask_) + :mask(mask_.mask), channels(mask_.channels){} + + __device__ __forceinline__ bool operator()(int y, int x) const + { + return mask.ptr(y)[x / channels] != 0; + } + + PtrStepb mask; + int channels; + }; + + struct MaskCollection + { + explicit __host__ __device__ __forceinline__ MaskCollection(PtrStepb* maskCollection_) + : maskCollection(maskCollection_) {} + + __device__ __forceinline__ MaskCollection(const MaskCollection& masks_) + : maskCollection(masks_.maskCollection), curMask(masks_.curMask){} + + __device__ __forceinline__ void next() + { + curMask = *maskCollection++; + } + __device__ __forceinline__ void setMask(int z) + { + curMask = maskCollection[z]; + } + + __device__ __forceinline__ bool operator()(int y, int x) const + { + uchar val; + return curMask.data == 0 || (ForceGlob::Load(curMask.ptr(y), x, val), (val != 0)); + } + + const PtrStepb* maskCollection; + PtrStepb curMask; + }; + + struct WithOutMask + { + __host__ __device__ __forceinline__ WithOutMask(){} + __host__ __device__ __forceinline__ WithOutMask(const WithOutMask&){} + + __device__ __forceinline__ void next() const + { + } + __device__ __forceinline__ void setMask(int) const + { + } + + __device__ __forceinline__ bool operator()(int, int) const + { + return true; + } + + __device__ __forceinline__ bool operator()(int, int, int) const + { + return true; + } + + static __device__ __forceinline__ bool check(int, int) + { + return true; + } + + static __device__ __forceinline__ bool check(int, int, int) + { + return true; + } + }; + + /////////////////////////////////////////////////////////////////////////////// + // Solve linear system + + // solve 2x2 linear system Ax=b + template __device__ __forceinline__ bool solve2x2(const T A[2][2], const T b[2], T x[2]) + { + T det = A[0][0] * A[1][1] - A[1][0] * A[0][1]; + + if (det != 0) + { + double invdet = 1.0 / det; + + x[0] = saturate_cast(invdet * (b[0] * A[1][1] - b[1] * A[0][1])); + + x[1] = saturate_cast(invdet * (A[0][0] * b[1] - A[1][0] * b[0])); + + return true; + } + + return false; + } + + // solve 3x3 linear system Ax=b + template __device__ __forceinline__ bool solve3x3(const T A[3][3], const T b[3], T x[3]) + { + T det = A[0][0] * (A[1][1] * A[2][2] - A[1][2] * A[2][1]) + - A[0][1] * (A[1][0] * A[2][2] - A[1][2] * A[2][0]) + + A[0][2] * (A[1][0] * A[2][1] - A[1][1] * A[2][0]); + + if (det != 0) + { + double invdet = 1.0 / det; + + x[0] = saturate_cast(invdet * + (b[0] * (A[1][1] * A[2][2] - A[1][2] * A[2][1]) - + A[0][1] * (b[1] * A[2][2] - A[1][2] * b[2] ) + + A[0][2] * (b[1] * A[2][1] - A[1][1] * b[2] ))); + + x[1] = saturate_cast(invdet * + (A[0][0] * (b[1] * A[2][2] - A[1][2] * b[2] ) - + b[0] * (A[1][0] * A[2][2] - A[1][2] * A[2][0]) + + A[0][2] * (A[1][0] * b[2] - b[1] * A[2][0]))); + + x[2] = saturate_cast(invdet * + (A[0][0] * (A[1][1] * b[2] - b[1] * A[2][1]) - + A[0][1] * (A[1][0] * b[2] - b[1] * A[2][0]) + + b[0] * (A[1][0] * A[2][1] - A[1][1] * A[2][0]))); + + return true; + } + + return false; + } +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_UTILITY_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/vec_distance.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_distance.hpp new file mode 100644 index 0000000..ef6e510 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_distance.hpp @@ -0,0 +1,232 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_VEC_DISTANCE_HPP +#define OPENCV_CUDA_VEC_DISTANCE_HPP + +#include "reduce.hpp" +#include "functional.hpp" +#include "detail/vec_distance_detail.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template struct L1Dist + { + typedef int value_type; + typedef int result_type; + + __device__ __forceinline__ L1Dist() : mySum(0) {} + + __device__ __forceinline__ void reduceIter(int val1, int val2) + { + mySum = __sad(val1, val2, mySum); + } + + template __device__ __forceinline__ void reduceAll(int* smem, int tid) + { + reduce(smem, mySum, tid, plus()); + } + + __device__ __forceinline__ operator int() const + { + return mySum; + } + + int mySum; + }; + template <> struct L1Dist + { + typedef float value_type; + typedef float result_type; + + __device__ __forceinline__ L1Dist() : mySum(0.0f) {} + + __device__ __forceinline__ void reduceIter(float val1, float val2) + { + mySum += ::fabs(val1 - val2); + } + + template __device__ __forceinline__ void reduceAll(float* smem, int tid) + { + reduce(smem, mySum, tid, plus()); + } + + __device__ __forceinline__ operator float() const + { + return mySum; + } + + float mySum; + }; + + struct L2Dist + { + typedef float value_type; + typedef float result_type; + + __device__ __forceinline__ L2Dist() : mySum(0.0f) {} + + __device__ __forceinline__ void reduceIter(float val1, float val2) + { + float reg = val1 - val2; + mySum += reg * reg; + } + + template __device__ __forceinline__ void reduceAll(float* smem, int tid) + { + reduce(smem, mySum, tid, plus()); + } + + __device__ __forceinline__ operator float() const + { + return sqrtf(mySum); + } + + float mySum; + }; + + struct HammingDist + { + typedef int value_type; + typedef int result_type; + + __device__ __forceinline__ HammingDist() : mySum(0) {} + + __device__ __forceinline__ void reduceIter(int val1, int val2) + { + mySum += __popc(val1 ^ val2); + } + + template __device__ __forceinline__ void reduceAll(int* smem, int tid) + { + reduce(smem, mySum, tid, plus()); + } + + __device__ __forceinline__ operator int() const + { + return mySum; + } + + int mySum; + }; + + // calc distance between two vectors in global memory + template + __device__ void calcVecDiffGlobal(const T1* vec1, const T2* vec2, int len, Dist& dist, typename Dist::result_type* smem, int tid) + { + for (int i = tid; i < len; i += THREAD_DIM) + { + T1 val1; + ForceGlob::Load(vec1, i, val1); + + T2 val2; + ForceGlob::Load(vec2, i, val2); + + dist.reduceIter(val1, val2); + } + + dist.reduceAll(smem, tid); + } + + // calc distance between two vectors, first vector is cached in register or shared memory, second vector is in global memory + template + __device__ __forceinline__ void calcVecDiffCached(const T1* vecCached, const T2* vecGlob, int len, Dist& dist, typename Dist::result_type* smem, int tid) + { + vec_distance_detail::VecDiffCachedCalculator::calc(vecCached, vecGlob, len, dist, tid); + + dist.reduceAll(smem, tid); + } + + // calc distance between two vectors in global memory + template struct VecDiffGlobal + { + explicit __device__ __forceinline__ VecDiffGlobal(const T1* vec1_, int = 0, void* = 0, int = 0, int = 0) + { + vec1 = vec1_; + } + + template + __device__ __forceinline__ void calc(const T2* vec2, int len, Dist& dist, typename Dist::result_type* smem, int tid) const + { + calcVecDiffGlobal(vec1, vec2, len, dist, smem, tid); + } + + const T1* vec1; + }; + + // calc distance between two vectors, first vector is cached in register memory, second vector is in global memory + template struct VecDiffCachedRegister + { + template __device__ __forceinline__ VecDiffCachedRegister(const T1* vec1, int len, U* smem, int glob_tid, int tid) + { + if (glob_tid < len) + smem[glob_tid] = vec1[glob_tid]; + __syncthreads(); + + U* vec1ValsPtr = vec1Vals; + + #pragma unroll + for (int i = tid; i < MAX_LEN; i += THREAD_DIM) + *vec1ValsPtr++ = smem[i]; + + __syncthreads(); + } + + template + __device__ __forceinline__ void calc(const T2* vec2, int len, Dist& dist, typename Dist::result_type* smem, int tid) const + { + calcVecDiffCached(vec1Vals, vec2, len, dist, smem, tid); + } + + U vec1Vals[MAX_LEN / THREAD_DIM]; + }; +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_VEC_DISTANCE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/vec_math.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_math.hpp new file mode 100644 index 0000000..80b1303 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_math.hpp @@ -0,0 +1,923 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_VECMATH_HPP +#define OPENCV_CUDA_VECMATH_HPP + +#include "vec_traits.hpp" +#include "saturate_cast.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + +// saturate_cast + +namespace vec_math_detail +{ + template struct SatCastHelper; + template struct SatCastHelper<1, VecD> + { + template static __device__ __forceinline__ VecD cast(const VecS& v) + { + typedef typename VecTraits::elem_type D; + return VecTraits::make(saturate_cast(v.x)); + } + }; + template struct SatCastHelper<2, VecD> + { + template static __device__ __forceinline__ VecD cast(const VecS& v) + { + typedef typename VecTraits::elem_type D; + return VecTraits::make(saturate_cast(v.x), saturate_cast(v.y)); + } + }; + template struct SatCastHelper<3, VecD> + { + template static __device__ __forceinline__ VecD cast(const VecS& v) + { + typedef typename VecTraits::elem_type D; + return VecTraits::make(saturate_cast(v.x), saturate_cast(v.y), saturate_cast(v.z)); + } + }; + template struct SatCastHelper<4, VecD> + { + template static __device__ __forceinline__ VecD cast(const VecS& v) + { + typedef typename VecTraits::elem_type D; + return VecTraits::make(saturate_cast(v.x), saturate_cast(v.y), saturate_cast(v.z), saturate_cast(v.w)); + } + }; + + template static __device__ __forceinline__ VecD saturate_cast_helper(const VecS& v) + { + return SatCastHelper::cn, VecD>::cast(v); + } +} + +template static __device__ __forceinline__ T saturate_cast(const uchar1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const char1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const ushort1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const short1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const uint1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const int1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const float1& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const double1& v) {return vec_math_detail::saturate_cast_helper(v);} + +template static __device__ __forceinline__ T saturate_cast(const uchar2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const char2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const ushort2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const short2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const uint2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const int2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const float2& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const double2& v) {return vec_math_detail::saturate_cast_helper(v);} + +template static __device__ __forceinline__ T saturate_cast(const uchar3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const char3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const ushort3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const short3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const uint3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const int3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const float3& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const double3& v) {return vec_math_detail::saturate_cast_helper(v);} + +template static __device__ __forceinline__ T saturate_cast(const uchar4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const char4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const ushort4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const short4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const uint4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const int4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const float4& v) {return vec_math_detail::saturate_cast_helper(v);} +template static __device__ __forceinline__ T saturate_cast(const double4& v) {return vec_math_detail::saturate_cast_helper(v);} + +// unary operators + +#define CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(op, input_type, output_type) \ + __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a) \ + { \ + return VecTraits::make(op (a.x)); \ + } \ + __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a) \ + { \ + return VecTraits::make(op (a.x), op (a.y)); \ + } \ + __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a) \ + { \ + return VecTraits::make(op (a.x), op (a.y), op (a.z)); \ + } \ + __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a) \ + { \ + return VecTraits::make(op (a.x), op (a.y), op (a.z), op (a.w)); \ + } + +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, char, char) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, short, short) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, int, int) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(-, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(!, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, char, char) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, short, short) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, int, int) +CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, uint, uint) + +#undef CV_CUDEV_IMPLEMENT_VEC_UNARY_OP + +// unary functions + +#define CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(func_name, func, input_type, output_type) \ + __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a) \ + { \ + return VecTraits::make(func (a.x)); \ + } \ + __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a) \ + { \ + return VecTraits::make(func (a.x), func (a.y)); \ + } \ + __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a) \ + { \ + return VecTraits::make(func (a.x), func (a.y), func (a.z)); \ + } \ + __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a) \ + { \ + return VecTraits::make(func (a.x), func (a.y), func (a.z), func (a.w)); \ + } + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(abs, ::fabsf, float, float) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrtf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sqrt, ::sqrt, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::expf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp, ::exp, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2f, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp2, ::exp2, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10f, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(exp10, ::exp10, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::logf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log, ::log, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2f, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log2, ::log2, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10f, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(log10, ::log10, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sinf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sin, ::sin, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cosf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cos, ::cos, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tanf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tan, ::tan, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asinf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asin, ::asin, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acosf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acos, ::acos, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atanf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atan, ::atan, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinhf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(sinh, ::sinh, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::coshf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(cosh, ::cosh, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanhf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(tanh, ::tanh, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinhf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(asinh, ::asinh, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acoshf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(acosh, ::acosh, double, double) + +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, char, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, short, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, int, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanhf, float, float) +CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC(atanh, ::atanh, double, double) + +#undef CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC + +// binary operators (vec & vec) + +#define CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(op, input_type, output_type) \ + __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a, const input_type ## 1 & b) \ + { \ + return VecTraits::make(a.x op b.x); \ + } \ + __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a, const input_type ## 2 & b) \ + { \ + return VecTraits::make(a.x op b.x, a.y op b.y); \ + } \ + __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a, const input_type ## 3 & b) \ + { \ + return VecTraits::make(a.x op b.x, a.y op b.y, a.z op b.z); \ + } \ + __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a, const input_type ## 4 & b) \ + { \ + return VecTraits::make(a.x op b.x, a.y op b.y, a.z op b.z, a.w op b.w); \ + } + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, uchar, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, char, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, ushort, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, short, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(+, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, uchar, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, char, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, ushort, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, short, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(-, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, uchar, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, char, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, ushort, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, short, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(*, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, uchar, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, char, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, ushort, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, short, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(/, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(==, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(!=, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(>=, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(<=, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&&, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, char, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, ushort, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, short, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, int, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, uint, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, float, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(||, double, uchar) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, char, char) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, short, short) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(&, uint, uint) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, char, char) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, short, short) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(|, uint, uint) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, char, char) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, short, short) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_OP(^, uint, uint) + +#undef CV_CUDEV_IMPLEMENT_VEC_BINARY_OP + +// binary operators (vec & scalar) + +#define CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(op, input_type, scalar_type, output_type) \ + __device__ __forceinline__ output_type ## 1 operator op(const input_type ## 1 & a, scalar_type s) \ + { \ + return VecTraits::make(a.x op s); \ + } \ + __device__ __forceinline__ output_type ## 1 operator op(scalar_type s, const input_type ## 1 & b) \ + { \ + return VecTraits::make(s op b.x); \ + } \ + __device__ __forceinline__ output_type ## 2 operator op(const input_type ## 2 & a, scalar_type s) \ + { \ + return VecTraits::make(a.x op s, a.y op s); \ + } \ + __device__ __forceinline__ output_type ## 2 operator op(scalar_type s, const input_type ## 2 & b) \ + { \ + return VecTraits::make(s op b.x, s op b.y); \ + } \ + __device__ __forceinline__ output_type ## 3 operator op(const input_type ## 3 & a, scalar_type s) \ + { \ + return VecTraits::make(a.x op s, a.y op s, a.z op s); \ + } \ + __device__ __forceinline__ output_type ## 3 operator op(scalar_type s, const input_type ## 3 & b) \ + { \ + return VecTraits::make(s op b.x, s op b.y, s op b.z); \ + } \ + __device__ __forceinline__ output_type ## 4 operator op(const input_type ## 4 & a, scalar_type s) \ + { \ + return VecTraits::make(a.x op s, a.y op s, a.z op s, a.w op s); \ + } \ + __device__ __forceinline__ output_type ## 4 operator op(scalar_type s, const input_type ## 4 & b) \ + { \ + return VecTraits::make(s op b.x, s op b.y, s op b.z, s op b.w); \ + } + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(+, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(-, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(*, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(/, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(==, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(!=, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(>=, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(<=, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&&, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, char, char, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, ushort, ushort, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, short, short, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, int, int, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, uint, uint, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, float, float, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(||, double, double, uchar) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, char, char, char) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, ushort, ushort, ushort) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, short, short, short) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(&, uint, uint, uint) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, char, char, char) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, ushort, ushort, ushort) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, short, short, short) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(|, uint, uint, uint) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, char, char, char) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, ushort, ushort, ushort) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, short, short, short) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP(^, uint, uint, uint) + +#undef CV_CUDEV_IMPLEMENT_SCALAR_BINARY_OP + +// binary function (vec & vec) + +#define CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(func_name, func, input_type, output_type) \ + __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a, const input_type ## 1 & b) \ + { \ + return VecTraits::make(func (a.x, b.x)); \ + } \ + __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a, const input_type ## 2 & b) \ + { \ + return VecTraits::make(func (a.x, b.x), func (a.y, b.y)); \ + } \ + __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a, const input_type ## 3 & b) \ + { \ + return VecTraits::make(func (a.x, b.x), func (a.y, b.y), func (a.z, b.z)); \ + } \ + __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a, const input_type ## 4 & b) \ + { \ + return VecTraits::make(func (a.x, b.x), func (a.y, b.y), func (a.z, b.z), func (a.w, b.w)); \ + } + +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, char, char) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, short, short) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::max, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::fmaxf, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(max, ::fmax, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, uchar, uchar) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, char, char) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, ushort, ushort) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, short, short) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, uint, uint) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::min, int, int) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::fminf, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(min, ::fmin, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, char, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, short, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, uint, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, int, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypotf, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(hypot, ::hypot, double, double) + +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, uchar, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, char, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, ushort, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, short, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, uint, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, int, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2f, float, float) +CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC(atan2, ::atan2, double, double) + +#undef CV_CUDEV_IMPLEMENT_VEC_BINARY_FUNC + +// binary function (vec & scalar) + +#define CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(func_name, func, input_type, scalar_type, output_type) \ + __device__ __forceinline__ output_type ## 1 func_name(const input_type ## 1 & a, scalar_type s) \ + { \ + return VecTraits::make(func ((output_type) a.x, (output_type) s)); \ + } \ + __device__ __forceinline__ output_type ## 1 func_name(scalar_type s, const input_type ## 1 & b) \ + { \ + return VecTraits::make(func ((output_type) s, (output_type) b.x)); \ + } \ + __device__ __forceinline__ output_type ## 2 func_name(const input_type ## 2 & a, scalar_type s) \ + { \ + return VecTraits::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s)); \ + } \ + __device__ __forceinline__ output_type ## 2 func_name(scalar_type s, const input_type ## 2 & b) \ + { \ + return VecTraits::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y)); \ + } \ + __device__ __forceinline__ output_type ## 3 func_name(const input_type ## 3 & a, scalar_type s) \ + { \ + return VecTraits::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s), func ((output_type) a.z, (output_type) s)); \ + } \ + __device__ __forceinline__ output_type ## 3 func_name(scalar_type s, const input_type ## 3 & b) \ + { \ + return VecTraits::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y), func ((output_type) s, (output_type) b.z)); \ + } \ + __device__ __forceinline__ output_type ## 4 func_name(const input_type ## 4 & a, scalar_type s) \ + { \ + return VecTraits::make(func ((output_type) a.x, (output_type) s), func ((output_type) a.y, (output_type) s), func ((output_type) a.z, (output_type) s), func ((output_type) a.w, (output_type) s)); \ + } \ + __device__ __forceinline__ output_type ## 4 func_name(scalar_type s, const input_type ## 4 & b) \ + { \ + return VecTraits::make(func ((output_type) s, (output_type) b.x), func ((output_type) s, (output_type) b.y), func ((output_type) s, (output_type) b.z), func ((output_type) s, (output_type) b.w)); \ + } + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, char, char, char) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, ushort, ushort, ushort) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, short, short, short) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::max, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmaxf, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(max, ::fmax, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, uchar, uchar, uchar) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, char, char, char) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, ushort, ushort, ushort) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, short, short, short) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, uint, uint, uint) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::min, int, int, int) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fminf, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(min, ::fmin, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypotf, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(hypot, ::hypot, double, double, double) + +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, uchar, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, uchar, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, char, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, char, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, ushort, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, ushort, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, short, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, short, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, uint, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, uint, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, int, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, int, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2f, float, float, float) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, float, double, double) +CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC(atan2, ::atan2, double, double, double) + +#undef CV_CUDEV_IMPLEMENT_SCALAR_BINARY_FUNC + +}}} // namespace cv { namespace cuda { namespace device + +//! @endcond + +#endif // OPENCV_CUDA_VECMATH_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/vec_traits.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_traits.hpp new file mode 100644 index 0000000..b5ff281 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/vec_traits.hpp @@ -0,0 +1,288 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_VEC_TRAITS_HPP +#define OPENCV_CUDA_VEC_TRAITS_HPP + +#include "common.hpp" + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template struct TypeVec; + + struct __align__(8) uchar8 + { + uchar a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ uchar8 make_uchar8(uchar a0, uchar a1, uchar a2, uchar a3, uchar a4, uchar a5, uchar a6, uchar a7) + { + uchar8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(8) char8 + { + schar a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ char8 make_char8(schar a0, schar a1, schar a2, schar a3, schar a4, schar a5, schar a6, schar a7) + { + char8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(16) ushort8 + { + ushort a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ ushort8 make_ushort8(ushort a0, ushort a1, ushort a2, ushort a3, ushort a4, ushort a5, ushort a6, ushort a7) + { + ushort8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(16) short8 + { + short a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ short8 make_short8(short a0, short a1, short a2, short a3, short a4, short a5, short a6, short a7) + { + short8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(32) uint8 + { + uint a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ uint8 make_uint8(uint a0, uint a1, uint a2, uint a3, uint a4, uint a5, uint a6, uint a7) + { + uint8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(32) int8 + { + int a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ int8 make_int8(int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7) + { + int8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct __align__(32) float8 + { + float a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ float8 make_float8(float a0, float a1, float a2, float a3, float a4, float a5, float a6, float a7) + { + float8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + struct double8 + { + double a0, a1, a2, a3, a4, a5, a6, a7; + }; + static __host__ __device__ __forceinline__ double8 make_double8(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7) + { + double8 val = {a0, a1, a2, a3, a4, a5, a6, a7}; + return val; + } + +#define OPENCV_CUDA_IMPLEMENT_TYPE_VEC(type) \ + template<> struct TypeVec { typedef type vec_type; }; \ + template<> struct TypeVec { typedef type ## 1 vec_type; }; \ + template<> struct TypeVec { typedef type ## 2 vec_type; }; \ + template<> struct TypeVec { typedef type ## 2 vec_type; }; \ + template<> struct TypeVec { typedef type ## 3 vec_type; }; \ + template<> struct TypeVec { typedef type ## 3 vec_type; }; \ + template<> struct TypeVec { typedef type ## 4 vec_type; }; \ + template<> struct TypeVec { typedef type ## 4 vec_type; }; \ + template<> struct TypeVec { typedef type ## 8 vec_type; }; \ + template<> struct TypeVec { typedef type ## 8 vec_type; }; + + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(uchar) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(char) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(ushort) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(short) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(int) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(uint) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(float) + OPENCV_CUDA_IMPLEMENT_TYPE_VEC(double) + + #undef OPENCV_CUDA_IMPLEMENT_TYPE_VEC + + template<> struct TypeVec { typedef schar vec_type; }; + template<> struct TypeVec { typedef char2 vec_type; }; + template<> struct TypeVec { typedef char3 vec_type; }; + template<> struct TypeVec { typedef char4 vec_type; }; + template<> struct TypeVec { typedef char8 vec_type; }; + + template<> struct TypeVec { typedef uchar vec_type; }; + template<> struct TypeVec { typedef uchar2 vec_type; }; + template<> struct TypeVec { typedef uchar3 vec_type; }; + template<> struct TypeVec { typedef uchar4 vec_type; }; + template<> struct TypeVec { typedef uchar8 vec_type; }; + + template struct VecTraits; + +#define OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(type) \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=1}; \ + static __device__ __host__ __forceinline__ type all(type v) {return v;} \ + static __device__ __host__ __forceinline__ type make(type x) {return x;} \ + static __device__ __host__ __forceinline__ type make(const type* v) {return *v;} \ + }; \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=1}; \ + static __device__ __host__ __forceinline__ type ## 1 all(type v) {return make_ ## type ## 1(v);} \ + static __device__ __host__ __forceinline__ type ## 1 make(type x) {return make_ ## type ## 1(x);} \ + static __device__ __host__ __forceinline__ type ## 1 make(const type* v) {return make_ ## type ## 1(*v);} \ + }; \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=2}; \ + static __device__ __host__ __forceinline__ type ## 2 all(type v) {return make_ ## type ## 2(v, v);} \ + static __device__ __host__ __forceinline__ type ## 2 make(type x, type y) {return make_ ## type ## 2(x, y);} \ + static __device__ __host__ __forceinline__ type ## 2 make(const type* v) {return make_ ## type ## 2(v[0], v[1]);} \ + }; \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=3}; \ + static __device__ __host__ __forceinline__ type ## 3 all(type v) {return make_ ## type ## 3(v, v, v);} \ + static __device__ __host__ __forceinline__ type ## 3 make(type x, type y, type z) {return make_ ## type ## 3(x, y, z);} \ + static __device__ __host__ __forceinline__ type ## 3 make(const type* v) {return make_ ## type ## 3(v[0], v[1], v[2]);} \ + }; \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=4}; \ + static __device__ __host__ __forceinline__ type ## 4 all(type v) {return make_ ## type ## 4(v, v, v, v);} \ + static __device__ __host__ __forceinline__ type ## 4 make(type x, type y, type z, type w) {return make_ ## type ## 4(x, y, z, w);} \ + static __device__ __host__ __forceinline__ type ## 4 make(const type* v) {return make_ ## type ## 4(v[0], v[1], v[2], v[3]);} \ + }; \ + template<> struct VecTraits \ + { \ + typedef type elem_type; \ + enum {cn=8}; \ + static __device__ __host__ __forceinline__ type ## 8 all(type v) {return make_ ## type ## 8(v, v, v, v, v, v, v, v);} \ + static __device__ __host__ __forceinline__ type ## 8 make(type a0, type a1, type a2, type a3, type a4, type a5, type a6, type a7) {return make_ ## type ## 8(a0, a1, a2, a3, a4, a5, a6, a7);} \ + static __device__ __host__ __forceinline__ type ## 8 make(const type* v) {return make_ ## type ## 8(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]);} \ + }; + + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(uchar) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(ushort) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(short) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(int) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(uint) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(float) + OPENCV_CUDA_IMPLEMENT_VEC_TRAITS(double) + + #undef OPENCV_CUDA_IMPLEMENT_VEC_TRAITS + + template<> struct VecTraits + { + typedef char elem_type; + enum {cn=1}; + static __device__ __host__ __forceinline__ char all(char v) {return v;} + static __device__ __host__ __forceinline__ char make(char x) {return x;} + static __device__ __host__ __forceinline__ char make(const char* x) {return *x;} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=1}; + static __device__ __host__ __forceinline__ schar all(schar v) {return v;} + static __device__ __host__ __forceinline__ schar make(schar x) {return x;} + static __device__ __host__ __forceinline__ schar make(const schar* x) {return *x;} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=1}; + static __device__ __host__ __forceinline__ char1 all(schar v) {return make_char1(v);} + static __device__ __host__ __forceinline__ char1 make(schar x) {return make_char1(x);} + static __device__ __host__ __forceinline__ char1 make(const schar* v) {return make_char1(v[0]);} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=2}; + static __device__ __host__ __forceinline__ char2 all(schar v) {return make_char2(v, v);} + static __device__ __host__ __forceinline__ char2 make(schar x, schar y) {return make_char2(x, y);} + static __device__ __host__ __forceinline__ char2 make(const schar* v) {return make_char2(v[0], v[1]);} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=3}; + static __device__ __host__ __forceinline__ char3 all(schar v) {return make_char3(v, v, v);} + static __device__ __host__ __forceinline__ char3 make(schar x, schar y, schar z) {return make_char3(x, y, z);} + static __device__ __host__ __forceinline__ char3 make(const schar* v) {return make_char3(v[0], v[1], v[2]);} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=4}; + static __device__ __host__ __forceinline__ char4 all(schar v) {return make_char4(v, v, v, v);} + static __device__ __host__ __forceinline__ char4 make(schar x, schar y, schar z, schar w) {return make_char4(x, y, z, w);} + static __device__ __host__ __forceinline__ char4 make(const schar* v) {return make_char4(v[0], v[1], v[2], v[3]);} + }; + template<> struct VecTraits + { + typedef schar elem_type; + enum {cn=8}; + static __device__ __host__ __forceinline__ char8 all(schar v) {return make_char8(v, v, v, v, v, v, v, v);} + static __device__ __host__ __forceinline__ char8 make(schar a0, schar a1, schar a2, schar a3, schar a4, schar a5, schar a6, schar a7) {return make_char8(a0, a1, a2, a3, a4, a5, a6, a7);} + static __device__ __host__ __forceinline__ char8 make(const schar* v) {return make_char8(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]);} + }; +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif // OPENCV_CUDA_VEC_TRAITS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/warp.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/warp.hpp new file mode 100644 index 0000000..8af7e6a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/warp.hpp @@ -0,0 +1,139 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_DEVICE_WARP_HPP +#define OPENCV_CUDA_DEVICE_WARP_HPP + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + struct Warp + { + enum + { + LOG_WARP_SIZE = 5, + WARP_SIZE = 1 << LOG_WARP_SIZE, + STRIDE = WARP_SIZE + }; + + /** \brief Returns the warp lane ID of the calling thread. */ + static __device__ __forceinline__ unsigned int laneId() + { + unsigned int ret; + asm("mov.u32 %0, %%laneid;" : "=r"(ret) ); + return ret; + } + + template + static __device__ __forceinline__ void fill(It beg, It end, const T& value) + { + for(It t = beg + laneId(); t < end; t += STRIDE) + *t = value; + } + + template + static __device__ __forceinline__ OutIt copy(InIt beg, InIt end, OutIt out) + { + for(InIt t = beg + laneId(); t < end; t += STRIDE, out += STRIDE) + *out = *t; + return out; + } + + template + static __device__ __forceinline__ OutIt transform(InIt beg, InIt end, OutIt out, UnOp op) + { + for(InIt t = beg + laneId(); t < end; t += STRIDE, out += STRIDE) + *out = op(*t); + return out; + } + + template + static __device__ __forceinline__ OutIt transform(InIt1 beg1, InIt1 end1, InIt2 beg2, OutIt out, BinOp op) + { + unsigned int lane = laneId(); + + InIt1 t1 = beg1 + lane; + InIt2 t2 = beg2 + lane; + for(; t1 < end1; t1 += STRIDE, t2 += STRIDE, out += STRIDE) + *out = op(*t1, *t2); + return out; + } + + template + static __device__ __forceinline__ T reduce(volatile T *ptr, BinOp op) + { + const unsigned int lane = laneId(); + + if (lane < 16) + { + T partial = ptr[lane]; + + ptr[lane] = partial = op(partial, ptr[lane + 16]); + ptr[lane] = partial = op(partial, ptr[lane + 8]); + ptr[lane] = partial = op(partial, ptr[lane + 4]); + ptr[lane] = partial = op(partial, ptr[lane + 2]); + ptr[lane] = partial = op(partial, ptr[lane + 1]); + } + + return *ptr; + } + + template + static __device__ __forceinline__ void yota(OutIt beg, OutIt end, T value) + { + unsigned int lane = laneId(); + value += lane; + + for(OutIt t = beg + lane; t < end; t += STRIDE, value += STRIDE) + *t = value; + } + }; +}}} // namespace cv { namespace cuda { namespace cudev + +//! @endcond + +#endif /* OPENCV_CUDA_DEVICE_WARP_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/warp_reduce.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/warp_reduce.hpp new file mode 100644 index 0000000..530303d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/warp_reduce.hpp @@ -0,0 +1,76 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_WARP_REDUCE_HPP__ +#define OPENCV_CUDA_WARP_REDUCE_HPP__ + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ + template + __device__ __forceinline__ T warp_reduce(volatile T *ptr , const unsigned int tid = threadIdx.x) + { + const unsigned int lane = tid & 31; // index of thread in warp (0..31) + + if (lane < 16) + { + T partial = ptr[tid]; + + ptr[tid] = partial = partial + ptr[tid + 16]; + ptr[tid] = partial = partial + ptr[tid + 8]; + ptr[tid] = partial = partial + ptr[tid + 4]; + ptr[tid] = partial = partial + ptr[tid + 2]; + ptr[tid] = partial = partial + ptr[tid + 1]; + } + + return ptr[tid - lane]; + } +}}} // namespace cv { namespace cuda { namespace cudev { + +//! @endcond + +#endif /* OPENCV_CUDA_WARP_REDUCE_HPP__ */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda/warp_shuffle.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda/warp_shuffle.hpp new file mode 100644 index 0000000..0da54ae --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda/warp_shuffle.hpp @@ -0,0 +1,162 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CUDA_WARP_SHUFFLE_HPP +#define OPENCV_CUDA_WARP_SHUFFLE_HPP + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +namespace cv { namespace cuda { namespace device +{ +#if __CUDACC_VER_MAJOR__ >= 9 +# define __shfl(x, y, z) __shfl_sync(0xFFFFFFFFU, x, y, z) +# define __shfl_up(x, y, z) __shfl_up_sync(0xFFFFFFFFU, x, y, z) +# define __shfl_down(x, y, z) __shfl_down_sync(0xFFFFFFFFU, x, y, z) +#endif + template + __device__ __forceinline__ T shfl(T val, int srcLane, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return __shfl(val, srcLane, width); + #else + return T(); + #endif + } + __device__ __forceinline__ unsigned int shfl(unsigned int val, int srcLane, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return (unsigned int) __shfl((int) val, srcLane, width); + #else + return 0; + #endif + } + __device__ __forceinline__ double shfl(double val, int srcLane, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + int lo = __double2loint(val); + int hi = __double2hiint(val); + + lo = __shfl(lo, srcLane, width); + hi = __shfl(hi, srcLane, width); + + return __hiloint2double(hi, lo); + #else + return 0.0; + #endif + } + + template + __device__ __forceinline__ T shfl_down(T val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return __shfl_down(val, delta, width); + #else + return T(); + #endif + } + __device__ __forceinline__ unsigned int shfl_down(unsigned int val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return (unsigned int) __shfl_down((int) val, delta, width); + #else + return 0; + #endif + } + __device__ __forceinline__ double shfl_down(double val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + int lo = __double2loint(val); + int hi = __double2hiint(val); + + lo = __shfl_down(lo, delta, width); + hi = __shfl_down(hi, delta, width); + + return __hiloint2double(hi, lo); + #else + return 0.0; + #endif + } + + template + __device__ __forceinline__ T shfl_up(T val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return __shfl_up(val, delta, width); + #else + return T(); + #endif + } + __device__ __forceinline__ unsigned int shfl_up(unsigned int val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + return (unsigned int) __shfl_up((int) val, delta, width); + #else + return 0; + #endif + } + __device__ __forceinline__ double shfl_up(double val, unsigned int delta, int width = warpSize) + { + #if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300 + int lo = __double2loint(val); + int hi = __double2hiint(val); + + lo = __shfl_up(lo, delta, width); + hi = __shfl_up(hi, delta, width); + + return __hiloint2double(hi, lo); + #else + return 0.0; + #endif + } +}}} + +# undef __shfl +# undef __shfl_up +# undef __shfl_down + +//! @endcond + +#endif // OPENCV_CUDA_WARP_SHUFFLE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda_stream_accessor.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda_stream_accessor.hpp new file mode 100644 index 0000000..deaf356 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda_stream_accessor.hpp @@ -0,0 +1,86 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CUDA_STREAM_ACCESSOR_HPP +#define OPENCV_CORE_CUDA_STREAM_ACCESSOR_HPP + +#ifndef __cplusplus +# error cuda_stream_accessor.hpp header must be compiled as C++ +#endif + +/** @file cuda_stream_accessor.hpp + * This is only header file that depends on CUDA Runtime API. All other headers are independent. + */ + +#include +#include "opencv2/core/cuda.hpp" + +namespace cv +{ + namespace cuda + { + +//! @addtogroup cudacore_struct +//! @{ + + /** @brief Class that enables getting cudaStream_t from cuda::Stream + */ + struct StreamAccessor + { + CV_EXPORTS static cudaStream_t getStream(const Stream& stream); + CV_EXPORTS static Stream wrapStream(cudaStream_t stream); + }; + + /** @brief Class that enables getting cudaEvent_t from cuda::Event + */ + struct EventAccessor + { + CV_EXPORTS static cudaEvent_t getEvent(const Event& event); + CV_EXPORTS static Event wrapEvent(cudaEvent_t event); + }; + +//! @} + + } +} + +#endif /* OPENCV_CORE_CUDA_STREAM_ACCESSOR_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cuda_types.hpp b/Thirdparty/opencv2/include/opencv2/core/cuda_types.hpp new file mode 100644 index 0000000..b33f061 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cuda_types.hpp @@ -0,0 +1,144 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CUDA_TYPES_HPP +#define OPENCV_CORE_CUDA_TYPES_HPP + +#ifndef __cplusplus +# error cuda_types.hpp header must be compiled as C++ +#endif + +#if defined(__OPENCV_BUILD) && defined(__clang__) +#pragma clang diagnostic ignored "-Winconsistent-missing-override" +#endif +#if defined(__OPENCV_BUILD) && defined(__GNUC__) && __GNUC__ >= 5 +#pragma GCC diagnostic ignored "-Wsuggest-override" +#endif + +/** @file + * @deprecated Use @ref cudev instead. + */ + +//! @cond IGNORED + +#ifdef __CUDACC__ + #define __CV_CUDA_HOST_DEVICE__ __host__ __device__ __forceinline__ +#else + #define __CV_CUDA_HOST_DEVICE__ +#endif + +namespace cv +{ + namespace cuda + { + + // Simple lightweight structures that encapsulates information about an image on device. + // It is intended to pass to nvcc-compiled code. GpuMat depends on headers that nvcc can't compile + + template struct DevPtr + { + typedef T elem_type; + typedef int index_type; + + enum { elem_size = sizeof(elem_type) }; + + T* data; + + __CV_CUDA_HOST_DEVICE__ DevPtr() : data(0) {} + __CV_CUDA_HOST_DEVICE__ DevPtr(T* data_) : data(data_) {} + + __CV_CUDA_HOST_DEVICE__ size_t elemSize() const { return elem_size; } + __CV_CUDA_HOST_DEVICE__ operator T*() { return data; } + __CV_CUDA_HOST_DEVICE__ operator const T*() const { return data; } + }; + + template struct PtrSz : public DevPtr + { + __CV_CUDA_HOST_DEVICE__ PtrSz() : size(0) {} + __CV_CUDA_HOST_DEVICE__ PtrSz(T* data_, size_t size_) : DevPtr(data_), size(size_) {} + + size_t size; + }; + + template struct PtrStep : public DevPtr + { + __CV_CUDA_HOST_DEVICE__ PtrStep() : step(0) {} + __CV_CUDA_HOST_DEVICE__ PtrStep(T* data_, size_t step_) : DevPtr(data_), step(step_) {} + + size_t step; + + __CV_CUDA_HOST_DEVICE__ T* ptr(int y = 0) { return ( T*)( ( char*)(((DevPtr*)this)->data) + y * step); } + __CV_CUDA_HOST_DEVICE__ const T* ptr(int y = 0) const { return (const T*)( (const char*)(((DevPtr*)this)->data) + y * step); } + + __CV_CUDA_HOST_DEVICE__ T& operator ()(int y, int x) { return ptr(y)[x]; } + __CV_CUDA_HOST_DEVICE__ const T& operator ()(int y, int x) const { return ptr(y)[x]; } + }; + + template struct PtrStepSz : public PtrStep + { + __CV_CUDA_HOST_DEVICE__ PtrStepSz() : cols(0), rows(0) {} + __CV_CUDA_HOST_DEVICE__ PtrStepSz(int rows_, int cols_, T* data_, size_t step_) + : PtrStep(data_, step_), cols(cols_), rows(rows_) {} + + template + explicit PtrStepSz(const PtrStepSz& d) : PtrStep((T*)d.data, d.step), cols(d.cols), rows(d.rows){} + + int cols; + int rows; + }; + + typedef PtrStepSz PtrStepSzb; + typedef PtrStepSz PtrStepSzus; + typedef PtrStepSz PtrStepSzf; + typedef PtrStepSz PtrStepSzi; + + typedef PtrStep PtrStepb; + typedef PtrStep PtrStepus; + typedef PtrStep PtrStepf; + typedef PtrStep PtrStepi; + + } +} + +//! @endcond + +#endif /* OPENCV_CORE_CUDA_TYPES_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cv_cpu_dispatch.h b/Thirdparty/opencv2/include/opencv2/core/cv_cpu_dispatch.h new file mode 100644 index 0000000..de7b84b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cv_cpu_dispatch.h @@ -0,0 +1,390 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#if defined __OPENCV_BUILD \ + +#include "cv_cpu_config.h" +#include "cv_cpu_helper.h" + +#ifdef CV_CPU_DISPATCH_MODE +#define CV_CPU_OPTIMIZATION_NAMESPACE __CV_CAT(opt_, CV_CPU_DISPATCH_MODE) +#define CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN namespace __CV_CAT(opt_, CV_CPU_DISPATCH_MODE) { +#define CV_CPU_OPTIMIZATION_NAMESPACE_END } +#else +#define CV_CPU_OPTIMIZATION_NAMESPACE cpu_baseline +#define CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN namespace cpu_baseline { +#define CV_CPU_OPTIMIZATION_NAMESPACE_END } +#define CV_CPU_BASELINE_MODE 1 +#endif + + +#define __CV_CPU_DISPATCH_CHAIN_END(fn, args, mode, ...) /* done */ +#define __CV_CPU_DISPATCH(fn, args, mode, ...) __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) +#define __CV_CPU_DISPATCH_EXPAND(fn, args, ...) __CV_EXPAND(__CV_CPU_DISPATCH(fn, args, __VA_ARGS__)) +#define CV_CPU_DISPATCH(fn, args, ...) __CV_CPU_DISPATCH_EXPAND(fn, args, __VA_ARGS__, END) // expand macros + + +#if defined CV_ENABLE_INTRINSICS \ + && !defined CV_DISABLE_OPTIMIZATION \ + && !defined __CUDACC__ /* do not include SSE/AVX/NEON headers for NVCC compiler */ \ + +#ifdef CV_CPU_COMPILE_SSE2 +# include +# define CV_MMX 1 +# define CV_SSE 1 +# define CV_SSE2 1 +#endif +#ifdef CV_CPU_COMPILE_SSE3 +# include +# define CV_SSE3 1 +#endif +#ifdef CV_CPU_COMPILE_SSSE3 +# include +# define CV_SSSE3 1 +#endif +#ifdef CV_CPU_COMPILE_SSE4_1 +# include +# define CV_SSE4_1 1 +#endif +#ifdef CV_CPU_COMPILE_SSE4_2 +# include +# define CV_SSE4_2 1 +#endif +#ifdef CV_CPU_COMPILE_POPCNT +# ifdef _MSC_VER +# include +# if defined(_M_X64) +# define CV_POPCNT_U64 (int)_mm_popcnt_u64 +# endif +# define CV_POPCNT_U32 _mm_popcnt_u32 +# else +# include +# if defined(__x86_64__) +# define CV_POPCNT_U64 __builtin_popcountll +# endif +# define CV_POPCNT_U32 __builtin_popcount +# endif +# define CV_POPCNT 1 +#endif +#ifdef CV_CPU_COMPILE_AVX +# include +# define CV_AVX 1 +#endif +#ifdef CV_CPU_COMPILE_FP16 +# if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64) +# include +# else +# include +# endif +# define CV_FP16 1 +#endif +#ifdef CV_CPU_COMPILE_NEON_DOTPROD +# include +# define CV_NEON_DOT 1 +#endif +#ifdef CV_CPU_COMPILE_AVX2 +# include +# define CV_AVX2 1 +#endif +#ifdef CV_CPU_COMPILE_AVX_512F +# include +# define CV_AVX_512F 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_COMMON +# define CV_AVX512_COMMON 1 +# define CV_AVX_512CD 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_KNL +# define CV_AVX512_KNL 1 +# define CV_AVX_512ER 1 +# define CV_AVX_512PF 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_KNM +# define CV_AVX512_KNM 1 +# define CV_AVX_5124FMAPS 1 +# define CV_AVX_5124VNNIW 1 +# define CV_AVX_512VPOPCNTDQ 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_SKX +# define CV_AVX512_SKX 1 +# define CV_AVX_512VL 1 +# define CV_AVX_512BW 1 +# define CV_AVX_512DQ 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_CNL +# define CV_AVX512_CNL 1 +# define CV_AVX_512IFMA 1 +# define CV_AVX_512VBMI 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_CLX +# define CV_AVX512_CLX 1 +# define CV_AVX_512VNNI 1 +#endif +#ifdef CV_CPU_COMPILE_AVX512_ICL +# define CV_AVX512_ICL 1 +# undef CV_AVX_512IFMA +# define CV_AVX_512IFMA 1 +# undef CV_AVX_512VBMI +# define CV_AVX_512VBMI 1 +# undef CV_AVX_512VNNI +# define CV_AVX_512VNNI 1 +# define CV_AVX_512VBMI2 1 +# define CV_AVX_512BITALG 1 +# define CV_AVX_512VPOPCNTDQ 1 +#endif +#ifdef CV_CPU_COMPILE_FMA3 +# define CV_FMA3 1 +#endif + +#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) && (defined(CV_CPU_COMPILE_NEON) || !defined(_MSC_VER)) +# include +# include +# define CV_NEON 1 +#elif defined(__ARM_NEON__) || (defined (__ARM_NEON) && defined(__aarch64__)) +# include +# define CV_NEON 1 +#endif + +#if defined(__riscv) && defined(__riscv_vector) && defined(__riscv_vector_071) +# include +# define CV_RVV071 1 +#endif + +#if defined(__ARM_NEON__) || defined(__aarch64__) +# include +#endif + +#ifdef CV_CPU_COMPILE_VSX +# include +# undef vector +# undef pixel +# undef bool +# define CV_VSX 1 +#endif + +#ifdef CV_CPU_COMPILE_VSX3 +# define CV_VSX3 1 +#endif + +#ifdef CV_CPU_COMPILE_MSA +# include "hal/msa_macros.h" +# define CV_MSA 1 +#endif + +#ifdef CV_CPU_COMPILE_LSX +# include +# define CV_LSX 1 +#endif + +#ifdef CV_CPU_COMPILE_LASX +# include +# define CV_LASX 1 +#endif + +#ifdef __EMSCRIPTEN__ +# define CV_WASM_SIMD 1 +# include +#endif + +#if defined CV_CPU_COMPILE_RVV +# define CV_RVV 1 +# include +#endif + +#endif // CV_ENABLE_INTRINSICS && !CV_DISABLE_OPTIMIZATION && !__CUDACC__ + +#if defined CV_CPU_COMPILE_AVX && !defined CV_CPU_BASELINE_COMPILE_AVX +struct VZeroUpperGuard { +#ifdef __GNUC__ + __attribute__((always_inline)) +#endif + inline VZeroUpperGuard() { _mm256_zeroupper(); } +#ifdef __GNUC__ + __attribute__((always_inline)) +#endif + inline ~VZeroUpperGuard() { _mm256_zeroupper(); } +}; +#define __CV_AVX_GUARD VZeroUpperGuard __vzeroupper_guard; CV_UNUSED(__vzeroupper_guard); +#endif + +#ifdef __CV_AVX_GUARD +#define CV_AVX_GUARD __CV_AVX_GUARD +#else +#define CV_AVX_GUARD +#endif + +#endif // __OPENCV_BUILD + + + +#if !defined __OPENCV_BUILD /* Compatibility code */ \ + && !defined __CUDACC__ /* do not include SSE/AVX/NEON headers for NVCC compiler */ +#if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2) +# include +# define CV_MMX 1 +# define CV_SSE 1 +# define CV_SSE2 1 +#elif defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) && (defined(CV_CPU_COMPILE_NEON) || !defined(_MSC_VER)) +# include +# include +# define CV_NEON 1 +#elif defined(__ARM_NEON__) || (defined (__ARM_NEON) && defined(__aarch64__)) +# include +# define CV_NEON 1 +#elif defined(__VSX__) && defined(__PPC64__) && defined(__LITTLE_ENDIAN__) +# include +# undef vector +# undef pixel +# undef bool +# define CV_VSX 1 +#endif + +#ifdef __F16C__ +# include +# define CV_FP16 1 +#endif + +#endif // !__OPENCV_BUILD && !__CUDACC (Compatibility code) + + + +#ifndef CV_MMX +# define CV_MMX 0 +#endif +#ifndef CV_SSE +# define CV_SSE 0 +#endif +#ifndef CV_SSE2 +# define CV_SSE2 0 +#endif +#ifndef CV_SSE3 +# define CV_SSE3 0 +#endif +#ifndef CV_SSSE3 +# define CV_SSSE3 0 +#endif +#ifndef CV_SSE4_1 +# define CV_SSE4_1 0 +#endif +#ifndef CV_SSE4_2 +# define CV_SSE4_2 0 +#endif +#ifndef CV_POPCNT +# define CV_POPCNT 0 +#endif +#ifndef CV_AVX +# define CV_AVX 0 +#endif +#ifndef CV_FP16 +# define CV_FP16 0 +#endif +#ifndef CV_AVX2 +# define CV_AVX2 0 +#endif +#ifndef CV_FMA3 +# define CV_FMA3 0 +#endif +#ifndef CV_AVX_512F +# define CV_AVX_512F 0 +#endif +#ifndef CV_AVX_512BW +# define CV_AVX_512BW 0 +#endif +#ifndef CV_AVX_512CD +# define CV_AVX_512CD 0 +#endif +#ifndef CV_AVX_512DQ +# define CV_AVX_512DQ 0 +#endif +#ifndef CV_AVX_512ER +# define CV_AVX_512ER 0 +#endif +#ifndef CV_AVX_512IFMA +# define CV_AVX_512IFMA 0 +#endif +#define CV_AVX_512IFMA512 CV_AVX_512IFMA // deprecated +#ifndef CV_AVX_512PF +# define CV_AVX_512PF 0 +#endif +#ifndef CV_AVX_512VBMI +# define CV_AVX_512VBMI 0 +#endif +#ifndef CV_AVX_512VL +# define CV_AVX_512VL 0 +#endif +#ifndef CV_AVX_5124FMAPS +# define CV_AVX_5124FMAPS 0 +#endif +#ifndef CV_AVX_5124VNNIW +# define CV_AVX_5124VNNIW 0 +#endif +#ifndef CV_AVX_512VPOPCNTDQ +# define CV_AVX_512VPOPCNTDQ 0 +#endif +#ifndef CV_AVX_512VNNI +# define CV_AVX_512VNNI 0 +#endif +#ifndef CV_AVX_512VBMI2 +# define CV_AVX_512VBMI2 0 +#endif +#ifndef CV_AVX_512BITALG +# define CV_AVX_512BITALG 0 +#endif +#ifndef CV_AVX512_COMMON +# define CV_AVX512_COMMON 0 +#endif +#ifndef CV_AVX512_KNL +# define CV_AVX512_KNL 0 +#endif +#ifndef CV_AVX512_KNM +# define CV_AVX512_KNM 0 +#endif +#ifndef CV_AVX512_SKX +# define CV_AVX512_SKX 0 +#endif +#ifndef CV_AVX512_CNL +# define CV_AVX512_CNL 0 +#endif +#ifndef CV_AVX512_CLX +# define CV_AVX512_CLX 0 +#endif +#ifndef CV_AVX512_ICL +# define CV_AVX512_ICL 0 +#endif + +#ifndef CV_NEON +# define CV_NEON 0 +#endif + +#ifndef CV_RVV071 +# define CV_RVV071 0 +#endif + +#ifndef CV_VSX +# define CV_VSX 0 +#endif + +#ifndef CV_VSX3 +# define CV_VSX3 0 +#endif + +#ifndef CV_MSA +# define CV_MSA 0 +#endif + +#ifndef CV_WASM_SIMD +# define CV_WASM_SIMD 0 +#endif + +#ifndef CV_RVV +# define CV_RVV 0 +#endif + +#ifndef CV_LSX +# define CV_LSX 0 +#endif + +#ifndef CV_LASX +# define CV_LASX 0 +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/cv_cpu_helper.h b/Thirdparty/opencv2/include/opencv2/core/cv_cpu_helper.h new file mode 100644 index 0000000..daca592 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cv_cpu_helper.h @@ -0,0 +1,571 @@ +// AUTOGENERATED, DO NOT EDIT + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSE +# define CV_TRY_SSE 1 +# define CV_CPU_FORCE_SSE 1 +# define CV_CPU_HAS_SUPPORT_SSE 1 +# define CV_CPU_CALL_SSE(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSE_(fn, args) return (opt_SSE::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSE +# define CV_TRY_SSE 1 +# define CV_CPU_FORCE_SSE 0 +# define CV_CPU_HAS_SUPPORT_SSE (cv::checkHardwareSupport(CV_CPU_SSE)) +# define CV_CPU_CALL_SSE(fn, args) if (CV_CPU_HAS_SUPPORT_SSE) return (opt_SSE::fn args) +# define CV_CPU_CALL_SSE_(fn, args) if (CV_CPU_HAS_SUPPORT_SSE) return (opt_SSE::fn args) +#else +# define CV_TRY_SSE 0 +# define CV_CPU_FORCE_SSE 0 +# define CV_CPU_HAS_SUPPORT_SSE 0 +# define CV_CPU_CALL_SSE(fn, args) +# define CV_CPU_CALL_SSE_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSE(fn, args, mode, ...) CV_CPU_CALL_SSE(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSE2 +# define CV_TRY_SSE2 1 +# define CV_CPU_FORCE_SSE2 1 +# define CV_CPU_HAS_SUPPORT_SSE2 1 +# define CV_CPU_CALL_SSE2(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSE2_(fn, args) return (opt_SSE2::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSE2 +# define CV_TRY_SSE2 1 +# define CV_CPU_FORCE_SSE2 0 +# define CV_CPU_HAS_SUPPORT_SSE2 (cv::checkHardwareSupport(CV_CPU_SSE2)) +# define CV_CPU_CALL_SSE2(fn, args) if (CV_CPU_HAS_SUPPORT_SSE2) return (opt_SSE2::fn args) +# define CV_CPU_CALL_SSE2_(fn, args) if (CV_CPU_HAS_SUPPORT_SSE2) return (opt_SSE2::fn args) +#else +# define CV_TRY_SSE2 0 +# define CV_CPU_FORCE_SSE2 0 +# define CV_CPU_HAS_SUPPORT_SSE2 0 +# define CV_CPU_CALL_SSE2(fn, args) +# define CV_CPU_CALL_SSE2_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSE2(fn, args, mode, ...) CV_CPU_CALL_SSE2(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSE3 +# define CV_TRY_SSE3 1 +# define CV_CPU_FORCE_SSE3 1 +# define CV_CPU_HAS_SUPPORT_SSE3 1 +# define CV_CPU_CALL_SSE3(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSE3_(fn, args) return (opt_SSE3::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSE3 +# define CV_TRY_SSE3 1 +# define CV_CPU_FORCE_SSE3 0 +# define CV_CPU_HAS_SUPPORT_SSE3 (cv::checkHardwareSupport(CV_CPU_SSE3)) +# define CV_CPU_CALL_SSE3(fn, args) if (CV_CPU_HAS_SUPPORT_SSE3) return (opt_SSE3::fn args) +# define CV_CPU_CALL_SSE3_(fn, args) if (CV_CPU_HAS_SUPPORT_SSE3) return (opt_SSE3::fn args) +#else +# define CV_TRY_SSE3 0 +# define CV_CPU_FORCE_SSE3 0 +# define CV_CPU_HAS_SUPPORT_SSE3 0 +# define CV_CPU_CALL_SSE3(fn, args) +# define CV_CPU_CALL_SSE3_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSE3(fn, args, mode, ...) CV_CPU_CALL_SSE3(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSSE3 +# define CV_TRY_SSSE3 1 +# define CV_CPU_FORCE_SSSE3 1 +# define CV_CPU_HAS_SUPPORT_SSSE3 1 +# define CV_CPU_CALL_SSSE3(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSSE3_(fn, args) return (opt_SSSE3::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSSE3 +# define CV_TRY_SSSE3 1 +# define CV_CPU_FORCE_SSSE3 0 +# define CV_CPU_HAS_SUPPORT_SSSE3 (cv::checkHardwareSupport(CV_CPU_SSSE3)) +# define CV_CPU_CALL_SSSE3(fn, args) if (CV_CPU_HAS_SUPPORT_SSSE3) return (opt_SSSE3::fn args) +# define CV_CPU_CALL_SSSE3_(fn, args) if (CV_CPU_HAS_SUPPORT_SSSE3) return (opt_SSSE3::fn args) +#else +# define CV_TRY_SSSE3 0 +# define CV_CPU_FORCE_SSSE3 0 +# define CV_CPU_HAS_SUPPORT_SSSE3 0 +# define CV_CPU_CALL_SSSE3(fn, args) +# define CV_CPU_CALL_SSSE3_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSSE3(fn, args, mode, ...) CV_CPU_CALL_SSSE3(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSE4_1 +# define CV_TRY_SSE4_1 1 +# define CV_CPU_FORCE_SSE4_1 1 +# define CV_CPU_HAS_SUPPORT_SSE4_1 1 +# define CV_CPU_CALL_SSE4_1(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSE4_1_(fn, args) return (opt_SSE4_1::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSE4_1 +# define CV_TRY_SSE4_1 1 +# define CV_CPU_FORCE_SSE4_1 0 +# define CV_CPU_HAS_SUPPORT_SSE4_1 (cv::checkHardwareSupport(CV_CPU_SSE4_1)) +# define CV_CPU_CALL_SSE4_1(fn, args) if (CV_CPU_HAS_SUPPORT_SSE4_1) return (opt_SSE4_1::fn args) +# define CV_CPU_CALL_SSE4_1_(fn, args) if (CV_CPU_HAS_SUPPORT_SSE4_1) return (opt_SSE4_1::fn args) +#else +# define CV_TRY_SSE4_1 0 +# define CV_CPU_FORCE_SSE4_1 0 +# define CV_CPU_HAS_SUPPORT_SSE4_1 0 +# define CV_CPU_CALL_SSE4_1(fn, args) +# define CV_CPU_CALL_SSE4_1_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSE4_1(fn, args, mode, ...) CV_CPU_CALL_SSE4_1(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_SSE4_2 +# define CV_TRY_SSE4_2 1 +# define CV_CPU_FORCE_SSE4_2 1 +# define CV_CPU_HAS_SUPPORT_SSE4_2 1 +# define CV_CPU_CALL_SSE4_2(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_SSE4_2_(fn, args) return (opt_SSE4_2::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_SSE4_2 +# define CV_TRY_SSE4_2 1 +# define CV_CPU_FORCE_SSE4_2 0 +# define CV_CPU_HAS_SUPPORT_SSE4_2 (cv::checkHardwareSupport(CV_CPU_SSE4_2)) +# define CV_CPU_CALL_SSE4_2(fn, args) if (CV_CPU_HAS_SUPPORT_SSE4_2) return (opt_SSE4_2::fn args) +# define CV_CPU_CALL_SSE4_2_(fn, args) if (CV_CPU_HAS_SUPPORT_SSE4_2) return (opt_SSE4_2::fn args) +#else +# define CV_TRY_SSE4_2 0 +# define CV_CPU_FORCE_SSE4_2 0 +# define CV_CPU_HAS_SUPPORT_SSE4_2 0 +# define CV_CPU_CALL_SSE4_2(fn, args) +# define CV_CPU_CALL_SSE4_2_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_SSE4_2(fn, args, mode, ...) CV_CPU_CALL_SSE4_2(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_POPCNT +# define CV_TRY_POPCNT 1 +# define CV_CPU_FORCE_POPCNT 1 +# define CV_CPU_HAS_SUPPORT_POPCNT 1 +# define CV_CPU_CALL_POPCNT(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_POPCNT_(fn, args) return (opt_POPCNT::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_POPCNT +# define CV_TRY_POPCNT 1 +# define CV_CPU_FORCE_POPCNT 0 +# define CV_CPU_HAS_SUPPORT_POPCNT (cv::checkHardwareSupport(CV_CPU_POPCNT)) +# define CV_CPU_CALL_POPCNT(fn, args) if (CV_CPU_HAS_SUPPORT_POPCNT) return (opt_POPCNT::fn args) +# define CV_CPU_CALL_POPCNT_(fn, args) if (CV_CPU_HAS_SUPPORT_POPCNT) return (opt_POPCNT::fn args) +#else +# define CV_TRY_POPCNT 0 +# define CV_CPU_FORCE_POPCNT 0 +# define CV_CPU_HAS_SUPPORT_POPCNT 0 +# define CV_CPU_CALL_POPCNT(fn, args) +# define CV_CPU_CALL_POPCNT_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_POPCNT(fn, args, mode, ...) CV_CPU_CALL_POPCNT(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX +# define CV_TRY_AVX 1 +# define CV_CPU_FORCE_AVX 1 +# define CV_CPU_HAS_SUPPORT_AVX 1 +# define CV_CPU_CALL_AVX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX_(fn, args) return (opt_AVX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX +# define CV_TRY_AVX 1 +# define CV_CPU_FORCE_AVX 0 +# define CV_CPU_HAS_SUPPORT_AVX (cv::checkHardwareSupport(CV_CPU_AVX)) +# define CV_CPU_CALL_AVX(fn, args) if (CV_CPU_HAS_SUPPORT_AVX) return (opt_AVX::fn args) +# define CV_CPU_CALL_AVX_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX) return (opt_AVX::fn args) +#else +# define CV_TRY_AVX 0 +# define CV_CPU_FORCE_AVX 0 +# define CV_CPU_HAS_SUPPORT_AVX 0 +# define CV_CPU_CALL_AVX(fn, args) +# define CV_CPU_CALL_AVX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX(fn, args, mode, ...) CV_CPU_CALL_AVX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_FP16 +# define CV_TRY_FP16 1 +# define CV_CPU_FORCE_FP16 1 +# define CV_CPU_HAS_SUPPORT_FP16 1 +# define CV_CPU_CALL_FP16(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_FP16_(fn, args) return (opt_FP16::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_FP16 +# define CV_TRY_FP16 1 +# define CV_CPU_FORCE_FP16 0 +# define CV_CPU_HAS_SUPPORT_FP16 (cv::checkHardwareSupport(CV_CPU_FP16)) +# define CV_CPU_CALL_FP16(fn, args) if (CV_CPU_HAS_SUPPORT_FP16) return (opt_FP16::fn args) +# define CV_CPU_CALL_FP16_(fn, args) if (CV_CPU_HAS_SUPPORT_FP16) return (opt_FP16::fn args) +#else +# define CV_TRY_FP16 0 +# define CV_CPU_FORCE_FP16 0 +# define CV_CPU_HAS_SUPPORT_FP16 0 +# define CV_CPU_CALL_FP16(fn, args) +# define CV_CPU_CALL_FP16_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_FP16(fn, args, mode, ...) CV_CPU_CALL_FP16(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX2 +# define CV_TRY_AVX2 1 +# define CV_CPU_FORCE_AVX2 1 +# define CV_CPU_HAS_SUPPORT_AVX2 1 +# define CV_CPU_CALL_AVX2(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX2_(fn, args) return (opt_AVX2::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX2 +# define CV_TRY_AVX2 1 +# define CV_CPU_FORCE_AVX2 0 +# define CV_CPU_HAS_SUPPORT_AVX2 (cv::checkHardwareSupport(CV_CPU_AVX2)) +# define CV_CPU_CALL_AVX2(fn, args) if (CV_CPU_HAS_SUPPORT_AVX2) return (opt_AVX2::fn args) +# define CV_CPU_CALL_AVX2_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX2) return (opt_AVX2::fn args) +#else +# define CV_TRY_AVX2 0 +# define CV_CPU_FORCE_AVX2 0 +# define CV_CPU_HAS_SUPPORT_AVX2 0 +# define CV_CPU_CALL_AVX2(fn, args) +# define CV_CPU_CALL_AVX2_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX2(fn, args, mode, ...) CV_CPU_CALL_AVX2(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_FMA3 +# define CV_TRY_FMA3 1 +# define CV_CPU_FORCE_FMA3 1 +# define CV_CPU_HAS_SUPPORT_FMA3 1 +# define CV_CPU_CALL_FMA3(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_FMA3_(fn, args) return (opt_FMA3::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_FMA3 +# define CV_TRY_FMA3 1 +# define CV_CPU_FORCE_FMA3 0 +# define CV_CPU_HAS_SUPPORT_FMA3 (cv::checkHardwareSupport(CV_CPU_FMA3)) +# define CV_CPU_CALL_FMA3(fn, args) if (CV_CPU_HAS_SUPPORT_FMA3) return (opt_FMA3::fn args) +# define CV_CPU_CALL_FMA3_(fn, args) if (CV_CPU_HAS_SUPPORT_FMA3) return (opt_FMA3::fn args) +#else +# define CV_TRY_FMA3 0 +# define CV_CPU_FORCE_FMA3 0 +# define CV_CPU_HAS_SUPPORT_FMA3 0 +# define CV_CPU_CALL_FMA3(fn, args) +# define CV_CPU_CALL_FMA3_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_FMA3(fn, args, mode, ...) CV_CPU_CALL_FMA3(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX_512F +# define CV_TRY_AVX_512F 1 +# define CV_CPU_FORCE_AVX_512F 1 +# define CV_CPU_HAS_SUPPORT_AVX_512F 1 +# define CV_CPU_CALL_AVX_512F(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX_512F_(fn, args) return (opt_AVX_512F::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX_512F +# define CV_TRY_AVX_512F 1 +# define CV_CPU_FORCE_AVX_512F 0 +# define CV_CPU_HAS_SUPPORT_AVX_512F (cv::checkHardwareSupport(CV_CPU_AVX_512F)) +# define CV_CPU_CALL_AVX_512F(fn, args) if (CV_CPU_HAS_SUPPORT_AVX_512F) return (opt_AVX_512F::fn args) +# define CV_CPU_CALL_AVX_512F_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX_512F) return (opt_AVX_512F::fn args) +#else +# define CV_TRY_AVX_512F 0 +# define CV_CPU_FORCE_AVX_512F 0 +# define CV_CPU_HAS_SUPPORT_AVX_512F 0 +# define CV_CPU_CALL_AVX_512F(fn, args) +# define CV_CPU_CALL_AVX_512F_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX_512F(fn, args, mode, ...) CV_CPU_CALL_AVX_512F(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_COMMON +# define CV_TRY_AVX512_COMMON 1 +# define CV_CPU_FORCE_AVX512_COMMON 1 +# define CV_CPU_HAS_SUPPORT_AVX512_COMMON 1 +# define CV_CPU_CALL_AVX512_COMMON(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_COMMON_(fn, args) return (opt_AVX512_COMMON::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_COMMON +# define CV_TRY_AVX512_COMMON 1 +# define CV_CPU_FORCE_AVX512_COMMON 0 +# define CV_CPU_HAS_SUPPORT_AVX512_COMMON (cv::checkHardwareSupport(CV_CPU_AVX512_COMMON)) +# define CV_CPU_CALL_AVX512_COMMON(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_COMMON) return (opt_AVX512_COMMON::fn args) +# define CV_CPU_CALL_AVX512_COMMON_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_COMMON) return (opt_AVX512_COMMON::fn args) +#else +# define CV_TRY_AVX512_COMMON 0 +# define CV_CPU_FORCE_AVX512_COMMON 0 +# define CV_CPU_HAS_SUPPORT_AVX512_COMMON 0 +# define CV_CPU_CALL_AVX512_COMMON(fn, args) +# define CV_CPU_CALL_AVX512_COMMON_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_COMMON(fn, args, mode, ...) CV_CPU_CALL_AVX512_COMMON(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_KNL +# define CV_TRY_AVX512_KNL 1 +# define CV_CPU_FORCE_AVX512_KNL 1 +# define CV_CPU_HAS_SUPPORT_AVX512_KNL 1 +# define CV_CPU_CALL_AVX512_KNL(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_KNL_(fn, args) return (opt_AVX512_KNL::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_KNL +# define CV_TRY_AVX512_KNL 1 +# define CV_CPU_FORCE_AVX512_KNL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_KNL (cv::checkHardwareSupport(CV_CPU_AVX512_KNL)) +# define CV_CPU_CALL_AVX512_KNL(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_KNL) return (opt_AVX512_KNL::fn args) +# define CV_CPU_CALL_AVX512_KNL_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_KNL) return (opt_AVX512_KNL::fn args) +#else +# define CV_TRY_AVX512_KNL 0 +# define CV_CPU_FORCE_AVX512_KNL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_KNL 0 +# define CV_CPU_CALL_AVX512_KNL(fn, args) +# define CV_CPU_CALL_AVX512_KNL_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_KNL(fn, args, mode, ...) CV_CPU_CALL_AVX512_KNL(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_KNM +# define CV_TRY_AVX512_KNM 1 +# define CV_CPU_FORCE_AVX512_KNM 1 +# define CV_CPU_HAS_SUPPORT_AVX512_KNM 1 +# define CV_CPU_CALL_AVX512_KNM(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_KNM_(fn, args) return (opt_AVX512_KNM::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_KNM +# define CV_TRY_AVX512_KNM 1 +# define CV_CPU_FORCE_AVX512_KNM 0 +# define CV_CPU_HAS_SUPPORT_AVX512_KNM (cv::checkHardwareSupport(CV_CPU_AVX512_KNM)) +# define CV_CPU_CALL_AVX512_KNM(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_KNM) return (opt_AVX512_KNM::fn args) +# define CV_CPU_CALL_AVX512_KNM_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_KNM) return (opt_AVX512_KNM::fn args) +#else +# define CV_TRY_AVX512_KNM 0 +# define CV_CPU_FORCE_AVX512_KNM 0 +# define CV_CPU_HAS_SUPPORT_AVX512_KNM 0 +# define CV_CPU_CALL_AVX512_KNM(fn, args) +# define CV_CPU_CALL_AVX512_KNM_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_KNM(fn, args, mode, ...) CV_CPU_CALL_AVX512_KNM(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_SKX +# define CV_TRY_AVX512_SKX 1 +# define CV_CPU_FORCE_AVX512_SKX 1 +# define CV_CPU_HAS_SUPPORT_AVX512_SKX 1 +# define CV_CPU_CALL_AVX512_SKX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_SKX_(fn, args) return (opt_AVX512_SKX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_SKX +# define CV_TRY_AVX512_SKX 1 +# define CV_CPU_FORCE_AVX512_SKX 0 +# define CV_CPU_HAS_SUPPORT_AVX512_SKX (cv::checkHardwareSupport(CV_CPU_AVX512_SKX)) +# define CV_CPU_CALL_AVX512_SKX(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_SKX) return (opt_AVX512_SKX::fn args) +# define CV_CPU_CALL_AVX512_SKX_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_SKX) return (opt_AVX512_SKX::fn args) +#else +# define CV_TRY_AVX512_SKX 0 +# define CV_CPU_FORCE_AVX512_SKX 0 +# define CV_CPU_HAS_SUPPORT_AVX512_SKX 0 +# define CV_CPU_CALL_AVX512_SKX(fn, args) +# define CV_CPU_CALL_AVX512_SKX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_SKX(fn, args, mode, ...) CV_CPU_CALL_AVX512_SKX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_CNL +# define CV_TRY_AVX512_CNL 1 +# define CV_CPU_FORCE_AVX512_CNL 1 +# define CV_CPU_HAS_SUPPORT_AVX512_CNL 1 +# define CV_CPU_CALL_AVX512_CNL(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_CNL_(fn, args) return (opt_AVX512_CNL::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_CNL +# define CV_TRY_AVX512_CNL 1 +# define CV_CPU_FORCE_AVX512_CNL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_CNL (cv::checkHardwareSupport(CV_CPU_AVX512_CNL)) +# define CV_CPU_CALL_AVX512_CNL(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_CNL) return (opt_AVX512_CNL::fn args) +# define CV_CPU_CALL_AVX512_CNL_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_CNL) return (opt_AVX512_CNL::fn args) +#else +# define CV_TRY_AVX512_CNL 0 +# define CV_CPU_FORCE_AVX512_CNL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_CNL 0 +# define CV_CPU_CALL_AVX512_CNL(fn, args) +# define CV_CPU_CALL_AVX512_CNL_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_CNL(fn, args, mode, ...) CV_CPU_CALL_AVX512_CNL(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_CLX +# define CV_TRY_AVX512_CLX 1 +# define CV_CPU_FORCE_AVX512_CLX 1 +# define CV_CPU_HAS_SUPPORT_AVX512_CLX 1 +# define CV_CPU_CALL_AVX512_CLX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_CLX_(fn, args) return (opt_AVX512_CLX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_CLX +# define CV_TRY_AVX512_CLX 1 +# define CV_CPU_FORCE_AVX512_CLX 0 +# define CV_CPU_HAS_SUPPORT_AVX512_CLX (cv::checkHardwareSupport(CV_CPU_AVX512_CLX)) +# define CV_CPU_CALL_AVX512_CLX(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_CLX) return (opt_AVX512_CLX::fn args) +# define CV_CPU_CALL_AVX512_CLX_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_CLX) return (opt_AVX512_CLX::fn args) +#else +# define CV_TRY_AVX512_CLX 0 +# define CV_CPU_FORCE_AVX512_CLX 0 +# define CV_CPU_HAS_SUPPORT_AVX512_CLX 0 +# define CV_CPU_CALL_AVX512_CLX(fn, args) +# define CV_CPU_CALL_AVX512_CLX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_CLX(fn, args, mode, ...) CV_CPU_CALL_AVX512_CLX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_AVX512_ICL +# define CV_TRY_AVX512_ICL 1 +# define CV_CPU_FORCE_AVX512_ICL 1 +# define CV_CPU_HAS_SUPPORT_AVX512_ICL 1 +# define CV_CPU_CALL_AVX512_ICL(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_AVX512_ICL_(fn, args) return (opt_AVX512_ICL::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_AVX512_ICL +# define CV_TRY_AVX512_ICL 1 +# define CV_CPU_FORCE_AVX512_ICL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_ICL (cv::checkHardwareSupport(CV_CPU_AVX512_ICL)) +# define CV_CPU_CALL_AVX512_ICL(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_ICL) return (opt_AVX512_ICL::fn args) +# define CV_CPU_CALL_AVX512_ICL_(fn, args) if (CV_CPU_HAS_SUPPORT_AVX512_ICL) return (opt_AVX512_ICL::fn args) +#else +# define CV_TRY_AVX512_ICL 0 +# define CV_CPU_FORCE_AVX512_ICL 0 +# define CV_CPU_HAS_SUPPORT_AVX512_ICL 0 +# define CV_CPU_CALL_AVX512_ICL(fn, args) +# define CV_CPU_CALL_AVX512_ICL_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_AVX512_ICL(fn, args, mode, ...) CV_CPU_CALL_AVX512_ICL(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_NEON +# define CV_TRY_NEON 1 +# define CV_CPU_FORCE_NEON 1 +# define CV_CPU_HAS_SUPPORT_NEON 1 +# define CV_CPU_CALL_NEON(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_NEON_(fn, args) return (opt_NEON::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_NEON +# define CV_TRY_NEON 1 +# define CV_CPU_FORCE_NEON 0 +# define CV_CPU_HAS_SUPPORT_NEON (cv::checkHardwareSupport(CV_CPU_NEON)) +# define CV_CPU_CALL_NEON(fn, args) if (CV_CPU_HAS_SUPPORT_NEON) return (opt_NEON::fn args) +# define CV_CPU_CALL_NEON_(fn, args) if (CV_CPU_HAS_SUPPORT_NEON) return (opt_NEON::fn args) +#else +# define CV_TRY_NEON 0 +# define CV_CPU_FORCE_NEON 0 +# define CV_CPU_HAS_SUPPORT_NEON 0 +# define CV_CPU_CALL_NEON(fn, args) +# define CV_CPU_CALL_NEON_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_NEON(fn, args, mode, ...) CV_CPU_CALL_NEON(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_NEON_DOTPROD +# define CV_TRY_NEON_DOTPROD 1 +# define CV_CPU_FORCE_NEON_DOTPROD 1 +# define CV_CPU_HAS_SUPPORT_NEON_DOTPROD 1 +# define CV_CPU_CALL_NEON_DOTPROD(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_NEON_DOTPROD_(fn, args) return (opt_NEON_DOTPROD::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_NEON_DOTPROD +# define CV_TRY_NEON_DOTPROD 1 +# define CV_CPU_FORCE_NEON_DOTPROD 0 +# define CV_CPU_HAS_SUPPORT_NEON_DOTPROD (cv::checkHardwareSupport(CV_CPU_NEON_DOTPROD)) +# define CV_CPU_CALL_NEON_DOTPROD(fn, args) if (CV_CPU_HAS_SUPPORT_NEON_DOTPROD) return (opt_NEON_DOTPROD::fn args) +# define CV_CPU_CALL_NEON_DOTPROD_(fn, args) if (CV_CPU_HAS_SUPPORT_NEON_DOTPROD) return (opt_NEON_DOTPROD::fn args) +#else +# define CV_TRY_NEON_DOTPROD 0 +# define CV_CPU_FORCE_NEON_DOTPROD 0 +# define CV_CPU_HAS_SUPPORT_NEON_DOTPROD 0 +# define CV_CPU_CALL_NEON_DOTPROD(fn, args) +# define CV_CPU_CALL_NEON_DOTPROD_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_NEON_DOTPROD(fn, args, mode, ...) CV_CPU_CALL_NEON_DOTPROD(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_MSA +# define CV_TRY_MSA 1 +# define CV_CPU_FORCE_MSA 1 +# define CV_CPU_HAS_SUPPORT_MSA 1 +# define CV_CPU_CALL_MSA(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_MSA_(fn, args) return (opt_MSA::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_MSA +# define CV_TRY_MSA 1 +# define CV_CPU_FORCE_MSA 0 +# define CV_CPU_HAS_SUPPORT_MSA (cv::checkHardwareSupport(CV_CPU_MSA)) +# define CV_CPU_CALL_MSA(fn, args) if (CV_CPU_HAS_SUPPORT_MSA) return (opt_MSA::fn args) +# define CV_CPU_CALL_MSA_(fn, args) if (CV_CPU_HAS_SUPPORT_MSA) return (opt_MSA::fn args) +#else +# define CV_TRY_MSA 0 +# define CV_CPU_FORCE_MSA 0 +# define CV_CPU_HAS_SUPPORT_MSA 0 +# define CV_CPU_CALL_MSA(fn, args) +# define CV_CPU_CALL_MSA_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_MSA(fn, args, mode, ...) CV_CPU_CALL_MSA(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_VSX +# define CV_TRY_VSX 1 +# define CV_CPU_FORCE_VSX 1 +# define CV_CPU_HAS_SUPPORT_VSX 1 +# define CV_CPU_CALL_VSX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_VSX_(fn, args) return (opt_VSX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_VSX +# define CV_TRY_VSX 1 +# define CV_CPU_FORCE_VSX 0 +# define CV_CPU_HAS_SUPPORT_VSX (cv::checkHardwareSupport(CV_CPU_VSX)) +# define CV_CPU_CALL_VSX(fn, args) if (CV_CPU_HAS_SUPPORT_VSX) return (opt_VSX::fn args) +# define CV_CPU_CALL_VSX_(fn, args) if (CV_CPU_HAS_SUPPORT_VSX) return (opt_VSX::fn args) +#else +# define CV_TRY_VSX 0 +# define CV_CPU_FORCE_VSX 0 +# define CV_CPU_HAS_SUPPORT_VSX 0 +# define CV_CPU_CALL_VSX(fn, args) +# define CV_CPU_CALL_VSX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_VSX(fn, args, mode, ...) CV_CPU_CALL_VSX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_VSX3 +# define CV_TRY_VSX3 1 +# define CV_CPU_FORCE_VSX3 1 +# define CV_CPU_HAS_SUPPORT_VSX3 1 +# define CV_CPU_CALL_VSX3(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_VSX3_(fn, args) return (opt_VSX3::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_VSX3 +# define CV_TRY_VSX3 1 +# define CV_CPU_FORCE_VSX3 0 +# define CV_CPU_HAS_SUPPORT_VSX3 (cv::checkHardwareSupport(CV_CPU_VSX3)) +# define CV_CPU_CALL_VSX3(fn, args) if (CV_CPU_HAS_SUPPORT_VSX3) return (opt_VSX3::fn args) +# define CV_CPU_CALL_VSX3_(fn, args) if (CV_CPU_HAS_SUPPORT_VSX3) return (opt_VSX3::fn args) +#else +# define CV_TRY_VSX3 0 +# define CV_CPU_FORCE_VSX3 0 +# define CV_CPU_HAS_SUPPORT_VSX3 0 +# define CV_CPU_CALL_VSX3(fn, args) +# define CV_CPU_CALL_VSX3_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_VSX3(fn, args, mode, ...) CV_CPU_CALL_VSX3(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_RVV +# define CV_TRY_RVV 1 +# define CV_CPU_FORCE_RVV 1 +# define CV_CPU_HAS_SUPPORT_RVV 1 +# define CV_CPU_CALL_RVV(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_RVV_(fn, args) return (opt_RVV::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_RVV +# define CV_TRY_RVV 1 +# define CV_CPU_FORCE_RVV 0 +# define CV_CPU_HAS_SUPPORT_RVV (cv::checkHardwareSupport(CV_CPU_RVV)) +# define CV_CPU_CALL_RVV(fn, args) if (CV_CPU_HAS_SUPPORT_RVV) return (opt_RVV::fn args) +# define CV_CPU_CALL_RVV_(fn, args) if (CV_CPU_HAS_SUPPORT_RVV) return (opt_RVV::fn args) +#else +# define CV_TRY_RVV 0 +# define CV_CPU_FORCE_RVV 0 +# define CV_CPU_HAS_SUPPORT_RVV 0 +# define CV_CPU_CALL_RVV(fn, args) +# define CV_CPU_CALL_RVV_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_RVV(fn, args, mode, ...) CV_CPU_CALL_RVV(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_LSX +# define CV_TRY_LSX 1 +# define CV_CPU_FORCE_LSX 1 +# define CV_CPU_HAS_SUPPORT_LSX 1 +# define CV_CPU_CALL_LSX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_LSX_(fn, args) return (opt_LSX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_LSX +# define CV_TRY_LSX 1 +# define CV_CPU_FORCE_LSX 0 +# define CV_CPU_HAS_SUPPORT_LSX (cv::checkHardwareSupport(CV_CPU_LSX)) +# define CV_CPU_CALL_LSX(fn, args) if (CV_CPU_HAS_SUPPORT_LSX) return (opt_LSX::fn args) +# define CV_CPU_CALL_LSX_(fn, args) if (CV_CPU_HAS_SUPPORT_LSX) return (opt_LSX::fn args) +#else +# define CV_TRY_LSX 0 +# define CV_CPU_FORCE_LSX 0 +# define CV_CPU_HAS_SUPPORT_LSX 0 +# define CV_CPU_CALL_LSX(fn, args) +# define CV_CPU_CALL_LSX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_LSX(fn, args, mode, ...) CV_CPU_CALL_LSX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#if !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_COMPILE_LASX +# define CV_TRY_LASX 1 +# define CV_CPU_FORCE_LASX 1 +# define CV_CPU_HAS_SUPPORT_LASX 1 +# define CV_CPU_CALL_LASX(fn, args) return (cpu_baseline::fn args) +# define CV_CPU_CALL_LASX_(fn, args) return (opt_LASX::fn args) +#elif !defined CV_DISABLE_OPTIMIZATION && defined CV_ENABLE_INTRINSICS && defined CV_CPU_DISPATCH_COMPILE_LASX +# define CV_TRY_LASX 1 +# define CV_CPU_FORCE_LASX 0 +# define CV_CPU_HAS_SUPPORT_LASX (cv::checkHardwareSupport(CV_CPU_LASX)) +# define CV_CPU_CALL_LASX(fn, args) if (CV_CPU_HAS_SUPPORT_LASX) return (opt_LASX::fn args) +# define CV_CPU_CALL_LASX_(fn, args) if (CV_CPU_HAS_SUPPORT_LASX) return (opt_LASX::fn args) +#else +# define CV_TRY_LASX 0 +# define CV_CPU_FORCE_LASX 0 +# define CV_CPU_HAS_SUPPORT_LASX 0 +# define CV_CPU_CALL_LASX(fn, args) +# define CV_CPU_CALL_LASX_(fn, args) +#endif +#define __CV_CPU_DISPATCH_CHAIN_LASX(fn, args, mode, ...) CV_CPU_CALL_LASX(fn, args); __CV_EXPAND(__CV_CPU_DISPATCH_CHAIN_ ## mode(fn, args, __VA_ARGS__)) + +#define CV_CPU_CALL_BASELINE(fn, args) return (cpu_baseline::fn args) +#define __CV_CPU_DISPATCH_CHAIN_BASELINE(fn, args, mode, ...) CV_CPU_CALL_BASELINE(fn, args) /* last in sequence */ diff --git a/Thirdparty/opencv2/include/opencv2/core/cvdef.h b/Thirdparty/opencv2/include/opencv2/core/cvdef.h new file mode 100644 index 0000000..99cd66f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cvdef.h @@ -0,0 +1,980 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CVDEF_H +#define OPENCV_CORE_CVDEF_H + +#include "opencv2/core/version.hpp" + +//! @addtogroup core_utils +//! @{ + +#ifdef OPENCV_INCLUDE_PORT_FILE // User-provided header file with custom platform configuration +#include OPENCV_INCLUDE_PORT_FILE +#endif + +#if !defined CV_DOXYGEN && !defined CV_IGNORE_DEBUG_BUILD_GUARD +#if (defined(_MSC_VER) && (defined(DEBUG) || defined(_DEBUG))) || \ + (defined(_GLIBCXX_DEBUG) || defined(_GLIBCXX_DEBUG_PEDANTIC)) +// Guard to prevent using of binary incompatible binaries / runtimes +// https://github.com/opencv/opencv/pull/9161 +#define CV__DEBUG_NS_BEGIN namespace debug_build_guard { +#define CV__DEBUG_NS_END } +namespace cv { namespace debug_build_guard { } using namespace debug_build_guard; } +#endif +#endif + +#ifndef CV__DEBUG_NS_BEGIN +#define CV__DEBUG_NS_BEGIN +#define CV__DEBUG_NS_END +#endif + + +#ifdef __OPENCV_BUILD +#include "cvconfig.h" +#endif + +#ifndef __CV_EXPAND +#define __CV_EXPAND(x) x +#endif + +#ifndef __CV_CAT +#define __CV_CAT__(x, y) x ## y +#define __CV_CAT_(x, y) __CV_CAT__(x, y) +#define __CV_CAT(x, y) __CV_CAT_(x, y) +#endif + +#define __CV_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define __CV_VA_NUM_ARGS(...) __CV_EXPAND(__CV_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) + +#ifdef CV_Func +// keep current value (through OpenCV port file) +#elif defined __GNUC__ || (defined (__cpluscplus) && (__cpluscplus >= 201103)) +#define CV_Func __func__ +#elif defined __clang__ && (__clang_minor__ * 100 + __clang_major__ >= 305) +#define CV_Func __func__ +#elif defined(__STDC_VERSION__) && (__STDC_VERSION >= 199901) +#define CV_Func __func__ +#elif defined _MSC_VER +#define CV_Func __FUNCTION__ +#elif defined(__INTEL_COMPILER) && (_INTEL_COMPILER >= 600) +#define CV_Func __FUNCTION__ +#elif defined __IBMCPP__ && __IBMCPP__ >=500 +#define CV_Func __FUNCTION__ +#elif defined __BORLAND__ && (__BORLANDC__ >= 0x550) +#define CV_Func __FUNC__ +#else +#define CV_Func "" +#endif + +//! @cond IGNORED + +//////////////// static assert ///////////////// +#define CVAUX_CONCAT_EXP(a, b) a##b +#define CVAUX_CONCAT(a, b) CVAUX_CONCAT_EXP(a,b) + +#if defined(__clang__) +# ifndef __has_extension +# define __has_extension __has_feature /* compatibility, for older versions of clang */ +# endif +# if __has_extension(cxx_static_assert) +# define CV_StaticAssert(condition, reason) static_assert((condition), reason " " #condition) +# elif __has_extension(c_static_assert) +# define CV_StaticAssert(condition, reason) _Static_assert((condition), reason " " #condition) +# endif +#elif defined(__GNUC__) +# if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) +# define CV_StaticAssert(condition, reason) static_assert((condition), reason " " #condition) +# endif +#elif defined(_MSC_VER) +# if _MSC_VER >= 1600 /* MSVC 10 */ +# define CV_StaticAssert(condition, reason) static_assert((condition), reason " " #condition) +# endif +#endif +#ifndef CV_StaticAssert +# if !defined(__clang__) && defined(__GNUC__) && (__GNUC__*100 + __GNUC_MINOR__ > 302) +# define CV_StaticAssert(condition, reason) ({ extern int __attribute__((error("CV_StaticAssert: " reason " " #condition))) CV_StaticAssert(); ((condition) ? 0 : CV_StaticAssert()); }) +# else +namespace cv { + template struct CV_StaticAssert_failed; + template <> struct CV_StaticAssert_failed { enum { val = 1 }; }; + template struct CV_StaticAssert_test {}; +} +# define CV_StaticAssert(condition, reason)\ + typedef cv::CV_StaticAssert_test< sizeof(cv::CV_StaticAssert_failed< static_cast(condition) >) > CVAUX_CONCAT(CV_StaticAssert_failed_at_, __LINE__) +# endif +#endif + +// Suppress warning "-Wdeprecated-declarations" / C4996 +#if defined(_MSC_VER) + #define CV_DO_PRAGMA(x) __pragma(x) +#elif defined(__GNUC__) + #define CV_DO_PRAGMA(x) _Pragma (#x) +#else + #define CV_DO_PRAGMA(x) +#endif + +#ifdef _MSC_VER +#define CV_SUPPRESS_DEPRECATED_START \ + CV_DO_PRAGMA(warning(push)) \ + CV_DO_PRAGMA(warning(disable: 4996)) +#define CV_SUPPRESS_DEPRECATED_END CV_DO_PRAGMA(warning(pop)) +#elif defined (__clang__) || ((__GNUC__) && (__GNUC__*100 + __GNUC_MINOR__ > 405)) +#define CV_SUPPRESS_DEPRECATED_START \ + CV_DO_PRAGMA(GCC diagnostic push) \ + CV_DO_PRAGMA(GCC diagnostic ignored "-Wdeprecated-declarations") +#define CV_SUPPRESS_DEPRECATED_END CV_DO_PRAGMA(GCC diagnostic pop) +#else +#define CV_SUPPRESS_DEPRECATED_START +#define CV_SUPPRESS_DEPRECATED_END +#endif + +#define CV_UNUSED(name) (void)name + +//! @endcond + +// undef problematic defines sometimes defined by system headers (windows.h in particular) +#undef small +#undef min +#undef max +#undef abs +#undef Complex + +#if defined __cplusplus +#include +#else +#include +#endif + +#include "opencv2/core/hal/interface.h" + +#if defined __ICL +# define CV_ICC __ICL +#elif defined __ICC +# define CV_ICC __ICC +#elif defined __ECL +# define CV_ICC __ECL +#elif defined __ECC +# define CV_ICC __ECC +#elif defined __INTEL_COMPILER +# define CV_ICC __INTEL_COMPILER +#endif + +#ifndef CV_INLINE +# if defined __cplusplus +# define CV_INLINE static inline +# elif defined _MSC_VER +# define CV_INLINE __inline +# else +# define CV_INLINE static +# endif +#endif + +#ifndef CV_ALWAYS_INLINE +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define CV_ALWAYS_INLINE inline __attribute__((always_inline)) +#elif defined(_MSC_VER) +#define CV_ALWAYS_INLINE __forceinline +#else +#define CV_ALWAYS_INLINE inline +#endif +#endif + +#if defined CV_DISABLE_OPTIMIZATION || (defined CV_ICC && !defined CV_ENABLE_UNROLLED) +# define CV_ENABLE_UNROLLED 0 +#else +# define CV_ENABLE_UNROLLED 1 +#endif + +#ifdef __GNUC__ +# define CV_DECL_ALIGNED(x) __attribute__ ((aligned (x))) +#elif defined _MSC_VER +# define CV_DECL_ALIGNED(x) __declspec(align(x)) +#else +# define CV_DECL_ALIGNED(x) +#endif + +/* CPU features and intrinsics support */ +#define CV_CPU_NONE 0 +#define CV_CPU_MMX 1 +#define CV_CPU_SSE 2 +#define CV_CPU_SSE2 3 +#define CV_CPU_SSE3 4 +#define CV_CPU_SSSE3 5 +#define CV_CPU_SSE4_1 6 +#define CV_CPU_SSE4_2 7 +#define CV_CPU_POPCNT 8 +#define CV_CPU_FP16 9 +#define CV_CPU_AVX 10 +#define CV_CPU_AVX2 11 +#define CV_CPU_FMA3 12 + +#define CV_CPU_AVX_512F 13 +#define CV_CPU_AVX_512BW 14 +#define CV_CPU_AVX_512CD 15 +#define CV_CPU_AVX_512DQ 16 +#define CV_CPU_AVX_512ER 17 +#define CV_CPU_AVX_512IFMA512 18 // deprecated +#define CV_CPU_AVX_512IFMA 18 +#define CV_CPU_AVX_512PF 19 +#define CV_CPU_AVX_512VBMI 20 +#define CV_CPU_AVX_512VL 21 +#define CV_CPU_AVX_512VBMI2 22 +#define CV_CPU_AVX_512VNNI 23 +#define CV_CPU_AVX_512BITALG 24 +#define CV_CPU_AVX_512VPOPCNTDQ 25 +#define CV_CPU_AVX_5124VNNIW 26 +#define CV_CPU_AVX_5124FMAPS 27 + +#define CV_CPU_NEON 100 +#define CV_CPU_NEON_DOTPROD 101 +#define CV_CPU_NEON_FP16 102 +#define CV_CPU_NEON_BF16 103 + +#define CV_CPU_MSA 150 + +#define CV_CPU_RISCVV 170 + +#define CV_CPU_VSX 200 +#define CV_CPU_VSX3 201 + +#define CV_CPU_RVV 210 + +#define CV_CPU_LSX 230 +#define CV_CPU_LASX 231 + +// CPU features groups +#define CV_CPU_AVX512_SKX 256 +#define CV_CPU_AVX512_COMMON 257 +#define CV_CPU_AVX512_KNL 258 +#define CV_CPU_AVX512_KNM 259 +#define CV_CPU_AVX512_CNL 260 +#define CV_CPU_AVX512_CLX 261 +#define CV_CPU_AVX512_ICL 262 + +// when adding to this list remember to update the following enum +#define CV_HARDWARE_MAX_FEATURE 512 + +/** @brief Available CPU features. +*/ +enum CpuFeatures { + CPU_MMX = 1, + CPU_SSE = 2, + CPU_SSE2 = 3, + CPU_SSE3 = 4, + CPU_SSSE3 = 5, + CPU_SSE4_1 = 6, + CPU_SSE4_2 = 7, + CPU_POPCNT = 8, + CPU_FP16 = 9, + CPU_AVX = 10, + CPU_AVX2 = 11, + CPU_FMA3 = 12, + + CPU_AVX_512F = 13, + CPU_AVX_512BW = 14, + CPU_AVX_512CD = 15, + CPU_AVX_512DQ = 16, + CPU_AVX_512ER = 17, + CPU_AVX_512IFMA512 = 18, // deprecated + CPU_AVX_512IFMA = 18, + CPU_AVX_512PF = 19, + CPU_AVX_512VBMI = 20, + CPU_AVX_512VL = 21, + CPU_AVX_512VBMI2 = 22, + CPU_AVX_512VNNI = 23, + CPU_AVX_512BITALG = 24, + CPU_AVX_512VPOPCNTDQ= 25, + CPU_AVX_5124VNNIW = 26, + CPU_AVX_5124FMAPS = 27, + + CPU_NEON = 100, + CPU_NEON_DOTPROD = 101, + CPU_NEON_FP16 = 102, + CPU_NEON_BF16 = 103, + + CPU_MSA = 150, + + CPU_RISCVV = 170, + + CPU_VSX = 200, + CPU_VSX3 = 201, + + CPU_RVV = 210, + + CPU_LSX = 230, + CPU_LASX = 231, + + CPU_AVX512_SKX = 256, //!< Skylake-X with AVX-512F/CD/BW/DQ/VL + CPU_AVX512_COMMON = 257, //!< Common instructions AVX-512F/CD for all CPUs that support AVX-512 + CPU_AVX512_KNL = 258, //!< Knights Landing with AVX-512F/CD/ER/PF + CPU_AVX512_KNM = 259, //!< Knights Mill with AVX-512F/CD/ER/PF/4FMAPS/4VNNIW/VPOPCNTDQ + CPU_AVX512_CNL = 260, //!< Cannon Lake with AVX-512F/CD/BW/DQ/VL/IFMA/VBMI + CPU_AVX512_CLX = 261, //!< Cascade Lake with AVX-512F/CD/BW/DQ/VL/VNNI + CPU_AVX512_ICL = 262, //!< Ice Lake with AVX-512F/CD/BW/DQ/VL/IFMA/VBMI/VNNI/VBMI2/BITALG/VPOPCNTDQ + + CPU_MAX_FEATURE = 512 // see CV_HARDWARE_MAX_FEATURE +}; + + +#include "cv_cpu_dispatch.h" + +#if !defined(CV_STRONG_ALIGNMENT) && defined(__arm__) && !(defined(__aarch64__) || defined(_M_ARM64)) +// int*, int64* should be propertly aligned pointers on ARMv7 +#define CV_STRONG_ALIGNMENT 1 +#endif +#if !defined(CV_STRONG_ALIGNMENT) +#define CV_STRONG_ALIGNMENT 0 +#endif + +/* fundamental constants */ +#define CV_PI 3.1415926535897932384626433832795 +#define CV_2PI 6.283185307179586476925286766559 +#define CV_LOG2 0.69314718055994530941723212145818 + +#if defined __ARM_FP16_FORMAT_IEEE \ + && !defined __CUDACC__ +# define CV_FP16_TYPE 1 +#else +# define CV_FP16_TYPE 0 +#endif + +typedef union Cv16suf +{ + short i; + ushort u; +#if CV_FP16_TYPE + __fp16 h; +#endif +} +Cv16suf; + +typedef union Cv32suf +{ + int i; + unsigned u; + float f; +} +Cv32suf; + +typedef union Cv64suf +{ + int64 i; + uint64 u; + double f; +} +Cv64suf; + +#ifndef OPENCV_ABI_COMPATIBILITY +#define OPENCV_ABI_COMPATIBILITY 400 +#endif + +#ifdef __OPENCV_BUILD +# define DISABLE_OPENCV_3_COMPATIBILITY +# define OPENCV_DISABLE_DEPRECATED_COMPATIBILITY +#endif + +#ifndef CV_EXPORTS +# if (defined _WIN32 || defined WINCE || defined __CYGWIN__) && defined(CVAPI_EXPORTS) +# define CV_EXPORTS __declspec(dllexport) +# elif defined __GNUC__ && __GNUC__ >= 4 && (defined(CVAPI_EXPORTS) || defined(__APPLE__)) +# define CV_EXPORTS __attribute__ ((visibility ("default"))) +# endif +#endif + +#ifndef CV_EXPORTS +# define CV_EXPORTS +#endif + +#ifdef _MSC_VER +# define CV_EXPORTS_TEMPLATE +#else +# define CV_EXPORTS_TEMPLATE CV_EXPORTS +#endif + +#ifndef CV_DEPRECATED +# if defined(__GNUC__) +# define CV_DEPRECATED __attribute__ ((deprecated)) +# elif defined(_MSC_VER) +# define CV_DEPRECATED __declspec(deprecated) +# else +# define CV_DEPRECATED +# endif +#endif + +#ifndef CV_DEPRECATED_EXTERNAL +# if defined(__OPENCV_BUILD) +# define CV_DEPRECATED_EXTERNAL /* nothing */ +# else +# define CV_DEPRECATED_EXTERNAL CV_DEPRECATED +# endif +#endif + + +#ifndef CV_EXTERN_C +# ifdef __cplusplus +# define CV_EXTERN_C extern "C" +# else +# define CV_EXTERN_C +# endif +#endif + +/* special informative macros for wrapper generators */ +#define CV_EXPORTS_W CV_EXPORTS +#define CV_EXPORTS_W_SIMPLE CV_EXPORTS +#define CV_EXPORTS_AS(synonym) CV_EXPORTS +#define CV_EXPORTS_W_MAP CV_EXPORTS +#define CV_EXPORTS_W_PARAMS CV_EXPORTS +#define CV_IN_OUT +#define CV_OUT +#define CV_PROP +#define CV_PROP_RW +#define CV_WRAP +#define CV_WRAP_AS(synonym) +#define CV_WRAP_MAPPABLE(mappable) +#define CV_WRAP_PHANTOM(phantom_header) +#define CV_WRAP_DEFAULT(val) + +/****************************************************************************************\ +* Matrix type (Mat) * +\****************************************************************************************/ + +#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT) +#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1) +#define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1) +#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK) +#define CV_MAT_CONT_FLAG_SHIFT 14 +#define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT) +#define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG) +#define CV_IS_CONT_MAT CV_IS_MAT_CONT +#define CV_SUBMAT_FLAG_SHIFT 15 +#define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT) +#define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG) + +/** Size of each channel item, + 0x28442211 = 0010 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */ +#define CV_ELEM_SIZE1(type) ((0x28442211 >> CV_MAT_DEPTH(type)*4) & 15) + +#define CV_ELEM_SIZE(type) (CV_MAT_CN(type)*CV_ELEM_SIZE1(type)) + +#ifndef MIN +# define MIN(a,b) ((a) > (b) ? (b) : (a)) +#endif + +#ifndef MAX +# define MAX(a,b) ((a) < (b) ? (b) : (a)) +#endif + +///////////////////////////////////////// Enum operators /////////////////////////////////////// + +/** + +Provides compatibility operators for both classical and C++11 enum classes, +as well as exposing the C++11 enum class members for backwards compatibility + +@code + // Provides operators required for flag enums + CV_ENUM_FLAGS(AccessFlag) + + // Exposes the listed members of the enum class AccessFlag to the current namespace + CV_ENUM_CLASS_EXPOSE(AccessFlag, ACCESS_READ [, ACCESS_WRITE [, ...] ]); +@endcode +*/ + +#define __CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST) \ +static const EnumType MEMBER_CONST = EnumType::MEMBER_CONST; \ + +#define __CV_ENUM_CLASS_EXPOSE_2(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_1(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_3(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_2(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_4(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_3(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_5(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_4(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_6(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_5(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_7(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_6(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_8(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_7(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_CLASS_EXPOSE_9(EnumType, MEMBER_CONST, ...) \ +__CV_ENUM_CLASS_EXPOSE_1(EnumType, MEMBER_CONST); \ +__CV_EXPAND(__CV_ENUM_CLASS_EXPOSE_8(EnumType, __VA_ARGS__)); \ + +#define __CV_ENUM_FLAGS_LOGICAL_NOT(EnumType) \ +static inline bool operator!(const EnumType& val) \ +{ \ + typedef std::underlying_type::type UnderlyingType; \ + return !static_cast(val); \ +} \ + +#define __CV_ENUM_FLAGS_LOGICAL_NOT_EQ(Arg1Type, Arg2Type) \ +static inline bool operator!=(const Arg1Type& a, const Arg2Type& b) \ +{ \ + return static_cast(a) != static_cast(b); \ +} \ + +#define __CV_ENUM_FLAGS_LOGICAL_EQ(Arg1Type, Arg2Type) \ +static inline bool operator==(const Arg1Type& a, const Arg2Type& b) \ +{ \ + return static_cast(a) == static_cast(b); \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_NOT(EnumType) \ +static inline EnumType operator~(const EnumType& val) \ +{ \ + typedef std::underlying_type::type UnderlyingType; \ + return static_cast(~static_cast(val)); \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_OR(EnumType, Arg1Type, Arg2Type) \ +static inline EnumType operator|(const Arg1Type& a, const Arg2Type& b) \ +{ \ + typedef std::underlying_type::type UnderlyingType; \ + return static_cast(static_cast(a) | static_cast(b)); \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_AND(EnumType, Arg1Type, Arg2Type) \ +static inline EnumType operator&(const Arg1Type& a, const Arg2Type& b) \ +{ \ + typedef std::underlying_type::type UnderlyingType; \ + return static_cast(static_cast(a) & static_cast(b)); \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_XOR(EnumType, Arg1Type, Arg2Type) \ +static inline EnumType operator^(const Arg1Type& a, const Arg2Type& b) \ +{ \ + typedef std::underlying_type::type UnderlyingType; \ + return static_cast(static_cast(a) ^ static_cast(b)); \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_OR_EQ(EnumType, Arg1Type) \ +static inline EnumType& operator|=(EnumType& _this, const Arg1Type& val) \ +{ \ + _this = static_cast(static_cast(_this) | static_cast(val)); \ + return _this; \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_AND_EQ(EnumType, Arg1Type) \ +static inline EnumType& operator&=(EnumType& _this, const Arg1Type& val) \ +{ \ + _this = static_cast(static_cast(_this) & static_cast(val)); \ + return _this; \ +} \ + +#define __CV_ENUM_FLAGS_BITWISE_XOR_EQ(EnumType, Arg1Type) \ +static inline EnumType& operator^=(EnumType& _this, const Arg1Type& val) \ +{ \ + _this = static_cast(static_cast(_this) ^ static_cast(val)); \ + return _this; \ +} \ + +#define CV_ENUM_CLASS_EXPOSE(EnumType, ...) \ +__CV_EXPAND(__CV_CAT(__CV_ENUM_CLASS_EXPOSE_, __CV_VA_NUM_ARGS(__VA_ARGS__))(EnumType, __VA_ARGS__)); \ + +#define CV_ENUM_FLAGS(EnumType) \ +__CV_ENUM_FLAGS_LOGICAL_NOT (EnumType) \ +__CV_ENUM_FLAGS_LOGICAL_EQ (EnumType, int) \ +__CV_ENUM_FLAGS_LOGICAL_NOT_EQ (EnumType, int) \ + \ +__CV_ENUM_FLAGS_BITWISE_NOT (EnumType) \ +__CV_ENUM_FLAGS_BITWISE_OR (EnumType, EnumType, EnumType) \ +__CV_ENUM_FLAGS_BITWISE_AND (EnumType, EnumType, EnumType) \ +__CV_ENUM_FLAGS_BITWISE_XOR (EnumType, EnumType, EnumType) \ + \ +__CV_ENUM_FLAGS_BITWISE_OR_EQ (EnumType, EnumType) \ +__CV_ENUM_FLAGS_BITWISE_AND_EQ (EnumType, EnumType) \ +__CV_ENUM_FLAGS_BITWISE_XOR_EQ (EnumType, EnumType) \ + +/****************************************************************************************\ +* static analysys * +\****************************************************************************************/ + +// In practice, some macro are not processed correctly (noreturn is not detected). +// We need to use simplified definition for them. +#ifndef CV_STATIC_ANALYSIS +# if defined(__KLOCWORK__) || defined(__clang_analyzer__) || defined(__COVERITY__) +# define CV_STATIC_ANALYSIS 1 +# endif +#else +# if defined(CV_STATIC_ANALYSIS) && !(__CV_CAT(1, CV_STATIC_ANALYSIS) == 1) // defined and not empty +# if 0 == CV_STATIC_ANALYSIS +# undef CV_STATIC_ANALYSIS +# endif +# endif +#endif + +/****************************************************************************************\ +* Thread sanitizer * +\****************************************************************************************/ +#ifndef CV_THREAD_SANITIZER +# if defined(__has_feature) +# if __has_feature(thread_sanitizer) +# define CV_THREAD_SANITIZER +# endif +# endif +#endif + +/****************************************************************************************\ +* exchange-add operation for atomic operations on reference counters * +\****************************************************************************************/ + +#ifdef CV_XADD + // allow to use user-defined macro +#elif defined __GNUC__ || defined __clang__ +# if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__) && !defined __INTEL_COMPILER +# ifdef __ATOMIC_ACQ_REL +# define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL) +# else +# define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4) +# endif +# else +# if defined __ATOMIC_ACQ_REL && !defined __clang__ + // version for gcc >= 4.7 +# define CV_XADD(addr, delta) (int)__atomic_fetch_add((unsigned*)(addr), (unsigned)(delta), __ATOMIC_ACQ_REL) +# else +# define CV_XADD(addr, delta) (int)__sync_fetch_and_add((unsigned*)(addr), (unsigned)(delta)) +# endif +# endif +#elif defined _MSC_VER && !defined RC_INVOKED +# include +# define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta) +#else + #ifdef OPENCV_FORCE_UNSAFE_XADD + CV_INLINE int CV_XADD(int* addr, int delta) { int tmp = *addr; *addr += delta; return tmp; } + #else + #error "OpenCV: can't define safe CV_XADD macro for current platform (unsupported). Define CV_XADD macro through custom port header (see OPENCV_INCLUDE_PORT_FILE)" + #endif +#endif + + +/****************************************************************************************\ +* CV_NORETURN attribute * +\****************************************************************************************/ + +#ifndef CV_NORETURN +# if defined(__GNUC__) +# define CV_NORETURN __attribute__((__noreturn__)) +# elif defined(_MSC_VER) && (_MSC_VER >= 1300) +# define CV_NORETURN __declspec(noreturn) +# else +# define CV_NORETURN /* nothing by default */ +# endif +#endif + +/****************************************************************************************\ +* CV_NODISCARD_STD attribute (C++17) * +* encourages the compiler to issue a warning if the return value is discarded * +\****************************************************************************************/ +#ifndef CV_NODISCARD_STD +# ifndef __has_cpp_attribute +// workaround preprocessor non-compliance https://reviews.llvm.org/D57851 +# define __has_cpp_attribute(__x) 0 +# endif +# if __has_cpp_attribute(nodiscard) +# define CV_NODISCARD_STD [[nodiscard]] +# elif __cplusplus >= 201703L +// available when compiler is C++17 compliant +# define CV_NODISCARD_STD [[nodiscard]] +# elif defined(__INTEL_COMPILER) + // see above, available when C++17 is enabled +# elif defined(_MSC_VER) && _MSC_VER >= 1911 && _MSVC_LANG >= 201703L +// available with VS2017 v15.3+ with /std:c++17 or higher; works on functions and classes +# define CV_NODISCARD_STD [[nodiscard]] +# elif defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 700) && (__cplusplus >= 201103L) +// available with GCC 7.0+; works on functions, works or silently fails on classes +# define CV_NODISCARD_STD [[nodiscard]] +# elif defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 408) && (__cplusplus >= 201103L) +// available with GCC 4.8+ but it usually does nothing and can fail noisily -- therefore not used +// define CV_NODISCARD_STD [[gnu::warn_unused_result]] +# endif +#endif +#ifndef CV_NODISCARD_STD +# define CV_NODISCARD_STD /* nothing by default */ +#endif + + +/****************************************************************************************\ +* CV_NODISCARD attribute (deprecated, GCC only) * +* DONT USE: use instead the standard CV_NODISCARD_STD macro above * +* this legacy method silently fails to issue warning until some version * +* after gcc 6.3.0. Yet with gcc 7+ you can use the above standard method * +* which makes this method useless. Don't use it. * +* @deprecated use instead CV_NODISCARD_STD * +\****************************************************************************************/ +#ifndef CV_NODISCARD +# if defined(__GNUC__) +# define CV_NODISCARD __attribute__((__warn_unused_result__)) +# elif defined(__clang__) && defined(__has_attribute) +# if __has_attribute(__warn_unused_result__) +# define CV_NODISCARD __attribute__((__warn_unused_result__)) +# endif +# endif +#endif +#ifndef CV_NODISCARD +# define CV_NODISCARD /* nothing by default */ +#endif + + +/****************************************************************************************\ +* C++ 11 * +\****************************************************************************************/ +#ifndef CV_CXX11 +# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) +# define CV_CXX11 1 +# endif +#else +# if CV_CXX11 == 0 +# undef CV_CXX11 +# endif +#endif +#ifndef CV_CXX11 +# error "OpenCV 4.x+ requires enabled C++11 support" +#endif + +#define CV_CXX_MOVE_SEMANTICS 1 +#define CV_CXX_MOVE(x) std::move(x) +#define CV_CXX_STD_ARRAY 1 +#include +#ifndef CV_OVERRIDE +# define CV_OVERRIDE override +#endif +#ifndef CV_FINAL +# define CV_FINAL final +#endif + +#ifndef CV_NOEXCEPT +# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/) +# define CV_NOEXCEPT noexcept +# endif +#endif +#ifndef CV_NOEXCEPT +# define CV_NOEXCEPT +#endif + +#ifndef CV_CONSTEXPR +# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/) +# define CV_CONSTEXPR constexpr +# endif +#endif +#ifndef CV_CONSTEXPR +# define CV_CONSTEXPR +#endif + +// Integer types portability +#ifdef OPENCV_STDINT_HEADER +#include OPENCV_STDINT_HEADER +#elif defined(__cplusplus) +#if defined(_MSC_VER) && _MSC_VER < 1600 /* MSVS 2010 */ +namespace cv { +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +} +#elif defined(_MSC_VER) || __cplusplus >= 201103L +#include +namespace cv { +using std::int8_t; +using std::uint8_t; +using std::int16_t; +using std::uint16_t; +using std::int32_t; +using std::uint32_t; +using std::int64_t; +using std::uint64_t; +} +#else +#include +namespace cv { +typedef ::int8_t int8_t; +typedef ::uint8_t uint8_t; +typedef ::int16_t int16_t; +typedef ::uint16_t uint16_t; +typedef ::int32_t int32_t; +typedef ::uint32_t uint32_t; +typedef ::int64_t int64_t; +typedef ::uint64_t uint64_t; +} +#endif +#else // pure C +#include +#endif + +#ifdef __cplusplus +namespace cv +{ + +class float16_t +{ +public: +#if CV_FP16_TYPE + + float16_t() : h(0) {} + explicit float16_t(float x) { h = (__fp16)x; } + operator float() const { return (float)h; } + static float16_t fromBits(ushort w) + { + Cv16suf u; + u.u = w; + float16_t result; + result.h = u.h; + return result; + } + static float16_t zero() + { + float16_t result; + result.h = (__fp16)0; + return result; + } + ushort bits() const + { + Cv16suf u; + u.h = h; + return u.u; + } +protected: + __fp16 h; + +#else + float16_t() : w(0) {} + explicit float16_t(float x) + { + #if CV_FP16 + __m128 v = _mm_load_ss(&x); + w = (ushort)_mm_cvtsi128_si32(_mm_cvtps_ph(v, 0)); + #else + Cv32suf in; + in.f = x; + unsigned sign = in.u & 0x80000000; + in.u ^= sign; + + if( in.u >= 0x47800000 ) + w = (ushort)(in.u > 0x7f800000 ? 0x7e00 : 0x7c00); + else + { + if (in.u < 0x38800000) + { + in.f += 0.5f; + w = (ushort)(in.u - 0x3f000000); + } + else + { + unsigned t = in.u + 0xc8000fff; + w = (ushort)((t + ((in.u >> 13) & 1)) >> 13); + } + } + + w = (ushort)(w | (sign >> 16)); + #endif + } + + operator float() const + { + #if CV_FP16 + float f; + _mm_store_ss(&f, _mm_cvtph_ps(_mm_cvtsi32_si128(w))); + return f; + #else + Cv32suf out; + + unsigned t = ((w & 0x7fff) << 13) + 0x38000000; + unsigned sign = (w & 0x8000) << 16; + unsigned e = w & 0x7c00; + + out.u = t + (1 << 23); + out.u = (e >= 0x7c00 ? t + 0x38000000 : + e == 0 ? (static_cast(out.f -= 6.103515625e-05f), out.u) : t) | sign; + return out.f; + #endif + } + + static float16_t fromBits(ushort b) + { + float16_t result; + result.w = b; + return result; + } + static float16_t zero() + { + float16_t result; + result.w = (ushort)0; + return result; + } + ushort bits() const { return w; } +protected: + ushort w; + +#endif +}; + +} +#endif + +//! @} + +#ifndef __cplusplus +#include "opencv2/core/fast_math.hpp" // define cvRound(double) +#endif + +#endif // OPENCV_CORE_CVDEF_H diff --git a/Thirdparty/opencv2/include/opencv2/core/cvstd.hpp b/Thirdparty/opencv2/include/opencv2/core/cvstd.hpp new file mode 100644 index 0000000..6ce9e4b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cvstd.hpp @@ -0,0 +1,190 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CVSTD_HPP +#define OPENCV_CORE_CVSTD_HPP + +#ifndef __cplusplus +# error cvstd.hpp header must be compiled as C++ +#endif + +#include "opencv2/core/cvdef.h" +#include +#include +#include + +#include + +// import useful primitives from stl +# include +# include +# include //for abs(int) +# include + +namespace cv +{ + static inline uchar abs(uchar a) { return a; } + static inline ushort abs(ushort a) { return a; } + static inline unsigned abs(unsigned a) { return a; } + static inline uint64 abs(uint64 a) { return a; } + + using std::min; + using std::max; + using std::abs; + using std::swap; + using std::sqrt; + using std::exp; + using std::pow; + using std::log; +} + +#include "cvstd_wrapper.hpp" + +namespace cv { + +//! @addtogroup core_utils +//! @{ + +//////////////////////////// memory management functions //////////////////////////// + +/** @brief Allocates an aligned memory buffer. + +The function allocates the buffer of the specified size and returns it. When the buffer size is 16 +bytes or more, the returned buffer is aligned to 16 bytes. +@param bufSize Allocated buffer size. + */ +CV_EXPORTS void* fastMalloc(size_t bufSize); + +/** @brief Deallocates a memory buffer. + +The function deallocates the buffer allocated with fastMalloc . If NULL pointer is passed, the +function does nothing. C version of the function clears the pointer *pptr* to avoid problems with +double memory deallocation. +@param ptr Pointer to the allocated buffer. + */ +CV_EXPORTS void fastFree(void* ptr); + +/*! + The STL-compliant memory Allocator based on cv::fastMalloc() and cv::fastFree() +*/ +template class Allocator +{ +public: + typedef _Tp value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + template class rebind { typedef Allocator other; }; + + explicit Allocator() {} + ~Allocator() {} + explicit Allocator(Allocator const&) {} + template + explicit Allocator(Allocator const&) {} + + // address + pointer address(reference r) { return &r; } + const_pointer address(const_reference r) { return &r; } + + pointer allocate(size_type count, const void* =0) { return reinterpret_cast(fastMalloc(count * sizeof (_Tp))); } + void deallocate(pointer p, size_type) { fastFree(p); } + + void construct(pointer p, const _Tp& v) { new(static_cast(p)) _Tp(v); } + void destroy(pointer p) { p->~_Tp(); } + + size_type max_size() const { return cv::max(static_cast<_Tp>(-1)/sizeof(_Tp), 1); } +}; + +//! @} core_utils + +//! @endcond + +//! @addtogroup core_basic +//! @{ + +//////////////////////////////// string class //////////////////////////////// + +class CV_EXPORTS FileNode; //for string constructor from FileNode + +typedef std::string String; + +#ifndef OPENCV_DISABLE_STRING_LOWER_UPPER_CONVERSIONS + +//! @cond IGNORED +namespace details { +// std::tolower is int->int +static inline char char_tolower(char ch) +{ + return (char)std::tolower((int)ch); +} +// std::toupper is int->int +static inline char char_toupper(char ch) +{ + return (char)std::toupper((int)ch); +} +} // namespace details +//! @endcond + +static inline std::string toLowerCase(const std::string& str) +{ + std::string result(str); + std::transform(result.begin(), result.end(), result.begin(), details::char_tolower); + return result; +} + +static inline std::string toUpperCase(const std::string& str) +{ + std::string result(str); + std::transform(result.begin(), result.end(), result.begin(), details::char_toupper); + return result; +} + +#endif // OPENCV_DISABLE_STRING_LOWER_UPPER_CONVERSIONS + +//! @} core_basic +} // cv + +#endif //OPENCV_CORE_CVSTD_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cvstd.inl.hpp b/Thirdparty/opencv2/include/opencv2/core/cvstd.inl.hpp new file mode 100644 index 0000000..37ad1e6 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cvstd.inl.hpp @@ -0,0 +1,197 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_CVSTDINL_HPP +#define OPENCV_CORE_CVSTDINL_HPP + +#include +#include +#include + +//! @cond IGNORED + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4127 ) +#endif + +namespace cv +{ + +template class DataType< std::complex<_Tp> > +{ +public: + typedef std::complex<_Tp> value_type; + typedef value_type work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + depth = DataType::depth, + channels = 2, + fmt = DataType::fmt + ((channels - 1) << 8), + type = CV_MAKETYPE(depth, channels) }; + + typedef Vec vec_type; +}; + +static inline +std::ostream& operator << (std::ostream& out, Ptr fmtd) +{ + fmtd->reset(); + for(const char* str = fmtd->next(); str; str = fmtd->next()) + out << str; + return out; +} + +static inline +std::ostream& operator << (std::ostream& out, const Mat& mtx) +{ + return out << Formatter::get()->format(mtx); +} + +static inline +std::ostream& operator << (std::ostream& out, const UMat& m) +{ + return out << m.getMat(ACCESS_READ); +} + +template static inline +std::ostream& operator << (std::ostream& out, const Complex<_Tp>& c) +{ + return out << "(" << c.re << "," << c.im << ")"; +} + +template static inline +std::ostream& operator << (std::ostream& out, const std::vector >& vec) +{ + return out << Formatter::get()->format(Mat(vec)); +} + + +template static inline +std::ostream& operator << (std::ostream& out, const std::vector >& vec) +{ + return out << Formatter::get()->format(Mat(vec)); +} + + +template static inline +std::ostream& operator << (std::ostream& out, const Matx<_Tp, m, n>& matx) +{ + return out << Formatter::get()->format(Mat(matx)); +} + +template static inline +std::ostream& operator << (std::ostream& out, const Point_<_Tp>& p) +{ + out << "[" << p.x << ", " << p.y << "]"; + return out; +} + +template static inline +std::ostream& operator << (std::ostream& out, const Point3_<_Tp>& p) +{ + out << "[" << p.x << ", " << p.y << ", " << p.z << "]"; + return out; +} + +template static inline +std::ostream& operator << (std::ostream& out, const Vec<_Tp, n>& vec) +{ + out << "["; + if (cv::traits::Depth<_Tp>::value <= CV_32S) + { + for (int i = 0; i < n - 1; ++i) { + out << (int)vec[i] << ", "; + } + out << (int)vec[n-1] << "]"; + } + else + { + for (int i = 0; i < n - 1; ++i) { + out << vec[i] << ", "; + } + out << vec[n-1] << "]"; + } + + return out; +} + +template static inline +std::ostream& operator << (std::ostream& out, const Size_<_Tp>& size) +{ + return out << "[" << size.width << " x " << size.height << "]"; +} + +template static inline +std::ostream& operator << (std::ostream& out, const Rect_<_Tp>& rect) +{ + return out << "[" << rect.width << " x " << rect.height << " from (" << rect.x << ", " << rect.y << ")]"; +} + +static inline std::ostream& operator << (std::ostream& out, const MatSize& msize) +{ + int i, dims = msize.dims(); + for( i = 0; i < dims; i++ ) + { + out << msize[i]; + if( i < dims-1 ) + out << " x "; + } + return out; +} + +static inline std::ostream &operator<< (std::ostream &s, cv::Range &r) +{ + return s << "[" << r.start << " : " << r.end << ")"; +} + +} // cv + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +//! @endcond + +#endif // OPENCV_CORE_CVSTDINL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/cvstd_wrapper.hpp b/Thirdparty/opencv2/include/opencv2/core/cvstd_wrapper.hpp new file mode 100644 index 0000000..25e0041 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/cvstd_wrapper.hpp @@ -0,0 +1,154 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_CVSTD_WRAPPER_HPP +#define OPENCV_CORE_CVSTD_WRAPPER_HPP + +#include "opencv2/core/cvdef.h" + +#include +#include // std::shared_ptr +#include // std::enable_if + +namespace cv { + +using std::nullptr_t; + +//! @addtogroup core_basic +//! @{ + +#ifdef CV_DOXYGEN + +template using Ptr = std::shared_ptr<_Tp>; // In ideal world it should look like this, but we need some compatibility workarounds below + +template static inline +Ptr<_Tp> makePtr(const A1&... a1) { return std::make_shared<_Tp>(a1...); } + +#else // cv::Ptr with compatibility workarounds + +// It should be defined for C-API types only. +// C++ types should use regular "delete" operator. +template struct DefaultDeleter; +#if 0 +{ + void operator()(Y* p) const; +}; +#endif + +namespace sfinae { +template +struct has_parenthesis_operator +{ +private: + template + static CV_CONSTEXPR std::true_type has_parenthesis_operator_check(typename std::is_same().operator()(std::declval()...))>::type, Ret>::type*); + + template static CV_CONSTEXPR std::false_type has_parenthesis_operator_check(...); + + typedef decltype(has_parenthesis_operator_check(0)) type; + +public: +#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/) + static CV_CONSTEXPR bool value = type::value; +#else + // support MSVS 2013 + static const int value = type::value; +#endif +}; +} // namespace sfinae + +template +struct has_custom_delete + : public std::false_type {}; + +// Force has_custom_delete to std::false_type when NVCC is compiling CUDA source files +#ifndef __CUDACC__ +template +struct has_custom_delete, void, T*>::value >::type > + : public std::true_type {}; +#endif + +template +struct Ptr : public std::shared_ptr +{ +#if 0 + using std::shared_ptr::shared_ptr; // GCC 5.x can't handle this +#else + inline Ptr() CV_NOEXCEPT : std::shared_ptr() {} + inline Ptr(nullptr_t) CV_NOEXCEPT : std::shared_ptr(nullptr) {} + template inline Ptr(Y* p, D d) : std::shared_ptr(p, d) {} + template inline Ptr(nullptr_t, D d) : std::shared_ptr(nullptr, d) {} + + template inline Ptr(const Ptr& r, T* ptr) CV_NOEXCEPT : std::shared_ptr(r, ptr) {} + + inline Ptr(const Ptr& o) CV_NOEXCEPT : std::shared_ptr(o) {} + inline Ptr(Ptr&& o) CV_NOEXCEPT : std::shared_ptr(std::move(o)) {} + + template inline Ptr(const Ptr& o) CV_NOEXCEPT : std::shared_ptr(o) {} + template inline Ptr(Ptr&& o) CV_NOEXCEPT : std::shared_ptr(std::move(o)) {} +#endif + inline Ptr(const std::shared_ptr& o) CV_NOEXCEPT : std::shared_ptr(o) {} + inline Ptr(std::shared_ptr&& o) CV_NOEXCEPT : std::shared_ptr(std::move(o)) {} + + // Overload with custom DefaultDeleter: Ptr(...) + template + inline Ptr(const std::true_type&, Y* ptr) : std::shared_ptr(ptr, DefaultDeleter()) {} + + // Overload without custom deleter: Ptr(...); + template + inline Ptr(const std::false_type&, Y* ptr) : std::shared_ptr(ptr) {} + + template + inline Ptr(Y* ptr) : Ptr(has_custom_delete(), ptr) {} + + // Overload with custom DefaultDeleter: Ptr(...) + template + inline void reset(const std::true_type&, Y* ptr) { std::shared_ptr::reset(ptr, DefaultDeleter()); } + + // Overload without custom deleter: Ptr(...); + template + inline void reset(const std::false_type&, Y* ptr) { std::shared_ptr::reset(ptr); } + + template + inline void reset(Y* ptr) { Ptr::reset(has_custom_delete(), ptr); } + + template + void reset(Y* ptr, Deleter d) { std::shared_ptr::reset(ptr, d); } + + void reset() CV_NOEXCEPT { std::shared_ptr::reset(); } + + Ptr& operator=(const Ptr& o) { std::shared_ptr::operator =(o); return *this; } + template inline Ptr& operator=(const Ptr& o) { std::shared_ptr::operator =(o); return *this; } + + T* operator->() const CV_NOEXCEPT { return std::shared_ptr::get();} + typename std::add_lvalue_reference::type operator*() const CV_NOEXCEPT { return *std::shared_ptr::get(); } + + // OpenCV 3.x methods (not a part of standard C++ library) + inline void release() { std::shared_ptr::reset(); } + inline operator T* () const { return std::shared_ptr::get(); } + inline bool empty() const { return std::shared_ptr::get() == nullptr; } + + template inline + Ptr staticCast() const CV_NOEXCEPT { return std::static_pointer_cast(*this); } + + template inline + Ptr constCast() const CV_NOEXCEPT { return std::const_pointer_cast(*this); } + + template inline + Ptr dynamicCast() const CV_NOEXCEPT { return std::dynamic_pointer_cast(*this); } +}; + +template static inline +Ptr<_Tp> makePtr(const A1&... a1) +{ + static_assert( !has_custom_delete<_Tp>::value, "Can't use this makePtr with custom DefaultDeleter"); + return (Ptr<_Tp>)std::make_shared<_Tp>(a1...); +} + +#endif // CV_DOXYGEN + +//! @} core_basic +} // cv + +#endif //OPENCV_CORE_CVSTD_WRAPPER_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/detail/async_promise.hpp b/Thirdparty/opencv2/include/opencv2/core/detail/async_promise.hpp new file mode 100644 index 0000000..6eb3fb5 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/detail/async_promise.hpp @@ -0,0 +1,71 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_ASYNC_PROMISE_HPP +#define OPENCV_CORE_ASYNC_PROMISE_HPP + +#include "../async.hpp" + +#include "exception_ptr.hpp" + +namespace cv { + +/** @addtogroup core_async +@{ +*/ + + +/** @brief Provides result of asynchronous operations + +*/ +class CV_EXPORTS AsyncPromise +{ +public: + ~AsyncPromise() CV_NOEXCEPT; + AsyncPromise() CV_NOEXCEPT; + explicit AsyncPromise(const AsyncPromise& o) CV_NOEXCEPT; + AsyncPromise& operator=(const AsyncPromise& o) CV_NOEXCEPT; + void release() CV_NOEXCEPT; + + /** Returns associated AsyncArray + @note Can be called once + */ + AsyncArray getArrayResult(); + + /** Stores asynchronous result. + @param[in] value result + */ + void setValue(InputArray value); + + // TODO "move" setters + +#if CV__EXCEPTION_PTR + /** Stores exception. + @param[in] exception exception to be raised in AsyncArray + */ + void setException(std::exception_ptr exception); +#endif + + /** Stores exception. + @param[in] exception exception to be raised in AsyncArray + */ + void setException(const cv::Exception& exception); + +#ifdef CV_CXX11 + explicit AsyncPromise(AsyncPromise&& o) { p = o.p; o.p = NULL; } + AsyncPromise& operator=(AsyncPromise&& o) CV_NOEXCEPT { std::swap(p, o.p); return *this; } +#endif + + + // PImpl + typedef struct AsyncArray::Impl Impl; friend struct AsyncArray::Impl; + inline void* _getImpl() const CV_NOEXCEPT { return p; } +protected: + Impl* p; +}; + + +//! @} +} // namespace +#endif // OPENCV_CORE_ASYNC_PROMISE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/detail/dispatch_helper.impl.hpp b/Thirdparty/opencv2/include/opencv2/core/detail/dispatch_helper.impl.hpp new file mode 100644 index 0000000..d6ec676 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/detail/dispatch_helper.impl.hpp @@ -0,0 +1,49 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_DETAIL_DISPATCH_HELPER_IMPL_HPP +#define OPENCV_CORE_DETAIL_DISPATCH_HELPER_IMPL_HPP + +//! @cond IGNORED + +namespace cv { +namespace detail { + +template class Functor, typename... Args> +static inline void depthDispatch(const int depth, Args&&... args) +{ + switch (depth) + { + case CV_8U: + Functor{}(std::forward(args)...); + break; + case CV_8S: + Functor{}(std::forward(args)...); + break; + case CV_16U: + Functor{}(std::forward(args)...); + break; + case CV_16S: + Functor{}(std::forward(args)...); + break; + case CV_32S: + Functor{}(std::forward(args)...); + break; + case CV_32F: + Functor{}(std::forward(args)...); + break; + case CV_64F: + Functor{}(std::forward(args)...); + break; + case CV_16F: + default: + CV_Error(cv::Error::BadDepth, "Unsupported matrix type."); + }; +} + +}} + +//! @endcond + +#endif //OPENCV_CORE_DETAIL_DISPATCH_HELPER_IMPL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/detail/exception_ptr.hpp b/Thirdparty/opencv2/include/opencv2/core/detail/exception_ptr.hpp new file mode 100644 index 0000000..d98ffc4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/detail/exception_ptr.hpp @@ -0,0 +1,27 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_DETAILS_EXCEPTION_PTR_H +#define OPENCV_CORE_DETAILS_EXCEPTION_PTR_H + +#ifndef CV__EXCEPTION_PTR +# if defined(__ANDROID__) && defined(ATOMIC_INT_LOCK_FREE) && ATOMIC_INT_LOCK_FREE < 2 +# define CV__EXCEPTION_PTR 0 // Not supported, details: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58938 +# elif defined(CV_CXX11) +# define CV__EXCEPTION_PTR 1 +# elif defined(_MSC_VER) +# define CV__EXCEPTION_PTR (_MSC_VER >= 1600) +# elif defined(__clang__) +# define CV__EXCEPTION_PTR 0 // C++11 only (see above) +# elif defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CV__EXCEPTION_PTR (__GXX_EXPERIMENTAL_CXX0X__ > 0) +# endif +#endif +#ifndef CV__EXCEPTION_PTR +# define CV__EXCEPTION_PTR 0 +#elif CV__EXCEPTION_PTR +# include // std::exception_ptr +#endif + +#endif // OPENCV_CORE_DETAILS_EXCEPTION_PTR_H diff --git a/Thirdparty/opencv2/include/opencv2/core/directx.hpp b/Thirdparty/opencv2/include/opencv2/core/directx.hpp new file mode 100644 index 0000000..056a85a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/directx.hpp @@ -0,0 +1,184 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors as is and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the copyright holders or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_DIRECTX_HPP +#define OPENCV_CORE_DIRECTX_HPP + +#include "mat.hpp" +#include "ocl.hpp" + +#if !defined(__d3d11_h__) +struct ID3D11Device; +struct ID3D11Texture2D; +#endif + +#if !defined(__d3d10_h__) +struct ID3D10Device; +struct ID3D10Texture2D; +#endif + +#if !defined(_D3D9_H_) +struct IDirect3DDevice9; +struct IDirect3DDevice9Ex; +struct IDirect3DSurface9; +#endif + + +namespace cv { namespace directx { + +namespace ocl { +using namespace cv::ocl; + +//! @addtogroup core_directx +// This section describes OpenCL and DirectX interoperability. +// +// To enable DirectX support, configure OpenCV using CMake with WITH_DIRECTX=ON . Note, DirectX is +// supported only on Windows. +// +// To use OpenCL functionality you should first initialize OpenCL context from DirectX resource. +// +//! @{ + +// TODO static functions in the Context class +//! @brief Creates OpenCL context from D3D11 device +// +//! @param pD3D11Device - pointer to D3D11 device +//! @return Returns reference to OpenCL Context +CV_EXPORTS Context& initializeContextFromD3D11Device(ID3D11Device* pD3D11Device); + +//! @brief Creates OpenCL context from D3D10 device +// +//! @param pD3D10Device - pointer to D3D10 device +//! @return Returns reference to OpenCL Context +CV_EXPORTS Context& initializeContextFromD3D10Device(ID3D10Device* pD3D10Device); + +//! @brief Creates OpenCL context from Direct3DDevice9Ex device +// +//! @param pDirect3DDevice9Ex - pointer to Direct3DDevice9Ex device +//! @return Returns reference to OpenCL Context +CV_EXPORTS Context& initializeContextFromDirect3DDevice9Ex(IDirect3DDevice9Ex* pDirect3DDevice9Ex); + +//! @brief Creates OpenCL context from Direct3DDevice9 device +// +//! @param pDirect3DDevice9 - pointer to Direct3Device9 device +//! @return Returns reference to OpenCL Context +CV_EXPORTS Context& initializeContextFromDirect3DDevice9(IDirect3DDevice9* pDirect3DDevice9); + +//! @} + +} // namespace cv::directx::ocl + +//! @addtogroup core_directx +//! @{ + +//! @brief Converts InputArray to ID3D11Texture2D. If destination texture format is DXGI_FORMAT_NV12 then +//! input UMat expected to be in BGR format and data will be downsampled and color-converted to NV12. +// +//! @note Note: Destination texture must be allocated by application. Function does memory copy from src to +//! pD3D11Texture2D +// +//! @param src - source InputArray +//! @param pD3D11Texture2D - destination D3D11 texture +CV_EXPORTS void convertToD3D11Texture2D(InputArray src, ID3D11Texture2D* pD3D11Texture2D); + +//! @brief Converts ID3D11Texture2D to OutputArray. If input texture format is DXGI_FORMAT_NV12 then +//! data will be upsampled and color-converted to BGR format. +// +//! @note Note: Destination matrix will be re-allocated if it has not enough memory to match texture size. +//! function does memory copy from pD3D11Texture2D to dst +// +//! @param pD3D11Texture2D - source D3D11 texture +//! @param dst - destination OutputArray +CV_EXPORTS void convertFromD3D11Texture2D(ID3D11Texture2D* pD3D11Texture2D, OutputArray dst); + +//! @brief Converts InputArray to ID3D10Texture2D +// +//! @note Note: function does memory copy from src to +//! pD3D10Texture2D +// +//! @param src - source InputArray +//! @param pD3D10Texture2D - destination D3D10 texture +CV_EXPORTS void convertToD3D10Texture2D(InputArray src, ID3D10Texture2D* pD3D10Texture2D); + +//! @brief Converts ID3D10Texture2D to OutputArray +// +//! @note Note: function does memory copy from pD3D10Texture2D +//! to dst +// +//! @param pD3D10Texture2D - source D3D10 texture +//! @param dst - destination OutputArray +CV_EXPORTS void convertFromD3D10Texture2D(ID3D10Texture2D* pD3D10Texture2D, OutputArray dst); + +//! @brief Converts InputArray to IDirect3DSurface9 +// +//! @note Note: function does memory copy from src to +//! pDirect3DSurface9 +// +//! @param src - source InputArray +//! @param pDirect3DSurface9 - destination D3D10 texture +//! @param surfaceSharedHandle - shared handle +CV_EXPORTS void convertToDirect3DSurface9(InputArray src, IDirect3DSurface9* pDirect3DSurface9, void* surfaceSharedHandle = NULL); + +//! @brief Converts IDirect3DSurface9 to OutputArray +// +//! @note Note: function does memory copy from pDirect3DSurface9 +//! to dst +// +//! @param pDirect3DSurface9 - source D3D10 texture +//! @param dst - destination OutputArray +//! @param surfaceSharedHandle - shared handle +CV_EXPORTS void convertFromDirect3DSurface9(IDirect3DSurface9* pDirect3DSurface9, OutputArray dst, void* surfaceSharedHandle = NULL); + +//! @brief Get OpenCV type from DirectX type +//! @param iDXGI_FORMAT - enum DXGI_FORMAT for D3D10/D3D11 +//! @return OpenCV type or -1 if there is no equivalent +CV_EXPORTS int getTypeFromDXGI_FORMAT(const int iDXGI_FORMAT); // enum DXGI_FORMAT for D3D10/D3D11 + +//! @brief Get OpenCV type from DirectX type +//! @param iD3DFORMAT - enum D3DTYPE for D3D9 +//! @return OpenCV type or -1 if there is no equivalent +CV_EXPORTS int getTypeFromD3DFORMAT(const int iD3DFORMAT); // enum D3DTYPE for D3D9 + +//! @} + +} } // namespace cv::directx + +#endif // OPENCV_CORE_DIRECTX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/dualquaternion.hpp b/Thirdparty/opencv2/include/opencv2/core/dualquaternion.hpp new file mode 100644 index 0000000..1f644e9 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/dualquaternion.hpp @@ -0,0 +1,979 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2020, Huawei Technologies Co., Ltd. All rights reserved. +// Third party copyrights are property of their respective owners. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Liangqian Kong +// Longbu Wang +#ifndef OPENCV_CORE_DUALQUATERNION_HPP +#define OPENCV_CORE_DUALQUATERNION_HPP + +#include +#include + +namespace cv{ +//! @addtogroup core +//! @{ + +template class DualQuat; +template std::ostream& operator<<(std::ostream&, const DualQuat<_Tp>&); + +/** + * Dual quaternions were introduced to describe rotation together with translation while ordinary + * quaternions can only describe rotation. It can be used for shortest path pose interpolation, + * local pose optimization or volumetric deformation. More details can be found + * - https://en.wikipedia.org/wiki/Dual_quaternion + * - ["A beginners guide to dual-quaternions: what they are, how they work, and how to use them for 3D character hierarchies", Ben Kenwright, 2012](https://borodust.org/public/shared/beginner_dual_quats.pdf) + * - ["Dual Quaternions", Yan-Bin Jia, 2013](http://web.cs.iastate.edu/~cs577/handouts/dual-quaternion.pdf) + * - ["Geometric Skinning with Approximate Dual Quaternion Blending", Kavan, 2008](https://www.cs.utah.edu/~ladislav/kavan08geometric/kavan08geometric) + * - http://rodolphe-vaillant.fr/?e=29 + * + * A unit dual quaternion can be classically represented as: + * \f[ + * \begin{equation} + * \begin{split} + * \sigma &= \left(r+\frac{\epsilon}{2}tr\right)\\ + * &= [w, x, y, z, w\_, x\_, y\_, z\_] + * \end{split} + * \end{equation} + * \f] + * where \f$r, t\f$ represents the rotation (ordinary unit quaternion) and translation (pure ordinary quaternion) respectively. + * + * A general dual quaternions which consist of two quaternions is usually represented in form of: + * \f[ + * \sigma = p + \epsilon q + * \f] + * where the introduced dual unit \f$\epsilon\f$ satisfies \f$\epsilon^2 = \epsilon^3 =...=0\f$, and \f$p, q\f$ are quaternions. + * + * Alternatively, dual quaternions can also be interpreted as four components which are all [dual numbers](https://www.cs.utah.edu/~ladislav/kavan08geometric/kavan08geometric): + * \f[ + * \sigma = \hat{q}_w + \hat{q}_xi + \hat{q}_yj + \hat{q}_zk + * \f] + * If we set \f$\hat{q}_x, \hat{q}_y\f$ and \f$\hat{q}_z\f$ equal to 0, a dual quaternion is transformed to a dual number. see normalize(). + * + * If you want to create a dual quaternion, you can use: + * + * ``` + * using namespace cv; + * double angle = CV_PI; + * + * // create from eight number + * DualQuatd dq1(1, 2, 3, 4, 5, 6, 7, 8); //p = [1,2,3,4]. q=[5,6,7,8] + * + * // create from Vec + * Vec v{1,2,3,4,5,6,7,8}; + * DualQuatd dq_v{v}; + * + * // create from two quaternion + * Quatd p(1, 2, 3, 4); + * Quatd q(5, 6, 7, 8); + * DualQuatd dq2 = DualQuatd::createFromQuat(p, q); + * + * // create from an angle, an axis and a translation + * Vec3d axis{0, 0, 1}; + * Vec3d trans{3, 4, 5}; + * DualQuatd dq3 = DualQuatd::createFromAngleAxisTrans(angle, axis, trans); + * + * // If you already have an instance of class Affine3, then you can use + * Affine3d R = dq3.toAffine3(); + * DualQuatd dq4 = DualQuatd::createFromAffine3(R); + * + * // or create directly by affine transformation matrix Rt + * // see createFromMat() in detail for the form of Rt + * Matx44d Rt = dq3.toMat(); + * DualQuatd dq5 = DualQuatd::createFromMat(Rt); + * + * // Any rotation + translation movement can + * // be expressed as a rotation + translation around the same line in space (expressed by Plucker + * // coords), and here's a way to represent it this way. + * Vec3d axis{1, 1, 1}; // axis will be normalized in createFromPitch + * Vec3d trans{3, 4 ,5}; + * axis = axis / std::sqrt(axis.dot(axis));// The formula for computing moment that I use below requires a normalized axis + * Vec3d moment = 1.0 / 2 * (trans.cross(axis) + axis.cross(trans.cross(axis)) * + * std::cos(rotation_angle / 2) / std::sin(rotation_angle / 2)); + * double d = trans.dot(qaxis); + * DualQuatd dq6 = DualQuatd::createFromPitch(angle, d, axis, moment); + * ``` + * + * A point \f$v=(x, y, z)\f$ in form of dual quaternion is \f$[1+\epsilon v]=[1,0,0,0,0,x,y,z]\f$. + * The transformation of a point \f$v_1\f$ to another point \f$v_2\f$ under the dual quaternion \f$\sigma\f$ is + * \f[ + * 1 + \epsilon v_2 = \sigma * (1 + \epsilon v_1) * \sigma^{\star} + * \f] + * where \f$\sigma^{\star}=p^*-\epsilon q^*.\f$ + * + * A line in the \f$Pl\ddot{u}cker\f$ coordinates \f$(\hat{l}, m)\f$ defined by the dual quaternion \f$l=\hat{l}+\epsilon m\f$. + * To transform a line, \f[l_2 = \sigma * l_1 * \sigma^*,\f] where \f$\sigma=r+\frac{\epsilon}{2}rt\f$ and + * \f$\sigma^*=p^*+\epsilon q^*\f$. + * + * To extract the Vec or Vec, see toVec(); + * + * To extract the affine transformation matrix, see toMat(); + * + * To extract the instance of Affine3, see toAffine3(); + * + * If two quaternions \f$q_0, q_1\f$ are needed to be interpolated, you can use sclerp() + * ``` + * DualQuatd::sclerp(q0, q1, t) + * ``` + * or dqblend(). + * ``` + * DualQuatd::dqblend(q0, q1, t) + * ``` + * With more than two dual quaternions to be blended, you can use generalize linear dual quaternion blending + * with the corresponding weights, i.e. gdqblend(). + * + */ +template +class CV_EXPORTS DualQuat{ + static_assert(std::is_floating_point<_Tp>::value, "Dual quaternion only make sense with type of float or double"); + using value_type = _Tp; + +public: + static constexpr _Tp CV_DUAL_QUAT_EPS = (_Tp)1.e-6; + + DualQuat(); + + /** + * @brief create from eight same type numbers. + */ + DualQuat(const _Tp w, const _Tp x, const _Tp y, const _Tp z, const _Tp w_, const _Tp x_, const _Tp y_, const _Tp z_); + + /** + * @brief create from a double or float vector. + */ + DualQuat(const Vec<_Tp, 8> &q); + + _Tp w, x, y, z, w_, x_, y_, z_; + + /** + * @brief create Dual Quaternion from two same type quaternions p and q. + * A Dual Quaternion \f$\sigma\f$ has the form: + * \f[\sigma = p + \epsilon q\f] + * where p and q are defined as follows: + * \f[\begin{equation} + * \begin{split} + * p &= w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\\ + * q &= w\_ + x\_\boldsymbol{i} + y\_\boldsymbol{j} + z\_\boldsymbol{k}. + * \end{split} + * \end{equation} + * \f] + * The p and q are the real part and dual part respectively. + * @param realPart a quaternion, real part of dual quaternion. + * @param dualPart a quaternion, dual part of dual quaternion. + * @sa Quat + */ + static DualQuat<_Tp> createFromQuat(const Quat<_Tp> &realPart, const Quat<_Tp> &dualPart); + + /** + * @brief create a dual quaternion from a rotation angle \f$\theta\f$, a rotation axis + * \f$\boldsymbol{u}\f$ and a translation \f$\boldsymbol{t}\f$. + * It generates a dual quaternion \f$\sigma\f$ in the form of + * \f[\begin{equation} + * \begin{split} + * \sigma &= r + \frac{\epsilon}{2}\boldsymbol{t}r \\ + * &= [\cos(\frac{\theta}{2}), \boldsymbol{u}\sin(\frac{\theta}{2})] + * + \frac{\epsilon}{2}[0, \boldsymbol{t}][[\cos(\frac{\theta}{2}), + * \boldsymbol{u}\sin(\frac{\theta}{2})]]\\ + * &= \cos(\frac{\theta}{2}) + \boldsymbol{u}\sin(\frac{\theta}{2}) + * + \frac{\epsilon}{2}(-(\boldsymbol{t} \cdot \boldsymbol{u})\sin(\frac{\theta}{2}) + * + \boldsymbol{t}\cos(\frac{\theta}{2}) + \boldsymbol{u} \times \boldsymbol{t} \sin(\frac{\theta}{2})). + * \end{split} + * \end{equation}\f] + * @param angle rotation angle. + * @param axis rotation axis. + * @param translation a vector of length 3. + * @note Axis will be normalized in this function. And translation is applied + * after the rotation. Use @ref createFromQuat(r, r * t / 2) to create a dual quaternion + * which translation is applied before rotation. + * @sa Quat + */ + static DualQuat<_Tp> createFromAngleAxisTrans(const _Tp angle, const Vec<_Tp, 3> &axis, const Vec<_Tp, 3> &translation); + + /** + * @brief Transform this dual quaternion to an affine transformation matrix \f$M\f$. + * Dual quaternion consists of a rotation \f$r=[a,b,c,d]\f$ and a translation \f$t=[\Delta x,\Delta y,\Delta z]\f$. The + * affine transformation matrix \f$M\f$ has the form + * \f[ + * \begin{bmatrix} + * 1-2(e_2^2 +e_3^2) &2(e_1e_2-e_0e_3) &2(e_0e_2+e_1e_3) &\Delta x\\ + * 2(e_0e_3+e_1e_2) &1-2(e_1^2+e_3^2) &2(e_2e_3-e_0e_1) &\Delta y\\ + * 2(e_1e_3-e_0e_2) &2(e_0e_1+e_2e_3) &1-2(e_1^2-e_2^2) &\Delta z\\ + * 0&0&0&1 + * \end{bmatrix} + * \f] + * if A is a matrix consisting of n points to be transformed, this could be achieved by + * \f[ + * new\_A = M * A + * \f] + * where A has the form + * \f[ + * \begin{bmatrix} + * x_0& x_1& x_2&...&x_n\\ + * y_0& y_1& y_2&...&y_n\\ + * z_0& z_1& z_2&...&z_n\\ + * 1&1&1&...&1 + * \end{bmatrix} + * \f] + * where the same subscript represent the same point. The size of A should be \f$[4,n]\f$. + * and the same size for matrix new_A. + * @param _R 4x4 matrix that represents rotations and translation. + * @note Translation is applied after the rotation. Use createFromQuat(r, r * t / 2) to create + * a dual quaternion which translation is applied before rotation. + */ + static DualQuat<_Tp> createFromMat(InputArray _R); + + /** + * @brief create dual quaternion from an affine matrix. The definition of affine matrix can refer to createFromMat() + */ + static DualQuat<_Tp> createFromAffine3(const Affine3<_Tp> &R); + + /** + * @brief A dual quaternion is a vector in form of + * \f[ + * \begin{equation} + * \begin{split} + * \sigma &=\boldsymbol{p} + \epsilon \boldsymbol{q}\\ + * &= \cos\hat{\frac{\theta}{2}}+\overline{\hat{l}}\sin\frac{\hat{\theta}}{2} + * \end{split} + * \end{equation} + * \f] + * where \f$\hat{\theta}\f$ is dual angle and \f$\overline{\hat{l}}\f$ is dual axis: + * \f[ + * \hat{\theta}=\theta + \epsilon d,\\ + * \overline{\hat{l}}= \hat{l} +\epsilon m. + * \f] + * In this representation, \f$\theta\f$ is rotation angle and \f$(\hat{l},m)\f$ is the screw axis, d is the translation distance along the axis. + * + * @param angle rotation angle. + * @param d translation along the rotation axis. + * @param axis rotation axis represented by quaternion with w = 0. + * @param moment the moment of line, and it should be orthogonal to axis. + * @note Translation is applied after the rotation. Use createFromQuat(r, r * t / 2) to create + * a dual quaternion which translation is applied before rotation. + */ + static DualQuat<_Tp> createFromPitch(const _Tp angle, const _Tp d, const Vec<_Tp, 3> &axis, const Vec<_Tp, 3> &moment); + + /** + * @brief return a quaternion which represent the real part of dual quaternion. + * The definition of real part is in createFromQuat(). + * @sa createFromQuat, getDualPart + */ + Quat<_Tp> getRealPart() const; + + /** + * @brief return a quaternion which represent the dual part of dual quaternion. + * The definition of dual part is in createFromQuat(). + * @sa createFromQuat, getRealPart + */ + Quat<_Tp> getDualPart() const; + + /** + * @brief return the conjugate of a dual quaternion. + * \f[ + * \begin{equation} + * \begin{split} + * \sigma^* &= (p + \epsilon q)^* + * &= (p^* + \epsilon q^*) + * \end{split} + * \end{equation} + * \f] + * @param dq a dual quaternion. + */ + template + friend DualQuat conjugate(const DualQuat &dq); + + /** + * @brief return the conjugate of a dual quaternion. + * \f[ + * \begin{equation} + * \begin{split} + * \sigma^* &= (p + \epsilon q)^* + * &= (p^* + \epsilon q^*) + * \end{split} + * \end{equation} + * \f] + */ + DualQuat<_Tp> conjugate() const; + + /** + * @brief return the rotation in quaternion form. + */ + Quat<_Tp> getRotation(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the translation vector. + * The rotation \f$r\f$ in this dual quaternion \f$\sigma\f$ is applied before translation \f$t\f$. + * The dual quaternion \f$\sigma\f$ is defined as + * \f[\begin{equation} + * \begin{split} + * \sigma &= p + \epsilon q \\ + * &= r + \frac{\epsilon}{2}{t}r. + * \end{split} + * \end{equation}\f] + * Thus, the translation can be obtained as follows + * \f[t = 2qp^*.\f] + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + * @note This dual quaternion's translation is applied after the rotation. + */ + Vec<_Tp, 3> getTranslation(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the norm \f$||\sigma||\f$ of dual quaternion \f$\sigma = p + \epsilon q\f$. + * \f[ + * \begin{equation} + * \begin{split} + * ||\sigma|| &= \sqrt{\sigma * \sigma^*} \\ + * &= ||p|| + \epsilon \frac{p \cdot q}{||p||}. + * \end{split} + * \end{equation} + * \f] + * Generally speaking, the norm of a not unit dual + * quaternion is a dual number. For convenience, we return it in the form of a dual quaternion + * , i.e. + * \f[ ||\sigma|| = [||p||, 0, 0, 0, \frac{p \cdot q}{||p||}, 0, 0, 0].\f] + * + * @note The data type of dual number is dual quaternion. + */ + DualQuat<_Tp> norm() const; + + /** + * @brief return a normalized dual quaternion. + * A dual quaternion can be expressed as + * \f[ + * \begin{equation} + * \begin{split} + * \sigma &= p + \epsilon q\\ + * &=||\sigma||\left(r+\frac{1}{2}tr\right) + * \end{split} + * \end{equation} + * \f] + * where \f$r, t\f$ represents the rotation (ordinary quaternion) and translation (pure ordinary quaternion) respectively, + * and \f$||\sigma||\f$ is the norm of dual quaternion(a dual number). + * A dual quaternion is unit if and only if + * \f[ + * ||p||=1, p \cdot q=0 + * \f] + * where \f$\cdot\f$ means dot product. + * The process of normalization is + * \f[ + * \sigma_{u}=\frac{\sigma}{||\sigma||} + * \f] + * Next, we simply proof \f$\sigma_u\f$ is a unit dual quaternion: + * \f[ + * \renewcommand{\Im}{\operatorname{Im}} + * \begin{equation} + * \begin{split} + * \sigma_{u}=\frac{\sigma}{||\sigma||}&=\frac{p + \epsilon q}{||p||+\epsilon\frac{p\cdot q}{||p||}}\\ + * &=\frac{p}{||p||}+\epsilon\left(\frac{q}{||p||}-p\frac{p\cdot q}{||p||^3}\right)\\ + * &=\frac{p}{||p||}+\epsilon\frac{1}{||p||^2}\left(qp^{*}-p\cdot q\right)\frac{p}{||p||}\\ + * &=\frac{p}{||p||}+\epsilon\frac{1}{||p||^2}\Im(qp^*)\frac{p}{||p||}.\\ + * \end{split} + * \end{equation} + * \f] + * As expected, the real part is a rotation and dual part is a pure quaternion. + */ + DualQuat<_Tp> normalize() const; + + /** + * @brief if \f$\sigma = p + \epsilon q\f$ is a dual quaternion, p is not zero, + * the inverse dual quaternion is + * \f[\sigma^{-1} = \frac{\sigma^*}{||\sigma||^2}, \f] + * or equivalentlly, + * \f[\sigma^{-1} = p^{-1} - \epsilon p^{-1}qp^{-1}.\f] + * @param dq a dual quaternion. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, dual quaternion dq assume to be a unit dual quaternion + * and this function will save some computations. + */ + template + friend DualQuat inv(const DualQuat &dq, QuatAssumeType assumeUnit); + + /** + * @brief if \f$\sigma = p + \epsilon q\f$ is a dual quaternion, p is not zero, + * the inverse dual quaternion is + * \f[\sigma^{-1} = \frac{\sigma^*}{||\sigma||^2}, \f] + * or equivalentlly, + * \f[\sigma^{-1} = p^{-1} - \epsilon p^{-1}qp^{-1}.\f] + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + */ + DualQuat<_Tp> inv(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the dot product of two dual quaternion. + * @param p other dual quaternion. + */ + _Tp dot(DualQuat<_Tp> p) const; + + /** + ** @brief return the value of \f$p^t\f$ where p is a dual quaternion. + * This could be calculated as: + * \f[ + * p^t = \exp(t\ln p) + * \f] + * @param dq a dual quaternion. + * @param t index of power function. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, dual quaternion dq assume to be a unit dual quaternion + * and this function will save some computations. + */ + template + friend DualQuat power(const DualQuat &dq, const T t, QuatAssumeType assumeUnit); + + /** + ** @brief return the value of \f$p^t\f$ where p is a dual quaternion. + * This could be calculated as: + * \f[ + * p^t = \exp(t\ln p) + * \f] + * + * @param t index of power function. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + */ + DualQuat<_Tp> power(const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the value of \f$p^q\f$ where p and q are dual quaternions. + * This could be calculated as: + * \f[ + * p^q = \exp(q\ln p) + * \f] + * @param p a dual quaternion. + * @param q a dual quaternion. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, dual quaternion p assume to be a dual unit quaternion + * and this function will save some computations. + */ + template + friend DualQuat power(const DualQuat& p, const DualQuat& q, QuatAssumeType assumeUnit); + + /** + * @brief return the value of \f$p^q\f$ where p and q are dual quaternions. + * This could be calculated as: + * \f[ + * p^q = \exp(q\ln p) + * \f] + * + * @param q a dual quaternion + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a dual unit quaternion + * and this function will save some computations. + */ + DualQuat<_Tp> power(const DualQuat<_Tp>& q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the value of exponential function value + * @param dq a dual quaternion. + */ + template + friend DualQuat exp(const DualQuat &dq); + + /** + * @brief return the value of exponential function value + */ + DualQuat<_Tp> exp() const; + + /** + * @brief return the value of logarithm function value + * + * @param dq a dual quaternion. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, dual quaternion dq assume to be a unit dual quaternion + * and this function will save some computations. + */ + template + friend DualQuat log(const DualQuat &dq, QuatAssumeType assumeUnit); + + /** + * @brief return the value of logarithm function value + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + */ + DualQuat<_Tp> log(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief Transform this dual quaternion to a vector. + */ + Vec<_Tp, 8> toVec() const; + + /** + * @brief Transform this dual quaternion to a affine transformation matrix + * the form of matrix, see createFromMat(). + */ + Matx<_Tp, 4, 4> toMat(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief Transform this dual quaternion to a instance of Affine3. + */ + Affine3<_Tp> toAffine3(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief The screw linear interpolation(ScLERP) is an extension of spherical linear interpolation of dual quaternion. + * If \f$\sigma_1\f$ and \f$\sigma_2\f$ are two dual quaternions representing the initial and final pose. + * The interpolation of ScLERP function can be defined as: + * \f[ + * ScLERP(t;\sigma_1,\sigma_2) = \sigma_1 * (\sigma_1^{-1} * \sigma_2)^t, t\in[0,1] + * \f] + * + * @param q1 a dual quaternion represents a initial pose. + * @param q2 a dual quaternion represents a final pose. + * @param t interpolation parameter + * @param directChange if true, it always return the shortest path. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + * + * For example + * ``` + * double angle1 = CV_PI / 2; + * Vec3d axis{0, 0, 1}; + * Vec3d t(0, 0, 3); + * DualQuatd initial = DualQuatd::createFromAngleAxisTrans(angle1, axis, t); + * double angle2 = CV_PI; + * DualQuatd final = DualQuatd::createFromAngleAxisTrans(angle2, axis, t); + * DualQuatd inter = DualQuatd::sclerp(initial, final, 0.5); + * ``` + */ + static DualQuat<_Tp> sclerp(const DualQuat<_Tp> &q1, const DualQuat<_Tp> &q2, const _Tp t, + bool directChange=true, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + /** + * @brief The method of Dual Quaternion linear Blending(DQB) is to compute a transformation between dual quaternion + * \f$q_1\f$ and \f$q_2\f$ and can be defined as: + * \f[ + * DQB(t;{\boldsymbol{q}}_1,{\boldsymbol{q}}_2)= + * \frac{(1-t){\boldsymbol{q}}_1+t{\boldsymbol{q}}_2}{||(1-t){\boldsymbol{q}}_1+t{\boldsymbol{q}}_2||}. + * \f] + * where \f$q_1\f$ and \f$q_2\f$ are unit dual quaternions representing the input transformations. + * If you want to use DQB that works for more than two rigid transformations, see @ref gdqblend + * + * @param q1 a unit dual quaternion representing the input transformations. + * @param q2 a unit dual quaternion representing the input transformations. + * @param t parameter \f$t\in[0,1]\f$. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, this dual quaternion assume to be a unit dual quaternion + * and this function will save some computations. + * + * @sa gdqblend + */ + static DualQuat<_Tp> dqblend(const DualQuat<_Tp> &q1, const DualQuat<_Tp> &q2, const _Tp t, + QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + * @brief The generalized Dual Quaternion linear Blending works for more than two rigid transformations. + * If these transformations are expressed as unit dual quaternions \f$q_1,...,q_n\f$ with convex weights + * \f$w = (w_1,...,w_n)\f$, the generalized DQB is simply + * \f[ + * gDQB(\boldsymbol{w};{\boldsymbol{q}}_1,...,{\boldsymbol{q}}_n)=\frac{w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n} + * {||w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n||}. + * \f] + * @param dualquat vector of dual quaternions + * @param weights vector of weights, the size of weights should be the same as dualquat, and the weights should + * satisfy \f$\sum_0^n w_{i} = 1\f$ and \f$w_i>0\f$. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, these dual quaternions assume to be unit quaternions + * and this function will save some computations. + * @note the type of weights' element should be the same as the date type of dual quaternion inside the dualquat. + */ + template + static DualQuat<_Tp> gdqblend(const Vec, cn> &dualquat, InputArray weights, + QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + * @brief The generalized Dual Quaternion linear Blending works for more than two rigid transformations. + * If these transformations are expressed as unit dual quaternions \f$q_1,...,q_n\f$ with convex weights + * \f$w = (w_1,...,w_n)\f$, the generalized DQB is simply + * \f[ + * gDQB(\boldsymbol{w};{\boldsymbol{q}}_1,...,{\boldsymbol{q}}_n)=\frac{w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n} + * {||w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n||}. + * \f] + * @param dualquat The dual quaternions which have 8 channels and 1 row or 1 col. + * @param weights vector of weights, the size of weights should be the same as dualquat, and the weights should + * satisfy \f$\sum_0^n w_{i} = 1\f$ and \f$w_i>0\f$. + * @param assumeUnit if @ref QUAT_ASSUME_UNIT, these dual quaternions assume to be unit quaternions + * and this function will save some computations. + * @note the type of weights' element should be the same as the date type of dual quaternion inside the dualquat. + */ + static DualQuat<_Tp> gdqblend(InputArray dualquat, InputArray weights, + QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + * @brief Return opposite dual quaternion \f$-p\f$ + * which satisfies \f$p + (-p) = 0.\f$ + * + * For example + * ``` + * DualQuatd q{1, 2, 3, 4, 5, 6, 7, 8}; + * std::cout << -q << std::endl; // [-1, -2, -3, -4, -5, -6, -7, -8] + * ``` + */ + DualQuat<_Tp> operator-() const; + + /** + * @brief return true if two dual quaternions p and q are nearly equal, i.e. when the absolute + * value of each \f$p_i\f$ and \f$q_i\f$ is less than CV_DUAL_QUAT_EPS. + */ + bool operator==(const DualQuat<_Tp>&) const; + + /** + * @brief Subtraction operator of two dual quaternions p and q. + * It returns a new dual quaternion that each value is the sum of \f$p_i\f$ and \f$-q_i\f$. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * std::cout << p - q << std::endl; //[-4, -4, -4, -4, 4, -4, -4, -4] + * ``` + */ + DualQuat<_Tp> operator-(const DualQuat<_Tp>&) const; + + /** + * @brief Subtraction assignment operator of two dual quaternions p and q. + * It subtracts right operand from the left operand and assign the result to left operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * p -= q; // equivalent to p = p - q + * std::cout << p << std::endl; //[-4, -4, -4, -4, 4, -4, -4, -4] + * + * ``` + */ + DualQuat<_Tp>& operator-=(const DualQuat<_Tp>&); + + /** + * @brief Addition operator of two dual quaternions p and q. + * It returns a new dual quaternion that each value is the sum of \f$p_i\f$ and \f$q_i\f$. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * std::cout << p + q << std::endl; //[6, 8, 10, 12, 14, 16, 18, 20] + * ``` + */ + DualQuat<_Tp> operator+(const DualQuat<_Tp>&) const; + + /** + * @brief Addition assignment operator of two dual quaternions p and q. + * It adds right operand to the left operand and assign the result to left operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * p += q; // equivalent to p = p + q + * std::cout << p << std::endl; //[6, 8, 10, 12, 14, 16, 18, 20] + * + * ``` + */ + DualQuat<_Tp>& operator+=(const DualQuat<_Tp>&); + + /** + * @brief Multiplication assignment operator of two quaternions. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of dual quaternion multiplication: + * The dual quaternion can be written as an ordered pair of quaternions [A, B]. Thus + * \f[ + * \begin{equation} + * \begin{split} + * p * q &= [A, B][C, D]\\ + * &=[AC, AD + BC] + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * p *= q; + * std::cout << p << std::endl; //[-60, 12, 30, 24, -216, 80, 124, 120] + * ``` + */ + DualQuat<_Tp>& operator*=(const DualQuat<_Tp>&); + + /** + * @brief Multiplication assignment operator of a quaternions and a scalar. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of dual quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ + * &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double s = 2.0; + * p *= s; + * std::cout << p << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + DualQuat<_Tp> operator*=(const _Tp s); + + + /** + * @brief Multiplication operator of two dual quaternions q and p. + * Multiplies values on either side of the operator. + * + * Rule of dual quaternion multiplication: + * The dual quaternion can be written as an ordered pair of quaternions [A, B]. Thus + * \f[ + * \begin{equation} + * \begin{split} + * p * q &= [A, B][C, D]\\ + * &=[AC, AD + BC] + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * std::cout << p * q << std::endl; //[-60, 12, 30, 24, -216, 80, 124, 120] + * ``` + */ + DualQuat<_Tp> operator*(const DualQuat<_Tp>&) const; + + /** + * @brief Division operator of a dual quaternions and a scalar. + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of dual quaternion division with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p / s &= [w, x, y, z, w\_, x\_, y\_, z\_] / s\\ + * &=[w/s, x/s, y/s, z/s, w\_/s, x\_/s, y\_/s, z\_/s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double s = 2.0; + * p /= s; // equivalent to p = p / s + * std::cout << p << std::endl; //[0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4] + * ``` + * @note the type of scalar should be equal to this dual quaternion. + */ + DualQuat<_Tp> operator/(const _Tp s) const; + + /** + * @brief Division operator of two dual quaternions p and q. + * Divides left hand operand by right hand operand. + * + * Rule of dual quaternion division with a dual quaternion: + * \f[ + * \begin{equation} + * \begin{split} + * p / q &= p * q.inv()\\ + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * std::cout << p / q << std::endl; // equivalent to p * q.inv() + * ``` + */ + DualQuat<_Tp> operator/(const DualQuat<_Tp>&) const; + + /** + * @brief Division assignment operator of two dual quaternions p and q; + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of dual quaternion division with a quaternion: + * \f[ + * \begin{equation} + * \begin{split} + * p / q&= p * q.inv()\\ + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12}; + * p /= q; // equivalent to p = p * q.inv() + * std::cout << p << std::endl; + * ``` + */ + DualQuat<_Tp>& operator/=(const DualQuat<_Tp>&); + + /** + * @brief Division assignment operator of a dual quaternions and a scalar. + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of dual quaternion division with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p / s &= [w, x, y, z, w\_, x\_, y\_ ,z\_] / s\\ + * &=[w / s, x / s, y / s, z / s, w\_ / \space s, x\_ / \space s, y\_ / \space s, z\_ / \space s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double s = 2.0;; + * p /= s; // equivalent to p = p / s + * std::cout << p << std::endl; //[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + Quat<_Tp>& operator/=(const _Tp s); + + /** + * @brief Addition operator of a scalar and a dual quaternions. + * Adds right hand operand from left hand operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double scalar = 2.0; + * std::cout << scalar + p << std::endl; //[3.0, 2, 3, 4, 5, 6, 7, 8] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator+(const T s, const DualQuat&); + + /** + * @brief Addition operator of a dual quaternions and a scalar. + * Adds right hand operand from left hand operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double scalar = 2.0; + * std::cout << p + scalar << std::endl; //[3.0, 2, 3, 4, 5, 6, 7, 8] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator+(const DualQuat&, const T s); + + /** + * @brief Multiplication operator of a scalar and a dual quaternions. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of dual quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ + * &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double s = 2.0; + * std::cout << s * p << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator*(const T s, const DualQuat&); + + /** + * @brief Subtraction operator of a dual quaternion and a scalar. + * Subtracts right hand operand from left hand operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double scalar = 2.0; + * std::cout << p - scalar << std::endl; //[-1, 2, 3, 4, 5, 6, 7, 8] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator-(const DualQuat&, const T s); + + /** + * @brief Subtraction operator of a scalar and a dual quaternions. + * Subtracts right hand operand from left hand operand. + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double scalar = 2.0; + * std::cout << scalar - p << std::endl; //[1.0, -2, -3, -4, -5, -6, -7, -8] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator-(const T s, const DualQuat&); + + /** + * @brief Multiplication operator of a dual quaternions and a scalar. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of dual quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ + * &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8}; + * double s = 2.0; + * std::cout << p * s << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16] + * ``` + * @note the type of scalar should be equal to the dual quaternion. + */ + template + friend DualQuat cv::operator*(const DualQuat&, const T s); + + template + friend std::ostream& cv::operator<<(std::ostream&, const DualQuat&); + +}; + +using DualQuatd = DualQuat; +using DualQuatf = DualQuat; + +//! @} core +}//namespace + +#include "dualquaternion.inl.hpp" + +#endif /* OPENCV_CORE_QUATERNION_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/dualquaternion.inl.hpp b/Thirdparty/opencv2/include/opencv2/core/dualquaternion.inl.hpp new file mode 100644 index 0000000..1a68f12 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/dualquaternion.inl.hpp @@ -0,0 +1,487 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2020, Huawei Technologies Co., Ltd. All rights reserved. +// Third party copyrights are property of their respective owners. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Liangqian Kong +// Longbu Wang + +#ifndef OPENCV_CORE_DUALQUATERNION_INL_HPP +#define OPENCV_CORE_DUALQUATERNION_INL_HPP + +#ifndef OPENCV_CORE_DUALQUATERNION_HPP +#error This is not a standalone header. Include dualquaternion.hpp instead. +#endif + +/////////////////////////////////////////////////////////////////////////////////////// +//Implementation +namespace cv { + +template +DualQuat::DualQuat():w(0), x(0), y(0), z(0), w_(0), x_(0), y_(0), z_(0){} + +template +DualQuat::DualQuat(const T vw, const T vx, const T vy, const T vz, const T _w, const T _x, const T _y, const T _z): + w(vw), x(vx), y(vy), z(vz), w_(_w), x_(_x), y_(_y), z_(_z){} + +template +DualQuat::DualQuat(const Vec &q):w(q[0]), x(q[1]), y(q[2]), z(q[3]), + w_(q[4]), x_(q[5]), y_(q[6]), z_(q[7]){} + +template +DualQuat DualQuat::createFromQuat(const Quat &realPart, const Quat &dualPart) +{ + T w = realPart.w; + T x = realPart.x; + T y = realPart.y; + T z = realPart.z; + T w_ = dualPart.w; + T x_ = dualPart.x; + T y_ = dualPart.y; + T z_ = dualPart.z; + return DualQuat(w, x, y, z, w_, x_, y_, z_); +} + +template +DualQuat DualQuat::createFromAngleAxisTrans(const T angle, const Vec &axis, const Vec &trans) +{ + Quat r = Quat::createFromAngleAxis(angle, axis); + Quat t{0, trans[0], trans[1], trans[2]}; + return createFromQuat(r, t * r * T(0.5)); +} + +template +DualQuat DualQuat::createFromMat(InputArray _R) +{ + CV_CheckTypeEQ(_R.type(), cv::traits::Type::value, ""); + if (_R.size() != Size(4, 4)) + { + CV_Error(Error::StsBadArg, "The input matrix must have 4 columns and 4 rows"); + } + Mat R = _R.getMat(); + Quat r = Quat::createFromRotMat(R.colRange(0, 3).rowRange(0, 3)); + Quat trans(0, R.at(0, 3), R.at(1, 3), R.at(2, 3)); + return createFromQuat(r, trans * r * T(0.5)); +} + +template +DualQuat DualQuat::createFromAffine3(const Affine3 &R) +{ + return createFromMat(R.matrix); +} + +template +DualQuat DualQuat::createFromPitch(const T angle, const T d, const Vec &axis, const Vec &moment) +{ + T half_angle = angle * T(0.5), half_d = d * T(0.5); + Quat qaxis = Quat(0, axis[0], axis[1], axis[2]).normalize(); + Quat qmoment = Quat(0, moment[0], moment[1], moment[2]); + qmoment -= qaxis * axis.dot(moment); + Quat dual = -half_d * std::sin(half_angle) + std::sin(half_angle) * qmoment + + half_d * std::cos(half_angle) * qaxis; + return createFromQuat(Quat::createFromAngleAxis(angle, axis), dual); +} + +template +inline bool DualQuat::operator==(const DualQuat &q) const +{ + return (abs(w - q.w) < CV_DUAL_QUAT_EPS && abs(x - q.x) < CV_DUAL_QUAT_EPS && + abs(y - q.y) < CV_DUAL_QUAT_EPS && abs(z - q.z) < CV_DUAL_QUAT_EPS && + abs(w_ - q.w_) < CV_DUAL_QUAT_EPS && abs(x_ - q.x_) < CV_DUAL_QUAT_EPS && + abs(y_ - q.y_) < CV_DUAL_QUAT_EPS && abs(z_ - q.z_) < CV_DUAL_QUAT_EPS); +} + +template +inline Quat DualQuat::getRealPart() const +{ + return Quat(w, x, y, z); +} + +template +inline Quat DualQuat::getDualPart() const +{ + return Quat(w_, x_, y_, z_); +} + +template +inline DualQuat conjugate(const DualQuat &dq) +{ + return dq.conjugate(); +} + +template +inline DualQuat DualQuat::conjugate() const +{ + return DualQuat(w, -x, -y, -z, w_, -x_, -y_, -z_); +} + +template +DualQuat DualQuat::norm() const +{ + Quat real = getRealPart(); + T realNorm = real.norm(); + Quat dual = getDualPart(); + if (realNorm < CV_DUAL_QUAT_EPS){ + return DualQuat(0, 0, 0, 0, 0, 0, 0, 0); + } + return DualQuat(realNorm, 0, 0, 0, real.dot(dual) / realNorm, 0, 0, 0); +} + +template +inline Quat DualQuat::getRotation(QuatAssumeType assumeUnit) const +{ + if (assumeUnit) + { + return getRealPart(); + } + return getRealPart().normalize(); +} + +template +inline Vec DualQuat::getTranslation(QuatAssumeType assumeUnit) const +{ + Quat trans = T(2.0) * (getDualPart() * getRealPart().inv(assumeUnit)); + return Vec{trans[1], trans[2], trans[3]}; +} + +template +DualQuat DualQuat::normalize() const +{ + Quat p = getRealPart(); + Quat q = getDualPart(); + T p_norm = p.norm(); + if (p_norm < CV_DUAL_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "Cannot normalize this dual quaternion: the norm is too small."); + } + Quat p_nr = p / p_norm; + Quat q_nr = q / p_norm; + return createFromQuat(p_nr, q_nr - p_nr * p_nr.dot(q_nr)); +} + +template +inline T DualQuat::dot(DualQuat q) const +{ + return q.w * w + q.x * x + q.y * y + q.z * z + q.w_ * w_ + q.x_ * x_ + q.y_ * y_ + q.z_ * z_; +} + +template +inline DualQuat inv(const DualQuat &dq, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) +{ + return dq.inv(assumeUnit); +} + +template +inline DualQuat DualQuat::inv(QuatAssumeType assumeUnit) const +{ + Quat real = getRealPart(); + Quat dual = getDualPart(); + return createFromQuat(real.inv(assumeUnit), -real.inv(assumeUnit) * dual * real.inv(assumeUnit)); +} + +template +inline DualQuat DualQuat::operator-(const DualQuat &q) const +{ + return DualQuat(w - q.w, x - q.x, y - q.y, z - q.z, w_ - q.w_, x_ - q.x_, y_ - q.y_, z_ - q.z_); +} + +template +inline DualQuat DualQuat::operator-() const +{ + return DualQuat(-w, -x, -y, -z, -w_, -x_, -y_, -z_); +} + +template +inline DualQuat DualQuat::operator+(const DualQuat &q) const +{ + return DualQuat(w + q.w, x + q.x, y + q.y, z + q.z, w_ + q.w_, x_ + q.x_, y_ + q.y_, z_ + q.z_); +} + +template +inline DualQuat& DualQuat::operator+=(const DualQuat &q) +{ + *this = *this + q; + return *this; +} + +template +inline DualQuat DualQuat::operator*(const DualQuat &q) const +{ + Quat A = getRealPart(); + Quat B = getDualPart(); + Quat C = q.getRealPart(); + Quat D = q.getDualPart(); + return DualQuat::createFromQuat(A * C, A * D + B * C); +} + +template +inline DualQuat& DualQuat::operator*=(const DualQuat &q) +{ + *this = *this * q; + return *this; +} + +template +inline DualQuat operator+(const T a, const DualQuat &q) +{ + return DualQuat(a + q.w, q.x, q.y, q.z, q.w_, q.x_, q.y_, q.z_); +} + +template +inline DualQuat operator+(const DualQuat &q, const T a) +{ + return DualQuat(a + q.w, q.x, q.y, q.z, q.w_, q.x_, q.y_, q.z_); +} + +template +inline DualQuat operator-(const DualQuat &q, const T a) +{ + return DualQuat(q.w - a, q.x, q.y, q.z, q.w_, q.x_, q.y_, q.z_); +} + +template +inline DualQuat& DualQuat::operator-=(const DualQuat &q) +{ + *this = *this - q; + return *this; +} + +template +inline DualQuat operator-(const T a, const DualQuat &q) +{ + return DualQuat(a - q.w, -q.x, -q.y, -q.z, -q.w_, -q.x_, -q.y_, -q.z_); +} + +template +inline DualQuat operator*(const T a, const DualQuat &q) +{ + return DualQuat(q.w * a, q.x * a, q.y * a, q.z * a, q.w_ * a, q.x_ * a, q.y_ * a, q.z_ * a); +} + +template +inline DualQuat operator*(const DualQuat &q, const T a) +{ + return DualQuat(q.w * a, q.x * a, q.y * a, q.z * a, q.w_ * a, q.x_ * a, q.y_ * a, q.z_ * a); +} + +template +inline DualQuat DualQuat::operator/(const T a) const +{ + return DualQuat(w / a, x / a, y / a, z / a, w_ / a, x_ / a, y_ / a, z_ / a); +} + +template +inline DualQuat DualQuat::operator/(const DualQuat &q) const +{ + return *this * q.inv(); +} + +template +inline DualQuat& DualQuat::operator/=(const DualQuat &q) +{ + *this = *this / q; + return *this; +} + +template +std::ostream & operator<<(std::ostream &os, const DualQuat &q) +{ + os << "DualQuat " << Vec{q.w, q.x, q.y, q.z, q.w_, q.x_, q.y_, q.z_}; + return os; +} + +template +inline DualQuat exp(const DualQuat &dq) +{ + return dq.exp(); +} + +namespace detail { + +template +Matx<_Tp, 4, 4> jacob_exp(const Quat<_Tp> &q) +{ + _Tp nv = std::sqrt(q.x * q.x + q.y * q.y + q.z * q.z); + _Tp sinc_nv = abs(nv) < cv::DualQuat<_Tp>::CV_DUAL_QUAT_EPS ? _Tp(1.0) - nv * nv * _Tp(1.0/6.0) : std::sin(nv) / nv; + _Tp csiii_nv = abs(nv) < cv::DualQuat<_Tp>::CV_DUAL_QUAT_EPS ? -_Tp(1.0/3.0) : (std::cos(nv) - sinc_nv) / nv / nv; + Matx<_Tp, 4, 4> J_exp_quat { + std::cos(nv), -sinc_nv * q.x, -sinc_nv * q.y, -sinc_nv * q.z, + sinc_nv * q.x, csiii_nv * q.x * q.x + sinc_nv, csiii_nv * q.x * q.y, csiii_nv * q.x * q.z, + sinc_nv * q.y, csiii_nv * q.y * q.x, csiii_nv * q.y * q.y + sinc_nv, csiii_nv * q.y * q.z, + sinc_nv * q.z, csiii_nv * q.z * q.x, csiii_nv * q.z * q.y, csiii_nv * q.z * q.z + sinc_nv + }; + return std::exp(q.w) * J_exp_quat; +} + +} // namespace detail + +template +DualQuat DualQuat::exp() const +{ + Quat real = getRealPart(); + return createFromQuat(real.exp(), Quat(detail::jacob_exp(real) * getDualPart().toVec())); +} + +template +DualQuat log(const DualQuat &dq, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) +{ + return dq.log(assumeUnit); +} + +template +DualQuat DualQuat::log(QuatAssumeType assumeUnit) const +{ + Quat plog = getRealPart().log(assumeUnit); + Matx jacob = detail::jacob_exp(plog); + return createFromQuat(plog, Quat(jacob.inv() * getDualPart().toVec())); +} + +template +inline DualQuat power(const DualQuat &dq, const T t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) +{ + return dq.power(t, assumeUnit); +} + +template +inline DualQuat DualQuat::power(const T t, QuatAssumeType assumeUnit) const +{ + return (t * log(assumeUnit)).exp(); +} + +template +inline DualQuat power(const DualQuat &p, const DualQuat &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) +{ + return p.power(q, assumeUnit); +} + +template +inline DualQuat DualQuat::power(const DualQuat &q, QuatAssumeType assumeUnit) const +{ + return (q * log(assumeUnit)).exp(); +} + +template +inline Vec DualQuat::toVec() const +{ + return Vec(w, x, y, z, w_, x_, y_, z_); +} + +template +Affine3 DualQuat::toAffine3(QuatAssumeType assumeUnit) const +{ + return Affine3(toMat(assumeUnit)); +} + +template +Matx DualQuat::toMat(QuatAssumeType assumeUnit) const +{ + Matx rot44 = getRotation(assumeUnit).toRotMat4x4(); + Vec translation = getTranslation(assumeUnit); + rot44(0, 3) = translation[0]; + rot44(1, 3) = translation[1]; + rot44(2, 3) = translation[2]; + return rot44; +} + +template +DualQuat DualQuat::sclerp(const DualQuat &q0, const DualQuat &q1, const T t, bool directChange, QuatAssumeType assumeUnit) +{ + DualQuat v0(q0), v1(q1); + if (!assumeUnit) + { + v0 = v0.normalize(); + v1 = v1.normalize(); + } + Quat v0Real = v0.getRealPart(); + Quat v1Real = v1.getRealPart(); + if (directChange && v1Real.dot(v0Real) < 0) + { + v0 = -v0; + } + DualQuat v0inv1 = v0.inv() * v1; + return v0 * v0inv1.power(t, QUAT_ASSUME_UNIT); +} + +template +DualQuat DualQuat::dqblend(const DualQuat &q1, const DualQuat &q2, const T t, QuatAssumeType assumeUnit) +{ + DualQuat v1(q1), v2(q2); + if (!assumeUnit) + { + v1 = v1.normalize(); + v2 = v2.normalize(); + } + if (v1.getRotation(assumeUnit).dot(v2.getRotation(assumeUnit)) < 0) + { + return ((1 - t) * v1 - t * v2).normalize(); + } + return ((1 - t) * v1 + t * v2).normalize(); +} + +template +DualQuat DualQuat::gdqblend(InputArray _dualquat, InputArray _weight, QuatAssumeType assumeUnit) +{ + CV_CheckTypeEQ(_weight.type(), cv::traits::Type::value, ""); + CV_CheckTypeEQ(_dualquat.type(), CV_MAKETYPE(CV_MAT_DEPTH(cv::traits::Type::value), 8), ""); + Size dq_s = _dualquat.size(); + if (dq_s != _weight.size() || (dq_s.height != 1 && dq_s.width != 1)) + { + CV_Error(Error::StsBadArg, "The size of weight must be the same as dualquat, both of them should be (1, n) or (n, 1)"); + } + Mat dualquat = _dualquat.getMat(), weight = _weight.getMat(); + const int cn = std::max(dq_s.width, dq_s.height); + if (!assumeUnit) + { + for (int i = 0; i < cn; ++i) + { + dualquat.at>(i) = DualQuat{dualquat.at>(i)}.normalize().toVec(); + } + } + Vec dq_blend = dualquat.at>(0) * weight.at(0); + Quat q0 = DualQuat {dualquat.at>(0)}.getRotation(assumeUnit); + for (int i = 1; i < cn; ++i) + { + T k = q0.dot(DualQuat{dualquat.at>(i)}.getRotation(assumeUnit)) < 0 ? -1: 1; + dq_blend = dq_blend + dualquat.at>(i) * k * weight.at(i); + } + return DualQuat{dq_blend}.normalize(); +} + +template +template +DualQuat DualQuat::gdqblend(const Vec, cn> &_dualquat, InputArray _weight, QuatAssumeType assumeUnit) +{ + Vec, cn> dualquat(_dualquat); + if (cn == 0) + { + return DualQuat(1, 0, 0, 0, 0, 0, 0, 0); + } + Mat dualquat_mat(cn, 1, CV_64FC(8)); + for (int i = 0; i < cn ; ++i) + { + dualquat_mat.at>(i) = dualquat[i].toVec(); + } + return gdqblend(dualquat_mat, _weight, assumeUnit); +} + +} //namespace cv + +#endif /*OPENCV_CORE_DUALQUATERNION_INL_HPP*/ diff --git a/Thirdparty/opencv2/include/opencv2/core/eigen.hpp b/Thirdparty/opencv2/include/opencv2/core/eigen.hpp new file mode 100644 index 0000000..f176409 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/eigen.hpp @@ -0,0 +1,404 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + + +#ifndef OPENCV_CORE_EIGEN_HPP +#define OPENCV_CORE_EIGEN_HPP + +#ifndef EIGEN_WORLD_VERSION +#error "Wrong usage of OpenCV's Eigen utility header. Include Eigen's headers first. See https://github.com/opencv/opencv/issues/17366" +#endif + +#include "opencv2/core.hpp" + +#if defined _MSC_VER && _MSC_VER >= 1200 +#ifndef NOMINMAX +#define NOMINMAX // fix https://github.com/opencv/opencv/issues/17548 +#endif +#pragma warning( disable: 4714 ) //__forceinline is not inlined +#pragma warning( disable: 4127 ) //conditional expression is constant +#pragma warning( disable: 4244 ) //conversion from '__int64' to 'int', possible loss of data +#endif + +#if !defined(OPENCV_DISABLE_EIGEN_TENSOR_SUPPORT) +#if EIGEN_WORLD_VERSION == 3 && EIGEN_MAJOR_VERSION >= 3 \ + && defined(CV_CXX11) && defined(CV_CXX_STD_ARRAY) +#include +#define OPENCV_EIGEN_TENSOR_SUPPORT 1 +#endif // EIGEN_WORLD_VERSION == 3 && EIGEN_MAJOR_VERSION >= 3 +#endif // !defined(OPENCV_DISABLE_EIGEN_TENSOR_SUPPORT) + +namespace cv +{ + +/** @addtogroup core_eigen +These functions are provided for OpenCV-Eigen interoperability. They convert `Mat` +objects to corresponding `Eigen::Matrix` objects and vice-versa. Consult the [Eigen +documentation](https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html) for +information about the `Matrix` template type. + +@note Using these functions requires the `Eigen/Dense` or similar header to be +included before this header. +*/ +//! @{ + +#if defined(OPENCV_EIGEN_TENSOR_SUPPORT) || defined(CV_DOXYGEN) +/** @brief Converts an Eigen::Tensor to a cv::Mat. + +The method converts an Eigen::Tensor with shape (H x W x C) to a cv::Mat where: + H = number of rows + W = number of columns + C = number of channels + +Usage: +\code +Eigen::Tensor a_tensor(...); +// populate tensor with values +Mat a_mat; +eigen2cv(a_tensor, a_mat); +\endcode +*/ +template static inline +void eigen2cv( const Eigen::Tensor<_Tp, 3, _layout> &src, OutputArray dst ) +{ + if( !(_layout & Eigen::RowMajorBit) ) + { + const std::array shuffle{2, 1, 0}; + Eigen::Tensor<_Tp, 3, !_layout> row_major_tensor = src.swap_layout().shuffle(shuffle); + Mat _src(src.dimension(0), src.dimension(1), CV_MAKETYPE(DataType<_Tp>::type, src.dimension(2)), row_major_tensor.data()); + _src.copyTo(dst); + } + else + { + Mat _src(src.dimension(0), src.dimension(1), CV_MAKETYPE(DataType<_Tp>::type, src.dimension(2)), (void *)src.data()); + _src.copyTo(dst); + } +} + +/** @brief Converts a cv::Mat to an Eigen::Tensor. + +The method converts a cv::Mat to an Eigen Tensor with shape (H x W x C) where: + H = number of rows + W = number of columns + C = number of channels + +Usage: +\code +Mat a_mat(...); +// populate Mat with values +Eigen::Tensor a_tensor(...); +cv2eigen(a_mat, a_tensor); +\endcode +*/ +template static inline +void cv2eigen( const Mat &src, Eigen::Tensor<_Tp, 3, _layout> &dst ) +{ + if( !(_layout & Eigen::RowMajorBit) ) + { + Eigen::Tensor<_Tp, 3, !_layout> row_major_tensor(src.rows, src.cols, src.channels()); + Mat _dst(src.rows, src.cols, CV_MAKETYPE(DataType<_Tp>::type, src.channels()), row_major_tensor.data()); + if (src.type() == _dst.type()) + src.copyTo(_dst); + else + src.convertTo(_dst, _dst.type()); + const std::array shuffle{2, 1, 0}; + dst = row_major_tensor.swap_layout().shuffle(shuffle); + } + else + { + dst.resize(src.rows, src.cols, src.channels()); + Mat _dst(src.rows, src.cols, CV_MAKETYPE(DataType<_Tp>::type, src.channels()), dst.data()); + if (src.type() == _dst.type()) + src.copyTo(_dst); + else + src.convertTo(_dst, _dst.type()); + } +} + +/** @brief Maps cv::Mat data to an Eigen::TensorMap. + +The method wraps an existing Mat data array with an Eigen TensorMap of shape (H x W x C) where: + H = number of rows + W = number of columns + C = number of channels + +Explicit instantiation of the return type is required. + +@note Caller should be aware of the lifetime of the cv::Mat instance and take appropriate safety measures. +The cv::Mat instance will retain ownership of the data and the Eigen::TensorMap will lose access when the cv::Mat data is deallocated. + +The example below initializes a cv::Mat and produces an Eigen::TensorMap: +\code +float arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; +Mat a_mat(2, 2, CV_32FC3, arr); +Eigen::TensorMap> a_tensormap = cv2eigen_tensormap(a_mat); +\endcode +*/ +template static inline +Eigen::TensorMap> cv2eigen_tensormap(InputArray src) +{ + Mat mat = src.getMat(); + CV_CheckTypeEQ(mat.type(), CV_MAKETYPE(traits::Type<_Tp>::value, mat.channels()), ""); + return Eigen::TensorMap>((_Tp *)mat.data, mat.rows, mat.cols, mat.channels()); +} +#endif // OPENCV_EIGEN_TENSOR_SUPPORT + +template static inline +void eigen2cv( const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, OutputArray dst ) +{ + if( !(src.Flags & Eigen::RowMajorBit) ) + { + Mat _src(src.cols(), src.rows(), traits::Type<_Tp>::value, + (void*)src.data(), src.outerStride()*sizeof(_Tp)); + transpose(_src, dst); + } + else + { + Mat _src(src.rows(), src.cols(), traits::Type<_Tp>::value, + (void*)src.data(), src.outerStride()*sizeof(_Tp)); + _src.copyTo(dst); + } +} + +// Matx case +template static inline +void eigen2cv( const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, + Matx<_Tp, _rows, _cols>& dst ) +{ + if( !(src.Flags & Eigen::RowMajorBit) ) + { + dst = Matx<_Tp, _cols, _rows>(static_cast(src.data())).t(); + } + else + { + dst = Matx<_Tp, _rows, _cols>(static_cast(src.data())); + } +} + +template static inline +void cv2eigen( const Mat& src, + Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst ) +{ + CV_DbgAssert(src.rows == _rows && src.cols == _cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(src.cols, src.rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + if( src.type() == _dst.type() ) + transpose(src, _dst); + else if( src.cols == src.rows ) + { + src.convertTo(_dst, _dst.type()); + transpose(_dst, _dst); + } + else + Mat(src.t()).convertTo(_dst, _dst.type()); + } + else + { + const Mat _dst(src.rows, src.cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + src.convertTo(_dst, _dst.type()); + } +} + +// Matx case +template static inline +void cv2eigen( const Matx<_Tp, _rows, _cols>& src, + Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst ) +{ + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(_cols, _rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + transpose(src, _dst); + } + else + { + const Mat _dst(_rows, _cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + } +} + +template static inline +void cv2eigen( const Mat& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst ) +{ + dst.resize(src.rows, src.cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(src.cols, src.rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + if( src.type() == _dst.type() ) + transpose(src, _dst); + else if( src.cols == src.rows ) + { + src.convertTo(_dst, _dst.type()); + transpose(_dst, _dst); + } + else + Mat(src.t()).convertTo(_dst, _dst.type()); + } + else + { + const Mat _dst(src.rows, src.cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + src.convertTo(_dst, _dst.type()); + } +} + +// Matx case +template static inline +void cv2eigen( const Matx<_Tp, _rows, _cols>& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst ) +{ + dst.resize(_rows, _cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(_cols, _rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + transpose(src, _dst); + } + else + { + const Mat _dst(_rows, _cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + } +} + +template static inline +void cv2eigen( const Mat& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, 1>& dst ) +{ + CV_Assert(src.cols == 1); + dst.resize(src.rows); + + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(src.cols, src.rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + if( src.type() == _dst.type() ) + transpose(src, _dst); + else + Mat(src.t()).convertTo(_dst, _dst.type()); + } + else + { + const Mat _dst(src.rows, src.cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + src.convertTo(_dst, _dst.type()); + } +} + +// Matx case +template static inline +void cv2eigen( const Matx<_Tp, _rows, 1>& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, 1>& dst ) +{ + dst.resize(_rows); + + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(1, _rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + transpose(src, _dst); + } + else + { + const Mat _dst(_rows, 1, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + src.copyTo(_dst); + } +} + + +template static inline +void cv2eigen( const Mat& src, + Eigen::Matrix<_Tp, 1, Eigen::Dynamic>& dst ) +{ + CV_Assert(src.rows == 1); + dst.resize(src.cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(src.cols, src.rows, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + if( src.type() == _dst.type() ) + transpose(src, _dst); + else + Mat(src.t()).convertTo(_dst, _dst.type()); + } + else + { + const Mat _dst(src.rows, src.cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + src.convertTo(_dst, _dst.type()); + } +} + +//Matx +template static inline +void cv2eigen( const Matx<_Tp, 1, _cols>& src, + Eigen::Matrix<_Tp, 1, Eigen::Dynamic>& dst ) +{ + dst.resize(_cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + const Mat _dst(_cols, 1, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + transpose(src, _dst); + } + else + { + const Mat _dst(1, _cols, traits::Type<_Tp>::value, + dst.data(), (size_t)(dst.outerStride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + } +} + +//! @} + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/fast_math.hpp b/Thirdparty/opencv2/include/opencv2/core/fast_math.hpp new file mode 100644 index 0000000..08401af --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/fast_math.hpp @@ -0,0 +1,433 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_FAST_MATH_HPP +#define OPENCV_CORE_FAST_MATH_HPP + +#include "opencv2/core/cvdef.h" + +//! @addtogroup core_utils +//! @{ + +/****************************************************************************************\ +* fast math * +\****************************************************************************************/ + +#ifdef __cplusplus +# include +#else +# ifdef __BORLANDC__ +# include +# else +# include +# endif +#endif + +#if defined(__CUDACC__) + // nothing, intrinsics/asm code is not supported +#else + #if ((defined _MSC_VER && defined _M_X64) \ + || (defined __GNUC__ && defined __x86_64__ && defined __SSE2__)) \ + && !defined(OPENCV_SKIP_INCLUDE_EMMINTRIN_H) + #include + #endif + + #if defined __PPC64__ && defined __GNUC__ && defined _ARCH_PWR8 \ + && !defined(OPENCV_SKIP_INCLUDE_ALTIVEC_H) + #include + #undef vector + #undef bool + #undef pixel + #endif + + #if defined(CV_INLINE_ROUND_FLT) + // user-specified version + // CV_INLINE_ROUND_DBL should be defined too + #elif defined __GNUC__ && defined __arm__ && (defined __ARM_PCS_VFP || defined __ARM_VFPV3__ || defined __ARM_NEON__) && !defined __SOFTFP__ + // 1. general scheme + #define ARM_ROUND(_value, _asm_string) \ + int res; \ + float temp; \ + CV_UNUSED(temp); \ + __asm__(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \ + return res + // 2. version for double + #ifdef __clang__ + #define CV_INLINE_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %[value] \n vmov %[res], %[temp]") + #else + #define CV_INLINE_ROUND_DBL(value) ARM_ROUND(value, "vcvtr.s32.f64 %[temp], %P[value] \n vmov %[res], %[temp]") + #endif + // 3. version for float + #define CV_INLINE_ROUND_FLT(value) ARM_ROUND(value, "vcvtr.s32.f32 %[temp], %[value]\n vmov %[res], %[temp]") + #elif defined __PPC64__ && defined __GNUC__ && defined _ARCH_PWR8 + // P8 and newer machines can convert fp32/64 to int quickly. + #define CV_INLINE_ROUND_DBL(value) \ + int out; \ + double temp; \ + __asm__( "fctiw %[temp],%[in]\n\tmfvsrwz %[out],%[temp]\n\t" : [out] "=r" (out), [temp] "=d" (temp) : [in] "d" ((double)(value)) : ); \ + return out; + + // FP32 also works with FP64 routine above + #define CV_INLINE_ROUND_FLT(value) CV_INLINE_ROUND_DBL(value) + #endif + + #ifdef CV_INLINE_ISINF_FLT + // user-specified version + // CV_INLINE_ISINF_DBL should be defined too + #elif defined __PPC64__ && defined _ARCH_PWR9 && defined(scalar_test_data_class) + #define CV_INLINE_ISINF_DBL(value) return scalar_test_data_class(value, 0x30); + #define CV_INLINE_ISINF_FLT(value) CV_INLINE_ISINF_DBL(value) + #endif + + #ifdef CV_INLINE_ISNAN_FLT + // user-specified version + // CV_INLINE_ISNAN_DBL should be defined too + #elif defined __PPC64__ && defined _ARCH_PWR9 && defined(scalar_test_data_class) + #define CV_INLINE_ISNAN_DBL(value) return scalar_test_data_class(value, 0x40); + #define CV_INLINE_ISNAN_FLT(value) CV_INLINE_ISNAN_DBL(value) + #endif + + #if !defined(OPENCV_USE_FASTMATH_BUILTINS) \ + && ( \ + defined(__x86_64__) || defined(__i686__) \ + || defined(__arm__) \ + || defined(__PPC64__) \ + ) + /* Let builtin C math functions when available. Dedicated hardware is available to + round and convert FP values. */ + #define OPENCV_USE_FASTMATH_BUILTINS 1 + #endif + + /* Enable builtin math functions if possible, desired, and available. + Note, not all math functions inline equally. E.g lrint will not inline + without the -fno-math-errno option. */ + #if defined(CV_ICC) + // nothing + #elif defined(OPENCV_USE_FASTMATH_BUILTINS) && OPENCV_USE_FASTMATH_BUILTINS + #if defined(__clang__) + #define CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + #if !defined(CV_INLINE_ISNAN_DBL) && __has_builtin(__builtin_isnan) + #define CV_INLINE_ISNAN_DBL(value) return __builtin_isnan(value); + #endif + #if !defined(CV_INLINE_ISNAN_FLT) && __has_builtin(__builtin_isnan) + #define CV_INLINE_ISNAN_FLT(value) return __builtin_isnan(value); + #endif + #if !defined(CV_INLINE_ISINF_DBL) && __has_builtin(__builtin_isinf) + #define CV_INLINE_ISINF_DBL(value) return __builtin_isinf(value); + #endif + #if !defined(CV_INLINE_ISINF_FLT) && __has_builtin(__builtin_isinf) + #define CV_INLINE_ISINF_FLT(value) return __builtin_isinf(value); + #endif + #elif defined(__GNUC__) + #define CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS + #if !defined(CV_INLINE_ISNAN_DBL) + #define CV_INLINE_ISNAN_DBL(value) return __builtin_isnan(value); + #endif + #if !defined(CV_INLINE_ISNAN_FLT) + #define CV_INLINE_ISNAN_FLT(value) return __builtin_isnanf(value); + #endif + #if !defined(CV_INLINE_ISINF_DBL) + #define CV_INLINE_ISINF_DBL(value) return __builtin_isinf(value); + #endif + #if !defined(CV_INLINE_ISINF_FLT) + #define CV_INLINE_ISINF_FLT(value) return __builtin_isinff(value); + #endif + #elif defined(_MSC_VER) + #if !defined(CV_INLINE_ISNAN_DBL) + #define CV_INLINE_ISNAN_DBL(value) return isnan(value); + #endif + #if !defined(CV_INLINE_ISNAN_FLT) + #define CV_INLINE_ISNAN_FLT(value) return isnan(value); + #endif + #if !defined(CV_INLINE_ISINF_DBL) + #define CV_INLINE_ISINF_DBL(value) return isinf(value); + #endif + #if !defined(CV_INLINE_ISINF_FLT) + #define CV_INLINE_ISINF_FLT(value) return isinf(value); + #endif + #endif + #endif + +#endif // defined(__CUDACC__) + +/** @brief Rounds floating-point number to the nearest integer + + @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the + result is not defined. + */ +CV_INLINE int +cvRound( double value ) +{ +#if defined CV_INLINE_ROUND_DBL + CV_INLINE_ROUND_DBL(value); +#elif ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __SSE2__)) && !defined(__CUDACC__) + __m128d t = _mm_set_sd( value ); + return _mm_cvtsd_si32(t); +#elif defined _MSC_VER && defined _M_IX86 + int t; + __asm + { + fld value; + fistp t; + } + return t; +#elif defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_lrint(value); +#else + return (int)lrint(value); +#endif +} + + +/** @brief Rounds floating-point number to the nearest integer not larger than the original. + + The function computes an integer i such that: + \f[i \le \texttt{value} < i+1\f] + @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the + result is not defined. + */ +CV_INLINE int cvFloor( double value ) +{ +#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_floor(value); +#elif defined __loongarch64 + int i; + double tmp; + __asm__ ("ftintrm.l.d %[tmp], %[in] \n\t" + "movfr2gr.d %[i], %[tmp] \n\t" + : [i] "=r" (i), [tmp] "=f" (tmp) + : [in] "f" (value) + :); + return i; +#else + int i = (int)value; + return i - (i > value); +#endif +} + +/** @brief Rounds floating-point number to the nearest integer not smaller than the original. + + The function computes an integer i such that: + \f[i \le \texttt{value} < i+1\f] + @param value floating-point number. If the value is outside of INT_MIN ... INT_MAX range, the + result is not defined. + */ +CV_INLINE int cvCeil( double value ) +{ +#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_ceil(value); +#elif defined __loongarch64 + int i; + double tmp; + __asm__ ("ftintrp.l.d %[tmp], %[in] \n\t" + "movfr2gr.d %[i], %[tmp] \n\t" + : [i] "=r" (i), [tmp] "=f" (tmp) + : [in] "f" (value) + :); + return i; +#else + int i = (int)value; + return i + (i < value); +#endif +} + +/** @brief Determines if the argument is Not A Number. + + @param value The input floating-point value + + The function returns 1 if the argument is Not A Number (as defined by IEEE754 standard), 0 + otherwise. */ +CV_INLINE int cvIsNaN( double value ) +{ +#if defined CV_INLINE_ISNAN_DBL + CV_INLINE_ISNAN_DBL(value); +#else + Cv64suf ieee754; + ieee754.f = value; + return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) + + ((unsigned)ieee754.u != 0) > 0x7ff00000; +#endif +} + +/** @brief Determines if the argument is Infinity. + + @param value The input floating-point value + + The function returns 1 if the argument is a plus or minus infinity (as defined by IEEE754 standard) + and 0 otherwise. */ +CV_INLINE int cvIsInf( double value ) +{ +#if defined CV_INLINE_ISINF_DBL + CV_INLINE_ISINF_DBL(value); +#elif defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__PPC64__) || defined(__loongarch64) + Cv64suf ieee754; + ieee754.f = value; + return (ieee754.u & 0x7fffffffffffffff) == + 0x7ff0000000000000; +#else + Cv64suf ieee754; + ieee754.f = value; + return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 && + (unsigned)ieee754.u == 0; +#endif +} + +#ifdef __cplusplus + +/** @overload */ +CV_INLINE int cvRound(float value) +{ +#if defined CV_INLINE_ROUND_FLT + CV_INLINE_ROUND_FLT(value); +#elif ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __SSE2__)) && !defined(__CUDACC__) + __m128 t = _mm_set_ss( value ); + return _mm_cvtss_si32(t); +#elif defined _MSC_VER && defined _M_IX86 + int t; + __asm + { + fld value; + fistp t; + } + return t; +#elif defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_lrintf(value); +#else + return (int)lrintf(value); +#endif +} + +/** @overload */ +CV_INLINE int cvRound( int value ) +{ + return value; +} + +/** @overload */ +CV_INLINE int cvFloor( float value ) +{ +#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_floorf(value); +#elif defined __loongarch__ + int i; + float tmp; + __asm__ ("ftintrm.w.s %[tmp], %[in] \n\t" + "movfr2gr.s %[i], %[tmp] \n\t" + : [i] "=r" (i), [tmp] "=f" (tmp) + : [in] "f" (value) + :); + return i; +#else + int i = (int)value; + return i - (i > value); +#endif +} + +/** @overload */ +CV_INLINE int cvFloor( int value ) +{ + return value; +} + +/** @overload */ +CV_INLINE int cvCeil( float value ) +{ +#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \ + defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS + return (int)__builtin_ceilf(value); +#elif defined __loongarch__ + int i; + float tmp; + __asm__ ("ftintrp.w.s %[tmp], %[in] \n\t" + "movfr2gr.s %[i], %[tmp] \n\t" + : [i] "=r" (i), [tmp] "=f" (tmp) + : [in] "f" (value) + :); + return i; +#else + int i = (int)value; + return i + (i < value); +#endif +} + +/** @overload */ +CV_INLINE int cvCeil( int value ) +{ + return value; +} + +/** @overload */ +CV_INLINE int cvIsNaN( float value ) +{ +#if defined CV_INLINE_ISNAN_FLT + CV_INLINE_ISNAN_FLT(value); +#else + Cv32suf ieee754; + ieee754.f = value; + return (ieee754.u & 0x7fffffff) > 0x7f800000; +#endif +} + +/** @overload */ +CV_INLINE int cvIsInf( float value ) +{ +#if defined CV_INLINE_ISINF_FLT + CV_INLINE_ISINF_FLT(value); +#else + Cv32suf ieee754; + ieee754.f = value; + return (ieee754.u & 0x7fffffff) == 0x7f800000; +#endif +} + +#endif // __cplusplus + +//! @} core_utils + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/hal.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/hal.hpp new file mode 100644 index 0000000..0d68078 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/hal.hpp @@ -0,0 +1,256 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_HPP +#define OPENCV_HAL_HPP + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/cvstd.hpp" +#include "opencv2/core/hal/interface.h" + +namespace cv { namespace hal { + +//! @addtogroup core_hal_functions +//! @{ + +CV_EXPORTS int normHamming(const uchar* a, int n); +CV_EXPORTS int normHamming(const uchar* a, const uchar* b, int n); + +CV_EXPORTS int normHamming(const uchar* a, int n, int cellSize); +CV_EXPORTS int normHamming(const uchar* a, const uchar* b, int n, int cellSize); + +CV_EXPORTS int LU32f(float* A, size_t astep, int m, float* b, size_t bstep, int n); +CV_EXPORTS int LU64f(double* A, size_t astep, int m, double* b, size_t bstep, int n); +CV_EXPORTS bool Cholesky32f(float* A, size_t astep, int m, float* b, size_t bstep, int n); +CV_EXPORTS bool Cholesky64f(double* A, size_t astep, int m, double* b, size_t bstep, int n); +CV_EXPORTS void SVD32f(float* At, size_t astep, float* W, float* U, size_t ustep, float* Vt, size_t vstep, int m, int n, int flags); +CV_EXPORTS void SVD64f(double* At, size_t astep, double* W, double* U, size_t ustep, double* Vt, size_t vstep, int m, int n, int flags); +CV_EXPORTS int QR32f(float* A, size_t astep, int m, int n, int k, float* b, size_t bstep, float* hFactors); +CV_EXPORTS int QR64f(double* A, size_t astep, int m, int n, int k, double* b, size_t bstep, double* hFactors); + +CV_EXPORTS void gemm32f(const float* src1, size_t src1_step, const float* src2, size_t src2_step, + float alpha, const float* src3, size_t src3_step, float beta, float* dst, size_t dst_step, + int m_a, int n_a, int n_d, int flags); +CV_EXPORTS void gemm64f(const double* src1, size_t src1_step, const double* src2, size_t src2_step, + double alpha, const double* src3, size_t src3_step, double beta, double* dst, size_t dst_step, + int m_a, int n_a, int n_d, int flags); +CV_EXPORTS void gemm32fc(const float* src1, size_t src1_step, const float* src2, size_t src2_step, + float alpha, const float* src3, size_t src3_step, float beta, float* dst, size_t dst_step, + int m_a, int n_a, int n_d, int flags); +CV_EXPORTS void gemm64fc(const double* src1, size_t src1_step, const double* src2, size_t src2_step, + double alpha, const double* src3, size_t src3_step, double beta, double* dst, size_t dst_step, + int m_a, int n_a, int n_d, int flags); + +CV_EXPORTS int normL1_(const uchar* a, const uchar* b, int n); +CV_EXPORTS float normL1_(const float* a, const float* b, int n); +CV_EXPORTS float normL2Sqr_(const float* a, const float* b, int n); + +CV_EXPORTS void exp32f(const float* src, float* dst, int n); +CV_EXPORTS void exp64f(const double* src, double* dst, int n); +CV_EXPORTS void log32f(const float* src, float* dst, int n); +CV_EXPORTS void log64f(const double* src, double* dst, int n); + +CV_EXPORTS void fastAtan32f(const float* y, const float* x, float* dst, int n, bool angleInDegrees); +CV_EXPORTS void fastAtan64f(const double* y, const double* x, double* dst, int n, bool angleInDegrees); +CV_EXPORTS void magnitude32f(const float* x, const float* y, float* dst, int n); +CV_EXPORTS void magnitude64f(const double* x, const double* y, double* dst, int n); +CV_EXPORTS void sqrt32f(const float* src, float* dst, int len); +CV_EXPORTS void sqrt64f(const double* src, double* dst, int len); +CV_EXPORTS void invSqrt32f(const float* src, float* dst, int len); +CV_EXPORTS void invSqrt64f(const double* src, double* dst, int len); + +CV_EXPORTS void split8u(const uchar* src, uchar** dst, int len, int cn ); +CV_EXPORTS void split16u(const ushort* src, ushort** dst, int len, int cn ); +CV_EXPORTS void split32s(const int* src, int** dst, int len, int cn ); +CV_EXPORTS void split64s(const int64* src, int64** dst, int len, int cn ); + +CV_EXPORTS void merge8u(const uchar** src, uchar* dst, int len, int cn ); +CV_EXPORTS void merge16u(const ushort** src, ushort* dst, int len, int cn ); +CV_EXPORTS void merge32s(const int** src, int* dst, int len, int cn ); +CV_EXPORTS void merge64s(const int64** src, int64* dst, int len, int cn ); + +CV_EXPORTS void add8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void add64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void sub8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void sub64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void max8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void max64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void min8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void min64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void absdiff8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void absdiff64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void and8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void or8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void xor8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); +CV_EXPORTS void not8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* ); + +CV_EXPORTS void cmp8u(const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp8s(const schar* src1, size_t step1, const schar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp16u(const ushort* src1, size_t step1, const ushort* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp16s(const short* src1, size_t step1, const short* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp32s(const int* src1, size_t step1, const int* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp32f(const float* src1, size_t step1, const float* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); +CV_EXPORTS void cmp64f(const double* src1, size_t step1, const double* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _cmpop); + +CV_EXPORTS void mul8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void mul64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* scale); + +CV_EXPORTS void div8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void div64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* scale); + +CV_EXPORTS void recip8u( const uchar *, size_t, const uchar * src2, size_t step2, uchar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip8s( const schar *, size_t, const schar * src2, size_t step2, schar* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip16u( const ushort *, size_t, const ushort * src2, size_t step2, ushort* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip16s( const short *, size_t, const short * src2, size_t step2, short* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip32s( const int *, size_t, const int * src2, size_t step2, int* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip32f( const float *, size_t, const float * src2, size_t step2, float* dst, size_t step, int width, int height, void* scale); +CV_EXPORTS void recip64f( const double *, size_t, const double * src2, size_t step2, double* dst, size_t step, int width, int height, void* scale); + +CV_EXPORTS void addWeighted8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, uchar* dst, size_t step, int width, int height, void* _scalars ); +CV_EXPORTS void addWeighted8s( const schar* src1, size_t step1, const schar* src2, size_t step2, schar* dst, size_t step, int width, int height, void* scalars ); +CV_EXPORTS void addWeighted16u( const ushort* src1, size_t step1, const ushort* src2, size_t step2, ushort* dst, size_t step, int width, int height, void* scalars ); +CV_EXPORTS void addWeighted16s( const short* src1, size_t step1, const short* src2, size_t step2, short* dst, size_t step, int width, int height, void* scalars ); +CV_EXPORTS void addWeighted32s( const int* src1, size_t step1, const int* src2, size_t step2, int* dst, size_t step, int width, int height, void* scalars ); +CV_EXPORTS void addWeighted32f( const float* src1, size_t step1, const float* src2, size_t step2, float* dst, size_t step, int width, int height, void* scalars ); +CV_EXPORTS void addWeighted64f( const double* src1, size_t step1, const double* src2, size_t step2, double* dst, size_t step, int width, int height, void* scalars ); + +CV_EXPORTS void cvt16f32f( const float16_t* src, float* dst, int len ); +CV_EXPORTS void cvt32f16f( const float* src, float16_t* dst, int len ); + +CV_EXPORTS void addRNGBias32f( float* arr, const float* scaleBiasPairs, int len ); +CV_EXPORTS void addRNGBias64f( double* arr, const double* scaleBiasPairs, int len ); + +struct CV_EXPORTS DFT1D +{ + static Ptr create(int len, int count, int depth, int flags, bool * useBuffer = 0); + virtual void apply(const uchar *src, uchar *dst) = 0; + virtual ~DFT1D() {} +}; + +struct CV_EXPORTS DFT2D +{ + static Ptr create(int width, int height, int depth, + int src_channels, int dst_channels, + int flags, int nonzero_rows = 0); + virtual void apply(const uchar *src_data, size_t src_step, uchar *dst_data, size_t dst_step) = 0; + virtual ~DFT2D() {} +}; + +struct CV_EXPORTS DCT2D +{ + static Ptr create(int width, int height, int depth, int flags); + virtual void apply(const uchar *src_data, size_t src_step, uchar *dst_data, size_t dst_step) = 0; + virtual ~DCT2D() {} +}; + +//! @} core_hal + +//============================================================================= +// for binary compatibility with 3.0 + +//! @cond IGNORED + +CV_EXPORTS int LU(float* A, size_t astep, int m, float* b, size_t bstep, int n); +CV_EXPORTS int LU(double* A, size_t astep, int m, double* b, size_t bstep, int n); +CV_EXPORTS bool Cholesky(float* A, size_t astep, int m, float* b, size_t bstep, int n); +CV_EXPORTS bool Cholesky(double* A, size_t astep, int m, double* b, size_t bstep, int n); + +CV_EXPORTS void exp(const float* src, float* dst, int n); +CV_EXPORTS void exp(const double* src, double* dst, int n); +CV_EXPORTS void log(const float* src, float* dst, int n); +CV_EXPORTS void log(const double* src, double* dst, int n); + +CV_EXPORTS void fastAtan2(const float* y, const float* x, float* dst, int n, bool angleInDegrees); +CV_EXPORTS void magnitude(const float* x, const float* y, float* dst, int n); +CV_EXPORTS void magnitude(const double* x, const double* y, double* dst, int n); +CV_EXPORTS void sqrt(const float* src, float* dst, int len); +CV_EXPORTS void sqrt(const double* src, double* dst, int len); +CV_EXPORTS void invSqrt(const float* src, float* dst, int len); +CV_EXPORTS void invSqrt(const double* src, double* dst, int len); + +//! @endcond + +}} //cv::hal + +#endif //OPENCV_HAL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/interface.h b/Thirdparty/opencv2/include/opencv2/core/hal/interface.h new file mode 100644 index 0000000..6f0a83d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/interface.h @@ -0,0 +1,190 @@ +#ifndef OPENCV_CORE_HAL_INTERFACE_H +#define OPENCV_CORE_HAL_INTERFACE_H + +//! @addtogroup core_hal_interface +//! @{ + +//! @name Return codes +//! @{ +#define CV_HAL_ERROR_OK 0 +#define CV_HAL_ERROR_NOT_IMPLEMENTED 1 +#define CV_HAL_ERROR_UNKNOWN -1 +//! @} + +#ifdef __cplusplus +#include +#else +#include +#include +#endif + +//! @name Data types +//! primitive types +//! - schar - signed 1 byte integer +//! - uchar - unsigned 1 byte integer +//! - short - signed 2 byte integer +//! - ushort - unsigned 2 byte integer +//! - int - signed 4 byte integer +//! - uint - unsigned 4 byte integer +//! - int64 - signed 8 byte integer +//! - uint64 - unsigned 8 byte integer +//! @{ +#if !defined _MSC_VER && !defined __BORLANDC__ +# if defined __cplusplus && __cplusplus >= 201103L && !defined __APPLE__ +# include +# ifdef __NEWLIB__ + typedef unsigned int uint; +# else + typedef std::uint32_t uint; +# endif +# else +# include + typedef uint32_t uint; +# endif +#else + typedef unsigned uint; +#endif + +typedef signed char schar; + +#ifndef __IPL_H__ + typedef unsigned char uchar; + typedef unsigned short ushort; +#endif + +#if defined _MSC_VER || defined __BORLANDC__ + typedef __int64 int64; + typedef unsigned __int64 uint64; +# define CV_BIG_INT(n) n##I64 +# define CV_BIG_UINT(n) n##UI64 +#else + typedef int64_t int64; + typedef uint64_t uint64; +# define CV_BIG_INT(n) n##LL +# define CV_BIG_UINT(n) n##ULL +#endif + +#define CV_USRTYPE1 (void)"CV_USRTYPE1 support has been dropped in OpenCV 4.0" + +#define CV_CN_MAX 512 +#define CV_CN_SHIFT 3 +#define CV_DEPTH_MAX (1 << CV_CN_SHIFT) + +#define CV_8U 0 +#define CV_8S 1 +#define CV_16U 2 +#define CV_16S 3 +#define CV_32S 4 +#define CV_32F 5 +#define CV_64F 6 +#define CV_16F 7 + +#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) +#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK) + +#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) +#define CV_MAKE_TYPE CV_MAKETYPE + +#define CV_8UC1 CV_MAKETYPE(CV_8U,1) +#define CV_8UC2 CV_MAKETYPE(CV_8U,2) +#define CV_8UC3 CV_MAKETYPE(CV_8U,3) +#define CV_8UC4 CV_MAKETYPE(CV_8U,4) +#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) + +#define CV_8SC1 CV_MAKETYPE(CV_8S,1) +#define CV_8SC2 CV_MAKETYPE(CV_8S,2) +#define CV_8SC3 CV_MAKETYPE(CV_8S,3) +#define CV_8SC4 CV_MAKETYPE(CV_8S,4) +#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) + +#define CV_16UC1 CV_MAKETYPE(CV_16U,1) +#define CV_16UC2 CV_MAKETYPE(CV_16U,2) +#define CV_16UC3 CV_MAKETYPE(CV_16U,3) +#define CV_16UC4 CV_MAKETYPE(CV_16U,4) +#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) + +#define CV_16SC1 CV_MAKETYPE(CV_16S,1) +#define CV_16SC2 CV_MAKETYPE(CV_16S,2) +#define CV_16SC3 CV_MAKETYPE(CV_16S,3) +#define CV_16SC4 CV_MAKETYPE(CV_16S,4) +#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) + +#define CV_32SC1 CV_MAKETYPE(CV_32S,1) +#define CV_32SC2 CV_MAKETYPE(CV_32S,2) +#define CV_32SC3 CV_MAKETYPE(CV_32S,3) +#define CV_32SC4 CV_MAKETYPE(CV_32S,4) +#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) + +#define CV_32FC1 CV_MAKETYPE(CV_32F,1) +#define CV_32FC2 CV_MAKETYPE(CV_32F,2) +#define CV_32FC3 CV_MAKETYPE(CV_32F,3) +#define CV_32FC4 CV_MAKETYPE(CV_32F,4) +#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) + +#define CV_64FC1 CV_MAKETYPE(CV_64F,1) +#define CV_64FC2 CV_MAKETYPE(CV_64F,2) +#define CV_64FC3 CV_MAKETYPE(CV_64F,3) +#define CV_64FC4 CV_MAKETYPE(CV_64F,4) +#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) + +#define CV_16FC1 CV_MAKETYPE(CV_16F,1) +#define CV_16FC2 CV_MAKETYPE(CV_16F,2) +#define CV_16FC3 CV_MAKETYPE(CV_16F,3) +#define CV_16FC4 CV_MAKETYPE(CV_16F,4) +#define CV_16FC(n) CV_MAKETYPE(CV_16F,(n)) +//! @} + +//! @name Comparison operation +//! @sa cv::CmpTypes +//! @{ +#define CV_HAL_CMP_EQ 0 +#define CV_HAL_CMP_GT 1 +#define CV_HAL_CMP_GE 2 +#define CV_HAL_CMP_LT 3 +#define CV_HAL_CMP_LE 4 +#define CV_HAL_CMP_NE 5 +//! @} + +//! @name Border processing modes +//! @sa cv::BorderTypes +//! @{ +#define CV_HAL_BORDER_CONSTANT 0 +#define CV_HAL_BORDER_REPLICATE 1 +#define CV_HAL_BORDER_REFLECT 2 +#define CV_HAL_BORDER_WRAP 3 +#define CV_HAL_BORDER_REFLECT_101 4 +#define CV_HAL_BORDER_TRANSPARENT 5 +#define CV_HAL_BORDER_ISOLATED 16 +//! @} + +//! @name DFT flags +//! @{ +#define CV_HAL_DFT_INVERSE 1 +#define CV_HAL_DFT_SCALE 2 +#define CV_HAL_DFT_ROWS 4 +#define CV_HAL_DFT_COMPLEX_OUTPUT 16 +#define CV_HAL_DFT_REAL_OUTPUT 32 +#define CV_HAL_DFT_TWO_STAGE 64 +#define CV_HAL_DFT_STAGE_COLS 128 +#define CV_HAL_DFT_IS_CONTINUOUS 512 +#define CV_HAL_DFT_IS_INPLACE 1024 +//! @} + +//! @name SVD flags +//! @{ +#define CV_HAL_SVD_NO_UV 1 +#define CV_HAL_SVD_SHORT_UV 2 +#define CV_HAL_SVD_MODIFY_A 4 +#define CV_HAL_SVD_FULL_UV 8 +//! @} + +//! @name Gemm flags +//! @{ +#define CV_HAL_GEMM_1_T 1 +#define CV_HAL_GEMM_2_T 2 +#define CV_HAL_GEMM_3_T 4 +//! @} + +//! @} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin.hpp new file mode 100644 index 0000000..3968cba --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin.hpp @@ -0,0 +1,1262 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_INTRIN_HPP +#define OPENCV_HAL_INTRIN_HPP + +#include +#include +#include +#include "opencv2/core/cvdef.h" + +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + +#define OPENCV_HAL_ADD(a, b) ((a) + (b)) +#define OPENCV_HAL_AND(a, b) ((a) & (b)) +#define OPENCV_HAL_NOP(a) (a) +#define OPENCV_HAL_1ST(a, b) (a) + +namespace { +inline unsigned int trailingZeros32(unsigned int value) { +#if defined(_MSC_VER) +#if (_MSC_VER < 1700) || defined(_M_ARM) || defined(_M_ARM64) + unsigned long index = 0; + _BitScanForward(&index, value); + return (unsigned int)index; +#elif defined(__clang__) + // clang-cl doesn't export _tzcnt_u32 for non BMI systems + return value ? __builtin_ctz(value) : 32; +#else + return _tzcnt_u32(value); +#endif +#elif defined(__GNUC__) || defined(__GNUG__) + return __builtin_ctz(value); +#elif defined(__ICC) || defined(__INTEL_COMPILER) + return _bit_scan_forward(value); +#elif defined(__clang__) + return llvm.cttz.i32(value, true); +#else + static const int MultiplyDeBruijnBitPosition[32] = { + 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 }; + return MultiplyDeBruijnBitPosition[((uint32_t)((value & -value) * 0x077CB531U)) >> 27]; +#endif +} +} + +// unlike HAL API, which is in cv::hal, +// we put intrinsics into cv namespace to make its +// access from within opencv code more accessible +namespace cv { + +namespace hal { + +enum StoreMode +{ + STORE_UNALIGNED = 0, + STORE_ALIGNED = 1, + STORE_ALIGNED_NOCACHE = 2 +}; + +} + +// TODO FIXIT: Don't use "God" traits. Split on separate cases. +template struct V_TypeTraits +{ +}; + +#define CV_INTRIN_DEF_TYPE_TRAITS(type, int_type_, uint_type_, abs_type_, w_type_, q_type_, sum_type_) \ + template<> struct V_TypeTraits \ + { \ + typedef type value_type; \ + typedef int_type_ int_type; \ + typedef abs_type_ abs_type; \ + typedef uint_type_ uint_type; \ + typedef w_type_ w_type; \ + typedef q_type_ q_type; \ + typedef sum_type_ sum_type; \ + \ + static inline int_type reinterpret_int(type x) \ + { \ + union { type l; int_type i; } v; \ + v.l = x; \ + return v.i; \ + } \ + \ + static inline type reinterpret_from_int(int_type x) \ + { \ + union { type l; int_type i; } v; \ + v.i = x; \ + return v.l; \ + } \ + } + +#define CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(type, int_type_, uint_type_, abs_type_, w_type_, sum_type_) \ + template<> struct V_TypeTraits \ + { \ + typedef type value_type; \ + typedef int_type_ int_type; \ + typedef abs_type_ abs_type; \ + typedef uint_type_ uint_type; \ + typedef w_type_ w_type; \ + typedef sum_type_ sum_type; \ + \ + static inline int_type reinterpret_int(type x) \ + { \ + union { type l; int_type i; } v; \ + v.l = x; \ + return v.i; \ + } \ + \ + static inline type reinterpret_from_int(int_type x) \ + { \ + union { type l; int_type i; } v; \ + v.i = x; \ + return v.l; \ + } \ + } + +CV_INTRIN_DEF_TYPE_TRAITS(uchar, schar, uchar, uchar, ushort, unsigned, unsigned); +CV_INTRIN_DEF_TYPE_TRAITS(schar, schar, uchar, uchar, short, int, int); +CV_INTRIN_DEF_TYPE_TRAITS(ushort, short, ushort, ushort, unsigned, uint64, unsigned); +CV_INTRIN_DEF_TYPE_TRAITS(short, short, ushort, ushort, int, int64, int); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(unsigned, int, unsigned, unsigned, uint64, unsigned); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(int, int, unsigned, unsigned, int64, int); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(float, int, unsigned, float, double, float); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(uint64, int64, uint64, uint64, void, uint64); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(int64, int64, uint64, uint64, void, int64); +CV_INTRIN_DEF_TYPE_TRAITS_NO_Q_TYPE(double, int64, uint64, double, void, double); + +#ifndef CV_DOXYGEN + +#ifndef CV_CPU_OPTIMIZATION_HAL_NAMESPACE +#ifdef CV_FORCE_SIMD128_CPP + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE hal_EMULATOR_CPP + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN namespace hal_EMULATOR_CPP { + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END } +#elif defined(CV_CPU_DISPATCH_MODE) + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE __CV_CAT(hal_, CV_CPU_DISPATCH_MODE) + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN namespace __CV_CAT(hal_, CV_CPU_DISPATCH_MODE) { + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END } +#else + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE hal_baseline + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN namespace hal_baseline { + #define CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END } +#endif +#endif // CV_CPU_OPTIMIZATION_HAL_NAMESPACE + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END +using namespace CV_CPU_OPTIMIZATION_HAL_NAMESPACE; +#endif +} + +#ifdef CV_DOXYGEN +# undef CV_AVX2 +# undef CV_SSE2 +# undef CV_NEON +# undef CV_VSX +# undef CV_FP16 +# undef CV_MSA +# undef CV_RVV +#endif + +#if (CV_SSE2 || CV_NEON || CV_VSX || CV_MSA || CV_WASM_SIMD || CV_RVV071 || CV_LSX) && !defined(CV_FORCE_SIMD128_CPP) +#define CV__SIMD_FORWARD 128 +#include "opencv2/core/hal/intrin_forward.hpp" +#endif + +#if CV_SSE2 && !defined(CV_FORCE_SIMD128_CPP) + +#include "opencv2/core/hal/intrin_sse_em.hpp" +#include "opencv2/core/hal/intrin_sse.hpp" + +#elif CV_NEON && !defined(CV_FORCE_SIMD128_CPP) + +#include "opencv2/core/hal/intrin_neon.hpp" + +#elif CV_RVV071 && !defined(CV_FORCE_SIMD128_CPP) +#define CV_SIMD128_CPP 0 +#include "opencv2/core/hal/intrin_rvv071.hpp" + +#elif CV_VSX && !defined(CV_FORCE_SIMD128_CPP) + +#include "opencv2/core/hal/intrin_vsx.hpp" + +#elif CV_MSA && !defined(CV_FORCE_SIMD128_CPP) + +#include "opencv2/core/hal/intrin_msa.hpp" + +#elif CV_WASM_SIMD && !defined(CV_FORCE_SIMD128_CPP) +#include "opencv2/core/hal/intrin_wasm.hpp" + +#elif CV_RVV && !defined(CV_FORCE_SIMD128_CPP) +#if defined(CV_RVV_SCALABLE) +#include "opencv2/core/hal/intrin_rvv_scalable.hpp" +#else +#include "opencv2/core/hal/intrin_rvv.hpp" +#endif + +#elif CV_LSX && !defined(CV_FORCE_SIMD128_CPP) + +#include "opencv2/core/hal/intrin_lsx.hpp" + +#elif CV_LASX + #if !defined(CV_FORCE_SIMD128_CPP) + #define CV_FORCE_SIMD128_CPP 1 + #endif +#include "opencv2/core/hal/intrin_cpp.hpp" + +#else + +#include "opencv2/core/hal/intrin_cpp.hpp" + +#endif + +// AVX2 can be used together with SSE2, so +// we define those two sets of intrinsics at once. +// Most of the intrinsics do not conflict (the proper overloaded variant is +// resolved by the argument types, e.g. v_float32x4 ~ SSE2, v_float32x8 ~ AVX2), +// but some of AVX2 intrinsics get v256_ prefix instead of v_, e.g. v256_load() vs v_load(). +// Correspondingly, the wide intrinsics (which are mapped to the "widest" +// available instruction set) will get vx_ prefix +// (and will be mapped to v256_ counterparts) (e.g. vx_load() => v256_load()) +#if CV_AVX2 + +#define CV__SIMD_FORWARD 256 +#include "opencv2/core/hal/intrin_forward.hpp" +#include "opencv2/core/hal/intrin_avx.hpp" + +#endif + +// AVX512 can be used together with SSE2 and AVX2, so +// we define those sets of intrinsics at once. +// For some of AVX512 intrinsics get v512_ prefix instead of v_, e.g. v512_load() vs v_load(). +// Wide intrinsics will be mapped to v512_ counterparts in this case(e.g. vx_load() => v512_load()) +#if CV_AVX512_SKX + +#define CV__SIMD_FORWARD 512 +#include "opencv2/core/hal/intrin_forward.hpp" +#include "opencv2/core/hal/intrin_avx512.hpp" + +#endif + +#if CV_LASX + +#define CV__SIMD_FORWARD 256 +#include "opencv2/core/hal/intrin_forward.hpp" +#include "opencv2/core/hal/intrin_lasx.hpp" + +#endif + +//! @cond IGNORED + +namespace cv { + +#ifndef CV_DOXYGEN +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN +#endif + +#ifndef CV_SIMD128 +#define CV_SIMD128 0 +#endif + +#ifndef CV_SIMD128_CPP +#define CV_SIMD128_CPP 0 +#endif + +#ifndef CV_SIMD128_64F +#define CV_SIMD128_64F 0 +#endif + +#ifndef CV_SIMD256 +#define CV_SIMD256 0 +#endif + +#ifndef CV_SIMD256_64F +#define CV_SIMD256_64F 0 +#endif + +#ifndef CV_SIMD512 +#define CV_SIMD512 0 +#endif + +#ifndef CV_SIMD512_64F +#define CV_SIMD512_64F 0 +#endif + +#ifndef CV_SIMD128_FP16 +#define CV_SIMD128_FP16 0 +#endif + +#ifndef CV_SIMD256_FP16 +#define CV_SIMD256_FP16 0 +#endif + +#ifndef CV_SIMD512_FP16 +#define CV_SIMD512_FP16 0 +#endif + +#ifndef CV_SIMD_SCALABLE +#define CV_SIMD_SCALABLE 0 +#endif + +#ifndef CV_SIMD_SCALABLE_64F +#define CV_SIMD_SCALABLE_64F 0 +#endif + +//================================================================================================== + +template struct V_RegTraits +{ +}; + +#define CV_DEF_REG_TRAITS(prefix, _reg, lane_type, suffix, _u_reg, _w_reg, _q_reg, _int_reg, _round_reg) \ + template<> struct V_RegTraits<_reg> \ + { \ + typedef _reg reg; \ + typedef _u_reg u_reg; \ + typedef _w_reg w_reg; \ + typedef _q_reg q_reg; \ + typedef _int_reg int_reg; \ + typedef _round_reg round_reg; \ + } + +#if CV_SIMD128 || CV_SIMD128_CPP + CV_DEF_REG_TRAITS(v, v_uint8x16, uchar, u8, v_uint8x16, v_uint16x8, v_uint32x4, v_int8x16, void); + CV_DEF_REG_TRAITS(v, v_int8x16, schar, s8, v_uint8x16, v_int16x8, v_int32x4, v_int8x16, void); + CV_DEF_REG_TRAITS(v, v_uint16x8, ushort, u16, v_uint16x8, v_uint32x4, v_uint64x2, v_int16x8, void); + CV_DEF_REG_TRAITS(v, v_int16x8, short, s16, v_uint16x8, v_int32x4, v_int64x2, v_int16x8, void); + CV_DEF_REG_TRAITS(v, v_uint32x4, unsigned, u32, v_uint32x4, v_uint64x2, void, v_int32x4, void); + CV_DEF_REG_TRAITS(v, v_int32x4, int, s32, v_uint32x4, v_int64x2, void, v_int32x4, void); +#if CV_SIMD128_64F || CV_SIMD128_CPP + CV_DEF_REG_TRAITS(v, v_float32x4, float, f32, v_float32x4, v_float64x2, void, v_int32x4, v_int32x4); +#else + CV_DEF_REG_TRAITS(v, v_float32x4, float, f32, v_float32x4, void, void, v_int32x4, v_int32x4); +#endif + CV_DEF_REG_TRAITS(v, v_uint64x2, uint64, u64, v_uint64x2, void, void, v_int64x2, void); + CV_DEF_REG_TRAITS(v, v_int64x2, int64, s64, v_uint64x2, void, void, v_int64x2, void); +#if CV_SIMD128_64F + CV_DEF_REG_TRAITS(v, v_float64x2, double, f64, v_float64x2, void, void, v_int64x2, v_int32x4); +#endif +#endif + +#if CV_SIMD256 + CV_DEF_REG_TRAITS(v256, v_uint8x32, uchar, u8, v_uint8x32, v_uint16x16, v_uint32x8, v_int8x32, void); + CV_DEF_REG_TRAITS(v256, v_int8x32, schar, s8, v_uint8x32, v_int16x16, v_int32x8, v_int8x32, void); + CV_DEF_REG_TRAITS(v256, v_uint16x16, ushort, u16, v_uint16x16, v_uint32x8, v_uint64x4, v_int16x16, void); + CV_DEF_REG_TRAITS(v256, v_int16x16, short, s16, v_uint16x16, v_int32x8, v_int64x4, v_int16x16, void); + CV_DEF_REG_TRAITS(v256, v_uint32x8, unsigned, u32, v_uint32x8, v_uint64x4, void, v_int32x8, void); + CV_DEF_REG_TRAITS(v256, v_int32x8, int, s32, v_uint32x8, v_int64x4, void, v_int32x8, void); + CV_DEF_REG_TRAITS(v256, v_float32x8, float, f32, v_float32x8, v_float64x4, void, v_int32x8, v_int32x8); + CV_DEF_REG_TRAITS(v256, v_uint64x4, uint64, u64, v_uint64x4, void, void, v_int64x4, void); + CV_DEF_REG_TRAITS(v256, v_int64x4, int64, s64, v_uint64x4, void, void, v_int64x4, void); + CV_DEF_REG_TRAITS(v256, v_float64x4, double, f64, v_float64x4, void, void, v_int64x4, v_int32x8); +#endif + +#if CV_SIMD512 + CV_DEF_REG_TRAITS(v512, v_uint8x64, uchar, u8, v_uint8x64, v_uint16x32, v_uint32x16, v_int8x64, void); + CV_DEF_REG_TRAITS(v512, v_int8x64, schar, s8, v_uint8x64, v_int16x32, v_int32x16, v_int8x64, void); + CV_DEF_REG_TRAITS(v512, v_uint16x32, ushort, u16, v_uint16x32, v_uint32x16, v_uint64x8, v_int16x32, void); + CV_DEF_REG_TRAITS(v512, v_int16x32, short, s16, v_uint16x32, v_int32x16, v_int64x8, v_int16x32, void); + CV_DEF_REG_TRAITS(v512, v_uint32x16, unsigned, u32, v_uint32x16, v_uint64x8, void, v_int32x16, void); + CV_DEF_REG_TRAITS(v512, v_int32x16, int, s32, v_uint32x16, v_int64x8, void, v_int32x16, void); + CV_DEF_REG_TRAITS(v512, v_float32x16, float, f32, v_float32x16, v_float64x8, void, v_int32x16, v_int32x16); + CV_DEF_REG_TRAITS(v512, v_uint64x8, uint64, u64, v_uint64x8, void, void, v_int64x8, void); + CV_DEF_REG_TRAITS(v512, v_int64x8, int64, s64, v_uint64x8, void, void, v_int64x8, void); + CV_DEF_REG_TRAITS(v512, v_float64x8, double, f64, v_float64x8, void, void, v_int64x8, v_int32x16); +#endif +#if CV_SIMD_SCALABLE + CV_DEF_REG_TRAITS(v, v_uint8, uchar, u8, v_uint8, v_uint16, v_uint32, v_int8, void); + CV_DEF_REG_TRAITS(v, v_int8, schar, s8, v_uint8, v_int16, v_int32, v_int8, void); + CV_DEF_REG_TRAITS(v, v_uint16, ushort, u16, v_uint16, v_uint32, v_uint64, v_int16, void); + CV_DEF_REG_TRAITS(v, v_int16, short, s16, v_uint16, v_int32, v_int64, v_int16, void); + CV_DEF_REG_TRAITS(v, v_uint32, unsigned, u32, v_uint32, v_uint64, void, v_int32, void); + CV_DEF_REG_TRAITS(v, v_int32, int, s32, v_uint32, v_int64, void, v_int32, void); + CV_DEF_REG_TRAITS(v, v_float32, float, f32, v_float32, v_float64, void, v_int32, v_int32); + CV_DEF_REG_TRAITS(v, v_uint64, uint64, u64, v_uint64, void, void, v_int64, void); + CV_DEF_REG_TRAITS(v, v_int64, int64, s64, v_uint64, void, void, v_int64, void); + CV_DEF_REG_TRAITS(v, v_float64, double, f64, v_float64, void, void, v_int64, v_int32); +#endif +//! @endcond + +#if CV_SIMD512 && (!defined(CV__SIMD_FORCE_WIDTH) || CV__SIMD_FORCE_WIDTH == 512) +#define CV__SIMD_NAMESPACE simd512 +namespace CV__SIMD_NAMESPACE { + #define CV_SIMD 1 + #define CV_SIMD_64F CV_SIMD512_64F + #define CV_SIMD_FP16 CV_SIMD512_FP16 + #define CV_SIMD_WIDTH 64 +//! @addtogroup core_hal_intrin +//! @{ + //! @brief Maximum available vector register capacity 8-bit unsigned integer values + typedef v_uint8x64 v_uint8; + //! @brief Maximum available vector register capacity 8-bit signed integer values + typedef v_int8x64 v_int8; + //! @brief Maximum available vector register capacity 16-bit unsigned integer values + typedef v_uint16x32 v_uint16; + //! @brief Maximum available vector register capacity 16-bit signed integer values + typedef v_int16x32 v_int16; + //! @brief Maximum available vector register capacity 32-bit unsigned integer values + typedef v_uint32x16 v_uint32; + //! @brief Maximum available vector register capacity 32-bit signed integer values + typedef v_int32x16 v_int32; + //! @brief Maximum available vector register capacity 64-bit unsigned integer values + typedef v_uint64x8 v_uint64; + //! @brief Maximum available vector register capacity 64-bit signed integer values + typedef v_int64x8 v_int64; + //! @brief Maximum available vector register capacity 32-bit floating point values (single precision) + typedef v_float32x16 v_float32; + #if CV_SIMD512_64F + //! @brief Maximum available vector register capacity 64-bit floating point values (double precision) + typedef v_float64x8 v_float64; + #endif +//! @} + + #define VXPREFIX(func) v512##func +} // namespace +using namespace CV__SIMD_NAMESPACE; +#elif CV_SIMD256 && (!defined(CV__SIMD_FORCE_WIDTH) || CV__SIMD_FORCE_WIDTH == 256) +#define CV__SIMD_NAMESPACE simd256 +namespace CV__SIMD_NAMESPACE { + #define CV_SIMD 1 + #define CV_SIMD_64F CV_SIMD256_64F + #define CV_SIMD_FP16 CV_SIMD256_FP16 + #define CV_SIMD_WIDTH 32 +//! @addtogroup core_hal_intrin +//! @{ + //! @brief Maximum available vector register capacity 8-bit unsigned integer values + typedef v_uint8x32 v_uint8; + //! @brief Maximum available vector register capacity 8-bit signed integer values + typedef v_int8x32 v_int8; + //! @brief Maximum available vector register capacity 16-bit unsigned integer values + typedef v_uint16x16 v_uint16; + //! @brief Maximum available vector register capacity 16-bit signed integer values + typedef v_int16x16 v_int16; + //! @brief Maximum available vector register capacity 32-bit unsigned integer values + typedef v_uint32x8 v_uint32; + //! @brief Maximum available vector register capacity 32-bit signed integer values + typedef v_int32x8 v_int32; + //! @brief Maximum available vector register capacity 64-bit unsigned integer values + typedef v_uint64x4 v_uint64; + //! @brief Maximum available vector register capacity 64-bit signed integer values + typedef v_int64x4 v_int64; + //! @brief Maximum available vector register capacity 32-bit floating point values (single precision) + typedef v_float32x8 v_float32; + #if CV_SIMD256_64F + //! @brief Maximum available vector register capacity 64-bit floating point values (double precision) + typedef v_float64x4 v_float64; + #endif +//! @} + + #define VXPREFIX(func) v256##func +} // namespace +using namespace CV__SIMD_NAMESPACE; +#elif (CV_SIMD128 || CV_SIMD128_CPP) && (!defined(CV__SIMD_FORCE_WIDTH) || CV__SIMD_FORCE_WIDTH == 128) +#if defined CV_SIMD128_CPP +#define CV__SIMD_NAMESPACE simd128_cpp +#else +#define CV__SIMD_NAMESPACE simd128 +#endif +namespace CV__SIMD_NAMESPACE { + #define CV_SIMD CV_SIMD128 + #define CV_SIMD_64F CV_SIMD128_64F + #define CV_SIMD_WIDTH 16 +//! @addtogroup core_hal_intrin +//! @{ + //! @brief Maximum available vector register capacity 8-bit unsigned integer values + typedef v_uint8x16 v_uint8; + //! @brief Maximum available vector register capacity 8-bit signed integer values + typedef v_int8x16 v_int8; + //! @brief Maximum available vector register capacity 16-bit unsigned integer values + typedef v_uint16x8 v_uint16; + //! @brief Maximum available vector register capacity 16-bit signed integer values + typedef v_int16x8 v_int16; + //! @brief Maximum available vector register capacity 32-bit unsigned integer values + typedef v_uint32x4 v_uint32; + //! @brief Maximum available vector register capacity 32-bit signed integer values + typedef v_int32x4 v_int32; + //! @brief Maximum available vector register capacity 64-bit unsigned integer values + typedef v_uint64x2 v_uint64; + //! @brief Maximum available vector register capacity 64-bit signed integer values + typedef v_int64x2 v_int64; + //! @brief Maximum available vector register capacity 32-bit floating point values (single precision) + typedef v_float32x4 v_float32; + #if CV_SIMD128_64F + //! @brief Maximum available vector register capacity 64-bit floating point values (double precision) + typedef v_float64x2 v_float64; + #endif +//! @} + + #define VXPREFIX(func) v##func +} // namespace +using namespace CV__SIMD_NAMESPACE; + +#elif CV_SIMD_SCALABLE +#define CV__SIMD_NAMESPACE simd +namespace CV__SIMD_NAMESPACE { + #define CV_SIMD 0 + #define CV_SIMD_WIDTH 128 /* 1024/8 */ + + #define VXPREFIX(func) v##func +} // namespace +using namespace CV__SIMD_NAMESPACE; + +#endif + +//! @cond IGNORED +#ifndef CV_SIMD_64F +#define CV_SIMD_64F 0 +#endif + +namespace CV__SIMD_NAMESPACE { +//! @addtogroup core_hal_intrin +//! @{ + //! @name Wide init with value + //! @{ + //! @brief Create maximum available capacity vector with elements set to a specific value + inline v_uint8 vx_setall_u8(uchar v) { return VXPREFIX(_setall_u8)(v); } + inline v_int8 vx_setall_s8(schar v) { return VXPREFIX(_setall_s8)(v); } + inline v_uint16 vx_setall_u16(ushort v) { return VXPREFIX(_setall_u16)(v); } + inline v_int16 vx_setall_s16(short v) { return VXPREFIX(_setall_s16)(v); } + inline v_int32 vx_setall_s32(int v) { return VXPREFIX(_setall_s32)(v); } + inline v_uint32 vx_setall_u32(unsigned v) { return VXPREFIX(_setall_u32)(v); } + inline v_float32 vx_setall_f32(float v) { return VXPREFIX(_setall_f32)(v); } + inline v_int64 vx_setall_s64(int64 v) { return VXPREFIX(_setall_s64)(v); } + inline v_uint64 vx_setall_u64(uint64 v) { return VXPREFIX(_setall_u64)(v); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_setall_f64(double v) { return VXPREFIX(_setall_f64)(v); } +#endif + //! @} + + //! @name Wide init with zero + //! @{ + //! @brief Create maximum available capacity vector with elements set to zero + inline v_uint8 vx_setzero_u8() { return VXPREFIX(_setzero_u8)(); } + inline v_int8 vx_setzero_s8() { return VXPREFIX(_setzero_s8)(); } + inline v_uint16 vx_setzero_u16() { return VXPREFIX(_setzero_u16)(); } + inline v_int16 vx_setzero_s16() { return VXPREFIX(_setzero_s16)(); } + inline v_int32 vx_setzero_s32() { return VXPREFIX(_setzero_s32)(); } + inline v_uint32 vx_setzero_u32() { return VXPREFIX(_setzero_u32)(); } + inline v_float32 vx_setzero_f32() { return VXPREFIX(_setzero_f32)(); } + inline v_int64 vx_setzero_s64() { return VXPREFIX(_setzero_s64)(); } + inline v_uint64 vx_setzero_u64() { return VXPREFIX(_setzero_u64)(); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_setzero_f64() { return VXPREFIX(_setzero_f64)(); } +#endif + //! @} + + //! @name Wide load from memory + //! @{ + //! @brief Load maximum available capacity register contents from memory + inline v_uint8 vx_load(const uchar * ptr) { return VXPREFIX(_load)(ptr); } + inline v_int8 vx_load(const schar * ptr) { return VXPREFIX(_load)(ptr); } + inline v_uint16 vx_load(const ushort * ptr) { return VXPREFIX(_load)(ptr); } + inline v_int16 vx_load(const short * ptr) { return VXPREFIX(_load)(ptr); } + inline v_int32 vx_load(const int * ptr) { return VXPREFIX(_load)(ptr); } + inline v_uint32 vx_load(const unsigned * ptr) { return VXPREFIX(_load)(ptr); } + inline v_float32 vx_load(const float * ptr) { return VXPREFIX(_load)(ptr); } + inline v_int64 vx_load(const int64 * ptr) { return VXPREFIX(_load)(ptr); } + inline v_uint64 vx_load(const uint64 * ptr) { return VXPREFIX(_load)(ptr); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_load(const double * ptr) { return VXPREFIX(_load)(ptr); } +#endif + //! @} + + //! @name Wide load from memory(aligned) + //! @{ + //! @brief Load maximum available capacity register contents from memory(aligned) + inline v_uint8 vx_load_aligned(const uchar * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_int8 vx_load_aligned(const schar * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_uint16 vx_load_aligned(const ushort * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_int16 vx_load_aligned(const short * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_int32 vx_load_aligned(const int * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_uint32 vx_load_aligned(const unsigned * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_float32 vx_load_aligned(const float * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_int64 vx_load_aligned(const int64 * ptr) { return VXPREFIX(_load_aligned)(ptr); } + inline v_uint64 vx_load_aligned(const uint64 * ptr) { return VXPREFIX(_load_aligned)(ptr); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_load_aligned(const double * ptr) { return VXPREFIX(_load_aligned)(ptr); } +#endif + //! @} + + //! @name Wide load lower half from memory + //! @{ + //! @brief Load lower half of maximum available capacity register from memory + inline v_uint8 vx_load_low(const uchar * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_int8 vx_load_low(const schar * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_uint16 vx_load_low(const ushort * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_int16 vx_load_low(const short * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_int32 vx_load_low(const int * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_uint32 vx_load_low(const unsigned * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_float32 vx_load_low(const float * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_int64 vx_load_low(const int64 * ptr) { return VXPREFIX(_load_low)(ptr); } + inline v_uint64 vx_load_low(const uint64 * ptr) { return VXPREFIX(_load_low)(ptr); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_load_low(const double * ptr) { return VXPREFIX(_load_low)(ptr); } +#endif + //! @} + + //! @name Wide load halfs from memory + //! @{ + //! @brief Load maximum available capacity register contents from two memory blocks + inline v_uint8 vx_load_halves(const uchar * ptr0, const uchar * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_int8 vx_load_halves(const schar * ptr0, const schar * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_uint16 vx_load_halves(const ushort * ptr0, const ushort * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_int16 vx_load_halves(const short * ptr0, const short * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_int32 vx_load_halves(const int * ptr0, const int * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_uint32 vx_load_halves(const unsigned * ptr0, const unsigned * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_float32 vx_load_halves(const float * ptr0, const float * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_int64 vx_load_halves(const int64 * ptr0, const int64 * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } + inline v_uint64 vx_load_halves(const uint64 * ptr0, const uint64 * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_load_halves(const double * ptr0, const double * ptr1) { return VXPREFIX(_load_halves)(ptr0, ptr1); } +#endif + //! @} + + //! @name Wide LUT of elements + //! @{ + //! @brief Load maximum available capacity register contents with array elements by provided indexes + inline v_uint8 vx_lut(const uchar * ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_int8 vx_lut(const schar * ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_uint16 vx_lut(const ushort * ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_int16 vx_lut(const short* ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_int32 vx_lut(const int* ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_uint32 vx_lut(const unsigned* ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_float32 vx_lut(const float* ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_int64 vx_lut(const int64 * ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } + inline v_uint64 vx_lut(const uint64 * ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_lut(const double* ptr, const int* idx) { return VXPREFIX(_lut)(ptr, idx); } +#endif + //! @} + + //! @name Wide LUT of element pairs + //! @{ + //! @brief Load maximum available capacity register contents with array element pairs by provided indexes + inline v_uint8 vx_lut_pairs(const uchar * ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_int8 vx_lut_pairs(const schar * ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_uint16 vx_lut_pairs(const ushort * ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_int16 vx_lut_pairs(const short* ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_int32 vx_lut_pairs(const int* ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_uint32 vx_lut_pairs(const unsigned* ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_float32 vx_lut_pairs(const float* ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_int64 vx_lut_pairs(const int64 * ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } + inline v_uint64 vx_lut_pairs(const uint64 * ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F + inline v_float64 vx_lut_pairs(const double* ptr, const int* idx) { return VXPREFIX(_lut_pairs)(ptr, idx); } +#endif + //! @} + + //! @name Wide LUT of element quads + //! @{ + //! @brief Load maximum available capacity register contents with array element quads by provided indexes + inline v_uint8 vx_lut_quads(const uchar* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_int8 vx_lut_quads(const schar* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_uint16 vx_lut_quads(const ushort* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_int16 vx_lut_quads(const short* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_int32 vx_lut_quads(const int* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_uint32 vx_lut_quads(const unsigned* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + inline v_float32 vx_lut_quads(const float* ptr, const int* idx) { return VXPREFIX(_lut_quads)(ptr, idx); } + //! @} + + //! @name Wide load with double expansion + //! @{ + //! @brief Load maximum available capacity register contents from memory with double expand + inline v_uint16 vx_load_expand(const uchar * ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_int16 vx_load_expand(const schar * ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_uint32 vx_load_expand(const ushort * ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_int32 vx_load_expand(const short* ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_int64 vx_load_expand(const int* ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_uint64 vx_load_expand(const unsigned* ptr) { return VXPREFIX(_load_expand)(ptr); } + inline v_float32 vx_load_expand(const float16_t * ptr) { return VXPREFIX(_load_expand)(ptr); } + //! @} + + //! @name Wide load with quad expansion + //! @{ + //! @brief Load maximum available capacity register contents from memory with quad expand + inline v_uint32 vx_load_expand_q(const uchar * ptr) { return VXPREFIX(_load_expand_q)(ptr); } + inline v_int32 vx_load_expand_q(const schar * ptr) { return VXPREFIX(_load_expand_q)(ptr); } + //! @} + + /** @brief SIMD processing state cleanup call */ + inline void vx_cleanup() { VXPREFIX(_cleanup)(); } + +#if !CV_SIMD_SCALABLE && !(CV_NEON && !defined(CV_FORCE_SIMD128_CPP)) + // Compatibility layer + + template struct VTraits { + static inline int vlanes() { return T::nlanes; } + enum { nlanes = T::nlanes, max_nlanes = T::nlanes }; + using lane_type = typename T::lane_type; + }; + + #define OPENCV_HAL_WRAP_BIN_OP_ADDSUB(_Tpvec) \ + inline _Tpvec v_add(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a + b; \ + } \ + inline _Tpvec v_sub(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a - b; \ + } \ + template \ + inline _Tpvec v_add(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_add(f1 + f2, vf...); \ + } + #define OPENCV_HAL_WRAP_SHIFT_OP(_Tpvec) \ + inline _Tpvec v_shr(const _Tpvec& a, int n) \ + { \ + return a >> n; \ + } \ + inline _Tpvec v_shl(const _Tpvec& a, int n) \ + { \ + return a << n; \ + } + + OPENCV_HAL_WRAP_SHIFT_OP(v_uint16) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint32) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint64) + OPENCV_HAL_WRAP_SHIFT_OP(v_int16) + OPENCV_HAL_WRAP_SHIFT_OP(v_int32) + OPENCV_HAL_WRAP_SHIFT_OP(v_int64) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint64) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int64) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + // when we use CV_SIMD128 with 256/512 bit SIMD (e.g. AVX2 or AVX512) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint8x16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint16x8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint32x4) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint64x2) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int8x16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int16x8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int32x4) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int64x2) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float32x4) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint16x8) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint32x4) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint64x2) + OPENCV_HAL_WRAP_SHIFT_OP(v_int16x8) + OPENCV_HAL_WRAP_SHIFT_OP(v_int32x4) + OPENCV_HAL_WRAP_SHIFT_OP(v_int64x2) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + // when we use CV_SIMD256 with 512 bit SIMD (e.g. AVX512) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint8x32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint16x16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint32x8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint64x4) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int8x32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int16x16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int32x8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int64x4) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float32x8) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint16x16) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint32x8) + OPENCV_HAL_WRAP_SHIFT_OP(v_uint64x4) + OPENCV_HAL_WRAP_SHIFT_OP(v_int16x16) + OPENCV_HAL_WRAP_SHIFT_OP(v_int32x8) + OPENCV_HAL_WRAP_SHIFT_OP(v_int64x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_BIN_OP_LOGIC(_Tpvec) \ + inline _Tpvec v_and(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a & b; \ + } \ + inline _Tpvec v_or(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a | b; \ + } \ + inline _Tpvec v_xor(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a ^ b; \ + } + + #define OPENCV_HAL_WRAP_NOT_OP(_Tpvec) \ + inline _Tpvec v_not(const _Tpvec& a) \ + { \ + return ~a; \ + } + + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint32) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint64) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int32) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int64) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float32) + OPENCV_HAL_WRAP_NOT_OP(v_uint8) + OPENCV_HAL_WRAP_NOT_OP(v_uint16) + OPENCV_HAL_WRAP_NOT_OP(v_uint32) + OPENCV_HAL_WRAP_NOT_OP(v_uint64) + OPENCV_HAL_WRAP_NOT_OP(v_int8) + OPENCV_HAL_WRAP_NOT_OP(v_int16) + OPENCV_HAL_WRAP_NOT_OP(v_int32) + OPENCV_HAL_WRAP_NOT_OP(v_int64) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint8x16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint16x8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint32x4) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint64x2) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int8x16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int16x8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int32x4) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int64x2) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float32x4) + OPENCV_HAL_WRAP_NOT_OP(v_uint8x16) + OPENCV_HAL_WRAP_NOT_OP(v_uint16x8) + OPENCV_HAL_WRAP_NOT_OP(v_uint32x4) + OPENCV_HAL_WRAP_NOT_OP(v_uint64x2) + OPENCV_HAL_WRAP_NOT_OP(v_int8x16) + OPENCV_HAL_WRAP_NOT_OP(v_int16x8) + OPENCV_HAL_WRAP_NOT_OP(v_int32x4) + OPENCV_HAL_WRAP_NOT_OP(v_int64x2) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint8x32) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint16x16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint32x8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_uint64x4) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int8x32) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int16x16) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int32x8) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_int64x4) + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float32x8) + OPENCV_HAL_WRAP_NOT_OP(v_uint8x32) + OPENCV_HAL_WRAP_NOT_OP(v_uint16x16) + OPENCV_HAL_WRAP_NOT_OP(v_uint32x8) + OPENCV_HAL_WRAP_NOT_OP(v_uint64x4) + OPENCV_HAL_WRAP_NOT_OP(v_int8x32) + OPENCV_HAL_WRAP_NOT_OP(v_int16x16) + OPENCV_HAL_WRAP_NOT_OP(v_int32x8) + OPENCV_HAL_WRAP_NOT_OP(v_int64x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_LOGIC(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_BIN_OP_MUL(_Tpvec) \ + inline _Tpvec v_mul(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a * b; \ + } \ + template \ + inline _Tpvec v_mul(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_mul(f1 * f2, vf...); \ + } + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint8x16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint16x8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint32x4) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int8x16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int16x8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int32x4) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float32x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint8x32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint16x16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint32x8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int8x32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int16x16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int32x8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float32x8) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_BIN_OP_DIV(_Tpvec) \ + inline _Tpvec v_div(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a / b; \ + } + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float32x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float32x8) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_DIV(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_CMP_OP(_Tpvec, intrin, op) \ + inline _Tpvec v_##intrin(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a op b; \ + } + #define OPENCV_HAL_WRAP_EQ_OP(_Tpvec) \ + inline _Tpvec v_eq(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a == b; \ + } \ + inline _Tpvec v_ne(const _Tpvec& a, const _Tpvec& b) \ + { \ + return a != b; \ + } + + #define OPENCV_HAL_WRAP_CMP(_Tpvec) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, eq, ==) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, ne, !=) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, lt, <) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, gt, >) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, le, <=) \ + OPENCV_HAL_WRAP_CMP_OP(_Tpvec, ge, >=) + + OPENCV_HAL_WRAP_CMP(v_uint8) + OPENCV_HAL_WRAP_CMP(v_uint16) + OPENCV_HAL_WRAP_CMP(v_uint32) + OPENCV_HAL_WRAP_EQ_OP(v_uint64) + OPENCV_HAL_WRAP_CMP(v_int8) + OPENCV_HAL_WRAP_CMP(v_int16) + OPENCV_HAL_WRAP_CMP(v_int32) + OPENCV_HAL_WRAP_EQ_OP(v_int64) + OPENCV_HAL_WRAP_CMP(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_CMP(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_CMP(v_uint8x16) + OPENCV_HAL_WRAP_CMP(v_uint16x8) + OPENCV_HAL_WRAP_CMP(v_uint32x4) + OPENCV_HAL_WRAP_EQ_OP(v_uint64x2) + OPENCV_HAL_WRAP_CMP(v_int8x16) + OPENCV_HAL_WRAP_CMP(v_int16x8) + OPENCV_HAL_WRAP_CMP(v_int32x4) + OPENCV_HAL_WRAP_EQ_OP(v_int64x2) + OPENCV_HAL_WRAP_CMP(v_float32x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_CMP(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_CMP(v_uint8x32) + OPENCV_HAL_WRAP_CMP(v_uint16x16) + OPENCV_HAL_WRAP_CMP(v_uint32x8) + OPENCV_HAL_WRAP_EQ_OP(v_uint64x4) + OPENCV_HAL_WRAP_CMP(v_int8x32) + OPENCV_HAL_WRAP_CMP(v_int16x16) + OPENCV_HAL_WRAP_CMP(v_int32x8) + OPENCV_HAL_WRAP_EQ_OP(v_int64x4) + OPENCV_HAL_WRAP_CMP(v_float32x8) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_CMP(v_float64x4) + #endif + #endif + + //////////// get0 //////////// + #define OPENCV_HAL_WRAP_GRT0(_Tpvec) \ + inline typename VTraits<_Tpvec>::lane_type v_get0(const _Tpvec& v) \ + { \ + return v.get0(); \ + } + + OPENCV_HAL_WRAP_GRT0(v_uint8) + OPENCV_HAL_WRAP_GRT0(v_int8) + OPENCV_HAL_WRAP_GRT0(v_uint16) + OPENCV_HAL_WRAP_GRT0(v_int16) + OPENCV_HAL_WRAP_GRT0(v_uint32) + OPENCV_HAL_WRAP_GRT0(v_int32) + OPENCV_HAL_WRAP_GRT0(v_uint64) + OPENCV_HAL_WRAP_GRT0(v_int64) + OPENCV_HAL_WRAP_GRT0(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_GRT0(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_GRT0(v_uint8x16) + OPENCV_HAL_WRAP_GRT0(v_uint16x8) + OPENCV_HAL_WRAP_GRT0(v_uint32x4) + OPENCV_HAL_WRAP_GRT0(v_uint64x2) + OPENCV_HAL_WRAP_GRT0(v_int8x16) + OPENCV_HAL_WRAP_GRT0(v_int16x8) + OPENCV_HAL_WRAP_GRT0(v_int32x4) + OPENCV_HAL_WRAP_GRT0(v_int64x2) + OPENCV_HAL_WRAP_GRT0(v_float32x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_GRT0(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_GRT0(v_uint8x32) + OPENCV_HAL_WRAP_GRT0(v_uint16x16) + OPENCV_HAL_WRAP_GRT0(v_uint32x8) + OPENCV_HAL_WRAP_GRT0(v_uint64x4) + OPENCV_HAL_WRAP_GRT0(v_int8x32) + OPENCV_HAL_WRAP_GRT0(v_int16x16) + OPENCV_HAL_WRAP_GRT0(v_int32x8) + OPENCV_HAL_WRAP_GRT0(v_int64x4) + OPENCV_HAL_WRAP_GRT0(v_float32x8) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_GRT0(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_EXTRACT(_Tpvec) \ + inline typename VTraits<_Tpvec>::lane_type v_extract_highest(const _Tpvec& v) \ + { \ + return v_extract_n::nlanes-1>(v); \ + } + + OPENCV_HAL_WRAP_EXTRACT(v_uint8) + OPENCV_HAL_WRAP_EXTRACT(v_int8) + OPENCV_HAL_WRAP_EXTRACT(v_uint16) + OPENCV_HAL_WRAP_EXTRACT(v_int16) + OPENCV_HAL_WRAP_EXTRACT(v_uint32) + OPENCV_HAL_WRAP_EXTRACT(v_int32) + OPENCV_HAL_WRAP_EXTRACT(v_uint64) + OPENCV_HAL_WRAP_EXTRACT(v_int64) + OPENCV_HAL_WRAP_EXTRACT(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_EXTRACT(v_float64) + #endif + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_EXTRACT(v_uint8x16) + OPENCV_HAL_WRAP_EXTRACT(v_uint16x8) + OPENCV_HAL_WRAP_EXTRACT(v_uint32x4) + OPENCV_HAL_WRAP_EXTRACT(v_uint64x2) + OPENCV_HAL_WRAP_EXTRACT(v_int8x16) + OPENCV_HAL_WRAP_EXTRACT(v_int16x8) + OPENCV_HAL_WRAP_EXTRACT(v_int32x4) + OPENCV_HAL_WRAP_EXTRACT(v_int64x2) + OPENCV_HAL_WRAP_EXTRACT(v_float32x4) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_EXTRACT(v_float64x2) + #endif + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_EXTRACT(v_uint8x32) + OPENCV_HAL_WRAP_EXTRACT(v_uint16x16) + OPENCV_HAL_WRAP_EXTRACT(v_uint32x8) + OPENCV_HAL_WRAP_EXTRACT(v_uint64x4) + OPENCV_HAL_WRAP_EXTRACT(v_int8x32) + OPENCV_HAL_WRAP_EXTRACT(v_int16x16) + OPENCV_HAL_WRAP_EXTRACT(v_int32x8) + OPENCV_HAL_WRAP_EXTRACT(v_int64x4) + OPENCV_HAL_WRAP_EXTRACT(v_float32x8) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_EXTRACT(v_float64x4) + #endif + #endif + + #define OPENCV_HAL_WRAP_BROADCAST(_Tpvec) \ + inline _Tpvec v_broadcast_highest(const _Tpvec& v) \ + { \ + return v_broadcast_element::nlanes-1>(v); \ + } + + OPENCV_HAL_WRAP_BROADCAST(v_uint32) + OPENCV_HAL_WRAP_BROADCAST(v_int32) + OPENCV_HAL_WRAP_BROADCAST(v_float32) + #if CV_SIMD_WIDTH != 16/*128*/ && CV_SIMD128 + OPENCV_HAL_WRAP_BROADCAST(v_uint32x4) + OPENCV_HAL_WRAP_BROADCAST(v_int32x4) + OPENCV_HAL_WRAP_BROADCAST(v_float32x4) + #endif + #if CV_SIMD_WIDTH != 32/*256*/ && CV_SIMD256 + OPENCV_HAL_WRAP_BROADCAST(v_uint32x8) + OPENCV_HAL_WRAP_BROADCAST(v_int32x8) + OPENCV_HAL_WRAP_BROADCAST(v_float32x8) + #endif + +#endif //!CV_SIMD_SCALABLE + +#if (CV_NEON /* || CV_others */) && !defined(CV_FORCE_SIMD128_CPP) +// Compatibility layer for the backend that cleaned up. + #define OPENCV_HAL_WRAP_BIN_OP_ADDSUB(_Tpvec) \ + template \ + inline _Tpvec v_add(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_add(v_add(f1, f2), vf...); \ + } + + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_uint64) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int8) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int16) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int32) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_int64) + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_ADDSUB(v_float64) + #endif + + #define OPENCV_HAL_WRAP_BIN_OP_MUL(_Tpvec) \ + template \ + inline _Tpvec v_mul(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_mul(v_mul(f1, f2), vf...); \ + } + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int8) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_uint32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int16) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_int32) + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_BIN_OP_MUL(v_float64) + #endif + + #define OPENCV_HAL_WRAP_EXTRACT(_Tpvec) \ + inline typename VTraits<_Tpvec>::lane_type v_extract_highest(const _Tpvec& v) \ + { \ + return v_extract_n::nlanes-1>(v); \ + } + + OPENCV_HAL_WRAP_EXTRACT(v_uint8) + OPENCV_HAL_WRAP_EXTRACT(v_int8) + OPENCV_HAL_WRAP_EXTRACT(v_uint16) + OPENCV_HAL_WRAP_EXTRACT(v_int16) + OPENCV_HAL_WRAP_EXTRACT(v_uint32) + OPENCV_HAL_WRAP_EXTRACT(v_int32) + OPENCV_HAL_WRAP_EXTRACT(v_uint64) + OPENCV_HAL_WRAP_EXTRACT(v_int64) + OPENCV_HAL_WRAP_EXTRACT(v_float32) + #if CV_SIMD_64F + OPENCV_HAL_WRAP_EXTRACT(v_float64) + #endif + + #define OPENCV_HAL_WRAP_BROADCAST(_Tpvec) \ + inline _Tpvec v_broadcast_highest(const _Tpvec& v) \ + { \ + return v_broadcast_element::nlanes-1>(v); \ + } + + OPENCV_HAL_WRAP_BROADCAST(v_uint32) + OPENCV_HAL_WRAP_BROADCAST(v_int32) + OPENCV_HAL_WRAP_BROADCAST(v_float32) + +#endif //CV_NEON + +//! @cond IGNORED + + // backward compatibility + template static inline + void vx_store(_Tp* dst, const _Tvec& v) { return v_store(dst, v); } + // backward compatibility + template static inline + void vx_store_aligned(_Tp* dst, const _Tvec& v) { return v_store_aligned(dst, v); } + +//! @endcond + + +//! @} + #undef VXPREFIX +} // namespace + + +#ifndef CV_SIMD_FP16 +#define CV_SIMD_FP16 0 //!< Defined to 1 on native support of operations with float16x8_t / float16x16_t (SIMD256) types +#endif + +#ifndef CV_SIMD +#define CV_SIMD 0 +#endif + +#include "simd_utils.impl.hpp" + +#ifndef CV_DOXYGEN +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END +#endif + +} // cv:: + +//! @endcond + +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic pop +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx.hpp new file mode 100644 index 0000000..979b616 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx.hpp @@ -0,0 +1,3177 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_INTRIN_AVX_HPP +#define OPENCV_HAL_INTRIN_AVX_HPP + +#define CV_SIMD256 1 +#define CV_SIMD256_64F 1 +#define CV_SIMD256_FP16 0 // no native operations with FP16 type. Only load/store from float32x8 are available (if CV_FP16 == 1) + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +///////// Utils //////////// + +inline __m256i _v256_combine(const __m128i& lo, const __m128i& hi) +{ return _mm256_inserti128_si256(_mm256_castsi128_si256(lo), hi, 1); } + +inline __m256 _v256_combine(const __m128& lo, const __m128& hi) +{ return _mm256_insertf128_ps(_mm256_castps128_ps256(lo), hi, 1); } + +inline __m256d _v256_combine(const __m128d& lo, const __m128d& hi) +{ return _mm256_insertf128_pd(_mm256_castpd128_pd256(lo), hi, 1); } + +inline int _v_cvtsi256_si32(const __m256i& a) +{ return _mm_cvtsi128_si32(_mm256_castsi256_si128(a)); } + +inline __m256i _v256_shuffle_odd_64(const __m256i& v) +{ return _mm256_permute4x64_epi64(v, _MM_SHUFFLE(3, 1, 2, 0)); } + +inline __m256d _v256_shuffle_odd_64(const __m256d& v) +{ return _mm256_permute4x64_pd(v, _MM_SHUFFLE(3, 1, 2, 0)); } + +template +inline __m256i _v256_permute2x128(const __m256i& a, const __m256i& b) +{ return _mm256_permute2x128_si256(a, b, imm); } + +template +inline __m256 _v256_permute2x128(const __m256& a, const __m256& b) +{ return _mm256_permute2f128_ps(a, b, imm); } + +template +inline __m256d _v256_permute2x128(const __m256d& a, const __m256d& b) +{ return _mm256_permute2f128_pd(a, b, imm); } + +template +inline _Tpvec v256_permute2x128(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(_v256_permute2x128(a.val, b.val)); } + +template +inline __m256i _v256_permute4x64(const __m256i& a) +{ return _mm256_permute4x64_epi64(a, imm); } + +template +inline __m256d _v256_permute4x64(const __m256d& a) +{ return _mm256_permute4x64_pd(a, imm); } + +template +inline _Tpvec v256_permute4x64(const _Tpvec& a) +{ return _Tpvec(_v256_permute4x64(a.val)); } + +inline __m128i _v256_extract_high(const __m256i& v) +{ return _mm256_extracti128_si256(v, 1); } + +inline __m128 _v256_extract_high(const __m256& v) +{ return _mm256_extractf128_ps(v, 1); } + +inline __m128d _v256_extract_high(const __m256d& v) +{ return _mm256_extractf128_pd(v, 1); } + +inline __m128i _v256_extract_low(const __m256i& v) +{ return _mm256_castsi256_si128(v); } + +inline __m128 _v256_extract_low(const __m256& v) +{ return _mm256_castps256_ps128(v); } + +inline __m128d _v256_extract_low(const __m256d& v) +{ return _mm256_castpd256_pd128(v); } + +inline __m256i _v256_packs_epu32(const __m256i& a, const __m256i& b) +{ + const __m256i m = _mm256_set1_epi32(65535); + __m256i am = _mm256_min_epu32(a, m); + __m256i bm = _mm256_min_epu32(b, m); + return _mm256_packus_epi32(am, bm); +} + +template +inline int _v256_extract_epi8(const __m256i& a) +{ +#if defined(CV__SIMD_HAVE_mm256_extract_epi8) || (CV_AVX2 && (!defined(_MSC_VER) || _MSC_VER >= 1910/*MSVS 2017*/)) + return _mm256_extract_epi8(a, i); +#else + __m128i b = _mm256_extractf128_si256(a, ((i) >> 4)); + return _mm_extract_epi8(b, i & 15); // SSE4.1 +#endif +} + +template +inline int _v256_extract_epi16(const __m256i& a) +{ +#if defined(CV__SIMD_HAVE_mm256_extract_epi8) || (CV_AVX2 && (!defined(_MSC_VER) || _MSC_VER >= 1910/*MSVS 2017*/)) + return _mm256_extract_epi16(a, i); +#else + __m128i b = _mm256_extractf128_si256(a, ((i) >> 3)); + return _mm_extract_epi16(b, i & 7); // SSE2 +#endif +} + +template +inline int _v256_extract_epi32(const __m256i& a) +{ +#if defined(CV__SIMD_HAVE_mm256_extract_epi8) || (CV_AVX2 && (!defined(_MSC_VER) || _MSC_VER >= 1910/*MSVS 2017*/)) + return _mm256_extract_epi32(a, i); +#else + __m128i b = _mm256_extractf128_si256(a, ((i) >> 2)); + return _mm_extract_epi32(b, i & 3); // SSE4.1 +#endif +} + +template +inline int64 _v256_extract_epi64(const __m256i& a) +{ +#if defined(CV__SIMD_HAVE_mm256_extract_epi8) || (CV_AVX2 && (!defined(_MSC_VER) || _MSC_VER >= 1910/*MSVS 2017*/)) + return _mm256_extract_epi64(a, i); +#else + __m128i b = _mm256_extractf128_si256(a, ((i) >> 1)); + return _mm_extract_epi64(b, i & 1); // SSE4.1 +#endif +} + +///////// Types //////////// + +struct v_uint8x32 +{ + typedef uchar lane_type; + enum { nlanes = 32 }; + __m256i val; + + explicit v_uint8x32(__m256i v) : val(v) {} + v_uint8x32(uchar v0, uchar v1, uchar v2, uchar v3, + uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, + uchar v12, uchar v13, uchar v14, uchar v15, + uchar v16, uchar v17, uchar v18, uchar v19, + uchar v20, uchar v21, uchar v22, uchar v23, + uchar v24, uchar v25, uchar v26, uchar v27, + uchar v28, uchar v29, uchar v30, uchar v31) + { + val = _mm256_setr_epi8((char)v0, (char)v1, (char)v2, (char)v3, + (char)v4, (char)v5, (char)v6 , (char)v7, (char)v8, (char)v9, + (char)v10, (char)v11, (char)v12, (char)v13, (char)v14, (char)v15, + (char)v16, (char)v17, (char)v18, (char)v19, (char)v20, (char)v21, + (char)v22, (char)v23, (char)v24, (char)v25, (char)v26, (char)v27, + (char)v28, (char)v29, (char)v30, (char)v31); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint8x32() {} + + uchar get0() const { return (uchar)_v_cvtsi256_si32(val); } +}; + +struct v_int8x32 +{ + typedef schar lane_type; + enum { nlanes = 32 }; + __m256i val; + + explicit v_int8x32(__m256i v) : val(v) {} + v_int8x32(schar v0, schar v1, schar v2, schar v3, + schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, + schar v12, schar v13, schar v14, schar v15, + schar v16, schar v17, schar v18, schar v19, + schar v20, schar v21, schar v22, schar v23, + schar v24, schar v25, schar v26, schar v27, + schar v28, schar v29, schar v30, schar v31) + { + val = _mm256_setr_epi8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, + v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int8x32() {} + + schar get0() const { return (schar)_v_cvtsi256_si32(val); } +}; + +struct v_uint16x16 +{ + typedef ushort lane_type; + enum { nlanes = 16 }; + __m256i val; + + explicit v_uint16x16(__m256i v) : val(v) {} + v_uint16x16(ushort v0, ushort v1, ushort v2, ushort v3, + ushort v4, ushort v5, ushort v6, ushort v7, + ushort v8, ushort v9, ushort v10, ushort v11, + ushort v12, ushort v13, ushort v14, ushort v15) + { + val = _mm256_setr_epi16((short)v0, (short)v1, (short)v2, (short)v3, + (short)v4, (short)v5, (short)v6, (short)v7, (short)v8, (short)v9, + (short)v10, (short)v11, (short)v12, (short)v13, (short)v14, (short)v15); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint16x16() {} + + ushort get0() const { return (ushort)_v_cvtsi256_si32(val); } +}; + +struct v_int16x16 +{ + typedef short lane_type; + enum { nlanes = 16 }; + __m256i val; + + explicit v_int16x16(__m256i v) : val(v) {} + v_int16x16(short v0, short v1, short v2, short v3, + short v4, short v5, short v6, short v7, + short v8, short v9, short v10, short v11, + short v12, short v13, short v14, short v15) + { + val = _mm256_setr_epi16(v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int16x16() {} + + short get0() const { return (short)_v_cvtsi256_si32(val); } +}; + +struct v_uint32x8 +{ + typedef unsigned lane_type; + enum { nlanes = 8 }; + __m256i val; + + explicit v_uint32x8(__m256i v) : val(v) {} + v_uint32x8(unsigned v0, unsigned v1, unsigned v2, unsigned v3, + unsigned v4, unsigned v5, unsigned v6, unsigned v7) + { + val = _mm256_setr_epi32((unsigned)v0, (unsigned)v1, (unsigned)v2, + (unsigned)v3, (unsigned)v4, (unsigned)v5, (unsigned)v6, (unsigned)v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint32x8() {} + + unsigned get0() const { return (unsigned)_v_cvtsi256_si32(val); } +}; + +struct v_int32x8 +{ + typedef int lane_type; + enum { nlanes = 8 }; + __m256i val; + + explicit v_int32x8(__m256i v) : val(v) {} + v_int32x8(int v0, int v1, int v2, int v3, + int v4, int v5, int v6, int v7) + { + val = _mm256_setr_epi32(v0, v1, v2, v3, v4, v5, v6, v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int32x8() {} + + int get0() const { return _v_cvtsi256_si32(val); } +}; + +struct v_float32x8 +{ + typedef float lane_type; + enum { nlanes = 8 }; + __m256 val; + + explicit v_float32x8(__m256 v) : val(v) {} + v_float32x8(float v0, float v1, float v2, float v3, + float v4, float v5, float v6, float v7) + { + val = _mm256_setr_ps(v0, v1, v2, v3, v4, v5, v6, v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_float32x8() {} + + float get0() const { return _mm_cvtss_f32(_mm256_castps256_ps128(val)); } +}; + +struct v_uint64x4 +{ + typedef uint64 lane_type; + enum { nlanes = 4 }; + __m256i val; + + explicit v_uint64x4(__m256i v) : val(v) {} + v_uint64x4(uint64 v0, uint64 v1, uint64 v2, uint64 v3) + { val = _mm256_setr_epi64x((int64)v0, (int64)v1, (int64)v2, (int64)v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_uint64x4() {} + + uint64 get0() const + { + #if defined __x86_64__ || defined _M_X64 + return (uint64)_mm_cvtsi128_si64(_mm256_castsi256_si128(val)); + #else + int a = _mm_cvtsi128_si32(_mm256_castsi256_si128(val)); + int b = _mm_cvtsi128_si32(_mm256_castsi256_si128(_mm256_srli_epi64(val, 32))); + return (unsigned)a | ((uint64)(unsigned)b << 32); + #endif + } +}; + +struct v_int64x4 +{ + typedef int64 lane_type; + enum { nlanes = 4 }; + __m256i val; + + explicit v_int64x4(__m256i v) : val(v) {} + v_int64x4(int64 v0, int64 v1, int64 v2, int64 v3) + { val = _mm256_setr_epi64x(v0, v1, v2, v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_int64x4() {} + + int64 get0() const + { + #if defined __x86_64__ || defined _M_X64 + return (int64)_mm_cvtsi128_si64(_mm256_castsi256_si128(val)); + #else + int a = _mm_cvtsi128_si32(_mm256_castsi256_si128(val)); + int b = _mm_cvtsi128_si32(_mm256_castsi256_si128(_mm256_srli_epi64(val, 32))); + return (int64)((unsigned)a | ((uint64)(unsigned)b << 32)); + #endif + } +}; + +struct v_float64x4 +{ + typedef double lane_type; + enum { nlanes = 4 }; + __m256d val; + + explicit v_float64x4(__m256d v) : val(v) {} + v_float64x4(double v0, double v1, double v2, double v3) + { val = _mm256_setr_pd(v0, v1, v2, v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_float64x4() {} + + double get0() const { return _mm_cvtsd_f64(_mm256_castpd256_pd128(val)); } +}; + +//////////////// Load and store operations /////////////// + +#define OPENCV_HAL_IMPL_AVX_LOADSTORE(_Tpvec, _Tp) \ + inline _Tpvec v256_load(const _Tp* ptr) \ + { return _Tpvec(_mm256_loadu_si256((const __m256i*)ptr)); } \ + inline _Tpvec v256_load_aligned(const _Tp* ptr) \ + { return _Tpvec(_mm256_load_si256((const __m256i*)ptr)); } \ + inline _Tpvec v256_load_low(const _Tp* ptr) \ + { \ + __m128i v128 = _mm_loadu_si128((const __m128i*)ptr); \ + return _Tpvec(_mm256_castsi128_si256(v128)); \ + } \ + inline _Tpvec v256_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + __m128i vlo = _mm_loadu_si128((const __m128i*)ptr0); \ + __m128i vhi = _mm_loadu_si128((const __m128i*)ptr1); \ + return _Tpvec(_v256_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_si256((__m256i*)ptr, a.val); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { _mm256_store_si256((__m256i*)ptr, a.val); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { _mm256_stream_si256((__m256i*)ptr, a.val); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm256_storeu_si256((__m256i*)ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm256_stream_si256((__m256i*)ptr, a.val); \ + else \ + _mm256_store_si256((__m256i*)ptr, a.val); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { _mm_storeu_si128((__m128i*)ptr, _v256_extract_low(a.val)); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { _mm_storeu_si128((__m128i*)ptr, _v256_extract_high(a.val)); } + +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_uint8x32, uchar) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_int8x32, schar) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_uint16x16, ushort) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_int16x16, short) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_uint32x8, unsigned) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_int32x8, int) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_uint64x4, uint64) +OPENCV_HAL_IMPL_AVX_LOADSTORE(v_int64x4, int64) + +#define OPENCV_HAL_IMPL_AVX_LOADSTORE_FLT(_Tpvec, _Tp, suffix, halfreg) \ + inline _Tpvec v256_load(const _Tp* ptr) \ + { return _Tpvec(_mm256_loadu_##suffix(ptr)); } \ + inline _Tpvec v256_load_aligned(const _Tp* ptr) \ + { return _Tpvec(_mm256_load_##suffix(ptr)); } \ + inline _Tpvec v256_load_low(const _Tp* ptr) \ + { \ + return _Tpvec(_mm256_cast##suffix##128_##suffix##256 \ + (_mm_loadu_##suffix(ptr))); \ + } \ + inline _Tpvec v256_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + halfreg vlo = _mm_loadu_##suffix(ptr0); \ + halfreg vhi = _mm_loadu_##suffix(ptr1); \ + return _Tpvec(_v256_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_##suffix(ptr, a.val); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { _mm256_store_##suffix(ptr, a.val); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { _mm256_stream_##suffix(ptr, a.val); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm256_storeu_##suffix(ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm256_stream_##suffix(ptr, a.val); \ + else \ + _mm256_store_##suffix(ptr, a.val); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { _mm_storeu_##suffix(ptr, _v256_extract_low(a.val)); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { _mm_storeu_##suffix(ptr, _v256_extract_high(a.val)); } + +OPENCV_HAL_IMPL_AVX_LOADSTORE_FLT(v_float32x8, float, ps, __m128) +OPENCV_HAL_IMPL_AVX_LOADSTORE_FLT(v_float64x4, double, pd, __m128d) + +#define OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, _Tpvecf, suffix, cast) \ + inline _Tpvec v_reinterpret_as_##suffix(const _Tpvecf& a) \ + { return _Tpvec(cast(a.val)); } + +#define OPENCV_HAL_IMPL_AVX_INIT(_Tpvec, _Tp, suffix, ssuffix, ctype_s) \ + inline _Tpvec v256_setzero_##suffix() \ + { return _Tpvec(_mm256_setzero_si256()); } \ + inline _Tpvec v256_setall_##suffix(_Tp v) \ + { return _Tpvec(_mm256_set1_##ssuffix((ctype_s)v)); } \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint8x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int8x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint16x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int16x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint32x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int32x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint64x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int64x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_float32x8, suffix, _mm256_castps_si256) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_float64x4, suffix, _mm256_castpd_si256) + +OPENCV_HAL_IMPL_AVX_INIT(v_uint8x32, uchar, u8, epi8, char) +OPENCV_HAL_IMPL_AVX_INIT(v_int8x32, schar, s8, epi8, char) +OPENCV_HAL_IMPL_AVX_INIT(v_uint16x16, ushort, u16, epi16, short) +OPENCV_HAL_IMPL_AVX_INIT(v_int16x16, short, s16, epi16, short) +OPENCV_HAL_IMPL_AVX_INIT(v_uint32x8, unsigned, u32, epi32, int) +OPENCV_HAL_IMPL_AVX_INIT(v_int32x8, int, s32, epi32, int) +OPENCV_HAL_IMPL_AVX_INIT(v_uint64x4, uint64, u64, epi64x, int64) +OPENCV_HAL_IMPL_AVX_INIT(v_int64x4, int64, s64, epi64x, int64) + +#define OPENCV_HAL_IMPL_AVX_INIT_FLT(_Tpvec, _Tp, suffix, zsuffix, cast) \ + inline _Tpvec v256_setzero_##suffix() \ + { return _Tpvec(_mm256_setzero_##zsuffix()); } \ + inline _Tpvec v256_setall_##suffix(_Tp v) \ + { return _Tpvec(_mm256_set1_##zsuffix(v)); } \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint8x32, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int8x32, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint16x16, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int16x16, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint32x8, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int32x8, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_uint64x4, suffix, cast) \ + OPENCV_HAL_IMPL_AVX_CAST(_Tpvec, v_int64x4, suffix, cast) + +OPENCV_HAL_IMPL_AVX_INIT_FLT(v_float32x8, float, f32, ps, _mm256_castsi256_ps) +OPENCV_HAL_IMPL_AVX_INIT_FLT(v_float64x4, double, f64, pd, _mm256_castsi256_pd) + +inline v_float32x8 v_reinterpret_as_f32(const v_float32x8& a) +{ return a; } +inline v_float32x8 v_reinterpret_as_f32(const v_float64x4& a) +{ return v_float32x8(_mm256_castpd_ps(a.val)); } + +inline v_float64x4 v_reinterpret_as_f64(const v_float64x4& a) +{ return a; } +inline v_float64x4 v_reinterpret_as_f64(const v_float32x8& a) +{ return v_float64x4(_mm256_castps_pd(a.val)); } + +/* Recombine */ +/*#define OPENCV_HAL_IMPL_AVX_COMBINE(_Tpvec, perm) \ + inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(perm(a.val, b.val, 0x20)); } \ + inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(perm(a.val, b.val, 0x31)); } \ + inline void v_recombine(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ + { c = v_combine_low(a, b); d = v_combine_high(a, b); } + +#define OPENCV_HAL_IMPL_AVX_UNPACKS(_Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_COMBINE(_Tpvec, _mm256_permute2x128_si256) \ + inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, \ + _Tpvec& b0, _Tpvec& b1) \ + { \ + __m256i v0 = _v256_shuffle_odd_64(a0.val); \ + __m256i v1 = _v256_shuffle_odd_64(a1.val); \ + b0.val = _mm256_unpacklo_##suffix(v0, v1); \ + b1.val = _mm256_unpackhi_##suffix(v0, v1); \ + } + +OPENCV_HAL_IMPL_AVX_UNPACKS(v_uint8x32, epi8) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_int8x32, epi8) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_uint16x16, epi16) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_int16x16, epi16) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_uint32x8, epi32) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_int32x8, epi32) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_uint64x4, epi64) +OPENCV_HAL_IMPL_AVX_UNPACKS(v_int64x4, epi64) +OPENCV_HAL_IMPL_AVX_COMBINE(v_float32x8, _mm256_permute2f128_ps) +OPENCV_HAL_IMPL_AVX_COMBINE(v_float64x4, _mm256_permute2f128_pd) + +inline void v_zip(const v_float32x8& a0, const v_float32x8& a1, v_float32x8& b0, v_float32x8& b1) +{ + __m256 v0 = _mm256_unpacklo_ps(a0.val, a1.val); + __m256 v1 = _mm256_unpackhi_ps(a0.val, a1.val); + v_recombine(v_float32x8(v0), v_float32x8(v1), b0, b1); +} + +inline void v_zip(const v_float64x4& a0, const v_float64x4& a1, v_float64x4& b0, v_float64x4& b1) +{ + __m256d v0 = _v_shuffle_odd_64(a0.val); + __m256d v1 = _v_shuffle_odd_64(a1.val); + b0.val = _mm256_unpacklo_pd(v0, v1); + b1.val = _mm256_unpackhi_pd(v0, v1); +}*/ + +//////////////// Variant Value reordering /////////////// + +// unpacks +#define OPENCV_HAL_IMPL_AVX_UNPACK(_Tpvec, suffix) \ + inline _Tpvec v256_unpacklo(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_unpacklo_##suffix(a.val, b.val)); } \ + inline _Tpvec v256_unpackhi(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_unpackhi_##suffix(a.val, b.val)); } + +OPENCV_HAL_IMPL_AVX_UNPACK(v_uint8x32, epi8) +OPENCV_HAL_IMPL_AVX_UNPACK(v_int8x32, epi8) +OPENCV_HAL_IMPL_AVX_UNPACK(v_uint16x16, epi16) +OPENCV_HAL_IMPL_AVX_UNPACK(v_int16x16, epi16) +OPENCV_HAL_IMPL_AVX_UNPACK(v_uint32x8, epi32) +OPENCV_HAL_IMPL_AVX_UNPACK(v_int32x8, epi32) +OPENCV_HAL_IMPL_AVX_UNPACK(v_uint64x4, epi64) +OPENCV_HAL_IMPL_AVX_UNPACK(v_int64x4, epi64) +OPENCV_HAL_IMPL_AVX_UNPACK(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_UNPACK(v_float64x4, pd) + +// blend +#define OPENCV_HAL_IMPL_AVX_BLEND(_Tpvec, suffix) \ + template \ + inline _Tpvec v256_blend(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_blend_##suffix(a.val, b.val, m)); } + +OPENCV_HAL_IMPL_AVX_BLEND(v_uint16x16, epi16) +OPENCV_HAL_IMPL_AVX_BLEND(v_int16x16, epi16) +OPENCV_HAL_IMPL_AVX_BLEND(v_uint32x8, epi32) +OPENCV_HAL_IMPL_AVX_BLEND(v_int32x8, epi32) +OPENCV_HAL_IMPL_AVX_BLEND(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_BLEND(v_float64x4, pd) + +template +inline v_uint64x4 v256_blend(const v_uint64x4& a, const v_uint64x4& b) +{ + enum {M0 = m}; + enum {M1 = (M0 | (M0 << 2)) & 0x33}; + enum {M2 = (M1 | (M1 << 1)) & 0x55}; + enum {MM = M2 | (M2 << 1)}; + return v_uint64x4(_mm256_blend_epi32(a.val, b.val, MM)); +} +template +inline v_int64x4 v256_blend(const v_int64x4& a, const v_int64x4& b) +{ return v_int64x4(v256_blend(v_uint64x4(a.val), v_uint64x4(b.val)).val); } + +// shuffle +// todo: emulate 64bit +#define OPENCV_HAL_IMPL_AVX_SHUFFLE(_Tpvec, intrin) \ + template \ + inline _Tpvec v256_shuffle(const _Tpvec& a) \ + { return _Tpvec(_mm256_##intrin(a.val, m)); } + +OPENCV_HAL_IMPL_AVX_SHUFFLE(v_uint32x8, shuffle_epi32) +OPENCV_HAL_IMPL_AVX_SHUFFLE(v_int32x8, shuffle_epi32) +OPENCV_HAL_IMPL_AVX_SHUFFLE(v_float32x8, permute_ps) +OPENCV_HAL_IMPL_AVX_SHUFFLE(v_float64x4, permute_pd) + +template +inline void v256_zip(const _Tpvec& a, const _Tpvec& b, _Tpvec& ab0, _Tpvec& ab1) +{ + ab0 = v256_unpacklo(a, b); + ab1 = v256_unpackhi(a, b); +} + +template +inline _Tpvec v256_combine_diagonal(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(_mm256_blend_epi32(a.val, b.val, 0xf0)); } + +inline v_float32x8 v256_combine_diagonal(const v_float32x8& a, const v_float32x8& b) +{ return v256_blend<0xf0>(a, b); } + +inline v_float64x4 v256_combine_diagonal(const v_float64x4& a, const v_float64x4& b) +{ return v256_blend<0xc>(a, b); } + +template +inline _Tpvec v256_alignr_128(const _Tpvec& a, const _Tpvec& b) +{ return v256_permute2x128<0x21>(a, b); } + +template +inline _Tpvec v256_alignr_64(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(_mm256_alignr_epi8(a.val, b.val, 8)); } +inline v_float64x4 v256_alignr_64(const v_float64x4& a, const v_float64x4& b) +{ return v_float64x4(_mm256_shuffle_pd(b.val, a.val, _MM_SHUFFLE(0, 0, 1, 1))); } +// todo: emulate float32 + +template +inline _Tpvec v256_swap_halves(const _Tpvec& a) +{ return v256_permute2x128<1>(a, a); } + +template +inline _Tpvec v256_reverse_64(const _Tpvec& a) +{ return v256_permute4x64<_MM_SHUFFLE(0, 1, 2, 3)>(a); } + +// ZIP +#define OPENCV_HAL_IMPL_AVX_ZIP(_Tpvec) \ + inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ + { return v256_permute2x128<0x20>(a, b); } \ + inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ + { return v256_permute2x128<0x31>(a, b); } \ + inline void v_recombine(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ + { \ + _Tpvec a1b0 = v256_alignr_128(a, b); \ + c = v256_combine_diagonal(a, a1b0); \ + d = v256_combine_diagonal(a1b0, b); \ + } \ + inline void v_zip(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& ab0, _Tpvec& ab1) \ + { \ + _Tpvec ab0ab2, ab1ab3; \ + v256_zip(a, b, ab0ab2, ab1ab3); \ + v_recombine(ab0ab2, ab1ab3, ab0, ab1); \ + } + +OPENCV_HAL_IMPL_AVX_ZIP(v_uint8x32) +OPENCV_HAL_IMPL_AVX_ZIP(v_int8x32) +OPENCV_HAL_IMPL_AVX_ZIP(v_uint16x16) +OPENCV_HAL_IMPL_AVX_ZIP(v_int16x16) +OPENCV_HAL_IMPL_AVX_ZIP(v_uint32x8) +OPENCV_HAL_IMPL_AVX_ZIP(v_int32x8) +OPENCV_HAL_IMPL_AVX_ZIP(v_uint64x4) +OPENCV_HAL_IMPL_AVX_ZIP(v_int64x4) +OPENCV_HAL_IMPL_AVX_ZIP(v_float32x8) +OPENCV_HAL_IMPL_AVX_ZIP(v_float64x4) + +////////// Arithmetic, bitwise and comparison operations ///////// + +/* Element-wise binary and unary operations */ + +/** Arithmetics **/ +#define OPENCV_HAL_IMPL_AVX_BIN_OP(bin_op, _Tpvec, intrin) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { a.val = intrin(a.val, b.val); return a; } + +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_uint8x32, _mm256_adds_epu8) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_uint8x32, _mm256_subs_epu8) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_int8x32, _mm256_adds_epi8) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_int8x32, _mm256_subs_epi8) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_uint16x16, _mm256_adds_epu16) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_uint16x16, _mm256_subs_epu16) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_int16x16, _mm256_adds_epi16) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_int16x16, _mm256_subs_epi16) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_uint32x8, _mm256_add_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_uint32x8, _mm256_sub_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(*, v_uint32x8, _mm256_mullo_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_int32x8, _mm256_add_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_int32x8, _mm256_sub_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(*, v_int32x8, _mm256_mullo_epi32) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_uint64x4, _mm256_add_epi64) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_uint64x4, _mm256_sub_epi64) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_int64x4, _mm256_add_epi64) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_int64x4, _mm256_sub_epi64) + +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_float32x8, _mm256_add_ps) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_float32x8, _mm256_sub_ps) +OPENCV_HAL_IMPL_AVX_BIN_OP(*, v_float32x8, _mm256_mul_ps) +OPENCV_HAL_IMPL_AVX_BIN_OP(/, v_float32x8, _mm256_div_ps) +OPENCV_HAL_IMPL_AVX_BIN_OP(+, v_float64x4, _mm256_add_pd) +OPENCV_HAL_IMPL_AVX_BIN_OP(-, v_float64x4, _mm256_sub_pd) +OPENCV_HAL_IMPL_AVX_BIN_OP(*, v_float64x4, _mm256_mul_pd) +OPENCV_HAL_IMPL_AVX_BIN_OP(/, v_float64x4, _mm256_div_pd) + +// saturating multiply 8-bit, 16-bit +inline v_uint8x32 operator * (const v_uint8x32& a, const v_uint8x32& b) +{ + v_uint16x16 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_int8x32 operator * (const v_int8x32& a, const v_int8x32& b) +{ + v_int16x16 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_uint16x16 operator * (const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i pl = _mm256_mullo_epi16(a.val, b.val); + __m256i ph = _mm256_mulhi_epu16(a.val, b.val); + __m256i p0 = _mm256_unpacklo_epi16(pl, ph); + __m256i p1 = _mm256_unpackhi_epi16(pl, ph); + return v_uint16x16(_v256_packs_epu32(p0, p1)); +} +inline v_int16x16 operator * (const v_int16x16& a, const v_int16x16& b) +{ + __m256i pl = _mm256_mullo_epi16(a.val, b.val); + __m256i ph = _mm256_mulhi_epi16(a.val, b.val); + __m256i p0 = _mm256_unpacklo_epi16(pl, ph); + __m256i p1 = _mm256_unpackhi_epi16(pl, ph); + return v_int16x16(_mm256_packs_epi32(p0, p1)); +} +inline v_uint8x32& operator *= (v_uint8x32& a, const v_uint8x32& b) +{ a = a * b; return a; } +inline v_int8x32& operator *= (v_int8x32& a, const v_int8x32& b) +{ a = a * b; return a; } +inline v_uint16x16& operator *= (v_uint16x16& a, const v_uint16x16& b) +{ a = a * b; return a; } +inline v_int16x16& operator *= (v_int16x16& a, const v_int16x16& b) +{ a = a * b; return a; } + +/** Non-saturating arithmetics **/ +#define OPENCV_HAL_IMPL_AVX_BIN_FUNC(func, _Tpvec, intrin) \ + inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } + +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_add_wrap, v_uint8x32, _mm256_add_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_add_wrap, v_int8x32, _mm256_add_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_add_wrap, v_uint16x16, _mm256_add_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_add_wrap, v_int16x16, _mm256_add_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_sub_wrap, v_uint8x32, _mm256_sub_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_sub_wrap, v_int8x32, _mm256_sub_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_sub_wrap, v_uint16x16, _mm256_sub_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_sub_wrap, v_int16x16, _mm256_sub_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_mul_wrap, v_uint16x16, _mm256_mullo_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_mul_wrap, v_int16x16, _mm256_mullo_epi16) + +inline v_uint8x32 v_mul_wrap(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i ad = _mm256_srai_epi16(a.val, 8); + __m256i bd = _mm256_srai_epi16(b.val, 8); + __m256i p0 = _mm256_mullo_epi16(a.val, b.val); // even + __m256i p1 = _mm256_slli_epi16(_mm256_mullo_epi16(ad, bd), 8); // odd + + const __m256i b01 = _mm256_set1_epi32(0xFF00FF00); + return v_uint8x32(_mm256_blendv_epi8(p0, p1, b01)); +} +inline v_int8x32 v_mul_wrap(const v_int8x32& a, const v_int8x32& b) +{ + return v_reinterpret_as_s8(v_mul_wrap(v_reinterpret_as_u8(a), v_reinterpret_as_u8(b))); +} + +// Multiply and expand +inline void v_mul_expand(const v_uint8x32& a, const v_uint8x32& b, + v_uint16x16& c, v_uint16x16& d) +{ + v_uint16x16 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int8x32& a, const v_int8x32& b, + v_int16x16& c, v_int16x16& d) +{ + v_int16x16 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int16x16& a, const v_int16x16& b, + v_int32x8& c, v_int32x8& d) +{ + v_int16x16 vhi = v_int16x16(_mm256_mulhi_epi16(a.val, b.val)); + + v_int16x16 v0, v1; + v_zip(v_mul_wrap(a, b), vhi, v0, v1); + + c = v_reinterpret_as_s32(v0); + d = v_reinterpret_as_s32(v1); +} + +inline void v_mul_expand(const v_uint16x16& a, const v_uint16x16& b, + v_uint32x8& c, v_uint32x8& d) +{ + v_uint16x16 vhi = v_uint16x16(_mm256_mulhi_epu16(a.val, b.val)); + + v_uint16x16 v0, v1; + v_zip(v_mul_wrap(a, b), vhi, v0, v1); + + c = v_reinterpret_as_u32(v0); + d = v_reinterpret_as_u32(v1); +} + +inline void v_mul_expand(const v_uint32x8& a, const v_uint32x8& b, + v_uint64x4& c, v_uint64x4& d) +{ + __m256i v0 = _mm256_mul_epu32(a.val, b.val); + __m256i v1 = _mm256_mul_epu32(_mm256_srli_epi64(a.val, 32), _mm256_srli_epi64(b.val, 32)); + v_zip(v_uint64x4(v0), v_uint64x4(v1), c, d); +} + +inline v_int16x16 v_mul_hi(const v_int16x16& a, const v_int16x16& b) { return v_int16x16(_mm256_mulhi_epi16(a.val, b.val)); } +inline v_uint16x16 v_mul_hi(const v_uint16x16& a, const v_uint16x16& b) { return v_uint16x16(_mm256_mulhi_epu16(a.val, b.val)); } + +/** Bitwise shifts **/ +#define OPENCV_HAL_IMPL_AVX_SHIFT_OP(_Tpuvec, _Tpsvec, suffix, srai) \ + inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ + { return _Tpuvec(_mm256_slli_##suffix(a.val, imm)); } \ + inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ + { return _Tpsvec(_mm256_slli_##suffix(a.val, imm)); } \ + inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ + { return _Tpuvec(_mm256_srli_##suffix(a.val, imm)); } \ + inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ + { return _Tpsvec(srai(a.val, imm)); } \ + template \ + inline _Tpuvec v_shl(const _Tpuvec& a) \ + { return _Tpuvec(_mm256_slli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shl(const _Tpsvec& a) \ + { return _Tpsvec(_mm256_slli_##suffix(a.val, imm)); } \ + template \ + inline _Tpuvec v_shr(const _Tpuvec& a) \ + { return _Tpuvec(_mm256_srli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shr(const _Tpsvec& a) \ + { return _Tpsvec(srai(a.val, imm)); } + +OPENCV_HAL_IMPL_AVX_SHIFT_OP(v_uint16x16, v_int16x16, epi16, _mm256_srai_epi16) +OPENCV_HAL_IMPL_AVX_SHIFT_OP(v_uint32x8, v_int32x8, epi32, _mm256_srai_epi32) + +inline __m256i _mm256_srai_epi64xx(const __m256i a, int imm) +{ + __m256i d = _mm256_set1_epi64x((int64)1 << 63); + __m256i r = _mm256_srli_epi64(_mm256_add_epi64(a, d), imm); + return _mm256_sub_epi64(r, _mm256_srli_epi64(d, imm)); +} +OPENCV_HAL_IMPL_AVX_SHIFT_OP(v_uint64x4, v_int64x4, epi64, _mm256_srai_epi64xx) + + +/** Bitwise logic **/ +#define OPENCV_HAL_IMPL_AVX_LOGIC_OP(_Tpvec, suffix, not_const) \ + OPENCV_HAL_IMPL_AVX_BIN_OP(&, _Tpvec, _mm256_and_##suffix) \ + OPENCV_HAL_IMPL_AVX_BIN_OP(|, _Tpvec, _mm256_or_##suffix) \ + OPENCV_HAL_IMPL_AVX_BIN_OP(^, _Tpvec, _mm256_xor_##suffix) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { return _Tpvec(_mm256_xor_##suffix(a.val, not_const)); } + +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_uint8x32, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_int8x32, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_uint16x16, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_int16x16, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_uint32x8, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_int32x8, si256, _mm256_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_uint64x4, si256, _mm256_set1_epi64x(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_int64x4, si256, _mm256_set1_epi64x(-1)) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_float32x8, ps, _mm256_castsi256_ps(_mm256_set1_epi32(-1))) +OPENCV_HAL_IMPL_AVX_LOGIC_OP(v_float64x4, pd, _mm256_castsi256_pd(_mm256_set1_epi32(-1))) + +/** Select **/ +#define OPENCV_HAL_IMPL_AVX_SELECT(_Tpvec, suffix) \ + inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_blendv_##suffix(b.val, a.val, mask.val)); } + +OPENCV_HAL_IMPL_AVX_SELECT(v_uint8x32, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_int8x32, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_uint16x16, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_int16x16, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_uint32x8, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_int32x8, epi8) +OPENCV_HAL_IMPL_AVX_SELECT(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_SELECT(v_float64x4, pd) + +/** Comparison **/ +#define OPENCV_HAL_IMPL_AVX_CMP_OP_OV(_Tpvec) \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a == b); } \ + inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ + { return b > a; } \ + inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a < b); } \ + inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ + { return b >= a; } + +#define OPENCV_HAL_IMPL_AVX_CMP_OP_INT(_Tpuvec, _Tpsvec, suffix, sbit) \ + inline _Tpuvec operator == (const _Tpuvec& a, const _Tpuvec& b) \ + { return _Tpuvec(_mm256_cmpeq_##suffix(a.val, b.val)); } \ + inline _Tpuvec operator > (const _Tpuvec& a, const _Tpuvec& b) \ + { \ + __m256i smask = _mm256_set1_##suffix(sbit); \ + return _Tpuvec(_mm256_cmpgt_##suffix( \ + _mm256_xor_si256(a.val, smask), \ + _mm256_xor_si256(b.val, smask))); \ + } \ + inline _Tpsvec operator == (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(_mm256_cmpeq_##suffix(a.val, b.val)); } \ + inline _Tpsvec operator > (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(_mm256_cmpgt_##suffix(a.val, b.val)); } \ + OPENCV_HAL_IMPL_AVX_CMP_OP_OV(_Tpuvec) \ + OPENCV_HAL_IMPL_AVX_CMP_OP_OV(_Tpsvec) + +OPENCV_HAL_IMPL_AVX_CMP_OP_INT(v_uint8x32, v_int8x32, epi8, (char)-128) +OPENCV_HAL_IMPL_AVX_CMP_OP_INT(v_uint16x16, v_int16x16, epi16, (short)-32768) +OPENCV_HAL_IMPL_AVX_CMP_OP_INT(v_uint32x8, v_int32x8, epi32, (int)0x80000000) + +#define OPENCV_HAL_IMPL_AVX_CMP_OP_64BIT(_Tpvec) \ + inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_cmpeq_epi64(a.val, b.val)); } \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a == b); } + +OPENCV_HAL_IMPL_AVX_CMP_OP_64BIT(v_uint64x4) +OPENCV_HAL_IMPL_AVX_CMP_OP_64BIT(v_int64x4) + +#define OPENCV_HAL_IMPL_AVX_CMP_FLT(bin_op, imm8, _Tpvec, suffix) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm256_cmp_##suffix(a.val, b.val, imm8)); } + +#define OPENCV_HAL_IMPL_AVX_CMP_OP_FLT(_Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(==, _CMP_EQ_OQ, _Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(!=, _CMP_NEQ_OQ, _Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(<, _CMP_LT_OQ, _Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(>, _CMP_GT_OQ, _Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(<=, _CMP_LE_OQ, _Tpvec, suffix) \ + OPENCV_HAL_IMPL_AVX_CMP_FLT(>=, _CMP_GE_OQ, _Tpvec, suffix) + +OPENCV_HAL_IMPL_AVX_CMP_OP_FLT(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_CMP_OP_FLT(v_float64x4, pd) + +inline v_float32x8 v_not_nan(const v_float32x8& a) +{ return v_float32x8(_mm256_cmp_ps(a.val, a.val, _CMP_ORD_Q)); } +inline v_float64x4 v_not_nan(const v_float64x4& a) +{ return v_float64x4(_mm256_cmp_pd(a.val, a.val, _CMP_ORD_Q)); } + +/** min/max **/ +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_uint8x32, _mm256_min_epu8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_uint8x32, _mm256_max_epu8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_int8x32, _mm256_min_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_int8x32, _mm256_max_epi8) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_uint16x16, _mm256_min_epu16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_uint16x16, _mm256_max_epu16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_int16x16, _mm256_min_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_int16x16, _mm256_max_epi16) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_uint32x8, _mm256_min_epu32) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_uint32x8, _mm256_max_epu32) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_int32x8, _mm256_min_epi32) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_int32x8, _mm256_max_epi32) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_float32x8, _mm256_min_ps) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_float32x8, _mm256_max_ps) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_min, v_float64x4, _mm256_min_pd) +OPENCV_HAL_IMPL_AVX_BIN_FUNC(v_max, v_float64x4, _mm256_max_pd) + +/** Rotate **/ +template +inline v_uint8x32 v_rotate_left(const v_uint8x32& a, const v_uint8x32& b) +{ + enum {IMM_R = (16 - imm) & 0xFF}; + enum {IMM_R2 = (32 - imm) & 0xFF}; + + if (imm == 0) return a; + if (imm == 32) return b; + if (imm > 32) return v_uint8x32(); + + __m256i swap = _mm256_permute2x128_si256(a.val, b.val, 0x03); + if (imm == 16) return v_uint8x32(swap); + if (imm < 16) return v_uint8x32(_mm256_alignr_epi8(a.val, swap, IMM_R)); + return v_uint8x32(_mm256_alignr_epi8(swap, b.val, IMM_R2)); // imm < 32 +} + +template +inline v_uint8x32 v_rotate_right(const v_uint8x32& a, const v_uint8x32& b) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + + if (imm == 0) return a; + if (imm == 32) return b; + if (imm > 32) return v_uint8x32(); + + __m256i swap = _mm256_permute2x128_si256(a.val, b.val, 0x21); + if (imm == 16) return v_uint8x32(swap); + if (imm < 16) return v_uint8x32(_mm256_alignr_epi8(swap, a.val, imm)); + return v_uint8x32(_mm256_alignr_epi8(b.val, swap, IMM_L)); +} + +template +inline v_uint8x32 v_rotate_left(const v_uint8x32& a) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + enum {IMM_R = (16 - imm) & 0xFF}; + + if (imm == 0) return a; + if (imm > 32) return v_uint8x32(); + + // ESAC control[3] ? [127:0] = 0 + __m256i swapz = _mm256_permute2x128_si256(a.val, a.val, _MM_SHUFFLE(0, 0, 2, 0)); + if (imm == 16) return v_uint8x32(swapz); + if (imm < 16) return v_uint8x32(_mm256_alignr_epi8(a.val, swapz, IMM_R)); + return v_uint8x32(_mm256_slli_si256(swapz, IMM_L)); +} + +template +inline v_uint8x32 v_rotate_right(const v_uint8x32& a) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + + if (imm == 0) return a; + if (imm > 32) return v_uint8x32(); + + // ESAC control[3] ? [127:0] = 0 + __m256i swapz = _mm256_permute2x128_si256(a.val, a.val, _MM_SHUFFLE(2, 0, 0, 1)); + if (imm == 16) return v_uint8x32(swapz); + if (imm < 16) return v_uint8x32(_mm256_alignr_epi8(swapz, a.val, imm)); + return v_uint8x32(_mm256_srli_si256(swapz, IMM_L)); +} + +#define OPENCV_HAL_IMPL_AVX_ROTATE_CAST(intrin, _Tpvec, cast) \ + template \ + inline _Tpvec intrin(const _Tpvec& a, const _Tpvec& b) \ + { \ + enum {IMMxW = imm * sizeof(typename _Tpvec::lane_type)}; \ + v_uint8x32 ret = intrin(v_reinterpret_as_u8(a), \ + v_reinterpret_as_u8(b)); \ + return _Tpvec(cast(ret.val)); \ + } \ + template \ + inline _Tpvec intrin(const _Tpvec& a) \ + { \ + enum {IMMxW = imm * sizeof(typename _Tpvec::lane_type)}; \ + v_uint8x32 ret = intrin(v_reinterpret_as_u8(a)); \ + return _Tpvec(cast(ret.val)); \ + } + +#define OPENCV_HAL_IMPL_AVX_ROTATE(_Tpvec) \ + OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_left, _Tpvec, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_right, _Tpvec, OPENCV_HAL_NOP) + +OPENCV_HAL_IMPL_AVX_ROTATE(v_int8x32) +OPENCV_HAL_IMPL_AVX_ROTATE(v_uint16x16) +OPENCV_HAL_IMPL_AVX_ROTATE(v_int16x16) +OPENCV_HAL_IMPL_AVX_ROTATE(v_uint32x8) +OPENCV_HAL_IMPL_AVX_ROTATE(v_int32x8) +OPENCV_HAL_IMPL_AVX_ROTATE(v_uint64x4) +OPENCV_HAL_IMPL_AVX_ROTATE(v_int64x4) + +OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_left, v_float32x8, _mm256_castsi256_ps) +OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_right, v_float32x8, _mm256_castsi256_ps) +OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_left, v_float64x4, _mm256_castsi256_pd) +OPENCV_HAL_IMPL_AVX_ROTATE_CAST(v_rotate_right, v_float64x4, _mm256_castsi256_pd) + +/** Reverse **/ +inline v_uint8x32 v_reverse(const v_uint8x32 &a) +{ + static const __m256i perm = _mm256_setr_epi8( + 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + __m256i vec = _mm256_shuffle_epi8(a.val, perm); + return v_uint8x32(_mm256_permute2x128_si256(vec, vec, 1)); +} + +inline v_int8x32 v_reverse(const v_int8x32 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x16 v_reverse(const v_uint16x16 &a) +{ + static const __m256i perm = _mm256_setr_epi8( + 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, + 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); + __m256i vec = _mm256_shuffle_epi8(a.val, perm); + return v_uint16x16(_mm256_permute2x128_si256(vec, vec, 1)); +} + +inline v_int16x16 v_reverse(const v_int16x16 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x8 v_reverse(const v_uint32x8 &a) +{ + static const __m256i perm = _mm256_setr_epi32(7, 6, 5, 4, 3, 2, 1, 0); + return v_uint32x8(_mm256_permutevar8x32_epi32(a.val, perm)); +} + +inline v_int32x8 v_reverse(const v_int32x8 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x8 v_reverse(const v_float32x8 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x4 v_reverse(const v_uint64x4 &a) +{ + return v_uint64x4(_mm256_permute4x64_epi64(a.val, _MM_SHUFFLE(0, 1, 2, 3))); +} + +inline v_int64x4 v_reverse(const v_int64x4 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x4 v_reverse(const v_float64x4 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +////////// Reduce and mask ///////// + +/** Reduce **/ +inline unsigned v_reduce_sum(const v_uint8x32& a) +{ + __m256i half = _mm256_sad_epu8(a.val, _mm256_setzero_si256()); + __m128i quarter = _mm_add_epi32(_v256_extract_low(half), _v256_extract_high(half)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))); +} +inline int v_reduce_sum(const v_int8x32& a) +{ + __m256i half = _mm256_sad_epu8(_mm256_xor_si256(a.val, _mm256_set1_epi8((schar)-128)), _mm256_setzero_si256()); + __m128i quarter = _mm_add_epi32(_v256_extract_low(half), _v256_extract_high(half)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))) - 4096; +} +#define OPENCV_HAL_IMPL_AVX_REDUCE_32(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i val = intrin(_v256_extract_low(a.val), _v256_extract_high(a.val)); \ + val = intrin(val, _mm_srli_si128(val,8)); \ + val = intrin(val, _mm_srli_si128(val,4)); \ + val = intrin(val, _mm_srli_si128(val,2)); \ + val = intrin(val, _mm_srli_si128(val,1)); \ + return (sctype)_mm_cvtsi128_si32(val); \ + } + +OPENCV_HAL_IMPL_AVX_REDUCE_32(v_uint8x32, uchar, min, _mm_min_epu8) +OPENCV_HAL_IMPL_AVX_REDUCE_32(v_int8x32, schar, min, _mm_min_epi8) +OPENCV_HAL_IMPL_AVX_REDUCE_32(v_uint8x32, uchar, max, _mm_max_epu8) +OPENCV_HAL_IMPL_AVX_REDUCE_32(v_int8x32, schar, max, _mm_max_epi8) + +#define OPENCV_HAL_IMPL_AVX_REDUCE_16(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i v0 = _v256_extract_low(a.val); \ + __m128i v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, _mm_srli_si128(v0, 8)); \ + v0 = intrin(v0, _mm_srli_si128(v0, 4)); \ + v0 = intrin(v0, _mm_srli_si128(v0, 2)); \ + return (sctype) _mm_cvtsi128_si32(v0); \ + } + +OPENCV_HAL_IMPL_AVX_REDUCE_16(v_uint16x16, ushort, min, _mm_min_epu16) +OPENCV_HAL_IMPL_AVX_REDUCE_16(v_int16x16, short, min, _mm_min_epi16) +OPENCV_HAL_IMPL_AVX_REDUCE_16(v_uint16x16, ushort, max, _mm_max_epu16) +OPENCV_HAL_IMPL_AVX_REDUCE_16(v_int16x16, short, max, _mm_max_epi16) + +#define OPENCV_HAL_IMPL_AVX_REDUCE_8(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i v0 = _v256_extract_low(a.val); \ + __m128i v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, _mm_srli_si128(v0, 8)); \ + v0 = intrin(v0, _mm_srli_si128(v0, 4)); \ + return (sctype) _mm_cvtsi128_si32(v0); \ + } + +OPENCV_HAL_IMPL_AVX_REDUCE_8(v_uint32x8, unsigned, min, _mm_min_epu32) +OPENCV_HAL_IMPL_AVX_REDUCE_8(v_int32x8, int, min, _mm_min_epi32) +OPENCV_HAL_IMPL_AVX_REDUCE_8(v_uint32x8, unsigned, max, _mm_max_epu32) +OPENCV_HAL_IMPL_AVX_REDUCE_8(v_int32x8, int, max, _mm_max_epi32) + +#define OPENCV_HAL_IMPL_AVX_REDUCE_FLT(func, intrin) \ + inline float v_reduce_##func(const v_float32x8& a) \ + { \ + __m128 v0 = _v256_extract_low(a.val); \ + __m128 v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, _mm_permute_ps(v0, _MM_SHUFFLE(0, 0, 3, 2))); \ + v0 = intrin(v0, _mm_permute_ps(v0, _MM_SHUFFLE(0, 0, 0, 1))); \ + return _mm_cvtss_f32(v0); \ + } + +OPENCV_HAL_IMPL_AVX_REDUCE_FLT(min, _mm_min_ps) +OPENCV_HAL_IMPL_AVX_REDUCE_FLT(max, _mm_max_ps) + +inline int v_reduce_sum(const v_int32x8& a) +{ + __m256i s0 = _mm256_hadd_epi32(a.val, a.val); + s0 = _mm256_hadd_epi32(s0, s0); + + __m128i s1 = _v256_extract_high(s0); + s1 = _mm_add_epi32(_v256_extract_low(s0), s1); + + return _mm_cvtsi128_si32(s1); +} + +inline unsigned v_reduce_sum(const v_uint32x8& a) +{ return v_reduce_sum(v_reinterpret_as_s32(a)); } + +inline int v_reduce_sum(const v_int16x16& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } +inline unsigned v_reduce_sum(const v_uint16x16& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } + +inline float v_reduce_sum(const v_float32x8& a) +{ + __m256 s0 = _mm256_hadd_ps(a.val, a.val); + s0 = _mm256_hadd_ps(s0, s0); + + __m128 s1 = _v256_extract_high(s0); + s1 = _mm_add_ps(_v256_extract_low(s0), s1); + + return _mm_cvtss_f32(s1); +} + +inline uint64 v_reduce_sum(const v_uint64x4& a) +{ + uint64 CV_DECL_ALIGNED(32) idx[2]; + _mm_store_si128((__m128i*)idx, _mm_add_epi64(_v256_extract_low(a.val), _v256_extract_high(a.val))); + return idx[0] + idx[1]; +} +inline int64 v_reduce_sum(const v_int64x4& a) +{ + int64 CV_DECL_ALIGNED(32) idx[2]; + _mm_store_si128((__m128i*)idx, _mm_add_epi64(_v256_extract_low(a.val), _v256_extract_high(a.val))); + return idx[0] + idx[1]; +} +inline double v_reduce_sum(const v_float64x4& a) +{ + __m256d s0 = _mm256_hadd_pd(a.val, a.val); + return _mm_cvtsd_f64(_mm_add_pd(_v256_extract_low(s0), _v256_extract_high(s0))); +} + +inline v_float32x8 v_reduce_sum4(const v_float32x8& a, const v_float32x8& b, + const v_float32x8& c, const v_float32x8& d) +{ + __m256 ab = _mm256_hadd_ps(a.val, b.val); + __m256 cd = _mm256_hadd_ps(c.val, d.val); + return v_float32x8(_mm256_hadd_ps(ab, cd)); +} + +inline unsigned v_reduce_sad(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i half = _mm256_sad_epu8(a.val, b.val); + __m128i quarter = _mm_add_epi32(_v256_extract_low(half), _v256_extract_high(half)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))); +} +inline unsigned v_reduce_sad(const v_int8x32& a, const v_int8x32& b) +{ + __m256i half = _mm256_set1_epi8(0x7f); + half = _mm256_sad_epu8(_mm256_add_epi8(a.val, half), _mm256_add_epi8(b.val, half)); + __m128i quarter = _mm_add_epi32(_v256_extract_low(half), _v256_extract_high(half)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))); +} +inline unsigned v_reduce_sad(const v_uint16x16& a, const v_uint16x16& b) +{ + v_uint32x8 l, h; + v_expand(v_add_wrap(a - b, b - a), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_int16x16& a, const v_int16x16& b) +{ + v_uint32x8 l, h; + v_expand(v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_uint32x8& a, const v_uint32x8& b) +{ + return v_reduce_sum(v_max(a, b) - v_min(a, b)); +} +inline unsigned v_reduce_sad(const v_int32x8& a, const v_int32x8& b) +{ + v_int32x8 m = a < b; + return v_reduce_sum(v_reinterpret_as_u32(((a - b) ^ m) - m)); +} +inline float v_reduce_sad(const v_float32x8& a, const v_float32x8& b) +{ + return v_reduce_sum((a - b) & v_float32x8(_mm256_castsi256_ps(_mm256_set1_epi32(0x7fffffff)))); +} + +/** Popcount **/ +inline v_uint8x32 v_popcount(const v_uint8x32& a) +{ + __m256i _popcnt_table = _mm256_setr_epi8(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); + __m256i _popcnt_mask = _mm256_set1_epi8(0x0F); + return v_uint8x32(_mm256_add_epi8(_mm256_shuffle_epi8(_popcnt_table, _mm256_and_si256( a.val , _popcnt_mask)), + _mm256_shuffle_epi8(_popcnt_table, _mm256_and_si256(_mm256_srli_epi16(a.val, 4), _popcnt_mask)))); +} +inline v_uint16x16 v_popcount(const v_uint16x16& a) +{ + v_uint8x32 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + return v_reinterpret_as_u16(p) & v256_setall_u16(0x00ff); +} +inline v_uint32x8 v_popcount(const v_uint32x8& a) +{ + v_uint8x32 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + p += v_rotate_right<2>(p); + return v_reinterpret_as_u32(p) & v256_setall_u32(0x000000ff); +} +inline v_uint64x4 v_popcount(const v_uint64x4& a) +{ + return v_uint64x4(_mm256_sad_epu8(v_popcount(v_reinterpret_as_u8(a)).val, _mm256_setzero_si256())); +} +inline v_uint8x32 v_popcount(const v_int8x32& a) +{ return v_popcount(v_reinterpret_as_u8(a)); } +inline v_uint16x16 v_popcount(const v_int16x16& a) +{ return v_popcount(v_reinterpret_as_u16(a)); } +inline v_uint32x8 v_popcount(const v_int32x8& a) +{ return v_popcount(v_reinterpret_as_u32(a)); } +inline v_uint64x4 v_popcount(const v_int64x4& a) +{ return v_popcount(v_reinterpret_as_u64(a)); } + +/** Mask **/ +inline int v_signmask(const v_int8x32& a) +{ return _mm256_movemask_epi8(a.val); } +inline int v_signmask(const v_uint8x32& a) +{ return v_signmask(v_reinterpret_as_s8(a)); } + +inline int v_signmask(const v_int16x16& a) +{ return v_signmask(v_pack(a, a)) & 0xFFFF; } +inline int v_signmask(const v_uint16x16& a) +{ return v_signmask(v_reinterpret_as_s16(a)); } + +inline int v_signmask(const v_float32x8& a) +{ return _mm256_movemask_ps(a.val); } +inline int v_signmask(const v_float64x4& a) +{ return _mm256_movemask_pd(a.val); } + +inline int v_signmask(const v_int32x8& a) +{ return v_signmask(v_reinterpret_as_f32(a)); } +inline int v_signmask(const v_uint32x8& a) +{ return v_signmask(v_reinterpret_as_f32(a)); } + +inline int v_signmask(const v_int64x4& a) +{ return v_signmask(v_reinterpret_as_f64(a)); } +inline int v_signmask(const v_uint64x4& a) +{ return v_signmask(v_reinterpret_as_f64(a)); } + +inline int v_scan_forward(const v_int8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_uint8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_int16x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_uint16x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_int32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_uint32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_float32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_int64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_uint64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_float64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } + +/** Checks **/ +#define OPENCV_HAL_IMPL_AVX_CHECK(_Tpvec, allmask) \ + inline bool v_check_all(const _Tpvec& a) { return v_signmask(a) == allmask; } \ + inline bool v_check_any(const _Tpvec& a) { return v_signmask(a) != 0; } +OPENCV_HAL_IMPL_AVX_CHECK(v_uint8x32, -1) +OPENCV_HAL_IMPL_AVX_CHECK(v_int8x32, -1) +OPENCV_HAL_IMPL_AVX_CHECK(v_uint32x8, 255) +OPENCV_HAL_IMPL_AVX_CHECK(v_int32x8, 255) +OPENCV_HAL_IMPL_AVX_CHECK(v_uint64x4, 15) +OPENCV_HAL_IMPL_AVX_CHECK(v_int64x4, 15) +OPENCV_HAL_IMPL_AVX_CHECK(v_float32x8, 255) +OPENCV_HAL_IMPL_AVX_CHECK(v_float64x4, 15) + +#define OPENCV_HAL_IMPL_AVX_CHECK_SHORT(_Tpvec) \ + inline bool v_check_all(const _Tpvec& a) { return (v_signmask(v_reinterpret_as_s8(a)) & 0xaaaaaaaa) == 0xaaaaaaaa; } \ + inline bool v_check_any(const _Tpvec& a) { return (v_signmask(v_reinterpret_as_s8(a)) & 0xaaaaaaaa) != 0; } +OPENCV_HAL_IMPL_AVX_CHECK_SHORT(v_uint16x16) +OPENCV_HAL_IMPL_AVX_CHECK_SHORT(v_int16x16) + +////////// Other math ///////// + +/** Some frequent operations **/ +#if CV_FMA3 +#define OPENCV_HAL_IMPL_AVX_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm256_fmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm256_fmadd_##suffix(a.val, b.val, c.val)); } +#else +#define OPENCV_HAL_IMPL_AVX_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm256_add_##suffix(_mm256_mul_##suffix(a.val, b.val), c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm256_add_##suffix(_mm256_mul_##suffix(a.val, b.val), c.val)); } +#endif + +#define OPENCV_HAL_IMPL_AVX_MISC(_Tpvec, suffix) \ + inline _Tpvec v_sqrt(const _Tpvec& x) \ + { return _Tpvec(_mm256_sqrt_##suffix(x.val)); } \ + inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_fma(a, a, b * b); } \ + inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_sqrt(v_fma(a, a, b*b)); } + +OPENCV_HAL_IMPL_AVX_MULADD(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_MULADD(v_float64x4, pd) +OPENCV_HAL_IMPL_AVX_MISC(v_float32x8, ps) +OPENCV_HAL_IMPL_AVX_MISC(v_float64x4, pd) + +inline v_int32x8 v_fma(const v_int32x8& a, const v_int32x8& b, const v_int32x8& c) +{ + return a * b + c; +} + +inline v_int32x8 v_muladd(const v_int32x8& a, const v_int32x8& b, const v_int32x8& c) +{ + return v_fma(a, b, c); +} + +inline v_float32x8 v_invsqrt(const v_float32x8& x) +{ + v_float32x8 half = x * v256_setall_f32(0.5); + v_float32x8 t = v_float32x8(_mm256_rsqrt_ps(x.val)); + // todo: _mm256_fnmsub_ps + t *= v256_setall_f32(1.5) - ((t * t) * half); + return t; +} + +inline v_float64x4 v_invsqrt(const v_float64x4& x) +{ + return v256_setall_f64(1.) / v_sqrt(x); +} + +/** Absolute values **/ +#define OPENCV_HAL_IMPL_AVX_ABS(_Tpvec, suffix) \ + inline v_u##_Tpvec v_abs(const v_##_Tpvec& x) \ + { return v_u##_Tpvec(_mm256_abs_##suffix(x.val)); } + +OPENCV_HAL_IMPL_AVX_ABS(int8x32, epi8) +OPENCV_HAL_IMPL_AVX_ABS(int16x16, epi16) +OPENCV_HAL_IMPL_AVX_ABS(int32x8, epi32) + +inline v_float32x8 v_abs(const v_float32x8& x) +{ return x & v_float32x8(_mm256_castsi256_ps(_mm256_set1_epi32(0x7fffffff))); } +inline v_float64x4 v_abs(const v_float64x4& x) +{ return x & v_float64x4(_mm256_castsi256_pd(_mm256_srli_epi64(_mm256_set1_epi64x(-1), 1))); } + +/** Absolute difference **/ +inline v_uint8x32 v_absdiff(const v_uint8x32& a, const v_uint8x32& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint16x16 v_absdiff(const v_uint16x16& a, const v_uint16x16& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint32x8 v_absdiff(const v_uint32x8& a, const v_uint32x8& b) +{ return v_max(a, b) - v_min(a, b); } + +inline v_uint8x32 v_absdiff(const v_int8x32& a, const v_int8x32& b) +{ + v_int8x32 d = v_sub_wrap(a, b); + v_int8x32 m = a < b; + return v_reinterpret_as_u8(v_sub_wrap(d ^ m, m)); +} + +inline v_uint16x16 v_absdiff(const v_int16x16& a, const v_int16x16& b) +{ return v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))); } + +inline v_uint32x8 v_absdiff(const v_int32x8& a, const v_int32x8& b) +{ + v_int32x8 d = a - b; + v_int32x8 m = a < b; + return v_reinterpret_as_u32((d ^ m) - m); +} + +inline v_float32x8 v_absdiff(const v_float32x8& a, const v_float32x8& b) +{ return v_abs(a - b); } + +inline v_float64x4 v_absdiff(const v_float64x4& a, const v_float64x4& b) +{ return v_abs(a - b); } + +/** Saturating absolute difference **/ +inline v_int8x32 v_absdiffs(const v_int8x32& a, const v_int8x32& b) +{ + v_int8x32 d = a - b; + v_int8x32 m = a < b; + return (d ^ m) - m; +} +inline v_int16x16 v_absdiffs(const v_int16x16& a, const v_int16x16& b) +{ return v_max(a, b) - v_min(a, b); } + +////////// Conversions ///////// + +/** Rounding **/ +inline v_int32x8 v_round(const v_float32x8& a) +{ return v_int32x8(_mm256_cvtps_epi32(a.val)); } + +inline v_int32x8 v_round(const v_float64x4& a) +{ return v_int32x8(_mm256_castsi128_si256(_mm256_cvtpd_epi32(a.val))); } + +inline v_int32x8 v_round(const v_float64x4& a, const v_float64x4& b) +{ + __m128i ai = _mm256_cvtpd_epi32(a.val), bi = _mm256_cvtpd_epi32(b.val); + return v_int32x8(_v256_combine(ai, bi)); +} + +inline v_int32x8 v_trunc(const v_float32x8& a) +{ return v_int32x8(_mm256_cvttps_epi32(a.val)); } + +inline v_int32x8 v_trunc(const v_float64x4& a) +{ return v_int32x8(_mm256_castsi128_si256(_mm256_cvttpd_epi32(a.val))); } + +inline v_int32x8 v_floor(const v_float32x8& a) +{ return v_int32x8(_mm256_cvttps_epi32(_mm256_floor_ps(a.val))); } + +inline v_int32x8 v_floor(const v_float64x4& a) +{ return v_trunc(v_float64x4(_mm256_floor_pd(a.val))); } + +inline v_int32x8 v_ceil(const v_float32x8& a) +{ return v_int32x8(_mm256_cvttps_epi32(_mm256_ceil_ps(a.val))); } + +inline v_int32x8 v_ceil(const v_float64x4& a) +{ return v_trunc(v_float64x4(_mm256_ceil_pd(a.val))); } + +/** To float **/ +inline v_float32x8 v_cvt_f32(const v_int32x8& a) +{ return v_float32x8(_mm256_cvtepi32_ps(a.val)); } + +inline v_float32x8 v_cvt_f32(const v_float64x4& a) +{ return v_float32x8(_mm256_castps128_ps256(_mm256_cvtpd_ps(a.val))); } + +inline v_float32x8 v_cvt_f32(const v_float64x4& a, const v_float64x4& b) +{ + __m128 af = _mm256_cvtpd_ps(a.val), bf = _mm256_cvtpd_ps(b.val); + return v_float32x8(_v256_combine(af, bf)); +} + +inline v_float64x4 v_cvt_f64(const v_int32x8& a) +{ return v_float64x4(_mm256_cvtepi32_pd(_v256_extract_low(a.val))); } + +inline v_float64x4 v_cvt_f64_high(const v_int32x8& a) +{ return v_float64x4(_mm256_cvtepi32_pd(_v256_extract_high(a.val))); } + +inline v_float64x4 v_cvt_f64(const v_float32x8& a) +{ return v_float64x4(_mm256_cvtps_pd(_v256_extract_low(a.val))); } + +inline v_float64x4 v_cvt_f64_high(const v_float32x8& a) +{ return v_float64x4(_mm256_cvtps_pd(_v256_extract_high(a.val))); } + +// from (Mysticial and wim) https://stackoverflow.com/q/41144668 +inline v_float64x4 v_cvt_f64(const v_int64x4& v) +{ + // constants encoded as floating-point + __m256i magic_i_lo = _mm256_set1_epi64x(0x4330000000000000); // 2^52 + __m256i magic_i_hi32 = _mm256_set1_epi64x(0x4530000080000000); // 2^84 + 2^63 + __m256i magic_i_all = _mm256_set1_epi64x(0x4530000080100000); // 2^84 + 2^63 + 2^52 + __m256d magic_d_all = _mm256_castsi256_pd(magic_i_all); + + // Blend the 32 lowest significant bits of v with magic_int_lo + __m256i v_lo = _mm256_blend_epi32(magic_i_lo, v.val, 0x55); + // Extract the 32 most significant bits of v + __m256i v_hi = _mm256_srli_epi64(v.val, 32); + // Flip the msb of v_hi and blend with 0x45300000 + v_hi = _mm256_xor_si256(v_hi, magic_i_hi32); + // Compute in double precision + __m256d v_hi_dbl = _mm256_sub_pd(_mm256_castsi256_pd(v_hi), magic_d_all); + // (v_hi - magic_d_all) + v_lo Do not assume associativity of floating point addition + __m256d result = _mm256_add_pd(v_hi_dbl, _mm256_castsi256_pd(v_lo)); + return v_float64x4(result); +} + +////////////// Lookup table access //////////////////// + +inline v_int8x32 v256_lut(const schar* tab, const int* idx) +{ + return v_int8x32(_mm256_setr_epi8(tab[idx[ 0]], tab[idx[ 1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]], + tab[idx[ 8]], tab[idx[ 9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]], + tab[idx[16]], tab[idx[17]], tab[idx[18]], tab[idx[19]], tab[idx[20]], tab[idx[21]], tab[idx[22]], tab[idx[23]], + tab[idx[24]], tab[idx[25]], tab[idx[26]], tab[idx[27]], tab[idx[28]], tab[idx[29]], tab[idx[30]], tab[idx[31]])); +} +inline v_int8x32 v256_lut_pairs(const schar* tab, const int* idx) +{ + return v_int8x32(_mm256_setr_epi16(*(const short*)(tab + idx[ 0]), *(const short*)(tab + idx[ 1]), *(const short*)(tab + idx[ 2]), *(const short*)(tab + idx[ 3]), + *(const short*)(tab + idx[ 4]), *(const short*)(tab + idx[ 5]), *(const short*)(tab + idx[ 6]), *(const short*)(tab + idx[ 7]), + *(const short*)(tab + idx[ 8]), *(const short*)(tab + idx[ 9]), *(const short*)(tab + idx[10]), *(const short*)(tab + idx[11]), + *(const short*)(tab + idx[12]), *(const short*)(tab + idx[13]), *(const short*)(tab + idx[14]), *(const short*)(tab + idx[15]))); +} +inline v_int8x32 v256_lut_quads(const schar* tab, const int* idx) +{ + return v_int8x32(_mm256_i32gather_epi32((const int*)tab, _mm256_loadu_si256((const __m256i*)idx), 1)); +} +inline v_uint8x32 v256_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut((const schar *)tab, idx)); } +inline v_uint8x32 v256_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut_pairs((const schar *)tab, idx)); } +inline v_uint8x32 v256_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut_quads((const schar *)tab, idx)); } + +inline v_int16x16 v256_lut(const short* tab, const int* idx) +{ + return v_int16x16(_mm256_setr_epi16(tab[idx[0]], tab[idx[1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]], + tab[idx[8]], tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]])); +} +inline v_int16x16 v256_lut_pairs(const short* tab, const int* idx) +{ + return v_int16x16(_mm256_i32gather_epi32((const int*)tab, _mm256_loadu_si256((const __m256i*)idx), 2)); +} +inline v_int16x16 v256_lut_quads(const short* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int16x16(_mm256_i32gather_epi64((const long long int*)tab, _mm_loadu_si128((const __m128i*)idx), 2));//Looks like intrinsic has wrong definition +#else + return v_int16x16(_mm256_i32gather_epi64((const int64*)tab, _mm_loadu_si128((const __m128i*)idx), 2)); +#endif +} +inline v_uint16x16 v256_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut((const short *)tab, idx)); } +inline v_uint16x16 v256_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut_pairs((const short *)tab, idx)); } +inline v_uint16x16 v256_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut_quads((const short *)tab, idx)); } + +inline v_int32x8 v256_lut(const int* tab, const int* idx) +{ + return v_int32x8(_mm256_i32gather_epi32(tab, _mm256_loadu_si256((const __m256i*)idx), 4)); +} +inline v_int32x8 v256_lut_pairs(const int* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int32x8(_mm256_i32gather_epi64((const long long int*)tab, _mm_loadu_si128((const __m128i*)idx), 4)); +#else + return v_int32x8(_mm256_i32gather_epi64((const int64*)tab, _mm_loadu_si128((const __m128i*)idx), 4)); +#endif +} +inline v_int32x8 v256_lut_quads(const int* tab, const int* idx) +{ + return v_int32x8(_v256_combine(_mm_loadu_si128((const __m128i*)(tab + idx[0])), _mm_loadu_si128((const __m128i*)(tab + idx[1])))); +} +inline v_uint32x8 v256_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut((const int *)tab, idx)); } +inline v_uint32x8 v256_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut_pairs((const int *)tab, idx)); } +inline v_uint32x8 v256_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut_quads((const int *)tab, idx)); } + +inline v_int64x4 v256_lut(const int64* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int64x4(_mm256_i32gather_epi64((const long long int*)tab, _mm_loadu_si128((const __m128i*)idx), 8)); +#else + return v_int64x4(_mm256_i32gather_epi64(tab, _mm_loadu_si128((const __m128i*)idx), 8)); +#endif +} +inline v_int64x4 v256_lut_pairs(const int64* tab, const int* idx) +{ + return v_int64x4(_v256_combine(_mm_loadu_si128((const __m128i*)(tab + idx[0])), _mm_loadu_si128((const __m128i*)(tab + idx[1])))); +} +inline v_uint64x4 v256_lut(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v256_lut((const int64 *)tab, idx)); } +inline v_uint64x4 v256_lut_pairs(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v256_lut_pairs((const int64 *)tab, idx)); } + +inline v_float32x8 v256_lut(const float* tab, const int* idx) +{ + return v_float32x8(_mm256_i32gather_ps(tab, _mm256_loadu_si256((const __m256i*)idx), 4)); +} +inline v_float32x8 v256_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v256_lut_pairs((const int *)tab, idx)); } +inline v_float32x8 v256_lut_quads(const float* tab, const int* idx) { return v_reinterpret_as_f32(v256_lut_quads((const int *)tab, idx)); } + +inline v_float64x4 v256_lut(const double* tab, const int* idx) +{ + return v_float64x4(_mm256_i32gather_pd(tab, _mm_loadu_si128((const __m128i*)idx), 8)); +} +inline v_float64x4 v256_lut_pairs(const double* tab, const int* idx) { return v_float64x4(_v256_combine(_mm_loadu_pd(tab + idx[0]), _mm_loadu_pd(tab + idx[1]))); } + +inline v_int32x8 v_lut(const int* tab, const v_int32x8& idxvec) +{ + return v_int32x8(_mm256_i32gather_epi32(tab, idxvec.val, 4)); +} + +inline v_uint32x8 v_lut(const unsigned* tab, const v_int32x8& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x8 v_lut(const float* tab, const v_int32x8& idxvec) +{ + return v_float32x8(_mm256_i32gather_ps(tab, idxvec.val, 4)); +} + +inline v_float64x4 v_lut(const double* tab, const v_int32x8& idxvec) +{ + return v_float64x4(_mm256_i32gather_pd(tab, _mm256_castsi256_si128(idxvec.val), 8)); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x8& idxvec, v_float32x8& x, v_float32x8& y) +{ + int CV_DECL_ALIGNED(32) idx[8]; + v_store_aligned(idx, idxvec); + __m128 z = _mm_setzero_ps(); + __m128 xy01, xy45, xy23, xy67; + xy01 = _mm_loadl_pi(z, (const __m64*)(tab + idx[0])); + xy01 = _mm_loadh_pi(xy01, (const __m64*)(tab + idx[1])); + xy45 = _mm_loadl_pi(z, (const __m64*)(tab + idx[4])); + xy45 = _mm_loadh_pi(xy45, (const __m64*)(tab + idx[5])); + __m256 xy0145 = _v256_combine(xy01, xy45); + xy23 = _mm_loadl_pi(z, (const __m64*)(tab + idx[2])); + xy23 = _mm_loadh_pi(xy23, (const __m64*)(tab + idx[3])); + xy67 = _mm_loadl_pi(z, (const __m64*)(tab + idx[6])); + xy67 = _mm_loadh_pi(xy67, (const __m64*)(tab + idx[7])); + __m256 xy2367 = _v256_combine(xy23, xy67); + + __m256 xxyy0145 = _mm256_unpacklo_ps(xy0145, xy2367); + __m256 xxyy2367 = _mm256_unpackhi_ps(xy0145, xy2367); + + x = v_float32x8(_mm256_unpacklo_ps(xxyy0145, xxyy2367)); + y = v_float32x8(_mm256_unpackhi_ps(xxyy0145, xxyy2367)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x8& idxvec, v_float64x4& x, v_float64x4& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_low(idx, idxvec); + __m128d xy0 = _mm_loadu_pd(tab + idx[0]); + __m128d xy2 = _mm_loadu_pd(tab + idx[2]); + __m128d xy1 = _mm_loadu_pd(tab + idx[1]); + __m128d xy3 = _mm_loadu_pd(tab + idx[3]); + __m256d xy02 = _v256_combine(xy0, xy2); + __m256d xy13 = _v256_combine(xy1, xy3); + + x = v_float64x4(_mm256_unpacklo_pd(xy02, xy13)); + y = v_float64x4(_mm256_unpackhi_pd(xy02, xy13)); +} + +inline v_int8x32 v_interleave_pairs(const v_int8x32& vec) +{ + return v_int8x32(_mm256_shuffle_epi8(vec.val, _mm256_set_epi64x(0x0f0d0e0c0b090a08, 0x0705060403010200, 0x0f0d0e0c0b090a08, 0x0705060403010200))); +} +inline v_uint8x32 v_interleave_pairs(const v_uint8x32& vec) { return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x32 v_interleave_quads(const v_int8x32& vec) +{ + return v_int8x32(_mm256_shuffle_epi8(vec.val, _mm256_set_epi64x(0x0f0b0e0a0d090c08, 0x0703060205010400, 0x0f0b0e0a0d090c08, 0x0703060205010400))); +} +inline v_uint8x32 v_interleave_quads(const v_uint8x32& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x16 v_interleave_pairs(const v_int16x16& vec) +{ + return v_int16x16(_mm256_shuffle_epi8(vec.val, _mm256_set_epi64x(0x0f0e0b0a0d0c0908, 0x0706030205040100, 0x0f0e0b0a0d0c0908, 0x0706030205040100))); +} +inline v_uint16x16 v_interleave_pairs(const v_uint16x16& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x16 v_interleave_quads(const v_int16x16& vec) +{ + return v_int16x16(_mm256_shuffle_epi8(vec.val, _mm256_set_epi64x(0x0f0e07060d0c0504, 0x0b0a030209080100, 0x0f0e07060d0c0504, 0x0b0a030209080100))); +} +inline v_uint16x16 v_interleave_quads(const v_uint16x16& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x8 v_interleave_pairs(const v_int32x8& vec) +{ + return v_int32x8(_mm256_shuffle_epi32(vec.val, _MM_SHUFFLE(3, 1, 2, 0))); +} +inline v_uint32x8 v_interleave_pairs(const v_uint32x8& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x8 v_interleave_pairs(const v_float32x8& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x32 v_pack_triplets(const v_int8x32& vec) +{ + return v_int8x32(_mm256_permutevar8x32_epi32(_mm256_shuffle_epi8(vec.val, _mm256_broadcastsi128_si256(_mm_set_epi64x(0xffffff0f0e0d0c0a, 0x0908060504020100))), + _mm256_set_epi64x(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint8x32 v_pack_triplets(const v_uint8x32& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x16 v_pack_triplets(const v_int16x16& vec) +{ + return v_int16x16(_mm256_permutevar8x32_epi32(_mm256_shuffle_epi8(vec.val, _mm256_broadcastsi128_si256(_mm_set_epi64x(0xffff0f0e0d0c0b0a, 0x0908050403020100))), + _mm256_set_epi64x(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint16x16 v_pack_triplets(const v_uint16x16& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x8 v_pack_triplets(const v_int32x8& vec) +{ + return v_int32x8(_mm256_permutevar8x32_epi32(vec.val, _mm256_set_epi64x(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint32x8 v_pack_triplets(const v_uint32x8& vec) { return v_reinterpret_as_u32(v_pack_triplets(v_reinterpret_as_s32(vec))); } +inline v_float32x8 v_pack_triplets(const v_float32x8& vec) +{ + return v_float32x8(_mm256_permutevar8x32_ps(vec.val, _mm256_set_epi64x(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} + +////////// Matrix operations ///////// + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x8 v_dotprod(const v_int16x16& a, const v_int16x16& b) +{ return v_int32x8(_mm256_madd_epi16(a.val, b.val)); } +inline v_int32x8 v_dotprod(const v_int16x16& a, const v_int16x16& b, const v_int32x8& c) +{ return v_dotprod(a, b) + c; } + +// 32 >> 64 +inline v_int64x4 v_dotprod(const v_int32x8& a, const v_int32x8& b) +{ + __m256i even = _mm256_mul_epi32(a.val, b.val); + __m256i odd = _mm256_mul_epi32(_mm256_srli_epi64(a.val, 32), _mm256_srli_epi64(b.val, 32)); + return v_int64x4(_mm256_add_epi64(even, odd)); +} +inline v_int64x4 v_dotprod(const v_int32x8& a, const v_int32x8& b, const v_int64x4& c) +{ return v_dotprod(a, b) + c; } + +// 8 >> 32 +inline v_uint32x8 v_dotprod_expand(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i even_m = _mm256_set1_epi32(0xFF00FF00); + __m256i even_a = _mm256_blendv_epi8(a.val, _mm256_setzero_si256(), even_m); + __m256i odd_a = _mm256_srli_epi16(a.val, 8); + + __m256i even_b = _mm256_blendv_epi8(b.val, _mm256_setzero_si256(), even_m); + __m256i odd_b = _mm256_srli_epi16(b.val, 8); + + __m256i prod0 = _mm256_madd_epi16(even_a, even_b); + __m256i prod1 = _mm256_madd_epi16(odd_a, odd_b); + return v_uint32x8(_mm256_add_epi32(prod0, prod1)); +} +inline v_uint32x8 v_dotprod_expand(const v_uint8x32& a, const v_uint8x32& b, const v_uint32x8& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int32x8 v_dotprod_expand(const v_int8x32& a, const v_int8x32& b) +{ + __m256i even_a = _mm256_srai_epi16(_mm256_bslli_epi128(a.val, 1), 8); + __m256i odd_a = _mm256_srai_epi16(a.val, 8); + + __m256i even_b = _mm256_srai_epi16(_mm256_bslli_epi128(b.val, 1), 8); + __m256i odd_b = _mm256_srai_epi16(b.val, 8); + + __m256i prod0 = _mm256_madd_epi16(even_a, even_b); + __m256i prod1 = _mm256_madd_epi16(odd_a, odd_b); + return v_int32x8(_mm256_add_epi32(prod0, prod1)); +} +inline v_int32x8 v_dotprod_expand(const v_int8x32& a, const v_int8x32& b, const v_int32x8& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x4 v_dotprod_expand(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i mullo = _mm256_mullo_epi16(a.val, b.val); + __m256i mulhi = _mm256_mulhi_epu16(a.val, b.val); + __m256i mul0 = _mm256_unpacklo_epi16(mullo, mulhi); + __m256i mul1 = _mm256_unpackhi_epi16(mullo, mulhi); + + __m256i p02 = _mm256_blend_epi32(mul0, _mm256_setzero_si256(), 0xAA); + __m256i p13 = _mm256_srli_epi64(mul0, 32); + __m256i p46 = _mm256_blend_epi32(mul1, _mm256_setzero_si256(), 0xAA); + __m256i p57 = _mm256_srli_epi64(mul1, 32); + + __m256i p15_ = _mm256_add_epi64(p02, p13); + __m256i p9d_ = _mm256_add_epi64(p46, p57); + + return v_uint64x4(_mm256_add_epi64( + _mm256_unpacklo_epi64(p15_, p9d_), + _mm256_unpackhi_epi64(p15_, p9d_) + )); +} +inline v_uint64x4 v_dotprod_expand(const v_uint16x16& a, const v_uint16x16& b, const v_uint64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x4 v_dotprod_expand(const v_int16x16& a, const v_int16x16& b) +{ + __m256i prod = _mm256_madd_epi16(a.val, b.val); + __m256i sign = _mm256_srai_epi32(prod, 31); + + __m256i lo = _mm256_unpacklo_epi32(prod, sign); + __m256i hi = _mm256_unpackhi_epi32(prod, sign); + + return v_int64x4(_mm256_add_epi64( + _mm256_unpacklo_epi64(lo, hi), + _mm256_unpackhi_epi64(lo, hi) + )); +} +inline v_int64x4 v_dotprod_expand(const v_int16x16& a, const v_int16x16& b, const v_int64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x4 v_dotprod_expand(const v_int32x8& a, const v_int32x8& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x4 v_dotprod_expand(const v_int32x8& a, const v_int32x8& b, const v_float64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x8 v_dotprod_fast(const v_int16x16& a, const v_int16x16& b) +{ return v_dotprod(a, b); } +inline v_int32x8 v_dotprod_fast(const v_int16x16& a, const v_int16x16& b, const v_int32x8& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x4 v_dotprod_fast(const v_int32x8& a, const v_int32x8& b) +{ return v_dotprod(a, b); } +inline v_int64x4 v_dotprod_fast(const v_int32x8& a, const v_int32x8& b, const v_int64x4& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x8 v_dotprod_expand_fast(const v_uint8x32& a, const v_uint8x32& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x8 v_dotprod_expand_fast(const v_uint8x32& a, const v_uint8x32& b, const v_uint32x8& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_int32x8 v_dotprod_expand_fast(const v_int8x32& a, const v_int8x32& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x8 v_dotprod_expand_fast(const v_int8x32& a, const v_int8x32& b, const v_int32x8& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x4 v_dotprod_expand_fast(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i mullo = _mm256_mullo_epi16(a.val, b.val); + __m256i mulhi = _mm256_mulhi_epu16(a.val, b.val); + __m256i mul0 = _mm256_unpacklo_epi16(mullo, mulhi); + __m256i mul1 = _mm256_unpackhi_epi16(mullo, mulhi); + + __m256i p02 = _mm256_blend_epi32(mul0, _mm256_setzero_si256(), 0xAA); + __m256i p13 = _mm256_srli_epi64(mul0, 32); + __m256i p46 = _mm256_blend_epi32(mul1, _mm256_setzero_si256(), 0xAA); + __m256i p57 = _mm256_srli_epi64(mul1, 32); + + __m256i p15_ = _mm256_add_epi64(p02, p13); + __m256i p9d_ = _mm256_add_epi64(p46, p57); + + return v_uint64x4(_mm256_add_epi64(p15_, p9d_)); +} +inline v_uint64x4 v_dotprod_expand_fast(const v_uint16x16& a, const v_uint16x16& b, const v_uint64x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int64x4 v_dotprod_expand_fast(const v_int16x16& a, const v_int16x16& b) +{ + __m256i prod = _mm256_madd_epi16(a.val, b.val); + __m256i sign = _mm256_srai_epi32(prod, 31); + __m256i lo = _mm256_unpacklo_epi32(prod, sign); + __m256i hi = _mm256_unpackhi_epi32(prod, sign); + return v_int64x4(_mm256_add_epi64(lo, hi)); +} +inline v_int64x4 v_dotprod_expand_fast(const v_int16x16& a, const v_int16x16& b, const v_int64x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 32 >> 64f +inline v_float64x4 v_dotprod_expand_fast(const v_int32x8& a, const v_int32x8& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x4 v_dotprod_expand_fast(const v_int32x8& a, const v_int32x8& b, const v_float64x4& c) +{ return v_dotprod_expand(a, b, c); } + +#define OPENCV_HAL_AVX_SPLAT2_PS(a, im) \ + v_float32x8(_mm256_permute_ps(a.val, _MM_SHUFFLE(im, im, im, im))) + +inline v_float32x8 v_matmul(const v_float32x8& v, const v_float32x8& m0, + const v_float32x8& m1, const v_float32x8& m2, + const v_float32x8& m3) +{ + v_float32x8 v04 = OPENCV_HAL_AVX_SPLAT2_PS(v, 0); + v_float32x8 v15 = OPENCV_HAL_AVX_SPLAT2_PS(v, 1); + v_float32x8 v26 = OPENCV_HAL_AVX_SPLAT2_PS(v, 2); + v_float32x8 v37 = OPENCV_HAL_AVX_SPLAT2_PS(v, 3); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, v37 * m3))); +} + +inline v_float32x8 v_matmuladd(const v_float32x8& v, const v_float32x8& m0, + const v_float32x8& m1, const v_float32x8& m2, + const v_float32x8& a) +{ + v_float32x8 v04 = OPENCV_HAL_AVX_SPLAT2_PS(v, 0); + v_float32x8 v15 = OPENCV_HAL_AVX_SPLAT2_PS(v, 1); + v_float32x8 v26 = OPENCV_HAL_AVX_SPLAT2_PS(v, 2); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, a))); +} + +#define OPENCV_HAL_IMPL_AVX_TRANSPOSE4x4(_Tpvec, suffix, cast_from, cast_to) \ + inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) \ + { \ + __m256i t0 = cast_from(_mm256_unpacklo_##suffix(a0.val, a1.val)); \ + __m256i t1 = cast_from(_mm256_unpacklo_##suffix(a2.val, a3.val)); \ + __m256i t2 = cast_from(_mm256_unpackhi_##suffix(a0.val, a1.val)); \ + __m256i t3 = cast_from(_mm256_unpackhi_##suffix(a2.val, a3.val)); \ + b0.val = cast_to(_mm256_unpacklo_epi64(t0, t1)); \ + b1.val = cast_to(_mm256_unpackhi_epi64(t0, t1)); \ + b2.val = cast_to(_mm256_unpacklo_epi64(t2, t3)); \ + b3.val = cast_to(_mm256_unpackhi_epi64(t2, t3)); \ + } + +OPENCV_HAL_IMPL_AVX_TRANSPOSE4x4(v_uint32x8, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_AVX_TRANSPOSE4x4(v_int32x8, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_AVX_TRANSPOSE4x4(v_float32x8, ps, _mm256_castps_si256, _mm256_castsi256_ps) + +//////////////// Value reordering /////////////// + +/* Expand */ +#define OPENCV_HAL_IMPL_AVX_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin) \ + inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ + { \ + b0.val = intrin(_v256_extract_low(a.val)); \ + b1.val = intrin(_v256_extract_high(a.val)); \ + } \ + inline _Tpwvec v_expand_low(const _Tpvec& a) \ + { return _Tpwvec(intrin(_v256_extract_low(a.val))); } \ + inline _Tpwvec v_expand_high(const _Tpvec& a) \ + { return _Tpwvec(intrin(_v256_extract_high(a.val))); } \ + inline _Tpwvec v256_load_expand(const _Tp* ptr) \ + { \ + __m128i a = _mm_loadu_si128((const __m128i*)ptr); \ + return _Tpwvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_AVX_EXPAND(v_uint8x32, v_uint16x16, uchar, _mm256_cvtepu8_epi16) +OPENCV_HAL_IMPL_AVX_EXPAND(v_int8x32, v_int16x16, schar, _mm256_cvtepi8_epi16) +OPENCV_HAL_IMPL_AVX_EXPAND(v_uint16x16, v_uint32x8, ushort, _mm256_cvtepu16_epi32) +OPENCV_HAL_IMPL_AVX_EXPAND(v_int16x16, v_int32x8, short, _mm256_cvtepi16_epi32) +OPENCV_HAL_IMPL_AVX_EXPAND(v_uint32x8, v_uint64x4, unsigned, _mm256_cvtepu32_epi64) +OPENCV_HAL_IMPL_AVX_EXPAND(v_int32x8, v_int64x4, int, _mm256_cvtepi32_epi64) + +#define OPENCV_HAL_IMPL_AVX_EXPAND_Q(_Tpvec, _Tp, intrin) \ + inline _Tpvec v256_load_expand_q(const _Tp* ptr) \ + { \ + __m128i a = _mm_loadl_epi64((const __m128i*)ptr); \ + return _Tpvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_AVX_EXPAND_Q(v_uint32x8, uchar, _mm256_cvtepu8_epi32) +OPENCV_HAL_IMPL_AVX_EXPAND_Q(v_int32x8, schar, _mm256_cvtepi8_epi32) + +/* pack */ +// 16 +inline v_int8x32 v_pack(const v_int16x16& a, const v_int16x16& b) +{ return v_int8x32(_v256_shuffle_odd_64(_mm256_packs_epi16(a.val, b.val))); } + +inline v_uint8x32 v_pack(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i t = _mm256_set1_epi16(255); + __m256i a1 = _mm256_min_epu16(a.val, t); + __m256i b1 = _mm256_min_epu16(b.val, t); + return v_uint8x32(_v256_shuffle_odd_64(_mm256_packus_epi16(a1, b1))); +} + +inline v_uint8x32 v_pack_u(const v_int16x16& a, const v_int16x16& b) +{ + return v_uint8x32(_v256_shuffle_odd_64(_mm256_packus_epi16(a.val, b.val))); +} + +inline void v_pack_store(schar* ptr, const v_int16x16& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(uchar* ptr, const v_uint16x16& a) +{ + const __m256i m = _mm256_set1_epi16(255); + __m256i am = _mm256_min_epu16(a.val, m); + am = _v256_shuffle_odd_64(_mm256_packus_epi16(am, am)); + v_store_low(ptr, v_uint8x32(am)); +} + +inline void v_pack_u_store(uchar* ptr, const v_int16x16& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + +template inline +v_uint8x32 v_rshr_pack(const v_uint16x16& a, const v_uint16x16& b) +{ + // we assume that n > 0, and so the shifted 16-bit values can be treated as signed numbers. + v_uint16x16 delta = v256_setall_u16((short)(1 << (n-1))); + return v_pack_u(v_reinterpret_as_s16((a + delta) >> n), + v_reinterpret_as_s16((b + delta) >> n)); +} + +template inline +void v_rshr_pack_store(uchar* ptr, const v_uint16x16& a) +{ + v_uint16x16 delta = v256_setall_u16((short)(1 << (n-1))); + v_pack_u_store(ptr, v_reinterpret_as_s16((a + delta) >> n)); +} + +template inline +v_uint8x32 v_rshr_pack_u(const v_int16x16& a, const v_int16x16& b) +{ + v_int16x16 delta = v256_setall_s16((short)(1 << (n-1))); + return v_pack_u((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_u_store(uchar* ptr, const v_int16x16& a) +{ + v_int16x16 delta = v256_setall_s16((short)(1 << (n-1))); + v_pack_u_store(ptr, (a + delta) >> n); +} + +template inline +v_int8x32 v_rshr_pack(const v_int16x16& a, const v_int16x16& b) +{ + v_int16x16 delta = v256_setall_s16((short)(1 << (n-1))); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(schar* ptr, const v_int16x16& a) +{ + v_int16x16 delta = v256_setall_s16((short)(1 << (n-1))); + v_pack_store(ptr, (a + delta) >> n); +} + +// 32 +inline v_int16x16 v_pack(const v_int32x8& a, const v_int32x8& b) +{ return v_int16x16(_v256_shuffle_odd_64(_mm256_packs_epi32(a.val, b.val))); } + +inline v_uint16x16 v_pack(const v_uint32x8& a, const v_uint32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(_v256_packs_epu32(a.val, b.val))); } + +inline v_uint16x16 v_pack_u(const v_int32x8& a, const v_int32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(_mm256_packus_epi32(a.val, b.val))); } + +inline void v_pack_store(short* ptr, const v_int32x8& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(ushort* ptr, const v_uint32x8& a) +{ + const __m256i m = _mm256_set1_epi32(65535); + __m256i am = _mm256_min_epu32(a.val, m); + am = _v256_shuffle_odd_64(_mm256_packus_epi32(am, am)); + v_store_low(ptr, v_uint16x16(am)); +} + +inline void v_pack_u_store(ushort* ptr, const v_int32x8& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + + +template inline +v_uint16x16 v_rshr_pack(const v_uint32x8& a, const v_uint32x8& b) +{ + // we assume that n > 0, and so the shifted 32-bit values can be treated as signed numbers. + v_uint32x8 delta = v256_setall_u32(1 << (n-1)); + return v_pack_u(v_reinterpret_as_s32((a + delta) >> n), + v_reinterpret_as_s32((b + delta) >> n)); +} + +template inline +void v_rshr_pack_store(ushort* ptr, const v_uint32x8& a) +{ + v_uint32x8 delta = v256_setall_u32(1 << (n-1)); + v_pack_u_store(ptr, v_reinterpret_as_s32((a + delta) >> n)); +} + +template inline +v_uint16x16 v_rshr_pack_u(const v_int32x8& a, const v_int32x8& b) +{ + v_int32x8 delta = v256_setall_s32(1 << (n-1)); + return v_pack_u((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_u_store(ushort* ptr, const v_int32x8& a) +{ + v_int32x8 delta = v256_setall_s32(1 << (n-1)); + v_pack_u_store(ptr, (a + delta) >> n); +} + +template inline +v_int16x16 v_rshr_pack(const v_int32x8& a, const v_int32x8& b) +{ + v_int32x8 delta = v256_setall_s32(1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(short* ptr, const v_int32x8& a) +{ + v_int32x8 delta = v256_setall_s32(1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +// 64 +// Non-saturating pack +inline v_uint32x8 v_pack(const v_uint64x4& a, const v_uint64x4& b) +{ + __m256i a0 = _mm256_shuffle_epi32(a.val, _MM_SHUFFLE(0, 0, 2, 0)); + __m256i b0 = _mm256_shuffle_epi32(b.val, _MM_SHUFFLE(0, 0, 2, 0)); + __m256i ab = _mm256_unpacklo_epi64(a0, b0); // a0, a1, b0, b1, a2, a3, b2, b3 + return v_uint32x8(_v256_shuffle_odd_64(ab)); +} + +inline v_int32x8 v_pack(const v_int64x4& a, const v_int64x4& b) +{ return v_reinterpret_as_s32(v_pack(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); } + +inline void v_pack_store(unsigned* ptr, const v_uint64x4& a) +{ + __m256i a0 = _mm256_shuffle_epi32(a.val, _MM_SHUFFLE(0, 0, 2, 0)); + v_store_low(ptr, v_uint32x8(_v256_shuffle_odd_64(a0))); +} + +inline void v_pack_store(int* ptr, const v_int64x4& b) +{ v_pack_store((unsigned*)ptr, v_reinterpret_as_u64(b)); } + +template inline +v_uint32x8 v_rshr_pack(const v_uint64x4& a, const v_uint64x4& b) +{ + v_uint64x4 delta = v256_setall_u64((uint64)1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(unsigned* ptr, const v_uint64x4& a) +{ + v_uint64x4 delta = v256_setall_u64((uint64)1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +template inline +v_int32x8 v_rshr_pack(const v_int64x4& a, const v_int64x4& b) +{ + v_int64x4 delta = v256_setall_s64((int64)1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(int* ptr, const v_int64x4& a) +{ + v_int64x4 delta = v256_setall_s64((int64)1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +// pack boolean +inline v_uint8x32 v_pack_b(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i ab = _mm256_packs_epi16(a.val, b.val); + return v_uint8x32(_v256_shuffle_odd_64(ab)); +} + +inline v_uint8x32 v_pack_b(const v_uint32x8& a, const v_uint32x8& b, + const v_uint32x8& c, const v_uint32x8& d) +{ + __m256i ab = _mm256_packs_epi32(a.val, b.val); + __m256i cd = _mm256_packs_epi32(c.val, d.val); + + __m256i abcd = _v256_shuffle_odd_64(_mm256_packs_epi16(ab, cd)); + return v_uint8x32(_mm256_shuffle_epi32(abcd, _MM_SHUFFLE(3, 1, 2, 0))); +} + +inline v_uint8x32 v_pack_b(const v_uint64x4& a, const v_uint64x4& b, const v_uint64x4& c, + const v_uint64x4& d, const v_uint64x4& e, const v_uint64x4& f, + const v_uint64x4& g, const v_uint64x4& h) +{ + __m256i ab = _mm256_packs_epi32(a.val, b.val); + __m256i cd = _mm256_packs_epi32(c.val, d.val); + __m256i ef = _mm256_packs_epi32(e.val, f.val); + __m256i gh = _mm256_packs_epi32(g.val, h.val); + + __m256i abcd = _mm256_packs_epi32(ab, cd); + __m256i efgh = _mm256_packs_epi32(ef, gh); + __m256i pkall = _v256_shuffle_odd_64(_mm256_packs_epi16(abcd, efgh)); + + __m256i rev = _mm256_alignr_epi8(pkall, pkall, 8); + return v_uint8x32(_mm256_unpacklo_epi16(pkall, rev)); +} + +/* Recombine */ +// its up there with load and store operations + +/* Extract */ +#define OPENCV_HAL_IMPL_AVX_EXTRACT(_Tpvec) \ + template \ + inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ + { return v_rotate_right(a, b); } + +OPENCV_HAL_IMPL_AVX_EXTRACT(v_uint8x32) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_int8x32) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_uint16x16) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_int16x16) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_uint32x8) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_int32x8) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_uint64x4) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_int64x4) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_float32x8) +OPENCV_HAL_IMPL_AVX_EXTRACT(v_float64x4) + +template +inline uchar v_extract_n(v_uint8x32 a) +{ + return (uchar)_v256_extract_epi8(a.val); +} + +template +inline schar v_extract_n(v_int8x32 a) +{ + return (schar)v_extract_n(v_reinterpret_as_u8(a)); +} + +template +inline ushort v_extract_n(v_uint16x16 a) +{ + return (ushort)_v256_extract_epi16(a.val); +} + +template +inline short v_extract_n(v_int16x16 a) +{ + return (short)v_extract_n(v_reinterpret_as_u16(a)); +} + +template +inline uint v_extract_n(v_uint32x8 a) +{ + return (uint)_v256_extract_epi32(a.val); +} + +template +inline int v_extract_n(v_int32x8 a) +{ + return (int)v_extract_n(v_reinterpret_as_u32(a)); +} + +template +inline uint64 v_extract_n(v_uint64x4 a) +{ + return (uint64)_v256_extract_epi64(a.val); +} + +template +inline int64 v_extract_n(v_int64x4 v) +{ + return (int64)v_extract_n(v_reinterpret_as_u64(v)); +} + +template +inline float v_extract_n(v_float32x8 v) +{ + union { uint iv; float fv; } d; + d.iv = v_extract_n(v_reinterpret_as_u32(v)); + return d.fv; +} + +template +inline double v_extract_n(v_float64x4 v) +{ + union { uint64 iv; double dv; } d; + d.iv = v_extract_n(v_reinterpret_as_u64(v)); + return d.dv; +} + +template +inline v_uint32x8 v_broadcast_element(v_uint32x8 a) +{ + static const __m256i perm = _mm256_set1_epi32((char)i); + return v_uint32x8(_mm256_permutevar8x32_epi32(a.val, perm)); +} + +template +inline v_int32x8 v_broadcast_element(const v_int32x8 &a) +{ return v_reinterpret_as_s32(v_broadcast_element(v_reinterpret_as_u32(a))); } + +template +inline v_float32x8 v_broadcast_element(const v_float32x8 &a) +{ return v_reinterpret_as_f32(v_broadcast_element(v_reinterpret_as_u32(a))); } + + +///////////////////// load deinterleave ///////////////////////////// + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x32& a, v_uint8x32& b ) +{ + __m256i ab0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i ab1 = _mm256_loadu_si256((const __m256i*)(ptr + 32)); + + const __m256i sh = _mm256_setr_epi8(0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, + 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15); + __m256i p0 = _mm256_shuffle_epi8(ab0, sh); + __m256i p1 = _mm256_shuffle_epi8(ab1, sh); + __m256i pl = _mm256_permute2x128_si256(p0, p1, 0 + 2*16); + __m256i ph = _mm256_permute2x128_si256(p0, p1, 1 + 3*16); + __m256i a0 = _mm256_unpacklo_epi64(pl, ph); + __m256i b0 = _mm256_unpackhi_epi64(pl, ph); + a = v_uint8x32(a0); + b = v_uint8x32(b0); +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x16& a, v_uint16x16& b ) +{ + __m256i ab0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i ab1 = _mm256_loadu_si256((const __m256i*)(ptr + 16)); + + const __m256i sh = _mm256_setr_epi8(0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15, + 0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15); + __m256i p0 = _mm256_shuffle_epi8(ab0, sh); + __m256i p1 = _mm256_shuffle_epi8(ab1, sh); + __m256i pl = _mm256_permute2x128_si256(p0, p1, 0 + 2*16); + __m256i ph = _mm256_permute2x128_si256(p0, p1, 1 + 3*16); + __m256i a0 = _mm256_unpacklo_epi64(pl, ph); + __m256i b0 = _mm256_unpackhi_epi64(pl, ph); + a = v_uint16x16(a0); + b = v_uint16x16(b0); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b ) +{ + __m256i ab0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i ab1 = _mm256_loadu_si256((const __m256i*)(ptr + 8)); + + enum { sh = 0+2*4+1*16+3*64 }; + __m256i p0 = _mm256_shuffle_epi32(ab0, sh); + __m256i p1 = _mm256_shuffle_epi32(ab1, sh); + __m256i pl = _mm256_permute2x128_si256(p0, p1, 0 + 2*16); + __m256i ph = _mm256_permute2x128_si256(p0, p1, 1 + 3*16); + __m256i a0 = _mm256_unpacklo_epi64(pl, ph); + __m256i b0 = _mm256_unpackhi_epi64(pl, ph); + a = v_uint32x8(a0); + b = v_uint32x8(b0); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b ) +{ + __m256i ab0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i ab1 = _mm256_loadu_si256((const __m256i*)(ptr + 4)); + + __m256i pl = _mm256_permute2x128_si256(ab0, ab1, 0 + 2*16); + __m256i ph = _mm256_permute2x128_si256(ab0, ab1, 1 + 3*16); + __m256i a0 = _mm256_unpacklo_epi64(pl, ph); + __m256i b0 = _mm256_unpackhi_epi64(pl, ph); + a = v_uint64x4(a0); + b = v_uint64x4(b0); +} + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x32& a, v_uint8x32& b, v_uint8x32& c ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 32)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 64)); + + __m256i s02_low = _mm256_permute2x128_si256(bgr0, bgr2, 0 + 2*16); + __m256i s02_high = _mm256_permute2x128_si256(bgr0, bgr2, 1 + 3*16); + + const __m256i m0 = _mm256_setr_epi8(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, + 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + const __m256i m1 = _mm256_setr_epi8(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, + -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); + + __m256i b0 = _mm256_blendv_epi8(_mm256_blendv_epi8(s02_low, s02_high, m0), bgr1, m1); + __m256i g0 = _mm256_blendv_epi8(_mm256_blendv_epi8(s02_high, s02_low, m1), bgr1, m0); + __m256i r0 = _mm256_blendv_epi8(_mm256_blendv_epi8(bgr1, s02_low, m0), s02_high, m1); + + const __m256i + sh_b = _mm256_setr_epi8(0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13, + 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13), + sh_g = _mm256_setr_epi8(1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, + 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14), + sh_r = _mm256_setr_epi8(2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, + 2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15); + b0 = _mm256_shuffle_epi8(b0, sh_b); + g0 = _mm256_shuffle_epi8(g0, sh_g); + r0 = _mm256_shuffle_epi8(r0, sh_r); + + a = v_uint8x32(b0); + b = v_uint8x32(g0); + c = v_uint8x32(r0); +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x16& a, v_uint16x16& b, v_uint16x16& c ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 16)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 32)); + + __m256i s02_low = _mm256_permute2x128_si256(bgr0, bgr2, 0 + 2*16); + __m256i s02_high = _mm256_permute2x128_si256(bgr0, bgr2, 1 + 3*16); + + const __m256i m0 = _mm256_setr_epi8(0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0); + const __m256i m1 = _mm256_setr_epi8(0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0); + __m256i b0 = _mm256_blendv_epi8(_mm256_blendv_epi8(s02_low, s02_high, m0), bgr1, m1); + __m256i g0 = _mm256_blendv_epi8(_mm256_blendv_epi8(bgr1, s02_low, m0), s02_high, m1); + __m256i r0 = _mm256_blendv_epi8(_mm256_blendv_epi8(s02_high, s02_low, m1), bgr1, m0); + const __m256i sh_b = _mm256_setr_epi8(0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m256i sh_g = _mm256_setr_epi8(2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, + 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 0, 1, 6, 7, 12, 13); + const __m256i sh_r = _mm256_setr_epi8(4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + b0 = _mm256_shuffle_epi8(b0, sh_b); + g0 = _mm256_shuffle_epi8(g0, sh_g); + r0 = _mm256_shuffle_epi8(r0, sh_r); + + a = v_uint16x16(b0); + b = v_uint16x16(g0); + c = v_uint16x16(r0); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b, v_uint32x8& c ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 8)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 16)); + + __m256i s02_low = _mm256_permute2x128_si256(bgr0, bgr2, 0 + 2*16); + __m256i s02_high = _mm256_permute2x128_si256(bgr0, bgr2, 1 + 3*16); + + __m256i b0 = _mm256_blend_epi32(_mm256_blend_epi32(s02_low, s02_high, 0x24), bgr1, 0x92); + __m256i g0 = _mm256_blend_epi32(_mm256_blend_epi32(s02_high, s02_low, 0x92), bgr1, 0x24); + __m256i r0 = _mm256_blend_epi32(_mm256_blend_epi32(bgr1, s02_low, 0x24), s02_high, 0x92); + + b0 = _mm256_shuffle_epi32(b0, 0x6c); + g0 = _mm256_shuffle_epi32(g0, 0xb1); + r0 = _mm256_shuffle_epi32(r0, 0xc6); + + a = v_uint32x8(b0); + b = v_uint32x8(g0); + c = v_uint32x8(r0); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b, v_uint64x4& c ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 4)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 8)); + + __m256i s01 = _mm256_blend_epi32(bgr0, bgr1, 0xf0); + __m256i s12 = _mm256_blend_epi32(bgr1, bgr2, 0xf0); + __m256i s20r = _mm256_permute4x64_epi64(_mm256_blend_epi32(bgr2, bgr0, 0xf0), 0x1b); + __m256i b0 = _mm256_unpacklo_epi64(s01, s20r); + __m256i g0 = _mm256_alignr_epi8(s12, s01, 8); + __m256i r0 = _mm256_unpackhi_epi64(s20r, s12); + + a = v_uint64x4(b0); + b = v_uint64x4(g0); + c = v_uint64x4(r0); +} + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x32& a, v_uint8x32& b, v_uint8x32& c, v_uint8x32& d ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 32)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 64)); + __m256i bgr3 = _mm256_loadu_si256((const __m256i*)(ptr + 96)); + const __m256i sh = _mm256_setr_epi8(0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, + 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15); + + __m256i p0 = _mm256_shuffle_epi8(bgr0, sh); + __m256i p1 = _mm256_shuffle_epi8(bgr1, sh); + __m256i p2 = _mm256_shuffle_epi8(bgr2, sh); + __m256i p3 = _mm256_shuffle_epi8(bgr3, sh); + + __m256i p01l = _mm256_unpacklo_epi32(p0, p1); + __m256i p01h = _mm256_unpackhi_epi32(p0, p1); + __m256i p23l = _mm256_unpacklo_epi32(p2, p3); + __m256i p23h = _mm256_unpackhi_epi32(p2, p3); + + __m256i pll = _mm256_permute2x128_si256(p01l, p23l, 0 + 2*16); + __m256i plh = _mm256_permute2x128_si256(p01l, p23l, 1 + 3*16); + __m256i phl = _mm256_permute2x128_si256(p01h, p23h, 0 + 2*16); + __m256i phh = _mm256_permute2x128_si256(p01h, p23h, 1 + 3*16); + + __m256i b0 = _mm256_unpacklo_epi32(pll, plh); + __m256i g0 = _mm256_unpackhi_epi32(pll, plh); + __m256i r0 = _mm256_unpacklo_epi32(phl, phh); + __m256i a0 = _mm256_unpackhi_epi32(phl, phh); + + a = v_uint8x32(b0); + b = v_uint8x32(g0); + c = v_uint8x32(r0); + d = v_uint8x32(a0); +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x16& a, v_uint16x16& b, v_uint16x16& c, v_uint16x16& d ) +{ + __m256i bgr0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgr1 = _mm256_loadu_si256((const __m256i*)(ptr + 16)); + __m256i bgr2 = _mm256_loadu_si256((const __m256i*)(ptr + 32)); + __m256i bgr3 = _mm256_loadu_si256((const __m256i*)(ptr + 48)); + const __m256i sh = _mm256_setr_epi8(0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15, + 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15); + __m256i p0 = _mm256_shuffle_epi8(bgr0, sh); + __m256i p1 = _mm256_shuffle_epi8(bgr1, sh); + __m256i p2 = _mm256_shuffle_epi8(bgr2, sh); + __m256i p3 = _mm256_shuffle_epi8(bgr3, sh); + + __m256i p01l = _mm256_unpacklo_epi32(p0, p1); + __m256i p01h = _mm256_unpackhi_epi32(p0, p1); + __m256i p23l = _mm256_unpacklo_epi32(p2, p3); + __m256i p23h = _mm256_unpackhi_epi32(p2, p3); + + __m256i pll = _mm256_permute2x128_si256(p01l, p23l, 0 + 2*16); + __m256i plh = _mm256_permute2x128_si256(p01l, p23l, 1 + 3*16); + __m256i phl = _mm256_permute2x128_si256(p01h, p23h, 0 + 2*16); + __m256i phh = _mm256_permute2x128_si256(p01h, p23h, 1 + 3*16); + + __m256i b0 = _mm256_unpacklo_epi32(pll, plh); + __m256i g0 = _mm256_unpackhi_epi32(pll, plh); + __m256i r0 = _mm256_unpacklo_epi32(phl, phh); + __m256i a0 = _mm256_unpackhi_epi32(phl, phh); + + a = v_uint16x16(b0); + b = v_uint16x16(g0); + c = v_uint16x16(r0); + d = v_uint16x16(a0); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b, v_uint32x8& c, v_uint32x8& d ) +{ + __m256i p0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i p1 = _mm256_loadu_si256((const __m256i*)(ptr + 8)); + __m256i p2 = _mm256_loadu_si256((const __m256i*)(ptr + 16)); + __m256i p3 = _mm256_loadu_si256((const __m256i*)(ptr + 24)); + + __m256i p01l = _mm256_unpacklo_epi32(p0, p1); + __m256i p01h = _mm256_unpackhi_epi32(p0, p1); + __m256i p23l = _mm256_unpacklo_epi32(p2, p3); + __m256i p23h = _mm256_unpackhi_epi32(p2, p3); + + __m256i pll = _mm256_permute2x128_si256(p01l, p23l, 0 + 2*16); + __m256i plh = _mm256_permute2x128_si256(p01l, p23l, 1 + 3*16); + __m256i phl = _mm256_permute2x128_si256(p01h, p23h, 0 + 2*16); + __m256i phh = _mm256_permute2x128_si256(p01h, p23h, 1 + 3*16); + + __m256i b0 = _mm256_unpacklo_epi32(pll, plh); + __m256i g0 = _mm256_unpackhi_epi32(pll, plh); + __m256i r0 = _mm256_unpacklo_epi32(phl, phh); + __m256i a0 = _mm256_unpackhi_epi32(phl, phh); + + a = v_uint32x8(b0); + b = v_uint32x8(g0); + c = v_uint32x8(r0); + d = v_uint32x8(a0); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b, v_uint64x4& c, v_uint64x4& d ) +{ + __m256i bgra0 = _mm256_loadu_si256((const __m256i*)ptr); + __m256i bgra1 = _mm256_loadu_si256((const __m256i*)(ptr + 4)); + __m256i bgra2 = _mm256_loadu_si256((const __m256i*)(ptr + 8)); + __m256i bgra3 = _mm256_loadu_si256((const __m256i*)(ptr + 12)); + + __m256i l02 = _mm256_permute2x128_si256(bgra0, bgra2, 0 + 2*16); + __m256i h02 = _mm256_permute2x128_si256(bgra0, bgra2, 1 + 3*16); + __m256i l13 = _mm256_permute2x128_si256(bgra1, bgra3, 0 + 2*16); + __m256i h13 = _mm256_permute2x128_si256(bgra1, bgra3, 1 + 3*16); + + __m256i b0 = _mm256_unpacklo_epi64(l02, l13); + __m256i g0 = _mm256_unpackhi_epi64(l02, l13); + __m256i r0 = _mm256_unpacklo_epi64(h02, h13); + __m256i a0 = _mm256_unpackhi_epi64(h02, h13); + + a = v_uint64x4(b0); + b = v_uint64x4(g0); + c = v_uint64x4(r0); + d = v_uint64x4(a0); +} + +///////////////////////////// store interleave ///////////////////////////////////// + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& x, const v_uint8x32& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = _mm256_unpacklo_epi8(x.val, y.val); + __m256i xy_h = _mm256_unpackhi_epi8(x.val, y.val); + + __m256i xy0 = _mm256_permute2x128_si256(xy_l, xy_h, 0 + 2*16); + __m256i xy1 = _mm256_permute2x128_si256(xy_l, xy_h, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, xy0); + _mm256_stream_si256((__m256i*)(ptr + 32), xy1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, xy0); + _mm256_store_si256((__m256i*)(ptr + 32), xy1); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, xy0); + _mm256_storeu_si256((__m256i*)(ptr + 32), xy1); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& x, const v_uint16x16& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = _mm256_unpacklo_epi16(x.val, y.val); + __m256i xy_h = _mm256_unpackhi_epi16(x.val, y.val); + + __m256i xy0 = _mm256_permute2x128_si256(xy_l, xy_h, 0 + 2*16); + __m256i xy1 = _mm256_permute2x128_si256(xy_l, xy_h, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, xy0); + _mm256_stream_si256((__m256i*)(ptr + 16), xy1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, xy0); + _mm256_store_si256((__m256i*)(ptr + 16), xy1); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, xy0); + _mm256_storeu_si256((__m256i*)(ptr + 16), xy1); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& x, const v_uint32x8& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = _mm256_unpacklo_epi32(x.val, y.val); + __m256i xy_h = _mm256_unpackhi_epi32(x.val, y.val); + + __m256i xy0 = _mm256_permute2x128_si256(xy_l, xy_h, 0 + 2*16); + __m256i xy1 = _mm256_permute2x128_si256(xy_l, xy_h, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, xy0); + _mm256_stream_si256((__m256i*)(ptr + 8), xy1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, xy0); + _mm256_store_si256((__m256i*)(ptr + 8), xy1); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, xy0); + _mm256_storeu_si256((__m256i*)(ptr + 8), xy1); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& x, const v_uint64x4& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = _mm256_unpacklo_epi64(x.val, y.val); + __m256i xy_h = _mm256_unpackhi_epi64(x.val, y.val); + + __m256i xy0 = _mm256_permute2x128_si256(xy_l, xy_h, 0 + 2*16); + __m256i xy1 = _mm256_permute2x128_si256(xy_l, xy_h, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, xy0); + _mm256_stream_si256((__m256i*)(ptr + 4), xy1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, xy0); + _mm256_store_si256((__m256i*)(ptr + 4), xy1); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, xy0); + _mm256_storeu_si256((__m256i*)(ptr + 4), xy1); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& a, const v_uint8x32& b, const v_uint8x32& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + const __m256i sh_b = _mm256_setr_epi8( + 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5, + 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5); + const __m256i sh_g = _mm256_setr_epi8( + 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, + 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10); + const __m256i sh_r = _mm256_setr_epi8( + 10, 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, + 10, 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15); + + __m256i b0 = _mm256_shuffle_epi8(a.val, sh_b); + __m256i g0 = _mm256_shuffle_epi8(b.val, sh_g); + __m256i r0 = _mm256_shuffle_epi8(c.val, sh_r); + + const __m256i m0 = _mm256_setr_epi8(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, + 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + const __m256i m1 = _mm256_setr_epi8(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, + 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); + + __m256i p0 = _mm256_blendv_epi8(_mm256_blendv_epi8(b0, g0, m0), r0, m1); + __m256i p1 = _mm256_blendv_epi8(_mm256_blendv_epi8(g0, r0, m0), b0, m1); + __m256i p2 = _mm256_blendv_epi8(_mm256_blendv_epi8(r0, b0, m0), g0, m1); + + __m256i bgr0 = _mm256_permute2x128_si256(p0, p1, 0 + 2*16); + __m256i bgr1 = _mm256_permute2x128_si256(p2, p0, 0 + 3*16); + __m256i bgr2 = _mm256_permute2x128_si256(p1, p2, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgr0); + _mm256_stream_si256((__m256i*)(ptr + 32), bgr1); + _mm256_stream_si256((__m256i*)(ptr + 64), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgr0); + _mm256_store_si256((__m256i*)(ptr + 32), bgr1); + _mm256_store_si256((__m256i*)(ptr + 64), bgr2); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgr0); + _mm256_storeu_si256((__m256i*)(ptr + 32), bgr1); + _mm256_storeu_si256((__m256i*)(ptr + 64), bgr2); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& a, const v_uint16x16& b, const v_uint16x16& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + const __m256i sh_b = _mm256_setr_epi8( + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m256i sh_g = _mm256_setr_epi8( + 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, + 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5); + const __m256i sh_r = _mm256_setr_epi8( + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + + __m256i b0 = _mm256_shuffle_epi8(a.val, sh_b); + __m256i g0 = _mm256_shuffle_epi8(b.val, sh_g); + __m256i r0 = _mm256_shuffle_epi8(c.val, sh_r); + + const __m256i m0 = _mm256_setr_epi8(0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0); + const __m256i m1 = _mm256_setr_epi8(0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0); + + __m256i p0 = _mm256_blendv_epi8(_mm256_blendv_epi8(b0, g0, m0), r0, m1); + __m256i p1 = _mm256_blendv_epi8(_mm256_blendv_epi8(g0, r0, m0), b0, m1); + __m256i p2 = _mm256_blendv_epi8(_mm256_blendv_epi8(r0, b0, m0), g0, m1); + + __m256i bgr0 = _mm256_permute2x128_si256(p0, p2, 0 + 2*16); + //__m256i bgr1 = p1; + __m256i bgr2 = _mm256_permute2x128_si256(p0, p2, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgr0); + _mm256_stream_si256((__m256i*)(ptr + 16), p1); + _mm256_stream_si256((__m256i*)(ptr + 32), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgr0); + _mm256_store_si256((__m256i*)(ptr + 16), p1); + _mm256_store_si256((__m256i*)(ptr + 32), bgr2); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgr0); + _mm256_storeu_si256((__m256i*)(ptr + 16), p1); + _mm256_storeu_si256((__m256i*)(ptr + 32), bgr2); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& a, const v_uint32x8& b, const v_uint32x8& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i b0 = _mm256_shuffle_epi32(a.val, 0x6c); + __m256i g0 = _mm256_shuffle_epi32(b.val, 0xb1); + __m256i r0 = _mm256_shuffle_epi32(c.val, 0xc6); + + __m256i p0 = _mm256_blend_epi32(_mm256_blend_epi32(b0, g0, 0x92), r0, 0x24); + __m256i p1 = _mm256_blend_epi32(_mm256_blend_epi32(g0, r0, 0x92), b0, 0x24); + __m256i p2 = _mm256_blend_epi32(_mm256_blend_epi32(r0, b0, 0x92), g0, 0x24); + + __m256i bgr0 = _mm256_permute2x128_si256(p0, p1, 0 + 2*16); + //__m256i bgr1 = p2; + __m256i bgr2 = _mm256_permute2x128_si256(p0, p1, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgr0); + _mm256_stream_si256((__m256i*)(ptr + 8), p2); + _mm256_stream_si256((__m256i*)(ptr + 16), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgr0); + _mm256_store_si256((__m256i*)(ptr + 8), p2); + _mm256_store_si256((__m256i*)(ptr + 16), bgr2); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgr0); + _mm256_storeu_si256((__m256i*)(ptr + 8), p2); + _mm256_storeu_si256((__m256i*)(ptr + 16), bgr2); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& a, const v_uint64x4& b, const v_uint64x4& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i s01 = _mm256_unpacklo_epi64(a.val, b.val); + __m256i s12 = _mm256_unpackhi_epi64(b.val, c.val); + __m256i s20 = _mm256_blend_epi32(c.val, a.val, 0xcc); + + __m256i bgr0 = _mm256_permute2x128_si256(s01, s20, 0 + 2*16); + __m256i bgr1 = _mm256_blend_epi32(s01, s12, 0x0f); + __m256i bgr2 = _mm256_permute2x128_si256(s20, s12, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgr0); + _mm256_stream_si256((__m256i*)(ptr + 4), bgr1); + _mm256_stream_si256((__m256i*)(ptr + 8), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgr0); + _mm256_store_si256((__m256i*)(ptr + 4), bgr1); + _mm256_store_si256((__m256i*)(ptr + 8), bgr2); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgr0); + _mm256_storeu_si256((__m256i*)(ptr + 4), bgr1); + _mm256_storeu_si256((__m256i*)(ptr + 8), bgr2); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& a, const v_uint8x32& b, + const v_uint8x32& c, const v_uint8x32& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = _mm256_unpacklo_epi8(a.val, b.val); + __m256i bg1 = _mm256_unpackhi_epi8(a.val, b.val); + __m256i ra0 = _mm256_unpacklo_epi8(c.val, d.val); + __m256i ra1 = _mm256_unpackhi_epi8(c.val, d.val); + + __m256i bgra0_ = _mm256_unpacklo_epi16(bg0, ra0); + __m256i bgra1_ = _mm256_unpackhi_epi16(bg0, ra0); + __m256i bgra2_ = _mm256_unpacklo_epi16(bg1, ra1); + __m256i bgra3_ = _mm256_unpackhi_epi16(bg1, ra1); + + __m256i bgra0 = _mm256_permute2x128_si256(bgra0_, bgra1_, 0 + 2*16); + __m256i bgra2 = _mm256_permute2x128_si256(bgra0_, bgra1_, 1 + 3*16); + __m256i bgra1 = _mm256_permute2x128_si256(bgra2_, bgra3_, 0 + 2*16); + __m256i bgra3 = _mm256_permute2x128_si256(bgra2_, bgra3_, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgra0); + _mm256_stream_si256((__m256i*)(ptr + 32), bgra1); + _mm256_stream_si256((__m256i*)(ptr + 64), bgra2); + _mm256_stream_si256((__m256i*)(ptr + 96), bgra3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgra0); + _mm256_store_si256((__m256i*)(ptr + 32), bgra1); + _mm256_store_si256((__m256i*)(ptr + 64), bgra2); + _mm256_store_si256((__m256i*)(ptr + 96), bgra3); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgra0); + _mm256_storeu_si256((__m256i*)(ptr + 32), bgra1); + _mm256_storeu_si256((__m256i*)(ptr + 64), bgra2); + _mm256_storeu_si256((__m256i*)(ptr + 96), bgra3); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& a, const v_uint16x16& b, + const v_uint16x16& c, const v_uint16x16& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = _mm256_unpacklo_epi16(a.val, b.val); + __m256i bg1 = _mm256_unpackhi_epi16(a.val, b.val); + __m256i ra0 = _mm256_unpacklo_epi16(c.val, d.val); + __m256i ra1 = _mm256_unpackhi_epi16(c.val, d.val); + + __m256i bgra0_ = _mm256_unpacklo_epi32(bg0, ra0); + __m256i bgra1_ = _mm256_unpackhi_epi32(bg0, ra0); + __m256i bgra2_ = _mm256_unpacklo_epi32(bg1, ra1); + __m256i bgra3_ = _mm256_unpackhi_epi32(bg1, ra1); + + __m256i bgra0 = _mm256_permute2x128_si256(bgra0_, bgra1_, 0 + 2*16); + __m256i bgra2 = _mm256_permute2x128_si256(bgra0_, bgra1_, 1 + 3*16); + __m256i bgra1 = _mm256_permute2x128_si256(bgra2_, bgra3_, 0 + 2*16); + __m256i bgra3 = _mm256_permute2x128_si256(bgra2_, bgra3_, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgra0); + _mm256_stream_si256((__m256i*)(ptr + 16), bgra1); + _mm256_stream_si256((__m256i*)(ptr + 32), bgra2); + _mm256_stream_si256((__m256i*)(ptr + 48), bgra3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgra0); + _mm256_store_si256((__m256i*)(ptr + 16), bgra1); + _mm256_store_si256((__m256i*)(ptr + 32), bgra2); + _mm256_store_si256((__m256i*)(ptr + 48), bgra3); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgra0); + _mm256_storeu_si256((__m256i*)(ptr + 16), bgra1); + _mm256_storeu_si256((__m256i*)(ptr + 32), bgra2); + _mm256_storeu_si256((__m256i*)(ptr + 48), bgra3); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& a, const v_uint32x8& b, + const v_uint32x8& c, const v_uint32x8& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = _mm256_unpacklo_epi32(a.val, b.val); + __m256i bg1 = _mm256_unpackhi_epi32(a.val, b.val); + __m256i ra0 = _mm256_unpacklo_epi32(c.val, d.val); + __m256i ra1 = _mm256_unpackhi_epi32(c.val, d.val); + + __m256i bgra0_ = _mm256_unpacklo_epi64(bg0, ra0); + __m256i bgra1_ = _mm256_unpackhi_epi64(bg0, ra0); + __m256i bgra2_ = _mm256_unpacklo_epi64(bg1, ra1); + __m256i bgra3_ = _mm256_unpackhi_epi64(bg1, ra1); + + __m256i bgra0 = _mm256_permute2x128_si256(bgra0_, bgra1_, 0 + 2*16); + __m256i bgra2 = _mm256_permute2x128_si256(bgra0_, bgra1_, 1 + 3*16); + __m256i bgra1 = _mm256_permute2x128_si256(bgra2_, bgra3_, 0 + 2*16); + __m256i bgra3 = _mm256_permute2x128_si256(bgra2_, bgra3_, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgra0); + _mm256_stream_si256((__m256i*)(ptr + 8), bgra1); + _mm256_stream_si256((__m256i*)(ptr + 16), bgra2); + _mm256_stream_si256((__m256i*)(ptr + 24), bgra3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgra0); + _mm256_store_si256((__m256i*)(ptr + 8), bgra1); + _mm256_store_si256((__m256i*)(ptr + 16), bgra2); + _mm256_store_si256((__m256i*)(ptr + 24), bgra3); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgra0); + _mm256_storeu_si256((__m256i*)(ptr + 8), bgra1); + _mm256_storeu_si256((__m256i*)(ptr + 16), bgra2); + _mm256_storeu_si256((__m256i*)(ptr + 24), bgra3); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& a, const v_uint64x4& b, + const v_uint64x4& c, const v_uint64x4& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = _mm256_unpacklo_epi64(a.val, b.val); + __m256i bg1 = _mm256_unpackhi_epi64(a.val, b.val); + __m256i ra0 = _mm256_unpacklo_epi64(c.val, d.val); + __m256i ra1 = _mm256_unpackhi_epi64(c.val, d.val); + + __m256i bgra0 = _mm256_permute2x128_si256(bg0, ra0, 0 + 2*16); + __m256i bgra1 = _mm256_permute2x128_si256(bg1, ra1, 0 + 2*16); + __m256i bgra2 = _mm256_permute2x128_si256(bg0, ra0, 1 + 3*16); + __m256i bgra3 = _mm256_permute2x128_si256(bg1, ra1, 1 + 3*16); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm256_stream_si256((__m256i*)ptr, bgra0); + _mm256_stream_si256((__m256i*)(ptr + 4), bgra1); + _mm256_stream_si256((__m256i*)(ptr + 8), bgra2); + _mm256_stream_si256((__m256i*)(ptr + 12), bgra3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm256_store_si256((__m256i*)ptr, bgra0); + _mm256_store_si256((__m256i*)(ptr + 4), bgra1); + _mm256_store_si256((__m256i*)(ptr + 8), bgra2); + _mm256_store_si256((__m256i*)(ptr + 12), bgra3); + } + else + { + _mm256_storeu_si256((__m256i*)ptr, bgra0); + _mm256_storeu_si256((__m256i*)(ptr + 4), bgra1); + _mm256_storeu_si256((__m256i*)(ptr + 8), bgra2); + _mm256_storeu_si256((__m256i*)(ptr + 12), bgra3); + } +} + +#define OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0 ) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0 ) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0, _Tpvec0& d0 ) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, const _Tpvec0& c0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1, mode); \ +} + +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_int8x32, schar, s8, v_uint8x32, uchar, u8) +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_int16x16, short, s16, v_uint16x16, ushort, u16) +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_int32x8, int, s32, v_uint32x8, unsigned, u32) +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_float32x8, float, f32, v_uint32x8, unsigned, u32) +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_int64x4, int64, s64, v_uint64x4, uint64, u64) +OPENCV_HAL_IMPL_AVX_LOADSTORE_INTERLEAVE(v_float64x4, double, f64, v_uint64x4, uint64, u64) + +// +// FP16 +// + +inline v_float32x8 v256_load_expand(const float16_t* ptr) +{ +#if CV_FP16 + return v_float32x8(_mm256_cvtph_ps(_mm_loadu_si128((const __m128i*)ptr))); +#else + float CV_DECL_ALIGNED(32) buf[8]; + for (int i = 0; i < 8; i++) + buf[i] = (float)ptr[i]; + return v256_load_aligned(buf); +#endif +} + +inline void v_pack_store(float16_t* ptr, const v_float32x8& a) +{ +#if CV_FP16 + __m128i ah = _mm256_cvtps_ph(a.val, 0); + _mm_storeu_si128((__m128i*)ptr, ah); +#else + float CV_DECL_ALIGNED(32) buf[8]; + v_store_aligned(buf, a); + for (int i = 0; i < 8; i++) + ptr[i] = float16_t(buf[i]); +#endif +} + +// +// end of FP16 +// + +inline void v256_cleanup() { _mm256_zeroall(); } + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: + +#endif // OPENCV_HAL_INTRIN_AVX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx512.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx512.hpp new file mode 100644 index 0000000..d20d6dd --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_avx512.hpp @@ -0,0 +1,3090 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_INTRIN_AVX512_HPP +#define OPENCV_HAL_INTRIN_AVX512_HPP + +#if defined(_MSC_VER) && (_MSC_VER < 1920/*MSVS2019*/) +# pragma warning(disable:4146) // unary minus operator applied to unsigned type, result still unsigned +# pragma warning(disable:4309) // 'argument': truncation of constant value +# pragma warning(disable:4310) // cast truncates constant value +#endif + +#define CVT_ROUND_MODES_IMPLEMENTED 0 + +#define CV_SIMD512 1 +#define CV_SIMD512_64F 1 +#define CV_SIMD512_FP16 0 // no native operations with FP16 type. Only load/store from float32x8 are available (if CV_FP16 == 1) + +#define _v512_set_epu64(a7, a6, a5, a4, a3, a2, a1, a0) _mm512_set_epi64((int64)(a7),(int64)(a6),(int64)(a5),(int64)(a4),(int64)(a3),(int64)(a2),(int64)(a1),(int64)(a0)) +#define _v512_set_epu32(a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, a0) \ + _mm512_set_epi64(((int64)(a15)<<32)|(int64)(a14), ((int64)(a13)<<32)|(int64)(a12), ((int64)(a11)<<32)|(int64)(a10), ((int64)( a9)<<32)|(int64)( a8), \ + ((int64)( a7)<<32)|(int64)( a6), ((int64)( a5)<<32)|(int64)( a4), ((int64)( a3)<<32)|(int64)( a2), ((int64)( a1)<<32)|(int64)( a0)) +#define _v512_set_epu16(a31, a30, a29, a28, a27, a26, a25, a24, a23, a22, a21, a20, a19, a18, a17, a16, \ + a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, a0) \ + _v512_set_epu32(((unsigned)(a31)<<16)|(unsigned)(a30), ((unsigned)(a29)<<16)|(unsigned)(a28), ((unsigned)(a27)<<16)|(unsigned)(a26), ((unsigned)(a25)<<16)|(unsigned)(a24), \ + ((unsigned)(a23)<<16)|(unsigned)(a22), ((unsigned)(a21)<<16)|(unsigned)(a20), ((unsigned)(a19)<<16)|(unsigned)(a18), ((unsigned)(a17)<<16)|(unsigned)(a16), \ + ((unsigned)(a15)<<16)|(unsigned)(a14), ((unsigned)(a13)<<16)|(unsigned)(a12), ((unsigned)(a11)<<16)|(unsigned)(a10), ((unsigned)( a9)<<16)|(unsigned)( a8), \ + ((unsigned)( a7)<<16)|(unsigned)( a6), ((unsigned)( a5)<<16)|(unsigned)( a4), ((unsigned)( a3)<<16)|(unsigned)( a2), ((unsigned)( a1)<<16)|(unsigned)( a0)) +#define _v512_set_epu8(a63, a62, a61, a60, a59, a58, a57, a56, a55, a54, a53, a52, a51, a50, a49, a48, \ + a47, a46, a45, a44, a43, a42, a41, a40, a39, a38, a37, a36, a35, a34, a33, a32, \ + a31, a30, a29, a28, a27, a26, a25, a24, a23, a22, a21, a20, a19, a18, a17, a16, \ + a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, a0) \ + _v512_set_epu32(((unsigned)(a63)<<24)|((unsigned)(a62)<<16)|((unsigned)(a61)<<8)|(unsigned)(a60),((unsigned)(a59)<<24)|((unsigned)(a58)<<16)|((unsigned)(a57)<<8)|(unsigned)(a56), \ + ((unsigned)(a55)<<24)|((unsigned)(a54)<<16)|((unsigned)(a53)<<8)|(unsigned)(a52),((unsigned)(a51)<<24)|((unsigned)(a50)<<16)|((unsigned)(a49)<<8)|(unsigned)(a48), \ + ((unsigned)(a47)<<24)|((unsigned)(a46)<<16)|((unsigned)(a45)<<8)|(unsigned)(a44),((unsigned)(a43)<<24)|((unsigned)(a42)<<16)|((unsigned)(a41)<<8)|(unsigned)(a40), \ + ((unsigned)(a39)<<24)|((unsigned)(a38)<<16)|((unsigned)(a37)<<8)|(unsigned)(a36),((unsigned)(a35)<<24)|((unsigned)(a34)<<16)|((unsigned)(a33)<<8)|(unsigned)(a32), \ + ((unsigned)(a31)<<24)|((unsigned)(a30)<<16)|((unsigned)(a29)<<8)|(unsigned)(a28),((unsigned)(a27)<<24)|((unsigned)(a26)<<16)|((unsigned)(a25)<<8)|(unsigned)(a24), \ + ((unsigned)(a23)<<24)|((unsigned)(a22)<<16)|((unsigned)(a21)<<8)|(unsigned)(a20),((unsigned)(a19)<<24)|((unsigned)(a18)<<16)|((unsigned)(a17)<<8)|(unsigned)(a16), \ + ((unsigned)(a15)<<24)|((unsigned)(a14)<<16)|((unsigned)(a13)<<8)|(unsigned)(a12),((unsigned)(a11)<<24)|((unsigned)(a10)<<16)|((unsigned)( a9)<<8)|(unsigned)( a8), \ + ((unsigned)( a7)<<24)|((unsigned)( a6)<<16)|((unsigned)( a5)<<8)|(unsigned)( a4),((unsigned)( a3)<<24)|((unsigned)( a2)<<16)|((unsigned)( a1)<<8)|(unsigned)( a0)) +#define _v512_set_epi8(a63, a62, a61, a60, a59, a58, a57, a56, a55, a54, a53, a52, a51, a50, a49, a48, \ + a47, a46, a45, a44, a43, a42, a41, a40, a39, a38, a37, a36, a35, a34, a33, a32, \ + a31, a30, a29, a28, a27, a26, a25, a24, a23, a22, a21, a20, a19, a18, a17, a16, \ + a15, a14, a13, a12, a11, a10, a9, a8, a7, a6, a5, a4, a3, a2, a1, a0) \ + _v512_set_epu8((uchar)(a63), (uchar)(a62), (uchar)(a61), (uchar)(a60), (uchar)(a59), (uchar)(a58), (uchar)(a57), (uchar)(a56), \ + (uchar)(a55), (uchar)(a54), (uchar)(a53), (uchar)(a52), (uchar)(a51), (uchar)(a50), (uchar)(a49), (uchar)(a48), \ + (uchar)(a47), (uchar)(a46), (uchar)(a45), (uchar)(a44), (uchar)(a43), (uchar)(a42), (uchar)(a41), (uchar)(a40), \ + (uchar)(a39), (uchar)(a38), (uchar)(a37), (uchar)(a36), (uchar)(a35), (uchar)(a34), (uchar)(a33), (uchar)(a32), \ + (uchar)(a31), (uchar)(a30), (uchar)(a29), (uchar)(a28), (uchar)(a27), (uchar)(a26), (uchar)(a25), (uchar)(a24), \ + (uchar)(a23), (uchar)(a22), (uchar)(a21), (uchar)(a20), (uchar)(a19), (uchar)(a18), (uchar)(a17), (uchar)(a16), \ + (uchar)(a15), (uchar)(a14), (uchar)(a13), (uchar)(a12), (uchar)(a11), (uchar)(a10), (uchar)( a9), (uchar)( a8), \ + (uchar)( a7), (uchar)( a6), (uchar)( a5), (uchar)( a4), (uchar)( a3), (uchar)( a2), (uchar)( a1), (uchar)( a0)) + +#ifndef _mm512_cvtpd_pslo +#ifdef _mm512_zextsi256_si512 +#define _mm512_cvtpd_pslo(a) _mm512_zextps256_ps512(_mm512_cvtpd_ps(a)) +#else +//if preferred way to extend with zeros is unavailable +#define _mm512_cvtpd_pslo(a) _mm512_castps256_ps512(_mm512_cvtpd_ps(a)) +#endif +#endif +///////// Utils //////////// + +namespace +{ + +inline __m512i _v512_combine(const __m256i& lo, const __m256i& hi) +{ return _mm512_inserti32x8(_mm512_castsi256_si512(lo), hi, 1); } + +inline __m512 _v512_combine(const __m256& lo, const __m256& hi) +{ return _mm512_insertf32x8(_mm512_castps256_ps512(lo), hi, 1); } + +inline __m512d _v512_combine(const __m256d& lo, const __m256d& hi) +{ return _mm512_insertf64x4(_mm512_castpd256_pd512(lo), hi, 1); } + +inline int _v_cvtsi512_si32(const __m512i& a) +{ return _mm_cvtsi128_si32(_mm512_castsi512_si128(a)); } + +inline __m256i _v512_extract_high(const __m512i& v) +{ return _mm512_extracti32x8_epi32(v, 1); } + +inline __m256 _v512_extract_high(const __m512& v) +{ return _mm512_extractf32x8_ps(v, 1); } + +inline __m256d _v512_extract_high(const __m512d& v) +{ return _mm512_extractf64x4_pd(v, 1); } + +inline __m256i _v512_extract_low(const __m512i& v) +{ return _mm512_castsi512_si256(v); } + +inline __m256 _v512_extract_low(const __m512& v) +{ return _mm512_castps512_ps256(v); } + +inline __m256d _v512_extract_low(const __m512d& v) +{ return _mm512_castpd512_pd256(v); } + +inline __m512i _v512_insert(const __m512i& a, const __m256i& b) +{ return _mm512_inserti32x8(a, b, 0); } + +inline __m512 _v512_insert(const __m512& a, const __m256& b) +{ return _mm512_insertf32x8(a, b, 0); } + +inline __m512d _v512_insert(const __m512d& a, const __m256d& b) +{ return _mm512_insertf64x4(a, b, 0); } + +} + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +///////// Types //////////// + +struct v_uint8x64 +{ + typedef uchar lane_type; + enum { nlanes = 64 }; + __m512i val; + + explicit v_uint8x64(__m512i v) : val(v) {} + v_uint8x64(uchar v0, uchar v1, uchar v2, uchar v3, + uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, + uchar v12, uchar v13, uchar v14, uchar v15, + uchar v16, uchar v17, uchar v18, uchar v19, + uchar v20, uchar v21, uchar v22, uchar v23, + uchar v24, uchar v25, uchar v26, uchar v27, + uchar v28, uchar v29, uchar v30, uchar v31, + uchar v32, uchar v33, uchar v34, uchar v35, + uchar v36, uchar v37, uchar v38, uchar v39, + uchar v40, uchar v41, uchar v42, uchar v43, + uchar v44, uchar v45, uchar v46, uchar v47, + uchar v48, uchar v49, uchar v50, uchar v51, + uchar v52, uchar v53, uchar v54, uchar v55, + uchar v56, uchar v57, uchar v58, uchar v59, + uchar v60, uchar v61, uchar v62, uchar v63) + { + val = _v512_set_epu8(v63, v62, v61, v60, v59, v58, v57, v56, v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, v7, v6, v5, v4, v3, v2, v1, v0); + } + v_uint8x64() {} + + static inline v_uint8x64 zero() { return v_uint8x64(_mm512_setzero_si512()); } + + uchar get0() const { return (uchar)_v_cvtsi512_si32(val); } +}; + +struct v_int8x64 +{ + typedef schar lane_type; + enum { nlanes = 64 }; + __m512i val; + + explicit v_int8x64(__m512i v) : val(v) {} + v_int8x64(schar v0, schar v1, schar v2, schar v3, + schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, + schar v12, schar v13, schar v14, schar v15, + schar v16, schar v17, schar v18, schar v19, + schar v20, schar v21, schar v22, schar v23, + schar v24, schar v25, schar v26, schar v27, + schar v28, schar v29, schar v30, schar v31, + schar v32, schar v33, schar v34, schar v35, + schar v36, schar v37, schar v38, schar v39, + schar v40, schar v41, schar v42, schar v43, + schar v44, schar v45, schar v46, schar v47, + schar v48, schar v49, schar v50, schar v51, + schar v52, schar v53, schar v54, schar v55, + schar v56, schar v57, schar v58, schar v59, + schar v60, schar v61, schar v62, schar v63) + { + val = _v512_set_epi8(v63, v62, v61, v60, v59, v58, v57, v56, v55, v54, v53, v52, v51, v50, v49, v48, + v47, v46, v45, v44, v43, v42, v41, v40, v39, v38, v37, v36, v35, v34, v33, v32, + v31, v30, v29, v28, v27, v26, v25, v24, v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, v7, v6, v5, v4, v3, v2, v1, v0); + } + v_int8x64() {} + + static inline v_int8x64 zero() { return v_int8x64(_mm512_setzero_si512()); } + + schar get0() const { return (schar)_v_cvtsi512_si32(val); } +}; + +struct v_uint16x32 +{ + typedef ushort lane_type; + enum { nlanes = 32 }; + __m512i val; + + explicit v_uint16x32(__m512i v) : val(v) {} + v_uint16x32(ushort v0, ushort v1, ushort v2, ushort v3, + ushort v4, ushort v5, ushort v6, ushort v7, + ushort v8, ushort v9, ushort v10, ushort v11, + ushort v12, ushort v13, ushort v14, ushort v15, + ushort v16, ushort v17, ushort v18, ushort v19, + ushort v20, ushort v21, ushort v22, ushort v23, + ushort v24, ushort v25, ushort v26, ushort v27, + ushort v28, ushort v29, ushort v30, ushort v31) + { + val = _v512_set_epu16(v31, v30, v29, v28, v27, v26, v25, v24, v23, v22, v21, v20, v19, v18, v17, v16, + v15, v14, v13, v12, v11, v10, v9, v8, v7, v6, v5, v4, v3, v2, v1, v0); + } + v_uint16x32() {} + + static inline v_uint16x32 zero() { return v_uint16x32(_mm512_setzero_si512()); } + + ushort get0() const { return (ushort)_v_cvtsi512_si32(val); } +}; + +struct v_int16x32 +{ + typedef short lane_type; + enum { nlanes = 32 }; + __m512i val; + + explicit v_int16x32(__m512i v) : val(v) {} + v_int16x32(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7, + short v8, short v9, short v10, short v11, short v12, short v13, short v14, short v15, + short v16, short v17, short v18, short v19, short v20, short v21, short v22, short v23, + short v24, short v25, short v26, short v27, short v28, short v29, short v30, short v31) + { + val = _v512_set_epu16((ushort)v31, (ushort)v30, (ushort)v29, (ushort)v28, (ushort)v27, (ushort)v26, (ushort)v25, (ushort)v24, + (ushort)v23, (ushort)v22, (ushort)v21, (ushort)v20, (ushort)v19, (ushort)v18, (ushort)v17, (ushort)v16, + (ushort)v15, (ushort)v14, (ushort)v13, (ushort)v12, (ushort)v11, (ushort)v10, (ushort)v9 , (ushort)v8, + (ushort)v7 , (ushort)v6 , (ushort)v5 , (ushort)v4 , (ushort)v3 , (ushort)v2 , (ushort)v1 , (ushort)v0); + } + v_int16x32() {} + + static inline v_int16x32 zero() { return v_int16x32(_mm512_setzero_si512()); } + + short get0() const { return (short)_v_cvtsi512_si32(val); } +}; + +struct v_uint32x16 +{ + typedef unsigned lane_type; + enum { nlanes = 16 }; + __m512i val; + + explicit v_uint32x16(__m512i v) : val(v) {} + v_uint32x16(unsigned v0, unsigned v1, unsigned v2, unsigned v3, + unsigned v4, unsigned v5, unsigned v6, unsigned v7, + unsigned v8, unsigned v9, unsigned v10, unsigned v11, + unsigned v12, unsigned v13, unsigned v14, unsigned v15) + { + val = _mm512_setr_epi32((int)v0, (int)v1, (int)v2, (int)v3, (int)v4, (int)v5, (int)v6, (int)v7, + (int)v8, (int)v9, (int)v10, (int)v11, (int)v12, (int)v13, (int)v14, (int)v15); + } + v_uint32x16() {} + + static inline v_uint32x16 zero() { return v_uint32x16(_mm512_setzero_si512()); } + + unsigned get0() const { return (unsigned)_v_cvtsi512_si32(val); } +}; + +struct v_int32x16 +{ + typedef int lane_type; + enum { nlanes = 16 }; + __m512i val; + + explicit v_int32x16(__m512i v) : val(v) {} + v_int32x16(int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, + int v8, int v9, int v10, int v11, int v12, int v13, int v14, int v15) + { + val = _mm512_setr_epi32(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); + } + v_int32x16() {} + + static inline v_int32x16 zero() { return v_int32x16(_mm512_setzero_si512()); } + + int get0() const { return _v_cvtsi512_si32(val); } +}; + +struct v_float32x16 +{ + typedef float lane_type; + enum { nlanes = 16 }; + __m512 val; + + explicit v_float32x16(__m512 v) : val(v) {} + v_float32x16(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, + float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15) + { + val = _mm512_setr_ps(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); + } + v_float32x16() {} + + static inline v_float32x16 zero() { return v_float32x16(_mm512_setzero_ps()); } + + float get0() const { return _mm_cvtss_f32(_mm512_castps512_ps128(val)); } +}; + +struct v_uint64x8 +{ + typedef uint64 lane_type; + enum { nlanes = 8 }; + __m512i val; + + explicit v_uint64x8(__m512i v) : val(v) {} + v_uint64x8(uint64 v0, uint64 v1, uint64 v2, uint64 v3, uint64 v4, uint64 v5, uint64 v6, uint64 v7) + { val = _mm512_setr_epi64((int64)v0, (int64)v1, (int64)v2, (int64)v3, (int64)v4, (int64)v5, (int64)v6, (int64)v7); } + v_uint64x8() {} + + static inline v_uint64x8 zero() { return v_uint64x8(_mm512_setzero_si512()); } + + uint64 get0() const + { + #if defined __x86_64__ || defined _M_X64 + return (uint64)_mm_cvtsi128_si64(_mm512_castsi512_si128(val)); + #else + int a = _mm_cvtsi128_si32(_mm512_castsi512_si128(val)); + int b = _mm_cvtsi128_si32(_mm512_castsi512_si128(_mm512_srli_epi64(val, 32))); + return (unsigned)a | ((uint64)(unsigned)b << 32); + #endif + } +}; + +struct v_int64x8 +{ + typedef int64 lane_type; + enum { nlanes = 8 }; + __m512i val; + + explicit v_int64x8(__m512i v) : val(v) {} + v_int64x8(int64 v0, int64 v1, int64 v2, int64 v3, int64 v4, int64 v5, int64 v6, int64 v7) + { val = _mm512_setr_epi64(v0, v1, v2, v3, v4, v5, v6, v7); } + v_int64x8() {} + + static inline v_int64x8 zero() { return v_int64x8(_mm512_setzero_si512()); } + + int64 get0() const + { + #if defined __x86_64__ || defined _M_X64 + return (int64)_mm_cvtsi128_si64(_mm512_castsi512_si128(val)); + #else + int a = _mm_cvtsi128_si32(_mm512_castsi512_si128(val)); + int b = _mm_cvtsi128_si32(_mm512_castsi512_si128(_mm512_srli_epi64(val, 32))); + return (int64)((unsigned)a | ((uint64)(unsigned)b << 32)); + #endif + } +}; + +struct v_float64x8 +{ + typedef double lane_type; + enum { nlanes = 8 }; + __m512d val; + + explicit v_float64x8(__m512d v) : val(v) {} + v_float64x8(double v0, double v1, double v2, double v3, double v4, double v5, double v6, double v7) + { val = _mm512_setr_pd(v0, v1, v2, v3, v4, v5, v6, v7); } + v_float64x8() {} + + static inline v_float64x8 zero() { return v_float64x8(_mm512_setzero_pd()); } + + double get0() const { return _mm_cvtsd_f64(_mm512_castpd512_pd128(val)); } +}; + +//////////////// Load and store operations /////////////// + +#define OPENCV_HAL_IMPL_AVX512_LOADSTORE(_Tpvec, _Tp) \ + inline _Tpvec v512_load(const _Tp* ptr) \ + { return _Tpvec(_mm512_loadu_si512((const __m512i*)ptr)); } \ + inline _Tpvec v512_load_aligned(const _Tp* ptr) \ + { return _Tpvec(_mm512_load_si512((const __m512i*)ptr)); } \ + inline _Tpvec v512_load_low(const _Tp* ptr) \ + { \ + __m256i v256 = _mm256_loadu_si256((const __m256i*)ptr); \ + return _Tpvec(_mm512_castsi256_si512(v256)); \ + } \ + inline _Tpvec v512_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + __m256i vlo = _mm256_loadu_si256((const __m256i*)ptr0); \ + __m256i vhi = _mm256_loadu_si256((const __m256i*)ptr1); \ + return _Tpvec(_v512_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { _mm512_storeu_si512((__m512i*)ptr, a.val); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { _mm512_store_si512((__m512i*)ptr, a.val); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { _mm512_stream_si512((__m512i*)ptr, a.val); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm512_storeu_si512((__m512i*)ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm512_stream_si512((__m512i*)ptr, a.val); \ + else \ + _mm512_store_si512((__m512i*)ptr, a.val); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_si256((__m256i*)ptr, _v512_extract_low(a.val)); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_si256((__m256i*)ptr, _v512_extract_high(a.val)); } + +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_uint8x64, uchar) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_int8x64, schar) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_uint16x32, ushort) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_int16x32, short) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_uint32x16, unsigned) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_int32x16, int) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_uint64x8, uint64) +OPENCV_HAL_IMPL_AVX512_LOADSTORE(v_int64x8, int64) + +#define OPENCV_HAL_IMPL_AVX512_LOADSTORE_FLT(_Tpvec, _Tp, suffix, halfreg) \ + inline _Tpvec v512_load(const _Tp* ptr) \ + { return _Tpvec(_mm512_loadu_##suffix(ptr)); } \ + inline _Tpvec v512_load_aligned(const _Tp* ptr) \ + { return _Tpvec(_mm512_load_##suffix(ptr)); } \ + inline _Tpvec v512_load_low(const _Tp* ptr) \ + { \ + return _Tpvec(_mm512_cast##suffix##256_##suffix##512 \ + (_mm256_loadu_##suffix(ptr))); \ + } \ + inline _Tpvec v512_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + halfreg vlo = _mm256_loadu_##suffix(ptr0); \ + halfreg vhi = _mm256_loadu_##suffix(ptr1); \ + return _Tpvec(_v512_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { _mm512_storeu_##suffix(ptr, a.val); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { _mm512_store_##suffix(ptr, a.val); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { _mm512_stream_##suffix(ptr, a.val); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm512_storeu_##suffix(ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm512_stream_##suffix(ptr, a.val); \ + else \ + _mm512_store_##suffix(ptr, a.val); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_##suffix(ptr, _v512_extract_low(a.val)); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { _mm256_storeu_##suffix(ptr, _v512_extract_high(a.val)); } + +OPENCV_HAL_IMPL_AVX512_LOADSTORE_FLT(v_float32x16, float, ps, __m256) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_FLT(v_float64x8, double, pd, __m256d) + +#define OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, _Tpvecf, suffix, cast) \ + inline _Tpvec v_reinterpret_as_##suffix(const _Tpvecf& a) \ + { return _Tpvec(cast(a.val)); } + +#define OPENCV_HAL_IMPL_AVX512_INIT(_Tpvec, _Tp, suffix, ssuffix, ctype_s) \ + inline _Tpvec v512_setzero_##suffix() \ + { return _Tpvec(_mm512_setzero_si512()); } \ + inline _Tpvec v512_setall_##suffix(_Tp v) \ + { return _Tpvec(_mm512_set1_##ssuffix((ctype_s)v)); } \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint8x64, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int8x64, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint16x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int16x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint32x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int32x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint64x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int64x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_float32x16, suffix, _mm512_castps_si512) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_float64x8, suffix, _mm512_castpd_si512) + +OPENCV_HAL_IMPL_AVX512_INIT(v_uint8x64, uchar, u8, epi8, char) +OPENCV_HAL_IMPL_AVX512_INIT(v_int8x64, schar, s8, epi8, char) +OPENCV_HAL_IMPL_AVX512_INIT(v_uint16x32, ushort, u16, epi16, short) +OPENCV_HAL_IMPL_AVX512_INIT(v_int16x32, short, s16, epi16, short) +OPENCV_HAL_IMPL_AVX512_INIT(v_uint32x16, unsigned, u32, epi32, int) +OPENCV_HAL_IMPL_AVX512_INIT(v_int32x16, int, s32, epi32, int) +OPENCV_HAL_IMPL_AVX512_INIT(v_uint64x8, uint64, u64, epi64, int64) +OPENCV_HAL_IMPL_AVX512_INIT(v_int64x8, int64, s64, epi64, int64) + +#define OPENCV_HAL_IMPL_AVX512_INIT_FLT(_Tpvec, _Tp, suffix, zsuffix, cast) \ + inline _Tpvec v512_setzero_##suffix() \ + { return _Tpvec(_mm512_setzero_##zsuffix()); } \ + inline _Tpvec v512_setall_##suffix(_Tp v) \ + { return _Tpvec(_mm512_set1_##zsuffix(v)); } \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint8x64, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int8x64, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint16x32, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int16x32, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint32x16, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int32x16, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_uint64x8, suffix, cast) \ + OPENCV_HAL_IMPL_AVX512_CAST(_Tpvec, v_int64x8, suffix, cast) + +OPENCV_HAL_IMPL_AVX512_INIT_FLT(v_float32x16, float, f32, ps, _mm512_castsi512_ps) +OPENCV_HAL_IMPL_AVX512_INIT_FLT(v_float64x8, double, f64, pd, _mm512_castsi512_pd) + +inline v_float32x16 v_reinterpret_as_f32(const v_float32x16& a) +{ return a; } +inline v_float32x16 v_reinterpret_as_f32(const v_float64x8& a) +{ return v_float32x16(_mm512_castpd_ps(a.val)); } + +inline v_float64x8 v_reinterpret_as_f64(const v_float64x8& a) +{ return a; } +inline v_float64x8 v_reinterpret_as_f64(const v_float32x16& a) +{ return v_float64x8(_mm512_castps_pd(a.val)); } + +// FP16 +inline v_float32x16 v512_load_expand(const float16_t* ptr) +{ + return v_float32x16(_mm512_cvtph_ps(_mm256_loadu_si256((const __m256i*)ptr))); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x16& a) +{ + __m256i ah = _mm512_cvtps_ph(a.val, 0); + _mm256_storeu_si256((__m256i*)ptr, ah); +} + +/* Recombine & ZIP */ +inline void v_zip(const v_int8x64& a, const v_int8x64& b, v_int8x64& ab0, v_int8x64& ab1) +{ +#if CV_AVX_512VBMI + __m512i mask0 = _v512_set_epu8( 95, 31, 94, 30, 93, 29, 92, 28, 91, 27, 90, 26, 89, 25, 88, 24, + 87, 23, 86, 22, 85, 21, 84, 20, 83, 19, 82, 18, 81, 17, 80, 16, + 79, 15, 78, 14, 77, 13, 76, 12, 75, 11, 74, 10, 73, 9, 72, 8, + 71, 7, 70, 6, 69, 5, 68, 4, 67, 3, 66, 2, 65, 1, 64, 0); + ab0 = v_int8x64(_mm512_permutex2var_epi8(a.val, mask0, b.val)); + __m512i mask1 = _v512_set_epu8(127, 63, 126, 62, 125, 61, 124, 60, 123, 59, 122, 58, 121, 57, 120, 56, + 119, 55, 118, 54, 117, 53, 116, 52, 115, 51, 114, 50, 113, 49, 112, 48, + 111, 47, 110, 46, 109, 45, 108, 44, 107, 43, 106, 42, 105, 41, 104, 40, + 103, 39, 102, 38, 101, 37, 100, 36, 99, 35, 98, 34, 97, 33, 96, 32); + ab1 = v_int8x64(_mm512_permutex2var_epi8(a.val, mask1, b.val)); +#else + __m512i low = _mm512_unpacklo_epi8(a.val, b.val); + __m512i high = _mm512_unpackhi_epi8(a.val, b.val); + ab0 = v_int8x64(_mm512_permutex2var_epi64(low, _v512_set_epu64(11, 10, 3, 2, 9, 8, 1, 0), high)); + ab1 = v_int8x64(_mm512_permutex2var_epi64(low, _v512_set_epu64(15, 14, 7, 6, 13, 12, 5, 4), high)); +#endif +} +inline void v_zip(const v_int16x32& a, const v_int16x32& b, v_int16x32& ab0, v_int16x32& ab1) +{ + __m512i mask0 = _v512_set_epu16(47, 15, 46, 14, 45, 13, 44, 12, 43, 11, 42, 10, 41, 9, 40, 8, + 39, 7, 38, 6, 37, 5, 36, 4, 35, 3, 34, 2, 33, 1, 32, 0); + ab0 = v_int16x32(_mm512_permutex2var_epi16(a.val, mask0, b.val)); + __m512i mask1 = _v512_set_epu16(63, 31, 62, 30, 61, 29, 60, 28, 59, 27, 58, 26, 57, 25, 56, 24, + 55, 23, 54, 22, 53, 21, 52, 20, 51, 19, 50, 18, 49, 17, 48, 16); + ab1 = v_int16x32(_mm512_permutex2var_epi16(a.val, mask1, b.val)); +} +inline void v_zip(const v_int32x16& a, const v_int32x16& b, v_int32x16& ab0, v_int32x16& ab1) +{ + __m512i mask0 = _v512_set_epu32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); + ab0 = v_int32x16(_mm512_permutex2var_epi32(a.val, mask0, b.val)); + __m512i mask1 = _v512_set_epu32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); + ab1 = v_int32x16(_mm512_permutex2var_epi32(a.val, mask1, b.val)); +} +inline void v_zip(const v_int64x8& a, const v_int64x8& b, v_int64x8& ab0, v_int64x8& ab1) +{ + __m512i mask0 = _v512_set_epu64(11, 3, 10, 2, 9, 1, 8, 0); + ab0 = v_int64x8(_mm512_permutex2var_epi64(a.val, mask0, b.val)); + __m512i mask1 = _v512_set_epu64(15, 7, 14, 6, 13, 5, 12, 4); + ab1 = v_int64x8(_mm512_permutex2var_epi64(a.val, mask1, b.val)); +} + +inline void v_zip(const v_uint8x64& a, const v_uint8x64& b, v_uint8x64& ab0, v_uint8x64& ab1) +{ + v_int8x64 i0, i1; + v_zip(v_reinterpret_as_s8(a), v_reinterpret_as_s8(b), i0, i1); + ab0 = v_reinterpret_as_u8(i0); + ab1 = v_reinterpret_as_u8(i1); +} +inline void v_zip(const v_uint16x32& a, const v_uint16x32& b, v_uint16x32& ab0, v_uint16x32& ab1) +{ + v_int16x32 i0, i1; + v_zip(v_reinterpret_as_s16(a), v_reinterpret_as_s16(b), i0, i1); + ab0 = v_reinterpret_as_u16(i0); + ab1 = v_reinterpret_as_u16(i1); +} +inline void v_zip(const v_uint32x16& a, const v_uint32x16& b, v_uint32x16& ab0, v_uint32x16& ab1) +{ + v_int32x16 i0, i1; + v_zip(v_reinterpret_as_s32(a), v_reinterpret_as_s32(b), i0, i1); + ab0 = v_reinterpret_as_u32(i0); + ab1 = v_reinterpret_as_u32(i1); +} +inline void v_zip(const v_uint64x8& a, const v_uint64x8& b, v_uint64x8& ab0, v_uint64x8& ab1) +{ + v_int64x8 i0, i1; + v_zip(v_reinterpret_as_s64(a), v_reinterpret_as_s64(b), i0, i1); + ab0 = v_reinterpret_as_u64(i0); + ab1 = v_reinterpret_as_u64(i1); +} +inline void v_zip(const v_float32x16& a, const v_float32x16& b, v_float32x16& ab0, v_float32x16& ab1) +{ + v_int32x16 i0, i1; + v_zip(v_reinterpret_as_s32(a), v_reinterpret_as_s32(b), i0, i1); + ab0 = v_reinterpret_as_f32(i0); + ab1 = v_reinterpret_as_f32(i1); +} +inline void v_zip(const v_float64x8& a, const v_float64x8& b, v_float64x8& ab0, v_float64x8& ab1) +{ + v_int64x8 i0, i1; + v_zip(v_reinterpret_as_s64(a), v_reinterpret_as_s64(b), i0, i1); + ab0 = v_reinterpret_as_f64(i0); + ab1 = v_reinterpret_as_f64(i1); +} + +#define OPENCV_HAL_IMPL_AVX512_COMBINE(_Tpvec, suffix) \ + inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_v512_combine(_v512_extract_low(a.val), _v512_extract_low(b.val))); } \ + inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_v512_insert(b.val, _v512_extract_high(a.val))); } \ + inline void v_recombine(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ + { \ + c.val = _v512_combine(_v512_extract_low(a.val),_v512_extract_low(b.val)); \ + d.val = _v512_insert(b.val,_v512_extract_high(a.val)); \ + } + + +OPENCV_HAL_IMPL_AVX512_COMBINE(v_uint8x64, epi8) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_int8x64, epi8) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_uint16x32, epi16) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_int16x32, epi16) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_uint32x16, epi32) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_int32x16, epi32) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_uint64x8, epi64) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_int64x8, epi64) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_float32x16, ps) +OPENCV_HAL_IMPL_AVX512_COMBINE(v_float64x8, pd) + +////////// Arithmetic, bitwise and comparison operations ///////// + +/* Element-wise binary and unary operations */ + +/** Non-saturating arithmetics **/ +#define OPENCV_HAL_IMPL_AVX512_BIN_FUNC(func, _Tpvec, intrin) \ + inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } + +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_add_wrap, v_uint8x64, _mm512_add_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_add_wrap, v_int8x64, _mm512_add_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_add_wrap, v_uint16x32, _mm512_add_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_add_wrap, v_int16x32, _mm512_add_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_sub_wrap, v_uint8x64, _mm512_sub_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_sub_wrap, v_int8x64, _mm512_sub_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_sub_wrap, v_uint16x32, _mm512_sub_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_sub_wrap, v_int16x32, _mm512_sub_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_mul_wrap, v_uint16x32, _mm512_mullo_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_mul_wrap, v_int16x32, _mm512_mullo_epi16) + +inline v_uint8x64 v_mul_wrap(const v_uint8x64& a, const v_uint8x64& b) +{ + __m512i ad = _mm512_srai_epi16(a.val, 8); + __m512i bd = _mm512_srai_epi16(b.val, 8); + __m512i p0 = _mm512_mullo_epi16(a.val, b.val); // even + __m512i p1 = _mm512_slli_epi16(_mm512_mullo_epi16(ad, bd), 8); // odd + return v_uint8x64(_mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, p0, p1)); +} +inline v_int8x64 v_mul_wrap(const v_int8x64& a, const v_int8x64& b) +{ + return v_reinterpret_as_s8(v_mul_wrap(v_reinterpret_as_u8(a), v_reinterpret_as_u8(b))); +} + +#define OPENCV_HAL_IMPL_AVX512_BIN_OP(bin_op, _Tpvec, intrin) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { a.val = intrin(a.val, b.val); return a; } + +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_uint32x16, _mm512_add_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_uint32x16, _mm512_sub_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_int32x16, _mm512_add_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_int32x16, _mm512_sub_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_uint64x8, _mm512_add_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_uint64x8, _mm512_sub_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_int64x8, _mm512_add_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_int64x8, _mm512_sub_epi64) + +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_uint32x16, _mm512_mullo_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_int32x16, _mm512_mullo_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_uint64x8, _mm512_mullo_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_int64x8, _mm512_mullo_epi64) + +/** Saturating arithmetics **/ +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_uint8x64, _mm512_adds_epu8) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_uint8x64, _mm512_subs_epu8) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_int8x64, _mm512_adds_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_int8x64, _mm512_subs_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_uint16x32, _mm512_adds_epu16) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_uint16x32, _mm512_subs_epu16) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_int16x32, _mm512_adds_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_int16x32, _mm512_subs_epi16) + +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_float32x16, _mm512_add_ps) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_float32x16, _mm512_sub_ps) +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_float32x16, _mm512_mul_ps) +OPENCV_HAL_IMPL_AVX512_BIN_OP(/, v_float32x16, _mm512_div_ps) +OPENCV_HAL_IMPL_AVX512_BIN_OP(+, v_float64x8, _mm512_add_pd) +OPENCV_HAL_IMPL_AVX512_BIN_OP(-, v_float64x8, _mm512_sub_pd) +OPENCV_HAL_IMPL_AVX512_BIN_OP(*, v_float64x8, _mm512_mul_pd) +OPENCV_HAL_IMPL_AVX512_BIN_OP(/, v_float64x8, _mm512_div_pd) + +// saturating multiply +inline v_uint8x64 operator * (const v_uint8x64& a, const v_uint8x64& b) +{ + v_uint16x32 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_int8x64 operator * (const v_int8x64& a, const v_int8x64& b) +{ + v_int16x32 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_uint16x32 operator * (const v_uint16x32& a, const v_uint16x32& b) +{ + __m512i pl = _mm512_mullo_epi16(a.val, b.val); + __m512i ph = _mm512_mulhi_epu16(a.val, b.val); + __m512i p0 = _mm512_unpacklo_epi16(pl, ph); + __m512i p1 = _mm512_unpackhi_epi16(pl, ph); + + const __m512i m = _mm512_set1_epi32(65535); + return v_uint16x32(_mm512_packus_epi32(_mm512_min_epu32(p0, m), _mm512_min_epu32(p1, m))); +} +inline v_int16x32 operator * (const v_int16x32& a, const v_int16x32& b) +{ + __m512i pl = _mm512_mullo_epi16(a.val, b.val); + __m512i ph = _mm512_mulhi_epi16(a.val, b.val); + __m512i p0 = _mm512_unpacklo_epi16(pl, ph); + __m512i p1 = _mm512_unpackhi_epi16(pl, ph); + return v_int16x32(_mm512_packs_epi32(p0, p1)); +} + +inline v_uint8x64& operator *= (v_uint8x64& a, const v_uint8x64& b) +{ a = a * b; return a; } +inline v_int8x64& operator *= (v_int8x64& a, const v_int8x64& b) +{ a = a * b; return a; } +inline v_uint16x32& operator *= (v_uint16x32& a, const v_uint16x32& b) +{ a = a * b; return a; } +inline v_int16x32& operator *= (v_int16x32& a, const v_int16x32& b) +{ a = a * b; return a; } + +inline v_int16x32 v_mul_hi(const v_int16x32& a, const v_int16x32& b) { return v_int16x32(_mm512_mulhi_epi16(a.val, b.val)); } +inline v_uint16x32 v_mul_hi(const v_uint16x32& a, const v_uint16x32& b) { return v_uint16x32(_mm512_mulhi_epu16(a.val, b.val)); } + +// Multiply and expand +inline void v_mul_expand(const v_uint8x64& a, const v_uint8x64& b, + v_uint16x32& c, v_uint16x32& d) +{ + v_uint16x32 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int8x64& a, const v_int8x64& b, + v_int16x32& c, v_int16x32& d) +{ + v_int16x32 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int16x32& a, const v_int16x32& b, + v_int32x16& c, v_int32x16& d) +{ + v_int16x32 v0, v1; + v_zip(v_mul_wrap(a, b), v_mul_hi(a, b), v0, v1); + + c = v_reinterpret_as_s32(v0); + d = v_reinterpret_as_s32(v1); +} + +inline void v_mul_expand(const v_uint16x32& a, const v_uint16x32& b, + v_uint32x16& c, v_uint32x16& d) +{ + v_uint16x32 v0, v1; + v_zip(v_mul_wrap(a, b), v_mul_hi(a, b), v0, v1); + + c = v_reinterpret_as_u32(v0); + d = v_reinterpret_as_u32(v1); +} + +inline void v_mul_expand(const v_uint32x16& a, const v_uint32x16& b, + v_uint64x8& c, v_uint64x8& d) +{ + v_zip(v_uint64x8(_mm512_mul_epu32(a.val, b.val)), + v_uint64x8(_mm512_mul_epu32(_mm512_srli_epi64(a.val, 32), _mm512_srli_epi64(b.val, 32))), c, d); +} + +inline void v_mul_expand(const v_int32x16& a, const v_int32x16& b, + v_int64x8& c, v_int64x8& d) +{ + v_zip(v_int64x8(_mm512_mul_epi32(a.val, b.val)), + v_int64x8(_mm512_mul_epi32(_mm512_srli_epi64(a.val, 32), _mm512_srli_epi64(b.val, 32))), c, d); +} + +/** Bitwise shifts **/ +#define OPENCV_HAL_IMPL_AVX512_SHIFT_OP(_Tpuvec, _Tpsvec, suffix) \ + inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ + { return _Tpuvec(_mm512_slli_##suffix(a.val, imm)); } \ + inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ + { return _Tpsvec(_mm512_slli_##suffix(a.val, imm)); } \ + inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ + { return _Tpuvec(_mm512_srli_##suffix(a.val, imm)); } \ + inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ + { return _Tpsvec(_mm512_srai_##suffix(a.val, imm)); } \ + template \ + inline _Tpuvec v_shl(const _Tpuvec& a) \ + { return _Tpuvec(_mm512_slli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shl(const _Tpsvec& a) \ + { return _Tpsvec(_mm512_slli_##suffix(a.val, imm)); } \ + template \ + inline _Tpuvec v_shr(const _Tpuvec& a) \ + { return _Tpuvec(_mm512_srli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shr(const _Tpsvec& a) \ + { return _Tpsvec(_mm512_srai_##suffix(a.val, imm)); } + +OPENCV_HAL_IMPL_AVX512_SHIFT_OP(v_uint16x32, v_int16x32, epi16) +OPENCV_HAL_IMPL_AVX512_SHIFT_OP(v_uint32x16, v_int32x16, epi32) +OPENCV_HAL_IMPL_AVX512_SHIFT_OP(v_uint64x8, v_int64x8, epi64) + + +/** Bitwise logic **/ +#define OPENCV_HAL_IMPL_AVX512_LOGIC_OP(_Tpvec, suffix, not_const) \ + OPENCV_HAL_IMPL_AVX512_BIN_OP(&, _Tpvec, _mm512_and_##suffix) \ + OPENCV_HAL_IMPL_AVX512_BIN_OP(|, _Tpvec, _mm512_or_##suffix) \ + OPENCV_HAL_IMPL_AVX512_BIN_OP(^, _Tpvec, _mm512_xor_##suffix) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { return _Tpvec(_mm512_xor_##suffix(a.val, not_const)); } + +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_uint8x64, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_int8x64, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_uint16x32, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_int16x32, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_uint32x16, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_int32x16, si512, _mm512_set1_epi32(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_uint64x8, si512, _mm512_set1_epi64(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_int64x8, si512, _mm512_set1_epi64(-1)) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_float32x16, ps, _mm512_castsi512_ps(_mm512_set1_epi32(-1))) +OPENCV_HAL_IMPL_AVX512_LOGIC_OP(v_float64x8, pd, _mm512_castsi512_pd(_mm512_set1_epi32(-1))) + +/** Select **/ +#define OPENCV_HAL_IMPL_AVX512_SELECT(_Tpvec, suffix, zsuf) \ + inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm512_mask_blend_##suffix(_mm512_cmp_##suffix##_mask(mask.val, _mm512_setzero_##zsuf(), _MM_CMPINT_EQ), a.val, b.val)); } + +OPENCV_HAL_IMPL_AVX512_SELECT(v_uint8x64, epi8, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_int8x64, epi8, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_uint16x32, epi16, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_int16x32, epi16, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_uint32x16, epi32, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_int32x16, epi32, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_uint64x8, epi64, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_int64x8, epi64, si512) +OPENCV_HAL_IMPL_AVX512_SELECT(v_float32x16, ps, ps) +OPENCV_HAL_IMPL_AVX512_SELECT(v_float64x8, pd, pd) + +/** Comparison **/ +#define OPENCV_HAL_IMPL_AVX512_CMP_INT(bin_op, imm8, _Tpvec, sufcmp, sufset, tval) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm512_maskz_set1_##sufset(_mm512_cmp_##sufcmp##_mask(a.val, b.val, imm8), tval)); } + +#define OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(_Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(==, _MM_CMPINT_EQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(!=, _MM_CMPINT_NE, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(<, _MM_CMPINT_LT, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(>, _MM_CMPINT_NLE, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(<=, _MM_CMPINT_LE, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_INT(>=, _MM_CMPINT_NLT, _Tpvec, sufcmp, sufset, tval) + +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_uint8x64, epu8, epi8, (char)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_int8x64, epi8, epi8, (char)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_uint16x32, epu16, epi16, (short)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_int16x32, epi16, epi16, (short)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_uint32x16, epu32, epi32, (int)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_int32x16, epi32, epi32, (int)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_uint64x8, epu64, epi64, (int64)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_INT(v_int64x8, epi64, epi64, (int64)-1) + +#define OPENCV_HAL_IMPL_AVX512_CMP_FLT(bin_op, imm8, _Tpvec, sufcmp, sufset, tval) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(_mm512_castsi512_##sufcmp(_mm512_maskz_set1_##sufset(_mm512_cmp_##sufcmp##_mask(a.val, b.val, imm8), tval))); } + +#define OPENCV_HAL_IMPL_AVX512_CMP_OP_FLT(_Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(==, _CMP_EQ_OQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(!=, _CMP_NEQ_OQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(<, _CMP_LT_OQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(>, _CMP_GT_OQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(<=, _CMP_LE_OQ, _Tpvec, sufcmp, sufset, tval) \ + OPENCV_HAL_IMPL_AVX512_CMP_FLT(>=, _CMP_GE_OQ, _Tpvec, sufcmp, sufset, tval) + +OPENCV_HAL_IMPL_AVX512_CMP_OP_FLT(v_float32x16, ps, epi32, (int)-1) +OPENCV_HAL_IMPL_AVX512_CMP_OP_FLT(v_float64x8, pd, epi64, (int64)-1) + +inline v_float32x16 v_not_nan(const v_float32x16& a) +{ return v_float32x16(_mm512_castsi512_ps(_mm512_maskz_set1_epi32(_mm512_cmp_ps_mask(a.val, a.val, _CMP_ORD_Q), (int)-1))); } +inline v_float64x8 v_not_nan(const v_float64x8& a) +{ return v_float64x8(_mm512_castsi512_pd(_mm512_maskz_set1_epi64(_mm512_cmp_pd_mask(a.val, a.val, _CMP_ORD_Q), (int64)-1))); } + +/** min/max **/ +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_uint8x64, _mm512_min_epu8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_uint8x64, _mm512_max_epu8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_int8x64, _mm512_min_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_int8x64, _mm512_max_epi8) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_uint16x32, _mm512_min_epu16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_uint16x32, _mm512_max_epu16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_int16x32, _mm512_min_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_int16x32, _mm512_max_epi16) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_uint32x16, _mm512_min_epu32) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_uint32x16, _mm512_max_epu32) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_int32x16, _mm512_min_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_int32x16, _mm512_max_epi32) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_uint64x8, _mm512_min_epu64) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_uint64x8, _mm512_max_epu64) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_int64x8, _mm512_min_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_int64x8, _mm512_max_epi64) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_float32x16, _mm512_min_ps) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_float32x16, _mm512_max_ps) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_min, v_float64x8, _mm512_min_pd) +OPENCV_HAL_IMPL_AVX512_BIN_FUNC(v_max, v_float64x8, _mm512_max_pd) + +/** Rotate **/ +namespace { + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64&) { return v_int8x64(); }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64& a, const v_int8x64& b) + { + return v_int8x64(_mm512_or_si512(_mm512_srli_epi32(_mm512_alignr_epi32(b.val, a.val, imm32 ), imm4 *8), + _mm512_slli_epi32(_mm512_alignr_epi32(b.val, a.val, imm32 + 1), (4-imm4)*8))); + }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64& a, const v_int8x64& b) + { + return v_int8x64(_mm512_or_si512(_mm512_srli_epi32(_mm512_alignr_epi32(b.val, a.val, 15), imm4 *8), + _mm512_slli_epi32( b.val, (4-imm4)*8))); + }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64& b) + { + return v_int8x64(_mm512_or_si512(_mm512_srli_epi32(_mm512_alignr_epi32(_mm512_setzero_si512(), b.val, imm32 - 16), imm4 *8), + _mm512_slli_epi32(_mm512_alignr_epi32(_mm512_setzero_si512(), b.val, imm32 - 15), (4-imm4)*8))); + }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64& b) + { return v_int8x64(_mm512_srli_epi32(_mm512_alignr_epi32(_mm512_setzero_si512(), b.val, 15), imm4*8)); }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64& a, const v_int8x64& b) + { return v_int8x64(_mm512_alignr_epi32(b.val, a.val, imm32)); }}; + template<> + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64& a, const v_int8x64&) { return a; }}; + template + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64& b) + { return v_int8x64(_mm512_alignr_epi32(_mm512_setzero_si512(), b.val, imm32 - 16)); }}; + template<> + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64& b) { return b; }}; + template<> + struct _v_rotate_right { static inline v_int8x64 eval(const v_int8x64&, const v_int8x64&) { return v_int8x64(); }}; +} +template inline v_int8x64 v_rotate_right(const v_int8x64& a, const v_int8x64& b) +{ + return imm >= 128 ? v_int8x64() : +#if CV_AVX_512VBMI + v_int8x64(_mm512_permutex2var_epi8(a.val, + _v512_set_epu8(0x3f + imm, 0x3e + imm, 0x3d + imm, 0x3c + imm, 0x3b + imm, 0x3a + imm, 0x39 + imm, 0x38 + imm, + 0x37 + imm, 0x36 + imm, 0x35 + imm, 0x34 + imm, 0x33 + imm, 0x32 + imm, 0x31 + imm, 0x30 + imm, + 0x2f + imm, 0x2e + imm, 0x2d + imm, 0x2c + imm, 0x2b + imm, 0x2a + imm, 0x29 + imm, 0x28 + imm, + 0x27 + imm, 0x26 + imm, 0x25 + imm, 0x24 + imm, 0x23 + imm, 0x22 + imm, 0x21 + imm, 0x20 + imm, + 0x1f + imm, 0x1e + imm, 0x1d + imm, 0x1c + imm, 0x1b + imm, 0x1a + imm, 0x19 + imm, 0x18 + imm, + 0x17 + imm, 0x16 + imm, 0x15 + imm, 0x14 + imm, 0x13 + imm, 0x12 + imm, 0x11 + imm, 0x10 + imm, + 0x0f + imm, 0x0e + imm, 0x0d + imm, 0x0c + imm, 0x0b + imm, 0x0a + imm, 0x09 + imm, 0x08 + imm, + 0x07 + imm, 0x06 + imm, 0x05 + imm, 0x04 + imm, 0x03 + imm, 0x02 + imm, 0x01 + imm, 0x00 + imm), b.val)); +#else + _v_rotate_right 15), imm/4>::eval(a, b); +#endif +} +template +inline v_int8x64 v_rotate_left(const v_int8x64& a, const v_int8x64& b) +{ + if (imm == 0) return a; + if (imm == 64) return b; + if (imm >= 128) return v_int8x64(); +#if CV_AVX_512VBMI + return v_int8x64(_mm512_permutex2var_epi8(b.val, + _v512_set_epi8(0x7f - imm,0x7e - imm,0x7d - imm,0x7c - imm,0x7b - imm,0x7a - imm,0x79 - imm,0x78 - imm, + 0x77 - imm,0x76 - imm,0x75 - imm,0x74 - imm,0x73 - imm,0x72 - imm,0x71 - imm,0x70 - imm, + 0x6f - imm,0x6e - imm,0x6d - imm,0x6c - imm,0x6b - imm,0x6a - imm,0x69 - imm,0x68 - imm, + 0x67 - imm,0x66 - imm,0x65 - imm,0x64 - imm,0x63 - imm,0x62 - imm,0x61 - imm,0x60 - imm, + 0x5f - imm,0x5e - imm,0x5d - imm,0x5c - imm,0x5b - imm,0x5a - imm,0x59 - imm,0x58 - imm, + 0x57 - imm,0x56 - imm,0x55 - imm,0x54 - imm,0x53 - imm,0x52 - imm,0x51 - imm,0x50 - imm, + 0x4f - imm,0x4e - imm,0x4d - imm,0x4c - imm,0x4b - imm,0x4a - imm,0x49 - imm,0x48 - imm, + 0x47 - imm,0x46 - imm,0x45 - imm,0x44 - imm,0x43 - imm,0x42 - imm,0x41 - imm,0x40 - imm), a.val)); +#else + return imm < 64 ? v_rotate_right<64 - imm>(b, a) : v_rotate_right<128 - imm>(v512_setzero_s8(), b); +#endif +} +template +inline v_int8x64 v_rotate_right(const v_int8x64& a) +{ + if (imm == 0) return a; + if (imm >= 64) return v_int8x64(); +#if CV_AVX_512VBMI + return v_int8x64(_mm512_maskz_permutexvar_epi8(0xFFFFFFFFFFFFFFFF >> imm, + _v512_set_epu8(0x3f + imm,0x3e + imm,0x3d + imm,0x3c + imm,0x3b + imm,0x3a + imm,0x39 + imm,0x38 + imm, + 0x37 + imm,0x36 + imm,0x35 + imm,0x34 + imm,0x33 + imm,0x32 + imm,0x31 + imm,0x30 + imm, + 0x2f + imm,0x2e + imm,0x2d + imm,0x2c + imm,0x2b + imm,0x2a + imm,0x29 + imm,0x28 + imm, + 0x27 + imm,0x26 + imm,0x25 + imm,0x24 + imm,0x23 + imm,0x22 + imm,0x21 + imm,0x20 + imm, + 0x1f + imm,0x1e + imm,0x1d + imm,0x1c + imm,0x1b + imm,0x1a + imm,0x19 + imm,0x18 + imm, + 0x17 + imm,0x16 + imm,0x15 + imm,0x14 + imm,0x13 + imm,0x12 + imm,0x11 + imm,0x10 + imm, + 0x0f + imm,0x0e + imm,0x0d + imm,0x0c + imm,0x0b + imm,0x0a + imm,0x09 + imm,0x08 + imm, + 0x07 + imm,0x06 + imm,0x05 + imm,0x04 + imm,0x03 + imm,0x02 + imm,0x01 + imm,0x00 + imm), a.val)); +#else + return v_rotate_right(a, v512_setzero_s8()); +#endif +} +template +inline v_int8x64 v_rotate_left(const v_int8x64& a) +{ + if (imm == 0) return a; + if (imm >= 64) return v_int8x64(); +#if CV_AVX_512VBMI + return v_int8x64(_mm512_maskz_permutexvar_epi8(0xFFFFFFFFFFFFFFFF << imm, + _v512_set_epi8(0x3f - imm,0x3e - imm,0x3d - imm,0x3c - imm,0x3b - imm,0x3a - imm,0x39 - imm,0x38 - imm, + 0x37 - imm,0x36 - imm,0x35 - imm,0x34 - imm,0x33 - imm,0x32 - imm,0x31 - imm,0x30 - imm, + 0x2f - imm,0x2e - imm,0x2d - imm,0x2c - imm,0x2b - imm,0x2a - imm,0x29 - imm,0x28 - imm, + 0x27 - imm,0x26 - imm,0x25 - imm,0x24 - imm,0x23 - imm,0x22 - imm,0x21 - imm,0x20 - imm, + 0x1f - imm,0x1e - imm,0x1d - imm,0x1c - imm,0x1b - imm,0x1a - imm,0x19 - imm,0x18 - imm, + 0x17 - imm,0x16 - imm,0x15 - imm,0x14 - imm,0x13 - imm,0x12 - imm,0x11 - imm,0x10 - imm, + 0x0f - imm,0x0e - imm,0x0d - imm,0x0c - imm,0x0b - imm,0x0a - imm,0x09 - imm,0x08 - imm, + 0x07 - imm,0x06 - imm,0x05 - imm,0x04 - imm,0x03 - imm,0x02 - imm,0x01 - imm,0x00 - imm), a.val)); +#else + return v_rotate_right<64 - imm>(v512_setzero_s8(), a); +#endif +} + +#define OPENCV_HAL_IMPL_AVX512_ROTATE_PM(_Tpvec, suffix) \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ return v_reinterpret_as_##suffix(v_rotate_left(v_reinterpret_as_s8(a), v_reinterpret_as_s8(b))); } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ return v_reinterpret_as_##suffix(v_rotate_right(v_reinterpret_as_s8(a), v_reinterpret_as_s8(b))); } \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ return v_reinterpret_as_##suffix(v_rotate_left(v_reinterpret_as_s8(a))); } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ return v_reinterpret_as_##suffix(v_rotate_right(v_reinterpret_as_s8(a))); } + +#define OPENCV_HAL_IMPL_AVX512_ROTATE_EC(_Tpvec, suffix) \ +template \ +inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + enum { SHIFT2 = (_Tpvec::nlanes - imm) }; \ + enum { MASK = ((1 << _Tpvec::nlanes) - 1) }; \ + if (imm == 0) return a; \ + if (imm == _Tpvec::nlanes) return b; \ + if (imm >= 2*_Tpvec::nlanes) return _Tpvec::zero(); \ + return _Tpvec(_mm512_mask_expand_##suffix(_mm512_maskz_compress_##suffix((MASK << SHIFT2)&MASK, b.val), (MASK << (imm))&MASK, a.val)); \ +} \ +template \ +inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + enum { SHIFT2 = (_Tpvec::nlanes - imm) }; \ + enum { MASK = ((1 << _Tpvec::nlanes) - 1) }; \ + if (imm == 0) return a; \ + if (imm == _Tpvec::nlanes) return b; \ + if (imm >= 2*_Tpvec::nlanes) return _Tpvec::zero(); \ + return _Tpvec(_mm512_mask_expand_##suffix(_mm512_maskz_compress_##suffix((MASK << (imm))&MASK, a.val), (MASK << SHIFT2)&MASK, b.val)); \ +} \ +template \ +inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + if (imm == 0) return a; \ + if (imm >= _Tpvec::nlanes) return _Tpvec::zero(); \ + return _Tpvec(_mm512_maskz_expand_##suffix((1 << _Tpvec::nlanes) - (1 << (imm)), a.val)); \ +} \ +template \ +inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + if (imm == 0) return a; \ + if (imm >= _Tpvec::nlanes) return _Tpvec::zero(); \ + return _Tpvec(_mm512_maskz_compress_##suffix((1 << _Tpvec::nlanes) - (1 << (imm)), a.val)); \ +} + +OPENCV_HAL_IMPL_AVX512_ROTATE_PM(v_uint8x64, u8) +OPENCV_HAL_IMPL_AVX512_ROTATE_PM(v_uint16x32, u16) +OPENCV_HAL_IMPL_AVX512_ROTATE_PM(v_int16x32, s16) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_uint32x16, epi32) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_int32x16, epi32) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_uint64x8, epi64) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_int64x8, epi64) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_float32x16, ps) +OPENCV_HAL_IMPL_AVX512_ROTATE_EC(v_float64x8, pd) + +/** Reverse **/ +inline v_uint8x64 v_reverse(const v_uint8x64 &a) +{ +#if CV_AVX_512VBMI + static const __m512i perm = _mm512_set_epi32( + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f, + 0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f, + 0x20212223, 0x24252627, 0x28292a2b, 0x2c2d2e2f, + 0x30313233, 0x34353637, 0x38393a3b, 0x3c3d3e3f); + return v_uint8x64(_mm512_permutexvar_epi8(perm, a.val)); +#else + static const __m512i shuf = _mm512_set_epi32( + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f, + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f, + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f, + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f); + static const __m512i perm = _mm512_set_epi64(1, 0, 3, 2, 5, 4, 7, 6); + __m512i vec = _mm512_shuffle_epi8(a.val, shuf); + return v_uint8x64(_mm512_permutexvar_epi64(perm, vec)); +#endif +} + +inline v_int8x64 v_reverse(const v_int8x64 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x32 v_reverse(const v_uint16x32 &a) +{ +#if CV_AVX_512VBMI + static const __m512i perm = _mm512_set_epi32( + 0x00000001, 0x00020003, 0x00040005, 0x00060007, + 0x00080009, 0x000a000b, 0x000c000d, 0x000e000f, + 0x00100011, 0x00120013, 0x00140015, 0x00160017, + 0x00180019, 0x001a001b, 0x001c001d, 0x001e001f); + return v_uint16x32(_mm512_permutexvar_epi16(perm, a.val)); +#else + static const __m512i shuf = _mm512_set_epi32( + 0x01000302, 0x05040706, 0x09080b0a, 0x0d0c0f0e, + 0x01000302, 0x05040706, 0x09080b0a, 0x0d0c0f0e, + 0x01000302, 0x05040706, 0x09080b0a, 0x0d0c0f0e, + 0x01000302, 0x05040706, 0x09080b0a, 0x0d0c0f0e); + static const __m512i perm = _mm512_set_epi64(1, 0, 3, 2, 5, 4, 7, 6); + __m512i vec = _mm512_shuffle_epi8(a.val, shuf); + return v_uint16x32(_mm512_permutexvar_epi64(perm, vec)); +#endif +} + +inline v_int16x32 v_reverse(const v_int16x32 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x16 v_reverse(const v_uint32x16 &a) +{ + static const __m512i perm = _mm512_set_epi32(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14, 15); + return v_uint32x16(_mm512_permutexvar_epi32(perm, a.val)); +} + +inline v_int32x16 v_reverse(const v_int32x16 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x16 v_reverse(const v_float32x16 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x8 v_reverse(const v_uint64x8 &a) +{ + static const __m512i perm = _mm512_set_epi64(0, 1, 2, 3, 4, 5, 6, 7); + return v_uint64x8(_mm512_permutexvar_epi64(perm, a.val)); +} + +inline v_int64x8 v_reverse(const v_int64x8 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x8 v_reverse(const v_float64x8 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +////////// Reduce ///////// + +/** Reduce **/ +#define OPENCV_HAL_IMPL_AVX512_REDUCE_ADD64(a, b) a + b +#define OPENCV_HAL_IMPL_AVX512_REDUCE_8(sctype, func, _Tpvec, ifunc, scop) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { __m256i half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + sctype CV_DECL_ALIGNED(64) idx[2]; \ + _mm_store_si128((__m128i*)idx, _mm_##ifunc(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1))); \ + return scop(idx[0], idx[1]); } +OPENCV_HAL_IMPL_AVX512_REDUCE_8(uint64, min, v_uint64x8, min_epu64, min) +OPENCV_HAL_IMPL_AVX512_REDUCE_8(uint64, max, v_uint64x8, max_epu64, max) +OPENCV_HAL_IMPL_AVX512_REDUCE_8(uint64, sum, v_uint64x8, add_epi64, OPENCV_HAL_IMPL_AVX512_REDUCE_ADD64) +OPENCV_HAL_IMPL_AVX512_REDUCE_8(int64, min, v_int64x8, min_epi64, min) +OPENCV_HAL_IMPL_AVX512_REDUCE_8(int64, max, v_int64x8, max_epi64, max) +OPENCV_HAL_IMPL_AVX512_REDUCE_8(int64, sum, v_int64x8, add_epi64, OPENCV_HAL_IMPL_AVX512_REDUCE_ADD64) + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_8F(func, ifunc, scop) \ + inline double v_reduce_##func(const v_float64x8& a) \ + { __m256d half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + double CV_DECL_ALIGNED(64) idx[2]; \ + _mm_store_pd(idx, _mm_##ifunc(_mm256_castpd256_pd128(half), _mm256_extractf128_pd(half, 1))); \ + return scop(idx[0], idx[1]); } +OPENCV_HAL_IMPL_AVX512_REDUCE_8F(min, min_pd, min) +OPENCV_HAL_IMPL_AVX512_REDUCE_8F(max, max_pd, max) +OPENCV_HAL_IMPL_AVX512_REDUCE_8F(sum, add_pd, OPENCV_HAL_IMPL_AVX512_REDUCE_ADD64) + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_16(sctype, func, _Tpvec, ifunc) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { __m256i half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + __m128i quarter = _mm_##ifunc(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 8)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 4)); \ + return (sctype)_mm_cvtsi128_si32(quarter); } +OPENCV_HAL_IMPL_AVX512_REDUCE_16(uint, min, v_uint32x16, min_epu32) +OPENCV_HAL_IMPL_AVX512_REDUCE_16(uint, max, v_uint32x16, max_epu32) +OPENCV_HAL_IMPL_AVX512_REDUCE_16(int, min, v_int32x16, min_epi32) +OPENCV_HAL_IMPL_AVX512_REDUCE_16(int, max, v_int32x16, max_epi32) + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_16F(func, ifunc) \ + inline float v_reduce_##func(const v_float32x16& a) \ + { __m256 half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + __m128 quarter = _mm_##ifunc(_mm256_castps256_ps128(half), _mm256_extractf128_ps(half, 1)); \ + quarter = _mm_##ifunc(quarter, _mm_permute_ps(quarter, _MM_SHUFFLE(0, 0, 3, 2))); \ + quarter = _mm_##ifunc(quarter, _mm_permute_ps(quarter, _MM_SHUFFLE(0, 0, 0, 1))); \ + return _mm_cvtss_f32(quarter); } +OPENCV_HAL_IMPL_AVX512_REDUCE_16F(min, min_ps) +OPENCV_HAL_IMPL_AVX512_REDUCE_16F(max, max_ps) + +inline float v_reduce_sum(const v_float32x16& a) +{ + __m256 half = _mm256_add_ps(_v512_extract_low(a.val), _v512_extract_high(a.val)); + __m128 quarter = _mm_add_ps(_mm256_castps256_ps128(half), _mm256_extractf128_ps(half, 1)); + quarter = _mm_hadd_ps(quarter, quarter); + return _mm_cvtss_f32(_mm_hadd_ps(quarter, quarter)); +} +inline int v_reduce_sum(const v_int32x16& a) +{ + __m256i half = _mm256_add_epi32(_v512_extract_low(a.val), _v512_extract_high(a.val)); + __m128i quarter = _mm_add_epi32(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); + quarter = _mm_hadd_epi32(quarter, quarter); + return _mm_cvtsi128_si32(_mm_hadd_epi32(quarter, quarter)); +} +inline uint v_reduce_sum(const v_uint32x16& a) +{ return (uint)v_reduce_sum(v_reinterpret_as_s32(a)); } + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_32(sctype, func, _Tpvec, ifunc) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { __m256i half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + __m128i quarter = _mm_##ifunc(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 8)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 4)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 2)); \ + return (sctype)_mm_cvtsi128_si32(quarter); } +OPENCV_HAL_IMPL_AVX512_REDUCE_32(ushort, min, v_uint16x32, min_epu16) +OPENCV_HAL_IMPL_AVX512_REDUCE_32(ushort, max, v_uint16x32, max_epu16) +OPENCV_HAL_IMPL_AVX512_REDUCE_32(short, min, v_int16x32, min_epi16) +OPENCV_HAL_IMPL_AVX512_REDUCE_32(short, max, v_int16x32, max_epi16) + +inline int v_reduce_sum(const v_int16x32& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } +inline uint v_reduce_sum(const v_uint16x32& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_64(sctype, func, _Tpvec, ifunc) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { __m256i half = _mm256_##ifunc(_v512_extract_low(a.val), _v512_extract_high(a.val)); \ + __m128i quarter = _mm_##ifunc(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 8)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 4)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 2)); \ + quarter = _mm_##ifunc(quarter, _mm_srli_si128(quarter, 1)); \ + return (sctype)_mm_cvtsi128_si32(quarter); } +OPENCV_HAL_IMPL_AVX512_REDUCE_64(uchar, min, v_uint8x64, min_epu8) +OPENCV_HAL_IMPL_AVX512_REDUCE_64(uchar, max, v_uint8x64, max_epu8) +OPENCV_HAL_IMPL_AVX512_REDUCE_64(schar, min, v_int8x64, min_epi8) +OPENCV_HAL_IMPL_AVX512_REDUCE_64(schar, max, v_int8x64, max_epi8) + +#define OPENCV_HAL_IMPL_AVX512_REDUCE_64_SUM(sctype, _Tpvec, suffix) \ + inline sctype v_reduce_sum(const _Tpvec& a) \ + { __m512i a16 = _mm512_add_epi16(_mm512_cvt##suffix##_epi16(_v512_extract_low(a.val)), \ + _mm512_cvt##suffix##_epi16(_v512_extract_high(a.val))); \ + a16 = _mm512_cvtepi16_epi32(_mm256_add_epi16(_v512_extract_low(a16), _v512_extract_high(a16))); \ + __m256i a8 = _mm256_add_epi32(_v512_extract_low(a16), _v512_extract_high(a16)); \ + __m128i a4 = _mm_add_epi32(_mm256_castsi256_si128(a8), _mm256_extracti128_si256(a8, 1)); \ + a4 = _mm_hadd_epi32(a4, a4); \ + return (sctype)_mm_cvtsi128_si32(_mm_hadd_epi32(a4, a4)); } +OPENCV_HAL_IMPL_AVX512_REDUCE_64_SUM(uint, v_uint8x64, epu8) +OPENCV_HAL_IMPL_AVX512_REDUCE_64_SUM(int, v_int8x64, epi8) + +inline v_float32x16 v_reduce_sum4(const v_float32x16& a, const v_float32x16& b, + const v_float32x16& c, const v_float32x16& d) +{ + __m256 abl = _mm256_hadd_ps(_v512_extract_low(a.val), _v512_extract_low(b.val)); + __m256 abh = _mm256_hadd_ps(_v512_extract_high(a.val), _v512_extract_high(b.val)); + __m256 cdl = _mm256_hadd_ps(_v512_extract_low(c.val), _v512_extract_low(d.val)); + __m256 cdh = _mm256_hadd_ps(_v512_extract_high(c.val), _v512_extract_high(d.val)); + return v_float32x16(_v512_combine(_mm256_hadd_ps(abl, cdl), _mm256_hadd_ps(abh, cdh))); +} + +inline unsigned v_reduce_sad(const v_uint8x64& a, const v_uint8x64& b) +{ + __m512i val = _mm512_sad_epu8(a.val, b.val); + __m256i half = _mm256_add_epi32(_v512_extract_low(val), _v512_extract_high(val)); + __m128i quarter = _mm_add_epi32(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))); +} +inline unsigned v_reduce_sad(const v_int8x64& a, const v_int8x64& b) +{ + __m512i val = _mm512_set1_epi8(-128); + val = _mm512_sad_epu8(_mm512_add_epi8(a.val, val), _mm512_add_epi8(b.val, val)); + __m256i half = _mm256_add_epi32(_v512_extract_low(val), _v512_extract_high(val)); + __m128i quarter = _mm_add_epi32(_mm256_castsi256_si128(half), _mm256_extracti128_si256(half, 1)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(quarter, _mm_unpackhi_epi64(quarter, quarter))); +} +inline unsigned v_reduce_sad(const v_uint16x32& a, const v_uint16x32& b) +{ return v_reduce_sum(v_add_wrap(a - b, b - a)); } +inline unsigned v_reduce_sad(const v_int16x32& a, const v_int16x32& b) +{ return v_reduce_sum(v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b)))); } +inline unsigned v_reduce_sad(const v_uint32x16& a, const v_uint32x16& b) +{ return v_reduce_sum(v_max(a, b) - v_min(a, b)); } +inline unsigned v_reduce_sad(const v_int32x16& a, const v_int32x16& b) +{ return v_reduce_sum(v_reinterpret_as_u32(v_max(a, b) - v_min(a, b))); } +inline float v_reduce_sad(const v_float32x16& a, const v_float32x16& b) +{ return v_reduce_sum((a - b) & v_float32x16(_mm512_castsi512_ps(_mm512_set1_epi32(0x7fffffff)))); } +inline double v_reduce_sad(const v_float64x8& a, const v_float64x8& b) +{ return v_reduce_sum((a - b) & v_float64x8(_mm512_castsi512_pd(_mm512_set1_epi64(0x7fffffffffffffff)))); } + +/** Popcount **/ +inline v_uint8x64 v_popcount(const v_int8x64& a) +{ +#if CV_AVX_512BITALG + return v_uint8x64(_mm512_popcnt_epi8(a.val)); +#elif CV_AVX_512VBMI + __m512i _popcnt_table0 = _v512_set_epu8(7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3, + 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1, + 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1, + 4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0); + __m512i _popcnt_table1 = _v512_set_epu8(7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3, + 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2, + 6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2, + 5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1); + return v_uint8x64(_mm512_sub_epi8(_mm512_permutex2var_epi8(_popcnt_table0, a.val, _popcnt_table1), _mm512_movm_epi8(_mm512_movepi8_mask(a.val)))); +#else + __m512i _popcnt_table = _mm512_set4_epi32(0x04030302, 0x03020201, 0x03020201, 0x02010100); + __m512i _popcnt_mask = _mm512_set1_epi8(0x0F); + + return v_uint8x64(_mm512_add_epi8(_mm512_shuffle_epi8(_popcnt_table, _mm512_and_si512( a.val, _popcnt_mask)), + _mm512_shuffle_epi8(_popcnt_table, _mm512_and_si512(_mm512_srli_epi16(a.val, 4), _popcnt_mask)))); +#endif +} +inline v_uint16x32 v_popcount(const v_int16x32& a) +{ +#if CV_AVX_512BITALG + return v_uint16x32(_mm512_popcnt_epi16(a.val)); +#elif CV_AVX_512VPOPCNTDQ + __m512i zero = _mm512_setzero_si512(); + return v_uint16x32(_mm512_packs_epi32(_mm512_popcnt_epi32(_mm512_unpacklo_epi16(a.val, zero)), + _mm512_popcnt_epi32(_mm512_unpackhi_epi16(a.val, zero)))); +#else + v_uint8x64 p = v_popcount(v_reinterpret_as_s8(a)); + p += v_rotate_right<1>(p); + return v_reinterpret_as_u16(p) & v512_setall_u16(0x00ff); +#endif +} +inline v_uint32x16 v_popcount(const v_int32x16& a) +{ +#if CV_AVX_512VPOPCNTDQ + return v_uint32x16(_mm512_popcnt_epi32(a.val)); +#else + v_uint8x64 p = v_popcount(v_reinterpret_as_s8(a)); + p += v_rotate_right<1>(p); + p += v_rotate_right<2>(p); + return v_reinterpret_as_u32(p) & v512_setall_u32(0x000000ff); +#endif +} +inline v_uint64x8 v_popcount(const v_int64x8& a) +{ +#if CV_AVX_512VPOPCNTDQ + return v_uint64x8(_mm512_popcnt_epi64(a.val)); +#else + return v_uint64x8(_mm512_sad_epu8(v_popcount(v_reinterpret_as_s8(a)).val, _mm512_setzero_si512())); +#endif +} + + +inline v_uint8x64 v_popcount(const v_uint8x64& a) { return v_popcount(v_reinterpret_as_s8 (a)); } +inline v_uint16x32 v_popcount(const v_uint16x32& a) { return v_popcount(v_reinterpret_as_s16(a)); } +inline v_uint32x16 v_popcount(const v_uint32x16& a) { return v_popcount(v_reinterpret_as_s32(a)); } +inline v_uint64x8 v_popcount(const v_uint64x8& a) { return v_popcount(v_reinterpret_as_s64(a)); } + + +////////// Other math ///////// + +/** Some frequent operations **/ +#if CV_FMA3 +#define OPENCV_HAL_IMPL_AVX512_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm512_fmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm512_fmadd_##suffix(a.val, b.val, c.val)); } +#else +#define OPENCV_HAL_IMPL_AVX512_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm512_add_##suffix(_mm512_mul_##suffix(a.val, b.val), c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(_mm512_add_##suffix(_mm512_mul_##suffix(a.val, b.val), c.val)); } +#endif + +#define OPENCV_HAL_IMPL_AVX512_MISC(_Tpvec, suffix) \ + inline _Tpvec v_sqrt(const _Tpvec& x) \ + { return _Tpvec(_mm512_sqrt_##suffix(x.val)); } \ + inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_fma(a, a, b * b); } \ + inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_sqrt(v_fma(a, a, b * b)); } + +OPENCV_HAL_IMPL_AVX512_MULADD(v_float32x16, ps) +OPENCV_HAL_IMPL_AVX512_MULADD(v_float64x8, pd) +OPENCV_HAL_IMPL_AVX512_MISC(v_float32x16, ps) +OPENCV_HAL_IMPL_AVX512_MISC(v_float64x8, pd) + +inline v_int32x16 v_fma(const v_int32x16& a, const v_int32x16& b, const v_int32x16& c) +{ return a * b + c; } +inline v_int32x16 v_muladd(const v_int32x16& a, const v_int32x16& b, const v_int32x16& c) +{ return v_fma(a, b, c); } + +inline v_float32x16 v_invsqrt(const v_float32x16& x) +{ +#if CV_AVX_512ER + return v_float32x16(_mm512_rsqrt28_ps(x.val)); +#else + v_float32x16 half = x * v512_setall_f32(0.5); + v_float32x16 t = v_float32x16(_mm512_rsqrt14_ps(x.val)); + t *= v512_setall_f32(1.5) - ((t * t) * half); + return t; +#endif +} + +inline v_float64x8 v_invsqrt(const v_float64x8& x) +{ +#if CV_AVX_512ER + return v_float64x8(_mm512_rsqrt28_pd(x.val)); +#else + return v512_setall_f64(1.) / v_sqrt(x); +// v_float64x8 half = x * v512_setall_f64(0.5); +// v_float64x8 t = v_float64x8(_mm512_rsqrt14_pd(x.val)); +// t *= v512_setall_f64(1.5) - ((t * t) * half); +// t *= v512_setall_f64(1.5) - ((t * t) * half); +// return t; +#endif +} + +/** Absolute values **/ +#define OPENCV_HAL_IMPL_AVX512_ABS(_Tpvec, _Tpuvec, suffix) \ + inline _Tpuvec v_abs(const _Tpvec& x) \ + { return _Tpuvec(_mm512_abs_##suffix(x.val)); } + +OPENCV_HAL_IMPL_AVX512_ABS(v_int8x64, v_uint8x64, epi8) +OPENCV_HAL_IMPL_AVX512_ABS(v_int16x32, v_uint16x32, epi16) +OPENCV_HAL_IMPL_AVX512_ABS(v_int32x16, v_uint32x16, epi32) +OPENCV_HAL_IMPL_AVX512_ABS(v_int64x8, v_uint64x8, epi64) + +inline v_float32x16 v_abs(const v_float32x16& x) +{ +#ifdef _mm512_abs_pd + return v_float32x16(_mm512_abs_ps(x.val)); +#else + return v_float32x16(_mm512_castsi512_ps(_mm512_and_si512(_mm512_castps_si512(x.val), + _v512_set_epu64(0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF, + 0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF, 0x7FFFFFFF7FFFFFFF)))); +#endif +} + +inline v_float64x8 v_abs(const v_float64x8& x) +{ +#ifdef _mm512_abs_pd + #if defined __GNUC__ && (__GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ <= 3) || (__GNUC__ == 8 && __GNUC_MINOR__ <= 2)) + // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87476 + return v_float64x8(_mm512_abs_pd(_mm512_castpd_ps(x.val))); + #else + return v_float64x8(_mm512_abs_pd(x.val)); + #endif +#else + return v_float64x8(_mm512_castsi512_pd(_mm512_and_si512(_mm512_castpd_si512(x.val), + _v512_set_epu64(0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF)))); +#endif +} + +/** Absolute difference **/ +inline v_uint8x64 v_absdiff(const v_uint8x64& a, const v_uint8x64& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint16x32 v_absdiff(const v_uint16x32& a, const v_uint16x32& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint32x16 v_absdiff(const v_uint32x16& a, const v_uint32x16& b) +{ return v_max(a, b) - v_min(a, b); } + +inline v_uint8x64 v_absdiff(const v_int8x64& a, const v_int8x64& b) +{ + v_int8x64 d = v_sub_wrap(a, b); + v_int8x64 m = a < b; + return v_reinterpret_as_u8(v_sub_wrap(d ^ m, m)); +} + +inline v_uint16x32 v_absdiff(const v_int16x32& a, const v_int16x32& b) +{ return v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))); } + +inline v_uint32x16 v_absdiff(const v_int32x16& a, const v_int32x16& b) +{ + v_int32x16 d = a - b; + v_int32x16 m = a < b; + return v_reinterpret_as_u32((d ^ m) - m); +} + +inline v_float32x16 v_absdiff(const v_float32x16& a, const v_float32x16& b) +{ return v_abs(a - b); } + +inline v_float64x8 v_absdiff(const v_float64x8& a, const v_float64x8& b) +{ return v_abs(a - b); } + +/** Saturating absolute difference **/ +inline v_int8x64 v_absdiffs(const v_int8x64& a, const v_int8x64& b) +{ + v_int8x64 d = a - b; + v_int8x64 m = a < b; + return (d ^ m) - m; +} +inline v_int16x32 v_absdiffs(const v_int16x32& a, const v_int16x32& b) +{ return v_max(a, b) - v_min(a, b); } + +////////// Conversions ///////// + +/** Rounding **/ +inline v_int32x16 v_round(const v_float32x16& a) +{ return v_int32x16(_mm512_cvtps_epi32(a.val)); } + +inline v_int32x16 v_round(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvtpd_epi32(a.val))); } + +inline v_int32x16 v_round(const v_float64x8& a, const v_float64x8& b) +{ return v_int32x16(_v512_combine(_mm512_cvtpd_epi32(a.val), _mm512_cvtpd_epi32(b.val))); } + +inline v_int32x16 v_trunc(const v_float32x16& a) +{ return v_int32x16(_mm512_cvttps_epi32(a.val)); } + +inline v_int32x16 v_trunc(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvttpd_epi32(a.val))); } + +#if CVT_ROUND_MODES_IMPLEMENTED +inline v_int32x16 v_floor(const v_float32x16& a) +{ return v_int32x16(_mm512_cvt_roundps_epi32(a.val, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC)); } + +inline v_int32x16 v_floor(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvt_roundpd_epi32(a.val, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC))); } + +inline v_int32x16 v_ceil(const v_float32x16& a) +{ return v_int32x16(_mm512_cvt_roundps_epi32(a.val, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC)); } + +inline v_int32x16 v_ceil(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvt_roundpd_epi32(a.val, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC))); } +#else +inline v_int32x16 v_floor(const v_float32x16& a) +{ return v_int32x16(_mm512_cvtps_epi32(_mm512_roundscale_ps(a.val, 1))); } + +inline v_int32x16 v_floor(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvtpd_epi32(_mm512_roundscale_pd(a.val, 1)))); } + +inline v_int32x16 v_ceil(const v_float32x16& a) +{ return v_int32x16(_mm512_cvtps_epi32(_mm512_roundscale_ps(a.val, 2))); } + +inline v_int32x16 v_ceil(const v_float64x8& a) +{ return v_int32x16(_mm512_castsi256_si512(_mm512_cvtpd_epi32(_mm512_roundscale_pd(a.val, 2)))); } +#endif + +/** To float **/ +inline v_float32x16 v_cvt_f32(const v_int32x16& a) +{ return v_float32x16(_mm512_cvtepi32_ps(a.val)); } + +inline v_float32x16 v_cvt_f32(const v_float64x8& a) +{ return v_float32x16(_mm512_cvtpd_pslo(a.val)); } + +inline v_float32x16 v_cvt_f32(const v_float64x8& a, const v_float64x8& b) +{ return v_float32x16(_v512_combine(_mm512_cvtpd_ps(a.val), _mm512_cvtpd_ps(b.val))); } + +inline v_float64x8 v_cvt_f64(const v_int32x16& a) +{ return v_float64x8(_mm512_cvtepi32_pd(_v512_extract_low(a.val))); } + +inline v_float64x8 v_cvt_f64_high(const v_int32x16& a) +{ return v_float64x8(_mm512_cvtepi32_pd(_v512_extract_high(a.val))); } + +inline v_float64x8 v_cvt_f64(const v_float32x16& a) +{ return v_float64x8(_mm512_cvtps_pd(_v512_extract_low(a.val))); } + +inline v_float64x8 v_cvt_f64_high(const v_float32x16& a) +{ return v_float64x8(_mm512_cvtps_pd(_v512_extract_high(a.val))); } + +// from (Mysticial and wim) https://stackoverflow.com/q/41144668 +inline v_float64x8 v_cvt_f64(const v_int64x8& v) +{ +#if CV_AVX_512DQ + return v_float64x8(_mm512_cvtepi64_pd(v.val)); +#else + // constants encoded as floating-point + __m512i magic_i_lo = _mm512_set1_epi64(0x4330000000000000); // 2^52 + __m512i magic_i_hi32 = _mm512_set1_epi64(0x4530000080000000); // 2^84 + 2^63 + __m512i magic_i_all = _mm512_set1_epi64(0x4530000080100000); // 2^84 + 2^63 + 2^52 + __m512d magic_d_all = _mm512_castsi512_pd(magic_i_all); + + // Blend the 32 lowest significant bits of v with magic_int_lo + __m512i v_lo = _mm512_mask_blend_epi32(0x5555, magic_i_lo, v.val); + // Extract the 32 most significant bits of v + __m512i v_hi = _mm512_srli_epi64(v.val, 32); + // Flip the msb of v_hi and blend with 0x45300000 + v_hi = _mm512_xor_si512(v_hi, magic_i_hi32); + // Compute in double precision + __m512d v_hi_dbl = _mm512_sub_pd(_mm512_castsi512_pd(v_hi), magic_d_all); + // (v_hi - magic_d_all) + v_lo Do not assume associativity of floating point addition + __m512d result = _mm512_add_pd(v_hi_dbl, _mm512_castsi512_pd(v_lo)); + return v_float64x8(result); +#endif +} + +////////////// Lookup table access //////////////////// + +inline v_int8x64 v512_lut(const schar* tab, const int* idx) +{ + __m128i p0 = _mm512_cvtepi32_epi8(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx ), (const int *)tab, 1)); + __m128i p1 = _mm512_cvtepi32_epi8(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx + 1), (const int *)tab, 1)); + __m128i p2 = _mm512_cvtepi32_epi8(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx + 2), (const int *)tab, 1)); + __m128i p3 = _mm512_cvtepi32_epi8(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx + 3), (const int *)tab, 1)); + return v_int8x64(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_castsi128_si512(p0), p1, 1), p2, 2), p3, 3)); +} +inline v_int8x64 v512_lut_pairs(const schar* tab, const int* idx) +{ + __m256i p0 = _mm512_cvtepi32_epi16(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx ), (const int *)tab, 1)); + __m256i p1 = _mm512_cvtepi32_epi16(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx + 1), (const int *)tab, 1)); + return v_int8x64(_v512_combine(p0, p1)); +} +inline v_int8x64 v512_lut_quads(const schar* tab, const int* idx) +{ + return v_int8x64(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx), (const int *)tab, 1)); +} +inline v_uint8x64 v512_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v512_lut((const schar *)tab, idx)); } +inline v_uint8x64 v512_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v512_lut_pairs((const schar *)tab, idx)); } +inline v_uint8x64 v512_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v512_lut_quads((const schar *)tab, idx)); } + +inline v_int16x32 v512_lut(const short* tab, const int* idx) +{ + __m256i p0 = _mm512_cvtepi32_epi16(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx ), (const int *)tab, 2)); + __m256i p1 = _mm512_cvtepi32_epi16(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx + 1), (const int *)tab, 2)); + return v_int16x32(_v512_combine(p0, p1)); +} +inline v_int16x32 v512_lut_pairs(const short* tab, const int* idx) +{ + return v_int16x32(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx), (const int *)tab, 2)); +} +inline v_int16x32 v512_lut_quads(const short* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int16x32(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), (const long long int*)tab, 2)); +#else + return v_int16x32(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), (const int64*)tab, 2)); +#endif +} +inline v_uint16x32 v512_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v512_lut((const short *)tab, idx)); } +inline v_uint16x32 v512_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v512_lut_pairs((const short *)tab, idx)); } +inline v_uint16x32 v512_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v512_lut_quads((const short *)tab, idx)); } + +inline v_int32x16 v512_lut(const int* tab, const int* idx) +{ + return v_int32x16(_mm512_i32gather_epi32(_mm512_loadu_si512((const __m512i*)idx), tab, 4)); +} +inline v_int32x16 v512_lut_pairs(const int* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int32x16(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), (const long long int*)tab, 4)); +#else + return v_int32x16(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), (const int64*)tab, 4)); +#endif +} +inline v_int32x16 v512_lut_quads(const int* tab, const int* idx) +{ + return v_int32x16(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_castsi128_si512( + _mm_loadu_si128((const __m128i*)(tab + idx[0]))), + _mm_loadu_si128((const __m128i*)(tab + idx[1])), 1), + _mm_loadu_si128((const __m128i*)(tab + idx[2])), 2), + _mm_loadu_si128((const __m128i*)(tab + idx[3])), 3)); +} +inline v_uint32x16 v512_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v512_lut((const int *)tab, idx)); } +inline v_uint32x16 v512_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v512_lut_pairs((const int *)tab, idx)); } +inline v_uint32x16 v512_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v512_lut_quads((const int *)tab, idx)); } + +inline v_int64x8 v512_lut(const int64* tab, const int* idx) +{ +#if defined(__GNUC__) + return v_int64x8(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), (const long long int*)tab, 8)); +#else + return v_int64x8(_mm512_i32gather_epi64(_mm256_loadu_si256((const __m256i*)idx), tab , 8)); +#endif +} +inline v_int64x8 v512_lut_pairs(const int64* tab, const int* idx) +{ + return v_int64x8(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_inserti32x4(_mm512_castsi128_si512( + _mm_loadu_si128((const __m128i*)(tab + idx[0]))), + _mm_loadu_si128((const __m128i*)(tab + idx[1])), 1), + _mm_loadu_si128((const __m128i*)(tab + idx[2])), 2), + _mm_loadu_si128((const __m128i*)(tab + idx[3])), 3)); +} +inline v_uint64x8 v512_lut(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v512_lut((const int64 *)tab, idx)); } +inline v_uint64x8 v512_lut_pairs(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v512_lut_pairs((const int64 *)tab, idx)); } + +inline v_float32x16 v512_lut(const float* tab, const int* idx) +{ + return v_float32x16(_mm512_i32gather_ps(_mm512_loadu_si512((const __m512i*)idx), tab, 4)); +} +inline v_float32x16 v512_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v512_lut_pairs((const int *)tab, idx)); } +inline v_float32x16 v512_lut_quads(const float* tab, const int* idx) { return v_reinterpret_as_f32(v512_lut_quads((const int *)tab, idx)); } + +inline v_float64x8 v512_lut(const double* tab, const int* idx) +{ + return v_float64x8(_mm512_i32gather_pd(_mm256_loadu_si256((const __m256i*)idx), tab, 8)); +} +inline v_float64x8 v512_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x8(_mm512_insertf64x2(_mm512_insertf64x2(_mm512_insertf64x2(_mm512_castpd128_pd512( + _mm_loadu_pd(tab + idx[0])), + _mm_loadu_pd(tab + idx[1]), 1), + _mm_loadu_pd(tab + idx[2]), 2), + _mm_loadu_pd(tab + idx[3]), 3)); +} + +inline v_int32x16 v_lut(const int* tab, const v_int32x16& idxvec) +{ + return v_int32x16(_mm512_i32gather_epi32(idxvec.val, tab, 4)); +} + +inline v_uint32x16 v_lut(const unsigned* tab, const v_int32x16& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x16 v_lut(const float* tab, const v_int32x16& idxvec) +{ + return v_float32x16(_mm512_i32gather_ps(idxvec.val, tab, 4)); +} + +inline v_float64x8 v_lut(const double* tab, const v_int32x16& idxvec) +{ + return v_float64x8(_mm512_i32gather_pd(_v512_extract_low(idxvec.val), tab, 8)); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x16& idxvec, v_float32x16& x, v_float32x16& y) +{ + x.val = _mm512_i32gather_ps(idxvec.val, tab, 4); + y.val = _mm512_i32gather_ps(idxvec.val, &tab[1], 4); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x16& idxvec, v_float64x8& x, v_float64x8& y) +{ + x.val = _mm512_i32gather_pd(_v512_extract_low(idxvec.val), tab, 8); + y.val = _mm512_i32gather_pd(_v512_extract_low(idxvec.val), &tab[1], 8); +} + +inline v_int8x64 v_interleave_pairs(const v_int8x64& vec) +{ + return v_int8x64(_mm512_shuffle_epi8(vec.val, _mm512_set4_epi32(0x0f0d0e0c, 0x0b090a08, 0x07050604, 0x03010200))); +} +inline v_uint8x64 v_interleave_pairs(const v_uint8x64& vec) { return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x64 v_interleave_quads(const v_int8x64& vec) +{ + return v_int8x64(_mm512_shuffle_epi8(vec.val, _mm512_set4_epi32(0x0f0b0e0a, 0x0d090c08, 0x07030602, 0x05010400))); +} +inline v_uint8x64 v_interleave_quads(const v_uint8x64& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x32 v_interleave_pairs(const v_int16x32& vec) +{ + return v_int16x32(_mm512_shuffle_epi8(vec.val, _mm512_set4_epi32(0x0f0e0b0a, 0x0d0c0908, 0x07060302, 0x05040100))); +} +inline v_uint16x32 v_interleave_pairs(const v_uint16x32& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x32 v_interleave_quads(const v_int16x32& vec) +{ + return v_int16x32(_mm512_shuffle_epi8(vec.val, _mm512_set4_epi32(0x0f0e0706, 0x0d0c0504, 0x0b0a0302, 0x09080100))); +} +inline v_uint16x32 v_interleave_quads(const v_uint16x32& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x16 v_interleave_pairs(const v_int32x16& vec) +{ + return v_int32x16(_mm512_shuffle_epi32(vec.val, _MM_PERM_ACBD)); +} +inline v_uint32x16 v_interleave_pairs(const v_uint32x16& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x16 v_interleave_pairs(const v_float32x16& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x64 v_pack_triplets(const v_int8x64& vec) +{ + return v_int8x64(_mm512_permutexvar_epi32(_v512_set_epu64(0x0000000f0000000f, 0x0000000f0000000f, 0x0000000e0000000d, 0x0000000c0000000a, + 0x0000000900000008, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000), + _mm512_shuffle_epi8(vec.val, _mm512_set4_epi32(0xffffff0f, 0x0e0d0c0a, 0x09080605, 0x04020100)))); +} +inline v_uint8x64 v_pack_triplets(const v_uint8x64& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x32 v_pack_triplets(const v_int16x32& vec) +{ + return v_int16x32(_mm512_permutexvar_epi16(_v512_set_epu64(0x001f001f001f001f, 0x001f001f001f001f, 0x001e001d001c001a, 0x0019001800160015, + 0x0014001200110010, 0x000e000d000c000a, 0x0009000800060005, 0x0004000200010000), vec.val)); +} +inline v_uint16x32 v_pack_triplets(const v_uint16x32& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x16 v_pack_triplets(const v_int32x16& vec) +{ + return v_int32x16(_mm512_permutexvar_epi32(_v512_set_epu64(0x0000000f0000000f, 0x0000000f0000000f, 0x0000000e0000000d, 0x0000000c0000000a, + 0x0000000900000008, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000), vec.val)); +} +inline v_uint32x16 v_pack_triplets(const v_uint32x16& vec) { return v_reinterpret_as_u32(v_pack_triplets(v_reinterpret_as_s32(vec))); } +inline v_float32x16 v_pack_triplets(const v_float32x16& vec) +{ + return v_float32x16(_mm512_permutexvar_ps(_v512_set_epu64(0x0000000f0000000f, 0x0000000f0000000f, 0x0000000e0000000d, 0x0000000c0000000a, + 0x0000000900000008, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000), vec.val)); +} + +////////// Matrix operations ///////// + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x16 v_dotprod(const v_int16x32& a, const v_int16x32& b) +{ return v_int32x16(_mm512_madd_epi16(a.val, b.val)); } +inline v_int32x16 v_dotprod(const v_int16x32& a, const v_int16x32& b, const v_int32x16& c) +{ return v_dotprod(a, b) + c; } + +// 32 >> 64 +inline v_int64x8 v_dotprod(const v_int32x16& a, const v_int32x16& b) +{ + __m512i even = _mm512_mul_epi32(a.val, b.val); + __m512i odd = _mm512_mul_epi32(_mm512_srli_epi64(a.val, 32), _mm512_srli_epi64(b.val, 32)); + return v_int64x8(_mm512_add_epi64(even, odd)); +} +inline v_int64x8 v_dotprod(const v_int32x16& a, const v_int32x16& b, const v_int64x8& c) +{ return v_dotprod(a, b) + c; } + +// 8 >> 32 +inline v_uint32x16 v_dotprod_expand(const v_uint8x64& a, const v_uint8x64& b) +{ + __m512i even_a = _mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, a.val, _mm512_setzero_si512()); + __m512i odd_a = _mm512_srli_epi16(a.val, 8); + + __m512i even_b = _mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, b.val, _mm512_setzero_si512()); + __m512i odd_b = _mm512_srli_epi16(b.val, 8); + + __m512i prod0 = _mm512_madd_epi16(even_a, even_b); + __m512i prod1 = _mm512_madd_epi16(odd_a, odd_b); + return v_uint32x16(_mm512_add_epi32(prod0, prod1)); +} +inline v_uint32x16 v_dotprod_expand(const v_uint8x64& a, const v_uint8x64& b, const v_uint32x16& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int32x16 v_dotprod_expand(const v_int8x64& a, const v_int8x64& b) +{ + __m512i even_a = _mm512_srai_epi16(_mm512_bslli_epi128(a.val, 1), 8); + __m512i odd_a = _mm512_srai_epi16(a.val, 8); + + __m512i even_b = _mm512_srai_epi16(_mm512_bslli_epi128(b.val, 1), 8); + __m512i odd_b = _mm512_srai_epi16(b.val, 8); + + __m512i prod0 = _mm512_madd_epi16(even_a, even_b); + __m512i prod1 = _mm512_madd_epi16(odd_a, odd_b); + return v_int32x16(_mm512_add_epi32(prod0, prod1)); +} +inline v_int32x16 v_dotprod_expand(const v_int8x64& a, const v_int8x64& b, const v_int32x16& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x8 v_dotprod_expand(const v_uint16x32& a, const v_uint16x32& b) +{ + __m512i mullo = _mm512_mullo_epi16(a.val, b.val); + __m512i mulhi = _mm512_mulhi_epu16(a.val, b.val); + __m512i mul0 = _mm512_unpacklo_epi16(mullo, mulhi); + __m512i mul1 = _mm512_unpackhi_epi16(mullo, mulhi); + + __m512i p02 = _mm512_mask_blend_epi32(0xAAAA, mul0, _mm512_setzero_si512()); + __m512i p13 = _mm512_srli_epi64(mul0, 32); + __m512i p46 = _mm512_mask_blend_epi32(0xAAAA, mul1, _mm512_setzero_si512()); + __m512i p57 = _mm512_srli_epi64(mul1, 32); + + __m512i p15_ = _mm512_add_epi64(p02, p13); + __m512i p9d_ = _mm512_add_epi64(p46, p57); + + return v_uint64x8(_mm512_add_epi64( + _mm512_unpacklo_epi64(p15_, p9d_), + _mm512_unpackhi_epi64(p15_, p9d_) + )); +} +inline v_uint64x8 v_dotprod_expand(const v_uint16x32& a, const v_uint16x32& b, const v_uint64x8& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x8 v_dotprod_expand(const v_int16x32& a, const v_int16x32& b) +{ + __m512i prod = _mm512_madd_epi16(a.val, b.val); + __m512i even = _mm512_srai_epi64(_mm512_bslli_epi128(prod, 4), 32); + __m512i odd = _mm512_srai_epi64(prod, 32); + return v_int64x8(_mm512_add_epi64(even, odd)); +} +inline v_int64x8 v_dotprod_expand(const v_int16x32& a, const v_int16x32& b, const v_int64x8& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x8 v_dotprod_expand(const v_int32x16& a, const v_int32x16& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x8 v_dotprod_expand(const v_int32x16& a, const v_int32x16& b, const v_float64x8& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x16 v_dotprod_fast(const v_int16x32& a, const v_int16x32& b) +{ return v_dotprod(a, b); } +inline v_int32x16 v_dotprod_fast(const v_int16x32& a, const v_int16x32& b, const v_int32x16& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x8 v_dotprod_fast(const v_int32x16& a, const v_int32x16& b) +{ return v_dotprod(a, b); } +inline v_int64x8 v_dotprod_fast(const v_int32x16& a, const v_int32x16& b, const v_int64x8& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x16 v_dotprod_expand_fast(const v_uint8x64& a, const v_uint8x64& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x16 v_dotprod_expand_fast(const v_uint8x64& a, const v_uint8x64& b, const v_uint32x16& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_int32x16 v_dotprod_expand_fast(const v_int8x64& a, const v_int8x64& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x16 v_dotprod_expand_fast(const v_int8x64& a, const v_int8x64& b, const v_int32x16& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x8 v_dotprod_expand_fast(const v_uint16x32& a, const v_uint16x32& b) +{ + __m512i mullo = _mm512_mullo_epi16(a.val, b.val); + __m512i mulhi = _mm512_mulhi_epu16(a.val, b.val); + __m512i mul0 = _mm512_unpacklo_epi16(mullo, mulhi); + __m512i mul1 = _mm512_unpackhi_epi16(mullo, mulhi); + + __m512i p02 = _mm512_mask_blend_epi32(0xAAAA, mul0, _mm512_setzero_si512()); + __m512i p13 = _mm512_srli_epi64(mul0, 32); + __m512i p46 = _mm512_mask_blend_epi32(0xAAAA, mul1, _mm512_setzero_si512()); + __m512i p57 = _mm512_srli_epi64(mul1, 32); + + __m512i p15_ = _mm512_add_epi64(p02, p13); + __m512i p9d_ = _mm512_add_epi64(p46, p57); + return v_uint64x8(_mm512_add_epi64(p15_, p9d_)); +} +inline v_uint64x8 v_dotprod_expand_fast(const v_uint16x32& a, const v_uint16x32& b, const v_uint64x8& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int64x8 v_dotprod_expand_fast(const v_int16x32& a, const v_int16x32& b) +{ return v_dotprod_expand(a, b); } +inline v_int64x8 v_dotprod_expand_fast(const v_int16x32& a, const v_int16x32& b, const v_int64x8& c) +{ return v_dotprod_expand(a, b, c); } + +// 32 >> 64f +inline v_float64x8 v_dotprod_expand_fast(const v_int32x16& a, const v_int32x16& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x8 v_dotprod_expand_fast(const v_int32x16& a, const v_int32x16& b, const v_float64x8& c) +{ return v_dotprod_expand(a, b) + c; } + + +#define OPENCV_HAL_AVX512_SPLAT2_PS(a, im) \ + v_float32x16(_mm512_permute_ps(a.val, _MM_SHUFFLE(im, im, im, im))) + +inline v_float32x16 v_matmul(const v_float32x16& v, + const v_float32x16& m0, const v_float32x16& m1, + const v_float32x16& m2, const v_float32x16& m3) +{ + v_float32x16 v04 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 0); + v_float32x16 v15 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 1); + v_float32x16 v26 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 2); + v_float32x16 v37 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 3); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, v37 * m3))); +} + +inline v_float32x16 v_matmuladd(const v_float32x16& v, + const v_float32x16& m0, const v_float32x16& m1, + const v_float32x16& m2, const v_float32x16& a) +{ + v_float32x16 v04 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 0); + v_float32x16 v15 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 1); + v_float32x16 v26 = OPENCV_HAL_AVX512_SPLAT2_PS(v, 2); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, a))); +} + +#define OPENCV_HAL_IMPL_AVX512_TRANSPOSE4x4(_Tpvec, suffix, cast_from, cast_to) \ + inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) \ + { \ + __m512i t0 = cast_from(_mm512_unpacklo_##suffix(a0.val, a1.val)); \ + __m512i t1 = cast_from(_mm512_unpacklo_##suffix(a2.val, a3.val)); \ + __m512i t2 = cast_from(_mm512_unpackhi_##suffix(a0.val, a1.val)); \ + __m512i t3 = cast_from(_mm512_unpackhi_##suffix(a2.val, a3.val)); \ + b0.val = cast_to(_mm512_unpacklo_epi64(t0, t1)); \ + b1.val = cast_to(_mm512_unpackhi_epi64(t0, t1)); \ + b2.val = cast_to(_mm512_unpacklo_epi64(t2, t3)); \ + b3.val = cast_to(_mm512_unpackhi_epi64(t2, t3)); \ + } + +OPENCV_HAL_IMPL_AVX512_TRANSPOSE4x4(v_uint32x16, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_AVX512_TRANSPOSE4x4(v_int32x16, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_AVX512_TRANSPOSE4x4(v_float32x16, ps, _mm512_castps_si512, _mm512_castsi512_ps) + +//////////////// Value reordering /////////////// + +/* Expand */ +#define OPENCV_HAL_IMPL_AVX512_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin) \ + inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ + { \ + b0.val = intrin(_v512_extract_low(a.val)); \ + b1.val = intrin(_v512_extract_high(a.val)); \ + } \ + inline _Tpwvec v_expand_low(const _Tpvec& a) \ + { return _Tpwvec(intrin(_v512_extract_low(a.val))); } \ + inline _Tpwvec v_expand_high(const _Tpvec& a) \ + { return _Tpwvec(intrin(_v512_extract_high(a.val))); } \ + inline _Tpwvec v512_load_expand(const _Tp* ptr) \ + { \ + __m256i a = _mm256_loadu_si256((const __m256i*)ptr); \ + return _Tpwvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_AVX512_EXPAND(v_uint8x64, v_uint16x32, uchar, _mm512_cvtepu8_epi16) +OPENCV_HAL_IMPL_AVX512_EXPAND(v_int8x64, v_int16x32, schar, _mm512_cvtepi8_epi16) +OPENCV_HAL_IMPL_AVX512_EXPAND(v_uint16x32, v_uint32x16, ushort, _mm512_cvtepu16_epi32) +OPENCV_HAL_IMPL_AVX512_EXPAND(v_int16x32, v_int32x16, short, _mm512_cvtepi16_epi32) +OPENCV_HAL_IMPL_AVX512_EXPAND(v_uint32x16, v_uint64x8, unsigned, _mm512_cvtepu32_epi64) +OPENCV_HAL_IMPL_AVX512_EXPAND(v_int32x16, v_int64x8, int, _mm512_cvtepi32_epi64) + +#define OPENCV_HAL_IMPL_AVX512_EXPAND_Q(_Tpvec, _Tp, intrin) \ + inline _Tpvec v512_load_expand_q(const _Tp* ptr) \ + { \ + __m128i a = _mm_loadu_si128((const __m128i*)ptr); \ + return _Tpvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_AVX512_EXPAND_Q(v_uint32x16, uchar, _mm512_cvtepu8_epi32) +OPENCV_HAL_IMPL_AVX512_EXPAND_Q(v_int32x16, schar, _mm512_cvtepi8_epi32) + +/* pack */ +// 16 +inline v_int8x64 v_pack(const v_int16x32& a, const v_int16x32& b) +{ return v_int8x64(_mm512_permutexvar_epi64(_v512_set_epu64(7, 5, 3, 1, 6, 4, 2, 0), _mm512_packs_epi16(a.val, b.val))); } + +inline v_uint8x64 v_pack(const v_uint16x32& a, const v_uint16x32& b) +{ + const __m512i t = _mm512_set1_epi16(255); + return v_uint8x64(_v512_combine(_mm512_cvtepi16_epi8(_mm512_min_epu16(a.val, t)), _mm512_cvtepi16_epi8(_mm512_min_epu16(b.val, t)))); +} + +inline v_uint8x64 v_pack_u(const v_int16x32& a, const v_int16x32& b) +{ + return v_uint8x64(_mm512_permutexvar_epi64(_v512_set_epu64(7, 5, 3, 1, 6, 4, 2, 0), _mm512_packus_epi16(a.val, b.val))); +} + +inline void v_pack_store(schar* ptr, const v_int16x32& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(uchar* ptr, const v_uint16x32& a) +{ + const __m512i m = _mm512_set1_epi16(255); + _mm256_storeu_si256((__m256i*)ptr, _mm512_cvtepi16_epi8(_mm512_min_epu16(a.val, m))); +} + +inline void v_pack_u_store(uchar* ptr, const v_int16x32& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + +template inline +v_uint8x64 v_rshr_pack(const v_uint16x32& a, const v_uint16x32& b) +{ + // we assume that n > 0, and so the shifted 16-bit values can be treated as signed numbers. + v_uint16x32 delta = v512_setall_u16((short)(1 << (n-1))); + return v_pack_u(v_reinterpret_as_s16((a + delta) >> n), + v_reinterpret_as_s16((b + delta) >> n)); +} + +template inline +void v_rshr_pack_store(uchar* ptr, const v_uint16x32& a) +{ + v_uint16x32 delta = v512_setall_u16((short)(1 << (n-1))); + v_pack_u_store(ptr, v_reinterpret_as_s16((a + delta) >> n)); +} + +template inline +v_uint8x64 v_rshr_pack_u(const v_int16x32& a, const v_int16x32& b) +{ + v_int16x32 delta = v512_setall_s16((short)(1 << (n-1))); + return v_pack_u((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_u_store(uchar* ptr, const v_int16x32& a) +{ + v_int16x32 delta = v512_setall_s16((short)(1 << (n-1))); + v_pack_u_store(ptr, (a + delta) >> n); +} + +template inline +v_int8x64 v_rshr_pack(const v_int16x32& a, const v_int16x32& b) +{ + v_int16x32 delta = v512_setall_s16((short)(1 << (n-1))); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(schar* ptr, const v_int16x32& a) +{ + v_int16x32 delta = v512_setall_s16((short)(1 << (n-1))); + v_pack_store(ptr, (a + delta) >> n); +} + +// 32 +inline v_int16x32 v_pack(const v_int32x16& a, const v_int32x16& b) +{ return v_int16x32(_mm512_permutexvar_epi64(_v512_set_epu64(7, 5, 3, 1, 6, 4, 2, 0), _mm512_packs_epi32(a.val, b.val))); } + +inline v_uint16x32 v_pack(const v_uint32x16& a, const v_uint32x16& b) +{ + const __m512i m = _mm512_set1_epi32(65535); + return v_uint16x32(_v512_combine(_mm512_cvtepi32_epi16(_mm512_min_epu32(a.val, m)), _mm512_cvtepi32_epi16(_mm512_min_epu32(b.val, m)))); +} + +inline v_uint16x32 v_pack_u(const v_int32x16& a, const v_int32x16& b) +{ return v_uint16x32(_mm512_permutexvar_epi64(_v512_set_epu64(7, 5, 3, 1, 6, 4, 2, 0), _mm512_packus_epi32(a.val, b.val))); } + +inline void v_pack_store(short* ptr, const v_int32x16& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(ushort* ptr, const v_uint32x16& a) +{ + const __m512i m = _mm512_set1_epi32(65535); + _mm256_storeu_si256((__m256i*)ptr, _mm512_cvtepi32_epi16(_mm512_min_epu32(a.val, m))); +} + +inline void v_pack_u_store(ushort* ptr, const v_int32x16& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + + +template inline +v_uint16x32 v_rshr_pack(const v_uint32x16& a, const v_uint32x16& b) +{ + v_uint32x16 delta = v512_setall_u32(1 << (n-1)); + return v_pack_u(v_reinterpret_as_s32((a + delta) >> n), + v_reinterpret_as_s32((b + delta) >> n)); +} + +template inline +void v_rshr_pack_store(ushort* ptr, const v_uint32x16& a) +{ + v_uint32x16 delta = v512_setall_u32(1 << (n-1)); + v_pack_u_store(ptr, v_reinterpret_as_s32((a + delta) >> n)); +} + +template inline +v_uint16x32 v_rshr_pack_u(const v_int32x16& a, const v_int32x16& b) +{ + v_int32x16 delta = v512_setall_s32(1 << (n-1)); + return v_pack_u((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_u_store(ushort* ptr, const v_int32x16& a) +{ + v_int32x16 delta = v512_setall_s32(1 << (n-1)); + v_pack_u_store(ptr, (a + delta) >> n); +} + +template inline +v_int16x32 v_rshr_pack(const v_int32x16& a, const v_int32x16& b) +{ + v_int32x16 delta = v512_setall_s32(1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(short* ptr, const v_int32x16& a) +{ + v_int32x16 delta = v512_setall_s32(1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +// 64 +// Non-saturating pack +inline v_uint32x16 v_pack(const v_uint64x8& a, const v_uint64x8& b) +{ return v_uint32x16(_v512_combine(_mm512_cvtepi64_epi32(a.val), _mm512_cvtepi64_epi32(b.val))); } + +inline v_int32x16 v_pack(const v_int64x8& a, const v_int64x8& b) +{ return v_reinterpret_as_s32(v_pack(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); } + +inline void v_pack_store(unsigned* ptr, const v_uint64x8& a) +{ _mm256_storeu_si256((__m256i*)ptr, _mm512_cvtepi64_epi32(a.val)); } + +inline void v_pack_store(int* ptr, const v_int64x8& b) +{ v_pack_store((unsigned*)ptr, v_reinterpret_as_u64(b)); } + +template inline +v_uint32x16 v_rshr_pack(const v_uint64x8& a, const v_uint64x8& b) +{ + v_uint64x8 delta = v512_setall_u64((uint64)1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(unsigned* ptr, const v_uint64x8& a) +{ + v_uint64x8 delta = v512_setall_u64((uint64)1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +template inline +v_int32x16 v_rshr_pack(const v_int64x8& a, const v_int64x8& b) +{ + v_int64x8 delta = v512_setall_s64((int64)1 << (n-1)); + return v_pack((a + delta) >> n, (b + delta) >> n); +} + +template inline +void v_rshr_pack_store(int* ptr, const v_int64x8& a) +{ + v_int64x8 delta = v512_setall_s64((int64)1 << (n-1)); + v_pack_store(ptr, (a + delta) >> n); +} + +// pack boolean +inline v_uint8x64 v_pack_b(const v_uint16x32& a, const v_uint16x32& b) +{ return v_uint8x64(_mm512_permutexvar_epi64(_v512_set_epu64(7, 5, 3, 1, 6, 4, 2, 0), _mm512_packs_epi16(a.val, b.val))); } + +inline v_uint8x64 v_pack_b(const v_uint32x16& a, const v_uint32x16& b, + const v_uint32x16& c, const v_uint32x16& d) +{ + __m512i ab = _mm512_packs_epi32(a.val, b.val); + __m512i cd = _mm512_packs_epi32(c.val, d.val); + + return v_uint8x64(_mm512_permutexvar_epi32(_v512_set_epu32(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0), _mm512_packs_epi16(ab, cd))); +} + +inline v_uint8x64 v_pack_b(const v_uint64x8& a, const v_uint64x8& b, const v_uint64x8& c, + const v_uint64x8& d, const v_uint64x8& e, const v_uint64x8& f, + const v_uint64x8& g, const v_uint64x8& h) +{ + __m512i ab = _mm512_packs_epi32(a.val, b.val); + __m512i cd = _mm512_packs_epi32(c.val, d.val); + __m512i ef = _mm512_packs_epi32(e.val, f.val); + __m512i gh = _mm512_packs_epi32(g.val, h.val); + + __m512i abcd = _mm512_packs_epi32(ab, cd); + __m512i efgh = _mm512_packs_epi32(ef, gh); + + return v_uint8x64(_mm512_permutexvar_epi16(_v512_set_epu16(31, 23, 15, 7, 30, 22, 14, 6, 29, 21, 13, 5, 28, 20, 12, 4, + 27, 19, 11, 3, 26, 18, 10, 2, 25, 17, 9, 1, 24, 16, 8, 0), _mm512_packs_epi16(abcd, efgh))); +} + +/* Recombine */ +// its up there with load and store operations + +/* Extract */ +#define OPENCV_HAL_IMPL_AVX512_EXTRACT(_Tpvec) \ + template \ + inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ + { return v_rotate_right(a, b); } + +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_uint8x64) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_int8x64) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_uint16x32) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_int16x32) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_uint32x16) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_int32x16) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_uint64x8) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_int64x8) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_float32x16) +OPENCV_HAL_IMPL_AVX512_EXTRACT(v_float64x8) + +#define OPENCV_HAL_IMPL_AVX512_EXTRACT_N(_Tpvec, _Tp) \ +template inline _Tp v_extract_n(_Tpvec v) { return v_rotate_right(v).get0(); } + +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_uint8x64, uchar) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_int8x64, schar) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_uint16x32, ushort) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_int16x32, short) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_uint32x16, uint) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_int32x16, int) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_uint64x8, uint64) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_int64x8, int64) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_float32x16, float) +OPENCV_HAL_IMPL_AVX512_EXTRACT_N(v_float64x8, double) + +template +inline v_uint32x16 v_broadcast_element(v_uint32x16 a) +{ + static const __m512i perm = _mm512_set1_epi32((char)i); + return v_uint32x16(_mm512_permutexvar_epi32(perm, a.val)); +} + +template +inline v_int32x16 v_broadcast_element(const v_int32x16 &a) +{ return v_reinterpret_as_s32(v_broadcast_element(v_reinterpret_as_u32(a))); } + +template +inline v_float32x16 v_broadcast_element(const v_float32x16 &a) +{ return v_reinterpret_as_f32(v_broadcast_element(v_reinterpret_as_u32(a))); } + + +///////////////////// load deinterleave ///////////////////////////// + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x64& a, v_uint8x64& b ) +{ + __m512i ab0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i ab1 = _mm512_loadu_si512((const __m512i*)(ptr + 64)); +#if CV_AVX_512VBMI + __m512i mask0 = _v512_set_epu8(126, 124, 122, 120, 118, 116, 114, 112, 110, 108, 106, 104, 102, 100, 98, 96, + 94, 92, 90, 88, 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, + 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu8(127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + a = v_uint8x64(_mm512_permutex2var_epi8(ab0, mask0, ab1)); + b = v_uint8x64(_mm512_permutex2var_epi8(ab0, mask1, ab1)); +#else + __m512i mask0 = _mm512_set4_epi32(0x0f0d0b09, 0x07050301, 0x0e0c0a08, 0x06040200); + __m512i a0b0 = _mm512_shuffle_epi8(ab0, mask0); + __m512i a1b1 = _mm512_shuffle_epi8(ab1, mask0); + __m512i mask1 = _v512_set_epu64(14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask2 = _v512_set_epu64(15, 13, 11, 9, 7, 5, 3, 1); + a = v_uint8x64(_mm512_permutex2var_epi64(a0b0, mask1, a1b1)); + b = v_uint8x64(_mm512_permutex2var_epi64(a0b0, mask2, a1b1)); +#endif +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x32& a, v_uint16x32& b ) +{ + __m512i ab0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i ab1 = _mm512_loadu_si512((const __m512i*)(ptr + 32)); + __m512i mask0 = _v512_set_epu16(62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu16(63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + a = v_uint16x32(_mm512_permutex2var_epi16(ab0, mask0, ab1)); + b = v_uint16x32(_mm512_permutex2var_epi16(ab0, mask1, ab1)); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x16& a, v_uint32x16& b ) +{ + __m512i ab0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i ab1 = _mm512_loadu_si512((const __m512i*)(ptr + 16)); + __m512i mask0 = _v512_set_epu32(30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu32(31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + a = v_uint32x16(_mm512_permutex2var_epi32(ab0, mask0, ab1)); + b = v_uint32x16(_mm512_permutex2var_epi32(ab0, mask1, ab1)); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x8& a, v_uint64x8& b ) +{ + __m512i ab0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i ab1 = _mm512_loadu_si512((const __m512i*)(ptr + 8)); + __m512i mask0 = _v512_set_epu64(14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu64(15, 13, 11, 9, 7, 5, 3, 1); + a = v_uint64x8(_mm512_permutex2var_epi64(ab0, mask0, ab1)); + b = v_uint64x8(_mm512_permutex2var_epi64(ab0, mask1, ab1)); +} + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x64& a, v_uint8x64& b, v_uint8x64& c ) +{ + __m512i bgr0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgr1 = _mm512_loadu_si512((const __m512i*)(ptr + 64)); + __m512i bgr2 = _mm512_loadu_si512((const __m512i*)(ptr + 128)); + +#if CV_AVX_512VBMI2 + __m512i mask0 = _v512_set_epu8(126, 123, 120, 117, 114, 111, 108, 105, 102, 99, 96, 93, 90, 87, 84, 81, + 78, 75, 72, 69, 66, 63, 60, 57, 54, 51, 48, 45, 42, 39, 36, 33, + 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0, 62, 59, 56, 53, 50, + 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2); + __m512i r0b01 = _mm512_permutex2var_epi8(bgr0, mask0, bgr1); + __m512i b1g12 = _mm512_permutex2var_epi8(bgr1, mask0, bgr2); + __m512i r12b2 = _mm512_permutex2var_epi8(bgr1, + _v512_set_epu8(125, 122, 119, 116, 113, 110, 107, 104, 101, 98, 95, 92, 89, 86, 83, 80, + 77, 74, 71, 68, 65, 127, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, + 94, 91, 88, 85, 82, 79, 76, 73, 70, 67, 64, 61, 58, 55, 52, 49, + 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7, 4, 1), bgr2); + a = v_uint8x64(_mm512_mask_compress_epi8(r12b2, 0xffffffffffe00000, r0b01)); + b = v_uint8x64(_mm512_mask_compress_epi8(b1g12, 0x2492492492492492, bgr0)); + c = v_uint8x64(_mm512_mask_expand_epi8(r0b01, 0xffffffffffe00000, r12b2)); +#elif CV_AVX_512VBMI + __m512i b0g0b1 = _mm512_mask_blend_epi8(0xb6db6db6db6db6db, bgr1, bgr0); + __m512i g1r1g2 = _mm512_mask_blend_epi8(0xb6db6db6db6db6db, bgr2, bgr1); + __m512i r2b2r0 = _mm512_mask_blend_epi8(0xb6db6db6db6db6db, bgr0, bgr2); + a = v_uint8x64(_mm512_permutex2var_epi8(b0g0b1, _v512_set_epu8(125, 122, 119, 116, 113, 110, 107, 104, 101, 98, 95, 92, 89, 86, 83, 80, + 77, 74, 71, 68, 65, 63, 61, 60, 58, 57, 55, 54, 52, 51, 49, 48, + 46, 45, 43, 42, 40, 39, 37, 36, 34, 33, 31, 30, 28, 27, 25, 24, + 23, 21, 20, 18, 17, 15, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0), bgr2)); + b = v_uint8x64(_mm512_permutex2var_epi8(g1r1g2, _v512_set_epu8( 63, 61, 60, 58, 57, 55, 54, 52, 51, 49, 48, 46, 45, 43, 42, 40, + 39, 37, 36, 34, 33, 31, 30, 28, 27, 25, 24, 23, 21, 20, 18, 17, + 15, 14, 12, 11, 9, 8, 6, 5, 3, 2, 0, 126, 123, 120, 117, 114, + 111, 108, 105, 102, 99, 96, 93, 90, 87, 84, 81, 78, 75, 72, 69, 66), bgr0)); + c = v_uint8x64(_mm512_permutex2var_epi8(r2b2r0, _v512_set_epu8( 63, 60, 57, 54, 51, 48, 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, + 15, 12, 9, 6, 3, 0, 125, 122, 119, 116, 113, 110, 107, 104, 101, 98, + 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 65, 62, 59, 56, 53, 50, + 47, 44, 41, 38, 35, 32, 29, 26, 23, 20, 17, 14, 11, 8, 5, 2), bgr1)); +#else + __m512i mask0 = _v512_set_epu16(61, 58, 55, 52, 49, 46, 43, 40, 37, 34, 63, 60, 57, 54, 51, 48, + 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0); + __m512i b01g1 = _mm512_permutex2var_epi16(bgr0, mask0, bgr1); + __m512i r12b2 = _mm512_permutex2var_epi16(bgr1, mask0, bgr2); + __m512i g20r0 = _mm512_permutex2var_epi16(bgr2, mask0, bgr0); + + __m512i b0g0 = _mm512_mask_blend_epi32(0xf800, b01g1, r12b2); + __m512i r0b1 = _mm512_permutex2var_epi16(bgr1, _v512_set_epu16(42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 29, 26, 23, 20, 17, + 14, 11, 8, 5, 2, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43), g20r0); + __m512i g1r1 = _mm512_alignr_epi32(r12b2, g20r0, 11); + a = v_uint8x64(_mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, b0g0, r0b1)); + c = v_uint8x64(_mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, r0b1, g1r1)); + b = v_uint8x64(_mm512_shuffle_epi8(_mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, g1r1, b0g0), _mm512_set4_epi32(0x0e0f0c0d, 0x0a0b0809, 0x06070405, 0x02030001))); +#endif +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x32& a, v_uint16x32& b, v_uint16x32& c ) +{ + __m512i bgr0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgr1 = _mm512_loadu_si512((const __m512i*)(ptr + 32)); + __m512i bgr2 = _mm512_loadu_si512((const __m512i*)(ptr + 64)); + + __m512i mask0 = _v512_set_epu16(61, 58, 55, 52, 49, 46, 43, 40, 37, 34, 63, 60, 57, 54, 51, 48, + 45, 42, 39, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0); + __m512i b01g1 = _mm512_permutex2var_epi16(bgr0, mask0, bgr1); + __m512i r12b2 = _mm512_permutex2var_epi16(bgr1, mask0, bgr2); + __m512i g20r0 = _mm512_permutex2var_epi16(bgr2, mask0, bgr0); + + a = v_uint16x32(_mm512_mask_blend_epi32(0xf800, b01g1, r12b2)); + b = v_uint16x32(_mm512_permutex2var_epi16(bgr1, _v512_set_epu16(42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 29, 26, 23, 20, 17, + 14, 11, 8, 5, 2, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43), g20r0)); + c = v_uint16x32(_mm512_alignr_epi32(r12b2, g20r0, 11)); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x16& a, v_uint32x16& b, v_uint32x16& c ) +{ + __m512i bgr0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgr1 = _mm512_loadu_si512((const __m512i*)(ptr + 16)); + __m512i bgr2 = _mm512_loadu_si512((const __m512i*)(ptr + 32)); + + __m512i mask0 = _v512_set_epu32(29, 26, 23, 20, 17, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 0); + __m512i b01r1 = _mm512_permutex2var_epi32(bgr0, mask0, bgr1); + __m512i g12b2 = _mm512_permutex2var_epi32(bgr1, mask0, bgr2); + __m512i r20g0 = _mm512_permutex2var_epi32(bgr2, mask0, bgr0); + + a = v_uint32x16(_mm512_mask_blend_epi32(0xf800, b01r1, g12b2)); + b = v_uint32x16(_mm512_alignr_epi32(g12b2, r20g0, 11)); + c = v_uint32x16(_mm512_permutex2var_epi32(bgr1, _v512_set_epu32(21, 20, 19, 18, 17, 16, 13, 10, 7, 4, 1, 26, 25, 24, 23, 22), r20g0)); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x8& a, v_uint64x8& b, v_uint64x8& c ) +{ + __m512i bgr0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgr1 = _mm512_loadu_si512((const __m512i*)(ptr + 8)); + __m512i bgr2 = _mm512_loadu_si512((const __m512i*)(ptr + 16)); + + __m512i mask0 = _v512_set_epu64(13, 10, 15, 12, 9, 6, 3, 0); + __m512i b01g1 = _mm512_permutex2var_epi64(bgr0, mask0, bgr1); + __m512i r12b2 = _mm512_permutex2var_epi64(bgr1, mask0, bgr2); + __m512i g20r0 = _mm512_permutex2var_epi64(bgr2, mask0, bgr0); + + a = v_uint64x8(_mm512_mask_blend_epi64(0xc0, b01g1, r12b2)); + c = v_uint64x8(_mm512_alignr_epi64(r12b2, g20r0, 6)); + b = v_uint64x8(_mm512_permutex2var_epi64(bgr1, _v512_set_epu64(10, 9, 8, 5, 2, 13, 12, 11), g20r0)); +} + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x64& a, v_uint8x64& b, v_uint8x64& c, v_uint8x64& d ) +{ + __m512i bgra0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgra1 = _mm512_loadu_si512((const __m512i*)(ptr + 64)); + __m512i bgra2 = _mm512_loadu_si512((const __m512i*)(ptr + 128)); + __m512i bgra3 = _mm512_loadu_si512((const __m512i*)(ptr + 192)); + +#if CV_AVX_512VBMI + __m512i mask0 = _v512_set_epu8(126, 124, 122, 120, 118, 116, 114, 112, 110, 108, 106, 104, 102, 100, 98, 96, + 94, 92, 90, 88, 86, 84, 82, 80, 78, 76, 74, 72, 70, 68, 66, 64, + 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu8(127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + + __m512i br01 = _mm512_permutex2var_epi8(bgra0, mask0, bgra1); + __m512i ga01 = _mm512_permutex2var_epi8(bgra0, mask1, bgra1); + __m512i br23 = _mm512_permutex2var_epi8(bgra2, mask0, bgra3); + __m512i ga23 = _mm512_permutex2var_epi8(bgra2, mask1, bgra3); + + a = v_uint8x64(_mm512_permutex2var_epi8(br01, mask0, br23)); + c = v_uint8x64(_mm512_permutex2var_epi8(br01, mask1, br23)); + b = v_uint8x64(_mm512_permutex2var_epi8(ga01, mask0, ga23)); + d = v_uint8x64(_mm512_permutex2var_epi8(ga01, mask1, ga23)); +#else + __m512i mask = _mm512_set4_epi32(0x0f0b0703, 0x0e0a0602, 0x0d090501, 0x0c080400); + __m512i b0g0r0a0 = _mm512_shuffle_epi8(bgra0, mask); + __m512i b1g1r1a1 = _mm512_shuffle_epi8(bgra1, mask); + __m512i b2g2r2a2 = _mm512_shuffle_epi8(bgra2, mask); + __m512i b3g3r3a3 = _mm512_shuffle_epi8(bgra3, mask); + + __m512i mask0 = _v512_set_epu32(30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu32(31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + + __m512i br01 = _mm512_permutex2var_epi32(b0g0r0a0, mask0, b1g1r1a1); + __m512i ga01 = _mm512_permutex2var_epi32(b0g0r0a0, mask1, b1g1r1a1); + __m512i br23 = _mm512_permutex2var_epi32(b2g2r2a2, mask0, b3g3r3a3); + __m512i ga23 = _mm512_permutex2var_epi32(b2g2r2a2, mask1, b3g3r3a3); + + a = v_uint8x64(_mm512_permutex2var_epi32(br01, mask0, br23)); + c = v_uint8x64(_mm512_permutex2var_epi32(br01, mask1, br23)); + b = v_uint8x64(_mm512_permutex2var_epi32(ga01, mask0, ga23)); + d = v_uint8x64(_mm512_permutex2var_epi32(ga01, mask1, ga23)); +#endif +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x32& a, v_uint16x32& b, v_uint16x32& c, v_uint16x32& d ) +{ + __m512i bgra0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgra1 = _mm512_loadu_si512((const __m512i*)(ptr + 32)); + __m512i bgra2 = _mm512_loadu_si512((const __m512i*)(ptr + 64)); + __m512i bgra3 = _mm512_loadu_si512((const __m512i*)(ptr + 96)); + + __m512i mask0 = _v512_set_epu16(62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, + 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu16(63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + + __m512i br01 = _mm512_permutex2var_epi16(bgra0, mask0, bgra1); + __m512i ga01 = _mm512_permutex2var_epi16(bgra0, mask1, bgra1); + __m512i br23 = _mm512_permutex2var_epi16(bgra2, mask0, bgra3); + __m512i ga23 = _mm512_permutex2var_epi16(bgra2, mask1, bgra3); + + a = v_uint16x32(_mm512_permutex2var_epi16(br01, mask0, br23)); + c = v_uint16x32(_mm512_permutex2var_epi16(br01, mask1, br23)); + b = v_uint16x32(_mm512_permutex2var_epi16(ga01, mask0, ga23)); + d = v_uint16x32(_mm512_permutex2var_epi16(ga01, mask1, ga23)); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x16& a, v_uint32x16& b, v_uint32x16& c, v_uint32x16& d ) +{ + __m512i bgra0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgra1 = _mm512_loadu_si512((const __m512i*)(ptr + 16)); + __m512i bgra2 = _mm512_loadu_si512((const __m512i*)(ptr + 32)); + __m512i bgra3 = _mm512_loadu_si512((const __m512i*)(ptr + 48)); + + __m512i mask0 = _v512_set_epu32(30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu32(31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1); + + __m512i br01 = _mm512_permutex2var_epi32(bgra0, mask0, bgra1); + __m512i ga01 = _mm512_permutex2var_epi32(bgra0, mask1, bgra1); + __m512i br23 = _mm512_permutex2var_epi32(bgra2, mask0, bgra3); + __m512i ga23 = _mm512_permutex2var_epi32(bgra2, mask1, bgra3); + + a = v_uint32x16(_mm512_permutex2var_epi32(br01, mask0, br23)); + c = v_uint32x16(_mm512_permutex2var_epi32(br01, mask1, br23)); + b = v_uint32x16(_mm512_permutex2var_epi32(ga01, mask0, ga23)); + d = v_uint32x16(_mm512_permutex2var_epi32(ga01, mask1, ga23)); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x8& a, v_uint64x8& b, v_uint64x8& c, v_uint64x8& d ) +{ + __m512i bgra0 = _mm512_loadu_si512((const __m512i*)ptr); + __m512i bgra1 = _mm512_loadu_si512((const __m512i*)(ptr + 8)); + __m512i bgra2 = _mm512_loadu_si512((const __m512i*)(ptr + 16)); + __m512i bgra3 = _mm512_loadu_si512((const __m512i*)(ptr + 24)); + + __m512i mask0 = _v512_set_epu64(14, 12, 10, 8, 6, 4, 2, 0); + __m512i mask1 = _v512_set_epu64(15, 13, 11, 9, 7, 5, 3, 1); + + __m512i br01 = _mm512_permutex2var_epi64(bgra0, mask0, bgra1); + __m512i ga01 = _mm512_permutex2var_epi64(bgra0, mask1, bgra1); + __m512i br23 = _mm512_permutex2var_epi64(bgra2, mask0, bgra3); + __m512i ga23 = _mm512_permutex2var_epi64(bgra2, mask1, bgra3); + + a = v_uint64x8(_mm512_permutex2var_epi64(br01, mask0, br23)); + c = v_uint64x8(_mm512_permutex2var_epi64(br01, mask1, br23)); + b = v_uint64x8(_mm512_permutex2var_epi64(ga01, mask0, ga23)); + d = v_uint64x8(_mm512_permutex2var_epi64(ga01, mask1, ga23)); +} + +///////////////////////////// store interleave ///////////////////////////////////// + +inline void v_store_interleave( uchar* ptr, const v_uint8x64& x, const v_uint8x64& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint8x64 low, high; + v_zip(x, y, low, high); + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, low.val); + _mm512_stream_si512((__m512i*)(ptr + 64), high.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, low.val); + _mm512_store_si512((__m512i*)(ptr + 64), high.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, low.val); + _mm512_storeu_si512((__m512i*)(ptr + 64), high.val); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x32& x, const v_uint16x32& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint16x32 low, high; + v_zip(x, y, low, high); + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, low.val); + _mm512_stream_si512((__m512i*)(ptr + 32), high.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, low.val); + _mm512_store_si512((__m512i*)(ptr + 32), high.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, low.val); + _mm512_storeu_si512((__m512i*)(ptr + 32), high.val); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x16& x, const v_uint32x16& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint32x16 low, high; + v_zip(x, y, low, high); + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, low.val); + _mm512_stream_si512((__m512i*)(ptr + 16), high.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, low.val); + _mm512_store_si512((__m512i*)(ptr + 16), high.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, low.val); + _mm512_storeu_si512((__m512i*)(ptr + 16), high.val); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x8& x, const v_uint64x8& y, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint64x8 low, high; + v_zip(x, y, low, high); + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, low.val); + _mm512_stream_si512((__m512i*)(ptr + 8), high.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, low.val); + _mm512_store_si512((__m512i*)(ptr + 8), high.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, low.val); + _mm512_storeu_si512((__m512i*)(ptr + 8), high.val); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x64& a, const v_uint8x64& b, const v_uint8x64& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ +#if CV_AVX_512VBMI + __m512i mask0 = _v512_set_epu8(127, 84, 20, 126, 83, 19, 125, 82, 18, 124, 81, 17, 123, 80, 16, 122, + 79, 15, 121, 78, 14, 120, 77, 13, 119, 76, 12, 118, 75, 11, 117, 74, + 10, 116, 73, 9, 115, 72, 8, 114, 71, 7, 113, 70, 6, 112, 69, 5, + 111, 68, 4, 110, 67, 3, 109, 66, 2, 108, 65, 1, 107, 64, 0, 106); + __m512i mask1 = _v512_set_epu8( 21, 42, 105, 20, 41, 104, 19, 40, 103, 18, 39, 102, 17, 38, 101, 16, + 37, 100, 15, 36, 99, 14, 35, 98, 13, 34, 97, 12, 33, 96, 11, 32, + 95, 10, 31, 94, 9, 30, 93, 8, 29, 92, 7, 28, 91, 6, 27, 90, + 5, 26, 89, 4, 25, 88, 3, 24, 87, 2, 23, 86, 1, 22, 85, 0); + __m512i mask2 = _v512_set_epu8(106, 127, 63, 105, 126, 62, 104, 125, 61, 103, 124, 60, 102, 123, 59, 101, + 122, 58, 100, 121, 57, 99, 120, 56, 98, 119, 55, 97, 118, 54, 96, 117, + 53, 95, 116, 52, 94, 115, 51, 93, 114, 50, 92, 113, 49, 91, 112, 48, + 90, 111, 47, 89, 110, 46, 88, 109, 45, 87, 108, 44, 86, 107, 43, 85); + __m512i r2g0r0 = _mm512_permutex2var_epi8(b.val, mask0, c.val); + __m512i b0r1b1 = _mm512_permutex2var_epi8(a.val, mask1, c.val); + __m512i g1b2g2 = _mm512_permutex2var_epi8(a.val, mask2, b.val); + + __m512i bgr0 = _mm512_mask_blend_epi8(0x9249249249249249, r2g0r0, b0r1b1); + __m512i bgr1 = _mm512_mask_blend_epi8(0x9249249249249249, b0r1b1, g1b2g2); + __m512i bgr2 = _mm512_mask_blend_epi8(0x9249249249249249, g1b2g2, r2g0r0); +#else + __m512i g1g0 = _mm512_shuffle_epi8(b.val, _mm512_set4_epi32(0x0e0f0c0d, 0x0a0b0809, 0x06070405, 0x02030001)); + __m512i b0g0 = _mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, a.val, g1g0); + __m512i r0b1 = _mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, c.val, a.val); + __m512i g1r1 = _mm512_mask_blend_epi8(0xAAAAAAAAAAAAAAAA, g1g0, c.val); + + __m512i mask0 = _v512_set_epu16(42, 10, 31, 41, 9, 30, 40, 8, 29, 39, 7, 28, 38, 6, 27, 37, + 5, 26, 36, 4, 25, 35, 3, 24, 34, 2, 23, 33, 1, 22, 32, 0); + __m512i mask1 = _v512_set_epu16(21, 52, 41, 20, 51, 40, 19, 50, 39, 18, 49, 38, 17, 48, 37, 16, + 47, 36, 15, 46, 35, 14, 45, 34, 13, 44, 33, 12, 43, 32, 11, 42); + __m512i mask2 = _v512_set_epu16(63, 31, 20, 62, 30, 19, 61, 29, 18, 60, 28, 17, 59, 27, 16, 58, + 26, 15, 57, 25, 14, 56, 24, 13, 55, 23, 12, 54, 22, 11, 53, 21); + __m512i b0g0b2 = _mm512_permutex2var_epi16(b0g0, mask0, r0b1); + __m512i r1b1r0 = _mm512_permutex2var_epi16(b0g0, mask1, g1r1); + __m512i g2r2g1 = _mm512_permutex2var_epi16(r0b1, mask2, g1r1); + + __m512i bgr0 = _mm512_mask_blend_epi16(0x24924924, b0g0b2, r1b1r0); + __m512i bgr1 = _mm512_mask_blend_epi16(0x24924924, r1b1r0, g2r2g1); + __m512i bgr2 = _mm512_mask_blend_epi16(0x24924924, g2r2g1, b0g0b2); +#endif + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgr0); + _mm512_stream_si512((__m512i*)(ptr + 64), bgr1); + _mm512_stream_si512((__m512i*)(ptr + 128), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgr0); + _mm512_store_si512((__m512i*)(ptr + 64), bgr1); + _mm512_store_si512((__m512i*)(ptr + 128), bgr2); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgr0); + _mm512_storeu_si512((__m512i*)(ptr + 64), bgr1); + _mm512_storeu_si512((__m512i*)(ptr + 128), bgr2); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x32& a, const v_uint16x32& b, const v_uint16x32& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m512i mask0 = _v512_set_epu16(42, 10, 31, 41, 9, 30, 40, 8, 29, 39, 7, 28, 38, 6, 27, 37, + 5, 26, 36, 4, 25, 35, 3, 24, 34, 2, 23, 33, 1, 22, 32, 0); + __m512i mask1 = _v512_set_epu16(21, 52, 41, 20, 51, 40, 19, 50, 39, 18, 49, 38, 17, 48, 37, 16, + 47, 36, 15, 46, 35, 14, 45, 34, 13, 44, 33, 12, 43, 32, 11, 42); + __m512i mask2 = _v512_set_epu16(63, 31, 20, 62, 30, 19, 61, 29, 18, 60, 28, 17, 59, 27, 16, 58, + 26, 15, 57, 25, 14, 56, 24, 13, 55, 23, 12, 54, 22, 11, 53, 21); + __m512i b0g0b2 = _mm512_permutex2var_epi16(a.val, mask0, b.val); + __m512i r1b1r0 = _mm512_permutex2var_epi16(a.val, mask1, c.val); + __m512i g2r2g1 = _mm512_permutex2var_epi16(b.val, mask2, c.val); + + __m512i bgr0 = _mm512_mask_blend_epi16(0x24924924, b0g0b2, r1b1r0); + __m512i bgr1 = _mm512_mask_blend_epi16(0x24924924, r1b1r0, g2r2g1); + __m512i bgr2 = _mm512_mask_blend_epi16(0x24924924, g2r2g1, b0g0b2); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgr0); + _mm512_stream_si512((__m512i*)(ptr + 32), bgr1); + _mm512_stream_si512((__m512i*)(ptr + 64), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgr0); + _mm512_store_si512((__m512i*)(ptr + 32), bgr1); + _mm512_store_si512((__m512i*)(ptr + 64), bgr2); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgr0); + _mm512_storeu_si512((__m512i*)(ptr + 32), bgr1); + _mm512_storeu_si512((__m512i*)(ptr + 64), bgr2); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x16& a, const v_uint32x16& b, const v_uint32x16& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m512i mask0 = _v512_set_epu32(26, 31, 15, 25, 30, 14, 24, 29, 13, 23, 28, 12, 22, 27, 11, 21); + __m512i mask1 = _v512_set_epu32(31, 10, 25, 30, 9, 24, 29, 8, 23, 28, 7, 22, 27, 6, 21, 26); + __m512i g1b2g2 = _mm512_permutex2var_epi32(a.val, mask0, b.val); + __m512i r2r1b1 = _mm512_permutex2var_epi32(a.val, mask1, c.val); + + __m512i bgr0 = _mm512_mask_expand_epi32(_mm512_mask_expand_epi32(_mm512_maskz_expand_epi32(0x9249, a.val), 0x2492, b.val), 0x4924, c.val); + __m512i bgr1 = _mm512_mask_blend_epi32(0x9249, r2r1b1, g1b2g2); + __m512i bgr2 = _mm512_mask_blend_epi32(0x9249, g1b2g2, r2r1b1); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgr0); + _mm512_stream_si512((__m512i*)(ptr + 16), bgr1); + _mm512_stream_si512((__m512i*)(ptr + 32), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgr0); + _mm512_store_si512((__m512i*)(ptr + 16), bgr1); + _mm512_store_si512((__m512i*)(ptr + 32), bgr2); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgr0); + _mm512_storeu_si512((__m512i*)(ptr + 16), bgr1); + _mm512_storeu_si512((__m512i*)(ptr + 32), bgr2); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x8& a, const v_uint64x8& b, const v_uint64x8& c, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + __m512i mask0 = _v512_set_epu64( 5, 12, 7, 4, 11, 6, 3, 10); + __m512i mask1 = _v512_set_epu64(15, 7, 4, 14, 6, 3, 13, 5); + __m512i r1b1b2 = _mm512_permutex2var_epi64(a.val, mask0, c.val); + __m512i g2r2g1 = _mm512_permutex2var_epi64(b.val, mask1, c.val); + + __m512i bgr0 = _mm512_mask_expand_epi64(_mm512_mask_expand_epi64(_mm512_maskz_expand_epi64(0x49, a.val), 0x92, b.val), 0x24, c.val); + __m512i bgr1 = _mm512_mask_blend_epi64(0xdb, g2r2g1, r1b1b2); + __m512i bgr2 = _mm512_mask_blend_epi64(0xdb, r1b1b2, g2r2g1); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgr0); + _mm512_stream_si512((__m512i*)(ptr + 8), bgr1); + _mm512_stream_si512((__m512i*)(ptr + 16), bgr2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgr0); + _mm512_store_si512((__m512i*)(ptr + 8), bgr1); + _mm512_store_si512((__m512i*)(ptr + 16), bgr2); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgr0); + _mm512_storeu_si512((__m512i*)(ptr + 8), bgr1); + _mm512_storeu_si512((__m512i*)(ptr + 16), bgr2); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x64& a, const v_uint8x64& b, + const v_uint8x64& c, const v_uint8x64& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint8x64 br01, br23, ga01, ga23; + v_zip(a, c, br01, br23); + v_zip(b, d, ga01, ga23); + v_uint8x64 bgra0, bgra1, bgra2, bgra3; + v_zip(br01, ga01, bgra0, bgra1); + v_zip(br23, ga23, bgra2, bgra3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgra0.val); + _mm512_stream_si512((__m512i*)(ptr + 64), bgra1.val); + _mm512_stream_si512((__m512i*)(ptr + 128), bgra2.val); + _mm512_stream_si512((__m512i*)(ptr + 192), bgra3.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgra0.val); + _mm512_store_si512((__m512i*)(ptr + 64), bgra1.val); + _mm512_store_si512((__m512i*)(ptr + 128), bgra2.val); + _mm512_store_si512((__m512i*)(ptr + 192), bgra3.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgra0.val); + _mm512_storeu_si512((__m512i*)(ptr + 64), bgra1.val); + _mm512_storeu_si512((__m512i*)(ptr + 128), bgra2.val); + _mm512_storeu_si512((__m512i*)(ptr + 192), bgra3.val); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x32& a, const v_uint16x32& b, + const v_uint16x32& c, const v_uint16x32& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint16x32 br01, br23, ga01, ga23; + v_zip(a, c, br01, br23); + v_zip(b, d, ga01, ga23); + v_uint16x32 bgra0, bgra1, bgra2, bgra3; + v_zip(br01, ga01, bgra0, bgra1); + v_zip(br23, ga23, bgra2, bgra3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgra0.val); + _mm512_stream_si512((__m512i*)(ptr + 32), bgra1.val); + _mm512_stream_si512((__m512i*)(ptr + 64), bgra2.val); + _mm512_stream_si512((__m512i*)(ptr + 96), bgra3.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgra0.val); + _mm512_store_si512((__m512i*)(ptr + 32), bgra1.val); + _mm512_store_si512((__m512i*)(ptr + 64), bgra2.val); + _mm512_store_si512((__m512i*)(ptr + 96), bgra3.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgra0.val); + _mm512_storeu_si512((__m512i*)(ptr + 32), bgra1.val); + _mm512_storeu_si512((__m512i*)(ptr + 64), bgra2.val); + _mm512_storeu_si512((__m512i*)(ptr + 96), bgra3.val); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x16& a, const v_uint32x16& b, + const v_uint32x16& c, const v_uint32x16& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint32x16 br01, br23, ga01, ga23; + v_zip(a, c, br01, br23); + v_zip(b, d, ga01, ga23); + v_uint32x16 bgra0, bgra1, bgra2, bgra3; + v_zip(br01, ga01, bgra0, bgra1); + v_zip(br23, ga23, bgra2, bgra3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgra0.val); + _mm512_stream_si512((__m512i*)(ptr + 16), bgra1.val); + _mm512_stream_si512((__m512i*)(ptr + 32), bgra2.val); + _mm512_stream_si512((__m512i*)(ptr + 48), bgra3.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgra0.val); + _mm512_store_si512((__m512i*)(ptr + 16), bgra1.val); + _mm512_store_si512((__m512i*)(ptr + 32), bgra2.val); + _mm512_store_si512((__m512i*)(ptr + 48), bgra3.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgra0.val); + _mm512_storeu_si512((__m512i*)(ptr + 16), bgra1.val); + _mm512_storeu_si512((__m512i*)(ptr + 32), bgra2.val); + _mm512_storeu_si512((__m512i*)(ptr + 48), bgra3.val); + } +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x8& a, const v_uint64x8& b, + const v_uint64x8& c, const v_uint64x8& d, + hal::StoreMode mode=hal::STORE_UNALIGNED ) +{ + v_uint64x8 br01, br23, ga01, ga23; + v_zip(a, c, br01, br23); + v_zip(b, d, ga01, ga23); + v_uint64x8 bgra0, bgra1, bgra2, bgra3; + v_zip(br01, ga01, bgra0, bgra1); + v_zip(br23, ga23, bgra2, bgra3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm512_stream_si512((__m512i*)ptr, bgra0.val); + _mm512_stream_si512((__m512i*)(ptr + 8), bgra1.val); + _mm512_stream_si512((__m512i*)(ptr + 16), bgra2.val); + _mm512_stream_si512((__m512i*)(ptr + 24), bgra3.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm512_store_si512((__m512i*)ptr, bgra0.val); + _mm512_store_si512((__m512i*)(ptr + 8), bgra1.val); + _mm512_store_si512((__m512i*)(ptr + 16), bgra2.val); + _mm512_store_si512((__m512i*)(ptr + 24), bgra3.val); + } + else + { + _mm512_storeu_si512((__m512i*)ptr, bgra0.val); + _mm512_storeu_si512((__m512i*)(ptr + 8), bgra1.val); + _mm512_storeu_si512((__m512i*)(ptr + 16), bgra2.val); + _mm512_storeu_si512((__m512i*)(ptr + 24), bgra3.val); + } +} + +#define OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0 ) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0 ) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0, _Tpvec0& d0 ) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, const _Tpvec0& c0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode mode=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1, mode); \ +} + +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_int8x64, schar, s8, v_uint8x64, uchar, u8) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_int16x32, short, s16, v_uint16x32, ushort, u16) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_int32x16, int, s32, v_uint32x16, unsigned, u32) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_float32x16, float, f32, v_uint32x16, unsigned, u32) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_int64x8, int64, s64, v_uint64x8, uint64, u64) +OPENCV_HAL_IMPL_AVX512_LOADSTORE_INTERLEAVE(v_float64x8, double, f64, v_uint64x8, uint64, u64) + +////////// Mask and checks ///////// + +/** Mask **/ +inline int64 v_signmask(const v_int8x64& a) { return (int64)_mm512_movepi8_mask(a.val); } +inline int v_signmask(const v_int16x32& a) { return (int)_mm512_cmp_epi16_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } +inline int v_signmask(const v_int32x16& a) { return (int)_mm512_cmp_epi32_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } +inline int v_signmask(const v_int64x8& a) { return (int)_mm512_cmp_epi64_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } + +inline int64 v_signmask(const v_uint8x64& a) { return v_signmask(v_reinterpret_as_s8(a)); } +inline int v_signmask(const v_uint16x32& a) { return v_signmask(v_reinterpret_as_s16(a)); } +inline int v_signmask(const v_uint32x16& a) { return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_uint64x8& a) { return v_signmask(v_reinterpret_as_s64(a)); } +inline int v_signmask(const v_float32x16& a) { return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_float64x8& a) { return v_signmask(v_reinterpret_as_s64(a)); } + +/** Checks **/ +inline bool v_check_all(const v_int8x64& a) { return !(bool)_mm512_cmp_epi8_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_NLT); } +inline bool v_check_any(const v_int8x64& a) { return (bool)_mm512_movepi8_mask(a.val); } +inline bool v_check_all(const v_int16x32& a) { return !(bool)_mm512_cmp_epi16_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_NLT); } +inline bool v_check_any(const v_int16x32& a) { return (bool)_mm512_cmp_epi16_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } +inline bool v_check_all(const v_int32x16& a) { return !(bool)_mm512_cmp_epi32_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_NLT); } +inline bool v_check_any(const v_int32x16& a) { return (bool)_mm512_cmp_epi32_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } +inline bool v_check_all(const v_int64x8& a) { return !(bool)_mm512_cmp_epi64_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_NLT); } +inline bool v_check_any(const v_int64x8& a) { return (bool)_mm512_cmp_epi64_mask(a.val, _mm512_setzero_si512(), _MM_CMPINT_LT); } + +inline bool v_check_all(const v_float32x16& a) { return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_float32x16& a) { return v_check_any(v_reinterpret_as_s32(a)); } +inline bool v_check_all(const v_float64x8& a) { return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_float64x8& a) { return v_check_any(v_reinterpret_as_s64(a)); } +inline bool v_check_all(const v_uint8x64& a) { return v_check_all(v_reinterpret_as_s8(a)); } +inline bool v_check_all(const v_uint16x32& a) { return v_check_all(v_reinterpret_as_s16(a)); } +inline bool v_check_all(const v_uint32x16& a) { return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_all(const v_uint64x8& a) { return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_uint8x64& a) { return v_check_any(v_reinterpret_as_s8(a)); } +inline bool v_check_any(const v_uint16x32& a) { return v_check_any(v_reinterpret_as_s16(a)); } +inline bool v_check_any(const v_uint32x16& a) { return v_check_any(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_uint64x8& a) { return v_check_any(v_reinterpret_as_s64(a)); } + +inline int v_scan_forward(const v_int8x64& a) +{ + int64 mask = _mm512_movepi8_mask(a.val); + int mask32 = (int)mask; + return mask != 0 ? mask32 != 0 ? trailingZeros32(mask32) : 32 + trailingZeros32((int)(mask >> 32)) : 0; +} +inline int v_scan_forward(const v_uint8x64& a) { return v_scan_forward(v_reinterpret_as_s8(a)); } +inline int v_scan_forward(const v_int16x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))); } +inline int v_scan_forward(const v_uint16x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))); } +inline int v_scan_forward(const v_int32x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 2; } +inline int v_scan_forward(const v_uint32x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 2; } +inline int v_scan_forward(const v_float32x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 2; } +inline int v_scan_forward(const v_int64x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 4; } +inline int v_scan_forward(const v_uint64x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 4; } +inline int v_scan_forward(const v_float64x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s16(a))) / 4; } + +inline void v512_cleanup() { _mm256_zeroall(); } + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: + +#endif // OPENCV_HAL_INTRIN_AVX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_cpp.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_cpp.hpp new file mode 100644 index 0000000..e9a09d1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_cpp.hpp @@ -0,0 +1,3317 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_INTRIN_CPP_HPP +#define OPENCV_HAL_INTRIN_CPP_HPP + +#include +#include +#include +#include "opencv2/core/utility.hpp" +#include "opencv2/core/saturate.hpp" + +//! @cond IGNORED +#define CV_SIMD128_CPP 1 +#if defined(CV_FORCE_SIMD128_CPP) +#define CV_SIMD128 1 +#define CV_SIMD128_64F 1 +#endif +#if defined(CV_DOXYGEN) +#define CV_SIMD128 1 +#define CV_SIMD128_64F 1 +#define CV_SIMD256 1 +#define CV_SIMD256_64F 1 +#define CV_SIMD512 1 +#define CV_SIMD512_64F 1 +#else +#define CV_SIMD256 0 // Explicitly disable SIMD256 and SIMD512 support for scalar intrinsic implementation +#define CV_SIMD512 0 // to avoid warnings during compilation +#endif +//! @endcond + +namespace cv +{ + +#ifndef CV_DOXYGEN +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN +#endif + +/** @addtogroup core_hal_intrin + +"Universal intrinsics" is a types and functions set intended to simplify vectorization of code on +different platforms. Currently a few different SIMD extensions on different architectures are supported. +128 bit registers of various types support is implemented for a wide range of architectures +including x86(__SSE/SSE2/SSE4.2__), ARM(__NEON__), PowerPC(__VSX__), MIPS(__MSA__). +256 bit long registers are supported on x86(__AVX2__) and 512 bit long registers are supported on x86(__AVX512__). +In case when there is no SIMD extension available during compilation, fallback C++ implementation of intrinsics +will be chosen and code will work as expected although it could be slower. + +### Types + +There are several types representing packed values vector registers, each type is +implemented as a structure based on a one SIMD register. + +- cv::v_uint8 and cv::v_int8: 8-bit integer values (unsigned/signed) - char +- cv::v_uint16 and cv::v_int16: 16-bit integer values (unsigned/signed) - short +- cv::v_uint32 and cv::v_int32: 32-bit integer values (unsigned/signed) - int +- cv::v_uint64 and cv::v_int64: 64-bit integer values (unsigned/signed) - int64 +- cv::v_float32: 32-bit floating point values (signed) - float +- cv::v_float64: 64-bit floating point values (signed) - double + +Exact bit length(and value quantity) of listed types is compile time deduced and depends on architecture SIMD +capabilities chosen as available during compilation of the library. All the types contains __nlanes__ enumeration +to check for exact value quantity of the type. + +In case the exact bit length of the type is important it is possible to use specific fixed length register types. + +There are several types representing 128-bit registers. + +- cv::v_uint8x16 and cv::v_int8x16: sixteen 8-bit integer values (unsigned/signed) - char +- cv::v_uint16x8 and cv::v_int16x8: eight 16-bit integer values (unsigned/signed) - short +- cv::v_uint32x4 and cv::v_int32x4: four 32-bit integer values (unsigned/signed) - int +- cv::v_uint64x2 and cv::v_int64x2: two 64-bit integer values (unsigned/signed) - int64 +- cv::v_float32x4: four 32-bit floating point values (signed) - float +- cv::v_float64x2: two 64-bit floating point values (signed) - double + +There are several types representing 256-bit registers. + +- cv::v_uint8x32 and cv::v_int8x32: thirty two 8-bit integer values (unsigned/signed) - char +- cv::v_uint16x16 and cv::v_int16x16: sixteen 16-bit integer values (unsigned/signed) - short +- cv::v_uint32x8 and cv::v_int32x8: eight 32-bit integer values (unsigned/signed) - int +- cv::v_uint64x4 and cv::v_int64x4: four 64-bit integer values (unsigned/signed) - int64 +- cv::v_float32x8: eight 32-bit floating point values (signed) - float +- cv::v_float64x4: four 64-bit floating point values (signed) - double + +@note +256 bit registers at the moment implemented for AVX2 SIMD extension only, if you want to use this type directly, +don't forget to check the CV_SIMD256 preprocessor definition: +@code +#if CV_SIMD256 +//... +#endif +@endcode + +There are several types representing 512-bit registers. + +- cv::v_uint8x64 and cv::v_int8x64: sixty four 8-bit integer values (unsigned/signed) - char +- cv::v_uint16x32 and cv::v_int16x32: thirty two 16-bit integer values (unsigned/signed) - short +- cv::v_uint32x16 and cv::v_int32x16: sixteen 32-bit integer values (unsigned/signed) - int +- cv::v_uint64x8 and cv::v_int64x8: eight 64-bit integer values (unsigned/signed) - int64 +- cv::v_float32x16: sixteen 32-bit floating point values (signed) - float +- cv::v_float64x8: eight 64-bit floating point values (signed) - double +@note +512 bit registers at the moment implemented for AVX512 SIMD extension only, if you want to use this type directly, +don't forget to check the CV_SIMD512 preprocessor definition. + +@note +cv::v_float64x2 is not implemented in NEON variant, if you want to use this type, don't forget to +check the CV_SIMD128_64F preprocessor definition. + +### Load and store operations + +These operations allow to set contents of the register explicitly or by loading it from some memory +block and to save contents of the register to memory block. + +There are variable size register load operations that provide result of maximum available size +depending on chosen platform capabilities. +- Constructors: +@ref v_reg::v_reg(const _Tp *ptr) "from memory", +- Other create methods: +vx_setall_s8, vx_setall_u8, ..., +vx_setzero_u8, vx_setzero_s8, ... +- Memory load operations: +vx_load, vx_load_aligned, vx_load_low, vx_load_halves, +- Memory operations with expansion of values: +vx_load_expand, vx_load_expand_q + +Also there are fixed size register load/store operations. + +For 128 bit registers +- Constructors: +@ref v_reg::v_reg(const _Tp *ptr) "from memory", +@ref v_reg::v_reg(_Tp s0, _Tp s1) "from two values", ... +- Other create methods: +@ref v_setall_s8, @ref v_setall_u8, ..., +@ref v_setzero_u8, @ref v_setzero_s8, ... +- Memory load operations: +@ref v_load, @ref v_load_aligned, @ref v_load_low, @ref v_load_halves, +- Memory operations with expansion of values: +@ref v_load_expand, @ref v_load_expand_q + +For 256 bit registers(check CV_SIMD256 preprocessor definition) +- Constructors: +@ref v_reg::v_reg(const _Tp *ptr) "from memory", +@ref v_reg::v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3) "from four values", ... +- Other create methods: +@ref v256_setall_s8, @ref v256_setall_u8, ..., +@ref v256_setzero_u8, @ref v256_setzero_s8, ... +- Memory load operations: +@ref v256_load, @ref v256_load_aligned, @ref v256_load_low, @ref v256_load_halves, +- Memory operations with expansion of values: +@ref v256_load_expand, @ref v256_load_expand_q + +For 512 bit registers(check CV_SIMD512 preprocessor definition) +- Constructors: +@ref v_reg::v_reg(const _Tp *ptr) "from memory", +@ref v_reg::v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3, _Tp s4, _Tp s5, _Tp s6, _Tp s7) "from eight values", ... +- Other create methods: +@ref v512_setall_s8, @ref v512_setall_u8, ..., +@ref v512_setzero_u8, @ref v512_setzero_s8, ... +- Memory load operations: +@ref v512_load, @ref v512_load_aligned, @ref v512_load_low, @ref v512_load_halves, +- Memory operations with expansion of values: +@ref v512_load_expand, @ref v512_load_expand_q + +Store to memory operations are similar across different platform capabilities: +@ref v_store, @ref v_store_aligned, +@ref v_store_high, @ref v_store_low + +### Value reordering + +These operations allow to reorder or recombine elements in one or multiple vectors. + +- Interleave, deinterleave (2, 3 and 4 channels): @ref v_load_deinterleave, @ref v_store_interleave +- Expand: @ref v_expand, @ref v_expand_low, @ref v_expand_high +- Pack: @ref v_pack, @ref v_pack_u, @ref v_pack_b, @ref v_rshr_pack, @ref v_rshr_pack_u, +@ref v_pack_store, @ref v_pack_u_store, @ref v_rshr_pack_store, @ref v_rshr_pack_u_store +- Recombine: @ref v_zip, @ref v_recombine, @ref v_combine_low, @ref v_combine_high +- Reverse: @ref v_reverse +- Extract: @ref v_extract + + +### Arithmetic, bitwise and comparison operations + +Element-wise binary and unary operations. + +- Arithmetics: +@ref operator +(const v_reg &a, const v_reg &b) "+", +@ref operator -(const v_reg &a, const v_reg &b) "-", +@ref operator *(const v_reg &a, const v_reg &b) "*", +@ref operator /(const v_reg &a, const v_reg &b) "/", +@ref v_mul_expand + +- Non-saturating arithmetics: @ref v_add_wrap, @ref v_sub_wrap + +- Bitwise shifts: +@ref operator <<(const v_reg &a, int s) "<<", +@ref operator >>(const v_reg &a, int s) ">>", +@ref v_shl, @ref v_shr + +- Bitwise logic: +@ref operator &(const v_reg &a, const v_reg &b) "&", +@ref operator |(const v_reg &a, const v_reg &b) "|", +@ref operator ^(const v_reg &a, const v_reg &b) "^", +@ref operator ~(const v_reg &a) "~" + +- Comparison: +@ref operator >(const v_reg &a, const v_reg &b) ">", +@ref operator >=(const v_reg &a, const v_reg &b) ">=", +@ref operator <(const v_reg &a, const v_reg &b) "<", +@ref operator <=(const v_reg &a, const v_reg &b) "<=", +@ref operator ==(const v_reg &a, const v_reg &b) "==", +@ref operator !=(const v_reg &a, const v_reg &b) "!=" + +- min/max: @ref v_min, @ref v_max + +### Reduce and mask + +Most of these operations return only one value. + +- Reduce: @ref v_reduce_min, @ref v_reduce_max, @ref v_reduce_sum, @ref v_popcount +- Mask: @ref v_signmask, @ref v_check_all, @ref v_check_any, @ref v_select + +### Other math + +- Some frequent operations: @ref v_sqrt, @ref v_invsqrt, @ref v_magnitude, @ref v_sqr_magnitude +- Absolute values: @ref v_abs, @ref v_absdiff, @ref v_absdiffs + +### Conversions + +Different type conversions and casts: + +- Rounding: @ref v_round, @ref v_floor, @ref v_ceil, @ref v_trunc, +- To float: @ref v_cvt_f32, @ref v_cvt_f64 +- Reinterpret: @ref v_reinterpret_as_u8, @ref v_reinterpret_as_s8, ... + +### Matrix operations + +In these operations vectors represent matrix rows/columns: @ref v_dotprod, @ref v_dotprod_fast, +@ref v_dotprod_expand, @ref v_dotprod_expand_fast, @ref v_matmul, @ref v_transpose4x4 + +### Usability + +Most operations are implemented only for some subset of the available types, following matrices +shows the applicability of different operations to the types. + +Regular integers: + +| Operations\\Types | uint 8 | int 8 | uint 16 | int 16 | uint 32 | int 32 | +|-------------------|:-:|:-:|:-:|:-:|:-:|:-:| +|load, store | x | x | x | x | x | x | +|interleave | x | x | x | x | x | x | +|expand | x | x | x | x | x | x | +|expand_low | x | x | x | x | x | x | +|expand_high | x | x | x | x | x | x | +|expand_q | x | x | | | | | +|add, sub | x | x | x | x | x | x | +|add_wrap, sub_wrap | x | x | x | x | | | +|mul_wrap | x | x | x | x | | | +|mul | x | x | x | x | x | x | +|mul_expand | x | x | x | x | x | | +|compare | x | x | x | x | x | x | +|shift | | | x | x | x | x | +|dotprod | | | | x | | x | +|dotprod_fast | | | | x | | x | +|dotprod_expand | x | x | x | x | | x | +|dotprod_expand_fast| x | x | x | x | | x | +|logical | x | x | x | x | x | x | +|min, max | x | x | x | x | x | x | +|absdiff | x | x | x | x | x | x | +|absdiffs | | x | | x | | | +|reduce | x | x | x | x | x | x | +|mask | x | x | x | x | x | x | +|pack | x | x | x | x | x | x | +|pack_u | x | | x | | | | +|pack_b | x | | | | | | +|unpack | x | x | x | x | x | x | +|extract | x | x | x | x | x | x | +|rotate (lanes) | x | x | x | x | x | x | +|cvt_flt32 | | | | | | x | +|cvt_flt64 | | | | | | x | +|transpose4x4 | | | | | x | x | +|reverse | x | x | x | x | x | x | +|extract_n | x | x | x | x | x | x | +|broadcast_element | | | | | x | x | + +Big integers: + +| Operations\\Types | uint 64 | int 64 | +|-------------------|:-:|:-:| +|load, store | x | x | +|add, sub | x | x | +|shift | x | x | +|logical | x | x | +|reverse | x | x | +|extract | x | x | +|rotate (lanes) | x | x | +|cvt_flt64 | | x | +|extract_n | x | x | + +Floating point: + +| Operations\\Types | float 32 | float 64 | +|-------------------|:-:|:-:| +|load, store | x | x | +|interleave | x | | +|add, sub | x | x | +|mul | x | x | +|div | x | x | +|compare | x | x | +|min, max | x | x | +|absdiff | x | x | +|reduce | x | | +|mask | x | x | +|unpack | x | x | +|cvt_flt32 | | x | +|cvt_flt64 | x | | +|sqrt, abs | x | x | +|float math | x | x | +|transpose4x4 | x | | +|extract | x | x | +|rotate (lanes) | x | x | +|reverse | x | x | +|extract_n | x | x | +|broadcast_element | x | | + + @{ */ + +template struct v_reg +{ +//! @cond IGNORED + typedef _Tp lane_type; + enum { nlanes = n }; +// !@endcond + + /** @brief Constructor + + Initializes register with data from memory + @param ptr pointer to memory block with data for register */ + explicit v_reg(const _Tp* ptr) { for( int i = 0; i < n; i++ ) s[i] = ptr[i]; } + + /** @brief Constructor + + Initializes register with two 64-bit values */ + v_reg(_Tp s0, _Tp s1) { s[0] = s0; s[1] = s1; } + + /** @brief Constructor + + Initializes register with four 32-bit values */ + v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3) { s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; } + + /** @brief Constructor + + Initializes register with eight 16-bit values */ + v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3, + _Tp s4, _Tp s5, _Tp s6, _Tp s7) + { + s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; + s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7; + } + + /** @brief Constructor + + Initializes register with sixteen 8-bit values */ + v_reg(_Tp s0, _Tp s1, _Tp s2, _Tp s3, + _Tp s4, _Tp s5, _Tp s6, _Tp s7, + _Tp s8, _Tp s9, _Tp s10, _Tp s11, + _Tp s12, _Tp s13, _Tp s14, _Tp s15) + { + s[0] = s0; s[1] = s1; s[2] = s2; s[3] = s3; + s[4] = s4; s[5] = s5; s[6] = s6; s[7] = s7; + s[8] = s8; s[9] = s9; s[10] = s10; s[11] = s11; + s[12] = s12; s[13] = s13; s[14] = s14; s[15] = s15; + } + + /** @brief Default constructor + + Does not initialize anything*/ + v_reg() {} + + /** @brief Copy constructor */ + v_reg(const v_reg<_Tp, n> & r) + { + for( int i = 0; i < n; i++ ) + s[i] = r.s[i]; + } + /** @brief Access first value + + Returns value of the first lane according to register type, for example: + @code{.cpp} + v_int32x4 r(1, 2, 3, 4); + int v = r.get0(); // returns 1 + v_uint64x2 r(1, 2); + uint64_t v = r.get0(); // returns 1 + @endcode + */ + _Tp get0() const { return s[0]; } + +//! @cond IGNORED + _Tp get(const int i) const { return s[i]; } + v_reg<_Tp, n> high() const + { + v_reg<_Tp, n> c; + int i; + for( i = 0; i < n/2; i++ ) + { + c.s[i] = s[i+(n/2)]; + c.s[i+(n/2)] = 0; + } + return c; + } + + static v_reg<_Tp, n> zero() + { + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = (_Tp)0; + return c; + } + + static v_reg<_Tp, n> all(_Tp s) + { + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = s; + return c; + } + + template v_reg<_Tp2, n2> reinterpret_as() const + { + size_t bytes = std::min(sizeof(_Tp2)*n2, sizeof(_Tp)*n); + v_reg<_Tp2, n2> c; + std::memcpy(&c.s[0], &s[0], bytes); + return c; + } + + v_reg& operator=(const v_reg<_Tp, n> & r) + { + for( int i = 0; i < n; i++ ) + s[i] = r.s[i]; + return *this; + } + + _Tp s[n]; +//! @endcond +}; + +/** @brief Sixteen 8-bit unsigned integer values */ +typedef v_reg v_uint8x16; +/** @brief Sixteen 8-bit signed integer values */ +typedef v_reg v_int8x16; +/** @brief Eight 16-bit unsigned integer values */ +typedef v_reg v_uint16x8; +/** @brief Eight 16-bit signed integer values */ +typedef v_reg v_int16x8; +/** @brief Four 32-bit unsigned integer values */ +typedef v_reg v_uint32x4; +/** @brief Four 32-bit signed integer values */ +typedef v_reg v_int32x4; +/** @brief Four 32-bit floating point values (single precision) */ +typedef v_reg v_float32x4; +/** @brief Two 64-bit floating point values (double precision) */ +typedef v_reg v_float64x2; +/** @brief Two 64-bit unsigned integer values */ +typedef v_reg v_uint64x2; +/** @brief Two 64-bit signed integer values */ +typedef v_reg v_int64x2; + +#if CV_SIMD256 +/** @brief Thirty two 8-bit unsigned integer values */ +typedef v_reg v_uint8x32; +/** @brief Thirty two 8-bit signed integer values */ +typedef v_reg v_int8x32; +/** @brief Sixteen 16-bit unsigned integer values */ +typedef v_reg v_uint16x16; +/** @brief Sixteen 16-bit signed integer values */ +typedef v_reg v_int16x16; +/** @brief Eight 32-bit unsigned integer values */ +typedef v_reg v_uint32x8; +/** @brief Eight 32-bit signed integer values */ +typedef v_reg v_int32x8; +/** @brief Eight 32-bit floating point values (single precision) */ +typedef v_reg v_float32x8; +/** @brief Four 64-bit floating point values (double precision) */ +typedef v_reg v_float64x4; +/** @brief Four 64-bit unsigned integer values */ +typedef v_reg v_uint64x4; +/** @brief Four 64-bit signed integer values */ +typedef v_reg v_int64x4; +#endif + +#if CV_SIMD512 +/** @brief Sixty four 8-bit unsigned integer values */ +typedef v_reg v_uint8x64; +/** @brief Sixty four 8-bit signed integer values */ +typedef v_reg v_int8x64; +/** @brief Thirty two 16-bit unsigned integer values */ +typedef v_reg v_uint16x32; +/** @brief Thirty two 16-bit signed integer values */ +typedef v_reg v_int16x32; +/** @brief Sixteen 32-bit unsigned integer values */ +typedef v_reg v_uint32x16; +/** @brief Sixteen 32-bit signed integer values */ +typedef v_reg v_int32x16; +/** @brief Sixteen 32-bit floating point values (single precision) */ +typedef v_reg v_float32x16; +/** @brief Eight 64-bit floating point values (double precision) */ +typedef v_reg v_float64x8; +/** @brief Eight 64-bit unsigned integer values */ +typedef v_reg v_uint64x8; +/** @brief Eight 64-bit signed integer values */ +typedef v_reg v_int64x8; +#endif + +enum { + simd128_width = 16, +#if CV_SIMD256 + simd256_width = 32, +#endif +#if CV_SIMD512 + simd512_width = 64, + simdmax_width = simd512_width +#elif CV_SIMD256 + simdmax_width = simd256_width +#else + simdmax_width = simd128_width +#endif +}; + +/** @brief Add values + +For all types. */ +template CV_INLINE v_reg<_Tp, n> operator+(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator+=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Subtract values + +For all types. */ +template CV_INLINE v_reg<_Tp, n> operator-(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator-=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Multiply values + +For 16- and 32-bit integer types and floating types. */ +template CV_INLINE v_reg<_Tp, n> operator*(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator*=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Divide values + +For floating types only. */ +template CV_INLINE v_reg<_Tp, n> operator/(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator/=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + + +/** @brief Bitwise AND + +Only for integer types. */ +template CV_INLINE v_reg<_Tp, n> operator&(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator&=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Bitwise OR + +Only for integer types. */ +template CV_INLINE v_reg<_Tp, n> operator|(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator|=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Bitwise XOR + +Only for integer types.*/ +template CV_INLINE v_reg<_Tp, n> operator^(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); +template CV_INLINE v_reg<_Tp, n>& operator^=(v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b); + +/** @brief Bitwise NOT + +Only for integer types.*/ +template CV_INLINE v_reg<_Tp, n> operator~(const v_reg<_Tp, n>& a); + + +#ifndef CV_DOXYGEN + +#define CV__HAL_INTRIN_EXPAND_WITH_INTEGER_TYPES(macro_name, ...) \ +__CV_EXPAND(macro_name(uchar, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(schar, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(ushort, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(short, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(unsigned, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(int, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(uint64, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(int64, __VA_ARGS__)) \ + +#define CV__HAL_INTRIN_EXPAND_WITH_FP_TYPES(macro_name, ...) \ +__CV_EXPAND(macro_name(float, __VA_ARGS__)) \ +__CV_EXPAND(macro_name(double, __VA_ARGS__)) \ + +#define CV__HAL_INTRIN_EXPAND_WITH_ALL_TYPES(macro_name, ...) \ +CV__HAL_INTRIN_EXPAND_WITH_INTEGER_TYPES(macro_name, __VA_ARGS__) \ +CV__HAL_INTRIN_EXPAND_WITH_FP_TYPES(macro_name, __VA_ARGS__) \ + +#define CV__HAL_INTRIN_IMPL_BIN_OP_(_Tp, bin_op) \ +template inline \ +v_reg<_Tp, n> operator bin_op (const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = saturate_cast<_Tp>(a.s[i] bin_op b.s[i]); \ + return c; \ +} \ +template inline \ +v_reg<_Tp, n>& operator bin_op##= (v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + for( int i = 0; i < n; i++ ) \ + a.s[i] = saturate_cast<_Tp>(a.s[i] bin_op b.s[i]); \ + return a; \ +} + +#define CV__HAL_INTRIN_IMPL_BIN_OP(bin_op) CV__HAL_INTRIN_EXPAND_WITH_ALL_TYPES(CV__HAL_INTRIN_IMPL_BIN_OP_, bin_op) + +CV__HAL_INTRIN_IMPL_BIN_OP(+) +CV__HAL_INTRIN_IMPL_BIN_OP(-) +CV__HAL_INTRIN_IMPL_BIN_OP(*) +CV__HAL_INTRIN_EXPAND_WITH_FP_TYPES(CV__HAL_INTRIN_IMPL_BIN_OP_, /) + +#define CV__HAL_INTRIN_IMPL_BIT_OP_(_Tp, bit_op) \ +template CV_INLINE \ +v_reg<_Tp, n> operator bit_op (const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tp, n> c; \ + typedef typename V_TypeTraits<_Tp>::int_type itype; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)(V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) bit_op \ + V_TypeTraits<_Tp>::reinterpret_int(b.s[i]))); \ + return c; \ +} \ +template CV_INLINE \ +v_reg<_Tp, n>& operator bit_op##= (v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + typedef typename V_TypeTraits<_Tp>::int_type itype; \ + for( int i = 0; i < n; i++ ) \ + a.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)(V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) bit_op \ + V_TypeTraits<_Tp>::reinterpret_int(b.s[i]))); \ + return a; \ +} + +#define CV__HAL_INTRIN_IMPL_BIT_OP(bit_op) \ +CV__HAL_INTRIN_EXPAND_WITH_INTEGER_TYPES(CV__HAL_INTRIN_IMPL_BIT_OP_, bit_op) \ +CV__HAL_INTRIN_EXPAND_WITH_FP_TYPES(CV__HAL_INTRIN_IMPL_BIT_OP_, bit_op) /* TODO: FIXIT remove this after masks refactoring */ + + +CV__HAL_INTRIN_IMPL_BIT_OP(&) +CV__HAL_INTRIN_IMPL_BIT_OP(|) +CV__HAL_INTRIN_IMPL_BIT_OP(^) + +#define CV__HAL_INTRIN_IMPL_BITWISE_NOT_(_Tp, dummy) \ +template CV_INLINE \ +v_reg<_Tp, n> operator ~ (const v_reg<_Tp, n>& a) \ +{ \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int(~V_TypeTraits<_Tp>::reinterpret_int(a.s[i])); \ + return c; \ +} \ + +CV__HAL_INTRIN_EXPAND_WITH_INTEGER_TYPES(CV__HAL_INTRIN_IMPL_BITWISE_NOT_, ~) + +#endif // !CV_DOXYGEN + + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_MATH_FUNC(func, cfunc, _Tp2) \ +template inline v_reg<_Tp2, n> func(const v_reg<_Tp, n>& a) \ +{ \ + v_reg<_Tp2, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = cfunc(a.s[i]); \ + return c; \ +} + +/** @brief Square root of elements + +Only for floating point types.*/ +OPENCV_HAL_IMPL_MATH_FUNC(v_sqrt, std::sqrt, _Tp) + +//! @cond IGNORED +OPENCV_HAL_IMPL_MATH_FUNC(v_sin, std::sin, _Tp) +OPENCV_HAL_IMPL_MATH_FUNC(v_cos, std::cos, _Tp) +OPENCV_HAL_IMPL_MATH_FUNC(v_exp, std::exp, _Tp) +OPENCV_HAL_IMPL_MATH_FUNC(v_log, std::log, _Tp) +//! @endcond + +/** @brief Absolute value of elements + +Only for floating point types.*/ +OPENCV_HAL_IMPL_MATH_FUNC(v_abs, (typename V_TypeTraits<_Tp>::abs_type)std::abs, + typename V_TypeTraits<_Tp>::abs_type) + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_MINMAX_FUNC(func, cfunc) \ +template inline v_reg<_Tp, n> func(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = cfunc(a.s[i], b.s[i]); \ + return c; \ +} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_REDUCE_MINMAX_FUNC(func, cfunc) \ +template inline _Tp func(const v_reg<_Tp, n>& a) \ +{ \ + _Tp c = a.s[0]; \ + for( int i = 1; i < n; i++ ) \ + c = cfunc(c, a.s[i]); \ + return c; \ +} + +/** @brief Choose min values for each pair + +Scheme: +@code +{A1 A2 ...} +{B1 B2 ...} +-------------- +{min(A1,B1) min(A2,B2) ...} +@endcode +For all types except 64-bit integer. */ +OPENCV_HAL_IMPL_MINMAX_FUNC(v_min, std::min) + +/** @brief Choose max values for each pair + +Scheme: +@code +{A1 A2 ...} +{B1 B2 ...} +-------------- +{max(A1,B1) max(A2,B2) ...} +@endcode +For all types except 64-bit integer. */ +OPENCV_HAL_IMPL_MINMAX_FUNC(v_max, std::max) + +/** @brief Find one min value + +Scheme: +@code +{A1 A2 A3 ...} => min(A1,A2,A3,...) +@endcode +For all types except 64-bit integer and 64-bit floating point types. */ +OPENCV_HAL_IMPL_REDUCE_MINMAX_FUNC(v_reduce_min, std::min) + +/** @brief Find one max value + +Scheme: +@code +{A1 A2 A3 ...} => max(A1,A2,A3,...) +@endcode +For all types except 64-bit integer and 64-bit floating point types. */ +OPENCV_HAL_IMPL_REDUCE_MINMAX_FUNC(v_reduce_max, std::max) + +static const unsigned char popCountTable[] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; +/** @brief Count the 1 bits in the vector lanes and return result as corresponding unsigned type + +Scheme: +@code +{A1 A2 A3 ...} => {popcount(A1), popcount(A2), popcount(A3), ...} +@endcode +For all integer types. */ +template +inline v_reg::abs_type, n> v_popcount(const v_reg<_Tp, n>& a) +{ + v_reg::abs_type, n> b = v_reg::abs_type, n>::zero(); + for (int i = 0; i < n*(int)sizeof(_Tp); i++) + b.s[i/sizeof(_Tp)] += popCountTable[v_reinterpret_as_u8(a).s[i]]; + return b; +} + + +//! @cond IGNORED +template +inline void v_minmax( const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + v_reg<_Tp, n>& minval, v_reg<_Tp, n>& maxval ) +{ + for( int i = 0; i < n; i++ ) + { + minval.s[i] = std::min(a.s[i], b.s[i]); + maxval.s[i] = std::max(a.s[i], b.s[i]); + } +} +//! @endcond + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_CMP_OP(cmp_op) \ +template \ +inline v_reg<_Tp, n> operator cmp_op(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + typedef typename V_TypeTraits<_Tp>::int_type itype; \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = V_TypeTraits<_Tp>::reinterpret_from_int((itype)-(int)(a.s[i] cmp_op b.s[i])); \ + return c; \ +} + +/** @brief Less-than comparison + +For all types except 64-bit integer values. */ +OPENCV_HAL_IMPL_CMP_OP(<) + +/** @brief Greater-than comparison + +For all types except 64-bit integer values. */ +OPENCV_HAL_IMPL_CMP_OP(>) + +/** @brief Less-than or equal comparison + +For all types except 64-bit integer values. */ +OPENCV_HAL_IMPL_CMP_OP(<=) + +/** @brief Greater-than or equal comparison + +For all types except 64-bit integer values. */ +OPENCV_HAL_IMPL_CMP_OP(>=) + +/** @brief Equal comparison */ +OPENCV_HAL_IMPL_CMP_OP(==) + +/** @brief Not equal comparison */ +OPENCV_HAL_IMPL_CMP_OP(!=) + +template +inline v_reg v_not_nan(const v_reg& a) +{ + typedef typename V_TypeTraits::int_type itype; + v_reg c; + for (int i = 0; i < n; i++) + c.s[i] = V_TypeTraits::reinterpret_from_int((itype)-(int)(a.s[i] == a.s[i])); + return c; +} +template +inline v_reg v_not_nan(const v_reg& a) +{ + typedef typename V_TypeTraits::int_type itype; + v_reg c; + for (int i = 0; i < n; i++) + c.s[i] = V_TypeTraits::reinterpret_from_int((itype)-(int)(a.s[i] == a.s[i])); + return c; +} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_ARITHM_OP(func, bin_op, cast_op, _Tp2) \ +template \ +inline v_reg<_Tp2, n> func(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + typedef _Tp2 rtype; \ + v_reg c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = cast_op(a.s[i] bin_op b.s[i]); \ + return c; \ +} + +/** @brief Add values without saturation + +For 8- and 16-bit integer values. */ +OPENCV_HAL_IMPL_ARITHM_OP(v_add_wrap, +, (_Tp), _Tp) + +/** @brief Subtract values without saturation + +For 8- and 16-bit integer values. */ +OPENCV_HAL_IMPL_ARITHM_OP(v_sub_wrap, -, (_Tp), _Tp) + +/** @brief Multiply values without saturation + +For 8- and 16-bit integer values. */ +OPENCV_HAL_IMPL_ARITHM_OP(v_mul_wrap, *, (_Tp), _Tp) + +//! @cond IGNORED +template inline T _absdiff(T a, T b) +{ + return a > b ? a - b : b - a; +} +//! @endcond + +/** @brief Absolute difference + +Returns \f$ |a - b| \f$ converted to corresponding unsigned type. +Example: +@code{.cpp} +v_int32x4 a, b; // {1, 2, 3, 4} and {4, 3, 2, 1} +v_uint32x4 c = v_absdiff(a, b); // result is {3, 1, 1, 3} +@endcode +For 8-, 16-, 32-bit integer source types. */ +template +inline v_reg::abs_type, n> v_absdiff(const v_reg<_Tp, n>& a, const v_reg<_Tp, n> & b) +{ + typedef typename V_TypeTraits<_Tp>::abs_type rtype; + v_reg c; + const rtype mask = (rtype)(std::numeric_limits<_Tp>::is_signed ? (1 << (sizeof(rtype)*8 - 1)) : 0); + for( int i = 0; i < n; i++ ) + { + rtype ua = a.s[i] ^ mask; + rtype ub = b.s[i] ^ mask; + c.s[i] = _absdiff(ua, ub); + } + return c; +} + +/** @overload + +For 32-bit floating point values */ +template inline v_reg v_absdiff(const v_reg& a, const v_reg& b) +{ + v_reg c; + for( int i = 0; i < c.nlanes; i++ ) + c.s[i] = _absdiff(a.s[i], b.s[i]); + return c; +} + +/** @overload + +For 64-bit floating point values */ +template inline v_reg v_absdiff(const v_reg& a, const v_reg& b) +{ + v_reg c; + for( int i = 0; i < c.nlanes; i++ ) + c.s[i] = _absdiff(a.s[i], b.s[i]); + return c; +} + +/** @brief Saturating absolute difference + +Returns \f$ saturate(|a - b|) \f$ . +For 8-, 16-bit signed integer source types. */ +template +inline v_reg<_Tp, n> v_absdiffs(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++) + c.s[i] = saturate_cast<_Tp>(std::abs(a.s[i] - b.s[i])); + return c; +} + +/** @brief Inversed square root + +Returns \f$ 1/sqrt(a) \f$ +For floating point types only. */ +template +inline v_reg<_Tp, n> v_invsqrt(const v_reg<_Tp, n>& a) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = 1.f/std::sqrt(a.s[i]); + return c; +} + +/** @brief Magnitude + +Returns \f$ sqrt(a^2 + b^2) \f$ +For floating point types only. */ +template +inline v_reg<_Tp, n> v_magnitude(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = std::sqrt(a.s[i]*a.s[i] + b.s[i]*b.s[i]); + return c; +} + +/** @brief Square of the magnitude + +Returns \f$ a^2 + b^2 \f$ +For floating point types only. */ +template +inline v_reg<_Tp, n> v_sqr_magnitude(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = a.s[i]*a.s[i] + b.s[i]*b.s[i]; + return c; +} + +/** @brief Multiply and add + + Returns \f$ a*b + c \f$ + For floating point types and signed 32bit int only. */ +template +inline v_reg<_Tp, n> v_fma(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg<_Tp, n>& c) +{ + v_reg<_Tp, n> d; + for( int i = 0; i < n; i++ ) + d.s[i] = a.s[i]*b.s[i] + c.s[i]; + return d; +} + +/** @brief A synonym for v_fma */ +template +inline v_reg<_Tp, n> v_muladd(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg<_Tp, n>& c) +{ + return v_fma(a, b, c); +} + +/** @brief Dot product of elements + +Multiply values in two registers and sum adjacent result pairs. + +Scheme: +@code + {A1 A2 ...} // 16-bit +x {B1 B2 ...} // 16-bit +------------- +{A1B1+A2B2 ...} // 32-bit + +@endcode +*/ +template inline v_reg::w_type, n/2> +v_dotprod(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg c; + for( int i = 0; i < (n/2); i++ ) + c.s[i] = (w_type)a.s[i*2]*b.s[i*2] + (w_type)a.s[i*2+1]*b.s[i*2+1]; + return c; +} + +/** @brief Dot product of elements + +Same as cv::v_dotprod, but add a third element to the sum of adjacent pairs. +Scheme: +@code + {A1 A2 ...} // 16-bit +x {B1 B2 ...} // 16-bit +------------- + {A1B1+A2B2+C1 ...} // 32-bit +@endcode +*/ +template inline v_reg::w_type, n/2> +v_dotprod(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg::w_type, n / 2>& c) +{ + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg s; + for( int i = 0; i < (n/2); i++ ) + s.s[i] = (w_type)a.s[i*2]*b.s[i*2] + (w_type)a.s[i*2+1]*b.s[i*2+1] + c.s[i]; + return s; +} + +/** @brief Fast Dot product of elements + +Same as cv::v_dotprod, but it may perform unorder sum between result pairs in some platforms, +this intrinsic can be used if the sum among all lanes is only matters +and also it should be yielding better performance on the affected platforms. + +*/ +template inline v_reg::w_type, n/2> +v_dotprod_fast(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ return v_dotprod(a, b); } + +/** @brief Fast Dot product of elements + +Same as cv::v_dotprod_fast, but add a third element to the sum of adjacent pairs. +*/ +template inline v_reg::w_type, n/2> +v_dotprod_fast(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg::w_type, n / 2>& c) +{ return v_dotprod(a, b, c); } + +/** @brief Dot product of elements and expand + +Multiply values in two registers and expand the sum of adjacent result pairs. + +Scheme: +@code + {A1 A2 A3 A4 ...} // 8-bit +x {B1 B2 B3 B4 ...} // 8-bit +------------- + {A1B1+A2B2+A3B3+A4B4 ...} // 32-bit + +@endcode +*/ +template inline v_reg::q_type, n/4> +v_dotprod_expand(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + typedef typename V_TypeTraits<_Tp>::q_type q_type; + v_reg s; + for( int i = 0; i < (n/4); i++ ) + s.s[i] = (q_type)a.s[i*4 ]*b.s[i*4 ] + (q_type)a.s[i*4 + 1]*b.s[i*4 + 1] + + (q_type)a.s[i*4 + 2]*b.s[i*4 + 2] + (q_type)a.s[i*4 + 3]*b.s[i*4 + 3]; + return s; +} + +/** @brief Dot product of elements + +Same as cv::v_dotprod_expand, but add a third element to the sum of adjacent pairs. +Scheme: +@code + {A1 A2 A3 A4 ...} // 8-bit +x {B1 B2 B3 B4 ...} // 8-bit +------------- + {A1B1+A2B2+A3B3+A4B4+C1 ...} // 32-bit +@endcode +*/ +template inline v_reg::q_type, n/4> +v_dotprod_expand(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg::q_type, n / 4>& c) +{ + typedef typename V_TypeTraits<_Tp>::q_type q_type; + v_reg s; + for( int i = 0; i < (n/4); i++ ) + s.s[i] = (q_type)a.s[i*4 ]*b.s[i*4 ] + (q_type)a.s[i*4 + 1]*b.s[i*4 + 1] + + (q_type)a.s[i*4 + 2]*b.s[i*4 + 2] + (q_type)a.s[i*4 + 3]*b.s[i*4 + 3] + c.s[i]; + return s; +} + +/** @brief Fast Dot product of elements and expand + +Multiply values in two registers and expand the sum of adjacent result pairs. + +Same as cv::v_dotprod_expand, but it may perform unorder sum between result pairs in some platforms, +this intrinsic can be used if the sum among all lanes is only matters +and also it should be yielding better performance on the affected platforms. + +*/ +template inline v_reg::q_type, n/4> +v_dotprod_expand_fast(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ return v_dotprod_expand(a, b); } + +/** @brief Fast Dot product of elements + +Same as cv::v_dotprod_expand_fast, but add a third element to the sum of adjacent pairs. +*/ +template inline v_reg::q_type, n/4> +v_dotprod_expand_fast(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + const v_reg::q_type, n / 4>& c) +{ return v_dotprod_expand(a, b, c); } + +/** @brief Multiply and expand + +Multiply values two registers and store results in two registers with wider pack type. +Scheme: +@code + {A B C D} // 32-bit +x {E F G H} // 32-bit +--------------- +{AE BF} // 64-bit + {CG DH} // 64-bit +@endcode +Example: +@code{.cpp} +v_uint32x4 a, b; // {1,2,3,4} and {2,2,2,2} +v_uint64x2 c, d; // results +v_mul_expand(a, b, c, d); // c, d = {2,4}, {6, 8} +@endcode +Implemented only for 16- and unsigned 32-bit source types (v_int16x8, v_uint16x8, v_uint32x4). +*/ +template inline void v_mul_expand(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + v_reg::w_type, n/2>& c, + v_reg::w_type, n/2>& d) +{ + typedef typename V_TypeTraits<_Tp>::w_type w_type; + for( int i = 0; i < (n/2); i++ ) + { + c.s[i] = (w_type)a.s[i]*b.s[i]; + d.s[i] = (w_type)a.s[i+(n/2)]*b.s[i+(n/2)]; + } +} + +/** @brief Multiply and extract high part + +Multiply values two registers and store high part of the results. +Implemented only for 16-bit source types (v_int16x8, v_uint16x8). Returns \f$ a*b >> 16 \f$ +*/ +template inline v_reg<_Tp, n> v_mul_hi(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg<_Tp, n> c; + for (int i = 0; i < n; i++) + c.s[i] = (_Tp)(((w_type)a.s[i] * b.s[i]) >> sizeof(_Tp)*8); + return c; +} + +//! @cond IGNORED +template inline void v_hsum(const v_reg<_Tp, n>& a, + v_reg::w_type, n/2>& c) +{ + typedef typename V_TypeTraits<_Tp>::w_type w_type; + for( int i = 0; i < (n/2); i++ ) + { + c.s[i] = (w_type)a.s[i*2] + a.s[i*2+1]; + } +} +//! @endcond + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_SHIFT_OP(shift_op) \ +template inline v_reg<_Tp, n> operator shift_op(const v_reg<_Tp, n>& a, int imm) \ +{ \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = (_Tp)(a.s[i] shift_op imm); \ + return c; \ +} + +/** @brief Bitwise shift left + +For 16-, 32- and 64-bit integer values. */ +OPENCV_HAL_IMPL_SHIFT_OP(<< ) + +/** @brief Bitwise shift right + +For 16-, 32- and 64-bit integer values. */ +OPENCV_HAL_IMPL_SHIFT_OP(>> ) + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_ROTATE_SHIFT_OP(suffix,opA,opB) \ +template inline v_reg<_Tp, n> v_rotate_##suffix(const v_reg<_Tp, n>& a) \ +{ \ + v_reg<_Tp, n> b; \ + for (int i = 0; i < n; i++) \ + { \ + int sIndex = i opA imm; \ + if (0 <= sIndex && sIndex < n) \ + { \ + b.s[i] = a.s[sIndex]; \ + } \ + else \ + { \ + b.s[i] = 0; \ + } \ + } \ + return b; \ +} \ +template inline v_reg<_Tp, n> v_rotate_##suffix(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tp, n> c; \ + for (int i = 0; i < n; i++) \ + { \ + int aIndex = i opA imm; \ + int bIndex = i opA imm opB n; \ + if (0 <= bIndex && bIndex < n) \ + { \ + c.s[i] = b.s[bIndex]; \ + } \ + else if (0 <= aIndex && aIndex < n) \ + { \ + c.s[i] = a.s[aIndex]; \ + } \ + else \ + { \ + c.s[i] = 0; \ + } \ + } \ + return c; \ +} + +/** @brief Element shift left among vector + +For all type */ +OPENCV_HAL_IMPL_ROTATE_SHIFT_OP(left, -, +) + +/** @brief Element shift right among vector + +For all type */ +OPENCV_HAL_IMPL_ROTATE_SHIFT_OP(right, +, -) + +/** @brief Sum packed values + +Scheme: +@code +{A1 A2 A3 ...} => sum{A1,A2,A3,...} +@endcode +*/ +template inline typename V_TypeTraits<_Tp>::sum_type v_reduce_sum(const v_reg<_Tp, n>& a) +{ + typename V_TypeTraits<_Tp>::sum_type c = a.s[0]; + for( int i = 1; i < n; i++ ) + c += a.s[i]; + return c; +} + +/** @brief Sums all elements of each input vector, returns the vector of sums + + Scheme: + @code + result[0] = a[0] + a[1] + a[2] + a[3] + result[1] = b[0] + b[1] + b[2] + b[3] + result[2] = c[0] + c[1] + c[2] + c[3] + result[3] = d[0] + d[1] + d[2] + d[3] + @endcode +*/ +template inline v_reg v_reduce_sum4(const v_reg& a, const v_reg& b, + const v_reg& c, const v_reg& d) +{ + v_reg r; + for(int i = 0; i < (n/4); i++) + { + r.s[i*4 + 0] = a.s[i*4 + 0] + a.s[i*4 + 1] + a.s[i*4 + 2] + a.s[i*4 + 3]; + r.s[i*4 + 1] = b.s[i*4 + 0] + b.s[i*4 + 1] + b.s[i*4 + 2] + b.s[i*4 + 3]; + r.s[i*4 + 2] = c.s[i*4 + 0] + c.s[i*4 + 1] + c.s[i*4 + 2] + c.s[i*4 + 3]; + r.s[i*4 + 3] = d.s[i*4 + 0] + d.s[i*4 + 1] + d.s[i*4 + 2] + d.s[i*4 + 3]; + } + return r; +} + +/** @brief Sum absolute differences of values + +Scheme: +@code +{A1 A2 A3 ...} {B1 B2 B3 ...} => sum{ABS(A1-B1),abs(A2-B2),abs(A3-B3),...} +@endcode +For all types except 64-bit types.*/ +template inline typename V_TypeTraits< typename V_TypeTraits<_Tp>::abs_type >::sum_type v_reduce_sad(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + typename V_TypeTraits< typename V_TypeTraits<_Tp>::abs_type >::sum_type c = _absdiff(a.s[0], b.s[0]); + for (int i = 1; i < n; i++) + c += _absdiff(a.s[i], b.s[i]); + return c; +} + +/** @brief Get negative values mask +@deprecated v_signmask depends on a lane count heavily and therefore isn't universal enough + +Returned value is a bit mask with bits set to 1 on places corresponding to negative packed values indexes. +Example: +@code{.cpp} +v_int32x4 r; // set to {-1, -1, 1, 1} +int mask = v_signmask(r); // mask = 3 <== 00000000 00000000 00000000 00000011 +@endcode +*/ +template inline int v_signmask(const v_reg<_Tp, n>& a) +{ + int mask = 0; + for( int i = 0; i < n; i++ ) + mask |= (V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) < 0) << i; + return mask; +} + +/** @brief Get first negative lane index + +Returned value is an index of first negative lane (undefined for input of all positive values) +Example: +@code{.cpp} +v_int32x4 r; // set to {0, 0, -1, -1} +int idx = v_heading_zeros(r); // idx = 2 +@endcode +*/ +template inline int v_scan_forward(const v_reg<_Tp, n>& a) +{ + for (int i = 0; i < n; i++) + if(V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) < 0) + return i; + return 0; +} + +/** @brief Check if all packed values are less than zero + +Unsigned values will be casted to signed: `uchar 254 => char -2`. +*/ +template inline bool v_check_all(const v_reg<_Tp, n>& a) +{ + for( int i = 0; i < n; i++ ) + if( V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) >= 0 ) + return false; + return true; +} + +/** @brief Check if any of packed values is less than zero + +Unsigned values will be casted to signed: `uchar 254 => char -2`. +*/ +template inline bool v_check_any(const v_reg<_Tp, n>& a) +{ + for( int i = 0; i < n; i++ ) + if( V_TypeTraits<_Tp>::reinterpret_int(a.s[i]) < 0 ) + return true; + return false; +} + +/** @brief Per-element select (blend operation) + +Return value will be built by combining values _a_ and _b_ using the following scheme: + result[i] = mask[i] ? a[i] : b[i]; + +@note: _mask_ element values are restricted to these values: +- 0: select element from _b_ +- 0xff/0xffff/etc: select element from _a_ +(fully compatible with bitwise-based operator) +*/ +template inline v_reg<_Tp, n> v_select(const v_reg<_Tp, n>& mask, + const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + typedef V_TypeTraits<_Tp> Traits; + typedef typename Traits::int_type int_type; + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + { + int_type m = Traits::reinterpret_int(mask.s[i]); + CV_DbgAssert(m == 0 || m == (~(int_type)0)); // restrict mask values: 0 or 0xff/0xffff/etc + c.s[i] = m ? a.s[i] : b.s[i]; + } + return c; +} + +/** @brief Expand values to the wider pack type + +Copy contents of register to two registers with 2x wider pack type. +Scheme: +@code + int32x4 int64x2 int64x2 +{A B C D} ==> {A B} , {C D} +@endcode */ +template inline void v_expand(const v_reg<_Tp, n>& a, + v_reg::w_type, n/2>& b0, + v_reg::w_type, n/2>& b1) +{ + for( int i = 0; i < (n/2); i++ ) + { + b0.s[i] = a.s[i]; + b1.s[i] = a.s[i+(n/2)]; + } +} + +/** @brief Expand lower values to the wider pack type + +Same as cv::v_expand, but return lower half of the vector. + +Scheme: +@code + int32x4 int64x2 +{A B C D} ==> {A B} +@endcode */ +template +inline v_reg::w_type, n/2> +v_expand_low(const v_reg<_Tp, n>& a) +{ + v_reg::w_type, n/2> b; + for( int i = 0; i < (n/2); i++ ) + b.s[i] = a.s[i]; + return b; +} + +/** @brief Expand higher values to the wider pack type + +Same as cv::v_expand_low, but expand higher half of the vector instead. + +Scheme: +@code + int32x4 int64x2 +{A B C D} ==> {C D} +@endcode */ +template +inline v_reg::w_type, n/2> +v_expand_high(const v_reg<_Tp, n>& a) +{ + v_reg::w_type, n/2> b; + for( int i = 0; i < (n/2); i++ ) + b.s[i] = a.s[i+(n/2)]; + return b; +} + +//! @cond IGNORED +template inline v_reg::int_type, n> + v_reinterpret_as_int(const v_reg<_Tp, n>& a) +{ + v_reg::int_type, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = V_TypeTraits<_Tp>::reinterpret_int(a.s[i]); + return c; +} + +template inline v_reg::uint_type, n> + v_reinterpret_as_uint(const v_reg<_Tp, n>& a) +{ + v_reg::uint_type, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = V_TypeTraits<_Tp>::reinterpret_uint(a.s[i]); + return c; +} +//! @endcond + +/** @brief Interleave two vectors + +Scheme: +@code + {A1 A2 A3 A4} + {B1 B2 B3 B4} +--------------- + {A1 B1 A2 B2} and {A3 B3 A4 B4} +@endcode +For all types except 64-bit. +*/ +template inline void v_zip( const v_reg<_Tp, n>& a0, const v_reg<_Tp, n>& a1, + v_reg<_Tp, n>& b0, v_reg<_Tp, n>& b1 ) +{ + int i; + for( i = 0; i < n/2; i++ ) + { + b0.s[i*2] = a0.s[i]; + b0.s[i*2+1] = a1.s[i]; + } + for( ; i < n; i++ ) + { + b1.s[i*2-n] = a0.s[i]; + b1.s[i*2-n+1] = a1.s[i]; + } +} + +/** @brief Load register contents from memory + +@param ptr pointer to memory block with data +@return register object + +@note Returned type will be detected from passed pointer type, for example uchar ==> cv::v_uint8x16, int ==> cv::v_int32x4, etc. + +@note Use vx_load version to get maximum available register length result + +@note Alignment requirement: +if CV_STRONG_ALIGNMENT=1 then passed pointer must be aligned (`sizeof(lane type)` should be enough). +Do not cast pointer types without runtime check for pointer alignment (like `uchar*` => `int*`). + */ +template +inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_load(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + return v_reg<_Tp, simd128_width / sizeof(_Tp)>(ptr); +} + +#if CV_SIMD256 +/** @brief Load 256-bit length register contents from memory + +@param ptr pointer to memory block with data +@return register object + +@note Returned type will be detected from passed pointer type, for example uchar ==> cv::v_uint8x32, int ==> cv::v_int32x8, etc. + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load version to get maximum available register length result + +@note Alignment requirement: +if CV_STRONG_ALIGNMENT=1 then passed pointer must be aligned (`sizeof(lane type)` should be enough). +Do not cast pointer types without runtime check for pointer alignment (like `uchar*` => `int*`). + */ +template +inline v_reg<_Tp, simd256_width / sizeof(_Tp)> v256_load(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + return v_reg<_Tp, simd256_width / sizeof(_Tp)>(ptr); +} +#endif + +#if CV_SIMD512 +/** @brief Load 512-bit length register contents from memory + +@param ptr pointer to memory block with data +@return register object + +@note Returned type will be detected from passed pointer type, for example uchar ==> cv::v_uint8x64, int ==> cv::v_int32x16, etc. + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load version to get maximum available register length result + +@note Alignment requirement: +if CV_STRONG_ALIGNMENT=1 then passed pointer must be aligned (`sizeof(lane type)` should be enough). +Do not cast pointer types without runtime check for pointer alignment (like `uchar*` => `int*`). + */ +template +inline v_reg<_Tp, simd512_width / sizeof(_Tp)> v512_load(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + return v_reg<_Tp, simd512_width / sizeof(_Tp)>(ptr); +} +#endif + +/** @brief Load register contents from memory (aligned) + +similar to cv::v_load, but source memory block should be aligned (to 16-byte boundary in case of SIMD128, 32-byte - SIMD256, etc) + +@note Use vx_load_aligned version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_load_aligned(const _Tp* ptr) +{ + CV_Assert(isAligned)>(ptr)); + return v_reg<_Tp, simd128_width / sizeof(_Tp)>(ptr); +} + +#if CV_SIMD256 +/** @brief Load register contents from memory (aligned) + +similar to cv::v256_load, but source memory block should be aligned (to 32-byte boundary in case of SIMD256, 64-byte - SIMD512, etc) + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load_aligned version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd256_width / sizeof(_Tp)> v256_load_aligned(const _Tp* ptr) +{ + CV_Assert(isAligned)>(ptr)); + return v_reg<_Tp, simd256_width / sizeof(_Tp)>(ptr); +} +#endif + +#if CV_SIMD512 +/** @brief Load register contents from memory (aligned) + +similar to cv::v512_load, but source memory block should be aligned (to 64-byte boundary in case of SIMD512, etc) + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load_aligned version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd512_width / sizeof(_Tp)> v512_load_aligned(const _Tp* ptr) +{ + CV_Assert(isAligned)>(ptr)); + return v_reg<_Tp, simd512_width / sizeof(_Tp)>(ptr); +} +#endif + +/** @brief Load 64-bits of data to lower part (high part is undefined). + +@param ptr memory block containing data for first half (0..n/2) + +@code{.cpp} +int lo[2] = { 1, 2 }; +v_int32x4 r = v_load_low(lo); +@endcode + +@note Use vx_load_low version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_load_low(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + v_reg<_Tp, simd128_width / sizeof(_Tp)> c; + for( int i = 0; i < c.nlanes/2; i++ ) + { + c.s[i] = ptr[i]; + } + return c; +} + +#if CV_SIMD256 +/** @brief Load 128-bits of data to lower part (high part is undefined). + +@param ptr memory block containing data for first half (0..n/2) + +@code{.cpp} +int lo[4] = { 1, 2, 3, 4 }; +v_int32x8 r = v256_load_low(lo); +@endcode + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load_low version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd256_width / sizeof(_Tp)> v256_load_low(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + v_reg<_Tp, simd256_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes / 2; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +#if CV_SIMD512 +/** @brief Load 256-bits of data to lower part (high part is undefined). + +@param ptr memory block containing data for first half (0..n/2) + +@code{.cpp} +int lo[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; +v_int32x16 r = v512_load_low(lo); +@endcode + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load_low version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd512_width / sizeof(_Tp)> v512_load_low(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + v_reg<_Tp, simd512_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes / 2; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +/** @brief Load register contents from two memory blocks + +@param loptr memory block containing data for first half (0..n/2) +@param hiptr memory block containing data for second half (n/2..n) + +@code{.cpp} +int lo[2] = { 1, 2 }, hi[2] = { 3, 4 }; +v_int32x4 r = v_load_halves(lo, hi); +@endcode + +@note Use vx_load_halves version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_load_halves(const _Tp* loptr, const _Tp* hiptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(loptr)); + CV_Assert(isAligned(hiptr)); +#endif + v_reg<_Tp, simd128_width / sizeof(_Tp)> c; + for( int i = 0; i < c.nlanes/2; i++ ) + { + c.s[i] = loptr[i]; + c.s[i+c.nlanes/2] = hiptr[i]; + } + return c; +} + +#if CV_SIMD256 +/** @brief Load register contents from two memory blocks + +@param loptr memory block containing data for first half (0..n/2) +@param hiptr memory block containing data for second half (n/2..n) + +@code{.cpp} +int lo[4] = { 1, 2, 3, 4 }, hi[4] = { 5, 6, 7, 8 }; +v_int32x8 r = v256_load_halves(lo, hi); +@endcode + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load_halves version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd256_width / sizeof(_Tp)> v256_load_halves(const _Tp* loptr, const _Tp* hiptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(loptr)); + CV_Assert(isAligned(hiptr)); +#endif + v_reg<_Tp, simd256_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes / 2; i++) + { + c.s[i] = loptr[i]; + c.s[i + c.nlanes / 2] = hiptr[i]; + } + return c; +} +#endif + +#if CV_SIMD512 +/** @brief Load register contents from two memory blocks + +@param loptr memory block containing data for first half (0..n/2) +@param hiptr memory block containing data for second half (n/2..n) + +@code{.cpp} +int lo[4] = { 1, 2, 3, 4, 5, 6, 7, 8 }, hi[4] = { 9, 10, 11, 12, 13, 14, 15, 16 }; +v_int32x16 r = v512_load_halves(lo, hi); +@endcode + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load_halves version to get maximum available register length result +*/ +template +inline v_reg<_Tp, simd512_width / sizeof(_Tp)> v512_load_halves(const _Tp* loptr, const _Tp* hiptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(loptr)); + CV_Assert(isAligned(hiptr)); +#endif + v_reg<_Tp, simd512_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes / 2; i++) + { + c.s[i] = loptr[i]; + c.s[i + c.nlanes / 2] = hiptr[i]; + } + return c; +} +#endif + +/** @brief Load register contents from memory with double expand + +Same as cv::v_load, but result pack type will be 2x wider than memory type. + +@code{.cpp} +short buf[4] = {1, 2, 3, 4}; // type is int16 +v_int32x4 r = v_load_expand(buf); // r = {1, 2, 3, 4} - type is int32 +@endcode +For 8-, 16-, 32-bit integer source types. + +@note Use vx_load_expand version to get maximum available register length result +*/ +template +inline v_reg::w_type, simd128_width / sizeof(typename V_TypeTraits<_Tp>::w_type)> +v_load_expand(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg c; + for( int i = 0; i < c.nlanes; i++ ) + { + c.s[i] = ptr[i]; + } + return c; +} + +#if CV_SIMD256 +/** @brief Load register contents from memory with double expand + +Same as cv::v256_load, but result pack type will be 2x wider than memory type. + +@code{.cpp} +short buf[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // type is int16 +v_int32x8 r = v256_load_expand(buf); // r = {1, 2, 3, 4, 5, 6, 7, 8} - type is int32 +@endcode +For 8-, 16-, 32-bit integer source types. + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load_expand version to get maximum available register length result +*/ +template +inline v_reg::w_type, simd256_width / sizeof(typename V_TypeTraits<_Tp>::w_type)> +v256_load_expand(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg c; + for (int i = 0; i < c.nlanes; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +#if CV_SIMD512 +/** @brief Load register contents from memory with double expand + +Same as cv::v512_load, but result pack type will be 2x wider than memory type. + +@code{.cpp} +short buf[8] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; // type is int16 +v_int32x16 r = v512_load_expand(buf); // r = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} - type is int32 +@endcode +For 8-, 16-, 32-bit integer source types. + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load_expand version to get maximum available register length result +*/ +template +inline v_reg::w_type, simd512_width / sizeof(typename V_TypeTraits<_Tp>::w_type)> +v512_load_expand(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::w_type w_type; + v_reg c; + for (int i = 0; i < c.nlanes; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +/** @brief Load register contents from memory with quad expand + +Same as cv::v_load_expand, but result type is 4 times wider than source. +@code{.cpp} +char buf[4] = {1, 2, 3, 4}; // type is int8 +v_int32x4 r = v_load_expand_q(buf); // r = {1, 2, 3, 4} - type is int32 +@endcode +For 8-bit integer source types. + +@note Use vx_load_expand_q version to get maximum available register length result +*/ +template +inline v_reg::q_type, simd128_width / sizeof(typename V_TypeTraits<_Tp>::q_type)> +v_load_expand_q(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::q_type q_type; + v_reg c; + for( int i = 0; i < c.nlanes; i++ ) + { + c.s[i] = ptr[i]; + } + return c; +} + +#if CV_SIMD256 +/** @brief Load register contents from memory with quad expand + +Same as cv::v256_load_expand, but result type is 4 times wider than source. +@code{.cpp} +char buf[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // type is int8 +v_int32x8 r = v256_load_expand_q(buf); // r = {1, 2, 3, 4, 5, 6, 7, 8} - type is int32 +@endcode +For 8-bit integer source types. + +@note Check CV_SIMD256 preprocessor definition prior to use. +Use vx_load_expand_q version to get maximum available register length result +*/ +template +inline v_reg::q_type, simd256_width / sizeof(typename V_TypeTraits<_Tp>::q_type)> +v256_load_expand_q(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::q_type q_type; + v_reg c; + for (int i = 0; i < c.nlanes; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +#if CV_SIMD512 +/** @brief Load register contents from memory with quad expand + +Same as cv::v512_load_expand, but result type is 4 times wider than source. +@code{.cpp} +char buf[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; // type is int8 +v_int32x16 r = v512_load_expand_q(buf); // r = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} - type is int32 +@endcode +For 8-bit integer source types. + +@note Check CV_SIMD512 preprocessor definition prior to use. +Use vx_load_expand_q version to get maximum available register length result +*/ +template +inline v_reg::q_type, simd512_width / sizeof(typename V_TypeTraits<_Tp>::q_type)> +v512_load_expand_q(const _Tp* ptr) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + typedef typename V_TypeTraits<_Tp>::q_type q_type; + v_reg c; + for (int i = 0; i < c.nlanes; i++) + { + c.s[i] = ptr[i]; + } + return c; +} +#endif + +/** @brief Load and deinterleave (2 channels) + +Load data from memory deinterleave and store to 2 registers. +Scheme: +@code +{A1 B1 A2 B2 ...} ==> {A1 A2 ...}, {B1 B2 ...} +@endcode +For all types except 64-bit. */ +template inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a, + v_reg<_Tp, n>& b) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i2; + for( i = i2 = 0; i < n; i++, i2 += 2 ) + { + a.s[i] = ptr[i2]; + b.s[i] = ptr[i2+1]; + } +} + +/** @brief Load and deinterleave (3 channels) + +Load data from memory deinterleave and store to 3 registers. +Scheme: +@code +{A1 B1 C1 A2 B2 C2 ...} ==> {A1 A2 ...}, {B1 B2 ...}, {C1 C2 ...} +@endcode +For all types except 64-bit. */ +template inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a, + v_reg<_Tp, n>& b, v_reg<_Tp, n>& c) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i3; + for( i = i3 = 0; i < n; i++, i3 += 3 ) + { + a.s[i] = ptr[i3]; + b.s[i] = ptr[i3+1]; + c.s[i] = ptr[i3+2]; + } +} + +/** @brief Load and deinterleave (4 channels) + +Load data from memory deinterleave and store to 4 registers. +Scheme: +@code +{A1 B1 C1 D1 A2 B2 C2 D2 ...} ==> {A1 A2 ...}, {B1 B2 ...}, {C1 C2 ...}, {D1 D2 ...} +@endcode +For all types except 64-bit. */ +template +inline void v_load_deinterleave(const _Tp* ptr, v_reg<_Tp, n>& a, + v_reg<_Tp, n>& b, v_reg<_Tp, n>& c, + v_reg<_Tp, n>& d) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i4; + for( i = i4 = 0; i < n; i++, i4 += 4 ) + { + a.s[i] = ptr[i4]; + b.s[i] = ptr[i4+1]; + c.s[i] = ptr[i4+2]; + d.s[i] = ptr[i4+3]; + } +} + +/** @brief Interleave and store (2 channels) + +Interleave and store data from 2 registers to memory. +Scheme: +@code +{A1 A2 ...}, {B1 B2 ...} ==> {A1 B1 A2 B2 ...} +@endcode +For all types except 64-bit. */ +template +inline void v_store_interleave( _Tp* ptr, const v_reg<_Tp, n>& a, + const v_reg<_Tp, n>& b, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i2; + for( i = i2 = 0; i < n; i++, i2 += 2 ) + { + ptr[i2] = a.s[i]; + ptr[i2+1] = b.s[i]; + } +} + +/** @brief Interleave and store (3 channels) + +Interleave and store data from 3 registers to memory. +Scheme: +@code +{A1 A2 ...}, {B1 B2 ...}, {C1 C2 ...} ==> {A1 B1 C1 A2 B2 C2 ...} +@endcode +For all types except 64-bit. */ +template +inline void v_store_interleave( _Tp* ptr, const v_reg<_Tp, n>& a, + const v_reg<_Tp, n>& b, const v_reg<_Tp, n>& c, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i3; + for( i = i3 = 0; i < n; i++, i3 += 3 ) + { + ptr[i3] = a.s[i]; + ptr[i3+1] = b.s[i]; + ptr[i3+2] = c.s[i]; + } +} + +/** @brief Interleave and store (4 channels) + +Interleave and store data from 4 registers to memory. +Scheme: +@code +{A1 A2 ...}, {B1 B2 ...}, {C1 C2 ...}, {D1 D2 ...} ==> {A1 B1 C1 D1 A2 B2 C2 D2 ...} +@endcode +For all types except 64-bit. */ +template inline void v_store_interleave( _Tp* ptr, const v_reg<_Tp, n>& a, + const v_reg<_Tp, n>& b, const v_reg<_Tp, n>& c, + const v_reg<_Tp, n>& d, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + int i, i4; + for( i = i4 = 0; i < n; i++, i4 += 4 ) + { + ptr[i4] = a.s[i]; + ptr[i4+1] = b.s[i]; + ptr[i4+2] = c.s[i]; + ptr[i4+3] = d.s[i]; + } +} + +/** @brief Store data to memory + +Store register contents to memory. +Scheme: +@code + REG {A B C D} ==> MEM {A B C D} +@endcode +Pointer can be unaligned. */ +template +inline void v_store(_Tp* ptr, const v_reg<_Tp, n>& a) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + for( int i = 0; i < n; i++ ) + ptr[i] = a.s[i]; +} + +template +inline void v_store(_Tp* ptr, const v_reg<_Tp, n>& a, hal::StoreMode /*mode*/) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + v_store(ptr, a); +} + +/** @brief Store data to memory (lower half) + +Store lower half of register contents to memory. +Scheme: +@code + REG {A B C D} ==> MEM {A B} +@endcode */ +template +inline void v_store_low(_Tp* ptr, const v_reg<_Tp, n>& a) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + for( int i = 0; i < (n/2); i++ ) + ptr[i] = a.s[i]; +} + +/** @brief Store data to memory (higher half) + +Store higher half of register contents to memory. +Scheme: +@code + REG {A B C D} ==> MEM {C D} +@endcode */ +template +inline void v_store_high(_Tp* ptr, const v_reg<_Tp, n>& a) +{ +#if CV_STRONG_ALIGNMENT + CV_Assert(isAligned(ptr)); +#endif + for( int i = 0; i < (n/2); i++ ) + ptr[i] = a.s[i+(n/2)]; +} + +/** @brief Store data to memory (aligned) + +Store register contents to memory. +Scheme: +@code + REG {A B C D} ==> MEM {A B C D} +@endcode +Pointer __should__ be aligned by 16-byte boundary. */ +template +inline void v_store_aligned(_Tp* ptr, const v_reg<_Tp, n>& a) +{ + CV_Assert(isAligned)>(ptr)); + v_store(ptr, a); +} + +template +inline void v_store_aligned_nocache(_Tp* ptr, const v_reg<_Tp, n>& a) +{ + CV_Assert(isAligned)>(ptr)); + v_store(ptr, a); +} + +template +inline void v_store_aligned(_Tp* ptr, const v_reg<_Tp, n>& a, hal::StoreMode /*mode*/) +{ + CV_Assert(isAligned)>(ptr)); + v_store(ptr, a); +} + +/** @brief Combine vector from first elements of two vectors + +Scheme: +@code + {A1 A2 A3 A4} + {B1 B2 B3 B4} +--------------- + {A1 A2 B1 B2} +@endcode +For all types except 64-bit. */ +template +inline v_reg<_Tp, n> v_combine_low(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < (n/2); i++ ) + { + c.s[i] = a.s[i]; + c.s[i+(n/2)] = b.s[i]; + } + return c; +} + +/** @brief Combine vector from last elements of two vectors + +Scheme: +@code + {A1 A2 A3 A4} + {B1 B2 B3 B4} +--------------- + {A3 A4 B3 B4} +@endcode +For all types except 64-bit. */ +template +inline v_reg<_Tp, n> v_combine_high(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < (n/2); i++ ) + { + c.s[i] = a.s[i+(n/2)]; + c.s[i+(n/2)] = b.s[i+(n/2)]; + } + return c; +} + +/** @brief Combine two vectors from lower and higher parts of two other vectors + +@code{.cpp} +low = cv::v_combine_low(a, b); +high = cv::v_combine_high(a, b); +@endcode */ +template +inline void v_recombine(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b, + v_reg<_Tp, n>& low, v_reg<_Tp, n>& high) +{ + for( int i = 0; i < (n/2); i++ ) + { + low.s[i] = a.s[i]; + low.s[i+(n/2)] = b.s[i]; + high.s[i] = a.s[i+(n/2)]; + high.s[i+(n/2)] = b.s[i+(n/2)]; + } +} + +/** @brief Vector reverse order + +Reverse the order of the vector +Scheme: +@code + REG {A1 ... An} ==> REG {An ... A1} +@endcode +For all types. */ +template +inline v_reg<_Tp, n> v_reverse(const v_reg<_Tp, n>& a) +{ + v_reg<_Tp, n> c; + for( int i = 0; i < n; i++ ) + c.s[i] = a.s[n-i-1]; + return c; +} + +/** @brief Vector extract + +Scheme: +@code + {A1 A2 A3 A4} + {B1 B2 B3 B4} +======================== +shift = 1 {A2 A3 A4 B1} +shift = 2 {A3 A4 B1 B2} +shift = 3 {A4 B1 B2 B3} +@endcode +Restriction: 0 <= shift < nlanes + +Usage: +@code +v_int32x4 a, b, c; +c = v_extract<2>(a, b); +@endcode +For all types. */ +template +inline v_reg<_Tp, n> v_extract(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + v_reg<_Tp, n> r; + const int shift = n - s; + int i = 0; + for (; i < shift; ++i) + r.s[i] = a.s[i+s]; + for (; i < n; ++i) + r.s[i] = b.s[i-shift]; + return r; +} + +/** @brief Vector extract + +Scheme: +Return the s-th element of v. +Restriction: 0 <= s < nlanes + +Usage: +@code +v_int32x4 a; +int r; +r = v_extract_n<2>(a); +@endcode +For all types. */ +template +inline _Tp v_extract_n(const v_reg<_Tp, n>& v) +{ + CV_DbgAssert(s >= 0 && s < n); + return v.s[s]; +} + +/** @brief Broadcast i-th element of vector + +Scheme: +@code +{ v[0] v[1] v[2] ... v[SZ] } => { v[i], v[i], v[i] ... v[i] } +@endcode +Restriction: 0 <= i < nlanes +Supported types: 32-bit integers and floats (s32/u32/f32) + */ +template +inline v_reg<_Tp, n> v_broadcast_element(const v_reg<_Tp, n>& a) +{ + CV_DbgAssert(i >= 0 && i < n); + return v_reg<_Tp, n>::all(a.s[i]); +} + +/** @brief Round elements + +Rounds each value. Input type is float vector ==> output type is int vector. +@note Only for floating point types. +*/ +template inline v_reg v_round(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = cvRound(a.s[i]); + return c; +} + +/** @overload */ +template inline v_reg v_round(const v_reg& a, const v_reg& b) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = cvRound(a.s[i]); + c.s[i+n] = cvRound(b.s[i]); + } + return c; +} + +/** @brief Floor elements + +Floor each value. Input type is float vector ==> output type is int vector. +@note Only for floating point types. +*/ +template inline v_reg v_floor(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = cvFloor(a.s[i]); + return c; +} + +/** @brief Ceil elements + +Ceil each value. Input type is float vector ==> output type is int vector. +@note Only for floating point types. +*/ +template inline v_reg v_ceil(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = cvCeil(a.s[i]); + return c; +} + +/** @brief Truncate elements + +Truncate each value. Input type is float vector ==> output type is int vector. +@note Only for floating point types. +*/ +template inline v_reg v_trunc(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = (int)(a.s[i]); + return c; +} + +/** @overload */ +template inline v_reg v_round(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = cvRound(a.s[i]); + c.s[i+n] = 0; + } + return c; +} + +/** @overload */ +template inline v_reg v_floor(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = cvFloor(a.s[i]); + c.s[i+n] = 0; + } + return c; +} + +/** @overload */ +template inline v_reg v_ceil(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = cvCeil(a.s[i]); + c.s[i+n] = 0; + } + return c; +} + +/** @overload */ +template inline v_reg v_trunc(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = (int)(a.s[i]); + c.s[i+n] = 0; + } + return c; +} + +/** @brief Convert to float + +Supported input type is cv::v_int32. */ +template inline v_reg v_cvt_f32(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = (float)a.s[i]; + return c; +} + +/** @brief Convert lower half to float + +Supported input type is cv::v_float64. */ +template inline v_reg v_cvt_f32(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = (float)a.s[i]; + c.s[i+n] = 0; + } + return c; +} + +/** @brief Convert to float + +Supported input type is cv::v_float64. */ +template inline v_reg v_cvt_f32(const v_reg& a, const v_reg& b) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + { + c.s[i] = (float)a.s[i]; + c.s[i+n] = (float)b.s[i]; + } + return c; +} + +/** @brief Convert lower half to double + +Supported input type is cv::v_int32. */ +template CV_INLINE v_reg v_cvt_f64(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < (n/2); i++ ) + c.s[i] = (double)a.s[i]; + return c; +} + +/** @brief Convert to double high part of vector + +Supported input type is cv::v_int32. */ +template CV_INLINE v_reg v_cvt_f64_high(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < (n/2); i++ ) + c.s[i] = (double)a.s[i + (n/2)]; + return c; +} + +/** @brief Convert lower half to double + +Supported input type is cv::v_float32. */ +template CV_INLINE v_reg v_cvt_f64(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < (n/2); i++ ) + c.s[i] = (double)a.s[i]; + return c; +} + +/** @brief Convert to double high part of vector + +Supported input type is cv::v_float32. */ +template CV_INLINE v_reg v_cvt_f64_high(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < (n/2); i++ ) + c.s[i] = (double)a.s[i + (n/2)]; + return c; +} + +/** @brief Convert to double + +Supported input type is cv::v_int64. */ +template CV_INLINE v_reg v_cvt_f64(const v_reg& a) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = (double)a.s[i]; + return c; +} + + +template inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_lut(const _Tp* tab, const int* idx) +{ + v_reg<_Tp, simd128_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes; i++) + c.s[i] = tab[idx[i]]; + return c; +} +template inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_lut_pairs(const _Tp* tab, const int* idx) +{ + v_reg<_Tp, simd128_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes; i++) + c.s[i] = tab[idx[i / 2] + i % 2]; + return c; +} +template inline v_reg<_Tp, simd128_width / sizeof(_Tp)> v_lut_quads(const _Tp* tab, const int* idx) +{ + v_reg<_Tp, simd128_width / sizeof(_Tp)> c; + for (int i = 0; i < c.nlanes; i++) + c.s[i] = tab[idx[i / 4] + i % 4]; + return c; +} + +template inline v_reg v_lut(const int* tab, const v_reg& idx) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = tab[idx.s[i]]; + return c; +} + +template inline v_reg v_lut(const unsigned* tab, const v_reg& idx) +{ + v_reg c; + for (int i = 0; i < n; i++) + c.s[i] = tab[idx.s[i]]; + return c; +} + +template inline v_reg v_lut(const float* tab, const v_reg& idx) +{ + v_reg c; + for( int i = 0; i < n; i++ ) + c.s[i] = tab[idx.s[i]]; + return c; +} + +template inline v_reg v_lut(const double* tab, const v_reg& idx) +{ + v_reg c; + for( int i = 0; i < n/2; i++ ) + c.s[i] = tab[idx.s[i]]; + return c; +} + + +template inline void v_lut_deinterleave(const float* tab, const v_reg& idx, + v_reg& x, v_reg& y) +{ + for( int i = 0; i < n; i++ ) + { + int j = idx.s[i]; + x.s[i] = tab[j]; + y.s[i] = tab[j+1]; + } +} + +template inline void v_lut_deinterleave(const double* tab, const v_reg& idx, + v_reg& x, v_reg& y) +{ + for( int i = 0; i < n; i++ ) + { + int j = idx.s[i]; + x.s[i] = tab[j]; + y.s[i] = tab[j+1]; + } +} + +template inline v_reg<_Tp, n> v_interleave_pairs(const v_reg<_Tp, n>& vec) +{ + v_reg<_Tp, n> c; + for (int i = 0; i < n/4; i++) + { + c.s[4*i ] = vec.s[4*i ]; + c.s[4*i+1] = vec.s[4*i+2]; + c.s[4*i+2] = vec.s[4*i+1]; + c.s[4*i+3] = vec.s[4*i+3]; + } + return c; +} + +template inline v_reg<_Tp, n> v_interleave_quads(const v_reg<_Tp, n>& vec) +{ + v_reg<_Tp, n> c; + for (int i = 0; i < n/8; i++) + { + c.s[8*i ] = vec.s[8*i ]; + c.s[8*i+1] = vec.s[8*i+4]; + c.s[8*i+2] = vec.s[8*i+1]; + c.s[8*i+3] = vec.s[8*i+5]; + c.s[8*i+4] = vec.s[8*i+2]; + c.s[8*i+5] = vec.s[8*i+6]; + c.s[8*i+6] = vec.s[8*i+3]; + c.s[8*i+7] = vec.s[8*i+7]; + } + return c; +} + +template inline v_reg<_Tp, n> v_pack_triplets(const v_reg<_Tp, n>& vec) +{ + v_reg<_Tp, n> c; + for (int i = 0; i < n/4; i++) + { + c.s[3*i ] = vec.s[4*i ]; + c.s[3*i+1] = vec.s[4*i+1]; + c.s[3*i+2] = vec.s[4*i+2]; + } + return c; +} + +/** @brief Transpose 4x4 matrix + +Scheme: +@code +a0 {A1 A2 A3 A4} +a1 {B1 B2 B3 B4} +a2 {C1 C2 C3 C4} +a3 {D1 D2 D3 D4} +=============== +b0 {A1 B1 C1 D1} +b1 {A2 B2 C2 D2} +b2 {A3 B3 C3 D3} +b3 {A4 B4 C4 D4} +@endcode +*/ +template +inline void v_transpose4x4( v_reg<_Tp, n>& a0, const v_reg<_Tp, n>& a1, + const v_reg<_Tp, n>& a2, const v_reg<_Tp, n>& a3, + v_reg<_Tp, n>& b0, v_reg<_Tp, n>& b1, + v_reg<_Tp, n>& b2, v_reg<_Tp, n>& b3 ) +{ + for (int i = 0; i < n / 4; i++) + { + b0.s[0 + i*4] = a0.s[0 + i*4]; b0.s[1 + i*4] = a1.s[0 + i*4]; + b0.s[2 + i*4] = a2.s[0 + i*4]; b0.s[3 + i*4] = a3.s[0 + i*4]; + b1.s[0 + i*4] = a0.s[1 + i*4]; b1.s[1 + i*4] = a1.s[1 + i*4]; + b1.s[2 + i*4] = a2.s[1 + i*4]; b1.s[3 + i*4] = a3.s[1 + i*4]; + b2.s[0 + i*4] = a0.s[2 + i*4]; b2.s[1 + i*4] = a1.s[2 + i*4]; + b2.s[2 + i*4] = a2.s[2 + i*4]; b2.s[3 + i*4] = a3.s[2 + i*4]; + b3.s[0 + i*4] = a0.s[3 + i*4]; b3.s[1 + i*4] = a1.s[3 + i*4]; + b3.s[2 + i*4] = a2.s[3 + i*4]; b3.s[3 + i*4] = a3.s[3 + i*4]; + } +} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_INIT_ZERO(_Tpvec, prefix, suffix) \ +inline _Tpvec prefix##_setzero_##suffix() { return _Tpvec::zero(); } + +//! @name Init with zero +//! @{ +//! @brief Create new vector with zero elements +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint8x16, v, u8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int8x16, v, s8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint16x8, v, u16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int16x8, v, s16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint32x4, v, u32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int32x4, v, s32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float32x4, v, f32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float64x2, v, f64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint64x2, v, u64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int64x2, v, s64) + +#if CV_SIMD256 +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint8x32, v256, u8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int8x32, v256, s8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint16x16, v256, u16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int16x16, v256, s16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint32x8, v256, u32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int32x8, v256, s32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float32x8, v256, f32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float64x4, v256, f64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint64x4, v256, u64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int64x4, v256, s64) +#endif + +#if CV_SIMD512 +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint8x64, v512, u8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int8x64, v512, s8) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint16x32, v512, u16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int16x32, v512, s16) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint32x16, v512, u32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int32x16, v512, s32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float32x16, v512, f32) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_float64x8, v512, f64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_uint64x8, v512, u64) +OPENCV_HAL_IMPL_C_INIT_ZERO(v_int64x8, v512, s64) +#endif +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_INIT_VAL(_Tpvec, _Tp, prefix, suffix) \ +inline _Tpvec prefix##_setall_##suffix(_Tp val) { return _Tpvec::all(val); } + +//! @name Init with value +//! @{ +//! @brief Create new vector with elements set to a specific value +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint8x16, uchar, v, u8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int8x16, schar, v, s8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint16x8, ushort, v, u16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int16x8, short, v, s16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint32x4, unsigned, v, u32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int32x4, int, v, s32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float32x4, float, v, f32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float64x2, double, v, f64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint64x2, uint64, v, u64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int64x2, int64, v, s64) + +#if CV_SIMD256 +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint8x32, uchar, v256, u8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int8x32, schar, v256, s8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint16x16, ushort, v256, u16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int16x16, short, v256, s16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint32x8, unsigned, v256, u32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int32x8, int, v256, s32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float32x8, float, v256, f32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float64x4, double, v256, f64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint64x4, uint64, v256, u64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int64x4, int64, v256, s64) +#endif + +#if CV_SIMD512 +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint8x64, uchar, v512, u8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int8x64, schar, v512, s8) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint16x32, ushort, v512, u16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int16x32, short, v512, s16) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint32x16, unsigned, v512, u32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int32x16, int, v512, s32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float32x16, float, v512, f32) +OPENCV_HAL_IMPL_C_INIT_VAL(v_float64x8, double, v512, f64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_uint64x8, uint64, v512, u64) +OPENCV_HAL_IMPL_C_INIT_VAL(v_int64x8, int64, v512, s64) +#endif +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_REINTERPRET(_Tp, suffix) \ +template inline v_reg<_Tp, n0*sizeof(_Tp0)/sizeof(_Tp)> \ + v_reinterpret_as_##suffix(const v_reg<_Tp0, n0>& a) \ +{ return a.template reinterpret_as<_Tp, n0*sizeof(_Tp0)/sizeof(_Tp)>(); } + +//! @name Reinterpret +//! @{ +//! @brief Convert vector to different type without modifying underlying data. +OPENCV_HAL_IMPL_C_REINTERPRET(uchar, u8) +OPENCV_HAL_IMPL_C_REINTERPRET(schar, s8) +OPENCV_HAL_IMPL_C_REINTERPRET(ushort, u16) +OPENCV_HAL_IMPL_C_REINTERPRET(short, s16) +OPENCV_HAL_IMPL_C_REINTERPRET(unsigned, u32) +OPENCV_HAL_IMPL_C_REINTERPRET(int, s32) +OPENCV_HAL_IMPL_C_REINTERPRET(float, f32) +OPENCV_HAL_IMPL_C_REINTERPRET(double, f64) +OPENCV_HAL_IMPL_C_REINTERPRET(uint64, u64) +OPENCV_HAL_IMPL_C_REINTERPRET(int64, s64) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_SHIFTL(_Tp) \ +template inline v_reg<_Tp, n> v_shl(const v_reg<_Tp, n>& a) \ +{ return a << shift; } + +//! @name Left shift +//! @{ +//! @brief Shift left +OPENCV_HAL_IMPL_C_SHIFTL(ushort) +OPENCV_HAL_IMPL_C_SHIFTL(short) +OPENCV_HAL_IMPL_C_SHIFTL(unsigned) +OPENCV_HAL_IMPL_C_SHIFTL(int) +OPENCV_HAL_IMPL_C_SHIFTL(uint64) +OPENCV_HAL_IMPL_C_SHIFTL(int64) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_SHIFTR(_Tp) \ +template inline v_reg<_Tp, n> v_shr(const v_reg<_Tp, n>& a) \ +{ return a >> shift; } + +//! @name Right shift +//! @{ +//! @brief Shift right +OPENCV_HAL_IMPL_C_SHIFTR(ushort) +OPENCV_HAL_IMPL_C_SHIFTR(short) +OPENCV_HAL_IMPL_C_SHIFTR(unsigned) +OPENCV_HAL_IMPL_C_SHIFTR(int) +OPENCV_HAL_IMPL_C_SHIFTR(uint64) +OPENCV_HAL_IMPL_C_SHIFTR(int64) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_RSHIFTR(_Tp) \ +template inline v_reg<_Tp, n> v_rshr(const v_reg<_Tp, n>& a) \ +{ \ + v_reg<_Tp, n> c; \ + for( int i = 0; i < n; i++ ) \ + c.s[i] = (_Tp)((a.s[i] + ((_Tp)1 << (shift - 1))) >> shift); \ + return c; \ +} + +//! @name Rounding shift +//! @{ +//! @brief Rounding shift right +OPENCV_HAL_IMPL_C_RSHIFTR(ushort) +OPENCV_HAL_IMPL_C_RSHIFTR(short) +OPENCV_HAL_IMPL_C_RSHIFTR(unsigned) +OPENCV_HAL_IMPL_C_RSHIFTR(int) +OPENCV_HAL_IMPL_C_RSHIFTR(uint64) +OPENCV_HAL_IMPL_C_RSHIFTR(int64) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_PACK(_Tp, _Tpn, pack_suffix, cast) \ +template inline v_reg<_Tpn, 2*n> v_##pack_suffix(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tpn, 2*n> c; \ + for( int i = 0; i < n; i++ ) \ + { \ + c.s[i] = cast<_Tpn>(a.s[i]); \ + c.s[i+n] = cast<_Tpn>(b.s[i]); \ + } \ + return c; \ +} + +//! @name Pack +//! @{ +//! @brief Pack values from two vectors to one +//! +//! Return vector type have twice more elements than input vector types. Variant with _u_ suffix also +//! converts to corresponding unsigned type. +//! +//! - pack: for 16-, 32- and 64-bit integer input types +//! - pack_u: for 16- and 32-bit signed integer input types +//! +//! @note All variants except 64-bit use saturation. +OPENCV_HAL_IMPL_C_PACK(ushort, uchar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK(short, schar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK(unsigned, ushort, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK(int, short, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK(uint64, unsigned, pack, static_cast) +OPENCV_HAL_IMPL_C_PACK(int64, int, pack, static_cast) +OPENCV_HAL_IMPL_C_PACK(short, uchar, pack_u, saturate_cast) +OPENCV_HAL_IMPL_C_PACK(int, ushort, pack_u, saturate_cast) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_RSHR_PACK(_Tp, _Tpn, pack_suffix, cast) \ +template inline v_reg<_Tpn, 2*n> v_rshr_##pack_suffix(const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) \ +{ \ + v_reg<_Tpn, 2*n> c; \ + for( int i = 0; i < n; i++ ) \ + { \ + c.s[i] = cast<_Tpn>((a.s[i] + ((_Tp)1 << (shift - 1))) >> shift); \ + c.s[i+n] = cast<_Tpn>((b.s[i] + ((_Tp)1 << (shift - 1))) >> shift); \ + } \ + return c; \ +} + +//! @name Pack with rounding shift +//! @{ +//! @brief Pack values from two vectors to one with rounding shift +//! +//! Values from the input vectors will be shifted right by _n_ bits with rounding, converted to narrower +//! type and returned in the result vector. Variant with _u_ suffix converts to unsigned type. +//! +//! - pack: for 16-, 32- and 64-bit integer input types +//! - pack_u: for 16- and 32-bit signed integer input types +//! +//! @note All variants except 64-bit use saturation. +OPENCV_HAL_IMPL_C_RSHR_PACK(ushort, uchar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(short, schar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(unsigned, ushort, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(int, short, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(uint64, unsigned, pack, static_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(int64, int, pack, static_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(short, uchar, pack_u, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK(int, ushort, pack_u, saturate_cast) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_PACK_STORE(_Tp, _Tpn, pack_suffix, cast) \ +template inline void v_##pack_suffix##_store(_Tpn* ptr, const v_reg<_Tp, n>& a) \ +{ \ + for( int i = 0; i < n; i++ ) \ + ptr[i] = cast<_Tpn>(a.s[i]); \ +} + +//! @name Pack and store +//! @{ +//! @brief Store values from the input vector into memory with pack +//! +//! Values will be stored into memory with conversion to narrower type. +//! Variant with _u_ suffix converts to corresponding unsigned type. +//! +//! - pack: for 16-, 32- and 64-bit integer input types +//! - pack_u: for 16- and 32-bit signed integer input types +//! +//! @note All variants except 64-bit use saturation. +OPENCV_HAL_IMPL_C_PACK_STORE(ushort, uchar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(short, schar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(unsigned, ushort, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(int, short, pack, saturate_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(uint64, unsigned, pack, static_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(int64, int, pack, static_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(short, uchar, pack_u, saturate_cast) +OPENCV_HAL_IMPL_C_PACK_STORE(int, ushort, pack_u, saturate_cast) +//! @} + +//! @brief Helper macro +//! @ingroup core_hal_intrin_impl +#define OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(_Tp, _Tpn, pack_suffix, cast) \ +template inline void v_rshr_##pack_suffix##_store(_Tpn* ptr, const v_reg<_Tp, n>& a) \ +{ \ + for( int i = 0; i < n; i++ ) \ + ptr[i] = cast<_Tpn>((a.s[i] + ((_Tp)1 << (shift - 1))) >> shift); \ +} + +//! @name Pack and store with rounding shift +//! @{ +//! @brief Store values from the input vector into memory with pack +//! +//! Values will be shifted _n_ bits right with rounding, converted to narrower type and stored into +//! memory. Variant with _u_ suffix converts to unsigned type. +//! +//! - pack: for 16-, 32- and 64-bit integer input types +//! - pack_u: for 16- and 32-bit signed integer input types +//! +//! @note All variants except 64-bit use saturation. +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(ushort, uchar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(short, schar, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(unsigned, ushort, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(int, short, pack, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(uint64, unsigned, pack, static_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(int64, int, pack, static_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(short, uchar, pack_u, saturate_cast) +OPENCV_HAL_IMPL_C_RSHR_PACK_STORE(int, ushort, pack_u, saturate_cast) +//! @} + +//! @cond IGNORED +template +inline void _pack_b(_Tpm* mptr, const v_reg<_Tp, n>& a, const v_reg<_Tp, n>& b) +{ + for (int i = 0; i < n; ++i) + { + mptr[i] = (_Tpm)a.s[i]; + mptr[i + n] = (_Tpm)b.s[i]; + } +} +//! @endcond + +//! @name Pack boolean values +//! @{ +//! @brief Pack boolean values from multiple vectors to one unsigned 8-bit integer vector +//! +//! @note Must provide valid boolean values to guarantee same result for all architectures. + +/** @brief +//! For 16-bit boolean values + +Scheme: +@code +a {0xFFFF 0 0 0xFFFF 0 0xFFFF 0xFFFF 0} +b {0xFFFF 0 0xFFFF 0 0 0xFFFF 0 0xFFFF} +=============== +{ + 0xFF 0 0 0xFF 0 0xFF 0xFF 0 + 0xFF 0 0xFF 0 0 0xFF 0 0xFF +} +@endcode */ + +template inline v_reg v_pack_b(const v_reg& a, const v_reg& b) +{ + v_reg mask; + _pack_b(mask.s, a, b); + return mask; +} + +/** @overload +For 32-bit boolean values + +Scheme: +@code +a {0xFFFF.. 0 0 0xFFFF..} +b {0 0xFFFF.. 0xFFFF.. 0} +c {0xFFFF.. 0 0xFFFF.. 0} +d {0 0xFFFF.. 0 0xFFFF..} +=============== +{ + 0xFF 0 0 0xFF 0 0xFF 0xFF 0 + 0xFF 0 0xFF 0 0 0xFF 0 0xFF +} +@endcode */ + +template inline v_reg v_pack_b(const v_reg& a, const v_reg& b, + const v_reg& c, const v_reg& d) +{ + v_reg mask; + _pack_b(mask.s, a, b); + _pack_b(mask.s + 2*n, c, d); + return mask; +} + +/** @overload +For 64-bit boolean values + +Scheme: +@code +a {0xFFFF.. 0} +b {0 0xFFFF..} +c {0xFFFF.. 0} +d {0 0xFFFF..} + +e {0xFFFF.. 0} +f {0xFFFF.. 0} +g {0 0xFFFF..} +h {0 0xFFFF..} +=============== +{ + 0xFF 0 0 0xFF 0xFF 0 0 0xFF + 0xFF 0 0xFF 0 0 0xFF 0 0xFF +} +@endcode */ +template inline v_reg v_pack_b(const v_reg& a, const v_reg& b, + const v_reg& c, const v_reg& d, + const v_reg& e, const v_reg& f, + const v_reg& g, const v_reg& h) +{ + v_reg mask; + _pack_b(mask.s, a, b); + _pack_b(mask.s + 2*n, c, d); + _pack_b(mask.s + 4*n, e, f); + _pack_b(mask.s + 6*n, g, h); + return mask; +} +//! @} + +/** @brief Matrix multiplication + +Scheme: +@code +{A0 A1 A2 A3} |V0| +{B0 B1 B2 B3} |V1| +{C0 C1 C2 C3} |V2| +{D0 D1 D2 D3} x |V3| +==================== +{R0 R1 R2 R3}, where: +R0 = A0V0 + B0V1 + C0V2 + D0V3, +R1 = A1V0 + B1V1 + C1V2 + D1V3 +... +@endcode +*/ +template +inline v_reg v_matmul(const v_reg& v, + const v_reg& a, const v_reg& b, + const v_reg& c, const v_reg& d) +{ + v_reg res; + for (int i = 0; i < n / 4; i++) + { + res.s[0 + i*4] = v.s[0 + i*4] * a.s[0 + i*4] + v.s[1 + i*4] * b.s[0 + i*4] + v.s[2 + i*4] * c.s[0 + i*4] + v.s[3 + i*4] * d.s[0 + i*4]; + res.s[1 + i*4] = v.s[0 + i*4] * a.s[1 + i*4] + v.s[1 + i*4] * b.s[1 + i*4] + v.s[2 + i*4] * c.s[1 + i*4] + v.s[3 + i*4] * d.s[1 + i*4]; + res.s[2 + i*4] = v.s[0 + i*4] * a.s[2 + i*4] + v.s[1 + i*4] * b.s[2 + i*4] + v.s[2 + i*4] * c.s[2 + i*4] + v.s[3 + i*4] * d.s[2 + i*4]; + res.s[3 + i*4] = v.s[0 + i*4] * a.s[3 + i*4] + v.s[1 + i*4] * b.s[3 + i*4] + v.s[2 + i*4] * c.s[3 + i*4] + v.s[3 + i*4] * d.s[3 + i*4]; + } + return res; +} + +/** @brief Matrix multiplication and add + +Scheme: +@code +{A0 A1 A2 A3} |V0| |D0| +{B0 B1 B2 B3} |V1| |D1| +{C0 C1 C2 C3} x |V2| + |D2| +==================== |D3| +{R0 R1 R2 R3}, where: +R0 = A0V0 + B0V1 + C0V2 + D0, +R1 = A1V0 + B1V1 + C1V2 + D1 +... +@endcode +*/ +template +inline v_reg v_matmuladd(const v_reg& v, + const v_reg& a, const v_reg& b, + const v_reg& c, const v_reg& d) +{ + v_reg res; + for (int i = 0; i < n / 4; i++) + { + res.s[0 + i * 4] = v.s[0 + i * 4] * a.s[0 + i * 4] + v.s[1 + i * 4] * b.s[0 + i * 4] + v.s[2 + i * 4] * c.s[0 + i * 4] + d.s[0 + i * 4]; + res.s[1 + i * 4] = v.s[0 + i * 4] * a.s[1 + i * 4] + v.s[1 + i * 4] * b.s[1 + i * 4] + v.s[2 + i * 4] * c.s[1 + i * 4] + d.s[1 + i * 4]; + res.s[2 + i * 4] = v.s[0 + i * 4] * a.s[2 + i * 4] + v.s[1 + i * 4] * b.s[2 + i * 4] + v.s[2 + i * 4] * c.s[2 + i * 4] + d.s[2 + i * 4]; + res.s[3 + i * 4] = v.s[0 + i * 4] * a.s[3 + i * 4] + v.s[1 + i * 4] * b.s[3 + i * 4] + v.s[2 + i * 4] * c.s[3 + i * 4] + d.s[3 + i * 4]; + } + return res; +} + + +template inline v_reg v_dotprod_expand(const v_reg& a, const v_reg& b) +{ return v_fma(v_cvt_f64(a), v_cvt_f64(b), v_cvt_f64_high(a) * v_cvt_f64_high(b)); } +template inline v_reg v_dotprod_expand(const v_reg& a, const v_reg& b, + const v_reg& c) +{ return v_fma(v_cvt_f64(a), v_cvt_f64(b), v_fma(v_cvt_f64_high(a), v_cvt_f64_high(b), c)); } + +template inline v_reg v_dotprod_expand_fast(const v_reg& a, const v_reg& b) +{ return v_dotprod_expand(a, b); } +template inline v_reg v_dotprod_expand_fast(const v_reg& a, const v_reg& b, + const v_reg& c) +{ return v_dotprod_expand(a, b, c); } + +////// FP16 support /////// + +inline v_reg +v_load_expand(const float16_t* ptr) +{ + v_reg v; + for( int i = 0; i < v.nlanes; i++ ) + { + v.s[i] = ptr[i]; + } + return v; +} +#if CV_SIMD256 +inline v_reg +v256_load_expand(const float16_t* ptr) +{ + v_reg v; + for (int i = 0; i < v.nlanes; i++) + { + v.s[i] = ptr[i]; + } + return v; +} +#endif +#if CV_SIMD512 +inline v_reg +v512_load_expand(const float16_t* ptr) +{ + v_reg v; + for (int i = 0; i < v.nlanes; i++) + { + v.s[i] = ptr[i]; + } + return v; +} +#endif + +template inline void +v_pack_store(float16_t* ptr, const v_reg& v) +{ + for( int i = 0; i < v.nlanes; i++ ) + { + ptr[i] = float16_t(v.s[i]); + } +} + +inline void v_cleanup() {} +#if CV_SIMD256 +inline void v256_cleanup() {} +#endif +#if CV_SIMD512 +inline void v512_cleanup() {} +#endif + +//! @} + +#ifndef CV_DOXYGEN +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END +#endif +} + +#if !defined(CV_DOXYGEN) +#undef CV_SIMD256 +#undef CV_SIMD512 +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_forward.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_forward.hpp new file mode 100644 index 0000000..28f67cc --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_forward.hpp @@ -0,0 +1,191 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef CV__SIMD_FORWARD +#error "Need to pre-define forward width" +#endif + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +/** Types **/ +#if CV__SIMD_FORWARD == 1024 +// [todo] 1024 +#error "1024-long ops not implemented yet" +#elif CV__SIMD_FORWARD == 512 +// 512 +#define __CV_VX(fun) v512_##fun +#define __CV_V_UINT8 v_uint8x64 +#define __CV_V_INT8 v_int8x64 +#define __CV_V_UINT16 v_uint16x32 +#define __CV_V_INT16 v_int16x32 +#define __CV_V_UINT32 v_uint32x16 +#define __CV_V_INT32 v_int32x16 +#define __CV_V_UINT64 v_uint64x8 +#define __CV_V_INT64 v_int64x8 +#define __CV_V_FLOAT32 v_float32x16 +#define __CV_V_FLOAT64 v_float64x8 +struct v_uint8x64; +struct v_int8x64; +struct v_uint16x32; +struct v_int16x32; +struct v_uint32x16; +struct v_int32x16; +struct v_uint64x8; +struct v_int64x8; +struct v_float32x16; +struct v_float64x8; +#elif CV__SIMD_FORWARD == 256 +// 256 +#define __CV_VX(fun) v256_##fun +#define __CV_V_UINT8 v_uint8x32 +#define __CV_V_INT8 v_int8x32 +#define __CV_V_UINT16 v_uint16x16 +#define __CV_V_INT16 v_int16x16 +#define __CV_V_UINT32 v_uint32x8 +#define __CV_V_INT32 v_int32x8 +#define __CV_V_UINT64 v_uint64x4 +#define __CV_V_INT64 v_int64x4 +#define __CV_V_FLOAT32 v_float32x8 +#define __CV_V_FLOAT64 v_float64x4 +struct v_uint8x32; +struct v_int8x32; +struct v_uint16x16; +struct v_int16x16; +struct v_uint32x8; +struct v_int32x8; +struct v_uint64x4; +struct v_int64x4; +struct v_float32x8; +struct v_float64x4; +#else +// 128 +#define __CV_VX(fun) v_##fun +#define __CV_V_UINT8 v_uint8x16 +#define __CV_V_INT8 v_int8x16 +#define __CV_V_UINT16 v_uint16x8 +#define __CV_V_INT16 v_int16x8 +#define __CV_V_UINT32 v_uint32x4 +#define __CV_V_INT32 v_int32x4 +#define __CV_V_UINT64 v_uint64x2 +#define __CV_V_INT64 v_int64x2 +#define __CV_V_FLOAT32 v_float32x4 +#define __CV_V_FLOAT64 v_float64x2 +struct v_uint8x16; +struct v_int8x16; +struct v_uint16x8; +struct v_int16x8; +struct v_uint32x4; +struct v_int32x4; +struct v_uint64x2; +struct v_int64x2; +struct v_float32x4; +struct v_float64x2; +#endif + +/** Value reordering **/ + +// Expansion +void v_expand(const __CV_V_UINT8&, __CV_V_UINT16&, __CV_V_UINT16&); +void v_expand(const __CV_V_INT8&, __CV_V_INT16&, __CV_V_INT16&); +void v_expand(const __CV_V_UINT16&, __CV_V_UINT32&, __CV_V_UINT32&); +void v_expand(const __CV_V_INT16&, __CV_V_INT32&, __CV_V_INT32&); +void v_expand(const __CV_V_UINT32&, __CV_V_UINT64&, __CV_V_UINT64&); +void v_expand(const __CV_V_INT32&, __CV_V_INT64&, __CV_V_INT64&); +// Low Expansion +__CV_V_UINT16 v_expand_low(const __CV_V_UINT8&); +__CV_V_INT16 v_expand_low(const __CV_V_INT8&); +__CV_V_UINT32 v_expand_low(const __CV_V_UINT16&); +__CV_V_INT32 v_expand_low(const __CV_V_INT16&); +__CV_V_UINT64 v_expand_low(const __CV_V_UINT32&); +__CV_V_INT64 v_expand_low(const __CV_V_INT32&); +// High Expansion +__CV_V_UINT16 v_expand_high(const __CV_V_UINT8&); +__CV_V_INT16 v_expand_high(const __CV_V_INT8&); +__CV_V_UINT32 v_expand_high(const __CV_V_UINT16&); +__CV_V_INT32 v_expand_high(const __CV_V_INT16&); +__CV_V_UINT64 v_expand_high(const __CV_V_UINT32&); +__CV_V_INT64 v_expand_high(const __CV_V_INT32&); +// Load & Low Expansion +__CV_V_UINT16 __CV_VX(load_expand)(const uchar*); +__CV_V_INT16 __CV_VX(load_expand)(const schar*); +__CV_V_UINT32 __CV_VX(load_expand)(const ushort*); +__CV_V_INT32 __CV_VX(load_expand)(const short*); +__CV_V_UINT64 __CV_VX(load_expand)(const uint*); +__CV_V_INT64 __CV_VX(load_expand)(const int*); +// Load lower 8-bit and expand into 32-bit +__CV_V_UINT32 __CV_VX(load_expand_q)(const uchar*); +__CV_V_INT32 __CV_VX(load_expand_q)(const schar*); + +// Saturating Pack +__CV_V_UINT8 v_pack(const __CV_V_UINT16&, const __CV_V_UINT16&); +__CV_V_INT8 v_pack(const __CV_V_INT16&, const __CV_V_INT16&); +__CV_V_UINT16 v_pack(const __CV_V_UINT32&, const __CV_V_UINT32&); +__CV_V_INT16 v_pack(const __CV_V_INT32&, const __CV_V_INT32&); +// Non-saturating Pack +__CV_V_UINT32 v_pack(const __CV_V_UINT64&, const __CV_V_UINT64&); +__CV_V_INT32 v_pack(const __CV_V_INT64&, const __CV_V_INT64&); +// Pack signed integers with unsigned saturation +__CV_V_UINT8 v_pack_u(const __CV_V_INT16&, const __CV_V_INT16&); +__CV_V_UINT16 v_pack_u(const __CV_V_INT32&, const __CV_V_INT32&); + +/** Arithmetic, bitwise and comparison operations **/ + +// Non-saturating multiply +#if CV_VSX +template +Tvec v_mul_wrap(const Tvec& a, const Tvec& b); +#else +__CV_V_UINT8 v_mul_wrap(const __CV_V_UINT8&, const __CV_V_UINT8&); +__CV_V_INT8 v_mul_wrap(const __CV_V_INT8&, const __CV_V_INT8&); +__CV_V_UINT16 v_mul_wrap(const __CV_V_UINT16&, const __CV_V_UINT16&); +__CV_V_INT16 v_mul_wrap(const __CV_V_INT16&, const __CV_V_INT16&); +#endif + +// Multiply and expand +#if CV_VSX +template +void v_mul_expand(const Tvec& a, const Tvec& b, Twvec& c, Twvec& d); +#else +void v_mul_expand(const __CV_V_UINT8&, const __CV_V_UINT8&, __CV_V_UINT16&, __CV_V_UINT16&); +void v_mul_expand(const __CV_V_INT8&, const __CV_V_INT8&, __CV_V_INT16&, __CV_V_INT16&); +void v_mul_expand(const __CV_V_UINT16&, const __CV_V_UINT16&, __CV_V_UINT32&, __CV_V_UINT32&); +void v_mul_expand(const __CV_V_INT16&, const __CV_V_INT16&, __CV_V_INT32&, __CV_V_INT32&); +void v_mul_expand(const __CV_V_UINT32&, const __CV_V_UINT32&, __CV_V_UINT64&, __CV_V_UINT64&); +void v_mul_expand(const __CV_V_INT32&, const __CV_V_INT32&, __CV_V_INT64&, __CV_V_INT64&); +#endif + +// Conversions +__CV_V_FLOAT32 v_cvt_f32(const __CV_V_INT32& a); +__CV_V_FLOAT32 v_cvt_f32(const __CV_V_FLOAT64& a); +__CV_V_FLOAT32 v_cvt_f32(const __CV_V_FLOAT64& a, const __CV_V_FLOAT64& b); +__CV_V_FLOAT64 v_cvt_f64(const __CV_V_INT32& a); +__CV_V_FLOAT64 v_cvt_f64_high(const __CV_V_INT32& a); +__CV_V_FLOAT64 v_cvt_f64(const __CV_V_FLOAT32& a); +__CV_V_FLOAT64 v_cvt_f64_high(const __CV_V_FLOAT32& a); +__CV_V_FLOAT64 v_cvt_f64(const __CV_V_INT64& a); + +/** Cleanup **/ +#undef CV__SIMD_FORWARD +#undef __CV_VX +#undef __CV_V_UINT8 +#undef __CV_V_INT8 +#undef __CV_V_UINT16 +#undef __CV_V_INT16 +#undef __CV_V_UINT32 +#undef __CV_V_INT32 +#undef __CV_V_UINT64 +#undef __CV_V_INT64 +#undef __CV_V_FLOAT32 +#undef __CV_V_FLOAT64 + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lasx.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lasx.hpp new file mode 100644 index 0000000..5214e80 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lasx.hpp @@ -0,0 +1,3023 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_INTRIN_LASX_HPP +#define OPENCV_HAL_INTRIN_LASX_HPP + +#include +#include + +#define CV_SIMD256 1 +#define CV_SIMD256_64F 1 +#define CV_SIMD256_FP16 0 + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +///////// Utils //////////// + +inline __m256i _v256_setr_b(char v0, char v1, char v2, char v3, char v4, char v5, char v6, char v7, char v8, char v9, + char v10, char v11, char v12, char v13, char v14, char v15, char v16, char v17, char v18, char v19, + char v20, char v21, char v22, char v23, char v24, char v25, char v26, char v27, char v28, char v29, + char v30, char v31) +{ + return (__m256i)v32i8{ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, + v30, v31 }; +} + +inline __m256i _v256_set_b(char v0, char v1, char v2, char v3, char v4, char v5, char v6, char v7, char v8, char v9, + char v10, char v11, char v12, char v13, char v14, char v15, char v16, char v17, char v18, char v19, + char v20, char v21, char v22, char v23, char v24, char v25, char v26, char v27, char v28, char v29, + char v30, char v31) +{ + return (__m256i)v32i8{ v31, v30, + v29, v28, v27, v26, v25, v24, v23, v22, v21, v20, + v19, v18, v17, v16, v15, v14, v13, v12, v11, v10, + v9, v8, v7, v6, v5, v4, v3, v2, v1, v0 }; +} + +inline __m256i _v256_setr_h(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7, + short v8, short v9, short v10, short v11, short v12, short v13, short v14, short v15) +{ + return (__m256i)v16i16{ v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 }; +} + +inline __m256i _v256_setr_w(int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7) +{ + return (__m256i)v8i32{ v0, v1, v2, v3, v4, v5, v6, v7 }; +} + +inline __m256i _v256_set_w(int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7) +{ + return (__m256i)v8i32{ v7, v6, v5, v4, v3, v2, v1, v0 }; +} + +inline __m256i _v256_setall_w(int v0) +{ + return (__m256i)v8i32{ v0, v0, v0, v0, v0, v0, v0, v0 }; +} + +inline __m256i _v256_setr_d(int64 v0, int64 v1, int64 v2, int64 v3) +{ + return (__m256i)v4i64{ v0, v1, v2, v3 }; +} + +inline __m256i _v256_set_d(int64 v0, int64 v1, int64 v2, int64 v3) +{ + return (__m256i)v4i64{ v3, v2, v1, v0 }; +} + +inline __m256 _v256_setr_ps(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7) +{ + return (__m256)v8f32{ v0, v1, v2, v3, v4, v5, v6, v7 }; +} + +inline __m256 _v256_setall_ps(float f32) +{ + return (__m256)v8f32{ f32, f32, f32, f32, f32, f32, f32, f32 }; +} + +inline __m256d _v256_setr_pd(double v0, double v1, double v2, double v3) +{ + return (__m256d)v4f64{ v0, v1, v2, v3 }; +} + +inline __m256d _v256_setall_pd(double f64) +{ + return (__m256d)v4f64{ f64, f64, f64, f64 }; +} + +inline __m256i _lasx_packus_h(const __m256i& a, const __m256i& b) +{ + return __lasx_xvssrarni_bu_h(b, a, 0); +} + +inline __m256i _lasx_packs_h(const __m256i& a, const __m256i& b) +{ + return __lasx_xvssrarni_b_h(b, a, 0); +} + +inline __m256i _lasx_packus_w(const __m256i& a, const __m256i& b) +{ + return __lasx_xvssrarni_hu_w(b, a, 0); +} + +inline __m256i _lasx_packs_w(const __m256i& a, const __m256i& b) +{ + return __lasx_xvssrarni_h_w(b, a, 0); +} + +inline __m256i _v256_combine(const __m128i& lo, const __m128i& hi) +{ return __lasx_xvpermi_q(*((__m256i*)&lo), *((__m256i*)&hi), 0x02); } + +inline __m256 _v256_combine(const __m128& lo, const __m128& hi) +{ return __m256(__lasx_xvpermi_q(*((__m256i*)&lo), *((__m256i*)&hi), 0x02)); } + +inline __m256d _v256_combine(const __m128d& lo, const __m128d& hi) +{ return __m256d(__lasx_xvpermi_q(*((__m256i*)&lo), *((__m256i*)&hi), 0x02)); } + +inline __m256i _v256_shuffle_odd_64(const __m256i& v) +{ return __lasx_xvpermi_d(v, 0xd8); } + +inline __m256d _v256_shuffle_odd_64(const __m256d& v) +{ return __m256d(__lasx_xvpermi_d(*((__m256i*)&v), 0xd8)); } + +//LASX: only use for permute WITHOUT zero clearing +template +inline __m256i _v256_permute2x128(const __m256i& a, const __m256i& b) +{ return __lasx_xvpermi_q(a, b, imm); } + +template +inline __m256 _v256_permute2x128(const __m256& a, const __m256& b) +{ return __m256(__lasx_xvpermi_q(*((__m256i*)&a), *((__m256i*)&b), imm)); } + +template +inline __m256d _v256_permute2x128(const __m256d& a, const __m256d& b) +{ return __m256d(__lasx_xvpermi_q(*((__m256i*)&a), *((__m256i*)&b), imm)); } + +template +inline _Tpvec v256_permute2x128(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(_v256_permute2x128(a.val, b.val)); } + +template +inline __m256i _v256_permute4x64(const __m256i& a) +{ return __lasx_xvpermi_d(a, imm); } + +template +inline __m256d _v256_permute4x64(const __m256d& a) +{ return __m256d(__lasx_xvpermi_d(*((__m256i*)&a), imm)); } + +template +inline _Tpvec v256_permute4x64(const _Tpvec& a) +{ return _Tpvec(_v256_permute4x64(a.val)); } + +inline __m128i _v256_extract_high(const __m256i& v) +{ __m256i temp256i = __lasx_xvpermi_d(v, 0x4E); + return *((__m128i*)&temp256i); } + +inline __m128 _v256_extract_high(const __m256& v) +{ return __m128(_v256_extract_high(*((__m256i*)&v))); } + +inline __m128d _v256_extract_high(const __m256d& v) +{ return __m128d(_v256_extract_high(*((__m256i*)&v))); } + +inline __m128i _v256_extract_low(const __m256i& v) +{ return *((__m128i*)&v); } + +inline __m128 _v256_extract_low(const __m256& v) +{ return __m128(_v256_extract_low(*((__m256i*)&v))); } + +inline __m128d _v256_extract_low(const __m256d& v) +{ return __m128d(_v256_extract_low(*((__m256i*)&v))); } + +inline __m256i _v256_packs_epu32(const __m256i& a, const __m256i& b) +{ + return __lasx_xvssrlrni_hu_w(b, a, 0); +} + +template +inline int _v256_extract_b(const __m256i& a) +{ + int des[1] = {0}; + __lasx_xvstelm_b(a, des, 0, i); + return des[0]; +} + +template +inline int _v256_extract_h(const __m256i& a) +{ + int des[1] = {0}; + __lasx_xvstelm_h(a, des, 0, i); + return des[0]; +} + +template +inline int _v256_extract_w(const __m256i& a) +{ + return __lasx_xvpickve2gr_w(a, i); +} + +template +inline int64 _v256_extract_d(const __m256i& a) +{ + return __lasx_xvpickve2gr_d(a, i); +} + +///////// Types //////////// + +struct v_uint8x32 +{ + typedef uchar lane_type; + enum { nlanes = 32 }; + __m256i val; + + explicit v_uint8x32(__m256i v) : val(v) {} + v_uint8x32(uchar v0, uchar v1, uchar v2, uchar v3, + uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, + uchar v12, uchar v13, uchar v14, uchar v15, + uchar v16, uchar v17, uchar v18, uchar v19, + uchar v20, uchar v21, uchar v22, uchar v23, + uchar v24, uchar v25, uchar v26, uchar v27, + uchar v28, uchar v29, uchar v30, uchar v31) + { + val = _v256_setr_b((char)v0, (char)v1, (char)v2, (char)v3, + (char)v4, (char)v5, (char)v6 , (char)v7, (char)v8, (char)v9, + (char)v10, (char)v11, (char)v12, (char)v13, (char)v14, (char)v15, + (char)v16, (char)v17, (char)v18, (char)v19, (char)v20, (char)v21, + (char)v22, (char)v23, (char)v24, (char)v25, (char)v26, (char)v27, + (char)v28, (char)v29, (char)v30, (char)v31); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint8x32() {} + + uchar get0() const { + uchar des[1] = {0}; + __lasx_xvstelm_b(val, des, 0, 0); + return des[0]; + } +}; + +struct v_int8x32 +{ + typedef schar lane_type; + enum { nlanes = 32 }; + __m256i val; + + explicit v_int8x32(__m256i v) : val(v) {} + v_int8x32(schar v0, schar v1, schar v2, schar v3, + schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, + schar v12, schar v13, schar v14, schar v15, + schar v16, schar v17, schar v18, schar v19, + schar v20, schar v21, schar v22, schar v23, + schar v24, schar v25, schar v26, schar v27, + schar v28, schar v29, schar v30, schar v31) + { + val = _v256_setr_b(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, + v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int8x32() {} + + schar get0() const { + schar des[1] = {0}; + __lasx_xvstelm_b(val, des, 0, 0); + return des[0]; + } +}; + +struct v_uint16x16 +{ + typedef ushort lane_type; + enum { nlanes = 16 }; + __m256i val; + + explicit v_uint16x16(__m256i v) : val(v) {} + v_uint16x16(ushort v0, ushort v1, ushort v2, ushort v3, + ushort v4, ushort v5, ushort v6, ushort v7, + ushort v8, ushort v9, ushort v10, ushort v11, + ushort v12, ushort v13, ushort v14, ushort v15) + { + val = _v256_setr_h((short)v0, (short)v1, (short)v2, (short)v3, + (short)v4, (short)v5, (short)v6, (short)v7, (short)v8, (short)v9, + (short)v10, (short)v11, (short)v12, (short)v13, (short)v14, (short)v15); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint16x16() {} + + ushort get0() const { + ushort des[1] = {0}; + __lasx_xvstelm_h(val, des, 0, 0); + return des[0]; + } +}; + +struct v_int16x16 +{ + typedef short lane_type; + enum { nlanes = 16 }; + __m256i val; + + explicit v_int16x16(__m256i v) : val(v) {} + v_int16x16(short v0, short v1, short v2, short v3, + short v4, short v5, short v6, short v7, + short v8, short v9, short v10, short v11, + short v12, short v13, short v14, short v15) + { + val = _v256_setr_h(v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int16x16() {} + + short get0() const { + short des[1] = {0}; + __lasx_xvstelm_h(val, des, 0, 0); + return des[0]; + } +}; + +struct v_uint32x8 +{ + typedef unsigned lane_type; + enum { nlanes = 8 }; + __m256i val; + + explicit v_uint32x8(__m256i v) : val(v) {} + v_uint32x8(unsigned v0, unsigned v1, unsigned v2, unsigned v3, + unsigned v4, unsigned v5, unsigned v6, unsigned v7) + { + val = _v256_setr_w((unsigned)v0, (unsigned)v1, (unsigned)v2, + (unsigned)v3, (unsigned)v4, (unsigned)v5, (unsigned)v6, (unsigned)v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_uint32x8() {} + + unsigned get0() const { return __lasx_xvpickve2gr_wu(val, 0); } +}; + +struct v_int32x8 +{ + typedef int lane_type; + enum { nlanes = 8 }; + __m256i val; + + explicit v_int32x8(__m256i v) : val(v) {} + v_int32x8(int v0, int v1, int v2, int v3, + int v4, int v5, int v6, int v7) + { + val = _v256_setr_w(v0, v1, v2, v3, v4, v5, v6, v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_int32x8() {} + + int get0() const { return __lasx_xvpickve2gr_w(val, 0); } +}; + +struct v_float32x8 +{ + typedef float lane_type; + enum { nlanes = 8 }; + __m256 val; + + explicit v_float32x8(__m256 v) : val(v) {} + explicit v_float32x8(__m256i v) { val = *((__m256*)&v); } + v_float32x8(float v0, float v1, float v2, float v3, + float v4, float v5, float v6, float v7) + { + val = _v256_setr_ps(v0, v1, v2, v3, v4, v5, v6, v7); + } + /* coverity[uninit_ctor]: suppress warning */ + v_float32x8() {} + + float get0() const { + float des[1] = {0}; + __lasx_xvstelm_w(*((__m256i*)&val), des, 0, 0); + return des[0]; + } + + int get0toint() const { + int des[1] = {0}; + __lasx_xvstelm_w(*((__m256i*)&val), des, 0, 0); + return des[0]; + } +}; + +struct v_uint64x4 +{ + typedef uint64 lane_type; + enum { nlanes = 4 }; + __m256i val; + + explicit v_uint64x4(__m256i v) : val(v) {} + v_uint64x4(uint64 v0, uint64 v1, uint64 v2, uint64 v3) + { val = _v256_setr_d((int64)v0, (int64)v1, (int64)v2, (int64)v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_uint64x4() {} + + uint64 get0() const + { + return __lasx_xvpickve2gr_du(val, 0); + } +}; + +struct v_int64x4 +{ + typedef int64 lane_type; + enum { nlanes = 4 }; + __m256i val; + + explicit v_int64x4(__m256i v) : val(v) {} + v_int64x4(int64 v0, int64 v1, int64 v2, int64 v3) + { val = _v256_setr_d(v0, v1, v2, v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_int64x4() {} + + int64 get0() const + { + return __lasx_xvpickve2gr_d(val, 0); + } +}; + +struct v_float64x4 +{ + typedef double lane_type; + enum { nlanes = 4 }; + __m256d val; + + explicit v_float64x4(__m256d v) : val(v) {} + explicit v_float64x4(__m256i v) { val = *((__m256d*)&v); } + v_float64x4(double v0, double v1, double v2, double v3) + { val = _v256_setr_pd(v0, v1, v2, v3); } + /* coverity[uninit_ctor]: suppress warning */ + v_float64x4() {} + + double get0() const { + double des[1] = {0}; + __lasx_xvstelm_d(*((__m256i*)&val), des, 0, 0); + return des[0]; + } + + int64 get0toint64() const { + int64 des[1] = {0}; + __lasx_xvstelm_d(*((__m256i*)&val), des, 0, 0); + return des[0]; + } +}; + +//////////////// Load and store operations /////////////// + +#define OPENCV_HAL_IMPL_LASX_LOADSTORE(_Tpvec, _Tp) \ + inline _Tpvec v256_load(const _Tp* ptr) \ + { return _Tpvec(__lasx_xvld(ptr, 0)); } \ + inline _Tpvec v256_load_aligned(const _Tp* ptr) \ + { return _Tpvec(__lasx_xvld(ptr, 0)); } \ + inline _Tpvec v256_load_low(const _Tp* ptr) \ + { \ + __m128i v128 = __lsx_vld(ptr, 0); \ + return _Tpvec(*((__m256i*)&v128)); \ + } \ + inline _Tpvec v256_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + __m128i vlo = __lsx_vld(ptr0, 0); \ + __m128i vhi = __lsx_vld(ptr1, 0); \ + return _Tpvec(_v256_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + __lasx_xvst(a.val, ptr, 0); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + __lasx_xvst(a.val, ptr, 0); \ + else \ + __lasx_xvst(a.val, ptr, 0); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(_v256_extract_low(a.val), ptr, 0); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(_v256_extract_high(a.val), ptr, 0); } + +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_uint8x32, uchar) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_int8x32, schar) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_uint16x16, ushort) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_int16x16, short) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_uint32x8, unsigned) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_int32x8, int) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_uint64x4, uint64) +OPENCV_HAL_IMPL_LASX_LOADSTORE(v_int64x4, int64) + + +#define OPENCV_HAL_IMPL_LASX_LOADSTORE_FLT(_Tpvec, _Tp, halfreg) \ + inline _Tpvec v256_load(const _Tp* ptr) \ + { return _Tpvec(__lasx_xvld(ptr, 0)); } \ + inline _Tpvec v256_load_aligned(const _Tp* ptr) \ + { return _Tpvec(__lasx_xvld(ptr, 0)); } \ + inline _Tpvec v256_load_low(const _Tp* ptr) \ + { \ + __m128i v128 = __lsx_vld(ptr, 0); \ + return _Tpvec(*((__m256i*)&v128)); \ + } \ + inline _Tpvec v256_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + halfreg vlo = __lsx_vld(ptr0, 0); \ + halfreg vhi = __lsx_vld(ptr1, 0); \ + return _Tpvec(_v256_combine(vlo, vhi)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { __lasx_xvst(a.val, ptr, 0); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ + { \ + if( mode == hal::STORE_UNALIGNED ) \ + __lasx_xvst(a.val, ptr, 0); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + __lasx_xvst(a.val, ptr, 0); \ + else \ + __lasx_xvst(a.val, ptr, 0); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(_v256_extract_low(a.val), ptr, 0); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(_v256_extract_high(a.val), ptr, 0); } + +OPENCV_HAL_IMPL_LASX_LOADSTORE_FLT(v_float32x8, float, __m128i) +OPENCV_HAL_IMPL_LASX_LOADSTORE_FLT(v_float64x4, double, __m128i) + + +inline __m256i _lasx_256_castps_si256(const __m256& v) +{ return __m256i(v); } + +inline __m256i _lasx_256_castpd_si256(const __m256d& v) +{ return __m256i(v); } + +#define OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, _Tpvecf, suffix, cast) \ + inline _Tpvec v_reinterpret_as_##suffix(const _Tpvecf& a) \ + { return _Tpvec(cast(a.val)); } + +#define OPENCV_HAL_IMPL_LASX_INIT(_Tpvec, _Tp, suffix, ssuffix, ctype_s) \ + inline _Tpvec v256_setzero_##suffix() \ + { return _Tpvec(__lasx_xvreplgr2vr_d(0)); } \ + inline _Tpvec v256_setall_##suffix(_Tp v) \ + { return _Tpvec(__lasx_xvreplgr2vr_##ssuffix((ctype_s)v)); } \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint8x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int8x32, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint16x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int16x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint32x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int32x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint64x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int64x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_float32x8, suffix, _lasx_256_castps_si256) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_float64x4, suffix, _lasx_256_castpd_si256) + +OPENCV_HAL_IMPL_LASX_INIT(v_uint8x32, uchar, u8, b, int) +OPENCV_HAL_IMPL_LASX_INIT(v_int8x32, schar, s8, b, int) +OPENCV_HAL_IMPL_LASX_INIT(v_uint16x16, ushort, u16, h, int) +OPENCV_HAL_IMPL_LASX_INIT(v_int16x16, short, s16, h, int) +OPENCV_HAL_IMPL_LASX_INIT(v_uint32x8, unsigned, u32, w, int) +OPENCV_HAL_IMPL_LASX_INIT(v_int32x8, int, s32, w, int) +OPENCV_HAL_IMPL_LASX_INIT(v_uint64x4, uint64, u64, d, long int) +OPENCV_HAL_IMPL_LASX_INIT(v_int64x4, int64, s64, d, long int) + + +inline __m256 _lasx_256_castsi256_ps(const __m256i &v) +{ return __m256(v); } + +inline __m256d _lasx_256_castsi256_pd(const __m256i &v) +{ return __m256d(v); } + +#define OPENCV_HAL_IMPL_LASX_INIT_FLT(_Tpvec, _Tp, suffix, zsuffix, cast) \ + inline _Tpvec v256_setzero_##suffix() \ + { return _Tpvec(__lasx_xvreplgr2vr_d(0)); } \ + inline _Tpvec v256_setall_##suffix(_Tp v) \ + { return _Tpvec(_v256_setall_##zsuffix(v)); } \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint8x32, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int8x32, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint16x16, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int16x16, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint32x8, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int32x8, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_uint64x4, suffix, cast) \ + OPENCV_HAL_IMPL_LASX_CAST(_Tpvec, v_int64x4, suffix, cast) + +OPENCV_HAL_IMPL_LASX_INIT_FLT(v_float32x8, float, f32, ps, _lasx_256_castsi256_ps) +OPENCV_HAL_IMPL_LASX_INIT_FLT(v_float64x4, double, f64, pd, _lasx_256_castsi256_pd) + +inline v_float32x8 v_reinterpret_as_f32(const v_float32x8& a) +{ return a; } +inline v_float32x8 v_reinterpret_as_f32(const v_float64x4& a) +{ return v_float32x8(_lasx_256_castps_si256(__m256(a.val))); } + +inline v_float64x4 v_reinterpret_as_f64(const v_float64x4& a) +{ return a; } +inline v_float64x4 v_reinterpret_as_f64(const v_float32x8& a) +{ return v_float64x4(_lasx_256_castpd_si256(__m256d(a.val))); } + + +//////////////// Variant Value reordering /////////////// + +// unpacks +#define OPENCV_HAL_IMPL_LASX_UNPACK(_Tpvec, suffix) \ + inline _Tpvec v256_unpacklo(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lasx_xvilvl_##suffix(__m256i(b.val), __m256i(a.val))); } \ + inline _Tpvec v256_unpackhi(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lasx_xvilvh_##suffix(__m256i(b.val), __m256i(a.val))); } + +OPENCV_HAL_IMPL_LASX_UNPACK(v_uint8x32, b) +OPENCV_HAL_IMPL_LASX_UNPACK(v_int8x32, b) +OPENCV_HAL_IMPL_LASX_UNPACK(v_uint16x16, h) +OPENCV_HAL_IMPL_LASX_UNPACK(v_int16x16, h) +OPENCV_HAL_IMPL_LASX_UNPACK(v_uint32x8, w) +OPENCV_HAL_IMPL_LASX_UNPACK(v_int32x8, w) +OPENCV_HAL_IMPL_LASX_UNPACK(v_uint64x4, d) +OPENCV_HAL_IMPL_LASX_UNPACK(v_int64x4, d) +OPENCV_HAL_IMPL_LASX_UNPACK(v_float32x8, w) +OPENCV_HAL_IMPL_LASX_UNPACK(v_float64x4, d) + + +// shuffle +// todo: emulate 64bit +#define OPENCV_HAL_IMPL_LASX_SHUFFLE(_Tpvec, intrin) \ + template \ + inline _Tpvec v256_shuffle(const _Tpvec& a) \ + { return _Tpvec(__lasx_xvshuf4i_##intrin(a.val, m)); } + +OPENCV_HAL_IMPL_LASX_SHUFFLE(v_uint32x8, w) +OPENCV_HAL_IMPL_LASX_SHUFFLE(v_int32x8, w) + +template +inline v_float32x8 v256_shuffle(const v_float32x8 &a) +{ return v_float32x8(__lasx_xvshuf4i_w(*((__m256i*)&a.val), m)); } + +template +inline v_float64x4 v256_shuffle(const v_float64x4 &a) +{ + int imm8 = m & 0b0001; //0 or 1 + if (m & 0x0b0010) imm8 |= 0b0100; + //else imm8 |= 0b0000; + if (m & 0x0b0100) imm8 |= 0b110000; //2 or 3 + else imm8 |= 0b100000; + if (m & 0x0b1000) imm8 |= 0b11000000; + else imm8 |= 0b10000000; + + return v_float64x4(__lasx_xvpermi_d(*((__m256i*)&a.val), imm8)); +} +template +inline void v256_zip(const _Tpvec& a, const _Tpvec& b, _Tpvec& ab0, _Tpvec& ab1) +{ + ab0 = v256_unpacklo(a, b); + ab1 = v256_unpackhi(a, b); +} + +template +inline _Tpvec v256_combine_diagonal(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(__lasx_xvpermi_q(a.val, b.val, 0x12)); } + +inline v_float32x8 v256_combine_diagonal(const v_float32x8& a, const v_float32x8& b) +{ return v_float32x8(__lasx_xvpermi_q(a.val, b.val, 0x12)); } + +inline v_float64x4 v256_combine_diagonal(const v_float64x4& a, const v_float64x4& b) +{ return v_float64x4(__lasx_xvpermi_q(a.val, b.val, 0x12)); } + +template +inline _Tpvec v256_alignr_128(const _Tpvec& a, const _Tpvec& b) +{ return v256_permute2x128<0x03>(a, b); } + +inline __m256i _v256_alignr_b(const __m256i &a, const __m256i &b, const int imm) +{ + if (imm == 8) { + return __lasx_xvshuf4i_d(b, a, 0x9); // b.d1 a.d0 b.d3 a.d2 + } else { + __m256i byteIndex = _v256_setr_b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + return __lasx_xvshuf_b(a, b, __lasx_xvadd_b(__lasx_xvreplgr2vr_b(imm), byteIndex)); + } +} + +template +inline _Tpvec v256_alignr_64(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(_v256_alignr_b(a.val, b.val, 8)); } +inline v_float64x4 v256_alignr_64(const v_float64x4& a, const v_float64x4& b) +{ return v_float64x4(__lasx_xvshuf4i_d(b.val, a.val, 0x9)); } // b.d1 a.d0 b.d3 a.d2 +// todo: emulate float32 + +template +inline _Tpvec v256_swap_halves(const _Tpvec& a) +{ return v256_permute2x128<1>(a, a); } + +template +inline _Tpvec v256_reverse_64(const _Tpvec& a) +{ return v256_permute4x64<0x1b>(a); } + + +// ZIP +#define OPENCV_HAL_IMPL_LASX_ZIP(_Tpvec) \ + inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ + { return v256_permute2x128<0x02>(a, b); } \ + inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ + { return v256_permute2x128<0x13>(a, b); } \ + inline void v_recombine(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ + { \ + _Tpvec a1b0 = v256_alignr_128(a, b); \ + c = v256_combine_diagonal(a, a1b0); \ + d = v256_combine_diagonal(a1b0, b); \ + } \ + inline void v_zip(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& ab0, _Tpvec& ab1) \ + { \ + _Tpvec ab0ab2, ab1ab3; \ + v256_zip(a, b, ab0ab2, ab1ab3); \ + v_recombine(ab0ab2, ab1ab3, ab0, ab1); \ + } + +OPENCV_HAL_IMPL_LASX_ZIP(v_uint8x32) +OPENCV_HAL_IMPL_LASX_ZIP(v_int8x32) +OPENCV_HAL_IMPL_LASX_ZIP(v_uint16x16) +OPENCV_HAL_IMPL_LASX_ZIP(v_int16x16) +OPENCV_HAL_IMPL_LASX_ZIP(v_uint32x8) +OPENCV_HAL_IMPL_LASX_ZIP(v_int32x8) +OPENCV_HAL_IMPL_LASX_ZIP(v_uint64x4) +OPENCV_HAL_IMPL_LASX_ZIP(v_int64x4) +OPENCV_HAL_IMPL_LASX_ZIP(v_float32x8) +OPENCV_HAL_IMPL_LASX_ZIP(v_float64x4) + +////////// Arithmetic, bitwise and comparison operations ///////// + +/** Arithmetics **/ +#define OPENCV_HAL_IMPL_LASX_BIN_OP(bin_op, _Tpvec, intrin) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { a.val = intrin(a.val, b.val); return a; } + +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_uint8x32, __lasx_xvsadd_bu) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_uint8x32, __lasx_xvssub_bu) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_int8x32, __lasx_xvsadd_b) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_int8x32, __lasx_xvssub_b) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_uint16x16, __lasx_xvsadd_hu) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_uint16x16, __lasx_xvssub_hu) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_int16x16, __lasx_xvsadd_h) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_int16x16, __lasx_xvssub_h) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_uint32x8, __lasx_xvadd_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_uint32x8, __lasx_xvsub_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(*, v_uint32x8, __lasx_xvmul_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_int32x8, __lasx_xvadd_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_int32x8, __lasx_xvsub_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(*, v_int32x8, __lasx_xvmul_w) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_uint64x4, __lasx_xvadd_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_uint64x4, __lasx_xvsub_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_int64x4, __lasx_xvadd_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_int64x4, __lasx_xvsub_d) + +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_float32x8, __lasx_xvfadd_s) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_float32x8, __lasx_xvfsub_s) +OPENCV_HAL_IMPL_LASX_BIN_OP(*, v_float32x8, __lasx_xvfmul_s) +OPENCV_HAL_IMPL_LASX_BIN_OP(/, v_float32x8, __lasx_xvfdiv_s) +OPENCV_HAL_IMPL_LASX_BIN_OP(+, v_float64x4, __lasx_xvfadd_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(-, v_float64x4, __lasx_xvfsub_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(*, v_float64x4, __lasx_xvfmul_d) +OPENCV_HAL_IMPL_LASX_BIN_OP(/, v_float64x4, __lasx_xvfdiv_d) + +// saturating multiply 8-bit, 16-bit +inline v_uint8x32 operator * (const v_uint8x32& a, const v_uint8x32& b) +{ + v_uint16x16 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_int8x32 operator * (const v_int8x32& a, const v_int8x32& b) +{ + v_int16x16 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_uint16x16 operator * (const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i pl = __lasx_xvmul_h(a.val, b.val); + __m256i ph = __lasx_xvmuh_hu(a.val, b.val); + __m256i p0 = __lasx_xvilvl_h(ph, pl); + __m256i p1 = __lasx_xvilvh_h(ph, pl); + return v_uint16x16(_v256_packs_epu32(p0, p1)); +} +inline v_int16x16 operator * (const v_int16x16& a, const v_int16x16& b) +{ + __m256i pl = __lasx_xvmul_h(a.val, b.val); + __m256i ph = __lasx_xvmuh_h(a.val, b.val); + __m256i p0 = __lasx_xvilvl_h(ph, pl); + __m256i p1 = __lasx_xvilvh_h(ph, pl); + return v_int16x16(_lasx_packs_w(p0, p1)); +} +inline v_uint8x32& operator *= (v_uint8x32& a, const v_uint8x32& b) +{ a = a * b; return a; } +inline v_int8x32& operator *= (v_int8x32& a, const v_int8x32& b) +{ a = a * b; return a; } +inline v_uint16x16& operator *= (v_uint16x16& a, const v_uint16x16& b) +{ a = a * b; return a; } +inline v_int16x16& operator *= (v_int16x16& a, const v_int16x16& b) +{ a = a * b; return a; } + +/** Non-saturating arithmetics **/ + +#define OPENCV_HAL_IMPL_LASX_BIN_FUNC(func, _Tpvec, intrin) \ + inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } + +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_add_wrap, v_uint8x32, __lasx_xvadd_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_add_wrap, v_int8x32, __lasx_xvadd_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_add_wrap, v_uint16x16, __lasx_xvadd_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_add_wrap, v_int16x16, __lasx_xvadd_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_sub_wrap, v_uint8x32, __lasx_xvsub_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_sub_wrap, v_int8x32, __lasx_xvsub_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_sub_wrap, v_uint16x16, __lasx_xvsub_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_sub_wrap, v_int16x16, __lasx_xvsub_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_mul_wrap, v_uint16x16, __lasx_xvmul_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_mul_wrap, v_int16x16, __lasx_xvmul_h) + +inline v_uint8x32 v_mul_wrap(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i p0 = __lasx_xvmulwev_h_bu(a.val, b.val); + __m256i p1 = __lasx_xvmulwod_h_bu(a.val, b.val); + return v_uint8x32(__lasx_xvpackev_b(p1, p0)); +} + +inline v_int8x32 v_mul_wrap(const v_int8x32& a, const v_int8x32& b) +{ + return v_reinterpret_as_s8(v_mul_wrap(v_reinterpret_as_u8(a), v_reinterpret_as_u8(b))); +} + +// Multiply and expand +inline void v_mul_expand(const v_uint8x32& a, const v_uint8x32& b, + v_uint16x16& c, v_uint16x16& d) +{ + v_uint16x16 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int8x32& a, const v_int8x32& b, + v_int16x16& c, v_int16x16& d) +{ + v_int16x16 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int16x16& a, const v_int16x16& b, + v_int32x8& c, v_int32x8& d) +{ + v_int16x16 vhi = v_int16x16(__lasx_xvmuh_h(a.val, b.val)); + + v_int16x16 v0, v1; + v_zip(v_mul_wrap(a, b), vhi, v0, v1); + + c = v_reinterpret_as_s32(v0); + d = v_reinterpret_as_s32(v1); +} + +inline void v_mul_expand(const v_uint16x16& a, const v_uint16x16& b, + v_uint32x8& c, v_uint32x8& d) +{ + v_uint16x16 vhi = v_uint16x16(__lasx_xvmuh_hu(a.val, b.val)); + + v_uint16x16 v0, v1; + v_zip(v_mul_wrap(a, b), vhi, v0, v1); + + c = v_reinterpret_as_u32(v0); + d = v_reinterpret_as_u32(v1); +} + +inline void v_mul_expand(const v_uint32x8& a, const v_uint32x8& b, + v_uint64x4& c, v_uint64x4& d) +{ + __m256i v0 = __lasx_xvmulwev_d_wu(a.val, b.val); + __m256i v1 = __lasx_xvmulwod_d_wu(a.val, b.val); + v_zip(v_uint64x4(v0), v_uint64x4(v1), c, d); +} + +inline v_int16x16 v_mul_hi(const v_int16x16& a, const v_int16x16& b) { return v_int16x16(__lasx_xvmuh_h(a.val, b.val)); } +inline v_uint16x16 v_mul_hi(const v_uint16x16& a, const v_uint16x16& b) { return v_uint16x16(__lasx_xvmuh_hu(a.val, b.val)); } + +/** Bitwise shifts **/ +#define OPENCV_HAL_IMPL_LASX_SHIFT_OP(_Tpuvec, _Tpsvec, suffix, srai) \ + inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ + { return _Tpuvec(__lasx_xvsll_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ + { return _Tpsvec(__lasx_xvsll_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ + { return _Tpuvec(__lasx_xvsrl_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ + { return _Tpsvec(srai(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + template \ + inline _Tpuvec v_shl(const _Tpuvec& a) \ + { return _Tpuvec(__lasx_xvsll_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + template \ + inline _Tpsvec v_shl(const _Tpsvec& a) \ + { return _Tpsvec(__lasx_xvsll_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + template \ + inline _Tpuvec v_shr(const _Tpuvec& a) \ + { return _Tpuvec(__lasx_xvsrl_##suffix(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } \ + template \ + inline _Tpsvec v_shr(const _Tpsvec& a) \ + { return _Tpsvec(srai(a.val, __lasx_xvreplgr2vr_##suffix(imm))); } + +OPENCV_HAL_IMPL_LASX_SHIFT_OP(v_uint16x16, v_int16x16, h, __lasx_xvsra_h) +OPENCV_HAL_IMPL_LASX_SHIFT_OP(v_uint32x8, v_int32x8, w, __lasx_xvsra_w) +OPENCV_HAL_IMPL_LASX_SHIFT_OP(v_uint64x4, v_int64x4, d, __lasx_xvsra_d) + + +/** Bitwise logic **/ +#define OPENCV_HAL_IMPL_LASX_LOGIC_OP(_Tpvec, suffix, not_const) \ + OPENCV_HAL_IMPL_LASX_BIN_OP(&, _Tpvec, __lasx_xvand_##suffix) \ + OPENCV_HAL_IMPL_LASX_BIN_OP(|, _Tpvec, __lasx_xvor_##suffix) \ + OPENCV_HAL_IMPL_LASX_BIN_OP(^, _Tpvec, __lasx_xvxor_##suffix) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { return _Tpvec(__lasx_xvnori_b(a.val, 0)); } + +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_uint8x32, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_int8x32, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_uint16x16, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_int16x16, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_uint32x8, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_int32x8, v, __lasx_xvreplgr2vr_w(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_uint64x4, v, __lasx_xvreplgr2vr_d(-1)) +OPENCV_HAL_IMPL_LASX_LOGIC_OP(v_int64x4, v, __lasx_xvreplgr2vr_d(-1)) + +#define OPENCV_HAL_IMPL_LASX_FLOAT_BIN_OP(bin_op, _Tpvec, intrin, cast) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(*((__m256i*)(&a.val)), *((__m256i*)(&b.val)))); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { __m256i c = intrin(*((__m256i*)(&a.val)), *((__m256i*)(&b.val))); a.val = cast(c); return a; } + +#define OPENCV_HAL_IMPL_LASX_FLOAT_LOGIC_OP(_Tpvec, suffix, not_const, cast) \ + OPENCV_HAL_IMPL_LASX_FLOAT_BIN_OP(&, _Tpvec, __lasx_xvand_##suffix, cast) \ + OPENCV_HAL_IMPL_LASX_FLOAT_BIN_OP(|, _Tpvec, __lasx_xvor_##suffix, cast) \ + OPENCV_HAL_IMPL_LASX_FLOAT_BIN_OP(^, _Tpvec, __lasx_xvxor_##suffix, cast) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { return _Tpvec(__lasx_xvxor_##suffix(*((__m256i*)(&a.val)), not_const)); } + +OPENCV_HAL_IMPL_LASX_FLOAT_LOGIC_OP(v_float32x8, v, __lasx_xvreplgr2vr_w(-1), _lasx_256_castsi256_ps) +OPENCV_HAL_IMPL_LASX_FLOAT_LOGIC_OP(v_float64x4, v, __lasx_xvreplgr2vr_d(-1), _lasx_256_castsi256_pd) + +/** Select **/ +#define OPENCV_HAL_IMPL_LASX_SELECT(_Tpvec) \ + inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lasx_xvbitsel_v(b.val, a.val, mask.val)); } + +OPENCV_HAL_IMPL_LASX_SELECT(v_uint8x32) +OPENCV_HAL_IMPL_LASX_SELECT(v_int8x32) +OPENCV_HAL_IMPL_LASX_SELECT(v_uint16x16) +OPENCV_HAL_IMPL_LASX_SELECT(v_int16x16) +OPENCV_HAL_IMPL_LASX_SELECT(v_uint32x8) +OPENCV_HAL_IMPL_LASX_SELECT(v_int32x8) + +inline v_float32x8 v_select(const v_float32x8 &mask, const v_float32x8 &a, const v_float32x8 &b) +{ return v_float32x8(__lasx_xvbitsel_v(*((__m256i*)&b.val), *((__m256i*)&a.val), *((__m256i*)&mask.val))); } + +inline v_float64x4 v_select(const v_float64x4 &mask, const v_float64x4 &a, const v_float64x4 &b) +{ return v_float64x4(__lasx_xvbitsel_v(*((__m256i*)&b.val), *((__m256i*)&a.val), *((__m256i*)&mask.val))); } + +/** Comparison **/ +#define OPENCV_HAL_IMPL_LASX_CMP_OP_OV(_Tpvec) \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a == b); } \ + inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ + { return b > a; } \ + inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a < b); } \ + inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ + { return b >= a; } + +#define OPENCV_HAL_IMPL_LASX_CMP_OP_INT(_Tpuvec, _Tpsvec, suffix, usuffix) \ + inline _Tpuvec operator == (const _Tpuvec& a, const _Tpuvec& b) \ + { return _Tpuvec(__lasx_xvseq_##suffix(a.val, b.val)); } \ + inline _Tpuvec operator > (const _Tpuvec& a, const _Tpuvec& b) \ + { \ + return _Tpuvec(__lasx_xvslt_##usuffix(b.val, a.val)); \ + } \ + inline _Tpsvec operator == (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(__lasx_xvseq_##suffix(a.val, b.val)); } \ + inline _Tpsvec operator > (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(__lasx_xvslt_##suffix(b.val, a.val)); } \ + OPENCV_HAL_IMPL_LASX_CMP_OP_OV(_Tpuvec) \ + OPENCV_HAL_IMPL_LASX_CMP_OP_OV(_Tpsvec) + +OPENCV_HAL_IMPL_LASX_CMP_OP_INT(v_uint8x32, v_int8x32, b, bu) +OPENCV_HAL_IMPL_LASX_CMP_OP_INT(v_uint16x16, v_int16x16, h, hu) +OPENCV_HAL_IMPL_LASX_CMP_OP_INT(v_uint32x8, v_int32x8, w, wu) + +#define OPENCV_HAL_IMPL_LASX_CMP_OP_64BIT(_Tpvec, suffix) \ + inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lasx_xvseq_##suffix(a.val, b.val)); } \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a == b); } + +OPENCV_HAL_IMPL_LASX_CMP_OP_64BIT(v_uint64x4, d) +OPENCV_HAL_IMPL_LASX_CMP_OP_64BIT(v_int64x4, d) + +#define OPENCV_HAL_IMPL_LASX_CMP_FLT(bin_op, suffix, _Tpvec, ssuffix) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lasx_##suffix##_##ssuffix(a.val, b.val)); } + +#define OPENCV_HAL_IMPL_LASX_CMP_OP_FLT(_Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LASX_CMP_FLT(==, xvfcmp_ceq, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LASX_CMP_FLT(!=, xvfcmp_cne, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LASX_CMP_FLT(<, xvfcmp_clt, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LASX_CMP_FLT(<=, xvfcmp_cle, _Tpvec, ssuffix) + +OPENCV_HAL_IMPL_LASX_CMP_OP_FLT(v_float32x8, s) +OPENCV_HAL_IMPL_LASX_CMP_OP_FLT(v_float64x4, d) + +inline v_float32x8 operator > (const v_float32x8 &a, const v_float32x8 &b) +{ return v_float32x8(__lasx_xvfcmp_clt_s(b.val, a.val)); } + +inline v_float32x8 operator >= (const v_float32x8 &a, const v_float32x8 &b) +{ return v_float32x8(__lasx_xvfcmp_cle_s(b.val, a.val)); } + +inline v_float64x4 operator > (const v_float64x4 &a, const v_float64x4 &b) +{ return v_float64x4(__lasx_xvfcmp_clt_d(b.val, a.val)); } + +inline v_float64x4 operator >= (const v_float64x4 &a, const v_float64x4 &b) +{ return v_float64x4(__lasx_xvfcmp_cle_d(b.val, a.val)); } + +inline v_float32x8 v_not_nan(const v_float32x8& a) +{ return v_float32x8(__lasx_xvfcmp_cor_s(a.val, a.val)); } +inline v_float64x4 v_not_nan(const v_float64x4& a) +{ return v_float64x4(__lasx_xvfcmp_cor_d(a.val, a.val)); } + +/** min/max **/ +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_uint8x32, __lasx_xvmin_bu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_uint8x32, __lasx_xvmax_bu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_int8x32, __lasx_xvmin_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_int8x32, __lasx_xvmax_b) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_uint16x16, __lasx_xvmin_hu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_uint16x16, __lasx_xvmax_hu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_int16x16, __lasx_xvmin_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_int16x16, __lasx_xvmax_h) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_uint32x8, __lasx_xvmin_wu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_uint32x8, __lasx_xvmax_wu) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_int32x8, __lasx_xvmin_w) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_int32x8, __lasx_xvmax_w) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_float32x8, __lasx_xvfmin_s) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_float32x8, __lasx_xvfmax_s) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_min, v_float64x4, __lasx_xvfmin_d) +OPENCV_HAL_IMPL_LASX_BIN_FUNC(v_max, v_float64x4, __lasx_xvfmax_d) + +/** Rotate **/ +template +inline v_uint8x32 v_rotate_left(const v_uint8x32& a, const v_uint8x32& b) +{ + enum {IMM_R = (16 - imm) & 0xFF}; + enum {IMM_R2 = (32 - imm) & 0xFF}; + + if (imm == 0) return a; + if (imm == 32) return b; + if (imm > 32) return v_uint8x32(); + + __m256i swap = _v256_permute2x128<0x21>(a.val, b.val); + if (imm == 16) return v_uint8x32(swap); + if (imm < 16) return v_uint8x32(_v256_alignr_b(a.val, swap, IMM_R)); + return v_uint8x32(_v256_alignr_b(swap, b.val, IMM_R2)); // imm < 32 +} + +template +inline v_uint8x32 v_rotate_right(const v_uint8x32& a, const v_uint8x32& b) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + + if (imm == 0) return a; + if (imm == 32) return b; + if (imm > 32) return v_uint8x32(); + + __m256i swap = _v256_permute2x128<0x03>(a.val, b.val); + if (imm == 16) return v_uint8x32(swap); + if (imm < 16) return v_uint8x32(_v256_alignr_b(swap, a.val, imm)); + return v_uint8x32(_v256_alignr_b(b.val, swap, IMM_L)); +} + +template +inline v_uint8x32 v_rotate_left(const v_uint8x32& a) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + enum {IMM_R = (16 - imm) & 0xFF}; + + if (imm == 0) return a; + if (imm > 32) return v_uint8x32(); + + // ESAC control[3] ? [127:0] = 0 + __m256i vzero = __lasx_xvreplgr2vr_w(0); + __m256i swapz = __lasx_xvpermi_q(a.val, vzero, 0x20);; + if (imm == 16) return v_uint8x32(swapz); + if (imm < 16) return v_uint8x32(_v256_alignr_b(a.val, swapz, IMM_R)); + return v_uint8x32(__lasx_xvbsll_v(swapz, IMM_L)); +} + +template +inline v_uint8x32 v_rotate_right(const v_uint8x32& a) +{ + enum {IMM_L = (imm - 16) & 0xFF}; + + if (imm == 0) return a; + if (imm > 32) return v_uint8x32(); + + // ESAC control[3] ? [127:0] = 0 + __m256i vzero = __lasx_xvreplgr2vr_w(0); + __m256i swapz = __lasx_xvpermi_q(vzero, a.val, 0x21);; + if (imm == 16) return v_uint8x32(swapz); + if (imm < 16) return v_uint8x32(_v256_alignr_b(swapz, a.val, imm)); + return v_uint8x32(__lasx_xvbsrl_v(swapz, IMM_L)); +} + +#define OPENCV_HAL_IMPL_LASX_ROTATE_CAST(intrin, _Tpvec, cast) \ + template \ + inline _Tpvec intrin(const _Tpvec& a, const _Tpvec& b) \ + { \ + enum {IMMxW = imm * sizeof(typename _Tpvec::lane_type)}; \ + v_uint8x32 ret = intrin(v_reinterpret_as_u8(a), \ + v_reinterpret_as_u8(b)); \ + return _Tpvec(cast(ret.val)); \ + } \ + template \ + inline _Tpvec intrin(const _Tpvec& a) \ + { \ + enum {IMMxW = imm * sizeof(typename _Tpvec::lane_type)}; \ + v_uint8x32 ret = intrin(v_reinterpret_as_u8(a)); \ + return _Tpvec(cast(ret.val)); \ + } + +#define OPENCV_HAL_IMPL_LASX_ROTATE(_Tpvec) \ + OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_left, _Tpvec, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_right, _Tpvec, OPENCV_HAL_NOP) + +OPENCV_HAL_IMPL_LASX_ROTATE(v_int8x32) +OPENCV_HAL_IMPL_LASX_ROTATE(v_uint16x16) +OPENCV_HAL_IMPL_LASX_ROTATE(v_int16x16) +OPENCV_HAL_IMPL_LASX_ROTATE(v_uint32x8) +OPENCV_HAL_IMPL_LASX_ROTATE(v_int32x8) +OPENCV_HAL_IMPL_LASX_ROTATE(v_uint64x4) +OPENCV_HAL_IMPL_LASX_ROTATE(v_int64x4) + +OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_left, v_float32x8, _lasx_256_castsi256_ps) +OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_right, v_float32x8, _lasx_256_castsi256_ps) +OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_left, v_float64x4, _lasx_256_castsi256_pd) +OPENCV_HAL_IMPL_LASX_ROTATE_CAST(v_rotate_right, v_float64x4, _lasx_256_castsi256_pd) + +/** Reverse **/ +inline v_uint8x32 v_reverse(const v_uint8x32 &a) +{ + static const __m256i perm = _v256_setr_b( + 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + __m256i vec = __lasx_xvshuf_b(a.val, a.val, perm); + return v_uint8x32(__lasx_xvpermi_q(vec, vec, 1)); +} + +inline v_int8x32 v_reverse(const v_int8x32 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x16 v_reverse(const v_uint16x16 &a) +{ + __m256i vec = __lasx_xvshuf4i_h(a.val, 0x1B); + vec = __lasx_xvshuf4i_w(vec, 0x4E); + return v_uint16x16(__lasx_xvpermi_d(vec, 0x4E)); +} + +inline v_int16x16 v_reverse(const v_int16x16 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x8 v_reverse(const v_uint32x8 &a) +{ + __m256i vec = __lasx_xvshuf4i_w(a.val, 0x1B); + return v_uint32x8(__lasx_xvpermi_d(vec, 0x4E)); +} + +inline v_int32x8 v_reverse(const v_int32x8 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x8 v_reverse(const v_float32x8 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x4 v_reverse(const v_uint64x4 &a) +{ + return v_uint64x4(__lasx_xvpermi_d(a.val, 0x1b)); +} + +inline v_int64x4 v_reverse(const v_int64x4 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x4 v_reverse(const v_float64x4 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +////////// Reduce and mask ///////// + +/** Reduce **/ +// this function is return a[0]+a[1]+...+a[31] +inline unsigned v_reduce_sum(const v_uint8x32& a) +{ + __m256i t1 = __lasx_xvhaddw_hu_bu(a.val, a.val); + __m256i t2 = __lasx_xvhaddw_wu_hu(t1, t1); + __m256i t3 = __lasx_xvhaddw_du_wu(t2, t2); + __m256i t4 = __lasx_xvhaddw_qu_du(t3, t3); + return (unsigned)(((v8u32)t4)[0]+((v8u32)t4)[4]); +} + +inline int v_reduce_sum(const v_int8x32& a) +{ + __m256i t1 = __lasx_xvhaddw_h_b(a.val, a.val); + __m256i t2 = __lasx_xvhaddw_w_h(t1, t1); + __m256i t3 = __lasx_xvhaddw_d_w(t2, t2); + __m256i t4 = __lasx_xvhaddw_q_d(t3, t3); + return (int)(((v8i32)t4)[0]+((v8i32)t4)[4]); +} + +#define OPENCV_HAL_IMPL_LASX_REDUCE_32(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i val = intrin(_v256_extract_low(a.val), _v256_extract_high(a.val)); \ + val = intrin(val, __lsx_vbsrl_v(val,8)); \ + val = intrin(val, __lsx_vbsrl_v(val,4)); \ + val = intrin(val, __lsx_vbsrl_v(val,2)); \ + val = intrin(val, __lsx_vbsrl_v(val,1)); \ + return (sctype)__lsx_vpickve2gr_w(val, 0); \ + } + +OPENCV_HAL_IMPL_LASX_REDUCE_32(v_uint8x32, uchar, min, __lsx_vmin_bu) +OPENCV_HAL_IMPL_LASX_REDUCE_32(v_int8x32, schar, min, __lsx_vmin_b) +OPENCV_HAL_IMPL_LASX_REDUCE_32(v_uint8x32, uchar, max, __lsx_vmax_bu) +OPENCV_HAL_IMPL_LASX_REDUCE_32(v_int8x32, schar, max, __lsx_vmax_b) + +#define OPENCV_HAL_IMPL_LASX_REDUCE_16(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i v0 = _v256_extract_low(a.val); \ + __m128i v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, __lsx_vbsrl_v(v0, 8)); \ + v0 = intrin(v0, __lsx_vbsrl_v(v0, 4)); \ + v0 = intrin(v0, __lsx_vbsrl_v(v0, 2)); \ + return (sctype) __lsx_vpickve2gr_w(v0, 0); \ + } + +OPENCV_HAL_IMPL_LASX_REDUCE_16(v_uint16x16, ushort, min, __lsx_vmin_hu) +OPENCV_HAL_IMPL_LASX_REDUCE_16(v_int16x16, short, min, __lsx_vmin_h) +OPENCV_HAL_IMPL_LASX_REDUCE_16(v_uint16x16, ushort, max, __lsx_vmax_hu) +OPENCV_HAL_IMPL_LASX_REDUCE_16(v_int16x16, short, max, __lsx_vmax_h) + +#define OPENCV_HAL_IMPL_LASX_REDUCE_8(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i v0 = _v256_extract_low(a.val); \ + __m128i v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, __lsx_vbsrl_v(v0, 8)); \ + v0 = intrin(v0, __lsx_vbsrl_v(v0, 4)); \ + return (sctype) __lsx_vpickve2gr_w(v0, 0); \ + } + +OPENCV_HAL_IMPL_LASX_REDUCE_8(v_uint32x8, unsigned, min, __lsx_vmin_wu) +OPENCV_HAL_IMPL_LASX_REDUCE_8(v_int32x8, int, min, __lsx_vmin_w) +OPENCV_HAL_IMPL_LASX_REDUCE_8(v_uint32x8, unsigned, max, __lsx_vmax_wu) +OPENCV_HAL_IMPL_LASX_REDUCE_8(v_int32x8, int, max, __lsx_vmax_w) + +#define OPENCV_HAL_IMPL_LASX_REDUCE_FLT(func, intrin) \ + inline float v_reduce_##func(const v_float32x8& a) \ + { \ + __m128 v0 = _v256_extract_low(a.val); \ + __m128 v1 = _v256_extract_high(a.val); \ + v0 = intrin(v0, v1); \ + v0 = intrin(v0, __m128(__lsx_vpermi_w(*((__m128i*)&v0), *((__m128i*)&v0), 0x0e))); \ + v0 = intrin(v0, __m128(__lsx_vpermi_w(*((__m128i*)&v0), *((__m128i*)&v0), 0x01))); \ + float *fvalue = (float*)&v0; \ + return fvalue[0]; \ + } + +OPENCV_HAL_IMPL_LASX_REDUCE_FLT(min, __lsx_vfmin_s) +OPENCV_HAL_IMPL_LASX_REDUCE_FLT(max, __lsx_vfmax_s) + +inline int v_reduce_sum(const v_int32x8& a) +{ + __m256i t1 = __lasx_xvhaddw_d_w(a.val, a.val); + __m256i t2 = __lasx_xvhaddw_q_d(t1, t1); + return (int)(((v8i32)t2)[0]+((v8i32)t2)[4]); +} + +inline unsigned v_reduce_sum(const v_uint32x8& a) +{ return v_reduce_sum(v_reinterpret_as_s32(a)); } + +inline int v_reduce_sum(const v_int16x16& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } +inline unsigned v_reduce_sum(const v_uint16x16& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } + +inline float v_reduce_sum(const v_float32x8& a) +{ + float result = 0; + float *pa = (float*)&a; + for (int i = 0; i < 2; ++i) { + result += pa[i*4] + pa[i*4+1] + pa[i*4+2] + pa[i*4+3]; + } + return result; +} + +inline uint64 v_reduce_sum(const v_uint64x4& a) +{ + __m256i t0 = __lasx_xvhaddw_qu_du(a.val, a.val); + return (uint64)(((v4u64)t0)[0] + ((v4u64)t0)[2]); +} +inline int64 v_reduce_sum(const v_int64x4& a) +{ + __m256i t0 = __lasx_xvhaddw_q_d(a.val, a.val); + return (int64)(((v4i64)t0)[0] + ((v4i64)t0)[2]); +} +inline double v_reduce_sum(const v_float64x4& a) +{ + double *pa = (double*)&a; + return pa[0] + pa[1] + pa[2] + pa[3]; +} + +inline v_float32x8 v_reduce_sum4(const v_float32x8& a, const v_float32x8& b, + const v_float32x8& c, const v_float32x8& d) +{ + float *pa = (float*)&a; + float *pb = (float*)&b; + float *pc = (float*)&c; + float *pd = (float*)&d; + + float v0 = pa[0] + pa[1] + pa[2] + pa[3]; + float v1 = pb[0] + pb[1] + pb[2] + pb[3]; + float v2 = pc[0] + pc[1] + pc[2] + pc[3]; + float v3 = pd[0] + pd[1] + pd[2] + pd[3]; + float v4 = pa[4] + pa[5] + pa[6] + pa[7]; + float v5 = pb[4] + pb[5] + pb[6] + pb[7]; + float v6 = pc[4] + pc[5] + pc[6] + pc[7]; + float v7 = pd[4] + pd[5] + pd[6] + pd[7]; + return v_float32x8(v0, v1, v2, v3, v4, v5, v6, v7); +} + +inline unsigned v_reduce_sad(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i t0 = __lasx_xvabsd_bu(a.val, b.val); + __m256i t1 = __lasx_xvhaddw_hu_bu(t0, t0); + __m256i t2 = __lasx_xvhaddw_wu_hu(t1, t1); + __m256i t3 = __lasx_xvhaddw_du_wu(t2, t2); + __m256i t4 = __lasx_xvhaddw_qu_du(t3, t3); + return (unsigned)(((v8u32)t4)[0]+((v8u32)t4)[4]); +} +inline unsigned v_reduce_sad(const v_int8x32& a, const v_int8x32& b) +{ + __m256i t0 = __lasx_xvabsd_b(a.val, b.val); + __m256i t1 = __lasx_xvhaddw_hu_bu(t0, t0); + __m256i t2 = __lasx_xvhaddw_wu_hu(t1, t1); + __m256i t3 = __lasx_xvhaddw_du_wu(t2, t2); + __m256i t4 = __lasx_xvhaddw_qu_du(t3, t3); + return (unsigned)(((v8u32)t4)[0]+((v8u32)t4)[4]); +} +inline unsigned v_reduce_sad(const v_uint16x16& a, const v_uint16x16& b) +{ + v_uint32x8 l, h; + v_expand(v_add_wrap(a - b, b - a), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_int16x16& a, const v_int16x16& b) +{ + v_uint32x8 l, h; + v_expand(v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_uint32x8& a, const v_uint32x8& b) +{ + return v_reduce_sum(v_max(a, b) - v_min(a, b)); +} +inline unsigned v_reduce_sad(const v_int32x8& a, const v_int32x8& b) +{ + v_int32x8 m = a < b; + return v_reduce_sum(v_reinterpret_as_u32(((a - b) ^ m) - m)); +} +inline float v_reduce_sad(const v_float32x8& a, const v_float32x8& b) +{ + v_float32x8 a_b = a - b; + return v_reduce_sum(v_float32x8(*((__m256i*)&a_b.val) & __lasx_xvreplgr2vr_w(0x7fffffff))); +} + +/** Popcount **/ +inline v_uint8x32 v_popcount(const v_uint8x32& a) +{ return v_uint8x32(__lasx_xvpcnt_b(a.val)); } +inline v_uint16x16 v_popcount(const v_uint16x16& a) +{ return v_uint16x16(__lasx_xvpcnt_h(a.val)); } +inline v_uint32x8 v_popcount(const v_uint32x8& a) +{ return v_uint32x8(__lasx_xvpcnt_w(a.val)); } +inline v_uint64x4 v_popcount(const v_uint64x4& a) +{ return v_uint64x4(__lasx_xvpcnt_d(a.val)); } +inline v_uint8x32 v_popcount(const v_int8x32& a) +{ return v_popcount(v_reinterpret_as_u8(a)); } +inline v_uint16x16 v_popcount(const v_int16x16& a) +{ return v_popcount(v_reinterpret_as_u16(a)); } +inline v_uint32x8 v_popcount(const v_int32x8& a) +{ return v_popcount(v_reinterpret_as_u32(a)); } +inline v_uint64x4 v_popcount(const v_int64x4& a) +{ return v_popcount(v_reinterpret_as_u64(a)); } + +/** Mask **/ +#define OPENCV_HAL_IMPL_REINTERPRET_INT(ft, tt) \ +inline tt reinterpret_int(ft x) { union { ft l; tt i; } v; v.l = x; return v.i; } +OPENCV_HAL_IMPL_REINTERPRET_INT(uchar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(schar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(ushort, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(short, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(unsigned, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(int, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(float, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(uint64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(int64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(double, int64) + +inline int v_signmask(const v_int8x32& a) +{ + __m256i result = __lasx_xvmskltz_b(a.val); + int mask = __lasx_xvpickve2gr_w(result, 0); + mask |= (__lasx_xvpickve2gr_w(result, 4) << 16); + return mask; +} +inline int v_signmask(const v_uint8x32& a) +{ return v_signmask(v_reinterpret_as_s8(a)); } + +inline int v_signmask(const v_int16x16& a) +{ return v_signmask(v_pack(a, a)) & 0xFFFF; } +inline int v_signmask(const v_uint16x16& a) +{ return v_signmask(v_reinterpret_as_s16(a)); } + +inline int v_signmask(const v_int32x8& a) +{ + __m256i result = __lasx_xvmskltz_w(a.val); + int mask = __lasx_xvpickve2gr_w(result, 0); + mask |= (__lasx_xvpickve2gr_w(result, 4) << 4); + return mask; +} +inline int v_signmask(const v_uint32x8& a) +{ return v_signmask(*(v_int32x8*)(&a)); } + +inline int v_signmask(const v_int64x4& a) +{ + __m256i result = __lasx_xvmskltz_d(a.val); + int mask = __lasx_xvpickve2gr_d(result, 0); + mask |= (__lasx_xvpickve2gr_w(result, 4) << 2); + return mask; +} +inline int v_signmask(const v_uint64x4& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } + +inline int v_signmask(const v_float32x8& a) +{ return v_signmask(*(v_int32x8*)(&a)); } + +inline int v_signmask(const v_float64x4& a) +{ return v_signmask(*(v_int64x4*)(&a)); } + +inline int v_scan_forward(const v_int8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_uint8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_int16x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_uint16x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_int32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_uint32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_float32x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_int64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_uint64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_float64x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } + +/** Checks **/ +#define OPENCV_HAL_IMPL_LASX_CHECK(_Tpvec, allmask) \ + inline bool v_check_all(const _Tpvec& a) { return v_signmask(a) == allmask; } \ + inline bool v_check_any(const _Tpvec& a) { return v_signmask(a) != 0; } +OPENCV_HAL_IMPL_LASX_CHECK(v_uint8x32, -1) +OPENCV_HAL_IMPL_LASX_CHECK(v_int8x32, -1) +OPENCV_HAL_IMPL_LASX_CHECK(v_uint32x8, 255) +OPENCV_HAL_IMPL_LASX_CHECK(v_int32x8, 255) +OPENCV_HAL_IMPL_LASX_CHECK(v_uint64x4, 15) +OPENCV_HAL_IMPL_LASX_CHECK(v_int64x4, 15) +OPENCV_HAL_IMPL_LASX_CHECK(v_float32x8, 255) +OPENCV_HAL_IMPL_LASX_CHECK(v_float64x4, 15) + +#define OPENCV_HAL_IMPL_LASX_CHECK_SHORT(_Tpvec) \ + inline bool v_check_all(const _Tpvec& a) { return (v_signmask(v_reinterpret_as_s8(a)) & 0xaaaaaaaa) == 0xaaaaaaaa; } \ + inline bool v_check_any(const _Tpvec& a) { return (v_signmask(v_reinterpret_as_s8(a)) & 0xaaaaaaaa) != 0; } +OPENCV_HAL_IMPL_LASX_CHECK_SHORT(v_uint16x16) +OPENCV_HAL_IMPL_LASX_CHECK_SHORT(v_int16x16) + +////////// Other math ///////// + +/** Some frequent operations **/ +#define OPENCV_HAL_IMPL_LASX_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(__lasx_xvfmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(__lasx_xvfmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_sqrt(const _Tpvec& x) \ + { return _Tpvec(__lasx_xvfsqrt_##suffix(x.val)); } \ + inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_fma(a, a, b * b); } \ + inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_sqrt(v_fma(a, a, b*b)); } + +OPENCV_HAL_IMPL_LASX_MULADD(v_float32x8, s) +OPENCV_HAL_IMPL_LASX_MULADD(v_float64x4, d) + +inline v_int32x8 v_fma(const v_int32x8& a, const v_int32x8& b, const v_int32x8& c) +{ + return v_int32x8(__lasx_xvmadd_w(c.val, a.val, b.val)); +} + +inline v_int32x8 v_muladd(const v_int32x8& a, const v_int32x8& b, const v_int32x8& c) +{ + return v_fma(a, b, c); +} + +inline v_float32x8 v_invsqrt(const v_float32x8& x) +{ return v_float32x8(__lasx_xvfrsqrt_s(x.val)); } + +inline v_float64x4 v_invsqrt(const v_float64x4& x) +{ return v_float64x4(__lasx_xvfrsqrt_d(x.val)); } + +/** Absolute values **/ +#define OPENCV_HAL_IMPL_LASX_ABS(_Tpvec, suffix) \ + inline v_u##_Tpvec v_abs(const v_##_Tpvec& x) \ + { return v_u##_Tpvec(__lasx_xvabsd_##suffix(x.val, __lasx_xvreplgr2vr_w(0))); } + +OPENCV_HAL_IMPL_LASX_ABS(int8x32, b) +OPENCV_HAL_IMPL_LASX_ABS(int16x16, h) +OPENCV_HAL_IMPL_LASX_ABS(int32x8, w) + +inline v_float32x8 v_abs(const v_float32x8& x) +{ return v_float32x8(*((__m256i*)&x) & __lasx_xvreplgr2vr_w(0x7fffffff)); } +inline v_float64x4 v_abs(const v_float64x4& x) +{ return v_float64x4(*((__m256i*)&x) & __lasx_xvreplgr2vr_d(0x7fffffffffffffff)); } + +/** Absolute difference **/ +inline v_uint8x32 v_absdiff(const v_uint8x32& a, const v_uint8x32& b) +{ return (v_uint8x32)__lasx_xvabsd_bu(a.val, b.val); } +inline v_uint16x16 v_absdiff(const v_uint16x16& a, const v_uint16x16& b) +{ return (v_uint16x16)__lasx_xvabsd_hu(a.val, b.val); } +inline v_uint32x8 v_absdiff(const v_uint32x8& a, const v_uint32x8& b) +{ return (v_uint32x8)__lasx_xvabsd_wu(a.val, b.val); } + +inline v_uint8x32 v_absdiff(const v_int8x32& a, const v_int8x32& b) +{ return (v_uint8x32)__lasx_xvabsd_b(a.val, b.val); } +inline v_uint16x16 v_absdiff(const v_int16x16& a, const v_int16x16& b) +{ return (v_uint16x16)__lasx_xvabsd_h(a.val, b.val); } +inline v_uint32x8 v_absdiff(const v_int32x8& a, const v_int32x8& b) +{ return (v_uint32x8)__lasx_xvabsd_w(a.val, b.val); } + +inline v_float32x8 v_absdiff(const v_float32x8& a, const v_float32x8& b) +{ return v_abs(a - b); } + +inline v_float64x4 v_absdiff(const v_float64x4& a, const v_float64x4& b) +{ return v_abs(a - b); } + +/** Saturating absolute difference **/ +inline v_int8x32 v_absdiffs(const v_int8x32& a, const v_int8x32& b) +{ + v_int8x32 d = a - b; + v_int8x32 m = a < b; + return (d ^ m) - m; +} +inline v_int16x16 v_absdiffs(const v_int16x16& a, const v_int16x16& b) +{ return v_max(a, b) - v_min(a, b); } + +////////// Conversions ///////// + +/** Rounding **/ +inline v_int32x8 v_round(const v_float32x8& a) +{ return v_int32x8(__lasx_xvftint_w_s(a.val)); } + +inline v_int32x8 v_round(const v_float64x4& a) +{ __m256i t = __lasx_xvftint_w_d(a.val, a.val); + return v_int32x8(__lasx_xvpermi_d(t, 0x88)); } + +inline v_int32x8 v_round(const v_float64x4& a, const v_float64x4& b) +{ + __m256i abi = __lasx_xvftint_w_d(b.val, a.val); + return v_int32x8(__lasx_xvpermi_d(abi, 0b11011000)); //3120 +} + +inline v_int32x8 v_trunc(const v_float32x8& a) +{ return v_int32x8(__lasx_xvftintrz_w_s(a.val)); } + +inline v_int32x8 v_trunc(const v_float64x4& a) +{ __m256i t = __lasx_xvftintrz_w_d(a.val, a.val); + return v_int32x8(__lasx_xvpermi_d(t, 0x88)); } + +inline v_int32x8 v_floor(const v_float32x8& a) +{ return v_int32x8(__lasx_xvftintrz_w_s(__m256(__lasx_xvfrintrm_s(a.val)))); } + +inline v_int32x8 v_floor(const v_float64x4& a) +{ return v_trunc(v_float64x4(__lasx_xvfrintrm_d(a.val))); } + +inline v_int32x8 v_ceil(const v_float32x8& a) +{ return v_int32x8(__lasx_xvftintrz_w_s(__m256(__lasx_xvfrintrp_s(a.val)))); } + +inline v_int32x8 v_ceil(const v_float64x4& a) +{ return v_trunc(v_float64x4(__lasx_xvfrintrp_d(a.val))); } + +/** To float **/ +inline v_float32x8 v_cvt_f32(const v_int32x8& a) +{ return v_float32x8(__lasx_xvffint_s_w(a.val)); } + +inline v_float32x8 v_cvt_f32(const v_float64x4& a) +{ return v_float32x8(__lasx_xvpermi_d(__lasx_xvfcvt_s_d(a.val, a.val), 0x88)); } + +inline v_float32x8 v_cvt_f32(const v_float64x4& a, const v_float64x4& b) +{ + __m256 abf = __lasx_xvfcvt_s_d(a.val, b.val); //warnning: order of a,b is diff from instruction xvfcvt.s.d + return v_float32x8(__lasx_xvpermi_d(abf, 0x8D)); +} + +inline v_float64x4 v_cvt_f64(const v_int32x8& a) +{ + __m256i alow = __lasx_xvpermi_d(a.val, 0x10); + return v_float64x4(__lasx_xvffintl_d_w(alow)); +} + +inline v_float64x4 v_cvt_f64_high(const v_int32x8& a) +{ + __m256i ahigh = __lasx_xvpermi_d(a.val, 0x32); + return v_float64x4(__lasx_xvffintl_d_w(ahigh)); +} + +inline v_float64x4 v_cvt_f64(const v_float32x8& a) +{ + __m256i alow = __lasx_xvpermi_d(a.val, 0x10); + return v_float64x4(__lasx_xvfcvtl_d_s((__m256)alow)); +} + +inline v_float64x4 v_cvt_f64_high(const v_float32x8& a) +{ + __m256i ahigh = __lasx_xvpermi_d(a.val, 0x32); + return v_float64x4(__lasx_xvfcvtl_d_s((__m256)ahigh)); +} + +inline v_float64x4 v_cvt_f64(const v_int64x4& v) +{ return v_float64x4(__lasx_xvffint_d_l(v.val)); } + +////////////// Lookup table access //////////////////// + +inline v_int8x32 v256_lut(const schar* tab, const int* idx) +{ + return v_int8x32(_v256_setr_b(tab[idx[ 0]], tab[idx[ 1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], + tab[idx[ 6]], tab[idx[ 7]], tab[idx[ 8]], tab[idx[ 9]], tab[idx[10]], tab[idx[11]], + tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]], tab[idx[16]], tab[idx[17]], + tab[idx[18]], tab[idx[19]], tab[idx[20]], tab[idx[21]], tab[idx[22]], tab[idx[23]], + tab[idx[24]], tab[idx[25]], tab[idx[26]], tab[idx[27]], tab[idx[28]], tab[idx[29]], + tab[idx[30]], tab[idx[31]])); +} +inline v_int8x32 v256_lut_pairs(const schar* tab, const int* idx) +{ + return v_int8x32(_v256_setr_h(*(const short*)(tab + idx[ 0]), *(const short*)(tab + idx[ 1]), *(const short*)(tab + idx[ 2]), + *(const short*)(tab + idx[ 3]), *(const short*)(tab + idx[ 4]), *(const short*)(tab + idx[ 5]), + *(const short*)(tab + idx[ 6]), *(const short*)(tab + idx[ 7]), *(const short*)(tab + idx[ 8]), + *(const short*)(tab + idx[ 9]), *(const short*)(tab + idx[10]), *(const short*)(tab + idx[11]), + *(const short*)(tab + idx[12]), *(const short*)(tab + idx[13]), *(const short*)(tab + idx[14]), + *(const short*)(tab + idx[15]))); +} +inline v_int8x32 v256_lut_quads(const schar* tab, const int* idx) +{ + return v_int8x32(_v256_setr_w(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]), + *(const int*)(tab + idx[4]), *(const int*)(tab + idx[5]), + *(const int*)(tab + idx[6]), *(const int*)(tab + idx[7]))); +} +inline v_uint8x32 v256_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut((const schar *)tab, idx)); } +inline v_uint8x32 v256_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut_pairs((const schar *)tab, idx)); } +inline v_uint8x32 v256_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v256_lut_quads((const schar *)tab, idx)); } + +inline v_int16x16 v256_lut(const short* tab, const int* idx) +{ + return v_int16x16(_v256_setr_h(tab[idx[ 0]], tab[idx[ 1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], + tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]], tab[idx[ 8]], tab[idx[ 9]], + tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], + tab[idx[15]])); +} +inline v_int16x16 v256_lut_pairs(const short* tab, const int* idx) +{ + return v_int16x16(_v256_setr_w(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]), + *(const int*)(tab + idx[4]), *(const int*)(tab + idx[5]), + *(const int*)(tab + idx[6]), *(const int*)(tab + idx[7]) )); +} +inline v_int16x16 v256_lut_quads(const short* tab, const int* idx) +{ + return v_int16x16(_v256_setr_d(*(const long long int*)(tab + idx[0]), *(const long long int*)(tab + idx[1]), + *(const long long int*)(tab + idx[2]), *(const long long int*)(tab + idx[3]) )); + +} +inline v_uint16x16 v256_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut((const short *)tab, idx)); } +inline v_uint16x16 v256_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut_pairs((const short *)tab, idx)); } +inline v_uint16x16 v256_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v256_lut_quads((const short *)tab, idx)); } + +inline v_int32x8 v256_lut(const int* tab, const int* idx) +{ + return v_int32x8(_v256_setr_w(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]), + *(const int*)(tab + idx[4]), *(const int*)(tab + idx[5]), + *(const int*)(tab + idx[6]), *(const int*)(tab + idx[7]) )); +} +inline v_int32x8 v256_lut_pairs(const int* tab, const int* idx) +{ + return v_int32x8(_v256_setr_d(*(const long long int*)(tab + idx[0]), *(const long long int*)(tab + idx[1]), + *(const long long int*)(tab + idx[2]), *(const long long int*)(tab + idx[3]) )); +} +inline v_int32x8 v256_lut_quads(const int* tab, const int* idx) +{ + return v_int32x8(_v256_combine(__lsx_vld(tab + idx[0], 0), __lsx_vld(tab + idx[1], 0))); +} +inline v_uint32x8 v256_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut((const int *)tab, idx)); } +inline v_uint32x8 v256_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut_pairs((const int *)tab, idx)); } +inline v_uint32x8 v256_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v256_lut_quads((const int *)tab, idx)); } + +inline v_int64x4 v256_lut(const int64* tab, const int* idx) +{ + return v_int64x4(_v256_setr_d(*(const long long int*)(tab + idx[0]), *(const long long int*)(tab + idx[1]), + *(const long long int*)(tab + idx[2]), *(const long long int*)(tab + idx[3]) )); +} +inline v_int64x4 v256_lut_pairs(const int64* tab, const int* idx) +{ + return v_int64x4(_v256_combine(__lsx_vld(tab + idx[0], 0), __lsx_vld(tab + idx[1], 0))); +} +inline v_uint64x4 v256_lut(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v256_lut((const int64 *)tab, idx)); } +inline v_uint64x4 v256_lut_pairs(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v256_lut_pairs((const int64 *)tab, idx)); } + +inline v_float32x8 v256_lut(const float* tab, const int* idx) +{ + return v_float32x8(_v256_setr_ps(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], + tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]])); +} +inline v_float32x8 v256_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v256_lut_pairs((const int *)tab, idx)); } +inline v_float32x8 v256_lut_quads(const float* tab, const int* idx) { return v_reinterpret_as_f32(v256_lut_quads((const int *)tab, idx)); } + +inline v_float64x4 v256_lut(const double* tab, const int* idx) +{ + return v_float64x4(_v256_setr_pd(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} +inline v_float64x4 v256_lut_pairs(const double* tab, const int* idx) +{ return v_float64x4(_v256_combine(__lsx_vld(tab + idx[0], 0), __lsx_vld(tab + idx[1], 0))); } + +inline v_int32x8 v_lut(const int* tab, const v_int32x8& idxvec) +{ + int *idx = (int*)&idxvec.val; + return v256_lut(tab, idx); +} + +inline v_uint32x8 v_lut(const unsigned* tab, const v_int32x8& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x8 v_lut(const float* tab, const v_int32x8& idxvec) +{ + const int *idx = (const int*)&idxvec.val; + return v256_lut(tab, idx); +} + +inline v_float64x4 v_lut(const double* tab, const v_int32x8& idxvec) +{ + const int *idx = (const int*)&idxvec.val; + return v256_lut(tab, idx); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x8& idxvec, v_float32x8& x, v_float32x8& y) +{ + const int *idx = (const int*)&idxvec.val; + __m128i xy01, xy45, xy23, xy67; + xy01 = __lsx_vld(tab + idx[0], 0); + xy01 = __lsx_vextrins_d(xy01, __lsx_vld(tab + idx[1], 0), 0x10); + xy45 = __lsx_vld(tab + idx[4], 0); + xy45 = __lsx_vextrins_d(xy45, __lsx_vld(tab + idx[5], 0), 0x10); + __m256i xy0145 = _v256_combine(xy01, xy45); + xy23 = __lsx_vld(tab + idx[2], 0); + xy23 = __lsx_vextrins_d(xy23, __lsx_vld(tab + idx[3], 0), 0x10); + xy67 = __lsx_vld(tab + idx[6], 0); + xy67 = __lsx_vextrins_d(xy67, __lsx_vld(tab + idx[7], 0), 0x10); + __m256i xy2367 = _v256_combine(xy23, xy67); + + __m256i xxyy0145 = __lasx_xvilvl_w(xy2367, xy0145); + __m256i xxyy2367 = __lasx_xvilvh_w(xy2367, xy0145); + + x = v_float32x8(__lasx_xvilvl_w(xxyy2367, xxyy0145)); + y = v_float32x8(__lasx_xvilvh_w(xxyy2367, xxyy0145)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x8& idxvec, v_float64x4& x, v_float64x4& y) +{ + //int CV_DECL_ALIGNED(32) idx[4]; + const int *idx = (const int*)&idxvec.val; + __m128i xy0 = __lsx_vld(tab + idx[0], 0); + __m128i xy2 = __lsx_vld(tab + idx[2], 0); + __m128i xy1 = __lsx_vld(tab + idx[1], 0); + __m128i xy3 = __lsx_vld(tab + idx[3], 0); + __m256i xy02 = _v256_combine(xy0, xy2); + __m256i xy13 = _v256_combine(xy1, xy3); + + x = v_float64x4(__lasx_xvilvl_d(xy13, xy02)); + y = v_float64x4(__lasx_xvilvh_d(xy13, xy02)); +} + +inline v_int8x32 v_interleave_pairs(const v_int8x32& vec) +{ + return v_int8x32(__lasx_xvshuf_b(vec.val, vec.val, + _v256_set_d(0x0f0d0e0c0b090a08, 0x0705060403010200, 0x0f0d0e0c0b090a08, 0x0705060403010200))); +} +inline v_uint8x32 v_interleave_pairs(const v_uint8x32& vec) +{ return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x32 v_interleave_quads(const v_int8x32& vec) +{ + return v_int8x32(__lasx_xvshuf_b(vec.val, vec.val, + _v256_set_d(0x0f0b0e0a0d090c08, 0x0703060205010400, 0x0f0b0e0a0d090c08, 0x0703060205010400))); +} +inline v_uint8x32 v_interleave_quads(const v_uint8x32& vec) +{ return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x16 v_interleave_pairs(const v_int16x16& vec) +{ + return v_int16x16(__lasx_xvshuf_b(vec.val, vec.val, + _v256_set_d(0x0f0e0b0a0d0c0908, 0x0706030205040100, 0x0f0e0b0a0d0c0908, 0x0706030205040100))); +} +inline v_uint16x16 v_interleave_pairs(const v_uint16x16& vec) +{ return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x16 v_interleave_quads(const v_int16x16& vec) +{ + return v_int16x16(__lasx_xvshuf_b(vec.val, vec.val, + _v256_set_d(0x0f0e07060d0c0504, 0x0b0a030209080100, 0x0f0e07060d0c0504, 0x0b0a030209080100))); +} +inline v_uint16x16 v_interleave_quads(const v_uint16x16& vec) +{ return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x8 v_interleave_pairs(const v_int32x8& vec) +{ + return v_int32x8(__lasx_xvshuf4i_w(vec.val, 0xd8)); +} +inline v_uint32x8 v_interleave_pairs(const v_uint32x8& vec) +{ return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x8 v_interleave_pairs(const v_float32x8& vec) +{ return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x32 v_pack_triplets(const v_int8x32& vec) +{ + __m256i vzero = __lasx_xvreplgr2vr_w(0); + __m256i t1 = __lasx_xvshuf_b(vzero, vec.val, + _v256_set_d(0x1211100f0e0d0c0a, 0x0908060504020100, 0x1211100f0e0d0c0a, 0x0908060504020100)); + return v_int8x32(__lasx_xvperm_w(t1, + _v256_set_d(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint8x32 v_pack_triplets(const v_uint8x32& vec) +{ return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x16 v_pack_triplets(const v_int16x16& vec) +{ + __m256i vzero = __lasx_xvreplgr2vr_w(0); + __m256i t1 = __lasx_xvshuf_b(vzero, vec.val, + _v256_set_d(0x11100f0e0d0c0b0a, 0x0908050403020100, 0x11100f0e0d0c0b0a, 0x0908050403020100)); + return v_int16x16(__lasx_xvperm_w(t1, + _v256_set_d(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint16x16 v_pack_triplets(const v_uint16x16& vec) +{ return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x8 v_pack_triplets(const v_int32x8& vec) +{ + return v_int32x8(__lasx_xvperm_w(vec.val, + _v256_set_d(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} +inline v_uint32x8 v_pack_triplets(const v_uint32x8& vec) +{ return v_reinterpret_as_u32(v_pack_triplets(v_reinterpret_as_s32(vec))); } +inline v_float32x8 v_pack_triplets(const v_float32x8& vec) +{ + return v_float32x8(__lasx_xvperm_w(*(__m256i*)(&vec.val), + _v256_set_d(0x0000000700000007, 0x0000000600000005, 0x0000000400000002, 0x0000000100000000))); +} + +////////// Matrix operations ///////// + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x8 v_dotprod(const v_int16x16& a, const v_int16x16& b) +{ return v_int32x8(__lasx_xvadd_w(__lasx_xvmulwev_w_h(a.val, b.val), __lasx_xvmulwod_w_h(a.val, b.val))); } + +inline v_int32x8 v_dotprod(const v_int16x16& a, const v_int16x16& b, const v_int32x8& c) +{ return v_dotprod(a, b) + c; } + +// 32 >> 64 +inline v_int64x4 v_dotprod(const v_int32x8& a, const v_int32x8& b) +{ + __m256i even = __lasx_xvmulwev_d_w(a.val, b.val); + return v_int64x4(__lasx_xvmaddwod_d_w(even, a.val, b.val)); +} +inline v_int64x4 v_dotprod(const v_int32x8& a, const v_int32x8& b, const v_int64x4& c) +{ + __m256i even = __lasx_xvmaddwev_d_w(c.val, a.val, b.val); + return v_int64x4(__lasx_xvmaddwod_d_w(even, a.val, b.val)); +} + +// 8 >> 32 +inline v_uint32x8 v_dotprod_expand(const v_uint8x32& a, const v_uint8x32& b) +{ + __m256i even = __lasx_xvmulwev_h_bu(a.val, b.val); + __m256i odd = __lasx_xvmulwod_h_bu(a.val, b.val); + __m256i prod0 = __lasx_xvhaddw_wu_hu(even, even); + __m256i prod1 = __lasx_xvhaddw_wu_hu(odd, odd); + return v_uint32x8(__lasx_xvadd_w(prod0, prod1)); +} +inline v_uint32x8 v_dotprod_expand(const v_uint8x32& a, const v_uint8x32& b, const v_uint32x8& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int32x8 v_dotprod_expand(const v_int8x32& a, const v_int8x32& b) +{ + __m256i even = __lasx_xvmulwev_h_b(a.val, b.val); + __m256i odd = __lasx_xvmulwod_h_b(a.val, b.val); + __m256i prod0 = __lasx_xvhaddw_w_h(even, even); + __m256i prod1 = __lasx_xvhaddw_w_h(odd, odd); + return v_int32x8(__lasx_xvadd_w(prod0, prod1)); +} +inline v_int32x8 v_dotprod_expand(const v_int8x32& a, const v_int8x32& b, const v_int32x8& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x4 v_dotprod_expand(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i even = __lasx_xvmulwev_w_hu(a.val, b.val); + __m256i odd = __lasx_xvmulwod_w_hu(a.val, b.val); + __m256i prod0 = __lasx_xvhaddw_du_wu(even, even); + __m256i prod1 = __lasx_xvhaddw_du_wu(odd, odd); + return v_uint64x4(__lasx_xvadd_d(prod0, prod1)); +} +inline v_uint64x4 v_dotprod_expand(const v_uint16x16& a, const v_uint16x16& b, const v_uint64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x4 v_dotprod_expand(const v_int16x16& a, const v_int16x16& b) +{ + __m256i even = __lasx_xvmulwev_w_h(a.val, b.val); + __m256i odd = __lasx_xvmulwod_w_h(a.val, b.val); + __m256i prod0 = __lasx_xvhaddw_d_w(even, even); + __m256i prod1 = __lasx_xvhaddw_d_w(odd, odd); + return v_int64x4(__lasx_xvadd_d(prod0, prod1)); +} + +inline v_int64x4 v_dotprod_expand(const v_int16x16& a, const v_int16x16& b, const v_int64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x4 v_dotprod_expand(const v_int32x8& a, const v_int32x8& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x4 v_dotprod_expand(const v_int32x8& a, const v_int32x8& b, const v_float64x4& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x8 v_dotprod_fast(const v_int16x16& a, const v_int16x16& b) +{ return v_dotprod(a, b); } +inline v_int32x8 v_dotprod_fast(const v_int16x16& a, const v_int16x16& b, const v_int32x8& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x4 v_dotprod_fast(const v_int32x8& a, const v_int32x8& b) +{ return v_dotprod(a, b); } +inline v_int64x4 v_dotprod_fast(const v_int32x8& a, const v_int32x8& b, const v_int64x4& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x8 v_dotprod_expand_fast(const v_uint8x32& a, const v_uint8x32& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x8 v_dotprod_expand_fast(const v_uint8x32& a, const v_uint8x32& b, const v_uint32x8& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_int32x8 v_dotprod_expand_fast(const v_int8x32& a, const v_int8x32& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x8 v_dotprod_expand_fast(const v_int8x32& a, const v_int8x32& b, const v_int32x8& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x4 v_dotprod_expand_fast(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i even = __lasx_xvmulwev_w_hu(a.val, b.val); + __m256i odd = __lasx_xvmulwod_w_hu(a.val, b.val); + __m256i prod0 = __lasx_xvhaddw_du_wu(even, even); + __m256i prod1 = __lasx_xvhaddw_du_wu(odd, odd); + return v_uint64x4(__lasx_xvadd_d(__lasx_xvilvl_d(prod1, prod0), __lasx_xvilvh_d(prod1, prod0))); +} +inline v_uint64x4 v_dotprod_expand_fast(const v_uint16x16& a, const v_uint16x16& b, const v_uint64x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int64x4 v_dotprod_expand_fast(const v_int16x16& a, const v_int16x16& b) +{ + __m256i prod = __lasx_xvadd_w(__lasx_xvmulwev_w_h(a.val, b.val), __lasx_xvmulwod_w_h(a.val, b.val)); + __m256i sign = __lasx_xvsrai_w(prod, 31); + __m256i lo = __lasx_xvilvl_w(sign, prod); + __m256i hi = __lasx_xvilvh_w(sign, prod); + return v_int64x4(__lasx_xvadd_d(lo, hi)); +} +inline v_int64x4 v_dotprod_expand_fast(const v_int16x16& a, const v_int16x16& b, const v_int64x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 32 >> 64f +inline v_float64x4 v_dotprod_expand_fast(const v_int32x8& a, const v_int32x8& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x4 v_dotprod_expand_fast(const v_int32x8& a, const v_int32x8& b, const v_float64x4& c) +{ return v_dotprod_expand(a, b, c); } + + +#define OPENCV_HAL_LASX_SPLAT2_PS(a, im) \ + v_float32x8(__lasx_xvpermi_w(a.val, a.val, im)) + +inline v_float32x8 v_matmul(const v_float32x8& v, const v_float32x8& m0, + const v_float32x8& m1, const v_float32x8& m2, + const v_float32x8& m3) +{ + v_float32x8 v04 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0); + v_float32x8 v15 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0x55); + v_float32x8 v26 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0xAA); + v_float32x8 v37 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0xFF); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, v37 * m3))); +} + +inline v_float32x8 v_matmuladd(const v_float32x8& v, const v_float32x8& m0, + const v_float32x8& m1, const v_float32x8& m2, + const v_float32x8& a) +{ + v_float32x8 v04 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0); + v_float32x8 v15 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0x55); + v_float32x8 v26 = OPENCV_HAL_LASX_SPLAT2_PS(v, 0xAA); + return v_fma(v04, m0, v_fma(v15, m1, v_fma(v26, m2, a))); +} + + +#define OPENCV_HAL_IMPL_LASX_TRANSPOSE4x4(_Tpvec, cast_from, cast_to) \ + inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) \ + { \ + __m256i t0 = cast_from(__lasx_xvilvl_w(a1.val, a0.val)); \ + __m256i t1 = cast_from(__lasx_xvilvl_w(a3.val, a2.val)); \ + __m256i t2 = cast_from(__lasx_xvilvh_w(a1.val, a0.val)); \ + __m256i t3 = cast_from(__lasx_xvilvh_w(a3.val, a2.val)); \ + b0.val = cast_to(__lasx_xvilvl_d(t1, t0)); \ + b1.val = cast_to(__lasx_xvilvh_d(t1, t0)); \ + b2.val = cast_to(__lasx_xvilvl_d(t3, t2)); \ + b3.val = cast_to(__lasx_xvilvh_d(t3, t2)); \ + } + +OPENCV_HAL_IMPL_LASX_TRANSPOSE4x4(v_uint32x8, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_LASX_TRANSPOSE4x4(v_int32x8, OPENCV_HAL_NOP, OPENCV_HAL_NOP) + +inline void v_transpose4x4(const v_float32x8 &a0, const v_float32x8 &a1, + const v_float32x8 &a2, const v_float32x8 &a3, + v_float32x8 &b0, v_float32x8 &b1, v_float32x8 &b2, v_float32x8 &b3) +{ + __m256i t0 = __lasx_xvilvl_w(__m256i(a1.val), __m256i(a0.val)); + __m256i t1 = __lasx_xvilvl_w(__m256i(a3.val), __m256i(a2.val)); + __m256i t2 = __lasx_xvilvh_w(__m256i(a1.val), __m256i(a0.val)); + __m256i t3 = __lasx_xvilvh_w(__m256i(a3.val), __m256i(a2.val)); + b0.val = __m256(__lasx_xvilvl_d(t1, t0)); + b1.val = __m256(__lasx_xvilvh_d(t1, t0)); + b2.val = __m256(__lasx_xvilvl_d(t3, t2)); + b3.val = __m256(__lasx_xvilvh_d(t3, t2)); +} + +//////////////// Value reordering /////////////// + +/* Expand */ +#define OPENCV_HAL_IMPL_LASX_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin) \ + inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ + { \ + b0.val = intrin(a.val); \ + b1.val = intrin(__lasx_xvpermi_q(a.val, a.val, 0x11)); \ + } \ + inline _Tpwvec v_expand_low(const _Tpvec& a) \ + { return _Tpwvec(intrin(a.val)); } \ + inline _Tpwvec v_expand_high(const _Tpvec& a) \ + { return _Tpwvec(intrin(__lasx_xvpermi_q(a.val, a.val, 0x11))); } \ + inline _Tpwvec v256_load_expand(const _Tp* ptr) \ + { \ + __m128i a = __lsx_vld(ptr, 0); \ + return _Tpwvec(intrin(*((__m256i*)&a))); \ + } + +OPENCV_HAL_IMPL_LASX_EXPAND(v_uint8x32, v_uint16x16, uchar, __lasx_vext2xv_hu_bu) +OPENCV_HAL_IMPL_LASX_EXPAND(v_int8x32, v_int16x16, schar, __lasx_vext2xv_h_b) +OPENCV_HAL_IMPL_LASX_EXPAND(v_uint16x16, v_uint32x8, ushort, __lasx_vext2xv_wu_hu) +OPENCV_HAL_IMPL_LASX_EXPAND(v_int16x16, v_int32x8, short, __lasx_vext2xv_w_h) +OPENCV_HAL_IMPL_LASX_EXPAND(v_uint32x8, v_uint64x4, unsigned, __lasx_vext2xv_du_wu) +OPENCV_HAL_IMPL_LASX_EXPAND(v_int32x8, v_int64x4, int, __lasx_vext2xv_d_w) + +#define OPENCV_HAL_IMPL_LASX_EXPAND_Q(_Tpvec, _Tp, intrin) \ + inline _Tpvec v256_load_expand_q(const _Tp* ptr) \ + { \ + __m128i a = __lsx_vld(ptr, 0); \ + return _Tpvec(intrin(*((__m256i*)&a))); \ + } + +OPENCV_HAL_IMPL_LASX_EXPAND_Q(v_uint32x8, uchar, __lasx_vext2xv_wu_bu) +OPENCV_HAL_IMPL_LASX_EXPAND_Q(v_int32x8, schar, __lasx_vext2xv_w_b) + +/* pack */ +// 16 +inline v_int8x32 v_pack(const v_int16x16& a, const v_int16x16& b) +{ return v_int8x32(_v256_shuffle_odd_64(_lasx_packs_h(a.val, b.val))); } + +inline v_uint8x32 v_pack(const v_uint16x16& a, const v_uint16x16& b) +{ return v_uint8x32(_v256_shuffle_odd_64(__lasx_xvssrlrni_bu_h(b.val, a.val, 0))); } + +inline v_uint8x32 v_pack_u(const v_int16x16& a, const v_int16x16& b) +{ + return v_uint8x32(_v256_shuffle_odd_64(_lasx_packus_h(a.val, b.val))); +} + +inline void v_pack_store(schar* ptr, const v_int16x16& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(uchar *ptr, const v_uint16x16& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_u_store(uchar* ptr, const v_int16x16& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + +template inline +v_uint8x32 v_rshr_pack(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i res = __lasx_xvssrlrni_bu_h(b.val, a.val, n); + return v_uint8x32(_v256_shuffle_odd_64(res)); +} + +template inline +void v_rshr_pack_store(uchar* ptr, const v_uint16x16& a) +{ + __m256i res = __lasx_xvssrlrni_bu_h(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +template inline +v_uint8x32 v_rshr_pack_u(const v_int16x16& a, const v_int16x16& b) +{ + __m256i res = __lasx_xvssrarni_bu_h(b.val, a.val, n); + return v_uint8x32(_v256_shuffle_odd_64(res)); +} + +template inline +void v_rshr_pack_u_store(uchar* ptr, const v_int16x16& a) +{ + __m256i res = __lasx_xvssrarni_bu_h(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +template inline +v_int8x32 v_rshr_pack(const v_int16x16& a, const v_int16x16& b) +{ + __m256i res = __lasx_xvssrarni_b_h(b.val, a.val, n); + return v_int8x32(_v256_shuffle_odd_64(res)); +} + +template inline +void v_rshr_pack_store(schar* ptr, const v_int16x16& a) +{ + __m256i res = __lasx_xvssrarni_b_h(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +// 32 +inline v_int16x16 v_pack(const v_int32x8& a, const v_int32x8& b) +{ return v_int16x16(_v256_shuffle_odd_64(_lasx_packs_w(a.val, b.val))); } + +inline v_uint16x16 v_pack(const v_uint32x8& a, const v_uint32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(_v256_packs_epu32(a.val, b.val))); } + +inline v_uint16x16 v_pack_u(const v_int32x8& a, const v_int32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(_lasx_packus_w(a.val, b.val))); } + +inline void v_pack_store(short* ptr, const v_int32x8& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(ushort* ptr, const v_uint32x8& a) +{ + __m256i res = __lasx_xvssrlrni_hu_w(a.val, a.val, 0); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +inline void v_pack_u_store(ushort* ptr, const v_int32x8& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + +template inline +v_uint16x16 v_rshr_pack(const v_uint32x8& a, const v_uint32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(__lasx_xvssrlrni_hu_w(b.val, a.val, n))); } + +template inline +void v_rshr_pack_store(ushort* ptr, const v_uint32x8& a) +{ + __m256i res = __lasx_xvssrlrni_hu_w(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +template inline +v_uint16x16 v_rshr_pack_u(const v_int32x8& a, const v_int32x8& b) +{ return v_uint16x16(_v256_shuffle_odd_64(__lasx_xvssrarni_hu_w(b.val, a.val, n))); } + +template inline +void v_rshr_pack_u_store(ushort* ptr, const v_int32x8& a) +{ + __m256i res = __lasx_xvssrarni_hu_w(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +template inline +v_int16x16 v_rshr_pack(const v_int32x8& a, const v_int32x8& b) +{ return v_int16x16(_v256_shuffle_odd_64(__lasx_xvssrarni_h_w(b.val, a.val, n))); } + +template inline +void v_rshr_pack_store(short* ptr, const v_int32x8& a) +{ + __m256i res = __lasx_xvssrarni_h_w(a.val, a.val, n); + __lsx_vst(_v256_extract_low(_v256_shuffle_odd_64(res)), ptr, 0); +} + +// 64 +// Non-saturating pack +inline v_uint32x8 v_pack(const v_uint64x4& a, const v_uint64x4& b) +{ + __m256i ab = __lasx_xvpickev_w(b.val, a.val); + return v_uint32x8(_v256_shuffle_odd_64(ab)); +} + +inline v_int32x8 v_pack(const v_int64x4& a, const v_int64x4& b) +{ return v_reinterpret_as_s32(v_pack(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); } + +inline void v_pack_store(unsigned* ptr, const v_uint64x4& a) +{ + __m256i a0 = __lasx_xvshuf4i_w(a.val, 0x08); + v_store_low(ptr, v_uint32x8(_v256_shuffle_odd_64(a0))); +} + +inline void v_pack_store(int* ptr, const v_int64x4& b) +{ v_pack_store((unsigned*)ptr, v_reinterpret_as_u64(b)); } + +template inline +v_uint32x8 v_rshr_pack(const v_uint64x4& a, const v_uint64x4& b) +{ return v_uint32x8(_v256_shuffle_odd_64(__lasx_xvsrlrni_w_d(b.val, a.val, n))); } + +template inline +void v_rshr_pack_store(unsigned* ptr, const v_uint64x4& a) +{ __lsx_vst(_v256_shuffle_odd_64(__lasx_xvsrlrni_w_d(a.val, a.val, n)), ptr, 0); } + +template inline +v_int32x8 v_rshr_pack(const v_int64x4& a, const v_int64x4& b) +{ return v_int32x8(_v256_shuffle_odd_64(__lasx_xvsrarni_w_d(b.val, a.val, n))); } + +template inline +void v_rshr_pack_store(int* ptr, const v_int64x4& a) +{ __lsx_vst(_v256_shuffle_odd_64(__lasx_xvsrarni_w_d(a.val, a.val, n)), ptr, 0); } + +// pack boolean +inline v_uint8x32 v_pack_b(const v_uint16x16& a, const v_uint16x16& b) +{ + __m256i ab = _lasx_packs_h(a.val, b.val); + return v_uint8x32(_v256_shuffle_odd_64(ab)); +} + +inline v_uint8x32 v_pack_b(const v_uint32x8& a, const v_uint32x8& b, + const v_uint32x8& c, const v_uint32x8& d) +{ + __m256i ab = _lasx_packs_w(a.val, b.val); + __m256i cd = _lasx_packs_w(c.val, d.val); + + __m256i abcd = _v256_shuffle_odd_64(_lasx_packs_h(ab, cd)); + return v_uint8x32(__lasx_xvshuf4i_w(abcd, 0xd8)); +} + +inline v_uint8x32 v_pack_b(const v_uint64x4& a, const v_uint64x4& b, const v_uint64x4& c, + const v_uint64x4& d, const v_uint64x4& e, const v_uint64x4& f, + const v_uint64x4& g, const v_uint64x4& h) +{ + __m256i ab = _lasx_packs_w(a.val, b.val); + __m256i cd = _lasx_packs_w(c.val, d.val); + __m256i ef = _lasx_packs_w(e.val, f.val); + __m256i gh = _lasx_packs_w(g.val, h.val); + + __m256i abcd = _lasx_packs_w(ab, cd); + __m256i efgh = _lasx_packs_w(ef, gh); + __m256i pkall = _v256_shuffle_odd_64(_lasx_packs_h(abcd, efgh)); + + __m256i rev = _v256_alignr_b(pkall, pkall, 8); + return v_uint8x32(__lasx_xvilvl_h(rev, pkall)); +} + +/* Recombine */ +// its up there with load and store operations + +/* Extract */ +#define OPENCV_HAL_IMPL_LASX_EXTRACT(_Tpvec) \ + template \ + inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ + { return v_rotate_right(a, b); } + +OPENCV_HAL_IMPL_LASX_EXTRACT(v_uint8x32) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_int8x32) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_uint16x16) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_int16x16) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_uint32x8) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_int32x8) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_uint64x4) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_int64x4) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_float32x8) +OPENCV_HAL_IMPL_LASX_EXTRACT(v_float64x4) + +template +inline uchar v_extract_n(v_uint8x32 a) +{ + return (uchar)_v256_extract_b(a.val); +} + +template +inline schar v_extract_n(v_int8x32 a) +{ + return (schar)v_extract_n(v_reinterpret_as_u8(a)); +} + +template +inline ushort v_extract_n(v_uint16x16 a) +{ + return (ushort)_v256_extract_h(a.val); +} + +template +inline short v_extract_n(v_int16x16 a) +{ + return (short)v_extract_n(v_reinterpret_as_u16(a)); +} + +template +inline uint v_extract_n(v_uint32x8 a) +{ + return (uint)_v256_extract_w(a.val); +} + +template +inline int v_extract_n(v_int32x8 a) +{ + return (int)v_extract_n(v_reinterpret_as_u32(a)); +} + +template +inline uint64 v_extract_n(v_uint64x4 a) +{ + return (uint64)_v256_extract_d(a.val); +} + +template +inline int64 v_extract_n(v_int64x4 v) +{ + return (int64)v_extract_n(v_reinterpret_as_u64(v)); +} + +template +inline float v_extract_n(v_float32x8 v) +{ + union { uint iv; float fv; } d; + d.iv = v_extract_n(v_reinterpret_as_u32(v)); + return d.fv; +} + +template +inline double v_extract_n(v_float64x4 v) +{ + union { uint64 iv; double dv; } d; + d.iv = v_extract_n(v_reinterpret_as_u64(v)); + return d.dv; +} + +template +inline v_uint32x8 v_broadcast_element(v_uint32x8 a) +{ + static const __m256i perm = __lasx_xvreplgr2vr_w((char)i); + return v_uint32x8(__lasx_xvperm_w(a.val, perm)); +} + +template +inline v_int32x8 v_broadcast_element(const v_int32x8 &a) +{ return v_reinterpret_as_s32(v_broadcast_element(v_reinterpret_as_u32(a))); } + +template +inline v_float32x8 v_broadcast_element(const v_float32x8 &a) +{ return v_reinterpret_as_f32(v_broadcast_element(v_reinterpret_as_u32(a))); } + +///////////////////// load deinterleave ///////////////////////////// + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x32& a, v_uint8x32& b) +{ + __m256i t0 = __lasx_xvld(ptr, 0); + __m256i t1 = __lasx_xvld(ptr, 32); + + __m256i p0 = __lasx_xvpickev_b(t1, t0); + __m256i p1 = __lasx_xvpickod_b(t1, t0); + + a.val = __lasx_xvpermi_d(p0, 0xd8); + b.val = __lasx_xvpermi_d(p1, 0xd8); +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x16& a, v_uint16x16& b ) +{ + __m256i t0 = __lasx_xvld(ptr, 0); + __m256i t1 = __lasx_xvld(ptr, 32); + + __m256i p0 = __lasx_xvpickev_h(t1, t0); + __m256i p1 = __lasx_xvpickod_h(t1, t0); + + a.val = __lasx_xvpermi_d(p0, 0xd8); + b.val = __lasx_xvpermi_d(p1, 0xd8); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b ) +{ + __m256i t0 = __lasx_xvld(ptr, 0); + __m256i t1 = __lasx_xvld(ptr, 32); + + __m256i p0 = __lasx_xvpickev_w(t1, t0); + __m256i p1 = __lasx_xvpickod_w(t1, t0); + + a.val = __lasx_xvpermi_d(p0, 0xd8); + b.val = __lasx_xvpermi_d(p1, 0xd8); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b ) +{ + __m256i ab0 = __lasx_xvld(ptr, 0); + __m256i ab1 = __lasx_xvld(ptr, 32); + + __m256i pl = __lasx_xvpermi_q(ab0, ab1, 0x02); + __m256i ph = __lasx_xvpermi_q(ab0, ab1, 0x13); + __m256i a0 = __lasx_xvilvl_d(ph, pl); + __m256i b0 = __lasx_xvilvh_d(ph, pl); + a = v_uint64x4(a0); + b = v_uint64x4(b0); +} + +inline void v_load_deinterleave( const uchar* ptr, v_uint8x32& a, v_uint8x32& b, v_uint8x32& c ) +{ + __m256i bgr0 = __lasx_xvld(ptr, 0); + __m256i bgr1 = __lasx_xvld(ptr, 32); + __m256i bgr2 = __lasx_xvld(ptr, 64); + + __m256i s02_low = __lasx_xvpermi_q(bgr0, bgr2, 0x02); + __m256i s02_high = __lasx_xvpermi_q(bgr0, bgr2, 0x13); + + const __m256i m0 = _v256_setr_b(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, + 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + const __m256i m1 = _v256_setr_b(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, + -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); + + __m256i b0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_low, s02_high, m0), bgr1, m1); + __m256i g0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_high, s02_low, m1), bgr1, m0); + __m256i r0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(bgr1, s02_low, m0), s02_high, m1); + + const __m256i + sh_b = _v256_setr_b(0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13, + 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13), + sh_g = _v256_setr_b(1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, + 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14), + sh_r = _v256_setr_b(2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, + 2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15); + b0 = __lasx_xvshuf_b(b0, b0, sh_b); + g0 = __lasx_xvshuf_b(g0, g0, sh_g); + r0 = __lasx_xvshuf_b(r0, r0, sh_r); + + a = v_uint8x32(b0); + b = v_uint8x32(g0); + c = v_uint8x32(r0); +} + +inline void v_load_deinterleave( const ushort* ptr, v_uint16x16& a, v_uint16x16& b, v_uint16x16& c ) +{ + __m256i bgr0 = __lasx_xvld(ptr, 0); + __m256i bgr1 = __lasx_xvld(ptr, 32); + __m256i bgr2 = __lasx_xvld(ptr, 64); + + __m256i s02_low = __lasx_xvpermi_q(bgr0, bgr2, 0x02); + __m256i s02_high = __lasx_xvpermi_q(bgr0, bgr2, 0x13); + + const __m256i m0 = _v256_setr_b(0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0); + const __m256i m1 = _v256_setr_b(0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0); + __m256i b0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_low, s02_high, m0), bgr1, m1); + __m256i g0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(bgr1, s02_low, m0), s02_high, m1); + __m256i r0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_high, s02_low, m1), bgr1, m0); + const __m256i sh_b = _v256_setr_b(0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m256i sh_g = _v256_setr_b(2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, + 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 0, 1, 6, 7, 12, 13); + const __m256i sh_r = _v256_setr_b(4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + b0 = __lasx_xvshuf_b(b0, b0, sh_b); + g0 = __lasx_xvshuf_b(g0, g0, sh_g); + r0 = __lasx_xvshuf_b(r0, r0, sh_r); + + a = v_uint16x16(b0); + b = v_uint16x16(g0); + c = v_uint16x16(r0); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b, v_uint32x8& c ) +{ + __m256i bgr0 = __lasx_xvld(ptr, 0); + __m256i bgr1 = __lasx_xvld(ptr, 32); + __m256i bgr2 = __lasx_xvld(ptr, 64); + + __m256i s02_low = __lasx_xvpermi_q(bgr0, bgr2, 0x02); + __m256i s02_high = __lasx_xvpermi_q(bgr0, bgr2, 0x13); + + __m256i m24 = _v256_set_w(0, 0, -1, 0, 0, -1, 0, 0); + __m256i m92 = _v256_set_w(-1, 0, 0, -1, 0, 0, -1, 0); + __m256i b0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_low, s02_high, m24), bgr1, m92); + __m256i g0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(s02_high, s02_low, m92), bgr1, m24); + __m256i r0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(bgr1, s02_low, m24), s02_high, m92); + + b0 = __lasx_xvshuf4i_w(b0, 0x6c); + g0 = __lasx_xvshuf4i_w(g0, 0xb1); + r0 = __lasx_xvshuf4i_w(r0, 0xc6); + + a = v_uint32x8(b0); + b = v_uint32x8(g0); + c = v_uint32x8(r0); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b, v_uint64x4& c ) +{ + __m256i bgr0 = __lasx_xvld(ptr, 0); + __m256i bgr1 = __lasx_xvld(ptr, 32); + __m256i bgr2 = __lasx_xvld(ptr, 64); + + __m256i s01 = __lasx_xvpermi_q(bgr0, bgr1, 0x12); // get bgr0 low 128 and bgr1 high 128 + __m256i s12 = __lasx_xvpermi_q(bgr1, bgr2, 0x12); + __m256i s20r = __lasx_xvpermi_d(__lasx_xvpermi_q(bgr2, bgr0, 0x12), 0x1b); + __m256i b0 = __lasx_xvilvl_d(s20r, s01); + __m256i g0 = _v256_alignr_b(s12, s01, 8); + __m256i r0 = __lasx_xvilvh_d(s12, s20r); + + a = v_uint64x4(b0); + b = v_uint64x4(g0); + c = v_uint64x4(r0); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x32& a, v_uint8x32& b, v_uint8x32& c, v_uint8x32& d) +{ + __m256i t0 = __lasx_xvld(ptr, 0); + __m256i t1 = __lasx_xvld(ptr, 32); + __m256i t2 = __lasx_xvld(ptr, 64); + __m256i t3 = __lasx_xvld(ptr, 96); + + const __m256i sh = _v256_setr_w(0, 4, 1, 5, 2, 6, 3, 7); + __m256i ac_lo = __lasx_xvpickev_b(t1, t0); + __m256i bd_lo = __lasx_xvpickod_b(t1, t0); + __m256i ac_hi = __lasx_xvpickev_b(t3, t2); + __m256i bd_hi = __lasx_xvpickod_b(t3, t2); + + __m256i a_pre = __lasx_xvpickev_b(ac_hi, ac_lo); + __m256i c_pre = __lasx_xvpickod_b(ac_hi, ac_lo); + __m256i b_pre = __lasx_xvpickev_b(bd_hi, bd_lo); + __m256i d_pre = __lasx_xvpickod_b(bd_hi, bd_lo); + + a.val = __lasx_xvperm_w(a_pre, sh); + b.val = __lasx_xvperm_w(b_pre, sh); + c.val = __lasx_xvperm_w(c_pre, sh); + d.val = __lasx_xvperm_w(d_pre, sh); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x16& a, v_uint16x16& b, v_uint16x16& c, v_uint16x16& d) +{ + __m256i t0 = __lasx_xvld(ptr, 0); + __m256i t1 = __lasx_xvld(ptr, 32); + __m256i t2 = __lasx_xvld(ptr, 64); + __m256i t3 = __lasx_xvld(ptr, 96); + + const __m256i sh = _v256_setr_w(0, 4, 1, 5, 2, 6, 3, 7); + __m256i ac_lo = __lasx_xvpickev_h(t1, t0); + __m256i bd_lo = __lasx_xvpickod_h(t1, t0); + __m256i ac_hi = __lasx_xvpickev_h(t3, t2); + __m256i bd_hi = __lasx_xvpickod_h(t3, t2); + + __m256i a_pre = __lasx_xvpickev_h(ac_hi, ac_lo); + __m256i c_pre = __lasx_xvpickod_h(ac_hi, ac_lo); + __m256i b_pre = __lasx_xvpickev_h(bd_hi, bd_lo); + __m256i d_pre = __lasx_xvpickod_h(bd_hi, bd_lo); + + a.val = __lasx_xvperm_w(a_pre, sh); + b.val = __lasx_xvperm_w(b_pre, sh); + c.val = __lasx_xvperm_w(c_pre, sh); + d.val = __lasx_xvperm_w(d_pre, sh); +} + +inline void v_load_deinterleave( const unsigned* ptr, v_uint32x8& a, v_uint32x8& b, v_uint32x8& c, v_uint32x8& d ) +{ + __m256i p0 = __lasx_xvld(ptr, 0); + __m256i p1 = __lasx_xvld(ptr, 32); + __m256i p2 = __lasx_xvld(ptr, 64); + __m256i p3 = __lasx_xvld(ptr, 96); + + __m256i p01l = __lasx_xvilvl_w(p1, p0); + __m256i p01h = __lasx_xvilvh_w(p1, p0); + __m256i p23l = __lasx_xvilvl_w(p3, p2); + __m256i p23h = __lasx_xvilvh_w(p3, p2); + + __m256i pll = __lasx_xvpermi_q(p01l, p23l, 0x02); + __m256i plh = __lasx_xvpermi_q(p01l, p23l, 0x13); + __m256i phl = __lasx_xvpermi_q(p01h, p23h, 0x02); + __m256i phh = __lasx_xvpermi_q(p01h, p23h, 0x13); + + __m256i b0 = __lasx_xvilvl_w(plh, pll); + __m256i g0 = __lasx_xvilvh_w(plh, pll); + __m256i r0 = __lasx_xvilvl_w(phh, phl); + __m256i a0 = __lasx_xvilvh_w(phh, phl); + + a = v_uint32x8(b0); + b = v_uint32x8(g0); + c = v_uint32x8(r0); + d = v_uint32x8(a0); +} + +inline void v_load_deinterleave( const uint64* ptr, v_uint64x4& a, v_uint64x4& b, v_uint64x4& c, v_uint64x4& d ) +{ + __m256i bgra0 = __lasx_xvld(ptr, 0); + __m256i bgra1 = __lasx_xvld(ptr, 32); + __m256i bgra2 = __lasx_xvld(ptr, 64); + __m256i bgra3 = __lasx_xvld(ptr, 96); + + __m256i l02 = __lasx_xvpermi_q(bgra0, bgra2, 0x02); + __m256i h02 = __lasx_xvpermi_q(bgra0, bgra2, 0x13); + __m256i l13 = __lasx_xvpermi_q(bgra1, bgra3, 0x02); + __m256i h13 = __lasx_xvpermi_q(bgra1, bgra3, 0x13); + + __m256i b0 = __lasx_xvilvl_d(l13, l02); + __m256i g0 = __lasx_xvilvh_d(l13, l02); + __m256i r0 = __lasx_xvilvl_d(h13, h02); + __m256i a0 = __lasx_xvilvh_d(h13, h02); + + a = v_uint64x4(b0); + b = v_uint64x4(g0); + c = v_uint64x4(r0); + d = v_uint64x4(a0); +} + +///////////////////////////// store interleave ///////////////////////////////////// + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& x, const v_uint8x32& y, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = __lasx_xvilvl_b(y.val, x.val); + __m256i xy_h = __lasx_xvilvh_b(y.val, x.val); + + __m256i xy0 = __lasx_xvpermi_q(xy_h, xy_l, 0 + 2*16); + __m256i xy1 = __lasx_xvpermi_q(xy_h, xy_l, 1 + 3*16); + + __lasx_xvst(xy0, (__m256i*)ptr, 0); + __lasx_xvst(xy1, (__m256i*)ptr, 32*1); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& x, const v_uint16x16& y, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = __lasx_xvilvl_h(y.val, x.val); + __m256i xy_h = __lasx_xvilvh_h(y.val, x.val); + + __m256i xy0 = __lasx_xvpermi_q(xy_h, xy_l, 0 + 2*16); + __m256i xy1 = __lasx_xvpermi_q(xy_h, xy_l, 1 + 3*16); + + __lasx_xvst(xy0, (__m256i*)ptr, 0); + __lasx_xvst(xy1, (__m256i*)ptr, 16*2); +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& x, const v_uint32x8& y, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = __lasx_xvilvl_w(y.val, x.val); + __m256i xy_h = __lasx_xvilvh_w(y.val, x.val); + + __m256i xy0 = __lasx_xvpermi_q(xy_h, xy_l, 0 + 2*16); + __m256i xy1 = __lasx_xvpermi_q(xy_h, xy_l, 1 + 3*16); + + __lasx_xvst(xy0, (__m256i*)ptr, 0); + __lasx_xvst(xy1, (__m256i*)ptr, 8*4); +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& x, const v_uint64x4& y, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i xy_l = __lasx_xvilvl_d(y.val, x.val); + __m256i xy_h = __lasx_xvilvh_d(y.val, x.val); + + __m256i xy0 = __lasx_xvpermi_q(xy_h, xy_l, 0 + 2*16); + __m256i xy1 = __lasx_xvpermi_q(xy_h, xy_l, 1 + 3*16); + + __lasx_xvst(xy0, (__m256i*)ptr, 0); + __lasx_xvst(xy1, (__m256i*)ptr, 4*8); +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& a, const v_uint8x32& b, const v_uint8x32& c, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + const __m256i sh_b = _v256_setr_b( + 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5, + 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5); + const __m256i sh_g = _v256_setr_b( + 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, + 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10); + const __m256i sh_r = _v256_setr_b( + 10, 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, + 10, 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15); + + __m256i b0 = __lasx_xvshuf_b(a.val, a.val, sh_b); + __m256i g0 = __lasx_xvshuf_b(b.val, b.val, sh_g); + __m256i r0 = __lasx_xvshuf_b(c.val, c.val, sh_r); + + const __m256i m0 = _v256_setr_b(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, + 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + const __m256i m1 = _v256_setr_b(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, + 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); + + __m256i p0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(b0, g0, m0), r0, m1); + __m256i p1 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(g0, r0, m0), b0, m1); + __m256i p2 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(r0, b0, m0), g0, m1); + + __m256i bgr0 = __lasx_xvpermi_q(p1, p0, 0 + 2*16); + __m256i bgr1 = __lasx_xvpermi_q(p0, p2, 0 + 3*16); + __m256i bgr2 = __lasx_xvpermi_q(p2, p1, 1 + 3*16); + + __lasx_xvst(bgr0, (__m256i*)ptr, 0); + __lasx_xvst(bgr1, (__m256i*)ptr, 32); + __lasx_xvst(bgr2, (__m256i*)ptr, 64); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& a, const v_uint16x16& b, const v_uint16x16& c, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + const __m256i sh_b = _v256_setr_b( + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11, + 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m256i sh_g = _v256_setr_b( + 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, + 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5); + const __m256i sh_r = _v256_setr_b( + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, + 4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + + __m256i b0 = __lasx_xvshuf_b(a.val, a.val, sh_b); + __m256i g0 = __lasx_xvshuf_b(b.val, b.val, sh_g); + __m256i r0 = __lasx_xvshuf_b(c.val, c.val, sh_r); + + const __m256i m0 = _v256_setr_b(0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0); + const __m256i m1 = _v256_setr_b(0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0); + + __m256i p0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(b0, g0, m0), r0, m1); + __m256i p1 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(g0, r0, m0), b0, m1); + __m256i p2 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(r0, b0, m0), g0, m1); + + __m256i bgr0 = __lasx_xvpermi_q(p2, p0, 0 + 2*16); + __m256i bgr2 = __lasx_xvpermi_q(p2, p0, 1 + 3*16); + + __lasx_xvst(bgr0, (__m256i*)ptr, 0); + __lasx_xvst(p1, (__m256i*)ptr, 16*2); + __lasx_xvst(bgr2, (__m256i*)ptr, 32*2); +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& a, const v_uint32x8& b, const v_uint32x8& c, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i b0 = __lasx_xvshuf4i_w(a.val, 0x6c); + __m256i g0 = __lasx_xvshuf4i_w(b.val, 0xb1); + __m256i r0 = __lasx_xvshuf4i_w(c.val, 0xc6); + + __m256i bitmask_1 = _v256_set_w(-1, 0, 0, -1, 0, 0, -1, 0); + __m256i bitmask_2 = _v256_set_w(0, 0, -1, 0, 0, -1, 0, 0); + + __m256i p0 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(b0, g0, bitmask_1), r0, bitmask_2); + __m256i p1 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(g0, r0, bitmask_1), b0, bitmask_2); + __m256i p2 = __lasx_xvbitsel_v(__lasx_xvbitsel_v(r0, b0, bitmask_1), g0, bitmask_2); + + __m256i bgr0 = __lasx_xvpermi_q(p1, p0, 0 + 2*16); + __m256i bgr2 = __lasx_xvpermi_q(p1, p0, 1 + 3*16); + + __lasx_xvst(bgr0, (__m256i*)ptr, 0); + __lasx_xvst(p2, (__m256i*)ptr, 8*4); + __lasx_xvst(bgr2, (__m256i*)ptr, 16*4); +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& a, const v_uint64x4& b, const v_uint64x4& c, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i s01 = __lasx_xvilvl_d(b.val, a.val); + __m256i s12 = __lasx_xvilvh_d(c.val, b.val); + __m256i s20 = __lasx_xvpermi_w(a.val, c.val, 0xe4); + + __m256i bgr0 = __lasx_xvpermi_q(s20, s01, 0 + 2*16); + __m256i bgr1 = __lasx_xvpermi_q(s01, s12, 0x30); + __m256i bgr2 = __lasx_xvpermi_q(s12, s20, 1 + 3*16); + + __lasx_xvst(bgr0, (__m256i*)ptr, 0); + __lasx_xvst(bgr1, (__m256i*)ptr, 4*8); + __lasx_xvst(bgr2, (__m256i*)ptr, 8*8); +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x32& a, const v_uint8x32& b, + const v_uint8x32& c, const v_uint8x32& d, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = __lasx_xvilvl_b(b.val, a.val); + __m256i bg1 = __lasx_xvilvh_b(b.val, a.val); + __m256i ra0 = __lasx_xvilvl_b(d.val, c.val); + __m256i ra1 = __lasx_xvilvh_b(d.val, c.val); + + __m256i bgra0_ = __lasx_xvilvl_h(ra0, bg0); + __m256i bgra1_ = __lasx_xvilvh_h(ra0, bg0); + __m256i bgra2_ = __lasx_xvilvl_h(ra1, bg1); + __m256i bgra3_ = __lasx_xvilvh_h(ra1, bg1); + + __m256i bgra0 = __lasx_xvpermi_q(bgra1_, bgra0_, 0 + 2*16); + __m256i bgra2 = __lasx_xvpermi_q(bgra1_, bgra0_, 1 + 3*16); + __m256i bgra1 = __lasx_xvpermi_q(bgra3_, bgra2_, 0 + 2*16); + __m256i bgra3 = __lasx_xvpermi_q(bgra3_, bgra2_, 1 + 3*16); + + __lasx_xvst(bgra0, (__m256i*)ptr, 0); + __lasx_xvst(bgra1, (__m256i*)ptr, 32); + __lasx_xvst(bgra2, (__m256i*)ptr, 64); + __lasx_xvst(bgra3, (__m256i*)ptr, 96); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x16& a, const v_uint16x16& b, + const v_uint16x16& c, const v_uint16x16& d, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = __lasx_xvilvl_h(b.val, a.val); + __m256i bg1 = __lasx_xvilvh_h(b.val, a.val); + __m256i ra0 = __lasx_xvilvl_h(d.val, c.val); + __m256i ra1 = __lasx_xvilvh_h(d.val, c.val); + + __m256i bgra0_ = __lasx_xvilvl_w(ra0, bg0); + __m256i bgra1_ = __lasx_xvilvh_w(ra0, bg0); + __m256i bgra2_ = __lasx_xvilvl_w(ra1, bg1); + __m256i bgra3_ = __lasx_xvilvh_w(ra1, bg1); + + __m256i bgra0 = __lasx_xvpermi_q(bgra1_, bgra0_, 0 + 2*16); + __m256i bgra2 = __lasx_xvpermi_q(bgra1_, bgra0_, 1 + 3*16); + __m256i bgra1 = __lasx_xvpermi_q(bgra3_, bgra2_, 0 + 2*16); + __m256i bgra3 = __lasx_xvpermi_q(bgra3_, bgra2_, 1 + 3*16); + + __lasx_xvst(bgra0, (__m256i*)ptr, 0); + __lasx_xvst(bgra1, (__m256i*)ptr, 16*2); + __lasx_xvst(bgra2, (__m256i*)ptr, 32*2); + __lasx_xvst(bgra3, (__m256i*)ptr, 48*2); +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x8& a, const v_uint32x8& b, + const v_uint32x8& c, const v_uint32x8& d, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = __lasx_xvilvl_w(b.val, a.val); + __m256i bg1 = __lasx_xvilvh_w(b.val, a.val); + __m256i ra0 = __lasx_xvilvl_w(d.val, c.val); + __m256i ra1 = __lasx_xvilvh_w(d.val, c.val); + + __m256i bgra0_ = __lasx_xvilvl_d(ra0, bg0); + __m256i bgra1_ = __lasx_xvilvh_d(ra0, bg0); + __m256i bgra2_ = __lasx_xvilvl_d(ra1, bg1); + __m256i bgra3_ = __lasx_xvilvh_d(ra1, bg1); + + __m256i bgra0 = __lasx_xvpermi_q(bgra1_, bgra0_, 0 + 2*16); + __m256i bgra2 = __lasx_xvpermi_q(bgra1_, bgra0_, 1 + 3*16); + __m256i bgra1 = __lasx_xvpermi_q(bgra3_, bgra2_, 0 + 2*16); + __m256i bgra3 = __lasx_xvpermi_q(bgra3_, bgra2_, 1 + 3*16); + + __lasx_xvst(bgra0, (__m256i*)ptr, 0); + __lasx_xvst(bgra1, (__m256i*)ptr, 8*4); + __lasx_xvst(bgra2, (__m256i*)ptr, 16*4); + __lasx_xvst(bgra3, (__m256i*)ptr, 24*4); +} + +inline void v_store_interleave( uint64* ptr, const v_uint64x4& a, const v_uint64x4& b, + const v_uint64x4& c, const v_uint64x4& d, + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) +{ + __m256i bg0 = __lasx_xvilvl_d(b.val, a.val); + __m256i bg1 = __lasx_xvilvh_d(b.val, a.val); + __m256i ra0 = __lasx_xvilvl_d(d.val, c.val); + __m256i ra1 = __lasx_xvilvh_d(d.val, c.val); + + __m256i bgra0 = __lasx_xvpermi_q(ra0, bg0, 0 + 2*16); + __m256i bgra1 = __lasx_xvpermi_q(ra1, bg1, 0 + 2*16); + __m256i bgra2 = __lasx_xvpermi_q(ra0, bg0, 1 + 3*16); + __m256i bgra3 = __lasx_xvpermi_q(ra1, bg1, 1 + 3*16); + + __lasx_xvst(bgra0, (__m256i*)ptr, 0); + __lasx_xvst(bgra1, (__m256i*)(ptr), 4*8); + __lasx_xvst(bgra2, (__m256i*)(ptr), 8*8); + __lasx_xvst(bgra3, (__m256i*)(ptr), 12*8); +} + + +#define OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0 ) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0 ) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0, _Tpvec0& d0 ) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1/*, mode*/); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, const _Tpvec0& c0, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1/*, mode*/); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1/*, mode*/); \ +} + +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_int8x32, schar, s8, v_uint8x32, uchar, u8) +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_int16x16, short, s16, v_uint16x16, ushort, u16) +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_int32x8, int, s32, v_uint32x8, unsigned, u32) +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_float32x8, float, f32, v_uint32x8, unsigned, u32) +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_int64x4, int64, s64, v_uint64x4, uint64, u64) +OPENCV_HAL_IMPL_LASX_LOADSTORE_INTERLEAVE(v_float64x4, double, f64, v_uint64x4, uint64, u64) + +// +// FP16 +// + +inline v_float32x8 v256_load_expand(const float16_t* ptr) +{ +#if CV_FP16 + //1-load128, 2-permi, 3-cvt + return v_float32x8(__lasx_xvfcvtl_s_h(__lasx_xvpermi_d(__lsx_vld((const __m128i*)ptr, 0), 0x10))); +#else + float CV_DECL_ALIGNED(32) buf[8]; + for (int i = 0; i < 8; i++) + buf[i] = (float)ptr[i]; + return v256_load_aligned(buf); +#endif +} + +inline void v_pack_store(float16_t* ptr, const v_float32x8& a) +{ +#if CV_FP16 + __m256i ah = __lasx_xvfcvt_h_s(a.val, a.val); + __lsx_vst((_m128i)ah, ptr, 0); +#else + float CV_DECL_ALIGNED(32) buf[8]; + v_store_aligned(buf, a); + for (int i = 0; i < 8; i++) + ptr[i] = float16_t(buf[i]); +#endif +} + +// +// end of FP16 +// + +inline void v256_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: + +#endif // OPENCV_HAL_INTRIN_LASX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lsx.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lsx.hpp new file mode 100644 index 0000000..4e3d231 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_lsx.hpp @@ -0,0 +1,2536 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_INTRIN_LSX_HPP +#define OPENCV_HAL_INTRIN_LSX_HPP + +#include + +#define CV_SIMD128 1 +#define CV_SIMD128_64F 1 +#define CV_SIMD128_FP16 0 + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +/////////// Utils //////// + +inline __m128i _v128_setr_b(char v0, char v1, char v2, char v3, char v4, char v5, char v6, + char v7, char v8, char v9, char v10, char v11, char v12, char v13, char v14, char v15) +{ + return (__m128i)v16i8{ v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15 }; +} + +inline __m128i _v128_set_b(char v0, char v1, char v2, char v3, char v4, char v5, char v6, + char v7, char v8, char v9, char v10, char v11, char v12, char v13, char v14, char v15) +{ + return (__m128i)v16i8{ v15, v14, v13, v12, v11, v10, v9, v8, + v7, v6, v5, v4, v3, v2, v1, v0 }; +} + +inline __m128i _v128_setr_h(short v0, short v1, short v2, short v3, short v4, short v5, + short v6, short v7) +{ + return (__m128i)v8i16{ v0, v1, v2, v3, v4, v5, v6, v7 }; +} + +inline __m128i _v128_setr_w(int v0, int v1, int v2, int v3) +{ + return (__m128i)v4i32{ v0, v1, v2, v3 }; +} + +inline __m128i _v128_set_w(int v0, int v1, int v2, int v3) +{ + return (__m128i)v4i32{ v3, v2, v1, v0 }; +} + +inline __m128i _v128_setall_w(int v0) +{ + return __lsx_vreplgr2vr_w(v0); +} + +inline __m128i _v128_setr_d(int64 v0, int64 v1) +{ + return (__m128i)v2i64{ v0, v1 }; +} + +inline __m128i _v128_set_d(int64 v0, int64 v1) +{ + return (__m128i)v2i64{ v1, v0 }; +} + +inline __m128 _v128_setr_ps(float v0, float v1, float v2, float v3) +{ + return (__m128)v4f32{ v0, v1, v2, v3 }; +} + +inline __m128 _v128_setall_ps(float v0) +{ + return (__m128)v4f32{ v0, v0, v0, v0 }; +} + +inline __m128d _v128_setr_pd(double v0, double v1) +{ + return (__m128d)v2f64{ v0, v1 }; +} + +inline __m128d _v128_setall_pd(double v0) +{ + return (__m128d)v2f64{ v0, v0 }; +} + +inline __m128i _lsx_packus_h(const __m128i& a, const __m128i& b) +{ + return __lsx_vssrarni_bu_h(b, a, 0); +} + +inline __m128i _lsx_packs_h(const __m128i& a, const __m128i& b) +{ + return __lsx_vssrarni_b_h(b, a, 0); +} + +inline __m128i _lsx_packus_w(const __m128i& a, const __m128i& b) +{ + return __lsx_vssrarni_hu_w(b, a, 0); +} + +/////// Types /////// + +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16}; + + v_uint8x16() {} + explicit v_uint8x16(__m128i v): val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + val = _v128_setr_b(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); + } + + uchar get0() const + { + return (uchar)__lsx_vpickve2gr_bu(val, 0); + } + + __m128i val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(__m128i v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + val = _v128_setr_b(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); + } + + schar get0() const + { + return (schar)__lsx_vpickve2gr_b(val, 0); + } + + __m128i val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(__m128i v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + val = _v128_setr_h(v0, v1, v2, v3, v4, v5, v6, v7); + } + + ushort get0() const + { + return (ushort)__lsx_vpickve2gr_hu(val, 0); + } + + __m128i val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(__m128i v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + val = _v128_setr_h(v0, v1, v2, v3, v4, v5, v6, v7); + } + + short get0() const + { + return (short)__lsx_vpickve2gr_h(val, 0); + } + + __m128i val; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(__m128i v) : val(v) {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + val = _v128_setr_w(v0, v1, v2, v3); + } + + unsigned get0() const + { + return (unsigned)__lsx_vpickve2gr_wu(val, 0); + } + + __m128i val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(__m128i v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + val = _v128_setr_w(v0, v1, v2, v3); + } + + int get0() const + { + return (int)__lsx_vpickve2gr_w(val, 0); + } + + __m128i val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4}; + + v_float32x4() {} + explicit v_float32x4(__m128 v) : val(v) {} + explicit v_float32x4(__m128i v) { val = *((__m128*)&v); } + v_float32x4(float v0, float v1, float v2, float v3) + { + val = _v128_setr_ps(v0, v1, v2, v3); + } + + float get0() const + { + union { int iv; float fv; } d; + d.iv = __lsx_vpickve2gr_w(val, 0); + return d.fv; + } + + int get0toint() const + { + __m128i result = __lsx_vftintrz_w_s(val); + return (int)__lsx_vpickve2gr_w(result, 0); + } + + __m128 val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2}; + + v_uint64x2() {} + explicit v_uint64x2(__m128i v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { + val = _v128_setr_d(v0, v1); + } + + uint64 get0() const + { + return __lsx_vpickve2gr_du(val, 0); + } + + __m128i val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2}; + + v_int64x2() {} + explicit v_int64x2(__m128i v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { + val = _v128_setr_d(v0, v1); + } + + uint64 get0() const + { + return __lsx_vpickve2gr_d(val, 0); + } + + __m128i val; +}; + +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2}; + + v_float64x2() {} + explicit v_float64x2(__m128d v) : val(v) {} + explicit v_float64x2(__m128i v) { val = *((__m128d*)&v); } + v_float64x2(double v0, double v1) + { + val = _v128_setr_pd(v0, v1); + } + + double get0() const + { + union { int64 iv; double fv; } d; + d.iv = __lsx_vpickve2gr_d(val, 0); + return d.fv; + } + + int64 get0toint64() const + { + __m128i result = __lsx_vftintrz_l_d(val); + return (int64)__lsx_vpickve2gr_d(result, 0); + } + + __m128d val; +}; + +////////////// Load and store operations ///////// + +#define OPENCV_HAL_IMPL_LSX_LOADSTORE(_Tpvec, _Tp) \ + inline _Tpvec v_load(const _Tp* ptr) \ + { return _Tpvec(__lsx_vld(ptr, 0)); } \ + inline _Tpvec v_load_aligned(const _Tp* ptr) \ + { return _Tpvec(__lsx_vld(ptr, 0)); } \ + inline _Tpvec v_load_low(const _Tp* ptr) \ + { return _Tpvec(__lsx_vldrepl_d(ptr, 0)); } \ + inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + __m128i vl = __lsx_vldrepl_d(ptr0, 0); \ + __m128i vh = __lsx_vldrepl_d(ptr1, 0); \ + return _Tpvec(__lsx_vilvl_d(vh, vl)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(a.val, ptr, 0); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(a.val, ptr, 0); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst(a.val, ptr, 0); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode)\ + { \ + if ( mode == hal::STORE_UNALIGNED) \ + __lsx_vst(a.val, ptr, 0); \ + else if ( mode == hal::STORE_ALIGNED_NOCACHE) \ + __lsx_vst(a.val, ptr, 0); \ + else \ + __lsx_vst(a.val, ptr, 0); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vstelm_d(a.val, ptr, 0, 0); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vstelm_d(a.val, ptr, 0, 1); } \ + +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_uint8x16, uchar) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_int8x16, schar) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_uint16x8, ushort) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_int16x8, short) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_uint32x4, unsigned) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_int32x4, int) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_uint64x2, uint64) +OPENCV_HAL_IMPL_LSX_LOADSTORE(v_int64x2, int64) + +#define OPENCV_HAL_IMPL_LSX_LOADSTORE_FLT(_Tpvec, _Tp, halfreg) \ + inline _Tpvec v_load(const _Tp* ptr) \ + { return _Tpvec((halfreg)__lsx_vld(ptr, 0)); } \ + inline _Tpvec v_load_aligned(const _Tp* ptr) \ + { return _Tpvec((halfreg)__lsx_vld(ptr, 0)); } \ + inline _Tpvec v_load_low(const _Tp* ptr) \ + { return _Tpvec((halfreg)__lsx_vldrepl_d(ptr, 0)); } \ + inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ + { \ + __m128i vl = __lsx_vldrepl_d(ptr0, 0); \ + __m128i vh = __lsx_vldrepl_d(ptr1, 0); \ + return _Tpvec((halfreg)__lsx_vilvl_d(vh, vl)); \ + } \ + inline void v_store(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst((__m128i)a.val, ptr, 0); } \ + inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst((__m128i)a.val, ptr, 0); } \ + inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vst((__m128i)a.val, ptr, 0); } \ + inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode)\ + { \ + if( mode == hal::STORE_UNALIGNED) \ + __lsx_vst((__m128i)a.val, ptr, 0); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE) \ + __lsx_vst((__m128i)a.val, ptr, 0); \ + else \ + __lsx_vst((__m128i)a.val, ptr, 0); \ + } \ + inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vstelm_d((__m128i)a.val, ptr, 0, 0); } \ + inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ + { __lsx_vstelm_d((__m128i)a.val, ptr, 0, 1); } \ + +OPENCV_HAL_IMPL_LSX_LOADSTORE_FLT(v_float32x4, float, __m128) +OPENCV_HAL_IMPL_LSX_LOADSTORE_FLT(v_float64x2, double, __m128d) + +inline __m128i _lsx_128_castps_si128(const __m128& v) +{ return __m128i(v); } + +inline __m128i _lsx_128_castpd_si128(const __m128d& v) +{ return __m128i(v); } + +#define OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, _Tpvecf, suffix, cast) \ + inline _Tpvec v_reinterpret_as_##suffix(const _Tpvecf& a) \ + { return _Tpvec(cast(a.val)); } + +#define OPENCV_HAL_IMPL_LSX_INIT(_Tpvec, _Tp, suffix, ssuffix, ctype_s) \ + inline _Tpvec v_setzero_##suffix() \ + { return _Tpvec(__lsx_vldi(0)); } \ + inline _Tpvec v_setall_##suffix(_Tp v) \ + { return _Tpvec(__lsx_vreplgr2vr_##ssuffix((ctype_s)v)); } \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint8x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int8x16, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint16x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int16x8, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint32x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int32x4, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint64x2, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int64x2, suffix, OPENCV_HAL_NOP) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_float32x4, suffix, _lsx_128_castps_si128) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_float64x2, suffix, _lsx_128_castpd_si128) \ + +OPENCV_HAL_IMPL_LSX_INIT(v_uint8x16, uchar, u8, b, int) +OPENCV_HAL_IMPL_LSX_INIT(v_int8x16, schar, s8, b, int) +OPENCV_HAL_IMPL_LSX_INIT(v_uint16x8, ushort, u16, h, int) +OPENCV_HAL_IMPL_LSX_INIT(v_int16x8, short, s16, h, int) +OPENCV_HAL_IMPL_LSX_INIT(v_uint32x4, unsigned, u32, w, int) +OPENCV_HAL_IMPL_LSX_INIT(v_int32x4, int, s32, w, int) +OPENCV_HAL_IMPL_LSX_INIT(v_uint64x2, uint64, u64, d, long int) +OPENCV_HAL_IMPL_LSX_INIT(v_int64x2, int64, s64, d, long int) + +inline __m128 _lsx_128_castsi128_ps(const __m128i &v) +{ return __m128(v); } + +inline __m128d _lsx_128_castsi128_pd(const __m128i &v) +{ return __m128d(v); } + +#define OPENCV_HAL_IMPL_LSX_INIT_FLT(_Tpvec, _Tp, suffix, zsuffix, cast) \ + inline _Tpvec v_setzero_##suffix() \ + { return _Tpvec(__lsx_vldi(0)); } \ + inline _Tpvec v_setall_##suffix(_Tp v) \ + { return _Tpvec(_v128_setall_##zsuffix(v)); } \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint8x16, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int8x16, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint16x8, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int16x8, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint32x4, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int32x4, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_uint64x2, suffix, cast) \ + OPENCV_HAL_IMPL_LSX_CAST(_Tpvec, v_int64x2, suffix, cast) \ + +OPENCV_HAL_IMPL_LSX_INIT_FLT(v_float32x4, float, f32, ps, _lsx_128_castsi128_ps) +OPENCV_HAL_IMPL_LSX_INIT_FLT(v_float64x2, double, f64, pd, _lsx_128_castsi128_pd) + +inline v_float32x4 v_reinterpret_as_f32(const v_float32x4& a) +{ return a; } +inline v_float32x4 v_reinterpret_as_f32(const v_float64x2& a) +{ return v_float32x4(_lsx_128_castps_si128(__m128(a.val))); } + +inline v_float64x2 v_reinterpret_as_f64(const v_float64x2& a) +{ return a; } +inline v_float64x2 v_reinterpret_as_f64(const v_float32x4& a) +{ return v_float64x2(_lsx_128_castpd_si128(__m128d(a.val))); } + +//////////////// Variant Value reordering /////////////// + +// unpacks +#define OPENCV_HAL_IMPL_LSX_UNPACK(_Tpvec, suffix) \ + inline _Tpvec v128_unpacklo(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lsx_vilvl_##suffix(__m128i(b.val), __m128i(a.val))); } \ + inline _Tpvec v128_unpackhi(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lsx_vilvh_##suffix(__m128i(b.val), __m128i(a.val))); } \ + +OPENCV_HAL_IMPL_LSX_UNPACK(v_uint8x16, b) +OPENCV_HAL_IMPL_LSX_UNPACK(v_int8x16, b) +OPENCV_HAL_IMPL_LSX_UNPACK(v_uint16x8, h) +OPENCV_HAL_IMPL_LSX_UNPACK(v_int16x8, h) +OPENCV_HAL_IMPL_LSX_UNPACK(v_uint32x4, w) +OPENCV_HAL_IMPL_LSX_UNPACK(v_int32x4, w) +OPENCV_HAL_IMPL_LSX_UNPACK(v_uint64x2, d) +OPENCV_HAL_IMPL_LSX_UNPACK(v_int64x2, d) +OPENCV_HAL_IMPL_LSX_UNPACK(v_float32x4, w) +OPENCV_HAL_IMPL_LSX_UNPACK(v_float64x2, d) + +//ZIP +#define OPENCV_HAL_IMPL_LSX_ZIP(_Tpvec) \ + inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ + { return (_Tpvec)__lsx_vilvl_d((__m128i)b.val, (__m128i)a.val); } \ + inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ + { return (_Tpvec)__lsx_vilvh_d((__m128i)b.val, (__m128i)a.val); } \ + inline void v_recombine(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ + { \ + __m128i a1 = (__m128i)a.val, b1 = (__m128i)b.val; \ + c = _Tpvec(__lsx_vilvl_d(b1, a1)); \ + d = _Tpvec(__lsx_vilvh_d(b1, a1)); \ + } \ + inline void v_zip(const _Tpvec& a, const _Tpvec& b, \ + _Tpvec& ab0, _Tpvec& ab1) \ + { \ + ab0 = v128_unpacklo(a, b); \ + ab1 = v128_unpackhi(a, b); \ + } + +OPENCV_HAL_IMPL_LSX_ZIP(v_uint8x16) +OPENCV_HAL_IMPL_LSX_ZIP(v_int8x16) +OPENCV_HAL_IMPL_LSX_ZIP(v_uint16x8) +OPENCV_HAL_IMPL_LSX_ZIP(v_int16x8) +OPENCV_HAL_IMPL_LSX_ZIP(v_uint32x4) +OPENCV_HAL_IMPL_LSX_ZIP(v_int32x4) +OPENCV_HAL_IMPL_LSX_ZIP(v_uint64x2) +OPENCV_HAL_IMPL_LSX_ZIP(v_int64x2) +OPENCV_HAL_IMPL_LSX_ZIP(v_float32x4) +OPENCV_HAL_IMPL_LSX_ZIP(v_float64x2) + +////////// Arithmetic, bitwise and comparison operations ///////// + +/** Arithmetics **/ +#define OPENCV_HAL_IMPL_LSX_BIN_OP(bin_op, _Tpvec, intrin) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { a.val = intrin(a.val, b.val); return a; } + +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_uint8x16, __lsx_vsadd_bu) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_uint8x16, __lsx_vssub_bu) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_int8x16, __lsx_vsadd_b) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_int8x16, __lsx_vssub_b) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_uint16x8, __lsx_vsadd_hu) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_uint16x8, __lsx_vssub_hu) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_int16x8, __lsx_vsadd_h) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_int16x8, __lsx_vssub_h) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_uint32x4, __lsx_vadd_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_uint32x4, __lsx_vsub_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(*, v_uint32x4, __lsx_vmul_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_int32x4, __lsx_vadd_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_int32x4, __lsx_vsub_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(*, v_int32x4, __lsx_vmul_w) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_uint64x2, __lsx_vadd_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_uint64x2, __lsx_vsub_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_int64x2, __lsx_vadd_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_int64x2, __lsx_vsub_d) + +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_float32x4, __lsx_vfadd_s) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_float32x4, __lsx_vfsub_s) +OPENCV_HAL_IMPL_LSX_BIN_OP(*, v_float32x4, __lsx_vfmul_s) +OPENCV_HAL_IMPL_LSX_BIN_OP(/, v_float32x4, __lsx_vfdiv_s) +OPENCV_HAL_IMPL_LSX_BIN_OP(+, v_float64x2, __lsx_vfadd_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(-, v_float64x2, __lsx_vfsub_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(*, v_float64x2, __lsx_vfmul_d) +OPENCV_HAL_IMPL_LSX_BIN_OP(/, v_float64x2, __lsx_vfdiv_d) + +// saturating multiply 8-bit, 16-bit +inline v_uint8x16 operator * (const v_uint8x16& a, const v_uint8x16& b) +{ + v_uint16x8 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_int8x16 operator * (const v_int8x16& a, const v_int8x16& b) +{ + v_int16x8 c, d; + v_mul_expand(a, b, c, d); + return v_pack(c, d); +} +inline v_uint16x8 operator * (const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i pev = __lsx_vmulwev_w_hu(a0, b0); + __m128i pod = __lsx_vmulwod_w_hu(a0, b0); + __m128i pl = __lsx_vilvl_w(pod, pev); + __m128i ph = __lsx_vilvh_w(pod, pev); + return (v_uint16x8)__lsx_vssrlrni_hu_w(ph, pl, 0); +} +inline v_int16x8 operator * (const v_int16x8& a, const v_int16x8& b) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i pev = __lsx_vmulwev_w_h(a0, b0); + __m128i pod = __lsx_vmulwod_w_h(a0, b0); + __m128i pl = __lsx_vilvl_w(pod, pev); + __m128i ph = __lsx_vilvh_w(pod, pev); + return (v_int16x8)__lsx_vssrarni_h_w(ph, pl, 0); +} +inline v_uint8x16& operator *= (v_uint8x16& a, const v_uint8x16& b) +{ a = a * b; return a; } +inline v_int8x16& operator *= (v_int8x16& a, const v_int8x16& b) +{ a = a * b; return a; } +inline v_uint16x8& operator *= (v_uint16x8& a, const v_uint16x8& b) +{ a = a * b; return a; } +inline v_int16x8& operator *= (v_int16x8& a, const v_int16x8& b) +{ a = a * b; return a; } + +/** Non-saturating arithmetics **/ + +#define OPENCV_HAL_IMPL_LSX_BIN_FUNC(func, _Tpvec, intrin) \ + inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin(a.val, b.val)); } \ + +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_add_wrap, v_uint8x16, __lsx_vadd_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_add_wrap, v_int8x16, __lsx_vadd_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_add_wrap, v_uint16x8, __lsx_vadd_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_add_wrap, v_int16x8, __lsx_vadd_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_sub_wrap, v_uint8x16, __lsx_vsub_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_sub_wrap, v_int8x16, __lsx_vsub_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_sub_wrap, v_uint16x8, __lsx_vsub_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_sub_wrap, v_int16x8, __lsx_vsub_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_mul_wrap, v_uint16x8, __lsx_vmul_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_mul_wrap, v_int16x8, __lsx_vmul_h) + +inline v_uint8x16 v_mul_wrap(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_h_bu(a0, b0); + __m128i p1 = __lsx_vmulwod_h_bu(a0, b0); + return v_uint8x16(__lsx_vpackev_b(p1, p0)); +} + +inline v_int8x16 v_mul_wrap(const v_int8x16& a, const v_int8x16& b) +{ + return v_reinterpret_as_s8(v_mul_wrap(v_reinterpret_as_u8(a), v_reinterpret_as_u8(b))); +} + +// Multiply and expand +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_h_bu(a0, b0); + __m128i p1 = __lsx_vmulwod_h_bu(a0, b0); + c.val = __lsx_vilvl_h(p1, p0); + d.val = __lsx_vilvh_h(p1, p0); +} +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_h_b(a0, b0); + __m128i p1 = __lsx_vmulwod_h_b(a0, b0); + c.val = __lsx_vilvl_h(p1, p0); + d.val = __lsx_vilvh_h(p1, p0); +} +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_w_h(a0, b0); + __m128i p1 = __lsx_vmulwod_w_h(a0, b0); + c.val = __lsx_vilvl_w(p1, p0); + d.val = __lsx_vilvh_w(p1, p0); +} +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_w_hu(a0, b0); + __m128i p1 = __lsx_vmulwod_w_hu(a0, b0); + c.val = __lsx_vilvl_w(p1, p0); + d.val = __lsx_vilvh_w(p1, p0); +} +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + __m128i a0 = a.val, b0 = b.val; + __m128i p0 = __lsx_vmulwev_d_wu(a0, b0); + __m128i p1 = __lsx_vmulwod_d_wu(a0, b0); + c.val = __lsx_vilvl_d(p1, p0); + d.val = __lsx_vilvh_d(p1, p0); +} +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ return v_int16x8(__lsx_vmuh_h(a.val, b.val)); } +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ return v_uint16x8(__lsx_vmuh_hu(a.val, b.val)); } + +/** Bitwise shifts **/ +#define OPENCV_HAL_IMPL_LSX_SHIFT_OP(_Tpuvec, _Tpsvec, suffix, srai) \ + inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ + { return _Tpuvec(__lsx_vsll_##suffix(a.val, __lsx_vreplgr2vr_##suffix(imm))); } \ + inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ + { return _Tpsvec(__lsx_vsll_##suffix(a.val, __lsx_vreplgr2vr_##suffix(imm))); } \ + inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ + { return _Tpuvec(__lsx_vsrl_##suffix(a.val, __lsx_vreplgr2vr_##suffix(imm))); } \ + inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ + { return _Tpsvec(srai(a.val, __lsx_vreplgr2vr_##suffix(imm))); } \ + template \ + inline _Tpuvec v_shl(const _Tpuvec& a) \ + { return _Tpuvec(__lsx_vslli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shl(const _Tpsvec& a) \ + { return _Tpsvec(__lsx_vslli_##suffix(a.val, imm)); } \ + template \ + inline _Tpuvec v_shr(const _Tpuvec& a) \ + { return _Tpuvec(__lsx_vsrli_##suffix(a.val, imm)); } \ + template \ + inline _Tpsvec v_shr(const _Tpsvec& a) \ + { return _Tpsvec(__lsx_vsrai_##suffix(a.val, imm)); } \ + +OPENCV_HAL_IMPL_LSX_SHIFT_OP(v_uint16x8, v_int16x8, h, __lsx_vsra_h) +OPENCV_HAL_IMPL_LSX_SHIFT_OP(v_uint32x4, v_int32x4, w, __lsx_vsra_w) +OPENCV_HAL_IMPL_LSX_SHIFT_OP(v_uint64x2, v_int64x2, d, __lsx_vsra_d) + +/** Bitwise logic **/ +#define OPENCV_HAL_IMPL_LSX_LOGIC_OP(_Tpvec, suffix) \ + OPENCV_HAL_IMPL_LSX_BIN_OP(&, _Tpvec, __lsx_vand_##suffix) \ + OPENCV_HAL_IMPL_LSX_BIN_OP(|, _Tpvec, __lsx_vor_##suffix) \ + OPENCV_HAL_IMPL_LSX_BIN_OP(^, _Tpvec, __lsx_vxor_##suffix) \ + inline _Tpvec operator ~(const _Tpvec& a) \ + { return _Tpvec(__lsx_vnori_b(a.val, 0)); } \ + +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_uint8x16, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_int8x16, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_uint16x8, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_int16x8, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_uint32x4, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_int32x4, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_uint64x2, v) +OPENCV_HAL_IMPL_LSX_LOGIC_OP(v_int64x2, v) + +#define OPENCV_HAL_IMPL_LSX_FLOAT_BIN_OP(bin_op, _Tpvec, intrin, cast) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(intrin((__m128i)(a.val), (__m128i)(b.val))); } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { __m128i c = intrin((__m128i)(a.val), (__m128i)b.val); \ + a.val = cast(c); \ + return a;} + +#define OPENCV_HAL_IMPL_LSX_FLOAT_LOGIC_OP(_Tpvec, cast) \ + OPENCV_HAL_IMPL_LSX_FLOAT_BIN_OP(&, _Tpvec, __lsx_vand_v, cast) \ + OPENCV_HAL_IMPL_LSX_FLOAT_BIN_OP(|, _Tpvec, __lsx_vor_v, cast) \ + OPENCV_HAL_IMPL_LSX_FLOAT_BIN_OP(^, _Tpvec, __lsx_vxor_v, cast) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { return _Tpvec(__lsx_vnori_b((__m128i)(a.val), 0)); } \ + +OPENCV_HAL_IMPL_LSX_FLOAT_LOGIC_OP(v_float32x4, _lsx_128_castsi128_ps) +OPENCV_HAL_IMPL_LSX_FLOAT_LOGIC_OP(v_float64x2, _lsx_128_castsi128_pd) + +/** Select **/ +#define OPENCV_HAL_IMPL_LSX_SELECT(_Tpvec) \ + inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lsx_vbitsel_v(b.val, a.val, mask.val)); } \ + +OPENCV_HAL_IMPL_LSX_SELECT(v_uint8x16) +OPENCV_HAL_IMPL_LSX_SELECT(v_int8x16) +OPENCV_HAL_IMPL_LSX_SELECT(v_uint16x8) +OPENCV_HAL_IMPL_LSX_SELECT(v_int16x8) +OPENCV_HAL_IMPL_LSX_SELECT(v_uint32x4) +OPENCV_HAL_IMPL_LSX_SELECT(v_int32x4) + +inline v_float32x4 v_select(const v_float32x4 &mask, const v_float32x4 &a, const v_float32x4 &b) +{ return v_float32x4(__lsx_vbitsel_v((__m128i)b.val, (__m128i)a.val, (__m128i)mask.val)); } +inline v_float64x2 v_select(const v_float64x2 &mask, const v_float64x2 &a, const v_float64x2 &b) +{ return v_float64x2(__lsx_vbitsel_v((__m128i)b.val, (__m128i)a.val, (__m128i)mask.val)); } + +/** Comparison **/ +#define OPENCV_HAL_IMPL_LSX_CMP_OP_OV(_Tpvec) \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~( a == b ); } \ + inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ + { return b > a ; } \ + inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a < b); } \ + inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ + { return b >= a; } \ + +#define OPENCV_HAL_IMPL_LSX_CMP_OP_INT(_Tpuvec, _Tpsvec, suffix, usuffix) \ + inline _Tpuvec operator == (const _Tpuvec& a, const _Tpuvec& b) \ + { return _Tpuvec(__lsx_vseq_##suffix(a.val, b.val)); } \ + inline _Tpuvec operator > (const _Tpuvec& a, const _Tpuvec& b) \ + { return _Tpuvec(__lsx_vslt_##usuffix(b.val, a.val)); } \ + inline _Tpsvec operator == (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(__lsx_vseq_##suffix(a.val, b.val)); } \ + inline _Tpsvec operator > (const _Tpsvec& a, const _Tpsvec& b) \ + { return _Tpsvec(__lsx_vslt_##suffix(b.val, a.val)); } \ + OPENCV_HAL_IMPL_LSX_CMP_OP_OV(_Tpuvec) \ + OPENCV_HAL_IMPL_LSX_CMP_OP_OV(_Tpsvec) + +OPENCV_HAL_IMPL_LSX_CMP_OP_INT(v_uint8x16, v_int8x16, b, bu) +OPENCV_HAL_IMPL_LSX_CMP_OP_INT(v_uint16x8, v_int16x8, h, hu) +OPENCV_HAL_IMPL_LSX_CMP_OP_INT(v_uint32x4, v_int32x4, w, wu) + +#define OPENCV_HAL_IMPL_LSX_CMP_OP_64BIT(_Tpvec, suffix) \ + inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lsx_vseq_##suffix(a.val, b.val)); } \ + inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ + { return ~(a == b); } + +OPENCV_HAL_IMPL_LSX_CMP_OP_64BIT(v_uint64x2, d) +OPENCV_HAL_IMPL_LSX_CMP_OP_64BIT(v_int64x2, d) + +#define OPENCV_HAL_IMPL_LSX_CMP_FLT(bin_op, suffix, _Tpvec, ssuffix) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { return _Tpvec(__lsx_##suffix##_##ssuffix(a.val, b.val)); } \ + +#define OPENCV_HAL_IMPL_LSX_CMP_OP_FLT(_Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LSX_CMP_FLT(==, vfcmp_ceq, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LSX_CMP_FLT(!=, vfcmp_cne, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LSX_CMP_FLT(<, vfcmp_clt, _Tpvec, ssuffix) \ + OPENCV_HAL_IMPL_LSX_CMP_FLT(<=, vfcmp_cle, _Tpvec, ssuffix) \ + +OPENCV_HAL_IMPL_LSX_CMP_OP_FLT(v_float32x4, s) +OPENCV_HAL_IMPL_LSX_CMP_OP_FLT(v_float64x2, d) + +inline v_float32x4 operator > (const v_float32x4 &a, const v_float32x4 &b) +{ return v_float32x4(__lsx_vfcmp_clt_s(b.val, a.val)); } + +inline v_float32x4 operator >= (const v_float32x4 &a, const v_float32x4 &b) +{ return v_float32x4(__lsx_vfcmp_cle_s(b.val, a.val)); } + +inline v_float64x2 operator > (const v_float64x2 &a, const v_float64x2 &b) +{ return v_float64x2(__lsx_vfcmp_clt_d(b.val, a.val)); } + +inline v_float64x2 operator >= (const v_float64x2 &a, const v_float64x2 &b) +{ return v_float64x2(__lsx_vfcmp_cle_d(b.val, a.val)); } + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return v_float32x4(__lsx_vfcmp_cor_s(a.val, a.val)); } + +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return v_float64x2(__lsx_vfcmp_cor_d(a.val, a.val)); } + +/** min/max **/ +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_uint8x16, __lsx_vmin_bu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_uint8x16, __lsx_vmax_bu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_int8x16, __lsx_vmin_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_int8x16, __lsx_vmax_b) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_uint16x8, __lsx_vmin_hu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_uint16x8, __lsx_vmax_hu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_int16x8, __lsx_vmin_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_int16x8, __lsx_vmax_h) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_uint32x4, __lsx_vmin_wu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_uint32x4, __lsx_vmax_wu) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_int32x4, __lsx_vmin_w) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_int32x4, __lsx_vmax_w) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_float32x4, __lsx_vfmin_s) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_float32x4, __lsx_vfmax_s) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_min, v_float64x2, __lsx_vfmin_d) +OPENCV_HAL_IMPL_LSX_BIN_FUNC(v_max, v_float64x2, __lsx_vfmax_d) + +template 16)), + bool is_first = (imm == 0), + bool is_half = (imm == 8), + bool is_second = (imm == 16), + bool is_other = (((imm > 0) && (imm < 8)) || ((imm > 8) && (imm < 16)))> +class v_lsx_palignr_u8_class; + +template +class v_lsx_palignr_u8_class; + +template +class v_lsx_palignr_u8_class +{ +public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + return a; + } +}; + +template +class v_lsx_palignr_u8_class +{ +public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + return __lsx_vshuf4i_d(a, b, 0x9); + } +}; + +template +class v_lsx_palignr_u8_class +{ +public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + return b; + } +}; + +template +class v_lsx_palignr_u8_class +{ +public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + enum { imm2 = (sizeof(__m128i) - imm) }; + return __lsx_vor_v(__lsx_vbsrl_v(a, imm), __lsx_vbsll_v(b, imm2)); + } +}; + +template +inline __m128i v_lsx_palignr_u8(const __m128i& a, const __m128i& b) +{ + CV_StaticAssert((imm >= 0) && (imm <= 16), "Invalid imm for v_lsx_palignr_u8"); + return v_lsx_palignr_u8_class()(a, b); +} +/** Rotate **/ +#define OPENCV_HAL_IMPL_LSX_ROTATE_CAST(_Tpvec, cast) \ + template \ + inline _Tpvec v_rotate_right(const _Tpvec &a) \ + { \ + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type))}; \ + __m128i ret = __lsx_vbsrl_v((__m128i)a.val, imm2); \ + return _Tpvec(cast(ret)); \ + } \ + template \ + inline _Tpvec v_rotate_left(const _Tpvec &a) \ + { \ + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type))}; \ + __m128i ret = __lsx_vbsll_v((__m128i)a.val, imm2); \ + return _Tpvec(cast(ret)); \ + } \ + template \ + inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ + { \ + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type))}; \ + return _Tpvec(cast(v_lsx_palignr_u8((__m128i)a.val, (__m128i)b.val))); \ + } \ + template \ + inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ + { \ + enum { imm2 = ((_Tpvec::nlanes - imm) * sizeof(typename _Tpvec::lane_type))}; \ + return _Tpvec(cast(v_lsx_palignr_u8((__m128i)b.val, (__m128i)a.val))); \ + } + +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_uint8x16, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_int8x16, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_uint16x8, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_int16x8, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_uint32x4, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_int32x4, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_uint64x2, OPENCV_HAL_NOP) \ +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_int64x2, OPENCV_HAL_NOP) \ + +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_float32x4, _lsx_128_castsi128_ps) +OPENCV_HAL_IMPL_LSX_ROTATE_CAST(v_float64x2, _lsx_128_castsi128_pd) + +/** Rverse **/ +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ + __m128i vec = __lsx_vshuf4i_b(a.val, 0x1B); + return v_uint8x16(__lsx_vshuf4i_w(vec, 0x1B)); +} + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ + __m128i vec = __lsx_vshuf4i_h(a.val, 0x1B); + return v_uint16x8(__lsx_vshuf4i_w(vec, 0x4E)); +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ return v_uint32x4(__lsx_vshuf4i_w(a.val, 0x1B)); } + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_int32x4(__lsx_vshuf4i_w(a.val, 0x1B)); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ return v_uint64x2(__lsx_vshuf4i_w(a.val, 0x4E)); } + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_int64x2(__lsx_vshuf4i_w(a.val, 0x4E)); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +////////////// Reduce and mask //////////// + +/** Reduce **/ +// this function is return a[0]+a[1]+...+a[31] +inline unsigned v_reduce_sum(const v_uint8x16& a) +{ + __m128i t1 = __lsx_vhaddw_hu_bu(a.val, a.val); + __m128i t2 = __lsx_vhaddw_wu_hu(t1, t1); + __m128i t3 = __lsx_vhaddw_du_wu(t2, t2); + __m128i t4 = __lsx_vhaddw_qu_du(t3, t3); + return (unsigned)__lsx_vpickve2gr_w(t4, 0); +} + +inline int v_reduce_sum(const v_int8x16 &a) +{ + __m128i t1 = __lsx_vhaddw_h_b(a.val, a.val); + __m128i t2 = __lsx_vhaddw_w_h(t1, t1); + __m128i t3 = __lsx_vhaddw_d_w(t2, t2); + __m128i t4 = __lsx_vhaddw_q_d(t3, t3); + return (int)__lsx_vpickve2gr_w(t4, 0); +} + +#define OPENCV_HAL_IMPL_LSX_REDUCE_16(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec& a) \ + { \ + __m128i val = intrin(a.val, __lsx_vbsrl_v(a.val, 8)); \ + val = intrin(val, __lsx_vbsrl_v(val, 4)); \ + val = intrin(val, __lsx_vbsrl_v(val, 2)); \ + val = intrin(val, __lsx_vbsrl_v(val, 1)); \ + return (sctype)__lsx_vpickve2gr_b(val, 0); \ + } + +OPENCV_HAL_IMPL_LSX_REDUCE_16(v_uint8x16, uchar, min, __lsx_vmin_bu) +OPENCV_HAL_IMPL_LSX_REDUCE_16(v_uint8x16, uchar, max, __lsx_vmax_bu) +OPENCV_HAL_IMPL_LSX_REDUCE_16(v_int8x16, schar, min, __lsx_vmin_b) +OPENCV_HAL_IMPL_LSX_REDUCE_16(v_int8x16, schar, max, __lsx_vmax_b) + +#define OPENCV_HAL_IMPL_LSX_REDUCE_8(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec &a) \ + { \ + __m128i val = intrin(a.val, __lsx_vbsrl_v(a.val, 8)); \ + val = intrin(val, __lsx_vbsrl_v(val, 4)); \ + val = intrin(val, __lsx_vbsrl_v(val, 2)); \ + return (sctype)__lsx_vpickve2gr_h(val, 0); \ + } + +OPENCV_HAL_IMPL_LSX_REDUCE_8(v_uint16x8, ushort, min, __lsx_vmin_hu) +OPENCV_HAL_IMPL_LSX_REDUCE_8(v_uint16x8, ushort, max, __lsx_vmax_hu) +OPENCV_HAL_IMPL_LSX_REDUCE_8(v_int16x8, short, min, __lsx_vmin_h) +OPENCV_HAL_IMPL_LSX_REDUCE_8(v_int16x8, short, max, __lsx_vmax_h) + +#define OPENCV_HAL_IMPL_LSX_REDUCE_4(_Tpvec, sctype, func, intrin) \ + inline sctype v_reduce_##func(const _Tpvec &a) \ + { \ + __m128i val = intrin(a.val, __lsx_vbsrl_v(a.val, 8)); \ + val = intrin(val, __lsx_vbsrl_v(val, 4)); \ + return (sctype)__lsx_vpickve2gr_w(val, 0); \ + } + +OPENCV_HAL_IMPL_LSX_REDUCE_4(v_uint32x4, unsigned, min, __lsx_vmin_wu) +OPENCV_HAL_IMPL_LSX_REDUCE_4(v_uint32x4, unsigned, max, __lsx_vmax_wu) +OPENCV_HAL_IMPL_LSX_REDUCE_4(v_int32x4, int, min, __lsx_vmin_w) +OPENCV_HAL_IMPL_LSX_REDUCE_4(v_int32x4, int, max, __lsx_vmax_w) + +#define OPENCV_HAL_IMPL_LSX_REDUCE_FLT(func, intrin) \ + inline float v_reduce_##func(const v_float32x4 &a) \ + { \ + __m128 val = a.val; \ + val = intrin(val, (__m128)__lsx_vbsrl_v((__m128i)val, 8)); \ + val = intrin(val, (__m128)__lsx_vbsrl_v((__m128i)val, 4)); \ + float *fval = (float*)&val; \ + return fval[0]; \ + } + +OPENCV_HAL_IMPL_LSX_REDUCE_FLT(min, __lsx_vfmin_s) +OPENCV_HAL_IMPL_LSX_REDUCE_FLT(max, __lsx_vfmax_s) + +inline int v_reduce_sum(const v_int32x4 &a) +{ + __m128i t1 = __lsx_vhaddw_d_w(a.val, a.val); + __m128i t2 = __lsx_vhaddw_q_d(t1, t1); + return (int)__lsx_vpickve2gr_w(t2, 0); +} + +inline unsigned v_reduce_sum(const v_uint32x4 &a) +{ + __m128i t1 = __lsx_vhaddw_du_wu(a.val, a.val); + __m128i t2 = __lsx_vhaddw_qu_du(t1, t1); + return (int)__lsx_vpickve2gr_w(t2, 0); +} + +inline int v_reduce_sum(const v_int16x8 &a) +{ + __m128i t1 = __lsx_vhaddw_w_h(a.val, a.val); + __m128i t2 = __lsx_vhaddw_d_w(t1, t1); + __m128i t3 = __lsx_vhaddw_q_d(t2, t2); + return (int)__lsx_vpickve2gr_w(t3, 0); +} + +inline unsigned v_reduce_sum(const v_uint16x8 &a) +{ + __m128i t1 = __lsx_vhaddw_wu_hu(a.val, a.val); + __m128i t2 = __lsx_vhaddw_du_wu(t1, t1); + __m128i t3 = __lsx_vhaddw_qu_du(t2, t2); + return (int)__lsx_vpickve2gr_w(t3, 0); +} + +inline float v_reduce_sum(const v_float32x4 &a) +{ + __m128i val = (__m128i)a.val; + val = __lsx_vbsrl_v(val, 8); + __m128 result = __lsx_vfadd_s(a.val, (__m128)val); + float *pa = (float*)&result; + return (float)(pa[0] + pa[1]); +} + +inline uint64 v_reduce_sum(const v_uint64x2 &a) +{ + __m128i t0 = __lsx_vhaddw_qu_du(a.val, a.val); + return (uint64)__lsx_vpickve2gr_du(t0, 0); +} + +inline int64 v_reduce_sum(const v_int64x2 &a) +{ + __m128i t0 = __lsx_vhaddw_q_d(a.val, a.val); + return (int64)__lsx_vpickve2gr_d(t0, 0); +} + +inline double v_reduce_sum(const v_float64x2 &a) +{ + double *pa = (double*)&a; + return pa[0] + pa[1]; +} + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + __m128i a0 = (__m128i)a.val; + __m128i b0 = (__m128i)b.val; + __m128i c0 = (__m128i)c.val; + __m128i d0 = (__m128i)d.val; + __m128i ac_l = __lsx_vilvl_w(c0, a0); + __m128i ac_h = __lsx_vilvh_w(c0, a0); + __m128i bd_l = __lsx_vilvl_w(d0, b0); + __m128i bd_h = __lsx_vilvh_w(d0, b0); + __m128 ac = __lsx_vfadd_s((__m128)ac_l, (__m128)ac_h); + __m128 bd = __lsx_vfadd_s((__m128)bd_l, (__m128)bd_h); + return v_float32x4(__lsx_vfadd_s((__m128)__lsx_vilvl_w((__m128i)bd, (__m128i)ac), + (__m128)__lsx_vilvh_w((__m128i)bd, (__m128i)ac))); +} + +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ + __m128i t0 = __lsx_vabsd_b(a.val, b.val); + __m128i t1 = __lsx_vhaddw_hu_bu(t0, t0); + __m128i t2 = __lsx_vhaddw_wu_hu(t1, t1); + __m128i t3 = __lsx_vhaddw_du_wu(t2, t2); + __m128i t4 = __lsx_vhaddw_qu_du(t3, t3); + return (unsigned)__lsx_vpickve2gr_w(t4, 0); +} + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i t0 = __lsx_vabsd_bu(a.val, b.val); + __m128i t1 = __lsx_vhaddw_hu_bu(t0, t0); + __m128i t2 = __lsx_vhaddw_wu_hu(t1, t1); + __m128i t3 = __lsx_vhaddw_du_wu(t2, t2); + __m128i t4 = __lsx_vhaddw_qu_du(t3, t3); + return (unsigned)__lsx_vpickve2gr_w(t4, 0); +} + +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i t0 = __lsx_vabsd_hu(a.val, b.val); + __m128i t1 = __lsx_vhaddw_wu_hu(t0, t0); + __m128i t2 = __lsx_vhaddw_du_wu(t1, t1); + __m128i t3 = __lsx_vhaddw_qu_du(t2, t2); + return (unsigned)__lsx_vpickve2gr_w(t3, 0); +} + +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ + __m128i t0 = __lsx_vabsd_h(a.val, b.val); + __m128i t1 = __lsx_vhaddw_wu_hu(t0, t0); + __m128i t2 = __lsx_vhaddw_du_wu(t1, t1); + __m128i t3 = __lsx_vhaddw_qu_du(t2, t2); + return (unsigned)__lsx_vpickve2gr_w(t3, 0); +} + +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ + __m128i t0 = __lsx_vabsd_wu(a.val, b.val); + __m128i t1 = __lsx_vhaddw_du_wu(t0, t0); + __m128i t2 = __lsx_vhaddw_qu_du(t1, t1); + return (unsigned)__lsx_vpickve2gr_w(t2, 0); +} + +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ + __m128i t0 = __lsx_vabsd_w(a.val, b.val); + __m128i t1 = __lsx_vhaddw_du_wu(t0, t0); + __m128i t2 = __lsx_vhaddw_qu_du(t1, t1); + return (unsigned)__lsx_vpickve2gr_w(t2, 0); +} + +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + v_float32x4 a_b = a - b; + return v_reduce_sum(v_float32x4((__m128i)a_b.val & __lsx_vreplgr2vr_w(0x7fffffff))); +} + +/** Popcount **/ +#define OPENCV_HAL_IMPL_LSX_POPCOUNT(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_popcount(const _Tp& a) \ +{ return _Tpvec(__lsx_vpcnt_##suffix(a.val)); } + +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint8x16, v_uint8x16, b); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint8x16, v_int8x16, b); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint16x8, v_uint16x8, h); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint16x8, v_int16x8, h); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint32x4, v_uint32x4, w); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint32x4, v_int32x4, w); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint64x2, v_uint64x2, d); +OPENCV_HAL_IMPL_LSX_POPCOUNT(v_uint64x2, v_int64x2, d); + +/** Mask **/ +#define OPENCV_HAL_IMPL_REINTERPRET_INT(ft, tt) \ +inline tt reinterpret_int(ft x) { union {ft l; tt i;} v; v.l = x; return v.i; } +OPENCV_HAL_IMPL_REINTERPRET_INT(uchar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(schar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(ushort, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(short, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(unsigned, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(int, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(float, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(uint64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(int64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(double, int64) + +inline int v_signmask(const v_int8x16& a) +{ + __m128i result = __lsx_vmskltz_b(a.val); + return __lsx_vpickve2gr_w(result, 0); +} +inline int v_signmask(const v_uint8x16& a) +{ return v_signmask(v_reinterpret_as_s8(a)) ;} + +inline int v_signmask(const v_int16x8 &a) +{ + __m128i result = __lsx_vmskltz_h(a.val); + return __lsx_vpickve2gr_w(result, 0); +} +inline int v_signmask(const v_uint16x8 &a) +{ return v_signmask(v_reinterpret_as_s16(a)); } + +inline int v_signmask(const v_uint32x4& a) +{ + __m128i result = __lsx_vmskltz_w(a.val); + return __lsx_vpickve2gr_w(result, 0); +} +inline int v_signmask(const v_int32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } + +inline int v_signmask(const v_uint64x2& a) +{ + __m128i result = __lsx_vmskltz_d(a.val); + return __lsx_vpickve2gr_w(result, 0); +} +inline int v_signmask(const v_int64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } + +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(*(v_int32x4*)(&a)); } + +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(*(v_int64x2*)(&a)); } + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } + +/** Checks **/ +#define OPENCV_HAL_IMPL_LSX_CHECK(_Tpvec, allmask) \ + inline bool v_check_all(const _Tpvec& a) { return v_signmask(a) == allmask; } \ + inline bool v_check_any(const _Tpvec& a) { return v_signmask(a) != 0; } +OPENCV_HAL_IMPL_LSX_CHECK(v_uint8x16, 65535) +OPENCV_HAL_IMPL_LSX_CHECK(v_int8x16, 65535) +OPENCV_HAL_IMPL_LSX_CHECK(v_uint16x8, 255); +OPENCV_HAL_IMPL_LSX_CHECK(v_int16x8, 255); +OPENCV_HAL_IMPL_LSX_CHECK(v_uint32x4, 15) +OPENCV_HAL_IMPL_LSX_CHECK(v_int32x4, 15) +OPENCV_HAL_IMPL_LSX_CHECK(v_uint64x2, 3) +OPENCV_HAL_IMPL_LSX_CHECK(v_int64x2, 3) +OPENCV_HAL_IMPL_LSX_CHECK(v_float32x4, 15) +OPENCV_HAL_IMPL_LSX_CHECK(v_float64x2, 3) + +///////////// Other math ///////////// + +/** Some frequent operations **/ +#define OPENCV_HAL_IMPL_LSX_MULADD(_Tpvec, suffix) \ + inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ + { return _Tpvec(__lsx_vfmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec &b, const _Tpvec& c) \ + { return _Tpvec(__lsx_vfmadd_##suffix(a.val, b.val, c.val)); } \ + inline _Tpvec v_sqrt(const _Tpvec& x) \ + { return _Tpvec(__lsx_vfsqrt_##suffix(x.val)); } \ + inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_fma(a, a, b * b); } \ + inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ + { return v_sqrt(v_fma(a, a, b * b)); } + +OPENCV_HAL_IMPL_LSX_MULADD(v_float32x4, s) +OPENCV_HAL_IMPL_LSX_MULADD(v_float64x2, d) + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ return v_int32x4(__lsx_vmadd_w(c.val, a.val, b.val)); } + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ return v_fma(a, b, c); } + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + return v_float32x4(__lsx_vfrsqrt_s(x.val)); +} + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + return v_float64x2(__lsx_vfrsqrt_d(x.val)); +} + +/** Absolute values **/ +#define OPENCV_HAL_IMPL_LSX_ABS(_Tpvec, suffix) \ + inline v_u##_Tpvec v_abs(const v_##_Tpvec& x) \ + { return v_u##_Tpvec(__lsx_vabsd_##suffix(x.val, __lsx_vldi(0))); } + +OPENCV_HAL_IMPL_LSX_ABS(int8x16, b) +OPENCV_HAL_IMPL_LSX_ABS(int16x8, h) +OPENCV_HAL_IMPL_LSX_ABS(int32x4, w) + +inline v_float32x4 v_abs(const v_float32x4& x) +{ return v_float32x4(*((__m128i*)&x) & __lsx_vreplgr2vr_w(0x7fffffff)); } +inline v_float64x2 v_abs(const v_float64x2& x) +{ return v_float64x2(*((__m128i*)&x) & __lsx_vreplgr2vr_d(0x7fffffffffffffff)); } + +/** Absolute difference **/ + +inline v_uint8x16 v_absdiff(const v_uint8x16& a, const v_uint8x16& b) +{ return (v_uint8x16)__lsx_vabsd_bu(a.val, b.val); } +inline v_uint16x8 v_absdiff(const v_uint16x8& a, const v_uint16x8& b) +{ return (v_uint16x8)__lsx_vabsd_hu(a.val, b.val); } +inline v_uint32x4 v_absdiff(const v_uint32x4& a, const v_uint32x4& b) +{ return (v_uint32x4)__lsx_vabsd_wu(a.val, b.val); } + +inline v_uint8x16 v_absdiff(const v_int8x16& a, const v_int8x16& b) +{ return (v_uint8x16)__lsx_vabsd_b(a.val, b.val); } +inline v_uint16x8 v_absdiff(const v_int16x8& a, const v_int16x8& b) +{ return (v_uint16x8)__lsx_vabsd_h(a.val, b.val); } +inline v_uint32x4 v_absdiff(const v_int32x4& a, const v_int32x4& b) +{ return (v_uint32x4)__lsx_vabsd_w(a.val, b.val); } + +inline v_float32x4 v_absdiff(const v_float32x4& a, const v_float32x4& b) +{ return v_abs(a - b); } + +inline v_float64x2 v_absdiff(const v_float64x2& a, const v_float64x2& b) +{ return v_abs(a - b); } + +/** Saturating absolute difference **/ +inline v_int8x16 v_absdiffs(const v_int8x16& a, const v_int8x16& b) +{ + v_int8x16 d = a - b; + v_int8x16 m = a < b; + return (d ^ m) - m; +} +inline v_int16x8 v_absdiffs(const v_int16x8& a, const v_int16x8& b) +{ return v_max(a, b) - v_min(a, b); } + +///////// Conversions ///////// + +/** Rounding **/ +inline v_int32x4 v_round(const v_float32x4& a) +{ return v_int32x4(__lsx_vftint_w_s(a.val)); } + +inline v_int32x4 v_round(const v_float64x2& a) +{ return v_int32x4(__lsx_vftint_w_d(a.val, a.val)); } + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ return v_int32x4(__lsx_vftint_w_d(b.val, a.val)); } + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ return v_int32x4(__lsx_vftintrz_w_s(a.val)); } + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ return v_int32x4(__lsx_vftintrz_w_d(a.val, a.val)); } + +inline v_int32x4 v_floor(const v_float32x4& a) +{ return v_int32x4(__lsx_vftintrz_w_s(__m128(__lsx_vfrintrm_s(a.val)))); } + +inline v_int32x4 v_floor(const v_float64x2& a) +{ return v_trunc(v_float64x2(__lsx_vfrintrm_d(a.val))); } + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ return v_int32x4(__lsx_vftintrz_w_s(__m128(__lsx_vfrintrp_s(a.val)))); } + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ return v_trunc(v_float64x2(__lsx_vfrintrp_d(a.val))); } + +/** To float **/ +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ return v_float32x4(__lsx_vffint_s_w(a.val)); } + +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ return v_float32x4(__lsx_vfcvt_s_d(a.val, a.val)); } + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ return v_float32x4(__lsx_vfcvt_s_d(b.val, a.val)); } + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ return v_float64x2(__lsx_vffintl_d_w(a.val)); } + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ return v_float64x2(__lsx_vffinth_d_w(a.val)); } + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ return v_float64x2(__lsx_vfcvtl_d_s(a.val)); } + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ return v_float64x2(__lsx_vfcvth_d_s(a.val)); } + +inline v_float64x2 v_cvt_f64(const v_int64x2& v) +{ return v_float64x2(__lsx_vffint_d_l(v.val)); } + + +//////////////// Lookup table access //////////////// +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + return v_int8x16(_v128_setr_b(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], + tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]], tab[idx[8]], + tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], + tab[idx[14]], tab[idx[15]])); +} + +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + return v_int8x16(_v128_setr_h(*(const short*)(tab + idx[0]), *(const short*)(tab + idx[1]), + *(const short*)(tab + idx[2]), *(const short*)(tab + idx[3]), *(const short*)(tab + idx[4]), + *(const short*)(tab + idx[5]), *(const short*)(tab + idx[6]), *(const short*)(tab + idx[7]))); +} + +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + return v_int8x16(_v128_setr_w(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]))); +} + +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) +{ return v_reinterpret_as_u8(v_lut((const schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) +{ return v_reinterpret_as_u8(v_lut_pairs((const schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) +{ return v_reinterpret_as_u8(v_lut_quads((const schar*)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + return v_int16x8(_v128_setr_h(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], + tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]])); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + return v_int16x8(_v128_setr_w(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]))); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_int16x8(_v128_setr_d(*(const int64_t*)(tab + idx[0]), *(const int64_t*)(tab + idx[1]))); +} + +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) +{ return v_reinterpret_as_u16(v_lut((const short *)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) +{ return v_reinterpret_as_u16(v_lut_pairs((const short *)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) +{ return v_reinterpret_as_u16(v_lut_quads((const short *)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + return v_int32x4(_v128_setr_w(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} +inline v_int32x4 v_lut_pairs(const int *tab, const int* idx) +{ + return v_int32x4(_v128_setr_d(*(const int64_t*)(tab + idx[0]), *(const int64_t*)(tab + idx[1]))); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(__lsx_vld(tab + idx[0], 0)); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((const int *)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((const int *)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((const int *)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int *idx) +{ + return v_int64x2(_v128_setr_d(tab[idx[0]], tab[idx[1]])); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(__lsx_vld(tab + idx[0], 0)); +} + +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + return v_float32x4(_v128_setr_ps(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) +{ + return v_float32x4((__m128)_v128_setr_pd(*(const double*)(tab + idx[0]), *(const double*)(tab + idx[1]))); +} +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) +{ + return v_float32x4((__m128)__lsx_vld(tab + idx[0], 0)); +} + +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + return v_float64x2(_v128_setr_pd(tab[idx[0]], tab[idx[1]])); +} +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2((__m128d)__lsx_vld(tab + idx[0], 0)); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int *idx = (int*)&idxvec.val; + return v_lut(tab, idx); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + const int *idx = (const int*)&idxvec.val; + return v_lut(tab, idx); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + const int *idx = (const int*)&idxvec.val; + return v_lut(tab, idx); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + const int *idx = (const int*)&idxvec.val; + __m128i xy0 = __lsx_vld(tab + idx[0], 0); + __m128i xy1 = __lsx_vld(tab + idx[1], 0); + __m128i xy2 = __lsx_vld(tab + idx[2], 0); + __m128i xy3 = __lsx_vld(tab + idx[3], 0); + __m128i xy01 = __lsx_vilvl_d(xy1, xy0); + __m128i xy23 = __lsx_vilvl_d(xy3, xy2); + __m128i xxyy02 = __lsx_vilvl_w(xy23, xy01); + __m128i xxyy13 = __lsx_vilvh_w(xy23, xy01); + x = v_float32x4((__m128)__lsx_vilvl_w(xxyy13, xxyy02)); + y = v_float32x4((__m128)__lsx_vilvh_w(xxyy13, xxyy02)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + const int* idx = (const int*)&idxvec.val; + __m128i xy0 = __lsx_vld(tab + idx[0], 0); + __m128i xy1 = __lsx_vld(tab + idx[1], 0); + x = v_float64x2((__m128d)__lsx_vilvl_d(xy1, xy0)); + y = v_float64x2((__m128d)__lsx_vilvh_d(xy1, xy0)); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + return v_int8x16(__lsx_vshuf_b(vec.val, vec.val, + _v128_setr_d(0x0705060403010200, 0x0f0d0e0c0b090a08))); +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + return v_int8x16(__lsx_vshuf_b(vec.val, vec.val, + _v128_setr_d(0x0703060205010400, 0x0f0b0e0a0d090c08))); +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + return v_int16x8(__lsx_vshuf_b(vec.val, vec.val, + _v128_setr_d(0x0706030205040100, 0x0f0e0b0a0d0c0908))); +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + return v_int16x8(__lsx_vshuf_b(vec.val, vec.val, + _v128_setr_d(0x0b0a030209080100, 0x0f0e07060d0c0504))); +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + return v_int32x4(__lsx_vshuf4i_w(vec.val, 0xd8)); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) +{ return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) +{ return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + __m128i zero = __lsx_vldi(0); + return v_int8x16(__lsx_vshuf_b(zero, vec.val, + _v128_set_d(0x1211100f0e0d0c0a, 0x0908060504020100))); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + __m128i zero = __lsx_vldi(0); + return v_int16x8(__lsx_vshuf_b(zero, vec.val, + _v128_set_d(0x11100f0e0d0c0b0a, 0x0908050403020100))); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +//////////// Matrix operations ///////// + +/////////// Dot Product ///////// + +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ + __m128i x = a.val, y = b.val; + return v_int32x4(__lsx_vmaddwod_w_h(__lsx_vmulwev_w_h(x, y), x, y)); +} +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + __m128i x = a.val, y = b.val, z = c.val; + __m128i t = __lsx_vmaddwev_w_h(z, x, y); + return v_int32x4(__lsx_vmaddwod_w_h(t, x, y)); +} + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + __m128i x = a.val, y = b.val; + return v_int64x2(__lsx_vmaddwod_d_w(__lsx_vmulwev_d_w(x, y), x, y)); +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + __m128i x = a.val, y = b.val, z = c.val; + __m128i t = __lsx_vmaddwev_d_w(z, x, y); + return v_int64x2(__lsx_vmaddwod_d_w(t, x, y)); +} + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i x = a.val, y = b.val; + __m128i even = __lsx_vmulwev_h_bu(x, y); + __m128i odd = __lsx_vmulwod_h_bu(x, y); + __m128i prod0 = __lsx_vhaddw_wu_hu(even, even); + __m128i prod1 = __lsx_vhaddw_wu_hu(odd, odd); + return v_uint32x4(__lsx_vadd_w(prod0, prod1)); +} + +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b) + c ;} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + __m128i x = a.val, y = b.val; + __m128i even = __lsx_vmulwev_h_b(x, y); + __m128i odd = __lsx_vmulwod_h_b(x, y); + __m128i prod0 = __lsx_vhaddw_w_h(even, even); + __m128i prod1 = __lsx_vhaddw_w_h(odd, odd); + return v_int32x4(__lsx_vadd_w(prod0, prod1)); +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i x = a.val, y = b.val; + __m128i even = __lsx_vmulwev_w_hu(x, y); + __m128i odd = __lsx_vmulwod_w_hu(x, y); + __m128i prod0 = __lsx_vhaddw_du_wu(even, even); + __m128i prod1 = __lsx_vhaddw_du_wu(odd, odd); + return v_uint64x2(__lsx_vadd_d(prod0, prod1)); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + __m128i x = a.val, y = b.val; + __m128i even = __lsx_vmulwev_w_h(x, y); + __m128i odd = __lsx_vmulwod_w_h(x, y); + __m128i prod0 = __lsx_vhaddw_d_w(even, even); + __m128i prod1 = __lsx_vhaddw_d_w(odd, odd); + return v_int64x2(__lsx_vadd_d(prod0, prod1)); +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +//32 >> 64f +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } + + +///////// Fast Dot Product ////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod(a, b); } +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod(a, b); } +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i x = a.val, y = b.val; + __m128i even = __lsx_vmulwev_w_hu(x, y); + __m128i odd = __lsx_vmulwod_w_hu(x, y); + __m128i prod0 = __lsx_vhaddw_du_wu(even, even); + __m128i prod1 = __lsx_vhaddw_du_wu(odd, odd); + return v_uint64x2(__lsx_vilvl_d(__lsx_vhaddw_qu_du(prod0, prod0), __lsx_vhaddw_qu_du(prod1, prod1))); +} +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + __m128i x = a.val, y = b.val; + __m128i prod = __lsx_vmaddwod_w_h(__lsx_vmulwev_w_h(x, y), x, y); + __m128i sign = __lsx_vsrai_w(prod, 31); + __m128i lo = __lsx_vilvl_w(sign, prod); + __m128i hi = __lsx_vilvh_w(sign, prod); + return v_int64x2(__lsx_vadd_d(lo, hi)); +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, const v_float32x4& m3) +{ + __m128i x = (__m128i)v.val; + __m128 v0 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0x0), m0.val); + __m128 v1 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0x55), m1.val); + __m128 v2 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0xAA), m2.val); + __m128 v3 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0xFF), m3.val); + + return v_float32x4(__lsx_vfadd_s(__lsx_vfadd_s(v0, v1), __lsx_vfadd_s(v2, v3))); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, const v_float32x4& a) +{ + __m128i x = (__m128i)v.val; + __m128 v0 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0x0), m0.val); + __m128 v1 = __lsx_vfmul_s((__m128)__lsx_vshuf4i_w(x, 0x55), m1.val); + __m128 v2 = __lsx_vfmadd_s((__m128)__lsx_vshuf4i_w(x, 0xAA), m2.val, a.val); + + return v_float32x4(__lsx_vfadd_s(__lsx_vfadd_s(v0, v1), v2)); +} + +#define OPENCV_HAL_IMPL_LSX_TRANSPOSE4X4(_Tpvec, cast_from, cast_to) \ + inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) \ + { \ + __m128i t0 = cast_from(__lsx_vilvl_w(a1.val, a0.val)); \ + __m128i t1 = cast_from(__lsx_vilvl_w(a3.val, a2.val)); \ + __m128i t2 = cast_from(__lsx_vilvh_w(a1.val, a0.val)); \ + __m128i t3 = cast_from(__lsx_vilvh_w(a3.val, a2.val)); \ + b0.val = cast_to(__lsx_vilvl_d(t1, t0)); \ + b1.val = cast_to(__lsx_vilvh_d(t1, t0)); \ + b2.val = cast_to(__lsx_vilvl_d(t3, t2)); \ + b3.val = cast_to(__lsx_vilvh_d(t3, t2)); \ + } + +OPENCV_HAL_IMPL_LSX_TRANSPOSE4X4(v_uint32x4, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_LSX_TRANSPOSE4X4(v_int32x4, OPENCV_HAL_NOP, OPENCV_HAL_NOP) + +inline void v_transpose4x4(const v_float32x4& a0, const v_float32x4& a1, + const v_float32x4& a2, const v_float32x4& a3, + v_float32x4& b0, v_float32x4& b1, v_float32x4& b2, v_float32x4& b3) +{ + __m128i vec0 = (__m128i)a0.val, vec1 = (__m128i)a1.val; + __m128i vec2 = (__m128i)a2.val, vec3 = (__m128i)a3.val; + __m128i t0 = __lsx_vilvl_w(vec1, vec0); + __m128i t1 = __lsx_vilvl_w(vec3, vec2); + __m128i t2 = __lsx_vilvh_w(vec1, vec0); + __m128i t3 = __lsx_vilvh_w(vec3, vec2); + b0.val = __m128(__lsx_vilvl_d(t1, t0)); + b1.val = __m128(__lsx_vilvh_d(t1, t0)); + b2.val = __m128(__lsx_vilvl_d(t3, t2)); + b3.val = __m128(__lsx_vilvh_d(t3, t2)); +} + +////////////////// Value reordering //////////////// + +/* Expand */ +#define OPENCV_HAL_IMPL_LSX_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin_lo, intrin_hi) \ + inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ + { \ + b0.val = intrin_lo(a.val, 0); \ + b1.val = intrin_hi(a.val); \ + } \ + inline _Tpwvec v_expand_low(const _Tpvec& a) \ + { return _Tpwvec(intrin_lo(a.val, 0)); } \ + inline _Tpwvec v_expand_high(const _Tpvec& a) \ + { return _Tpwvec(intrin_hi(a.val)); } \ + inline _Tpwvec v_load_expand(const _Tp* ptr) \ + { \ + __m128i a = __lsx_vld(ptr, 0); \ + return _Tpwvec(intrin_lo(a, 0)); \ + } + +OPENCV_HAL_IMPL_LSX_EXPAND(v_uint8x16, v_uint16x8, uchar, __lsx_vsllwil_hu_bu, __lsx_vexth_hu_bu) +OPENCV_HAL_IMPL_LSX_EXPAND(v_int8x16, v_int16x8, schar, __lsx_vsllwil_h_b, __lsx_vexth_h_b) +OPENCV_HAL_IMPL_LSX_EXPAND(v_uint16x8, v_uint32x4, ushort, __lsx_vsllwil_wu_hu, __lsx_vexth_wu_hu) +OPENCV_HAL_IMPL_LSX_EXPAND(v_int16x8, v_int32x4, short, __lsx_vsllwil_w_h, __lsx_vexth_w_h) +OPENCV_HAL_IMPL_LSX_EXPAND(v_uint32x4, v_uint64x2, unsigned, __lsx_vsllwil_du_wu, __lsx_vexth_du_wu) +OPENCV_HAL_IMPL_LSX_EXPAND(v_int32x4, v_int64x2, int, __lsx_vsllwil_d_w, __lsx_vexth_d_w) + +#define OPENCV_HAL_IMPL_LSX_EXPAND_Q(_Tpvec, _Tp, intrin_lo, intrin_hi) \ + inline _Tpvec v_load_expand_q(const _Tp* ptr) \ + { \ + __m128i a = __lsx_vld(ptr, 0); \ + __m128i b = intrin_lo(a, 0); \ + return _Tpvec(intrin_hi(b, 0)); \ + } + +OPENCV_HAL_IMPL_LSX_EXPAND_Q(v_uint32x4, uchar, __lsx_vsllwil_hu_bu, __lsx_vsllwil_wu_hu) +OPENCV_HAL_IMPL_LSX_EXPAND_Q(v_int32x4, schar, __lsx_vsllwil_h_b, __lsx_vsllwil_w_h) + +/* pack */ +// 16 +inline v_int8x16 v_pack(const v_int16x8& a, const v_int16x8& b) +{ return v_int8x16(_lsx_packs_h(a.val, b.val)); } + +inline v_uint8x16 v_pack(const v_uint16x8& a, const v_uint16x8& b) +{ return v_uint8x16(__lsx_vssrlrni_bu_h(b.val, a.val, 0)); } + +inline v_uint8x16 v_pack_u(const v_int16x8& a, const v_int16x8& b) +{ return v_uint8x16(_lsx_packus_h(a.val, b.val)); } + +inline void v_pack_store(schar* ptr, const v_int16x8& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(uchar* ptr, const v_uint16x8& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_u_store(uchar* ptr, const v_int16x8& a) +{ v_store_low(ptr, v_pack_u(a, a)); } + +template inline +v_uint8x16 v_rshr_pack(const v_uint16x8& a, const v_uint16x8& b) +{ return v_uint8x16(__lsx_vssrlrni_bu_h(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(uchar* ptr, const v_uint16x8& a) +{ __lsx_vstelm_d(__lsx_vssrlrni_bu_h(a.val, a.val, n), ptr, 0, 0); } + +template inline +v_uint8x16 v_rshr_pack_u(const v_int16x8& a, const v_int16x8& b) +{ return v_uint8x16(__lsx_vssrarni_bu_h(b.val, a.val, n)); } + +template inline +void v_rshr_pack_u_store(uchar* ptr, const v_int16x8& a) +{ __lsx_vstelm_d(__lsx_vssrarni_bu_h(a.val, a.val, n), ptr, 0, 0); } + +template inline +v_int8x16 v_rshr_pack(const v_int16x8& a, const v_int16x8& b) +{ return v_int8x16(__lsx_vssrarni_b_h(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(schar* ptr, const v_int16x8& a) +{ __lsx_vstelm_d(__lsx_vssrarni_b_h(a.val, a.val, n), ptr, 0, 0); } + +//32 +inline v_int16x8 v_pack(const v_int32x4& a, const v_int32x4& b) +{ return v_int16x8(__lsx_vssrarni_h_w(b.val, a.val, 0)); } + +inline v_uint16x8 v_pack(const v_uint32x4& a, const v_uint32x4& b) +{ return v_uint16x8(__lsx_vssrlrni_hu_w(b.val, a.val, 0)); } + +inline v_uint16x8 v_pack_u(const v_int32x4& a, const v_int32x4& b) +{ return v_uint16x8(__lsx_vssrarni_hu_w(b.val, a.val, 0)); } + +inline void v_pack_store(short* ptr, const v_int32x4& a) +{ v_store_low(ptr, v_pack(a, a)); } + +inline void v_pack_store(ushort *ptr, const v_uint32x4& a) +{ __lsx_vstelm_d(__lsx_vssrlrni_hu_w(a.val, a.val, 0), ptr, 0, 0); } + +inline void v_pack_u_store(ushort* ptr, const v_int32x4& a) +{ __lsx_vstelm_d(__lsx_vssrarni_hu_w(a.val, a.val, 0), ptr, 0, 0); } + +template inline +v_uint16x8 v_rshr_pack(const v_uint32x4& a, const v_uint32x4& b) +{ return v_uint16x8(__lsx_vssrlrni_hu_w(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(ushort* ptr, const v_uint32x4& a) +{ __lsx_vstelm_d(__lsx_vssrlrni_hu_w(a.val, a.val, n), ptr, 0, 0); } + +template inline +v_uint16x8 v_rshr_pack_u(const v_int32x4& a, const v_int32x4& b) +{ return v_uint16x8(__lsx_vssrarni_hu_w(b.val, a.val, n)); } + +template inline +void v_rshr_pack_u_store(ushort* ptr, const v_int32x4& a) +{ __lsx_vstelm_d(__lsx_vssrarni_hu_w(a.val, a.val, n), ptr, 0, 0); } + +template inline +v_int16x8 v_rshr_pack(const v_int32x4& a, const v_int32x4& b) +{ return v_int16x8(__lsx_vssrarni_h_w(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(short* ptr, const v_int32x4& a) +{ __lsx_vstelm_d(__lsx_vssrarni_h_w(a.val, a.val, n), ptr, 0, 0); } + +// 64 +// Non-saturaing pack +inline v_uint32x4 v_pack(const v_uint64x2& a, const v_uint64x2& b) +{ return v_uint32x4(__lsx_vpickev_w(b.val, a.val)); } + +inline v_int32x4 v_pack(const v_int64x2& a, const v_int64x2& b) +{ return v_reinterpret_as_s32(v_pack(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); } + +inline void v_pack_store(unsigned* ptr, const v_uint64x2& a) +{ __lsx_vstelm_d(__lsx_vshuf4i_w(a.val, 0x08), ptr, 0, 0); } + +inline void v_pack_store(int *ptr, const v_int64x2& a) +{ v_pack_store((unsigned*)ptr, v_reinterpret_as_u64(a)); } + +template inline +v_uint32x4 v_rshr_pack(const v_uint64x2& a, const v_uint64x2& b) +{ return v_uint32x4(__lsx_vsrlrni_w_d(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(unsigned* ptr, const v_uint64x2& a) +{ __lsx_vstelm_d(__lsx_vsrlrni_w_d(a.val, a.val, n), ptr, 0, 0); } + +template inline +v_int32x4 v_rshr_pack(const v_int64x2& a, const v_int64x2& b) +{ return v_int32x4(__lsx_vsrarni_w_d(b.val, a.val, n)); } + +template inline +void v_rshr_pack_store(int* ptr, const v_int64x2& a) +{ __lsx_vstelm_d(__lsx_vsrarni_w_d(a.val, a.val, n), ptr, 0, 0); } + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ return v_uint8x16(__lsx_vssrarni_b_h(b.val, a.val, 0)); } + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + __m128i ab = __lsx_vssrarni_h_w(b.val, a.val, 0); + __m128i cd = __lsx_vssrarni_h_w(d.val, c.val, 0); + return v_uint8x16(__lsx_vssrarni_b_h(cd, ab, 0)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + __m128i ab = __lsx_vssrarni_w_d(b.val, a.val, 0); + __m128i cd = __lsx_vssrarni_w_d(d.val, c.val, 0); + __m128i ef = __lsx_vssrarni_w_d(f.val, e.val, 0); + __m128i gh = __lsx_vssrarni_w_d(h.val, g.val, 0); + + __m128i abcd = __lsx_vssrarni_h_w(cd, ab, 0); + __m128i efgh = __lsx_vssrarni_h_w(gh, ef, 0); + return v_uint8x16(__lsx_vssrarni_b_h(efgh, abcd, 0)); +} + +/* Recombine */ +// its up there with load and store operations + +/* Extract */ +#define OPENCV_HAL_IMPL_LSX_EXTRACT(_Tpvec) \ + template \ + inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ + { return v_rotate_right(a, b); } + +OPENCV_HAL_IMPL_LSX_EXTRACT(v_uint8x16) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_int8x16) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_uint16x8) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_int16x8) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_uint32x4) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_int32x4) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_uint64x2) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_int64x2) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_float32x4) +OPENCV_HAL_IMPL_LSX_EXTRACT(v_float64x2) + +#define OPENCV_HAL_IMPL_LSX_EXTRACT_N(_Tpvec, _Twvec, intrin) \ +template \ +inline _Twvec v_extract_n(const _Tpvec& a) \ +{ return (_Twvec)intrin(a.val, i); } + +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_uint8x16, uchar, __lsx_vpickve2gr_b) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_int8x16, schar, __lsx_vpickve2gr_b) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_uint16x8, ushort, __lsx_vpickve2gr_h) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_int16x8, short, __lsx_vpickve2gr_h) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_uint32x4, uint, __lsx_vpickve2gr_w) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_int32x4, int, __lsx_vpickve2gr_w) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_uint64x2, uint64, __lsx_vpickve2gr_d) +OPENCV_HAL_IMPL_LSX_EXTRACT_N(v_int64x2, int64, __lsx_vpickve2gr_d) + +template +inline float v_extract_n(const v_float32x4& v) +{ + union { uint iv; float fv; } d; + d.iv = __lsx_vpickve2gr_w(v.val, i); + return d.fv; +} + +template +inline double v_extract_n(const v_float64x2& v) +{ + union { uint64 iv; double dv; } d; + d.iv = __lsx_vpickve2gr_d(v.val, i); + return d.dv; +} + +template +inline v_uint32x4 v_broadcast_element(const v_uint32x4& a) +{ return v_uint32x4(__lsx_vreplvei_w(a.val, i)); } + +template +inline v_int32x4 v_broadcast_element(const v_int32x4& a) +{ return v_int32x4(__lsx_vreplvei_w(a.val, i)); } + +template +inline v_float32x4 v_broadcast_element(const v_float32x4& a) +{ return v_float32x4((__m128)__lsx_vreplvei_w((__m128i)a.val, i)); } + +/////////////////// load deinterleave ////////////////////////////// + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + + a.val = __lsx_vpickev_b(t1, t0); + b.val = __lsx_vpickod_b(t1, t0); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + a.val = __lsx_vpickev_h(t1, t0); + b.val = __lsx_vpickod_h(t1, t0); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + a.val = __lsx_vpickev_w(t1, t0); + b.val = __lsx_vpickod_w(t1, t0); +} + +inline void v_load_deinterleave(const uint64* ptr, v_uint64x2& a, v_uint64x2& b) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + a.val = __lsx_vilvl_d(t1, t0); + b.val = __lsx_vilvh_d(t1, t0); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + const __m128i shuff0 = _v128_setr_b(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); + const __m128i shuff1 = _v128_setr_b(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + __m128i a0 = __lsx_vbitsel_v(t0, t1, shuff0); + __m128i b0 = __lsx_vbitsel_v(t1, t0, shuff1); + __m128i c0 = __lsx_vbitsel_v(t1, t0, shuff0); + const __m128i shuff_a = _v128_setr_b(0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 17, 20, 23, 26, 29); + const __m128i shuff_b = _v128_setr_b(1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30); + const __m128i shuff_c = _v128_setr_b(2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31); + + a.val = __lsx_vshuf_b(t2, a0, shuff_a); + b.val = __lsx_vshuf_b(t2, b0, shuff_b); + c.val = __lsx_vshuf_b(t2, c0, shuff_c); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + const __m128i shuff0 = _v128_setr_h(0, 0, -1, 0, 0, -1, 0, 0); + const __m128i shuff1 = _v128_setr_h(0, -1, 0, 0, -1, 0, 0, -1); + + __m128i a0 = __lsx_vbitsel_v(t0, t1, shuff1); + __m128i b0 = __lsx_vbitsel_v(t0, t1, shuff0); + __m128i c0 = __lsx_vbitsel_v(t1, t0, shuff0); + + const __m128i shuff_a = _v128_setr_b(0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 20, 21, 26, 27); + const __m128i shuff_b = _v128_setr_b(2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 16, 17, 22, 23, 28, 29); + const __m128i shuff_c = _v128_setr_b(4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 18, 19, 24, 25, 30, 31); + + a.val = __lsx_vshuf_b(t2, a0, shuff_a); + b.val = __lsx_vshuf_b(t2, b0, shuff_b); + c.val = __lsx_vshuf_b(t2, c0, shuff_c); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + + __m128i a0 = __lsx_vpermi_w(t1, t0, 0xAC); + __m128i b0 = __lsx_vpermi_w(t1, t0, 0xC5); + __m128i c0 = __lsx_vpermi_w(t1, t0, 0x5A); + + a.val = __lsx_vextrins_w(a0, t2, 0x31); + b0 = __lsx_vshuf4i_w(b0, 0x38); + c0 = __lsx_vshuf4i_w(c0, 0x8); + b.val = __lsx_vextrins_w(b0, t2, 0x32); + c.val = __lsx_vpermi_w(t2, c0, 0xC4); +} + +inline void v_load_deinterleave(const uint64* ptr, v_uint64x2& a, v_uint64x2& b, v_uint64x2& c) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + + a.val = __lsx_vshuf4i_d(t0, t1, 0xC); + b.val = __lsx_vshuf4i_d(t0, t2, 0x9); + c.val = __lsx_vshuf4i_d(t1, t2, 0xC); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c, v_uint8x16& d) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + __m128i t3 = __lsx_vld(ptr, 48); + + __m128i ac_lo = __lsx_vpickev_b(t1, t0); + __m128i bd_lo = __lsx_vpickod_b(t1, t0); + __m128i ac_hi = __lsx_vpickev_b(t3, t2); + __m128i bd_hi = __lsx_vpickod_b(t3, t2); + + a.val = __lsx_vpickev_b(ac_hi, ac_lo); + c.val = __lsx_vpickod_b(ac_hi, ac_lo); + b.val = __lsx_vpickev_b(bd_hi, bd_lo); + d.val = __lsx_vpickod_b(bd_hi, bd_lo); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c, v_uint16x8& d) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + __m128i t3 = __lsx_vld(ptr, 48); + + __m128i ac_lo = __lsx_vpickev_h(t1, t0); + __m128i bd_lo = __lsx_vpickod_h(t1, t0); + __m128i ac_hi = __lsx_vpickev_h(t3, t2); + __m128i bd_hi = __lsx_vpickod_h(t3, t2); + + a.val = __lsx_vpickev_h(ac_hi, ac_lo); + c.val = __lsx_vpickod_h(ac_hi, ac_lo); + b.val = __lsx_vpickev_h(bd_hi, bd_lo); + d.val = __lsx_vpickod_h(bd_hi, bd_lo); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c, v_uint32x4& d) +{ + __m128i p0 = __lsx_vld(ptr, 0); + __m128i p1 = __lsx_vld(ptr, 16); + __m128i p2 = __lsx_vld(ptr, 32); + __m128i p3 = __lsx_vld(ptr, 48); + + __m128i t0 = __lsx_vilvl_w(p1, p0); + __m128i t1 = __lsx_vilvl_w(p3, p2); + __m128i t2 = __lsx_vilvh_w(p1, p0); + __m128i t3 = __lsx_vilvh_w(p3, p2); + a.val = __lsx_vilvl_d(t1, t0); + b.val = __lsx_vilvh_d(t1, t0); + c.val = __lsx_vilvl_d(t3, t2); + d.val = __lsx_vilvh_d(t3, t2); +} + +inline void v_load_deinterleave(const uint64* ptr, v_uint64x2& a, v_uint64x2& b, v_uint64x2& c, v_uint64x2& d) +{ + __m128i t0 = __lsx_vld(ptr, 0); + __m128i t1 = __lsx_vld(ptr, 16); + __m128i t2 = __lsx_vld(ptr, 32); + __m128i t3 = __lsx_vld(ptr, 48); + + a.val = __lsx_vilvl_d(t2, t0); + b.val = __lsx_vilvh_d(t2, t0); + c.val = __lsx_vilvl_d(t3, t1); + d.val = __lsx_vilvh_d(t3, t1); +} + +////////////////////////// store interleave //////////////////////////////// + +inline void v_store_interleave(uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i v0 = __lsx_vilvl_b(b.val, a.val); + __m128i v1 = __lsx_vilvh_b(b.val, a.val); + + __lsx_vst(v0, ptr, 0); + __lsx_vst(v1, ptr, 16); +} + +inline void v_store_interleave(ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i v0 = __lsx_vilvl_h(b.val, a.val); + __m128i v1 = __lsx_vilvh_h(b.val, a.val); + + __lsx_vst(v0, ptr, 0); + __lsx_vst(v1, ptr, 16); +} + +inline void v_store_interleave(unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i v0 = __lsx_vilvl_w(b.val, a.val); + __m128i v1 = __lsx_vilvh_w(b.val, a.val); + + __lsx_vst(v0, ptr, 0); + __lsx_vst(v1, ptr, 16); +} + +inline void v_store_interleave(uint64* ptr, const v_uint64x2& a, const v_uint64x2& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i v0 = __lsx_vilvl_d(b.val, a.val); + __m128i v1 = __lsx_vilvh_d(b.val, a.val); + + __lsx_vst(v0, ptr, 0); + __lsx_vst(v1, ptr, 16); +} + +inline void v_store_interleave(uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, const v_uint8x16& c, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i ab_lo = __lsx_vilvl_b(b.val, a.val); + __m128i ab_hi = __lsx_vilvh_b(b.val, a.val); + __m128i v_c = c.val; + const __m128i shuff0 = _v128_setr_b(0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, 8, 9, 20, 10); + const __m128i shuff1 = _v128_setr_b(11, 21, 12, 13, 22, 14, 15, 23, 0, 0, 0, 0, 0, 0, 0, 0); + const __m128i shuff2 = _v128_setr_b(0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 24, 18, 19, 25, 20, 21); + const __m128i shuff3 = _v128_setr_b(26, 6, 7, 27, 8, 9, 28, 10, 11, 29, 12, 13, 30, 14, 15, 31); + __m128i abc = __lsx_vpermi_w(v_c, ab_hi, 0xE4); + + __m128i dst0 = __lsx_vshuf_b(v_c, ab_lo, shuff0); + __m128i dst1 = __lsx_vshuf_b(v_c, ab_lo, shuff1); + __m128i dst2 = __lsx_vshuf_b(v_c, ab_hi, shuff3); + dst1 = __lsx_vshuf_b(abc, dst1, shuff2); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); +} + +inline void v_store_interleave(ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, const v_uint16x8& c, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i ab_lo = __lsx_vilvl_h(b.val, a.val); + __m128i ab_hi = __lsx_vilvh_h(b.val, a.val); + __m128i v_c = c.val; + const __m128i shuff0 = _v128_setr_b(0, 1, 2, 3, 16, 17, 4, 5, 6, 7, 18, 19, 8, 9, 10, 11); + const __m128i shuff1 = _v128_setr_b(20, 21, 12, 13, 14, 15, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0); + const __m128i shuff2 = _v128_setr_b(0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 24, 25, 20, 21); + const __m128i shuff3 = _v128_setr_b(6, 7, 26, 27, 8, 9, 10, 11, 28, 29, 12, 13, 14, 15, 30, 31); + __m128i abc = __lsx_vpermi_w(v_c, ab_hi, 0xE4); + + __m128i dst0 = __lsx_vshuf_b(v_c, ab_lo, shuff0); + __m128i dst1 = __lsx_vshuf_b(v_c, ab_lo, shuff1); + __m128i dst2 = __lsx_vshuf_b(v_c, ab_hi, shuff3); + dst1 = __lsx_vshuf_b(abc, dst1, shuff2); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); +} + +inline void v_store_interleave(unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, const v_uint32x4& c, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i v_c = c.val; + __m128i ab_lo = __lsx_vilvl_w(b.val, a.val); //a0 b0 a1 b1 + __m128i ab_hi = __lsx_vilvh_w(b.val, a.val); //a2 b2 a3 b3 + __m128i bc_od = __lsx_vpackod_w(v_c, b.val); // b1 c1 b3 c3 + + __m128i dst0 = __lsx_vshuf4i_w(ab_lo, 0xB4); //a0 b0 b1 a1 + __m128i dst1 = __lsx_vilvl_d(ab_hi, bc_od); //b1 c1 a2 b2 + __m128i dst2 = __lsx_vpermi_w(bc_od, ab_hi, 0xE8); //a2, a3, b3, c3 + + dst0 = __lsx_vextrins_w(dst0, v_c, 0x20); + dst2 = __lsx_vextrins_w(dst2, v_c, 0x2); + __lsx_vst(dst0, ptr, 0); //a0 b0 c0 a1 + __lsx_vst(dst1, ptr, 16); //b1 c1 a2 b2 + __lsx_vst(dst2, ptr, 32); //c2 a3 b3 c3 +} + +inline void v_store_interleave(uint64* ptr, const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i dst0 = __lsx_vilvl_d(b.val, a.val); + __m128i dst1 = __lsx_vpermi_w(a.val, c.val, 0xE4); + __m128i dst2 = __lsx_vilvh_d(c.val, b.val); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); +} + +inline void v_store_interleave(uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + const v_uint8x16& c, const v_uint8x16& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i ab_lo = __lsx_vilvl_b(b.val, a.val); + __m128i ab_hi = __lsx_vilvh_b(b.val, a.val); + __m128i cd_lo = __lsx_vilvl_b(d.val, c.val); + __m128i cd_hi = __lsx_vilvh_b(d.val, c.val); + + __m128i dst0 = __lsx_vilvl_h(cd_lo, ab_lo); + __m128i dst1 = __lsx_vilvh_h(cd_lo, ab_lo); + __m128i dst2 = __lsx_vilvl_h(cd_hi, ab_hi); + __m128i dst3 = __lsx_vilvh_h(cd_hi, ab_hi); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); + __lsx_vst(dst3, ptr, 48); +} + +inline void v_store_interleave(ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + const v_uint16x8& c, const v_uint16x8& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i ab_lo = __lsx_vilvl_h(b.val, a.val); + __m128i ab_hi = __lsx_vilvh_h(b.val, a.val); + __m128i cd_lo = __lsx_vilvl_h(d.val, c.val); + __m128i cd_hi = __lsx_vilvh_h(d.val, c.val); + + __m128i dst0 = __lsx_vilvl_w(cd_lo, ab_lo); + __m128i dst1 = __lsx_vilvh_w(cd_lo, ab_lo); + __m128i dst2 = __lsx_vilvl_w(cd_hi, ab_hi); + __m128i dst3 = __lsx_vilvh_w(cd_hi, ab_hi); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); + __lsx_vst(dst3, ptr, 48); +} + +inline void v_store_interleave(unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i ab_lo = __lsx_vilvl_w(b.val, a.val); + __m128i ab_hi = __lsx_vilvh_w(b.val, a.val); + __m128i cd_lo = __lsx_vilvl_w(d.val, c.val); + __m128i cd_hi = __lsx_vilvh_w(d.val, c.val); + + __m128i dst0 = __lsx_vilvl_d(cd_lo, ab_lo); + __m128i dst1 = __lsx_vilvh_d(cd_lo, ab_lo); + __m128i dst2 = __lsx_vilvl_d(cd_hi, ab_hi); + __m128i dst3 = __lsx_vilvh_d(cd_hi, ab_hi); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); + __lsx_vst(dst3, ptr, 48); +} + +inline void v_store_interleave(uint64* ptr, const v_uint64x2& a, const v_uint64x2& b, + const v_uint64x2& c, const v_uint64x2& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + __m128i dst0 = __lsx_vilvl_d(b.val, a.val); + __m128i dst2 = __lsx_vilvh_d(b.val, a.val); + __m128i dst1 = __lsx_vilvl_d(d.val, c.val); + __m128i dst3 = __lsx_vilvh_d(d.val, c.val); + + __lsx_vst(dst0, ptr, 0); + __lsx_vst(dst1, ptr, 16); + __lsx_vst(dst2, ptr, 32); + __lsx_vst(dst3, ptr, 48); +} + +#define OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave(const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave(const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave(const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, \ + _Tpvec0& c0, _Tpvec0& d0) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave(_Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1); \ +} \ +inline void v_store_interleave(_Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, const _Tpvec0& c0,\ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1); \ +} \ +inline void v_store_interleave(_Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1); \ +} + +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_int8x16, schar, s8, v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_int16x8, short, s16, v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_int32x4, int, s32, v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_float32x4, float, f32, v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_int64x2, int64, s64, v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_LSX_LOADSTORE_INTERLEAVE(v_float64x2, double, f64, v_uint64x2, uint64, u64) + +// +// FP16 +// + +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ +#if CV_FP16 + return v_float32x4(__lsx_vfcvtl_s_h((__m128)__lsx_vld(ptr, 0))); +#else + float CV_DECL_ALIGNED(32) buf[4]; + for (int i = 0; i < 4; i++) + buf[i] = (float)ptr[i]; + return v_float32x4((__m128)__lsx_vld(buf, 0)); +#endif +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& a) +{ +#if CV_FP16 + __m128i res = (__m218i)__lsx_vfcvt_h_s(a.val, a.val); + __lsx_vstelm_d(res, ptr, 0, 0); +#else + float CV_DECL_ALIGNED(32) buf[4]; + v_store_aligned(buf, a); + for (int i = 0; i < 4; i++) + ptr[i] = float16_t(buf[i]); +#endif +} + +// +// end of FP16 +// + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: + +#endif // OPENCV_HAL_INTRIN_LSX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_msa.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_msa.hpp new file mode 100644 index 0000000..c035fda --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_msa.hpp @@ -0,0 +1,1887 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_HAL_INTRIN_MSA_HPP +#define OPENCV_HAL_INTRIN_MSA_HPP + +#include +#include "opencv2/core/utility.hpp" + +namespace cv +{ + +//! @cond IGNORED +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define CV_SIMD128 1 + +//MSA implements 128-bit wide vector registers shared with the 64-bit wide floating-point unit registers. +//MSA and FPU can not be both present, unless the FPU has 64-bit floating-point registers. +#define CV_SIMD128_64F 1 + +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16 }; + + v_uint8x16() {} + explicit v_uint8x16(v16u8 v) : val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = msa_ld1q_u8(v); + } + + uchar get0() const + { + return msa_getq_lane_u8(val, 0); + } + + v16u8 val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(v16i8 v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = msa_ld1q_s8(v); + } + + schar get0() const + { + return msa_getq_lane_s8(val, 0); + } + + v16i8 val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(v8u16 v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = msa_ld1q_u16(v); + } + + ushort get0() const + { + return msa_getq_lane_u16(val, 0); + } + + v8u16 val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(v8i16 v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = msa_ld1q_s16(v); + } + + short get0() const + { + return msa_getq_lane_s16(val, 0); + } + + v8i16 val; +}; + +struct v_uint32x4 +{ + typedef unsigned int lane_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(v4u32 v) : val(v) {} + v_uint32x4(unsigned int v0, unsigned int v1, unsigned int v2, unsigned int v3) + { + unsigned int v[] = {v0, v1, v2, v3}; + val = msa_ld1q_u32(v); + } + + unsigned int get0() const + { + return msa_getq_lane_u32(val, 0); + } + + v4u32 val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(v4i32 v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + val = msa_ld1q_s32(v); + } + + int get0() const + { + return msa_getq_lane_s32(val, 0); + } + + v4i32 val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4 }; + + v_float32x4() {} + explicit v_float32x4(v4f32 v) : val(v) {} + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + val = msa_ld1q_f32(v); + } + + float get0() const + { + return msa_getq_lane_f32(val, 0); + } + + v4f32 val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2 }; + + v_uint64x2() {} + explicit v_uint64x2(v2u64 v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + val = msa_ld1q_u64(v); + } + + uint64 get0() const + { + return msa_getq_lane_u64(val, 0); + } + + v2u64 val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2 }; + + v_int64x2() {} + explicit v_int64x2(v2i64 v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + val = msa_ld1q_s64(v); + } + + int64 get0() const + { + return msa_getq_lane_s64(val, 0); + } + + v2i64 val; +}; + +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2 }; + + v_float64x2() {} + explicit v_float64x2(v2f64 v) : val(v) {} + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + val = msa_ld1q_f64(v); + } + + double get0() const + { + return msa_getq_lane_f64(val, 0); + } + + v2f64 val; +}; + +#define OPENCV_HAL_IMPL_MSA_INIT(_Tpv, _Tp, suffix) \ +inline v_##_Tpv v_setzero_##suffix() { return v_##_Tpv(msa_dupq_n_##suffix((_Tp)0)); } \ +inline v_##_Tpv v_setall_##suffix(_Tp v) { return v_##_Tpv(msa_dupq_n_##suffix(v)); } \ +inline v_uint8x16 v_reinterpret_as_u8(const v_##_Tpv& v) { return v_uint8x16(MSA_TPV_REINTERPRET(v16u8, v.val)); } \ +inline v_int8x16 v_reinterpret_as_s8(const v_##_Tpv& v) { return v_int8x16(MSA_TPV_REINTERPRET(v16i8, v.val)); } \ +inline v_uint16x8 v_reinterpret_as_u16(const v_##_Tpv& v) { return v_uint16x8(MSA_TPV_REINTERPRET(v8u16, v.val)); } \ +inline v_int16x8 v_reinterpret_as_s16(const v_##_Tpv& v) { return v_int16x8(MSA_TPV_REINTERPRET(v8i16, v.val)); } \ +inline v_uint32x4 v_reinterpret_as_u32(const v_##_Tpv& v) { return v_uint32x4(MSA_TPV_REINTERPRET(v4u32, v.val)); } \ +inline v_int32x4 v_reinterpret_as_s32(const v_##_Tpv& v) { return v_int32x4(MSA_TPV_REINTERPRET(v4i32, v.val)); } \ +inline v_uint64x2 v_reinterpret_as_u64(const v_##_Tpv& v) { return v_uint64x2(MSA_TPV_REINTERPRET(v2u64, v.val)); } \ +inline v_int64x2 v_reinterpret_as_s64(const v_##_Tpv& v) { return v_int64x2(MSA_TPV_REINTERPRET(v2i64, v.val)); } \ +inline v_float32x4 v_reinterpret_as_f32(const v_##_Tpv& v) { return v_float32x4(MSA_TPV_REINTERPRET(v4f32, v.val)); } \ +inline v_float64x2 v_reinterpret_as_f64(const v_##_Tpv& v) { return v_float64x2(MSA_TPV_REINTERPRET(v2f64, v.val)); } + +OPENCV_HAL_IMPL_MSA_INIT(uint8x16, uchar, u8) +OPENCV_HAL_IMPL_MSA_INIT(int8x16, schar, s8) +OPENCV_HAL_IMPL_MSA_INIT(uint16x8, ushort, u16) +OPENCV_HAL_IMPL_MSA_INIT(int16x8, short, s16) +OPENCV_HAL_IMPL_MSA_INIT(uint32x4, unsigned int, u32) +OPENCV_HAL_IMPL_MSA_INIT(int32x4, int, s32) +OPENCV_HAL_IMPL_MSA_INIT(uint64x2, uint64, u64) +OPENCV_HAL_IMPL_MSA_INIT(int64x2, int64, s64) +OPENCV_HAL_IMPL_MSA_INIT(float32x4, float, f32) +OPENCV_HAL_IMPL_MSA_INIT(float64x2, double, f64) + +#define OPENCV_HAL_IMPL_MSA_PACK(_Tpvec, _Tpwvec, pack, mov, rshr) \ +inline _Tpvec v_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + return _Tpvec(mov(a.val, b.val)); \ +} \ +template inline \ +_Tpvec v_rshr_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + return _Tpvec(rshr(a.val, b.val, n)); \ +} + +OPENCV_HAL_IMPL_MSA_PACK(v_uint8x16, v_uint16x8, pack, msa_qpack_u16, msa_qrpackr_u16) +OPENCV_HAL_IMPL_MSA_PACK(v_int8x16, v_int16x8, pack, msa_qpack_s16, msa_qrpackr_s16) +OPENCV_HAL_IMPL_MSA_PACK(v_uint16x8, v_uint32x4, pack, msa_qpack_u32, msa_qrpackr_u32) +OPENCV_HAL_IMPL_MSA_PACK(v_int16x8, v_int32x4, pack, msa_qpack_s32, msa_qrpackr_s32) +OPENCV_HAL_IMPL_MSA_PACK(v_uint32x4, v_uint64x2, pack, msa_pack_u64, msa_rpackr_u64) +OPENCV_HAL_IMPL_MSA_PACK(v_int32x4, v_int64x2, pack, msa_pack_s64, msa_rpackr_s64) +OPENCV_HAL_IMPL_MSA_PACK(v_uint8x16, v_int16x8, pack_u, msa_qpacku_s16, msa_qrpackru_s16) +OPENCV_HAL_IMPL_MSA_PACK(v_uint16x8, v_int32x4, pack_u, msa_qpacku_s32, msa_qrpackru_s32) + +#define OPENCV_HAL_IMPL_MSA_PACK_STORE(_Tpvec, _Tp, hreg, suffix, _Tpwvec, pack, mov, rshr) \ +inline void v_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + hreg a1 = mov(a.val); \ + msa_st1_##suffix(ptr, a1); \ +} \ +template inline \ +void v_rshr_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + hreg a1 = rshr(a.val, n); \ + msa_st1_##suffix(ptr, a1); \ +} + +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_uint8x16, uchar, v8u8, u8, v_uint16x8, pack, msa_qmovn_u16, msa_qrshrn_n_u16) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_int8x16, schar, v8i8, s8, v_int16x8, pack, msa_qmovn_s16, msa_qrshrn_n_s16) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_uint16x8, ushort, v4u16, u16, v_uint32x4, pack, msa_qmovn_u32, msa_qrshrn_n_u32) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_int16x8, short, v4i16, s16, v_int32x4, pack, msa_qmovn_s32, msa_qrshrn_n_s32) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_uint32x4, unsigned, v2u32, u32, v_uint64x2, pack, msa_movn_u64, msa_rshrn_n_u64) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_int32x4, int, v2i32, s32, v_int64x2, pack, msa_movn_s64, msa_rshrn_n_s64) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_uint8x16, uchar, v8u8, u8, v_int16x8, pack_u, msa_qmovun_s16, msa_qrshrun_n_s16) +OPENCV_HAL_IMPL_MSA_PACK_STORE(v_uint16x8, ushort, v4u16, u16, v_int32x4, pack_u, msa_qmovun_s32, msa_qrshrun_n_s32) + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + return v_uint8x16(msa_pack_u16(a.val, b.val)); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + return v_uint8x16(msa_pack_u16(msa_pack_u32(a.val, b.val), msa_pack_u32(c.val, d.val))); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + v8u16 abcd = msa_pack_u32(msa_pack_u64(a.val, b.val), msa_pack_u64(c.val, d.val)); + v8u16 efgh = msa_pack_u32(msa_pack_u64(e.val, f.val), msa_pack_u64(g.val, h.val)); + return v_uint8x16(msa_pack_u16(abcd, efgh)); +} + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + v4f32 v0 = v.val; + v4f32 res = msa_mulq_lane_f32(m0.val, v0, 0); + res = msa_mlaq_lane_f32(res, m1.val, v0, 1); + res = msa_mlaq_lane_f32(res, m2.val, v0, 2); + res = msa_mlaq_lane_f32(res, m3.val, v0, 3); + return v_float32x4(res); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + v4f32 v0 = v.val; + v4f32 res = msa_mulq_lane_f32(m0.val, v0, 0); + res = msa_mlaq_lane_f32(res, m1.val, v0, 1); + res = msa_mlaq_lane_f32(res, m2.val, v0, 2); + res = msa_addq_f32(res, a.val); + return v_float32x4(res); +} + +#define OPENCV_HAL_IMPL_MSA_BIN_OP(bin_op, _Tpvec, intrin) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a.val = intrin(a.val, b.val); \ + return a; \ +} + +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_uint8x16, msa_qaddq_u8) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_uint8x16, msa_qsubq_u8) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_int8x16, msa_qaddq_s8) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_int8x16, msa_qsubq_s8) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_uint16x8, msa_qaddq_u16) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_uint16x8, msa_qsubq_u16) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_int16x8, msa_qaddq_s16) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_int16x8, msa_qsubq_s16) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_int32x4, msa_addq_s32) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_int32x4, msa_subq_s32) +OPENCV_HAL_IMPL_MSA_BIN_OP(*, v_int32x4, msa_mulq_s32) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_uint32x4, msa_addq_u32) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_uint32x4, msa_subq_u32) +OPENCV_HAL_IMPL_MSA_BIN_OP(*, v_uint32x4, msa_mulq_u32) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_float32x4, msa_addq_f32) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_float32x4, msa_subq_f32) +OPENCV_HAL_IMPL_MSA_BIN_OP(*, v_float32x4, msa_mulq_f32) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_int64x2, msa_addq_s64) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_int64x2, msa_subq_s64) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_uint64x2, msa_addq_u64) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_uint64x2, msa_subq_u64) +OPENCV_HAL_IMPL_MSA_BIN_OP(/, v_float32x4, msa_divq_f32) +OPENCV_HAL_IMPL_MSA_BIN_OP(+, v_float64x2, msa_addq_f64) +OPENCV_HAL_IMPL_MSA_BIN_OP(-, v_float64x2, msa_subq_f64) +OPENCV_HAL_IMPL_MSA_BIN_OP(*, v_float64x2, msa_mulq_f64) +OPENCV_HAL_IMPL_MSA_BIN_OP(/, v_float64x2, msa_divq_f64) + +// saturating multiply 8-bit, 16-bit +#define OPENCV_HAL_IMPL_MSA_MUL_SAT(_Tpvec, _Tpwvec) \ +inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ +{ \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ +} \ +inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ +{a = a * b; return a; } + +OPENCV_HAL_IMPL_MSA_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_MSA_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_MSA_MUL_SAT(v_int16x8, v_int32x4) +OPENCV_HAL_IMPL_MSA_MUL_SAT(v_uint16x8, v_uint32x4) + +// Multiply and expand +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + v16i8 a_lo, a_hi, b_lo, b_hi; + + ILVRL_B2_SB(a.val, msa_dupq_n_s8(0), a_lo, a_hi); + ILVRL_B2_SB(b.val, msa_dupq_n_s8(0), b_lo, b_hi); + c.val = msa_mulq_s16(msa_paddlq_s8(a_lo), msa_paddlq_s8(b_lo)); + d.val = msa_mulq_s16(msa_paddlq_s8(a_hi), msa_paddlq_s8(b_hi)); +} + +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + v16u8 a_lo, a_hi, b_lo, b_hi; + + ILVRL_B2_UB(a.val, msa_dupq_n_u8(0), a_lo, a_hi); + ILVRL_B2_UB(b.val, msa_dupq_n_u8(0), b_lo, b_hi); + c.val = msa_mulq_u16(msa_paddlq_u8(a_lo), msa_paddlq_u8(b_lo)); + d.val = msa_mulq_u16(msa_paddlq_u8(a_hi), msa_paddlq_u8(b_hi)); +} + +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + v8i16 a_lo, a_hi, b_lo, b_hi; + + ILVRL_H2_SH(a.val, msa_dupq_n_s16(0), a_lo, a_hi); + ILVRL_H2_SH(b.val, msa_dupq_n_s16(0), b_lo, b_hi); + c.val = msa_mulq_s32(msa_paddlq_s16(a_lo), msa_paddlq_s16(b_lo)); + d.val = msa_mulq_s32(msa_paddlq_s16(a_hi), msa_paddlq_s16(b_hi)); +} + +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + v8u16 a_lo, a_hi, b_lo, b_hi; + + ILVRL_H2_UH(a.val, msa_dupq_n_u16(0), a_lo, a_hi); + ILVRL_H2_UH(b.val, msa_dupq_n_u16(0), b_lo, b_hi); + c.val = msa_mulq_u32(msa_paddlq_u16(a_lo), msa_paddlq_u16(b_lo)); + d.val = msa_mulq_u32(msa_paddlq_u16(a_hi), msa_paddlq_u16(b_hi)); +} + +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + v4u32 a_lo, a_hi, b_lo, b_hi; + + ILVRL_W2_UW(a.val, msa_dupq_n_u32(0), a_lo, a_hi); + ILVRL_W2_UW(b.val, msa_dupq_n_u32(0), b_lo, b_hi); + c.val = msa_mulq_u64(msa_paddlq_u32(a_lo), msa_paddlq_u32(b_lo)); + d.val = msa_mulq_u64(msa_paddlq_u32(a_hi), msa_paddlq_u32(b_hi)); +} + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ + v8i16 a_lo, a_hi, b_lo, b_hi; + + ILVRL_H2_SH(a.val, msa_dupq_n_s16(0), a_lo, a_hi); + ILVRL_H2_SH(b.val, msa_dupq_n_s16(0), b_lo, b_hi); + + return v_int16x8(msa_packr_s32(msa_mulq_s32(msa_paddlq_s16(a_lo), msa_paddlq_s16(b_lo)), + msa_mulq_s32(msa_paddlq_s16(a_hi), msa_paddlq_s16(b_hi)), 16)); +} + +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ + v8u16 a_lo, a_hi, b_lo, b_hi; + + ILVRL_H2_UH(a.val, msa_dupq_n_u16(0), a_lo, a_hi); + ILVRL_H2_UH(b.val, msa_dupq_n_u16(0), b_lo, b_hi); + + return v_uint16x8(msa_packr_u32(msa_mulq_u32(msa_paddlq_u16(a_lo), msa_paddlq_u16(b_lo)), + msa_mulq_u32(msa_paddlq_u16(a_hi), msa_paddlq_u16(b_hi)), 16)); +} + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ return v_int32x4(msa_dotp_s_w(a.val, b.val)); } +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_int32x4(msa_dpadd_s_w(c.val , a.val, b.val)); } + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ return v_int64x2(msa_dotp_s_d(a.val, b.val)); } +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_int64x2(msa_dpadd_s_d(c.val , a.val, b.val)); } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + v8u16 even_a = msa_shrq_n_u16(msa_shlq_n_u16(MSA_TPV_REINTERPRET(v8u16, a.val), 8), 8); + v8u16 odd_a = msa_shrq_n_u16(MSA_TPV_REINTERPRET(v8u16, a.val), 8); + v8u16 even_b = msa_shrq_n_u16(msa_shlq_n_u16(MSA_TPV_REINTERPRET(v8u16, b.val), 8), 8); + v8u16 odd_b = msa_shrq_n_u16(MSA_TPV_REINTERPRET(v8u16, b.val), 8); + v4u32 prod = msa_dotp_u_w(even_a, even_b); + return v_uint32x4(msa_dpadd_u_w(prod, odd_a, odd_b)); +} +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ + v8u16 even_a = msa_shrq_n_u16(msa_shlq_n_u16(MSA_TPV_REINTERPRET(v8u16, a.val), 8), 8); + v8u16 odd_a = msa_shrq_n_u16(MSA_TPV_REINTERPRET(v8u16, a.val), 8); + v8u16 even_b = msa_shrq_n_u16(msa_shlq_n_u16(MSA_TPV_REINTERPRET(v8u16, b.val), 8), 8); + v8u16 odd_b = msa_shrq_n_u16(MSA_TPV_REINTERPRET(v8u16, b.val), 8); + v4u32 prod = msa_dpadd_u_w(c.val, even_a, even_b); + return v_uint32x4(msa_dpadd_u_w(prod, odd_a, odd_b)); +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + v8i16 prod = msa_dotp_s_h(a.val, b.val); + return v_int32x4(msa_hadd_s32(prod, prod)); +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, + const v_int32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + v4u32 even_a = msa_shrq_n_u32(msa_shlq_n_u32(MSA_TPV_REINTERPRET(v4u32, a.val), 16), 16); + v4u32 odd_a = msa_shrq_n_u32(MSA_TPV_REINTERPRET(v4u32, a.val), 16); + v4u32 even_b = msa_shrq_n_u32(msa_shlq_n_u32(MSA_TPV_REINTERPRET(v4u32, b.val), 16), 16); + v4u32 odd_b = msa_shrq_n_u32(MSA_TPV_REINTERPRET(v4u32, b.val), 16); + v2u64 prod = msa_dotp_u_d(even_a, even_b); + return v_uint64x2(msa_dpadd_u_d(prod, odd_a, odd_b)); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, + const v_uint64x2& c) +{ + v4u32 even_a = msa_shrq_n_u32(msa_shlq_n_u32(MSA_TPV_REINTERPRET(v4u32, a.val), 16), 16); + v4u32 odd_a = msa_shrq_n_u32(MSA_TPV_REINTERPRET(v4u32, a.val), 16); + v4u32 even_b = msa_shrq_n_u32(msa_shlq_n_u32(MSA_TPV_REINTERPRET(v4u32, b.val), 16), 16); + v4u32 odd_b = msa_shrq_n_u32(MSA_TPV_REINTERPRET(v4u32, b.val), 16); + v2u64 prod = msa_dpadd_u_d(c.val, even_a, even_b); + return v_uint64x2(msa_dpadd_u_d(prod, odd_a, odd_b)); +} + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + v4i32 prod = msa_dotp_s_w(a.val, b.val); + return v_int64x2(msa_hadd_s64(prod, prod)); +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } + + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod(a, b); } +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod(a, b); } +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b, c); } +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ return v_dotprod_expand(a, b); } +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b, c); } +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod_expand(a, b); } +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b, c); } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b, c); } + +#define OPENCV_HAL_IMPL_MSA_LOGIC_OP(_Tpvec, _Tpv, suffix) \ +OPENCV_HAL_IMPL_MSA_BIN_OP(&, _Tpvec, msa_andq_##suffix) \ +OPENCV_HAL_IMPL_MSA_BIN_OP(|, _Tpvec, msa_orrq_##suffix) \ +OPENCV_HAL_IMPL_MSA_BIN_OP(^, _Tpvec, msa_eorq_##suffix) \ +inline _Tpvec operator ~ (const _Tpvec& a) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_mvnq_u8(MSA_TPV_REINTERPRET(v16u8, a.val)))); \ +} + +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_uint8x16, v16u8, u8) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_int8x16, v16i8, s8) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_uint16x8, v8u16, u16) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_int16x8, v8i16, s16) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_uint32x4, v4u32, u32) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_int32x4, v4i32, s32) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_uint64x2, v2u64, u64) +OPENCV_HAL_IMPL_MSA_LOGIC_OP(v_int64x2, v2i64, s64) + +#define OPENCV_HAL_IMPL_MSA_FLT_BIT_OP(bin_op, intrin) \ +inline v_float32x4 operator bin_op (const v_float32x4& a, const v_float32x4& b) \ +{ \ + return v_float32x4(MSA_TPV_REINTERPRET(v4f32, intrin(MSA_TPV_REINTERPRET(v4i32, a.val), MSA_TPV_REINTERPRET(v4i32, b.val)))); \ +} \ +inline v_float32x4& operator bin_op##= (v_float32x4& a, const v_float32x4& b) \ +{ \ + a.val = MSA_TPV_REINTERPRET(v4f32, intrin(MSA_TPV_REINTERPRET(v4i32, a.val), MSA_TPV_REINTERPRET(v4i32, b.val))); \ + return a; \ +} + +OPENCV_HAL_IMPL_MSA_FLT_BIT_OP(&, msa_andq_s32) +OPENCV_HAL_IMPL_MSA_FLT_BIT_OP(|, msa_orrq_s32) +OPENCV_HAL_IMPL_MSA_FLT_BIT_OP(^, msa_eorq_s32) + +inline v_float32x4 operator ~ (const v_float32x4& a) +{ + return v_float32x4(MSA_TPV_REINTERPRET(v4f32, msa_mvnq_s32(MSA_TPV_REINTERPRET(v4i32, a.val)))); +} + +/* v_abs */ +#define OPENCV_HAL_IMPL_MSA_ABS(_Tpuvec, _Tpsvec, usuffix, ssuffix) \ +inline _Tpuvec v_abs(const _Tpsvec& a) \ +{ \ + return v_reinterpret_as_##usuffix(_Tpsvec(msa_absq_##ssuffix(a.val))); \ +} + +OPENCV_HAL_IMPL_MSA_ABS(v_uint8x16, v_int8x16, u8, s8) +OPENCV_HAL_IMPL_MSA_ABS(v_uint16x8, v_int16x8, u16, s16) +OPENCV_HAL_IMPL_MSA_ABS(v_uint32x4, v_int32x4, u32, s32) + +/* v_abs(float), v_sqrt, v_invsqrt */ +#define OPENCV_HAL_IMPL_MSA_BASIC_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a) \ +{ \ + return _Tpvec(intrin(a.val)); \ +} + +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float32x4, v_abs, msa_absq_f32) +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float64x2, v_abs, msa_absq_f64) +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float32x4, v_sqrt, msa_sqrtq_f32) +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float32x4, v_invsqrt, msa_rsqrtq_f32) +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float64x2, v_sqrt, msa_sqrtq_f64) +OPENCV_HAL_IMPL_MSA_BASIC_FUNC(v_float64x2, v_invsqrt, msa_rsqrtq_f64) + +#define OPENCV_HAL_IMPL_MSA_DBL_BIT_OP(bin_op, intrin) \ +inline v_float64x2 operator bin_op (const v_float64x2& a, const v_float64x2& b) \ +{ \ + return v_float64x2(MSA_TPV_REINTERPRET(v2f64, intrin(MSA_TPV_REINTERPRET(v2i64, a.val), MSA_TPV_REINTERPRET(v2i64, b.val)))); \ +} \ +inline v_float64x2& operator bin_op##= (v_float64x2& a, const v_float64x2& b) \ +{ \ + a.val = MSA_TPV_REINTERPRET(v2f64, intrin(MSA_TPV_REINTERPRET(v2i64, a.val), MSA_TPV_REINTERPRET(v2i64, b.val))); \ + return a; \ +} + +OPENCV_HAL_IMPL_MSA_DBL_BIT_OP(&, msa_andq_s64) +OPENCV_HAL_IMPL_MSA_DBL_BIT_OP(|, msa_orrq_s64) +OPENCV_HAL_IMPL_MSA_DBL_BIT_OP(^, msa_eorq_s64) + +inline v_float64x2 operator ~ (const v_float64x2& a) +{ + return v_float64x2(MSA_TPV_REINTERPRET(v2f64, msa_mvnq_s32(MSA_TPV_REINTERPRET(v4i32, a.val)))); +} + +// TODO: exp, log, sin, cos + +#define OPENCV_HAL_IMPL_MSA_BIN_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_min, msa_minq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_max, msa_maxq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_min, msa_minq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_max, msa_maxq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_min, msa_minq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_max, msa_maxq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_min, msa_minq_s16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_max, msa_maxq_s16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint32x4, v_min, msa_minq_u32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint32x4, v_max, msa_maxq_u32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int32x4, v_min, msa_minq_s32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int32x4, v_max, msa_maxq_s32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float32x4, v_min, msa_minq_f32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float32x4, v_max, msa_maxq_f32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float64x2, v_min, msa_minq_f64) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float64x2, v_max, msa_maxq_f64) + +#define OPENCV_HAL_IMPL_MSA_INT_CMP_OP(_Tpvec, _Tpv, suffix, not_suffix) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_ceqq_##suffix(a.val, b.val))); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_mvnq_##not_suffix(msa_ceqq_##suffix(a.val, b.val)))); } \ +inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_cltq_##suffix(a.val, b.val))); } \ +inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_cgtq_##suffix(a.val, b.val))); } \ +inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_cleq_##suffix(a.val, b.val))); } \ +inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_cgeq_##suffix(a.val, b.val))); } + +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_uint8x16, v16u8, u8, u8) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_int8x16, v16i8, s8, u8) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_uint16x8, v8u16, u16, u16) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_int16x8, v8i16, s16, u16) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_uint32x4, v4u32, u32, u32) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_int32x4, v4i32, s32, u32) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_float32x4, v4f32, f32, u32) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_uint64x2, v2u64, u64, u64) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_int64x2, v2i64, s64, u64) +OPENCV_HAL_IMPL_MSA_INT_CMP_OP(v_float64x2, v2f64, f64, u64) + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return v_float32x4(MSA_TPV_REINTERPRET(v4f32, msa_ceqq_f32(a.val, a.val))); } +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return v_float64x2(MSA_TPV_REINTERPRET(v2f64, msa_ceqq_f64(a.val, a.val))); } + +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_add_wrap, msa_addq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_add_wrap, msa_addq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_add_wrap, msa_addq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_add_wrap, msa_addq_s16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_sub_wrap, msa_subq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_sub_wrap, msa_subq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_sub_wrap, msa_subq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_sub_wrap, msa_subq_s16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_mul_wrap, msa_mulq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_mul_wrap, msa_mulq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_mul_wrap, msa_mulq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_mul_wrap, msa_mulq_s16) + +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint8x16, v_absdiff, msa_abdq_u8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint16x8, v_absdiff, msa_abdq_u16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_uint32x4, v_absdiff, msa_abdq_u32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float32x4, v_absdiff, msa_abdq_f32) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_float64x2, v_absdiff, msa_abdq_f64) + +/** Saturating absolute difference **/ +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int8x16, v_absdiffs, msa_qabdq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC(v_int16x8, v_absdiffs, msa_qabdq_s16) + +#define OPENCV_HAL_IMPL_MSA_BIN_FUNC2(_Tpvec, _Tpvec2, _Tpv, func, intrin) \ +inline _Tpvec2 func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec2(MSA_TPV_REINTERPRET(_Tpv, intrin(a.val, b.val))); \ +} + +OPENCV_HAL_IMPL_MSA_BIN_FUNC2(v_int8x16, v_uint8x16, v16u8, v_absdiff, msa_abdq_s8) +OPENCV_HAL_IMPL_MSA_BIN_FUNC2(v_int16x8, v_uint16x8, v8u16, v_absdiff, msa_abdq_s16) +OPENCV_HAL_IMPL_MSA_BIN_FUNC2(v_int32x4, v_uint32x4, v4u32, v_absdiff, msa_abdq_s32) + +/* v_magnitude, v_sqr_magnitude, v_fma, v_muladd */ +inline v_float32x4 v_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + v_float32x4 x(msa_mlaq_f32(msa_mulq_f32(a.val, a.val), b.val, b.val)); + return v_sqrt(x); +} + +inline v_float32x4 v_sqr_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4(msa_mlaq_f32(msa_mulq_f32(a.val, a.val), b.val, b.val)); +} + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_float32x4(msa_mlaq_f32(c.val, a.val, b.val)); +} + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_int32x4(msa_mlaq_s32(c.val, a.val, b.val)); +} + +inline v_float32x4 v_muladd(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_float64x2 v_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + v_float64x2 x(msa_mlaq_f64(msa_mulq_f64(a.val, a.val), b.val, b.val)); + return v_sqrt(x); +} + +inline v_float64x2 v_sqr_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2(msa_mlaq_f64(msa_mulq_f64(a.val, a.val), b.val, b.val)); +} + +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_float64x2(msa_mlaq_f64(c.val, a.val, b.val)); +} + +inline v_float64x2 v_muladd(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_fma(a, b, c); +} + +// trade efficiency for convenience +#define OPENCV_HAL_IMPL_MSA_SHIFT_OP(_Tpvec, suffix, _Tps, ssuffix) \ +inline _Tpvec operator << (const _Tpvec& a, int n) \ +{ return _Tpvec(msa_shlq_##suffix(a.val, msa_dupq_n_##ssuffix((_Tps)n))); } \ +inline _Tpvec operator >> (const _Tpvec& a, int n) \ +{ return _Tpvec(msa_shrq_##suffix(a.val, msa_dupq_n_##ssuffix((_Tps)n))); } \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ return _Tpvec(msa_shlq_n_##suffix(a.val, n)); } \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ return _Tpvec(msa_shrq_n_##suffix(a.val, n)); } \ +template inline _Tpvec v_rshr(const _Tpvec& a) \ +{ return _Tpvec(msa_rshrq_n_##suffix(a.val, n)); } + +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_uint8x16, u8, schar, s8) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_int8x16, s8, schar, s8) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_uint16x8, u16, short, s16) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_int16x8, s16, short, s16) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_uint32x4, u32, int, s32) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_int32x4, s32, int, s32) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_uint64x2, u64, int64, s64) +OPENCV_HAL_IMPL_MSA_SHIFT_OP(v_int64x2, s64, int64, s64) + +/* v_rotate_right, v_rotate_left */ +#define OPENCV_HAL_IMPL_MSA_ROTATE_OP(_Tpvec, _Tpv, _Tpvs, suffix) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_extq_##suffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), msa_dupq_n_##suffix(0), n))); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_extq_##suffix(msa_dupq_n_##suffix(0), MSA_TPV_REINTERPRET(_Tpvs, a.val), _Tpvec::nlanes - n))); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ \ + return a; \ +} \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_extq_##suffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), MSA_TPV_REINTERPRET(_Tpvs, b.val), n))); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_extq_##suffix(MSA_TPV_REINTERPRET(_Tpvs, b.val), MSA_TPV_REINTERPRET(_Tpvs, a.val), _Tpvec::nlanes - n))); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ \ + CV_UNUSED(b); \ + return a; \ +} + +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_uint8x16, v16u8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_int8x16, v16i8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_uint16x8, v8u16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_int16x8, v8i16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_uint32x4, v4u32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_int32x4, v4i32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_float32x4, v4f32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_uint64x2, v2u64, v2i64, s64) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_int64x2, v2i64, v2i64, s64) +OPENCV_HAL_IMPL_MSA_ROTATE_OP(v_float64x2, v2f64, v2i64, s64) + +#define OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(msa_ld1q_##suffix(ptr)); } \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(msa_ld1q_##suffix(ptr)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(msa_combine_##suffix(msa_ld1_##suffix(ptr), msa_dup_n_##suffix((_Tp)0))); } \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ return _Tpvec(msa_combine_##suffix(msa_ld1_##suffix(ptr0), msa_ld1_##suffix(ptr1))); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ msa_st1q_##suffix(ptr, a.val); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ msa_st1q_##suffix(ptr, a.val); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ msa_st1q_##suffix(ptr, a.val); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ msa_st1q_##suffix(ptr, a.val); } \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ \ + int n = _Tpvec::nlanes; \ + for( int i = 0; i < (n/2); i++ ) \ + ptr[i] = a.val[i]; \ +} \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + int n = _Tpvec::nlanes; \ + for( int i = 0; i < (n/2); i++ ) \ + ptr[i] = a.val[i+(n/2)]; \ +} + +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_int16x8, short, s16) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_int32x4, int, s32) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_int64x2, int64, s64) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_float32x4, float, f32) +OPENCV_HAL_IMPL_MSA_LOADSTORE_OP(v_float64x2, double, f64) + + +/** Reverse **/ +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ + v_uint8x16 c = v_uint8x16((v16u8)__builtin_msa_vshf_b((v16i8)((v2i64){0x08090A0B0C0D0E0F, 0x0001020304050607}), msa_dupq_n_s8(0), (v16i8)a.val)); + return c; +} + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ + v_uint16x8 c = v_uint16x8((v8u16)__builtin_msa_vshf_h((v8i16)((v2i64){0x0004000500060007, 0x0000000100020003}), msa_dupq_n_s16(0), (v8i16)a.val)); + return c; +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ + v_uint32x4 c; + c.val[0] = a.val[3]; + c.val[1] = a.val[2]; + c.val[2] = a.val[1]; + c.val[3] = a.val[0]; + return c; +} + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ + v_uint64x2 c; + c.val[0] = a.val[1]; + c.val[1] = a.val[0]; + return c; +} + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + + +#define OPENCV_HAL_IMPL_MSA_REDUCE_OP_8U(func, cfunc) \ +inline unsigned short v_reduce_##func(const v_uint16x8& a) \ +{ \ + v8u16 a_lo, a_hi; \ + ILVRL_H2_UH(a.val, msa_dupq_n_u16(0), a_lo, a_hi); \ + v4u32 b = msa_##func##q_u32(msa_paddlq_u16(a_lo), msa_paddlq_u16(a_hi)); \ + v4u32 b_lo, b_hi; \ + ILVRL_W2_UW(b, msa_dupq_n_u32(0), b_lo, b_hi); \ + v2u64 c = msa_##func##q_u64(msa_paddlq_u32(b_lo), msa_paddlq_u32(b_hi)); \ + return (unsigned short)cfunc(c[0], c[1]); \ +} + +OPENCV_HAL_IMPL_MSA_REDUCE_OP_8U(max, std::max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_8U(min, std::min) + +#define OPENCV_HAL_IMPL_MSA_REDUCE_OP_8S(func, cfunc) \ +inline short v_reduce_##func(const v_int16x8& a) \ +{ \ + v8i16 a_lo, a_hi; \ + ILVRL_H2_SH(a.val, msa_dupq_n_s16(0), a_lo, a_hi); \ + v4i32 b = msa_##func##q_s32(msa_paddlq_s16(a_lo), msa_paddlq_s16(a_hi)); \ + v4i32 b_lo, b_hi; \ + ILVRL_W2_SW(b, msa_dupq_n_s32(0), b_lo, b_hi); \ + v2i64 c = msa_##func##q_s64(msa_paddlq_s32(b_lo), msa_paddlq_s32(b_hi)); \ + return (short)cfunc(c[0], c[1]); \ +} + +OPENCV_HAL_IMPL_MSA_REDUCE_OP_8S(max, std::max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_8S(min, std::min) + +#define OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(_Tpvec, scalartype, func, cfunc) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + return (scalartype)cfunc(cfunc(a.val[0], a.val[1]), cfunc(a.val[2], a.val[3])); \ +} + +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_uint32x4, unsigned, max, std::max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_uint32x4, unsigned, min, std::min) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_int32x4, int, max, std::max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_int32x4, int, min, std::min) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_float32x4, float, max, std::max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_4(v_float32x4, float, min, std::min) + + +#define OPENCV_HAL_IMPL_MSA_REDUCE_OP_16(_Tpvec, scalartype, _Tpvec2, func) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpvec2 a1, a2; \ + v_expand(a, a1, a2); \ + return (scalartype)v_reduce_##func(v_##func(a1, a2)); \ +} + +OPENCV_HAL_IMPL_MSA_REDUCE_OP_16(v_uint8x16, uchar, v_uint16x8, min) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_16(v_uint8x16, uchar, v_uint16x8, max) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_16(v_int8x16, char, v_int16x8, min) +OPENCV_HAL_IMPL_MSA_REDUCE_OP_16(v_int8x16, char, v_int16x8, max) + + + +#define OPENCV_HAL_IMPL_MSA_REDUCE_SUM(_Tpvec, scalartype, suffix) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + return (scalartype)msa_sum_##suffix(a.val); \ +} + +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_uint8x16, unsigned short, u8) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_int8x16, short, s8) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_uint16x8, unsigned, u16) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_int16x8, int, s16) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_uint32x4, uint64_t, u32) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_int32x4, int64_t, s32) +OPENCV_HAL_IMPL_MSA_REDUCE_SUM(v_float32x4, float, f32) + +inline uint64 v_reduce_sum(const v_uint64x2& a) +{ return (uint64)(msa_getq_lane_u64(a.val, 0) + msa_getq_lane_u64(a.val, 1)); } +inline int64 v_reduce_sum(const v_int64x2& a) +{ return (int64)(msa_getq_lane_s64(a.val, 0) + msa_getq_lane_s64(a.val, 1)); } +inline double v_reduce_sum(const v_float64x2& a) +{ + return msa_getq_lane_f64(a.val, 0) + msa_getq_lane_f64(a.val, 1); +} + +/* v_reduce_sum4, v_reduce_sad */ +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + v4f32 u0 = msa_addq_f32(MSA_TPV_REINTERPRET(v4f32, msa_ilvevq_s32(MSA_TPV_REINTERPRET(v4i32, b.val), MSA_TPV_REINTERPRET(v4i32, a.val))), + MSA_TPV_REINTERPRET(v4f32, msa_ilvodq_s32(MSA_TPV_REINTERPRET(v4i32, b.val), MSA_TPV_REINTERPRET(v4i32, a.val)))); // a0+a1 b0+b1 a2+a3 b2+b3 + v4f32 u1 = msa_addq_f32(MSA_TPV_REINTERPRET(v4f32, msa_ilvevq_s32(MSA_TPV_REINTERPRET(v4i32, d.val), MSA_TPV_REINTERPRET(v4i32, c.val))), + MSA_TPV_REINTERPRET(v4f32, msa_ilvodq_s32(MSA_TPV_REINTERPRET(v4i32, d.val), MSA_TPV_REINTERPRET(v4i32, c.val)))); // c0+c1 d0+d1 c2+c3 d2+d3 + + return v_float32x4(msa_addq_f32(MSA_TPV_REINTERPRET(v4f32, msa_ilvrq_s64(MSA_TPV_REINTERPRET(v2i64, u1), MSA_TPV_REINTERPRET(v2i64, u0))), + MSA_TPV_REINTERPRET(v4f32, msa_ilvlq_s64(MSA_TPV_REINTERPRET(v2i64, u1), MSA_TPV_REINTERPRET(v2i64, u0))))); +} + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ + v16u8 t0 = msa_abdq_u8(a.val, b.val); + v8u16 t1 = msa_paddlq_u8(t0); + v4u32 t2 = msa_paddlq_u16(t1); + return msa_sum_u32(t2); +} +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ + v16u8 t0 = MSA_TPV_REINTERPRET(v16u8, msa_abdq_s8(a.val, b.val)); + v8u16 t1 = msa_paddlq_u8(t0); + v4u32 t2 = msa_paddlq_u16(t1); + return msa_sum_u32(t2); +} +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ + v8u16 t0 = msa_abdq_u16(a.val, b.val); + v4u32 t1 = msa_paddlq_u16(t0); + return msa_sum_u32(t1); +} +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ + v8u16 t0 = MSA_TPV_REINTERPRET(v8u16, msa_abdq_s16(a.val, b.val)); + v4u32 t1 = msa_paddlq_u16(t0); + return msa_sum_u32(t1); +} +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ + v4u32 t0 = msa_abdq_u32(a.val, b.val); + return msa_sum_u32(t0); +} +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ + v4u32 t0 = MSA_TPV_REINTERPRET(v4u32, msa_abdq_s32(a.val, b.val)); + return msa_sum_u32(t0); +} +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + v4f32 t0 = msa_abdq_f32(a.val, b.val); + return msa_sum_f32(t0); +} + +/* v_popcount */ +#define OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE8(_Tpvec) \ +inline v_uint8x16 v_popcount(const _Tpvec& a) \ +{ \ + v16u8 t = MSA_TPV_REINTERPRET(v16u8, msa_cntq_s8(MSA_TPV_REINTERPRET(v16i8, a.val))); \ + return v_uint8x16(t); \ +} +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE8(v_uint8x16) +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE8(v_int8x16) + +#define OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE16(_Tpvec) \ +inline v_uint16x8 v_popcount(const _Tpvec& a) \ +{ \ + v8u16 t = MSA_TPV_REINTERPRET(v8u16, msa_cntq_s16(MSA_TPV_REINTERPRET(v8i16, a.val))); \ + return v_uint16x8(t); \ +} +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE16(v_uint16x8) +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE16(v_int16x8) + +#define OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE32(_Tpvec) \ +inline v_uint32x4 v_popcount(const _Tpvec& a) \ +{ \ + v4u32 t = MSA_TPV_REINTERPRET(v4u32, msa_cntq_s32(MSA_TPV_REINTERPRET(v4i32, a.val))); \ + return v_uint32x4(t); \ +} +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE32(v_uint32x4) +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE32(v_int32x4) + +#define OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE64(_Tpvec) \ +inline v_uint64x2 v_popcount(const _Tpvec& a) \ +{ \ + v2u64 t = MSA_TPV_REINTERPRET(v2u64, msa_cntq_s64(MSA_TPV_REINTERPRET(v2i64, a.val))); \ + return v_uint64x2(t); \ +} +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE64(v_uint64x2) +OPENCV_HAL_IMPL_MSA_POPCOUNT_SIZE64(v_int64x2) + +inline int v_signmask(const v_uint8x16& a) +{ + v8i8 m0 = msa_create_s8(CV_BIG_UINT(0x0706050403020100)); + v16u8 v0 = msa_shlq_u8(msa_shrq_n_u8(a.val, 7), msa_combine_s8(m0, m0)); + v8u16 v1 = msa_paddlq_u8(v0); + v4u32 v2 = msa_paddlq_u16(v1); + v2u64 v3 = msa_paddlq_u32(v2); + return (int)msa_getq_lane_u64(v3, 0) + ((int)msa_getq_lane_u64(v3, 1) << 8); +} +inline int v_signmask(const v_int8x16& a) +{ return v_signmask(v_reinterpret_as_u8(a)); } + +inline int v_signmask(const v_uint16x8& a) +{ + v4i16 m0 = msa_create_s16(CV_BIG_UINT(0x0003000200010000)); + v8u16 v0 = msa_shlq_u16(msa_shrq_n_u16(a.val, 15), msa_combine_s16(m0, m0)); + v4u32 v1 = msa_paddlq_u16(v0); + v2u64 v2 = msa_paddlq_u32(v1); + return (int)msa_getq_lane_u64(v2, 0) + ((int)msa_getq_lane_u64(v2, 1) << 4); +} +inline int v_signmask(const v_int16x8& a) +{ return v_signmask(v_reinterpret_as_u16(a)); } + +inline int v_signmask(const v_uint32x4& a) +{ + v2i32 m0 = msa_create_s32(CV_BIG_UINT(0x0000000100000000)); + v4u32 v0 = msa_shlq_u32(msa_shrq_n_u32(a.val, 31), msa_combine_s32(m0, m0)); + v2u64 v1 = msa_paddlq_u32(v0); + return (int)msa_getq_lane_u64(v1, 0) + ((int)msa_getq_lane_u64(v1, 1) << 2); +} +inline int v_signmask(const v_int32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } + +inline int v_signmask(const v_uint64x2& a) +{ + v2u64 v0 = msa_shrq_n_u64(a.val, 63); + return (int)msa_getq_lane_u64(v0, 0) + ((int)msa_getq_lane_u64(v0, 1) << 1); +} +inline int v_signmask(const v_int64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(a)); } + +#define OPENCV_HAL_IMPL_MSA_CHECK_ALLANY(_Tpvec, _Tpvec2, suffix, shift) \ +inline bool v_check_all(const v_##_Tpvec& a) \ +{ \ + _Tpvec2 v0 = msa_shrq_n_##suffix(msa_mvnq_##suffix(a.val), shift); \ + v2u64 v1 = MSA_TPV_REINTERPRET(v2u64, v0); \ + return (msa_getq_lane_u64(v1, 0) | msa_getq_lane_u64(v1, 1)) == 0; \ +} \ +inline bool v_check_any(const v_##_Tpvec& a) \ +{ \ + _Tpvec2 v0 = msa_shrq_n_##suffix(a.val, shift); \ + v2u64 v1 = MSA_TPV_REINTERPRET(v2u64, v0); \ + return (msa_getq_lane_u64(v1, 0) | msa_getq_lane_u64(v1, 1)) != 0; \ +} + +OPENCV_HAL_IMPL_MSA_CHECK_ALLANY(uint8x16, v16u8, u8, 7) +OPENCV_HAL_IMPL_MSA_CHECK_ALLANY(uint16x8, v8u16, u16, 15) +OPENCV_HAL_IMPL_MSA_CHECK_ALLANY(uint32x4, v4u32, u32, 31) +OPENCV_HAL_IMPL_MSA_CHECK_ALLANY(uint64x2, v2u64, u64, 63) + +inline bool v_check_all(const v_int8x16& a) +{ return v_check_all(v_reinterpret_as_u8(a)); } +inline bool v_check_all(const v_int16x8& a) +{ return v_check_all(v_reinterpret_as_u16(a)); } +inline bool v_check_all(const v_int32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } + +inline bool v_check_any(const v_int8x16& a) +{ return v_check_any(v_reinterpret_as_u8(a)); } +inline bool v_check_any(const v_int16x8& a) +{ return v_check_any(v_reinterpret_as_u16(a)); } +inline bool v_check_any(const v_int32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } + +inline bool v_check_all(const v_int64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_int64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } + +/* v_select */ +#define OPENCV_HAL_IMPL_MSA_SELECT(_Tpvec, _Tpv, _Tpvu) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_bslq_u8(MSA_TPV_REINTERPRET(_Tpvu, mask.val), \ + MSA_TPV_REINTERPRET(_Tpvu, b.val), MSA_TPV_REINTERPRET(_Tpvu, a.val)))); \ +} + +OPENCV_HAL_IMPL_MSA_SELECT(v_uint8x16, v16u8, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_int8x16, v16i8, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_uint16x8, v8u16, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_int16x8, v8i16, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_uint32x4, v4u32, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_int32x4, v4i32, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_float32x4, v4f32, v16u8) +OPENCV_HAL_IMPL_MSA_SELECT(v_float64x2, v2f64, v16u8) + +#define OPENCV_HAL_IMPL_MSA_EXPAND(_Tpvec, _Tpwvec, _Tp, suffix, ssuffix, _Tpv, _Tpvs) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + _Tpv a_lo = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), msa_dupq_n_##ssuffix(0))); \ + _Tpv a_hi = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), msa_dupq_n_##ssuffix(0))); \ + b0.val = msa_paddlq_##suffix(a_lo); \ + b1.val = msa_paddlq_##suffix(a_hi); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + _Tpv a_lo = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), msa_dupq_n_##ssuffix(0))); \ + return _Tpwvec(msa_paddlq_##suffix(a_lo)); \ +} \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + _Tpv a_hi = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), msa_dupq_n_##ssuffix(0))); \ + return _Tpwvec(msa_paddlq_##suffix(a_hi)); \ +} \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + return _Tpwvec(msa_movl_##suffix(msa_ld1_##suffix(ptr))); \ +} + +OPENCV_HAL_IMPL_MSA_EXPAND(v_uint8x16, v_uint16x8, uchar, u8, s8, v16u8, v16i8) +OPENCV_HAL_IMPL_MSA_EXPAND(v_int8x16, v_int16x8, schar, s8, s8, v16i8, v16i8) +OPENCV_HAL_IMPL_MSA_EXPAND(v_uint16x8, v_uint32x4, ushort, u16, s16, v8u16, v8i16) +OPENCV_HAL_IMPL_MSA_EXPAND(v_int16x8, v_int32x4, short, s16, s16, v8i16, v8i16) +OPENCV_HAL_IMPL_MSA_EXPAND(v_uint32x4, v_uint64x2, uint, u32, s32, v4u32, v4i32) +OPENCV_HAL_IMPL_MSA_EXPAND(v_int32x4, v_int64x2, int, s32, s32, v4i32, v4i32) + +inline v_uint32x4 v_load_expand_q(const uchar* ptr) +{ + return v_uint32x4((v4u32){ptr[0], ptr[1], ptr[2], ptr[3]}); +} + +inline v_int32x4 v_load_expand_q(const schar* ptr) +{ + return v_int32x4((v4i32){ptr[0], ptr[1], ptr[2], ptr[3]}); +} + +/* v_zip, v_combine_low, v_combine_high, v_recombine */ +#define OPENCV_HAL_IMPL_MSA_UNPACKS(_Tpvec, _Tpv, _Tpvs, ssuffix) \ +inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) \ +{ \ + b0.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a1.val), MSA_TPV_REINTERPRET(_Tpvs, a0.val))); \ + b1.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a1.val), MSA_TPV_REINTERPRET(_Tpvs, a0.val))); \ +} \ +inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_s64(MSA_TPV_REINTERPRET(v2i64, b.val), MSA_TPV_REINTERPRET(v2i64, a.val)))); \ +} \ +inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_s64(MSA_TPV_REINTERPRET(v2i64, b.val), MSA_TPV_REINTERPRET(v2i64, a.val)))); \ +} \ +inline void v_recombine(const _Tpvec& a, const _Tpvec& b, _Tpvec& c, _Tpvec& d) \ +{ \ + c.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_s64(MSA_TPV_REINTERPRET(v2i64, b.val), MSA_TPV_REINTERPRET(v2i64, a.val))); \ + d.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_s64(MSA_TPV_REINTERPRET(v2i64, b.val), MSA_TPV_REINTERPRET(v2i64, a.val))); \ +} + +OPENCV_HAL_IMPL_MSA_UNPACKS(v_uint8x16, v16u8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_int8x16, v16i8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_uint16x8, v8u16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_int16x8, v8i16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_uint32x4, v4u32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_int32x4, v4i32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_float32x4, v4f32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_UNPACKS(v_float64x2, v2f64, v2i64, s64) + +/* v_extract */ +#define OPENCV_HAL_IMPL_MSA_EXTRACT(_Tpvec, _Tpv, _Tpvs, suffix) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(MSA_TPV_REINTERPRET(_Tpv, msa_extq_##suffix(MSA_TPV_REINTERPRET(_Tpvs, a.val), MSA_TPV_REINTERPRET(_Tpvs, b.val), s))); \ +} + +OPENCV_HAL_IMPL_MSA_EXTRACT(v_uint8x16, v16u8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_int8x16, v16i8, v16i8, s8) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_uint16x8, v8u16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_int16x8, v8i16, v8i16, s16) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_uint32x4, v4u32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_int32x4, v4i32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_uint64x2, v2u64, v2i64, s64) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_int64x2, v2i64, v2i64, s64) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_float32x4, v4f32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_EXTRACT(v_float64x2, v2f64, v2i64, s64) + +/* v_round, v_floor, v_ceil, v_trunc */ +inline v_int32x4 v_round(const v_float32x4& a) +{ + return v_int32x4(msa_cvttintq_s32_f32(a.val)); +} + +inline v_int32x4 v_floor(const v_float32x4& a) +{ + v4i32 a1 = msa_cvttintq_s32_f32(a.val); + return v_int32x4(msa_addq_s32(a1, MSA_TPV_REINTERPRET(v4i32, msa_cgtq_f32(msa_cvtfintq_f32_s32(a1), a.val)))); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + v4i32 a1 = msa_cvttintq_s32_f32(a.val); + return v_int32x4(msa_subq_s32(a1, MSA_TPV_REINTERPRET(v4i32, msa_cgtq_f32(a.val, msa_cvtfintq_f32_s32(a1))))); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ + return v_int32x4(msa_cvttruncq_s32_f32(a.val)); +} + +inline v_int32x4 v_round(const v_float64x2& a) +{ + return v_int32x4(msa_pack_s64(msa_cvttintq_s64_f64(a.val), msa_dupq_n_s64(0))); +} + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + return v_int32x4(msa_pack_s64(msa_cvttintq_s64_f64(a.val), msa_cvttintq_s64_f64(b.val))); +} + +inline v_int32x4 v_floor(const v_float64x2& a) +{ + v2f64 a1 = msa_cvtrintq_f64(a.val); + return v_int32x4(msa_pack_s64(msa_addq_s64(msa_cvttruncq_s64_f64(a1), MSA_TPV_REINTERPRET(v2i64, msa_cgtq_f64(a1, a.val))), msa_dupq_n_s64(0))); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + v2f64 a1 = msa_cvtrintq_f64(a.val); + return v_int32x4(msa_pack_s64(msa_subq_s64(msa_cvttruncq_s64_f64(a1), MSA_TPV_REINTERPRET(v2i64, msa_cgtq_f64(a.val, a1))), msa_dupq_n_s64(0))); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ + return v_int32x4(msa_pack_s64(msa_cvttruncq_s64_f64(a.val), msa_dupq_n_s64(0))); +} + +#define OPENCV_HAL_IMPL_MSA_TRANSPOSE4x4(_Tpvec, _Tpv, _Tpvs, ssuffix) \ +inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, \ + _Tpvec& b2, _Tpvec& b3) \ +{ \ + _Tpv t00 = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a1.val), MSA_TPV_REINTERPRET(_Tpvs, a0.val))); \ + _Tpv t01 = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a1.val), MSA_TPV_REINTERPRET(_Tpvs, a0.val))); \ + _Tpv t10 = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a3.val), MSA_TPV_REINTERPRET(_Tpvs, a2.val))); \ + _Tpv t11 = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_##ssuffix(MSA_TPV_REINTERPRET(_Tpvs, a3.val), MSA_TPV_REINTERPRET(_Tpvs, a2.val))); \ + b0.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_s64(MSA_TPV_REINTERPRET(v2i64, t10), MSA_TPV_REINTERPRET(v2i64, t00))); \ + b1.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_s64(MSA_TPV_REINTERPRET(v2i64, t10), MSA_TPV_REINTERPRET(v2i64, t00))); \ + b2.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvrq_s64(MSA_TPV_REINTERPRET(v2i64, t11), MSA_TPV_REINTERPRET(v2i64, t01))); \ + b3.val = MSA_TPV_REINTERPRET(_Tpv, msa_ilvlq_s64(MSA_TPV_REINTERPRET(v2i64, t11), MSA_TPV_REINTERPRET(v2i64, t01))); \ +} + +OPENCV_HAL_IMPL_MSA_TRANSPOSE4x4(v_uint32x4, v4u32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_TRANSPOSE4x4(v_int32x4, v4i32, v4i32, s32) +OPENCV_HAL_IMPL_MSA_TRANSPOSE4x4(v_float32x4, v4f32, v4i32, s32) + +#define OPENCV_HAL_IMPL_MSA_INTERLEAVED(_Tpvec, _Tp, suffix) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b) \ +{ \ + msa_ld2q_##suffix(ptr, &a.val, &b.val); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, v_##_Tpvec& c) \ +{ \ + msa_ld3q_##suffix(ptr, &a.val, &b.val, &c.val); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, \ + v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + msa_ld4q_##suffix(ptr, &a.val, &b.val, &c.val, &d.val); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + msa_st2q_##suffix(ptr, a.val, b.val); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + msa_st3q_##suffix(ptr, a.val, b.val, c.val); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, const v_##_Tpvec& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + msa_st4q_##suffix(ptr, a.val, b.val, c.val, d.val); \ +} + +OPENCV_HAL_IMPL_MSA_INTERLEAVED(uint8x16, uchar, u8) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(int8x16, schar, s8) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(uint16x8, ushort, u16) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(int16x8, short, s16) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(int32x4, int, s32) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(float32x4, float, f32) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(uint64x2, uint64, u64) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(int64x2, int64, s64) +OPENCV_HAL_IMPL_MSA_INTERLEAVED(float64x2, double, f64) + +/* v_cvt_f32, v_cvt_f64, v_cvt_f64_high */ +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(msa_cvtfintq_f32_s32(a.val)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + return v_float32x4(msa_cvtfq_f32_f64(a.val, msa_dupq_n_f64(0.0f))); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + return v_float32x4(msa_cvtfq_f32_f64(a.val, b.val)); +} + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ + return v_float64x2(msa_cvtflq_f64_f32(msa_cvtfintq_f32_s32(a.val))); +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ + return v_float64x2(msa_cvtfhq_f64_f32(msa_cvtfintq_f32_s32(a.val))); +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + return v_float64x2(msa_cvtflq_f64_f32(a.val)); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + return v_float64x2(msa_cvtfhq_f64_f32(a.val)); +} + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ + return v_float64x2(msa_cvtfintq_f64_s64(a.val)); +} + +////////////// Lookup table access //////////////////// +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[ 0]], + tab[idx[ 1]], + tab[idx[ 2]], + tab[idx[ 3]], + tab[idx[ 4]], + tab[idx[ 5]], + tab[idx[ 6]], + tab[idx[ 7]], + tab[idx[ 8]], + tab[idx[ 9]], + tab[idx[10]], + tab[idx[11]], + tab[idx[12]], + tab[idx[13]], + tab[idx[14]], + tab[idx[15]] + }; + return v_int8x16(msa_ld1q_s8(elems)); +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[4]], + tab[idx[4] + 1], + tab[idx[5]], + tab[idx[5] + 1], + tab[idx[6]], + tab[idx[6] + 1], + tab[idx[7]], + tab[idx[7] + 1] + }; + return v_int8x16(msa_ld1q_s8(elems)); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[2] + 2], + tab[idx[2] + 3], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[3] + 2], + tab[idx[3] + 3] + }; + return v_int8x16(msa_ld1q_s8(elems)); +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((schar*)tab, idx)); } + + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]], + tab[idx[4]], + tab[idx[5]], + tab[idx[6]], + tab[idx[7]] + }; + return v_int16x8(msa_ld1q_s16(elems)); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1] + }; + return v_int16x8(msa_ld1q_s16(elems)); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_int16x8(msa_combine_s16(msa_ld1_s16(tab + idx[0]), msa_ld1_s16(tab + idx[1]))); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((short*)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((short*)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((short*)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_int32x4(msa_ld1q_s32(elems)); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + return v_int32x4(msa_combine_s32(msa_ld1_s32(tab + idx[0]), msa_ld1_s32(tab + idx[1]))); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(msa_ld1q_s32(tab + idx[0])); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((int*)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((int*)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((int*)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + return v_int64x2(msa_combine_s64(msa_create_s64(tab[idx[0]]), msa_create_s64(tab[idx[1]]))); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(msa_ld1q_s64(tab + idx[0])); +} +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_float32x4(msa_ld1q_f32(elems)); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) +{ + uint64 CV_DECL_ALIGNED(32) elems[2] = + { + *(uint64*)(tab + idx[0]), + *(uint64*)(tab + idx[1]) + }; + return v_float32x4(MSA_TPV_REINTERPRET(v4f32, msa_ld1q_u64(elems))); +} +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) +{ + return v_float32x4(msa_ld1q_f32(tab + idx[0])); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + return v_int32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + unsigned CV_DECL_ALIGNED(32) elems[4] = + { + tab[msa_getq_lane_s32(idxvec.val, 0)], + tab[msa_getq_lane_s32(idxvec.val, 1)], + tab[msa_getq_lane_s32(idxvec.val, 2)], + tab[msa_getq_lane_s32(idxvec.val, 3)] + }; + return v_uint32x4(msa_ld1q_u32(elems)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + return v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + v4f32 xy02 = msa_combine_f32(msa_ld1_f32(tab + idx[0]), msa_ld1_f32(tab + idx[2])); + v4f32 xy13 = msa_combine_f32(msa_ld1_f32(tab + idx[1]), msa_ld1_f32(tab + idx[3])); + x = v_float32x4(MSA_TPV_REINTERPRET(v4f32, msa_ilvevq_s32(MSA_TPV_REINTERPRET(v4i32, xy13), MSA_TPV_REINTERPRET(v4i32, xy02)))); + y = v_float32x4(MSA_TPV_REINTERPRET(v4f32, msa_ilvodq_s32(MSA_TPV_REINTERPRET(v4i32, xy13), MSA_TPV_REINTERPRET(v4i32, xy02)))); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + v_int8x16 c = v_int8x16(__builtin_msa_vshf_b((v16i8)((v2i64){0x0705060403010200, 0x0F0D0E0C0B090A08}), msa_dupq_n_s8(0), vec.val)); + return c; +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + v_int8x16 c = v_int8x16(__builtin_msa_vshf_b((v16i8)((v2i64){0x0703060205010400, 0x0F0B0E0A0D090C08}), msa_dupq_n_s8(0), vec.val)); + return c; +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + v_int16x8 c = v_int16x8(__builtin_msa_vshf_h((v8i16)((v2i64){0x0003000100020000, 0x0007000500060004}), msa_dupq_n_s16(0), vec.val)); + return c; +} + +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } + +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + v_int16x8 c = v_int16x8(__builtin_msa_vshf_h((v8i16)((v2i64){0x0005000100040000, 0x0007000300060002}), msa_dupq_n_s16(0), vec.val)); + return c; +} + +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + v_int32x4 c; + c.val[0] = vec.val[0]; + c.val[1] = vec.val[2]; + c.val[2] = vec.val[1]; + c.val[3] = vec.val[3]; + return c; +} + +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + v_int8x16 c = v_int8x16(__builtin_msa_vshf_b((v16i8)((v2i64){0x0908060504020100, 0x131211100E0D0C0A}), msa_dupq_n_s8(0), vec.val)); + return c; +} + +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + v_int16x8 c = v_int16x8(__builtin_msa_vshf_h((v8i16)((v2i64){0x0004000200010000, 0x0009000800060005}), msa_dupq_n_s16(0), vec.val)); + return c; +} + +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + double CV_DECL_ALIGNED(32) elems[2] = + { + tab[idx[0]], + tab[idx[1]] + }; + return v_float64x2(msa_ld1q_f64(elems)); +} + +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2(msa_ld1q_f64(tab + idx[0])); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + return v_float64x2(tab[idx[0]], tab[idx[1]]); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + v2f64 xy0 = msa_ld1q_f64(tab + idx[0]); + v2f64 xy1 = msa_ld1q_f64(tab + idx[1]); + x = v_float64x2(MSA_TPV_REINTERPRET(v2f64, msa_ilvevq_s64(MSA_TPV_REINTERPRET(v2i64, xy1), MSA_TPV_REINTERPRET(v2i64, xy0)))); + y = v_float64x2(MSA_TPV_REINTERPRET(v2f64, msa_ilvodq_s64(MSA_TPV_REINTERPRET(v2i64, xy1), MSA_TPV_REINTERPRET(v2i64, xy0)))); +} + +template +inline typename _Tp::lane_type v_extract_n(const _Tp& a) +{ + return v_rotate_right(a).get0(); +} + +template +inline v_uint32x4 v_broadcast_element(const v_uint32x4& a) +{ + return v_setall_u32(v_extract_n(a)); +} +template +inline v_int32x4 v_broadcast_element(const v_int32x4& a) +{ + return v_setall_s32(v_extract_n(a)); +} +template +inline v_float32x4 v_broadcast_element(const v_float32x4& a) +{ + return v_setall_f32(v_extract_n(a)); +} + +////// FP16 support /////// +#if CV_FP16 +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ +#ifndef msa_ld1_f16 + v4f16 v = (v4f16)msa_ld1_s16((const short*)ptr); +#else + v4f16 v = msa_ld1_f16((const __fp16*)ptr); +#endif + return v_float32x4(msa_cvt_f32_f16(v)); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + v4f16 hv = msa_cvt_f16_f32(v.val); + +#ifndef msa_st1_f16 + msa_st1_s16((short*)ptr, (int16x4_t)hv); +#else + msa_st1_f16((__fp16*)ptr, hv); +#endif +} +#else +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + float buf[4]; + for( int i = 0; i < 4; i++ ) + buf[i] = (float)ptr[i]; + return v_load(buf); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + float buf[4]; + v_store(buf, v); + for( int i = 0; i < 4; i++ ) + ptr[i] = (float16_t)buf[i]; +} +#endif + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_neon.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_neon.hpp new file mode 100644 index 0000000..ee99341 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_neon.hpp @@ -0,0 +1,2657 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_INTRIN_NEON_HPP +#define OPENCV_HAL_INTRIN_NEON_HPP + +#include +#include "opencv2/core/utility.hpp" + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define CV_SIMD128 1 +#if defined(__aarch64__) || defined(_M_ARM64) +#define CV_SIMD128_64F 1 +#else +#define CV_SIMD128_64F 0 +#endif + +// The following macro checks if the code is being compiled for the +// AArch64 execution state of Armv8, to enable the 128-bit +// intrinsics. The macro `__ARM_64BIT_STATE` is the one recommended by +// the Arm C Language Extension (ACLE) specifications [1] to check the +// availability of 128-bit intrinsics, and it is supporrted by clang +// and gcc. The macro `_M_ARM64` is the equivalent one for Microsoft +// Visual Studio [2] . +// +// [1] https://developer.arm.com/documentation/101028/0012/13--Advanced-SIMD--Neon--intrinsics +// [2] https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros +#if defined(__ARM_64BIT_STATE) || defined(_M_ARM64) +#define CV_NEON_AARCH64 1 +#else +#define CV_NEON_AARCH64 0 +#endif + + +//////////// Utils //////////// + +#if CV_SIMD128_64F +#define OPENCV_HAL_IMPL_NEON_UNZIP(_Tpv, _Tpvx2, suffix) \ + inline void _v128_unzip(const _Tpv& a, const _Tpv& b, _Tpv& c, _Tpv& d) \ + { c = vuzp1q_##suffix(a, b); d = vuzp2q_##suffix(a, b); } +#define OPENCV_HAL_IMPL_NEON_UNZIP_L(_Tpv, _Tpvx2, suffix) \ + inline void _v128_unzip(const _Tpv&a, const _Tpv&b, _Tpv& c, _Tpv& d) \ + { c = vuzp1_##suffix(a, b); d = vuzp2_##suffix(a, b); } +#else +#define OPENCV_HAL_IMPL_NEON_UNZIP(_Tpv, _Tpvx2, suffix) \ + inline void _v128_unzip(const _Tpv& a, const _Tpv& b, _Tpv& c, _Tpv& d) \ + { _Tpvx2 ab = vuzpq_##suffix(a, b); c = ab.val[0]; d = ab.val[1]; } +#define OPENCV_HAL_IMPL_NEON_UNZIP_L(_Tpv, _Tpvx2, suffix) \ + inline void _v128_unzip(const _Tpv& a, const _Tpv& b, _Tpv& c, _Tpv& d) \ + { _Tpvx2 ab = vuzp_##suffix(a, b); c = ab.val[0]; d = ab.val[1]; } +#endif + +#if CV_SIMD128_64F +#define OPENCV_HAL_IMPL_NEON_REINTERPRET(_Tpv, suffix) \ + template static inline \ + _Tpv vreinterpretq_##suffix##_f64(T a) { return (_Tpv) a; } \ + template static inline \ + float64x2_t vreinterpretq_f64_##suffix(T a) { return (float64x2_t) a; } +#else +#define OPENCV_HAL_IMPL_NEON_REINTERPRET(_Tpv, suffix) +#endif + +#define OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(_Tpv, _Tpvl, suffix) \ + OPENCV_HAL_IMPL_NEON_UNZIP(_Tpv##_t, _Tpv##x2_t, suffix) \ + OPENCV_HAL_IMPL_NEON_UNZIP_L(_Tpvl##_t, _Tpvl##x2_t, suffix) \ + OPENCV_HAL_IMPL_NEON_REINTERPRET(_Tpv##_t, suffix) + +#define OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX_I64(_Tpv, _Tpvl, suffix) \ + OPENCV_HAL_IMPL_NEON_REINTERPRET(_Tpv##_t, suffix) + +#define OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX_F64(_Tpv, _Tpvl, suffix) \ + OPENCV_HAL_IMPL_NEON_UNZIP(_Tpv##_t, _Tpv##x2_t, suffix) + +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(uint8x16, uint8x8, u8) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(int8x16, int8x8, s8) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(uint16x8, uint16x4, u16) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(int16x8, int16x4, s16) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(uint32x4, uint32x2, u32) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(int32x4, int32x2, s32) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX(float32x4, float32x2, f32) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX_I64(uint64x2, uint64x1, u64) +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX_I64(int64x2, int64x1, s64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_UTILS_SUFFIX_F64(float64x2, float64x1,f64) +#endif + +//////////// Compatibility layer //////////// +template struct VTraits { + static inline int vlanes() { return T::nlanes; } + enum { max_nlanes = T::nlanes, nlanes = T::nlanes }; + using lane_type = typename T::lane_type; +}; + +template +inline typename VTraits::lane_type v_get0(const T& v) \ +{ \ + return v.get0(); \ +} +//////////// Types //////////// + +struct v_uint8x16 +{ + v_uint8x16() {} + explicit v_uint8x16(uint8x16_t v) : val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = vld1q_u8(v); + } + uint8x16_t val; + +private: + friend struct VTraits; + enum { nlanes = 16 }; + typedef uchar lane_type; + + friend typename VTraits::lane_type v_get0(const v_uint8x16& v); + uchar get0() const + { + return vgetq_lane_u8(val, 0); + } +}; + +struct v_int8x16 +{ + v_int8x16() {} + explicit v_int8x16(int8x16_t v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = vld1q_s8(v); + } + int8x16_t val; + +private: + friend struct VTraits; + enum { nlanes = 16 }; + typedef schar lane_type; + + friend typename VTraits::lane_type v_get0(const v_int8x16& v); + schar get0() const + { + return vgetq_lane_s8(val, 0); + } +}; + +struct v_uint16x8 +{ + v_uint16x8() {} + explicit v_uint16x8(uint16x8_t v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = vld1q_u16(v); + } + uint16x8_t val; + +private: + friend struct VTraits; + enum { nlanes = 8 }; + typedef ushort lane_type; + + friend typename VTraits::lane_type v_get0(const v_uint16x8& v); + ushort get0() const + { + return vgetq_lane_u16(val, 0); + } +}; + +struct v_int16x8 +{ + v_int16x8() {} + explicit v_int16x8(int16x8_t v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = vld1q_s16(v); + } + int16x8_t val; + +private: + friend struct VTraits; + enum { nlanes = 8 }; + typedef short lane_type; + + friend typename VTraits::lane_type v_get0(const v_int16x8& v); + short get0() const + { + return vgetq_lane_s16(val, 0); + } +}; + +struct v_uint32x4 +{ + v_uint32x4() {} + explicit v_uint32x4(uint32x4_t v) : val(v) {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + unsigned v[] = {v0, v1, v2, v3}; + val = vld1q_u32(v); + } + uint32x4_t val; + +private: + friend struct VTraits; + enum { nlanes = 4 }; + typedef unsigned lane_type; + + friend typename VTraits::lane_type v_get0(const v_uint32x4& v); + unsigned get0() const + { + return vgetq_lane_u32(val, 0); + } +}; + +struct v_int32x4 +{ + v_int32x4() {} + explicit v_int32x4(int32x4_t v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + val = vld1q_s32(v); + } + int32x4_t val; + +private: + friend struct VTraits; + enum { nlanes = 4 }; + typedef int lane_type; + + friend typename VTraits::lane_type v_get0(const v_int32x4& v); + int get0() const + { + return vgetq_lane_s32(val, 0); + } +}; + +struct v_float32x4 +{ + v_float32x4() {} + explicit v_float32x4(float32x4_t v) : val(v) {} + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + val = vld1q_f32(v); + } + float32x4_t val; + +private: + friend struct VTraits; + enum { nlanes = 4 }; + typedef float lane_type; + + friend typename VTraits::lane_type v_get0(const v_float32x4& v); + float get0() const + { + return vgetq_lane_f32(val, 0); + } +}; + +struct v_uint64x2 +{ + v_uint64x2() {} + explicit v_uint64x2(uint64x2_t v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + val = vld1q_u64(v); + } + uint64x2_t val; +private: + friend struct VTraits; + enum { nlanes = 2 }; + typedef uint64 lane_type; + + friend typename VTraits::lane_type v_get0(const v_uint64x2& v); + uint64 get0() const + { + return vgetq_lane_u64(val, 0); + } +}; + +struct v_int64x2 +{ + v_int64x2() {} + explicit v_int64x2(int64x2_t v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + val = vld1q_s64(v); + } + int64x2_t val; + +private: + friend struct VTraits; + enum { nlanes = 2 }; + typedef int64 lane_type; + + friend typename VTraits::lane_type v_get0(const v_int64x2& v); + int64 get0() const + { + return vgetq_lane_s64(val, 0); + } +}; + +#if CV_SIMD128_64F +struct v_float64x2 +{ + v_float64x2() {} + explicit v_float64x2(float64x2_t v) : val(v) {} + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + val = vld1q_f64(v); + } + + float64x2_t val; +private: + friend struct VTraits; + enum { nlanes = 2 }; + typedef double lane_type; + + friend typename VTraits::lane_type v_get0(const v_float64x2& v); + double get0() const + { + return vgetq_lane_f64(val, 0); + } +}; +#endif + +#define OPENCV_HAL_IMPL_NEON_INIT(_Tpv, _Tp, suffix) \ +inline v_##_Tpv v_setzero_##suffix() { return v_##_Tpv(vdupq_n_##suffix((_Tp)0)); } \ +inline v_##_Tpv v_setall_##suffix(_Tp v) { return v_##_Tpv(vdupq_n_##suffix(v)); } \ +inline _Tpv##_t vreinterpretq_##suffix##_##suffix(_Tpv##_t v) { return v; } \ +inline v_uint8x16 v_reinterpret_as_u8(const v_##_Tpv& v) { return v_uint8x16(vreinterpretq_u8_##suffix(v.val)); } \ +inline v_int8x16 v_reinterpret_as_s8(const v_##_Tpv& v) { return v_int8x16(vreinterpretq_s8_##suffix(v.val)); } \ +inline v_uint16x8 v_reinterpret_as_u16(const v_##_Tpv& v) { return v_uint16x8(vreinterpretq_u16_##suffix(v.val)); } \ +inline v_int16x8 v_reinterpret_as_s16(const v_##_Tpv& v) { return v_int16x8(vreinterpretq_s16_##suffix(v.val)); } \ +inline v_uint32x4 v_reinterpret_as_u32(const v_##_Tpv& v) { return v_uint32x4(vreinterpretq_u32_##suffix(v.val)); } \ +inline v_int32x4 v_reinterpret_as_s32(const v_##_Tpv& v) { return v_int32x4(vreinterpretq_s32_##suffix(v.val)); } \ +inline v_uint64x2 v_reinterpret_as_u64(const v_##_Tpv& v) { return v_uint64x2(vreinterpretq_u64_##suffix(v.val)); } \ +inline v_int64x2 v_reinterpret_as_s64(const v_##_Tpv& v) { return v_int64x2(vreinterpretq_s64_##suffix(v.val)); } \ +inline v_float32x4 v_reinterpret_as_f32(const v_##_Tpv& v) { return v_float32x4(vreinterpretq_f32_##suffix(v.val)); } + +OPENCV_HAL_IMPL_NEON_INIT(uint8x16, uchar, u8) +OPENCV_HAL_IMPL_NEON_INIT(int8x16, schar, s8) +OPENCV_HAL_IMPL_NEON_INIT(uint16x8, ushort, u16) +OPENCV_HAL_IMPL_NEON_INIT(int16x8, short, s16) +OPENCV_HAL_IMPL_NEON_INIT(uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_NEON_INIT(int32x4, int, s32) +OPENCV_HAL_IMPL_NEON_INIT(uint64x2, uint64, u64) +OPENCV_HAL_IMPL_NEON_INIT(int64x2, int64, s64) +OPENCV_HAL_IMPL_NEON_INIT(float32x4, float, f32) +#if CV_SIMD128_64F +#define OPENCV_HAL_IMPL_NEON_INIT_64(_Tpv, suffix) \ +inline v_float64x2 v_reinterpret_as_f64(const v_##_Tpv& v) { return v_float64x2(vreinterpretq_f64_##suffix(v.val)); } +OPENCV_HAL_IMPL_NEON_INIT(float64x2, double, f64) +OPENCV_HAL_IMPL_NEON_INIT_64(uint8x16, u8) +OPENCV_HAL_IMPL_NEON_INIT_64(int8x16, s8) +OPENCV_HAL_IMPL_NEON_INIT_64(uint16x8, u16) +OPENCV_HAL_IMPL_NEON_INIT_64(int16x8, s16) +OPENCV_HAL_IMPL_NEON_INIT_64(uint32x4, u32) +OPENCV_HAL_IMPL_NEON_INIT_64(int32x4, s32) +OPENCV_HAL_IMPL_NEON_INIT_64(uint64x2, u64) +OPENCV_HAL_IMPL_NEON_INIT_64(int64x2, s64) +OPENCV_HAL_IMPL_NEON_INIT_64(float32x4, f32) +OPENCV_HAL_IMPL_NEON_INIT_64(float64x2, f64) +#endif + +#define OPENCV_HAL_IMPL_NEON_PACK(_Tpvec, _Tp, hreg, suffix, _Tpwvec, pack, mov, rshr) \ +inline _Tpvec v_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + hreg a1 = mov(a.val), b1 = mov(b.val); \ + return _Tpvec(vcombine_##suffix(a1, b1)); \ +} \ +inline void v_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + hreg a1 = mov(a.val); \ + vst1_##suffix(ptr, a1); \ +} \ +template inline \ +_Tpvec v_rshr_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + hreg a1 = rshr(a.val, n); \ + hreg b1 = rshr(b.val, n); \ + return _Tpvec(vcombine_##suffix(a1, b1)); \ +} \ +template inline \ +void v_rshr_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + hreg a1 = rshr(a.val, n); \ + vst1_##suffix(ptr, a1); \ +} + +OPENCV_HAL_IMPL_NEON_PACK(v_uint8x16, uchar, uint8x8_t, u8, v_uint16x8, pack, vqmovn_u16, vqrshrn_n_u16) +OPENCV_HAL_IMPL_NEON_PACK(v_int8x16, schar, int8x8_t, s8, v_int16x8, pack, vqmovn_s16, vqrshrn_n_s16) +OPENCV_HAL_IMPL_NEON_PACK(v_uint16x8, ushort, uint16x4_t, u16, v_uint32x4, pack, vqmovn_u32, vqrshrn_n_u32) +OPENCV_HAL_IMPL_NEON_PACK(v_int16x8, short, int16x4_t, s16, v_int32x4, pack, vqmovn_s32, vqrshrn_n_s32) +OPENCV_HAL_IMPL_NEON_PACK(v_uint32x4, unsigned, uint32x2_t, u32, v_uint64x2, pack, vmovn_u64, vrshrn_n_u64) +OPENCV_HAL_IMPL_NEON_PACK(v_int32x4, int, int32x2_t, s32, v_int64x2, pack, vmovn_s64, vrshrn_n_s64) + +OPENCV_HAL_IMPL_NEON_PACK(v_uint8x16, uchar, uint8x8_t, u8, v_int16x8, pack_u, vqmovun_s16, vqrshrun_n_s16) +OPENCV_HAL_IMPL_NEON_PACK(v_uint16x8, ushort, uint16x4_t, u16, v_int32x4, pack_u, vqmovun_s32, vqrshrun_n_s32) + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + uint8x16_t ab = vcombine_u8(vmovn_u16(a.val), vmovn_u16(b.val)); + return v_uint8x16(ab); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + uint16x8_t nab = vcombine_u16(vmovn_u32(a.val), vmovn_u32(b.val)); + uint16x8_t ncd = vcombine_u16(vmovn_u32(c.val), vmovn_u32(d.val)); + return v_uint8x16(vcombine_u8(vmovn_u16(nab), vmovn_u16(ncd))); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + uint32x4_t ab = vcombine_u32(vmovn_u64(a.val), vmovn_u64(b.val)); + uint32x4_t cd = vcombine_u32(vmovn_u64(c.val), vmovn_u64(d.val)); + uint32x4_t ef = vcombine_u32(vmovn_u64(e.val), vmovn_u64(f.val)); + uint32x4_t gh = vcombine_u32(vmovn_u64(g.val), vmovn_u64(h.val)); + + uint16x8_t abcd = vcombine_u16(vmovn_u32(ab), vmovn_u32(cd)); + uint16x8_t efgh = vcombine_u16(vmovn_u32(ef), vmovn_u32(gh)); + return v_uint8x16(vcombine_u8(vmovn_u16(abcd), vmovn_u16(efgh))); +} + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + float32x2_t vl = vget_low_f32(v.val), vh = vget_high_f32(v.val); + float32x4_t res = vmulq_lane_f32(m0.val, vl, 0); + res = vmlaq_lane_f32(res, m1.val, vl, 1); + res = vmlaq_lane_f32(res, m2.val, vh, 0); + res = vmlaq_lane_f32(res, m3.val, vh, 1); + return v_float32x4(res); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + float32x2_t vl = vget_low_f32(v.val), vh = vget_high_f32(v.val); + float32x4_t res = vmulq_lane_f32(m0.val, vl, 0); + res = vmlaq_lane_f32(res, m1.val, vl, 1); + res = vmlaq_lane_f32(res, m2.val, vh, 0); + res = vaddq_f32(res, a.val); + return v_float32x4(res); +} + +#define OPENCV_HAL_IMPL_NEON_BIN_OP(bin_op, _Tpvec, intrin) \ +inline _Tpvec bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_uint8x16, vqaddq_u8) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_uint8x16, vqsubq_u8) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_int8x16, vqaddq_s8) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_int8x16, vqsubq_s8) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_uint16x8, vqaddq_u16) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_uint16x8, vqsubq_u16) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_int16x8, vqaddq_s16) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_int16x8, vqsubq_s16) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_int32x4, vaddq_s32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_int32x4, vsubq_s32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_mul, v_int32x4, vmulq_s32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_uint32x4, vaddq_u32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_uint32x4, vsubq_u32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_mul, v_uint32x4, vmulq_u32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_float32x4, vaddq_f32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_float32x4, vsubq_f32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_mul, v_float32x4, vmulq_f32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_int64x2, vaddq_s64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_int64x2, vsubq_s64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_uint64x2, vaddq_u64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_uint64x2, vsubq_u64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_BIN_OP(v_div, v_float32x4, vdivq_f32) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_add, v_float64x2, vaddq_f64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_sub, v_float64x2, vsubq_f64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_mul, v_float64x2, vmulq_f64) +OPENCV_HAL_IMPL_NEON_BIN_OP(v_div, v_float64x2, vdivq_f64) +#else +inline v_float32x4 v_div (const v_float32x4& a, const v_float32x4& b) +{ + float32x4_t reciprocal = vrecpeq_f32(b.val); + reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal); + reciprocal = vmulq_f32(vrecpsq_f32(b.val, reciprocal), reciprocal); + return v_float32x4(vmulq_f32(a.val, reciprocal)); +} +#endif + +// saturating multiply 8-bit, 16-bit +#define OPENCV_HAL_IMPL_NEON_MUL_SAT(_Tpvec, _Tpwvec) \ + inline _Tpvec v_mul (const _Tpvec& a, const _Tpvec& b) \ + { \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ + } + +OPENCV_HAL_IMPL_NEON_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_NEON_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_NEON_MUL_SAT(v_int16x8, v_int32x4) +OPENCV_HAL_IMPL_NEON_MUL_SAT(v_uint16x8, v_uint32x4) + +// Multiply and expand +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + c.val = vmull_s8(vget_low_s8(a.val), vget_low_s8(b.val)); +#if CV_NEON_AARCH64 + d.val = vmull_high_s8(a.val, b.val); +#else // #if CV_NEON_AARCH64 + d.val = vmull_s8(vget_high_s8(a.val), vget_high_s8(b.val)); +#endif // #if CV_NEON_AARCH64 +} + +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + c.val = vmull_u8(vget_low_u8(a.val), vget_low_u8(b.val)); +#if CV_NEON_AARCH64 + d.val = vmull_high_u8(a.val, b.val); +#else // #if CV_NEON_AARCH64 + d.val = vmull_u8(vget_high_u8(a.val), vget_high_u8(b.val)); +#endif // #if CV_NEON_AARCH64 +} + +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + c.val = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val)); +#if CV_NEON_AARCH64 + d.val = vmull_high_s16(a.val, b.val); +#else // #if CV_NEON_AARCH64 + d.val = vmull_s16(vget_high_s16(a.val), vget_high_s16(b.val)); +#endif // #if CV_NEON_AARCH64 +} + +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + c.val = vmull_u16(vget_low_u16(a.val), vget_low_u16(b.val)); +#if CV_NEON_AARCH64 + d.val = vmull_high_u16(a.val, b.val); +#else // #if CV_NEON_AARCH64 + d.val = vmull_u16(vget_high_u16(a.val), vget_high_u16(b.val)); +#endif // #if CV_NEON_AARCH64 +} + +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + c.val = vmull_u32(vget_low_u32(a.val), vget_low_u32(b.val)); +#if CV_NEON_AARCH64 + d.val = vmull_high_u32(a.val, b.val); +#else // #if CV_NEON_AARCH64 + d.val = vmull_u32(vget_high_u32(a.val), vget_high_u32(b.val)); +#endif // #if CV_NEON_AARCH64 +} + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ +#if CV_NEON_AARCH64 + int32x4_t c = vmull_high_s16(a.val, b.val); +#else // #if CV_NEON_AARCH64 + int32x4_t c = vmull_s16(vget_high_s16(a.val), vget_high_s16(b.val)); +#endif // #if CV_NEON_AARCH64 + return v_int16x8(vcombine_s16( + vshrn_n_s32(vmull_s16( vget_low_s16(a.val), vget_low_s16(b.val)), 16), + vshrn_n_s32(c, 16) + )); +} +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ +#if CV_NEON_AARCH64 + uint32x4_t c = vmull_high_u16(a.val, b.val); +#else // #if CV_NEON_AARCH64 + uint32x4_t c = vmull_u16(vget_high_u16(a.val), vget_high_u16(b.val)); +#endif // #if CV_NEON_AARCH64 + return v_uint16x8(vcombine_u16( + vshrn_n_u32(vmull_u16( vget_low_u16(a.val), vget_low_u16(b.val)), 16), + vshrn_n_u32(c, 16) + )); +} + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ + int16x8_t uzp1, uzp2; + _v128_unzip(a.val, b.val, uzp1, uzp2); + int16x4_t a0 = vget_low_s16(uzp1); + int16x4_t b0 = vget_high_s16(uzp1); + int16x4_t a1 = vget_low_s16(uzp2); + int16x4_t b1 = vget_high_s16(uzp2); + int32x4_t p = vmull_s16(a0, b0); + return v_int32x4(vmlal_s16(p, a1, b1)); +} +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + int16x8_t uzp1, uzp2; + _v128_unzip(a.val, b.val, uzp1, uzp2); + int16x4_t a0 = vget_low_s16(uzp1); + int16x4_t b0 = vget_high_s16(uzp1); + int16x4_t a1 = vget_low_s16(uzp2); + int16x4_t b1 = vget_high_s16(uzp2); + int32x4_t p = vmlal_s16(c.val, a0, b0); + return v_int32x4(vmlal_s16(p, a1, b1)); +} + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + int32x4_t uzp1, uzp2; + _v128_unzip(a.val, b.val, uzp1, uzp2); + int32x2_t a0 = vget_low_s32(uzp1); + int32x2_t b0 = vget_high_s32(uzp1); + int32x2_t a1 = vget_low_s32(uzp2); + int32x2_t b1 = vget_high_s32(uzp2); + int64x2_t p = vmull_s32(a0, b0); + return v_int64x2(vmlal_s32(p, a1, b1)); +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + int32x4_t uzp1, uzp2; + _v128_unzip(a.val, b.val, uzp1, uzp2); + int32x2_t a0 = vget_low_s32(uzp1); + int32x2_t b0 = vget_high_s32(uzp1); + int32x2_t a1 = vget_low_s32(uzp2); + int32x2_t b1 = vget_high_s32(uzp2); + int64x2_t p = vmlal_s32(c.val, a0, b0); + return v_int64x2(vmlal_s32(p, a1, b1)); +} + +// 8 >> 32 +#ifdef CV_NEON_DOT +#define OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_OP(_Tpvec1, _Tpvec2, suffix) \ +inline _Tpvec1 v_dotprod_expand(const _Tpvec2& a, const _Tpvec2& b) \ +{ \ + return _Tpvec1(vdotq_##suffix(vdupq_n_##suffix(0), a.val, b.val));\ +} \ +inline _Tpvec1 v_dotprod_expand(const _Tpvec2& a, const _Tpvec2& b, const _Tpvec1& c) \ +{ \ + return _Tpvec1(vdotq_##suffix(c.val, a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_OP(v_uint32x4, v_uint8x16, u32) +OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_OP(v_int32x4, v_int8x16, s32) +#else +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + const uint8x16_t zero = vreinterpretq_u8_u32(vdupq_n_u32(0)); + const uint8x16_t mask = vreinterpretq_u8_u32(vdupq_n_u32(0x00FF00FF)); + const uint16x8_t zero32 = vreinterpretq_u16_u32(vdupq_n_u32(0)); + const uint16x8_t mask32 = vreinterpretq_u16_u32(vdupq_n_u32(0x0000FFFF)); + + uint16x8_t even = vmulq_u16(vreinterpretq_u16_u8(vbslq_u8(mask, a.val, zero)), + vreinterpretq_u16_u8(vbslq_u8(mask, b.val, zero))); + uint16x8_t odd = vmulq_u16(vshrq_n_u16(vreinterpretq_u16_u8(a.val), 8), + vshrq_n_u16(vreinterpretq_u16_u8(b.val), 8)); + + uint32x4_t s0 = vaddq_u32(vreinterpretq_u32_u16(vbslq_u16(mask32, even, zero32)), + vreinterpretq_u32_u16(vbslq_u16(mask32, odd, zero32))); + uint32x4_t s1 = vaddq_u32(vshrq_n_u32(vreinterpretq_u32_u16(even), 16), + vshrq_n_u32(vreinterpretq_u32_u16(odd), 16)); + return v_uint32x4(vaddq_u32(s0, s1)); +} +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, + const v_uint32x4& c) +{ + return v_add(v_dotprod_expand(a, b), c); +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + int16x8_t p0 = vmull_s8(vget_low_s8(a.val), vget_low_s8(b.val)); + int16x8_t p1 = vmull_s8(vget_high_s8(a.val), vget_high_s8(b.val)); + int16x8_t uzp1, uzp2; + _v128_unzip(p0, p1, uzp1, uzp2); + int16x8_t sum = vaddq_s16(uzp1, uzp2); + int16x4_t uzpl1, uzpl2; + _v128_unzip(vget_low_s16(sum), vget_high_s16(sum), uzpl1, uzpl2); + return v_int32x4(vaddl_s16(uzpl1, uzpl2)); +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, + const v_int32x4& c) +{ + return v_add(v_dotprod_expand(a, b), c); +} +#endif +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + const uint16x8_t zero = vreinterpretq_u16_u32(vdupq_n_u32(0)); + const uint16x8_t mask = vreinterpretq_u16_u32(vdupq_n_u32(0x0000FFFF)); + + uint32x4_t even = vmulq_u32(vreinterpretq_u32_u16(vbslq_u16(mask, a.val, zero)), + vreinterpretq_u32_u16(vbslq_u16(mask, b.val, zero))); + uint32x4_t odd = vmulq_u32(vshrq_n_u32(vreinterpretq_u32_u16(a.val), 16), + vshrq_n_u32(vreinterpretq_u32_u16(b.val), 16)); + uint32x4_t uzp1, uzp2; + _v128_unzip(even, odd, uzp1, uzp2); + uint64x2_t s0 = vaddl_u32(vget_low_u32(uzp1), vget_high_u32(uzp1)); + uint64x2_t s1 = vaddl_u32(vget_low_u32(uzp2), vget_high_u32(uzp2)); + return v_uint64x2(vaddq_u64(s0, s1)); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_add(v_dotprod_expand(a, b), c); } + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + int32x4_t p0 = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val)); + int32x4_t p1 = vmull_s16(vget_high_s16(a.val), vget_high_s16(b.val)); + + int32x4_t uzp1, uzp2; + _v128_unzip(p0, p1, uzp1, uzp2); + int32x4_t sum = vaddq_s32(uzp1, uzp2); + + int32x2_t uzpl1, uzpl2; + _v128_unzip(vget_low_s32(sum), vget_high_s32(sum), uzpl1, uzpl2); + return v_int64x2(vaddl_s32(uzpl1, uzpl2)); +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, + const v_int64x2& c) +{ return v_add(v_dotprod_expand(a, b), c); } + +// 32 >> 64f +#if CV_SIMD128_64F +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, + const v_float64x2& c) +{ return v_add(v_dotprod_expand(a, b), c); } +#endif + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ +#if CV_NEON_AARCH64 + int32x4_t p = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val)); + return v_int32x4(vmlal_high_s16(p, a.val, b.val)); +#else + int16x4_t a0 = vget_low_s16(a.val); + int16x4_t a1 = vget_high_s16(a.val); + int16x4_t b0 = vget_low_s16(b.val); + int16x4_t b1 = vget_high_s16(b.val); + int32x4_t p = vmull_s16(a0, b0); + return v_int32x4(vmlal_s16(p, a1, b1)); +#endif +} +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ +#if CV_NEON_AARCH64 + int32x4_t p = vmlal_s16(c.val, vget_low_s16(a.val), vget_low_s16(b.val)); + return v_int32x4(vmlal_high_s16(p, a.val, b.val)); +#else + int16x4_t a0 = vget_low_s16(a.val); + int16x4_t a1 = vget_high_s16(a.val); + int16x4_t b0 = vget_low_s16(b.val); + int16x4_t b1 = vget_high_s16(b.val); + int32x4_t p = vmlal_s16(c.val, a0, b0); + return v_int32x4(vmlal_s16(p, a1, b1)); +#endif +} + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_NEON_AARCH64 + int64x2_t p = vmull_s32(vget_low_s32(a.val), vget_low_s32(b.val)); + return v_int64x2(vmlal_high_s32(p, a.val, b.val)); +#else + int32x2_t a0 = vget_low_s32(a.val); + int32x2_t a1 = vget_high_s32(a.val); + int32x2_t b0 = vget_low_s32(b.val); + int32x2_t b1 = vget_high_s32(b.val); + int64x2_t p = vmull_s32(a0, b0); + return v_int64x2(vmlal_s32(p, a1, b1)); +#endif +} +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ +#if CV_NEON_AARCH64 + int64x2_t p = vmlal_s32(c.val, vget_low_s32(a.val), vget_low_s32(b.val)); + return v_int64x2(vmlal_high_s32(p, a.val, b.val)); +#else + int32x2_t a0 = vget_low_s32(a.val); + int32x2_t a1 = vget_high_s32(a.val); + int32x2_t b0 = vget_low_s32(b.val); + int32x2_t b1 = vget_high_s32(b.val); + int64x2_t p = vmlal_s32(c.val, a0, b0); + return v_int64x2(vmlal_s32(p, a1, b1)); +#endif +} + +// 8 >> 32 +#ifdef CV_NEON_DOT +#define OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_FAST_OP(_Tpvec1, _Tpvec2, suffix) \ +inline _Tpvec1 v_dotprod_expand_fast(const _Tpvec2& a, const _Tpvec2& b) \ +{ \ + return v_dotprod_expand(a, b); \ +} \ +inline _Tpvec1 v_dotprod_expand_fast(const _Tpvec2& a, const _Tpvec2& b, const _Tpvec1& c) \ +{ \ + return v_dotprod_expand(a, b, c); \ +} + +OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_FAST_OP(v_uint32x4, v_uint8x16, u32) +OPENCV_HAL_IMPL_NEON_DOT_PRODUCT_FAST_OP(v_int32x4, v_int8x16, s32) +#else +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ + uint16x8_t p0 = vmull_u8(vget_low_u8(a.val), vget_low_u8(b.val)); + uint16x8_t p1 = vmull_u8(vget_high_u8(a.val), vget_high_u8(b.val)); + uint32x4_t s0 = vaddl_u16(vget_low_u16(p0), vget_low_u16(p1)); + uint32x4_t s1 = vaddl_u16(vget_high_u16(p0), vget_high_u16(p1)); + return v_uint32x4(vaddq_u32(s0, s1)); +} +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ + return v_add(v_dotprod_expand_fast(a, b), c); +} + +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ + int16x8_t prod = vmull_s8(vget_low_s8(a.val), vget_low_s8(b.val)); + prod = vmlal_s8(prod, vget_high_s8(a.val), vget_high_s8(b.val)); + return v_int32x4(vaddl_s16(vget_low_s16(prod), vget_high_s16(prod))); +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ + return v_add(v_dotprod_expand_fast(a, b), c); +} +#endif + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ + uint32x4_t p0 = vmull_u16(vget_low_u16(a.val), vget_low_u16(b.val)); + uint32x4_t p1 = vmull_u16(vget_high_u16(a.val), vget_high_u16(b.val)); + uint64x2_t s0 = vaddl_u32(vget_low_u32(p0), vget_high_u32(p0)); + uint64x2_t s1 = vaddl_u32(vget_low_u32(p1), vget_high_u32(p1)); + return v_uint64x2(vaddq_u64(s0, s1)); +} +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_add(v_dotprod_expand_fast(a, b), c); } + +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + int32x4_t prod = vmull_s16(vget_low_s16(a.val), vget_low_s16(b.val)); + prod = vmlal_s16(prod, vget_high_s16(a.val), vget_high_s16(b.val)); + return v_int64x2(vaddl_s32(vget_low_s32(prod), vget_high_s32(prod))); +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_add(v_dotprod_expand_fast(a, b), c); } + +// 32 >> 64f +#if CV_SIMD128_64F +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod_fast(a, b)); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_add(v_dotprod_expand_fast(a, b), c); } +#endif + + +#define OPENCV_HAL_IMPL_NEON_LOGIC_OP(_Tpvec, suffix) \ + OPENCV_HAL_IMPL_NEON_BIN_OP(v_and, _Tpvec, vandq_##suffix) \ + OPENCV_HAL_IMPL_NEON_BIN_OP(v_or, _Tpvec, vorrq_##suffix) \ + OPENCV_HAL_IMPL_NEON_BIN_OP(v_xor, _Tpvec, veorq_##suffix) \ + inline _Tpvec v_not (const _Tpvec& a) \ + { \ + return _Tpvec(vreinterpretq_##suffix##_u8(vmvnq_u8(vreinterpretq_u8_##suffix(a.val)))); \ + } + +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint8x16, u8) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int8x16, s8) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint16x8, u16) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int16x8, s16) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint32x4, u32) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int32x4, s32) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_uint64x2, u64) +OPENCV_HAL_IMPL_NEON_LOGIC_OP(v_int64x2, s64) + +#define OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(bin_op, intrin) \ +inline v_float32x4 bin_op (const v_float32x4& a, const v_float32x4& b) \ +{ \ + return v_float32x4(vreinterpretq_f32_s32(intrin(vreinterpretq_s32_f32(a.val), vreinterpretq_s32_f32(b.val)))); \ +} + +OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(v_and, vandq_s32) +OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(v_or, vorrq_s32) +OPENCV_HAL_IMPL_NEON_FLT_BIT_OP(v_xor, veorq_s32) + +inline v_float32x4 v_not (const v_float32x4& a) +{ + return v_float32x4(vreinterpretq_f32_s32(vmvnq_s32(vreinterpretq_s32_f32(a.val)))); +} + +#if CV_SIMD128_64F +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ + return v_float32x4(vsqrtq_f32(x.val)); +} + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + v_float32x4 one = v_setall_f32(1.0f); + return v_div(one, v_sqrt(x)); +} +#else +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ + float32x4_t x1 = vmaxq_f32(x.val, vdupq_n_f32(FLT_MIN)); + float32x4_t e = vrsqrteq_f32(x1); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + return v_float32x4(vmulq_f32(x.val, e)); +} + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + float32x4_t e = vrsqrteq_f32(x.val); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x.val, e), e), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x.val, e), e), e); + return v_float32x4(e); +} +#endif + +#define OPENCV_HAL_IMPL_NEON_ABS(_Tpuvec, _Tpsvec, usuffix, ssuffix) \ +inline _Tpuvec v_abs(const _Tpsvec& a) { return v_reinterpret_as_##usuffix(_Tpsvec(vabsq_##ssuffix(a.val))); } + +OPENCV_HAL_IMPL_NEON_ABS(v_uint8x16, v_int8x16, u8, s8) +OPENCV_HAL_IMPL_NEON_ABS(v_uint16x8, v_int16x8, u16, s16) +OPENCV_HAL_IMPL_NEON_ABS(v_uint32x4, v_int32x4, u32, s32) + +inline v_float32x4 v_abs(v_float32x4 x) +{ return v_float32x4(vabsq_f32(x.val)); } + +#if CV_SIMD128_64F +#define OPENCV_HAL_IMPL_NEON_DBL_BIT_OP(bin_op, intrin) \ +inline v_float64x2 bin_op (const v_float64x2& a, const v_float64x2& b) \ +{ \ + return v_float64x2(vreinterpretq_f64_s64(intrin(vreinterpretq_s64_f64(a.val), vreinterpretq_s64_f64(b.val)))); \ +} + +OPENCV_HAL_IMPL_NEON_DBL_BIT_OP(v_and, vandq_s64) +OPENCV_HAL_IMPL_NEON_DBL_BIT_OP(v_or, vorrq_s64) +OPENCV_HAL_IMPL_NEON_DBL_BIT_OP(v_xor, veorq_s64) + +inline v_float64x2 v_not (const v_float64x2& a) +{ + return v_float64x2(vreinterpretq_f64_s32(vmvnq_s32(vreinterpretq_s32_f64(a.val)))); +} + +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ + return v_float64x2(vsqrtq_f64(x.val)); +} + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + v_float64x2 one = v_setall_f64(1.0f); + return v_div(one, v_sqrt(x)); +} + +inline v_float64x2 v_abs(v_float64x2 x) +{ return v_float64x2(vabsq_f64(x.val)); } +#endif + +// TODO: exp, log, sin, cos + +#define OPENCV_HAL_IMPL_NEON_BIN_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_min, vminq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_max, vmaxq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_min, vminq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_max, vmaxq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_min, vminq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_max, vmaxq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_min, vminq_s16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_max, vmaxq_s16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_min, vminq_u32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_max, vmaxq_u32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int32x4, v_min, vminq_s32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int32x4, v_max, vmaxq_s32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_min, vminq_f32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_max, vmaxq_f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float64x2, v_min, vminq_f64) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float64x2, v_max, vmaxq_f64) +#endif + +#define OPENCV_HAL_IMPL_NEON_INT_CMP_OP(_Tpvec, cast, suffix, not_suffix) \ +inline _Tpvec v_eq (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vceqq_##suffix(a.val, b.val))); } \ +inline _Tpvec v_ne (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vmvnq_##not_suffix(vceqq_##suffix(a.val, b.val)))); } \ +inline _Tpvec v_lt (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vcltq_##suffix(a.val, b.val))); } \ +inline _Tpvec v_gt (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vcgtq_##suffix(a.val, b.val))); } \ +inline _Tpvec v_le (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vcleq_##suffix(a.val, b.val))); } \ +inline _Tpvec v_ge (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(cast(vcgeq_##suffix(a.val, b.val))); } + +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint8x16, OPENCV_HAL_NOP, u8, u8) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int8x16, vreinterpretq_s8_u8, s8, u8) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint16x8, OPENCV_HAL_NOP, u16, u16) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int16x8, vreinterpretq_s16_u16, s16, u16) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint32x4, OPENCV_HAL_NOP, u32, u32) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int32x4, vreinterpretq_s32_u32, s32, u32) +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_float32x4, vreinterpretq_f32_u32, f32, u32) +#if defined(__aarch64__) || defined(_M_ARM64) +static inline uint64x2_t vmvnq_u64(uint64x2_t a) +{ + uint64x2_t vx = vreinterpretq_u64_u32(vdupq_n_u32(0xFFFFFFFF)); + return veorq_u64(a, vx); +} +//OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_uint64x2, OPENCV_HAL_NOP, u64, u64) +//OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_int64x2, vreinterpretq_s64_u64, s64, u64) +static inline v_uint64x2 v_eq (const v_uint64x2& a, const v_uint64x2& b) +{ return v_uint64x2(vceqq_u64(a.val, b.val)); } +static inline v_uint64x2 v_ne (const v_uint64x2& a, const v_uint64x2& b) +{ return v_uint64x2(vmvnq_u64(vceqq_u64(a.val, b.val))); } +static inline v_int64x2 v_eq (const v_int64x2& a, const v_int64x2& b) +{ return v_int64x2(vreinterpretq_s64_u64(vceqq_s64(a.val, b.val))); } +static inline v_int64x2 v_ne (const v_int64x2& a, const v_int64x2& b) +{ return v_int64x2(vreinterpretq_s64_u64(vmvnq_u64(vceqq_s64(a.val, b.val)))); } +#else +static inline v_uint64x2 v_eq (const v_uint64x2& a, const v_uint64x2& b) +{ + uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_u64(a.val), vreinterpretq_u32_u64(b.val)); + uint32x4_t swapped = vrev64q_u32(cmp); + return v_uint64x2(vreinterpretq_u64_u32(vandq_u32(cmp, swapped))); +} +static inline v_uint64x2 v_ne (const v_uint64x2& a, const v_uint64x2& b) +{ + uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_u64(a.val), vreinterpretq_u32_u64(b.val)); + uint32x4_t swapped = vrev64q_u32(cmp); + uint64x2_t v_eq = vreinterpretq_u64_u32(vandq_u32(cmp, swapped)); + uint64x2_t vx = vreinterpretq_u64_u32(vdupq_n_u32(0xFFFFFFFF)); + return v_uint64x2(veorq_u64(v_eq, vx)); +} +static inline v_int64x2 v_eq (const v_int64x2& a, const v_int64x2& b) +{ + return v_reinterpret_as_s64(v_eq(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); +} +static inline v_int64x2 v_ne (const v_int64x2& a, const v_int64x2& b) +{ + return v_reinterpret_as_s64(v_ne(v_reinterpret_as_u64(a), v_reinterpret_as_u64(b))); +} +#endif +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_INT_CMP_OP(v_float64x2, vreinterpretq_f64_u64, f64, u64) +#endif + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return v_float32x4(vreinterpretq_f32_u32(vceqq_f32(a.val, a.val))); } +#if CV_SIMD128_64F +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return v_float64x2(vreinterpretq_f64_u64(vceqq_f64(a.val, a.val))); } +#endif + +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_add_wrap, vaddq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_add_wrap, vaddq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_add_wrap, vaddq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_add_wrap, vaddq_s16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_sub_wrap, vsubq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_sub_wrap, vsubq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_sub_wrap, vsubq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_sub_wrap, vsubq_s16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_mul_wrap, vmulq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int8x16, v_mul_wrap, vmulq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_mul_wrap, vmulq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_int16x8, v_mul_wrap, vmulq_s16) + +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint8x16, v_absdiff, vabdq_u8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint16x8, v_absdiff, vabdq_u16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_uint32x4, v_absdiff, vabdq_u32) +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float32x4, v_absdiff, vabdq_f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_BIN_FUNC(v_float64x2, v_absdiff, vabdq_f64) +#endif + +/** Saturating absolute difference **/ +inline v_int8x16 v_absdiffs(const v_int8x16& a, const v_int8x16& b) +{ return v_int8x16(vqabsq_s8(vqsubq_s8(a.val, b.val))); } +inline v_int16x8 v_absdiffs(const v_int16x8& a, const v_int16x8& b) +{ return v_int16x8(vqabsq_s16(vqsubq_s16(a.val, b.val))); } + +#define OPENCV_HAL_IMPL_NEON_BIN_FUNC2(_Tpvec, _Tpvec2, cast, func, intrin) \ +inline _Tpvec2 func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec2(cast(intrin(a.val, b.val))); \ +} + +OPENCV_HAL_IMPL_NEON_BIN_FUNC2(v_int8x16, v_uint8x16, vreinterpretq_u8_s8, v_absdiff, vabdq_s8) +OPENCV_HAL_IMPL_NEON_BIN_FUNC2(v_int16x8, v_uint16x8, vreinterpretq_u16_s16, v_absdiff, vabdq_s16) +OPENCV_HAL_IMPL_NEON_BIN_FUNC2(v_int32x4, v_uint32x4, vreinterpretq_u32_s32, v_absdiff, vabdq_s32) + +inline v_float32x4 v_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + v_float32x4 x(vmlaq_f32(vmulq_f32(a.val, a.val), b.val, b.val)); + return v_sqrt(x); +} + +inline v_float32x4 v_sqr_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4(vmlaq_f32(vmulq_f32(a.val, a.val), b.val, b.val)); +} + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ +#if CV_SIMD128_64F + // ARMv8, which adds support for 64-bit floating-point (so CV_SIMD128_64F is defined), + // also adds FMA support both for single- and double-precision floating-point vectors + return v_float32x4(vfmaq_f32(c.val, a.val, b.val)); +#else + return v_float32x4(vmlaq_f32(c.val, a.val, b.val)); +#endif +} + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_int32x4(vmlaq_s32(c.val, a.val, b.val)); +} + +inline v_float32x4 v_muladd(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +#if CV_SIMD128_64F +inline v_float64x2 v_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + v_float64x2 x(vaddq_f64(vmulq_f64(a.val, a.val), vmulq_f64(b.val, b.val))); + return v_sqrt(x); +} + +inline v_float64x2 v_sqr_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2(vaddq_f64(vmulq_f64(a.val, a.val), vmulq_f64(b.val, b.val))); +} + +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_float64x2(vfmaq_f64(c.val, a.val, b.val)); +} + +inline v_float64x2 v_muladd(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_fma(a, b, c); +} +#endif + +// trade efficiency for convenience +#define OPENCV_HAL_IMPL_NEON_SHIFT_OP(_Tpvec, suffix, _Tps, ssuffix) \ +inline _Tpvec v_shl (const _Tpvec& a, int n) \ +{ return _Tpvec(vshlq_##suffix(a.val, vdupq_n_##ssuffix((_Tps)n))); } \ +inline _Tpvec v_shr (const _Tpvec& a, int n) \ +{ return _Tpvec(vshlq_##suffix(a.val, vdupq_n_##ssuffix((_Tps)-n))); } \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ return _Tpvec(vshlq_n_##suffix(a.val, n)); } \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ return _Tpvec(vshrq_n_##suffix(a.val, n)); } \ +template inline _Tpvec v_rshr(const _Tpvec& a) \ +{ return _Tpvec(vrshrq_n_##suffix(a.val, n)); } + +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint8x16, u8, schar, s8) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int8x16, s8, schar, s8) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint16x8, u16, short, s16) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int16x8, s16, short, s16) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint32x4, u32, int, s32) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int32x4, s32, int, s32) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_uint64x2, u64, int64, s64) +OPENCV_HAL_IMPL_NEON_SHIFT_OP(v_int64x2, s64, int64, s64) + +#define OPENCV_HAL_IMPL_NEON_ROTATE_OP(_Tpvec, suffix) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ return _Tpvec(vextq_##suffix(a.val, vdupq_n_##suffix(0), n)); } \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ return _Tpvec(vextq_##suffix(vdupq_n_##suffix(0), a.val, VTraits<_Tpvec>::nlanes - n)); } \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vextq_##suffix(a.val, b.val, n)); } \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vextq_##suffix(b.val, a.val, VTraits<_Tpvec>::nlanes - n)); } \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ CV_UNUSED(b); return a; } + +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_uint8x16, u8) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_int8x16, s8) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_uint16x8, u16) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_int16x8, s16) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_uint32x4, u32) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_int32x4, s32) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_float32x4, f32) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_uint64x2, u64) +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_int64x2, s64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_ROTATE_OP(v_float64x2, f64) +#endif + +#if defined(__clang__) && defined(__aarch64__) +// avoid LD2 instruction. details: https://github.com/opencv/opencv/issues/14863 +#define OPENCV_HAL_IMPL_NEON_LOAD_LOW_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ \ +typedef uint64 CV_DECL_ALIGNED(1) unaligned_uint64; \ +uint64 v = *(unaligned_uint64*)ptr; \ +return _Tpvec(v_reinterpret_as_##suffix(v_uint64x2(v, (uint64)123456))); \ +} +#else +#define OPENCV_HAL_IMPL_NEON_LOAD_LOW_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(vcombine_##suffix(vld1_##suffix(ptr), vdup_n_##suffix((_Tp)0))); } +#endif + +#define OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(vld1q_##suffix(ptr)); } \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(vld1q_##suffix(ptr)); } \ +OPENCV_HAL_IMPL_NEON_LOAD_LOW_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ return _Tpvec(vcombine_##suffix(vld1_##suffix(ptr0), vld1_##suffix(ptr1))); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ vst1q_##suffix(ptr, a.val); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ vst1q_##suffix(ptr, a.val); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ vst1q_##suffix(ptr, a.val); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ vst1q_##suffix(ptr, a.val); } \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ vst1_##suffix(ptr, vget_low_##suffix(a.val)); } \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ vst1_##suffix(ptr, vget_high_##suffix(a.val)); } + +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int16x8, short, s16) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int32x4, int, s32) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_int64x2, int64, s64) +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_float32x4, float, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_LOADSTORE_OP(v_float64x2, double, f64) +#endif + +inline unsigned v_reduce_sum(const v_uint8x16& a) +{ +#if CV_NEON_AARCH64 + uint16_t t0 = vaddlvq_u8(a.val); + return t0; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(vpaddlq_u8(a.val)); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline int v_reduce_sum(const v_int8x16& a) +{ +#if CV_NEON_AARCH64 + int16_t t0 = vaddlvq_s8(a.val); + return t0; +#else // #if CV_NEON_AARCH64 + int32x4_t t0 = vpaddlq_s16(vpaddlq_s8(a.val)); + int32x2_t t1 = vpadd_s32(vget_low_s32(t0), vget_high_s32(t0)); + return vget_lane_s32(vpadd_s32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sum(const v_uint16x8& a) +{ +#if CV_NEON_AARCH64 + uint32_t t0 = vaddlvq_u16(a.val); + return t0; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(a.val); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline int v_reduce_sum(const v_int16x8& a) +{ +#if CV_NEON_AARCH64 + int32_t t0 = vaddlvq_s16(a.val); + return t0; +#else // #if CV_NEON_AARCH64 + int32x4_t t0 = vpaddlq_s16(a.val); + int32x2_t t1 = vpadd_s32(vget_low_s32(t0), vget_high_s32(t0)); + return vget_lane_s32(vpadd_s32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} + +#if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + return v##vectorfunc##vq_##suffix(a.val); \ +} +#else // #if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpnvec##_t a0 = vp##vectorfunc##_##suffix(vget_low_##suffix(a.val), vget_high_##suffix(a.val)); \ + a0 = vp##vectorfunc##_##suffix(a0, a0); \ + a0 = vp##vectorfunc##_##suffix(a0, a0); \ + return (scalartype)vget_lane_##suffix(vp##vectorfunc##_##suffix(a0, a0),0); \ +} +#endif // #if CV_NEON_AARCH64 + +OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(v_uint8x16, uint8x8, uchar, max, max, u8) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(v_uint8x16, uint8x8, uchar, min, min, u8) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(v_int8x16, int8x8, schar, max, max, s8) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_16(v_int8x16, int8x8, schar, min, min, s8) + +#if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + return v##vectorfunc##vq_##suffix(a.val); \ +} +#else // #if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpnvec##_t a0 = vp##vectorfunc##_##suffix(vget_low_##suffix(a.val), vget_high_##suffix(a.val)); \ + a0 = vp##vectorfunc##_##suffix(a0, a0); \ + return (scalartype)vget_lane_##suffix(vp##vectorfunc##_##suffix(a0, a0),0); \ +} +#endif // #if CV_NEON_AARCH64 + +OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(v_uint16x8, uint16x4, ushort, max, max, u16) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(v_uint16x8, uint16x4, ushort, min, min, u16) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(v_int16x8, int16x4, short, max, max, s16) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_8(v_int16x8, int16x4, short, min, min, s16) + +#if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + return v##vectorfunc##vq_##suffix(a.val); \ +} +#else // #if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(_Tpvec, _Tpnvec, scalartype, func, vectorfunc, suffix) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpnvec##_t a0 = vp##vectorfunc##_##suffix(vget_low_##suffix(a.val), vget_high_##suffix(a.val)); \ + return (scalartype)vget_lane_##suffix(vp##vectorfunc##_##suffix(a0, vget_high_##suffix(a.val)),0); \ +} +#endif // #if CV_NEON_AARCH64 + +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, uint32x2, unsigned, sum, add, u32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, uint32x2, unsigned, max, max, u32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_uint32x4, uint32x2, unsigned, min, min, u32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int32x2, int, sum, add, s32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int32x2, int, max, max, s32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_int32x4, int32x2, int, min, min, s32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float32x2, float, sum, add, f32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float32x2, float, max, max, f32) +OPENCV_HAL_IMPL_NEON_REDUCE_OP_4(v_float32x4, float32x2, float, min, min, f32) + +inline uint64 v_reduce_sum(const v_uint64x2& a) +{ +#if CV_NEON_AARCH64 + return vaddvq_u64(a.val); +#else // #if CV_NEON_AARCH64 + return vget_lane_u64(vadd_u64(vget_low_u64(a.val), vget_high_u64(a.val)),0); +#endif // #if CV_NEON_AARCH64 +} +inline int64 v_reduce_sum(const v_int64x2& a) +{ +#if CV_NEON_AARCH64 + return vaddvq_s64(a.val); +#else // #if CV_NEON_AARCH64 + return vget_lane_s64(vadd_s64(vget_low_s64(a.val), vget_high_s64(a.val)),0); +#endif // #if CV_NEON_AARCH64 +} +#if CV_SIMD128_64F +inline double v_reduce_sum(const v_float64x2& a) +{ + return vaddvq_f64(a.val); +} +#endif + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ +#if CV_NEON_AARCH64 + float32x4_t ab = vpaddq_f32(a.val, b.val); // a0+a1 a2+a3 b0+b1 b2+b3 + float32x4_t cd = vpaddq_f32(c.val, d.val); // c0+c1 d0+d1 c2+c3 d2+d3 + return v_float32x4(vpaddq_f32(ab, cd)); // sumA sumB sumC sumD +#else // #if CV_NEON_AARCH64 + float32x4x2_t ab = vtrnq_f32(a.val, b.val); + float32x4x2_t cd = vtrnq_f32(c.val, d.val); + + float32x4_t u0 = vaddq_f32(ab.val[0], ab.val[1]); // a0+a1 b0+b1 a2+a3 b2+b3 + float32x4_t u1 = vaddq_f32(cd.val[0], cd.val[1]); // c0+c1 d0+d1 c2+c3 d2+d3 + + float32x4_t v0 = vcombine_f32(vget_low_f32(u0), vget_low_f32(u1)); + float32x4_t v1 = vcombine_f32(vget_high_f32(u0), vget_high_f32(u1)); + + return v_float32x4(vaddq_f32(v0, v1)); +#endif // #if CV_NEON_AARCH64 +} + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ +#if CV_NEON_AARCH64 + uint8x16_t t0 = vabdq_u8(a.val, b.val); + uint16_t t1 = vaddlvq_u8(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(vpaddlq_u8(vabdq_u8(a.val, b.val))); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ +#if CV_NEON_AARCH64 + uint8x16_t t0 = vreinterpretq_u8_s8(vabdq_s8(a.val, b.val)); + uint16_t t1 = vaddlvq_u8(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(vpaddlq_u8(vreinterpretq_u8_s8(vabdq_s8(a.val, b.val)))); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ +#if CV_NEON_AARCH64 + uint16x8_t t0 = vabdq_u16(a.val, b.val); + uint32_t t1 = vaddlvq_u16(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(vabdq_u16(a.val, b.val)); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ +#if CV_NEON_AARCH64 + uint16x8_t t0 = vreinterpretq_u16_s16(vabdq_s16(a.val, b.val)); + uint32_t t1 = vaddlvq_u16(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vpaddlq_u16(vreinterpretq_u16_s16(vabdq_s16(a.val, b.val))); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ +#if CV_NEON_AARCH64 + uint32x4_t t0 = vabdq_u32(a.val, b.val); + uint32_t t1 = vaddvq_u32(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vabdq_u32(a.val, b.val); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_NEON_AARCH64 + uint32x4_t t0 = vreinterpretq_u32_s32(vabdq_s32(a.val, b.val)); + uint32_t t1 = vaddvq_u32(t0); + return t1; +#else // #if CV_NEON_AARCH64 + uint32x4_t t0 = vreinterpretq_u32_s32(vabdq_s32(a.val, b.val)); + uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); + return vget_lane_u32(vpadd_u32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ +#if CV_NEON_AARCH64 + float32x4_t t0 = vabdq_f32(a.val, b.val); + return vaddvq_f32(t0); +#else // #if CV_NEON_AARCH64 + float32x4_t t0 = vabdq_f32(a.val, b.val); + float32x2_t t1 = vpadd_f32(vget_low_f32(t0), vget_high_f32(t0)); + return vget_lane_f32(vpadd_f32(t1, t1), 0); +#endif // #if CV_NEON_AARCH64 +} + +inline v_uint8x16 v_popcount(const v_uint8x16& a) +{ return v_uint8x16(vcntq_u8(a.val)); } +inline v_uint8x16 v_popcount(const v_int8x16& a) +{ return v_uint8x16(vcntq_u8(vreinterpretq_u8_s8(a.val))); } +inline v_uint16x8 v_popcount(const v_uint16x8& a) +{ return v_uint16x8(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_u16(a.val)))); } +inline v_uint16x8 v_popcount(const v_int16x8& a) +{ return v_uint16x8(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_s16(a.val)))); } +inline v_uint32x4 v_popcount(const v_uint32x4& a) +{ return v_uint32x4(vpaddlq_u16(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_u32(a.val))))); } +inline v_uint32x4 v_popcount(const v_int32x4& a) +{ return v_uint32x4(vpaddlq_u16(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_s32(a.val))))); } +inline v_uint64x2 v_popcount(const v_uint64x2& a) +{ return v_uint64x2(vpaddlq_u32(vpaddlq_u16(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_u64(a.val)))))); } +inline v_uint64x2 v_popcount(const v_int64x2& a) +{ return v_uint64x2(vpaddlq_u32(vpaddlq_u16(vpaddlq_u8(vcntq_u8(vreinterpretq_u8_s64(a.val)))))); } + +inline int v_signmask(const v_uint8x16& a) +{ +#if CV_NEON_AARCH64 + const int8x16_t signPosition = {0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7}; + const uint8x16_t byteOrder = {0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15}; + uint8x16_t v0 = vshlq_u8(vshrq_n_u8(a.val, 7), signPosition); + uint8x16_t v1 = vqtbl1q_u8(v0, byteOrder); + uint32_t t0 = vaddlvq_u16(vreinterpretq_u16_u8(v1)); + return t0; +#else // #if CV_NEON_AARCH64 + int8x8_t m0 = vcreate_s8(CV_BIG_UINT(0x0706050403020100)); + uint8x16_t v0 = vshlq_u8(vshrq_n_u8(a.val, 7), vcombine_s8(m0, m0)); + uint64x2_t v1 = vpaddlq_u32(vpaddlq_u16(vpaddlq_u8(v0))); + return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 8); +#endif // #if CV_NEON_AARCH64 +} + +inline int v_signmask(const v_int8x16& a) +{ return v_signmask(v_reinterpret_as_u8(a)); } + +inline int v_signmask(const v_uint16x8& a) +{ +#if CV_NEON_AARCH64 + const int16x8_t signPosition = {0,1,2,3,4,5,6,7}; + uint16x8_t v0 = vshlq_u16(vshrq_n_u16(a.val, 15), signPosition); + uint32_t t0 = vaddlvq_u16(v0); + return t0; +#else // #if CV_NEON_AARCH64 + int16x4_t m0 = vcreate_s16(CV_BIG_UINT(0x0003000200010000)); + uint16x8_t v0 = vshlq_u16(vshrq_n_u16(a.val, 15), vcombine_s16(m0, m0)); + uint64x2_t v1 = vpaddlq_u32(vpaddlq_u16(v0)); + return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 4); +#endif // #if CV_NEON_AARCH64 +} +inline int v_signmask(const v_int16x8& a) +{ return v_signmask(v_reinterpret_as_u16(a)); } + +inline int v_signmask(const v_uint32x4& a) +{ +#if CV_NEON_AARCH64 + const int32x4_t signPosition = {0,1,2,3}; + uint32x4_t v0 = vshlq_u32(vshrq_n_u32(a.val, 31), signPosition); + uint32_t t0 = vaddvq_u32(v0); + return t0; +#else // #if CV_NEON_AARCH64 + int32x2_t m0 = vcreate_s32(CV_BIG_UINT(0x0000000100000000)); + uint32x4_t v0 = vshlq_u32(vshrq_n_u32(a.val, 31), vcombine_s32(m0, m0)); + uint64x2_t v1 = vpaddlq_u32(v0); + return (int)vgetq_lane_u64(v1, 0) + ((int)vgetq_lane_u64(v1, 1) << 2); +#endif // #if CV_NEON_AARCH64 +} +inline int v_signmask(const v_int32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } +inline int v_signmask(const v_uint64x2& a) +{ +#if CV_NEON_AARCH64 + const int64x2_t signPosition = {0,1}; + uint64x2_t v0 = vshlq_u64(vshrq_n_u64(a.val, 63), signPosition); + uint64_t t0 = vaddvq_u64(v0); + return t0; +#else // #if CV_NEON_AARCH64 + int64x1_t m0 = vdup_n_s64(0); + uint64x2_t v0 = vshlq_u64(vshrq_n_u64(a.val, 63), vcombine_s64(m0, m0)); + return (int)vgetq_lane_u64(v0, 0) + ((int)vgetq_lane_u64(v0, 1) << 1); +#endif // #if CV_NEON_AARCH64 +} +inline int v_signmask(const v_int64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +#if CV_SIMD128_64F +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +#endif + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(a)); } +#if CV_SIMD128_64F +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(a)); } +#endif + +#if CV_NEON_AARCH64 + #define OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(_Tpvec, suffix, shift) \ + inline bool v_check_all(const v_##_Tpvec& a) \ + { \ + return (vminvq_##suffix(a.val) >> shift) != 0; \ + } \ + inline bool v_check_any(const v_##_Tpvec& a) \ + { \ + return (vmaxvq_##suffix(a.val) >> shift) != 0; \ + } +#else // #if CV_NEON_AARCH64 + #define OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(_Tpvec, suffix, shift) \ + inline bool v_check_all(const v_##_Tpvec& a) \ + { \ + _Tpvec##_t v0 = vshrq_n_##suffix(vmvnq_##suffix(a.val), shift); \ + uint64x2_t v1 = vreinterpretq_u64_##suffix(v0); \ + return (vgetq_lane_u64(v1, 0) | vgetq_lane_u64(v1, 1)) == 0; \ + } \ + inline bool v_check_any(const v_##_Tpvec& a) \ + { \ + _Tpvec##_t v0 = vshrq_n_##suffix(a.val, shift); \ + uint64x2_t v1 = vreinterpretq_u64_##suffix(v0); \ + return (vgetq_lane_u64(v1, 0) | vgetq_lane_u64(v1, 1)) != 0; \ + } +#endif // #if CV_NEON_AARCH64 + +OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint8x16, u8, 7) +OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint16x8, u16, 15) +OPENCV_HAL_IMPL_NEON_CHECK_ALLANY(uint32x4, u32, 31) + +inline bool v_check_all(const v_uint64x2& a) +{ + uint64x2_t v0 = vshrq_n_u64(a.val, 63); + return (vgetq_lane_u64(v0, 0) & vgetq_lane_u64(v0, 1)) == 1; +} +inline bool v_check_any(const v_uint64x2& a) +{ + uint64x2_t v0 = vshrq_n_u64(a.val, 63); + return (vgetq_lane_u64(v0, 0) | vgetq_lane_u64(v0, 1)) != 0; +} + +inline bool v_check_all(const v_int8x16& a) +{ return v_check_all(v_reinterpret_as_u8(a)); } +inline bool v_check_all(const v_int16x8& a) +{ return v_check_all(v_reinterpret_as_u16(a)); } +inline bool v_check_all(const v_int32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } + +inline bool v_check_any(const v_int8x16& a) +{ return v_check_any(v_reinterpret_as_u8(a)); } +inline bool v_check_any(const v_int16x8& a) +{ return v_check_any(v_reinterpret_as_u16(a)); } +inline bool v_check_any(const v_int32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } + +inline bool v_check_all(const v_int64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_int64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } +#if CV_SIMD128_64F +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } +#endif + +#define OPENCV_HAL_IMPL_NEON_SELECT(_Tpvec, suffix, usuffix) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vbslq_##suffix(vreinterpretq_##usuffix##_##suffix(mask.val), a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_NEON_SELECT(v_uint8x16, u8, u8) +OPENCV_HAL_IMPL_NEON_SELECT(v_int8x16, s8, u8) +OPENCV_HAL_IMPL_NEON_SELECT(v_uint16x8, u16, u16) +OPENCV_HAL_IMPL_NEON_SELECT(v_int16x8, s16, u16) +OPENCV_HAL_IMPL_NEON_SELECT(v_uint32x4, u32, u32) +OPENCV_HAL_IMPL_NEON_SELECT(v_int32x4, s32, u32) +OPENCV_HAL_IMPL_NEON_SELECT(v_float32x4, f32, u32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_SELECT(v_float64x2, f64, u64) +#endif + +#if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_EXPAND(_Tpvec, _Tpwvec, _Tp, suffix) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + b0.val = vmovl_##suffix(vget_low_##suffix(a.val)); \ + b1.val = vmovl_high_##suffix(a.val); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + return _Tpwvec(vmovl_##suffix(vget_low_##suffix(a.val))); \ +} \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + return _Tpwvec(vmovl_high_##suffix(a.val)); \ +} \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + return _Tpwvec(vmovl_##suffix(vld1_##suffix(ptr))); \ +} +#else +#define OPENCV_HAL_IMPL_NEON_EXPAND(_Tpvec, _Tpwvec, _Tp, suffix) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + b0.val = vmovl_##suffix(vget_low_##suffix(a.val)); \ + b1.val = vmovl_##suffix(vget_high_##suffix(a.val)); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + return _Tpwvec(vmovl_##suffix(vget_low_##suffix(a.val))); \ +} \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + return _Tpwvec(vmovl_##suffix(vget_high_##suffix(a.val))); \ +} \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + return _Tpwvec(vmovl_##suffix(vld1_##suffix(ptr))); \ +} +#endif + +OPENCV_HAL_IMPL_NEON_EXPAND(v_uint8x16, v_uint16x8, uchar, u8) +OPENCV_HAL_IMPL_NEON_EXPAND(v_int8x16, v_int16x8, schar, s8) +OPENCV_HAL_IMPL_NEON_EXPAND(v_uint16x8, v_uint32x4, ushort, u16) +OPENCV_HAL_IMPL_NEON_EXPAND(v_int16x8, v_int32x4, short, s16) +OPENCV_HAL_IMPL_NEON_EXPAND(v_uint32x4, v_uint64x2, uint, u32) +OPENCV_HAL_IMPL_NEON_EXPAND(v_int32x4, v_int64x2, int, s32) + +inline v_uint32x4 v_load_expand_q(const uchar* ptr) +{ + typedef unsigned int CV_DECL_ALIGNED(1) unaligned_uint; + uint8x8_t v0 = vcreate_u8(*(unaligned_uint*)ptr); + uint16x4_t v1 = vget_low_u16(vmovl_u8(v0)); + return v_uint32x4(vmovl_u16(v1)); +} + +inline v_int32x4 v_load_expand_q(const schar* ptr) +{ + typedef unsigned int CV_DECL_ALIGNED(1) unaligned_uint; + int8x8_t v0 = vcreate_s8(*(unaligned_uint*)ptr); + int16x4_t v1 = vget_low_s16(vmovl_s8(v0)); + return v_int32x4(vmovl_s16(v1)); +} + +#if defined(__aarch64__) || defined(_M_ARM64) +#define OPENCV_HAL_IMPL_NEON_UNPACKS(_Tpvec, suffix) \ +inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \ +{ \ + b0.val = vzip1q_##suffix(a0.val, a1.val); \ + b1.val = vzip2q_##suffix(a0.val, a1.val); \ +} \ +inline v_##_Tpvec v_combine_low(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + return v_##_Tpvec(vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val))); \ +} \ +inline v_##_Tpvec v_combine_high(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + return v_##_Tpvec(vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val))); \ +} \ +inline void v_recombine(const v_##_Tpvec& a, const v_##_Tpvec& b, v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + c.val = vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val)); \ + d.val = vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val)); \ +} +#else +#define OPENCV_HAL_IMPL_NEON_UNPACKS(_Tpvec, suffix) \ +inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \ +{ \ + _Tpvec##x2_t p = vzipq_##suffix(a0.val, a1.val); \ + b0.val = p.val[0]; \ + b1.val = p.val[1]; \ +} \ +inline v_##_Tpvec v_combine_low(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + return v_##_Tpvec(vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val))); \ +} \ +inline v_##_Tpvec v_combine_high(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + return v_##_Tpvec(vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val))); \ +} \ +inline void v_recombine(const v_##_Tpvec& a, const v_##_Tpvec& b, v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + c.val = vcombine_##suffix(vget_low_##suffix(a.val), vget_low_##suffix(b.val)); \ + d.val = vcombine_##suffix(vget_high_##suffix(a.val), vget_high_##suffix(b.val)); \ +} +#endif + +OPENCV_HAL_IMPL_NEON_UNPACKS(uint8x16, u8) +OPENCV_HAL_IMPL_NEON_UNPACKS(int8x16, s8) +OPENCV_HAL_IMPL_NEON_UNPACKS(uint16x8, u16) +OPENCV_HAL_IMPL_NEON_UNPACKS(int16x8, s16) +OPENCV_HAL_IMPL_NEON_UNPACKS(uint32x4, u32) +OPENCV_HAL_IMPL_NEON_UNPACKS(int32x4, s32) +OPENCV_HAL_IMPL_NEON_UNPACKS(float32x4, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_UNPACKS(float64x2, f64) +#endif + +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ + uint8x16_t vec = vrev64q_u8(a.val); + return v_uint8x16(vextq_u8(vec, vec, 8)); +} + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ + uint16x8_t vec = vrev64q_u16(a.val); + return v_uint16x8(vextq_u16(vec, vec, 4)); +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ + uint32x4_t vec = vrev64q_u32(a.val); + return v_uint32x4(vextq_u32(vec, vec, 2)); +} + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ + uint64x2_t vec = a.val; + uint64x1_t vec_lo = vget_low_u64(vec); + uint64x1_t vec_hi = vget_high_u64(vec); + return v_uint64x2(vcombine_u64(vec_hi, vec_lo)); +} + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +#if CV_SIMD128_64F +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } +#endif + +#define OPENCV_HAL_IMPL_NEON_EXTRACT(_Tpvec, suffix) \ +template \ +inline v_##_Tpvec v_extract(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + return v_##_Tpvec(vextq_##suffix(a.val, b.val, s)); \ +} + +OPENCV_HAL_IMPL_NEON_EXTRACT(uint8x16, u8) +OPENCV_HAL_IMPL_NEON_EXTRACT(int8x16, s8) +OPENCV_HAL_IMPL_NEON_EXTRACT(uint16x8, u16) +OPENCV_HAL_IMPL_NEON_EXTRACT(int16x8, s16) +OPENCV_HAL_IMPL_NEON_EXTRACT(uint32x4, u32) +OPENCV_HAL_IMPL_NEON_EXTRACT(int32x4, s32) +OPENCV_HAL_IMPL_NEON_EXTRACT(uint64x2, u64) +OPENCV_HAL_IMPL_NEON_EXTRACT(int64x2, s64) +OPENCV_HAL_IMPL_NEON_EXTRACT(float32x4, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_EXTRACT(float64x2, f64) +#endif + +#define OPENCV_HAL_IMPL_NEON_EXTRACT_N(_Tpvec, _Tp, suffix) \ +template inline _Tp v_extract_n(_Tpvec v) { return vgetq_lane_##suffix(v.val, i); } + +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_int16x8, short, s16) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_uint32x4, uint, u32) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_int32x4, int, s32) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_int64x2, int64, s64) +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_float32x4, float, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_EXTRACT_N(v_float64x2, double, f64) +#endif + +#define OPENCV_HAL_IMPL_NEON_BROADCAST(_Tpvec, _Tp, suffix) \ +template inline _Tpvec v_broadcast_element(_Tpvec v) { _Tp t = v_extract_n(v); return v_setall_##suffix(t); } + +OPENCV_HAL_IMPL_NEON_BROADCAST(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_int16x8, short, s16) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_uint32x4, uint, u32) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_int32x4, int, s32) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_int64x2, int64, s64) +OPENCV_HAL_IMPL_NEON_BROADCAST(v_float32x4, float, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_BROADCAST(v_float64x2, double, f64) +#endif + +#if CV_SIMD128_64F +inline v_int32x4 v_round(const v_float32x4& a) +{ + float32x4_t a_ = a.val; + int32x4_t result; +#if defined _MSC_VER + result = vcvtnq_s32_f32(a_); +#else + __asm__ ("fcvtns %0.4s, %1.4s" + : "=w"(result) + : "w"(a_) + : /* No clobbers */); +#endif + return v_int32x4(result); +} +#else +inline v_int32x4 v_round(const v_float32x4& a) +{ + static const int32x4_t v_sign = vdupq_n_s32(1 << 31), + v_05 = vreinterpretq_s32_f32(vdupq_n_f32(0.5f)); + + int32x4_t v_addition = vorrq_s32(v_05, vandq_s32(v_sign, vreinterpretq_s32_f32(a.val))); + return v_int32x4(vcvtq_s32_f32(vaddq_f32(a.val, vreinterpretq_f32_s32(v_addition)))); +} +#endif +inline v_int32x4 v_floor(const v_float32x4& a) +{ + int32x4_t a1 = vcvtq_s32_f32(a.val); + uint32x4_t mask = vcgtq_f32(vcvtq_f32_s32(a1), a.val); + return v_int32x4(vaddq_s32(a1, vreinterpretq_s32_u32(mask))); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + int32x4_t a1 = vcvtq_s32_f32(a.val); + uint32x4_t mask = vcgtq_f32(a.val, vcvtq_f32_s32(a1)); + return v_int32x4(vsubq_s32(a1, vreinterpretq_s32_u32(mask))); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ return v_int32x4(vcvtq_s32_f32(a.val)); } + +#if CV_SIMD128_64F +inline v_int32x4 v_round(const v_float64x2& a) +{ + static const int32x2_t zero = vdup_n_s32(0); + return v_int32x4(vcombine_s32(vmovn_s64(vcvtnq_s64_f64(a.val)), zero)); +} + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + return v_int32x4(vcombine_s32(vmovn_s64(vcvtnq_s64_f64(a.val)), vmovn_s64(vcvtnq_s64_f64(b.val)))); +} + +inline v_int32x4 v_floor(const v_float64x2& a) +{ + static const int32x2_t zero = vdup_n_s32(0); + int64x2_t a1 = vcvtq_s64_f64(a.val); + uint64x2_t mask = vcgtq_f64(vcvtq_f64_s64(a1), a.val); + a1 = vaddq_s64(a1, vreinterpretq_s64_u64(mask)); + return v_int32x4(vcombine_s32(vmovn_s64(a1), zero)); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + static const int32x2_t zero = vdup_n_s32(0); + int64x2_t a1 = vcvtq_s64_f64(a.val); + uint64x2_t mask = vcgtq_f64(a.val, vcvtq_f64_s64(a1)); + a1 = vsubq_s64(a1, vreinterpretq_s64_u64(mask)); + return v_int32x4(vcombine_s32(vmovn_s64(a1), zero)); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ + static const int32x2_t zero = vdup_n_s32(0); + return v_int32x4(vcombine_s32(vmovn_s64(vcvtaq_s64_f64(a.val)), zero)); +} +#endif + +#if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(_Tpvec, suffix) \ +inline void v_transpose4x4(const v_##_Tpvec& a0, const v_##_Tpvec& a1, \ + const v_##_Tpvec& a2, const v_##_Tpvec& a3, \ + v_##_Tpvec& b0, v_##_Tpvec& b1, \ + v_##_Tpvec& b2, v_##_Tpvec& b3) \ +{ \ + /* -- Pass 1: 64b transpose */ \ + _Tpvec##_t t0 = vreinterpretq_##suffix##32_##suffix##64( \ + vtrn1q_##suffix##64(vreinterpretq_##suffix##64_##suffix##32(a0.val), \ + vreinterpretq_##suffix##64_##suffix##32(a2.val))); \ + _Tpvec##_t t1 = vreinterpretq_##suffix##32_##suffix##64( \ + vtrn1q_##suffix##64(vreinterpretq_##suffix##64_##suffix##32(a1.val), \ + vreinterpretq_##suffix##64_##suffix##32(a3.val))); \ + _Tpvec##_t t2 = vreinterpretq_##suffix##32_##suffix##64( \ + vtrn2q_##suffix##64(vreinterpretq_##suffix##64_##suffix##32(a0.val), \ + vreinterpretq_##suffix##64_##suffix##32(a2.val))); \ + _Tpvec##_t t3 = vreinterpretq_##suffix##32_##suffix##64( \ + vtrn2q_##suffix##64(vreinterpretq_##suffix##64_##suffix##32(a1.val), \ + vreinterpretq_##suffix##64_##suffix##32(a3.val))); \ + /* -- Pass 2: 32b transpose */ \ + b0.val = vtrn1q_##suffix##32(t0, t1); \ + b1.val = vtrn2q_##suffix##32(t0, t1); \ + b2.val = vtrn1q_##suffix##32(t2, t3); \ + b3.val = vtrn2q_##suffix##32(t2, t3); \ +} + +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(uint32x4, u) +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(int32x4, s) +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(float32x4, f) +#else // #if CV_NEON_AARCH64 +#define OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(_Tpvec, suffix) \ +inline void v_transpose4x4(const v_##_Tpvec& a0, const v_##_Tpvec& a1, \ + const v_##_Tpvec& a2, const v_##_Tpvec& a3, \ + v_##_Tpvec& b0, v_##_Tpvec& b1, \ + v_##_Tpvec& b2, v_##_Tpvec& b3) \ +{ \ + /* m00 m01 m02 m03 */ \ + /* m10 m11 m12 m13 */ \ + /* m20 m21 m22 m23 */ \ + /* m30 m31 m32 m33 */ \ + _Tpvec##x2_t t0 = vtrnq_##suffix(a0.val, a1.val); \ + _Tpvec##x2_t t1 = vtrnq_##suffix(a2.val, a3.val); \ + /* m00 m10 m02 m12 */ \ + /* m01 m11 m03 m13 */ \ + /* m20 m30 m22 m32 */ \ + /* m21 m31 m23 m33 */ \ + b0.val = vcombine_##suffix(vget_low_##suffix(t0.val[0]), vget_low_##suffix(t1.val[0])); \ + b1.val = vcombine_##suffix(vget_low_##suffix(t0.val[1]), vget_low_##suffix(t1.val[1])); \ + b2.val = vcombine_##suffix(vget_high_##suffix(t0.val[0]), vget_high_##suffix(t1.val[0])); \ + b3.val = vcombine_##suffix(vget_high_##suffix(t0.val[1]), vget_high_##suffix(t1.val[1])); \ +} + +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(uint32x4, u32) +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(int32x4, s32) +OPENCV_HAL_IMPL_NEON_TRANSPOSE4x4(float32x4, f32) +#endif // #if CV_NEON_AARCH64 + +#define OPENCV_HAL_IMPL_NEON_INTERLEAVED(_Tpvec, _Tp, suffix) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b) \ +{ \ + _Tpvec##x2_t v = vld2q_##suffix(ptr); \ + a.val = v.val[0]; \ + b.val = v.val[1]; \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, v_##_Tpvec& c) \ +{ \ + _Tpvec##x3_t v = vld3q_##suffix(ptr); \ + a.val = v.val[0]; \ + b.val = v.val[1]; \ + c.val = v.val[2]; \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, \ + v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + _Tpvec##x4_t v = vld4q_##suffix(ptr); \ + a.val = v.val[0]; \ + b.val = v.val[1]; \ + c.val = v.val[2]; \ + d.val = v.val[3]; \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + _Tpvec##x2_t v; \ + v.val[0] = a.val; \ + v.val[1] = b.val; \ + vst2q_##suffix(ptr, v); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + _Tpvec##x3_t v; \ + v.val[0] = a.val; \ + v.val[1] = b.val; \ + v.val[2] = c.val; \ + vst3q_##suffix(ptr, v); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, const v_##_Tpvec& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec##x4_t v; \ + v.val[0] = a.val; \ + v.val[1] = b.val; \ + v.val[2] = c.val; \ + v.val[3] = d.val; \ + vst4q_##suffix(ptr, v); \ +} + +#define OPENCV_HAL_IMPL_NEON_INTERLEAVED_INT64(tp, suffix) \ +inline void v_load_deinterleave( const tp* ptr, v_##tp##x2& a, v_##tp##x2& b ) \ +{ \ + tp##x1_t a0 = vld1_##suffix(ptr); \ + tp##x1_t b0 = vld1_##suffix(ptr + 1); \ + tp##x1_t a1 = vld1_##suffix(ptr + 2); \ + tp##x1_t b1 = vld1_##suffix(ptr + 3); \ + a = v_##tp##x2(vcombine_##suffix(a0, a1)); \ + b = v_##tp##x2(vcombine_##suffix(b0, b1)); \ +} \ + \ +inline void v_load_deinterleave( const tp* ptr, v_##tp##x2& a, \ + v_##tp##x2& b, v_##tp##x2& c ) \ +{ \ + tp##x1_t a0 = vld1_##suffix(ptr); \ + tp##x1_t b0 = vld1_##suffix(ptr + 1); \ + tp##x1_t c0 = vld1_##suffix(ptr + 2); \ + tp##x1_t a1 = vld1_##suffix(ptr + 3); \ + tp##x1_t b1 = vld1_##suffix(ptr + 4); \ + tp##x1_t c1 = vld1_##suffix(ptr + 5); \ + a = v_##tp##x2(vcombine_##suffix(a0, a1)); \ + b = v_##tp##x2(vcombine_##suffix(b0, b1)); \ + c = v_##tp##x2(vcombine_##suffix(c0, c1)); \ +} \ + \ +inline void v_load_deinterleave( const tp* ptr, v_##tp##x2& a, v_##tp##x2& b, \ + v_##tp##x2& c, v_##tp##x2& d ) \ +{ \ + tp##x1_t a0 = vld1_##suffix(ptr); \ + tp##x1_t b0 = vld1_##suffix(ptr + 1); \ + tp##x1_t c0 = vld1_##suffix(ptr + 2); \ + tp##x1_t d0 = vld1_##suffix(ptr + 3); \ + tp##x1_t a1 = vld1_##suffix(ptr + 4); \ + tp##x1_t b1 = vld1_##suffix(ptr + 5); \ + tp##x1_t c1 = vld1_##suffix(ptr + 6); \ + tp##x1_t d1 = vld1_##suffix(ptr + 7); \ + a = v_##tp##x2(vcombine_##suffix(a0, a1)); \ + b = v_##tp##x2(vcombine_##suffix(b0, b1)); \ + c = v_##tp##x2(vcombine_##suffix(c0, c1)); \ + d = v_##tp##x2(vcombine_##suffix(d0, d1)); \ +} \ + \ +inline void v_store_interleave( tp* ptr, const v_##tp##x2& a, const v_##tp##x2& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + vst1_##suffix(ptr, vget_low_##suffix(a.val)); \ + vst1_##suffix(ptr + 1, vget_low_##suffix(b.val)); \ + vst1_##suffix(ptr + 2, vget_high_##suffix(a.val)); \ + vst1_##suffix(ptr + 3, vget_high_##suffix(b.val)); \ +} \ + \ +inline void v_store_interleave( tp* ptr, const v_##tp##x2& a, \ + const v_##tp##x2& b, const v_##tp##x2& c, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + vst1_##suffix(ptr, vget_low_##suffix(a.val)); \ + vst1_##suffix(ptr + 1, vget_low_##suffix(b.val)); \ + vst1_##suffix(ptr + 2, vget_low_##suffix(c.val)); \ + vst1_##suffix(ptr + 3, vget_high_##suffix(a.val)); \ + vst1_##suffix(ptr + 4, vget_high_##suffix(b.val)); \ + vst1_##suffix(ptr + 5, vget_high_##suffix(c.val)); \ +} \ + \ +inline void v_store_interleave( tp* ptr, const v_##tp##x2& a, const v_##tp##x2& b, \ + const v_##tp##x2& c, const v_##tp##x2& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + vst1_##suffix(ptr, vget_low_##suffix(a.val)); \ + vst1_##suffix(ptr + 1, vget_low_##suffix(b.val)); \ + vst1_##suffix(ptr + 2, vget_low_##suffix(c.val)); \ + vst1_##suffix(ptr + 3, vget_low_##suffix(d.val)); \ + vst1_##suffix(ptr + 4, vget_high_##suffix(a.val)); \ + vst1_##suffix(ptr + 5, vget_high_##suffix(b.val)); \ + vst1_##suffix(ptr + 6, vget_high_##suffix(c.val)); \ + vst1_##suffix(ptr + 7, vget_high_##suffix(d.val)); \ +} + +OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint8x16, uchar, u8) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(int8x16, schar, s8) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint16x8, ushort, u16) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(int16x8, short, s16) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(int32x4, int, s32) +OPENCV_HAL_IMPL_NEON_INTERLEAVED(float32x4, float, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_NEON_INTERLEAVED(float64x2, double, f64) +#endif + +OPENCV_HAL_IMPL_NEON_INTERLEAVED_INT64(int64, s64) +OPENCV_HAL_IMPL_NEON_INTERLEAVED_INT64(uint64, u64) + +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(vcvtq_f32_s32(a.val)); +} + +#if CV_SIMD128_64F +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + float32x2_t zero = vdup_n_f32(0.0f); + return v_float32x4(vcombine_f32(vcvt_f32_f64(a.val), zero)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + return v_float32x4(vcombine_f32(vcvt_f32_f64(a.val), vcvt_f32_f64(b.val))); +} + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ + return v_float64x2(vcvt_f64_f32(vcvt_f32_s32(vget_low_s32(a.val)))); +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ + return v_float64x2(vcvt_f64_f32(vcvt_f32_s32(vget_high_s32(a.val)))); +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + return v_float64x2(vcvt_f64_f32(vget_low_f32(a.val))); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + return v_float64x2(vcvt_f64_f32(vget_high_f32(a.val))); +} + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ return v_float64x2(vcvtq_f64_s64(a.val)); } + +#endif + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[ 0]], + tab[idx[ 1]], + tab[idx[ 2]], + tab[idx[ 3]], + tab[idx[ 4]], + tab[idx[ 5]], + tab[idx[ 6]], + tab[idx[ 7]], + tab[idx[ 8]], + tab[idx[ 9]], + tab[idx[10]], + tab[idx[11]], + tab[idx[12]], + tab[idx[13]], + tab[idx[14]], + tab[idx[15]] + }; + return v_int8x16(vld1q_s8(elems)); +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[4]], + tab[idx[4] + 1], + tab[idx[5]], + tab[idx[5] + 1], + tab[idx[6]], + tab[idx[6] + 1], + tab[idx[7]], + tab[idx[7] + 1] + }; + return v_int8x16(vld1q_s8(elems)); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[2] + 2], + tab[idx[2] + 3], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[3] + 2], + tab[idx[3] + 3] + }; + return v_int8x16(vld1q_s8(elems)); +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((schar*)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]], + tab[idx[4]], + tab[idx[5]], + tab[idx[6]], + tab[idx[7]] + }; + return v_int16x8(vld1q_s16(elems)); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1] + }; + return v_int16x8(vld1q_s16(elems)); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_int16x8(vcombine_s16(vld1_s16(tab + idx[0]), vld1_s16(tab + idx[1]))); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((short*)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((short*)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((short*)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_int32x4(vld1q_s32(elems)); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + return v_int32x4(vcombine_s32(vld1_s32(tab + idx[0]), vld1_s32(tab + idx[1]))); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(vld1q_s32(tab + idx[0])); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((int*)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((int*)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((int*)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + return v_int64x2(vcombine_s64(vcreate_s64(tab[idx[0]]), vcreate_s64(tab[idx[1]]))); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(vld1q_s64(tab + idx[0])); +} +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_float32x4(vld1q_f32(elems)); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) +{ + typedef uint64 CV_DECL_ALIGNED(1) unaligned_uint64; + + uint64 CV_DECL_ALIGNED(32) elems[2] = + { + *(unaligned_uint64*)(tab + idx[0]), + *(unaligned_uint64*)(tab + idx[1]) + }; + return v_float32x4(vreinterpretq_f32_u64(vld1q_u64(elems))); +} +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) +{ + return v_float32x4(vld1q_f32(tab + idx[0])); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[vgetq_lane_s32(idxvec.val, 0)], + tab[vgetq_lane_s32(idxvec.val, 1)], + tab[vgetq_lane_s32(idxvec.val, 2)], + tab[vgetq_lane_s32(idxvec.val, 3)] + }; + return v_int32x4(vld1q_s32(elems)); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + unsigned CV_DECL_ALIGNED(32) elems[4] = + { + tab[vgetq_lane_s32(idxvec.val, 0)], + tab[vgetq_lane_s32(idxvec.val, 1)], + tab[vgetq_lane_s32(idxvec.val, 2)], + tab[vgetq_lane_s32(idxvec.val, 3)] + }; + return v_uint32x4(vld1q_u32(elems)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[vgetq_lane_s32(idxvec.val, 0)], + tab[vgetq_lane_s32(idxvec.val, 1)], + tab[vgetq_lane_s32(idxvec.val, 2)], + tab[vgetq_lane_s32(idxvec.val, 3)] + }; + return v_float32x4(vld1q_f32(elems)); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + /*int CV_DECL_ALIGNED(32) idx[4]; + v_store(idx, idxvec); + + float32x4_t xy02 = vcombine_f32(vld1_f32(tab + idx[0]), vld1_f32(tab + idx[2])); + float32x4_t xy13 = vcombine_f32(vld1_f32(tab + idx[1]), vld1_f32(tab + idx[3])); + + float32x4x2_t xxyy = vuzpq_f32(xy02, xy13); + x = v_float32x4(xxyy.val[0]); + y = v_float32x4(xxyy.val[1]);*/ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + x = v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); + y = v_float32x4(tab[idx[0]+1], tab[idx[1]+1], tab[idx[2]+1], tab[idx[3]+1]); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + return v_int8x16(vcombine_s8(vtbl1_s8(vget_low_s8(vec.val), vcreate_s8(0x0705060403010200)), vtbl1_s8(vget_high_s8(vec.val), vcreate_s8(0x0705060403010200)))); +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + return v_int8x16(vcombine_s8(vtbl1_s8(vget_low_s8(vec.val), vcreate_s8(0x0703060205010400)), vtbl1_s8(vget_high_s8(vec.val), vcreate_s8(0x0703060205010400)))); +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + return v_int16x8(vreinterpretq_s16_s8(vcombine_s8(vtbl1_s8(vget_low_s8(vreinterpretq_s8_s16(vec.val)), vcreate_s8(0x0706030205040100)), vtbl1_s8(vget_high_s8(vreinterpretq_s8_s16(vec.val)), vcreate_s8(0x0706030205040100))))); +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + int16x4x2_t res = vzip_s16(vget_low_s16(vec.val), vget_high_s16(vec.val)); + return v_int16x8(vcombine_s16(res.val[0], res.val[1])); +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + int32x2x2_t res = vzip_s32(vget_low_s32(vec.val), vget_high_s32(vec.val)); + return v_int32x4(vcombine_s32(res.val[0], res.val[1])); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + return v_int8x16(vextq_s8(vcombine_s8(vtbl1_s8(vget_low_s8(vec.val), vcreate_s8(0x0605040201000000)), vtbl1_s8(vget_high_s8(vec.val), vcreate_s8(0x0807060504020100))), vdupq_n_s8(0), 2)); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + return v_int16x8(vreinterpretq_s16_s8(vextq_s8(vcombine_s8(vtbl1_s8(vget_low_s8(vreinterpretq_s8_s16(vec.val)), vcreate_s8(0x0504030201000000)), vget_high_s8(vreinterpretq_s8_s16(vec.val))), vdupq_n_s8(0), 2))); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +#if CV_SIMD128_64F +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + double CV_DECL_ALIGNED(32) elems[2] = + { + tab[idx[0]], + tab[idx[1]] + }; + return v_float64x2(vld1q_f64(elems)); +} + +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2(vld1q_f64(tab + idx[0])); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + double CV_DECL_ALIGNED(32) elems[2] = + { + tab[vgetq_lane_s32(idxvec.val, 0)], + tab[vgetq_lane_s32(idxvec.val, 1)], + }; + return v_float64x2(vld1q_f64(elems)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + x = v_float64x2(tab[idx[0]], tab[idx[1]]); + y = v_float64x2(tab[idx[0]+1], tab[idx[1]+1]); +} +#endif + +////// FP16 support /////// +#if CV_FP16 +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + float16x4_t v = + #ifndef vld1_f16 // APPLE compiler defines vld1_f16 as macro + (float16x4_t)vld1_s16((const short*)ptr); + #else + vld1_f16((const __fp16*)ptr); + #endif + return v_float32x4(vcvt_f32_f16(v)); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + float16x4_t hv = vcvt_f16_f32(v.val); + + #ifndef vst1_f16 // APPLE compiler defines vst1_f16 as macro + vst1_s16((short*)ptr, (int16x4_t)hv); + #else + vst1_f16((__fp16*)ptr, hv); + #endif +} +#else +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + const int N = 4; + float buf[N]; + for( int i = 0; i < N; i++ ) buf[i] = (float)ptr[i]; + return v_load(buf); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + const int N = 4; + float buf[N]; + v_store(buf, v); + for( int i = 0; i < N; i++ ) ptr[i] = float16_t(buf[i]); +} +#endif + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv.hpp new file mode 100644 index 0000000..04e3c0e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv.hpp @@ -0,0 +1,3342 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// The original implementation has been contributed by Yin Zhang. +// Copyright (C) 2020, Institute of Software, Chinese Academy of Sciences. + +#ifndef OPENCV_HAL_INTRIN_RVV_HPP +#define OPENCV_HAL_INTRIN_RVV_HPP + +#include + +// RVV intrinsics have been renamed in version 0.11, so we need to include +// compatibility headers: +// https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/auto-generated/rvv-v0p10-compatible-headers +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic>10999 +#include "intrin_rvv_010_compat_non-policy.hpp" +#include "intrin_rvv_010_compat_overloaded-non-policy.hpp" +#endif + + +// Building for T-Head C906 core with RVV 0.7.1 using toolchain +// https://github.com/T-head-Semi/xuantie-gnu-toolchain +// with option '-march=rv64gcv0p7' +#ifdef __THEAD_VERSION__ +# if __riscv_v == 7000 +# include +# define CV_RVV_THEAD_0_7 +# endif +#endif + +namespace cv +{ + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define CV_SIMD128 1 +#ifndef CV_RVV_THEAD_0_7 +# define CV_SIMD128_64F 1 +#else +# define CV_SIMD128_64F 0 +#endif + +//////////// Unsupported native intrinsics in C++ //////////// +// The following types have been defined in clang, but not in GCC yet. +#ifndef __clang__ + +struct vuint8mf2_t +{ + uchar val[8] = {0}; + vuint8mf2_t() {} + vuint8mf2_t(const uchar* ptr) + { + for (int i = 0; i < 8; ++i) + { + val[i] = ptr[i]; + } + } +}; +struct vint8mf2_t +{ + schar val[8] = {0}; + vint8mf2_t() {} + vint8mf2_t(const schar* ptr) + { + for (int i = 0; i < 8; ++i) + { + val[i] = ptr[i]; + } + } +}; +struct vuint16mf2_t +{ + ushort val[4] = {0}; + vuint16mf2_t() {} + vuint16mf2_t(const ushort* ptr) + { + for (int i = 0; i < 4; ++i) + { + val[i] = ptr[i]; + } + } +}; +struct vint16mf2_t +{ + short val[4] = {0}; + vint16mf2_t() {} + vint16mf2_t(const short* ptr) + { + for (int i = 0; i < 4; ++i) + { + val[i] = ptr[i]; + } + } +}; +struct vuint32mf2_t +{ + unsigned val[2] = {0}; + vuint32mf2_t() {} + vuint32mf2_t(const unsigned* ptr) + { + val[0] = ptr[0]; + val[1] = ptr[1]; + } +}; +struct vint32mf2_t +{ + int val[2] = {0}; + vint32mf2_t() {} + vint32mf2_t(const int* ptr) + { + val[0] = ptr[0]; + val[1] = ptr[1]; + } +}; +struct vfloat32mf2_t +{ + float val[2] = {0}; + vfloat32mf2_t() {} + vfloat32mf2_t(const float* ptr) + { + val[0] = ptr[0]; + val[1] = ptr[1]; + } +}; +struct vuint64mf2_t +{ + uint64 val[1] = {0}; + vuint64mf2_t() {} + vuint64mf2_t(const uint64* ptr) + { + val[0] = ptr[0]; + } +}; +struct vint64mf2_t +{ + int64 val[1] = {0}; + vint64mf2_t() {} + vint64mf2_t(const int64* ptr) + { + val[0] = ptr[0]; + } +}; +struct vfloat64mf2_t +{ + double val[1] = {0}; + vfloat64mf2_t() {} + vfloat64mf2_t(const double* ptr) + { + val[0] = ptr[0]; + } +}; +struct vuint8mf4_t +{ + uchar val[4] = {0}; + vuint8mf4_t() {} + vuint8mf4_t(const uchar* ptr) + { + for (int i = 0; i < 4; ++i) + { + val[i] = ptr[i]; + } + } +}; +struct vint8mf4_t +{ + schar val[4] = {0}; + vint8mf4_t() {} + vint8mf4_t(const schar* ptr) + { + for (int i = 0; i < 4; ++i) + { + val[i] = ptr[i]; + } + } +}; + +#define OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(_Tpvec, _Tp, suffix, width, n) \ +inline _Tpvec vle##width##_v_##suffix##mf2(const _Tp* ptr, size_t vl) \ +{ \ + CV_UNUSED(vl); \ + return _Tpvec(ptr); \ +} \ +inline void vse##width##_v_##suffix##mf2(_Tp* ptr, _Tpvec v, size_t vl) \ +{ \ + CV_UNUSED(vl); \ + for (int i = 0; i < n; ++i) \ + { \ + ptr[i] = v.val[i]; \ + } \ +} + +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vuint8mf2_t, uint8_t, u8, 8, 8) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vint8mf2_t, int8_t, i8, 8, 8) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vuint16mf2_t, uint16_t, u16, 16, 4) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vint16mf2_t, int16_t, i16, 16, 4) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vuint32mf2_t, uint32_t, u32, 32, 2) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vint32mf2_t, int32_t, i32, 32, 2) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vfloat32mf2_t, float32_t, f32, 32, 2) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vuint64mf2_t, uint64_t, u64, 64, 1) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vint64mf2_t, int64_t, i64, 64, 1) +OPENCV_HAL_IMPL_RVV_NATIVE_LOADSTORE_MF2(vfloat64mf2_t, float64_t, f64, 64, 1) + + +#define OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(_Tpwvec, _Tpvec, _wTp, wcvt, suffix, width, n) \ +inline _Tpwvec wcvt (_Tpvec v, size_t vl) \ +{ \ + _wTp tmp[n]; \ + for (int i = 0; i < n; ++i) \ + { \ + tmp[i] = (_wTp)v.val[i]; \ + } \ + return vle##width##_v_##suffix##m1(tmp, vl); \ +} + +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vuint16m1_t, vuint8mf2_t, ushort, vwcvtu_x_x_v_u16m1, u16, 16, 8) +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vint16m1_t, vint8mf2_t, short, vwcvt_x_x_v_i16m1, i16, 16, 8) +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vuint32m1_t, vuint16mf2_t, unsigned, vwcvtu_x_x_v_u32m1, u32, 32, 4) +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vint32m1_t, vint16mf2_t, int, vwcvt_x_x_v_i32m1, i32, 32, 4) +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vuint64m1_t, vuint32mf2_t, uint64, vwcvtu_x_x_v_u64m1, u64, 64, 2) +OPENCV_HAL_IMPL_RVV_NATIVE_WCVT(vint64m1_t, vint32mf2_t, int64, vwcvt_x_x_v_i64m1, i64, 64, 2) + +inline vuint8mf4_t vle8_v_u8mf4 (const uint8_t *base, size_t vl) +{ + CV_UNUSED(vl); + return vuint8mf4_t(base); +} +inline vint8mf4_t vle8_v_i8mf4 (const int8_t *base, size_t vl) +{ + CV_UNUSED(vl); + return vint8mf4_t(base); +} + +inline vuint16mf2_t vwcvtu_x_x_v_u16mf2 (vuint8mf4_t src, size_t vl) +{ + ushort tmp[4]; + for (int i = 0; i < 4; ++i) + { + tmp[i] = (ushort)src.val[i]; + } + return vle16_v_u16mf2(tmp, vl); +} +inline vint16mf2_t vwcvt_x_x_v_i16mf2 (vint8mf4_t src, size_t vl) +{ + short tmp[4]; + for (int i = 0; i < 4; ++i) + { + tmp[i] = (short)src.val[i]; + } + return vle16_v_i16mf2(tmp, vl); +} +#endif + +//////////// Types //////////// + +#ifndef __clang__ +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16 }; + + v_uint8x16() {} + explicit v_uint8x16(vuint8m1_t v) + { + vse8_v_u8m1(val, v, nlanes); + } + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vuint8m1_t() const + { + return vle8_v_u8m1(val, nlanes); + } + uchar get0() const + { + return val[0]; + } + + uchar val[16]; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(vint8m1_t v) + { + vse8_v_i8m1(val, v, nlanes); + } + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vint8m1_t() const + { + return vle8_v_i8m1(val, nlanes); + } + schar get0() const + { + return val[0]; + } + + schar val[16]; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(vuint16m1_t v) + { + vse16_v_u16m1(val, v, nlanes); + } + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vuint16m1_t() const + { + return vle16_v_u16m1(val, nlanes); + } + ushort get0() const + { + return val[0]; + } + + ushort val[8]; +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(vint16m1_t v) + { + vse16_v_i16m1(val, v, nlanes); + } + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vint16m1_t() const + { + return vle16_v_i16m1(val, nlanes); + } + short get0() const + { + return val[0]; + } + + short val[8]; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(vuint32m1_t v) + { + vse32_v_u32m1(val, v, nlanes); + } + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + unsigned v[] = {v0, v1, v2, v3}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vuint32m1_t() const + { + return vle32_v_u32m1(val, nlanes); + } + unsigned get0() const + { + return val[0]; + } + + unsigned val[4]; +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(vint32m1_t v) + { + vse32_v_i32m1(val, v, nlanes); + } + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vint32m1_t() const + { + return vle32_v_i32m1(val, nlanes); + } + int get0() const + { + return val[0]; + } + int val[4]; +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4 }; + + v_float32x4() {} + explicit v_float32x4(vfloat32m1_t v) + { + vse32_v_f32m1(val, v, nlanes); + } + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vfloat32m1_t() const + { + return vle32_v_f32m1(val, nlanes); + } + float get0() const + { + return val[0]; + } + float val[4]; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2 }; + + v_uint64x2() {} + explicit v_uint64x2(vuint64m1_t v) + { + vse64_v_u64m1(val, v, nlanes); + } + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vuint64m1_t() const + { + return vle64_v_u64m1(val, nlanes); + } + uint64 get0() const + { + return val[0]; + } + + uint64 val[2]; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2 }; + + v_int64x2() {} + explicit v_int64x2(vint64m1_t v) + { + vse64_v_i64m1(val, v, nlanes); + } + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vint64m1_t() const + { + return vle64_v_i64m1(val, nlanes); + } + int64 get0() const + { + return val[0]; + } + + int64 val[2]; +}; + +#if CV_SIMD128_64F +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2 }; + + v_float64x2() {} + explicit v_float64x2(vfloat64m1_t v) + { + vse64_v_f64m1(val, v, nlanes); + } + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + for (int i = 0; i < nlanes; ++i) + { + val[i] = v[i]; + } + } + operator vfloat64m1_t() const + { + return vle64_v_f64m1(val, nlanes); + } + double get0() const + { + return val[0]; + } + + double val[2]; +}; +#endif +#else +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16 }; + + v_uint8x16() {} + explicit v_uint8x16(vuint8m1_t v) + { + *pval = v; + } + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + *pval = vle8_v_u8m1(v, nlanes); + } + operator vuint8m1_t() const + { + return *pval; + } + uchar get0() const + { + return vmv_x(*pval); + } + inline v_uint8x16& operator=(const v_uint8x16& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_uint8x16(const v_uint8x16& vec) { + *pval = *(vec.pval); + } + uchar val[16]; + vuint8m1_t* pval = (vuint8m1_t*)val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(vint8m1_t v) + { + *pval = v; + } + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + *pval = vle8_v_i8m1(v, nlanes); + } + operator vint8m1_t() const + { + return *pval; + } + schar get0() const + { + return vmv_x(*pval); + } + inline v_int8x16& operator=(const v_int8x16& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_int8x16(const v_int8x16& vec) { + *pval = *(vec.pval); + } + schar val[16]; + vint8m1_t* pval = (vint8m1_t*)val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(vuint16m1_t v) + { + *pval = v; + } + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + *pval = vle16_v_u16m1(v, nlanes); + } + operator vuint16m1_t() const + { + return *pval; + } + ushort get0() const + { + return vmv_x(*pval); + } + + inline v_uint16x8& operator=(const v_uint16x8& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_uint16x8(const v_uint16x8& vec) { + *pval = *(vec.pval); + } + ushort val[8]; + vuint16m1_t* pval = (vuint16m1_t*)val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(vint16m1_t v) + { + *pval = v; + } + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + *pval = vle16_v_i16m1(v, nlanes); + } + operator vint16m1_t() const + { + return *pval; + } + short get0() const + { + return vmv_x(*pval); + } + + inline v_int16x8& operator=(const v_int16x8& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_int16x8(const v_int16x8& vec) { + *pval = *(vec.pval); + } + short val[8]; + vint16m1_t* pval = (vint16m1_t*)val; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(vuint32m1_t v) + { + *pval = v; + } + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + unsigned v[] = {v0, v1, v2, v3}; + *pval = vle32_v_u32m1(v, nlanes); + } + operator vuint32m1_t() const + { + return *pval; + } + unsigned get0() const + { + return vmv_x(*pval); + } + + inline v_uint32x4& operator=(const v_uint32x4& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_uint32x4(const v_uint32x4& vec) { + *pval = *(vec.pval); + } + unsigned val[4]; + vuint32m1_t* pval = (vuint32m1_t*)val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(vint32m1_t v) + { + *pval = v; + } + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + *pval = vle32_v_i32m1(v, nlanes); + } + operator vint32m1_t() const + { + return *pval; + } + int get0() const + { + return vmv_x(*pval); + } + + inline v_int32x4& operator=(const v_int32x4& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_int32x4(const v_int32x4& vec) { + *pval = *(vec.pval); + } + int val[4]; + vint32m1_t* pval = (vint32m1_t*)val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4 }; + + v_float32x4() {} + explicit v_float32x4(vfloat32m1_t v) + { + *pval = v; + } + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + *pval = vle32_v_f32m1(v, nlanes); + } + operator vfloat32m1_t() const + { + return *pval; + } + float get0() const + { + return vfmv_f(*pval); + } + inline v_float32x4& operator=(const v_float32x4& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_float32x4(const v_float32x4& vec) { + *pval = *(vec.pval); + } + float val[4]; + vfloat32m1_t* pval = (vfloat32m1_t*)val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2 }; + + v_uint64x2() {} + explicit v_uint64x2(vuint64m1_t v) + { + *pval = v; + } + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + *pval = vle64_v_u64m1(v, nlanes); + } + operator vuint64m1_t() const + { + return *pval; + } + uint64 get0() const + { + return vmv_x(*pval); + } + + inline v_uint64x2& operator=(const v_uint64x2& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_uint64x2(const v_uint64x2& vec) { + *pval = *(vec.pval); + } + uint64 val[2]; + vuint64m1_t* pval = (vuint64m1_t*)val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2 }; + + v_int64x2() {} + explicit v_int64x2(vint64m1_t v) + { + *pval = v; + } + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + *pval = vle64_v_i64m1(v, nlanes); + } + operator vint64m1_t() const + { + return *pval; + } + int64 get0() const + { + return vmv_x(*pval); + } + + inline v_int64x2& operator=(const v_int64x2& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_int64x2(const v_int64x2& vec) { + *pval = *(vec.pval); + } + int64 val[2]; + vint64m1_t* pval = (vint64m1_t*)val; +}; + +#if CV_SIMD128_64F +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2 }; + + v_float64x2() {} + explicit v_float64x2(vfloat64m1_t v) + { + *pval = v; + } + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + *pval = vle64_v_f64m1(v, nlanes); + } + operator vfloat64m1_t() const + { + return *pval; + } + double get0() const + { + return vfmv_f(*pval); + } + + inline v_float64x2& operator=(const v_float64x2& vec) { + *pval = *(vec.pval); + return *this; + } + inline v_float64x2(const v_float64x2& vec) { + *pval = *(vec.pval); + } + double val[2]; + vfloat64m1_t* pval = (vfloat64m1_t*)val; +}; +#endif // CV_SIMD128_64F +#endif // __clang__ + +//////////// Initial //////////// + +#define OPENCV_HAL_IMPL_RVV_INIT_INTEGER(_Tpvec, _Tp, suffix1, suffix2, vl) \ +inline v_##_Tpvec v_setzero_##suffix1() \ +{ \ + return v_##_Tpvec(vmv_v_x_##suffix2##m1(0, vl)); \ +} \ +inline v_##_Tpvec v_setall_##suffix1(_Tp v) \ +{ \ + return v_##_Tpvec(vmv_v_x_##suffix2##m1(v, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint8x16, uchar, u8, u8, 16) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int8x16, schar, s8, i8, 16) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint16x8, ushort, u16, u16, 8) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int16x8, short, s16, i16, 8) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint32x4, unsigned, u32, u32, 4) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int32x4, int, s32, i32, 4) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint64x2, uint64, u64, u64, 2) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int64x2, int64, s64, i64, 2) + +#define OPENCV_HAL_IMPL_RVV_INIT_FP(_Tpv, _Tp, suffix, vl) \ +inline v_##_Tpv v_setzero_##suffix() \ +{ \ + return v_##_Tpv(vfmv_v_f_##suffix##m1(0, vl)); \ +} \ +inline v_##_Tpv v_setall_##suffix(_Tp v) \ +{ \ + return v_##_Tpv(vfmv_v_f_##suffix##m1(v, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_INIT_FP(float32x4, float, f32, 4) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_INIT_FP(float64x2, double, f64, 2) +#endif + +//////////// Reinterpret //////////// + +#define OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(_Tpvec, suffix) \ +inline v_##_Tpvec v_reinterpret_as_##suffix(const v_##_Tpvec& v) { return v; } + +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(uint8x16, u8) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(int8x16, s8) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(uint16x8, u16) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(int16x8, s16) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(uint32x4, u32) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(int32x4, s32) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(float32x4, f32) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(uint64x2, u64) +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(int64x2, s64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_SELF_REINTERPRET(float64x2, f64) +#endif + +#define OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(_Tpvec1, _Tpvec2, suffix1, suffix2, nsuffix1, nsuffix2) \ +inline v_##_Tpvec1 v_reinterpret_as_##suffix1(const v_##_Tpvec2& v) \ +{ \ + return v_##_Tpvec1(vreinterpret_v_##nsuffix2##m1_##nsuffix1##m1(v));\ +} \ +inline v_##_Tpvec2 v_reinterpret_as_##suffix2(const v_##_Tpvec1& v) \ +{ \ + return v_##_Tpvec2(vreinterpret_v_##nsuffix1##m1_##nsuffix2##m1(v));\ +} + +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8x16, int8x16, u8, s8, u8, i8) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16x8, int16x8, u16, s16, u16, i16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32x4, int32x4, u32, s32, u32, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32x4, float32x4, u32, f32, u32, f32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int32x4, float32x4, s32, f32, i32, f32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint64x2, int64x2, u64, s64, u64, i64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint64x2, float64x2, u64, f64, u64, f64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int64x2, float64x2, s64, f64, i64, f64) +#endif +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8x16, uint16x8, u8, u16, u8, u16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8x16, uint32x4, u8, u32, u8, u32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8x16, uint64x2, u8, u64, u8, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16x8, uint32x4, u16, u32, u16, u32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16x8, uint64x2, u16, u64, u16, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32x4, uint64x2, u32, u64, u32, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8x16, int16x8, s8, s16, i8, i16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8x16, int32x4, s8, s32, i8, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8x16, int64x2, s8, s64, i8, i64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int16x8, int32x4, s16, s32, i16, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int16x8, int64x2, s16, s64, i16, i64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int32x4, int64x2, s32, s64, i32, i64) + + +#define OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(_Tpvec1, _Tpvec2, suffix1, suffix2, nsuffix1, nsuffix2, width1, width2) \ +inline v_##_Tpvec1 v_reinterpret_as_##suffix1(const v_##_Tpvec2& v) \ +{ \ + return v_##_Tpvec1(vreinterpret_v_##nsuffix1##width2##m1_##nsuffix1##width1##m1(vreinterpret_v_##nsuffix2##width2##m1_##nsuffix1##width2##m1(v)));\ +} \ +inline v_##_Tpvec2 v_reinterpret_as_##suffix2(const v_##_Tpvec1& v) \ +{ \ + return v_##_Tpvec2(vreinterpret_v_##nsuffix1##width2##m1_##nsuffix2##width2##m1(vreinterpret_v_##nsuffix1##width1##m1_##nsuffix1##width2##m1(v)));\ +} + +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8x16, int16x8, u8, s16, u, i, 8, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8x16, int32x4, u8, s32, u, i, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8x16, int64x2, u8, s64, u, i, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16x8, int8x16, u16, s8, u, i, 16, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16x8, int32x4, u16, s32, u, i, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16x8, int64x2, u16, s64, u, i, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32x4, int8x16, u32, s8, u, i, 32, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32x4, int16x8, u32, s16, u, i, 32, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32x4, int64x2, u32, s64, u, i, 32, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64x2, int8x16, u64, s8, u, i, 64, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64x2, int16x8, u64, s16, u, i, 64, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64x2, int32x4, u64, s32, u, i, 64, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8x16, float32x4, u8, f32, u, f, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16x8, float32x4, u16, f32, u, f, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64x2, float32x4, u64, f32, u, f, 64, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int8x16, float32x4, s8, f32, i, f, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int16x8, float32x4, s16, f32, i, f, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int64x2, float32x4, s64, f32, i, f, 64, 32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8x16, float64x2, u8, f64, u, f, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16x8, float64x2, u16, f64, u, f, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32x4, float64x2, u32, f64, u, f, 32, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int8x16, float64x2, s8, f64, i, f, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int16x8, float64x2, s16, f64, i, f, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int32x4, float64x2, s32, f64, i, f, 32, 64) +#endif + +// Three times reinterpret +#if CV_SIMD128_64F +inline v_float32x4 v_reinterpret_as_f32(const v_float64x2& v) \ +{ \ + return v_float32x4(vreinterpret_v_u32m1_f32m1(vreinterpret_v_u64m1_u32m1(vreinterpret_v_f64m1_u64m1(v))));\ +} \ +inline v_float64x2 v_reinterpret_as_f64(const v_float32x4& v) \ +{ \ + return v_float64x2(vreinterpret_v_u64m1_f64m1(vreinterpret_v_u32m1_u64m1(vreinterpret_v_f32m1_u32m1(v))));\ +} +#endif + +////////////// Extract ////////////// + +#define OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(_Tpvec, _Tp, suffix, vmv, vl) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), a, s, vl), b, _Tpvec::nlanes - s, vl)); \ +} \ +template inline _Tp v_extract_n(_Tpvec v) \ +{ \ + return _Tp(vmv(vslidedown_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), v, i, vl))); \ +} + + +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint8x16, uchar, u8, vmv_x_s_u8m1_u8, 16) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int8x16, schar, i8, vmv_x_s_i8m1_i8, 16) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint16x8, ushort, u16, vmv_x_s_u16m1_u16, 8) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int16x8, short, i16, vmv_x_s_i16m1_i16, 8) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint32x4, uint, u32, vmv_x_s_u32m1_u32, 4) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int32x4, int, i32, vmv_x_s_i32m1_i32, 4) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint64x2, uint64, u64, vmv_x_s_u64m1_u64, 2) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int64x2, int64, i64, vmv_x_s_i64m1_i64, 2) + +#define OPENCV_HAL_IMPL_RVV_EXTRACT_FP(_Tpvec, _Tp, suffix, vmv, vl) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), a, s, vl), b, _Tpvec::nlanes - s, vl)); \ +} \ +template inline _Tp v_extract_n(_Tpvec v) \ +{ \ + return _Tp(vmv(vslidedown_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), v, i, vl))); \ +} + +OPENCV_HAL_IMPL_RVV_EXTRACT_FP(v_float32x4, float, f32, vfmv_f_s_f32m1_f32, 4) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_EXTRACT_FP(v_float64x2, double, f64, vfmv_f_s_f64m1_f64, 2) +#endif + +////////////// Load/Store ////////////// + +#define OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(_Tpvec, _nTpvec, _Tp, hvl, vl, width, suffix, vmv) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ \ + return _Tpvec(vle##width##_v_##suffix##m1(ptr, vl)); \ +} \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ \ + return _Tpvec(vle##width##_v_##suffix##m1(ptr, vl)); \ +} \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ \ + _Tpvec res = _Tpvec(vle##width##_v_##suffix##m1(ptr, hvl)); \ + return res; \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, vl); \ +} \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, vl); \ +} \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, vl); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, vl); \ +} \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, hvl); \ +} \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width##_v_##suffix##m1(ptr, vslidedown_vx_##suffix##m1(vmv(0, vl), a, hvl, vl), hvl); \ +} + +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint8x16, vuint8m1_t, uchar, 8, 16, 8, u8, vmv_v_x_u8m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int8x16, vint8m1_t, schar, 8, 16, 8, i8, vmv_v_x_i8m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint16x8, vuint16m1_t, ushort, 4, 8, 16, u16, vmv_v_x_u16m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int16x8, vint16m1_t, short, 4, 8, 16, i16, vmv_v_x_i16m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint32x4, vuint32m1_t, unsigned, 2, 4, 32, u32, vmv_v_x_u32m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int32x4, vint32m1_t, int, 2, 4, 32, i32, vmv_v_x_i32m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint64x2, vuint64m1_t, uint64, 1, 2, 64, u64, vmv_v_x_u64m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int64x2, vint64m1_t, int64, 1, 2, 64, i64, vmv_v_x_i64m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_float32x4, vfloat32m1_t, float, 2, 4, 32, f32, vfmv_v_f_f32m1) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_float64x2, vfloat64m1_t, double, 1, 2, 64, f64, vfmv_v_f_f64m1) +#endif + +inline v_int8x16 v_load_halves(const schar* ptr0, const schar* ptr1) +{ + schar elems[16] = + { + ptr0[0], ptr0[1], ptr0[2], ptr0[3], ptr0[4], ptr0[5], ptr0[6], ptr0[7], + ptr1[0], ptr1[1], ptr1[2], ptr1[3], ptr1[4], ptr1[5], ptr1[6], ptr1[7] + }; + return v_int8x16(vle8_v_i8m1(elems, 16)); +} +inline v_uint8x16 v_load_halves(const uchar* ptr0, const uchar* ptr1) { return v_reinterpret_as_u8(v_load_halves((schar*)ptr0, (schar*)ptr1)); } + +inline v_int16x8 v_load_halves(const short* ptr0, const short* ptr1) +{ + short elems[8] = + { + ptr0[0], ptr0[1], ptr0[2], ptr0[3], ptr1[0], ptr1[1], ptr1[2], ptr1[3] + }; + return v_int16x8(vle16_v_i16m1(elems, 8)); +} +inline v_uint16x8 v_load_halves(const ushort* ptr0, const ushort* ptr1) { return v_reinterpret_as_u16(v_load_halves((short*)ptr0, (short*)ptr1)); } + +inline v_int32x4 v_load_halves(const int* ptr0, const int* ptr1) +{ + int elems[4] = + { + ptr0[0], ptr0[1], ptr1[0], ptr1[1] + }; + return v_int32x4(vle32_v_i32m1(elems, 4)); +} +inline v_float32x4 v_load_halves(const float* ptr0, const float* ptr1) +{ + float elems[4] = + { + ptr0[0], ptr0[1], ptr1[0], ptr1[1] + }; + return v_float32x4(vle32_v_f32m1(elems, 4)); +} +inline v_uint32x4 v_load_halves(const unsigned* ptr0, const unsigned* ptr1) { return v_reinterpret_as_u32(v_load_halves((int*)ptr0, (int*)ptr1)); } + +inline v_int64x2 v_load_halves(const int64* ptr0, const int64* ptr1) +{ + int64 elems[2] = + { + ptr0[0], ptr1[0] + }; + return v_int64x2(vle64_v_i64m1(elems, 2)); +} +inline v_uint64x2 v_load_halves(const uint64* ptr0, const uint64* ptr1) { return v_reinterpret_as_u64(v_load_halves((int64*)ptr0, (int64*)ptr1)); } + +#if CV_SIMD128_64F +inline v_float64x2 v_load_halves(const double* ptr0, const double* ptr1) +{ + double elems[2] = + { + ptr0[0], ptr1[0] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} +#endif + + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + schar elems[16] = + { + tab[idx[ 0]], + tab[idx[ 1]], + tab[idx[ 2]], + tab[idx[ 3]], + tab[idx[ 4]], + tab[idx[ 5]], + tab[idx[ 6]], + tab[idx[ 7]], + tab[idx[ 8]], + tab[idx[ 9]], + tab[idx[10]], + tab[idx[11]], + tab[idx[12]], + tab[idx[13]], + tab[idx[14]], + tab[idx[15]] + }; + return v_int8x16(vle8_v_i8m1(elems, 16)); +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + schar elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[4]], + tab[idx[4] + 1], + tab[idx[5]], + tab[idx[5] + 1], + tab[idx[6]], + tab[idx[6] + 1], + tab[idx[7]], + tab[idx[7] + 1] + }; + return v_int8x16(vle8_v_i8m1(elems, 16)); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + schar elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[2] + 2], + tab[idx[2] + 3], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[3] + 2], + tab[idx[3] + 3] + }; + return v_int8x16(vle8_v_i8m1(elems, 16)); +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((schar*)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + short elems[8] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]], + tab[idx[4]], + tab[idx[5]], + tab[idx[6]], + tab[idx[7]] + }; + return v_int16x8(vle16_v_i16m1(elems, 8)); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + short elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1] + }; + return v_int16x8(vle16_v_i16m1(elems, 8)); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + short elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3] + }; + return v_int16x8(vle16_v_i16m1(elems, 8)); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((short*)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((short*)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((short*)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + int elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_int32x4(vle32_v_i32m1(elems, 4)); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + int elems[4] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1] + }; + return v_int32x4(vle32_v_i32m1(elems, 4)); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(vle32_v_i32m1(tab + idx[0], 4)); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((int*)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((int*)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((int*)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + int64_t elems[2] = + { + tab[idx[0]], + tab[idx[1]] + }; + return v_int64x2(vle64_v_i64m1(elems, 2)); +} +inline v_int64x2 v_lut_pairs(const int64* tab, const int* idx) +{ + return v_int64x2(vle64_v_i64m1(tab + idx[0], 2)); +} +inline v_uint64x2 v_lut(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + float elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_float32x4(vle32_v_f32m1(elems, 4)); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) +{ + float elems[4] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1] + }; + return v_float32x4(vle32_v_f32m1(elems, 4)); +} +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) +{ + return v_float32x4(vle32_v_f32m1(tab + idx[0], 4)); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int elems[4] = + { + tab[v_extract_n<0>(idxvec)], + tab[v_extract_n<1>(idxvec)], + tab[v_extract_n<2>(idxvec)], + tab[v_extract_n<3>(idxvec)] + }; + return v_int32x4(vle32_v_i32m1(elems, 4)); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + unsigned elems[4] = + { + tab[v_extract_n<0>(idxvec)], + tab[v_extract_n<1>(idxvec)], + tab[v_extract_n<2>(idxvec)], + tab[v_extract_n<3>(idxvec)] + }; + return v_uint32x4(vle32_v_u32m1(elems, 4)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + float elems[4] = + { + tab[v_extract_n<0>(idxvec)], + tab[v_extract_n<1>(idxvec)], + tab[v_extract_n<2>(idxvec)], + tab[v_extract_n<3>(idxvec)] + }; + return v_float32x4(vle32_v_f32m1(elems, 4)); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + int idx[4]; + v_store_aligned(idx, idxvec); + + x = v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); + y = v_float32x4(tab[idx[0]+1], tab[idx[1]+1], tab[idx[2]+1], tab[idx[3]+1]); +} + +#if CV_SIMD128_64F +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + double elems[2] = + { + tab[idx[0]], + tab[idx[1]] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2(vle64_v_f64m1(tab + idx[0], 2)); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + double elems[2] = + { + tab[v_extract_n<0>(idxvec)], + tab[v_extract_n<1>(idxvec)] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + int idx[4] = {0}; + v_store_aligned(idx, idxvec); + + x = v_float64x2(tab[idx[0]], tab[idx[1]]); + y = v_float64x2(tab[idx[0]+1], tab[idx[1]+1]); +} +#endif + +////////////// Pack boolean //////////////////// + +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + ushort ptr[16] = {0}; + v_store(ptr, a); + v_store(ptr + 8, b); + return v_uint8x16(vnsrl_wx_u8m1(vle16_v_u16m2(ptr, 16), 0, 16)); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + unsigned ptr[16] = {0}; + v_store(ptr, a); + v_store(ptr + 4, b); + v_store(ptr + 8, c); + v_store(ptr + 12, d); + return v_uint8x16(vnsrl_wx_u8m1(vnsrl_wx_u16m2(vle32_v_u32m4(ptr, 16), 0, 16), 0, 16)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + uint64 ptr[16] = {0}; + v_store(ptr, a); + v_store(ptr + 2, b); + v_store(ptr + 4, c); + v_store(ptr + 6, d); + v_store(ptr + 8, e); + v_store(ptr + 10, f); + v_store(ptr + 12, g); + v_store(ptr + 14, h); + return v_uint8x16(vnsrl_wx_u8m1(vnsrl_wx_u16m2(vnsrl_wx_u32m4(vle64_v_u64m8(ptr, 16), 0, 16), 0, 16), 0, 16)); +} + +////////////// Arithmetics ////////////// +#define OPENCV_HAL_IMPL_RVV_BIN_OP(bin_op, _Tpvec, intrin, vl) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a, b, vl)); \ +} \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a = _Tpvec(intrin(a, b, vl)); \ + return a; \ +} + +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_uint8x16, vsaddu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_uint8x16, vssubu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_uint8x16, vdivu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_int8x16, vsadd_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_int8x16, vssub_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_int8x16, vdiv_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_uint16x8, vsaddu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_uint16x8, vssubu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_uint16x8, vdivu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_int16x8, vsadd_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_int16x8, vssub_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_int16x8, vdiv_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_uint32x4, vadd_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_uint32x4, vsub_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_uint32x4, vmul_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_uint32x4, vdivu_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_int32x4, vadd_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_int32x4, vsub_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_int32x4, vmul_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_int32x4, vdiv_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_float32x4, vfadd_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_float32x4, vfsub_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_float32x4, vfmul_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_float32x4, vfdiv_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_uint64x2, vadd_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_uint64x2, vsub_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_uint64x2, vmul_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_uint64x2, vdivu_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_int64x2, vadd_vv_i64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_int64x2, vsub_vv_i64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_int64x2, vmul_vv_i64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_int64x2, vdiv_vv_i64m1, 2) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_BIN_OP(+, v_float64x2, vfadd_vv_f64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(-, v_float64x2, vfsub_vv_f64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(*, v_float64x2, vfmul_vv_f64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_OP(/, v_float64x2, vfdiv_vv_f64m1, 2) +#endif + + +////////////// Bitwise logic ////////////// + +#define OPENCV_HAL_IMPL_RVV_LOGIC_OP(_Tpvec, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_BIN_OP(&, _Tpvec, vand_vv_##suffix##m1, vl) \ +OPENCV_HAL_IMPL_RVV_BIN_OP(|, _Tpvec, vor_vv_##suffix##m1, vl) \ +OPENCV_HAL_IMPL_RVV_BIN_OP(^, _Tpvec, vxor_vv_##suffix##m1, vl) \ +inline _Tpvec operator ~ (const _Tpvec& a) \ +{ \ + return _Tpvec(vnot_v_##suffix##m1(a, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint8x16, u8, 16) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int8x16, i8, 16) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint16x8, u16, 8) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int16x8, i16, 8) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint32x4, u32, 4) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int32x4, i32, 4) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint64x2, u64, 2) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int64x2, i64, 2) + +#define OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(bin_op, intrin) \ +inline v_float32x4 operator bin_op (const v_float32x4& a, const v_float32x4& b) \ +{ \ + return v_float32x4(vreinterpret_v_i32m1_f32m1(intrin(vreinterpret_v_f32m1_i32m1(a), vreinterpret_v_f32m1_i32m1(b), 4))); \ +} \ +inline v_float32x4& operator bin_op##= (v_float32x4& a, const v_float32x4& b) \ +{ \ + a = v_float32x4(vreinterpret_v_i32m1_f32m1(intrin(vreinterpret_v_f32m1_i32m1(a), vreinterpret_v_f32m1_i32m1(b), 4))); \ + return a; \ +} + +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(&, vand_vv_i32m1) +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(|, vor_vv_i32m1) +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(^, vxor_vv_i32m1) + +inline v_float32x4 operator ~ (const v_float32x4& a) +{ + return v_float32x4(vreinterpret_v_i32m1_f32m1(vnot_v_i32m1(vreinterpret_v_f32m1_i32m1(a), 4))); +} + +#if CV_SIMD128_64F +#define OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(bin_op, intrin) \ +inline v_float64x2 operator bin_op (const v_float64x2& a, const v_float64x2& b) \ +{ \ + return v_float64x2(vreinterpret_v_i64m1_f64m1(intrin(vreinterpret_v_f64m1_i64m1(a), vreinterpret_v_f64m1_i64m1(b), 2))); \ +} \ +inline v_float64x2& operator bin_op##= (v_float64x2& a, const v_float64x2& b) \ +{ \ + a = v_float64x2(vreinterpret_v_i64m1_f64m1(intrin(vreinterpret_v_f64m1_i64m1(a), vreinterpret_v_f64m1_i64m1(b), 2))); \ + return a; \ +} + +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(&, vand_vv_i64m1) +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(|, vor_vv_i64m1) +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(^, vxor_vv_i64m1) + +inline v_float64x2 operator ~ (const v_float64x2& a) +{ + return v_float64x2(vreinterpret_v_i64m1_f64m1(vnot_v_i64m1(vreinterpret_v_f64m1_i64m1(a), 2))); +} +#endif + +////////////// Bitwise shifts ////////////// + +#define OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(_Tpvec, suffix, vl) \ +inline _Tpvec operator << (const _Tpvec& a, int n) \ +{ \ + return _Tpvec(vsll_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +inline _Tpvec operator >> (const _Tpvec& a, int n) \ +{ \ + return _Tpvec(vsrl_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ \ + return _Tpvec(vsll_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ \ + return _Tpvec(vsrl_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} + +#define OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(_Tpvec, suffix, vl) \ +inline _Tpvec operator << (const _Tpvec& a, int n) \ +{ \ + return _Tpvec(vsll_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +inline _Tpvec operator >> (const _Tpvec& a, int n) \ +{ \ + return _Tpvec(vsra_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ \ + return _Tpvec(vsll_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ \ + return _Tpvec(vsra_vx_##suffix##m1(a, uint8_t(n), vl)); \ +} + +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint8x16, u8, 16) +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint16x8, u16, 8) +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint32x4, u32, 4) +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint64x2, u64, 2) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int8x16, i8, 16) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int16x8, i16, 8) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int32x4, i32, 4) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int64x2, i64, 2) + + +////////////// Comparison ////////////// + +#define OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, op, intrin, suffix, vl) \ +inline _Tpvec operator op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + uint64_t ones = -1; \ + return _Tpvec(vmerge_vxm_##suffix##m1(intrin(a, b, vl), vmv_v_x_##suffix##m1(0, vl), ones, vl)); \ +} + +#define OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, op, intrin, suffix, vl) \ +inline _Tpvec operator op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + union { uint64 u; double d; } ones; ones.u = -1; \ + return _Tpvec(vfmerge_vfm_##suffix##m1(intrin(a, b, vl), vfmv_v_f_##suffix##m1(0, vl), ones.d, vl)); \ +} + +#define OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(_Tpvec, suffix, width, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ==, vmseq_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, !=, vmsne_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, <, vmsltu_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, >, vmsgtu_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, <=, vmsleu_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, >=, vmsgeu_vv_##suffix##m1_b##width, suffix, vl) + +#define OPENCV_HAL_IMPL_RVV_SIGNED_CMP(_Tpvec, suffix, width, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ==, vmseq_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, !=, vmsne_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, <, vmslt_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, >, vmsgt_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, <=, vmsle_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, >=, vmsge_vv_##suffix##m1_b##width, suffix, vl) + +#define OPENCV_HAL_IMPL_RVV_FLOAT_CMP(_Tpvec, suffix, width, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, ==, vmfeq_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, !=, vmfne_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, <, vmflt_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, >, vmfgt_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, <=, vmfle_vv_##suffix##m1_b##width, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, >=, vmfge_vv_##suffix##m1_b##width, suffix, vl) + + +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint8x16, u8, 8, 16) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint16x8, u16, 16, 8) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint32x4, u32, 32, 4) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint64x2, u64, 64, 2) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int8x16, i8, 8, 16) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int16x8, i16, 16, 8) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int32x4, i32, 32, 4) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int64x2, i64, 64, 2) +OPENCV_HAL_IMPL_RVV_FLOAT_CMP(v_float32x4, f32, 32, 4) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_FLOAT_CMP(v_float64x2, f64, 64, 2) +#endif + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return a == a; } + +#if CV_SIMD128_64F +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return a == a; } +#endif + +////////////// Min/Max ////////////// + +#define OPENCV_HAL_IMPL_RVV_BIN_FUNC(_Tpvec, func, intrin, vl) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a, b, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8x16, v_min, vminu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8x16, v_max, vmaxu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8x16, v_min, vmin_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8x16, v_max, vmax_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16x8, v_min, vminu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16x8, v_max, vmaxu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16x8, v_min, vmin_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16x8, v_max, vmax_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint32x4, v_min, vminu_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint32x4, v_max, vmaxu_vv_u32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int32x4, v_min, vmin_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int32x4, v_max, vmax_vv_i32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float32x4, v_min, vfmin_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float32x4, v_max, vfmax_vv_f32m1, 4) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint64x2, v_min, vminu_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint64x2, v_max, vmaxu_vv_u64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int64x2, v_min, vmin_vv_i64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int64x2, v_max, vmax_vv_i64m1, 2) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float64x2, v_min, vfmin_vv_f64m1, 2) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float64x2, v_max, vfmax_vv_f64m1, 2) +#endif + +////////////// Arithmetics wrap ////////////// + +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8x16, v_add_wrap, vadd_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8x16, v_add_wrap, vadd_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16x8, v_add_wrap, vadd_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16x8, v_add_wrap, vadd_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8x16, v_sub_wrap, vsub_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8x16, v_sub_wrap, vsub_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16x8, v_sub_wrap, vsub_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16x8, v_sub_wrap, vsub_vv_i16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8x16, v_mul_wrap, vmul_vv_u8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8x16, v_mul_wrap, vmul_vv_i8m1, 16) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16x8, v_mul_wrap, vmul_vv_u16m1, 8) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16x8, v_mul_wrap, vmul_vv_i16m1, 8) + +////////////// Reduce ////////////// + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SUM(_Tpvec, _wTpvec, _nwTpvec, scalartype, suffix, wsuffix, vl, red) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + _nwTpvec zero = vmv_v_x_##wsuffix##m1(0, vl); \ + _nwTpvec res = vmv_v_x_##wsuffix##m1(0, vl); \ + res = v##red##_vs_##suffix##m1_##wsuffix##m1(res, a, zero, vl); \ + return (scalartype)(_wTpvec(res).get0()); \ +} + +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint8x16, v_uint16x8, vuint16m1_t, unsigned, u8, u16, 16, wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int8x16, v_int16x8, vint16m1_t, int, i8, i16, 16, wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint16x8, v_uint32x4, vuint32m1_t, unsigned, u16, u32, 8, wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int16x8, v_int32x4, vint32m1_t, int, i16, i32, 8, wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint32x4, v_uint64x2, vuint64m1_t, unsigned, u32, u64, 4, wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int32x4, v_int64x2, vint64m1_t, int, i32, i64, 4, wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint64x2, v_uint64x2, vuint64m1_t, uint64, u64, u64, 2, redsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int64x2, v_int64x2, vint64m1_t, int64, i64, i64, 2, redsum) + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(_Tpvec, _wTpvec, _nwTpvec, scalartype, suffix, wsuffix, vl, red) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + _nwTpvec zero = vfmv_v_f_##wsuffix##m1(0, vl); \ + _nwTpvec res = vfmv_v_f_##wsuffix##m1(0, vl); \ + res = v##red##_vs_##suffix##m1_##wsuffix##m1(res, a, zero, vl); \ + return (scalartype)(_wTpvec(res).get0()); \ +} + +// vfredsum for float has renamed to fredosum, also updated in GNU. +OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(v_float32x4, v_float32x4, vfloat32m1_t, float, f32, f32, 4, fredosum) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(v_float64x2, v_float64x2, vfloat64m1_t, double, f64, f64, 2, fredosum) +#endif + + +#define OPENCV_HAL_IMPL_RVV_REDUCE(_Tpvec, func, scalartype, suffix, vl, red) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpvec res = _Tpvec(v##red##_vs_##suffix##m1_##suffix##m1(a, a, a, vl)); \ + return scalartype(res.get0()); \ +} + +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint8x16, min, uchar, u8, 16, redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int8x16, min, schar, i8, 16, redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint16x8, min, ushort, u16, 8, redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int16x8, min, short, i16, 8, redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint32x4, min, unsigned, u32, 4, redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int32x4, min, int, i32, 4, redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_float32x4, min, float, f32, 4, fredmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint8x16, max, uchar, u8, 16, redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int8x16, max, schar, i8, 16, redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint16x8, max, ushort, u16, 8, redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int16x8, max, short, i16, 8, redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint32x4, max, unsigned, u32, 4, redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int32x4, max, int, i32, 4, redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_float32x4, max, float, f32, 4, fredmax) + + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + float elems[4] = + { + v_reduce_sum(a), + v_reduce_sum(b), + v_reduce_sum(c), + v_reduce_sum(d) + }; + return v_float32x4(vle32_v_f32m1(elems, 4)); +} + +////////////// Square-Root ////////////// + +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ + return v_float32x4(vfsqrt_v_f32m1(x, 4)); +} + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + v_float32x4 one = v_setall_f32(1.0f); + return one / v_sqrt(x); +} + +#if CV_SIMD128_64F +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ + return v_float64x2(vfsqrt_v_f64m1(x, 4)); +} + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + v_float64x2 one = v_setall_f64(1.0f); + return one / v_sqrt(x); +} +#endif + +inline v_float32x4 v_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + v_float32x4 x(vfmacc_vv_f32m1(vfmul_vv_f32m1(a, a, 4), b, b, 4)); + return v_sqrt(x); +} + +inline v_float32x4 v_sqr_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4(vfmacc_vv_f32m1(vfmul_vv_f32m1(a, a, 4), b, b, 4)); +} + +#if CV_SIMD128_64F +inline v_float64x2 v_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + v_float64x2 x(vfmacc_vv_f64m1(vfmul_vv_f64m1(a, a, 2), b, b, 2)); + return v_sqrt(x); +} + +inline v_float64x2 v_sqr_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2(vfmacc_vv_f64m1(vfmul_vv_f64m1(a, a, 2), b, b, 2)); +} +#endif + +////////////// Multiply-Add ////////////// + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_float32x4(vfmacc_vv_f32m1(c, a, b, 4)); +} +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_int32x4(vmacc_vv_i32m1(c, a, b, 4)); +} + +inline v_float32x4 v_muladd(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +#if CV_SIMD128_64F +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_float64x2(vfmacc_vv_f64m1(c, a, b, 2)); +} + +inline v_float64x2 v_muladd(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_fma(a, b, c); +} +#endif + +////////////// Check all/any ////////////// + +// use overloaded vcpop in clang, no casting like (vuint64m1_t) is needed. +#ifndef __clang__ +#define OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(_Tpvec, suffix, shift, vl) \ +inline bool v_check_all(const _Tpvec& a) \ +{ \ + auto v0 = vsrl_vx_##suffix##m1(vnot_v_##suffix##m1(a, vl), shift, vl); \ + v_uint32x4 v = v_uint32x4(v_reinterpret_as_u32(_Tpvec(v0))); \ + return (v.val[0] | v.val[1] | v.val[2] | v.val[3]) == 0; \ +} \ +inline bool v_check_any(const _Tpvec& a) \ +{ \ + auto v0 = vsrl_vx_##suffix##m1(a, shift, vl); \ + v_uint32x4 v = v_uint32x4(v_reinterpret_as_u32(_Tpvec(v0))); \ + return (v.val[0] | v.val[1] | v.val[2] | v.val[3]) != 0; \ +} + +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_uint8x16, u8, 7, 16) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_uint16x8, u16, 15, 8) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_uint32x4, u32, 31, 4) +//OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_uint64x2, u64, 63, 2) +inline bool v_check_all(const v_uint64x2& a) +{ + v_uint64x2 v = v_uint64x2(vsrl_vx_u64m1(vnot_v_u64m1(a, 2), 63, 2)); + return (v.val[0] | v.val[1]) == 0; +} +inline bool v_check_any(const v_uint64x2& a) +{ + v_uint64x2 v = v_uint64x2(vsrl_vx_u64m1(a, 63, 2)); + return (v.val[0] | v.val[1]) != 0; +} + +inline bool v_check_all(const v_int8x16& a) +{ return v_check_all(v_reinterpret_as_u8(a)); } +inline bool v_check_any(const v_int8x16& a) +{ return v_check_any(v_reinterpret_as_u8(a)); } + +inline bool v_check_all(const v_int16x8& a) +{ return v_check_all(v_reinterpret_as_u16(a)); } +inline bool v_check_any(const v_int16x8& a) +{ return v_check_any(v_reinterpret_as_u16(a)); } + +inline bool v_check_all(const v_int32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_int32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } + +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } + +inline bool v_check_all(const v_int64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_int64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } + +#if CV_SIMD128_64F +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } +#endif +#else +#define OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(_Tpvec, vl) \ +inline bool v_check_all(const _Tpvec& a) \ +{ \ + return vcpop(vmslt(a, 0, vl), vl) == vl; \ +} \ +inline bool v_check_any(const _Tpvec& a) \ +{ \ + return vcpop(vmslt(a, 0, vl), vl) != 0; \ +} + +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int8x16, 16) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int16x8, 8) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int32x4, 4) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int64x2, 2) + + +inline bool v_check_all(const v_uint8x16& a) +{ return v_check_all(v_reinterpret_as_s8(a)); } +inline bool v_check_any(const v_uint8x16& a) +{ return v_check_any(v_reinterpret_as_s8(a)); } + +inline bool v_check_all(const v_uint16x8& a) +{ return v_check_all(v_reinterpret_as_s16(a)); } +inline bool v_check_any(const v_uint16x8& a) +{ return v_check_any(v_reinterpret_as_s16(a)); } + +inline bool v_check_all(const v_uint32x4& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_uint32x4& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } + +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } + +inline bool v_check_all(const v_uint64x2& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_uint64x2& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } + +#if CV_SIMD128_64F +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } +#endif +#endif +////////////// abs ////////////// + +#define OPENCV_HAL_IMPL_RVV_ABSDIFF(_Tpvec, abs) \ +inline _Tpvec v_##abs(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return v_max(a, b) - v_min(a, b); \ +} + +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint8x16, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint16x8, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint32x4, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_float32x4, absdiff) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_float64x2, absdiff) +#endif +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_int8x16, absdiffs) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_int16x8, absdiffs) + +#define OPENCV_HAL_IMPL_RVV_ABSDIFF_S(ivec, uvec, itype, utype, isuf, usuf, vlen) \ +inline uvec v_absdiff(const ivec& a, const ivec& b) \ +{ \ + itype max = vmax_vv_##isuf(a, b, vlen); \ + itype min = vmin_vv_##isuf(a, b, vlen); \ + return uvec(vreinterpret_v_##isuf##_##usuf(vsub_vv_##isuf(max, min, vlen))); \ +} + +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int8x16, v_uint8x16, vint8m1_t, vuint8m1_t, i8m1, u8m1, 16) +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int16x8, v_uint16x8, vint16m1_t, vuint16m1_t, i16m1, u16m1, 8) +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int32x4, v_uint32x4, vint32m1_t, vuint32m1_t, i32m1, u32m1, 4) + +#define OPENCV_HAL_IMPL_RVV_ABS(_Tprvec, _Tpvec, suffix) \ +inline _Tprvec v_abs(const _Tpvec& a) \ +{ \ + return v_absdiff(a, v_setzero_##suffix()); \ +} + +OPENCV_HAL_IMPL_RVV_ABS(v_uint8x16, v_int8x16, s8) +OPENCV_HAL_IMPL_RVV_ABS(v_uint16x8, v_int16x8, s16) +OPENCV_HAL_IMPL_RVV_ABS(v_uint32x4, v_int32x4, s32) +OPENCV_HAL_IMPL_RVV_ABS(v_float32x4, v_float32x4, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_ABS(v_float64x2, v_float64x2, f64) +#endif + + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SAD(_Tpvec, scalartype) \ +inline scalartype v_reduce_sad(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return v_reduce_sum(v_absdiff(a, b)); \ +} + +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint8x16, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int8x16, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint16x8, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int16x8, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint32x4, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int32x4, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_float32x4, float) + +////////////// Select ////////////// + +#define OPENCV_HAL_IMPL_RVV_SELECT(_Tpvec, merge, ne, vl) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(merge(ne(mask, 0, vl), b, a, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_SELECT(v_uint8x16, vmerge_vvm_u8m1, vmsne_vx_u8m1_b8, 16) +OPENCV_HAL_IMPL_RVV_SELECT(v_int8x16, vmerge_vvm_i8m1, vmsne_vx_i8m1_b8, 16) +OPENCV_HAL_IMPL_RVV_SELECT(v_uint16x8, vmerge_vvm_u16m1, vmsne_vx_u16m1_b16, 8) +OPENCV_HAL_IMPL_RVV_SELECT(v_int16x8, vmerge_vvm_i16m1, vmsne_vx_i16m1_b16, 8) +OPENCV_HAL_IMPL_RVV_SELECT(v_uint32x4, vmerge_vvm_u32m1, vmsne_vx_u32m1_b32, 4) +OPENCV_HAL_IMPL_RVV_SELECT(v_int32x4, vmerge_vvm_i32m1, vmsne_vx_i32m1_b32, 4) +OPENCV_HAL_IMPL_RVV_SELECT(v_float32x4, vmerge_vvm_f32m1, vmfne_vf_f32m1_b32, 4) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_SELECT(v_float64x2, vmerge_vvm_f64m1, vmfne_vf_f64m1_b64, 2) +#endif + +////////////// Rotate shift ////////////// + +#define OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(_Tpvec, suffix, vl) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return _Tpvec(vslidedown_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), a, n, vl)); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), a, n, vl)); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), a, n, vl), b, _Tpvec::nlanes - n, vl)); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vmv_v_x_##suffix##m1(0, vl), b, _Tpvec::nlanes - n, vl), a, n, vl)); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ CV_UNUSED(b); return a; } + +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint8x16, u8, 16) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int8x16, i8, 16) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint16x8, u16, 8) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int16x8, i16, 8) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint32x4, u32, 4) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int32x4, i32, 4) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint64x2, u64, 2) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int64x2, i64, 2) + +#define OPENCV_HAL_IMPL_RVV_ROTATE_FP(_Tpvec, suffix, vl) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return _Tpvec(vslidedown_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), a, n, vl)); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), a, n, vl)); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), a, n, vl), b, _Tpvec::nlanes - n, vl)); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vslideup_vx_##suffix##m1(vslidedown_vx_##suffix##m1(vfmv_v_f_##suffix##m1(0, vl), b, _Tpvec::nlanes - n, vl), a, n, vl)); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ CV_UNUSED(b); return a; } + +OPENCV_HAL_IMPL_RVV_ROTATE_FP(v_float32x4, f32, 4) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_ROTATE_FP(v_float64x2, f64, 2) +#endif + +////////////// Convert to float ////////////// + +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(vfcvt_f_x_v_f32m1(a, 4)); +} + +#if CV_SIMD128_64F +#ifndef __clang__ +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + double arr[4] = {a.val[0], a.val[1], 0, 0}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_float32x4(vfncvt_f_f_w_f32m1(tmp, 4)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + double arr[4] = {a.val[0], a.val[1], b.val[0], b.val[1]}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_float32x4(vfncvt_f_f_w_f32m1(tmp, 4)); +} +#else +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + vfloat64m2_t zero = vfmv_v_f_f64m2(0, 4); + return v_float32x4(vfncvt_f_f_w_f32m1(vset_v_f64m1_f64m2(zero, 0, a), 4)); +} +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + vfloat64m2_t dst = vlmul_ext_v_f64m1_f64m2(a); + return v_float32x4(vfncvt_f_f_w_f32m1(vset_v_f64m1_f64m2(dst, 1, b), 4)); +} +#endif + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ + double ptr[4] = {0}; + vse64_v_f64m2(ptr, vfwcvt_f_x_v_f64m2(a, 4), 4); + double elems[2] = + { + ptr[0], ptr[1] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ + double ptr[4] = {0}; + vse64_v_f64m2(ptr, vfwcvt_f_x_v_f64m2(a, 4), 4); + double elems[2] = + { + ptr[2], ptr[3] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + double ptr[4] = {0}; + vse64_v_f64m2(ptr, vfwcvt_f_f_v_f64m2(a, 4), 4); + double elems[2] = + { + ptr[0], ptr[1] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + double ptr[4] = {0}; + vse64_v_f64m2(ptr, vfwcvt_f_f_v_f64m2(a, 4), 4); + double elems[2] = + { + ptr[2], ptr[3] + }; + return v_float64x2(vle64_v_f64m1(elems, 2)); +} + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ + return v_float64x2(vfcvt_f_x_v_f64m1(a, 2)); +} +#endif + +////////////// Broadcast ////////////// + +#define OPENCV_HAL_IMPL_RVV_BROADCAST(_Tpvec, suffix) \ +template inline _Tpvec v_broadcast_element(_Tpvec v) \ +{ \ + return v_setall_##suffix(v_extract_n(v)); \ +} + +OPENCV_HAL_IMPL_RVV_BROADCAST(v_uint8x16, u8) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_int8x16, s8) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_uint16x8, u16) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_int16x8, s16) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_uint32x4, u32) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_int32x4, s32) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_uint64x2, u64) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_int64x2, s64) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_float32x4, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_BROADCAST(v_float64x2, f64) +#endif + +////////////// Transpose4x4 ////////////// + +#define OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(_Tpvec, _Tp, suffix) \ +inline void v_transpose4x4(const v_##_Tpvec& a0, const v_##_Tpvec& a1, \ + const v_##_Tpvec& a2, const v_##_Tpvec& a3, \ + v_##_Tpvec& b0, v_##_Tpvec& b1, \ + v_##_Tpvec& b2, v_##_Tpvec& b3) \ +{ \ + _Tp elems0[4] = \ + { \ + v_extract_n<0>(a0), \ + v_extract_n<0>(a1), \ + v_extract_n<0>(a2), \ + v_extract_n<0>(a3) \ + }; \ + b0 = v_load(elems0); \ + _Tp elems1[4] = \ + { \ + v_extract_n<1>(a0), \ + v_extract_n<1>(a1), \ + v_extract_n<1>(a2), \ + v_extract_n<1>(a3) \ + }; \ + b1 = v_load(elems1); \ + _Tp elems2[4] = \ + { \ + v_extract_n<2>(a0), \ + v_extract_n<2>(a1), \ + v_extract_n<2>(a2), \ + v_extract_n<2>(a3) \ + }; \ + b2 = v_load(elems2); \ + _Tp elems3[4] = \ + { \ + v_extract_n<3>(a0), \ + v_extract_n<3>(a1), \ + v_extract_n<3>(a2), \ + v_extract_n<3>(a3) \ + }; \ + b3 = v_load(elems3); \ +} + +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(int32x4, int, i32) +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(float32x4, float, f32) + +////////////// Reverse ////////////// + +#define OPENCV_HAL_IMPL_RVV_REVERSE(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_reverse(const _Tpvec& a) \ +{ \ + _Tp ptr[_Tpvec::nlanes] = {0}; \ + _Tp ptra[_Tpvec::nlanes] = {0}; \ + v_store(ptra, a); \ + for (int i = 0; i < _Tpvec::nlanes; i++) \ + { \ + ptr[i] = ptra[_Tpvec::nlanes-i-1]; \ + } \ + return v_load(ptr); \ +} + +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int8x16, schar, i8) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int16x8, short, i16) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int32x4, int, i32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_float32x4, float, f32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int64x2, int64, i64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_REVERSE(v_float64x2, double, f64) +#endif + +//////////// Value reordering //////////// + +#define OPENCV_HAL_IMPL_RVV_EXPAND(_Tpwvec, _Tp, _Tpvec, width, suffix, wcvt, vl) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + _Tp lptr[_Tpvec::nlanes/2] = {0}; \ + _Tp hptr[_Tpvec::nlanes/2] = {0}; \ + v_store_low(lptr, a); \ + v_store_high(hptr, a); \ + b0 = _Tpwvec(wcvt(vle##width##_v_##suffix##mf2(lptr, vl), vl)); \ + b1 = _Tpwvec(wcvt(vle##width##_v_##suffix##mf2(hptr, vl), vl)); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + _Tp lptr[_Tpvec::nlanes/2] = {0}; \ + v_store_low(lptr, a); \ + return _Tpwvec(wcvt(vle##width##_v_##suffix##mf2(lptr, vl), vl)); \ +} \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + _Tp hptr[_Tpvec::nlanes/2] = {0}; \ + v_store_high(hptr, a); \ + return _Tpwvec(wcvt(vle##width##_v_##suffix##mf2(hptr, vl), vl)); \ +} \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + return _Tpwvec(wcvt(vle##width##_v_##suffix##mf2(ptr, vl), vl)); \ +} + +OPENCV_HAL_IMPL_RVV_EXPAND(v_uint16x8, uchar, v_uint8x16, 8, u8, vwcvtu_x_x_v_u16m1, 8) +OPENCV_HAL_IMPL_RVV_EXPAND(v_int16x8, schar, v_int8x16, 8, i8, vwcvt_x_x_v_i16m1, 8) +OPENCV_HAL_IMPL_RVV_EXPAND(v_uint32x4, ushort, v_uint16x8, 16, u16, vwcvtu_x_x_v_u32m1, 4) +OPENCV_HAL_IMPL_RVV_EXPAND(v_int32x4, short, v_int16x8, 16, i16, vwcvt_x_x_v_i32m1, 4) +OPENCV_HAL_IMPL_RVV_EXPAND(v_uint64x2, uint, v_uint32x4, 32, u32, vwcvtu_x_x_v_u64m1, 2) +OPENCV_HAL_IMPL_RVV_EXPAND(v_int64x2, int, v_int32x4, 32, i32, vwcvt_x_x_v_i64m1, 2) + +inline v_uint32x4 v_load_expand_q(const uchar* ptr) +{ + return v_uint32x4(vwcvtu_x_x_v_u32m1(vwcvtu_x_x_v_u16mf2(vle8_v_u8mf4(ptr, 4), 4), 4)); +} + +inline v_int32x4 v_load_expand_q(const schar* ptr) +{ + return v_int32x4(vwcvt_x_x_v_i32m1(vwcvt_x_x_v_i16mf2(vle8_v_i8mf4(ptr, 4), 4), 4)); +} + + +#define OPENCV_HAL_IMPL_RVV_PACK(_Tpvec, _Tp, _wTpvec, _wTp, hwidth, width, hsuffix, suffix, rshr, shr, hvl, vl) \ +inline _Tpvec v_pack(const _wTpvec& a, const _wTpvec& b) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, b); \ + return _Tpvec(shr(vle##width##_v_##suffix##m2(arr, vl), 0, vl)); \ +} \ +inline void v_pack_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, _wTpvec(vmv_v_x_##suffix##m1(0, hvl))); \ + vse##hwidth##_v_##hsuffix##m1(ptr, shr(vle##width##_v_##suffix##m2(arr, vl), 0, vl), hvl); \ +} \ +template inline \ +_Tpvec v_rshr_pack(const _wTpvec& a, const _wTpvec& b) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, b); \ + return _Tpvec(rshr(vle##width##_v_##suffix##m2(arr, vl), n, vl)); \ +} \ +template inline \ +void v_rshr_pack_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, _wTpvec(vmv_v_x_##suffix##m1(0, hvl))); \ + vse##hwidth##_v_##hsuffix##m1(ptr, _Tpvec(rshr(vle##width##_v_##suffix##m2(arr, vl), n, vl)), hvl); \ +} + +OPENCV_HAL_IMPL_RVV_PACK(v_uint8x16, uchar, v_uint16x8, ushort, 8, 16, u8, u16, vnclipu_wx_u8m1, vnclipu_wx_u8m1, 8, 16) +OPENCV_HAL_IMPL_RVV_PACK(v_int8x16, schar, v_int16x8, short, 8, 16, i8, i16, vnclip_wx_i8m1, vnclip_wx_i8m1, 8, 16) +OPENCV_HAL_IMPL_RVV_PACK(v_uint16x8, ushort, v_uint32x4, unsigned, 16, 32, u16, u32, vnclipu_wx_u16m1, vnclipu_wx_u16m1, 4, 8) +OPENCV_HAL_IMPL_RVV_PACK(v_int16x8, short, v_int32x4, int, 16, 32, i16, i32, vnclip_wx_i16m1, vnclip_wx_i16m1, 4, 8) +OPENCV_HAL_IMPL_RVV_PACK(v_uint32x4, unsigned, v_uint64x2, uint64, 32, 64, u32, u64, vnclipu_wx_u32m1, vnsrl_wx_u32m1, 2, 4) +OPENCV_HAL_IMPL_RVV_PACK(v_int32x4, int, v_int64x2, int64, 32, 64, i32, i64, vnclip_wx_i32m1, vnsra_wx_i32m1, 2, 4) + + +#define OPENCV_HAL_IMPL_RVV_PACK_U(_Tpvec, _Tp, _wTpvec, _wTp, hwidth, width, hsuffix, suffix, rshr, cast, hvl, vl) \ +inline _Tpvec v_pack_u(const _wTpvec& a, const _wTpvec& b) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, b); \ + return _Tpvec(rshr(cast(vmax_vx_##suffix##m2(vle##width##_v_##suffix##m2(arr, vl), 0, vl)), 0, vl)); \ +} \ +inline void v_pack_u_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, _wTpvec(vmv_v_x_##suffix##m1(0, hvl))); \ + vse##hwidth##_v_##hsuffix##m1(ptr, rshr(cast(vmax_vx_##suffix##m2(vle##width##_v_##suffix##m2(arr, vl), 0, vl)), 0, vl), hvl); \ +} \ +template inline \ +_Tpvec v_rshr_pack_u(const _wTpvec& a, const _wTpvec& b) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, b); \ + return _Tpvec(rshr(cast(vmax_vx_##suffix##m2(vle##width##_v_##suffix##m2(arr, vl), 0, vl)), n, vl)); \ +} \ +template inline \ +void v_rshr_pack_u_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + _wTp arr[_Tpvec::nlanes] = {0}; \ + v_store(arr, a); \ + v_store(arr + _wTpvec::nlanes, _wTpvec(vmv_v_x_##suffix##m1(0, hvl))); \ + v_store(ptr, _Tpvec(rshr(cast(vmax_vx_##suffix##m2(vle##width##_v_##suffix##m2(arr, vl), 0, vl)), n, vl))); \ +} + +OPENCV_HAL_IMPL_RVV_PACK_U(v_uint8x16, uchar, v_int16x8, short, 8, 16, u8, i16, vnclipu_wx_u8m1, vreinterpret_v_i16m2_u16m2, 8, 16) +OPENCV_HAL_IMPL_RVV_PACK_U(v_uint16x8, ushort, v_int32x4, int, 16, 32, u16, i32, vnclipu_wx_u16m1, vreinterpret_v_i32m2_u32m2, 4, 8) + + +#define OPENCV_HAL_IMPL_RVV_UNPACKS(_Tpvec, _Tp, suffix) \ +inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \ +{ \ + _Tp ptra0[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptra1[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb0[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb1[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptra0, a0); \ + v_store(ptra1, a1); \ + int i; \ + for( i = 0; i < v_##_Tpvec::nlanes/2; i++ ) \ + { \ + ptrb0[i*2] = ptra0[i]; \ + ptrb0[i*2+1] = ptra1[i]; \ + } \ + for( ; i < v_##_Tpvec::nlanes; i++ ) \ + { \ + ptrb1[i*2-v_##_Tpvec::nlanes] = ptra0[i]; \ + ptrb1[i*2-v_##_Tpvec::nlanes+1] = ptra1[i]; \ + } \ + b0 = v_load(ptrb0); \ + b1 = v_load(ptrb1); \ +} \ +inline v_##_Tpvec v_combine_low(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + _Tp ptra[v_##_Tpvec::nlanes/2] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes/2] = {0}; \ + v_store_low(ptra, a); \ + v_store_low(ptrb, b); \ + return v_load_halves(ptra, ptrb); \ +} \ +inline v_##_Tpvec v_combine_high(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + _Tp ptra[v_##_Tpvec::nlanes/2] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes/2] = {0}; \ + v_store_high(ptra, a); \ + v_store_high(ptrb, b); \ + return v_load_halves(ptra, ptrb); \ +} \ +inline void v_recombine(const v_##_Tpvec& a, const v_##_Tpvec& b, v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + c = v_combine_low(a, b); \ + d = v_combine_high(a, b); \ +} + +OPENCV_HAL_IMPL_RVV_UNPACKS(uint8x16, uchar, u8) +OPENCV_HAL_IMPL_RVV_UNPACKS(int8x16, schar, i8) +OPENCV_HAL_IMPL_RVV_UNPACKS(uint16x8, ushort, u16) +OPENCV_HAL_IMPL_RVV_UNPACKS(int16x8, short, i16) +OPENCV_HAL_IMPL_RVV_UNPACKS(uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_RVV_UNPACKS(int32x4, int, i32) +OPENCV_HAL_IMPL_RVV_UNPACKS(float32x4, float, f32) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_UNPACKS(float64x2, double, f64) +#endif + + +#define OPENCV_HAL_IMPL_RVV_INTERLEAVED(_Tpvec, _Tp) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b) \ +{ \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + int i, i2; \ + for( i = i2 = 0; i < v_##_Tpvec::nlanes; i++, i2 += 2 ) \ + { \ + ptra[i] = ptr[i2]; \ + ptrb[i] = ptr[i2+1]; \ + } \ + a = v_load(ptra); \ + b = v_load(ptrb); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, v_##_Tpvec& c) \ +{ \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrc[v_##_Tpvec::nlanes] = {0}; \ + int i, i3; \ + for( i = i3 = 0; i < v_##_Tpvec::nlanes; i++, i3 += 3 ) \ + { \ + ptra[i] = ptr[i3]; \ + ptrb[i] = ptr[i3+1]; \ + ptrc[i] = ptr[i3+2]; \ + } \ + a = v_load(ptra); \ + b = v_load(ptrb); \ + c = v_load(ptrc); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, \ + v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrc[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrd[v_##_Tpvec::nlanes] = {0}; \ + int i, i4; \ + for( i = i4 = 0; i < v_##_Tpvec::nlanes; i++, i4 += 4 ) \ + { \ + ptra[i] = ptr[i4]; \ + ptrb[i] = ptr[i4+1]; \ + ptrc[i] = ptr[i4+2]; \ + ptrd[i] = ptr[i4+3]; \ + } \ + a = v_load(ptra); \ + b = v_load(ptrb); \ + c = v_load(ptrc); \ + d = v_load(ptrd); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + int i, i2; \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptra, a); \ + v_store(ptrb, b); \ + for( i = i2 = 0; i < v_##_Tpvec::nlanes; i++, i2 += 2 ) \ + { \ + ptr[i2] = ptra[i]; \ + ptr[i2+1] = ptrb[i]; \ + } \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + int i, i3; \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrc[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptra, a); \ + v_store(ptrb, b); \ + v_store(ptrc, c); \ + for( i = i3 = 0; i < v_##_Tpvec::nlanes; i++, i3 += 3 ) \ + { \ + ptr[i3] = ptra[i]; \ + ptr[i3+1] = ptrb[i]; \ + ptr[i3+2] = ptrc[i]; \ + } \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, const v_##_Tpvec& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + int i, i4; \ + _Tp ptra[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrb[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrc[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrd[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptra, a); \ + v_store(ptrb, b); \ + v_store(ptrc, c); \ + v_store(ptrd, d); \ + for( i = i4 = 0; i < v_##_Tpvec::nlanes; i++, i4 += 4 ) \ + { \ + ptr[i4] = ptra[i]; \ + ptr[i4+1] = ptrb[i]; \ + ptr[i4+2] = ptrc[i]; \ + ptr[i4+3] = ptrd[i]; \ + } \ +} \ +inline v_##_Tpvec v_interleave_pairs(const v_##_Tpvec& vec) \ +{ \ + _Tp ptr[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrvec[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptrvec, vec); \ + for (int i = 0; i < v_##_Tpvec::nlanes/4; i++) \ + { \ + ptr[4*i ] = ptrvec[4*i ]; \ + ptr[4*i+1] = ptrvec[4*i+2]; \ + ptr[4*i+2] = ptrvec[4*i+1]; \ + ptr[4*i+3] = ptrvec[4*i+3]; \ + } \ + return v_load(ptr); \ +} \ +inline v_##_Tpvec v_interleave_quads(const v_##_Tpvec& vec) \ +{ \ + _Tp ptr[v_##_Tpvec::nlanes] = {0}; \ + _Tp ptrvec[v_##_Tpvec::nlanes] = {0}; \ + v_store(ptrvec, vec); \ + for (int i = 0; i < v_##_Tpvec::nlanes/8; i++) \ + { \ + ptr[8*i ] = ptrvec[8*i ]; \ + ptr[8*i+1] = ptrvec[8*i+4]; \ + ptr[8*i+2] = ptrvec[8*i+1]; \ + ptr[8*i+3] = ptrvec[8*i+5]; \ + ptr[8*i+4] = ptrvec[8*i+2]; \ + ptr[8*i+5] = ptrvec[8*i+6]; \ + ptr[8*i+6] = ptrvec[8*i+3]; \ + ptr[8*i+7] = ptrvec[8*i+7]; \ + } \ + return v_load(ptr); \ +} + +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint8x16, uchar) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int8x16, schar) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint16x8, ushort) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int16x8, short) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint32x4, unsigned) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int32x4, int) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(float32x4, float) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint64x2, uint64) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int64x2, int64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_INTERLEAVED(float64x2, double) +#endif + +//////////// PopCount //////////// + +static const unsigned char popCountTable[] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; + +#define OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(_rTpvec, _Tpvec, _rTp, _Tp, suffix) \ +inline _rTpvec v_popcount(const _Tpvec& a) \ +{ \ + uchar ptra[16] = {0}; \ + v_store(ptra, v_reinterpret_as_u8(a)); \ + _rTp ptr[_Tpvec::nlanes] = {0}; \ + v_store(ptr, v_setzero_##suffix()); \ + for (int i = 0; i < _Tpvec::nlanes*(int)sizeof(_Tp); i++) \ + ptr[i/sizeof(_Tp)] += popCountTable[ptra[i]]; \ + return v_load(ptr); \ +} + +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint8x16, v_uint8x16, uchar, uchar, u8) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint8x16, v_int8x16, uchar, schar, u8) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint16x8, v_uint16x8, ushort, ushort, u16) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint16x8, v_int16x8, ushort, short, u16) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint32x4, v_uint32x4, unsigned, unsigned, u32) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint32x4, v_int32x4, unsigned, int, u32) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint64x2, v_uint64x2, uint64, uint64, u64) +OPENCV_HAL_IMPL_RVV_POPCOUNT_OP(v_uint64x2, v_int64x2, uint64, int64, u64) + +//////////// SignMask //////////// + +#ifndef __clang__ +#define OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(_Tpvec, _Tp, suffix, vl, shift) \ +inline int v_signmask(const _Tpvec& a) \ +{ \ + int mask = 0; \ + _Tpvec tmp = _Tpvec(vsrl_vx_##suffix##m1(a, shift, vl)); \ + for( int i = 0; i < _Tpvec::nlanes; i++ ) \ + mask |= (int)(tmp.val[i]) << i; \ + return mask; \ +} + +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_uint8x16, uchar, u8, 16, 7) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_uint16x8, ushort, u16, 8, 15) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_uint32x4, unsigned, u32, 4, 31) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_uint64x2, uint64, u64, 2, 63) + +inline int v_signmask(const v_int8x16& a) +{ return v_signmask(v_reinterpret_as_u8(a)); } +inline int v_signmask(const v_int16x8& a) +{ return v_signmask(v_reinterpret_as_u16(a)); } +inline int v_signmask(const v_int32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(v_reinterpret_as_u32(a)); } +inline int v_signmask(const v_int64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +#if CV_SIMD128_64F +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +#endif + +#else +#define OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(_Tpvec, width, vl) \ +inline int v_signmask(const _Tpvec& a) \ +{ \ + uint8_t ans[16] = {0};\ + vsm(ans, vmslt(a, 0, vl), vl);\ + return reinterpret_cast(ans)[0] & ((1 << (vl)) - 1);\ +} + +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int8x16, 8, 16) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int16x8, 16, 8) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int32x4, 32, 4) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int64x2, 64, 2) + +inline int v_signmask(const v_uint8x16& a) +{ return v_signmask(v_reinterpret_as_s8(a)); } +inline int v_signmask(const v_uint16x8& a) +{ return v_signmask(v_reinterpret_as_s16(a)); } +inline int v_signmask(const v_uint32x4& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_uint64x2& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } +#if CV_SIMD128_64F +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } +#endif + +#endif + +//////////// Scan forward //////////// + +#define OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(_Tpvec, _Tp, suffix) \ +inline int v_scan_forward(const _Tpvec& a) \ +{ \ + _Tp ptr[_Tpvec::nlanes] = {0}; \ + v_store(ptr, v_reinterpret_as_##suffix(a)); \ + for (int i = 0; i < _Tpvec::nlanes; i++) \ + if(int(ptr[i]) < 0) \ + return i; \ + return 0; \ +} + +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_int16x8, short, s16) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_int32x4, int, s32) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_float32x4, float, f32) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_int64x2, int64, s64) +#if CV_SIMD128_64F +OPENCV_HAL_IMPL_RVV_SCAN_FORWOARD_OP(v_float64x2, double, f64) +#endif + +//////////// Pack triplets //////////// + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + const uint64 ptr[2] = {0x0908060504020100, 0xFFFFFF0F0E0D0C0A}; + const v_uint64x2 flags(vle64_v_u64m1(ptr, 2)); + return v_reinterpret_as_s8(v_uint8x16( + vrgather_vv_u8m1( + v_reinterpret_as_u8(vec), + v_reinterpret_as_u8(flags), + 16))); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) +{ + return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); +} + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + const uint64 ptr[2] = {0x0908050403020100, 0xFFFF0F0E0D0C0B0A}; + const v_uint64x2 flags(vle64_v_u64m1(ptr, 2)); + return v_reinterpret_as_s16(v_uint8x16( + vrgather_vv_u8m1( + v_reinterpret_as_u8(vec), + v_reinterpret_as_u8(flags), + 16))); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) +{ + return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); +} + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +////// FP16 support /////// + +#if CV_FP16 +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + return v_float32x4(vfwcvt_f_f_v_f32m1(vle16_v_f16mf2(ptr, 4), 4)); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + vse16_v_f16mf2(ptr, vfncvt_f_f_w_f16mf2(v, 4), 4); +} +#else +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + const int N = 4; + float buf[N]; + for( int i = 0; i < N; i++ ) buf[i] = (float)ptr[i]; + return v_load(buf); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + const int N = 4; + float buf[N]; + v_store(buf, v); + for( int i = 0; i < N; i++ ) ptr[i] = float16_t(buf[i]); +} +#endif + +////////////// Rounding ////////////// + +inline v_int32x4 v_round(const v_float32x4& a) +{ + return v_int32x4(vfcvt_x_f_v_i32m1(a, 4)); +} + +inline v_int32x4 v_floor(const v_float32x4& a) +{ + v_float32x4 ZP5 = v_setall_f32(0.5f); + v_float32x4 t = a - ZP5; + return v_int32x4(vfcvt_x_f_v_i32m1(t, 4)); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + v_float32x4 ZP5 = v_setall_f32(0.5f); + v_float32x4 t = a + ZP5; + return v_int32x4(vfcvt_x_f_v_i32m1(t, 4)); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ +#ifndef CV_RVV_THEAD_0_7 + return v_int32x4(vfcvt_rtz_x_f_v_i32m1(a, 4)); +#else + const int old_round = fesetround(FE_TOWARDZERO); + vint32m1_t val = vfcvt_x_f_v_i32m1(a, 4); + fesetround(old_round); + return v_int32x4(val); +#endif +} +#if CV_SIMD128_64F +#ifndef __clang__ +inline v_int32x4 v_round(const v_float64x2& a) +{ + double arr[4] = {a.val[0], a.val[1], 0, 0}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_int32x4(vfncvt_x_f_w_i32m1(tmp, 4)); +} + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + double arr[4] = {a.val[0], a.val[1], b.val[0], b.val[1]}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_int32x4(vfncvt_x_f_w_i32m1(tmp, 4)); +} + +inline v_int32x4 v_floor(const v_float64x2& a) +{ + double arr[4] = {a.val[0]-0.5f, a.val[1]-0.5f, 0, 0}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_int32x4(vfncvt_x_f_w_i32m1(tmp, 4)); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + double arr[4] = {a.val[0]+0.5f, a.val[1]+0.5f, 0, 0}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); + return v_int32x4(vfncvt_x_f_w_i32m1(tmp, 4)); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ + double arr[4] = {a.val[0], a.val[1], 0, 0}; + vfloat64m2_t tmp = vle64_v_f64m2(arr, 4); +#ifndef CV_RVV_THEAD_0_7 + return v_int32x4(vfncvt_rtz_x_f_w_i32m1(tmp, 4)); +#else + const int old_round = fesetround(FE_TOWARDZERO); + vint32m1_t val = vfncvt_x_f_w_i32m1(tmp, 4); + fesetround(old_round); + return v_int32x4(val); +#endif +} + +#else +inline v_int32x4 v_round(const v_float64x2& a) +{ + vfloat64m2_t zero = vfmv_v_f_f64m2(0, 4); + return v_int32x4(vfncvt_x_f_w_i32m1(vset_v_f64m1_f64m2(zero, 0, a), 4)); +} + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + vfloat64m2_t dst = vlmul_ext_v_f64m1_f64m2(a); + return v_int32x4(vfncvt_x_f_w_i32m1(vset_v_f64m1_f64m2(dst, 1, b), 4)); +} + +inline v_int32x4 v_floor(const v_float64x2& a) +{ + vfloat64m2_t dst = vfmv_v_f_f64m2(0, 4); + dst = vset_v_f64m1_f64m2(dst, 0, a); + dst = vfsub_vf_f64m2(dst, 0.5, 2); + return v_int32x4(vfncvt_x_f_w_i32m1(dst, 4)); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + vfloat64m2_t dst = vfmv_v_f_f64m2(0, 4); + dst = vset_v_f64m1_f64m2(dst, 0, a); + dst = vfadd_vf_f64m2(dst, 0.5, 2); + return v_int32x4(vfncvt_x_f_w_i32m1(dst, 4)); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ + vfloat64m2_t zero = vfmv_v_f_f64m2(0, 4); + return v_int32x4(vfncvt_rtz_x_f_w_i32m1(vset_v_f64m1_f64m2(zero, 0, a), 4)); +} +#endif +#endif + + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ + int ptr[8] = {0}; + v_int32x4 t1, t2; + vse32_v_i32m2(ptr, vwmul_vv_i32m2(a, b, 8), 8); + v_load_deinterleave(ptr, t1, t2); + return t1 + t2; +} +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + int ptr[8] = {0}; + v_int32x4 t1, t2; + vse32_v_i32m2(ptr, vwmul_vv_i32m2(a, b, 8), 8); + v_load_deinterleave(ptr, t1, t2); + return t1 + t2 + c; +} + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + int64 ptr[4] = {0}; + v_int64x2 t1, t2; + vse64_v_i64m2(ptr, vwmul_vv_i64m2(a, b, 4), 4); + v_load_deinterleave(ptr, t1, t2); + return t1 + t2; +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + int64 ptr[4] = {0}; + v_int64x2 t1, t2; + vse64_v_i64m2(ptr, vwmul_vv_i64m2(a, b, 4), 4); + v_load_deinterleave(ptr, t1, t2); + return t1 + t2 + c; +} + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + unsigned ptr[16] = {0}; + v_uint32x4 t1, t2, t3, t4; + vse32_v_u32m4(ptr, vwcvtu_x_x_v_u32m4(vwmulu_vv_u16m2(a, b, 16), 16), 16); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4; +} +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, + const v_uint32x4& c) +{ + unsigned ptr[16] = {0}; + v_uint32x4 t1, t2, t3, t4; + vse32_v_u32m4(ptr, vwcvtu_x_x_v_u32m4(vwmulu_vv_u16m2(a, b, 16), 16), 16); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4 + c; +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + int ptr[16] = {0}; + v_int32x4 t1, t2, t3, t4; + vse32_v_i32m4(ptr, vwcvt_x_x_v_i32m4(vwmul_vv_i16m2(a, b, 16), 16), 16); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4; +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, + const v_int32x4& c) +{ + int ptr[16] = {0}; + v_int32x4 t1, t2, t3, t4; + vse32_v_i32m4(ptr, vwcvt_x_x_v_i32m4(vwmul_vv_i16m2(a, b, 16), 16), 16); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4 + c; +} + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + uint64 ptr[8] = {0}; + v_uint64x2 t1, t2, t3, t4; + vse64_v_u64m4(ptr, vwcvtu_x_x_v_u64m4(vwmulu_vv_u32m2(a, b, 8), 8), 8); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4; +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ + uint64 ptr[8] = {0}; + v_uint64x2 t1, t2, t3, t4; + vse64_v_u64m4(ptr, vwcvtu_x_x_v_u64m4(vwmulu_vv_u32m2(a, b, 8), 8), 8); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4 + c; +} + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + int64 ptr[8] = {0}; + v_int64x2 t1, t2, t3, t4; + vse64_v_i64m4(ptr, vwcvt_x_x_v_i64m4(vwmul_vv_i32m2(a, b, 8), 8), 8); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4; +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, + const v_int64x2& c) +{ + int64 ptr[8] = {0}; + v_int64x2 t1, t2, t3, t4; + vse64_v_i64m4(ptr, vwcvt_x_x_v_i64m4(vwmul_vv_i32m2(a, b, 8), 8), 8); + v_load_deinterleave(ptr, t1, t2, t3, t4); + return t1 + t2 + t3 + t4 + c; +} + +// 32 >> 64f +#if CV_SIMD128_64F +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, + const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } +#endif + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ + int ptr[8] = {0}; + vse32_v_i32m2(ptr, vwmul_vv_i32m2(a, b, 8), 8); + v_int32x4 t1 = v_load(ptr); + v_int32x4 t2 = v_load(ptr+4); + return t1 + t2; +} +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + int ptr[8] = {0}; + vse32_v_i32m2(ptr, vwmul_vv_i32m2(a, b, 8), 8); + v_int32x4 t1 = v_load(ptr); + v_int32x4 t2 = v_load(ptr+4); + return t1 + t2 + c; +} + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ + int64 ptr[4] = {0}; + vse64_v_i64m2(ptr, vwmul_vv_i64m2(a, b, 4), 4); + v_int64x2 t1 = v_load(ptr); + v_int64x2 t2 = v_load(ptr+2); + return t1 + t2; +} +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + int64 ptr[4] = {0}; + vse64_v_i64m2(ptr, vwmul_vv_i64m2(a, b, 4), 4); + v_int64x2 t1 = v_load(ptr); + v_int64x2 t2 = v_load(ptr+2); + return t1 + t2 + c; +} + + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ + unsigned ptr[16] = {0}; + vse32_v_u32m4(ptr, vwcvtu_x_x_v_u32m4(vwmulu_vv_u16m2(a, b, 16), 16), 16); + v_uint32x4 t1 = v_load(ptr); + v_uint32x4 t2 = v_load(ptr+4); + v_uint32x4 t3 = v_load(ptr+8); + v_uint32x4 t4 = v_load(ptr+12); + return t1 + t2 + t3 + t4; +} +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ + unsigned ptr[16] = {0}; + vse32_v_u32m4(ptr, vwcvtu_x_x_v_u32m4(vwmulu_vv_u16m2(a, b, 16), 16), 16); + v_uint32x4 t1 = v_load(ptr); + v_uint32x4 t2 = v_load(ptr+4); + v_uint32x4 t3 = v_load(ptr+8); + v_uint32x4 t4 = v_load(ptr+12); + return t1 + t2 + t3 + t4 + c; +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ + int ptr[16] = {0}; + vse32_v_i32m4(ptr, vwcvt_x_x_v_i32m4(vwmul_vv_i16m2(a, b, 16), 16), 16); + v_int32x4 t1 = v_load(ptr); + v_int32x4 t2 = v_load(ptr+4); + v_int32x4 t3 = v_load(ptr+8); + v_int32x4 t4 = v_load(ptr+12); + return t1 + t2 + t3 + t4; +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ + int ptr[16] = {0}; + vse32_v_i32m4(ptr, vwcvt_x_x_v_i32m4(vwmul_vv_i16m2(a, b, 16), 16), 16); + v_int32x4 t1 = v_load(ptr); + v_int32x4 t2 = v_load(ptr+4); + v_int32x4 t3 = v_load(ptr+8); + v_int32x4 t4 = v_load(ptr+12); + return t1 + t2 + t3 + t4 + c; +} + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ + uint64 ptr[8] = {0}; + vse64_v_u64m4(ptr, vwcvtu_x_x_v_u64m4(vwmulu_vv_u32m2(a, b, 8), 8), 8); + v_uint64x2 t1 = v_load(ptr); + v_uint64x2 t2 = v_load(ptr+2); + v_uint64x2 t3 = v_load(ptr+4); + v_uint64x2 t4 = v_load(ptr+6); + return t1 + t2 + t3 + t4; +} +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ + uint64 ptr[8] = {0}; + vse64_v_u64m4(ptr, vwcvtu_x_x_v_u64m4(vwmulu_vv_u32m2(a, b, 8), 8), 8); + v_uint64x2 t1 = v_load(ptr); + v_uint64x2 t2 = v_load(ptr+2); + v_uint64x2 t3 = v_load(ptr+4); + v_uint64x2 t4 = v_load(ptr+6); + return t1 + t2 + t3 + t4 + c; +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + int64 ptr[8] = {0}; + vse64_v_i64m4(ptr, vwcvt_x_x_v_i64m4(vwmul_vv_i32m2(a, b, 8), 8), 8); + v_int64x2 t1 = v_load(ptr); + v_int64x2 t2 = v_load(ptr+2); + v_int64x2 t3 = v_load(ptr+4); + v_int64x2 t4 = v_load(ptr+6); + return t1 + t2 + t3 + t4; +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ + int64 ptr[8] = {0}; + vse64_v_i64m4(ptr, vwcvt_x_x_v_i64m4(vwmul_vv_i32m2(a, b, 8), 8), 8); + v_int64x2 t1 = v_load(ptr); + v_int64x2 t2 = v_load(ptr+2); + v_int64x2 t3 = v_load(ptr+4); + v_int64x2 t4 = v_load(ptr+6); + return t1 + t2 + t3 + t4 + c; +} + +// 32 >> 64f +#if CV_SIMD128_64F +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod_fast(a, b)); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } +#endif + + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + vfloat32m1_t res = vfmul_vf_f32m1(m0, v_extract_n<0>(v), 4); + res = vfmacc_vf_f32m1(res, v_extract_n<1>(v), m1, 4); + res = vfmacc_vf_f32m1(res, v_extract_n<2>(v), m2, 4); + res = vfmacc_vf_f32m1(res, v_extract_n<3>(v), m3, 4); + return v_float32x4(res); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + vfloat32m1_t res = vfmul_vf_f32m1(m0, v_extract_n<0>(v), 4); + res = vfmacc_vf_f32m1(res, v_extract_n<1>(v), m1, 4); + res = vfmacc_vf_f32m1(res, v_extract_n<2>(v), m2, 4); + return v_float32x4(res) + a; +} + +#define OPENCV_HAL_IMPL_RVV_MUL_EXPAND(_Tpvec, _Tpwvec, _Tpw, suffix, wmul, width, vl, hvl) \ +inline void v_mul_expand(const _Tpvec& a, const _Tpvec& b, _Tpwvec& c, _Tpwvec& d) \ +{ \ + _Tpw ptr[_Tpwvec::nlanes*2] = {0}; \ + vse##width##_v_##suffix##m2(ptr, wmul(a, b, vl), vl); \ + c = _Tpwvec(vle##width##_v_##suffix##m1(ptr, hvl)); \ + d = _Tpwvec(vle##width##_v_##suffix##m1(ptr+_Tpwvec::nlanes, hvl)); \ +} + +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint8x16, v_uint16x8, ushort, u16, vwmulu_vv_u16m2, 16, 16, 8) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_int8x16, v_int16x8, short, i16, vwmul_vv_i16m2, 16, 16, 8) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint16x8, v_uint32x4, unsigned, u32, vwmulu_vv_u32m2, 32, 8, 4) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_int16x8, v_int32x4, int, i32, vwmul_vv_i32m2, 32, 8, 4) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint32x4, v_uint64x2, uint64, u64, vwmulu_vv_u64m2, 64, 4, 2) + + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ + return v_int16x8(vnsra_wx_i16m1(vwmul_vv_i32m2(a, b, 8), 16, 8)); +} +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ + return v_uint16x8(vnsrl_wx_u16m1(vwmulu_vv_u32m2(a, b, 8), 16, 8)); +} + + +//////// Saturating Multiply //////// + +#define OPENCV_HAL_IMPL_RVV_MUL_SAT(_Tpvec, _wTpvec) \ +inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ +{ \ + _wTpvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ +} \ +inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a = a * b; \ + return a; \ +} + +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_uint16x8, v_uint32x4) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_int16x8, v_int32x4) + + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + + +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv071.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv071.hpp new file mode 100644 index 0000000..9faefd9 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv071.hpp @@ -0,0 +1,2540 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +// Copyright (C) 2015, PingTouGe Semiconductor Co., Ltd., all rights reserved. + +#ifndef OPENCV_HAL_INTRIN_RISCVV_HPP +#define OPENCV_HAL_INTRIN_RISCVV_HPP + +#include +#include +#include "opencv2/core/utility.hpp" + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define CV_SIMD128 1 +#define CV_SIMD128_64F 0 +//////////// Types //////////// +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16 }; + + v_uint8x16() {} + explicit v_uint8x16(vuint8m1_t v) : val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = (vuint8m1_t)vle_v_u8m1((unsigned char*)v, 16); + } + uchar get0() const + { + return vmv_x_s_u8m1_u8(val, 16); + } + + vuint8m1_t val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(vint8m1_t v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = (vint8m1_t)vle_v_i8m1((schar*)v, 16); + } + schar get0() const + { + return vmv_x_s_i8m1_i8(val, 16); + } + + vint8m1_t val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(vuint16m1_t v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = (vuint16m1_t)vle_v_u16m1((unsigned short*)v, 8); + } + ushort get0() const + { + return vmv_x_s_u16m1_u16(val, 8); + } + + vuint16m1_t val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(vint16m1_t v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = (vint16m1_t)vle_v_i16m1((signed short*)v, 8); + } + short get0() const + { + return vmv_x_s_i16m1_i16(val, 8); + } + + vint16m1_t val; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(vuint32m1_t v) : val(v) {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + unsigned v[] = {v0, v1, v2, v3}; + val = (vuint32m1_t)vle_v_u32m1((unsigned int*)v, 4); + } + unsigned get0() const + { + return vmv_x_s_u32m1_u32(val, 4); + } + + vuint32m1_t val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(vint32m1_t v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + val = (vint32m1_t)vle_v_i32m1((signed int*)v, 4); + } + int get0() const + { + return vmv_x_s_i32m1_i32(val, 4); + } + vint32m1_t val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4 }; + + v_float32x4() {} + explicit v_float32x4(vfloat32m1_t v) : val(v) {} + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + val = (vfloat32m1_t)vle_v_f32m1((float*)v, 4); + } + float get0() const + { + return vfmv_f_s_f32m1_f32(val, 4); + } + vfloat32m1_t val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2 }; + + v_uint64x2() {} + explicit v_uint64x2(vuint64m1_t v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + val = (vuint64m1_t)vle_v_u64m1((unsigned long*)v, 2); + } + uint64 get0() const + { + return vmv_x_s_u64m1_u64(val, 2); + } + vuint64m1_t val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2 }; + + v_int64x2() {} + explicit v_int64x2(vint64m1_t v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + val = (vint64m1_t)vle_v_i64m1((long*)v, 2); + } + int64 get0() const + { + return vmv_x_s_i64m1_i64(val, 2); + } + vint64m1_t val; +}; + +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2 }; + + v_float64x2() {} + explicit v_float64x2(vfloat64m1_t v) : val(v) {} + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + val = (vfloat64m1_t)vle_v_f64m1((double*)v, 2); + } + double get0() const + { + return vfmv_f_s_f64m1_f64(val, 2); + } + vfloat64m1_t val; +}; + +#define OPENCV_HAL_IMPL_RISCVV_INIT(_Tpv, _Tp, suffix) \ +inline _Tp##m1_t vreinterpretq_##suffix##_##suffix(_Tp##m1_t v) { return v; } \ +inline v_uint8x16 v_reinterpret_as_u8(const v_##_Tpv& v) { return v_uint8x16((vuint8m1_t)(v.val)); } \ +inline v_int8x16 v_reinterpret_as_s8(const v_##_Tpv& v) { return v_int8x16((vint8m1_t)(v.val)); } \ +inline v_uint16x8 v_reinterpret_as_u16(const v_##_Tpv& v) { return v_uint16x8((vuint16m1_t)(v.val)); } \ +inline v_int16x8 v_reinterpret_as_s16(const v_##_Tpv& v) { return v_int16x8((vint16m1_t)(v.val)); } \ +inline v_uint32x4 v_reinterpret_as_u32(const v_##_Tpv& v) { return v_uint32x4((vuint32m1_t)(v.val)); } \ +inline v_int32x4 v_reinterpret_as_s32(const v_##_Tpv& v) { return v_int32x4((vint32m1_t)(v.val)); } \ +inline v_uint64x2 v_reinterpret_as_u64(const v_##_Tpv& v) { return v_uint64x2((vuint64m1_t)(v.val)); } \ +inline v_int64x2 v_reinterpret_as_s64(const v_##_Tpv& v) { return v_int64x2((vint64m1_t)(v.val)); } \ +inline v_float32x4 v_reinterpret_as_f32(const v_##_Tpv& v) { return v_float32x4((vfloat32m1_t)(v.val)); }\ +inline v_float64x2 v_reinterpret_as_f64(const v_##_Tpv& v) { return v_float64x2((vfloat64m1_t)(v.val)); } + + +OPENCV_HAL_IMPL_RISCVV_INIT(uint8x16, vuint8, u8) +OPENCV_HAL_IMPL_RISCVV_INIT(int8x16, vint8, s8) +OPENCV_HAL_IMPL_RISCVV_INIT(uint16x8, vuint16, u16) +OPENCV_HAL_IMPL_RISCVV_INIT(int16x8, vint16, s16) +OPENCV_HAL_IMPL_RISCVV_INIT(uint32x4, vuint32, u32) +OPENCV_HAL_IMPL_RISCVV_INIT(int32x4, vint32, s32) +OPENCV_HAL_IMPL_RISCVV_INIT(uint64x2, vuint64, u64) +OPENCV_HAL_IMPL_RISCVV_INIT(int64x2, vint64, s64) +OPENCV_HAL_IMPL_RISCVV_INIT(float64x2, vfloat64, f64) +OPENCV_HAL_IMPL_RISCVV_INIT(float32x4, vfloat32, f32) +#define OPENCV_HAL_IMPL_RISCVV_INIT_SET(__Tp, _Tp, suffix, len, num) \ +inline v_##_Tp##x##num v_setzero_##suffix() { return v_##_Tp##x##num((v##_Tp##m1_t){0}); } \ +inline v_##_Tp##x##num v_setall_##suffix(__Tp v) { return v_##_Tp##x##num(vmv_v_x_##len##m1(v, num)); } + +OPENCV_HAL_IMPL_RISCVV_INIT_SET(uchar, uint8, u8, u8, 16) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(char, int8, s8, i8, 16) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(ushort, uint16, u16, u16, 8) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(short, int16, s16, i16, 8) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(unsigned int, uint32, u32, u32, 4) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(int, int32, s32, i32, 4) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(unsigned long, uint64, u64, u64, 2) +OPENCV_HAL_IMPL_RISCVV_INIT_SET(long, int64, s64, i64, 2) +inline v_float32x4 v_setzero_f32() { return v_float32x4((vfloat32m1_t){0}); } +inline v_float32x4 v_setall_f32(float v) { return v_float32x4(vfmv_v_f_f32m1(v, 4)); } + +inline v_float64x2 v_setzero_f64() { return v_float64x2(vfmv_v_f_f64m1(0, 2)); } +inline v_float64x2 v_setall_f64(double v) { return v_float64x2(vfmv_v_f_f64m1(v, 2)); } + + +#define OPENCV_HAL_IMPL_RISCVV_BIN_OP(bin_op, _Tpvec, intrin) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a.val = intrin(a.val, b.val); \ + return a; \ +} + +#define OPENCV_HAL_IMPL_RISCVV_BIN_OPN(bin_op, _Tpvec, intrin, num) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val, num)); \ +} \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a.val = intrin(a.val, b.val, num); \ + return a; \ +} + +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_uint8x16, vsaddu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_uint8x16, vssubu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_int8x16, vsadd_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_int8x16, vssub_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_uint16x8, vsaddu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_uint16x8, vssubu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_int16x8, vsadd_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_int16x8, vssub_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_int32x4, vadd_vv_i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_int32x4, vsub_vv_i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(*, v_int32x4, vmul_vv_i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_uint32x4, vadd_vv_u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_uint32x4, vsub_vv_u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(*, v_uint32x4, vmul_vv_u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_int64x2, vadd_vv_i64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_int64x2, vsub_vv_i64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_uint64x2, vadd_vv_u64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_uint64x2, vsub_vv_u64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_float32x4, vfadd_vv_f32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_float32x4, vfsub_vv_f32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(*, v_float32x4, vfmul_vv_f32m1, 4) +inline v_float32x4 operator / (const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4(vfdiv_vv_f32m1(a.val, b.val, 4)); +} +inline v_float32x4& operator /= (v_float32x4& a, const v_float32x4& b) +{ + a.val = vfdiv_vv_f32m1(a.val, b.val, 4); + return a; +} + +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(+, v_float64x2, vfadd_vv_f64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(-, v_float64x2, vfsub_vv_f64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BIN_OPN(*, v_float64x2, vfmul_vv_f64m1, 2) +inline v_float64x2 operator / (const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2(vfdiv_vv_f64m1(a.val, b.val, 2)); +} +inline v_float64x2& operator /= (v_float64x2& a, const v_float64x2& b) +{ + a.val = vfdiv_vv_f64m1(a.val, b.val, 2); + return a; +} +// TODO: exp, log, sin, cos + +#define OPENCV_HAL_IMPL_RISCVV_BIN_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +#define OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(_Tpvec, func, intrin, num) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val, num)); \ +} +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint8x16, v_min, vminu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint8x16, v_max, vmaxu_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int8x16, v_min, vmin_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int8x16, v_max, vmax_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint16x8, v_min, vminu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint16x8, v_max, vmaxu_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int16x8, v_min, vmin_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int16x8, v_max, vmax_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint32x4, v_min, vminu_vv_u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint32x4, v_max, vmaxu_vv_u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int32x4, v_min, vmin_vv_i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int32x4, v_max, vmax_vv_i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_float32x4, v_min, vfmin_vv_f32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_float32x4, v_max, vfmax_vv_f32m1, 4) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_float64x2, v_min, vfmin_vv_f64m1, 2) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_float64x2, v_max, vfmax_vv_f64m1, 2) + +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ + return v_float32x4(vfsqrt_v_f32m1(x.val, 4)); +} + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + return v_float32x4(vfrdiv_vf_f32m1(vfsqrt_v_f32m1(x.val, 4), 1, 4)); +} + +inline v_float32x4 v_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + v_float32x4 x(vfmacc_vv_f32m1(vfmul_vv_f32m1(a.val, a.val, 4), b.val, b.val, 4)); + return v_sqrt(x); +} + +inline v_float32x4 v_sqr_magnitude(const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4(vfmacc_vv_f32m1(vfmul_vv_f32m1(a.val, a.val, 4), b.val, b.val, 4)); +} + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_float32x4(vfmacc_vv_f32m1(c.val, a.val, b.val, 4)); +} + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_int32x4(vmacc_vv_i32m1(c.val, a.val, b.val, 4)); +} + +inline v_float32x4 v_muladd(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + vfloat32m1_t res = vfmul_vf_f32m1(m0.val, v.val[0], 4);//vmuli_f32(m0.val, v.val, 0); + res = vfmacc_vf_f32m1(res, v.val[1], m1.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + res = vfmacc_vf_f32m1(res, v.val[2], m2.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + res = vfmacc_vf_f32m1(res, v.val[3], m3.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + return v_float32x4(res); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + vfloat32m1_t res = vfmul_vf_f32m1(m0.val, v.val[0], 4);//vmuli_f32(m0.val, v.val, 0); + res = vfmacc_vf_f32m1(res, v.val[1], m1.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + res = vfmacc_vf_f32m1(res, v.val[2], m2.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + res = vfadd_vv_f32m1(res, a.val, 4);//vmulai_f32(res, m1.val, v.val, 1); + return v_float32x4(res); +} + +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ + return v_float64x2(vfsqrt_v_f64m1(x.val, 2)); +} + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + return v_float64x2(vfrdiv_vf_f64m1(vfsqrt_v_f64m1(x.val, 2), 1, 2)); +} + +inline v_float64x2 v_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + v_float64x2 x(vfmacc_vv_f64m1(vfmul_vv_f64m1(a.val, a.val, 2), b.val, b.val, 2)); + return v_sqrt(x); +} + +inline v_float64x2 v_sqr_magnitude(const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2(vfmacc_vv_f64m1(vfmul_vv_f64m1(a.val, a.val, 2), b.val, b.val, 2)); +} + +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_float64x2(vfmacc_vv_f64m1(c.val, a.val, b.val, 2)); +} + +inline v_float64x2 v_muladd(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return v_fma(a, b, c); +} + +#define OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(_Tpvec, suffix, num) \ + OPENCV_HAL_IMPL_RISCVV_BIN_OPN(&, _Tpvec, vand_vv_##suffix, num) \ + OPENCV_HAL_IMPL_RISCVV_BIN_OPN(|, _Tpvec, vor_vv_##suffix, num) \ + OPENCV_HAL_IMPL_RISCVV_BIN_OPN(^, _Tpvec, vxor_vv_##suffix, num) \ + inline _Tpvec operator ~ (const _Tpvec & a) \ + { \ + return _Tpvec(vnot_v_##suffix(a.val, num)); \ + } + +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_uint8x16, u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_uint16x8, u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_uint32x4, u32m1, 4) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_uint64x2, u64m1, 2) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_int8x16, i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_int16x8, i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_int32x4, i32m1, 4) +OPENCV_HAL_IMPL_RISCVV_LOGIC_OPN(v_int64x2, i64m1, 2) + +#define OPENCV_HAL_IMPL_RISCVV_FLT_BIT_OP(bin_op, intrin) \ +inline v_float32x4 operator bin_op (const v_float32x4& a, const v_float32x4& b) \ +{ \ + return v_float32x4(vfloat32m1_t(intrin(vint32m1_t(a.val), vint32m1_t(b.val), 4))); \ +} \ +inline v_float32x4& operator bin_op##= (v_float32x4& a, const v_float32x4& b) \ +{ \ + a.val = vfloat32m1_t(intrin(vint32m1_t(a.val), vint32m1_t(b.val), 4)); \ + return a; \ +} + +OPENCV_HAL_IMPL_RISCVV_FLT_BIT_OP(&, vand_vv_i32m1) +OPENCV_HAL_IMPL_RISCVV_FLT_BIT_OP(|, vor_vv_i32m1) +OPENCV_HAL_IMPL_RISCVV_FLT_BIT_OP(^, vxor_vv_i32m1) + +inline v_float32x4 operator ~ (const v_float32x4& a) +{ + return v_float32x4((vfloat32m1_t)(vnot_v_i32m1((vint32m1_t)(a.val), 4))); +} + +#define OPENCV_HAL_IMPL_RISCVV_FLT_64BIT_OP(bin_op, intrin) \ +inline v_float64x2 operator bin_op (const v_float64x2& a, const v_float64x2& b) \ +{ \ + return v_float64x2(vfloat64m1_t(intrin(vint64m1_t(a.val), vint64m1_t(b.val), 2))); \ +} \ +inline v_float64x2& operator bin_op##= (v_float64x2& a, const v_float64x2& b) \ +{ \ + a.val = vfloat64m1_t(intrin(vint64m1_t(a.val), vint64m1_t(b.val), 2)); \ + return a; \ +} + +OPENCV_HAL_IMPL_RISCVV_FLT_64BIT_OP(&, vand_vv_i64m1) +OPENCV_HAL_IMPL_RISCVV_FLT_64BIT_OP(|, vor_vv_i64m1) +OPENCV_HAL_IMPL_RISCVV_FLT_64BIT_OP(^, vxor_vv_i64m1) + +inline v_float64x2 operator ~ (const v_float64x2& a) +{ + return v_float64x2((vfloat64m1_t)(vnot_v_i64m1((vint64m1_t)(a.val), 2))); +} +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ + return v_int16x8(vmulh_vv_i16m1(a.val, b.val, 8)); +} +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ + return v_uint16x8(vmulhu_vv_u16m1(a.val, b.val, 8)); +} + +//#define OPENCV_HAL_IMPL_RISCVV_ABS(_Tpuvec, _Tpsvec, usuffix, ssuffix) \ +//inline _Tpuvec v_abs(const _Tpsvec& a) { \ +// E##xm1_t mask=vmflt_vf_e32xm1_f32m1(x.val, 0.0, 4); + +//OPENCV_HAL_IMPL_RISCVV_ABS(v_uint8x16, v_int8x16, u8, s8) +//OPENCV_HAL_IMPL_RISCVV_ABS(v_uint16x8, v_int16x8, u16, s16) +//OPENCV_HAL_IMPL_RISCVV_ABS(v_uint32x4, v_int32x4, u32, s32) + +inline v_uint32x4 v_abs(v_int32x4 x) +{ + vbool32_t mask=vmslt_vx_i32m1_b32(x.val, 0, 4); + return v_uint32x4((vuint32m1_t)vrsub_vx_i32m1_m(mask, x.val, x.val, 0, 4)); +} + +inline v_uint16x8 v_abs(v_int16x8 x) +{ + vbool16_t mask=vmslt_vx_i16m1_b16(x.val, 0, 8); + return v_uint16x8((vuint16m1_t)vrsub_vx_i16m1_m(mask, x.val, x.val, 0, 8)); +} + +inline v_uint8x16 v_abs(v_int8x16 x) +{ + vbool8_t mask=vmslt_vx_i8m1_b8(x.val, 0, 16); + return v_uint8x16((vuint8m1_t)vrsub_vx_i8m1_m(mask, x.val, x.val, 0, 16)); +} + +inline v_float32x4 v_abs(v_float32x4 x) +{ + return (v_float32x4)vfsgnjx_vv_f32m1(x.val, x.val, 4); +} + +inline v_float64x2 v_abs(v_float64x2 x) +{ + return (v_float64x2)vfsgnjx_vv_f64m1(x.val, x.val, 2); +} + +inline v_float32x4 v_absdiff(const v_float32x4& a, const v_float32x4& b) +{ + vfloat32m1_t ret = vfsub_vv_f32m1(a.val, b.val, 4); + return (v_float32x4)vfsgnjx_vv_f32m1(ret, ret, 4); +} + +inline v_float64x2 v_absdiff(const v_float64x2& a, const v_float64x2& b) +{ + vfloat64m1_t ret = vfsub_vv_f64m1(a.val, b.val, 2); + return (v_float64x2)vfsgnjx_vv_f64m1(ret, ret, 2); +} + +#define OPENCV_HAL_IMPL_RISCVV_ABSDIFF_U(bit, num) \ +inline v_uint##bit##x##num v_absdiff(v_uint##bit##x##num a, v_uint##bit##x##num b){ \ + vuint##bit##m1_t vmax = vmaxu_vv_u##bit##m1(a.val, b.val, num); \ + vuint##bit##m1_t vmin = vminu_vv_u##bit##m1(a.val, b.val, num); \ + return v_uint##bit##x##num(vsub_vv_u##bit##m1(vmax, vmin, num));\ +} + +OPENCV_HAL_IMPL_RISCVV_ABSDIFF_U(8, 16) +OPENCV_HAL_IMPL_RISCVV_ABSDIFF_U(16, 8) +OPENCV_HAL_IMPL_RISCVV_ABSDIFF_U(32, 4) + +/** Saturating absolute difference **/ +inline v_int8x16 v_absdiffs(v_int8x16 a, v_int8x16 b){ + vint8m1_t vmax = vmax_vv_i8m1(a.val, b.val, 16); + vint8m1_t vmin = vmin_vv_i8m1(a.val, b.val, 16); + return v_int8x16(vssub_vv_i8m1(vmax, vmin, 16)); +} +inline v_int16x8 v_absdiffs(v_int16x8 a, v_int16x8 b){ + vint16m1_t vmax = vmax_vv_i16m1(a.val, b.val, 8); + vint16m1_t vmin = vmin_vv_i16m1(a.val, b.val, 8); + return v_int16x8(vssub_vv_i16m1(vmax, vmin, 8)); +} + +#define OPENCV_HAL_IMPL_RISCVV_ABSDIFF(_Tpvec, _Tpv, num) \ +inline v_uint##_Tpvec v_absdiff(v_int##_Tpvec a, v_int##_Tpvec b){ \ + vint##_Tpv##_t max = vmax_vv_i##_Tpv(a.val, b.val, num);\ + vint##_Tpv##_t min = vmin_vv_i##_Tpv(a.val, b.val, num);\ + return v_uint##_Tpvec((vuint##_Tpv##_t)vsub_vv_i##_Tpv(max, min, num)); \ +} + +OPENCV_HAL_IMPL_RISCVV_ABSDIFF(8x16, 8m1, 16) +OPENCV_HAL_IMPL_RISCVV_ABSDIFF(16x8, 16m1, 8) +OPENCV_HAL_IMPL_RISCVV_ABSDIFF(32x4, 32m1, 4) + +// Multiply and expand +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + vint16m2_t res = vundefined_i16m2(); + res = vwmul_vv_i16m2(a.val, b.val, 16); + c.val = vget_i16m2_i16m1(res, 0); + d.val = vget_i16m2_i16m1(res, 1); +} + +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + vuint16m2_t res = vundefined_u16m2(); + res = vwmulu_vv_u16m2(a.val, b.val, 16); + c.val = vget_u16m2_u16m1(res, 0); + d.val = vget_u16m2_u16m1(res, 1); +} + +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + vint32m2_t res = vundefined_i32m2(); + res = vwmul_vv_i32m2(a.val, b.val, 8); + c.val = vget_i32m2_i32m1(res, 0); + d.val = vget_i32m2_i32m1(res, 1); +} + +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + vuint32m2_t res = vundefined_u32m2(); + res = vwmulu_vv_u32m2(a.val, b.val, 8); + c.val = vget_u32m2_u32m1(res, 0); + d.val = vget_u32m2_u32m1(res, 1); +} + +inline void v_mul_expand(const v_int32x4& a, const v_int32x4& b, + v_int64x2& c, v_int64x2& d) +{ + vint64m2_t res = vundefined_i64m2(); + res = vwmul_vv_i64m2(a.val, b.val, 4); + c.val = vget_i64m2_i64m1(res, 0); + d.val = vget_i64m2_i64m1(res, 1); +} + +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + vuint64m2_t res = vundefined_u64m2(); + res = vwmulu_vv_u64m2(a.val, b.val, 4); + c.val = vget_u64m2_u64m1(res, 0); + d.val = vget_u64m2_u64m1(res, 1); +} + +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint8x16, v_add_wrap, vadd_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int8x16, v_add_wrap, vadd_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint16x8, v_add_wrap, vadd_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int16x8, v_add_wrap, vadd_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint8x16, v_sub_wrap, vsub_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int8x16, v_sub_wrap, vsub_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint16x8, v_sub_wrap, vsub_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int16x8, v_sub_wrap, vsub_vv_i16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint8x16, v_mul_wrap, vmul_vv_u8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int8x16, v_mul_wrap, vmul_vv_i8m1, 16) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_uint16x8, v_mul_wrap, vmul_vv_u16m1, 8) +OPENCV_HAL_IMPL_RISCVV_BINN_FUNC(v_int16x8, v_mul_wrap, vmul_vv_i16m1, 8) +//////// Dot Product //////// +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ + vint32m2_t res = vundefined_i32m2(); + res = vwmul_vv_i32m2(a.val, b.val, 8); + res = vrgather_vv_i32m2(res, (vuint32m2_t){0, 2, 4, 6, 1, 3, 5, 7}, 8); + return v_int32x4(vadd_vv_i32m1(vget_i32m2_i32m1(res, 0), vget_i32m2_i32m1(res, 1), 4)); +} +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + vint32m2_t res = vundefined_i32m2(); + res = vwmul_vv_i32m2(a.val, b.val, 8); + res = vrgather_vv_i32m2(res, (vuint32m2_t){0, 2, 4, 6, 1, 3, 5, 7}, 8); + return v_int32x4(vadd_vv_i32m1(vadd_vv_i32m1(vget_i32m2_i32m1(res, 0),vget_i32m2_i32m1(res, 1), 4), c.val, 4)); +} + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + vint64m2_t res = vundefined_i64m2(); + res = vwmul_vv_i64m2(a.val, b.val, 4); + res = vrgather_vv_i64m2(res, (vuint64m2_t){0, 2, 1, 3}, 4); + return v_int64x2(vadd_vv_i64m1(vget_i64m2_i64m1(res, 0), vget_i64m2_i64m1(res, 1), 2)); +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + vint64m2_t res = vundefined_i64m2(); + res = vwmul_vv_i64m2(a.val, b.val, 4); + res = vrgather_vv_i64m2(res, (vuint64m2_t){0, 2, 1, 3}, 4); + return v_int64x2(vadd_vv_i64m1(vadd_vv_i64m1(vget_i64m2_i64m1(res, 0), vget_i64m2_i64m1(res, 1), 2), c.val, 2)); +} + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + vuint16m2_t v1 = vundefined_u16m2(); + vuint32m2_t v2 = vundefined_u32m2(); + v1 = vwmulu_vv_u16m2(a.val, b.val, 16); + v1 = vrgather_vv_u16m2(v1, (vuint16m2_t){0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}, 16); + v2 = vwaddu_vv_u32m2(vget_u16m2_u16m1(v1, 0), vget_u16m2_u16m1(v1, 1), 8); + return v_uint32x4(vadd_vv_u32m1(vget_u32m2_u32m1(v2, 0), vget_u32m2_u32m1(v2, 1), 4)); +} + +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, + const v_uint32x4& c) +{ + vuint16m2_t v1 = vundefined_u16m2(); + vuint32m2_t v2 = vundefined_u32m2(); + v1 = vwmulu_vv_u16m2(a.val, b.val, 16); + v1 = vrgather_vv_u16m2(v1, (vuint16m2_t){0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}, 16); + v2 = vwaddu_vv_u32m2(vget_u16m2_u16m1(v1, 0), vget_u16m2_u16m1(v1, 1), 8); + return v_uint32x4(vadd_vv_u32m1(vadd_vv_u32m1(vget_u32m2_u32m1(v2, 0), vget_u32m2_u32m1(v2, 1), 4), c.val, 4)); +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + vint16m2_t v1 = vundefined_i16m2(); + vint32m2_t v2 = vundefined_i32m2(); + v1 = vwmul_vv_i16m2(a.val, b.val, 16); + v1 = vrgather_vv_i16m2(v1, (vuint16m2_t){0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}, 16); + v2 = vwadd_vv_i32m2(vget_i16m2_i16m1(v1, 0), vget_i16m2_i16m1(v1, 1), 8); + return v_int32x4(vadd_vv_i32m1(vget_i32m2_i32m1(v2, 0), vget_i32m2_i32m1(v2, 1), 4)); +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, + const v_int32x4& c) +{ + vint16m2_t v1 = vundefined_i16m2(); + vint32m2_t v2 = vundefined_i32m2(); + v1 = vwmul_vv_i16m2(a.val, b.val, 16); + v1 = vrgather_vv_i16m2(v1, (vuint16m2_t){0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}, 16); + v2 = vwadd_vv_i32m2(vget_i16m2_i16m1(v1, 0), vget_i16m2_i16m1(v1, 1), 8); + return v_int32x4(vadd_vv_i32m1(vadd_vv_i32m1(vget_i32m2_i32m1(v2, 0), vget_i32m2_i32m1(v2, 1), 4), c.val, 4)); +} + +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + vuint32m2_t v1 = vundefined_u32m2(); + vuint64m2_t v2 = vundefined_u64m2(); + v1 = vwmulu_vv_u32m2(a.val, b.val, 8); + v1 = vrgather_vv_u32m2(v1, (vuint32m2_t){0, 4, 1, 5, 2, 6, 3, 7}, 8); + v2 = vwaddu_vv_u64m2(vget_u32m2_u32m1(v1, 0), vget_u32m2_u32m1(v1, 1), 4); + return v_uint64x2(vadd_vv_u64m1(vget_u64m2_u64m1(v2, 0), vget_u64m2_u64m1(v2, 1), 2)); +} + +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, + const v_uint64x2& c) +{ + vuint32m2_t v1 = vundefined_u32m2(); + vuint64m2_t v2 = vundefined_u64m2(); + v1 = vwmulu_vv_u32m2(a.val, b.val, 8); + v1 = vrgather_vv_u32m2(v1, (vuint32m2_t){0, 4, 1, 5, 2, 6, 3, 7}, 8); + v2 = vwaddu_vv_u64m2(vget_u32m2_u32m1(v1, 0), vget_u32m2_u32m1(v1, 1), 4); + return v_uint64x2(vadd_vv_u64m1(vadd_vv_u64m1(vget_u64m2_u64m1(v2, 0), vget_u64m2_u64m1(v2, 1), 2), c.val, 2)); +} + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + vint32m2_t v1 = vundefined_i32m2(); + vint64m2_t v2 = vundefined_i64m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + v1 = vrgather_vv_i32m2(v1, (vuint32m2_t){0, 4, 1, 5, 2, 6, 3, 7}, 8); + v2 = vwadd_vv_i64m2(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4); + return v_int64x2(vadd_vv_i64m1(vget_i64m2_i64m1(v2, 0), vget_i64m2_i64m1(v2, 1), 2)); +} + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, + const v_int64x2& c) +{ + vint32m2_t v1 = vundefined_i32m2(); + vint64m2_t v2 = vundefined_i64m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + v1 = vrgather_vv_i32m2(v1, (vuint32m2_t){0, 4, 1, 5, 2, 6, 3, 7}, 8); + v2 = vwadd_vv_i64m2(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4); + return v_int64x2(vadd_vv_i64m1(vadd_vv_i64m1(vget_i64m2_i64m1(v2, 0), vget_i64m2_i64m1(v2, 1), 2), c.val, 2)); +} + +//////// Fast Dot Product //////// +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ + vint32m2_t v1 = vundefined_i32m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + return v_int32x4(vadd_vv_i32m1(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4)); +} + +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ + vint32m2_t v1 = vundefined_i32m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + return v_int32x4(vadd_vv_i32m1(vadd_vv_i32m1(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4), c.val, 4)); +} + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ + vint64m2_t v1 = vundefined_i64m2(); + v1 = vwmul_vv_i64m2(a.val, b.val, 4); + return v_int64x2(vadd_vv_i64m1(vget_i64m2_i64m1(v1, 0), vget_i64m2_i64m1(v1, 1), 2)); +} +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + vint64m2_t v1 = vundefined_i64m2(); + v1 = vwmul_vv_i64m2(a.val, b.val, 8); + return v_int64x2(vadd_vv_i64m1(vadd_vv_i64m1(vget_i64m2_i64m1(v1, 0), vget_i64m2_i64m1(v1, 1), 4), c.val, 4)); +} + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ + vuint16m2_t v1 = vundefined_u16m2(); + vuint32m2_t v2 = vundefined_u32m2(); + v1 = vwmulu_vv_u16m2(a.val, b.val, 16); + v2 = vwaddu_vv_u32m2(vget_u16m2_u16m1(v1, 0), vget_u16m2_u16m1(v1, 1), 8); + return v_uint32x4(vadd_vv_u32m1(vget_u32m2_u32m1(v2, 0), vget_u32m2_u32m1(v2, 1), 4)); +} + +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ + vuint16m2_t v1 = vundefined_u16m2(); + vuint32m2_t v2 = vundefined_u32m2(); + v1 = vwmulu_vv_u16m2(a.val, b.val, 16); + v2 = vwaddu_vv_u32m2(vget_u16m2_u16m1(v1, 0), vget_u16m2_u16m1(v1, 1), 8); + return v_uint32x4(vadd_vv_u32m1(vadd_vv_u32m1(vget_u32m2_u32m1(v2, 0), vget_u32m2_u32m1(v2, 1), 4), c.val, 4)); +} + +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ + vint16m2_t v1 = vundefined_i16m2(); + vint32m2_t v2 = vundefined_i32m2(); + v1 = vwmul_vv_i16m2(a.val, b.val, 16); + v2 = vwadd_vv_i32m2(vget_i16m2_i16m1(v1, 0), vget_i16m2_i16m1(v1, 1), 8); + return v_int32x4(vadd_vv_i32m1(vget_i32m2_i32m1(v2, 0), vget_i32m2_i32m1(v2, 1), 4)); +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ + vint16m2_t v1 = vundefined_i16m2(); + vint32m2_t v2 = vundefined_i32m2(); + v1 = vwmul_vv_i16m2(a.val, b.val, 16); + v2 = vwadd_vv_i32m2(vget_i16m2_i16m1(v1, 0), vget_i16m2_i16m1(v1, 1), 8); + return v_int32x4(vadd_vv_i32m1(vadd_vv_i32m1(vget_i32m2_i32m1(v2, 0), vget_i32m2_i32m1(v2, 1), 4), c.val, 4)); +} + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ + vuint32m2_t v1 = vundefined_u32m2(); + vuint64m2_t v2 = vundefined_u64m2(); + v1 = vwmulu_vv_u32m2(a.val, b.val, 8); + v2 = vwaddu_vv_u64m2(vget_u32m2_u32m1(v1, 0), vget_u32m2_u32m1(v1, 1), 4); + return v_uint64x2(vadd_vv_u64m1(vget_u64m2_u64m1(v2, 0), vget_u64m2_u64m1(v2, 1), 2)); +} +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ + vuint32m2_t v1 = vundefined_u32m2(); + vuint64m2_t v2 = vundefined_u64m2(); + v1 = vwmulu_vv_u32m2(a.val, b.val, 8); + v2 = vwaddu_vv_u64m2(vget_u32m2_u32m1(v1, 0), vget_u32m2_u32m1(v1, 1), 4); + return v_uint64x2(vadd_vv_u64m1(vadd_vv_u64m1(vget_u64m2_u64m1(v2, 0), vget_u64m2_u64m1(v2, 1), 2), c.val, 2)); +} + +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + vint32m2_t v1 = vundefined_i32m2(); + vint64m2_t v2 = vundefined_i64m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + v2 = vwadd_vv_i64m2(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4); + return v_int64x2(vadd_vv_i64m1(vget_i64m2_i64m1(v2, 0), vget_i64m2_i64m1(v2, 1), 2)); +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ + vint32m2_t v1 = vundefined_i32m2(); + vint64m2_t v2 = vundefined_i64m2(); + v1 = vwmul_vv_i32m2(a.val, b.val, 8); + v2 = vwadd_vv_i64m2(vget_i32m2_i32m1(v1, 0), vget_i32m2_i32m1(v1, 1), 4); + return v_int64x2(vadd_vv_i64m1(vadd_vv_i64m1(vget_i64m2_i64m1(v2, 0), vget_i64m2_i64m1(v2, 1), 2), c.val, 2)); +} + + +#define OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(_Tpvec, _Tpvec2, len, scalartype, func, intrin, num) \ +inline scalartype v_reduce_##func(const v_##_Tpvec##x##num& a) \ +{\ + v##_Tpvec2##m1_t val = vmv_v_x_##len##m1(0, num); \ + val = intrin(val, a.val, val, num); \ + return vmv_x_s_##len##m1_##len(val, num); \ +} + + +#define OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(_Tpvec, _Tpvec2, scalartype, func, funcu, num) \ +inline scalartype v_reduce_##func(const v_##_Tpvec##x##num& a) \ +{\ + v##_Tpvec##m1_t val = (v##_Tpvec##m1_t)vmv_v_x_i8m1(0, num); \ + val = v##funcu##_vs_##_Tpvec2##m1_##_Tpvec2##m1(val, a.val, a.val, num); \ + return val[0]; \ +} +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(int8, int16, i16, int, sum, vwredsum_vs_i8m1_i16m1, 16) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(int16, int32, i32, int, sum, vwredsum_vs_i16m1_i32m1, 8) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(int32, int64, i64, int, sum, vwredsum_vs_i32m1_i64m1, 4) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(uint8, uint16, u16, unsigned, sum, vwredsumu_vs_u8m1_u16m1, 16) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(uint16, uint32, u32, unsigned, sum, vwredsumu_vs_u16m1_u32m1, 8) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_W(uint32, uint64, u64, unsigned, sum, vwredsumu_vs_u32m1_u64m1, 4) +inline float v_reduce_sum(const v_float32x4& a) \ +{\ + vfloat32m1_t val = vfmv_v_f_f32m1(0.0, 4); \ + val = vfredsum_vs_f32m1_f32m1(val, a.val, val, 4); \ + return vfmv_f_s_f32m1_f32(val, 4); \ +} +inline double v_reduce_sum(const v_float64x2& a) \ +{\ + vfloat64m1_t val = vfmv_v_f_f64m1(0.0, 2); \ + val = vfredsum_vs_f64m1_f64m1(val, a.val, val, 2); \ + return vfmv_f_s_f64m1_f64(val, 2); \ +} +inline uint64 v_reduce_sum(const v_uint64x2& a) +{ return vext_x_v_u64m1_u64((vuint64m1_t)a.val, 0, 2)+vext_x_v_u64m1_u64((vuint64m1_t)a.val, 1, 2); } + +inline int64 v_reduce_sum(const v_int64x2& a) +{ return vext_x_v_i64m1_i64((vint64m1_t)a.val, 0, 2)+vext_x_v_i64m1_i64((vint64m1_t)a.val, 1, 2); } + +#define OPENCV_HAL_IMPL_RISCVV_REDUCE_OP(func) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(int8, i8, int, func, red##func, 16) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(int16, i16, int, func, red##func, 8) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(int32, i32, int, func, red##func, 4) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(int64, i64, int, func, red##func, 2) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(uint8, u8, unsigned, func, red##func##u, 16) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(uint16, u16, unsigned, func, red##func##u, 8) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(uint32, u32, unsigned, func, red##func##u, 4) \ +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP_(float32, f32, float, func, fred##func, 4) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP(max) +OPENCV_HAL_IMPL_RISCVV_REDUCE_OP(min) + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + vfloat32m1_t a0 = vfmv_v_f_f32m1(0.0, 4); + vfloat32m1_t b0 = vfmv_v_f_f32m1(0.0, 4); + vfloat32m1_t c0 = vfmv_v_f_f32m1(0.0, 4); + vfloat32m1_t d0 = vfmv_v_f_f32m1(0.0, 4); + a0 = vfredsum_vs_f32m1_f32m1(a0, a.val, a0, 4); + b0 = vfredsum_vs_f32m1_f32m1(b0, b.val, b0, 4); + c0 = vfredsum_vs_f32m1_f32m1(c0, c.val, c0, 4); + d0 = vfredsum_vs_f32m1_f32m1(d0, d.val, d0, 4); + return v_float32x4(a0[0], b0[0], c0[0], d0[0]); +} + +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + vfloat32m1_t a0 = vfmv_v_f_f32m1(0.0, 4); + vfloat32m1_t x = vfsub_vv_f32m1(a.val, b.val, 4); + vbool32_t mask=vmflt_vf_f32m1_b32(x, 0, 4); + vfloat32m1_t val = vfrsub_vf_f32m1_m(mask, x, x, 0, 4); + a0 = vfredsum_vs_f32m1_f32m1(a0, val, a0, 4); + return a0[0]; +} + +#define OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(_Tpvec, _Tpvec2) \ +inline unsigned v_reduce_sad(const _Tpvec& a, const _Tpvec&b){ \ + _Tpvec2 x = v_absdiff(a, b); \ + return v_reduce_sum(x); \ +} + +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_int8x16, v_uint8x16) +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_uint8x16, v_uint8x16) +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_int16x8, v_uint16x8) +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_uint16x8, v_uint16x8) +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_int32x4, v_uint32x4) +OPENCV_HAL_IMPL_RISCVV_REDUCE_SAD(v_uint32x4, v_uint32x4) + +#define OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(_Tpvec, _Tp, _T, num, uv) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmseq_vv_##_Tp##_b##_T(a.val, b.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmsne_vv_##_Tp##_b##_T(a.val, b.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ +inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmslt##uv##_Tp##_b##_T(a.val, b.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ +inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmslt##uv##_Tp##_b##_T(b.val, a.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ +inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmsle##uv##_Tp##_b##_T(a.val, b.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ +inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ +{ \ + vbool##_T##_t mask = vmsle##uv##_Tp##_b##_T(b.val, a.val, num); \ + return _Tpvec(vmerge_vxm_##_Tp(mask, vmv_v_x_##_Tp(0, num), -1, num)); \ +} \ + +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_int8x16, i8m1, 8, 16, _vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_int16x8, i16m1, 16, 8, _vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_int32x4, i32m1, 32, 4, _vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_int64x2, i64m1, 64, 2, _vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_uint8x16, u8m1, 8, 16, u_vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_uint16x8, u16m1, 16, 8, u_vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_uint32x4, u32m1, 32, 4, u_vv_) +OPENCV_HAL_IMPL_RISCVV_INT_CMP_OP(v_uint64x2, u64m1, 64, 2, u_vv_) + +//TODO: == +inline v_float32x4 operator == (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmfeq_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 operator != (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmfne_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 operator < (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmflt_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 operator <= (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmfle_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 operator > (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmfgt_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 operator >= (const v_float32x4& a, const v_float32x4& b) +{ + vbool32_t mask = vmfge_vv_f32m1_b32(a.val, b.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ + vbool32_t mask = vmford_vv_f32m1_b32(a.val, a.val, 4); + vint32m1_t res = vmerge_vxm_i32m1(mask, vmv_v_x_i32m1(0.0, 4), -1, 4); + return v_float32x4((vfloat32m1_t)res); +} + +//TODO: == +inline v_float64x2 operator == (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmfeq_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 operator != (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmfne_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 operator < (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmflt_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 operator <= (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmfle_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 operator > (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmfgt_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 operator >= (const v_float64x2& a, const v_float64x2& b) +{ + vbool64_t mask = vmfge_vv_f64m1_b64(a.val, b.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ + vbool64_t mask = vmford_vv_f64m1_b64(a.val, a.val, 2); + vint64m1_t res = vmerge_vxm_i64m1(mask, vmv_v_x_i64m1(0.0, 2), -1, 2); + return v_float64x2((vfloat64m1_t)res); +} +#define OPENCV_HAL_IMPL_RISCVV_TRANSPOSE4x4(_Tp, _T) \ +inline void v_transpose4x4(const v_##_Tp##32x4& a0, const v_##_Tp##32x4& a1, \ + const v_##_Tp##32x4& a2, const v_##_Tp##32x4& a3, \ + v_##_Tp##32x4& b0, v_##_Tp##32x4& b1, \ + v_##_Tp##32x4& b2, v_##_Tp##32x4& b3) \ +{ \ + v##_Tp##32m4_t val = vundefined_##_T##m4(); \ + val = vset_##_T##m4(val, 0, a0.val); \ + val = vset_##_T##m4(val, 1, a1.val); \ + val = vset_##_T##m4(val, 2, a2.val); \ + val = vset_##_T##m4(val, 3, a3.val); \ + val = vrgather_vv_##_T##m4(val, (vuint32m4_t){0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}, 16); \ + b0.val = vget_##_T##m4_##_T##m1(val, 0); \ + b1.val = vget_##_T##m4_##_T##m1(val, 1); \ + b2.val = vget_##_T##m4_##_T##m1(val, 2); \ + b3.val = vget_##_T##m4_##_T##m1(val, 3); \ +} +OPENCV_HAL_IMPL_RISCVV_TRANSPOSE4x4(uint, u32) +OPENCV_HAL_IMPL_RISCVV_TRANSPOSE4x4(int, i32) +OPENCV_HAL_IMPL_RISCVV_TRANSPOSE4x4(float, f32) + + +#define OPENCV_HAL_IMPL_RISCVV_SHIFT_LEFT(_Tpvec, suffix, _T, num) \ +inline _Tpvec operator << (const _Tpvec& a, int n) \ +{ return _Tpvec((vsll_vx_##_T##m1(a.val, n, num))); } \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ return _Tpvec((vsll_vx_##_T##m1(a.val, n, num))); } + +#define OPENCV_HAL_IMPL_RISCVV_SHIFT_RIGHT(_Tpvec, suffix, _T, num, intric) \ +inline _Tpvec operator >> (const _Tpvec& a, int n) \ +{ return _Tpvec((v##intric##_vx_##_T##m1(a.val, n, num))); } \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ return _Tpvec((v##intric##_vx_##_T##m1(a.val, n, num))); }\ +template inline _Tpvec v_rshr(const _Tpvec& a) \ +{ return _Tpvec((v##intric##_vx_##_T##m1(vadd_vx_##_T##m1(a.val, 1<<(n-1), num), n, num))); } + +// trade efficiency for convenience +#define OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(suffix, _T, num, intrin) \ +OPENCV_HAL_IMPL_RISCVV_SHIFT_LEFT(v_##suffix##x##num, suffix, _T, num) \ +OPENCV_HAL_IMPL_RISCVV_SHIFT_RIGHT(v_##suffix##x##num, suffix, _T, num, intrin) + +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(uint8, u8, 16, srl) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(uint16, u16, 8, srl) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(uint32, u32, 4, srl) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(uint64, u64, 2, srl) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(int8, i8, 16, sra) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(int16, i16, 8, sra) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(int32, i32, 4, sra) +OPENCV_HAL_IMPL_RISCVV_SHIFT_OP(int64, i64, 2, sra) + +#if 0 +#define VUP4(n) {0, 1, 2, 3} +#define VUP8(n) {0, 1, 2, 3, 4, 5, 6, 7} +#define VUP16(n) {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} +#define VUP2(n) {0, 1} +#endif +#define OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(_Tpvec, suffix, _T, num, num2, vmv, len) \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + suffix##m1_t tmp = vmv##_##_T##m1(0, num);\ + tmp = vslideup_vx_##_T##m1_m(vmset_m_##len(num), tmp, a.val, n, num);\ + return _Tpvec(tmp);\ +} \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return _Tpvec(vslidedown_vx_##_T##m1(a.val, n, num));\ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + suffix##m2_t tmp = vundefined_##_T##m2(); \ + tmp = vset_##_T##m2(tmp, 0, a.val); \ + tmp = vset_##_T##m2(tmp, 1, b.val); \ + tmp = vslidedown_vx_##_T##m2(tmp, n, num2);\ + return _Tpvec(vget_##_T##m2_##_T##m1(tmp, 0));\ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + suffix##m2_t tmp = vundefined_##_T##m2(); \ + tmp = vset_##_T##m2(tmp, 0, b.val); \ + tmp = vset_##_T##m2(tmp, 1, a.val); \ + tmp = vslideup_vx_##_T##m2(tmp, n, num2);\ + return _Tpvec(vget_##_T##m2_##_T##m1(tmp, 1));\ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ \ + CV_UNUSED(b); return a; \ +} + +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_uint8x16, vuint8, u8, 16, 32, vmv_v_x, b8) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_int8x16, vint8, i8, 16, 32, vmv_v_x, b8) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_uint16x8, vuint16, u16, 8, 16, vmv_v_x, b16) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_int16x8, vint16, i16, 8, 16, vmv_v_x, b16) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_uint32x4, vuint32, u32, 4, 8, vmv_v_x, b32) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_int32x4, vint32, i32, 4, 8, vmv_v_x, b32) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_uint64x2, vuint64, u64, 2, 4, vmv_v_x, b64) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_int64x2, vint64, i64, 2, 4, vmv_v_x, b64) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_float32x4, vfloat32, f32, 4, 8, vfmv_v_f, b32) +OPENCV_HAL_IMPL_RISCVV_ROTATE_OP(v_float64x2, vfloat64, f64, 2, 4, vfmv_v_f, b64) + +#define OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(_Tpvec, _Tp, _Tp2, len, hnum, num) \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ \ + typedef uint64 CV_DECL_ALIGNED(1) unaligned_uint64; \ + vuint64m1_t tmp = {*(unaligned_uint64*)ptr0, *(unaligned_uint64*)ptr1};\ + return _Tpvec(_Tp2##_t(tmp)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(vle_v_##len(ptr, hnum)); }\ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(vle_v_##len(ptr, num)); } \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec((_Tp2##_t)vle_v_##len((const _Tp *)ptr, num)); } \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ vse_v_##len(ptr, a.val, hnum);}\ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + _Tp2##_t a0 = vslidedown_vx_##len(a.val, hnum, num); \ + vse_v_##len(ptr, a0, hnum);}\ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ vse_v_##len(ptr, a.val, num); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ vse_v_##len(ptr, a.val, num); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ vse_v_##len(ptr, a.val, num); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ vse_v_##len(ptr, a.val, num); } + +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_uint8x16, uchar, vuint8m1, u8m1, 8, 16) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_int8x16, schar, vint8m1, i8m1, 8, 16) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_uint16x8, ushort, vuint16m1, u16m1, 4, 8) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_int16x8, short, vint16m1, i16m1, 4, 8) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_uint32x4, unsigned, vuint32m1, u32m1, 2, 4) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_int32x4, int, vint32m1, i32m1, 2, 4) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_uint64x2, unsigned long, vuint64m1, u64m1, 1, 2) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_int64x2, long, vint64m1, i64m1, 1, 2) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_float32x4, float, vfloat32m1, f32m1, 2, 4) +OPENCV_HAL_IMPL_RISCVV_LOADSTORE_OP(v_float64x2, double, vfloat64m1, f64m1, 1, 2) + + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ +#if 1 + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[ 0]], + tab[idx[ 1]], + tab[idx[ 2]], + tab[idx[ 3]], + tab[idx[ 4]], + tab[idx[ 5]], + tab[idx[ 6]], + tab[idx[ 7]], + tab[idx[ 8]], + tab[idx[ 9]], + tab[idx[10]], + tab[idx[11]], + tab[idx[12]], + tab[idx[13]], + tab[idx[14]], + tab[idx[15]] + }; + return v_int8x16(vle_v_i8m1(elems, 16)); +#else + int32xm4_t index32 = vlev_int32xm4(idx, 16); + vint16m2_t index16 = vnsra_vx_i16m2_int32xm4(index32, 0, 16); + vint8m1_t index = vnsra_vx_i8m1_i16m2(index16, 0, 16); + return v_int8x16(vlxbv_i8m1(tab, index, 16)); +#endif +} + +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx){ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[4]], + tab[idx[4] + 1], + tab[idx[5]], + tab[idx[5] + 1], + tab[idx[6]], + tab[idx[6] + 1], + tab[idx[7]], + tab[idx[7] + 1] + }; + return v_int8x16(vle_v_i8m1(elems, 16)); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + schar CV_DECL_ALIGNED(32) elems[16] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[2] + 2], + tab[idx[2] + 3], + tab[idx[3]], + tab[idx[3] + 1], + tab[idx[3] + 2], + tab[idx[3] + 3] + }; + return v_int8x16(vle_v_i8m1(elems, 16)); +} + +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((schar*)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]], + tab[idx[4]], + tab[idx[5]], + tab[idx[6]], + tab[idx[7]] + }; + return v_int16x8(vle_v_i16m1(elems, 8)); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[2]], + tab[idx[2] + 1], + tab[idx[3]], + tab[idx[3] + 1] + }; + return v_int16x8(vle_v_i16m1(elems, 8)); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + short CV_DECL_ALIGNED(32) elems[8] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[0] + 2], + tab[idx[0] + 3], + tab[idx[1]], + tab[idx[1] + 1], + tab[idx[1] + 2], + tab[idx[1] + 3] + }; + return v_int16x8(vle_v_i16m1(elems, 8)); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((short*)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((short*)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((short*)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_int32x4(vle_v_i32m1(elems, 4)); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[0] + 1], + tab[idx[1]], + tab[idx[1] + 1] + }; + return v_int32x4(vle_v_i32m1(elems, 4)); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(vle_v_i32m1(tab+idx[0], 4)); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((int*)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((int*)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((int*)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + vint64m1_t res = {tab[idx[0]], tab[idx[1]]}; + return v_int64x2(res); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(vle_v_i64m1(tab+idx[0], 2)); +} + +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) +{ + vuint64m1_t res = {tab[idx[0]], tab[idx[1]]}; + return v_uint64x2(res); +} +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) +{ + return v_uint64x2(vle_v_u64m1(tab+idx[0], 2)); +} + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[1]], + tab[idx[2]], + tab[idx[3]] + }; + return v_float32x4(vle_v_f32m1(elems, 4)); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[idx[0]], + tab[idx[0]+1], + tab[idx[1]], + tab[idx[1]+1] + }; + return v_float32x4(vle_v_f32m1(elems, 4)); +} +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) +{ + return v_float32x4(vle_v_f32m1(tab + idx[0], 4)); +} +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + vfloat64m1_t res = {tab[idx[0]], tab[idx[1]]}; + return v_float64x2(res); +} +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2(vle_v_f64m1(tab+idx[0], 2)); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) elems[4] = + { + tab[idxvec.val[0]], + tab[idxvec.val[1]], + tab[idxvec.val[2]], + tab[idxvec.val[3]] + }; + return v_int32x4(vle_v_i32m1(elems, 4)); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + unsigned CV_DECL_ALIGNED(32) elems[4] = + { + tab[idxvec.val[0]], + tab[idxvec.val[1]], + tab[idxvec.val[2]], + tab[idxvec.val[3]] + }; + return v_uint32x4(vle_v_u32m1(elems, 4)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + float CV_DECL_ALIGNED(32) elems[4] = + { + tab[idxvec.val[0]], + tab[idxvec.val[1]], + tab[idxvec.val[2]], + tab[idxvec.val[3]] + }; + return v_float32x4(vle_v_f32m1(elems, 4)); +} +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + vfloat64m1_t res = {tab[idxvec.val[0]], tab[idxvec.val[1]]}; + return v_float64x2(res); +} +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + vint32m1_t index_x = vmul_vx_i32m1(idxvec.val, 4, 4); + vint32m1_t index_y = vadd_vx_i32m1(index_x, 4, 4); + + x.val = vlxe_v_f32m1(tab, index_x, 4); + y.val = vlxe_v_f32m1(tab, index_y, 4); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + + x = v_float64x2(tab[idx[0]], tab[idx[1]]); + y = v_float64x2(tab[idx[0]+1], tab[idx[1]+1]); +} + +#define OPENCV_HAL_IMPL_RISCVV_PACKS(_Tp, _Tp2, _T2, num2, _T1, num, intrin, shr, _Type) \ +inline v_##_Tp##x##num v_pack(const v_##_Tp2##x##num2& a, const v_##_Tp2##x##num2& b) \ +{ \ + v##_Tp2##m2_t tmp = vundefined_##_T2##m2(); \ + tmp = vset_##_T2##m2(tmp, 0, a.val); \ + tmp = vset_##_T2##m2(tmp, 1, b.val); \ + return v_##_Tp##x##num(shr##_##_T1##m1(tmp, 0, num)); \ +}\ +template inline \ +v_##_Tp##x##num v_rshr_pack(const v_##_Tp2##x##num2& a, const v_##_Tp2##x##num2& b) \ +{ \ + v##_Tp2##m2_t tmp = vundefined_##_T2##m2(); \ + tmp = vset_##_T2##m2(tmp, 0, a.val); \ + tmp = vset_##_T2##m2(tmp, 1, b.val); \ + return v_##_Tp##x##num(intrin##_##_T1##m1(tmp, n, num)); \ +}\ +inline void v_pack_store(_Type* ptr, const v_##_Tp2##x##num2& a) \ +{ \ + v##_Tp2##m2_t tmp = vundefined_##_T2##m2(); \ + tmp = vset_##_T2##m2(tmp, 0, a.val); \ + tmp = vset_##_T2##m2(tmp, 1, vmv_v_x_##_T2##m1(0, num2)); \ + asm("" ::: "memory"); \ + vse_v_##_T1##m1(ptr, shr##_##_T1##m1(tmp, 0, num), num2); \ +}\ +template inline \ +void v_rshr_pack_store(_Type* ptr, const v_##_Tp2##x##num2& a) \ +{ \ + v##_Tp2##m2_t tmp = vundefined_##_T2##m2(); \ + tmp = vset_##_T2##m2(tmp, 0, a.val); \ + tmp = vset_##_T2##m2(tmp, 1, vmv_v_x_##_T2##m1(0, num2)); \ + vse_v_##_T1##m1(ptr, intrin##_##_T1##m1(tmp, n, num), num2); \ +} +OPENCV_HAL_IMPL_RISCVV_PACKS(int8, int16, i16, 8, i8, 16, vnclip_vx, vnclip_vx, signed char) +OPENCV_HAL_IMPL_RISCVV_PACKS(int16, int32, i32, 4, i16, 8, vnclip_vx, vnclip_vx, signed short) +OPENCV_HAL_IMPL_RISCVV_PACKS(int32, int64, i64, 2, i32, 4, vnclip_vx, vnsra_vx, int) +OPENCV_HAL_IMPL_RISCVV_PACKS(uint8, uint16, u16, 8, u8, 16, vnclipu_vx, vnclipu_vx, unsigned char) +OPENCV_HAL_IMPL_RISCVV_PACKS(uint16, uint32, u32, 4, u16, 8, vnclipu_vx, vnclipu_vx, unsigned short) +OPENCV_HAL_IMPL_RISCVV_PACKS(uint32, uint64, u64, 2, u32, 4, vnclipu_vx, vnsrl_vx, unsigned int) + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + vuint16m2_t tmp = vundefined_u16m2(); \ + tmp = vset_u16m2(tmp, 0, a.val); \ + tmp = vset_u16m2(tmp, 1, b.val); \ + return v_uint8x16(vnsrl_vx_u8m1(tmp, 0, 16)); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + vuint32m4_t vabcd = vundefined_u32m4(); \ + vuint16m2_t v16 = vundefined_u16m2(); \ + vabcd = vset_u32m4(vabcd, 0, a.val); \ + vabcd = vset_u32m4(vabcd, 1, b.val); \ + vabcd = vset_u32m4(vabcd, 2, c.val); \ + vabcd = vset_u32m4(vabcd, 3, d.val); \ + v16 = vnsrl_vx_u16m2(vabcd, 0, 16); + return v_uint8x16(vnsrl_vx_u8m1(v16, 0, 16)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + vuint64m8_t v64 = vundefined_u64m8(); \ + vuint32m4_t v32 = vundefined_u32m4(); \ + vuint16m2_t v16 = vundefined_u16m2(); \ + v64 = vset_u64m8(v64, 0, a.val); \ + v64 = vset_u64m8(v64, 1, b.val); \ + v64 = vset_u64m8(v64, 2, c.val); \ + v64 = vset_u64m8(v64, 3, d.val); \ + v64 = vset_u64m8(v64, 4, e.val); \ + v64 = vset_u64m8(v64, 5, f.val); \ + v64 = vset_u64m8(v64, 6, g.val); \ + v64 = vset_u64m8(v64, 7, h.val); \ + v32 = vnsrl_vx_u32m4(v64, 0, 16); + v16 = vnsrl_vx_u16m2(v32, 0, 16); + return v_uint8x16(vnsrl_vx_u8m1(v16, 0, 16)); +} + +//inline v_uint8x16 v_pack_u(const v_int16x8& a, const v_int16x8& b) \ +//{ \ +// int16xm2_u tmp; \ +// tmp.m1[0] = (vint16m1_t)a.val; \ +// tmp.m1[1] = (vint16m1_t)b.val; \ +// e8xm1_t mask = (e8xm1_t)vmsge_vx_e16xm2_i16m2(tmp.v, 0, 16);\ +// return v_uint8x16(vnclipuvi_mask_u8m1_u16m2(vmv_v_x_u8m1(0, 16), (vuint16m2_t)tmp.v, 0, mask, 16)); +//} + +#define OPENCV_HAL_IMPL_RISCVV_PACK_U(tp1, num1, tp2, num2, _Tp) \ +inline v_uint##tp1##x##num1 v_pack_u(const v_int##tp2##x##num2& a, const v_int##tp2##x##num2& b) \ +{ \ + vint##tp2##m2_t tmp = vundefined_##i##tp2##m2(); \ + tmp = vset_##i##tp2##m2(tmp, 0, a.val); \ + tmp = vset_##i##tp2##m2(tmp, 1, b.val); \ + vint##tp2##m2_t val = vmax_vx_i##tp2##m2(tmp, 0, num1);\ + return v_uint##tp1##x##num1(vnclipu_vx_u##tp1##m1((vuint##tp2##m2_t)val, 0, num1)); \ +} \ +inline void v_pack_u_store(_Tp* ptr, const v_int##tp2##x##num2& a) \ +{ \ + vint##tp2##m2_t tmp = vundefined_##i##tp2##m2(); \ + tmp = vset_##i##tp2##m2(tmp, 0, a.val); \ + vint##tp2##m2_t val = vmax_vx_i##tp2##m2(tmp, 0, num1);\ + return vse_v_u##tp1##m1(ptr, vnclipu_vx_u##tp1##m1((vuint##tp2##m2_t)val, 0, num1), num2); \ +} \ +template inline \ +v_uint##tp1##x##num1 v_rshr_pack_u(const v_int##tp2##x##num2& a, const v_int##tp2##x##num2& b) \ +{ \ + vint##tp2##m2_t tmp = vundefined_##i##tp2##m2(); \ + tmp = vset_##i##tp2##m2(tmp, 0, a.val); \ + tmp = vset_##i##tp2##m2(tmp, 1, b.val); \ + vint##tp2##m2_t val = vmax_vx_i##tp2##m2(tmp, 0, num1);\ + return v_uint##tp1##x##num1(vnclipu_vx_u##tp1##m1((vuint##tp2##m2_t)val, n, num1)); \ +} \ +template inline \ +void v_rshr_pack_u_store(_Tp* ptr, const v_int##tp2##x##num2& a) \ +{ \ + vint##tp2##m2_t tmp = vundefined_##i##tp2##m2(); \ + tmp = vset_##i##tp2##m2(tmp, 0, a.val); \ + vint##tp2##m2_t val_ = vmax_vx_i##tp2##m2(tmp, 0, num1);\ + vuint##tp1##m1_t val = vnclipu_vx_u##tp1##m1((vuint##tp2##m2_t)val_, n, num1); \ + return vse_v_u##tp1##m1(ptr, val, num2);\ +} +OPENCV_HAL_IMPL_RISCVV_PACK_U(8, 16, 16, 8, unsigned char ) +OPENCV_HAL_IMPL_RISCVV_PACK_U(16, 8, 32, 4, unsigned short) + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + +// saturating multiply 8-bit, 16-bit +#define OPENCV_HAL_IMPL_RISCVV_MUL_SAT(_Tpvec, _Tpwvec) \ + inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ + { \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ + } \ + inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ + { a = a * b; return a; } + +OPENCV_HAL_IMPL_RISCVV_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_RISCVV_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_RISCVV_MUL_SAT(v_int16x8, v_int32x4) +OPENCV_HAL_IMPL_RISCVV_MUL_SAT(v_uint16x8, v_uint32x4) + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +static const signed char popCountTable[256] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; + +inline vuint8m1_t vcnt_u8(vuint8m1_t val){ + vuint8m1_t v0 = val & 1; + return vlxe_v_u8m1((unsigned char*)popCountTable, val >> 1, 16)+v0; +} + +inline v_uint8x16 +v_popcount(const v_uint8x16& a) +{ + return v_uint8x16(vcnt_u8(a.val)); +} + +inline v_uint8x16 +v_popcount(const v_int8x16& a) +{ + return v_uint8x16(vcnt_u8((vuint8m1_t)a.val)); +} + +inline v_uint16x8 +v_popcount(const v_uint16x8& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0x0E0C0A0806040200, 0, 0x0F0D0B0907050301, 0}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint16m2_t res = vwaddu_vv_u16m2(vget_u8m2_u8m1(tmp, 0), vget_u8m2_u8m1(tmp, 1), 8); + return v_uint16x8(vget_u16m2_u16m1(res, 0)); +} + +inline v_uint16x8 +v_popcount(const v_int16x8& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0x0E0C0A0806040200, 0, 0x0F0D0B0907050301, 0}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint16m2_t res = vwaddu_vv_u16m2(vget_u8m2_u8m1(tmp, 0), vget_u8m2_u8m1(tmp, 1), 8); + return v_uint16x8(vget_u16m2_u16m1(res, 0)); +} + +inline v_uint32x4 +v_popcount(const v_uint32x4& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0xFFFFFFFF0C080400, 0xFFFFFFFF0D090501, + 0xFFFFFFFF0E0A0602, 0xFFFFFFFF0F0B0703}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint16m2_t res_ = vwaddu_vv_u16m2(vget_u8m2_u8m1(tmp, 0), vget_u8m2_u8m1(tmp, 1), 16); + vuint32m2_t res = vwaddu_vv_u32m2(vget_u16m2_u16m1(res_, 0), vget_u16m2_u16m1(res_, 1), 8); + return v_uint32x4(vget_u32m2_u32m1(res, 0)); +} + +inline v_uint32x4 +v_popcount(const v_int32x4& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0xFFFFFFFF0C080400, 0xFFFFFFFF0D090501, + 0xFFFFFFFF0E0A0602, 0xFFFFFFFF0F0B0703}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint16m2_t res_ = vwaddu_vv_u16m2(vget_u8m2_u8m1(tmp, 0), vget_u8m2_u8m1(tmp, 1), 16); + vuint32m2_t res = vwaddu_vv_u32m2(vget_u16m2_u16m1(res_, 0), vget_u16m2_u16m1(res_, 1), 8); + return v_uint32x4(vget_u32m2_u32m1(res, 0)); +} + +inline v_uint64x2 +v_popcount(const v_uint64x2& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0x0706050403020100, 0x0000000000000000, + 0x0F0E0D0C0B0A0908, 0x0000000000000000}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint8m1_t zero = vmv_v_x_u8m1(0, 16); + vuint8m1_t res1 = zero; + vuint8m1_t res2 = zero; + res1 = vredsum_vs_u8m1_u8m1(res1, vget_u8m2_u8m1(tmp, 0), zero, 8); + res2 = vredsum_vs_u8m1_u8m1(res2, vget_u8m2_u8m1(tmp, 1), zero, 8); + + return v_uint64x2((unsigned long)vmv_x_s_u8m1_u8(res1, 8), (unsigned long)vmv_x_s_u8m1_u8(res2, 8)); +} + +inline v_uint64x2 +v_popcount(const v_int64x2& a) +{ + vuint8m2_t tmp = vundefined_u8m2(); + tmp = vset_u8m2(tmp, 0, vcnt_u8((vuint8m1_t)a.val)); + vuint64m2_t mask = (vuint64m2_t){0x0706050403020100, 0x0000000000000000, + 0x0F0E0D0C0B0A0908, 0x0000000000000000}; + tmp = vrgather_vv_u8m2(tmp, (vuint8m2_t)mask, 32); \ + vuint8m1_t zero = vmv_v_x_u8m1(0, 16); + vuint8m1_t res1 = zero; + vuint8m1_t res2 = zero; + res1 = vredsum_vs_u8m1_u8m1(res1, vget_u8m2_u8m1(tmp, 0), zero, 8); + res2 = vredsum_vs_u8m1_u8m1(res2, vget_u8m2_u8m1(tmp, 1), zero, 8); + + return v_uint64x2((unsigned long)vmv_x_s_u8m1_u8(res1, 8), (unsigned long)vmv_x_s_u8m1_u8(res2, 8)); +} + +#define SMASK 1, 2, 4, 8, 16, 32, 64, 128 +inline int v_signmask(const v_uint8x16& a) +{ + vuint8m1_t t0 = vsrl_vx_u8m1(a.val, 7, 16); + vuint8m1_t m1 = (vuint8m1_t){SMASK, SMASK}; + vuint16m2_t t1 = vwmulu_vv_u16m2(t0, m1, 16); + vuint32m1_t res = vmv_v_x_u32m1(0, 4); + vuint32m2_t t2 = vwmulu_vx_u32m2(vget_u16m2_u16m1(t1, 1), 256, 8); + res = vredsum_vs_u32m2_u32m1(res, t2, res, 8); + res = vwredsumu_vs_u16m1_u32m1(res, vget_u16m2_u16m1(t1, 0), res, 8); + return vmv_x_s_u32m1_u32(res, 8); +} +inline int v_signmask(const v_int8x16& a) +{ + vuint8m1_t t0 = vsrl_vx_u8m1((vuint8m1_t)a.val, 7, 16); + vuint8m1_t m1 = (vuint8m1_t){SMASK, SMASK}; + vint16m2_t t1 = (vint16m2_t)vwmulu_vv_u16m2(t0, m1, 16); + vint32m1_t res = vmv_v_x_i32m1(0, 4); + vint32m2_t t2 = vwmul_vx_i32m2(vget_i16m2_i16m1(t1, 1), 256, 8); + res = vredsum_vs_i32m2_i32m1(res, t2, res, 8); + res = vwredsum_vs_i16m1_i32m1(res, vget_i16m2_i16m1(t1, 0), res, 8); + return vmv_x_s_i32m1_i32(res, 8); +} + +inline int v_signmask(const v_int16x8& a) +{ + vint16m1_t t0 = (vint16m1_t)vsrl_vx_u16m1((vuint16m1_t)a.val, 15, 8); + vint16m1_t m1 = (vint16m1_t){SMASK}; + vint16m1_t t1 = vmul_vv_i16m1(t0, m1, 8); + vint16m1_t res = vmv_v_x_i16m1(0, 8); + res = vredsum_vs_i16m1_i16m1(res, t1, res, 8); + return vmv_x_s_i16m1_i16(res, 8); +} +inline int v_signmask(const v_uint16x8& a) +{ + vint16m1_t t0 = (vint16m1_t)vsrl_vx_u16m1((vuint16m1_t)a.val, 15, 8); + vint16m1_t m1 = (vint16m1_t){SMASK}; + vint16m1_t t1 = vmul_vv_i16m1(t0, m1, 8); + vint16m1_t res = vmv_v_x_i16m1(0, 8); + res = vredsum_vs_i16m1_i16m1(res, t1, res, 8); + return vmv_x_s_i16m1_i16(res, 8); +} +inline int v_signmask(const v_int32x4& a) +{ + vint32m1_t t0 = (vint32m1_t)vsrl_vx_u32m1((vuint32m1_t)a.val, 31, 4); + vint32m1_t m1 = (vint32m1_t){1, 2, 4, 8}; + vint32m1_t res = vmv_v_x_i32m1(0, 4); + vint32m1_t t1 = vmul_vv_i32m1(t0, m1, 4); + res = vredsum_vs_i32m1_i32m1(res, t1, res, 4); + return vmv_x_s_i32m1_i32(res, 4); +} +inline int v_signmask(const v_uint32x4& a) +{ + vint32m1_t t0 = (vint32m1_t)vsrl_vx_u32m1(a.val, 31, 4); + vint32m1_t m1 = (vint32m1_t){1, 2, 4, 8}; + vint32m1_t res = vmv_v_x_i32m1(0, 4); + vint32m1_t t1 = vmul_vv_i32m1(t0, m1, 4); + res = vredsum_vs_i32m1_i32m1(res, t1, res, 4); + return vmv_x_s_i32m1_i32(res, 4); +} +inline int v_signmask(const v_uint64x2& a) +{ + vuint64m1_t v0 = vsrl_vx_u64m1(a.val, 63, 2); + int res = (int)vext_x_v_u64m1_u64(v0, 0, 2) + ((int)vext_x_v_u64m1_u64(v0, 1, 2) << 1); + return res; +} +inline int v_signmask(const v_int64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_u64(a)); } +inline int v_signmask(const v_float32x4& a) +{ + vint32m1_t t0 = (vint32m1_t)vsrl_vx_u32m1((vuint32m1_t)a.val, 31, 4); + vint32m1_t m1 = (vint32m1_t){1, 2, 4, 8}; + vint32m1_t res = vmv_v_x_i32m1(0, 4); + vint32m1_t t1 = vmul_vv_i32m1(t0, m1, 4); + res = vredsum_vs_i32m1_i32m1(res, t1, res, 4); + return vmv_x_s_i32m1_i32(res, 4); +} + +inline int v_scan_forward(const v_int8x16& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_uint8x16& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_int16x8& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_uint16x8& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_int32x4& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_uint32x4& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_float32x4& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_int64x2& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } +inline int v_scan_forward(const v_uint64x2& a) { +int val = v_signmask(a); +if(val==0) return 0; +else return trailingZeros32(val); } + +#define OPENCV_HAL_IMPL_RISCVV_CHECK_ALLANY(_Tpvec, suffix, _T, shift, num) \ +inline bool v_check_all(const v_##_Tpvec& a) \ +{ \ + suffix##m1_t v0 = vsrl_vx_##_T(vnot_v_##_T(a.val, num), shift, num); \ + vuint32m1_t v1 = vuint32m1_t(v0); \ + return (v1[0] | v1[1] | v1[2] | v1[3]) == 0; \ +} \ +inline bool v_check_any(const v_##_Tpvec& a) \ +{ \ + suffix##m1_t v0 = vsrl_vx_##_T(a.val, shift, num); \ + vuint32m1_t v1 = vuint32m1_t(v0); \ + return (v1[0] | v1[1] | v1[2] | v1[3]) != 0; \ +} + +OPENCV_HAL_IMPL_RISCVV_CHECK_ALLANY(uint8x16, vuint8, u8m1, 7, 16) +OPENCV_HAL_IMPL_RISCVV_CHECK_ALLANY(uint16x8, vuint16, u16m1, 15, 8) +OPENCV_HAL_IMPL_RISCVV_CHECK_ALLANY(uint32x4, vuint32, u32m1, 31, 4) +OPENCV_HAL_IMPL_RISCVV_CHECK_ALLANY(uint64x2, vuint64, u64m1, 63, 2) + +inline bool v_check_all(const v_int8x16& a) +{ return v_check_all(v_reinterpret_as_u8(a)); } +inline bool v_check_all(const v_int16x8& a) +{ return v_check_all(v_reinterpret_as_u16(a)); } +inline bool v_check_all(const v_int32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_u32(a)); } +inline bool v_check_all(const v_int64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_u64(a)); } + +inline bool v_check_any(const v_int8x16& a) +{ return v_check_any(v_reinterpret_as_u8(a)); } +inline bool v_check_any(const v_int16x8& a) +{ return v_check_any(v_reinterpret_as_u16(a)); } +inline bool v_check_any(const v_int32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_u32(a)); } +inline bool v_check_any(const v_int64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_u64(a)); } + +#define OPENCV_HAL_IMPL_RISCVV_SELECT(_Tpvec, suffix, _Tpvec2, num) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(vmerge_vvm_##suffix(_Tpvec2(mask.val), b.val, a.val, num)); \ +} + +OPENCV_HAL_IMPL_RISCVV_SELECT(v_int8x16, i8m1, vbool8_t, 16) +OPENCV_HAL_IMPL_RISCVV_SELECT(v_int16x8, i16m1, vbool16_t, 8) +OPENCV_HAL_IMPL_RISCVV_SELECT(v_int32x4, i32m1, vbool32_t, 4) +OPENCV_HAL_IMPL_RISCVV_SELECT(v_uint8x16, u8m1, vbool8_t, 16) +OPENCV_HAL_IMPL_RISCVV_SELECT(v_uint16x8, u16m1, vbool16_t, 8) +OPENCV_HAL_IMPL_RISCVV_SELECT(v_uint32x4, u32m1, vbool32_t, 4) +inline v_float32x4 v_select(const v_float32x4& mask, const v_float32x4& a, const v_float32x4& b) +{ + return v_float32x4((vfloat32m1_t)vmerge_vvm_u32m1((vbool32_t)mask.val, (vuint32m1_t)b.val, (vuint32m1_t)a.val, 4)); +} +inline v_float64x2 v_select(const v_float64x2& mask, const v_float64x2& a, const v_float64x2& b) +{ + return v_float64x2((vfloat64m1_t)vmerge_vvm_u64m1((vbool64_t)mask.val, (vuint64m1_t)b.val, (vuint64m1_t)a.val, 2)); +} + +#define OPENCV_HAL_IMPL_RISCVV_EXPAND(add, _Tpvec, _Tpwvec, _Tp, _Tp1, num1, _Tp2, num2, _T1, _T2) \ +inline void v_expand(const _Tpvec& a, v_##_Tpwvec& b0, v_##_Tpwvec& b1) \ +{ \ + _T1##_t b = vw##add##_vv_##_Tp2##m2(a.val, vmv_v_x_##_Tp1(0, num1), num1); \ + b0.val = vget_##_Tp2##m2_##_Tp2##m1(b, 0); \ + b1.val = vget_##_Tp2##m2_##_Tp2##m1(b, 1); \ +} \ +inline v_##_Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + _T1##_t b = vw##add##_vv_##_Tp2##m2(a.val, vmv_v_x_##_Tp1(0, num2), num2); \ + return v_##_Tpwvec(vget_##_Tp2##m2_##_Tp2##m1(b, 0)); \ +} \ +inline v_##_Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + _T1##_t b = vw##add##_vv_##_Tp2##m2(a.val, vmv_v_x_##_Tp1(0, num1), num1); \ + return v_##_Tpwvec(vget_##_Tp2##m2_##_Tp2##m1(b, 1)); \ +} \ +inline v_##_Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + _T2##_t val = vle##_v_##_Tp1(ptr, num2); \ + _T1##_t b = vw##add##_vv_##_Tp2##m2(val, vmv_v_x_##_Tp1(0, num2), num2); \ + return v_##_Tpwvec(vget_##_Tp2##m2_##_Tp2##m1(b, 0)); \ +} + +OPENCV_HAL_IMPL_RISCVV_EXPAND(addu, v_uint8x16, uint16x8, uchar, u8m1, 16, u16, 8, vuint16m2, vuint8m1) +OPENCV_HAL_IMPL_RISCVV_EXPAND(addu, v_uint16x8, uint32x4, ushort, u16m1, 8, u32, 4, vuint32m2, vuint16m1) +OPENCV_HAL_IMPL_RISCVV_EXPAND(addu, v_uint32x4, uint64x2, uint, u32m1, 4, u64, 2, vuint64m2, vuint32m1) +OPENCV_HAL_IMPL_RISCVV_EXPAND(add, v_int8x16, int16x8, schar, i8m1, 16, i16, 8, vint16m2, vint8m1) +OPENCV_HAL_IMPL_RISCVV_EXPAND(add, v_int16x8, int32x4, short, i16m1, 8, i32, 4, vint32m2, vint16m1) +OPENCV_HAL_IMPL_RISCVV_EXPAND(add, v_int32x4, int64x2, int, i32m1, 4, i64, 2, vint64m2, vint32m1) + +inline v_uint32x4 v_load_expand_q(const uchar* ptr) +{ + vuint16m2_t b = vundefined_u16m2(); + vuint32m2_t c = vundefined_u32m2(); + vuint8m1_t val = vle_v_u8m1(ptr, 4); \ + b = vwaddu_vv_u16m2(val, vmv_v_x_u8m1(0, 4), 4); \ + c = vwaddu_vv_u32m2(vget_u16m2_u16m1(b, 0), vmv_v_x_u16m1(0, 4), 4); \ + return v_uint32x4(vget_u32m2_u32m1(c, 0)); +} + +inline v_int32x4 v_load_expand_q(const schar* ptr) +{ + vint16m2_t b = vundefined_i16m2(); + vint32m2_t c = vundefined_i32m2(); + vint8m1_t val = vle_v_i8m1(ptr, 4); \ + b = vwadd_vv_i16m2(val, vmv_v_x_i8m1(0, 4), 4); \ + c = vwadd_vv_i32m2(vget_i16m2_i16m1(b, 0), vmv_v_x_i16m1(0, 4), 4); \ + return v_int32x4(vget_i32m2_i32m1(c, 0)); +} +#define VITL_16 (vuint32m2_t){0x11011000, 0x13031202, 0x15051404, 0x17071606, 0x19091808, 0x1B0B1A0A, 0x1D0D1C0C, 0x1F0F1E0E} +#define VITL_8 (vuint32m2_t){0x00080000, 0x00090001, 0x000A0002, 0x000B0003, 0x000C0004, 0x000D0005, 0x000E0006, 0x000F0007} +#define VITL_4 (vuint32m2_t){0x00000000, 0x00000004, 0x00000001, 0x00000005, 0x00000002, 0x00000006, 0x00000003, 0x00000007} +#define VITL_2 (vuint32m2_t){0, 0, 2, 0, 1, 0, 3, 0} + +#define OPENCV_HAL_IMPL_RISCVV_UNPACKS(_Tpvec, _Tp, _T, _UTp, _UT, num, num2, len, numh) \ +inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \ +{ \ + v##_Tp##m2_t tmp = vundefined_##_T##m2();\ + tmp = vset_##_T##m2(tmp, 0, a0.val); \ + tmp = vset_##_T##m2(tmp, 1, a1.val); \ + vuint32m2_t mask = VITL_##num; \ + tmp = (v##_Tp##m2_t)vrgather_vv_##_T##m2((v##_Tp##m2_t)tmp, (v##_UTp##m2_t)mask, num2); \ + b0.val = vget_##_T##m2_##_T##m1(tmp, 0); \ + b1.val = vget_##_T##m2_##_T##m1(tmp, 1); \ +} \ +inline v_##_Tpvec v_combine_low(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + v##_Tp##m1_t b0 = vslideup_vx_##_T##m1_m(vmset_m_##len(num), a.val, b.val, numh, num); \ + return v_##_Tpvec(b0);\ +} \ +inline v_##_Tpvec v_combine_high(const v_##_Tpvec& a, const v_##_Tpvec& b) \ +{ \ + v##_Tp##m1_t b0 = vslidedown_vx_##_T##m1(b.val, numh, num); \ + v##_Tp##m1_t a0 = vslidedown_vx_##_T##m1(a.val, numh, num); \ + v##_Tp##m1_t b1 = vslideup_vx_##_T##m1_m(vmset_m_##len(num), a0, b0, numh, num); \ + return v_##_Tpvec(b1);\ +} \ +inline void v_recombine(const v_##_Tpvec& a, const v_##_Tpvec& b, v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + c.val = vslideup_vx_##_T##m1_m(vmset_m_##len(num), a.val, b.val, numh, num); \ + v##_Tp##m1_t b0 = vslidedown_vx_##_T##m1(b.val, numh, num); \ + v##_Tp##m1_t a0 = vslidedown_vx_##_T##m1(a.val, numh, num); \ + d.val = vslideup_vx_##_T##m1_m(vmset_m_##len(num), a0, b0, numh, num); \ +} + +OPENCV_HAL_IMPL_RISCVV_UNPACKS(uint8x16, uint8, u8, uint8, u8, 16, 32, b8, 8) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(int8x16, int8, i8, uint8, u8, 16, 32, b8, 8) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(uint16x8, uint16, u16, uint16, u16, 8, 16, b16, 4) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(int16x8, int16, i16, uint16, u16, 8, 16, b16, 4) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(uint32x4, uint32, u32, uint32, u32, 4, 8, b32, 2) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(int32x4, int32, i32, uint32, u32, 4, 8, b32, 2) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(float32x4, float32, f32, uint32, u32, 4, 8, b32, 2) +OPENCV_HAL_IMPL_RISCVV_UNPACKS(float64x2, float64, f64, uint64, u64, 2, 4, b64, 1) + +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ + vuint64m1_t mask = (vuint64m1_t){0x08090A0B0C0D0E0F, 0x0001020304050607}; + return v_uint8x16(vrgather_vv_u8m1(a.val, (vuint8m1_t)mask, 16)); +} +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ + vint64m1_t mask = (vint64m1_t){0x08090A0B0C0D0E0F, 0x0001020304050607}; + return v_int8x16(vrgather_vv_i8m1(a.val, (vuint8m1_t)mask, 16)); +} + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ + vuint64m1_t mask = (vuint64m1_t){0x0004000500060007, 0x000000100020003}; + return v_uint16x8(vrgather_vv_u16m1(a.val, (vuint16m1_t)mask, 8)); +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ + vint64m1_t mask = (vint64m1_t){0x0004000500060007, 0x000000100020003}; + return v_int16x8(vrgather_vv_i16m1(a.val, (vuint16m1_t)mask, 8)); +} +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ + return v_uint32x4(vrgather_vv_u32m1(a.val, (vuint32m1_t){3, 2, 1, 0}, 4)); +} + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ + return v_int32x4(vrgather_vv_i32m1(a.val, (vuint32m1_t){3, 2, 1, 0}, 4)); +} + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ + return v_uint64x2(a.val[1], a.val[0]); +} + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ + return v_int64x2(a.val[1], a.val[0]); +} + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ + return v_float64x2(a.val[1], a.val[0]); +} + +#define OPENCV_HAL_IMPL_RISCVV_EXTRACT(_Tpvec, suffix, size) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) \ +{ return v_rotate_right(a, b);} +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_uint8x16, u8, 0) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_int8x16, s8, 0) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_uint16x8, u16, 1) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_int16x8, s16, 1) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_uint32x4, u32, 2) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_int32x4, s32, 2) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_uint64x2, u64, 3) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_int64x2, s64, 3) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_float32x4, f32, 2) +OPENCV_HAL_IMPL_RISCVV_EXTRACT(v_float64x2, f64, 3) + + +#define OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(_Tpvec, _Tp, suffix) \ +template inline _Tp v_extract_n(_Tpvec v) { return v.val[i]; } + +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_int8x16, schar, s8) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_int16x8, short, s16) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_uint32x4, uint, u32) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_int32x4, int, s32) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_int64x2, int64, s64) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_float32x4, float, f32) +OPENCV_HAL_IMPL_RISCVV_EXTRACT_N(v_float64x2, double, f64) + +#define OPENCV_HAL_IMPL_RISCVV_BROADCAST(_Tpvec, _Tp, num) \ +template inline _Tpvec v_broadcast_element(_Tpvec v) { return _Tpvec(vrgather_vx_##_Tp##m1(v.val, i, num)); } + +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_uint8x16, u8, 16) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_int8x16, i8, 16) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_uint16x8, u16, 8) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_int16x8, i16, 8) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_uint32x4, u32, 4) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_int32x4, i32, 4) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_uint64x2, u64, 2) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_int64x2, i64, 2) +OPENCV_HAL_IMPL_RISCVV_BROADCAST(v_float32x4, f32, 4) +inline v_int32x4 v_round(const v_float32x4& a) +{ + __builtin_riscv_fsrm(0); + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)a.val, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), a.val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} +inline v_int32x4 v_floor(const v_float32x4& a) +{ + __builtin_riscv_fsrm(2); + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)a.val, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), a.val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + __builtin_riscv_fsrm(3); + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)a.val, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), a.val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ + __builtin_riscv_fsrm(1); + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)a.val, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), a.val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +inline v_int32x4 v_round(const v_float64x2& a) +{ + __builtin_riscv_fsrm(0); + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + //_val = vset_f64m2(_val, 1, a.val); + _val = vset_f64m2(_val, 1, vfmv_v_f_f64m1(0, 2)); + vint32m1_t val = vfncvt_x_f_v_i32m1(_val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + __builtin_riscv_fsrm(0); + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + _val = vset_f64m2(_val, 1, b.val); + vint32m1_t val = vfncvt_x_f_v_i32m1(_val, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} +inline v_int32x4 v_floor(const v_float64x2& a) +{ + __builtin_riscv_fsrm(2); + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + vfloat32m1_t aval = vfncvt_f_f_v_f32m1(_val, 2); + + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)aval, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), aval, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + __builtin_riscv_fsrm(3); + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + vfloat32m1_t aval = vfncvt_f_f_v_f32m1(_val, 2); + + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)aval, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), aval, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ + __builtin_riscv_fsrm(1); + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + vfloat32m1_t aval = vfncvt_f_f_v_f32m1(_val, 2); + + vint32m1_t nan = vand_vx_i32m1((vint32m1_t)aval, 0x7f800000, 4); + vbool32_t mask = vmsne_vx_i32m1_b32(nan, 0x7f800000, 4); + vint32m1_t val = vfcvt_x_f_v_i32m1_m(mask, vmv_v_x_i32m1(0, 4), aval, 4); + __builtin_riscv_fsrm(0); + return v_int32x4(val); +} + +#define OPENCV_HAL_IMPL_RISCVV_LOAD_DEINTERLEAVED(intrin, _Tpvec, num, _Tp, _T) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b) \ +{ \ + v##_Tpvec##m1x2_t ret = intrin##2e_v_##_T##m1x2(ptr, num);\ + a.val = vget_##_T##m1x2_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x2_##_T##m1(ret, 1); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b, v_##_Tpvec##x##num& c) \ +{ \ + v##_Tpvec##m1x3_t ret = intrin##3e_v_##_T##m1x3(ptr, num);\ + a.val = vget_##_T##m1x3_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x3_##_T##m1(ret, 1); \ + c.val = vget_##_T##m1x3_##_T##m1(ret, 2); \ +}\ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b, \ + v_##_Tpvec##x##num& c, v_##_Tpvec##x##num& d) \ +{ \ + v##_Tpvec##m1x4_t ret = intrin##4e_v_##_T##m1x4(ptr, num);\ + a.val = vget_##_T##m1x4_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x4_##_T##m1(ret, 1); \ + c.val = vget_##_T##m1x4_##_T##m1(ret, 2); \ + d.val = vget_##_T##m1x4_##_T##m1(ret, 3); \ +} \ + +#define OPENCV_HAL_IMPL_RISCVV_STORE_INTERLEAVED(intrin, _Tpvec, num, _Tp, _T) \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + v##_Tpvec##m1x2_t ret = vundefined_##_T##m1x2(); \ + ret = vset_##_T##m1x2(ret, 0, a.val); \ + ret = vset_##_T##m1x2(ret, 1, b.val); \ + intrin##2e_v_##_T##m1x2(ptr, ret, num); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + const v_##_Tpvec##x##num& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + v##_Tpvec##m1x3_t ret = vundefined_##_T##m1x3(); \ + ret = vset_##_T##m1x3(ret, 0, a.val); \ + ret = vset_##_T##m1x3(ret, 1, b.val); \ + ret = vset_##_T##m1x3(ret, 2, c.val); \ + intrin##3e_v_##_T##m1x3(ptr, ret, num); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + const v_##_Tpvec##x##num& c, const v_##_Tpvec##x##num& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + v##_Tpvec##m1x4_t ret = vundefined_##_T##m1x4(); \ + ret = vset_##_T##m1x4(ret, 0, a.val); \ + ret = vset_##_T##m1x4(ret, 1, b.val); \ + ret = vset_##_T##m1x4(ret, 2, c.val); \ + ret = vset_##_T##m1x4(ret, 3, d.val); \ + intrin##4e_v_##_T##m1x4(ptr, ret, num); \ +} + +#define OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(_Tpvec, _Tp, num, ld, st, _T) \ +OPENCV_HAL_IMPL_RISCVV_LOAD_DEINTERLEAVED(ld, _Tpvec, num, _Tp, _T) \ +OPENCV_HAL_IMPL_RISCVV_STORE_INTERLEAVED(st, _Tpvec, num, _Tp, _T) + +//OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(uint8, uchar, ) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(int8, schar, 16, vlseg, vsseg, i8) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(int16, short, 8, vlseg, vsseg, i16) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(int32, int, 4, vlseg, vsseg, i32) + +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(uint8, unsigned char, 16, vlseg, vsseg, u8) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(uint16, unsigned short, 8, vlseg, vsseg, u16) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED(uint32, unsigned int, 4, vlseg, vsseg, u32) + +#define OPENCV_HAL_IMPL_RISCVV_INTERLEAVED_(_Tpvec, _Tp, num, _T) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b) \ +{ \ + v##_Tpvec##m1x2_t ret = vlseg2e_v_##_T##m1x2(ptr, num); \ + a.val = vget_##_T##m1x2_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x2_##_T##m1(ret, 1); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b, v_##_Tpvec##x##num& c) \ +{ \ + v##_Tpvec##m1x3_t ret = vlseg3e_v_##_T##m1x3(ptr, num); \ + a.val = vget_##_T##m1x3_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x3_##_T##m1(ret, 1); \ + c.val = vget_##_T##m1x3_##_T##m1(ret, 2); \ +}\ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec##x##num& a, v_##_Tpvec##x##num& b, \ + v_##_Tpvec##x##num& c, v_##_Tpvec##x##num& d) \ +{ \ + v##_Tpvec##m1x4_t ret = vlseg4e_v_##_T##m1x4(ptr, num); \ + a.val = vget_##_T##m1x4_##_T##m1(ret, 0); \ + b.val = vget_##_T##m1x4_##_T##m1(ret, 1); \ + c.val = vget_##_T##m1x4_##_T##m1(ret, 2); \ + d.val = vget_##_T##m1x4_##_T##m1(ret, 3); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + v##_Tpvec##m1x2_t ret = vundefined_##_T##m1x2(); \ + ret = vset_##_T##m1x2(ret, 0, a.val); \ + ret = vset_##_T##m1x2(ret, 1, b.val); \ + vsseg2e_v_##_T##m1x2(ptr, ret, num); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + const v_##_Tpvec##x##num& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + v##_Tpvec##m1x3_t ret = vundefined_##_T##m1x3(); \ + ret = vset_##_T##m1x3(ret, 0, a.val); \ + ret = vset_##_T##m1x3(ret, 1, b.val); \ + ret = vset_##_T##m1x3(ret, 2, c.val); \ + vsseg3e_v_##_T##m1x3(ptr, ret, num); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec##x##num& a, const v_##_Tpvec##x##num& b, \ + const v_##_Tpvec##x##num& c, const v_##_Tpvec##x##num& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + v##_Tpvec##m1x4_t ret = vundefined_##_T##m1x4(); \ + ret = vset_##_T##m1x4(ret, 0, a.val); \ + ret = vset_##_T##m1x4(ret, 1, b.val); \ + ret = vset_##_T##m1x4(ret, 2, c.val); \ + ret = vset_##_T##m1x4(ret, 3, d.val); \ + vsseg4e_v_##_T##m1x4(ptr, ret, num); \ +} +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED_(float32, float, 4, f32) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED_(float64, double, 2, f64) + +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED_(uint64, unsigned long, 2, u64) +OPENCV_HAL_IMPL_RISCVV_INTERLEAVED_(int64, long, 2, i64) + +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(vfcvt_f_x_v_f32m1(a.val, 4)); +} + +#if CV_SIMD128_64F +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + vfloat32m1_t aval = vfncvt_f_f_v_f32m1(_val, 2); + return v_float32x4(aval); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + vfloat64m2_t _val = vundefined_f64m2(); + _val = vset_f64m2(_val, 0, a.val); + _val = vset_f64m2(_val, 1, b.val); + vfloat32m1_t aval = vfncvt_f_f_v_f32m1(_val, 4); + return v_float32x4(aval); +} + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ + vfloat32m1_t val = vfcvt_f_x_v_f32m1(a.val, 4); + vfloat64m2_t _val = vfwcvt_f_f_v_f64m2(val, 4); + return v_float64x2(vget_f64m2_f64m1(_val, 0)); +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ + vfloat32m1_t val = vfcvt_f_x_v_f32m1(a.val, 4); + vfloat64m2_t _val = vfwcvt_f_f_v_f64m2(val, 4); + return v_float64x2(vget_f64m2_f64m1(_val, 1)); +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + vfloat64m2_t _val = vfwcvt_f_f_v_f64m2(a.val, 4); + return v_float64x2(vget_f64m2_f64m1(_val, 0)); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + vfloat64m2_t _val = vfwcvt_f_f_v_f64m2(a.val, 4); + return v_float64x2(vget_f64m2_f64m1(_val, 1)); +} + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ + return v_float64x2(vfcvt_f_x_v_f64m1(a.val, 2)); +} + +#endif +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + vuint64m1_t m0 = {0x0705060403010200, 0x0F0D0E0C0B090A08}; + return v_int8x16(vrgather_vv_i8m1(vec.val, (vuint8m1_t)m0, 16)); +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) +{ + return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); +} + +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + vuint64m1_t m0 = {0x0703060205010400, 0x0F0B0E0A0D090C08}; + return v_int8x16(vrgather_vv_i8m1(vec.val, (vuint8m1_t)m0, 16)); +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) +{ + return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); +} + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + vuint64m1_t m0 = {0x0706030205040100, 0x0F0E0B0A0D0C0908}; + return v_int16x8((vint16m1_t)vrgather_vv_u8m1((vuint8m1_t)vec.val, (vuint8m1_t)m0, 16)); +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + vuint64m1_t m0 = {0x0B0A030209080100, 0x0F0E07060D0C0504}; + return v_int16x8((vint16m1_t)vrgather_vv_u8m1((vuint8m1_t)(vec.val), (vuint8m1_t)m0, 16)); +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + vuint64m1_t m0 = {0x0B0A090803020100, 0x0F0E0D0C07060504}; + return v_int32x4((vint32m1_t)vrgather_vv_u8m1((vuint8m1_t)(vec.val), (vuint8m1_t)m0, 16)); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + vuint64m1_t m0 = {0x0908060504020100, 0xFFFFFFFF0E0D0C0A}; + return v_int8x16((vint8m1_t)vrgather_vv_u8m1((vuint8m1_t)(vec.val), (vuint8m1_t)m0, 16)); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + vuint64m1_t m0 = {0x0908050403020100, 0xFFFFFFFF0D0C0B0A}; + return v_int16x8((vint16m1_t)vrgather_vv_u8m1((vuint8m1_t)(vec.val), (vuint8m1_t)m0, 16)); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +#if CV_SIMD128_64F +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, + const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ + vint64m2_t v1 = vwmul_vv_i64m2(a.val, b.val, 4); + vfloat64m1_t res = vfcvt_f_x_v_f64m1(vadd_vv_i64m1(vget_i64m2_i64m1(v1, 0), vget_i64m2_i64m1(v1, 1), 2), 2); + return v_float64x2(res); +} +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ v_float64x2 res = v_dotprod_expand_fast(a, b); + return res + c; } +#endif +////// FP16 support /////// +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + vfloat16m1_t v = vle_v_f16m1((__fp16*)ptr, 4); + vfloat32m2_t v32 = vfwcvt_f_f_v_f32m2(v, 4); + return v_float32x4(vget_f32m2_f32m1(v32, 0)); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + vfloat32m2_t v32 = vundefined_f32m2(); + v32 = vset_f32m2(v32, 0, v.val); + vfloat16m1_t hv = vfncvt_f_f_v_f16m1(v32, 4); + vse_v_f16m1((__fp16*)ptr, hv, 4); +} + + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_non-policy.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_non-policy.hpp new file mode 100644 index 0000000..6e19e30 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_non-policy.hpp @@ -0,0 +1,24395 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copied from +// https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/auto-generated/rvv-v0p10-compatible-headers + +#ifndef __RVV_0P10_COMPATIBLE_HEADERS_NON_OVERLOADED_NON_POLICY_H +#define __RVV_0P10_COMPATIBLE_HEADERS_NON_OVERLOADED_NON_POLICY_H + + +#if __has_include ("riscv_vector.h") +#include +#endif +#ifndef __RISCV_VECTOR_H +#include_next +#endif + +#define vsetvl_e8mf8(...) __riscv_vsetvl_e8mf8(__VA_ARGS__) +#define vsetvl_e8mf4(...) __riscv_vsetvl_e8mf4(__VA_ARGS__) +#define vsetvl_e8mf2(...) __riscv_vsetvl_e8mf2(__VA_ARGS__) +#define vsetvl_e8m1(...) __riscv_vsetvl_e8m1(__VA_ARGS__) +#define vsetvl_e8m2(...) __riscv_vsetvl_e8m2(__VA_ARGS__) +#define vsetvl_e8m4(...) __riscv_vsetvl_e8m4(__VA_ARGS__) +#define vsetvl_e8m8(...) __riscv_vsetvl_e8m8(__VA_ARGS__) +#define vsetvl_e16mf4(...) __riscv_vsetvl_e16mf4(__VA_ARGS__) +#define vsetvl_e16mf2(...) __riscv_vsetvl_e16mf2(__VA_ARGS__) +#define vsetvl_e16m1(...) __riscv_vsetvl_e16m1(__VA_ARGS__) +#define vsetvl_e16m2(...) __riscv_vsetvl_e16m2(__VA_ARGS__) +#define vsetvl_e16m4(...) __riscv_vsetvl_e16m4(__VA_ARGS__) +#define vsetvl_e16m8(...) __riscv_vsetvl_e16m8(__VA_ARGS__) +#define vsetvl_e32mf2(...) __riscv_vsetvl_e32mf2(__VA_ARGS__) +#define vsetvl_e32m1(...) __riscv_vsetvl_e32m1(__VA_ARGS__) +#define vsetvl_e32m2(...) __riscv_vsetvl_e32m2(__VA_ARGS__) +#define vsetvl_e32m4(...) __riscv_vsetvl_e32m4(__VA_ARGS__) +#define vsetvl_e32m8(...) __riscv_vsetvl_e32m8(__VA_ARGS__) +#define vsetvl_e64m1(...) __riscv_vsetvl_e64m1(__VA_ARGS__) +#define vsetvl_e64m2(...) __riscv_vsetvl_e64m2(__VA_ARGS__) +#define vsetvl_e64m4(...) __riscv_vsetvl_e64m4(__VA_ARGS__) +#define vsetvl_e64m8(...) __riscv_vsetvl_e64m8(__VA_ARGS__) +#define vsetvlmax_e8mf8(...) __riscv_vsetvlmax_e8mf8(__VA_ARGS__) +#define vsetvlmax_e8mf4(...) __riscv_vsetvlmax_e8mf4(__VA_ARGS__) +#define vsetvlmax_e8mf2(...) __riscv_vsetvlmax_e8mf2(__VA_ARGS__) +#define vsetvlmax_e8m1(...) __riscv_vsetvlmax_e8m1(__VA_ARGS__) +#define vsetvlmax_e8m2(...) __riscv_vsetvlmax_e8m2(__VA_ARGS__) +#define vsetvlmax_e8m4(...) __riscv_vsetvlmax_e8m4(__VA_ARGS__) +#define vsetvlmax_e8m8(...) __riscv_vsetvlmax_e8m8(__VA_ARGS__) +#define vsetvlmax_e16mf4(...) __riscv_vsetvlmax_e16mf4(__VA_ARGS__) +#define vsetvlmax_e16mf2(...) __riscv_vsetvlmax_e16mf2(__VA_ARGS__) +#define vsetvlmax_e16m1(...) __riscv_vsetvlmax_e16m1(__VA_ARGS__) +#define vsetvlmax_e16m2(...) __riscv_vsetvlmax_e16m2(__VA_ARGS__) +#define vsetvlmax_e16m4(...) __riscv_vsetvlmax_e16m4(__VA_ARGS__) +#define vsetvlmax_e16m8(...) __riscv_vsetvlmax_e16m8(__VA_ARGS__) +#define vsetvlmax_e32mf2(...) __riscv_vsetvlmax_e32mf2(__VA_ARGS__) +#define vsetvlmax_e32m1(...) __riscv_vsetvlmax_e32m1(__VA_ARGS__) +#define vsetvlmax_e32m2(...) __riscv_vsetvlmax_e32m2(__VA_ARGS__) +#define vsetvlmax_e32m4(...) __riscv_vsetvlmax_e32m4(__VA_ARGS__) +#define vsetvlmax_e32m8(...) __riscv_vsetvlmax_e32m8(__VA_ARGS__) +#define vsetvlmax_e64m1(...) __riscv_vsetvlmax_e64m1(__VA_ARGS__) +#define vsetvlmax_e64m2(...) __riscv_vsetvlmax_e64m2(__VA_ARGS__) +#define vsetvlmax_e64m4(...) __riscv_vsetvlmax_e64m4(__VA_ARGS__) +#define vsetvlmax_e64m8(...) __riscv_vsetvlmax_e64m8(__VA_ARGS__) +#define vle16_v_f16mf4(...) __riscv_vle16_v_f16mf4(__VA_ARGS__) +#define vle16_v_f16mf2(...) __riscv_vle16_v_f16mf2(__VA_ARGS__) +#define vle16_v_f16m1(...) __riscv_vle16_v_f16m1(__VA_ARGS__) +#define vle16_v_f16m2(...) __riscv_vle16_v_f16m2(__VA_ARGS__) +#define vle16_v_f16m4(...) __riscv_vle16_v_f16m4(__VA_ARGS__) +#define vle16_v_f16m8(...) __riscv_vle16_v_f16m8(__VA_ARGS__) +#define vle32_v_f32mf2(...) __riscv_vle32_v_f32mf2(__VA_ARGS__) +#define vle32_v_f32m1(...) __riscv_vle32_v_f32m1(__VA_ARGS__) +#define vle32_v_f32m2(...) __riscv_vle32_v_f32m2(__VA_ARGS__) +#define vle32_v_f32m4(...) __riscv_vle32_v_f32m4(__VA_ARGS__) +#define vle32_v_f32m8(...) __riscv_vle32_v_f32m8(__VA_ARGS__) +#define vle64_v_f64m1(...) __riscv_vle64_v_f64m1(__VA_ARGS__) +#define vle64_v_f64m2(...) __riscv_vle64_v_f64m2(__VA_ARGS__) +#define vle64_v_f64m4(...) __riscv_vle64_v_f64m4(__VA_ARGS__) +#define vle64_v_f64m8(...) __riscv_vle64_v_f64m8(__VA_ARGS__) +#define vle8_v_i8mf8(...) __riscv_vle8_v_i8mf8(__VA_ARGS__) +#define vle8_v_i8mf4(...) __riscv_vle8_v_i8mf4(__VA_ARGS__) +#define vle8_v_i8mf2(...) __riscv_vle8_v_i8mf2(__VA_ARGS__) +#define vle8_v_i8m1(...) __riscv_vle8_v_i8m1(__VA_ARGS__) +#define vle8_v_i8m2(...) __riscv_vle8_v_i8m2(__VA_ARGS__) +#define vle8_v_i8m4(...) __riscv_vle8_v_i8m4(__VA_ARGS__) +#define vle8_v_i8m8(...) __riscv_vle8_v_i8m8(__VA_ARGS__) +#define vle16_v_i16mf4(...) __riscv_vle16_v_i16mf4(__VA_ARGS__) +#define vle16_v_i16mf2(...) __riscv_vle16_v_i16mf2(__VA_ARGS__) +#define vle16_v_i16m1(...) __riscv_vle16_v_i16m1(__VA_ARGS__) +#define vle16_v_i16m2(...) __riscv_vle16_v_i16m2(__VA_ARGS__) +#define vle16_v_i16m4(...) __riscv_vle16_v_i16m4(__VA_ARGS__) +#define vle16_v_i16m8(...) __riscv_vle16_v_i16m8(__VA_ARGS__) +#define vle32_v_i32mf2(...) __riscv_vle32_v_i32mf2(__VA_ARGS__) +#define vle32_v_i32m1(...) __riscv_vle32_v_i32m1(__VA_ARGS__) +#define vle32_v_i32m2(...) __riscv_vle32_v_i32m2(__VA_ARGS__) +#define vle32_v_i32m4(...) __riscv_vle32_v_i32m4(__VA_ARGS__) +#define vle32_v_i32m8(...) __riscv_vle32_v_i32m8(__VA_ARGS__) +#define vle64_v_i64m1(...) __riscv_vle64_v_i64m1(__VA_ARGS__) +#define vle64_v_i64m2(...) __riscv_vle64_v_i64m2(__VA_ARGS__) +#define vle64_v_i64m4(...) __riscv_vle64_v_i64m4(__VA_ARGS__) +#define vle64_v_i64m8(...) __riscv_vle64_v_i64m8(__VA_ARGS__) +#define vle8_v_u8mf8(...) __riscv_vle8_v_u8mf8(__VA_ARGS__) +#define vle8_v_u8mf4(...) __riscv_vle8_v_u8mf4(__VA_ARGS__) +#define vle8_v_u8mf2(...) __riscv_vle8_v_u8mf2(__VA_ARGS__) +#define vle8_v_u8m1(...) __riscv_vle8_v_u8m1(__VA_ARGS__) +#define vle8_v_u8m2(...) __riscv_vle8_v_u8m2(__VA_ARGS__) +#define vle8_v_u8m4(...) __riscv_vle8_v_u8m4(__VA_ARGS__) +#define vle8_v_u8m8(...) __riscv_vle8_v_u8m8(__VA_ARGS__) +#define vle16_v_u16mf4(...) __riscv_vle16_v_u16mf4(__VA_ARGS__) +#define vle16_v_u16mf2(...) __riscv_vle16_v_u16mf2(__VA_ARGS__) +#define vle16_v_u16m1(...) __riscv_vle16_v_u16m1(__VA_ARGS__) +#define vle16_v_u16m2(...) __riscv_vle16_v_u16m2(__VA_ARGS__) +#define vle16_v_u16m4(...) __riscv_vle16_v_u16m4(__VA_ARGS__) +#define vle16_v_u16m8(...) __riscv_vle16_v_u16m8(__VA_ARGS__) +#define vle32_v_u32mf2(...) __riscv_vle32_v_u32mf2(__VA_ARGS__) +#define vle32_v_u32m1(...) __riscv_vle32_v_u32m1(__VA_ARGS__) +#define vle32_v_u32m2(...) __riscv_vle32_v_u32m2(__VA_ARGS__) +#define vle32_v_u32m4(...) __riscv_vle32_v_u32m4(__VA_ARGS__) +#define vle32_v_u32m8(...) __riscv_vle32_v_u32m8(__VA_ARGS__) +#define vle64_v_u64m1(...) __riscv_vle64_v_u64m1(__VA_ARGS__) +#define vle64_v_u64m2(...) __riscv_vle64_v_u64m2(__VA_ARGS__) +#define vle64_v_u64m4(...) __riscv_vle64_v_u64m4(__VA_ARGS__) +#define vle64_v_u64m8(...) __riscv_vle64_v_u64m8(__VA_ARGS__) +// masked functions +#define vle16_v_f16mf4_m(...) __riscv_vle16_v_f16mf4_tumu(__VA_ARGS__) +#define vle16_v_f16mf2_m(...) __riscv_vle16_v_f16mf2_tumu(__VA_ARGS__) +#define vle16_v_f16m1_m(...) __riscv_vle16_v_f16m1_tumu(__VA_ARGS__) +#define vle16_v_f16m2_m(...) __riscv_vle16_v_f16m2_tumu(__VA_ARGS__) +#define vle16_v_f16m4_m(...) __riscv_vle16_v_f16m4_tumu(__VA_ARGS__) +#define vle16_v_f16m8_m(...) __riscv_vle16_v_f16m8_tumu(__VA_ARGS__) +#define vle32_v_f32mf2_m(...) __riscv_vle32_v_f32mf2_tumu(__VA_ARGS__) +#define vle32_v_f32m1_m(...) __riscv_vle32_v_f32m1_tumu(__VA_ARGS__) +#define vle32_v_f32m2_m(...) __riscv_vle32_v_f32m2_tumu(__VA_ARGS__) +#define vle32_v_f32m4_m(...) __riscv_vle32_v_f32m4_tumu(__VA_ARGS__) +#define vle32_v_f32m8_m(...) __riscv_vle32_v_f32m8_tumu(__VA_ARGS__) +#define vle64_v_f64m1_m(...) __riscv_vle64_v_f64m1_tumu(__VA_ARGS__) +#define vle64_v_f64m2_m(...) __riscv_vle64_v_f64m2_tumu(__VA_ARGS__) +#define vle64_v_f64m4_m(...) __riscv_vle64_v_f64m4_tumu(__VA_ARGS__) +#define vle64_v_f64m8_m(...) __riscv_vle64_v_f64m8_tumu(__VA_ARGS__) +#define vle8_v_i8mf8_m(...) __riscv_vle8_v_i8mf8_tumu(__VA_ARGS__) +#define vle8_v_i8mf4_m(...) __riscv_vle8_v_i8mf4_tumu(__VA_ARGS__) +#define vle8_v_i8mf2_m(...) __riscv_vle8_v_i8mf2_tumu(__VA_ARGS__) +#define vle8_v_i8m1_m(...) __riscv_vle8_v_i8m1_tumu(__VA_ARGS__) +#define vle8_v_i8m2_m(...) __riscv_vle8_v_i8m2_tumu(__VA_ARGS__) +#define vle8_v_i8m4_m(...) __riscv_vle8_v_i8m4_tumu(__VA_ARGS__) +#define vle8_v_i8m8_m(...) __riscv_vle8_v_i8m8_tumu(__VA_ARGS__) +#define vle16_v_i16mf4_m(...) __riscv_vle16_v_i16mf4_tumu(__VA_ARGS__) +#define vle16_v_i16mf2_m(...) __riscv_vle16_v_i16mf2_tumu(__VA_ARGS__) +#define vle16_v_i16m1_m(...) __riscv_vle16_v_i16m1_tumu(__VA_ARGS__) +#define vle16_v_i16m2_m(...) __riscv_vle16_v_i16m2_tumu(__VA_ARGS__) +#define vle16_v_i16m4_m(...) __riscv_vle16_v_i16m4_tumu(__VA_ARGS__) +#define vle16_v_i16m8_m(...) __riscv_vle16_v_i16m8_tumu(__VA_ARGS__) +#define vle32_v_i32mf2_m(...) __riscv_vle32_v_i32mf2_tumu(__VA_ARGS__) +#define vle32_v_i32m1_m(...) __riscv_vle32_v_i32m1_tumu(__VA_ARGS__) +#define vle32_v_i32m2_m(...) __riscv_vle32_v_i32m2_tumu(__VA_ARGS__) +#define vle32_v_i32m4_m(...) __riscv_vle32_v_i32m4_tumu(__VA_ARGS__) +#define vle32_v_i32m8_m(...) __riscv_vle32_v_i32m8_tumu(__VA_ARGS__) +#define vle64_v_i64m1_m(...) __riscv_vle64_v_i64m1_tumu(__VA_ARGS__) +#define vle64_v_i64m2_m(...) __riscv_vle64_v_i64m2_tumu(__VA_ARGS__) +#define vle64_v_i64m4_m(...) __riscv_vle64_v_i64m4_tumu(__VA_ARGS__) +#define vle64_v_i64m8_m(...) __riscv_vle64_v_i64m8_tumu(__VA_ARGS__) +#define vle8_v_u8mf8_m(...) __riscv_vle8_v_u8mf8_tumu(__VA_ARGS__) +#define vle8_v_u8mf4_m(...) __riscv_vle8_v_u8mf4_tumu(__VA_ARGS__) +#define vle8_v_u8mf2_m(...) __riscv_vle8_v_u8mf2_tumu(__VA_ARGS__) +#define vle8_v_u8m1_m(...) __riscv_vle8_v_u8m1_tumu(__VA_ARGS__) +#define vle8_v_u8m2_m(...) __riscv_vle8_v_u8m2_tumu(__VA_ARGS__) +#define vle8_v_u8m4_m(...) __riscv_vle8_v_u8m4_tumu(__VA_ARGS__) +#define vle8_v_u8m8_m(...) __riscv_vle8_v_u8m8_tumu(__VA_ARGS__) +#define vle16_v_u16mf4_m(...) __riscv_vle16_v_u16mf4_tumu(__VA_ARGS__) +#define vle16_v_u16mf2_m(...) __riscv_vle16_v_u16mf2_tumu(__VA_ARGS__) +#define vle16_v_u16m1_m(...) __riscv_vle16_v_u16m1_tumu(__VA_ARGS__) +#define vle16_v_u16m2_m(...) __riscv_vle16_v_u16m2_tumu(__VA_ARGS__) +#define vle16_v_u16m4_m(...) __riscv_vle16_v_u16m4_tumu(__VA_ARGS__) +#define vle16_v_u16m8_m(...) __riscv_vle16_v_u16m8_tumu(__VA_ARGS__) +#define vle32_v_u32mf2_m(...) __riscv_vle32_v_u32mf2_tumu(__VA_ARGS__) +#define vle32_v_u32m1_m(...) __riscv_vle32_v_u32m1_tumu(__VA_ARGS__) +#define vle32_v_u32m2_m(...) __riscv_vle32_v_u32m2_tumu(__VA_ARGS__) +#define vle32_v_u32m4_m(...) __riscv_vle32_v_u32m4_tumu(__VA_ARGS__) +#define vle32_v_u32m8_m(...) __riscv_vle32_v_u32m8_tumu(__VA_ARGS__) +#define vle64_v_u64m1_m(...) __riscv_vle64_v_u64m1_tumu(__VA_ARGS__) +#define vle64_v_u64m2_m(...) __riscv_vle64_v_u64m2_tumu(__VA_ARGS__) +#define vle64_v_u64m4_m(...) __riscv_vle64_v_u64m4_tumu(__VA_ARGS__) +#define vle64_v_u64m8_m(...) __riscv_vle64_v_u64m8_tumu(__VA_ARGS__) +#define vse16_v_f16mf4(...) __riscv_vse16_v_f16mf4(__VA_ARGS__) +#define vse16_v_f16mf2(...) __riscv_vse16_v_f16mf2(__VA_ARGS__) +#define vse16_v_f16m1(...) __riscv_vse16_v_f16m1(__VA_ARGS__) +#define vse16_v_f16m2(...) __riscv_vse16_v_f16m2(__VA_ARGS__) +#define vse16_v_f16m4(...) __riscv_vse16_v_f16m4(__VA_ARGS__) +#define vse16_v_f16m8(...) __riscv_vse16_v_f16m8(__VA_ARGS__) +#define vse32_v_f32mf2(...) __riscv_vse32_v_f32mf2(__VA_ARGS__) +#define vse32_v_f32m1(...) __riscv_vse32_v_f32m1(__VA_ARGS__) +#define vse32_v_f32m2(...) __riscv_vse32_v_f32m2(__VA_ARGS__) +#define vse32_v_f32m4(...) __riscv_vse32_v_f32m4(__VA_ARGS__) +#define vse32_v_f32m8(...) __riscv_vse32_v_f32m8(__VA_ARGS__) +#define vse64_v_f64m1(...) __riscv_vse64_v_f64m1(__VA_ARGS__) +#define vse64_v_f64m2(...) __riscv_vse64_v_f64m2(__VA_ARGS__) +#define vse64_v_f64m4(...) __riscv_vse64_v_f64m4(__VA_ARGS__) +#define vse64_v_f64m8(...) __riscv_vse64_v_f64m8(__VA_ARGS__) +#define vse8_v_i8mf8(...) __riscv_vse8_v_i8mf8(__VA_ARGS__) +#define vse8_v_i8mf4(...) __riscv_vse8_v_i8mf4(__VA_ARGS__) +#define vse8_v_i8mf2(...) __riscv_vse8_v_i8mf2(__VA_ARGS__) +#define vse8_v_i8m1(...) __riscv_vse8_v_i8m1(__VA_ARGS__) +#define vse8_v_i8m2(...) __riscv_vse8_v_i8m2(__VA_ARGS__) +#define vse8_v_i8m4(...) __riscv_vse8_v_i8m4(__VA_ARGS__) +#define vse8_v_i8m8(...) __riscv_vse8_v_i8m8(__VA_ARGS__) +#define vse16_v_i16mf4(...) __riscv_vse16_v_i16mf4(__VA_ARGS__) +#define vse16_v_i16mf2(...) __riscv_vse16_v_i16mf2(__VA_ARGS__) +#define vse16_v_i16m1(...) __riscv_vse16_v_i16m1(__VA_ARGS__) +#define vse16_v_i16m2(...) __riscv_vse16_v_i16m2(__VA_ARGS__) +#define vse16_v_i16m4(...) __riscv_vse16_v_i16m4(__VA_ARGS__) +#define vse16_v_i16m8(...) __riscv_vse16_v_i16m8(__VA_ARGS__) +#define vse32_v_i32mf2(...) __riscv_vse32_v_i32mf2(__VA_ARGS__) +#define vse32_v_i32m1(...) __riscv_vse32_v_i32m1(__VA_ARGS__) +#define vse32_v_i32m2(...) __riscv_vse32_v_i32m2(__VA_ARGS__) +#define vse32_v_i32m4(...) __riscv_vse32_v_i32m4(__VA_ARGS__) +#define vse32_v_i32m8(...) __riscv_vse32_v_i32m8(__VA_ARGS__) +#define vse64_v_i64m1(...) __riscv_vse64_v_i64m1(__VA_ARGS__) +#define vse64_v_i64m2(...) __riscv_vse64_v_i64m2(__VA_ARGS__) +#define vse64_v_i64m4(...) __riscv_vse64_v_i64m4(__VA_ARGS__) +#define vse64_v_i64m8(...) __riscv_vse64_v_i64m8(__VA_ARGS__) +#define vse8_v_u8mf8(...) __riscv_vse8_v_u8mf8(__VA_ARGS__) +#define vse8_v_u8mf4(...) __riscv_vse8_v_u8mf4(__VA_ARGS__) +#define vse8_v_u8mf2(...) __riscv_vse8_v_u8mf2(__VA_ARGS__) +#define vse8_v_u8m1(...) __riscv_vse8_v_u8m1(__VA_ARGS__) +#define vse8_v_u8m2(...) __riscv_vse8_v_u8m2(__VA_ARGS__) +#define vse8_v_u8m4(...) __riscv_vse8_v_u8m4(__VA_ARGS__) +#define vse8_v_u8m8(...) __riscv_vse8_v_u8m8(__VA_ARGS__) +#define vse16_v_u16mf4(...) __riscv_vse16_v_u16mf4(__VA_ARGS__) +#define vse16_v_u16mf2(...) __riscv_vse16_v_u16mf2(__VA_ARGS__) +#define vse16_v_u16m1(...) __riscv_vse16_v_u16m1(__VA_ARGS__) +#define vse16_v_u16m2(...) __riscv_vse16_v_u16m2(__VA_ARGS__) +#define vse16_v_u16m4(...) __riscv_vse16_v_u16m4(__VA_ARGS__) +#define vse16_v_u16m8(...) __riscv_vse16_v_u16m8(__VA_ARGS__) +#define vse32_v_u32mf2(...) __riscv_vse32_v_u32mf2(__VA_ARGS__) +#define vse32_v_u32m1(...) __riscv_vse32_v_u32m1(__VA_ARGS__) +#define vse32_v_u32m2(...) __riscv_vse32_v_u32m2(__VA_ARGS__) +#define vse32_v_u32m4(...) __riscv_vse32_v_u32m4(__VA_ARGS__) +#define vse32_v_u32m8(...) __riscv_vse32_v_u32m8(__VA_ARGS__) +#define vse64_v_u64m1(...) __riscv_vse64_v_u64m1(__VA_ARGS__) +#define vse64_v_u64m2(...) __riscv_vse64_v_u64m2(__VA_ARGS__) +#define vse64_v_u64m4(...) __riscv_vse64_v_u64m4(__VA_ARGS__) +#define vse64_v_u64m8(...) __riscv_vse64_v_u64m8(__VA_ARGS__) +// masked functions +#define vse16_v_f16mf4_m(...) __riscv_vse16_v_f16mf4_m(__VA_ARGS__) +#define vse16_v_f16mf2_m(...) __riscv_vse16_v_f16mf2_m(__VA_ARGS__) +#define vse16_v_f16m1_m(...) __riscv_vse16_v_f16m1_m(__VA_ARGS__) +#define vse16_v_f16m2_m(...) __riscv_vse16_v_f16m2_m(__VA_ARGS__) +#define vse16_v_f16m4_m(...) __riscv_vse16_v_f16m4_m(__VA_ARGS__) +#define vse16_v_f16m8_m(...) __riscv_vse16_v_f16m8_m(__VA_ARGS__) +#define vse32_v_f32mf2_m(...) __riscv_vse32_v_f32mf2_m(__VA_ARGS__) +#define vse32_v_f32m1_m(...) __riscv_vse32_v_f32m1_m(__VA_ARGS__) +#define vse32_v_f32m2_m(...) __riscv_vse32_v_f32m2_m(__VA_ARGS__) +#define vse32_v_f32m4_m(...) __riscv_vse32_v_f32m4_m(__VA_ARGS__) +#define vse32_v_f32m8_m(...) __riscv_vse32_v_f32m8_m(__VA_ARGS__) +#define vse64_v_f64m1_m(...) __riscv_vse64_v_f64m1_m(__VA_ARGS__) +#define vse64_v_f64m2_m(...) __riscv_vse64_v_f64m2_m(__VA_ARGS__) +#define vse64_v_f64m4_m(...) __riscv_vse64_v_f64m4_m(__VA_ARGS__) +#define vse64_v_f64m8_m(...) __riscv_vse64_v_f64m8_m(__VA_ARGS__) +#define vse8_v_i8mf8_m(...) __riscv_vse8_v_i8mf8_m(__VA_ARGS__) +#define vse8_v_i8mf4_m(...) __riscv_vse8_v_i8mf4_m(__VA_ARGS__) +#define vse8_v_i8mf2_m(...) __riscv_vse8_v_i8mf2_m(__VA_ARGS__) +#define vse8_v_i8m1_m(...) __riscv_vse8_v_i8m1_m(__VA_ARGS__) +#define vse8_v_i8m2_m(...) __riscv_vse8_v_i8m2_m(__VA_ARGS__) +#define vse8_v_i8m4_m(...) __riscv_vse8_v_i8m4_m(__VA_ARGS__) +#define vse8_v_i8m8_m(...) __riscv_vse8_v_i8m8_m(__VA_ARGS__) +#define vse16_v_i16mf4_m(...) __riscv_vse16_v_i16mf4_m(__VA_ARGS__) +#define vse16_v_i16mf2_m(...) __riscv_vse16_v_i16mf2_m(__VA_ARGS__) +#define vse16_v_i16m1_m(...) __riscv_vse16_v_i16m1_m(__VA_ARGS__) +#define vse16_v_i16m2_m(...) __riscv_vse16_v_i16m2_m(__VA_ARGS__) +#define vse16_v_i16m4_m(...) __riscv_vse16_v_i16m4_m(__VA_ARGS__) +#define vse16_v_i16m8_m(...) __riscv_vse16_v_i16m8_m(__VA_ARGS__) +#define vse32_v_i32mf2_m(...) __riscv_vse32_v_i32mf2_m(__VA_ARGS__) +#define vse32_v_i32m1_m(...) __riscv_vse32_v_i32m1_m(__VA_ARGS__) +#define vse32_v_i32m2_m(...) __riscv_vse32_v_i32m2_m(__VA_ARGS__) +#define vse32_v_i32m4_m(...) __riscv_vse32_v_i32m4_m(__VA_ARGS__) +#define vse32_v_i32m8_m(...) __riscv_vse32_v_i32m8_m(__VA_ARGS__) +#define vse64_v_i64m1_m(...) __riscv_vse64_v_i64m1_m(__VA_ARGS__) +#define vse64_v_i64m2_m(...) __riscv_vse64_v_i64m2_m(__VA_ARGS__) +#define vse64_v_i64m4_m(...) __riscv_vse64_v_i64m4_m(__VA_ARGS__) +#define vse64_v_i64m8_m(...) __riscv_vse64_v_i64m8_m(__VA_ARGS__) +#define vse8_v_u8mf8_m(...) __riscv_vse8_v_u8mf8_m(__VA_ARGS__) +#define vse8_v_u8mf4_m(...) __riscv_vse8_v_u8mf4_m(__VA_ARGS__) +#define vse8_v_u8mf2_m(...) __riscv_vse8_v_u8mf2_m(__VA_ARGS__) +#define vse8_v_u8m1_m(...) __riscv_vse8_v_u8m1_m(__VA_ARGS__) +#define vse8_v_u8m2_m(...) __riscv_vse8_v_u8m2_m(__VA_ARGS__) +#define vse8_v_u8m4_m(...) __riscv_vse8_v_u8m4_m(__VA_ARGS__) +#define vse8_v_u8m8_m(...) __riscv_vse8_v_u8m8_m(__VA_ARGS__) +#define vse16_v_u16mf4_m(...) __riscv_vse16_v_u16mf4_m(__VA_ARGS__) +#define vse16_v_u16mf2_m(...) __riscv_vse16_v_u16mf2_m(__VA_ARGS__) +#define vse16_v_u16m1_m(...) __riscv_vse16_v_u16m1_m(__VA_ARGS__) +#define vse16_v_u16m2_m(...) __riscv_vse16_v_u16m2_m(__VA_ARGS__) +#define vse16_v_u16m4_m(...) __riscv_vse16_v_u16m4_m(__VA_ARGS__) +#define vse16_v_u16m8_m(...) __riscv_vse16_v_u16m8_m(__VA_ARGS__) +#define vse32_v_u32mf2_m(...) __riscv_vse32_v_u32mf2_m(__VA_ARGS__) +#define vse32_v_u32m1_m(...) __riscv_vse32_v_u32m1_m(__VA_ARGS__) +#define vse32_v_u32m2_m(...) __riscv_vse32_v_u32m2_m(__VA_ARGS__) +#define vse32_v_u32m4_m(...) __riscv_vse32_v_u32m4_m(__VA_ARGS__) +#define vse32_v_u32m8_m(...) __riscv_vse32_v_u32m8_m(__VA_ARGS__) +#define vse64_v_u64m1_m(...) __riscv_vse64_v_u64m1_m(__VA_ARGS__) +#define vse64_v_u64m2_m(...) __riscv_vse64_v_u64m2_m(__VA_ARGS__) +#define vse64_v_u64m4_m(...) __riscv_vse64_v_u64m4_m(__VA_ARGS__) +#define vse64_v_u64m8_m(...) __riscv_vse64_v_u64m8_m(__VA_ARGS__) +#define vlse16_v_f16mf4(...) __riscv_vlse16_v_f16mf4(__VA_ARGS__) +#define vlse16_v_f16mf2(...) __riscv_vlse16_v_f16mf2(__VA_ARGS__) +#define vlse16_v_f16m1(...) __riscv_vlse16_v_f16m1(__VA_ARGS__) +#define vlse16_v_f16m2(...) __riscv_vlse16_v_f16m2(__VA_ARGS__) +#define vlse16_v_f16m4(...) __riscv_vlse16_v_f16m4(__VA_ARGS__) +#define vlse16_v_f16m8(...) __riscv_vlse16_v_f16m8(__VA_ARGS__) +#define vlse32_v_f32mf2(...) __riscv_vlse32_v_f32mf2(__VA_ARGS__) +#define vlse32_v_f32m1(...) __riscv_vlse32_v_f32m1(__VA_ARGS__) +#define vlse32_v_f32m2(...) __riscv_vlse32_v_f32m2(__VA_ARGS__) +#define vlse32_v_f32m4(...) __riscv_vlse32_v_f32m4(__VA_ARGS__) +#define vlse32_v_f32m8(...) __riscv_vlse32_v_f32m8(__VA_ARGS__) +#define vlse64_v_f64m1(...) __riscv_vlse64_v_f64m1(__VA_ARGS__) +#define vlse64_v_f64m2(...) __riscv_vlse64_v_f64m2(__VA_ARGS__) +#define vlse64_v_f64m4(...) __riscv_vlse64_v_f64m4(__VA_ARGS__) +#define vlse64_v_f64m8(...) __riscv_vlse64_v_f64m8(__VA_ARGS__) +#define vlse8_v_i8mf8(...) __riscv_vlse8_v_i8mf8(__VA_ARGS__) +#define vlse8_v_i8mf4(...) __riscv_vlse8_v_i8mf4(__VA_ARGS__) +#define vlse8_v_i8mf2(...) __riscv_vlse8_v_i8mf2(__VA_ARGS__) +#define vlse8_v_i8m1(...) __riscv_vlse8_v_i8m1(__VA_ARGS__) +#define vlse8_v_i8m2(...) __riscv_vlse8_v_i8m2(__VA_ARGS__) +#define vlse8_v_i8m4(...) __riscv_vlse8_v_i8m4(__VA_ARGS__) +#define vlse8_v_i8m8(...) __riscv_vlse8_v_i8m8(__VA_ARGS__) +#define vlse16_v_i16mf4(...) __riscv_vlse16_v_i16mf4(__VA_ARGS__) +#define vlse16_v_i16mf2(...) __riscv_vlse16_v_i16mf2(__VA_ARGS__) +#define vlse16_v_i16m1(...) __riscv_vlse16_v_i16m1(__VA_ARGS__) +#define vlse16_v_i16m2(...) __riscv_vlse16_v_i16m2(__VA_ARGS__) +#define vlse16_v_i16m4(...) __riscv_vlse16_v_i16m4(__VA_ARGS__) +#define vlse16_v_i16m8(...) __riscv_vlse16_v_i16m8(__VA_ARGS__) +#define vlse32_v_i32mf2(...) __riscv_vlse32_v_i32mf2(__VA_ARGS__) +#define vlse32_v_i32m1(...) __riscv_vlse32_v_i32m1(__VA_ARGS__) +#define vlse32_v_i32m2(...) __riscv_vlse32_v_i32m2(__VA_ARGS__) +#define vlse32_v_i32m4(...) __riscv_vlse32_v_i32m4(__VA_ARGS__) +#define vlse32_v_i32m8(...) __riscv_vlse32_v_i32m8(__VA_ARGS__) +#define vlse64_v_i64m1(...) __riscv_vlse64_v_i64m1(__VA_ARGS__) +#define vlse64_v_i64m2(...) __riscv_vlse64_v_i64m2(__VA_ARGS__) +#define vlse64_v_i64m4(...) __riscv_vlse64_v_i64m4(__VA_ARGS__) +#define vlse64_v_i64m8(...) __riscv_vlse64_v_i64m8(__VA_ARGS__) +#define vlse8_v_u8mf8(...) __riscv_vlse8_v_u8mf8(__VA_ARGS__) +#define vlse8_v_u8mf4(...) __riscv_vlse8_v_u8mf4(__VA_ARGS__) +#define vlse8_v_u8mf2(...) __riscv_vlse8_v_u8mf2(__VA_ARGS__) +#define vlse8_v_u8m1(...) __riscv_vlse8_v_u8m1(__VA_ARGS__) +#define vlse8_v_u8m2(...) __riscv_vlse8_v_u8m2(__VA_ARGS__) +#define vlse8_v_u8m4(...) __riscv_vlse8_v_u8m4(__VA_ARGS__) +#define vlse8_v_u8m8(...) __riscv_vlse8_v_u8m8(__VA_ARGS__) +#define vlse16_v_u16mf4(...) __riscv_vlse16_v_u16mf4(__VA_ARGS__) +#define vlse16_v_u16mf2(...) __riscv_vlse16_v_u16mf2(__VA_ARGS__) +#define vlse16_v_u16m1(...) __riscv_vlse16_v_u16m1(__VA_ARGS__) +#define vlse16_v_u16m2(...) __riscv_vlse16_v_u16m2(__VA_ARGS__) +#define vlse16_v_u16m4(...) __riscv_vlse16_v_u16m4(__VA_ARGS__) +#define vlse16_v_u16m8(...) __riscv_vlse16_v_u16m8(__VA_ARGS__) +#define vlse32_v_u32mf2(...) __riscv_vlse32_v_u32mf2(__VA_ARGS__) +#define vlse32_v_u32m1(...) __riscv_vlse32_v_u32m1(__VA_ARGS__) +#define vlse32_v_u32m2(...) __riscv_vlse32_v_u32m2(__VA_ARGS__) +#define vlse32_v_u32m4(...) __riscv_vlse32_v_u32m4(__VA_ARGS__) +#define vlse32_v_u32m8(...) __riscv_vlse32_v_u32m8(__VA_ARGS__) +#define vlse64_v_u64m1(...) __riscv_vlse64_v_u64m1(__VA_ARGS__) +#define vlse64_v_u64m2(...) __riscv_vlse64_v_u64m2(__VA_ARGS__) +#define vlse64_v_u64m4(...) __riscv_vlse64_v_u64m4(__VA_ARGS__) +#define vlse64_v_u64m8(...) __riscv_vlse64_v_u64m8(__VA_ARGS__) +// masked functions +#define vlse16_v_f16mf4_m(...) __riscv_vlse16_v_f16mf4_tumu(__VA_ARGS__) +#define vlse16_v_f16mf2_m(...) __riscv_vlse16_v_f16mf2_tumu(__VA_ARGS__) +#define vlse16_v_f16m1_m(...) __riscv_vlse16_v_f16m1_tumu(__VA_ARGS__) +#define vlse16_v_f16m2_m(...) __riscv_vlse16_v_f16m2_tumu(__VA_ARGS__) +#define vlse16_v_f16m4_m(...) __riscv_vlse16_v_f16m4_tumu(__VA_ARGS__) +#define vlse16_v_f16m8_m(...) __riscv_vlse16_v_f16m8_tumu(__VA_ARGS__) +#define vlse32_v_f32mf2_m(...) __riscv_vlse32_v_f32mf2_tumu(__VA_ARGS__) +#define vlse32_v_f32m1_m(...) __riscv_vlse32_v_f32m1_tumu(__VA_ARGS__) +#define vlse32_v_f32m2_m(...) __riscv_vlse32_v_f32m2_tumu(__VA_ARGS__) +#define vlse32_v_f32m4_m(...) __riscv_vlse32_v_f32m4_tumu(__VA_ARGS__) +#define vlse32_v_f32m8_m(...) __riscv_vlse32_v_f32m8_tumu(__VA_ARGS__) +#define vlse64_v_f64m1_m(...) __riscv_vlse64_v_f64m1_tumu(__VA_ARGS__) +#define vlse64_v_f64m2_m(...) __riscv_vlse64_v_f64m2_tumu(__VA_ARGS__) +#define vlse64_v_f64m4_m(...) __riscv_vlse64_v_f64m4_tumu(__VA_ARGS__) +#define vlse64_v_f64m8_m(...) __riscv_vlse64_v_f64m8_tumu(__VA_ARGS__) +#define vlse8_v_i8mf8_m(...) __riscv_vlse8_v_i8mf8_tumu(__VA_ARGS__) +#define vlse8_v_i8mf4_m(...) __riscv_vlse8_v_i8mf4_tumu(__VA_ARGS__) +#define vlse8_v_i8mf2_m(...) __riscv_vlse8_v_i8mf2_tumu(__VA_ARGS__) +#define vlse8_v_i8m1_m(...) __riscv_vlse8_v_i8m1_tumu(__VA_ARGS__) +#define vlse8_v_i8m2_m(...) __riscv_vlse8_v_i8m2_tumu(__VA_ARGS__) +#define vlse8_v_i8m4_m(...) __riscv_vlse8_v_i8m4_tumu(__VA_ARGS__) +#define vlse8_v_i8m8_m(...) __riscv_vlse8_v_i8m8_tumu(__VA_ARGS__) +#define vlse16_v_i16mf4_m(...) __riscv_vlse16_v_i16mf4_tumu(__VA_ARGS__) +#define vlse16_v_i16mf2_m(...) __riscv_vlse16_v_i16mf2_tumu(__VA_ARGS__) +#define vlse16_v_i16m1_m(...) __riscv_vlse16_v_i16m1_tumu(__VA_ARGS__) +#define vlse16_v_i16m2_m(...) __riscv_vlse16_v_i16m2_tumu(__VA_ARGS__) +#define vlse16_v_i16m4_m(...) __riscv_vlse16_v_i16m4_tumu(__VA_ARGS__) +#define vlse16_v_i16m8_m(...) __riscv_vlse16_v_i16m8_tumu(__VA_ARGS__) +#define vlse32_v_i32mf2_m(...) __riscv_vlse32_v_i32mf2_tumu(__VA_ARGS__) +#define vlse32_v_i32m1_m(...) __riscv_vlse32_v_i32m1_tumu(__VA_ARGS__) +#define vlse32_v_i32m2_m(...) __riscv_vlse32_v_i32m2_tumu(__VA_ARGS__) +#define vlse32_v_i32m4_m(...) __riscv_vlse32_v_i32m4_tumu(__VA_ARGS__) +#define vlse32_v_i32m8_m(...) __riscv_vlse32_v_i32m8_tumu(__VA_ARGS__) +#define vlse64_v_i64m1_m(...) __riscv_vlse64_v_i64m1_tumu(__VA_ARGS__) +#define vlse64_v_i64m2_m(...) __riscv_vlse64_v_i64m2_tumu(__VA_ARGS__) +#define vlse64_v_i64m4_m(...) __riscv_vlse64_v_i64m4_tumu(__VA_ARGS__) +#define vlse64_v_i64m8_m(...) __riscv_vlse64_v_i64m8_tumu(__VA_ARGS__) +#define vlse8_v_u8mf8_m(...) __riscv_vlse8_v_u8mf8_tumu(__VA_ARGS__) +#define vlse8_v_u8mf4_m(...) __riscv_vlse8_v_u8mf4_tumu(__VA_ARGS__) +#define vlse8_v_u8mf2_m(...) __riscv_vlse8_v_u8mf2_tumu(__VA_ARGS__) +#define vlse8_v_u8m1_m(...) __riscv_vlse8_v_u8m1_tumu(__VA_ARGS__) +#define vlse8_v_u8m2_m(...) __riscv_vlse8_v_u8m2_tumu(__VA_ARGS__) +#define vlse8_v_u8m4_m(...) __riscv_vlse8_v_u8m4_tumu(__VA_ARGS__) +#define vlse8_v_u8m8_m(...) __riscv_vlse8_v_u8m8_tumu(__VA_ARGS__) +#define vlse16_v_u16mf4_m(...) __riscv_vlse16_v_u16mf4_tumu(__VA_ARGS__) +#define vlse16_v_u16mf2_m(...) __riscv_vlse16_v_u16mf2_tumu(__VA_ARGS__) +#define vlse16_v_u16m1_m(...) __riscv_vlse16_v_u16m1_tumu(__VA_ARGS__) +#define vlse16_v_u16m2_m(...) __riscv_vlse16_v_u16m2_tumu(__VA_ARGS__) +#define vlse16_v_u16m4_m(...) __riscv_vlse16_v_u16m4_tumu(__VA_ARGS__) +#define vlse16_v_u16m8_m(...) __riscv_vlse16_v_u16m8_tumu(__VA_ARGS__) +#define vlse32_v_u32mf2_m(...) __riscv_vlse32_v_u32mf2_tumu(__VA_ARGS__) +#define vlse32_v_u32m1_m(...) __riscv_vlse32_v_u32m1_tumu(__VA_ARGS__) +#define vlse32_v_u32m2_m(...) __riscv_vlse32_v_u32m2_tumu(__VA_ARGS__) +#define vlse32_v_u32m4_m(...) __riscv_vlse32_v_u32m4_tumu(__VA_ARGS__) +#define vlse32_v_u32m8_m(...) __riscv_vlse32_v_u32m8_tumu(__VA_ARGS__) +#define vlse64_v_u64m1_m(...) __riscv_vlse64_v_u64m1_tumu(__VA_ARGS__) +#define vlse64_v_u64m2_m(...) __riscv_vlse64_v_u64m2_tumu(__VA_ARGS__) +#define vlse64_v_u64m4_m(...) __riscv_vlse64_v_u64m4_tumu(__VA_ARGS__) +#define vlse64_v_u64m8_m(...) __riscv_vlse64_v_u64m8_tumu(__VA_ARGS__) +#define vsse16_v_f16mf4(...) __riscv_vsse16_v_f16mf4(__VA_ARGS__) +#define vsse16_v_f16mf2(...) __riscv_vsse16_v_f16mf2(__VA_ARGS__) +#define vsse16_v_f16m1(...) __riscv_vsse16_v_f16m1(__VA_ARGS__) +#define vsse16_v_f16m2(...) __riscv_vsse16_v_f16m2(__VA_ARGS__) +#define vsse16_v_f16m4(...) __riscv_vsse16_v_f16m4(__VA_ARGS__) +#define vsse16_v_f16m8(...) __riscv_vsse16_v_f16m8(__VA_ARGS__) +#define vsse32_v_f32mf2(...) __riscv_vsse32_v_f32mf2(__VA_ARGS__) +#define vsse32_v_f32m1(...) __riscv_vsse32_v_f32m1(__VA_ARGS__) +#define vsse32_v_f32m2(...) __riscv_vsse32_v_f32m2(__VA_ARGS__) +#define vsse32_v_f32m4(...) __riscv_vsse32_v_f32m4(__VA_ARGS__) +#define vsse32_v_f32m8(...) __riscv_vsse32_v_f32m8(__VA_ARGS__) +#define vsse64_v_f64m1(...) __riscv_vsse64_v_f64m1(__VA_ARGS__) +#define vsse64_v_f64m2(...) __riscv_vsse64_v_f64m2(__VA_ARGS__) +#define vsse64_v_f64m4(...) __riscv_vsse64_v_f64m4(__VA_ARGS__) +#define vsse64_v_f64m8(...) __riscv_vsse64_v_f64m8(__VA_ARGS__) +#define vsse8_v_i8mf8(...) __riscv_vsse8_v_i8mf8(__VA_ARGS__) +#define vsse8_v_i8mf4(...) __riscv_vsse8_v_i8mf4(__VA_ARGS__) +#define vsse8_v_i8mf2(...) __riscv_vsse8_v_i8mf2(__VA_ARGS__) +#define vsse8_v_i8m1(...) __riscv_vsse8_v_i8m1(__VA_ARGS__) +#define vsse8_v_i8m2(...) __riscv_vsse8_v_i8m2(__VA_ARGS__) +#define vsse8_v_i8m4(...) __riscv_vsse8_v_i8m4(__VA_ARGS__) +#define vsse8_v_i8m8(...) __riscv_vsse8_v_i8m8(__VA_ARGS__) +#define vsse16_v_i16mf4(...) __riscv_vsse16_v_i16mf4(__VA_ARGS__) +#define vsse16_v_i16mf2(...) __riscv_vsse16_v_i16mf2(__VA_ARGS__) +#define vsse16_v_i16m1(...) __riscv_vsse16_v_i16m1(__VA_ARGS__) +#define vsse16_v_i16m2(...) __riscv_vsse16_v_i16m2(__VA_ARGS__) +#define vsse16_v_i16m4(...) __riscv_vsse16_v_i16m4(__VA_ARGS__) +#define vsse16_v_i16m8(...) __riscv_vsse16_v_i16m8(__VA_ARGS__) +#define vsse32_v_i32mf2(...) __riscv_vsse32_v_i32mf2(__VA_ARGS__) +#define vsse32_v_i32m1(...) __riscv_vsse32_v_i32m1(__VA_ARGS__) +#define vsse32_v_i32m2(...) __riscv_vsse32_v_i32m2(__VA_ARGS__) +#define vsse32_v_i32m4(...) __riscv_vsse32_v_i32m4(__VA_ARGS__) +#define vsse32_v_i32m8(...) __riscv_vsse32_v_i32m8(__VA_ARGS__) +#define vsse64_v_i64m1(...) __riscv_vsse64_v_i64m1(__VA_ARGS__) +#define vsse64_v_i64m2(...) __riscv_vsse64_v_i64m2(__VA_ARGS__) +#define vsse64_v_i64m4(...) __riscv_vsse64_v_i64m4(__VA_ARGS__) +#define vsse64_v_i64m8(...) __riscv_vsse64_v_i64m8(__VA_ARGS__) +#define vsse8_v_u8mf8(...) __riscv_vsse8_v_u8mf8(__VA_ARGS__) +#define vsse8_v_u8mf4(...) __riscv_vsse8_v_u8mf4(__VA_ARGS__) +#define vsse8_v_u8mf2(...) __riscv_vsse8_v_u8mf2(__VA_ARGS__) +#define vsse8_v_u8m1(...) __riscv_vsse8_v_u8m1(__VA_ARGS__) +#define vsse8_v_u8m2(...) __riscv_vsse8_v_u8m2(__VA_ARGS__) +#define vsse8_v_u8m4(...) __riscv_vsse8_v_u8m4(__VA_ARGS__) +#define vsse8_v_u8m8(...) __riscv_vsse8_v_u8m8(__VA_ARGS__) +#define vsse16_v_u16mf4(...) __riscv_vsse16_v_u16mf4(__VA_ARGS__) +#define vsse16_v_u16mf2(...) __riscv_vsse16_v_u16mf2(__VA_ARGS__) +#define vsse16_v_u16m1(...) __riscv_vsse16_v_u16m1(__VA_ARGS__) +#define vsse16_v_u16m2(...) __riscv_vsse16_v_u16m2(__VA_ARGS__) +#define vsse16_v_u16m4(...) __riscv_vsse16_v_u16m4(__VA_ARGS__) +#define vsse16_v_u16m8(...) __riscv_vsse16_v_u16m8(__VA_ARGS__) +#define vsse32_v_u32mf2(...) __riscv_vsse32_v_u32mf2(__VA_ARGS__) +#define vsse32_v_u32m1(...) __riscv_vsse32_v_u32m1(__VA_ARGS__) +#define vsse32_v_u32m2(...) __riscv_vsse32_v_u32m2(__VA_ARGS__) +#define vsse32_v_u32m4(...) __riscv_vsse32_v_u32m4(__VA_ARGS__) +#define vsse32_v_u32m8(...) __riscv_vsse32_v_u32m8(__VA_ARGS__) +#define vsse64_v_u64m1(...) __riscv_vsse64_v_u64m1(__VA_ARGS__) +#define vsse64_v_u64m2(...) __riscv_vsse64_v_u64m2(__VA_ARGS__) +#define vsse64_v_u64m4(...) __riscv_vsse64_v_u64m4(__VA_ARGS__) +#define vsse64_v_u64m8(...) __riscv_vsse64_v_u64m8(__VA_ARGS__) +// masked functions +#define vsse16_v_f16mf4_m(...) __riscv_vsse16_v_f16mf4_m(__VA_ARGS__) +#define vsse16_v_f16mf2_m(...) __riscv_vsse16_v_f16mf2_m(__VA_ARGS__) +#define vsse16_v_f16m1_m(...) __riscv_vsse16_v_f16m1_m(__VA_ARGS__) +#define vsse16_v_f16m2_m(...) __riscv_vsse16_v_f16m2_m(__VA_ARGS__) +#define vsse16_v_f16m4_m(...) __riscv_vsse16_v_f16m4_m(__VA_ARGS__) +#define vsse16_v_f16m8_m(...) __riscv_vsse16_v_f16m8_m(__VA_ARGS__) +#define vsse32_v_f32mf2_m(...) __riscv_vsse32_v_f32mf2_m(__VA_ARGS__) +#define vsse32_v_f32m1_m(...) __riscv_vsse32_v_f32m1_m(__VA_ARGS__) +#define vsse32_v_f32m2_m(...) __riscv_vsse32_v_f32m2_m(__VA_ARGS__) +#define vsse32_v_f32m4_m(...) __riscv_vsse32_v_f32m4_m(__VA_ARGS__) +#define vsse32_v_f32m8_m(...) __riscv_vsse32_v_f32m8_m(__VA_ARGS__) +#define vsse64_v_f64m1_m(...) __riscv_vsse64_v_f64m1_m(__VA_ARGS__) +#define vsse64_v_f64m2_m(...) __riscv_vsse64_v_f64m2_m(__VA_ARGS__) +#define vsse64_v_f64m4_m(...) __riscv_vsse64_v_f64m4_m(__VA_ARGS__) +#define vsse64_v_f64m8_m(...) __riscv_vsse64_v_f64m8_m(__VA_ARGS__) +#define vsse8_v_i8mf8_m(...) __riscv_vsse8_v_i8mf8_m(__VA_ARGS__) +#define vsse8_v_i8mf4_m(...) __riscv_vsse8_v_i8mf4_m(__VA_ARGS__) +#define vsse8_v_i8mf2_m(...) __riscv_vsse8_v_i8mf2_m(__VA_ARGS__) +#define vsse8_v_i8m1_m(...) __riscv_vsse8_v_i8m1_m(__VA_ARGS__) +#define vsse8_v_i8m2_m(...) __riscv_vsse8_v_i8m2_m(__VA_ARGS__) +#define vsse8_v_i8m4_m(...) __riscv_vsse8_v_i8m4_m(__VA_ARGS__) +#define vsse8_v_i8m8_m(...) __riscv_vsse8_v_i8m8_m(__VA_ARGS__) +#define vsse16_v_i16mf4_m(...) __riscv_vsse16_v_i16mf4_m(__VA_ARGS__) +#define vsse16_v_i16mf2_m(...) __riscv_vsse16_v_i16mf2_m(__VA_ARGS__) +#define vsse16_v_i16m1_m(...) __riscv_vsse16_v_i16m1_m(__VA_ARGS__) +#define vsse16_v_i16m2_m(...) __riscv_vsse16_v_i16m2_m(__VA_ARGS__) +#define vsse16_v_i16m4_m(...) __riscv_vsse16_v_i16m4_m(__VA_ARGS__) +#define vsse16_v_i16m8_m(...) __riscv_vsse16_v_i16m8_m(__VA_ARGS__) +#define vsse32_v_i32mf2_m(...) __riscv_vsse32_v_i32mf2_m(__VA_ARGS__) +#define vsse32_v_i32m1_m(...) __riscv_vsse32_v_i32m1_m(__VA_ARGS__) +#define vsse32_v_i32m2_m(...) __riscv_vsse32_v_i32m2_m(__VA_ARGS__) +#define vsse32_v_i32m4_m(...) __riscv_vsse32_v_i32m4_m(__VA_ARGS__) +#define vsse32_v_i32m8_m(...) __riscv_vsse32_v_i32m8_m(__VA_ARGS__) +#define vsse64_v_i64m1_m(...) __riscv_vsse64_v_i64m1_m(__VA_ARGS__) +#define vsse64_v_i64m2_m(...) __riscv_vsse64_v_i64m2_m(__VA_ARGS__) +#define vsse64_v_i64m4_m(...) __riscv_vsse64_v_i64m4_m(__VA_ARGS__) +#define vsse64_v_i64m8_m(...) __riscv_vsse64_v_i64m8_m(__VA_ARGS__) +#define vsse8_v_u8mf8_m(...) __riscv_vsse8_v_u8mf8_m(__VA_ARGS__) +#define vsse8_v_u8mf4_m(...) __riscv_vsse8_v_u8mf4_m(__VA_ARGS__) +#define vsse8_v_u8mf2_m(...) __riscv_vsse8_v_u8mf2_m(__VA_ARGS__) +#define vsse8_v_u8m1_m(...) __riscv_vsse8_v_u8m1_m(__VA_ARGS__) +#define vsse8_v_u8m2_m(...) __riscv_vsse8_v_u8m2_m(__VA_ARGS__) +#define vsse8_v_u8m4_m(...) __riscv_vsse8_v_u8m4_m(__VA_ARGS__) +#define vsse8_v_u8m8_m(...) __riscv_vsse8_v_u8m8_m(__VA_ARGS__) +#define vsse16_v_u16mf4_m(...) __riscv_vsse16_v_u16mf4_m(__VA_ARGS__) +#define vsse16_v_u16mf2_m(...) __riscv_vsse16_v_u16mf2_m(__VA_ARGS__) +#define vsse16_v_u16m1_m(...) __riscv_vsse16_v_u16m1_m(__VA_ARGS__) +#define vsse16_v_u16m2_m(...) __riscv_vsse16_v_u16m2_m(__VA_ARGS__) +#define vsse16_v_u16m4_m(...) __riscv_vsse16_v_u16m4_m(__VA_ARGS__) +#define vsse16_v_u16m8_m(...) __riscv_vsse16_v_u16m8_m(__VA_ARGS__) +#define vsse32_v_u32mf2_m(...) __riscv_vsse32_v_u32mf2_m(__VA_ARGS__) +#define vsse32_v_u32m1_m(...) __riscv_vsse32_v_u32m1_m(__VA_ARGS__) +#define vsse32_v_u32m2_m(...) __riscv_vsse32_v_u32m2_m(__VA_ARGS__) +#define vsse32_v_u32m4_m(...) __riscv_vsse32_v_u32m4_m(__VA_ARGS__) +#define vsse32_v_u32m8_m(...) __riscv_vsse32_v_u32m8_m(__VA_ARGS__) +#define vsse64_v_u64m1_m(...) __riscv_vsse64_v_u64m1_m(__VA_ARGS__) +#define vsse64_v_u64m2_m(...) __riscv_vsse64_v_u64m2_m(__VA_ARGS__) +#define vsse64_v_u64m4_m(...) __riscv_vsse64_v_u64m4_m(__VA_ARGS__) +#define vsse64_v_u64m8_m(...) __riscv_vsse64_v_u64m8_m(__VA_ARGS__) +#define vloxei8_v_f16mf4(...) __riscv_vloxei8_v_f16mf4(__VA_ARGS__) +#define vloxei8_v_f16mf2(...) __riscv_vloxei8_v_f16mf2(__VA_ARGS__) +#define vloxei8_v_f16m1(...) __riscv_vloxei8_v_f16m1(__VA_ARGS__) +#define vloxei8_v_f16m2(...) __riscv_vloxei8_v_f16m2(__VA_ARGS__) +#define vloxei8_v_f16m4(...) __riscv_vloxei8_v_f16m4(__VA_ARGS__) +#define vloxei8_v_f16m8(...) __riscv_vloxei8_v_f16m8(__VA_ARGS__) +#define vloxei16_v_f16mf4(...) __riscv_vloxei16_v_f16mf4(__VA_ARGS__) +#define vloxei16_v_f16mf2(...) __riscv_vloxei16_v_f16mf2(__VA_ARGS__) +#define vloxei16_v_f16m1(...) __riscv_vloxei16_v_f16m1(__VA_ARGS__) +#define vloxei16_v_f16m2(...) __riscv_vloxei16_v_f16m2(__VA_ARGS__) +#define vloxei16_v_f16m4(...) __riscv_vloxei16_v_f16m4(__VA_ARGS__) +#define vloxei16_v_f16m8(...) __riscv_vloxei16_v_f16m8(__VA_ARGS__) +#define vloxei32_v_f16mf4(...) __riscv_vloxei32_v_f16mf4(__VA_ARGS__) +#define vloxei32_v_f16mf2(...) __riscv_vloxei32_v_f16mf2(__VA_ARGS__) +#define vloxei32_v_f16m1(...) __riscv_vloxei32_v_f16m1(__VA_ARGS__) +#define vloxei32_v_f16m2(...) __riscv_vloxei32_v_f16m2(__VA_ARGS__) +#define vloxei32_v_f16m4(...) __riscv_vloxei32_v_f16m4(__VA_ARGS__) +#define vloxei64_v_f16mf4(...) __riscv_vloxei64_v_f16mf4(__VA_ARGS__) +#define vloxei64_v_f16mf2(...) __riscv_vloxei64_v_f16mf2(__VA_ARGS__) +#define vloxei64_v_f16m1(...) __riscv_vloxei64_v_f16m1(__VA_ARGS__) +#define vloxei64_v_f16m2(...) __riscv_vloxei64_v_f16m2(__VA_ARGS__) +#define vloxei8_v_f32mf2(...) __riscv_vloxei8_v_f32mf2(__VA_ARGS__) +#define vloxei8_v_f32m1(...) __riscv_vloxei8_v_f32m1(__VA_ARGS__) +#define vloxei8_v_f32m2(...) __riscv_vloxei8_v_f32m2(__VA_ARGS__) +#define vloxei8_v_f32m4(...) __riscv_vloxei8_v_f32m4(__VA_ARGS__) +#define vloxei8_v_f32m8(...) __riscv_vloxei8_v_f32m8(__VA_ARGS__) +#define vloxei16_v_f32mf2(...) __riscv_vloxei16_v_f32mf2(__VA_ARGS__) +#define vloxei16_v_f32m1(...) __riscv_vloxei16_v_f32m1(__VA_ARGS__) +#define vloxei16_v_f32m2(...) __riscv_vloxei16_v_f32m2(__VA_ARGS__) +#define vloxei16_v_f32m4(...) __riscv_vloxei16_v_f32m4(__VA_ARGS__) +#define vloxei16_v_f32m8(...) __riscv_vloxei16_v_f32m8(__VA_ARGS__) +#define vloxei32_v_f32mf2(...) __riscv_vloxei32_v_f32mf2(__VA_ARGS__) +#define vloxei32_v_f32m1(...) __riscv_vloxei32_v_f32m1(__VA_ARGS__) +#define vloxei32_v_f32m2(...) __riscv_vloxei32_v_f32m2(__VA_ARGS__) +#define vloxei32_v_f32m4(...) __riscv_vloxei32_v_f32m4(__VA_ARGS__) +#define vloxei32_v_f32m8(...) __riscv_vloxei32_v_f32m8(__VA_ARGS__) +#define vloxei64_v_f32mf2(...) __riscv_vloxei64_v_f32mf2(__VA_ARGS__) +#define vloxei64_v_f32m1(...) __riscv_vloxei64_v_f32m1(__VA_ARGS__) +#define vloxei64_v_f32m2(...) __riscv_vloxei64_v_f32m2(__VA_ARGS__) +#define vloxei64_v_f32m4(...) __riscv_vloxei64_v_f32m4(__VA_ARGS__) +#define vloxei8_v_f64m1(...) __riscv_vloxei8_v_f64m1(__VA_ARGS__) +#define vloxei8_v_f64m2(...) __riscv_vloxei8_v_f64m2(__VA_ARGS__) +#define vloxei8_v_f64m4(...) __riscv_vloxei8_v_f64m4(__VA_ARGS__) +#define vloxei8_v_f64m8(...) __riscv_vloxei8_v_f64m8(__VA_ARGS__) +#define vloxei16_v_f64m1(...) __riscv_vloxei16_v_f64m1(__VA_ARGS__) +#define vloxei16_v_f64m2(...) __riscv_vloxei16_v_f64m2(__VA_ARGS__) +#define vloxei16_v_f64m4(...) __riscv_vloxei16_v_f64m4(__VA_ARGS__) +#define vloxei16_v_f64m8(...) __riscv_vloxei16_v_f64m8(__VA_ARGS__) +#define vloxei32_v_f64m1(...) __riscv_vloxei32_v_f64m1(__VA_ARGS__) +#define vloxei32_v_f64m2(...) __riscv_vloxei32_v_f64m2(__VA_ARGS__) +#define vloxei32_v_f64m4(...) __riscv_vloxei32_v_f64m4(__VA_ARGS__) +#define vloxei32_v_f64m8(...) __riscv_vloxei32_v_f64m8(__VA_ARGS__) +#define vloxei64_v_f64m1(...) __riscv_vloxei64_v_f64m1(__VA_ARGS__) +#define vloxei64_v_f64m2(...) __riscv_vloxei64_v_f64m2(__VA_ARGS__) +#define vloxei64_v_f64m4(...) __riscv_vloxei64_v_f64m4(__VA_ARGS__) +#define vloxei64_v_f64m8(...) __riscv_vloxei64_v_f64m8(__VA_ARGS__) +#define vluxei8_v_f16mf4(...) __riscv_vluxei8_v_f16mf4(__VA_ARGS__) +#define vluxei8_v_f16mf2(...) __riscv_vluxei8_v_f16mf2(__VA_ARGS__) +#define vluxei8_v_f16m1(...) __riscv_vluxei8_v_f16m1(__VA_ARGS__) +#define vluxei8_v_f16m2(...) __riscv_vluxei8_v_f16m2(__VA_ARGS__) +#define vluxei8_v_f16m4(...) __riscv_vluxei8_v_f16m4(__VA_ARGS__) +#define vluxei8_v_f16m8(...) __riscv_vluxei8_v_f16m8(__VA_ARGS__) +#define vluxei16_v_f16mf4(...) __riscv_vluxei16_v_f16mf4(__VA_ARGS__) +#define vluxei16_v_f16mf2(...) __riscv_vluxei16_v_f16mf2(__VA_ARGS__) +#define vluxei16_v_f16m1(...) __riscv_vluxei16_v_f16m1(__VA_ARGS__) +#define vluxei16_v_f16m2(...) __riscv_vluxei16_v_f16m2(__VA_ARGS__) +#define vluxei16_v_f16m4(...) __riscv_vluxei16_v_f16m4(__VA_ARGS__) +#define vluxei16_v_f16m8(...) __riscv_vluxei16_v_f16m8(__VA_ARGS__) +#define vluxei32_v_f16mf4(...) __riscv_vluxei32_v_f16mf4(__VA_ARGS__) +#define vluxei32_v_f16mf2(...) __riscv_vluxei32_v_f16mf2(__VA_ARGS__) +#define vluxei32_v_f16m1(...) __riscv_vluxei32_v_f16m1(__VA_ARGS__) +#define vluxei32_v_f16m2(...) __riscv_vluxei32_v_f16m2(__VA_ARGS__) +#define vluxei32_v_f16m4(...) __riscv_vluxei32_v_f16m4(__VA_ARGS__) +#define vluxei64_v_f16mf4(...) __riscv_vluxei64_v_f16mf4(__VA_ARGS__) +#define vluxei64_v_f16mf2(...) __riscv_vluxei64_v_f16mf2(__VA_ARGS__) +#define vluxei64_v_f16m1(...) __riscv_vluxei64_v_f16m1(__VA_ARGS__) +#define vluxei64_v_f16m2(...) __riscv_vluxei64_v_f16m2(__VA_ARGS__) +#define vluxei8_v_f32mf2(...) __riscv_vluxei8_v_f32mf2(__VA_ARGS__) +#define vluxei8_v_f32m1(...) __riscv_vluxei8_v_f32m1(__VA_ARGS__) +#define vluxei8_v_f32m2(...) __riscv_vluxei8_v_f32m2(__VA_ARGS__) +#define vluxei8_v_f32m4(...) __riscv_vluxei8_v_f32m4(__VA_ARGS__) +#define vluxei8_v_f32m8(...) __riscv_vluxei8_v_f32m8(__VA_ARGS__) +#define vluxei16_v_f32mf2(...) __riscv_vluxei16_v_f32mf2(__VA_ARGS__) +#define vluxei16_v_f32m1(...) __riscv_vluxei16_v_f32m1(__VA_ARGS__) +#define vluxei16_v_f32m2(...) __riscv_vluxei16_v_f32m2(__VA_ARGS__) +#define vluxei16_v_f32m4(...) __riscv_vluxei16_v_f32m4(__VA_ARGS__) +#define vluxei16_v_f32m8(...) __riscv_vluxei16_v_f32m8(__VA_ARGS__) +#define vluxei32_v_f32mf2(...) __riscv_vluxei32_v_f32mf2(__VA_ARGS__) +#define vluxei32_v_f32m1(...) __riscv_vluxei32_v_f32m1(__VA_ARGS__) +#define vluxei32_v_f32m2(...) __riscv_vluxei32_v_f32m2(__VA_ARGS__) +#define vluxei32_v_f32m4(...) __riscv_vluxei32_v_f32m4(__VA_ARGS__) +#define vluxei32_v_f32m8(...) __riscv_vluxei32_v_f32m8(__VA_ARGS__) +#define vluxei64_v_f32mf2(...) __riscv_vluxei64_v_f32mf2(__VA_ARGS__) +#define vluxei64_v_f32m1(...) __riscv_vluxei64_v_f32m1(__VA_ARGS__) +#define vluxei64_v_f32m2(...) __riscv_vluxei64_v_f32m2(__VA_ARGS__) +#define vluxei64_v_f32m4(...) __riscv_vluxei64_v_f32m4(__VA_ARGS__) +#define vluxei8_v_f64m1(...) __riscv_vluxei8_v_f64m1(__VA_ARGS__) +#define vluxei8_v_f64m2(...) __riscv_vluxei8_v_f64m2(__VA_ARGS__) +#define vluxei8_v_f64m4(...) __riscv_vluxei8_v_f64m4(__VA_ARGS__) +#define vluxei8_v_f64m8(...) __riscv_vluxei8_v_f64m8(__VA_ARGS__) +#define vluxei16_v_f64m1(...) __riscv_vluxei16_v_f64m1(__VA_ARGS__) +#define vluxei16_v_f64m2(...) __riscv_vluxei16_v_f64m2(__VA_ARGS__) +#define vluxei16_v_f64m4(...) __riscv_vluxei16_v_f64m4(__VA_ARGS__) +#define vluxei16_v_f64m8(...) __riscv_vluxei16_v_f64m8(__VA_ARGS__) +#define vluxei32_v_f64m1(...) __riscv_vluxei32_v_f64m1(__VA_ARGS__) +#define vluxei32_v_f64m2(...) __riscv_vluxei32_v_f64m2(__VA_ARGS__) +#define vluxei32_v_f64m4(...) __riscv_vluxei32_v_f64m4(__VA_ARGS__) +#define vluxei32_v_f64m8(...) __riscv_vluxei32_v_f64m8(__VA_ARGS__) +#define vluxei64_v_f64m1(...) __riscv_vluxei64_v_f64m1(__VA_ARGS__) +#define vluxei64_v_f64m2(...) __riscv_vluxei64_v_f64m2(__VA_ARGS__) +#define vluxei64_v_f64m4(...) __riscv_vluxei64_v_f64m4(__VA_ARGS__) +#define vluxei64_v_f64m8(...) __riscv_vluxei64_v_f64m8(__VA_ARGS__) +#define vloxei8_v_i8mf8(...) __riscv_vloxei8_v_i8mf8(__VA_ARGS__) +#define vloxei8_v_i8mf4(...) __riscv_vloxei8_v_i8mf4(__VA_ARGS__) +#define vloxei8_v_i8mf2(...) __riscv_vloxei8_v_i8mf2(__VA_ARGS__) +#define vloxei8_v_i8m1(...) __riscv_vloxei8_v_i8m1(__VA_ARGS__) +#define vloxei8_v_i8m2(...) __riscv_vloxei8_v_i8m2(__VA_ARGS__) +#define vloxei8_v_i8m4(...) __riscv_vloxei8_v_i8m4(__VA_ARGS__) +#define vloxei8_v_i8m8(...) __riscv_vloxei8_v_i8m8(__VA_ARGS__) +#define vloxei16_v_i8mf8(...) __riscv_vloxei16_v_i8mf8(__VA_ARGS__) +#define vloxei16_v_i8mf4(...) __riscv_vloxei16_v_i8mf4(__VA_ARGS__) +#define vloxei16_v_i8mf2(...) __riscv_vloxei16_v_i8mf2(__VA_ARGS__) +#define vloxei16_v_i8m1(...) __riscv_vloxei16_v_i8m1(__VA_ARGS__) +#define vloxei16_v_i8m2(...) __riscv_vloxei16_v_i8m2(__VA_ARGS__) +#define vloxei16_v_i8m4(...) __riscv_vloxei16_v_i8m4(__VA_ARGS__) +#define vloxei32_v_i8mf8(...) __riscv_vloxei32_v_i8mf8(__VA_ARGS__) +#define vloxei32_v_i8mf4(...) __riscv_vloxei32_v_i8mf4(__VA_ARGS__) +#define vloxei32_v_i8mf2(...) __riscv_vloxei32_v_i8mf2(__VA_ARGS__) +#define vloxei32_v_i8m1(...) __riscv_vloxei32_v_i8m1(__VA_ARGS__) +#define vloxei32_v_i8m2(...) __riscv_vloxei32_v_i8m2(__VA_ARGS__) +#define vloxei64_v_i8mf8(...) __riscv_vloxei64_v_i8mf8(__VA_ARGS__) +#define vloxei64_v_i8mf4(...) __riscv_vloxei64_v_i8mf4(__VA_ARGS__) +#define vloxei64_v_i8mf2(...) __riscv_vloxei64_v_i8mf2(__VA_ARGS__) +#define vloxei64_v_i8m1(...) __riscv_vloxei64_v_i8m1(__VA_ARGS__) +#define vloxei8_v_i16mf4(...) __riscv_vloxei8_v_i16mf4(__VA_ARGS__) +#define vloxei8_v_i16mf2(...) __riscv_vloxei8_v_i16mf2(__VA_ARGS__) +#define vloxei8_v_i16m1(...) __riscv_vloxei8_v_i16m1(__VA_ARGS__) +#define vloxei8_v_i16m2(...) __riscv_vloxei8_v_i16m2(__VA_ARGS__) +#define vloxei8_v_i16m4(...) __riscv_vloxei8_v_i16m4(__VA_ARGS__) +#define vloxei8_v_i16m8(...) __riscv_vloxei8_v_i16m8(__VA_ARGS__) +#define vloxei16_v_i16mf4(...) __riscv_vloxei16_v_i16mf4(__VA_ARGS__) +#define vloxei16_v_i16mf2(...) __riscv_vloxei16_v_i16mf2(__VA_ARGS__) +#define vloxei16_v_i16m1(...) __riscv_vloxei16_v_i16m1(__VA_ARGS__) +#define vloxei16_v_i16m2(...) __riscv_vloxei16_v_i16m2(__VA_ARGS__) +#define vloxei16_v_i16m4(...) __riscv_vloxei16_v_i16m4(__VA_ARGS__) +#define vloxei16_v_i16m8(...) __riscv_vloxei16_v_i16m8(__VA_ARGS__) +#define vloxei32_v_i16mf4(...) __riscv_vloxei32_v_i16mf4(__VA_ARGS__) +#define vloxei32_v_i16mf2(...) __riscv_vloxei32_v_i16mf2(__VA_ARGS__) +#define vloxei32_v_i16m1(...) __riscv_vloxei32_v_i16m1(__VA_ARGS__) +#define vloxei32_v_i16m2(...) __riscv_vloxei32_v_i16m2(__VA_ARGS__) +#define vloxei32_v_i16m4(...) __riscv_vloxei32_v_i16m4(__VA_ARGS__) +#define vloxei64_v_i16mf4(...) __riscv_vloxei64_v_i16mf4(__VA_ARGS__) +#define vloxei64_v_i16mf2(...) __riscv_vloxei64_v_i16mf2(__VA_ARGS__) +#define vloxei64_v_i16m1(...) __riscv_vloxei64_v_i16m1(__VA_ARGS__) +#define vloxei64_v_i16m2(...) __riscv_vloxei64_v_i16m2(__VA_ARGS__) +#define vloxei8_v_i32mf2(...) __riscv_vloxei8_v_i32mf2(__VA_ARGS__) +#define vloxei8_v_i32m1(...) __riscv_vloxei8_v_i32m1(__VA_ARGS__) +#define vloxei8_v_i32m2(...) __riscv_vloxei8_v_i32m2(__VA_ARGS__) +#define vloxei8_v_i32m4(...) __riscv_vloxei8_v_i32m4(__VA_ARGS__) +#define vloxei8_v_i32m8(...) __riscv_vloxei8_v_i32m8(__VA_ARGS__) +#define vloxei16_v_i32mf2(...) __riscv_vloxei16_v_i32mf2(__VA_ARGS__) +#define vloxei16_v_i32m1(...) __riscv_vloxei16_v_i32m1(__VA_ARGS__) +#define vloxei16_v_i32m2(...) __riscv_vloxei16_v_i32m2(__VA_ARGS__) +#define vloxei16_v_i32m4(...) __riscv_vloxei16_v_i32m4(__VA_ARGS__) +#define vloxei16_v_i32m8(...) __riscv_vloxei16_v_i32m8(__VA_ARGS__) +#define vloxei32_v_i32mf2(...) __riscv_vloxei32_v_i32mf2(__VA_ARGS__) +#define vloxei32_v_i32m1(...) __riscv_vloxei32_v_i32m1(__VA_ARGS__) +#define vloxei32_v_i32m2(...) __riscv_vloxei32_v_i32m2(__VA_ARGS__) +#define vloxei32_v_i32m4(...) __riscv_vloxei32_v_i32m4(__VA_ARGS__) +#define vloxei32_v_i32m8(...) __riscv_vloxei32_v_i32m8(__VA_ARGS__) +#define vloxei64_v_i32mf2(...) __riscv_vloxei64_v_i32mf2(__VA_ARGS__) +#define vloxei64_v_i32m1(...) __riscv_vloxei64_v_i32m1(__VA_ARGS__) +#define vloxei64_v_i32m2(...) __riscv_vloxei64_v_i32m2(__VA_ARGS__) +#define vloxei64_v_i32m4(...) __riscv_vloxei64_v_i32m4(__VA_ARGS__) +#define vloxei8_v_i64m1(...) __riscv_vloxei8_v_i64m1(__VA_ARGS__) +#define vloxei8_v_i64m2(...) __riscv_vloxei8_v_i64m2(__VA_ARGS__) +#define vloxei8_v_i64m4(...) __riscv_vloxei8_v_i64m4(__VA_ARGS__) +#define vloxei8_v_i64m8(...) __riscv_vloxei8_v_i64m8(__VA_ARGS__) +#define vloxei16_v_i64m1(...) __riscv_vloxei16_v_i64m1(__VA_ARGS__) +#define vloxei16_v_i64m2(...) __riscv_vloxei16_v_i64m2(__VA_ARGS__) +#define vloxei16_v_i64m4(...) __riscv_vloxei16_v_i64m4(__VA_ARGS__) +#define vloxei16_v_i64m8(...) __riscv_vloxei16_v_i64m8(__VA_ARGS__) +#define vloxei32_v_i64m1(...) __riscv_vloxei32_v_i64m1(__VA_ARGS__) +#define vloxei32_v_i64m2(...) __riscv_vloxei32_v_i64m2(__VA_ARGS__) +#define vloxei32_v_i64m4(...) __riscv_vloxei32_v_i64m4(__VA_ARGS__) +#define vloxei32_v_i64m8(...) __riscv_vloxei32_v_i64m8(__VA_ARGS__) +#define vloxei64_v_i64m1(...) __riscv_vloxei64_v_i64m1(__VA_ARGS__) +#define vloxei64_v_i64m2(...) __riscv_vloxei64_v_i64m2(__VA_ARGS__) +#define vloxei64_v_i64m4(...) __riscv_vloxei64_v_i64m4(__VA_ARGS__) +#define vloxei64_v_i64m8(...) __riscv_vloxei64_v_i64m8(__VA_ARGS__) +#define vluxei8_v_i8mf8(...) __riscv_vluxei8_v_i8mf8(__VA_ARGS__) +#define vluxei8_v_i8mf4(...) __riscv_vluxei8_v_i8mf4(__VA_ARGS__) +#define vluxei8_v_i8mf2(...) __riscv_vluxei8_v_i8mf2(__VA_ARGS__) +#define vluxei8_v_i8m1(...) __riscv_vluxei8_v_i8m1(__VA_ARGS__) +#define vluxei8_v_i8m2(...) __riscv_vluxei8_v_i8m2(__VA_ARGS__) +#define vluxei8_v_i8m4(...) __riscv_vluxei8_v_i8m4(__VA_ARGS__) +#define vluxei8_v_i8m8(...) __riscv_vluxei8_v_i8m8(__VA_ARGS__) +#define vluxei16_v_i8mf8(...) __riscv_vluxei16_v_i8mf8(__VA_ARGS__) +#define vluxei16_v_i8mf4(...) __riscv_vluxei16_v_i8mf4(__VA_ARGS__) +#define vluxei16_v_i8mf2(...) __riscv_vluxei16_v_i8mf2(__VA_ARGS__) +#define vluxei16_v_i8m1(...) __riscv_vluxei16_v_i8m1(__VA_ARGS__) +#define vluxei16_v_i8m2(...) __riscv_vluxei16_v_i8m2(__VA_ARGS__) +#define vluxei16_v_i8m4(...) __riscv_vluxei16_v_i8m4(__VA_ARGS__) +#define vluxei32_v_i8mf8(...) __riscv_vluxei32_v_i8mf8(__VA_ARGS__) +#define vluxei32_v_i8mf4(...) __riscv_vluxei32_v_i8mf4(__VA_ARGS__) +#define vluxei32_v_i8mf2(...) __riscv_vluxei32_v_i8mf2(__VA_ARGS__) +#define vluxei32_v_i8m1(...) __riscv_vluxei32_v_i8m1(__VA_ARGS__) +#define vluxei32_v_i8m2(...) __riscv_vluxei32_v_i8m2(__VA_ARGS__) +#define vluxei64_v_i8mf8(...) __riscv_vluxei64_v_i8mf8(__VA_ARGS__) +#define vluxei64_v_i8mf4(...) __riscv_vluxei64_v_i8mf4(__VA_ARGS__) +#define vluxei64_v_i8mf2(...) __riscv_vluxei64_v_i8mf2(__VA_ARGS__) +#define vluxei64_v_i8m1(...) __riscv_vluxei64_v_i8m1(__VA_ARGS__) +#define vluxei8_v_i16mf4(...) __riscv_vluxei8_v_i16mf4(__VA_ARGS__) +#define vluxei8_v_i16mf2(...) __riscv_vluxei8_v_i16mf2(__VA_ARGS__) +#define vluxei8_v_i16m1(...) __riscv_vluxei8_v_i16m1(__VA_ARGS__) +#define vluxei8_v_i16m2(...) __riscv_vluxei8_v_i16m2(__VA_ARGS__) +#define vluxei8_v_i16m4(...) __riscv_vluxei8_v_i16m4(__VA_ARGS__) +#define vluxei8_v_i16m8(...) __riscv_vluxei8_v_i16m8(__VA_ARGS__) +#define vluxei16_v_i16mf4(...) __riscv_vluxei16_v_i16mf4(__VA_ARGS__) +#define vluxei16_v_i16mf2(...) __riscv_vluxei16_v_i16mf2(__VA_ARGS__) +#define vluxei16_v_i16m1(...) __riscv_vluxei16_v_i16m1(__VA_ARGS__) +#define vluxei16_v_i16m2(...) __riscv_vluxei16_v_i16m2(__VA_ARGS__) +#define vluxei16_v_i16m4(...) __riscv_vluxei16_v_i16m4(__VA_ARGS__) +#define vluxei16_v_i16m8(...) __riscv_vluxei16_v_i16m8(__VA_ARGS__) +#define vluxei32_v_i16mf4(...) __riscv_vluxei32_v_i16mf4(__VA_ARGS__) +#define vluxei32_v_i16mf2(...) __riscv_vluxei32_v_i16mf2(__VA_ARGS__) +#define vluxei32_v_i16m1(...) __riscv_vluxei32_v_i16m1(__VA_ARGS__) +#define vluxei32_v_i16m2(...) __riscv_vluxei32_v_i16m2(__VA_ARGS__) +#define vluxei32_v_i16m4(...) __riscv_vluxei32_v_i16m4(__VA_ARGS__) +#define vluxei64_v_i16mf4(...) __riscv_vluxei64_v_i16mf4(__VA_ARGS__) +#define vluxei64_v_i16mf2(...) __riscv_vluxei64_v_i16mf2(__VA_ARGS__) +#define vluxei64_v_i16m1(...) __riscv_vluxei64_v_i16m1(__VA_ARGS__) +#define vluxei64_v_i16m2(...) __riscv_vluxei64_v_i16m2(__VA_ARGS__) +#define vluxei8_v_i32mf2(...) __riscv_vluxei8_v_i32mf2(__VA_ARGS__) +#define vluxei8_v_i32m1(...) __riscv_vluxei8_v_i32m1(__VA_ARGS__) +#define vluxei8_v_i32m2(...) __riscv_vluxei8_v_i32m2(__VA_ARGS__) +#define vluxei8_v_i32m4(...) __riscv_vluxei8_v_i32m4(__VA_ARGS__) +#define vluxei8_v_i32m8(...) __riscv_vluxei8_v_i32m8(__VA_ARGS__) +#define vluxei16_v_i32mf2(...) __riscv_vluxei16_v_i32mf2(__VA_ARGS__) +#define vluxei16_v_i32m1(...) __riscv_vluxei16_v_i32m1(__VA_ARGS__) +#define vluxei16_v_i32m2(...) __riscv_vluxei16_v_i32m2(__VA_ARGS__) +#define vluxei16_v_i32m4(...) __riscv_vluxei16_v_i32m4(__VA_ARGS__) +#define vluxei16_v_i32m8(...) __riscv_vluxei16_v_i32m8(__VA_ARGS__) +#define vluxei32_v_i32mf2(...) __riscv_vluxei32_v_i32mf2(__VA_ARGS__) +#define vluxei32_v_i32m1(...) __riscv_vluxei32_v_i32m1(__VA_ARGS__) +#define vluxei32_v_i32m2(...) __riscv_vluxei32_v_i32m2(__VA_ARGS__) +#define vluxei32_v_i32m4(...) __riscv_vluxei32_v_i32m4(__VA_ARGS__) +#define vluxei32_v_i32m8(...) __riscv_vluxei32_v_i32m8(__VA_ARGS__) +#define vluxei64_v_i32mf2(...) __riscv_vluxei64_v_i32mf2(__VA_ARGS__) +#define vluxei64_v_i32m1(...) __riscv_vluxei64_v_i32m1(__VA_ARGS__) +#define vluxei64_v_i32m2(...) __riscv_vluxei64_v_i32m2(__VA_ARGS__) +#define vluxei64_v_i32m4(...) __riscv_vluxei64_v_i32m4(__VA_ARGS__) +#define vluxei8_v_i64m1(...) __riscv_vluxei8_v_i64m1(__VA_ARGS__) +#define vluxei8_v_i64m2(...) __riscv_vluxei8_v_i64m2(__VA_ARGS__) +#define vluxei8_v_i64m4(...) __riscv_vluxei8_v_i64m4(__VA_ARGS__) +#define vluxei8_v_i64m8(...) __riscv_vluxei8_v_i64m8(__VA_ARGS__) +#define vluxei16_v_i64m1(...) __riscv_vluxei16_v_i64m1(__VA_ARGS__) +#define vluxei16_v_i64m2(...) __riscv_vluxei16_v_i64m2(__VA_ARGS__) +#define vluxei16_v_i64m4(...) __riscv_vluxei16_v_i64m4(__VA_ARGS__) +#define vluxei16_v_i64m8(...) __riscv_vluxei16_v_i64m8(__VA_ARGS__) +#define vluxei32_v_i64m1(...) __riscv_vluxei32_v_i64m1(__VA_ARGS__) +#define vluxei32_v_i64m2(...) __riscv_vluxei32_v_i64m2(__VA_ARGS__) +#define vluxei32_v_i64m4(...) __riscv_vluxei32_v_i64m4(__VA_ARGS__) +#define vluxei32_v_i64m8(...) __riscv_vluxei32_v_i64m8(__VA_ARGS__) +#define vluxei64_v_i64m1(...) __riscv_vluxei64_v_i64m1(__VA_ARGS__) +#define vluxei64_v_i64m2(...) __riscv_vluxei64_v_i64m2(__VA_ARGS__) +#define vluxei64_v_i64m4(...) __riscv_vluxei64_v_i64m4(__VA_ARGS__) +#define vluxei64_v_i64m8(...) __riscv_vluxei64_v_i64m8(__VA_ARGS__) +#define vloxei8_v_u8mf8(...) __riscv_vloxei8_v_u8mf8(__VA_ARGS__) +#define vloxei8_v_u8mf4(...) __riscv_vloxei8_v_u8mf4(__VA_ARGS__) +#define vloxei8_v_u8mf2(...) __riscv_vloxei8_v_u8mf2(__VA_ARGS__) +#define vloxei8_v_u8m1(...) __riscv_vloxei8_v_u8m1(__VA_ARGS__) +#define vloxei8_v_u8m2(...) __riscv_vloxei8_v_u8m2(__VA_ARGS__) +#define vloxei8_v_u8m4(...) __riscv_vloxei8_v_u8m4(__VA_ARGS__) +#define vloxei8_v_u8m8(...) __riscv_vloxei8_v_u8m8(__VA_ARGS__) +#define vloxei16_v_u8mf8(...) __riscv_vloxei16_v_u8mf8(__VA_ARGS__) +#define vloxei16_v_u8mf4(...) __riscv_vloxei16_v_u8mf4(__VA_ARGS__) +#define vloxei16_v_u8mf2(...) __riscv_vloxei16_v_u8mf2(__VA_ARGS__) +#define vloxei16_v_u8m1(...) __riscv_vloxei16_v_u8m1(__VA_ARGS__) +#define vloxei16_v_u8m2(...) __riscv_vloxei16_v_u8m2(__VA_ARGS__) +#define vloxei16_v_u8m4(...) __riscv_vloxei16_v_u8m4(__VA_ARGS__) +#define vloxei32_v_u8mf8(...) __riscv_vloxei32_v_u8mf8(__VA_ARGS__) +#define vloxei32_v_u8mf4(...) __riscv_vloxei32_v_u8mf4(__VA_ARGS__) +#define vloxei32_v_u8mf2(...) __riscv_vloxei32_v_u8mf2(__VA_ARGS__) +#define vloxei32_v_u8m1(...) __riscv_vloxei32_v_u8m1(__VA_ARGS__) +#define vloxei32_v_u8m2(...) __riscv_vloxei32_v_u8m2(__VA_ARGS__) +#define vloxei64_v_u8mf8(...) __riscv_vloxei64_v_u8mf8(__VA_ARGS__) +#define vloxei64_v_u8mf4(...) __riscv_vloxei64_v_u8mf4(__VA_ARGS__) +#define vloxei64_v_u8mf2(...) __riscv_vloxei64_v_u8mf2(__VA_ARGS__) +#define vloxei64_v_u8m1(...) __riscv_vloxei64_v_u8m1(__VA_ARGS__) +#define vloxei8_v_u16mf4(...) __riscv_vloxei8_v_u16mf4(__VA_ARGS__) +#define vloxei8_v_u16mf2(...) __riscv_vloxei8_v_u16mf2(__VA_ARGS__) +#define vloxei8_v_u16m1(...) __riscv_vloxei8_v_u16m1(__VA_ARGS__) +#define vloxei8_v_u16m2(...) __riscv_vloxei8_v_u16m2(__VA_ARGS__) +#define vloxei8_v_u16m4(...) __riscv_vloxei8_v_u16m4(__VA_ARGS__) +#define vloxei8_v_u16m8(...) __riscv_vloxei8_v_u16m8(__VA_ARGS__) +#define vloxei16_v_u16mf4(...) __riscv_vloxei16_v_u16mf4(__VA_ARGS__) +#define vloxei16_v_u16mf2(...) __riscv_vloxei16_v_u16mf2(__VA_ARGS__) +#define vloxei16_v_u16m1(...) __riscv_vloxei16_v_u16m1(__VA_ARGS__) +#define vloxei16_v_u16m2(...) __riscv_vloxei16_v_u16m2(__VA_ARGS__) +#define vloxei16_v_u16m4(...) __riscv_vloxei16_v_u16m4(__VA_ARGS__) +#define vloxei16_v_u16m8(...) __riscv_vloxei16_v_u16m8(__VA_ARGS__) +#define vloxei32_v_u16mf4(...) __riscv_vloxei32_v_u16mf4(__VA_ARGS__) +#define vloxei32_v_u16mf2(...) __riscv_vloxei32_v_u16mf2(__VA_ARGS__) +#define vloxei32_v_u16m1(...) __riscv_vloxei32_v_u16m1(__VA_ARGS__) +#define vloxei32_v_u16m2(...) __riscv_vloxei32_v_u16m2(__VA_ARGS__) +#define vloxei32_v_u16m4(...) __riscv_vloxei32_v_u16m4(__VA_ARGS__) +#define vloxei64_v_u16mf4(...) __riscv_vloxei64_v_u16mf4(__VA_ARGS__) +#define vloxei64_v_u16mf2(...) __riscv_vloxei64_v_u16mf2(__VA_ARGS__) +#define vloxei64_v_u16m1(...) __riscv_vloxei64_v_u16m1(__VA_ARGS__) +#define vloxei64_v_u16m2(...) __riscv_vloxei64_v_u16m2(__VA_ARGS__) +#define vloxei8_v_u32mf2(...) __riscv_vloxei8_v_u32mf2(__VA_ARGS__) +#define vloxei8_v_u32m1(...) __riscv_vloxei8_v_u32m1(__VA_ARGS__) +#define vloxei8_v_u32m2(...) __riscv_vloxei8_v_u32m2(__VA_ARGS__) +#define vloxei8_v_u32m4(...) __riscv_vloxei8_v_u32m4(__VA_ARGS__) +#define vloxei8_v_u32m8(...) __riscv_vloxei8_v_u32m8(__VA_ARGS__) +#define vloxei16_v_u32mf2(...) __riscv_vloxei16_v_u32mf2(__VA_ARGS__) +#define vloxei16_v_u32m1(...) __riscv_vloxei16_v_u32m1(__VA_ARGS__) +#define vloxei16_v_u32m2(...) __riscv_vloxei16_v_u32m2(__VA_ARGS__) +#define vloxei16_v_u32m4(...) __riscv_vloxei16_v_u32m4(__VA_ARGS__) +#define vloxei16_v_u32m8(...) __riscv_vloxei16_v_u32m8(__VA_ARGS__) +#define vloxei32_v_u32mf2(...) __riscv_vloxei32_v_u32mf2(__VA_ARGS__) +#define vloxei32_v_u32m1(...) __riscv_vloxei32_v_u32m1(__VA_ARGS__) +#define vloxei32_v_u32m2(...) __riscv_vloxei32_v_u32m2(__VA_ARGS__) +#define vloxei32_v_u32m4(...) __riscv_vloxei32_v_u32m4(__VA_ARGS__) +#define vloxei32_v_u32m8(...) __riscv_vloxei32_v_u32m8(__VA_ARGS__) +#define vloxei64_v_u32mf2(...) __riscv_vloxei64_v_u32mf2(__VA_ARGS__) +#define vloxei64_v_u32m1(...) __riscv_vloxei64_v_u32m1(__VA_ARGS__) +#define vloxei64_v_u32m2(...) __riscv_vloxei64_v_u32m2(__VA_ARGS__) +#define vloxei64_v_u32m4(...) __riscv_vloxei64_v_u32m4(__VA_ARGS__) +#define vloxei8_v_u64m1(...) __riscv_vloxei8_v_u64m1(__VA_ARGS__) +#define vloxei8_v_u64m2(...) __riscv_vloxei8_v_u64m2(__VA_ARGS__) +#define vloxei8_v_u64m4(...) __riscv_vloxei8_v_u64m4(__VA_ARGS__) +#define vloxei8_v_u64m8(...) __riscv_vloxei8_v_u64m8(__VA_ARGS__) +#define vloxei16_v_u64m1(...) __riscv_vloxei16_v_u64m1(__VA_ARGS__) +#define vloxei16_v_u64m2(...) __riscv_vloxei16_v_u64m2(__VA_ARGS__) +#define vloxei16_v_u64m4(...) __riscv_vloxei16_v_u64m4(__VA_ARGS__) +#define vloxei16_v_u64m8(...) __riscv_vloxei16_v_u64m8(__VA_ARGS__) +#define vloxei32_v_u64m1(...) __riscv_vloxei32_v_u64m1(__VA_ARGS__) +#define vloxei32_v_u64m2(...) __riscv_vloxei32_v_u64m2(__VA_ARGS__) +#define vloxei32_v_u64m4(...) __riscv_vloxei32_v_u64m4(__VA_ARGS__) +#define vloxei32_v_u64m8(...) __riscv_vloxei32_v_u64m8(__VA_ARGS__) +#define vloxei64_v_u64m1(...) __riscv_vloxei64_v_u64m1(__VA_ARGS__) +#define vloxei64_v_u64m2(...) __riscv_vloxei64_v_u64m2(__VA_ARGS__) +#define vloxei64_v_u64m4(...) __riscv_vloxei64_v_u64m4(__VA_ARGS__) +#define vloxei64_v_u64m8(...) __riscv_vloxei64_v_u64m8(__VA_ARGS__) +#define vluxei8_v_u8mf8(...) __riscv_vluxei8_v_u8mf8(__VA_ARGS__) +#define vluxei8_v_u8mf4(...) __riscv_vluxei8_v_u8mf4(__VA_ARGS__) +#define vluxei8_v_u8mf2(...) __riscv_vluxei8_v_u8mf2(__VA_ARGS__) +#define vluxei8_v_u8m1(...) __riscv_vluxei8_v_u8m1(__VA_ARGS__) +#define vluxei8_v_u8m2(...) __riscv_vluxei8_v_u8m2(__VA_ARGS__) +#define vluxei8_v_u8m4(...) __riscv_vluxei8_v_u8m4(__VA_ARGS__) +#define vluxei8_v_u8m8(...) __riscv_vluxei8_v_u8m8(__VA_ARGS__) +#define vluxei16_v_u8mf8(...) __riscv_vluxei16_v_u8mf8(__VA_ARGS__) +#define vluxei16_v_u8mf4(...) __riscv_vluxei16_v_u8mf4(__VA_ARGS__) +#define vluxei16_v_u8mf2(...) __riscv_vluxei16_v_u8mf2(__VA_ARGS__) +#define vluxei16_v_u8m1(...) __riscv_vluxei16_v_u8m1(__VA_ARGS__) +#define vluxei16_v_u8m2(...) __riscv_vluxei16_v_u8m2(__VA_ARGS__) +#define vluxei16_v_u8m4(...) __riscv_vluxei16_v_u8m4(__VA_ARGS__) +#define vluxei32_v_u8mf8(...) __riscv_vluxei32_v_u8mf8(__VA_ARGS__) +#define vluxei32_v_u8mf4(...) __riscv_vluxei32_v_u8mf4(__VA_ARGS__) +#define vluxei32_v_u8mf2(...) __riscv_vluxei32_v_u8mf2(__VA_ARGS__) +#define vluxei32_v_u8m1(...) __riscv_vluxei32_v_u8m1(__VA_ARGS__) +#define vluxei32_v_u8m2(...) __riscv_vluxei32_v_u8m2(__VA_ARGS__) +#define vluxei64_v_u8mf8(...) __riscv_vluxei64_v_u8mf8(__VA_ARGS__) +#define vluxei64_v_u8mf4(...) __riscv_vluxei64_v_u8mf4(__VA_ARGS__) +#define vluxei64_v_u8mf2(...) __riscv_vluxei64_v_u8mf2(__VA_ARGS__) +#define vluxei64_v_u8m1(...) __riscv_vluxei64_v_u8m1(__VA_ARGS__) +#define vluxei8_v_u16mf4(...) __riscv_vluxei8_v_u16mf4(__VA_ARGS__) +#define vluxei8_v_u16mf2(...) __riscv_vluxei8_v_u16mf2(__VA_ARGS__) +#define vluxei8_v_u16m1(...) __riscv_vluxei8_v_u16m1(__VA_ARGS__) +#define vluxei8_v_u16m2(...) __riscv_vluxei8_v_u16m2(__VA_ARGS__) +#define vluxei8_v_u16m4(...) __riscv_vluxei8_v_u16m4(__VA_ARGS__) +#define vluxei8_v_u16m8(...) __riscv_vluxei8_v_u16m8(__VA_ARGS__) +#define vluxei16_v_u16mf4(...) __riscv_vluxei16_v_u16mf4(__VA_ARGS__) +#define vluxei16_v_u16mf2(...) __riscv_vluxei16_v_u16mf2(__VA_ARGS__) +#define vluxei16_v_u16m1(...) __riscv_vluxei16_v_u16m1(__VA_ARGS__) +#define vluxei16_v_u16m2(...) __riscv_vluxei16_v_u16m2(__VA_ARGS__) +#define vluxei16_v_u16m4(...) __riscv_vluxei16_v_u16m4(__VA_ARGS__) +#define vluxei16_v_u16m8(...) __riscv_vluxei16_v_u16m8(__VA_ARGS__) +#define vluxei32_v_u16mf4(...) __riscv_vluxei32_v_u16mf4(__VA_ARGS__) +#define vluxei32_v_u16mf2(...) __riscv_vluxei32_v_u16mf2(__VA_ARGS__) +#define vluxei32_v_u16m1(...) __riscv_vluxei32_v_u16m1(__VA_ARGS__) +#define vluxei32_v_u16m2(...) __riscv_vluxei32_v_u16m2(__VA_ARGS__) +#define vluxei32_v_u16m4(...) __riscv_vluxei32_v_u16m4(__VA_ARGS__) +#define vluxei64_v_u16mf4(...) __riscv_vluxei64_v_u16mf4(__VA_ARGS__) +#define vluxei64_v_u16mf2(...) __riscv_vluxei64_v_u16mf2(__VA_ARGS__) +#define vluxei64_v_u16m1(...) __riscv_vluxei64_v_u16m1(__VA_ARGS__) +#define vluxei64_v_u16m2(...) __riscv_vluxei64_v_u16m2(__VA_ARGS__) +#define vluxei8_v_u32mf2(...) __riscv_vluxei8_v_u32mf2(__VA_ARGS__) +#define vluxei8_v_u32m1(...) __riscv_vluxei8_v_u32m1(__VA_ARGS__) +#define vluxei8_v_u32m2(...) __riscv_vluxei8_v_u32m2(__VA_ARGS__) +#define vluxei8_v_u32m4(...) __riscv_vluxei8_v_u32m4(__VA_ARGS__) +#define vluxei8_v_u32m8(...) __riscv_vluxei8_v_u32m8(__VA_ARGS__) +#define vluxei16_v_u32mf2(...) __riscv_vluxei16_v_u32mf2(__VA_ARGS__) +#define vluxei16_v_u32m1(...) __riscv_vluxei16_v_u32m1(__VA_ARGS__) +#define vluxei16_v_u32m2(...) __riscv_vluxei16_v_u32m2(__VA_ARGS__) +#define vluxei16_v_u32m4(...) __riscv_vluxei16_v_u32m4(__VA_ARGS__) +#define vluxei16_v_u32m8(...) __riscv_vluxei16_v_u32m8(__VA_ARGS__) +#define vluxei32_v_u32mf2(...) __riscv_vluxei32_v_u32mf2(__VA_ARGS__) +#define vluxei32_v_u32m1(...) __riscv_vluxei32_v_u32m1(__VA_ARGS__) +#define vluxei32_v_u32m2(...) __riscv_vluxei32_v_u32m2(__VA_ARGS__) +#define vluxei32_v_u32m4(...) __riscv_vluxei32_v_u32m4(__VA_ARGS__) +#define vluxei32_v_u32m8(...) __riscv_vluxei32_v_u32m8(__VA_ARGS__) +#define vluxei64_v_u32mf2(...) __riscv_vluxei64_v_u32mf2(__VA_ARGS__) +#define vluxei64_v_u32m1(...) __riscv_vluxei64_v_u32m1(__VA_ARGS__) +#define vluxei64_v_u32m2(...) __riscv_vluxei64_v_u32m2(__VA_ARGS__) +#define vluxei64_v_u32m4(...) __riscv_vluxei64_v_u32m4(__VA_ARGS__) +#define vluxei8_v_u64m1(...) __riscv_vluxei8_v_u64m1(__VA_ARGS__) +#define vluxei8_v_u64m2(...) __riscv_vluxei8_v_u64m2(__VA_ARGS__) +#define vluxei8_v_u64m4(...) __riscv_vluxei8_v_u64m4(__VA_ARGS__) +#define vluxei8_v_u64m8(...) __riscv_vluxei8_v_u64m8(__VA_ARGS__) +#define vluxei16_v_u64m1(...) __riscv_vluxei16_v_u64m1(__VA_ARGS__) +#define vluxei16_v_u64m2(...) __riscv_vluxei16_v_u64m2(__VA_ARGS__) +#define vluxei16_v_u64m4(...) __riscv_vluxei16_v_u64m4(__VA_ARGS__) +#define vluxei16_v_u64m8(...) __riscv_vluxei16_v_u64m8(__VA_ARGS__) +#define vluxei32_v_u64m1(...) __riscv_vluxei32_v_u64m1(__VA_ARGS__) +#define vluxei32_v_u64m2(...) __riscv_vluxei32_v_u64m2(__VA_ARGS__) +#define vluxei32_v_u64m4(...) __riscv_vluxei32_v_u64m4(__VA_ARGS__) +#define vluxei32_v_u64m8(...) __riscv_vluxei32_v_u64m8(__VA_ARGS__) +#define vluxei64_v_u64m1(...) __riscv_vluxei64_v_u64m1(__VA_ARGS__) +#define vluxei64_v_u64m2(...) __riscv_vluxei64_v_u64m2(__VA_ARGS__) +#define vluxei64_v_u64m4(...) __riscv_vluxei64_v_u64m4(__VA_ARGS__) +#define vluxei64_v_u64m8(...) __riscv_vluxei64_v_u64m8(__VA_ARGS__) +// masked functions +#define vloxei8_v_f16mf4_m(...) __riscv_vloxei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxei8_v_f16mf2_m(...) __riscv_vloxei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxei8_v_f16m1_m(...) __riscv_vloxei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxei8_v_f16m2_m(...) __riscv_vloxei8_v_f16m2_tumu(__VA_ARGS__) +#define vloxei8_v_f16m4_m(...) __riscv_vloxei8_v_f16m4_tumu(__VA_ARGS__) +#define vloxei8_v_f16m8_m(...) __riscv_vloxei8_v_f16m8_tumu(__VA_ARGS__) +#define vloxei16_v_f16mf4_m(...) __riscv_vloxei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxei16_v_f16mf2_m(...) __riscv_vloxei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxei16_v_f16m1_m(...) __riscv_vloxei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxei16_v_f16m2_m(...) __riscv_vloxei16_v_f16m2_tumu(__VA_ARGS__) +#define vloxei16_v_f16m4_m(...) __riscv_vloxei16_v_f16m4_tumu(__VA_ARGS__) +#define vloxei16_v_f16m8_m(...) __riscv_vloxei16_v_f16m8_tumu(__VA_ARGS__) +#define vloxei32_v_f16mf4_m(...) __riscv_vloxei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxei32_v_f16mf2_m(...) __riscv_vloxei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxei32_v_f16m1_m(...) __riscv_vloxei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxei32_v_f16m2_m(...) __riscv_vloxei32_v_f16m2_tumu(__VA_ARGS__) +#define vloxei32_v_f16m4_m(...) __riscv_vloxei32_v_f16m4_tumu(__VA_ARGS__) +#define vloxei64_v_f16mf4_m(...) __riscv_vloxei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxei64_v_f16mf2_m(...) __riscv_vloxei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxei64_v_f16m1_m(...) __riscv_vloxei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxei64_v_f16m2_m(...) __riscv_vloxei64_v_f16m2_tumu(__VA_ARGS__) +#define vloxei8_v_f32mf2_m(...) __riscv_vloxei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxei8_v_f32m1_m(...) __riscv_vloxei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxei8_v_f32m2_m(...) __riscv_vloxei8_v_f32m2_tumu(__VA_ARGS__) +#define vloxei8_v_f32m4_m(...) __riscv_vloxei8_v_f32m4_tumu(__VA_ARGS__) +#define vloxei8_v_f32m8_m(...) __riscv_vloxei8_v_f32m8_tumu(__VA_ARGS__) +#define vloxei16_v_f32mf2_m(...) __riscv_vloxei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxei16_v_f32m1_m(...) __riscv_vloxei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxei16_v_f32m2_m(...) __riscv_vloxei16_v_f32m2_tumu(__VA_ARGS__) +#define vloxei16_v_f32m4_m(...) __riscv_vloxei16_v_f32m4_tumu(__VA_ARGS__) +#define vloxei16_v_f32m8_m(...) __riscv_vloxei16_v_f32m8_tumu(__VA_ARGS__) +#define vloxei32_v_f32mf2_m(...) __riscv_vloxei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxei32_v_f32m1_m(...) __riscv_vloxei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxei32_v_f32m2_m(...) __riscv_vloxei32_v_f32m2_tumu(__VA_ARGS__) +#define vloxei32_v_f32m4_m(...) __riscv_vloxei32_v_f32m4_tumu(__VA_ARGS__) +#define vloxei32_v_f32m8_m(...) __riscv_vloxei32_v_f32m8_tumu(__VA_ARGS__) +#define vloxei64_v_f32mf2_m(...) __riscv_vloxei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxei64_v_f32m1_m(...) __riscv_vloxei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxei64_v_f32m2_m(...) __riscv_vloxei64_v_f32m2_tumu(__VA_ARGS__) +#define vloxei64_v_f32m4_m(...) __riscv_vloxei64_v_f32m4_tumu(__VA_ARGS__) +#define vloxei8_v_f64m1_m(...) __riscv_vloxei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxei8_v_f64m2_m(...) __riscv_vloxei8_v_f64m2_tumu(__VA_ARGS__) +#define vloxei8_v_f64m4_m(...) __riscv_vloxei8_v_f64m4_tumu(__VA_ARGS__) +#define vloxei8_v_f64m8_m(...) __riscv_vloxei8_v_f64m8_tumu(__VA_ARGS__) +#define vloxei16_v_f64m1_m(...) __riscv_vloxei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxei16_v_f64m2_m(...) __riscv_vloxei16_v_f64m2_tumu(__VA_ARGS__) +#define vloxei16_v_f64m4_m(...) __riscv_vloxei16_v_f64m4_tumu(__VA_ARGS__) +#define vloxei16_v_f64m8_m(...) __riscv_vloxei16_v_f64m8_tumu(__VA_ARGS__) +#define vloxei32_v_f64m1_m(...) __riscv_vloxei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxei32_v_f64m2_m(...) __riscv_vloxei32_v_f64m2_tumu(__VA_ARGS__) +#define vloxei32_v_f64m4_m(...) __riscv_vloxei32_v_f64m4_tumu(__VA_ARGS__) +#define vloxei32_v_f64m8_m(...) __riscv_vloxei32_v_f64m8_tumu(__VA_ARGS__) +#define vloxei64_v_f64m1_m(...) __riscv_vloxei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxei64_v_f64m2_m(...) __riscv_vloxei64_v_f64m2_tumu(__VA_ARGS__) +#define vloxei64_v_f64m4_m(...) __riscv_vloxei64_v_f64m4_tumu(__VA_ARGS__) +#define vloxei64_v_f64m8_m(...) __riscv_vloxei64_v_f64m8_tumu(__VA_ARGS__) +#define vluxei8_v_f16mf4_m(...) __riscv_vluxei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxei8_v_f16mf2_m(...) __riscv_vluxei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxei8_v_f16m1_m(...) __riscv_vluxei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxei8_v_f16m2_m(...) __riscv_vluxei8_v_f16m2_tumu(__VA_ARGS__) +#define vluxei8_v_f16m4_m(...) __riscv_vluxei8_v_f16m4_tumu(__VA_ARGS__) +#define vluxei8_v_f16m8_m(...) __riscv_vluxei8_v_f16m8_tumu(__VA_ARGS__) +#define vluxei16_v_f16mf4_m(...) __riscv_vluxei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxei16_v_f16mf2_m(...) __riscv_vluxei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxei16_v_f16m1_m(...) __riscv_vluxei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxei16_v_f16m2_m(...) __riscv_vluxei16_v_f16m2_tumu(__VA_ARGS__) +#define vluxei16_v_f16m4_m(...) __riscv_vluxei16_v_f16m4_tumu(__VA_ARGS__) +#define vluxei16_v_f16m8_m(...) __riscv_vluxei16_v_f16m8_tumu(__VA_ARGS__) +#define vluxei32_v_f16mf4_m(...) __riscv_vluxei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxei32_v_f16mf2_m(...) __riscv_vluxei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxei32_v_f16m1_m(...) __riscv_vluxei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxei32_v_f16m2_m(...) __riscv_vluxei32_v_f16m2_tumu(__VA_ARGS__) +#define vluxei32_v_f16m4_m(...) __riscv_vluxei32_v_f16m4_tumu(__VA_ARGS__) +#define vluxei64_v_f16mf4_m(...) __riscv_vluxei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxei64_v_f16mf2_m(...) __riscv_vluxei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxei64_v_f16m1_m(...) __riscv_vluxei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxei64_v_f16m2_m(...) __riscv_vluxei64_v_f16m2_tumu(__VA_ARGS__) +#define vluxei8_v_f32mf2_m(...) __riscv_vluxei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxei8_v_f32m1_m(...) __riscv_vluxei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxei8_v_f32m2_m(...) __riscv_vluxei8_v_f32m2_tumu(__VA_ARGS__) +#define vluxei8_v_f32m4_m(...) __riscv_vluxei8_v_f32m4_tumu(__VA_ARGS__) +#define vluxei8_v_f32m8_m(...) __riscv_vluxei8_v_f32m8_tumu(__VA_ARGS__) +#define vluxei16_v_f32mf2_m(...) __riscv_vluxei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxei16_v_f32m1_m(...) __riscv_vluxei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxei16_v_f32m2_m(...) __riscv_vluxei16_v_f32m2_tumu(__VA_ARGS__) +#define vluxei16_v_f32m4_m(...) __riscv_vluxei16_v_f32m4_tumu(__VA_ARGS__) +#define vluxei16_v_f32m8_m(...) __riscv_vluxei16_v_f32m8_tumu(__VA_ARGS__) +#define vluxei32_v_f32mf2_m(...) __riscv_vluxei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxei32_v_f32m1_m(...) __riscv_vluxei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxei32_v_f32m2_m(...) __riscv_vluxei32_v_f32m2_tumu(__VA_ARGS__) +#define vluxei32_v_f32m4_m(...) __riscv_vluxei32_v_f32m4_tumu(__VA_ARGS__) +#define vluxei32_v_f32m8_m(...) __riscv_vluxei32_v_f32m8_tumu(__VA_ARGS__) +#define vluxei64_v_f32mf2_m(...) __riscv_vluxei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxei64_v_f32m1_m(...) __riscv_vluxei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxei64_v_f32m2_m(...) __riscv_vluxei64_v_f32m2_tumu(__VA_ARGS__) +#define vluxei64_v_f32m4_m(...) __riscv_vluxei64_v_f32m4_tumu(__VA_ARGS__) +#define vluxei8_v_f64m1_m(...) __riscv_vluxei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxei8_v_f64m2_m(...) __riscv_vluxei8_v_f64m2_tumu(__VA_ARGS__) +#define vluxei8_v_f64m4_m(...) __riscv_vluxei8_v_f64m4_tumu(__VA_ARGS__) +#define vluxei8_v_f64m8_m(...) __riscv_vluxei8_v_f64m8_tumu(__VA_ARGS__) +#define vluxei16_v_f64m1_m(...) __riscv_vluxei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxei16_v_f64m2_m(...) __riscv_vluxei16_v_f64m2_tumu(__VA_ARGS__) +#define vluxei16_v_f64m4_m(...) __riscv_vluxei16_v_f64m4_tumu(__VA_ARGS__) +#define vluxei16_v_f64m8_m(...) __riscv_vluxei16_v_f64m8_tumu(__VA_ARGS__) +#define vluxei32_v_f64m1_m(...) __riscv_vluxei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxei32_v_f64m2_m(...) __riscv_vluxei32_v_f64m2_tumu(__VA_ARGS__) +#define vluxei32_v_f64m4_m(...) __riscv_vluxei32_v_f64m4_tumu(__VA_ARGS__) +#define vluxei32_v_f64m8_m(...) __riscv_vluxei32_v_f64m8_tumu(__VA_ARGS__) +#define vluxei64_v_f64m1_m(...) __riscv_vluxei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxei64_v_f64m2_m(...) __riscv_vluxei64_v_f64m2_tumu(__VA_ARGS__) +#define vluxei64_v_f64m4_m(...) __riscv_vluxei64_v_f64m4_tumu(__VA_ARGS__) +#define vluxei64_v_f64m8_m(...) __riscv_vluxei64_v_f64m8_tumu(__VA_ARGS__) +#define vloxei8_v_i8mf8_m(...) __riscv_vloxei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxei8_v_i8mf4_m(...) __riscv_vloxei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxei8_v_i8mf2_m(...) __riscv_vloxei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxei8_v_i8m1_m(...) __riscv_vloxei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxei8_v_i8m2_m(...) __riscv_vloxei8_v_i8m2_tumu(__VA_ARGS__) +#define vloxei8_v_i8m4_m(...) __riscv_vloxei8_v_i8m4_tumu(__VA_ARGS__) +#define vloxei8_v_i8m8_m(...) __riscv_vloxei8_v_i8m8_tumu(__VA_ARGS__) +#define vloxei16_v_i8mf8_m(...) __riscv_vloxei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxei16_v_i8mf4_m(...) __riscv_vloxei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxei16_v_i8mf2_m(...) __riscv_vloxei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxei16_v_i8m1_m(...) __riscv_vloxei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxei16_v_i8m2_m(...) __riscv_vloxei16_v_i8m2_tumu(__VA_ARGS__) +#define vloxei16_v_i8m4_m(...) __riscv_vloxei16_v_i8m4_tumu(__VA_ARGS__) +#define vloxei32_v_i8mf8_m(...) __riscv_vloxei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxei32_v_i8mf4_m(...) __riscv_vloxei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxei32_v_i8mf2_m(...) __riscv_vloxei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxei32_v_i8m1_m(...) __riscv_vloxei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxei32_v_i8m2_m(...) __riscv_vloxei32_v_i8m2_tumu(__VA_ARGS__) +#define vloxei64_v_i8mf8_m(...) __riscv_vloxei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxei64_v_i8mf4_m(...) __riscv_vloxei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxei64_v_i8mf2_m(...) __riscv_vloxei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxei64_v_i8m1_m(...) __riscv_vloxei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxei8_v_i16mf4_m(...) __riscv_vloxei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxei8_v_i16mf2_m(...) __riscv_vloxei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxei8_v_i16m1_m(...) __riscv_vloxei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxei8_v_i16m2_m(...) __riscv_vloxei8_v_i16m2_tumu(__VA_ARGS__) +#define vloxei8_v_i16m4_m(...) __riscv_vloxei8_v_i16m4_tumu(__VA_ARGS__) +#define vloxei8_v_i16m8_m(...) __riscv_vloxei8_v_i16m8_tumu(__VA_ARGS__) +#define vloxei16_v_i16mf4_m(...) __riscv_vloxei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxei16_v_i16mf2_m(...) __riscv_vloxei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxei16_v_i16m1_m(...) __riscv_vloxei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxei16_v_i16m2_m(...) __riscv_vloxei16_v_i16m2_tumu(__VA_ARGS__) +#define vloxei16_v_i16m4_m(...) __riscv_vloxei16_v_i16m4_tumu(__VA_ARGS__) +#define vloxei16_v_i16m8_m(...) __riscv_vloxei16_v_i16m8_tumu(__VA_ARGS__) +#define vloxei32_v_i16mf4_m(...) __riscv_vloxei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxei32_v_i16mf2_m(...) __riscv_vloxei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxei32_v_i16m1_m(...) __riscv_vloxei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxei32_v_i16m2_m(...) __riscv_vloxei32_v_i16m2_tumu(__VA_ARGS__) +#define vloxei32_v_i16m4_m(...) __riscv_vloxei32_v_i16m4_tumu(__VA_ARGS__) +#define vloxei64_v_i16mf4_m(...) __riscv_vloxei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxei64_v_i16mf2_m(...) __riscv_vloxei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxei64_v_i16m1_m(...) __riscv_vloxei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxei64_v_i16m2_m(...) __riscv_vloxei64_v_i16m2_tumu(__VA_ARGS__) +#define vloxei8_v_i32mf2_m(...) __riscv_vloxei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxei8_v_i32m1_m(...) __riscv_vloxei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxei8_v_i32m2_m(...) __riscv_vloxei8_v_i32m2_tumu(__VA_ARGS__) +#define vloxei8_v_i32m4_m(...) __riscv_vloxei8_v_i32m4_tumu(__VA_ARGS__) +#define vloxei8_v_i32m8_m(...) __riscv_vloxei8_v_i32m8_tumu(__VA_ARGS__) +#define vloxei16_v_i32mf2_m(...) __riscv_vloxei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxei16_v_i32m1_m(...) __riscv_vloxei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxei16_v_i32m2_m(...) __riscv_vloxei16_v_i32m2_tumu(__VA_ARGS__) +#define vloxei16_v_i32m4_m(...) __riscv_vloxei16_v_i32m4_tumu(__VA_ARGS__) +#define vloxei16_v_i32m8_m(...) __riscv_vloxei16_v_i32m8_tumu(__VA_ARGS__) +#define vloxei32_v_i32mf2_m(...) __riscv_vloxei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxei32_v_i32m1_m(...) __riscv_vloxei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxei32_v_i32m2_m(...) __riscv_vloxei32_v_i32m2_tumu(__VA_ARGS__) +#define vloxei32_v_i32m4_m(...) __riscv_vloxei32_v_i32m4_tumu(__VA_ARGS__) +#define vloxei32_v_i32m8_m(...) __riscv_vloxei32_v_i32m8_tumu(__VA_ARGS__) +#define vloxei64_v_i32mf2_m(...) __riscv_vloxei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxei64_v_i32m1_m(...) __riscv_vloxei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxei64_v_i32m2_m(...) __riscv_vloxei64_v_i32m2_tumu(__VA_ARGS__) +#define vloxei64_v_i32m4_m(...) __riscv_vloxei64_v_i32m4_tumu(__VA_ARGS__) +#define vloxei8_v_i64m1_m(...) __riscv_vloxei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxei8_v_i64m2_m(...) __riscv_vloxei8_v_i64m2_tumu(__VA_ARGS__) +#define vloxei8_v_i64m4_m(...) __riscv_vloxei8_v_i64m4_tumu(__VA_ARGS__) +#define vloxei8_v_i64m8_m(...) __riscv_vloxei8_v_i64m8_tumu(__VA_ARGS__) +#define vloxei16_v_i64m1_m(...) __riscv_vloxei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxei16_v_i64m2_m(...) __riscv_vloxei16_v_i64m2_tumu(__VA_ARGS__) +#define vloxei16_v_i64m4_m(...) __riscv_vloxei16_v_i64m4_tumu(__VA_ARGS__) +#define vloxei16_v_i64m8_m(...) __riscv_vloxei16_v_i64m8_tumu(__VA_ARGS__) +#define vloxei32_v_i64m1_m(...) __riscv_vloxei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxei32_v_i64m2_m(...) __riscv_vloxei32_v_i64m2_tumu(__VA_ARGS__) +#define vloxei32_v_i64m4_m(...) __riscv_vloxei32_v_i64m4_tumu(__VA_ARGS__) +#define vloxei32_v_i64m8_m(...) __riscv_vloxei32_v_i64m8_tumu(__VA_ARGS__) +#define vloxei64_v_i64m1_m(...) __riscv_vloxei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxei64_v_i64m2_m(...) __riscv_vloxei64_v_i64m2_tumu(__VA_ARGS__) +#define vloxei64_v_i64m4_m(...) __riscv_vloxei64_v_i64m4_tumu(__VA_ARGS__) +#define vloxei64_v_i64m8_m(...) __riscv_vloxei64_v_i64m8_tumu(__VA_ARGS__) +#define vluxei8_v_i8mf8_m(...) __riscv_vluxei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxei8_v_i8mf4_m(...) __riscv_vluxei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxei8_v_i8mf2_m(...) __riscv_vluxei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxei8_v_i8m1_m(...) __riscv_vluxei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxei8_v_i8m2_m(...) __riscv_vluxei8_v_i8m2_tumu(__VA_ARGS__) +#define vluxei8_v_i8m4_m(...) __riscv_vluxei8_v_i8m4_tumu(__VA_ARGS__) +#define vluxei8_v_i8m8_m(...) __riscv_vluxei8_v_i8m8_tumu(__VA_ARGS__) +#define vluxei16_v_i8mf8_m(...) __riscv_vluxei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxei16_v_i8mf4_m(...) __riscv_vluxei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxei16_v_i8mf2_m(...) __riscv_vluxei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxei16_v_i8m1_m(...) __riscv_vluxei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxei16_v_i8m2_m(...) __riscv_vluxei16_v_i8m2_tumu(__VA_ARGS__) +#define vluxei16_v_i8m4_m(...) __riscv_vluxei16_v_i8m4_tumu(__VA_ARGS__) +#define vluxei32_v_i8mf8_m(...) __riscv_vluxei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxei32_v_i8mf4_m(...) __riscv_vluxei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxei32_v_i8mf2_m(...) __riscv_vluxei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxei32_v_i8m1_m(...) __riscv_vluxei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxei32_v_i8m2_m(...) __riscv_vluxei32_v_i8m2_tumu(__VA_ARGS__) +#define vluxei64_v_i8mf8_m(...) __riscv_vluxei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxei64_v_i8mf4_m(...) __riscv_vluxei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxei64_v_i8mf2_m(...) __riscv_vluxei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxei64_v_i8m1_m(...) __riscv_vluxei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxei8_v_i16mf4_m(...) __riscv_vluxei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxei8_v_i16mf2_m(...) __riscv_vluxei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxei8_v_i16m1_m(...) __riscv_vluxei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxei8_v_i16m2_m(...) __riscv_vluxei8_v_i16m2_tumu(__VA_ARGS__) +#define vluxei8_v_i16m4_m(...) __riscv_vluxei8_v_i16m4_tumu(__VA_ARGS__) +#define vluxei8_v_i16m8_m(...) __riscv_vluxei8_v_i16m8_tumu(__VA_ARGS__) +#define vluxei16_v_i16mf4_m(...) __riscv_vluxei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxei16_v_i16mf2_m(...) __riscv_vluxei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxei16_v_i16m1_m(...) __riscv_vluxei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxei16_v_i16m2_m(...) __riscv_vluxei16_v_i16m2_tumu(__VA_ARGS__) +#define vluxei16_v_i16m4_m(...) __riscv_vluxei16_v_i16m4_tumu(__VA_ARGS__) +#define vluxei16_v_i16m8_m(...) __riscv_vluxei16_v_i16m8_tumu(__VA_ARGS__) +#define vluxei32_v_i16mf4_m(...) __riscv_vluxei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxei32_v_i16mf2_m(...) __riscv_vluxei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxei32_v_i16m1_m(...) __riscv_vluxei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxei32_v_i16m2_m(...) __riscv_vluxei32_v_i16m2_tumu(__VA_ARGS__) +#define vluxei32_v_i16m4_m(...) __riscv_vluxei32_v_i16m4_tumu(__VA_ARGS__) +#define vluxei64_v_i16mf4_m(...) __riscv_vluxei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxei64_v_i16mf2_m(...) __riscv_vluxei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxei64_v_i16m1_m(...) __riscv_vluxei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxei64_v_i16m2_m(...) __riscv_vluxei64_v_i16m2_tumu(__VA_ARGS__) +#define vluxei8_v_i32mf2_m(...) __riscv_vluxei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxei8_v_i32m1_m(...) __riscv_vluxei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxei8_v_i32m2_m(...) __riscv_vluxei8_v_i32m2_tumu(__VA_ARGS__) +#define vluxei8_v_i32m4_m(...) __riscv_vluxei8_v_i32m4_tumu(__VA_ARGS__) +#define vluxei8_v_i32m8_m(...) __riscv_vluxei8_v_i32m8_tumu(__VA_ARGS__) +#define vluxei16_v_i32mf2_m(...) __riscv_vluxei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxei16_v_i32m1_m(...) __riscv_vluxei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxei16_v_i32m2_m(...) __riscv_vluxei16_v_i32m2_tumu(__VA_ARGS__) +#define vluxei16_v_i32m4_m(...) __riscv_vluxei16_v_i32m4_tumu(__VA_ARGS__) +#define vluxei16_v_i32m8_m(...) __riscv_vluxei16_v_i32m8_tumu(__VA_ARGS__) +#define vluxei32_v_i32mf2_m(...) __riscv_vluxei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxei32_v_i32m1_m(...) __riscv_vluxei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxei32_v_i32m2_m(...) __riscv_vluxei32_v_i32m2_tumu(__VA_ARGS__) +#define vluxei32_v_i32m4_m(...) __riscv_vluxei32_v_i32m4_tumu(__VA_ARGS__) +#define vluxei32_v_i32m8_m(...) __riscv_vluxei32_v_i32m8_tumu(__VA_ARGS__) +#define vluxei64_v_i32mf2_m(...) __riscv_vluxei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxei64_v_i32m1_m(...) __riscv_vluxei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxei64_v_i32m2_m(...) __riscv_vluxei64_v_i32m2_tumu(__VA_ARGS__) +#define vluxei64_v_i32m4_m(...) __riscv_vluxei64_v_i32m4_tumu(__VA_ARGS__) +#define vluxei8_v_i64m1_m(...) __riscv_vluxei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxei8_v_i64m2_m(...) __riscv_vluxei8_v_i64m2_tumu(__VA_ARGS__) +#define vluxei8_v_i64m4_m(...) __riscv_vluxei8_v_i64m4_tumu(__VA_ARGS__) +#define vluxei8_v_i64m8_m(...) __riscv_vluxei8_v_i64m8_tumu(__VA_ARGS__) +#define vluxei16_v_i64m1_m(...) __riscv_vluxei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxei16_v_i64m2_m(...) __riscv_vluxei16_v_i64m2_tumu(__VA_ARGS__) +#define vluxei16_v_i64m4_m(...) __riscv_vluxei16_v_i64m4_tumu(__VA_ARGS__) +#define vluxei16_v_i64m8_m(...) __riscv_vluxei16_v_i64m8_tumu(__VA_ARGS__) +#define vluxei32_v_i64m1_m(...) __riscv_vluxei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxei32_v_i64m2_m(...) __riscv_vluxei32_v_i64m2_tumu(__VA_ARGS__) +#define vluxei32_v_i64m4_m(...) __riscv_vluxei32_v_i64m4_tumu(__VA_ARGS__) +#define vluxei32_v_i64m8_m(...) __riscv_vluxei32_v_i64m8_tumu(__VA_ARGS__) +#define vluxei64_v_i64m1_m(...) __riscv_vluxei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxei64_v_i64m2_m(...) __riscv_vluxei64_v_i64m2_tumu(__VA_ARGS__) +#define vluxei64_v_i64m4_m(...) __riscv_vluxei64_v_i64m4_tumu(__VA_ARGS__) +#define vluxei64_v_i64m8_m(...) __riscv_vluxei64_v_i64m8_tumu(__VA_ARGS__) +#define vloxei8_v_u8mf8_m(...) __riscv_vloxei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxei8_v_u8mf4_m(...) __riscv_vloxei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxei8_v_u8mf2_m(...) __riscv_vloxei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxei8_v_u8m1_m(...) __riscv_vloxei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxei8_v_u8m2_m(...) __riscv_vloxei8_v_u8m2_tumu(__VA_ARGS__) +#define vloxei8_v_u8m4_m(...) __riscv_vloxei8_v_u8m4_tumu(__VA_ARGS__) +#define vloxei8_v_u8m8_m(...) __riscv_vloxei8_v_u8m8_tumu(__VA_ARGS__) +#define vloxei16_v_u8mf8_m(...) __riscv_vloxei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxei16_v_u8mf4_m(...) __riscv_vloxei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxei16_v_u8mf2_m(...) __riscv_vloxei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxei16_v_u8m1_m(...) __riscv_vloxei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxei16_v_u8m2_m(...) __riscv_vloxei16_v_u8m2_tumu(__VA_ARGS__) +#define vloxei16_v_u8m4_m(...) __riscv_vloxei16_v_u8m4_tumu(__VA_ARGS__) +#define vloxei32_v_u8mf8_m(...) __riscv_vloxei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxei32_v_u8mf4_m(...) __riscv_vloxei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxei32_v_u8mf2_m(...) __riscv_vloxei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxei32_v_u8m1_m(...) __riscv_vloxei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxei32_v_u8m2_m(...) __riscv_vloxei32_v_u8m2_tumu(__VA_ARGS__) +#define vloxei64_v_u8mf8_m(...) __riscv_vloxei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxei64_v_u8mf4_m(...) __riscv_vloxei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxei64_v_u8mf2_m(...) __riscv_vloxei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxei64_v_u8m1_m(...) __riscv_vloxei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxei8_v_u16mf4_m(...) __riscv_vloxei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxei8_v_u16mf2_m(...) __riscv_vloxei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxei8_v_u16m1_m(...) __riscv_vloxei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxei8_v_u16m2_m(...) __riscv_vloxei8_v_u16m2_tumu(__VA_ARGS__) +#define vloxei8_v_u16m4_m(...) __riscv_vloxei8_v_u16m4_tumu(__VA_ARGS__) +#define vloxei8_v_u16m8_m(...) __riscv_vloxei8_v_u16m8_tumu(__VA_ARGS__) +#define vloxei16_v_u16mf4_m(...) __riscv_vloxei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxei16_v_u16mf2_m(...) __riscv_vloxei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxei16_v_u16m1_m(...) __riscv_vloxei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxei16_v_u16m2_m(...) __riscv_vloxei16_v_u16m2_tumu(__VA_ARGS__) +#define vloxei16_v_u16m4_m(...) __riscv_vloxei16_v_u16m4_tumu(__VA_ARGS__) +#define vloxei16_v_u16m8_m(...) __riscv_vloxei16_v_u16m8_tumu(__VA_ARGS__) +#define vloxei32_v_u16mf4_m(...) __riscv_vloxei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxei32_v_u16mf2_m(...) __riscv_vloxei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxei32_v_u16m1_m(...) __riscv_vloxei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxei32_v_u16m2_m(...) __riscv_vloxei32_v_u16m2_tumu(__VA_ARGS__) +#define vloxei32_v_u16m4_m(...) __riscv_vloxei32_v_u16m4_tumu(__VA_ARGS__) +#define vloxei64_v_u16mf4_m(...) __riscv_vloxei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxei64_v_u16mf2_m(...) __riscv_vloxei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxei64_v_u16m1_m(...) __riscv_vloxei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxei64_v_u16m2_m(...) __riscv_vloxei64_v_u16m2_tumu(__VA_ARGS__) +#define vloxei8_v_u32mf2_m(...) __riscv_vloxei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxei8_v_u32m1_m(...) __riscv_vloxei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxei8_v_u32m2_m(...) __riscv_vloxei8_v_u32m2_tumu(__VA_ARGS__) +#define vloxei8_v_u32m4_m(...) __riscv_vloxei8_v_u32m4_tumu(__VA_ARGS__) +#define vloxei8_v_u32m8_m(...) __riscv_vloxei8_v_u32m8_tumu(__VA_ARGS__) +#define vloxei16_v_u32mf2_m(...) __riscv_vloxei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxei16_v_u32m1_m(...) __riscv_vloxei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxei16_v_u32m2_m(...) __riscv_vloxei16_v_u32m2_tumu(__VA_ARGS__) +#define vloxei16_v_u32m4_m(...) __riscv_vloxei16_v_u32m4_tumu(__VA_ARGS__) +#define vloxei16_v_u32m8_m(...) __riscv_vloxei16_v_u32m8_tumu(__VA_ARGS__) +#define vloxei32_v_u32mf2_m(...) __riscv_vloxei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxei32_v_u32m1_m(...) __riscv_vloxei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxei32_v_u32m2_m(...) __riscv_vloxei32_v_u32m2_tumu(__VA_ARGS__) +#define vloxei32_v_u32m4_m(...) __riscv_vloxei32_v_u32m4_tumu(__VA_ARGS__) +#define vloxei32_v_u32m8_m(...) __riscv_vloxei32_v_u32m8_tumu(__VA_ARGS__) +#define vloxei64_v_u32mf2_m(...) __riscv_vloxei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxei64_v_u32m1_m(...) __riscv_vloxei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxei64_v_u32m2_m(...) __riscv_vloxei64_v_u32m2_tumu(__VA_ARGS__) +#define vloxei64_v_u32m4_m(...) __riscv_vloxei64_v_u32m4_tumu(__VA_ARGS__) +#define vloxei8_v_u64m1_m(...) __riscv_vloxei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxei8_v_u64m2_m(...) __riscv_vloxei8_v_u64m2_tumu(__VA_ARGS__) +#define vloxei8_v_u64m4_m(...) __riscv_vloxei8_v_u64m4_tumu(__VA_ARGS__) +#define vloxei8_v_u64m8_m(...) __riscv_vloxei8_v_u64m8_tumu(__VA_ARGS__) +#define vloxei16_v_u64m1_m(...) __riscv_vloxei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxei16_v_u64m2_m(...) __riscv_vloxei16_v_u64m2_tumu(__VA_ARGS__) +#define vloxei16_v_u64m4_m(...) __riscv_vloxei16_v_u64m4_tumu(__VA_ARGS__) +#define vloxei16_v_u64m8_m(...) __riscv_vloxei16_v_u64m8_tumu(__VA_ARGS__) +#define vloxei32_v_u64m1_m(...) __riscv_vloxei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxei32_v_u64m2_m(...) __riscv_vloxei32_v_u64m2_tumu(__VA_ARGS__) +#define vloxei32_v_u64m4_m(...) __riscv_vloxei32_v_u64m4_tumu(__VA_ARGS__) +#define vloxei32_v_u64m8_m(...) __riscv_vloxei32_v_u64m8_tumu(__VA_ARGS__) +#define vloxei64_v_u64m1_m(...) __riscv_vloxei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxei64_v_u64m2_m(...) __riscv_vloxei64_v_u64m2_tumu(__VA_ARGS__) +#define vloxei64_v_u64m4_m(...) __riscv_vloxei64_v_u64m4_tumu(__VA_ARGS__) +#define vloxei64_v_u64m8_m(...) __riscv_vloxei64_v_u64m8_tumu(__VA_ARGS__) +#define vluxei8_v_u8mf8_m(...) __riscv_vluxei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxei8_v_u8mf4_m(...) __riscv_vluxei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxei8_v_u8mf2_m(...) __riscv_vluxei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxei8_v_u8m1_m(...) __riscv_vluxei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxei8_v_u8m2_m(...) __riscv_vluxei8_v_u8m2_tumu(__VA_ARGS__) +#define vluxei8_v_u8m4_m(...) __riscv_vluxei8_v_u8m4_tumu(__VA_ARGS__) +#define vluxei8_v_u8m8_m(...) __riscv_vluxei8_v_u8m8_tumu(__VA_ARGS__) +#define vluxei16_v_u8mf8_m(...) __riscv_vluxei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxei16_v_u8mf4_m(...) __riscv_vluxei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxei16_v_u8mf2_m(...) __riscv_vluxei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxei16_v_u8m1_m(...) __riscv_vluxei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxei16_v_u8m2_m(...) __riscv_vluxei16_v_u8m2_tumu(__VA_ARGS__) +#define vluxei16_v_u8m4_m(...) __riscv_vluxei16_v_u8m4_tumu(__VA_ARGS__) +#define vluxei32_v_u8mf8_m(...) __riscv_vluxei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxei32_v_u8mf4_m(...) __riscv_vluxei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxei32_v_u8mf2_m(...) __riscv_vluxei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxei32_v_u8m1_m(...) __riscv_vluxei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxei32_v_u8m2_m(...) __riscv_vluxei32_v_u8m2_tumu(__VA_ARGS__) +#define vluxei64_v_u8mf8_m(...) __riscv_vluxei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxei64_v_u8mf4_m(...) __riscv_vluxei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxei64_v_u8mf2_m(...) __riscv_vluxei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxei64_v_u8m1_m(...) __riscv_vluxei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxei8_v_u16mf4_m(...) __riscv_vluxei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxei8_v_u16mf2_m(...) __riscv_vluxei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxei8_v_u16m1_m(...) __riscv_vluxei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxei8_v_u16m2_m(...) __riscv_vluxei8_v_u16m2_tumu(__VA_ARGS__) +#define vluxei8_v_u16m4_m(...) __riscv_vluxei8_v_u16m4_tumu(__VA_ARGS__) +#define vluxei8_v_u16m8_m(...) __riscv_vluxei8_v_u16m8_tumu(__VA_ARGS__) +#define vluxei16_v_u16mf4_m(...) __riscv_vluxei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxei16_v_u16mf2_m(...) __riscv_vluxei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxei16_v_u16m1_m(...) __riscv_vluxei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxei16_v_u16m2_m(...) __riscv_vluxei16_v_u16m2_tumu(__VA_ARGS__) +#define vluxei16_v_u16m4_m(...) __riscv_vluxei16_v_u16m4_tumu(__VA_ARGS__) +#define vluxei16_v_u16m8_m(...) __riscv_vluxei16_v_u16m8_tumu(__VA_ARGS__) +#define vluxei32_v_u16mf4_m(...) __riscv_vluxei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxei32_v_u16mf2_m(...) __riscv_vluxei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxei32_v_u16m1_m(...) __riscv_vluxei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxei32_v_u16m2_m(...) __riscv_vluxei32_v_u16m2_tumu(__VA_ARGS__) +#define vluxei32_v_u16m4_m(...) __riscv_vluxei32_v_u16m4_tumu(__VA_ARGS__) +#define vluxei64_v_u16mf4_m(...) __riscv_vluxei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxei64_v_u16mf2_m(...) __riscv_vluxei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxei64_v_u16m1_m(...) __riscv_vluxei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxei64_v_u16m2_m(...) __riscv_vluxei64_v_u16m2_tumu(__VA_ARGS__) +#define vluxei8_v_u32mf2_m(...) __riscv_vluxei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxei8_v_u32m1_m(...) __riscv_vluxei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxei8_v_u32m2_m(...) __riscv_vluxei8_v_u32m2_tumu(__VA_ARGS__) +#define vluxei8_v_u32m4_m(...) __riscv_vluxei8_v_u32m4_tumu(__VA_ARGS__) +#define vluxei8_v_u32m8_m(...) __riscv_vluxei8_v_u32m8_tumu(__VA_ARGS__) +#define vluxei16_v_u32mf2_m(...) __riscv_vluxei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxei16_v_u32m1_m(...) __riscv_vluxei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxei16_v_u32m2_m(...) __riscv_vluxei16_v_u32m2_tumu(__VA_ARGS__) +#define vluxei16_v_u32m4_m(...) __riscv_vluxei16_v_u32m4_tumu(__VA_ARGS__) +#define vluxei16_v_u32m8_m(...) __riscv_vluxei16_v_u32m8_tumu(__VA_ARGS__) +#define vluxei32_v_u32mf2_m(...) __riscv_vluxei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxei32_v_u32m1_m(...) __riscv_vluxei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxei32_v_u32m2_m(...) __riscv_vluxei32_v_u32m2_tumu(__VA_ARGS__) +#define vluxei32_v_u32m4_m(...) __riscv_vluxei32_v_u32m4_tumu(__VA_ARGS__) +#define vluxei32_v_u32m8_m(...) __riscv_vluxei32_v_u32m8_tumu(__VA_ARGS__) +#define vluxei64_v_u32mf2_m(...) __riscv_vluxei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxei64_v_u32m1_m(...) __riscv_vluxei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxei64_v_u32m2_m(...) __riscv_vluxei64_v_u32m2_tumu(__VA_ARGS__) +#define vluxei64_v_u32m4_m(...) __riscv_vluxei64_v_u32m4_tumu(__VA_ARGS__) +#define vluxei8_v_u64m1_m(...) __riscv_vluxei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxei8_v_u64m2_m(...) __riscv_vluxei8_v_u64m2_tumu(__VA_ARGS__) +#define vluxei8_v_u64m4_m(...) __riscv_vluxei8_v_u64m4_tumu(__VA_ARGS__) +#define vluxei8_v_u64m8_m(...) __riscv_vluxei8_v_u64m8_tumu(__VA_ARGS__) +#define vluxei16_v_u64m1_m(...) __riscv_vluxei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxei16_v_u64m2_m(...) __riscv_vluxei16_v_u64m2_tumu(__VA_ARGS__) +#define vluxei16_v_u64m4_m(...) __riscv_vluxei16_v_u64m4_tumu(__VA_ARGS__) +#define vluxei16_v_u64m8_m(...) __riscv_vluxei16_v_u64m8_tumu(__VA_ARGS__) +#define vluxei32_v_u64m1_m(...) __riscv_vluxei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxei32_v_u64m2_m(...) __riscv_vluxei32_v_u64m2_tumu(__VA_ARGS__) +#define vluxei32_v_u64m4_m(...) __riscv_vluxei32_v_u64m4_tumu(__VA_ARGS__) +#define vluxei32_v_u64m8_m(...) __riscv_vluxei32_v_u64m8_tumu(__VA_ARGS__) +#define vluxei64_v_u64m1_m(...) __riscv_vluxei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxei64_v_u64m2_m(...) __riscv_vluxei64_v_u64m2_tumu(__VA_ARGS__) +#define vluxei64_v_u64m4_m(...) __riscv_vluxei64_v_u64m4_tumu(__VA_ARGS__) +#define vluxei64_v_u64m8_m(...) __riscv_vluxei64_v_u64m8_tumu(__VA_ARGS__) +#define vsoxei8_v_f16mf4(...) __riscv_vsoxei8_v_f16mf4(__VA_ARGS__) +#define vsoxei8_v_f16mf2(...) __riscv_vsoxei8_v_f16mf2(__VA_ARGS__) +#define vsoxei8_v_f16m1(...) __riscv_vsoxei8_v_f16m1(__VA_ARGS__) +#define vsoxei8_v_f16m2(...) __riscv_vsoxei8_v_f16m2(__VA_ARGS__) +#define vsoxei8_v_f16m4(...) __riscv_vsoxei8_v_f16m4(__VA_ARGS__) +#define vsoxei8_v_f16m8(...) __riscv_vsoxei8_v_f16m8(__VA_ARGS__) +#define vsoxei16_v_f16mf4(...) __riscv_vsoxei16_v_f16mf4(__VA_ARGS__) +#define vsoxei16_v_f16mf2(...) __riscv_vsoxei16_v_f16mf2(__VA_ARGS__) +#define vsoxei16_v_f16m1(...) __riscv_vsoxei16_v_f16m1(__VA_ARGS__) +#define vsoxei16_v_f16m2(...) __riscv_vsoxei16_v_f16m2(__VA_ARGS__) +#define vsoxei16_v_f16m4(...) __riscv_vsoxei16_v_f16m4(__VA_ARGS__) +#define vsoxei16_v_f16m8(...) __riscv_vsoxei16_v_f16m8(__VA_ARGS__) +#define vsoxei32_v_f16mf4(...) __riscv_vsoxei32_v_f16mf4(__VA_ARGS__) +#define vsoxei32_v_f16mf2(...) __riscv_vsoxei32_v_f16mf2(__VA_ARGS__) +#define vsoxei32_v_f16m1(...) __riscv_vsoxei32_v_f16m1(__VA_ARGS__) +#define vsoxei32_v_f16m2(...) __riscv_vsoxei32_v_f16m2(__VA_ARGS__) +#define vsoxei32_v_f16m4(...) __riscv_vsoxei32_v_f16m4(__VA_ARGS__) +#define vsoxei64_v_f16mf4(...) __riscv_vsoxei64_v_f16mf4(__VA_ARGS__) +#define vsoxei64_v_f16mf2(...) __riscv_vsoxei64_v_f16mf2(__VA_ARGS__) +#define vsoxei64_v_f16m1(...) __riscv_vsoxei64_v_f16m1(__VA_ARGS__) +#define vsoxei64_v_f16m2(...) __riscv_vsoxei64_v_f16m2(__VA_ARGS__) +#define vsoxei8_v_f32mf2(...) __riscv_vsoxei8_v_f32mf2(__VA_ARGS__) +#define vsoxei8_v_f32m1(...) __riscv_vsoxei8_v_f32m1(__VA_ARGS__) +#define vsoxei8_v_f32m2(...) __riscv_vsoxei8_v_f32m2(__VA_ARGS__) +#define vsoxei8_v_f32m4(...) __riscv_vsoxei8_v_f32m4(__VA_ARGS__) +#define vsoxei8_v_f32m8(...) __riscv_vsoxei8_v_f32m8(__VA_ARGS__) +#define vsoxei16_v_f32mf2(...) __riscv_vsoxei16_v_f32mf2(__VA_ARGS__) +#define vsoxei16_v_f32m1(...) __riscv_vsoxei16_v_f32m1(__VA_ARGS__) +#define vsoxei16_v_f32m2(...) __riscv_vsoxei16_v_f32m2(__VA_ARGS__) +#define vsoxei16_v_f32m4(...) __riscv_vsoxei16_v_f32m4(__VA_ARGS__) +#define vsoxei16_v_f32m8(...) __riscv_vsoxei16_v_f32m8(__VA_ARGS__) +#define vsoxei32_v_f32mf2(...) __riscv_vsoxei32_v_f32mf2(__VA_ARGS__) +#define vsoxei32_v_f32m1(...) __riscv_vsoxei32_v_f32m1(__VA_ARGS__) +#define vsoxei32_v_f32m2(...) __riscv_vsoxei32_v_f32m2(__VA_ARGS__) +#define vsoxei32_v_f32m4(...) __riscv_vsoxei32_v_f32m4(__VA_ARGS__) +#define vsoxei32_v_f32m8(...) __riscv_vsoxei32_v_f32m8(__VA_ARGS__) +#define vsoxei64_v_f32mf2(...) __riscv_vsoxei64_v_f32mf2(__VA_ARGS__) +#define vsoxei64_v_f32m1(...) __riscv_vsoxei64_v_f32m1(__VA_ARGS__) +#define vsoxei64_v_f32m2(...) __riscv_vsoxei64_v_f32m2(__VA_ARGS__) +#define vsoxei64_v_f32m4(...) __riscv_vsoxei64_v_f32m4(__VA_ARGS__) +#define vsoxei8_v_f64m1(...) __riscv_vsoxei8_v_f64m1(__VA_ARGS__) +#define vsoxei8_v_f64m2(...) __riscv_vsoxei8_v_f64m2(__VA_ARGS__) +#define vsoxei8_v_f64m4(...) __riscv_vsoxei8_v_f64m4(__VA_ARGS__) +#define vsoxei8_v_f64m8(...) __riscv_vsoxei8_v_f64m8(__VA_ARGS__) +#define vsoxei16_v_f64m1(...) __riscv_vsoxei16_v_f64m1(__VA_ARGS__) +#define vsoxei16_v_f64m2(...) __riscv_vsoxei16_v_f64m2(__VA_ARGS__) +#define vsoxei16_v_f64m4(...) __riscv_vsoxei16_v_f64m4(__VA_ARGS__) +#define vsoxei16_v_f64m8(...) __riscv_vsoxei16_v_f64m8(__VA_ARGS__) +#define vsoxei32_v_f64m1(...) __riscv_vsoxei32_v_f64m1(__VA_ARGS__) +#define vsoxei32_v_f64m2(...) __riscv_vsoxei32_v_f64m2(__VA_ARGS__) +#define vsoxei32_v_f64m4(...) __riscv_vsoxei32_v_f64m4(__VA_ARGS__) +#define vsoxei32_v_f64m8(...) __riscv_vsoxei32_v_f64m8(__VA_ARGS__) +#define vsoxei64_v_f64m1(...) __riscv_vsoxei64_v_f64m1(__VA_ARGS__) +#define vsoxei64_v_f64m2(...) __riscv_vsoxei64_v_f64m2(__VA_ARGS__) +#define vsoxei64_v_f64m4(...) __riscv_vsoxei64_v_f64m4(__VA_ARGS__) +#define vsoxei64_v_f64m8(...) __riscv_vsoxei64_v_f64m8(__VA_ARGS__) +#define vsuxei8_v_f16mf4(...) __riscv_vsuxei8_v_f16mf4(__VA_ARGS__) +#define vsuxei8_v_f16mf2(...) __riscv_vsuxei8_v_f16mf2(__VA_ARGS__) +#define vsuxei8_v_f16m1(...) __riscv_vsuxei8_v_f16m1(__VA_ARGS__) +#define vsuxei8_v_f16m2(...) __riscv_vsuxei8_v_f16m2(__VA_ARGS__) +#define vsuxei8_v_f16m4(...) __riscv_vsuxei8_v_f16m4(__VA_ARGS__) +#define vsuxei8_v_f16m8(...) __riscv_vsuxei8_v_f16m8(__VA_ARGS__) +#define vsuxei16_v_f16mf4(...) __riscv_vsuxei16_v_f16mf4(__VA_ARGS__) +#define vsuxei16_v_f16mf2(...) __riscv_vsuxei16_v_f16mf2(__VA_ARGS__) +#define vsuxei16_v_f16m1(...) __riscv_vsuxei16_v_f16m1(__VA_ARGS__) +#define vsuxei16_v_f16m2(...) __riscv_vsuxei16_v_f16m2(__VA_ARGS__) +#define vsuxei16_v_f16m4(...) __riscv_vsuxei16_v_f16m4(__VA_ARGS__) +#define vsuxei16_v_f16m8(...) __riscv_vsuxei16_v_f16m8(__VA_ARGS__) +#define vsuxei32_v_f16mf4(...) __riscv_vsuxei32_v_f16mf4(__VA_ARGS__) +#define vsuxei32_v_f16mf2(...) __riscv_vsuxei32_v_f16mf2(__VA_ARGS__) +#define vsuxei32_v_f16m1(...) __riscv_vsuxei32_v_f16m1(__VA_ARGS__) +#define vsuxei32_v_f16m2(...) __riscv_vsuxei32_v_f16m2(__VA_ARGS__) +#define vsuxei32_v_f16m4(...) __riscv_vsuxei32_v_f16m4(__VA_ARGS__) +#define vsuxei64_v_f16mf4(...) __riscv_vsuxei64_v_f16mf4(__VA_ARGS__) +#define vsuxei64_v_f16mf2(...) __riscv_vsuxei64_v_f16mf2(__VA_ARGS__) +#define vsuxei64_v_f16m1(...) __riscv_vsuxei64_v_f16m1(__VA_ARGS__) +#define vsuxei64_v_f16m2(...) __riscv_vsuxei64_v_f16m2(__VA_ARGS__) +#define vsuxei8_v_f32mf2(...) __riscv_vsuxei8_v_f32mf2(__VA_ARGS__) +#define vsuxei8_v_f32m1(...) __riscv_vsuxei8_v_f32m1(__VA_ARGS__) +#define vsuxei8_v_f32m2(...) __riscv_vsuxei8_v_f32m2(__VA_ARGS__) +#define vsuxei8_v_f32m4(...) __riscv_vsuxei8_v_f32m4(__VA_ARGS__) +#define vsuxei8_v_f32m8(...) __riscv_vsuxei8_v_f32m8(__VA_ARGS__) +#define vsuxei16_v_f32mf2(...) __riscv_vsuxei16_v_f32mf2(__VA_ARGS__) +#define vsuxei16_v_f32m1(...) __riscv_vsuxei16_v_f32m1(__VA_ARGS__) +#define vsuxei16_v_f32m2(...) __riscv_vsuxei16_v_f32m2(__VA_ARGS__) +#define vsuxei16_v_f32m4(...) __riscv_vsuxei16_v_f32m4(__VA_ARGS__) +#define vsuxei16_v_f32m8(...) __riscv_vsuxei16_v_f32m8(__VA_ARGS__) +#define vsuxei32_v_f32mf2(...) __riscv_vsuxei32_v_f32mf2(__VA_ARGS__) +#define vsuxei32_v_f32m1(...) __riscv_vsuxei32_v_f32m1(__VA_ARGS__) +#define vsuxei32_v_f32m2(...) __riscv_vsuxei32_v_f32m2(__VA_ARGS__) +#define vsuxei32_v_f32m4(...) __riscv_vsuxei32_v_f32m4(__VA_ARGS__) +#define vsuxei32_v_f32m8(...) __riscv_vsuxei32_v_f32m8(__VA_ARGS__) +#define vsuxei64_v_f32mf2(...) __riscv_vsuxei64_v_f32mf2(__VA_ARGS__) +#define vsuxei64_v_f32m1(...) __riscv_vsuxei64_v_f32m1(__VA_ARGS__) +#define vsuxei64_v_f32m2(...) __riscv_vsuxei64_v_f32m2(__VA_ARGS__) +#define vsuxei64_v_f32m4(...) __riscv_vsuxei64_v_f32m4(__VA_ARGS__) +#define vsuxei8_v_f64m1(...) __riscv_vsuxei8_v_f64m1(__VA_ARGS__) +#define vsuxei8_v_f64m2(...) __riscv_vsuxei8_v_f64m2(__VA_ARGS__) +#define vsuxei8_v_f64m4(...) __riscv_vsuxei8_v_f64m4(__VA_ARGS__) +#define vsuxei8_v_f64m8(...) __riscv_vsuxei8_v_f64m8(__VA_ARGS__) +#define vsuxei16_v_f64m1(...) __riscv_vsuxei16_v_f64m1(__VA_ARGS__) +#define vsuxei16_v_f64m2(...) __riscv_vsuxei16_v_f64m2(__VA_ARGS__) +#define vsuxei16_v_f64m4(...) __riscv_vsuxei16_v_f64m4(__VA_ARGS__) +#define vsuxei16_v_f64m8(...) __riscv_vsuxei16_v_f64m8(__VA_ARGS__) +#define vsuxei32_v_f64m1(...) __riscv_vsuxei32_v_f64m1(__VA_ARGS__) +#define vsuxei32_v_f64m2(...) __riscv_vsuxei32_v_f64m2(__VA_ARGS__) +#define vsuxei32_v_f64m4(...) __riscv_vsuxei32_v_f64m4(__VA_ARGS__) +#define vsuxei32_v_f64m8(...) __riscv_vsuxei32_v_f64m8(__VA_ARGS__) +#define vsuxei64_v_f64m1(...) __riscv_vsuxei64_v_f64m1(__VA_ARGS__) +#define vsuxei64_v_f64m2(...) __riscv_vsuxei64_v_f64m2(__VA_ARGS__) +#define vsuxei64_v_f64m4(...) __riscv_vsuxei64_v_f64m4(__VA_ARGS__) +#define vsuxei64_v_f64m8(...) __riscv_vsuxei64_v_f64m8(__VA_ARGS__) +#define vsoxei8_v_i8mf8(...) __riscv_vsoxei8_v_i8mf8(__VA_ARGS__) +#define vsoxei8_v_i8mf4(...) __riscv_vsoxei8_v_i8mf4(__VA_ARGS__) +#define vsoxei8_v_i8mf2(...) __riscv_vsoxei8_v_i8mf2(__VA_ARGS__) +#define vsoxei8_v_i8m1(...) __riscv_vsoxei8_v_i8m1(__VA_ARGS__) +#define vsoxei8_v_i8m2(...) __riscv_vsoxei8_v_i8m2(__VA_ARGS__) +#define vsoxei8_v_i8m4(...) __riscv_vsoxei8_v_i8m4(__VA_ARGS__) +#define vsoxei8_v_i8m8(...) __riscv_vsoxei8_v_i8m8(__VA_ARGS__) +#define vsoxei16_v_i8mf8(...) __riscv_vsoxei16_v_i8mf8(__VA_ARGS__) +#define vsoxei16_v_i8mf4(...) __riscv_vsoxei16_v_i8mf4(__VA_ARGS__) +#define vsoxei16_v_i8mf2(...) __riscv_vsoxei16_v_i8mf2(__VA_ARGS__) +#define vsoxei16_v_i8m1(...) __riscv_vsoxei16_v_i8m1(__VA_ARGS__) +#define vsoxei16_v_i8m2(...) __riscv_vsoxei16_v_i8m2(__VA_ARGS__) +#define vsoxei16_v_i8m4(...) __riscv_vsoxei16_v_i8m4(__VA_ARGS__) +#define vsoxei32_v_i8mf8(...) __riscv_vsoxei32_v_i8mf8(__VA_ARGS__) +#define vsoxei32_v_i8mf4(...) __riscv_vsoxei32_v_i8mf4(__VA_ARGS__) +#define vsoxei32_v_i8mf2(...) __riscv_vsoxei32_v_i8mf2(__VA_ARGS__) +#define vsoxei32_v_i8m1(...) __riscv_vsoxei32_v_i8m1(__VA_ARGS__) +#define vsoxei32_v_i8m2(...) __riscv_vsoxei32_v_i8m2(__VA_ARGS__) +#define vsoxei64_v_i8mf8(...) __riscv_vsoxei64_v_i8mf8(__VA_ARGS__) +#define vsoxei64_v_i8mf4(...) __riscv_vsoxei64_v_i8mf4(__VA_ARGS__) +#define vsoxei64_v_i8mf2(...) __riscv_vsoxei64_v_i8mf2(__VA_ARGS__) +#define vsoxei64_v_i8m1(...) __riscv_vsoxei64_v_i8m1(__VA_ARGS__) +#define vsoxei8_v_i16mf4(...) __riscv_vsoxei8_v_i16mf4(__VA_ARGS__) +#define vsoxei8_v_i16mf2(...) __riscv_vsoxei8_v_i16mf2(__VA_ARGS__) +#define vsoxei8_v_i16m1(...) __riscv_vsoxei8_v_i16m1(__VA_ARGS__) +#define vsoxei8_v_i16m2(...) __riscv_vsoxei8_v_i16m2(__VA_ARGS__) +#define vsoxei8_v_i16m4(...) __riscv_vsoxei8_v_i16m4(__VA_ARGS__) +#define vsoxei8_v_i16m8(...) __riscv_vsoxei8_v_i16m8(__VA_ARGS__) +#define vsoxei16_v_i16mf4(...) __riscv_vsoxei16_v_i16mf4(__VA_ARGS__) +#define vsoxei16_v_i16mf2(...) __riscv_vsoxei16_v_i16mf2(__VA_ARGS__) +#define vsoxei16_v_i16m1(...) __riscv_vsoxei16_v_i16m1(__VA_ARGS__) +#define vsoxei16_v_i16m2(...) __riscv_vsoxei16_v_i16m2(__VA_ARGS__) +#define vsoxei16_v_i16m4(...) __riscv_vsoxei16_v_i16m4(__VA_ARGS__) +#define vsoxei16_v_i16m8(...) __riscv_vsoxei16_v_i16m8(__VA_ARGS__) +#define vsoxei32_v_i16mf4(...) __riscv_vsoxei32_v_i16mf4(__VA_ARGS__) +#define vsoxei32_v_i16mf2(...) __riscv_vsoxei32_v_i16mf2(__VA_ARGS__) +#define vsoxei32_v_i16m1(...) __riscv_vsoxei32_v_i16m1(__VA_ARGS__) +#define vsoxei32_v_i16m2(...) __riscv_vsoxei32_v_i16m2(__VA_ARGS__) +#define vsoxei32_v_i16m4(...) __riscv_vsoxei32_v_i16m4(__VA_ARGS__) +#define vsoxei64_v_i16mf4(...) __riscv_vsoxei64_v_i16mf4(__VA_ARGS__) +#define vsoxei64_v_i16mf2(...) __riscv_vsoxei64_v_i16mf2(__VA_ARGS__) +#define vsoxei64_v_i16m1(...) __riscv_vsoxei64_v_i16m1(__VA_ARGS__) +#define vsoxei64_v_i16m2(...) __riscv_vsoxei64_v_i16m2(__VA_ARGS__) +#define vsoxei8_v_i32mf2(...) __riscv_vsoxei8_v_i32mf2(__VA_ARGS__) +#define vsoxei8_v_i32m1(...) __riscv_vsoxei8_v_i32m1(__VA_ARGS__) +#define vsoxei8_v_i32m2(...) __riscv_vsoxei8_v_i32m2(__VA_ARGS__) +#define vsoxei8_v_i32m4(...) __riscv_vsoxei8_v_i32m4(__VA_ARGS__) +#define vsoxei8_v_i32m8(...) __riscv_vsoxei8_v_i32m8(__VA_ARGS__) +#define vsoxei16_v_i32mf2(...) __riscv_vsoxei16_v_i32mf2(__VA_ARGS__) +#define vsoxei16_v_i32m1(...) __riscv_vsoxei16_v_i32m1(__VA_ARGS__) +#define vsoxei16_v_i32m2(...) __riscv_vsoxei16_v_i32m2(__VA_ARGS__) +#define vsoxei16_v_i32m4(...) __riscv_vsoxei16_v_i32m4(__VA_ARGS__) +#define vsoxei16_v_i32m8(...) __riscv_vsoxei16_v_i32m8(__VA_ARGS__) +#define vsoxei32_v_i32mf2(...) __riscv_vsoxei32_v_i32mf2(__VA_ARGS__) +#define vsoxei32_v_i32m1(...) __riscv_vsoxei32_v_i32m1(__VA_ARGS__) +#define vsoxei32_v_i32m2(...) __riscv_vsoxei32_v_i32m2(__VA_ARGS__) +#define vsoxei32_v_i32m4(...) __riscv_vsoxei32_v_i32m4(__VA_ARGS__) +#define vsoxei32_v_i32m8(...) __riscv_vsoxei32_v_i32m8(__VA_ARGS__) +#define vsoxei64_v_i32mf2(...) __riscv_vsoxei64_v_i32mf2(__VA_ARGS__) +#define vsoxei64_v_i32m1(...) __riscv_vsoxei64_v_i32m1(__VA_ARGS__) +#define vsoxei64_v_i32m2(...) __riscv_vsoxei64_v_i32m2(__VA_ARGS__) +#define vsoxei64_v_i32m4(...) __riscv_vsoxei64_v_i32m4(__VA_ARGS__) +#define vsoxei8_v_i64m1(...) __riscv_vsoxei8_v_i64m1(__VA_ARGS__) +#define vsoxei8_v_i64m2(...) __riscv_vsoxei8_v_i64m2(__VA_ARGS__) +#define vsoxei8_v_i64m4(...) __riscv_vsoxei8_v_i64m4(__VA_ARGS__) +#define vsoxei8_v_i64m8(...) __riscv_vsoxei8_v_i64m8(__VA_ARGS__) +#define vsoxei16_v_i64m1(...) __riscv_vsoxei16_v_i64m1(__VA_ARGS__) +#define vsoxei16_v_i64m2(...) __riscv_vsoxei16_v_i64m2(__VA_ARGS__) +#define vsoxei16_v_i64m4(...) __riscv_vsoxei16_v_i64m4(__VA_ARGS__) +#define vsoxei16_v_i64m8(...) __riscv_vsoxei16_v_i64m8(__VA_ARGS__) +#define vsoxei32_v_i64m1(...) __riscv_vsoxei32_v_i64m1(__VA_ARGS__) +#define vsoxei32_v_i64m2(...) __riscv_vsoxei32_v_i64m2(__VA_ARGS__) +#define vsoxei32_v_i64m4(...) __riscv_vsoxei32_v_i64m4(__VA_ARGS__) +#define vsoxei32_v_i64m8(...) __riscv_vsoxei32_v_i64m8(__VA_ARGS__) +#define vsoxei64_v_i64m1(...) __riscv_vsoxei64_v_i64m1(__VA_ARGS__) +#define vsoxei64_v_i64m2(...) __riscv_vsoxei64_v_i64m2(__VA_ARGS__) +#define vsoxei64_v_i64m4(...) __riscv_vsoxei64_v_i64m4(__VA_ARGS__) +#define vsoxei64_v_i64m8(...) __riscv_vsoxei64_v_i64m8(__VA_ARGS__) +#define vsuxei8_v_i8mf8(...) __riscv_vsuxei8_v_i8mf8(__VA_ARGS__) +#define vsuxei8_v_i8mf4(...) __riscv_vsuxei8_v_i8mf4(__VA_ARGS__) +#define vsuxei8_v_i8mf2(...) __riscv_vsuxei8_v_i8mf2(__VA_ARGS__) +#define vsuxei8_v_i8m1(...) __riscv_vsuxei8_v_i8m1(__VA_ARGS__) +#define vsuxei8_v_i8m2(...) __riscv_vsuxei8_v_i8m2(__VA_ARGS__) +#define vsuxei8_v_i8m4(...) __riscv_vsuxei8_v_i8m4(__VA_ARGS__) +#define vsuxei8_v_i8m8(...) __riscv_vsuxei8_v_i8m8(__VA_ARGS__) +#define vsuxei16_v_i8mf8(...) __riscv_vsuxei16_v_i8mf8(__VA_ARGS__) +#define vsuxei16_v_i8mf4(...) __riscv_vsuxei16_v_i8mf4(__VA_ARGS__) +#define vsuxei16_v_i8mf2(...) __riscv_vsuxei16_v_i8mf2(__VA_ARGS__) +#define vsuxei16_v_i8m1(...) __riscv_vsuxei16_v_i8m1(__VA_ARGS__) +#define vsuxei16_v_i8m2(...) __riscv_vsuxei16_v_i8m2(__VA_ARGS__) +#define vsuxei16_v_i8m4(...) __riscv_vsuxei16_v_i8m4(__VA_ARGS__) +#define vsuxei32_v_i8mf8(...) __riscv_vsuxei32_v_i8mf8(__VA_ARGS__) +#define vsuxei32_v_i8mf4(...) __riscv_vsuxei32_v_i8mf4(__VA_ARGS__) +#define vsuxei32_v_i8mf2(...) __riscv_vsuxei32_v_i8mf2(__VA_ARGS__) +#define vsuxei32_v_i8m1(...) __riscv_vsuxei32_v_i8m1(__VA_ARGS__) +#define vsuxei32_v_i8m2(...) __riscv_vsuxei32_v_i8m2(__VA_ARGS__) +#define vsuxei64_v_i8mf8(...) __riscv_vsuxei64_v_i8mf8(__VA_ARGS__) +#define vsuxei64_v_i8mf4(...) __riscv_vsuxei64_v_i8mf4(__VA_ARGS__) +#define vsuxei64_v_i8mf2(...) __riscv_vsuxei64_v_i8mf2(__VA_ARGS__) +#define vsuxei64_v_i8m1(...) __riscv_vsuxei64_v_i8m1(__VA_ARGS__) +#define vsuxei8_v_i16mf4(...) __riscv_vsuxei8_v_i16mf4(__VA_ARGS__) +#define vsuxei8_v_i16mf2(...) __riscv_vsuxei8_v_i16mf2(__VA_ARGS__) +#define vsuxei8_v_i16m1(...) __riscv_vsuxei8_v_i16m1(__VA_ARGS__) +#define vsuxei8_v_i16m2(...) __riscv_vsuxei8_v_i16m2(__VA_ARGS__) +#define vsuxei8_v_i16m4(...) __riscv_vsuxei8_v_i16m4(__VA_ARGS__) +#define vsuxei8_v_i16m8(...) __riscv_vsuxei8_v_i16m8(__VA_ARGS__) +#define vsuxei16_v_i16mf4(...) __riscv_vsuxei16_v_i16mf4(__VA_ARGS__) +#define vsuxei16_v_i16mf2(...) __riscv_vsuxei16_v_i16mf2(__VA_ARGS__) +#define vsuxei16_v_i16m1(...) __riscv_vsuxei16_v_i16m1(__VA_ARGS__) +#define vsuxei16_v_i16m2(...) __riscv_vsuxei16_v_i16m2(__VA_ARGS__) +#define vsuxei16_v_i16m4(...) __riscv_vsuxei16_v_i16m4(__VA_ARGS__) +#define vsuxei16_v_i16m8(...) __riscv_vsuxei16_v_i16m8(__VA_ARGS__) +#define vsuxei32_v_i16mf4(...) __riscv_vsuxei32_v_i16mf4(__VA_ARGS__) +#define vsuxei32_v_i16mf2(...) __riscv_vsuxei32_v_i16mf2(__VA_ARGS__) +#define vsuxei32_v_i16m1(...) __riscv_vsuxei32_v_i16m1(__VA_ARGS__) +#define vsuxei32_v_i16m2(...) __riscv_vsuxei32_v_i16m2(__VA_ARGS__) +#define vsuxei32_v_i16m4(...) __riscv_vsuxei32_v_i16m4(__VA_ARGS__) +#define vsuxei64_v_i16mf4(...) __riscv_vsuxei64_v_i16mf4(__VA_ARGS__) +#define vsuxei64_v_i16mf2(...) __riscv_vsuxei64_v_i16mf2(__VA_ARGS__) +#define vsuxei64_v_i16m1(...) __riscv_vsuxei64_v_i16m1(__VA_ARGS__) +#define vsuxei64_v_i16m2(...) __riscv_vsuxei64_v_i16m2(__VA_ARGS__) +#define vsuxei8_v_i32mf2(...) __riscv_vsuxei8_v_i32mf2(__VA_ARGS__) +#define vsuxei8_v_i32m1(...) __riscv_vsuxei8_v_i32m1(__VA_ARGS__) +#define vsuxei8_v_i32m2(...) __riscv_vsuxei8_v_i32m2(__VA_ARGS__) +#define vsuxei8_v_i32m4(...) __riscv_vsuxei8_v_i32m4(__VA_ARGS__) +#define vsuxei8_v_i32m8(...) __riscv_vsuxei8_v_i32m8(__VA_ARGS__) +#define vsuxei16_v_i32mf2(...) __riscv_vsuxei16_v_i32mf2(__VA_ARGS__) +#define vsuxei16_v_i32m1(...) __riscv_vsuxei16_v_i32m1(__VA_ARGS__) +#define vsuxei16_v_i32m2(...) __riscv_vsuxei16_v_i32m2(__VA_ARGS__) +#define vsuxei16_v_i32m4(...) __riscv_vsuxei16_v_i32m4(__VA_ARGS__) +#define vsuxei16_v_i32m8(...) __riscv_vsuxei16_v_i32m8(__VA_ARGS__) +#define vsuxei32_v_i32mf2(...) __riscv_vsuxei32_v_i32mf2(__VA_ARGS__) +#define vsuxei32_v_i32m1(...) __riscv_vsuxei32_v_i32m1(__VA_ARGS__) +#define vsuxei32_v_i32m2(...) __riscv_vsuxei32_v_i32m2(__VA_ARGS__) +#define vsuxei32_v_i32m4(...) __riscv_vsuxei32_v_i32m4(__VA_ARGS__) +#define vsuxei32_v_i32m8(...) __riscv_vsuxei32_v_i32m8(__VA_ARGS__) +#define vsuxei64_v_i32mf2(...) __riscv_vsuxei64_v_i32mf2(__VA_ARGS__) +#define vsuxei64_v_i32m1(...) __riscv_vsuxei64_v_i32m1(__VA_ARGS__) +#define vsuxei64_v_i32m2(...) __riscv_vsuxei64_v_i32m2(__VA_ARGS__) +#define vsuxei64_v_i32m4(...) __riscv_vsuxei64_v_i32m4(__VA_ARGS__) +#define vsuxei8_v_i64m1(...) __riscv_vsuxei8_v_i64m1(__VA_ARGS__) +#define vsuxei8_v_i64m2(...) __riscv_vsuxei8_v_i64m2(__VA_ARGS__) +#define vsuxei8_v_i64m4(...) __riscv_vsuxei8_v_i64m4(__VA_ARGS__) +#define vsuxei8_v_i64m8(...) __riscv_vsuxei8_v_i64m8(__VA_ARGS__) +#define vsuxei16_v_i64m1(...) __riscv_vsuxei16_v_i64m1(__VA_ARGS__) +#define vsuxei16_v_i64m2(...) __riscv_vsuxei16_v_i64m2(__VA_ARGS__) +#define vsuxei16_v_i64m4(...) __riscv_vsuxei16_v_i64m4(__VA_ARGS__) +#define vsuxei16_v_i64m8(...) __riscv_vsuxei16_v_i64m8(__VA_ARGS__) +#define vsuxei32_v_i64m1(...) __riscv_vsuxei32_v_i64m1(__VA_ARGS__) +#define vsuxei32_v_i64m2(...) __riscv_vsuxei32_v_i64m2(__VA_ARGS__) +#define vsuxei32_v_i64m4(...) __riscv_vsuxei32_v_i64m4(__VA_ARGS__) +#define vsuxei32_v_i64m8(...) __riscv_vsuxei32_v_i64m8(__VA_ARGS__) +#define vsuxei64_v_i64m1(...) __riscv_vsuxei64_v_i64m1(__VA_ARGS__) +#define vsuxei64_v_i64m2(...) __riscv_vsuxei64_v_i64m2(__VA_ARGS__) +#define vsuxei64_v_i64m4(...) __riscv_vsuxei64_v_i64m4(__VA_ARGS__) +#define vsuxei64_v_i64m8(...) __riscv_vsuxei64_v_i64m8(__VA_ARGS__) +#define vsoxei8_v_u8mf8(...) __riscv_vsoxei8_v_u8mf8(__VA_ARGS__) +#define vsoxei8_v_u8mf4(...) __riscv_vsoxei8_v_u8mf4(__VA_ARGS__) +#define vsoxei8_v_u8mf2(...) __riscv_vsoxei8_v_u8mf2(__VA_ARGS__) +#define vsoxei8_v_u8m1(...) __riscv_vsoxei8_v_u8m1(__VA_ARGS__) +#define vsoxei8_v_u8m2(...) __riscv_vsoxei8_v_u8m2(__VA_ARGS__) +#define vsoxei8_v_u8m4(...) __riscv_vsoxei8_v_u8m4(__VA_ARGS__) +#define vsoxei8_v_u8m8(...) __riscv_vsoxei8_v_u8m8(__VA_ARGS__) +#define vsoxei16_v_u8mf8(...) __riscv_vsoxei16_v_u8mf8(__VA_ARGS__) +#define vsoxei16_v_u8mf4(...) __riscv_vsoxei16_v_u8mf4(__VA_ARGS__) +#define vsoxei16_v_u8mf2(...) __riscv_vsoxei16_v_u8mf2(__VA_ARGS__) +#define vsoxei16_v_u8m1(...) __riscv_vsoxei16_v_u8m1(__VA_ARGS__) +#define vsoxei16_v_u8m2(...) __riscv_vsoxei16_v_u8m2(__VA_ARGS__) +#define vsoxei16_v_u8m4(...) __riscv_vsoxei16_v_u8m4(__VA_ARGS__) +#define vsoxei32_v_u8mf8(...) __riscv_vsoxei32_v_u8mf8(__VA_ARGS__) +#define vsoxei32_v_u8mf4(...) __riscv_vsoxei32_v_u8mf4(__VA_ARGS__) +#define vsoxei32_v_u8mf2(...) __riscv_vsoxei32_v_u8mf2(__VA_ARGS__) +#define vsoxei32_v_u8m1(...) __riscv_vsoxei32_v_u8m1(__VA_ARGS__) +#define vsoxei32_v_u8m2(...) __riscv_vsoxei32_v_u8m2(__VA_ARGS__) +#define vsoxei64_v_u8mf8(...) __riscv_vsoxei64_v_u8mf8(__VA_ARGS__) +#define vsoxei64_v_u8mf4(...) __riscv_vsoxei64_v_u8mf4(__VA_ARGS__) +#define vsoxei64_v_u8mf2(...) __riscv_vsoxei64_v_u8mf2(__VA_ARGS__) +#define vsoxei64_v_u8m1(...) __riscv_vsoxei64_v_u8m1(__VA_ARGS__) +#define vsoxei8_v_u16mf4(...) __riscv_vsoxei8_v_u16mf4(__VA_ARGS__) +#define vsoxei8_v_u16mf2(...) __riscv_vsoxei8_v_u16mf2(__VA_ARGS__) +#define vsoxei8_v_u16m1(...) __riscv_vsoxei8_v_u16m1(__VA_ARGS__) +#define vsoxei8_v_u16m2(...) __riscv_vsoxei8_v_u16m2(__VA_ARGS__) +#define vsoxei8_v_u16m4(...) __riscv_vsoxei8_v_u16m4(__VA_ARGS__) +#define vsoxei8_v_u16m8(...) __riscv_vsoxei8_v_u16m8(__VA_ARGS__) +#define vsoxei16_v_u16mf4(...) __riscv_vsoxei16_v_u16mf4(__VA_ARGS__) +#define vsoxei16_v_u16mf2(...) __riscv_vsoxei16_v_u16mf2(__VA_ARGS__) +#define vsoxei16_v_u16m1(...) __riscv_vsoxei16_v_u16m1(__VA_ARGS__) +#define vsoxei16_v_u16m2(...) __riscv_vsoxei16_v_u16m2(__VA_ARGS__) +#define vsoxei16_v_u16m4(...) __riscv_vsoxei16_v_u16m4(__VA_ARGS__) +#define vsoxei16_v_u16m8(...) __riscv_vsoxei16_v_u16m8(__VA_ARGS__) +#define vsoxei32_v_u16mf4(...) __riscv_vsoxei32_v_u16mf4(__VA_ARGS__) +#define vsoxei32_v_u16mf2(...) __riscv_vsoxei32_v_u16mf2(__VA_ARGS__) +#define vsoxei32_v_u16m1(...) __riscv_vsoxei32_v_u16m1(__VA_ARGS__) +#define vsoxei32_v_u16m2(...) __riscv_vsoxei32_v_u16m2(__VA_ARGS__) +#define vsoxei32_v_u16m4(...) __riscv_vsoxei32_v_u16m4(__VA_ARGS__) +#define vsoxei64_v_u16mf4(...) __riscv_vsoxei64_v_u16mf4(__VA_ARGS__) +#define vsoxei64_v_u16mf2(...) __riscv_vsoxei64_v_u16mf2(__VA_ARGS__) +#define vsoxei64_v_u16m1(...) __riscv_vsoxei64_v_u16m1(__VA_ARGS__) +#define vsoxei64_v_u16m2(...) __riscv_vsoxei64_v_u16m2(__VA_ARGS__) +#define vsoxei8_v_u32mf2(...) __riscv_vsoxei8_v_u32mf2(__VA_ARGS__) +#define vsoxei8_v_u32m1(...) __riscv_vsoxei8_v_u32m1(__VA_ARGS__) +#define vsoxei8_v_u32m2(...) __riscv_vsoxei8_v_u32m2(__VA_ARGS__) +#define vsoxei8_v_u32m4(...) __riscv_vsoxei8_v_u32m4(__VA_ARGS__) +#define vsoxei8_v_u32m8(...) __riscv_vsoxei8_v_u32m8(__VA_ARGS__) +#define vsoxei16_v_u32mf2(...) __riscv_vsoxei16_v_u32mf2(__VA_ARGS__) +#define vsoxei16_v_u32m1(...) __riscv_vsoxei16_v_u32m1(__VA_ARGS__) +#define vsoxei16_v_u32m2(...) __riscv_vsoxei16_v_u32m2(__VA_ARGS__) +#define vsoxei16_v_u32m4(...) __riscv_vsoxei16_v_u32m4(__VA_ARGS__) +#define vsoxei16_v_u32m8(...) __riscv_vsoxei16_v_u32m8(__VA_ARGS__) +#define vsoxei32_v_u32mf2(...) __riscv_vsoxei32_v_u32mf2(__VA_ARGS__) +#define vsoxei32_v_u32m1(...) __riscv_vsoxei32_v_u32m1(__VA_ARGS__) +#define vsoxei32_v_u32m2(...) __riscv_vsoxei32_v_u32m2(__VA_ARGS__) +#define vsoxei32_v_u32m4(...) __riscv_vsoxei32_v_u32m4(__VA_ARGS__) +#define vsoxei32_v_u32m8(...) __riscv_vsoxei32_v_u32m8(__VA_ARGS__) +#define vsoxei64_v_u32mf2(...) __riscv_vsoxei64_v_u32mf2(__VA_ARGS__) +#define vsoxei64_v_u32m1(...) __riscv_vsoxei64_v_u32m1(__VA_ARGS__) +#define vsoxei64_v_u32m2(...) __riscv_vsoxei64_v_u32m2(__VA_ARGS__) +#define vsoxei64_v_u32m4(...) __riscv_vsoxei64_v_u32m4(__VA_ARGS__) +#define vsoxei8_v_u64m1(...) __riscv_vsoxei8_v_u64m1(__VA_ARGS__) +#define vsoxei8_v_u64m2(...) __riscv_vsoxei8_v_u64m2(__VA_ARGS__) +#define vsoxei8_v_u64m4(...) __riscv_vsoxei8_v_u64m4(__VA_ARGS__) +#define vsoxei8_v_u64m8(...) __riscv_vsoxei8_v_u64m8(__VA_ARGS__) +#define vsoxei16_v_u64m1(...) __riscv_vsoxei16_v_u64m1(__VA_ARGS__) +#define vsoxei16_v_u64m2(...) __riscv_vsoxei16_v_u64m2(__VA_ARGS__) +#define vsoxei16_v_u64m4(...) __riscv_vsoxei16_v_u64m4(__VA_ARGS__) +#define vsoxei16_v_u64m8(...) __riscv_vsoxei16_v_u64m8(__VA_ARGS__) +#define vsoxei32_v_u64m1(...) __riscv_vsoxei32_v_u64m1(__VA_ARGS__) +#define vsoxei32_v_u64m2(...) __riscv_vsoxei32_v_u64m2(__VA_ARGS__) +#define vsoxei32_v_u64m4(...) __riscv_vsoxei32_v_u64m4(__VA_ARGS__) +#define vsoxei32_v_u64m8(...) __riscv_vsoxei32_v_u64m8(__VA_ARGS__) +#define vsoxei64_v_u64m1(...) __riscv_vsoxei64_v_u64m1(__VA_ARGS__) +#define vsoxei64_v_u64m2(...) __riscv_vsoxei64_v_u64m2(__VA_ARGS__) +#define vsoxei64_v_u64m4(...) __riscv_vsoxei64_v_u64m4(__VA_ARGS__) +#define vsoxei64_v_u64m8(...) __riscv_vsoxei64_v_u64m8(__VA_ARGS__) +#define vsuxei8_v_u8mf8(...) __riscv_vsuxei8_v_u8mf8(__VA_ARGS__) +#define vsuxei8_v_u8mf4(...) __riscv_vsuxei8_v_u8mf4(__VA_ARGS__) +#define vsuxei8_v_u8mf2(...) __riscv_vsuxei8_v_u8mf2(__VA_ARGS__) +#define vsuxei8_v_u8m1(...) __riscv_vsuxei8_v_u8m1(__VA_ARGS__) +#define vsuxei8_v_u8m2(...) __riscv_vsuxei8_v_u8m2(__VA_ARGS__) +#define vsuxei8_v_u8m4(...) __riscv_vsuxei8_v_u8m4(__VA_ARGS__) +#define vsuxei8_v_u8m8(...) __riscv_vsuxei8_v_u8m8(__VA_ARGS__) +#define vsuxei16_v_u8mf8(...) __riscv_vsuxei16_v_u8mf8(__VA_ARGS__) +#define vsuxei16_v_u8mf4(...) __riscv_vsuxei16_v_u8mf4(__VA_ARGS__) +#define vsuxei16_v_u8mf2(...) __riscv_vsuxei16_v_u8mf2(__VA_ARGS__) +#define vsuxei16_v_u8m1(...) __riscv_vsuxei16_v_u8m1(__VA_ARGS__) +#define vsuxei16_v_u8m2(...) __riscv_vsuxei16_v_u8m2(__VA_ARGS__) +#define vsuxei16_v_u8m4(...) __riscv_vsuxei16_v_u8m4(__VA_ARGS__) +#define vsuxei32_v_u8mf8(...) __riscv_vsuxei32_v_u8mf8(__VA_ARGS__) +#define vsuxei32_v_u8mf4(...) __riscv_vsuxei32_v_u8mf4(__VA_ARGS__) +#define vsuxei32_v_u8mf2(...) __riscv_vsuxei32_v_u8mf2(__VA_ARGS__) +#define vsuxei32_v_u8m1(...) __riscv_vsuxei32_v_u8m1(__VA_ARGS__) +#define vsuxei32_v_u8m2(...) __riscv_vsuxei32_v_u8m2(__VA_ARGS__) +#define vsuxei64_v_u8mf8(...) __riscv_vsuxei64_v_u8mf8(__VA_ARGS__) +#define vsuxei64_v_u8mf4(...) __riscv_vsuxei64_v_u8mf4(__VA_ARGS__) +#define vsuxei64_v_u8mf2(...) __riscv_vsuxei64_v_u8mf2(__VA_ARGS__) +#define vsuxei64_v_u8m1(...) __riscv_vsuxei64_v_u8m1(__VA_ARGS__) +#define vsuxei8_v_u16mf4(...) __riscv_vsuxei8_v_u16mf4(__VA_ARGS__) +#define vsuxei8_v_u16mf2(...) __riscv_vsuxei8_v_u16mf2(__VA_ARGS__) +#define vsuxei8_v_u16m1(...) __riscv_vsuxei8_v_u16m1(__VA_ARGS__) +#define vsuxei8_v_u16m2(...) __riscv_vsuxei8_v_u16m2(__VA_ARGS__) +#define vsuxei8_v_u16m4(...) __riscv_vsuxei8_v_u16m4(__VA_ARGS__) +#define vsuxei8_v_u16m8(...) __riscv_vsuxei8_v_u16m8(__VA_ARGS__) +#define vsuxei16_v_u16mf4(...) __riscv_vsuxei16_v_u16mf4(__VA_ARGS__) +#define vsuxei16_v_u16mf2(...) __riscv_vsuxei16_v_u16mf2(__VA_ARGS__) +#define vsuxei16_v_u16m1(...) __riscv_vsuxei16_v_u16m1(__VA_ARGS__) +#define vsuxei16_v_u16m2(...) __riscv_vsuxei16_v_u16m2(__VA_ARGS__) +#define vsuxei16_v_u16m4(...) __riscv_vsuxei16_v_u16m4(__VA_ARGS__) +#define vsuxei16_v_u16m8(...) __riscv_vsuxei16_v_u16m8(__VA_ARGS__) +#define vsuxei32_v_u16mf4(...) __riscv_vsuxei32_v_u16mf4(__VA_ARGS__) +#define vsuxei32_v_u16mf2(...) __riscv_vsuxei32_v_u16mf2(__VA_ARGS__) +#define vsuxei32_v_u16m1(...) __riscv_vsuxei32_v_u16m1(__VA_ARGS__) +#define vsuxei32_v_u16m2(...) __riscv_vsuxei32_v_u16m2(__VA_ARGS__) +#define vsuxei32_v_u16m4(...) __riscv_vsuxei32_v_u16m4(__VA_ARGS__) +#define vsuxei64_v_u16mf4(...) __riscv_vsuxei64_v_u16mf4(__VA_ARGS__) +#define vsuxei64_v_u16mf2(...) __riscv_vsuxei64_v_u16mf2(__VA_ARGS__) +#define vsuxei64_v_u16m1(...) __riscv_vsuxei64_v_u16m1(__VA_ARGS__) +#define vsuxei64_v_u16m2(...) __riscv_vsuxei64_v_u16m2(__VA_ARGS__) +#define vsuxei8_v_u32mf2(...) __riscv_vsuxei8_v_u32mf2(__VA_ARGS__) +#define vsuxei8_v_u32m1(...) __riscv_vsuxei8_v_u32m1(__VA_ARGS__) +#define vsuxei8_v_u32m2(...) __riscv_vsuxei8_v_u32m2(__VA_ARGS__) +#define vsuxei8_v_u32m4(...) __riscv_vsuxei8_v_u32m4(__VA_ARGS__) +#define vsuxei8_v_u32m8(...) __riscv_vsuxei8_v_u32m8(__VA_ARGS__) +#define vsuxei16_v_u32mf2(...) __riscv_vsuxei16_v_u32mf2(__VA_ARGS__) +#define vsuxei16_v_u32m1(...) __riscv_vsuxei16_v_u32m1(__VA_ARGS__) +#define vsuxei16_v_u32m2(...) __riscv_vsuxei16_v_u32m2(__VA_ARGS__) +#define vsuxei16_v_u32m4(...) __riscv_vsuxei16_v_u32m4(__VA_ARGS__) +#define vsuxei16_v_u32m8(...) __riscv_vsuxei16_v_u32m8(__VA_ARGS__) +#define vsuxei32_v_u32mf2(...) __riscv_vsuxei32_v_u32mf2(__VA_ARGS__) +#define vsuxei32_v_u32m1(...) __riscv_vsuxei32_v_u32m1(__VA_ARGS__) +#define vsuxei32_v_u32m2(...) __riscv_vsuxei32_v_u32m2(__VA_ARGS__) +#define vsuxei32_v_u32m4(...) __riscv_vsuxei32_v_u32m4(__VA_ARGS__) +#define vsuxei32_v_u32m8(...) __riscv_vsuxei32_v_u32m8(__VA_ARGS__) +#define vsuxei64_v_u32mf2(...) __riscv_vsuxei64_v_u32mf2(__VA_ARGS__) +#define vsuxei64_v_u32m1(...) __riscv_vsuxei64_v_u32m1(__VA_ARGS__) +#define vsuxei64_v_u32m2(...) __riscv_vsuxei64_v_u32m2(__VA_ARGS__) +#define vsuxei64_v_u32m4(...) __riscv_vsuxei64_v_u32m4(__VA_ARGS__) +#define vsuxei8_v_u64m1(...) __riscv_vsuxei8_v_u64m1(__VA_ARGS__) +#define vsuxei8_v_u64m2(...) __riscv_vsuxei8_v_u64m2(__VA_ARGS__) +#define vsuxei8_v_u64m4(...) __riscv_vsuxei8_v_u64m4(__VA_ARGS__) +#define vsuxei8_v_u64m8(...) __riscv_vsuxei8_v_u64m8(__VA_ARGS__) +#define vsuxei16_v_u64m1(...) __riscv_vsuxei16_v_u64m1(__VA_ARGS__) +#define vsuxei16_v_u64m2(...) __riscv_vsuxei16_v_u64m2(__VA_ARGS__) +#define vsuxei16_v_u64m4(...) __riscv_vsuxei16_v_u64m4(__VA_ARGS__) +#define vsuxei16_v_u64m8(...) __riscv_vsuxei16_v_u64m8(__VA_ARGS__) +#define vsuxei32_v_u64m1(...) __riscv_vsuxei32_v_u64m1(__VA_ARGS__) +#define vsuxei32_v_u64m2(...) __riscv_vsuxei32_v_u64m2(__VA_ARGS__) +#define vsuxei32_v_u64m4(...) __riscv_vsuxei32_v_u64m4(__VA_ARGS__) +#define vsuxei32_v_u64m8(...) __riscv_vsuxei32_v_u64m8(__VA_ARGS__) +#define vsuxei64_v_u64m1(...) __riscv_vsuxei64_v_u64m1(__VA_ARGS__) +#define vsuxei64_v_u64m2(...) __riscv_vsuxei64_v_u64m2(__VA_ARGS__) +#define vsuxei64_v_u64m4(...) __riscv_vsuxei64_v_u64m4(__VA_ARGS__) +#define vsuxei64_v_u64m8(...) __riscv_vsuxei64_v_u64m8(__VA_ARGS__) +// masked functions +#define vsoxei8_v_f16mf4_m(...) __riscv_vsoxei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxei8_v_f16mf2_m(...) __riscv_vsoxei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxei8_v_f16m1_m(...) __riscv_vsoxei8_v_f16m1_m(__VA_ARGS__) +#define vsoxei8_v_f16m2_m(...) __riscv_vsoxei8_v_f16m2_m(__VA_ARGS__) +#define vsoxei8_v_f16m4_m(...) __riscv_vsoxei8_v_f16m4_m(__VA_ARGS__) +#define vsoxei8_v_f16m8_m(...) __riscv_vsoxei8_v_f16m8_m(__VA_ARGS__) +#define vsoxei16_v_f16mf4_m(...) __riscv_vsoxei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxei16_v_f16mf2_m(...) __riscv_vsoxei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxei16_v_f16m1_m(...) __riscv_vsoxei16_v_f16m1_m(__VA_ARGS__) +#define vsoxei16_v_f16m2_m(...) __riscv_vsoxei16_v_f16m2_m(__VA_ARGS__) +#define vsoxei16_v_f16m4_m(...) __riscv_vsoxei16_v_f16m4_m(__VA_ARGS__) +#define vsoxei16_v_f16m8_m(...) __riscv_vsoxei16_v_f16m8_m(__VA_ARGS__) +#define vsoxei32_v_f16mf4_m(...) __riscv_vsoxei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxei32_v_f16mf2_m(...) __riscv_vsoxei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxei32_v_f16m1_m(...) __riscv_vsoxei32_v_f16m1_m(__VA_ARGS__) +#define vsoxei32_v_f16m2_m(...) __riscv_vsoxei32_v_f16m2_m(__VA_ARGS__) +#define vsoxei32_v_f16m4_m(...) __riscv_vsoxei32_v_f16m4_m(__VA_ARGS__) +#define vsoxei64_v_f16mf4_m(...) __riscv_vsoxei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxei64_v_f16mf2_m(...) __riscv_vsoxei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxei64_v_f16m1_m(...) __riscv_vsoxei64_v_f16m1_m(__VA_ARGS__) +#define vsoxei64_v_f16m2_m(...) __riscv_vsoxei64_v_f16m2_m(__VA_ARGS__) +#define vsoxei8_v_f32mf2_m(...) __riscv_vsoxei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxei8_v_f32m1_m(...) __riscv_vsoxei8_v_f32m1_m(__VA_ARGS__) +#define vsoxei8_v_f32m2_m(...) __riscv_vsoxei8_v_f32m2_m(__VA_ARGS__) +#define vsoxei8_v_f32m4_m(...) __riscv_vsoxei8_v_f32m4_m(__VA_ARGS__) +#define vsoxei8_v_f32m8_m(...) __riscv_vsoxei8_v_f32m8_m(__VA_ARGS__) +#define vsoxei16_v_f32mf2_m(...) __riscv_vsoxei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxei16_v_f32m1_m(...) __riscv_vsoxei16_v_f32m1_m(__VA_ARGS__) +#define vsoxei16_v_f32m2_m(...) __riscv_vsoxei16_v_f32m2_m(__VA_ARGS__) +#define vsoxei16_v_f32m4_m(...) __riscv_vsoxei16_v_f32m4_m(__VA_ARGS__) +#define vsoxei16_v_f32m8_m(...) __riscv_vsoxei16_v_f32m8_m(__VA_ARGS__) +#define vsoxei32_v_f32mf2_m(...) __riscv_vsoxei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxei32_v_f32m1_m(...) __riscv_vsoxei32_v_f32m1_m(__VA_ARGS__) +#define vsoxei32_v_f32m2_m(...) __riscv_vsoxei32_v_f32m2_m(__VA_ARGS__) +#define vsoxei32_v_f32m4_m(...) __riscv_vsoxei32_v_f32m4_m(__VA_ARGS__) +#define vsoxei32_v_f32m8_m(...) __riscv_vsoxei32_v_f32m8_m(__VA_ARGS__) +#define vsoxei64_v_f32mf2_m(...) __riscv_vsoxei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxei64_v_f32m1_m(...) __riscv_vsoxei64_v_f32m1_m(__VA_ARGS__) +#define vsoxei64_v_f32m2_m(...) __riscv_vsoxei64_v_f32m2_m(__VA_ARGS__) +#define vsoxei64_v_f32m4_m(...) __riscv_vsoxei64_v_f32m4_m(__VA_ARGS__) +#define vsoxei8_v_f64m1_m(...) __riscv_vsoxei8_v_f64m1_m(__VA_ARGS__) +#define vsoxei8_v_f64m2_m(...) __riscv_vsoxei8_v_f64m2_m(__VA_ARGS__) +#define vsoxei8_v_f64m4_m(...) __riscv_vsoxei8_v_f64m4_m(__VA_ARGS__) +#define vsoxei8_v_f64m8_m(...) __riscv_vsoxei8_v_f64m8_m(__VA_ARGS__) +#define vsoxei16_v_f64m1_m(...) __riscv_vsoxei16_v_f64m1_m(__VA_ARGS__) +#define vsoxei16_v_f64m2_m(...) __riscv_vsoxei16_v_f64m2_m(__VA_ARGS__) +#define vsoxei16_v_f64m4_m(...) __riscv_vsoxei16_v_f64m4_m(__VA_ARGS__) +#define vsoxei16_v_f64m8_m(...) __riscv_vsoxei16_v_f64m8_m(__VA_ARGS__) +#define vsoxei32_v_f64m1_m(...) __riscv_vsoxei32_v_f64m1_m(__VA_ARGS__) +#define vsoxei32_v_f64m2_m(...) __riscv_vsoxei32_v_f64m2_m(__VA_ARGS__) +#define vsoxei32_v_f64m4_m(...) __riscv_vsoxei32_v_f64m4_m(__VA_ARGS__) +#define vsoxei32_v_f64m8_m(...) __riscv_vsoxei32_v_f64m8_m(__VA_ARGS__) +#define vsoxei64_v_f64m1_m(...) __riscv_vsoxei64_v_f64m1_m(__VA_ARGS__) +#define vsoxei64_v_f64m2_m(...) __riscv_vsoxei64_v_f64m2_m(__VA_ARGS__) +#define vsoxei64_v_f64m4_m(...) __riscv_vsoxei64_v_f64m4_m(__VA_ARGS__) +#define vsoxei64_v_f64m8_m(...) __riscv_vsoxei64_v_f64m8_m(__VA_ARGS__) +#define vsuxei8_v_f16mf4_m(...) __riscv_vsuxei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxei8_v_f16mf2_m(...) __riscv_vsuxei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxei8_v_f16m1_m(...) __riscv_vsuxei8_v_f16m1_m(__VA_ARGS__) +#define vsuxei8_v_f16m2_m(...) __riscv_vsuxei8_v_f16m2_m(__VA_ARGS__) +#define vsuxei8_v_f16m4_m(...) __riscv_vsuxei8_v_f16m4_m(__VA_ARGS__) +#define vsuxei8_v_f16m8_m(...) __riscv_vsuxei8_v_f16m8_m(__VA_ARGS__) +#define vsuxei16_v_f16mf4_m(...) __riscv_vsuxei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxei16_v_f16mf2_m(...) __riscv_vsuxei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxei16_v_f16m1_m(...) __riscv_vsuxei16_v_f16m1_m(__VA_ARGS__) +#define vsuxei16_v_f16m2_m(...) __riscv_vsuxei16_v_f16m2_m(__VA_ARGS__) +#define vsuxei16_v_f16m4_m(...) __riscv_vsuxei16_v_f16m4_m(__VA_ARGS__) +#define vsuxei16_v_f16m8_m(...) __riscv_vsuxei16_v_f16m8_m(__VA_ARGS__) +#define vsuxei32_v_f16mf4_m(...) __riscv_vsuxei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxei32_v_f16mf2_m(...) __riscv_vsuxei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxei32_v_f16m1_m(...) __riscv_vsuxei32_v_f16m1_m(__VA_ARGS__) +#define vsuxei32_v_f16m2_m(...) __riscv_vsuxei32_v_f16m2_m(__VA_ARGS__) +#define vsuxei32_v_f16m4_m(...) __riscv_vsuxei32_v_f16m4_m(__VA_ARGS__) +#define vsuxei64_v_f16mf4_m(...) __riscv_vsuxei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxei64_v_f16mf2_m(...) __riscv_vsuxei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxei64_v_f16m1_m(...) __riscv_vsuxei64_v_f16m1_m(__VA_ARGS__) +#define vsuxei64_v_f16m2_m(...) __riscv_vsuxei64_v_f16m2_m(__VA_ARGS__) +#define vsuxei8_v_f32mf2_m(...) __riscv_vsuxei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxei8_v_f32m1_m(...) __riscv_vsuxei8_v_f32m1_m(__VA_ARGS__) +#define vsuxei8_v_f32m2_m(...) __riscv_vsuxei8_v_f32m2_m(__VA_ARGS__) +#define vsuxei8_v_f32m4_m(...) __riscv_vsuxei8_v_f32m4_m(__VA_ARGS__) +#define vsuxei8_v_f32m8_m(...) __riscv_vsuxei8_v_f32m8_m(__VA_ARGS__) +#define vsuxei16_v_f32mf2_m(...) __riscv_vsuxei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxei16_v_f32m1_m(...) __riscv_vsuxei16_v_f32m1_m(__VA_ARGS__) +#define vsuxei16_v_f32m2_m(...) __riscv_vsuxei16_v_f32m2_m(__VA_ARGS__) +#define vsuxei16_v_f32m4_m(...) __riscv_vsuxei16_v_f32m4_m(__VA_ARGS__) +#define vsuxei16_v_f32m8_m(...) __riscv_vsuxei16_v_f32m8_m(__VA_ARGS__) +#define vsuxei32_v_f32mf2_m(...) __riscv_vsuxei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxei32_v_f32m1_m(...) __riscv_vsuxei32_v_f32m1_m(__VA_ARGS__) +#define vsuxei32_v_f32m2_m(...) __riscv_vsuxei32_v_f32m2_m(__VA_ARGS__) +#define vsuxei32_v_f32m4_m(...) __riscv_vsuxei32_v_f32m4_m(__VA_ARGS__) +#define vsuxei32_v_f32m8_m(...) __riscv_vsuxei32_v_f32m8_m(__VA_ARGS__) +#define vsuxei64_v_f32mf2_m(...) __riscv_vsuxei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxei64_v_f32m1_m(...) __riscv_vsuxei64_v_f32m1_m(__VA_ARGS__) +#define vsuxei64_v_f32m2_m(...) __riscv_vsuxei64_v_f32m2_m(__VA_ARGS__) +#define vsuxei64_v_f32m4_m(...) __riscv_vsuxei64_v_f32m4_m(__VA_ARGS__) +#define vsuxei8_v_f64m1_m(...) __riscv_vsuxei8_v_f64m1_m(__VA_ARGS__) +#define vsuxei8_v_f64m2_m(...) __riscv_vsuxei8_v_f64m2_m(__VA_ARGS__) +#define vsuxei8_v_f64m4_m(...) __riscv_vsuxei8_v_f64m4_m(__VA_ARGS__) +#define vsuxei8_v_f64m8_m(...) __riscv_vsuxei8_v_f64m8_m(__VA_ARGS__) +#define vsuxei16_v_f64m1_m(...) __riscv_vsuxei16_v_f64m1_m(__VA_ARGS__) +#define vsuxei16_v_f64m2_m(...) __riscv_vsuxei16_v_f64m2_m(__VA_ARGS__) +#define vsuxei16_v_f64m4_m(...) __riscv_vsuxei16_v_f64m4_m(__VA_ARGS__) +#define vsuxei16_v_f64m8_m(...) __riscv_vsuxei16_v_f64m8_m(__VA_ARGS__) +#define vsuxei32_v_f64m1_m(...) __riscv_vsuxei32_v_f64m1_m(__VA_ARGS__) +#define vsuxei32_v_f64m2_m(...) __riscv_vsuxei32_v_f64m2_m(__VA_ARGS__) +#define vsuxei32_v_f64m4_m(...) __riscv_vsuxei32_v_f64m4_m(__VA_ARGS__) +#define vsuxei32_v_f64m8_m(...) __riscv_vsuxei32_v_f64m8_m(__VA_ARGS__) +#define vsuxei64_v_f64m1_m(...) __riscv_vsuxei64_v_f64m1_m(__VA_ARGS__) +#define vsuxei64_v_f64m2_m(...) __riscv_vsuxei64_v_f64m2_m(__VA_ARGS__) +#define vsuxei64_v_f64m4_m(...) __riscv_vsuxei64_v_f64m4_m(__VA_ARGS__) +#define vsuxei64_v_f64m8_m(...) __riscv_vsuxei64_v_f64m8_m(__VA_ARGS__) +#define vsoxei8_v_i8mf8_m(...) __riscv_vsoxei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxei8_v_i8mf4_m(...) __riscv_vsoxei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxei8_v_i8mf2_m(...) __riscv_vsoxei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxei8_v_i8m1_m(...) __riscv_vsoxei8_v_i8m1_m(__VA_ARGS__) +#define vsoxei8_v_i8m2_m(...) __riscv_vsoxei8_v_i8m2_m(__VA_ARGS__) +#define vsoxei8_v_i8m4_m(...) __riscv_vsoxei8_v_i8m4_m(__VA_ARGS__) +#define vsoxei8_v_i8m8_m(...) __riscv_vsoxei8_v_i8m8_m(__VA_ARGS__) +#define vsoxei16_v_i8mf8_m(...) __riscv_vsoxei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxei16_v_i8mf4_m(...) __riscv_vsoxei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxei16_v_i8mf2_m(...) __riscv_vsoxei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxei16_v_i8m1_m(...) __riscv_vsoxei16_v_i8m1_m(__VA_ARGS__) +#define vsoxei16_v_i8m2_m(...) __riscv_vsoxei16_v_i8m2_m(__VA_ARGS__) +#define vsoxei16_v_i8m4_m(...) __riscv_vsoxei16_v_i8m4_m(__VA_ARGS__) +#define vsoxei32_v_i8mf8_m(...) __riscv_vsoxei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxei32_v_i8mf4_m(...) __riscv_vsoxei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxei32_v_i8mf2_m(...) __riscv_vsoxei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxei32_v_i8m1_m(...) __riscv_vsoxei32_v_i8m1_m(__VA_ARGS__) +#define vsoxei32_v_i8m2_m(...) __riscv_vsoxei32_v_i8m2_m(__VA_ARGS__) +#define vsoxei64_v_i8mf8_m(...) __riscv_vsoxei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxei64_v_i8mf4_m(...) __riscv_vsoxei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxei64_v_i8mf2_m(...) __riscv_vsoxei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxei64_v_i8m1_m(...) __riscv_vsoxei64_v_i8m1_m(__VA_ARGS__) +#define vsoxei8_v_i16mf4_m(...) __riscv_vsoxei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxei8_v_i16mf2_m(...) __riscv_vsoxei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxei8_v_i16m1_m(...) __riscv_vsoxei8_v_i16m1_m(__VA_ARGS__) +#define vsoxei8_v_i16m2_m(...) __riscv_vsoxei8_v_i16m2_m(__VA_ARGS__) +#define vsoxei8_v_i16m4_m(...) __riscv_vsoxei8_v_i16m4_m(__VA_ARGS__) +#define vsoxei8_v_i16m8_m(...) __riscv_vsoxei8_v_i16m8_m(__VA_ARGS__) +#define vsoxei16_v_i16mf4_m(...) __riscv_vsoxei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxei16_v_i16mf2_m(...) __riscv_vsoxei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxei16_v_i16m1_m(...) __riscv_vsoxei16_v_i16m1_m(__VA_ARGS__) +#define vsoxei16_v_i16m2_m(...) __riscv_vsoxei16_v_i16m2_m(__VA_ARGS__) +#define vsoxei16_v_i16m4_m(...) __riscv_vsoxei16_v_i16m4_m(__VA_ARGS__) +#define vsoxei16_v_i16m8_m(...) __riscv_vsoxei16_v_i16m8_m(__VA_ARGS__) +#define vsoxei32_v_i16mf4_m(...) __riscv_vsoxei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxei32_v_i16mf2_m(...) __riscv_vsoxei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxei32_v_i16m1_m(...) __riscv_vsoxei32_v_i16m1_m(__VA_ARGS__) +#define vsoxei32_v_i16m2_m(...) __riscv_vsoxei32_v_i16m2_m(__VA_ARGS__) +#define vsoxei32_v_i16m4_m(...) __riscv_vsoxei32_v_i16m4_m(__VA_ARGS__) +#define vsoxei64_v_i16mf4_m(...) __riscv_vsoxei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxei64_v_i16mf2_m(...) __riscv_vsoxei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxei64_v_i16m1_m(...) __riscv_vsoxei64_v_i16m1_m(__VA_ARGS__) +#define vsoxei64_v_i16m2_m(...) __riscv_vsoxei64_v_i16m2_m(__VA_ARGS__) +#define vsoxei8_v_i32mf2_m(...) __riscv_vsoxei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxei8_v_i32m1_m(...) __riscv_vsoxei8_v_i32m1_m(__VA_ARGS__) +#define vsoxei8_v_i32m2_m(...) __riscv_vsoxei8_v_i32m2_m(__VA_ARGS__) +#define vsoxei8_v_i32m4_m(...) __riscv_vsoxei8_v_i32m4_m(__VA_ARGS__) +#define vsoxei8_v_i32m8_m(...) __riscv_vsoxei8_v_i32m8_m(__VA_ARGS__) +#define vsoxei16_v_i32mf2_m(...) __riscv_vsoxei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxei16_v_i32m1_m(...) __riscv_vsoxei16_v_i32m1_m(__VA_ARGS__) +#define vsoxei16_v_i32m2_m(...) __riscv_vsoxei16_v_i32m2_m(__VA_ARGS__) +#define vsoxei16_v_i32m4_m(...) __riscv_vsoxei16_v_i32m4_m(__VA_ARGS__) +#define vsoxei16_v_i32m8_m(...) __riscv_vsoxei16_v_i32m8_m(__VA_ARGS__) +#define vsoxei32_v_i32mf2_m(...) __riscv_vsoxei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxei32_v_i32m1_m(...) __riscv_vsoxei32_v_i32m1_m(__VA_ARGS__) +#define vsoxei32_v_i32m2_m(...) __riscv_vsoxei32_v_i32m2_m(__VA_ARGS__) +#define vsoxei32_v_i32m4_m(...) __riscv_vsoxei32_v_i32m4_m(__VA_ARGS__) +#define vsoxei32_v_i32m8_m(...) __riscv_vsoxei32_v_i32m8_m(__VA_ARGS__) +#define vsoxei64_v_i32mf2_m(...) __riscv_vsoxei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxei64_v_i32m1_m(...) __riscv_vsoxei64_v_i32m1_m(__VA_ARGS__) +#define vsoxei64_v_i32m2_m(...) __riscv_vsoxei64_v_i32m2_m(__VA_ARGS__) +#define vsoxei64_v_i32m4_m(...) __riscv_vsoxei64_v_i32m4_m(__VA_ARGS__) +#define vsoxei8_v_i64m1_m(...) __riscv_vsoxei8_v_i64m1_m(__VA_ARGS__) +#define vsoxei8_v_i64m2_m(...) __riscv_vsoxei8_v_i64m2_m(__VA_ARGS__) +#define vsoxei8_v_i64m4_m(...) __riscv_vsoxei8_v_i64m4_m(__VA_ARGS__) +#define vsoxei8_v_i64m8_m(...) __riscv_vsoxei8_v_i64m8_m(__VA_ARGS__) +#define vsoxei16_v_i64m1_m(...) __riscv_vsoxei16_v_i64m1_m(__VA_ARGS__) +#define vsoxei16_v_i64m2_m(...) __riscv_vsoxei16_v_i64m2_m(__VA_ARGS__) +#define vsoxei16_v_i64m4_m(...) __riscv_vsoxei16_v_i64m4_m(__VA_ARGS__) +#define vsoxei16_v_i64m8_m(...) __riscv_vsoxei16_v_i64m8_m(__VA_ARGS__) +#define vsoxei32_v_i64m1_m(...) __riscv_vsoxei32_v_i64m1_m(__VA_ARGS__) +#define vsoxei32_v_i64m2_m(...) __riscv_vsoxei32_v_i64m2_m(__VA_ARGS__) +#define vsoxei32_v_i64m4_m(...) __riscv_vsoxei32_v_i64m4_m(__VA_ARGS__) +#define vsoxei32_v_i64m8_m(...) __riscv_vsoxei32_v_i64m8_m(__VA_ARGS__) +#define vsoxei64_v_i64m1_m(...) __riscv_vsoxei64_v_i64m1_m(__VA_ARGS__) +#define vsoxei64_v_i64m2_m(...) __riscv_vsoxei64_v_i64m2_m(__VA_ARGS__) +#define vsoxei64_v_i64m4_m(...) __riscv_vsoxei64_v_i64m4_m(__VA_ARGS__) +#define vsoxei64_v_i64m8_m(...) __riscv_vsoxei64_v_i64m8_m(__VA_ARGS__) +#define vsuxei8_v_i8mf8_m(...) __riscv_vsuxei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxei8_v_i8mf4_m(...) __riscv_vsuxei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxei8_v_i8mf2_m(...) __riscv_vsuxei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxei8_v_i8m1_m(...) __riscv_vsuxei8_v_i8m1_m(__VA_ARGS__) +#define vsuxei8_v_i8m2_m(...) __riscv_vsuxei8_v_i8m2_m(__VA_ARGS__) +#define vsuxei8_v_i8m4_m(...) __riscv_vsuxei8_v_i8m4_m(__VA_ARGS__) +#define vsuxei8_v_i8m8_m(...) __riscv_vsuxei8_v_i8m8_m(__VA_ARGS__) +#define vsuxei16_v_i8mf8_m(...) __riscv_vsuxei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxei16_v_i8mf4_m(...) __riscv_vsuxei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxei16_v_i8mf2_m(...) __riscv_vsuxei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxei16_v_i8m1_m(...) __riscv_vsuxei16_v_i8m1_m(__VA_ARGS__) +#define vsuxei16_v_i8m2_m(...) __riscv_vsuxei16_v_i8m2_m(__VA_ARGS__) +#define vsuxei16_v_i8m4_m(...) __riscv_vsuxei16_v_i8m4_m(__VA_ARGS__) +#define vsuxei32_v_i8mf8_m(...) __riscv_vsuxei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxei32_v_i8mf4_m(...) __riscv_vsuxei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxei32_v_i8mf2_m(...) __riscv_vsuxei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxei32_v_i8m1_m(...) __riscv_vsuxei32_v_i8m1_m(__VA_ARGS__) +#define vsuxei32_v_i8m2_m(...) __riscv_vsuxei32_v_i8m2_m(__VA_ARGS__) +#define vsuxei64_v_i8mf8_m(...) __riscv_vsuxei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxei64_v_i8mf4_m(...) __riscv_vsuxei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxei64_v_i8mf2_m(...) __riscv_vsuxei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxei64_v_i8m1_m(...) __riscv_vsuxei64_v_i8m1_m(__VA_ARGS__) +#define vsuxei8_v_i16mf4_m(...) __riscv_vsuxei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxei8_v_i16mf2_m(...) __riscv_vsuxei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxei8_v_i16m1_m(...) __riscv_vsuxei8_v_i16m1_m(__VA_ARGS__) +#define vsuxei8_v_i16m2_m(...) __riscv_vsuxei8_v_i16m2_m(__VA_ARGS__) +#define vsuxei8_v_i16m4_m(...) __riscv_vsuxei8_v_i16m4_m(__VA_ARGS__) +#define vsuxei8_v_i16m8_m(...) __riscv_vsuxei8_v_i16m8_m(__VA_ARGS__) +#define vsuxei16_v_i16mf4_m(...) __riscv_vsuxei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxei16_v_i16mf2_m(...) __riscv_vsuxei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxei16_v_i16m1_m(...) __riscv_vsuxei16_v_i16m1_m(__VA_ARGS__) +#define vsuxei16_v_i16m2_m(...) __riscv_vsuxei16_v_i16m2_m(__VA_ARGS__) +#define vsuxei16_v_i16m4_m(...) __riscv_vsuxei16_v_i16m4_m(__VA_ARGS__) +#define vsuxei16_v_i16m8_m(...) __riscv_vsuxei16_v_i16m8_m(__VA_ARGS__) +#define vsuxei32_v_i16mf4_m(...) __riscv_vsuxei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxei32_v_i16mf2_m(...) __riscv_vsuxei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxei32_v_i16m1_m(...) __riscv_vsuxei32_v_i16m1_m(__VA_ARGS__) +#define vsuxei32_v_i16m2_m(...) __riscv_vsuxei32_v_i16m2_m(__VA_ARGS__) +#define vsuxei32_v_i16m4_m(...) __riscv_vsuxei32_v_i16m4_m(__VA_ARGS__) +#define vsuxei64_v_i16mf4_m(...) __riscv_vsuxei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxei64_v_i16mf2_m(...) __riscv_vsuxei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxei64_v_i16m1_m(...) __riscv_vsuxei64_v_i16m1_m(__VA_ARGS__) +#define vsuxei64_v_i16m2_m(...) __riscv_vsuxei64_v_i16m2_m(__VA_ARGS__) +#define vsuxei8_v_i32mf2_m(...) __riscv_vsuxei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxei8_v_i32m1_m(...) __riscv_vsuxei8_v_i32m1_m(__VA_ARGS__) +#define vsuxei8_v_i32m2_m(...) __riscv_vsuxei8_v_i32m2_m(__VA_ARGS__) +#define vsuxei8_v_i32m4_m(...) __riscv_vsuxei8_v_i32m4_m(__VA_ARGS__) +#define vsuxei8_v_i32m8_m(...) __riscv_vsuxei8_v_i32m8_m(__VA_ARGS__) +#define vsuxei16_v_i32mf2_m(...) __riscv_vsuxei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxei16_v_i32m1_m(...) __riscv_vsuxei16_v_i32m1_m(__VA_ARGS__) +#define vsuxei16_v_i32m2_m(...) __riscv_vsuxei16_v_i32m2_m(__VA_ARGS__) +#define vsuxei16_v_i32m4_m(...) __riscv_vsuxei16_v_i32m4_m(__VA_ARGS__) +#define vsuxei16_v_i32m8_m(...) __riscv_vsuxei16_v_i32m8_m(__VA_ARGS__) +#define vsuxei32_v_i32mf2_m(...) __riscv_vsuxei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxei32_v_i32m1_m(...) __riscv_vsuxei32_v_i32m1_m(__VA_ARGS__) +#define vsuxei32_v_i32m2_m(...) __riscv_vsuxei32_v_i32m2_m(__VA_ARGS__) +#define vsuxei32_v_i32m4_m(...) __riscv_vsuxei32_v_i32m4_m(__VA_ARGS__) +#define vsuxei32_v_i32m8_m(...) __riscv_vsuxei32_v_i32m8_m(__VA_ARGS__) +#define vsuxei64_v_i32mf2_m(...) __riscv_vsuxei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxei64_v_i32m1_m(...) __riscv_vsuxei64_v_i32m1_m(__VA_ARGS__) +#define vsuxei64_v_i32m2_m(...) __riscv_vsuxei64_v_i32m2_m(__VA_ARGS__) +#define vsuxei64_v_i32m4_m(...) __riscv_vsuxei64_v_i32m4_m(__VA_ARGS__) +#define vsuxei8_v_i64m1_m(...) __riscv_vsuxei8_v_i64m1_m(__VA_ARGS__) +#define vsuxei8_v_i64m2_m(...) __riscv_vsuxei8_v_i64m2_m(__VA_ARGS__) +#define vsuxei8_v_i64m4_m(...) __riscv_vsuxei8_v_i64m4_m(__VA_ARGS__) +#define vsuxei8_v_i64m8_m(...) __riscv_vsuxei8_v_i64m8_m(__VA_ARGS__) +#define vsuxei16_v_i64m1_m(...) __riscv_vsuxei16_v_i64m1_m(__VA_ARGS__) +#define vsuxei16_v_i64m2_m(...) __riscv_vsuxei16_v_i64m2_m(__VA_ARGS__) +#define vsuxei16_v_i64m4_m(...) __riscv_vsuxei16_v_i64m4_m(__VA_ARGS__) +#define vsuxei16_v_i64m8_m(...) __riscv_vsuxei16_v_i64m8_m(__VA_ARGS__) +#define vsuxei32_v_i64m1_m(...) __riscv_vsuxei32_v_i64m1_m(__VA_ARGS__) +#define vsuxei32_v_i64m2_m(...) __riscv_vsuxei32_v_i64m2_m(__VA_ARGS__) +#define vsuxei32_v_i64m4_m(...) __riscv_vsuxei32_v_i64m4_m(__VA_ARGS__) +#define vsuxei32_v_i64m8_m(...) __riscv_vsuxei32_v_i64m8_m(__VA_ARGS__) +#define vsuxei64_v_i64m1_m(...) __riscv_vsuxei64_v_i64m1_m(__VA_ARGS__) +#define vsuxei64_v_i64m2_m(...) __riscv_vsuxei64_v_i64m2_m(__VA_ARGS__) +#define vsuxei64_v_i64m4_m(...) __riscv_vsuxei64_v_i64m4_m(__VA_ARGS__) +#define vsuxei64_v_i64m8_m(...) __riscv_vsuxei64_v_i64m8_m(__VA_ARGS__) +#define vsoxei8_v_u8mf8_m(...) __riscv_vsoxei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxei8_v_u8mf4_m(...) __riscv_vsoxei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxei8_v_u8mf2_m(...) __riscv_vsoxei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxei8_v_u8m1_m(...) __riscv_vsoxei8_v_u8m1_m(__VA_ARGS__) +#define vsoxei8_v_u8m2_m(...) __riscv_vsoxei8_v_u8m2_m(__VA_ARGS__) +#define vsoxei8_v_u8m4_m(...) __riscv_vsoxei8_v_u8m4_m(__VA_ARGS__) +#define vsoxei8_v_u8m8_m(...) __riscv_vsoxei8_v_u8m8_m(__VA_ARGS__) +#define vsoxei16_v_u8mf8_m(...) __riscv_vsoxei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxei16_v_u8mf4_m(...) __riscv_vsoxei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxei16_v_u8mf2_m(...) __riscv_vsoxei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxei16_v_u8m1_m(...) __riscv_vsoxei16_v_u8m1_m(__VA_ARGS__) +#define vsoxei16_v_u8m2_m(...) __riscv_vsoxei16_v_u8m2_m(__VA_ARGS__) +#define vsoxei16_v_u8m4_m(...) __riscv_vsoxei16_v_u8m4_m(__VA_ARGS__) +#define vsoxei32_v_u8mf8_m(...) __riscv_vsoxei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxei32_v_u8mf4_m(...) __riscv_vsoxei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxei32_v_u8mf2_m(...) __riscv_vsoxei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxei32_v_u8m1_m(...) __riscv_vsoxei32_v_u8m1_m(__VA_ARGS__) +#define vsoxei32_v_u8m2_m(...) __riscv_vsoxei32_v_u8m2_m(__VA_ARGS__) +#define vsoxei64_v_u8mf8_m(...) __riscv_vsoxei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxei64_v_u8mf4_m(...) __riscv_vsoxei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxei64_v_u8mf2_m(...) __riscv_vsoxei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxei64_v_u8m1_m(...) __riscv_vsoxei64_v_u8m1_m(__VA_ARGS__) +#define vsoxei8_v_u16mf4_m(...) __riscv_vsoxei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxei8_v_u16mf2_m(...) __riscv_vsoxei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxei8_v_u16m1_m(...) __riscv_vsoxei8_v_u16m1_m(__VA_ARGS__) +#define vsoxei8_v_u16m2_m(...) __riscv_vsoxei8_v_u16m2_m(__VA_ARGS__) +#define vsoxei8_v_u16m4_m(...) __riscv_vsoxei8_v_u16m4_m(__VA_ARGS__) +#define vsoxei8_v_u16m8_m(...) __riscv_vsoxei8_v_u16m8_m(__VA_ARGS__) +#define vsoxei16_v_u16mf4_m(...) __riscv_vsoxei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxei16_v_u16mf2_m(...) __riscv_vsoxei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxei16_v_u16m1_m(...) __riscv_vsoxei16_v_u16m1_m(__VA_ARGS__) +#define vsoxei16_v_u16m2_m(...) __riscv_vsoxei16_v_u16m2_m(__VA_ARGS__) +#define vsoxei16_v_u16m4_m(...) __riscv_vsoxei16_v_u16m4_m(__VA_ARGS__) +#define vsoxei16_v_u16m8_m(...) __riscv_vsoxei16_v_u16m8_m(__VA_ARGS__) +#define vsoxei32_v_u16mf4_m(...) __riscv_vsoxei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxei32_v_u16mf2_m(...) __riscv_vsoxei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxei32_v_u16m1_m(...) __riscv_vsoxei32_v_u16m1_m(__VA_ARGS__) +#define vsoxei32_v_u16m2_m(...) __riscv_vsoxei32_v_u16m2_m(__VA_ARGS__) +#define vsoxei32_v_u16m4_m(...) __riscv_vsoxei32_v_u16m4_m(__VA_ARGS__) +#define vsoxei64_v_u16mf4_m(...) __riscv_vsoxei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxei64_v_u16mf2_m(...) __riscv_vsoxei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxei64_v_u16m1_m(...) __riscv_vsoxei64_v_u16m1_m(__VA_ARGS__) +#define vsoxei64_v_u16m2_m(...) __riscv_vsoxei64_v_u16m2_m(__VA_ARGS__) +#define vsoxei8_v_u32mf2_m(...) __riscv_vsoxei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxei8_v_u32m1_m(...) __riscv_vsoxei8_v_u32m1_m(__VA_ARGS__) +#define vsoxei8_v_u32m2_m(...) __riscv_vsoxei8_v_u32m2_m(__VA_ARGS__) +#define vsoxei8_v_u32m4_m(...) __riscv_vsoxei8_v_u32m4_m(__VA_ARGS__) +#define vsoxei8_v_u32m8_m(...) __riscv_vsoxei8_v_u32m8_m(__VA_ARGS__) +#define vsoxei16_v_u32mf2_m(...) __riscv_vsoxei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxei16_v_u32m1_m(...) __riscv_vsoxei16_v_u32m1_m(__VA_ARGS__) +#define vsoxei16_v_u32m2_m(...) __riscv_vsoxei16_v_u32m2_m(__VA_ARGS__) +#define vsoxei16_v_u32m4_m(...) __riscv_vsoxei16_v_u32m4_m(__VA_ARGS__) +#define vsoxei16_v_u32m8_m(...) __riscv_vsoxei16_v_u32m8_m(__VA_ARGS__) +#define vsoxei32_v_u32mf2_m(...) __riscv_vsoxei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxei32_v_u32m1_m(...) __riscv_vsoxei32_v_u32m1_m(__VA_ARGS__) +#define vsoxei32_v_u32m2_m(...) __riscv_vsoxei32_v_u32m2_m(__VA_ARGS__) +#define vsoxei32_v_u32m4_m(...) __riscv_vsoxei32_v_u32m4_m(__VA_ARGS__) +#define vsoxei32_v_u32m8_m(...) __riscv_vsoxei32_v_u32m8_m(__VA_ARGS__) +#define vsoxei64_v_u32mf2_m(...) __riscv_vsoxei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxei64_v_u32m1_m(...) __riscv_vsoxei64_v_u32m1_m(__VA_ARGS__) +#define vsoxei64_v_u32m2_m(...) __riscv_vsoxei64_v_u32m2_m(__VA_ARGS__) +#define vsoxei64_v_u32m4_m(...) __riscv_vsoxei64_v_u32m4_m(__VA_ARGS__) +#define vsoxei8_v_u64m1_m(...) __riscv_vsoxei8_v_u64m1_m(__VA_ARGS__) +#define vsoxei8_v_u64m2_m(...) __riscv_vsoxei8_v_u64m2_m(__VA_ARGS__) +#define vsoxei8_v_u64m4_m(...) __riscv_vsoxei8_v_u64m4_m(__VA_ARGS__) +#define vsoxei8_v_u64m8_m(...) __riscv_vsoxei8_v_u64m8_m(__VA_ARGS__) +#define vsoxei16_v_u64m1_m(...) __riscv_vsoxei16_v_u64m1_m(__VA_ARGS__) +#define vsoxei16_v_u64m2_m(...) __riscv_vsoxei16_v_u64m2_m(__VA_ARGS__) +#define vsoxei16_v_u64m4_m(...) __riscv_vsoxei16_v_u64m4_m(__VA_ARGS__) +#define vsoxei16_v_u64m8_m(...) __riscv_vsoxei16_v_u64m8_m(__VA_ARGS__) +#define vsoxei32_v_u64m1_m(...) __riscv_vsoxei32_v_u64m1_m(__VA_ARGS__) +#define vsoxei32_v_u64m2_m(...) __riscv_vsoxei32_v_u64m2_m(__VA_ARGS__) +#define vsoxei32_v_u64m4_m(...) __riscv_vsoxei32_v_u64m4_m(__VA_ARGS__) +#define vsoxei32_v_u64m8_m(...) __riscv_vsoxei32_v_u64m8_m(__VA_ARGS__) +#define vsoxei64_v_u64m1_m(...) __riscv_vsoxei64_v_u64m1_m(__VA_ARGS__) +#define vsoxei64_v_u64m2_m(...) __riscv_vsoxei64_v_u64m2_m(__VA_ARGS__) +#define vsoxei64_v_u64m4_m(...) __riscv_vsoxei64_v_u64m4_m(__VA_ARGS__) +#define vsoxei64_v_u64m8_m(...) __riscv_vsoxei64_v_u64m8_m(__VA_ARGS__) +#define vsuxei8_v_u8mf8_m(...) __riscv_vsuxei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxei8_v_u8mf4_m(...) __riscv_vsuxei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxei8_v_u8mf2_m(...) __riscv_vsuxei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxei8_v_u8m1_m(...) __riscv_vsuxei8_v_u8m1_m(__VA_ARGS__) +#define vsuxei8_v_u8m2_m(...) __riscv_vsuxei8_v_u8m2_m(__VA_ARGS__) +#define vsuxei8_v_u8m4_m(...) __riscv_vsuxei8_v_u8m4_m(__VA_ARGS__) +#define vsuxei8_v_u8m8_m(...) __riscv_vsuxei8_v_u8m8_m(__VA_ARGS__) +#define vsuxei16_v_u8mf8_m(...) __riscv_vsuxei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxei16_v_u8mf4_m(...) __riscv_vsuxei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxei16_v_u8mf2_m(...) __riscv_vsuxei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxei16_v_u8m1_m(...) __riscv_vsuxei16_v_u8m1_m(__VA_ARGS__) +#define vsuxei16_v_u8m2_m(...) __riscv_vsuxei16_v_u8m2_m(__VA_ARGS__) +#define vsuxei16_v_u8m4_m(...) __riscv_vsuxei16_v_u8m4_m(__VA_ARGS__) +#define vsuxei32_v_u8mf8_m(...) __riscv_vsuxei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxei32_v_u8mf4_m(...) __riscv_vsuxei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxei32_v_u8mf2_m(...) __riscv_vsuxei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxei32_v_u8m1_m(...) __riscv_vsuxei32_v_u8m1_m(__VA_ARGS__) +#define vsuxei32_v_u8m2_m(...) __riscv_vsuxei32_v_u8m2_m(__VA_ARGS__) +#define vsuxei64_v_u8mf8_m(...) __riscv_vsuxei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxei64_v_u8mf4_m(...) __riscv_vsuxei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxei64_v_u8mf2_m(...) __riscv_vsuxei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxei64_v_u8m1_m(...) __riscv_vsuxei64_v_u8m1_m(__VA_ARGS__) +#define vsuxei8_v_u16mf4_m(...) __riscv_vsuxei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxei8_v_u16mf2_m(...) __riscv_vsuxei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxei8_v_u16m1_m(...) __riscv_vsuxei8_v_u16m1_m(__VA_ARGS__) +#define vsuxei8_v_u16m2_m(...) __riscv_vsuxei8_v_u16m2_m(__VA_ARGS__) +#define vsuxei8_v_u16m4_m(...) __riscv_vsuxei8_v_u16m4_m(__VA_ARGS__) +#define vsuxei8_v_u16m8_m(...) __riscv_vsuxei8_v_u16m8_m(__VA_ARGS__) +#define vsuxei16_v_u16mf4_m(...) __riscv_vsuxei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxei16_v_u16mf2_m(...) __riscv_vsuxei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxei16_v_u16m1_m(...) __riscv_vsuxei16_v_u16m1_m(__VA_ARGS__) +#define vsuxei16_v_u16m2_m(...) __riscv_vsuxei16_v_u16m2_m(__VA_ARGS__) +#define vsuxei16_v_u16m4_m(...) __riscv_vsuxei16_v_u16m4_m(__VA_ARGS__) +#define vsuxei16_v_u16m8_m(...) __riscv_vsuxei16_v_u16m8_m(__VA_ARGS__) +#define vsuxei32_v_u16mf4_m(...) __riscv_vsuxei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxei32_v_u16mf2_m(...) __riscv_vsuxei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxei32_v_u16m1_m(...) __riscv_vsuxei32_v_u16m1_m(__VA_ARGS__) +#define vsuxei32_v_u16m2_m(...) __riscv_vsuxei32_v_u16m2_m(__VA_ARGS__) +#define vsuxei32_v_u16m4_m(...) __riscv_vsuxei32_v_u16m4_m(__VA_ARGS__) +#define vsuxei64_v_u16mf4_m(...) __riscv_vsuxei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxei64_v_u16mf2_m(...) __riscv_vsuxei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxei64_v_u16m1_m(...) __riscv_vsuxei64_v_u16m1_m(__VA_ARGS__) +#define vsuxei64_v_u16m2_m(...) __riscv_vsuxei64_v_u16m2_m(__VA_ARGS__) +#define vsuxei8_v_u32mf2_m(...) __riscv_vsuxei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxei8_v_u32m1_m(...) __riscv_vsuxei8_v_u32m1_m(__VA_ARGS__) +#define vsuxei8_v_u32m2_m(...) __riscv_vsuxei8_v_u32m2_m(__VA_ARGS__) +#define vsuxei8_v_u32m4_m(...) __riscv_vsuxei8_v_u32m4_m(__VA_ARGS__) +#define vsuxei8_v_u32m8_m(...) __riscv_vsuxei8_v_u32m8_m(__VA_ARGS__) +#define vsuxei16_v_u32mf2_m(...) __riscv_vsuxei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxei16_v_u32m1_m(...) __riscv_vsuxei16_v_u32m1_m(__VA_ARGS__) +#define vsuxei16_v_u32m2_m(...) __riscv_vsuxei16_v_u32m2_m(__VA_ARGS__) +#define vsuxei16_v_u32m4_m(...) __riscv_vsuxei16_v_u32m4_m(__VA_ARGS__) +#define vsuxei16_v_u32m8_m(...) __riscv_vsuxei16_v_u32m8_m(__VA_ARGS__) +#define vsuxei32_v_u32mf2_m(...) __riscv_vsuxei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxei32_v_u32m1_m(...) __riscv_vsuxei32_v_u32m1_m(__VA_ARGS__) +#define vsuxei32_v_u32m2_m(...) __riscv_vsuxei32_v_u32m2_m(__VA_ARGS__) +#define vsuxei32_v_u32m4_m(...) __riscv_vsuxei32_v_u32m4_m(__VA_ARGS__) +#define vsuxei32_v_u32m8_m(...) __riscv_vsuxei32_v_u32m8_m(__VA_ARGS__) +#define vsuxei64_v_u32mf2_m(...) __riscv_vsuxei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxei64_v_u32m1_m(...) __riscv_vsuxei64_v_u32m1_m(__VA_ARGS__) +#define vsuxei64_v_u32m2_m(...) __riscv_vsuxei64_v_u32m2_m(__VA_ARGS__) +#define vsuxei64_v_u32m4_m(...) __riscv_vsuxei64_v_u32m4_m(__VA_ARGS__) +#define vsuxei8_v_u64m1_m(...) __riscv_vsuxei8_v_u64m1_m(__VA_ARGS__) +#define vsuxei8_v_u64m2_m(...) __riscv_vsuxei8_v_u64m2_m(__VA_ARGS__) +#define vsuxei8_v_u64m4_m(...) __riscv_vsuxei8_v_u64m4_m(__VA_ARGS__) +#define vsuxei8_v_u64m8_m(...) __riscv_vsuxei8_v_u64m8_m(__VA_ARGS__) +#define vsuxei16_v_u64m1_m(...) __riscv_vsuxei16_v_u64m1_m(__VA_ARGS__) +#define vsuxei16_v_u64m2_m(...) __riscv_vsuxei16_v_u64m2_m(__VA_ARGS__) +#define vsuxei16_v_u64m4_m(...) __riscv_vsuxei16_v_u64m4_m(__VA_ARGS__) +#define vsuxei16_v_u64m8_m(...) __riscv_vsuxei16_v_u64m8_m(__VA_ARGS__) +#define vsuxei32_v_u64m1_m(...) __riscv_vsuxei32_v_u64m1_m(__VA_ARGS__) +#define vsuxei32_v_u64m2_m(...) __riscv_vsuxei32_v_u64m2_m(__VA_ARGS__) +#define vsuxei32_v_u64m4_m(...) __riscv_vsuxei32_v_u64m4_m(__VA_ARGS__) +#define vsuxei32_v_u64m8_m(...) __riscv_vsuxei32_v_u64m8_m(__VA_ARGS__) +#define vsuxei64_v_u64m1_m(...) __riscv_vsuxei64_v_u64m1_m(__VA_ARGS__) +#define vsuxei64_v_u64m2_m(...) __riscv_vsuxei64_v_u64m2_m(__VA_ARGS__) +#define vsuxei64_v_u64m4_m(...) __riscv_vsuxei64_v_u64m4_m(__VA_ARGS__) +#define vsuxei64_v_u64m8_m(...) __riscv_vsuxei64_v_u64m8_m(__VA_ARGS__) +#define vle16ff_v_f16mf4(...) __riscv_vle16ff_v_f16mf4(__VA_ARGS__) +#define vle16ff_v_f16mf2(...) __riscv_vle16ff_v_f16mf2(__VA_ARGS__) +#define vle16ff_v_f16m1(...) __riscv_vle16ff_v_f16m1(__VA_ARGS__) +#define vle16ff_v_f16m2(...) __riscv_vle16ff_v_f16m2(__VA_ARGS__) +#define vle16ff_v_f16m4(...) __riscv_vle16ff_v_f16m4(__VA_ARGS__) +#define vle16ff_v_f16m8(...) __riscv_vle16ff_v_f16m8(__VA_ARGS__) +#define vle32ff_v_f32mf2(...) __riscv_vle32ff_v_f32mf2(__VA_ARGS__) +#define vle32ff_v_f32m1(...) __riscv_vle32ff_v_f32m1(__VA_ARGS__) +#define vle32ff_v_f32m2(...) __riscv_vle32ff_v_f32m2(__VA_ARGS__) +#define vle32ff_v_f32m4(...) __riscv_vle32ff_v_f32m4(__VA_ARGS__) +#define vle32ff_v_f32m8(...) __riscv_vle32ff_v_f32m8(__VA_ARGS__) +#define vle64ff_v_f64m1(...) __riscv_vle64ff_v_f64m1(__VA_ARGS__) +#define vle64ff_v_f64m2(...) __riscv_vle64ff_v_f64m2(__VA_ARGS__) +#define vle64ff_v_f64m4(...) __riscv_vle64ff_v_f64m4(__VA_ARGS__) +#define vle64ff_v_f64m8(...) __riscv_vle64ff_v_f64m8(__VA_ARGS__) +#define vle8ff_v_i8mf8(...) __riscv_vle8ff_v_i8mf8(__VA_ARGS__) +#define vle8ff_v_i8mf4(...) __riscv_vle8ff_v_i8mf4(__VA_ARGS__) +#define vle8ff_v_i8mf2(...) __riscv_vle8ff_v_i8mf2(__VA_ARGS__) +#define vle8ff_v_i8m1(...) __riscv_vle8ff_v_i8m1(__VA_ARGS__) +#define vle8ff_v_i8m2(...) __riscv_vle8ff_v_i8m2(__VA_ARGS__) +#define vle8ff_v_i8m4(...) __riscv_vle8ff_v_i8m4(__VA_ARGS__) +#define vle8ff_v_i8m8(...) __riscv_vle8ff_v_i8m8(__VA_ARGS__) +#define vle16ff_v_i16mf4(...) __riscv_vle16ff_v_i16mf4(__VA_ARGS__) +#define vle16ff_v_i16mf2(...) __riscv_vle16ff_v_i16mf2(__VA_ARGS__) +#define vle16ff_v_i16m1(...) __riscv_vle16ff_v_i16m1(__VA_ARGS__) +#define vle16ff_v_i16m2(...) __riscv_vle16ff_v_i16m2(__VA_ARGS__) +#define vle16ff_v_i16m4(...) __riscv_vle16ff_v_i16m4(__VA_ARGS__) +#define vle16ff_v_i16m8(...) __riscv_vle16ff_v_i16m8(__VA_ARGS__) +#define vle32ff_v_i32mf2(...) __riscv_vle32ff_v_i32mf2(__VA_ARGS__) +#define vle32ff_v_i32m1(...) __riscv_vle32ff_v_i32m1(__VA_ARGS__) +#define vle32ff_v_i32m2(...) __riscv_vle32ff_v_i32m2(__VA_ARGS__) +#define vle32ff_v_i32m4(...) __riscv_vle32ff_v_i32m4(__VA_ARGS__) +#define vle32ff_v_i32m8(...) __riscv_vle32ff_v_i32m8(__VA_ARGS__) +#define vle64ff_v_i64m1(...) __riscv_vle64ff_v_i64m1(__VA_ARGS__) +#define vle64ff_v_i64m2(...) __riscv_vle64ff_v_i64m2(__VA_ARGS__) +#define vle64ff_v_i64m4(...) __riscv_vle64ff_v_i64m4(__VA_ARGS__) +#define vle64ff_v_i64m8(...) __riscv_vle64ff_v_i64m8(__VA_ARGS__) +#define vle8ff_v_u8mf8(...) __riscv_vle8ff_v_u8mf8(__VA_ARGS__) +#define vle8ff_v_u8mf4(...) __riscv_vle8ff_v_u8mf4(__VA_ARGS__) +#define vle8ff_v_u8mf2(...) __riscv_vle8ff_v_u8mf2(__VA_ARGS__) +#define vle8ff_v_u8m1(...) __riscv_vle8ff_v_u8m1(__VA_ARGS__) +#define vle8ff_v_u8m2(...) __riscv_vle8ff_v_u8m2(__VA_ARGS__) +#define vle8ff_v_u8m4(...) __riscv_vle8ff_v_u8m4(__VA_ARGS__) +#define vle8ff_v_u8m8(...) __riscv_vle8ff_v_u8m8(__VA_ARGS__) +#define vle16ff_v_u16mf4(...) __riscv_vle16ff_v_u16mf4(__VA_ARGS__) +#define vle16ff_v_u16mf2(...) __riscv_vle16ff_v_u16mf2(__VA_ARGS__) +#define vle16ff_v_u16m1(...) __riscv_vle16ff_v_u16m1(__VA_ARGS__) +#define vle16ff_v_u16m2(...) __riscv_vle16ff_v_u16m2(__VA_ARGS__) +#define vle16ff_v_u16m4(...) __riscv_vle16ff_v_u16m4(__VA_ARGS__) +#define vle16ff_v_u16m8(...) __riscv_vle16ff_v_u16m8(__VA_ARGS__) +#define vle32ff_v_u32mf2(...) __riscv_vle32ff_v_u32mf2(__VA_ARGS__) +#define vle32ff_v_u32m1(...) __riscv_vle32ff_v_u32m1(__VA_ARGS__) +#define vle32ff_v_u32m2(...) __riscv_vle32ff_v_u32m2(__VA_ARGS__) +#define vle32ff_v_u32m4(...) __riscv_vle32ff_v_u32m4(__VA_ARGS__) +#define vle32ff_v_u32m8(...) __riscv_vle32ff_v_u32m8(__VA_ARGS__) +#define vle64ff_v_u64m1(...) __riscv_vle64ff_v_u64m1(__VA_ARGS__) +#define vle64ff_v_u64m2(...) __riscv_vle64ff_v_u64m2(__VA_ARGS__) +#define vle64ff_v_u64m4(...) __riscv_vle64ff_v_u64m4(__VA_ARGS__) +#define vle64ff_v_u64m8(...) __riscv_vle64ff_v_u64m8(__VA_ARGS__) +// masked functions +#define vle16ff_v_f16mf4_m(...) __riscv_vle16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vle16ff_v_f16mf2_m(...) __riscv_vle16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vle16ff_v_f16m1_m(...) __riscv_vle16ff_v_f16m1_tumu(__VA_ARGS__) +#define vle16ff_v_f16m2_m(...) __riscv_vle16ff_v_f16m2_tumu(__VA_ARGS__) +#define vle16ff_v_f16m4_m(...) __riscv_vle16ff_v_f16m4_tumu(__VA_ARGS__) +#define vle16ff_v_f16m8_m(...) __riscv_vle16ff_v_f16m8_tumu(__VA_ARGS__) +#define vle32ff_v_f32mf2_m(...) __riscv_vle32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vle32ff_v_f32m1_m(...) __riscv_vle32ff_v_f32m1_tumu(__VA_ARGS__) +#define vle32ff_v_f32m2_m(...) __riscv_vle32ff_v_f32m2_tumu(__VA_ARGS__) +#define vle32ff_v_f32m4_m(...) __riscv_vle32ff_v_f32m4_tumu(__VA_ARGS__) +#define vle32ff_v_f32m8_m(...) __riscv_vle32ff_v_f32m8_tumu(__VA_ARGS__) +#define vle64ff_v_f64m1_m(...) __riscv_vle64ff_v_f64m1_tumu(__VA_ARGS__) +#define vle64ff_v_f64m2_m(...) __riscv_vle64ff_v_f64m2_tumu(__VA_ARGS__) +#define vle64ff_v_f64m4_m(...) __riscv_vle64ff_v_f64m4_tumu(__VA_ARGS__) +#define vle64ff_v_f64m8_m(...) __riscv_vle64ff_v_f64m8_tumu(__VA_ARGS__) +#define vle8ff_v_i8mf8_m(...) __riscv_vle8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vle8ff_v_i8mf4_m(...) __riscv_vle8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vle8ff_v_i8mf2_m(...) __riscv_vle8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vle8ff_v_i8m1_m(...) __riscv_vle8ff_v_i8m1_tumu(__VA_ARGS__) +#define vle8ff_v_i8m2_m(...) __riscv_vle8ff_v_i8m2_tumu(__VA_ARGS__) +#define vle8ff_v_i8m4_m(...) __riscv_vle8ff_v_i8m4_tumu(__VA_ARGS__) +#define vle8ff_v_i8m8_m(...) __riscv_vle8ff_v_i8m8_tumu(__VA_ARGS__) +#define vle16ff_v_i16mf4_m(...) __riscv_vle16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vle16ff_v_i16mf2_m(...) __riscv_vle16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vle16ff_v_i16m1_m(...) __riscv_vle16ff_v_i16m1_tumu(__VA_ARGS__) +#define vle16ff_v_i16m2_m(...) __riscv_vle16ff_v_i16m2_tumu(__VA_ARGS__) +#define vle16ff_v_i16m4_m(...) __riscv_vle16ff_v_i16m4_tumu(__VA_ARGS__) +#define vle16ff_v_i16m8_m(...) __riscv_vle16ff_v_i16m8_tumu(__VA_ARGS__) +#define vle32ff_v_i32mf2_m(...) __riscv_vle32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vle32ff_v_i32m1_m(...) __riscv_vle32ff_v_i32m1_tumu(__VA_ARGS__) +#define vle32ff_v_i32m2_m(...) __riscv_vle32ff_v_i32m2_tumu(__VA_ARGS__) +#define vle32ff_v_i32m4_m(...) __riscv_vle32ff_v_i32m4_tumu(__VA_ARGS__) +#define vle32ff_v_i32m8_m(...) __riscv_vle32ff_v_i32m8_tumu(__VA_ARGS__) +#define vle64ff_v_i64m1_m(...) __riscv_vle64ff_v_i64m1_tumu(__VA_ARGS__) +#define vle64ff_v_i64m2_m(...) __riscv_vle64ff_v_i64m2_tumu(__VA_ARGS__) +#define vle64ff_v_i64m4_m(...) __riscv_vle64ff_v_i64m4_tumu(__VA_ARGS__) +#define vle64ff_v_i64m8_m(...) __riscv_vle64ff_v_i64m8_tumu(__VA_ARGS__) +#define vle8ff_v_u8mf8_m(...) __riscv_vle8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vle8ff_v_u8mf4_m(...) __riscv_vle8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vle8ff_v_u8mf2_m(...) __riscv_vle8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vle8ff_v_u8m1_m(...) __riscv_vle8ff_v_u8m1_tumu(__VA_ARGS__) +#define vle8ff_v_u8m2_m(...) __riscv_vle8ff_v_u8m2_tumu(__VA_ARGS__) +#define vle8ff_v_u8m4_m(...) __riscv_vle8ff_v_u8m4_tumu(__VA_ARGS__) +#define vle8ff_v_u8m8_m(...) __riscv_vle8ff_v_u8m8_tumu(__VA_ARGS__) +#define vle16ff_v_u16mf4_m(...) __riscv_vle16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vle16ff_v_u16mf2_m(...) __riscv_vle16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vle16ff_v_u16m1_m(...) __riscv_vle16ff_v_u16m1_tumu(__VA_ARGS__) +#define vle16ff_v_u16m2_m(...) __riscv_vle16ff_v_u16m2_tumu(__VA_ARGS__) +#define vle16ff_v_u16m4_m(...) __riscv_vle16ff_v_u16m4_tumu(__VA_ARGS__) +#define vle16ff_v_u16m8_m(...) __riscv_vle16ff_v_u16m8_tumu(__VA_ARGS__) +#define vle32ff_v_u32mf2_m(...) __riscv_vle32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vle32ff_v_u32m1_m(...) __riscv_vle32ff_v_u32m1_tumu(__VA_ARGS__) +#define vle32ff_v_u32m2_m(...) __riscv_vle32ff_v_u32m2_tumu(__VA_ARGS__) +#define vle32ff_v_u32m4_m(...) __riscv_vle32ff_v_u32m4_tumu(__VA_ARGS__) +#define vle32ff_v_u32m8_m(...) __riscv_vle32ff_v_u32m8_tumu(__VA_ARGS__) +#define vle64ff_v_u64m1_m(...) __riscv_vle64ff_v_u64m1_tumu(__VA_ARGS__) +#define vle64ff_v_u64m2_m(...) __riscv_vle64ff_v_u64m2_tumu(__VA_ARGS__) +#define vle64ff_v_u64m4_m(...) __riscv_vle64ff_v_u64m4_tumu(__VA_ARGS__) +#define vle64ff_v_u64m8_m(...) __riscv_vle64ff_v_u64m8_tumu(__VA_ARGS__) +#define vlseg2e16_v_f16mf4(...) __riscv_vlseg2e16_v_f16mf4(__VA_ARGS__) +#define vlseg3e16_v_f16mf4(...) __riscv_vlseg3e16_v_f16mf4(__VA_ARGS__) +#define vlseg4e16_v_f16mf4(...) __riscv_vlseg4e16_v_f16mf4(__VA_ARGS__) +#define vlseg5e16_v_f16mf4(...) __riscv_vlseg5e16_v_f16mf4(__VA_ARGS__) +#define vlseg6e16_v_f16mf4(...) __riscv_vlseg6e16_v_f16mf4(__VA_ARGS__) +#define vlseg7e16_v_f16mf4(...) __riscv_vlseg7e16_v_f16mf4(__VA_ARGS__) +#define vlseg8e16_v_f16mf4(...) __riscv_vlseg8e16_v_f16mf4(__VA_ARGS__) +#define vlseg2e16_v_f16mf2(...) __riscv_vlseg2e16_v_f16mf2(__VA_ARGS__) +#define vlseg3e16_v_f16mf2(...) __riscv_vlseg3e16_v_f16mf2(__VA_ARGS__) +#define vlseg4e16_v_f16mf2(...) __riscv_vlseg4e16_v_f16mf2(__VA_ARGS__) +#define vlseg5e16_v_f16mf2(...) __riscv_vlseg5e16_v_f16mf2(__VA_ARGS__) +#define vlseg6e16_v_f16mf2(...) __riscv_vlseg6e16_v_f16mf2(__VA_ARGS__) +#define vlseg7e16_v_f16mf2(...) __riscv_vlseg7e16_v_f16mf2(__VA_ARGS__) +#define vlseg8e16_v_f16mf2(...) __riscv_vlseg8e16_v_f16mf2(__VA_ARGS__) +#define vlseg2e16_v_f16m1(...) __riscv_vlseg2e16_v_f16m1(__VA_ARGS__) +#define vlseg3e16_v_f16m1(...) __riscv_vlseg3e16_v_f16m1(__VA_ARGS__) +#define vlseg4e16_v_f16m1(...) __riscv_vlseg4e16_v_f16m1(__VA_ARGS__) +#define vlseg5e16_v_f16m1(...) __riscv_vlseg5e16_v_f16m1(__VA_ARGS__) +#define vlseg6e16_v_f16m1(...) __riscv_vlseg6e16_v_f16m1(__VA_ARGS__) +#define vlseg7e16_v_f16m1(...) __riscv_vlseg7e16_v_f16m1(__VA_ARGS__) +#define vlseg8e16_v_f16m1(...) __riscv_vlseg8e16_v_f16m1(__VA_ARGS__) +#define vlseg2e16_v_f16m2(...) __riscv_vlseg2e16_v_f16m2(__VA_ARGS__) +#define vlseg3e16_v_f16m2(...) __riscv_vlseg3e16_v_f16m2(__VA_ARGS__) +#define vlseg4e16_v_f16m2(...) __riscv_vlseg4e16_v_f16m2(__VA_ARGS__) +#define vlseg2e16_v_f16m4(...) __riscv_vlseg2e16_v_f16m4(__VA_ARGS__) +#define vlseg2e32_v_f32mf2(...) __riscv_vlseg2e32_v_f32mf2(__VA_ARGS__) +#define vlseg3e32_v_f32mf2(...) __riscv_vlseg3e32_v_f32mf2(__VA_ARGS__) +#define vlseg4e32_v_f32mf2(...) __riscv_vlseg4e32_v_f32mf2(__VA_ARGS__) +#define vlseg5e32_v_f32mf2(...) __riscv_vlseg5e32_v_f32mf2(__VA_ARGS__) +#define vlseg6e32_v_f32mf2(...) __riscv_vlseg6e32_v_f32mf2(__VA_ARGS__) +#define vlseg7e32_v_f32mf2(...) __riscv_vlseg7e32_v_f32mf2(__VA_ARGS__) +#define vlseg8e32_v_f32mf2(...) __riscv_vlseg8e32_v_f32mf2(__VA_ARGS__) +#define vlseg2e32_v_f32m1(...) __riscv_vlseg2e32_v_f32m1(__VA_ARGS__) +#define vlseg3e32_v_f32m1(...) __riscv_vlseg3e32_v_f32m1(__VA_ARGS__) +#define vlseg4e32_v_f32m1(...) __riscv_vlseg4e32_v_f32m1(__VA_ARGS__) +#define vlseg5e32_v_f32m1(...) __riscv_vlseg5e32_v_f32m1(__VA_ARGS__) +#define vlseg6e32_v_f32m1(...) __riscv_vlseg6e32_v_f32m1(__VA_ARGS__) +#define vlseg7e32_v_f32m1(...) __riscv_vlseg7e32_v_f32m1(__VA_ARGS__) +#define vlseg8e32_v_f32m1(...) __riscv_vlseg8e32_v_f32m1(__VA_ARGS__) +#define vlseg2e32_v_f32m2(...) __riscv_vlseg2e32_v_f32m2(__VA_ARGS__) +#define vlseg3e32_v_f32m2(...) __riscv_vlseg3e32_v_f32m2(__VA_ARGS__) +#define vlseg4e32_v_f32m2(...) __riscv_vlseg4e32_v_f32m2(__VA_ARGS__) +#define vlseg2e32_v_f32m4(...) __riscv_vlseg2e32_v_f32m4(__VA_ARGS__) +#define vlseg2e64_v_f64m1(...) __riscv_vlseg2e64_v_f64m1(__VA_ARGS__) +#define vlseg3e64_v_f64m1(...) __riscv_vlseg3e64_v_f64m1(__VA_ARGS__) +#define vlseg4e64_v_f64m1(...) __riscv_vlseg4e64_v_f64m1(__VA_ARGS__) +#define vlseg5e64_v_f64m1(...) __riscv_vlseg5e64_v_f64m1(__VA_ARGS__) +#define vlseg6e64_v_f64m1(...) __riscv_vlseg6e64_v_f64m1(__VA_ARGS__) +#define vlseg7e64_v_f64m1(...) __riscv_vlseg7e64_v_f64m1(__VA_ARGS__) +#define vlseg8e64_v_f64m1(...) __riscv_vlseg8e64_v_f64m1(__VA_ARGS__) +#define vlseg2e64_v_f64m2(...) __riscv_vlseg2e64_v_f64m2(__VA_ARGS__) +#define vlseg3e64_v_f64m2(...) __riscv_vlseg3e64_v_f64m2(__VA_ARGS__) +#define vlseg4e64_v_f64m2(...) __riscv_vlseg4e64_v_f64m2(__VA_ARGS__) +#define vlseg2e64_v_f64m4(...) __riscv_vlseg2e64_v_f64m4(__VA_ARGS__) +#define vlseg2e16ff_v_f16mf4(...) __riscv_vlseg2e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg3e16ff_v_f16mf4(...) __riscv_vlseg3e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg4e16ff_v_f16mf4(...) __riscv_vlseg4e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg5e16ff_v_f16mf4(...) __riscv_vlseg5e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg6e16ff_v_f16mf4(...) __riscv_vlseg6e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg7e16ff_v_f16mf4(...) __riscv_vlseg7e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg8e16ff_v_f16mf4(...) __riscv_vlseg8e16ff_v_f16mf4(__VA_ARGS__) +#define vlseg2e16ff_v_f16mf2(...) __riscv_vlseg2e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg3e16ff_v_f16mf2(...) __riscv_vlseg3e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg4e16ff_v_f16mf2(...) __riscv_vlseg4e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg5e16ff_v_f16mf2(...) __riscv_vlseg5e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg6e16ff_v_f16mf2(...) __riscv_vlseg6e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg7e16ff_v_f16mf2(...) __riscv_vlseg7e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg8e16ff_v_f16mf2(...) __riscv_vlseg8e16ff_v_f16mf2(__VA_ARGS__) +#define vlseg2e16ff_v_f16m1(...) __riscv_vlseg2e16ff_v_f16m1(__VA_ARGS__) +#define vlseg3e16ff_v_f16m1(...) __riscv_vlseg3e16ff_v_f16m1(__VA_ARGS__) +#define vlseg4e16ff_v_f16m1(...) __riscv_vlseg4e16ff_v_f16m1(__VA_ARGS__) +#define vlseg5e16ff_v_f16m1(...) __riscv_vlseg5e16ff_v_f16m1(__VA_ARGS__) +#define vlseg6e16ff_v_f16m1(...) __riscv_vlseg6e16ff_v_f16m1(__VA_ARGS__) +#define vlseg7e16ff_v_f16m1(...) __riscv_vlseg7e16ff_v_f16m1(__VA_ARGS__) +#define vlseg8e16ff_v_f16m1(...) __riscv_vlseg8e16ff_v_f16m1(__VA_ARGS__) +#define vlseg2e16ff_v_f16m2(...) __riscv_vlseg2e16ff_v_f16m2(__VA_ARGS__) +#define vlseg3e16ff_v_f16m2(...) __riscv_vlseg3e16ff_v_f16m2(__VA_ARGS__) +#define vlseg4e16ff_v_f16m2(...) __riscv_vlseg4e16ff_v_f16m2(__VA_ARGS__) +#define vlseg2e16ff_v_f16m4(...) __riscv_vlseg2e16ff_v_f16m4(__VA_ARGS__) +#define vlseg2e32ff_v_f32mf2(...) __riscv_vlseg2e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg3e32ff_v_f32mf2(...) __riscv_vlseg3e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg4e32ff_v_f32mf2(...) __riscv_vlseg4e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg5e32ff_v_f32mf2(...) __riscv_vlseg5e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg6e32ff_v_f32mf2(...) __riscv_vlseg6e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg7e32ff_v_f32mf2(...) __riscv_vlseg7e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg8e32ff_v_f32mf2(...) __riscv_vlseg8e32ff_v_f32mf2(__VA_ARGS__) +#define vlseg2e32ff_v_f32m1(...) __riscv_vlseg2e32ff_v_f32m1(__VA_ARGS__) +#define vlseg3e32ff_v_f32m1(...) __riscv_vlseg3e32ff_v_f32m1(__VA_ARGS__) +#define vlseg4e32ff_v_f32m1(...) __riscv_vlseg4e32ff_v_f32m1(__VA_ARGS__) +#define vlseg5e32ff_v_f32m1(...) __riscv_vlseg5e32ff_v_f32m1(__VA_ARGS__) +#define vlseg6e32ff_v_f32m1(...) __riscv_vlseg6e32ff_v_f32m1(__VA_ARGS__) +#define vlseg7e32ff_v_f32m1(...) __riscv_vlseg7e32ff_v_f32m1(__VA_ARGS__) +#define vlseg8e32ff_v_f32m1(...) __riscv_vlseg8e32ff_v_f32m1(__VA_ARGS__) +#define vlseg2e32ff_v_f32m2(...) __riscv_vlseg2e32ff_v_f32m2(__VA_ARGS__) +#define vlseg3e32ff_v_f32m2(...) __riscv_vlseg3e32ff_v_f32m2(__VA_ARGS__) +#define vlseg4e32ff_v_f32m2(...) __riscv_vlseg4e32ff_v_f32m2(__VA_ARGS__) +#define vlseg2e32ff_v_f32m4(...) __riscv_vlseg2e32ff_v_f32m4(__VA_ARGS__) +#define vlseg2e64ff_v_f64m1(...) __riscv_vlseg2e64ff_v_f64m1(__VA_ARGS__) +#define vlseg3e64ff_v_f64m1(...) __riscv_vlseg3e64ff_v_f64m1(__VA_ARGS__) +#define vlseg4e64ff_v_f64m1(...) __riscv_vlseg4e64ff_v_f64m1(__VA_ARGS__) +#define vlseg5e64ff_v_f64m1(...) __riscv_vlseg5e64ff_v_f64m1(__VA_ARGS__) +#define vlseg6e64ff_v_f64m1(...) __riscv_vlseg6e64ff_v_f64m1(__VA_ARGS__) +#define vlseg7e64ff_v_f64m1(...) __riscv_vlseg7e64ff_v_f64m1(__VA_ARGS__) +#define vlseg8e64ff_v_f64m1(...) __riscv_vlseg8e64ff_v_f64m1(__VA_ARGS__) +#define vlseg2e64ff_v_f64m2(...) __riscv_vlseg2e64ff_v_f64m2(__VA_ARGS__) +#define vlseg3e64ff_v_f64m2(...) __riscv_vlseg3e64ff_v_f64m2(__VA_ARGS__) +#define vlseg4e64ff_v_f64m2(...) __riscv_vlseg4e64ff_v_f64m2(__VA_ARGS__) +#define vlseg2e64ff_v_f64m4(...) __riscv_vlseg2e64ff_v_f64m4(__VA_ARGS__) +#define vlseg2e8_v_i8mf8(...) __riscv_vlseg2e8_v_i8mf8(__VA_ARGS__) +#define vlseg3e8_v_i8mf8(...) __riscv_vlseg3e8_v_i8mf8(__VA_ARGS__) +#define vlseg4e8_v_i8mf8(...) __riscv_vlseg4e8_v_i8mf8(__VA_ARGS__) +#define vlseg5e8_v_i8mf8(...) __riscv_vlseg5e8_v_i8mf8(__VA_ARGS__) +#define vlseg6e8_v_i8mf8(...) __riscv_vlseg6e8_v_i8mf8(__VA_ARGS__) +#define vlseg7e8_v_i8mf8(...) __riscv_vlseg7e8_v_i8mf8(__VA_ARGS__) +#define vlseg8e8_v_i8mf8(...) __riscv_vlseg8e8_v_i8mf8(__VA_ARGS__) +#define vlseg2e8_v_i8mf4(...) __riscv_vlseg2e8_v_i8mf4(__VA_ARGS__) +#define vlseg3e8_v_i8mf4(...) __riscv_vlseg3e8_v_i8mf4(__VA_ARGS__) +#define vlseg4e8_v_i8mf4(...) __riscv_vlseg4e8_v_i8mf4(__VA_ARGS__) +#define vlseg5e8_v_i8mf4(...) __riscv_vlseg5e8_v_i8mf4(__VA_ARGS__) +#define vlseg6e8_v_i8mf4(...) __riscv_vlseg6e8_v_i8mf4(__VA_ARGS__) +#define vlseg7e8_v_i8mf4(...) __riscv_vlseg7e8_v_i8mf4(__VA_ARGS__) +#define vlseg8e8_v_i8mf4(...) __riscv_vlseg8e8_v_i8mf4(__VA_ARGS__) +#define vlseg2e8_v_i8mf2(...) __riscv_vlseg2e8_v_i8mf2(__VA_ARGS__) +#define vlseg3e8_v_i8mf2(...) __riscv_vlseg3e8_v_i8mf2(__VA_ARGS__) +#define vlseg4e8_v_i8mf2(...) __riscv_vlseg4e8_v_i8mf2(__VA_ARGS__) +#define vlseg5e8_v_i8mf2(...) __riscv_vlseg5e8_v_i8mf2(__VA_ARGS__) +#define vlseg6e8_v_i8mf2(...) __riscv_vlseg6e8_v_i8mf2(__VA_ARGS__) +#define vlseg7e8_v_i8mf2(...) __riscv_vlseg7e8_v_i8mf2(__VA_ARGS__) +#define vlseg8e8_v_i8mf2(...) __riscv_vlseg8e8_v_i8mf2(__VA_ARGS__) +#define vlseg2e8_v_i8m1(...) __riscv_vlseg2e8_v_i8m1(__VA_ARGS__) +#define vlseg3e8_v_i8m1(...) __riscv_vlseg3e8_v_i8m1(__VA_ARGS__) +#define vlseg4e8_v_i8m1(...) __riscv_vlseg4e8_v_i8m1(__VA_ARGS__) +#define vlseg5e8_v_i8m1(...) __riscv_vlseg5e8_v_i8m1(__VA_ARGS__) +#define vlseg6e8_v_i8m1(...) __riscv_vlseg6e8_v_i8m1(__VA_ARGS__) +#define vlseg7e8_v_i8m1(...) __riscv_vlseg7e8_v_i8m1(__VA_ARGS__) +#define vlseg8e8_v_i8m1(...) __riscv_vlseg8e8_v_i8m1(__VA_ARGS__) +#define vlseg2e8_v_i8m2(...) __riscv_vlseg2e8_v_i8m2(__VA_ARGS__) +#define vlseg3e8_v_i8m2(...) __riscv_vlseg3e8_v_i8m2(__VA_ARGS__) +#define vlseg4e8_v_i8m2(...) __riscv_vlseg4e8_v_i8m2(__VA_ARGS__) +#define vlseg2e8_v_i8m4(...) __riscv_vlseg2e8_v_i8m4(__VA_ARGS__) +#define vlseg2e16_v_i16mf4(...) __riscv_vlseg2e16_v_i16mf4(__VA_ARGS__) +#define vlseg3e16_v_i16mf4(...) __riscv_vlseg3e16_v_i16mf4(__VA_ARGS__) +#define vlseg4e16_v_i16mf4(...) __riscv_vlseg4e16_v_i16mf4(__VA_ARGS__) +#define vlseg5e16_v_i16mf4(...) __riscv_vlseg5e16_v_i16mf4(__VA_ARGS__) +#define vlseg6e16_v_i16mf4(...) __riscv_vlseg6e16_v_i16mf4(__VA_ARGS__) +#define vlseg7e16_v_i16mf4(...) __riscv_vlseg7e16_v_i16mf4(__VA_ARGS__) +#define vlseg8e16_v_i16mf4(...) __riscv_vlseg8e16_v_i16mf4(__VA_ARGS__) +#define vlseg2e16_v_i16mf2(...) __riscv_vlseg2e16_v_i16mf2(__VA_ARGS__) +#define vlseg3e16_v_i16mf2(...) __riscv_vlseg3e16_v_i16mf2(__VA_ARGS__) +#define vlseg4e16_v_i16mf2(...) __riscv_vlseg4e16_v_i16mf2(__VA_ARGS__) +#define vlseg5e16_v_i16mf2(...) __riscv_vlseg5e16_v_i16mf2(__VA_ARGS__) +#define vlseg6e16_v_i16mf2(...) __riscv_vlseg6e16_v_i16mf2(__VA_ARGS__) +#define vlseg7e16_v_i16mf2(...) __riscv_vlseg7e16_v_i16mf2(__VA_ARGS__) +#define vlseg8e16_v_i16mf2(...) __riscv_vlseg8e16_v_i16mf2(__VA_ARGS__) +#define vlseg2e16_v_i16m1(...) __riscv_vlseg2e16_v_i16m1(__VA_ARGS__) +#define vlseg3e16_v_i16m1(...) __riscv_vlseg3e16_v_i16m1(__VA_ARGS__) +#define vlseg4e16_v_i16m1(...) __riscv_vlseg4e16_v_i16m1(__VA_ARGS__) +#define vlseg5e16_v_i16m1(...) __riscv_vlseg5e16_v_i16m1(__VA_ARGS__) +#define vlseg6e16_v_i16m1(...) __riscv_vlseg6e16_v_i16m1(__VA_ARGS__) +#define vlseg7e16_v_i16m1(...) __riscv_vlseg7e16_v_i16m1(__VA_ARGS__) +#define vlseg8e16_v_i16m1(...) __riscv_vlseg8e16_v_i16m1(__VA_ARGS__) +#define vlseg2e16_v_i16m2(...) __riscv_vlseg2e16_v_i16m2(__VA_ARGS__) +#define vlseg3e16_v_i16m2(...) __riscv_vlseg3e16_v_i16m2(__VA_ARGS__) +#define vlseg4e16_v_i16m2(...) __riscv_vlseg4e16_v_i16m2(__VA_ARGS__) +#define vlseg2e16_v_i16m4(...) __riscv_vlseg2e16_v_i16m4(__VA_ARGS__) +#define vlseg2e32_v_i32mf2(...) __riscv_vlseg2e32_v_i32mf2(__VA_ARGS__) +#define vlseg3e32_v_i32mf2(...) __riscv_vlseg3e32_v_i32mf2(__VA_ARGS__) +#define vlseg4e32_v_i32mf2(...) __riscv_vlseg4e32_v_i32mf2(__VA_ARGS__) +#define vlseg5e32_v_i32mf2(...) __riscv_vlseg5e32_v_i32mf2(__VA_ARGS__) +#define vlseg6e32_v_i32mf2(...) __riscv_vlseg6e32_v_i32mf2(__VA_ARGS__) +#define vlseg7e32_v_i32mf2(...) __riscv_vlseg7e32_v_i32mf2(__VA_ARGS__) +#define vlseg8e32_v_i32mf2(...) __riscv_vlseg8e32_v_i32mf2(__VA_ARGS__) +#define vlseg2e32_v_i32m1(...) __riscv_vlseg2e32_v_i32m1(__VA_ARGS__) +#define vlseg3e32_v_i32m1(...) __riscv_vlseg3e32_v_i32m1(__VA_ARGS__) +#define vlseg4e32_v_i32m1(...) __riscv_vlseg4e32_v_i32m1(__VA_ARGS__) +#define vlseg5e32_v_i32m1(...) __riscv_vlseg5e32_v_i32m1(__VA_ARGS__) +#define vlseg6e32_v_i32m1(...) __riscv_vlseg6e32_v_i32m1(__VA_ARGS__) +#define vlseg7e32_v_i32m1(...) __riscv_vlseg7e32_v_i32m1(__VA_ARGS__) +#define vlseg8e32_v_i32m1(...) __riscv_vlseg8e32_v_i32m1(__VA_ARGS__) +#define vlseg2e32_v_i32m2(...) __riscv_vlseg2e32_v_i32m2(__VA_ARGS__) +#define vlseg3e32_v_i32m2(...) __riscv_vlseg3e32_v_i32m2(__VA_ARGS__) +#define vlseg4e32_v_i32m2(...) __riscv_vlseg4e32_v_i32m2(__VA_ARGS__) +#define vlseg2e32_v_i32m4(...) __riscv_vlseg2e32_v_i32m4(__VA_ARGS__) +#define vlseg2e64_v_i64m1(...) __riscv_vlseg2e64_v_i64m1(__VA_ARGS__) +#define vlseg3e64_v_i64m1(...) __riscv_vlseg3e64_v_i64m1(__VA_ARGS__) +#define vlseg4e64_v_i64m1(...) __riscv_vlseg4e64_v_i64m1(__VA_ARGS__) +#define vlseg5e64_v_i64m1(...) __riscv_vlseg5e64_v_i64m1(__VA_ARGS__) +#define vlseg6e64_v_i64m1(...) __riscv_vlseg6e64_v_i64m1(__VA_ARGS__) +#define vlseg7e64_v_i64m1(...) __riscv_vlseg7e64_v_i64m1(__VA_ARGS__) +#define vlseg8e64_v_i64m1(...) __riscv_vlseg8e64_v_i64m1(__VA_ARGS__) +#define vlseg2e64_v_i64m2(...) __riscv_vlseg2e64_v_i64m2(__VA_ARGS__) +#define vlseg3e64_v_i64m2(...) __riscv_vlseg3e64_v_i64m2(__VA_ARGS__) +#define vlseg4e64_v_i64m2(...) __riscv_vlseg4e64_v_i64m2(__VA_ARGS__) +#define vlseg2e64_v_i64m4(...) __riscv_vlseg2e64_v_i64m4(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf8(...) __riscv_vlseg2e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf8(...) __riscv_vlseg3e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf8(...) __riscv_vlseg4e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf8(...) __riscv_vlseg5e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf8(...) __riscv_vlseg6e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf8(...) __riscv_vlseg7e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf8(...) __riscv_vlseg8e8ff_v_i8mf8(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf4(...) __riscv_vlseg2e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf4(...) __riscv_vlseg3e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf4(...) __riscv_vlseg4e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf4(...) __riscv_vlseg5e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf4(...) __riscv_vlseg6e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf4(...) __riscv_vlseg7e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf4(...) __riscv_vlseg8e8ff_v_i8mf4(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf2(...) __riscv_vlseg2e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf2(...) __riscv_vlseg3e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf2(...) __riscv_vlseg4e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf2(...) __riscv_vlseg5e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf2(...) __riscv_vlseg6e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf2(...) __riscv_vlseg7e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf2(...) __riscv_vlseg8e8ff_v_i8mf2(__VA_ARGS__) +#define vlseg2e8ff_v_i8m1(...) __riscv_vlseg2e8ff_v_i8m1(__VA_ARGS__) +#define vlseg3e8ff_v_i8m1(...) __riscv_vlseg3e8ff_v_i8m1(__VA_ARGS__) +#define vlseg4e8ff_v_i8m1(...) __riscv_vlseg4e8ff_v_i8m1(__VA_ARGS__) +#define vlseg5e8ff_v_i8m1(...) __riscv_vlseg5e8ff_v_i8m1(__VA_ARGS__) +#define vlseg6e8ff_v_i8m1(...) __riscv_vlseg6e8ff_v_i8m1(__VA_ARGS__) +#define vlseg7e8ff_v_i8m1(...) __riscv_vlseg7e8ff_v_i8m1(__VA_ARGS__) +#define vlseg8e8ff_v_i8m1(...) __riscv_vlseg8e8ff_v_i8m1(__VA_ARGS__) +#define vlseg2e8ff_v_i8m2(...) __riscv_vlseg2e8ff_v_i8m2(__VA_ARGS__) +#define vlseg3e8ff_v_i8m2(...) __riscv_vlseg3e8ff_v_i8m2(__VA_ARGS__) +#define vlseg4e8ff_v_i8m2(...) __riscv_vlseg4e8ff_v_i8m2(__VA_ARGS__) +#define vlseg2e8ff_v_i8m4(...) __riscv_vlseg2e8ff_v_i8m4(__VA_ARGS__) +#define vlseg2e16ff_v_i16mf4(...) __riscv_vlseg2e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg3e16ff_v_i16mf4(...) __riscv_vlseg3e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg4e16ff_v_i16mf4(...) __riscv_vlseg4e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg5e16ff_v_i16mf4(...) __riscv_vlseg5e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg6e16ff_v_i16mf4(...) __riscv_vlseg6e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg7e16ff_v_i16mf4(...) __riscv_vlseg7e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg8e16ff_v_i16mf4(...) __riscv_vlseg8e16ff_v_i16mf4(__VA_ARGS__) +#define vlseg2e16ff_v_i16mf2(...) __riscv_vlseg2e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg3e16ff_v_i16mf2(...) __riscv_vlseg3e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg4e16ff_v_i16mf2(...) __riscv_vlseg4e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg5e16ff_v_i16mf2(...) __riscv_vlseg5e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg6e16ff_v_i16mf2(...) __riscv_vlseg6e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg7e16ff_v_i16mf2(...) __riscv_vlseg7e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg8e16ff_v_i16mf2(...) __riscv_vlseg8e16ff_v_i16mf2(__VA_ARGS__) +#define vlseg2e16ff_v_i16m1(...) __riscv_vlseg2e16ff_v_i16m1(__VA_ARGS__) +#define vlseg3e16ff_v_i16m1(...) __riscv_vlseg3e16ff_v_i16m1(__VA_ARGS__) +#define vlseg4e16ff_v_i16m1(...) __riscv_vlseg4e16ff_v_i16m1(__VA_ARGS__) +#define vlseg5e16ff_v_i16m1(...) __riscv_vlseg5e16ff_v_i16m1(__VA_ARGS__) +#define vlseg6e16ff_v_i16m1(...) __riscv_vlseg6e16ff_v_i16m1(__VA_ARGS__) +#define vlseg7e16ff_v_i16m1(...) __riscv_vlseg7e16ff_v_i16m1(__VA_ARGS__) +#define vlseg8e16ff_v_i16m1(...) __riscv_vlseg8e16ff_v_i16m1(__VA_ARGS__) +#define vlseg2e16ff_v_i16m2(...) __riscv_vlseg2e16ff_v_i16m2(__VA_ARGS__) +#define vlseg3e16ff_v_i16m2(...) __riscv_vlseg3e16ff_v_i16m2(__VA_ARGS__) +#define vlseg4e16ff_v_i16m2(...) __riscv_vlseg4e16ff_v_i16m2(__VA_ARGS__) +#define vlseg2e16ff_v_i16m4(...) __riscv_vlseg2e16ff_v_i16m4(__VA_ARGS__) +#define vlseg2e32ff_v_i32mf2(...) __riscv_vlseg2e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg3e32ff_v_i32mf2(...) __riscv_vlseg3e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg4e32ff_v_i32mf2(...) __riscv_vlseg4e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg5e32ff_v_i32mf2(...) __riscv_vlseg5e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg6e32ff_v_i32mf2(...) __riscv_vlseg6e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg7e32ff_v_i32mf2(...) __riscv_vlseg7e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg8e32ff_v_i32mf2(...) __riscv_vlseg8e32ff_v_i32mf2(__VA_ARGS__) +#define vlseg2e32ff_v_i32m1(...) __riscv_vlseg2e32ff_v_i32m1(__VA_ARGS__) +#define vlseg3e32ff_v_i32m1(...) __riscv_vlseg3e32ff_v_i32m1(__VA_ARGS__) +#define vlseg4e32ff_v_i32m1(...) __riscv_vlseg4e32ff_v_i32m1(__VA_ARGS__) +#define vlseg5e32ff_v_i32m1(...) __riscv_vlseg5e32ff_v_i32m1(__VA_ARGS__) +#define vlseg6e32ff_v_i32m1(...) __riscv_vlseg6e32ff_v_i32m1(__VA_ARGS__) +#define vlseg7e32ff_v_i32m1(...) __riscv_vlseg7e32ff_v_i32m1(__VA_ARGS__) +#define vlseg8e32ff_v_i32m1(...) __riscv_vlseg8e32ff_v_i32m1(__VA_ARGS__) +#define vlseg2e32ff_v_i32m2(...) __riscv_vlseg2e32ff_v_i32m2(__VA_ARGS__) +#define vlseg3e32ff_v_i32m2(...) __riscv_vlseg3e32ff_v_i32m2(__VA_ARGS__) +#define vlseg4e32ff_v_i32m2(...) __riscv_vlseg4e32ff_v_i32m2(__VA_ARGS__) +#define vlseg2e32ff_v_i32m4(...) __riscv_vlseg2e32ff_v_i32m4(__VA_ARGS__) +#define vlseg2e64ff_v_i64m1(...) __riscv_vlseg2e64ff_v_i64m1(__VA_ARGS__) +#define vlseg3e64ff_v_i64m1(...) __riscv_vlseg3e64ff_v_i64m1(__VA_ARGS__) +#define vlseg4e64ff_v_i64m1(...) __riscv_vlseg4e64ff_v_i64m1(__VA_ARGS__) +#define vlseg5e64ff_v_i64m1(...) __riscv_vlseg5e64ff_v_i64m1(__VA_ARGS__) +#define vlseg6e64ff_v_i64m1(...) __riscv_vlseg6e64ff_v_i64m1(__VA_ARGS__) +#define vlseg7e64ff_v_i64m1(...) __riscv_vlseg7e64ff_v_i64m1(__VA_ARGS__) +#define vlseg8e64ff_v_i64m1(...) __riscv_vlseg8e64ff_v_i64m1(__VA_ARGS__) +#define vlseg2e64ff_v_i64m2(...) __riscv_vlseg2e64ff_v_i64m2(__VA_ARGS__) +#define vlseg3e64ff_v_i64m2(...) __riscv_vlseg3e64ff_v_i64m2(__VA_ARGS__) +#define vlseg4e64ff_v_i64m2(...) __riscv_vlseg4e64ff_v_i64m2(__VA_ARGS__) +#define vlseg2e64ff_v_i64m4(...) __riscv_vlseg2e64ff_v_i64m4(__VA_ARGS__) +#define vlseg2e8_v_u8mf8(...) __riscv_vlseg2e8_v_u8mf8(__VA_ARGS__) +#define vlseg3e8_v_u8mf8(...) __riscv_vlseg3e8_v_u8mf8(__VA_ARGS__) +#define vlseg4e8_v_u8mf8(...) __riscv_vlseg4e8_v_u8mf8(__VA_ARGS__) +#define vlseg5e8_v_u8mf8(...) __riscv_vlseg5e8_v_u8mf8(__VA_ARGS__) +#define vlseg6e8_v_u8mf8(...) __riscv_vlseg6e8_v_u8mf8(__VA_ARGS__) +#define vlseg7e8_v_u8mf8(...) __riscv_vlseg7e8_v_u8mf8(__VA_ARGS__) +#define vlseg8e8_v_u8mf8(...) __riscv_vlseg8e8_v_u8mf8(__VA_ARGS__) +#define vlseg2e8_v_u8mf4(...) __riscv_vlseg2e8_v_u8mf4(__VA_ARGS__) +#define vlseg3e8_v_u8mf4(...) __riscv_vlseg3e8_v_u8mf4(__VA_ARGS__) +#define vlseg4e8_v_u8mf4(...) __riscv_vlseg4e8_v_u8mf4(__VA_ARGS__) +#define vlseg5e8_v_u8mf4(...) __riscv_vlseg5e8_v_u8mf4(__VA_ARGS__) +#define vlseg6e8_v_u8mf4(...) __riscv_vlseg6e8_v_u8mf4(__VA_ARGS__) +#define vlseg7e8_v_u8mf4(...) __riscv_vlseg7e8_v_u8mf4(__VA_ARGS__) +#define vlseg8e8_v_u8mf4(...) __riscv_vlseg8e8_v_u8mf4(__VA_ARGS__) +#define vlseg2e8_v_u8mf2(...) __riscv_vlseg2e8_v_u8mf2(__VA_ARGS__) +#define vlseg3e8_v_u8mf2(...) __riscv_vlseg3e8_v_u8mf2(__VA_ARGS__) +#define vlseg4e8_v_u8mf2(...) __riscv_vlseg4e8_v_u8mf2(__VA_ARGS__) +#define vlseg5e8_v_u8mf2(...) __riscv_vlseg5e8_v_u8mf2(__VA_ARGS__) +#define vlseg6e8_v_u8mf2(...) __riscv_vlseg6e8_v_u8mf2(__VA_ARGS__) +#define vlseg7e8_v_u8mf2(...) __riscv_vlseg7e8_v_u8mf2(__VA_ARGS__) +#define vlseg8e8_v_u8mf2(...) __riscv_vlseg8e8_v_u8mf2(__VA_ARGS__) +#define vlseg2e8_v_u8m1(...) __riscv_vlseg2e8_v_u8m1(__VA_ARGS__) +#define vlseg3e8_v_u8m1(...) __riscv_vlseg3e8_v_u8m1(__VA_ARGS__) +#define vlseg4e8_v_u8m1(...) __riscv_vlseg4e8_v_u8m1(__VA_ARGS__) +#define vlseg5e8_v_u8m1(...) __riscv_vlseg5e8_v_u8m1(__VA_ARGS__) +#define vlseg6e8_v_u8m1(...) __riscv_vlseg6e8_v_u8m1(__VA_ARGS__) +#define vlseg7e8_v_u8m1(...) __riscv_vlseg7e8_v_u8m1(__VA_ARGS__) +#define vlseg8e8_v_u8m1(...) __riscv_vlseg8e8_v_u8m1(__VA_ARGS__) +#define vlseg2e8_v_u8m2(...) __riscv_vlseg2e8_v_u8m2(__VA_ARGS__) +#define vlseg3e8_v_u8m2(...) __riscv_vlseg3e8_v_u8m2(__VA_ARGS__) +#define vlseg4e8_v_u8m2(...) __riscv_vlseg4e8_v_u8m2(__VA_ARGS__) +#define vlseg2e8_v_u8m4(...) __riscv_vlseg2e8_v_u8m4(__VA_ARGS__) +#define vlseg2e16_v_u16mf4(...) __riscv_vlseg2e16_v_u16mf4(__VA_ARGS__) +#define vlseg3e16_v_u16mf4(...) __riscv_vlseg3e16_v_u16mf4(__VA_ARGS__) +#define vlseg4e16_v_u16mf4(...) __riscv_vlseg4e16_v_u16mf4(__VA_ARGS__) +#define vlseg5e16_v_u16mf4(...) __riscv_vlseg5e16_v_u16mf4(__VA_ARGS__) +#define vlseg6e16_v_u16mf4(...) __riscv_vlseg6e16_v_u16mf4(__VA_ARGS__) +#define vlseg7e16_v_u16mf4(...) __riscv_vlseg7e16_v_u16mf4(__VA_ARGS__) +#define vlseg8e16_v_u16mf4(...) __riscv_vlseg8e16_v_u16mf4(__VA_ARGS__) +#define vlseg2e16_v_u16mf2(...) __riscv_vlseg2e16_v_u16mf2(__VA_ARGS__) +#define vlseg3e16_v_u16mf2(...) __riscv_vlseg3e16_v_u16mf2(__VA_ARGS__) +#define vlseg4e16_v_u16mf2(...) __riscv_vlseg4e16_v_u16mf2(__VA_ARGS__) +#define vlseg5e16_v_u16mf2(...) __riscv_vlseg5e16_v_u16mf2(__VA_ARGS__) +#define vlseg6e16_v_u16mf2(...) __riscv_vlseg6e16_v_u16mf2(__VA_ARGS__) +#define vlseg7e16_v_u16mf2(...) __riscv_vlseg7e16_v_u16mf2(__VA_ARGS__) +#define vlseg8e16_v_u16mf2(...) __riscv_vlseg8e16_v_u16mf2(__VA_ARGS__) +#define vlseg2e16_v_u16m1(...) __riscv_vlseg2e16_v_u16m1(__VA_ARGS__) +#define vlseg3e16_v_u16m1(...) __riscv_vlseg3e16_v_u16m1(__VA_ARGS__) +#define vlseg4e16_v_u16m1(...) __riscv_vlseg4e16_v_u16m1(__VA_ARGS__) +#define vlseg5e16_v_u16m1(...) __riscv_vlseg5e16_v_u16m1(__VA_ARGS__) +#define vlseg6e16_v_u16m1(...) __riscv_vlseg6e16_v_u16m1(__VA_ARGS__) +#define vlseg7e16_v_u16m1(...) __riscv_vlseg7e16_v_u16m1(__VA_ARGS__) +#define vlseg8e16_v_u16m1(...) __riscv_vlseg8e16_v_u16m1(__VA_ARGS__) +#define vlseg2e16_v_u16m2(...) __riscv_vlseg2e16_v_u16m2(__VA_ARGS__) +#define vlseg3e16_v_u16m2(...) __riscv_vlseg3e16_v_u16m2(__VA_ARGS__) +#define vlseg4e16_v_u16m2(...) __riscv_vlseg4e16_v_u16m2(__VA_ARGS__) +#define vlseg2e16_v_u16m4(...) __riscv_vlseg2e16_v_u16m4(__VA_ARGS__) +#define vlseg2e32_v_u32mf2(...) __riscv_vlseg2e32_v_u32mf2(__VA_ARGS__) +#define vlseg3e32_v_u32mf2(...) __riscv_vlseg3e32_v_u32mf2(__VA_ARGS__) +#define vlseg4e32_v_u32mf2(...) __riscv_vlseg4e32_v_u32mf2(__VA_ARGS__) +#define vlseg5e32_v_u32mf2(...) __riscv_vlseg5e32_v_u32mf2(__VA_ARGS__) +#define vlseg6e32_v_u32mf2(...) __riscv_vlseg6e32_v_u32mf2(__VA_ARGS__) +#define vlseg7e32_v_u32mf2(...) __riscv_vlseg7e32_v_u32mf2(__VA_ARGS__) +#define vlseg8e32_v_u32mf2(...) __riscv_vlseg8e32_v_u32mf2(__VA_ARGS__) +#define vlseg2e32_v_u32m1(...) __riscv_vlseg2e32_v_u32m1(__VA_ARGS__) +#define vlseg3e32_v_u32m1(...) __riscv_vlseg3e32_v_u32m1(__VA_ARGS__) +#define vlseg4e32_v_u32m1(...) __riscv_vlseg4e32_v_u32m1(__VA_ARGS__) +#define vlseg5e32_v_u32m1(...) __riscv_vlseg5e32_v_u32m1(__VA_ARGS__) +#define vlseg6e32_v_u32m1(...) __riscv_vlseg6e32_v_u32m1(__VA_ARGS__) +#define vlseg7e32_v_u32m1(...) __riscv_vlseg7e32_v_u32m1(__VA_ARGS__) +#define vlseg8e32_v_u32m1(...) __riscv_vlseg8e32_v_u32m1(__VA_ARGS__) +#define vlseg2e32_v_u32m2(...) __riscv_vlseg2e32_v_u32m2(__VA_ARGS__) +#define vlseg3e32_v_u32m2(...) __riscv_vlseg3e32_v_u32m2(__VA_ARGS__) +#define vlseg4e32_v_u32m2(...) __riscv_vlseg4e32_v_u32m2(__VA_ARGS__) +#define vlseg2e32_v_u32m4(...) __riscv_vlseg2e32_v_u32m4(__VA_ARGS__) +#define vlseg2e64_v_u64m1(...) __riscv_vlseg2e64_v_u64m1(__VA_ARGS__) +#define vlseg3e64_v_u64m1(...) __riscv_vlseg3e64_v_u64m1(__VA_ARGS__) +#define vlseg4e64_v_u64m1(...) __riscv_vlseg4e64_v_u64m1(__VA_ARGS__) +#define vlseg5e64_v_u64m1(...) __riscv_vlseg5e64_v_u64m1(__VA_ARGS__) +#define vlseg6e64_v_u64m1(...) __riscv_vlseg6e64_v_u64m1(__VA_ARGS__) +#define vlseg7e64_v_u64m1(...) __riscv_vlseg7e64_v_u64m1(__VA_ARGS__) +#define vlseg8e64_v_u64m1(...) __riscv_vlseg8e64_v_u64m1(__VA_ARGS__) +#define vlseg2e64_v_u64m2(...) __riscv_vlseg2e64_v_u64m2(__VA_ARGS__) +#define vlseg3e64_v_u64m2(...) __riscv_vlseg3e64_v_u64m2(__VA_ARGS__) +#define vlseg4e64_v_u64m2(...) __riscv_vlseg4e64_v_u64m2(__VA_ARGS__) +#define vlseg2e64_v_u64m4(...) __riscv_vlseg2e64_v_u64m4(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf8(...) __riscv_vlseg2e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf8(...) __riscv_vlseg3e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf8(...) __riscv_vlseg4e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf8(...) __riscv_vlseg5e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf8(...) __riscv_vlseg6e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf8(...) __riscv_vlseg7e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf8(...) __riscv_vlseg8e8ff_v_u8mf8(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf4(...) __riscv_vlseg2e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf4(...) __riscv_vlseg3e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf4(...) __riscv_vlseg4e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf4(...) __riscv_vlseg5e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf4(...) __riscv_vlseg6e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf4(...) __riscv_vlseg7e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf4(...) __riscv_vlseg8e8ff_v_u8mf4(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf2(...) __riscv_vlseg2e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf2(...) __riscv_vlseg3e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf2(...) __riscv_vlseg4e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf2(...) __riscv_vlseg5e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf2(...) __riscv_vlseg6e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf2(...) __riscv_vlseg7e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf2(...) __riscv_vlseg8e8ff_v_u8mf2(__VA_ARGS__) +#define vlseg2e8ff_v_u8m1(...) __riscv_vlseg2e8ff_v_u8m1(__VA_ARGS__) +#define vlseg3e8ff_v_u8m1(...) __riscv_vlseg3e8ff_v_u8m1(__VA_ARGS__) +#define vlseg4e8ff_v_u8m1(...) __riscv_vlseg4e8ff_v_u8m1(__VA_ARGS__) +#define vlseg5e8ff_v_u8m1(...) __riscv_vlseg5e8ff_v_u8m1(__VA_ARGS__) +#define vlseg6e8ff_v_u8m1(...) __riscv_vlseg6e8ff_v_u8m1(__VA_ARGS__) +#define vlseg7e8ff_v_u8m1(...) __riscv_vlseg7e8ff_v_u8m1(__VA_ARGS__) +#define vlseg8e8ff_v_u8m1(...) __riscv_vlseg8e8ff_v_u8m1(__VA_ARGS__) +#define vlseg2e8ff_v_u8m2(...) __riscv_vlseg2e8ff_v_u8m2(__VA_ARGS__) +#define vlseg3e8ff_v_u8m2(...) __riscv_vlseg3e8ff_v_u8m2(__VA_ARGS__) +#define vlseg4e8ff_v_u8m2(...) __riscv_vlseg4e8ff_v_u8m2(__VA_ARGS__) +#define vlseg2e8ff_v_u8m4(...) __riscv_vlseg2e8ff_v_u8m4(__VA_ARGS__) +#define vlseg2e16ff_v_u16mf4(...) __riscv_vlseg2e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg3e16ff_v_u16mf4(...) __riscv_vlseg3e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg4e16ff_v_u16mf4(...) __riscv_vlseg4e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg5e16ff_v_u16mf4(...) __riscv_vlseg5e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg6e16ff_v_u16mf4(...) __riscv_vlseg6e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg7e16ff_v_u16mf4(...) __riscv_vlseg7e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg8e16ff_v_u16mf4(...) __riscv_vlseg8e16ff_v_u16mf4(__VA_ARGS__) +#define vlseg2e16ff_v_u16mf2(...) __riscv_vlseg2e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg3e16ff_v_u16mf2(...) __riscv_vlseg3e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg4e16ff_v_u16mf2(...) __riscv_vlseg4e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg5e16ff_v_u16mf2(...) __riscv_vlseg5e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg6e16ff_v_u16mf2(...) __riscv_vlseg6e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg7e16ff_v_u16mf2(...) __riscv_vlseg7e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg8e16ff_v_u16mf2(...) __riscv_vlseg8e16ff_v_u16mf2(__VA_ARGS__) +#define vlseg2e16ff_v_u16m1(...) __riscv_vlseg2e16ff_v_u16m1(__VA_ARGS__) +#define vlseg3e16ff_v_u16m1(...) __riscv_vlseg3e16ff_v_u16m1(__VA_ARGS__) +#define vlseg4e16ff_v_u16m1(...) __riscv_vlseg4e16ff_v_u16m1(__VA_ARGS__) +#define vlseg5e16ff_v_u16m1(...) __riscv_vlseg5e16ff_v_u16m1(__VA_ARGS__) +#define vlseg6e16ff_v_u16m1(...) __riscv_vlseg6e16ff_v_u16m1(__VA_ARGS__) +#define vlseg7e16ff_v_u16m1(...) __riscv_vlseg7e16ff_v_u16m1(__VA_ARGS__) +#define vlseg8e16ff_v_u16m1(...) __riscv_vlseg8e16ff_v_u16m1(__VA_ARGS__) +#define vlseg2e16ff_v_u16m2(...) __riscv_vlseg2e16ff_v_u16m2(__VA_ARGS__) +#define vlseg3e16ff_v_u16m2(...) __riscv_vlseg3e16ff_v_u16m2(__VA_ARGS__) +#define vlseg4e16ff_v_u16m2(...) __riscv_vlseg4e16ff_v_u16m2(__VA_ARGS__) +#define vlseg2e16ff_v_u16m4(...) __riscv_vlseg2e16ff_v_u16m4(__VA_ARGS__) +#define vlseg2e32ff_v_u32mf2(...) __riscv_vlseg2e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg3e32ff_v_u32mf2(...) __riscv_vlseg3e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg4e32ff_v_u32mf2(...) __riscv_vlseg4e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg5e32ff_v_u32mf2(...) __riscv_vlseg5e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg6e32ff_v_u32mf2(...) __riscv_vlseg6e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg7e32ff_v_u32mf2(...) __riscv_vlseg7e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg8e32ff_v_u32mf2(...) __riscv_vlseg8e32ff_v_u32mf2(__VA_ARGS__) +#define vlseg2e32ff_v_u32m1(...) __riscv_vlseg2e32ff_v_u32m1(__VA_ARGS__) +#define vlseg3e32ff_v_u32m1(...) __riscv_vlseg3e32ff_v_u32m1(__VA_ARGS__) +#define vlseg4e32ff_v_u32m1(...) __riscv_vlseg4e32ff_v_u32m1(__VA_ARGS__) +#define vlseg5e32ff_v_u32m1(...) __riscv_vlseg5e32ff_v_u32m1(__VA_ARGS__) +#define vlseg6e32ff_v_u32m1(...) __riscv_vlseg6e32ff_v_u32m1(__VA_ARGS__) +#define vlseg7e32ff_v_u32m1(...) __riscv_vlseg7e32ff_v_u32m1(__VA_ARGS__) +#define vlseg8e32ff_v_u32m1(...) __riscv_vlseg8e32ff_v_u32m1(__VA_ARGS__) +#define vlseg2e32ff_v_u32m2(...) __riscv_vlseg2e32ff_v_u32m2(__VA_ARGS__) +#define vlseg3e32ff_v_u32m2(...) __riscv_vlseg3e32ff_v_u32m2(__VA_ARGS__) +#define vlseg4e32ff_v_u32m2(...) __riscv_vlseg4e32ff_v_u32m2(__VA_ARGS__) +#define vlseg2e32ff_v_u32m4(...) __riscv_vlseg2e32ff_v_u32m4(__VA_ARGS__) +#define vlseg2e64ff_v_u64m1(...) __riscv_vlseg2e64ff_v_u64m1(__VA_ARGS__) +#define vlseg3e64ff_v_u64m1(...) __riscv_vlseg3e64ff_v_u64m1(__VA_ARGS__) +#define vlseg4e64ff_v_u64m1(...) __riscv_vlseg4e64ff_v_u64m1(__VA_ARGS__) +#define vlseg5e64ff_v_u64m1(...) __riscv_vlseg5e64ff_v_u64m1(__VA_ARGS__) +#define vlseg6e64ff_v_u64m1(...) __riscv_vlseg6e64ff_v_u64m1(__VA_ARGS__) +#define vlseg7e64ff_v_u64m1(...) __riscv_vlseg7e64ff_v_u64m1(__VA_ARGS__) +#define vlseg8e64ff_v_u64m1(...) __riscv_vlseg8e64ff_v_u64m1(__VA_ARGS__) +#define vlseg2e64ff_v_u64m2(...) __riscv_vlseg2e64ff_v_u64m2(__VA_ARGS__) +#define vlseg3e64ff_v_u64m2(...) __riscv_vlseg3e64ff_v_u64m2(__VA_ARGS__) +#define vlseg4e64ff_v_u64m2(...) __riscv_vlseg4e64ff_v_u64m2(__VA_ARGS__) +#define vlseg2e64ff_v_u64m4(...) __riscv_vlseg2e64ff_v_u64m4(__VA_ARGS__) +// masked functions +#define vlseg2e16_v_f16mf4_m(...) __riscv_vlseg2e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg3e16_v_f16mf4_m(...) __riscv_vlseg3e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg4e16_v_f16mf4_m(...) __riscv_vlseg4e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg5e16_v_f16mf4_m(...) __riscv_vlseg5e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg6e16_v_f16mf4_m(...) __riscv_vlseg6e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg7e16_v_f16mf4_m(...) __riscv_vlseg7e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg8e16_v_f16mf4_m(...) __riscv_vlseg8e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg2e16_v_f16mf2_m(...) __riscv_vlseg2e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg3e16_v_f16mf2_m(...) __riscv_vlseg3e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg4e16_v_f16mf2_m(...) __riscv_vlseg4e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg5e16_v_f16mf2_m(...) __riscv_vlseg5e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg6e16_v_f16mf2_m(...) __riscv_vlseg6e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg7e16_v_f16mf2_m(...) __riscv_vlseg7e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg8e16_v_f16mf2_m(...) __riscv_vlseg8e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg2e16_v_f16m1_m(...) __riscv_vlseg2e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg3e16_v_f16m1_m(...) __riscv_vlseg3e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg4e16_v_f16m1_m(...) __riscv_vlseg4e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg5e16_v_f16m1_m(...) __riscv_vlseg5e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg6e16_v_f16m1_m(...) __riscv_vlseg6e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg7e16_v_f16m1_m(...) __riscv_vlseg7e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg8e16_v_f16m1_m(...) __riscv_vlseg8e16_v_f16m1_tumu(__VA_ARGS__) +#define vlseg2e16_v_f16m2_m(...) __riscv_vlseg2e16_v_f16m2_tumu(__VA_ARGS__) +#define vlseg3e16_v_f16m2_m(...) __riscv_vlseg3e16_v_f16m2_tumu(__VA_ARGS__) +#define vlseg4e16_v_f16m2_m(...) __riscv_vlseg4e16_v_f16m2_tumu(__VA_ARGS__) +#define vlseg2e16_v_f16m4_m(...) __riscv_vlseg2e16_v_f16m4_tumu(__VA_ARGS__) +#define vlseg2e32_v_f32mf2_m(...) __riscv_vlseg2e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg3e32_v_f32mf2_m(...) __riscv_vlseg3e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg4e32_v_f32mf2_m(...) __riscv_vlseg4e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg5e32_v_f32mf2_m(...) __riscv_vlseg5e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg6e32_v_f32mf2_m(...) __riscv_vlseg6e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg7e32_v_f32mf2_m(...) __riscv_vlseg7e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg8e32_v_f32mf2_m(...) __riscv_vlseg8e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg2e32_v_f32m1_m(...) __riscv_vlseg2e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg3e32_v_f32m1_m(...) __riscv_vlseg3e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg4e32_v_f32m1_m(...) __riscv_vlseg4e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg5e32_v_f32m1_m(...) __riscv_vlseg5e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg6e32_v_f32m1_m(...) __riscv_vlseg6e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg7e32_v_f32m1_m(...) __riscv_vlseg7e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg8e32_v_f32m1_m(...) __riscv_vlseg8e32_v_f32m1_tumu(__VA_ARGS__) +#define vlseg2e32_v_f32m2_m(...) __riscv_vlseg2e32_v_f32m2_tumu(__VA_ARGS__) +#define vlseg3e32_v_f32m2_m(...) __riscv_vlseg3e32_v_f32m2_tumu(__VA_ARGS__) +#define vlseg4e32_v_f32m2_m(...) __riscv_vlseg4e32_v_f32m2_tumu(__VA_ARGS__) +#define vlseg2e32_v_f32m4_m(...) __riscv_vlseg2e32_v_f32m4_tumu(__VA_ARGS__) +#define vlseg2e64_v_f64m1_m(...) __riscv_vlseg2e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg3e64_v_f64m1_m(...) __riscv_vlseg3e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg4e64_v_f64m1_m(...) __riscv_vlseg4e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg5e64_v_f64m1_m(...) __riscv_vlseg5e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg6e64_v_f64m1_m(...) __riscv_vlseg6e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg7e64_v_f64m1_m(...) __riscv_vlseg7e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg8e64_v_f64m1_m(...) __riscv_vlseg8e64_v_f64m1_tumu(__VA_ARGS__) +#define vlseg2e64_v_f64m2_m(...) __riscv_vlseg2e64_v_f64m2_tumu(__VA_ARGS__) +#define vlseg3e64_v_f64m2_m(...) __riscv_vlseg3e64_v_f64m2_tumu(__VA_ARGS__) +#define vlseg4e64_v_f64m2_m(...) __riscv_vlseg4e64_v_f64m2_tumu(__VA_ARGS__) +#define vlseg2e64_v_f64m4_m(...) __riscv_vlseg2e64_v_f64m4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_f16mf4_m(...) __riscv_vlseg2e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_f16mf4_m(...) __riscv_vlseg3e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_f16mf4_m(...) __riscv_vlseg4e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_f16mf4_m(...) __riscv_vlseg5e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_f16mf4_m(...) __riscv_vlseg6e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_f16mf4_m(...) __riscv_vlseg7e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_f16mf4_m(...) __riscv_vlseg8e16ff_v_f16mf4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_f16mf2_m(...) __riscv_vlseg2e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_f16mf2_m(...) __riscv_vlseg3e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_f16mf2_m(...) __riscv_vlseg4e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_f16mf2_m(...) __riscv_vlseg5e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_f16mf2_m(...) __riscv_vlseg6e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_f16mf2_m(...) __riscv_vlseg7e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_f16mf2_m(...) __riscv_vlseg8e16ff_v_f16mf2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_f16m1_m(...) __riscv_vlseg2e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_f16m1_m(...) __riscv_vlseg3e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_f16m1_m(...) __riscv_vlseg4e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_f16m1_m(...) __riscv_vlseg5e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_f16m1_m(...) __riscv_vlseg6e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_f16m1_m(...) __riscv_vlseg7e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_f16m1_m(...) __riscv_vlseg8e16ff_v_f16m1_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_f16m2_m(...) __riscv_vlseg2e16ff_v_f16m2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_f16m2_m(...) __riscv_vlseg3e16ff_v_f16m2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_f16m2_m(...) __riscv_vlseg4e16ff_v_f16m2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_f16m4_m(...) __riscv_vlseg2e16ff_v_f16m4_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_f32mf2_m(...) __riscv_vlseg2e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_f32mf2_m(...) __riscv_vlseg3e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_f32mf2_m(...) __riscv_vlseg4e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_f32mf2_m(...) __riscv_vlseg5e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_f32mf2_m(...) __riscv_vlseg6e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_f32mf2_m(...) __riscv_vlseg7e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_f32mf2_m(...) __riscv_vlseg8e32ff_v_f32mf2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_f32m1_m(...) __riscv_vlseg2e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_f32m1_m(...) __riscv_vlseg3e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_f32m1_m(...) __riscv_vlseg4e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_f32m1_m(...) __riscv_vlseg5e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_f32m1_m(...) __riscv_vlseg6e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_f32m1_m(...) __riscv_vlseg7e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_f32m1_m(...) __riscv_vlseg8e32ff_v_f32m1_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_f32m2_m(...) __riscv_vlseg2e32ff_v_f32m2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_f32m2_m(...) __riscv_vlseg3e32ff_v_f32m2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_f32m2_m(...) __riscv_vlseg4e32ff_v_f32m2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_f32m4_m(...) __riscv_vlseg2e32ff_v_f32m4_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_f64m1_m(...) __riscv_vlseg2e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_f64m1_m(...) __riscv_vlseg3e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_f64m1_m(...) __riscv_vlseg4e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg5e64ff_v_f64m1_m(...) __riscv_vlseg5e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg6e64ff_v_f64m1_m(...) __riscv_vlseg6e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg7e64ff_v_f64m1_m(...) __riscv_vlseg7e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg8e64ff_v_f64m1_m(...) __riscv_vlseg8e64ff_v_f64m1_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_f64m2_m(...) __riscv_vlseg2e64ff_v_f64m2_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_f64m2_m(...) __riscv_vlseg3e64ff_v_f64m2_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_f64m2_m(...) __riscv_vlseg4e64ff_v_f64m2_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_f64m4_m(...) __riscv_vlseg2e64ff_v_f64m4_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8mf8_m(...) __riscv_vlseg2e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg3e8_v_i8mf8_m(...) __riscv_vlseg3e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg4e8_v_i8mf8_m(...) __riscv_vlseg4e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg5e8_v_i8mf8_m(...) __riscv_vlseg5e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg6e8_v_i8mf8_m(...) __riscv_vlseg6e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg7e8_v_i8mf8_m(...) __riscv_vlseg7e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg8e8_v_i8mf8_m(...) __riscv_vlseg8e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8mf4_m(...) __riscv_vlseg2e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg3e8_v_i8mf4_m(...) __riscv_vlseg3e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg4e8_v_i8mf4_m(...) __riscv_vlseg4e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg5e8_v_i8mf4_m(...) __riscv_vlseg5e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg6e8_v_i8mf4_m(...) __riscv_vlseg6e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg7e8_v_i8mf4_m(...) __riscv_vlseg7e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg8e8_v_i8mf4_m(...) __riscv_vlseg8e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8mf2_m(...) __riscv_vlseg2e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg3e8_v_i8mf2_m(...) __riscv_vlseg3e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg4e8_v_i8mf2_m(...) __riscv_vlseg4e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg5e8_v_i8mf2_m(...) __riscv_vlseg5e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg6e8_v_i8mf2_m(...) __riscv_vlseg6e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg7e8_v_i8mf2_m(...) __riscv_vlseg7e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg8e8_v_i8mf2_m(...) __riscv_vlseg8e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8m1_m(...) __riscv_vlseg2e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg3e8_v_i8m1_m(...) __riscv_vlseg3e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg4e8_v_i8m1_m(...) __riscv_vlseg4e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg5e8_v_i8m1_m(...) __riscv_vlseg5e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg6e8_v_i8m1_m(...) __riscv_vlseg6e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg7e8_v_i8m1_m(...) __riscv_vlseg7e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg8e8_v_i8m1_m(...) __riscv_vlseg8e8_v_i8m1_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8m2_m(...) __riscv_vlseg2e8_v_i8m2_tumu(__VA_ARGS__) +#define vlseg3e8_v_i8m2_m(...) __riscv_vlseg3e8_v_i8m2_tumu(__VA_ARGS__) +#define vlseg4e8_v_i8m2_m(...) __riscv_vlseg4e8_v_i8m2_tumu(__VA_ARGS__) +#define vlseg2e8_v_i8m4_m(...) __riscv_vlseg2e8_v_i8m4_tumu(__VA_ARGS__) +#define vlseg2e16_v_i16mf4_m(...) __riscv_vlseg2e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg3e16_v_i16mf4_m(...) __riscv_vlseg3e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg4e16_v_i16mf4_m(...) __riscv_vlseg4e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg5e16_v_i16mf4_m(...) __riscv_vlseg5e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg6e16_v_i16mf4_m(...) __riscv_vlseg6e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg7e16_v_i16mf4_m(...) __riscv_vlseg7e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg8e16_v_i16mf4_m(...) __riscv_vlseg8e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg2e16_v_i16mf2_m(...) __riscv_vlseg2e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg3e16_v_i16mf2_m(...) __riscv_vlseg3e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg4e16_v_i16mf2_m(...) __riscv_vlseg4e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg5e16_v_i16mf2_m(...) __riscv_vlseg5e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg6e16_v_i16mf2_m(...) __riscv_vlseg6e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg7e16_v_i16mf2_m(...) __riscv_vlseg7e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg8e16_v_i16mf2_m(...) __riscv_vlseg8e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg2e16_v_i16m1_m(...) __riscv_vlseg2e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg3e16_v_i16m1_m(...) __riscv_vlseg3e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg4e16_v_i16m1_m(...) __riscv_vlseg4e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg5e16_v_i16m1_m(...) __riscv_vlseg5e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg6e16_v_i16m1_m(...) __riscv_vlseg6e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg7e16_v_i16m1_m(...) __riscv_vlseg7e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg8e16_v_i16m1_m(...) __riscv_vlseg8e16_v_i16m1_tumu(__VA_ARGS__) +#define vlseg2e16_v_i16m2_m(...) __riscv_vlseg2e16_v_i16m2_tumu(__VA_ARGS__) +#define vlseg3e16_v_i16m2_m(...) __riscv_vlseg3e16_v_i16m2_tumu(__VA_ARGS__) +#define vlseg4e16_v_i16m2_m(...) __riscv_vlseg4e16_v_i16m2_tumu(__VA_ARGS__) +#define vlseg2e16_v_i16m4_m(...) __riscv_vlseg2e16_v_i16m4_tumu(__VA_ARGS__) +#define vlseg2e32_v_i32mf2_m(...) __riscv_vlseg2e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg3e32_v_i32mf2_m(...) __riscv_vlseg3e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg4e32_v_i32mf2_m(...) __riscv_vlseg4e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg5e32_v_i32mf2_m(...) __riscv_vlseg5e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg6e32_v_i32mf2_m(...) __riscv_vlseg6e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg7e32_v_i32mf2_m(...) __riscv_vlseg7e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg8e32_v_i32mf2_m(...) __riscv_vlseg8e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg2e32_v_i32m1_m(...) __riscv_vlseg2e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg3e32_v_i32m1_m(...) __riscv_vlseg3e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg4e32_v_i32m1_m(...) __riscv_vlseg4e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg5e32_v_i32m1_m(...) __riscv_vlseg5e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg6e32_v_i32m1_m(...) __riscv_vlseg6e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg7e32_v_i32m1_m(...) __riscv_vlseg7e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg8e32_v_i32m1_m(...) __riscv_vlseg8e32_v_i32m1_tumu(__VA_ARGS__) +#define vlseg2e32_v_i32m2_m(...) __riscv_vlseg2e32_v_i32m2_tumu(__VA_ARGS__) +#define vlseg3e32_v_i32m2_m(...) __riscv_vlseg3e32_v_i32m2_tumu(__VA_ARGS__) +#define vlseg4e32_v_i32m2_m(...) __riscv_vlseg4e32_v_i32m2_tumu(__VA_ARGS__) +#define vlseg2e32_v_i32m4_m(...) __riscv_vlseg2e32_v_i32m4_tumu(__VA_ARGS__) +#define vlseg2e64_v_i64m1_m(...) __riscv_vlseg2e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg3e64_v_i64m1_m(...) __riscv_vlseg3e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg4e64_v_i64m1_m(...) __riscv_vlseg4e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg5e64_v_i64m1_m(...) __riscv_vlseg5e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg6e64_v_i64m1_m(...) __riscv_vlseg6e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg7e64_v_i64m1_m(...) __riscv_vlseg7e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg8e64_v_i64m1_m(...) __riscv_vlseg8e64_v_i64m1_tumu(__VA_ARGS__) +#define vlseg2e64_v_i64m2_m(...) __riscv_vlseg2e64_v_i64m2_tumu(__VA_ARGS__) +#define vlseg3e64_v_i64m2_m(...) __riscv_vlseg3e64_v_i64m2_tumu(__VA_ARGS__) +#define vlseg4e64_v_i64m2_m(...) __riscv_vlseg4e64_v_i64m2_tumu(__VA_ARGS__) +#define vlseg2e64_v_i64m4_m(...) __riscv_vlseg2e64_v_i64m4_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf8_m(...) __riscv_vlseg2e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf8_m(...) __riscv_vlseg3e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf8_m(...) __riscv_vlseg4e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf8_m(...) __riscv_vlseg5e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf8_m(...) __riscv_vlseg6e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf8_m(...) __riscv_vlseg7e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf8_m(...) __riscv_vlseg8e8ff_v_i8mf8_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf4_m(...) __riscv_vlseg2e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf4_m(...) __riscv_vlseg3e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf4_m(...) __riscv_vlseg4e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf4_m(...) __riscv_vlseg5e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf4_m(...) __riscv_vlseg6e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf4_m(...) __riscv_vlseg7e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf4_m(...) __riscv_vlseg8e8ff_v_i8mf4_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8mf2_m(...) __riscv_vlseg2e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_i8mf2_m(...) __riscv_vlseg3e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_i8mf2_m(...) __riscv_vlseg4e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_i8mf2_m(...) __riscv_vlseg5e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_i8mf2_m(...) __riscv_vlseg6e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_i8mf2_m(...) __riscv_vlseg7e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_i8mf2_m(...) __riscv_vlseg8e8ff_v_i8mf2_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8m1_m(...) __riscv_vlseg2e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_i8m1_m(...) __riscv_vlseg3e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_i8m1_m(...) __riscv_vlseg4e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_i8m1_m(...) __riscv_vlseg5e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_i8m1_m(...) __riscv_vlseg6e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_i8m1_m(...) __riscv_vlseg7e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_i8m1_m(...) __riscv_vlseg8e8ff_v_i8m1_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8m2_m(...) __riscv_vlseg2e8ff_v_i8m2_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_i8m2_m(...) __riscv_vlseg3e8ff_v_i8m2_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_i8m2_m(...) __riscv_vlseg4e8ff_v_i8m2_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_i8m4_m(...) __riscv_vlseg2e8ff_v_i8m4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_i16mf4_m(...) __riscv_vlseg2e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_i16mf4_m(...) __riscv_vlseg3e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_i16mf4_m(...) __riscv_vlseg4e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_i16mf4_m(...) __riscv_vlseg5e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_i16mf4_m(...) __riscv_vlseg6e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_i16mf4_m(...) __riscv_vlseg7e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_i16mf4_m(...) __riscv_vlseg8e16ff_v_i16mf4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_i16mf2_m(...) __riscv_vlseg2e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_i16mf2_m(...) __riscv_vlseg3e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_i16mf2_m(...) __riscv_vlseg4e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_i16mf2_m(...) __riscv_vlseg5e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_i16mf2_m(...) __riscv_vlseg6e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_i16mf2_m(...) __riscv_vlseg7e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_i16mf2_m(...) __riscv_vlseg8e16ff_v_i16mf2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_i16m1_m(...) __riscv_vlseg2e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_i16m1_m(...) __riscv_vlseg3e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_i16m1_m(...) __riscv_vlseg4e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_i16m1_m(...) __riscv_vlseg5e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_i16m1_m(...) __riscv_vlseg6e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_i16m1_m(...) __riscv_vlseg7e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_i16m1_m(...) __riscv_vlseg8e16ff_v_i16m1_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_i16m2_m(...) __riscv_vlseg2e16ff_v_i16m2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_i16m2_m(...) __riscv_vlseg3e16ff_v_i16m2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_i16m2_m(...) __riscv_vlseg4e16ff_v_i16m2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_i16m4_m(...) __riscv_vlseg2e16ff_v_i16m4_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_i32mf2_m(...) __riscv_vlseg2e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_i32mf2_m(...) __riscv_vlseg3e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_i32mf2_m(...) __riscv_vlseg4e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_i32mf2_m(...) __riscv_vlseg5e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_i32mf2_m(...) __riscv_vlseg6e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_i32mf2_m(...) __riscv_vlseg7e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_i32mf2_m(...) __riscv_vlseg8e32ff_v_i32mf2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_i32m1_m(...) __riscv_vlseg2e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_i32m1_m(...) __riscv_vlseg3e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_i32m1_m(...) __riscv_vlseg4e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_i32m1_m(...) __riscv_vlseg5e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_i32m1_m(...) __riscv_vlseg6e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_i32m1_m(...) __riscv_vlseg7e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_i32m1_m(...) __riscv_vlseg8e32ff_v_i32m1_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_i32m2_m(...) __riscv_vlseg2e32ff_v_i32m2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_i32m2_m(...) __riscv_vlseg3e32ff_v_i32m2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_i32m2_m(...) __riscv_vlseg4e32ff_v_i32m2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_i32m4_m(...) __riscv_vlseg2e32ff_v_i32m4_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_i64m1_m(...) __riscv_vlseg2e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_i64m1_m(...) __riscv_vlseg3e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_i64m1_m(...) __riscv_vlseg4e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg5e64ff_v_i64m1_m(...) __riscv_vlseg5e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg6e64ff_v_i64m1_m(...) __riscv_vlseg6e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg7e64ff_v_i64m1_m(...) __riscv_vlseg7e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg8e64ff_v_i64m1_m(...) __riscv_vlseg8e64ff_v_i64m1_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_i64m2_m(...) __riscv_vlseg2e64ff_v_i64m2_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_i64m2_m(...) __riscv_vlseg3e64ff_v_i64m2_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_i64m2_m(...) __riscv_vlseg4e64ff_v_i64m2_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_i64m4_m(...) __riscv_vlseg2e64ff_v_i64m4_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8mf8_m(...) __riscv_vlseg2e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg3e8_v_u8mf8_m(...) __riscv_vlseg3e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg4e8_v_u8mf8_m(...) __riscv_vlseg4e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg5e8_v_u8mf8_m(...) __riscv_vlseg5e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg6e8_v_u8mf8_m(...) __riscv_vlseg6e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg7e8_v_u8mf8_m(...) __riscv_vlseg7e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg8e8_v_u8mf8_m(...) __riscv_vlseg8e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8mf4_m(...) __riscv_vlseg2e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg3e8_v_u8mf4_m(...) __riscv_vlseg3e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg4e8_v_u8mf4_m(...) __riscv_vlseg4e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg5e8_v_u8mf4_m(...) __riscv_vlseg5e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg6e8_v_u8mf4_m(...) __riscv_vlseg6e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg7e8_v_u8mf4_m(...) __riscv_vlseg7e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg8e8_v_u8mf4_m(...) __riscv_vlseg8e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8mf2_m(...) __riscv_vlseg2e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg3e8_v_u8mf2_m(...) __riscv_vlseg3e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg4e8_v_u8mf2_m(...) __riscv_vlseg4e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg5e8_v_u8mf2_m(...) __riscv_vlseg5e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg6e8_v_u8mf2_m(...) __riscv_vlseg6e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg7e8_v_u8mf2_m(...) __riscv_vlseg7e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg8e8_v_u8mf2_m(...) __riscv_vlseg8e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8m1_m(...) __riscv_vlseg2e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg3e8_v_u8m1_m(...) __riscv_vlseg3e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg4e8_v_u8m1_m(...) __riscv_vlseg4e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg5e8_v_u8m1_m(...) __riscv_vlseg5e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg6e8_v_u8m1_m(...) __riscv_vlseg6e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg7e8_v_u8m1_m(...) __riscv_vlseg7e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg8e8_v_u8m1_m(...) __riscv_vlseg8e8_v_u8m1_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8m2_m(...) __riscv_vlseg2e8_v_u8m2_tumu(__VA_ARGS__) +#define vlseg3e8_v_u8m2_m(...) __riscv_vlseg3e8_v_u8m2_tumu(__VA_ARGS__) +#define vlseg4e8_v_u8m2_m(...) __riscv_vlseg4e8_v_u8m2_tumu(__VA_ARGS__) +#define vlseg2e8_v_u8m4_m(...) __riscv_vlseg2e8_v_u8m4_tumu(__VA_ARGS__) +#define vlseg2e16_v_u16mf4_m(...) __riscv_vlseg2e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg3e16_v_u16mf4_m(...) __riscv_vlseg3e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg4e16_v_u16mf4_m(...) __riscv_vlseg4e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg5e16_v_u16mf4_m(...) __riscv_vlseg5e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg6e16_v_u16mf4_m(...) __riscv_vlseg6e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg7e16_v_u16mf4_m(...) __riscv_vlseg7e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg8e16_v_u16mf4_m(...) __riscv_vlseg8e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg2e16_v_u16mf2_m(...) __riscv_vlseg2e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg3e16_v_u16mf2_m(...) __riscv_vlseg3e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg4e16_v_u16mf2_m(...) __riscv_vlseg4e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg5e16_v_u16mf2_m(...) __riscv_vlseg5e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg6e16_v_u16mf2_m(...) __riscv_vlseg6e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg7e16_v_u16mf2_m(...) __riscv_vlseg7e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg8e16_v_u16mf2_m(...) __riscv_vlseg8e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg2e16_v_u16m1_m(...) __riscv_vlseg2e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg3e16_v_u16m1_m(...) __riscv_vlseg3e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg4e16_v_u16m1_m(...) __riscv_vlseg4e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg5e16_v_u16m1_m(...) __riscv_vlseg5e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg6e16_v_u16m1_m(...) __riscv_vlseg6e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg7e16_v_u16m1_m(...) __riscv_vlseg7e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg8e16_v_u16m1_m(...) __riscv_vlseg8e16_v_u16m1_tumu(__VA_ARGS__) +#define vlseg2e16_v_u16m2_m(...) __riscv_vlseg2e16_v_u16m2_tumu(__VA_ARGS__) +#define vlseg3e16_v_u16m2_m(...) __riscv_vlseg3e16_v_u16m2_tumu(__VA_ARGS__) +#define vlseg4e16_v_u16m2_m(...) __riscv_vlseg4e16_v_u16m2_tumu(__VA_ARGS__) +#define vlseg2e16_v_u16m4_m(...) __riscv_vlseg2e16_v_u16m4_tumu(__VA_ARGS__) +#define vlseg2e32_v_u32mf2_m(...) __riscv_vlseg2e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg3e32_v_u32mf2_m(...) __riscv_vlseg3e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg4e32_v_u32mf2_m(...) __riscv_vlseg4e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg5e32_v_u32mf2_m(...) __riscv_vlseg5e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg6e32_v_u32mf2_m(...) __riscv_vlseg6e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg7e32_v_u32mf2_m(...) __riscv_vlseg7e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg8e32_v_u32mf2_m(...) __riscv_vlseg8e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg2e32_v_u32m1_m(...) __riscv_vlseg2e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg3e32_v_u32m1_m(...) __riscv_vlseg3e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg4e32_v_u32m1_m(...) __riscv_vlseg4e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg5e32_v_u32m1_m(...) __riscv_vlseg5e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg6e32_v_u32m1_m(...) __riscv_vlseg6e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg7e32_v_u32m1_m(...) __riscv_vlseg7e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg8e32_v_u32m1_m(...) __riscv_vlseg8e32_v_u32m1_tumu(__VA_ARGS__) +#define vlseg2e32_v_u32m2_m(...) __riscv_vlseg2e32_v_u32m2_tumu(__VA_ARGS__) +#define vlseg3e32_v_u32m2_m(...) __riscv_vlseg3e32_v_u32m2_tumu(__VA_ARGS__) +#define vlseg4e32_v_u32m2_m(...) __riscv_vlseg4e32_v_u32m2_tumu(__VA_ARGS__) +#define vlseg2e32_v_u32m4_m(...) __riscv_vlseg2e32_v_u32m4_tumu(__VA_ARGS__) +#define vlseg2e64_v_u64m1_m(...) __riscv_vlseg2e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg3e64_v_u64m1_m(...) __riscv_vlseg3e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg4e64_v_u64m1_m(...) __riscv_vlseg4e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg5e64_v_u64m1_m(...) __riscv_vlseg5e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg6e64_v_u64m1_m(...) __riscv_vlseg6e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg7e64_v_u64m1_m(...) __riscv_vlseg7e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg8e64_v_u64m1_m(...) __riscv_vlseg8e64_v_u64m1_tumu(__VA_ARGS__) +#define vlseg2e64_v_u64m2_m(...) __riscv_vlseg2e64_v_u64m2_tumu(__VA_ARGS__) +#define vlseg3e64_v_u64m2_m(...) __riscv_vlseg3e64_v_u64m2_tumu(__VA_ARGS__) +#define vlseg4e64_v_u64m2_m(...) __riscv_vlseg4e64_v_u64m2_tumu(__VA_ARGS__) +#define vlseg2e64_v_u64m4_m(...) __riscv_vlseg2e64_v_u64m4_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf8_m(...) __riscv_vlseg2e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf8_m(...) __riscv_vlseg3e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf8_m(...) __riscv_vlseg4e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf8_m(...) __riscv_vlseg5e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf8_m(...) __riscv_vlseg6e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf8_m(...) __riscv_vlseg7e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf8_m(...) __riscv_vlseg8e8ff_v_u8mf8_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf4_m(...) __riscv_vlseg2e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf4_m(...) __riscv_vlseg3e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf4_m(...) __riscv_vlseg4e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf4_m(...) __riscv_vlseg5e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf4_m(...) __riscv_vlseg6e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf4_m(...) __riscv_vlseg7e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf4_m(...) __riscv_vlseg8e8ff_v_u8mf4_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8mf2_m(...) __riscv_vlseg2e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_u8mf2_m(...) __riscv_vlseg3e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_u8mf2_m(...) __riscv_vlseg4e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_u8mf2_m(...) __riscv_vlseg5e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_u8mf2_m(...) __riscv_vlseg6e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_u8mf2_m(...) __riscv_vlseg7e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_u8mf2_m(...) __riscv_vlseg8e8ff_v_u8mf2_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8m1_m(...) __riscv_vlseg2e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_u8m1_m(...) __riscv_vlseg3e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_u8m1_m(...) __riscv_vlseg4e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg5e8ff_v_u8m1_m(...) __riscv_vlseg5e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg6e8ff_v_u8m1_m(...) __riscv_vlseg6e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg7e8ff_v_u8m1_m(...) __riscv_vlseg7e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg8e8ff_v_u8m1_m(...) __riscv_vlseg8e8ff_v_u8m1_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8m2_m(...) __riscv_vlseg2e8ff_v_u8m2_tumu(__VA_ARGS__) +#define vlseg3e8ff_v_u8m2_m(...) __riscv_vlseg3e8ff_v_u8m2_tumu(__VA_ARGS__) +#define vlseg4e8ff_v_u8m2_m(...) __riscv_vlseg4e8ff_v_u8m2_tumu(__VA_ARGS__) +#define vlseg2e8ff_v_u8m4_m(...) __riscv_vlseg2e8ff_v_u8m4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_u16mf4_m(...) __riscv_vlseg2e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_u16mf4_m(...) __riscv_vlseg3e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_u16mf4_m(...) __riscv_vlseg4e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_u16mf4_m(...) __riscv_vlseg5e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_u16mf4_m(...) __riscv_vlseg6e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_u16mf4_m(...) __riscv_vlseg7e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_u16mf4_m(...) __riscv_vlseg8e16ff_v_u16mf4_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_u16mf2_m(...) __riscv_vlseg2e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_u16mf2_m(...) __riscv_vlseg3e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_u16mf2_m(...) __riscv_vlseg4e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_u16mf2_m(...) __riscv_vlseg5e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_u16mf2_m(...) __riscv_vlseg6e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_u16mf2_m(...) __riscv_vlseg7e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_u16mf2_m(...) __riscv_vlseg8e16ff_v_u16mf2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_u16m1_m(...) __riscv_vlseg2e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_u16m1_m(...) __riscv_vlseg3e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_u16m1_m(...) __riscv_vlseg4e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg5e16ff_v_u16m1_m(...) __riscv_vlseg5e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg6e16ff_v_u16m1_m(...) __riscv_vlseg6e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg7e16ff_v_u16m1_m(...) __riscv_vlseg7e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg8e16ff_v_u16m1_m(...) __riscv_vlseg8e16ff_v_u16m1_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_u16m2_m(...) __riscv_vlseg2e16ff_v_u16m2_tumu(__VA_ARGS__) +#define vlseg3e16ff_v_u16m2_m(...) __riscv_vlseg3e16ff_v_u16m2_tumu(__VA_ARGS__) +#define vlseg4e16ff_v_u16m2_m(...) __riscv_vlseg4e16ff_v_u16m2_tumu(__VA_ARGS__) +#define vlseg2e16ff_v_u16m4_m(...) __riscv_vlseg2e16ff_v_u16m4_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_u32mf2_m(...) __riscv_vlseg2e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_u32mf2_m(...) __riscv_vlseg3e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_u32mf2_m(...) __riscv_vlseg4e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_u32mf2_m(...) __riscv_vlseg5e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_u32mf2_m(...) __riscv_vlseg6e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_u32mf2_m(...) __riscv_vlseg7e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_u32mf2_m(...) __riscv_vlseg8e32ff_v_u32mf2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_u32m1_m(...) __riscv_vlseg2e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_u32m1_m(...) __riscv_vlseg3e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_u32m1_m(...) __riscv_vlseg4e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg5e32ff_v_u32m1_m(...) __riscv_vlseg5e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg6e32ff_v_u32m1_m(...) __riscv_vlseg6e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg7e32ff_v_u32m1_m(...) __riscv_vlseg7e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg8e32ff_v_u32m1_m(...) __riscv_vlseg8e32ff_v_u32m1_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_u32m2_m(...) __riscv_vlseg2e32ff_v_u32m2_tumu(__VA_ARGS__) +#define vlseg3e32ff_v_u32m2_m(...) __riscv_vlseg3e32ff_v_u32m2_tumu(__VA_ARGS__) +#define vlseg4e32ff_v_u32m2_m(...) __riscv_vlseg4e32ff_v_u32m2_tumu(__VA_ARGS__) +#define vlseg2e32ff_v_u32m4_m(...) __riscv_vlseg2e32ff_v_u32m4_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_u64m1_m(...) __riscv_vlseg2e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_u64m1_m(...) __riscv_vlseg3e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_u64m1_m(...) __riscv_vlseg4e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg5e64ff_v_u64m1_m(...) __riscv_vlseg5e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg6e64ff_v_u64m1_m(...) __riscv_vlseg6e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg7e64ff_v_u64m1_m(...) __riscv_vlseg7e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg8e64ff_v_u64m1_m(...) __riscv_vlseg8e64ff_v_u64m1_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_u64m2_m(...) __riscv_vlseg2e64ff_v_u64m2_tumu(__VA_ARGS__) +#define vlseg3e64ff_v_u64m2_m(...) __riscv_vlseg3e64ff_v_u64m2_tumu(__VA_ARGS__) +#define vlseg4e64ff_v_u64m2_m(...) __riscv_vlseg4e64ff_v_u64m2_tumu(__VA_ARGS__) +#define vlseg2e64ff_v_u64m4_m(...) __riscv_vlseg2e64ff_v_u64m4_tumu(__VA_ARGS__) +#define vsseg2e16_v_f16mf4(...) __riscv_vsseg2e16_v_f16mf4(__VA_ARGS__) +#define vsseg3e16_v_f16mf4(...) __riscv_vsseg3e16_v_f16mf4(__VA_ARGS__) +#define vsseg4e16_v_f16mf4(...) __riscv_vsseg4e16_v_f16mf4(__VA_ARGS__) +#define vsseg5e16_v_f16mf4(...) __riscv_vsseg5e16_v_f16mf4(__VA_ARGS__) +#define vsseg6e16_v_f16mf4(...) __riscv_vsseg6e16_v_f16mf4(__VA_ARGS__) +#define vsseg7e16_v_f16mf4(...) __riscv_vsseg7e16_v_f16mf4(__VA_ARGS__) +#define vsseg8e16_v_f16mf4(...) __riscv_vsseg8e16_v_f16mf4(__VA_ARGS__) +#define vsseg2e16_v_f16mf2(...) __riscv_vsseg2e16_v_f16mf2(__VA_ARGS__) +#define vsseg3e16_v_f16mf2(...) __riscv_vsseg3e16_v_f16mf2(__VA_ARGS__) +#define vsseg4e16_v_f16mf2(...) __riscv_vsseg4e16_v_f16mf2(__VA_ARGS__) +#define vsseg5e16_v_f16mf2(...) __riscv_vsseg5e16_v_f16mf2(__VA_ARGS__) +#define vsseg6e16_v_f16mf2(...) __riscv_vsseg6e16_v_f16mf2(__VA_ARGS__) +#define vsseg7e16_v_f16mf2(...) __riscv_vsseg7e16_v_f16mf2(__VA_ARGS__) +#define vsseg8e16_v_f16mf2(...) __riscv_vsseg8e16_v_f16mf2(__VA_ARGS__) +#define vsseg2e16_v_f16m1(...) __riscv_vsseg2e16_v_f16m1(__VA_ARGS__) +#define vsseg3e16_v_f16m1(...) __riscv_vsseg3e16_v_f16m1(__VA_ARGS__) +#define vsseg4e16_v_f16m1(...) __riscv_vsseg4e16_v_f16m1(__VA_ARGS__) +#define vsseg5e16_v_f16m1(...) __riscv_vsseg5e16_v_f16m1(__VA_ARGS__) +#define vsseg6e16_v_f16m1(...) __riscv_vsseg6e16_v_f16m1(__VA_ARGS__) +#define vsseg7e16_v_f16m1(...) __riscv_vsseg7e16_v_f16m1(__VA_ARGS__) +#define vsseg8e16_v_f16m1(...) __riscv_vsseg8e16_v_f16m1(__VA_ARGS__) +#define vsseg2e16_v_f16m2(...) __riscv_vsseg2e16_v_f16m2(__VA_ARGS__) +#define vsseg3e16_v_f16m2(...) __riscv_vsseg3e16_v_f16m2(__VA_ARGS__) +#define vsseg4e16_v_f16m2(...) __riscv_vsseg4e16_v_f16m2(__VA_ARGS__) +#define vsseg2e16_v_f16m4(...) __riscv_vsseg2e16_v_f16m4(__VA_ARGS__) +#define vsseg2e32_v_f32mf2(...) __riscv_vsseg2e32_v_f32mf2(__VA_ARGS__) +#define vsseg3e32_v_f32mf2(...) __riscv_vsseg3e32_v_f32mf2(__VA_ARGS__) +#define vsseg4e32_v_f32mf2(...) __riscv_vsseg4e32_v_f32mf2(__VA_ARGS__) +#define vsseg5e32_v_f32mf2(...) __riscv_vsseg5e32_v_f32mf2(__VA_ARGS__) +#define vsseg6e32_v_f32mf2(...) __riscv_vsseg6e32_v_f32mf2(__VA_ARGS__) +#define vsseg7e32_v_f32mf2(...) __riscv_vsseg7e32_v_f32mf2(__VA_ARGS__) +#define vsseg8e32_v_f32mf2(...) __riscv_vsseg8e32_v_f32mf2(__VA_ARGS__) +#define vsseg2e32_v_f32m1(...) __riscv_vsseg2e32_v_f32m1(__VA_ARGS__) +#define vsseg3e32_v_f32m1(...) __riscv_vsseg3e32_v_f32m1(__VA_ARGS__) +#define vsseg4e32_v_f32m1(...) __riscv_vsseg4e32_v_f32m1(__VA_ARGS__) +#define vsseg5e32_v_f32m1(...) __riscv_vsseg5e32_v_f32m1(__VA_ARGS__) +#define vsseg6e32_v_f32m1(...) __riscv_vsseg6e32_v_f32m1(__VA_ARGS__) +#define vsseg7e32_v_f32m1(...) __riscv_vsseg7e32_v_f32m1(__VA_ARGS__) +#define vsseg8e32_v_f32m1(...) __riscv_vsseg8e32_v_f32m1(__VA_ARGS__) +#define vsseg2e32_v_f32m2(...) __riscv_vsseg2e32_v_f32m2(__VA_ARGS__) +#define vsseg3e32_v_f32m2(...) __riscv_vsseg3e32_v_f32m2(__VA_ARGS__) +#define vsseg4e32_v_f32m2(...) __riscv_vsseg4e32_v_f32m2(__VA_ARGS__) +#define vsseg2e32_v_f32m4(...) __riscv_vsseg2e32_v_f32m4(__VA_ARGS__) +#define vsseg2e64_v_f64m1(...) __riscv_vsseg2e64_v_f64m1(__VA_ARGS__) +#define vsseg3e64_v_f64m1(...) __riscv_vsseg3e64_v_f64m1(__VA_ARGS__) +#define vsseg4e64_v_f64m1(...) __riscv_vsseg4e64_v_f64m1(__VA_ARGS__) +#define vsseg5e64_v_f64m1(...) __riscv_vsseg5e64_v_f64m1(__VA_ARGS__) +#define vsseg6e64_v_f64m1(...) __riscv_vsseg6e64_v_f64m1(__VA_ARGS__) +#define vsseg7e64_v_f64m1(...) __riscv_vsseg7e64_v_f64m1(__VA_ARGS__) +#define vsseg8e64_v_f64m1(...) __riscv_vsseg8e64_v_f64m1(__VA_ARGS__) +#define vsseg2e64_v_f64m2(...) __riscv_vsseg2e64_v_f64m2(__VA_ARGS__) +#define vsseg3e64_v_f64m2(...) __riscv_vsseg3e64_v_f64m2(__VA_ARGS__) +#define vsseg4e64_v_f64m2(...) __riscv_vsseg4e64_v_f64m2(__VA_ARGS__) +#define vsseg2e64_v_f64m4(...) __riscv_vsseg2e64_v_f64m4(__VA_ARGS__) +#define vsseg2e8_v_i8mf8(...) __riscv_vsseg2e8_v_i8mf8(__VA_ARGS__) +#define vsseg3e8_v_i8mf8(...) __riscv_vsseg3e8_v_i8mf8(__VA_ARGS__) +#define vsseg4e8_v_i8mf8(...) __riscv_vsseg4e8_v_i8mf8(__VA_ARGS__) +#define vsseg5e8_v_i8mf8(...) __riscv_vsseg5e8_v_i8mf8(__VA_ARGS__) +#define vsseg6e8_v_i8mf8(...) __riscv_vsseg6e8_v_i8mf8(__VA_ARGS__) +#define vsseg7e8_v_i8mf8(...) __riscv_vsseg7e8_v_i8mf8(__VA_ARGS__) +#define vsseg8e8_v_i8mf8(...) __riscv_vsseg8e8_v_i8mf8(__VA_ARGS__) +#define vsseg2e8_v_i8mf4(...) __riscv_vsseg2e8_v_i8mf4(__VA_ARGS__) +#define vsseg3e8_v_i8mf4(...) __riscv_vsseg3e8_v_i8mf4(__VA_ARGS__) +#define vsseg4e8_v_i8mf4(...) __riscv_vsseg4e8_v_i8mf4(__VA_ARGS__) +#define vsseg5e8_v_i8mf4(...) __riscv_vsseg5e8_v_i8mf4(__VA_ARGS__) +#define vsseg6e8_v_i8mf4(...) __riscv_vsseg6e8_v_i8mf4(__VA_ARGS__) +#define vsseg7e8_v_i8mf4(...) __riscv_vsseg7e8_v_i8mf4(__VA_ARGS__) +#define vsseg8e8_v_i8mf4(...) __riscv_vsseg8e8_v_i8mf4(__VA_ARGS__) +#define vsseg2e8_v_i8mf2(...) __riscv_vsseg2e8_v_i8mf2(__VA_ARGS__) +#define vsseg3e8_v_i8mf2(...) __riscv_vsseg3e8_v_i8mf2(__VA_ARGS__) +#define vsseg4e8_v_i8mf2(...) __riscv_vsseg4e8_v_i8mf2(__VA_ARGS__) +#define vsseg5e8_v_i8mf2(...) __riscv_vsseg5e8_v_i8mf2(__VA_ARGS__) +#define vsseg6e8_v_i8mf2(...) __riscv_vsseg6e8_v_i8mf2(__VA_ARGS__) +#define vsseg7e8_v_i8mf2(...) __riscv_vsseg7e8_v_i8mf2(__VA_ARGS__) +#define vsseg8e8_v_i8mf2(...) __riscv_vsseg8e8_v_i8mf2(__VA_ARGS__) +#define vsseg2e8_v_i8m1(...) __riscv_vsseg2e8_v_i8m1(__VA_ARGS__) +#define vsseg3e8_v_i8m1(...) __riscv_vsseg3e8_v_i8m1(__VA_ARGS__) +#define vsseg4e8_v_i8m1(...) __riscv_vsseg4e8_v_i8m1(__VA_ARGS__) +#define vsseg5e8_v_i8m1(...) __riscv_vsseg5e8_v_i8m1(__VA_ARGS__) +#define vsseg6e8_v_i8m1(...) __riscv_vsseg6e8_v_i8m1(__VA_ARGS__) +#define vsseg7e8_v_i8m1(...) __riscv_vsseg7e8_v_i8m1(__VA_ARGS__) +#define vsseg8e8_v_i8m1(...) __riscv_vsseg8e8_v_i8m1(__VA_ARGS__) +#define vsseg2e8_v_i8m2(...) __riscv_vsseg2e8_v_i8m2(__VA_ARGS__) +#define vsseg3e8_v_i8m2(...) __riscv_vsseg3e8_v_i8m2(__VA_ARGS__) +#define vsseg4e8_v_i8m2(...) __riscv_vsseg4e8_v_i8m2(__VA_ARGS__) +#define vsseg2e8_v_i8m4(...) __riscv_vsseg2e8_v_i8m4(__VA_ARGS__) +#define vsseg2e16_v_i16mf4(...) __riscv_vsseg2e16_v_i16mf4(__VA_ARGS__) +#define vsseg3e16_v_i16mf4(...) __riscv_vsseg3e16_v_i16mf4(__VA_ARGS__) +#define vsseg4e16_v_i16mf4(...) __riscv_vsseg4e16_v_i16mf4(__VA_ARGS__) +#define vsseg5e16_v_i16mf4(...) __riscv_vsseg5e16_v_i16mf4(__VA_ARGS__) +#define vsseg6e16_v_i16mf4(...) __riscv_vsseg6e16_v_i16mf4(__VA_ARGS__) +#define vsseg7e16_v_i16mf4(...) __riscv_vsseg7e16_v_i16mf4(__VA_ARGS__) +#define vsseg8e16_v_i16mf4(...) __riscv_vsseg8e16_v_i16mf4(__VA_ARGS__) +#define vsseg2e16_v_i16mf2(...) __riscv_vsseg2e16_v_i16mf2(__VA_ARGS__) +#define vsseg3e16_v_i16mf2(...) __riscv_vsseg3e16_v_i16mf2(__VA_ARGS__) +#define vsseg4e16_v_i16mf2(...) __riscv_vsseg4e16_v_i16mf2(__VA_ARGS__) +#define vsseg5e16_v_i16mf2(...) __riscv_vsseg5e16_v_i16mf2(__VA_ARGS__) +#define vsseg6e16_v_i16mf2(...) __riscv_vsseg6e16_v_i16mf2(__VA_ARGS__) +#define vsseg7e16_v_i16mf2(...) __riscv_vsseg7e16_v_i16mf2(__VA_ARGS__) +#define vsseg8e16_v_i16mf2(...) __riscv_vsseg8e16_v_i16mf2(__VA_ARGS__) +#define vsseg2e16_v_i16m1(...) __riscv_vsseg2e16_v_i16m1(__VA_ARGS__) +#define vsseg3e16_v_i16m1(...) __riscv_vsseg3e16_v_i16m1(__VA_ARGS__) +#define vsseg4e16_v_i16m1(...) __riscv_vsseg4e16_v_i16m1(__VA_ARGS__) +#define vsseg5e16_v_i16m1(...) __riscv_vsseg5e16_v_i16m1(__VA_ARGS__) +#define vsseg6e16_v_i16m1(...) __riscv_vsseg6e16_v_i16m1(__VA_ARGS__) +#define vsseg7e16_v_i16m1(...) __riscv_vsseg7e16_v_i16m1(__VA_ARGS__) +#define vsseg8e16_v_i16m1(...) __riscv_vsseg8e16_v_i16m1(__VA_ARGS__) +#define vsseg2e16_v_i16m2(...) __riscv_vsseg2e16_v_i16m2(__VA_ARGS__) +#define vsseg3e16_v_i16m2(...) __riscv_vsseg3e16_v_i16m2(__VA_ARGS__) +#define vsseg4e16_v_i16m2(...) __riscv_vsseg4e16_v_i16m2(__VA_ARGS__) +#define vsseg2e16_v_i16m4(...) __riscv_vsseg2e16_v_i16m4(__VA_ARGS__) +#define vsseg2e32_v_i32mf2(...) __riscv_vsseg2e32_v_i32mf2(__VA_ARGS__) +#define vsseg3e32_v_i32mf2(...) __riscv_vsseg3e32_v_i32mf2(__VA_ARGS__) +#define vsseg4e32_v_i32mf2(...) __riscv_vsseg4e32_v_i32mf2(__VA_ARGS__) +#define vsseg5e32_v_i32mf2(...) __riscv_vsseg5e32_v_i32mf2(__VA_ARGS__) +#define vsseg6e32_v_i32mf2(...) __riscv_vsseg6e32_v_i32mf2(__VA_ARGS__) +#define vsseg7e32_v_i32mf2(...) __riscv_vsseg7e32_v_i32mf2(__VA_ARGS__) +#define vsseg8e32_v_i32mf2(...) __riscv_vsseg8e32_v_i32mf2(__VA_ARGS__) +#define vsseg2e32_v_i32m1(...) __riscv_vsseg2e32_v_i32m1(__VA_ARGS__) +#define vsseg3e32_v_i32m1(...) __riscv_vsseg3e32_v_i32m1(__VA_ARGS__) +#define vsseg4e32_v_i32m1(...) __riscv_vsseg4e32_v_i32m1(__VA_ARGS__) +#define vsseg5e32_v_i32m1(...) __riscv_vsseg5e32_v_i32m1(__VA_ARGS__) +#define vsseg6e32_v_i32m1(...) __riscv_vsseg6e32_v_i32m1(__VA_ARGS__) +#define vsseg7e32_v_i32m1(...) __riscv_vsseg7e32_v_i32m1(__VA_ARGS__) +#define vsseg8e32_v_i32m1(...) __riscv_vsseg8e32_v_i32m1(__VA_ARGS__) +#define vsseg2e32_v_i32m2(...) __riscv_vsseg2e32_v_i32m2(__VA_ARGS__) +#define vsseg3e32_v_i32m2(...) __riscv_vsseg3e32_v_i32m2(__VA_ARGS__) +#define vsseg4e32_v_i32m2(...) __riscv_vsseg4e32_v_i32m2(__VA_ARGS__) +#define vsseg2e32_v_i32m4(...) __riscv_vsseg2e32_v_i32m4(__VA_ARGS__) +#define vsseg2e64_v_i64m1(...) __riscv_vsseg2e64_v_i64m1(__VA_ARGS__) +#define vsseg3e64_v_i64m1(...) __riscv_vsseg3e64_v_i64m1(__VA_ARGS__) +#define vsseg4e64_v_i64m1(...) __riscv_vsseg4e64_v_i64m1(__VA_ARGS__) +#define vsseg5e64_v_i64m1(...) __riscv_vsseg5e64_v_i64m1(__VA_ARGS__) +#define vsseg6e64_v_i64m1(...) __riscv_vsseg6e64_v_i64m1(__VA_ARGS__) +#define vsseg7e64_v_i64m1(...) __riscv_vsseg7e64_v_i64m1(__VA_ARGS__) +#define vsseg8e64_v_i64m1(...) __riscv_vsseg8e64_v_i64m1(__VA_ARGS__) +#define vsseg2e64_v_i64m2(...) __riscv_vsseg2e64_v_i64m2(__VA_ARGS__) +#define vsseg3e64_v_i64m2(...) __riscv_vsseg3e64_v_i64m2(__VA_ARGS__) +#define vsseg4e64_v_i64m2(...) __riscv_vsseg4e64_v_i64m2(__VA_ARGS__) +#define vsseg2e64_v_i64m4(...) __riscv_vsseg2e64_v_i64m4(__VA_ARGS__) +#define vsseg2e8_v_u8mf8(...) __riscv_vsseg2e8_v_u8mf8(__VA_ARGS__) +#define vsseg3e8_v_u8mf8(...) __riscv_vsseg3e8_v_u8mf8(__VA_ARGS__) +#define vsseg4e8_v_u8mf8(...) __riscv_vsseg4e8_v_u8mf8(__VA_ARGS__) +#define vsseg5e8_v_u8mf8(...) __riscv_vsseg5e8_v_u8mf8(__VA_ARGS__) +#define vsseg6e8_v_u8mf8(...) __riscv_vsseg6e8_v_u8mf8(__VA_ARGS__) +#define vsseg7e8_v_u8mf8(...) __riscv_vsseg7e8_v_u8mf8(__VA_ARGS__) +#define vsseg8e8_v_u8mf8(...) __riscv_vsseg8e8_v_u8mf8(__VA_ARGS__) +#define vsseg2e8_v_u8mf4(...) __riscv_vsseg2e8_v_u8mf4(__VA_ARGS__) +#define vsseg3e8_v_u8mf4(...) __riscv_vsseg3e8_v_u8mf4(__VA_ARGS__) +#define vsseg4e8_v_u8mf4(...) __riscv_vsseg4e8_v_u8mf4(__VA_ARGS__) +#define vsseg5e8_v_u8mf4(...) __riscv_vsseg5e8_v_u8mf4(__VA_ARGS__) +#define vsseg6e8_v_u8mf4(...) __riscv_vsseg6e8_v_u8mf4(__VA_ARGS__) +#define vsseg7e8_v_u8mf4(...) __riscv_vsseg7e8_v_u8mf4(__VA_ARGS__) +#define vsseg8e8_v_u8mf4(...) __riscv_vsseg8e8_v_u8mf4(__VA_ARGS__) +#define vsseg2e8_v_u8mf2(...) __riscv_vsseg2e8_v_u8mf2(__VA_ARGS__) +#define vsseg3e8_v_u8mf2(...) __riscv_vsseg3e8_v_u8mf2(__VA_ARGS__) +#define vsseg4e8_v_u8mf2(...) __riscv_vsseg4e8_v_u8mf2(__VA_ARGS__) +#define vsseg5e8_v_u8mf2(...) __riscv_vsseg5e8_v_u8mf2(__VA_ARGS__) +#define vsseg6e8_v_u8mf2(...) __riscv_vsseg6e8_v_u8mf2(__VA_ARGS__) +#define vsseg7e8_v_u8mf2(...) __riscv_vsseg7e8_v_u8mf2(__VA_ARGS__) +#define vsseg8e8_v_u8mf2(...) __riscv_vsseg8e8_v_u8mf2(__VA_ARGS__) +#define vsseg2e8_v_u8m1(...) __riscv_vsseg2e8_v_u8m1(__VA_ARGS__) +#define vsseg3e8_v_u8m1(...) __riscv_vsseg3e8_v_u8m1(__VA_ARGS__) +#define vsseg4e8_v_u8m1(...) __riscv_vsseg4e8_v_u8m1(__VA_ARGS__) +#define vsseg5e8_v_u8m1(...) __riscv_vsseg5e8_v_u8m1(__VA_ARGS__) +#define vsseg6e8_v_u8m1(...) __riscv_vsseg6e8_v_u8m1(__VA_ARGS__) +#define vsseg7e8_v_u8m1(...) __riscv_vsseg7e8_v_u8m1(__VA_ARGS__) +#define vsseg8e8_v_u8m1(...) __riscv_vsseg8e8_v_u8m1(__VA_ARGS__) +#define vsseg2e8_v_u8m2(...) __riscv_vsseg2e8_v_u8m2(__VA_ARGS__) +#define vsseg3e8_v_u8m2(...) __riscv_vsseg3e8_v_u8m2(__VA_ARGS__) +#define vsseg4e8_v_u8m2(...) __riscv_vsseg4e8_v_u8m2(__VA_ARGS__) +#define vsseg2e8_v_u8m4(...) __riscv_vsseg2e8_v_u8m4(__VA_ARGS__) +#define vsseg2e16_v_u16mf4(...) __riscv_vsseg2e16_v_u16mf4(__VA_ARGS__) +#define vsseg3e16_v_u16mf4(...) __riscv_vsseg3e16_v_u16mf4(__VA_ARGS__) +#define vsseg4e16_v_u16mf4(...) __riscv_vsseg4e16_v_u16mf4(__VA_ARGS__) +#define vsseg5e16_v_u16mf4(...) __riscv_vsseg5e16_v_u16mf4(__VA_ARGS__) +#define vsseg6e16_v_u16mf4(...) __riscv_vsseg6e16_v_u16mf4(__VA_ARGS__) +#define vsseg7e16_v_u16mf4(...) __riscv_vsseg7e16_v_u16mf4(__VA_ARGS__) +#define vsseg8e16_v_u16mf4(...) __riscv_vsseg8e16_v_u16mf4(__VA_ARGS__) +#define vsseg2e16_v_u16mf2(...) __riscv_vsseg2e16_v_u16mf2(__VA_ARGS__) +#define vsseg3e16_v_u16mf2(...) __riscv_vsseg3e16_v_u16mf2(__VA_ARGS__) +#define vsseg4e16_v_u16mf2(...) __riscv_vsseg4e16_v_u16mf2(__VA_ARGS__) +#define vsseg5e16_v_u16mf2(...) __riscv_vsseg5e16_v_u16mf2(__VA_ARGS__) +#define vsseg6e16_v_u16mf2(...) __riscv_vsseg6e16_v_u16mf2(__VA_ARGS__) +#define vsseg7e16_v_u16mf2(...) __riscv_vsseg7e16_v_u16mf2(__VA_ARGS__) +#define vsseg8e16_v_u16mf2(...) __riscv_vsseg8e16_v_u16mf2(__VA_ARGS__) +#define vsseg2e16_v_u16m1(...) __riscv_vsseg2e16_v_u16m1(__VA_ARGS__) +#define vsseg3e16_v_u16m1(...) __riscv_vsseg3e16_v_u16m1(__VA_ARGS__) +#define vsseg4e16_v_u16m1(...) __riscv_vsseg4e16_v_u16m1(__VA_ARGS__) +#define vsseg5e16_v_u16m1(...) __riscv_vsseg5e16_v_u16m1(__VA_ARGS__) +#define vsseg6e16_v_u16m1(...) __riscv_vsseg6e16_v_u16m1(__VA_ARGS__) +#define vsseg7e16_v_u16m1(...) __riscv_vsseg7e16_v_u16m1(__VA_ARGS__) +#define vsseg8e16_v_u16m1(...) __riscv_vsseg8e16_v_u16m1(__VA_ARGS__) +#define vsseg2e16_v_u16m2(...) __riscv_vsseg2e16_v_u16m2(__VA_ARGS__) +#define vsseg3e16_v_u16m2(...) __riscv_vsseg3e16_v_u16m2(__VA_ARGS__) +#define vsseg4e16_v_u16m2(...) __riscv_vsseg4e16_v_u16m2(__VA_ARGS__) +#define vsseg2e16_v_u16m4(...) __riscv_vsseg2e16_v_u16m4(__VA_ARGS__) +#define vsseg2e32_v_u32mf2(...) __riscv_vsseg2e32_v_u32mf2(__VA_ARGS__) +#define vsseg3e32_v_u32mf2(...) __riscv_vsseg3e32_v_u32mf2(__VA_ARGS__) +#define vsseg4e32_v_u32mf2(...) __riscv_vsseg4e32_v_u32mf2(__VA_ARGS__) +#define vsseg5e32_v_u32mf2(...) __riscv_vsseg5e32_v_u32mf2(__VA_ARGS__) +#define vsseg6e32_v_u32mf2(...) __riscv_vsseg6e32_v_u32mf2(__VA_ARGS__) +#define vsseg7e32_v_u32mf2(...) __riscv_vsseg7e32_v_u32mf2(__VA_ARGS__) +#define vsseg8e32_v_u32mf2(...) __riscv_vsseg8e32_v_u32mf2(__VA_ARGS__) +#define vsseg2e32_v_u32m1(...) __riscv_vsseg2e32_v_u32m1(__VA_ARGS__) +#define vsseg3e32_v_u32m1(...) __riscv_vsseg3e32_v_u32m1(__VA_ARGS__) +#define vsseg4e32_v_u32m1(...) __riscv_vsseg4e32_v_u32m1(__VA_ARGS__) +#define vsseg5e32_v_u32m1(...) __riscv_vsseg5e32_v_u32m1(__VA_ARGS__) +#define vsseg6e32_v_u32m1(...) __riscv_vsseg6e32_v_u32m1(__VA_ARGS__) +#define vsseg7e32_v_u32m1(...) __riscv_vsseg7e32_v_u32m1(__VA_ARGS__) +#define vsseg8e32_v_u32m1(...) __riscv_vsseg8e32_v_u32m1(__VA_ARGS__) +#define vsseg2e32_v_u32m2(...) __riscv_vsseg2e32_v_u32m2(__VA_ARGS__) +#define vsseg3e32_v_u32m2(...) __riscv_vsseg3e32_v_u32m2(__VA_ARGS__) +#define vsseg4e32_v_u32m2(...) __riscv_vsseg4e32_v_u32m2(__VA_ARGS__) +#define vsseg2e32_v_u32m4(...) __riscv_vsseg2e32_v_u32m4(__VA_ARGS__) +#define vsseg2e64_v_u64m1(...) __riscv_vsseg2e64_v_u64m1(__VA_ARGS__) +#define vsseg3e64_v_u64m1(...) __riscv_vsseg3e64_v_u64m1(__VA_ARGS__) +#define vsseg4e64_v_u64m1(...) __riscv_vsseg4e64_v_u64m1(__VA_ARGS__) +#define vsseg5e64_v_u64m1(...) __riscv_vsseg5e64_v_u64m1(__VA_ARGS__) +#define vsseg6e64_v_u64m1(...) __riscv_vsseg6e64_v_u64m1(__VA_ARGS__) +#define vsseg7e64_v_u64m1(...) __riscv_vsseg7e64_v_u64m1(__VA_ARGS__) +#define vsseg8e64_v_u64m1(...) __riscv_vsseg8e64_v_u64m1(__VA_ARGS__) +#define vsseg2e64_v_u64m2(...) __riscv_vsseg2e64_v_u64m2(__VA_ARGS__) +#define vsseg3e64_v_u64m2(...) __riscv_vsseg3e64_v_u64m2(__VA_ARGS__) +#define vsseg4e64_v_u64m2(...) __riscv_vsseg4e64_v_u64m2(__VA_ARGS__) +#define vsseg2e64_v_u64m4(...) __riscv_vsseg2e64_v_u64m4(__VA_ARGS__) +// masked functions +#define vsseg2e16_v_f16mf4_m(...) __riscv_vsseg2e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg3e16_v_f16mf4_m(...) __riscv_vsseg3e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg4e16_v_f16mf4_m(...) __riscv_vsseg4e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg5e16_v_f16mf4_m(...) __riscv_vsseg5e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg6e16_v_f16mf4_m(...) __riscv_vsseg6e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg7e16_v_f16mf4_m(...) __riscv_vsseg7e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg8e16_v_f16mf4_m(...) __riscv_vsseg8e16_v_f16mf4_m(__VA_ARGS__) +#define vsseg2e16_v_f16mf2_m(...) __riscv_vsseg2e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg3e16_v_f16mf2_m(...) __riscv_vsseg3e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg4e16_v_f16mf2_m(...) __riscv_vsseg4e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg5e16_v_f16mf2_m(...) __riscv_vsseg5e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg6e16_v_f16mf2_m(...) __riscv_vsseg6e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg7e16_v_f16mf2_m(...) __riscv_vsseg7e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg8e16_v_f16mf2_m(...) __riscv_vsseg8e16_v_f16mf2_m(__VA_ARGS__) +#define vsseg2e16_v_f16m1_m(...) __riscv_vsseg2e16_v_f16m1_m(__VA_ARGS__) +#define vsseg3e16_v_f16m1_m(...) __riscv_vsseg3e16_v_f16m1_m(__VA_ARGS__) +#define vsseg4e16_v_f16m1_m(...) __riscv_vsseg4e16_v_f16m1_m(__VA_ARGS__) +#define vsseg5e16_v_f16m1_m(...) __riscv_vsseg5e16_v_f16m1_m(__VA_ARGS__) +#define vsseg6e16_v_f16m1_m(...) __riscv_vsseg6e16_v_f16m1_m(__VA_ARGS__) +#define vsseg7e16_v_f16m1_m(...) __riscv_vsseg7e16_v_f16m1_m(__VA_ARGS__) +#define vsseg8e16_v_f16m1_m(...) __riscv_vsseg8e16_v_f16m1_m(__VA_ARGS__) +#define vsseg2e16_v_f16m2_m(...) __riscv_vsseg2e16_v_f16m2_m(__VA_ARGS__) +#define vsseg3e16_v_f16m2_m(...) __riscv_vsseg3e16_v_f16m2_m(__VA_ARGS__) +#define vsseg4e16_v_f16m2_m(...) __riscv_vsseg4e16_v_f16m2_m(__VA_ARGS__) +#define vsseg2e16_v_f16m4_m(...) __riscv_vsseg2e16_v_f16m4_m(__VA_ARGS__) +#define vsseg2e32_v_f32mf2_m(...) __riscv_vsseg2e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg3e32_v_f32mf2_m(...) __riscv_vsseg3e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg4e32_v_f32mf2_m(...) __riscv_vsseg4e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg5e32_v_f32mf2_m(...) __riscv_vsseg5e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg6e32_v_f32mf2_m(...) __riscv_vsseg6e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg7e32_v_f32mf2_m(...) __riscv_vsseg7e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg8e32_v_f32mf2_m(...) __riscv_vsseg8e32_v_f32mf2_m(__VA_ARGS__) +#define vsseg2e32_v_f32m1_m(...) __riscv_vsseg2e32_v_f32m1_m(__VA_ARGS__) +#define vsseg3e32_v_f32m1_m(...) __riscv_vsseg3e32_v_f32m1_m(__VA_ARGS__) +#define vsseg4e32_v_f32m1_m(...) __riscv_vsseg4e32_v_f32m1_m(__VA_ARGS__) +#define vsseg5e32_v_f32m1_m(...) __riscv_vsseg5e32_v_f32m1_m(__VA_ARGS__) +#define vsseg6e32_v_f32m1_m(...) __riscv_vsseg6e32_v_f32m1_m(__VA_ARGS__) +#define vsseg7e32_v_f32m1_m(...) __riscv_vsseg7e32_v_f32m1_m(__VA_ARGS__) +#define vsseg8e32_v_f32m1_m(...) __riscv_vsseg8e32_v_f32m1_m(__VA_ARGS__) +#define vsseg2e32_v_f32m2_m(...) __riscv_vsseg2e32_v_f32m2_m(__VA_ARGS__) +#define vsseg3e32_v_f32m2_m(...) __riscv_vsseg3e32_v_f32m2_m(__VA_ARGS__) +#define vsseg4e32_v_f32m2_m(...) __riscv_vsseg4e32_v_f32m2_m(__VA_ARGS__) +#define vsseg2e32_v_f32m4_m(...) __riscv_vsseg2e32_v_f32m4_m(__VA_ARGS__) +#define vsseg2e64_v_f64m1_m(...) __riscv_vsseg2e64_v_f64m1_m(__VA_ARGS__) +#define vsseg3e64_v_f64m1_m(...) __riscv_vsseg3e64_v_f64m1_m(__VA_ARGS__) +#define vsseg4e64_v_f64m1_m(...) __riscv_vsseg4e64_v_f64m1_m(__VA_ARGS__) +#define vsseg5e64_v_f64m1_m(...) __riscv_vsseg5e64_v_f64m1_m(__VA_ARGS__) +#define vsseg6e64_v_f64m1_m(...) __riscv_vsseg6e64_v_f64m1_m(__VA_ARGS__) +#define vsseg7e64_v_f64m1_m(...) __riscv_vsseg7e64_v_f64m1_m(__VA_ARGS__) +#define vsseg8e64_v_f64m1_m(...) __riscv_vsseg8e64_v_f64m1_m(__VA_ARGS__) +#define vsseg2e64_v_f64m2_m(...) __riscv_vsseg2e64_v_f64m2_m(__VA_ARGS__) +#define vsseg3e64_v_f64m2_m(...) __riscv_vsseg3e64_v_f64m2_m(__VA_ARGS__) +#define vsseg4e64_v_f64m2_m(...) __riscv_vsseg4e64_v_f64m2_m(__VA_ARGS__) +#define vsseg2e64_v_f64m4_m(...) __riscv_vsseg2e64_v_f64m4_m(__VA_ARGS__) +#define vsseg2e8_v_i8mf8_m(...) __riscv_vsseg2e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg3e8_v_i8mf8_m(...) __riscv_vsseg3e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg4e8_v_i8mf8_m(...) __riscv_vsseg4e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg5e8_v_i8mf8_m(...) __riscv_vsseg5e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg6e8_v_i8mf8_m(...) __riscv_vsseg6e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg7e8_v_i8mf8_m(...) __riscv_vsseg7e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg8e8_v_i8mf8_m(...) __riscv_vsseg8e8_v_i8mf8_m(__VA_ARGS__) +#define vsseg2e8_v_i8mf4_m(...) __riscv_vsseg2e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg3e8_v_i8mf4_m(...) __riscv_vsseg3e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg4e8_v_i8mf4_m(...) __riscv_vsseg4e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg5e8_v_i8mf4_m(...) __riscv_vsseg5e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg6e8_v_i8mf4_m(...) __riscv_vsseg6e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg7e8_v_i8mf4_m(...) __riscv_vsseg7e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg8e8_v_i8mf4_m(...) __riscv_vsseg8e8_v_i8mf4_m(__VA_ARGS__) +#define vsseg2e8_v_i8mf2_m(...) __riscv_vsseg2e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg3e8_v_i8mf2_m(...) __riscv_vsseg3e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg4e8_v_i8mf2_m(...) __riscv_vsseg4e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg5e8_v_i8mf2_m(...) __riscv_vsseg5e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg6e8_v_i8mf2_m(...) __riscv_vsseg6e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg7e8_v_i8mf2_m(...) __riscv_vsseg7e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg8e8_v_i8mf2_m(...) __riscv_vsseg8e8_v_i8mf2_m(__VA_ARGS__) +#define vsseg2e8_v_i8m1_m(...) __riscv_vsseg2e8_v_i8m1_m(__VA_ARGS__) +#define vsseg3e8_v_i8m1_m(...) __riscv_vsseg3e8_v_i8m1_m(__VA_ARGS__) +#define vsseg4e8_v_i8m1_m(...) __riscv_vsseg4e8_v_i8m1_m(__VA_ARGS__) +#define vsseg5e8_v_i8m1_m(...) __riscv_vsseg5e8_v_i8m1_m(__VA_ARGS__) +#define vsseg6e8_v_i8m1_m(...) __riscv_vsseg6e8_v_i8m1_m(__VA_ARGS__) +#define vsseg7e8_v_i8m1_m(...) __riscv_vsseg7e8_v_i8m1_m(__VA_ARGS__) +#define vsseg8e8_v_i8m1_m(...) __riscv_vsseg8e8_v_i8m1_m(__VA_ARGS__) +#define vsseg2e8_v_i8m2_m(...) __riscv_vsseg2e8_v_i8m2_m(__VA_ARGS__) +#define vsseg3e8_v_i8m2_m(...) __riscv_vsseg3e8_v_i8m2_m(__VA_ARGS__) +#define vsseg4e8_v_i8m2_m(...) __riscv_vsseg4e8_v_i8m2_m(__VA_ARGS__) +#define vsseg2e8_v_i8m4_m(...) __riscv_vsseg2e8_v_i8m4_m(__VA_ARGS__) +#define vsseg2e16_v_i16mf4_m(...) __riscv_vsseg2e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg3e16_v_i16mf4_m(...) __riscv_vsseg3e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg4e16_v_i16mf4_m(...) __riscv_vsseg4e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg5e16_v_i16mf4_m(...) __riscv_vsseg5e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg6e16_v_i16mf4_m(...) __riscv_vsseg6e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg7e16_v_i16mf4_m(...) __riscv_vsseg7e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg8e16_v_i16mf4_m(...) __riscv_vsseg8e16_v_i16mf4_m(__VA_ARGS__) +#define vsseg2e16_v_i16mf2_m(...) __riscv_vsseg2e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg3e16_v_i16mf2_m(...) __riscv_vsseg3e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg4e16_v_i16mf2_m(...) __riscv_vsseg4e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg5e16_v_i16mf2_m(...) __riscv_vsseg5e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg6e16_v_i16mf2_m(...) __riscv_vsseg6e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg7e16_v_i16mf2_m(...) __riscv_vsseg7e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg8e16_v_i16mf2_m(...) __riscv_vsseg8e16_v_i16mf2_m(__VA_ARGS__) +#define vsseg2e16_v_i16m1_m(...) __riscv_vsseg2e16_v_i16m1_m(__VA_ARGS__) +#define vsseg3e16_v_i16m1_m(...) __riscv_vsseg3e16_v_i16m1_m(__VA_ARGS__) +#define vsseg4e16_v_i16m1_m(...) __riscv_vsseg4e16_v_i16m1_m(__VA_ARGS__) +#define vsseg5e16_v_i16m1_m(...) __riscv_vsseg5e16_v_i16m1_m(__VA_ARGS__) +#define vsseg6e16_v_i16m1_m(...) __riscv_vsseg6e16_v_i16m1_m(__VA_ARGS__) +#define vsseg7e16_v_i16m1_m(...) __riscv_vsseg7e16_v_i16m1_m(__VA_ARGS__) +#define vsseg8e16_v_i16m1_m(...) __riscv_vsseg8e16_v_i16m1_m(__VA_ARGS__) +#define vsseg2e16_v_i16m2_m(...) __riscv_vsseg2e16_v_i16m2_m(__VA_ARGS__) +#define vsseg3e16_v_i16m2_m(...) __riscv_vsseg3e16_v_i16m2_m(__VA_ARGS__) +#define vsseg4e16_v_i16m2_m(...) __riscv_vsseg4e16_v_i16m2_m(__VA_ARGS__) +#define vsseg2e16_v_i16m4_m(...) __riscv_vsseg2e16_v_i16m4_m(__VA_ARGS__) +#define vsseg2e32_v_i32mf2_m(...) __riscv_vsseg2e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg3e32_v_i32mf2_m(...) __riscv_vsseg3e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg4e32_v_i32mf2_m(...) __riscv_vsseg4e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg5e32_v_i32mf2_m(...) __riscv_vsseg5e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg6e32_v_i32mf2_m(...) __riscv_vsseg6e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg7e32_v_i32mf2_m(...) __riscv_vsseg7e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg8e32_v_i32mf2_m(...) __riscv_vsseg8e32_v_i32mf2_m(__VA_ARGS__) +#define vsseg2e32_v_i32m1_m(...) __riscv_vsseg2e32_v_i32m1_m(__VA_ARGS__) +#define vsseg3e32_v_i32m1_m(...) __riscv_vsseg3e32_v_i32m1_m(__VA_ARGS__) +#define vsseg4e32_v_i32m1_m(...) __riscv_vsseg4e32_v_i32m1_m(__VA_ARGS__) +#define vsseg5e32_v_i32m1_m(...) __riscv_vsseg5e32_v_i32m1_m(__VA_ARGS__) +#define vsseg6e32_v_i32m1_m(...) __riscv_vsseg6e32_v_i32m1_m(__VA_ARGS__) +#define vsseg7e32_v_i32m1_m(...) __riscv_vsseg7e32_v_i32m1_m(__VA_ARGS__) +#define vsseg8e32_v_i32m1_m(...) __riscv_vsseg8e32_v_i32m1_m(__VA_ARGS__) +#define vsseg2e32_v_i32m2_m(...) __riscv_vsseg2e32_v_i32m2_m(__VA_ARGS__) +#define vsseg3e32_v_i32m2_m(...) __riscv_vsseg3e32_v_i32m2_m(__VA_ARGS__) +#define vsseg4e32_v_i32m2_m(...) __riscv_vsseg4e32_v_i32m2_m(__VA_ARGS__) +#define vsseg2e32_v_i32m4_m(...) __riscv_vsseg2e32_v_i32m4_m(__VA_ARGS__) +#define vsseg2e64_v_i64m1_m(...) __riscv_vsseg2e64_v_i64m1_m(__VA_ARGS__) +#define vsseg3e64_v_i64m1_m(...) __riscv_vsseg3e64_v_i64m1_m(__VA_ARGS__) +#define vsseg4e64_v_i64m1_m(...) __riscv_vsseg4e64_v_i64m1_m(__VA_ARGS__) +#define vsseg5e64_v_i64m1_m(...) __riscv_vsseg5e64_v_i64m1_m(__VA_ARGS__) +#define vsseg6e64_v_i64m1_m(...) __riscv_vsseg6e64_v_i64m1_m(__VA_ARGS__) +#define vsseg7e64_v_i64m1_m(...) __riscv_vsseg7e64_v_i64m1_m(__VA_ARGS__) +#define vsseg8e64_v_i64m1_m(...) __riscv_vsseg8e64_v_i64m1_m(__VA_ARGS__) +#define vsseg2e64_v_i64m2_m(...) __riscv_vsseg2e64_v_i64m2_m(__VA_ARGS__) +#define vsseg3e64_v_i64m2_m(...) __riscv_vsseg3e64_v_i64m2_m(__VA_ARGS__) +#define vsseg4e64_v_i64m2_m(...) __riscv_vsseg4e64_v_i64m2_m(__VA_ARGS__) +#define vsseg2e64_v_i64m4_m(...) __riscv_vsseg2e64_v_i64m4_m(__VA_ARGS__) +#define vsseg2e8_v_u8mf8_m(...) __riscv_vsseg2e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg3e8_v_u8mf8_m(...) __riscv_vsseg3e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg4e8_v_u8mf8_m(...) __riscv_vsseg4e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg5e8_v_u8mf8_m(...) __riscv_vsseg5e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg6e8_v_u8mf8_m(...) __riscv_vsseg6e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg7e8_v_u8mf8_m(...) __riscv_vsseg7e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg8e8_v_u8mf8_m(...) __riscv_vsseg8e8_v_u8mf8_m(__VA_ARGS__) +#define vsseg2e8_v_u8mf4_m(...) __riscv_vsseg2e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg3e8_v_u8mf4_m(...) __riscv_vsseg3e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg4e8_v_u8mf4_m(...) __riscv_vsseg4e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg5e8_v_u8mf4_m(...) __riscv_vsseg5e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg6e8_v_u8mf4_m(...) __riscv_vsseg6e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg7e8_v_u8mf4_m(...) __riscv_vsseg7e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg8e8_v_u8mf4_m(...) __riscv_vsseg8e8_v_u8mf4_m(__VA_ARGS__) +#define vsseg2e8_v_u8mf2_m(...) __riscv_vsseg2e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg3e8_v_u8mf2_m(...) __riscv_vsseg3e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg4e8_v_u8mf2_m(...) __riscv_vsseg4e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg5e8_v_u8mf2_m(...) __riscv_vsseg5e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg6e8_v_u8mf2_m(...) __riscv_vsseg6e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg7e8_v_u8mf2_m(...) __riscv_vsseg7e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg8e8_v_u8mf2_m(...) __riscv_vsseg8e8_v_u8mf2_m(__VA_ARGS__) +#define vsseg2e8_v_u8m1_m(...) __riscv_vsseg2e8_v_u8m1_m(__VA_ARGS__) +#define vsseg3e8_v_u8m1_m(...) __riscv_vsseg3e8_v_u8m1_m(__VA_ARGS__) +#define vsseg4e8_v_u8m1_m(...) __riscv_vsseg4e8_v_u8m1_m(__VA_ARGS__) +#define vsseg5e8_v_u8m1_m(...) __riscv_vsseg5e8_v_u8m1_m(__VA_ARGS__) +#define vsseg6e8_v_u8m1_m(...) __riscv_vsseg6e8_v_u8m1_m(__VA_ARGS__) +#define vsseg7e8_v_u8m1_m(...) __riscv_vsseg7e8_v_u8m1_m(__VA_ARGS__) +#define vsseg8e8_v_u8m1_m(...) __riscv_vsseg8e8_v_u8m1_m(__VA_ARGS__) +#define vsseg2e8_v_u8m2_m(...) __riscv_vsseg2e8_v_u8m2_m(__VA_ARGS__) +#define vsseg3e8_v_u8m2_m(...) __riscv_vsseg3e8_v_u8m2_m(__VA_ARGS__) +#define vsseg4e8_v_u8m2_m(...) __riscv_vsseg4e8_v_u8m2_m(__VA_ARGS__) +#define vsseg2e8_v_u8m4_m(...) __riscv_vsseg2e8_v_u8m4_m(__VA_ARGS__) +#define vsseg2e16_v_u16mf4_m(...) __riscv_vsseg2e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg3e16_v_u16mf4_m(...) __riscv_vsseg3e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg4e16_v_u16mf4_m(...) __riscv_vsseg4e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg5e16_v_u16mf4_m(...) __riscv_vsseg5e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg6e16_v_u16mf4_m(...) __riscv_vsseg6e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg7e16_v_u16mf4_m(...) __riscv_vsseg7e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg8e16_v_u16mf4_m(...) __riscv_vsseg8e16_v_u16mf4_m(__VA_ARGS__) +#define vsseg2e16_v_u16mf2_m(...) __riscv_vsseg2e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg3e16_v_u16mf2_m(...) __riscv_vsseg3e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg4e16_v_u16mf2_m(...) __riscv_vsseg4e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg5e16_v_u16mf2_m(...) __riscv_vsseg5e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg6e16_v_u16mf2_m(...) __riscv_vsseg6e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg7e16_v_u16mf2_m(...) __riscv_vsseg7e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg8e16_v_u16mf2_m(...) __riscv_vsseg8e16_v_u16mf2_m(__VA_ARGS__) +#define vsseg2e16_v_u16m1_m(...) __riscv_vsseg2e16_v_u16m1_m(__VA_ARGS__) +#define vsseg3e16_v_u16m1_m(...) __riscv_vsseg3e16_v_u16m1_m(__VA_ARGS__) +#define vsseg4e16_v_u16m1_m(...) __riscv_vsseg4e16_v_u16m1_m(__VA_ARGS__) +#define vsseg5e16_v_u16m1_m(...) __riscv_vsseg5e16_v_u16m1_m(__VA_ARGS__) +#define vsseg6e16_v_u16m1_m(...) __riscv_vsseg6e16_v_u16m1_m(__VA_ARGS__) +#define vsseg7e16_v_u16m1_m(...) __riscv_vsseg7e16_v_u16m1_m(__VA_ARGS__) +#define vsseg8e16_v_u16m1_m(...) __riscv_vsseg8e16_v_u16m1_m(__VA_ARGS__) +#define vsseg2e16_v_u16m2_m(...) __riscv_vsseg2e16_v_u16m2_m(__VA_ARGS__) +#define vsseg3e16_v_u16m2_m(...) __riscv_vsseg3e16_v_u16m2_m(__VA_ARGS__) +#define vsseg4e16_v_u16m2_m(...) __riscv_vsseg4e16_v_u16m2_m(__VA_ARGS__) +#define vsseg2e16_v_u16m4_m(...) __riscv_vsseg2e16_v_u16m4_m(__VA_ARGS__) +#define vsseg2e32_v_u32mf2_m(...) __riscv_vsseg2e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg3e32_v_u32mf2_m(...) __riscv_vsseg3e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg4e32_v_u32mf2_m(...) __riscv_vsseg4e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg5e32_v_u32mf2_m(...) __riscv_vsseg5e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg6e32_v_u32mf2_m(...) __riscv_vsseg6e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg7e32_v_u32mf2_m(...) __riscv_vsseg7e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg8e32_v_u32mf2_m(...) __riscv_vsseg8e32_v_u32mf2_m(__VA_ARGS__) +#define vsseg2e32_v_u32m1_m(...) __riscv_vsseg2e32_v_u32m1_m(__VA_ARGS__) +#define vsseg3e32_v_u32m1_m(...) __riscv_vsseg3e32_v_u32m1_m(__VA_ARGS__) +#define vsseg4e32_v_u32m1_m(...) __riscv_vsseg4e32_v_u32m1_m(__VA_ARGS__) +#define vsseg5e32_v_u32m1_m(...) __riscv_vsseg5e32_v_u32m1_m(__VA_ARGS__) +#define vsseg6e32_v_u32m1_m(...) __riscv_vsseg6e32_v_u32m1_m(__VA_ARGS__) +#define vsseg7e32_v_u32m1_m(...) __riscv_vsseg7e32_v_u32m1_m(__VA_ARGS__) +#define vsseg8e32_v_u32m1_m(...) __riscv_vsseg8e32_v_u32m1_m(__VA_ARGS__) +#define vsseg2e32_v_u32m2_m(...) __riscv_vsseg2e32_v_u32m2_m(__VA_ARGS__) +#define vsseg3e32_v_u32m2_m(...) __riscv_vsseg3e32_v_u32m2_m(__VA_ARGS__) +#define vsseg4e32_v_u32m2_m(...) __riscv_vsseg4e32_v_u32m2_m(__VA_ARGS__) +#define vsseg2e32_v_u32m4_m(...) __riscv_vsseg2e32_v_u32m4_m(__VA_ARGS__) +#define vsseg2e64_v_u64m1_m(...) __riscv_vsseg2e64_v_u64m1_m(__VA_ARGS__) +#define vsseg3e64_v_u64m1_m(...) __riscv_vsseg3e64_v_u64m1_m(__VA_ARGS__) +#define vsseg4e64_v_u64m1_m(...) __riscv_vsseg4e64_v_u64m1_m(__VA_ARGS__) +#define vsseg5e64_v_u64m1_m(...) __riscv_vsseg5e64_v_u64m1_m(__VA_ARGS__) +#define vsseg6e64_v_u64m1_m(...) __riscv_vsseg6e64_v_u64m1_m(__VA_ARGS__) +#define vsseg7e64_v_u64m1_m(...) __riscv_vsseg7e64_v_u64m1_m(__VA_ARGS__) +#define vsseg8e64_v_u64m1_m(...) __riscv_vsseg8e64_v_u64m1_m(__VA_ARGS__) +#define vsseg2e64_v_u64m2_m(...) __riscv_vsseg2e64_v_u64m2_m(__VA_ARGS__) +#define vsseg3e64_v_u64m2_m(...) __riscv_vsseg3e64_v_u64m2_m(__VA_ARGS__) +#define vsseg4e64_v_u64m2_m(...) __riscv_vsseg4e64_v_u64m2_m(__VA_ARGS__) +#define vsseg2e64_v_u64m4_m(...) __riscv_vsseg2e64_v_u64m4_m(__VA_ARGS__) +#define vlsseg2e16_v_f16mf4(...) __riscv_vlsseg2e16_v_f16mf4(__VA_ARGS__) +#define vlsseg3e16_v_f16mf4(...) __riscv_vlsseg3e16_v_f16mf4(__VA_ARGS__) +#define vlsseg4e16_v_f16mf4(...) __riscv_vlsseg4e16_v_f16mf4(__VA_ARGS__) +#define vlsseg5e16_v_f16mf4(...) __riscv_vlsseg5e16_v_f16mf4(__VA_ARGS__) +#define vlsseg6e16_v_f16mf4(...) __riscv_vlsseg6e16_v_f16mf4(__VA_ARGS__) +#define vlsseg7e16_v_f16mf4(...) __riscv_vlsseg7e16_v_f16mf4(__VA_ARGS__) +#define vlsseg8e16_v_f16mf4(...) __riscv_vlsseg8e16_v_f16mf4(__VA_ARGS__) +#define vlsseg2e16_v_f16mf2(...) __riscv_vlsseg2e16_v_f16mf2(__VA_ARGS__) +#define vlsseg3e16_v_f16mf2(...) __riscv_vlsseg3e16_v_f16mf2(__VA_ARGS__) +#define vlsseg4e16_v_f16mf2(...) __riscv_vlsseg4e16_v_f16mf2(__VA_ARGS__) +#define vlsseg5e16_v_f16mf2(...) __riscv_vlsseg5e16_v_f16mf2(__VA_ARGS__) +#define vlsseg6e16_v_f16mf2(...) __riscv_vlsseg6e16_v_f16mf2(__VA_ARGS__) +#define vlsseg7e16_v_f16mf2(...) __riscv_vlsseg7e16_v_f16mf2(__VA_ARGS__) +#define vlsseg8e16_v_f16mf2(...) __riscv_vlsseg8e16_v_f16mf2(__VA_ARGS__) +#define vlsseg2e16_v_f16m1(...) __riscv_vlsseg2e16_v_f16m1(__VA_ARGS__) +#define vlsseg3e16_v_f16m1(...) __riscv_vlsseg3e16_v_f16m1(__VA_ARGS__) +#define vlsseg4e16_v_f16m1(...) __riscv_vlsseg4e16_v_f16m1(__VA_ARGS__) +#define vlsseg5e16_v_f16m1(...) __riscv_vlsseg5e16_v_f16m1(__VA_ARGS__) +#define vlsseg6e16_v_f16m1(...) __riscv_vlsseg6e16_v_f16m1(__VA_ARGS__) +#define vlsseg7e16_v_f16m1(...) __riscv_vlsseg7e16_v_f16m1(__VA_ARGS__) +#define vlsseg8e16_v_f16m1(...) __riscv_vlsseg8e16_v_f16m1(__VA_ARGS__) +#define vlsseg2e16_v_f16m2(...) __riscv_vlsseg2e16_v_f16m2(__VA_ARGS__) +#define vlsseg3e16_v_f16m2(...) __riscv_vlsseg3e16_v_f16m2(__VA_ARGS__) +#define vlsseg4e16_v_f16m2(...) __riscv_vlsseg4e16_v_f16m2(__VA_ARGS__) +#define vlsseg2e16_v_f16m4(...) __riscv_vlsseg2e16_v_f16m4(__VA_ARGS__) +#define vlsseg2e32_v_f32mf2(...) __riscv_vlsseg2e32_v_f32mf2(__VA_ARGS__) +#define vlsseg3e32_v_f32mf2(...) __riscv_vlsseg3e32_v_f32mf2(__VA_ARGS__) +#define vlsseg4e32_v_f32mf2(...) __riscv_vlsseg4e32_v_f32mf2(__VA_ARGS__) +#define vlsseg5e32_v_f32mf2(...) __riscv_vlsseg5e32_v_f32mf2(__VA_ARGS__) +#define vlsseg6e32_v_f32mf2(...) __riscv_vlsseg6e32_v_f32mf2(__VA_ARGS__) +#define vlsseg7e32_v_f32mf2(...) __riscv_vlsseg7e32_v_f32mf2(__VA_ARGS__) +#define vlsseg8e32_v_f32mf2(...) __riscv_vlsseg8e32_v_f32mf2(__VA_ARGS__) +#define vlsseg2e32_v_f32m1(...) __riscv_vlsseg2e32_v_f32m1(__VA_ARGS__) +#define vlsseg3e32_v_f32m1(...) __riscv_vlsseg3e32_v_f32m1(__VA_ARGS__) +#define vlsseg4e32_v_f32m1(...) __riscv_vlsseg4e32_v_f32m1(__VA_ARGS__) +#define vlsseg5e32_v_f32m1(...) __riscv_vlsseg5e32_v_f32m1(__VA_ARGS__) +#define vlsseg6e32_v_f32m1(...) __riscv_vlsseg6e32_v_f32m1(__VA_ARGS__) +#define vlsseg7e32_v_f32m1(...) __riscv_vlsseg7e32_v_f32m1(__VA_ARGS__) +#define vlsseg8e32_v_f32m1(...) __riscv_vlsseg8e32_v_f32m1(__VA_ARGS__) +#define vlsseg2e32_v_f32m2(...) __riscv_vlsseg2e32_v_f32m2(__VA_ARGS__) +#define vlsseg3e32_v_f32m2(...) __riscv_vlsseg3e32_v_f32m2(__VA_ARGS__) +#define vlsseg4e32_v_f32m2(...) __riscv_vlsseg4e32_v_f32m2(__VA_ARGS__) +#define vlsseg2e32_v_f32m4(...) __riscv_vlsseg2e32_v_f32m4(__VA_ARGS__) +#define vlsseg2e64_v_f64m1(...) __riscv_vlsseg2e64_v_f64m1(__VA_ARGS__) +#define vlsseg3e64_v_f64m1(...) __riscv_vlsseg3e64_v_f64m1(__VA_ARGS__) +#define vlsseg4e64_v_f64m1(...) __riscv_vlsseg4e64_v_f64m1(__VA_ARGS__) +#define vlsseg5e64_v_f64m1(...) __riscv_vlsseg5e64_v_f64m1(__VA_ARGS__) +#define vlsseg6e64_v_f64m1(...) __riscv_vlsseg6e64_v_f64m1(__VA_ARGS__) +#define vlsseg7e64_v_f64m1(...) __riscv_vlsseg7e64_v_f64m1(__VA_ARGS__) +#define vlsseg8e64_v_f64m1(...) __riscv_vlsseg8e64_v_f64m1(__VA_ARGS__) +#define vlsseg2e64_v_f64m2(...) __riscv_vlsseg2e64_v_f64m2(__VA_ARGS__) +#define vlsseg3e64_v_f64m2(...) __riscv_vlsseg3e64_v_f64m2(__VA_ARGS__) +#define vlsseg4e64_v_f64m2(...) __riscv_vlsseg4e64_v_f64m2(__VA_ARGS__) +#define vlsseg2e64_v_f64m4(...) __riscv_vlsseg2e64_v_f64m4(__VA_ARGS__) +#define vlsseg2e8_v_i8mf8(...) __riscv_vlsseg2e8_v_i8mf8(__VA_ARGS__) +#define vlsseg3e8_v_i8mf8(...) __riscv_vlsseg3e8_v_i8mf8(__VA_ARGS__) +#define vlsseg4e8_v_i8mf8(...) __riscv_vlsseg4e8_v_i8mf8(__VA_ARGS__) +#define vlsseg5e8_v_i8mf8(...) __riscv_vlsseg5e8_v_i8mf8(__VA_ARGS__) +#define vlsseg6e8_v_i8mf8(...) __riscv_vlsseg6e8_v_i8mf8(__VA_ARGS__) +#define vlsseg7e8_v_i8mf8(...) __riscv_vlsseg7e8_v_i8mf8(__VA_ARGS__) +#define vlsseg8e8_v_i8mf8(...) __riscv_vlsseg8e8_v_i8mf8(__VA_ARGS__) +#define vlsseg2e8_v_i8mf4(...) __riscv_vlsseg2e8_v_i8mf4(__VA_ARGS__) +#define vlsseg3e8_v_i8mf4(...) __riscv_vlsseg3e8_v_i8mf4(__VA_ARGS__) +#define vlsseg4e8_v_i8mf4(...) __riscv_vlsseg4e8_v_i8mf4(__VA_ARGS__) +#define vlsseg5e8_v_i8mf4(...) __riscv_vlsseg5e8_v_i8mf4(__VA_ARGS__) +#define vlsseg6e8_v_i8mf4(...) __riscv_vlsseg6e8_v_i8mf4(__VA_ARGS__) +#define vlsseg7e8_v_i8mf4(...) __riscv_vlsseg7e8_v_i8mf4(__VA_ARGS__) +#define vlsseg8e8_v_i8mf4(...) __riscv_vlsseg8e8_v_i8mf4(__VA_ARGS__) +#define vlsseg2e8_v_i8mf2(...) __riscv_vlsseg2e8_v_i8mf2(__VA_ARGS__) +#define vlsseg3e8_v_i8mf2(...) __riscv_vlsseg3e8_v_i8mf2(__VA_ARGS__) +#define vlsseg4e8_v_i8mf2(...) __riscv_vlsseg4e8_v_i8mf2(__VA_ARGS__) +#define vlsseg5e8_v_i8mf2(...) __riscv_vlsseg5e8_v_i8mf2(__VA_ARGS__) +#define vlsseg6e8_v_i8mf2(...) __riscv_vlsseg6e8_v_i8mf2(__VA_ARGS__) +#define vlsseg7e8_v_i8mf2(...) __riscv_vlsseg7e8_v_i8mf2(__VA_ARGS__) +#define vlsseg8e8_v_i8mf2(...) __riscv_vlsseg8e8_v_i8mf2(__VA_ARGS__) +#define vlsseg2e8_v_i8m1(...) __riscv_vlsseg2e8_v_i8m1(__VA_ARGS__) +#define vlsseg3e8_v_i8m1(...) __riscv_vlsseg3e8_v_i8m1(__VA_ARGS__) +#define vlsseg4e8_v_i8m1(...) __riscv_vlsseg4e8_v_i8m1(__VA_ARGS__) +#define vlsseg5e8_v_i8m1(...) __riscv_vlsseg5e8_v_i8m1(__VA_ARGS__) +#define vlsseg6e8_v_i8m1(...) __riscv_vlsseg6e8_v_i8m1(__VA_ARGS__) +#define vlsseg7e8_v_i8m1(...) __riscv_vlsseg7e8_v_i8m1(__VA_ARGS__) +#define vlsseg8e8_v_i8m1(...) __riscv_vlsseg8e8_v_i8m1(__VA_ARGS__) +#define vlsseg2e8_v_i8m2(...) __riscv_vlsseg2e8_v_i8m2(__VA_ARGS__) +#define vlsseg3e8_v_i8m2(...) __riscv_vlsseg3e8_v_i8m2(__VA_ARGS__) +#define vlsseg4e8_v_i8m2(...) __riscv_vlsseg4e8_v_i8m2(__VA_ARGS__) +#define vlsseg2e8_v_i8m4(...) __riscv_vlsseg2e8_v_i8m4(__VA_ARGS__) +#define vlsseg2e16_v_i16mf4(...) __riscv_vlsseg2e16_v_i16mf4(__VA_ARGS__) +#define vlsseg3e16_v_i16mf4(...) __riscv_vlsseg3e16_v_i16mf4(__VA_ARGS__) +#define vlsseg4e16_v_i16mf4(...) __riscv_vlsseg4e16_v_i16mf4(__VA_ARGS__) +#define vlsseg5e16_v_i16mf4(...) __riscv_vlsseg5e16_v_i16mf4(__VA_ARGS__) +#define vlsseg6e16_v_i16mf4(...) __riscv_vlsseg6e16_v_i16mf4(__VA_ARGS__) +#define vlsseg7e16_v_i16mf4(...) __riscv_vlsseg7e16_v_i16mf4(__VA_ARGS__) +#define vlsseg8e16_v_i16mf4(...) __riscv_vlsseg8e16_v_i16mf4(__VA_ARGS__) +#define vlsseg2e16_v_i16mf2(...) __riscv_vlsseg2e16_v_i16mf2(__VA_ARGS__) +#define vlsseg3e16_v_i16mf2(...) __riscv_vlsseg3e16_v_i16mf2(__VA_ARGS__) +#define vlsseg4e16_v_i16mf2(...) __riscv_vlsseg4e16_v_i16mf2(__VA_ARGS__) +#define vlsseg5e16_v_i16mf2(...) __riscv_vlsseg5e16_v_i16mf2(__VA_ARGS__) +#define vlsseg6e16_v_i16mf2(...) __riscv_vlsseg6e16_v_i16mf2(__VA_ARGS__) +#define vlsseg7e16_v_i16mf2(...) __riscv_vlsseg7e16_v_i16mf2(__VA_ARGS__) +#define vlsseg8e16_v_i16mf2(...) __riscv_vlsseg8e16_v_i16mf2(__VA_ARGS__) +#define vlsseg2e16_v_i16m1(...) __riscv_vlsseg2e16_v_i16m1(__VA_ARGS__) +#define vlsseg3e16_v_i16m1(...) __riscv_vlsseg3e16_v_i16m1(__VA_ARGS__) +#define vlsseg4e16_v_i16m1(...) __riscv_vlsseg4e16_v_i16m1(__VA_ARGS__) +#define vlsseg5e16_v_i16m1(...) __riscv_vlsseg5e16_v_i16m1(__VA_ARGS__) +#define vlsseg6e16_v_i16m1(...) __riscv_vlsseg6e16_v_i16m1(__VA_ARGS__) +#define vlsseg7e16_v_i16m1(...) __riscv_vlsseg7e16_v_i16m1(__VA_ARGS__) +#define vlsseg8e16_v_i16m1(...) __riscv_vlsseg8e16_v_i16m1(__VA_ARGS__) +#define vlsseg2e16_v_i16m2(...) __riscv_vlsseg2e16_v_i16m2(__VA_ARGS__) +#define vlsseg3e16_v_i16m2(...) __riscv_vlsseg3e16_v_i16m2(__VA_ARGS__) +#define vlsseg4e16_v_i16m2(...) __riscv_vlsseg4e16_v_i16m2(__VA_ARGS__) +#define vlsseg2e16_v_i16m4(...) __riscv_vlsseg2e16_v_i16m4(__VA_ARGS__) +#define vlsseg2e32_v_i32mf2(...) __riscv_vlsseg2e32_v_i32mf2(__VA_ARGS__) +#define vlsseg3e32_v_i32mf2(...) __riscv_vlsseg3e32_v_i32mf2(__VA_ARGS__) +#define vlsseg4e32_v_i32mf2(...) __riscv_vlsseg4e32_v_i32mf2(__VA_ARGS__) +#define vlsseg5e32_v_i32mf2(...) __riscv_vlsseg5e32_v_i32mf2(__VA_ARGS__) +#define vlsseg6e32_v_i32mf2(...) __riscv_vlsseg6e32_v_i32mf2(__VA_ARGS__) +#define vlsseg7e32_v_i32mf2(...) __riscv_vlsseg7e32_v_i32mf2(__VA_ARGS__) +#define vlsseg8e32_v_i32mf2(...) __riscv_vlsseg8e32_v_i32mf2(__VA_ARGS__) +#define vlsseg2e32_v_i32m1(...) __riscv_vlsseg2e32_v_i32m1(__VA_ARGS__) +#define vlsseg3e32_v_i32m1(...) __riscv_vlsseg3e32_v_i32m1(__VA_ARGS__) +#define vlsseg4e32_v_i32m1(...) __riscv_vlsseg4e32_v_i32m1(__VA_ARGS__) +#define vlsseg5e32_v_i32m1(...) __riscv_vlsseg5e32_v_i32m1(__VA_ARGS__) +#define vlsseg6e32_v_i32m1(...) __riscv_vlsseg6e32_v_i32m1(__VA_ARGS__) +#define vlsseg7e32_v_i32m1(...) __riscv_vlsseg7e32_v_i32m1(__VA_ARGS__) +#define vlsseg8e32_v_i32m1(...) __riscv_vlsseg8e32_v_i32m1(__VA_ARGS__) +#define vlsseg2e32_v_i32m2(...) __riscv_vlsseg2e32_v_i32m2(__VA_ARGS__) +#define vlsseg3e32_v_i32m2(...) __riscv_vlsseg3e32_v_i32m2(__VA_ARGS__) +#define vlsseg4e32_v_i32m2(...) __riscv_vlsseg4e32_v_i32m2(__VA_ARGS__) +#define vlsseg2e32_v_i32m4(...) __riscv_vlsseg2e32_v_i32m4(__VA_ARGS__) +#define vlsseg2e64_v_i64m1(...) __riscv_vlsseg2e64_v_i64m1(__VA_ARGS__) +#define vlsseg3e64_v_i64m1(...) __riscv_vlsseg3e64_v_i64m1(__VA_ARGS__) +#define vlsseg4e64_v_i64m1(...) __riscv_vlsseg4e64_v_i64m1(__VA_ARGS__) +#define vlsseg5e64_v_i64m1(...) __riscv_vlsseg5e64_v_i64m1(__VA_ARGS__) +#define vlsseg6e64_v_i64m1(...) __riscv_vlsseg6e64_v_i64m1(__VA_ARGS__) +#define vlsseg7e64_v_i64m1(...) __riscv_vlsseg7e64_v_i64m1(__VA_ARGS__) +#define vlsseg8e64_v_i64m1(...) __riscv_vlsseg8e64_v_i64m1(__VA_ARGS__) +#define vlsseg2e64_v_i64m2(...) __riscv_vlsseg2e64_v_i64m2(__VA_ARGS__) +#define vlsseg3e64_v_i64m2(...) __riscv_vlsseg3e64_v_i64m2(__VA_ARGS__) +#define vlsseg4e64_v_i64m2(...) __riscv_vlsseg4e64_v_i64m2(__VA_ARGS__) +#define vlsseg2e64_v_i64m4(...) __riscv_vlsseg2e64_v_i64m4(__VA_ARGS__) +#define vlsseg2e8_v_u8mf8(...) __riscv_vlsseg2e8_v_u8mf8(__VA_ARGS__) +#define vlsseg3e8_v_u8mf8(...) __riscv_vlsseg3e8_v_u8mf8(__VA_ARGS__) +#define vlsseg4e8_v_u8mf8(...) __riscv_vlsseg4e8_v_u8mf8(__VA_ARGS__) +#define vlsseg5e8_v_u8mf8(...) __riscv_vlsseg5e8_v_u8mf8(__VA_ARGS__) +#define vlsseg6e8_v_u8mf8(...) __riscv_vlsseg6e8_v_u8mf8(__VA_ARGS__) +#define vlsseg7e8_v_u8mf8(...) __riscv_vlsseg7e8_v_u8mf8(__VA_ARGS__) +#define vlsseg8e8_v_u8mf8(...) __riscv_vlsseg8e8_v_u8mf8(__VA_ARGS__) +#define vlsseg2e8_v_u8mf4(...) __riscv_vlsseg2e8_v_u8mf4(__VA_ARGS__) +#define vlsseg3e8_v_u8mf4(...) __riscv_vlsseg3e8_v_u8mf4(__VA_ARGS__) +#define vlsseg4e8_v_u8mf4(...) __riscv_vlsseg4e8_v_u8mf4(__VA_ARGS__) +#define vlsseg5e8_v_u8mf4(...) __riscv_vlsseg5e8_v_u8mf4(__VA_ARGS__) +#define vlsseg6e8_v_u8mf4(...) __riscv_vlsseg6e8_v_u8mf4(__VA_ARGS__) +#define vlsseg7e8_v_u8mf4(...) __riscv_vlsseg7e8_v_u8mf4(__VA_ARGS__) +#define vlsseg8e8_v_u8mf4(...) __riscv_vlsseg8e8_v_u8mf4(__VA_ARGS__) +#define vlsseg2e8_v_u8mf2(...) __riscv_vlsseg2e8_v_u8mf2(__VA_ARGS__) +#define vlsseg3e8_v_u8mf2(...) __riscv_vlsseg3e8_v_u8mf2(__VA_ARGS__) +#define vlsseg4e8_v_u8mf2(...) __riscv_vlsseg4e8_v_u8mf2(__VA_ARGS__) +#define vlsseg5e8_v_u8mf2(...) __riscv_vlsseg5e8_v_u8mf2(__VA_ARGS__) +#define vlsseg6e8_v_u8mf2(...) __riscv_vlsseg6e8_v_u8mf2(__VA_ARGS__) +#define vlsseg7e8_v_u8mf2(...) __riscv_vlsseg7e8_v_u8mf2(__VA_ARGS__) +#define vlsseg8e8_v_u8mf2(...) __riscv_vlsseg8e8_v_u8mf2(__VA_ARGS__) +#define vlsseg2e8_v_u8m1(...) __riscv_vlsseg2e8_v_u8m1(__VA_ARGS__) +#define vlsseg3e8_v_u8m1(...) __riscv_vlsseg3e8_v_u8m1(__VA_ARGS__) +#define vlsseg4e8_v_u8m1(...) __riscv_vlsseg4e8_v_u8m1(__VA_ARGS__) +#define vlsseg5e8_v_u8m1(...) __riscv_vlsseg5e8_v_u8m1(__VA_ARGS__) +#define vlsseg6e8_v_u8m1(...) __riscv_vlsseg6e8_v_u8m1(__VA_ARGS__) +#define vlsseg7e8_v_u8m1(...) __riscv_vlsseg7e8_v_u8m1(__VA_ARGS__) +#define vlsseg8e8_v_u8m1(...) __riscv_vlsseg8e8_v_u8m1(__VA_ARGS__) +#define vlsseg2e8_v_u8m2(...) __riscv_vlsseg2e8_v_u8m2(__VA_ARGS__) +#define vlsseg3e8_v_u8m2(...) __riscv_vlsseg3e8_v_u8m2(__VA_ARGS__) +#define vlsseg4e8_v_u8m2(...) __riscv_vlsseg4e8_v_u8m2(__VA_ARGS__) +#define vlsseg2e8_v_u8m4(...) __riscv_vlsseg2e8_v_u8m4(__VA_ARGS__) +#define vlsseg2e16_v_u16mf4(...) __riscv_vlsseg2e16_v_u16mf4(__VA_ARGS__) +#define vlsseg3e16_v_u16mf4(...) __riscv_vlsseg3e16_v_u16mf4(__VA_ARGS__) +#define vlsseg4e16_v_u16mf4(...) __riscv_vlsseg4e16_v_u16mf4(__VA_ARGS__) +#define vlsseg5e16_v_u16mf4(...) __riscv_vlsseg5e16_v_u16mf4(__VA_ARGS__) +#define vlsseg6e16_v_u16mf4(...) __riscv_vlsseg6e16_v_u16mf4(__VA_ARGS__) +#define vlsseg7e16_v_u16mf4(...) __riscv_vlsseg7e16_v_u16mf4(__VA_ARGS__) +#define vlsseg8e16_v_u16mf4(...) __riscv_vlsseg8e16_v_u16mf4(__VA_ARGS__) +#define vlsseg2e16_v_u16mf2(...) __riscv_vlsseg2e16_v_u16mf2(__VA_ARGS__) +#define vlsseg3e16_v_u16mf2(...) __riscv_vlsseg3e16_v_u16mf2(__VA_ARGS__) +#define vlsseg4e16_v_u16mf2(...) __riscv_vlsseg4e16_v_u16mf2(__VA_ARGS__) +#define vlsseg5e16_v_u16mf2(...) __riscv_vlsseg5e16_v_u16mf2(__VA_ARGS__) +#define vlsseg6e16_v_u16mf2(...) __riscv_vlsseg6e16_v_u16mf2(__VA_ARGS__) +#define vlsseg7e16_v_u16mf2(...) __riscv_vlsseg7e16_v_u16mf2(__VA_ARGS__) +#define vlsseg8e16_v_u16mf2(...) __riscv_vlsseg8e16_v_u16mf2(__VA_ARGS__) +#define vlsseg2e16_v_u16m1(...) __riscv_vlsseg2e16_v_u16m1(__VA_ARGS__) +#define vlsseg3e16_v_u16m1(...) __riscv_vlsseg3e16_v_u16m1(__VA_ARGS__) +#define vlsseg4e16_v_u16m1(...) __riscv_vlsseg4e16_v_u16m1(__VA_ARGS__) +#define vlsseg5e16_v_u16m1(...) __riscv_vlsseg5e16_v_u16m1(__VA_ARGS__) +#define vlsseg6e16_v_u16m1(...) __riscv_vlsseg6e16_v_u16m1(__VA_ARGS__) +#define vlsseg7e16_v_u16m1(...) __riscv_vlsseg7e16_v_u16m1(__VA_ARGS__) +#define vlsseg8e16_v_u16m1(...) __riscv_vlsseg8e16_v_u16m1(__VA_ARGS__) +#define vlsseg2e16_v_u16m2(...) __riscv_vlsseg2e16_v_u16m2(__VA_ARGS__) +#define vlsseg3e16_v_u16m2(...) __riscv_vlsseg3e16_v_u16m2(__VA_ARGS__) +#define vlsseg4e16_v_u16m2(...) __riscv_vlsseg4e16_v_u16m2(__VA_ARGS__) +#define vlsseg2e16_v_u16m4(...) __riscv_vlsseg2e16_v_u16m4(__VA_ARGS__) +#define vlsseg2e32_v_u32mf2(...) __riscv_vlsseg2e32_v_u32mf2(__VA_ARGS__) +#define vlsseg3e32_v_u32mf2(...) __riscv_vlsseg3e32_v_u32mf2(__VA_ARGS__) +#define vlsseg4e32_v_u32mf2(...) __riscv_vlsseg4e32_v_u32mf2(__VA_ARGS__) +#define vlsseg5e32_v_u32mf2(...) __riscv_vlsseg5e32_v_u32mf2(__VA_ARGS__) +#define vlsseg6e32_v_u32mf2(...) __riscv_vlsseg6e32_v_u32mf2(__VA_ARGS__) +#define vlsseg7e32_v_u32mf2(...) __riscv_vlsseg7e32_v_u32mf2(__VA_ARGS__) +#define vlsseg8e32_v_u32mf2(...) __riscv_vlsseg8e32_v_u32mf2(__VA_ARGS__) +#define vlsseg2e32_v_u32m1(...) __riscv_vlsseg2e32_v_u32m1(__VA_ARGS__) +#define vlsseg3e32_v_u32m1(...) __riscv_vlsseg3e32_v_u32m1(__VA_ARGS__) +#define vlsseg4e32_v_u32m1(...) __riscv_vlsseg4e32_v_u32m1(__VA_ARGS__) +#define vlsseg5e32_v_u32m1(...) __riscv_vlsseg5e32_v_u32m1(__VA_ARGS__) +#define vlsseg6e32_v_u32m1(...) __riscv_vlsseg6e32_v_u32m1(__VA_ARGS__) +#define vlsseg7e32_v_u32m1(...) __riscv_vlsseg7e32_v_u32m1(__VA_ARGS__) +#define vlsseg8e32_v_u32m1(...) __riscv_vlsseg8e32_v_u32m1(__VA_ARGS__) +#define vlsseg2e32_v_u32m2(...) __riscv_vlsseg2e32_v_u32m2(__VA_ARGS__) +#define vlsseg3e32_v_u32m2(...) __riscv_vlsseg3e32_v_u32m2(__VA_ARGS__) +#define vlsseg4e32_v_u32m2(...) __riscv_vlsseg4e32_v_u32m2(__VA_ARGS__) +#define vlsseg2e32_v_u32m4(...) __riscv_vlsseg2e32_v_u32m4(__VA_ARGS__) +#define vlsseg2e64_v_u64m1(...) __riscv_vlsseg2e64_v_u64m1(__VA_ARGS__) +#define vlsseg3e64_v_u64m1(...) __riscv_vlsseg3e64_v_u64m1(__VA_ARGS__) +#define vlsseg4e64_v_u64m1(...) __riscv_vlsseg4e64_v_u64m1(__VA_ARGS__) +#define vlsseg5e64_v_u64m1(...) __riscv_vlsseg5e64_v_u64m1(__VA_ARGS__) +#define vlsseg6e64_v_u64m1(...) __riscv_vlsseg6e64_v_u64m1(__VA_ARGS__) +#define vlsseg7e64_v_u64m1(...) __riscv_vlsseg7e64_v_u64m1(__VA_ARGS__) +#define vlsseg8e64_v_u64m1(...) __riscv_vlsseg8e64_v_u64m1(__VA_ARGS__) +#define vlsseg2e64_v_u64m2(...) __riscv_vlsseg2e64_v_u64m2(__VA_ARGS__) +#define vlsseg3e64_v_u64m2(...) __riscv_vlsseg3e64_v_u64m2(__VA_ARGS__) +#define vlsseg4e64_v_u64m2(...) __riscv_vlsseg4e64_v_u64m2(__VA_ARGS__) +#define vlsseg2e64_v_u64m4(...) __riscv_vlsseg2e64_v_u64m4(__VA_ARGS__) +// masked functions +#define vlsseg2e16_v_f16mf4_m(...) __riscv_vlsseg2e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg3e16_v_f16mf4_m(...) __riscv_vlsseg3e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg4e16_v_f16mf4_m(...) __riscv_vlsseg4e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg5e16_v_f16mf4_m(...) __riscv_vlsseg5e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg6e16_v_f16mf4_m(...) __riscv_vlsseg6e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg7e16_v_f16mf4_m(...) __riscv_vlsseg7e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg8e16_v_f16mf4_m(...) __riscv_vlsseg8e16_v_f16mf4_tumu(__VA_ARGS__) +#define vlsseg2e16_v_f16mf2_m(...) __riscv_vlsseg2e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_f16mf2_m(...) __riscv_vlsseg3e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_f16mf2_m(...) __riscv_vlsseg4e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg5e16_v_f16mf2_m(...) __riscv_vlsseg5e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg6e16_v_f16mf2_m(...) __riscv_vlsseg6e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg7e16_v_f16mf2_m(...) __riscv_vlsseg7e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg8e16_v_f16mf2_m(...) __riscv_vlsseg8e16_v_f16mf2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_f16m1_m(...) __riscv_vlsseg2e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg3e16_v_f16m1_m(...) __riscv_vlsseg3e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg4e16_v_f16m1_m(...) __riscv_vlsseg4e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg5e16_v_f16m1_m(...) __riscv_vlsseg5e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg6e16_v_f16m1_m(...) __riscv_vlsseg6e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg7e16_v_f16m1_m(...) __riscv_vlsseg7e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg8e16_v_f16m1_m(...) __riscv_vlsseg8e16_v_f16m1_tumu(__VA_ARGS__) +#define vlsseg2e16_v_f16m2_m(...) __riscv_vlsseg2e16_v_f16m2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_f16m2_m(...) __riscv_vlsseg3e16_v_f16m2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_f16m2_m(...) __riscv_vlsseg4e16_v_f16m2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_f16m4_m(...) __riscv_vlsseg2e16_v_f16m4_tumu(__VA_ARGS__) +#define vlsseg2e32_v_f32mf2_m(...) __riscv_vlsseg2e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_f32mf2_m(...) __riscv_vlsseg3e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_f32mf2_m(...) __riscv_vlsseg4e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg5e32_v_f32mf2_m(...) __riscv_vlsseg5e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg6e32_v_f32mf2_m(...) __riscv_vlsseg6e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg7e32_v_f32mf2_m(...) __riscv_vlsseg7e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg8e32_v_f32mf2_m(...) __riscv_vlsseg8e32_v_f32mf2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_f32m1_m(...) __riscv_vlsseg2e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg3e32_v_f32m1_m(...) __riscv_vlsseg3e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg4e32_v_f32m1_m(...) __riscv_vlsseg4e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg5e32_v_f32m1_m(...) __riscv_vlsseg5e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg6e32_v_f32m1_m(...) __riscv_vlsseg6e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg7e32_v_f32m1_m(...) __riscv_vlsseg7e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg8e32_v_f32m1_m(...) __riscv_vlsseg8e32_v_f32m1_tumu(__VA_ARGS__) +#define vlsseg2e32_v_f32m2_m(...) __riscv_vlsseg2e32_v_f32m2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_f32m2_m(...) __riscv_vlsseg3e32_v_f32m2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_f32m2_m(...) __riscv_vlsseg4e32_v_f32m2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_f32m4_m(...) __riscv_vlsseg2e32_v_f32m4_tumu(__VA_ARGS__) +#define vlsseg2e64_v_f64m1_m(...) __riscv_vlsseg2e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg3e64_v_f64m1_m(...) __riscv_vlsseg3e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg4e64_v_f64m1_m(...) __riscv_vlsseg4e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg5e64_v_f64m1_m(...) __riscv_vlsseg5e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg6e64_v_f64m1_m(...) __riscv_vlsseg6e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg7e64_v_f64m1_m(...) __riscv_vlsseg7e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg8e64_v_f64m1_m(...) __riscv_vlsseg8e64_v_f64m1_tumu(__VA_ARGS__) +#define vlsseg2e64_v_f64m2_m(...) __riscv_vlsseg2e64_v_f64m2_tumu(__VA_ARGS__) +#define vlsseg3e64_v_f64m2_m(...) __riscv_vlsseg3e64_v_f64m2_tumu(__VA_ARGS__) +#define vlsseg4e64_v_f64m2_m(...) __riscv_vlsseg4e64_v_f64m2_tumu(__VA_ARGS__) +#define vlsseg2e64_v_f64m4_m(...) __riscv_vlsseg2e64_v_f64m4_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8mf8_m(...) __riscv_vlsseg2e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg3e8_v_i8mf8_m(...) __riscv_vlsseg3e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg4e8_v_i8mf8_m(...) __riscv_vlsseg4e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg5e8_v_i8mf8_m(...) __riscv_vlsseg5e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg6e8_v_i8mf8_m(...) __riscv_vlsseg6e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg7e8_v_i8mf8_m(...) __riscv_vlsseg7e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg8e8_v_i8mf8_m(...) __riscv_vlsseg8e8_v_i8mf8_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8mf4_m(...) __riscv_vlsseg2e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg3e8_v_i8mf4_m(...) __riscv_vlsseg3e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg4e8_v_i8mf4_m(...) __riscv_vlsseg4e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg5e8_v_i8mf4_m(...) __riscv_vlsseg5e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg6e8_v_i8mf4_m(...) __riscv_vlsseg6e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg7e8_v_i8mf4_m(...) __riscv_vlsseg7e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg8e8_v_i8mf4_m(...) __riscv_vlsseg8e8_v_i8mf4_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8mf2_m(...) __riscv_vlsseg2e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg3e8_v_i8mf2_m(...) __riscv_vlsseg3e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg4e8_v_i8mf2_m(...) __riscv_vlsseg4e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg5e8_v_i8mf2_m(...) __riscv_vlsseg5e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg6e8_v_i8mf2_m(...) __riscv_vlsseg6e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg7e8_v_i8mf2_m(...) __riscv_vlsseg7e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg8e8_v_i8mf2_m(...) __riscv_vlsseg8e8_v_i8mf2_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8m1_m(...) __riscv_vlsseg2e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg3e8_v_i8m1_m(...) __riscv_vlsseg3e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg4e8_v_i8m1_m(...) __riscv_vlsseg4e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg5e8_v_i8m1_m(...) __riscv_vlsseg5e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg6e8_v_i8m1_m(...) __riscv_vlsseg6e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg7e8_v_i8m1_m(...) __riscv_vlsseg7e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg8e8_v_i8m1_m(...) __riscv_vlsseg8e8_v_i8m1_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8m2_m(...) __riscv_vlsseg2e8_v_i8m2_tumu(__VA_ARGS__) +#define vlsseg3e8_v_i8m2_m(...) __riscv_vlsseg3e8_v_i8m2_tumu(__VA_ARGS__) +#define vlsseg4e8_v_i8m2_m(...) __riscv_vlsseg4e8_v_i8m2_tumu(__VA_ARGS__) +#define vlsseg2e8_v_i8m4_m(...) __riscv_vlsseg2e8_v_i8m4_tumu(__VA_ARGS__) +#define vlsseg2e16_v_i16mf4_m(...) __riscv_vlsseg2e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg3e16_v_i16mf4_m(...) __riscv_vlsseg3e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg4e16_v_i16mf4_m(...) __riscv_vlsseg4e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg5e16_v_i16mf4_m(...) __riscv_vlsseg5e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg6e16_v_i16mf4_m(...) __riscv_vlsseg6e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg7e16_v_i16mf4_m(...) __riscv_vlsseg7e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg8e16_v_i16mf4_m(...) __riscv_vlsseg8e16_v_i16mf4_tumu(__VA_ARGS__) +#define vlsseg2e16_v_i16mf2_m(...) __riscv_vlsseg2e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_i16mf2_m(...) __riscv_vlsseg3e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_i16mf2_m(...) __riscv_vlsseg4e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg5e16_v_i16mf2_m(...) __riscv_vlsseg5e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg6e16_v_i16mf2_m(...) __riscv_vlsseg6e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg7e16_v_i16mf2_m(...) __riscv_vlsseg7e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg8e16_v_i16mf2_m(...) __riscv_vlsseg8e16_v_i16mf2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_i16m1_m(...) __riscv_vlsseg2e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg3e16_v_i16m1_m(...) __riscv_vlsseg3e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg4e16_v_i16m1_m(...) __riscv_vlsseg4e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg5e16_v_i16m1_m(...) __riscv_vlsseg5e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg6e16_v_i16m1_m(...) __riscv_vlsseg6e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg7e16_v_i16m1_m(...) __riscv_vlsseg7e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg8e16_v_i16m1_m(...) __riscv_vlsseg8e16_v_i16m1_tumu(__VA_ARGS__) +#define vlsseg2e16_v_i16m2_m(...) __riscv_vlsseg2e16_v_i16m2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_i16m2_m(...) __riscv_vlsseg3e16_v_i16m2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_i16m2_m(...) __riscv_vlsseg4e16_v_i16m2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_i16m4_m(...) __riscv_vlsseg2e16_v_i16m4_tumu(__VA_ARGS__) +#define vlsseg2e32_v_i32mf2_m(...) __riscv_vlsseg2e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_i32mf2_m(...) __riscv_vlsseg3e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_i32mf2_m(...) __riscv_vlsseg4e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg5e32_v_i32mf2_m(...) __riscv_vlsseg5e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg6e32_v_i32mf2_m(...) __riscv_vlsseg6e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg7e32_v_i32mf2_m(...) __riscv_vlsseg7e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg8e32_v_i32mf2_m(...) __riscv_vlsseg8e32_v_i32mf2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_i32m1_m(...) __riscv_vlsseg2e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg3e32_v_i32m1_m(...) __riscv_vlsseg3e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg4e32_v_i32m1_m(...) __riscv_vlsseg4e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg5e32_v_i32m1_m(...) __riscv_vlsseg5e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg6e32_v_i32m1_m(...) __riscv_vlsseg6e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg7e32_v_i32m1_m(...) __riscv_vlsseg7e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg8e32_v_i32m1_m(...) __riscv_vlsseg8e32_v_i32m1_tumu(__VA_ARGS__) +#define vlsseg2e32_v_i32m2_m(...) __riscv_vlsseg2e32_v_i32m2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_i32m2_m(...) __riscv_vlsseg3e32_v_i32m2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_i32m2_m(...) __riscv_vlsseg4e32_v_i32m2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_i32m4_m(...) __riscv_vlsseg2e32_v_i32m4_tumu(__VA_ARGS__) +#define vlsseg2e64_v_i64m1_m(...) __riscv_vlsseg2e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg3e64_v_i64m1_m(...) __riscv_vlsseg3e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg4e64_v_i64m1_m(...) __riscv_vlsseg4e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg5e64_v_i64m1_m(...) __riscv_vlsseg5e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg6e64_v_i64m1_m(...) __riscv_vlsseg6e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg7e64_v_i64m1_m(...) __riscv_vlsseg7e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg8e64_v_i64m1_m(...) __riscv_vlsseg8e64_v_i64m1_tumu(__VA_ARGS__) +#define vlsseg2e64_v_i64m2_m(...) __riscv_vlsseg2e64_v_i64m2_tumu(__VA_ARGS__) +#define vlsseg3e64_v_i64m2_m(...) __riscv_vlsseg3e64_v_i64m2_tumu(__VA_ARGS__) +#define vlsseg4e64_v_i64m2_m(...) __riscv_vlsseg4e64_v_i64m2_tumu(__VA_ARGS__) +#define vlsseg2e64_v_i64m4_m(...) __riscv_vlsseg2e64_v_i64m4_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8mf8_m(...) __riscv_vlsseg2e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg3e8_v_u8mf8_m(...) __riscv_vlsseg3e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg4e8_v_u8mf8_m(...) __riscv_vlsseg4e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg5e8_v_u8mf8_m(...) __riscv_vlsseg5e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg6e8_v_u8mf8_m(...) __riscv_vlsseg6e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg7e8_v_u8mf8_m(...) __riscv_vlsseg7e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg8e8_v_u8mf8_m(...) __riscv_vlsseg8e8_v_u8mf8_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8mf4_m(...) __riscv_vlsseg2e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg3e8_v_u8mf4_m(...) __riscv_vlsseg3e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg4e8_v_u8mf4_m(...) __riscv_vlsseg4e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg5e8_v_u8mf4_m(...) __riscv_vlsseg5e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg6e8_v_u8mf4_m(...) __riscv_vlsseg6e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg7e8_v_u8mf4_m(...) __riscv_vlsseg7e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg8e8_v_u8mf4_m(...) __riscv_vlsseg8e8_v_u8mf4_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8mf2_m(...) __riscv_vlsseg2e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg3e8_v_u8mf2_m(...) __riscv_vlsseg3e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg4e8_v_u8mf2_m(...) __riscv_vlsseg4e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg5e8_v_u8mf2_m(...) __riscv_vlsseg5e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg6e8_v_u8mf2_m(...) __riscv_vlsseg6e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg7e8_v_u8mf2_m(...) __riscv_vlsseg7e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg8e8_v_u8mf2_m(...) __riscv_vlsseg8e8_v_u8mf2_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8m1_m(...) __riscv_vlsseg2e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg3e8_v_u8m1_m(...) __riscv_vlsseg3e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg4e8_v_u8m1_m(...) __riscv_vlsseg4e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg5e8_v_u8m1_m(...) __riscv_vlsseg5e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg6e8_v_u8m1_m(...) __riscv_vlsseg6e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg7e8_v_u8m1_m(...) __riscv_vlsseg7e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg8e8_v_u8m1_m(...) __riscv_vlsseg8e8_v_u8m1_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8m2_m(...) __riscv_vlsseg2e8_v_u8m2_tumu(__VA_ARGS__) +#define vlsseg3e8_v_u8m2_m(...) __riscv_vlsseg3e8_v_u8m2_tumu(__VA_ARGS__) +#define vlsseg4e8_v_u8m2_m(...) __riscv_vlsseg4e8_v_u8m2_tumu(__VA_ARGS__) +#define vlsseg2e8_v_u8m4_m(...) __riscv_vlsseg2e8_v_u8m4_tumu(__VA_ARGS__) +#define vlsseg2e16_v_u16mf4_m(...) __riscv_vlsseg2e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg3e16_v_u16mf4_m(...) __riscv_vlsseg3e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg4e16_v_u16mf4_m(...) __riscv_vlsseg4e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg5e16_v_u16mf4_m(...) __riscv_vlsseg5e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg6e16_v_u16mf4_m(...) __riscv_vlsseg6e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg7e16_v_u16mf4_m(...) __riscv_vlsseg7e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg8e16_v_u16mf4_m(...) __riscv_vlsseg8e16_v_u16mf4_tumu(__VA_ARGS__) +#define vlsseg2e16_v_u16mf2_m(...) __riscv_vlsseg2e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_u16mf2_m(...) __riscv_vlsseg3e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_u16mf2_m(...) __riscv_vlsseg4e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg5e16_v_u16mf2_m(...) __riscv_vlsseg5e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg6e16_v_u16mf2_m(...) __riscv_vlsseg6e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg7e16_v_u16mf2_m(...) __riscv_vlsseg7e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg8e16_v_u16mf2_m(...) __riscv_vlsseg8e16_v_u16mf2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_u16m1_m(...) __riscv_vlsseg2e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg3e16_v_u16m1_m(...) __riscv_vlsseg3e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg4e16_v_u16m1_m(...) __riscv_vlsseg4e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg5e16_v_u16m1_m(...) __riscv_vlsseg5e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg6e16_v_u16m1_m(...) __riscv_vlsseg6e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg7e16_v_u16m1_m(...) __riscv_vlsseg7e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg8e16_v_u16m1_m(...) __riscv_vlsseg8e16_v_u16m1_tumu(__VA_ARGS__) +#define vlsseg2e16_v_u16m2_m(...) __riscv_vlsseg2e16_v_u16m2_tumu(__VA_ARGS__) +#define vlsseg3e16_v_u16m2_m(...) __riscv_vlsseg3e16_v_u16m2_tumu(__VA_ARGS__) +#define vlsseg4e16_v_u16m2_m(...) __riscv_vlsseg4e16_v_u16m2_tumu(__VA_ARGS__) +#define vlsseg2e16_v_u16m4_m(...) __riscv_vlsseg2e16_v_u16m4_tumu(__VA_ARGS__) +#define vlsseg2e32_v_u32mf2_m(...) __riscv_vlsseg2e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_u32mf2_m(...) __riscv_vlsseg3e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_u32mf2_m(...) __riscv_vlsseg4e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg5e32_v_u32mf2_m(...) __riscv_vlsseg5e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg6e32_v_u32mf2_m(...) __riscv_vlsseg6e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg7e32_v_u32mf2_m(...) __riscv_vlsseg7e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg8e32_v_u32mf2_m(...) __riscv_vlsseg8e32_v_u32mf2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_u32m1_m(...) __riscv_vlsseg2e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg3e32_v_u32m1_m(...) __riscv_vlsseg3e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg4e32_v_u32m1_m(...) __riscv_vlsseg4e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg5e32_v_u32m1_m(...) __riscv_vlsseg5e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg6e32_v_u32m1_m(...) __riscv_vlsseg6e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg7e32_v_u32m1_m(...) __riscv_vlsseg7e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg8e32_v_u32m1_m(...) __riscv_vlsseg8e32_v_u32m1_tumu(__VA_ARGS__) +#define vlsseg2e32_v_u32m2_m(...) __riscv_vlsseg2e32_v_u32m2_tumu(__VA_ARGS__) +#define vlsseg3e32_v_u32m2_m(...) __riscv_vlsseg3e32_v_u32m2_tumu(__VA_ARGS__) +#define vlsseg4e32_v_u32m2_m(...) __riscv_vlsseg4e32_v_u32m2_tumu(__VA_ARGS__) +#define vlsseg2e32_v_u32m4_m(...) __riscv_vlsseg2e32_v_u32m4_tumu(__VA_ARGS__) +#define vlsseg2e64_v_u64m1_m(...) __riscv_vlsseg2e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg3e64_v_u64m1_m(...) __riscv_vlsseg3e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg4e64_v_u64m1_m(...) __riscv_vlsseg4e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg5e64_v_u64m1_m(...) __riscv_vlsseg5e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg6e64_v_u64m1_m(...) __riscv_vlsseg6e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg7e64_v_u64m1_m(...) __riscv_vlsseg7e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg8e64_v_u64m1_m(...) __riscv_vlsseg8e64_v_u64m1_tumu(__VA_ARGS__) +#define vlsseg2e64_v_u64m2_m(...) __riscv_vlsseg2e64_v_u64m2_tumu(__VA_ARGS__) +#define vlsseg3e64_v_u64m2_m(...) __riscv_vlsseg3e64_v_u64m2_tumu(__VA_ARGS__) +#define vlsseg4e64_v_u64m2_m(...) __riscv_vlsseg4e64_v_u64m2_tumu(__VA_ARGS__) +#define vlsseg2e64_v_u64m4_m(...) __riscv_vlsseg2e64_v_u64m4_tumu(__VA_ARGS__) +#define vssseg2e16_v_f16mf4(...) __riscv_vssseg2e16_v_f16mf4(__VA_ARGS__) +#define vssseg3e16_v_f16mf4(...) __riscv_vssseg3e16_v_f16mf4(__VA_ARGS__) +#define vssseg4e16_v_f16mf4(...) __riscv_vssseg4e16_v_f16mf4(__VA_ARGS__) +#define vssseg5e16_v_f16mf4(...) __riscv_vssseg5e16_v_f16mf4(__VA_ARGS__) +#define vssseg6e16_v_f16mf4(...) __riscv_vssseg6e16_v_f16mf4(__VA_ARGS__) +#define vssseg7e16_v_f16mf4(...) __riscv_vssseg7e16_v_f16mf4(__VA_ARGS__) +#define vssseg8e16_v_f16mf4(...) __riscv_vssseg8e16_v_f16mf4(__VA_ARGS__) +#define vssseg2e16_v_f16mf2(...) __riscv_vssseg2e16_v_f16mf2(__VA_ARGS__) +#define vssseg3e16_v_f16mf2(...) __riscv_vssseg3e16_v_f16mf2(__VA_ARGS__) +#define vssseg4e16_v_f16mf2(...) __riscv_vssseg4e16_v_f16mf2(__VA_ARGS__) +#define vssseg5e16_v_f16mf2(...) __riscv_vssseg5e16_v_f16mf2(__VA_ARGS__) +#define vssseg6e16_v_f16mf2(...) __riscv_vssseg6e16_v_f16mf2(__VA_ARGS__) +#define vssseg7e16_v_f16mf2(...) __riscv_vssseg7e16_v_f16mf2(__VA_ARGS__) +#define vssseg8e16_v_f16mf2(...) __riscv_vssseg8e16_v_f16mf2(__VA_ARGS__) +#define vssseg2e16_v_f16m1(...) __riscv_vssseg2e16_v_f16m1(__VA_ARGS__) +#define vssseg3e16_v_f16m1(...) __riscv_vssseg3e16_v_f16m1(__VA_ARGS__) +#define vssseg4e16_v_f16m1(...) __riscv_vssseg4e16_v_f16m1(__VA_ARGS__) +#define vssseg5e16_v_f16m1(...) __riscv_vssseg5e16_v_f16m1(__VA_ARGS__) +#define vssseg6e16_v_f16m1(...) __riscv_vssseg6e16_v_f16m1(__VA_ARGS__) +#define vssseg7e16_v_f16m1(...) __riscv_vssseg7e16_v_f16m1(__VA_ARGS__) +#define vssseg8e16_v_f16m1(...) __riscv_vssseg8e16_v_f16m1(__VA_ARGS__) +#define vssseg2e16_v_f16m2(...) __riscv_vssseg2e16_v_f16m2(__VA_ARGS__) +#define vssseg3e16_v_f16m2(...) __riscv_vssseg3e16_v_f16m2(__VA_ARGS__) +#define vssseg4e16_v_f16m2(...) __riscv_vssseg4e16_v_f16m2(__VA_ARGS__) +#define vssseg2e16_v_f16m4(...) __riscv_vssseg2e16_v_f16m4(__VA_ARGS__) +#define vssseg2e32_v_f32mf2(...) __riscv_vssseg2e32_v_f32mf2(__VA_ARGS__) +#define vssseg3e32_v_f32mf2(...) __riscv_vssseg3e32_v_f32mf2(__VA_ARGS__) +#define vssseg4e32_v_f32mf2(...) __riscv_vssseg4e32_v_f32mf2(__VA_ARGS__) +#define vssseg5e32_v_f32mf2(...) __riscv_vssseg5e32_v_f32mf2(__VA_ARGS__) +#define vssseg6e32_v_f32mf2(...) __riscv_vssseg6e32_v_f32mf2(__VA_ARGS__) +#define vssseg7e32_v_f32mf2(...) __riscv_vssseg7e32_v_f32mf2(__VA_ARGS__) +#define vssseg8e32_v_f32mf2(...) __riscv_vssseg8e32_v_f32mf2(__VA_ARGS__) +#define vssseg2e32_v_f32m1(...) __riscv_vssseg2e32_v_f32m1(__VA_ARGS__) +#define vssseg3e32_v_f32m1(...) __riscv_vssseg3e32_v_f32m1(__VA_ARGS__) +#define vssseg4e32_v_f32m1(...) __riscv_vssseg4e32_v_f32m1(__VA_ARGS__) +#define vssseg5e32_v_f32m1(...) __riscv_vssseg5e32_v_f32m1(__VA_ARGS__) +#define vssseg6e32_v_f32m1(...) __riscv_vssseg6e32_v_f32m1(__VA_ARGS__) +#define vssseg7e32_v_f32m1(...) __riscv_vssseg7e32_v_f32m1(__VA_ARGS__) +#define vssseg8e32_v_f32m1(...) __riscv_vssseg8e32_v_f32m1(__VA_ARGS__) +#define vssseg2e32_v_f32m2(...) __riscv_vssseg2e32_v_f32m2(__VA_ARGS__) +#define vssseg3e32_v_f32m2(...) __riscv_vssseg3e32_v_f32m2(__VA_ARGS__) +#define vssseg4e32_v_f32m2(...) __riscv_vssseg4e32_v_f32m2(__VA_ARGS__) +#define vssseg2e32_v_f32m4(...) __riscv_vssseg2e32_v_f32m4(__VA_ARGS__) +#define vssseg2e64_v_f64m1(...) __riscv_vssseg2e64_v_f64m1(__VA_ARGS__) +#define vssseg3e64_v_f64m1(...) __riscv_vssseg3e64_v_f64m1(__VA_ARGS__) +#define vssseg4e64_v_f64m1(...) __riscv_vssseg4e64_v_f64m1(__VA_ARGS__) +#define vssseg5e64_v_f64m1(...) __riscv_vssseg5e64_v_f64m1(__VA_ARGS__) +#define vssseg6e64_v_f64m1(...) __riscv_vssseg6e64_v_f64m1(__VA_ARGS__) +#define vssseg7e64_v_f64m1(...) __riscv_vssseg7e64_v_f64m1(__VA_ARGS__) +#define vssseg8e64_v_f64m1(...) __riscv_vssseg8e64_v_f64m1(__VA_ARGS__) +#define vssseg2e64_v_f64m2(...) __riscv_vssseg2e64_v_f64m2(__VA_ARGS__) +#define vssseg3e64_v_f64m2(...) __riscv_vssseg3e64_v_f64m2(__VA_ARGS__) +#define vssseg4e64_v_f64m2(...) __riscv_vssseg4e64_v_f64m2(__VA_ARGS__) +#define vssseg2e64_v_f64m4(...) __riscv_vssseg2e64_v_f64m4(__VA_ARGS__) +#define vssseg2e8_v_i8mf8(...) __riscv_vssseg2e8_v_i8mf8(__VA_ARGS__) +#define vssseg3e8_v_i8mf8(...) __riscv_vssseg3e8_v_i8mf8(__VA_ARGS__) +#define vssseg4e8_v_i8mf8(...) __riscv_vssseg4e8_v_i8mf8(__VA_ARGS__) +#define vssseg5e8_v_i8mf8(...) __riscv_vssseg5e8_v_i8mf8(__VA_ARGS__) +#define vssseg6e8_v_i8mf8(...) __riscv_vssseg6e8_v_i8mf8(__VA_ARGS__) +#define vssseg7e8_v_i8mf8(...) __riscv_vssseg7e8_v_i8mf8(__VA_ARGS__) +#define vssseg8e8_v_i8mf8(...) __riscv_vssseg8e8_v_i8mf8(__VA_ARGS__) +#define vssseg2e8_v_i8mf4(...) __riscv_vssseg2e8_v_i8mf4(__VA_ARGS__) +#define vssseg3e8_v_i8mf4(...) __riscv_vssseg3e8_v_i8mf4(__VA_ARGS__) +#define vssseg4e8_v_i8mf4(...) __riscv_vssseg4e8_v_i8mf4(__VA_ARGS__) +#define vssseg5e8_v_i8mf4(...) __riscv_vssseg5e8_v_i8mf4(__VA_ARGS__) +#define vssseg6e8_v_i8mf4(...) __riscv_vssseg6e8_v_i8mf4(__VA_ARGS__) +#define vssseg7e8_v_i8mf4(...) __riscv_vssseg7e8_v_i8mf4(__VA_ARGS__) +#define vssseg8e8_v_i8mf4(...) __riscv_vssseg8e8_v_i8mf4(__VA_ARGS__) +#define vssseg2e8_v_i8mf2(...) __riscv_vssseg2e8_v_i8mf2(__VA_ARGS__) +#define vssseg3e8_v_i8mf2(...) __riscv_vssseg3e8_v_i8mf2(__VA_ARGS__) +#define vssseg4e8_v_i8mf2(...) __riscv_vssseg4e8_v_i8mf2(__VA_ARGS__) +#define vssseg5e8_v_i8mf2(...) __riscv_vssseg5e8_v_i8mf2(__VA_ARGS__) +#define vssseg6e8_v_i8mf2(...) __riscv_vssseg6e8_v_i8mf2(__VA_ARGS__) +#define vssseg7e8_v_i8mf2(...) __riscv_vssseg7e8_v_i8mf2(__VA_ARGS__) +#define vssseg8e8_v_i8mf2(...) __riscv_vssseg8e8_v_i8mf2(__VA_ARGS__) +#define vssseg2e8_v_i8m1(...) __riscv_vssseg2e8_v_i8m1(__VA_ARGS__) +#define vssseg3e8_v_i8m1(...) __riscv_vssseg3e8_v_i8m1(__VA_ARGS__) +#define vssseg4e8_v_i8m1(...) __riscv_vssseg4e8_v_i8m1(__VA_ARGS__) +#define vssseg5e8_v_i8m1(...) __riscv_vssseg5e8_v_i8m1(__VA_ARGS__) +#define vssseg6e8_v_i8m1(...) __riscv_vssseg6e8_v_i8m1(__VA_ARGS__) +#define vssseg7e8_v_i8m1(...) __riscv_vssseg7e8_v_i8m1(__VA_ARGS__) +#define vssseg8e8_v_i8m1(...) __riscv_vssseg8e8_v_i8m1(__VA_ARGS__) +#define vssseg2e8_v_i8m2(...) __riscv_vssseg2e8_v_i8m2(__VA_ARGS__) +#define vssseg3e8_v_i8m2(...) __riscv_vssseg3e8_v_i8m2(__VA_ARGS__) +#define vssseg4e8_v_i8m2(...) __riscv_vssseg4e8_v_i8m2(__VA_ARGS__) +#define vssseg2e8_v_i8m4(...) __riscv_vssseg2e8_v_i8m4(__VA_ARGS__) +#define vssseg2e16_v_i16mf4(...) __riscv_vssseg2e16_v_i16mf4(__VA_ARGS__) +#define vssseg3e16_v_i16mf4(...) __riscv_vssseg3e16_v_i16mf4(__VA_ARGS__) +#define vssseg4e16_v_i16mf4(...) __riscv_vssseg4e16_v_i16mf4(__VA_ARGS__) +#define vssseg5e16_v_i16mf4(...) __riscv_vssseg5e16_v_i16mf4(__VA_ARGS__) +#define vssseg6e16_v_i16mf4(...) __riscv_vssseg6e16_v_i16mf4(__VA_ARGS__) +#define vssseg7e16_v_i16mf4(...) __riscv_vssseg7e16_v_i16mf4(__VA_ARGS__) +#define vssseg8e16_v_i16mf4(...) __riscv_vssseg8e16_v_i16mf4(__VA_ARGS__) +#define vssseg2e16_v_i16mf2(...) __riscv_vssseg2e16_v_i16mf2(__VA_ARGS__) +#define vssseg3e16_v_i16mf2(...) __riscv_vssseg3e16_v_i16mf2(__VA_ARGS__) +#define vssseg4e16_v_i16mf2(...) __riscv_vssseg4e16_v_i16mf2(__VA_ARGS__) +#define vssseg5e16_v_i16mf2(...) __riscv_vssseg5e16_v_i16mf2(__VA_ARGS__) +#define vssseg6e16_v_i16mf2(...) __riscv_vssseg6e16_v_i16mf2(__VA_ARGS__) +#define vssseg7e16_v_i16mf2(...) __riscv_vssseg7e16_v_i16mf2(__VA_ARGS__) +#define vssseg8e16_v_i16mf2(...) __riscv_vssseg8e16_v_i16mf2(__VA_ARGS__) +#define vssseg2e16_v_i16m1(...) __riscv_vssseg2e16_v_i16m1(__VA_ARGS__) +#define vssseg3e16_v_i16m1(...) __riscv_vssseg3e16_v_i16m1(__VA_ARGS__) +#define vssseg4e16_v_i16m1(...) __riscv_vssseg4e16_v_i16m1(__VA_ARGS__) +#define vssseg5e16_v_i16m1(...) __riscv_vssseg5e16_v_i16m1(__VA_ARGS__) +#define vssseg6e16_v_i16m1(...) __riscv_vssseg6e16_v_i16m1(__VA_ARGS__) +#define vssseg7e16_v_i16m1(...) __riscv_vssseg7e16_v_i16m1(__VA_ARGS__) +#define vssseg8e16_v_i16m1(...) __riscv_vssseg8e16_v_i16m1(__VA_ARGS__) +#define vssseg2e16_v_i16m2(...) __riscv_vssseg2e16_v_i16m2(__VA_ARGS__) +#define vssseg3e16_v_i16m2(...) __riscv_vssseg3e16_v_i16m2(__VA_ARGS__) +#define vssseg4e16_v_i16m2(...) __riscv_vssseg4e16_v_i16m2(__VA_ARGS__) +#define vssseg2e16_v_i16m4(...) __riscv_vssseg2e16_v_i16m4(__VA_ARGS__) +#define vssseg2e32_v_i32mf2(...) __riscv_vssseg2e32_v_i32mf2(__VA_ARGS__) +#define vssseg3e32_v_i32mf2(...) __riscv_vssseg3e32_v_i32mf2(__VA_ARGS__) +#define vssseg4e32_v_i32mf2(...) __riscv_vssseg4e32_v_i32mf2(__VA_ARGS__) +#define vssseg5e32_v_i32mf2(...) __riscv_vssseg5e32_v_i32mf2(__VA_ARGS__) +#define vssseg6e32_v_i32mf2(...) __riscv_vssseg6e32_v_i32mf2(__VA_ARGS__) +#define vssseg7e32_v_i32mf2(...) __riscv_vssseg7e32_v_i32mf2(__VA_ARGS__) +#define vssseg8e32_v_i32mf2(...) __riscv_vssseg8e32_v_i32mf2(__VA_ARGS__) +#define vssseg2e32_v_i32m1(...) __riscv_vssseg2e32_v_i32m1(__VA_ARGS__) +#define vssseg3e32_v_i32m1(...) __riscv_vssseg3e32_v_i32m1(__VA_ARGS__) +#define vssseg4e32_v_i32m1(...) __riscv_vssseg4e32_v_i32m1(__VA_ARGS__) +#define vssseg5e32_v_i32m1(...) __riscv_vssseg5e32_v_i32m1(__VA_ARGS__) +#define vssseg6e32_v_i32m1(...) __riscv_vssseg6e32_v_i32m1(__VA_ARGS__) +#define vssseg7e32_v_i32m1(...) __riscv_vssseg7e32_v_i32m1(__VA_ARGS__) +#define vssseg8e32_v_i32m1(...) __riscv_vssseg8e32_v_i32m1(__VA_ARGS__) +#define vssseg2e32_v_i32m2(...) __riscv_vssseg2e32_v_i32m2(__VA_ARGS__) +#define vssseg3e32_v_i32m2(...) __riscv_vssseg3e32_v_i32m2(__VA_ARGS__) +#define vssseg4e32_v_i32m2(...) __riscv_vssseg4e32_v_i32m2(__VA_ARGS__) +#define vssseg2e32_v_i32m4(...) __riscv_vssseg2e32_v_i32m4(__VA_ARGS__) +#define vssseg2e64_v_i64m1(...) __riscv_vssseg2e64_v_i64m1(__VA_ARGS__) +#define vssseg3e64_v_i64m1(...) __riscv_vssseg3e64_v_i64m1(__VA_ARGS__) +#define vssseg4e64_v_i64m1(...) __riscv_vssseg4e64_v_i64m1(__VA_ARGS__) +#define vssseg5e64_v_i64m1(...) __riscv_vssseg5e64_v_i64m1(__VA_ARGS__) +#define vssseg6e64_v_i64m1(...) __riscv_vssseg6e64_v_i64m1(__VA_ARGS__) +#define vssseg7e64_v_i64m1(...) __riscv_vssseg7e64_v_i64m1(__VA_ARGS__) +#define vssseg8e64_v_i64m1(...) __riscv_vssseg8e64_v_i64m1(__VA_ARGS__) +#define vssseg2e64_v_i64m2(...) __riscv_vssseg2e64_v_i64m2(__VA_ARGS__) +#define vssseg3e64_v_i64m2(...) __riscv_vssseg3e64_v_i64m2(__VA_ARGS__) +#define vssseg4e64_v_i64m2(...) __riscv_vssseg4e64_v_i64m2(__VA_ARGS__) +#define vssseg2e64_v_i64m4(...) __riscv_vssseg2e64_v_i64m4(__VA_ARGS__) +#define vssseg2e8_v_u8mf8(...) __riscv_vssseg2e8_v_u8mf8(__VA_ARGS__) +#define vssseg3e8_v_u8mf8(...) __riscv_vssseg3e8_v_u8mf8(__VA_ARGS__) +#define vssseg4e8_v_u8mf8(...) __riscv_vssseg4e8_v_u8mf8(__VA_ARGS__) +#define vssseg5e8_v_u8mf8(...) __riscv_vssseg5e8_v_u8mf8(__VA_ARGS__) +#define vssseg6e8_v_u8mf8(...) __riscv_vssseg6e8_v_u8mf8(__VA_ARGS__) +#define vssseg7e8_v_u8mf8(...) __riscv_vssseg7e8_v_u8mf8(__VA_ARGS__) +#define vssseg8e8_v_u8mf8(...) __riscv_vssseg8e8_v_u8mf8(__VA_ARGS__) +#define vssseg2e8_v_u8mf4(...) __riscv_vssseg2e8_v_u8mf4(__VA_ARGS__) +#define vssseg3e8_v_u8mf4(...) __riscv_vssseg3e8_v_u8mf4(__VA_ARGS__) +#define vssseg4e8_v_u8mf4(...) __riscv_vssseg4e8_v_u8mf4(__VA_ARGS__) +#define vssseg5e8_v_u8mf4(...) __riscv_vssseg5e8_v_u8mf4(__VA_ARGS__) +#define vssseg6e8_v_u8mf4(...) __riscv_vssseg6e8_v_u8mf4(__VA_ARGS__) +#define vssseg7e8_v_u8mf4(...) __riscv_vssseg7e8_v_u8mf4(__VA_ARGS__) +#define vssseg8e8_v_u8mf4(...) __riscv_vssseg8e8_v_u8mf4(__VA_ARGS__) +#define vssseg2e8_v_u8mf2(...) __riscv_vssseg2e8_v_u8mf2(__VA_ARGS__) +#define vssseg3e8_v_u8mf2(...) __riscv_vssseg3e8_v_u8mf2(__VA_ARGS__) +#define vssseg4e8_v_u8mf2(...) __riscv_vssseg4e8_v_u8mf2(__VA_ARGS__) +#define vssseg5e8_v_u8mf2(...) __riscv_vssseg5e8_v_u8mf2(__VA_ARGS__) +#define vssseg6e8_v_u8mf2(...) __riscv_vssseg6e8_v_u8mf2(__VA_ARGS__) +#define vssseg7e8_v_u8mf2(...) __riscv_vssseg7e8_v_u8mf2(__VA_ARGS__) +#define vssseg8e8_v_u8mf2(...) __riscv_vssseg8e8_v_u8mf2(__VA_ARGS__) +#define vssseg2e8_v_u8m1(...) __riscv_vssseg2e8_v_u8m1(__VA_ARGS__) +#define vssseg3e8_v_u8m1(...) __riscv_vssseg3e8_v_u8m1(__VA_ARGS__) +#define vssseg4e8_v_u8m1(...) __riscv_vssseg4e8_v_u8m1(__VA_ARGS__) +#define vssseg5e8_v_u8m1(...) __riscv_vssseg5e8_v_u8m1(__VA_ARGS__) +#define vssseg6e8_v_u8m1(...) __riscv_vssseg6e8_v_u8m1(__VA_ARGS__) +#define vssseg7e8_v_u8m1(...) __riscv_vssseg7e8_v_u8m1(__VA_ARGS__) +#define vssseg8e8_v_u8m1(...) __riscv_vssseg8e8_v_u8m1(__VA_ARGS__) +#define vssseg2e8_v_u8m2(...) __riscv_vssseg2e8_v_u8m2(__VA_ARGS__) +#define vssseg3e8_v_u8m2(...) __riscv_vssseg3e8_v_u8m2(__VA_ARGS__) +#define vssseg4e8_v_u8m2(...) __riscv_vssseg4e8_v_u8m2(__VA_ARGS__) +#define vssseg2e8_v_u8m4(...) __riscv_vssseg2e8_v_u8m4(__VA_ARGS__) +#define vssseg2e16_v_u16mf4(...) __riscv_vssseg2e16_v_u16mf4(__VA_ARGS__) +#define vssseg3e16_v_u16mf4(...) __riscv_vssseg3e16_v_u16mf4(__VA_ARGS__) +#define vssseg4e16_v_u16mf4(...) __riscv_vssseg4e16_v_u16mf4(__VA_ARGS__) +#define vssseg5e16_v_u16mf4(...) __riscv_vssseg5e16_v_u16mf4(__VA_ARGS__) +#define vssseg6e16_v_u16mf4(...) __riscv_vssseg6e16_v_u16mf4(__VA_ARGS__) +#define vssseg7e16_v_u16mf4(...) __riscv_vssseg7e16_v_u16mf4(__VA_ARGS__) +#define vssseg8e16_v_u16mf4(...) __riscv_vssseg8e16_v_u16mf4(__VA_ARGS__) +#define vssseg2e16_v_u16mf2(...) __riscv_vssseg2e16_v_u16mf2(__VA_ARGS__) +#define vssseg3e16_v_u16mf2(...) __riscv_vssseg3e16_v_u16mf2(__VA_ARGS__) +#define vssseg4e16_v_u16mf2(...) __riscv_vssseg4e16_v_u16mf2(__VA_ARGS__) +#define vssseg5e16_v_u16mf2(...) __riscv_vssseg5e16_v_u16mf2(__VA_ARGS__) +#define vssseg6e16_v_u16mf2(...) __riscv_vssseg6e16_v_u16mf2(__VA_ARGS__) +#define vssseg7e16_v_u16mf2(...) __riscv_vssseg7e16_v_u16mf2(__VA_ARGS__) +#define vssseg8e16_v_u16mf2(...) __riscv_vssseg8e16_v_u16mf2(__VA_ARGS__) +#define vssseg2e16_v_u16m1(...) __riscv_vssseg2e16_v_u16m1(__VA_ARGS__) +#define vssseg3e16_v_u16m1(...) __riscv_vssseg3e16_v_u16m1(__VA_ARGS__) +#define vssseg4e16_v_u16m1(...) __riscv_vssseg4e16_v_u16m1(__VA_ARGS__) +#define vssseg5e16_v_u16m1(...) __riscv_vssseg5e16_v_u16m1(__VA_ARGS__) +#define vssseg6e16_v_u16m1(...) __riscv_vssseg6e16_v_u16m1(__VA_ARGS__) +#define vssseg7e16_v_u16m1(...) __riscv_vssseg7e16_v_u16m1(__VA_ARGS__) +#define vssseg8e16_v_u16m1(...) __riscv_vssseg8e16_v_u16m1(__VA_ARGS__) +#define vssseg2e16_v_u16m2(...) __riscv_vssseg2e16_v_u16m2(__VA_ARGS__) +#define vssseg3e16_v_u16m2(...) __riscv_vssseg3e16_v_u16m2(__VA_ARGS__) +#define vssseg4e16_v_u16m2(...) __riscv_vssseg4e16_v_u16m2(__VA_ARGS__) +#define vssseg2e16_v_u16m4(...) __riscv_vssseg2e16_v_u16m4(__VA_ARGS__) +#define vssseg2e32_v_u32mf2(...) __riscv_vssseg2e32_v_u32mf2(__VA_ARGS__) +#define vssseg3e32_v_u32mf2(...) __riscv_vssseg3e32_v_u32mf2(__VA_ARGS__) +#define vssseg4e32_v_u32mf2(...) __riscv_vssseg4e32_v_u32mf2(__VA_ARGS__) +#define vssseg5e32_v_u32mf2(...) __riscv_vssseg5e32_v_u32mf2(__VA_ARGS__) +#define vssseg6e32_v_u32mf2(...) __riscv_vssseg6e32_v_u32mf2(__VA_ARGS__) +#define vssseg7e32_v_u32mf2(...) __riscv_vssseg7e32_v_u32mf2(__VA_ARGS__) +#define vssseg8e32_v_u32mf2(...) __riscv_vssseg8e32_v_u32mf2(__VA_ARGS__) +#define vssseg2e32_v_u32m1(...) __riscv_vssseg2e32_v_u32m1(__VA_ARGS__) +#define vssseg3e32_v_u32m1(...) __riscv_vssseg3e32_v_u32m1(__VA_ARGS__) +#define vssseg4e32_v_u32m1(...) __riscv_vssseg4e32_v_u32m1(__VA_ARGS__) +#define vssseg5e32_v_u32m1(...) __riscv_vssseg5e32_v_u32m1(__VA_ARGS__) +#define vssseg6e32_v_u32m1(...) __riscv_vssseg6e32_v_u32m1(__VA_ARGS__) +#define vssseg7e32_v_u32m1(...) __riscv_vssseg7e32_v_u32m1(__VA_ARGS__) +#define vssseg8e32_v_u32m1(...) __riscv_vssseg8e32_v_u32m1(__VA_ARGS__) +#define vssseg2e32_v_u32m2(...) __riscv_vssseg2e32_v_u32m2(__VA_ARGS__) +#define vssseg3e32_v_u32m2(...) __riscv_vssseg3e32_v_u32m2(__VA_ARGS__) +#define vssseg4e32_v_u32m2(...) __riscv_vssseg4e32_v_u32m2(__VA_ARGS__) +#define vssseg2e32_v_u32m4(...) __riscv_vssseg2e32_v_u32m4(__VA_ARGS__) +#define vssseg2e64_v_u64m1(...) __riscv_vssseg2e64_v_u64m1(__VA_ARGS__) +#define vssseg3e64_v_u64m1(...) __riscv_vssseg3e64_v_u64m1(__VA_ARGS__) +#define vssseg4e64_v_u64m1(...) __riscv_vssseg4e64_v_u64m1(__VA_ARGS__) +#define vssseg5e64_v_u64m1(...) __riscv_vssseg5e64_v_u64m1(__VA_ARGS__) +#define vssseg6e64_v_u64m1(...) __riscv_vssseg6e64_v_u64m1(__VA_ARGS__) +#define vssseg7e64_v_u64m1(...) __riscv_vssseg7e64_v_u64m1(__VA_ARGS__) +#define vssseg8e64_v_u64m1(...) __riscv_vssseg8e64_v_u64m1(__VA_ARGS__) +#define vssseg2e64_v_u64m2(...) __riscv_vssseg2e64_v_u64m2(__VA_ARGS__) +#define vssseg3e64_v_u64m2(...) __riscv_vssseg3e64_v_u64m2(__VA_ARGS__) +#define vssseg4e64_v_u64m2(...) __riscv_vssseg4e64_v_u64m2(__VA_ARGS__) +#define vssseg2e64_v_u64m4(...) __riscv_vssseg2e64_v_u64m4(__VA_ARGS__) +// masked functions +#define vssseg2e16_v_f16mf4_m(...) __riscv_vssseg2e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg3e16_v_f16mf4_m(...) __riscv_vssseg3e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg4e16_v_f16mf4_m(...) __riscv_vssseg4e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg5e16_v_f16mf4_m(...) __riscv_vssseg5e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg6e16_v_f16mf4_m(...) __riscv_vssseg6e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg7e16_v_f16mf4_m(...) __riscv_vssseg7e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg8e16_v_f16mf4_m(...) __riscv_vssseg8e16_v_f16mf4_m(__VA_ARGS__) +#define vssseg2e16_v_f16mf2_m(...) __riscv_vssseg2e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg3e16_v_f16mf2_m(...) __riscv_vssseg3e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg4e16_v_f16mf2_m(...) __riscv_vssseg4e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg5e16_v_f16mf2_m(...) __riscv_vssseg5e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg6e16_v_f16mf2_m(...) __riscv_vssseg6e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg7e16_v_f16mf2_m(...) __riscv_vssseg7e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg8e16_v_f16mf2_m(...) __riscv_vssseg8e16_v_f16mf2_m(__VA_ARGS__) +#define vssseg2e16_v_f16m1_m(...) __riscv_vssseg2e16_v_f16m1_m(__VA_ARGS__) +#define vssseg3e16_v_f16m1_m(...) __riscv_vssseg3e16_v_f16m1_m(__VA_ARGS__) +#define vssseg4e16_v_f16m1_m(...) __riscv_vssseg4e16_v_f16m1_m(__VA_ARGS__) +#define vssseg5e16_v_f16m1_m(...) __riscv_vssseg5e16_v_f16m1_m(__VA_ARGS__) +#define vssseg6e16_v_f16m1_m(...) __riscv_vssseg6e16_v_f16m1_m(__VA_ARGS__) +#define vssseg7e16_v_f16m1_m(...) __riscv_vssseg7e16_v_f16m1_m(__VA_ARGS__) +#define vssseg8e16_v_f16m1_m(...) __riscv_vssseg8e16_v_f16m1_m(__VA_ARGS__) +#define vssseg2e16_v_f16m2_m(...) __riscv_vssseg2e16_v_f16m2_m(__VA_ARGS__) +#define vssseg3e16_v_f16m2_m(...) __riscv_vssseg3e16_v_f16m2_m(__VA_ARGS__) +#define vssseg4e16_v_f16m2_m(...) __riscv_vssseg4e16_v_f16m2_m(__VA_ARGS__) +#define vssseg2e16_v_f16m4_m(...) __riscv_vssseg2e16_v_f16m4_m(__VA_ARGS__) +#define vssseg2e32_v_f32mf2_m(...) __riscv_vssseg2e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg3e32_v_f32mf2_m(...) __riscv_vssseg3e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg4e32_v_f32mf2_m(...) __riscv_vssseg4e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg5e32_v_f32mf2_m(...) __riscv_vssseg5e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg6e32_v_f32mf2_m(...) __riscv_vssseg6e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg7e32_v_f32mf2_m(...) __riscv_vssseg7e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg8e32_v_f32mf2_m(...) __riscv_vssseg8e32_v_f32mf2_m(__VA_ARGS__) +#define vssseg2e32_v_f32m1_m(...) __riscv_vssseg2e32_v_f32m1_m(__VA_ARGS__) +#define vssseg3e32_v_f32m1_m(...) __riscv_vssseg3e32_v_f32m1_m(__VA_ARGS__) +#define vssseg4e32_v_f32m1_m(...) __riscv_vssseg4e32_v_f32m1_m(__VA_ARGS__) +#define vssseg5e32_v_f32m1_m(...) __riscv_vssseg5e32_v_f32m1_m(__VA_ARGS__) +#define vssseg6e32_v_f32m1_m(...) __riscv_vssseg6e32_v_f32m1_m(__VA_ARGS__) +#define vssseg7e32_v_f32m1_m(...) __riscv_vssseg7e32_v_f32m1_m(__VA_ARGS__) +#define vssseg8e32_v_f32m1_m(...) __riscv_vssseg8e32_v_f32m1_m(__VA_ARGS__) +#define vssseg2e32_v_f32m2_m(...) __riscv_vssseg2e32_v_f32m2_m(__VA_ARGS__) +#define vssseg3e32_v_f32m2_m(...) __riscv_vssseg3e32_v_f32m2_m(__VA_ARGS__) +#define vssseg4e32_v_f32m2_m(...) __riscv_vssseg4e32_v_f32m2_m(__VA_ARGS__) +#define vssseg2e32_v_f32m4_m(...) __riscv_vssseg2e32_v_f32m4_m(__VA_ARGS__) +#define vssseg2e64_v_f64m1_m(...) __riscv_vssseg2e64_v_f64m1_m(__VA_ARGS__) +#define vssseg3e64_v_f64m1_m(...) __riscv_vssseg3e64_v_f64m1_m(__VA_ARGS__) +#define vssseg4e64_v_f64m1_m(...) __riscv_vssseg4e64_v_f64m1_m(__VA_ARGS__) +#define vssseg5e64_v_f64m1_m(...) __riscv_vssseg5e64_v_f64m1_m(__VA_ARGS__) +#define vssseg6e64_v_f64m1_m(...) __riscv_vssseg6e64_v_f64m1_m(__VA_ARGS__) +#define vssseg7e64_v_f64m1_m(...) __riscv_vssseg7e64_v_f64m1_m(__VA_ARGS__) +#define vssseg8e64_v_f64m1_m(...) __riscv_vssseg8e64_v_f64m1_m(__VA_ARGS__) +#define vssseg2e64_v_f64m2_m(...) __riscv_vssseg2e64_v_f64m2_m(__VA_ARGS__) +#define vssseg3e64_v_f64m2_m(...) __riscv_vssseg3e64_v_f64m2_m(__VA_ARGS__) +#define vssseg4e64_v_f64m2_m(...) __riscv_vssseg4e64_v_f64m2_m(__VA_ARGS__) +#define vssseg2e64_v_f64m4_m(...) __riscv_vssseg2e64_v_f64m4_m(__VA_ARGS__) +#define vssseg2e8_v_i8mf8_m(...) __riscv_vssseg2e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg3e8_v_i8mf8_m(...) __riscv_vssseg3e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg4e8_v_i8mf8_m(...) __riscv_vssseg4e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg5e8_v_i8mf8_m(...) __riscv_vssseg5e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg6e8_v_i8mf8_m(...) __riscv_vssseg6e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg7e8_v_i8mf8_m(...) __riscv_vssseg7e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg8e8_v_i8mf8_m(...) __riscv_vssseg8e8_v_i8mf8_m(__VA_ARGS__) +#define vssseg2e8_v_i8mf4_m(...) __riscv_vssseg2e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg3e8_v_i8mf4_m(...) __riscv_vssseg3e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg4e8_v_i8mf4_m(...) __riscv_vssseg4e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg5e8_v_i8mf4_m(...) __riscv_vssseg5e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg6e8_v_i8mf4_m(...) __riscv_vssseg6e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg7e8_v_i8mf4_m(...) __riscv_vssseg7e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg8e8_v_i8mf4_m(...) __riscv_vssseg8e8_v_i8mf4_m(__VA_ARGS__) +#define vssseg2e8_v_i8mf2_m(...) __riscv_vssseg2e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg3e8_v_i8mf2_m(...) __riscv_vssseg3e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg4e8_v_i8mf2_m(...) __riscv_vssseg4e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg5e8_v_i8mf2_m(...) __riscv_vssseg5e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg6e8_v_i8mf2_m(...) __riscv_vssseg6e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg7e8_v_i8mf2_m(...) __riscv_vssseg7e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg8e8_v_i8mf2_m(...) __riscv_vssseg8e8_v_i8mf2_m(__VA_ARGS__) +#define vssseg2e8_v_i8m1_m(...) __riscv_vssseg2e8_v_i8m1_m(__VA_ARGS__) +#define vssseg3e8_v_i8m1_m(...) __riscv_vssseg3e8_v_i8m1_m(__VA_ARGS__) +#define vssseg4e8_v_i8m1_m(...) __riscv_vssseg4e8_v_i8m1_m(__VA_ARGS__) +#define vssseg5e8_v_i8m1_m(...) __riscv_vssseg5e8_v_i8m1_m(__VA_ARGS__) +#define vssseg6e8_v_i8m1_m(...) __riscv_vssseg6e8_v_i8m1_m(__VA_ARGS__) +#define vssseg7e8_v_i8m1_m(...) __riscv_vssseg7e8_v_i8m1_m(__VA_ARGS__) +#define vssseg8e8_v_i8m1_m(...) __riscv_vssseg8e8_v_i8m1_m(__VA_ARGS__) +#define vssseg2e8_v_i8m2_m(...) __riscv_vssseg2e8_v_i8m2_m(__VA_ARGS__) +#define vssseg3e8_v_i8m2_m(...) __riscv_vssseg3e8_v_i8m2_m(__VA_ARGS__) +#define vssseg4e8_v_i8m2_m(...) __riscv_vssseg4e8_v_i8m2_m(__VA_ARGS__) +#define vssseg2e8_v_i8m4_m(...) __riscv_vssseg2e8_v_i8m4_m(__VA_ARGS__) +#define vssseg2e16_v_i16mf4_m(...) __riscv_vssseg2e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg3e16_v_i16mf4_m(...) __riscv_vssseg3e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg4e16_v_i16mf4_m(...) __riscv_vssseg4e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg5e16_v_i16mf4_m(...) __riscv_vssseg5e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg6e16_v_i16mf4_m(...) __riscv_vssseg6e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg7e16_v_i16mf4_m(...) __riscv_vssseg7e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg8e16_v_i16mf4_m(...) __riscv_vssseg8e16_v_i16mf4_m(__VA_ARGS__) +#define vssseg2e16_v_i16mf2_m(...) __riscv_vssseg2e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg3e16_v_i16mf2_m(...) __riscv_vssseg3e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg4e16_v_i16mf2_m(...) __riscv_vssseg4e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg5e16_v_i16mf2_m(...) __riscv_vssseg5e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg6e16_v_i16mf2_m(...) __riscv_vssseg6e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg7e16_v_i16mf2_m(...) __riscv_vssseg7e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg8e16_v_i16mf2_m(...) __riscv_vssseg8e16_v_i16mf2_m(__VA_ARGS__) +#define vssseg2e16_v_i16m1_m(...) __riscv_vssseg2e16_v_i16m1_m(__VA_ARGS__) +#define vssseg3e16_v_i16m1_m(...) __riscv_vssseg3e16_v_i16m1_m(__VA_ARGS__) +#define vssseg4e16_v_i16m1_m(...) __riscv_vssseg4e16_v_i16m1_m(__VA_ARGS__) +#define vssseg5e16_v_i16m1_m(...) __riscv_vssseg5e16_v_i16m1_m(__VA_ARGS__) +#define vssseg6e16_v_i16m1_m(...) __riscv_vssseg6e16_v_i16m1_m(__VA_ARGS__) +#define vssseg7e16_v_i16m1_m(...) __riscv_vssseg7e16_v_i16m1_m(__VA_ARGS__) +#define vssseg8e16_v_i16m1_m(...) __riscv_vssseg8e16_v_i16m1_m(__VA_ARGS__) +#define vssseg2e16_v_i16m2_m(...) __riscv_vssseg2e16_v_i16m2_m(__VA_ARGS__) +#define vssseg3e16_v_i16m2_m(...) __riscv_vssseg3e16_v_i16m2_m(__VA_ARGS__) +#define vssseg4e16_v_i16m2_m(...) __riscv_vssseg4e16_v_i16m2_m(__VA_ARGS__) +#define vssseg2e16_v_i16m4_m(...) __riscv_vssseg2e16_v_i16m4_m(__VA_ARGS__) +#define vssseg2e32_v_i32mf2_m(...) __riscv_vssseg2e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg3e32_v_i32mf2_m(...) __riscv_vssseg3e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg4e32_v_i32mf2_m(...) __riscv_vssseg4e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg5e32_v_i32mf2_m(...) __riscv_vssseg5e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg6e32_v_i32mf2_m(...) __riscv_vssseg6e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg7e32_v_i32mf2_m(...) __riscv_vssseg7e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg8e32_v_i32mf2_m(...) __riscv_vssseg8e32_v_i32mf2_m(__VA_ARGS__) +#define vssseg2e32_v_i32m1_m(...) __riscv_vssseg2e32_v_i32m1_m(__VA_ARGS__) +#define vssseg3e32_v_i32m1_m(...) __riscv_vssseg3e32_v_i32m1_m(__VA_ARGS__) +#define vssseg4e32_v_i32m1_m(...) __riscv_vssseg4e32_v_i32m1_m(__VA_ARGS__) +#define vssseg5e32_v_i32m1_m(...) __riscv_vssseg5e32_v_i32m1_m(__VA_ARGS__) +#define vssseg6e32_v_i32m1_m(...) __riscv_vssseg6e32_v_i32m1_m(__VA_ARGS__) +#define vssseg7e32_v_i32m1_m(...) __riscv_vssseg7e32_v_i32m1_m(__VA_ARGS__) +#define vssseg8e32_v_i32m1_m(...) __riscv_vssseg8e32_v_i32m1_m(__VA_ARGS__) +#define vssseg2e32_v_i32m2_m(...) __riscv_vssseg2e32_v_i32m2_m(__VA_ARGS__) +#define vssseg3e32_v_i32m2_m(...) __riscv_vssseg3e32_v_i32m2_m(__VA_ARGS__) +#define vssseg4e32_v_i32m2_m(...) __riscv_vssseg4e32_v_i32m2_m(__VA_ARGS__) +#define vssseg2e32_v_i32m4_m(...) __riscv_vssseg2e32_v_i32m4_m(__VA_ARGS__) +#define vssseg2e64_v_i64m1_m(...) __riscv_vssseg2e64_v_i64m1_m(__VA_ARGS__) +#define vssseg3e64_v_i64m1_m(...) __riscv_vssseg3e64_v_i64m1_m(__VA_ARGS__) +#define vssseg4e64_v_i64m1_m(...) __riscv_vssseg4e64_v_i64m1_m(__VA_ARGS__) +#define vssseg5e64_v_i64m1_m(...) __riscv_vssseg5e64_v_i64m1_m(__VA_ARGS__) +#define vssseg6e64_v_i64m1_m(...) __riscv_vssseg6e64_v_i64m1_m(__VA_ARGS__) +#define vssseg7e64_v_i64m1_m(...) __riscv_vssseg7e64_v_i64m1_m(__VA_ARGS__) +#define vssseg8e64_v_i64m1_m(...) __riscv_vssseg8e64_v_i64m1_m(__VA_ARGS__) +#define vssseg2e64_v_i64m2_m(...) __riscv_vssseg2e64_v_i64m2_m(__VA_ARGS__) +#define vssseg3e64_v_i64m2_m(...) __riscv_vssseg3e64_v_i64m2_m(__VA_ARGS__) +#define vssseg4e64_v_i64m2_m(...) __riscv_vssseg4e64_v_i64m2_m(__VA_ARGS__) +#define vssseg2e64_v_i64m4_m(...) __riscv_vssseg2e64_v_i64m4_m(__VA_ARGS__) +#define vssseg2e8_v_u8mf8_m(...) __riscv_vssseg2e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg3e8_v_u8mf8_m(...) __riscv_vssseg3e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg4e8_v_u8mf8_m(...) __riscv_vssseg4e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg5e8_v_u8mf8_m(...) __riscv_vssseg5e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg6e8_v_u8mf8_m(...) __riscv_vssseg6e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg7e8_v_u8mf8_m(...) __riscv_vssseg7e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg8e8_v_u8mf8_m(...) __riscv_vssseg8e8_v_u8mf8_m(__VA_ARGS__) +#define vssseg2e8_v_u8mf4_m(...) __riscv_vssseg2e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg3e8_v_u8mf4_m(...) __riscv_vssseg3e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg4e8_v_u8mf4_m(...) __riscv_vssseg4e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg5e8_v_u8mf4_m(...) __riscv_vssseg5e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg6e8_v_u8mf4_m(...) __riscv_vssseg6e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg7e8_v_u8mf4_m(...) __riscv_vssseg7e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg8e8_v_u8mf4_m(...) __riscv_vssseg8e8_v_u8mf4_m(__VA_ARGS__) +#define vssseg2e8_v_u8mf2_m(...) __riscv_vssseg2e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg3e8_v_u8mf2_m(...) __riscv_vssseg3e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg4e8_v_u8mf2_m(...) __riscv_vssseg4e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg5e8_v_u8mf2_m(...) __riscv_vssseg5e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg6e8_v_u8mf2_m(...) __riscv_vssseg6e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg7e8_v_u8mf2_m(...) __riscv_vssseg7e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg8e8_v_u8mf2_m(...) __riscv_vssseg8e8_v_u8mf2_m(__VA_ARGS__) +#define vssseg2e8_v_u8m1_m(...) __riscv_vssseg2e8_v_u8m1_m(__VA_ARGS__) +#define vssseg3e8_v_u8m1_m(...) __riscv_vssseg3e8_v_u8m1_m(__VA_ARGS__) +#define vssseg4e8_v_u8m1_m(...) __riscv_vssseg4e8_v_u8m1_m(__VA_ARGS__) +#define vssseg5e8_v_u8m1_m(...) __riscv_vssseg5e8_v_u8m1_m(__VA_ARGS__) +#define vssseg6e8_v_u8m1_m(...) __riscv_vssseg6e8_v_u8m1_m(__VA_ARGS__) +#define vssseg7e8_v_u8m1_m(...) __riscv_vssseg7e8_v_u8m1_m(__VA_ARGS__) +#define vssseg8e8_v_u8m1_m(...) __riscv_vssseg8e8_v_u8m1_m(__VA_ARGS__) +#define vssseg2e8_v_u8m2_m(...) __riscv_vssseg2e8_v_u8m2_m(__VA_ARGS__) +#define vssseg3e8_v_u8m2_m(...) __riscv_vssseg3e8_v_u8m2_m(__VA_ARGS__) +#define vssseg4e8_v_u8m2_m(...) __riscv_vssseg4e8_v_u8m2_m(__VA_ARGS__) +#define vssseg2e8_v_u8m4_m(...) __riscv_vssseg2e8_v_u8m4_m(__VA_ARGS__) +#define vssseg2e16_v_u16mf4_m(...) __riscv_vssseg2e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg3e16_v_u16mf4_m(...) __riscv_vssseg3e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg4e16_v_u16mf4_m(...) __riscv_vssseg4e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg5e16_v_u16mf4_m(...) __riscv_vssseg5e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg6e16_v_u16mf4_m(...) __riscv_vssseg6e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg7e16_v_u16mf4_m(...) __riscv_vssseg7e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg8e16_v_u16mf4_m(...) __riscv_vssseg8e16_v_u16mf4_m(__VA_ARGS__) +#define vssseg2e16_v_u16mf2_m(...) __riscv_vssseg2e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg3e16_v_u16mf2_m(...) __riscv_vssseg3e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg4e16_v_u16mf2_m(...) __riscv_vssseg4e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg5e16_v_u16mf2_m(...) __riscv_vssseg5e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg6e16_v_u16mf2_m(...) __riscv_vssseg6e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg7e16_v_u16mf2_m(...) __riscv_vssseg7e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg8e16_v_u16mf2_m(...) __riscv_vssseg8e16_v_u16mf2_m(__VA_ARGS__) +#define vssseg2e16_v_u16m1_m(...) __riscv_vssseg2e16_v_u16m1_m(__VA_ARGS__) +#define vssseg3e16_v_u16m1_m(...) __riscv_vssseg3e16_v_u16m1_m(__VA_ARGS__) +#define vssseg4e16_v_u16m1_m(...) __riscv_vssseg4e16_v_u16m1_m(__VA_ARGS__) +#define vssseg5e16_v_u16m1_m(...) __riscv_vssseg5e16_v_u16m1_m(__VA_ARGS__) +#define vssseg6e16_v_u16m1_m(...) __riscv_vssseg6e16_v_u16m1_m(__VA_ARGS__) +#define vssseg7e16_v_u16m1_m(...) __riscv_vssseg7e16_v_u16m1_m(__VA_ARGS__) +#define vssseg8e16_v_u16m1_m(...) __riscv_vssseg8e16_v_u16m1_m(__VA_ARGS__) +#define vssseg2e16_v_u16m2_m(...) __riscv_vssseg2e16_v_u16m2_m(__VA_ARGS__) +#define vssseg3e16_v_u16m2_m(...) __riscv_vssseg3e16_v_u16m2_m(__VA_ARGS__) +#define vssseg4e16_v_u16m2_m(...) __riscv_vssseg4e16_v_u16m2_m(__VA_ARGS__) +#define vssseg2e16_v_u16m4_m(...) __riscv_vssseg2e16_v_u16m4_m(__VA_ARGS__) +#define vssseg2e32_v_u32mf2_m(...) __riscv_vssseg2e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg3e32_v_u32mf2_m(...) __riscv_vssseg3e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg4e32_v_u32mf2_m(...) __riscv_vssseg4e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg5e32_v_u32mf2_m(...) __riscv_vssseg5e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg6e32_v_u32mf2_m(...) __riscv_vssseg6e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg7e32_v_u32mf2_m(...) __riscv_vssseg7e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg8e32_v_u32mf2_m(...) __riscv_vssseg8e32_v_u32mf2_m(__VA_ARGS__) +#define vssseg2e32_v_u32m1_m(...) __riscv_vssseg2e32_v_u32m1_m(__VA_ARGS__) +#define vssseg3e32_v_u32m1_m(...) __riscv_vssseg3e32_v_u32m1_m(__VA_ARGS__) +#define vssseg4e32_v_u32m1_m(...) __riscv_vssseg4e32_v_u32m1_m(__VA_ARGS__) +#define vssseg5e32_v_u32m1_m(...) __riscv_vssseg5e32_v_u32m1_m(__VA_ARGS__) +#define vssseg6e32_v_u32m1_m(...) __riscv_vssseg6e32_v_u32m1_m(__VA_ARGS__) +#define vssseg7e32_v_u32m1_m(...) __riscv_vssseg7e32_v_u32m1_m(__VA_ARGS__) +#define vssseg8e32_v_u32m1_m(...) __riscv_vssseg8e32_v_u32m1_m(__VA_ARGS__) +#define vssseg2e32_v_u32m2_m(...) __riscv_vssseg2e32_v_u32m2_m(__VA_ARGS__) +#define vssseg3e32_v_u32m2_m(...) __riscv_vssseg3e32_v_u32m2_m(__VA_ARGS__) +#define vssseg4e32_v_u32m2_m(...) __riscv_vssseg4e32_v_u32m2_m(__VA_ARGS__) +#define vssseg2e32_v_u32m4_m(...) __riscv_vssseg2e32_v_u32m4_m(__VA_ARGS__) +#define vssseg2e64_v_u64m1_m(...) __riscv_vssseg2e64_v_u64m1_m(__VA_ARGS__) +#define vssseg3e64_v_u64m1_m(...) __riscv_vssseg3e64_v_u64m1_m(__VA_ARGS__) +#define vssseg4e64_v_u64m1_m(...) __riscv_vssseg4e64_v_u64m1_m(__VA_ARGS__) +#define vssseg5e64_v_u64m1_m(...) __riscv_vssseg5e64_v_u64m1_m(__VA_ARGS__) +#define vssseg6e64_v_u64m1_m(...) __riscv_vssseg6e64_v_u64m1_m(__VA_ARGS__) +#define vssseg7e64_v_u64m1_m(...) __riscv_vssseg7e64_v_u64m1_m(__VA_ARGS__) +#define vssseg8e64_v_u64m1_m(...) __riscv_vssseg8e64_v_u64m1_m(__VA_ARGS__) +#define vssseg2e64_v_u64m2_m(...) __riscv_vssseg2e64_v_u64m2_m(__VA_ARGS__) +#define vssseg3e64_v_u64m2_m(...) __riscv_vssseg3e64_v_u64m2_m(__VA_ARGS__) +#define vssseg4e64_v_u64m2_m(...) __riscv_vssseg4e64_v_u64m2_m(__VA_ARGS__) +#define vssseg2e64_v_u64m4_m(...) __riscv_vssseg2e64_v_u64m4_m(__VA_ARGS__) +#define vloxseg2ei8_v_f16mf4(...) __riscv_vloxseg2ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg3ei8_v_f16mf4(...) __riscv_vloxseg3ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg4ei8_v_f16mf4(...) __riscv_vloxseg4ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg5ei8_v_f16mf4(...) __riscv_vloxseg5ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg6ei8_v_f16mf4(...) __riscv_vloxseg6ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg7ei8_v_f16mf4(...) __riscv_vloxseg7ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg8ei8_v_f16mf4(...) __riscv_vloxseg8ei8_v_f16mf4(__VA_ARGS__) +#define vloxseg2ei8_v_f16mf2(...) __riscv_vloxseg2ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg3ei8_v_f16mf2(...) __riscv_vloxseg3ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg4ei8_v_f16mf2(...) __riscv_vloxseg4ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg5ei8_v_f16mf2(...) __riscv_vloxseg5ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg6ei8_v_f16mf2(...) __riscv_vloxseg6ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg7ei8_v_f16mf2(...) __riscv_vloxseg7ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg8ei8_v_f16mf2(...) __riscv_vloxseg8ei8_v_f16mf2(__VA_ARGS__) +#define vloxseg2ei8_v_f16m1(...) __riscv_vloxseg2ei8_v_f16m1(__VA_ARGS__) +#define vloxseg3ei8_v_f16m1(...) __riscv_vloxseg3ei8_v_f16m1(__VA_ARGS__) +#define vloxseg4ei8_v_f16m1(...) __riscv_vloxseg4ei8_v_f16m1(__VA_ARGS__) +#define vloxseg5ei8_v_f16m1(...) __riscv_vloxseg5ei8_v_f16m1(__VA_ARGS__) +#define vloxseg6ei8_v_f16m1(...) __riscv_vloxseg6ei8_v_f16m1(__VA_ARGS__) +#define vloxseg7ei8_v_f16m1(...) __riscv_vloxseg7ei8_v_f16m1(__VA_ARGS__) +#define vloxseg8ei8_v_f16m1(...) __riscv_vloxseg8ei8_v_f16m1(__VA_ARGS__) +#define vloxseg2ei8_v_f16m2(...) __riscv_vloxseg2ei8_v_f16m2(__VA_ARGS__) +#define vloxseg3ei8_v_f16m2(...) __riscv_vloxseg3ei8_v_f16m2(__VA_ARGS__) +#define vloxseg4ei8_v_f16m2(...) __riscv_vloxseg4ei8_v_f16m2(__VA_ARGS__) +#define vloxseg2ei8_v_f16m4(...) __riscv_vloxseg2ei8_v_f16m4(__VA_ARGS__) +#define vloxseg2ei16_v_f16mf4(...) __riscv_vloxseg2ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg3ei16_v_f16mf4(...) __riscv_vloxseg3ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg4ei16_v_f16mf4(...) __riscv_vloxseg4ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg5ei16_v_f16mf4(...) __riscv_vloxseg5ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg6ei16_v_f16mf4(...) __riscv_vloxseg6ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg7ei16_v_f16mf4(...) __riscv_vloxseg7ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg8ei16_v_f16mf4(...) __riscv_vloxseg8ei16_v_f16mf4(__VA_ARGS__) +#define vloxseg2ei16_v_f16mf2(...) __riscv_vloxseg2ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg3ei16_v_f16mf2(...) __riscv_vloxseg3ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg4ei16_v_f16mf2(...) __riscv_vloxseg4ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg5ei16_v_f16mf2(...) __riscv_vloxseg5ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg6ei16_v_f16mf2(...) __riscv_vloxseg6ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg7ei16_v_f16mf2(...) __riscv_vloxseg7ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg8ei16_v_f16mf2(...) __riscv_vloxseg8ei16_v_f16mf2(__VA_ARGS__) +#define vloxseg2ei16_v_f16m1(...) __riscv_vloxseg2ei16_v_f16m1(__VA_ARGS__) +#define vloxseg3ei16_v_f16m1(...) __riscv_vloxseg3ei16_v_f16m1(__VA_ARGS__) +#define vloxseg4ei16_v_f16m1(...) __riscv_vloxseg4ei16_v_f16m1(__VA_ARGS__) +#define vloxseg5ei16_v_f16m1(...) __riscv_vloxseg5ei16_v_f16m1(__VA_ARGS__) +#define vloxseg6ei16_v_f16m1(...) __riscv_vloxseg6ei16_v_f16m1(__VA_ARGS__) +#define vloxseg7ei16_v_f16m1(...) __riscv_vloxseg7ei16_v_f16m1(__VA_ARGS__) +#define vloxseg8ei16_v_f16m1(...) __riscv_vloxseg8ei16_v_f16m1(__VA_ARGS__) +#define vloxseg2ei16_v_f16m2(...) __riscv_vloxseg2ei16_v_f16m2(__VA_ARGS__) +#define vloxseg3ei16_v_f16m2(...) __riscv_vloxseg3ei16_v_f16m2(__VA_ARGS__) +#define vloxseg4ei16_v_f16m2(...) __riscv_vloxseg4ei16_v_f16m2(__VA_ARGS__) +#define vloxseg2ei16_v_f16m4(...) __riscv_vloxseg2ei16_v_f16m4(__VA_ARGS__) +#define vloxseg2ei32_v_f16mf4(...) __riscv_vloxseg2ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg3ei32_v_f16mf4(...) __riscv_vloxseg3ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg4ei32_v_f16mf4(...) __riscv_vloxseg4ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg5ei32_v_f16mf4(...) __riscv_vloxseg5ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg6ei32_v_f16mf4(...) __riscv_vloxseg6ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg7ei32_v_f16mf4(...) __riscv_vloxseg7ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg8ei32_v_f16mf4(...) __riscv_vloxseg8ei32_v_f16mf4(__VA_ARGS__) +#define vloxseg2ei32_v_f16mf2(...) __riscv_vloxseg2ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg3ei32_v_f16mf2(...) __riscv_vloxseg3ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg4ei32_v_f16mf2(...) __riscv_vloxseg4ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg5ei32_v_f16mf2(...) __riscv_vloxseg5ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg6ei32_v_f16mf2(...) __riscv_vloxseg6ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg7ei32_v_f16mf2(...) __riscv_vloxseg7ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg8ei32_v_f16mf2(...) __riscv_vloxseg8ei32_v_f16mf2(__VA_ARGS__) +#define vloxseg2ei32_v_f16m1(...) __riscv_vloxseg2ei32_v_f16m1(__VA_ARGS__) +#define vloxseg3ei32_v_f16m1(...) __riscv_vloxseg3ei32_v_f16m1(__VA_ARGS__) +#define vloxseg4ei32_v_f16m1(...) __riscv_vloxseg4ei32_v_f16m1(__VA_ARGS__) +#define vloxseg5ei32_v_f16m1(...) __riscv_vloxseg5ei32_v_f16m1(__VA_ARGS__) +#define vloxseg6ei32_v_f16m1(...) __riscv_vloxseg6ei32_v_f16m1(__VA_ARGS__) +#define vloxseg7ei32_v_f16m1(...) __riscv_vloxseg7ei32_v_f16m1(__VA_ARGS__) +#define vloxseg8ei32_v_f16m1(...) __riscv_vloxseg8ei32_v_f16m1(__VA_ARGS__) +#define vloxseg2ei32_v_f16m2(...) __riscv_vloxseg2ei32_v_f16m2(__VA_ARGS__) +#define vloxseg3ei32_v_f16m2(...) __riscv_vloxseg3ei32_v_f16m2(__VA_ARGS__) +#define vloxseg4ei32_v_f16m2(...) __riscv_vloxseg4ei32_v_f16m2(__VA_ARGS__) +#define vloxseg2ei32_v_f16m4(...) __riscv_vloxseg2ei32_v_f16m4(__VA_ARGS__) +#define vloxseg2ei64_v_f16mf4(...) __riscv_vloxseg2ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg3ei64_v_f16mf4(...) __riscv_vloxseg3ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg4ei64_v_f16mf4(...) __riscv_vloxseg4ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg5ei64_v_f16mf4(...) __riscv_vloxseg5ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg6ei64_v_f16mf4(...) __riscv_vloxseg6ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg7ei64_v_f16mf4(...) __riscv_vloxseg7ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg8ei64_v_f16mf4(...) __riscv_vloxseg8ei64_v_f16mf4(__VA_ARGS__) +#define vloxseg2ei64_v_f16mf2(...) __riscv_vloxseg2ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg3ei64_v_f16mf2(...) __riscv_vloxseg3ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg4ei64_v_f16mf2(...) __riscv_vloxseg4ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg5ei64_v_f16mf2(...) __riscv_vloxseg5ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg6ei64_v_f16mf2(...) __riscv_vloxseg6ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg7ei64_v_f16mf2(...) __riscv_vloxseg7ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg8ei64_v_f16mf2(...) __riscv_vloxseg8ei64_v_f16mf2(__VA_ARGS__) +#define vloxseg2ei64_v_f16m1(...) __riscv_vloxseg2ei64_v_f16m1(__VA_ARGS__) +#define vloxseg3ei64_v_f16m1(...) __riscv_vloxseg3ei64_v_f16m1(__VA_ARGS__) +#define vloxseg4ei64_v_f16m1(...) __riscv_vloxseg4ei64_v_f16m1(__VA_ARGS__) +#define vloxseg5ei64_v_f16m1(...) __riscv_vloxseg5ei64_v_f16m1(__VA_ARGS__) +#define vloxseg6ei64_v_f16m1(...) __riscv_vloxseg6ei64_v_f16m1(__VA_ARGS__) +#define vloxseg7ei64_v_f16m1(...) __riscv_vloxseg7ei64_v_f16m1(__VA_ARGS__) +#define vloxseg8ei64_v_f16m1(...) __riscv_vloxseg8ei64_v_f16m1(__VA_ARGS__) +#define vloxseg2ei64_v_f16m2(...) __riscv_vloxseg2ei64_v_f16m2(__VA_ARGS__) +#define vloxseg3ei64_v_f16m2(...) __riscv_vloxseg3ei64_v_f16m2(__VA_ARGS__) +#define vloxseg4ei64_v_f16m2(...) __riscv_vloxseg4ei64_v_f16m2(__VA_ARGS__) +#define vloxseg2ei8_v_f32mf2(...) __riscv_vloxseg2ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg3ei8_v_f32mf2(...) __riscv_vloxseg3ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg4ei8_v_f32mf2(...) __riscv_vloxseg4ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg5ei8_v_f32mf2(...) __riscv_vloxseg5ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg6ei8_v_f32mf2(...) __riscv_vloxseg6ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg7ei8_v_f32mf2(...) __riscv_vloxseg7ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg8ei8_v_f32mf2(...) __riscv_vloxseg8ei8_v_f32mf2(__VA_ARGS__) +#define vloxseg2ei8_v_f32m1(...) __riscv_vloxseg2ei8_v_f32m1(__VA_ARGS__) +#define vloxseg3ei8_v_f32m1(...) __riscv_vloxseg3ei8_v_f32m1(__VA_ARGS__) +#define vloxseg4ei8_v_f32m1(...) __riscv_vloxseg4ei8_v_f32m1(__VA_ARGS__) +#define vloxseg5ei8_v_f32m1(...) __riscv_vloxseg5ei8_v_f32m1(__VA_ARGS__) +#define vloxseg6ei8_v_f32m1(...) __riscv_vloxseg6ei8_v_f32m1(__VA_ARGS__) +#define vloxseg7ei8_v_f32m1(...) __riscv_vloxseg7ei8_v_f32m1(__VA_ARGS__) +#define vloxseg8ei8_v_f32m1(...) __riscv_vloxseg8ei8_v_f32m1(__VA_ARGS__) +#define vloxseg2ei8_v_f32m2(...) __riscv_vloxseg2ei8_v_f32m2(__VA_ARGS__) +#define vloxseg3ei8_v_f32m2(...) __riscv_vloxseg3ei8_v_f32m2(__VA_ARGS__) +#define vloxseg4ei8_v_f32m2(...) __riscv_vloxseg4ei8_v_f32m2(__VA_ARGS__) +#define vloxseg2ei8_v_f32m4(...) __riscv_vloxseg2ei8_v_f32m4(__VA_ARGS__) +#define vloxseg2ei16_v_f32mf2(...) __riscv_vloxseg2ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg3ei16_v_f32mf2(...) __riscv_vloxseg3ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg4ei16_v_f32mf2(...) __riscv_vloxseg4ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg5ei16_v_f32mf2(...) __riscv_vloxseg5ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg6ei16_v_f32mf2(...) __riscv_vloxseg6ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg7ei16_v_f32mf2(...) __riscv_vloxseg7ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg8ei16_v_f32mf2(...) __riscv_vloxseg8ei16_v_f32mf2(__VA_ARGS__) +#define vloxseg2ei16_v_f32m1(...) __riscv_vloxseg2ei16_v_f32m1(__VA_ARGS__) +#define vloxseg3ei16_v_f32m1(...) __riscv_vloxseg3ei16_v_f32m1(__VA_ARGS__) +#define vloxseg4ei16_v_f32m1(...) __riscv_vloxseg4ei16_v_f32m1(__VA_ARGS__) +#define vloxseg5ei16_v_f32m1(...) __riscv_vloxseg5ei16_v_f32m1(__VA_ARGS__) +#define vloxseg6ei16_v_f32m1(...) __riscv_vloxseg6ei16_v_f32m1(__VA_ARGS__) +#define vloxseg7ei16_v_f32m1(...) __riscv_vloxseg7ei16_v_f32m1(__VA_ARGS__) +#define vloxseg8ei16_v_f32m1(...) __riscv_vloxseg8ei16_v_f32m1(__VA_ARGS__) +#define vloxseg2ei16_v_f32m2(...) __riscv_vloxseg2ei16_v_f32m2(__VA_ARGS__) +#define vloxseg3ei16_v_f32m2(...) __riscv_vloxseg3ei16_v_f32m2(__VA_ARGS__) +#define vloxseg4ei16_v_f32m2(...) __riscv_vloxseg4ei16_v_f32m2(__VA_ARGS__) +#define vloxseg2ei16_v_f32m4(...) __riscv_vloxseg2ei16_v_f32m4(__VA_ARGS__) +#define vloxseg2ei32_v_f32mf2(...) __riscv_vloxseg2ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg3ei32_v_f32mf2(...) __riscv_vloxseg3ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg4ei32_v_f32mf2(...) __riscv_vloxseg4ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg5ei32_v_f32mf2(...) __riscv_vloxseg5ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg6ei32_v_f32mf2(...) __riscv_vloxseg6ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg7ei32_v_f32mf2(...) __riscv_vloxseg7ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg8ei32_v_f32mf2(...) __riscv_vloxseg8ei32_v_f32mf2(__VA_ARGS__) +#define vloxseg2ei32_v_f32m1(...) __riscv_vloxseg2ei32_v_f32m1(__VA_ARGS__) +#define vloxseg3ei32_v_f32m1(...) __riscv_vloxseg3ei32_v_f32m1(__VA_ARGS__) +#define vloxseg4ei32_v_f32m1(...) __riscv_vloxseg4ei32_v_f32m1(__VA_ARGS__) +#define vloxseg5ei32_v_f32m1(...) __riscv_vloxseg5ei32_v_f32m1(__VA_ARGS__) +#define vloxseg6ei32_v_f32m1(...) __riscv_vloxseg6ei32_v_f32m1(__VA_ARGS__) +#define vloxseg7ei32_v_f32m1(...) __riscv_vloxseg7ei32_v_f32m1(__VA_ARGS__) +#define vloxseg8ei32_v_f32m1(...) __riscv_vloxseg8ei32_v_f32m1(__VA_ARGS__) +#define vloxseg2ei32_v_f32m2(...) __riscv_vloxseg2ei32_v_f32m2(__VA_ARGS__) +#define vloxseg3ei32_v_f32m2(...) __riscv_vloxseg3ei32_v_f32m2(__VA_ARGS__) +#define vloxseg4ei32_v_f32m2(...) __riscv_vloxseg4ei32_v_f32m2(__VA_ARGS__) +#define vloxseg2ei32_v_f32m4(...) __riscv_vloxseg2ei32_v_f32m4(__VA_ARGS__) +#define vloxseg2ei64_v_f32mf2(...) __riscv_vloxseg2ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg3ei64_v_f32mf2(...) __riscv_vloxseg3ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg4ei64_v_f32mf2(...) __riscv_vloxseg4ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg5ei64_v_f32mf2(...) __riscv_vloxseg5ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg6ei64_v_f32mf2(...) __riscv_vloxseg6ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg7ei64_v_f32mf2(...) __riscv_vloxseg7ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg8ei64_v_f32mf2(...) __riscv_vloxseg8ei64_v_f32mf2(__VA_ARGS__) +#define vloxseg2ei64_v_f32m1(...) __riscv_vloxseg2ei64_v_f32m1(__VA_ARGS__) +#define vloxseg3ei64_v_f32m1(...) __riscv_vloxseg3ei64_v_f32m1(__VA_ARGS__) +#define vloxseg4ei64_v_f32m1(...) __riscv_vloxseg4ei64_v_f32m1(__VA_ARGS__) +#define vloxseg5ei64_v_f32m1(...) __riscv_vloxseg5ei64_v_f32m1(__VA_ARGS__) +#define vloxseg6ei64_v_f32m1(...) __riscv_vloxseg6ei64_v_f32m1(__VA_ARGS__) +#define vloxseg7ei64_v_f32m1(...) __riscv_vloxseg7ei64_v_f32m1(__VA_ARGS__) +#define vloxseg8ei64_v_f32m1(...) __riscv_vloxseg8ei64_v_f32m1(__VA_ARGS__) +#define vloxseg2ei64_v_f32m2(...) __riscv_vloxseg2ei64_v_f32m2(__VA_ARGS__) +#define vloxseg3ei64_v_f32m2(...) __riscv_vloxseg3ei64_v_f32m2(__VA_ARGS__) +#define vloxseg4ei64_v_f32m2(...) __riscv_vloxseg4ei64_v_f32m2(__VA_ARGS__) +#define vloxseg2ei64_v_f32m4(...) __riscv_vloxseg2ei64_v_f32m4(__VA_ARGS__) +#define vloxseg2ei8_v_f64m1(...) __riscv_vloxseg2ei8_v_f64m1(__VA_ARGS__) +#define vloxseg3ei8_v_f64m1(...) __riscv_vloxseg3ei8_v_f64m1(__VA_ARGS__) +#define vloxseg4ei8_v_f64m1(...) __riscv_vloxseg4ei8_v_f64m1(__VA_ARGS__) +#define vloxseg5ei8_v_f64m1(...) __riscv_vloxseg5ei8_v_f64m1(__VA_ARGS__) +#define vloxseg6ei8_v_f64m1(...) __riscv_vloxseg6ei8_v_f64m1(__VA_ARGS__) +#define vloxseg7ei8_v_f64m1(...) __riscv_vloxseg7ei8_v_f64m1(__VA_ARGS__) +#define vloxseg8ei8_v_f64m1(...) __riscv_vloxseg8ei8_v_f64m1(__VA_ARGS__) +#define vloxseg2ei8_v_f64m2(...) __riscv_vloxseg2ei8_v_f64m2(__VA_ARGS__) +#define vloxseg3ei8_v_f64m2(...) __riscv_vloxseg3ei8_v_f64m2(__VA_ARGS__) +#define vloxseg4ei8_v_f64m2(...) __riscv_vloxseg4ei8_v_f64m2(__VA_ARGS__) +#define vloxseg2ei8_v_f64m4(...) __riscv_vloxseg2ei8_v_f64m4(__VA_ARGS__) +#define vloxseg2ei16_v_f64m1(...) __riscv_vloxseg2ei16_v_f64m1(__VA_ARGS__) +#define vloxseg3ei16_v_f64m1(...) __riscv_vloxseg3ei16_v_f64m1(__VA_ARGS__) +#define vloxseg4ei16_v_f64m1(...) __riscv_vloxseg4ei16_v_f64m1(__VA_ARGS__) +#define vloxseg5ei16_v_f64m1(...) __riscv_vloxseg5ei16_v_f64m1(__VA_ARGS__) +#define vloxseg6ei16_v_f64m1(...) __riscv_vloxseg6ei16_v_f64m1(__VA_ARGS__) +#define vloxseg7ei16_v_f64m1(...) __riscv_vloxseg7ei16_v_f64m1(__VA_ARGS__) +#define vloxseg8ei16_v_f64m1(...) __riscv_vloxseg8ei16_v_f64m1(__VA_ARGS__) +#define vloxseg2ei16_v_f64m2(...) __riscv_vloxseg2ei16_v_f64m2(__VA_ARGS__) +#define vloxseg3ei16_v_f64m2(...) __riscv_vloxseg3ei16_v_f64m2(__VA_ARGS__) +#define vloxseg4ei16_v_f64m2(...) __riscv_vloxseg4ei16_v_f64m2(__VA_ARGS__) +#define vloxseg2ei16_v_f64m4(...) __riscv_vloxseg2ei16_v_f64m4(__VA_ARGS__) +#define vloxseg2ei32_v_f64m1(...) __riscv_vloxseg2ei32_v_f64m1(__VA_ARGS__) +#define vloxseg3ei32_v_f64m1(...) __riscv_vloxseg3ei32_v_f64m1(__VA_ARGS__) +#define vloxseg4ei32_v_f64m1(...) __riscv_vloxseg4ei32_v_f64m1(__VA_ARGS__) +#define vloxseg5ei32_v_f64m1(...) __riscv_vloxseg5ei32_v_f64m1(__VA_ARGS__) +#define vloxseg6ei32_v_f64m1(...) __riscv_vloxseg6ei32_v_f64m1(__VA_ARGS__) +#define vloxseg7ei32_v_f64m1(...) __riscv_vloxseg7ei32_v_f64m1(__VA_ARGS__) +#define vloxseg8ei32_v_f64m1(...) __riscv_vloxseg8ei32_v_f64m1(__VA_ARGS__) +#define vloxseg2ei32_v_f64m2(...) __riscv_vloxseg2ei32_v_f64m2(__VA_ARGS__) +#define vloxseg3ei32_v_f64m2(...) __riscv_vloxseg3ei32_v_f64m2(__VA_ARGS__) +#define vloxseg4ei32_v_f64m2(...) __riscv_vloxseg4ei32_v_f64m2(__VA_ARGS__) +#define vloxseg2ei32_v_f64m4(...) __riscv_vloxseg2ei32_v_f64m4(__VA_ARGS__) +#define vloxseg2ei64_v_f64m1(...) __riscv_vloxseg2ei64_v_f64m1(__VA_ARGS__) +#define vloxseg3ei64_v_f64m1(...) __riscv_vloxseg3ei64_v_f64m1(__VA_ARGS__) +#define vloxseg4ei64_v_f64m1(...) __riscv_vloxseg4ei64_v_f64m1(__VA_ARGS__) +#define vloxseg5ei64_v_f64m1(...) __riscv_vloxseg5ei64_v_f64m1(__VA_ARGS__) +#define vloxseg6ei64_v_f64m1(...) __riscv_vloxseg6ei64_v_f64m1(__VA_ARGS__) +#define vloxseg7ei64_v_f64m1(...) __riscv_vloxseg7ei64_v_f64m1(__VA_ARGS__) +#define vloxseg8ei64_v_f64m1(...) __riscv_vloxseg8ei64_v_f64m1(__VA_ARGS__) +#define vloxseg2ei64_v_f64m2(...) __riscv_vloxseg2ei64_v_f64m2(__VA_ARGS__) +#define vloxseg3ei64_v_f64m2(...) __riscv_vloxseg3ei64_v_f64m2(__VA_ARGS__) +#define vloxseg4ei64_v_f64m2(...) __riscv_vloxseg4ei64_v_f64m2(__VA_ARGS__) +#define vloxseg2ei64_v_f64m4(...) __riscv_vloxseg2ei64_v_f64m4(__VA_ARGS__) +#define vluxseg2ei8_v_f16mf4(...) __riscv_vluxseg2ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg3ei8_v_f16mf4(...) __riscv_vluxseg3ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg4ei8_v_f16mf4(...) __riscv_vluxseg4ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg5ei8_v_f16mf4(...) __riscv_vluxseg5ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg6ei8_v_f16mf4(...) __riscv_vluxseg6ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg7ei8_v_f16mf4(...) __riscv_vluxseg7ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg8ei8_v_f16mf4(...) __riscv_vluxseg8ei8_v_f16mf4(__VA_ARGS__) +#define vluxseg2ei8_v_f16mf2(...) __riscv_vluxseg2ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg3ei8_v_f16mf2(...) __riscv_vluxseg3ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg4ei8_v_f16mf2(...) __riscv_vluxseg4ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg5ei8_v_f16mf2(...) __riscv_vluxseg5ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg6ei8_v_f16mf2(...) __riscv_vluxseg6ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg7ei8_v_f16mf2(...) __riscv_vluxseg7ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg8ei8_v_f16mf2(...) __riscv_vluxseg8ei8_v_f16mf2(__VA_ARGS__) +#define vluxseg2ei8_v_f16m1(...) __riscv_vluxseg2ei8_v_f16m1(__VA_ARGS__) +#define vluxseg3ei8_v_f16m1(...) __riscv_vluxseg3ei8_v_f16m1(__VA_ARGS__) +#define vluxseg4ei8_v_f16m1(...) __riscv_vluxseg4ei8_v_f16m1(__VA_ARGS__) +#define vluxseg5ei8_v_f16m1(...) __riscv_vluxseg5ei8_v_f16m1(__VA_ARGS__) +#define vluxseg6ei8_v_f16m1(...) __riscv_vluxseg6ei8_v_f16m1(__VA_ARGS__) +#define vluxseg7ei8_v_f16m1(...) __riscv_vluxseg7ei8_v_f16m1(__VA_ARGS__) +#define vluxseg8ei8_v_f16m1(...) __riscv_vluxseg8ei8_v_f16m1(__VA_ARGS__) +#define vluxseg2ei8_v_f16m2(...) __riscv_vluxseg2ei8_v_f16m2(__VA_ARGS__) +#define vluxseg3ei8_v_f16m2(...) __riscv_vluxseg3ei8_v_f16m2(__VA_ARGS__) +#define vluxseg4ei8_v_f16m2(...) __riscv_vluxseg4ei8_v_f16m2(__VA_ARGS__) +#define vluxseg2ei8_v_f16m4(...) __riscv_vluxseg2ei8_v_f16m4(__VA_ARGS__) +#define vluxseg2ei16_v_f16mf4(...) __riscv_vluxseg2ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg3ei16_v_f16mf4(...) __riscv_vluxseg3ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg4ei16_v_f16mf4(...) __riscv_vluxseg4ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg5ei16_v_f16mf4(...) __riscv_vluxseg5ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg6ei16_v_f16mf4(...) __riscv_vluxseg6ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg7ei16_v_f16mf4(...) __riscv_vluxseg7ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg8ei16_v_f16mf4(...) __riscv_vluxseg8ei16_v_f16mf4(__VA_ARGS__) +#define vluxseg2ei16_v_f16mf2(...) __riscv_vluxseg2ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg3ei16_v_f16mf2(...) __riscv_vluxseg3ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg4ei16_v_f16mf2(...) __riscv_vluxseg4ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg5ei16_v_f16mf2(...) __riscv_vluxseg5ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg6ei16_v_f16mf2(...) __riscv_vluxseg6ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg7ei16_v_f16mf2(...) __riscv_vluxseg7ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg8ei16_v_f16mf2(...) __riscv_vluxseg8ei16_v_f16mf2(__VA_ARGS__) +#define vluxseg2ei16_v_f16m1(...) __riscv_vluxseg2ei16_v_f16m1(__VA_ARGS__) +#define vluxseg3ei16_v_f16m1(...) __riscv_vluxseg3ei16_v_f16m1(__VA_ARGS__) +#define vluxseg4ei16_v_f16m1(...) __riscv_vluxseg4ei16_v_f16m1(__VA_ARGS__) +#define vluxseg5ei16_v_f16m1(...) __riscv_vluxseg5ei16_v_f16m1(__VA_ARGS__) +#define vluxseg6ei16_v_f16m1(...) __riscv_vluxseg6ei16_v_f16m1(__VA_ARGS__) +#define vluxseg7ei16_v_f16m1(...) __riscv_vluxseg7ei16_v_f16m1(__VA_ARGS__) +#define vluxseg8ei16_v_f16m1(...) __riscv_vluxseg8ei16_v_f16m1(__VA_ARGS__) +#define vluxseg2ei16_v_f16m2(...) __riscv_vluxseg2ei16_v_f16m2(__VA_ARGS__) +#define vluxseg3ei16_v_f16m2(...) __riscv_vluxseg3ei16_v_f16m2(__VA_ARGS__) +#define vluxseg4ei16_v_f16m2(...) __riscv_vluxseg4ei16_v_f16m2(__VA_ARGS__) +#define vluxseg2ei16_v_f16m4(...) __riscv_vluxseg2ei16_v_f16m4(__VA_ARGS__) +#define vluxseg2ei32_v_f16mf4(...) __riscv_vluxseg2ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg3ei32_v_f16mf4(...) __riscv_vluxseg3ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg4ei32_v_f16mf4(...) __riscv_vluxseg4ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg5ei32_v_f16mf4(...) __riscv_vluxseg5ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg6ei32_v_f16mf4(...) __riscv_vluxseg6ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg7ei32_v_f16mf4(...) __riscv_vluxseg7ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg8ei32_v_f16mf4(...) __riscv_vluxseg8ei32_v_f16mf4(__VA_ARGS__) +#define vluxseg2ei32_v_f16mf2(...) __riscv_vluxseg2ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg3ei32_v_f16mf2(...) __riscv_vluxseg3ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg4ei32_v_f16mf2(...) __riscv_vluxseg4ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg5ei32_v_f16mf2(...) __riscv_vluxseg5ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg6ei32_v_f16mf2(...) __riscv_vluxseg6ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg7ei32_v_f16mf2(...) __riscv_vluxseg7ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg8ei32_v_f16mf2(...) __riscv_vluxseg8ei32_v_f16mf2(__VA_ARGS__) +#define vluxseg2ei32_v_f16m1(...) __riscv_vluxseg2ei32_v_f16m1(__VA_ARGS__) +#define vluxseg3ei32_v_f16m1(...) __riscv_vluxseg3ei32_v_f16m1(__VA_ARGS__) +#define vluxseg4ei32_v_f16m1(...) __riscv_vluxseg4ei32_v_f16m1(__VA_ARGS__) +#define vluxseg5ei32_v_f16m1(...) __riscv_vluxseg5ei32_v_f16m1(__VA_ARGS__) +#define vluxseg6ei32_v_f16m1(...) __riscv_vluxseg6ei32_v_f16m1(__VA_ARGS__) +#define vluxseg7ei32_v_f16m1(...) __riscv_vluxseg7ei32_v_f16m1(__VA_ARGS__) +#define vluxseg8ei32_v_f16m1(...) __riscv_vluxseg8ei32_v_f16m1(__VA_ARGS__) +#define vluxseg2ei32_v_f16m2(...) __riscv_vluxseg2ei32_v_f16m2(__VA_ARGS__) +#define vluxseg3ei32_v_f16m2(...) __riscv_vluxseg3ei32_v_f16m2(__VA_ARGS__) +#define vluxseg4ei32_v_f16m2(...) __riscv_vluxseg4ei32_v_f16m2(__VA_ARGS__) +#define vluxseg2ei32_v_f16m4(...) __riscv_vluxseg2ei32_v_f16m4(__VA_ARGS__) +#define vluxseg2ei64_v_f16mf4(...) __riscv_vluxseg2ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg3ei64_v_f16mf4(...) __riscv_vluxseg3ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg4ei64_v_f16mf4(...) __riscv_vluxseg4ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg5ei64_v_f16mf4(...) __riscv_vluxseg5ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg6ei64_v_f16mf4(...) __riscv_vluxseg6ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg7ei64_v_f16mf4(...) __riscv_vluxseg7ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg8ei64_v_f16mf4(...) __riscv_vluxseg8ei64_v_f16mf4(__VA_ARGS__) +#define vluxseg2ei64_v_f16mf2(...) __riscv_vluxseg2ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg3ei64_v_f16mf2(...) __riscv_vluxseg3ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg4ei64_v_f16mf2(...) __riscv_vluxseg4ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg5ei64_v_f16mf2(...) __riscv_vluxseg5ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg6ei64_v_f16mf2(...) __riscv_vluxseg6ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg7ei64_v_f16mf2(...) __riscv_vluxseg7ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg8ei64_v_f16mf2(...) __riscv_vluxseg8ei64_v_f16mf2(__VA_ARGS__) +#define vluxseg2ei64_v_f16m1(...) __riscv_vluxseg2ei64_v_f16m1(__VA_ARGS__) +#define vluxseg3ei64_v_f16m1(...) __riscv_vluxseg3ei64_v_f16m1(__VA_ARGS__) +#define vluxseg4ei64_v_f16m1(...) __riscv_vluxseg4ei64_v_f16m1(__VA_ARGS__) +#define vluxseg5ei64_v_f16m1(...) __riscv_vluxseg5ei64_v_f16m1(__VA_ARGS__) +#define vluxseg6ei64_v_f16m1(...) __riscv_vluxseg6ei64_v_f16m1(__VA_ARGS__) +#define vluxseg7ei64_v_f16m1(...) __riscv_vluxseg7ei64_v_f16m1(__VA_ARGS__) +#define vluxseg8ei64_v_f16m1(...) __riscv_vluxseg8ei64_v_f16m1(__VA_ARGS__) +#define vluxseg2ei64_v_f16m2(...) __riscv_vluxseg2ei64_v_f16m2(__VA_ARGS__) +#define vluxseg3ei64_v_f16m2(...) __riscv_vluxseg3ei64_v_f16m2(__VA_ARGS__) +#define vluxseg4ei64_v_f16m2(...) __riscv_vluxseg4ei64_v_f16m2(__VA_ARGS__) +#define vluxseg2ei8_v_f32mf2(...) __riscv_vluxseg2ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg3ei8_v_f32mf2(...) __riscv_vluxseg3ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg4ei8_v_f32mf2(...) __riscv_vluxseg4ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg5ei8_v_f32mf2(...) __riscv_vluxseg5ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg6ei8_v_f32mf2(...) __riscv_vluxseg6ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg7ei8_v_f32mf2(...) __riscv_vluxseg7ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg8ei8_v_f32mf2(...) __riscv_vluxseg8ei8_v_f32mf2(__VA_ARGS__) +#define vluxseg2ei8_v_f32m1(...) __riscv_vluxseg2ei8_v_f32m1(__VA_ARGS__) +#define vluxseg3ei8_v_f32m1(...) __riscv_vluxseg3ei8_v_f32m1(__VA_ARGS__) +#define vluxseg4ei8_v_f32m1(...) __riscv_vluxseg4ei8_v_f32m1(__VA_ARGS__) +#define vluxseg5ei8_v_f32m1(...) __riscv_vluxseg5ei8_v_f32m1(__VA_ARGS__) +#define vluxseg6ei8_v_f32m1(...) __riscv_vluxseg6ei8_v_f32m1(__VA_ARGS__) +#define vluxseg7ei8_v_f32m1(...) __riscv_vluxseg7ei8_v_f32m1(__VA_ARGS__) +#define vluxseg8ei8_v_f32m1(...) __riscv_vluxseg8ei8_v_f32m1(__VA_ARGS__) +#define vluxseg2ei8_v_f32m2(...) __riscv_vluxseg2ei8_v_f32m2(__VA_ARGS__) +#define vluxseg3ei8_v_f32m2(...) __riscv_vluxseg3ei8_v_f32m2(__VA_ARGS__) +#define vluxseg4ei8_v_f32m2(...) __riscv_vluxseg4ei8_v_f32m2(__VA_ARGS__) +#define vluxseg2ei8_v_f32m4(...) __riscv_vluxseg2ei8_v_f32m4(__VA_ARGS__) +#define vluxseg2ei16_v_f32mf2(...) __riscv_vluxseg2ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg3ei16_v_f32mf2(...) __riscv_vluxseg3ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg4ei16_v_f32mf2(...) __riscv_vluxseg4ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg5ei16_v_f32mf2(...) __riscv_vluxseg5ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg6ei16_v_f32mf2(...) __riscv_vluxseg6ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg7ei16_v_f32mf2(...) __riscv_vluxseg7ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg8ei16_v_f32mf2(...) __riscv_vluxseg8ei16_v_f32mf2(__VA_ARGS__) +#define vluxseg2ei16_v_f32m1(...) __riscv_vluxseg2ei16_v_f32m1(__VA_ARGS__) +#define vluxseg3ei16_v_f32m1(...) __riscv_vluxseg3ei16_v_f32m1(__VA_ARGS__) +#define vluxseg4ei16_v_f32m1(...) __riscv_vluxseg4ei16_v_f32m1(__VA_ARGS__) +#define vluxseg5ei16_v_f32m1(...) __riscv_vluxseg5ei16_v_f32m1(__VA_ARGS__) +#define vluxseg6ei16_v_f32m1(...) __riscv_vluxseg6ei16_v_f32m1(__VA_ARGS__) +#define vluxseg7ei16_v_f32m1(...) __riscv_vluxseg7ei16_v_f32m1(__VA_ARGS__) +#define vluxseg8ei16_v_f32m1(...) __riscv_vluxseg8ei16_v_f32m1(__VA_ARGS__) +#define vluxseg2ei16_v_f32m2(...) __riscv_vluxseg2ei16_v_f32m2(__VA_ARGS__) +#define vluxseg3ei16_v_f32m2(...) __riscv_vluxseg3ei16_v_f32m2(__VA_ARGS__) +#define vluxseg4ei16_v_f32m2(...) __riscv_vluxseg4ei16_v_f32m2(__VA_ARGS__) +#define vluxseg2ei16_v_f32m4(...) __riscv_vluxseg2ei16_v_f32m4(__VA_ARGS__) +#define vluxseg2ei32_v_f32mf2(...) __riscv_vluxseg2ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg3ei32_v_f32mf2(...) __riscv_vluxseg3ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg4ei32_v_f32mf2(...) __riscv_vluxseg4ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg5ei32_v_f32mf2(...) __riscv_vluxseg5ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg6ei32_v_f32mf2(...) __riscv_vluxseg6ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg7ei32_v_f32mf2(...) __riscv_vluxseg7ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg8ei32_v_f32mf2(...) __riscv_vluxseg8ei32_v_f32mf2(__VA_ARGS__) +#define vluxseg2ei32_v_f32m1(...) __riscv_vluxseg2ei32_v_f32m1(__VA_ARGS__) +#define vluxseg3ei32_v_f32m1(...) __riscv_vluxseg3ei32_v_f32m1(__VA_ARGS__) +#define vluxseg4ei32_v_f32m1(...) __riscv_vluxseg4ei32_v_f32m1(__VA_ARGS__) +#define vluxseg5ei32_v_f32m1(...) __riscv_vluxseg5ei32_v_f32m1(__VA_ARGS__) +#define vluxseg6ei32_v_f32m1(...) __riscv_vluxseg6ei32_v_f32m1(__VA_ARGS__) +#define vluxseg7ei32_v_f32m1(...) __riscv_vluxseg7ei32_v_f32m1(__VA_ARGS__) +#define vluxseg8ei32_v_f32m1(...) __riscv_vluxseg8ei32_v_f32m1(__VA_ARGS__) +#define vluxseg2ei32_v_f32m2(...) __riscv_vluxseg2ei32_v_f32m2(__VA_ARGS__) +#define vluxseg3ei32_v_f32m2(...) __riscv_vluxseg3ei32_v_f32m2(__VA_ARGS__) +#define vluxseg4ei32_v_f32m2(...) __riscv_vluxseg4ei32_v_f32m2(__VA_ARGS__) +#define vluxseg2ei32_v_f32m4(...) __riscv_vluxseg2ei32_v_f32m4(__VA_ARGS__) +#define vluxseg2ei64_v_f32mf2(...) __riscv_vluxseg2ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg3ei64_v_f32mf2(...) __riscv_vluxseg3ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg4ei64_v_f32mf2(...) __riscv_vluxseg4ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg5ei64_v_f32mf2(...) __riscv_vluxseg5ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg6ei64_v_f32mf2(...) __riscv_vluxseg6ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg7ei64_v_f32mf2(...) __riscv_vluxseg7ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg8ei64_v_f32mf2(...) __riscv_vluxseg8ei64_v_f32mf2(__VA_ARGS__) +#define vluxseg2ei64_v_f32m1(...) __riscv_vluxseg2ei64_v_f32m1(__VA_ARGS__) +#define vluxseg3ei64_v_f32m1(...) __riscv_vluxseg3ei64_v_f32m1(__VA_ARGS__) +#define vluxseg4ei64_v_f32m1(...) __riscv_vluxseg4ei64_v_f32m1(__VA_ARGS__) +#define vluxseg5ei64_v_f32m1(...) __riscv_vluxseg5ei64_v_f32m1(__VA_ARGS__) +#define vluxseg6ei64_v_f32m1(...) __riscv_vluxseg6ei64_v_f32m1(__VA_ARGS__) +#define vluxseg7ei64_v_f32m1(...) __riscv_vluxseg7ei64_v_f32m1(__VA_ARGS__) +#define vluxseg8ei64_v_f32m1(...) __riscv_vluxseg8ei64_v_f32m1(__VA_ARGS__) +#define vluxseg2ei64_v_f32m2(...) __riscv_vluxseg2ei64_v_f32m2(__VA_ARGS__) +#define vluxseg3ei64_v_f32m2(...) __riscv_vluxseg3ei64_v_f32m2(__VA_ARGS__) +#define vluxseg4ei64_v_f32m2(...) __riscv_vluxseg4ei64_v_f32m2(__VA_ARGS__) +#define vluxseg2ei64_v_f32m4(...) __riscv_vluxseg2ei64_v_f32m4(__VA_ARGS__) +#define vluxseg2ei8_v_f64m1(...) __riscv_vluxseg2ei8_v_f64m1(__VA_ARGS__) +#define vluxseg3ei8_v_f64m1(...) __riscv_vluxseg3ei8_v_f64m1(__VA_ARGS__) +#define vluxseg4ei8_v_f64m1(...) __riscv_vluxseg4ei8_v_f64m1(__VA_ARGS__) +#define vluxseg5ei8_v_f64m1(...) __riscv_vluxseg5ei8_v_f64m1(__VA_ARGS__) +#define vluxseg6ei8_v_f64m1(...) __riscv_vluxseg6ei8_v_f64m1(__VA_ARGS__) +#define vluxseg7ei8_v_f64m1(...) __riscv_vluxseg7ei8_v_f64m1(__VA_ARGS__) +#define vluxseg8ei8_v_f64m1(...) __riscv_vluxseg8ei8_v_f64m1(__VA_ARGS__) +#define vluxseg2ei8_v_f64m2(...) __riscv_vluxseg2ei8_v_f64m2(__VA_ARGS__) +#define vluxseg3ei8_v_f64m2(...) __riscv_vluxseg3ei8_v_f64m2(__VA_ARGS__) +#define vluxseg4ei8_v_f64m2(...) __riscv_vluxseg4ei8_v_f64m2(__VA_ARGS__) +#define vluxseg2ei8_v_f64m4(...) __riscv_vluxseg2ei8_v_f64m4(__VA_ARGS__) +#define vluxseg2ei16_v_f64m1(...) __riscv_vluxseg2ei16_v_f64m1(__VA_ARGS__) +#define vluxseg3ei16_v_f64m1(...) __riscv_vluxseg3ei16_v_f64m1(__VA_ARGS__) +#define vluxseg4ei16_v_f64m1(...) __riscv_vluxseg4ei16_v_f64m1(__VA_ARGS__) +#define vluxseg5ei16_v_f64m1(...) __riscv_vluxseg5ei16_v_f64m1(__VA_ARGS__) +#define vluxseg6ei16_v_f64m1(...) __riscv_vluxseg6ei16_v_f64m1(__VA_ARGS__) +#define vluxseg7ei16_v_f64m1(...) __riscv_vluxseg7ei16_v_f64m1(__VA_ARGS__) +#define vluxseg8ei16_v_f64m1(...) __riscv_vluxseg8ei16_v_f64m1(__VA_ARGS__) +#define vluxseg2ei16_v_f64m2(...) __riscv_vluxseg2ei16_v_f64m2(__VA_ARGS__) +#define vluxseg3ei16_v_f64m2(...) __riscv_vluxseg3ei16_v_f64m2(__VA_ARGS__) +#define vluxseg4ei16_v_f64m2(...) __riscv_vluxseg4ei16_v_f64m2(__VA_ARGS__) +#define vluxseg2ei16_v_f64m4(...) __riscv_vluxseg2ei16_v_f64m4(__VA_ARGS__) +#define vluxseg2ei32_v_f64m1(...) __riscv_vluxseg2ei32_v_f64m1(__VA_ARGS__) +#define vluxseg3ei32_v_f64m1(...) __riscv_vluxseg3ei32_v_f64m1(__VA_ARGS__) +#define vluxseg4ei32_v_f64m1(...) __riscv_vluxseg4ei32_v_f64m1(__VA_ARGS__) +#define vluxseg5ei32_v_f64m1(...) __riscv_vluxseg5ei32_v_f64m1(__VA_ARGS__) +#define vluxseg6ei32_v_f64m1(...) __riscv_vluxseg6ei32_v_f64m1(__VA_ARGS__) +#define vluxseg7ei32_v_f64m1(...) __riscv_vluxseg7ei32_v_f64m1(__VA_ARGS__) +#define vluxseg8ei32_v_f64m1(...) __riscv_vluxseg8ei32_v_f64m1(__VA_ARGS__) +#define vluxseg2ei32_v_f64m2(...) __riscv_vluxseg2ei32_v_f64m2(__VA_ARGS__) +#define vluxseg3ei32_v_f64m2(...) __riscv_vluxseg3ei32_v_f64m2(__VA_ARGS__) +#define vluxseg4ei32_v_f64m2(...) __riscv_vluxseg4ei32_v_f64m2(__VA_ARGS__) +#define vluxseg2ei32_v_f64m4(...) __riscv_vluxseg2ei32_v_f64m4(__VA_ARGS__) +#define vluxseg2ei64_v_f64m1(...) __riscv_vluxseg2ei64_v_f64m1(__VA_ARGS__) +#define vluxseg3ei64_v_f64m1(...) __riscv_vluxseg3ei64_v_f64m1(__VA_ARGS__) +#define vluxseg4ei64_v_f64m1(...) __riscv_vluxseg4ei64_v_f64m1(__VA_ARGS__) +#define vluxseg5ei64_v_f64m1(...) __riscv_vluxseg5ei64_v_f64m1(__VA_ARGS__) +#define vluxseg6ei64_v_f64m1(...) __riscv_vluxseg6ei64_v_f64m1(__VA_ARGS__) +#define vluxseg7ei64_v_f64m1(...) __riscv_vluxseg7ei64_v_f64m1(__VA_ARGS__) +#define vluxseg8ei64_v_f64m1(...) __riscv_vluxseg8ei64_v_f64m1(__VA_ARGS__) +#define vluxseg2ei64_v_f64m2(...) __riscv_vluxseg2ei64_v_f64m2(__VA_ARGS__) +#define vluxseg3ei64_v_f64m2(...) __riscv_vluxseg3ei64_v_f64m2(__VA_ARGS__) +#define vluxseg4ei64_v_f64m2(...) __riscv_vluxseg4ei64_v_f64m2(__VA_ARGS__) +#define vluxseg2ei64_v_f64m4(...) __riscv_vluxseg2ei64_v_f64m4(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf8(...) __riscv_vloxseg2ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf8(...) __riscv_vloxseg3ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf8(...) __riscv_vloxseg4ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf8(...) __riscv_vloxseg5ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf8(...) __riscv_vloxseg6ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf8(...) __riscv_vloxseg7ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf8(...) __riscv_vloxseg8ei8_v_i8mf8(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf4(...) __riscv_vloxseg2ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf4(...) __riscv_vloxseg3ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf4(...) __riscv_vloxseg4ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf4(...) __riscv_vloxseg5ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf4(...) __riscv_vloxseg6ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf4(...) __riscv_vloxseg7ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf4(...) __riscv_vloxseg8ei8_v_i8mf4(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf2(...) __riscv_vloxseg2ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf2(...) __riscv_vloxseg3ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf2(...) __riscv_vloxseg4ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf2(...) __riscv_vloxseg5ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf2(...) __riscv_vloxseg6ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf2(...) __riscv_vloxseg7ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf2(...) __riscv_vloxseg8ei8_v_i8mf2(__VA_ARGS__) +#define vloxseg2ei8_v_i8m1(...) __riscv_vloxseg2ei8_v_i8m1(__VA_ARGS__) +#define vloxseg3ei8_v_i8m1(...) __riscv_vloxseg3ei8_v_i8m1(__VA_ARGS__) +#define vloxseg4ei8_v_i8m1(...) __riscv_vloxseg4ei8_v_i8m1(__VA_ARGS__) +#define vloxseg5ei8_v_i8m1(...) __riscv_vloxseg5ei8_v_i8m1(__VA_ARGS__) +#define vloxseg6ei8_v_i8m1(...) __riscv_vloxseg6ei8_v_i8m1(__VA_ARGS__) +#define vloxseg7ei8_v_i8m1(...) __riscv_vloxseg7ei8_v_i8m1(__VA_ARGS__) +#define vloxseg8ei8_v_i8m1(...) __riscv_vloxseg8ei8_v_i8m1(__VA_ARGS__) +#define vloxseg2ei8_v_i8m2(...) __riscv_vloxseg2ei8_v_i8m2(__VA_ARGS__) +#define vloxseg3ei8_v_i8m2(...) __riscv_vloxseg3ei8_v_i8m2(__VA_ARGS__) +#define vloxseg4ei8_v_i8m2(...) __riscv_vloxseg4ei8_v_i8m2(__VA_ARGS__) +#define vloxseg2ei8_v_i8m4(...) __riscv_vloxseg2ei8_v_i8m4(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf8(...) __riscv_vloxseg2ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf8(...) __riscv_vloxseg3ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf8(...) __riscv_vloxseg4ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf8(...) __riscv_vloxseg5ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf8(...) __riscv_vloxseg6ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf8(...) __riscv_vloxseg7ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf8(...) __riscv_vloxseg8ei16_v_i8mf8(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf4(...) __riscv_vloxseg2ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf4(...) __riscv_vloxseg3ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf4(...) __riscv_vloxseg4ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf4(...) __riscv_vloxseg5ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf4(...) __riscv_vloxseg6ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf4(...) __riscv_vloxseg7ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf4(...) __riscv_vloxseg8ei16_v_i8mf4(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf2(...) __riscv_vloxseg2ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf2(...) __riscv_vloxseg3ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf2(...) __riscv_vloxseg4ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf2(...) __riscv_vloxseg5ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf2(...) __riscv_vloxseg6ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf2(...) __riscv_vloxseg7ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf2(...) __riscv_vloxseg8ei16_v_i8mf2(__VA_ARGS__) +#define vloxseg2ei16_v_i8m1(...) __riscv_vloxseg2ei16_v_i8m1(__VA_ARGS__) +#define vloxseg3ei16_v_i8m1(...) __riscv_vloxseg3ei16_v_i8m1(__VA_ARGS__) +#define vloxseg4ei16_v_i8m1(...) __riscv_vloxseg4ei16_v_i8m1(__VA_ARGS__) +#define vloxseg5ei16_v_i8m1(...) __riscv_vloxseg5ei16_v_i8m1(__VA_ARGS__) +#define vloxseg6ei16_v_i8m1(...) __riscv_vloxseg6ei16_v_i8m1(__VA_ARGS__) +#define vloxseg7ei16_v_i8m1(...) __riscv_vloxseg7ei16_v_i8m1(__VA_ARGS__) +#define vloxseg8ei16_v_i8m1(...) __riscv_vloxseg8ei16_v_i8m1(__VA_ARGS__) +#define vloxseg2ei16_v_i8m2(...) __riscv_vloxseg2ei16_v_i8m2(__VA_ARGS__) +#define vloxseg3ei16_v_i8m2(...) __riscv_vloxseg3ei16_v_i8m2(__VA_ARGS__) +#define vloxseg4ei16_v_i8m2(...) __riscv_vloxseg4ei16_v_i8m2(__VA_ARGS__) +#define vloxseg2ei16_v_i8m4(...) __riscv_vloxseg2ei16_v_i8m4(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf8(...) __riscv_vloxseg2ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf8(...) __riscv_vloxseg3ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf8(...) __riscv_vloxseg4ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf8(...) __riscv_vloxseg5ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf8(...) __riscv_vloxseg6ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf8(...) __riscv_vloxseg7ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf8(...) __riscv_vloxseg8ei32_v_i8mf8(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf4(...) __riscv_vloxseg2ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf4(...) __riscv_vloxseg3ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf4(...) __riscv_vloxseg4ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf4(...) __riscv_vloxseg5ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf4(...) __riscv_vloxseg6ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf4(...) __riscv_vloxseg7ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf4(...) __riscv_vloxseg8ei32_v_i8mf4(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf2(...) __riscv_vloxseg2ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf2(...) __riscv_vloxseg3ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf2(...) __riscv_vloxseg4ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf2(...) __riscv_vloxseg5ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf2(...) __riscv_vloxseg6ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf2(...) __riscv_vloxseg7ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf2(...) __riscv_vloxseg8ei32_v_i8mf2(__VA_ARGS__) +#define vloxseg2ei32_v_i8m1(...) __riscv_vloxseg2ei32_v_i8m1(__VA_ARGS__) +#define vloxseg3ei32_v_i8m1(...) __riscv_vloxseg3ei32_v_i8m1(__VA_ARGS__) +#define vloxseg4ei32_v_i8m1(...) __riscv_vloxseg4ei32_v_i8m1(__VA_ARGS__) +#define vloxseg5ei32_v_i8m1(...) __riscv_vloxseg5ei32_v_i8m1(__VA_ARGS__) +#define vloxseg6ei32_v_i8m1(...) __riscv_vloxseg6ei32_v_i8m1(__VA_ARGS__) +#define vloxseg7ei32_v_i8m1(...) __riscv_vloxseg7ei32_v_i8m1(__VA_ARGS__) +#define vloxseg8ei32_v_i8m1(...) __riscv_vloxseg8ei32_v_i8m1(__VA_ARGS__) +#define vloxseg2ei32_v_i8m2(...) __riscv_vloxseg2ei32_v_i8m2(__VA_ARGS__) +#define vloxseg3ei32_v_i8m2(...) __riscv_vloxseg3ei32_v_i8m2(__VA_ARGS__) +#define vloxseg4ei32_v_i8m2(...) __riscv_vloxseg4ei32_v_i8m2(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf8(...) __riscv_vloxseg2ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf8(...) __riscv_vloxseg3ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf8(...) __riscv_vloxseg4ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf8(...) __riscv_vloxseg5ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf8(...) __riscv_vloxseg6ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf8(...) __riscv_vloxseg7ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf8(...) __riscv_vloxseg8ei64_v_i8mf8(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf4(...) __riscv_vloxseg2ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf4(...) __riscv_vloxseg3ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf4(...) __riscv_vloxseg4ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf4(...) __riscv_vloxseg5ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf4(...) __riscv_vloxseg6ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf4(...) __riscv_vloxseg7ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf4(...) __riscv_vloxseg8ei64_v_i8mf4(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf2(...) __riscv_vloxseg2ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf2(...) __riscv_vloxseg3ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf2(...) __riscv_vloxseg4ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf2(...) __riscv_vloxseg5ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf2(...) __riscv_vloxseg6ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf2(...) __riscv_vloxseg7ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf2(...) __riscv_vloxseg8ei64_v_i8mf2(__VA_ARGS__) +#define vloxseg2ei64_v_i8m1(...) __riscv_vloxseg2ei64_v_i8m1(__VA_ARGS__) +#define vloxseg3ei64_v_i8m1(...) __riscv_vloxseg3ei64_v_i8m1(__VA_ARGS__) +#define vloxseg4ei64_v_i8m1(...) __riscv_vloxseg4ei64_v_i8m1(__VA_ARGS__) +#define vloxseg5ei64_v_i8m1(...) __riscv_vloxseg5ei64_v_i8m1(__VA_ARGS__) +#define vloxseg6ei64_v_i8m1(...) __riscv_vloxseg6ei64_v_i8m1(__VA_ARGS__) +#define vloxseg7ei64_v_i8m1(...) __riscv_vloxseg7ei64_v_i8m1(__VA_ARGS__) +#define vloxseg8ei64_v_i8m1(...) __riscv_vloxseg8ei64_v_i8m1(__VA_ARGS__) +#define vloxseg2ei8_v_i16mf4(...) __riscv_vloxseg2ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg3ei8_v_i16mf4(...) __riscv_vloxseg3ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg4ei8_v_i16mf4(...) __riscv_vloxseg4ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg5ei8_v_i16mf4(...) __riscv_vloxseg5ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg6ei8_v_i16mf4(...) __riscv_vloxseg6ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg7ei8_v_i16mf4(...) __riscv_vloxseg7ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg8ei8_v_i16mf4(...) __riscv_vloxseg8ei8_v_i16mf4(__VA_ARGS__) +#define vloxseg2ei8_v_i16mf2(...) __riscv_vloxseg2ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg3ei8_v_i16mf2(...) __riscv_vloxseg3ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg4ei8_v_i16mf2(...) __riscv_vloxseg4ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg5ei8_v_i16mf2(...) __riscv_vloxseg5ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg6ei8_v_i16mf2(...) __riscv_vloxseg6ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg7ei8_v_i16mf2(...) __riscv_vloxseg7ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg8ei8_v_i16mf2(...) __riscv_vloxseg8ei8_v_i16mf2(__VA_ARGS__) +#define vloxseg2ei8_v_i16m1(...) __riscv_vloxseg2ei8_v_i16m1(__VA_ARGS__) +#define vloxseg3ei8_v_i16m1(...) __riscv_vloxseg3ei8_v_i16m1(__VA_ARGS__) +#define vloxseg4ei8_v_i16m1(...) __riscv_vloxseg4ei8_v_i16m1(__VA_ARGS__) +#define vloxseg5ei8_v_i16m1(...) __riscv_vloxseg5ei8_v_i16m1(__VA_ARGS__) +#define vloxseg6ei8_v_i16m1(...) __riscv_vloxseg6ei8_v_i16m1(__VA_ARGS__) +#define vloxseg7ei8_v_i16m1(...) __riscv_vloxseg7ei8_v_i16m1(__VA_ARGS__) +#define vloxseg8ei8_v_i16m1(...) __riscv_vloxseg8ei8_v_i16m1(__VA_ARGS__) +#define vloxseg2ei8_v_i16m2(...) __riscv_vloxseg2ei8_v_i16m2(__VA_ARGS__) +#define vloxseg3ei8_v_i16m2(...) __riscv_vloxseg3ei8_v_i16m2(__VA_ARGS__) +#define vloxseg4ei8_v_i16m2(...) __riscv_vloxseg4ei8_v_i16m2(__VA_ARGS__) +#define vloxseg2ei8_v_i16m4(...) __riscv_vloxseg2ei8_v_i16m4(__VA_ARGS__) +#define vloxseg2ei16_v_i16mf4(...) __riscv_vloxseg2ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg3ei16_v_i16mf4(...) __riscv_vloxseg3ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg4ei16_v_i16mf4(...) __riscv_vloxseg4ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg5ei16_v_i16mf4(...) __riscv_vloxseg5ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg6ei16_v_i16mf4(...) __riscv_vloxseg6ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg7ei16_v_i16mf4(...) __riscv_vloxseg7ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg8ei16_v_i16mf4(...) __riscv_vloxseg8ei16_v_i16mf4(__VA_ARGS__) +#define vloxseg2ei16_v_i16mf2(...) __riscv_vloxseg2ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg3ei16_v_i16mf2(...) __riscv_vloxseg3ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg4ei16_v_i16mf2(...) __riscv_vloxseg4ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg5ei16_v_i16mf2(...) __riscv_vloxseg5ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg6ei16_v_i16mf2(...) __riscv_vloxseg6ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg7ei16_v_i16mf2(...) __riscv_vloxseg7ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg8ei16_v_i16mf2(...) __riscv_vloxseg8ei16_v_i16mf2(__VA_ARGS__) +#define vloxseg2ei16_v_i16m1(...) __riscv_vloxseg2ei16_v_i16m1(__VA_ARGS__) +#define vloxseg3ei16_v_i16m1(...) __riscv_vloxseg3ei16_v_i16m1(__VA_ARGS__) +#define vloxseg4ei16_v_i16m1(...) __riscv_vloxseg4ei16_v_i16m1(__VA_ARGS__) +#define vloxseg5ei16_v_i16m1(...) __riscv_vloxseg5ei16_v_i16m1(__VA_ARGS__) +#define vloxseg6ei16_v_i16m1(...) __riscv_vloxseg6ei16_v_i16m1(__VA_ARGS__) +#define vloxseg7ei16_v_i16m1(...) __riscv_vloxseg7ei16_v_i16m1(__VA_ARGS__) +#define vloxseg8ei16_v_i16m1(...) __riscv_vloxseg8ei16_v_i16m1(__VA_ARGS__) +#define vloxseg2ei16_v_i16m2(...) __riscv_vloxseg2ei16_v_i16m2(__VA_ARGS__) +#define vloxseg3ei16_v_i16m2(...) __riscv_vloxseg3ei16_v_i16m2(__VA_ARGS__) +#define vloxseg4ei16_v_i16m2(...) __riscv_vloxseg4ei16_v_i16m2(__VA_ARGS__) +#define vloxseg2ei16_v_i16m4(...) __riscv_vloxseg2ei16_v_i16m4(__VA_ARGS__) +#define vloxseg2ei32_v_i16mf4(...) __riscv_vloxseg2ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg3ei32_v_i16mf4(...) __riscv_vloxseg3ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg4ei32_v_i16mf4(...) __riscv_vloxseg4ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg5ei32_v_i16mf4(...) __riscv_vloxseg5ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg6ei32_v_i16mf4(...) __riscv_vloxseg6ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg7ei32_v_i16mf4(...) __riscv_vloxseg7ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg8ei32_v_i16mf4(...) __riscv_vloxseg8ei32_v_i16mf4(__VA_ARGS__) +#define vloxseg2ei32_v_i16mf2(...) __riscv_vloxseg2ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg3ei32_v_i16mf2(...) __riscv_vloxseg3ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg4ei32_v_i16mf2(...) __riscv_vloxseg4ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg5ei32_v_i16mf2(...) __riscv_vloxseg5ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg6ei32_v_i16mf2(...) __riscv_vloxseg6ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg7ei32_v_i16mf2(...) __riscv_vloxseg7ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg8ei32_v_i16mf2(...) __riscv_vloxseg8ei32_v_i16mf2(__VA_ARGS__) +#define vloxseg2ei32_v_i16m1(...) __riscv_vloxseg2ei32_v_i16m1(__VA_ARGS__) +#define vloxseg3ei32_v_i16m1(...) __riscv_vloxseg3ei32_v_i16m1(__VA_ARGS__) +#define vloxseg4ei32_v_i16m1(...) __riscv_vloxseg4ei32_v_i16m1(__VA_ARGS__) +#define vloxseg5ei32_v_i16m1(...) __riscv_vloxseg5ei32_v_i16m1(__VA_ARGS__) +#define vloxseg6ei32_v_i16m1(...) __riscv_vloxseg6ei32_v_i16m1(__VA_ARGS__) +#define vloxseg7ei32_v_i16m1(...) __riscv_vloxseg7ei32_v_i16m1(__VA_ARGS__) +#define vloxseg8ei32_v_i16m1(...) __riscv_vloxseg8ei32_v_i16m1(__VA_ARGS__) +#define vloxseg2ei32_v_i16m2(...) __riscv_vloxseg2ei32_v_i16m2(__VA_ARGS__) +#define vloxseg3ei32_v_i16m2(...) __riscv_vloxseg3ei32_v_i16m2(__VA_ARGS__) +#define vloxseg4ei32_v_i16m2(...) __riscv_vloxseg4ei32_v_i16m2(__VA_ARGS__) +#define vloxseg2ei32_v_i16m4(...) __riscv_vloxseg2ei32_v_i16m4(__VA_ARGS__) +#define vloxseg2ei64_v_i16mf4(...) __riscv_vloxseg2ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg3ei64_v_i16mf4(...) __riscv_vloxseg3ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg4ei64_v_i16mf4(...) __riscv_vloxseg4ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg5ei64_v_i16mf4(...) __riscv_vloxseg5ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg6ei64_v_i16mf4(...) __riscv_vloxseg6ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg7ei64_v_i16mf4(...) __riscv_vloxseg7ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg8ei64_v_i16mf4(...) __riscv_vloxseg8ei64_v_i16mf4(__VA_ARGS__) +#define vloxseg2ei64_v_i16mf2(...) __riscv_vloxseg2ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg3ei64_v_i16mf2(...) __riscv_vloxseg3ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg4ei64_v_i16mf2(...) __riscv_vloxseg4ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg5ei64_v_i16mf2(...) __riscv_vloxseg5ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg6ei64_v_i16mf2(...) __riscv_vloxseg6ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg7ei64_v_i16mf2(...) __riscv_vloxseg7ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg8ei64_v_i16mf2(...) __riscv_vloxseg8ei64_v_i16mf2(__VA_ARGS__) +#define vloxseg2ei64_v_i16m1(...) __riscv_vloxseg2ei64_v_i16m1(__VA_ARGS__) +#define vloxseg3ei64_v_i16m1(...) __riscv_vloxseg3ei64_v_i16m1(__VA_ARGS__) +#define vloxseg4ei64_v_i16m1(...) __riscv_vloxseg4ei64_v_i16m1(__VA_ARGS__) +#define vloxseg5ei64_v_i16m1(...) __riscv_vloxseg5ei64_v_i16m1(__VA_ARGS__) +#define vloxseg6ei64_v_i16m1(...) __riscv_vloxseg6ei64_v_i16m1(__VA_ARGS__) +#define vloxseg7ei64_v_i16m1(...) __riscv_vloxseg7ei64_v_i16m1(__VA_ARGS__) +#define vloxseg8ei64_v_i16m1(...) __riscv_vloxseg8ei64_v_i16m1(__VA_ARGS__) +#define vloxseg2ei64_v_i16m2(...) __riscv_vloxseg2ei64_v_i16m2(__VA_ARGS__) +#define vloxseg3ei64_v_i16m2(...) __riscv_vloxseg3ei64_v_i16m2(__VA_ARGS__) +#define vloxseg4ei64_v_i16m2(...) __riscv_vloxseg4ei64_v_i16m2(__VA_ARGS__) +#define vloxseg2ei8_v_i32mf2(...) __riscv_vloxseg2ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg3ei8_v_i32mf2(...) __riscv_vloxseg3ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg4ei8_v_i32mf2(...) __riscv_vloxseg4ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg5ei8_v_i32mf2(...) __riscv_vloxseg5ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg6ei8_v_i32mf2(...) __riscv_vloxseg6ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg7ei8_v_i32mf2(...) __riscv_vloxseg7ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg8ei8_v_i32mf2(...) __riscv_vloxseg8ei8_v_i32mf2(__VA_ARGS__) +#define vloxseg2ei8_v_i32m1(...) __riscv_vloxseg2ei8_v_i32m1(__VA_ARGS__) +#define vloxseg3ei8_v_i32m1(...) __riscv_vloxseg3ei8_v_i32m1(__VA_ARGS__) +#define vloxseg4ei8_v_i32m1(...) __riscv_vloxseg4ei8_v_i32m1(__VA_ARGS__) +#define vloxseg5ei8_v_i32m1(...) __riscv_vloxseg5ei8_v_i32m1(__VA_ARGS__) +#define vloxseg6ei8_v_i32m1(...) __riscv_vloxseg6ei8_v_i32m1(__VA_ARGS__) +#define vloxseg7ei8_v_i32m1(...) __riscv_vloxseg7ei8_v_i32m1(__VA_ARGS__) +#define vloxseg8ei8_v_i32m1(...) __riscv_vloxseg8ei8_v_i32m1(__VA_ARGS__) +#define vloxseg2ei8_v_i32m2(...) __riscv_vloxseg2ei8_v_i32m2(__VA_ARGS__) +#define vloxseg3ei8_v_i32m2(...) __riscv_vloxseg3ei8_v_i32m2(__VA_ARGS__) +#define vloxseg4ei8_v_i32m2(...) __riscv_vloxseg4ei8_v_i32m2(__VA_ARGS__) +#define vloxseg2ei8_v_i32m4(...) __riscv_vloxseg2ei8_v_i32m4(__VA_ARGS__) +#define vloxseg2ei16_v_i32mf2(...) __riscv_vloxseg2ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg3ei16_v_i32mf2(...) __riscv_vloxseg3ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg4ei16_v_i32mf2(...) __riscv_vloxseg4ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg5ei16_v_i32mf2(...) __riscv_vloxseg5ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg6ei16_v_i32mf2(...) __riscv_vloxseg6ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg7ei16_v_i32mf2(...) __riscv_vloxseg7ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg8ei16_v_i32mf2(...) __riscv_vloxseg8ei16_v_i32mf2(__VA_ARGS__) +#define vloxseg2ei16_v_i32m1(...) __riscv_vloxseg2ei16_v_i32m1(__VA_ARGS__) +#define vloxseg3ei16_v_i32m1(...) __riscv_vloxseg3ei16_v_i32m1(__VA_ARGS__) +#define vloxseg4ei16_v_i32m1(...) __riscv_vloxseg4ei16_v_i32m1(__VA_ARGS__) +#define vloxseg5ei16_v_i32m1(...) __riscv_vloxseg5ei16_v_i32m1(__VA_ARGS__) +#define vloxseg6ei16_v_i32m1(...) __riscv_vloxseg6ei16_v_i32m1(__VA_ARGS__) +#define vloxseg7ei16_v_i32m1(...) __riscv_vloxseg7ei16_v_i32m1(__VA_ARGS__) +#define vloxseg8ei16_v_i32m1(...) __riscv_vloxseg8ei16_v_i32m1(__VA_ARGS__) +#define vloxseg2ei16_v_i32m2(...) __riscv_vloxseg2ei16_v_i32m2(__VA_ARGS__) +#define vloxseg3ei16_v_i32m2(...) __riscv_vloxseg3ei16_v_i32m2(__VA_ARGS__) +#define vloxseg4ei16_v_i32m2(...) __riscv_vloxseg4ei16_v_i32m2(__VA_ARGS__) +#define vloxseg2ei16_v_i32m4(...) __riscv_vloxseg2ei16_v_i32m4(__VA_ARGS__) +#define vloxseg2ei32_v_i32mf2(...) __riscv_vloxseg2ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg3ei32_v_i32mf2(...) __riscv_vloxseg3ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg4ei32_v_i32mf2(...) __riscv_vloxseg4ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg5ei32_v_i32mf2(...) __riscv_vloxseg5ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg6ei32_v_i32mf2(...) __riscv_vloxseg6ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg7ei32_v_i32mf2(...) __riscv_vloxseg7ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg8ei32_v_i32mf2(...) __riscv_vloxseg8ei32_v_i32mf2(__VA_ARGS__) +#define vloxseg2ei32_v_i32m1(...) __riscv_vloxseg2ei32_v_i32m1(__VA_ARGS__) +#define vloxseg3ei32_v_i32m1(...) __riscv_vloxseg3ei32_v_i32m1(__VA_ARGS__) +#define vloxseg4ei32_v_i32m1(...) __riscv_vloxseg4ei32_v_i32m1(__VA_ARGS__) +#define vloxseg5ei32_v_i32m1(...) __riscv_vloxseg5ei32_v_i32m1(__VA_ARGS__) +#define vloxseg6ei32_v_i32m1(...) __riscv_vloxseg6ei32_v_i32m1(__VA_ARGS__) +#define vloxseg7ei32_v_i32m1(...) __riscv_vloxseg7ei32_v_i32m1(__VA_ARGS__) +#define vloxseg8ei32_v_i32m1(...) __riscv_vloxseg8ei32_v_i32m1(__VA_ARGS__) +#define vloxseg2ei32_v_i32m2(...) __riscv_vloxseg2ei32_v_i32m2(__VA_ARGS__) +#define vloxseg3ei32_v_i32m2(...) __riscv_vloxseg3ei32_v_i32m2(__VA_ARGS__) +#define vloxseg4ei32_v_i32m2(...) __riscv_vloxseg4ei32_v_i32m2(__VA_ARGS__) +#define vloxseg2ei32_v_i32m4(...) __riscv_vloxseg2ei32_v_i32m4(__VA_ARGS__) +#define vloxseg2ei64_v_i32mf2(...) __riscv_vloxseg2ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg3ei64_v_i32mf2(...) __riscv_vloxseg3ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg4ei64_v_i32mf2(...) __riscv_vloxseg4ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg5ei64_v_i32mf2(...) __riscv_vloxseg5ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg6ei64_v_i32mf2(...) __riscv_vloxseg6ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg7ei64_v_i32mf2(...) __riscv_vloxseg7ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg8ei64_v_i32mf2(...) __riscv_vloxseg8ei64_v_i32mf2(__VA_ARGS__) +#define vloxseg2ei64_v_i32m1(...) __riscv_vloxseg2ei64_v_i32m1(__VA_ARGS__) +#define vloxseg3ei64_v_i32m1(...) __riscv_vloxseg3ei64_v_i32m1(__VA_ARGS__) +#define vloxseg4ei64_v_i32m1(...) __riscv_vloxseg4ei64_v_i32m1(__VA_ARGS__) +#define vloxseg5ei64_v_i32m1(...) __riscv_vloxseg5ei64_v_i32m1(__VA_ARGS__) +#define vloxseg6ei64_v_i32m1(...) __riscv_vloxseg6ei64_v_i32m1(__VA_ARGS__) +#define vloxseg7ei64_v_i32m1(...) __riscv_vloxseg7ei64_v_i32m1(__VA_ARGS__) +#define vloxseg8ei64_v_i32m1(...) __riscv_vloxseg8ei64_v_i32m1(__VA_ARGS__) +#define vloxseg2ei64_v_i32m2(...) __riscv_vloxseg2ei64_v_i32m2(__VA_ARGS__) +#define vloxseg3ei64_v_i32m2(...) __riscv_vloxseg3ei64_v_i32m2(__VA_ARGS__) +#define vloxseg4ei64_v_i32m2(...) __riscv_vloxseg4ei64_v_i32m2(__VA_ARGS__) +#define vloxseg2ei64_v_i32m4(...) __riscv_vloxseg2ei64_v_i32m4(__VA_ARGS__) +#define vloxseg2ei8_v_i64m1(...) __riscv_vloxseg2ei8_v_i64m1(__VA_ARGS__) +#define vloxseg3ei8_v_i64m1(...) __riscv_vloxseg3ei8_v_i64m1(__VA_ARGS__) +#define vloxseg4ei8_v_i64m1(...) __riscv_vloxseg4ei8_v_i64m1(__VA_ARGS__) +#define vloxseg5ei8_v_i64m1(...) __riscv_vloxseg5ei8_v_i64m1(__VA_ARGS__) +#define vloxseg6ei8_v_i64m1(...) __riscv_vloxseg6ei8_v_i64m1(__VA_ARGS__) +#define vloxseg7ei8_v_i64m1(...) __riscv_vloxseg7ei8_v_i64m1(__VA_ARGS__) +#define vloxseg8ei8_v_i64m1(...) __riscv_vloxseg8ei8_v_i64m1(__VA_ARGS__) +#define vloxseg2ei8_v_i64m2(...) __riscv_vloxseg2ei8_v_i64m2(__VA_ARGS__) +#define vloxseg3ei8_v_i64m2(...) __riscv_vloxseg3ei8_v_i64m2(__VA_ARGS__) +#define vloxseg4ei8_v_i64m2(...) __riscv_vloxseg4ei8_v_i64m2(__VA_ARGS__) +#define vloxseg2ei8_v_i64m4(...) __riscv_vloxseg2ei8_v_i64m4(__VA_ARGS__) +#define vloxseg2ei16_v_i64m1(...) __riscv_vloxseg2ei16_v_i64m1(__VA_ARGS__) +#define vloxseg3ei16_v_i64m1(...) __riscv_vloxseg3ei16_v_i64m1(__VA_ARGS__) +#define vloxseg4ei16_v_i64m1(...) __riscv_vloxseg4ei16_v_i64m1(__VA_ARGS__) +#define vloxseg5ei16_v_i64m1(...) __riscv_vloxseg5ei16_v_i64m1(__VA_ARGS__) +#define vloxseg6ei16_v_i64m1(...) __riscv_vloxseg6ei16_v_i64m1(__VA_ARGS__) +#define vloxseg7ei16_v_i64m1(...) __riscv_vloxseg7ei16_v_i64m1(__VA_ARGS__) +#define vloxseg8ei16_v_i64m1(...) __riscv_vloxseg8ei16_v_i64m1(__VA_ARGS__) +#define vloxseg2ei16_v_i64m2(...) __riscv_vloxseg2ei16_v_i64m2(__VA_ARGS__) +#define vloxseg3ei16_v_i64m2(...) __riscv_vloxseg3ei16_v_i64m2(__VA_ARGS__) +#define vloxseg4ei16_v_i64m2(...) __riscv_vloxseg4ei16_v_i64m2(__VA_ARGS__) +#define vloxseg2ei16_v_i64m4(...) __riscv_vloxseg2ei16_v_i64m4(__VA_ARGS__) +#define vloxseg2ei32_v_i64m1(...) __riscv_vloxseg2ei32_v_i64m1(__VA_ARGS__) +#define vloxseg3ei32_v_i64m1(...) __riscv_vloxseg3ei32_v_i64m1(__VA_ARGS__) +#define vloxseg4ei32_v_i64m1(...) __riscv_vloxseg4ei32_v_i64m1(__VA_ARGS__) +#define vloxseg5ei32_v_i64m1(...) __riscv_vloxseg5ei32_v_i64m1(__VA_ARGS__) +#define vloxseg6ei32_v_i64m1(...) __riscv_vloxseg6ei32_v_i64m1(__VA_ARGS__) +#define vloxseg7ei32_v_i64m1(...) __riscv_vloxseg7ei32_v_i64m1(__VA_ARGS__) +#define vloxseg8ei32_v_i64m1(...) __riscv_vloxseg8ei32_v_i64m1(__VA_ARGS__) +#define vloxseg2ei32_v_i64m2(...) __riscv_vloxseg2ei32_v_i64m2(__VA_ARGS__) +#define vloxseg3ei32_v_i64m2(...) __riscv_vloxseg3ei32_v_i64m2(__VA_ARGS__) +#define vloxseg4ei32_v_i64m2(...) __riscv_vloxseg4ei32_v_i64m2(__VA_ARGS__) +#define vloxseg2ei32_v_i64m4(...) __riscv_vloxseg2ei32_v_i64m4(__VA_ARGS__) +#define vloxseg2ei64_v_i64m1(...) __riscv_vloxseg2ei64_v_i64m1(__VA_ARGS__) +#define vloxseg3ei64_v_i64m1(...) __riscv_vloxseg3ei64_v_i64m1(__VA_ARGS__) +#define vloxseg4ei64_v_i64m1(...) __riscv_vloxseg4ei64_v_i64m1(__VA_ARGS__) +#define vloxseg5ei64_v_i64m1(...) __riscv_vloxseg5ei64_v_i64m1(__VA_ARGS__) +#define vloxseg6ei64_v_i64m1(...) __riscv_vloxseg6ei64_v_i64m1(__VA_ARGS__) +#define vloxseg7ei64_v_i64m1(...) __riscv_vloxseg7ei64_v_i64m1(__VA_ARGS__) +#define vloxseg8ei64_v_i64m1(...) __riscv_vloxseg8ei64_v_i64m1(__VA_ARGS__) +#define vloxseg2ei64_v_i64m2(...) __riscv_vloxseg2ei64_v_i64m2(__VA_ARGS__) +#define vloxseg3ei64_v_i64m2(...) __riscv_vloxseg3ei64_v_i64m2(__VA_ARGS__) +#define vloxseg4ei64_v_i64m2(...) __riscv_vloxseg4ei64_v_i64m2(__VA_ARGS__) +#define vloxseg2ei64_v_i64m4(...) __riscv_vloxseg2ei64_v_i64m4(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf8(...) __riscv_vluxseg2ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf8(...) __riscv_vluxseg3ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf8(...) __riscv_vluxseg4ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf8(...) __riscv_vluxseg5ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf8(...) __riscv_vluxseg6ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf8(...) __riscv_vluxseg7ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf8(...) __riscv_vluxseg8ei8_v_i8mf8(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf4(...) __riscv_vluxseg2ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf4(...) __riscv_vluxseg3ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf4(...) __riscv_vluxseg4ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf4(...) __riscv_vluxseg5ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf4(...) __riscv_vluxseg6ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf4(...) __riscv_vluxseg7ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf4(...) __riscv_vluxseg8ei8_v_i8mf4(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf2(...) __riscv_vluxseg2ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf2(...) __riscv_vluxseg3ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf2(...) __riscv_vluxseg4ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf2(...) __riscv_vluxseg5ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf2(...) __riscv_vluxseg6ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf2(...) __riscv_vluxseg7ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf2(...) __riscv_vluxseg8ei8_v_i8mf2(__VA_ARGS__) +#define vluxseg2ei8_v_i8m1(...) __riscv_vluxseg2ei8_v_i8m1(__VA_ARGS__) +#define vluxseg3ei8_v_i8m1(...) __riscv_vluxseg3ei8_v_i8m1(__VA_ARGS__) +#define vluxseg4ei8_v_i8m1(...) __riscv_vluxseg4ei8_v_i8m1(__VA_ARGS__) +#define vluxseg5ei8_v_i8m1(...) __riscv_vluxseg5ei8_v_i8m1(__VA_ARGS__) +#define vluxseg6ei8_v_i8m1(...) __riscv_vluxseg6ei8_v_i8m1(__VA_ARGS__) +#define vluxseg7ei8_v_i8m1(...) __riscv_vluxseg7ei8_v_i8m1(__VA_ARGS__) +#define vluxseg8ei8_v_i8m1(...) __riscv_vluxseg8ei8_v_i8m1(__VA_ARGS__) +#define vluxseg2ei8_v_i8m2(...) __riscv_vluxseg2ei8_v_i8m2(__VA_ARGS__) +#define vluxseg3ei8_v_i8m2(...) __riscv_vluxseg3ei8_v_i8m2(__VA_ARGS__) +#define vluxseg4ei8_v_i8m2(...) __riscv_vluxseg4ei8_v_i8m2(__VA_ARGS__) +#define vluxseg2ei8_v_i8m4(...) __riscv_vluxseg2ei8_v_i8m4(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf8(...) __riscv_vluxseg2ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf8(...) __riscv_vluxseg3ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf8(...) __riscv_vluxseg4ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf8(...) __riscv_vluxseg5ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf8(...) __riscv_vluxseg6ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf8(...) __riscv_vluxseg7ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf8(...) __riscv_vluxseg8ei16_v_i8mf8(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf4(...) __riscv_vluxseg2ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf4(...) __riscv_vluxseg3ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf4(...) __riscv_vluxseg4ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf4(...) __riscv_vluxseg5ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf4(...) __riscv_vluxseg6ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf4(...) __riscv_vluxseg7ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf4(...) __riscv_vluxseg8ei16_v_i8mf4(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf2(...) __riscv_vluxseg2ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf2(...) __riscv_vluxseg3ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf2(...) __riscv_vluxseg4ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf2(...) __riscv_vluxseg5ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf2(...) __riscv_vluxseg6ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf2(...) __riscv_vluxseg7ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf2(...) __riscv_vluxseg8ei16_v_i8mf2(__VA_ARGS__) +#define vluxseg2ei16_v_i8m1(...) __riscv_vluxseg2ei16_v_i8m1(__VA_ARGS__) +#define vluxseg3ei16_v_i8m1(...) __riscv_vluxseg3ei16_v_i8m1(__VA_ARGS__) +#define vluxseg4ei16_v_i8m1(...) __riscv_vluxseg4ei16_v_i8m1(__VA_ARGS__) +#define vluxseg5ei16_v_i8m1(...) __riscv_vluxseg5ei16_v_i8m1(__VA_ARGS__) +#define vluxseg6ei16_v_i8m1(...) __riscv_vluxseg6ei16_v_i8m1(__VA_ARGS__) +#define vluxseg7ei16_v_i8m1(...) __riscv_vluxseg7ei16_v_i8m1(__VA_ARGS__) +#define vluxseg8ei16_v_i8m1(...) __riscv_vluxseg8ei16_v_i8m1(__VA_ARGS__) +#define vluxseg2ei16_v_i8m2(...) __riscv_vluxseg2ei16_v_i8m2(__VA_ARGS__) +#define vluxseg3ei16_v_i8m2(...) __riscv_vluxseg3ei16_v_i8m2(__VA_ARGS__) +#define vluxseg4ei16_v_i8m2(...) __riscv_vluxseg4ei16_v_i8m2(__VA_ARGS__) +#define vluxseg2ei16_v_i8m4(...) __riscv_vluxseg2ei16_v_i8m4(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf8(...) __riscv_vluxseg2ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf8(...) __riscv_vluxseg3ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf8(...) __riscv_vluxseg4ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf8(...) __riscv_vluxseg5ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf8(...) __riscv_vluxseg6ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf8(...) __riscv_vluxseg7ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf8(...) __riscv_vluxseg8ei32_v_i8mf8(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf4(...) __riscv_vluxseg2ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf4(...) __riscv_vluxseg3ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf4(...) __riscv_vluxseg4ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf4(...) __riscv_vluxseg5ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf4(...) __riscv_vluxseg6ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf4(...) __riscv_vluxseg7ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf4(...) __riscv_vluxseg8ei32_v_i8mf4(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf2(...) __riscv_vluxseg2ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf2(...) __riscv_vluxseg3ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf2(...) __riscv_vluxseg4ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf2(...) __riscv_vluxseg5ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf2(...) __riscv_vluxseg6ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf2(...) __riscv_vluxseg7ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf2(...) __riscv_vluxseg8ei32_v_i8mf2(__VA_ARGS__) +#define vluxseg2ei32_v_i8m1(...) __riscv_vluxseg2ei32_v_i8m1(__VA_ARGS__) +#define vluxseg3ei32_v_i8m1(...) __riscv_vluxseg3ei32_v_i8m1(__VA_ARGS__) +#define vluxseg4ei32_v_i8m1(...) __riscv_vluxseg4ei32_v_i8m1(__VA_ARGS__) +#define vluxseg5ei32_v_i8m1(...) __riscv_vluxseg5ei32_v_i8m1(__VA_ARGS__) +#define vluxseg6ei32_v_i8m1(...) __riscv_vluxseg6ei32_v_i8m1(__VA_ARGS__) +#define vluxseg7ei32_v_i8m1(...) __riscv_vluxseg7ei32_v_i8m1(__VA_ARGS__) +#define vluxseg8ei32_v_i8m1(...) __riscv_vluxseg8ei32_v_i8m1(__VA_ARGS__) +#define vluxseg2ei32_v_i8m2(...) __riscv_vluxseg2ei32_v_i8m2(__VA_ARGS__) +#define vluxseg3ei32_v_i8m2(...) __riscv_vluxseg3ei32_v_i8m2(__VA_ARGS__) +#define vluxseg4ei32_v_i8m2(...) __riscv_vluxseg4ei32_v_i8m2(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf8(...) __riscv_vluxseg2ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf8(...) __riscv_vluxseg3ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf8(...) __riscv_vluxseg4ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf8(...) __riscv_vluxseg5ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf8(...) __riscv_vluxseg6ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf8(...) __riscv_vluxseg7ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf8(...) __riscv_vluxseg8ei64_v_i8mf8(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf4(...) __riscv_vluxseg2ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf4(...) __riscv_vluxseg3ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf4(...) __riscv_vluxseg4ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf4(...) __riscv_vluxseg5ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf4(...) __riscv_vluxseg6ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf4(...) __riscv_vluxseg7ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf4(...) __riscv_vluxseg8ei64_v_i8mf4(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf2(...) __riscv_vluxseg2ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf2(...) __riscv_vluxseg3ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf2(...) __riscv_vluxseg4ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf2(...) __riscv_vluxseg5ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf2(...) __riscv_vluxseg6ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf2(...) __riscv_vluxseg7ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf2(...) __riscv_vluxseg8ei64_v_i8mf2(__VA_ARGS__) +#define vluxseg2ei64_v_i8m1(...) __riscv_vluxseg2ei64_v_i8m1(__VA_ARGS__) +#define vluxseg3ei64_v_i8m1(...) __riscv_vluxseg3ei64_v_i8m1(__VA_ARGS__) +#define vluxseg4ei64_v_i8m1(...) __riscv_vluxseg4ei64_v_i8m1(__VA_ARGS__) +#define vluxseg5ei64_v_i8m1(...) __riscv_vluxseg5ei64_v_i8m1(__VA_ARGS__) +#define vluxseg6ei64_v_i8m1(...) __riscv_vluxseg6ei64_v_i8m1(__VA_ARGS__) +#define vluxseg7ei64_v_i8m1(...) __riscv_vluxseg7ei64_v_i8m1(__VA_ARGS__) +#define vluxseg8ei64_v_i8m1(...) __riscv_vluxseg8ei64_v_i8m1(__VA_ARGS__) +#define vluxseg2ei8_v_i16mf4(...) __riscv_vluxseg2ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg3ei8_v_i16mf4(...) __riscv_vluxseg3ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg4ei8_v_i16mf4(...) __riscv_vluxseg4ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg5ei8_v_i16mf4(...) __riscv_vluxseg5ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg6ei8_v_i16mf4(...) __riscv_vluxseg6ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg7ei8_v_i16mf4(...) __riscv_vluxseg7ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg8ei8_v_i16mf4(...) __riscv_vluxseg8ei8_v_i16mf4(__VA_ARGS__) +#define vluxseg2ei8_v_i16mf2(...) __riscv_vluxseg2ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg3ei8_v_i16mf2(...) __riscv_vluxseg3ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg4ei8_v_i16mf2(...) __riscv_vluxseg4ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg5ei8_v_i16mf2(...) __riscv_vluxseg5ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg6ei8_v_i16mf2(...) __riscv_vluxseg6ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg7ei8_v_i16mf2(...) __riscv_vluxseg7ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg8ei8_v_i16mf2(...) __riscv_vluxseg8ei8_v_i16mf2(__VA_ARGS__) +#define vluxseg2ei8_v_i16m1(...) __riscv_vluxseg2ei8_v_i16m1(__VA_ARGS__) +#define vluxseg3ei8_v_i16m1(...) __riscv_vluxseg3ei8_v_i16m1(__VA_ARGS__) +#define vluxseg4ei8_v_i16m1(...) __riscv_vluxseg4ei8_v_i16m1(__VA_ARGS__) +#define vluxseg5ei8_v_i16m1(...) __riscv_vluxseg5ei8_v_i16m1(__VA_ARGS__) +#define vluxseg6ei8_v_i16m1(...) __riscv_vluxseg6ei8_v_i16m1(__VA_ARGS__) +#define vluxseg7ei8_v_i16m1(...) __riscv_vluxseg7ei8_v_i16m1(__VA_ARGS__) +#define vluxseg8ei8_v_i16m1(...) __riscv_vluxseg8ei8_v_i16m1(__VA_ARGS__) +#define vluxseg2ei8_v_i16m2(...) __riscv_vluxseg2ei8_v_i16m2(__VA_ARGS__) +#define vluxseg3ei8_v_i16m2(...) __riscv_vluxseg3ei8_v_i16m2(__VA_ARGS__) +#define vluxseg4ei8_v_i16m2(...) __riscv_vluxseg4ei8_v_i16m2(__VA_ARGS__) +#define vluxseg2ei8_v_i16m4(...) __riscv_vluxseg2ei8_v_i16m4(__VA_ARGS__) +#define vluxseg2ei16_v_i16mf4(...) __riscv_vluxseg2ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg3ei16_v_i16mf4(...) __riscv_vluxseg3ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg4ei16_v_i16mf4(...) __riscv_vluxseg4ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg5ei16_v_i16mf4(...) __riscv_vluxseg5ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg6ei16_v_i16mf4(...) __riscv_vluxseg6ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg7ei16_v_i16mf4(...) __riscv_vluxseg7ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg8ei16_v_i16mf4(...) __riscv_vluxseg8ei16_v_i16mf4(__VA_ARGS__) +#define vluxseg2ei16_v_i16mf2(...) __riscv_vluxseg2ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg3ei16_v_i16mf2(...) __riscv_vluxseg3ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg4ei16_v_i16mf2(...) __riscv_vluxseg4ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg5ei16_v_i16mf2(...) __riscv_vluxseg5ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg6ei16_v_i16mf2(...) __riscv_vluxseg6ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg7ei16_v_i16mf2(...) __riscv_vluxseg7ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg8ei16_v_i16mf2(...) __riscv_vluxseg8ei16_v_i16mf2(__VA_ARGS__) +#define vluxseg2ei16_v_i16m1(...) __riscv_vluxseg2ei16_v_i16m1(__VA_ARGS__) +#define vluxseg3ei16_v_i16m1(...) __riscv_vluxseg3ei16_v_i16m1(__VA_ARGS__) +#define vluxseg4ei16_v_i16m1(...) __riscv_vluxseg4ei16_v_i16m1(__VA_ARGS__) +#define vluxseg5ei16_v_i16m1(...) __riscv_vluxseg5ei16_v_i16m1(__VA_ARGS__) +#define vluxseg6ei16_v_i16m1(...) __riscv_vluxseg6ei16_v_i16m1(__VA_ARGS__) +#define vluxseg7ei16_v_i16m1(...) __riscv_vluxseg7ei16_v_i16m1(__VA_ARGS__) +#define vluxseg8ei16_v_i16m1(...) __riscv_vluxseg8ei16_v_i16m1(__VA_ARGS__) +#define vluxseg2ei16_v_i16m2(...) __riscv_vluxseg2ei16_v_i16m2(__VA_ARGS__) +#define vluxseg3ei16_v_i16m2(...) __riscv_vluxseg3ei16_v_i16m2(__VA_ARGS__) +#define vluxseg4ei16_v_i16m2(...) __riscv_vluxseg4ei16_v_i16m2(__VA_ARGS__) +#define vluxseg2ei16_v_i16m4(...) __riscv_vluxseg2ei16_v_i16m4(__VA_ARGS__) +#define vluxseg2ei32_v_i16mf4(...) __riscv_vluxseg2ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg3ei32_v_i16mf4(...) __riscv_vluxseg3ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg4ei32_v_i16mf4(...) __riscv_vluxseg4ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg5ei32_v_i16mf4(...) __riscv_vluxseg5ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg6ei32_v_i16mf4(...) __riscv_vluxseg6ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg7ei32_v_i16mf4(...) __riscv_vluxseg7ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg8ei32_v_i16mf4(...) __riscv_vluxseg8ei32_v_i16mf4(__VA_ARGS__) +#define vluxseg2ei32_v_i16mf2(...) __riscv_vluxseg2ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg3ei32_v_i16mf2(...) __riscv_vluxseg3ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg4ei32_v_i16mf2(...) __riscv_vluxseg4ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg5ei32_v_i16mf2(...) __riscv_vluxseg5ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg6ei32_v_i16mf2(...) __riscv_vluxseg6ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg7ei32_v_i16mf2(...) __riscv_vluxseg7ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg8ei32_v_i16mf2(...) __riscv_vluxseg8ei32_v_i16mf2(__VA_ARGS__) +#define vluxseg2ei32_v_i16m1(...) __riscv_vluxseg2ei32_v_i16m1(__VA_ARGS__) +#define vluxseg3ei32_v_i16m1(...) __riscv_vluxseg3ei32_v_i16m1(__VA_ARGS__) +#define vluxseg4ei32_v_i16m1(...) __riscv_vluxseg4ei32_v_i16m1(__VA_ARGS__) +#define vluxseg5ei32_v_i16m1(...) __riscv_vluxseg5ei32_v_i16m1(__VA_ARGS__) +#define vluxseg6ei32_v_i16m1(...) __riscv_vluxseg6ei32_v_i16m1(__VA_ARGS__) +#define vluxseg7ei32_v_i16m1(...) __riscv_vluxseg7ei32_v_i16m1(__VA_ARGS__) +#define vluxseg8ei32_v_i16m1(...) __riscv_vluxseg8ei32_v_i16m1(__VA_ARGS__) +#define vluxseg2ei32_v_i16m2(...) __riscv_vluxseg2ei32_v_i16m2(__VA_ARGS__) +#define vluxseg3ei32_v_i16m2(...) __riscv_vluxseg3ei32_v_i16m2(__VA_ARGS__) +#define vluxseg4ei32_v_i16m2(...) __riscv_vluxseg4ei32_v_i16m2(__VA_ARGS__) +#define vluxseg2ei32_v_i16m4(...) __riscv_vluxseg2ei32_v_i16m4(__VA_ARGS__) +#define vluxseg2ei64_v_i16mf4(...) __riscv_vluxseg2ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg3ei64_v_i16mf4(...) __riscv_vluxseg3ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg4ei64_v_i16mf4(...) __riscv_vluxseg4ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg5ei64_v_i16mf4(...) __riscv_vluxseg5ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg6ei64_v_i16mf4(...) __riscv_vluxseg6ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg7ei64_v_i16mf4(...) __riscv_vluxseg7ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg8ei64_v_i16mf4(...) __riscv_vluxseg8ei64_v_i16mf4(__VA_ARGS__) +#define vluxseg2ei64_v_i16mf2(...) __riscv_vluxseg2ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg3ei64_v_i16mf2(...) __riscv_vluxseg3ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg4ei64_v_i16mf2(...) __riscv_vluxseg4ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg5ei64_v_i16mf2(...) __riscv_vluxseg5ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg6ei64_v_i16mf2(...) __riscv_vluxseg6ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg7ei64_v_i16mf2(...) __riscv_vluxseg7ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg8ei64_v_i16mf2(...) __riscv_vluxseg8ei64_v_i16mf2(__VA_ARGS__) +#define vluxseg2ei64_v_i16m1(...) __riscv_vluxseg2ei64_v_i16m1(__VA_ARGS__) +#define vluxseg3ei64_v_i16m1(...) __riscv_vluxseg3ei64_v_i16m1(__VA_ARGS__) +#define vluxseg4ei64_v_i16m1(...) __riscv_vluxseg4ei64_v_i16m1(__VA_ARGS__) +#define vluxseg5ei64_v_i16m1(...) __riscv_vluxseg5ei64_v_i16m1(__VA_ARGS__) +#define vluxseg6ei64_v_i16m1(...) __riscv_vluxseg6ei64_v_i16m1(__VA_ARGS__) +#define vluxseg7ei64_v_i16m1(...) __riscv_vluxseg7ei64_v_i16m1(__VA_ARGS__) +#define vluxseg8ei64_v_i16m1(...) __riscv_vluxseg8ei64_v_i16m1(__VA_ARGS__) +#define vluxseg2ei64_v_i16m2(...) __riscv_vluxseg2ei64_v_i16m2(__VA_ARGS__) +#define vluxseg3ei64_v_i16m2(...) __riscv_vluxseg3ei64_v_i16m2(__VA_ARGS__) +#define vluxseg4ei64_v_i16m2(...) __riscv_vluxseg4ei64_v_i16m2(__VA_ARGS__) +#define vluxseg2ei8_v_i32mf2(...) __riscv_vluxseg2ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg3ei8_v_i32mf2(...) __riscv_vluxseg3ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg4ei8_v_i32mf2(...) __riscv_vluxseg4ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg5ei8_v_i32mf2(...) __riscv_vluxseg5ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg6ei8_v_i32mf2(...) __riscv_vluxseg6ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg7ei8_v_i32mf2(...) __riscv_vluxseg7ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg8ei8_v_i32mf2(...) __riscv_vluxseg8ei8_v_i32mf2(__VA_ARGS__) +#define vluxseg2ei8_v_i32m1(...) __riscv_vluxseg2ei8_v_i32m1(__VA_ARGS__) +#define vluxseg3ei8_v_i32m1(...) __riscv_vluxseg3ei8_v_i32m1(__VA_ARGS__) +#define vluxseg4ei8_v_i32m1(...) __riscv_vluxseg4ei8_v_i32m1(__VA_ARGS__) +#define vluxseg5ei8_v_i32m1(...) __riscv_vluxseg5ei8_v_i32m1(__VA_ARGS__) +#define vluxseg6ei8_v_i32m1(...) __riscv_vluxseg6ei8_v_i32m1(__VA_ARGS__) +#define vluxseg7ei8_v_i32m1(...) __riscv_vluxseg7ei8_v_i32m1(__VA_ARGS__) +#define vluxseg8ei8_v_i32m1(...) __riscv_vluxseg8ei8_v_i32m1(__VA_ARGS__) +#define vluxseg2ei8_v_i32m2(...) __riscv_vluxseg2ei8_v_i32m2(__VA_ARGS__) +#define vluxseg3ei8_v_i32m2(...) __riscv_vluxseg3ei8_v_i32m2(__VA_ARGS__) +#define vluxseg4ei8_v_i32m2(...) __riscv_vluxseg4ei8_v_i32m2(__VA_ARGS__) +#define vluxseg2ei8_v_i32m4(...) __riscv_vluxseg2ei8_v_i32m4(__VA_ARGS__) +#define vluxseg2ei16_v_i32mf2(...) __riscv_vluxseg2ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg3ei16_v_i32mf2(...) __riscv_vluxseg3ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg4ei16_v_i32mf2(...) __riscv_vluxseg4ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg5ei16_v_i32mf2(...) __riscv_vluxseg5ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg6ei16_v_i32mf2(...) __riscv_vluxseg6ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg7ei16_v_i32mf2(...) __riscv_vluxseg7ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg8ei16_v_i32mf2(...) __riscv_vluxseg8ei16_v_i32mf2(__VA_ARGS__) +#define vluxseg2ei16_v_i32m1(...) __riscv_vluxseg2ei16_v_i32m1(__VA_ARGS__) +#define vluxseg3ei16_v_i32m1(...) __riscv_vluxseg3ei16_v_i32m1(__VA_ARGS__) +#define vluxseg4ei16_v_i32m1(...) __riscv_vluxseg4ei16_v_i32m1(__VA_ARGS__) +#define vluxseg5ei16_v_i32m1(...) __riscv_vluxseg5ei16_v_i32m1(__VA_ARGS__) +#define vluxseg6ei16_v_i32m1(...) __riscv_vluxseg6ei16_v_i32m1(__VA_ARGS__) +#define vluxseg7ei16_v_i32m1(...) __riscv_vluxseg7ei16_v_i32m1(__VA_ARGS__) +#define vluxseg8ei16_v_i32m1(...) __riscv_vluxseg8ei16_v_i32m1(__VA_ARGS__) +#define vluxseg2ei16_v_i32m2(...) __riscv_vluxseg2ei16_v_i32m2(__VA_ARGS__) +#define vluxseg3ei16_v_i32m2(...) __riscv_vluxseg3ei16_v_i32m2(__VA_ARGS__) +#define vluxseg4ei16_v_i32m2(...) __riscv_vluxseg4ei16_v_i32m2(__VA_ARGS__) +#define vluxseg2ei16_v_i32m4(...) __riscv_vluxseg2ei16_v_i32m4(__VA_ARGS__) +#define vluxseg2ei32_v_i32mf2(...) __riscv_vluxseg2ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg3ei32_v_i32mf2(...) __riscv_vluxseg3ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg4ei32_v_i32mf2(...) __riscv_vluxseg4ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg5ei32_v_i32mf2(...) __riscv_vluxseg5ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg6ei32_v_i32mf2(...) __riscv_vluxseg6ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg7ei32_v_i32mf2(...) __riscv_vluxseg7ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg8ei32_v_i32mf2(...) __riscv_vluxseg8ei32_v_i32mf2(__VA_ARGS__) +#define vluxseg2ei32_v_i32m1(...) __riscv_vluxseg2ei32_v_i32m1(__VA_ARGS__) +#define vluxseg3ei32_v_i32m1(...) __riscv_vluxseg3ei32_v_i32m1(__VA_ARGS__) +#define vluxseg4ei32_v_i32m1(...) __riscv_vluxseg4ei32_v_i32m1(__VA_ARGS__) +#define vluxseg5ei32_v_i32m1(...) __riscv_vluxseg5ei32_v_i32m1(__VA_ARGS__) +#define vluxseg6ei32_v_i32m1(...) __riscv_vluxseg6ei32_v_i32m1(__VA_ARGS__) +#define vluxseg7ei32_v_i32m1(...) __riscv_vluxseg7ei32_v_i32m1(__VA_ARGS__) +#define vluxseg8ei32_v_i32m1(...) __riscv_vluxseg8ei32_v_i32m1(__VA_ARGS__) +#define vluxseg2ei32_v_i32m2(...) __riscv_vluxseg2ei32_v_i32m2(__VA_ARGS__) +#define vluxseg3ei32_v_i32m2(...) __riscv_vluxseg3ei32_v_i32m2(__VA_ARGS__) +#define vluxseg4ei32_v_i32m2(...) __riscv_vluxseg4ei32_v_i32m2(__VA_ARGS__) +#define vluxseg2ei32_v_i32m4(...) __riscv_vluxseg2ei32_v_i32m4(__VA_ARGS__) +#define vluxseg2ei64_v_i32mf2(...) __riscv_vluxseg2ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg3ei64_v_i32mf2(...) __riscv_vluxseg3ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg4ei64_v_i32mf2(...) __riscv_vluxseg4ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg5ei64_v_i32mf2(...) __riscv_vluxseg5ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg6ei64_v_i32mf2(...) __riscv_vluxseg6ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg7ei64_v_i32mf2(...) __riscv_vluxseg7ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg8ei64_v_i32mf2(...) __riscv_vluxseg8ei64_v_i32mf2(__VA_ARGS__) +#define vluxseg2ei64_v_i32m1(...) __riscv_vluxseg2ei64_v_i32m1(__VA_ARGS__) +#define vluxseg3ei64_v_i32m1(...) __riscv_vluxseg3ei64_v_i32m1(__VA_ARGS__) +#define vluxseg4ei64_v_i32m1(...) __riscv_vluxseg4ei64_v_i32m1(__VA_ARGS__) +#define vluxseg5ei64_v_i32m1(...) __riscv_vluxseg5ei64_v_i32m1(__VA_ARGS__) +#define vluxseg6ei64_v_i32m1(...) __riscv_vluxseg6ei64_v_i32m1(__VA_ARGS__) +#define vluxseg7ei64_v_i32m1(...) __riscv_vluxseg7ei64_v_i32m1(__VA_ARGS__) +#define vluxseg8ei64_v_i32m1(...) __riscv_vluxseg8ei64_v_i32m1(__VA_ARGS__) +#define vluxseg2ei64_v_i32m2(...) __riscv_vluxseg2ei64_v_i32m2(__VA_ARGS__) +#define vluxseg3ei64_v_i32m2(...) __riscv_vluxseg3ei64_v_i32m2(__VA_ARGS__) +#define vluxseg4ei64_v_i32m2(...) __riscv_vluxseg4ei64_v_i32m2(__VA_ARGS__) +#define vluxseg2ei64_v_i32m4(...) __riscv_vluxseg2ei64_v_i32m4(__VA_ARGS__) +#define vluxseg2ei8_v_i64m1(...) __riscv_vluxseg2ei8_v_i64m1(__VA_ARGS__) +#define vluxseg3ei8_v_i64m1(...) __riscv_vluxseg3ei8_v_i64m1(__VA_ARGS__) +#define vluxseg4ei8_v_i64m1(...) __riscv_vluxseg4ei8_v_i64m1(__VA_ARGS__) +#define vluxseg5ei8_v_i64m1(...) __riscv_vluxseg5ei8_v_i64m1(__VA_ARGS__) +#define vluxseg6ei8_v_i64m1(...) __riscv_vluxseg6ei8_v_i64m1(__VA_ARGS__) +#define vluxseg7ei8_v_i64m1(...) __riscv_vluxseg7ei8_v_i64m1(__VA_ARGS__) +#define vluxseg8ei8_v_i64m1(...) __riscv_vluxseg8ei8_v_i64m1(__VA_ARGS__) +#define vluxseg2ei8_v_i64m2(...) __riscv_vluxseg2ei8_v_i64m2(__VA_ARGS__) +#define vluxseg3ei8_v_i64m2(...) __riscv_vluxseg3ei8_v_i64m2(__VA_ARGS__) +#define vluxseg4ei8_v_i64m2(...) __riscv_vluxseg4ei8_v_i64m2(__VA_ARGS__) +#define vluxseg2ei8_v_i64m4(...) __riscv_vluxseg2ei8_v_i64m4(__VA_ARGS__) +#define vluxseg2ei16_v_i64m1(...) __riscv_vluxseg2ei16_v_i64m1(__VA_ARGS__) +#define vluxseg3ei16_v_i64m1(...) __riscv_vluxseg3ei16_v_i64m1(__VA_ARGS__) +#define vluxseg4ei16_v_i64m1(...) __riscv_vluxseg4ei16_v_i64m1(__VA_ARGS__) +#define vluxseg5ei16_v_i64m1(...) __riscv_vluxseg5ei16_v_i64m1(__VA_ARGS__) +#define vluxseg6ei16_v_i64m1(...) __riscv_vluxseg6ei16_v_i64m1(__VA_ARGS__) +#define vluxseg7ei16_v_i64m1(...) __riscv_vluxseg7ei16_v_i64m1(__VA_ARGS__) +#define vluxseg8ei16_v_i64m1(...) __riscv_vluxseg8ei16_v_i64m1(__VA_ARGS__) +#define vluxseg2ei16_v_i64m2(...) __riscv_vluxseg2ei16_v_i64m2(__VA_ARGS__) +#define vluxseg3ei16_v_i64m2(...) __riscv_vluxseg3ei16_v_i64m2(__VA_ARGS__) +#define vluxseg4ei16_v_i64m2(...) __riscv_vluxseg4ei16_v_i64m2(__VA_ARGS__) +#define vluxseg2ei16_v_i64m4(...) __riscv_vluxseg2ei16_v_i64m4(__VA_ARGS__) +#define vluxseg2ei32_v_i64m1(...) __riscv_vluxseg2ei32_v_i64m1(__VA_ARGS__) +#define vluxseg3ei32_v_i64m1(...) __riscv_vluxseg3ei32_v_i64m1(__VA_ARGS__) +#define vluxseg4ei32_v_i64m1(...) __riscv_vluxseg4ei32_v_i64m1(__VA_ARGS__) +#define vluxseg5ei32_v_i64m1(...) __riscv_vluxseg5ei32_v_i64m1(__VA_ARGS__) +#define vluxseg6ei32_v_i64m1(...) __riscv_vluxseg6ei32_v_i64m1(__VA_ARGS__) +#define vluxseg7ei32_v_i64m1(...) __riscv_vluxseg7ei32_v_i64m1(__VA_ARGS__) +#define vluxseg8ei32_v_i64m1(...) __riscv_vluxseg8ei32_v_i64m1(__VA_ARGS__) +#define vluxseg2ei32_v_i64m2(...) __riscv_vluxseg2ei32_v_i64m2(__VA_ARGS__) +#define vluxseg3ei32_v_i64m2(...) __riscv_vluxseg3ei32_v_i64m2(__VA_ARGS__) +#define vluxseg4ei32_v_i64m2(...) __riscv_vluxseg4ei32_v_i64m2(__VA_ARGS__) +#define vluxseg2ei32_v_i64m4(...) __riscv_vluxseg2ei32_v_i64m4(__VA_ARGS__) +#define vluxseg2ei64_v_i64m1(...) __riscv_vluxseg2ei64_v_i64m1(__VA_ARGS__) +#define vluxseg3ei64_v_i64m1(...) __riscv_vluxseg3ei64_v_i64m1(__VA_ARGS__) +#define vluxseg4ei64_v_i64m1(...) __riscv_vluxseg4ei64_v_i64m1(__VA_ARGS__) +#define vluxseg5ei64_v_i64m1(...) __riscv_vluxseg5ei64_v_i64m1(__VA_ARGS__) +#define vluxseg6ei64_v_i64m1(...) __riscv_vluxseg6ei64_v_i64m1(__VA_ARGS__) +#define vluxseg7ei64_v_i64m1(...) __riscv_vluxseg7ei64_v_i64m1(__VA_ARGS__) +#define vluxseg8ei64_v_i64m1(...) __riscv_vluxseg8ei64_v_i64m1(__VA_ARGS__) +#define vluxseg2ei64_v_i64m2(...) __riscv_vluxseg2ei64_v_i64m2(__VA_ARGS__) +#define vluxseg3ei64_v_i64m2(...) __riscv_vluxseg3ei64_v_i64m2(__VA_ARGS__) +#define vluxseg4ei64_v_i64m2(...) __riscv_vluxseg4ei64_v_i64m2(__VA_ARGS__) +#define vluxseg2ei64_v_i64m4(...) __riscv_vluxseg2ei64_v_i64m4(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf8(...) __riscv_vloxseg2ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf8(...) __riscv_vloxseg3ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf8(...) __riscv_vloxseg4ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf8(...) __riscv_vloxseg5ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf8(...) __riscv_vloxseg6ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf8(...) __riscv_vloxseg7ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf8(...) __riscv_vloxseg8ei8_v_u8mf8(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf4(...) __riscv_vloxseg2ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf4(...) __riscv_vloxseg3ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf4(...) __riscv_vloxseg4ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf4(...) __riscv_vloxseg5ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf4(...) __riscv_vloxseg6ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf4(...) __riscv_vloxseg7ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf4(...) __riscv_vloxseg8ei8_v_u8mf4(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf2(...) __riscv_vloxseg2ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf2(...) __riscv_vloxseg3ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf2(...) __riscv_vloxseg4ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf2(...) __riscv_vloxseg5ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf2(...) __riscv_vloxseg6ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf2(...) __riscv_vloxseg7ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf2(...) __riscv_vloxseg8ei8_v_u8mf2(__VA_ARGS__) +#define vloxseg2ei8_v_u8m1(...) __riscv_vloxseg2ei8_v_u8m1(__VA_ARGS__) +#define vloxseg3ei8_v_u8m1(...) __riscv_vloxseg3ei8_v_u8m1(__VA_ARGS__) +#define vloxseg4ei8_v_u8m1(...) __riscv_vloxseg4ei8_v_u8m1(__VA_ARGS__) +#define vloxseg5ei8_v_u8m1(...) __riscv_vloxseg5ei8_v_u8m1(__VA_ARGS__) +#define vloxseg6ei8_v_u8m1(...) __riscv_vloxseg6ei8_v_u8m1(__VA_ARGS__) +#define vloxseg7ei8_v_u8m1(...) __riscv_vloxseg7ei8_v_u8m1(__VA_ARGS__) +#define vloxseg8ei8_v_u8m1(...) __riscv_vloxseg8ei8_v_u8m1(__VA_ARGS__) +#define vloxseg2ei8_v_u8m2(...) __riscv_vloxseg2ei8_v_u8m2(__VA_ARGS__) +#define vloxseg3ei8_v_u8m2(...) __riscv_vloxseg3ei8_v_u8m2(__VA_ARGS__) +#define vloxseg4ei8_v_u8m2(...) __riscv_vloxseg4ei8_v_u8m2(__VA_ARGS__) +#define vloxseg2ei8_v_u8m4(...) __riscv_vloxseg2ei8_v_u8m4(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf8(...) __riscv_vloxseg2ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf8(...) __riscv_vloxseg3ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf8(...) __riscv_vloxseg4ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf8(...) __riscv_vloxseg5ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf8(...) __riscv_vloxseg6ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf8(...) __riscv_vloxseg7ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf8(...) __riscv_vloxseg8ei16_v_u8mf8(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf4(...) __riscv_vloxseg2ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf4(...) __riscv_vloxseg3ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf4(...) __riscv_vloxseg4ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf4(...) __riscv_vloxseg5ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf4(...) __riscv_vloxseg6ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf4(...) __riscv_vloxseg7ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf4(...) __riscv_vloxseg8ei16_v_u8mf4(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf2(...) __riscv_vloxseg2ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf2(...) __riscv_vloxseg3ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf2(...) __riscv_vloxseg4ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf2(...) __riscv_vloxseg5ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf2(...) __riscv_vloxseg6ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf2(...) __riscv_vloxseg7ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf2(...) __riscv_vloxseg8ei16_v_u8mf2(__VA_ARGS__) +#define vloxseg2ei16_v_u8m1(...) __riscv_vloxseg2ei16_v_u8m1(__VA_ARGS__) +#define vloxseg3ei16_v_u8m1(...) __riscv_vloxseg3ei16_v_u8m1(__VA_ARGS__) +#define vloxseg4ei16_v_u8m1(...) __riscv_vloxseg4ei16_v_u8m1(__VA_ARGS__) +#define vloxseg5ei16_v_u8m1(...) __riscv_vloxseg5ei16_v_u8m1(__VA_ARGS__) +#define vloxseg6ei16_v_u8m1(...) __riscv_vloxseg6ei16_v_u8m1(__VA_ARGS__) +#define vloxseg7ei16_v_u8m1(...) __riscv_vloxseg7ei16_v_u8m1(__VA_ARGS__) +#define vloxseg8ei16_v_u8m1(...) __riscv_vloxseg8ei16_v_u8m1(__VA_ARGS__) +#define vloxseg2ei16_v_u8m2(...) __riscv_vloxseg2ei16_v_u8m2(__VA_ARGS__) +#define vloxseg3ei16_v_u8m2(...) __riscv_vloxseg3ei16_v_u8m2(__VA_ARGS__) +#define vloxseg4ei16_v_u8m2(...) __riscv_vloxseg4ei16_v_u8m2(__VA_ARGS__) +#define vloxseg2ei16_v_u8m4(...) __riscv_vloxseg2ei16_v_u8m4(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf8(...) __riscv_vloxseg2ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf8(...) __riscv_vloxseg3ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf8(...) __riscv_vloxseg4ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf8(...) __riscv_vloxseg5ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf8(...) __riscv_vloxseg6ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf8(...) __riscv_vloxseg7ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf8(...) __riscv_vloxseg8ei32_v_u8mf8(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf4(...) __riscv_vloxseg2ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf4(...) __riscv_vloxseg3ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf4(...) __riscv_vloxseg4ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf4(...) __riscv_vloxseg5ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf4(...) __riscv_vloxseg6ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf4(...) __riscv_vloxseg7ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf4(...) __riscv_vloxseg8ei32_v_u8mf4(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf2(...) __riscv_vloxseg2ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf2(...) __riscv_vloxseg3ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf2(...) __riscv_vloxseg4ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf2(...) __riscv_vloxseg5ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf2(...) __riscv_vloxseg6ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf2(...) __riscv_vloxseg7ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf2(...) __riscv_vloxseg8ei32_v_u8mf2(__VA_ARGS__) +#define vloxseg2ei32_v_u8m1(...) __riscv_vloxseg2ei32_v_u8m1(__VA_ARGS__) +#define vloxseg3ei32_v_u8m1(...) __riscv_vloxseg3ei32_v_u8m1(__VA_ARGS__) +#define vloxseg4ei32_v_u8m1(...) __riscv_vloxseg4ei32_v_u8m1(__VA_ARGS__) +#define vloxseg5ei32_v_u8m1(...) __riscv_vloxseg5ei32_v_u8m1(__VA_ARGS__) +#define vloxseg6ei32_v_u8m1(...) __riscv_vloxseg6ei32_v_u8m1(__VA_ARGS__) +#define vloxseg7ei32_v_u8m1(...) __riscv_vloxseg7ei32_v_u8m1(__VA_ARGS__) +#define vloxseg8ei32_v_u8m1(...) __riscv_vloxseg8ei32_v_u8m1(__VA_ARGS__) +#define vloxseg2ei32_v_u8m2(...) __riscv_vloxseg2ei32_v_u8m2(__VA_ARGS__) +#define vloxseg3ei32_v_u8m2(...) __riscv_vloxseg3ei32_v_u8m2(__VA_ARGS__) +#define vloxseg4ei32_v_u8m2(...) __riscv_vloxseg4ei32_v_u8m2(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf8(...) __riscv_vloxseg2ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf8(...) __riscv_vloxseg3ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf8(...) __riscv_vloxseg4ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf8(...) __riscv_vloxseg5ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf8(...) __riscv_vloxseg6ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf8(...) __riscv_vloxseg7ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf8(...) __riscv_vloxseg8ei64_v_u8mf8(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf4(...) __riscv_vloxseg2ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf4(...) __riscv_vloxseg3ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf4(...) __riscv_vloxseg4ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf4(...) __riscv_vloxseg5ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf4(...) __riscv_vloxseg6ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf4(...) __riscv_vloxseg7ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf4(...) __riscv_vloxseg8ei64_v_u8mf4(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf2(...) __riscv_vloxseg2ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf2(...) __riscv_vloxseg3ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf2(...) __riscv_vloxseg4ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf2(...) __riscv_vloxseg5ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf2(...) __riscv_vloxseg6ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf2(...) __riscv_vloxseg7ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf2(...) __riscv_vloxseg8ei64_v_u8mf2(__VA_ARGS__) +#define vloxseg2ei64_v_u8m1(...) __riscv_vloxseg2ei64_v_u8m1(__VA_ARGS__) +#define vloxseg3ei64_v_u8m1(...) __riscv_vloxseg3ei64_v_u8m1(__VA_ARGS__) +#define vloxseg4ei64_v_u8m1(...) __riscv_vloxseg4ei64_v_u8m1(__VA_ARGS__) +#define vloxseg5ei64_v_u8m1(...) __riscv_vloxseg5ei64_v_u8m1(__VA_ARGS__) +#define vloxseg6ei64_v_u8m1(...) __riscv_vloxseg6ei64_v_u8m1(__VA_ARGS__) +#define vloxseg7ei64_v_u8m1(...) __riscv_vloxseg7ei64_v_u8m1(__VA_ARGS__) +#define vloxseg8ei64_v_u8m1(...) __riscv_vloxseg8ei64_v_u8m1(__VA_ARGS__) +#define vloxseg2ei8_v_u16mf4(...) __riscv_vloxseg2ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg3ei8_v_u16mf4(...) __riscv_vloxseg3ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg4ei8_v_u16mf4(...) __riscv_vloxseg4ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg5ei8_v_u16mf4(...) __riscv_vloxseg5ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg6ei8_v_u16mf4(...) __riscv_vloxseg6ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg7ei8_v_u16mf4(...) __riscv_vloxseg7ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg8ei8_v_u16mf4(...) __riscv_vloxseg8ei8_v_u16mf4(__VA_ARGS__) +#define vloxseg2ei8_v_u16mf2(...) __riscv_vloxseg2ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg3ei8_v_u16mf2(...) __riscv_vloxseg3ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg4ei8_v_u16mf2(...) __riscv_vloxseg4ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg5ei8_v_u16mf2(...) __riscv_vloxseg5ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg6ei8_v_u16mf2(...) __riscv_vloxseg6ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg7ei8_v_u16mf2(...) __riscv_vloxseg7ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg8ei8_v_u16mf2(...) __riscv_vloxseg8ei8_v_u16mf2(__VA_ARGS__) +#define vloxseg2ei8_v_u16m1(...) __riscv_vloxseg2ei8_v_u16m1(__VA_ARGS__) +#define vloxseg3ei8_v_u16m1(...) __riscv_vloxseg3ei8_v_u16m1(__VA_ARGS__) +#define vloxseg4ei8_v_u16m1(...) __riscv_vloxseg4ei8_v_u16m1(__VA_ARGS__) +#define vloxseg5ei8_v_u16m1(...) __riscv_vloxseg5ei8_v_u16m1(__VA_ARGS__) +#define vloxseg6ei8_v_u16m1(...) __riscv_vloxseg6ei8_v_u16m1(__VA_ARGS__) +#define vloxseg7ei8_v_u16m1(...) __riscv_vloxseg7ei8_v_u16m1(__VA_ARGS__) +#define vloxseg8ei8_v_u16m1(...) __riscv_vloxseg8ei8_v_u16m1(__VA_ARGS__) +#define vloxseg2ei8_v_u16m2(...) __riscv_vloxseg2ei8_v_u16m2(__VA_ARGS__) +#define vloxseg3ei8_v_u16m2(...) __riscv_vloxseg3ei8_v_u16m2(__VA_ARGS__) +#define vloxseg4ei8_v_u16m2(...) __riscv_vloxseg4ei8_v_u16m2(__VA_ARGS__) +#define vloxseg2ei8_v_u16m4(...) __riscv_vloxseg2ei8_v_u16m4(__VA_ARGS__) +#define vloxseg2ei16_v_u16mf4(...) __riscv_vloxseg2ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg3ei16_v_u16mf4(...) __riscv_vloxseg3ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg4ei16_v_u16mf4(...) __riscv_vloxseg4ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg5ei16_v_u16mf4(...) __riscv_vloxseg5ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg6ei16_v_u16mf4(...) __riscv_vloxseg6ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg7ei16_v_u16mf4(...) __riscv_vloxseg7ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg8ei16_v_u16mf4(...) __riscv_vloxseg8ei16_v_u16mf4(__VA_ARGS__) +#define vloxseg2ei16_v_u16mf2(...) __riscv_vloxseg2ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg3ei16_v_u16mf2(...) __riscv_vloxseg3ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg4ei16_v_u16mf2(...) __riscv_vloxseg4ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg5ei16_v_u16mf2(...) __riscv_vloxseg5ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg6ei16_v_u16mf2(...) __riscv_vloxseg6ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg7ei16_v_u16mf2(...) __riscv_vloxseg7ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg8ei16_v_u16mf2(...) __riscv_vloxseg8ei16_v_u16mf2(__VA_ARGS__) +#define vloxseg2ei16_v_u16m1(...) __riscv_vloxseg2ei16_v_u16m1(__VA_ARGS__) +#define vloxseg3ei16_v_u16m1(...) __riscv_vloxseg3ei16_v_u16m1(__VA_ARGS__) +#define vloxseg4ei16_v_u16m1(...) __riscv_vloxseg4ei16_v_u16m1(__VA_ARGS__) +#define vloxseg5ei16_v_u16m1(...) __riscv_vloxseg5ei16_v_u16m1(__VA_ARGS__) +#define vloxseg6ei16_v_u16m1(...) __riscv_vloxseg6ei16_v_u16m1(__VA_ARGS__) +#define vloxseg7ei16_v_u16m1(...) __riscv_vloxseg7ei16_v_u16m1(__VA_ARGS__) +#define vloxseg8ei16_v_u16m1(...) __riscv_vloxseg8ei16_v_u16m1(__VA_ARGS__) +#define vloxseg2ei16_v_u16m2(...) __riscv_vloxseg2ei16_v_u16m2(__VA_ARGS__) +#define vloxseg3ei16_v_u16m2(...) __riscv_vloxseg3ei16_v_u16m2(__VA_ARGS__) +#define vloxseg4ei16_v_u16m2(...) __riscv_vloxseg4ei16_v_u16m2(__VA_ARGS__) +#define vloxseg2ei16_v_u16m4(...) __riscv_vloxseg2ei16_v_u16m4(__VA_ARGS__) +#define vloxseg2ei32_v_u16mf4(...) __riscv_vloxseg2ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg3ei32_v_u16mf4(...) __riscv_vloxseg3ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg4ei32_v_u16mf4(...) __riscv_vloxseg4ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg5ei32_v_u16mf4(...) __riscv_vloxseg5ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg6ei32_v_u16mf4(...) __riscv_vloxseg6ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg7ei32_v_u16mf4(...) __riscv_vloxseg7ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg8ei32_v_u16mf4(...) __riscv_vloxseg8ei32_v_u16mf4(__VA_ARGS__) +#define vloxseg2ei32_v_u16mf2(...) __riscv_vloxseg2ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg3ei32_v_u16mf2(...) __riscv_vloxseg3ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg4ei32_v_u16mf2(...) __riscv_vloxseg4ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg5ei32_v_u16mf2(...) __riscv_vloxseg5ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg6ei32_v_u16mf2(...) __riscv_vloxseg6ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg7ei32_v_u16mf2(...) __riscv_vloxseg7ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg8ei32_v_u16mf2(...) __riscv_vloxseg8ei32_v_u16mf2(__VA_ARGS__) +#define vloxseg2ei32_v_u16m1(...) __riscv_vloxseg2ei32_v_u16m1(__VA_ARGS__) +#define vloxseg3ei32_v_u16m1(...) __riscv_vloxseg3ei32_v_u16m1(__VA_ARGS__) +#define vloxseg4ei32_v_u16m1(...) __riscv_vloxseg4ei32_v_u16m1(__VA_ARGS__) +#define vloxseg5ei32_v_u16m1(...) __riscv_vloxseg5ei32_v_u16m1(__VA_ARGS__) +#define vloxseg6ei32_v_u16m1(...) __riscv_vloxseg6ei32_v_u16m1(__VA_ARGS__) +#define vloxseg7ei32_v_u16m1(...) __riscv_vloxseg7ei32_v_u16m1(__VA_ARGS__) +#define vloxseg8ei32_v_u16m1(...) __riscv_vloxseg8ei32_v_u16m1(__VA_ARGS__) +#define vloxseg2ei32_v_u16m2(...) __riscv_vloxseg2ei32_v_u16m2(__VA_ARGS__) +#define vloxseg3ei32_v_u16m2(...) __riscv_vloxseg3ei32_v_u16m2(__VA_ARGS__) +#define vloxseg4ei32_v_u16m2(...) __riscv_vloxseg4ei32_v_u16m2(__VA_ARGS__) +#define vloxseg2ei32_v_u16m4(...) __riscv_vloxseg2ei32_v_u16m4(__VA_ARGS__) +#define vloxseg2ei64_v_u16mf4(...) __riscv_vloxseg2ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg3ei64_v_u16mf4(...) __riscv_vloxseg3ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg4ei64_v_u16mf4(...) __riscv_vloxseg4ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg5ei64_v_u16mf4(...) __riscv_vloxseg5ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg6ei64_v_u16mf4(...) __riscv_vloxseg6ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg7ei64_v_u16mf4(...) __riscv_vloxseg7ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg8ei64_v_u16mf4(...) __riscv_vloxseg8ei64_v_u16mf4(__VA_ARGS__) +#define vloxseg2ei64_v_u16mf2(...) __riscv_vloxseg2ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg3ei64_v_u16mf2(...) __riscv_vloxseg3ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg4ei64_v_u16mf2(...) __riscv_vloxseg4ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg5ei64_v_u16mf2(...) __riscv_vloxseg5ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg6ei64_v_u16mf2(...) __riscv_vloxseg6ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg7ei64_v_u16mf2(...) __riscv_vloxseg7ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg8ei64_v_u16mf2(...) __riscv_vloxseg8ei64_v_u16mf2(__VA_ARGS__) +#define vloxseg2ei64_v_u16m1(...) __riscv_vloxseg2ei64_v_u16m1(__VA_ARGS__) +#define vloxseg3ei64_v_u16m1(...) __riscv_vloxseg3ei64_v_u16m1(__VA_ARGS__) +#define vloxseg4ei64_v_u16m1(...) __riscv_vloxseg4ei64_v_u16m1(__VA_ARGS__) +#define vloxseg5ei64_v_u16m1(...) __riscv_vloxseg5ei64_v_u16m1(__VA_ARGS__) +#define vloxseg6ei64_v_u16m1(...) __riscv_vloxseg6ei64_v_u16m1(__VA_ARGS__) +#define vloxseg7ei64_v_u16m1(...) __riscv_vloxseg7ei64_v_u16m1(__VA_ARGS__) +#define vloxseg8ei64_v_u16m1(...) __riscv_vloxseg8ei64_v_u16m1(__VA_ARGS__) +#define vloxseg2ei64_v_u16m2(...) __riscv_vloxseg2ei64_v_u16m2(__VA_ARGS__) +#define vloxseg3ei64_v_u16m2(...) __riscv_vloxseg3ei64_v_u16m2(__VA_ARGS__) +#define vloxseg4ei64_v_u16m2(...) __riscv_vloxseg4ei64_v_u16m2(__VA_ARGS__) +#define vloxseg2ei8_v_u32mf2(...) __riscv_vloxseg2ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg3ei8_v_u32mf2(...) __riscv_vloxseg3ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg4ei8_v_u32mf2(...) __riscv_vloxseg4ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg5ei8_v_u32mf2(...) __riscv_vloxseg5ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg6ei8_v_u32mf2(...) __riscv_vloxseg6ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg7ei8_v_u32mf2(...) __riscv_vloxseg7ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg8ei8_v_u32mf2(...) __riscv_vloxseg8ei8_v_u32mf2(__VA_ARGS__) +#define vloxseg2ei8_v_u32m1(...) __riscv_vloxseg2ei8_v_u32m1(__VA_ARGS__) +#define vloxseg3ei8_v_u32m1(...) __riscv_vloxseg3ei8_v_u32m1(__VA_ARGS__) +#define vloxseg4ei8_v_u32m1(...) __riscv_vloxseg4ei8_v_u32m1(__VA_ARGS__) +#define vloxseg5ei8_v_u32m1(...) __riscv_vloxseg5ei8_v_u32m1(__VA_ARGS__) +#define vloxseg6ei8_v_u32m1(...) __riscv_vloxseg6ei8_v_u32m1(__VA_ARGS__) +#define vloxseg7ei8_v_u32m1(...) __riscv_vloxseg7ei8_v_u32m1(__VA_ARGS__) +#define vloxseg8ei8_v_u32m1(...) __riscv_vloxseg8ei8_v_u32m1(__VA_ARGS__) +#define vloxseg2ei8_v_u32m2(...) __riscv_vloxseg2ei8_v_u32m2(__VA_ARGS__) +#define vloxseg3ei8_v_u32m2(...) __riscv_vloxseg3ei8_v_u32m2(__VA_ARGS__) +#define vloxseg4ei8_v_u32m2(...) __riscv_vloxseg4ei8_v_u32m2(__VA_ARGS__) +#define vloxseg2ei8_v_u32m4(...) __riscv_vloxseg2ei8_v_u32m4(__VA_ARGS__) +#define vloxseg2ei16_v_u32mf2(...) __riscv_vloxseg2ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg3ei16_v_u32mf2(...) __riscv_vloxseg3ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg4ei16_v_u32mf2(...) __riscv_vloxseg4ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg5ei16_v_u32mf2(...) __riscv_vloxseg5ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg6ei16_v_u32mf2(...) __riscv_vloxseg6ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg7ei16_v_u32mf2(...) __riscv_vloxseg7ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg8ei16_v_u32mf2(...) __riscv_vloxseg8ei16_v_u32mf2(__VA_ARGS__) +#define vloxseg2ei16_v_u32m1(...) __riscv_vloxseg2ei16_v_u32m1(__VA_ARGS__) +#define vloxseg3ei16_v_u32m1(...) __riscv_vloxseg3ei16_v_u32m1(__VA_ARGS__) +#define vloxseg4ei16_v_u32m1(...) __riscv_vloxseg4ei16_v_u32m1(__VA_ARGS__) +#define vloxseg5ei16_v_u32m1(...) __riscv_vloxseg5ei16_v_u32m1(__VA_ARGS__) +#define vloxseg6ei16_v_u32m1(...) __riscv_vloxseg6ei16_v_u32m1(__VA_ARGS__) +#define vloxseg7ei16_v_u32m1(...) __riscv_vloxseg7ei16_v_u32m1(__VA_ARGS__) +#define vloxseg8ei16_v_u32m1(...) __riscv_vloxseg8ei16_v_u32m1(__VA_ARGS__) +#define vloxseg2ei16_v_u32m2(...) __riscv_vloxseg2ei16_v_u32m2(__VA_ARGS__) +#define vloxseg3ei16_v_u32m2(...) __riscv_vloxseg3ei16_v_u32m2(__VA_ARGS__) +#define vloxseg4ei16_v_u32m2(...) __riscv_vloxseg4ei16_v_u32m2(__VA_ARGS__) +#define vloxseg2ei16_v_u32m4(...) __riscv_vloxseg2ei16_v_u32m4(__VA_ARGS__) +#define vloxseg2ei32_v_u32mf2(...) __riscv_vloxseg2ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg3ei32_v_u32mf2(...) __riscv_vloxseg3ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg4ei32_v_u32mf2(...) __riscv_vloxseg4ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg5ei32_v_u32mf2(...) __riscv_vloxseg5ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg6ei32_v_u32mf2(...) __riscv_vloxseg6ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg7ei32_v_u32mf2(...) __riscv_vloxseg7ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg8ei32_v_u32mf2(...) __riscv_vloxseg8ei32_v_u32mf2(__VA_ARGS__) +#define vloxseg2ei32_v_u32m1(...) __riscv_vloxseg2ei32_v_u32m1(__VA_ARGS__) +#define vloxseg3ei32_v_u32m1(...) __riscv_vloxseg3ei32_v_u32m1(__VA_ARGS__) +#define vloxseg4ei32_v_u32m1(...) __riscv_vloxseg4ei32_v_u32m1(__VA_ARGS__) +#define vloxseg5ei32_v_u32m1(...) __riscv_vloxseg5ei32_v_u32m1(__VA_ARGS__) +#define vloxseg6ei32_v_u32m1(...) __riscv_vloxseg6ei32_v_u32m1(__VA_ARGS__) +#define vloxseg7ei32_v_u32m1(...) __riscv_vloxseg7ei32_v_u32m1(__VA_ARGS__) +#define vloxseg8ei32_v_u32m1(...) __riscv_vloxseg8ei32_v_u32m1(__VA_ARGS__) +#define vloxseg2ei32_v_u32m2(...) __riscv_vloxseg2ei32_v_u32m2(__VA_ARGS__) +#define vloxseg3ei32_v_u32m2(...) __riscv_vloxseg3ei32_v_u32m2(__VA_ARGS__) +#define vloxseg4ei32_v_u32m2(...) __riscv_vloxseg4ei32_v_u32m2(__VA_ARGS__) +#define vloxseg2ei32_v_u32m4(...) __riscv_vloxseg2ei32_v_u32m4(__VA_ARGS__) +#define vloxseg2ei64_v_u32mf2(...) __riscv_vloxseg2ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg3ei64_v_u32mf2(...) __riscv_vloxseg3ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg4ei64_v_u32mf2(...) __riscv_vloxseg4ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg5ei64_v_u32mf2(...) __riscv_vloxseg5ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg6ei64_v_u32mf2(...) __riscv_vloxseg6ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg7ei64_v_u32mf2(...) __riscv_vloxseg7ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg8ei64_v_u32mf2(...) __riscv_vloxseg8ei64_v_u32mf2(__VA_ARGS__) +#define vloxseg2ei64_v_u32m1(...) __riscv_vloxseg2ei64_v_u32m1(__VA_ARGS__) +#define vloxseg3ei64_v_u32m1(...) __riscv_vloxseg3ei64_v_u32m1(__VA_ARGS__) +#define vloxseg4ei64_v_u32m1(...) __riscv_vloxseg4ei64_v_u32m1(__VA_ARGS__) +#define vloxseg5ei64_v_u32m1(...) __riscv_vloxseg5ei64_v_u32m1(__VA_ARGS__) +#define vloxseg6ei64_v_u32m1(...) __riscv_vloxseg6ei64_v_u32m1(__VA_ARGS__) +#define vloxseg7ei64_v_u32m1(...) __riscv_vloxseg7ei64_v_u32m1(__VA_ARGS__) +#define vloxseg8ei64_v_u32m1(...) __riscv_vloxseg8ei64_v_u32m1(__VA_ARGS__) +#define vloxseg2ei64_v_u32m2(...) __riscv_vloxseg2ei64_v_u32m2(__VA_ARGS__) +#define vloxseg3ei64_v_u32m2(...) __riscv_vloxseg3ei64_v_u32m2(__VA_ARGS__) +#define vloxseg4ei64_v_u32m2(...) __riscv_vloxseg4ei64_v_u32m2(__VA_ARGS__) +#define vloxseg2ei64_v_u32m4(...) __riscv_vloxseg2ei64_v_u32m4(__VA_ARGS__) +#define vloxseg2ei8_v_u64m1(...) __riscv_vloxseg2ei8_v_u64m1(__VA_ARGS__) +#define vloxseg3ei8_v_u64m1(...) __riscv_vloxseg3ei8_v_u64m1(__VA_ARGS__) +#define vloxseg4ei8_v_u64m1(...) __riscv_vloxseg4ei8_v_u64m1(__VA_ARGS__) +#define vloxseg5ei8_v_u64m1(...) __riscv_vloxseg5ei8_v_u64m1(__VA_ARGS__) +#define vloxseg6ei8_v_u64m1(...) __riscv_vloxseg6ei8_v_u64m1(__VA_ARGS__) +#define vloxseg7ei8_v_u64m1(...) __riscv_vloxseg7ei8_v_u64m1(__VA_ARGS__) +#define vloxseg8ei8_v_u64m1(...) __riscv_vloxseg8ei8_v_u64m1(__VA_ARGS__) +#define vloxseg2ei8_v_u64m2(...) __riscv_vloxseg2ei8_v_u64m2(__VA_ARGS__) +#define vloxseg3ei8_v_u64m2(...) __riscv_vloxseg3ei8_v_u64m2(__VA_ARGS__) +#define vloxseg4ei8_v_u64m2(...) __riscv_vloxseg4ei8_v_u64m2(__VA_ARGS__) +#define vloxseg2ei8_v_u64m4(...) __riscv_vloxseg2ei8_v_u64m4(__VA_ARGS__) +#define vloxseg2ei16_v_u64m1(...) __riscv_vloxseg2ei16_v_u64m1(__VA_ARGS__) +#define vloxseg3ei16_v_u64m1(...) __riscv_vloxseg3ei16_v_u64m1(__VA_ARGS__) +#define vloxseg4ei16_v_u64m1(...) __riscv_vloxseg4ei16_v_u64m1(__VA_ARGS__) +#define vloxseg5ei16_v_u64m1(...) __riscv_vloxseg5ei16_v_u64m1(__VA_ARGS__) +#define vloxseg6ei16_v_u64m1(...) __riscv_vloxseg6ei16_v_u64m1(__VA_ARGS__) +#define vloxseg7ei16_v_u64m1(...) __riscv_vloxseg7ei16_v_u64m1(__VA_ARGS__) +#define vloxseg8ei16_v_u64m1(...) __riscv_vloxseg8ei16_v_u64m1(__VA_ARGS__) +#define vloxseg2ei16_v_u64m2(...) __riscv_vloxseg2ei16_v_u64m2(__VA_ARGS__) +#define vloxseg3ei16_v_u64m2(...) __riscv_vloxseg3ei16_v_u64m2(__VA_ARGS__) +#define vloxseg4ei16_v_u64m2(...) __riscv_vloxseg4ei16_v_u64m2(__VA_ARGS__) +#define vloxseg2ei16_v_u64m4(...) __riscv_vloxseg2ei16_v_u64m4(__VA_ARGS__) +#define vloxseg2ei32_v_u64m1(...) __riscv_vloxseg2ei32_v_u64m1(__VA_ARGS__) +#define vloxseg3ei32_v_u64m1(...) __riscv_vloxseg3ei32_v_u64m1(__VA_ARGS__) +#define vloxseg4ei32_v_u64m1(...) __riscv_vloxseg4ei32_v_u64m1(__VA_ARGS__) +#define vloxseg5ei32_v_u64m1(...) __riscv_vloxseg5ei32_v_u64m1(__VA_ARGS__) +#define vloxseg6ei32_v_u64m1(...) __riscv_vloxseg6ei32_v_u64m1(__VA_ARGS__) +#define vloxseg7ei32_v_u64m1(...) __riscv_vloxseg7ei32_v_u64m1(__VA_ARGS__) +#define vloxseg8ei32_v_u64m1(...) __riscv_vloxseg8ei32_v_u64m1(__VA_ARGS__) +#define vloxseg2ei32_v_u64m2(...) __riscv_vloxseg2ei32_v_u64m2(__VA_ARGS__) +#define vloxseg3ei32_v_u64m2(...) __riscv_vloxseg3ei32_v_u64m2(__VA_ARGS__) +#define vloxseg4ei32_v_u64m2(...) __riscv_vloxseg4ei32_v_u64m2(__VA_ARGS__) +#define vloxseg2ei32_v_u64m4(...) __riscv_vloxseg2ei32_v_u64m4(__VA_ARGS__) +#define vloxseg2ei64_v_u64m1(...) __riscv_vloxseg2ei64_v_u64m1(__VA_ARGS__) +#define vloxseg3ei64_v_u64m1(...) __riscv_vloxseg3ei64_v_u64m1(__VA_ARGS__) +#define vloxseg4ei64_v_u64m1(...) __riscv_vloxseg4ei64_v_u64m1(__VA_ARGS__) +#define vloxseg5ei64_v_u64m1(...) __riscv_vloxseg5ei64_v_u64m1(__VA_ARGS__) +#define vloxseg6ei64_v_u64m1(...) __riscv_vloxseg6ei64_v_u64m1(__VA_ARGS__) +#define vloxseg7ei64_v_u64m1(...) __riscv_vloxseg7ei64_v_u64m1(__VA_ARGS__) +#define vloxseg8ei64_v_u64m1(...) __riscv_vloxseg8ei64_v_u64m1(__VA_ARGS__) +#define vloxseg2ei64_v_u64m2(...) __riscv_vloxseg2ei64_v_u64m2(__VA_ARGS__) +#define vloxseg3ei64_v_u64m2(...) __riscv_vloxseg3ei64_v_u64m2(__VA_ARGS__) +#define vloxseg4ei64_v_u64m2(...) __riscv_vloxseg4ei64_v_u64m2(__VA_ARGS__) +#define vloxseg2ei64_v_u64m4(...) __riscv_vloxseg2ei64_v_u64m4(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf8(...) __riscv_vluxseg2ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf8(...) __riscv_vluxseg3ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf8(...) __riscv_vluxseg4ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf8(...) __riscv_vluxseg5ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf8(...) __riscv_vluxseg6ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf8(...) __riscv_vluxseg7ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf8(...) __riscv_vluxseg8ei8_v_u8mf8(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf4(...) __riscv_vluxseg2ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf4(...) __riscv_vluxseg3ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf4(...) __riscv_vluxseg4ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf4(...) __riscv_vluxseg5ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf4(...) __riscv_vluxseg6ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf4(...) __riscv_vluxseg7ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf4(...) __riscv_vluxseg8ei8_v_u8mf4(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf2(...) __riscv_vluxseg2ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf2(...) __riscv_vluxseg3ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf2(...) __riscv_vluxseg4ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf2(...) __riscv_vluxseg5ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf2(...) __riscv_vluxseg6ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf2(...) __riscv_vluxseg7ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf2(...) __riscv_vluxseg8ei8_v_u8mf2(__VA_ARGS__) +#define vluxseg2ei8_v_u8m1(...) __riscv_vluxseg2ei8_v_u8m1(__VA_ARGS__) +#define vluxseg3ei8_v_u8m1(...) __riscv_vluxseg3ei8_v_u8m1(__VA_ARGS__) +#define vluxseg4ei8_v_u8m1(...) __riscv_vluxseg4ei8_v_u8m1(__VA_ARGS__) +#define vluxseg5ei8_v_u8m1(...) __riscv_vluxseg5ei8_v_u8m1(__VA_ARGS__) +#define vluxseg6ei8_v_u8m1(...) __riscv_vluxseg6ei8_v_u8m1(__VA_ARGS__) +#define vluxseg7ei8_v_u8m1(...) __riscv_vluxseg7ei8_v_u8m1(__VA_ARGS__) +#define vluxseg8ei8_v_u8m1(...) __riscv_vluxseg8ei8_v_u8m1(__VA_ARGS__) +#define vluxseg2ei8_v_u8m2(...) __riscv_vluxseg2ei8_v_u8m2(__VA_ARGS__) +#define vluxseg3ei8_v_u8m2(...) __riscv_vluxseg3ei8_v_u8m2(__VA_ARGS__) +#define vluxseg4ei8_v_u8m2(...) __riscv_vluxseg4ei8_v_u8m2(__VA_ARGS__) +#define vluxseg2ei8_v_u8m4(...) __riscv_vluxseg2ei8_v_u8m4(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf8(...) __riscv_vluxseg2ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf8(...) __riscv_vluxseg3ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf8(...) __riscv_vluxseg4ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf8(...) __riscv_vluxseg5ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf8(...) __riscv_vluxseg6ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf8(...) __riscv_vluxseg7ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf8(...) __riscv_vluxseg8ei16_v_u8mf8(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf4(...) __riscv_vluxseg2ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf4(...) __riscv_vluxseg3ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf4(...) __riscv_vluxseg4ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf4(...) __riscv_vluxseg5ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf4(...) __riscv_vluxseg6ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf4(...) __riscv_vluxseg7ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf4(...) __riscv_vluxseg8ei16_v_u8mf4(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf2(...) __riscv_vluxseg2ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf2(...) __riscv_vluxseg3ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf2(...) __riscv_vluxseg4ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf2(...) __riscv_vluxseg5ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf2(...) __riscv_vluxseg6ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf2(...) __riscv_vluxseg7ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf2(...) __riscv_vluxseg8ei16_v_u8mf2(__VA_ARGS__) +#define vluxseg2ei16_v_u8m1(...) __riscv_vluxseg2ei16_v_u8m1(__VA_ARGS__) +#define vluxseg3ei16_v_u8m1(...) __riscv_vluxseg3ei16_v_u8m1(__VA_ARGS__) +#define vluxseg4ei16_v_u8m1(...) __riscv_vluxseg4ei16_v_u8m1(__VA_ARGS__) +#define vluxseg5ei16_v_u8m1(...) __riscv_vluxseg5ei16_v_u8m1(__VA_ARGS__) +#define vluxseg6ei16_v_u8m1(...) __riscv_vluxseg6ei16_v_u8m1(__VA_ARGS__) +#define vluxseg7ei16_v_u8m1(...) __riscv_vluxseg7ei16_v_u8m1(__VA_ARGS__) +#define vluxseg8ei16_v_u8m1(...) __riscv_vluxseg8ei16_v_u8m1(__VA_ARGS__) +#define vluxseg2ei16_v_u8m2(...) __riscv_vluxseg2ei16_v_u8m2(__VA_ARGS__) +#define vluxseg3ei16_v_u8m2(...) __riscv_vluxseg3ei16_v_u8m2(__VA_ARGS__) +#define vluxseg4ei16_v_u8m2(...) __riscv_vluxseg4ei16_v_u8m2(__VA_ARGS__) +#define vluxseg2ei16_v_u8m4(...) __riscv_vluxseg2ei16_v_u8m4(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf8(...) __riscv_vluxseg2ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf8(...) __riscv_vluxseg3ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf8(...) __riscv_vluxseg4ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf8(...) __riscv_vluxseg5ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf8(...) __riscv_vluxseg6ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf8(...) __riscv_vluxseg7ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf8(...) __riscv_vluxseg8ei32_v_u8mf8(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf4(...) __riscv_vluxseg2ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf4(...) __riscv_vluxseg3ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf4(...) __riscv_vluxseg4ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf4(...) __riscv_vluxseg5ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf4(...) __riscv_vluxseg6ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf4(...) __riscv_vluxseg7ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf4(...) __riscv_vluxseg8ei32_v_u8mf4(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf2(...) __riscv_vluxseg2ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf2(...) __riscv_vluxseg3ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf2(...) __riscv_vluxseg4ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf2(...) __riscv_vluxseg5ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf2(...) __riscv_vluxseg6ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf2(...) __riscv_vluxseg7ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf2(...) __riscv_vluxseg8ei32_v_u8mf2(__VA_ARGS__) +#define vluxseg2ei32_v_u8m1(...) __riscv_vluxseg2ei32_v_u8m1(__VA_ARGS__) +#define vluxseg3ei32_v_u8m1(...) __riscv_vluxseg3ei32_v_u8m1(__VA_ARGS__) +#define vluxseg4ei32_v_u8m1(...) __riscv_vluxseg4ei32_v_u8m1(__VA_ARGS__) +#define vluxseg5ei32_v_u8m1(...) __riscv_vluxseg5ei32_v_u8m1(__VA_ARGS__) +#define vluxseg6ei32_v_u8m1(...) __riscv_vluxseg6ei32_v_u8m1(__VA_ARGS__) +#define vluxseg7ei32_v_u8m1(...) __riscv_vluxseg7ei32_v_u8m1(__VA_ARGS__) +#define vluxseg8ei32_v_u8m1(...) __riscv_vluxseg8ei32_v_u8m1(__VA_ARGS__) +#define vluxseg2ei32_v_u8m2(...) __riscv_vluxseg2ei32_v_u8m2(__VA_ARGS__) +#define vluxseg3ei32_v_u8m2(...) __riscv_vluxseg3ei32_v_u8m2(__VA_ARGS__) +#define vluxseg4ei32_v_u8m2(...) __riscv_vluxseg4ei32_v_u8m2(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf8(...) __riscv_vluxseg2ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf8(...) __riscv_vluxseg3ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf8(...) __riscv_vluxseg4ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf8(...) __riscv_vluxseg5ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf8(...) __riscv_vluxseg6ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf8(...) __riscv_vluxseg7ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf8(...) __riscv_vluxseg8ei64_v_u8mf8(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf4(...) __riscv_vluxseg2ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf4(...) __riscv_vluxseg3ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf4(...) __riscv_vluxseg4ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf4(...) __riscv_vluxseg5ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf4(...) __riscv_vluxseg6ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf4(...) __riscv_vluxseg7ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf4(...) __riscv_vluxseg8ei64_v_u8mf4(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf2(...) __riscv_vluxseg2ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf2(...) __riscv_vluxseg3ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf2(...) __riscv_vluxseg4ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf2(...) __riscv_vluxseg5ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf2(...) __riscv_vluxseg6ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf2(...) __riscv_vluxseg7ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf2(...) __riscv_vluxseg8ei64_v_u8mf2(__VA_ARGS__) +#define vluxseg2ei64_v_u8m1(...) __riscv_vluxseg2ei64_v_u8m1(__VA_ARGS__) +#define vluxseg3ei64_v_u8m1(...) __riscv_vluxseg3ei64_v_u8m1(__VA_ARGS__) +#define vluxseg4ei64_v_u8m1(...) __riscv_vluxseg4ei64_v_u8m1(__VA_ARGS__) +#define vluxseg5ei64_v_u8m1(...) __riscv_vluxseg5ei64_v_u8m1(__VA_ARGS__) +#define vluxseg6ei64_v_u8m1(...) __riscv_vluxseg6ei64_v_u8m1(__VA_ARGS__) +#define vluxseg7ei64_v_u8m1(...) __riscv_vluxseg7ei64_v_u8m1(__VA_ARGS__) +#define vluxseg8ei64_v_u8m1(...) __riscv_vluxseg8ei64_v_u8m1(__VA_ARGS__) +#define vluxseg2ei8_v_u16mf4(...) __riscv_vluxseg2ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg3ei8_v_u16mf4(...) __riscv_vluxseg3ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg4ei8_v_u16mf4(...) __riscv_vluxseg4ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg5ei8_v_u16mf4(...) __riscv_vluxseg5ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg6ei8_v_u16mf4(...) __riscv_vluxseg6ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg7ei8_v_u16mf4(...) __riscv_vluxseg7ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg8ei8_v_u16mf4(...) __riscv_vluxseg8ei8_v_u16mf4(__VA_ARGS__) +#define vluxseg2ei8_v_u16mf2(...) __riscv_vluxseg2ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg3ei8_v_u16mf2(...) __riscv_vluxseg3ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg4ei8_v_u16mf2(...) __riscv_vluxseg4ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg5ei8_v_u16mf2(...) __riscv_vluxseg5ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg6ei8_v_u16mf2(...) __riscv_vluxseg6ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg7ei8_v_u16mf2(...) __riscv_vluxseg7ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg8ei8_v_u16mf2(...) __riscv_vluxseg8ei8_v_u16mf2(__VA_ARGS__) +#define vluxseg2ei8_v_u16m1(...) __riscv_vluxseg2ei8_v_u16m1(__VA_ARGS__) +#define vluxseg3ei8_v_u16m1(...) __riscv_vluxseg3ei8_v_u16m1(__VA_ARGS__) +#define vluxseg4ei8_v_u16m1(...) __riscv_vluxseg4ei8_v_u16m1(__VA_ARGS__) +#define vluxseg5ei8_v_u16m1(...) __riscv_vluxseg5ei8_v_u16m1(__VA_ARGS__) +#define vluxseg6ei8_v_u16m1(...) __riscv_vluxseg6ei8_v_u16m1(__VA_ARGS__) +#define vluxseg7ei8_v_u16m1(...) __riscv_vluxseg7ei8_v_u16m1(__VA_ARGS__) +#define vluxseg8ei8_v_u16m1(...) __riscv_vluxseg8ei8_v_u16m1(__VA_ARGS__) +#define vluxseg2ei8_v_u16m2(...) __riscv_vluxseg2ei8_v_u16m2(__VA_ARGS__) +#define vluxseg3ei8_v_u16m2(...) __riscv_vluxseg3ei8_v_u16m2(__VA_ARGS__) +#define vluxseg4ei8_v_u16m2(...) __riscv_vluxseg4ei8_v_u16m2(__VA_ARGS__) +#define vluxseg2ei8_v_u16m4(...) __riscv_vluxseg2ei8_v_u16m4(__VA_ARGS__) +#define vluxseg2ei16_v_u16mf4(...) __riscv_vluxseg2ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg3ei16_v_u16mf4(...) __riscv_vluxseg3ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg4ei16_v_u16mf4(...) __riscv_vluxseg4ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg5ei16_v_u16mf4(...) __riscv_vluxseg5ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg6ei16_v_u16mf4(...) __riscv_vluxseg6ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg7ei16_v_u16mf4(...) __riscv_vluxseg7ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg8ei16_v_u16mf4(...) __riscv_vluxseg8ei16_v_u16mf4(__VA_ARGS__) +#define vluxseg2ei16_v_u16mf2(...) __riscv_vluxseg2ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg3ei16_v_u16mf2(...) __riscv_vluxseg3ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg4ei16_v_u16mf2(...) __riscv_vluxseg4ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg5ei16_v_u16mf2(...) __riscv_vluxseg5ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg6ei16_v_u16mf2(...) __riscv_vluxseg6ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg7ei16_v_u16mf2(...) __riscv_vluxseg7ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg8ei16_v_u16mf2(...) __riscv_vluxseg8ei16_v_u16mf2(__VA_ARGS__) +#define vluxseg2ei16_v_u16m1(...) __riscv_vluxseg2ei16_v_u16m1(__VA_ARGS__) +#define vluxseg3ei16_v_u16m1(...) __riscv_vluxseg3ei16_v_u16m1(__VA_ARGS__) +#define vluxseg4ei16_v_u16m1(...) __riscv_vluxseg4ei16_v_u16m1(__VA_ARGS__) +#define vluxseg5ei16_v_u16m1(...) __riscv_vluxseg5ei16_v_u16m1(__VA_ARGS__) +#define vluxseg6ei16_v_u16m1(...) __riscv_vluxseg6ei16_v_u16m1(__VA_ARGS__) +#define vluxseg7ei16_v_u16m1(...) __riscv_vluxseg7ei16_v_u16m1(__VA_ARGS__) +#define vluxseg8ei16_v_u16m1(...) __riscv_vluxseg8ei16_v_u16m1(__VA_ARGS__) +#define vluxseg2ei16_v_u16m2(...) __riscv_vluxseg2ei16_v_u16m2(__VA_ARGS__) +#define vluxseg3ei16_v_u16m2(...) __riscv_vluxseg3ei16_v_u16m2(__VA_ARGS__) +#define vluxseg4ei16_v_u16m2(...) __riscv_vluxseg4ei16_v_u16m2(__VA_ARGS__) +#define vluxseg2ei16_v_u16m4(...) __riscv_vluxseg2ei16_v_u16m4(__VA_ARGS__) +#define vluxseg2ei32_v_u16mf4(...) __riscv_vluxseg2ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg3ei32_v_u16mf4(...) __riscv_vluxseg3ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg4ei32_v_u16mf4(...) __riscv_vluxseg4ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg5ei32_v_u16mf4(...) __riscv_vluxseg5ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg6ei32_v_u16mf4(...) __riscv_vluxseg6ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg7ei32_v_u16mf4(...) __riscv_vluxseg7ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg8ei32_v_u16mf4(...) __riscv_vluxseg8ei32_v_u16mf4(__VA_ARGS__) +#define vluxseg2ei32_v_u16mf2(...) __riscv_vluxseg2ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg3ei32_v_u16mf2(...) __riscv_vluxseg3ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg4ei32_v_u16mf2(...) __riscv_vluxseg4ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg5ei32_v_u16mf2(...) __riscv_vluxseg5ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg6ei32_v_u16mf2(...) __riscv_vluxseg6ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg7ei32_v_u16mf2(...) __riscv_vluxseg7ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg8ei32_v_u16mf2(...) __riscv_vluxseg8ei32_v_u16mf2(__VA_ARGS__) +#define vluxseg2ei32_v_u16m1(...) __riscv_vluxseg2ei32_v_u16m1(__VA_ARGS__) +#define vluxseg3ei32_v_u16m1(...) __riscv_vluxseg3ei32_v_u16m1(__VA_ARGS__) +#define vluxseg4ei32_v_u16m1(...) __riscv_vluxseg4ei32_v_u16m1(__VA_ARGS__) +#define vluxseg5ei32_v_u16m1(...) __riscv_vluxseg5ei32_v_u16m1(__VA_ARGS__) +#define vluxseg6ei32_v_u16m1(...) __riscv_vluxseg6ei32_v_u16m1(__VA_ARGS__) +#define vluxseg7ei32_v_u16m1(...) __riscv_vluxseg7ei32_v_u16m1(__VA_ARGS__) +#define vluxseg8ei32_v_u16m1(...) __riscv_vluxseg8ei32_v_u16m1(__VA_ARGS__) +#define vluxseg2ei32_v_u16m2(...) __riscv_vluxseg2ei32_v_u16m2(__VA_ARGS__) +#define vluxseg3ei32_v_u16m2(...) __riscv_vluxseg3ei32_v_u16m2(__VA_ARGS__) +#define vluxseg4ei32_v_u16m2(...) __riscv_vluxseg4ei32_v_u16m2(__VA_ARGS__) +#define vluxseg2ei32_v_u16m4(...) __riscv_vluxseg2ei32_v_u16m4(__VA_ARGS__) +#define vluxseg2ei64_v_u16mf4(...) __riscv_vluxseg2ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg3ei64_v_u16mf4(...) __riscv_vluxseg3ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg4ei64_v_u16mf4(...) __riscv_vluxseg4ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg5ei64_v_u16mf4(...) __riscv_vluxseg5ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg6ei64_v_u16mf4(...) __riscv_vluxseg6ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg7ei64_v_u16mf4(...) __riscv_vluxseg7ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg8ei64_v_u16mf4(...) __riscv_vluxseg8ei64_v_u16mf4(__VA_ARGS__) +#define vluxseg2ei64_v_u16mf2(...) __riscv_vluxseg2ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg3ei64_v_u16mf2(...) __riscv_vluxseg3ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg4ei64_v_u16mf2(...) __riscv_vluxseg4ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg5ei64_v_u16mf2(...) __riscv_vluxseg5ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg6ei64_v_u16mf2(...) __riscv_vluxseg6ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg7ei64_v_u16mf2(...) __riscv_vluxseg7ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg8ei64_v_u16mf2(...) __riscv_vluxseg8ei64_v_u16mf2(__VA_ARGS__) +#define vluxseg2ei64_v_u16m1(...) __riscv_vluxseg2ei64_v_u16m1(__VA_ARGS__) +#define vluxseg3ei64_v_u16m1(...) __riscv_vluxseg3ei64_v_u16m1(__VA_ARGS__) +#define vluxseg4ei64_v_u16m1(...) __riscv_vluxseg4ei64_v_u16m1(__VA_ARGS__) +#define vluxseg5ei64_v_u16m1(...) __riscv_vluxseg5ei64_v_u16m1(__VA_ARGS__) +#define vluxseg6ei64_v_u16m1(...) __riscv_vluxseg6ei64_v_u16m1(__VA_ARGS__) +#define vluxseg7ei64_v_u16m1(...) __riscv_vluxseg7ei64_v_u16m1(__VA_ARGS__) +#define vluxseg8ei64_v_u16m1(...) __riscv_vluxseg8ei64_v_u16m1(__VA_ARGS__) +#define vluxseg2ei64_v_u16m2(...) __riscv_vluxseg2ei64_v_u16m2(__VA_ARGS__) +#define vluxseg3ei64_v_u16m2(...) __riscv_vluxseg3ei64_v_u16m2(__VA_ARGS__) +#define vluxseg4ei64_v_u16m2(...) __riscv_vluxseg4ei64_v_u16m2(__VA_ARGS__) +#define vluxseg2ei8_v_u32mf2(...) __riscv_vluxseg2ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg3ei8_v_u32mf2(...) __riscv_vluxseg3ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg4ei8_v_u32mf2(...) __riscv_vluxseg4ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg5ei8_v_u32mf2(...) __riscv_vluxseg5ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg6ei8_v_u32mf2(...) __riscv_vluxseg6ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg7ei8_v_u32mf2(...) __riscv_vluxseg7ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg8ei8_v_u32mf2(...) __riscv_vluxseg8ei8_v_u32mf2(__VA_ARGS__) +#define vluxseg2ei8_v_u32m1(...) __riscv_vluxseg2ei8_v_u32m1(__VA_ARGS__) +#define vluxseg3ei8_v_u32m1(...) __riscv_vluxseg3ei8_v_u32m1(__VA_ARGS__) +#define vluxseg4ei8_v_u32m1(...) __riscv_vluxseg4ei8_v_u32m1(__VA_ARGS__) +#define vluxseg5ei8_v_u32m1(...) __riscv_vluxseg5ei8_v_u32m1(__VA_ARGS__) +#define vluxseg6ei8_v_u32m1(...) __riscv_vluxseg6ei8_v_u32m1(__VA_ARGS__) +#define vluxseg7ei8_v_u32m1(...) __riscv_vluxseg7ei8_v_u32m1(__VA_ARGS__) +#define vluxseg8ei8_v_u32m1(...) __riscv_vluxseg8ei8_v_u32m1(__VA_ARGS__) +#define vluxseg2ei8_v_u32m2(...) __riscv_vluxseg2ei8_v_u32m2(__VA_ARGS__) +#define vluxseg3ei8_v_u32m2(...) __riscv_vluxseg3ei8_v_u32m2(__VA_ARGS__) +#define vluxseg4ei8_v_u32m2(...) __riscv_vluxseg4ei8_v_u32m2(__VA_ARGS__) +#define vluxseg2ei8_v_u32m4(...) __riscv_vluxseg2ei8_v_u32m4(__VA_ARGS__) +#define vluxseg2ei16_v_u32mf2(...) __riscv_vluxseg2ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg3ei16_v_u32mf2(...) __riscv_vluxseg3ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg4ei16_v_u32mf2(...) __riscv_vluxseg4ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg5ei16_v_u32mf2(...) __riscv_vluxseg5ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg6ei16_v_u32mf2(...) __riscv_vluxseg6ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg7ei16_v_u32mf2(...) __riscv_vluxseg7ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg8ei16_v_u32mf2(...) __riscv_vluxseg8ei16_v_u32mf2(__VA_ARGS__) +#define vluxseg2ei16_v_u32m1(...) __riscv_vluxseg2ei16_v_u32m1(__VA_ARGS__) +#define vluxseg3ei16_v_u32m1(...) __riscv_vluxseg3ei16_v_u32m1(__VA_ARGS__) +#define vluxseg4ei16_v_u32m1(...) __riscv_vluxseg4ei16_v_u32m1(__VA_ARGS__) +#define vluxseg5ei16_v_u32m1(...) __riscv_vluxseg5ei16_v_u32m1(__VA_ARGS__) +#define vluxseg6ei16_v_u32m1(...) __riscv_vluxseg6ei16_v_u32m1(__VA_ARGS__) +#define vluxseg7ei16_v_u32m1(...) __riscv_vluxseg7ei16_v_u32m1(__VA_ARGS__) +#define vluxseg8ei16_v_u32m1(...) __riscv_vluxseg8ei16_v_u32m1(__VA_ARGS__) +#define vluxseg2ei16_v_u32m2(...) __riscv_vluxseg2ei16_v_u32m2(__VA_ARGS__) +#define vluxseg3ei16_v_u32m2(...) __riscv_vluxseg3ei16_v_u32m2(__VA_ARGS__) +#define vluxseg4ei16_v_u32m2(...) __riscv_vluxseg4ei16_v_u32m2(__VA_ARGS__) +#define vluxseg2ei16_v_u32m4(...) __riscv_vluxseg2ei16_v_u32m4(__VA_ARGS__) +#define vluxseg2ei32_v_u32mf2(...) __riscv_vluxseg2ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg3ei32_v_u32mf2(...) __riscv_vluxseg3ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg4ei32_v_u32mf2(...) __riscv_vluxseg4ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg5ei32_v_u32mf2(...) __riscv_vluxseg5ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg6ei32_v_u32mf2(...) __riscv_vluxseg6ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg7ei32_v_u32mf2(...) __riscv_vluxseg7ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg8ei32_v_u32mf2(...) __riscv_vluxseg8ei32_v_u32mf2(__VA_ARGS__) +#define vluxseg2ei32_v_u32m1(...) __riscv_vluxseg2ei32_v_u32m1(__VA_ARGS__) +#define vluxseg3ei32_v_u32m1(...) __riscv_vluxseg3ei32_v_u32m1(__VA_ARGS__) +#define vluxseg4ei32_v_u32m1(...) __riscv_vluxseg4ei32_v_u32m1(__VA_ARGS__) +#define vluxseg5ei32_v_u32m1(...) __riscv_vluxseg5ei32_v_u32m1(__VA_ARGS__) +#define vluxseg6ei32_v_u32m1(...) __riscv_vluxseg6ei32_v_u32m1(__VA_ARGS__) +#define vluxseg7ei32_v_u32m1(...) __riscv_vluxseg7ei32_v_u32m1(__VA_ARGS__) +#define vluxseg8ei32_v_u32m1(...) __riscv_vluxseg8ei32_v_u32m1(__VA_ARGS__) +#define vluxseg2ei32_v_u32m2(...) __riscv_vluxseg2ei32_v_u32m2(__VA_ARGS__) +#define vluxseg3ei32_v_u32m2(...) __riscv_vluxseg3ei32_v_u32m2(__VA_ARGS__) +#define vluxseg4ei32_v_u32m2(...) __riscv_vluxseg4ei32_v_u32m2(__VA_ARGS__) +#define vluxseg2ei32_v_u32m4(...) __riscv_vluxseg2ei32_v_u32m4(__VA_ARGS__) +#define vluxseg2ei64_v_u32mf2(...) __riscv_vluxseg2ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg3ei64_v_u32mf2(...) __riscv_vluxseg3ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg4ei64_v_u32mf2(...) __riscv_vluxseg4ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg5ei64_v_u32mf2(...) __riscv_vluxseg5ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg6ei64_v_u32mf2(...) __riscv_vluxseg6ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg7ei64_v_u32mf2(...) __riscv_vluxseg7ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg8ei64_v_u32mf2(...) __riscv_vluxseg8ei64_v_u32mf2(__VA_ARGS__) +#define vluxseg2ei64_v_u32m1(...) __riscv_vluxseg2ei64_v_u32m1(__VA_ARGS__) +#define vluxseg3ei64_v_u32m1(...) __riscv_vluxseg3ei64_v_u32m1(__VA_ARGS__) +#define vluxseg4ei64_v_u32m1(...) __riscv_vluxseg4ei64_v_u32m1(__VA_ARGS__) +#define vluxseg5ei64_v_u32m1(...) __riscv_vluxseg5ei64_v_u32m1(__VA_ARGS__) +#define vluxseg6ei64_v_u32m1(...) __riscv_vluxseg6ei64_v_u32m1(__VA_ARGS__) +#define vluxseg7ei64_v_u32m1(...) __riscv_vluxseg7ei64_v_u32m1(__VA_ARGS__) +#define vluxseg8ei64_v_u32m1(...) __riscv_vluxseg8ei64_v_u32m1(__VA_ARGS__) +#define vluxseg2ei64_v_u32m2(...) __riscv_vluxseg2ei64_v_u32m2(__VA_ARGS__) +#define vluxseg3ei64_v_u32m2(...) __riscv_vluxseg3ei64_v_u32m2(__VA_ARGS__) +#define vluxseg4ei64_v_u32m2(...) __riscv_vluxseg4ei64_v_u32m2(__VA_ARGS__) +#define vluxseg2ei64_v_u32m4(...) __riscv_vluxseg2ei64_v_u32m4(__VA_ARGS__) +#define vluxseg2ei8_v_u64m1(...) __riscv_vluxseg2ei8_v_u64m1(__VA_ARGS__) +#define vluxseg3ei8_v_u64m1(...) __riscv_vluxseg3ei8_v_u64m1(__VA_ARGS__) +#define vluxseg4ei8_v_u64m1(...) __riscv_vluxseg4ei8_v_u64m1(__VA_ARGS__) +#define vluxseg5ei8_v_u64m1(...) __riscv_vluxseg5ei8_v_u64m1(__VA_ARGS__) +#define vluxseg6ei8_v_u64m1(...) __riscv_vluxseg6ei8_v_u64m1(__VA_ARGS__) +#define vluxseg7ei8_v_u64m1(...) __riscv_vluxseg7ei8_v_u64m1(__VA_ARGS__) +#define vluxseg8ei8_v_u64m1(...) __riscv_vluxseg8ei8_v_u64m1(__VA_ARGS__) +#define vluxseg2ei8_v_u64m2(...) __riscv_vluxseg2ei8_v_u64m2(__VA_ARGS__) +#define vluxseg3ei8_v_u64m2(...) __riscv_vluxseg3ei8_v_u64m2(__VA_ARGS__) +#define vluxseg4ei8_v_u64m2(...) __riscv_vluxseg4ei8_v_u64m2(__VA_ARGS__) +#define vluxseg2ei8_v_u64m4(...) __riscv_vluxseg2ei8_v_u64m4(__VA_ARGS__) +#define vluxseg2ei16_v_u64m1(...) __riscv_vluxseg2ei16_v_u64m1(__VA_ARGS__) +#define vluxseg3ei16_v_u64m1(...) __riscv_vluxseg3ei16_v_u64m1(__VA_ARGS__) +#define vluxseg4ei16_v_u64m1(...) __riscv_vluxseg4ei16_v_u64m1(__VA_ARGS__) +#define vluxseg5ei16_v_u64m1(...) __riscv_vluxseg5ei16_v_u64m1(__VA_ARGS__) +#define vluxseg6ei16_v_u64m1(...) __riscv_vluxseg6ei16_v_u64m1(__VA_ARGS__) +#define vluxseg7ei16_v_u64m1(...) __riscv_vluxseg7ei16_v_u64m1(__VA_ARGS__) +#define vluxseg8ei16_v_u64m1(...) __riscv_vluxseg8ei16_v_u64m1(__VA_ARGS__) +#define vluxseg2ei16_v_u64m2(...) __riscv_vluxseg2ei16_v_u64m2(__VA_ARGS__) +#define vluxseg3ei16_v_u64m2(...) __riscv_vluxseg3ei16_v_u64m2(__VA_ARGS__) +#define vluxseg4ei16_v_u64m2(...) __riscv_vluxseg4ei16_v_u64m2(__VA_ARGS__) +#define vluxseg2ei16_v_u64m4(...) __riscv_vluxseg2ei16_v_u64m4(__VA_ARGS__) +#define vluxseg2ei32_v_u64m1(...) __riscv_vluxseg2ei32_v_u64m1(__VA_ARGS__) +#define vluxseg3ei32_v_u64m1(...) __riscv_vluxseg3ei32_v_u64m1(__VA_ARGS__) +#define vluxseg4ei32_v_u64m1(...) __riscv_vluxseg4ei32_v_u64m1(__VA_ARGS__) +#define vluxseg5ei32_v_u64m1(...) __riscv_vluxseg5ei32_v_u64m1(__VA_ARGS__) +#define vluxseg6ei32_v_u64m1(...) __riscv_vluxseg6ei32_v_u64m1(__VA_ARGS__) +#define vluxseg7ei32_v_u64m1(...) __riscv_vluxseg7ei32_v_u64m1(__VA_ARGS__) +#define vluxseg8ei32_v_u64m1(...) __riscv_vluxseg8ei32_v_u64m1(__VA_ARGS__) +#define vluxseg2ei32_v_u64m2(...) __riscv_vluxseg2ei32_v_u64m2(__VA_ARGS__) +#define vluxseg3ei32_v_u64m2(...) __riscv_vluxseg3ei32_v_u64m2(__VA_ARGS__) +#define vluxseg4ei32_v_u64m2(...) __riscv_vluxseg4ei32_v_u64m2(__VA_ARGS__) +#define vluxseg2ei32_v_u64m4(...) __riscv_vluxseg2ei32_v_u64m4(__VA_ARGS__) +#define vluxseg2ei64_v_u64m1(...) __riscv_vluxseg2ei64_v_u64m1(__VA_ARGS__) +#define vluxseg3ei64_v_u64m1(...) __riscv_vluxseg3ei64_v_u64m1(__VA_ARGS__) +#define vluxseg4ei64_v_u64m1(...) __riscv_vluxseg4ei64_v_u64m1(__VA_ARGS__) +#define vluxseg5ei64_v_u64m1(...) __riscv_vluxseg5ei64_v_u64m1(__VA_ARGS__) +#define vluxseg6ei64_v_u64m1(...) __riscv_vluxseg6ei64_v_u64m1(__VA_ARGS__) +#define vluxseg7ei64_v_u64m1(...) __riscv_vluxseg7ei64_v_u64m1(__VA_ARGS__) +#define vluxseg8ei64_v_u64m1(...) __riscv_vluxseg8ei64_v_u64m1(__VA_ARGS__) +#define vluxseg2ei64_v_u64m2(...) __riscv_vluxseg2ei64_v_u64m2(__VA_ARGS__) +#define vluxseg3ei64_v_u64m2(...) __riscv_vluxseg3ei64_v_u64m2(__VA_ARGS__) +#define vluxseg4ei64_v_u64m2(...) __riscv_vluxseg4ei64_v_u64m2(__VA_ARGS__) +#define vluxseg2ei64_v_u64m4(...) __riscv_vluxseg2ei64_v_u64m4(__VA_ARGS__) +// masked functions +#define vloxseg2ei8_v_f16mf4_m(...) __riscv_vloxseg2ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f16mf4_m(...) __riscv_vloxseg3ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f16mf4_m(...) __riscv_vloxseg4ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f16mf4_m(...) __riscv_vloxseg5ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f16mf4_m(...) __riscv_vloxseg6ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f16mf4_m(...) __riscv_vloxseg7ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f16mf4_m(...) __riscv_vloxseg8ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f16mf2_m(...) __riscv_vloxseg2ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f16mf2_m(...) __riscv_vloxseg3ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f16mf2_m(...) __riscv_vloxseg4ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f16mf2_m(...) __riscv_vloxseg5ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f16mf2_m(...) __riscv_vloxseg6ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f16mf2_m(...) __riscv_vloxseg7ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f16mf2_m(...) __riscv_vloxseg8ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f16m1_m(...) __riscv_vloxseg2ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f16m1_m(...) __riscv_vloxseg3ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f16m1_m(...) __riscv_vloxseg4ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f16m1_m(...) __riscv_vloxseg5ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f16m1_m(...) __riscv_vloxseg6ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f16m1_m(...) __riscv_vloxseg7ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f16m1_m(...) __riscv_vloxseg8ei8_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f16m2_m(...) __riscv_vloxseg2ei8_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f16m2_m(...) __riscv_vloxseg3ei8_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f16m2_m(...) __riscv_vloxseg4ei8_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f16m4_m(...) __riscv_vloxseg2ei8_v_f16m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f16mf4_m(...) __riscv_vloxseg2ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f16mf4_m(...) __riscv_vloxseg3ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f16mf4_m(...) __riscv_vloxseg4ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f16mf4_m(...) __riscv_vloxseg5ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f16mf4_m(...) __riscv_vloxseg6ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f16mf4_m(...) __riscv_vloxseg7ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f16mf4_m(...) __riscv_vloxseg8ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f16mf2_m(...) __riscv_vloxseg2ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f16mf2_m(...) __riscv_vloxseg3ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f16mf2_m(...) __riscv_vloxseg4ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f16mf2_m(...) __riscv_vloxseg5ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f16mf2_m(...) __riscv_vloxseg6ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f16mf2_m(...) __riscv_vloxseg7ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f16mf2_m(...) __riscv_vloxseg8ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f16m1_m(...) __riscv_vloxseg2ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f16m1_m(...) __riscv_vloxseg3ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f16m1_m(...) __riscv_vloxseg4ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f16m1_m(...) __riscv_vloxseg5ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f16m1_m(...) __riscv_vloxseg6ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f16m1_m(...) __riscv_vloxseg7ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f16m1_m(...) __riscv_vloxseg8ei16_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f16m2_m(...) __riscv_vloxseg2ei16_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f16m2_m(...) __riscv_vloxseg3ei16_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f16m2_m(...) __riscv_vloxseg4ei16_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f16m4_m(...) __riscv_vloxseg2ei16_v_f16m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f16mf4_m(...) __riscv_vloxseg2ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f16mf4_m(...) __riscv_vloxseg3ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f16mf4_m(...) __riscv_vloxseg4ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f16mf4_m(...) __riscv_vloxseg5ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f16mf4_m(...) __riscv_vloxseg6ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f16mf4_m(...) __riscv_vloxseg7ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f16mf4_m(...) __riscv_vloxseg8ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f16mf2_m(...) __riscv_vloxseg2ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f16mf2_m(...) __riscv_vloxseg3ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f16mf2_m(...) __riscv_vloxseg4ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f16mf2_m(...) __riscv_vloxseg5ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f16mf2_m(...) __riscv_vloxseg6ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f16mf2_m(...) __riscv_vloxseg7ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f16mf2_m(...) __riscv_vloxseg8ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f16m1_m(...) __riscv_vloxseg2ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f16m1_m(...) __riscv_vloxseg3ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f16m1_m(...) __riscv_vloxseg4ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f16m1_m(...) __riscv_vloxseg5ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f16m1_m(...) __riscv_vloxseg6ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f16m1_m(...) __riscv_vloxseg7ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f16m1_m(...) __riscv_vloxseg8ei32_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f16m2_m(...) __riscv_vloxseg2ei32_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f16m2_m(...) __riscv_vloxseg3ei32_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f16m2_m(...) __riscv_vloxseg4ei32_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f16m4_m(...) __riscv_vloxseg2ei32_v_f16m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f16mf4_m(...) __riscv_vloxseg2ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f16mf4_m(...) __riscv_vloxseg3ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f16mf4_m(...) __riscv_vloxseg4ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f16mf4_m(...) __riscv_vloxseg5ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f16mf4_m(...) __riscv_vloxseg6ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f16mf4_m(...) __riscv_vloxseg7ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f16mf4_m(...) __riscv_vloxseg8ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f16mf2_m(...) __riscv_vloxseg2ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f16mf2_m(...) __riscv_vloxseg3ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f16mf2_m(...) __riscv_vloxseg4ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f16mf2_m(...) __riscv_vloxseg5ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f16mf2_m(...) __riscv_vloxseg6ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f16mf2_m(...) __riscv_vloxseg7ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f16mf2_m(...) __riscv_vloxseg8ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f16m1_m(...) __riscv_vloxseg2ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f16m1_m(...) __riscv_vloxseg3ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f16m1_m(...) __riscv_vloxseg4ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f16m1_m(...) __riscv_vloxseg5ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f16m1_m(...) __riscv_vloxseg6ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f16m1_m(...) __riscv_vloxseg7ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f16m1_m(...) __riscv_vloxseg8ei64_v_f16m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f16m2_m(...) __riscv_vloxseg2ei64_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f16m2_m(...) __riscv_vloxseg3ei64_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f16m2_m(...) __riscv_vloxseg4ei64_v_f16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f32mf2_m(...) __riscv_vloxseg2ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f32mf2_m(...) __riscv_vloxseg3ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f32mf2_m(...) __riscv_vloxseg4ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f32mf2_m(...) __riscv_vloxseg5ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f32mf2_m(...) __riscv_vloxseg6ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f32mf2_m(...) __riscv_vloxseg7ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f32mf2_m(...) __riscv_vloxseg8ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f32m1_m(...) __riscv_vloxseg2ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f32m1_m(...) __riscv_vloxseg3ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f32m1_m(...) __riscv_vloxseg4ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f32m1_m(...) __riscv_vloxseg5ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f32m1_m(...) __riscv_vloxseg6ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f32m1_m(...) __riscv_vloxseg7ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f32m1_m(...) __riscv_vloxseg8ei8_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f32m2_m(...) __riscv_vloxseg2ei8_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f32m2_m(...) __riscv_vloxseg3ei8_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f32m2_m(...) __riscv_vloxseg4ei8_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f32m4_m(...) __riscv_vloxseg2ei8_v_f32m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f32mf2_m(...) __riscv_vloxseg2ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f32mf2_m(...) __riscv_vloxseg3ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f32mf2_m(...) __riscv_vloxseg4ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f32mf2_m(...) __riscv_vloxseg5ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f32mf2_m(...) __riscv_vloxseg6ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f32mf2_m(...) __riscv_vloxseg7ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f32mf2_m(...) __riscv_vloxseg8ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f32m1_m(...) __riscv_vloxseg2ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f32m1_m(...) __riscv_vloxseg3ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f32m1_m(...) __riscv_vloxseg4ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f32m1_m(...) __riscv_vloxseg5ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f32m1_m(...) __riscv_vloxseg6ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f32m1_m(...) __riscv_vloxseg7ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f32m1_m(...) __riscv_vloxseg8ei16_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f32m2_m(...) __riscv_vloxseg2ei16_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f32m2_m(...) __riscv_vloxseg3ei16_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f32m2_m(...) __riscv_vloxseg4ei16_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f32m4_m(...) __riscv_vloxseg2ei16_v_f32m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f32mf2_m(...) __riscv_vloxseg2ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f32mf2_m(...) __riscv_vloxseg3ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f32mf2_m(...) __riscv_vloxseg4ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f32mf2_m(...) __riscv_vloxseg5ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f32mf2_m(...) __riscv_vloxseg6ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f32mf2_m(...) __riscv_vloxseg7ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f32mf2_m(...) __riscv_vloxseg8ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f32m1_m(...) __riscv_vloxseg2ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f32m1_m(...) __riscv_vloxseg3ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f32m1_m(...) __riscv_vloxseg4ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f32m1_m(...) __riscv_vloxseg5ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f32m1_m(...) __riscv_vloxseg6ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f32m1_m(...) __riscv_vloxseg7ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f32m1_m(...) __riscv_vloxseg8ei32_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f32m2_m(...) __riscv_vloxseg2ei32_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f32m2_m(...) __riscv_vloxseg3ei32_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f32m2_m(...) __riscv_vloxseg4ei32_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f32m4_m(...) __riscv_vloxseg2ei32_v_f32m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f32mf2_m(...) __riscv_vloxseg2ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f32mf2_m(...) __riscv_vloxseg3ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f32mf2_m(...) __riscv_vloxseg4ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f32mf2_m(...) __riscv_vloxseg5ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f32mf2_m(...) __riscv_vloxseg6ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f32mf2_m(...) __riscv_vloxseg7ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f32mf2_m(...) __riscv_vloxseg8ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f32m1_m(...) __riscv_vloxseg2ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f32m1_m(...) __riscv_vloxseg3ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f32m1_m(...) __riscv_vloxseg4ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f32m1_m(...) __riscv_vloxseg5ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f32m1_m(...) __riscv_vloxseg6ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f32m1_m(...) __riscv_vloxseg7ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f32m1_m(...) __riscv_vloxseg8ei64_v_f32m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f32m2_m(...) __riscv_vloxseg2ei64_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f32m2_m(...) __riscv_vloxseg3ei64_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f32m2_m(...) __riscv_vloxseg4ei64_v_f32m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f32m4_m(...) __riscv_vloxseg2ei64_v_f32m4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f64m1_m(...) __riscv_vloxseg2ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f64m1_m(...) __riscv_vloxseg3ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f64m1_m(...) __riscv_vloxseg4ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_f64m1_m(...) __riscv_vloxseg5ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_f64m1_m(...) __riscv_vloxseg6ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_f64m1_m(...) __riscv_vloxseg7ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_f64m1_m(...) __riscv_vloxseg8ei8_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f64m2_m(...) __riscv_vloxseg2ei8_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_f64m2_m(...) __riscv_vloxseg3ei8_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_f64m2_m(...) __riscv_vloxseg4ei8_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_f64m4_m(...) __riscv_vloxseg2ei8_v_f64m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f64m1_m(...) __riscv_vloxseg2ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f64m1_m(...) __riscv_vloxseg3ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f64m1_m(...) __riscv_vloxseg4ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_f64m1_m(...) __riscv_vloxseg5ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_f64m1_m(...) __riscv_vloxseg6ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_f64m1_m(...) __riscv_vloxseg7ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_f64m1_m(...) __riscv_vloxseg8ei16_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f64m2_m(...) __riscv_vloxseg2ei16_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_f64m2_m(...) __riscv_vloxseg3ei16_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_f64m2_m(...) __riscv_vloxseg4ei16_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_f64m4_m(...) __riscv_vloxseg2ei16_v_f64m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f64m1_m(...) __riscv_vloxseg2ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f64m1_m(...) __riscv_vloxseg3ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f64m1_m(...) __riscv_vloxseg4ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_f64m1_m(...) __riscv_vloxseg5ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_f64m1_m(...) __riscv_vloxseg6ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_f64m1_m(...) __riscv_vloxseg7ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_f64m1_m(...) __riscv_vloxseg8ei32_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f64m2_m(...) __riscv_vloxseg2ei32_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_f64m2_m(...) __riscv_vloxseg3ei32_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_f64m2_m(...) __riscv_vloxseg4ei32_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_f64m4_m(...) __riscv_vloxseg2ei32_v_f64m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f64m1_m(...) __riscv_vloxseg2ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f64m1_m(...) __riscv_vloxseg3ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f64m1_m(...) __riscv_vloxseg4ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_f64m1_m(...) __riscv_vloxseg5ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_f64m1_m(...) __riscv_vloxseg6ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_f64m1_m(...) __riscv_vloxseg7ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_f64m1_m(...) __riscv_vloxseg8ei64_v_f64m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f64m2_m(...) __riscv_vloxseg2ei64_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_f64m2_m(...) __riscv_vloxseg3ei64_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_f64m2_m(...) __riscv_vloxseg4ei64_v_f64m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_f64m4_m(...) __riscv_vloxseg2ei64_v_f64m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f16mf4_m(...) __riscv_vluxseg2ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f16mf4_m(...) __riscv_vluxseg3ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f16mf4_m(...) __riscv_vluxseg4ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f16mf4_m(...) __riscv_vluxseg5ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f16mf4_m(...) __riscv_vluxseg6ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f16mf4_m(...) __riscv_vluxseg7ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f16mf4_m(...) __riscv_vluxseg8ei8_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f16mf2_m(...) __riscv_vluxseg2ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f16mf2_m(...) __riscv_vluxseg3ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f16mf2_m(...) __riscv_vluxseg4ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f16mf2_m(...) __riscv_vluxseg5ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f16mf2_m(...) __riscv_vluxseg6ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f16mf2_m(...) __riscv_vluxseg7ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f16mf2_m(...) __riscv_vluxseg8ei8_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f16m1_m(...) __riscv_vluxseg2ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f16m1_m(...) __riscv_vluxseg3ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f16m1_m(...) __riscv_vluxseg4ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f16m1_m(...) __riscv_vluxseg5ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f16m1_m(...) __riscv_vluxseg6ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f16m1_m(...) __riscv_vluxseg7ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f16m1_m(...) __riscv_vluxseg8ei8_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f16m2_m(...) __riscv_vluxseg2ei8_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f16m2_m(...) __riscv_vluxseg3ei8_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f16m2_m(...) __riscv_vluxseg4ei8_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f16m4_m(...) __riscv_vluxseg2ei8_v_f16m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f16mf4_m(...) __riscv_vluxseg2ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f16mf4_m(...) __riscv_vluxseg3ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f16mf4_m(...) __riscv_vluxseg4ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f16mf4_m(...) __riscv_vluxseg5ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f16mf4_m(...) __riscv_vluxseg6ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f16mf4_m(...) __riscv_vluxseg7ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f16mf4_m(...) __riscv_vluxseg8ei16_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f16mf2_m(...) __riscv_vluxseg2ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f16mf2_m(...) __riscv_vluxseg3ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f16mf2_m(...) __riscv_vluxseg4ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f16mf2_m(...) __riscv_vluxseg5ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f16mf2_m(...) __riscv_vluxseg6ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f16mf2_m(...) __riscv_vluxseg7ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f16mf2_m(...) __riscv_vluxseg8ei16_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f16m1_m(...) __riscv_vluxseg2ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f16m1_m(...) __riscv_vluxseg3ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f16m1_m(...) __riscv_vluxseg4ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f16m1_m(...) __riscv_vluxseg5ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f16m1_m(...) __riscv_vluxseg6ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f16m1_m(...) __riscv_vluxseg7ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f16m1_m(...) __riscv_vluxseg8ei16_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f16m2_m(...) __riscv_vluxseg2ei16_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f16m2_m(...) __riscv_vluxseg3ei16_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f16m2_m(...) __riscv_vluxseg4ei16_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f16m4_m(...) __riscv_vluxseg2ei16_v_f16m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f16mf4_m(...) __riscv_vluxseg2ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f16mf4_m(...) __riscv_vluxseg3ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f16mf4_m(...) __riscv_vluxseg4ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f16mf4_m(...) __riscv_vluxseg5ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f16mf4_m(...) __riscv_vluxseg6ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f16mf4_m(...) __riscv_vluxseg7ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f16mf4_m(...) __riscv_vluxseg8ei32_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f16mf2_m(...) __riscv_vluxseg2ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f16mf2_m(...) __riscv_vluxseg3ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f16mf2_m(...) __riscv_vluxseg4ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f16mf2_m(...) __riscv_vluxseg5ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f16mf2_m(...) __riscv_vluxseg6ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f16mf2_m(...) __riscv_vluxseg7ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f16mf2_m(...) __riscv_vluxseg8ei32_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f16m1_m(...) __riscv_vluxseg2ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f16m1_m(...) __riscv_vluxseg3ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f16m1_m(...) __riscv_vluxseg4ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f16m1_m(...) __riscv_vluxseg5ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f16m1_m(...) __riscv_vluxseg6ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f16m1_m(...) __riscv_vluxseg7ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f16m1_m(...) __riscv_vluxseg8ei32_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f16m2_m(...) __riscv_vluxseg2ei32_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f16m2_m(...) __riscv_vluxseg3ei32_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f16m2_m(...) __riscv_vluxseg4ei32_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f16m4_m(...) __riscv_vluxseg2ei32_v_f16m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f16mf4_m(...) __riscv_vluxseg2ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f16mf4_m(...) __riscv_vluxseg3ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f16mf4_m(...) __riscv_vluxseg4ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f16mf4_m(...) __riscv_vluxseg5ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f16mf4_m(...) __riscv_vluxseg6ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f16mf4_m(...) __riscv_vluxseg7ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f16mf4_m(...) __riscv_vluxseg8ei64_v_f16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f16mf2_m(...) __riscv_vluxseg2ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f16mf2_m(...) __riscv_vluxseg3ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f16mf2_m(...) __riscv_vluxseg4ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f16mf2_m(...) __riscv_vluxseg5ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f16mf2_m(...) __riscv_vluxseg6ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f16mf2_m(...) __riscv_vluxseg7ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f16mf2_m(...) __riscv_vluxseg8ei64_v_f16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f16m1_m(...) __riscv_vluxseg2ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f16m1_m(...) __riscv_vluxseg3ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f16m1_m(...) __riscv_vluxseg4ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f16m1_m(...) __riscv_vluxseg5ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f16m1_m(...) __riscv_vluxseg6ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f16m1_m(...) __riscv_vluxseg7ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f16m1_m(...) __riscv_vluxseg8ei64_v_f16m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f16m2_m(...) __riscv_vluxseg2ei64_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f16m2_m(...) __riscv_vluxseg3ei64_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f16m2_m(...) __riscv_vluxseg4ei64_v_f16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f32mf2_m(...) __riscv_vluxseg2ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f32mf2_m(...) __riscv_vluxseg3ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f32mf2_m(...) __riscv_vluxseg4ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f32mf2_m(...) __riscv_vluxseg5ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f32mf2_m(...) __riscv_vluxseg6ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f32mf2_m(...) __riscv_vluxseg7ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f32mf2_m(...) __riscv_vluxseg8ei8_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f32m1_m(...) __riscv_vluxseg2ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f32m1_m(...) __riscv_vluxseg3ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f32m1_m(...) __riscv_vluxseg4ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f32m1_m(...) __riscv_vluxseg5ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f32m1_m(...) __riscv_vluxseg6ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f32m1_m(...) __riscv_vluxseg7ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f32m1_m(...) __riscv_vluxseg8ei8_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f32m2_m(...) __riscv_vluxseg2ei8_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f32m2_m(...) __riscv_vluxseg3ei8_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f32m2_m(...) __riscv_vluxseg4ei8_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f32m4_m(...) __riscv_vluxseg2ei8_v_f32m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f32mf2_m(...) __riscv_vluxseg2ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f32mf2_m(...) __riscv_vluxseg3ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f32mf2_m(...) __riscv_vluxseg4ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f32mf2_m(...) __riscv_vluxseg5ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f32mf2_m(...) __riscv_vluxseg6ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f32mf2_m(...) __riscv_vluxseg7ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f32mf2_m(...) __riscv_vluxseg8ei16_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f32m1_m(...) __riscv_vluxseg2ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f32m1_m(...) __riscv_vluxseg3ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f32m1_m(...) __riscv_vluxseg4ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f32m1_m(...) __riscv_vluxseg5ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f32m1_m(...) __riscv_vluxseg6ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f32m1_m(...) __riscv_vluxseg7ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f32m1_m(...) __riscv_vluxseg8ei16_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f32m2_m(...) __riscv_vluxseg2ei16_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f32m2_m(...) __riscv_vluxseg3ei16_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f32m2_m(...) __riscv_vluxseg4ei16_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f32m4_m(...) __riscv_vluxseg2ei16_v_f32m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f32mf2_m(...) __riscv_vluxseg2ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f32mf2_m(...) __riscv_vluxseg3ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f32mf2_m(...) __riscv_vluxseg4ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f32mf2_m(...) __riscv_vluxseg5ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f32mf2_m(...) __riscv_vluxseg6ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f32mf2_m(...) __riscv_vluxseg7ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f32mf2_m(...) __riscv_vluxseg8ei32_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f32m1_m(...) __riscv_vluxseg2ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f32m1_m(...) __riscv_vluxseg3ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f32m1_m(...) __riscv_vluxseg4ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f32m1_m(...) __riscv_vluxseg5ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f32m1_m(...) __riscv_vluxseg6ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f32m1_m(...) __riscv_vluxseg7ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f32m1_m(...) __riscv_vluxseg8ei32_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f32m2_m(...) __riscv_vluxseg2ei32_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f32m2_m(...) __riscv_vluxseg3ei32_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f32m2_m(...) __riscv_vluxseg4ei32_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f32m4_m(...) __riscv_vluxseg2ei32_v_f32m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f32mf2_m(...) __riscv_vluxseg2ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f32mf2_m(...) __riscv_vluxseg3ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f32mf2_m(...) __riscv_vluxseg4ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f32mf2_m(...) __riscv_vluxseg5ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f32mf2_m(...) __riscv_vluxseg6ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f32mf2_m(...) __riscv_vluxseg7ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f32mf2_m(...) __riscv_vluxseg8ei64_v_f32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f32m1_m(...) __riscv_vluxseg2ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f32m1_m(...) __riscv_vluxseg3ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f32m1_m(...) __riscv_vluxseg4ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f32m1_m(...) __riscv_vluxseg5ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f32m1_m(...) __riscv_vluxseg6ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f32m1_m(...) __riscv_vluxseg7ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f32m1_m(...) __riscv_vluxseg8ei64_v_f32m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f32m2_m(...) __riscv_vluxseg2ei64_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f32m2_m(...) __riscv_vluxseg3ei64_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f32m2_m(...) __riscv_vluxseg4ei64_v_f32m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f32m4_m(...) __riscv_vluxseg2ei64_v_f32m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f64m1_m(...) __riscv_vluxseg2ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f64m1_m(...) __riscv_vluxseg3ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f64m1_m(...) __riscv_vluxseg4ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_f64m1_m(...) __riscv_vluxseg5ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_f64m1_m(...) __riscv_vluxseg6ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_f64m1_m(...) __riscv_vluxseg7ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_f64m1_m(...) __riscv_vluxseg8ei8_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f64m2_m(...) __riscv_vluxseg2ei8_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_f64m2_m(...) __riscv_vluxseg3ei8_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_f64m2_m(...) __riscv_vluxseg4ei8_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_f64m4_m(...) __riscv_vluxseg2ei8_v_f64m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f64m1_m(...) __riscv_vluxseg2ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f64m1_m(...) __riscv_vluxseg3ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f64m1_m(...) __riscv_vluxseg4ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_f64m1_m(...) __riscv_vluxseg5ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_f64m1_m(...) __riscv_vluxseg6ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_f64m1_m(...) __riscv_vluxseg7ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_f64m1_m(...) __riscv_vluxseg8ei16_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f64m2_m(...) __riscv_vluxseg2ei16_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_f64m2_m(...) __riscv_vluxseg3ei16_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_f64m2_m(...) __riscv_vluxseg4ei16_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_f64m4_m(...) __riscv_vluxseg2ei16_v_f64m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f64m1_m(...) __riscv_vluxseg2ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f64m1_m(...) __riscv_vluxseg3ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f64m1_m(...) __riscv_vluxseg4ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_f64m1_m(...) __riscv_vluxseg5ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_f64m1_m(...) __riscv_vluxseg6ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_f64m1_m(...) __riscv_vluxseg7ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_f64m1_m(...) __riscv_vluxseg8ei32_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f64m2_m(...) __riscv_vluxseg2ei32_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_f64m2_m(...) __riscv_vluxseg3ei32_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_f64m2_m(...) __riscv_vluxseg4ei32_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_f64m4_m(...) __riscv_vluxseg2ei32_v_f64m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f64m1_m(...) __riscv_vluxseg2ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f64m1_m(...) __riscv_vluxseg3ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f64m1_m(...) __riscv_vluxseg4ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_f64m1_m(...) __riscv_vluxseg5ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_f64m1_m(...) __riscv_vluxseg6ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_f64m1_m(...) __riscv_vluxseg7ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_f64m1_m(...) __riscv_vluxseg8ei64_v_f64m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f64m2_m(...) __riscv_vluxseg2ei64_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_f64m2_m(...) __riscv_vluxseg3ei64_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_f64m2_m(...) __riscv_vluxseg4ei64_v_f64m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_f64m4_m(...) __riscv_vluxseg2ei64_v_f64m4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf8_m(...) __riscv_vloxseg2ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf8_m(...) __riscv_vloxseg3ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf8_m(...) __riscv_vloxseg4ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf8_m(...) __riscv_vloxseg5ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf8_m(...) __riscv_vloxseg6ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf8_m(...) __riscv_vloxseg7ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf8_m(...) __riscv_vloxseg8ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf4_m(...) __riscv_vloxseg2ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf4_m(...) __riscv_vloxseg3ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf4_m(...) __riscv_vloxseg4ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf4_m(...) __riscv_vloxseg5ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf4_m(...) __riscv_vloxseg6ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf4_m(...) __riscv_vloxseg7ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf4_m(...) __riscv_vloxseg8ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8mf2_m(...) __riscv_vloxseg2ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i8mf2_m(...) __riscv_vloxseg3ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i8mf2_m(...) __riscv_vloxseg4ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i8mf2_m(...) __riscv_vloxseg5ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i8mf2_m(...) __riscv_vloxseg6ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i8mf2_m(...) __riscv_vloxseg7ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i8mf2_m(...) __riscv_vloxseg8ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8m1_m(...) __riscv_vloxseg2ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i8m1_m(...) __riscv_vloxseg3ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i8m1_m(...) __riscv_vloxseg4ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i8m1_m(...) __riscv_vloxseg5ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i8m1_m(...) __riscv_vloxseg6ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i8m1_m(...) __riscv_vloxseg7ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i8m1_m(...) __riscv_vloxseg8ei8_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8m2_m(...) __riscv_vloxseg2ei8_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i8m2_m(...) __riscv_vloxseg3ei8_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i8m2_m(...) __riscv_vloxseg4ei8_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i8m4_m(...) __riscv_vloxseg2ei8_v_i8m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf8_m(...) __riscv_vloxseg2ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf8_m(...) __riscv_vloxseg3ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf8_m(...) __riscv_vloxseg4ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf8_m(...) __riscv_vloxseg5ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf8_m(...) __riscv_vloxseg6ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf8_m(...) __riscv_vloxseg7ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf8_m(...) __riscv_vloxseg8ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf4_m(...) __riscv_vloxseg2ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf4_m(...) __riscv_vloxseg3ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf4_m(...) __riscv_vloxseg4ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf4_m(...) __riscv_vloxseg5ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf4_m(...) __riscv_vloxseg6ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf4_m(...) __riscv_vloxseg7ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf4_m(...) __riscv_vloxseg8ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8mf2_m(...) __riscv_vloxseg2ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i8mf2_m(...) __riscv_vloxseg3ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i8mf2_m(...) __riscv_vloxseg4ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i8mf2_m(...) __riscv_vloxseg5ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i8mf2_m(...) __riscv_vloxseg6ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i8mf2_m(...) __riscv_vloxseg7ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i8mf2_m(...) __riscv_vloxseg8ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8m1_m(...) __riscv_vloxseg2ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i8m1_m(...) __riscv_vloxseg3ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i8m1_m(...) __riscv_vloxseg4ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i8m1_m(...) __riscv_vloxseg5ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i8m1_m(...) __riscv_vloxseg6ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i8m1_m(...) __riscv_vloxseg7ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i8m1_m(...) __riscv_vloxseg8ei16_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8m2_m(...) __riscv_vloxseg2ei16_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i8m2_m(...) __riscv_vloxseg3ei16_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i8m2_m(...) __riscv_vloxseg4ei16_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i8m4_m(...) __riscv_vloxseg2ei16_v_i8m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf8_m(...) __riscv_vloxseg2ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf8_m(...) __riscv_vloxseg3ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf8_m(...) __riscv_vloxseg4ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf8_m(...) __riscv_vloxseg5ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf8_m(...) __riscv_vloxseg6ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf8_m(...) __riscv_vloxseg7ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf8_m(...) __riscv_vloxseg8ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf4_m(...) __riscv_vloxseg2ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf4_m(...) __riscv_vloxseg3ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf4_m(...) __riscv_vloxseg4ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf4_m(...) __riscv_vloxseg5ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf4_m(...) __riscv_vloxseg6ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf4_m(...) __riscv_vloxseg7ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf4_m(...) __riscv_vloxseg8ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i8mf2_m(...) __riscv_vloxseg2ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i8mf2_m(...) __riscv_vloxseg3ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i8mf2_m(...) __riscv_vloxseg4ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i8mf2_m(...) __riscv_vloxseg5ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i8mf2_m(...) __riscv_vloxseg6ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i8mf2_m(...) __riscv_vloxseg7ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i8mf2_m(...) __riscv_vloxseg8ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i8m1_m(...) __riscv_vloxseg2ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i8m1_m(...) __riscv_vloxseg3ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i8m1_m(...) __riscv_vloxseg4ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i8m1_m(...) __riscv_vloxseg5ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i8m1_m(...) __riscv_vloxseg6ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i8m1_m(...) __riscv_vloxseg7ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i8m1_m(...) __riscv_vloxseg8ei32_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i8m2_m(...) __riscv_vloxseg2ei32_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i8m2_m(...) __riscv_vloxseg3ei32_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i8m2_m(...) __riscv_vloxseg4ei32_v_i8m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf8_m(...) __riscv_vloxseg2ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf8_m(...) __riscv_vloxseg3ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf8_m(...) __riscv_vloxseg4ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf8_m(...) __riscv_vloxseg5ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf8_m(...) __riscv_vloxseg6ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf8_m(...) __riscv_vloxseg7ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf8_m(...) __riscv_vloxseg8ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf4_m(...) __riscv_vloxseg2ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf4_m(...) __riscv_vloxseg3ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf4_m(...) __riscv_vloxseg4ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf4_m(...) __riscv_vloxseg5ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf4_m(...) __riscv_vloxseg6ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf4_m(...) __riscv_vloxseg7ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf4_m(...) __riscv_vloxseg8ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i8mf2_m(...) __riscv_vloxseg2ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i8mf2_m(...) __riscv_vloxseg3ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i8mf2_m(...) __riscv_vloxseg4ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i8mf2_m(...) __riscv_vloxseg5ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i8mf2_m(...) __riscv_vloxseg6ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i8mf2_m(...) __riscv_vloxseg7ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i8mf2_m(...) __riscv_vloxseg8ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i8m1_m(...) __riscv_vloxseg2ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i8m1_m(...) __riscv_vloxseg3ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i8m1_m(...) __riscv_vloxseg4ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i8m1_m(...) __riscv_vloxseg5ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i8m1_m(...) __riscv_vloxseg6ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i8m1_m(...) __riscv_vloxseg7ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i8m1_m(...) __riscv_vloxseg8ei64_v_i8m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i16mf4_m(...) __riscv_vloxseg2ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i16mf4_m(...) __riscv_vloxseg3ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i16mf4_m(...) __riscv_vloxseg4ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i16mf4_m(...) __riscv_vloxseg5ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i16mf4_m(...) __riscv_vloxseg6ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i16mf4_m(...) __riscv_vloxseg7ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i16mf4_m(...) __riscv_vloxseg8ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i16mf2_m(...) __riscv_vloxseg2ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i16mf2_m(...) __riscv_vloxseg3ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i16mf2_m(...) __riscv_vloxseg4ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i16mf2_m(...) __riscv_vloxseg5ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i16mf2_m(...) __riscv_vloxseg6ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i16mf2_m(...) __riscv_vloxseg7ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i16mf2_m(...) __riscv_vloxseg8ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i16m1_m(...) __riscv_vloxseg2ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i16m1_m(...) __riscv_vloxseg3ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i16m1_m(...) __riscv_vloxseg4ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i16m1_m(...) __riscv_vloxseg5ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i16m1_m(...) __riscv_vloxseg6ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i16m1_m(...) __riscv_vloxseg7ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i16m1_m(...) __riscv_vloxseg8ei8_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i16m2_m(...) __riscv_vloxseg2ei8_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i16m2_m(...) __riscv_vloxseg3ei8_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i16m2_m(...) __riscv_vloxseg4ei8_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i16m4_m(...) __riscv_vloxseg2ei8_v_i16m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i16mf4_m(...) __riscv_vloxseg2ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i16mf4_m(...) __riscv_vloxseg3ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i16mf4_m(...) __riscv_vloxseg4ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i16mf4_m(...) __riscv_vloxseg5ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i16mf4_m(...) __riscv_vloxseg6ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i16mf4_m(...) __riscv_vloxseg7ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i16mf4_m(...) __riscv_vloxseg8ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i16mf2_m(...) __riscv_vloxseg2ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i16mf2_m(...) __riscv_vloxseg3ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i16mf2_m(...) __riscv_vloxseg4ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i16mf2_m(...) __riscv_vloxseg5ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i16mf2_m(...) __riscv_vloxseg6ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i16mf2_m(...) __riscv_vloxseg7ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i16mf2_m(...) __riscv_vloxseg8ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i16m1_m(...) __riscv_vloxseg2ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i16m1_m(...) __riscv_vloxseg3ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i16m1_m(...) __riscv_vloxseg4ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i16m1_m(...) __riscv_vloxseg5ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i16m1_m(...) __riscv_vloxseg6ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i16m1_m(...) __riscv_vloxseg7ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i16m1_m(...) __riscv_vloxseg8ei16_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i16m2_m(...) __riscv_vloxseg2ei16_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i16m2_m(...) __riscv_vloxseg3ei16_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i16m2_m(...) __riscv_vloxseg4ei16_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i16m4_m(...) __riscv_vloxseg2ei16_v_i16m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i16mf4_m(...) __riscv_vloxseg2ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i16mf4_m(...) __riscv_vloxseg3ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i16mf4_m(...) __riscv_vloxseg4ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i16mf4_m(...) __riscv_vloxseg5ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i16mf4_m(...) __riscv_vloxseg6ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i16mf4_m(...) __riscv_vloxseg7ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i16mf4_m(...) __riscv_vloxseg8ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i16mf2_m(...) __riscv_vloxseg2ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i16mf2_m(...) __riscv_vloxseg3ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i16mf2_m(...) __riscv_vloxseg4ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i16mf2_m(...) __riscv_vloxseg5ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i16mf2_m(...) __riscv_vloxseg6ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i16mf2_m(...) __riscv_vloxseg7ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i16mf2_m(...) __riscv_vloxseg8ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i16m1_m(...) __riscv_vloxseg2ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i16m1_m(...) __riscv_vloxseg3ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i16m1_m(...) __riscv_vloxseg4ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i16m1_m(...) __riscv_vloxseg5ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i16m1_m(...) __riscv_vloxseg6ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i16m1_m(...) __riscv_vloxseg7ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i16m1_m(...) __riscv_vloxseg8ei32_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i16m2_m(...) __riscv_vloxseg2ei32_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i16m2_m(...) __riscv_vloxseg3ei32_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i16m2_m(...) __riscv_vloxseg4ei32_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i16m4_m(...) __riscv_vloxseg2ei32_v_i16m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i16mf4_m(...) __riscv_vloxseg2ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i16mf4_m(...) __riscv_vloxseg3ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i16mf4_m(...) __riscv_vloxseg4ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i16mf4_m(...) __riscv_vloxseg5ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i16mf4_m(...) __riscv_vloxseg6ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i16mf4_m(...) __riscv_vloxseg7ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i16mf4_m(...) __riscv_vloxseg8ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i16mf2_m(...) __riscv_vloxseg2ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i16mf2_m(...) __riscv_vloxseg3ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i16mf2_m(...) __riscv_vloxseg4ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i16mf2_m(...) __riscv_vloxseg5ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i16mf2_m(...) __riscv_vloxseg6ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i16mf2_m(...) __riscv_vloxseg7ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i16mf2_m(...) __riscv_vloxseg8ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i16m1_m(...) __riscv_vloxseg2ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i16m1_m(...) __riscv_vloxseg3ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i16m1_m(...) __riscv_vloxseg4ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i16m1_m(...) __riscv_vloxseg5ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i16m1_m(...) __riscv_vloxseg6ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i16m1_m(...) __riscv_vloxseg7ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i16m1_m(...) __riscv_vloxseg8ei64_v_i16m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i16m2_m(...) __riscv_vloxseg2ei64_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i16m2_m(...) __riscv_vloxseg3ei64_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i16m2_m(...) __riscv_vloxseg4ei64_v_i16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i32mf2_m(...) __riscv_vloxseg2ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i32mf2_m(...) __riscv_vloxseg3ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i32mf2_m(...) __riscv_vloxseg4ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i32mf2_m(...) __riscv_vloxseg5ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i32mf2_m(...) __riscv_vloxseg6ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i32mf2_m(...) __riscv_vloxseg7ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i32mf2_m(...) __riscv_vloxseg8ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i32m1_m(...) __riscv_vloxseg2ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i32m1_m(...) __riscv_vloxseg3ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i32m1_m(...) __riscv_vloxseg4ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i32m1_m(...) __riscv_vloxseg5ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i32m1_m(...) __riscv_vloxseg6ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i32m1_m(...) __riscv_vloxseg7ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i32m1_m(...) __riscv_vloxseg8ei8_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i32m2_m(...) __riscv_vloxseg2ei8_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i32m2_m(...) __riscv_vloxseg3ei8_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i32m2_m(...) __riscv_vloxseg4ei8_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i32m4_m(...) __riscv_vloxseg2ei8_v_i32m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i32mf2_m(...) __riscv_vloxseg2ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i32mf2_m(...) __riscv_vloxseg3ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i32mf2_m(...) __riscv_vloxseg4ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i32mf2_m(...) __riscv_vloxseg5ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i32mf2_m(...) __riscv_vloxseg6ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i32mf2_m(...) __riscv_vloxseg7ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i32mf2_m(...) __riscv_vloxseg8ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i32m1_m(...) __riscv_vloxseg2ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i32m1_m(...) __riscv_vloxseg3ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i32m1_m(...) __riscv_vloxseg4ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i32m1_m(...) __riscv_vloxseg5ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i32m1_m(...) __riscv_vloxseg6ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i32m1_m(...) __riscv_vloxseg7ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i32m1_m(...) __riscv_vloxseg8ei16_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i32m2_m(...) __riscv_vloxseg2ei16_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i32m2_m(...) __riscv_vloxseg3ei16_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i32m2_m(...) __riscv_vloxseg4ei16_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i32m4_m(...) __riscv_vloxseg2ei16_v_i32m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i32mf2_m(...) __riscv_vloxseg2ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i32mf2_m(...) __riscv_vloxseg3ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i32mf2_m(...) __riscv_vloxseg4ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i32mf2_m(...) __riscv_vloxseg5ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i32mf2_m(...) __riscv_vloxseg6ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i32mf2_m(...) __riscv_vloxseg7ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i32mf2_m(...) __riscv_vloxseg8ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i32m1_m(...) __riscv_vloxseg2ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i32m1_m(...) __riscv_vloxseg3ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i32m1_m(...) __riscv_vloxseg4ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i32m1_m(...) __riscv_vloxseg5ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i32m1_m(...) __riscv_vloxseg6ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i32m1_m(...) __riscv_vloxseg7ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i32m1_m(...) __riscv_vloxseg8ei32_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i32m2_m(...) __riscv_vloxseg2ei32_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i32m2_m(...) __riscv_vloxseg3ei32_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i32m2_m(...) __riscv_vloxseg4ei32_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i32m4_m(...) __riscv_vloxseg2ei32_v_i32m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i32mf2_m(...) __riscv_vloxseg2ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i32mf2_m(...) __riscv_vloxseg3ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i32mf2_m(...) __riscv_vloxseg4ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i32mf2_m(...) __riscv_vloxseg5ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i32mf2_m(...) __riscv_vloxseg6ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i32mf2_m(...) __riscv_vloxseg7ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i32mf2_m(...) __riscv_vloxseg8ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i32m1_m(...) __riscv_vloxseg2ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i32m1_m(...) __riscv_vloxseg3ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i32m1_m(...) __riscv_vloxseg4ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i32m1_m(...) __riscv_vloxseg5ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i32m1_m(...) __riscv_vloxseg6ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i32m1_m(...) __riscv_vloxseg7ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i32m1_m(...) __riscv_vloxseg8ei64_v_i32m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i32m2_m(...) __riscv_vloxseg2ei64_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i32m2_m(...) __riscv_vloxseg3ei64_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i32m2_m(...) __riscv_vloxseg4ei64_v_i32m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i32m4_m(...) __riscv_vloxseg2ei64_v_i32m4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i64m1_m(...) __riscv_vloxseg2ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i64m1_m(...) __riscv_vloxseg3ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i64m1_m(...) __riscv_vloxseg4ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_i64m1_m(...) __riscv_vloxseg5ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_i64m1_m(...) __riscv_vloxseg6ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_i64m1_m(...) __riscv_vloxseg7ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_i64m1_m(...) __riscv_vloxseg8ei8_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i64m2_m(...) __riscv_vloxseg2ei8_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_i64m2_m(...) __riscv_vloxseg3ei8_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_i64m2_m(...) __riscv_vloxseg4ei8_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_i64m4_m(...) __riscv_vloxseg2ei8_v_i64m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i64m1_m(...) __riscv_vloxseg2ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i64m1_m(...) __riscv_vloxseg3ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i64m1_m(...) __riscv_vloxseg4ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_i64m1_m(...) __riscv_vloxseg5ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_i64m1_m(...) __riscv_vloxseg6ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_i64m1_m(...) __riscv_vloxseg7ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_i64m1_m(...) __riscv_vloxseg8ei16_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i64m2_m(...) __riscv_vloxseg2ei16_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_i64m2_m(...) __riscv_vloxseg3ei16_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_i64m2_m(...) __riscv_vloxseg4ei16_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_i64m4_m(...) __riscv_vloxseg2ei16_v_i64m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i64m1_m(...) __riscv_vloxseg2ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i64m1_m(...) __riscv_vloxseg3ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i64m1_m(...) __riscv_vloxseg4ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_i64m1_m(...) __riscv_vloxseg5ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_i64m1_m(...) __riscv_vloxseg6ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_i64m1_m(...) __riscv_vloxseg7ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_i64m1_m(...) __riscv_vloxseg8ei32_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i64m2_m(...) __riscv_vloxseg2ei32_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_i64m2_m(...) __riscv_vloxseg3ei32_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_i64m2_m(...) __riscv_vloxseg4ei32_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_i64m4_m(...) __riscv_vloxseg2ei32_v_i64m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i64m1_m(...) __riscv_vloxseg2ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i64m1_m(...) __riscv_vloxseg3ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i64m1_m(...) __riscv_vloxseg4ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_i64m1_m(...) __riscv_vloxseg5ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_i64m1_m(...) __riscv_vloxseg6ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_i64m1_m(...) __riscv_vloxseg7ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_i64m1_m(...) __riscv_vloxseg8ei64_v_i64m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i64m2_m(...) __riscv_vloxseg2ei64_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_i64m2_m(...) __riscv_vloxseg3ei64_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_i64m2_m(...) __riscv_vloxseg4ei64_v_i64m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_i64m4_m(...) __riscv_vloxseg2ei64_v_i64m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf8_m(...) __riscv_vluxseg2ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf8_m(...) __riscv_vluxseg3ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf8_m(...) __riscv_vluxseg4ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf8_m(...) __riscv_vluxseg5ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf8_m(...) __riscv_vluxseg6ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf8_m(...) __riscv_vluxseg7ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf8_m(...) __riscv_vluxseg8ei8_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf4_m(...) __riscv_vluxseg2ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf4_m(...) __riscv_vluxseg3ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf4_m(...) __riscv_vluxseg4ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf4_m(...) __riscv_vluxseg5ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf4_m(...) __riscv_vluxseg6ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf4_m(...) __riscv_vluxseg7ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf4_m(...) __riscv_vluxseg8ei8_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8mf2_m(...) __riscv_vluxseg2ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i8mf2_m(...) __riscv_vluxseg3ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i8mf2_m(...) __riscv_vluxseg4ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i8mf2_m(...) __riscv_vluxseg5ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i8mf2_m(...) __riscv_vluxseg6ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i8mf2_m(...) __riscv_vluxseg7ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i8mf2_m(...) __riscv_vluxseg8ei8_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8m1_m(...) __riscv_vluxseg2ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i8m1_m(...) __riscv_vluxseg3ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i8m1_m(...) __riscv_vluxseg4ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i8m1_m(...) __riscv_vluxseg5ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i8m1_m(...) __riscv_vluxseg6ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i8m1_m(...) __riscv_vluxseg7ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i8m1_m(...) __riscv_vluxseg8ei8_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8m2_m(...) __riscv_vluxseg2ei8_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i8m2_m(...) __riscv_vluxseg3ei8_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i8m2_m(...) __riscv_vluxseg4ei8_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i8m4_m(...) __riscv_vluxseg2ei8_v_i8m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf8_m(...) __riscv_vluxseg2ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf8_m(...) __riscv_vluxseg3ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf8_m(...) __riscv_vluxseg4ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf8_m(...) __riscv_vluxseg5ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf8_m(...) __riscv_vluxseg6ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf8_m(...) __riscv_vluxseg7ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf8_m(...) __riscv_vluxseg8ei16_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf4_m(...) __riscv_vluxseg2ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf4_m(...) __riscv_vluxseg3ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf4_m(...) __riscv_vluxseg4ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf4_m(...) __riscv_vluxseg5ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf4_m(...) __riscv_vluxseg6ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf4_m(...) __riscv_vluxseg7ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf4_m(...) __riscv_vluxseg8ei16_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8mf2_m(...) __riscv_vluxseg2ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i8mf2_m(...) __riscv_vluxseg3ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i8mf2_m(...) __riscv_vluxseg4ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i8mf2_m(...) __riscv_vluxseg5ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i8mf2_m(...) __riscv_vluxseg6ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i8mf2_m(...) __riscv_vluxseg7ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i8mf2_m(...) __riscv_vluxseg8ei16_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8m1_m(...) __riscv_vluxseg2ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i8m1_m(...) __riscv_vluxseg3ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i8m1_m(...) __riscv_vluxseg4ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i8m1_m(...) __riscv_vluxseg5ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i8m1_m(...) __riscv_vluxseg6ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i8m1_m(...) __riscv_vluxseg7ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i8m1_m(...) __riscv_vluxseg8ei16_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8m2_m(...) __riscv_vluxseg2ei16_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i8m2_m(...) __riscv_vluxseg3ei16_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i8m2_m(...) __riscv_vluxseg4ei16_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i8m4_m(...) __riscv_vluxseg2ei16_v_i8m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf8_m(...) __riscv_vluxseg2ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf8_m(...) __riscv_vluxseg3ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf8_m(...) __riscv_vluxseg4ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf8_m(...) __riscv_vluxseg5ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf8_m(...) __riscv_vluxseg6ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf8_m(...) __riscv_vluxseg7ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf8_m(...) __riscv_vluxseg8ei32_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf4_m(...) __riscv_vluxseg2ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf4_m(...) __riscv_vluxseg3ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf4_m(...) __riscv_vluxseg4ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf4_m(...) __riscv_vluxseg5ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf4_m(...) __riscv_vluxseg6ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf4_m(...) __riscv_vluxseg7ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf4_m(...) __riscv_vluxseg8ei32_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i8mf2_m(...) __riscv_vluxseg2ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i8mf2_m(...) __riscv_vluxseg3ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i8mf2_m(...) __riscv_vluxseg4ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i8mf2_m(...) __riscv_vluxseg5ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i8mf2_m(...) __riscv_vluxseg6ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i8mf2_m(...) __riscv_vluxseg7ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i8mf2_m(...) __riscv_vluxseg8ei32_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i8m1_m(...) __riscv_vluxseg2ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i8m1_m(...) __riscv_vluxseg3ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i8m1_m(...) __riscv_vluxseg4ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i8m1_m(...) __riscv_vluxseg5ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i8m1_m(...) __riscv_vluxseg6ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i8m1_m(...) __riscv_vluxseg7ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i8m1_m(...) __riscv_vluxseg8ei32_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i8m2_m(...) __riscv_vluxseg2ei32_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i8m2_m(...) __riscv_vluxseg3ei32_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i8m2_m(...) __riscv_vluxseg4ei32_v_i8m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf8_m(...) __riscv_vluxseg2ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf8_m(...) __riscv_vluxseg3ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf8_m(...) __riscv_vluxseg4ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf8_m(...) __riscv_vluxseg5ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf8_m(...) __riscv_vluxseg6ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf8_m(...) __riscv_vluxseg7ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf8_m(...) __riscv_vluxseg8ei64_v_i8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf4_m(...) __riscv_vluxseg2ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf4_m(...) __riscv_vluxseg3ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf4_m(...) __riscv_vluxseg4ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf4_m(...) __riscv_vluxseg5ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf4_m(...) __riscv_vluxseg6ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf4_m(...) __riscv_vluxseg7ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf4_m(...) __riscv_vluxseg8ei64_v_i8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i8mf2_m(...) __riscv_vluxseg2ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i8mf2_m(...) __riscv_vluxseg3ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i8mf2_m(...) __riscv_vluxseg4ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i8mf2_m(...) __riscv_vluxseg5ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i8mf2_m(...) __riscv_vluxseg6ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i8mf2_m(...) __riscv_vluxseg7ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i8mf2_m(...) __riscv_vluxseg8ei64_v_i8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i8m1_m(...) __riscv_vluxseg2ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i8m1_m(...) __riscv_vluxseg3ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i8m1_m(...) __riscv_vluxseg4ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i8m1_m(...) __riscv_vluxseg5ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i8m1_m(...) __riscv_vluxseg6ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i8m1_m(...) __riscv_vluxseg7ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i8m1_m(...) __riscv_vluxseg8ei64_v_i8m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i16mf4_m(...) __riscv_vluxseg2ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i16mf4_m(...) __riscv_vluxseg3ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i16mf4_m(...) __riscv_vluxseg4ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i16mf4_m(...) __riscv_vluxseg5ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i16mf4_m(...) __riscv_vluxseg6ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i16mf4_m(...) __riscv_vluxseg7ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i16mf4_m(...) __riscv_vluxseg8ei8_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i16mf2_m(...) __riscv_vluxseg2ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i16mf2_m(...) __riscv_vluxseg3ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i16mf2_m(...) __riscv_vluxseg4ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i16mf2_m(...) __riscv_vluxseg5ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i16mf2_m(...) __riscv_vluxseg6ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i16mf2_m(...) __riscv_vluxseg7ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i16mf2_m(...) __riscv_vluxseg8ei8_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i16m1_m(...) __riscv_vluxseg2ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i16m1_m(...) __riscv_vluxseg3ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i16m1_m(...) __riscv_vluxseg4ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i16m1_m(...) __riscv_vluxseg5ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i16m1_m(...) __riscv_vluxseg6ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i16m1_m(...) __riscv_vluxseg7ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i16m1_m(...) __riscv_vluxseg8ei8_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i16m2_m(...) __riscv_vluxseg2ei8_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i16m2_m(...) __riscv_vluxseg3ei8_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i16m2_m(...) __riscv_vluxseg4ei8_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i16m4_m(...) __riscv_vluxseg2ei8_v_i16m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i16mf4_m(...) __riscv_vluxseg2ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i16mf4_m(...) __riscv_vluxseg3ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i16mf4_m(...) __riscv_vluxseg4ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i16mf4_m(...) __riscv_vluxseg5ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i16mf4_m(...) __riscv_vluxseg6ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i16mf4_m(...) __riscv_vluxseg7ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i16mf4_m(...) __riscv_vluxseg8ei16_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i16mf2_m(...) __riscv_vluxseg2ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i16mf2_m(...) __riscv_vluxseg3ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i16mf2_m(...) __riscv_vluxseg4ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i16mf2_m(...) __riscv_vluxseg5ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i16mf2_m(...) __riscv_vluxseg6ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i16mf2_m(...) __riscv_vluxseg7ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i16mf2_m(...) __riscv_vluxseg8ei16_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i16m1_m(...) __riscv_vluxseg2ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i16m1_m(...) __riscv_vluxseg3ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i16m1_m(...) __riscv_vluxseg4ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i16m1_m(...) __riscv_vluxseg5ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i16m1_m(...) __riscv_vluxseg6ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i16m1_m(...) __riscv_vluxseg7ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i16m1_m(...) __riscv_vluxseg8ei16_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i16m2_m(...) __riscv_vluxseg2ei16_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i16m2_m(...) __riscv_vluxseg3ei16_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i16m2_m(...) __riscv_vluxseg4ei16_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i16m4_m(...) __riscv_vluxseg2ei16_v_i16m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i16mf4_m(...) __riscv_vluxseg2ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i16mf4_m(...) __riscv_vluxseg3ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i16mf4_m(...) __riscv_vluxseg4ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i16mf4_m(...) __riscv_vluxseg5ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i16mf4_m(...) __riscv_vluxseg6ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i16mf4_m(...) __riscv_vluxseg7ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i16mf4_m(...) __riscv_vluxseg8ei32_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i16mf2_m(...) __riscv_vluxseg2ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i16mf2_m(...) __riscv_vluxseg3ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i16mf2_m(...) __riscv_vluxseg4ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i16mf2_m(...) __riscv_vluxseg5ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i16mf2_m(...) __riscv_vluxseg6ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i16mf2_m(...) __riscv_vluxseg7ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i16mf2_m(...) __riscv_vluxseg8ei32_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i16m1_m(...) __riscv_vluxseg2ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i16m1_m(...) __riscv_vluxseg3ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i16m1_m(...) __riscv_vluxseg4ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i16m1_m(...) __riscv_vluxseg5ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i16m1_m(...) __riscv_vluxseg6ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i16m1_m(...) __riscv_vluxseg7ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i16m1_m(...) __riscv_vluxseg8ei32_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i16m2_m(...) __riscv_vluxseg2ei32_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i16m2_m(...) __riscv_vluxseg3ei32_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i16m2_m(...) __riscv_vluxseg4ei32_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i16m4_m(...) __riscv_vluxseg2ei32_v_i16m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i16mf4_m(...) __riscv_vluxseg2ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i16mf4_m(...) __riscv_vluxseg3ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i16mf4_m(...) __riscv_vluxseg4ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i16mf4_m(...) __riscv_vluxseg5ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i16mf4_m(...) __riscv_vluxseg6ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i16mf4_m(...) __riscv_vluxseg7ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i16mf4_m(...) __riscv_vluxseg8ei64_v_i16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i16mf2_m(...) __riscv_vluxseg2ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i16mf2_m(...) __riscv_vluxseg3ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i16mf2_m(...) __riscv_vluxseg4ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i16mf2_m(...) __riscv_vluxseg5ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i16mf2_m(...) __riscv_vluxseg6ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i16mf2_m(...) __riscv_vluxseg7ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i16mf2_m(...) __riscv_vluxseg8ei64_v_i16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i16m1_m(...) __riscv_vluxseg2ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i16m1_m(...) __riscv_vluxseg3ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i16m1_m(...) __riscv_vluxseg4ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i16m1_m(...) __riscv_vluxseg5ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i16m1_m(...) __riscv_vluxseg6ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i16m1_m(...) __riscv_vluxseg7ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i16m1_m(...) __riscv_vluxseg8ei64_v_i16m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i16m2_m(...) __riscv_vluxseg2ei64_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i16m2_m(...) __riscv_vluxseg3ei64_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i16m2_m(...) __riscv_vluxseg4ei64_v_i16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i32mf2_m(...) __riscv_vluxseg2ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i32mf2_m(...) __riscv_vluxseg3ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i32mf2_m(...) __riscv_vluxseg4ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i32mf2_m(...) __riscv_vluxseg5ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i32mf2_m(...) __riscv_vluxseg6ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i32mf2_m(...) __riscv_vluxseg7ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i32mf2_m(...) __riscv_vluxseg8ei8_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i32m1_m(...) __riscv_vluxseg2ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i32m1_m(...) __riscv_vluxseg3ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i32m1_m(...) __riscv_vluxseg4ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i32m1_m(...) __riscv_vluxseg5ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i32m1_m(...) __riscv_vluxseg6ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i32m1_m(...) __riscv_vluxseg7ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i32m1_m(...) __riscv_vluxseg8ei8_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i32m2_m(...) __riscv_vluxseg2ei8_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i32m2_m(...) __riscv_vluxseg3ei8_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i32m2_m(...) __riscv_vluxseg4ei8_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i32m4_m(...) __riscv_vluxseg2ei8_v_i32m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i32mf2_m(...) __riscv_vluxseg2ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i32mf2_m(...) __riscv_vluxseg3ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i32mf2_m(...) __riscv_vluxseg4ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i32mf2_m(...) __riscv_vluxseg5ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i32mf2_m(...) __riscv_vluxseg6ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i32mf2_m(...) __riscv_vluxseg7ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i32mf2_m(...) __riscv_vluxseg8ei16_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i32m1_m(...) __riscv_vluxseg2ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i32m1_m(...) __riscv_vluxseg3ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i32m1_m(...) __riscv_vluxseg4ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i32m1_m(...) __riscv_vluxseg5ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i32m1_m(...) __riscv_vluxseg6ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i32m1_m(...) __riscv_vluxseg7ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i32m1_m(...) __riscv_vluxseg8ei16_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i32m2_m(...) __riscv_vluxseg2ei16_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i32m2_m(...) __riscv_vluxseg3ei16_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i32m2_m(...) __riscv_vluxseg4ei16_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i32m4_m(...) __riscv_vluxseg2ei16_v_i32m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i32mf2_m(...) __riscv_vluxseg2ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i32mf2_m(...) __riscv_vluxseg3ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i32mf2_m(...) __riscv_vluxseg4ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i32mf2_m(...) __riscv_vluxseg5ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i32mf2_m(...) __riscv_vluxseg6ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i32mf2_m(...) __riscv_vluxseg7ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i32mf2_m(...) __riscv_vluxseg8ei32_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i32m1_m(...) __riscv_vluxseg2ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i32m1_m(...) __riscv_vluxseg3ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i32m1_m(...) __riscv_vluxseg4ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i32m1_m(...) __riscv_vluxseg5ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i32m1_m(...) __riscv_vluxseg6ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i32m1_m(...) __riscv_vluxseg7ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i32m1_m(...) __riscv_vluxseg8ei32_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i32m2_m(...) __riscv_vluxseg2ei32_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i32m2_m(...) __riscv_vluxseg3ei32_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i32m2_m(...) __riscv_vluxseg4ei32_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i32m4_m(...) __riscv_vluxseg2ei32_v_i32m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i32mf2_m(...) __riscv_vluxseg2ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i32mf2_m(...) __riscv_vluxseg3ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i32mf2_m(...) __riscv_vluxseg4ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i32mf2_m(...) __riscv_vluxseg5ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i32mf2_m(...) __riscv_vluxseg6ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i32mf2_m(...) __riscv_vluxseg7ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i32mf2_m(...) __riscv_vluxseg8ei64_v_i32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i32m1_m(...) __riscv_vluxseg2ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i32m1_m(...) __riscv_vluxseg3ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i32m1_m(...) __riscv_vluxseg4ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i32m1_m(...) __riscv_vluxseg5ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i32m1_m(...) __riscv_vluxseg6ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i32m1_m(...) __riscv_vluxseg7ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i32m1_m(...) __riscv_vluxseg8ei64_v_i32m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i32m2_m(...) __riscv_vluxseg2ei64_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i32m2_m(...) __riscv_vluxseg3ei64_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i32m2_m(...) __riscv_vluxseg4ei64_v_i32m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i32m4_m(...) __riscv_vluxseg2ei64_v_i32m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i64m1_m(...) __riscv_vluxseg2ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i64m1_m(...) __riscv_vluxseg3ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i64m1_m(...) __riscv_vluxseg4ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_i64m1_m(...) __riscv_vluxseg5ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_i64m1_m(...) __riscv_vluxseg6ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_i64m1_m(...) __riscv_vluxseg7ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_i64m1_m(...) __riscv_vluxseg8ei8_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i64m2_m(...) __riscv_vluxseg2ei8_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_i64m2_m(...) __riscv_vluxseg3ei8_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_i64m2_m(...) __riscv_vluxseg4ei8_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_i64m4_m(...) __riscv_vluxseg2ei8_v_i64m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i64m1_m(...) __riscv_vluxseg2ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i64m1_m(...) __riscv_vluxseg3ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i64m1_m(...) __riscv_vluxseg4ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_i64m1_m(...) __riscv_vluxseg5ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_i64m1_m(...) __riscv_vluxseg6ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_i64m1_m(...) __riscv_vluxseg7ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_i64m1_m(...) __riscv_vluxseg8ei16_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i64m2_m(...) __riscv_vluxseg2ei16_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_i64m2_m(...) __riscv_vluxseg3ei16_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_i64m2_m(...) __riscv_vluxseg4ei16_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_i64m4_m(...) __riscv_vluxseg2ei16_v_i64m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i64m1_m(...) __riscv_vluxseg2ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i64m1_m(...) __riscv_vluxseg3ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i64m1_m(...) __riscv_vluxseg4ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_i64m1_m(...) __riscv_vluxseg5ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_i64m1_m(...) __riscv_vluxseg6ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_i64m1_m(...) __riscv_vluxseg7ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_i64m1_m(...) __riscv_vluxseg8ei32_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i64m2_m(...) __riscv_vluxseg2ei32_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_i64m2_m(...) __riscv_vluxseg3ei32_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_i64m2_m(...) __riscv_vluxseg4ei32_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_i64m4_m(...) __riscv_vluxseg2ei32_v_i64m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i64m1_m(...) __riscv_vluxseg2ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i64m1_m(...) __riscv_vluxseg3ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i64m1_m(...) __riscv_vluxseg4ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_i64m1_m(...) __riscv_vluxseg5ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_i64m1_m(...) __riscv_vluxseg6ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_i64m1_m(...) __riscv_vluxseg7ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_i64m1_m(...) __riscv_vluxseg8ei64_v_i64m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i64m2_m(...) __riscv_vluxseg2ei64_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_i64m2_m(...) __riscv_vluxseg3ei64_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_i64m2_m(...) __riscv_vluxseg4ei64_v_i64m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_i64m4_m(...) __riscv_vluxseg2ei64_v_i64m4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf8_m(...) __riscv_vloxseg2ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf8_m(...) __riscv_vloxseg3ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf8_m(...) __riscv_vloxseg4ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf8_m(...) __riscv_vloxseg5ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf8_m(...) __riscv_vloxseg6ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf8_m(...) __riscv_vloxseg7ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf8_m(...) __riscv_vloxseg8ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf4_m(...) __riscv_vloxseg2ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf4_m(...) __riscv_vloxseg3ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf4_m(...) __riscv_vloxseg4ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf4_m(...) __riscv_vloxseg5ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf4_m(...) __riscv_vloxseg6ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf4_m(...) __riscv_vloxseg7ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf4_m(...) __riscv_vloxseg8ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8mf2_m(...) __riscv_vloxseg2ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u8mf2_m(...) __riscv_vloxseg3ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u8mf2_m(...) __riscv_vloxseg4ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u8mf2_m(...) __riscv_vloxseg5ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u8mf2_m(...) __riscv_vloxseg6ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u8mf2_m(...) __riscv_vloxseg7ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u8mf2_m(...) __riscv_vloxseg8ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8m1_m(...) __riscv_vloxseg2ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u8m1_m(...) __riscv_vloxseg3ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u8m1_m(...) __riscv_vloxseg4ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u8m1_m(...) __riscv_vloxseg5ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u8m1_m(...) __riscv_vloxseg6ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u8m1_m(...) __riscv_vloxseg7ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u8m1_m(...) __riscv_vloxseg8ei8_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8m2_m(...) __riscv_vloxseg2ei8_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u8m2_m(...) __riscv_vloxseg3ei8_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u8m2_m(...) __riscv_vloxseg4ei8_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u8m4_m(...) __riscv_vloxseg2ei8_v_u8m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf8_m(...) __riscv_vloxseg2ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf8_m(...) __riscv_vloxseg3ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf8_m(...) __riscv_vloxseg4ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf8_m(...) __riscv_vloxseg5ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf8_m(...) __riscv_vloxseg6ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf8_m(...) __riscv_vloxseg7ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf8_m(...) __riscv_vloxseg8ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf4_m(...) __riscv_vloxseg2ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf4_m(...) __riscv_vloxseg3ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf4_m(...) __riscv_vloxseg4ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf4_m(...) __riscv_vloxseg5ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf4_m(...) __riscv_vloxseg6ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf4_m(...) __riscv_vloxseg7ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf4_m(...) __riscv_vloxseg8ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8mf2_m(...) __riscv_vloxseg2ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u8mf2_m(...) __riscv_vloxseg3ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u8mf2_m(...) __riscv_vloxseg4ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u8mf2_m(...) __riscv_vloxseg5ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u8mf2_m(...) __riscv_vloxseg6ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u8mf2_m(...) __riscv_vloxseg7ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u8mf2_m(...) __riscv_vloxseg8ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8m1_m(...) __riscv_vloxseg2ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u8m1_m(...) __riscv_vloxseg3ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u8m1_m(...) __riscv_vloxseg4ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u8m1_m(...) __riscv_vloxseg5ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u8m1_m(...) __riscv_vloxseg6ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u8m1_m(...) __riscv_vloxseg7ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u8m1_m(...) __riscv_vloxseg8ei16_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8m2_m(...) __riscv_vloxseg2ei16_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u8m2_m(...) __riscv_vloxseg3ei16_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u8m2_m(...) __riscv_vloxseg4ei16_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u8m4_m(...) __riscv_vloxseg2ei16_v_u8m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf8_m(...) __riscv_vloxseg2ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf8_m(...) __riscv_vloxseg3ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf8_m(...) __riscv_vloxseg4ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf8_m(...) __riscv_vloxseg5ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf8_m(...) __riscv_vloxseg6ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf8_m(...) __riscv_vloxseg7ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf8_m(...) __riscv_vloxseg8ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf4_m(...) __riscv_vloxseg2ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf4_m(...) __riscv_vloxseg3ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf4_m(...) __riscv_vloxseg4ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf4_m(...) __riscv_vloxseg5ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf4_m(...) __riscv_vloxseg6ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf4_m(...) __riscv_vloxseg7ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf4_m(...) __riscv_vloxseg8ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u8mf2_m(...) __riscv_vloxseg2ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u8mf2_m(...) __riscv_vloxseg3ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u8mf2_m(...) __riscv_vloxseg4ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u8mf2_m(...) __riscv_vloxseg5ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u8mf2_m(...) __riscv_vloxseg6ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u8mf2_m(...) __riscv_vloxseg7ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u8mf2_m(...) __riscv_vloxseg8ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u8m1_m(...) __riscv_vloxseg2ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u8m1_m(...) __riscv_vloxseg3ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u8m1_m(...) __riscv_vloxseg4ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u8m1_m(...) __riscv_vloxseg5ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u8m1_m(...) __riscv_vloxseg6ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u8m1_m(...) __riscv_vloxseg7ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u8m1_m(...) __riscv_vloxseg8ei32_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u8m2_m(...) __riscv_vloxseg2ei32_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u8m2_m(...) __riscv_vloxseg3ei32_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u8m2_m(...) __riscv_vloxseg4ei32_v_u8m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf8_m(...) __riscv_vloxseg2ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf8_m(...) __riscv_vloxseg3ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf8_m(...) __riscv_vloxseg4ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf8_m(...) __riscv_vloxseg5ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf8_m(...) __riscv_vloxseg6ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf8_m(...) __riscv_vloxseg7ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf8_m(...) __riscv_vloxseg8ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf4_m(...) __riscv_vloxseg2ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf4_m(...) __riscv_vloxseg3ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf4_m(...) __riscv_vloxseg4ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf4_m(...) __riscv_vloxseg5ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf4_m(...) __riscv_vloxseg6ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf4_m(...) __riscv_vloxseg7ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf4_m(...) __riscv_vloxseg8ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u8mf2_m(...) __riscv_vloxseg2ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u8mf2_m(...) __riscv_vloxseg3ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u8mf2_m(...) __riscv_vloxseg4ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u8mf2_m(...) __riscv_vloxseg5ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u8mf2_m(...) __riscv_vloxseg6ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u8mf2_m(...) __riscv_vloxseg7ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u8mf2_m(...) __riscv_vloxseg8ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u8m1_m(...) __riscv_vloxseg2ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u8m1_m(...) __riscv_vloxseg3ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u8m1_m(...) __riscv_vloxseg4ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u8m1_m(...) __riscv_vloxseg5ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u8m1_m(...) __riscv_vloxseg6ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u8m1_m(...) __riscv_vloxseg7ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u8m1_m(...) __riscv_vloxseg8ei64_v_u8m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u16mf4_m(...) __riscv_vloxseg2ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u16mf4_m(...) __riscv_vloxseg3ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u16mf4_m(...) __riscv_vloxseg4ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u16mf4_m(...) __riscv_vloxseg5ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u16mf4_m(...) __riscv_vloxseg6ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u16mf4_m(...) __riscv_vloxseg7ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u16mf4_m(...) __riscv_vloxseg8ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u16mf2_m(...) __riscv_vloxseg2ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u16mf2_m(...) __riscv_vloxseg3ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u16mf2_m(...) __riscv_vloxseg4ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u16mf2_m(...) __riscv_vloxseg5ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u16mf2_m(...) __riscv_vloxseg6ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u16mf2_m(...) __riscv_vloxseg7ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u16mf2_m(...) __riscv_vloxseg8ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u16m1_m(...) __riscv_vloxseg2ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u16m1_m(...) __riscv_vloxseg3ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u16m1_m(...) __riscv_vloxseg4ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u16m1_m(...) __riscv_vloxseg5ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u16m1_m(...) __riscv_vloxseg6ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u16m1_m(...) __riscv_vloxseg7ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u16m1_m(...) __riscv_vloxseg8ei8_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u16m2_m(...) __riscv_vloxseg2ei8_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u16m2_m(...) __riscv_vloxseg3ei8_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u16m2_m(...) __riscv_vloxseg4ei8_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u16m4_m(...) __riscv_vloxseg2ei8_v_u16m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u16mf4_m(...) __riscv_vloxseg2ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u16mf4_m(...) __riscv_vloxseg3ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u16mf4_m(...) __riscv_vloxseg4ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u16mf4_m(...) __riscv_vloxseg5ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u16mf4_m(...) __riscv_vloxseg6ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u16mf4_m(...) __riscv_vloxseg7ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u16mf4_m(...) __riscv_vloxseg8ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u16mf2_m(...) __riscv_vloxseg2ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u16mf2_m(...) __riscv_vloxseg3ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u16mf2_m(...) __riscv_vloxseg4ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u16mf2_m(...) __riscv_vloxseg5ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u16mf2_m(...) __riscv_vloxseg6ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u16mf2_m(...) __riscv_vloxseg7ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u16mf2_m(...) __riscv_vloxseg8ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u16m1_m(...) __riscv_vloxseg2ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u16m1_m(...) __riscv_vloxseg3ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u16m1_m(...) __riscv_vloxseg4ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u16m1_m(...) __riscv_vloxseg5ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u16m1_m(...) __riscv_vloxseg6ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u16m1_m(...) __riscv_vloxseg7ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u16m1_m(...) __riscv_vloxseg8ei16_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u16m2_m(...) __riscv_vloxseg2ei16_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u16m2_m(...) __riscv_vloxseg3ei16_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u16m2_m(...) __riscv_vloxseg4ei16_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u16m4_m(...) __riscv_vloxseg2ei16_v_u16m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u16mf4_m(...) __riscv_vloxseg2ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u16mf4_m(...) __riscv_vloxseg3ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u16mf4_m(...) __riscv_vloxseg4ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u16mf4_m(...) __riscv_vloxseg5ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u16mf4_m(...) __riscv_vloxseg6ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u16mf4_m(...) __riscv_vloxseg7ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u16mf4_m(...) __riscv_vloxseg8ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u16mf2_m(...) __riscv_vloxseg2ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u16mf2_m(...) __riscv_vloxseg3ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u16mf2_m(...) __riscv_vloxseg4ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u16mf2_m(...) __riscv_vloxseg5ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u16mf2_m(...) __riscv_vloxseg6ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u16mf2_m(...) __riscv_vloxseg7ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u16mf2_m(...) __riscv_vloxseg8ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u16m1_m(...) __riscv_vloxseg2ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u16m1_m(...) __riscv_vloxseg3ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u16m1_m(...) __riscv_vloxseg4ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u16m1_m(...) __riscv_vloxseg5ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u16m1_m(...) __riscv_vloxseg6ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u16m1_m(...) __riscv_vloxseg7ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u16m1_m(...) __riscv_vloxseg8ei32_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u16m2_m(...) __riscv_vloxseg2ei32_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u16m2_m(...) __riscv_vloxseg3ei32_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u16m2_m(...) __riscv_vloxseg4ei32_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u16m4_m(...) __riscv_vloxseg2ei32_v_u16m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u16mf4_m(...) __riscv_vloxseg2ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u16mf4_m(...) __riscv_vloxseg3ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u16mf4_m(...) __riscv_vloxseg4ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u16mf4_m(...) __riscv_vloxseg5ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u16mf4_m(...) __riscv_vloxseg6ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u16mf4_m(...) __riscv_vloxseg7ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u16mf4_m(...) __riscv_vloxseg8ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u16mf2_m(...) __riscv_vloxseg2ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u16mf2_m(...) __riscv_vloxseg3ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u16mf2_m(...) __riscv_vloxseg4ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u16mf2_m(...) __riscv_vloxseg5ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u16mf2_m(...) __riscv_vloxseg6ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u16mf2_m(...) __riscv_vloxseg7ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u16mf2_m(...) __riscv_vloxseg8ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u16m1_m(...) __riscv_vloxseg2ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u16m1_m(...) __riscv_vloxseg3ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u16m1_m(...) __riscv_vloxseg4ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u16m1_m(...) __riscv_vloxseg5ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u16m1_m(...) __riscv_vloxseg6ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u16m1_m(...) __riscv_vloxseg7ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u16m1_m(...) __riscv_vloxseg8ei64_v_u16m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u16m2_m(...) __riscv_vloxseg2ei64_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u16m2_m(...) __riscv_vloxseg3ei64_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u16m2_m(...) __riscv_vloxseg4ei64_v_u16m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u32mf2_m(...) __riscv_vloxseg2ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u32mf2_m(...) __riscv_vloxseg3ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u32mf2_m(...) __riscv_vloxseg4ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u32mf2_m(...) __riscv_vloxseg5ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u32mf2_m(...) __riscv_vloxseg6ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u32mf2_m(...) __riscv_vloxseg7ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u32mf2_m(...) __riscv_vloxseg8ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u32m1_m(...) __riscv_vloxseg2ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u32m1_m(...) __riscv_vloxseg3ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u32m1_m(...) __riscv_vloxseg4ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u32m1_m(...) __riscv_vloxseg5ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u32m1_m(...) __riscv_vloxseg6ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u32m1_m(...) __riscv_vloxseg7ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u32m1_m(...) __riscv_vloxseg8ei8_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u32m2_m(...) __riscv_vloxseg2ei8_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u32m2_m(...) __riscv_vloxseg3ei8_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u32m2_m(...) __riscv_vloxseg4ei8_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u32m4_m(...) __riscv_vloxseg2ei8_v_u32m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u32mf2_m(...) __riscv_vloxseg2ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u32mf2_m(...) __riscv_vloxseg3ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u32mf2_m(...) __riscv_vloxseg4ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u32mf2_m(...) __riscv_vloxseg5ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u32mf2_m(...) __riscv_vloxseg6ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u32mf2_m(...) __riscv_vloxseg7ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u32mf2_m(...) __riscv_vloxseg8ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u32m1_m(...) __riscv_vloxseg2ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u32m1_m(...) __riscv_vloxseg3ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u32m1_m(...) __riscv_vloxseg4ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u32m1_m(...) __riscv_vloxseg5ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u32m1_m(...) __riscv_vloxseg6ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u32m1_m(...) __riscv_vloxseg7ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u32m1_m(...) __riscv_vloxseg8ei16_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u32m2_m(...) __riscv_vloxseg2ei16_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u32m2_m(...) __riscv_vloxseg3ei16_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u32m2_m(...) __riscv_vloxseg4ei16_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u32m4_m(...) __riscv_vloxseg2ei16_v_u32m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u32mf2_m(...) __riscv_vloxseg2ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u32mf2_m(...) __riscv_vloxseg3ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u32mf2_m(...) __riscv_vloxseg4ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u32mf2_m(...) __riscv_vloxseg5ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u32mf2_m(...) __riscv_vloxseg6ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u32mf2_m(...) __riscv_vloxseg7ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u32mf2_m(...) __riscv_vloxseg8ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u32m1_m(...) __riscv_vloxseg2ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u32m1_m(...) __riscv_vloxseg3ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u32m1_m(...) __riscv_vloxseg4ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u32m1_m(...) __riscv_vloxseg5ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u32m1_m(...) __riscv_vloxseg6ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u32m1_m(...) __riscv_vloxseg7ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u32m1_m(...) __riscv_vloxseg8ei32_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u32m2_m(...) __riscv_vloxseg2ei32_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u32m2_m(...) __riscv_vloxseg3ei32_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u32m2_m(...) __riscv_vloxseg4ei32_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u32m4_m(...) __riscv_vloxseg2ei32_v_u32m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u32mf2_m(...) __riscv_vloxseg2ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u32mf2_m(...) __riscv_vloxseg3ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u32mf2_m(...) __riscv_vloxseg4ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u32mf2_m(...) __riscv_vloxseg5ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u32mf2_m(...) __riscv_vloxseg6ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u32mf2_m(...) __riscv_vloxseg7ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u32mf2_m(...) __riscv_vloxseg8ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u32m1_m(...) __riscv_vloxseg2ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u32m1_m(...) __riscv_vloxseg3ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u32m1_m(...) __riscv_vloxseg4ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u32m1_m(...) __riscv_vloxseg5ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u32m1_m(...) __riscv_vloxseg6ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u32m1_m(...) __riscv_vloxseg7ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u32m1_m(...) __riscv_vloxseg8ei64_v_u32m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u32m2_m(...) __riscv_vloxseg2ei64_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u32m2_m(...) __riscv_vloxseg3ei64_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u32m2_m(...) __riscv_vloxseg4ei64_v_u32m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u32m4_m(...) __riscv_vloxseg2ei64_v_u32m4_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u64m1_m(...) __riscv_vloxseg2ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u64m1_m(...) __riscv_vloxseg3ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u64m1_m(...) __riscv_vloxseg4ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg5ei8_v_u64m1_m(...) __riscv_vloxseg5ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg6ei8_v_u64m1_m(...) __riscv_vloxseg6ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg7ei8_v_u64m1_m(...) __riscv_vloxseg7ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg8ei8_v_u64m1_m(...) __riscv_vloxseg8ei8_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u64m2_m(...) __riscv_vloxseg2ei8_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg3ei8_v_u64m2_m(...) __riscv_vloxseg3ei8_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg4ei8_v_u64m2_m(...) __riscv_vloxseg4ei8_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg2ei8_v_u64m4_m(...) __riscv_vloxseg2ei8_v_u64m4_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u64m1_m(...) __riscv_vloxseg2ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u64m1_m(...) __riscv_vloxseg3ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u64m1_m(...) __riscv_vloxseg4ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg5ei16_v_u64m1_m(...) __riscv_vloxseg5ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg6ei16_v_u64m1_m(...) __riscv_vloxseg6ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg7ei16_v_u64m1_m(...) __riscv_vloxseg7ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg8ei16_v_u64m1_m(...) __riscv_vloxseg8ei16_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u64m2_m(...) __riscv_vloxseg2ei16_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg3ei16_v_u64m2_m(...) __riscv_vloxseg3ei16_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg4ei16_v_u64m2_m(...) __riscv_vloxseg4ei16_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg2ei16_v_u64m4_m(...) __riscv_vloxseg2ei16_v_u64m4_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u64m1_m(...) __riscv_vloxseg2ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u64m1_m(...) __riscv_vloxseg3ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u64m1_m(...) __riscv_vloxseg4ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg5ei32_v_u64m1_m(...) __riscv_vloxseg5ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg6ei32_v_u64m1_m(...) __riscv_vloxseg6ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg7ei32_v_u64m1_m(...) __riscv_vloxseg7ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg8ei32_v_u64m1_m(...) __riscv_vloxseg8ei32_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u64m2_m(...) __riscv_vloxseg2ei32_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg3ei32_v_u64m2_m(...) __riscv_vloxseg3ei32_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg4ei32_v_u64m2_m(...) __riscv_vloxseg4ei32_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg2ei32_v_u64m4_m(...) __riscv_vloxseg2ei32_v_u64m4_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u64m1_m(...) __riscv_vloxseg2ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u64m1_m(...) __riscv_vloxseg3ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u64m1_m(...) __riscv_vloxseg4ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg5ei64_v_u64m1_m(...) __riscv_vloxseg5ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg6ei64_v_u64m1_m(...) __riscv_vloxseg6ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg7ei64_v_u64m1_m(...) __riscv_vloxseg7ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg8ei64_v_u64m1_m(...) __riscv_vloxseg8ei64_v_u64m1_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u64m2_m(...) __riscv_vloxseg2ei64_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg3ei64_v_u64m2_m(...) __riscv_vloxseg3ei64_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg4ei64_v_u64m2_m(...) __riscv_vloxseg4ei64_v_u64m2_tumu(__VA_ARGS__) +#define vloxseg2ei64_v_u64m4_m(...) __riscv_vloxseg2ei64_v_u64m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf8_m(...) __riscv_vluxseg2ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf8_m(...) __riscv_vluxseg3ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf8_m(...) __riscv_vluxseg4ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf8_m(...) __riscv_vluxseg5ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf8_m(...) __riscv_vluxseg6ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf8_m(...) __riscv_vluxseg7ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf8_m(...) __riscv_vluxseg8ei8_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf4_m(...) __riscv_vluxseg2ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf4_m(...) __riscv_vluxseg3ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf4_m(...) __riscv_vluxseg4ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf4_m(...) __riscv_vluxseg5ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf4_m(...) __riscv_vluxseg6ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf4_m(...) __riscv_vluxseg7ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf4_m(...) __riscv_vluxseg8ei8_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8mf2_m(...) __riscv_vluxseg2ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u8mf2_m(...) __riscv_vluxseg3ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u8mf2_m(...) __riscv_vluxseg4ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u8mf2_m(...) __riscv_vluxseg5ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u8mf2_m(...) __riscv_vluxseg6ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u8mf2_m(...) __riscv_vluxseg7ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u8mf2_m(...) __riscv_vluxseg8ei8_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8m1_m(...) __riscv_vluxseg2ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u8m1_m(...) __riscv_vluxseg3ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u8m1_m(...) __riscv_vluxseg4ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u8m1_m(...) __riscv_vluxseg5ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u8m1_m(...) __riscv_vluxseg6ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u8m1_m(...) __riscv_vluxseg7ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u8m1_m(...) __riscv_vluxseg8ei8_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8m2_m(...) __riscv_vluxseg2ei8_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u8m2_m(...) __riscv_vluxseg3ei8_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u8m2_m(...) __riscv_vluxseg4ei8_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u8m4_m(...) __riscv_vluxseg2ei8_v_u8m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf8_m(...) __riscv_vluxseg2ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf8_m(...) __riscv_vluxseg3ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf8_m(...) __riscv_vluxseg4ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf8_m(...) __riscv_vluxseg5ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf8_m(...) __riscv_vluxseg6ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf8_m(...) __riscv_vluxseg7ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf8_m(...) __riscv_vluxseg8ei16_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf4_m(...) __riscv_vluxseg2ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf4_m(...) __riscv_vluxseg3ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf4_m(...) __riscv_vluxseg4ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf4_m(...) __riscv_vluxseg5ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf4_m(...) __riscv_vluxseg6ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf4_m(...) __riscv_vluxseg7ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf4_m(...) __riscv_vluxseg8ei16_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8mf2_m(...) __riscv_vluxseg2ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u8mf2_m(...) __riscv_vluxseg3ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u8mf2_m(...) __riscv_vluxseg4ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u8mf2_m(...) __riscv_vluxseg5ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u8mf2_m(...) __riscv_vluxseg6ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u8mf2_m(...) __riscv_vluxseg7ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u8mf2_m(...) __riscv_vluxseg8ei16_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8m1_m(...) __riscv_vluxseg2ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u8m1_m(...) __riscv_vluxseg3ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u8m1_m(...) __riscv_vluxseg4ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u8m1_m(...) __riscv_vluxseg5ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u8m1_m(...) __riscv_vluxseg6ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u8m1_m(...) __riscv_vluxseg7ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u8m1_m(...) __riscv_vluxseg8ei16_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8m2_m(...) __riscv_vluxseg2ei16_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u8m2_m(...) __riscv_vluxseg3ei16_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u8m2_m(...) __riscv_vluxseg4ei16_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u8m4_m(...) __riscv_vluxseg2ei16_v_u8m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf8_m(...) __riscv_vluxseg2ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf8_m(...) __riscv_vluxseg3ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf8_m(...) __riscv_vluxseg4ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf8_m(...) __riscv_vluxseg5ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf8_m(...) __riscv_vluxseg6ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf8_m(...) __riscv_vluxseg7ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf8_m(...) __riscv_vluxseg8ei32_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf4_m(...) __riscv_vluxseg2ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf4_m(...) __riscv_vluxseg3ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf4_m(...) __riscv_vluxseg4ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf4_m(...) __riscv_vluxseg5ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf4_m(...) __riscv_vluxseg6ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf4_m(...) __riscv_vluxseg7ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf4_m(...) __riscv_vluxseg8ei32_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u8mf2_m(...) __riscv_vluxseg2ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u8mf2_m(...) __riscv_vluxseg3ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u8mf2_m(...) __riscv_vluxseg4ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u8mf2_m(...) __riscv_vluxseg5ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u8mf2_m(...) __riscv_vluxseg6ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u8mf2_m(...) __riscv_vluxseg7ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u8mf2_m(...) __riscv_vluxseg8ei32_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u8m1_m(...) __riscv_vluxseg2ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u8m1_m(...) __riscv_vluxseg3ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u8m1_m(...) __riscv_vluxseg4ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u8m1_m(...) __riscv_vluxseg5ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u8m1_m(...) __riscv_vluxseg6ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u8m1_m(...) __riscv_vluxseg7ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u8m1_m(...) __riscv_vluxseg8ei32_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u8m2_m(...) __riscv_vluxseg2ei32_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u8m2_m(...) __riscv_vluxseg3ei32_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u8m2_m(...) __riscv_vluxseg4ei32_v_u8m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf8_m(...) __riscv_vluxseg2ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf8_m(...) __riscv_vluxseg3ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf8_m(...) __riscv_vluxseg4ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf8_m(...) __riscv_vluxseg5ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf8_m(...) __riscv_vluxseg6ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf8_m(...) __riscv_vluxseg7ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf8_m(...) __riscv_vluxseg8ei64_v_u8mf8_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf4_m(...) __riscv_vluxseg2ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf4_m(...) __riscv_vluxseg3ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf4_m(...) __riscv_vluxseg4ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf4_m(...) __riscv_vluxseg5ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf4_m(...) __riscv_vluxseg6ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf4_m(...) __riscv_vluxseg7ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf4_m(...) __riscv_vluxseg8ei64_v_u8mf4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u8mf2_m(...) __riscv_vluxseg2ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u8mf2_m(...) __riscv_vluxseg3ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u8mf2_m(...) __riscv_vluxseg4ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u8mf2_m(...) __riscv_vluxseg5ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u8mf2_m(...) __riscv_vluxseg6ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u8mf2_m(...) __riscv_vluxseg7ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u8mf2_m(...) __riscv_vluxseg8ei64_v_u8mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u8m1_m(...) __riscv_vluxseg2ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u8m1_m(...) __riscv_vluxseg3ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u8m1_m(...) __riscv_vluxseg4ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u8m1_m(...) __riscv_vluxseg5ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u8m1_m(...) __riscv_vluxseg6ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u8m1_m(...) __riscv_vluxseg7ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u8m1_m(...) __riscv_vluxseg8ei64_v_u8m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u16mf4_m(...) __riscv_vluxseg2ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u16mf4_m(...) __riscv_vluxseg3ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u16mf4_m(...) __riscv_vluxseg4ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u16mf4_m(...) __riscv_vluxseg5ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u16mf4_m(...) __riscv_vluxseg6ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u16mf4_m(...) __riscv_vluxseg7ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u16mf4_m(...) __riscv_vluxseg8ei8_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u16mf2_m(...) __riscv_vluxseg2ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u16mf2_m(...) __riscv_vluxseg3ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u16mf2_m(...) __riscv_vluxseg4ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u16mf2_m(...) __riscv_vluxseg5ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u16mf2_m(...) __riscv_vluxseg6ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u16mf2_m(...) __riscv_vluxseg7ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u16mf2_m(...) __riscv_vluxseg8ei8_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u16m1_m(...) __riscv_vluxseg2ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u16m1_m(...) __riscv_vluxseg3ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u16m1_m(...) __riscv_vluxseg4ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u16m1_m(...) __riscv_vluxseg5ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u16m1_m(...) __riscv_vluxseg6ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u16m1_m(...) __riscv_vluxseg7ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u16m1_m(...) __riscv_vluxseg8ei8_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u16m2_m(...) __riscv_vluxseg2ei8_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u16m2_m(...) __riscv_vluxseg3ei8_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u16m2_m(...) __riscv_vluxseg4ei8_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u16m4_m(...) __riscv_vluxseg2ei8_v_u16m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u16mf4_m(...) __riscv_vluxseg2ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u16mf4_m(...) __riscv_vluxseg3ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u16mf4_m(...) __riscv_vluxseg4ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u16mf4_m(...) __riscv_vluxseg5ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u16mf4_m(...) __riscv_vluxseg6ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u16mf4_m(...) __riscv_vluxseg7ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u16mf4_m(...) __riscv_vluxseg8ei16_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u16mf2_m(...) __riscv_vluxseg2ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u16mf2_m(...) __riscv_vluxseg3ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u16mf2_m(...) __riscv_vluxseg4ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u16mf2_m(...) __riscv_vluxseg5ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u16mf2_m(...) __riscv_vluxseg6ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u16mf2_m(...) __riscv_vluxseg7ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u16mf2_m(...) __riscv_vluxseg8ei16_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u16m1_m(...) __riscv_vluxseg2ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u16m1_m(...) __riscv_vluxseg3ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u16m1_m(...) __riscv_vluxseg4ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u16m1_m(...) __riscv_vluxseg5ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u16m1_m(...) __riscv_vluxseg6ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u16m1_m(...) __riscv_vluxseg7ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u16m1_m(...) __riscv_vluxseg8ei16_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u16m2_m(...) __riscv_vluxseg2ei16_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u16m2_m(...) __riscv_vluxseg3ei16_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u16m2_m(...) __riscv_vluxseg4ei16_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u16m4_m(...) __riscv_vluxseg2ei16_v_u16m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u16mf4_m(...) __riscv_vluxseg2ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u16mf4_m(...) __riscv_vluxseg3ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u16mf4_m(...) __riscv_vluxseg4ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u16mf4_m(...) __riscv_vluxseg5ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u16mf4_m(...) __riscv_vluxseg6ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u16mf4_m(...) __riscv_vluxseg7ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u16mf4_m(...) __riscv_vluxseg8ei32_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u16mf2_m(...) __riscv_vluxseg2ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u16mf2_m(...) __riscv_vluxseg3ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u16mf2_m(...) __riscv_vluxseg4ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u16mf2_m(...) __riscv_vluxseg5ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u16mf2_m(...) __riscv_vluxseg6ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u16mf2_m(...) __riscv_vluxseg7ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u16mf2_m(...) __riscv_vluxseg8ei32_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u16m1_m(...) __riscv_vluxseg2ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u16m1_m(...) __riscv_vluxseg3ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u16m1_m(...) __riscv_vluxseg4ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u16m1_m(...) __riscv_vluxseg5ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u16m1_m(...) __riscv_vluxseg6ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u16m1_m(...) __riscv_vluxseg7ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u16m1_m(...) __riscv_vluxseg8ei32_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u16m2_m(...) __riscv_vluxseg2ei32_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u16m2_m(...) __riscv_vluxseg3ei32_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u16m2_m(...) __riscv_vluxseg4ei32_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u16m4_m(...) __riscv_vluxseg2ei32_v_u16m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u16mf4_m(...) __riscv_vluxseg2ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u16mf4_m(...) __riscv_vluxseg3ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u16mf4_m(...) __riscv_vluxseg4ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u16mf4_m(...) __riscv_vluxseg5ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u16mf4_m(...) __riscv_vluxseg6ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u16mf4_m(...) __riscv_vluxseg7ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u16mf4_m(...) __riscv_vluxseg8ei64_v_u16mf4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u16mf2_m(...) __riscv_vluxseg2ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u16mf2_m(...) __riscv_vluxseg3ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u16mf2_m(...) __riscv_vluxseg4ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u16mf2_m(...) __riscv_vluxseg5ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u16mf2_m(...) __riscv_vluxseg6ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u16mf2_m(...) __riscv_vluxseg7ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u16mf2_m(...) __riscv_vluxseg8ei64_v_u16mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u16m1_m(...) __riscv_vluxseg2ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u16m1_m(...) __riscv_vluxseg3ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u16m1_m(...) __riscv_vluxseg4ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u16m1_m(...) __riscv_vluxseg5ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u16m1_m(...) __riscv_vluxseg6ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u16m1_m(...) __riscv_vluxseg7ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u16m1_m(...) __riscv_vluxseg8ei64_v_u16m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u16m2_m(...) __riscv_vluxseg2ei64_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u16m2_m(...) __riscv_vluxseg3ei64_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u16m2_m(...) __riscv_vluxseg4ei64_v_u16m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u32mf2_m(...) __riscv_vluxseg2ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u32mf2_m(...) __riscv_vluxseg3ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u32mf2_m(...) __riscv_vluxseg4ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u32mf2_m(...) __riscv_vluxseg5ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u32mf2_m(...) __riscv_vluxseg6ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u32mf2_m(...) __riscv_vluxseg7ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u32mf2_m(...) __riscv_vluxseg8ei8_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u32m1_m(...) __riscv_vluxseg2ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u32m1_m(...) __riscv_vluxseg3ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u32m1_m(...) __riscv_vluxseg4ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u32m1_m(...) __riscv_vluxseg5ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u32m1_m(...) __riscv_vluxseg6ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u32m1_m(...) __riscv_vluxseg7ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u32m1_m(...) __riscv_vluxseg8ei8_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u32m2_m(...) __riscv_vluxseg2ei8_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u32m2_m(...) __riscv_vluxseg3ei8_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u32m2_m(...) __riscv_vluxseg4ei8_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u32m4_m(...) __riscv_vluxseg2ei8_v_u32m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u32mf2_m(...) __riscv_vluxseg2ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u32mf2_m(...) __riscv_vluxseg3ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u32mf2_m(...) __riscv_vluxseg4ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u32mf2_m(...) __riscv_vluxseg5ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u32mf2_m(...) __riscv_vluxseg6ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u32mf2_m(...) __riscv_vluxseg7ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u32mf2_m(...) __riscv_vluxseg8ei16_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u32m1_m(...) __riscv_vluxseg2ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u32m1_m(...) __riscv_vluxseg3ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u32m1_m(...) __riscv_vluxseg4ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u32m1_m(...) __riscv_vluxseg5ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u32m1_m(...) __riscv_vluxseg6ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u32m1_m(...) __riscv_vluxseg7ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u32m1_m(...) __riscv_vluxseg8ei16_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u32m2_m(...) __riscv_vluxseg2ei16_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u32m2_m(...) __riscv_vluxseg3ei16_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u32m2_m(...) __riscv_vluxseg4ei16_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u32m4_m(...) __riscv_vluxseg2ei16_v_u32m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u32mf2_m(...) __riscv_vluxseg2ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u32mf2_m(...) __riscv_vluxseg3ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u32mf2_m(...) __riscv_vluxseg4ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u32mf2_m(...) __riscv_vluxseg5ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u32mf2_m(...) __riscv_vluxseg6ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u32mf2_m(...) __riscv_vluxseg7ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u32mf2_m(...) __riscv_vluxseg8ei32_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u32m1_m(...) __riscv_vluxseg2ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u32m1_m(...) __riscv_vluxseg3ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u32m1_m(...) __riscv_vluxseg4ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u32m1_m(...) __riscv_vluxseg5ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u32m1_m(...) __riscv_vluxseg6ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u32m1_m(...) __riscv_vluxseg7ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u32m1_m(...) __riscv_vluxseg8ei32_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u32m2_m(...) __riscv_vluxseg2ei32_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u32m2_m(...) __riscv_vluxseg3ei32_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u32m2_m(...) __riscv_vluxseg4ei32_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u32m4_m(...) __riscv_vluxseg2ei32_v_u32m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u32mf2_m(...) __riscv_vluxseg2ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u32mf2_m(...) __riscv_vluxseg3ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u32mf2_m(...) __riscv_vluxseg4ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u32mf2_m(...) __riscv_vluxseg5ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u32mf2_m(...) __riscv_vluxseg6ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u32mf2_m(...) __riscv_vluxseg7ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u32mf2_m(...) __riscv_vluxseg8ei64_v_u32mf2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u32m1_m(...) __riscv_vluxseg2ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u32m1_m(...) __riscv_vluxseg3ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u32m1_m(...) __riscv_vluxseg4ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u32m1_m(...) __riscv_vluxseg5ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u32m1_m(...) __riscv_vluxseg6ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u32m1_m(...) __riscv_vluxseg7ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u32m1_m(...) __riscv_vluxseg8ei64_v_u32m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u32m2_m(...) __riscv_vluxseg2ei64_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u32m2_m(...) __riscv_vluxseg3ei64_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u32m2_m(...) __riscv_vluxseg4ei64_v_u32m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u32m4_m(...) __riscv_vluxseg2ei64_v_u32m4_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u64m1_m(...) __riscv_vluxseg2ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u64m1_m(...) __riscv_vluxseg3ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u64m1_m(...) __riscv_vluxseg4ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg5ei8_v_u64m1_m(...) __riscv_vluxseg5ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg6ei8_v_u64m1_m(...) __riscv_vluxseg6ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg7ei8_v_u64m1_m(...) __riscv_vluxseg7ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg8ei8_v_u64m1_m(...) __riscv_vluxseg8ei8_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u64m2_m(...) __riscv_vluxseg2ei8_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg3ei8_v_u64m2_m(...) __riscv_vluxseg3ei8_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg4ei8_v_u64m2_m(...) __riscv_vluxseg4ei8_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg2ei8_v_u64m4_m(...) __riscv_vluxseg2ei8_v_u64m4_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u64m1_m(...) __riscv_vluxseg2ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u64m1_m(...) __riscv_vluxseg3ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u64m1_m(...) __riscv_vluxseg4ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg5ei16_v_u64m1_m(...) __riscv_vluxseg5ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg6ei16_v_u64m1_m(...) __riscv_vluxseg6ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg7ei16_v_u64m1_m(...) __riscv_vluxseg7ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg8ei16_v_u64m1_m(...) __riscv_vluxseg8ei16_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u64m2_m(...) __riscv_vluxseg2ei16_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg3ei16_v_u64m2_m(...) __riscv_vluxseg3ei16_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg4ei16_v_u64m2_m(...) __riscv_vluxseg4ei16_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg2ei16_v_u64m4_m(...) __riscv_vluxseg2ei16_v_u64m4_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u64m1_m(...) __riscv_vluxseg2ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u64m1_m(...) __riscv_vluxseg3ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u64m1_m(...) __riscv_vluxseg4ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg5ei32_v_u64m1_m(...) __riscv_vluxseg5ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg6ei32_v_u64m1_m(...) __riscv_vluxseg6ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg7ei32_v_u64m1_m(...) __riscv_vluxseg7ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg8ei32_v_u64m1_m(...) __riscv_vluxseg8ei32_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u64m2_m(...) __riscv_vluxseg2ei32_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg3ei32_v_u64m2_m(...) __riscv_vluxseg3ei32_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg4ei32_v_u64m2_m(...) __riscv_vluxseg4ei32_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg2ei32_v_u64m4_m(...) __riscv_vluxseg2ei32_v_u64m4_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u64m1_m(...) __riscv_vluxseg2ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u64m1_m(...) __riscv_vluxseg3ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u64m1_m(...) __riscv_vluxseg4ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg5ei64_v_u64m1_m(...) __riscv_vluxseg5ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg6ei64_v_u64m1_m(...) __riscv_vluxseg6ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg7ei64_v_u64m1_m(...) __riscv_vluxseg7ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg8ei64_v_u64m1_m(...) __riscv_vluxseg8ei64_v_u64m1_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u64m2_m(...) __riscv_vluxseg2ei64_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg3ei64_v_u64m2_m(...) __riscv_vluxseg3ei64_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg4ei64_v_u64m2_m(...) __riscv_vluxseg4ei64_v_u64m2_tumu(__VA_ARGS__) +#define vluxseg2ei64_v_u64m4_m(...) __riscv_vluxseg2ei64_v_u64m4_tumu(__VA_ARGS__) +#define vsoxseg2ei8_v_f16mf4(...) __riscv_vsoxseg2ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg3ei8_v_f16mf4(...) __riscv_vsoxseg3ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg4ei8_v_f16mf4(...) __riscv_vsoxseg4ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg5ei8_v_f16mf4(...) __riscv_vsoxseg5ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg6ei8_v_f16mf4(...) __riscv_vsoxseg6ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg7ei8_v_f16mf4(...) __riscv_vsoxseg7ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg8ei8_v_f16mf4(...) __riscv_vsoxseg8ei8_v_f16mf4(__VA_ARGS__) +#define vsoxseg2ei8_v_f16mf2(...) __riscv_vsoxseg2ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_f16mf2(...) __riscv_vsoxseg3ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_f16mf2(...) __riscv_vsoxseg4ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_f16mf2(...) __riscv_vsoxseg5ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_f16mf2(...) __riscv_vsoxseg6ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_f16mf2(...) __riscv_vsoxseg7ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_f16mf2(...) __riscv_vsoxseg8ei8_v_f16mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m1(...) __riscv_vsoxseg2ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg3ei8_v_f16m1(...) __riscv_vsoxseg3ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg4ei8_v_f16m1(...) __riscv_vsoxseg4ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg5ei8_v_f16m1(...) __riscv_vsoxseg5ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg6ei8_v_f16m1(...) __riscv_vsoxseg6ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg7ei8_v_f16m1(...) __riscv_vsoxseg7ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg8ei8_v_f16m1(...) __riscv_vsoxseg8ei8_v_f16m1(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m2(...) __riscv_vsoxseg2ei8_v_f16m2(__VA_ARGS__) +#define vsoxseg3ei8_v_f16m2(...) __riscv_vsoxseg3ei8_v_f16m2(__VA_ARGS__) +#define vsoxseg4ei8_v_f16m2(...) __riscv_vsoxseg4ei8_v_f16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m4(...) __riscv_vsoxseg2ei8_v_f16m4(__VA_ARGS__) +#define vsoxseg2ei16_v_f16mf4(...) __riscv_vsoxseg2ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg3ei16_v_f16mf4(...) __riscv_vsoxseg3ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg4ei16_v_f16mf4(...) __riscv_vsoxseg4ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg5ei16_v_f16mf4(...) __riscv_vsoxseg5ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg6ei16_v_f16mf4(...) __riscv_vsoxseg6ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg7ei16_v_f16mf4(...) __riscv_vsoxseg7ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg8ei16_v_f16mf4(...) __riscv_vsoxseg8ei16_v_f16mf4(__VA_ARGS__) +#define vsoxseg2ei16_v_f16mf2(...) __riscv_vsoxseg2ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_f16mf2(...) __riscv_vsoxseg3ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_f16mf2(...) __riscv_vsoxseg4ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_f16mf2(...) __riscv_vsoxseg5ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_f16mf2(...) __riscv_vsoxseg6ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_f16mf2(...) __riscv_vsoxseg7ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_f16mf2(...) __riscv_vsoxseg8ei16_v_f16mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m1(...) __riscv_vsoxseg2ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg3ei16_v_f16m1(...) __riscv_vsoxseg3ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg4ei16_v_f16m1(...) __riscv_vsoxseg4ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg5ei16_v_f16m1(...) __riscv_vsoxseg5ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg6ei16_v_f16m1(...) __riscv_vsoxseg6ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg7ei16_v_f16m1(...) __riscv_vsoxseg7ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg8ei16_v_f16m1(...) __riscv_vsoxseg8ei16_v_f16m1(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m2(...) __riscv_vsoxseg2ei16_v_f16m2(__VA_ARGS__) +#define vsoxseg3ei16_v_f16m2(...) __riscv_vsoxseg3ei16_v_f16m2(__VA_ARGS__) +#define vsoxseg4ei16_v_f16m2(...) __riscv_vsoxseg4ei16_v_f16m2(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m4(...) __riscv_vsoxseg2ei16_v_f16m4(__VA_ARGS__) +#define vsoxseg2ei32_v_f16mf4(...) __riscv_vsoxseg2ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg3ei32_v_f16mf4(...) __riscv_vsoxseg3ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg4ei32_v_f16mf4(...) __riscv_vsoxseg4ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg5ei32_v_f16mf4(...) __riscv_vsoxseg5ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg6ei32_v_f16mf4(...) __riscv_vsoxseg6ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg7ei32_v_f16mf4(...) __riscv_vsoxseg7ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg8ei32_v_f16mf4(...) __riscv_vsoxseg8ei32_v_f16mf4(__VA_ARGS__) +#define vsoxseg2ei32_v_f16mf2(...) __riscv_vsoxseg2ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_f16mf2(...) __riscv_vsoxseg3ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_f16mf2(...) __riscv_vsoxseg4ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_f16mf2(...) __riscv_vsoxseg5ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_f16mf2(...) __riscv_vsoxseg6ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_f16mf2(...) __riscv_vsoxseg7ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_f16mf2(...) __riscv_vsoxseg8ei32_v_f16mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m1(...) __riscv_vsoxseg2ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg3ei32_v_f16m1(...) __riscv_vsoxseg3ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg4ei32_v_f16m1(...) __riscv_vsoxseg4ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg5ei32_v_f16m1(...) __riscv_vsoxseg5ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg6ei32_v_f16m1(...) __riscv_vsoxseg6ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg7ei32_v_f16m1(...) __riscv_vsoxseg7ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg8ei32_v_f16m1(...) __riscv_vsoxseg8ei32_v_f16m1(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m2(...) __riscv_vsoxseg2ei32_v_f16m2(__VA_ARGS__) +#define vsoxseg3ei32_v_f16m2(...) __riscv_vsoxseg3ei32_v_f16m2(__VA_ARGS__) +#define vsoxseg4ei32_v_f16m2(...) __riscv_vsoxseg4ei32_v_f16m2(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m4(...) __riscv_vsoxseg2ei32_v_f16m4(__VA_ARGS__) +#define vsoxseg2ei64_v_f16mf4(...) __riscv_vsoxseg2ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg3ei64_v_f16mf4(...) __riscv_vsoxseg3ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg4ei64_v_f16mf4(...) __riscv_vsoxseg4ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg5ei64_v_f16mf4(...) __riscv_vsoxseg5ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg6ei64_v_f16mf4(...) __riscv_vsoxseg6ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg7ei64_v_f16mf4(...) __riscv_vsoxseg7ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg8ei64_v_f16mf4(...) __riscv_vsoxseg8ei64_v_f16mf4(__VA_ARGS__) +#define vsoxseg2ei64_v_f16mf2(...) __riscv_vsoxseg2ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_f16mf2(...) __riscv_vsoxseg3ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_f16mf2(...) __riscv_vsoxseg4ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_f16mf2(...) __riscv_vsoxseg5ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_f16mf2(...) __riscv_vsoxseg6ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_f16mf2(...) __riscv_vsoxseg7ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_f16mf2(...) __riscv_vsoxseg8ei64_v_f16mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_f16m1(...) __riscv_vsoxseg2ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg3ei64_v_f16m1(...) __riscv_vsoxseg3ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg4ei64_v_f16m1(...) __riscv_vsoxseg4ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg5ei64_v_f16m1(...) __riscv_vsoxseg5ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg6ei64_v_f16m1(...) __riscv_vsoxseg6ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg7ei64_v_f16m1(...) __riscv_vsoxseg7ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg8ei64_v_f16m1(...) __riscv_vsoxseg8ei64_v_f16m1(__VA_ARGS__) +#define vsoxseg2ei64_v_f16m2(...) __riscv_vsoxseg2ei64_v_f16m2(__VA_ARGS__) +#define vsoxseg3ei64_v_f16m2(...) __riscv_vsoxseg3ei64_v_f16m2(__VA_ARGS__) +#define vsoxseg4ei64_v_f16m2(...) __riscv_vsoxseg4ei64_v_f16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_f32mf2(...) __riscv_vsoxseg2ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_f32mf2(...) __riscv_vsoxseg3ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_f32mf2(...) __riscv_vsoxseg4ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_f32mf2(...) __riscv_vsoxseg5ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_f32mf2(...) __riscv_vsoxseg6ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_f32mf2(...) __riscv_vsoxseg7ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_f32mf2(...) __riscv_vsoxseg8ei8_v_f32mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m1(...) __riscv_vsoxseg2ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg3ei8_v_f32m1(...) __riscv_vsoxseg3ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg4ei8_v_f32m1(...) __riscv_vsoxseg4ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg5ei8_v_f32m1(...) __riscv_vsoxseg5ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg6ei8_v_f32m1(...) __riscv_vsoxseg6ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg7ei8_v_f32m1(...) __riscv_vsoxseg7ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg8ei8_v_f32m1(...) __riscv_vsoxseg8ei8_v_f32m1(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m2(...) __riscv_vsoxseg2ei8_v_f32m2(__VA_ARGS__) +#define vsoxseg3ei8_v_f32m2(...) __riscv_vsoxseg3ei8_v_f32m2(__VA_ARGS__) +#define vsoxseg4ei8_v_f32m2(...) __riscv_vsoxseg4ei8_v_f32m2(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m4(...) __riscv_vsoxseg2ei8_v_f32m4(__VA_ARGS__) +#define vsoxseg2ei16_v_f32mf2(...) __riscv_vsoxseg2ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_f32mf2(...) __riscv_vsoxseg3ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_f32mf2(...) __riscv_vsoxseg4ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_f32mf2(...) __riscv_vsoxseg5ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_f32mf2(...) __riscv_vsoxseg6ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_f32mf2(...) __riscv_vsoxseg7ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_f32mf2(...) __riscv_vsoxseg8ei16_v_f32mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m1(...) __riscv_vsoxseg2ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg3ei16_v_f32m1(...) __riscv_vsoxseg3ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg4ei16_v_f32m1(...) __riscv_vsoxseg4ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg5ei16_v_f32m1(...) __riscv_vsoxseg5ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg6ei16_v_f32m1(...) __riscv_vsoxseg6ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg7ei16_v_f32m1(...) __riscv_vsoxseg7ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg8ei16_v_f32m1(...) __riscv_vsoxseg8ei16_v_f32m1(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m2(...) __riscv_vsoxseg2ei16_v_f32m2(__VA_ARGS__) +#define vsoxseg3ei16_v_f32m2(...) __riscv_vsoxseg3ei16_v_f32m2(__VA_ARGS__) +#define vsoxseg4ei16_v_f32m2(...) __riscv_vsoxseg4ei16_v_f32m2(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m4(...) __riscv_vsoxseg2ei16_v_f32m4(__VA_ARGS__) +#define vsoxseg2ei32_v_f32mf2(...) __riscv_vsoxseg2ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_f32mf2(...) __riscv_vsoxseg3ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_f32mf2(...) __riscv_vsoxseg4ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_f32mf2(...) __riscv_vsoxseg5ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_f32mf2(...) __riscv_vsoxseg6ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_f32mf2(...) __riscv_vsoxseg7ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_f32mf2(...) __riscv_vsoxseg8ei32_v_f32mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m1(...) __riscv_vsoxseg2ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg3ei32_v_f32m1(...) __riscv_vsoxseg3ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg4ei32_v_f32m1(...) __riscv_vsoxseg4ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg5ei32_v_f32m1(...) __riscv_vsoxseg5ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg6ei32_v_f32m1(...) __riscv_vsoxseg6ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg7ei32_v_f32m1(...) __riscv_vsoxseg7ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg8ei32_v_f32m1(...) __riscv_vsoxseg8ei32_v_f32m1(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m2(...) __riscv_vsoxseg2ei32_v_f32m2(__VA_ARGS__) +#define vsoxseg3ei32_v_f32m2(...) __riscv_vsoxseg3ei32_v_f32m2(__VA_ARGS__) +#define vsoxseg4ei32_v_f32m2(...) __riscv_vsoxseg4ei32_v_f32m2(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m4(...) __riscv_vsoxseg2ei32_v_f32m4(__VA_ARGS__) +#define vsoxseg2ei64_v_f32mf2(...) __riscv_vsoxseg2ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_f32mf2(...) __riscv_vsoxseg3ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_f32mf2(...) __riscv_vsoxseg4ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_f32mf2(...) __riscv_vsoxseg5ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_f32mf2(...) __riscv_vsoxseg6ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_f32mf2(...) __riscv_vsoxseg7ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_f32mf2(...) __riscv_vsoxseg8ei64_v_f32mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m1(...) __riscv_vsoxseg2ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg3ei64_v_f32m1(...) __riscv_vsoxseg3ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg4ei64_v_f32m1(...) __riscv_vsoxseg4ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg5ei64_v_f32m1(...) __riscv_vsoxseg5ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg6ei64_v_f32m1(...) __riscv_vsoxseg6ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg7ei64_v_f32m1(...) __riscv_vsoxseg7ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg8ei64_v_f32m1(...) __riscv_vsoxseg8ei64_v_f32m1(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m2(...) __riscv_vsoxseg2ei64_v_f32m2(__VA_ARGS__) +#define vsoxseg3ei64_v_f32m2(...) __riscv_vsoxseg3ei64_v_f32m2(__VA_ARGS__) +#define vsoxseg4ei64_v_f32m2(...) __riscv_vsoxseg4ei64_v_f32m2(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m4(...) __riscv_vsoxseg2ei64_v_f32m4(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m1(...) __riscv_vsoxseg2ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg3ei8_v_f64m1(...) __riscv_vsoxseg3ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg4ei8_v_f64m1(...) __riscv_vsoxseg4ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg5ei8_v_f64m1(...) __riscv_vsoxseg5ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg6ei8_v_f64m1(...) __riscv_vsoxseg6ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg7ei8_v_f64m1(...) __riscv_vsoxseg7ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg8ei8_v_f64m1(...) __riscv_vsoxseg8ei8_v_f64m1(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m2(...) __riscv_vsoxseg2ei8_v_f64m2(__VA_ARGS__) +#define vsoxseg3ei8_v_f64m2(...) __riscv_vsoxseg3ei8_v_f64m2(__VA_ARGS__) +#define vsoxseg4ei8_v_f64m2(...) __riscv_vsoxseg4ei8_v_f64m2(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m4(...) __riscv_vsoxseg2ei8_v_f64m4(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m1(...) __riscv_vsoxseg2ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg3ei16_v_f64m1(...) __riscv_vsoxseg3ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg4ei16_v_f64m1(...) __riscv_vsoxseg4ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg5ei16_v_f64m1(...) __riscv_vsoxseg5ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg6ei16_v_f64m1(...) __riscv_vsoxseg6ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg7ei16_v_f64m1(...) __riscv_vsoxseg7ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg8ei16_v_f64m1(...) __riscv_vsoxseg8ei16_v_f64m1(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m2(...) __riscv_vsoxseg2ei16_v_f64m2(__VA_ARGS__) +#define vsoxseg3ei16_v_f64m2(...) __riscv_vsoxseg3ei16_v_f64m2(__VA_ARGS__) +#define vsoxseg4ei16_v_f64m2(...) __riscv_vsoxseg4ei16_v_f64m2(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m4(...) __riscv_vsoxseg2ei16_v_f64m4(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m1(...) __riscv_vsoxseg2ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg3ei32_v_f64m1(...) __riscv_vsoxseg3ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg4ei32_v_f64m1(...) __riscv_vsoxseg4ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg5ei32_v_f64m1(...) __riscv_vsoxseg5ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg6ei32_v_f64m1(...) __riscv_vsoxseg6ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg7ei32_v_f64m1(...) __riscv_vsoxseg7ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg8ei32_v_f64m1(...) __riscv_vsoxseg8ei32_v_f64m1(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m2(...) __riscv_vsoxseg2ei32_v_f64m2(__VA_ARGS__) +#define vsoxseg3ei32_v_f64m2(...) __riscv_vsoxseg3ei32_v_f64m2(__VA_ARGS__) +#define vsoxseg4ei32_v_f64m2(...) __riscv_vsoxseg4ei32_v_f64m2(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m4(...) __riscv_vsoxseg2ei32_v_f64m4(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m1(...) __riscv_vsoxseg2ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg3ei64_v_f64m1(...) __riscv_vsoxseg3ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg4ei64_v_f64m1(...) __riscv_vsoxseg4ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg5ei64_v_f64m1(...) __riscv_vsoxseg5ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg6ei64_v_f64m1(...) __riscv_vsoxseg6ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg7ei64_v_f64m1(...) __riscv_vsoxseg7ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg8ei64_v_f64m1(...) __riscv_vsoxseg8ei64_v_f64m1(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m2(...) __riscv_vsoxseg2ei64_v_f64m2(__VA_ARGS__) +#define vsoxseg3ei64_v_f64m2(...) __riscv_vsoxseg3ei64_v_f64m2(__VA_ARGS__) +#define vsoxseg4ei64_v_f64m2(...) __riscv_vsoxseg4ei64_v_f64m2(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m4(...) __riscv_vsoxseg2ei64_v_f64m4(__VA_ARGS__) +#define vsuxseg2ei8_v_f16mf4(...) __riscv_vsuxseg2ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg3ei8_v_f16mf4(...) __riscv_vsuxseg3ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg4ei8_v_f16mf4(...) __riscv_vsuxseg4ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg5ei8_v_f16mf4(...) __riscv_vsuxseg5ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg6ei8_v_f16mf4(...) __riscv_vsuxseg6ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg7ei8_v_f16mf4(...) __riscv_vsuxseg7ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg8ei8_v_f16mf4(...) __riscv_vsuxseg8ei8_v_f16mf4(__VA_ARGS__) +#define vsuxseg2ei8_v_f16mf2(...) __riscv_vsuxseg2ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_f16mf2(...) __riscv_vsuxseg3ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_f16mf2(...) __riscv_vsuxseg4ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_f16mf2(...) __riscv_vsuxseg5ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_f16mf2(...) __riscv_vsuxseg6ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_f16mf2(...) __riscv_vsuxseg7ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_f16mf2(...) __riscv_vsuxseg8ei8_v_f16mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m1(...) __riscv_vsuxseg2ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg3ei8_v_f16m1(...) __riscv_vsuxseg3ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg4ei8_v_f16m1(...) __riscv_vsuxseg4ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg5ei8_v_f16m1(...) __riscv_vsuxseg5ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg6ei8_v_f16m1(...) __riscv_vsuxseg6ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg7ei8_v_f16m1(...) __riscv_vsuxseg7ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg8ei8_v_f16m1(...) __riscv_vsuxseg8ei8_v_f16m1(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m2(...) __riscv_vsuxseg2ei8_v_f16m2(__VA_ARGS__) +#define vsuxseg3ei8_v_f16m2(...) __riscv_vsuxseg3ei8_v_f16m2(__VA_ARGS__) +#define vsuxseg4ei8_v_f16m2(...) __riscv_vsuxseg4ei8_v_f16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m4(...) __riscv_vsuxseg2ei8_v_f16m4(__VA_ARGS__) +#define vsuxseg2ei16_v_f16mf4(...) __riscv_vsuxseg2ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg3ei16_v_f16mf4(...) __riscv_vsuxseg3ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg4ei16_v_f16mf4(...) __riscv_vsuxseg4ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg5ei16_v_f16mf4(...) __riscv_vsuxseg5ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg6ei16_v_f16mf4(...) __riscv_vsuxseg6ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg7ei16_v_f16mf4(...) __riscv_vsuxseg7ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg8ei16_v_f16mf4(...) __riscv_vsuxseg8ei16_v_f16mf4(__VA_ARGS__) +#define vsuxseg2ei16_v_f16mf2(...) __riscv_vsuxseg2ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_f16mf2(...) __riscv_vsuxseg3ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_f16mf2(...) __riscv_vsuxseg4ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_f16mf2(...) __riscv_vsuxseg5ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_f16mf2(...) __riscv_vsuxseg6ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_f16mf2(...) __riscv_vsuxseg7ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_f16mf2(...) __riscv_vsuxseg8ei16_v_f16mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m1(...) __riscv_vsuxseg2ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg3ei16_v_f16m1(...) __riscv_vsuxseg3ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg4ei16_v_f16m1(...) __riscv_vsuxseg4ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg5ei16_v_f16m1(...) __riscv_vsuxseg5ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg6ei16_v_f16m1(...) __riscv_vsuxseg6ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg7ei16_v_f16m1(...) __riscv_vsuxseg7ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg8ei16_v_f16m1(...) __riscv_vsuxseg8ei16_v_f16m1(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m2(...) __riscv_vsuxseg2ei16_v_f16m2(__VA_ARGS__) +#define vsuxseg3ei16_v_f16m2(...) __riscv_vsuxseg3ei16_v_f16m2(__VA_ARGS__) +#define vsuxseg4ei16_v_f16m2(...) __riscv_vsuxseg4ei16_v_f16m2(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m4(...) __riscv_vsuxseg2ei16_v_f16m4(__VA_ARGS__) +#define vsuxseg2ei32_v_f16mf4(...) __riscv_vsuxseg2ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg3ei32_v_f16mf4(...) __riscv_vsuxseg3ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg4ei32_v_f16mf4(...) __riscv_vsuxseg4ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg5ei32_v_f16mf4(...) __riscv_vsuxseg5ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg6ei32_v_f16mf4(...) __riscv_vsuxseg6ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg7ei32_v_f16mf4(...) __riscv_vsuxseg7ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg8ei32_v_f16mf4(...) __riscv_vsuxseg8ei32_v_f16mf4(__VA_ARGS__) +#define vsuxseg2ei32_v_f16mf2(...) __riscv_vsuxseg2ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_f16mf2(...) __riscv_vsuxseg3ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_f16mf2(...) __riscv_vsuxseg4ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_f16mf2(...) __riscv_vsuxseg5ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_f16mf2(...) __riscv_vsuxseg6ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_f16mf2(...) __riscv_vsuxseg7ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_f16mf2(...) __riscv_vsuxseg8ei32_v_f16mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m1(...) __riscv_vsuxseg2ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg3ei32_v_f16m1(...) __riscv_vsuxseg3ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg4ei32_v_f16m1(...) __riscv_vsuxseg4ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg5ei32_v_f16m1(...) __riscv_vsuxseg5ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg6ei32_v_f16m1(...) __riscv_vsuxseg6ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg7ei32_v_f16m1(...) __riscv_vsuxseg7ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg8ei32_v_f16m1(...) __riscv_vsuxseg8ei32_v_f16m1(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m2(...) __riscv_vsuxseg2ei32_v_f16m2(__VA_ARGS__) +#define vsuxseg3ei32_v_f16m2(...) __riscv_vsuxseg3ei32_v_f16m2(__VA_ARGS__) +#define vsuxseg4ei32_v_f16m2(...) __riscv_vsuxseg4ei32_v_f16m2(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m4(...) __riscv_vsuxseg2ei32_v_f16m4(__VA_ARGS__) +#define vsuxseg2ei64_v_f16mf4(...) __riscv_vsuxseg2ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg3ei64_v_f16mf4(...) __riscv_vsuxseg3ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg4ei64_v_f16mf4(...) __riscv_vsuxseg4ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg5ei64_v_f16mf4(...) __riscv_vsuxseg5ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg6ei64_v_f16mf4(...) __riscv_vsuxseg6ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg7ei64_v_f16mf4(...) __riscv_vsuxseg7ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg8ei64_v_f16mf4(...) __riscv_vsuxseg8ei64_v_f16mf4(__VA_ARGS__) +#define vsuxseg2ei64_v_f16mf2(...) __riscv_vsuxseg2ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_f16mf2(...) __riscv_vsuxseg3ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_f16mf2(...) __riscv_vsuxseg4ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_f16mf2(...) __riscv_vsuxseg5ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_f16mf2(...) __riscv_vsuxseg6ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_f16mf2(...) __riscv_vsuxseg7ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_f16mf2(...) __riscv_vsuxseg8ei64_v_f16mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_f16m1(...) __riscv_vsuxseg2ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg3ei64_v_f16m1(...) __riscv_vsuxseg3ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg4ei64_v_f16m1(...) __riscv_vsuxseg4ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg5ei64_v_f16m1(...) __riscv_vsuxseg5ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg6ei64_v_f16m1(...) __riscv_vsuxseg6ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg7ei64_v_f16m1(...) __riscv_vsuxseg7ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg8ei64_v_f16m1(...) __riscv_vsuxseg8ei64_v_f16m1(__VA_ARGS__) +#define vsuxseg2ei64_v_f16m2(...) __riscv_vsuxseg2ei64_v_f16m2(__VA_ARGS__) +#define vsuxseg3ei64_v_f16m2(...) __riscv_vsuxseg3ei64_v_f16m2(__VA_ARGS__) +#define vsuxseg4ei64_v_f16m2(...) __riscv_vsuxseg4ei64_v_f16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_f32mf2(...) __riscv_vsuxseg2ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_f32mf2(...) __riscv_vsuxseg3ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_f32mf2(...) __riscv_vsuxseg4ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_f32mf2(...) __riscv_vsuxseg5ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_f32mf2(...) __riscv_vsuxseg6ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_f32mf2(...) __riscv_vsuxseg7ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_f32mf2(...) __riscv_vsuxseg8ei8_v_f32mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m1(...) __riscv_vsuxseg2ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg3ei8_v_f32m1(...) __riscv_vsuxseg3ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg4ei8_v_f32m1(...) __riscv_vsuxseg4ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg5ei8_v_f32m1(...) __riscv_vsuxseg5ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg6ei8_v_f32m1(...) __riscv_vsuxseg6ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg7ei8_v_f32m1(...) __riscv_vsuxseg7ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg8ei8_v_f32m1(...) __riscv_vsuxseg8ei8_v_f32m1(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m2(...) __riscv_vsuxseg2ei8_v_f32m2(__VA_ARGS__) +#define vsuxseg3ei8_v_f32m2(...) __riscv_vsuxseg3ei8_v_f32m2(__VA_ARGS__) +#define vsuxseg4ei8_v_f32m2(...) __riscv_vsuxseg4ei8_v_f32m2(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m4(...) __riscv_vsuxseg2ei8_v_f32m4(__VA_ARGS__) +#define vsuxseg2ei16_v_f32mf2(...) __riscv_vsuxseg2ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_f32mf2(...) __riscv_vsuxseg3ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_f32mf2(...) __riscv_vsuxseg4ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_f32mf2(...) __riscv_vsuxseg5ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_f32mf2(...) __riscv_vsuxseg6ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_f32mf2(...) __riscv_vsuxseg7ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_f32mf2(...) __riscv_vsuxseg8ei16_v_f32mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m1(...) __riscv_vsuxseg2ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg3ei16_v_f32m1(...) __riscv_vsuxseg3ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg4ei16_v_f32m1(...) __riscv_vsuxseg4ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg5ei16_v_f32m1(...) __riscv_vsuxseg5ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg6ei16_v_f32m1(...) __riscv_vsuxseg6ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg7ei16_v_f32m1(...) __riscv_vsuxseg7ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg8ei16_v_f32m1(...) __riscv_vsuxseg8ei16_v_f32m1(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m2(...) __riscv_vsuxseg2ei16_v_f32m2(__VA_ARGS__) +#define vsuxseg3ei16_v_f32m2(...) __riscv_vsuxseg3ei16_v_f32m2(__VA_ARGS__) +#define vsuxseg4ei16_v_f32m2(...) __riscv_vsuxseg4ei16_v_f32m2(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m4(...) __riscv_vsuxseg2ei16_v_f32m4(__VA_ARGS__) +#define vsuxseg2ei32_v_f32mf2(...) __riscv_vsuxseg2ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_f32mf2(...) __riscv_vsuxseg3ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_f32mf2(...) __riscv_vsuxseg4ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_f32mf2(...) __riscv_vsuxseg5ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_f32mf2(...) __riscv_vsuxseg6ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_f32mf2(...) __riscv_vsuxseg7ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_f32mf2(...) __riscv_vsuxseg8ei32_v_f32mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m1(...) __riscv_vsuxseg2ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg3ei32_v_f32m1(...) __riscv_vsuxseg3ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg4ei32_v_f32m1(...) __riscv_vsuxseg4ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg5ei32_v_f32m1(...) __riscv_vsuxseg5ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg6ei32_v_f32m1(...) __riscv_vsuxseg6ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg7ei32_v_f32m1(...) __riscv_vsuxseg7ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg8ei32_v_f32m1(...) __riscv_vsuxseg8ei32_v_f32m1(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m2(...) __riscv_vsuxseg2ei32_v_f32m2(__VA_ARGS__) +#define vsuxseg3ei32_v_f32m2(...) __riscv_vsuxseg3ei32_v_f32m2(__VA_ARGS__) +#define vsuxseg4ei32_v_f32m2(...) __riscv_vsuxseg4ei32_v_f32m2(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m4(...) __riscv_vsuxseg2ei32_v_f32m4(__VA_ARGS__) +#define vsuxseg2ei64_v_f32mf2(...) __riscv_vsuxseg2ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_f32mf2(...) __riscv_vsuxseg3ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_f32mf2(...) __riscv_vsuxseg4ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_f32mf2(...) __riscv_vsuxseg5ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_f32mf2(...) __riscv_vsuxseg6ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_f32mf2(...) __riscv_vsuxseg7ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_f32mf2(...) __riscv_vsuxseg8ei64_v_f32mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m1(...) __riscv_vsuxseg2ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg3ei64_v_f32m1(...) __riscv_vsuxseg3ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg4ei64_v_f32m1(...) __riscv_vsuxseg4ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg5ei64_v_f32m1(...) __riscv_vsuxseg5ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg6ei64_v_f32m1(...) __riscv_vsuxseg6ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg7ei64_v_f32m1(...) __riscv_vsuxseg7ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg8ei64_v_f32m1(...) __riscv_vsuxseg8ei64_v_f32m1(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m2(...) __riscv_vsuxseg2ei64_v_f32m2(__VA_ARGS__) +#define vsuxseg3ei64_v_f32m2(...) __riscv_vsuxseg3ei64_v_f32m2(__VA_ARGS__) +#define vsuxseg4ei64_v_f32m2(...) __riscv_vsuxseg4ei64_v_f32m2(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m4(...) __riscv_vsuxseg2ei64_v_f32m4(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m1(...) __riscv_vsuxseg2ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg3ei8_v_f64m1(...) __riscv_vsuxseg3ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg4ei8_v_f64m1(...) __riscv_vsuxseg4ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg5ei8_v_f64m1(...) __riscv_vsuxseg5ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg6ei8_v_f64m1(...) __riscv_vsuxseg6ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg7ei8_v_f64m1(...) __riscv_vsuxseg7ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg8ei8_v_f64m1(...) __riscv_vsuxseg8ei8_v_f64m1(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m2(...) __riscv_vsuxseg2ei8_v_f64m2(__VA_ARGS__) +#define vsuxseg3ei8_v_f64m2(...) __riscv_vsuxseg3ei8_v_f64m2(__VA_ARGS__) +#define vsuxseg4ei8_v_f64m2(...) __riscv_vsuxseg4ei8_v_f64m2(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m4(...) __riscv_vsuxseg2ei8_v_f64m4(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m1(...) __riscv_vsuxseg2ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg3ei16_v_f64m1(...) __riscv_vsuxseg3ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg4ei16_v_f64m1(...) __riscv_vsuxseg4ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg5ei16_v_f64m1(...) __riscv_vsuxseg5ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg6ei16_v_f64m1(...) __riscv_vsuxseg6ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg7ei16_v_f64m1(...) __riscv_vsuxseg7ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg8ei16_v_f64m1(...) __riscv_vsuxseg8ei16_v_f64m1(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m2(...) __riscv_vsuxseg2ei16_v_f64m2(__VA_ARGS__) +#define vsuxseg3ei16_v_f64m2(...) __riscv_vsuxseg3ei16_v_f64m2(__VA_ARGS__) +#define vsuxseg4ei16_v_f64m2(...) __riscv_vsuxseg4ei16_v_f64m2(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m4(...) __riscv_vsuxseg2ei16_v_f64m4(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m1(...) __riscv_vsuxseg2ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg3ei32_v_f64m1(...) __riscv_vsuxseg3ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg4ei32_v_f64m1(...) __riscv_vsuxseg4ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg5ei32_v_f64m1(...) __riscv_vsuxseg5ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg6ei32_v_f64m1(...) __riscv_vsuxseg6ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg7ei32_v_f64m1(...) __riscv_vsuxseg7ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg8ei32_v_f64m1(...) __riscv_vsuxseg8ei32_v_f64m1(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m2(...) __riscv_vsuxseg2ei32_v_f64m2(__VA_ARGS__) +#define vsuxseg3ei32_v_f64m2(...) __riscv_vsuxseg3ei32_v_f64m2(__VA_ARGS__) +#define vsuxseg4ei32_v_f64m2(...) __riscv_vsuxseg4ei32_v_f64m2(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m4(...) __riscv_vsuxseg2ei32_v_f64m4(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m1(...) __riscv_vsuxseg2ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg3ei64_v_f64m1(...) __riscv_vsuxseg3ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg4ei64_v_f64m1(...) __riscv_vsuxseg4ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg5ei64_v_f64m1(...) __riscv_vsuxseg5ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg6ei64_v_f64m1(...) __riscv_vsuxseg6ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg7ei64_v_f64m1(...) __riscv_vsuxseg7ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg8ei64_v_f64m1(...) __riscv_vsuxseg8ei64_v_f64m1(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m2(...) __riscv_vsuxseg2ei64_v_f64m2(__VA_ARGS__) +#define vsuxseg3ei64_v_f64m2(...) __riscv_vsuxseg3ei64_v_f64m2(__VA_ARGS__) +#define vsuxseg4ei64_v_f64m2(...) __riscv_vsuxseg4ei64_v_f64m2(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m4(...) __riscv_vsuxseg2ei64_v_f64m4(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf8(...) __riscv_vsoxseg2ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf8(...) __riscv_vsoxseg3ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf8(...) __riscv_vsoxseg4ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf8(...) __riscv_vsoxseg5ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf8(...) __riscv_vsoxseg6ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf8(...) __riscv_vsoxseg7ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf8(...) __riscv_vsoxseg8ei8_v_i8mf8(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf4(...) __riscv_vsoxseg2ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf4(...) __riscv_vsoxseg3ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf4(...) __riscv_vsoxseg4ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf4(...) __riscv_vsoxseg5ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf4(...) __riscv_vsoxseg6ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf4(...) __riscv_vsoxseg7ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf4(...) __riscv_vsoxseg8ei8_v_i8mf4(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf2(...) __riscv_vsoxseg2ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf2(...) __riscv_vsoxseg3ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf2(...) __riscv_vsoxseg4ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf2(...) __riscv_vsoxseg5ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf2(...) __riscv_vsoxseg6ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf2(...) __riscv_vsoxseg7ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf2(...) __riscv_vsoxseg8ei8_v_i8mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m1(...) __riscv_vsoxseg2ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg3ei8_v_i8m1(...) __riscv_vsoxseg3ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg4ei8_v_i8m1(...) __riscv_vsoxseg4ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg5ei8_v_i8m1(...) __riscv_vsoxseg5ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg6ei8_v_i8m1(...) __riscv_vsoxseg6ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg7ei8_v_i8m1(...) __riscv_vsoxseg7ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg8ei8_v_i8m1(...) __riscv_vsoxseg8ei8_v_i8m1(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m2(...) __riscv_vsoxseg2ei8_v_i8m2(__VA_ARGS__) +#define vsoxseg3ei8_v_i8m2(...) __riscv_vsoxseg3ei8_v_i8m2(__VA_ARGS__) +#define vsoxseg4ei8_v_i8m2(...) __riscv_vsoxseg4ei8_v_i8m2(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m4(...) __riscv_vsoxseg2ei8_v_i8m4(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf8(...) __riscv_vsoxseg2ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf8(...) __riscv_vsoxseg3ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf8(...) __riscv_vsoxseg4ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf8(...) __riscv_vsoxseg5ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf8(...) __riscv_vsoxseg6ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf8(...) __riscv_vsoxseg7ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf8(...) __riscv_vsoxseg8ei16_v_i8mf8(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf4(...) __riscv_vsoxseg2ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf4(...) __riscv_vsoxseg3ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf4(...) __riscv_vsoxseg4ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf4(...) __riscv_vsoxseg5ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf4(...) __riscv_vsoxseg6ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf4(...) __riscv_vsoxseg7ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf4(...) __riscv_vsoxseg8ei16_v_i8mf4(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf2(...) __riscv_vsoxseg2ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf2(...) __riscv_vsoxseg3ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf2(...) __riscv_vsoxseg4ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf2(...) __riscv_vsoxseg5ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf2(...) __riscv_vsoxseg6ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf2(...) __riscv_vsoxseg7ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf2(...) __riscv_vsoxseg8ei16_v_i8mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m1(...) __riscv_vsoxseg2ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg3ei16_v_i8m1(...) __riscv_vsoxseg3ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg4ei16_v_i8m1(...) __riscv_vsoxseg4ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg5ei16_v_i8m1(...) __riscv_vsoxseg5ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg6ei16_v_i8m1(...) __riscv_vsoxseg6ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg7ei16_v_i8m1(...) __riscv_vsoxseg7ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg8ei16_v_i8m1(...) __riscv_vsoxseg8ei16_v_i8m1(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m2(...) __riscv_vsoxseg2ei16_v_i8m2(__VA_ARGS__) +#define vsoxseg3ei16_v_i8m2(...) __riscv_vsoxseg3ei16_v_i8m2(__VA_ARGS__) +#define vsoxseg4ei16_v_i8m2(...) __riscv_vsoxseg4ei16_v_i8m2(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m4(...) __riscv_vsoxseg2ei16_v_i8m4(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf8(...) __riscv_vsoxseg2ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf8(...) __riscv_vsoxseg3ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf8(...) __riscv_vsoxseg4ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf8(...) __riscv_vsoxseg5ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf8(...) __riscv_vsoxseg6ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf8(...) __riscv_vsoxseg7ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf8(...) __riscv_vsoxseg8ei32_v_i8mf8(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf4(...) __riscv_vsoxseg2ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf4(...) __riscv_vsoxseg3ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf4(...) __riscv_vsoxseg4ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf4(...) __riscv_vsoxseg5ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf4(...) __riscv_vsoxseg6ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf4(...) __riscv_vsoxseg7ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf4(...) __riscv_vsoxseg8ei32_v_i8mf4(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf2(...) __riscv_vsoxseg2ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf2(...) __riscv_vsoxseg3ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf2(...) __riscv_vsoxseg4ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf2(...) __riscv_vsoxseg5ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf2(...) __riscv_vsoxseg6ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf2(...) __riscv_vsoxseg7ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf2(...) __riscv_vsoxseg8ei32_v_i8mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_i8m1(...) __riscv_vsoxseg2ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg3ei32_v_i8m1(...) __riscv_vsoxseg3ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg4ei32_v_i8m1(...) __riscv_vsoxseg4ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg5ei32_v_i8m1(...) __riscv_vsoxseg5ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg6ei32_v_i8m1(...) __riscv_vsoxseg6ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg7ei32_v_i8m1(...) __riscv_vsoxseg7ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg8ei32_v_i8m1(...) __riscv_vsoxseg8ei32_v_i8m1(__VA_ARGS__) +#define vsoxseg2ei32_v_i8m2(...) __riscv_vsoxseg2ei32_v_i8m2(__VA_ARGS__) +#define vsoxseg3ei32_v_i8m2(...) __riscv_vsoxseg3ei32_v_i8m2(__VA_ARGS__) +#define vsoxseg4ei32_v_i8m2(...) __riscv_vsoxseg4ei32_v_i8m2(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf8(...) __riscv_vsoxseg2ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf8(...) __riscv_vsoxseg3ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf8(...) __riscv_vsoxseg4ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf8(...) __riscv_vsoxseg5ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf8(...) __riscv_vsoxseg6ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf8(...) __riscv_vsoxseg7ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf8(...) __riscv_vsoxseg8ei64_v_i8mf8(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf4(...) __riscv_vsoxseg2ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf4(...) __riscv_vsoxseg3ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf4(...) __riscv_vsoxseg4ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf4(...) __riscv_vsoxseg5ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf4(...) __riscv_vsoxseg6ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf4(...) __riscv_vsoxseg7ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf4(...) __riscv_vsoxseg8ei64_v_i8mf4(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf2(...) __riscv_vsoxseg2ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf2(...) __riscv_vsoxseg3ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf2(...) __riscv_vsoxseg4ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf2(...) __riscv_vsoxseg5ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf2(...) __riscv_vsoxseg6ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf2(...) __riscv_vsoxseg7ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf2(...) __riscv_vsoxseg8ei64_v_i8mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_i8m1(...) __riscv_vsoxseg2ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg3ei64_v_i8m1(...) __riscv_vsoxseg3ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg4ei64_v_i8m1(...) __riscv_vsoxseg4ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg5ei64_v_i8m1(...) __riscv_vsoxseg5ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg6ei64_v_i8m1(...) __riscv_vsoxseg6ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg7ei64_v_i8m1(...) __riscv_vsoxseg7ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg8ei64_v_i8m1(...) __riscv_vsoxseg8ei64_v_i8m1(__VA_ARGS__) +#define vsoxseg2ei8_v_i16mf4(...) __riscv_vsoxseg2ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg3ei8_v_i16mf4(...) __riscv_vsoxseg3ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg4ei8_v_i16mf4(...) __riscv_vsoxseg4ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg5ei8_v_i16mf4(...) __riscv_vsoxseg5ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg6ei8_v_i16mf4(...) __riscv_vsoxseg6ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg7ei8_v_i16mf4(...) __riscv_vsoxseg7ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg8ei8_v_i16mf4(...) __riscv_vsoxseg8ei8_v_i16mf4(__VA_ARGS__) +#define vsoxseg2ei8_v_i16mf2(...) __riscv_vsoxseg2ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_i16mf2(...) __riscv_vsoxseg3ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_i16mf2(...) __riscv_vsoxseg4ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_i16mf2(...) __riscv_vsoxseg5ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_i16mf2(...) __riscv_vsoxseg6ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_i16mf2(...) __riscv_vsoxseg7ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_i16mf2(...) __riscv_vsoxseg8ei8_v_i16mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m1(...) __riscv_vsoxseg2ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg3ei8_v_i16m1(...) __riscv_vsoxseg3ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg4ei8_v_i16m1(...) __riscv_vsoxseg4ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg5ei8_v_i16m1(...) __riscv_vsoxseg5ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg6ei8_v_i16m1(...) __riscv_vsoxseg6ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg7ei8_v_i16m1(...) __riscv_vsoxseg7ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg8ei8_v_i16m1(...) __riscv_vsoxseg8ei8_v_i16m1(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m2(...) __riscv_vsoxseg2ei8_v_i16m2(__VA_ARGS__) +#define vsoxseg3ei8_v_i16m2(...) __riscv_vsoxseg3ei8_v_i16m2(__VA_ARGS__) +#define vsoxseg4ei8_v_i16m2(...) __riscv_vsoxseg4ei8_v_i16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m4(...) __riscv_vsoxseg2ei8_v_i16m4(__VA_ARGS__) +#define vsoxseg2ei16_v_i16mf4(...) __riscv_vsoxseg2ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg3ei16_v_i16mf4(...) __riscv_vsoxseg3ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg4ei16_v_i16mf4(...) __riscv_vsoxseg4ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg5ei16_v_i16mf4(...) __riscv_vsoxseg5ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg6ei16_v_i16mf4(...) __riscv_vsoxseg6ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg7ei16_v_i16mf4(...) __riscv_vsoxseg7ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg8ei16_v_i16mf4(...) __riscv_vsoxseg8ei16_v_i16mf4(__VA_ARGS__) +#define vsoxseg2ei16_v_i16mf2(...) __riscv_vsoxseg2ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_i16mf2(...) __riscv_vsoxseg3ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_i16mf2(...) __riscv_vsoxseg4ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_i16mf2(...) __riscv_vsoxseg5ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_i16mf2(...) __riscv_vsoxseg6ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_i16mf2(...) __riscv_vsoxseg7ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_i16mf2(...) __riscv_vsoxseg8ei16_v_i16mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m1(...) __riscv_vsoxseg2ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg3ei16_v_i16m1(...) __riscv_vsoxseg3ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg4ei16_v_i16m1(...) __riscv_vsoxseg4ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg5ei16_v_i16m1(...) __riscv_vsoxseg5ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg6ei16_v_i16m1(...) __riscv_vsoxseg6ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg7ei16_v_i16m1(...) __riscv_vsoxseg7ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg8ei16_v_i16m1(...) __riscv_vsoxseg8ei16_v_i16m1(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m2(...) __riscv_vsoxseg2ei16_v_i16m2(__VA_ARGS__) +#define vsoxseg3ei16_v_i16m2(...) __riscv_vsoxseg3ei16_v_i16m2(__VA_ARGS__) +#define vsoxseg4ei16_v_i16m2(...) __riscv_vsoxseg4ei16_v_i16m2(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m4(...) __riscv_vsoxseg2ei16_v_i16m4(__VA_ARGS__) +#define vsoxseg2ei32_v_i16mf4(...) __riscv_vsoxseg2ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg3ei32_v_i16mf4(...) __riscv_vsoxseg3ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg4ei32_v_i16mf4(...) __riscv_vsoxseg4ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg5ei32_v_i16mf4(...) __riscv_vsoxseg5ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg6ei32_v_i16mf4(...) __riscv_vsoxseg6ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg7ei32_v_i16mf4(...) __riscv_vsoxseg7ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg8ei32_v_i16mf4(...) __riscv_vsoxseg8ei32_v_i16mf4(__VA_ARGS__) +#define vsoxseg2ei32_v_i16mf2(...) __riscv_vsoxseg2ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_i16mf2(...) __riscv_vsoxseg3ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_i16mf2(...) __riscv_vsoxseg4ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_i16mf2(...) __riscv_vsoxseg5ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_i16mf2(...) __riscv_vsoxseg6ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_i16mf2(...) __riscv_vsoxseg7ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_i16mf2(...) __riscv_vsoxseg8ei32_v_i16mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m1(...) __riscv_vsoxseg2ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg3ei32_v_i16m1(...) __riscv_vsoxseg3ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg4ei32_v_i16m1(...) __riscv_vsoxseg4ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg5ei32_v_i16m1(...) __riscv_vsoxseg5ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg6ei32_v_i16m1(...) __riscv_vsoxseg6ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg7ei32_v_i16m1(...) __riscv_vsoxseg7ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg8ei32_v_i16m1(...) __riscv_vsoxseg8ei32_v_i16m1(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m2(...) __riscv_vsoxseg2ei32_v_i16m2(__VA_ARGS__) +#define vsoxseg3ei32_v_i16m2(...) __riscv_vsoxseg3ei32_v_i16m2(__VA_ARGS__) +#define vsoxseg4ei32_v_i16m2(...) __riscv_vsoxseg4ei32_v_i16m2(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m4(...) __riscv_vsoxseg2ei32_v_i16m4(__VA_ARGS__) +#define vsoxseg2ei64_v_i16mf4(...) __riscv_vsoxseg2ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg3ei64_v_i16mf4(...) __riscv_vsoxseg3ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg4ei64_v_i16mf4(...) __riscv_vsoxseg4ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg5ei64_v_i16mf4(...) __riscv_vsoxseg5ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg6ei64_v_i16mf4(...) __riscv_vsoxseg6ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg7ei64_v_i16mf4(...) __riscv_vsoxseg7ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg8ei64_v_i16mf4(...) __riscv_vsoxseg8ei64_v_i16mf4(__VA_ARGS__) +#define vsoxseg2ei64_v_i16mf2(...) __riscv_vsoxseg2ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_i16mf2(...) __riscv_vsoxseg3ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_i16mf2(...) __riscv_vsoxseg4ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_i16mf2(...) __riscv_vsoxseg5ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_i16mf2(...) __riscv_vsoxseg6ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_i16mf2(...) __riscv_vsoxseg7ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_i16mf2(...) __riscv_vsoxseg8ei64_v_i16mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_i16m1(...) __riscv_vsoxseg2ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg3ei64_v_i16m1(...) __riscv_vsoxseg3ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg4ei64_v_i16m1(...) __riscv_vsoxseg4ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg5ei64_v_i16m1(...) __riscv_vsoxseg5ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg6ei64_v_i16m1(...) __riscv_vsoxseg6ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg7ei64_v_i16m1(...) __riscv_vsoxseg7ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg8ei64_v_i16m1(...) __riscv_vsoxseg8ei64_v_i16m1(__VA_ARGS__) +#define vsoxseg2ei64_v_i16m2(...) __riscv_vsoxseg2ei64_v_i16m2(__VA_ARGS__) +#define vsoxseg3ei64_v_i16m2(...) __riscv_vsoxseg3ei64_v_i16m2(__VA_ARGS__) +#define vsoxseg4ei64_v_i16m2(...) __riscv_vsoxseg4ei64_v_i16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_i32mf2(...) __riscv_vsoxseg2ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_i32mf2(...) __riscv_vsoxseg3ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_i32mf2(...) __riscv_vsoxseg4ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_i32mf2(...) __riscv_vsoxseg5ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_i32mf2(...) __riscv_vsoxseg6ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_i32mf2(...) __riscv_vsoxseg7ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_i32mf2(...) __riscv_vsoxseg8ei8_v_i32mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m1(...) __riscv_vsoxseg2ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg3ei8_v_i32m1(...) __riscv_vsoxseg3ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg4ei8_v_i32m1(...) __riscv_vsoxseg4ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg5ei8_v_i32m1(...) __riscv_vsoxseg5ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg6ei8_v_i32m1(...) __riscv_vsoxseg6ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg7ei8_v_i32m1(...) __riscv_vsoxseg7ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg8ei8_v_i32m1(...) __riscv_vsoxseg8ei8_v_i32m1(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m2(...) __riscv_vsoxseg2ei8_v_i32m2(__VA_ARGS__) +#define vsoxseg3ei8_v_i32m2(...) __riscv_vsoxseg3ei8_v_i32m2(__VA_ARGS__) +#define vsoxseg4ei8_v_i32m2(...) __riscv_vsoxseg4ei8_v_i32m2(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m4(...) __riscv_vsoxseg2ei8_v_i32m4(__VA_ARGS__) +#define vsoxseg2ei16_v_i32mf2(...) __riscv_vsoxseg2ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_i32mf2(...) __riscv_vsoxseg3ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_i32mf2(...) __riscv_vsoxseg4ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_i32mf2(...) __riscv_vsoxseg5ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_i32mf2(...) __riscv_vsoxseg6ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_i32mf2(...) __riscv_vsoxseg7ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_i32mf2(...) __riscv_vsoxseg8ei16_v_i32mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m1(...) __riscv_vsoxseg2ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg3ei16_v_i32m1(...) __riscv_vsoxseg3ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg4ei16_v_i32m1(...) __riscv_vsoxseg4ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg5ei16_v_i32m1(...) __riscv_vsoxseg5ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg6ei16_v_i32m1(...) __riscv_vsoxseg6ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg7ei16_v_i32m1(...) __riscv_vsoxseg7ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg8ei16_v_i32m1(...) __riscv_vsoxseg8ei16_v_i32m1(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m2(...) __riscv_vsoxseg2ei16_v_i32m2(__VA_ARGS__) +#define vsoxseg3ei16_v_i32m2(...) __riscv_vsoxseg3ei16_v_i32m2(__VA_ARGS__) +#define vsoxseg4ei16_v_i32m2(...) __riscv_vsoxseg4ei16_v_i32m2(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m4(...) __riscv_vsoxseg2ei16_v_i32m4(__VA_ARGS__) +#define vsoxseg2ei32_v_i32mf2(...) __riscv_vsoxseg2ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_i32mf2(...) __riscv_vsoxseg3ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_i32mf2(...) __riscv_vsoxseg4ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_i32mf2(...) __riscv_vsoxseg5ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_i32mf2(...) __riscv_vsoxseg6ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_i32mf2(...) __riscv_vsoxseg7ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_i32mf2(...) __riscv_vsoxseg8ei32_v_i32mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m1(...) __riscv_vsoxseg2ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg3ei32_v_i32m1(...) __riscv_vsoxseg3ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg4ei32_v_i32m1(...) __riscv_vsoxseg4ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg5ei32_v_i32m1(...) __riscv_vsoxseg5ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg6ei32_v_i32m1(...) __riscv_vsoxseg6ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg7ei32_v_i32m1(...) __riscv_vsoxseg7ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg8ei32_v_i32m1(...) __riscv_vsoxseg8ei32_v_i32m1(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m2(...) __riscv_vsoxseg2ei32_v_i32m2(__VA_ARGS__) +#define vsoxseg3ei32_v_i32m2(...) __riscv_vsoxseg3ei32_v_i32m2(__VA_ARGS__) +#define vsoxseg4ei32_v_i32m2(...) __riscv_vsoxseg4ei32_v_i32m2(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m4(...) __riscv_vsoxseg2ei32_v_i32m4(__VA_ARGS__) +#define vsoxseg2ei64_v_i32mf2(...) __riscv_vsoxseg2ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_i32mf2(...) __riscv_vsoxseg3ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_i32mf2(...) __riscv_vsoxseg4ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_i32mf2(...) __riscv_vsoxseg5ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_i32mf2(...) __riscv_vsoxseg6ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_i32mf2(...) __riscv_vsoxseg7ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_i32mf2(...) __riscv_vsoxseg8ei64_v_i32mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m1(...) __riscv_vsoxseg2ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg3ei64_v_i32m1(...) __riscv_vsoxseg3ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg4ei64_v_i32m1(...) __riscv_vsoxseg4ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg5ei64_v_i32m1(...) __riscv_vsoxseg5ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg6ei64_v_i32m1(...) __riscv_vsoxseg6ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg7ei64_v_i32m1(...) __riscv_vsoxseg7ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg8ei64_v_i32m1(...) __riscv_vsoxseg8ei64_v_i32m1(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m2(...) __riscv_vsoxseg2ei64_v_i32m2(__VA_ARGS__) +#define vsoxseg3ei64_v_i32m2(...) __riscv_vsoxseg3ei64_v_i32m2(__VA_ARGS__) +#define vsoxseg4ei64_v_i32m2(...) __riscv_vsoxseg4ei64_v_i32m2(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m4(...) __riscv_vsoxseg2ei64_v_i32m4(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m1(...) __riscv_vsoxseg2ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg3ei8_v_i64m1(...) __riscv_vsoxseg3ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg4ei8_v_i64m1(...) __riscv_vsoxseg4ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg5ei8_v_i64m1(...) __riscv_vsoxseg5ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg6ei8_v_i64m1(...) __riscv_vsoxseg6ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg7ei8_v_i64m1(...) __riscv_vsoxseg7ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg8ei8_v_i64m1(...) __riscv_vsoxseg8ei8_v_i64m1(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m2(...) __riscv_vsoxseg2ei8_v_i64m2(__VA_ARGS__) +#define vsoxseg3ei8_v_i64m2(...) __riscv_vsoxseg3ei8_v_i64m2(__VA_ARGS__) +#define vsoxseg4ei8_v_i64m2(...) __riscv_vsoxseg4ei8_v_i64m2(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m4(...) __riscv_vsoxseg2ei8_v_i64m4(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m1(...) __riscv_vsoxseg2ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg3ei16_v_i64m1(...) __riscv_vsoxseg3ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg4ei16_v_i64m1(...) __riscv_vsoxseg4ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg5ei16_v_i64m1(...) __riscv_vsoxseg5ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg6ei16_v_i64m1(...) __riscv_vsoxseg6ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg7ei16_v_i64m1(...) __riscv_vsoxseg7ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg8ei16_v_i64m1(...) __riscv_vsoxseg8ei16_v_i64m1(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m2(...) __riscv_vsoxseg2ei16_v_i64m2(__VA_ARGS__) +#define vsoxseg3ei16_v_i64m2(...) __riscv_vsoxseg3ei16_v_i64m2(__VA_ARGS__) +#define vsoxseg4ei16_v_i64m2(...) __riscv_vsoxseg4ei16_v_i64m2(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m4(...) __riscv_vsoxseg2ei16_v_i64m4(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m1(...) __riscv_vsoxseg2ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg3ei32_v_i64m1(...) __riscv_vsoxseg3ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg4ei32_v_i64m1(...) __riscv_vsoxseg4ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg5ei32_v_i64m1(...) __riscv_vsoxseg5ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg6ei32_v_i64m1(...) __riscv_vsoxseg6ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg7ei32_v_i64m1(...) __riscv_vsoxseg7ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg8ei32_v_i64m1(...) __riscv_vsoxseg8ei32_v_i64m1(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m2(...) __riscv_vsoxseg2ei32_v_i64m2(__VA_ARGS__) +#define vsoxseg3ei32_v_i64m2(...) __riscv_vsoxseg3ei32_v_i64m2(__VA_ARGS__) +#define vsoxseg4ei32_v_i64m2(...) __riscv_vsoxseg4ei32_v_i64m2(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m4(...) __riscv_vsoxseg2ei32_v_i64m4(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m1(...) __riscv_vsoxseg2ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg3ei64_v_i64m1(...) __riscv_vsoxseg3ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg4ei64_v_i64m1(...) __riscv_vsoxseg4ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg5ei64_v_i64m1(...) __riscv_vsoxseg5ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg6ei64_v_i64m1(...) __riscv_vsoxseg6ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg7ei64_v_i64m1(...) __riscv_vsoxseg7ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg8ei64_v_i64m1(...) __riscv_vsoxseg8ei64_v_i64m1(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m2(...) __riscv_vsoxseg2ei64_v_i64m2(__VA_ARGS__) +#define vsoxseg3ei64_v_i64m2(...) __riscv_vsoxseg3ei64_v_i64m2(__VA_ARGS__) +#define vsoxseg4ei64_v_i64m2(...) __riscv_vsoxseg4ei64_v_i64m2(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m4(...) __riscv_vsoxseg2ei64_v_i64m4(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf8(...) __riscv_vsuxseg2ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf8(...) __riscv_vsuxseg3ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf8(...) __riscv_vsuxseg4ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf8(...) __riscv_vsuxseg5ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf8(...) __riscv_vsuxseg6ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf8(...) __riscv_vsuxseg7ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf8(...) __riscv_vsuxseg8ei8_v_i8mf8(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf4(...) __riscv_vsuxseg2ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf4(...) __riscv_vsuxseg3ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf4(...) __riscv_vsuxseg4ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf4(...) __riscv_vsuxseg5ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf4(...) __riscv_vsuxseg6ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf4(...) __riscv_vsuxseg7ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf4(...) __riscv_vsuxseg8ei8_v_i8mf4(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf2(...) __riscv_vsuxseg2ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf2(...) __riscv_vsuxseg3ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf2(...) __riscv_vsuxseg4ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf2(...) __riscv_vsuxseg5ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf2(...) __riscv_vsuxseg6ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf2(...) __riscv_vsuxseg7ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf2(...) __riscv_vsuxseg8ei8_v_i8mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m1(...) __riscv_vsuxseg2ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg3ei8_v_i8m1(...) __riscv_vsuxseg3ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg4ei8_v_i8m1(...) __riscv_vsuxseg4ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg5ei8_v_i8m1(...) __riscv_vsuxseg5ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg6ei8_v_i8m1(...) __riscv_vsuxseg6ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg7ei8_v_i8m1(...) __riscv_vsuxseg7ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg8ei8_v_i8m1(...) __riscv_vsuxseg8ei8_v_i8m1(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m2(...) __riscv_vsuxseg2ei8_v_i8m2(__VA_ARGS__) +#define vsuxseg3ei8_v_i8m2(...) __riscv_vsuxseg3ei8_v_i8m2(__VA_ARGS__) +#define vsuxseg4ei8_v_i8m2(...) __riscv_vsuxseg4ei8_v_i8m2(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m4(...) __riscv_vsuxseg2ei8_v_i8m4(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf8(...) __riscv_vsuxseg2ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf8(...) __riscv_vsuxseg3ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf8(...) __riscv_vsuxseg4ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf8(...) __riscv_vsuxseg5ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf8(...) __riscv_vsuxseg6ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf8(...) __riscv_vsuxseg7ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf8(...) __riscv_vsuxseg8ei16_v_i8mf8(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf4(...) __riscv_vsuxseg2ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf4(...) __riscv_vsuxseg3ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf4(...) __riscv_vsuxseg4ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf4(...) __riscv_vsuxseg5ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf4(...) __riscv_vsuxseg6ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf4(...) __riscv_vsuxseg7ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf4(...) __riscv_vsuxseg8ei16_v_i8mf4(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf2(...) __riscv_vsuxseg2ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf2(...) __riscv_vsuxseg3ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf2(...) __riscv_vsuxseg4ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf2(...) __riscv_vsuxseg5ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf2(...) __riscv_vsuxseg6ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf2(...) __riscv_vsuxseg7ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf2(...) __riscv_vsuxseg8ei16_v_i8mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m1(...) __riscv_vsuxseg2ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg3ei16_v_i8m1(...) __riscv_vsuxseg3ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg4ei16_v_i8m1(...) __riscv_vsuxseg4ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg5ei16_v_i8m1(...) __riscv_vsuxseg5ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg6ei16_v_i8m1(...) __riscv_vsuxseg6ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg7ei16_v_i8m1(...) __riscv_vsuxseg7ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg8ei16_v_i8m1(...) __riscv_vsuxseg8ei16_v_i8m1(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m2(...) __riscv_vsuxseg2ei16_v_i8m2(__VA_ARGS__) +#define vsuxseg3ei16_v_i8m2(...) __riscv_vsuxseg3ei16_v_i8m2(__VA_ARGS__) +#define vsuxseg4ei16_v_i8m2(...) __riscv_vsuxseg4ei16_v_i8m2(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m4(...) __riscv_vsuxseg2ei16_v_i8m4(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf8(...) __riscv_vsuxseg2ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf8(...) __riscv_vsuxseg3ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf8(...) __riscv_vsuxseg4ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf8(...) __riscv_vsuxseg5ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf8(...) __riscv_vsuxseg6ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf8(...) __riscv_vsuxseg7ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf8(...) __riscv_vsuxseg8ei32_v_i8mf8(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf4(...) __riscv_vsuxseg2ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf4(...) __riscv_vsuxseg3ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf4(...) __riscv_vsuxseg4ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf4(...) __riscv_vsuxseg5ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf4(...) __riscv_vsuxseg6ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf4(...) __riscv_vsuxseg7ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf4(...) __riscv_vsuxseg8ei32_v_i8mf4(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf2(...) __riscv_vsuxseg2ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf2(...) __riscv_vsuxseg3ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf2(...) __riscv_vsuxseg4ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf2(...) __riscv_vsuxseg5ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf2(...) __riscv_vsuxseg6ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf2(...) __riscv_vsuxseg7ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf2(...) __riscv_vsuxseg8ei32_v_i8mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_i8m1(...) __riscv_vsuxseg2ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg3ei32_v_i8m1(...) __riscv_vsuxseg3ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg4ei32_v_i8m1(...) __riscv_vsuxseg4ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg5ei32_v_i8m1(...) __riscv_vsuxseg5ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg6ei32_v_i8m1(...) __riscv_vsuxseg6ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg7ei32_v_i8m1(...) __riscv_vsuxseg7ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg8ei32_v_i8m1(...) __riscv_vsuxseg8ei32_v_i8m1(__VA_ARGS__) +#define vsuxseg2ei32_v_i8m2(...) __riscv_vsuxseg2ei32_v_i8m2(__VA_ARGS__) +#define vsuxseg3ei32_v_i8m2(...) __riscv_vsuxseg3ei32_v_i8m2(__VA_ARGS__) +#define vsuxseg4ei32_v_i8m2(...) __riscv_vsuxseg4ei32_v_i8m2(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf8(...) __riscv_vsuxseg2ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf8(...) __riscv_vsuxseg3ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf8(...) __riscv_vsuxseg4ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf8(...) __riscv_vsuxseg5ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf8(...) __riscv_vsuxseg6ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf8(...) __riscv_vsuxseg7ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf8(...) __riscv_vsuxseg8ei64_v_i8mf8(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf4(...) __riscv_vsuxseg2ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf4(...) __riscv_vsuxseg3ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf4(...) __riscv_vsuxseg4ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf4(...) __riscv_vsuxseg5ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf4(...) __riscv_vsuxseg6ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf4(...) __riscv_vsuxseg7ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf4(...) __riscv_vsuxseg8ei64_v_i8mf4(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf2(...) __riscv_vsuxseg2ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf2(...) __riscv_vsuxseg3ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf2(...) __riscv_vsuxseg4ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf2(...) __riscv_vsuxseg5ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf2(...) __riscv_vsuxseg6ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf2(...) __riscv_vsuxseg7ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf2(...) __riscv_vsuxseg8ei64_v_i8mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_i8m1(...) __riscv_vsuxseg2ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg3ei64_v_i8m1(...) __riscv_vsuxseg3ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg4ei64_v_i8m1(...) __riscv_vsuxseg4ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg5ei64_v_i8m1(...) __riscv_vsuxseg5ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg6ei64_v_i8m1(...) __riscv_vsuxseg6ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg7ei64_v_i8m1(...) __riscv_vsuxseg7ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg8ei64_v_i8m1(...) __riscv_vsuxseg8ei64_v_i8m1(__VA_ARGS__) +#define vsuxseg2ei8_v_i16mf4(...) __riscv_vsuxseg2ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg3ei8_v_i16mf4(...) __riscv_vsuxseg3ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg4ei8_v_i16mf4(...) __riscv_vsuxseg4ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg5ei8_v_i16mf4(...) __riscv_vsuxseg5ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg6ei8_v_i16mf4(...) __riscv_vsuxseg6ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg7ei8_v_i16mf4(...) __riscv_vsuxseg7ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg8ei8_v_i16mf4(...) __riscv_vsuxseg8ei8_v_i16mf4(__VA_ARGS__) +#define vsuxseg2ei8_v_i16mf2(...) __riscv_vsuxseg2ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_i16mf2(...) __riscv_vsuxseg3ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_i16mf2(...) __riscv_vsuxseg4ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_i16mf2(...) __riscv_vsuxseg5ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_i16mf2(...) __riscv_vsuxseg6ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_i16mf2(...) __riscv_vsuxseg7ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_i16mf2(...) __riscv_vsuxseg8ei8_v_i16mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m1(...) __riscv_vsuxseg2ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg3ei8_v_i16m1(...) __riscv_vsuxseg3ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg4ei8_v_i16m1(...) __riscv_vsuxseg4ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg5ei8_v_i16m1(...) __riscv_vsuxseg5ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg6ei8_v_i16m1(...) __riscv_vsuxseg6ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg7ei8_v_i16m1(...) __riscv_vsuxseg7ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg8ei8_v_i16m1(...) __riscv_vsuxseg8ei8_v_i16m1(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m2(...) __riscv_vsuxseg2ei8_v_i16m2(__VA_ARGS__) +#define vsuxseg3ei8_v_i16m2(...) __riscv_vsuxseg3ei8_v_i16m2(__VA_ARGS__) +#define vsuxseg4ei8_v_i16m2(...) __riscv_vsuxseg4ei8_v_i16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m4(...) __riscv_vsuxseg2ei8_v_i16m4(__VA_ARGS__) +#define vsuxseg2ei16_v_i16mf4(...) __riscv_vsuxseg2ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg3ei16_v_i16mf4(...) __riscv_vsuxseg3ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg4ei16_v_i16mf4(...) __riscv_vsuxseg4ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg5ei16_v_i16mf4(...) __riscv_vsuxseg5ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg6ei16_v_i16mf4(...) __riscv_vsuxseg6ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg7ei16_v_i16mf4(...) __riscv_vsuxseg7ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg8ei16_v_i16mf4(...) __riscv_vsuxseg8ei16_v_i16mf4(__VA_ARGS__) +#define vsuxseg2ei16_v_i16mf2(...) __riscv_vsuxseg2ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_i16mf2(...) __riscv_vsuxseg3ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_i16mf2(...) __riscv_vsuxseg4ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_i16mf2(...) __riscv_vsuxseg5ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_i16mf2(...) __riscv_vsuxseg6ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_i16mf2(...) __riscv_vsuxseg7ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_i16mf2(...) __riscv_vsuxseg8ei16_v_i16mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m1(...) __riscv_vsuxseg2ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg3ei16_v_i16m1(...) __riscv_vsuxseg3ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg4ei16_v_i16m1(...) __riscv_vsuxseg4ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg5ei16_v_i16m1(...) __riscv_vsuxseg5ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg6ei16_v_i16m1(...) __riscv_vsuxseg6ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg7ei16_v_i16m1(...) __riscv_vsuxseg7ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg8ei16_v_i16m1(...) __riscv_vsuxseg8ei16_v_i16m1(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m2(...) __riscv_vsuxseg2ei16_v_i16m2(__VA_ARGS__) +#define vsuxseg3ei16_v_i16m2(...) __riscv_vsuxseg3ei16_v_i16m2(__VA_ARGS__) +#define vsuxseg4ei16_v_i16m2(...) __riscv_vsuxseg4ei16_v_i16m2(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m4(...) __riscv_vsuxseg2ei16_v_i16m4(__VA_ARGS__) +#define vsuxseg2ei32_v_i16mf4(...) __riscv_vsuxseg2ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg3ei32_v_i16mf4(...) __riscv_vsuxseg3ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg4ei32_v_i16mf4(...) __riscv_vsuxseg4ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg5ei32_v_i16mf4(...) __riscv_vsuxseg5ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg6ei32_v_i16mf4(...) __riscv_vsuxseg6ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg7ei32_v_i16mf4(...) __riscv_vsuxseg7ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg8ei32_v_i16mf4(...) __riscv_vsuxseg8ei32_v_i16mf4(__VA_ARGS__) +#define vsuxseg2ei32_v_i16mf2(...) __riscv_vsuxseg2ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_i16mf2(...) __riscv_vsuxseg3ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_i16mf2(...) __riscv_vsuxseg4ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_i16mf2(...) __riscv_vsuxseg5ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_i16mf2(...) __riscv_vsuxseg6ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_i16mf2(...) __riscv_vsuxseg7ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_i16mf2(...) __riscv_vsuxseg8ei32_v_i16mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m1(...) __riscv_vsuxseg2ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg3ei32_v_i16m1(...) __riscv_vsuxseg3ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg4ei32_v_i16m1(...) __riscv_vsuxseg4ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg5ei32_v_i16m1(...) __riscv_vsuxseg5ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg6ei32_v_i16m1(...) __riscv_vsuxseg6ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg7ei32_v_i16m1(...) __riscv_vsuxseg7ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg8ei32_v_i16m1(...) __riscv_vsuxseg8ei32_v_i16m1(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m2(...) __riscv_vsuxseg2ei32_v_i16m2(__VA_ARGS__) +#define vsuxseg3ei32_v_i16m2(...) __riscv_vsuxseg3ei32_v_i16m2(__VA_ARGS__) +#define vsuxseg4ei32_v_i16m2(...) __riscv_vsuxseg4ei32_v_i16m2(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m4(...) __riscv_vsuxseg2ei32_v_i16m4(__VA_ARGS__) +#define vsuxseg2ei64_v_i16mf4(...) __riscv_vsuxseg2ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg3ei64_v_i16mf4(...) __riscv_vsuxseg3ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg4ei64_v_i16mf4(...) __riscv_vsuxseg4ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg5ei64_v_i16mf4(...) __riscv_vsuxseg5ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg6ei64_v_i16mf4(...) __riscv_vsuxseg6ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg7ei64_v_i16mf4(...) __riscv_vsuxseg7ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg8ei64_v_i16mf4(...) __riscv_vsuxseg8ei64_v_i16mf4(__VA_ARGS__) +#define vsuxseg2ei64_v_i16mf2(...) __riscv_vsuxseg2ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_i16mf2(...) __riscv_vsuxseg3ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_i16mf2(...) __riscv_vsuxseg4ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_i16mf2(...) __riscv_vsuxseg5ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_i16mf2(...) __riscv_vsuxseg6ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_i16mf2(...) __riscv_vsuxseg7ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_i16mf2(...) __riscv_vsuxseg8ei64_v_i16mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_i16m1(...) __riscv_vsuxseg2ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg3ei64_v_i16m1(...) __riscv_vsuxseg3ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg4ei64_v_i16m1(...) __riscv_vsuxseg4ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg5ei64_v_i16m1(...) __riscv_vsuxseg5ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg6ei64_v_i16m1(...) __riscv_vsuxseg6ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg7ei64_v_i16m1(...) __riscv_vsuxseg7ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg8ei64_v_i16m1(...) __riscv_vsuxseg8ei64_v_i16m1(__VA_ARGS__) +#define vsuxseg2ei64_v_i16m2(...) __riscv_vsuxseg2ei64_v_i16m2(__VA_ARGS__) +#define vsuxseg3ei64_v_i16m2(...) __riscv_vsuxseg3ei64_v_i16m2(__VA_ARGS__) +#define vsuxseg4ei64_v_i16m2(...) __riscv_vsuxseg4ei64_v_i16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_i32mf2(...) __riscv_vsuxseg2ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_i32mf2(...) __riscv_vsuxseg3ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_i32mf2(...) __riscv_vsuxseg4ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_i32mf2(...) __riscv_vsuxseg5ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_i32mf2(...) __riscv_vsuxseg6ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_i32mf2(...) __riscv_vsuxseg7ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_i32mf2(...) __riscv_vsuxseg8ei8_v_i32mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m1(...) __riscv_vsuxseg2ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg3ei8_v_i32m1(...) __riscv_vsuxseg3ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg4ei8_v_i32m1(...) __riscv_vsuxseg4ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg5ei8_v_i32m1(...) __riscv_vsuxseg5ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg6ei8_v_i32m1(...) __riscv_vsuxseg6ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg7ei8_v_i32m1(...) __riscv_vsuxseg7ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg8ei8_v_i32m1(...) __riscv_vsuxseg8ei8_v_i32m1(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m2(...) __riscv_vsuxseg2ei8_v_i32m2(__VA_ARGS__) +#define vsuxseg3ei8_v_i32m2(...) __riscv_vsuxseg3ei8_v_i32m2(__VA_ARGS__) +#define vsuxseg4ei8_v_i32m2(...) __riscv_vsuxseg4ei8_v_i32m2(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m4(...) __riscv_vsuxseg2ei8_v_i32m4(__VA_ARGS__) +#define vsuxseg2ei16_v_i32mf2(...) __riscv_vsuxseg2ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_i32mf2(...) __riscv_vsuxseg3ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_i32mf2(...) __riscv_vsuxseg4ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_i32mf2(...) __riscv_vsuxseg5ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_i32mf2(...) __riscv_vsuxseg6ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_i32mf2(...) __riscv_vsuxseg7ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_i32mf2(...) __riscv_vsuxseg8ei16_v_i32mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m1(...) __riscv_vsuxseg2ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg3ei16_v_i32m1(...) __riscv_vsuxseg3ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg4ei16_v_i32m1(...) __riscv_vsuxseg4ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg5ei16_v_i32m1(...) __riscv_vsuxseg5ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg6ei16_v_i32m1(...) __riscv_vsuxseg6ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg7ei16_v_i32m1(...) __riscv_vsuxseg7ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg8ei16_v_i32m1(...) __riscv_vsuxseg8ei16_v_i32m1(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m2(...) __riscv_vsuxseg2ei16_v_i32m2(__VA_ARGS__) +#define vsuxseg3ei16_v_i32m2(...) __riscv_vsuxseg3ei16_v_i32m2(__VA_ARGS__) +#define vsuxseg4ei16_v_i32m2(...) __riscv_vsuxseg4ei16_v_i32m2(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m4(...) __riscv_vsuxseg2ei16_v_i32m4(__VA_ARGS__) +#define vsuxseg2ei32_v_i32mf2(...) __riscv_vsuxseg2ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_i32mf2(...) __riscv_vsuxseg3ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_i32mf2(...) __riscv_vsuxseg4ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_i32mf2(...) __riscv_vsuxseg5ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_i32mf2(...) __riscv_vsuxseg6ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_i32mf2(...) __riscv_vsuxseg7ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_i32mf2(...) __riscv_vsuxseg8ei32_v_i32mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m1(...) __riscv_vsuxseg2ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg3ei32_v_i32m1(...) __riscv_vsuxseg3ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg4ei32_v_i32m1(...) __riscv_vsuxseg4ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg5ei32_v_i32m1(...) __riscv_vsuxseg5ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg6ei32_v_i32m1(...) __riscv_vsuxseg6ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg7ei32_v_i32m1(...) __riscv_vsuxseg7ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg8ei32_v_i32m1(...) __riscv_vsuxseg8ei32_v_i32m1(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m2(...) __riscv_vsuxseg2ei32_v_i32m2(__VA_ARGS__) +#define vsuxseg3ei32_v_i32m2(...) __riscv_vsuxseg3ei32_v_i32m2(__VA_ARGS__) +#define vsuxseg4ei32_v_i32m2(...) __riscv_vsuxseg4ei32_v_i32m2(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m4(...) __riscv_vsuxseg2ei32_v_i32m4(__VA_ARGS__) +#define vsuxseg2ei64_v_i32mf2(...) __riscv_vsuxseg2ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_i32mf2(...) __riscv_vsuxseg3ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_i32mf2(...) __riscv_vsuxseg4ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_i32mf2(...) __riscv_vsuxseg5ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_i32mf2(...) __riscv_vsuxseg6ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_i32mf2(...) __riscv_vsuxseg7ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_i32mf2(...) __riscv_vsuxseg8ei64_v_i32mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m1(...) __riscv_vsuxseg2ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg3ei64_v_i32m1(...) __riscv_vsuxseg3ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg4ei64_v_i32m1(...) __riscv_vsuxseg4ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg5ei64_v_i32m1(...) __riscv_vsuxseg5ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg6ei64_v_i32m1(...) __riscv_vsuxseg6ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg7ei64_v_i32m1(...) __riscv_vsuxseg7ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg8ei64_v_i32m1(...) __riscv_vsuxseg8ei64_v_i32m1(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m2(...) __riscv_vsuxseg2ei64_v_i32m2(__VA_ARGS__) +#define vsuxseg3ei64_v_i32m2(...) __riscv_vsuxseg3ei64_v_i32m2(__VA_ARGS__) +#define vsuxseg4ei64_v_i32m2(...) __riscv_vsuxseg4ei64_v_i32m2(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m4(...) __riscv_vsuxseg2ei64_v_i32m4(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m1(...) __riscv_vsuxseg2ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg3ei8_v_i64m1(...) __riscv_vsuxseg3ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg4ei8_v_i64m1(...) __riscv_vsuxseg4ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg5ei8_v_i64m1(...) __riscv_vsuxseg5ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg6ei8_v_i64m1(...) __riscv_vsuxseg6ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg7ei8_v_i64m1(...) __riscv_vsuxseg7ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg8ei8_v_i64m1(...) __riscv_vsuxseg8ei8_v_i64m1(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m2(...) __riscv_vsuxseg2ei8_v_i64m2(__VA_ARGS__) +#define vsuxseg3ei8_v_i64m2(...) __riscv_vsuxseg3ei8_v_i64m2(__VA_ARGS__) +#define vsuxseg4ei8_v_i64m2(...) __riscv_vsuxseg4ei8_v_i64m2(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m4(...) __riscv_vsuxseg2ei8_v_i64m4(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m1(...) __riscv_vsuxseg2ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg3ei16_v_i64m1(...) __riscv_vsuxseg3ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg4ei16_v_i64m1(...) __riscv_vsuxseg4ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg5ei16_v_i64m1(...) __riscv_vsuxseg5ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg6ei16_v_i64m1(...) __riscv_vsuxseg6ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg7ei16_v_i64m1(...) __riscv_vsuxseg7ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg8ei16_v_i64m1(...) __riscv_vsuxseg8ei16_v_i64m1(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m2(...) __riscv_vsuxseg2ei16_v_i64m2(__VA_ARGS__) +#define vsuxseg3ei16_v_i64m2(...) __riscv_vsuxseg3ei16_v_i64m2(__VA_ARGS__) +#define vsuxseg4ei16_v_i64m2(...) __riscv_vsuxseg4ei16_v_i64m2(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m4(...) __riscv_vsuxseg2ei16_v_i64m4(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m1(...) __riscv_vsuxseg2ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg3ei32_v_i64m1(...) __riscv_vsuxseg3ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg4ei32_v_i64m1(...) __riscv_vsuxseg4ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg5ei32_v_i64m1(...) __riscv_vsuxseg5ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg6ei32_v_i64m1(...) __riscv_vsuxseg6ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg7ei32_v_i64m1(...) __riscv_vsuxseg7ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg8ei32_v_i64m1(...) __riscv_vsuxseg8ei32_v_i64m1(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m2(...) __riscv_vsuxseg2ei32_v_i64m2(__VA_ARGS__) +#define vsuxseg3ei32_v_i64m2(...) __riscv_vsuxseg3ei32_v_i64m2(__VA_ARGS__) +#define vsuxseg4ei32_v_i64m2(...) __riscv_vsuxseg4ei32_v_i64m2(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m4(...) __riscv_vsuxseg2ei32_v_i64m4(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m1(...) __riscv_vsuxseg2ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg3ei64_v_i64m1(...) __riscv_vsuxseg3ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg4ei64_v_i64m1(...) __riscv_vsuxseg4ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg5ei64_v_i64m1(...) __riscv_vsuxseg5ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg6ei64_v_i64m1(...) __riscv_vsuxseg6ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg7ei64_v_i64m1(...) __riscv_vsuxseg7ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg8ei64_v_i64m1(...) __riscv_vsuxseg8ei64_v_i64m1(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m2(...) __riscv_vsuxseg2ei64_v_i64m2(__VA_ARGS__) +#define vsuxseg3ei64_v_i64m2(...) __riscv_vsuxseg3ei64_v_i64m2(__VA_ARGS__) +#define vsuxseg4ei64_v_i64m2(...) __riscv_vsuxseg4ei64_v_i64m2(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m4(...) __riscv_vsuxseg2ei64_v_i64m4(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf8(...) __riscv_vsoxseg2ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf8(...) __riscv_vsoxseg3ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf8(...) __riscv_vsoxseg4ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf8(...) __riscv_vsoxseg5ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf8(...) __riscv_vsoxseg6ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf8(...) __riscv_vsoxseg7ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf8(...) __riscv_vsoxseg8ei8_v_u8mf8(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf4(...) __riscv_vsoxseg2ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf4(...) __riscv_vsoxseg3ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf4(...) __riscv_vsoxseg4ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf4(...) __riscv_vsoxseg5ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf4(...) __riscv_vsoxseg6ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf4(...) __riscv_vsoxseg7ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf4(...) __riscv_vsoxseg8ei8_v_u8mf4(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf2(...) __riscv_vsoxseg2ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf2(...) __riscv_vsoxseg3ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf2(...) __riscv_vsoxseg4ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf2(...) __riscv_vsoxseg5ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf2(...) __riscv_vsoxseg6ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf2(...) __riscv_vsoxseg7ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf2(...) __riscv_vsoxseg8ei8_v_u8mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m1(...) __riscv_vsoxseg2ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg3ei8_v_u8m1(...) __riscv_vsoxseg3ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg4ei8_v_u8m1(...) __riscv_vsoxseg4ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg5ei8_v_u8m1(...) __riscv_vsoxseg5ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg6ei8_v_u8m1(...) __riscv_vsoxseg6ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg7ei8_v_u8m1(...) __riscv_vsoxseg7ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg8ei8_v_u8m1(...) __riscv_vsoxseg8ei8_v_u8m1(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m2(...) __riscv_vsoxseg2ei8_v_u8m2(__VA_ARGS__) +#define vsoxseg3ei8_v_u8m2(...) __riscv_vsoxseg3ei8_v_u8m2(__VA_ARGS__) +#define vsoxseg4ei8_v_u8m2(...) __riscv_vsoxseg4ei8_v_u8m2(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m4(...) __riscv_vsoxseg2ei8_v_u8m4(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf8(...) __riscv_vsoxseg2ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf8(...) __riscv_vsoxseg3ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf8(...) __riscv_vsoxseg4ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf8(...) __riscv_vsoxseg5ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf8(...) __riscv_vsoxseg6ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf8(...) __riscv_vsoxseg7ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf8(...) __riscv_vsoxseg8ei16_v_u8mf8(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf4(...) __riscv_vsoxseg2ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf4(...) __riscv_vsoxseg3ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf4(...) __riscv_vsoxseg4ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf4(...) __riscv_vsoxseg5ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf4(...) __riscv_vsoxseg6ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf4(...) __riscv_vsoxseg7ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf4(...) __riscv_vsoxseg8ei16_v_u8mf4(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf2(...) __riscv_vsoxseg2ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf2(...) __riscv_vsoxseg3ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf2(...) __riscv_vsoxseg4ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf2(...) __riscv_vsoxseg5ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf2(...) __riscv_vsoxseg6ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf2(...) __riscv_vsoxseg7ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf2(...) __riscv_vsoxseg8ei16_v_u8mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m1(...) __riscv_vsoxseg2ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg3ei16_v_u8m1(...) __riscv_vsoxseg3ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg4ei16_v_u8m1(...) __riscv_vsoxseg4ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg5ei16_v_u8m1(...) __riscv_vsoxseg5ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg6ei16_v_u8m1(...) __riscv_vsoxseg6ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg7ei16_v_u8m1(...) __riscv_vsoxseg7ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg8ei16_v_u8m1(...) __riscv_vsoxseg8ei16_v_u8m1(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m2(...) __riscv_vsoxseg2ei16_v_u8m2(__VA_ARGS__) +#define vsoxseg3ei16_v_u8m2(...) __riscv_vsoxseg3ei16_v_u8m2(__VA_ARGS__) +#define vsoxseg4ei16_v_u8m2(...) __riscv_vsoxseg4ei16_v_u8m2(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m4(...) __riscv_vsoxseg2ei16_v_u8m4(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf8(...) __riscv_vsoxseg2ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf8(...) __riscv_vsoxseg3ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf8(...) __riscv_vsoxseg4ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf8(...) __riscv_vsoxseg5ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf8(...) __riscv_vsoxseg6ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf8(...) __riscv_vsoxseg7ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf8(...) __riscv_vsoxseg8ei32_v_u8mf8(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf4(...) __riscv_vsoxseg2ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf4(...) __riscv_vsoxseg3ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf4(...) __riscv_vsoxseg4ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf4(...) __riscv_vsoxseg5ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf4(...) __riscv_vsoxseg6ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf4(...) __riscv_vsoxseg7ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf4(...) __riscv_vsoxseg8ei32_v_u8mf4(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf2(...) __riscv_vsoxseg2ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf2(...) __riscv_vsoxseg3ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf2(...) __riscv_vsoxseg4ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf2(...) __riscv_vsoxseg5ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf2(...) __riscv_vsoxseg6ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf2(...) __riscv_vsoxseg7ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf2(...) __riscv_vsoxseg8ei32_v_u8mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_u8m1(...) __riscv_vsoxseg2ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg3ei32_v_u8m1(...) __riscv_vsoxseg3ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg4ei32_v_u8m1(...) __riscv_vsoxseg4ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg5ei32_v_u8m1(...) __riscv_vsoxseg5ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg6ei32_v_u8m1(...) __riscv_vsoxseg6ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg7ei32_v_u8m1(...) __riscv_vsoxseg7ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg8ei32_v_u8m1(...) __riscv_vsoxseg8ei32_v_u8m1(__VA_ARGS__) +#define vsoxseg2ei32_v_u8m2(...) __riscv_vsoxseg2ei32_v_u8m2(__VA_ARGS__) +#define vsoxseg3ei32_v_u8m2(...) __riscv_vsoxseg3ei32_v_u8m2(__VA_ARGS__) +#define vsoxseg4ei32_v_u8m2(...) __riscv_vsoxseg4ei32_v_u8m2(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf8(...) __riscv_vsoxseg2ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf8(...) __riscv_vsoxseg3ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf8(...) __riscv_vsoxseg4ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf8(...) __riscv_vsoxseg5ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf8(...) __riscv_vsoxseg6ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf8(...) __riscv_vsoxseg7ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf8(...) __riscv_vsoxseg8ei64_v_u8mf8(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf4(...) __riscv_vsoxseg2ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf4(...) __riscv_vsoxseg3ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf4(...) __riscv_vsoxseg4ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf4(...) __riscv_vsoxseg5ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf4(...) __riscv_vsoxseg6ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf4(...) __riscv_vsoxseg7ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf4(...) __riscv_vsoxseg8ei64_v_u8mf4(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf2(...) __riscv_vsoxseg2ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf2(...) __riscv_vsoxseg3ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf2(...) __riscv_vsoxseg4ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf2(...) __riscv_vsoxseg5ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf2(...) __riscv_vsoxseg6ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf2(...) __riscv_vsoxseg7ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf2(...) __riscv_vsoxseg8ei64_v_u8mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_u8m1(...) __riscv_vsoxseg2ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg3ei64_v_u8m1(...) __riscv_vsoxseg3ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg4ei64_v_u8m1(...) __riscv_vsoxseg4ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg5ei64_v_u8m1(...) __riscv_vsoxseg5ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg6ei64_v_u8m1(...) __riscv_vsoxseg6ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg7ei64_v_u8m1(...) __riscv_vsoxseg7ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg8ei64_v_u8m1(...) __riscv_vsoxseg8ei64_v_u8m1(__VA_ARGS__) +#define vsoxseg2ei8_v_u16mf4(...) __riscv_vsoxseg2ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg3ei8_v_u16mf4(...) __riscv_vsoxseg3ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg4ei8_v_u16mf4(...) __riscv_vsoxseg4ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg5ei8_v_u16mf4(...) __riscv_vsoxseg5ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg6ei8_v_u16mf4(...) __riscv_vsoxseg6ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg7ei8_v_u16mf4(...) __riscv_vsoxseg7ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg8ei8_v_u16mf4(...) __riscv_vsoxseg8ei8_v_u16mf4(__VA_ARGS__) +#define vsoxseg2ei8_v_u16mf2(...) __riscv_vsoxseg2ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_u16mf2(...) __riscv_vsoxseg3ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_u16mf2(...) __riscv_vsoxseg4ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_u16mf2(...) __riscv_vsoxseg5ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_u16mf2(...) __riscv_vsoxseg6ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_u16mf2(...) __riscv_vsoxseg7ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_u16mf2(...) __riscv_vsoxseg8ei8_v_u16mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m1(...) __riscv_vsoxseg2ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg3ei8_v_u16m1(...) __riscv_vsoxseg3ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg4ei8_v_u16m1(...) __riscv_vsoxseg4ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg5ei8_v_u16m1(...) __riscv_vsoxseg5ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg6ei8_v_u16m1(...) __riscv_vsoxseg6ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg7ei8_v_u16m1(...) __riscv_vsoxseg7ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg8ei8_v_u16m1(...) __riscv_vsoxseg8ei8_v_u16m1(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m2(...) __riscv_vsoxseg2ei8_v_u16m2(__VA_ARGS__) +#define vsoxseg3ei8_v_u16m2(...) __riscv_vsoxseg3ei8_v_u16m2(__VA_ARGS__) +#define vsoxseg4ei8_v_u16m2(...) __riscv_vsoxseg4ei8_v_u16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m4(...) __riscv_vsoxseg2ei8_v_u16m4(__VA_ARGS__) +#define vsoxseg2ei16_v_u16mf4(...) __riscv_vsoxseg2ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg3ei16_v_u16mf4(...) __riscv_vsoxseg3ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg4ei16_v_u16mf4(...) __riscv_vsoxseg4ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg5ei16_v_u16mf4(...) __riscv_vsoxseg5ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg6ei16_v_u16mf4(...) __riscv_vsoxseg6ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg7ei16_v_u16mf4(...) __riscv_vsoxseg7ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg8ei16_v_u16mf4(...) __riscv_vsoxseg8ei16_v_u16mf4(__VA_ARGS__) +#define vsoxseg2ei16_v_u16mf2(...) __riscv_vsoxseg2ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_u16mf2(...) __riscv_vsoxseg3ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_u16mf2(...) __riscv_vsoxseg4ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_u16mf2(...) __riscv_vsoxseg5ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_u16mf2(...) __riscv_vsoxseg6ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_u16mf2(...) __riscv_vsoxseg7ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_u16mf2(...) __riscv_vsoxseg8ei16_v_u16mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m1(...) __riscv_vsoxseg2ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg3ei16_v_u16m1(...) __riscv_vsoxseg3ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg4ei16_v_u16m1(...) __riscv_vsoxseg4ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg5ei16_v_u16m1(...) __riscv_vsoxseg5ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg6ei16_v_u16m1(...) __riscv_vsoxseg6ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg7ei16_v_u16m1(...) __riscv_vsoxseg7ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg8ei16_v_u16m1(...) __riscv_vsoxseg8ei16_v_u16m1(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m2(...) __riscv_vsoxseg2ei16_v_u16m2(__VA_ARGS__) +#define vsoxseg3ei16_v_u16m2(...) __riscv_vsoxseg3ei16_v_u16m2(__VA_ARGS__) +#define vsoxseg4ei16_v_u16m2(...) __riscv_vsoxseg4ei16_v_u16m2(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m4(...) __riscv_vsoxseg2ei16_v_u16m4(__VA_ARGS__) +#define vsoxseg2ei32_v_u16mf4(...) __riscv_vsoxseg2ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg3ei32_v_u16mf4(...) __riscv_vsoxseg3ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg4ei32_v_u16mf4(...) __riscv_vsoxseg4ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg5ei32_v_u16mf4(...) __riscv_vsoxseg5ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg6ei32_v_u16mf4(...) __riscv_vsoxseg6ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg7ei32_v_u16mf4(...) __riscv_vsoxseg7ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg8ei32_v_u16mf4(...) __riscv_vsoxseg8ei32_v_u16mf4(__VA_ARGS__) +#define vsoxseg2ei32_v_u16mf2(...) __riscv_vsoxseg2ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_u16mf2(...) __riscv_vsoxseg3ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_u16mf2(...) __riscv_vsoxseg4ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_u16mf2(...) __riscv_vsoxseg5ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_u16mf2(...) __riscv_vsoxseg6ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_u16mf2(...) __riscv_vsoxseg7ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_u16mf2(...) __riscv_vsoxseg8ei32_v_u16mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m1(...) __riscv_vsoxseg2ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg3ei32_v_u16m1(...) __riscv_vsoxseg3ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg4ei32_v_u16m1(...) __riscv_vsoxseg4ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg5ei32_v_u16m1(...) __riscv_vsoxseg5ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg6ei32_v_u16m1(...) __riscv_vsoxseg6ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg7ei32_v_u16m1(...) __riscv_vsoxseg7ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg8ei32_v_u16m1(...) __riscv_vsoxseg8ei32_v_u16m1(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m2(...) __riscv_vsoxseg2ei32_v_u16m2(__VA_ARGS__) +#define vsoxseg3ei32_v_u16m2(...) __riscv_vsoxseg3ei32_v_u16m2(__VA_ARGS__) +#define vsoxseg4ei32_v_u16m2(...) __riscv_vsoxseg4ei32_v_u16m2(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m4(...) __riscv_vsoxseg2ei32_v_u16m4(__VA_ARGS__) +#define vsoxseg2ei64_v_u16mf4(...) __riscv_vsoxseg2ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg3ei64_v_u16mf4(...) __riscv_vsoxseg3ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg4ei64_v_u16mf4(...) __riscv_vsoxseg4ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg5ei64_v_u16mf4(...) __riscv_vsoxseg5ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg6ei64_v_u16mf4(...) __riscv_vsoxseg6ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg7ei64_v_u16mf4(...) __riscv_vsoxseg7ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg8ei64_v_u16mf4(...) __riscv_vsoxseg8ei64_v_u16mf4(__VA_ARGS__) +#define vsoxseg2ei64_v_u16mf2(...) __riscv_vsoxseg2ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_u16mf2(...) __riscv_vsoxseg3ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_u16mf2(...) __riscv_vsoxseg4ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_u16mf2(...) __riscv_vsoxseg5ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_u16mf2(...) __riscv_vsoxseg6ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_u16mf2(...) __riscv_vsoxseg7ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_u16mf2(...) __riscv_vsoxseg8ei64_v_u16mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_u16m1(...) __riscv_vsoxseg2ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg3ei64_v_u16m1(...) __riscv_vsoxseg3ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg4ei64_v_u16m1(...) __riscv_vsoxseg4ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg5ei64_v_u16m1(...) __riscv_vsoxseg5ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg6ei64_v_u16m1(...) __riscv_vsoxseg6ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg7ei64_v_u16m1(...) __riscv_vsoxseg7ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg8ei64_v_u16m1(...) __riscv_vsoxseg8ei64_v_u16m1(__VA_ARGS__) +#define vsoxseg2ei64_v_u16m2(...) __riscv_vsoxseg2ei64_v_u16m2(__VA_ARGS__) +#define vsoxseg3ei64_v_u16m2(...) __riscv_vsoxseg3ei64_v_u16m2(__VA_ARGS__) +#define vsoxseg4ei64_v_u16m2(...) __riscv_vsoxseg4ei64_v_u16m2(__VA_ARGS__) +#define vsoxseg2ei8_v_u32mf2(...) __riscv_vsoxseg2ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg3ei8_v_u32mf2(...) __riscv_vsoxseg3ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg4ei8_v_u32mf2(...) __riscv_vsoxseg4ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg5ei8_v_u32mf2(...) __riscv_vsoxseg5ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg6ei8_v_u32mf2(...) __riscv_vsoxseg6ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg7ei8_v_u32mf2(...) __riscv_vsoxseg7ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg8ei8_v_u32mf2(...) __riscv_vsoxseg8ei8_v_u32mf2(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m1(...) __riscv_vsoxseg2ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg3ei8_v_u32m1(...) __riscv_vsoxseg3ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg4ei8_v_u32m1(...) __riscv_vsoxseg4ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg5ei8_v_u32m1(...) __riscv_vsoxseg5ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg6ei8_v_u32m1(...) __riscv_vsoxseg6ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg7ei8_v_u32m1(...) __riscv_vsoxseg7ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg8ei8_v_u32m1(...) __riscv_vsoxseg8ei8_v_u32m1(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m2(...) __riscv_vsoxseg2ei8_v_u32m2(__VA_ARGS__) +#define vsoxseg3ei8_v_u32m2(...) __riscv_vsoxseg3ei8_v_u32m2(__VA_ARGS__) +#define vsoxseg4ei8_v_u32m2(...) __riscv_vsoxseg4ei8_v_u32m2(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m4(...) __riscv_vsoxseg2ei8_v_u32m4(__VA_ARGS__) +#define vsoxseg2ei16_v_u32mf2(...) __riscv_vsoxseg2ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg3ei16_v_u32mf2(...) __riscv_vsoxseg3ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg4ei16_v_u32mf2(...) __riscv_vsoxseg4ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg5ei16_v_u32mf2(...) __riscv_vsoxseg5ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg6ei16_v_u32mf2(...) __riscv_vsoxseg6ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg7ei16_v_u32mf2(...) __riscv_vsoxseg7ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg8ei16_v_u32mf2(...) __riscv_vsoxseg8ei16_v_u32mf2(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m1(...) __riscv_vsoxseg2ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg3ei16_v_u32m1(...) __riscv_vsoxseg3ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg4ei16_v_u32m1(...) __riscv_vsoxseg4ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg5ei16_v_u32m1(...) __riscv_vsoxseg5ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg6ei16_v_u32m1(...) __riscv_vsoxseg6ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg7ei16_v_u32m1(...) __riscv_vsoxseg7ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg8ei16_v_u32m1(...) __riscv_vsoxseg8ei16_v_u32m1(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m2(...) __riscv_vsoxseg2ei16_v_u32m2(__VA_ARGS__) +#define vsoxseg3ei16_v_u32m2(...) __riscv_vsoxseg3ei16_v_u32m2(__VA_ARGS__) +#define vsoxseg4ei16_v_u32m2(...) __riscv_vsoxseg4ei16_v_u32m2(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m4(...) __riscv_vsoxseg2ei16_v_u32m4(__VA_ARGS__) +#define vsoxseg2ei32_v_u32mf2(...) __riscv_vsoxseg2ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg3ei32_v_u32mf2(...) __riscv_vsoxseg3ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg4ei32_v_u32mf2(...) __riscv_vsoxseg4ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg5ei32_v_u32mf2(...) __riscv_vsoxseg5ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg6ei32_v_u32mf2(...) __riscv_vsoxseg6ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg7ei32_v_u32mf2(...) __riscv_vsoxseg7ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg8ei32_v_u32mf2(...) __riscv_vsoxseg8ei32_v_u32mf2(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m1(...) __riscv_vsoxseg2ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg3ei32_v_u32m1(...) __riscv_vsoxseg3ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg4ei32_v_u32m1(...) __riscv_vsoxseg4ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg5ei32_v_u32m1(...) __riscv_vsoxseg5ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg6ei32_v_u32m1(...) __riscv_vsoxseg6ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg7ei32_v_u32m1(...) __riscv_vsoxseg7ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg8ei32_v_u32m1(...) __riscv_vsoxseg8ei32_v_u32m1(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m2(...) __riscv_vsoxseg2ei32_v_u32m2(__VA_ARGS__) +#define vsoxseg3ei32_v_u32m2(...) __riscv_vsoxseg3ei32_v_u32m2(__VA_ARGS__) +#define vsoxseg4ei32_v_u32m2(...) __riscv_vsoxseg4ei32_v_u32m2(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m4(...) __riscv_vsoxseg2ei32_v_u32m4(__VA_ARGS__) +#define vsoxseg2ei64_v_u32mf2(...) __riscv_vsoxseg2ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg3ei64_v_u32mf2(...) __riscv_vsoxseg3ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg4ei64_v_u32mf2(...) __riscv_vsoxseg4ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg5ei64_v_u32mf2(...) __riscv_vsoxseg5ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg6ei64_v_u32mf2(...) __riscv_vsoxseg6ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg7ei64_v_u32mf2(...) __riscv_vsoxseg7ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg8ei64_v_u32mf2(...) __riscv_vsoxseg8ei64_v_u32mf2(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m1(...) __riscv_vsoxseg2ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg3ei64_v_u32m1(...) __riscv_vsoxseg3ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg4ei64_v_u32m1(...) __riscv_vsoxseg4ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg5ei64_v_u32m1(...) __riscv_vsoxseg5ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg6ei64_v_u32m1(...) __riscv_vsoxseg6ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg7ei64_v_u32m1(...) __riscv_vsoxseg7ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg8ei64_v_u32m1(...) __riscv_vsoxseg8ei64_v_u32m1(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m2(...) __riscv_vsoxseg2ei64_v_u32m2(__VA_ARGS__) +#define vsoxseg3ei64_v_u32m2(...) __riscv_vsoxseg3ei64_v_u32m2(__VA_ARGS__) +#define vsoxseg4ei64_v_u32m2(...) __riscv_vsoxseg4ei64_v_u32m2(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m4(...) __riscv_vsoxseg2ei64_v_u32m4(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m1(...) __riscv_vsoxseg2ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg3ei8_v_u64m1(...) __riscv_vsoxseg3ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg4ei8_v_u64m1(...) __riscv_vsoxseg4ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg5ei8_v_u64m1(...) __riscv_vsoxseg5ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg6ei8_v_u64m1(...) __riscv_vsoxseg6ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg7ei8_v_u64m1(...) __riscv_vsoxseg7ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg8ei8_v_u64m1(...) __riscv_vsoxseg8ei8_v_u64m1(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m2(...) __riscv_vsoxseg2ei8_v_u64m2(__VA_ARGS__) +#define vsoxseg3ei8_v_u64m2(...) __riscv_vsoxseg3ei8_v_u64m2(__VA_ARGS__) +#define vsoxseg4ei8_v_u64m2(...) __riscv_vsoxseg4ei8_v_u64m2(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m4(...) __riscv_vsoxseg2ei8_v_u64m4(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m1(...) __riscv_vsoxseg2ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg3ei16_v_u64m1(...) __riscv_vsoxseg3ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg4ei16_v_u64m1(...) __riscv_vsoxseg4ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg5ei16_v_u64m1(...) __riscv_vsoxseg5ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg6ei16_v_u64m1(...) __riscv_vsoxseg6ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg7ei16_v_u64m1(...) __riscv_vsoxseg7ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg8ei16_v_u64m1(...) __riscv_vsoxseg8ei16_v_u64m1(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m2(...) __riscv_vsoxseg2ei16_v_u64m2(__VA_ARGS__) +#define vsoxseg3ei16_v_u64m2(...) __riscv_vsoxseg3ei16_v_u64m2(__VA_ARGS__) +#define vsoxseg4ei16_v_u64m2(...) __riscv_vsoxseg4ei16_v_u64m2(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m4(...) __riscv_vsoxseg2ei16_v_u64m4(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m1(...) __riscv_vsoxseg2ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg3ei32_v_u64m1(...) __riscv_vsoxseg3ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg4ei32_v_u64m1(...) __riscv_vsoxseg4ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg5ei32_v_u64m1(...) __riscv_vsoxseg5ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg6ei32_v_u64m1(...) __riscv_vsoxseg6ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg7ei32_v_u64m1(...) __riscv_vsoxseg7ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg8ei32_v_u64m1(...) __riscv_vsoxseg8ei32_v_u64m1(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m2(...) __riscv_vsoxseg2ei32_v_u64m2(__VA_ARGS__) +#define vsoxseg3ei32_v_u64m2(...) __riscv_vsoxseg3ei32_v_u64m2(__VA_ARGS__) +#define vsoxseg4ei32_v_u64m2(...) __riscv_vsoxseg4ei32_v_u64m2(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m4(...) __riscv_vsoxseg2ei32_v_u64m4(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m1(...) __riscv_vsoxseg2ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg3ei64_v_u64m1(...) __riscv_vsoxseg3ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg4ei64_v_u64m1(...) __riscv_vsoxseg4ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg5ei64_v_u64m1(...) __riscv_vsoxseg5ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg6ei64_v_u64m1(...) __riscv_vsoxseg6ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg7ei64_v_u64m1(...) __riscv_vsoxseg7ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg8ei64_v_u64m1(...) __riscv_vsoxseg8ei64_v_u64m1(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m2(...) __riscv_vsoxseg2ei64_v_u64m2(__VA_ARGS__) +#define vsoxseg3ei64_v_u64m2(...) __riscv_vsoxseg3ei64_v_u64m2(__VA_ARGS__) +#define vsoxseg4ei64_v_u64m2(...) __riscv_vsoxseg4ei64_v_u64m2(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m4(...) __riscv_vsoxseg2ei64_v_u64m4(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf8(...) __riscv_vsuxseg2ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf8(...) __riscv_vsuxseg3ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf8(...) __riscv_vsuxseg4ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf8(...) __riscv_vsuxseg5ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf8(...) __riscv_vsuxseg6ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf8(...) __riscv_vsuxseg7ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf8(...) __riscv_vsuxseg8ei8_v_u8mf8(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf4(...) __riscv_vsuxseg2ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf4(...) __riscv_vsuxseg3ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf4(...) __riscv_vsuxseg4ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf4(...) __riscv_vsuxseg5ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf4(...) __riscv_vsuxseg6ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf4(...) __riscv_vsuxseg7ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf4(...) __riscv_vsuxseg8ei8_v_u8mf4(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf2(...) __riscv_vsuxseg2ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf2(...) __riscv_vsuxseg3ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf2(...) __riscv_vsuxseg4ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf2(...) __riscv_vsuxseg5ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf2(...) __riscv_vsuxseg6ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf2(...) __riscv_vsuxseg7ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf2(...) __riscv_vsuxseg8ei8_v_u8mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m1(...) __riscv_vsuxseg2ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg3ei8_v_u8m1(...) __riscv_vsuxseg3ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg4ei8_v_u8m1(...) __riscv_vsuxseg4ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg5ei8_v_u8m1(...) __riscv_vsuxseg5ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg6ei8_v_u8m1(...) __riscv_vsuxseg6ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg7ei8_v_u8m1(...) __riscv_vsuxseg7ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg8ei8_v_u8m1(...) __riscv_vsuxseg8ei8_v_u8m1(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m2(...) __riscv_vsuxseg2ei8_v_u8m2(__VA_ARGS__) +#define vsuxseg3ei8_v_u8m2(...) __riscv_vsuxseg3ei8_v_u8m2(__VA_ARGS__) +#define vsuxseg4ei8_v_u8m2(...) __riscv_vsuxseg4ei8_v_u8m2(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m4(...) __riscv_vsuxseg2ei8_v_u8m4(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf8(...) __riscv_vsuxseg2ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf8(...) __riscv_vsuxseg3ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf8(...) __riscv_vsuxseg4ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf8(...) __riscv_vsuxseg5ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf8(...) __riscv_vsuxseg6ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf8(...) __riscv_vsuxseg7ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf8(...) __riscv_vsuxseg8ei16_v_u8mf8(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf4(...) __riscv_vsuxseg2ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf4(...) __riscv_vsuxseg3ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf4(...) __riscv_vsuxseg4ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf4(...) __riscv_vsuxseg5ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf4(...) __riscv_vsuxseg6ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf4(...) __riscv_vsuxseg7ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf4(...) __riscv_vsuxseg8ei16_v_u8mf4(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf2(...) __riscv_vsuxseg2ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf2(...) __riscv_vsuxseg3ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf2(...) __riscv_vsuxseg4ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf2(...) __riscv_vsuxseg5ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf2(...) __riscv_vsuxseg6ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf2(...) __riscv_vsuxseg7ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf2(...) __riscv_vsuxseg8ei16_v_u8mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m1(...) __riscv_vsuxseg2ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg3ei16_v_u8m1(...) __riscv_vsuxseg3ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg4ei16_v_u8m1(...) __riscv_vsuxseg4ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg5ei16_v_u8m1(...) __riscv_vsuxseg5ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg6ei16_v_u8m1(...) __riscv_vsuxseg6ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg7ei16_v_u8m1(...) __riscv_vsuxseg7ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg8ei16_v_u8m1(...) __riscv_vsuxseg8ei16_v_u8m1(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m2(...) __riscv_vsuxseg2ei16_v_u8m2(__VA_ARGS__) +#define vsuxseg3ei16_v_u8m2(...) __riscv_vsuxseg3ei16_v_u8m2(__VA_ARGS__) +#define vsuxseg4ei16_v_u8m2(...) __riscv_vsuxseg4ei16_v_u8m2(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m4(...) __riscv_vsuxseg2ei16_v_u8m4(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf8(...) __riscv_vsuxseg2ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf8(...) __riscv_vsuxseg3ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf8(...) __riscv_vsuxseg4ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf8(...) __riscv_vsuxseg5ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf8(...) __riscv_vsuxseg6ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf8(...) __riscv_vsuxseg7ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf8(...) __riscv_vsuxseg8ei32_v_u8mf8(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf4(...) __riscv_vsuxseg2ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf4(...) __riscv_vsuxseg3ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf4(...) __riscv_vsuxseg4ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf4(...) __riscv_vsuxseg5ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf4(...) __riscv_vsuxseg6ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf4(...) __riscv_vsuxseg7ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf4(...) __riscv_vsuxseg8ei32_v_u8mf4(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf2(...) __riscv_vsuxseg2ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf2(...) __riscv_vsuxseg3ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf2(...) __riscv_vsuxseg4ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf2(...) __riscv_vsuxseg5ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf2(...) __riscv_vsuxseg6ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf2(...) __riscv_vsuxseg7ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf2(...) __riscv_vsuxseg8ei32_v_u8mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_u8m1(...) __riscv_vsuxseg2ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg3ei32_v_u8m1(...) __riscv_vsuxseg3ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg4ei32_v_u8m1(...) __riscv_vsuxseg4ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg5ei32_v_u8m1(...) __riscv_vsuxseg5ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg6ei32_v_u8m1(...) __riscv_vsuxseg6ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg7ei32_v_u8m1(...) __riscv_vsuxseg7ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg8ei32_v_u8m1(...) __riscv_vsuxseg8ei32_v_u8m1(__VA_ARGS__) +#define vsuxseg2ei32_v_u8m2(...) __riscv_vsuxseg2ei32_v_u8m2(__VA_ARGS__) +#define vsuxseg3ei32_v_u8m2(...) __riscv_vsuxseg3ei32_v_u8m2(__VA_ARGS__) +#define vsuxseg4ei32_v_u8m2(...) __riscv_vsuxseg4ei32_v_u8m2(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf8(...) __riscv_vsuxseg2ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf8(...) __riscv_vsuxseg3ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf8(...) __riscv_vsuxseg4ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf8(...) __riscv_vsuxseg5ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf8(...) __riscv_vsuxseg6ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf8(...) __riscv_vsuxseg7ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf8(...) __riscv_vsuxseg8ei64_v_u8mf8(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf4(...) __riscv_vsuxseg2ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf4(...) __riscv_vsuxseg3ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf4(...) __riscv_vsuxseg4ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf4(...) __riscv_vsuxseg5ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf4(...) __riscv_vsuxseg6ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf4(...) __riscv_vsuxseg7ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf4(...) __riscv_vsuxseg8ei64_v_u8mf4(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf2(...) __riscv_vsuxseg2ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf2(...) __riscv_vsuxseg3ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf2(...) __riscv_vsuxseg4ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf2(...) __riscv_vsuxseg5ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf2(...) __riscv_vsuxseg6ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf2(...) __riscv_vsuxseg7ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf2(...) __riscv_vsuxseg8ei64_v_u8mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_u8m1(...) __riscv_vsuxseg2ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg3ei64_v_u8m1(...) __riscv_vsuxseg3ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg4ei64_v_u8m1(...) __riscv_vsuxseg4ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg5ei64_v_u8m1(...) __riscv_vsuxseg5ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg6ei64_v_u8m1(...) __riscv_vsuxseg6ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg7ei64_v_u8m1(...) __riscv_vsuxseg7ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg8ei64_v_u8m1(...) __riscv_vsuxseg8ei64_v_u8m1(__VA_ARGS__) +#define vsuxseg2ei8_v_u16mf4(...) __riscv_vsuxseg2ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg3ei8_v_u16mf4(...) __riscv_vsuxseg3ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg4ei8_v_u16mf4(...) __riscv_vsuxseg4ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg5ei8_v_u16mf4(...) __riscv_vsuxseg5ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg6ei8_v_u16mf4(...) __riscv_vsuxseg6ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg7ei8_v_u16mf4(...) __riscv_vsuxseg7ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg8ei8_v_u16mf4(...) __riscv_vsuxseg8ei8_v_u16mf4(__VA_ARGS__) +#define vsuxseg2ei8_v_u16mf2(...) __riscv_vsuxseg2ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_u16mf2(...) __riscv_vsuxseg3ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_u16mf2(...) __riscv_vsuxseg4ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_u16mf2(...) __riscv_vsuxseg5ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_u16mf2(...) __riscv_vsuxseg6ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_u16mf2(...) __riscv_vsuxseg7ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_u16mf2(...) __riscv_vsuxseg8ei8_v_u16mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m1(...) __riscv_vsuxseg2ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg3ei8_v_u16m1(...) __riscv_vsuxseg3ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg4ei8_v_u16m1(...) __riscv_vsuxseg4ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg5ei8_v_u16m1(...) __riscv_vsuxseg5ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg6ei8_v_u16m1(...) __riscv_vsuxseg6ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg7ei8_v_u16m1(...) __riscv_vsuxseg7ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg8ei8_v_u16m1(...) __riscv_vsuxseg8ei8_v_u16m1(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m2(...) __riscv_vsuxseg2ei8_v_u16m2(__VA_ARGS__) +#define vsuxseg3ei8_v_u16m2(...) __riscv_vsuxseg3ei8_v_u16m2(__VA_ARGS__) +#define vsuxseg4ei8_v_u16m2(...) __riscv_vsuxseg4ei8_v_u16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m4(...) __riscv_vsuxseg2ei8_v_u16m4(__VA_ARGS__) +#define vsuxseg2ei16_v_u16mf4(...) __riscv_vsuxseg2ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg3ei16_v_u16mf4(...) __riscv_vsuxseg3ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg4ei16_v_u16mf4(...) __riscv_vsuxseg4ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg5ei16_v_u16mf4(...) __riscv_vsuxseg5ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg6ei16_v_u16mf4(...) __riscv_vsuxseg6ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg7ei16_v_u16mf4(...) __riscv_vsuxseg7ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg8ei16_v_u16mf4(...) __riscv_vsuxseg8ei16_v_u16mf4(__VA_ARGS__) +#define vsuxseg2ei16_v_u16mf2(...) __riscv_vsuxseg2ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_u16mf2(...) __riscv_vsuxseg3ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_u16mf2(...) __riscv_vsuxseg4ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_u16mf2(...) __riscv_vsuxseg5ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_u16mf2(...) __riscv_vsuxseg6ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_u16mf2(...) __riscv_vsuxseg7ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_u16mf2(...) __riscv_vsuxseg8ei16_v_u16mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m1(...) __riscv_vsuxseg2ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg3ei16_v_u16m1(...) __riscv_vsuxseg3ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg4ei16_v_u16m1(...) __riscv_vsuxseg4ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg5ei16_v_u16m1(...) __riscv_vsuxseg5ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg6ei16_v_u16m1(...) __riscv_vsuxseg6ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg7ei16_v_u16m1(...) __riscv_vsuxseg7ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg8ei16_v_u16m1(...) __riscv_vsuxseg8ei16_v_u16m1(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m2(...) __riscv_vsuxseg2ei16_v_u16m2(__VA_ARGS__) +#define vsuxseg3ei16_v_u16m2(...) __riscv_vsuxseg3ei16_v_u16m2(__VA_ARGS__) +#define vsuxseg4ei16_v_u16m2(...) __riscv_vsuxseg4ei16_v_u16m2(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m4(...) __riscv_vsuxseg2ei16_v_u16m4(__VA_ARGS__) +#define vsuxseg2ei32_v_u16mf4(...) __riscv_vsuxseg2ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg3ei32_v_u16mf4(...) __riscv_vsuxseg3ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg4ei32_v_u16mf4(...) __riscv_vsuxseg4ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg5ei32_v_u16mf4(...) __riscv_vsuxseg5ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg6ei32_v_u16mf4(...) __riscv_vsuxseg6ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg7ei32_v_u16mf4(...) __riscv_vsuxseg7ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg8ei32_v_u16mf4(...) __riscv_vsuxseg8ei32_v_u16mf4(__VA_ARGS__) +#define vsuxseg2ei32_v_u16mf2(...) __riscv_vsuxseg2ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_u16mf2(...) __riscv_vsuxseg3ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_u16mf2(...) __riscv_vsuxseg4ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_u16mf2(...) __riscv_vsuxseg5ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_u16mf2(...) __riscv_vsuxseg6ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_u16mf2(...) __riscv_vsuxseg7ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_u16mf2(...) __riscv_vsuxseg8ei32_v_u16mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m1(...) __riscv_vsuxseg2ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg3ei32_v_u16m1(...) __riscv_vsuxseg3ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg4ei32_v_u16m1(...) __riscv_vsuxseg4ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg5ei32_v_u16m1(...) __riscv_vsuxseg5ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg6ei32_v_u16m1(...) __riscv_vsuxseg6ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg7ei32_v_u16m1(...) __riscv_vsuxseg7ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg8ei32_v_u16m1(...) __riscv_vsuxseg8ei32_v_u16m1(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m2(...) __riscv_vsuxseg2ei32_v_u16m2(__VA_ARGS__) +#define vsuxseg3ei32_v_u16m2(...) __riscv_vsuxseg3ei32_v_u16m2(__VA_ARGS__) +#define vsuxseg4ei32_v_u16m2(...) __riscv_vsuxseg4ei32_v_u16m2(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m4(...) __riscv_vsuxseg2ei32_v_u16m4(__VA_ARGS__) +#define vsuxseg2ei64_v_u16mf4(...) __riscv_vsuxseg2ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg3ei64_v_u16mf4(...) __riscv_vsuxseg3ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg4ei64_v_u16mf4(...) __riscv_vsuxseg4ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg5ei64_v_u16mf4(...) __riscv_vsuxseg5ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg6ei64_v_u16mf4(...) __riscv_vsuxseg6ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg7ei64_v_u16mf4(...) __riscv_vsuxseg7ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg8ei64_v_u16mf4(...) __riscv_vsuxseg8ei64_v_u16mf4(__VA_ARGS__) +#define vsuxseg2ei64_v_u16mf2(...) __riscv_vsuxseg2ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_u16mf2(...) __riscv_vsuxseg3ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_u16mf2(...) __riscv_vsuxseg4ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_u16mf2(...) __riscv_vsuxseg5ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_u16mf2(...) __riscv_vsuxseg6ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_u16mf2(...) __riscv_vsuxseg7ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_u16mf2(...) __riscv_vsuxseg8ei64_v_u16mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_u16m1(...) __riscv_vsuxseg2ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg3ei64_v_u16m1(...) __riscv_vsuxseg3ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg4ei64_v_u16m1(...) __riscv_vsuxseg4ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg5ei64_v_u16m1(...) __riscv_vsuxseg5ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg6ei64_v_u16m1(...) __riscv_vsuxseg6ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg7ei64_v_u16m1(...) __riscv_vsuxseg7ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg8ei64_v_u16m1(...) __riscv_vsuxseg8ei64_v_u16m1(__VA_ARGS__) +#define vsuxseg2ei64_v_u16m2(...) __riscv_vsuxseg2ei64_v_u16m2(__VA_ARGS__) +#define vsuxseg3ei64_v_u16m2(...) __riscv_vsuxseg3ei64_v_u16m2(__VA_ARGS__) +#define vsuxseg4ei64_v_u16m2(...) __riscv_vsuxseg4ei64_v_u16m2(__VA_ARGS__) +#define vsuxseg2ei8_v_u32mf2(...) __riscv_vsuxseg2ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg3ei8_v_u32mf2(...) __riscv_vsuxseg3ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg4ei8_v_u32mf2(...) __riscv_vsuxseg4ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg5ei8_v_u32mf2(...) __riscv_vsuxseg5ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg6ei8_v_u32mf2(...) __riscv_vsuxseg6ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg7ei8_v_u32mf2(...) __riscv_vsuxseg7ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg8ei8_v_u32mf2(...) __riscv_vsuxseg8ei8_v_u32mf2(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m1(...) __riscv_vsuxseg2ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg3ei8_v_u32m1(...) __riscv_vsuxseg3ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg4ei8_v_u32m1(...) __riscv_vsuxseg4ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg5ei8_v_u32m1(...) __riscv_vsuxseg5ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg6ei8_v_u32m1(...) __riscv_vsuxseg6ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg7ei8_v_u32m1(...) __riscv_vsuxseg7ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg8ei8_v_u32m1(...) __riscv_vsuxseg8ei8_v_u32m1(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m2(...) __riscv_vsuxseg2ei8_v_u32m2(__VA_ARGS__) +#define vsuxseg3ei8_v_u32m2(...) __riscv_vsuxseg3ei8_v_u32m2(__VA_ARGS__) +#define vsuxseg4ei8_v_u32m2(...) __riscv_vsuxseg4ei8_v_u32m2(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m4(...) __riscv_vsuxseg2ei8_v_u32m4(__VA_ARGS__) +#define vsuxseg2ei16_v_u32mf2(...) __riscv_vsuxseg2ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg3ei16_v_u32mf2(...) __riscv_vsuxseg3ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg4ei16_v_u32mf2(...) __riscv_vsuxseg4ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg5ei16_v_u32mf2(...) __riscv_vsuxseg5ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg6ei16_v_u32mf2(...) __riscv_vsuxseg6ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg7ei16_v_u32mf2(...) __riscv_vsuxseg7ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg8ei16_v_u32mf2(...) __riscv_vsuxseg8ei16_v_u32mf2(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m1(...) __riscv_vsuxseg2ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg3ei16_v_u32m1(...) __riscv_vsuxseg3ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg4ei16_v_u32m1(...) __riscv_vsuxseg4ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg5ei16_v_u32m1(...) __riscv_vsuxseg5ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg6ei16_v_u32m1(...) __riscv_vsuxseg6ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg7ei16_v_u32m1(...) __riscv_vsuxseg7ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg8ei16_v_u32m1(...) __riscv_vsuxseg8ei16_v_u32m1(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m2(...) __riscv_vsuxseg2ei16_v_u32m2(__VA_ARGS__) +#define vsuxseg3ei16_v_u32m2(...) __riscv_vsuxseg3ei16_v_u32m2(__VA_ARGS__) +#define vsuxseg4ei16_v_u32m2(...) __riscv_vsuxseg4ei16_v_u32m2(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m4(...) __riscv_vsuxseg2ei16_v_u32m4(__VA_ARGS__) +#define vsuxseg2ei32_v_u32mf2(...) __riscv_vsuxseg2ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg3ei32_v_u32mf2(...) __riscv_vsuxseg3ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg4ei32_v_u32mf2(...) __riscv_vsuxseg4ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg5ei32_v_u32mf2(...) __riscv_vsuxseg5ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg6ei32_v_u32mf2(...) __riscv_vsuxseg6ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg7ei32_v_u32mf2(...) __riscv_vsuxseg7ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg8ei32_v_u32mf2(...) __riscv_vsuxseg8ei32_v_u32mf2(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m1(...) __riscv_vsuxseg2ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg3ei32_v_u32m1(...) __riscv_vsuxseg3ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg4ei32_v_u32m1(...) __riscv_vsuxseg4ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg5ei32_v_u32m1(...) __riscv_vsuxseg5ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg6ei32_v_u32m1(...) __riscv_vsuxseg6ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg7ei32_v_u32m1(...) __riscv_vsuxseg7ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg8ei32_v_u32m1(...) __riscv_vsuxseg8ei32_v_u32m1(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m2(...) __riscv_vsuxseg2ei32_v_u32m2(__VA_ARGS__) +#define vsuxseg3ei32_v_u32m2(...) __riscv_vsuxseg3ei32_v_u32m2(__VA_ARGS__) +#define vsuxseg4ei32_v_u32m2(...) __riscv_vsuxseg4ei32_v_u32m2(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m4(...) __riscv_vsuxseg2ei32_v_u32m4(__VA_ARGS__) +#define vsuxseg2ei64_v_u32mf2(...) __riscv_vsuxseg2ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg3ei64_v_u32mf2(...) __riscv_vsuxseg3ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg4ei64_v_u32mf2(...) __riscv_vsuxseg4ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg5ei64_v_u32mf2(...) __riscv_vsuxseg5ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg6ei64_v_u32mf2(...) __riscv_vsuxseg6ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg7ei64_v_u32mf2(...) __riscv_vsuxseg7ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg8ei64_v_u32mf2(...) __riscv_vsuxseg8ei64_v_u32mf2(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m1(...) __riscv_vsuxseg2ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg3ei64_v_u32m1(...) __riscv_vsuxseg3ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg4ei64_v_u32m1(...) __riscv_vsuxseg4ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg5ei64_v_u32m1(...) __riscv_vsuxseg5ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg6ei64_v_u32m1(...) __riscv_vsuxseg6ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg7ei64_v_u32m1(...) __riscv_vsuxseg7ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg8ei64_v_u32m1(...) __riscv_vsuxseg8ei64_v_u32m1(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m2(...) __riscv_vsuxseg2ei64_v_u32m2(__VA_ARGS__) +#define vsuxseg3ei64_v_u32m2(...) __riscv_vsuxseg3ei64_v_u32m2(__VA_ARGS__) +#define vsuxseg4ei64_v_u32m2(...) __riscv_vsuxseg4ei64_v_u32m2(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m4(...) __riscv_vsuxseg2ei64_v_u32m4(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m1(...) __riscv_vsuxseg2ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg3ei8_v_u64m1(...) __riscv_vsuxseg3ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg4ei8_v_u64m1(...) __riscv_vsuxseg4ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg5ei8_v_u64m1(...) __riscv_vsuxseg5ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg6ei8_v_u64m1(...) __riscv_vsuxseg6ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg7ei8_v_u64m1(...) __riscv_vsuxseg7ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg8ei8_v_u64m1(...) __riscv_vsuxseg8ei8_v_u64m1(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m2(...) __riscv_vsuxseg2ei8_v_u64m2(__VA_ARGS__) +#define vsuxseg3ei8_v_u64m2(...) __riscv_vsuxseg3ei8_v_u64m2(__VA_ARGS__) +#define vsuxseg4ei8_v_u64m2(...) __riscv_vsuxseg4ei8_v_u64m2(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m4(...) __riscv_vsuxseg2ei8_v_u64m4(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m1(...) __riscv_vsuxseg2ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg3ei16_v_u64m1(...) __riscv_vsuxseg3ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg4ei16_v_u64m1(...) __riscv_vsuxseg4ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg5ei16_v_u64m1(...) __riscv_vsuxseg5ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg6ei16_v_u64m1(...) __riscv_vsuxseg6ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg7ei16_v_u64m1(...) __riscv_vsuxseg7ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg8ei16_v_u64m1(...) __riscv_vsuxseg8ei16_v_u64m1(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m2(...) __riscv_vsuxseg2ei16_v_u64m2(__VA_ARGS__) +#define vsuxseg3ei16_v_u64m2(...) __riscv_vsuxseg3ei16_v_u64m2(__VA_ARGS__) +#define vsuxseg4ei16_v_u64m2(...) __riscv_vsuxseg4ei16_v_u64m2(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m4(...) __riscv_vsuxseg2ei16_v_u64m4(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m1(...) __riscv_vsuxseg2ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg3ei32_v_u64m1(...) __riscv_vsuxseg3ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg4ei32_v_u64m1(...) __riscv_vsuxseg4ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg5ei32_v_u64m1(...) __riscv_vsuxseg5ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg6ei32_v_u64m1(...) __riscv_vsuxseg6ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg7ei32_v_u64m1(...) __riscv_vsuxseg7ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg8ei32_v_u64m1(...) __riscv_vsuxseg8ei32_v_u64m1(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m2(...) __riscv_vsuxseg2ei32_v_u64m2(__VA_ARGS__) +#define vsuxseg3ei32_v_u64m2(...) __riscv_vsuxseg3ei32_v_u64m2(__VA_ARGS__) +#define vsuxseg4ei32_v_u64m2(...) __riscv_vsuxseg4ei32_v_u64m2(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m4(...) __riscv_vsuxseg2ei32_v_u64m4(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m1(...) __riscv_vsuxseg2ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg3ei64_v_u64m1(...) __riscv_vsuxseg3ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg4ei64_v_u64m1(...) __riscv_vsuxseg4ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg5ei64_v_u64m1(...) __riscv_vsuxseg5ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg6ei64_v_u64m1(...) __riscv_vsuxseg6ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg7ei64_v_u64m1(...) __riscv_vsuxseg7ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg8ei64_v_u64m1(...) __riscv_vsuxseg8ei64_v_u64m1(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m2(...) __riscv_vsuxseg2ei64_v_u64m2(__VA_ARGS__) +#define vsuxseg3ei64_v_u64m2(...) __riscv_vsuxseg3ei64_v_u64m2(__VA_ARGS__) +#define vsuxseg4ei64_v_u64m2(...) __riscv_vsuxseg4ei64_v_u64m2(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m4(...) __riscv_vsuxseg2ei64_v_u64m4(__VA_ARGS__) +// masked functions +#define vsoxseg2ei8_v_f16mf4_m(...) __riscv_vsoxseg2ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f16mf4_m(...) __riscv_vsoxseg3ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f16mf4_m(...) __riscv_vsoxseg4ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f16mf4_m(...) __riscv_vsoxseg5ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f16mf4_m(...) __riscv_vsoxseg6ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f16mf4_m(...) __riscv_vsoxseg7ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f16mf4_m(...) __riscv_vsoxseg8ei8_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f16mf2_m(...) __riscv_vsoxseg2ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f16mf2_m(...) __riscv_vsoxseg3ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f16mf2_m(...) __riscv_vsoxseg4ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f16mf2_m(...) __riscv_vsoxseg5ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f16mf2_m(...) __riscv_vsoxseg6ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f16mf2_m(...) __riscv_vsoxseg7ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f16mf2_m(...) __riscv_vsoxseg8ei8_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m1_m(...) __riscv_vsoxseg2ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f16m1_m(...) __riscv_vsoxseg3ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f16m1_m(...) __riscv_vsoxseg4ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f16m1_m(...) __riscv_vsoxseg5ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f16m1_m(...) __riscv_vsoxseg6ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f16m1_m(...) __riscv_vsoxseg7ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f16m1_m(...) __riscv_vsoxseg8ei8_v_f16m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m2_m(...) __riscv_vsoxseg2ei8_v_f16m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f16m2_m(...) __riscv_vsoxseg3ei8_v_f16m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f16m2_m(...) __riscv_vsoxseg4ei8_v_f16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f16m4_m(...) __riscv_vsoxseg2ei8_v_f16m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f16mf4_m(...) __riscv_vsoxseg2ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f16mf4_m(...) __riscv_vsoxseg3ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f16mf4_m(...) __riscv_vsoxseg4ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f16mf4_m(...) __riscv_vsoxseg5ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f16mf4_m(...) __riscv_vsoxseg6ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f16mf4_m(...) __riscv_vsoxseg7ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f16mf4_m(...) __riscv_vsoxseg8ei16_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f16mf2_m(...) __riscv_vsoxseg2ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f16mf2_m(...) __riscv_vsoxseg3ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f16mf2_m(...) __riscv_vsoxseg4ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f16mf2_m(...) __riscv_vsoxseg5ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f16mf2_m(...) __riscv_vsoxseg6ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f16mf2_m(...) __riscv_vsoxseg7ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f16mf2_m(...) __riscv_vsoxseg8ei16_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m1_m(...) __riscv_vsoxseg2ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f16m1_m(...) __riscv_vsoxseg3ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f16m1_m(...) __riscv_vsoxseg4ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f16m1_m(...) __riscv_vsoxseg5ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f16m1_m(...) __riscv_vsoxseg6ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f16m1_m(...) __riscv_vsoxseg7ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f16m1_m(...) __riscv_vsoxseg8ei16_v_f16m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m2_m(...) __riscv_vsoxseg2ei16_v_f16m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f16m2_m(...) __riscv_vsoxseg3ei16_v_f16m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f16m2_m(...) __riscv_vsoxseg4ei16_v_f16m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f16m4_m(...) __riscv_vsoxseg2ei16_v_f16m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f16mf4_m(...) __riscv_vsoxseg2ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f16mf4_m(...) __riscv_vsoxseg3ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f16mf4_m(...) __riscv_vsoxseg4ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f16mf4_m(...) __riscv_vsoxseg5ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f16mf4_m(...) __riscv_vsoxseg6ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f16mf4_m(...) __riscv_vsoxseg7ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f16mf4_m(...) __riscv_vsoxseg8ei32_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f16mf2_m(...) __riscv_vsoxseg2ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f16mf2_m(...) __riscv_vsoxseg3ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f16mf2_m(...) __riscv_vsoxseg4ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f16mf2_m(...) __riscv_vsoxseg5ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f16mf2_m(...) __riscv_vsoxseg6ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f16mf2_m(...) __riscv_vsoxseg7ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f16mf2_m(...) __riscv_vsoxseg8ei32_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m1_m(...) __riscv_vsoxseg2ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f16m1_m(...) __riscv_vsoxseg3ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f16m1_m(...) __riscv_vsoxseg4ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f16m1_m(...) __riscv_vsoxseg5ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f16m1_m(...) __riscv_vsoxseg6ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f16m1_m(...) __riscv_vsoxseg7ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f16m1_m(...) __riscv_vsoxseg8ei32_v_f16m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m2_m(...) __riscv_vsoxseg2ei32_v_f16m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f16m2_m(...) __riscv_vsoxseg3ei32_v_f16m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f16m2_m(...) __riscv_vsoxseg4ei32_v_f16m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f16m4_m(...) __riscv_vsoxseg2ei32_v_f16m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f16mf4_m(...) __riscv_vsoxseg2ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f16mf4_m(...) __riscv_vsoxseg3ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f16mf4_m(...) __riscv_vsoxseg4ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f16mf4_m(...) __riscv_vsoxseg5ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f16mf4_m(...) __riscv_vsoxseg6ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f16mf4_m(...) __riscv_vsoxseg7ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f16mf4_m(...) __riscv_vsoxseg8ei64_v_f16mf4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f16mf2_m(...) __riscv_vsoxseg2ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f16mf2_m(...) __riscv_vsoxseg3ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f16mf2_m(...) __riscv_vsoxseg4ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f16mf2_m(...) __riscv_vsoxseg5ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f16mf2_m(...) __riscv_vsoxseg6ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f16mf2_m(...) __riscv_vsoxseg7ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f16mf2_m(...) __riscv_vsoxseg8ei64_v_f16mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f16m1_m(...) __riscv_vsoxseg2ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f16m1_m(...) __riscv_vsoxseg3ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f16m1_m(...) __riscv_vsoxseg4ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f16m1_m(...) __riscv_vsoxseg5ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f16m1_m(...) __riscv_vsoxseg6ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f16m1_m(...) __riscv_vsoxseg7ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f16m1_m(...) __riscv_vsoxseg8ei64_v_f16m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f16m2_m(...) __riscv_vsoxseg2ei64_v_f16m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f16m2_m(...) __riscv_vsoxseg3ei64_v_f16m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f16m2_m(...) __riscv_vsoxseg4ei64_v_f16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f32mf2_m(...) __riscv_vsoxseg2ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f32mf2_m(...) __riscv_vsoxseg3ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f32mf2_m(...) __riscv_vsoxseg4ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f32mf2_m(...) __riscv_vsoxseg5ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f32mf2_m(...) __riscv_vsoxseg6ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f32mf2_m(...) __riscv_vsoxseg7ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f32mf2_m(...) __riscv_vsoxseg8ei8_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m1_m(...) __riscv_vsoxseg2ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f32m1_m(...) __riscv_vsoxseg3ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f32m1_m(...) __riscv_vsoxseg4ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f32m1_m(...) __riscv_vsoxseg5ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f32m1_m(...) __riscv_vsoxseg6ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f32m1_m(...) __riscv_vsoxseg7ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f32m1_m(...) __riscv_vsoxseg8ei8_v_f32m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m2_m(...) __riscv_vsoxseg2ei8_v_f32m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f32m2_m(...) __riscv_vsoxseg3ei8_v_f32m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f32m2_m(...) __riscv_vsoxseg4ei8_v_f32m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f32m4_m(...) __riscv_vsoxseg2ei8_v_f32m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f32mf2_m(...) __riscv_vsoxseg2ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f32mf2_m(...) __riscv_vsoxseg3ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f32mf2_m(...) __riscv_vsoxseg4ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f32mf2_m(...) __riscv_vsoxseg5ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f32mf2_m(...) __riscv_vsoxseg6ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f32mf2_m(...) __riscv_vsoxseg7ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f32mf2_m(...) __riscv_vsoxseg8ei16_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m1_m(...) __riscv_vsoxseg2ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f32m1_m(...) __riscv_vsoxseg3ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f32m1_m(...) __riscv_vsoxseg4ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f32m1_m(...) __riscv_vsoxseg5ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f32m1_m(...) __riscv_vsoxseg6ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f32m1_m(...) __riscv_vsoxseg7ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f32m1_m(...) __riscv_vsoxseg8ei16_v_f32m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m2_m(...) __riscv_vsoxseg2ei16_v_f32m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f32m2_m(...) __riscv_vsoxseg3ei16_v_f32m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f32m2_m(...) __riscv_vsoxseg4ei16_v_f32m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f32m4_m(...) __riscv_vsoxseg2ei16_v_f32m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f32mf2_m(...) __riscv_vsoxseg2ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f32mf2_m(...) __riscv_vsoxseg3ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f32mf2_m(...) __riscv_vsoxseg4ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f32mf2_m(...) __riscv_vsoxseg5ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f32mf2_m(...) __riscv_vsoxseg6ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f32mf2_m(...) __riscv_vsoxseg7ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f32mf2_m(...) __riscv_vsoxseg8ei32_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m1_m(...) __riscv_vsoxseg2ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f32m1_m(...) __riscv_vsoxseg3ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f32m1_m(...) __riscv_vsoxseg4ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f32m1_m(...) __riscv_vsoxseg5ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f32m1_m(...) __riscv_vsoxseg6ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f32m1_m(...) __riscv_vsoxseg7ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f32m1_m(...) __riscv_vsoxseg8ei32_v_f32m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m2_m(...) __riscv_vsoxseg2ei32_v_f32m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f32m2_m(...) __riscv_vsoxseg3ei32_v_f32m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f32m2_m(...) __riscv_vsoxseg4ei32_v_f32m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f32m4_m(...) __riscv_vsoxseg2ei32_v_f32m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f32mf2_m(...) __riscv_vsoxseg2ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f32mf2_m(...) __riscv_vsoxseg3ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f32mf2_m(...) __riscv_vsoxseg4ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f32mf2_m(...) __riscv_vsoxseg5ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f32mf2_m(...) __riscv_vsoxseg6ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f32mf2_m(...) __riscv_vsoxseg7ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f32mf2_m(...) __riscv_vsoxseg8ei64_v_f32mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m1_m(...) __riscv_vsoxseg2ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f32m1_m(...) __riscv_vsoxseg3ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f32m1_m(...) __riscv_vsoxseg4ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f32m1_m(...) __riscv_vsoxseg5ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f32m1_m(...) __riscv_vsoxseg6ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f32m1_m(...) __riscv_vsoxseg7ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f32m1_m(...) __riscv_vsoxseg8ei64_v_f32m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m2_m(...) __riscv_vsoxseg2ei64_v_f32m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f32m2_m(...) __riscv_vsoxseg3ei64_v_f32m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f32m2_m(...) __riscv_vsoxseg4ei64_v_f32m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f32m4_m(...) __riscv_vsoxseg2ei64_v_f32m4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m1_m(...) __riscv_vsoxseg2ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f64m1_m(...) __riscv_vsoxseg3ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f64m1_m(...) __riscv_vsoxseg4ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_f64m1_m(...) __riscv_vsoxseg5ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_f64m1_m(...) __riscv_vsoxseg6ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_f64m1_m(...) __riscv_vsoxseg7ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_f64m1_m(...) __riscv_vsoxseg8ei8_v_f64m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m2_m(...) __riscv_vsoxseg2ei8_v_f64m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_f64m2_m(...) __riscv_vsoxseg3ei8_v_f64m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_f64m2_m(...) __riscv_vsoxseg4ei8_v_f64m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_f64m4_m(...) __riscv_vsoxseg2ei8_v_f64m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m1_m(...) __riscv_vsoxseg2ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f64m1_m(...) __riscv_vsoxseg3ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f64m1_m(...) __riscv_vsoxseg4ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_f64m1_m(...) __riscv_vsoxseg5ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_f64m1_m(...) __riscv_vsoxseg6ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_f64m1_m(...) __riscv_vsoxseg7ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_f64m1_m(...) __riscv_vsoxseg8ei16_v_f64m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m2_m(...) __riscv_vsoxseg2ei16_v_f64m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_f64m2_m(...) __riscv_vsoxseg3ei16_v_f64m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_f64m2_m(...) __riscv_vsoxseg4ei16_v_f64m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_f64m4_m(...) __riscv_vsoxseg2ei16_v_f64m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m1_m(...) __riscv_vsoxseg2ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f64m1_m(...) __riscv_vsoxseg3ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f64m1_m(...) __riscv_vsoxseg4ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_f64m1_m(...) __riscv_vsoxseg5ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_f64m1_m(...) __riscv_vsoxseg6ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_f64m1_m(...) __riscv_vsoxseg7ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_f64m1_m(...) __riscv_vsoxseg8ei32_v_f64m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m2_m(...) __riscv_vsoxseg2ei32_v_f64m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_f64m2_m(...) __riscv_vsoxseg3ei32_v_f64m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_f64m2_m(...) __riscv_vsoxseg4ei32_v_f64m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_f64m4_m(...) __riscv_vsoxseg2ei32_v_f64m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m1_m(...) __riscv_vsoxseg2ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f64m1_m(...) __riscv_vsoxseg3ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f64m1_m(...) __riscv_vsoxseg4ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_f64m1_m(...) __riscv_vsoxseg5ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_f64m1_m(...) __riscv_vsoxseg6ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_f64m1_m(...) __riscv_vsoxseg7ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_f64m1_m(...) __riscv_vsoxseg8ei64_v_f64m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m2_m(...) __riscv_vsoxseg2ei64_v_f64m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_f64m2_m(...) __riscv_vsoxseg3ei64_v_f64m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_f64m2_m(...) __riscv_vsoxseg4ei64_v_f64m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_f64m4_m(...) __riscv_vsoxseg2ei64_v_f64m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f16mf4_m(...) __riscv_vsuxseg2ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f16mf4_m(...) __riscv_vsuxseg3ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f16mf4_m(...) __riscv_vsuxseg4ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f16mf4_m(...) __riscv_vsuxseg5ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f16mf4_m(...) __riscv_vsuxseg6ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f16mf4_m(...) __riscv_vsuxseg7ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f16mf4_m(...) __riscv_vsuxseg8ei8_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f16mf2_m(...) __riscv_vsuxseg2ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f16mf2_m(...) __riscv_vsuxseg3ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f16mf2_m(...) __riscv_vsuxseg4ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f16mf2_m(...) __riscv_vsuxseg5ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f16mf2_m(...) __riscv_vsuxseg6ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f16mf2_m(...) __riscv_vsuxseg7ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f16mf2_m(...) __riscv_vsuxseg8ei8_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m1_m(...) __riscv_vsuxseg2ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f16m1_m(...) __riscv_vsuxseg3ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f16m1_m(...) __riscv_vsuxseg4ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f16m1_m(...) __riscv_vsuxseg5ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f16m1_m(...) __riscv_vsuxseg6ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f16m1_m(...) __riscv_vsuxseg7ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f16m1_m(...) __riscv_vsuxseg8ei8_v_f16m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m2_m(...) __riscv_vsuxseg2ei8_v_f16m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f16m2_m(...) __riscv_vsuxseg3ei8_v_f16m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f16m2_m(...) __riscv_vsuxseg4ei8_v_f16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f16m4_m(...) __riscv_vsuxseg2ei8_v_f16m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f16mf4_m(...) __riscv_vsuxseg2ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f16mf4_m(...) __riscv_vsuxseg3ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f16mf4_m(...) __riscv_vsuxseg4ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f16mf4_m(...) __riscv_vsuxseg5ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f16mf4_m(...) __riscv_vsuxseg6ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f16mf4_m(...) __riscv_vsuxseg7ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f16mf4_m(...) __riscv_vsuxseg8ei16_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f16mf2_m(...) __riscv_vsuxseg2ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f16mf2_m(...) __riscv_vsuxseg3ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f16mf2_m(...) __riscv_vsuxseg4ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f16mf2_m(...) __riscv_vsuxseg5ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f16mf2_m(...) __riscv_vsuxseg6ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f16mf2_m(...) __riscv_vsuxseg7ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f16mf2_m(...) __riscv_vsuxseg8ei16_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m1_m(...) __riscv_vsuxseg2ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f16m1_m(...) __riscv_vsuxseg3ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f16m1_m(...) __riscv_vsuxseg4ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f16m1_m(...) __riscv_vsuxseg5ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f16m1_m(...) __riscv_vsuxseg6ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f16m1_m(...) __riscv_vsuxseg7ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f16m1_m(...) __riscv_vsuxseg8ei16_v_f16m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m2_m(...) __riscv_vsuxseg2ei16_v_f16m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f16m2_m(...) __riscv_vsuxseg3ei16_v_f16m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f16m2_m(...) __riscv_vsuxseg4ei16_v_f16m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f16m4_m(...) __riscv_vsuxseg2ei16_v_f16m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f16mf4_m(...) __riscv_vsuxseg2ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f16mf4_m(...) __riscv_vsuxseg3ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f16mf4_m(...) __riscv_vsuxseg4ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f16mf4_m(...) __riscv_vsuxseg5ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f16mf4_m(...) __riscv_vsuxseg6ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f16mf4_m(...) __riscv_vsuxseg7ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f16mf4_m(...) __riscv_vsuxseg8ei32_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f16mf2_m(...) __riscv_vsuxseg2ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f16mf2_m(...) __riscv_vsuxseg3ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f16mf2_m(...) __riscv_vsuxseg4ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f16mf2_m(...) __riscv_vsuxseg5ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f16mf2_m(...) __riscv_vsuxseg6ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f16mf2_m(...) __riscv_vsuxseg7ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f16mf2_m(...) __riscv_vsuxseg8ei32_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m1_m(...) __riscv_vsuxseg2ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f16m1_m(...) __riscv_vsuxseg3ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f16m1_m(...) __riscv_vsuxseg4ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f16m1_m(...) __riscv_vsuxseg5ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f16m1_m(...) __riscv_vsuxseg6ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f16m1_m(...) __riscv_vsuxseg7ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f16m1_m(...) __riscv_vsuxseg8ei32_v_f16m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m2_m(...) __riscv_vsuxseg2ei32_v_f16m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f16m2_m(...) __riscv_vsuxseg3ei32_v_f16m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f16m2_m(...) __riscv_vsuxseg4ei32_v_f16m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f16m4_m(...) __riscv_vsuxseg2ei32_v_f16m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f16mf4_m(...) __riscv_vsuxseg2ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f16mf4_m(...) __riscv_vsuxseg3ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f16mf4_m(...) __riscv_vsuxseg4ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f16mf4_m(...) __riscv_vsuxseg5ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f16mf4_m(...) __riscv_vsuxseg6ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f16mf4_m(...) __riscv_vsuxseg7ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f16mf4_m(...) __riscv_vsuxseg8ei64_v_f16mf4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f16mf2_m(...) __riscv_vsuxseg2ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f16mf2_m(...) __riscv_vsuxseg3ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f16mf2_m(...) __riscv_vsuxseg4ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f16mf2_m(...) __riscv_vsuxseg5ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f16mf2_m(...) __riscv_vsuxseg6ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f16mf2_m(...) __riscv_vsuxseg7ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f16mf2_m(...) __riscv_vsuxseg8ei64_v_f16mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f16m1_m(...) __riscv_vsuxseg2ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f16m1_m(...) __riscv_vsuxseg3ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f16m1_m(...) __riscv_vsuxseg4ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f16m1_m(...) __riscv_vsuxseg5ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f16m1_m(...) __riscv_vsuxseg6ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f16m1_m(...) __riscv_vsuxseg7ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f16m1_m(...) __riscv_vsuxseg8ei64_v_f16m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f16m2_m(...) __riscv_vsuxseg2ei64_v_f16m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f16m2_m(...) __riscv_vsuxseg3ei64_v_f16m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f16m2_m(...) __riscv_vsuxseg4ei64_v_f16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f32mf2_m(...) __riscv_vsuxseg2ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f32mf2_m(...) __riscv_vsuxseg3ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f32mf2_m(...) __riscv_vsuxseg4ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f32mf2_m(...) __riscv_vsuxseg5ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f32mf2_m(...) __riscv_vsuxseg6ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f32mf2_m(...) __riscv_vsuxseg7ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f32mf2_m(...) __riscv_vsuxseg8ei8_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m1_m(...) __riscv_vsuxseg2ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f32m1_m(...) __riscv_vsuxseg3ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f32m1_m(...) __riscv_vsuxseg4ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f32m1_m(...) __riscv_vsuxseg5ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f32m1_m(...) __riscv_vsuxseg6ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f32m1_m(...) __riscv_vsuxseg7ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f32m1_m(...) __riscv_vsuxseg8ei8_v_f32m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m2_m(...) __riscv_vsuxseg2ei8_v_f32m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f32m2_m(...) __riscv_vsuxseg3ei8_v_f32m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f32m2_m(...) __riscv_vsuxseg4ei8_v_f32m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f32m4_m(...) __riscv_vsuxseg2ei8_v_f32m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f32mf2_m(...) __riscv_vsuxseg2ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f32mf2_m(...) __riscv_vsuxseg3ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f32mf2_m(...) __riscv_vsuxseg4ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f32mf2_m(...) __riscv_vsuxseg5ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f32mf2_m(...) __riscv_vsuxseg6ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f32mf2_m(...) __riscv_vsuxseg7ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f32mf2_m(...) __riscv_vsuxseg8ei16_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m1_m(...) __riscv_vsuxseg2ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f32m1_m(...) __riscv_vsuxseg3ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f32m1_m(...) __riscv_vsuxseg4ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f32m1_m(...) __riscv_vsuxseg5ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f32m1_m(...) __riscv_vsuxseg6ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f32m1_m(...) __riscv_vsuxseg7ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f32m1_m(...) __riscv_vsuxseg8ei16_v_f32m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m2_m(...) __riscv_vsuxseg2ei16_v_f32m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f32m2_m(...) __riscv_vsuxseg3ei16_v_f32m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f32m2_m(...) __riscv_vsuxseg4ei16_v_f32m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f32m4_m(...) __riscv_vsuxseg2ei16_v_f32m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f32mf2_m(...) __riscv_vsuxseg2ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f32mf2_m(...) __riscv_vsuxseg3ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f32mf2_m(...) __riscv_vsuxseg4ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f32mf2_m(...) __riscv_vsuxseg5ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f32mf2_m(...) __riscv_vsuxseg6ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f32mf2_m(...) __riscv_vsuxseg7ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f32mf2_m(...) __riscv_vsuxseg8ei32_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m1_m(...) __riscv_vsuxseg2ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f32m1_m(...) __riscv_vsuxseg3ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f32m1_m(...) __riscv_vsuxseg4ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f32m1_m(...) __riscv_vsuxseg5ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f32m1_m(...) __riscv_vsuxseg6ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f32m1_m(...) __riscv_vsuxseg7ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f32m1_m(...) __riscv_vsuxseg8ei32_v_f32m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m2_m(...) __riscv_vsuxseg2ei32_v_f32m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f32m2_m(...) __riscv_vsuxseg3ei32_v_f32m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f32m2_m(...) __riscv_vsuxseg4ei32_v_f32m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f32m4_m(...) __riscv_vsuxseg2ei32_v_f32m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f32mf2_m(...) __riscv_vsuxseg2ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f32mf2_m(...) __riscv_vsuxseg3ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f32mf2_m(...) __riscv_vsuxseg4ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f32mf2_m(...) __riscv_vsuxseg5ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f32mf2_m(...) __riscv_vsuxseg6ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f32mf2_m(...) __riscv_vsuxseg7ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f32mf2_m(...) __riscv_vsuxseg8ei64_v_f32mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m1_m(...) __riscv_vsuxseg2ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f32m1_m(...) __riscv_vsuxseg3ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f32m1_m(...) __riscv_vsuxseg4ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f32m1_m(...) __riscv_vsuxseg5ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f32m1_m(...) __riscv_vsuxseg6ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f32m1_m(...) __riscv_vsuxseg7ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f32m1_m(...) __riscv_vsuxseg8ei64_v_f32m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m2_m(...) __riscv_vsuxseg2ei64_v_f32m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f32m2_m(...) __riscv_vsuxseg3ei64_v_f32m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f32m2_m(...) __riscv_vsuxseg4ei64_v_f32m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f32m4_m(...) __riscv_vsuxseg2ei64_v_f32m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m1_m(...) __riscv_vsuxseg2ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f64m1_m(...) __riscv_vsuxseg3ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f64m1_m(...) __riscv_vsuxseg4ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_f64m1_m(...) __riscv_vsuxseg5ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_f64m1_m(...) __riscv_vsuxseg6ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_f64m1_m(...) __riscv_vsuxseg7ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_f64m1_m(...) __riscv_vsuxseg8ei8_v_f64m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m2_m(...) __riscv_vsuxseg2ei8_v_f64m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_f64m2_m(...) __riscv_vsuxseg3ei8_v_f64m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_f64m2_m(...) __riscv_vsuxseg4ei8_v_f64m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_f64m4_m(...) __riscv_vsuxseg2ei8_v_f64m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m1_m(...) __riscv_vsuxseg2ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f64m1_m(...) __riscv_vsuxseg3ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f64m1_m(...) __riscv_vsuxseg4ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_f64m1_m(...) __riscv_vsuxseg5ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_f64m1_m(...) __riscv_vsuxseg6ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_f64m1_m(...) __riscv_vsuxseg7ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_f64m1_m(...) __riscv_vsuxseg8ei16_v_f64m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m2_m(...) __riscv_vsuxseg2ei16_v_f64m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_f64m2_m(...) __riscv_vsuxseg3ei16_v_f64m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_f64m2_m(...) __riscv_vsuxseg4ei16_v_f64m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_f64m4_m(...) __riscv_vsuxseg2ei16_v_f64m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m1_m(...) __riscv_vsuxseg2ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f64m1_m(...) __riscv_vsuxseg3ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f64m1_m(...) __riscv_vsuxseg4ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_f64m1_m(...) __riscv_vsuxseg5ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_f64m1_m(...) __riscv_vsuxseg6ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_f64m1_m(...) __riscv_vsuxseg7ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_f64m1_m(...) __riscv_vsuxseg8ei32_v_f64m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m2_m(...) __riscv_vsuxseg2ei32_v_f64m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_f64m2_m(...) __riscv_vsuxseg3ei32_v_f64m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_f64m2_m(...) __riscv_vsuxseg4ei32_v_f64m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_f64m4_m(...) __riscv_vsuxseg2ei32_v_f64m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m1_m(...) __riscv_vsuxseg2ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f64m1_m(...) __riscv_vsuxseg3ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f64m1_m(...) __riscv_vsuxseg4ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_f64m1_m(...) __riscv_vsuxseg5ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_f64m1_m(...) __riscv_vsuxseg6ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_f64m1_m(...) __riscv_vsuxseg7ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_f64m1_m(...) __riscv_vsuxseg8ei64_v_f64m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m2_m(...) __riscv_vsuxseg2ei64_v_f64m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_f64m2_m(...) __riscv_vsuxseg3ei64_v_f64m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_f64m2_m(...) __riscv_vsuxseg4ei64_v_f64m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_f64m4_m(...) __riscv_vsuxseg2ei64_v_f64m4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf8_m(...) __riscv_vsoxseg2ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf8_m(...) __riscv_vsoxseg3ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf8_m(...) __riscv_vsoxseg4ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf8_m(...) __riscv_vsoxseg5ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf8_m(...) __riscv_vsoxseg6ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf8_m(...) __riscv_vsoxseg7ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf8_m(...) __riscv_vsoxseg8ei8_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf4_m(...) __riscv_vsoxseg2ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf4_m(...) __riscv_vsoxseg3ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf4_m(...) __riscv_vsoxseg4ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf4_m(...) __riscv_vsoxseg5ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf4_m(...) __riscv_vsoxseg6ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf4_m(...) __riscv_vsoxseg7ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf4_m(...) __riscv_vsoxseg8ei8_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8mf2_m(...) __riscv_vsoxseg2ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i8mf2_m(...) __riscv_vsoxseg3ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i8mf2_m(...) __riscv_vsoxseg4ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i8mf2_m(...) __riscv_vsoxseg5ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i8mf2_m(...) __riscv_vsoxseg6ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i8mf2_m(...) __riscv_vsoxseg7ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i8mf2_m(...) __riscv_vsoxseg8ei8_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m1_m(...) __riscv_vsoxseg2ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i8m1_m(...) __riscv_vsoxseg3ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i8m1_m(...) __riscv_vsoxseg4ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i8m1_m(...) __riscv_vsoxseg5ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i8m1_m(...) __riscv_vsoxseg6ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i8m1_m(...) __riscv_vsoxseg7ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i8m1_m(...) __riscv_vsoxseg8ei8_v_i8m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m2_m(...) __riscv_vsoxseg2ei8_v_i8m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i8m2_m(...) __riscv_vsoxseg3ei8_v_i8m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i8m2_m(...) __riscv_vsoxseg4ei8_v_i8m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i8m4_m(...) __riscv_vsoxseg2ei8_v_i8m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf8_m(...) __riscv_vsoxseg2ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf8_m(...) __riscv_vsoxseg3ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf8_m(...) __riscv_vsoxseg4ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf8_m(...) __riscv_vsoxseg5ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf8_m(...) __riscv_vsoxseg6ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf8_m(...) __riscv_vsoxseg7ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf8_m(...) __riscv_vsoxseg8ei16_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf4_m(...) __riscv_vsoxseg2ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf4_m(...) __riscv_vsoxseg3ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf4_m(...) __riscv_vsoxseg4ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf4_m(...) __riscv_vsoxseg5ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf4_m(...) __riscv_vsoxseg6ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf4_m(...) __riscv_vsoxseg7ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf4_m(...) __riscv_vsoxseg8ei16_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8mf2_m(...) __riscv_vsoxseg2ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i8mf2_m(...) __riscv_vsoxseg3ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i8mf2_m(...) __riscv_vsoxseg4ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i8mf2_m(...) __riscv_vsoxseg5ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i8mf2_m(...) __riscv_vsoxseg6ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i8mf2_m(...) __riscv_vsoxseg7ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i8mf2_m(...) __riscv_vsoxseg8ei16_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m1_m(...) __riscv_vsoxseg2ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i8m1_m(...) __riscv_vsoxseg3ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i8m1_m(...) __riscv_vsoxseg4ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i8m1_m(...) __riscv_vsoxseg5ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i8m1_m(...) __riscv_vsoxseg6ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i8m1_m(...) __riscv_vsoxseg7ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i8m1_m(...) __riscv_vsoxseg8ei16_v_i8m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m2_m(...) __riscv_vsoxseg2ei16_v_i8m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i8m2_m(...) __riscv_vsoxseg3ei16_v_i8m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i8m2_m(...) __riscv_vsoxseg4ei16_v_i8m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i8m4_m(...) __riscv_vsoxseg2ei16_v_i8m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf8_m(...) __riscv_vsoxseg2ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf8_m(...) __riscv_vsoxseg3ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf8_m(...) __riscv_vsoxseg4ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf8_m(...) __riscv_vsoxseg5ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf8_m(...) __riscv_vsoxseg6ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf8_m(...) __riscv_vsoxseg7ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf8_m(...) __riscv_vsoxseg8ei32_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf4_m(...) __riscv_vsoxseg2ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf4_m(...) __riscv_vsoxseg3ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf4_m(...) __riscv_vsoxseg4ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf4_m(...) __riscv_vsoxseg5ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf4_m(...) __riscv_vsoxseg6ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf4_m(...) __riscv_vsoxseg7ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf4_m(...) __riscv_vsoxseg8ei32_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i8mf2_m(...) __riscv_vsoxseg2ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i8mf2_m(...) __riscv_vsoxseg3ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i8mf2_m(...) __riscv_vsoxseg4ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i8mf2_m(...) __riscv_vsoxseg5ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i8mf2_m(...) __riscv_vsoxseg6ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i8mf2_m(...) __riscv_vsoxseg7ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i8mf2_m(...) __riscv_vsoxseg8ei32_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i8m1_m(...) __riscv_vsoxseg2ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i8m1_m(...) __riscv_vsoxseg3ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i8m1_m(...) __riscv_vsoxseg4ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i8m1_m(...) __riscv_vsoxseg5ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i8m1_m(...) __riscv_vsoxseg6ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i8m1_m(...) __riscv_vsoxseg7ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i8m1_m(...) __riscv_vsoxseg8ei32_v_i8m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i8m2_m(...) __riscv_vsoxseg2ei32_v_i8m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i8m2_m(...) __riscv_vsoxseg3ei32_v_i8m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i8m2_m(...) __riscv_vsoxseg4ei32_v_i8m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf8_m(...) __riscv_vsoxseg2ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf8_m(...) __riscv_vsoxseg3ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf8_m(...) __riscv_vsoxseg4ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf8_m(...) __riscv_vsoxseg5ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf8_m(...) __riscv_vsoxseg6ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf8_m(...) __riscv_vsoxseg7ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf8_m(...) __riscv_vsoxseg8ei64_v_i8mf8_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf4_m(...) __riscv_vsoxseg2ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf4_m(...) __riscv_vsoxseg3ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf4_m(...) __riscv_vsoxseg4ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf4_m(...) __riscv_vsoxseg5ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf4_m(...) __riscv_vsoxseg6ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf4_m(...) __riscv_vsoxseg7ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf4_m(...) __riscv_vsoxseg8ei64_v_i8mf4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i8mf2_m(...) __riscv_vsoxseg2ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i8mf2_m(...) __riscv_vsoxseg3ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i8mf2_m(...) __riscv_vsoxseg4ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i8mf2_m(...) __riscv_vsoxseg5ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i8mf2_m(...) __riscv_vsoxseg6ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i8mf2_m(...) __riscv_vsoxseg7ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i8mf2_m(...) __riscv_vsoxseg8ei64_v_i8mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i8m1_m(...) __riscv_vsoxseg2ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i8m1_m(...) __riscv_vsoxseg3ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i8m1_m(...) __riscv_vsoxseg4ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i8m1_m(...) __riscv_vsoxseg5ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i8m1_m(...) __riscv_vsoxseg6ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i8m1_m(...) __riscv_vsoxseg7ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i8m1_m(...) __riscv_vsoxseg8ei64_v_i8m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i16mf4_m(...) __riscv_vsoxseg2ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i16mf4_m(...) __riscv_vsoxseg3ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i16mf4_m(...) __riscv_vsoxseg4ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i16mf4_m(...) __riscv_vsoxseg5ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i16mf4_m(...) __riscv_vsoxseg6ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i16mf4_m(...) __riscv_vsoxseg7ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i16mf4_m(...) __riscv_vsoxseg8ei8_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i16mf2_m(...) __riscv_vsoxseg2ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i16mf2_m(...) __riscv_vsoxseg3ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i16mf2_m(...) __riscv_vsoxseg4ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i16mf2_m(...) __riscv_vsoxseg5ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i16mf2_m(...) __riscv_vsoxseg6ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i16mf2_m(...) __riscv_vsoxseg7ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i16mf2_m(...) __riscv_vsoxseg8ei8_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m1_m(...) __riscv_vsoxseg2ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i16m1_m(...) __riscv_vsoxseg3ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i16m1_m(...) __riscv_vsoxseg4ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i16m1_m(...) __riscv_vsoxseg5ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i16m1_m(...) __riscv_vsoxseg6ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i16m1_m(...) __riscv_vsoxseg7ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i16m1_m(...) __riscv_vsoxseg8ei8_v_i16m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m2_m(...) __riscv_vsoxseg2ei8_v_i16m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i16m2_m(...) __riscv_vsoxseg3ei8_v_i16m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i16m2_m(...) __riscv_vsoxseg4ei8_v_i16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i16m4_m(...) __riscv_vsoxseg2ei8_v_i16m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i16mf4_m(...) __riscv_vsoxseg2ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i16mf4_m(...) __riscv_vsoxseg3ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i16mf4_m(...) __riscv_vsoxseg4ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i16mf4_m(...) __riscv_vsoxseg5ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i16mf4_m(...) __riscv_vsoxseg6ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i16mf4_m(...) __riscv_vsoxseg7ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i16mf4_m(...) __riscv_vsoxseg8ei16_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i16mf2_m(...) __riscv_vsoxseg2ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i16mf2_m(...) __riscv_vsoxseg3ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i16mf2_m(...) __riscv_vsoxseg4ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i16mf2_m(...) __riscv_vsoxseg5ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i16mf2_m(...) __riscv_vsoxseg6ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i16mf2_m(...) __riscv_vsoxseg7ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i16mf2_m(...) __riscv_vsoxseg8ei16_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m1_m(...) __riscv_vsoxseg2ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i16m1_m(...) __riscv_vsoxseg3ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i16m1_m(...) __riscv_vsoxseg4ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i16m1_m(...) __riscv_vsoxseg5ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i16m1_m(...) __riscv_vsoxseg6ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i16m1_m(...) __riscv_vsoxseg7ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i16m1_m(...) __riscv_vsoxseg8ei16_v_i16m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m2_m(...) __riscv_vsoxseg2ei16_v_i16m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i16m2_m(...) __riscv_vsoxseg3ei16_v_i16m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i16m2_m(...) __riscv_vsoxseg4ei16_v_i16m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i16m4_m(...) __riscv_vsoxseg2ei16_v_i16m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i16mf4_m(...) __riscv_vsoxseg2ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i16mf4_m(...) __riscv_vsoxseg3ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i16mf4_m(...) __riscv_vsoxseg4ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i16mf4_m(...) __riscv_vsoxseg5ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i16mf4_m(...) __riscv_vsoxseg6ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i16mf4_m(...) __riscv_vsoxseg7ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i16mf4_m(...) __riscv_vsoxseg8ei32_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i16mf2_m(...) __riscv_vsoxseg2ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i16mf2_m(...) __riscv_vsoxseg3ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i16mf2_m(...) __riscv_vsoxseg4ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i16mf2_m(...) __riscv_vsoxseg5ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i16mf2_m(...) __riscv_vsoxseg6ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i16mf2_m(...) __riscv_vsoxseg7ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i16mf2_m(...) __riscv_vsoxseg8ei32_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m1_m(...) __riscv_vsoxseg2ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i16m1_m(...) __riscv_vsoxseg3ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i16m1_m(...) __riscv_vsoxseg4ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i16m1_m(...) __riscv_vsoxseg5ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i16m1_m(...) __riscv_vsoxseg6ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i16m1_m(...) __riscv_vsoxseg7ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i16m1_m(...) __riscv_vsoxseg8ei32_v_i16m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m2_m(...) __riscv_vsoxseg2ei32_v_i16m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i16m2_m(...) __riscv_vsoxseg3ei32_v_i16m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i16m2_m(...) __riscv_vsoxseg4ei32_v_i16m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i16m4_m(...) __riscv_vsoxseg2ei32_v_i16m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i16mf4_m(...) __riscv_vsoxseg2ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i16mf4_m(...) __riscv_vsoxseg3ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i16mf4_m(...) __riscv_vsoxseg4ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i16mf4_m(...) __riscv_vsoxseg5ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i16mf4_m(...) __riscv_vsoxseg6ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i16mf4_m(...) __riscv_vsoxseg7ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i16mf4_m(...) __riscv_vsoxseg8ei64_v_i16mf4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i16mf2_m(...) __riscv_vsoxseg2ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i16mf2_m(...) __riscv_vsoxseg3ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i16mf2_m(...) __riscv_vsoxseg4ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i16mf2_m(...) __riscv_vsoxseg5ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i16mf2_m(...) __riscv_vsoxseg6ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i16mf2_m(...) __riscv_vsoxseg7ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i16mf2_m(...) __riscv_vsoxseg8ei64_v_i16mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i16m1_m(...) __riscv_vsoxseg2ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i16m1_m(...) __riscv_vsoxseg3ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i16m1_m(...) __riscv_vsoxseg4ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i16m1_m(...) __riscv_vsoxseg5ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i16m1_m(...) __riscv_vsoxseg6ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i16m1_m(...) __riscv_vsoxseg7ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i16m1_m(...) __riscv_vsoxseg8ei64_v_i16m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i16m2_m(...) __riscv_vsoxseg2ei64_v_i16m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i16m2_m(...) __riscv_vsoxseg3ei64_v_i16m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i16m2_m(...) __riscv_vsoxseg4ei64_v_i16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i32mf2_m(...) __riscv_vsoxseg2ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i32mf2_m(...) __riscv_vsoxseg3ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i32mf2_m(...) __riscv_vsoxseg4ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i32mf2_m(...) __riscv_vsoxseg5ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i32mf2_m(...) __riscv_vsoxseg6ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i32mf2_m(...) __riscv_vsoxseg7ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i32mf2_m(...) __riscv_vsoxseg8ei8_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m1_m(...) __riscv_vsoxseg2ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i32m1_m(...) __riscv_vsoxseg3ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i32m1_m(...) __riscv_vsoxseg4ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i32m1_m(...) __riscv_vsoxseg5ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i32m1_m(...) __riscv_vsoxseg6ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i32m1_m(...) __riscv_vsoxseg7ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i32m1_m(...) __riscv_vsoxseg8ei8_v_i32m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m2_m(...) __riscv_vsoxseg2ei8_v_i32m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i32m2_m(...) __riscv_vsoxseg3ei8_v_i32m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i32m2_m(...) __riscv_vsoxseg4ei8_v_i32m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i32m4_m(...) __riscv_vsoxseg2ei8_v_i32m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i32mf2_m(...) __riscv_vsoxseg2ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i32mf2_m(...) __riscv_vsoxseg3ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i32mf2_m(...) __riscv_vsoxseg4ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i32mf2_m(...) __riscv_vsoxseg5ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i32mf2_m(...) __riscv_vsoxseg6ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i32mf2_m(...) __riscv_vsoxseg7ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i32mf2_m(...) __riscv_vsoxseg8ei16_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m1_m(...) __riscv_vsoxseg2ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i32m1_m(...) __riscv_vsoxseg3ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i32m1_m(...) __riscv_vsoxseg4ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i32m1_m(...) __riscv_vsoxseg5ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i32m1_m(...) __riscv_vsoxseg6ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i32m1_m(...) __riscv_vsoxseg7ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i32m1_m(...) __riscv_vsoxseg8ei16_v_i32m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m2_m(...) __riscv_vsoxseg2ei16_v_i32m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i32m2_m(...) __riscv_vsoxseg3ei16_v_i32m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i32m2_m(...) __riscv_vsoxseg4ei16_v_i32m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i32m4_m(...) __riscv_vsoxseg2ei16_v_i32m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i32mf2_m(...) __riscv_vsoxseg2ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i32mf2_m(...) __riscv_vsoxseg3ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i32mf2_m(...) __riscv_vsoxseg4ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i32mf2_m(...) __riscv_vsoxseg5ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i32mf2_m(...) __riscv_vsoxseg6ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i32mf2_m(...) __riscv_vsoxseg7ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i32mf2_m(...) __riscv_vsoxseg8ei32_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m1_m(...) __riscv_vsoxseg2ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i32m1_m(...) __riscv_vsoxseg3ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i32m1_m(...) __riscv_vsoxseg4ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i32m1_m(...) __riscv_vsoxseg5ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i32m1_m(...) __riscv_vsoxseg6ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i32m1_m(...) __riscv_vsoxseg7ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i32m1_m(...) __riscv_vsoxseg8ei32_v_i32m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m2_m(...) __riscv_vsoxseg2ei32_v_i32m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i32m2_m(...) __riscv_vsoxseg3ei32_v_i32m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i32m2_m(...) __riscv_vsoxseg4ei32_v_i32m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i32m4_m(...) __riscv_vsoxseg2ei32_v_i32m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i32mf2_m(...) __riscv_vsoxseg2ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i32mf2_m(...) __riscv_vsoxseg3ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i32mf2_m(...) __riscv_vsoxseg4ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i32mf2_m(...) __riscv_vsoxseg5ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i32mf2_m(...) __riscv_vsoxseg6ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i32mf2_m(...) __riscv_vsoxseg7ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i32mf2_m(...) __riscv_vsoxseg8ei64_v_i32mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m1_m(...) __riscv_vsoxseg2ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i32m1_m(...) __riscv_vsoxseg3ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i32m1_m(...) __riscv_vsoxseg4ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i32m1_m(...) __riscv_vsoxseg5ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i32m1_m(...) __riscv_vsoxseg6ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i32m1_m(...) __riscv_vsoxseg7ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i32m1_m(...) __riscv_vsoxseg8ei64_v_i32m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m2_m(...) __riscv_vsoxseg2ei64_v_i32m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i32m2_m(...) __riscv_vsoxseg3ei64_v_i32m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i32m2_m(...) __riscv_vsoxseg4ei64_v_i32m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i32m4_m(...) __riscv_vsoxseg2ei64_v_i32m4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m1_m(...) __riscv_vsoxseg2ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i64m1_m(...) __riscv_vsoxseg3ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i64m1_m(...) __riscv_vsoxseg4ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_i64m1_m(...) __riscv_vsoxseg5ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_i64m1_m(...) __riscv_vsoxseg6ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_i64m1_m(...) __riscv_vsoxseg7ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_i64m1_m(...) __riscv_vsoxseg8ei8_v_i64m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m2_m(...) __riscv_vsoxseg2ei8_v_i64m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_i64m2_m(...) __riscv_vsoxseg3ei8_v_i64m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_i64m2_m(...) __riscv_vsoxseg4ei8_v_i64m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_i64m4_m(...) __riscv_vsoxseg2ei8_v_i64m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m1_m(...) __riscv_vsoxseg2ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i64m1_m(...) __riscv_vsoxseg3ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i64m1_m(...) __riscv_vsoxseg4ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_i64m1_m(...) __riscv_vsoxseg5ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_i64m1_m(...) __riscv_vsoxseg6ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_i64m1_m(...) __riscv_vsoxseg7ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_i64m1_m(...) __riscv_vsoxseg8ei16_v_i64m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m2_m(...) __riscv_vsoxseg2ei16_v_i64m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_i64m2_m(...) __riscv_vsoxseg3ei16_v_i64m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_i64m2_m(...) __riscv_vsoxseg4ei16_v_i64m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_i64m4_m(...) __riscv_vsoxseg2ei16_v_i64m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m1_m(...) __riscv_vsoxseg2ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i64m1_m(...) __riscv_vsoxseg3ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i64m1_m(...) __riscv_vsoxseg4ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_i64m1_m(...) __riscv_vsoxseg5ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_i64m1_m(...) __riscv_vsoxseg6ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_i64m1_m(...) __riscv_vsoxseg7ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_i64m1_m(...) __riscv_vsoxseg8ei32_v_i64m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m2_m(...) __riscv_vsoxseg2ei32_v_i64m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_i64m2_m(...) __riscv_vsoxseg3ei32_v_i64m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_i64m2_m(...) __riscv_vsoxseg4ei32_v_i64m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_i64m4_m(...) __riscv_vsoxseg2ei32_v_i64m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m1_m(...) __riscv_vsoxseg2ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i64m1_m(...) __riscv_vsoxseg3ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i64m1_m(...) __riscv_vsoxseg4ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_i64m1_m(...) __riscv_vsoxseg5ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_i64m1_m(...) __riscv_vsoxseg6ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_i64m1_m(...) __riscv_vsoxseg7ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_i64m1_m(...) __riscv_vsoxseg8ei64_v_i64m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m2_m(...) __riscv_vsoxseg2ei64_v_i64m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_i64m2_m(...) __riscv_vsoxseg3ei64_v_i64m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_i64m2_m(...) __riscv_vsoxseg4ei64_v_i64m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_i64m4_m(...) __riscv_vsoxseg2ei64_v_i64m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf8_m(...) __riscv_vsuxseg2ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf8_m(...) __riscv_vsuxseg3ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf8_m(...) __riscv_vsuxseg4ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf8_m(...) __riscv_vsuxseg5ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf8_m(...) __riscv_vsuxseg6ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf8_m(...) __riscv_vsuxseg7ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf8_m(...) __riscv_vsuxseg8ei8_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf4_m(...) __riscv_vsuxseg2ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf4_m(...) __riscv_vsuxseg3ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf4_m(...) __riscv_vsuxseg4ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf4_m(...) __riscv_vsuxseg5ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf4_m(...) __riscv_vsuxseg6ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf4_m(...) __riscv_vsuxseg7ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf4_m(...) __riscv_vsuxseg8ei8_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8mf2_m(...) __riscv_vsuxseg2ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i8mf2_m(...) __riscv_vsuxseg3ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i8mf2_m(...) __riscv_vsuxseg4ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i8mf2_m(...) __riscv_vsuxseg5ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i8mf2_m(...) __riscv_vsuxseg6ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i8mf2_m(...) __riscv_vsuxseg7ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i8mf2_m(...) __riscv_vsuxseg8ei8_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m1_m(...) __riscv_vsuxseg2ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i8m1_m(...) __riscv_vsuxseg3ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i8m1_m(...) __riscv_vsuxseg4ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i8m1_m(...) __riscv_vsuxseg5ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i8m1_m(...) __riscv_vsuxseg6ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i8m1_m(...) __riscv_vsuxseg7ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i8m1_m(...) __riscv_vsuxseg8ei8_v_i8m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m2_m(...) __riscv_vsuxseg2ei8_v_i8m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i8m2_m(...) __riscv_vsuxseg3ei8_v_i8m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i8m2_m(...) __riscv_vsuxseg4ei8_v_i8m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i8m4_m(...) __riscv_vsuxseg2ei8_v_i8m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf8_m(...) __riscv_vsuxseg2ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf8_m(...) __riscv_vsuxseg3ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf8_m(...) __riscv_vsuxseg4ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf8_m(...) __riscv_vsuxseg5ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf8_m(...) __riscv_vsuxseg6ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf8_m(...) __riscv_vsuxseg7ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf8_m(...) __riscv_vsuxseg8ei16_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf4_m(...) __riscv_vsuxseg2ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf4_m(...) __riscv_vsuxseg3ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf4_m(...) __riscv_vsuxseg4ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf4_m(...) __riscv_vsuxseg5ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf4_m(...) __riscv_vsuxseg6ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf4_m(...) __riscv_vsuxseg7ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf4_m(...) __riscv_vsuxseg8ei16_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8mf2_m(...) __riscv_vsuxseg2ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i8mf2_m(...) __riscv_vsuxseg3ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i8mf2_m(...) __riscv_vsuxseg4ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i8mf2_m(...) __riscv_vsuxseg5ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i8mf2_m(...) __riscv_vsuxseg6ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i8mf2_m(...) __riscv_vsuxseg7ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i8mf2_m(...) __riscv_vsuxseg8ei16_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m1_m(...) __riscv_vsuxseg2ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i8m1_m(...) __riscv_vsuxseg3ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i8m1_m(...) __riscv_vsuxseg4ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i8m1_m(...) __riscv_vsuxseg5ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i8m1_m(...) __riscv_vsuxseg6ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i8m1_m(...) __riscv_vsuxseg7ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i8m1_m(...) __riscv_vsuxseg8ei16_v_i8m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m2_m(...) __riscv_vsuxseg2ei16_v_i8m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i8m2_m(...) __riscv_vsuxseg3ei16_v_i8m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i8m2_m(...) __riscv_vsuxseg4ei16_v_i8m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i8m4_m(...) __riscv_vsuxseg2ei16_v_i8m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf8_m(...) __riscv_vsuxseg2ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf8_m(...) __riscv_vsuxseg3ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf8_m(...) __riscv_vsuxseg4ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf8_m(...) __riscv_vsuxseg5ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf8_m(...) __riscv_vsuxseg6ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf8_m(...) __riscv_vsuxseg7ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf8_m(...) __riscv_vsuxseg8ei32_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf4_m(...) __riscv_vsuxseg2ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf4_m(...) __riscv_vsuxseg3ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf4_m(...) __riscv_vsuxseg4ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf4_m(...) __riscv_vsuxseg5ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf4_m(...) __riscv_vsuxseg6ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf4_m(...) __riscv_vsuxseg7ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf4_m(...) __riscv_vsuxseg8ei32_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i8mf2_m(...) __riscv_vsuxseg2ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i8mf2_m(...) __riscv_vsuxseg3ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i8mf2_m(...) __riscv_vsuxseg4ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i8mf2_m(...) __riscv_vsuxseg5ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i8mf2_m(...) __riscv_vsuxseg6ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i8mf2_m(...) __riscv_vsuxseg7ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i8mf2_m(...) __riscv_vsuxseg8ei32_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i8m1_m(...) __riscv_vsuxseg2ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i8m1_m(...) __riscv_vsuxseg3ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i8m1_m(...) __riscv_vsuxseg4ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i8m1_m(...) __riscv_vsuxseg5ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i8m1_m(...) __riscv_vsuxseg6ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i8m1_m(...) __riscv_vsuxseg7ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i8m1_m(...) __riscv_vsuxseg8ei32_v_i8m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i8m2_m(...) __riscv_vsuxseg2ei32_v_i8m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i8m2_m(...) __riscv_vsuxseg3ei32_v_i8m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i8m2_m(...) __riscv_vsuxseg4ei32_v_i8m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf8_m(...) __riscv_vsuxseg2ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf8_m(...) __riscv_vsuxseg3ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf8_m(...) __riscv_vsuxseg4ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf8_m(...) __riscv_vsuxseg5ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf8_m(...) __riscv_vsuxseg6ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf8_m(...) __riscv_vsuxseg7ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf8_m(...) __riscv_vsuxseg8ei64_v_i8mf8_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf4_m(...) __riscv_vsuxseg2ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf4_m(...) __riscv_vsuxseg3ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf4_m(...) __riscv_vsuxseg4ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf4_m(...) __riscv_vsuxseg5ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf4_m(...) __riscv_vsuxseg6ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf4_m(...) __riscv_vsuxseg7ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf4_m(...) __riscv_vsuxseg8ei64_v_i8mf4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i8mf2_m(...) __riscv_vsuxseg2ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i8mf2_m(...) __riscv_vsuxseg3ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i8mf2_m(...) __riscv_vsuxseg4ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i8mf2_m(...) __riscv_vsuxseg5ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i8mf2_m(...) __riscv_vsuxseg6ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i8mf2_m(...) __riscv_vsuxseg7ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i8mf2_m(...) __riscv_vsuxseg8ei64_v_i8mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i8m1_m(...) __riscv_vsuxseg2ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i8m1_m(...) __riscv_vsuxseg3ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i8m1_m(...) __riscv_vsuxseg4ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i8m1_m(...) __riscv_vsuxseg5ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i8m1_m(...) __riscv_vsuxseg6ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i8m1_m(...) __riscv_vsuxseg7ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i8m1_m(...) __riscv_vsuxseg8ei64_v_i8m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i16mf4_m(...) __riscv_vsuxseg2ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i16mf4_m(...) __riscv_vsuxseg3ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i16mf4_m(...) __riscv_vsuxseg4ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i16mf4_m(...) __riscv_vsuxseg5ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i16mf4_m(...) __riscv_vsuxseg6ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i16mf4_m(...) __riscv_vsuxseg7ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i16mf4_m(...) __riscv_vsuxseg8ei8_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i16mf2_m(...) __riscv_vsuxseg2ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i16mf2_m(...) __riscv_vsuxseg3ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i16mf2_m(...) __riscv_vsuxseg4ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i16mf2_m(...) __riscv_vsuxseg5ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i16mf2_m(...) __riscv_vsuxseg6ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i16mf2_m(...) __riscv_vsuxseg7ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i16mf2_m(...) __riscv_vsuxseg8ei8_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m1_m(...) __riscv_vsuxseg2ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i16m1_m(...) __riscv_vsuxseg3ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i16m1_m(...) __riscv_vsuxseg4ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i16m1_m(...) __riscv_vsuxseg5ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i16m1_m(...) __riscv_vsuxseg6ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i16m1_m(...) __riscv_vsuxseg7ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i16m1_m(...) __riscv_vsuxseg8ei8_v_i16m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m2_m(...) __riscv_vsuxseg2ei8_v_i16m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i16m2_m(...) __riscv_vsuxseg3ei8_v_i16m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i16m2_m(...) __riscv_vsuxseg4ei8_v_i16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i16m4_m(...) __riscv_vsuxseg2ei8_v_i16m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i16mf4_m(...) __riscv_vsuxseg2ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i16mf4_m(...) __riscv_vsuxseg3ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i16mf4_m(...) __riscv_vsuxseg4ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i16mf4_m(...) __riscv_vsuxseg5ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i16mf4_m(...) __riscv_vsuxseg6ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i16mf4_m(...) __riscv_vsuxseg7ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i16mf4_m(...) __riscv_vsuxseg8ei16_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i16mf2_m(...) __riscv_vsuxseg2ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i16mf2_m(...) __riscv_vsuxseg3ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i16mf2_m(...) __riscv_vsuxseg4ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i16mf2_m(...) __riscv_vsuxseg5ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i16mf2_m(...) __riscv_vsuxseg6ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i16mf2_m(...) __riscv_vsuxseg7ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i16mf2_m(...) __riscv_vsuxseg8ei16_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m1_m(...) __riscv_vsuxseg2ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i16m1_m(...) __riscv_vsuxseg3ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i16m1_m(...) __riscv_vsuxseg4ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i16m1_m(...) __riscv_vsuxseg5ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i16m1_m(...) __riscv_vsuxseg6ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i16m1_m(...) __riscv_vsuxseg7ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i16m1_m(...) __riscv_vsuxseg8ei16_v_i16m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m2_m(...) __riscv_vsuxseg2ei16_v_i16m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i16m2_m(...) __riscv_vsuxseg3ei16_v_i16m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i16m2_m(...) __riscv_vsuxseg4ei16_v_i16m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i16m4_m(...) __riscv_vsuxseg2ei16_v_i16m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i16mf4_m(...) __riscv_vsuxseg2ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i16mf4_m(...) __riscv_vsuxseg3ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i16mf4_m(...) __riscv_vsuxseg4ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i16mf4_m(...) __riscv_vsuxseg5ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i16mf4_m(...) __riscv_vsuxseg6ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i16mf4_m(...) __riscv_vsuxseg7ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i16mf4_m(...) __riscv_vsuxseg8ei32_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i16mf2_m(...) __riscv_vsuxseg2ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i16mf2_m(...) __riscv_vsuxseg3ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i16mf2_m(...) __riscv_vsuxseg4ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i16mf2_m(...) __riscv_vsuxseg5ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i16mf2_m(...) __riscv_vsuxseg6ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i16mf2_m(...) __riscv_vsuxseg7ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i16mf2_m(...) __riscv_vsuxseg8ei32_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m1_m(...) __riscv_vsuxseg2ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i16m1_m(...) __riscv_vsuxseg3ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i16m1_m(...) __riscv_vsuxseg4ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i16m1_m(...) __riscv_vsuxseg5ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i16m1_m(...) __riscv_vsuxseg6ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i16m1_m(...) __riscv_vsuxseg7ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i16m1_m(...) __riscv_vsuxseg8ei32_v_i16m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m2_m(...) __riscv_vsuxseg2ei32_v_i16m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i16m2_m(...) __riscv_vsuxseg3ei32_v_i16m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i16m2_m(...) __riscv_vsuxseg4ei32_v_i16m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i16m4_m(...) __riscv_vsuxseg2ei32_v_i16m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i16mf4_m(...) __riscv_vsuxseg2ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i16mf4_m(...) __riscv_vsuxseg3ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i16mf4_m(...) __riscv_vsuxseg4ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i16mf4_m(...) __riscv_vsuxseg5ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i16mf4_m(...) __riscv_vsuxseg6ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i16mf4_m(...) __riscv_vsuxseg7ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i16mf4_m(...) __riscv_vsuxseg8ei64_v_i16mf4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i16mf2_m(...) __riscv_vsuxseg2ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i16mf2_m(...) __riscv_vsuxseg3ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i16mf2_m(...) __riscv_vsuxseg4ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i16mf2_m(...) __riscv_vsuxseg5ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i16mf2_m(...) __riscv_vsuxseg6ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i16mf2_m(...) __riscv_vsuxseg7ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i16mf2_m(...) __riscv_vsuxseg8ei64_v_i16mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i16m1_m(...) __riscv_vsuxseg2ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i16m1_m(...) __riscv_vsuxseg3ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i16m1_m(...) __riscv_vsuxseg4ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i16m1_m(...) __riscv_vsuxseg5ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i16m1_m(...) __riscv_vsuxseg6ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i16m1_m(...) __riscv_vsuxseg7ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i16m1_m(...) __riscv_vsuxseg8ei64_v_i16m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i16m2_m(...) __riscv_vsuxseg2ei64_v_i16m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i16m2_m(...) __riscv_vsuxseg3ei64_v_i16m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i16m2_m(...) __riscv_vsuxseg4ei64_v_i16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i32mf2_m(...) __riscv_vsuxseg2ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i32mf2_m(...) __riscv_vsuxseg3ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i32mf2_m(...) __riscv_vsuxseg4ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i32mf2_m(...) __riscv_vsuxseg5ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i32mf2_m(...) __riscv_vsuxseg6ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i32mf2_m(...) __riscv_vsuxseg7ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i32mf2_m(...) __riscv_vsuxseg8ei8_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m1_m(...) __riscv_vsuxseg2ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i32m1_m(...) __riscv_vsuxseg3ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i32m1_m(...) __riscv_vsuxseg4ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i32m1_m(...) __riscv_vsuxseg5ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i32m1_m(...) __riscv_vsuxseg6ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i32m1_m(...) __riscv_vsuxseg7ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i32m1_m(...) __riscv_vsuxseg8ei8_v_i32m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m2_m(...) __riscv_vsuxseg2ei8_v_i32m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i32m2_m(...) __riscv_vsuxseg3ei8_v_i32m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i32m2_m(...) __riscv_vsuxseg4ei8_v_i32m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i32m4_m(...) __riscv_vsuxseg2ei8_v_i32m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i32mf2_m(...) __riscv_vsuxseg2ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i32mf2_m(...) __riscv_vsuxseg3ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i32mf2_m(...) __riscv_vsuxseg4ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i32mf2_m(...) __riscv_vsuxseg5ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i32mf2_m(...) __riscv_vsuxseg6ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i32mf2_m(...) __riscv_vsuxseg7ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i32mf2_m(...) __riscv_vsuxseg8ei16_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m1_m(...) __riscv_vsuxseg2ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i32m1_m(...) __riscv_vsuxseg3ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i32m1_m(...) __riscv_vsuxseg4ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i32m1_m(...) __riscv_vsuxseg5ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i32m1_m(...) __riscv_vsuxseg6ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i32m1_m(...) __riscv_vsuxseg7ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i32m1_m(...) __riscv_vsuxseg8ei16_v_i32m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m2_m(...) __riscv_vsuxseg2ei16_v_i32m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i32m2_m(...) __riscv_vsuxseg3ei16_v_i32m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i32m2_m(...) __riscv_vsuxseg4ei16_v_i32m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i32m4_m(...) __riscv_vsuxseg2ei16_v_i32m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i32mf2_m(...) __riscv_vsuxseg2ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i32mf2_m(...) __riscv_vsuxseg3ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i32mf2_m(...) __riscv_vsuxseg4ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i32mf2_m(...) __riscv_vsuxseg5ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i32mf2_m(...) __riscv_vsuxseg6ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i32mf2_m(...) __riscv_vsuxseg7ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i32mf2_m(...) __riscv_vsuxseg8ei32_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m1_m(...) __riscv_vsuxseg2ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i32m1_m(...) __riscv_vsuxseg3ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i32m1_m(...) __riscv_vsuxseg4ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i32m1_m(...) __riscv_vsuxseg5ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i32m1_m(...) __riscv_vsuxseg6ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i32m1_m(...) __riscv_vsuxseg7ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i32m1_m(...) __riscv_vsuxseg8ei32_v_i32m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m2_m(...) __riscv_vsuxseg2ei32_v_i32m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i32m2_m(...) __riscv_vsuxseg3ei32_v_i32m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i32m2_m(...) __riscv_vsuxseg4ei32_v_i32m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i32m4_m(...) __riscv_vsuxseg2ei32_v_i32m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i32mf2_m(...) __riscv_vsuxseg2ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i32mf2_m(...) __riscv_vsuxseg3ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i32mf2_m(...) __riscv_vsuxseg4ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i32mf2_m(...) __riscv_vsuxseg5ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i32mf2_m(...) __riscv_vsuxseg6ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i32mf2_m(...) __riscv_vsuxseg7ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i32mf2_m(...) __riscv_vsuxseg8ei64_v_i32mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m1_m(...) __riscv_vsuxseg2ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i32m1_m(...) __riscv_vsuxseg3ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i32m1_m(...) __riscv_vsuxseg4ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i32m1_m(...) __riscv_vsuxseg5ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i32m1_m(...) __riscv_vsuxseg6ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i32m1_m(...) __riscv_vsuxseg7ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i32m1_m(...) __riscv_vsuxseg8ei64_v_i32m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m2_m(...) __riscv_vsuxseg2ei64_v_i32m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i32m2_m(...) __riscv_vsuxseg3ei64_v_i32m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i32m2_m(...) __riscv_vsuxseg4ei64_v_i32m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i32m4_m(...) __riscv_vsuxseg2ei64_v_i32m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m1_m(...) __riscv_vsuxseg2ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i64m1_m(...) __riscv_vsuxseg3ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i64m1_m(...) __riscv_vsuxseg4ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_i64m1_m(...) __riscv_vsuxseg5ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_i64m1_m(...) __riscv_vsuxseg6ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_i64m1_m(...) __riscv_vsuxseg7ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_i64m1_m(...) __riscv_vsuxseg8ei8_v_i64m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m2_m(...) __riscv_vsuxseg2ei8_v_i64m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_i64m2_m(...) __riscv_vsuxseg3ei8_v_i64m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_i64m2_m(...) __riscv_vsuxseg4ei8_v_i64m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_i64m4_m(...) __riscv_vsuxseg2ei8_v_i64m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m1_m(...) __riscv_vsuxseg2ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i64m1_m(...) __riscv_vsuxseg3ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i64m1_m(...) __riscv_vsuxseg4ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_i64m1_m(...) __riscv_vsuxseg5ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_i64m1_m(...) __riscv_vsuxseg6ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_i64m1_m(...) __riscv_vsuxseg7ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_i64m1_m(...) __riscv_vsuxseg8ei16_v_i64m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m2_m(...) __riscv_vsuxseg2ei16_v_i64m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_i64m2_m(...) __riscv_vsuxseg3ei16_v_i64m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_i64m2_m(...) __riscv_vsuxseg4ei16_v_i64m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_i64m4_m(...) __riscv_vsuxseg2ei16_v_i64m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m1_m(...) __riscv_vsuxseg2ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i64m1_m(...) __riscv_vsuxseg3ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i64m1_m(...) __riscv_vsuxseg4ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_i64m1_m(...) __riscv_vsuxseg5ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_i64m1_m(...) __riscv_vsuxseg6ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_i64m1_m(...) __riscv_vsuxseg7ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_i64m1_m(...) __riscv_vsuxseg8ei32_v_i64m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m2_m(...) __riscv_vsuxseg2ei32_v_i64m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_i64m2_m(...) __riscv_vsuxseg3ei32_v_i64m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_i64m2_m(...) __riscv_vsuxseg4ei32_v_i64m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_i64m4_m(...) __riscv_vsuxseg2ei32_v_i64m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m1_m(...) __riscv_vsuxseg2ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i64m1_m(...) __riscv_vsuxseg3ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i64m1_m(...) __riscv_vsuxseg4ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_i64m1_m(...) __riscv_vsuxseg5ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_i64m1_m(...) __riscv_vsuxseg6ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_i64m1_m(...) __riscv_vsuxseg7ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_i64m1_m(...) __riscv_vsuxseg8ei64_v_i64m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m2_m(...) __riscv_vsuxseg2ei64_v_i64m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_i64m2_m(...) __riscv_vsuxseg3ei64_v_i64m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_i64m2_m(...) __riscv_vsuxseg4ei64_v_i64m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_i64m4_m(...) __riscv_vsuxseg2ei64_v_i64m4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf8_m(...) __riscv_vsoxseg2ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf8_m(...) __riscv_vsoxseg3ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf8_m(...) __riscv_vsoxseg4ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf8_m(...) __riscv_vsoxseg5ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf8_m(...) __riscv_vsoxseg6ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf8_m(...) __riscv_vsoxseg7ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf8_m(...) __riscv_vsoxseg8ei8_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf4_m(...) __riscv_vsoxseg2ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf4_m(...) __riscv_vsoxseg3ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf4_m(...) __riscv_vsoxseg4ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf4_m(...) __riscv_vsoxseg5ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf4_m(...) __riscv_vsoxseg6ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf4_m(...) __riscv_vsoxseg7ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf4_m(...) __riscv_vsoxseg8ei8_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8mf2_m(...) __riscv_vsoxseg2ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u8mf2_m(...) __riscv_vsoxseg3ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u8mf2_m(...) __riscv_vsoxseg4ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u8mf2_m(...) __riscv_vsoxseg5ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u8mf2_m(...) __riscv_vsoxseg6ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u8mf2_m(...) __riscv_vsoxseg7ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u8mf2_m(...) __riscv_vsoxseg8ei8_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m1_m(...) __riscv_vsoxseg2ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u8m1_m(...) __riscv_vsoxseg3ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u8m1_m(...) __riscv_vsoxseg4ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u8m1_m(...) __riscv_vsoxseg5ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u8m1_m(...) __riscv_vsoxseg6ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u8m1_m(...) __riscv_vsoxseg7ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u8m1_m(...) __riscv_vsoxseg8ei8_v_u8m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m2_m(...) __riscv_vsoxseg2ei8_v_u8m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u8m2_m(...) __riscv_vsoxseg3ei8_v_u8m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u8m2_m(...) __riscv_vsoxseg4ei8_v_u8m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u8m4_m(...) __riscv_vsoxseg2ei8_v_u8m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf8_m(...) __riscv_vsoxseg2ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf8_m(...) __riscv_vsoxseg3ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf8_m(...) __riscv_vsoxseg4ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf8_m(...) __riscv_vsoxseg5ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf8_m(...) __riscv_vsoxseg6ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf8_m(...) __riscv_vsoxseg7ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf8_m(...) __riscv_vsoxseg8ei16_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf4_m(...) __riscv_vsoxseg2ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf4_m(...) __riscv_vsoxseg3ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf4_m(...) __riscv_vsoxseg4ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf4_m(...) __riscv_vsoxseg5ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf4_m(...) __riscv_vsoxseg6ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf4_m(...) __riscv_vsoxseg7ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf4_m(...) __riscv_vsoxseg8ei16_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8mf2_m(...) __riscv_vsoxseg2ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u8mf2_m(...) __riscv_vsoxseg3ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u8mf2_m(...) __riscv_vsoxseg4ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u8mf2_m(...) __riscv_vsoxseg5ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u8mf2_m(...) __riscv_vsoxseg6ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u8mf2_m(...) __riscv_vsoxseg7ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u8mf2_m(...) __riscv_vsoxseg8ei16_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m1_m(...) __riscv_vsoxseg2ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u8m1_m(...) __riscv_vsoxseg3ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u8m1_m(...) __riscv_vsoxseg4ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u8m1_m(...) __riscv_vsoxseg5ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u8m1_m(...) __riscv_vsoxseg6ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u8m1_m(...) __riscv_vsoxseg7ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u8m1_m(...) __riscv_vsoxseg8ei16_v_u8m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m2_m(...) __riscv_vsoxseg2ei16_v_u8m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u8m2_m(...) __riscv_vsoxseg3ei16_v_u8m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u8m2_m(...) __riscv_vsoxseg4ei16_v_u8m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u8m4_m(...) __riscv_vsoxseg2ei16_v_u8m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf8_m(...) __riscv_vsoxseg2ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf8_m(...) __riscv_vsoxseg3ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf8_m(...) __riscv_vsoxseg4ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf8_m(...) __riscv_vsoxseg5ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf8_m(...) __riscv_vsoxseg6ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf8_m(...) __riscv_vsoxseg7ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf8_m(...) __riscv_vsoxseg8ei32_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf4_m(...) __riscv_vsoxseg2ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf4_m(...) __riscv_vsoxseg3ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf4_m(...) __riscv_vsoxseg4ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf4_m(...) __riscv_vsoxseg5ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf4_m(...) __riscv_vsoxseg6ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf4_m(...) __riscv_vsoxseg7ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf4_m(...) __riscv_vsoxseg8ei32_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u8mf2_m(...) __riscv_vsoxseg2ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u8mf2_m(...) __riscv_vsoxseg3ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u8mf2_m(...) __riscv_vsoxseg4ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u8mf2_m(...) __riscv_vsoxseg5ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u8mf2_m(...) __riscv_vsoxseg6ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u8mf2_m(...) __riscv_vsoxseg7ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u8mf2_m(...) __riscv_vsoxseg8ei32_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u8m1_m(...) __riscv_vsoxseg2ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u8m1_m(...) __riscv_vsoxseg3ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u8m1_m(...) __riscv_vsoxseg4ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u8m1_m(...) __riscv_vsoxseg5ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u8m1_m(...) __riscv_vsoxseg6ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u8m1_m(...) __riscv_vsoxseg7ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u8m1_m(...) __riscv_vsoxseg8ei32_v_u8m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u8m2_m(...) __riscv_vsoxseg2ei32_v_u8m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u8m2_m(...) __riscv_vsoxseg3ei32_v_u8m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u8m2_m(...) __riscv_vsoxseg4ei32_v_u8m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf8_m(...) __riscv_vsoxseg2ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf8_m(...) __riscv_vsoxseg3ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf8_m(...) __riscv_vsoxseg4ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf8_m(...) __riscv_vsoxseg5ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf8_m(...) __riscv_vsoxseg6ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf8_m(...) __riscv_vsoxseg7ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf8_m(...) __riscv_vsoxseg8ei64_v_u8mf8_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf4_m(...) __riscv_vsoxseg2ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf4_m(...) __riscv_vsoxseg3ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf4_m(...) __riscv_vsoxseg4ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf4_m(...) __riscv_vsoxseg5ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf4_m(...) __riscv_vsoxseg6ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf4_m(...) __riscv_vsoxseg7ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf4_m(...) __riscv_vsoxseg8ei64_v_u8mf4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u8mf2_m(...) __riscv_vsoxseg2ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u8mf2_m(...) __riscv_vsoxseg3ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u8mf2_m(...) __riscv_vsoxseg4ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u8mf2_m(...) __riscv_vsoxseg5ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u8mf2_m(...) __riscv_vsoxseg6ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u8mf2_m(...) __riscv_vsoxseg7ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u8mf2_m(...) __riscv_vsoxseg8ei64_v_u8mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u8m1_m(...) __riscv_vsoxseg2ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u8m1_m(...) __riscv_vsoxseg3ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u8m1_m(...) __riscv_vsoxseg4ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u8m1_m(...) __riscv_vsoxseg5ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u8m1_m(...) __riscv_vsoxseg6ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u8m1_m(...) __riscv_vsoxseg7ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u8m1_m(...) __riscv_vsoxseg8ei64_v_u8m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u16mf4_m(...) __riscv_vsoxseg2ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u16mf4_m(...) __riscv_vsoxseg3ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u16mf4_m(...) __riscv_vsoxseg4ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u16mf4_m(...) __riscv_vsoxseg5ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u16mf4_m(...) __riscv_vsoxseg6ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u16mf4_m(...) __riscv_vsoxseg7ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u16mf4_m(...) __riscv_vsoxseg8ei8_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u16mf2_m(...) __riscv_vsoxseg2ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u16mf2_m(...) __riscv_vsoxseg3ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u16mf2_m(...) __riscv_vsoxseg4ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u16mf2_m(...) __riscv_vsoxseg5ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u16mf2_m(...) __riscv_vsoxseg6ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u16mf2_m(...) __riscv_vsoxseg7ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u16mf2_m(...) __riscv_vsoxseg8ei8_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m1_m(...) __riscv_vsoxseg2ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u16m1_m(...) __riscv_vsoxseg3ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u16m1_m(...) __riscv_vsoxseg4ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u16m1_m(...) __riscv_vsoxseg5ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u16m1_m(...) __riscv_vsoxseg6ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u16m1_m(...) __riscv_vsoxseg7ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u16m1_m(...) __riscv_vsoxseg8ei8_v_u16m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m2_m(...) __riscv_vsoxseg2ei8_v_u16m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u16m2_m(...) __riscv_vsoxseg3ei8_v_u16m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u16m2_m(...) __riscv_vsoxseg4ei8_v_u16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u16m4_m(...) __riscv_vsoxseg2ei8_v_u16m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u16mf4_m(...) __riscv_vsoxseg2ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u16mf4_m(...) __riscv_vsoxseg3ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u16mf4_m(...) __riscv_vsoxseg4ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u16mf4_m(...) __riscv_vsoxseg5ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u16mf4_m(...) __riscv_vsoxseg6ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u16mf4_m(...) __riscv_vsoxseg7ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u16mf4_m(...) __riscv_vsoxseg8ei16_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u16mf2_m(...) __riscv_vsoxseg2ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u16mf2_m(...) __riscv_vsoxseg3ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u16mf2_m(...) __riscv_vsoxseg4ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u16mf2_m(...) __riscv_vsoxseg5ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u16mf2_m(...) __riscv_vsoxseg6ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u16mf2_m(...) __riscv_vsoxseg7ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u16mf2_m(...) __riscv_vsoxseg8ei16_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m1_m(...) __riscv_vsoxseg2ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u16m1_m(...) __riscv_vsoxseg3ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u16m1_m(...) __riscv_vsoxseg4ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u16m1_m(...) __riscv_vsoxseg5ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u16m1_m(...) __riscv_vsoxseg6ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u16m1_m(...) __riscv_vsoxseg7ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u16m1_m(...) __riscv_vsoxseg8ei16_v_u16m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m2_m(...) __riscv_vsoxseg2ei16_v_u16m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u16m2_m(...) __riscv_vsoxseg3ei16_v_u16m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u16m2_m(...) __riscv_vsoxseg4ei16_v_u16m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u16m4_m(...) __riscv_vsoxseg2ei16_v_u16m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u16mf4_m(...) __riscv_vsoxseg2ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u16mf4_m(...) __riscv_vsoxseg3ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u16mf4_m(...) __riscv_vsoxseg4ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u16mf4_m(...) __riscv_vsoxseg5ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u16mf4_m(...) __riscv_vsoxseg6ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u16mf4_m(...) __riscv_vsoxseg7ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u16mf4_m(...) __riscv_vsoxseg8ei32_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u16mf2_m(...) __riscv_vsoxseg2ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u16mf2_m(...) __riscv_vsoxseg3ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u16mf2_m(...) __riscv_vsoxseg4ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u16mf2_m(...) __riscv_vsoxseg5ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u16mf2_m(...) __riscv_vsoxseg6ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u16mf2_m(...) __riscv_vsoxseg7ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u16mf2_m(...) __riscv_vsoxseg8ei32_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m1_m(...) __riscv_vsoxseg2ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u16m1_m(...) __riscv_vsoxseg3ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u16m1_m(...) __riscv_vsoxseg4ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u16m1_m(...) __riscv_vsoxseg5ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u16m1_m(...) __riscv_vsoxseg6ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u16m1_m(...) __riscv_vsoxseg7ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u16m1_m(...) __riscv_vsoxseg8ei32_v_u16m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m2_m(...) __riscv_vsoxseg2ei32_v_u16m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u16m2_m(...) __riscv_vsoxseg3ei32_v_u16m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u16m2_m(...) __riscv_vsoxseg4ei32_v_u16m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u16m4_m(...) __riscv_vsoxseg2ei32_v_u16m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u16mf4_m(...) __riscv_vsoxseg2ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u16mf4_m(...) __riscv_vsoxseg3ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u16mf4_m(...) __riscv_vsoxseg4ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u16mf4_m(...) __riscv_vsoxseg5ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u16mf4_m(...) __riscv_vsoxseg6ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u16mf4_m(...) __riscv_vsoxseg7ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u16mf4_m(...) __riscv_vsoxseg8ei64_v_u16mf4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u16mf2_m(...) __riscv_vsoxseg2ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u16mf2_m(...) __riscv_vsoxseg3ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u16mf2_m(...) __riscv_vsoxseg4ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u16mf2_m(...) __riscv_vsoxseg5ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u16mf2_m(...) __riscv_vsoxseg6ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u16mf2_m(...) __riscv_vsoxseg7ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u16mf2_m(...) __riscv_vsoxseg8ei64_v_u16mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u16m1_m(...) __riscv_vsoxseg2ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u16m1_m(...) __riscv_vsoxseg3ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u16m1_m(...) __riscv_vsoxseg4ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u16m1_m(...) __riscv_vsoxseg5ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u16m1_m(...) __riscv_vsoxseg6ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u16m1_m(...) __riscv_vsoxseg7ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u16m1_m(...) __riscv_vsoxseg8ei64_v_u16m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u16m2_m(...) __riscv_vsoxseg2ei64_v_u16m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u16m2_m(...) __riscv_vsoxseg3ei64_v_u16m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u16m2_m(...) __riscv_vsoxseg4ei64_v_u16m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u32mf2_m(...) __riscv_vsoxseg2ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u32mf2_m(...) __riscv_vsoxseg3ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u32mf2_m(...) __riscv_vsoxseg4ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u32mf2_m(...) __riscv_vsoxseg5ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u32mf2_m(...) __riscv_vsoxseg6ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u32mf2_m(...) __riscv_vsoxseg7ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u32mf2_m(...) __riscv_vsoxseg8ei8_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m1_m(...) __riscv_vsoxseg2ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u32m1_m(...) __riscv_vsoxseg3ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u32m1_m(...) __riscv_vsoxseg4ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u32m1_m(...) __riscv_vsoxseg5ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u32m1_m(...) __riscv_vsoxseg6ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u32m1_m(...) __riscv_vsoxseg7ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u32m1_m(...) __riscv_vsoxseg8ei8_v_u32m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m2_m(...) __riscv_vsoxseg2ei8_v_u32m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u32m2_m(...) __riscv_vsoxseg3ei8_v_u32m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u32m2_m(...) __riscv_vsoxseg4ei8_v_u32m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u32m4_m(...) __riscv_vsoxseg2ei8_v_u32m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u32mf2_m(...) __riscv_vsoxseg2ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u32mf2_m(...) __riscv_vsoxseg3ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u32mf2_m(...) __riscv_vsoxseg4ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u32mf2_m(...) __riscv_vsoxseg5ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u32mf2_m(...) __riscv_vsoxseg6ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u32mf2_m(...) __riscv_vsoxseg7ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u32mf2_m(...) __riscv_vsoxseg8ei16_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m1_m(...) __riscv_vsoxseg2ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u32m1_m(...) __riscv_vsoxseg3ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u32m1_m(...) __riscv_vsoxseg4ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u32m1_m(...) __riscv_vsoxseg5ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u32m1_m(...) __riscv_vsoxseg6ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u32m1_m(...) __riscv_vsoxseg7ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u32m1_m(...) __riscv_vsoxseg8ei16_v_u32m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m2_m(...) __riscv_vsoxseg2ei16_v_u32m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u32m2_m(...) __riscv_vsoxseg3ei16_v_u32m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u32m2_m(...) __riscv_vsoxseg4ei16_v_u32m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u32m4_m(...) __riscv_vsoxseg2ei16_v_u32m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u32mf2_m(...) __riscv_vsoxseg2ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u32mf2_m(...) __riscv_vsoxseg3ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u32mf2_m(...) __riscv_vsoxseg4ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u32mf2_m(...) __riscv_vsoxseg5ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u32mf2_m(...) __riscv_vsoxseg6ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u32mf2_m(...) __riscv_vsoxseg7ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u32mf2_m(...) __riscv_vsoxseg8ei32_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m1_m(...) __riscv_vsoxseg2ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u32m1_m(...) __riscv_vsoxseg3ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u32m1_m(...) __riscv_vsoxseg4ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u32m1_m(...) __riscv_vsoxseg5ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u32m1_m(...) __riscv_vsoxseg6ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u32m1_m(...) __riscv_vsoxseg7ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u32m1_m(...) __riscv_vsoxseg8ei32_v_u32m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m2_m(...) __riscv_vsoxseg2ei32_v_u32m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u32m2_m(...) __riscv_vsoxseg3ei32_v_u32m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u32m2_m(...) __riscv_vsoxseg4ei32_v_u32m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u32m4_m(...) __riscv_vsoxseg2ei32_v_u32m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u32mf2_m(...) __riscv_vsoxseg2ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u32mf2_m(...) __riscv_vsoxseg3ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u32mf2_m(...) __riscv_vsoxseg4ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u32mf2_m(...) __riscv_vsoxseg5ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u32mf2_m(...) __riscv_vsoxseg6ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u32mf2_m(...) __riscv_vsoxseg7ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u32mf2_m(...) __riscv_vsoxseg8ei64_v_u32mf2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m1_m(...) __riscv_vsoxseg2ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u32m1_m(...) __riscv_vsoxseg3ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u32m1_m(...) __riscv_vsoxseg4ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u32m1_m(...) __riscv_vsoxseg5ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u32m1_m(...) __riscv_vsoxseg6ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u32m1_m(...) __riscv_vsoxseg7ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u32m1_m(...) __riscv_vsoxseg8ei64_v_u32m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m2_m(...) __riscv_vsoxseg2ei64_v_u32m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u32m2_m(...) __riscv_vsoxseg3ei64_v_u32m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u32m2_m(...) __riscv_vsoxseg4ei64_v_u32m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u32m4_m(...) __riscv_vsoxseg2ei64_v_u32m4_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m1_m(...) __riscv_vsoxseg2ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u64m1_m(...) __riscv_vsoxseg3ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u64m1_m(...) __riscv_vsoxseg4ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg5ei8_v_u64m1_m(...) __riscv_vsoxseg5ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg6ei8_v_u64m1_m(...) __riscv_vsoxseg6ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg7ei8_v_u64m1_m(...) __riscv_vsoxseg7ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg8ei8_v_u64m1_m(...) __riscv_vsoxseg8ei8_v_u64m1_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m2_m(...) __riscv_vsoxseg2ei8_v_u64m2_m(__VA_ARGS__) +#define vsoxseg3ei8_v_u64m2_m(...) __riscv_vsoxseg3ei8_v_u64m2_m(__VA_ARGS__) +#define vsoxseg4ei8_v_u64m2_m(...) __riscv_vsoxseg4ei8_v_u64m2_m(__VA_ARGS__) +#define vsoxseg2ei8_v_u64m4_m(...) __riscv_vsoxseg2ei8_v_u64m4_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m1_m(...) __riscv_vsoxseg2ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u64m1_m(...) __riscv_vsoxseg3ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u64m1_m(...) __riscv_vsoxseg4ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg5ei16_v_u64m1_m(...) __riscv_vsoxseg5ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg6ei16_v_u64m1_m(...) __riscv_vsoxseg6ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg7ei16_v_u64m1_m(...) __riscv_vsoxseg7ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg8ei16_v_u64m1_m(...) __riscv_vsoxseg8ei16_v_u64m1_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m2_m(...) __riscv_vsoxseg2ei16_v_u64m2_m(__VA_ARGS__) +#define vsoxseg3ei16_v_u64m2_m(...) __riscv_vsoxseg3ei16_v_u64m2_m(__VA_ARGS__) +#define vsoxseg4ei16_v_u64m2_m(...) __riscv_vsoxseg4ei16_v_u64m2_m(__VA_ARGS__) +#define vsoxseg2ei16_v_u64m4_m(...) __riscv_vsoxseg2ei16_v_u64m4_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m1_m(...) __riscv_vsoxseg2ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u64m1_m(...) __riscv_vsoxseg3ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u64m1_m(...) __riscv_vsoxseg4ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg5ei32_v_u64m1_m(...) __riscv_vsoxseg5ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg6ei32_v_u64m1_m(...) __riscv_vsoxseg6ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg7ei32_v_u64m1_m(...) __riscv_vsoxseg7ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg8ei32_v_u64m1_m(...) __riscv_vsoxseg8ei32_v_u64m1_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m2_m(...) __riscv_vsoxseg2ei32_v_u64m2_m(__VA_ARGS__) +#define vsoxseg3ei32_v_u64m2_m(...) __riscv_vsoxseg3ei32_v_u64m2_m(__VA_ARGS__) +#define vsoxseg4ei32_v_u64m2_m(...) __riscv_vsoxseg4ei32_v_u64m2_m(__VA_ARGS__) +#define vsoxseg2ei32_v_u64m4_m(...) __riscv_vsoxseg2ei32_v_u64m4_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m1_m(...) __riscv_vsoxseg2ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u64m1_m(...) __riscv_vsoxseg3ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u64m1_m(...) __riscv_vsoxseg4ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg5ei64_v_u64m1_m(...) __riscv_vsoxseg5ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg6ei64_v_u64m1_m(...) __riscv_vsoxseg6ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg7ei64_v_u64m1_m(...) __riscv_vsoxseg7ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg8ei64_v_u64m1_m(...) __riscv_vsoxseg8ei64_v_u64m1_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m2_m(...) __riscv_vsoxseg2ei64_v_u64m2_m(__VA_ARGS__) +#define vsoxseg3ei64_v_u64m2_m(...) __riscv_vsoxseg3ei64_v_u64m2_m(__VA_ARGS__) +#define vsoxseg4ei64_v_u64m2_m(...) __riscv_vsoxseg4ei64_v_u64m2_m(__VA_ARGS__) +#define vsoxseg2ei64_v_u64m4_m(...) __riscv_vsoxseg2ei64_v_u64m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf8_m(...) __riscv_vsuxseg2ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf8_m(...) __riscv_vsuxseg3ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf8_m(...) __riscv_vsuxseg4ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf8_m(...) __riscv_vsuxseg5ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf8_m(...) __riscv_vsuxseg6ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf8_m(...) __riscv_vsuxseg7ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf8_m(...) __riscv_vsuxseg8ei8_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf4_m(...) __riscv_vsuxseg2ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf4_m(...) __riscv_vsuxseg3ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf4_m(...) __riscv_vsuxseg4ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf4_m(...) __riscv_vsuxseg5ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf4_m(...) __riscv_vsuxseg6ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf4_m(...) __riscv_vsuxseg7ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf4_m(...) __riscv_vsuxseg8ei8_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8mf2_m(...) __riscv_vsuxseg2ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u8mf2_m(...) __riscv_vsuxseg3ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u8mf2_m(...) __riscv_vsuxseg4ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u8mf2_m(...) __riscv_vsuxseg5ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u8mf2_m(...) __riscv_vsuxseg6ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u8mf2_m(...) __riscv_vsuxseg7ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u8mf2_m(...) __riscv_vsuxseg8ei8_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m1_m(...) __riscv_vsuxseg2ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u8m1_m(...) __riscv_vsuxseg3ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u8m1_m(...) __riscv_vsuxseg4ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u8m1_m(...) __riscv_vsuxseg5ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u8m1_m(...) __riscv_vsuxseg6ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u8m1_m(...) __riscv_vsuxseg7ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u8m1_m(...) __riscv_vsuxseg8ei8_v_u8m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m2_m(...) __riscv_vsuxseg2ei8_v_u8m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u8m2_m(...) __riscv_vsuxseg3ei8_v_u8m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u8m2_m(...) __riscv_vsuxseg4ei8_v_u8m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u8m4_m(...) __riscv_vsuxseg2ei8_v_u8m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf8_m(...) __riscv_vsuxseg2ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf8_m(...) __riscv_vsuxseg3ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf8_m(...) __riscv_vsuxseg4ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf8_m(...) __riscv_vsuxseg5ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf8_m(...) __riscv_vsuxseg6ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf8_m(...) __riscv_vsuxseg7ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf8_m(...) __riscv_vsuxseg8ei16_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf4_m(...) __riscv_vsuxseg2ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf4_m(...) __riscv_vsuxseg3ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf4_m(...) __riscv_vsuxseg4ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf4_m(...) __riscv_vsuxseg5ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf4_m(...) __riscv_vsuxseg6ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf4_m(...) __riscv_vsuxseg7ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf4_m(...) __riscv_vsuxseg8ei16_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8mf2_m(...) __riscv_vsuxseg2ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u8mf2_m(...) __riscv_vsuxseg3ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u8mf2_m(...) __riscv_vsuxseg4ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u8mf2_m(...) __riscv_vsuxseg5ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u8mf2_m(...) __riscv_vsuxseg6ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u8mf2_m(...) __riscv_vsuxseg7ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u8mf2_m(...) __riscv_vsuxseg8ei16_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m1_m(...) __riscv_vsuxseg2ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u8m1_m(...) __riscv_vsuxseg3ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u8m1_m(...) __riscv_vsuxseg4ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u8m1_m(...) __riscv_vsuxseg5ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u8m1_m(...) __riscv_vsuxseg6ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u8m1_m(...) __riscv_vsuxseg7ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u8m1_m(...) __riscv_vsuxseg8ei16_v_u8m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m2_m(...) __riscv_vsuxseg2ei16_v_u8m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u8m2_m(...) __riscv_vsuxseg3ei16_v_u8m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u8m2_m(...) __riscv_vsuxseg4ei16_v_u8m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u8m4_m(...) __riscv_vsuxseg2ei16_v_u8m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf8_m(...) __riscv_vsuxseg2ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf8_m(...) __riscv_vsuxseg3ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf8_m(...) __riscv_vsuxseg4ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf8_m(...) __riscv_vsuxseg5ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf8_m(...) __riscv_vsuxseg6ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf8_m(...) __riscv_vsuxseg7ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf8_m(...) __riscv_vsuxseg8ei32_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf4_m(...) __riscv_vsuxseg2ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf4_m(...) __riscv_vsuxseg3ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf4_m(...) __riscv_vsuxseg4ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf4_m(...) __riscv_vsuxseg5ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf4_m(...) __riscv_vsuxseg6ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf4_m(...) __riscv_vsuxseg7ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf4_m(...) __riscv_vsuxseg8ei32_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u8mf2_m(...) __riscv_vsuxseg2ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u8mf2_m(...) __riscv_vsuxseg3ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u8mf2_m(...) __riscv_vsuxseg4ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u8mf2_m(...) __riscv_vsuxseg5ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u8mf2_m(...) __riscv_vsuxseg6ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u8mf2_m(...) __riscv_vsuxseg7ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u8mf2_m(...) __riscv_vsuxseg8ei32_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u8m1_m(...) __riscv_vsuxseg2ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u8m1_m(...) __riscv_vsuxseg3ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u8m1_m(...) __riscv_vsuxseg4ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u8m1_m(...) __riscv_vsuxseg5ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u8m1_m(...) __riscv_vsuxseg6ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u8m1_m(...) __riscv_vsuxseg7ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u8m1_m(...) __riscv_vsuxseg8ei32_v_u8m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u8m2_m(...) __riscv_vsuxseg2ei32_v_u8m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u8m2_m(...) __riscv_vsuxseg3ei32_v_u8m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u8m2_m(...) __riscv_vsuxseg4ei32_v_u8m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf8_m(...) __riscv_vsuxseg2ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf8_m(...) __riscv_vsuxseg3ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf8_m(...) __riscv_vsuxseg4ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf8_m(...) __riscv_vsuxseg5ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf8_m(...) __riscv_vsuxseg6ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf8_m(...) __riscv_vsuxseg7ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf8_m(...) __riscv_vsuxseg8ei64_v_u8mf8_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf4_m(...) __riscv_vsuxseg2ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf4_m(...) __riscv_vsuxseg3ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf4_m(...) __riscv_vsuxseg4ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf4_m(...) __riscv_vsuxseg5ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf4_m(...) __riscv_vsuxseg6ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf4_m(...) __riscv_vsuxseg7ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf4_m(...) __riscv_vsuxseg8ei64_v_u8mf4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u8mf2_m(...) __riscv_vsuxseg2ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u8mf2_m(...) __riscv_vsuxseg3ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u8mf2_m(...) __riscv_vsuxseg4ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u8mf2_m(...) __riscv_vsuxseg5ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u8mf2_m(...) __riscv_vsuxseg6ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u8mf2_m(...) __riscv_vsuxseg7ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u8mf2_m(...) __riscv_vsuxseg8ei64_v_u8mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u8m1_m(...) __riscv_vsuxseg2ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u8m1_m(...) __riscv_vsuxseg3ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u8m1_m(...) __riscv_vsuxseg4ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u8m1_m(...) __riscv_vsuxseg5ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u8m1_m(...) __riscv_vsuxseg6ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u8m1_m(...) __riscv_vsuxseg7ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u8m1_m(...) __riscv_vsuxseg8ei64_v_u8m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u16mf4_m(...) __riscv_vsuxseg2ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u16mf4_m(...) __riscv_vsuxseg3ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u16mf4_m(...) __riscv_vsuxseg4ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u16mf4_m(...) __riscv_vsuxseg5ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u16mf4_m(...) __riscv_vsuxseg6ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u16mf4_m(...) __riscv_vsuxseg7ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u16mf4_m(...) __riscv_vsuxseg8ei8_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u16mf2_m(...) __riscv_vsuxseg2ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u16mf2_m(...) __riscv_vsuxseg3ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u16mf2_m(...) __riscv_vsuxseg4ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u16mf2_m(...) __riscv_vsuxseg5ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u16mf2_m(...) __riscv_vsuxseg6ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u16mf2_m(...) __riscv_vsuxseg7ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u16mf2_m(...) __riscv_vsuxseg8ei8_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m1_m(...) __riscv_vsuxseg2ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u16m1_m(...) __riscv_vsuxseg3ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u16m1_m(...) __riscv_vsuxseg4ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u16m1_m(...) __riscv_vsuxseg5ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u16m1_m(...) __riscv_vsuxseg6ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u16m1_m(...) __riscv_vsuxseg7ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u16m1_m(...) __riscv_vsuxseg8ei8_v_u16m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m2_m(...) __riscv_vsuxseg2ei8_v_u16m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u16m2_m(...) __riscv_vsuxseg3ei8_v_u16m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u16m2_m(...) __riscv_vsuxseg4ei8_v_u16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u16m4_m(...) __riscv_vsuxseg2ei8_v_u16m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u16mf4_m(...) __riscv_vsuxseg2ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u16mf4_m(...) __riscv_vsuxseg3ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u16mf4_m(...) __riscv_vsuxseg4ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u16mf4_m(...) __riscv_vsuxseg5ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u16mf4_m(...) __riscv_vsuxseg6ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u16mf4_m(...) __riscv_vsuxseg7ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u16mf4_m(...) __riscv_vsuxseg8ei16_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u16mf2_m(...) __riscv_vsuxseg2ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u16mf2_m(...) __riscv_vsuxseg3ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u16mf2_m(...) __riscv_vsuxseg4ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u16mf2_m(...) __riscv_vsuxseg5ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u16mf2_m(...) __riscv_vsuxseg6ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u16mf2_m(...) __riscv_vsuxseg7ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u16mf2_m(...) __riscv_vsuxseg8ei16_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m1_m(...) __riscv_vsuxseg2ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u16m1_m(...) __riscv_vsuxseg3ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u16m1_m(...) __riscv_vsuxseg4ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u16m1_m(...) __riscv_vsuxseg5ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u16m1_m(...) __riscv_vsuxseg6ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u16m1_m(...) __riscv_vsuxseg7ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u16m1_m(...) __riscv_vsuxseg8ei16_v_u16m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m2_m(...) __riscv_vsuxseg2ei16_v_u16m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u16m2_m(...) __riscv_vsuxseg3ei16_v_u16m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u16m2_m(...) __riscv_vsuxseg4ei16_v_u16m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u16m4_m(...) __riscv_vsuxseg2ei16_v_u16m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u16mf4_m(...) __riscv_vsuxseg2ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u16mf4_m(...) __riscv_vsuxseg3ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u16mf4_m(...) __riscv_vsuxseg4ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u16mf4_m(...) __riscv_vsuxseg5ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u16mf4_m(...) __riscv_vsuxseg6ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u16mf4_m(...) __riscv_vsuxseg7ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u16mf4_m(...) __riscv_vsuxseg8ei32_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u16mf2_m(...) __riscv_vsuxseg2ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u16mf2_m(...) __riscv_vsuxseg3ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u16mf2_m(...) __riscv_vsuxseg4ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u16mf2_m(...) __riscv_vsuxseg5ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u16mf2_m(...) __riscv_vsuxseg6ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u16mf2_m(...) __riscv_vsuxseg7ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u16mf2_m(...) __riscv_vsuxseg8ei32_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m1_m(...) __riscv_vsuxseg2ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u16m1_m(...) __riscv_vsuxseg3ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u16m1_m(...) __riscv_vsuxseg4ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u16m1_m(...) __riscv_vsuxseg5ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u16m1_m(...) __riscv_vsuxseg6ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u16m1_m(...) __riscv_vsuxseg7ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u16m1_m(...) __riscv_vsuxseg8ei32_v_u16m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m2_m(...) __riscv_vsuxseg2ei32_v_u16m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u16m2_m(...) __riscv_vsuxseg3ei32_v_u16m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u16m2_m(...) __riscv_vsuxseg4ei32_v_u16m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u16m4_m(...) __riscv_vsuxseg2ei32_v_u16m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u16mf4_m(...) __riscv_vsuxseg2ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u16mf4_m(...) __riscv_vsuxseg3ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u16mf4_m(...) __riscv_vsuxseg4ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u16mf4_m(...) __riscv_vsuxseg5ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u16mf4_m(...) __riscv_vsuxseg6ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u16mf4_m(...) __riscv_vsuxseg7ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u16mf4_m(...) __riscv_vsuxseg8ei64_v_u16mf4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u16mf2_m(...) __riscv_vsuxseg2ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u16mf2_m(...) __riscv_vsuxseg3ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u16mf2_m(...) __riscv_vsuxseg4ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u16mf2_m(...) __riscv_vsuxseg5ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u16mf2_m(...) __riscv_vsuxseg6ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u16mf2_m(...) __riscv_vsuxseg7ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u16mf2_m(...) __riscv_vsuxseg8ei64_v_u16mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u16m1_m(...) __riscv_vsuxseg2ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u16m1_m(...) __riscv_vsuxseg3ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u16m1_m(...) __riscv_vsuxseg4ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u16m1_m(...) __riscv_vsuxseg5ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u16m1_m(...) __riscv_vsuxseg6ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u16m1_m(...) __riscv_vsuxseg7ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u16m1_m(...) __riscv_vsuxseg8ei64_v_u16m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u16m2_m(...) __riscv_vsuxseg2ei64_v_u16m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u16m2_m(...) __riscv_vsuxseg3ei64_v_u16m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u16m2_m(...) __riscv_vsuxseg4ei64_v_u16m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u32mf2_m(...) __riscv_vsuxseg2ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u32mf2_m(...) __riscv_vsuxseg3ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u32mf2_m(...) __riscv_vsuxseg4ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u32mf2_m(...) __riscv_vsuxseg5ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u32mf2_m(...) __riscv_vsuxseg6ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u32mf2_m(...) __riscv_vsuxseg7ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u32mf2_m(...) __riscv_vsuxseg8ei8_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m1_m(...) __riscv_vsuxseg2ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u32m1_m(...) __riscv_vsuxseg3ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u32m1_m(...) __riscv_vsuxseg4ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u32m1_m(...) __riscv_vsuxseg5ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u32m1_m(...) __riscv_vsuxseg6ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u32m1_m(...) __riscv_vsuxseg7ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u32m1_m(...) __riscv_vsuxseg8ei8_v_u32m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m2_m(...) __riscv_vsuxseg2ei8_v_u32m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u32m2_m(...) __riscv_vsuxseg3ei8_v_u32m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u32m2_m(...) __riscv_vsuxseg4ei8_v_u32m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u32m4_m(...) __riscv_vsuxseg2ei8_v_u32m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u32mf2_m(...) __riscv_vsuxseg2ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u32mf2_m(...) __riscv_vsuxseg3ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u32mf2_m(...) __riscv_vsuxseg4ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u32mf2_m(...) __riscv_vsuxseg5ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u32mf2_m(...) __riscv_vsuxseg6ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u32mf2_m(...) __riscv_vsuxseg7ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u32mf2_m(...) __riscv_vsuxseg8ei16_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m1_m(...) __riscv_vsuxseg2ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u32m1_m(...) __riscv_vsuxseg3ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u32m1_m(...) __riscv_vsuxseg4ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u32m1_m(...) __riscv_vsuxseg5ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u32m1_m(...) __riscv_vsuxseg6ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u32m1_m(...) __riscv_vsuxseg7ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u32m1_m(...) __riscv_vsuxseg8ei16_v_u32m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m2_m(...) __riscv_vsuxseg2ei16_v_u32m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u32m2_m(...) __riscv_vsuxseg3ei16_v_u32m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u32m2_m(...) __riscv_vsuxseg4ei16_v_u32m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u32m4_m(...) __riscv_vsuxseg2ei16_v_u32m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u32mf2_m(...) __riscv_vsuxseg2ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u32mf2_m(...) __riscv_vsuxseg3ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u32mf2_m(...) __riscv_vsuxseg4ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u32mf2_m(...) __riscv_vsuxseg5ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u32mf2_m(...) __riscv_vsuxseg6ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u32mf2_m(...) __riscv_vsuxseg7ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u32mf2_m(...) __riscv_vsuxseg8ei32_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m1_m(...) __riscv_vsuxseg2ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u32m1_m(...) __riscv_vsuxseg3ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u32m1_m(...) __riscv_vsuxseg4ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u32m1_m(...) __riscv_vsuxseg5ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u32m1_m(...) __riscv_vsuxseg6ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u32m1_m(...) __riscv_vsuxseg7ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u32m1_m(...) __riscv_vsuxseg8ei32_v_u32m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m2_m(...) __riscv_vsuxseg2ei32_v_u32m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u32m2_m(...) __riscv_vsuxseg3ei32_v_u32m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u32m2_m(...) __riscv_vsuxseg4ei32_v_u32m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u32m4_m(...) __riscv_vsuxseg2ei32_v_u32m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u32mf2_m(...) __riscv_vsuxseg2ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u32mf2_m(...) __riscv_vsuxseg3ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u32mf2_m(...) __riscv_vsuxseg4ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u32mf2_m(...) __riscv_vsuxseg5ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u32mf2_m(...) __riscv_vsuxseg6ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u32mf2_m(...) __riscv_vsuxseg7ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u32mf2_m(...) __riscv_vsuxseg8ei64_v_u32mf2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m1_m(...) __riscv_vsuxseg2ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u32m1_m(...) __riscv_vsuxseg3ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u32m1_m(...) __riscv_vsuxseg4ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u32m1_m(...) __riscv_vsuxseg5ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u32m1_m(...) __riscv_vsuxseg6ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u32m1_m(...) __riscv_vsuxseg7ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u32m1_m(...) __riscv_vsuxseg8ei64_v_u32m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m2_m(...) __riscv_vsuxseg2ei64_v_u32m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u32m2_m(...) __riscv_vsuxseg3ei64_v_u32m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u32m2_m(...) __riscv_vsuxseg4ei64_v_u32m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u32m4_m(...) __riscv_vsuxseg2ei64_v_u32m4_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m1_m(...) __riscv_vsuxseg2ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u64m1_m(...) __riscv_vsuxseg3ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u64m1_m(...) __riscv_vsuxseg4ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg5ei8_v_u64m1_m(...) __riscv_vsuxseg5ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg6ei8_v_u64m1_m(...) __riscv_vsuxseg6ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg7ei8_v_u64m1_m(...) __riscv_vsuxseg7ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg8ei8_v_u64m1_m(...) __riscv_vsuxseg8ei8_v_u64m1_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m2_m(...) __riscv_vsuxseg2ei8_v_u64m2_m(__VA_ARGS__) +#define vsuxseg3ei8_v_u64m2_m(...) __riscv_vsuxseg3ei8_v_u64m2_m(__VA_ARGS__) +#define vsuxseg4ei8_v_u64m2_m(...) __riscv_vsuxseg4ei8_v_u64m2_m(__VA_ARGS__) +#define vsuxseg2ei8_v_u64m4_m(...) __riscv_vsuxseg2ei8_v_u64m4_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m1_m(...) __riscv_vsuxseg2ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u64m1_m(...) __riscv_vsuxseg3ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u64m1_m(...) __riscv_vsuxseg4ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg5ei16_v_u64m1_m(...) __riscv_vsuxseg5ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg6ei16_v_u64m1_m(...) __riscv_vsuxseg6ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg7ei16_v_u64m1_m(...) __riscv_vsuxseg7ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg8ei16_v_u64m1_m(...) __riscv_vsuxseg8ei16_v_u64m1_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m2_m(...) __riscv_vsuxseg2ei16_v_u64m2_m(__VA_ARGS__) +#define vsuxseg3ei16_v_u64m2_m(...) __riscv_vsuxseg3ei16_v_u64m2_m(__VA_ARGS__) +#define vsuxseg4ei16_v_u64m2_m(...) __riscv_vsuxseg4ei16_v_u64m2_m(__VA_ARGS__) +#define vsuxseg2ei16_v_u64m4_m(...) __riscv_vsuxseg2ei16_v_u64m4_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m1_m(...) __riscv_vsuxseg2ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u64m1_m(...) __riscv_vsuxseg3ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u64m1_m(...) __riscv_vsuxseg4ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg5ei32_v_u64m1_m(...) __riscv_vsuxseg5ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg6ei32_v_u64m1_m(...) __riscv_vsuxseg6ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg7ei32_v_u64m1_m(...) __riscv_vsuxseg7ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg8ei32_v_u64m1_m(...) __riscv_vsuxseg8ei32_v_u64m1_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m2_m(...) __riscv_vsuxseg2ei32_v_u64m2_m(__VA_ARGS__) +#define vsuxseg3ei32_v_u64m2_m(...) __riscv_vsuxseg3ei32_v_u64m2_m(__VA_ARGS__) +#define vsuxseg4ei32_v_u64m2_m(...) __riscv_vsuxseg4ei32_v_u64m2_m(__VA_ARGS__) +#define vsuxseg2ei32_v_u64m4_m(...) __riscv_vsuxseg2ei32_v_u64m4_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m1_m(...) __riscv_vsuxseg2ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u64m1_m(...) __riscv_vsuxseg3ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u64m1_m(...) __riscv_vsuxseg4ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg5ei64_v_u64m1_m(...) __riscv_vsuxseg5ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg6ei64_v_u64m1_m(...) __riscv_vsuxseg6ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg7ei64_v_u64m1_m(...) __riscv_vsuxseg7ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg8ei64_v_u64m1_m(...) __riscv_vsuxseg8ei64_v_u64m1_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m2_m(...) __riscv_vsuxseg2ei64_v_u64m2_m(__VA_ARGS__) +#define vsuxseg3ei64_v_u64m2_m(...) __riscv_vsuxseg3ei64_v_u64m2_m(__VA_ARGS__) +#define vsuxseg4ei64_v_u64m2_m(...) __riscv_vsuxseg4ei64_v_u64m2_m(__VA_ARGS__) +#define vsuxseg2ei64_v_u64m4_m(...) __riscv_vsuxseg2ei64_v_u64m4_m(__VA_ARGS__) +#define vadd_vv_i8mf8(...) __riscv_vadd_vv_i8mf8(__VA_ARGS__) +#define vadd_vx_i8mf8(...) __riscv_vadd_vx_i8mf8(__VA_ARGS__) +#define vadd_vv_i8mf4(...) __riscv_vadd_vv_i8mf4(__VA_ARGS__) +#define vadd_vx_i8mf4(...) __riscv_vadd_vx_i8mf4(__VA_ARGS__) +#define vadd_vv_i8mf2(...) __riscv_vadd_vv_i8mf2(__VA_ARGS__) +#define vadd_vx_i8mf2(...) __riscv_vadd_vx_i8mf2(__VA_ARGS__) +#define vadd_vv_i8m1(...) __riscv_vadd_vv_i8m1(__VA_ARGS__) +#define vadd_vx_i8m1(...) __riscv_vadd_vx_i8m1(__VA_ARGS__) +#define vadd_vv_i8m2(...) __riscv_vadd_vv_i8m2(__VA_ARGS__) +#define vadd_vx_i8m2(...) __riscv_vadd_vx_i8m2(__VA_ARGS__) +#define vadd_vv_i8m4(...) __riscv_vadd_vv_i8m4(__VA_ARGS__) +#define vadd_vx_i8m4(...) __riscv_vadd_vx_i8m4(__VA_ARGS__) +#define vadd_vv_i8m8(...) __riscv_vadd_vv_i8m8(__VA_ARGS__) +#define vadd_vx_i8m8(...) __riscv_vadd_vx_i8m8(__VA_ARGS__) +#define vadd_vv_i16mf4(...) __riscv_vadd_vv_i16mf4(__VA_ARGS__) +#define vadd_vx_i16mf4(...) __riscv_vadd_vx_i16mf4(__VA_ARGS__) +#define vadd_vv_i16mf2(...) __riscv_vadd_vv_i16mf2(__VA_ARGS__) +#define vadd_vx_i16mf2(...) __riscv_vadd_vx_i16mf2(__VA_ARGS__) +#define vadd_vv_i16m1(...) __riscv_vadd_vv_i16m1(__VA_ARGS__) +#define vadd_vx_i16m1(...) __riscv_vadd_vx_i16m1(__VA_ARGS__) +#define vadd_vv_i16m2(...) __riscv_vadd_vv_i16m2(__VA_ARGS__) +#define vadd_vx_i16m2(...) __riscv_vadd_vx_i16m2(__VA_ARGS__) +#define vadd_vv_i16m4(...) __riscv_vadd_vv_i16m4(__VA_ARGS__) +#define vadd_vx_i16m4(...) __riscv_vadd_vx_i16m4(__VA_ARGS__) +#define vadd_vv_i16m8(...) __riscv_vadd_vv_i16m8(__VA_ARGS__) +#define vadd_vx_i16m8(...) __riscv_vadd_vx_i16m8(__VA_ARGS__) +#define vadd_vv_i32mf2(...) __riscv_vadd_vv_i32mf2(__VA_ARGS__) +#define vadd_vx_i32mf2(...) __riscv_vadd_vx_i32mf2(__VA_ARGS__) +#define vadd_vv_i32m1(...) __riscv_vadd_vv_i32m1(__VA_ARGS__) +#define vadd_vx_i32m1(...) __riscv_vadd_vx_i32m1(__VA_ARGS__) +#define vadd_vv_i32m2(...) __riscv_vadd_vv_i32m2(__VA_ARGS__) +#define vadd_vx_i32m2(...) __riscv_vadd_vx_i32m2(__VA_ARGS__) +#define vadd_vv_i32m4(...) __riscv_vadd_vv_i32m4(__VA_ARGS__) +#define vadd_vx_i32m4(...) __riscv_vadd_vx_i32m4(__VA_ARGS__) +#define vadd_vv_i32m8(...) __riscv_vadd_vv_i32m8(__VA_ARGS__) +#define vadd_vx_i32m8(...) __riscv_vadd_vx_i32m8(__VA_ARGS__) +#define vadd_vv_i64m1(...) __riscv_vadd_vv_i64m1(__VA_ARGS__) +#define vadd_vx_i64m1(...) __riscv_vadd_vx_i64m1(__VA_ARGS__) +#define vadd_vv_i64m2(...) __riscv_vadd_vv_i64m2(__VA_ARGS__) +#define vadd_vx_i64m2(...) __riscv_vadd_vx_i64m2(__VA_ARGS__) +#define vadd_vv_i64m4(...) __riscv_vadd_vv_i64m4(__VA_ARGS__) +#define vadd_vx_i64m4(...) __riscv_vadd_vx_i64m4(__VA_ARGS__) +#define vadd_vv_i64m8(...) __riscv_vadd_vv_i64m8(__VA_ARGS__) +#define vadd_vx_i64m8(...) __riscv_vadd_vx_i64m8(__VA_ARGS__) +#define vsub_vv_i8mf8(...) __riscv_vsub_vv_i8mf8(__VA_ARGS__) +#define vsub_vx_i8mf8(...) __riscv_vsub_vx_i8mf8(__VA_ARGS__) +#define vsub_vv_i8mf4(...) __riscv_vsub_vv_i8mf4(__VA_ARGS__) +#define vsub_vx_i8mf4(...) __riscv_vsub_vx_i8mf4(__VA_ARGS__) +#define vsub_vv_i8mf2(...) __riscv_vsub_vv_i8mf2(__VA_ARGS__) +#define vsub_vx_i8mf2(...) __riscv_vsub_vx_i8mf2(__VA_ARGS__) +#define vsub_vv_i8m1(...) __riscv_vsub_vv_i8m1(__VA_ARGS__) +#define vsub_vx_i8m1(...) __riscv_vsub_vx_i8m1(__VA_ARGS__) +#define vsub_vv_i8m2(...) __riscv_vsub_vv_i8m2(__VA_ARGS__) +#define vsub_vx_i8m2(...) __riscv_vsub_vx_i8m2(__VA_ARGS__) +#define vsub_vv_i8m4(...) __riscv_vsub_vv_i8m4(__VA_ARGS__) +#define vsub_vx_i8m4(...) __riscv_vsub_vx_i8m4(__VA_ARGS__) +#define vsub_vv_i8m8(...) __riscv_vsub_vv_i8m8(__VA_ARGS__) +#define vsub_vx_i8m8(...) __riscv_vsub_vx_i8m8(__VA_ARGS__) +#define vsub_vv_i16mf4(...) __riscv_vsub_vv_i16mf4(__VA_ARGS__) +#define vsub_vx_i16mf4(...) __riscv_vsub_vx_i16mf4(__VA_ARGS__) +#define vsub_vv_i16mf2(...) __riscv_vsub_vv_i16mf2(__VA_ARGS__) +#define vsub_vx_i16mf2(...) __riscv_vsub_vx_i16mf2(__VA_ARGS__) +#define vsub_vv_i16m1(...) __riscv_vsub_vv_i16m1(__VA_ARGS__) +#define vsub_vx_i16m1(...) __riscv_vsub_vx_i16m1(__VA_ARGS__) +#define vsub_vv_i16m2(...) __riscv_vsub_vv_i16m2(__VA_ARGS__) +#define vsub_vx_i16m2(...) __riscv_vsub_vx_i16m2(__VA_ARGS__) +#define vsub_vv_i16m4(...) __riscv_vsub_vv_i16m4(__VA_ARGS__) +#define vsub_vx_i16m4(...) __riscv_vsub_vx_i16m4(__VA_ARGS__) +#define vsub_vv_i16m8(...) __riscv_vsub_vv_i16m8(__VA_ARGS__) +#define vsub_vx_i16m8(...) __riscv_vsub_vx_i16m8(__VA_ARGS__) +#define vsub_vv_i32mf2(...) __riscv_vsub_vv_i32mf2(__VA_ARGS__) +#define vsub_vx_i32mf2(...) __riscv_vsub_vx_i32mf2(__VA_ARGS__) +#define vsub_vv_i32m1(...) __riscv_vsub_vv_i32m1(__VA_ARGS__) +#define vsub_vx_i32m1(...) __riscv_vsub_vx_i32m1(__VA_ARGS__) +#define vsub_vv_i32m2(...) __riscv_vsub_vv_i32m2(__VA_ARGS__) +#define vsub_vx_i32m2(...) __riscv_vsub_vx_i32m2(__VA_ARGS__) +#define vsub_vv_i32m4(...) __riscv_vsub_vv_i32m4(__VA_ARGS__) +#define vsub_vx_i32m4(...) __riscv_vsub_vx_i32m4(__VA_ARGS__) +#define vsub_vv_i32m8(...) __riscv_vsub_vv_i32m8(__VA_ARGS__) +#define vsub_vx_i32m8(...) __riscv_vsub_vx_i32m8(__VA_ARGS__) +#define vsub_vv_i64m1(...) __riscv_vsub_vv_i64m1(__VA_ARGS__) +#define vsub_vx_i64m1(...) __riscv_vsub_vx_i64m1(__VA_ARGS__) +#define vsub_vv_i64m2(...) __riscv_vsub_vv_i64m2(__VA_ARGS__) +#define vsub_vx_i64m2(...) __riscv_vsub_vx_i64m2(__VA_ARGS__) +#define vsub_vv_i64m4(...) __riscv_vsub_vv_i64m4(__VA_ARGS__) +#define vsub_vx_i64m4(...) __riscv_vsub_vx_i64m4(__VA_ARGS__) +#define vsub_vv_i64m8(...) __riscv_vsub_vv_i64m8(__VA_ARGS__) +#define vsub_vx_i64m8(...) __riscv_vsub_vx_i64m8(__VA_ARGS__) +#define vrsub_vx_i8mf8(...) __riscv_vrsub_vx_i8mf8(__VA_ARGS__) +#define vrsub_vx_i8mf4(...) __riscv_vrsub_vx_i8mf4(__VA_ARGS__) +#define vrsub_vx_i8mf2(...) __riscv_vrsub_vx_i8mf2(__VA_ARGS__) +#define vrsub_vx_i8m1(...) __riscv_vrsub_vx_i8m1(__VA_ARGS__) +#define vrsub_vx_i8m2(...) __riscv_vrsub_vx_i8m2(__VA_ARGS__) +#define vrsub_vx_i8m4(...) __riscv_vrsub_vx_i8m4(__VA_ARGS__) +#define vrsub_vx_i8m8(...) __riscv_vrsub_vx_i8m8(__VA_ARGS__) +#define vrsub_vx_i16mf4(...) __riscv_vrsub_vx_i16mf4(__VA_ARGS__) +#define vrsub_vx_i16mf2(...) __riscv_vrsub_vx_i16mf2(__VA_ARGS__) +#define vrsub_vx_i16m1(...) __riscv_vrsub_vx_i16m1(__VA_ARGS__) +#define vrsub_vx_i16m2(...) __riscv_vrsub_vx_i16m2(__VA_ARGS__) +#define vrsub_vx_i16m4(...) __riscv_vrsub_vx_i16m4(__VA_ARGS__) +#define vrsub_vx_i16m8(...) __riscv_vrsub_vx_i16m8(__VA_ARGS__) +#define vrsub_vx_i32mf2(...) __riscv_vrsub_vx_i32mf2(__VA_ARGS__) +#define vrsub_vx_i32m1(...) __riscv_vrsub_vx_i32m1(__VA_ARGS__) +#define vrsub_vx_i32m2(...) __riscv_vrsub_vx_i32m2(__VA_ARGS__) +#define vrsub_vx_i32m4(...) __riscv_vrsub_vx_i32m4(__VA_ARGS__) +#define vrsub_vx_i32m8(...) __riscv_vrsub_vx_i32m8(__VA_ARGS__) +#define vrsub_vx_i64m1(...) __riscv_vrsub_vx_i64m1(__VA_ARGS__) +#define vrsub_vx_i64m2(...) __riscv_vrsub_vx_i64m2(__VA_ARGS__) +#define vrsub_vx_i64m4(...) __riscv_vrsub_vx_i64m4(__VA_ARGS__) +#define vrsub_vx_i64m8(...) __riscv_vrsub_vx_i64m8(__VA_ARGS__) +#define vneg_v_i8mf8(...) __riscv_vneg_v_i8mf8(__VA_ARGS__) +#define vneg_v_i8mf4(...) __riscv_vneg_v_i8mf4(__VA_ARGS__) +#define vneg_v_i8mf2(...) __riscv_vneg_v_i8mf2(__VA_ARGS__) +#define vneg_v_i8m1(...) __riscv_vneg_v_i8m1(__VA_ARGS__) +#define vneg_v_i8m2(...) __riscv_vneg_v_i8m2(__VA_ARGS__) +#define vneg_v_i8m4(...) __riscv_vneg_v_i8m4(__VA_ARGS__) +#define vneg_v_i8m8(...) __riscv_vneg_v_i8m8(__VA_ARGS__) +#define vneg_v_i16mf4(...) __riscv_vneg_v_i16mf4(__VA_ARGS__) +#define vneg_v_i16mf2(...) __riscv_vneg_v_i16mf2(__VA_ARGS__) +#define vneg_v_i16m1(...) __riscv_vneg_v_i16m1(__VA_ARGS__) +#define vneg_v_i16m2(...) __riscv_vneg_v_i16m2(__VA_ARGS__) +#define vneg_v_i16m4(...) __riscv_vneg_v_i16m4(__VA_ARGS__) +#define vneg_v_i16m8(...) __riscv_vneg_v_i16m8(__VA_ARGS__) +#define vneg_v_i32mf2(...) __riscv_vneg_v_i32mf2(__VA_ARGS__) +#define vneg_v_i32m1(...) __riscv_vneg_v_i32m1(__VA_ARGS__) +#define vneg_v_i32m2(...) __riscv_vneg_v_i32m2(__VA_ARGS__) +#define vneg_v_i32m4(...) __riscv_vneg_v_i32m4(__VA_ARGS__) +#define vneg_v_i32m8(...) __riscv_vneg_v_i32m8(__VA_ARGS__) +#define vneg_v_i64m1(...) __riscv_vneg_v_i64m1(__VA_ARGS__) +#define vneg_v_i64m2(...) __riscv_vneg_v_i64m2(__VA_ARGS__) +#define vneg_v_i64m4(...) __riscv_vneg_v_i64m4(__VA_ARGS__) +#define vneg_v_i64m8(...) __riscv_vneg_v_i64m8(__VA_ARGS__) +#define vadd_vv_u8mf8(...) __riscv_vadd_vv_u8mf8(__VA_ARGS__) +#define vadd_vx_u8mf8(...) __riscv_vadd_vx_u8mf8(__VA_ARGS__) +#define vadd_vv_u8mf4(...) __riscv_vadd_vv_u8mf4(__VA_ARGS__) +#define vadd_vx_u8mf4(...) __riscv_vadd_vx_u8mf4(__VA_ARGS__) +#define vadd_vv_u8mf2(...) __riscv_vadd_vv_u8mf2(__VA_ARGS__) +#define vadd_vx_u8mf2(...) __riscv_vadd_vx_u8mf2(__VA_ARGS__) +#define vadd_vv_u8m1(...) __riscv_vadd_vv_u8m1(__VA_ARGS__) +#define vadd_vx_u8m1(...) __riscv_vadd_vx_u8m1(__VA_ARGS__) +#define vadd_vv_u8m2(...) __riscv_vadd_vv_u8m2(__VA_ARGS__) +#define vadd_vx_u8m2(...) __riscv_vadd_vx_u8m2(__VA_ARGS__) +#define vadd_vv_u8m4(...) __riscv_vadd_vv_u8m4(__VA_ARGS__) +#define vadd_vx_u8m4(...) __riscv_vadd_vx_u8m4(__VA_ARGS__) +#define vadd_vv_u8m8(...) __riscv_vadd_vv_u8m8(__VA_ARGS__) +#define vadd_vx_u8m8(...) __riscv_vadd_vx_u8m8(__VA_ARGS__) +#define vadd_vv_u16mf4(...) __riscv_vadd_vv_u16mf4(__VA_ARGS__) +#define vadd_vx_u16mf4(...) __riscv_vadd_vx_u16mf4(__VA_ARGS__) +#define vadd_vv_u16mf2(...) __riscv_vadd_vv_u16mf2(__VA_ARGS__) +#define vadd_vx_u16mf2(...) __riscv_vadd_vx_u16mf2(__VA_ARGS__) +#define vadd_vv_u16m1(...) __riscv_vadd_vv_u16m1(__VA_ARGS__) +#define vadd_vx_u16m1(...) __riscv_vadd_vx_u16m1(__VA_ARGS__) +#define vadd_vv_u16m2(...) __riscv_vadd_vv_u16m2(__VA_ARGS__) +#define vadd_vx_u16m2(...) __riscv_vadd_vx_u16m2(__VA_ARGS__) +#define vadd_vv_u16m4(...) __riscv_vadd_vv_u16m4(__VA_ARGS__) +#define vadd_vx_u16m4(...) __riscv_vadd_vx_u16m4(__VA_ARGS__) +#define vadd_vv_u16m8(...) __riscv_vadd_vv_u16m8(__VA_ARGS__) +#define vadd_vx_u16m8(...) __riscv_vadd_vx_u16m8(__VA_ARGS__) +#define vadd_vv_u32mf2(...) __riscv_vadd_vv_u32mf2(__VA_ARGS__) +#define vadd_vx_u32mf2(...) __riscv_vadd_vx_u32mf2(__VA_ARGS__) +#define vadd_vv_u32m1(...) __riscv_vadd_vv_u32m1(__VA_ARGS__) +#define vadd_vx_u32m1(...) __riscv_vadd_vx_u32m1(__VA_ARGS__) +#define vadd_vv_u32m2(...) __riscv_vadd_vv_u32m2(__VA_ARGS__) +#define vadd_vx_u32m2(...) __riscv_vadd_vx_u32m2(__VA_ARGS__) +#define vadd_vv_u32m4(...) __riscv_vadd_vv_u32m4(__VA_ARGS__) +#define vadd_vx_u32m4(...) __riscv_vadd_vx_u32m4(__VA_ARGS__) +#define vadd_vv_u32m8(...) __riscv_vadd_vv_u32m8(__VA_ARGS__) +#define vadd_vx_u32m8(...) __riscv_vadd_vx_u32m8(__VA_ARGS__) +#define vadd_vv_u64m1(...) __riscv_vadd_vv_u64m1(__VA_ARGS__) +#define vadd_vx_u64m1(...) __riscv_vadd_vx_u64m1(__VA_ARGS__) +#define vadd_vv_u64m2(...) __riscv_vadd_vv_u64m2(__VA_ARGS__) +#define vadd_vx_u64m2(...) __riscv_vadd_vx_u64m2(__VA_ARGS__) +#define vadd_vv_u64m4(...) __riscv_vadd_vv_u64m4(__VA_ARGS__) +#define vadd_vx_u64m4(...) __riscv_vadd_vx_u64m4(__VA_ARGS__) +#define vadd_vv_u64m8(...) __riscv_vadd_vv_u64m8(__VA_ARGS__) +#define vadd_vx_u64m8(...) __riscv_vadd_vx_u64m8(__VA_ARGS__) +#define vsub_vv_u8mf8(...) __riscv_vsub_vv_u8mf8(__VA_ARGS__) +#define vsub_vx_u8mf8(...) __riscv_vsub_vx_u8mf8(__VA_ARGS__) +#define vsub_vv_u8mf4(...) __riscv_vsub_vv_u8mf4(__VA_ARGS__) +#define vsub_vx_u8mf4(...) __riscv_vsub_vx_u8mf4(__VA_ARGS__) +#define vsub_vv_u8mf2(...) __riscv_vsub_vv_u8mf2(__VA_ARGS__) +#define vsub_vx_u8mf2(...) __riscv_vsub_vx_u8mf2(__VA_ARGS__) +#define vsub_vv_u8m1(...) __riscv_vsub_vv_u8m1(__VA_ARGS__) +#define vsub_vx_u8m1(...) __riscv_vsub_vx_u8m1(__VA_ARGS__) +#define vsub_vv_u8m2(...) __riscv_vsub_vv_u8m2(__VA_ARGS__) +#define vsub_vx_u8m2(...) __riscv_vsub_vx_u8m2(__VA_ARGS__) +#define vsub_vv_u8m4(...) __riscv_vsub_vv_u8m4(__VA_ARGS__) +#define vsub_vx_u8m4(...) __riscv_vsub_vx_u8m4(__VA_ARGS__) +#define vsub_vv_u8m8(...) __riscv_vsub_vv_u8m8(__VA_ARGS__) +#define vsub_vx_u8m8(...) __riscv_vsub_vx_u8m8(__VA_ARGS__) +#define vsub_vv_u16mf4(...) __riscv_vsub_vv_u16mf4(__VA_ARGS__) +#define vsub_vx_u16mf4(...) __riscv_vsub_vx_u16mf4(__VA_ARGS__) +#define vsub_vv_u16mf2(...) __riscv_vsub_vv_u16mf2(__VA_ARGS__) +#define vsub_vx_u16mf2(...) __riscv_vsub_vx_u16mf2(__VA_ARGS__) +#define vsub_vv_u16m1(...) __riscv_vsub_vv_u16m1(__VA_ARGS__) +#define vsub_vx_u16m1(...) __riscv_vsub_vx_u16m1(__VA_ARGS__) +#define vsub_vv_u16m2(...) __riscv_vsub_vv_u16m2(__VA_ARGS__) +#define vsub_vx_u16m2(...) __riscv_vsub_vx_u16m2(__VA_ARGS__) +#define vsub_vv_u16m4(...) __riscv_vsub_vv_u16m4(__VA_ARGS__) +#define vsub_vx_u16m4(...) __riscv_vsub_vx_u16m4(__VA_ARGS__) +#define vsub_vv_u16m8(...) __riscv_vsub_vv_u16m8(__VA_ARGS__) +#define vsub_vx_u16m8(...) __riscv_vsub_vx_u16m8(__VA_ARGS__) +#define vsub_vv_u32mf2(...) __riscv_vsub_vv_u32mf2(__VA_ARGS__) +#define vsub_vx_u32mf2(...) __riscv_vsub_vx_u32mf2(__VA_ARGS__) +#define vsub_vv_u32m1(...) __riscv_vsub_vv_u32m1(__VA_ARGS__) +#define vsub_vx_u32m1(...) __riscv_vsub_vx_u32m1(__VA_ARGS__) +#define vsub_vv_u32m2(...) __riscv_vsub_vv_u32m2(__VA_ARGS__) +#define vsub_vx_u32m2(...) __riscv_vsub_vx_u32m2(__VA_ARGS__) +#define vsub_vv_u32m4(...) __riscv_vsub_vv_u32m4(__VA_ARGS__) +#define vsub_vx_u32m4(...) __riscv_vsub_vx_u32m4(__VA_ARGS__) +#define vsub_vv_u32m8(...) __riscv_vsub_vv_u32m8(__VA_ARGS__) +#define vsub_vx_u32m8(...) __riscv_vsub_vx_u32m8(__VA_ARGS__) +#define vsub_vv_u64m1(...) __riscv_vsub_vv_u64m1(__VA_ARGS__) +#define vsub_vx_u64m1(...) __riscv_vsub_vx_u64m1(__VA_ARGS__) +#define vsub_vv_u64m2(...) __riscv_vsub_vv_u64m2(__VA_ARGS__) +#define vsub_vx_u64m2(...) __riscv_vsub_vx_u64m2(__VA_ARGS__) +#define vsub_vv_u64m4(...) __riscv_vsub_vv_u64m4(__VA_ARGS__) +#define vsub_vx_u64m4(...) __riscv_vsub_vx_u64m4(__VA_ARGS__) +#define vsub_vv_u64m8(...) __riscv_vsub_vv_u64m8(__VA_ARGS__) +#define vsub_vx_u64m8(...) __riscv_vsub_vx_u64m8(__VA_ARGS__) +#define vrsub_vx_u8mf8(...) __riscv_vrsub_vx_u8mf8(__VA_ARGS__) +#define vrsub_vx_u8mf4(...) __riscv_vrsub_vx_u8mf4(__VA_ARGS__) +#define vrsub_vx_u8mf2(...) __riscv_vrsub_vx_u8mf2(__VA_ARGS__) +#define vrsub_vx_u8m1(...) __riscv_vrsub_vx_u8m1(__VA_ARGS__) +#define vrsub_vx_u8m2(...) __riscv_vrsub_vx_u8m2(__VA_ARGS__) +#define vrsub_vx_u8m4(...) __riscv_vrsub_vx_u8m4(__VA_ARGS__) +#define vrsub_vx_u8m8(...) __riscv_vrsub_vx_u8m8(__VA_ARGS__) +#define vrsub_vx_u16mf4(...) __riscv_vrsub_vx_u16mf4(__VA_ARGS__) +#define vrsub_vx_u16mf2(...) __riscv_vrsub_vx_u16mf2(__VA_ARGS__) +#define vrsub_vx_u16m1(...) __riscv_vrsub_vx_u16m1(__VA_ARGS__) +#define vrsub_vx_u16m2(...) __riscv_vrsub_vx_u16m2(__VA_ARGS__) +#define vrsub_vx_u16m4(...) __riscv_vrsub_vx_u16m4(__VA_ARGS__) +#define vrsub_vx_u16m8(...) __riscv_vrsub_vx_u16m8(__VA_ARGS__) +#define vrsub_vx_u32mf2(...) __riscv_vrsub_vx_u32mf2(__VA_ARGS__) +#define vrsub_vx_u32m1(...) __riscv_vrsub_vx_u32m1(__VA_ARGS__) +#define vrsub_vx_u32m2(...) __riscv_vrsub_vx_u32m2(__VA_ARGS__) +#define vrsub_vx_u32m4(...) __riscv_vrsub_vx_u32m4(__VA_ARGS__) +#define vrsub_vx_u32m8(...) __riscv_vrsub_vx_u32m8(__VA_ARGS__) +#define vrsub_vx_u64m1(...) __riscv_vrsub_vx_u64m1(__VA_ARGS__) +#define vrsub_vx_u64m2(...) __riscv_vrsub_vx_u64m2(__VA_ARGS__) +#define vrsub_vx_u64m4(...) __riscv_vrsub_vx_u64m4(__VA_ARGS__) +#define vrsub_vx_u64m8(...) __riscv_vrsub_vx_u64m8(__VA_ARGS__) +// masked functions +#define vadd_vv_i8mf8_m(...) __riscv_vadd_vv_i8mf8_tumu(__VA_ARGS__) +#define vadd_vx_i8mf8_m(...) __riscv_vadd_vx_i8mf8_tumu(__VA_ARGS__) +#define vadd_vv_i8mf4_m(...) __riscv_vadd_vv_i8mf4_tumu(__VA_ARGS__) +#define vadd_vx_i8mf4_m(...) __riscv_vadd_vx_i8mf4_tumu(__VA_ARGS__) +#define vadd_vv_i8mf2_m(...) __riscv_vadd_vv_i8mf2_tumu(__VA_ARGS__) +#define vadd_vx_i8mf2_m(...) __riscv_vadd_vx_i8mf2_tumu(__VA_ARGS__) +#define vadd_vv_i8m1_m(...) __riscv_vadd_vv_i8m1_tumu(__VA_ARGS__) +#define vadd_vx_i8m1_m(...) __riscv_vadd_vx_i8m1_tumu(__VA_ARGS__) +#define vadd_vv_i8m2_m(...) __riscv_vadd_vv_i8m2_tumu(__VA_ARGS__) +#define vadd_vx_i8m2_m(...) __riscv_vadd_vx_i8m2_tumu(__VA_ARGS__) +#define vadd_vv_i8m4_m(...) __riscv_vadd_vv_i8m4_tumu(__VA_ARGS__) +#define vadd_vx_i8m4_m(...) __riscv_vadd_vx_i8m4_tumu(__VA_ARGS__) +#define vadd_vv_i8m8_m(...) __riscv_vadd_vv_i8m8_tumu(__VA_ARGS__) +#define vadd_vx_i8m8_m(...) __riscv_vadd_vx_i8m8_tumu(__VA_ARGS__) +#define vadd_vv_i16mf4_m(...) __riscv_vadd_vv_i16mf4_tumu(__VA_ARGS__) +#define vadd_vx_i16mf4_m(...) __riscv_vadd_vx_i16mf4_tumu(__VA_ARGS__) +#define vadd_vv_i16mf2_m(...) __riscv_vadd_vv_i16mf2_tumu(__VA_ARGS__) +#define vadd_vx_i16mf2_m(...) __riscv_vadd_vx_i16mf2_tumu(__VA_ARGS__) +#define vadd_vv_i16m1_m(...) __riscv_vadd_vv_i16m1_tumu(__VA_ARGS__) +#define vadd_vx_i16m1_m(...) __riscv_vadd_vx_i16m1_tumu(__VA_ARGS__) +#define vadd_vv_i16m2_m(...) __riscv_vadd_vv_i16m2_tumu(__VA_ARGS__) +#define vadd_vx_i16m2_m(...) __riscv_vadd_vx_i16m2_tumu(__VA_ARGS__) +#define vadd_vv_i16m4_m(...) __riscv_vadd_vv_i16m4_tumu(__VA_ARGS__) +#define vadd_vx_i16m4_m(...) __riscv_vadd_vx_i16m4_tumu(__VA_ARGS__) +#define vadd_vv_i16m8_m(...) __riscv_vadd_vv_i16m8_tumu(__VA_ARGS__) +#define vadd_vx_i16m8_m(...) __riscv_vadd_vx_i16m8_tumu(__VA_ARGS__) +#define vadd_vv_i32mf2_m(...) __riscv_vadd_vv_i32mf2_tumu(__VA_ARGS__) +#define vadd_vx_i32mf2_m(...) __riscv_vadd_vx_i32mf2_tumu(__VA_ARGS__) +#define vadd_vv_i32m1_m(...) __riscv_vadd_vv_i32m1_tumu(__VA_ARGS__) +#define vadd_vx_i32m1_m(...) __riscv_vadd_vx_i32m1_tumu(__VA_ARGS__) +#define vadd_vv_i32m2_m(...) __riscv_vadd_vv_i32m2_tumu(__VA_ARGS__) +#define vadd_vx_i32m2_m(...) __riscv_vadd_vx_i32m2_tumu(__VA_ARGS__) +#define vadd_vv_i32m4_m(...) __riscv_vadd_vv_i32m4_tumu(__VA_ARGS__) +#define vadd_vx_i32m4_m(...) __riscv_vadd_vx_i32m4_tumu(__VA_ARGS__) +#define vadd_vv_i32m8_m(...) __riscv_vadd_vv_i32m8_tumu(__VA_ARGS__) +#define vadd_vx_i32m8_m(...) __riscv_vadd_vx_i32m8_tumu(__VA_ARGS__) +#define vadd_vv_i64m1_m(...) __riscv_vadd_vv_i64m1_tumu(__VA_ARGS__) +#define vadd_vx_i64m1_m(...) __riscv_vadd_vx_i64m1_tumu(__VA_ARGS__) +#define vadd_vv_i64m2_m(...) __riscv_vadd_vv_i64m2_tumu(__VA_ARGS__) +#define vadd_vx_i64m2_m(...) __riscv_vadd_vx_i64m2_tumu(__VA_ARGS__) +#define vadd_vv_i64m4_m(...) __riscv_vadd_vv_i64m4_tumu(__VA_ARGS__) +#define vadd_vx_i64m4_m(...) __riscv_vadd_vx_i64m4_tumu(__VA_ARGS__) +#define vadd_vv_i64m8_m(...) __riscv_vadd_vv_i64m8_tumu(__VA_ARGS__) +#define vadd_vx_i64m8_m(...) __riscv_vadd_vx_i64m8_tumu(__VA_ARGS__) +#define vsub_vv_i8mf8_m(...) __riscv_vsub_vv_i8mf8_tumu(__VA_ARGS__) +#define vsub_vx_i8mf8_m(...) __riscv_vsub_vx_i8mf8_tumu(__VA_ARGS__) +#define vsub_vv_i8mf4_m(...) __riscv_vsub_vv_i8mf4_tumu(__VA_ARGS__) +#define vsub_vx_i8mf4_m(...) __riscv_vsub_vx_i8mf4_tumu(__VA_ARGS__) +#define vsub_vv_i8mf2_m(...) __riscv_vsub_vv_i8mf2_tumu(__VA_ARGS__) +#define vsub_vx_i8mf2_m(...) __riscv_vsub_vx_i8mf2_tumu(__VA_ARGS__) +#define vsub_vv_i8m1_m(...) __riscv_vsub_vv_i8m1_tumu(__VA_ARGS__) +#define vsub_vx_i8m1_m(...) __riscv_vsub_vx_i8m1_tumu(__VA_ARGS__) +#define vsub_vv_i8m2_m(...) __riscv_vsub_vv_i8m2_tumu(__VA_ARGS__) +#define vsub_vx_i8m2_m(...) __riscv_vsub_vx_i8m2_tumu(__VA_ARGS__) +#define vsub_vv_i8m4_m(...) __riscv_vsub_vv_i8m4_tumu(__VA_ARGS__) +#define vsub_vx_i8m4_m(...) __riscv_vsub_vx_i8m4_tumu(__VA_ARGS__) +#define vsub_vv_i8m8_m(...) __riscv_vsub_vv_i8m8_tumu(__VA_ARGS__) +#define vsub_vx_i8m8_m(...) __riscv_vsub_vx_i8m8_tumu(__VA_ARGS__) +#define vsub_vv_i16mf4_m(...) __riscv_vsub_vv_i16mf4_tumu(__VA_ARGS__) +#define vsub_vx_i16mf4_m(...) __riscv_vsub_vx_i16mf4_tumu(__VA_ARGS__) +#define vsub_vv_i16mf2_m(...) __riscv_vsub_vv_i16mf2_tumu(__VA_ARGS__) +#define vsub_vx_i16mf2_m(...) __riscv_vsub_vx_i16mf2_tumu(__VA_ARGS__) +#define vsub_vv_i16m1_m(...) __riscv_vsub_vv_i16m1_tumu(__VA_ARGS__) +#define vsub_vx_i16m1_m(...) __riscv_vsub_vx_i16m1_tumu(__VA_ARGS__) +#define vsub_vv_i16m2_m(...) __riscv_vsub_vv_i16m2_tumu(__VA_ARGS__) +#define vsub_vx_i16m2_m(...) __riscv_vsub_vx_i16m2_tumu(__VA_ARGS__) +#define vsub_vv_i16m4_m(...) __riscv_vsub_vv_i16m4_tumu(__VA_ARGS__) +#define vsub_vx_i16m4_m(...) __riscv_vsub_vx_i16m4_tumu(__VA_ARGS__) +#define vsub_vv_i16m8_m(...) __riscv_vsub_vv_i16m8_tumu(__VA_ARGS__) +#define vsub_vx_i16m8_m(...) __riscv_vsub_vx_i16m8_tumu(__VA_ARGS__) +#define vsub_vv_i32mf2_m(...) __riscv_vsub_vv_i32mf2_tumu(__VA_ARGS__) +#define vsub_vx_i32mf2_m(...) __riscv_vsub_vx_i32mf2_tumu(__VA_ARGS__) +#define vsub_vv_i32m1_m(...) __riscv_vsub_vv_i32m1_tumu(__VA_ARGS__) +#define vsub_vx_i32m1_m(...) __riscv_vsub_vx_i32m1_tumu(__VA_ARGS__) +#define vsub_vv_i32m2_m(...) __riscv_vsub_vv_i32m2_tumu(__VA_ARGS__) +#define vsub_vx_i32m2_m(...) __riscv_vsub_vx_i32m2_tumu(__VA_ARGS__) +#define vsub_vv_i32m4_m(...) __riscv_vsub_vv_i32m4_tumu(__VA_ARGS__) +#define vsub_vx_i32m4_m(...) __riscv_vsub_vx_i32m4_tumu(__VA_ARGS__) +#define vsub_vv_i32m8_m(...) __riscv_vsub_vv_i32m8_tumu(__VA_ARGS__) +#define vsub_vx_i32m8_m(...) __riscv_vsub_vx_i32m8_tumu(__VA_ARGS__) +#define vsub_vv_i64m1_m(...) __riscv_vsub_vv_i64m1_tumu(__VA_ARGS__) +#define vsub_vx_i64m1_m(...) __riscv_vsub_vx_i64m1_tumu(__VA_ARGS__) +#define vsub_vv_i64m2_m(...) __riscv_vsub_vv_i64m2_tumu(__VA_ARGS__) +#define vsub_vx_i64m2_m(...) __riscv_vsub_vx_i64m2_tumu(__VA_ARGS__) +#define vsub_vv_i64m4_m(...) __riscv_vsub_vv_i64m4_tumu(__VA_ARGS__) +#define vsub_vx_i64m4_m(...) __riscv_vsub_vx_i64m4_tumu(__VA_ARGS__) +#define vsub_vv_i64m8_m(...) __riscv_vsub_vv_i64m8_tumu(__VA_ARGS__) +#define vsub_vx_i64m8_m(...) __riscv_vsub_vx_i64m8_tumu(__VA_ARGS__) +#define vrsub_vx_i8mf8_m(...) __riscv_vrsub_vx_i8mf8_tumu(__VA_ARGS__) +#define vrsub_vx_i8mf4_m(...) __riscv_vrsub_vx_i8mf4_tumu(__VA_ARGS__) +#define vrsub_vx_i8mf2_m(...) __riscv_vrsub_vx_i8mf2_tumu(__VA_ARGS__) +#define vrsub_vx_i8m1_m(...) __riscv_vrsub_vx_i8m1_tumu(__VA_ARGS__) +#define vrsub_vx_i8m2_m(...) __riscv_vrsub_vx_i8m2_tumu(__VA_ARGS__) +#define vrsub_vx_i8m4_m(...) __riscv_vrsub_vx_i8m4_tumu(__VA_ARGS__) +#define vrsub_vx_i8m8_m(...) __riscv_vrsub_vx_i8m8_tumu(__VA_ARGS__) +#define vrsub_vx_i16mf4_m(...) __riscv_vrsub_vx_i16mf4_tumu(__VA_ARGS__) +#define vrsub_vx_i16mf2_m(...) __riscv_vrsub_vx_i16mf2_tumu(__VA_ARGS__) +#define vrsub_vx_i16m1_m(...) __riscv_vrsub_vx_i16m1_tumu(__VA_ARGS__) +#define vrsub_vx_i16m2_m(...) __riscv_vrsub_vx_i16m2_tumu(__VA_ARGS__) +#define vrsub_vx_i16m4_m(...) __riscv_vrsub_vx_i16m4_tumu(__VA_ARGS__) +#define vrsub_vx_i16m8_m(...) __riscv_vrsub_vx_i16m8_tumu(__VA_ARGS__) +#define vrsub_vx_i32mf2_m(...) __riscv_vrsub_vx_i32mf2_tumu(__VA_ARGS__) +#define vrsub_vx_i32m1_m(...) __riscv_vrsub_vx_i32m1_tumu(__VA_ARGS__) +#define vrsub_vx_i32m2_m(...) __riscv_vrsub_vx_i32m2_tumu(__VA_ARGS__) +#define vrsub_vx_i32m4_m(...) __riscv_vrsub_vx_i32m4_tumu(__VA_ARGS__) +#define vrsub_vx_i32m8_m(...) __riscv_vrsub_vx_i32m8_tumu(__VA_ARGS__) +#define vrsub_vx_i64m1_m(...) __riscv_vrsub_vx_i64m1_tumu(__VA_ARGS__) +#define vrsub_vx_i64m2_m(...) __riscv_vrsub_vx_i64m2_tumu(__VA_ARGS__) +#define vrsub_vx_i64m4_m(...) __riscv_vrsub_vx_i64m4_tumu(__VA_ARGS__) +#define vrsub_vx_i64m8_m(...) __riscv_vrsub_vx_i64m8_tumu(__VA_ARGS__) +#define vneg_v_i8mf8_m(...) __riscv_vneg_v_i8mf8_tumu(__VA_ARGS__) +#define vneg_v_i8mf4_m(...) __riscv_vneg_v_i8mf4_tumu(__VA_ARGS__) +#define vneg_v_i8mf2_m(...) __riscv_vneg_v_i8mf2_tumu(__VA_ARGS__) +#define vneg_v_i8m1_m(...) __riscv_vneg_v_i8m1_tumu(__VA_ARGS__) +#define vneg_v_i8m2_m(...) __riscv_vneg_v_i8m2_tumu(__VA_ARGS__) +#define vneg_v_i8m4_m(...) __riscv_vneg_v_i8m4_tumu(__VA_ARGS__) +#define vneg_v_i8m8_m(...) __riscv_vneg_v_i8m8_tumu(__VA_ARGS__) +#define vneg_v_i16mf4_m(...) __riscv_vneg_v_i16mf4_tumu(__VA_ARGS__) +#define vneg_v_i16mf2_m(...) __riscv_vneg_v_i16mf2_tumu(__VA_ARGS__) +#define vneg_v_i16m1_m(...) __riscv_vneg_v_i16m1_tumu(__VA_ARGS__) +#define vneg_v_i16m2_m(...) __riscv_vneg_v_i16m2_tumu(__VA_ARGS__) +#define vneg_v_i16m4_m(...) __riscv_vneg_v_i16m4_tumu(__VA_ARGS__) +#define vneg_v_i16m8_m(...) __riscv_vneg_v_i16m8_tumu(__VA_ARGS__) +#define vneg_v_i32mf2_m(...) __riscv_vneg_v_i32mf2_tumu(__VA_ARGS__) +#define vneg_v_i32m1_m(...) __riscv_vneg_v_i32m1_tumu(__VA_ARGS__) +#define vneg_v_i32m2_m(...) __riscv_vneg_v_i32m2_tumu(__VA_ARGS__) +#define vneg_v_i32m4_m(...) __riscv_vneg_v_i32m4_tumu(__VA_ARGS__) +#define vneg_v_i32m8_m(...) __riscv_vneg_v_i32m8_tumu(__VA_ARGS__) +#define vneg_v_i64m1_m(...) __riscv_vneg_v_i64m1_tumu(__VA_ARGS__) +#define vneg_v_i64m2_m(...) __riscv_vneg_v_i64m2_tumu(__VA_ARGS__) +#define vneg_v_i64m4_m(...) __riscv_vneg_v_i64m4_tumu(__VA_ARGS__) +#define vneg_v_i64m8_m(...) __riscv_vneg_v_i64m8_tumu(__VA_ARGS__) +#define vadd_vv_u8mf8_m(...) __riscv_vadd_vv_u8mf8_tumu(__VA_ARGS__) +#define vadd_vx_u8mf8_m(...) __riscv_vadd_vx_u8mf8_tumu(__VA_ARGS__) +#define vadd_vv_u8mf4_m(...) __riscv_vadd_vv_u8mf4_tumu(__VA_ARGS__) +#define vadd_vx_u8mf4_m(...) __riscv_vadd_vx_u8mf4_tumu(__VA_ARGS__) +#define vadd_vv_u8mf2_m(...) __riscv_vadd_vv_u8mf2_tumu(__VA_ARGS__) +#define vadd_vx_u8mf2_m(...) __riscv_vadd_vx_u8mf2_tumu(__VA_ARGS__) +#define vadd_vv_u8m1_m(...) __riscv_vadd_vv_u8m1_tumu(__VA_ARGS__) +#define vadd_vx_u8m1_m(...) __riscv_vadd_vx_u8m1_tumu(__VA_ARGS__) +#define vadd_vv_u8m2_m(...) __riscv_vadd_vv_u8m2_tumu(__VA_ARGS__) +#define vadd_vx_u8m2_m(...) __riscv_vadd_vx_u8m2_tumu(__VA_ARGS__) +#define vadd_vv_u8m4_m(...) __riscv_vadd_vv_u8m4_tumu(__VA_ARGS__) +#define vadd_vx_u8m4_m(...) __riscv_vadd_vx_u8m4_tumu(__VA_ARGS__) +#define vadd_vv_u8m8_m(...) __riscv_vadd_vv_u8m8_tumu(__VA_ARGS__) +#define vadd_vx_u8m8_m(...) __riscv_vadd_vx_u8m8_tumu(__VA_ARGS__) +#define vadd_vv_u16mf4_m(...) __riscv_vadd_vv_u16mf4_tumu(__VA_ARGS__) +#define vadd_vx_u16mf4_m(...) __riscv_vadd_vx_u16mf4_tumu(__VA_ARGS__) +#define vadd_vv_u16mf2_m(...) __riscv_vadd_vv_u16mf2_tumu(__VA_ARGS__) +#define vadd_vx_u16mf2_m(...) __riscv_vadd_vx_u16mf2_tumu(__VA_ARGS__) +#define vadd_vv_u16m1_m(...) __riscv_vadd_vv_u16m1_tumu(__VA_ARGS__) +#define vadd_vx_u16m1_m(...) __riscv_vadd_vx_u16m1_tumu(__VA_ARGS__) +#define vadd_vv_u16m2_m(...) __riscv_vadd_vv_u16m2_tumu(__VA_ARGS__) +#define vadd_vx_u16m2_m(...) __riscv_vadd_vx_u16m2_tumu(__VA_ARGS__) +#define vadd_vv_u16m4_m(...) __riscv_vadd_vv_u16m4_tumu(__VA_ARGS__) +#define vadd_vx_u16m4_m(...) __riscv_vadd_vx_u16m4_tumu(__VA_ARGS__) +#define vadd_vv_u16m8_m(...) __riscv_vadd_vv_u16m8_tumu(__VA_ARGS__) +#define vadd_vx_u16m8_m(...) __riscv_vadd_vx_u16m8_tumu(__VA_ARGS__) +#define vadd_vv_u32mf2_m(...) __riscv_vadd_vv_u32mf2_tumu(__VA_ARGS__) +#define vadd_vx_u32mf2_m(...) __riscv_vadd_vx_u32mf2_tumu(__VA_ARGS__) +#define vadd_vv_u32m1_m(...) __riscv_vadd_vv_u32m1_tumu(__VA_ARGS__) +#define vadd_vx_u32m1_m(...) __riscv_vadd_vx_u32m1_tumu(__VA_ARGS__) +#define vadd_vv_u32m2_m(...) __riscv_vadd_vv_u32m2_tumu(__VA_ARGS__) +#define vadd_vx_u32m2_m(...) __riscv_vadd_vx_u32m2_tumu(__VA_ARGS__) +#define vadd_vv_u32m4_m(...) __riscv_vadd_vv_u32m4_tumu(__VA_ARGS__) +#define vadd_vx_u32m4_m(...) __riscv_vadd_vx_u32m4_tumu(__VA_ARGS__) +#define vadd_vv_u32m8_m(...) __riscv_vadd_vv_u32m8_tumu(__VA_ARGS__) +#define vadd_vx_u32m8_m(...) __riscv_vadd_vx_u32m8_tumu(__VA_ARGS__) +#define vadd_vv_u64m1_m(...) __riscv_vadd_vv_u64m1_tumu(__VA_ARGS__) +#define vadd_vx_u64m1_m(...) __riscv_vadd_vx_u64m1_tumu(__VA_ARGS__) +#define vadd_vv_u64m2_m(...) __riscv_vadd_vv_u64m2_tumu(__VA_ARGS__) +#define vadd_vx_u64m2_m(...) __riscv_vadd_vx_u64m2_tumu(__VA_ARGS__) +#define vadd_vv_u64m4_m(...) __riscv_vadd_vv_u64m4_tumu(__VA_ARGS__) +#define vadd_vx_u64m4_m(...) __riscv_vadd_vx_u64m4_tumu(__VA_ARGS__) +#define vadd_vv_u64m8_m(...) __riscv_vadd_vv_u64m8_tumu(__VA_ARGS__) +#define vadd_vx_u64m8_m(...) __riscv_vadd_vx_u64m8_tumu(__VA_ARGS__) +#define vsub_vv_u8mf8_m(...) __riscv_vsub_vv_u8mf8_tumu(__VA_ARGS__) +#define vsub_vx_u8mf8_m(...) __riscv_vsub_vx_u8mf8_tumu(__VA_ARGS__) +#define vsub_vv_u8mf4_m(...) __riscv_vsub_vv_u8mf4_tumu(__VA_ARGS__) +#define vsub_vx_u8mf4_m(...) __riscv_vsub_vx_u8mf4_tumu(__VA_ARGS__) +#define vsub_vv_u8mf2_m(...) __riscv_vsub_vv_u8mf2_tumu(__VA_ARGS__) +#define vsub_vx_u8mf2_m(...) __riscv_vsub_vx_u8mf2_tumu(__VA_ARGS__) +#define vsub_vv_u8m1_m(...) __riscv_vsub_vv_u8m1_tumu(__VA_ARGS__) +#define vsub_vx_u8m1_m(...) __riscv_vsub_vx_u8m1_tumu(__VA_ARGS__) +#define vsub_vv_u8m2_m(...) __riscv_vsub_vv_u8m2_tumu(__VA_ARGS__) +#define vsub_vx_u8m2_m(...) __riscv_vsub_vx_u8m2_tumu(__VA_ARGS__) +#define vsub_vv_u8m4_m(...) __riscv_vsub_vv_u8m4_tumu(__VA_ARGS__) +#define vsub_vx_u8m4_m(...) __riscv_vsub_vx_u8m4_tumu(__VA_ARGS__) +#define vsub_vv_u8m8_m(...) __riscv_vsub_vv_u8m8_tumu(__VA_ARGS__) +#define vsub_vx_u8m8_m(...) __riscv_vsub_vx_u8m8_tumu(__VA_ARGS__) +#define vsub_vv_u16mf4_m(...) __riscv_vsub_vv_u16mf4_tumu(__VA_ARGS__) +#define vsub_vx_u16mf4_m(...) __riscv_vsub_vx_u16mf4_tumu(__VA_ARGS__) +#define vsub_vv_u16mf2_m(...) __riscv_vsub_vv_u16mf2_tumu(__VA_ARGS__) +#define vsub_vx_u16mf2_m(...) __riscv_vsub_vx_u16mf2_tumu(__VA_ARGS__) +#define vsub_vv_u16m1_m(...) __riscv_vsub_vv_u16m1_tumu(__VA_ARGS__) +#define vsub_vx_u16m1_m(...) __riscv_vsub_vx_u16m1_tumu(__VA_ARGS__) +#define vsub_vv_u16m2_m(...) __riscv_vsub_vv_u16m2_tumu(__VA_ARGS__) +#define vsub_vx_u16m2_m(...) __riscv_vsub_vx_u16m2_tumu(__VA_ARGS__) +#define vsub_vv_u16m4_m(...) __riscv_vsub_vv_u16m4_tumu(__VA_ARGS__) +#define vsub_vx_u16m4_m(...) __riscv_vsub_vx_u16m4_tumu(__VA_ARGS__) +#define vsub_vv_u16m8_m(...) __riscv_vsub_vv_u16m8_tumu(__VA_ARGS__) +#define vsub_vx_u16m8_m(...) __riscv_vsub_vx_u16m8_tumu(__VA_ARGS__) +#define vsub_vv_u32mf2_m(...) __riscv_vsub_vv_u32mf2_tumu(__VA_ARGS__) +#define vsub_vx_u32mf2_m(...) __riscv_vsub_vx_u32mf2_tumu(__VA_ARGS__) +#define vsub_vv_u32m1_m(...) __riscv_vsub_vv_u32m1_tumu(__VA_ARGS__) +#define vsub_vx_u32m1_m(...) __riscv_vsub_vx_u32m1_tumu(__VA_ARGS__) +#define vsub_vv_u32m2_m(...) __riscv_vsub_vv_u32m2_tumu(__VA_ARGS__) +#define vsub_vx_u32m2_m(...) __riscv_vsub_vx_u32m2_tumu(__VA_ARGS__) +#define vsub_vv_u32m4_m(...) __riscv_vsub_vv_u32m4_tumu(__VA_ARGS__) +#define vsub_vx_u32m4_m(...) __riscv_vsub_vx_u32m4_tumu(__VA_ARGS__) +#define vsub_vv_u32m8_m(...) __riscv_vsub_vv_u32m8_tumu(__VA_ARGS__) +#define vsub_vx_u32m8_m(...) __riscv_vsub_vx_u32m8_tumu(__VA_ARGS__) +#define vsub_vv_u64m1_m(...) __riscv_vsub_vv_u64m1_tumu(__VA_ARGS__) +#define vsub_vx_u64m1_m(...) __riscv_vsub_vx_u64m1_tumu(__VA_ARGS__) +#define vsub_vv_u64m2_m(...) __riscv_vsub_vv_u64m2_tumu(__VA_ARGS__) +#define vsub_vx_u64m2_m(...) __riscv_vsub_vx_u64m2_tumu(__VA_ARGS__) +#define vsub_vv_u64m4_m(...) __riscv_vsub_vv_u64m4_tumu(__VA_ARGS__) +#define vsub_vx_u64m4_m(...) __riscv_vsub_vx_u64m4_tumu(__VA_ARGS__) +#define vsub_vv_u64m8_m(...) __riscv_vsub_vv_u64m8_tumu(__VA_ARGS__) +#define vsub_vx_u64m8_m(...) __riscv_vsub_vx_u64m8_tumu(__VA_ARGS__) +#define vrsub_vx_u8mf8_m(...) __riscv_vrsub_vx_u8mf8_tumu(__VA_ARGS__) +#define vrsub_vx_u8mf4_m(...) __riscv_vrsub_vx_u8mf4_tumu(__VA_ARGS__) +#define vrsub_vx_u8mf2_m(...) __riscv_vrsub_vx_u8mf2_tumu(__VA_ARGS__) +#define vrsub_vx_u8m1_m(...) __riscv_vrsub_vx_u8m1_tumu(__VA_ARGS__) +#define vrsub_vx_u8m2_m(...) __riscv_vrsub_vx_u8m2_tumu(__VA_ARGS__) +#define vrsub_vx_u8m4_m(...) __riscv_vrsub_vx_u8m4_tumu(__VA_ARGS__) +#define vrsub_vx_u8m8_m(...) __riscv_vrsub_vx_u8m8_tumu(__VA_ARGS__) +#define vrsub_vx_u16mf4_m(...) __riscv_vrsub_vx_u16mf4_tumu(__VA_ARGS__) +#define vrsub_vx_u16mf2_m(...) __riscv_vrsub_vx_u16mf2_tumu(__VA_ARGS__) +#define vrsub_vx_u16m1_m(...) __riscv_vrsub_vx_u16m1_tumu(__VA_ARGS__) +#define vrsub_vx_u16m2_m(...) __riscv_vrsub_vx_u16m2_tumu(__VA_ARGS__) +#define vrsub_vx_u16m4_m(...) __riscv_vrsub_vx_u16m4_tumu(__VA_ARGS__) +#define vrsub_vx_u16m8_m(...) __riscv_vrsub_vx_u16m8_tumu(__VA_ARGS__) +#define vrsub_vx_u32mf2_m(...) __riscv_vrsub_vx_u32mf2_tumu(__VA_ARGS__) +#define vrsub_vx_u32m1_m(...) __riscv_vrsub_vx_u32m1_tumu(__VA_ARGS__) +#define vrsub_vx_u32m2_m(...) __riscv_vrsub_vx_u32m2_tumu(__VA_ARGS__) +#define vrsub_vx_u32m4_m(...) __riscv_vrsub_vx_u32m4_tumu(__VA_ARGS__) +#define vrsub_vx_u32m8_m(...) __riscv_vrsub_vx_u32m8_tumu(__VA_ARGS__) +#define vrsub_vx_u64m1_m(...) __riscv_vrsub_vx_u64m1_tumu(__VA_ARGS__) +#define vrsub_vx_u64m2_m(...) __riscv_vrsub_vx_u64m2_tumu(__VA_ARGS__) +#define vrsub_vx_u64m4_m(...) __riscv_vrsub_vx_u64m4_tumu(__VA_ARGS__) +#define vrsub_vx_u64m8_m(...) __riscv_vrsub_vx_u64m8_tumu(__VA_ARGS__) +#define vwadd_vv_i16mf4(...) __riscv_vwadd_vv_i16mf4(__VA_ARGS__) +#define vwadd_vx_i16mf4(...) __riscv_vwadd_vx_i16mf4(__VA_ARGS__) +#define vwadd_wv_i16mf4(...) __riscv_vwadd_wv_i16mf4(__VA_ARGS__) +#define vwadd_wx_i16mf4(...) __riscv_vwadd_wx_i16mf4(__VA_ARGS__) +#define vwadd_vv_i16mf2(...) __riscv_vwadd_vv_i16mf2(__VA_ARGS__) +#define vwadd_vx_i16mf2(...) __riscv_vwadd_vx_i16mf2(__VA_ARGS__) +#define vwadd_wv_i16mf2(...) __riscv_vwadd_wv_i16mf2(__VA_ARGS__) +#define vwadd_wx_i16mf2(...) __riscv_vwadd_wx_i16mf2(__VA_ARGS__) +#define vwadd_vv_i16m1(...) __riscv_vwadd_vv_i16m1(__VA_ARGS__) +#define vwadd_vx_i16m1(...) __riscv_vwadd_vx_i16m1(__VA_ARGS__) +#define vwadd_wv_i16m1(...) __riscv_vwadd_wv_i16m1(__VA_ARGS__) +#define vwadd_wx_i16m1(...) __riscv_vwadd_wx_i16m1(__VA_ARGS__) +#define vwadd_vv_i16m2(...) __riscv_vwadd_vv_i16m2(__VA_ARGS__) +#define vwadd_vx_i16m2(...) __riscv_vwadd_vx_i16m2(__VA_ARGS__) +#define vwadd_wv_i16m2(...) __riscv_vwadd_wv_i16m2(__VA_ARGS__) +#define vwadd_wx_i16m2(...) __riscv_vwadd_wx_i16m2(__VA_ARGS__) +#define vwadd_vv_i16m4(...) __riscv_vwadd_vv_i16m4(__VA_ARGS__) +#define vwadd_vx_i16m4(...) __riscv_vwadd_vx_i16m4(__VA_ARGS__) +#define vwadd_wv_i16m4(...) __riscv_vwadd_wv_i16m4(__VA_ARGS__) +#define vwadd_wx_i16m4(...) __riscv_vwadd_wx_i16m4(__VA_ARGS__) +#define vwadd_vv_i16m8(...) __riscv_vwadd_vv_i16m8(__VA_ARGS__) +#define vwadd_vx_i16m8(...) __riscv_vwadd_vx_i16m8(__VA_ARGS__) +#define vwadd_wv_i16m8(...) __riscv_vwadd_wv_i16m8(__VA_ARGS__) +#define vwadd_wx_i16m8(...) __riscv_vwadd_wx_i16m8(__VA_ARGS__) +#define vwadd_vv_i32mf2(...) __riscv_vwadd_vv_i32mf2(__VA_ARGS__) +#define vwadd_vx_i32mf2(...) __riscv_vwadd_vx_i32mf2(__VA_ARGS__) +#define vwadd_wv_i32mf2(...) __riscv_vwadd_wv_i32mf2(__VA_ARGS__) +#define vwadd_wx_i32mf2(...) __riscv_vwadd_wx_i32mf2(__VA_ARGS__) +#define vwadd_vv_i32m1(...) __riscv_vwadd_vv_i32m1(__VA_ARGS__) +#define vwadd_vx_i32m1(...) __riscv_vwadd_vx_i32m1(__VA_ARGS__) +#define vwadd_wv_i32m1(...) __riscv_vwadd_wv_i32m1(__VA_ARGS__) +#define vwadd_wx_i32m1(...) __riscv_vwadd_wx_i32m1(__VA_ARGS__) +#define vwadd_vv_i32m2(...) __riscv_vwadd_vv_i32m2(__VA_ARGS__) +#define vwadd_vx_i32m2(...) __riscv_vwadd_vx_i32m2(__VA_ARGS__) +#define vwadd_wv_i32m2(...) __riscv_vwadd_wv_i32m2(__VA_ARGS__) +#define vwadd_wx_i32m2(...) __riscv_vwadd_wx_i32m2(__VA_ARGS__) +#define vwadd_vv_i32m4(...) __riscv_vwadd_vv_i32m4(__VA_ARGS__) +#define vwadd_vx_i32m4(...) __riscv_vwadd_vx_i32m4(__VA_ARGS__) +#define vwadd_wv_i32m4(...) __riscv_vwadd_wv_i32m4(__VA_ARGS__) +#define vwadd_wx_i32m4(...) __riscv_vwadd_wx_i32m4(__VA_ARGS__) +#define vwadd_vv_i32m8(...) __riscv_vwadd_vv_i32m8(__VA_ARGS__) +#define vwadd_vx_i32m8(...) __riscv_vwadd_vx_i32m8(__VA_ARGS__) +#define vwadd_wv_i32m8(...) __riscv_vwadd_wv_i32m8(__VA_ARGS__) +#define vwadd_wx_i32m8(...) __riscv_vwadd_wx_i32m8(__VA_ARGS__) +#define vwadd_vv_i64m1(...) __riscv_vwadd_vv_i64m1(__VA_ARGS__) +#define vwadd_vx_i64m1(...) __riscv_vwadd_vx_i64m1(__VA_ARGS__) +#define vwadd_wv_i64m1(...) __riscv_vwadd_wv_i64m1(__VA_ARGS__) +#define vwadd_wx_i64m1(...) __riscv_vwadd_wx_i64m1(__VA_ARGS__) +#define vwadd_vv_i64m2(...) __riscv_vwadd_vv_i64m2(__VA_ARGS__) +#define vwadd_vx_i64m2(...) __riscv_vwadd_vx_i64m2(__VA_ARGS__) +#define vwadd_wv_i64m2(...) __riscv_vwadd_wv_i64m2(__VA_ARGS__) +#define vwadd_wx_i64m2(...) __riscv_vwadd_wx_i64m2(__VA_ARGS__) +#define vwadd_vv_i64m4(...) __riscv_vwadd_vv_i64m4(__VA_ARGS__) +#define vwadd_vx_i64m4(...) __riscv_vwadd_vx_i64m4(__VA_ARGS__) +#define vwadd_wv_i64m4(...) __riscv_vwadd_wv_i64m4(__VA_ARGS__) +#define vwadd_wx_i64m4(...) __riscv_vwadd_wx_i64m4(__VA_ARGS__) +#define vwadd_vv_i64m8(...) __riscv_vwadd_vv_i64m8(__VA_ARGS__) +#define vwadd_vx_i64m8(...) __riscv_vwadd_vx_i64m8(__VA_ARGS__) +#define vwadd_wv_i64m8(...) __riscv_vwadd_wv_i64m8(__VA_ARGS__) +#define vwadd_wx_i64m8(...) __riscv_vwadd_wx_i64m8(__VA_ARGS__) +#define vwsub_vv_i16mf4(...) __riscv_vwsub_vv_i16mf4(__VA_ARGS__) +#define vwsub_vx_i16mf4(...) __riscv_vwsub_vx_i16mf4(__VA_ARGS__) +#define vwsub_wv_i16mf4(...) __riscv_vwsub_wv_i16mf4(__VA_ARGS__) +#define vwsub_wx_i16mf4(...) __riscv_vwsub_wx_i16mf4(__VA_ARGS__) +#define vwsub_vv_i16mf2(...) __riscv_vwsub_vv_i16mf2(__VA_ARGS__) +#define vwsub_vx_i16mf2(...) __riscv_vwsub_vx_i16mf2(__VA_ARGS__) +#define vwsub_wv_i16mf2(...) __riscv_vwsub_wv_i16mf2(__VA_ARGS__) +#define vwsub_wx_i16mf2(...) __riscv_vwsub_wx_i16mf2(__VA_ARGS__) +#define vwsub_vv_i16m1(...) __riscv_vwsub_vv_i16m1(__VA_ARGS__) +#define vwsub_vx_i16m1(...) __riscv_vwsub_vx_i16m1(__VA_ARGS__) +#define vwsub_wv_i16m1(...) __riscv_vwsub_wv_i16m1(__VA_ARGS__) +#define vwsub_wx_i16m1(...) __riscv_vwsub_wx_i16m1(__VA_ARGS__) +#define vwsub_vv_i16m2(...) __riscv_vwsub_vv_i16m2(__VA_ARGS__) +#define vwsub_vx_i16m2(...) __riscv_vwsub_vx_i16m2(__VA_ARGS__) +#define vwsub_wv_i16m2(...) __riscv_vwsub_wv_i16m2(__VA_ARGS__) +#define vwsub_wx_i16m2(...) __riscv_vwsub_wx_i16m2(__VA_ARGS__) +#define vwsub_vv_i16m4(...) __riscv_vwsub_vv_i16m4(__VA_ARGS__) +#define vwsub_vx_i16m4(...) __riscv_vwsub_vx_i16m4(__VA_ARGS__) +#define vwsub_wv_i16m4(...) __riscv_vwsub_wv_i16m4(__VA_ARGS__) +#define vwsub_wx_i16m4(...) __riscv_vwsub_wx_i16m4(__VA_ARGS__) +#define vwsub_vv_i16m8(...) __riscv_vwsub_vv_i16m8(__VA_ARGS__) +#define vwsub_vx_i16m8(...) __riscv_vwsub_vx_i16m8(__VA_ARGS__) +#define vwsub_wv_i16m8(...) __riscv_vwsub_wv_i16m8(__VA_ARGS__) +#define vwsub_wx_i16m8(...) __riscv_vwsub_wx_i16m8(__VA_ARGS__) +#define vwsub_vv_i32mf2(...) __riscv_vwsub_vv_i32mf2(__VA_ARGS__) +#define vwsub_vx_i32mf2(...) __riscv_vwsub_vx_i32mf2(__VA_ARGS__) +#define vwsub_wv_i32mf2(...) __riscv_vwsub_wv_i32mf2(__VA_ARGS__) +#define vwsub_wx_i32mf2(...) __riscv_vwsub_wx_i32mf2(__VA_ARGS__) +#define vwsub_vv_i32m1(...) __riscv_vwsub_vv_i32m1(__VA_ARGS__) +#define vwsub_vx_i32m1(...) __riscv_vwsub_vx_i32m1(__VA_ARGS__) +#define vwsub_wv_i32m1(...) __riscv_vwsub_wv_i32m1(__VA_ARGS__) +#define vwsub_wx_i32m1(...) __riscv_vwsub_wx_i32m1(__VA_ARGS__) +#define vwsub_vv_i32m2(...) __riscv_vwsub_vv_i32m2(__VA_ARGS__) +#define vwsub_vx_i32m2(...) __riscv_vwsub_vx_i32m2(__VA_ARGS__) +#define vwsub_wv_i32m2(...) __riscv_vwsub_wv_i32m2(__VA_ARGS__) +#define vwsub_wx_i32m2(...) __riscv_vwsub_wx_i32m2(__VA_ARGS__) +#define vwsub_vv_i32m4(...) __riscv_vwsub_vv_i32m4(__VA_ARGS__) +#define vwsub_vx_i32m4(...) __riscv_vwsub_vx_i32m4(__VA_ARGS__) +#define vwsub_wv_i32m4(...) __riscv_vwsub_wv_i32m4(__VA_ARGS__) +#define vwsub_wx_i32m4(...) __riscv_vwsub_wx_i32m4(__VA_ARGS__) +#define vwsub_vv_i32m8(...) __riscv_vwsub_vv_i32m8(__VA_ARGS__) +#define vwsub_vx_i32m8(...) __riscv_vwsub_vx_i32m8(__VA_ARGS__) +#define vwsub_wv_i32m8(...) __riscv_vwsub_wv_i32m8(__VA_ARGS__) +#define vwsub_wx_i32m8(...) __riscv_vwsub_wx_i32m8(__VA_ARGS__) +#define vwsub_vv_i64m1(...) __riscv_vwsub_vv_i64m1(__VA_ARGS__) +#define vwsub_vx_i64m1(...) __riscv_vwsub_vx_i64m1(__VA_ARGS__) +#define vwsub_wv_i64m1(...) __riscv_vwsub_wv_i64m1(__VA_ARGS__) +#define vwsub_wx_i64m1(...) __riscv_vwsub_wx_i64m1(__VA_ARGS__) +#define vwsub_vv_i64m2(...) __riscv_vwsub_vv_i64m2(__VA_ARGS__) +#define vwsub_vx_i64m2(...) __riscv_vwsub_vx_i64m2(__VA_ARGS__) +#define vwsub_wv_i64m2(...) __riscv_vwsub_wv_i64m2(__VA_ARGS__) +#define vwsub_wx_i64m2(...) __riscv_vwsub_wx_i64m2(__VA_ARGS__) +#define vwsub_vv_i64m4(...) __riscv_vwsub_vv_i64m4(__VA_ARGS__) +#define vwsub_vx_i64m4(...) __riscv_vwsub_vx_i64m4(__VA_ARGS__) +#define vwsub_wv_i64m4(...) __riscv_vwsub_wv_i64m4(__VA_ARGS__) +#define vwsub_wx_i64m4(...) __riscv_vwsub_wx_i64m4(__VA_ARGS__) +#define vwsub_vv_i64m8(...) __riscv_vwsub_vv_i64m8(__VA_ARGS__) +#define vwsub_vx_i64m8(...) __riscv_vwsub_vx_i64m8(__VA_ARGS__) +#define vwsub_wv_i64m8(...) __riscv_vwsub_wv_i64m8(__VA_ARGS__) +#define vwsub_wx_i64m8(...) __riscv_vwsub_wx_i64m8(__VA_ARGS__) +#define vwaddu_vv_u16mf4(...) __riscv_vwaddu_vv_u16mf4(__VA_ARGS__) +#define vwaddu_vx_u16mf4(...) __riscv_vwaddu_vx_u16mf4(__VA_ARGS__) +#define vwaddu_wv_u16mf4(...) __riscv_vwaddu_wv_u16mf4(__VA_ARGS__) +#define vwaddu_wx_u16mf4(...) __riscv_vwaddu_wx_u16mf4(__VA_ARGS__) +#define vwaddu_vv_u16mf2(...) __riscv_vwaddu_vv_u16mf2(__VA_ARGS__) +#define vwaddu_vx_u16mf2(...) __riscv_vwaddu_vx_u16mf2(__VA_ARGS__) +#define vwaddu_wv_u16mf2(...) __riscv_vwaddu_wv_u16mf2(__VA_ARGS__) +#define vwaddu_wx_u16mf2(...) __riscv_vwaddu_wx_u16mf2(__VA_ARGS__) +#define vwaddu_vv_u16m1(...) __riscv_vwaddu_vv_u16m1(__VA_ARGS__) +#define vwaddu_vx_u16m1(...) __riscv_vwaddu_vx_u16m1(__VA_ARGS__) +#define vwaddu_wv_u16m1(...) __riscv_vwaddu_wv_u16m1(__VA_ARGS__) +#define vwaddu_wx_u16m1(...) __riscv_vwaddu_wx_u16m1(__VA_ARGS__) +#define vwaddu_vv_u16m2(...) __riscv_vwaddu_vv_u16m2(__VA_ARGS__) +#define vwaddu_vx_u16m2(...) __riscv_vwaddu_vx_u16m2(__VA_ARGS__) +#define vwaddu_wv_u16m2(...) __riscv_vwaddu_wv_u16m2(__VA_ARGS__) +#define vwaddu_wx_u16m2(...) __riscv_vwaddu_wx_u16m2(__VA_ARGS__) +#define vwaddu_vv_u16m4(...) __riscv_vwaddu_vv_u16m4(__VA_ARGS__) +#define vwaddu_vx_u16m4(...) __riscv_vwaddu_vx_u16m4(__VA_ARGS__) +#define vwaddu_wv_u16m4(...) __riscv_vwaddu_wv_u16m4(__VA_ARGS__) +#define vwaddu_wx_u16m4(...) __riscv_vwaddu_wx_u16m4(__VA_ARGS__) +#define vwaddu_vv_u16m8(...) __riscv_vwaddu_vv_u16m8(__VA_ARGS__) +#define vwaddu_vx_u16m8(...) __riscv_vwaddu_vx_u16m8(__VA_ARGS__) +#define vwaddu_wv_u16m8(...) __riscv_vwaddu_wv_u16m8(__VA_ARGS__) +#define vwaddu_wx_u16m8(...) __riscv_vwaddu_wx_u16m8(__VA_ARGS__) +#define vwaddu_vv_u32mf2(...) __riscv_vwaddu_vv_u32mf2(__VA_ARGS__) +#define vwaddu_vx_u32mf2(...) __riscv_vwaddu_vx_u32mf2(__VA_ARGS__) +#define vwaddu_wv_u32mf2(...) __riscv_vwaddu_wv_u32mf2(__VA_ARGS__) +#define vwaddu_wx_u32mf2(...) __riscv_vwaddu_wx_u32mf2(__VA_ARGS__) +#define vwaddu_vv_u32m1(...) __riscv_vwaddu_vv_u32m1(__VA_ARGS__) +#define vwaddu_vx_u32m1(...) __riscv_vwaddu_vx_u32m1(__VA_ARGS__) +#define vwaddu_wv_u32m1(...) __riscv_vwaddu_wv_u32m1(__VA_ARGS__) +#define vwaddu_wx_u32m1(...) __riscv_vwaddu_wx_u32m1(__VA_ARGS__) +#define vwaddu_vv_u32m2(...) __riscv_vwaddu_vv_u32m2(__VA_ARGS__) +#define vwaddu_vx_u32m2(...) __riscv_vwaddu_vx_u32m2(__VA_ARGS__) +#define vwaddu_wv_u32m2(...) __riscv_vwaddu_wv_u32m2(__VA_ARGS__) +#define vwaddu_wx_u32m2(...) __riscv_vwaddu_wx_u32m2(__VA_ARGS__) +#define vwaddu_vv_u32m4(...) __riscv_vwaddu_vv_u32m4(__VA_ARGS__) +#define vwaddu_vx_u32m4(...) __riscv_vwaddu_vx_u32m4(__VA_ARGS__) +#define vwaddu_wv_u32m4(...) __riscv_vwaddu_wv_u32m4(__VA_ARGS__) +#define vwaddu_wx_u32m4(...) __riscv_vwaddu_wx_u32m4(__VA_ARGS__) +#define vwaddu_vv_u32m8(...) __riscv_vwaddu_vv_u32m8(__VA_ARGS__) +#define vwaddu_vx_u32m8(...) __riscv_vwaddu_vx_u32m8(__VA_ARGS__) +#define vwaddu_wv_u32m8(...) __riscv_vwaddu_wv_u32m8(__VA_ARGS__) +#define vwaddu_wx_u32m8(...) __riscv_vwaddu_wx_u32m8(__VA_ARGS__) +#define vwaddu_vv_u64m1(...) __riscv_vwaddu_vv_u64m1(__VA_ARGS__) +#define vwaddu_vx_u64m1(...) __riscv_vwaddu_vx_u64m1(__VA_ARGS__) +#define vwaddu_wv_u64m1(...) __riscv_vwaddu_wv_u64m1(__VA_ARGS__) +#define vwaddu_wx_u64m1(...) __riscv_vwaddu_wx_u64m1(__VA_ARGS__) +#define vwaddu_vv_u64m2(...) __riscv_vwaddu_vv_u64m2(__VA_ARGS__) +#define vwaddu_vx_u64m2(...) __riscv_vwaddu_vx_u64m2(__VA_ARGS__) +#define vwaddu_wv_u64m2(...) __riscv_vwaddu_wv_u64m2(__VA_ARGS__) +#define vwaddu_wx_u64m2(...) __riscv_vwaddu_wx_u64m2(__VA_ARGS__) +#define vwaddu_vv_u64m4(...) __riscv_vwaddu_vv_u64m4(__VA_ARGS__) +#define vwaddu_vx_u64m4(...) __riscv_vwaddu_vx_u64m4(__VA_ARGS__) +#define vwaddu_wv_u64m4(...) __riscv_vwaddu_wv_u64m4(__VA_ARGS__) +#define vwaddu_wx_u64m4(...) __riscv_vwaddu_wx_u64m4(__VA_ARGS__) +#define vwaddu_vv_u64m8(...) __riscv_vwaddu_vv_u64m8(__VA_ARGS__) +#define vwaddu_vx_u64m8(...) __riscv_vwaddu_vx_u64m8(__VA_ARGS__) +#define vwaddu_wv_u64m8(...) __riscv_vwaddu_wv_u64m8(__VA_ARGS__) +#define vwaddu_wx_u64m8(...) __riscv_vwaddu_wx_u64m8(__VA_ARGS__) +#define vwsubu_vv_u16mf4(...) __riscv_vwsubu_vv_u16mf4(__VA_ARGS__) +#define vwsubu_vx_u16mf4(...) __riscv_vwsubu_vx_u16mf4(__VA_ARGS__) +#define vwsubu_wv_u16mf4(...) __riscv_vwsubu_wv_u16mf4(__VA_ARGS__) +#define vwsubu_wx_u16mf4(...) __riscv_vwsubu_wx_u16mf4(__VA_ARGS__) +#define vwsubu_vv_u16mf2(...) __riscv_vwsubu_vv_u16mf2(__VA_ARGS__) +#define vwsubu_vx_u16mf2(...) __riscv_vwsubu_vx_u16mf2(__VA_ARGS__) +#define vwsubu_wv_u16mf2(...) __riscv_vwsubu_wv_u16mf2(__VA_ARGS__) +#define vwsubu_wx_u16mf2(...) __riscv_vwsubu_wx_u16mf2(__VA_ARGS__) +#define vwsubu_vv_u16m1(...) __riscv_vwsubu_vv_u16m1(__VA_ARGS__) +#define vwsubu_vx_u16m1(...) __riscv_vwsubu_vx_u16m1(__VA_ARGS__) +#define vwsubu_wv_u16m1(...) __riscv_vwsubu_wv_u16m1(__VA_ARGS__) +#define vwsubu_wx_u16m1(...) __riscv_vwsubu_wx_u16m1(__VA_ARGS__) +#define vwsubu_vv_u16m2(...) __riscv_vwsubu_vv_u16m2(__VA_ARGS__) +#define vwsubu_vx_u16m2(...) __riscv_vwsubu_vx_u16m2(__VA_ARGS__) +#define vwsubu_wv_u16m2(...) __riscv_vwsubu_wv_u16m2(__VA_ARGS__) +#define vwsubu_wx_u16m2(...) __riscv_vwsubu_wx_u16m2(__VA_ARGS__) +#define vwsubu_vv_u16m4(...) __riscv_vwsubu_vv_u16m4(__VA_ARGS__) +#define vwsubu_vx_u16m4(...) __riscv_vwsubu_vx_u16m4(__VA_ARGS__) +#define vwsubu_wv_u16m4(...) __riscv_vwsubu_wv_u16m4(__VA_ARGS__) +#define vwsubu_wx_u16m4(...) __riscv_vwsubu_wx_u16m4(__VA_ARGS__) +#define vwsubu_vv_u16m8(...) __riscv_vwsubu_vv_u16m8(__VA_ARGS__) +#define vwsubu_vx_u16m8(...) __riscv_vwsubu_vx_u16m8(__VA_ARGS__) +#define vwsubu_wv_u16m8(...) __riscv_vwsubu_wv_u16m8(__VA_ARGS__) +#define vwsubu_wx_u16m8(...) __riscv_vwsubu_wx_u16m8(__VA_ARGS__) +#define vwsubu_vv_u32mf2(...) __riscv_vwsubu_vv_u32mf2(__VA_ARGS__) +#define vwsubu_vx_u32mf2(...) __riscv_vwsubu_vx_u32mf2(__VA_ARGS__) +#define vwsubu_wv_u32mf2(...) __riscv_vwsubu_wv_u32mf2(__VA_ARGS__) +#define vwsubu_wx_u32mf2(...) __riscv_vwsubu_wx_u32mf2(__VA_ARGS__) +#define vwsubu_vv_u32m1(...) __riscv_vwsubu_vv_u32m1(__VA_ARGS__) +#define vwsubu_vx_u32m1(...) __riscv_vwsubu_vx_u32m1(__VA_ARGS__) +#define vwsubu_wv_u32m1(...) __riscv_vwsubu_wv_u32m1(__VA_ARGS__) +#define vwsubu_wx_u32m1(...) __riscv_vwsubu_wx_u32m1(__VA_ARGS__) +#define vwsubu_vv_u32m2(...) __riscv_vwsubu_vv_u32m2(__VA_ARGS__) +#define vwsubu_vx_u32m2(...) __riscv_vwsubu_vx_u32m2(__VA_ARGS__) +#define vwsubu_wv_u32m2(...) __riscv_vwsubu_wv_u32m2(__VA_ARGS__) +#define vwsubu_wx_u32m2(...) __riscv_vwsubu_wx_u32m2(__VA_ARGS__) +#define vwsubu_vv_u32m4(...) __riscv_vwsubu_vv_u32m4(__VA_ARGS__) +#define vwsubu_vx_u32m4(...) __riscv_vwsubu_vx_u32m4(__VA_ARGS__) +#define vwsubu_wv_u32m4(...) __riscv_vwsubu_wv_u32m4(__VA_ARGS__) +#define vwsubu_wx_u32m4(...) __riscv_vwsubu_wx_u32m4(__VA_ARGS__) +#define vwsubu_vv_u32m8(...) __riscv_vwsubu_vv_u32m8(__VA_ARGS__) +#define vwsubu_vx_u32m8(...) __riscv_vwsubu_vx_u32m8(__VA_ARGS__) +#define vwsubu_wv_u32m8(...) __riscv_vwsubu_wv_u32m8(__VA_ARGS__) +#define vwsubu_wx_u32m8(...) __riscv_vwsubu_wx_u32m8(__VA_ARGS__) +#define vwsubu_vv_u64m1(...) __riscv_vwsubu_vv_u64m1(__VA_ARGS__) +#define vwsubu_vx_u64m1(...) __riscv_vwsubu_vx_u64m1(__VA_ARGS__) +#define vwsubu_wv_u64m1(...) __riscv_vwsubu_wv_u64m1(__VA_ARGS__) +#define vwsubu_wx_u64m1(...) __riscv_vwsubu_wx_u64m1(__VA_ARGS__) +#define vwsubu_vv_u64m2(...) __riscv_vwsubu_vv_u64m2(__VA_ARGS__) +#define vwsubu_vx_u64m2(...) __riscv_vwsubu_vx_u64m2(__VA_ARGS__) +#define vwsubu_wv_u64m2(...) __riscv_vwsubu_wv_u64m2(__VA_ARGS__) +#define vwsubu_wx_u64m2(...) __riscv_vwsubu_wx_u64m2(__VA_ARGS__) +#define vwsubu_vv_u64m4(...) __riscv_vwsubu_vv_u64m4(__VA_ARGS__) +#define vwsubu_vx_u64m4(...) __riscv_vwsubu_vx_u64m4(__VA_ARGS__) +#define vwsubu_wv_u64m4(...) __riscv_vwsubu_wv_u64m4(__VA_ARGS__) +#define vwsubu_wx_u64m4(...) __riscv_vwsubu_wx_u64m4(__VA_ARGS__) +#define vwsubu_vv_u64m8(...) __riscv_vwsubu_vv_u64m8(__VA_ARGS__) +#define vwsubu_vx_u64m8(...) __riscv_vwsubu_vx_u64m8(__VA_ARGS__) +#define vwsubu_wv_u64m8(...) __riscv_vwsubu_wv_u64m8(__VA_ARGS__) +#define vwsubu_wx_u64m8(...) __riscv_vwsubu_wx_u64m8(__VA_ARGS__) +// masked functions +#define vwadd_vv_i16mf4_m(...) __riscv_vwadd_vv_i16mf4_tumu(__VA_ARGS__) +#define vwadd_vx_i16mf4_m(...) __riscv_vwadd_vx_i16mf4_tumu(__VA_ARGS__) +#define vwadd_wv_i16mf4_m(...) __riscv_vwadd_wv_i16mf4_tumu(__VA_ARGS__) +#define vwadd_wx_i16mf4_m(...) __riscv_vwadd_wx_i16mf4_tumu(__VA_ARGS__) +#define vwadd_vv_i16mf2_m(...) __riscv_vwadd_vv_i16mf2_tumu(__VA_ARGS__) +#define vwadd_vx_i16mf2_m(...) __riscv_vwadd_vx_i16mf2_tumu(__VA_ARGS__) +#define vwadd_wv_i16mf2_m(...) __riscv_vwadd_wv_i16mf2_tumu(__VA_ARGS__) +#define vwadd_wx_i16mf2_m(...) __riscv_vwadd_wx_i16mf2_tumu(__VA_ARGS__) +#define vwadd_vv_i16m1_m(...) __riscv_vwadd_vv_i16m1_tumu(__VA_ARGS__) +#define vwadd_vx_i16m1_m(...) __riscv_vwadd_vx_i16m1_tumu(__VA_ARGS__) +#define vwadd_wv_i16m1_m(...) __riscv_vwadd_wv_i16m1_tumu(__VA_ARGS__) +#define vwadd_wx_i16m1_m(...) __riscv_vwadd_wx_i16m1_tumu(__VA_ARGS__) +#define vwadd_vv_i16m2_m(...) __riscv_vwadd_vv_i16m2_tumu(__VA_ARGS__) +#define vwadd_vx_i16m2_m(...) __riscv_vwadd_vx_i16m2_tumu(__VA_ARGS__) +#define vwadd_wv_i16m2_m(...) __riscv_vwadd_wv_i16m2_tumu(__VA_ARGS__) +#define vwadd_wx_i16m2_m(...) __riscv_vwadd_wx_i16m2_tumu(__VA_ARGS__) +#define vwadd_vv_i16m4_m(...) __riscv_vwadd_vv_i16m4_tumu(__VA_ARGS__) +#define vwadd_vx_i16m4_m(...) __riscv_vwadd_vx_i16m4_tumu(__VA_ARGS__) +#define vwadd_wv_i16m4_m(...) __riscv_vwadd_wv_i16m4_tumu(__VA_ARGS__) +#define vwadd_wx_i16m4_m(...) __riscv_vwadd_wx_i16m4_tumu(__VA_ARGS__) +#define vwadd_vv_i16m8_m(...) __riscv_vwadd_vv_i16m8_tumu(__VA_ARGS__) +#define vwadd_vx_i16m8_m(...) __riscv_vwadd_vx_i16m8_tumu(__VA_ARGS__) +#define vwadd_wv_i16m8_m(...) __riscv_vwadd_wv_i16m8_tumu(__VA_ARGS__) +#define vwadd_wx_i16m8_m(...) __riscv_vwadd_wx_i16m8_tumu(__VA_ARGS__) +#define vwadd_vv_i32mf2_m(...) __riscv_vwadd_vv_i32mf2_tumu(__VA_ARGS__) +#define vwadd_vx_i32mf2_m(...) __riscv_vwadd_vx_i32mf2_tumu(__VA_ARGS__) +#define vwadd_wv_i32mf2_m(...) __riscv_vwadd_wv_i32mf2_tumu(__VA_ARGS__) +#define vwadd_wx_i32mf2_m(...) __riscv_vwadd_wx_i32mf2_tumu(__VA_ARGS__) +#define vwadd_vv_i32m1_m(...) __riscv_vwadd_vv_i32m1_tumu(__VA_ARGS__) +#define vwadd_vx_i32m1_m(...) __riscv_vwadd_vx_i32m1_tumu(__VA_ARGS__) +#define vwadd_wv_i32m1_m(...) __riscv_vwadd_wv_i32m1_tumu(__VA_ARGS__) +#define vwadd_wx_i32m1_m(...) __riscv_vwadd_wx_i32m1_tumu(__VA_ARGS__) +#define vwadd_vv_i32m2_m(...) __riscv_vwadd_vv_i32m2_tumu(__VA_ARGS__) +#define vwadd_vx_i32m2_m(...) __riscv_vwadd_vx_i32m2_tumu(__VA_ARGS__) +#define vwadd_wv_i32m2_m(...) __riscv_vwadd_wv_i32m2_tumu(__VA_ARGS__) +#define vwadd_wx_i32m2_m(...) __riscv_vwadd_wx_i32m2_tumu(__VA_ARGS__) +#define vwadd_vv_i32m4_m(...) __riscv_vwadd_vv_i32m4_tumu(__VA_ARGS__) +#define vwadd_vx_i32m4_m(...) __riscv_vwadd_vx_i32m4_tumu(__VA_ARGS__) +#define vwadd_wv_i32m4_m(...) __riscv_vwadd_wv_i32m4_tumu(__VA_ARGS__) +#define vwadd_wx_i32m4_m(...) __riscv_vwadd_wx_i32m4_tumu(__VA_ARGS__) +#define vwadd_vv_i32m8_m(...) __riscv_vwadd_vv_i32m8_tumu(__VA_ARGS__) +#define vwadd_vx_i32m8_m(...) __riscv_vwadd_vx_i32m8_tumu(__VA_ARGS__) +#define vwadd_wv_i32m8_m(...) __riscv_vwadd_wv_i32m8_tumu(__VA_ARGS__) +#define vwadd_wx_i32m8_m(...) __riscv_vwadd_wx_i32m8_tumu(__VA_ARGS__) +#define vwadd_vv_i64m1_m(...) __riscv_vwadd_vv_i64m1_tumu(__VA_ARGS__) +#define vwadd_vx_i64m1_m(...) __riscv_vwadd_vx_i64m1_tumu(__VA_ARGS__) +#define vwadd_wv_i64m1_m(...) __riscv_vwadd_wv_i64m1_tumu(__VA_ARGS__) +#define vwadd_wx_i64m1_m(...) __riscv_vwadd_wx_i64m1_tumu(__VA_ARGS__) +#define vwadd_vv_i64m2_m(...) __riscv_vwadd_vv_i64m2_tumu(__VA_ARGS__) +#define vwadd_vx_i64m2_m(...) __riscv_vwadd_vx_i64m2_tumu(__VA_ARGS__) +#define vwadd_wv_i64m2_m(...) __riscv_vwadd_wv_i64m2_tumu(__VA_ARGS__) +#define vwadd_wx_i64m2_m(...) __riscv_vwadd_wx_i64m2_tumu(__VA_ARGS__) +#define vwadd_vv_i64m4_m(...) __riscv_vwadd_vv_i64m4_tumu(__VA_ARGS__) +#define vwadd_vx_i64m4_m(...) __riscv_vwadd_vx_i64m4_tumu(__VA_ARGS__) +#define vwadd_wv_i64m4_m(...) __riscv_vwadd_wv_i64m4_tumu(__VA_ARGS__) +#define vwadd_wx_i64m4_m(...) __riscv_vwadd_wx_i64m4_tumu(__VA_ARGS__) +#define vwadd_vv_i64m8_m(...) __riscv_vwadd_vv_i64m8_tumu(__VA_ARGS__) +#define vwadd_vx_i64m8_m(...) __riscv_vwadd_vx_i64m8_tumu(__VA_ARGS__) +#define vwadd_wv_i64m8_m(...) __riscv_vwadd_wv_i64m8_tumu(__VA_ARGS__) +#define vwadd_wx_i64m8_m(...) __riscv_vwadd_wx_i64m8_tumu(__VA_ARGS__) +#define vwsub_vv_i16mf4_m(...) __riscv_vwsub_vv_i16mf4_tumu(__VA_ARGS__) +#define vwsub_vx_i16mf4_m(...) __riscv_vwsub_vx_i16mf4_tumu(__VA_ARGS__) +#define vwsub_wv_i16mf4_m(...) __riscv_vwsub_wv_i16mf4_tumu(__VA_ARGS__) +#define vwsub_wx_i16mf4_m(...) __riscv_vwsub_wx_i16mf4_tumu(__VA_ARGS__) +#define vwsub_vv_i16mf2_m(...) __riscv_vwsub_vv_i16mf2_tumu(__VA_ARGS__) +#define vwsub_vx_i16mf2_m(...) __riscv_vwsub_vx_i16mf2_tumu(__VA_ARGS__) +#define vwsub_wv_i16mf2_m(...) __riscv_vwsub_wv_i16mf2_tumu(__VA_ARGS__) +#define vwsub_wx_i16mf2_m(...) __riscv_vwsub_wx_i16mf2_tumu(__VA_ARGS__) +#define vwsub_vv_i16m1_m(...) __riscv_vwsub_vv_i16m1_tumu(__VA_ARGS__) +#define vwsub_vx_i16m1_m(...) __riscv_vwsub_vx_i16m1_tumu(__VA_ARGS__) +#define vwsub_wv_i16m1_m(...) __riscv_vwsub_wv_i16m1_tumu(__VA_ARGS__) +#define vwsub_wx_i16m1_m(...) __riscv_vwsub_wx_i16m1_tumu(__VA_ARGS__) +#define vwsub_vv_i16m2_m(...) __riscv_vwsub_vv_i16m2_tumu(__VA_ARGS__) +#define vwsub_vx_i16m2_m(...) __riscv_vwsub_vx_i16m2_tumu(__VA_ARGS__) +#define vwsub_wv_i16m2_m(...) __riscv_vwsub_wv_i16m2_tumu(__VA_ARGS__) +#define vwsub_wx_i16m2_m(...) __riscv_vwsub_wx_i16m2_tumu(__VA_ARGS__) +#define vwsub_vv_i16m4_m(...) __riscv_vwsub_vv_i16m4_tumu(__VA_ARGS__) +#define vwsub_vx_i16m4_m(...) __riscv_vwsub_vx_i16m4_tumu(__VA_ARGS__) +#define vwsub_wv_i16m4_m(...) __riscv_vwsub_wv_i16m4_tumu(__VA_ARGS__) +#define vwsub_wx_i16m4_m(...) __riscv_vwsub_wx_i16m4_tumu(__VA_ARGS__) +#define vwsub_vv_i16m8_m(...) __riscv_vwsub_vv_i16m8_tumu(__VA_ARGS__) +#define vwsub_vx_i16m8_m(...) __riscv_vwsub_vx_i16m8_tumu(__VA_ARGS__) +#define vwsub_wv_i16m8_m(...) __riscv_vwsub_wv_i16m8_tumu(__VA_ARGS__) +#define vwsub_wx_i16m8_m(...) __riscv_vwsub_wx_i16m8_tumu(__VA_ARGS__) +#define vwsub_vv_i32mf2_m(...) __riscv_vwsub_vv_i32mf2_tumu(__VA_ARGS__) +#define vwsub_vx_i32mf2_m(...) __riscv_vwsub_vx_i32mf2_tumu(__VA_ARGS__) +#define vwsub_wv_i32mf2_m(...) __riscv_vwsub_wv_i32mf2_tumu(__VA_ARGS__) +#define vwsub_wx_i32mf2_m(...) __riscv_vwsub_wx_i32mf2_tumu(__VA_ARGS__) +#define vwsub_vv_i32m1_m(...) __riscv_vwsub_vv_i32m1_tumu(__VA_ARGS__) +#define vwsub_vx_i32m1_m(...) __riscv_vwsub_vx_i32m1_tumu(__VA_ARGS__) +#define vwsub_wv_i32m1_m(...) __riscv_vwsub_wv_i32m1_tumu(__VA_ARGS__) +#define vwsub_wx_i32m1_m(...) __riscv_vwsub_wx_i32m1_tumu(__VA_ARGS__) +#define vwsub_vv_i32m2_m(...) __riscv_vwsub_vv_i32m2_tumu(__VA_ARGS__) +#define vwsub_vx_i32m2_m(...) __riscv_vwsub_vx_i32m2_tumu(__VA_ARGS__) +#define vwsub_wv_i32m2_m(...) __riscv_vwsub_wv_i32m2_tumu(__VA_ARGS__) +#define vwsub_wx_i32m2_m(...) __riscv_vwsub_wx_i32m2_tumu(__VA_ARGS__) +#define vwsub_vv_i32m4_m(...) __riscv_vwsub_vv_i32m4_tumu(__VA_ARGS__) +#define vwsub_vx_i32m4_m(...) __riscv_vwsub_vx_i32m4_tumu(__VA_ARGS__) +#define vwsub_wv_i32m4_m(...) __riscv_vwsub_wv_i32m4_tumu(__VA_ARGS__) +#define vwsub_wx_i32m4_m(...) __riscv_vwsub_wx_i32m4_tumu(__VA_ARGS__) +#define vwsub_vv_i32m8_m(...) __riscv_vwsub_vv_i32m8_tumu(__VA_ARGS__) +#define vwsub_vx_i32m8_m(...) __riscv_vwsub_vx_i32m8_tumu(__VA_ARGS__) +#define vwsub_wv_i32m8_m(...) __riscv_vwsub_wv_i32m8_tumu(__VA_ARGS__) +#define vwsub_wx_i32m8_m(...) __riscv_vwsub_wx_i32m8_tumu(__VA_ARGS__) +#define vwsub_vv_i64m1_m(...) __riscv_vwsub_vv_i64m1_tumu(__VA_ARGS__) +#define vwsub_vx_i64m1_m(...) __riscv_vwsub_vx_i64m1_tumu(__VA_ARGS__) +#define vwsub_wv_i64m1_m(...) __riscv_vwsub_wv_i64m1_tumu(__VA_ARGS__) +#define vwsub_wx_i64m1_m(...) __riscv_vwsub_wx_i64m1_tumu(__VA_ARGS__) +#define vwsub_vv_i64m2_m(...) __riscv_vwsub_vv_i64m2_tumu(__VA_ARGS__) +#define vwsub_vx_i64m2_m(...) __riscv_vwsub_vx_i64m2_tumu(__VA_ARGS__) +#define vwsub_wv_i64m2_m(...) __riscv_vwsub_wv_i64m2_tumu(__VA_ARGS__) +#define vwsub_wx_i64m2_m(...) __riscv_vwsub_wx_i64m2_tumu(__VA_ARGS__) +#define vwsub_vv_i64m4_m(...) __riscv_vwsub_vv_i64m4_tumu(__VA_ARGS__) +#define vwsub_vx_i64m4_m(...) __riscv_vwsub_vx_i64m4_tumu(__VA_ARGS__) +#define vwsub_wv_i64m4_m(...) __riscv_vwsub_wv_i64m4_tumu(__VA_ARGS__) +#define vwsub_wx_i64m4_m(...) __riscv_vwsub_wx_i64m4_tumu(__VA_ARGS__) +#define vwsub_vv_i64m8_m(...) __riscv_vwsub_vv_i64m8_tumu(__VA_ARGS__) +#define vwsub_vx_i64m8_m(...) __riscv_vwsub_vx_i64m8_tumu(__VA_ARGS__) +#define vwsub_wv_i64m8_m(...) __riscv_vwsub_wv_i64m8_tumu(__VA_ARGS__) +#define vwsub_wx_i64m8_m(...) __riscv_vwsub_wx_i64m8_tumu(__VA_ARGS__) +#define vwaddu_vv_u16mf4_m(...) __riscv_vwaddu_vv_u16mf4_tumu(__VA_ARGS__) +#define vwaddu_vx_u16mf4_m(...) __riscv_vwaddu_vx_u16mf4_tumu(__VA_ARGS__) +#define vwaddu_wv_u16mf4_m(...) __riscv_vwaddu_wv_u16mf4_tumu(__VA_ARGS__) +#define vwaddu_wx_u16mf4_m(...) __riscv_vwaddu_wx_u16mf4_tumu(__VA_ARGS__) +#define vwaddu_vv_u16mf2_m(...) __riscv_vwaddu_vv_u16mf2_tumu(__VA_ARGS__) +#define vwaddu_vx_u16mf2_m(...) __riscv_vwaddu_vx_u16mf2_tumu(__VA_ARGS__) +#define vwaddu_wv_u16mf2_m(...) __riscv_vwaddu_wv_u16mf2_tumu(__VA_ARGS__) +#define vwaddu_wx_u16mf2_m(...) __riscv_vwaddu_wx_u16mf2_tumu(__VA_ARGS__) +#define vwaddu_vv_u16m1_m(...) __riscv_vwaddu_vv_u16m1_tumu(__VA_ARGS__) +#define vwaddu_vx_u16m1_m(...) __riscv_vwaddu_vx_u16m1_tumu(__VA_ARGS__) +#define vwaddu_wv_u16m1_m(...) __riscv_vwaddu_wv_u16m1_tumu(__VA_ARGS__) +#define vwaddu_wx_u16m1_m(...) __riscv_vwaddu_wx_u16m1_tumu(__VA_ARGS__) +#define vwaddu_vv_u16m2_m(...) __riscv_vwaddu_vv_u16m2_tumu(__VA_ARGS__) +#define vwaddu_vx_u16m2_m(...) __riscv_vwaddu_vx_u16m2_tumu(__VA_ARGS__) +#define vwaddu_wv_u16m2_m(...) __riscv_vwaddu_wv_u16m2_tumu(__VA_ARGS__) +#define vwaddu_wx_u16m2_m(...) __riscv_vwaddu_wx_u16m2_tumu(__VA_ARGS__) +#define vwaddu_vv_u16m4_m(...) __riscv_vwaddu_vv_u16m4_tumu(__VA_ARGS__) +#define vwaddu_vx_u16m4_m(...) __riscv_vwaddu_vx_u16m4_tumu(__VA_ARGS__) +#define vwaddu_wv_u16m4_m(...) __riscv_vwaddu_wv_u16m4_tumu(__VA_ARGS__) +#define vwaddu_wx_u16m4_m(...) __riscv_vwaddu_wx_u16m4_tumu(__VA_ARGS__) +#define vwaddu_vv_u16m8_m(...) __riscv_vwaddu_vv_u16m8_tumu(__VA_ARGS__) +#define vwaddu_vx_u16m8_m(...) __riscv_vwaddu_vx_u16m8_tumu(__VA_ARGS__) +#define vwaddu_wv_u16m8_m(...) __riscv_vwaddu_wv_u16m8_tumu(__VA_ARGS__) +#define vwaddu_wx_u16m8_m(...) __riscv_vwaddu_wx_u16m8_tumu(__VA_ARGS__) +#define vwaddu_vv_u32mf2_m(...) __riscv_vwaddu_vv_u32mf2_tumu(__VA_ARGS__) +#define vwaddu_vx_u32mf2_m(...) __riscv_vwaddu_vx_u32mf2_tumu(__VA_ARGS__) +#define vwaddu_wv_u32mf2_m(...) __riscv_vwaddu_wv_u32mf2_tumu(__VA_ARGS__) +#define vwaddu_wx_u32mf2_m(...) __riscv_vwaddu_wx_u32mf2_tumu(__VA_ARGS__) +#define vwaddu_vv_u32m1_m(...) __riscv_vwaddu_vv_u32m1_tumu(__VA_ARGS__) +#define vwaddu_vx_u32m1_m(...) __riscv_vwaddu_vx_u32m1_tumu(__VA_ARGS__) +#define vwaddu_wv_u32m1_m(...) __riscv_vwaddu_wv_u32m1_tumu(__VA_ARGS__) +#define vwaddu_wx_u32m1_m(...) __riscv_vwaddu_wx_u32m1_tumu(__VA_ARGS__) +#define vwaddu_vv_u32m2_m(...) __riscv_vwaddu_vv_u32m2_tumu(__VA_ARGS__) +#define vwaddu_vx_u32m2_m(...) __riscv_vwaddu_vx_u32m2_tumu(__VA_ARGS__) +#define vwaddu_wv_u32m2_m(...) __riscv_vwaddu_wv_u32m2_tumu(__VA_ARGS__) +#define vwaddu_wx_u32m2_m(...) __riscv_vwaddu_wx_u32m2_tumu(__VA_ARGS__) +#define vwaddu_vv_u32m4_m(...) __riscv_vwaddu_vv_u32m4_tumu(__VA_ARGS__) +#define vwaddu_vx_u32m4_m(...) __riscv_vwaddu_vx_u32m4_tumu(__VA_ARGS__) +#define vwaddu_wv_u32m4_m(...) __riscv_vwaddu_wv_u32m4_tumu(__VA_ARGS__) +#define vwaddu_wx_u32m4_m(...) __riscv_vwaddu_wx_u32m4_tumu(__VA_ARGS__) +#define vwaddu_vv_u32m8_m(...) __riscv_vwaddu_vv_u32m8_tumu(__VA_ARGS__) +#define vwaddu_vx_u32m8_m(...) __riscv_vwaddu_vx_u32m8_tumu(__VA_ARGS__) +#define vwaddu_wv_u32m8_m(...) __riscv_vwaddu_wv_u32m8_tumu(__VA_ARGS__) +#define vwaddu_wx_u32m8_m(...) __riscv_vwaddu_wx_u32m8_tumu(__VA_ARGS__) +#define vwaddu_vv_u64m1_m(...) __riscv_vwaddu_vv_u64m1_tumu(__VA_ARGS__) +#define vwaddu_vx_u64m1_m(...) __riscv_vwaddu_vx_u64m1_tumu(__VA_ARGS__) +#define vwaddu_wv_u64m1_m(...) __riscv_vwaddu_wv_u64m1_tumu(__VA_ARGS__) +#define vwaddu_wx_u64m1_m(...) __riscv_vwaddu_wx_u64m1_tumu(__VA_ARGS__) +#define vwaddu_vv_u64m2_m(...) __riscv_vwaddu_vv_u64m2_tumu(__VA_ARGS__) +#define vwaddu_vx_u64m2_m(...) __riscv_vwaddu_vx_u64m2_tumu(__VA_ARGS__) +#define vwaddu_wv_u64m2_m(...) __riscv_vwaddu_wv_u64m2_tumu(__VA_ARGS__) +#define vwaddu_wx_u64m2_m(...) __riscv_vwaddu_wx_u64m2_tumu(__VA_ARGS__) +#define vwaddu_vv_u64m4_m(...) __riscv_vwaddu_vv_u64m4_tumu(__VA_ARGS__) +#define vwaddu_vx_u64m4_m(...) __riscv_vwaddu_vx_u64m4_tumu(__VA_ARGS__) +#define vwaddu_wv_u64m4_m(...) __riscv_vwaddu_wv_u64m4_tumu(__VA_ARGS__) +#define vwaddu_wx_u64m4_m(...) __riscv_vwaddu_wx_u64m4_tumu(__VA_ARGS__) +#define vwaddu_vv_u64m8_m(...) __riscv_vwaddu_vv_u64m8_tumu(__VA_ARGS__) +#define vwaddu_vx_u64m8_m(...) __riscv_vwaddu_vx_u64m8_tumu(__VA_ARGS__) +#define vwaddu_wv_u64m8_m(...) __riscv_vwaddu_wv_u64m8_tumu(__VA_ARGS__) +#define vwaddu_wx_u64m8_m(...) __riscv_vwaddu_wx_u64m8_tumu(__VA_ARGS__) +#define vwsubu_vv_u16mf4_m(...) __riscv_vwsubu_vv_u16mf4_tumu(__VA_ARGS__) +#define vwsubu_vx_u16mf4_m(...) __riscv_vwsubu_vx_u16mf4_tumu(__VA_ARGS__) +#define vwsubu_wv_u16mf4_m(...) __riscv_vwsubu_wv_u16mf4_tumu(__VA_ARGS__) +#define vwsubu_wx_u16mf4_m(...) __riscv_vwsubu_wx_u16mf4_tumu(__VA_ARGS__) +#define vwsubu_vv_u16mf2_m(...) __riscv_vwsubu_vv_u16mf2_tumu(__VA_ARGS__) +#define vwsubu_vx_u16mf2_m(...) __riscv_vwsubu_vx_u16mf2_tumu(__VA_ARGS__) +#define vwsubu_wv_u16mf2_m(...) __riscv_vwsubu_wv_u16mf2_tumu(__VA_ARGS__) +#define vwsubu_wx_u16mf2_m(...) __riscv_vwsubu_wx_u16mf2_tumu(__VA_ARGS__) +#define vwsubu_vv_u16m1_m(...) __riscv_vwsubu_vv_u16m1_tumu(__VA_ARGS__) +#define vwsubu_vx_u16m1_m(...) __riscv_vwsubu_vx_u16m1_tumu(__VA_ARGS__) +#define vwsubu_wv_u16m1_m(...) __riscv_vwsubu_wv_u16m1_tumu(__VA_ARGS__) +#define vwsubu_wx_u16m1_m(...) __riscv_vwsubu_wx_u16m1_tumu(__VA_ARGS__) +#define vwsubu_vv_u16m2_m(...) __riscv_vwsubu_vv_u16m2_tumu(__VA_ARGS__) +#define vwsubu_vx_u16m2_m(...) __riscv_vwsubu_vx_u16m2_tumu(__VA_ARGS__) +#define vwsubu_wv_u16m2_m(...) __riscv_vwsubu_wv_u16m2_tumu(__VA_ARGS__) +#define vwsubu_wx_u16m2_m(...) __riscv_vwsubu_wx_u16m2_tumu(__VA_ARGS__) +#define vwsubu_vv_u16m4_m(...) __riscv_vwsubu_vv_u16m4_tumu(__VA_ARGS__) +#define vwsubu_vx_u16m4_m(...) __riscv_vwsubu_vx_u16m4_tumu(__VA_ARGS__) +#define vwsubu_wv_u16m4_m(...) __riscv_vwsubu_wv_u16m4_tumu(__VA_ARGS__) +#define vwsubu_wx_u16m4_m(...) __riscv_vwsubu_wx_u16m4_tumu(__VA_ARGS__) +#define vwsubu_vv_u16m8_m(...) __riscv_vwsubu_vv_u16m8_tumu(__VA_ARGS__) +#define vwsubu_vx_u16m8_m(...) __riscv_vwsubu_vx_u16m8_tumu(__VA_ARGS__) +#define vwsubu_wv_u16m8_m(...) __riscv_vwsubu_wv_u16m8_tumu(__VA_ARGS__) +#define vwsubu_wx_u16m8_m(...) __riscv_vwsubu_wx_u16m8_tumu(__VA_ARGS__) +#define vwsubu_vv_u32mf2_m(...) __riscv_vwsubu_vv_u32mf2_tumu(__VA_ARGS__) +#define vwsubu_vx_u32mf2_m(...) __riscv_vwsubu_vx_u32mf2_tumu(__VA_ARGS__) +#define vwsubu_wv_u32mf2_m(...) __riscv_vwsubu_wv_u32mf2_tumu(__VA_ARGS__) +#define vwsubu_wx_u32mf2_m(...) __riscv_vwsubu_wx_u32mf2_tumu(__VA_ARGS__) +#define vwsubu_vv_u32m1_m(...) __riscv_vwsubu_vv_u32m1_tumu(__VA_ARGS__) +#define vwsubu_vx_u32m1_m(...) __riscv_vwsubu_vx_u32m1_tumu(__VA_ARGS__) +#define vwsubu_wv_u32m1_m(...) __riscv_vwsubu_wv_u32m1_tumu(__VA_ARGS__) +#define vwsubu_wx_u32m1_m(...) __riscv_vwsubu_wx_u32m1_tumu(__VA_ARGS__) +#define vwsubu_vv_u32m2_m(...) __riscv_vwsubu_vv_u32m2_tumu(__VA_ARGS__) +#define vwsubu_vx_u32m2_m(...) __riscv_vwsubu_vx_u32m2_tumu(__VA_ARGS__) +#define vwsubu_wv_u32m2_m(...) __riscv_vwsubu_wv_u32m2_tumu(__VA_ARGS__) +#define vwsubu_wx_u32m2_m(...) __riscv_vwsubu_wx_u32m2_tumu(__VA_ARGS__) +#define vwsubu_vv_u32m4_m(...) __riscv_vwsubu_vv_u32m4_tumu(__VA_ARGS__) +#define vwsubu_vx_u32m4_m(...) __riscv_vwsubu_vx_u32m4_tumu(__VA_ARGS__) +#define vwsubu_wv_u32m4_m(...) __riscv_vwsubu_wv_u32m4_tumu(__VA_ARGS__) +#define vwsubu_wx_u32m4_m(...) __riscv_vwsubu_wx_u32m4_tumu(__VA_ARGS__) +#define vwsubu_vv_u32m8_m(...) __riscv_vwsubu_vv_u32m8_tumu(__VA_ARGS__) +#define vwsubu_vx_u32m8_m(...) __riscv_vwsubu_vx_u32m8_tumu(__VA_ARGS__) +#define vwsubu_wv_u32m8_m(...) __riscv_vwsubu_wv_u32m8_tumu(__VA_ARGS__) +#define vwsubu_wx_u32m8_m(...) __riscv_vwsubu_wx_u32m8_tumu(__VA_ARGS__) +#define vwsubu_vv_u64m1_m(...) __riscv_vwsubu_vv_u64m1_tumu(__VA_ARGS__) +#define vwsubu_vx_u64m1_m(...) __riscv_vwsubu_vx_u64m1_tumu(__VA_ARGS__) +#define vwsubu_wv_u64m1_m(...) __riscv_vwsubu_wv_u64m1_tumu(__VA_ARGS__) +#define vwsubu_wx_u64m1_m(...) __riscv_vwsubu_wx_u64m1_tumu(__VA_ARGS__) +#define vwsubu_vv_u64m2_m(...) __riscv_vwsubu_vv_u64m2_tumu(__VA_ARGS__) +#define vwsubu_vx_u64m2_m(...) __riscv_vwsubu_vx_u64m2_tumu(__VA_ARGS__) +#define vwsubu_wv_u64m2_m(...) __riscv_vwsubu_wv_u64m2_tumu(__VA_ARGS__) +#define vwsubu_wx_u64m2_m(...) __riscv_vwsubu_wx_u64m2_tumu(__VA_ARGS__) +#define vwsubu_vv_u64m4_m(...) __riscv_vwsubu_vv_u64m4_tumu(__VA_ARGS__) +#define vwsubu_vx_u64m4_m(...) __riscv_vwsubu_vx_u64m4_tumu(__VA_ARGS__) +#define vwsubu_wv_u64m4_m(...) __riscv_vwsubu_wv_u64m4_tumu(__VA_ARGS__) +#define vwsubu_wx_u64m4_m(...) __riscv_vwsubu_wx_u64m4_tumu(__VA_ARGS__) +#define vwsubu_vv_u64m8_m(...) __riscv_vwsubu_vv_u64m8_tumu(__VA_ARGS__) +#define vwsubu_vx_u64m8_m(...) __riscv_vwsubu_vx_u64m8_tumu(__VA_ARGS__) +#define vwsubu_wv_u64m8_m(...) __riscv_vwsubu_wv_u64m8_tumu(__VA_ARGS__) +#define vwsubu_wx_u64m8_m(...) __riscv_vwsubu_wx_u64m8_tumu(__VA_ARGS__) +#define vsext_vf2_i16mf4(...) __riscv_vsext_vf2_i16mf4(__VA_ARGS__) +#define vsext_vf2_i16mf2(...) __riscv_vsext_vf2_i16mf2(__VA_ARGS__) +#define vsext_vf2_i16m1(...) __riscv_vsext_vf2_i16m1(__VA_ARGS__) +#define vsext_vf2_i16m2(...) __riscv_vsext_vf2_i16m2(__VA_ARGS__) +#define vsext_vf2_i16m4(...) __riscv_vsext_vf2_i16m4(__VA_ARGS__) +#define vsext_vf2_i16m8(...) __riscv_vsext_vf2_i16m8(__VA_ARGS__) +#define vsext_vf4_i32mf2(...) __riscv_vsext_vf4_i32mf2(__VA_ARGS__) +#define vsext_vf4_i32m1(...) __riscv_vsext_vf4_i32m1(__VA_ARGS__) +#define vsext_vf4_i32m2(...) __riscv_vsext_vf4_i32m2(__VA_ARGS__) +#define vsext_vf4_i32m4(...) __riscv_vsext_vf4_i32m4(__VA_ARGS__) +#define vsext_vf4_i32m8(...) __riscv_vsext_vf4_i32m8(__VA_ARGS__) +#define vsext_vf8_i64m1(...) __riscv_vsext_vf8_i64m1(__VA_ARGS__) +#define vsext_vf8_i64m2(...) __riscv_vsext_vf8_i64m2(__VA_ARGS__) +#define vsext_vf8_i64m4(...) __riscv_vsext_vf8_i64m4(__VA_ARGS__) +#define vsext_vf8_i64m8(...) __riscv_vsext_vf8_i64m8(__VA_ARGS__) +#define vsext_vf2_i32mf2(...) __riscv_vsext_vf2_i32mf2(__VA_ARGS__) +#define vsext_vf2_i32m1(...) __riscv_vsext_vf2_i32m1(__VA_ARGS__) +#define vsext_vf2_i32m2(...) __riscv_vsext_vf2_i32m2(__VA_ARGS__) +#define vsext_vf2_i32m4(...) __riscv_vsext_vf2_i32m4(__VA_ARGS__) +#define vsext_vf2_i32m8(...) __riscv_vsext_vf2_i32m8(__VA_ARGS__) +#define vsext_vf4_i64m1(...) __riscv_vsext_vf4_i64m1(__VA_ARGS__) +#define vsext_vf4_i64m2(...) __riscv_vsext_vf4_i64m2(__VA_ARGS__) +#define vsext_vf4_i64m4(...) __riscv_vsext_vf4_i64m4(__VA_ARGS__) +#define vsext_vf4_i64m8(...) __riscv_vsext_vf4_i64m8(__VA_ARGS__) +#define vsext_vf2_i64m1(...) __riscv_vsext_vf2_i64m1(__VA_ARGS__) +#define vsext_vf2_i64m2(...) __riscv_vsext_vf2_i64m2(__VA_ARGS__) +#define vsext_vf2_i64m4(...) __riscv_vsext_vf2_i64m4(__VA_ARGS__) +#define vsext_vf2_i64m8(...) __riscv_vsext_vf2_i64m8(__VA_ARGS__) +#define vzext_vf2_u16mf4(...) __riscv_vzext_vf2_u16mf4(__VA_ARGS__) +#define vzext_vf2_u16mf2(...) __riscv_vzext_vf2_u16mf2(__VA_ARGS__) +#define vzext_vf2_u16m1(...) __riscv_vzext_vf2_u16m1(__VA_ARGS__) +#define vzext_vf2_u16m2(...) __riscv_vzext_vf2_u16m2(__VA_ARGS__) +#define vzext_vf2_u16m4(...) __riscv_vzext_vf2_u16m4(__VA_ARGS__) +#define vzext_vf2_u16m8(...) __riscv_vzext_vf2_u16m8(__VA_ARGS__) +#define vzext_vf4_u32mf2(...) __riscv_vzext_vf4_u32mf2(__VA_ARGS__) +#define vzext_vf4_u32m1(...) __riscv_vzext_vf4_u32m1(__VA_ARGS__) +#define vzext_vf4_u32m2(...) __riscv_vzext_vf4_u32m2(__VA_ARGS__) +#define vzext_vf4_u32m4(...) __riscv_vzext_vf4_u32m4(__VA_ARGS__) +#define vzext_vf4_u32m8(...) __riscv_vzext_vf4_u32m8(__VA_ARGS__) +#define vzext_vf8_u64m1(...) __riscv_vzext_vf8_u64m1(__VA_ARGS__) +#define vzext_vf8_u64m2(...) __riscv_vzext_vf8_u64m2(__VA_ARGS__) +#define vzext_vf8_u64m4(...) __riscv_vzext_vf8_u64m4(__VA_ARGS__) +#define vzext_vf8_u64m8(...) __riscv_vzext_vf8_u64m8(__VA_ARGS__) +#define vzext_vf2_u32mf2(...) __riscv_vzext_vf2_u32mf2(__VA_ARGS__) +#define vzext_vf2_u32m1(...) __riscv_vzext_vf2_u32m1(__VA_ARGS__) +#define vzext_vf2_u32m2(...) __riscv_vzext_vf2_u32m2(__VA_ARGS__) +#define vzext_vf2_u32m4(...) __riscv_vzext_vf2_u32m4(__VA_ARGS__) +#define vzext_vf2_u32m8(...) __riscv_vzext_vf2_u32m8(__VA_ARGS__) +#define vzext_vf4_u64m1(...) __riscv_vzext_vf4_u64m1(__VA_ARGS__) +#define vzext_vf4_u64m2(...) __riscv_vzext_vf4_u64m2(__VA_ARGS__) +#define vzext_vf4_u64m4(...) __riscv_vzext_vf4_u64m4(__VA_ARGS__) +#define vzext_vf4_u64m8(...) __riscv_vzext_vf4_u64m8(__VA_ARGS__) +#define vzext_vf2_u64m1(...) __riscv_vzext_vf2_u64m1(__VA_ARGS__) +#define vzext_vf2_u64m2(...) __riscv_vzext_vf2_u64m2(__VA_ARGS__) +#define vzext_vf2_u64m4(...) __riscv_vzext_vf2_u64m4(__VA_ARGS__) +#define vzext_vf2_u64m8(...) __riscv_vzext_vf2_u64m8(__VA_ARGS__) +// masked functions +#define vsext_vf2_i16mf4_m(...) __riscv_vsext_vf2_i16mf4_tumu(__VA_ARGS__) +#define vsext_vf2_i16mf2_m(...) __riscv_vsext_vf2_i16mf2_tumu(__VA_ARGS__) +#define vsext_vf2_i16m1_m(...) __riscv_vsext_vf2_i16m1_tumu(__VA_ARGS__) +#define vsext_vf2_i16m2_m(...) __riscv_vsext_vf2_i16m2_tumu(__VA_ARGS__) +#define vsext_vf2_i16m4_m(...) __riscv_vsext_vf2_i16m4_tumu(__VA_ARGS__) +#define vsext_vf2_i16m8_m(...) __riscv_vsext_vf2_i16m8_tumu(__VA_ARGS__) +#define vsext_vf4_i32mf2_m(...) __riscv_vsext_vf4_i32mf2_tumu(__VA_ARGS__) +#define vsext_vf4_i32m1_m(...) __riscv_vsext_vf4_i32m1_tumu(__VA_ARGS__) +#define vsext_vf4_i32m2_m(...) __riscv_vsext_vf4_i32m2_tumu(__VA_ARGS__) +#define vsext_vf4_i32m4_m(...) __riscv_vsext_vf4_i32m4_tumu(__VA_ARGS__) +#define vsext_vf4_i32m8_m(...) __riscv_vsext_vf4_i32m8_tumu(__VA_ARGS__) +#define vsext_vf8_i64m1_m(...) __riscv_vsext_vf8_i64m1_tumu(__VA_ARGS__) +#define vsext_vf8_i64m2_m(...) __riscv_vsext_vf8_i64m2_tumu(__VA_ARGS__) +#define vsext_vf8_i64m4_m(...) __riscv_vsext_vf8_i64m4_tumu(__VA_ARGS__) +#define vsext_vf8_i64m8_m(...) __riscv_vsext_vf8_i64m8_tumu(__VA_ARGS__) +#define vsext_vf2_i32mf2_m(...) __riscv_vsext_vf2_i32mf2_tumu(__VA_ARGS__) +#define vsext_vf2_i32m1_m(...) __riscv_vsext_vf2_i32m1_tumu(__VA_ARGS__) +#define vsext_vf2_i32m2_m(...) __riscv_vsext_vf2_i32m2_tumu(__VA_ARGS__) +#define vsext_vf2_i32m4_m(...) __riscv_vsext_vf2_i32m4_tumu(__VA_ARGS__) +#define vsext_vf2_i32m8_m(...) __riscv_vsext_vf2_i32m8_tumu(__VA_ARGS__) +#define vsext_vf4_i64m1_m(...) __riscv_vsext_vf4_i64m1_tumu(__VA_ARGS__) +#define vsext_vf4_i64m2_m(...) __riscv_vsext_vf4_i64m2_tumu(__VA_ARGS__) +#define vsext_vf4_i64m4_m(...) __riscv_vsext_vf4_i64m4_tumu(__VA_ARGS__) +#define vsext_vf4_i64m8_m(...) __riscv_vsext_vf4_i64m8_tumu(__VA_ARGS__) +#define vsext_vf2_i64m1_m(...) __riscv_vsext_vf2_i64m1_tumu(__VA_ARGS__) +#define vsext_vf2_i64m2_m(...) __riscv_vsext_vf2_i64m2_tumu(__VA_ARGS__) +#define vsext_vf2_i64m4_m(...) __riscv_vsext_vf2_i64m4_tumu(__VA_ARGS__) +#define vsext_vf2_i64m8_m(...) __riscv_vsext_vf2_i64m8_tumu(__VA_ARGS__) +#define vzext_vf2_u16mf4_m(...) __riscv_vzext_vf2_u16mf4_tumu(__VA_ARGS__) +#define vzext_vf2_u16mf2_m(...) __riscv_vzext_vf2_u16mf2_tumu(__VA_ARGS__) +#define vzext_vf2_u16m1_m(...) __riscv_vzext_vf2_u16m1_tumu(__VA_ARGS__) +#define vzext_vf2_u16m2_m(...) __riscv_vzext_vf2_u16m2_tumu(__VA_ARGS__) +#define vzext_vf2_u16m4_m(...) __riscv_vzext_vf2_u16m4_tumu(__VA_ARGS__) +#define vzext_vf2_u16m8_m(...) __riscv_vzext_vf2_u16m8_tumu(__VA_ARGS__) +#define vzext_vf4_u32mf2_m(...) __riscv_vzext_vf4_u32mf2_tumu(__VA_ARGS__) +#define vzext_vf4_u32m1_m(...) __riscv_vzext_vf4_u32m1_tumu(__VA_ARGS__) +#define vzext_vf4_u32m2_m(...) __riscv_vzext_vf4_u32m2_tumu(__VA_ARGS__) +#define vzext_vf4_u32m4_m(...) __riscv_vzext_vf4_u32m4_tumu(__VA_ARGS__) +#define vzext_vf4_u32m8_m(...) __riscv_vzext_vf4_u32m8_tumu(__VA_ARGS__) +#define vzext_vf8_u64m1_m(...) __riscv_vzext_vf8_u64m1_tumu(__VA_ARGS__) +#define vzext_vf8_u64m2_m(...) __riscv_vzext_vf8_u64m2_tumu(__VA_ARGS__) +#define vzext_vf8_u64m4_m(...) __riscv_vzext_vf8_u64m4_tumu(__VA_ARGS__) +#define vzext_vf8_u64m8_m(...) __riscv_vzext_vf8_u64m8_tumu(__VA_ARGS__) +#define vzext_vf2_u32mf2_m(...) __riscv_vzext_vf2_u32mf2_tumu(__VA_ARGS__) +#define vzext_vf2_u32m1_m(...) __riscv_vzext_vf2_u32m1_tumu(__VA_ARGS__) +#define vzext_vf2_u32m2_m(...) __riscv_vzext_vf2_u32m2_tumu(__VA_ARGS__) +#define vzext_vf2_u32m4_m(...) __riscv_vzext_vf2_u32m4_tumu(__VA_ARGS__) +#define vzext_vf2_u32m8_m(...) __riscv_vzext_vf2_u32m8_tumu(__VA_ARGS__) +#define vzext_vf4_u64m1_m(...) __riscv_vzext_vf4_u64m1_tumu(__VA_ARGS__) +#define vzext_vf4_u64m2_m(...) __riscv_vzext_vf4_u64m2_tumu(__VA_ARGS__) +#define vzext_vf4_u64m4_m(...) __riscv_vzext_vf4_u64m4_tumu(__VA_ARGS__) +#define vzext_vf4_u64m8_m(...) __riscv_vzext_vf4_u64m8_tumu(__VA_ARGS__) +#define vzext_vf2_u64m1_m(...) __riscv_vzext_vf2_u64m1_tumu(__VA_ARGS__) +#define vzext_vf2_u64m2_m(...) __riscv_vzext_vf2_u64m2_tumu(__VA_ARGS__) +#define vzext_vf2_u64m4_m(...) __riscv_vzext_vf2_u64m4_tumu(__VA_ARGS__) +#define vzext_vf2_u64m8_m(...) __riscv_vzext_vf2_u64m8_tumu(__VA_ARGS__) +#define vadc_vvm_i8mf8(...) __riscv_vadc_vvm_i8mf8(__VA_ARGS__) +#define vadc_vxm_i8mf8(...) __riscv_vadc_vxm_i8mf8(__VA_ARGS__) +#define vadc_vvm_i8mf4(...) __riscv_vadc_vvm_i8mf4(__VA_ARGS__) +#define vadc_vxm_i8mf4(...) __riscv_vadc_vxm_i8mf4(__VA_ARGS__) +#define vadc_vvm_i8mf2(...) __riscv_vadc_vvm_i8mf2(__VA_ARGS__) +#define vadc_vxm_i8mf2(...) __riscv_vadc_vxm_i8mf2(__VA_ARGS__) +#define vadc_vvm_i8m1(...) __riscv_vadc_vvm_i8m1(__VA_ARGS__) +#define vadc_vxm_i8m1(...) __riscv_vadc_vxm_i8m1(__VA_ARGS__) +#define vadc_vvm_i8m2(...) __riscv_vadc_vvm_i8m2(__VA_ARGS__) +#define vadc_vxm_i8m2(...) __riscv_vadc_vxm_i8m2(__VA_ARGS__) +#define vadc_vvm_i8m4(...) __riscv_vadc_vvm_i8m4(__VA_ARGS__) +#define vadc_vxm_i8m4(...) __riscv_vadc_vxm_i8m4(__VA_ARGS__) +#define vadc_vvm_i8m8(...) __riscv_vadc_vvm_i8m8(__VA_ARGS__) +#define vadc_vxm_i8m8(...) __riscv_vadc_vxm_i8m8(__VA_ARGS__) +#define vadc_vvm_i16mf4(...) __riscv_vadc_vvm_i16mf4(__VA_ARGS__) +#define vadc_vxm_i16mf4(...) __riscv_vadc_vxm_i16mf4(__VA_ARGS__) +#define vadc_vvm_i16mf2(...) __riscv_vadc_vvm_i16mf2(__VA_ARGS__) +#define vadc_vxm_i16mf2(...) __riscv_vadc_vxm_i16mf2(__VA_ARGS__) +#define vadc_vvm_i16m1(...) __riscv_vadc_vvm_i16m1(__VA_ARGS__) +#define vadc_vxm_i16m1(...) __riscv_vadc_vxm_i16m1(__VA_ARGS__) +#define vadc_vvm_i16m2(...) __riscv_vadc_vvm_i16m2(__VA_ARGS__) +#define vadc_vxm_i16m2(...) __riscv_vadc_vxm_i16m2(__VA_ARGS__) +#define vadc_vvm_i16m4(...) __riscv_vadc_vvm_i16m4(__VA_ARGS__) +#define vadc_vxm_i16m4(...) __riscv_vadc_vxm_i16m4(__VA_ARGS__) +#define vadc_vvm_i16m8(...) __riscv_vadc_vvm_i16m8(__VA_ARGS__) +#define vadc_vxm_i16m8(...) __riscv_vadc_vxm_i16m8(__VA_ARGS__) +#define vadc_vvm_i32mf2(...) __riscv_vadc_vvm_i32mf2(__VA_ARGS__) +#define vadc_vxm_i32mf2(...) __riscv_vadc_vxm_i32mf2(__VA_ARGS__) +#define vadc_vvm_i32m1(...) __riscv_vadc_vvm_i32m1(__VA_ARGS__) +#define vadc_vxm_i32m1(...) __riscv_vadc_vxm_i32m1(__VA_ARGS__) +#define vadc_vvm_i32m2(...) __riscv_vadc_vvm_i32m2(__VA_ARGS__) +#define vadc_vxm_i32m2(...) __riscv_vadc_vxm_i32m2(__VA_ARGS__) +#define vadc_vvm_i32m4(...) __riscv_vadc_vvm_i32m4(__VA_ARGS__) +#define vadc_vxm_i32m4(...) __riscv_vadc_vxm_i32m4(__VA_ARGS__) +#define vadc_vvm_i32m8(...) __riscv_vadc_vvm_i32m8(__VA_ARGS__) +#define vadc_vxm_i32m8(...) __riscv_vadc_vxm_i32m8(__VA_ARGS__) +#define vadc_vvm_i64m1(...) __riscv_vadc_vvm_i64m1(__VA_ARGS__) +#define vadc_vxm_i64m1(...) __riscv_vadc_vxm_i64m1(__VA_ARGS__) +#define vadc_vvm_i64m2(...) __riscv_vadc_vvm_i64m2(__VA_ARGS__) +#define vadc_vxm_i64m2(...) __riscv_vadc_vxm_i64m2(__VA_ARGS__) +#define vadc_vvm_i64m4(...) __riscv_vadc_vvm_i64m4(__VA_ARGS__) +#define vadc_vxm_i64m4(...) __riscv_vadc_vxm_i64m4(__VA_ARGS__) +#define vadc_vvm_i64m8(...) __riscv_vadc_vvm_i64m8(__VA_ARGS__) +#define vadc_vxm_i64m8(...) __riscv_vadc_vxm_i64m8(__VA_ARGS__) +#define vsbc_vvm_i8mf8(...) __riscv_vsbc_vvm_i8mf8(__VA_ARGS__) +#define vsbc_vxm_i8mf8(...) __riscv_vsbc_vxm_i8mf8(__VA_ARGS__) +#define vsbc_vvm_i8mf4(...) __riscv_vsbc_vvm_i8mf4(__VA_ARGS__) +#define vsbc_vxm_i8mf4(...) __riscv_vsbc_vxm_i8mf4(__VA_ARGS__) +#define vsbc_vvm_i8mf2(...) __riscv_vsbc_vvm_i8mf2(__VA_ARGS__) +#define vsbc_vxm_i8mf2(...) __riscv_vsbc_vxm_i8mf2(__VA_ARGS__) +#define vsbc_vvm_i8m1(...) __riscv_vsbc_vvm_i8m1(__VA_ARGS__) +#define vsbc_vxm_i8m1(...) __riscv_vsbc_vxm_i8m1(__VA_ARGS__) +#define vsbc_vvm_i8m2(...) __riscv_vsbc_vvm_i8m2(__VA_ARGS__) +#define vsbc_vxm_i8m2(...) __riscv_vsbc_vxm_i8m2(__VA_ARGS__) +#define vsbc_vvm_i8m4(...) __riscv_vsbc_vvm_i8m4(__VA_ARGS__) +#define vsbc_vxm_i8m4(...) __riscv_vsbc_vxm_i8m4(__VA_ARGS__) +#define vsbc_vvm_i8m8(...) __riscv_vsbc_vvm_i8m8(__VA_ARGS__) +#define vsbc_vxm_i8m8(...) __riscv_vsbc_vxm_i8m8(__VA_ARGS__) +#define vsbc_vvm_i16mf4(...) __riscv_vsbc_vvm_i16mf4(__VA_ARGS__) +#define vsbc_vxm_i16mf4(...) __riscv_vsbc_vxm_i16mf4(__VA_ARGS__) +#define vsbc_vvm_i16mf2(...) __riscv_vsbc_vvm_i16mf2(__VA_ARGS__) +#define vsbc_vxm_i16mf2(...) __riscv_vsbc_vxm_i16mf2(__VA_ARGS__) +#define vsbc_vvm_i16m1(...) __riscv_vsbc_vvm_i16m1(__VA_ARGS__) +#define vsbc_vxm_i16m1(...) __riscv_vsbc_vxm_i16m1(__VA_ARGS__) +#define vsbc_vvm_i16m2(...) __riscv_vsbc_vvm_i16m2(__VA_ARGS__) +#define vsbc_vxm_i16m2(...) __riscv_vsbc_vxm_i16m2(__VA_ARGS__) +#define vsbc_vvm_i16m4(...) __riscv_vsbc_vvm_i16m4(__VA_ARGS__) +#define vsbc_vxm_i16m4(...) __riscv_vsbc_vxm_i16m4(__VA_ARGS__) +#define vsbc_vvm_i16m8(...) __riscv_vsbc_vvm_i16m8(__VA_ARGS__) +#define vsbc_vxm_i16m8(...) __riscv_vsbc_vxm_i16m8(__VA_ARGS__) +#define vsbc_vvm_i32mf2(...) __riscv_vsbc_vvm_i32mf2(__VA_ARGS__) +#define vsbc_vxm_i32mf2(...) __riscv_vsbc_vxm_i32mf2(__VA_ARGS__) +#define vsbc_vvm_i32m1(...) __riscv_vsbc_vvm_i32m1(__VA_ARGS__) +#define vsbc_vxm_i32m1(...) __riscv_vsbc_vxm_i32m1(__VA_ARGS__) +#define vsbc_vvm_i32m2(...) __riscv_vsbc_vvm_i32m2(__VA_ARGS__) +#define vsbc_vxm_i32m2(...) __riscv_vsbc_vxm_i32m2(__VA_ARGS__) +#define vsbc_vvm_i32m4(...) __riscv_vsbc_vvm_i32m4(__VA_ARGS__) +#define vsbc_vxm_i32m4(...) __riscv_vsbc_vxm_i32m4(__VA_ARGS__) +#define vsbc_vvm_i32m8(...) __riscv_vsbc_vvm_i32m8(__VA_ARGS__) +#define vsbc_vxm_i32m8(...) __riscv_vsbc_vxm_i32m8(__VA_ARGS__) +#define vsbc_vvm_i64m1(...) __riscv_vsbc_vvm_i64m1(__VA_ARGS__) +#define vsbc_vxm_i64m1(...) __riscv_vsbc_vxm_i64m1(__VA_ARGS__) +#define vsbc_vvm_i64m2(...) __riscv_vsbc_vvm_i64m2(__VA_ARGS__) +#define vsbc_vxm_i64m2(...) __riscv_vsbc_vxm_i64m2(__VA_ARGS__) +#define vsbc_vvm_i64m4(...) __riscv_vsbc_vvm_i64m4(__VA_ARGS__) +#define vsbc_vxm_i64m4(...) __riscv_vsbc_vxm_i64m4(__VA_ARGS__) +#define vsbc_vvm_i64m8(...) __riscv_vsbc_vvm_i64m8(__VA_ARGS__) +#define vsbc_vxm_i64m8(...) __riscv_vsbc_vxm_i64m8(__VA_ARGS__) +#define vadc_vvm_u8mf8(...) __riscv_vadc_vvm_u8mf8(__VA_ARGS__) +#define vadc_vxm_u8mf8(...) __riscv_vadc_vxm_u8mf8(__VA_ARGS__) +#define vadc_vvm_u8mf4(...) __riscv_vadc_vvm_u8mf4(__VA_ARGS__) +#define vadc_vxm_u8mf4(...) __riscv_vadc_vxm_u8mf4(__VA_ARGS__) +#define vadc_vvm_u8mf2(...) __riscv_vadc_vvm_u8mf2(__VA_ARGS__) +#define vadc_vxm_u8mf2(...) __riscv_vadc_vxm_u8mf2(__VA_ARGS__) +#define vadc_vvm_u8m1(...) __riscv_vadc_vvm_u8m1(__VA_ARGS__) +#define vadc_vxm_u8m1(...) __riscv_vadc_vxm_u8m1(__VA_ARGS__) +#define vadc_vvm_u8m2(...) __riscv_vadc_vvm_u8m2(__VA_ARGS__) +#define vadc_vxm_u8m2(...) __riscv_vadc_vxm_u8m2(__VA_ARGS__) +#define vadc_vvm_u8m4(...) __riscv_vadc_vvm_u8m4(__VA_ARGS__) +#define vadc_vxm_u8m4(...) __riscv_vadc_vxm_u8m4(__VA_ARGS__) +#define vadc_vvm_u8m8(...) __riscv_vadc_vvm_u8m8(__VA_ARGS__) +#define vadc_vxm_u8m8(...) __riscv_vadc_vxm_u8m8(__VA_ARGS__) +#define vadc_vvm_u16mf4(...) __riscv_vadc_vvm_u16mf4(__VA_ARGS__) +#define vadc_vxm_u16mf4(...) __riscv_vadc_vxm_u16mf4(__VA_ARGS__) +#define vadc_vvm_u16mf2(...) __riscv_vadc_vvm_u16mf2(__VA_ARGS__) +#define vadc_vxm_u16mf2(...) __riscv_vadc_vxm_u16mf2(__VA_ARGS__) +#define vadc_vvm_u16m1(...) __riscv_vadc_vvm_u16m1(__VA_ARGS__) +#define vadc_vxm_u16m1(...) __riscv_vadc_vxm_u16m1(__VA_ARGS__) +#define vadc_vvm_u16m2(...) __riscv_vadc_vvm_u16m2(__VA_ARGS__) +#define vadc_vxm_u16m2(...) __riscv_vadc_vxm_u16m2(__VA_ARGS__) +#define vadc_vvm_u16m4(...) __riscv_vadc_vvm_u16m4(__VA_ARGS__) +#define vadc_vxm_u16m4(...) __riscv_vadc_vxm_u16m4(__VA_ARGS__) +#define vadc_vvm_u16m8(...) __riscv_vadc_vvm_u16m8(__VA_ARGS__) +#define vadc_vxm_u16m8(...) __riscv_vadc_vxm_u16m8(__VA_ARGS__) +#define vadc_vvm_u32mf2(...) __riscv_vadc_vvm_u32mf2(__VA_ARGS__) +#define vadc_vxm_u32mf2(...) __riscv_vadc_vxm_u32mf2(__VA_ARGS__) +#define vadc_vvm_u32m1(...) __riscv_vadc_vvm_u32m1(__VA_ARGS__) +#define vadc_vxm_u32m1(...) __riscv_vadc_vxm_u32m1(__VA_ARGS__) +#define vadc_vvm_u32m2(...) __riscv_vadc_vvm_u32m2(__VA_ARGS__) +#define vadc_vxm_u32m2(...) __riscv_vadc_vxm_u32m2(__VA_ARGS__) +#define vadc_vvm_u32m4(...) __riscv_vadc_vvm_u32m4(__VA_ARGS__) +#define vadc_vxm_u32m4(...) __riscv_vadc_vxm_u32m4(__VA_ARGS__) +#define vadc_vvm_u32m8(...) __riscv_vadc_vvm_u32m8(__VA_ARGS__) +#define vadc_vxm_u32m8(...) __riscv_vadc_vxm_u32m8(__VA_ARGS__) +#define vadc_vvm_u64m1(...) __riscv_vadc_vvm_u64m1(__VA_ARGS__) +#define vadc_vxm_u64m1(...) __riscv_vadc_vxm_u64m1(__VA_ARGS__) +#define vadc_vvm_u64m2(...) __riscv_vadc_vvm_u64m2(__VA_ARGS__) +#define vadc_vxm_u64m2(...) __riscv_vadc_vxm_u64m2(__VA_ARGS__) +#define vadc_vvm_u64m4(...) __riscv_vadc_vvm_u64m4(__VA_ARGS__) +#define vadc_vxm_u64m4(...) __riscv_vadc_vxm_u64m4(__VA_ARGS__) +#define vadc_vvm_u64m8(...) __riscv_vadc_vvm_u64m8(__VA_ARGS__) +#define vadc_vxm_u64m8(...) __riscv_vadc_vxm_u64m8(__VA_ARGS__) +#define vsbc_vvm_u8mf8(...) __riscv_vsbc_vvm_u8mf8(__VA_ARGS__) +#define vsbc_vxm_u8mf8(...) __riscv_vsbc_vxm_u8mf8(__VA_ARGS__) +#define vsbc_vvm_u8mf4(...) __riscv_vsbc_vvm_u8mf4(__VA_ARGS__) +#define vsbc_vxm_u8mf4(...) __riscv_vsbc_vxm_u8mf4(__VA_ARGS__) +#define vsbc_vvm_u8mf2(...) __riscv_vsbc_vvm_u8mf2(__VA_ARGS__) +#define vsbc_vxm_u8mf2(...) __riscv_vsbc_vxm_u8mf2(__VA_ARGS__) +#define vsbc_vvm_u8m1(...) __riscv_vsbc_vvm_u8m1(__VA_ARGS__) +#define vsbc_vxm_u8m1(...) __riscv_vsbc_vxm_u8m1(__VA_ARGS__) +#define vsbc_vvm_u8m2(...) __riscv_vsbc_vvm_u8m2(__VA_ARGS__) +#define vsbc_vxm_u8m2(...) __riscv_vsbc_vxm_u8m2(__VA_ARGS__) +#define vsbc_vvm_u8m4(...) __riscv_vsbc_vvm_u8m4(__VA_ARGS__) +#define vsbc_vxm_u8m4(...) __riscv_vsbc_vxm_u8m4(__VA_ARGS__) +#define vsbc_vvm_u8m8(...) __riscv_vsbc_vvm_u8m8(__VA_ARGS__) +#define vsbc_vxm_u8m8(...) __riscv_vsbc_vxm_u8m8(__VA_ARGS__) +#define vsbc_vvm_u16mf4(...) __riscv_vsbc_vvm_u16mf4(__VA_ARGS__) +#define vsbc_vxm_u16mf4(...) __riscv_vsbc_vxm_u16mf4(__VA_ARGS__) +#define vsbc_vvm_u16mf2(...) __riscv_vsbc_vvm_u16mf2(__VA_ARGS__) +#define vsbc_vxm_u16mf2(...) __riscv_vsbc_vxm_u16mf2(__VA_ARGS__) +#define vsbc_vvm_u16m1(...) __riscv_vsbc_vvm_u16m1(__VA_ARGS__) +#define vsbc_vxm_u16m1(...) __riscv_vsbc_vxm_u16m1(__VA_ARGS__) +#define vsbc_vvm_u16m2(...) __riscv_vsbc_vvm_u16m2(__VA_ARGS__) +#define vsbc_vxm_u16m2(...) __riscv_vsbc_vxm_u16m2(__VA_ARGS__) +#define vsbc_vvm_u16m4(...) __riscv_vsbc_vvm_u16m4(__VA_ARGS__) +#define vsbc_vxm_u16m4(...) __riscv_vsbc_vxm_u16m4(__VA_ARGS__) +#define vsbc_vvm_u16m8(...) __riscv_vsbc_vvm_u16m8(__VA_ARGS__) +#define vsbc_vxm_u16m8(...) __riscv_vsbc_vxm_u16m8(__VA_ARGS__) +#define vsbc_vvm_u32mf2(...) __riscv_vsbc_vvm_u32mf2(__VA_ARGS__) +#define vsbc_vxm_u32mf2(...) __riscv_vsbc_vxm_u32mf2(__VA_ARGS__) +#define vsbc_vvm_u32m1(...) __riscv_vsbc_vvm_u32m1(__VA_ARGS__) +#define vsbc_vxm_u32m1(...) __riscv_vsbc_vxm_u32m1(__VA_ARGS__) +#define vsbc_vvm_u32m2(...) __riscv_vsbc_vvm_u32m2(__VA_ARGS__) +#define vsbc_vxm_u32m2(...) __riscv_vsbc_vxm_u32m2(__VA_ARGS__) +#define vsbc_vvm_u32m4(...) __riscv_vsbc_vvm_u32m4(__VA_ARGS__) +#define vsbc_vxm_u32m4(...) __riscv_vsbc_vxm_u32m4(__VA_ARGS__) +#define vsbc_vvm_u32m8(...) __riscv_vsbc_vvm_u32m8(__VA_ARGS__) +#define vsbc_vxm_u32m8(...) __riscv_vsbc_vxm_u32m8(__VA_ARGS__) +#define vsbc_vvm_u64m1(...) __riscv_vsbc_vvm_u64m1(__VA_ARGS__) +#define vsbc_vxm_u64m1(...) __riscv_vsbc_vxm_u64m1(__VA_ARGS__) +#define vsbc_vvm_u64m2(...) __riscv_vsbc_vvm_u64m2(__VA_ARGS__) +#define vsbc_vxm_u64m2(...) __riscv_vsbc_vxm_u64m2(__VA_ARGS__) +#define vsbc_vvm_u64m4(...) __riscv_vsbc_vvm_u64m4(__VA_ARGS__) +#define vsbc_vxm_u64m4(...) __riscv_vsbc_vxm_u64m4(__VA_ARGS__) +#define vsbc_vvm_u64m8(...) __riscv_vsbc_vvm_u64m8(__VA_ARGS__) +#define vsbc_vxm_u64m8(...) __riscv_vsbc_vxm_u64m8(__VA_ARGS__) +#define vmadc_vvm_i8mf8_b64(...) __riscv_vmadc_vvm_i8mf8_b64(__VA_ARGS__) +#define vmadc_vxm_i8mf8_b64(...) __riscv_vmadc_vxm_i8mf8_b64(__VA_ARGS__) +#define vmadc_vv_i8mf8_b64(...) __riscv_vmadc_vv_i8mf8_b64(__VA_ARGS__) +#define vmadc_vx_i8mf8_b64(...) __riscv_vmadc_vx_i8mf8_b64(__VA_ARGS__) +#define vmadc_vvm_i8mf4_b32(...) __riscv_vmadc_vvm_i8mf4_b32(__VA_ARGS__) +#define vmadc_vxm_i8mf4_b32(...) __riscv_vmadc_vxm_i8mf4_b32(__VA_ARGS__) +#define vmadc_vv_i8mf4_b32(...) __riscv_vmadc_vv_i8mf4_b32(__VA_ARGS__) +#define vmadc_vx_i8mf4_b32(...) __riscv_vmadc_vx_i8mf4_b32(__VA_ARGS__) +#define vmadc_vvm_i8mf2_b16(...) __riscv_vmadc_vvm_i8mf2_b16(__VA_ARGS__) +#define vmadc_vxm_i8mf2_b16(...) __riscv_vmadc_vxm_i8mf2_b16(__VA_ARGS__) +#define vmadc_vv_i8mf2_b16(...) __riscv_vmadc_vv_i8mf2_b16(__VA_ARGS__) +#define vmadc_vx_i8mf2_b16(...) __riscv_vmadc_vx_i8mf2_b16(__VA_ARGS__) +#define vmadc_vvm_i8m1_b8(...) __riscv_vmadc_vvm_i8m1_b8(__VA_ARGS__) +#define vmadc_vxm_i8m1_b8(...) __riscv_vmadc_vxm_i8m1_b8(__VA_ARGS__) +#define vmadc_vv_i8m1_b8(...) __riscv_vmadc_vv_i8m1_b8(__VA_ARGS__) +#define vmadc_vx_i8m1_b8(...) __riscv_vmadc_vx_i8m1_b8(__VA_ARGS__) +#define vmadc_vvm_i8m2_b4(...) __riscv_vmadc_vvm_i8m2_b4(__VA_ARGS__) +#define vmadc_vxm_i8m2_b4(...) __riscv_vmadc_vxm_i8m2_b4(__VA_ARGS__) +#define vmadc_vv_i8m2_b4(...) __riscv_vmadc_vv_i8m2_b4(__VA_ARGS__) +#define vmadc_vx_i8m2_b4(...) __riscv_vmadc_vx_i8m2_b4(__VA_ARGS__) +#define vmadc_vvm_i8m4_b2(...) __riscv_vmadc_vvm_i8m4_b2(__VA_ARGS__) +#define vmadc_vxm_i8m4_b2(...) __riscv_vmadc_vxm_i8m4_b2(__VA_ARGS__) +#define vmadc_vv_i8m4_b2(...) __riscv_vmadc_vv_i8m4_b2(__VA_ARGS__) +#define vmadc_vx_i8m4_b2(...) __riscv_vmadc_vx_i8m4_b2(__VA_ARGS__) +#define vmadc_vvm_i8m8_b1(...) __riscv_vmadc_vvm_i8m8_b1(__VA_ARGS__) +#define vmadc_vxm_i8m8_b1(...) __riscv_vmadc_vxm_i8m8_b1(__VA_ARGS__) +#define vmadc_vv_i8m8_b1(...) __riscv_vmadc_vv_i8m8_b1(__VA_ARGS__) +#define vmadc_vx_i8m8_b1(...) __riscv_vmadc_vx_i8m8_b1(__VA_ARGS__) +#define vmadc_vvm_i16mf4_b64(...) __riscv_vmadc_vvm_i16mf4_b64(__VA_ARGS__) +#define vmadc_vxm_i16mf4_b64(...) __riscv_vmadc_vxm_i16mf4_b64(__VA_ARGS__) +#define vmadc_vv_i16mf4_b64(...) __riscv_vmadc_vv_i16mf4_b64(__VA_ARGS__) +#define vmadc_vx_i16mf4_b64(...) __riscv_vmadc_vx_i16mf4_b64(__VA_ARGS__) +#define vmadc_vvm_i16mf2_b32(...) __riscv_vmadc_vvm_i16mf2_b32(__VA_ARGS__) +#define vmadc_vxm_i16mf2_b32(...) __riscv_vmadc_vxm_i16mf2_b32(__VA_ARGS__) +#define vmadc_vv_i16mf2_b32(...) __riscv_vmadc_vv_i16mf2_b32(__VA_ARGS__) +#define vmadc_vx_i16mf2_b32(...) __riscv_vmadc_vx_i16mf2_b32(__VA_ARGS__) +#define vmadc_vvm_i16m1_b16(...) __riscv_vmadc_vvm_i16m1_b16(__VA_ARGS__) +#define vmadc_vxm_i16m1_b16(...) __riscv_vmadc_vxm_i16m1_b16(__VA_ARGS__) +#define vmadc_vv_i16m1_b16(...) __riscv_vmadc_vv_i16m1_b16(__VA_ARGS__) +#define vmadc_vx_i16m1_b16(...) __riscv_vmadc_vx_i16m1_b16(__VA_ARGS__) +#define vmadc_vvm_i16m2_b8(...) __riscv_vmadc_vvm_i16m2_b8(__VA_ARGS__) +#define vmadc_vxm_i16m2_b8(...) __riscv_vmadc_vxm_i16m2_b8(__VA_ARGS__) +#define vmadc_vv_i16m2_b8(...) __riscv_vmadc_vv_i16m2_b8(__VA_ARGS__) +#define vmadc_vx_i16m2_b8(...) __riscv_vmadc_vx_i16m2_b8(__VA_ARGS__) +#define vmadc_vvm_i16m4_b4(...) __riscv_vmadc_vvm_i16m4_b4(__VA_ARGS__) +#define vmadc_vxm_i16m4_b4(...) __riscv_vmadc_vxm_i16m4_b4(__VA_ARGS__) +#define vmadc_vv_i16m4_b4(...) __riscv_vmadc_vv_i16m4_b4(__VA_ARGS__) +#define vmadc_vx_i16m4_b4(...) __riscv_vmadc_vx_i16m4_b4(__VA_ARGS__) +#define vmadc_vvm_i16m8_b2(...) __riscv_vmadc_vvm_i16m8_b2(__VA_ARGS__) +#define vmadc_vxm_i16m8_b2(...) __riscv_vmadc_vxm_i16m8_b2(__VA_ARGS__) +#define vmadc_vv_i16m8_b2(...) __riscv_vmadc_vv_i16m8_b2(__VA_ARGS__) +#define vmadc_vx_i16m8_b2(...) __riscv_vmadc_vx_i16m8_b2(__VA_ARGS__) +#define vmadc_vvm_i32mf2_b64(...) __riscv_vmadc_vvm_i32mf2_b64(__VA_ARGS__) +#define vmadc_vxm_i32mf2_b64(...) __riscv_vmadc_vxm_i32mf2_b64(__VA_ARGS__) +#define vmadc_vv_i32mf2_b64(...) __riscv_vmadc_vv_i32mf2_b64(__VA_ARGS__) +#define vmadc_vx_i32mf2_b64(...) __riscv_vmadc_vx_i32mf2_b64(__VA_ARGS__) +#define vmadc_vvm_i32m1_b32(...) __riscv_vmadc_vvm_i32m1_b32(__VA_ARGS__) +#define vmadc_vxm_i32m1_b32(...) __riscv_vmadc_vxm_i32m1_b32(__VA_ARGS__) +#define vmadc_vv_i32m1_b32(...) __riscv_vmadc_vv_i32m1_b32(__VA_ARGS__) +#define vmadc_vx_i32m1_b32(...) __riscv_vmadc_vx_i32m1_b32(__VA_ARGS__) +#define vmadc_vvm_i32m2_b16(...) __riscv_vmadc_vvm_i32m2_b16(__VA_ARGS__) +#define vmadc_vxm_i32m2_b16(...) __riscv_vmadc_vxm_i32m2_b16(__VA_ARGS__) +#define vmadc_vv_i32m2_b16(...) __riscv_vmadc_vv_i32m2_b16(__VA_ARGS__) +#define vmadc_vx_i32m2_b16(...) __riscv_vmadc_vx_i32m2_b16(__VA_ARGS__) +#define vmadc_vvm_i32m4_b8(...) __riscv_vmadc_vvm_i32m4_b8(__VA_ARGS__) +#define vmadc_vxm_i32m4_b8(...) __riscv_vmadc_vxm_i32m4_b8(__VA_ARGS__) +#define vmadc_vv_i32m4_b8(...) __riscv_vmadc_vv_i32m4_b8(__VA_ARGS__) +#define vmadc_vx_i32m4_b8(...) __riscv_vmadc_vx_i32m4_b8(__VA_ARGS__) +#define vmadc_vvm_i32m8_b4(...) __riscv_vmadc_vvm_i32m8_b4(__VA_ARGS__) +#define vmadc_vxm_i32m8_b4(...) __riscv_vmadc_vxm_i32m8_b4(__VA_ARGS__) +#define vmadc_vv_i32m8_b4(...) __riscv_vmadc_vv_i32m8_b4(__VA_ARGS__) +#define vmadc_vx_i32m8_b4(...) __riscv_vmadc_vx_i32m8_b4(__VA_ARGS__) +#define vmadc_vvm_i64m1_b64(...) __riscv_vmadc_vvm_i64m1_b64(__VA_ARGS__) +#define vmadc_vxm_i64m1_b64(...) __riscv_vmadc_vxm_i64m1_b64(__VA_ARGS__) +#define vmadc_vv_i64m1_b64(...) __riscv_vmadc_vv_i64m1_b64(__VA_ARGS__) +#define vmadc_vx_i64m1_b64(...) __riscv_vmadc_vx_i64m1_b64(__VA_ARGS__) +#define vmadc_vvm_i64m2_b32(...) __riscv_vmadc_vvm_i64m2_b32(__VA_ARGS__) +#define vmadc_vxm_i64m2_b32(...) __riscv_vmadc_vxm_i64m2_b32(__VA_ARGS__) +#define vmadc_vv_i64m2_b32(...) __riscv_vmadc_vv_i64m2_b32(__VA_ARGS__) +#define vmadc_vx_i64m2_b32(...) __riscv_vmadc_vx_i64m2_b32(__VA_ARGS__) +#define vmadc_vvm_i64m4_b16(...) __riscv_vmadc_vvm_i64m4_b16(__VA_ARGS__) +#define vmadc_vxm_i64m4_b16(...) __riscv_vmadc_vxm_i64m4_b16(__VA_ARGS__) +#define vmadc_vv_i64m4_b16(...) __riscv_vmadc_vv_i64m4_b16(__VA_ARGS__) +#define vmadc_vx_i64m4_b16(...) __riscv_vmadc_vx_i64m4_b16(__VA_ARGS__) +#define vmadc_vvm_i64m8_b8(...) __riscv_vmadc_vvm_i64m8_b8(__VA_ARGS__) +#define vmadc_vxm_i64m8_b8(...) __riscv_vmadc_vxm_i64m8_b8(__VA_ARGS__) +#define vmadc_vv_i64m8_b8(...) __riscv_vmadc_vv_i64m8_b8(__VA_ARGS__) +#define vmadc_vx_i64m8_b8(...) __riscv_vmadc_vx_i64m8_b8(__VA_ARGS__) +#define vmsbc_vvm_i8mf8_b64(...) __riscv_vmsbc_vvm_i8mf8_b64(__VA_ARGS__) +#define vmsbc_vxm_i8mf8_b64(...) __riscv_vmsbc_vxm_i8mf8_b64(__VA_ARGS__) +#define vmsbc_vv_i8mf8_b64(...) __riscv_vmsbc_vv_i8mf8_b64(__VA_ARGS__) +#define vmsbc_vx_i8mf8_b64(...) __riscv_vmsbc_vx_i8mf8_b64(__VA_ARGS__) +#define vmsbc_vvm_i8mf4_b32(...) __riscv_vmsbc_vvm_i8mf4_b32(__VA_ARGS__) +#define vmsbc_vxm_i8mf4_b32(...) __riscv_vmsbc_vxm_i8mf4_b32(__VA_ARGS__) +#define vmsbc_vv_i8mf4_b32(...) __riscv_vmsbc_vv_i8mf4_b32(__VA_ARGS__) +#define vmsbc_vx_i8mf4_b32(...) __riscv_vmsbc_vx_i8mf4_b32(__VA_ARGS__) +#define vmsbc_vvm_i8mf2_b16(...) __riscv_vmsbc_vvm_i8mf2_b16(__VA_ARGS__) +#define vmsbc_vxm_i8mf2_b16(...) __riscv_vmsbc_vxm_i8mf2_b16(__VA_ARGS__) +#define vmsbc_vv_i8mf2_b16(...) __riscv_vmsbc_vv_i8mf2_b16(__VA_ARGS__) +#define vmsbc_vx_i8mf2_b16(...) __riscv_vmsbc_vx_i8mf2_b16(__VA_ARGS__) +#define vmsbc_vvm_i8m1_b8(...) __riscv_vmsbc_vvm_i8m1_b8(__VA_ARGS__) +#define vmsbc_vxm_i8m1_b8(...) __riscv_vmsbc_vxm_i8m1_b8(__VA_ARGS__) +#define vmsbc_vv_i8m1_b8(...) __riscv_vmsbc_vv_i8m1_b8(__VA_ARGS__) +#define vmsbc_vx_i8m1_b8(...) __riscv_vmsbc_vx_i8m1_b8(__VA_ARGS__) +#define vmsbc_vvm_i8m2_b4(...) __riscv_vmsbc_vvm_i8m2_b4(__VA_ARGS__) +#define vmsbc_vxm_i8m2_b4(...) __riscv_vmsbc_vxm_i8m2_b4(__VA_ARGS__) +#define vmsbc_vv_i8m2_b4(...) __riscv_vmsbc_vv_i8m2_b4(__VA_ARGS__) +#define vmsbc_vx_i8m2_b4(...) __riscv_vmsbc_vx_i8m2_b4(__VA_ARGS__) +#define vmsbc_vvm_i8m4_b2(...) __riscv_vmsbc_vvm_i8m4_b2(__VA_ARGS__) +#define vmsbc_vxm_i8m4_b2(...) __riscv_vmsbc_vxm_i8m4_b2(__VA_ARGS__) +#define vmsbc_vv_i8m4_b2(...) __riscv_vmsbc_vv_i8m4_b2(__VA_ARGS__) +#define vmsbc_vx_i8m4_b2(...) __riscv_vmsbc_vx_i8m4_b2(__VA_ARGS__) +#define vmsbc_vvm_i8m8_b1(...) __riscv_vmsbc_vvm_i8m8_b1(__VA_ARGS__) +#define vmsbc_vxm_i8m8_b1(...) __riscv_vmsbc_vxm_i8m8_b1(__VA_ARGS__) +#define vmsbc_vv_i8m8_b1(...) __riscv_vmsbc_vv_i8m8_b1(__VA_ARGS__) +#define vmsbc_vx_i8m8_b1(...) __riscv_vmsbc_vx_i8m8_b1(__VA_ARGS__) +#define vmsbc_vvm_i16mf4_b64(...) __riscv_vmsbc_vvm_i16mf4_b64(__VA_ARGS__) +#define vmsbc_vxm_i16mf4_b64(...) __riscv_vmsbc_vxm_i16mf4_b64(__VA_ARGS__) +#define vmsbc_vv_i16mf4_b64(...) __riscv_vmsbc_vv_i16mf4_b64(__VA_ARGS__) +#define vmsbc_vx_i16mf4_b64(...) __riscv_vmsbc_vx_i16mf4_b64(__VA_ARGS__) +#define vmsbc_vvm_i16mf2_b32(...) __riscv_vmsbc_vvm_i16mf2_b32(__VA_ARGS__) +#define vmsbc_vxm_i16mf2_b32(...) __riscv_vmsbc_vxm_i16mf2_b32(__VA_ARGS__) +#define vmsbc_vv_i16mf2_b32(...) __riscv_vmsbc_vv_i16mf2_b32(__VA_ARGS__) +#define vmsbc_vx_i16mf2_b32(...) __riscv_vmsbc_vx_i16mf2_b32(__VA_ARGS__) +#define vmsbc_vvm_i16m1_b16(...) __riscv_vmsbc_vvm_i16m1_b16(__VA_ARGS__) +#define vmsbc_vxm_i16m1_b16(...) __riscv_vmsbc_vxm_i16m1_b16(__VA_ARGS__) +#define vmsbc_vv_i16m1_b16(...) __riscv_vmsbc_vv_i16m1_b16(__VA_ARGS__) +#define vmsbc_vx_i16m1_b16(...) __riscv_vmsbc_vx_i16m1_b16(__VA_ARGS__) +#define vmsbc_vvm_i16m2_b8(...) __riscv_vmsbc_vvm_i16m2_b8(__VA_ARGS__) +#define vmsbc_vxm_i16m2_b8(...) __riscv_vmsbc_vxm_i16m2_b8(__VA_ARGS__) +#define vmsbc_vv_i16m2_b8(...) __riscv_vmsbc_vv_i16m2_b8(__VA_ARGS__) +#define vmsbc_vx_i16m2_b8(...) __riscv_vmsbc_vx_i16m2_b8(__VA_ARGS__) +#define vmsbc_vvm_i16m4_b4(...) __riscv_vmsbc_vvm_i16m4_b4(__VA_ARGS__) +#define vmsbc_vxm_i16m4_b4(...) __riscv_vmsbc_vxm_i16m4_b4(__VA_ARGS__) +#define vmsbc_vv_i16m4_b4(...) __riscv_vmsbc_vv_i16m4_b4(__VA_ARGS__) +#define vmsbc_vx_i16m4_b4(...) __riscv_vmsbc_vx_i16m4_b4(__VA_ARGS__) +#define vmsbc_vvm_i16m8_b2(...) __riscv_vmsbc_vvm_i16m8_b2(__VA_ARGS__) +#define vmsbc_vxm_i16m8_b2(...) __riscv_vmsbc_vxm_i16m8_b2(__VA_ARGS__) +#define vmsbc_vv_i16m8_b2(...) __riscv_vmsbc_vv_i16m8_b2(__VA_ARGS__) +#define vmsbc_vx_i16m8_b2(...) __riscv_vmsbc_vx_i16m8_b2(__VA_ARGS__) +#define vmsbc_vvm_i32mf2_b64(...) __riscv_vmsbc_vvm_i32mf2_b64(__VA_ARGS__) +#define vmsbc_vxm_i32mf2_b64(...) __riscv_vmsbc_vxm_i32mf2_b64(__VA_ARGS__) +#define vmsbc_vv_i32mf2_b64(...) __riscv_vmsbc_vv_i32mf2_b64(__VA_ARGS__) +#define vmsbc_vx_i32mf2_b64(...) __riscv_vmsbc_vx_i32mf2_b64(__VA_ARGS__) +#define vmsbc_vvm_i32m1_b32(...) __riscv_vmsbc_vvm_i32m1_b32(__VA_ARGS__) +#define vmsbc_vxm_i32m1_b32(...) __riscv_vmsbc_vxm_i32m1_b32(__VA_ARGS__) +#define vmsbc_vv_i32m1_b32(...) __riscv_vmsbc_vv_i32m1_b32(__VA_ARGS__) +#define vmsbc_vx_i32m1_b32(...) __riscv_vmsbc_vx_i32m1_b32(__VA_ARGS__) +#define vmsbc_vvm_i32m2_b16(...) __riscv_vmsbc_vvm_i32m2_b16(__VA_ARGS__) +#define vmsbc_vxm_i32m2_b16(...) __riscv_vmsbc_vxm_i32m2_b16(__VA_ARGS__) +#define vmsbc_vv_i32m2_b16(...) __riscv_vmsbc_vv_i32m2_b16(__VA_ARGS__) +#define vmsbc_vx_i32m2_b16(...) __riscv_vmsbc_vx_i32m2_b16(__VA_ARGS__) +#define vmsbc_vvm_i32m4_b8(...) __riscv_vmsbc_vvm_i32m4_b8(__VA_ARGS__) +#define vmsbc_vxm_i32m4_b8(...) __riscv_vmsbc_vxm_i32m4_b8(__VA_ARGS__) +#define vmsbc_vv_i32m4_b8(...) __riscv_vmsbc_vv_i32m4_b8(__VA_ARGS__) +#define vmsbc_vx_i32m4_b8(...) __riscv_vmsbc_vx_i32m4_b8(__VA_ARGS__) +#define vmsbc_vvm_i32m8_b4(...) __riscv_vmsbc_vvm_i32m8_b4(__VA_ARGS__) +#define vmsbc_vxm_i32m8_b4(...) __riscv_vmsbc_vxm_i32m8_b4(__VA_ARGS__) +#define vmsbc_vv_i32m8_b4(...) __riscv_vmsbc_vv_i32m8_b4(__VA_ARGS__) +#define vmsbc_vx_i32m8_b4(...) __riscv_vmsbc_vx_i32m8_b4(__VA_ARGS__) +#define vmsbc_vvm_i64m1_b64(...) __riscv_vmsbc_vvm_i64m1_b64(__VA_ARGS__) +#define vmsbc_vxm_i64m1_b64(...) __riscv_vmsbc_vxm_i64m1_b64(__VA_ARGS__) +#define vmsbc_vv_i64m1_b64(...) __riscv_vmsbc_vv_i64m1_b64(__VA_ARGS__) +#define vmsbc_vx_i64m1_b64(...) __riscv_vmsbc_vx_i64m1_b64(__VA_ARGS__) +#define vmsbc_vvm_i64m2_b32(...) __riscv_vmsbc_vvm_i64m2_b32(__VA_ARGS__) +#define vmsbc_vxm_i64m2_b32(...) __riscv_vmsbc_vxm_i64m2_b32(__VA_ARGS__) +#define vmsbc_vv_i64m2_b32(...) __riscv_vmsbc_vv_i64m2_b32(__VA_ARGS__) +#define vmsbc_vx_i64m2_b32(...) __riscv_vmsbc_vx_i64m2_b32(__VA_ARGS__) +#define vmsbc_vvm_i64m4_b16(...) __riscv_vmsbc_vvm_i64m4_b16(__VA_ARGS__) +#define vmsbc_vxm_i64m4_b16(...) __riscv_vmsbc_vxm_i64m4_b16(__VA_ARGS__) +#define vmsbc_vv_i64m4_b16(...) __riscv_vmsbc_vv_i64m4_b16(__VA_ARGS__) +#define vmsbc_vx_i64m4_b16(...) __riscv_vmsbc_vx_i64m4_b16(__VA_ARGS__) +#define vmsbc_vvm_i64m8_b8(...) __riscv_vmsbc_vvm_i64m8_b8(__VA_ARGS__) +#define vmsbc_vxm_i64m8_b8(...) __riscv_vmsbc_vxm_i64m8_b8(__VA_ARGS__) +#define vmsbc_vv_i64m8_b8(...) __riscv_vmsbc_vv_i64m8_b8(__VA_ARGS__) +#define vmsbc_vx_i64m8_b8(...) __riscv_vmsbc_vx_i64m8_b8(__VA_ARGS__) +#define vmadc_vvm_u8mf8_b64(...) __riscv_vmadc_vvm_u8mf8_b64(__VA_ARGS__) +#define vmadc_vxm_u8mf8_b64(...) __riscv_vmadc_vxm_u8mf8_b64(__VA_ARGS__) +#define vmadc_vv_u8mf8_b64(...) __riscv_vmadc_vv_u8mf8_b64(__VA_ARGS__) +#define vmadc_vx_u8mf8_b64(...) __riscv_vmadc_vx_u8mf8_b64(__VA_ARGS__) +#define vmadc_vvm_u8mf4_b32(...) __riscv_vmadc_vvm_u8mf4_b32(__VA_ARGS__) +#define vmadc_vxm_u8mf4_b32(...) __riscv_vmadc_vxm_u8mf4_b32(__VA_ARGS__) +#define vmadc_vv_u8mf4_b32(...) __riscv_vmadc_vv_u8mf4_b32(__VA_ARGS__) +#define vmadc_vx_u8mf4_b32(...) __riscv_vmadc_vx_u8mf4_b32(__VA_ARGS__) +#define vmadc_vvm_u8mf2_b16(...) __riscv_vmadc_vvm_u8mf2_b16(__VA_ARGS__) +#define vmadc_vxm_u8mf2_b16(...) __riscv_vmadc_vxm_u8mf2_b16(__VA_ARGS__) +#define vmadc_vv_u8mf2_b16(...) __riscv_vmadc_vv_u8mf2_b16(__VA_ARGS__) +#define vmadc_vx_u8mf2_b16(...) __riscv_vmadc_vx_u8mf2_b16(__VA_ARGS__) +#define vmadc_vvm_u8m1_b8(...) __riscv_vmadc_vvm_u8m1_b8(__VA_ARGS__) +#define vmadc_vxm_u8m1_b8(...) __riscv_vmadc_vxm_u8m1_b8(__VA_ARGS__) +#define vmadc_vv_u8m1_b8(...) __riscv_vmadc_vv_u8m1_b8(__VA_ARGS__) +#define vmadc_vx_u8m1_b8(...) __riscv_vmadc_vx_u8m1_b8(__VA_ARGS__) +#define vmadc_vvm_u8m2_b4(...) __riscv_vmadc_vvm_u8m2_b4(__VA_ARGS__) +#define vmadc_vxm_u8m2_b4(...) __riscv_vmadc_vxm_u8m2_b4(__VA_ARGS__) +#define vmadc_vv_u8m2_b4(...) __riscv_vmadc_vv_u8m2_b4(__VA_ARGS__) +#define vmadc_vx_u8m2_b4(...) __riscv_vmadc_vx_u8m2_b4(__VA_ARGS__) +#define vmadc_vvm_u8m4_b2(...) __riscv_vmadc_vvm_u8m4_b2(__VA_ARGS__) +#define vmadc_vxm_u8m4_b2(...) __riscv_vmadc_vxm_u8m4_b2(__VA_ARGS__) +#define vmadc_vv_u8m4_b2(...) __riscv_vmadc_vv_u8m4_b2(__VA_ARGS__) +#define vmadc_vx_u8m4_b2(...) __riscv_vmadc_vx_u8m4_b2(__VA_ARGS__) +#define vmadc_vvm_u8m8_b1(...) __riscv_vmadc_vvm_u8m8_b1(__VA_ARGS__) +#define vmadc_vxm_u8m8_b1(...) __riscv_vmadc_vxm_u8m8_b1(__VA_ARGS__) +#define vmadc_vv_u8m8_b1(...) __riscv_vmadc_vv_u8m8_b1(__VA_ARGS__) +#define vmadc_vx_u8m8_b1(...) __riscv_vmadc_vx_u8m8_b1(__VA_ARGS__) +#define vmadc_vvm_u16mf4_b64(...) __riscv_vmadc_vvm_u16mf4_b64(__VA_ARGS__) +#define vmadc_vxm_u16mf4_b64(...) __riscv_vmadc_vxm_u16mf4_b64(__VA_ARGS__) +#define vmadc_vv_u16mf4_b64(...) __riscv_vmadc_vv_u16mf4_b64(__VA_ARGS__) +#define vmadc_vx_u16mf4_b64(...) __riscv_vmadc_vx_u16mf4_b64(__VA_ARGS__) +#define vmadc_vvm_u16mf2_b32(...) __riscv_vmadc_vvm_u16mf2_b32(__VA_ARGS__) +#define vmadc_vxm_u16mf2_b32(...) __riscv_vmadc_vxm_u16mf2_b32(__VA_ARGS__) +#define vmadc_vv_u16mf2_b32(...) __riscv_vmadc_vv_u16mf2_b32(__VA_ARGS__) +#define vmadc_vx_u16mf2_b32(...) __riscv_vmadc_vx_u16mf2_b32(__VA_ARGS__) +#define vmadc_vvm_u16m1_b16(...) __riscv_vmadc_vvm_u16m1_b16(__VA_ARGS__) +#define vmadc_vxm_u16m1_b16(...) __riscv_vmadc_vxm_u16m1_b16(__VA_ARGS__) +#define vmadc_vv_u16m1_b16(...) __riscv_vmadc_vv_u16m1_b16(__VA_ARGS__) +#define vmadc_vx_u16m1_b16(...) __riscv_vmadc_vx_u16m1_b16(__VA_ARGS__) +#define vmadc_vvm_u16m2_b8(...) __riscv_vmadc_vvm_u16m2_b8(__VA_ARGS__) +#define vmadc_vxm_u16m2_b8(...) __riscv_vmadc_vxm_u16m2_b8(__VA_ARGS__) +#define vmadc_vv_u16m2_b8(...) __riscv_vmadc_vv_u16m2_b8(__VA_ARGS__) +#define vmadc_vx_u16m2_b8(...) __riscv_vmadc_vx_u16m2_b8(__VA_ARGS__) +#define vmadc_vvm_u16m4_b4(...) __riscv_vmadc_vvm_u16m4_b4(__VA_ARGS__) +#define vmadc_vxm_u16m4_b4(...) __riscv_vmadc_vxm_u16m4_b4(__VA_ARGS__) +#define vmadc_vv_u16m4_b4(...) __riscv_vmadc_vv_u16m4_b4(__VA_ARGS__) +#define vmadc_vx_u16m4_b4(...) __riscv_vmadc_vx_u16m4_b4(__VA_ARGS__) +#define vmadc_vvm_u16m8_b2(...) __riscv_vmadc_vvm_u16m8_b2(__VA_ARGS__) +#define vmadc_vxm_u16m8_b2(...) __riscv_vmadc_vxm_u16m8_b2(__VA_ARGS__) +#define vmadc_vv_u16m8_b2(...) __riscv_vmadc_vv_u16m8_b2(__VA_ARGS__) +#define vmadc_vx_u16m8_b2(...) __riscv_vmadc_vx_u16m8_b2(__VA_ARGS__) +#define vmadc_vvm_u32mf2_b64(...) __riscv_vmadc_vvm_u32mf2_b64(__VA_ARGS__) +#define vmadc_vxm_u32mf2_b64(...) __riscv_vmadc_vxm_u32mf2_b64(__VA_ARGS__) +#define vmadc_vv_u32mf2_b64(...) __riscv_vmadc_vv_u32mf2_b64(__VA_ARGS__) +#define vmadc_vx_u32mf2_b64(...) __riscv_vmadc_vx_u32mf2_b64(__VA_ARGS__) +#define vmadc_vvm_u32m1_b32(...) __riscv_vmadc_vvm_u32m1_b32(__VA_ARGS__) +#define vmadc_vxm_u32m1_b32(...) __riscv_vmadc_vxm_u32m1_b32(__VA_ARGS__) +#define vmadc_vv_u32m1_b32(...) __riscv_vmadc_vv_u32m1_b32(__VA_ARGS__) +#define vmadc_vx_u32m1_b32(...) __riscv_vmadc_vx_u32m1_b32(__VA_ARGS__) +#define vmadc_vvm_u32m2_b16(...) __riscv_vmadc_vvm_u32m2_b16(__VA_ARGS__) +#define vmadc_vxm_u32m2_b16(...) __riscv_vmadc_vxm_u32m2_b16(__VA_ARGS__) +#define vmadc_vv_u32m2_b16(...) __riscv_vmadc_vv_u32m2_b16(__VA_ARGS__) +#define vmadc_vx_u32m2_b16(...) __riscv_vmadc_vx_u32m2_b16(__VA_ARGS__) +#define vmadc_vvm_u32m4_b8(...) __riscv_vmadc_vvm_u32m4_b8(__VA_ARGS__) +#define vmadc_vxm_u32m4_b8(...) __riscv_vmadc_vxm_u32m4_b8(__VA_ARGS__) +#define vmadc_vv_u32m4_b8(...) __riscv_vmadc_vv_u32m4_b8(__VA_ARGS__) +#define vmadc_vx_u32m4_b8(...) __riscv_vmadc_vx_u32m4_b8(__VA_ARGS__) +#define vmadc_vvm_u32m8_b4(...) __riscv_vmadc_vvm_u32m8_b4(__VA_ARGS__) +#define vmadc_vxm_u32m8_b4(...) __riscv_vmadc_vxm_u32m8_b4(__VA_ARGS__) +#define vmadc_vv_u32m8_b4(...) __riscv_vmadc_vv_u32m8_b4(__VA_ARGS__) +#define vmadc_vx_u32m8_b4(...) __riscv_vmadc_vx_u32m8_b4(__VA_ARGS__) +#define vmadc_vvm_u64m1_b64(...) __riscv_vmadc_vvm_u64m1_b64(__VA_ARGS__) +#define vmadc_vxm_u64m1_b64(...) __riscv_vmadc_vxm_u64m1_b64(__VA_ARGS__) +#define vmadc_vv_u64m1_b64(...) __riscv_vmadc_vv_u64m1_b64(__VA_ARGS__) +#define vmadc_vx_u64m1_b64(...) __riscv_vmadc_vx_u64m1_b64(__VA_ARGS__) +#define vmadc_vvm_u64m2_b32(...) __riscv_vmadc_vvm_u64m2_b32(__VA_ARGS__) +#define vmadc_vxm_u64m2_b32(...) __riscv_vmadc_vxm_u64m2_b32(__VA_ARGS__) +#define vmadc_vv_u64m2_b32(...) __riscv_vmadc_vv_u64m2_b32(__VA_ARGS__) +#define vmadc_vx_u64m2_b32(...) __riscv_vmadc_vx_u64m2_b32(__VA_ARGS__) +#define vmadc_vvm_u64m4_b16(...) __riscv_vmadc_vvm_u64m4_b16(__VA_ARGS__) +#define vmadc_vxm_u64m4_b16(...) __riscv_vmadc_vxm_u64m4_b16(__VA_ARGS__) +#define vmadc_vv_u64m4_b16(...) __riscv_vmadc_vv_u64m4_b16(__VA_ARGS__) +#define vmadc_vx_u64m4_b16(...) __riscv_vmadc_vx_u64m4_b16(__VA_ARGS__) +#define vmadc_vvm_u64m8_b8(...) __riscv_vmadc_vvm_u64m8_b8(__VA_ARGS__) +#define vmadc_vxm_u64m8_b8(...) __riscv_vmadc_vxm_u64m8_b8(__VA_ARGS__) +#define vmadc_vv_u64m8_b8(...) __riscv_vmadc_vv_u64m8_b8(__VA_ARGS__) +#define vmadc_vx_u64m8_b8(...) __riscv_vmadc_vx_u64m8_b8(__VA_ARGS__) +#define vmsbc_vvm_u8mf8_b64(...) __riscv_vmsbc_vvm_u8mf8_b64(__VA_ARGS__) +#define vmsbc_vxm_u8mf8_b64(...) __riscv_vmsbc_vxm_u8mf8_b64(__VA_ARGS__) +#define vmsbc_vv_u8mf8_b64(...) __riscv_vmsbc_vv_u8mf8_b64(__VA_ARGS__) +#define vmsbc_vx_u8mf8_b64(...) __riscv_vmsbc_vx_u8mf8_b64(__VA_ARGS__) +#define vmsbc_vvm_u8mf4_b32(...) __riscv_vmsbc_vvm_u8mf4_b32(__VA_ARGS__) +#define vmsbc_vxm_u8mf4_b32(...) __riscv_vmsbc_vxm_u8mf4_b32(__VA_ARGS__) +#define vmsbc_vv_u8mf4_b32(...) __riscv_vmsbc_vv_u8mf4_b32(__VA_ARGS__) +#define vmsbc_vx_u8mf4_b32(...) __riscv_vmsbc_vx_u8mf4_b32(__VA_ARGS__) +#define vmsbc_vvm_u8mf2_b16(...) __riscv_vmsbc_vvm_u8mf2_b16(__VA_ARGS__) +#define vmsbc_vxm_u8mf2_b16(...) __riscv_vmsbc_vxm_u8mf2_b16(__VA_ARGS__) +#define vmsbc_vv_u8mf2_b16(...) __riscv_vmsbc_vv_u8mf2_b16(__VA_ARGS__) +#define vmsbc_vx_u8mf2_b16(...) __riscv_vmsbc_vx_u8mf2_b16(__VA_ARGS__) +#define vmsbc_vvm_u8m1_b8(...) __riscv_vmsbc_vvm_u8m1_b8(__VA_ARGS__) +#define vmsbc_vxm_u8m1_b8(...) __riscv_vmsbc_vxm_u8m1_b8(__VA_ARGS__) +#define vmsbc_vv_u8m1_b8(...) __riscv_vmsbc_vv_u8m1_b8(__VA_ARGS__) +#define vmsbc_vx_u8m1_b8(...) __riscv_vmsbc_vx_u8m1_b8(__VA_ARGS__) +#define vmsbc_vvm_u8m2_b4(...) __riscv_vmsbc_vvm_u8m2_b4(__VA_ARGS__) +#define vmsbc_vxm_u8m2_b4(...) __riscv_vmsbc_vxm_u8m2_b4(__VA_ARGS__) +#define vmsbc_vv_u8m2_b4(...) __riscv_vmsbc_vv_u8m2_b4(__VA_ARGS__) +#define vmsbc_vx_u8m2_b4(...) __riscv_vmsbc_vx_u8m2_b4(__VA_ARGS__) +#define vmsbc_vvm_u8m4_b2(...) __riscv_vmsbc_vvm_u8m4_b2(__VA_ARGS__) +#define vmsbc_vxm_u8m4_b2(...) __riscv_vmsbc_vxm_u8m4_b2(__VA_ARGS__) +#define vmsbc_vv_u8m4_b2(...) __riscv_vmsbc_vv_u8m4_b2(__VA_ARGS__) +#define vmsbc_vx_u8m4_b2(...) __riscv_vmsbc_vx_u8m4_b2(__VA_ARGS__) +#define vmsbc_vvm_u8m8_b1(...) __riscv_vmsbc_vvm_u8m8_b1(__VA_ARGS__) +#define vmsbc_vxm_u8m8_b1(...) __riscv_vmsbc_vxm_u8m8_b1(__VA_ARGS__) +#define vmsbc_vv_u8m8_b1(...) __riscv_vmsbc_vv_u8m8_b1(__VA_ARGS__) +#define vmsbc_vx_u8m8_b1(...) __riscv_vmsbc_vx_u8m8_b1(__VA_ARGS__) +#define vmsbc_vvm_u16mf4_b64(...) __riscv_vmsbc_vvm_u16mf4_b64(__VA_ARGS__) +#define vmsbc_vxm_u16mf4_b64(...) __riscv_vmsbc_vxm_u16mf4_b64(__VA_ARGS__) +#define vmsbc_vv_u16mf4_b64(...) __riscv_vmsbc_vv_u16mf4_b64(__VA_ARGS__) +#define vmsbc_vx_u16mf4_b64(...) __riscv_vmsbc_vx_u16mf4_b64(__VA_ARGS__) +#define vmsbc_vvm_u16mf2_b32(...) __riscv_vmsbc_vvm_u16mf2_b32(__VA_ARGS__) +#define vmsbc_vxm_u16mf2_b32(...) __riscv_vmsbc_vxm_u16mf2_b32(__VA_ARGS__) +#define vmsbc_vv_u16mf2_b32(...) __riscv_vmsbc_vv_u16mf2_b32(__VA_ARGS__) +#define vmsbc_vx_u16mf2_b32(...) __riscv_vmsbc_vx_u16mf2_b32(__VA_ARGS__) +#define vmsbc_vvm_u16m1_b16(...) __riscv_vmsbc_vvm_u16m1_b16(__VA_ARGS__) +#define vmsbc_vxm_u16m1_b16(...) __riscv_vmsbc_vxm_u16m1_b16(__VA_ARGS__) +#define vmsbc_vv_u16m1_b16(...) __riscv_vmsbc_vv_u16m1_b16(__VA_ARGS__) +#define vmsbc_vx_u16m1_b16(...) __riscv_vmsbc_vx_u16m1_b16(__VA_ARGS__) +#define vmsbc_vvm_u16m2_b8(...) __riscv_vmsbc_vvm_u16m2_b8(__VA_ARGS__) +#define vmsbc_vxm_u16m2_b8(...) __riscv_vmsbc_vxm_u16m2_b8(__VA_ARGS__) +#define vmsbc_vv_u16m2_b8(...) __riscv_vmsbc_vv_u16m2_b8(__VA_ARGS__) +#define vmsbc_vx_u16m2_b8(...) __riscv_vmsbc_vx_u16m2_b8(__VA_ARGS__) +#define vmsbc_vvm_u16m4_b4(...) __riscv_vmsbc_vvm_u16m4_b4(__VA_ARGS__) +#define vmsbc_vxm_u16m4_b4(...) __riscv_vmsbc_vxm_u16m4_b4(__VA_ARGS__) +#define vmsbc_vv_u16m4_b4(...) __riscv_vmsbc_vv_u16m4_b4(__VA_ARGS__) +#define vmsbc_vx_u16m4_b4(...) __riscv_vmsbc_vx_u16m4_b4(__VA_ARGS__) +#define vmsbc_vvm_u16m8_b2(...) __riscv_vmsbc_vvm_u16m8_b2(__VA_ARGS__) +#define vmsbc_vxm_u16m8_b2(...) __riscv_vmsbc_vxm_u16m8_b2(__VA_ARGS__) +#define vmsbc_vv_u16m8_b2(...) __riscv_vmsbc_vv_u16m8_b2(__VA_ARGS__) +#define vmsbc_vx_u16m8_b2(...) __riscv_vmsbc_vx_u16m8_b2(__VA_ARGS__) +#define vmsbc_vvm_u32mf2_b64(...) __riscv_vmsbc_vvm_u32mf2_b64(__VA_ARGS__) +#define vmsbc_vxm_u32mf2_b64(...) __riscv_vmsbc_vxm_u32mf2_b64(__VA_ARGS__) +#define vmsbc_vv_u32mf2_b64(...) __riscv_vmsbc_vv_u32mf2_b64(__VA_ARGS__) +#define vmsbc_vx_u32mf2_b64(...) __riscv_vmsbc_vx_u32mf2_b64(__VA_ARGS__) +#define vmsbc_vvm_u32m1_b32(...) __riscv_vmsbc_vvm_u32m1_b32(__VA_ARGS__) +#define vmsbc_vxm_u32m1_b32(...) __riscv_vmsbc_vxm_u32m1_b32(__VA_ARGS__) +#define vmsbc_vv_u32m1_b32(...) __riscv_vmsbc_vv_u32m1_b32(__VA_ARGS__) +#define vmsbc_vx_u32m1_b32(...) __riscv_vmsbc_vx_u32m1_b32(__VA_ARGS__) +#define vmsbc_vvm_u32m2_b16(...) __riscv_vmsbc_vvm_u32m2_b16(__VA_ARGS__) +#define vmsbc_vxm_u32m2_b16(...) __riscv_vmsbc_vxm_u32m2_b16(__VA_ARGS__) +#define vmsbc_vv_u32m2_b16(...) __riscv_vmsbc_vv_u32m2_b16(__VA_ARGS__) +#define vmsbc_vx_u32m2_b16(...) __riscv_vmsbc_vx_u32m2_b16(__VA_ARGS__) +#define vmsbc_vvm_u32m4_b8(...) __riscv_vmsbc_vvm_u32m4_b8(__VA_ARGS__) +#define vmsbc_vxm_u32m4_b8(...) __riscv_vmsbc_vxm_u32m4_b8(__VA_ARGS__) +#define vmsbc_vv_u32m4_b8(...) __riscv_vmsbc_vv_u32m4_b8(__VA_ARGS__) +#define vmsbc_vx_u32m4_b8(...) __riscv_vmsbc_vx_u32m4_b8(__VA_ARGS__) +#define vmsbc_vvm_u32m8_b4(...) __riscv_vmsbc_vvm_u32m8_b4(__VA_ARGS__) +#define vmsbc_vxm_u32m8_b4(...) __riscv_vmsbc_vxm_u32m8_b4(__VA_ARGS__) +#define vmsbc_vv_u32m8_b4(...) __riscv_vmsbc_vv_u32m8_b4(__VA_ARGS__) +#define vmsbc_vx_u32m8_b4(...) __riscv_vmsbc_vx_u32m8_b4(__VA_ARGS__) +#define vmsbc_vvm_u64m1_b64(...) __riscv_vmsbc_vvm_u64m1_b64(__VA_ARGS__) +#define vmsbc_vxm_u64m1_b64(...) __riscv_vmsbc_vxm_u64m1_b64(__VA_ARGS__) +#define vmsbc_vv_u64m1_b64(...) __riscv_vmsbc_vv_u64m1_b64(__VA_ARGS__) +#define vmsbc_vx_u64m1_b64(...) __riscv_vmsbc_vx_u64m1_b64(__VA_ARGS__) +#define vmsbc_vvm_u64m2_b32(...) __riscv_vmsbc_vvm_u64m2_b32(__VA_ARGS__) +#define vmsbc_vxm_u64m2_b32(...) __riscv_vmsbc_vxm_u64m2_b32(__VA_ARGS__) +#define vmsbc_vv_u64m2_b32(...) __riscv_vmsbc_vv_u64m2_b32(__VA_ARGS__) +#define vmsbc_vx_u64m2_b32(...) __riscv_vmsbc_vx_u64m2_b32(__VA_ARGS__) +#define vmsbc_vvm_u64m4_b16(...) __riscv_vmsbc_vvm_u64m4_b16(__VA_ARGS__) +#define vmsbc_vxm_u64m4_b16(...) __riscv_vmsbc_vxm_u64m4_b16(__VA_ARGS__) +#define vmsbc_vv_u64m4_b16(...) __riscv_vmsbc_vv_u64m4_b16(__VA_ARGS__) +#define vmsbc_vx_u64m4_b16(...) __riscv_vmsbc_vx_u64m4_b16(__VA_ARGS__) +#define vmsbc_vvm_u64m8_b8(...) __riscv_vmsbc_vvm_u64m8_b8(__VA_ARGS__) +#define vmsbc_vxm_u64m8_b8(...) __riscv_vmsbc_vxm_u64m8_b8(__VA_ARGS__) +#define vmsbc_vv_u64m8_b8(...) __riscv_vmsbc_vv_u64m8_b8(__VA_ARGS__) +#define vmsbc_vx_u64m8_b8(...) __riscv_vmsbc_vx_u64m8_b8(__VA_ARGS__) +#define vand_vv_i8mf8(...) __riscv_vand_vv_i8mf8(__VA_ARGS__) +#define vand_vx_i8mf8(...) __riscv_vand_vx_i8mf8(__VA_ARGS__) +#define vand_vv_i8mf4(...) __riscv_vand_vv_i8mf4(__VA_ARGS__) +#define vand_vx_i8mf4(...) __riscv_vand_vx_i8mf4(__VA_ARGS__) +#define vand_vv_i8mf2(...) __riscv_vand_vv_i8mf2(__VA_ARGS__) +#define vand_vx_i8mf2(...) __riscv_vand_vx_i8mf2(__VA_ARGS__) +#define vand_vv_i8m1(...) __riscv_vand_vv_i8m1(__VA_ARGS__) +#define vand_vx_i8m1(...) __riscv_vand_vx_i8m1(__VA_ARGS__) +#define vand_vv_i8m2(...) __riscv_vand_vv_i8m2(__VA_ARGS__) +#define vand_vx_i8m2(...) __riscv_vand_vx_i8m2(__VA_ARGS__) +#define vand_vv_i8m4(...) __riscv_vand_vv_i8m4(__VA_ARGS__) +#define vand_vx_i8m4(...) __riscv_vand_vx_i8m4(__VA_ARGS__) +#define vand_vv_i8m8(...) __riscv_vand_vv_i8m8(__VA_ARGS__) +#define vand_vx_i8m8(...) __riscv_vand_vx_i8m8(__VA_ARGS__) +#define vand_vv_i16mf4(...) __riscv_vand_vv_i16mf4(__VA_ARGS__) +#define vand_vx_i16mf4(...) __riscv_vand_vx_i16mf4(__VA_ARGS__) +#define vand_vv_i16mf2(...) __riscv_vand_vv_i16mf2(__VA_ARGS__) +#define vand_vx_i16mf2(...) __riscv_vand_vx_i16mf2(__VA_ARGS__) +#define vand_vv_i16m1(...) __riscv_vand_vv_i16m1(__VA_ARGS__) +#define vand_vx_i16m1(...) __riscv_vand_vx_i16m1(__VA_ARGS__) +#define vand_vv_i16m2(...) __riscv_vand_vv_i16m2(__VA_ARGS__) +#define vand_vx_i16m2(...) __riscv_vand_vx_i16m2(__VA_ARGS__) +#define vand_vv_i16m4(...) __riscv_vand_vv_i16m4(__VA_ARGS__) +#define vand_vx_i16m4(...) __riscv_vand_vx_i16m4(__VA_ARGS__) +#define vand_vv_i16m8(...) __riscv_vand_vv_i16m8(__VA_ARGS__) +#define vand_vx_i16m8(...) __riscv_vand_vx_i16m8(__VA_ARGS__) +#define vand_vv_i32mf2(...) __riscv_vand_vv_i32mf2(__VA_ARGS__) +#define vand_vx_i32mf2(...) __riscv_vand_vx_i32mf2(__VA_ARGS__) +#define vand_vv_i32m1(...) __riscv_vand_vv_i32m1(__VA_ARGS__) +#define vand_vx_i32m1(...) __riscv_vand_vx_i32m1(__VA_ARGS__) +#define vand_vv_i32m2(...) __riscv_vand_vv_i32m2(__VA_ARGS__) +#define vand_vx_i32m2(...) __riscv_vand_vx_i32m2(__VA_ARGS__) +#define vand_vv_i32m4(...) __riscv_vand_vv_i32m4(__VA_ARGS__) +#define vand_vx_i32m4(...) __riscv_vand_vx_i32m4(__VA_ARGS__) +#define vand_vv_i32m8(...) __riscv_vand_vv_i32m8(__VA_ARGS__) +#define vand_vx_i32m8(...) __riscv_vand_vx_i32m8(__VA_ARGS__) +#define vand_vv_i64m1(...) __riscv_vand_vv_i64m1(__VA_ARGS__) +#define vand_vx_i64m1(...) __riscv_vand_vx_i64m1(__VA_ARGS__) +#define vand_vv_i64m2(...) __riscv_vand_vv_i64m2(__VA_ARGS__) +#define vand_vx_i64m2(...) __riscv_vand_vx_i64m2(__VA_ARGS__) +#define vand_vv_i64m4(...) __riscv_vand_vv_i64m4(__VA_ARGS__) +#define vand_vx_i64m4(...) __riscv_vand_vx_i64m4(__VA_ARGS__) +#define vand_vv_i64m8(...) __riscv_vand_vv_i64m8(__VA_ARGS__) +#define vand_vx_i64m8(...) __riscv_vand_vx_i64m8(__VA_ARGS__) +#define vor_vv_i8mf8(...) __riscv_vor_vv_i8mf8(__VA_ARGS__) +#define vor_vx_i8mf8(...) __riscv_vor_vx_i8mf8(__VA_ARGS__) +#define vor_vv_i8mf4(...) __riscv_vor_vv_i8mf4(__VA_ARGS__) +#define vor_vx_i8mf4(...) __riscv_vor_vx_i8mf4(__VA_ARGS__) +#define vor_vv_i8mf2(...) __riscv_vor_vv_i8mf2(__VA_ARGS__) +#define vor_vx_i8mf2(...) __riscv_vor_vx_i8mf2(__VA_ARGS__) +#define vor_vv_i8m1(...) __riscv_vor_vv_i8m1(__VA_ARGS__) +#define vor_vx_i8m1(...) __riscv_vor_vx_i8m1(__VA_ARGS__) +#define vor_vv_i8m2(...) __riscv_vor_vv_i8m2(__VA_ARGS__) +#define vor_vx_i8m2(...) __riscv_vor_vx_i8m2(__VA_ARGS__) +#define vor_vv_i8m4(...) __riscv_vor_vv_i8m4(__VA_ARGS__) +#define vor_vx_i8m4(...) __riscv_vor_vx_i8m4(__VA_ARGS__) +#define vor_vv_i8m8(...) __riscv_vor_vv_i8m8(__VA_ARGS__) +#define vor_vx_i8m8(...) __riscv_vor_vx_i8m8(__VA_ARGS__) +#define vor_vv_i16mf4(...) __riscv_vor_vv_i16mf4(__VA_ARGS__) +#define vor_vx_i16mf4(...) __riscv_vor_vx_i16mf4(__VA_ARGS__) +#define vor_vv_i16mf2(...) __riscv_vor_vv_i16mf2(__VA_ARGS__) +#define vor_vx_i16mf2(...) __riscv_vor_vx_i16mf2(__VA_ARGS__) +#define vor_vv_i16m1(...) __riscv_vor_vv_i16m1(__VA_ARGS__) +#define vor_vx_i16m1(...) __riscv_vor_vx_i16m1(__VA_ARGS__) +#define vor_vv_i16m2(...) __riscv_vor_vv_i16m2(__VA_ARGS__) +#define vor_vx_i16m2(...) __riscv_vor_vx_i16m2(__VA_ARGS__) +#define vor_vv_i16m4(...) __riscv_vor_vv_i16m4(__VA_ARGS__) +#define vor_vx_i16m4(...) __riscv_vor_vx_i16m4(__VA_ARGS__) +#define vor_vv_i16m8(...) __riscv_vor_vv_i16m8(__VA_ARGS__) +#define vor_vx_i16m8(...) __riscv_vor_vx_i16m8(__VA_ARGS__) +#define vor_vv_i32mf2(...) __riscv_vor_vv_i32mf2(__VA_ARGS__) +#define vor_vx_i32mf2(...) __riscv_vor_vx_i32mf2(__VA_ARGS__) +#define vor_vv_i32m1(...) __riscv_vor_vv_i32m1(__VA_ARGS__) +#define vor_vx_i32m1(...) __riscv_vor_vx_i32m1(__VA_ARGS__) +#define vor_vv_i32m2(...) __riscv_vor_vv_i32m2(__VA_ARGS__) +#define vor_vx_i32m2(...) __riscv_vor_vx_i32m2(__VA_ARGS__) +#define vor_vv_i32m4(...) __riscv_vor_vv_i32m4(__VA_ARGS__) +#define vor_vx_i32m4(...) __riscv_vor_vx_i32m4(__VA_ARGS__) +#define vor_vv_i32m8(...) __riscv_vor_vv_i32m8(__VA_ARGS__) +#define vor_vx_i32m8(...) __riscv_vor_vx_i32m8(__VA_ARGS__) +#define vor_vv_i64m1(...) __riscv_vor_vv_i64m1(__VA_ARGS__) +#define vor_vx_i64m1(...) __riscv_vor_vx_i64m1(__VA_ARGS__) +#define vor_vv_i64m2(...) __riscv_vor_vv_i64m2(__VA_ARGS__) +#define vor_vx_i64m2(...) __riscv_vor_vx_i64m2(__VA_ARGS__) +#define vor_vv_i64m4(...) __riscv_vor_vv_i64m4(__VA_ARGS__) +#define vor_vx_i64m4(...) __riscv_vor_vx_i64m4(__VA_ARGS__) +#define vor_vv_i64m8(...) __riscv_vor_vv_i64m8(__VA_ARGS__) +#define vor_vx_i64m8(...) __riscv_vor_vx_i64m8(__VA_ARGS__) +#define vxor_vv_i8mf8(...) __riscv_vxor_vv_i8mf8(__VA_ARGS__) +#define vxor_vx_i8mf8(...) __riscv_vxor_vx_i8mf8(__VA_ARGS__) +#define vxor_vv_i8mf4(...) __riscv_vxor_vv_i8mf4(__VA_ARGS__) +#define vxor_vx_i8mf4(...) __riscv_vxor_vx_i8mf4(__VA_ARGS__) +#define vxor_vv_i8mf2(...) __riscv_vxor_vv_i8mf2(__VA_ARGS__) +#define vxor_vx_i8mf2(...) __riscv_vxor_vx_i8mf2(__VA_ARGS__) +#define vxor_vv_i8m1(...) __riscv_vxor_vv_i8m1(__VA_ARGS__) +#define vxor_vx_i8m1(...) __riscv_vxor_vx_i8m1(__VA_ARGS__) +#define vxor_vv_i8m2(...) __riscv_vxor_vv_i8m2(__VA_ARGS__) +#define vxor_vx_i8m2(...) __riscv_vxor_vx_i8m2(__VA_ARGS__) +#define vxor_vv_i8m4(...) __riscv_vxor_vv_i8m4(__VA_ARGS__) +#define vxor_vx_i8m4(...) __riscv_vxor_vx_i8m4(__VA_ARGS__) +#define vxor_vv_i8m8(...) __riscv_vxor_vv_i8m8(__VA_ARGS__) +#define vxor_vx_i8m8(...) __riscv_vxor_vx_i8m8(__VA_ARGS__) +#define vxor_vv_i16mf4(...) __riscv_vxor_vv_i16mf4(__VA_ARGS__) +#define vxor_vx_i16mf4(...) __riscv_vxor_vx_i16mf4(__VA_ARGS__) +#define vxor_vv_i16mf2(...) __riscv_vxor_vv_i16mf2(__VA_ARGS__) +#define vxor_vx_i16mf2(...) __riscv_vxor_vx_i16mf2(__VA_ARGS__) +#define vxor_vv_i16m1(...) __riscv_vxor_vv_i16m1(__VA_ARGS__) +#define vxor_vx_i16m1(...) __riscv_vxor_vx_i16m1(__VA_ARGS__) +#define vxor_vv_i16m2(...) __riscv_vxor_vv_i16m2(__VA_ARGS__) +#define vxor_vx_i16m2(...) __riscv_vxor_vx_i16m2(__VA_ARGS__) +#define vxor_vv_i16m4(...) __riscv_vxor_vv_i16m4(__VA_ARGS__) +#define vxor_vx_i16m4(...) __riscv_vxor_vx_i16m4(__VA_ARGS__) +#define vxor_vv_i16m8(...) __riscv_vxor_vv_i16m8(__VA_ARGS__) +#define vxor_vx_i16m8(...) __riscv_vxor_vx_i16m8(__VA_ARGS__) +#define vxor_vv_i32mf2(...) __riscv_vxor_vv_i32mf2(__VA_ARGS__) +#define vxor_vx_i32mf2(...) __riscv_vxor_vx_i32mf2(__VA_ARGS__) +#define vxor_vv_i32m1(...) __riscv_vxor_vv_i32m1(__VA_ARGS__) +#define vxor_vx_i32m1(...) __riscv_vxor_vx_i32m1(__VA_ARGS__) +#define vxor_vv_i32m2(...) __riscv_vxor_vv_i32m2(__VA_ARGS__) +#define vxor_vx_i32m2(...) __riscv_vxor_vx_i32m2(__VA_ARGS__) +#define vxor_vv_i32m4(...) __riscv_vxor_vv_i32m4(__VA_ARGS__) +#define vxor_vx_i32m4(...) __riscv_vxor_vx_i32m4(__VA_ARGS__) +#define vxor_vv_i32m8(...) __riscv_vxor_vv_i32m8(__VA_ARGS__) +#define vxor_vx_i32m8(...) __riscv_vxor_vx_i32m8(__VA_ARGS__) +#define vxor_vv_i64m1(...) __riscv_vxor_vv_i64m1(__VA_ARGS__) +#define vxor_vx_i64m1(...) __riscv_vxor_vx_i64m1(__VA_ARGS__) +#define vxor_vv_i64m2(...) __riscv_vxor_vv_i64m2(__VA_ARGS__) +#define vxor_vx_i64m2(...) __riscv_vxor_vx_i64m2(__VA_ARGS__) +#define vxor_vv_i64m4(...) __riscv_vxor_vv_i64m4(__VA_ARGS__) +#define vxor_vx_i64m4(...) __riscv_vxor_vx_i64m4(__VA_ARGS__) +#define vxor_vv_i64m8(...) __riscv_vxor_vv_i64m8(__VA_ARGS__) +#define vxor_vx_i64m8(...) __riscv_vxor_vx_i64m8(__VA_ARGS__) +#define vand_vv_u8mf8(...) __riscv_vand_vv_u8mf8(__VA_ARGS__) +#define vand_vx_u8mf8(...) __riscv_vand_vx_u8mf8(__VA_ARGS__) +#define vand_vv_u8mf4(...) __riscv_vand_vv_u8mf4(__VA_ARGS__) +#define vand_vx_u8mf4(...) __riscv_vand_vx_u8mf4(__VA_ARGS__) +#define vand_vv_u8mf2(...) __riscv_vand_vv_u8mf2(__VA_ARGS__) +#define vand_vx_u8mf2(...) __riscv_vand_vx_u8mf2(__VA_ARGS__) +#define vand_vv_u8m1(...) __riscv_vand_vv_u8m1(__VA_ARGS__) +#define vand_vx_u8m1(...) __riscv_vand_vx_u8m1(__VA_ARGS__) +#define vand_vv_u8m2(...) __riscv_vand_vv_u8m2(__VA_ARGS__) +#define vand_vx_u8m2(...) __riscv_vand_vx_u8m2(__VA_ARGS__) +#define vand_vv_u8m4(...) __riscv_vand_vv_u8m4(__VA_ARGS__) +#define vand_vx_u8m4(...) __riscv_vand_vx_u8m4(__VA_ARGS__) +#define vand_vv_u8m8(...) __riscv_vand_vv_u8m8(__VA_ARGS__) +#define vand_vx_u8m8(...) __riscv_vand_vx_u8m8(__VA_ARGS__) +#define vand_vv_u16mf4(...) __riscv_vand_vv_u16mf4(__VA_ARGS__) +#define vand_vx_u16mf4(...) __riscv_vand_vx_u16mf4(__VA_ARGS__) +#define vand_vv_u16mf2(...) __riscv_vand_vv_u16mf2(__VA_ARGS__) +#define vand_vx_u16mf2(...) __riscv_vand_vx_u16mf2(__VA_ARGS__) +#define vand_vv_u16m1(...) __riscv_vand_vv_u16m1(__VA_ARGS__) +#define vand_vx_u16m1(...) __riscv_vand_vx_u16m1(__VA_ARGS__) +#define vand_vv_u16m2(...) __riscv_vand_vv_u16m2(__VA_ARGS__) +#define vand_vx_u16m2(...) __riscv_vand_vx_u16m2(__VA_ARGS__) +#define vand_vv_u16m4(...) __riscv_vand_vv_u16m4(__VA_ARGS__) +#define vand_vx_u16m4(...) __riscv_vand_vx_u16m4(__VA_ARGS__) +#define vand_vv_u16m8(...) __riscv_vand_vv_u16m8(__VA_ARGS__) +#define vand_vx_u16m8(...) __riscv_vand_vx_u16m8(__VA_ARGS__) +#define vand_vv_u32mf2(...) __riscv_vand_vv_u32mf2(__VA_ARGS__) +#define vand_vx_u32mf2(...) __riscv_vand_vx_u32mf2(__VA_ARGS__) +#define vand_vv_u32m1(...) __riscv_vand_vv_u32m1(__VA_ARGS__) +#define vand_vx_u32m1(...) __riscv_vand_vx_u32m1(__VA_ARGS__) +#define vand_vv_u32m2(...) __riscv_vand_vv_u32m2(__VA_ARGS__) +#define vand_vx_u32m2(...) __riscv_vand_vx_u32m2(__VA_ARGS__) +#define vand_vv_u32m4(...) __riscv_vand_vv_u32m4(__VA_ARGS__) +#define vand_vx_u32m4(...) __riscv_vand_vx_u32m4(__VA_ARGS__) +#define vand_vv_u32m8(...) __riscv_vand_vv_u32m8(__VA_ARGS__) +#define vand_vx_u32m8(...) __riscv_vand_vx_u32m8(__VA_ARGS__) +#define vand_vv_u64m1(...) __riscv_vand_vv_u64m1(__VA_ARGS__) +#define vand_vx_u64m1(...) __riscv_vand_vx_u64m1(__VA_ARGS__) +#define vand_vv_u64m2(...) __riscv_vand_vv_u64m2(__VA_ARGS__) +#define vand_vx_u64m2(...) __riscv_vand_vx_u64m2(__VA_ARGS__) +#define vand_vv_u64m4(...) __riscv_vand_vv_u64m4(__VA_ARGS__) +#define vand_vx_u64m4(...) __riscv_vand_vx_u64m4(__VA_ARGS__) +#define vand_vv_u64m8(...) __riscv_vand_vv_u64m8(__VA_ARGS__) +#define vand_vx_u64m8(...) __riscv_vand_vx_u64m8(__VA_ARGS__) +#define vor_vv_u8mf8(...) __riscv_vor_vv_u8mf8(__VA_ARGS__) +#define vor_vx_u8mf8(...) __riscv_vor_vx_u8mf8(__VA_ARGS__) +#define vor_vv_u8mf4(...) __riscv_vor_vv_u8mf4(__VA_ARGS__) +#define vor_vx_u8mf4(...) __riscv_vor_vx_u8mf4(__VA_ARGS__) +#define vor_vv_u8mf2(...) __riscv_vor_vv_u8mf2(__VA_ARGS__) +#define vor_vx_u8mf2(...) __riscv_vor_vx_u8mf2(__VA_ARGS__) +#define vor_vv_u8m1(...) __riscv_vor_vv_u8m1(__VA_ARGS__) +#define vor_vx_u8m1(...) __riscv_vor_vx_u8m1(__VA_ARGS__) +#define vor_vv_u8m2(...) __riscv_vor_vv_u8m2(__VA_ARGS__) +#define vor_vx_u8m2(...) __riscv_vor_vx_u8m2(__VA_ARGS__) +#define vor_vv_u8m4(...) __riscv_vor_vv_u8m4(__VA_ARGS__) +#define vor_vx_u8m4(...) __riscv_vor_vx_u8m4(__VA_ARGS__) +#define vor_vv_u8m8(...) __riscv_vor_vv_u8m8(__VA_ARGS__) +#define vor_vx_u8m8(...) __riscv_vor_vx_u8m8(__VA_ARGS__) +#define vor_vv_u16mf4(...) __riscv_vor_vv_u16mf4(__VA_ARGS__) +#define vor_vx_u16mf4(...) __riscv_vor_vx_u16mf4(__VA_ARGS__) +#define vor_vv_u16mf2(...) __riscv_vor_vv_u16mf2(__VA_ARGS__) +#define vor_vx_u16mf2(...) __riscv_vor_vx_u16mf2(__VA_ARGS__) +#define vor_vv_u16m1(...) __riscv_vor_vv_u16m1(__VA_ARGS__) +#define vor_vx_u16m1(...) __riscv_vor_vx_u16m1(__VA_ARGS__) +#define vor_vv_u16m2(...) __riscv_vor_vv_u16m2(__VA_ARGS__) +#define vor_vx_u16m2(...) __riscv_vor_vx_u16m2(__VA_ARGS__) +#define vor_vv_u16m4(...) __riscv_vor_vv_u16m4(__VA_ARGS__) +#define vor_vx_u16m4(...) __riscv_vor_vx_u16m4(__VA_ARGS__) +#define vor_vv_u16m8(...) __riscv_vor_vv_u16m8(__VA_ARGS__) +#define vor_vx_u16m8(...) __riscv_vor_vx_u16m8(__VA_ARGS__) +#define vor_vv_u32mf2(...) __riscv_vor_vv_u32mf2(__VA_ARGS__) +#define vor_vx_u32mf2(...) __riscv_vor_vx_u32mf2(__VA_ARGS__) +#define vor_vv_u32m1(...) __riscv_vor_vv_u32m1(__VA_ARGS__) +#define vor_vx_u32m1(...) __riscv_vor_vx_u32m1(__VA_ARGS__) +#define vor_vv_u32m2(...) __riscv_vor_vv_u32m2(__VA_ARGS__) +#define vor_vx_u32m2(...) __riscv_vor_vx_u32m2(__VA_ARGS__) +#define vor_vv_u32m4(...) __riscv_vor_vv_u32m4(__VA_ARGS__) +#define vor_vx_u32m4(...) __riscv_vor_vx_u32m4(__VA_ARGS__) +#define vor_vv_u32m8(...) __riscv_vor_vv_u32m8(__VA_ARGS__) +#define vor_vx_u32m8(...) __riscv_vor_vx_u32m8(__VA_ARGS__) +#define vor_vv_u64m1(...) __riscv_vor_vv_u64m1(__VA_ARGS__) +#define vor_vx_u64m1(...) __riscv_vor_vx_u64m1(__VA_ARGS__) +#define vor_vv_u64m2(...) __riscv_vor_vv_u64m2(__VA_ARGS__) +#define vor_vx_u64m2(...) __riscv_vor_vx_u64m2(__VA_ARGS__) +#define vor_vv_u64m4(...) __riscv_vor_vv_u64m4(__VA_ARGS__) +#define vor_vx_u64m4(...) __riscv_vor_vx_u64m4(__VA_ARGS__) +#define vor_vv_u64m8(...) __riscv_vor_vv_u64m8(__VA_ARGS__) +#define vor_vx_u64m8(...) __riscv_vor_vx_u64m8(__VA_ARGS__) +#define vxor_vv_u8mf8(...) __riscv_vxor_vv_u8mf8(__VA_ARGS__) +#define vxor_vx_u8mf8(...) __riscv_vxor_vx_u8mf8(__VA_ARGS__) +#define vxor_vv_u8mf4(...) __riscv_vxor_vv_u8mf4(__VA_ARGS__) +#define vxor_vx_u8mf4(...) __riscv_vxor_vx_u8mf4(__VA_ARGS__) +#define vxor_vv_u8mf2(...) __riscv_vxor_vv_u8mf2(__VA_ARGS__) +#define vxor_vx_u8mf2(...) __riscv_vxor_vx_u8mf2(__VA_ARGS__) +#define vxor_vv_u8m1(...) __riscv_vxor_vv_u8m1(__VA_ARGS__) +#define vxor_vx_u8m1(...) __riscv_vxor_vx_u8m1(__VA_ARGS__) +#define vxor_vv_u8m2(...) __riscv_vxor_vv_u8m2(__VA_ARGS__) +#define vxor_vx_u8m2(...) __riscv_vxor_vx_u8m2(__VA_ARGS__) +#define vxor_vv_u8m4(...) __riscv_vxor_vv_u8m4(__VA_ARGS__) +#define vxor_vx_u8m4(...) __riscv_vxor_vx_u8m4(__VA_ARGS__) +#define vxor_vv_u8m8(...) __riscv_vxor_vv_u8m8(__VA_ARGS__) +#define vxor_vx_u8m8(...) __riscv_vxor_vx_u8m8(__VA_ARGS__) +#define vxor_vv_u16mf4(...) __riscv_vxor_vv_u16mf4(__VA_ARGS__) +#define vxor_vx_u16mf4(...) __riscv_vxor_vx_u16mf4(__VA_ARGS__) +#define vxor_vv_u16mf2(...) __riscv_vxor_vv_u16mf2(__VA_ARGS__) +#define vxor_vx_u16mf2(...) __riscv_vxor_vx_u16mf2(__VA_ARGS__) +#define vxor_vv_u16m1(...) __riscv_vxor_vv_u16m1(__VA_ARGS__) +#define vxor_vx_u16m1(...) __riscv_vxor_vx_u16m1(__VA_ARGS__) +#define vxor_vv_u16m2(...) __riscv_vxor_vv_u16m2(__VA_ARGS__) +#define vxor_vx_u16m2(...) __riscv_vxor_vx_u16m2(__VA_ARGS__) +#define vxor_vv_u16m4(...) __riscv_vxor_vv_u16m4(__VA_ARGS__) +#define vxor_vx_u16m4(...) __riscv_vxor_vx_u16m4(__VA_ARGS__) +#define vxor_vv_u16m8(...) __riscv_vxor_vv_u16m8(__VA_ARGS__) +#define vxor_vx_u16m8(...) __riscv_vxor_vx_u16m8(__VA_ARGS__) +#define vxor_vv_u32mf2(...) __riscv_vxor_vv_u32mf2(__VA_ARGS__) +#define vxor_vx_u32mf2(...) __riscv_vxor_vx_u32mf2(__VA_ARGS__) +#define vxor_vv_u32m1(...) __riscv_vxor_vv_u32m1(__VA_ARGS__) +#define vxor_vx_u32m1(...) __riscv_vxor_vx_u32m1(__VA_ARGS__) +#define vxor_vv_u32m2(...) __riscv_vxor_vv_u32m2(__VA_ARGS__) +#define vxor_vx_u32m2(...) __riscv_vxor_vx_u32m2(__VA_ARGS__) +#define vxor_vv_u32m4(...) __riscv_vxor_vv_u32m4(__VA_ARGS__) +#define vxor_vx_u32m4(...) __riscv_vxor_vx_u32m4(__VA_ARGS__) +#define vxor_vv_u32m8(...) __riscv_vxor_vv_u32m8(__VA_ARGS__) +#define vxor_vx_u32m8(...) __riscv_vxor_vx_u32m8(__VA_ARGS__) +#define vxor_vv_u64m1(...) __riscv_vxor_vv_u64m1(__VA_ARGS__) +#define vxor_vx_u64m1(...) __riscv_vxor_vx_u64m1(__VA_ARGS__) +#define vxor_vv_u64m2(...) __riscv_vxor_vv_u64m2(__VA_ARGS__) +#define vxor_vx_u64m2(...) __riscv_vxor_vx_u64m2(__VA_ARGS__) +#define vxor_vv_u64m4(...) __riscv_vxor_vv_u64m4(__VA_ARGS__) +#define vxor_vx_u64m4(...) __riscv_vxor_vx_u64m4(__VA_ARGS__) +#define vxor_vv_u64m8(...) __riscv_vxor_vv_u64m8(__VA_ARGS__) +#define vxor_vx_u64m8(...) __riscv_vxor_vx_u64m8(__VA_ARGS__) +// masked functions +#define vand_vv_i8mf8_m(...) __riscv_vand_vv_i8mf8_tumu(__VA_ARGS__) +#define vand_vx_i8mf8_m(...) __riscv_vand_vx_i8mf8_tumu(__VA_ARGS__) +#define vand_vv_i8mf4_m(...) __riscv_vand_vv_i8mf4_tumu(__VA_ARGS__) +#define vand_vx_i8mf4_m(...) __riscv_vand_vx_i8mf4_tumu(__VA_ARGS__) +#define vand_vv_i8mf2_m(...) __riscv_vand_vv_i8mf2_tumu(__VA_ARGS__) +#define vand_vx_i8mf2_m(...) __riscv_vand_vx_i8mf2_tumu(__VA_ARGS__) +#define vand_vv_i8m1_m(...) __riscv_vand_vv_i8m1_tumu(__VA_ARGS__) +#define vand_vx_i8m1_m(...) __riscv_vand_vx_i8m1_tumu(__VA_ARGS__) +#define vand_vv_i8m2_m(...) __riscv_vand_vv_i8m2_tumu(__VA_ARGS__) +#define vand_vx_i8m2_m(...) __riscv_vand_vx_i8m2_tumu(__VA_ARGS__) +#define vand_vv_i8m4_m(...) __riscv_vand_vv_i8m4_tumu(__VA_ARGS__) +#define vand_vx_i8m4_m(...) __riscv_vand_vx_i8m4_tumu(__VA_ARGS__) +#define vand_vv_i8m8_m(...) __riscv_vand_vv_i8m8_tumu(__VA_ARGS__) +#define vand_vx_i8m8_m(...) __riscv_vand_vx_i8m8_tumu(__VA_ARGS__) +#define vand_vv_i16mf4_m(...) __riscv_vand_vv_i16mf4_tumu(__VA_ARGS__) +#define vand_vx_i16mf4_m(...) __riscv_vand_vx_i16mf4_tumu(__VA_ARGS__) +#define vand_vv_i16mf2_m(...) __riscv_vand_vv_i16mf2_tumu(__VA_ARGS__) +#define vand_vx_i16mf2_m(...) __riscv_vand_vx_i16mf2_tumu(__VA_ARGS__) +#define vand_vv_i16m1_m(...) __riscv_vand_vv_i16m1_tumu(__VA_ARGS__) +#define vand_vx_i16m1_m(...) __riscv_vand_vx_i16m1_tumu(__VA_ARGS__) +#define vand_vv_i16m2_m(...) __riscv_vand_vv_i16m2_tumu(__VA_ARGS__) +#define vand_vx_i16m2_m(...) __riscv_vand_vx_i16m2_tumu(__VA_ARGS__) +#define vand_vv_i16m4_m(...) __riscv_vand_vv_i16m4_tumu(__VA_ARGS__) +#define vand_vx_i16m4_m(...) __riscv_vand_vx_i16m4_tumu(__VA_ARGS__) +#define vand_vv_i16m8_m(...) __riscv_vand_vv_i16m8_tumu(__VA_ARGS__) +#define vand_vx_i16m8_m(...) __riscv_vand_vx_i16m8_tumu(__VA_ARGS__) +#define vand_vv_i32mf2_m(...) __riscv_vand_vv_i32mf2_tumu(__VA_ARGS__) +#define vand_vx_i32mf2_m(...) __riscv_vand_vx_i32mf2_tumu(__VA_ARGS__) +#define vand_vv_i32m1_m(...) __riscv_vand_vv_i32m1_tumu(__VA_ARGS__) +#define vand_vx_i32m1_m(...) __riscv_vand_vx_i32m1_tumu(__VA_ARGS__) +#define vand_vv_i32m2_m(...) __riscv_vand_vv_i32m2_tumu(__VA_ARGS__) +#define vand_vx_i32m2_m(...) __riscv_vand_vx_i32m2_tumu(__VA_ARGS__) +#define vand_vv_i32m4_m(...) __riscv_vand_vv_i32m4_tumu(__VA_ARGS__) +#define vand_vx_i32m4_m(...) __riscv_vand_vx_i32m4_tumu(__VA_ARGS__) +#define vand_vv_i32m8_m(...) __riscv_vand_vv_i32m8_tumu(__VA_ARGS__) +#define vand_vx_i32m8_m(...) __riscv_vand_vx_i32m8_tumu(__VA_ARGS__) +#define vand_vv_i64m1_m(...) __riscv_vand_vv_i64m1_tumu(__VA_ARGS__) +#define vand_vx_i64m1_m(...) __riscv_vand_vx_i64m1_tumu(__VA_ARGS__) +#define vand_vv_i64m2_m(...) __riscv_vand_vv_i64m2_tumu(__VA_ARGS__) +#define vand_vx_i64m2_m(...) __riscv_vand_vx_i64m2_tumu(__VA_ARGS__) +#define vand_vv_i64m4_m(...) __riscv_vand_vv_i64m4_tumu(__VA_ARGS__) +#define vand_vx_i64m4_m(...) __riscv_vand_vx_i64m4_tumu(__VA_ARGS__) +#define vand_vv_i64m8_m(...) __riscv_vand_vv_i64m8_tumu(__VA_ARGS__) +#define vand_vx_i64m8_m(...) __riscv_vand_vx_i64m8_tumu(__VA_ARGS__) +#define vor_vv_i8mf8_m(...) __riscv_vor_vv_i8mf8_tumu(__VA_ARGS__) +#define vor_vx_i8mf8_m(...) __riscv_vor_vx_i8mf8_tumu(__VA_ARGS__) +#define vor_vv_i8mf4_m(...) __riscv_vor_vv_i8mf4_tumu(__VA_ARGS__) +#define vor_vx_i8mf4_m(...) __riscv_vor_vx_i8mf4_tumu(__VA_ARGS__) +#define vor_vv_i8mf2_m(...) __riscv_vor_vv_i8mf2_tumu(__VA_ARGS__) +#define vor_vx_i8mf2_m(...) __riscv_vor_vx_i8mf2_tumu(__VA_ARGS__) +#define vor_vv_i8m1_m(...) __riscv_vor_vv_i8m1_tumu(__VA_ARGS__) +#define vor_vx_i8m1_m(...) __riscv_vor_vx_i8m1_tumu(__VA_ARGS__) +#define vor_vv_i8m2_m(...) __riscv_vor_vv_i8m2_tumu(__VA_ARGS__) +#define vor_vx_i8m2_m(...) __riscv_vor_vx_i8m2_tumu(__VA_ARGS__) +#define vor_vv_i8m4_m(...) __riscv_vor_vv_i8m4_tumu(__VA_ARGS__) +#define vor_vx_i8m4_m(...) __riscv_vor_vx_i8m4_tumu(__VA_ARGS__) +#define vor_vv_i8m8_m(...) __riscv_vor_vv_i8m8_tumu(__VA_ARGS__) +#define vor_vx_i8m8_m(...) __riscv_vor_vx_i8m8_tumu(__VA_ARGS__) +#define vor_vv_i16mf4_m(...) __riscv_vor_vv_i16mf4_tumu(__VA_ARGS__) +#define vor_vx_i16mf4_m(...) __riscv_vor_vx_i16mf4_tumu(__VA_ARGS__) +#define vor_vv_i16mf2_m(...) __riscv_vor_vv_i16mf2_tumu(__VA_ARGS__) +#define vor_vx_i16mf2_m(...) __riscv_vor_vx_i16mf2_tumu(__VA_ARGS__) +#define vor_vv_i16m1_m(...) __riscv_vor_vv_i16m1_tumu(__VA_ARGS__) +#define vor_vx_i16m1_m(...) __riscv_vor_vx_i16m1_tumu(__VA_ARGS__) +#define vor_vv_i16m2_m(...) __riscv_vor_vv_i16m2_tumu(__VA_ARGS__) +#define vor_vx_i16m2_m(...) __riscv_vor_vx_i16m2_tumu(__VA_ARGS__) +#define vor_vv_i16m4_m(...) __riscv_vor_vv_i16m4_tumu(__VA_ARGS__) +#define vor_vx_i16m4_m(...) __riscv_vor_vx_i16m4_tumu(__VA_ARGS__) +#define vor_vv_i16m8_m(...) __riscv_vor_vv_i16m8_tumu(__VA_ARGS__) +#define vor_vx_i16m8_m(...) __riscv_vor_vx_i16m8_tumu(__VA_ARGS__) +#define vor_vv_i32mf2_m(...) __riscv_vor_vv_i32mf2_tumu(__VA_ARGS__) +#define vor_vx_i32mf2_m(...) __riscv_vor_vx_i32mf2_tumu(__VA_ARGS__) +#define vor_vv_i32m1_m(...) __riscv_vor_vv_i32m1_tumu(__VA_ARGS__) +#define vor_vx_i32m1_m(...) __riscv_vor_vx_i32m1_tumu(__VA_ARGS__) +#define vor_vv_i32m2_m(...) __riscv_vor_vv_i32m2_tumu(__VA_ARGS__) +#define vor_vx_i32m2_m(...) __riscv_vor_vx_i32m2_tumu(__VA_ARGS__) +#define vor_vv_i32m4_m(...) __riscv_vor_vv_i32m4_tumu(__VA_ARGS__) +#define vor_vx_i32m4_m(...) __riscv_vor_vx_i32m4_tumu(__VA_ARGS__) +#define vor_vv_i32m8_m(...) __riscv_vor_vv_i32m8_tumu(__VA_ARGS__) +#define vor_vx_i32m8_m(...) __riscv_vor_vx_i32m8_tumu(__VA_ARGS__) +#define vor_vv_i64m1_m(...) __riscv_vor_vv_i64m1_tumu(__VA_ARGS__) +#define vor_vx_i64m1_m(...) __riscv_vor_vx_i64m1_tumu(__VA_ARGS__) +#define vor_vv_i64m2_m(...) __riscv_vor_vv_i64m2_tumu(__VA_ARGS__) +#define vor_vx_i64m2_m(...) __riscv_vor_vx_i64m2_tumu(__VA_ARGS__) +#define vor_vv_i64m4_m(...) __riscv_vor_vv_i64m4_tumu(__VA_ARGS__) +#define vor_vx_i64m4_m(...) __riscv_vor_vx_i64m4_tumu(__VA_ARGS__) +#define vor_vv_i64m8_m(...) __riscv_vor_vv_i64m8_tumu(__VA_ARGS__) +#define vor_vx_i64m8_m(...) __riscv_vor_vx_i64m8_tumu(__VA_ARGS__) +#define vxor_vv_i8mf8_m(...) __riscv_vxor_vv_i8mf8_tumu(__VA_ARGS__) +#define vxor_vx_i8mf8_m(...) __riscv_vxor_vx_i8mf8_tumu(__VA_ARGS__) +#define vxor_vv_i8mf4_m(...) __riscv_vxor_vv_i8mf4_tumu(__VA_ARGS__) +#define vxor_vx_i8mf4_m(...) __riscv_vxor_vx_i8mf4_tumu(__VA_ARGS__) +#define vxor_vv_i8mf2_m(...) __riscv_vxor_vv_i8mf2_tumu(__VA_ARGS__) +#define vxor_vx_i8mf2_m(...) __riscv_vxor_vx_i8mf2_tumu(__VA_ARGS__) +#define vxor_vv_i8m1_m(...) __riscv_vxor_vv_i8m1_tumu(__VA_ARGS__) +#define vxor_vx_i8m1_m(...) __riscv_vxor_vx_i8m1_tumu(__VA_ARGS__) +#define vxor_vv_i8m2_m(...) __riscv_vxor_vv_i8m2_tumu(__VA_ARGS__) +#define vxor_vx_i8m2_m(...) __riscv_vxor_vx_i8m2_tumu(__VA_ARGS__) +#define vxor_vv_i8m4_m(...) __riscv_vxor_vv_i8m4_tumu(__VA_ARGS__) +#define vxor_vx_i8m4_m(...) __riscv_vxor_vx_i8m4_tumu(__VA_ARGS__) +#define vxor_vv_i8m8_m(...) __riscv_vxor_vv_i8m8_tumu(__VA_ARGS__) +#define vxor_vx_i8m8_m(...) __riscv_vxor_vx_i8m8_tumu(__VA_ARGS__) +#define vxor_vv_i16mf4_m(...) __riscv_vxor_vv_i16mf4_tumu(__VA_ARGS__) +#define vxor_vx_i16mf4_m(...) __riscv_vxor_vx_i16mf4_tumu(__VA_ARGS__) +#define vxor_vv_i16mf2_m(...) __riscv_vxor_vv_i16mf2_tumu(__VA_ARGS__) +#define vxor_vx_i16mf2_m(...) __riscv_vxor_vx_i16mf2_tumu(__VA_ARGS__) +#define vxor_vv_i16m1_m(...) __riscv_vxor_vv_i16m1_tumu(__VA_ARGS__) +#define vxor_vx_i16m1_m(...) __riscv_vxor_vx_i16m1_tumu(__VA_ARGS__) +#define vxor_vv_i16m2_m(...) __riscv_vxor_vv_i16m2_tumu(__VA_ARGS__) +#define vxor_vx_i16m2_m(...) __riscv_vxor_vx_i16m2_tumu(__VA_ARGS__) +#define vxor_vv_i16m4_m(...) __riscv_vxor_vv_i16m4_tumu(__VA_ARGS__) +#define vxor_vx_i16m4_m(...) __riscv_vxor_vx_i16m4_tumu(__VA_ARGS__) +#define vxor_vv_i16m8_m(...) __riscv_vxor_vv_i16m8_tumu(__VA_ARGS__) +#define vxor_vx_i16m8_m(...) __riscv_vxor_vx_i16m8_tumu(__VA_ARGS__) +#define vxor_vv_i32mf2_m(...) __riscv_vxor_vv_i32mf2_tumu(__VA_ARGS__) +#define vxor_vx_i32mf2_m(...) __riscv_vxor_vx_i32mf2_tumu(__VA_ARGS__) +#define vxor_vv_i32m1_m(...) __riscv_vxor_vv_i32m1_tumu(__VA_ARGS__) +#define vxor_vx_i32m1_m(...) __riscv_vxor_vx_i32m1_tumu(__VA_ARGS__) +#define vxor_vv_i32m2_m(...) __riscv_vxor_vv_i32m2_tumu(__VA_ARGS__) +#define vxor_vx_i32m2_m(...) __riscv_vxor_vx_i32m2_tumu(__VA_ARGS__) +#define vxor_vv_i32m4_m(...) __riscv_vxor_vv_i32m4_tumu(__VA_ARGS__) +#define vxor_vx_i32m4_m(...) __riscv_vxor_vx_i32m4_tumu(__VA_ARGS__) +#define vxor_vv_i32m8_m(...) __riscv_vxor_vv_i32m8_tumu(__VA_ARGS__) +#define vxor_vx_i32m8_m(...) __riscv_vxor_vx_i32m8_tumu(__VA_ARGS__) +#define vxor_vv_i64m1_m(...) __riscv_vxor_vv_i64m1_tumu(__VA_ARGS__) +#define vxor_vx_i64m1_m(...) __riscv_vxor_vx_i64m1_tumu(__VA_ARGS__) +#define vxor_vv_i64m2_m(...) __riscv_vxor_vv_i64m2_tumu(__VA_ARGS__) +#define vxor_vx_i64m2_m(...) __riscv_vxor_vx_i64m2_tumu(__VA_ARGS__) +#define vxor_vv_i64m4_m(...) __riscv_vxor_vv_i64m4_tumu(__VA_ARGS__) +#define vxor_vx_i64m4_m(...) __riscv_vxor_vx_i64m4_tumu(__VA_ARGS__) +#define vxor_vv_i64m8_m(...) __riscv_vxor_vv_i64m8_tumu(__VA_ARGS__) +#define vxor_vx_i64m8_m(...) __riscv_vxor_vx_i64m8_tumu(__VA_ARGS__) +#define vand_vv_u8mf8_m(...) __riscv_vand_vv_u8mf8_tumu(__VA_ARGS__) +#define vand_vx_u8mf8_m(...) __riscv_vand_vx_u8mf8_tumu(__VA_ARGS__) +#define vand_vv_u8mf4_m(...) __riscv_vand_vv_u8mf4_tumu(__VA_ARGS__) +#define vand_vx_u8mf4_m(...) __riscv_vand_vx_u8mf4_tumu(__VA_ARGS__) +#define vand_vv_u8mf2_m(...) __riscv_vand_vv_u8mf2_tumu(__VA_ARGS__) +#define vand_vx_u8mf2_m(...) __riscv_vand_vx_u8mf2_tumu(__VA_ARGS__) +#define vand_vv_u8m1_m(...) __riscv_vand_vv_u8m1_tumu(__VA_ARGS__) +#define vand_vx_u8m1_m(...) __riscv_vand_vx_u8m1_tumu(__VA_ARGS__) +#define vand_vv_u8m2_m(...) __riscv_vand_vv_u8m2_tumu(__VA_ARGS__) +#define vand_vx_u8m2_m(...) __riscv_vand_vx_u8m2_tumu(__VA_ARGS__) +#define vand_vv_u8m4_m(...) __riscv_vand_vv_u8m4_tumu(__VA_ARGS__) +#define vand_vx_u8m4_m(...) __riscv_vand_vx_u8m4_tumu(__VA_ARGS__) +#define vand_vv_u8m8_m(...) __riscv_vand_vv_u8m8_tumu(__VA_ARGS__) +#define vand_vx_u8m8_m(...) __riscv_vand_vx_u8m8_tumu(__VA_ARGS__) +#define vand_vv_u16mf4_m(...) __riscv_vand_vv_u16mf4_tumu(__VA_ARGS__) +#define vand_vx_u16mf4_m(...) __riscv_vand_vx_u16mf4_tumu(__VA_ARGS__) +#define vand_vv_u16mf2_m(...) __riscv_vand_vv_u16mf2_tumu(__VA_ARGS__) +#define vand_vx_u16mf2_m(...) __riscv_vand_vx_u16mf2_tumu(__VA_ARGS__) +#define vand_vv_u16m1_m(...) __riscv_vand_vv_u16m1_tumu(__VA_ARGS__) +#define vand_vx_u16m1_m(...) __riscv_vand_vx_u16m1_tumu(__VA_ARGS__) +#define vand_vv_u16m2_m(...) __riscv_vand_vv_u16m2_tumu(__VA_ARGS__) +#define vand_vx_u16m2_m(...) __riscv_vand_vx_u16m2_tumu(__VA_ARGS__) +#define vand_vv_u16m4_m(...) __riscv_vand_vv_u16m4_tumu(__VA_ARGS__) +#define vand_vx_u16m4_m(...) __riscv_vand_vx_u16m4_tumu(__VA_ARGS__) +#define vand_vv_u16m8_m(...) __riscv_vand_vv_u16m8_tumu(__VA_ARGS__) +#define vand_vx_u16m8_m(...) __riscv_vand_vx_u16m8_tumu(__VA_ARGS__) +#define vand_vv_u32mf2_m(...) __riscv_vand_vv_u32mf2_tumu(__VA_ARGS__) +#define vand_vx_u32mf2_m(...) __riscv_vand_vx_u32mf2_tumu(__VA_ARGS__) +#define vand_vv_u32m1_m(...) __riscv_vand_vv_u32m1_tumu(__VA_ARGS__) +#define vand_vx_u32m1_m(...) __riscv_vand_vx_u32m1_tumu(__VA_ARGS__) +#define vand_vv_u32m2_m(...) __riscv_vand_vv_u32m2_tumu(__VA_ARGS__) +#define vand_vx_u32m2_m(...) __riscv_vand_vx_u32m2_tumu(__VA_ARGS__) +#define vand_vv_u32m4_m(...) __riscv_vand_vv_u32m4_tumu(__VA_ARGS__) +#define vand_vx_u32m4_m(...) __riscv_vand_vx_u32m4_tumu(__VA_ARGS__) +#define vand_vv_u32m8_m(...) __riscv_vand_vv_u32m8_tumu(__VA_ARGS__) +#define vand_vx_u32m8_m(...) __riscv_vand_vx_u32m8_tumu(__VA_ARGS__) +#define vand_vv_u64m1_m(...) __riscv_vand_vv_u64m1_tumu(__VA_ARGS__) +#define vand_vx_u64m1_m(...) __riscv_vand_vx_u64m1_tumu(__VA_ARGS__) +#define vand_vv_u64m2_m(...) __riscv_vand_vv_u64m2_tumu(__VA_ARGS__) +#define vand_vx_u64m2_m(...) __riscv_vand_vx_u64m2_tumu(__VA_ARGS__) +#define vand_vv_u64m4_m(...) __riscv_vand_vv_u64m4_tumu(__VA_ARGS__) +#define vand_vx_u64m4_m(...) __riscv_vand_vx_u64m4_tumu(__VA_ARGS__) +#define vand_vv_u64m8_m(...) __riscv_vand_vv_u64m8_tumu(__VA_ARGS__) +#define vand_vx_u64m8_m(...) __riscv_vand_vx_u64m8_tumu(__VA_ARGS__) +#define vor_vv_u8mf8_m(...) __riscv_vor_vv_u8mf8_tumu(__VA_ARGS__) +#define vor_vx_u8mf8_m(...) __riscv_vor_vx_u8mf8_tumu(__VA_ARGS__) +#define vor_vv_u8mf4_m(...) __riscv_vor_vv_u8mf4_tumu(__VA_ARGS__) +#define vor_vx_u8mf4_m(...) __riscv_vor_vx_u8mf4_tumu(__VA_ARGS__) +#define vor_vv_u8mf2_m(...) __riscv_vor_vv_u8mf2_tumu(__VA_ARGS__) +#define vor_vx_u8mf2_m(...) __riscv_vor_vx_u8mf2_tumu(__VA_ARGS__) +#define vor_vv_u8m1_m(...) __riscv_vor_vv_u8m1_tumu(__VA_ARGS__) +#define vor_vx_u8m1_m(...) __riscv_vor_vx_u8m1_tumu(__VA_ARGS__) +#define vor_vv_u8m2_m(...) __riscv_vor_vv_u8m2_tumu(__VA_ARGS__) +#define vor_vx_u8m2_m(...) __riscv_vor_vx_u8m2_tumu(__VA_ARGS__) +#define vor_vv_u8m4_m(...) __riscv_vor_vv_u8m4_tumu(__VA_ARGS__) +#define vor_vx_u8m4_m(...) __riscv_vor_vx_u8m4_tumu(__VA_ARGS__) +#define vor_vv_u8m8_m(...) __riscv_vor_vv_u8m8_tumu(__VA_ARGS__) +#define vor_vx_u8m8_m(...) __riscv_vor_vx_u8m8_tumu(__VA_ARGS__) +#define vor_vv_u16mf4_m(...) __riscv_vor_vv_u16mf4_tumu(__VA_ARGS__) +#define vor_vx_u16mf4_m(...) __riscv_vor_vx_u16mf4_tumu(__VA_ARGS__) +#define vor_vv_u16mf2_m(...) __riscv_vor_vv_u16mf2_tumu(__VA_ARGS__) +#define vor_vx_u16mf2_m(...) __riscv_vor_vx_u16mf2_tumu(__VA_ARGS__) +#define vor_vv_u16m1_m(...) __riscv_vor_vv_u16m1_tumu(__VA_ARGS__) +#define vor_vx_u16m1_m(...) __riscv_vor_vx_u16m1_tumu(__VA_ARGS__) +#define vor_vv_u16m2_m(...) __riscv_vor_vv_u16m2_tumu(__VA_ARGS__) +#define vor_vx_u16m2_m(...) __riscv_vor_vx_u16m2_tumu(__VA_ARGS__) +#define vor_vv_u16m4_m(...) __riscv_vor_vv_u16m4_tumu(__VA_ARGS__) +#define vor_vx_u16m4_m(...) __riscv_vor_vx_u16m4_tumu(__VA_ARGS__) +#define vor_vv_u16m8_m(...) __riscv_vor_vv_u16m8_tumu(__VA_ARGS__) +#define vor_vx_u16m8_m(...) __riscv_vor_vx_u16m8_tumu(__VA_ARGS__) +#define vor_vv_u32mf2_m(...) __riscv_vor_vv_u32mf2_tumu(__VA_ARGS__) +#define vor_vx_u32mf2_m(...) __riscv_vor_vx_u32mf2_tumu(__VA_ARGS__) +#define vor_vv_u32m1_m(...) __riscv_vor_vv_u32m1_tumu(__VA_ARGS__) +#define vor_vx_u32m1_m(...) __riscv_vor_vx_u32m1_tumu(__VA_ARGS__) +#define vor_vv_u32m2_m(...) __riscv_vor_vv_u32m2_tumu(__VA_ARGS__) +#define vor_vx_u32m2_m(...) __riscv_vor_vx_u32m2_tumu(__VA_ARGS__) +#define vor_vv_u32m4_m(...) __riscv_vor_vv_u32m4_tumu(__VA_ARGS__) +#define vor_vx_u32m4_m(...) __riscv_vor_vx_u32m4_tumu(__VA_ARGS__) +#define vor_vv_u32m8_m(...) __riscv_vor_vv_u32m8_tumu(__VA_ARGS__) +#define vor_vx_u32m8_m(...) __riscv_vor_vx_u32m8_tumu(__VA_ARGS__) +#define vor_vv_u64m1_m(...) __riscv_vor_vv_u64m1_tumu(__VA_ARGS__) +#define vor_vx_u64m1_m(...) __riscv_vor_vx_u64m1_tumu(__VA_ARGS__) +#define vor_vv_u64m2_m(...) __riscv_vor_vv_u64m2_tumu(__VA_ARGS__) +#define vor_vx_u64m2_m(...) __riscv_vor_vx_u64m2_tumu(__VA_ARGS__) +#define vor_vv_u64m4_m(...) __riscv_vor_vv_u64m4_tumu(__VA_ARGS__) +#define vor_vx_u64m4_m(...) __riscv_vor_vx_u64m4_tumu(__VA_ARGS__) +#define vor_vv_u64m8_m(...) __riscv_vor_vv_u64m8_tumu(__VA_ARGS__) +#define vor_vx_u64m8_m(...) __riscv_vor_vx_u64m8_tumu(__VA_ARGS__) +#define vxor_vv_u8mf8_m(...) __riscv_vxor_vv_u8mf8_tumu(__VA_ARGS__) +#define vxor_vx_u8mf8_m(...) __riscv_vxor_vx_u8mf8_tumu(__VA_ARGS__) +#define vxor_vv_u8mf4_m(...) __riscv_vxor_vv_u8mf4_tumu(__VA_ARGS__) +#define vxor_vx_u8mf4_m(...) __riscv_vxor_vx_u8mf4_tumu(__VA_ARGS__) +#define vxor_vv_u8mf2_m(...) __riscv_vxor_vv_u8mf2_tumu(__VA_ARGS__) +#define vxor_vx_u8mf2_m(...) __riscv_vxor_vx_u8mf2_tumu(__VA_ARGS__) +#define vxor_vv_u8m1_m(...) __riscv_vxor_vv_u8m1_tumu(__VA_ARGS__) +#define vxor_vx_u8m1_m(...) __riscv_vxor_vx_u8m1_tumu(__VA_ARGS__) +#define vxor_vv_u8m2_m(...) __riscv_vxor_vv_u8m2_tumu(__VA_ARGS__) +#define vxor_vx_u8m2_m(...) __riscv_vxor_vx_u8m2_tumu(__VA_ARGS__) +#define vxor_vv_u8m4_m(...) __riscv_vxor_vv_u8m4_tumu(__VA_ARGS__) +#define vxor_vx_u8m4_m(...) __riscv_vxor_vx_u8m4_tumu(__VA_ARGS__) +#define vxor_vv_u8m8_m(...) __riscv_vxor_vv_u8m8_tumu(__VA_ARGS__) +#define vxor_vx_u8m8_m(...) __riscv_vxor_vx_u8m8_tumu(__VA_ARGS__) +#define vxor_vv_u16mf4_m(...) __riscv_vxor_vv_u16mf4_tumu(__VA_ARGS__) +#define vxor_vx_u16mf4_m(...) __riscv_vxor_vx_u16mf4_tumu(__VA_ARGS__) +#define vxor_vv_u16mf2_m(...) __riscv_vxor_vv_u16mf2_tumu(__VA_ARGS__) +#define vxor_vx_u16mf2_m(...) __riscv_vxor_vx_u16mf2_tumu(__VA_ARGS__) +#define vxor_vv_u16m1_m(...) __riscv_vxor_vv_u16m1_tumu(__VA_ARGS__) +#define vxor_vx_u16m1_m(...) __riscv_vxor_vx_u16m1_tumu(__VA_ARGS__) +#define vxor_vv_u16m2_m(...) __riscv_vxor_vv_u16m2_tumu(__VA_ARGS__) +#define vxor_vx_u16m2_m(...) __riscv_vxor_vx_u16m2_tumu(__VA_ARGS__) +#define vxor_vv_u16m4_m(...) __riscv_vxor_vv_u16m4_tumu(__VA_ARGS__) +#define vxor_vx_u16m4_m(...) __riscv_vxor_vx_u16m4_tumu(__VA_ARGS__) +#define vxor_vv_u16m8_m(...) __riscv_vxor_vv_u16m8_tumu(__VA_ARGS__) +#define vxor_vx_u16m8_m(...) __riscv_vxor_vx_u16m8_tumu(__VA_ARGS__) +#define vxor_vv_u32mf2_m(...) __riscv_vxor_vv_u32mf2_tumu(__VA_ARGS__) +#define vxor_vx_u32mf2_m(...) __riscv_vxor_vx_u32mf2_tumu(__VA_ARGS__) +#define vxor_vv_u32m1_m(...) __riscv_vxor_vv_u32m1_tumu(__VA_ARGS__) +#define vxor_vx_u32m1_m(...) __riscv_vxor_vx_u32m1_tumu(__VA_ARGS__) +#define vxor_vv_u32m2_m(...) __riscv_vxor_vv_u32m2_tumu(__VA_ARGS__) +#define vxor_vx_u32m2_m(...) __riscv_vxor_vx_u32m2_tumu(__VA_ARGS__) +#define vxor_vv_u32m4_m(...) __riscv_vxor_vv_u32m4_tumu(__VA_ARGS__) +#define vxor_vx_u32m4_m(...) __riscv_vxor_vx_u32m4_tumu(__VA_ARGS__) +#define vxor_vv_u32m8_m(...) __riscv_vxor_vv_u32m8_tumu(__VA_ARGS__) +#define vxor_vx_u32m8_m(...) __riscv_vxor_vx_u32m8_tumu(__VA_ARGS__) +#define vxor_vv_u64m1_m(...) __riscv_vxor_vv_u64m1_tumu(__VA_ARGS__) +#define vxor_vx_u64m1_m(...) __riscv_vxor_vx_u64m1_tumu(__VA_ARGS__) +#define vxor_vv_u64m2_m(...) __riscv_vxor_vv_u64m2_tumu(__VA_ARGS__) +#define vxor_vx_u64m2_m(...) __riscv_vxor_vx_u64m2_tumu(__VA_ARGS__) +#define vxor_vv_u64m4_m(...) __riscv_vxor_vv_u64m4_tumu(__VA_ARGS__) +#define vxor_vx_u64m4_m(...) __riscv_vxor_vx_u64m4_tumu(__VA_ARGS__) +#define vxor_vv_u64m8_m(...) __riscv_vxor_vv_u64m8_tumu(__VA_ARGS__) +#define vxor_vx_u64m8_m(...) __riscv_vxor_vx_u64m8_tumu(__VA_ARGS__) +#define vnot_v_i8mf8(...) __riscv_vnot_v_i8mf8(__VA_ARGS__) +#define vnot_v_i8mf4(...) __riscv_vnot_v_i8mf4(__VA_ARGS__) +#define vnot_v_i8mf2(...) __riscv_vnot_v_i8mf2(__VA_ARGS__) +#define vnot_v_i8m1(...) __riscv_vnot_v_i8m1(__VA_ARGS__) +#define vnot_v_i8m2(...) __riscv_vnot_v_i8m2(__VA_ARGS__) +#define vnot_v_i8m4(...) __riscv_vnot_v_i8m4(__VA_ARGS__) +#define vnot_v_i8m8(...) __riscv_vnot_v_i8m8(__VA_ARGS__) +#define vnot_v_i16mf4(...) __riscv_vnot_v_i16mf4(__VA_ARGS__) +#define vnot_v_i16mf2(...) __riscv_vnot_v_i16mf2(__VA_ARGS__) +#define vnot_v_i16m1(...) __riscv_vnot_v_i16m1(__VA_ARGS__) +#define vnot_v_i16m2(...) __riscv_vnot_v_i16m2(__VA_ARGS__) +#define vnot_v_i16m4(...) __riscv_vnot_v_i16m4(__VA_ARGS__) +#define vnot_v_i16m8(...) __riscv_vnot_v_i16m8(__VA_ARGS__) +#define vnot_v_i32mf2(...) __riscv_vnot_v_i32mf2(__VA_ARGS__) +#define vnot_v_i32m1(...) __riscv_vnot_v_i32m1(__VA_ARGS__) +#define vnot_v_i32m2(...) __riscv_vnot_v_i32m2(__VA_ARGS__) +#define vnot_v_i32m4(...) __riscv_vnot_v_i32m4(__VA_ARGS__) +#define vnot_v_i32m8(...) __riscv_vnot_v_i32m8(__VA_ARGS__) +#define vnot_v_i64m1(...) __riscv_vnot_v_i64m1(__VA_ARGS__) +#define vnot_v_i64m2(...) __riscv_vnot_v_i64m2(__VA_ARGS__) +#define vnot_v_i64m4(...) __riscv_vnot_v_i64m4(__VA_ARGS__) +#define vnot_v_i64m8(...) __riscv_vnot_v_i64m8(__VA_ARGS__) +#define vnot_v_u8mf8(...) __riscv_vnot_v_u8mf8(__VA_ARGS__) +#define vnot_v_u8mf4(...) __riscv_vnot_v_u8mf4(__VA_ARGS__) +#define vnot_v_u8mf2(...) __riscv_vnot_v_u8mf2(__VA_ARGS__) +#define vnot_v_u8m1(...) __riscv_vnot_v_u8m1(__VA_ARGS__) +#define vnot_v_u8m2(...) __riscv_vnot_v_u8m2(__VA_ARGS__) +#define vnot_v_u8m4(...) __riscv_vnot_v_u8m4(__VA_ARGS__) +#define vnot_v_u8m8(...) __riscv_vnot_v_u8m8(__VA_ARGS__) +#define vnot_v_u16mf4(...) __riscv_vnot_v_u16mf4(__VA_ARGS__) +#define vnot_v_u16mf2(...) __riscv_vnot_v_u16mf2(__VA_ARGS__) +#define vnot_v_u16m1(...) __riscv_vnot_v_u16m1(__VA_ARGS__) +#define vnot_v_u16m2(...) __riscv_vnot_v_u16m2(__VA_ARGS__) +#define vnot_v_u16m4(...) __riscv_vnot_v_u16m4(__VA_ARGS__) +#define vnot_v_u16m8(...) __riscv_vnot_v_u16m8(__VA_ARGS__) +#define vnot_v_u32mf2(...) __riscv_vnot_v_u32mf2(__VA_ARGS__) +#define vnot_v_u32m1(...) __riscv_vnot_v_u32m1(__VA_ARGS__) +#define vnot_v_u32m2(...) __riscv_vnot_v_u32m2(__VA_ARGS__) +#define vnot_v_u32m4(...) __riscv_vnot_v_u32m4(__VA_ARGS__) +#define vnot_v_u32m8(...) __riscv_vnot_v_u32m8(__VA_ARGS__) +#define vnot_v_u64m1(...) __riscv_vnot_v_u64m1(__VA_ARGS__) +#define vnot_v_u64m2(...) __riscv_vnot_v_u64m2(__VA_ARGS__) +#define vnot_v_u64m4(...) __riscv_vnot_v_u64m4(__VA_ARGS__) +#define vnot_v_u64m8(...) __riscv_vnot_v_u64m8(__VA_ARGS__) +// masked functions +#define vnot_v_i8mf8_m(...) __riscv_vnot_v_i8mf8_tumu(__VA_ARGS__) +#define vnot_v_i8mf4_m(...) __riscv_vnot_v_i8mf4_tumu(__VA_ARGS__) +#define vnot_v_i8mf2_m(...) __riscv_vnot_v_i8mf2_tumu(__VA_ARGS__) +#define vnot_v_i8m1_m(...) __riscv_vnot_v_i8m1_tumu(__VA_ARGS__) +#define vnot_v_i8m2_m(...) __riscv_vnot_v_i8m2_tumu(__VA_ARGS__) +#define vnot_v_i8m4_m(...) __riscv_vnot_v_i8m4_tumu(__VA_ARGS__) +#define vnot_v_i8m8_m(...) __riscv_vnot_v_i8m8_tumu(__VA_ARGS__) +#define vnot_v_i16mf4_m(...) __riscv_vnot_v_i16mf4_tumu(__VA_ARGS__) +#define vnot_v_i16mf2_m(...) __riscv_vnot_v_i16mf2_tumu(__VA_ARGS__) +#define vnot_v_i16m1_m(...) __riscv_vnot_v_i16m1_tumu(__VA_ARGS__) +#define vnot_v_i16m2_m(...) __riscv_vnot_v_i16m2_tumu(__VA_ARGS__) +#define vnot_v_i16m4_m(...) __riscv_vnot_v_i16m4_tumu(__VA_ARGS__) +#define vnot_v_i16m8_m(...) __riscv_vnot_v_i16m8_tumu(__VA_ARGS__) +#define vnot_v_i32mf2_m(...) __riscv_vnot_v_i32mf2_tumu(__VA_ARGS__) +#define vnot_v_i32m1_m(...) __riscv_vnot_v_i32m1_tumu(__VA_ARGS__) +#define vnot_v_i32m2_m(...) __riscv_vnot_v_i32m2_tumu(__VA_ARGS__) +#define vnot_v_i32m4_m(...) __riscv_vnot_v_i32m4_tumu(__VA_ARGS__) +#define vnot_v_i32m8_m(...) __riscv_vnot_v_i32m8_tumu(__VA_ARGS__) +#define vnot_v_i64m1_m(...) __riscv_vnot_v_i64m1_tumu(__VA_ARGS__) +#define vnot_v_i64m2_m(...) __riscv_vnot_v_i64m2_tumu(__VA_ARGS__) +#define vnot_v_i64m4_m(...) __riscv_vnot_v_i64m4_tumu(__VA_ARGS__) +#define vnot_v_i64m8_m(...) __riscv_vnot_v_i64m8_tumu(__VA_ARGS__) +#define vnot_v_u8mf8_m(...) __riscv_vnot_v_u8mf8_tumu(__VA_ARGS__) +#define vnot_v_u8mf4_m(...) __riscv_vnot_v_u8mf4_tumu(__VA_ARGS__) +#define vnot_v_u8mf2_m(...) __riscv_vnot_v_u8mf2_tumu(__VA_ARGS__) +#define vnot_v_u8m1_m(...) __riscv_vnot_v_u8m1_tumu(__VA_ARGS__) +#define vnot_v_u8m2_m(...) __riscv_vnot_v_u8m2_tumu(__VA_ARGS__) +#define vnot_v_u8m4_m(...) __riscv_vnot_v_u8m4_tumu(__VA_ARGS__) +#define vnot_v_u8m8_m(...) __riscv_vnot_v_u8m8_tumu(__VA_ARGS__) +#define vnot_v_u16mf4_m(...) __riscv_vnot_v_u16mf4_tumu(__VA_ARGS__) +#define vnot_v_u16mf2_m(...) __riscv_vnot_v_u16mf2_tumu(__VA_ARGS__) +#define vnot_v_u16m1_m(...) __riscv_vnot_v_u16m1_tumu(__VA_ARGS__) +#define vnot_v_u16m2_m(...) __riscv_vnot_v_u16m2_tumu(__VA_ARGS__) +#define vnot_v_u16m4_m(...) __riscv_vnot_v_u16m4_tumu(__VA_ARGS__) +#define vnot_v_u16m8_m(...) __riscv_vnot_v_u16m8_tumu(__VA_ARGS__) +#define vnot_v_u32mf2_m(...) __riscv_vnot_v_u32mf2_tumu(__VA_ARGS__) +#define vnot_v_u32m1_m(...) __riscv_vnot_v_u32m1_tumu(__VA_ARGS__) +#define vnot_v_u32m2_m(...) __riscv_vnot_v_u32m2_tumu(__VA_ARGS__) +#define vnot_v_u32m4_m(...) __riscv_vnot_v_u32m4_tumu(__VA_ARGS__) +#define vnot_v_u32m8_m(...) __riscv_vnot_v_u32m8_tumu(__VA_ARGS__) +#define vnot_v_u64m1_m(...) __riscv_vnot_v_u64m1_tumu(__VA_ARGS__) +#define vnot_v_u64m2_m(...) __riscv_vnot_v_u64m2_tumu(__VA_ARGS__) +#define vnot_v_u64m4_m(...) __riscv_vnot_v_u64m4_tumu(__VA_ARGS__) +#define vnot_v_u64m8_m(...) __riscv_vnot_v_u64m8_tumu(__VA_ARGS__) +#define vsll_vv_i8mf8(...) __riscv_vsll_vv_i8mf8(__VA_ARGS__) +#define vsll_vx_i8mf8(...) __riscv_vsll_vx_i8mf8(__VA_ARGS__) +#define vsll_vv_i8mf4(...) __riscv_vsll_vv_i8mf4(__VA_ARGS__) +#define vsll_vx_i8mf4(...) __riscv_vsll_vx_i8mf4(__VA_ARGS__) +#define vsll_vv_i8mf2(...) __riscv_vsll_vv_i8mf2(__VA_ARGS__) +#define vsll_vx_i8mf2(...) __riscv_vsll_vx_i8mf2(__VA_ARGS__) +#define vsll_vv_i8m1(...) __riscv_vsll_vv_i8m1(__VA_ARGS__) +#define vsll_vx_i8m1(...) __riscv_vsll_vx_i8m1(__VA_ARGS__) +#define vsll_vv_i8m2(...) __riscv_vsll_vv_i8m2(__VA_ARGS__) +#define vsll_vx_i8m2(...) __riscv_vsll_vx_i8m2(__VA_ARGS__) +#define vsll_vv_i8m4(...) __riscv_vsll_vv_i8m4(__VA_ARGS__) +#define vsll_vx_i8m4(...) __riscv_vsll_vx_i8m4(__VA_ARGS__) +#define vsll_vv_i8m8(...) __riscv_vsll_vv_i8m8(__VA_ARGS__) +#define vsll_vx_i8m8(...) __riscv_vsll_vx_i8m8(__VA_ARGS__) +#define vsll_vv_i16mf4(...) __riscv_vsll_vv_i16mf4(__VA_ARGS__) +#define vsll_vx_i16mf4(...) __riscv_vsll_vx_i16mf4(__VA_ARGS__) +#define vsll_vv_i16mf2(...) __riscv_vsll_vv_i16mf2(__VA_ARGS__) +#define vsll_vx_i16mf2(...) __riscv_vsll_vx_i16mf2(__VA_ARGS__) +#define vsll_vv_i16m1(...) __riscv_vsll_vv_i16m1(__VA_ARGS__) +#define vsll_vx_i16m1(...) __riscv_vsll_vx_i16m1(__VA_ARGS__) +#define vsll_vv_i16m2(...) __riscv_vsll_vv_i16m2(__VA_ARGS__) +#define vsll_vx_i16m2(...) __riscv_vsll_vx_i16m2(__VA_ARGS__) +#define vsll_vv_i16m4(...) __riscv_vsll_vv_i16m4(__VA_ARGS__) +#define vsll_vx_i16m4(...) __riscv_vsll_vx_i16m4(__VA_ARGS__) +#define vsll_vv_i16m8(...) __riscv_vsll_vv_i16m8(__VA_ARGS__) +#define vsll_vx_i16m8(...) __riscv_vsll_vx_i16m8(__VA_ARGS__) +#define vsll_vv_i32mf2(...) __riscv_vsll_vv_i32mf2(__VA_ARGS__) +#define vsll_vx_i32mf2(...) __riscv_vsll_vx_i32mf2(__VA_ARGS__) +#define vsll_vv_i32m1(...) __riscv_vsll_vv_i32m1(__VA_ARGS__) +#define vsll_vx_i32m1(...) __riscv_vsll_vx_i32m1(__VA_ARGS__) +#define vsll_vv_i32m2(...) __riscv_vsll_vv_i32m2(__VA_ARGS__) +#define vsll_vx_i32m2(...) __riscv_vsll_vx_i32m2(__VA_ARGS__) +#define vsll_vv_i32m4(...) __riscv_vsll_vv_i32m4(__VA_ARGS__) +#define vsll_vx_i32m4(...) __riscv_vsll_vx_i32m4(__VA_ARGS__) +#define vsll_vv_i32m8(...) __riscv_vsll_vv_i32m8(__VA_ARGS__) +#define vsll_vx_i32m8(...) __riscv_vsll_vx_i32m8(__VA_ARGS__) +#define vsll_vv_i64m1(...) __riscv_vsll_vv_i64m1(__VA_ARGS__) +#define vsll_vx_i64m1(...) __riscv_vsll_vx_i64m1(__VA_ARGS__) +#define vsll_vv_i64m2(...) __riscv_vsll_vv_i64m2(__VA_ARGS__) +#define vsll_vx_i64m2(...) __riscv_vsll_vx_i64m2(__VA_ARGS__) +#define vsll_vv_i64m4(...) __riscv_vsll_vv_i64m4(__VA_ARGS__) +#define vsll_vx_i64m4(...) __riscv_vsll_vx_i64m4(__VA_ARGS__) +#define vsll_vv_i64m8(...) __riscv_vsll_vv_i64m8(__VA_ARGS__) +#define vsll_vx_i64m8(...) __riscv_vsll_vx_i64m8(__VA_ARGS__) +#define vsra_vv_i8mf8(...) __riscv_vsra_vv_i8mf8(__VA_ARGS__) +#define vsra_vx_i8mf8(...) __riscv_vsra_vx_i8mf8(__VA_ARGS__) +#define vsra_vv_i8mf4(...) __riscv_vsra_vv_i8mf4(__VA_ARGS__) +#define vsra_vx_i8mf4(...) __riscv_vsra_vx_i8mf4(__VA_ARGS__) +#define vsra_vv_i8mf2(...) __riscv_vsra_vv_i8mf2(__VA_ARGS__) +#define vsra_vx_i8mf2(...) __riscv_vsra_vx_i8mf2(__VA_ARGS__) +#define vsra_vv_i8m1(...) __riscv_vsra_vv_i8m1(__VA_ARGS__) +#define vsra_vx_i8m1(...) __riscv_vsra_vx_i8m1(__VA_ARGS__) +#define vsra_vv_i8m2(...) __riscv_vsra_vv_i8m2(__VA_ARGS__) +#define vsra_vx_i8m2(...) __riscv_vsra_vx_i8m2(__VA_ARGS__) +#define vsra_vv_i8m4(...) __riscv_vsra_vv_i8m4(__VA_ARGS__) +#define vsra_vx_i8m4(...) __riscv_vsra_vx_i8m4(__VA_ARGS__) +#define vsra_vv_i8m8(...) __riscv_vsra_vv_i8m8(__VA_ARGS__) +#define vsra_vx_i8m8(...) __riscv_vsra_vx_i8m8(__VA_ARGS__) +#define vsra_vv_i16mf4(...) __riscv_vsra_vv_i16mf4(__VA_ARGS__) +#define vsra_vx_i16mf4(...) __riscv_vsra_vx_i16mf4(__VA_ARGS__) +#define vsra_vv_i16mf2(...) __riscv_vsra_vv_i16mf2(__VA_ARGS__) +#define vsra_vx_i16mf2(...) __riscv_vsra_vx_i16mf2(__VA_ARGS__) +#define vsra_vv_i16m1(...) __riscv_vsra_vv_i16m1(__VA_ARGS__) +#define vsra_vx_i16m1(...) __riscv_vsra_vx_i16m1(__VA_ARGS__) +#define vsra_vv_i16m2(...) __riscv_vsra_vv_i16m2(__VA_ARGS__) +#define vsra_vx_i16m2(...) __riscv_vsra_vx_i16m2(__VA_ARGS__) +#define vsra_vv_i16m4(...) __riscv_vsra_vv_i16m4(__VA_ARGS__) +#define vsra_vx_i16m4(...) __riscv_vsra_vx_i16m4(__VA_ARGS__) +#define vsra_vv_i16m8(...) __riscv_vsra_vv_i16m8(__VA_ARGS__) +#define vsra_vx_i16m8(...) __riscv_vsra_vx_i16m8(__VA_ARGS__) +#define vsra_vv_i32mf2(...) __riscv_vsra_vv_i32mf2(__VA_ARGS__) +#define vsra_vx_i32mf2(...) __riscv_vsra_vx_i32mf2(__VA_ARGS__) +#define vsra_vv_i32m1(...) __riscv_vsra_vv_i32m1(__VA_ARGS__) +#define vsra_vx_i32m1(...) __riscv_vsra_vx_i32m1(__VA_ARGS__) +#define vsra_vv_i32m2(...) __riscv_vsra_vv_i32m2(__VA_ARGS__) +#define vsra_vx_i32m2(...) __riscv_vsra_vx_i32m2(__VA_ARGS__) +#define vsra_vv_i32m4(...) __riscv_vsra_vv_i32m4(__VA_ARGS__) +#define vsra_vx_i32m4(...) __riscv_vsra_vx_i32m4(__VA_ARGS__) +#define vsra_vv_i32m8(...) __riscv_vsra_vv_i32m8(__VA_ARGS__) +#define vsra_vx_i32m8(...) __riscv_vsra_vx_i32m8(__VA_ARGS__) +#define vsra_vv_i64m1(...) __riscv_vsra_vv_i64m1(__VA_ARGS__) +#define vsra_vx_i64m1(...) __riscv_vsra_vx_i64m1(__VA_ARGS__) +#define vsra_vv_i64m2(...) __riscv_vsra_vv_i64m2(__VA_ARGS__) +#define vsra_vx_i64m2(...) __riscv_vsra_vx_i64m2(__VA_ARGS__) +#define vsra_vv_i64m4(...) __riscv_vsra_vv_i64m4(__VA_ARGS__) +#define vsra_vx_i64m4(...) __riscv_vsra_vx_i64m4(__VA_ARGS__) +#define vsra_vv_i64m8(...) __riscv_vsra_vv_i64m8(__VA_ARGS__) +#define vsra_vx_i64m8(...) __riscv_vsra_vx_i64m8(__VA_ARGS__) +#define vsll_vv_u8mf8(...) __riscv_vsll_vv_u8mf8(__VA_ARGS__) +#define vsll_vx_u8mf8(...) __riscv_vsll_vx_u8mf8(__VA_ARGS__) +#define vsll_vv_u8mf4(...) __riscv_vsll_vv_u8mf4(__VA_ARGS__) +#define vsll_vx_u8mf4(...) __riscv_vsll_vx_u8mf4(__VA_ARGS__) +#define vsll_vv_u8mf2(...) __riscv_vsll_vv_u8mf2(__VA_ARGS__) +#define vsll_vx_u8mf2(...) __riscv_vsll_vx_u8mf2(__VA_ARGS__) +#define vsll_vv_u8m1(...) __riscv_vsll_vv_u8m1(__VA_ARGS__) +#define vsll_vx_u8m1(...) __riscv_vsll_vx_u8m1(__VA_ARGS__) +#define vsll_vv_u8m2(...) __riscv_vsll_vv_u8m2(__VA_ARGS__) +#define vsll_vx_u8m2(...) __riscv_vsll_vx_u8m2(__VA_ARGS__) +#define vsll_vv_u8m4(...) __riscv_vsll_vv_u8m4(__VA_ARGS__) +#define vsll_vx_u8m4(...) __riscv_vsll_vx_u8m4(__VA_ARGS__) +#define vsll_vv_u8m8(...) __riscv_vsll_vv_u8m8(__VA_ARGS__) +#define vsll_vx_u8m8(...) __riscv_vsll_vx_u8m8(__VA_ARGS__) +#define vsll_vv_u16mf4(...) __riscv_vsll_vv_u16mf4(__VA_ARGS__) +#define vsll_vx_u16mf4(...) __riscv_vsll_vx_u16mf4(__VA_ARGS__) +#define vsll_vv_u16mf2(...) __riscv_vsll_vv_u16mf2(__VA_ARGS__) +#define vsll_vx_u16mf2(...) __riscv_vsll_vx_u16mf2(__VA_ARGS__) +#define vsll_vv_u16m1(...) __riscv_vsll_vv_u16m1(__VA_ARGS__) +#define vsll_vx_u16m1(...) __riscv_vsll_vx_u16m1(__VA_ARGS__) +#define vsll_vv_u16m2(...) __riscv_vsll_vv_u16m2(__VA_ARGS__) +#define vsll_vx_u16m2(...) __riscv_vsll_vx_u16m2(__VA_ARGS__) +#define vsll_vv_u16m4(...) __riscv_vsll_vv_u16m4(__VA_ARGS__) +#define vsll_vx_u16m4(...) __riscv_vsll_vx_u16m4(__VA_ARGS__) +#define vsll_vv_u16m8(...) __riscv_vsll_vv_u16m8(__VA_ARGS__) +#define vsll_vx_u16m8(...) __riscv_vsll_vx_u16m8(__VA_ARGS__) +#define vsll_vv_u32mf2(...) __riscv_vsll_vv_u32mf2(__VA_ARGS__) +#define vsll_vx_u32mf2(...) __riscv_vsll_vx_u32mf2(__VA_ARGS__) +#define vsll_vv_u32m1(...) __riscv_vsll_vv_u32m1(__VA_ARGS__) +#define vsll_vx_u32m1(...) __riscv_vsll_vx_u32m1(__VA_ARGS__) +#define vsll_vv_u32m2(...) __riscv_vsll_vv_u32m2(__VA_ARGS__) +#define vsll_vx_u32m2(...) __riscv_vsll_vx_u32m2(__VA_ARGS__) +#define vsll_vv_u32m4(...) __riscv_vsll_vv_u32m4(__VA_ARGS__) +#define vsll_vx_u32m4(...) __riscv_vsll_vx_u32m4(__VA_ARGS__) +#define vsll_vv_u32m8(...) __riscv_vsll_vv_u32m8(__VA_ARGS__) +#define vsll_vx_u32m8(...) __riscv_vsll_vx_u32m8(__VA_ARGS__) +#define vsll_vv_u64m1(...) __riscv_vsll_vv_u64m1(__VA_ARGS__) +#define vsll_vx_u64m1(...) __riscv_vsll_vx_u64m1(__VA_ARGS__) +#define vsll_vv_u64m2(...) __riscv_vsll_vv_u64m2(__VA_ARGS__) +#define vsll_vx_u64m2(...) __riscv_vsll_vx_u64m2(__VA_ARGS__) +#define vsll_vv_u64m4(...) __riscv_vsll_vv_u64m4(__VA_ARGS__) +#define vsll_vx_u64m4(...) __riscv_vsll_vx_u64m4(__VA_ARGS__) +#define vsll_vv_u64m8(...) __riscv_vsll_vv_u64m8(__VA_ARGS__) +#define vsll_vx_u64m8(...) __riscv_vsll_vx_u64m8(__VA_ARGS__) +#define vsrl_vv_u8mf8(...) __riscv_vsrl_vv_u8mf8(__VA_ARGS__) +#define vsrl_vx_u8mf8(...) __riscv_vsrl_vx_u8mf8(__VA_ARGS__) +#define vsrl_vv_u8mf4(...) __riscv_vsrl_vv_u8mf4(__VA_ARGS__) +#define vsrl_vx_u8mf4(...) __riscv_vsrl_vx_u8mf4(__VA_ARGS__) +#define vsrl_vv_u8mf2(...) __riscv_vsrl_vv_u8mf2(__VA_ARGS__) +#define vsrl_vx_u8mf2(...) __riscv_vsrl_vx_u8mf2(__VA_ARGS__) +#define vsrl_vv_u8m1(...) __riscv_vsrl_vv_u8m1(__VA_ARGS__) +#define vsrl_vx_u8m1(...) __riscv_vsrl_vx_u8m1(__VA_ARGS__) +#define vsrl_vv_u8m2(...) __riscv_vsrl_vv_u8m2(__VA_ARGS__) +#define vsrl_vx_u8m2(...) __riscv_vsrl_vx_u8m2(__VA_ARGS__) +#define vsrl_vv_u8m4(...) __riscv_vsrl_vv_u8m4(__VA_ARGS__) +#define vsrl_vx_u8m4(...) __riscv_vsrl_vx_u8m4(__VA_ARGS__) +#define vsrl_vv_u8m8(...) __riscv_vsrl_vv_u8m8(__VA_ARGS__) +#define vsrl_vx_u8m8(...) __riscv_vsrl_vx_u8m8(__VA_ARGS__) +#define vsrl_vv_u16mf4(...) __riscv_vsrl_vv_u16mf4(__VA_ARGS__) +#define vsrl_vx_u16mf4(...) __riscv_vsrl_vx_u16mf4(__VA_ARGS__) +#define vsrl_vv_u16mf2(...) __riscv_vsrl_vv_u16mf2(__VA_ARGS__) +#define vsrl_vx_u16mf2(...) __riscv_vsrl_vx_u16mf2(__VA_ARGS__) +#define vsrl_vv_u16m1(...) __riscv_vsrl_vv_u16m1(__VA_ARGS__) +#define vsrl_vx_u16m1(...) __riscv_vsrl_vx_u16m1(__VA_ARGS__) +#define vsrl_vv_u16m2(...) __riscv_vsrl_vv_u16m2(__VA_ARGS__) +#define vsrl_vx_u16m2(...) __riscv_vsrl_vx_u16m2(__VA_ARGS__) +#define vsrl_vv_u16m4(...) __riscv_vsrl_vv_u16m4(__VA_ARGS__) +#define vsrl_vx_u16m4(...) __riscv_vsrl_vx_u16m4(__VA_ARGS__) +#define vsrl_vv_u16m8(...) __riscv_vsrl_vv_u16m8(__VA_ARGS__) +#define vsrl_vx_u16m8(...) __riscv_vsrl_vx_u16m8(__VA_ARGS__) +#define vsrl_vv_u32mf2(...) __riscv_vsrl_vv_u32mf2(__VA_ARGS__) +#define vsrl_vx_u32mf2(...) __riscv_vsrl_vx_u32mf2(__VA_ARGS__) +#define vsrl_vv_u32m1(...) __riscv_vsrl_vv_u32m1(__VA_ARGS__) +#define vsrl_vx_u32m1(...) __riscv_vsrl_vx_u32m1(__VA_ARGS__) +#define vsrl_vv_u32m2(...) __riscv_vsrl_vv_u32m2(__VA_ARGS__) +#define vsrl_vx_u32m2(...) __riscv_vsrl_vx_u32m2(__VA_ARGS__) +#define vsrl_vv_u32m4(...) __riscv_vsrl_vv_u32m4(__VA_ARGS__) +#define vsrl_vx_u32m4(...) __riscv_vsrl_vx_u32m4(__VA_ARGS__) +#define vsrl_vv_u32m8(...) __riscv_vsrl_vv_u32m8(__VA_ARGS__) +#define vsrl_vx_u32m8(...) __riscv_vsrl_vx_u32m8(__VA_ARGS__) +#define vsrl_vv_u64m1(...) __riscv_vsrl_vv_u64m1(__VA_ARGS__) +#define vsrl_vx_u64m1(...) __riscv_vsrl_vx_u64m1(__VA_ARGS__) +#define vsrl_vv_u64m2(...) __riscv_vsrl_vv_u64m2(__VA_ARGS__) +#define vsrl_vx_u64m2(...) __riscv_vsrl_vx_u64m2(__VA_ARGS__) +#define vsrl_vv_u64m4(...) __riscv_vsrl_vv_u64m4(__VA_ARGS__) +#define vsrl_vx_u64m4(...) __riscv_vsrl_vx_u64m4(__VA_ARGS__) +#define vsrl_vv_u64m8(...) __riscv_vsrl_vv_u64m8(__VA_ARGS__) +#define vsrl_vx_u64m8(...) __riscv_vsrl_vx_u64m8(__VA_ARGS__) +// masked functions +#define vsll_vv_i8mf8_m(...) __riscv_vsll_vv_i8mf8_tumu(__VA_ARGS__) +#define vsll_vx_i8mf8_m(...) __riscv_vsll_vx_i8mf8_tumu(__VA_ARGS__) +#define vsll_vv_i8mf4_m(...) __riscv_vsll_vv_i8mf4_tumu(__VA_ARGS__) +#define vsll_vx_i8mf4_m(...) __riscv_vsll_vx_i8mf4_tumu(__VA_ARGS__) +#define vsll_vv_i8mf2_m(...) __riscv_vsll_vv_i8mf2_tumu(__VA_ARGS__) +#define vsll_vx_i8mf2_m(...) __riscv_vsll_vx_i8mf2_tumu(__VA_ARGS__) +#define vsll_vv_i8m1_m(...) __riscv_vsll_vv_i8m1_tumu(__VA_ARGS__) +#define vsll_vx_i8m1_m(...) __riscv_vsll_vx_i8m1_tumu(__VA_ARGS__) +#define vsll_vv_i8m2_m(...) __riscv_vsll_vv_i8m2_tumu(__VA_ARGS__) +#define vsll_vx_i8m2_m(...) __riscv_vsll_vx_i8m2_tumu(__VA_ARGS__) +#define vsll_vv_i8m4_m(...) __riscv_vsll_vv_i8m4_tumu(__VA_ARGS__) +#define vsll_vx_i8m4_m(...) __riscv_vsll_vx_i8m4_tumu(__VA_ARGS__) +#define vsll_vv_i8m8_m(...) __riscv_vsll_vv_i8m8_tumu(__VA_ARGS__) +#define vsll_vx_i8m8_m(...) __riscv_vsll_vx_i8m8_tumu(__VA_ARGS__) +#define vsll_vv_i16mf4_m(...) __riscv_vsll_vv_i16mf4_tumu(__VA_ARGS__) +#define vsll_vx_i16mf4_m(...) __riscv_vsll_vx_i16mf4_tumu(__VA_ARGS__) +#define vsll_vv_i16mf2_m(...) __riscv_vsll_vv_i16mf2_tumu(__VA_ARGS__) +#define vsll_vx_i16mf2_m(...) __riscv_vsll_vx_i16mf2_tumu(__VA_ARGS__) +#define vsll_vv_i16m1_m(...) __riscv_vsll_vv_i16m1_tumu(__VA_ARGS__) +#define vsll_vx_i16m1_m(...) __riscv_vsll_vx_i16m1_tumu(__VA_ARGS__) +#define vsll_vv_i16m2_m(...) __riscv_vsll_vv_i16m2_tumu(__VA_ARGS__) +#define vsll_vx_i16m2_m(...) __riscv_vsll_vx_i16m2_tumu(__VA_ARGS__) +#define vsll_vv_i16m4_m(...) __riscv_vsll_vv_i16m4_tumu(__VA_ARGS__) +#define vsll_vx_i16m4_m(...) __riscv_vsll_vx_i16m4_tumu(__VA_ARGS__) +#define vsll_vv_i16m8_m(...) __riscv_vsll_vv_i16m8_tumu(__VA_ARGS__) +#define vsll_vx_i16m8_m(...) __riscv_vsll_vx_i16m8_tumu(__VA_ARGS__) +#define vsll_vv_i32mf2_m(...) __riscv_vsll_vv_i32mf2_tumu(__VA_ARGS__) +#define vsll_vx_i32mf2_m(...) __riscv_vsll_vx_i32mf2_tumu(__VA_ARGS__) +#define vsll_vv_i32m1_m(...) __riscv_vsll_vv_i32m1_tumu(__VA_ARGS__) +#define vsll_vx_i32m1_m(...) __riscv_vsll_vx_i32m1_tumu(__VA_ARGS__) +#define vsll_vv_i32m2_m(...) __riscv_vsll_vv_i32m2_tumu(__VA_ARGS__) +#define vsll_vx_i32m2_m(...) __riscv_vsll_vx_i32m2_tumu(__VA_ARGS__) +#define vsll_vv_i32m4_m(...) __riscv_vsll_vv_i32m4_tumu(__VA_ARGS__) +#define vsll_vx_i32m4_m(...) __riscv_vsll_vx_i32m4_tumu(__VA_ARGS__) +#define vsll_vv_i32m8_m(...) __riscv_vsll_vv_i32m8_tumu(__VA_ARGS__) +#define vsll_vx_i32m8_m(...) __riscv_vsll_vx_i32m8_tumu(__VA_ARGS__) +#define vsll_vv_i64m1_m(...) __riscv_vsll_vv_i64m1_tumu(__VA_ARGS__) +#define vsll_vx_i64m1_m(...) __riscv_vsll_vx_i64m1_tumu(__VA_ARGS__) +#define vsll_vv_i64m2_m(...) __riscv_vsll_vv_i64m2_tumu(__VA_ARGS__) +#define vsll_vx_i64m2_m(...) __riscv_vsll_vx_i64m2_tumu(__VA_ARGS__) +#define vsll_vv_i64m4_m(...) __riscv_vsll_vv_i64m4_tumu(__VA_ARGS__) +#define vsll_vx_i64m4_m(...) __riscv_vsll_vx_i64m4_tumu(__VA_ARGS__) +#define vsll_vv_i64m8_m(...) __riscv_vsll_vv_i64m8_tumu(__VA_ARGS__) +#define vsll_vx_i64m8_m(...) __riscv_vsll_vx_i64m8_tumu(__VA_ARGS__) +#define vsra_vv_i8mf8_m(...) __riscv_vsra_vv_i8mf8_tumu(__VA_ARGS__) +#define vsra_vx_i8mf8_m(...) __riscv_vsra_vx_i8mf8_tumu(__VA_ARGS__) +#define vsra_vv_i8mf4_m(...) __riscv_vsra_vv_i8mf4_tumu(__VA_ARGS__) +#define vsra_vx_i8mf4_m(...) __riscv_vsra_vx_i8mf4_tumu(__VA_ARGS__) +#define vsra_vv_i8mf2_m(...) __riscv_vsra_vv_i8mf2_tumu(__VA_ARGS__) +#define vsra_vx_i8mf2_m(...) __riscv_vsra_vx_i8mf2_tumu(__VA_ARGS__) +#define vsra_vv_i8m1_m(...) __riscv_vsra_vv_i8m1_tumu(__VA_ARGS__) +#define vsra_vx_i8m1_m(...) __riscv_vsra_vx_i8m1_tumu(__VA_ARGS__) +#define vsra_vv_i8m2_m(...) __riscv_vsra_vv_i8m2_tumu(__VA_ARGS__) +#define vsra_vx_i8m2_m(...) __riscv_vsra_vx_i8m2_tumu(__VA_ARGS__) +#define vsra_vv_i8m4_m(...) __riscv_vsra_vv_i8m4_tumu(__VA_ARGS__) +#define vsra_vx_i8m4_m(...) __riscv_vsra_vx_i8m4_tumu(__VA_ARGS__) +#define vsra_vv_i8m8_m(...) __riscv_vsra_vv_i8m8_tumu(__VA_ARGS__) +#define vsra_vx_i8m8_m(...) __riscv_vsra_vx_i8m8_tumu(__VA_ARGS__) +#define vsra_vv_i16mf4_m(...) __riscv_vsra_vv_i16mf4_tumu(__VA_ARGS__) +#define vsra_vx_i16mf4_m(...) __riscv_vsra_vx_i16mf4_tumu(__VA_ARGS__) +#define vsra_vv_i16mf2_m(...) __riscv_vsra_vv_i16mf2_tumu(__VA_ARGS__) +#define vsra_vx_i16mf2_m(...) __riscv_vsra_vx_i16mf2_tumu(__VA_ARGS__) +#define vsra_vv_i16m1_m(...) __riscv_vsra_vv_i16m1_tumu(__VA_ARGS__) +#define vsra_vx_i16m1_m(...) __riscv_vsra_vx_i16m1_tumu(__VA_ARGS__) +#define vsra_vv_i16m2_m(...) __riscv_vsra_vv_i16m2_tumu(__VA_ARGS__) +#define vsra_vx_i16m2_m(...) __riscv_vsra_vx_i16m2_tumu(__VA_ARGS__) +#define vsra_vv_i16m4_m(...) __riscv_vsra_vv_i16m4_tumu(__VA_ARGS__) +#define vsra_vx_i16m4_m(...) __riscv_vsra_vx_i16m4_tumu(__VA_ARGS__) +#define vsra_vv_i16m8_m(...) __riscv_vsra_vv_i16m8_tumu(__VA_ARGS__) +#define vsra_vx_i16m8_m(...) __riscv_vsra_vx_i16m8_tumu(__VA_ARGS__) +#define vsra_vv_i32mf2_m(...) __riscv_vsra_vv_i32mf2_tumu(__VA_ARGS__) +#define vsra_vx_i32mf2_m(...) __riscv_vsra_vx_i32mf2_tumu(__VA_ARGS__) +#define vsra_vv_i32m1_m(...) __riscv_vsra_vv_i32m1_tumu(__VA_ARGS__) +#define vsra_vx_i32m1_m(...) __riscv_vsra_vx_i32m1_tumu(__VA_ARGS__) +#define vsra_vv_i32m2_m(...) __riscv_vsra_vv_i32m2_tumu(__VA_ARGS__) +#define vsra_vx_i32m2_m(...) __riscv_vsra_vx_i32m2_tumu(__VA_ARGS__) +#define vsra_vv_i32m4_m(...) __riscv_vsra_vv_i32m4_tumu(__VA_ARGS__) +#define vsra_vx_i32m4_m(...) __riscv_vsra_vx_i32m4_tumu(__VA_ARGS__) +#define vsra_vv_i32m8_m(...) __riscv_vsra_vv_i32m8_tumu(__VA_ARGS__) +#define vsra_vx_i32m8_m(...) __riscv_vsra_vx_i32m8_tumu(__VA_ARGS__) +#define vsra_vv_i64m1_m(...) __riscv_vsra_vv_i64m1_tumu(__VA_ARGS__) +#define vsra_vx_i64m1_m(...) __riscv_vsra_vx_i64m1_tumu(__VA_ARGS__) +#define vsra_vv_i64m2_m(...) __riscv_vsra_vv_i64m2_tumu(__VA_ARGS__) +#define vsra_vx_i64m2_m(...) __riscv_vsra_vx_i64m2_tumu(__VA_ARGS__) +#define vsra_vv_i64m4_m(...) __riscv_vsra_vv_i64m4_tumu(__VA_ARGS__) +#define vsra_vx_i64m4_m(...) __riscv_vsra_vx_i64m4_tumu(__VA_ARGS__) +#define vsra_vv_i64m8_m(...) __riscv_vsra_vv_i64m8_tumu(__VA_ARGS__) +#define vsra_vx_i64m8_m(...) __riscv_vsra_vx_i64m8_tumu(__VA_ARGS__) +#define vsll_vv_u8mf8_m(...) __riscv_vsll_vv_u8mf8_tumu(__VA_ARGS__) +#define vsll_vx_u8mf8_m(...) __riscv_vsll_vx_u8mf8_tumu(__VA_ARGS__) +#define vsll_vv_u8mf4_m(...) __riscv_vsll_vv_u8mf4_tumu(__VA_ARGS__) +#define vsll_vx_u8mf4_m(...) __riscv_vsll_vx_u8mf4_tumu(__VA_ARGS__) +#define vsll_vv_u8mf2_m(...) __riscv_vsll_vv_u8mf2_tumu(__VA_ARGS__) +#define vsll_vx_u8mf2_m(...) __riscv_vsll_vx_u8mf2_tumu(__VA_ARGS__) +#define vsll_vv_u8m1_m(...) __riscv_vsll_vv_u8m1_tumu(__VA_ARGS__) +#define vsll_vx_u8m1_m(...) __riscv_vsll_vx_u8m1_tumu(__VA_ARGS__) +#define vsll_vv_u8m2_m(...) __riscv_vsll_vv_u8m2_tumu(__VA_ARGS__) +#define vsll_vx_u8m2_m(...) __riscv_vsll_vx_u8m2_tumu(__VA_ARGS__) +#define vsll_vv_u8m4_m(...) __riscv_vsll_vv_u8m4_tumu(__VA_ARGS__) +#define vsll_vx_u8m4_m(...) __riscv_vsll_vx_u8m4_tumu(__VA_ARGS__) +#define vsll_vv_u8m8_m(...) __riscv_vsll_vv_u8m8_tumu(__VA_ARGS__) +#define vsll_vx_u8m8_m(...) __riscv_vsll_vx_u8m8_tumu(__VA_ARGS__) +#define vsll_vv_u16mf4_m(...) __riscv_vsll_vv_u16mf4_tumu(__VA_ARGS__) +#define vsll_vx_u16mf4_m(...) __riscv_vsll_vx_u16mf4_tumu(__VA_ARGS__) +#define vsll_vv_u16mf2_m(...) __riscv_vsll_vv_u16mf2_tumu(__VA_ARGS__) +#define vsll_vx_u16mf2_m(...) __riscv_vsll_vx_u16mf2_tumu(__VA_ARGS__) +#define vsll_vv_u16m1_m(...) __riscv_vsll_vv_u16m1_tumu(__VA_ARGS__) +#define vsll_vx_u16m1_m(...) __riscv_vsll_vx_u16m1_tumu(__VA_ARGS__) +#define vsll_vv_u16m2_m(...) __riscv_vsll_vv_u16m2_tumu(__VA_ARGS__) +#define vsll_vx_u16m2_m(...) __riscv_vsll_vx_u16m2_tumu(__VA_ARGS__) +#define vsll_vv_u16m4_m(...) __riscv_vsll_vv_u16m4_tumu(__VA_ARGS__) +#define vsll_vx_u16m4_m(...) __riscv_vsll_vx_u16m4_tumu(__VA_ARGS__) +#define vsll_vv_u16m8_m(...) __riscv_vsll_vv_u16m8_tumu(__VA_ARGS__) +#define vsll_vx_u16m8_m(...) __riscv_vsll_vx_u16m8_tumu(__VA_ARGS__) +#define vsll_vv_u32mf2_m(...) __riscv_vsll_vv_u32mf2_tumu(__VA_ARGS__) +#define vsll_vx_u32mf2_m(...) __riscv_vsll_vx_u32mf2_tumu(__VA_ARGS__) +#define vsll_vv_u32m1_m(...) __riscv_vsll_vv_u32m1_tumu(__VA_ARGS__) +#define vsll_vx_u32m1_m(...) __riscv_vsll_vx_u32m1_tumu(__VA_ARGS__) +#define vsll_vv_u32m2_m(...) __riscv_vsll_vv_u32m2_tumu(__VA_ARGS__) +#define vsll_vx_u32m2_m(...) __riscv_vsll_vx_u32m2_tumu(__VA_ARGS__) +#define vsll_vv_u32m4_m(...) __riscv_vsll_vv_u32m4_tumu(__VA_ARGS__) +#define vsll_vx_u32m4_m(...) __riscv_vsll_vx_u32m4_tumu(__VA_ARGS__) +#define vsll_vv_u32m8_m(...) __riscv_vsll_vv_u32m8_tumu(__VA_ARGS__) +#define vsll_vx_u32m8_m(...) __riscv_vsll_vx_u32m8_tumu(__VA_ARGS__) +#define vsll_vv_u64m1_m(...) __riscv_vsll_vv_u64m1_tumu(__VA_ARGS__) +#define vsll_vx_u64m1_m(...) __riscv_vsll_vx_u64m1_tumu(__VA_ARGS__) +#define vsll_vv_u64m2_m(...) __riscv_vsll_vv_u64m2_tumu(__VA_ARGS__) +#define vsll_vx_u64m2_m(...) __riscv_vsll_vx_u64m2_tumu(__VA_ARGS__) +#define vsll_vv_u64m4_m(...) __riscv_vsll_vv_u64m4_tumu(__VA_ARGS__) +#define vsll_vx_u64m4_m(...) __riscv_vsll_vx_u64m4_tumu(__VA_ARGS__) +#define vsll_vv_u64m8_m(...) __riscv_vsll_vv_u64m8_tumu(__VA_ARGS__) +#define vsll_vx_u64m8_m(...) __riscv_vsll_vx_u64m8_tumu(__VA_ARGS__) +#define vsrl_vv_u8mf8_m(...) __riscv_vsrl_vv_u8mf8_tumu(__VA_ARGS__) +#define vsrl_vx_u8mf8_m(...) __riscv_vsrl_vx_u8mf8_tumu(__VA_ARGS__) +#define vsrl_vv_u8mf4_m(...) __riscv_vsrl_vv_u8mf4_tumu(__VA_ARGS__) +#define vsrl_vx_u8mf4_m(...) __riscv_vsrl_vx_u8mf4_tumu(__VA_ARGS__) +#define vsrl_vv_u8mf2_m(...) __riscv_vsrl_vv_u8mf2_tumu(__VA_ARGS__) +#define vsrl_vx_u8mf2_m(...) __riscv_vsrl_vx_u8mf2_tumu(__VA_ARGS__) +#define vsrl_vv_u8m1_m(...) __riscv_vsrl_vv_u8m1_tumu(__VA_ARGS__) +#define vsrl_vx_u8m1_m(...) __riscv_vsrl_vx_u8m1_tumu(__VA_ARGS__) +#define vsrl_vv_u8m2_m(...) __riscv_vsrl_vv_u8m2_tumu(__VA_ARGS__) +#define vsrl_vx_u8m2_m(...) __riscv_vsrl_vx_u8m2_tumu(__VA_ARGS__) +#define vsrl_vv_u8m4_m(...) __riscv_vsrl_vv_u8m4_tumu(__VA_ARGS__) +#define vsrl_vx_u8m4_m(...) __riscv_vsrl_vx_u8m4_tumu(__VA_ARGS__) +#define vsrl_vv_u8m8_m(...) __riscv_vsrl_vv_u8m8_tumu(__VA_ARGS__) +#define vsrl_vx_u8m8_m(...) __riscv_vsrl_vx_u8m8_tumu(__VA_ARGS__) +#define vsrl_vv_u16mf4_m(...) __riscv_vsrl_vv_u16mf4_tumu(__VA_ARGS__) +#define vsrl_vx_u16mf4_m(...) __riscv_vsrl_vx_u16mf4_tumu(__VA_ARGS__) +#define vsrl_vv_u16mf2_m(...) __riscv_vsrl_vv_u16mf2_tumu(__VA_ARGS__) +#define vsrl_vx_u16mf2_m(...) __riscv_vsrl_vx_u16mf2_tumu(__VA_ARGS__) +#define vsrl_vv_u16m1_m(...) __riscv_vsrl_vv_u16m1_tumu(__VA_ARGS__) +#define vsrl_vx_u16m1_m(...) __riscv_vsrl_vx_u16m1_tumu(__VA_ARGS__) +#define vsrl_vv_u16m2_m(...) __riscv_vsrl_vv_u16m2_tumu(__VA_ARGS__) +#define vsrl_vx_u16m2_m(...) __riscv_vsrl_vx_u16m2_tumu(__VA_ARGS__) +#define vsrl_vv_u16m4_m(...) __riscv_vsrl_vv_u16m4_tumu(__VA_ARGS__) +#define vsrl_vx_u16m4_m(...) __riscv_vsrl_vx_u16m4_tumu(__VA_ARGS__) +#define vsrl_vv_u16m8_m(...) __riscv_vsrl_vv_u16m8_tumu(__VA_ARGS__) +#define vsrl_vx_u16m8_m(...) __riscv_vsrl_vx_u16m8_tumu(__VA_ARGS__) +#define vsrl_vv_u32mf2_m(...) __riscv_vsrl_vv_u32mf2_tumu(__VA_ARGS__) +#define vsrl_vx_u32mf2_m(...) __riscv_vsrl_vx_u32mf2_tumu(__VA_ARGS__) +#define vsrl_vv_u32m1_m(...) __riscv_vsrl_vv_u32m1_tumu(__VA_ARGS__) +#define vsrl_vx_u32m1_m(...) __riscv_vsrl_vx_u32m1_tumu(__VA_ARGS__) +#define vsrl_vv_u32m2_m(...) __riscv_vsrl_vv_u32m2_tumu(__VA_ARGS__) +#define vsrl_vx_u32m2_m(...) __riscv_vsrl_vx_u32m2_tumu(__VA_ARGS__) +#define vsrl_vv_u32m4_m(...) __riscv_vsrl_vv_u32m4_tumu(__VA_ARGS__) +#define vsrl_vx_u32m4_m(...) __riscv_vsrl_vx_u32m4_tumu(__VA_ARGS__) +#define vsrl_vv_u32m8_m(...) __riscv_vsrl_vv_u32m8_tumu(__VA_ARGS__) +#define vsrl_vx_u32m8_m(...) __riscv_vsrl_vx_u32m8_tumu(__VA_ARGS__) +#define vsrl_vv_u64m1_m(...) __riscv_vsrl_vv_u64m1_tumu(__VA_ARGS__) +#define vsrl_vx_u64m1_m(...) __riscv_vsrl_vx_u64m1_tumu(__VA_ARGS__) +#define vsrl_vv_u64m2_m(...) __riscv_vsrl_vv_u64m2_tumu(__VA_ARGS__) +#define vsrl_vx_u64m2_m(...) __riscv_vsrl_vx_u64m2_tumu(__VA_ARGS__) +#define vsrl_vv_u64m4_m(...) __riscv_vsrl_vv_u64m4_tumu(__VA_ARGS__) +#define vsrl_vx_u64m4_m(...) __riscv_vsrl_vx_u64m4_tumu(__VA_ARGS__) +#define vsrl_vv_u64m8_m(...) __riscv_vsrl_vv_u64m8_tumu(__VA_ARGS__) +#define vsrl_vx_u64m8_m(...) __riscv_vsrl_vx_u64m8_tumu(__VA_ARGS__) +#define vnsra_wv_i8mf8(...) __riscv_vnsra_wv_i8mf8(__VA_ARGS__) +#define vnsra_wx_i8mf8(...) __riscv_vnsra_wx_i8mf8(__VA_ARGS__) +#define vnsra_wv_i8mf4(...) __riscv_vnsra_wv_i8mf4(__VA_ARGS__) +#define vnsra_wx_i8mf4(...) __riscv_vnsra_wx_i8mf4(__VA_ARGS__) +#define vnsra_wv_i8mf2(...) __riscv_vnsra_wv_i8mf2(__VA_ARGS__) +#define vnsra_wx_i8mf2(...) __riscv_vnsra_wx_i8mf2(__VA_ARGS__) +#define vnsra_wv_i8m1(...) __riscv_vnsra_wv_i8m1(__VA_ARGS__) +#define vnsra_wx_i8m1(...) __riscv_vnsra_wx_i8m1(__VA_ARGS__) +#define vnsra_wv_i8m2(...) __riscv_vnsra_wv_i8m2(__VA_ARGS__) +#define vnsra_wx_i8m2(...) __riscv_vnsra_wx_i8m2(__VA_ARGS__) +#define vnsra_wv_i8m4(...) __riscv_vnsra_wv_i8m4(__VA_ARGS__) +#define vnsra_wx_i8m4(...) __riscv_vnsra_wx_i8m4(__VA_ARGS__) +#define vnsra_wv_i16mf4(...) __riscv_vnsra_wv_i16mf4(__VA_ARGS__) +#define vnsra_wx_i16mf4(...) __riscv_vnsra_wx_i16mf4(__VA_ARGS__) +#define vnsra_wv_i16mf2(...) __riscv_vnsra_wv_i16mf2(__VA_ARGS__) +#define vnsra_wx_i16mf2(...) __riscv_vnsra_wx_i16mf2(__VA_ARGS__) +#define vnsra_wv_i16m1(...) __riscv_vnsra_wv_i16m1(__VA_ARGS__) +#define vnsra_wx_i16m1(...) __riscv_vnsra_wx_i16m1(__VA_ARGS__) +#define vnsra_wv_i16m2(...) __riscv_vnsra_wv_i16m2(__VA_ARGS__) +#define vnsra_wx_i16m2(...) __riscv_vnsra_wx_i16m2(__VA_ARGS__) +#define vnsra_wv_i16m4(...) __riscv_vnsra_wv_i16m4(__VA_ARGS__) +#define vnsra_wx_i16m4(...) __riscv_vnsra_wx_i16m4(__VA_ARGS__) +#define vnsra_wv_i32mf2(...) __riscv_vnsra_wv_i32mf2(__VA_ARGS__) +#define vnsra_wx_i32mf2(...) __riscv_vnsra_wx_i32mf2(__VA_ARGS__) +#define vnsra_wv_i32m1(...) __riscv_vnsra_wv_i32m1(__VA_ARGS__) +#define vnsra_wx_i32m1(...) __riscv_vnsra_wx_i32m1(__VA_ARGS__) +#define vnsra_wv_i32m2(...) __riscv_vnsra_wv_i32m2(__VA_ARGS__) +#define vnsra_wx_i32m2(...) __riscv_vnsra_wx_i32m2(__VA_ARGS__) +#define vnsra_wv_i32m4(...) __riscv_vnsra_wv_i32m4(__VA_ARGS__) +#define vnsra_wx_i32m4(...) __riscv_vnsra_wx_i32m4(__VA_ARGS__) +#define vnsrl_wv_u8mf8(...) __riscv_vnsrl_wv_u8mf8(__VA_ARGS__) +#define vnsrl_wx_u8mf8(...) __riscv_vnsrl_wx_u8mf8(__VA_ARGS__) +#define vnsrl_wv_u8mf4(...) __riscv_vnsrl_wv_u8mf4(__VA_ARGS__) +#define vnsrl_wx_u8mf4(...) __riscv_vnsrl_wx_u8mf4(__VA_ARGS__) +#define vnsrl_wv_u8mf2(...) __riscv_vnsrl_wv_u8mf2(__VA_ARGS__) +#define vnsrl_wx_u8mf2(...) __riscv_vnsrl_wx_u8mf2(__VA_ARGS__) +#define vnsrl_wv_u8m1(...) __riscv_vnsrl_wv_u8m1(__VA_ARGS__) +#define vnsrl_wx_u8m1(...) __riscv_vnsrl_wx_u8m1(__VA_ARGS__) +#define vnsrl_wv_u8m2(...) __riscv_vnsrl_wv_u8m2(__VA_ARGS__) +#define vnsrl_wx_u8m2(...) __riscv_vnsrl_wx_u8m2(__VA_ARGS__) +#define vnsrl_wv_u8m4(...) __riscv_vnsrl_wv_u8m4(__VA_ARGS__) +#define vnsrl_wx_u8m4(...) __riscv_vnsrl_wx_u8m4(__VA_ARGS__) +#define vnsrl_wv_u16mf4(...) __riscv_vnsrl_wv_u16mf4(__VA_ARGS__) +#define vnsrl_wx_u16mf4(...) __riscv_vnsrl_wx_u16mf4(__VA_ARGS__) +#define vnsrl_wv_u16mf2(...) __riscv_vnsrl_wv_u16mf2(__VA_ARGS__) +#define vnsrl_wx_u16mf2(...) __riscv_vnsrl_wx_u16mf2(__VA_ARGS__) +#define vnsrl_wv_u16m1(...) __riscv_vnsrl_wv_u16m1(__VA_ARGS__) +#define vnsrl_wx_u16m1(...) __riscv_vnsrl_wx_u16m1(__VA_ARGS__) +#define vnsrl_wv_u16m2(...) __riscv_vnsrl_wv_u16m2(__VA_ARGS__) +#define vnsrl_wx_u16m2(...) __riscv_vnsrl_wx_u16m2(__VA_ARGS__) +#define vnsrl_wv_u16m4(...) __riscv_vnsrl_wv_u16m4(__VA_ARGS__) +#define vnsrl_wx_u16m4(...) __riscv_vnsrl_wx_u16m4(__VA_ARGS__) +#define vnsrl_wv_u32mf2(...) __riscv_vnsrl_wv_u32mf2(__VA_ARGS__) +#define vnsrl_wx_u32mf2(...) __riscv_vnsrl_wx_u32mf2(__VA_ARGS__) +#define vnsrl_wv_u32m1(...) __riscv_vnsrl_wv_u32m1(__VA_ARGS__) +#define vnsrl_wx_u32m1(...) __riscv_vnsrl_wx_u32m1(__VA_ARGS__) +#define vnsrl_wv_u32m2(...) __riscv_vnsrl_wv_u32m2(__VA_ARGS__) +#define vnsrl_wx_u32m2(...) __riscv_vnsrl_wx_u32m2(__VA_ARGS__) +#define vnsrl_wv_u32m4(...) __riscv_vnsrl_wv_u32m4(__VA_ARGS__) +#define vnsrl_wx_u32m4(...) __riscv_vnsrl_wx_u32m4(__VA_ARGS__) +// masked functions +#define vnsra_wv_i8mf8_m(...) __riscv_vnsra_wv_i8mf8_tumu(__VA_ARGS__) +#define vnsra_wx_i8mf8_m(...) __riscv_vnsra_wx_i8mf8_tumu(__VA_ARGS__) +#define vnsra_wv_i8mf4_m(...) __riscv_vnsra_wv_i8mf4_tumu(__VA_ARGS__) +#define vnsra_wx_i8mf4_m(...) __riscv_vnsra_wx_i8mf4_tumu(__VA_ARGS__) +#define vnsra_wv_i8mf2_m(...) __riscv_vnsra_wv_i8mf2_tumu(__VA_ARGS__) +#define vnsra_wx_i8mf2_m(...) __riscv_vnsra_wx_i8mf2_tumu(__VA_ARGS__) +#define vnsra_wv_i8m1_m(...) __riscv_vnsra_wv_i8m1_tumu(__VA_ARGS__) +#define vnsra_wx_i8m1_m(...) __riscv_vnsra_wx_i8m1_tumu(__VA_ARGS__) +#define vnsra_wv_i8m2_m(...) __riscv_vnsra_wv_i8m2_tumu(__VA_ARGS__) +#define vnsra_wx_i8m2_m(...) __riscv_vnsra_wx_i8m2_tumu(__VA_ARGS__) +#define vnsra_wv_i8m4_m(...) __riscv_vnsra_wv_i8m4_tumu(__VA_ARGS__) +#define vnsra_wx_i8m4_m(...) __riscv_vnsra_wx_i8m4_tumu(__VA_ARGS__) +#define vnsra_wv_i16mf4_m(...) __riscv_vnsra_wv_i16mf4_tumu(__VA_ARGS__) +#define vnsra_wx_i16mf4_m(...) __riscv_vnsra_wx_i16mf4_tumu(__VA_ARGS__) +#define vnsra_wv_i16mf2_m(...) __riscv_vnsra_wv_i16mf2_tumu(__VA_ARGS__) +#define vnsra_wx_i16mf2_m(...) __riscv_vnsra_wx_i16mf2_tumu(__VA_ARGS__) +#define vnsra_wv_i16m1_m(...) __riscv_vnsra_wv_i16m1_tumu(__VA_ARGS__) +#define vnsra_wx_i16m1_m(...) __riscv_vnsra_wx_i16m1_tumu(__VA_ARGS__) +#define vnsra_wv_i16m2_m(...) __riscv_vnsra_wv_i16m2_tumu(__VA_ARGS__) +#define vnsra_wx_i16m2_m(...) __riscv_vnsra_wx_i16m2_tumu(__VA_ARGS__) +#define vnsra_wv_i16m4_m(...) __riscv_vnsra_wv_i16m4_tumu(__VA_ARGS__) +#define vnsra_wx_i16m4_m(...) __riscv_vnsra_wx_i16m4_tumu(__VA_ARGS__) +#define vnsra_wv_i32mf2_m(...) __riscv_vnsra_wv_i32mf2_tumu(__VA_ARGS__) +#define vnsra_wx_i32mf2_m(...) __riscv_vnsra_wx_i32mf2_tumu(__VA_ARGS__) +#define vnsra_wv_i32m1_m(...) __riscv_vnsra_wv_i32m1_tumu(__VA_ARGS__) +#define vnsra_wx_i32m1_m(...) __riscv_vnsra_wx_i32m1_tumu(__VA_ARGS__) +#define vnsra_wv_i32m2_m(...) __riscv_vnsra_wv_i32m2_tumu(__VA_ARGS__) +#define vnsra_wx_i32m2_m(...) __riscv_vnsra_wx_i32m2_tumu(__VA_ARGS__) +#define vnsra_wv_i32m4_m(...) __riscv_vnsra_wv_i32m4_tumu(__VA_ARGS__) +#define vnsra_wx_i32m4_m(...) __riscv_vnsra_wx_i32m4_tumu(__VA_ARGS__) +#define vnsrl_wv_u8mf8_m(...) __riscv_vnsrl_wv_u8mf8_tumu(__VA_ARGS__) +#define vnsrl_wx_u8mf8_m(...) __riscv_vnsrl_wx_u8mf8_tumu(__VA_ARGS__) +#define vnsrl_wv_u8mf4_m(...) __riscv_vnsrl_wv_u8mf4_tumu(__VA_ARGS__) +#define vnsrl_wx_u8mf4_m(...) __riscv_vnsrl_wx_u8mf4_tumu(__VA_ARGS__) +#define vnsrl_wv_u8mf2_m(...) __riscv_vnsrl_wv_u8mf2_tumu(__VA_ARGS__) +#define vnsrl_wx_u8mf2_m(...) __riscv_vnsrl_wx_u8mf2_tumu(__VA_ARGS__) +#define vnsrl_wv_u8m1_m(...) __riscv_vnsrl_wv_u8m1_tumu(__VA_ARGS__) +#define vnsrl_wx_u8m1_m(...) __riscv_vnsrl_wx_u8m1_tumu(__VA_ARGS__) +#define vnsrl_wv_u8m2_m(...) __riscv_vnsrl_wv_u8m2_tumu(__VA_ARGS__) +#define vnsrl_wx_u8m2_m(...) __riscv_vnsrl_wx_u8m2_tumu(__VA_ARGS__) +#define vnsrl_wv_u8m4_m(...) __riscv_vnsrl_wv_u8m4_tumu(__VA_ARGS__) +#define vnsrl_wx_u8m4_m(...) __riscv_vnsrl_wx_u8m4_tumu(__VA_ARGS__) +#define vnsrl_wv_u16mf4_m(...) __riscv_vnsrl_wv_u16mf4_tumu(__VA_ARGS__) +#define vnsrl_wx_u16mf4_m(...) __riscv_vnsrl_wx_u16mf4_tumu(__VA_ARGS__) +#define vnsrl_wv_u16mf2_m(...) __riscv_vnsrl_wv_u16mf2_tumu(__VA_ARGS__) +#define vnsrl_wx_u16mf2_m(...) __riscv_vnsrl_wx_u16mf2_tumu(__VA_ARGS__) +#define vnsrl_wv_u16m1_m(...) __riscv_vnsrl_wv_u16m1_tumu(__VA_ARGS__) +#define vnsrl_wx_u16m1_m(...) __riscv_vnsrl_wx_u16m1_tumu(__VA_ARGS__) +#define vnsrl_wv_u16m2_m(...) __riscv_vnsrl_wv_u16m2_tumu(__VA_ARGS__) +#define vnsrl_wx_u16m2_m(...) __riscv_vnsrl_wx_u16m2_tumu(__VA_ARGS__) +#define vnsrl_wv_u16m4_m(...) __riscv_vnsrl_wv_u16m4_tumu(__VA_ARGS__) +#define vnsrl_wx_u16m4_m(...) __riscv_vnsrl_wx_u16m4_tumu(__VA_ARGS__) +#define vnsrl_wv_u32mf2_m(...) __riscv_vnsrl_wv_u32mf2_tumu(__VA_ARGS__) +#define vnsrl_wx_u32mf2_m(...) __riscv_vnsrl_wx_u32mf2_tumu(__VA_ARGS__) +#define vnsrl_wv_u32m1_m(...) __riscv_vnsrl_wv_u32m1_tumu(__VA_ARGS__) +#define vnsrl_wx_u32m1_m(...) __riscv_vnsrl_wx_u32m1_tumu(__VA_ARGS__) +#define vnsrl_wv_u32m2_m(...) __riscv_vnsrl_wv_u32m2_tumu(__VA_ARGS__) +#define vnsrl_wx_u32m2_m(...) __riscv_vnsrl_wx_u32m2_tumu(__VA_ARGS__) +#define vnsrl_wv_u32m4_m(...) __riscv_vnsrl_wv_u32m4_tumu(__VA_ARGS__) +#define vnsrl_wx_u32m4_m(...) __riscv_vnsrl_wx_u32m4_tumu(__VA_ARGS__) +#define vmseq_vv_i8mf8_b64(...) __riscv_vmseq_vv_i8mf8_b64(__VA_ARGS__) +#define vmseq_vx_i8mf8_b64(...) __riscv_vmseq_vx_i8mf8_b64(__VA_ARGS__) +#define vmseq_vv_i8mf4_b32(...) __riscv_vmseq_vv_i8mf4_b32(__VA_ARGS__) +#define vmseq_vx_i8mf4_b32(...) __riscv_vmseq_vx_i8mf4_b32(__VA_ARGS__) +#define vmseq_vv_i8mf2_b16(...) __riscv_vmseq_vv_i8mf2_b16(__VA_ARGS__) +#define vmseq_vx_i8mf2_b16(...) __riscv_vmseq_vx_i8mf2_b16(__VA_ARGS__) +#define vmseq_vv_i8m1_b8(...) __riscv_vmseq_vv_i8m1_b8(__VA_ARGS__) +#define vmseq_vx_i8m1_b8(...) __riscv_vmseq_vx_i8m1_b8(__VA_ARGS__) +#define vmseq_vv_i8m2_b4(...) __riscv_vmseq_vv_i8m2_b4(__VA_ARGS__) +#define vmseq_vx_i8m2_b4(...) __riscv_vmseq_vx_i8m2_b4(__VA_ARGS__) +#define vmseq_vv_i8m4_b2(...) __riscv_vmseq_vv_i8m4_b2(__VA_ARGS__) +#define vmseq_vx_i8m4_b2(...) __riscv_vmseq_vx_i8m4_b2(__VA_ARGS__) +#define vmseq_vv_i8m8_b1(...) __riscv_vmseq_vv_i8m8_b1(__VA_ARGS__) +#define vmseq_vx_i8m8_b1(...) __riscv_vmseq_vx_i8m8_b1(__VA_ARGS__) +#define vmseq_vv_i16mf4_b64(...) __riscv_vmseq_vv_i16mf4_b64(__VA_ARGS__) +#define vmseq_vx_i16mf4_b64(...) __riscv_vmseq_vx_i16mf4_b64(__VA_ARGS__) +#define vmseq_vv_i16mf2_b32(...) __riscv_vmseq_vv_i16mf2_b32(__VA_ARGS__) +#define vmseq_vx_i16mf2_b32(...) __riscv_vmseq_vx_i16mf2_b32(__VA_ARGS__) +#define vmseq_vv_i16m1_b16(...) __riscv_vmseq_vv_i16m1_b16(__VA_ARGS__) +#define vmseq_vx_i16m1_b16(...) __riscv_vmseq_vx_i16m1_b16(__VA_ARGS__) +#define vmseq_vv_i16m2_b8(...) __riscv_vmseq_vv_i16m2_b8(__VA_ARGS__) +#define vmseq_vx_i16m2_b8(...) __riscv_vmseq_vx_i16m2_b8(__VA_ARGS__) +#define vmseq_vv_i16m4_b4(...) __riscv_vmseq_vv_i16m4_b4(__VA_ARGS__) +#define vmseq_vx_i16m4_b4(...) __riscv_vmseq_vx_i16m4_b4(__VA_ARGS__) +#define vmseq_vv_i16m8_b2(...) __riscv_vmseq_vv_i16m8_b2(__VA_ARGS__) +#define vmseq_vx_i16m8_b2(...) __riscv_vmseq_vx_i16m8_b2(__VA_ARGS__) +#define vmseq_vv_i32mf2_b64(...) __riscv_vmseq_vv_i32mf2_b64(__VA_ARGS__) +#define vmseq_vx_i32mf2_b64(...) __riscv_vmseq_vx_i32mf2_b64(__VA_ARGS__) +#define vmseq_vv_i32m1_b32(...) __riscv_vmseq_vv_i32m1_b32(__VA_ARGS__) +#define vmseq_vx_i32m1_b32(...) __riscv_vmseq_vx_i32m1_b32(__VA_ARGS__) +#define vmseq_vv_i32m2_b16(...) __riscv_vmseq_vv_i32m2_b16(__VA_ARGS__) +#define vmseq_vx_i32m2_b16(...) __riscv_vmseq_vx_i32m2_b16(__VA_ARGS__) +#define vmseq_vv_i32m4_b8(...) __riscv_vmseq_vv_i32m4_b8(__VA_ARGS__) +#define vmseq_vx_i32m4_b8(...) __riscv_vmseq_vx_i32m4_b8(__VA_ARGS__) +#define vmseq_vv_i32m8_b4(...) __riscv_vmseq_vv_i32m8_b4(__VA_ARGS__) +#define vmseq_vx_i32m8_b4(...) __riscv_vmseq_vx_i32m8_b4(__VA_ARGS__) +#define vmseq_vv_i64m1_b64(...) __riscv_vmseq_vv_i64m1_b64(__VA_ARGS__) +#define vmseq_vx_i64m1_b64(...) __riscv_vmseq_vx_i64m1_b64(__VA_ARGS__) +#define vmseq_vv_i64m2_b32(...) __riscv_vmseq_vv_i64m2_b32(__VA_ARGS__) +#define vmseq_vx_i64m2_b32(...) __riscv_vmseq_vx_i64m2_b32(__VA_ARGS__) +#define vmseq_vv_i64m4_b16(...) __riscv_vmseq_vv_i64m4_b16(__VA_ARGS__) +#define vmseq_vx_i64m4_b16(...) __riscv_vmseq_vx_i64m4_b16(__VA_ARGS__) +#define vmseq_vv_i64m8_b8(...) __riscv_vmseq_vv_i64m8_b8(__VA_ARGS__) +#define vmseq_vx_i64m8_b8(...) __riscv_vmseq_vx_i64m8_b8(__VA_ARGS__) +#define vmsne_vv_i8mf8_b64(...) __riscv_vmsne_vv_i8mf8_b64(__VA_ARGS__) +#define vmsne_vx_i8mf8_b64(...) __riscv_vmsne_vx_i8mf8_b64(__VA_ARGS__) +#define vmsne_vv_i8mf4_b32(...) __riscv_vmsne_vv_i8mf4_b32(__VA_ARGS__) +#define vmsne_vx_i8mf4_b32(...) __riscv_vmsne_vx_i8mf4_b32(__VA_ARGS__) +#define vmsne_vv_i8mf2_b16(...) __riscv_vmsne_vv_i8mf2_b16(__VA_ARGS__) +#define vmsne_vx_i8mf2_b16(...) __riscv_vmsne_vx_i8mf2_b16(__VA_ARGS__) +#define vmsne_vv_i8m1_b8(...) __riscv_vmsne_vv_i8m1_b8(__VA_ARGS__) +#define vmsne_vx_i8m1_b8(...) __riscv_vmsne_vx_i8m1_b8(__VA_ARGS__) +#define vmsne_vv_i8m2_b4(...) __riscv_vmsne_vv_i8m2_b4(__VA_ARGS__) +#define vmsne_vx_i8m2_b4(...) __riscv_vmsne_vx_i8m2_b4(__VA_ARGS__) +#define vmsne_vv_i8m4_b2(...) __riscv_vmsne_vv_i8m4_b2(__VA_ARGS__) +#define vmsne_vx_i8m4_b2(...) __riscv_vmsne_vx_i8m4_b2(__VA_ARGS__) +#define vmsne_vv_i8m8_b1(...) __riscv_vmsne_vv_i8m8_b1(__VA_ARGS__) +#define vmsne_vx_i8m8_b1(...) __riscv_vmsne_vx_i8m8_b1(__VA_ARGS__) +#define vmsne_vv_i16mf4_b64(...) __riscv_vmsne_vv_i16mf4_b64(__VA_ARGS__) +#define vmsne_vx_i16mf4_b64(...) __riscv_vmsne_vx_i16mf4_b64(__VA_ARGS__) +#define vmsne_vv_i16mf2_b32(...) __riscv_vmsne_vv_i16mf2_b32(__VA_ARGS__) +#define vmsne_vx_i16mf2_b32(...) __riscv_vmsne_vx_i16mf2_b32(__VA_ARGS__) +#define vmsne_vv_i16m1_b16(...) __riscv_vmsne_vv_i16m1_b16(__VA_ARGS__) +#define vmsne_vx_i16m1_b16(...) __riscv_vmsne_vx_i16m1_b16(__VA_ARGS__) +#define vmsne_vv_i16m2_b8(...) __riscv_vmsne_vv_i16m2_b8(__VA_ARGS__) +#define vmsne_vx_i16m2_b8(...) __riscv_vmsne_vx_i16m2_b8(__VA_ARGS__) +#define vmsne_vv_i16m4_b4(...) __riscv_vmsne_vv_i16m4_b4(__VA_ARGS__) +#define vmsne_vx_i16m4_b4(...) __riscv_vmsne_vx_i16m4_b4(__VA_ARGS__) +#define vmsne_vv_i16m8_b2(...) __riscv_vmsne_vv_i16m8_b2(__VA_ARGS__) +#define vmsne_vx_i16m8_b2(...) __riscv_vmsne_vx_i16m8_b2(__VA_ARGS__) +#define vmsne_vv_i32mf2_b64(...) __riscv_vmsne_vv_i32mf2_b64(__VA_ARGS__) +#define vmsne_vx_i32mf2_b64(...) __riscv_vmsne_vx_i32mf2_b64(__VA_ARGS__) +#define vmsne_vv_i32m1_b32(...) __riscv_vmsne_vv_i32m1_b32(__VA_ARGS__) +#define vmsne_vx_i32m1_b32(...) __riscv_vmsne_vx_i32m1_b32(__VA_ARGS__) +#define vmsne_vv_i32m2_b16(...) __riscv_vmsne_vv_i32m2_b16(__VA_ARGS__) +#define vmsne_vx_i32m2_b16(...) __riscv_vmsne_vx_i32m2_b16(__VA_ARGS__) +#define vmsne_vv_i32m4_b8(...) __riscv_vmsne_vv_i32m4_b8(__VA_ARGS__) +#define vmsne_vx_i32m4_b8(...) __riscv_vmsne_vx_i32m4_b8(__VA_ARGS__) +#define vmsne_vv_i32m8_b4(...) __riscv_vmsne_vv_i32m8_b4(__VA_ARGS__) +#define vmsne_vx_i32m8_b4(...) __riscv_vmsne_vx_i32m8_b4(__VA_ARGS__) +#define vmsne_vv_i64m1_b64(...) __riscv_vmsne_vv_i64m1_b64(__VA_ARGS__) +#define vmsne_vx_i64m1_b64(...) __riscv_vmsne_vx_i64m1_b64(__VA_ARGS__) +#define vmsne_vv_i64m2_b32(...) __riscv_vmsne_vv_i64m2_b32(__VA_ARGS__) +#define vmsne_vx_i64m2_b32(...) __riscv_vmsne_vx_i64m2_b32(__VA_ARGS__) +#define vmsne_vv_i64m4_b16(...) __riscv_vmsne_vv_i64m4_b16(__VA_ARGS__) +#define vmsne_vx_i64m4_b16(...) __riscv_vmsne_vx_i64m4_b16(__VA_ARGS__) +#define vmsne_vv_i64m8_b8(...) __riscv_vmsne_vv_i64m8_b8(__VA_ARGS__) +#define vmsne_vx_i64m8_b8(...) __riscv_vmsne_vx_i64m8_b8(__VA_ARGS__) +#define vmslt_vv_i8mf8_b64(...) __riscv_vmslt_vv_i8mf8_b64(__VA_ARGS__) +#define vmslt_vx_i8mf8_b64(...) __riscv_vmslt_vx_i8mf8_b64(__VA_ARGS__) +#define vmslt_vv_i8mf4_b32(...) __riscv_vmslt_vv_i8mf4_b32(__VA_ARGS__) +#define vmslt_vx_i8mf4_b32(...) __riscv_vmslt_vx_i8mf4_b32(__VA_ARGS__) +#define vmslt_vv_i8mf2_b16(...) __riscv_vmslt_vv_i8mf2_b16(__VA_ARGS__) +#define vmslt_vx_i8mf2_b16(...) __riscv_vmslt_vx_i8mf2_b16(__VA_ARGS__) +#define vmslt_vv_i8m1_b8(...) __riscv_vmslt_vv_i8m1_b8(__VA_ARGS__) +#define vmslt_vx_i8m1_b8(...) __riscv_vmslt_vx_i8m1_b8(__VA_ARGS__) +#define vmslt_vv_i8m2_b4(...) __riscv_vmslt_vv_i8m2_b4(__VA_ARGS__) +#define vmslt_vx_i8m2_b4(...) __riscv_vmslt_vx_i8m2_b4(__VA_ARGS__) +#define vmslt_vv_i8m4_b2(...) __riscv_vmslt_vv_i8m4_b2(__VA_ARGS__) +#define vmslt_vx_i8m4_b2(...) __riscv_vmslt_vx_i8m4_b2(__VA_ARGS__) +#define vmslt_vv_i8m8_b1(...) __riscv_vmslt_vv_i8m8_b1(__VA_ARGS__) +#define vmslt_vx_i8m8_b1(...) __riscv_vmslt_vx_i8m8_b1(__VA_ARGS__) +#define vmslt_vv_i16mf4_b64(...) __riscv_vmslt_vv_i16mf4_b64(__VA_ARGS__) +#define vmslt_vx_i16mf4_b64(...) __riscv_vmslt_vx_i16mf4_b64(__VA_ARGS__) +#define vmslt_vv_i16mf2_b32(...) __riscv_vmslt_vv_i16mf2_b32(__VA_ARGS__) +#define vmslt_vx_i16mf2_b32(...) __riscv_vmslt_vx_i16mf2_b32(__VA_ARGS__) +#define vmslt_vv_i16m1_b16(...) __riscv_vmslt_vv_i16m1_b16(__VA_ARGS__) +#define vmslt_vx_i16m1_b16(...) __riscv_vmslt_vx_i16m1_b16(__VA_ARGS__) +#define vmslt_vv_i16m2_b8(...) __riscv_vmslt_vv_i16m2_b8(__VA_ARGS__) +#define vmslt_vx_i16m2_b8(...) __riscv_vmslt_vx_i16m2_b8(__VA_ARGS__) +#define vmslt_vv_i16m4_b4(...) __riscv_vmslt_vv_i16m4_b4(__VA_ARGS__) +#define vmslt_vx_i16m4_b4(...) __riscv_vmslt_vx_i16m4_b4(__VA_ARGS__) +#define vmslt_vv_i16m8_b2(...) __riscv_vmslt_vv_i16m8_b2(__VA_ARGS__) +#define vmslt_vx_i16m8_b2(...) __riscv_vmslt_vx_i16m8_b2(__VA_ARGS__) +#define vmslt_vv_i32mf2_b64(...) __riscv_vmslt_vv_i32mf2_b64(__VA_ARGS__) +#define vmslt_vx_i32mf2_b64(...) __riscv_vmslt_vx_i32mf2_b64(__VA_ARGS__) +#define vmslt_vv_i32m1_b32(...) __riscv_vmslt_vv_i32m1_b32(__VA_ARGS__) +#define vmslt_vx_i32m1_b32(...) __riscv_vmslt_vx_i32m1_b32(__VA_ARGS__) +#define vmslt_vv_i32m2_b16(...) __riscv_vmslt_vv_i32m2_b16(__VA_ARGS__) +#define vmslt_vx_i32m2_b16(...) __riscv_vmslt_vx_i32m2_b16(__VA_ARGS__) +#define vmslt_vv_i32m4_b8(...) __riscv_vmslt_vv_i32m4_b8(__VA_ARGS__) +#define vmslt_vx_i32m4_b8(...) __riscv_vmslt_vx_i32m4_b8(__VA_ARGS__) +#define vmslt_vv_i32m8_b4(...) __riscv_vmslt_vv_i32m8_b4(__VA_ARGS__) +#define vmslt_vx_i32m8_b4(...) __riscv_vmslt_vx_i32m8_b4(__VA_ARGS__) +#define vmslt_vv_i64m1_b64(...) __riscv_vmslt_vv_i64m1_b64(__VA_ARGS__) +#define vmslt_vx_i64m1_b64(...) __riscv_vmslt_vx_i64m1_b64(__VA_ARGS__) +#define vmslt_vv_i64m2_b32(...) __riscv_vmslt_vv_i64m2_b32(__VA_ARGS__) +#define vmslt_vx_i64m2_b32(...) __riscv_vmslt_vx_i64m2_b32(__VA_ARGS__) +#define vmslt_vv_i64m4_b16(...) __riscv_vmslt_vv_i64m4_b16(__VA_ARGS__) +#define vmslt_vx_i64m4_b16(...) __riscv_vmslt_vx_i64m4_b16(__VA_ARGS__) +#define vmslt_vv_i64m8_b8(...) __riscv_vmslt_vv_i64m8_b8(__VA_ARGS__) +#define vmslt_vx_i64m8_b8(...) __riscv_vmslt_vx_i64m8_b8(__VA_ARGS__) +#define vmsle_vv_i8mf8_b64(...) __riscv_vmsle_vv_i8mf8_b64(__VA_ARGS__) +#define vmsle_vx_i8mf8_b64(...) __riscv_vmsle_vx_i8mf8_b64(__VA_ARGS__) +#define vmsle_vv_i8mf4_b32(...) __riscv_vmsle_vv_i8mf4_b32(__VA_ARGS__) +#define vmsle_vx_i8mf4_b32(...) __riscv_vmsle_vx_i8mf4_b32(__VA_ARGS__) +#define vmsle_vv_i8mf2_b16(...) __riscv_vmsle_vv_i8mf2_b16(__VA_ARGS__) +#define vmsle_vx_i8mf2_b16(...) __riscv_vmsle_vx_i8mf2_b16(__VA_ARGS__) +#define vmsle_vv_i8m1_b8(...) __riscv_vmsle_vv_i8m1_b8(__VA_ARGS__) +#define vmsle_vx_i8m1_b8(...) __riscv_vmsle_vx_i8m1_b8(__VA_ARGS__) +#define vmsle_vv_i8m2_b4(...) __riscv_vmsle_vv_i8m2_b4(__VA_ARGS__) +#define vmsle_vx_i8m2_b4(...) __riscv_vmsle_vx_i8m2_b4(__VA_ARGS__) +#define vmsle_vv_i8m4_b2(...) __riscv_vmsle_vv_i8m4_b2(__VA_ARGS__) +#define vmsle_vx_i8m4_b2(...) __riscv_vmsle_vx_i8m4_b2(__VA_ARGS__) +#define vmsle_vv_i8m8_b1(...) __riscv_vmsle_vv_i8m8_b1(__VA_ARGS__) +#define vmsle_vx_i8m8_b1(...) __riscv_vmsle_vx_i8m8_b1(__VA_ARGS__) +#define vmsle_vv_i16mf4_b64(...) __riscv_vmsle_vv_i16mf4_b64(__VA_ARGS__) +#define vmsle_vx_i16mf4_b64(...) __riscv_vmsle_vx_i16mf4_b64(__VA_ARGS__) +#define vmsle_vv_i16mf2_b32(...) __riscv_vmsle_vv_i16mf2_b32(__VA_ARGS__) +#define vmsle_vx_i16mf2_b32(...) __riscv_vmsle_vx_i16mf2_b32(__VA_ARGS__) +#define vmsle_vv_i16m1_b16(...) __riscv_vmsle_vv_i16m1_b16(__VA_ARGS__) +#define vmsle_vx_i16m1_b16(...) __riscv_vmsle_vx_i16m1_b16(__VA_ARGS__) +#define vmsle_vv_i16m2_b8(...) __riscv_vmsle_vv_i16m2_b8(__VA_ARGS__) +#define vmsle_vx_i16m2_b8(...) __riscv_vmsle_vx_i16m2_b8(__VA_ARGS__) +#define vmsle_vv_i16m4_b4(...) __riscv_vmsle_vv_i16m4_b4(__VA_ARGS__) +#define vmsle_vx_i16m4_b4(...) __riscv_vmsle_vx_i16m4_b4(__VA_ARGS__) +#define vmsle_vv_i16m8_b2(...) __riscv_vmsle_vv_i16m8_b2(__VA_ARGS__) +#define vmsle_vx_i16m8_b2(...) __riscv_vmsle_vx_i16m8_b2(__VA_ARGS__) +#define vmsle_vv_i32mf2_b64(...) __riscv_vmsle_vv_i32mf2_b64(__VA_ARGS__) +#define vmsle_vx_i32mf2_b64(...) __riscv_vmsle_vx_i32mf2_b64(__VA_ARGS__) +#define vmsle_vv_i32m1_b32(...) __riscv_vmsle_vv_i32m1_b32(__VA_ARGS__) +#define vmsle_vx_i32m1_b32(...) __riscv_vmsle_vx_i32m1_b32(__VA_ARGS__) +#define vmsle_vv_i32m2_b16(...) __riscv_vmsle_vv_i32m2_b16(__VA_ARGS__) +#define vmsle_vx_i32m2_b16(...) __riscv_vmsle_vx_i32m2_b16(__VA_ARGS__) +#define vmsle_vv_i32m4_b8(...) __riscv_vmsle_vv_i32m4_b8(__VA_ARGS__) +#define vmsle_vx_i32m4_b8(...) __riscv_vmsle_vx_i32m4_b8(__VA_ARGS__) +#define vmsle_vv_i32m8_b4(...) __riscv_vmsle_vv_i32m8_b4(__VA_ARGS__) +#define vmsle_vx_i32m8_b4(...) __riscv_vmsle_vx_i32m8_b4(__VA_ARGS__) +#define vmsle_vv_i64m1_b64(...) __riscv_vmsle_vv_i64m1_b64(__VA_ARGS__) +#define vmsle_vx_i64m1_b64(...) __riscv_vmsle_vx_i64m1_b64(__VA_ARGS__) +#define vmsle_vv_i64m2_b32(...) __riscv_vmsle_vv_i64m2_b32(__VA_ARGS__) +#define vmsle_vx_i64m2_b32(...) __riscv_vmsle_vx_i64m2_b32(__VA_ARGS__) +#define vmsle_vv_i64m4_b16(...) __riscv_vmsle_vv_i64m4_b16(__VA_ARGS__) +#define vmsle_vx_i64m4_b16(...) __riscv_vmsle_vx_i64m4_b16(__VA_ARGS__) +#define vmsle_vv_i64m8_b8(...) __riscv_vmsle_vv_i64m8_b8(__VA_ARGS__) +#define vmsle_vx_i64m8_b8(...) __riscv_vmsle_vx_i64m8_b8(__VA_ARGS__) +#define vmsgt_vv_i8mf8_b64(...) __riscv_vmsgt_vv_i8mf8_b64(__VA_ARGS__) +#define vmsgt_vx_i8mf8_b64(...) __riscv_vmsgt_vx_i8mf8_b64(__VA_ARGS__) +#define vmsgt_vv_i8mf4_b32(...) __riscv_vmsgt_vv_i8mf4_b32(__VA_ARGS__) +#define vmsgt_vx_i8mf4_b32(...) __riscv_vmsgt_vx_i8mf4_b32(__VA_ARGS__) +#define vmsgt_vv_i8mf2_b16(...) __riscv_vmsgt_vv_i8mf2_b16(__VA_ARGS__) +#define vmsgt_vx_i8mf2_b16(...) __riscv_vmsgt_vx_i8mf2_b16(__VA_ARGS__) +#define vmsgt_vv_i8m1_b8(...) __riscv_vmsgt_vv_i8m1_b8(__VA_ARGS__) +#define vmsgt_vx_i8m1_b8(...) __riscv_vmsgt_vx_i8m1_b8(__VA_ARGS__) +#define vmsgt_vv_i8m2_b4(...) __riscv_vmsgt_vv_i8m2_b4(__VA_ARGS__) +#define vmsgt_vx_i8m2_b4(...) __riscv_vmsgt_vx_i8m2_b4(__VA_ARGS__) +#define vmsgt_vv_i8m4_b2(...) __riscv_vmsgt_vv_i8m4_b2(__VA_ARGS__) +#define vmsgt_vx_i8m4_b2(...) __riscv_vmsgt_vx_i8m4_b2(__VA_ARGS__) +#define vmsgt_vv_i8m8_b1(...) __riscv_vmsgt_vv_i8m8_b1(__VA_ARGS__) +#define vmsgt_vx_i8m8_b1(...) __riscv_vmsgt_vx_i8m8_b1(__VA_ARGS__) +#define vmsgt_vv_i16mf4_b64(...) __riscv_vmsgt_vv_i16mf4_b64(__VA_ARGS__) +#define vmsgt_vx_i16mf4_b64(...) __riscv_vmsgt_vx_i16mf4_b64(__VA_ARGS__) +#define vmsgt_vv_i16mf2_b32(...) __riscv_vmsgt_vv_i16mf2_b32(__VA_ARGS__) +#define vmsgt_vx_i16mf2_b32(...) __riscv_vmsgt_vx_i16mf2_b32(__VA_ARGS__) +#define vmsgt_vv_i16m1_b16(...) __riscv_vmsgt_vv_i16m1_b16(__VA_ARGS__) +#define vmsgt_vx_i16m1_b16(...) __riscv_vmsgt_vx_i16m1_b16(__VA_ARGS__) +#define vmsgt_vv_i16m2_b8(...) __riscv_vmsgt_vv_i16m2_b8(__VA_ARGS__) +#define vmsgt_vx_i16m2_b8(...) __riscv_vmsgt_vx_i16m2_b8(__VA_ARGS__) +#define vmsgt_vv_i16m4_b4(...) __riscv_vmsgt_vv_i16m4_b4(__VA_ARGS__) +#define vmsgt_vx_i16m4_b4(...) __riscv_vmsgt_vx_i16m4_b4(__VA_ARGS__) +#define vmsgt_vv_i16m8_b2(...) __riscv_vmsgt_vv_i16m8_b2(__VA_ARGS__) +#define vmsgt_vx_i16m8_b2(...) __riscv_vmsgt_vx_i16m8_b2(__VA_ARGS__) +#define vmsgt_vv_i32mf2_b64(...) __riscv_vmsgt_vv_i32mf2_b64(__VA_ARGS__) +#define vmsgt_vx_i32mf2_b64(...) __riscv_vmsgt_vx_i32mf2_b64(__VA_ARGS__) +#define vmsgt_vv_i32m1_b32(...) __riscv_vmsgt_vv_i32m1_b32(__VA_ARGS__) +#define vmsgt_vx_i32m1_b32(...) __riscv_vmsgt_vx_i32m1_b32(__VA_ARGS__) +#define vmsgt_vv_i32m2_b16(...) __riscv_vmsgt_vv_i32m2_b16(__VA_ARGS__) +#define vmsgt_vx_i32m2_b16(...) __riscv_vmsgt_vx_i32m2_b16(__VA_ARGS__) +#define vmsgt_vv_i32m4_b8(...) __riscv_vmsgt_vv_i32m4_b8(__VA_ARGS__) +#define vmsgt_vx_i32m4_b8(...) __riscv_vmsgt_vx_i32m4_b8(__VA_ARGS__) +#define vmsgt_vv_i32m8_b4(...) __riscv_vmsgt_vv_i32m8_b4(__VA_ARGS__) +#define vmsgt_vx_i32m8_b4(...) __riscv_vmsgt_vx_i32m8_b4(__VA_ARGS__) +#define vmsgt_vv_i64m1_b64(...) __riscv_vmsgt_vv_i64m1_b64(__VA_ARGS__) +#define vmsgt_vx_i64m1_b64(...) __riscv_vmsgt_vx_i64m1_b64(__VA_ARGS__) +#define vmsgt_vv_i64m2_b32(...) __riscv_vmsgt_vv_i64m2_b32(__VA_ARGS__) +#define vmsgt_vx_i64m2_b32(...) __riscv_vmsgt_vx_i64m2_b32(__VA_ARGS__) +#define vmsgt_vv_i64m4_b16(...) __riscv_vmsgt_vv_i64m4_b16(__VA_ARGS__) +#define vmsgt_vx_i64m4_b16(...) __riscv_vmsgt_vx_i64m4_b16(__VA_ARGS__) +#define vmsgt_vv_i64m8_b8(...) __riscv_vmsgt_vv_i64m8_b8(__VA_ARGS__) +#define vmsgt_vx_i64m8_b8(...) __riscv_vmsgt_vx_i64m8_b8(__VA_ARGS__) +#define vmsge_vv_i8mf8_b64(...) __riscv_vmsge_vv_i8mf8_b64(__VA_ARGS__) +#define vmsge_vx_i8mf8_b64(...) __riscv_vmsge_vx_i8mf8_b64(__VA_ARGS__) +#define vmsge_vv_i8mf4_b32(...) __riscv_vmsge_vv_i8mf4_b32(__VA_ARGS__) +#define vmsge_vx_i8mf4_b32(...) __riscv_vmsge_vx_i8mf4_b32(__VA_ARGS__) +#define vmsge_vv_i8mf2_b16(...) __riscv_vmsge_vv_i8mf2_b16(__VA_ARGS__) +#define vmsge_vx_i8mf2_b16(...) __riscv_vmsge_vx_i8mf2_b16(__VA_ARGS__) +#define vmsge_vv_i8m1_b8(...) __riscv_vmsge_vv_i8m1_b8(__VA_ARGS__) +#define vmsge_vx_i8m1_b8(...) __riscv_vmsge_vx_i8m1_b8(__VA_ARGS__) +#define vmsge_vv_i8m2_b4(...) __riscv_vmsge_vv_i8m2_b4(__VA_ARGS__) +#define vmsge_vx_i8m2_b4(...) __riscv_vmsge_vx_i8m2_b4(__VA_ARGS__) +#define vmsge_vv_i8m4_b2(...) __riscv_vmsge_vv_i8m4_b2(__VA_ARGS__) +#define vmsge_vx_i8m4_b2(...) __riscv_vmsge_vx_i8m4_b2(__VA_ARGS__) +#define vmsge_vv_i8m8_b1(...) __riscv_vmsge_vv_i8m8_b1(__VA_ARGS__) +#define vmsge_vx_i8m8_b1(...) __riscv_vmsge_vx_i8m8_b1(__VA_ARGS__) +#define vmsge_vv_i16mf4_b64(...) __riscv_vmsge_vv_i16mf4_b64(__VA_ARGS__) +#define vmsge_vx_i16mf4_b64(...) __riscv_vmsge_vx_i16mf4_b64(__VA_ARGS__) +#define vmsge_vv_i16mf2_b32(...) __riscv_vmsge_vv_i16mf2_b32(__VA_ARGS__) +#define vmsge_vx_i16mf2_b32(...) __riscv_vmsge_vx_i16mf2_b32(__VA_ARGS__) +#define vmsge_vv_i16m1_b16(...) __riscv_vmsge_vv_i16m1_b16(__VA_ARGS__) +#define vmsge_vx_i16m1_b16(...) __riscv_vmsge_vx_i16m1_b16(__VA_ARGS__) +#define vmsge_vv_i16m2_b8(...) __riscv_vmsge_vv_i16m2_b8(__VA_ARGS__) +#define vmsge_vx_i16m2_b8(...) __riscv_vmsge_vx_i16m2_b8(__VA_ARGS__) +#define vmsge_vv_i16m4_b4(...) __riscv_vmsge_vv_i16m4_b4(__VA_ARGS__) +#define vmsge_vx_i16m4_b4(...) __riscv_vmsge_vx_i16m4_b4(__VA_ARGS__) +#define vmsge_vv_i16m8_b2(...) __riscv_vmsge_vv_i16m8_b2(__VA_ARGS__) +#define vmsge_vx_i16m8_b2(...) __riscv_vmsge_vx_i16m8_b2(__VA_ARGS__) +#define vmsge_vv_i32mf2_b64(...) __riscv_vmsge_vv_i32mf2_b64(__VA_ARGS__) +#define vmsge_vx_i32mf2_b64(...) __riscv_vmsge_vx_i32mf2_b64(__VA_ARGS__) +#define vmsge_vv_i32m1_b32(...) __riscv_vmsge_vv_i32m1_b32(__VA_ARGS__) +#define vmsge_vx_i32m1_b32(...) __riscv_vmsge_vx_i32m1_b32(__VA_ARGS__) +#define vmsge_vv_i32m2_b16(...) __riscv_vmsge_vv_i32m2_b16(__VA_ARGS__) +#define vmsge_vx_i32m2_b16(...) __riscv_vmsge_vx_i32m2_b16(__VA_ARGS__) +#define vmsge_vv_i32m4_b8(...) __riscv_vmsge_vv_i32m4_b8(__VA_ARGS__) +#define vmsge_vx_i32m4_b8(...) __riscv_vmsge_vx_i32m4_b8(__VA_ARGS__) +#define vmsge_vv_i32m8_b4(...) __riscv_vmsge_vv_i32m8_b4(__VA_ARGS__) +#define vmsge_vx_i32m8_b4(...) __riscv_vmsge_vx_i32m8_b4(__VA_ARGS__) +#define vmsge_vv_i64m1_b64(...) __riscv_vmsge_vv_i64m1_b64(__VA_ARGS__) +#define vmsge_vx_i64m1_b64(...) __riscv_vmsge_vx_i64m1_b64(__VA_ARGS__) +#define vmsge_vv_i64m2_b32(...) __riscv_vmsge_vv_i64m2_b32(__VA_ARGS__) +#define vmsge_vx_i64m2_b32(...) __riscv_vmsge_vx_i64m2_b32(__VA_ARGS__) +#define vmsge_vv_i64m4_b16(...) __riscv_vmsge_vv_i64m4_b16(__VA_ARGS__) +#define vmsge_vx_i64m4_b16(...) __riscv_vmsge_vx_i64m4_b16(__VA_ARGS__) +#define vmsge_vv_i64m8_b8(...) __riscv_vmsge_vv_i64m8_b8(__VA_ARGS__) +#define vmsge_vx_i64m8_b8(...) __riscv_vmsge_vx_i64m8_b8(__VA_ARGS__) +#define vmseq_vv_u8mf8_b64(...) __riscv_vmseq_vv_u8mf8_b64(__VA_ARGS__) +#define vmseq_vx_u8mf8_b64(...) __riscv_vmseq_vx_u8mf8_b64(__VA_ARGS__) +#define vmseq_vv_u8mf4_b32(...) __riscv_vmseq_vv_u8mf4_b32(__VA_ARGS__) +#define vmseq_vx_u8mf4_b32(...) __riscv_vmseq_vx_u8mf4_b32(__VA_ARGS__) +#define vmseq_vv_u8mf2_b16(...) __riscv_vmseq_vv_u8mf2_b16(__VA_ARGS__) +#define vmseq_vx_u8mf2_b16(...) __riscv_vmseq_vx_u8mf2_b16(__VA_ARGS__) +#define vmseq_vv_u8m1_b8(...) __riscv_vmseq_vv_u8m1_b8(__VA_ARGS__) +#define vmseq_vx_u8m1_b8(...) __riscv_vmseq_vx_u8m1_b8(__VA_ARGS__) +#define vmseq_vv_u8m2_b4(...) __riscv_vmseq_vv_u8m2_b4(__VA_ARGS__) +#define vmseq_vx_u8m2_b4(...) __riscv_vmseq_vx_u8m2_b4(__VA_ARGS__) +#define vmseq_vv_u8m4_b2(...) __riscv_vmseq_vv_u8m4_b2(__VA_ARGS__) +#define vmseq_vx_u8m4_b2(...) __riscv_vmseq_vx_u8m4_b2(__VA_ARGS__) +#define vmseq_vv_u8m8_b1(...) __riscv_vmseq_vv_u8m8_b1(__VA_ARGS__) +#define vmseq_vx_u8m8_b1(...) __riscv_vmseq_vx_u8m8_b1(__VA_ARGS__) +#define vmseq_vv_u16mf4_b64(...) __riscv_vmseq_vv_u16mf4_b64(__VA_ARGS__) +#define vmseq_vx_u16mf4_b64(...) __riscv_vmseq_vx_u16mf4_b64(__VA_ARGS__) +#define vmseq_vv_u16mf2_b32(...) __riscv_vmseq_vv_u16mf2_b32(__VA_ARGS__) +#define vmseq_vx_u16mf2_b32(...) __riscv_vmseq_vx_u16mf2_b32(__VA_ARGS__) +#define vmseq_vv_u16m1_b16(...) __riscv_vmseq_vv_u16m1_b16(__VA_ARGS__) +#define vmseq_vx_u16m1_b16(...) __riscv_vmseq_vx_u16m1_b16(__VA_ARGS__) +#define vmseq_vv_u16m2_b8(...) __riscv_vmseq_vv_u16m2_b8(__VA_ARGS__) +#define vmseq_vx_u16m2_b8(...) __riscv_vmseq_vx_u16m2_b8(__VA_ARGS__) +#define vmseq_vv_u16m4_b4(...) __riscv_vmseq_vv_u16m4_b4(__VA_ARGS__) +#define vmseq_vx_u16m4_b4(...) __riscv_vmseq_vx_u16m4_b4(__VA_ARGS__) +#define vmseq_vv_u16m8_b2(...) __riscv_vmseq_vv_u16m8_b2(__VA_ARGS__) +#define vmseq_vx_u16m8_b2(...) __riscv_vmseq_vx_u16m8_b2(__VA_ARGS__) +#define vmseq_vv_u32mf2_b64(...) __riscv_vmseq_vv_u32mf2_b64(__VA_ARGS__) +#define vmseq_vx_u32mf2_b64(...) __riscv_vmseq_vx_u32mf2_b64(__VA_ARGS__) +#define vmseq_vv_u32m1_b32(...) __riscv_vmseq_vv_u32m1_b32(__VA_ARGS__) +#define vmseq_vx_u32m1_b32(...) __riscv_vmseq_vx_u32m1_b32(__VA_ARGS__) +#define vmseq_vv_u32m2_b16(...) __riscv_vmseq_vv_u32m2_b16(__VA_ARGS__) +#define vmseq_vx_u32m2_b16(...) __riscv_vmseq_vx_u32m2_b16(__VA_ARGS__) +#define vmseq_vv_u32m4_b8(...) __riscv_vmseq_vv_u32m4_b8(__VA_ARGS__) +#define vmseq_vx_u32m4_b8(...) __riscv_vmseq_vx_u32m4_b8(__VA_ARGS__) +#define vmseq_vv_u32m8_b4(...) __riscv_vmseq_vv_u32m8_b4(__VA_ARGS__) +#define vmseq_vx_u32m8_b4(...) __riscv_vmseq_vx_u32m8_b4(__VA_ARGS__) +#define vmseq_vv_u64m1_b64(...) __riscv_vmseq_vv_u64m1_b64(__VA_ARGS__) +#define vmseq_vx_u64m1_b64(...) __riscv_vmseq_vx_u64m1_b64(__VA_ARGS__) +#define vmseq_vv_u64m2_b32(...) __riscv_vmseq_vv_u64m2_b32(__VA_ARGS__) +#define vmseq_vx_u64m2_b32(...) __riscv_vmseq_vx_u64m2_b32(__VA_ARGS__) +#define vmseq_vv_u64m4_b16(...) __riscv_vmseq_vv_u64m4_b16(__VA_ARGS__) +#define vmseq_vx_u64m4_b16(...) __riscv_vmseq_vx_u64m4_b16(__VA_ARGS__) +#define vmseq_vv_u64m8_b8(...) __riscv_vmseq_vv_u64m8_b8(__VA_ARGS__) +#define vmseq_vx_u64m8_b8(...) __riscv_vmseq_vx_u64m8_b8(__VA_ARGS__) +#define vmsne_vv_u8mf8_b64(...) __riscv_vmsne_vv_u8mf8_b64(__VA_ARGS__) +#define vmsne_vx_u8mf8_b64(...) __riscv_vmsne_vx_u8mf8_b64(__VA_ARGS__) +#define vmsne_vv_u8mf4_b32(...) __riscv_vmsne_vv_u8mf4_b32(__VA_ARGS__) +#define vmsne_vx_u8mf4_b32(...) __riscv_vmsne_vx_u8mf4_b32(__VA_ARGS__) +#define vmsne_vv_u8mf2_b16(...) __riscv_vmsne_vv_u8mf2_b16(__VA_ARGS__) +#define vmsne_vx_u8mf2_b16(...) __riscv_vmsne_vx_u8mf2_b16(__VA_ARGS__) +#define vmsne_vv_u8m1_b8(...) __riscv_vmsne_vv_u8m1_b8(__VA_ARGS__) +#define vmsne_vx_u8m1_b8(...) __riscv_vmsne_vx_u8m1_b8(__VA_ARGS__) +#define vmsne_vv_u8m2_b4(...) __riscv_vmsne_vv_u8m2_b4(__VA_ARGS__) +#define vmsne_vx_u8m2_b4(...) __riscv_vmsne_vx_u8m2_b4(__VA_ARGS__) +#define vmsne_vv_u8m4_b2(...) __riscv_vmsne_vv_u8m4_b2(__VA_ARGS__) +#define vmsne_vx_u8m4_b2(...) __riscv_vmsne_vx_u8m4_b2(__VA_ARGS__) +#define vmsne_vv_u8m8_b1(...) __riscv_vmsne_vv_u8m8_b1(__VA_ARGS__) +#define vmsne_vx_u8m8_b1(...) __riscv_vmsne_vx_u8m8_b1(__VA_ARGS__) +#define vmsne_vv_u16mf4_b64(...) __riscv_vmsne_vv_u16mf4_b64(__VA_ARGS__) +#define vmsne_vx_u16mf4_b64(...) __riscv_vmsne_vx_u16mf4_b64(__VA_ARGS__) +#define vmsne_vv_u16mf2_b32(...) __riscv_vmsne_vv_u16mf2_b32(__VA_ARGS__) +#define vmsne_vx_u16mf2_b32(...) __riscv_vmsne_vx_u16mf2_b32(__VA_ARGS__) +#define vmsne_vv_u16m1_b16(...) __riscv_vmsne_vv_u16m1_b16(__VA_ARGS__) +#define vmsne_vx_u16m1_b16(...) __riscv_vmsne_vx_u16m1_b16(__VA_ARGS__) +#define vmsne_vv_u16m2_b8(...) __riscv_vmsne_vv_u16m2_b8(__VA_ARGS__) +#define vmsne_vx_u16m2_b8(...) __riscv_vmsne_vx_u16m2_b8(__VA_ARGS__) +#define vmsne_vv_u16m4_b4(...) __riscv_vmsne_vv_u16m4_b4(__VA_ARGS__) +#define vmsne_vx_u16m4_b4(...) __riscv_vmsne_vx_u16m4_b4(__VA_ARGS__) +#define vmsne_vv_u16m8_b2(...) __riscv_vmsne_vv_u16m8_b2(__VA_ARGS__) +#define vmsne_vx_u16m8_b2(...) __riscv_vmsne_vx_u16m8_b2(__VA_ARGS__) +#define vmsne_vv_u32mf2_b64(...) __riscv_vmsne_vv_u32mf2_b64(__VA_ARGS__) +#define vmsne_vx_u32mf2_b64(...) __riscv_vmsne_vx_u32mf2_b64(__VA_ARGS__) +#define vmsne_vv_u32m1_b32(...) __riscv_vmsne_vv_u32m1_b32(__VA_ARGS__) +#define vmsne_vx_u32m1_b32(...) __riscv_vmsne_vx_u32m1_b32(__VA_ARGS__) +#define vmsne_vv_u32m2_b16(...) __riscv_vmsne_vv_u32m2_b16(__VA_ARGS__) +#define vmsne_vx_u32m2_b16(...) __riscv_vmsne_vx_u32m2_b16(__VA_ARGS__) +#define vmsne_vv_u32m4_b8(...) __riscv_vmsne_vv_u32m4_b8(__VA_ARGS__) +#define vmsne_vx_u32m4_b8(...) __riscv_vmsne_vx_u32m4_b8(__VA_ARGS__) +#define vmsne_vv_u32m8_b4(...) __riscv_vmsne_vv_u32m8_b4(__VA_ARGS__) +#define vmsne_vx_u32m8_b4(...) __riscv_vmsne_vx_u32m8_b4(__VA_ARGS__) +#define vmsne_vv_u64m1_b64(...) __riscv_vmsne_vv_u64m1_b64(__VA_ARGS__) +#define vmsne_vx_u64m1_b64(...) __riscv_vmsne_vx_u64m1_b64(__VA_ARGS__) +#define vmsne_vv_u64m2_b32(...) __riscv_vmsne_vv_u64m2_b32(__VA_ARGS__) +#define vmsne_vx_u64m2_b32(...) __riscv_vmsne_vx_u64m2_b32(__VA_ARGS__) +#define vmsne_vv_u64m4_b16(...) __riscv_vmsne_vv_u64m4_b16(__VA_ARGS__) +#define vmsne_vx_u64m4_b16(...) __riscv_vmsne_vx_u64m4_b16(__VA_ARGS__) +#define vmsne_vv_u64m8_b8(...) __riscv_vmsne_vv_u64m8_b8(__VA_ARGS__) +#define vmsne_vx_u64m8_b8(...) __riscv_vmsne_vx_u64m8_b8(__VA_ARGS__) +#define vmsltu_vv_u8mf8_b64(...) __riscv_vmsltu_vv_u8mf8_b64(__VA_ARGS__) +#define vmsltu_vx_u8mf8_b64(...) __riscv_vmsltu_vx_u8mf8_b64(__VA_ARGS__) +#define vmsltu_vv_u8mf4_b32(...) __riscv_vmsltu_vv_u8mf4_b32(__VA_ARGS__) +#define vmsltu_vx_u8mf4_b32(...) __riscv_vmsltu_vx_u8mf4_b32(__VA_ARGS__) +#define vmsltu_vv_u8mf2_b16(...) __riscv_vmsltu_vv_u8mf2_b16(__VA_ARGS__) +#define vmsltu_vx_u8mf2_b16(...) __riscv_vmsltu_vx_u8mf2_b16(__VA_ARGS__) +#define vmsltu_vv_u8m1_b8(...) __riscv_vmsltu_vv_u8m1_b8(__VA_ARGS__) +#define vmsltu_vx_u8m1_b8(...) __riscv_vmsltu_vx_u8m1_b8(__VA_ARGS__) +#define vmsltu_vv_u8m2_b4(...) __riscv_vmsltu_vv_u8m2_b4(__VA_ARGS__) +#define vmsltu_vx_u8m2_b4(...) __riscv_vmsltu_vx_u8m2_b4(__VA_ARGS__) +#define vmsltu_vv_u8m4_b2(...) __riscv_vmsltu_vv_u8m4_b2(__VA_ARGS__) +#define vmsltu_vx_u8m4_b2(...) __riscv_vmsltu_vx_u8m4_b2(__VA_ARGS__) +#define vmsltu_vv_u8m8_b1(...) __riscv_vmsltu_vv_u8m8_b1(__VA_ARGS__) +#define vmsltu_vx_u8m8_b1(...) __riscv_vmsltu_vx_u8m8_b1(__VA_ARGS__) +#define vmsltu_vv_u16mf4_b64(...) __riscv_vmsltu_vv_u16mf4_b64(__VA_ARGS__) +#define vmsltu_vx_u16mf4_b64(...) __riscv_vmsltu_vx_u16mf4_b64(__VA_ARGS__) +#define vmsltu_vv_u16mf2_b32(...) __riscv_vmsltu_vv_u16mf2_b32(__VA_ARGS__) +#define vmsltu_vx_u16mf2_b32(...) __riscv_vmsltu_vx_u16mf2_b32(__VA_ARGS__) +#define vmsltu_vv_u16m1_b16(...) __riscv_vmsltu_vv_u16m1_b16(__VA_ARGS__) +#define vmsltu_vx_u16m1_b16(...) __riscv_vmsltu_vx_u16m1_b16(__VA_ARGS__) +#define vmsltu_vv_u16m2_b8(...) __riscv_vmsltu_vv_u16m2_b8(__VA_ARGS__) +#define vmsltu_vx_u16m2_b8(...) __riscv_vmsltu_vx_u16m2_b8(__VA_ARGS__) +#define vmsltu_vv_u16m4_b4(...) __riscv_vmsltu_vv_u16m4_b4(__VA_ARGS__) +#define vmsltu_vx_u16m4_b4(...) __riscv_vmsltu_vx_u16m4_b4(__VA_ARGS__) +#define vmsltu_vv_u16m8_b2(...) __riscv_vmsltu_vv_u16m8_b2(__VA_ARGS__) +#define vmsltu_vx_u16m8_b2(...) __riscv_vmsltu_vx_u16m8_b2(__VA_ARGS__) +#define vmsltu_vv_u32mf2_b64(...) __riscv_vmsltu_vv_u32mf2_b64(__VA_ARGS__) +#define vmsltu_vx_u32mf2_b64(...) __riscv_vmsltu_vx_u32mf2_b64(__VA_ARGS__) +#define vmsltu_vv_u32m1_b32(...) __riscv_vmsltu_vv_u32m1_b32(__VA_ARGS__) +#define vmsltu_vx_u32m1_b32(...) __riscv_vmsltu_vx_u32m1_b32(__VA_ARGS__) +#define vmsltu_vv_u32m2_b16(...) __riscv_vmsltu_vv_u32m2_b16(__VA_ARGS__) +#define vmsltu_vx_u32m2_b16(...) __riscv_vmsltu_vx_u32m2_b16(__VA_ARGS__) +#define vmsltu_vv_u32m4_b8(...) __riscv_vmsltu_vv_u32m4_b8(__VA_ARGS__) +#define vmsltu_vx_u32m4_b8(...) __riscv_vmsltu_vx_u32m4_b8(__VA_ARGS__) +#define vmsltu_vv_u32m8_b4(...) __riscv_vmsltu_vv_u32m8_b4(__VA_ARGS__) +#define vmsltu_vx_u32m8_b4(...) __riscv_vmsltu_vx_u32m8_b4(__VA_ARGS__) +#define vmsltu_vv_u64m1_b64(...) __riscv_vmsltu_vv_u64m1_b64(__VA_ARGS__) +#define vmsltu_vx_u64m1_b64(...) __riscv_vmsltu_vx_u64m1_b64(__VA_ARGS__) +#define vmsltu_vv_u64m2_b32(...) __riscv_vmsltu_vv_u64m2_b32(__VA_ARGS__) +#define vmsltu_vx_u64m2_b32(...) __riscv_vmsltu_vx_u64m2_b32(__VA_ARGS__) +#define vmsltu_vv_u64m4_b16(...) __riscv_vmsltu_vv_u64m4_b16(__VA_ARGS__) +#define vmsltu_vx_u64m4_b16(...) __riscv_vmsltu_vx_u64m4_b16(__VA_ARGS__) +#define vmsltu_vv_u64m8_b8(...) __riscv_vmsltu_vv_u64m8_b8(__VA_ARGS__) +#define vmsltu_vx_u64m8_b8(...) __riscv_vmsltu_vx_u64m8_b8(__VA_ARGS__) +#define vmsleu_vv_u8mf8_b64(...) __riscv_vmsleu_vv_u8mf8_b64(__VA_ARGS__) +#define vmsleu_vx_u8mf8_b64(...) __riscv_vmsleu_vx_u8mf8_b64(__VA_ARGS__) +#define vmsleu_vv_u8mf4_b32(...) __riscv_vmsleu_vv_u8mf4_b32(__VA_ARGS__) +#define vmsleu_vx_u8mf4_b32(...) __riscv_vmsleu_vx_u8mf4_b32(__VA_ARGS__) +#define vmsleu_vv_u8mf2_b16(...) __riscv_vmsleu_vv_u8mf2_b16(__VA_ARGS__) +#define vmsleu_vx_u8mf2_b16(...) __riscv_vmsleu_vx_u8mf2_b16(__VA_ARGS__) +#define vmsleu_vv_u8m1_b8(...) __riscv_vmsleu_vv_u8m1_b8(__VA_ARGS__) +#define vmsleu_vx_u8m1_b8(...) __riscv_vmsleu_vx_u8m1_b8(__VA_ARGS__) +#define vmsleu_vv_u8m2_b4(...) __riscv_vmsleu_vv_u8m2_b4(__VA_ARGS__) +#define vmsleu_vx_u8m2_b4(...) __riscv_vmsleu_vx_u8m2_b4(__VA_ARGS__) +#define vmsleu_vv_u8m4_b2(...) __riscv_vmsleu_vv_u8m4_b2(__VA_ARGS__) +#define vmsleu_vx_u8m4_b2(...) __riscv_vmsleu_vx_u8m4_b2(__VA_ARGS__) +#define vmsleu_vv_u8m8_b1(...) __riscv_vmsleu_vv_u8m8_b1(__VA_ARGS__) +#define vmsleu_vx_u8m8_b1(...) __riscv_vmsleu_vx_u8m8_b1(__VA_ARGS__) +#define vmsleu_vv_u16mf4_b64(...) __riscv_vmsleu_vv_u16mf4_b64(__VA_ARGS__) +#define vmsleu_vx_u16mf4_b64(...) __riscv_vmsleu_vx_u16mf4_b64(__VA_ARGS__) +#define vmsleu_vv_u16mf2_b32(...) __riscv_vmsleu_vv_u16mf2_b32(__VA_ARGS__) +#define vmsleu_vx_u16mf2_b32(...) __riscv_vmsleu_vx_u16mf2_b32(__VA_ARGS__) +#define vmsleu_vv_u16m1_b16(...) __riscv_vmsleu_vv_u16m1_b16(__VA_ARGS__) +#define vmsleu_vx_u16m1_b16(...) __riscv_vmsleu_vx_u16m1_b16(__VA_ARGS__) +#define vmsleu_vv_u16m2_b8(...) __riscv_vmsleu_vv_u16m2_b8(__VA_ARGS__) +#define vmsleu_vx_u16m2_b8(...) __riscv_vmsleu_vx_u16m2_b8(__VA_ARGS__) +#define vmsleu_vv_u16m4_b4(...) __riscv_vmsleu_vv_u16m4_b4(__VA_ARGS__) +#define vmsleu_vx_u16m4_b4(...) __riscv_vmsleu_vx_u16m4_b4(__VA_ARGS__) +#define vmsleu_vv_u16m8_b2(...) __riscv_vmsleu_vv_u16m8_b2(__VA_ARGS__) +#define vmsleu_vx_u16m8_b2(...) __riscv_vmsleu_vx_u16m8_b2(__VA_ARGS__) +#define vmsleu_vv_u32mf2_b64(...) __riscv_vmsleu_vv_u32mf2_b64(__VA_ARGS__) +#define vmsleu_vx_u32mf2_b64(...) __riscv_vmsleu_vx_u32mf2_b64(__VA_ARGS__) +#define vmsleu_vv_u32m1_b32(...) __riscv_vmsleu_vv_u32m1_b32(__VA_ARGS__) +#define vmsleu_vx_u32m1_b32(...) __riscv_vmsleu_vx_u32m1_b32(__VA_ARGS__) +#define vmsleu_vv_u32m2_b16(...) __riscv_vmsleu_vv_u32m2_b16(__VA_ARGS__) +#define vmsleu_vx_u32m2_b16(...) __riscv_vmsleu_vx_u32m2_b16(__VA_ARGS__) +#define vmsleu_vv_u32m4_b8(...) __riscv_vmsleu_vv_u32m4_b8(__VA_ARGS__) +#define vmsleu_vx_u32m4_b8(...) __riscv_vmsleu_vx_u32m4_b8(__VA_ARGS__) +#define vmsleu_vv_u32m8_b4(...) __riscv_vmsleu_vv_u32m8_b4(__VA_ARGS__) +#define vmsleu_vx_u32m8_b4(...) __riscv_vmsleu_vx_u32m8_b4(__VA_ARGS__) +#define vmsleu_vv_u64m1_b64(...) __riscv_vmsleu_vv_u64m1_b64(__VA_ARGS__) +#define vmsleu_vx_u64m1_b64(...) __riscv_vmsleu_vx_u64m1_b64(__VA_ARGS__) +#define vmsleu_vv_u64m2_b32(...) __riscv_vmsleu_vv_u64m2_b32(__VA_ARGS__) +#define vmsleu_vx_u64m2_b32(...) __riscv_vmsleu_vx_u64m2_b32(__VA_ARGS__) +#define vmsleu_vv_u64m4_b16(...) __riscv_vmsleu_vv_u64m4_b16(__VA_ARGS__) +#define vmsleu_vx_u64m4_b16(...) __riscv_vmsleu_vx_u64m4_b16(__VA_ARGS__) +#define vmsleu_vv_u64m8_b8(...) __riscv_vmsleu_vv_u64m8_b8(__VA_ARGS__) +#define vmsleu_vx_u64m8_b8(...) __riscv_vmsleu_vx_u64m8_b8(__VA_ARGS__) +#define vmsgtu_vv_u8mf8_b64(...) __riscv_vmsgtu_vv_u8mf8_b64(__VA_ARGS__) +#define vmsgtu_vx_u8mf8_b64(...) __riscv_vmsgtu_vx_u8mf8_b64(__VA_ARGS__) +#define vmsgtu_vv_u8mf4_b32(...) __riscv_vmsgtu_vv_u8mf4_b32(__VA_ARGS__) +#define vmsgtu_vx_u8mf4_b32(...) __riscv_vmsgtu_vx_u8mf4_b32(__VA_ARGS__) +#define vmsgtu_vv_u8mf2_b16(...) __riscv_vmsgtu_vv_u8mf2_b16(__VA_ARGS__) +#define vmsgtu_vx_u8mf2_b16(...) __riscv_vmsgtu_vx_u8mf2_b16(__VA_ARGS__) +#define vmsgtu_vv_u8m1_b8(...) __riscv_vmsgtu_vv_u8m1_b8(__VA_ARGS__) +#define vmsgtu_vx_u8m1_b8(...) __riscv_vmsgtu_vx_u8m1_b8(__VA_ARGS__) +#define vmsgtu_vv_u8m2_b4(...) __riscv_vmsgtu_vv_u8m2_b4(__VA_ARGS__) +#define vmsgtu_vx_u8m2_b4(...) __riscv_vmsgtu_vx_u8m2_b4(__VA_ARGS__) +#define vmsgtu_vv_u8m4_b2(...) __riscv_vmsgtu_vv_u8m4_b2(__VA_ARGS__) +#define vmsgtu_vx_u8m4_b2(...) __riscv_vmsgtu_vx_u8m4_b2(__VA_ARGS__) +#define vmsgtu_vv_u8m8_b1(...) __riscv_vmsgtu_vv_u8m8_b1(__VA_ARGS__) +#define vmsgtu_vx_u8m8_b1(...) __riscv_vmsgtu_vx_u8m8_b1(__VA_ARGS__) +#define vmsgtu_vv_u16mf4_b64(...) __riscv_vmsgtu_vv_u16mf4_b64(__VA_ARGS__) +#define vmsgtu_vx_u16mf4_b64(...) __riscv_vmsgtu_vx_u16mf4_b64(__VA_ARGS__) +#define vmsgtu_vv_u16mf2_b32(...) __riscv_vmsgtu_vv_u16mf2_b32(__VA_ARGS__) +#define vmsgtu_vx_u16mf2_b32(...) __riscv_vmsgtu_vx_u16mf2_b32(__VA_ARGS__) +#define vmsgtu_vv_u16m1_b16(...) __riscv_vmsgtu_vv_u16m1_b16(__VA_ARGS__) +#define vmsgtu_vx_u16m1_b16(...) __riscv_vmsgtu_vx_u16m1_b16(__VA_ARGS__) +#define vmsgtu_vv_u16m2_b8(...) __riscv_vmsgtu_vv_u16m2_b8(__VA_ARGS__) +#define vmsgtu_vx_u16m2_b8(...) __riscv_vmsgtu_vx_u16m2_b8(__VA_ARGS__) +#define vmsgtu_vv_u16m4_b4(...) __riscv_vmsgtu_vv_u16m4_b4(__VA_ARGS__) +#define vmsgtu_vx_u16m4_b4(...) __riscv_vmsgtu_vx_u16m4_b4(__VA_ARGS__) +#define vmsgtu_vv_u16m8_b2(...) __riscv_vmsgtu_vv_u16m8_b2(__VA_ARGS__) +#define vmsgtu_vx_u16m8_b2(...) __riscv_vmsgtu_vx_u16m8_b2(__VA_ARGS__) +#define vmsgtu_vv_u32mf2_b64(...) __riscv_vmsgtu_vv_u32mf2_b64(__VA_ARGS__) +#define vmsgtu_vx_u32mf2_b64(...) __riscv_vmsgtu_vx_u32mf2_b64(__VA_ARGS__) +#define vmsgtu_vv_u32m1_b32(...) __riscv_vmsgtu_vv_u32m1_b32(__VA_ARGS__) +#define vmsgtu_vx_u32m1_b32(...) __riscv_vmsgtu_vx_u32m1_b32(__VA_ARGS__) +#define vmsgtu_vv_u32m2_b16(...) __riscv_vmsgtu_vv_u32m2_b16(__VA_ARGS__) +#define vmsgtu_vx_u32m2_b16(...) __riscv_vmsgtu_vx_u32m2_b16(__VA_ARGS__) +#define vmsgtu_vv_u32m4_b8(...) __riscv_vmsgtu_vv_u32m4_b8(__VA_ARGS__) +#define vmsgtu_vx_u32m4_b8(...) __riscv_vmsgtu_vx_u32m4_b8(__VA_ARGS__) +#define vmsgtu_vv_u32m8_b4(...) __riscv_vmsgtu_vv_u32m8_b4(__VA_ARGS__) +#define vmsgtu_vx_u32m8_b4(...) __riscv_vmsgtu_vx_u32m8_b4(__VA_ARGS__) +#define vmsgtu_vv_u64m1_b64(...) __riscv_vmsgtu_vv_u64m1_b64(__VA_ARGS__) +#define vmsgtu_vx_u64m1_b64(...) __riscv_vmsgtu_vx_u64m1_b64(__VA_ARGS__) +#define vmsgtu_vv_u64m2_b32(...) __riscv_vmsgtu_vv_u64m2_b32(__VA_ARGS__) +#define vmsgtu_vx_u64m2_b32(...) __riscv_vmsgtu_vx_u64m2_b32(__VA_ARGS__) +#define vmsgtu_vv_u64m4_b16(...) __riscv_vmsgtu_vv_u64m4_b16(__VA_ARGS__) +#define vmsgtu_vx_u64m4_b16(...) __riscv_vmsgtu_vx_u64m4_b16(__VA_ARGS__) +#define vmsgtu_vv_u64m8_b8(...) __riscv_vmsgtu_vv_u64m8_b8(__VA_ARGS__) +#define vmsgtu_vx_u64m8_b8(...) __riscv_vmsgtu_vx_u64m8_b8(__VA_ARGS__) +#define vmsgeu_vv_u8mf8_b64(...) __riscv_vmsgeu_vv_u8mf8_b64(__VA_ARGS__) +#define vmsgeu_vx_u8mf8_b64(...) __riscv_vmsgeu_vx_u8mf8_b64(__VA_ARGS__) +#define vmsgeu_vv_u8mf4_b32(...) __riscv_vmsgeu_vv_u8mf4_b32(__VA_ARGS__) +#define vmsgeu_vx_u8mf4_b32(...) __riscv_vmsgeu_vx_u8mf4_b32(__VA_ARGS__) +#define vmsgeu_vv_u8mf2_b16(...) __riscv_vmsgeu_vv_u8mf2_b16(__VA_ARGS__) +#define vmsgeu_vx_u8mf2_b16(...) __riscv_vmsgeu_vx_u8mf2_b16(__VA_ARGS__) +#define vmsgeu_vv_u8m1_b8(...) __riscv_vmsgeu_vv_u8m1_b8(__VA_ARGS__) +#define vmsgeu_vx_u8m1_b8(...) __riscv_vmsgeu_vx_u8m1_b8(__VA_ARGS__) +#define vmsgeu_vv_u8m2_b4(...) __riscv_vmsgeu_vv_u8m2_b4(__VA_ARGS__) +#define vmsgeu_vx_u8m2_b4(...) __riscv_vmsgeu_vx_u8m2_b4(__VA_ARGS__) +#define vmsgeu_vv_u8m4_b2(...) __riscv_vmsgeu_vv_u8m4_b2(__VA_ARGS__) +#define vmsgeu_vx_u8m4_b2(...) __riscv_vmsgeu_vx_u8m4_b2(__VA_ARGS__) +#define vmsgeu_vv_u8m8_b1(...) __riscv_vmsgeu_vv_u8m8_b1(__VA_ARGS__) +#define vmsgeu_vx_u8m8_b1(...) __riscv_vmsgeu_vx_u8m8_b1(__VA_ARGS__) +#define vmsgeu_vv_u16mf4_b64(...) __riscv_vmsgeu_vv_u16mf4_b64(__VA_ARGS__) +#define vmsgeu_vx_u16mf4_b64(...) __riscv_vmsgeu_vx_u16mf4_b64(__VA_ARGS__) +#define vmsgeu_vv_u16mf2_b32(...) __riscv_vmsgeu_vv_u16mf2_b32(__VA_ARGS__) +#define vmsgeu_vx_u16mf2_b32(...) __riscv_vmsgeu_vx_u16mf2_b32(__VA_ARGS__) +#define vmsgeu_vv_u16m1_b16(...) __riscv_vmsgeu_vv_u16m1_b16(__VA_ARGS__) +#define vmsgeu_vx_u16m1_b16(...) __riscv_vmsgeu_vx_u16m1_b16(__VA_ARGS__) +#define vmsgeu_vv_u16m2_b8(...) __riscv_vmsgeu_vv_u16m2_b8(__VA_ARGS__) +#define vmsgeu_vx_u16m2_b8(...) __riscv_vmsgeu_vx_u16m2_b8(__VA_ARGS__) +#define vmsgeu_vv_u16m4_b4(...) __riscv_vmsgeu_vv_u16m4_b4(__VA_ARGS__) +#define vmsgeu_vx_u16m4_b4(...) __riscv_vmsgeu_vx_u16m4_b4(__VA_ARGS__) +#define vmsgeu_vv_u16m8_b2(...) __riscv_vmsgeu_vv_u16m8_b2(__VA_ARGS__) +#define vmsgeu_vx_u16m8_b2(...) __riscv_vmsgeu_vx_u16m8_b2(__VA_ARGS__) +#define vmsgeu_vv_u32mf2_b64(...) __riscv_vmsgeu_vv_u32mf2_b64(__VA_ARGS__) +#define vmsgeu_vx_u32mf2_b64(...) __riscv_vmsgeu_vx_u32mf2_b64(__VA_ARGS__) +#define vmsgeu_vv_u32m1_b32(...) __riscv_vmsgeu_vv_u32m1_b32(__VA_ARGS__) +#define vmsgeu_vx_u32m1_b32(...) __riscv_vmsgeu_vx_u32m1_b32(__VA_ARGS__) +#define vmsgeu_vv_u32m2_b16(...) __riscv_vmsgeu_vv_u32m2_b16(__VA_ARGS__) +#define vmsgeu_vx_u32m2_b16(...) __riscv_vmsgeu_vx_u32m2_b16(__VA_ARGS__) +#define vmsgeu_vv_u32m4_b8(...) __riscv_vmsgeu_vv_u32m4_b8(__VA_ARGS__) +#define vmsgeu_vx_u32m4_b8(...) __riscv_vmsgeu_vx_u32m4_b8(__VA_ARGS__) +#define vmsgeu_vv_u32m8_b4(...) __riscv_vmsgeu_vv_u32m8_b4(__VA_ARGS__) +#define vmsgeu_vx_u32m8_b4(...) __riscv_vmsgeu_vx_u32m8_b4(__VA_ARGS__) +#define vmsgeu_vv_u64m1_b64(...) __riscv_vmsgeu_vv_u64m1_b64(__VA_ARGS__) +#define vmsgeu_vx_u64m1_b64(...) __riscv_vmsgeu_vx_u64m1_b64(__VA_ARGS__) +#define vmsgeu_vv_u64m2_b32(...) __riscv_vmsgeu_vv_u64m2_b32(__VA_ARGS__) +#define vmsgeu_vx_u64m2_b32(...) __riscv_vmsgeu_vx_u64m2_b32(__VA_ARGS__) +#define vmsgeu_vv_u64m4_b16(...) __riscv_vmsgeu_vv_u64m4_b16(__VA_ARGS__) +#define vmsgeu_vx_u64m4_b16(...) __riscv_vmsgeu_vx_u64m4_b16(__VA_ARGS__) +#define vmsgeu_vv_u64m8_b8(...) __riscv_vmsgeu_vv_u64m8_b8(__VA_ARGS__) +#define vmsgeu_vx_u64m8_b8(...) __riscv_vmsgeu_vx_u64m8_b8(__VA_ARGS__) +// masked functions +#define vmseq_vv_i8mf8_b64_m(...) __riscv_vmseq_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmseq_vx_i8mf8_b64_m(...) __riscv_vmseq_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmseq_vv_i8mf4_b32_m(...) __riscv_vmseq_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmseq_vx_i8mf4_b32_m(...) __riscv_vmseq_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmseq_vv_i8mf2_b16_m(...) __riscv_vmseq_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmseq_vx_i8mf2_b16_m(...) __riscv_vmseq_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmseq_vv_i8m1_b8_m(...) __riscv_vmseq_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmseq_vx_i8m1_b8_m(...) __riscv_vmseq_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmseq_vv_i8m2_b4_m(...) __riscv_vmseq_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmseq_vx_i8m2_b4_m(...) __riscv_vmseq_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmseq_vv_i8m4_b2_m(...) __riscv_vmseq_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmseq_vx_i8m4_b2_m(...) __riscv_vmseq_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmseq_vv_i8m8_b1_m(...) __riscv_vmseq_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmseq_vx_i8m8_b1_m(...) __riscv_vmseq_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmseq_vv_i16mf4_b64_m(...) __riscv_vmseq_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmseq_vx_i16mf4_b64_m(...) __riscv_vmseq_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmseq_vv_i16mf2_b32_m(...) __riscv_vmseq_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmseq_vx_i16mf2_b32_m(...) __riscv_vmseq_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmseq_vv_i16m1_b16_m(...) __riscv_vmseq_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmseq_vx_i16m1_b16_m(...) __riscv_vmseq_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmseq_vv_i16m2_b8_m(...) __riscv_vmseq_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmseq_vx_i16m2_b8_m(...) __riscv_vmseq_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmseq_vv_i16m4_b4_m(...) __riscv_vmseq_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmseq_vx_i16m4_b4_m(...) __riscv_vmseq_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmseq_vv_i16m8_b2_m(...) __riscv_vmseq_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmseq_vx_i16m8_b2_m(...) __riscv_vmseq_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmseq_vv_i32mf2_b64_m(...) __riscv_vmseq_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmseq_vx_i32mf2_b64_m(...) __riscv_vmseq_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmseq_vv_i32m1_b32_m(...) __riscv_vmseq_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmseq_vx_i32m1_b32_m(...) __riscv_vmseq_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmseq_vv_i32m2_b16_m(...) __riscv_vmseq_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmseq_vx_i32m2_b16_m(...) __riscv_vmseq_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmseq_vv_i32m4_b8_m(...) __riscv_vmseq_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmseq_vx_i32m4_b8_m(...) __riscv_vmseq_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmseq_vv_i32m8_b4_m(...) __riscv_vmseq_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmseq_vx_i32m8_b4_m(...) __riscv_vmseq_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmseq_vv_i64m1_b64_m(...) __riscv_vmseq_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmseq_vx_i64m1_b64_m(...) __riscv_vmseq_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmseq_vv_i64m2_b32_m(...) __riscv_vmseq_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmseq_vx_i64m2_b32_m(...) __riscv_vmseq_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmseq_vv_i64m4_b16_m(...) __riscv_vmseq_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmseq_vx_i64m4_b16_m(...) __riscv_vmseq_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmseq_vv_i64m8_b8_m(...) __riscv_vmseq_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmseq_vx_i64m8_b8_m(...) __riscv_vmseq_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmsne_vv_i8mf8_b64_m(...) __riscv_vmsne_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmsne_vx_i8mf8_b64_m(...) __riscv_vmsne_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmsne_vv_i8mf4_b32_m(...) __riscv_vmsne_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmsne_vx_i8mf4_b32_m(...) __riscv_vmsne_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmsne_vv_i8mf2_b16_m(...) __riscv_vmsne_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmsne_vx_i8mf2_b16_m(...) __riscv_vmsne_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmsne_vv_i8m1_b8_m(...) __riscv_vmsne_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmsne_vx_i8m1_b8_m(...) __riscv_vmsne_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmsne_vv_i8m2_b4_m(...) __riscv_vmsne_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmsne_vx_i8m2_b4_m(...) __riscv_vmsne_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmsne_vv_i8m4_b2_m(...) __riscv_vmsne_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmsne_vx_i8m4_b2_m(...) __riscv_vmsne_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmsne_vv_i8m8_b1_m(...) __riscv_vmsne_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmsne_vx_i8m8_b1_m(...) __riscv_vmsne_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmsne_vv_i16mf4_b64_m(...) __riscv_vmsne_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmsne_vx_i16mf4_b64_m(...) __riscv_vmsne_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmsne_vv_i16mf2_b32_m(...) __riscv_vmsne_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmsne_vx_i16mf2_b32_m(...) __riscv_vmsne_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmsne_vv_i16m1_b16_m(...) __riscv_vmsne_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmsne_vx_i16m1_b16_m(...) __riscv_vmsne_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmsne_vv_i16m2_b8_m(...) __riscv_vmsne_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmsne_vx_i16m2_b8_m(...) __riscv_vmsne_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmsne_vv_i16m4_b4_m(...) __riscv_vmsne_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmsne_vx_i16m4_b4_m(...) __riscv_vmsne_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmsne_vv_i16m8_b2_m(...) __riscv_vmsne_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmsne_vx_i16m8_b2_m(...) __riscv_vmsne_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmsne_vv_i32mf2_b64_m(...) __riscv_vmsne_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmsne_vx_i32mf2_b64_m(...) __riscv_vmsne_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmsne_vv_i32m1_b32_m(...) __riscv_vmsne_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmsne_vx_i32m1_b32_m(...) __riscv_vmsne_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmsne_vv_i32m2_b16_m(...) __riscv_vmsne_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmsne_vx_i32m2_b16_m(...) __riscv_vmsne_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmsne_vv_i32m4_b8_m(...) __riscv_vmsne_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmsne_vx_i32m4_b8_m(...) __riscv_vmsne_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmsne_vv_i32m8_b4_m(...) __riscv_vmsne_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmsne_vx_i32m8_b4_m(...) __riscv_vmsne_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmsne_vv_i64m1_b64_m(...) __riscv_vmsne_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmsne_vx_i64m1_b64_m(...) __riscv_vmsne_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmsne_vv_i64m2_b32_m(...) __riscv_vmsne_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmsne_vx_i64m2_b32_m(...) __riscv_vmsne_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmsne_vv_i64m4_b16_m(...) __riscv_vmsne_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmsne_vx_i64m4_b16_m(...) __riscv_vmsne_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmsne_vv_i64m8_b8_m(...) __riscv_vmsne_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmsne_vx_i64m8_b8_m(...) __riscv_vmsne_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmslt_vv_i8mf8_b64_m(...) __riscv_vmslt_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmslt_vx_i8mf8_b64_m(...) __riscv_vmslt_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmslt_vv_i8mf4_b32_m(...) __riscv_vmslt_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmslt_vx_i8mf4_b32_m(...) __riscv_vmslt_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmslt_vv_i8mf2_b16_m(...) __riscv_vmslt_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmslt_vx_i8mf2_b16_m(...) __riscv_vmslt_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmslt_vv_i8m1_b8_m(...) __riscv_vmslt_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmslt_vx_i8m1_b8_m(...) __riscv_vmslt_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmslt_vv_i8m2_b4_m(...) __riscv_vmslt_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmslt_vx_i8m2_b4_m(...) __riscv_vmslt_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmslt_vv_i8m4_b2_m(...) __riscv_vmslt_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmslt_vx_i8m4_b2_m(...) __riscv_vmslt_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmslt_vv_i8m8_b1_m(...) __riscv_vmslt_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmslt_vx_i8m8_b1_m(...) __riscv_vmslt_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmslt_vv_i16mf4_b64_m(...) __riscv_vmslt_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmslt_vx_i16mf4_b64_m(...) __riscv_vmslt_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmslt_vv_i16mf2_b32_m(...) __riscv_vmslt_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmslt_vx_i16mf2_b32_m(...) __riscv_vmslt_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmslt_vv_i16m1_b16_m(...) __riscv_vmslt_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmslt_vx_i16m1_b16_m(...) __riscv_vmslt_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmslt_vv_i16m2_b8_m(...) __riscv_vmslt_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmslt_vx_i16m2_b8_m(...) __riscv_vmslt_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmslt_vv_i16m4_b4_m(...) __riscv_vmslt_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmslt_vx_i16m4_b4_m(...) __riscv_vmslt_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmslt_vv_i16m8_b2_m(...) __riscv_vmslt_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmslt_vx_i16m8_b2_m(...) __riscv_vmslt_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmslt_vv_i32mf2_b64_m(...) __riscv_vmslt_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmslt_vx_i32mf2_b64_m(...) __riscv_vmslt_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmslt_vv_i32m1_b32_m(...) __riscv_vmslt_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmslt_vx_i32m1_b32_m(...) __riscv_vmslt_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmslt_vv_i32m2_b16_m(...) __riscv_vmslt_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmslt_vx_i32m2_b16_m(...) __riscv_vmslt_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmslt_vv_i32m4_b8_m(...) __riscv_vmslt_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmslt_vx_i32m4_b8_m(...) __riscv_vmslt_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmslt_vv_i32m8_b4_m(...) __riscv_vmslt_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmslt_vx_i32m8_b4_m(...) __riscv_vmslt_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmslt_vv_i64m1_b64_m(...) __riscv_vmslt_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmslt_vx_i64m1_b64_m(...) __riscv_vmslt_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmslt_vv_i64m2_b32_m(...) __riscv_vmslt_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmslt_vx_i64m2_b32_m(...) __riscv_vmslt_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmslt_vv_i64m4_b16_m(...) __riscv_vmslt_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmslt_vx_i64m4_b16_m(...) __riscv_vmslt_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmslt_vv_i64m8_b8_m(...) __riscv_vmslt_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmslt_vx_i64m8_b8_m(...) __riscv_vmslt_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmsle_vv_i8mf8_b64_m(...) __riscv_vmsle_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmsle_vx_i8mf8_b64_m(...) __riscv_vmsle_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmsle_vv_i8mf4_b32_m(...) __riscv_vmsle_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmsle_vx_i8mf4_b32_m(...) __riscv_vmsle_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmsle_vv_i8mf2_b16_m(...) __riscv_vmsle_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmsle_vx_i8mf2_b16_m(...) __riscv_vmsle_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmsle_vv_i8m1_b8_m(...) __riscv_vmsle_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmsle_vx_i8m1_b8_m(...) __riscv_vmsle_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmsle_vv_i8m2_b4_m(...) __riscv_vmsle_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmsle_vx_i8m2_b4_m(...) __riscv_vmsle_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmsle_vv_i8m4_b2_m(...) __riscv_vmsle_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmsle_vx_i8m4_b2_m(...) __riscv_vmsle_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmsle_vv_i8m8_b1_m(...) __riscv_vmsle_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmsle_vx_i8m8_b1_m(...) __riscv_vmsle_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmsle_vv_i16mf4_b64_m(...) __riscv_vmsle_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmsle_vx_i16mf4_b64_m(...) __riscv_vmsle_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmsle_vv_i16mf2_b32_m(...) __riscv_vmsle_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmsle_vx_i16mf2_b32_m(...) __riscv_vmsle_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmsle_vv_i16m1_b16_m(...) __riscv_vmsle_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmsle_vx_i16m1_b16_m(...) __riscv_vmsle_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmsle_vv_i16m2_b8_m(...) __riscv_vmsle_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmsle_vx_i16m2_b8_m(...) __riscv_vmsle_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmsle_vv_i16m4_b4_m(...) __riscv_vmsle_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmsle_vx_i16m4_b4_m(...) __riscv_vmsle_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmsle_vv_i16m8_b2_m(...) __riscv_vmsle_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmsle_vx_i16m8_b2_m(...) __riscv_vmsle_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmsle_vv_i32mf2_b64_m(...) __riscv_vmsle_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmsle_vx_i32mf2_b64_m(...) __riscv_vmsle_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmsle_vv_i32m1_b32_m(...) __riscv_vmsle_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmsle_vx_i32m1_b32_m(...) __riscv_vmsle_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmsle_vv_i32m2_b16_m(...) __riscv_vmsle_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmsle_vx_i32m2_b16_m(...) __riscv_vmsle_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmsle_vv_i32m4_b8_m(...) __riscv_vmsle_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmsle_vx_i32m4_b8_m(...) __riscv_vmsle_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmsle_vv_i32m8_b4_m(...) __riscv_vmsle_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmsle_vx_i32m8_b4_m(...) __riscv_vmsle_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmsle_vv_i64m1_b64_m(...) __riscv_vmsle_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmsle_vx_i64m1_b64_m(...) __riscv_vmsle_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmsle_vv_i64m2_b32_m(...) __riscv_vmsle_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmsle_vx_i64m2_b32_m(...) __riscv_vmsle_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmsle_vv_i64m4_b16_m(...) __riscv_vmsle_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmsle_vx_i64m4_b16_m(...) __riscv_vmsle_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmsle_vv_i64m8_b8_m(...) __riscv_vmsle_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmsle_vx_i64m8_b8_m(...) __riscv_vmsle_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmsgt_vv_i8mf8_b64_m(...) __riscv_vmsgt_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmsgt_vx_i8mf8_b64_m(...) __riscv_vmsgt_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmsgt_vv_i8mf4_b32_m(...) __riscv_vmsgt_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmsgt_vx_i8mf4_b32_m(...) __riscv_vmsgt_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmsgt_vv_i8mf2_b16_m(...) __riscv_vmsgt_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmsgt_vx_i8mf2_b16_m(...) __riscv_vmsgt_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmsgt_vv_i8m1_b8_m(...) __riscv_vmsgt_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmsgt_vx_i8m1_b8_m(...) __riscv_vmsgt_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmsgt_vv_i8m2_b4_m(...) __riscv_vmsgt_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmsgt_vx_i8m2_b4_m(...) __riscv_vmsgt_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmsgt_vv_i8m4_b2_m(...) __riscv_vmsgt_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmsgt_vx_i8m4_b2_m(...) __riscv_vmsgt_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmsgt_vv_i8m8_b1_m(...) __riscv_vmsgt_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmsgt_vx_i8m8_b1_m(...) __riscv_vmsgt_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmsgt_vv_i16mf4_b64_m(...) __riscv_vmsgt_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmsgt_vx_i16mf4_b64_m(...) __riscv_vmsgt_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmsgt_vv_i16mf2_b32_m(...) __riscv_vmsgt_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmsgt_vx_i16mf2_b32_m(...) __riscv_vmsgt_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmsgt_vv_i16m1_b16_m(...) __riscv_vmsgt_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmsgt_vx_i16m1_b16_m(...) __riscv_vmsgt_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmsgt_vv_i16m2_b8_m(...) __riscv_vmsgt_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmsgt_vx_i16m2_b8_m(...) __riscv_vmsgt_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmsgt_vv_i16m4_b4_m(...) __riscv_vmsgt_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmsgt_vx_i16m4_b4_m(...) __riscv_vmsgt_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmsgt_vv_i16m8_b2_m(...) __riscv_vmsgt_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmsgt_vx_i16m8_b2_m(...) __riscv_vmsgt_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmsgt_vv_i32mf2_b64_m(...) __riscv_vmsgt_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmsgt_vx_i32mf2_b64_m(...) __riscv_vmsgt_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmsgt_vv_i32m1_b32_m(...) __riscv_vmsgt_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmsgt_vx_i32m1_b32_m(...) __riscv_vmsgt_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmsgt_vv_i32m2_b16_m(...) __riscv_vmsgt_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmsgt_vx_i32m2_b16_m(...) __riscv_vmsgt_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmsgt_vv_i32m4_b8_m(...) __riscv_vmsgt_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmsgt_vx_i32m4_b8_m(...) __riscv_vmsgt_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmsgt_vv_i32m8_b4_m(...) __riscv_vmsgt_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmsgt_vx_i32m8_b4_m(...) __riscv_vmsgt_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmsgt_vv_i64m1_b64_m(...) __riscv_vmsgt_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmsgt_vx_i64m1_b64_m(...) __riscv_vmsgt_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmsgt_vv_i64m2_b32_m(...) __riscv_vmsgt_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmsgt_vx_i64m2_b32_m(...) __riscv_vmsgt_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmsgt_vv_i64m4_b16_m(...) __riscv_vmsgt_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmsgt_vx_i64m4_b16_m(...) __riscv_vmsgt_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmsgt_vv_i64m8_b8_m(...) __riscv_vmsgt_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmsgt_vx_i64m8_b8_m(...) __riscv_vmsgt_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmsge_vv_i8mf8_b64_m(...) __riscv_vmsge_vv_i8mf8_b64_mu(__VA_ARGS__) +#define vmsge_vx_i8mf8_b64_m(...) __riscv_vmsge_vx_i8mf8_b64_mu(__VA_ARGS__) +#define vmsge_vv_i8mf4_b32_m(...) __riscv_vmsge_vv_i8mf4_b32_mu(__VA_ARGS__) +#define vmsge_vx_i8mf4_b32_m(...) __riscv_vmsge_vx_i8mf4_b32_mu(__VA_ARGS__) +#define vmsge_vv_i8mf2_b16_m(...) __riscv_vmsge_vv_i8mf2_b16_mu(__VA_ARGS__) +#define vmsge_vx_i8mf2_b16_m(...) __riscv_vmsge_vx_i8mf2_b16_mu(__VA_ARGS__) +#define vmsge_vv_i8m1_b8_m(...) __riscv_vmsge_vv_i8m1_b8_mu(__VA_ARGS__) +#define vmsge_vx_i8m1_b8_m(...) __riscv_vmsge_vx_i8m1_b8_mu(__VA_ARGS__) +#define vmsge_vv_i8m2_b4_m(...) __riscv_vmsge_vv_i8m2_b4_mu(__VA_ARGS__) +#define vmsge_vx_i8m2_b4_m(...) __riscv_vmsge_vx_i8m2_b4_mu(__VA_ARGS__) +#define vmsge_vv_i8m4_b2_m(...) __riscv_vmsge_vv_i8m4_b2_mu(__VA_ARGS__) +#define vmsge_vx_i8m4_b2_m(...) __riscv_vmsge_vx_i8m4_b2_mu(__VA_ARGS__) +#define vmsge_vv_i8m8_b1_m(...) __riscv_vmsge_vv_i8m8_b1_mu(__VA_ARGS__) +#define vmsge_vx_i8m8_b1_m(...) __riscv_vmsge_vx_i8m8_b1_mu(__VA_ARGS__) +#define vmsge_vv_i16mf4_b64_m(...) __riscv_vmsge_vv_i16mf4_b64_mu(__VA_ARGS__) +#define vmsge_vx_i16mf4_b64_m(...) __riscv_vmsge_vx_i16mf4_b64_mu(__VA_ARGS__) +#define vmsge_vv_i16mf2_b32_m(...) __riscv_vmsge_vv_i16mf2_b32_mu(__VA_ARGS__) +#define vmsge_vx_i16mf2_b32_m(...) __riscv_vmsge_vx_i16mf2_b32_mu(__VA_ARGS__) +#define vmsge_vv_i16m1_b16_m(...) __riscv_vmsge_vv_i16m1_b16_mu(__VA_ARGS__) +#define vmsge_vx_i16m1_b16_m(...) __riscv_vmsge_vx_i16m1_b16_mu(__VA_ARGS__) +#define vmsge_vv_i16m2_b8_m(...) __riscv_vmsge_vv_i16m2_b8_mu(__VA_ARGS__) +#define vmsge_vx_i16m2_b8_m(...) __riscv_vmsge_vx_i16m2_b8_mu(__VA_ARGS__) +#define vmsge_vv_i16m4_b4_m(...) __riscv_vmsge_vv_i16m4_b4_mu(__VA_ARGS__) +#define vmsge_vx_i16m4_b4_m(...) __riscv_vmsge_vx_i16m4_b4_mu(__VA_ARGS__) +#define vmsge_vv_i16m8_b2_m(...) __riscv_vmsge_vv_i16m8_b2_mu(__VA_ARGS__) +#define vmsge_vx_i16m8_b2_m(...) __riscv_vmsge_vx_i16m8_b2_mu(__VA_ARGS__) +#define vmsge_vv_i32mf2_b64_m(...) __riscv_vmsge_vv_i32mf2_b64_mu(__VA_ARGS__) +#define vmsge_vx_i32mf2_b64_m(...) __riscv_vmsge_vx_i32mf2_b64_mu(__VA_ARGS__) +#define vmsge_vv_i32m1_b32_m(...) __riscv_vmsge_vv_i32m1_b32_mu(__VA_ARGS__) +#define vmsge_vx_i32m1_b32_m(...) __riscv_vmsge_vx_i32m1_b32_mu(__VA_ARGS__) +#define vmsge_vv_i32m2_b16_m(...) __riscv_vmsge_vv_i32m2_b16_mu(__VA_ARGS__) +#define vmsge_vx_i32m2_b16_m(...) __riscv_vmsge_vx_i32m2_b16_mu(__VA_ARGS__) +#define vmsge_vv_i32m4_b8_m(...) __riscv_vmsge_vv_i32m4_b8_mu(__VA_ARGS__) +#define vmsge_vx_i32m4_b8_m(...) __riscv_vmsge_vx_i32m4_b8_mu(__VA_ARGS__) +#define vmsge_vv_i32m8_b4_m(...) __riscv_vmsge_vv_i32m8_b4_mu(__VA_ARGS__) +#define vmsge_vx_i32m8_b4_m(...) __riscv_vmsge_vx_i32m8_b4_mu(__VA_ARGS__) +#define vmsge_vv_i64m1_b64_m(...) __riscv_vmsge_vv_i64m1_b64_mu(__VA_ARGS__) +#define vmsge_vx_i64m1_b64_m(...) __riscv_vmsge_vx_i64m1_b64_mu(__VA_ARGS__) +#define vmsge_vv_i64m2_b32_m(...) __riscv_vmsge_vv_i64m2_b32_mu(__VA_ARGS__) +#define vmsge_vx_i64m2_b32_m(...) __riscv_vmsge_vx_i64m2_b32_mu(__VA_ARGS__) +#define vmsge_vv_i64m4_b16_m(...) __riscv_vmsge_vv_i64m4_b16_mu(__VA_ARGS__) +#define vmsge_vx_i64m4_b16_m(...) __riscv_vmsge_vx_i64m4_b16_mu(__VA_ARGS__) +#define vmsge_vv_i64m8_b8_m(...) __riscv_vmsge_vv_i64m8_b8_mu(__VA_ARGS__) +#define vmsge_vx_i64m8_b8_m(...) __riscv_vmsge_vx_i64m8_b8_mu(__VA_ARGS__) +#define vmseq_vv_u8mf8_b64_m(...) __riscv_vmseq_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmseq_vx_u8mf8_b64_m(...) __riscv_vmseq_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmseq_vv_u8mf4_b32_m(...) __riscv_vmseq_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmseq_vx_u8mf4_b32_m(...) __riscv_vmseq_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmseq_vv_u8mf2_b16_m(...) __riscv_vmseq_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmseq_vx_u8mf2_b16_m(...) __riscv_vmseq_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmseq_vv_u8m1_b8_m(...) __riscv_vmseq_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmseq_vx_u8m1_b8_m(...) __riscv_vmseq_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmseq_vv_u8m2_b4_m(...) __riscv_vmseq_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmseq_vx_u8m2_b4_m(...) __riscv_vmseq_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmseq_vv_u8m4_b2_m(...) __riscv_vmseq_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmseq_vx_u8m4_b2_m(...) __riscv_vmseq_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmseq_vv_u8m8_b1_m(...) __riscv_vmseq_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmseq_vx_u8m8_b1_m(...) __riscv_vmseq_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmseq_vv_u16mf4_b64_m(...) __riscv_vmseq_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmseq_vx_u16mf4_b64_m(...) __riscv_vmseq_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmseq_vv_u16mf2_b32_m(...) __riscv_vmseq_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmseq_vx_u16mf2_b32_m(...) __riscv_vmseq_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmseq_vv_u16m1_b16_m(...) __riscv_vmseq_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmseq_vx_u16m1_b16_m(...) __riscv_vmseq_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmseq_vv_u16m2_b8_m(...) __riscv_vmseq_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmseq_vx_u16m2_b8_m(...) __riscv_vmseq_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmseq_vv_u16m4_b4_m(...) __riscv_vmseq_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmseq_vx_u16m4_b4_m(...) __riscv_vmseq_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmseq_vv_u16m8_b2_m(...) __riscv_vmseq_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmseq_vx_u16m8_b2_m(...) __riscv_vmseq_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmseq_vv_u32mf2_b64_m(...) __riscv_vmseq_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmseq_vx_u32mf2_b64_m(...) __riscv_vmseq_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmseq_vv_u32m1_b32_m(...) __riscv_vmseq_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmseq_vx_u32m1_b32_m(...) __riscv_vmseq_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmseq_vv_u32m2_b16_m(...) __riscv_vmseq_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmseq_vx_u32m2_b16_m(...) __riscv_vmseq_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmseq_vv_u32m4_b8_m(...) __riscv_vmseq_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmseq_vx_u32m4_b8_m(...) __riscv_vmseq_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmseq_vv_u32m8_b4_m(...) __riscv_vmseq_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmseq_vx_u32m8_b4_m(...) __riscv_vmseq_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmseq_vv_u64m1_b64_m(...) __riscv_vmseq_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmseq_vx_u64m1_b64_m(...) __riscv_vmseq_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmseq_vv_u64m2_b32_m(...) __riscv_vmseq_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmseq_vx_u64m2_b32_m(...) __riscv_vmseq_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmseq_vv_u64m4_b16_m(...) __riscv_vmseq_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmseq_vx_u64m4_b16_m(...) __riscv_vmseq_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmseq_vv_u64m8_b8_m(...) __riscv_vmseq_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmseq_vx_u64m8_b8_m(...) __riscv_vmseq_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmsne_vv_u8mf8_b64_m(...) __riscv_vmsne_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmsne_vx_u8mf8_b64_m(...) __riscv_vmsne_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmsne_vv_u8mf4_b32_m(...) __riscv_vmsne_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmsne_vx_u8mf4_b32_m(...) __riscv_vmsne_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmsne_vv_u8mf2_b16_m(...) __riscv_vmsne_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmsne_vx_u8mf2_b16_m(...) __riscv_vmsne_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmsne_vv_u8m1_b8_m(...) __riscv_vmsne_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmsne_vx_u8m1_b8_m(...) __riscv_vmsne_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmsne_vv_u8m2_b4_m(...) __riscv_vmsne_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmsne_vx_u8m2_b4_m(...) __riscv_vmsne_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmsne_vv_u8m4_b2_m(...) __riscv_vmsne_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmsne_vx_u8m4_b2_m(...) __riscv_vmsne_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmsne_vv_u8m8_b1_m(...) __riscv_vmsne_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmsne_vx_u8m8_b1_m(...) __riscv_vmsne_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmsne_vv_u16mf4_b64_m(...) __riscv_vmsne_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmsne_vx_u16mf4_b64_m(...) __riscv_vmsne_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmsne_vv_u16mf2_b32_m(...) __riscv_vmsne_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmsne_vx_u16mf2_b32_m(...) __riscv_vmsne_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmsne_vv_u16m1_b16_m(...) __riscv_vmsne_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmsne_vx_u16m1_b16_m(...) __riscv_vmsne_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmsne_vv_u16m2_b8_m(...) __riscv_vmsne_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmsne_vx_u16m2_b8_m(...) __riscv_vmsne_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmsne_vv_u16m4_b4_m(...) __riscv_vmsne_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmsne_vx_u16m4_b4_m(...) __riscv_vmsne_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmsne_vv_u16m8_b2_m(...) __riscv_vmsne_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmsne_vx_u16m8_b2_m(...) __riscv_vmsne_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmsne_vv_u32mf2_b64_m(...) __riscv_vmsne_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmsne_vx_u32mf2_b64_m(...) __riscv_vmsne_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmsne_vv_u32m1_b32_m(...) __riscv_vmsne_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmsne_vx_u32m1_b32_m(...) __riscv_vmsne_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmsne_vv_u32m2_b16_m(...) __riscv_vmsne_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmsne_vx_u32m2_b16_m(...) __riscv_vmsne_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmsne_vv_u32m4_b8_m(...) __riscv_vmsne_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmsne_vx_u32m4_b8_m(...) __riscv_vmsne_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmsne_vv_u32m8_b4_m(...) __riscv_vmsne_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmsne_vx_u32m8_b4_m(...) __riscv_vmsne_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmsne_vv_u64m1_b64_m(...) __riscv_vmsne_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmsne_vx_u64m1_b64_m(...) __riscv_vmsne_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmsne_vv_u64m2_b32_m(...) __riscv_vmsne_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmsne_vx_u64m2_b32_m(...) __riscv_vmsne_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmsne_vv_u64m4_b16_m(...) __riscv_vmsne_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmsne_vx_u64m4_b16_m(...) __riscv_vmsne_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmsne_vv_u64m8_b8_m(...) __riscv_vmsne_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmsne_vx_u64m8_b8_m(...) __riscv_vmsne_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmsltu_vv_u8mf8_b64_m(...) __riscv_vmsltu_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmsltu_vx_u8mf8_b64_m(...) __riscv_vmsltu_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmsltu_vv_u8mf4_b32_m(...) __riscv_vmsltu_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmsltu_vx_u8mf4_b32_m(...) __riscv_vmsltu_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmsltu_vv_u8mf2_b16_m(...) __riscv_vmsltu_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmsltu_vx_u8mf2_b16_m(...) __riscv_vmsltu_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmsltu_vv_u8m1_b8_m(...) __riscv_vmsltu_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmsltu_vx_u8m1_b8_m(...) __riscv_vmsltu_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmsltu_vv_u8m2_b4_m(...) __riscv_vmsltu_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmsltu_vx_u8m2_b4_m(...) __riscv_vmsltu_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmsltu_vv_u8m4_b2_m(...) __riscv_vmsltu_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmsltu_vx_u8m4_b2_m(...) __riscv_vmsltu_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmsltu_vv_u8m8_b1_m(...) __riscv_vmsltu_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmsltu_vx_u8m8_b1_m(...) __riscv_vmsltu_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmsltu_vv_u16mf4_b64_m(...) __riscv_vmsltu_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmsltu_vx_u16mf4_b64_m(...) __riscv_vmsltu_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmsltu_vv_u16mf2_b32_m(...) __riscv_vmsltu_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmsltu_vx_u16mf2_b32_m(...) __riscv_vmsltu_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmsltu_vv_u16m1_b16_m(...) __riscv_vmsltu_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmsltu_vx_u16m1_b16_m(...) __riscv_vmsltu_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmsltu_vv_u16m2_b8_m(...) __riscv_vmsltu_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmsltu_vx_u16m2_b8_m(...) __riscv_vmsltu_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmsltu_vv_u16m4_b4_m(...) __riscv_vmsltu_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmsltu_vx_u16m4_b4_m(...) __riscv_vmsltu_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmsltu_vv_u16m8_b2_m(...) __riscv_vmsltu_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmsltu_vx_u16m8_b2_m(...) __riscv_vmsltu_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmsltu_vv_u32mf2_b64_m(...) __riscv_vmsltu_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmsltu_vx_u32mf2_b64_m(...) __riscv_vmsltu_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmsltu_vv_u32m1_b32_m(...) __riscv_vmsltu_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmsltu_vx_u32m1_b32_m(...) __riscv_vmsltu_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmsltu_vv_u32m2_b16_m(...) __riscv_vmsltu_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmsltu_vx_u32m2_b16_m(...) __riscv_vmsltu_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmsltu_vv_u32m4_b8_m(...) __riscv_vmsltu_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmsltu_vx_u32m4_b8_m(...) __riscv_vmsltu_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmsltu_vv_u32m8_b4_m(...) __riscv_vmsltu_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmsltu_vx_u32m8_b4_m(...) __riscv_vmsltu_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmsltu_vv_u64m1_b64_m(...) __riscv_vmsltu_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmsltu_vx_u64m1_b64_m(...) __riscv_vmsltu_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmsltu_vv_u64m2_b32_m(...) __riscv_vmsltu_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmsltu_vx_u64m2_b32_m(...) __riscv_vmsltu_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmsltu_vv_u64m4_b16_m(...) __riscv_vmsltu_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmsltu_vx_u64m4_b16_m(...) __riscv_vmsltu_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmsltu_vv_u64m8_b8_m(...) __riscv_vmsltu_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmsltu_vx_u64m8_b8_m(...) __riscv_vmsltu_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmsleu_vv_u8mf8_b64_m(...) __riscv_vmsleu_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmsleu_vx_u8mf8_b64_m(...) __riscv_vmsleu_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmsleu_vv_u8mf4_b32_m(...) __riscv_vmsleu_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmsleu_vx_u8mf4_b32_m(...) __riscv_vmsleu_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmsleu_vv_u8mf2_b16_m(...) __riscv_vmsleu_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmsleu_vx_u8mf2_b16_m(...) __riscv_vmsleu_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmsleu_vv_u8m1_b8_m(...) __riscv_vmsleu_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmsleu_vx_u8m1_b8_m(...) __riscv_vmsleu_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmsleu_vv_u8m2_b4_m(...) __riscv_vmsleu_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmsleu_vx_u8m2_b4_m(...) __riscv_vmsleu_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmsleu_vv_u8m4_b2_m(...) __riscv_vmsleu_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmsleu_vx_u8m4_b2_m(...) __riscv_vmsleu_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmsleu_vv_u8m8_b1_m(...) __riscv_vmsleu_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmsleu_vx_u8m8_b1_m(...) __riscv_vmsleu_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmsleu_vv_u16mf4_b64_m(...) __riscv_vmsleu_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmsleu_vx_u16mf4_b64_m(...) __riscv_vmsleu_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmsleu_vv_u16mf2_b32_m(...) __riscv_vmsleu_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmsleu_vx_u16mf2_b32_m(...) __riscv_vmsleu_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmsleu_vv_u16m1_b16_m(...) __riscv_vmsleu_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmsleu_vx_u16m1_b16_m(...) __riscv_vmsleu_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmsleu_vv_u16m2_b8_m(...) __riscv_vmsleu_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmsleu_vx_u16m2_b8_m(...) __riscv_vmsleu_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmsleu_vv_u16m4_b4_m(...) __riscv_vmsleu_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmsleu_vx_u16m4_b4_m(...) __riscv_vmsleu_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmsleu_vv_u16m8_b2_m(...) __riscv_vmsleu_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmsleu_vx_u16m8_b2_m(...) __riscv_vmsleu_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmsleu_vv_u32mf2_b64_m(...) __riscv_vmsleu_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmsleu_vx_u32mf2_b64_m(...) __riscv_vmsleu_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmsleu_vv_u32m1_b32_m(...) __riscv_vmsleu_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmsleu_vx_u32m1_b32_m(...) __riscv_vmsleu_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmsleu_vv_u32m2_b16_m(...) __riscv_vmsleu_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmsleu_vx_u32m2_b16_m(...) __riscv_vmsleu_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmsleu_vv_u32m4_b8_m(...) __riscv_vmsleu_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmsleu_vx_u32m4_b8_m(...) __riscv_vmsleu_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmsleu_vv_u32m8_b4_m(...) __riscv_vmsleu_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmsleu_vx_u32m8_b4_m(...) __riscv_vmsleu_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmsleu_vv_u64m1_b64_m(...) __riscv_vmsleu_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmsleu_vx_u64m1_b64_m(...) __riscv_vmsleu_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmsleu_vv_u64m2_b32_m(...) __riscv_vmsleu_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmsleu_vx_u64m2_b32_m(...) __riscv_vmsleu_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmsleu_vv_u64m4_b16_m(...) __riscv_vmsleu_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmsleu_vx_u64m4_b16_m(...) __riscv_vmsleu_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmsleu_vv_u64m8_b8_m(...) __riscv_vmsleu_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmsleu_vx_u64m8_b8_m(...) __riscv_vmsleu_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmsgtu_vv_u8mf8_b64_m(...) __riscv_vmsgtu_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmsgtu_vx_u8mf8_b64_m(...) __riscv_vmsgtu_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmsgtu_vv_u8mf4_b32_m(...) __riscv_vmsgtu_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmsgtu_vx_u8mf4_b32_m(...) __riscv_vmsgtu_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmsgtu_vv_u8mf2_b16_m(...) __riscv_vmsgtu_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmsgtu_vx_u8mf2_b16_m(...) __riscv_vmsgtu_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmsgtu_vv_u8m1_b8_m(...) __riscv_vmsgtu_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmsgtu_vx_u8m1_b8_m(...) __riscv_vmsgtu_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmsgtu_vv_u8m2_b4_m(...) __riscv_vmsgtu_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmsgtu_vx_u8m2_b4_m(...) __riscv_vmsgtu_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmsgtu_vv_u8m4_b2_m(...) __riscv_vmsgtu_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmsgtu_vx_u8m4_b2_m(...) __riscv_vmsgtu_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmsgtu_vv_u8m8_b1_m(...) __riscv_vmsgtu_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmsgtu_vx_u8m8_b1_m(...) __riscv_vmsgtu_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmsgtu_vv_u16mf4_b64_m(...) __riscv_vmsgtu_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmsgtu_vx_u16mf4_b64_m(...) __riscv_vmsgtu_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmsgtu_vv_u16mf2_b32_m(...) __riscv_vmsgtu_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmsgtu_vx_u16mf2_b32_m(...) __riscv_vmsgtu_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmsgtu_vv_u16m1_b16_m(...) __riscv_vmsgtu_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmsgtu_vx_u16m1_b16_m(...) __riscv_vmsgtu_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmsgtu_vv_u16m2_b8_m(...) __riscv_vmsgtu_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmsgtu_vx_u16m2_b8_m(...) __riscv_vmsgtu_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmsgtu_vv_u16m4_b4_m(...) __riscv_vmsgtu_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmsgtu_vx_u16m4_b4_m(...) __riscv_vmsgtu_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmsgtu_vv_u16m8_b2_m(...) __riscv_vmsgtu_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmsgtu_vx_u16m8_b2_m(...) __riscv_vmsgtu_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmsgtu_vv_u32mf2_b64_m(...) __riscv_vmsgtu_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmsgtu_vx_u32mf2_b64_m(...) __riscv_vmsgtu_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmsgtu_vv_u32m1_b32_m(...) __riscv_vmsgtu_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmsgtu_vx_u32m1_b32_m(...) __riscv_vmsgtu_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmsgtu_vv_u32m2_b16_m(...) __riscv_vmsgtu_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmsgtu_vx_u32m2_b16_m(...) __riscv_vmsgtu_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmsgtu_vv_u32m4_b8_m(...) __riscv_vmsgtu_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmsgtu_vx_u32m4_b8_m(...) __riscv_vmsgtu_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmsgtu_vv_u32m8_b4_m(...) __riscv_vmsgtu_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmsgtu_vx_u32m8_b4_m(...) __riscv_vmsgtu_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmsgtu_vv_u64m1_b64_m(...) __riscv_vmsgtu_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmsgtu_vx_u64m1_b64_m(...) __riscv_vmsgtu_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmsgtu_vv_u64m2_b32_m(...) __riscv_vmsgtu_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmsgtu_vx_u64m2_b32_m(...) __riscv_vmsgtu_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmsgtu_vv_u64m4_b16_m(...) __riscv_vmsgtu_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmsgtu_vx_u64m4_b16_m(...) __riscv_vmsgtu_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmsgtu_vv_u64m8_b8_m(...) __riscv_vmsgtu_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmsgtu_vx_u64m8_b8_m(...) __riscv_vmsgtu_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmsgeu_vv_u8mf8_b64_m(...) __riscv_vmsgeu_vv_u8mf8_b64_mu(__VA_ARGS__) +#define vmsgeu_vx_u8mf8_b64_m(...) __riscv_vmsgeu_vx_u8mf8_b64_mu(__VA_ARGS__) +#define vmsgeu_vv_u8mf4_b32_m(...) __riscv_vmsgeu_vv_u8mf4_b32_mu(__VA_ARGS__) +#define vmsgeu_vx_u8mf4_b32_m(...) __riscv_vmsgeu_vx_u8mf4_b32_mu(__VA_ARGS__) +#define vmsgeu_vv_u8mf2_b16_m(...) __riscv_vmsgeu_vv_u8mf2_b16_mu(__VA_ARGS__) +#define vmsgeu_vx_u8mf2_b16_m(...) __riscv_vmsgeu_vx_u8mf2_b16_mu(__VA_ARGS__) +#define vmsgeu_vv_u8m1_b8_m(...) __riscv_vmsgeu_vv_u8m1_b8_mu(__VA_ARGS__) +#define vmsgeu_vx_u8m1_b8_m(...) __riscv_vmsgeu_vx_u8m1_b8_mu(__VA_ARGS__) +#define vmsgeu_vv_u8m2_b4_m(...) __riscv_vmsgeu_vv_u8m2_b4_mu(__VA_ARGS__) +#define vmsgeu_vx_u8m2_b4_m(...) __riscv_vmsgeu_vx_u8m2_b4_mu(__VA_ARGS__) +#define vmsgeu_vv_u8m4_b2_m(...) __riscv_vmsgeu_vv_u8m4_b2_mu(__VA_ARGS__) +#define vmsgeu_vx_u8m4_b2_m(...) __riscv_vmsgeu_vx_u8m4_b2_mu(__VA_ARGS__) +#define vmsgeu_vv_u8m8_b1_m(...) __riscv_vmsgeu_vv_u8m8_b1_mu(__VA_ARGS__) +#define vmsgeu_vx_u8m8_b1_m(...) __riscv_vmsgeu_vx_u8m8_b1_mu(__VA_ARGS__) +#define vmsgeu_vv_u16mf4_b64_m(...) __riscv_vmsgeu_vv_u16mf4_b64_mu(__VA_ARGS__) +#define vmsgeu_vx_u16mf4_b64_m(...) __riscv_vmsgeu_vx_u16mf4_b64_mu(__VA_ARGS__) +#define vmsgeu_vv_u16mf2_b32_m(...) __riscv_vmsgeu_vv_u16mf2_b32_mu(__VA_ARGS__) +#define vmsgeu_vx_u16mf2_b32_m(...) __riscv_vmsgeu_vx_u16mf2_b32_mu(__VA_ARGS__) +#define vmsgeu_vv_u16m1_b16_m(...) __riscv_vmsgeu_vv_u16m1_b16_mu(__VA_ARGS__) +#define vmsgeu_vx_u16m1_b16_m(...) __riscv_vmsgeu_vx_u16m1_b16_mu(__VA_ARGS__) +#define vmsgeu_vv_u16m2_b8_m(...) __riscv_vmsgeu_vv_u16m2_b8_mu(__VA_ARGS__) +#define vmsgeu_vx_u16m2_b8_m(...) __riscv_vmsgeu_vx_u16m2_b8_mu(__VA_ARGS__) +#define vmsgeu_vv_u16m4_b4_m(...) __riscv_vmsgeu_vv_u16m4_b4_mu(__VA_ARGS__) +#define vmsgeu_vx_u16m4_b4_m(...) __riscv_vmsgeu_vx_u16m4_b4_mu(__VA_ARGS__) +#define vmsgeu_vv_u16m8_b2_m(...) __riscv_vmsgeu_vv_u16m8_b2_mu(__VA_ARGS__) +#define vmsgeu_vx_u16m8_b2_m(...) __riscv_vmsgeu_vx_u16m8_b2_mu(__VA_ARGS__) +#define vmsgeu_vv_u32mf2_b64_m(...) __riscv_vmsgeu_vv_u32mf2_b64_mu(__VA_ARGS__) +#define vmsgeu_vx_u32mf2_b64_m(...) __riscv_vmsgeu_vx_u32mf2_b64_mu(__VA_ARGS__) +#define vmsgeu_vv_u32m1_b32_m(...) __riscv_vmsgeu_vv_u32m1_b32_mu(__VA_ARGS__) +#define vmsgeu_vx_u32m1_b32_m(...) __riscv_vmsgeu_vx_u32m1_b32_mu(__VA_ARGS__) +#define vmsgeu_vv_u32m2_b16_m(...) __riscv_vmsgeu_vv_u32m2_b16_mu(__VA_ARGS__) +#define vmsgeu_vx_u32m2_b16_m(...) __riscv_vmsgeu_vx_u32m2_b16_mu(__VA_ARGS__) +#define vmsgeu_vv_u32m4_b8_m(...) __riscv_vmsgeu_vv_u32m4_b8_mu(__VA_ARGS__) +#define vmsgeu_vx_u32m4_b8_m(...) __riscv_vmsgeu_vx_u32m4_b8_mu(__VA_ARGS__) +#define vmsgeu_vv_u32m8_b4_m(...) __riscv_vmsgeu_vv_u32m8_b4_mu(__VA_ARGS__) +#define vmsgeu_vx_u32m8_b4_m(...) __riscv_vmsgeu_vx_u32m8_b4_mu(__VA_ARGS__) +#define vmsgeu_vv_u64m1_b64_m(...) __riscv_vmsgeu_vv_u64m1_b64_mu(__VA_ARGS__) +#define vmsgeu_vx_u64m1_b64_m(...) __riscv_vmsgeu_vx_u64m1_b64_mu(__VA_ARGS__) +#define vmsgeu_vv_u64m2_b32_m(...) __riscv_vmsgeu_vv_u64m2_b32_mu(__VA_ARGS__) +#define vmsgeu_vx_u64m2_b32_m(...) __riscv_vmsgeu_vx_u64m2_b32_mu(__VA_ARGS__) +#define vmsgeu_vv_u64m4_b16_m(...) __riscv_vmsgeu_vv_u64m4_b16_mu(__VA_ARGS__) +#define vmsgeu_vx_u64m4_b16_m(...) __riscv_vmsgeu_vx_u64m4_b16_mu(__VA_ARGS__) +#define vmsgeu_vv_u64m8_b8_m(...) __riscv_vmsgeu_vv_u64m8_b8_mu(__VA_ARGS__) +#define vmsgeu_vx_u64m8_b8_m(...) __riscv_vmsgeu_vx_u64m8_b8_mu(__VA_ARGS__) +#define vmin_vv_i8mf8(...) __riscv_vmin_vv_i8mf8(__VA_ARGS__) +#define vmin_vx_i8mf8(...) __riscv_vmin_vx_i8mf8(__VA_ARGS__) +#define vmin_vv_i8mf4(...) __riscv_vmin_vv_i8mf4(__VA_ARGS__) +#define vmin_vx_i8mf4(...) __riscv_vmin_vx_i8mf4(__VA_ARGS__) +#define vmin_vv_i8mf2(...) __riscv_vmin_vv_i8mf2(__VA_ARGS__) +#define vmin_vx_i8mf2(...) __riscv_vmin_vx_i8mf2(__VA_ARGS__) +#define vmin_vv_i8m1(...) __riscv_vmin_vv_i8m1(__VA_ARGS__) +#define vmin_vx_i8m1(...) __riscv_vmin_vx_i8m1(__VA_ARGS__) +#define vmin_vv_i8m2(...) __riscv_vmin_vv_i8m2(__VA_ARGS__) +#define vmin_vx_i8m2(...) __riscv_vmin_vx_i8m2(__VA_ARGS__) +#define vmin_vv_i8m4(...) __riscv_vmin_vv_i8m4(__VA_ARGS__) +#define vmin_vx_i8m4(...) __riscv_vmin_vx_i8m4(__VA_ARGS__) +#define vmin_vv_i8m8(...) __riscv_vmin_vv_i8m8(__VA_ARGS__) +#define vmin_vx_i8m8(...) __riscv_vmin_vx_i8m8(__VA_ARGS__) +#define vmin_vv_i16mf4(...) __riscv_vmin_vv_i16mf4(__VA_ARGS__) +#define vmin_vx_i16mf4(...) __riscv_vmin_vx_i16mf4(__VA_ARGS__) +#define vmin_vv_i16mf2(...) __riscv_vmin_vv_i16mf2(__VA_ARGS__) +#define vmin_vx_i16mf2(...) __riscv_vmin_vx_i16mf2(__VA_ARGS__) +#define vmin_vv_i16m1(...) __riscv_vmin_vv_i16m1(__VA_ARGS__) +#define vmin_vx_i16m1(...) __riscv_vmin_vx_i16m1(__VA_ARGS__) +#define vmin_vv_i16m2(...) __riscv_vmin_vv_i16m2(__VA_ARGS__) +#define vmin_vx_i16m2(...) __riscv_vmin_vx_i16m2(__VA_ARGS__) +#define vmin_vv_i16m4(...) __riscv_vmin_vv_i16m4(__VA_ARGS__) +#define vmin_vx_i16m4(...) __riscv_vmin_vx_i16m4(__VA_ARGS__) +#define vmin_vv_i16m8(...) __riscv_vmin_vv_i16m8(__VA_ARGS__) +#define vmin_vx_i16m8(...) __riscv_vmin_vx_i16m8(__VA_ARGS__) +#define vmin_vv_i32mf2(...) __riscv_vmin_vv_i32mf2(__VA_ARGS__) +#define vmin_vx_i32mf2(...) __riscv_vmin_vx_i32mf2(__VA_ARGS__) +#define vmin_vv_i32m1(...) __riscv_vmin_vv_i32m1(__VA_ARGS__) +#define vmin_vx_i32m1(...) __riscv_vmin_vx_i32m1(__VA_ARGS__) +#define vmin_vv_i32m2(...) __riscv_vmin_vv_i32m2(__VA_ARGS__) +#define vmin_vx_i32m2(...) __riscv_vmin_vx_i32m2(__VA_ARGS__) +#define vmin_vv_i32m4(...) __riscv_vmin_vv_i32m4(__VA_ARGS__) +#define vmin_vx_i32m4(...) __riscv_vmin_vx_i32m4(__VA_ARGS__) +#define vmin_vv_i32m8(...) __riscv_vmin_vv_i32m8(__VA_ARGS__) +#define vmin_vx_i32m8(...) __riscv_vmin_vx_i32m8(__VA_ARGS__) +#define vmin_vv_i64m1(...) __riscv_vmin_vv_i64m1(__VA_ARGS__) +#define vmin_vx_i64m1(...) __riscv_vmin_vx_i64m1(__VA_ARGS__) +#define vmin_vv_i64m2(...) __riscv_vmin_vv_i64m2(__VA_ARGS__) +#define vmin_vx_i64m2(...) __riscv_vmin_vx_i64m2(__VA_ARGS__) +#define vmin_vv_i64m4(...) __riscv_vmin_vv_i64m4(__VA_ARGS__) +#define vmin_vx_i64m4(...) __riscv_vmin_vx_i64m4(__VA_ARGS__) +#define vmin_vv_i64m8(...) __riscv_vmin_vv_i64m8(__VA_ARGS__) +#define vmin_vx_i64m8(...) __riscv_vmin_vx_i64m8(__VA_ARGS__) +#define vmax_vv_i8mf8(...) __riscv_vmax_vv_i8mf8(__VA_ARGS__) +#define vmax_vx_i8mf8(...) __riscv_vmax_vx_i8mf8(__VA_ARGS__) +#define vmax_vv_i8mf4(...) __riscv_vmax_vv_i8mf4(__VA_ARGS__) +#define vmax_vx_i8mf4(...) __riscv_vmax_vx_i8mf4(__VA_ARGS__) +#define vmax_vv_i8mf2(...) __riscv_vmax_vv_i8mf2(__VA_ARGS__) +#define vmax_vx_i8mf2(...) __riscv_vmax_vx_i8mf2(__VA_ARGS__) +#define vmax_vv_i8m1(...) __riscv_vmax_vv_i8m1(__VA_ARGS__) +#define vmax_vx_i8m1(...) __riscv_vmax_vx_i8m1(__VA_ARGS__) +#define vmax_vv_i8m2(...) __riscv_vmax_vv_i8m2(__VA_ARGS__) +#define vmax_vx_i8m2(...) __riscv_vmax_vx_i8m2(__VA_ARGS__) +#define vmax_vv_i8m4(...) __riscv_vmax_vv_i8m4(__VA_ARGS__) +#define vmax_vx_i8m4(...) __riscv_vmax_vx_i8m4(__VA_ARGS__) +#define vmax_vv_i8m8(...) __riscv_vmax_vv_i8m8(__VA_ARGS__) +#define vmax_vx_i8m8(...) __riscv_vmax_vx_i8m8(__VA_ARGS__) +#define vmax_vv_i16mf4(...) __riscv_vmax_vv_i16mf4(__VA_ARGS__) +#define vmax_vx_i16mf4(...) __riscv_vmax_vx_i16mf4(__VA_ARGS__) +#define vmax_vv_i16mf2(...) __riscv_vmax_vv_i16mf2(__VA_ARGS__) +#define vmax_vx_i16mf2(...) __riscv_vmax_vx_i16mf2(__VA_ARGS__) +#define vmax_vv_i16m1(...) __riscv_vmax_vv_i16m1(__VA_ARGS__) +#define vmax_vx_i16m1(...) __riscv_vmax_vx_i16m1(__VA_ARGS__) +#define vmax_vv_i16m2(...) __riscv_vmax_vv_i16m2(__VA_ARGS__) +#define vmax_vx_i16m2(...) __riscv_vmax_vx_i16m2(__VA_ARGS__) +#define vmax_vv_i16m4(...) __riscv_vmax_vv_i16m4(__VA_ARGS__) +#define vmax_vx_i16m4(...) __riscv_vmax_vx_i16m4(__VA_ARGS__) +#define vmax_vv_i16m8(...) __riscv_vmax_vv_i16m8(__VA_ARGS__) +#define vmax_vx_i16m8(...) __riscv_vmax_vx_i16m8(__VA_ARGS__) +#define vmax_vv_i32mf2(...) __riscv_vmax_vv_i32mf2(__VA_ARGS__) +#define vmax_vx_i32mf2(...) __riscv_vmax_vx_i32mf2(__VA_ARGS__) +#define vmax_vv_i32m1(...) __riscv_vmax_vv_i32m1(__VA_ARGS__) +#define vmax_vx_i32m1(...) __riscv_vmax_vx_i32m1(__VA_ARGS__) +#define vmax_vv_i32m2(...) __riscv_vmax_vv_i32m2(__VA_ARGS__) +#define vmax_vx_i32m2(...) __riscv_vmax_vx_i32m2(__VA_ARGS__) +#define vmax_vv_i32m4(...) __riscv_vmax_vv_i32m4(__VA_ARGS__) +#define vmax_vx_i32m4(...) __riscv_vmax_vx_i32m4(__VA_ARGS__) +#define vmax_vv_i32m8(...) __riscv_vmax_vv_i32m8(__VA_ARGS__) +#define vmax_vx_i32m8(...) __riscv_vmax_vx_i32m8(__VA_ARGS__) +#define vmax_vv_i64m1(...) __riscv_vmax_vv_i64m1(__VA_ARGS__) +#define vmax_vx_i64m1(...) __riscv_vmax_vx_i64m1(__VA_ARGS__) +#define vmax_vv_i64m2(...) __riscv_vmax_vv_i64m2(__VA_ARGS__) +#define vmax_vx_i64m2(...) __riscv_vmax_vx_i64m2(__VA_ARGS__) +#define vmax_vv_i64m4(...) __riscv_vmax_vv_i64m4(__VA_ARGS__) +#define vmax_vx_i64m4(...) __riscv_vmax_vx_i64m4(__VA_ARGS__) +#define vmax_vv_i64m8(...) __riscv_vmax_vv_i64m8(__VA_ARGS__) +#define vmax_vx_i64m8(...) __riscv_vmax_vx_i64m8(__VA_ARGS__) +#define vminu_vv_u8mf8(...) __riscv_vminu_vv_u8mf8(__VA_ARGS__) +#define vminu_vx_u8mf8(...) __riscv_vminu_vx_u8mf8(__VA_ARGS__) +#define vminu_vv_u8mf4(...) __riscv_vminu_vv_u8mf4(__VA_ARGS__) +#define vminu_vx_u8mf4(...) __riscv_vminu_vx_u8mf4(__VA_ARGS__) +#define vminu_vv_u8mf2(...) __riscv_vminu_vv_u8mf2(__VA_ARGS__) +#define vminu_vx_u8mf2(...) __riscv_vminu_vx_u8mf2(__VA_ARGS__) +#define vminu_vv_u8m1(...) __riscv_vminu_vv_u8m1(__VA_ARGS__) +#define vminu_vx_u8m1(...) __riscv_vminu_vx_u8m1(__VA_ARGS__) +#define vminu_vv_u8m2(...) __riscv_vminu_vv_u8m2(__VA_ARGS__) +#define vminu_vx_u8m2(...) __riscv_vminu_vx_u8m2(__VA_ARGS__) +#define vminu_vv_u8m4(...) __riscv_vminu_vv_u8m4(__VA_ARGS__) +#define vminu_vx_u8m4(...) __riscv_vminu_vx_u8m4(__VA_ARGS__) +#define vminu_vv_u8m8(...) __riscv_vminu_vv_u8m8(__VA_ARGS__) +#define vminu_vx_u8m8(...) __riscv_vminu_vx_u8m8(__VA_ARGS__) +#define vminu_vv_u16mf4(...) __riscv_vminu_vv_u16mf4(__VA_ARGS__) +#define vminu_vx_u16mf4(...) __riscv_vminu_vx_u16mf4(__VA_ARGS__) +#define vminu_vv_u16mf2(...) __riscv_vminu_vv_u16mf2(__VA_ARGS__) +#define vminu_vx_u16mf2(...) __riscv_vminu_vx_u16mf2(__VA_ARGS__) +#define vminu_vv_u16m1(...) __riscv_vminu_vv_u16m1(__VA_ARGS__) +#define vminu_vx_u16m1(...) __riscv_vminu_vx_u16m1(__VA_ARGS__) +#define vminu_vv_u16m2(...) __riscv_vminu_vv_u16m2(__VA_ARGS__) +#define vminu_vx_u16m2(...) __riscv_vminu_vx_u16m2(__VA_ARGS__) +#define vminu_vv_u16m4(...) __riscv_vminu_vv_u16m4(__VA_ARGS__) +#define vminu_vx_u16m4(...) __riscv_vminu_vx_u16m4(__VA_ARGS__) +#define vminu_vv_u16m8(...) __riscv_vminu_vv_u16m8(__VA_ARGS__) +#define vminu_vx_u16m8(...) __riscv_vminu_vx_u16m8(__VA_ARGS__) +#define vminu_vv_u32mf2(...) __riscv_vminu_vv_u32mf2(__VA_ARGS__) +#define vminu_vx_u32mf2(...) __riscv_vminu_vx_u32mf2(__VA_ARGS__) +#define vminu_vv_u32m1(...) __riscv_vminu_vv_u32m1(__VA_ARGS__) +#define vminu_vx_u32m1(...) __riscv_vminu_vx_u32m1(__VA_ARGS__) +#define vminu_vv_u32m2(...) __riscv_vminu_vv_u32m2(__VA_ARGS__) +#define vminu_vx_u32m2(...) __riscv_vminu_vx_u32m2(__VA_ARGS__) +#define vminu_vv_u32m4(...) __riscv_vminu_vv_u32m4(__VA_ARGS__) +#define vminu_vx_u32m4(...) __riscv_vminu_vx_u32m4(__VA_ARGS__) +#define vminu_vv_u32m8(...) __riscv_vminu_vv_u32m8(__VA_ARGS__) +#define vminu_vx_u32m8(...) __riscv_vminu_vx_u32m8(__VA_ARGS__) +#define vminu_vv_u64m1(...) __riscv_vminu_vv_u64m1(__VA_ARGS__) +#define vminu_vx_u64m1(...) __riscv_vminu_vx_u64m1(__VA_ARGS__) +#define vminu_vv_u64m2(...) __riscv_vminu_vv_u64m2(__VA_ARGS__) +#define vminu_vx_u64m2(...) __riscv_vminu_vx_u64m2(__VA_ARGS__) +#define vminu_vv_u64m4(...) __riscv_vminu_vv_u64m4(__VA_ARGS__) +#define vminu_vx_u64m4(...) __riscv_vminu_vx_u64m4(__VA_ARGS__) +#define vminu_vv_u64m8(...) __riscv_vminu_vv_u64m8(__VA_ARGS__) +#define vminu_vx_u64m8(...) __riscv_vminu_vx_u64m8(__VA_ARGS__) +#define vmaxu_vv_u8mf8(...) __riscv_vmaxu_vv_u8mf8(__VA_ARGS__) +#define vmaxu_vx_u8mf8(...) __riscv_vmaxu_vx_u8mf8(__VA_ARGS__) +#define vmaxu_vv_u8mf4(...) __riscv_vmaxu_vv_u8mf4(__VA_ARGS__) +#define vmaxu_vx_u8mf4(...) __riscv_vmaxu_vx_u8mf4(__VA_ARGS__) +#define vmaxu_vv_u8mf2(...) __riscv_vmaxu_vv_u8mf2(__VA_ARGS__) +#define vmaxu_vx_u8mf2(...) __riscv_vmaxu_vx_u8mf2(__VA_ARGS__) +#define vmaxu_vv_u8m1(...) __riscv_vmaxu_vv_u8m1(__VA_ARGS__) +#define vmaxu_vx_u8m1(...) __riscv_vmaxu_vx_u8m1(__VA_ARGS__) +#define vmaxu_vv_u8m2(...) __riscv_vmaxu_vv_u8m2(__VA_ARGS__) +#define vmaxu_vx_u8m2(...) __riscv_vmaxu_vx_u8m2(__VA_ARGS__) +#define vmaxu_vv_u8m4(...) __riscv_vmaxu_vv_u8m4(__VA_ARGS__) +#define vmaxu_vx_u8m4(...) __riscv_vmaxu_vx_u8m4(__VA_ARGS__) +#define vmaxu_vv_u8m8(...) __riscv_vmaxu_vv_u8m8(__VA_ARGS__) +#define vmaxu_vx_u8m8(...) __riscv_vmaxu_vx_u8m8(__VA_ARGS__) +#define vmaxu_vv_u16mf4(...) __riscv_vmaxu_vv_u16mf4(__VA_ARGS__) +#define vmaxu_vx_u16mf4(...) __riscv_vmaxu_vx_u16mf4(__VA_ARGS__) +#define vmaxu_vv_u16mf2(...) __riscv_vmaxu_vv_u16mf2(__VA_ARGS__) +#define vmaxu_vx_u16mf2(...) __riscv_vmaxu_vx_u16mf2(__VA_ARGS__) +#define vmaxu_vv_u16m1(...) __riscv_vmaxu_vv_u16m1(__VA_ARGS__) +#define vmaxu_vx_u16m1(...) __riscv_vmaxu_vx_u16m1(__VA_ARGS__) +#define vmaxu_vv_u16m2(...) __riscv_vmaxu_vv_u16m2(__VA_ARGS__) +#define vmaxu_vx_u16m2(...) __riscv_vmaxu_vx_u16m2(__VA_ARGS__) +#define vmaxu_vv_u16m4(...) __riscv_vmaxu_vv_u16m4(__VA_ARGS__) +#define vmaxu_vx_u16m4(...) __riscv_vmaxu_vx_u16m4(__VA_ARGS__) +#define vmaxu_vv_u16m8(...) __riscv_vmaxu_vv_u16m8(__VA_ARGS__) +#define vmaxu_vx_u16m8(...) __riscv_vmaxu_vx_u16m8(__VA_ARGS__) +#define vmaxu_vv_u32mf2(...) __riscv_vmaxu_vv_u32mf2(__VA_ARGS__) +#define vmaxu_vx_u32mf2(...) __riscv_vmaxu_vx_u32mf2(__VA_ARGS__) +#define vmaxu_vv_u32m1(...) __riscv_vmaxu_vv_u32m1(__VA_ARGS__) +#define vmaxu_vx_u32m1(...) __riscv_vmaxu_vx_u32m1(__VA_ARGS__) +#define vmaxu_vv_u32m2(...) __riscv_vmaxu_vv_u32m2(__VA_ARGS__) +#define vmaxu_vx_u32m2(...) __riscv_vmaxu_vx_u32m2(__VA_ARGS__) +#define vmaxu_vv_u32m4(...) __riscv_vmaxu_vv_u32m4(__VA_ARGS__) +#define vmaxu_vx_u32m4(...) __riscv_vmaxu_vx_u32m4(__VA_ARGS__) +#define vmaxu_vv_u32m8(...) __riscv_vmaxu_vv_u32m8(__VA_ARGS__) +#define vmaxu_vx_u32m8(...) __riscv_vmaxu_vx_u32m8(__VA_ARGS__) +#define vmaxu_vv_u64m1(...) __riscv_vmaxu_vv_u64m1(__VA_ARGS__) +#define vmaxu_vx_u64m1(...) __riscv_vmaxu_vx_u64m1(__VA_ARGS__) +#define vmaxu_vv_u64m2(...) __riscv_vmaxu_vv_u64m2(__VA_ARGS__) +#define vmaxu_vx_u64m2(...) __riscv_vmaxu_vx_u64m2(__VA_ARGS__) +#define vmaxu_vv_u64m4(...) __riscv_vmaxu_vv_u64m4(__VA_ARGS__) +#define vmaxu_vx_u64m4(...) __riscv_vmaxu_vx_u64m4(__VA_ARGS__) +#define vmaxu_vv_u64m8(...) __riscv_vmaxu_vv_u64m8(__VA_ARGS__) +#define vmaxu_vx_u64m8(...) __riscv_vmaxu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vmin_vv_i8mf8_m(...) __riscv_vmin_vv_i8mf8_tumu(__VA_ARGS__) +#define vmin_vx_i8mf8_m(...) __riscv_vmin_vx_i8mf8_tumu(__VA_ARGS__) +#define vmin_vv_i8mf4_m(...) __riscv_vmin_vv_i8mf4_tumu(__VA_ARGS__) +#define vmin_vx_i8mf4_m(...) __riscv_vmin_vx_i8mf4_tumu(__VA_ARGS__) +#define vmin_vv_i8mf2_m(...) __riscv_vmin_vv_i8mf2_tumu(__VA_ARGS__) +#define vmin_vx_i8mf2_m(...) __riscv_vmin_vx_i8mf2_tumu(__VA_ARGS__) +#define vmin_vv_i8m1_m(...) __riscv_vmin_vv_i8m1_tumu(__VA_ARGS__) +#define vmin_vx_i8m1_m(...) __riscv_vmin_vx_i8m1_tumu(__VA_ARGS__) +#define vmin_vv_i8m2_m(...) __riscv_vmin_vv_i8m2_tumu(__VA_ARGS__) +#define vmin_vx_i8m2_m(...) __riscv_vmin_vx_i8m2_tumu(__VA_ARGS__) +#define vmin_vv_i8m4_m(...) __riscv_vmin_vv_i8m4_tumu(__VA_ARGS__) +#define vmin_vx_i8m4_m(...) __riscv_vmin_vx_i8m4_tumu(__VA_ARGS__) +#define vmin_vv_i8m8_m(...) __riscv_vmin_vv_i8m8_tumu(__VA_ARGS__) +#define vmin_vx_i8m8_m(...) __riscv_vmin_vx_i8m8_tumu(__VA_ARGS__) +#define vmin_vv_i16mf4_m(...) __riscv_vmin_vv_i16mf4_tumu(__VA_ARGS__) +#define vmin_vx_i16mf4_m(...) __riscv_vmin_vx_i16mf4_tumu(__VA_ARGS__) +#define vmin_vv_i16mf2_m(...) __riscv_vmin_vv_i16mf2_tumu(__VA_ARGS__) +#define vmin_vx_i16mf2_m(...) __riscv_vmin_vx_i16mf2_tumu(__VA_ARGS__) +#define vmin_vv_i16m1_m(...) __riscv_vmin_vv_i16m1_tumu(__VA_ARGS__) +#define vmin_vx_i16m1_m(...) __riscv_vmin_vx_i16m1_tumu(__VA_ARGS__) +#define vmin_vv_i16m2_m(...) __riscv_vmin_vv_i16m2_tumu(__VA_ARGS__) +#define vmin_vx_i16m2_m(...) __riscv_vmin_vx_i16m2_tumu(__VA_ARGS__) +#define vmin_vv_i16m4_m(...) __riscv_vmin_vv_i16m4_tumu(__VA_ARGS__) +#define vmin_vx_i16m4_m(...) __riscv_vmin_vx_i16m4_tumu(__VA_ARGS__) +#define vmin_vv_i16m8_m(...) __riscv_vmin_vv_i16m8_tumu(__VA_ARGS__) +#define vmin_vx_i16m8_m(...) __riscv_vmin_vx_i16m8_tumu(__VA_ARGS__) +#define vmin_vv_i32mf2_m(...) __riscv_vmin_vv_i32mf2_tumu(__VA_ARGS__) +#define vmin_vx_i32mf2_m(...) __riscv_vmin_vx_i32mf2_tumu(__VA_ARGS__) +#define vmin_vv_i32m1_m(...) __riscv_vmin_vv_i32m1_tumu(__VA_ARGS__) +#define vmin_vx_i32m1_m(...) __riscv_vmin_vx_i32m1_tumu(__VA_ARGS__) +#define vmin_vv_i32m2_m(...) __riscv_vmin_vv_i32m2_tumu(__VA_ARGS__) +#define vmin_vx_i32m2_m(...) __riscv_vmin_vx_i32m2_tumu(__VA_ARGS__) +#define vmin_vv_i32m4_m(...) __riscv_vmin_vv_i32m4_tumu(__VA_ARGS__) +#define vmin_vx_i32m4_m(...) __riscv_vmin_vx_i32m4_tumu(__VA_ARGS__) +#define vmin_vv_i32m8_m(...) __riscv_vmin_vv_i32m8_tumu(__VA_ARGS__) +#define vmin_vx_i32m8_m(...) __riscv_vmin_vx_i32m8_tumu(__VA_ARGS__) +#define vmin_vv_i64m1_m(...) __riscv_vmin_vv_i64m1_tumu(__VA_ARGS__) +#define vmin_vx_i64m1_m(...) __riscv_vmin_vx_i64m1_tumu(__VA_ARGS__) +#define vmin_vv_i64m2_m(...) __riscv_vmin_vv_i64m2_tumu(__VA_ARGS__) +#define vmin_vx_i64m2_m(...) __riscv_vmin_vx_i64m2_tumu(__VA_ARGS__) +#define vmin_vv_i64m4_m(...) __riscv_vmin_vv_i64m4_tumu(__VA_ARGS__) +#define vmin_vx_i64m4_m(...) __riscv_vmin_vx_i64m4_tumu(__VA_ARGS__) +#define vmin_vv_i64m8_m(...) __riscv_vmin_vv_i64m8_tumu(__VA_ARGS__) +#define vmin_vx_i64m8_m(...) __riscv_vmin_vx_i64m8_tumu(__VA_ARGS__) +#define vmax_vv_i8mf8_m(...) __riscv_vmax_vv_i8mf8_tumu(__VA_ARGS__) +#define vmax_vx_i8mf8_m(...) __riscv_vmax_vx_i8mf8_tumu(__VA_ARGS__) +#define vmax_vv_i8mf4_m(...) __riscv_vmax_vv_i8mf4_tumu(__VA_ARGS__) +#define vmax_vx_i8mf4_m(...) __riscv_vmax_vx_i8mf4_tumu(__VA_ARGS__) +#define vmax_vv_i8mf2_m(...) __riscv_vmax_vv_i8mf2_tumu(__VA_ARGS__) +#define vmax_vx_i8mf2_m(...) __riscv_vmax_vx_i8mf2_tumu(__VA_ARGS__) +#define vmax_vv_i8m1_m(...) __riscv_vmax_vv_i8m1_tumu(__VA_ARGS__) +#define vmax_vx_i8m1_m(...) __riscv_vmax_vx_i8m1_tumu(__VA_ARGS__) +#define vmax_vv_i8m2_m(...) __riscv_vmax_vv_i8m2_tumu(__VA_ARGS__) +#define vmax_vx_i8m2_m(...) __riscv_vmax_vx_i8m2_tumu(__VA_ARGS__) +#define vmax_vv_i8m4_m(...) __riscv_vmax_vv_i8m4_tumu(__VA_ARGS__) +#define vmax_vx_i8m4_m(...) __riscv_vmax_vx_i8m4_tumu(__VA_ARGS__) +#define vmax_vv_i8m8_m(...) __riscv_vmax_vv_i8m8_tumu(__VA_ARGS__) +#define vmax_vx_i8m8_m(...) __riscv_vmax_vx_i8m8_tumu(__VA_ARGS__) +#define vmax_vv_i16mf4_m(...) __riscv_vmax_vv_i16mf4_tumu(__VA_ARGS__) +#define vmax_vx_i16mf4_m(...) __riscv_vmax_vx_i16mf4_tumu(__VA_ARGS__) +#define vmax_vv_i16mf2_m(...) __riscv_vmax_vv_i16mf2_tumu(__VA_ARGS__) +#define vmax_vx_i16mf2_m(...) __riscv_vmax_vx_i16mf2_tumu(__VA_ARGS__) +#define vmax_vv_i16m1_m(...) __riscv_vmax_vv_i16m1_tumu(__VA_ARGS__) +#define vmax_vx_i16m1_m(...) __riscv_vmax_vx_i16m1_tumu(__VA_ARGS__) +#define vmax_vv_i16m2_m(...) __riscv_vmax_vv_i16m2_tumu(__VA_ARGS__) +#define vmax_vx_i16m2_m(...) __riscv_vmax_vx_i16m2_tumu(__VA_ARGS__) +#define vmax_vv_i16m4_m(...) __riscv_vmax_vv_i16m4_tumu(__VA_ARGS__) +#define vmax_vx_i16m4_m(...) __riscv_vmax_vx_i16m4_tumu(__VA_ARGS__) +#define vmax_vv_i16m8_m(...) __riscv_vmax_vv_i16m8_tumu(__VA_ARGS__) +#define vmax_vx_i16m8_m(...) __riscv_vmax_vx_i16m8_tumu(__VA_ARGS__) +#define vmax_vv_i32mf2_m(...) __riscv_vmax_vv_i32mf2_tumu(__VA_ARGS__) +#define vmax_vx_i32mf2_m(...) __riscv_vmax_vx_i32mf2_tumu(__VA_ARGS__) +#define vmax_vv_i32m1_m(...) __riscv_vmax_vv_i32m1_tumu(__VA_ARGS__) +#define vmax_vx_i32m1_m(...) __riscv_vmax_vx_i32m1_tumu(__VA_ARGS__) +#define vmax_vv_i32m2_m(...) __riscv_vmax_vv_i32m2_tumu(__VA_ARGS__) +#define vmax_vx_i32m2_m(...) __riscv_vmax_vx_i32m2_tumu(__VA_ARGS__) +#define vmax_vv_i32m4_m(...) __riscv_vmax_vv_i32m4_tumu(__VA_ARGS__) +#define vmax_vx_i32m4_m(...) __riscv_vmax_vx_i32m4_tumu(__VA_ARGS__) +#define vmax_vv_i32m8_m(...) __riscv_vmax_vv_i32m8_tumu(__VA_ARGS__) +#define vmax_vx_i32m8_m(...) __riscv_vmax_vx_i32m8_tumu(__VA_ARGS__) +#define vmax_vv_i64m1_m(...) __riscv_vmax_vv_i64m1_tumu(__VA_ARGS__) +#define vmax_vx_i64m1_m(...) __riscv_vmax_vx_i64m1_tumu(__VA_ARGS__) +#define vmax_vv_i64m2_m(...) __riscv_vmax_vv_i64m2_tumu(__VA_ARGS__) +#define vmax_vx_i64m2_m(...) __riscv_vmax_vx_i64m2_tumu(__VA_ARGS__) +#define vmax_vv_i64m4_m(...) __riscv_vmax_vv_i64m4_tumu(__VA_ARGS__) +#define vmax_vx_i64m4_m(...) __riscv_vmax_vx_i64m4_tumu(__VA_ARGS__) +#define vmax_vv_i64m8_m(...) __riscv_vmax_vv_i64m8_tumu(__VA_ARGS__) +#define vmax_vx_i64m8_m(...) __riscv_vmax_vx_i64m8_tumu(__VA_ARGS__) +#define vminu_vv_u8mf8_m(...) __riscv_vminu_vv_u8mf8_tumu(__VA_ARGS__) +#define vminu_vx_u8mf8_m(...) __riscv_vminu_vx_u8mf8_tumu(__VA_ARGS__) +#define vminu_vv_u8mf4_m(...) __riscv_vminu_vv_u8mf4_tumu(__VA_ARGS__) +#define vminu_vx_u8mf4_m(...) __riscv_vminu_vx_u8mf4_tumu(__VA_ARGS__) +#define vminu_vv_u8mf2_m(...) __riscv_vminu_vv_u8mf2_tumu(__VA_ARGS__) +#define vminu_vx_u8mf2_m(...) __riscv_vminu_vx_u8mf2_tumu(__VA_ARGS__) +#define vminu_vv_u8m1_m(...) __riscv_vminu_vv_u8m1_tumu(__VA_ARGS__) +#define vminu_vx_u8m1_m(...) __riscv_vminu_vx_u8m1_tumu(__VA_ARGS__) +#define vminu_vv_u8m2_m(...) __riscv_vminu_vv_u8m2_tumu(__VA_ARGS__) +#define vminu_vx_u8m2_m(...) __riscv_vminu_vx_u8m2_tumu(__VA_ARGS__) +#define vminu_vv_u8m4_m(...) __riscv_vminu_vv_u8m4_tumu(__VA_ARGS__) +#define vminu_vx_u8m4_m(...) __riscv_vminu_vx_u8m4_tumu(__VA_ARGS__) +#define vminu_vv_u8m8_m(...) __riscv_vminu_vv_u8m8_tumu(__VA_ARGS__) +#define vminu_vx_u8m8_m(...) __riscv_vminu_vx_u8m8_tumu(__VA_ARGS__) +#define vminu_vv_u16mf4_m(...) __riscv_vminu_vv_u16mf4_tumu(__VA_ARGS__) +#define vminu_vx_u16mf4_m(...) __riscv_vminu_vx_u16mf4_tumu(__VA_ARGS__) +#define vminu_vv_u16mf2_m(...) __riscv_vminu_vv_u16mf2_tumu(__VA_ARGS__) +#define vminu_vx_u16mf2_m(...) __riscv_vminu_vx_u16mf2_tumu(__VA_ARGS__) +#define vminu_vv_u16m1_m(...) __riscv_vminu_vv_u16m1_tumu(__VA_ARGS__) +#define vminu_vx_u16m1_m(...) __riscv_vminu_vx_u16m1_tumu(__VA_ARGS__) +#define vminu_vv_u16m2_m(...) __riscv_vminu_vv_u16m2_tumu(__VA_ARGS__) +#define vminu_vx_u16m2_m(...) __riscv_vminu_vx_u16m2_tumu(__VA_ARGS__) +#define vminu_vv_u16m4_m(...) __riscv_vminu_vv_u16m4_tumu(__VA_ARGS__) +#define vminu_vx_u16m4_m(...) __riscv_vminu_vx_u16m4_tumu(__VA_ARGS__) +#define vminu_vv_u16m8_m(...) __riscv_vminu_vv_u16m8_tumu(__VA_ARGS__) +#define vminu_vx_u16m8_m(...) __riscv_vminu_vx_u16m8_tumu(__VA_ARGS__) +#define vminu_vv_u32mf2_m(...) __riscv_vminu_vv_u32mf2_tumu(__VA_ARGS__) +#define vminu_vx_u32mf2_m(...) __riscv_vminu_vx_u32mf2_tumu(__VA_ARGS__) +#define vminu_vv_u32m1_m(...) __riscv_vminu_vv_u32m1_tumu(__VA_ARGS__) +#define vminu_vx_u32m1_m(...) __riscv_vminu_vx_u32m1_tumu(__VA_ARGS__) +#define vminu_vv_u32m2_m(...) __riscv_vminu_vv_u32m2_tumu(__VA_ARGS__) +#define vminu_vx_u32m2_m(...) __riscv_vminu_vx_u32m2_tumu(__VA_ARGS__) +#define vminu_vv_u32m4_m(...) __riscv_vminu_vv_u32m4_tumu(__VA_ARGS__) +#define vminu_vx_u32m4_m(...) __riscv_vminu_vx_u32m4_tumu(__VA_ARGS__) +#define vminu_vv_u32m8_m(...) __riscv_vminu_vv_u32m8_tumu(__VA_ARGS__) +#define vminu_vx_u32m8_m(...) __riscv_vminu_vx_u32m8_tumu(__VA_ARGS__) +#define vminu_vv_u64m1_m(...) __riscv_vminu_vv_u64m1_tumu(__VA_ARGS__) +#define vminu_vx_u64m1_m(...) __riscv_vminu_vx_u64m1_tumu(__VA_ARGS__) +#define vminu_vv_u64m2_m(...) __riscv_vminu_vv_u64m2_tumu(__VA_ARGS__) +#define vminu_vx_u64m2_m(...) __riscv_vminu_vx_u64m2_tumu(__VA_ARGS__) +#define vminu_vv_u64m4_m(...) __riscv_vminu_vv_u64m4_tumu(__VA_ARGS__) +#define vminu_vx_u64m4_m(...) __riscv_vminu_vx_u64m4_tumu(__VA_ARGS__) +#define vminu_vv_u64m8_m(...) __riscv_vminu_vv_u64m8_tumu(__VA_ARGS__) +#define vminu_vx_u64m8_m(...) __riscv_vminu_vx_u64m8_tumu(__VA_ARGS__) +#define vmaxu_vv_u8mf8_m(...) __riscv_vmaxu_vv_u8mf8_tumu(__VA_ARGS__) +#define vmaxu_vx_u8mf8_m(...) __riscv_vmaxu_vx_u8mf8_tumu(__VA_ARGS__) +#define vmaxu_vv_u8mf4_m(...) __riscv_vmaxu_vv_u8mf4_tumu(__VA_ARGS__) +#define vmaxu_vx_u8mf4_m(...) __riscv_vmaxu_vx_u8mf4_tumu(__VA_ARGS__) +#define vmaxu_vv_u8mf2_m(...) __riscv_vmaxu_vv_u8mf2_tumu(__VA_ARGS__) +#define vmaxu_vx_u8mf2_m(...) __riscv_vmaxu_vx_u8mf2_tumu(__VA_ARGS__) +#define vmaxu_vv_u8m1_m(...) __riscv_vmaxu_vv_u8m1_tumu(__VA_ARGS__) +#define vmaxu_vx_u8m1_m(...) __riscv_vmaxu_vx_u8m1_tumu(__VA_ARGS__) +#define vmaxu_vv_u8m2_m(...) __riscv_vmaxu_vv_u8m2_tumu(__VA_ARGS__) +#define vmaxu_vx_u8m2_m(...) __riscv_vmaxu_vx_u8m2_tumu(__VA_ARGS__) +#define vmaxu_vv_u8m4_m(...) __riscv_vmaxu_vv_u8m4_tumu(__VA_ARGS__) +#define vmaxu_vx_u8m4_m(...) __riscv_vmaxu_vx_u8m4_tumu(__VA_ARGS__) +#define vmaxu_vv_u8m8_m(...) __riscv_vmaxu_vv_u8m8_tumu(__VA_ARGS__) +#define vmaxu_vx_u8m8_m(...) __riscv_vmaxu_vx_u8m8_tumu(__VA_ARGS__) +#define vmaxu_vv_u16mf4_m(...) __riscv_vmaxu_vv_u16mf4_tumu(__VA_ARGS__) +#define vmaxu_vx_u16mf4_m(...) __riscv_vmaxu_vx_u16mf4_tumu(__VA_ARGS__) +#define vmaxu_vv_u16mf2_m(...) __riscv_vmaxu_vv_u16mf2_tumu(__VA_ARGS__) +#define vmaxu_vx_u16mf2_m(...) __riscv_vmaxu_vx_u16mf2_tumu(__VA_ARGS__) +#define vmaxu_vv_u16m1_m(...) __riscv_vmaxu_vv_u16m1_tumu(__VA_ARGS__) +#define vmaxu_vx_u16m1_m(...) __riscv_vmaxu_vx_u16m1_tumu(__VA_ARGS__) +#define vmaxu_vv_u16m2_m(...) __riscv_vmaxu_vv_u16m2_tumu(__VA_ARGS__) +#define vmaxu_vx_u16m2_m(...) __riscv_vmaxu_vx_u16m2_tumu(__VA_ARGS__) +#define vmaxu_vv_u16m4_m(...) __riscv_vmaxu_vv_u16m4_tumu(__VA_ARGS__) +#define vmaxu_vx_u16m4_m(...) __riscv_vmaxu_vx_u16m4_tumu(__VA_ARGS__) +#define vmaxu_vv_u16m8_m(...) __riscv_vmaxu_vv_u16m8_tumu(__VA_ARGS__) +#define vmaxu_vx_u16m8_m(...) __riscv_vmaxu_vx_u16m8_tumu(__VA_ARGS__) +#define vmaxu_vv_u32mf2_m(...) __riscv_vmaxu_vv_u32mf2_tumu(__VA_ARGS__) +#define vmaxu_vx_u32mf2_m(...) __riscv_vmaxu_vx_u32mf2_tumu(__VA_ARGS__) +#define vmaxu_vv_u32m1_m(...) __riscv_vmaxu_vv_u32m1_tumu(__VA_ARGS__) +#define vmaxu_vx_u32m1_m(...) __riscv_vmaxu_vx_u32m1_tumu(__VA_ARGS__) +#define vmaxu_vv_u32m2_m(...) __riscv_vmaxu_vv_u32m2_tumu(__VA_ARGS__) +#define vmaxu_vx_u32m2_m(...) __riscv_vmaxu_vx_u32m2_tumu(__VA_ARGS__) +#define vmaxu_vv_u32m4_m(...) __riscv_vmaxu_vv_u32m4_tumu(__VA_ARGS__) +#define vmaxu_vx_u32m4_m(...) __riscv_vmaxu_vx_u32m4_tumu(__VA_ARGS__) +#define vmaxu_vv_u32m8_m(...) __riscv_vmaxu_vv_u32m8_tumu(__VA_ARGS__) +#define vmaxu_vx_u32m8_m(...) __riscv_vmaxu_vx_u32m8_tumu(__VA_ARGS__) +#define vmaxu_vv_u64m1_m(...) __riscv_vmaxu_vv_u64m1_tumu(__VA_ARGS__) +#define vmaxu_vx_u64m1_m(...) __riscv_vmaxu_vx_u64m1_tumu(__VA_ARGS__) +#define vmaxu_vv_u64m2_m(...) __riscv_vmaxu_vv_u64m2_tumu(__VA_ARGS__) +#define vmaxu_vx_u64m2_m(...) __riscv_vmaxu_vx_u64m2_tumu(__VA_ARGS__) +#define vmaxu_vv_u64m4_m(...) __riscv_vmaxu_vv_u64m4_tumu(__VA_ARGS__) +#define vmaxu_vx_u64m4_m(...) __riscv_vmaxu_vx_u64m4_tumu(__VA_ARGS__) +#define vmaxu_vv_u64m8_m(...) __riscv_vmaxu_vv_u64m8_tumu(__VA_ARGS__) +#define vmaxu_vx_u64m8_m(...) __riscv_vmaxu_vx_u64m8_tumu(__VA_ARGS__) +#define vmul_vv_i8mf8(...) __riscv_vmul_vv_i8mf8(__VA_ARGS__) +#define vmul_vx_i8mf8(...) __riscv_vmul_vx_i8mf8(__VA_ARGS__) +#define vmul_vv_i8mf4(...) __riscv_vmul_vv_i8mf4(__VA_ARGS__) +#define vmul_vx_i8mf4(...) __riscv_vmul_vx_i8mf4(__VA_ARGS__) +#define vmul_vv_i8mf2(...) __riscv_vmul_vv_i8mf2(__VA_ARGS__) +#define vmul_vx_i8mf2(...) __riscv_vmul_vx_i8mf2(__VA_ARGS__) +#define vmul_vv_i8m1(...) __riscv_vmul_vv_i8m1(__VA_ARGS__) +#define vmul_vx_i8m1(...) __riscv_vmul_vx_i8m1(__VA_ARGS__) +#define vmul_vv_i8m2(...) __riscv_vmul_vv_i8m2(__VA_ARGS__) +#define vmul_vx_i8m2(...) __riscv_vmul_vx_i8m2(__VA_ARGS__) +#define vmul_vv_i8m4(...) __riscv_vmul_vv_i8m4(__VA_ARGS__) +#define vmul_vx_i8m4(...) __riscv_vmul_vx_i8m4(__VA_ARGS__) +#define vmul_vv_i8m8(...) __riscv_vmul_vv_i8m8(__VA_ARGS__) +#define vmul_vx_i8m8(...) __riscv_vmul_vx_i8m8(__VA_ARGS__) +#define vmul_vv_i16mf4(...) __riscv_vmul_vv_i16mf4(__VA_ARGS__) +#define vmul_vx_i16mf4(...) __riscv_vmul_vx_i16mf4(__VA_ARGS__) +#define vmul_vv_i16mf2(...) __riscv_vmul_vv_i16mf2(__VA_ARGS__) +#define vmul_vx_i16mf2(...) __riscv_vmul_vx_i16mf2(__VA_ARGS__) +#define vmul_vv_i16m1(...) __riscv_vmul_vv_i16m1(__VA_ARGS__) +#define vmul_vx_i16m1(...) __riscv_vmul_vx_i16m1(__VA_ARGS__) +#define vmul_vv_i16m2(...) __riscv_vmul_vv_i16m2(__VA_ARGS__) +#define vmul_vx_i16m2(...) __riscv_vmul_vx_i16m2(__VA_ARGS__) +#define vmul_vv_i16m4(...) __riscv_vmul_vv_i16m4(__VA_ARGS__) +#define vmul_vx_i16m4(...) __riscv_vmul_vx_i16m4(__VA_ARGS__) +#define vmul_vv_i16m8(...) __riscv_vmul_vv_i16m8(__VA_ARGS__) +#define vmul_vx_i16m8(...) __riscv_vmul_vx_i16m8(__VA_ARGS__) +#define vmul_vv_i32mf2(...) __riscv_vmul_vv_i32mf2(__VA_ARGS__) +#define vmul_vx_i32mf2(...) __riscv_vmul_vx_i32mf2(__VA_ARGS__) +#define vmul_vv_i32m1(...) __riscv_vmul_vv_i32m1(__VA_ARGS__) +#define vmul_vx_i32m1(...) __riscv_vmul_vx_i32m1(__VA_ARGS__) +#define vmul_vv_i32m2(...) __riscv_vmul_vv_i32m2(__VA_ARGS__) +#define vmul_vx_i32m2(...) __riscv_vmul_vx_i32m2(__VA_ARGS__) +#define vmul_vv_i32m4(...) __riscv_vmul_vv_i32m4(__VA_ARGS__) +#define vmul_vx_i32m4(...) __riscv_vmul_vx_i32m4(__VA_ARGS__) +#define vmul_vv_i32m8(...) __riscv_vmul_vv_i32m8(__VA_ARGS__) +#define vmul_vx_i32m8(...) __riscv_vmul_vx_i32m8(__VA_ARGS__) +#define vmul_vv_i64m1(...) __riscv_vmul_vv_i64m1(__VA_ARGS__) +#define vmul_vx_i64m1(...) __riscv_vmul_vx_i64m1(__VA_ARGS__) +#define vmul_vv_i64m2(...) __riscv_vmul_vv_i64m2(__VA_ARGS__) +#define vmul_vx_i64m2(...) __riscv_vmul_vx_i64m2(__VA_ARGS__) +#define vmul_vv_i64m4(...) __riscv_vmul_vv_i64m4(__VA_ARGS__) +#define vmul_vx_i64m4(...) __riscv_vmul_vx_i64m4(__VA_ARGS__) +#define vmul_vv_i64m8(...) __riscv_vmul_vv_i64m8(__VA_ARGS__) +#define vmul_vx_i64m8(...) __riscv_vmul_vx_i64m8(__VA_ARGS__) +#define vmulh_vv_i8mf8(...) __riscv_vmulh_vv_i8mf8(__VA_ARGS__) +#define vmulh_vx_i8mf8(...) __riscv_vmulh_vx_i8mf8(__VA_ARGS__) +#define vmulh_vv_i8mf4(...) __riscv_vmulh_vv_i8mf4(__VA_ARGS__) +#define vmulh_vx_i8mf4(...) __riscv_vmulh_vx_i8mf4(__VA_ARGS__) +#define vmulh_vv_i8mf2(...) __riscv_vmulh_vv_i8mf2(__VA_ARGS__) +#define vmulh_vx_i8mf2(...) __riscv_vmulh_vx_i8mf2(__VA_ARGS__) +#define vmulh_vv_i8m1(...) __riscv_vmulh_vv_i8m1(__VA_ARGS__) +#define vmulh_vx_i8m1(...) __riscv_vmulh_vx_i8m1(__VA_ARGS__) +#define vmulh_vv_i8m2(...) __riscv_vmulh_vv_i8m2(__VA_ARGS__) +#define vmulh_vx_i8m2(...) __riscv_vmulh_vx_i8m2(__VA_ARGS__) +#define vmulh_vv_i8m4(...) __riscv_vmulh_vv_i8m4(__VA_ARGS__) +#define vmulh_vx_i8m4(...) __riscv_vmulh_vx_i8m4(__VA_ARGS__) +#define vmulh_vv_i8m8(...) __riscv_vmulh_vv_i8m8(__VA_ARGS__) +#define vmulh_vx_i8m8(...) __riscv_vmulh_vx_i8m8(__VA_ARGS__) +#define vmulh_vv_i16mf4(...) __riscv_vmulh_vv_i16mf4(__VA_ARGS__) +#define vmulh_vx_i16mf4(...) __riscv_vmulh_vx_i16mf4(__VA_ARGS__) +#define vmulh_vv_i16mf2(...) __riscv_vmulh_vv_i16mf2(__VA_ARGS__) +#define vmulh_vx_i16mf2(...) __riscv_vmulh_vx_i16mf2(__VA_ARGS__) +#define vmulh_vv_i16m1(...) __riscv_vmulh_vv_i16m1(__VA_ARGS__) +#define vmulh_vx_i16m1(...) __riscv_vmulh_vx_i16m1(__VA_ARGS__) +#define vmulh_vv_i16m2(...) __riscv_vmulh_vv_i16m2(__VA_ARGS__) +#define vmulh_vx_i16m2(...) __riscv_vmulh_vx_i16m2(__VA_ARGS__) +#define vmulh_vv_i16m4(...) __riscv_vmulh_vv_i16m4(__VA_ARGS__) +#define vmulh_vx_i16m4(...) __riscv_vmulh_vx_i16m4(__VA_ARGS__) +#define vmulh_vv_i16m8(...) __riscv_vmulh_vv_i16m8(__VA_ARGS__) +#define vmulh_vx_i16m8(...) __riscv_vmulh_vx_i16m8(__VA_ARGS__) +#define vmulh_vv_i32mf2(...) __riscv_vmulh_vv_i32mf2(__VA_ARGS__) +#define vmulh_vx_i32mf2(...) __riscv_vmulh_vx_i32mf2(__VA_ARGS__) +#define vmulh_vv_i32m1(...) __riscv_vmulh_vv_i32m1(__VA_ARGS__) +#define vmulh_vx_i32m1(...) __riscv_vmulh_vx_i32m1(__VA_ARGS__) +#define vmulh_vv_i32m2(...) __riscv_vmulh_vv_i32m2(__VA_ARGS__) +#define vmulh_vx_i32m2(...) __riscv_vmulh_vx_i32m2(__VA_ARGS__) +#define vmulh_vv_i32m4(...) __riscv_vmulh_vv_i32m4(__VA_ARGS__) +#define vmulh_vx_i32m4(...) __riscv_vmulh_vx_i32m4(__VA_ARGS__) +#define vmulh_vv_i32m8(...) __riscv_vmulh_vv_i32m8(__VA_ARGS__) +#define vmulh_vx_i32m8(...) __riscv_vmulh_vx_i32m8(__VA_ARGS__) +#define vmulh_vv_i64m1(...) __riscv_vmulh_vv_i64m1(__VA_ARGS__) +#define vmulh_vx_i64m1(...) __riscv_vmulh_vx_i64m1(__VA_ARGS__) +#define vmulh_vv_i64m2(...) __riscv_vmulh_vv_i64m2(__VA_ARGS__) +#define vmulh_vx_i64m2(...) __riscv_vmulh_vx_i64m2(__VA_ARGS__) +#define vmulh_vv_i64m4(...) __riscv_vmulh_vv_i64m4(__VA_ARGS__) +#define vmulh_vx_i64m4(...) __riscv_vmulh_vx_i64m4(__VA_ARGS__) +#define vmulh_vv_i64m8(...) __riscv_vmulh_vv_i64m8(__VA_ARGS__) +#define vmulh_vx_i64m8(...) __riscv_vmulh_vx_i64m8(__VA_ARGS__) +#define vmulhsu_vv_i8mf8(...) __riscv_vmulhsu_vv_i8mf8(__VA_ARGS__) +#define vmulhsu_vx_i8mf8(...) __riscv_vmulhsu_vx_i8mf8(__VA_ARGS__) +#define vmulhsu_vv_i8mf4(...) __riscv_vmulhsu_vv_i8mf4(__VA_ARGS__) +#define vmulhsu_vx_i8mf4(...) __riscv_vmulhsu_vx_i8mf4(__VA_ARGS__) +#define vmulhsu_vv_i8mf2(...) __riscv_vmulhsu_vv_i8mf2(__VA_ARGS__) +#define vmulhsu_vx_i8mf2(...) __riscv_vmulhsu_vx_i8mf2(__VA_ARGS__) +#define vmulhsu_vv_i8m1(...) __riscv_vmulhsu_vv_i8m1(__VA_ARGS__) +#define vmulhsu_vx_i8m1(...) __riscv_vmulhsu_vx_i8m1(__VA_ARGS__) +#define vmulhsu_vv_i8m2(...) __riscv_vmulhsu_vv_i8m2(__VA_ARGS__) +#define vmulhsu_vx_i8m2(...) __riscv_vmulhsu_vx_i8m2(__VA_ARGS__) +#define vmulhsu_vv_i8m4(...) __riscv_vmulhsu_vv_i8m4(__VA_ARGS__) +#define vmulhsu_vx_i8m4(...) __riscv_vmulhsu_vx_i8m4(__VA_ARGS__) +#define vmulhsu_vv_i8m8(...) __riscv_vmulhsu_vv_i8m8(__VA_ARGS__) +#define vmulhsu_vx_i8m8(...) __riscv_vmulhsu_vx_i8m8(__VA_ARGS__) +#define vmulhsu_vv_i16mf4(...) __riscv_vmulhsu_vv_i16mf4(__VA_ARGS__) +#define vmulhsu_vx_i16mf4(...) __riscv_vmulhsu_vx_i16mf4(__VA_ARGS__) +#define vmulhsu_vv_i16mf2(...) __riscv_vmulhsu_vv_i16mf2(__VA_ARGS__) +#define vmulhsu_vx_i16mf2(...) __riscv_vmulhsu_vx_i16mf2(__VA_ARGS__) +#define vmulhsu_vv_i16m1(...) __riscv_vmulhsu_vv_i16m1(__VA_ARGS__) +#define vmulhsu_vx_i16m1(...) __riscv_vmulhsu_vx_i16m1(__VA_ARGS__) +#define vmulhsu_vv_i16m2(...) __riscv_vmulhsu_vv_i16m2(__VA_ARGS__) +#define vmulhsu_vx_i16m2(...) __riscv_vmulhsu_vx_i16m2(__VA_ARGS__) +#define vmulhsu_vv_i16m4(...) __riscv_vmulhsu_vv_i16m4(__VA_ARGS__) +#define vmulhsu_vx_i16m4(...) __riscv_vmulhsu_vx_i16m4(__VA_ARGS__) +#define vmulhsu_vv_i16m8(...) __riscv_vmulhsu_vv_i16m8(__VA_ARGS__) +#define vmulhsu_vx_i16m8(...) __riscv_vmulhsu_vx_i16m8(__VA_ARGS__) +#define vmulhsu_vv_i32mf2(...) __riscv_vmulhsu_vv_i32mf2(__VA_ARGS__) +#define vmulhsu_vx_i32mf2(...) __riscv_vmulhsu_vx_i32mf2(__VA_ARGS__) +#define vmulhsu_vv_i32m1(...) __riscv_vmulhsu_vv_i32m1(__VA_ARGS__) +#define vmulhsu_vx_i32m1(...) __riscv_vmulhsu_vx_i32m1(__VA_ARGS__) +#define vmulhsu_vv_i32m2(...) __riscv_vmulhsu_vv_i32m2(__VA_ARGS__) +#define vmulhsu_vx_i32m2(...) __riscv_vmulhsu_vx_i32m2(__VA_ARGS__) +#define vmulhsu_vv_i32m4(...) __riscv_vmulhsu_vv_i32m4(__VA_ARGS__) +#define vmulhsu_vx_i32m4(...) __riscv_vmulhsu_vx_i32m4(__VA_ARGS__) +#define vmulhsu_vv_i32m8(...) __riscv_vmulhsu_vv_i32m8(__VA_ARGS__) +#define vmulhsu_vx_i32m8(...) __riscv_vmulhsu_vx_i32m8(__VA_ARGS__) +#define vmulhsu_vv_i64m1(...) __riscv_vmulhsu_vv_i64m1(__VA_ARGS__) +#define vmulhsu_vx_i64m1(...) __riscv_vmulhsu_vx_i64m1(__VA_ARGS__) +#define vmulhsu_vv_i64m2(...) __riscv_vmulhsu_vv_i64m2(__VA_ARGS__) +#define vmulhsu_vx_i64m2(...) __riscv_vmulhsu_vx_i64m2(__VA_ARGS__) +#define vmulhsu_vv_i64m4(...) __riscv_vmulhsu_vv_i64m4(__VA_ARGS__) +#define vmulhsu_vx_i64m4(...) __riscv_vmulhsu_vx_i64m4(__VA_ARGS__) +#define vmulhsu_vv_i64m8(...) __riscv_vmulhsu_vv_i64m8(__VA_ARGS__) +#define vmulhsu_vx_i64m8(...) __riscv_vmulhsu_vx_i64m8(__VA_ARGS__) +#define vmul_vv_u8mf8(...) __riscv_vmul_vv_u8mf8(__VA_ARGS__) +#define vmul_vx_u8mf8(...) __riscv_vmul_vx_u8mf8(__VA_ARGS__) +#define vmul_vv_u8mf4(...) __riscv_vmul_vv_u8mf4(__VA_ARGS__) +#define vmul_vx_u8mf4(...) __riscv_vmul_vx_u8mf4(__VA_ARGS__) +#define vmul_vv_u8mf2(...) __riscv_vmul_vv_u8mf2(__VA_ARGS__) +#define vmul_vx_u8mf2(...) __riscv_vmul_vx_u8mf2(__VA_ARGS__) +#define vmul_vv_u8m1(...) __riscv_vmul_vv_u8m1(__VA_ARGS__) +#define vmul_vx_u8m1(...) __riscv_vmul_vx_u8m1(__VA_ARGS__) +#define vmul_vv_u8m2(...) __riscv_vmul_vv_u8m2(__VA_ARGS__) +#define vmul_vx_u8m2(...) __riscv_vmul_vx_u8m2(__VA_ARGS__) +#define vmul_vv_u8m4(...) __riscv_vmul_vv_u8m4(__VA_ARGS__) +#define vmul_vx_u8m4(...) __riscv_vmul_vx_u8m4(__VA_ARGS__) +#define vmul_vv_u8m8(...) __riscv_vmul_vv_u8m8(__VA_ARGS__) +#define vmul_vx_u8m8(...) __riscv_vmul_vx_u8m8(__VA_ARGS__) +#define vmul_vv_u16mf4(...) __riscv_vmul_vv_u16mf4(__VA_ARGS__) +#define vmul_vx_u16mf4(...) __riscv_vmul_vx_u16mf4(__VA_ARGS__) +#define vmul_vv_u16mf2(...) __riscv_vmul_vv_u16mf2(__VA_ARGS__) +#define vmul_vx_u16mf2(...) __riscv_vmul_vx_u16mf2(__VA_ARGS__) +#define vmul_vv_u16m1(...) __riscv_vmul_vv_u16m1(__VA_ARGS__) +#define vmul_vx_u16m1(...) __riscv_vmul_vx_u16m1(__VA_ARGS__) +#define vmul_vv_u16m2(...) __riscv_vmul_vv_u16m2(__VA_ARGS__) +#define vmul_vx_u16m2(...) __riscv_vmul_vx_u16m2(__VA_ARGS__) +#define vmul_vv_u16m4(...) __riscv_vmul_vv_u16m4(__VA_ARGS__) +#define vmul_vx_u16m4(...) __riscv_vmul_vx_u16m4(__VA_ARGS__) +#define vmul_vv_u16m8(...) __riscv_vmul_vv_u16m8(__VA_ARGS__) +#define vmul_vx_u16m8(...) __riscv_vmul_vx_u16m8(__VA_ARGS__) +#define vmul_vv_u32mf2(...) __riscv_vmul_vv_u32mf2(__VA_ARGS__) +#define vmul_vx_u32mf2(...) __riscv_vmul_vx_u32mf2(__VA_ARGS__) +#define vmul_vv_u32m1(...) __riscv_vmul_vv_u32m1(__VA_ARGS__) +#define vmul_vx_u32m1(...) __riscv_vmul_vx_u32m1(__VA_ARGS__) +#define vmul_vv_u32m2(...) __riscv_vmul_vv_u32m2(__VA_ARGS__) +#define vmul_vx_u32m2(...) __riscv_vmul_vx_u32m2(__VA_ARGS__) +#define vmul_vv_u32m4(...) __riscv_vmul_vv_u32m4(__VA_ARGS__) +#define vmul_vx_u32m4(...) __riscv_vmul_vx_u32m4(__VA_ARGS__) +#define vmul_vv_u32m8(...) __riscv_vmul_vv_u32m8(__VA_ARGS__) +#define vmul_vx_u32m8(...) __riscv_vmul_vx_u32m8(__VA_ARGS__) +#define vmul_vv_u64m1(...) __riscv_vmul_vv_u64m1(__VA_ARGS__) +#define vmul_vx_u64m1(...) __riscv_vmul_vx_u64m1(__VA_ARGS__) +#define vmul_vv_u64m2(...) __riscv_vmul_vv_u64m2(__VA_ARGS__) +#define vmul_vx_u64m2(...) __riscv_vmul_vx_u64m2(__VA_ARGS__) +#define vmul_vv_u64m4(...) __riscv_vmul_vv_u64m4(__VA_ARGS__) +#define vmul_vx_u64m4(...) __riscv_vmul_vx_u64m4(__VA_ARGS__) +#define vmul_vv_u64m8(...) __riscv_vmul_vv_u64m8(__VA_ARGS__) +#define vmul_vx_u64m8(...) __riscv_vmul_vx_u64m8(__VA_ARGS__) +#define vmulhu_vv_u8mf8(...) __riscv_vmulhu_vv_u8mf8(__VA_ARGS__) +#define vmulhu_vx_u8mf8(...) __riscv_vmulhu_vx_u8mf8(__VA_ARGS__) +#define vmulhu_vv_u8mf4(...) __riscv_vmulhu_vv_u8mf4(__VA_ARGS__) +#define vmulhu_vx_u8mf4(...) __riscv_vmulhu_vx_u8mf4(__VA_ARGS__) +#define vmulhu_vv_u8mf2(...) __riscv_vmulhu_vv_u8mf2(__VA_ARGS__) +#define vmulhu_vx_u8mf2(...) __riscv_vmulhu_vx_u8mf2(__VA_ARGS__) +#define vmulhu_vv_u8m1(...) __riscv_vmulhu_vv_u8m1(__VA_ARGS__) +#define vmulhu_vx_u8m1(...) __riscv_vmulhu_vx_u8m1(__VA_ARGS__) +#define vmulhu_vv_u8m2(...) __riscv_vmulhu_vv_u8m2(__VA_ARGS__) +#define vmulhu_vx_u8m2(...) __riscv_vmulhu_vx_u8m2(__VA_ARGS__) +#define vmulhu_vv_u8m4(...) __riscv_vmulhu_vv_u8m4(__VA_ARGS__) +#define vmulhu_vx_u8m4(...) __riscv_vmulhu_vx_u8m4(__VA_ARGS__) +#define vmulhu_vv_u8m8(...) __riscv_vmulhu_vv_u8m8(__VA_ARGS__) +#define vmulhu_vx_u8m8(...) __riscv_vmulhu_vx_u8m8(__VA_ARGS__) +#define vmulhu_vv_u16mf4(...) __riscv_vmulhu_vv_u16mf4(__VA_ARGS__) +#define vmulhu_vx_u16mf4(...) __riscv_vmulhu_vx_u16mf4(__VA_ARGS__) +#define vmulhu_vv_u16mf2(...) __riscv_vmulhu_vv_u16mf2(__VA_ARGS__) +#define vmulhu_vx_u16mf2(...) __riscv_vmulhu_vx_u16mf2(__VA_ARGS__) +#define vmulhu_vv_u16m1(...) __riscv_vmulhu_vv_u16m1(__VA_ARGS__) +#define vmulhu_vx_u16m1(...) __riscv_vmulhu_vx_u16m1(__VA_ARGS__) +#define vmulhu_vv_u16m2(...) __riscv_vmulhu_vv_u16m2(__VA_ARGS__) +#define vmulhu_vx_u16m2(...) __riscv_vmulhu_vx_u16m2(__VA_ARGS__) +#define vmulhu_vv_u16m4(...) __riscv_vmulhu_vv_u16m4(__VA_ARGS__) +#define vmulhu_vx_u16m4(...) __riscv_vmulhu_vx_u16m4(__VA_ARGS__) +#define vmulhu_vv_u16m8(...) __riscv_vmulhu_vv_u16m8(__VA_ARGS__) +#define vmulhu_vx_u16m8(...) __riscv_vmulhu_vx_u16m8(__VA_ARGS__) +#define vmulhu_vv_u32mf2(...) __riscv_vmulhu_vv_u32mf2(__VA_ARGS__) +#define vmulhu_vx_u32mf2(...) __riscv_vmulhu_vx_u32mf2(__VA_ARGS__) +#define vmulhu_vv_u32m1(...) __riscv_vmulhu_vv_u32m1(__VA_ARGS__) +#define vmulhu_vx_u32m1(...) __riscv_vmulhu_vx_u32m1(__VA_ARGS__) +#define vmulhu_vv_u32m2(...) __riscv_vmulhu_vv_u32m2(__VA_ARGS__) +#define vmulhu_vx_u32m2(...) __riscv_vmulhu_vx_u32m2(__VA_ARGS__) +#define vmulhu_vv_u32m4(...) __riscv_vmulhu_vv_u32m4(__VA_ARGS__) +#define vmulhu_vx_u32m4(...) __riscv_vmulhu_vx_u32m4(__VA_ARGS__) +#define vmulhu_vv_u32m8(...) __riscv_vmulhu_vv_u32m8(__VA_ARGS__) +#define vmulhu_vx_u32m8(...) __riscv_vmulhu_vx_u32m8(__VA_ARGS__) +#define vmulhu_vv_u64m1(...) __riscv_vmulhu_vv_u64m1(__VA_ARGS__) +#define vmulhu_vx_u64m1(...) __riscv_vmulhu_vx_u64m1(__VA_ARGS__) +#define vmulhu_vv_u64m2(...) __riscv_vmulhu_vv_u64m2(__VA_ARGS__) +#define vmulhu_vx_u64m2(...) __riscv_vmulhu_vx_u64m2(__VA_ARGS__) +#define vmulhu_vv_u64m4(...) __riscv_vmulhu_vv_u64m4(__VA_ARGS__) +#define vmulhu_vx_u64m4(...) __riscv_vmulhu_vx_u64m4(__VA_ARGS__) +#define vmulhu_vv_u64m8(...) __riscv_vmulhu_vv_u64m8(__VA_ARGS__) +#define vmulhu_vx_u64m8(...) __riscv_vmulhu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vmul_vv_i8mf8_m(...) __riscv_vmul_vv_i8mf8_tumu(__VA_ARGS__) +#define vmul_vx_i8mf8_m(...) __riscv_vmul_vx_i8mf8_tumu(__VA_ARGS__) +#define vmul_vv_i8mf4_m(...) __riscv_vmul_vv_i8mf4_tumu(__VA_ARGS__) +#define vmul_vx_i8mf4_m(...) __riscv_vmul_vx_i8mf4_tumu(__VA_ARGS__) +#define vmul_vv_i8mf2_m(...) __riscv_vmul_vv_i8mf2_tumu(__VA_ARGS__) +#define vmul_vx_i8mf2_m(...) __riscv_vmul_vx_i8mf2_tumu(__VA_ARGS__) +#define vmul_vv_i8m1_m(...) __riscv_vmul_vv_i8m1_tumu(__VA_ARGS__) +#define vmul_vx_i8m1_m(...) __riscv_vmul_vx_i8m1_tumu(__VA_ARGS__) +#define vmul_vv_i8m2_m(...) __riscv_vmul_vv_i8m2_tumu(__VA_ARGS__) +#define vmul_vx_i8m2_m(...) __riscv_vmul_vx_i8m2_tumu(__VA_ARGS__) +#define vmul_vv_i8m4_m(...) __riscv_vmul_vv_i8m4_tumu(__VA_ARGS__) +#define vmul_vx_i8m4_m(...) __riscv_vmul_vx_i8m4_tumu(__VA_ARGS__) +#define vmul_vv_i8m8_m(...) __riscv_vmul_vv_i8m8_tumu(__VA_ARGS__) +#define vmul_vx_i8m8_m(...) __riscv_vmul_vx_i8m8_tumu(__VA_ARGS__) +#define vmul_vv_i16mf4_m(...) __riscv_vmul_vv_i16mf4_tumu(__VA_ARGS__) +#define vmul_vx_i16mf4_m(...) __riscv_vmul_vx_i16mf4_tumu(__VA_ARGS__) +#define vmul_vv_i16mf2_m(...) __riscv_vmul_vv_i16mf2_tumu(__VA_ARGS__) +#define vmul_vx_i16mf2_m(...) __riscv_vmul_vx_i16mf2_tumu(__VA_ARGS__) +#define vmul_vv_i16m1_m(...) __riscv_vmul_vv_i16m1_tumu(__VA_ARGS__) +#define vmul_vx_i16m1_m(...) __riscv_vmul_vx_i16m1_tumu(__VA_ARGS__) +#define vmul_vv_i16m2_m(...) __riscv_vmul_vv_i16m2_tumu(__VA_ARGS__) +#define vmul_vx_i16m2_m(...) __riscv_vmul_vx_i16m2_tumu(__VA_ARGS__) +#define vmul_vv_i16m4_m(...) __riscv_vmul_vv_i16m4_tumu(__VA_ARGS__) +#define vmul_vx_i16m4_m(...) __riscv_vmul_vx_i16m4_tumu(__VA_ARGS__) +#define vmul_vv_i16m8_m(...) __riscv_vmul_vv_i16m8_tumu(__VA_ARGS__) +#define vmul_vx_i16m8_m(...) __riscv_vmul_vx_i16m8_tumu(__VA_ARGS__) +#define vmul_vv_i32mf2_m(...) __riscv_vmul_vv_i32mf2_tumu(__VA_ARGS__) +#define vmul_vx_i32mf2_m(...) __riscv_vmul_vx_i32mf2_tumu(__VA_ARGS__) +#define vmul_vv_i32m1_m(...) __riscv_vmul_vv_i32m1_tumu(__VA_ARGS__) +#define vmul_vx_i32m1_m(...) __riscv_vmul_vx_i32m1_tumu(__VA_ARGS__) +#define vmul_vv_i32m2_m(...) __riscv_vmul_vv_i32m2_tumu(__VA_ARGS__) +#define vmul_vx_i32m2_m(...) __riscv_vmul_vx_i32m2_tumu(__VA_ARGS__) +#define vmul_vv_i32m4_m(...) __riscv_vmul_vv_i32m4_tumu(__VA_ARGS__) +#define vmul_vx_i32m4_m(...) __riscv_vmul_vx_i32m4_tumu(__VA_ARGS__) +#define vmul_vv_i32m8_m(...) __riscv_vmul_vv_i32m8_tumu(__VA_ARGS__) +#define vmul_vx_i32m8_m(...) __riscv_vmul_vx_i32m8_tumu(__VA_ARGS__) +#define vmul_vv_i64m1_m(...) __riscv_vmul_vv_i64m1_tumu(__VA_ARGS__) +#define vmul_vx_i64m1_m(...) __riscv_vmul_vx_i64m1_tumu(__VA_ARGS__) +#define vmul_vv_i64m2_m(...) __riscv_vmul_vv_i64m2_tumu(__VA_ARGS__) +#define vmul_vx_i64m2_m(...) __riscv_vmul_vx_i64m2_tumu(__VA_ARGS__) +#define vmul_vv_i64m4_m(...) __riscv_vmul_vv_i64m4_tumu(__VA_ARGS__) +#define vmul_vx_i64m4_m(...) __riscv_vmul_vx_i64m4_tumu(__VA_ARGS__) +#define vmul_vv_i64m8_m(...) __riscv_vmul_vv_i64m8_tumu(__VA_ARGS__) +#define vmul_vx_i64m8_m(...) __riscv_vmul_vx_i64m8_tumu(__VA_ARGS__) +#define vmulh_vv_i8mf8_m(...) __riscv_vmulh_vv_i8mf8_tumu(__VA_ARGS__) +#define vmulh_vx_i8mf8_m(...) __riscv_vmulh_vx_i8mf8_tumu(__VA_ARGS__) +#define vmulh_vv_i8mf4_m(...) __riscv_vmulh_vv_i8mf4_tumu(__VA_ARGS__) +#define vmulh_vx_i8mf4_m(...) __riscv_vmulh_vx_i8mf4_tumu(__VA_ARGS__) +#define vmulh_vv_i8mf2_m(...) __riscv_vmulh_vv_i8mf2_tumu(__VA_ARGS__) +#define vmulh_vx_i8mf2_m(...) __riscv_vmulh_vx_i8mf2_tumu(__VA_ARGS__) +#define vmulh_vv_i8m1_m(...) __riscv_vmulh_vv_i8m1_tumu(__VA_ARGS__) +#define vmulh_vx_i8m1_m(...) __riscv_vmulh_vx_i8m1_tumu(__VA_ARGS__) +#define vmulh_vv_i8m2_m(...) __riscv_vmulh_vv_i8m2_tumu(__VA_ARGS__) +#define vmulh_vx_i8m2_m(...) __riscv_vmulh_vx_i8m2_tumu(__VA_ARGS__) +#define vmulh_vv_i8m4_m(...) __riscv_vmulh_vv_i8m4_tumu(__VA_ARGS__) +#define vmulh_vx_i8m4_m(...) __riscv_vmulh_vx_i8m4_tumu(__VA_ARGS__) +#define vmulh_vv_i8m8_m(...) __riscv_vmulh_vv_i8m8_tumu(__VA_ARGS__) +#define vmulh_vx_i8m8_m(...) __riscv_vmulh_vx_i8m8_tumu(__VA_ARGS__) +#define vmulh_vv_i16mf4_m(...) __riscv_vmulh_vv_i16mf4_tumu(__VA_ARGS__) +#define vmulh_vx_i16mf4_m(...) __riscv_vmulh_vx_i16mf4_tumu(__VA_ARGS__) +#define vmulh_vv_i16mf2_m(...) __riscv_vmulh_vv_i16mf2_tumu(__VA_ARGS__) +#define vmulh_vx_i16mf2_m(...) __riscv_vmulh_vx_i16mf2_tumu(__VA_ARGS__) +#define vmulh_vv_i16m1_m(...) __riscv_vmulh_vv_i16m1_tumu(__VA_ARGS__) +#define vmulh_vx_i16m1_m(...) __riscv_vmulh_vx_i16m1_tumu(__VA_ARGS__) +#define vmulh_vv_i16m2_m(...) __riscv_vmulh_vv_i16m2_tumu(__VA_ARGS__) +#define vmulh_vx_i16m2_m(...) __riscv_vmulh_vx_i16m2_tumu(__VA_ARGS__) +#define vmulh_vv_i16m4_m(...) __riscv_vmulh_vv_i16m4_tumu(__VA_ARGS__) +#define vmulh_vx_i16m4_m(...) __riscv_vmulh_vx_i16m4_tumu(__VA_ARGS__) +#define vmulh_vv_i16m8_m(...) __riscv_vmulh_vv_i16m8_tumu(__VA_ARGS__) +#define vmulh_vx_i16m8_m(...) __riscv_vmulh_vx_i16m8_tumu(__VA_ARGS__) +#define vmulh_vv_i32mf2_m(...) __riscv_vmulh_vv_i32mf2_tumu(__VA_ARGS__) +#define vmulh_vx_i32mf2_m(...) __riscv_vmulh_vx_i32mf2_tumu(__VA_ARGS__) +#define vmulh_vv_i32m1_m(...) __riscv_vmulh_vv_i32m1_tumu(__VA_ARGS__) +#define vmulh_vx_i32m1_m(...) __riscv_vmulh_vx_i32m1_tumu(__VA_ARGS__) +#define vmulh_vv_i32m2_m(...) __riscv_vmulh_vv_i32m2_tumu(__VA_ARGS__) +#define vmulh_vx_i32m2_m(...) __riscv_vmulh_vx_i32m2_tumu(__VA_ARGS__) +#define vmulh_vv_i32m4_m(...) __riscv_vmulh_vv_i32m4_tumu(__VA_ARGS__) +#define vmulh_vx_i32m4_m(...) __riscv_vmulh_vx_i32m4_tumu(__VA_ARGS__) +#define vmulh_vv_i32m8_m(...) __riscv_vmulh_vv_i32m8_tumu(__VA_ARGS__) +#define vmulh_vx_i32m8_m(...) __riscv_vmulh_vx_i32m8_tumu(__VA_ARGS__) +#define vmulh_vv_i64m1_m(...) __riscv_vmulh_vv_i64m1_tumu(__VA_ARGS__) +#define vmulh_vx_i64m1_m(...) __riscv_vmulh_vx_i64m1_tumu(__VA_ARGS__) +#define vmulh_vv_i64m2_m(...) __riscv_vmulh_vv_i64m2_tumu(__VA_ARGS__) +#define vmulh_vx_i64m2_m(...) __riscv_vmulh_vx_i64m2_tumu(__VA_ARGS__) +#define vmulh_vv_i64m4_m(...) __riscv_vmulh_vv_i64m4_tumu(__VA_ARGS__) +#define vmulh_vx_i64m4_m(...) __riscv_vmulh_vx_i64m4_tumu(__VA_ARGS__) +#define vmulh_vv_i64m8_m(...) __riscv_vmulh_vv_i64m8_tumu(__VA_ARGS__) +#define vmulh_vx_i64m8_m(...) __riscv_vmulh_vx_i64m8_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8mf8_m(...) __riscv_vmulhsu_vv_i8mf8_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8mf8_m(...) __riscv_vmulhsu_vx_i8mf8_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8mf4_m(...) __riscv_vmulhsu_vv_i8mf4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8mf4_m(...) __riscv_vmulhsu_vx_i8mf4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8mf2_m(...) __riscv_vmulhsu_vv_i8mf2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8mf2_m(...) __riscv_vmulhsu_vx_i8mf2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8m1_m(...) __riscv_vmulhsu_vv_i8m1_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8m1_m(...) __riscv_vmulhsu_vx_i8m1_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8m2_m(...) __riscv_vmulhsu_vv_i8m2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8m2_m(...) __riscv_vmulhsu_vx_i8m2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8m4_m(...) __riscv_vmulhsu_vv_i8m4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8m4_m(...) __riscv_vmulhsu_vx_i8m4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i8m8_m(...) __riscv_vmulhsu_vv_i8m8_tumu(__VA_ARGS__) +#define vmulhsu_vx_i8m8_m(...) __riscv_vmulhsu_vx_i8m8_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16mf4_m(...) __riscv_vmulhsu_vv_i16mf4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16mf4_m(...) __riscv_vmulhsu_vx_i16mf4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16mf2_m(...) __riscv_vmulhsu_vv_i16mf2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16mf2_m(...) __riscv_vmulhsu_vx_i16mf2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16m1_m(...) __riscv_vmulhsu_vv_i16m1_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16m1_m(...) __riscv_vmulhsu_vx_i16m1_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16m2_m(...) __riscv_vmulhsu_vv_i16m2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16m2_m(...) __riscv_vmulhsu_vx_i16m2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16m4_m(...) __riscv_vmulhsu_vv_i16m4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16m4_m(...) __riscv_vmulhsu_vx_i16m4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i16m8_m(...) __riscv_vmulhsu_vv_i16m8_tumu(__VA_ARGS__) +#define vmulhsu_vx_i16m8_m(...) __riscv_vmulhsu_vx_i16m8_tumu(__VA_ARGS__) +#define vmulhsu_vv_i32mf2_m(...) __riscv_vmulhsu_vv_i32mf2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i32mf2_m(...) __riscv_vmulhsu_vx_i32mf2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i32m1_m(...) __riscv_vmulhsu_vv_i32m1_tumu(__VA_ARGS__) +#define vmulhsu_vx_i32m1_m(...) __riscv_vmulhsu_vx_i32m1_tumu(__VA_ARGS__) +#define vmulhsu_vv_i32m2_m(...) __riscv_vmulhsu_vv_i32m2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i32m2_m(...) __riscv_vmulhsu_vx_i32m2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i32m4_m(...) __riscv_vmulhsu_vv_i32m4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i32m4_m(...) __riscv_vmulhsu_vx_i32m4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i32m8_m(...) __riscv_vmulhsu_vv_i32m8_tumu(__VA_ARGS__) +#define vmulhsu_vx_i32m8_m(...) __riscv_vmulhsu_vx_i32m8_tumu(__VA_ARGS__) +#define vmulhsu_vv_i64m1_m(...) __riscv_vmulhsu_vv_i64m1_tumu(__VA_ARGS__) +#define vmulhsu_vx_i64m1_m(...) __riscv_vmulhsu_vx_i64m1_tumu(__VA_ARGS__) +#define vmulhsu_vv_i64m2_m(...) __riscv_vmulhsu_vv_i64m2_tumu(__VA_ARGS__) +#define vmulhsu_vx_i64m2_m(...) __riscv_vmulhsu_vx_i64m2_tumu(__VA_ARGS__) +#define vmulhsu_vv_i64m4_m(...) __riscv_vmulhsu_vv_i64m4_tumu(__VA_ARGS__) +#define vmulhsu_vx_i64m4_m(...) __riscv_vmulhsu_vx_i64m4_tumu(__VA_ARGS__) +#define vmulhsu_vv_i64m8_m(...) __riscv_vmulhsu_vv_i64m8_tumu(__VA_ARGS__) +#define vmulhsu_vx_i64m8_m(...) __riscv_vmulhsu_vx_i64m8_tumu(__VA_ARGS__) +#define vmul_vv_u8mf8_m(...) __riscv_vmul_vv_u8mf8_tumu(__VA_ARGS__) +#define vmul_vx_u8mf8_m(...) __riscv_vmul_vx_u8mf8_tumu(__VA_ARGS__) +#define vmul_vv_u8mf4_m(...) __riscv_vmul_vv_u8mf4_tumu(__VA_ARGS__) +#define vmul_vx_u8mf4_m(...) __riscv_vmul_vx_u8mf4_tumu(__VA_ARGS__) +#define vmul_vv_u8mf2_m(...) __riscv_vmul_vv_u8mf2_tumu(__VA_ARGS__) +#define vmul_vx_u8mf2_m(...) __riscv_vmul_vx_u8mf2_tumu(__VA_ARGS__) +#define vmul_vv_u8m1_m(...) __riscv_vmul_vv_u8m1_tumu(__VA_ARGS__) +#define vmul_vx_u8m1_m(...) __riscv_vmul_vx_u8m1_tumu(__VA_ARGS__) +#define vmul_vv_u8m2_m(...) __riscv_vmul_vv_u8m2_tumu(__VA_ARGS__) +#define vmul_vx_u8m2_m(...) __riscv_vmul_vx_u8m2_tumu(__VA_ARGS__) +#define vmul_vv_u8m4_m(...) __riscv_vmul_vv_u8m4_tumu(__VA_ARGS__) +#define vmul_vx_u8m4_m(...) __riscv_vmul_vx_u8m4_tumu(__VA_ARGS__) +#define vmul_vv_u8m8_m(...) __riscv_vmul_vv_u8m8_tumu(__VA_ARGS__) +#define vmul_vx_u8m8_m(...) __riscv_vmul_vx_u8m8_tumu(__VA_ARGS__) +#define vmul_vv_u16mf4_m(...) __riscv_vmul_vv_u16mf4_tumu(__VA_ARGS__) +#define vmul_vx_u16mf4_m(...) __riscv_vmul_vx_u16mf4_tumu(__VA_ARGS__) +#define vmul_vv_u16mf2_m(...) __riscv_vmul_vv_u16mf2_tumu(__VA_ARGS__) +#define vmul_vx_u16mf2_m(...) __riscv_vmul_vx_u16mf2_tumu(__VA_ARGS__) +#define vmul_vv_u16m1_m(...) __riscv_vmul_vv_u16m1_tumu(__VA_ARGS__) +#define vmul_vx_u16m1_m(...) __riscv_vmul_vx_u16m1_tumu(__VA_ARGS__) +#define vmul_vv_u16m2_m(...) __riscv_vmul_vv_u16m2_tumu(__VA_ARGS__) +#define vmul_vx_u16m2_m(...) __riscv_vmul_vx_u16m2_tumu(__VA_ARGS__) +#define vmul_vv_u16m4_m(...) __riscv_vmul_vv_u16m4_tumu(__VA_ARGS__) +#define vmul_vx_u16m4_m(...) __riscv_vmul_vx_u16m4_tumu(__VA_ARGS__) +#define vmul_vv_u16m8_m(...) __riscv_vmul_vv_u16m8_tumu(__VA_ARGS__) +#define vmul_vx_u16m8_m(...) __riscv_vmul_vx_u16m8_tumu(__VA_ARGS__) +#define vmul_vv_u32mf2_m(...) __riscv_vmul_vv_u32mf2_tumu(__VA_ARGS__) +#define vmul_vx_u32mf2_m(...) __riscv_vmul_vx_u32mf2_tumu(__VA_ARGS__) +#define vmul_vv_u32m1_m(...) __riscv_vmul_vv_u32m1_tumu(__VA_ARGS__) +#define vmul_vx_u32m1_m(...) __riscv_vmul_vx_u32m1_tumu(__VA_ARGS__) +#define vmul_vv_u32m2_m(...) __riscv_vmul_vv_u32m2_tumu(__VA_ARGS__) +#define vmul_vx_u32m2_m(...) __riscv_vmul_vx_u32m2_tumu(__VA_ARGS__) +#define vmul_vv_u32m4_m(...) __riscv_vmul_vv_u32m4_tumu(__VA_ARGS__) +#define vmul_vx_u32m4_m(...) __riscv_vmul_vx_u32m4_tumu(__VA_ARGS__) +#define vmul_vv_u32m8_m(...) __riscv_vmul_vv_u32m8_tumu(__VA_ARGS__) +#define vmul_vx_u32m8_m(...) __riscv_vmul_vx_u32m8_tumu(__VA_ARGS__) +#define vmul_vv_u64m1_m(...) __riscv_vmul_vv_u64m1_tumu(__VA_ARGS__) +#define vmul_vx_u64m1_m(...) __riscv_vmul_vx_u64m1_tumu(__VA_ARGS__) +#define vmul_vv_u64m2_m(...) __riscv_vmul_vv_u64m2_tumu(__VA_ARGS__) +#define vmul_vx_u64m2_m(...) __riscv_vmul_vx_u64m2_tumu(__VA_ARGS__) +#define vmul_vv_u64m4_m(...) __riscv_vmul_vv_u64m4_tumu(__VA_ARGS__) +#define vmul_vx_u64m4_m(...) __riscv_vmul_vx_u64m4_tumu(__VA_ARGS__) +#define vmul_vv_u64m8_m(...) __riscv_vmul_vv_u64m8_tumu(__VA_ARGS__) +#define vmul_vx_u64m8_m(...) __riscv_vmul_vx_u64m8_tumu(__VA_ARGS__) +#define vmulhu_vv_u8mf8_m(...) __riscv_vmulhu_vv_u8mf8_tumu(__VA_ARGS__) +#define vmulhu_vx_u8mf8_m(...) __riscv_vmulhu_vx_u8mf8_tumu(__VA_ARGS__) +#define vmulhu_vv_u8mf4_m(...) __riscv_vmulhu_vv_u8mf4_tumu(__VA_ARGS__) +#define vmulhu_vx_u8mf4_m(...) __riscv_vmulhu_vx_u8mf4_tumu(__VA_ARGS__) +#define vmulhu_vv_u8mf2_m(...) __riscv_vmulhu_vv_u8mf2_tumu(__VA_ARGS__) +#define vmulhu_vx_u8mf2_m(...) __riscv_vmulhu_vx_u8mf2_tumu(__VA_ARGS__) +#define vmulhu_vv_u8m1_m(...) __riscv_vmulhu_vv_u8m1_tumu(__VA_ARGS__) +#define vmulhu_vx_u8m1_m(...) __riscv_vmulhu_vx_u8m1_tumu(__VA_ARGS__) +#define vmulhu_vv_u8m2_m(...) __riscv_vmulhu_vv_u8m2_tumu(__VA_ARGS__) +#define vmulhu_vx_u8m2_m(...) __riscv_vmulhu_vx_u8m2_tumu(__VA_ARGS__) +#define vmulhu_vv_u8m4_m(...) __riscv_vmulhu_vv_u8m4_tumu(__VA_ARGS__) +#define vmulhu_vx_u8m4_m(...) __riscv_vmulhu_vx_u8m4_tumu(__VA_ARGS__) +#define vmulhu_vv_u8m8_m(...) __riscv_vmulhu_vv_u8m8_tumu(__VA_ARGS__) +#define vmulhu_vx_u8m8_m(...) __riscv_vmulhu_vx_u8m8_tumu(__VA_ARGS__) +#define vmulhu_vv_u16mf4_m(...) __riscv_vmulhu_vv_u16mf4_tumu(__VA_ARGS__) +#define vmulhu_vx_u16mf4_m(...) __riscv_vmulhu_vx_u16mf4_tumu(__VA_ARGS__) +#define vmulhu_vv_u16mf2_m(...) __riscv_vmulhu_vv_u16mf2_tumu(__VA_ARGS__) +#define vmulhu_vx_u16mf2_m(...) __riscv_vmulhu_vx_u16mf2_tumu(__VA_ARGS__) +#define vmulhu_vv_u16m1_m(...) __riscv_vmulhu_vv_u16m1_tumu(__VA_ARGS__) +#define vmulhu_vx_u16m1_m(...) __riscv_vmulhu_vx_u16m1_tumu(__VA_ARGS__) +#define vmulhu_vv_u16m2_m(...) __riscv_vmulhu_vv_u16m2_tumu(__VA_ARGS__) +#define vmulhu_vx_u16m2_m(...) __riscv_vmulhu_vx_u16m2_tumu(__VA_ARGS__) +#define vmulhu_vv_u16m4_m(...) __riscv_vmulhu_vv_u16m4_tumu(__VA_ARGS__) +#define vmulhu_vx_u16m4_m(...) __riscv_vmulhu_vx_u16m4_tumu(__VA_ARGS__) +#define vmulhu_vv_u16m8_m(...) __riscv_vmulhu_vv_u16m8_tumu(__VA_ARGS__) +#define vmulhu_vx_u16m8_m(...) __riscv_vmulhu_vx_u16m8_tumu(__VA_ARGS__) +#define vmulhu_vv_u32mf2_m(...) __riscv_vmulhu_vv_u32mf2_tumu(__VA_ARGS__) +#define vmulhu_vx_u32mf2_m(...) __riscv_vmulhu_vx_u32mf2_tumu(__VA_ARGS__) +#define vmulhu_vv_u32m1_m(...) __riscv_vmulhu_vv_u32m1_tumu(__VA_ARGS__) +#define vmulhu_vx_u32m1_m(...) __riscv_vmulhu_vx_u32m1_tumu(__VA_ARGS__) +#define vmulhu_vv_u32m2_m(...) __riscv_vmulhu_vv_u32m2_tumu(__VA_ARGS__) +#define vmulhu_vx_u32m2_m(...) __riscv_vmulhu_vx_u32m2_tumu(__VA_ARGS__) +#define vmulhu_vv_u32m4_m(...) __riscv_vmulhu_vv_u32m4_tumu(__VA_ARGS__) +#define vmulhu_vx_u32m4_m(...) __riscv_vmulhu_vx_u32m4_tumu(__VA_ARGS__) +#define vmulhu_vv_u32m8_m(...) __riscv_vmulhu_vv_u32m8_tumu(__VA_ARGS__) +#define vmulhu_vx_u32m8_m(...) __riscv_vmulhu_vx_u32m8_tumu(__VA_ARGS__) +#define vmulhu_vv_u64m1_m(...) __riscv_vmulhu_vv_u64m1_tumu(__VA_ARGS__) +#define vmulhu_vx_u64m1_m(...) __riscv_vmulhu_vx_u64m1_tumu(__VA_ARGS__) +#define vmulhu_vv_u64m2_m(...) __riscv_vmulhu_vv_u64m2_tumu(__VA_ARGS__) +#define vmulhu_vx_u64m2_m(...) __riscv_vmulhu_vx_u64m2_tumu(__VA_ARGS__) +#define vmulhu_vv_u64m4_m(...) __riscv_vmulhu_vv_u64m4_tumu(__VA_ARGS__) +#define vmulhu_vx_u64m4_m(...) __riscv_vmulhu_vx_u64m4_tumu(__VA_ARGS__) +#define vmulhu_vv_u64m8_m(...) __riscv_vmulhu_vv_u64m8_tumu(__VA_ARGS__) +#define vmulhu_vx_u64m8_m(...) __riscv_vmulhu_vx_u64m8_tumu(__VA_ARGS__) +#define vdiv_vv_i8mf8(...) __riscv_vdiv_vv_i8mf8(__VA_ARGS__) +#define vdiv_vx_i8mf8(...) __riscv_vdiv_vx_i8mf8(__VA_ARGS__) +#define vdiv_vv_i8mf4(...) __riscv_vdiv_vv_i8mf4(__VA_ARGS__) +#define vdiv_vx_i8mf4(...) __riscv_vdiv_vx_i8mf4(__VA_ARGS__) +#define vdiv_vv_i8mf2(...) __riscv_vdiv_vv_i8mf2(__VA_ARGS__) +#define vdiv_vx_i8mf2(...) __riscv_vdiv_vx_i8mf2(__VA_ARGS__) +#define vdiv_vv_i8m1(...) __riscv_vdiv_vv_i8m1(__VA_ARGS__) +#define vdiv_vx_i8m1(...) __riscv_vdiv_vx_i8m1(__VA_ARGS__) +#define vdiv_vv_i8m2(...) __riscv_vdiv_vv_i8m2(__VA_ARGS__) +#define vdiv_vx_i8m2(...) __riscv_vdiv_vx_i8m2(__VA_ARGS__) +#define vdiv_vv_i8m4(...) __riscv_vdiv_vv_i8m4(__VA_ARGS__) +#define vdiv_vx_i8m4(...) __riscv_vdiv_vx_i8m4(__VA_ARGS__) +#define vdiv_vv_i8m8(...) __riscv_vdiv_vv_i8m8(__VA_ARGS__) +#define vdiv_vx_i8m8(...) __riscv_vdiv_vx_i8m8(__VA_ARGS__) +#define vdiv_vv_i16mf4(...) __riscv_vdiv_vv_i16mf4(__VA_ARGS__) +#define vdiv_vx_i16mf4(...) __riscv_vdiv_vx_i16mf4(__VA_ARGS__) +#define vdiv_vv_i16mf2(...) __riscv_vdiv_vv_i16mf2(__VA_ARGS__) +#define vdiv_vx_i16mf2(...) __riscv_vdiv_vx_i16mf2(__VA_ARGS__) +#define vdiv_vv_i16m1(...) __riscv_vdiv_vv_i16m1(__VA_ARGS__) +#define vdiv_vx_i16m1(...) __riscv_vdiv_vx_i16m1(__VA_ARGS__) +#define vdiv_vv_i16m2(...) __riscv_vdiv_vv_i16m2(__VA_ARGS__) +#define vdiv_vx_i16m2(...) __riscv_vdiv_vx_i16m2(__VA_ARGS__) +#define vdiv_vv_i16m4(...) __riscv_vdiv_vv_i16m4(__VA_ARGS__) +#define vdiv_vx_i16m4(...) __riscv_vdiv_vx_i16m4(__VA_ARGS__) +#define vdiv_vv_i16m8(...) __riscv_vdiv_vv_i16m8(__VA_ARGS__) +#define vdiv_vx_i16m8(...) __riscv_vdiv_vx_i16m8(__VA_ARGS__) +#define vdiv_vv_i32mf2(...) __riscv_vdiv_vv_i32mf2(__VA_ARGS__) +#define vdiv_vx_i32mf2(...) __riscv_vdiv_vx_i32mf2(__VA_ARGS__) +#define vdiv_vv_i32m1(...) __riscv_vdiv_vv_i32m1(__VA_ARGS__) +#define vdiv_vx_i32m1(...) __riscv_vdiv_vx_i32m1(__VA_ARGS__) +#define vdiv_vv_i32m2(...) __riscv_vdiv_vv_i32m2(__VA_ARGS__) +#define vdiv_vx_i32m2(...) __riscv_vdiv_vx_i32m2(__VA_ARGS__) +#define vdiv_vv_i32m4(...) __riscv_vdiv_vv_i32m4(__VA_ARGS__) +#define vdiv_vx_i32m4(...) __riscv_vdiv_vx_i32m4(__VA_ARGS__) +#define vdiv_vv_i32m8(...) __riscv_vdiv_vv_i32m8(__VA_ARGS__) +#define vdiv_vx_i32m8(...) __riscv_vdiv_vx_i32m8(__VA_ARGS__) +#define vdiv_vv_i64m1(...) __riscv_vdiv_vv_i64m1(__VA_ARGS__) +#define vdiv_vx_i64m1(...) __riscv_vdiv_vx_i64m1(__VA_ARGS__) +#define vdiv_vv_i64m2(...) __riscv_vdiv_vv_i64m2(__VA_ARGS__) +#define vdiv_vx_i64m2(...) __riscv_vdiv_vx_i64m2(__VA_ARGS__) +#define vdiv_vv_i64m4(...) __riscv_vdiv_vv_i64m4(__VA_ARGS__) +#define vdiv_vx_i64m4(...) __riscv_vdiv_vx_i64m4(__VA_ARGS__) +#define vdiv_vv_i64m8(...) __riscv_vdiv_vv_i64m8(__VA_ARGS__) +#define vdiv_vx_i64m8(...) __riscv_vdiv_vx_i64m8(__VA_ARGS__) +#define vrem_vv_i8mf8(...) __riscv_vrem_vv_i8mf8(__VA_ARGS__) +#define vrem_vx_i8mf8(...) __riscv_vrem_vx_i8mf8(__VA_ARGS__) +#define vrem_vv_i8mf4(...) __riscv_vrem_vv_i8mf4(__VA_ARGS__) +#define vrem_vx_i8mf4(...) __riscv_vrem_vx_i8mf4(__VA_ARGS__) +#define vrem_vv_i8mf2(...) __riscv_vrem_vv_i8mf2(__VA_ARGS__) +#define vrem_vx_i8mf2(...) __riscv_vrem_vx_i8mf2(__VA_ARGS__) +#define vrem_vv_i8m1(...) __riscv_vrem_vv_i8m1(__VA_ARGS__) +#define vrem_vx_i8m1(...) __riscv_vrem_vx_i8m1(__VA_ARGS__) +#define vrem_vv_i8m2(...) __riscv_vrem_vv_i8m2(__VA_ARGS__) +#define vrem_vx_i8m2(...) __riscv_vrem_vx_i8m2(__VA_ARGS__) +#define vrem_vv_i8m4(...) __riscv_vrem_vv_i8m4(__VA_ARGS__) +#define vrem_vx_i8m4(...) __riscv_vrem_vx_i8m4(__VA_ARGS__) +#define vrem_vv_i8m8(...) __riscv_vrem_vv_i8m8(__VA_ARGS__) +#define vrem_vx_i8m8(...) __riscv_vrem_vx_i8m8(__VA_ARGS__) +#define vrem_vv_i16mf4(...) __riscv_vrem_vv_i16mf4(__VA_ARGS__) +#define vrem_vx_i16mf4(...) __riscv_vrem_vx_i16mf4(__VA_ARGS__) +#define vrem_vv_i16mf2(...) __riscv_vrem_vv_i16mf2(__VA_ARGS__) +#define vrem_vx_i16mf2(...) __riscv_vrem_vx_i16mf2(__VA_ARGS__) +#define vrem_vv_i16m1(...) __riscv_vrem_vv_i16m1(__VA_ARGS__) +#define vrem_vx_i16m1(...) __riscv_vrem_vx_i16m1(__VA_ARGS__) +#define vrem_vv_i16m2(...) __riscv_vrem_vv_i16m2(__VA_ARGS__) +#define vrem_vx_i16m2(...) __riscv_vrem_vx_i16m2(__VA_ARGS__) +#define vrem_vv_i16m4(...) __riscv_vrem_vv_i16m4(__VA_ARGS__) +#define vrem_vx_i16m4(...) __riscv_vrem_vx_i16m4(__VA_ARGS__) +#define vrem_vv_i16m8(...) __riscv_vrem_vv_i16m8(__VA_ARGS__) +#define vrem_vx_i16m8(...) __riscv_vrem_vx_i16m8(__VA_ARGS__) +#define vrem_vv_i32mf2(...) __riscv_vrem_vv_i32mf2(__VA_ARGS__) +#define vrem_vx_i32mf2(...) __riscv_vrem_vx_i32mf2(__VA_ARGS__) +#define vrem_vv_i32m1(...) __riscv_vrem_vv_i32m1(__VA_ARGS__) +#define vrem_vx_i32m1(...) __riscv_vrem_vx_i32m1(__VA_ARGS__) +#define vrem_vv_i32m2(...) __riscv_vrem_vv_i32m2(__VA_ARGS__) +#define vrem_vx_i32m2(...) __riscv_vrem_vx_i32m2(__VA_ARGS__) +#define vrem_vv_i32m4(...) __riscv_vrem_vv_i32m4(__VA_ARGS__) +#define vrem_vx_i32m4(...) __riscv_vrem_vx_i32m4(__VA_ARGS__) +#define vrem_vv_i32m8(...) __riscv_vrem_vv_i32m8(__VA_ARGS__) +#define vrem_vx_i32m8(...) __riscv_vrem_vx_i32m8(__VA_ARGS__) +#define vrem_vv_i64m1(...) __riscv_vrem_vv_i64m1(__VA_ARGS__) +#define vrem_vx_i64m1(...) __riscv_vrem_vx_i64m1(__VA_ARGS__) +#define vrem_vv_i64m2(...) __riscv_vrem_vv_i64m2(__VA_ARGS__) +#define vrem_vx_i64m2(...) __riscv_vrem_vx_i64m2(__VA_ARGS__) +#define vrem_vv_i64m4(...) __riscv_vrem_vv_i64m4(__VA_ARGS__) +#define vrem_vx_i64m4(...) __riscv_vrem_vx_i64m4(__VA_ARGS__) +#define vrem_vv_i64m8(...) __riscv_vrem_vv_i64m8(__VA_ARGS__) +#define vrem_vx_i64m8(...) __riscv_vrem_vx_i64m8(__VA_ARGS__) +#define vdivu_vv_u8mf8(...) __riscv_vdivu_vv_u8mf8(__VA_ARGS__) +#define vdivu_vx_u8mf8(...) __riscv_vdivu_vx_u8mf8(__VA_ARGS__) +#define vdivu_vv_u8mf4(...) __riscv_vdivu_vv_u8mf4(__VA_ARGS__) +#define vdivu_vx_u8mf4(...) __riscv_vdivu_vx_u8mf4(__VA_ARGS__) +#define vdivu_vv_u8mf2(...) __riscv_vdivu_vv_u8mf2(__VA_ARGS__) +#define vdivu_vx_u8mf2(...) __riscv_vdivu_vx_u8mf2(__VA_ARGS__) +#define vdivu_vv_u8m1(...) __riscv_vdivu_vv_u8m1(__VA_ARGS__) +#define vdivu_vx_u8m1(...) __riscv_vdivu_vx_u8m1(__VA_ARGS__) +#define vdivu_vv_u8m2(...) __riscv_vdivu_vv_u8m2(__VA_ARGS__) +#define vdivu_vx_u8m2(...) __riscv_vdivu_vx_u8m2(__VA_ARGS__) +#define vdivu_vv_u8m4(...) __riscv_vdivu_vv_u8m4(__VA_ARGS__) +#define vdivu_vx_u8m4(...) __riscv_vdivu_vx_u8m4(__VA_ARGS__) +#define vdivu_vv_u8m8(...) __riscv_vdivu_vv_u8m8(__VA_ARGS__) +#define vdivu_vx_u8m8(...) __riscv_vdivu_vx_u8m8(__VA_ARGS__) +#define vdivu_vv_u16mf4(...) __riscv_vdivu_vv_u16mf4(__VA_ARGS__) +#define vdivu_vx_u16mf4(...) __riscv_vdivu_vx_u16mf4(__VA_ARGS__) +#define vdivu_vv_u16mf2(...) __riscv_vdivu_vv_u16mf2(__VA_ARGS__) +#define vdivu_vx_u16mf2(...) __riscv_vdivu_vx_u16mf2(__VA_ARGS__) +#define vdivu_vv_u16m1(...) __riscv_vdivu_vv_u16m1(__VA_ARGS__) +#define vdivu_vx_u16m1(...) __riscv_vdivu_vx_u16m1(__VA_ARGS__) +#define vdivu_vv_u16m2(...) __riscv_vdivu_vv_u16m2(__VA_ARGS__) +#define vdivu_vx_u16m2(...) __riscv_vdivu_vx_u16m2(__VA_ARGS__) +#define vdivu_vv_u16m4(...) __riscv_vdivu_vv_u16m4(__VA_ARGS__) +#define vdivu_vx_u16m4(...) __riscv_vdivu_vx_u16m4(__VA_ARGS__) +#define vdivu_vv_u16m8(...) __riscv_vdivu_vv_u16m8(__VA_ARGS__) +#define vdivu_vx_u16m8(...) __riscv_vdivu_vx_u16m8(__VA_ARGS__) +#define vdivu_vv_u32mf2(...) __riscv_vdivu_vv_u32mf2(__VA_ARGS__) +#define vdivu_vx_u32mf2(...) __riscv_vdivu_vx_u32mf2(__VA_ARGS__) +#define vdivu_vv_u32m1(...) __riscv_vdivu_vv_u32m1(__VA_ARGS__) +#define vdivu_vx_u32m1(...) __riscv_vdivu_vx_u32m1(__VA_ARGS__) +#define vdivu_vv_u32m2(...) __riscv_vdivu_vv_u32m2(__VA_ARGS__) +#define vdivu_vx_u32m2(...) __riscv_vdivu_vx_u32m2(__VA_ARGS__) +#define vdivu_vv_u32m4(...) __riscv_vdivu_vv_u32m4(__VA_ARGS__) +#define vdivu_vx_u32m4(...) __riscv_vdivu_vx_u32m4(__VA_ARGS__) +#define vdivu_vv_u32m8(...) __riscv_vdivu_vv_u32m8(__VA_ARGS__) +#define vdivu_vx_u32m8(...) __riscv_vdivu_vx_u32m8(__VA_ARGS__) +#define vdivu_vv_u64m1(...) __riscv_vdivu_vv_u64m1(__VA_ARGS__) +#define vdivu_vx_u64m1(...) __riscv_vdivu_vx_u64m1(__VA_ARGS__) +#define vdivu_vv_u64m2(...) __riscv_vdivu_vv_u64m2(__VA_ARGS__) +#define vdivu_vx_u64m2(...) __riscv_vdivu_vx_u64m2(__VA_ARGS__) +#define vdivu_vv_u64m4(...) __riscv_vdivu_vv_u64m4(__VA_ARGS__) +#define vdivu_vx_u64m4(...) __riscv_vdivu_vx_u64m4(__VA_ARGS__) +#define vdivu_vv_u64m8(...) __riscv_vdivu_vv_u64m8(__VA_ARGS__) +#define vdivu_vx_u64m8(...) __riscv_vdivu_vx_u64m8(__VA_ARGS__) +#define vremu_vv_u8mf8(...) __riscv_vremu_vv_u8mf8(__VA_ARGS__) +#define vremu_vx_u8mf8(...) __riscv_vremu_vx_u8mf8(__VA_ARGS__) +#define vremu_vv_u8mf4(...) __riscv_vremu_vv_u8mf4(__VA_ARGS__) +#define vremu_vx_u8mf4(...) __riscv_vremu_vx_u8mf4(__VA_ARGS__) +#define vremu_vv_u8mf2(...) __riscv_vremu_vv_u8mf2(__VA_ARGS__) +#define vremu_vx_u8mf2(...) __riscv_vremu_vx_u8mf2(__VA_ARGS__) +#define vremu_vv_u8m1(...) __riscv_vremu_vv_u8m1(__VA_ARGS__) +#define vremu_vx_u8m1(...) __riscv_vremu_vx_u8m1(__VA_ARGS__) +#define vremu_vv_u8m2(...) __riscv_vremu_vv_u8m2(__VA_ARGS__) +#define vremu_vx_u8m2(...) __riscv_vremu_vx_u8m2(__VA_ARGS__) +#define vremu_vv_u8m4(...) __riscv_vremu_vv_u8m4(__VA_ARGS__) +#define vremu_vx_u8m4(...) __riscv_vremu_vx_u8m4(__VA_ARGS__) +#define vremu_vv_u8m8(...) __riscv_vremu_vv_u8m8(__VA_ARGS__) +#define vremu_vx_u8m8(...) __riscv_vremu_vx_u8m8(__VA_ARGS__) +#define vremu_vv_u16mf4(...) __riscv_vremu_vv_u16mf4(__VA_ARGS__) +#define vremu_vx_u16mf4(...) __riscv_vremu_vx_u16mf4(__VA_ARGS__) +#define vremu_vv_u16mf2(...) __riscv_vremu_vv_u16mf2(__VA_ARGS__) +#define vremu_vx_u16mf2(...) __riscv_vremu_vx_u16mf2(__VA_ARGS__) +#define vremu_vv_u16m1(...) __riscv_vremu_vv_u16m1(__VA_ARGS__) +#define vremu_vx_u16m1(...) __riscv_vremu_vx_u16m1(__VA_ARGS__) +#define vremu_vv_u16m2(...) __riscv_vremu_vv_u16m2(__VA_ARGS__) +#define vremu_vx_u16m2(...) __riscv_vremu_vx_u16m2(__VA_ARGS__) +#define vremu_vv_u16m4(...) __riscv_vremu_vv_u16m4(__VA_ARGS__) +#define vremu_vx_u16m4(...) __riscv_vremu_vx_u16m4(__VA_ARGS__) +#define vremu_vv_u16m8(...) __riscv_vremu_vv_u16m8(__VA_ARGS__) +#define vremu_vx_u16m8(...) __riscv_vremu_vx_u16m8(__VA_ARGS__) +#define vremu_vv_u32mf2(...) __riscv_vremu_vv_u32mf2(__VA_ARGS__) +#define vremu_vx_u32mf2(...) __riscv_vremu_vx_u32mf2(__VA_ARGS__) +#define vremu_vv_u32m1(...) __riscv_vremu_vv_u32m1(__VA_ARGS__) +#define vremu_vx_u32m1(...) __riscv_vremu_vx_u32m1(__VA_ARGS__) +#define vremu_vv_u32m2(...) __riscv_vremu_vv_u32m2(__VA_ARGS__) +#define vremu_vx_u32m2(...) __riscv_vremu_vx_u32m2(__VA_ARGS__) +#define vremu_vv_u32m4(...) __riscv_vremu_vv_u32m4(__VA_ARGS__) +#define vremu_vx_u32m4(...) __riscv_vremu_vx_u32m4(__VA_ARGS__) +#define vremu_vv_u32m8(...) __riscv_vremu_vv_u32m8(__VA_ARGS__) +#define vremu_vx_u32m8(...) __riscv_vremu_vx_u32m8(__VA_ARGS__) +#define vremu_vv_u64m1(...) __riscv_vremu_vv_u64m1(__VA_ARGS__) +#define vremu_vx_u64m1(...) __riscv_vremu_vx_u64m1(__VA_ARGS__) +#define vremu_vv_u64m2(...) __riscv_vremu_vv_u64m2(__VA_ARGS__) +#define vremu_vx_u64m2(...) __riscv_vremu_vx_u64m2(__VA_ARGS__) +#define vremu_vv_u64m4(...) __riscv_vremu_vv_u64m4(__VA_ARGS__) +#define vremu_vx_u64m4(...) __riscv_vremu_vx_u64m4(__VA_ARGS__) +#define vremu_vv_u64m8(...) __riscv_vremu_vv_u64m8(__VA_ARGS__) +#define vremu_vx_u64m8(...) __riscv_vremu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vdiv_vv_i8mf8_m(...) __riscv_vdiv_vv_i8mf8_tumu(__VA_ARGS__) +#define vdiv_vx_i8mf8_m(...) __riscv_vdiv_vx_i8mf8_tumu(__VA_ARGS__) +#define vdiv_vv_i8mf4_m(...) __riscv_vdiv_vv_i8mf4_tumu(__VA_ARGS__) +#define vdiv_vx_i8mf4_m(...) __riscv_vdiv_vx_i8mf4_tumu(__VA_ARGS__) +#define vdiv_vv_i8mf2_m(...) __riscv_vdiv_vv_i8mf2_tumu(__VA_ARGS__) +#define vdiv_vx_i8mf2_m(...) __riscv_vdiv_vx_i8mf2_tumu(__VA_ARGS__) +#define vdiv_vv_i8m1_m(...) __riscv_vdiv_vv_i8m1_tumu(__VA_ARGS__) +#define vdiv_vx_i8m1_m(...) __riscv_vdiv_vx_i8m1_tumu(__VA_ARGS__) +#define vdiv_vv_i8m2_m(...) __riscv_vdiv_vv_i8m2_tumu(__VA_ARGS__) +#define vdiv_vx_i8m2_m(...) __riscv_vdiv_vx_i8m2_tumu(__VA_ARGS__) +#define vdiv_vv_i8m4_m(...) __riscv_vdiv_vv_i8m4_tumu(__VA_ARGS__) +#define vdiv_vx_i8m4_m(...) __riscv_vdiv_vx_i8m4_tumu(__VA_ARGS__) +#define vdiv_vv_i8m8_m(...) __riscv_vdiv_vv_i8m8_tumu(__VA_ARGS__) +#define vdiv_vx_i8m8_m(...) __riscv_vdiv_vx_i8m8_tumu(__VA_ARGS__) +#define vdiv_vv_i16mf4_m(...) __riscv_vdiv_vv_i16mf4_tumu(__VA_ARGS__) +#define vdiv_vx_i16mf4_m(...) __riscv_vdiv_vx_i16mf4_tumu(__VA_ARGS__) +#define vdiv_vv_i16mf2_m(...) __riscv_vdiv_vv_i16mf2_tumu(__VA_ARGS__) +#define vdiv_vx_i16mf2_m(...) __riscv_vdiv_vx_i16mf2_tumu(__VA_ARGS__) +#define vdiv_vv_i16m1_m(...) __riscv_vdiv_vv_i16m1_tumu(__VA_ARGS__) +#define vdiv_vx_i16m1_m(...) __riscv_vdiv_vx_i16m1_tumu(__VA_ARGS__) +#define vdiv_vv_i16m2_m(...) __riscv_vdiv_vv_i16m2_tumu(__VA_ARGS__) +#define vdiv_vx_i16m2_m(...) __riscv_vdiv_vx_i16m2_tumu(__VA_ARGS__) +#define vdiv_vv_i16m4_m(...) __riscv_vdiv_vv_i16m4_tumu(__VA_ARGS__) +#define vdiv_vx_i16m4_m(...) __riscv_vdiv_vx_i16m4_tumu(__VA_ARGS__) +#define vdiv_vv_i16m8_m(...) __riscv_vdiv_vv_i16m8_tumu(__VA_ARGS__) +#define vdiv_vx_i16m8_m(...) __riscv_vdiv_vx_i16m8_tumu(__VA_ARGS__) +#define vdiv_vv_i32mf2_m(...) __riscv_vdiv_vv_i32mf2_tumu(__VA_ARGS__) +#define vdiv_vx_i32mf2_m(...) __riscv_vdiv_vx_i32mf2_tumu(__VA_ARGS__) +#define vdiv_vv_i32m1_m(...) __riscv_vdiv_vv_i32m1_tumu(__VA_ARGS__) +#define vdiv_vx_i32m1_m(...) __riscv_vdiv_vx_i32m1_tumu(__VA_ARGS__) +#define vdiv_vv_i32m2_m(...) __riscv_vdiv_vv_i32m2_tumu(__VA_ARGS__) +#define vdiv_vx_i32m2_m(...) __riscv_vdiv_vx_i32m2_tumu(__VA_ARGS__) +#define vdiv_vv_i32m4_m(...) __riscv_vdiv_vv_i32m4_tumu(__VA_ARGS__) +#define vdiv_vx_i32m4_m(...) __riscv_vdiv_vx_i32m4_tumu(__VA_ARGS__) +#define vdiv_vv_i32m8_m(...) __riscv_vdiv_vv_i32m8_tumu(__VA_ARGS__) +#define vdiv_vx_i32m8_m(...) __riscv_vdiv_vx_i32m8_tumu(__VA_ARGS__) +#define vdiv_vv_i64m1_m(...) __riscv_vdiv_vv_i64m1_tumu(__VA_ARGS__) +#define vdiv_vx_i64m1_m(...) __riscv_vdiv_vx_i64m1_tumu(__VA_ARGS__) +#define vdiv_vv_i64m2_m(...) __riscv_vdiv_vv_i64m2_tumu(__VA_ARGS__) +#define vdiv_vx_i64m2_m(...) __riscv_vdiv_vx_i64m2_tumu(__VA_ARGS__) +#define vdiv_vv_i64m4_m(...) __riscv_vdiv_vv_i64m4_tumu(__VA_ARGS__) +#define vdiv_vx_i64m4_m(...) __riscv_vdiv_vx_i64m4_tumu(__VA_ARGS__) +#define vdiv_vv_i64m8_m(...) __riscv_vdiv_vv_i64m8_tumu(__VA_ARGS__) +#define vdiv_vx_i64m8_m(...) __riscv_vdiv_vx_i64m8_tumu(__VA_ARGS__) +#define vrem_vv_i8mf8_m(...) __riscv_vrem_vv_i8mf8_tumu(__VA_ARGS__) +#define vrem_vx_i8mf8_m(...) __riscv_vrem_vx_i8mf8_tumu(__VA_ARGS__) +#define vrem_vv_i8mf4_m(...) __riscv_vrem_vv_i8mf4_tumu(__VA_ARGS__) +#define vrem_vx_i8mf4_m(...) __riscv_vrem_vx_i8mf4_tumu(__VA_ARGS__) +#define vrem_vv_i8mf2_m(...) __riscv_vrem_vv_i8mf2_tumu(__VA_ARGS__) +#define vrem_vx_i8mf2_m(...) __riscv_vrem_vx_i8mf2_tumu(__VA_ARGS__) +#define vrem_vv_i8m1_m(...) __riscv_vrem_vv_i8m1_tumu(__VA_ARGS__) +#define vrem_vx_i8m1_m(...) __riscv_vrem_vx_i8m1_tumu(__VA_ARGS__) +#define vrem_vv_i8m2_m(...) __riscv_vrem_vv_i8m2_tumu(__VA_ARGS__) +#define vrem_vx_i8m2_m(...) __riscv_vrem_vx_i8m2_tumu(__VA_ARGS__) +#define vrem_vv_i8m4_m(...) __riscv_vrem_vv_i8m4_tumu(__VA_ARGS__) +#define vrem_vx_i8m4_m(...) __riscv_vrem_vx_i8m4_tumu(__VA_ARGS__) +#define vrem_vv_i8m8_m(...) __riscv_vrem_vv_i8m8_tumu(__VA_ARGS__) +#define vrem_vx_i8m8_m(...) __riscv_vrem_vx_i8m8_tumu(__VA_ARGS__) +#define vrem_vv_i16mf4_m(...) __riscv_vrem_vv_i16mf4_tumu(__VA_ARGS__) +#define vrem_vx_i16mf4_m(...) __riscv_vrem_vx_i16mf4_tumu(__VA_ARGS__) +#define vrem_vv_i16mf2_m(...) __riscv_vrem_vv_i16mf2_tumu(__VA_ARGS__) +#define vrem_vx_i16mf2_m(...) __riscv_vrem_vx_i16mf2_tumu(__VA_ARGS__) +#define vrem_vv_i16m1_m(...) __riscv_vrem_vv_i16m1_tumu(__VA_ARGS__) +#define vrem_vx_i16m1_m(...) __riscv_vrem_vx_i16m1_tumu(__VA_ARGS__) +#define vrem_vv_i16m2_m(...) __riscv_vrem_vv_i16m2_tumu(__VA_ARGS__) +#define vrem_vx_i16m2_m(...) __riscv_vrem_vx_i16m2_tumu(__VA_ARGS__) +#define vrem_vv_i16m4_m(...) __riscv_vrem_vv_i16m4_tumu(__VA_ARGS__) +#define vrem_vx_i16m4_m(...) __riscv_vrem_vx_i16m4_tumu(__VA_ARGS__) +#define vrem_vv_i16m8_m(...) __riscv_vrem_vv_i16m8_tumu(__VA_ARGS__) +#define vrem_vx_i16m8_m(...) __riscv_vrem_vx_i16m8_tumu(__VA_ARGS__) +#define vrem_vv_i32mf2_m(...) __riscv_vrem_vv_i32mf2_tumu(__VA_ARGS__) +#define vrem_vx_i32mf2_m(...) __riscv_vrem_vx_i32mf2_tumu(__VA_ARGS__) +#define vrem_vv_i32m1_m(...) __riscv_vrem_vv_i32m1_tumu(__VA_ARGS__) +#define vrem_vx_i32m1_m(...) __riscv_vrem_vx_i32m1_tumu(__VA_ARGS__) +#define vrem_vv_i32m2_m(...) __riscv_vrem_vv_i32m2_tumu(__VA_ARGS__) +#define vrem_vx_i32m2_m(...) __riscv_vrem_vx_i32m2_tumu(__VA_ARGS__) +#define vrem_vv_i32m4_m(...) __riscv_vrem_vv_i32m4_tumu(__VA_ARGS__) +#define vrem_vx_i32m4_m(...) __riscv_vrem_vx_i32m4_tumu(__VA_ARGS__) +#define vrem_vv_i32m8_m(...) __riscv_vrem_vv_i32m8_tumu(__VA_ARGS__) +#define vrem_vx_i32m8_m(...) __riscv_vrem_vx_i32m8_tumu(__VA_ARGS__) +#define vrem_vv_i64m1_m(...) __riscv_vrem_vv_i64m1_tumu(__VA_ARGS__) +#define vrem_vx_i64m1_m(...) __riscv_vrem_vx_i64m1_tumu(__VA_ARGS__) +#define vrem_vv_i64m2_m(...) __riscv_vrem_vv_i64m2_tumu(__VA_ARGS__) +#define vrem_vx_i64m2_m(...) __riscv_vrem_vx_i64m2_tumu(__VA_ARGS__) +#define vrem_vv_i64m4_m(...) __riscv_vrem_vv_i64m4_tumu(__VA_ARGS__) +#define vrem_vx_i64m4_m(...) __riscv_vrem_vx_i64m4_tumu(__VA_ARGS__) +#define vrem_vv_i64m8_m(...) __riscv_vrem_vv_i64m8_tumu(__VA_ARGS__) +#define vrem_vx_i64m8_m(...) __riscv_vrem_vx_i64m8_tumu(__VA_ARGS__) +#define vdivu_vv_u8mf8_m(...) __riscv_vdivu_vv_u8mf8_tumu(__VA_ARGS__) +#define vdivu_vx_u8mf8_m(...) __riscv_vdivu_vx_u8mf8_tumu(__VA_ARGS__) +#define vdivu_vv_u8mf4_m(...) __riscv_vdivu_vv_u8mf4_tumu(__VA_ARGS__) +#define vdivu_vx_u8mf4_m(...) __riscv_vdivu_vx_u8mf4_tumu(__VA_ARGS__) +#define vdivu_vv_u8mf2_m(...) __riscv_vdivu_vv_u8mf2_tumu(__VA_ARGS__) +#define vdivu_vx_u8mf2_m(...) __riscv_vdivu_vx_u8mf2_tumu(__VA_ARGS__) +#define vdivu_vv_u8m1_m(...) __riscv_vdivu_vv_u8m1_tumu(__VA_ARGS__) +#define vdivu_vx_u8m1_m(...) __riscv_vdivu_vx_u8m1_tumu(__VA_ARGS__) +#define vdivu_vv_u8m2_m(...) __riscv_vdivu_vv_u8m2_tumu(__VA_ARGS__) +#define vdivu_vx_u8m2_m(...) __riscv_vdivu_vx_u8m2_tumu(__VA_ARGS__) +#define vdivu_vv_u8m4_m(...) __riscv_vdivu_vv_u8m4_tumu(__VA_ARGS__) +#define vdivu_vx_u8m4_m(...) __riscv_vdivu_vx_u8m4_tumu(__VA_ARGS__) +#define vdivu_vv_u8m8_m(...) __riscv_vdivu_vv_u8m8_tumu(__VA_ARGS__) +#define vdivu_vx_u8m8_m(...) __riscv_vdivu_vx_u8m8_tumu(__VA_ARGS__) +#define vdivu_vv_u16mf4_m(...) __riscv_vdivu_vv_u16mf4_tumu(__VA_ARGS__) +#define vdivu_vx_u16mf4_m(...) __riscv_vdivu_vx_u16mf4_tumu(__VA_ARGS__) +#define vdivu_vv_u16mf2_m(...) __riscv_vdivu_vv_u16mf2_tumu(__VA_ARGS__) +#define vdivu_vx_u16mf2_m(...) __riscv_vdivu_vx_u16mf2_tumu(__VA_ARGS__) +#define vdivu_vv_u16m1_m(...) __riscv_vdivu_vv_u16m1_tumu(__VA_ARGS__) +#define vdivu_vx_u16m1_m(...) __riscv_vdivu_vx_u16m1_tumu(__VA_ARGS__) +#define vdivu_vv_u16m2_m(...) __riscv_vdivu_vv_u16m2_tumu(__VA_ARGS__) +#define vdivu_vx_u16m2_m(...) __riscv_vdivu_vx_u16m2_tumu(__VA_ARGS__) +#define vdivu_vv_u16m4_m(...) __riscv_vdivu_vv_u16m4_tumu(__VA_ARGS__) +#define vdivu_vx_u16m4_m(...) __riscv_vdivu_vx_u16m4_tumu(__VA_ARGS__) +#define vdivu_vv_u16m8_m(...) __riscv_vdivu_vv_u16m8_tumu(__VA_ARGS__) +#define vdivu_vx_u16m8_m(...) __riscv_vdivu_vx_u16m8_tumu(__VA_ARGS__) +#define vdivu_vv_u32mf2_m(...) __riscv_vdivu_vv_u32mf2_tumu(__VA_ARGS__) +#define vdivu_vx_u32mf2_m(...) __riscv_vdivu_vx_u32mf2_tumu(__VA_ARGS__) +#define vdivu_vv_u32m1_m(...) __riscv_vdivu_vv_u32m1_tumu(__VA_ARGS__) +#define vdivu_vx_u32m1_m(...) __riscv_vdivu_vx_u32m1_tumu(__VA_ARGS__) +#define vdivu_vv_u32m2_m(...) __riscv_vdivu_vv_u32m2_tumu(__VA_ARGS__) +#define vdivu_vx_u32m2_m(...) __riscv_vdivu_vx_u32m2_tumu(__VA_ARGS__) +#define vdivu_vv_u32m4_m(...) __riscv_vdivu_vv_u32m4_tumu(__VA_ARGS__) +#define vdivu_vx_u32m4_m(...) __riscv_vdivu_vx_u32m4_tumu(__VA_ARGS__) +#define vdivu_vv_u32m8_m(...) __riscv_vdivu_vv_u32m8_tumu(__VA_ARGS__) +#define vdivu_vx_u32m8_m(...) __riscv_vdivu_vx_u32m8_tumu(__VA_ARGS__) +#define vdivu_vv_u64m1_m(...) __riscv_vdivu_vv_u64m1_tumu(__VA_ARGS__) +#define vdivu_vx_u64m1_m(...) __riscv_vdivu_vx_u64m1_tumu(__VA_ARGS__) +#define vdivu_vv_u64m2_m(...) __riscv_vdivu_vv_u64m2_tumu(__VA_ARGS__) +#define vdivu_vx_u64m2_m(...) __riscv_vdivu_vx_u64m2_tumu(__VA_ARGS__) +#define vdivu_vv_u64m4_m(...) __riscv_vdivu_vv_u64m4_tumu(__VA_ARGS__) +#define vdivu_vx_u64m4_m(...) __riscv_vdivu_vx_u64m4_tumu(__VA_ARGS__) +#define vdivu_vv_u64m8_m(...) __riscv_vdivu_vv_u64m8_tumu(__VA_ARGS__) +#define vdivu_vx_u64m8_m(...) __riscv_vdivu_vx_u64m8_tumu(__VA_ARGS__) +#define vremu_vv_u8mf8_m(...) __riscv_vremu_vv_u8mf8_tumu(__VA_ARGS__) +#define vremu_vx_u8mf8_m(...) __riscv_vremu_vx_u8mf8_tumu(__VA_ARGS__) +#define vremu_vv_u8mf4_m(...) __riscv_vremu_vv_u8mf4_tumu(__VA_ARGS__) +#define vremu_vx_u8mf4_m(...) __riscv_vremu_vx_u8mf4_tumu(__VA_ARGS__) +#define vremu_vv_u8mf2_m(...) __riscv_vremu_vv_u8mf2_tumu(__VA_ARGS__) +#define vremu_vx_u8mf2_m(...) __riscv_vremu_vx_u8mf2_tumu(__VA_ARGS__) +#define vremu_vv_u8m1_m(...) __riscv_vremu_vv_u8m1_tumu(__VA_ARGS__) +#define vremu_vx_u8m1_m(...) __riscv_vremu_vx_u8m1_tumu(__VA_ARGS__) +#define vremu_vv_u8m2_m(...) __riscv_vremu_vv_u8m2_tumu(__VA_ARGS__) +#define vremu_vx_u8m2_m(...) __riscv_vremu_vx_u8m2_tumu(__VA_ARGS__) +#define vremu_vv_u8m4_m(...) __riscv_vremu_vv_u8m4_tumu(__VA_ARGS__) +#define vremu_vx_u8m4_m(...) __riscv_vremu_vx_u8m4_tumu(__VA_ARGS__) +#define vremu_vv_u8m8_m(...) __riscv_vremu_vv_u8m8_tumu(__VA_ARGS__) +#define vremu_vx_u8m8_m(...) __riscv_vremu_vx_u8m8_tumu(__VA_ARGS__) +#define vremu_vv_u16mf4_m(...) __riscv_vremu_vv_u16mf4_tumu(__VA_ARGS__) +#define vremu_vx_u16mf4_m(...) __riscv_vremu_vx_u16mf4_tumu(__VA_ARGS__) +#define vremu_vv_u16mf2_m(...) __riscv_vremu_vv_u16mf2_tumu(__VA_ARGS__) +#define vremu_vx_u16mf2_m(...) __riscv_vremu_vx_u16mf2_tumu(__VA_ARGS__) +#define vremu_vv_u16m1_m(...) __riscv_vremu_vv_u16m1_tumu(__VA_ARGS__) +#define vremu_vx_u16m1_m(...) __riscv_vremu_vx_u16m1_tumu(__VA_ARGS__) +#define vremu_vv_u16m2_m(...) __riscv_vremu_vv_u16m2_tumu(__VA_ARGS__) +#define vremu_vx_u16m2_m(...) __riscv_vremu_vx_u16m2_tumu(__VA_ARGS__) +#define vremu_vv_u16m4_m(...) __riscv_vremu_vv_u16m4_tumu(__VA_ARGS__) +#define vremu_vx_u16m4_m(...) __riscv_vremu_vx_u16m4_tumu(__VA_ARGS__) +#define vremu_vv_u16m8_m(...) __riscv_vremu_vv_u16m8_tumu(__VA_ARGS__) +#define vremu_vx_u16m8_m(...) __riscv_vremu_vx_u16m8_tumu(__VA_ARGS__) +#define vremu_vv_u32mf2_m(...) __riscv_vremu_vv_u32mf2_tumu(__VA_ARGS__) +#define vremu_vx_u32mf2_m(...) __riscv_vremu_vx_u32mf2_tumu(__VA_ARGS__) +#define vremu_vv_u32m1_m(...) __riscv_vremu_vv_u32m1_tumu(__VA_ARGS__) +#define vremu_vx_u32m1_m(...) __riscv_vremu_vx_u32m1_tumu(__VA_ARGS__) +#define vremu_vv_u32m2_m(...) __riscv_vremu_vv_u32m2_tumu(__VA_ARGS__) +#define vremu_vx_u32m2_m(...) __riscv_vremu_vx_u32m2_tumu(__VA_ARGS__) +#define vremu_vv_u32m4_m(...) __riscv_vremu_vv_u32m4_tumu(__VA_ARGS__) +#define vremu_vx_u32m4_m(...) __riscv_vremu_vx_u32m4_tumu(__VA_ARGS__) +#define vremu_vv_u32m8_m(...) __riscv_vremu_vv_u32m8_tumu(__VA_ARGS__) +#define vremu_vx_u32m8_m(...) __riscv_vremu_vx_u32m8_tumu(__VA_ARGS__) +#define vremu_vv_u64m1_m(...) __riscv_vremu_vv_u64m1_tumu(__VA_ARGS__) +#define vremu_vx_u64m1_m(...) __riscv_vremu_vx_u64m1_tumu(__VA_ARGS__) +#define vremu_vv_u64m2_m(...) __riscv_vremu_vv_u64m2_tumu(__VA_ARGS__) +#define vremu_vx_u64m2_m(...) __riscv_vremu_vx_u64m2_tumu(__VA_ARGS__) +#define vremu_vv_u64m4_m(...) __riscv_vremu_vv_u64m4_tumu(__VA_ARGS__) +#define vremu_vx_u64m4_m(...) __riscv_vremu_vx_u64m4_tumu(__VA_ARGS__) +#define vremu_vv_u64m8_m(...) __riscv_vremu_vv_u64m8_tumu(__VA_ARGS__) +#define vremu_vx_u64m8_m(...) __riscv_vremu_vx_u64m8_tumu(__VA_ARGS__) +#define vwmul_vv_i16mf4(...) __riscv_vwmul_vv_i16mf4(__VA_ARGS__) +#define vwmul_vx_i16mf4(...) __riscv_vwmul_vx_i16mf4(__VA_ARGS__) +#define vwmul_vv_i16mf2(...) __riscv_vwmul_vv_i16mf2(__VA_ARGS__) +#define vwmul_vx_i16mf2(...) __riscv_vwmul_vx_i16mf2(__VA_ARGS__) +#define vwmul_vv_i16m1(...) __riscv_vwmul_vv_i16m1(__VA_ARGS__) +#define vwmul_vx_i16m1(...) __riscv_vwmul_vx_i16m1(__VA_ARGS__) +#define vwmul_vv_i16m2(...) __riscv_vwmul_vv_i16m2(__VA_ARGS__) +#define vwmul_vx_i16m2(...) __riscv_vwmul_vx_i16m2(__VA_ARGS__) +#define vwmul_vv_i16m4(...) __riscv_vwmul_vv_i16m4(__VA_ARGS__) +#define vwmul_vx_i16m4(...) __riscv_vwmul_vx_i16m4(__VA_ARGS__) +#define vwmul_vv_i16m8(...) __riscv_vwmul_vv_i16m8(__VA_ARGS__) +#define vwmul_vx_i16m8(...) __riscv_vwmul_vx_i16m8(__VA_ARGS__) +#define vwmul_vv_i32mf2(...) __riscv_vwmul_vv_i32mf2(__VA_ARGS__) +#define vwmul_vx_i32mf2(...) __riscv_vwmul_vx_i32mf2(__VA_ARGS__) +#define vwmul_vv_i32m1(...) __riscv_vwmul_vv_i32m1(__VA_ARGS__) +#define vwmul_vx_i32m1(...) __riscv_vwmul_vx_i32m1(__VA_ARGS__) +#define vwmul_vv_i32m2(...) __riscv_vwmul_vv_i32m2(__VA_ARGS__) +#define vwmul_vx_i32m2(...) __riscv_vwmul_vx_i32m2(__VA_ARGS__) +#define vwmul_vv_i32m4(...) __riscv_vwmul_vv_i32m4(__VA_ARGS__) +#define vwmul_vx_i32m4(...) __riscv_vwmul_vx_i32m4(__VA_ARGS__) +#define vwmul_vv_i32m8(...) __riscv_vwmul_vv_i32m8(__VA_ARGS__) +#define vwmul_vx_i32m8(...) __riscv_vwmul_vx_i32m8(__VA_ARGS__) +#define vwmul_vv_i64m1(...) __riscv_vwmul_vv_i64m1(__VA_ARGS__) +#define vwmul_vx_i64m1(...) __riscv_vwmul_vx_i64m1(__VA_ARGS__) +#define vwmul_vv_i64m2(...) __riscv_vwmul_vv_i64m2(__VA_ARGS__) +#define vwmul_vx_i64m2(...) __riscv_vwmul_vx_i64m2(__VA_ARGS__) +#define vwmul_vv_i64m4(...) __riscv_vwmul_vv_i64m4(__VA_ARGS__) +#define vwmul_vx_i64m4(...) __riscv_vwmul_vx_i64m4(__VA_ARGS__) +#define vwmul_vv_i64m8(...) __riscv_vwmul_vv_i64m8(__VA_ARGS__) +#define vwmul_vx_i64m8(...) __riscv_vwmul_vx_i64m8(__VA_ARGS__) +#define vwmulsu_vv_i16mf4(...) __riscv_vwmulsu_vv_i16mf4(__VA_ARGS__) +#define vwmulsu_vx_i16mf4(...) __riscv_vwmulsu_vx_i16mf4(__VA_ARGS__) +#define vwmulsu_vv_i16mf2(...) __riscv_vwmulsu_vv_i16mf2(__VA_ARGS__) +#define vwmulsu_vx_i16mf2(...) __riscv_vwmulsu_vx_i16mf2(__VA_ARGS__) +#define vwmulsu_vv_i16m1(...) __riscv_vwmulsu_vv_i16m1(__VA_ARGS__) +#define vwmulsu_vx_i16m1(...) __riscv_vwmulsu_vx_i16m1(__VA_ARGS__) +#define vwmulsu_vv_i16m2(...) __riscv_vwmulsu_vv_i16m2(__VA_ARGS__) +#define vwmulsu_vx_i16m2(...) __riscv_vwmulsu_vx_i16m2(__VA_ARGS__) +#define vwmulsu_vv_i16m4(...) __riscv_vwmulsu_vv_i16m4(__VA_ARGS__) +#define vwmulsu_vx_i16m4(...) __riscv_vwmulsu_vx_i16m4(__VA_ARGS__) +#define vwmulsu_vv_i16m8(...) __riscv_vwmulsu_vv_i16m8(__VA_ARGS__) +#define vwmulsu_vx_i16m8(...) __riscv_vwmulsu_vx_i16m8(__VA_ARGS__) +#define vwmulsu_vv_i32mf2(...) __riscv_vwmulsu_vv_i32mf2(__VA_ARGS__) +#define vwmulsu_vx_i32mf2(...) __riscv_vwmulsu_vx_i32mf2(__VA_ARGS__) +#define vwmulsu_vv_i32m1(...) __riscv_vwmulsu_vv_i32m1(__VA_ARGS__) +#define vwmulsu_vx_i32m1(...) __riscv_vwmulsu_vx_i32m1(__VA_ARGS__) +#define vwmulsu_vv_i32m2(...) __riscv_vwmulsu_vv_i32m2(__VA_ARGS__) +#define vwmulsu_vx_i32m2(...) __riscv_vwmulsu_vx_i32m2(__VA_ARGS__) +#define vwmulsu_vv_i32m4(...) __riscv_vwmulsu_vv_i32m4(__VA_ARGS__) +#define vwmulsu_vx_i32m4(...) __riscv_vwmulsu_vx_i32m4(__VA_ARGS__) +#define vwmulsu_vv_i32m8(...) __riscv_vwmulsu_vv_i32m8(__VA_ARGS__) +#define vwmulsu_vx_i32m8(...) __riscv_vwmulsu_vx_i32m8(__VA_ARGS__) +#define vwmulsu_vv_i64m1(...) __riscv_vwmulsu_vv_i64m1(__VA_ARGS__) +#define vwmulsu_vx_i64m1(...) __riscv_vwmulsu_vx_i64m1(__VA_ARGS__) +#define vwmulsu_vv_i64m2(...) __riscv_vwmulsu_vv_i64m2(__VA_ARGS__) +#define vwmulsu_vx_i64m2(...) __riscv_vwmulsu_vx_i64m2(__VA_ARGS__) +#define vwmulsu_vv_i64m4(...) __riscv_vwmulsu_vv_i64m4(__VA_ARGS__) +#define vwmulsu_vx_i64m4(...) __riscv_vwmulsu_vx_i64m4(__VA_ARGS__) +#define vwmulsu_vv_i64m8(...) __riscv_vwmulsu_vv_i64m8(__VA_ARGS__) +#define vwmulsu_vx_i64m8(...) __riscv_vwmulsu_vx_i64m8(__VA_ARGS__) +#define vwmulu_vv_u16mf4(...) __riscv_vwmulu_vv_u16mf4(__VA_ARGS__) +#define vwmulu_vx_u16mf4(...) __riscv_vwmulu_vx_u16mf4(__VA_ARGS__) +#define vwmulu_vv_u16mf2(...) __riscv_vwmulu_vv_u16mf2(__VA_ARGS__) +#define vwmulu_vx_u16mf2(...) __riscv_vwmulu_vx_u16mf2(__VA_ARGS__) +#define vwmulu_vv_u16m1(...) __riscv_vwmulu_vv_u16m1(__VA_ARGS__) +#define vwmulu_vx_u16m1(...) __riscv_vwmulu_vx_u16m1(__VA_ARGS__) +#define vwmulu_vv_u16m2(...) __riscv_vwmulu_vv_u16m2(__VA_ARGS__) +#define vwmulu_vx_u16m2(...) __riscv_vwmulu_vx_u16m2(__VA_ARGS__) +#define vwmulu_vv_u16m4(...) __riscv_vwmulu_vv_u16m4(__VA_ARGS__) +#define vwmulu_vx_u16m4(...) __riscv_vwmulu_vx_u16m4(__VA_ARGS__) +#define vwmulu_vv_u16m8(...) __riscv_vwmulu_vv_u16m8(__VA_ARGS__) +#define vwmulu_vx_u16m8(...) __riscv_vwmulu_vx_u16m8(__VA_ARGS__) +#define vwmulu_vv_u32mf2(...) __riscv_vwmulu_vv_u32mf2(__VA_ARGS__) +#define vwmulu_vx_u32mf2(...) __riscv_vwmulu_vx_u32mf2(__VA_ARGS__) +#define vwmulu_vv_u32m1(...) __riscv_vwmulu_vv_u32m1(__VA_ARGS__) +#define vwmulu_vx_u32m1(...) __riscv_vwmulu_vx_u32m1(__VA_ARGS__) +#define vwmulu_vv_u32m2(...) __riscv_vwmulu_vv_u32m2(__VA_ARGS__) +#define vwmulu_vx_u32m2(...) __riscv_vwmulu_vx_u32m2(__VA_ARGS__) +#define vwmulu_vv_u32m4(...) __riscv_vwmulu_vv_u32m4(__VA_ARGS__) +#define vwmulu_vx_u32m4(...) __riscv_vwmulu_vx_u32m4(__VA_ARGS__) +#define vwmulu_vv_u32m8(...) __riscv_vwmulu_vv_u32m8(__VA_ARGS__) +#define vwmulu_vx_u32m8(...) __riscv_vwmulu_vx_u32m8(__VA_ARGS__) +#define vwmulu_vv_u64m1(...) __riscv_vwmulu_vv_u64m1(__VA_ARGS__) +#define vwmulu_vx_u64m1(...) __riscv_vwmulu_vx_u64m1(__VA_ARGS__) +#define vwmulu_vv_u64m2(...) __riscv_vwmulu_vv_u64m2(__VA_ARGS__) +#define vwmulu_vx_u64m2(...) __riscv_vwmulu_vx_u64m2(__VA_ARGS__) +#define vwmulu_vv_u64m4(...) __riscv_vwmulu_vv_u64m4(__VA_ARGS__) +#define vwmulu_vx_u64m4(...) __riscv_vwmulu_vx_u64m4(__VA_ARGS__) +#define vwmulu_vv_u64m8(...) __riscv_vwmulu_vv_u64m8(__VA_ARGS__) +#define vwmulu_vx_u64m8(...) __riscv_vwmulu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vwmul_vv_i16mf4_m(...) __riscv_vwmul_vv_i16mf4_tumu(__VA_ARGS__) +#define vwmul_vx_i16mf4_m(...) __riscv_vwmul_vx_i16mf4_tumu(__VA_ARGS__) +#define vwmul_vv_i16mf2_m(...) __riscv_vwmul_vv_i16mf2_tumu(__VA_ARGS__) +#define vwmul_vx_i16mf2_m(...) __riscv_vwmul_vx_i16mf2_tumu(__VA_ARGS__) +#define vwmul_vv_i16m1_m(...) __riscv_vwmul_vv_i16m1_tumu(__VA_ARGS__) +#define vwmul_vx_i16m1_m(...) __riscv_vwmul_vx_i16m1_tumu(__VA_ARGS__) +#define vwmul_vv_i16m2_m(...) __riscv_vwmul_vv_i16m2_tumu(__VA_ARGS__) +#define vwmul_vx_i16m2_m(...) __riscv_vwmul_vx_i16m2_tumu(__VA_ARGS__) +#define vwmul_vv_i16m4_m(...) __riscv_vwmul_vv_i16m4_tumu(__VA_ARGS__) +#define vwmul_vx_i16m4_m(...) __riscv_vwmul_vx_i16m4_tumu(__VA_ARGS__) +#define vwmul_vv_i16m8_m(...) __riscv_vwmul_vv_i16m8_tumu(__VA_ARGS__) +#define vwmul_vx_i16m8_m(...) __riscv_vwmul_vx_i16m8_tumu(__VA_ARGS__) +#define vwmul_vv_i32mf2_m(...) __riscv_vwmul_vv_i32mf2_tumu(__VA_ARGS__) +#define vwmul_vx_i32mf2_m(...) __riscv_vwmul_vx_i32mf2_tumu(__VA_ARGS__) +#define vwmul_vv_i32m1_m(...) __riscv_vwmul_vv_i32m1_tumu(__VA_ARGS__) +#define vwmul_vx_i32m1_m(...) __riscv_vwmul_vx_i32m1_tumu(__VA_ARGS__) +#define vwmul_vv_i32m2_m(...) __riscv_vwmul_vv_i32m2_tumu(__VA_ARGS__) +#define vwmul_vx_i32m2_m(...) __riscv_vwmul_vx_i32m2_tumu(__VA_ARGS__) +#define vwmul_vv_i32m4_m(...) __riscv_vwmul_vv_i32m4_tumu(__VA_ARGS__) +#define vwmul_vx_i32m4_m(...) __riscv_vwmul_vx_i32m4_tumu(__VA_ARGS__) +#define vwmul_vv_i32m8_m(...) __riscv_vwmul_vv_i32m8_tumu(__VA_ARGS__) +#define vwmul_vx_i32m8_m(...) __riscv_vwmul_vx_i32m8_tumu(__VA_ARGS__) +#define vwmul_vv_i64m1_m(...) __riscv_vwmul_vv_i64m1_tumu(__VA_ARGS__) +#define vwmul_vx_i64m1_m(...) __riscv_vwmul_vx_i64m1_tumu(__VA_ARGS__) +#define vwmul_vv_i64m2_m(...) __riscv_vwmul_vv_i64m2_tumu(__VA_ARGS__) +#define vwmul_vx_i64m2_m(...) __riscv_vwmul_vx_i64m2_tumu(__VA_ARGS__) +#define vwmul_vv_i64m4_m(...) __riscv_vwmul_vv_i64m4_tumu(__VA_ARGS__) +#define vwmul_vx_i64m4_m(...) __riscv_vwmul_vx_i64m4_tumu(__VA_ARGS__) +#define vwmul_vv_i64m8_m(...) __riscv_vwmul_vv_i64m8_tumu(__VA_ARGS__) +#define vwmul_vx_i64m8_m(...) __riscv_vwmul_vx_i64m8_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16mf4_m(...) __riscv_vwmulsu_vv_i16mf4_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16mf4_m(...) __riscv_vwmulsu_vx_i16mf4_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16mf2_m(...) __riscv_vwmulsu_vv_i16mf2_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16mf2_m(...) __riscv_vwmulsu_vx_i16mf2_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16m1_m(...) __riscv_vwmulsu_vv_i16m1_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16m1_m(...) __riscv_vwmulsu_vx_i16m1_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16m2_m(...) __riscv_vwmulsu_vv_i16m2_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16m2_m(...) __riscv_vwmulsu_vx_i16m2_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16m4_m(...) __riscv_vwmulsu_vv_i16m4_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16m4_m(...) __riscv_vwmulsu_vx_i16m4_tumu(__VA_ARGS__) +#define vwmulsu_vv_i16m8_m(...) __riscv_vwmulsu_vv_i16m8_tumu(__VA_ARGS__) +#define vwmulsu_vx_i16m8_m(...) __riscv_vwmulsu_vx_i16m8_tumu(__VA_ARGS__) +#define vwmulsu_vv_i32mf2_m(...) __riscv_vwmulsu_vv_i32mf2_tumu(__VA_ARGS__) +#define vwmulsu_vx_i32mf2_m(...) __riscv_vwmulsu_vx_i32mf2_tumu(__VA_ARGS__) +#define vwmulsu_vv_i32m1_m(...) __riscv_vwmulsu_vv_i32m1_tumu(__VA_ARGS__) +#define vwmulsu_vx_i32m1_m(...) __riscv_vwmulsu_vx_i32m1_tumu(__VA_ARGS__) +#define vwmulsu_vv_i32m2_m(...) __riscv_vwmulsu_vv_i32m2_tumu(__VA_ARGS__) +#define vwmulsu_vx_i32m2_m(...) __riscv_vwmulsu_vx_i32m2_tumu(__VA_ARGS__) +#define vwmulsu_vv_i32m4_m(...) __riscv_vwmulsu_vv_i32m4_tumu(__VA_ARGS__) +#define vwmulsu_vx_i32m4_m(...) __riscv_vwmulsu_vx_i32m4_tumu(__VA_ARGS__) +#define vwmulsu_vv_i32m8_m(...) __riscv_vwmulsu_vv_i32m8_tumu(__VA_ARGS__) +#define vwmulsu_vx_i32m8_m(...) __riscv_vwmulsu_vx_i32m8_tumu(__VA_ARGS__) +#define vwmulsu_vv_i64m1_m(...) __riscv_vwmulsu_vv_i64m1_tumu(__VA_ARGS__) +#define vwmulsu_vx_i64m1_m(...) __riscv_vwmulsu_vx_i64m1_tumu(__VA_ARGS__) +#define vwmulsu_vv_i64m2_m(...) __riscv_vwmulsu_vv_i64m2_tumu(__VA_ARGS__) +#define vwmulsu_vx_i64m2_m(...) __riscv_vwmulsu_vx_i64m2_tumu(__VA_ARGS__) +#define vwmulsu_vv_i64m4_m(...) __riscv_vwmulsu_vv_i64m4_tumu(__VA_ARGS__) +#define vwmulsu_vx_i64m4_m(...) __riscv_vwmulsu_vx_i64m4_tumu(__VA_ARGS__) +#define vwmulsu_vv_i64m8_m(...) __riscv_vwmulsu_vv_i64m8_tumu(__VA_ARGS__) +#define vwmulsu_vx_i64m8_m(...) __riscv_vwmulsu_vx_i64m8_tumu(__VA_ARGS__) +#define vwmulu_vv_u16mf4_m(...) __riscv_vwmulu_vv_u16mf4_tumu(__VA_ARGS__) +#define vwmulu_vx_u16mf4_m(...) __riscv_vwmulu_vx_u16mf4_tumu(__VA_ARGS__) +#define vwmulu_vv_u16mf2_m(...) __riscv_vwmulu_vv_u16mf2_tumu(__VA_ARGS__) +#define vwmulu_vx_u16mf2_m(...) __riscv_vwmulu_vx_u16mf2_tumu(__VA_ARGS__) +#define vwmulu_vv_u16m1_m(...) __riscv_vwmulu_vv_u16m1_tumu(__VA_ARGS__) +#define vwmulu_vx_u16m1_m(...) __riscv_vwmulu_vx_u16m1_tumu(__VA_ARGS__) +#define vwmulu_vv_u16m2_m(...) __riscv_vwmulu_vv_u16m2_tumu(__VA_ARGS__) +#define vwmulu_vx_u16m2_m(...) __riscv_vwmulu_vx_u16m2_tumu(__VA_ARGS__) +#define vwmulu_vv_u16m4_m(...) __riscv_vwmulu_vv_u16m4_tumu(__VA_ARGS__) +#define vwmulu_vx_u16m4_m(...) __riscv_vwmulu_vx_u16m4_tumu(__VA_ARGS__) +#define vwmulu_vv_u16m8_m(...) __riscv_vwmulu_vv_u16m8_tumu(__VA_ARGS__) +#define vwmulu_vx_u16m8_m(...) __riscv_vwmulu_vx_u16m8_tumu(__VA_ARGS__) +#define vwmulu_vv_u32mf2_m(...) __riscv_vwmulu_vv_u32mf2_tumu(__VA_ARGS__) +#define vwmulu_vx_u32mf2_m(...) __riscv_vwmulu_vx_u32mf2_tumu(__VA_ARGS__) +#define vwmulu_vv_u32m1_m(...) __riscv_vwmulu_vv_u32m1_tumu(__VA_ARGS__) +#define vwmulu_vx_u32m1_m(...) __riscv_vwmulu_vx_u32m1_tumu(__VA_ARGS__) +#define vwmulu_vv_u32m2_m(...) __riscv_vwmulu_vv_u32m2_tumu(__VA_ARGS__) +#define vwmulu_vx_u32m2_m(...) __riscv_vwmulu_vx_u32m2_tumu(__VA_ARGS__) +#define vwmulu_vv_u32m4_m(...) __riscv_vwmulu_vv_u32m4_tumu(__VA_ARGS__) +#define vwmulu_vx_u32m4_m(...) __riscv_vwmulu_vx_u32m4_tumu(__VA_ARGS__) +#define vwmulu_vv_u32m8_m(...) __riscv_vwmulu_vv_u32m8_tumu(__VA_ARGS__) +#define vwmulu_vx_u32m8_m(...) __riscv_vwmulu_vx_u32m8_tumu(__VA_ARGS__) +#define vwmulu_vv_u64m1_m(...) __riscv_vwmulu_vv_u64m1_tumu(__VA_ARGS__) +#define vwmulu_vx_u64m1_m(...) __riscv_vwmulu_vx_u64m1_tumu(__VA_ARGS__) +#define vwmulu_vv_u64m2_m(...) __riscv_vwmulu_vv_u64m2_tumu(__VA_ARGS__) +#define vwmulu_vx_u64m2_m(...) __riscv_vwmulu_vx_u64m2_tumu(__VA_ARGS__) +#define vwmulu_vv_u64m4_m(...) __riscv_vwmulu_vv_u64m4_tumu(__VA_ARGS__) +#define vwmulu_vx_u64m4_m(...) __riscv_vwmulu_vx_u64m4_tumu(__VA_ARGS__) +#define vwmulu_vv_u64m8_m(...) __riscv_vwmulu_vv_u64m8_tumu(__VA_ARGS__) +#define vwmulu_vx_u64m8_m(...) __riscv_vwmulu_vx_u64m8_tumu(__VA_ARGS__) +#define vmacc_vv_i8mf8(...) __riscv_vmacc_vv_i8mf8_tu(__VA_ARGS__) +#define vmacc_vx_i8mf8(...) __riscv_vmacc_vx_i8mf8_tu(__VA_ARGS__) +#define vmacc_vv_i8mf4(...) __riscv_vmacc_vv_i8mf4_tu(__VA_ARGS__) +#define vmacc_vx_i8mf4(...) __riscv_vmacc_vx_i8mf4_tu(__VA_ARGS__) +#define vmacc_vv_i8mf2(...) __riscv_vmacc_vv_i8mf2_tu(__VA_ARGS__) +#define vmacc_vx_i8mf2(...) __riscv_vmacc_vx_i8mf2_tu(__VA_ARGS__) +#define vmacc_vv_i8m1(...) __riscv_vmacc_vv_i8m1_tu(__VA_ARGS__) +#define vmacc_vx_i8m1(...) __riscv_vmacc_vx_i8m1_tu(__VA_ARGS__) +#define vmacc_vv_i8m2(...) __riscv_vmacc_vv_i8m2_tu(__VA_ARGS__) +#define vmacc_vx_i8m2(...) __riscv_vmacc_vx_i8m2_tu(__VA_ARGS__) +#define vmacc_vv_i8m4(...) __riscv_vmacc_vv_i8m4_tu(__VA_ARGS__) +#define vmacc_vx_i8m4(...) __riscv_vmacc_vx_i8m4_tu(__VA_ARGS__) +#define vmacc_vv_i8m8(...) __riscv_vmacc_vv_i8m8_tu(__VA_ARGS__) +#define vmacc_vx_i8m8(...) __riscv_vmacc_vx_i8m8_tu(__VA_ARGS__) +#define vmacc_vv_i16mf4(...) __riscv_vmacc_vv_i16mf4_tu(__VA_ARGS__) +#define vmacc_vx_i16mf4(...) __riscv_vmacc_vx_i16mf4_tu(__VA_ARGS__) +#define vmacc_vv_i16mf2(...) __riscv_vmacc_vv_i16mf2_tu(__VA_ARGS__) +#define vmacc_vx_i16mf2(...) __riscv_vmacc_vx_i16mf2_tu(__VA_ARGS__) +#define vmacc_vv_i16m1(...) __riscv_vmacc_vv_i16m1_tu(__VA_ARGS__) +#define vmacc_vx_i16m1(...) __riscv_vmacc_vx_i16m1_tu(__VA_ARGS__) +#define vmacc_vv_i16m2(...) __riscv_vmacc_vv_i16m2_tu(__VA_ARGS__) +#define vmacc_vx_i16m2(...) __riscv_vmacc_vx_i16m2_tu(__VA_ARGS__) +#define vmacc_vv_i16m4(...) __riscv_vmacc_vv_i16m4_tu(__VA_ARGS__) +#define vmacc_vx_i16m4(...) __riscv_vmacc_vx_i16m4_tu(__VA_ARGS__) +#define vmacc_vv_i16m8(...) __riscv_vmacc_vv_i16m8_tu(__VA_ARGS__) +#define vmacc_vx_i16m8(...) __riscv_vmacc_vx_i16m8_tu(__VA_ARGS__) +#define vmacc_vv_i32mf2(...) __riscv_vmacc_vv_i32mf2_tu(__VA_ARGS__) +#define vmacc_vx_i32mf2(...) __riscv_vmacc_vx_i32mf2_tu(__VA_ARGS__) +#define vmacc_vv_i32m1(...) __riscv_vmacc_vv_i32m1_tu(__VA_ARGS__) +#define vmacc_vx_i32m1(...) __riscv_vmacc_vx_i32m1_tu(__VA_ARGS__) +#define vmacc_vv_i32m2(...) __riscv_vmacc_vv_i32m2_tu(__VA_ARGS__) +#define vmacc_vx_i32m2(...) __riscv_vmacc_vx_i32m2_tu(__VA_ARGS__) +#define vmacc_vv_i32m4(...) __riscv_vmacc_vv_i32m4_tu(__VA_ARGS__) +#define vmacc_vx_i32m4(...) __riscv_vmacc_vx_i32m4_tu(__VA_ARGS__) +#define vmacc_vv_i32m8(...) __riscv_vmacc_vv_i32m8_tu(__VA_ARGS__) +#define vmacc_vx_i32m8(...) __riscv_vmacc_vx_i32m8_tu(__VA_ARGS__) +#define vmacc_vv_i64m1(...) __riscv_vmacc_vv_i64m1_tu(__VA_ARGS__) +#define vmacc_vx_i64m1(...) __riscv_vmacc_vx_i64m1_tu(__VA_ARGS__) +#define vmacc_vv_i64m2(...) __riscv_vmacc_vv_i64m2_tu(__VA_ARGS__) +#define vmacc_vx_i64m2(...) __riscv_vmacc_vx_i64m2_tu(__VA_ARGS__) +#define vmacc_vv_i64m4(...) __riscv_vmacc_vv_i64m4_tu(__VA_ARGS__) +#define vmacc_vx_i64m4(...) __riscv_vmacc_vx_i64m4_tu(__VA_ARGS__) +#define vmacc_vv_i64m8(...) __riscv_vmacc_vv_i64m8_tu(__VA_ARGS__) +#define vmacc_vx_i64m8(...) __riscv_vmacc_vx_i64m8_tu(__VA_ARGS__) +#define vnmsac_vv_i8mf8(...) __riscv_vnmsac_vv_i8mf8_tu(__VA_ARGS__) +#define vnmsac_vx_i8mf8(...) __riscv_vnmsac_vx_i8mf8_tu(__VA_ARGS__) +#define vnmsac_vv_i8mf4(...) __riscv_vnmsac_vv_i8mf4_tu(__VA_ARGS__) +#define vnmsac_vx_i8mf4(...) __riscv_vnmsac_vx_i8mf4_tu(__VA_ARGS__) +#define vnmsac_vv_i8mf2(...) __riscv_vnmsac_vv_i8mf2_tu(__VA_ARGS__) +#define vnmsac_vx_i8mf2(...) __riscv_vnmsac_vx_i8mf2_tu(__VA_ARGS__) +#define vnmsac_vv_i8m1(...) __riscv_vnmsac_vv_i8m1_tu(__VA_ARGS__) +#define vnmsac_vx_i8m1(...) __riscv_vnmsac_vx_i8m1_tu(__VA_ARGS__) +#define vnmsac_vv_i8m2(...) __riscv_vnmsac_vv_i8m2_tu(__VA_ARGS__) +#define vnmsac_vx_i8m2(...) __riscv_vnmsac_vx_i8m2_tu(__VA_ARGS__) +#define vnmsac_vv_i8m4(...) __riscv_vnmsac_vv_i8m4_tu(__VA_ARGS__) +#define vnmsac_vx_i8m4(...) __riscv_vnmsac_vx_i8m4_tu(__VA_ARGS__) +#define vnmsac_vv_i8m8(...) __riscv_vnmsac_vv_i8m8_tu(__VA_ARGS__) +#define vnmsac_vx_i8m8(...) __riscv_vnmsac_vx_i8m8_tu(__VA_ARGS__) +#define vnmsac_vv_i16mf4(...) __riscv_vnmsac_vv_i16mf4_tu(__VA_ARGS__) +#define vnmsac_vx_i16mf4(...) __riscv_vnmsac_vx_i16mf4_tu(__VA_ARGS__) +#define vnmsac_vv_i16mf2(...) __riscv_vnmsac_vv_i16mf2_tu(__VA_ARGS__) +#define vnmsac_vx_i16mf2(...) __riscv_vnmsac_vx_i16mf2_tu(__VA_ARGS__) +#define vnmsac_vv_i16m1(...) __riscv_vnmsac_vv_i16m1_tu(__VA_ARGS__) +#define vnmsac_vx_i16m1(...) __riscv_vnmsac_vx_i16m1_tu(__VA_ARGS__) +#define vnmsac_vv_i16m2(...) __riscv_vnmsac_vv_i16m2_tu(__VA_ARGS__) +#define vnmsac_vx_i16m2(...) __riscv_vnmsac_vx_i16m2_tu(__VA_ARGS__) +#define vnmsac_vv_i16m4(...) __riscv_vnmsac_vv_i16m4_tu(__VA_ARGS__) +#define vnmsac_vx_i16m4(...) __riscv_vnmsac_vx_i16m4_tu(__VA_ARGS__) +#define vnmsac_vv_i16m8(...) __riscv_vnmsac_vv_i16m8_tu(__VA_ARGS__) +#define vnmsac_vx_i16m8(...) __riscv_vnmsac_vx_i16m8_tu(__VA_ARGS__) +#define vnmsac_vv_i32mf2(...) __riscv_vnmsac_vv_i32mf2_tu(__VA_ARGS__) +#define vnmsac_vx_i32mf2(...) __riscv_vnmsac_vx_i32mf2_tu(__VA_ARGS__) +#define vnmsac_vv_i32m1(...) __riscv_vnmsac_vv_i32m1_tu(__VA_ARGS__) +#define vnmsac_vx_i32m1(...) __riscv_vnmsac_vx_i32m1_tu(__VA_ARGS__) +#define vnmsac_vv_i32m2(...) __riscv_vnmsac_vv_i32m2_tu(__VA_ARGS__) +#define vnmsac_vx_i32m2(...) __riscv_vnmsac_vx_i32m2_tu(__VA_ARGS__) +#define vnmsac_vv_i32m4(...) __riscv_vnmsac_vv_i32m4_tu(__VA_ARGS__) +#define vnmsac_vx_i32m4(...) __riscv_vnmsac_vx_i32m4_tu(__VA_ARGS__) +#define vnmsac_vv_i32m8(...) __riscv_vnmsac_vv_i32m8_tu(__VA_ARGS__) +#define vnmsac_vx_i32m8(...) __riscv_vnmsac_vx_i32m8_tu(__VA_ARGS__) +#define vnmsac_vv_i64m1(...) __riscv_vnmsac_vv_i64m1_tu(__VA_ARGS__) +#define vnmsac_vx_i64m1(...) __riscv_vnmsac_vx_i64m1_tu(__VA_ARGS__) +#define vnmsac_vv_i64m2(...) __riscv_vnmsac_vv_i64m2_tu(__VA_ARGS__) +#define vnmsac_vx_i64m2(...) __riscv_vnmsac_vx_i64m2_tu(__VA_ARGS__) +#define vnmsac_vv_i64m4(...) __riscv_vnmsac_vv_i64m4_tu(__VA_ARGS__) +#define vnmsac_vx_i64m4(...) __riscv_vnmsac_vx_i64m4_tu(__VA_ARGS__) +#define vnmsac_vv_i64m8(...) __riscv_vnmsac_vv_i64m8_tu(__VA_ARGS__) +#define vnmsac_vx_i64m8(...) __riscv_vnmsac_vx_i64m8_tu(__VA_ARGS__) +#define vmadd_vv_i8mf8(...) __riscv_vmadd_vv_i8mf8_tu(__VA_ARGS__) +#define vmadd_vx_i8mf8(...) __riscv_vmadd_vx_i8mf8_tu(__VA_ARGS__) +#define vmadd_vv_i8mf4(...) __riscv_vmadd_vv_i8mf4_tu(__VA_ARGS__) +#define vmadd_vx_i8mf4(...) __riscv_vmadd_vx_i8mf4_tu(__VA_ARGS__) +#define vmadd_vv_i8mf2(...) __riscv_vmadd_vv_i8mf2_tu(__VA_ARGS__) +#define vmadd_vx_i8mf2(...) __riscv_vmadd_vx_i8mf2_tu(__VA_ARGS__) +#define vmadd_vv_i8m1(...) __riscv_vmadd_vv_i8m1_tu(__VA_ARGS__) +#define vmadd_vx_i8m1(...) __riscv_vmadd_vx_i8m1_tu(__VA_ARGS__) +#define vmadd_vv_i8m2(...) __riscv_vmadd_vv_i8m2_tu(__VA_ARGS__) +#define vmadd_vx_i8m2(...) __riscv_vmadd_vx_i8m2_tu(__VA_ARGS__) +#define vmadd_vv_i8m4(...) __riscv_vmadd_vv_i8m4_tu(__VA_ARGS__) +#define vmadd_vx_i8m4(...) __riscv_vmadd_vx_i8m4_tu(__VA_ARGS__) +#define vmadd_vv_i8m8(...) __riscv_vmadd_vv_i8m8_tu(__VA_ARGS__) +#define vmadd_vx_i8m8(...) __riscv_vmadd_vx_i8m8_tu(__VA_ARGS__) +#define vmadd_vv_i16mf4(...) __riscv_vmadd_vv_i16mf4_tu(__VA_ARGS__) +#define vmadd_vx_i16mf4(...) __riscv_vmadd_vx_i16mf4_tu(__VA_ARGS__) +#define vmadd_vv_i16mf2(...) __riscv_vmadd_vv_i16mf2_tu(__VA_ARGS__) +#define vmadd_vx_i16mf2(...) __riscv_vmadd_vx_i16mf2_tu(__VA_ARGS__) +#define vmadd_vv_i16m1(...) __riscv_vmadd_vv_i16m1_tu(__VA_ARGS__) +#define vmadd_vx_i16m1(...) __riscv_vmadd_vx_i16m1_tu(__VA_ARGS__) +#define vmadd_vv_i16m2(...) __riscv_vmadd_vv_i16m2_tu(__VA_ARGS__) +#define vmadd_vx_i16m2(...) __riscv_vmadd_vx_i16m2_tu(__VA_ARGS__) +#define vmadd_vv_i16m4(...) __riscv_vmadd_vv_i16m4_tu(__VA_ARGS__) +#define vmadd_vx_i16m4(...) __riscv_vmadd_vx_i16m4_tu(__VA_ARGS__) +#define vmadd_vv_i16m8(...) __riscv_vmadd_vv_i16m8_tu(__VA_ARGS__) +#define vmadd_vx_i16m8(...) __riscv_vmadd_vx_i16m8_tu(__VA_ARGS__) +#define vmadd_vv_i32mf2(...) __riscv_vmadd_vv_i32mf2_tu(__VA_ARGS__) +#define vmadd_vx_i32mf2(...) __riscv_vmadd_vx_i32mf2_tu(__VA_ARGS__) +#define vmadd_vv_i32m1(...) __riscv_vmadd_vv_i32m1_tu(__VA_ARGS__) +#define vmadd_vx_i32m1(...) __riscv_vmadd_vx_i32m1_tu(__VA_ARGS__) +#define vmadd_vv_i32m2(...) __riscv_vmadd_vv_i32m2_tu(__VA_ARGS__) +#define vmadd_vx_i32m2(...) __riscv_vmadd_vx_i32m2_tu(__VA_ARGS__) +#define vmadd_vv_i32m4(...) __riscv_vmadd_vv_i32m4_tu(__VA_ARGS__) +#define vmadd_vx_i32m4(...) __riscv_vmadd_vx_i32m4_tu(__VA_ARGS__) +#define vmadd_vv_i32m8(...) __riscv_vmadd_vv_i32m8_tu(__VA_ARGS__) +#define vmadd_vx_i32m8(...) __riscv_vmadd_vx_i32m8_tu(__VA_ARGS__) +#define vmadd_vv_i64m1(...) __riscv_vmadd_vv_i64m1_tu(__VA_ARGS__) +#define vmadd_vx_i64m1(...) __riscv_vmadd_vx_i64m1_tu(__VA_ARGS__) +#define vmadd_vv_i64m2(...) __riscv_vmadd_vv_i64m2_tu(__VA_ARGS__) +#define vmadd_vx_i64m2(...) __riscv_vmadd_vx_i64m2_tu(__VA_ARGS__) +#define vmadd_vv_i64m4(...) __riscv_vmadd_vv_i64m4_tu(__VA_ARGS__) +#define vmadd_vx_i64m4(...) __riscv_vmadd_vx_i64m4_tu(__VA_ARGS__) +#define vmadd_vv_i64m8(...) __riscv_vmadd_vv_i64m8_tu(__VA_ARGS__) +#define vmadd_vx_i64m8(...) __riscv_vmadd_vx_i64m8_tu(__VA_ARGS__) +#define vnmsub_vv_i8mf8(...) __riscv_vnmsub_vv_i8mf8_tu(__VA_ARGS__) +#define vnmsub_vx_i8mf8(...) __riscv_vnmsub_vx_i8mf8_tu(__VA_ARGS__) +#define vnmsub_vv_i8mf4(...) __riscv_vnmsub_vv_i8mf4_tu(__VA_ARGS__) +#define vnmsub_vx_i8mf4(...) __riscv_vnmsub_vx_i8mf4_tu(__VA_ARGS__) +#define vnmsub_vv_i8mf2(...) __riscv_vnmsub_vv_i8mf2_tu(__VA_ARGS__) +#define vnmsub_vx_i8mf2(...) __riscv_vnmsub_vx_i8mf2_tu(__VA_ARGS__) +#define vnmsub_vv_i8m1(...) __riscv_vnmsub_vv_i8m1_tu(__VA_ARGS__) +#define vnmsub_vx_i8m1(...) __riscv_vnmsub_vx_i8m1_tu(__VA_ARGS__) +#define vnmsub_vv_i8m2(...) __riscv_vnmsub_vv_i8m2_tu(__VA_ARGS__) +#define vnmsub_vx_i8m2(...) __riscv_vnmsub_vx_i8m2_tu(__VA_ARGS__) +#define vnmsub_vv_i8m4(...) __riscv_vnmsub_vv_i8m4_tu(__VA_ARGS__) +#define vnmsub_vx_i8m4(...) __riscv_vnmsub_vx_i8m4_tu(__VA_ARGS__) +#define vnmsub_vv_i8m8(...) __riscv_vnmsub_vv_i8m8_tu(__VA_ARGS__) +#define vnmsub_vx_i8m8(...) __riscv_vnmsub_vx_i8m8_tu(__VA_ARGS__) +#define vnmsub_vv_i16mf4(...) __riscv_vnmsub_vv_i16mf4_tu(__VA_ARGS__) +#define vnmsub_vx_i16mf4(...) __riscv_vnmsub_vx_i16mf4_tu(__VA_ARGS__) +#define vnmsub_vv_i16mf2(...) __riscv_vnmsub_vv_i16mf2_tu(__VA_ARGS__) +#define vnmsub_vx_i16mf2(...) __riscv_vnmsub_vx_i16mf2_tu(__VA_ARGS__) +#define vnmsub_vv_i16m1(...) __riscv_vnmsub_vv_i16m1_tu(__VA_ARGS__) +#define vnmsub_vx_i16m1(...) __riscv_vnmsub_vx_i16m1_tu(__VA_ARGS__) +#define vnmsub_vv_i16m2(...) __riscv_vnmsub_vv_i16m2_tu(__VA_ARGS__) +#define vnmsub_vx_i16m2(...) __riscv_vnmsub_vx_i16m2_tu(__VA_ARGS__) +#define vnmsub_vv_i16m4(...) __riscv_vnmsub_vv_i16m4_tu(__VA_ARGS__) +#define vnmsub_vx_i16m4(...) __riscv_vnmsub_vx_i16m4_tu(__VA_ARGS__) +#define vnmsub_vv_i16m8(...) __riscv_vnmsub_vv_i16m8_tu(__VA_ARGS__) +#define vnmsub_vx_i16m8(...) __riscv_vnmsub_vx_i16m8_tu(__VA_ARGS__) +#define vnmsub_vv_i32mf2(...) __riscv_vnmsub_vv_i32mf2_tu(__VA_ARGS__) +#define vnmsub_vx_i32mf2(...) __riscv_vnmsub_vx_i32mf2_tu(__VA_ARGS__) +#define vnmsub_vv_i32m1(...) __riscv_vnmsub_vv_i32m1_tu(__VA_ARGS__) +#define vnmsub_vx_i32m1(...) __riscv_vnmsub_vx_i32m1_tu(__VA_ARGS__) +#define vnmsub_vv_i32m2(...) __riscv_vnmsub_vv_i32m2_tu(__VA_ARGS__) +#define vnmsub_vx_i32m2(...) __riscv_vnmsub_vx_i32m2_tu(__VA_ARGS__) +#define vnmsub_vv_i32m4(...) __riscv_vnmsub_vv_i32m4_tu(__VA_ARGS__) +#define vnmsub_vx_i32m4(...) __riscv_vnmsub_vx_i32m4_tu(__VA_ARGS__) +#define vnmsub_vv_i32m8(...) __riscv_vnmsub_vv_i32m8_tu(__VA_ARGS__) +#define vnmsub_vx_i32m8(...) __riscv_vnmsub_vx_i32m8_tu(__VA_ARGS__) +#define vnmsub_vv_i64m1(...) __riscv_vnmsub_vv_i64m1_tu(__VA_ARGS__) +#define vnmsub_vx_i64m1(...) __riscv_vnmsub_vx_i64m1_tu(__VA_ARGS__) +#define vnmsub_vv_i64m2(...) __riscv_vnmsub_vv_i64m2_tu(__VA_ARGS__) +#define vnmsub_vx_i64m2(...) __riscv_vnmsub_vx_i64m2_tu(__VA_ARGS__) +#define vnmsub_vv_i64m4(...) __riscv_vnmsub_vv_i64m4_tu(__VA_ARGS__) +#define vnmsub_vx_i64m4(...) __riscv_vnmsub_vx_i64m4_tu(__VA_ARGS__) +#define vnmsub_vv_i64m8(...) __riscv_vnmsub_vv_i64m8_tu(__VA_ARGS__) +#define vnmsub_vx_i64m8(...) __riscv_vnmsub_vx_i64m8_tu(__VA_ARGS__) +#define vmacc_vv_u8mf8(...) __riscv_vmacc_vv_u8mf8_tu(__VA_ARGS__) +#define vmacc_vx_u8mf8(...) __riscv_vmacc_vx_u8mf8_tu(__VA_ARGS__) +#define vmacc_vv_u8mf4(...) __riscv_vmacc_vv_u8mf4_tu(__VA_ARGS__) +#define vmacc_vx_u8mf4(...) __riscv_vmacc_vx_u8mf4_tu(__VA_ARGS__) +#define vmacc_vv_u8mf2(...) __riscv_vmacc_vv_u8mf2_tu(__VA_ARGS__) +#define vmacc_vx_u8mf2(...) __riscv_vmacc_vx_u8mf2_tu(__VA_ARGS__) +#define vmacc_vv_u8m1(...) __riscv_vmacc_vv_u8m1_tu(__VA_ARGS__) +#define vmacc_vx_u8m1(...) __riscv_vmacc_vx_u8m1_tu(__VA_ARGS__) +#define vmacc_vv_u8m2(...) __riscv_vmacc_vv_u8m2_tu(__VA_ARGS__) +#define vmacc_vx_u8m2(...) __riscv_vmacc_vx_u8m2_tu(__VA_ARGS__) +#define vmacc_vv_u8m4(...) __riscv_vmacc_vv_u8m4_tu(__VA_ARGS__) +#define vmacc_vx_u8m4(...) __riscv_vmacc_vx_u8m4_tu(__VA_ARGS__) +#define vmacc_vv_u8m8(...) __riscv_vmacc_vv_u8m8_tu(__VA_ARGS__) +#define vmacc_vx_u8m8(...) __riscv_vmacc_vx_u8m8_tu(__VA_ARGS__) +#define vmacc_vv_u16mf4(...) __riscv_vmacc_vv_u16mf4_tu(__VA_ARGS__) +#define vmacc_vx_u16mf4(...) __riscv_vmacc_vx_u16mf4_tu(__VA_ARGS__) +#define vmacc_vv_u16mf2(...) __riscv_vmacc_vv_u16mf2_tu(__VA_ARGS__) +#define vmacc_vx_u16mf2(...) __riscv_vmacc_vx_u16mf2_tu(__VA_ARGS__) +#define vmacc_vv_u16m1(...) __riscv_vmacc_vv_u16m1_tu(__VA_ARGS__) +#define vmacc_vx_u16m1(...) __riscv_vmacc_vx_u16m1_tu(__VA_ARGS__) +#define vmacc_vv_u16m2(...) __riscv_vmacc_vv_u16m2_tu(__VA_ARGS__) +#define vmacc_vx_u16m2(...) __riscv_vmacc_vx_u16m2_tu(__VA_ARGS__) +#define vmacc_vv_u16m4(...) __riscv_vmacc_vv_u16m4_tu(__VA_ARGS__) +#define vmacc_vx_u16m4(...) __riscv_vmacc_vx_u16m4_tu(__VA_ARGS__) +#define vmacc_vv_u16m8(...) __riscv_vmacc_vv_u16m8_tu(__VA_ARGS__) +#define vmacc_vx_u16m8(...) __riscv_vmacc_vx_u16m8_tu(__VA_ARGS__) +#define vmacc_vv_u32mf2(...) __riscv_vmacc_vv_u32mf2_tu(__VA_ARGS__) +#define vmacc_vx_u32mf2(...) __riscv_vmacc_vx_u32mf2_tu(__VA_ARGS__) +#define vmacc_vv_u32m1(...) __riscv_vmacc_vv_u32m1_tu(__VA_ARGS__) +#define vmacc_vx_u32m1(...) __riscv_vmacc_vx_u32m1_tu(__VA_ARGS__) +#define vmacc_vv_u32m2(...) __riscv_vmacc_vv_u32m2_tu(__VA_ARGS__) +#define vmacc_vx_u32m2(...) __riscv_vmacc_vx_u32m2_tu(__VA_ARGS__) +#define vmacc_vv_u32m4(...) __riscv_vmacc_vv_u32m4_tu(__VA_ARGS__) +#define vmacc_vx_u32m4(...) __riscv_vmacc_vx_u32m4_tu(__VA_ARGS__) +#define vmacc_vv_u32m8(...) __riscv_vmacc_vv_u32m8_tu(__VA_ARGS__) +#define vmacc_vx_u32m8(...) __riscv_vmacc_vx_u32m8_tu(__VA_ARGS__) +#define vmacc_vv_u64m1(...) __riscv_vmacc_vv_u64m1_tu(__VA_ARGS__) +#define vmacc_vx_u64m1(...) __riscv_vmacc_vx_u64m1_tu(__VA_ARGS__) +#define vmacc_vv_u64m2(...) __riscv_vmacc_vv_u64m2_tu(__VA_ARGS__) +#define vmacc_vx_u64m2(...) __riscv_vmacc_vx_u64m2_tu(__VA_ARGS__) +#define vmacc_vv_u64m4(...) __riscv_vmacc_vv_u64m4_tu(__VA_ARGS__) +#define vmacc_vx_u64m4(...) __riscv_vmacc_vx_u64m4_tu(__VA_ARGS__) +#define vmacc_vv_u64m8(...) __riscv_vmacc_vv_u64m8_tu(__VA_ARGS__) +#define vmacc_vx_u64m8(...) __riscv_vmacc_vx_u64m8_tu(__VA_ARGS__) +#define vnmsac_vv_u8mf8(...) __riscv_vnmsac_vv_u8mf8_tu(__VA_ARGS__) +#define vnmsac_vx_u8mf8(...) __riscv_vnmsac_vx_u8mf8_tu(__VA_ARGS__) +#define vnmsac_vv_u8mf4(...) __riscv_vnmsac_vv_u8mf4_tu(__VA_ARGS__) +#define vnmsac_vx_u8mf4(...) __riscv_vnmsac_vx_u8mf4_tu(__VA_ARGS__) +#define vnmsac_vv_u8mf2(...) __riscv_vnmsac_vv_u8mf2_tu(__VA_ARGS__) +#define vnmsac_vx_u8mf2(...) __riscv_vnmsac_vx_u8mf2_tu(__VA_ARGS__) +#define vnmsac_vv_u8m1(...) __riscv_vnmsac_vv_u8m1_tu(__VA_ARGS__) +#define vnmsac_vx_u8m1(...) __riscv_vnmsac_vx_u8m1_tu(__VA_ARGS__) +#define vnmsac_vv_u8m2(...) __riscv_vnmsac_vv_u8m2_tu(__VA_ARGS__) +#define vnmsac_vx_u8m2(...) __riscv_vnmsac_vx_u8m2_tu(__VA_ARGS__) +#define vnmsac_vv_u8m4(...) __riscv_vnmsac_vv_u8m4_tu(__VA_ARGS__) +#define vnmsac_vx_u8m4(...) __riscv_vnmsac_vx_u8m4_tu(__VA_ARGS__) +#define vnmsac_vv_u8m8(...) __riscv_vnmsac_vv_u8m8_tu(__VA_ARGS__) +#define vnmsac_vx_u8m8(...) __riscv_vnmsac_vx_u8m8_tu(__VA_ARGS__) +#define vnmsac_vv_u16mf4(...) __riscv_vnmsac_vv_u16mf4_tu(__VA_ARGS__) +#define vnmsac_vx_u16mf4(...) __riscv_vnmsac_vx_u16mf4_tu(__VA_ARGS__) +#define vnmsac_vv_u16mf2(...) __riscv_vnmsac_vv_u16mf2_tu(__VA_ARGS__) +#define vnmsac_vx_u16mf2(...) __riscv_vnmsac_vx_u16mf2_tu(__VA_ARGS__) +#define vnmsac_vv_u16m1(...) __riscv_vnmsac_vv_u16m1_tu(__VA_ARGS__) +#define vnmsac_vx_u16m1(...) __riscv_vnmsac_vx_u16m1_tu(__VA_ARGS__) +#define vnmsac_vv_u16m2(...) __riscv_vnmsac_vv_u16m2_tu(__VA_ARGS__) +#define vnmsac_vx_u16m2(...) __riscv_vnmsac_vx_u16m2_tu(__VA_ARGS__) +#define vnmsac_vv_u16m4(...) __riscv_vnmsac_vv_u16m4_tu(__VA_ARGS__) +#define vnmsac_vx_u16m4(...) __riscv_vnmsac_vx_u16m4_tu(__VA_ARGS__) +#define vnmsac_vv_u16m8(...) __riscv_vnmsac_vv_u16m8_tu(__VA_ARGS__) +#define vnmsac_vx_u16m8(...) __riscv_vnmsac_vx_u16m8_tu(__VA_ARGS__) +#define vnmsac_vv_u32mf2(...) __riscv_vnmsac_vv_u32mf2_tu(__VA_ARGS__) +#define vnmsac_vx_u32mf2(...) __riscv_vnmsac_vx_u32mf2_tu(__VA_ARGS__) +#define vnmsac_vv_u32m1(...) __riscv_vnmsac_vv_u32m1_tu(__VA_ARGS__) +#define vnmsac_vx_u32m1(...) __riscv_vnmsac_vx_u32m1_tu(__VA_ARGS__) +#define vnmsac_vv_u32m2(...) __riscv_vnmsac_vv_u32m2_tu(__VA_ARGS__) +#define vnmsac_vx_u32m2(...) __riscv_vnmsac_vx_u32m2_tu(__VA_ARGS__) +#define vnmsac_vv_u32m4(...) __riscv_vnmsac_vv_u32m4_tu(__VA_ARGS__) +#define vnmsac_vx_u32m4(...) __riscv_vnmsac_vx_u32m4_tu(__VA_ARGS__) +#define vnmsac_vv_u32m8(...) __riscv_vnmsac_vv_u32m8_tu(__VA_ARGS__) +#define vnmsac_vx_u32m8(...) __riscv_vnmsac_vx_u32m8_tu(__VA_ARGS__) +#define vnmsac_vv_u64m1(...) __riscv_vnmsac_vv_u64m1_tu(__VA_ARGS__) +#define vnmsac_vx_u64m1(...) __riscv_vnmsac_vx_u64m1_tu(__VA_ARGS__) +#define vnmsac_vv_u64m2(...) __riscv_vnmsac_vv_u64m2_tu(__VA_ARGS__) +#define vnmsac_vx_u64m2(...) __riscv_vnmsac_vx_u64m2_tu(__VA_ARGS__) +#define vnmsac_vv_u64m4(...) __riscv_vnmsac_vv_u64m4_tu(__VA_ARGS__) +#define vnmsac_vx_u64m4(...) __riscv_vnmsac_vx_u64m4_tu(__VA_ARGS__) +#define vnmsac_vv_u64m8(...) __riscv_vnmsac_vv_u64m8_tu(__VA_ARGS__) +#define vnmsac_vx_u64m8(...) __riscv_vnmsac_vx_u64m8_tu(__VA_ARGS__) +#define vmadd_vv_u8mf8(...) __riscv_vmadd_vv_u8mf8_tu(__VA_ARGS__) +#define vmadd_vx_u8mf8(...) __riscv_vmadd_vx_u8mf8_tu(__VA_ARGS__) +#define vmadd_vv_u8mf4(...) __riscv_vmadd_vv_u8mf4_tu(__VA_ARGS__) +#define vmadd_vx_u8mf4(...) __riscv_vmadd_vx_u8mf4_tu(__VA_ARGS__) +#define vmadd_vv_u8mf2(...) __riscv_vmadd_vv_u8mf2_tu(__VA_ARGS__) +#define vmadd_vx_u8mf2(...) __riscv_vmadd_vx_u8mf2_tu(__VA_ARGS__) +#define vmadd_vv_u8m1(...) __riscv_vmadd_vv_u8m1_tu(__VA_ARGS__) +#define vmadd_vx_u8m1(...) __riscv_vmadd_vx_u8m1_tu(__VA_ARGS__) +#define vmadd_vv_u8m2(...) __riscv_vmadd_vv_u8m2_tu(__VA_ARGS__) +#define vmadd_vx_u8m2(...) __riscv_vmadd_vx_u8m2_tu(__VA_ARGS__) +#define vmadd_vv_u8m4(...) __riscv_vmadd_vv_u8m4_tu(__VA_ARGS__) +#define vmadd_vx_u8m4(...) __riscv_vmadd_vx_u8m4_tu(__VA_ARGS__) +#define vmadd_vv_u8m8(...) __riscv_vmadd_vv_u8m8_tu(__VA_ARGS__) +#define vmadd_vx_u8m8(...) __riscv_vmadd_vx_u8m8_tu(__VA_ARGS__) +#define vmadd_vv_u16mf4(...) __riscv_vmadd_vv_u16mf4_tu(__VA_ARGS__) +#define vmadd_vx_u16mf4(...) __riscv_vmadd_vx_u16mf4_tu(__VA_ARGS__) +#define vmadd_vv_u16mf2(...) __riscv_vmadd_vv_u16mf2_tu(__VA_ARGS__) +#define vmadd_vx_u16mf2(...) __riscv_vmadd_vx_u16mf2_tu(__VA_ARGS__) +#define vmadd_vv_u16m1(...) __riscv_vmadd_vv_u16m1_tu(__VA_ARGS__) +#define vmadd_vx_u16m1(...) __riscv_vmadd_vx_u16m1_tu(__VA_ARGS__) +#define vmadd_vv_u16m2(...) __riscv_vmadd_vv_u16m2_tu(__VA_ARGS__) +#define vmadd_vx_u16m2(...) __riscv_vmadd_vx_u16m2_tu(__VA_ARGS__) +#define vmadd_vv_u16m4(...) __riscv_vmadd_vv_u16m4_tu(__VA_ARGS__) +#define vmadd_vx_u16m4(...) __riscv_vmadd_vx_u16m4_tu(__VA_ARGS__) +#define vmadd_vv_u16m8(...) __riscv_vmadd_vv_u16m8_tu(__VA_ARGS__) +#define vmadd_vx_u16m8(...) __riscv_vmadd_vx_u16m8_tu(__VA_ARGS__) +#define vmadd_vv_u32mf2(...) __riscv_vmadd_vv_u32mf2_tu(__VA_ARGS__) +#define vmadd_vx_u32mf2(...) __riscv_vmadd_vx_u32mf2_tu(__VA_ARGS__) +#define vmadd_vv_u32m1(...) __riscv_vmadd_vv_u32m1_tu(__VA_ARGS__) +#define vmadd_vx_u32m1(...) __riscv_vmadd_vx_u32m1_tu(__VA_ARGS__) +#define vmadd_vv_u32m2(...) __riscv_vmadd_vv_u32m2_tu(__VA_ARGS__) +#define vmadd_vx_u32m2(...) __riscv_vmadd_vx_u32m2_tu(__VA_ARGS__) +#define vmadd_vv_u32m4(...) __riscv_vmadd_vv_u32m4_tu(__VA_ARGS__) +#define vmadd_vx_u32m4(...) __riscv_vmadd_vx_u32m4_tu(__VA_ARGS__) +#define vmadd_vv_u32m8(...) __riscv_vmadd_vv_u32m8_tu(__VA_ARGS__) +#define vmadd_vx_u32m8(...) __riscv_vmadd_vx_u32m8_tu(__VA_ARGS__) +#define vmadd_vv_u64m1(...) __riscv_vmadd_vv_u64m1_tu(__VA_ARGS__) +#define vmadd_vx_u64m1(...) __riscv_vmadd_vx_u64m1_tu(__VA_ARGS__) +#define vmadd_vv_u64m2(...) __riscv_vmadd_vv_u64m2_tu(__VA_ARGS__) +#define vmadd_vx_u64m2(...) __riscv_vmadd_vx_u64m2_tu(__VA_ARGS__) +#define vmadd_vv_u64m4(...) __riscv_vmadd_vv_u64m4_tu(__VA_ARGS__) +#define vmadd_vx_u64m4(...) __riscv_vmadd_vx_u64m4_tu(__VA_ARGS__) +#define vmadd_vv_u64m8(...) __riscv_vmadd_vv_u64m8_tu(__VA_ARGS__) +#define vmadd_vx_u64m8(...) __riscv_vmadd_vx_u64m8_tu(__VA_ARGS__) +#define vnmsub_vv_u8mf8(...) __riscv_vnmsub_vv_u8mf8_tu(__VA_ARGS__) +#define vnmsub_vx_u8mf8(...) __riscv_vnmsub_vx_u8mf8_tu(__VA_ARGS__) +#define vnmsub_vv_u8mf4(...) __riscv_vnmsub_vv_u8mf4_tu(__VA_ARGS__) +#define vnmsub_vx_u8mf4(...) __riscv_vnmsub_vx_u8mf4_tu(__VA_ARGS__) +#define vnmsub_vv_u8mf2(...) __riscv_vnmsub_vv_u8mf2_tu(__VA_ARGS__) +#define vnmsub_vx_u8mf2(...) __riscv_vnmsub_vx_u8mf2_tu(__VA_ARGS__) +#define vnmsub_vv_u8m1(...) __riscv_vnmsub_vv_u8m1_tu(__VA_ARGS__) +#define vnmsub_vx_u8m1(...) __riscv_vnmsub_vx_u8m1_tu(__VA_ARGS__) +#define vnmsub_vv_u8m2(...) __riscv_vnmsub_vv_u8m2_tu(__VA_ARGS__) +#define vnmsub_vx_u8m2(...) __riscv_vnmsub_vx_u8m2_tu(__VA_ARGS__) +#define vnmsub_vv_u8m4(...) __riscv_vnmsub_vv_u8m4_tu(__VA_ARGS__) +#define vnmsub_vx_u8m4(...) __riscv_vnmsub_vx_u8m4_tu(__VA_ARGS__) +#define vnmsub_vv_u8m8(...) __riscv_vnmsub_vv_u8m8_tu(__VA_ARGS__) +#define vnmsub_vx_u8m8(...) __riscv_vnmsub_vx_u8m8_tu(__VA_ARGS__) +#define vnmsub_vv_u16mf4(...) __riscv_vnmsub_vv_u16mf4_tu(__VA_ARGS__) +#define vnmsub_vx_u16mf4(...) __riscv_vnmsub_vx_u16mf4_tu(__VA_ARGS__) +#define vnmsub_vv_u16mf2(...) __riscv_vnmsub_vv_u16mf2_tu(__VA_ARGS__) +#define vnmsub_vx_u16mf2(...) __riscv_vnmsub_vx_u16mf2_tu(__VA_ARGS__) +#define vnmsub_vv_u16m1(...) __riscv_vnmsub_vv_u16m1_tu(__VA_ARGS__) +#define vnmsub_vx_u16m1(...) __riscv_vnmsub_vx_u16m1_tu(__VA_ARGS__) +#define vnmsub_vv_u16m2(...) __riscv_vnmsub_vv_u16m2_tu(__VA_ARGS__) +#define vnmsub_vx_u16m2(...) __riscv_vnmsub_vx_u16m2_tu(__VA_ARGS__) +#define vnmsub_vv_u16m4(...) __riscv_vnmsub_vv_u16m4_tu(__VA_ARGS__) +#define vnmsub_vx_u16m4(...) __riscv_vnmsub_vx_u16m4_tu(__VA_ARGS__) +#define vnmsub_vv_u16m8(...) __riscv_vnmsub_vv_u16m8_tu(__VA_ARGS__) +#define vnmsub_vx_u16m8(...) __riscv_vnmsub_vx_u16m8_tu(__VA_ARGS__) +#define vnmsub_vv_u32mf2(...) __riscv_vnmsub_vv_u32mf2_tu(__VA_ARGS__) +#define vnmsub_vx_u32mf2(...) __riscv_vnmsub_vx_u32mf2_tu(__VA_ARGS__) +#define vnmsub_vv_u32m1(...) __riscv_vnmsub_vv_u32m1_tu(__VA_ARGS__) +#define vnmsub_vx_u32m1(...) __riscv_vnmsub_vx_u32m1_tu(__VA_ARGS__) +#define vnmsub_vv_u32m2(...) __riscv_vnmsub_vv_u32m2_tu(__VA_ARGS__) +#define vnmsub_vx_u32m2(...) __riscv_vnmsub_vx_u32m2_tu(__VA_ARGS__) +#define vnmsub_vv_u32m4(...) __riscv_vnmsub_vv_u32m4_tu(__VA_ARGS__) +#define vnmsub_vx_u32m4(...) __riscv_vnmsub_vx_u32m4_tu(__VA_ARGS__) +#define vnmsub_vv_u32m8(...) __riscv_vnmsub_vv_u32m8_tu(__VA_ARGS__) +#define vnmsub_vx_u32m8(...) __riscv_vnmsub_vx_u32m8_tu(__VA_ARGS__) +#define vnmsub_vv_u64m1(...) __riscv_vnmsub_vv_u64m1_tu(__VA_ARGS__) +#define vnmsub_vx_u64m1(...) __riscv_vnmsub_vx_u64m1_tu(__VA_ARGS__) +#define vnmsub_vv_u64m2(...) __riscv_vnmsub_vv_u64m2_tu(__VA_ARGS__) +#define vnmsub_vx_u64m2(...) __riscv_vnmsub_vx_u64m2_tu(__VA_ARGS__) +#define vnmsub_vv_u64m4(...) __riscv_vnmsub_vv_u64m4_tu(__VA_ARGS__) +#define vnmsub_vx_u64m4(...) __riscv_vnmsub_vx_u64m4_tu(__VA_ARGS__) +#define vnmsub_vv_u64m8(...) __riscv_vnmsub_vv_u64m8_tu(__VA_ARGS__) +#define vnmsub_vx_u64m8(...) __riscv_vnmsub_vx_u64m8_tu(__VA_ARGS__) +// masked functions +#define vmacc_vv_i8mf8_m(...) __riscv_vmacc_vv_i8mf8_tumu(__VA_ARGS__) +#define vmacc_vx_i8mf8_m(...) __riscv_vmacc_vx_i8mf8_tumu(__VA_ARGS__) +#define vmacc_vv_i8mf4_m(...) __riscv_vmacc_vv_i8mf4_tumu(__VA_ARGS__) +#define vmacc_vx_i8mf4_m(...) __riscv_vmacc_vx_i8mf4_tumu(__VA_ARGS__) +#define vmacc_vv_i8mf2_m(...) __riscv_vmacc_vv_i8mf2_tumu(__VA_ARGS__) +#define vmacc_vx_i8mf2_m(...) __riscv_vmacc_vx_i8mf2_tumu(__VA_ARGS__) +#define vmacc_vv_i8m1_m(...) __riscv_vmacc_vv_i8m1_tumu(__VA_ARGS__) +#define vmacc_vx_i8m1_m(...) __riscv_vmacc_vx_i8m1_tumu(__VA_ARGS__) +#define vmacc_vv_i8m2_m(...) __riscv_vmacc_vv_i8m2_tumu(__VA_ARGS__) +#define vmacc_vx_i8m2_m(...) __riscv_vmacc_vx_i8m2_tumu(__VA_ARGS__) +#define vmacc_vv_i8m4_m(...) __riscv_vmacc_vv_i8m4_tumu(__VA_ARGS__) +#define vmacc_vx_i8m4_m(...) __riscv_vmacc_vx_i8m4_tumu(__VA_ARGS__) +#define vmacc_vv_i8m8_m(...) __riscv_vmacc_vv_i8m8_tumu(__VA_ARGS__) +#define vmacc_vx_i8m8_m(...) __riscv_vmacc_vx_i8m8_tumu(__VA_ARGS__) +#define vmacc_vv_i16mf4_m(...) __riscv_vmacc_vv_i16mf4_tumu(__VA_ARGS__) +#define vmacc_vx_i16mf4_m(...) __riscv_vmacc_vx_i16mf4_tumu(__VA_ARGS__) +#define vmacc_vv_i16mf2_m(...) __riscv_vmacc_vv_i16mf2_tumu(__VA_ARGS__) +#define vmacc_vx_i16mf2_m(...) __riscv_vmacc_vx_i16mf2_tumu(__VA_ARGS__) +#define vmacc_vv_i16m1_m(...) __riscv_vmacc_vv_i16m1_tumu(__VA_ARGS__) +#define vmacc_vx_i16m1_m(...) __riscv_vmacc_vx_i16m1_tumu(__VA_ARGS__) +#define vmacc_vv_i16m2_m(...) __riscv_vmacc_vv_i16m2_tumu(__VA_ARGS__) +#define vmacc_vx_i16m2_m(...) __riscv_vmacc_vx_i16m2_tumu(__VA_ARGS__) +#define vmacc_vv_i16m4_m(...) __riscv_vmacc_vv_i16m4_tumu(__VA_ARGS__) +#define vmacc_vx_i16m4_m(...) __riscv_vmacc_vx_i16m4_tumu(__VA_ARGS__) +#define vmacc_vv_i16m8_m(...) __riscv_vmacc_vv_i16m8_tumu(__VA_ARGS__) +#define vmacc_vx_i16m8_m(...) __riscv_vmacc_vx_i16m8_tumu(__VA_ARGS__) +#define vmacc_vv_i32mf2_m(...) __riscv_vmacc_vv_i32mf2_tumu(__VA_ARGS__) +#define vmacc_vx_i32mf2_m(...) __riscv_vmacc_vx_i32mf2_tumu(__VA_ARGS__) +#define vmacc_vv_i32m1_m(...) __riscv_vmacc_vv_i32m1_tumu(__VA_ARGS__) +#define vmacc_vx_i32m1_m(...) __riscv_vmacc_vx_i32m1_tumu(__VA_ARGS__) +#define vmacc_vv_i32m2_m(...) __riscv_vmacc_vv_i32m2_tumu(__VA_ARGS__) +#define vmacc_vx_i32m2_m(...) __riscv_vmacc_vx_i32m2_tumu(__VA_ARGS__) +#define vmacc_vv_i32m4_m(...) __riscv_vmacc_vv_i32m4_tumu(__VA_ARGS__) +#define vmacc_vx_i32m4_m(...) __riscv_vmacc_vx_i32m4_tumu(__VA_ARGS__) +#define vmacc_vv_i32m8_m(...) __riscv_vmacc_vv_i32m8_tumu(__VA_ARGS__) +#define vmacc_vx_i32m8_m(...) __riscv_vmacc_vx_i32m8_tumu(__VA_ARGS__) +#define vmacc_vv_i64m1_m(...) __riscv_vmacc_vv_i64m1_tumu(__VA_ARGS__) +#define vmacc_vx_i64m1_m(...) __riscv_vmacc_vx_i64m1_tumu(__VA_ARGS__) +#define vmacc_vv_i64m2_m(...) __riscv_vmacc_vv_i64m2_tumu(__VA_ARGS__) +#define vmacc_vx_i64m2_m(...) __riscv_vmacc_vx_i64m2_tumu(__VA_ARGS__) +#define vmacc_vv_i64m4_m(...) __riscv_vmacc_vv_i64m4_tumu(__VA_ARGS__) +#define vmacc_vx_i64m4_m(...) __riscv_vmacc_vx_i64m4_tumu(__VA_ARGS__) +#define vmacc_vv_i64m8_m(...) __riscv_vmacc_vv_i64m8_tumu(__VA_ARGS__) +#define vmacc_vx_i64m8_m(...) __riscv_vmacc_vx_i64m8_tumu(__VA_ARGS__) +#define vnmsac_vv_i8mf8_m(...) __riscv_vnmsac_vv_i8mf8_tumu(__VA_ARGS__) +#define vnmsac_vx_i8mf8_m(...) __riscv_vnmsac_vx_i8mf8_tumu(__VA_ARGS__) +#define vnmsac_vv_i8mf4_m(...) __riscv_vnmsac_vv_i8mf4_tumu(__VA_ARGS__) +#define vnmsac_vx_i8mf4_m(...) __riscv_vnmsac_vx_i8mf4_tumu(__VA_ARGS__) +#define vnmsac_vv_i8mf2_m(...) __riscv_vnmsac_vv_i8mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_i8mf2_m(...) __riscv_vnmsac_vx_i8mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_i8m1_m(...) __riscv_vnmsac_vv_i8m1_tumu(__VA_ARGS__) +#define vnmsac_vx_i8m1_m(...) __riscv_vnmsac_vx_i8m1_tumu(__VA_ARGS__) +#define vnmsac_vv_i8m2_m(...) __riscv_vnmsac_vv_i8m2_tumu(__VA_ARGS__) +#define vnmsac_vx_i8m2_m(...) __riscv_vnmsac_vx_i8m2_tumu(__VA_ARGS__) +#define vnmsac_vv_i8m4_m(...) __riscv_vnmsac_vv_i8m4_tumu(__VA_ARGS__) +#define vnmsac_vx_i8m4_m(...) __riscv_vnmsac_vx_i8m4_tumu(__VA_ARGS__) +#define vnmsac_vv_i8m8_m(...) __riscv_vnmsac_vv_i8m8_tumu(__VA_ARGS__) +#define vnmsac_vx_i8m8_m(...) __riscv_vnmsac_vx_i8m8_tumu(__VA_ARGS__) +#define vnmsac_vv_i16mf4_m(...) __riscv_vnmsac_vv_i16mf4_tumu(__VA_ARGS__) +#define vnmsac_vx_i16mf4_m(...) __riscv_vnmsac_vx_i16mf4_tumu(__VA_ARGS__) +#define vnmsac_vv_i16mf2_m(...) __riscv_vnmsac_vv_i16mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_i16mf2_m(...) __riscv_vnmsac_vx_i16mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_i16m1_m(...) __riscv_vnmsac_vv_i16m1_tumu(__VA_ARGS__) +#define vnmsac_vx_i16m1_m(...) __riscv_vnmsac_vx_i16m1_tumu(__VA_ARGS__) +#define vnmsac_vv_i16m2_m(...) __riscv_vnmsac_vv_i16m2_tumu(__VA_ARGS__) +#define vnmsac_vx_i16m2_m(...) __riscv_vnmsac_vx_i16m2_tumu(__VA_ARGS__) +#define vnmsac_vv_i16m4_m(...) __riscv_vnmsac_vv_i16m4_tumu(__VA_ARGS__) +#define vnmsac_vx_i16m4_m(...) __riscv_vnmsac_vx_i16m4_tumu(__VA_ARGS__) +#define vnmsac_vv_i16m8_m(...) __riscv_vnmsac_vv_i16m8_tumu(__VA_ARGS__) +#define vnmsac_vx_i16m8_m(...) __riscv_vnmsac_vx_i16m8_tumu(__VA_ARGS__) +#define vnmsac_vv_i32mf2_m(...) __riscv_vnmsac_vv_i32mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_i32mf2_m(...) __riscv_vnmsac_vx_i32mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_i32m1_m(...) __riscv_vnmsac_vv_i32m1_tumu(__VA_ARGS__) +#define vnmsac_vx_i32m1_m(...) __riscv_vnmsac_vx_i32m1_tumu(__VA_ARGS__) +#define vnmsac_vv_i32m2_m(...) __riscv_vnmsac_vv_i32m2_tumu(__VA_ARGS__) +#define vnmsac_vx_i32m2_m(...) __riscv_vnmsac_vx_i32m2_tumu(__VA_ARGS__) +#define vnmsac_vv_i32m4_m(...) __riscv_vnmsac_vv_i32m4_tumu(__VA_ARGS__) +#define vnmsac_vx_i32m4_m(...) __riscv_vnmsac_vx_i32m4_tumu(__VA_ARGS__) +#define vnmsac_vv_i32m8_m(...) __riscv_vnmsac_vv_i32m8_tumu(__VA_ARGS__) +#define vnmsac_vx_i32m8_m(...) __riscv_vnmsac_vx_i32m8_tumu(__VA_ARGS__) +#define vnmsac_vv_i64m1_m(...) __riscv_vnmsac_vv_i64m1_tumu(__VA_ARGS__) +#define vnmsac_vx_i64m1_m(...) __riscv_vnmsac_vx_i64m1_tumu(__VA_ARGS__) +#define vnmsac_vv_i64m2_m(...) __riscv_vnmsac_vv_i64m2_tumu(__VA_ARGS__) +#define vnmsac_vx_i64m2_m(...) __riscv_vnmsac_vx_i64m2_tumu(__VA_ARGS__) +#define vnmsac_vv_i64m4_m(...) __riscv_vnmsac_vv_i64m4_tumu(__VA_ARGS__) +#define vnmsac_vx_i64m4_m(...) __riscv_vnmsac_vx_i64m4_tumu(__VA_ARGS__) +#define vnmsac_vv_i64m8_m(...) __riscv_vnmsac_vv_i64m8_tumu(__VA_ARGS__) +#define vnmsac_vx_i64m8_m(...) __riscv_vnmsac_vx_i64m8_tumu(__VA_ARGS__) +#define vmadd_vv_i8mf8_m(...) __riscv_vmadd_vv_i8mf8_tumu(__VA_ARGS__) +#define vmadd_vx_i8mf8_m(...) __riscv_vmadd_vx_i8mf8_tumu(__VA_ARGS__) +#define vmadd_vv_i8mf4_m(...) __riscv_vmadd_vv_i8mf4_tumu(__VA_ARGS__) +#define vmadd_vx_i8mf4_m(...) __riscv_vmadd_vx_i8mf4_tumu(__VA_ARGS__) +#define vmadd_vv_i8mf2_m(...) __riscv_vmadd_vv_i8mf2_tumu(__VA_ARGS__) +#define vmadd_vx_i8mf2_m(...) __riscv_vmadd_vx_i8mf2_tumu(__VA_ARGS__) +#define vmadd_vv_i8m1_m(...) __riscv_vmadd_vv_i8m1_tumu(__VA_ARGS__) +#define vmadd_vx_i8m1_m(...) __riscv_vmadd_vx_i8m1_tumu(__VA_ARGS__) +#define vmadd_vv_i8m2_m(...) __riscv_vmadd_vv_i8m2_tumu(__VA_ARGS__) +#define vmadd_vx_i8m2_m(...) __riscv_vmadd_vx_i8m2_tumu(__VA_ARGS__) +#define vmadd_vv_i8m4_m(...) __riscv_vmadd_vv_i8m4_tumu(__VA_ARGS__) +#define vmadd_vx_i8m4_m(...) __riscv_vmadd_vx_i8m4_tumu(__VA_ARGS__) +#define vmadd_vv_i8m8_m(...) __riscv_vmadd_vv_i8m8_tumu(__VA_ARGS__) +#define vmadd_vx_i8m8_m(...) __riscv_vmadd_vx_i8m8_tumu(__VA_ARGS__) +#define vmadd_vv_i16mf4_m(...) __riscv_vmadd_vv_i16mf4_tumu(__VA_ARGS__) +#define vmadd_vx_i16mf4_m(...) __riscv_vmadd_vx_i16mf4_tumu(__VA_ARGS__) +#define vmadd_vv_i16mf2_m(...) __riscv_vmadd_vv_i16mf2_tumu(__VA_ARGS__) +#define vmadd_vx_i16mf2_m(...) __riscv_vmadd_vx_i16mf2_tumu(__VA_ARGS__) +#define vmadd_vv_i16m1_m(...) __riscv_vmadd_vv_i16m1_tumu(__VA_ARGS__) +#define vmadd_vx_i16m1_m(...) __riscv_vmadd_vx_i16m1_tumu(__VA_ARGS__) +#define vmadd_vv_i16m2_m(...) __riscv_vmadd_vv_i16m2_tumu(__VA_ARGS__) +#define vmadd_vx_i16m2_m(...) __riscv_vmadd_vx_i16m2_tumu(__VA_ARGS__) +#define vmadd_vv_i16m4_m(...) __riscv_vmadd_vv_i16m4_tumu(__VA_ARGS__) +#define vmadd_vx_i16m4_m(...) __riscv_vmadd_vx_i16m4_tumu(__VA_ARGS__) +#define vmadd_vv_i16m8_m(...) __riscv_vmadd_vv_i16m8_tumu(__VA_ARGS__) +#define vmadd_vx_i16m8_m(...) __riscv_vmadd_vx_i16m8_tumu(__VA_ARGS__) +#define vmadd_vv_i32mf2_m(...) __riscv_vmadd_vv_i32mf2_tumu(__VA_ARGS__) +#define vmadd_vx_i32mf2_m(...) __riscv_vmadd_vx_i32mf2_tumu(__VA_ARGS__) +#define vmadd_vv_i32m1_m(...) __riscv_vmadd_vv_i32m1_tumu(__VA_ARGS__) +#define vmadd_vx_i32m1_m(...) __riscv_vmadd_vx_i32m1_tumu(__VA_ARGS__) +#define vmadd_vv_i32m2_m(...) __riscv_vmadd_vv_i32m2_tumu(__VA_ARGS__) +#define vmadd_vx_i32m2_m(...) __riscv_vmadd_vx_i32m2_tumu(__VA_ARGS__) +#define vmadd_vv_i32m4_m(...) __riscv_vmadd_vv_i32m4_tumu(__VA_ARGS__) +#define vmadd_vx_i32m4_m(...) __riscv_vmadd_vx_i32m4_tumu(__VA_ARGS__) +#define vmadd_vv_i32m8_m(...) __riscv_vmadd_vv_i32m8_tumu(__VA_ARGS__) +#define vmadd_vx_i32m8_m(...) __riscv_vmadd_vx_i32m8_tumu(__VA_ARGS__) +#define vmadd_vv_i64m1_m(...) __riscv_vmadd_vv_i64m1_tumu(__VA_ARGS__) +#define vmadd_vx_i64m1_m(...) __riscv_vmadd_vx_i64m1_tumu(__VA_ARGS__) +#define vmadd_vv_i64m2_m(...) __riscv_vmadd_vv_i64m2_tumu(__VA_ARGS__) +#define vmadd_vx_i64m2_m(...) __riscv_vmadd_vx_i64m2_tumu(__VA_ARGS__) +#define vmadd_vv_i64m4_m(...) __riscv_vmadd_vv_i64m4_tumu(__VA_ARGS__) +#define vmadd_vx_i64m4_m(...) __riscv_vmadd_vx_i64m4_tumu(__VA_ARGS__) +#define vmadd_vv_i64m8_m(...) __riscv_vmadd_vv_i64m8_tumu(__VA_ARGS__) +#define vmadd_vx_i64m8_m(...) __riscv_vmadd_vx_i64m8_tumu(__VA_ARGS__) +#define vnmsub_vv_i8mf8_m(...) __riscv_vnmsub_vv_i8mf8_tumu(__VA_ARGS__) +#define vnmsub_vx_i8mf8_m(...) __riscv_vnmsub_vx_i8mf8_tumu(__VA_ARGS__) +#define vnmsub_vv_i8mf4_m(...) __riscv_vnmsub_vv_i8mf4_tumu(__VA_ARGS__) +#define vnmsub_vx_i8mf4_m(...) __riscv_vnmsub_vx_i8mf4_tumu(__VA_ARGS__) +#define vnmsub_vv_i8mf2_m(...) __riscv_vnmsub_vv_i8mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_i8mf2_m(...) __riscv_vnmsub_vx_i8mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_i8m1_m(...) __riscv_vnmsub_vv_i8m1_tumu(__VA_ARGS__) +#define vnmsub_vx_i8m1_m(...) __riscv_vnmsub_vx_i8m1_tumu(__VA_ARGS__) +#define vnmsub_vv_i8m2_m(...) __riscv_vnmsub_vv_i8m2_tumu(__VA_ARGS__) +#define vnmsub_vx_i8m2_m(...) __riscv_vnmsub_vx_i8m2_tumu(__VA_ARGS__) +#define vnmsub_vv_i8m4_m(...) __riscv_vnmsub_vv_i8m4_tumu(__VA_ARGS__) +#define vnmsub_vx_i8m4_m(...) __riscv_vnmsub_vx_i8m4_tumu(__VA_ARGS__) +#define vnmsub_vv_i8m8_m(...) __riscv_vnmsub_vv_i8m8_tumu(__VA_ARGS__) +#define vnmsub_vx_i8m8_m(...) __riscv_vnmsub_vx_i8m8_tumu(__VA_ARGS__) +#define vnmsub_vv_i16mf4_m(...) __riscv_vnmsub_vv_i16mf4_tumu(__VA_ARGS__) +#define vnmsub_vx_i16mf4_m(...) __riscv_vnmsub_vx_i16mf4_tumu(__VA_ARGS__) +#define vnmsub_vv_i16mf2_m(...) __riscv_vnmsub_vv_i16mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_i16mf2_m(...) __riscv_vnmsub_vx_i16mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_i16m1_m(...) __riscv_vnmsub_vv_i16m1_tumu(__VA_ARGS__) +#define vnmsub_vx_i16m1_m(...) __riscv_vnmsub_vx_i16m1_tumu(__VA_ARGS__) +#define vnmsub_vv_i16m2_m(...) __riscv_vnmsub_vv_i16m2_tumu(__VA_ARGS__) +#define vnmsub_vx_i16m2_m(...) __riscv_vnmsub_vx_i16m2_tumu(__VA_ARGS__) +#define vnmsub_vv_i16m4_m(...) __riscv_vnmsub_vv_i16m4_tumu(__VA_ARGS__) +#define vnmsub_vx_i16m4_m(...) __riscv_vnmsub_vx_i16m4_tumu(__VA_ARGS__) +#define vnmsub_vv_i16m8_m(...) __riscv_vnmsub_vv_i16m8_tumu(__VA_ARGS__) +#define vnmsub_vx_i16m8_m(...) __riscv_vnmsub_vx_i16m8_tumu(__VA_ARGS__) +#define vnmsub_vv_i32mf2_m(...) __riscv_vnmsub_vv_i32mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_i32mf2_m(...) __riscv_vnmsub_vx_i32mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_i32m1_m(...) __riscv_vnmsub_vv_i32m1_tumu(__VA_ARGS__) +#define vnmsub_vx_i32m1_m(...) __riscv_vnmsub_vx_i32m1_tumu(__VA_ARGS__) +#define vnmsub_vv_i32m2_m(...) __riscv_vnmsub_vv_i32m2_tumu(__VA_ARGS__) +#define vnmsub_vx_i32m2_m(...) __riscv_vnmsub_vx_i32m2_tumu(__VA_ARGS__) +#define vnmsub_vv_i32m4_m(...) __riscv_vnmsub_vv_i32m4_tumu(__VA_ARGS__) +#define vnmsub_vx_i32m4_m(...) __riscv_vnmsub_vx_i32m4_tumu(__VA_ARGS__) +#define vnmsub_vv_i32m8_m(...) __riscv_vnmsub_vv_i32m8_tumu(__VA_ARGS__) +#define vnmsub_vx_i32m8_m(...) __riscv_vnmsub_vx_i32m8_tumu(__VA_ARGS__) +#define vnmsub_vv_i64m1_m(...) __riscv_vnmsub_vv_i64m1_tumu(__VA_ARGS__) +#define vnmsub_vx_i64m1_m(...) __riscv_vnmsub_vx_i64m1_tumu(__VA_ARGS__) +#define vnmsub_vv_i64m2_m(...) __riscv_vnmsub_vv_i64m2_tumu(__VA_ARGS__) +#define vnmsub_vx_i64m2_m(...) __riscv_vnmsub_vx_i64m2_tumu(__VA_ARGS__) +#define vnmsub_vv_i64m4_m(...) __riscv_vnmsub_vv_i64m4_tumu(__VA_ARGS__) +#define vnmsub_vx_i64m4_m(...) __riscv_vnmsub_vx_i64m4_tumu(__VA_ARGS__) +#define vnmsub_vv_i64m8_m(...) __riscv_vnmsub_vv_i64m8_tumu(__VA_ARGS__) +#define vnmsub_vx_i64m8_m(...) __riscv_vnmsub_vx_i64m8_tumu(__VA_ARGS__) +#define vmacc_vv_u8mf8_m(...) __riscv_vmacc_vv_u8mf8_tumu(__VA_ARGS__) +#define vmacc_vx_u8mf8_m(...) __riscv_vmacc_vx_u8mf8_tumu(__VA_ARGS__) +#define vmacc_vv_u8mf4_m(...) __riscv_vmacc_vv_u8mf4_tumu(__VA_ARGS__) +#define vmacc_vx_u8mf4_m(...) __riscv_vmacc_vx_u8mf4_tumu(__VA_ARGS__) +#define vmacc_vv_u8mf2_m(...) __riscv_vmacc_vv_u8mf2_tumu(__VA_ARGS__) +#define vmacc_vx_u8mf2_m(...) __riscv_vmacc_vx_u8mf2_tumu(__VA_ARGS__) +#define vmacc_vv_u8m1_m(...) __riscv_vmacc_vv_u8m1_tumu(__VA_ARGS__) +#define vmacc_vx_u8m1_m(...) __riscv_vmacc_vx_u8m1_tumu(__VA_ARGS__) +#define vmacc_vv_u8m2_m(...) __riscv_vmacc_vv_u8m2_tumu(__VA_ARGS__) +#define vmacc_vx_u8m2_m(...) __riscv_vmacc_vx_u8m2_tumu(__VA_ARGS__) +#define vmacc_vv_u8m4_m(...) __riscv_vmacc_vv_u8m4_tumu(__VA_ARGS__) +#define vmacc_vx_u8m4_m(...) __riscv_vmacc_vx_u8m4_tumu(__VA_ARGS__) +#define vmacc_vv_u8m8_m(...) __riscv_vmacc_vv_u8m8_tumu(__VA_ARGS__) +#define vmacc_vx_u8m8_m(...) __riscv_vmacc_vx_u8m8_tumu(__VA_ARGS__) +#define vmacc_vv_u16mf4_m(...) __riscv_vmacc_vv_u16mf4_tumu(__VA_ARGS__) +#define vmacc_vx_u16mf4_m(...) __riscv_vmacc_vx_u16mf4_tumu(__VA_ARGS__) +#define vmacc_vv_u16mf2_m(...) __riscv_vmacc_vv_u16mf2_tumu(__VA_ARGS__) +#define vmacc_vx_u16mf2_m(...) __riscv_vmacc_vx_u16mf2_tumu(__VA_ARGS__) +#define vmacc_vv_u16m1_m(...) __riscv_vmacc_vv_u16m1_tumu(__VA_ARGS__) +#define vmacc_vx_u16m1_m(...) __riscv_vmacc_vx_u16m1_tumu(__VA_ARGS__) +#define vmacc_vv_u16m2_m(...) __riscv_vmacc_vv_u16m2_tumu(__VA_ARGS__) +#define vmacc_vx_u16m2_m(...) __riscv_vmacc_vx_u16m2_tumu(__VA_ARGS__) +#define vmacc_vv_u16m4_m(...) __riscv_vmacc_vv_u16m4_tumu(__VA_ARGS__) +#define vmacc_vx_u16m4_m(...) __riscv_vmacc_vx_u16m4_tumu(__VA_ARGS__) +#define vmacc_vv_u16m8_m(...) __riscv_vmacc_vv_u16m8_tumu(__VA_ARGS__) +#define vmacc_vx_u16m8_m(...) __riscv_vmacc_vx_u16m8_tumu(__VA_ARGS__) +#define vmacc_vv_u32mf2_m(...) __riscv_vmacc_vv_u32mf2_tumu(__VA_ARGS__) +#define vmacc_vx_u32mf2_m(...) __riscv_vmacc_vx_u32mf2_tumu(__VA_ARGS__) +#define vmacc_vv_u32m1_m(...) __riscv_vmacc_vv_u32m1_tumu(__VA_ARGS__) +#define vmacc_vx_u32m1_m(...) __riscv_vmacc_vx_u32m1_tumu(__VA_ARGS__) +#define vmacc_vv_u32m2_m(...) __riscv_vmacc_vv_u32m2_tumu(__VA_ARGS__) +#define vmacc_vx_u32m2_m(...) __riscv_vmacc_vx_u32m2_tumu(__VA_ARGS__) +#define vmacc_vv_u32m4_m(...) __riscv_vmacc_vv_u32m4_tumu(__VA_ARGS__) +#define vmacc_vx_u32m4_m(...) __riscv_vmacc_vx_u32m4_tumu(__VA_ARGS__) +#define vmacc_vv_u32m8_m(...) __riscv_vmacc_vv_u32m8_tumu(__VA_ARGS__) +#define vmacc_vx_u32m8_m(...) __riscv_vmacc_vx_u32m8_tumu(__VA_ARGS__) +#define vmacc_vv_u64m1_m(...) __riscv_vmacc_vv_u64m1_tumu(__VA_ARGS__) +#define vmacc_vx_u64m1_m(...) __riscv_vmacc_vx_u64m1_tumu(__VA_ARGS__) +#define vmacc_vv_u64m2_m(...) __riscv_vmacc_vv_u64m2_tumu(__VA_ARGS__) +#define vmacc_vx_u64m2_m(...) __riscv_vmacc_vx_u64m2_tumu(__VA_ARGS__) +#define vmacc_vv_u64m4_m(...) __riscv_vmacc_vv_u64m4_tumu(__VA_ARGS__) +#define vmacc_vx_u64m4_m(...) __riscv_vmacc_vx_u64m4_tumu(__VA_ARGS__) +#define vmacc_vv_u64m8_m(...) __riscv_vmacc_vv_u64m8_tumu(__VA_ARGS__) +#define vmacc_vx_u64m8_m(...) __riscv_vmacc_vx_u64m8_tumu(__VA_ARGS__) +#define vnmsac_vv_u8mf8_m(...) __riscv_vnmsac_vv_u8mf8_tumu(__VA_ARGS__) +#define vnmsac_vx_u8mf8_m(...) __riscv_vnmsac_vx_u8mf8_tumu(__VA_ARGS__) +#define vnmsac_vv_u8mf4_m(...) __riscv_vnmsac_vv_u8mf4_tumu(__VA_ARGS__) +#define vnmsac_vx_u8mf4_m(...) __riscv_vnmsac_vx_u8mf4_tumu(__VA_ARGS__) +#define vnmsac_vv_u8mf2_m(...) __riscv_vnmsac_vv_u8mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_u8mf2_m(...) __riscv_vnmsac_vx_u8mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_u8m1_m(...) __riscv_vnmsac_vv_u8m1_tumu(__VA_ARGS__) +#define vnmsac_vx_u8m1_m(...) __riscv_vnmsac_vx_u8m1_tumu(__VA_ARGS__) +#define vnmsac_vv_u8m2_m(...) __riscv_vnmsac_vv_u8m2_tumu(__VA_ARGS__) +#define vnmsac_vx_u8m2_m(...) __riscv_vnmsac_vx_u8m2_tumu(__VA_ARGS__) +#define vnmsac_vv_u8m4_m(...) __riscv_vnmsac_vv_u8m4_tumu(__VA_ARGS__) +#define vnmsac_vx_u8m4_m(...) __riscv_vnmsac_vx_u8m4_tumu(__VA_ARGS__) +#define vnmsac_vv_u8m8_m(...) __riscv_vnmsac_vv_u8m8_tumu(__VA_ARGS__) +#define vnmsac_vx_u8m8_m(...) __riscv_vnmsac_vx_u8m8_tumu(__VA_ARGS__) +#define vnmsac_vv_u16mf4_m(...) __riscv_vnmsac_vv_u16mf4_tumu(__VA_ARGS__) +#define vnmsac_vx_u16mf4_m(...) __riscv_vnmsac_vx_u16mf4_tumu(__VA_ARGS__) +#define vnmsac_vv_u16mf2_m(...) __riscv_vnmsac_vv_u16mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_u16mf2_m(...) __riscv_vnmsac_vx_u16mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_u16m1_m(...) __riscv_vnmsac_vv_u16m1_tumu(__VA_ARGS__) +#define vnmsac_vx_u16m1_m(...) __riscv_vnmsac_vx_u16m1_tumu(__VA_ARGS__) +#define vnmsac_vv_u16m2_m(...) __riscv_vnmsac_vv_u16m2_tumu(__VA_ARGS__) +#define vnmsac_vx_u16m2_m(...) __riscv_vnmsac_vx_u16m2_tumu(__VA_ARGS__) +#define vnmsac_vv_u16m4_m(...) __riscv_vnmsac_vv_u16m4_tumu(__VA_ARGS__) +#define vnmsac_vx_u16m4_m(...) __riscv_vnmsac_vx_u16m4_tumu(__VA_ARGS__) +#define vnmsac_vv_u16m8_m(...) __riscv_vnmsac_vv_u16m8_tumu(__VA_ARGS__) +#define vnmsac_vx_u16m8_m(...) __riscv_vnmsac_vx_u16m8_tumu(__VA_ARGS__) +#define vnmsac_vv_u32mf2_m(...) __riscv_vnmsac_vv_u32mf2_tumu(__VA_ARGS__) +#define vnmsac_vx_u32mf2_m(...) __riscv_vnmsac_vx_u32mf2_tumu(__VA_ARGS__) +#define vnmsac_vv_u32m1_m(...) __riscv_vnmsac_vv_u32m1_tumu(__VA_ARGS__) +#define vnmsac_vx_u32m1_m(...) __riscv_vnmsac_vx_u32m1_tumu(__VA_ARGS__) +#define vnmsac_vv_u32m2_m(...) __riscv_vnmsac_vv_u32m2_tumu(__VA_ARGS__) +#define vnmsac_vx_u32m2_m(...) __riscv_vnmsac_vx_u32m2_tumu(__VA_ARGS__) +#define vnmsac_vv_u32m4_m(...) __riscv_vnmsac_vv_u32m4_tumu(__VA_ARGS__) +#define vnmsac_vx_u32m4_m(...) __riscv_vnmsac_vx_u32m4_tumu(__VA_ARGS__) +#define vnmsac_vv_u32m8_m(...) __riscv_vnmsac_vv_u32m8_tumu(__VA_ARGS__) +#define vnmsac_vx_u32m8_m(...) __riscv_vnmsac_vx_u32m8_tumu(__VA_ARGS__) +#define vnmsac_vv_u64m1_m(...) __riscv_vnmsac_vv_u64m1_tumu(__VA_ARGS__) +#define vnmsac_vx_u64m1_m(...) __riscv_vnmsac_vx_u64m1_tumu(__VA_ARGS__) +#define vnmsac_vv_u64m2_m(...) __riscv_vnmsac_vv_u64m2_tumu(__VA_ARGS__) +#define vnmsac_vx_u64m2_m(...) __riscv_vnmsac_vx_u64m2_tumu(__VA_ARGS__) +#define vnmsac_vv_u64m4_m(...) __riscv_vnmsac_vv_u64m4_tumu(__VA_ARGS__) +#define vnmsac_vx_u64m4_m(...) __riscv_vnmsac_vx_u64m4_tumu(__VA_ARGS__) +#define vnmsac_vv_u64m8_m(...) __riscv_vnmsac_vv_u64m8_tumu(__VA_ARGS__) +#define vnmsac_vx_u64m8_m(...) __riscv_vnmsac_vx_u64m8_tumu(__VA_ARGS__) +#define vmadd_vv_u8mf8_m(...) __riscv_vmadd_vv_u8mf8_tumu(__VA_ARGS__) +#define vmadd_vx_u8mf8_m(...) __riscv_vmadd_vx_u8mf8_tumu(__VA_ARGS__) +#define vmadd_vv_u8mf4_m(...) __riscv_vmadd_vv_u8mf4_tumu(__VA_ARGS__) +#define vmadd_vx_u8mf4_m(...) __riscv_vmadd_vx_u8mf4_tumu(__VA_ARGS__) +#define vmadd_vv_u8mf2_m(...) __riscv_vmadd_vv_u8mf2_tumu(__VA_ARGS__) +#define vmadd_vx_u8mf2_m(...) __riscv_vmadd_vx_u8mf2_tumu(__VA_ARGS__) +#define vmadd_vv_u8m1_m(...) __riscv_vmadd_vv_u8m1_tumu(__VA_ARGS__) +#define vmadd_vx_u8m1_m(...) __riscv_vmadd_vx_u8m1_tumu(__VA_ARGS__) +#define vmadd_vv_u8m2_m(...) __riscv_vmadd_vv_u8m2_tumu(__VA_ARGS__) +#define vmadd_vx_u8m2_m(...) __riscv_vmadd_vx_u8m2_tumu(__VA_ARGS__) +#define vmadd_vv_u8m4_m(...) __riscv_vmadd_vv_u8m4_tumu(__VA_ARGS__) +#define vmadd_vx_u8m4_m(...) __riscv_vmadd_vx_u8m4_tumu(__VA_ARGS__) +#define vmadd_vv_u8m8_m(...) __riscv_vmadd_vv_u8m8_tumu(__VA_ARGS__) +#define vmadd_vx_u8m8_m(...) __riscv_vmadd_vx_u8m8_tumu(__VA_ARGS__) +#define vmadd_vv_u16mf4_m(...) __riscv_vmadd_vv_u16mf4_tumu(__VA_ARGS__) +#define vmadd_vx_u16mf4_m(...) __riscv_vmadd_vx_u16mf4_tumu(__VA_ARGS__) +#define vmadd_vv_u16mf2_m(...) __riscv_vmadd_vv_u16mf2_tumu(__VA_ARGS__) +#define vmadd_vx_u16mf2_m(...) __riscv_vmadd_vx_u16mf2_tumu(__VA_ARGS__) +#define vmadd_vv_u16m1_m(...) __riscv_vmadd_vv_u16m1_tumu(__VA_ARGS__) +#define vmadd_vx_u16m1_m(...) __riscv_vmadd_vx_u16m1_tumu(__VA_ARGS__) +#define vmadd_vv_u16m2_m(...) __riscv_vmadd_vv_u16m2_tumu(__VA_ARGS__) +#define vmadd_vx_u16m2_m(...) __riscv_vmadd_vx_u16m2_tumu(__VA_ARGS__) +#define vmadd_vv_u16m4_m(...) __riscv_vmadd_vv_u16m4_tumu(__VA_ARGS__) +#define vmadd_vx_u16m4_m(...) __riscv_vmadd_vx_u16m4_tumu(__VA_ARGS__) +#define vmadd_vv_u16m8_m(...) __riscv_vmadd_vv_u16m8_tumu(__VA_ARGS__) +#define vmadd_vx_u16m8_m(...) __riscv_vmadd_vx_u16m8_tumu(__VA_ARGS__) +#define vmadd_vv_u32mf2_m(...) __riscv_vmadd_vv_u32mf2_tumu(__VA_ARGS__) +#define vmadd_vx_u32mf2_m(...) __riscv_vmadd_vx_u32mf2_tumu(__VA_ARGS__) +#define vmadd_vv_u32m1_m(...) __riscv_vmadd_vv_u32m1_tumu(__VA_ARGS__) +#define vmadd_vx_u32m1_m(...) __riscv_vmadd_vx_u32m1_tumu(__VA_ARGS__) +#define vmadd_vv_u32m2_m(...) __riscv_vmadd_vv_u32m2_tumu(__VA_ARGS__) +#define vmadd_vx_u32m2_m(...) __riscv_vmadd_vx_u32m2_tumu(__VA_ARGS__) +#define vmadd_vv_u32m4_m(...) __riscv_vmadd_vv_u32m4_tumu(__VA_ARGS__) +#define vmadd_vx_u32m4_m(...) __riscv_vmadd_vx_u32m4_tumu(__VA_ARGS__) +#define vmadd_vv_u32m8_m(...) __riscv_vmadd_vv_u32m8_tumu(__VA_ARGS__) +#define vmadd_vx_u32m8_m(...) __riscv_vmadd_vx_u32m8_tumu(__VA_ARGS__) +#define vmadd_vv_u64m1_m(...) __riscv_vmadd_vv_u64m1_tumu(__VA_ARGS__) +#define vmadd_vx_u64m1_m(...) __riscv_vmadd_vx_u64m1_tumu(__VA_ARGS__) +#define vmadd_vv_u64m2_m(...) __riscv_vmadd_vv_u64m2_tumu(__VA_ARGS__) +#define vmadd_vx_u64m2_m(...) __riscv_vmadd_vx_u64m2_tumu(__VA_ARGS__) +#define vmadd_vv_u64m4_m(...) __riscv_vmadd_vv_u64m4_tumu(__VA_ARGS__) +#define vmadd_vx_u64m4_m(...) __riscv_vmadd_vx_u64m4_tumu(__VA_ARGS__) +#define vmadd_vv_u64m8_m(...) __riscv_vmadd_vv_u64m8_tumu(__VA_ARGS__) +#define vmadd_vx_u64m8_m(...) __riscv_vmadd_vx_u64m8_tumu(__VA_ARGS__) +#define vnmsub_vv_u8mf8_m(...) __riscv_vnmsub_vv_u8mf8_tumu(__VA_ARGS__) +#define vnmsub_vx_u8mf8_m(...) __riscv_vnmsub_vx_u8mf8_tumu(__VA_ARGS__) +#define vnmsub_vv_u8mf4_m(...) __riscv_vnmsub_vv_u8mf4_tumu(__VA_ARGS__) +#define vnmsub_vx_u8mf4_m(...) __riscv_vnmsub_vx_u8mf4_tumu(__VA_ARGS__) +#define vnmsub_vv_u8mf2_m(...) __riscv_vnmsub_vv_u8mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_u8mf2_m(...) __riscv_vnmsub_vx_u8mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_u8m1_m(...) __riscv_vnmsub_vv_u8m1_tumu(__VA_ARGS__) +#define vnmsub_vx_u8m1_m(...) __riscv_vnmsub_vx_u8m1_tumu(__VA_ARGS__) +#define vnmsub_vv_u8m2_m(...) __riscv_vnmsub_vv_u8m2_tumu(__VA_ARGS__) +#define vnmsub_vx_u8m2_m(...) __riscv_vnmsub_vx_u8m2_tumu(__VA_ARGS__) +#define vnmsub_vv_u8m4_m(...) __riscv_vnmsub_vv_u8m4_tumu(__VA_ARGS__) +#define vnmsub_vx_u8m4_m(...) __riscv_vnmsub_vx_u8m4_tumu(__VA_ARGS__) +#define vnmsub_vv_u8m8_m(...) __riscv_vnmsub_vv_u8m8_tumu(__VA_ARGS__) +#define vnmsub_vx_u8m8_m(...) __riscv_vnmsub_vx_u8m8_tumu(__VA_ARGS__) +#define vnmsub_vv_u16mf4_m(...) __riscv_vnmsub_vv_u16mf4_tumu(__VA_ARGS__) +#define vnmsub_vx_u16mf4_m(...) __riscv_vnmsub_vx_u16mf4_tumu(__VA_ARGS__) +#define vnmsub_vv_u16mf2_m(...) __riscv_vnmsub_vv_u16mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_u16mf2_m(...) __riscv_vnmsub_vx_u16mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_u16m1_m(...) __riscv_vnmsub_vv_u16m1_tumu(__VA_ARGS__) +#define vnmsub_vx_u16m1_m(...) __riscv_vnmsub_vx_u16m1_tumu(__VA_ARGS__) +#define vnmsub_vv_u16m2_m(...) __riscv_vnmsub_vv_u16m2_tumu(__VA_ARGS__) +#define vnmsub_vx_u16m2_m(...) __riscv_vnmsub_vx_u16m2_tumu(__VA_ARGS__) +#define vnmsub_vv_u16m4_m(...) __riscv_vnmsub_vv_u16m4_tumu(__VA_ARGS__) +#define vnmsub_vx_u16m4_m(...) __riscv_vnmsub_vx_u16m4_tumu(__VA_ARGS__) +#define vnmsub_vv_u16m8_m(...) __riscv_vnmsub_vv_u16m8_tumu(__VA_ARGS__) +#define vnmsub_vx_u16m8_m(...) __riscv_vnmsub_vx_u16m8_tumu(__VA_ARGS__) +#define vnmsub_vv_u32mf2_m(...) __riscv_vnmsub_vv_u32mf2_tumu(__VA_ARGS__) +#define vnmsub_vx_u32mf2_m(...) __riscv_vnmsub_vx_u32mf2_tumu(__VA_ARGS__) +#define vnmsub_vv_u32m1_m(...) __riscv_vnmsub_vv_u32m1_tumu(__VA_ARGS__) +#define vnmsub_vx_u32m1_m(...) __riscv_vnmsub_vx_u32m1_tumu(__VA_ARGS__) +#define vnmsub_vv_u32m2_m(...) __riscv_vnmsub_vv_u32m2_tumu(__VA_ARGS__) +#define vnmsub_vx_u32m2_m(...) __riscv_vnmsub_vx_u32m2_tumu(__VA_ARGS__) +#define vnmsub_vv_u32m4_m(...) __riscv_vnmsub_vv_u32m4_tumu(__VA_ARGS__) +#define vnmsub_vx_u32m4_m(...) __riscv_vnmsub_vx_u32m4_tumu(__VA_ARGS__) +#define vnmsub_vv_u32m8_m(...) __riscv_vnmsub_vv_u32m8_tumu(__VA_ARGS__) +#define vnmsub_vx_u32m8_m(...) __riscv_vnmsub_vx_u32m8_tumu(__VA_ARGS__) +#define vnmsub_vv_u64m1_m(...) __riscv_vnmsub_vv_u64m1_tumu(__VA_ARGS__) +#define vnmsub_vx_u64m1_m(...) __riscv_vnmsub_vx_u64m1_tumu(__VA_ARGS__) +#define vnmsub_vv_u64m2_m(...) __riscv_vnmsub_vv_u64m2_tumu(__VA_ARGS__) +#define vnmsub_vx_u64m2_m(...) __riscv_vnmsub_vx_u64m2_tumu(__VA_ARGS__) +#define vnmsub_vv_u64m4_m(...) __riscv_vnmsub_vv_u64m4_tumu(__VA_ARGS__) +#define vnmsub_vx_u64m4_m(...) __riscv_vnmsub_vx_u64m4_tumu(__VA_ARGS__) +#define vnmsub_vv_u64m8_m(...) __riscv_vnmsub_vv_u64m8_tumu(__VA_ARGS__) +#define vnmsub_vx_u64m8_m(...) __riscv_vnmsub_vx_u64m8_tumu(__VA_ARGS__) +#define vwmacc_vv_i16mf4(...) __riscv_vwmacc_vv_i16mf4_tu(__VA_ARGS__) +#define vwmacc_vx_i16mf4(...) __riscv_vwmacc_vx_i16mf4_tu(__VA_ARGS__) +#define vwmacc_vv_i16mf2(...) __riscv_vwmacc_vv_i16mf2_tu(__VA_ARGS__) +#define vwmacc_vx_i16mf2(...) __riscv_vwmacc_vx_i16mf2_tu(__VA_ARGS__) +#define vwmacc_vv_i16m1(...) __riscv_vwmacc_vv_i16m1_tu(__VA_ARGS__) +#define vwmacc_vx_i16m1(...) __riscv_vwmacc_vx_i16m1_tu(__VA_ARGS__) +#define vwmacc_vv_i16m2(...) __riscv_vwmacc_vv_i16m2_tu(__VA_ARGS__) +#define vwmacc_vx_i16m2(...) __riscv_vwmacc_vx_i16m2_tu(__VA_ARGS__) +#define vwmacc_vv_i16m4(...) __riscv_vwmacc_vv_i16m4_tu(__VA_ARGS__) +#define vwmacc_vx_i16m4(...) __riscv_vwmacc_vx_i16m4_tu(__VA_ARGS__) +#define vwmacc_vv_i16m8(...) __riscv_vwmacc_vv_i16m8_tu(__VA_ARGS__) +#define vwmacc_vx_i16m8(...) __riscv_vwmacc_vx_i16m8_tu(__VA_ARGS__) +#define vwmacc_vv_i32mf2(...) __riscv_vwmacc_vv_i32mf2_tu(__VA_ARGS__) +#define vwmacc_vx_i32mf2(...) __riscv_vwmacc_vx_i32mf2_tu(__VA_ARGS__) +#define vwmacc_vv_i32m1(...) __riscv_vwmacc_vv_i32m1_tu(__VA_ARGS__) +#define vwmacc_vx_i32m1(...) __riscv_vwmacc_vx_i32m1_tu(__VA_ARGS__) +#define vwmacc_vv_i32m2(...) __riscv_vwmacc_vv_i32m2_tu(__VA_ARGS__) +#define vwmacc_vx_i32m2(...) __riscv_vwmacc_vx_i32m2_tu(__VA_ARGS__) +#define vwmacc_vv_i32m4(...) __riscv_vwmacc_vv_i32m4_tu(__VA_ARGS__) +#define vwmacc_vx_i32m4(...) __riscv_vwmacc_vx_i32m4_tu(__VA_ARGS__) +#define vwmacc_vv_i32m8(...) __riscv_vwmacc_vv_i32m8_tu(__VA_ARGS__) +#define vwmacc_vx_i32m8(...) __riscv_vwmacc_vx_i32m8_tu(__VA_ARGS__) +#define vwmacc_vv_i64m1(...) __riscv_vwmacc_vv_i64m1_tu(__VA_ARGS__) +#define vwmacc_vx_i64m1(...) __riscv_vwmacc_vx_i64m1_tu(__VA_ARGS__) +#define vwmacc_vv_i64m2(...) __riscv_vwmacc_vv_i64m2_tu(__VA_ARGS__) +#define vwmacc_vx_i64m2(...) __riscv_vwmacc_vx_i64m2_tu(__VA_ARGS__) +#define vwmacc_vv_i64m4(...) __riscv_vwmacc_vv_i64m4_tu(__VA_ARGS__) +#define vwmacc_vx_i64m4(...) __riscv_vwmacc_vx_i64m4_tu(__VA_ARGS__) +#define vwmacc_vv_i64m8(...) __riscv_vwmacc_vv_i64m8_tu(__VA_ARGS__) +#define vwmacc_vx_i64m8(...) __riscv_vwmacc_vx_i64m8_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16mf4(...) __riscv_vwmaccsu_vv_i16mf4_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16mf4(...) __riscv_vwmaccsu_vx_i16mf4_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16mf2(...) __riscv_vwmaccsu_vv_i16mf2_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16mf2(...) __riscv_vwmaccsu_vx_i16mf2_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16m1(...) __riscv_vwmaccsu_vv_i16m1_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16m1(...) __riscv_vwmaccsu_vx_i16m1_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16m2(...) __riscv_vwmaccsu_vv_i16m2_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16m2(...) __riscv_vwmaccsu_vx_i16m2_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16m4(...) __riscv_vwmaccsu_vv_i16m4_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16m4(...) __riscv_vwmaccsu_vx_i16m4_tu(__VA_ARGS__) +#define vwmaccsu_vv_i16m8(...) __riscv_vwmaccsu_vv_i16m8_tu(__VA_ARGS__) +#define vwmaccsu_vx_i16m8(...) __riscv_vwmaccsu_vx_i16m8_tu(__VA_ARGS__) +#define vwmaccsu_vv_i32mf2(...) __riscv_vwmaccsu_vv_i32mf2_tu(__VA_ARGS__) +#define vwmaccsu_vx_i32mf2(...) __riscv_vwmaccsu_vx_i32mf2_tu(__VA_ARGS__) +#define vwmaccsu_vv_i32m1(...) __riscv_vwmaccsu_vv_i32m1_tu(__VA_ARGS__) +#define vwmaccsu_vx_i32m1(...) __riscv_vwmaccsu_vx_i32m1_tu(__VA_ARGS__) +#define vwmaccsu_vv_i32m2(...) __riscv_vwmaccsu_vv_i32m2_tu(__VA_ARGS__) +#define vwmaccsu_vx_i32m2(...) __riscv_vwmaccsu_vx_i32m2_tu(__VA_ARGS__) +#define vwmaccsu_vv_i32m4(...) __riscv_vwmaccsu_vv_i32m4_tu(__VA_ARGS__) +#define vwmaccsu_vx_i32m4(...) __riscv_vwmaccsu_vx_i32m4_tu(__VA_ARGS__) +#define vwmaccsu_vv_i32m8(...) __riscv_vwmaccsu_vv_i32m8_tu(__VA_ARGS__) +#define vwmaccsu_vx_i32m8(...) __riscv_vwmaccsu_vx_i32m8_tu(__VA_ARGS__) +#define vwmaccsu_vv_i64m1(...) __riscv_vwmaccsu_vv_i64m1_tu(__VA_ARGS__) +#define vwmaccsu_vx_i64m1(...) __riscv_vwmaccsu_vx_i64m1_tu(__VA_ARGS__) +#define vwmaccsu_vv_i64m2(...) __riscv_vwmaccsu_vv_i64m2_tu(__VA_ARGS__) +#define vwmaccsu_vx_i64m2(...) __riscv_vwmaccsu_vx_i64m2_tu(__VA_ARGS__) +#define vwmaccsu_vv_i64m4(...) __riscv_vwmaccsu_vv_i64m4_tu(__VA_ARGS__) +#define vwmaccsu_vx_i64m4(...) __riscv_vwmaccsu_vx_i64m4_tu(__VA_ARGS__) +#define vwmaccsu_vv_i64m8(...) __riscv_vwmaccsu_vv_i64m8_tu(__VA_ARGS__) +#define vwmaccsu_vx_i64m8(...) __riscv_vwmaccsu_vx_i64m8_tu(__VA_ARGS__) +#define vwmaccus_vx_i16mf4(...) __riscv_vwmaccus_vx_i16mf4_tu(__VA_ARGS__) +#define vwmaccus_vx_i16mf2(...) __riscv_vwmaccus_vx_i16mf2_tu(__VA_ARGS__) +#define vwmaccus_vx_i16m1(...) __riscv_vwmaccus_vx_i16m1_tu(__VA_ARGS__) +#define vwmaccus_vx_i16m2(...) __riscv_vwmaccus_vx_i16m2_tu(__VA_ARGS__) +#define vwmaccus_vx_i16m4(...) __riscv_vwmaccus_vx_i16m4_tu(__VA_ARGS__) +#define vwmaccus_vx_i16m8(...) __riscv_vwmaccus_vx_i16m8_tu(__VA_ARGS__) +#define vwmaccus_vx_i32mf2(...) __riscv_vwmaccus_vx_i32mf2_tu(__VA_ARGS__) +#define vwmaccus_vx_i32m1(...) __riscv_vwmaccus_vx_i32m1_tu(__VA_ARGS__) +#define vwmaccus_vx_i32m2(...) __riscv_vwmaccus_vx_i32m2_tu(__VA_ARGS__) +#define vwmaccus_vx_i32m4(...) __riscv_vwmaccus_vx_i32m4_tu(__VA_ARGS__) +#define vwmaccus_vx_i32m8(...) __riscv_vwmaccus_vx_i32m8_tu(__VA_ARGS__) +#define vwmaccus_vx_i64m1(...) __riscv_vwmaccus_vx_i64m1_tu(__VA_ARGS__) +#define vwmaccus_vx_i64m2(...) __riscv_vwmaccus_vx_i64m2_tu(__VA_ARGS__) +#define vwmaccus_vx_i64m4(...) __riscv_vwmaccus_vx_i64m4_tu(__VA_ARGS__) +#define vwmaccus_vx_i64m8(...) __riscv_vwmaccus_vx_i64m8_tu(__VA_ARGS__) +#define vwmaccu_vv_u16mf4(...) __riscv_vwmaccu_vv_u16mf4_tu(__VA_ARGS__) +#define vwmaccu_vx_u16mf4(...) __riscv_vwmaccu_vx_u16mf4_tu(__VA_ARGS__) +#define vwmaccu_vv_u16mf2(...) __riscv_vwmaccu_vv_u16mf2_tu(__VA_ARGS__) +#define vwmaccu_vx_u16mf2(...) __riscv_vwmaccu_vx_u16mf2_tu(__VA_ARGS__) +#define vwmaccu_vv_u16m1(...) __riscv_vwmaccu_vv_u16m1_tu(__VA_ARGS__) +#define vwmaccu_vx_u16m1(...) __riscv_vwmaccu_vx_u16m1_tu(__VA_ARGS__) +#define vwmaccu_vv_u16m2(...) __riscv_vwmaccu_vv_u16m2_tu(__VA_ARGS__) +#define vwmaccu_vx_u16m2(...) __riscv_vwmaccu_vx_u16m2_tu(__VA_ARGS__) +#define vwmaccu_vv_u16m4(...) __riscv_vwmaccu_vv_u16m4_tu(__VA_ARGS__) +#define vwmaccu_vx_u16m4(...) __riscv_vwmaccu_vx_u16m4_tu(__VA_ARGS__) +#define vwmaccu_vv_u16m8(...) __riscv_vwmaccu_vv_u16m8_tu(__VA_ARGS__) +#define vwmaccu_vx_u16m8(...) __riscv_vwmaccu_vx_u16m8_tu(__VA_ARGS__) +#define vwmaccu_vv_u32mf2(...) __riscv_vwmaccu_vv_u32mf2_tu(__VA_ARGS__) +#define vwmaccu_vx_u32mf2(...) __riscv_vwmaccu_vx_u32mf2_tu(__VA_ARGS__) +#define vwmaccu_vv_u32m1(...) __riscv_vwmaccu_vv_u32m1_tu(__VA_ARGS__) +#define vwmaccu_vx_u32m1(...) __riscv_vwmaccu_vx_u32m1_tu(__VA_ARGS__) +#define vwmaccu_vv_u32m2(...) __riscv_vwmaccu_vv_u32m2_tu(__VA_ARGS__) +#define vwmaccu_vx_u32m2(...) __riscv_vwmaccu_vx_u32m2_tu(__VA_ARGS__) +#define vwmaccu_vv_u32m4(...) __riscv_vwmaccu_vv_u32m4_tu(__VA_ARGS__) +#define vwmaccu_vx_u32m4(...) __riscv_vwmaccu_vx_u32m4_tu(__VA_ARGS__) +#define vwmaccu_vv_u32m8(...) __riscv_vwmaccu_vv_u32m8_tu(__VA_ARGS__) +#define vwmaccu_vx_u32m8(...) __riscv_vwmaccu_vx_u32m8_tu(__VA_ARGS__) +#define vwmaccu_vv_u64m1(...) __riscv_vwmaccu_vv_u64m1_tu(__VA_ARGS__) +#define vwmaccu_vx_u64m1(...) __riscv_vwmaccu_vx_u64m1_tu(__VA_ARGS__) +#define vwmaccu_vv_u64m2(...) __riscv_vwmaccu_vv_u64m2_tu(__VA_ARGS__) +#define vwmaccu_vx_u64m2(...) __riscv_vwmaccu_vx_u64m2_tu(__VA_ARGS__) +#define vwmaccu_vv_u64m4(...) __riscv_vwmaccu_vv_u64m4_tu(__VA_ARGS__) +#define vwmaccu_vx_u64m4(...) __riscv_vwmaccu_vx_u64m4_tu(__VA_ARGS__) +#define vwmaccu_vv_u64m8(...) __riscv_vwmaccu_vv_u64m8_tu(__VA_ARGS__) +#define vwmaccu_vx_u64m8(...) __riscv_vwmaccu_vx_u64m8_tu(__VA_ARGS__) +// masked functions +#define vwmacc_vv_i16mf4_m(...) __riscv_vwmacc_vv_i16mf4_tumu(__VA_ARGS__) +#define vwmacc_vx_i16mf4_m(...) __riscv_vwmacc_vx_i16mf4_tumu(__VA_ARGS__) +#define vwmacc_vv_i16mf2_m(...) __riscv_vwmacc_vv_i16mf2_tumu(__VA_ARGS__) +#define vwmacc_vx_i16mf2_m(...) __riscv_vwmacc_vx_i16mf2_tumu(__VA_ARGS__) +#define vwmacc_vv_i16m1_m(...) __riscv_vwmacc_vv_i16m1_tumu(__VA_ARGS__) +#define vwmacc_vx_i16m1_m(...) __riscv_vwmacc_vx_i16m1_tumu(__VA_ARGS__) +#define vwmacc_vv_i16m2_m(...) __riscv_vwmacc_vv_i16m2_tumu(__VA_ARGS__) +#define vwmacc_vx_i16m2_m(...) __riscv_vwmacc_vx_i16m2_tumu(__VA_ARGS__) +#define vwmacc_vv_i16m4_m(...) __riscv_vwmacc_vv_i16m4_tumu(__VA_ARGS__) +#define vwmacc_vx_i16m4_m(...) __riscv_vwmacc_vx_i16m4_tumu(__VA_ARGS__) +#define vwmacc_vv_i16m8_m(...) __riscv_vwmacc_vv_i16m8_tumu(__VA_ARGS__) +#define vwmacc_vx_i16m8_m(...) __riscv_vwmacc_vx_i16m8_tumu(__VA_ARGS__) +#define vwmacc_vv_i32mf2_m(...) __riscv_vwmacc_vv_i32mf2_tumu(__VA_ARGS__) +#define vwmacc_vx_i32mf2_m(...) __riscv_vwmacc_vx_i32mf2_tumu(__VA_ARGS__) +#define vwmacc_vv_i32m1_m(...) __riscv_vwmacc_vv_i32m1_tumu(__VA_ARGS__) +#define vwmacc_vx_i32m1_m(...) __riscv_vwmacc_vx_i32m1_tumu(__VA_ARGS__) +#define vwmacc_vv_i32m2_m(...) __riscv_vwmacc_vv_i32m2_tumu(__VA_ARGS__) +#define vwmacc_vx_i32m2_m(...) __riscv_vwmacc_vx_i32m2_tumu(__VA_ARGS__) +#define vwmacc_vv_i32m4_m(...) __riscv_vwmacc_vv_i32m4_tumu(__VA_ARGS__) +#define vwmacc_vx_i32m4_m(...) __riscv_vwmacc_vx_i32m4_tumu(__VA_ARGS__) +#define vwmacc_vv_i32m8_m(...) __riscv_vwmacc_vv_i32m8_tumu(__VA_ARGS__) +#define vwmacc_vx_i32m8_m(...) __riscv_vwmacc_vx_i32m8_tumu(__VA_ARGS__) +#define vwmacc_vv_i64m1_m(...) __riscv_vwmacc_vv_i64m1_tumu(__VA_ARGS__) +#define vwmacc_vx_i64m1_m(...) __riscv_vwmacc_vx_i64m1_tumu(__VA_ARGS__) +#define vwmacc_vv_i64m2_m(...) __riscv_vwmacc_vv_i64m2_tumu(__VA_ARGS__) +#define vwmacc_vx_i64m2_m(...) __riscv_vwmacc_vx_i64m2_tumu(__VA_ARGS__) +#define vwmacc_vv_i64m4_m(...) __riscv_vwmacc_vv_i64m4_tumu(__VA_ARGS__) +#define vwmacc_vx_i64m4_m(...) __riscv_vwmacc_vx_i64m4_tumu(__VA_ARGS__) +#define vwmacc_vv_i64m8_m(...) __riscv_vwmacc_vv_i64m8_tumu(__VA_ARGS__) +#define vwmacc_vx_i64m8_m(...) __riscv_vwmacc_vx_i64m8_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16mf4_m(...) __riscv_vwmaccsu_vv_i16mf4_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16mf4_m(...) __riscv_vwmaccsu_vx_i16mf4_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16mf2_m(...) __riscv_vwmaccsu_vv_i16mf2_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16mf2_m(...) __riscv_vwmaccsu_vx_i16mf2_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16m1_m(...) __riscv_vwmaccsu_vv_i16m1_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16m1_m(...) __riscv_vwmaccsu_vx_i16m1_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16m2_m(...) __riscv_vwmaccsu_vv_i16m2_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16m2_m(...) __riscv_vwmaccsu_vx_i16m2_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16m4_m(...) __riscv_vwmaccsu_vv_i16m4_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16m4_m(...) __riscv_vwmaccsu_vx_i16m4_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i16m8_m(...) __riscv_vwmaccsu_vv_i16m8_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i16m8_m(...) __riscv_vwmaccsu_vx_i16m8_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i32mf2_m(...) __riscv_vwmaccsu_vv_i32mf2_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i32mf2_m(...) __riscv_vwmaccsu_vx_i32mf2_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i32m1_m(...) __riscv_vwmaccsu_vv_i32m1_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i32m1_m(...) __riscv_vwmaccsu_vx_i32m1_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i32m2_m(...) __riscv_vwmaccsu_vv_i32m2_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i32m2_m(...) __riscv_vwmaccsu_vx_i32m2_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i32m4_m(...) __riscv_vwmaccsu_vv_i32m4_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i32m4_m(...) __riscv_vwmaccsu_vx_i32m4_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i32m8_m(...) __riscv_vwmaccsu_vv_i32m8_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i32m8_m(...) __riscv_vwmaccsu_vx_i32m8_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i64m1_m(...) __riscv_vwmaccsu_vv_i64m1_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i64m1_m(...) __riscv_vwmaccsu_vx_i64m1_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i64m2_m(...) __riscv_vwmaccsu_vv_i64m2_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i64m2_m(...) __riscv_vwmaccsu_vx_i64m2_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i64m4_m(...) __riscv_vwmaccsu_vv_i64m4_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i64m4_m(...) __riscv_vwmaccsu_vx_i64m4_tumu(__VA_ARGS__) +#define vwmaccsu_vv_i64m8_m(...) __riscv_vwmaccsu_vv_i64m8_tumu(__VA_ARGS__) +#define vwmaccsu_vx_i64m8_m(...) __riscv_vwmaccsu_vx_i64m8_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16mf4_m(...) __riscv_vwmaccus_vx_i16mf4_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16mf2_m(...) __riscv_vwmaccus_vx_i16mf2_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16m1_m(...) __riscv_vwmaccus_vx_i16m1_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16m2_m(...) __riscv_vwmaccus_vx_i16m2_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16m4_m(...) __riscv_vwmaccus_vx_i16m4_tumu(__VA_ARGS__) +#define vwmaccus_vx_i16m8_m(...) __riscv_vwmaccus_vx_i16m8_tumu(__VA_ARGS__) +#define vwmaccus_vx_i32mf2_m(...) __riscv_vwmaccus_vx_i32mf2_tumu(__VA_ARGS__) +#define vwmaccus_vx_i32m1_m(...) __riscv_vwmaccus_vx_i32m1_tumu(__VA_ARGS__) +#define vwmaccus_vx_i32m2_m(...) __riscv_vwmaccus_vx_i32m2_tumu(__VA_ARGS__) +#define vwmaccus_vx_i32m4_m(...) __riscv_vwmaccus_vx_i32m4_tumu(__VA_ARGS__) +#define vwmaccus_vx_i32m8_m(...) __riscv_vwmaccus_vx_i32m8_tumu(__VA_ARGS__) +#define vwmaccus_vx_i64m1_m(...) __riscv_vwmaccus_vx_i64m1_tumu(__VA_ARGS__) +#define vwmaccus_vx_i64m2_m(...) __riscv_vwmaccus_vx_i64m2_tumu(__VA_ARGS__) +#define vwmaccus_vx_i64m4_m(...) __riscv_vwmaccus_vx_i64m4_tumu(__VA_ARGS__) +#define vwmaccus_vx_i64m8_m(...) __riscv_vwmaccus_vx_i64m8_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16mf4_m(...) __riscv_vwmaccu_vv_u16mf4_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16mf4_m(...) __riscv_vwmaccu_vx_u16mf4_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16mf2_m(...) __riscv_vwmaccu_vv_u16mf2_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16mf2_m(...) __riscv_vwmaccu_vx_u16mf2_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16m1_m(...) __riscv_vwmaccu_vv_u16m1_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16m1_m(...) __riscv_vwmaccu_vx_u16m1_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16m2_m(...) __riscv_vwmaccu_vv_u16m2_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16m2_m(...) __riscv_vwmaccu_vx_u16m2_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16m4_m(...) __riscv_vwmaccu_vv_u16m4_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16m4_m(...) __riscv_vwmaccu_vx_u16m4_tumu(__VA_ARGS__) +#define vwmaccu_vv_u16m8_m(...) __riscv_vwmaccu_vv_u16m8_tumu(__VA_ARGS__) +#define vwmaccu_vx_u16m8_m(...) __riscv_vwmaccu_vx_u16m8_tumu(__VA_ARGS__) +#define vwmaccu_vv_u32mf2_m(...) __riscv_vwmaccu_vv_u32mf2_tumu(__VA_ARGS__) +#define vwmaccu_vx_u32mf2_m(...) __riscv_vwmaccu_vx_u32mf2_tumu(__VA_ARGS__) +#define vwmaccu_vv_u32m1_m(...) __riscv_vwmaccu_vv_u32m1_tumu(__VA_ARGS__) +#define vwmaccu_vx_u32m1_m(...) __riscv_vwmaccu_vx_u32m1_tumu(__VA_ARGS__) +#define vwmaccu_vv_u32m2_m(...) __riscv_vwmaccu_vv_u32m2_tumu(__VA_ARGS__) +#define vwmaccu_vx_u32m2_m(...) __riscv_vwmaccu_vx_u32m2_tumu(__VA_ARGS__) +#define vwmaccu_vv_u32m4_m(...) __riscv_vwmaccu_vv_u32m4_tumu(__VA_ARGS__) +#define vwmaccu_vx_u32m4_m(...) __riscv_vwmaccu_vx_u32m4_tumu(__VA_ARGS__) +#define vwmaccu_vv_u32m8_m(...) __riscv_vwmaccu_vv_u32m8_tumu(__VA_ARGS__) +#define vwmaccu_vx_u32m8_m(...) __riscv_vwmaccu_vx_u32m8_tumu(__VA_ARGS__) +#define vwmaccu_vv_u64m1_m(...) __riscv_vwmaccu_vv_u64m1_tumu(__VA_ARGS__) +#define vwmaccu_vx_u64m1_m(...) __riscv_vwmaccu_vx_u64m1_tumu(__VA_ARGS__) +#define vwmaccu_vv_u64m2_m(...) __riscv_vwmaccu_vv_u64m2_tumu(__VA_ARGS__) +#define vwmaccu_vx_u64m2_m(...) __riscv_vwmaccu_vx_u64m2_tumu(__VA_ARGS__) +#define vwmaccu_vv_u64m4_m(...) __riscv_vwmaccu_vv_u64m4_tumu(__VA_ARGS__) +#define vwmaccu_vx_u64m4_m(...) __riscv_vwmaccu_vx_u64m4_tumu(__VA_ARGS__) +#define vwmaccu_vv_u64m8_m(...) __riscv_vwmaccu_vv_u64m8_tumu(__VA_ARGS__) +#define vwmaccu_vx_u64m8_m(...) __riscv_vwmaccu_vx_u64m8_tumu(__VA_ARGS__) +#define vmerge_vvm_i8mf8(mask, op1, op2, vl) __riscv_vmerge_vvm_i8mf8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8mf8(mask, op1, op2, vl) __riscv_vmerge_vxm_i8mf8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8mf4(mask, op1, op2, vl) __riscv_vmerge_vvm_i8mf4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8mf4(mask, op1, op2, vl) __riscv_vmerge_vxm_i8mf4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_i8mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_i8mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8m1(mask, op1, op2, vl) __riscv_vmerge_vvm_i8m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8m1(mask, op1, op2, vl) __riscv_vmerge_vxm_i8m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8m2(mask, op1, op2, vl) __riscv_vmerge_vvm_i8m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8m2(mask, op1, op2, vl) __riscv_vmerge_vxm_i8m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8m4(mask, op1, op2, vl) __riscv_vmerge_vvm_i8m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8m4(mask, op1, op2, vl) __riscv_vmerge_vxm_i8m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i8m8(mask, op1, op2, vl) __riscv_vmerge_vvm_i8m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i8m8(mask, op1, op2, vl) __riscv_vmerge_vxm_i8m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16mf4(mask, op1, op2, vl) __riscv_vmerge_vvm_i16mf4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16mf4(mask, op1, op2, vl) __riscv_vmerge_vxm_i16mf4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_i16mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_i16mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16m1(mask, op1, op2, vl) __riscv_vmerge_vvm_i16m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16m1(mask, op1, op2, vl) __riscv_vmerge_vxm_i16m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16m2(mask, op1, op2, vl) __riscv_vmerge_vvm_i16m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16m2(mask, op1, op2, vl) __riscv_vmerge_vxm_i16m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16m4(mask, op1, op2, vl) __riscv_vmerge_vvm_i16m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16m4(mask, op1, op2, vl) __riscv_vmerge_vxm_i16m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i16m8(mask, op1, op2, vl) __riscv_vmerge_vvm_i16m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i16m8(mask, op1, op2, vl) __riscv_vmerge_vxm_i16m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i32mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_i32mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i32mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_i32mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i32m1(mask, op1, op2, vl) __riscv_vmerge_vvm_i32m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i32m1(mask, op1, op2, vl) __riscv_vmerge_vxm_i32m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i32m2(mask, op1, op2, vl) __riscv_vmerge_vvm_i32m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i32m2(mask, op1, op2, vl) __riscv_vmerge_vxm_i32m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i32m4(mask, op1, op2, vl) __riscv_vmerge_vvm_i32m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i32m4(mask, op1, op2, vl) __riscv_vmerge_vxm_i32m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i32m8(mask, op1, op2, vl) __riscv_vmerge_vvm_i32m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i32m8(mask, op1, op2, vl) __riscv_vmerge_vxm_i32m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i64m1(mask, op1, op2, vl) __riscv_vmerge_vvm_i64m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i64m1(mask, op1, op2, vl) __riscv_vmerge_vxm_i64m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i64m2(mask, op1, op2, vl) __riscv_vmerge_vvm_i64m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i64m2(mask, op1, op2, vl) __riscv_vmerge_vxm_i64m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i64m4(mask, op1, op2, vl) __riscv_vmerge_vvm_i64m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i64m4(mask, op1, op2, vl) __riscv_vmerge_vxm_i64m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_i64m8(mask, op1, op2, vl) __riscv_vmerge_vvm_i64m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_i64m8(mask, op1, op2, vl) __riscv_vmerge_vxm_i64m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8mf8(mask, op1, op2, vl) __riscv_vmerge_vvm_u8mf8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8mf8(mask, op1, op2, vl) __riscv_vmerge_vxm_u8mf8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8mf4(mask, op1, op2, vl) __riscv_vmerge_vvm_u8mf4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8mf4(mask, op1, op2, vl) __riscv_vmerge_vxm_u8mf4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_u8mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_u8mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8m1(mask, op1, op2, vl) __riscv_vmerge_vvm_u8m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8m1(mask, op1, op2, vl) __riscv_vmerge_vxm_u8m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8m2(mask, op1, op2, vl) __riscv_vmerge_vvm_u8m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8m2(mask, op1, op2, vl) __riscv_vmerge_vxm_u8m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8m4(mask, op1, op2, vl) __riscv_vmerge_vvm_u8m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8m4(mask, op1, op2, vl) __riscv_vmerge_vxm_u8m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u8m8(mask, op1, op2, vl) __riscv_vmerge_vvm_u8m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u8m8(mask, op1, op2, vl) __riscv_vmerge_vxm_u8m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16mf4(mask, op1, op2, vl) __riscv_vmerge_vvm_u16mf4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16mf4(mask, op1, op2, vl) __riscv_vmerge_vxm_u16mf4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_u16mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_u16mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16m1(mask, op1, op2, vl) __riscv_vmerge_vvm_u16m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16m1(mask, op1, op2, vl) __riscv_vmerge_vxm_u16m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16m2(mask, op1, op2, vl) __riscv_vmerge_vvm_u16m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16m2(mask, op1, op2, vl) __riscv_vmerge_vxm_u16m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16m4(mask, op1, op2, vl) __riscv_vmerge_vvm_u16m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16m4(mask, op1, op2, vl) __riscv_vmerge_vxm_u16m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u16m8(mask, op1, op2, vl) __riscv_vmerge_vvm_u16m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u16m8(mask, op1, op2, vl) __riscv_vmerge_vxm_u16m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u32mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_u32mf2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u32mf2(mask, op1, op2, vl) __riscv_vmerge_vxm_u32mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u32m1(mask, op1, op2, vl) __riscv_vmerge_vvm_u32m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u32m1(mask, op1, op2, vl) __riscv_vmerge_vxm_u32m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u32m2(mask, op1, op2, vl) __riscv_vmerge_vvm_u32m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u32m2(mask, op1, op2, vl) __riscv_vmerge_vxm_u32m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u32m4(mask, op1, op2, vl) __riscv_vmerge_vvm_u32m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u32m4(mask, op1, op2, vl) __riscv_vmerge_vxm_u32m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u32m8(mask, op1, op2, vl) __riscv_vmerge_vvm_u32m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u32m8(mask, op1, op2, vl) __riscv_vmerge_vxm_u32m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u64m1(mask, op1, op2, vl) __riscv_vmerge_vvm_u64m1((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u64m1(mask, op1, op2, vl) __riscv_vmerge_vxm_u64m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u64m2(mask, op1, op2, vl) __riscv_vmerge_vvm_u64m2((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u64m2(mask, op1, op2, vl) __riscv_vmerge_vxm_u64m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u64m4(mask, op1, op2, vl) __riscv_vmerge_vvm_u64m4((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u64m4(mask, op1, op2, vl) __riscv_vmerge_vxm_u64m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_u64m8(mask, op1, op2, vl) __riscv_vmerge_vvm_u64m8((op1), (op2), (mask), (vl)) +#define vmerge_vxm_u64m8(mask, op1, op2, vl) __riscv_vmerge_vxm_u64m8((op1), (op2), (mask), (vl)) +#define vmv_v_v_i8mf8(...) __riscv_vmv_v_v_i8mf8(__VA_ARGS__) +#define vmv_v_x_i8mf8(...) __riscv_vmv_v_x_i8mf8(__VA_ARGS__) +#define vmv_v_v_i8mf4(...) __riscv_vmv_v_v_i8mf4(__VA_ARGS__) +#define vmv_v_x_i8mf4(...) __riscv_vmv_v_x_i8mf4(__VA_ARGS__) +#define vmv_v_v_i8mf2(...) __riscv_vmv_v_v_i8mf2(__VA_ARGS__) +#define vmv_v_x_i8mf2(...) __riscv_vmv_v_x_i8mf2(__VA_ARGS__) +#define vmv_v_v_i8m1(...) __riscv_vmv_v_v_i8m1(__VA_ARGS__) +#define vmv_v_x_i8m1(...) __riscv_vmv_v_x_i8m1(__VA_ARGS__) +#define vmv_v_v_i8m2(...) __riscv_vmv_v_v_i8m2(__VA_ARGS__) +#define vmv_v_x_i8m2(...) __riscv_vmv_v_x_i8m2(__VA_ARGS__) +#define vmv_v_v_i8m4(...) __riscv_vmv_v_v_i8m4(__VA_ARGS__) +#define vmv_v_x_i8m4(...) __riscv_vmv_v_x_i8m4(__VA_ARGS__) +#define vmv_v_v_i8m8(...) __riscv_vmv_v_v_i8m8(__VA_ARGS__) +#define vmv_v_x_i8m8(...) __riscv_vmv_v_x_i8m8(__VA_ARGS__) +#define vmv_v_v_i16mf4(...) __riscv_vmv_v_v_i16mf4(__VA_ARGS__) +#define vmv_v_x_i16mf4(...) __riscv_vmv_v_x_i16mf4(__VA_ARGS__) +#define vmv_v_v_i16mf2(...) __riscv_vmv_v_v_i16mf2(__VA_ARGS__) +#define vmv_v_x_i16mf2(...) __riscv_vmv_v_x_i16mf2(__VA_ARGS__) +#define vmv_v_v_i16m1(...) __riscv_vmv_v_v_i16m1(__VA_ARGS__) +#define vmv_v_x_i16m1(...) __riscv_vmv_v_x_i16m1(__VA_ARGS__) +#define vmv_v_v_i16m2(...) __riscv_vmv_v_v_i16m2(__VA_ARGS__) +#define vmv_v_x_i16m2(...) __riscv_vmv_v_x_i16m2(__VA_ARGS__) +#define vmv_v_v_i16m4(...) __riscv_vmv_v_v_i16m4(__VA_ARGS__) +#define vmv_v_x_i16m4(...) __riscv_vmv_v_x_i16m4(__VA_ARGS__) +#define vmv_v_v_i16m8(...) __riscv_vmv_v_v_i16m8(__VA_ARGS__) +#define vmv_v_x_i16m8(...) __riscv_vmv_v_x_i16m8(__VA_ARGS__) +#define vmv_v_v_i32mf2(...) __riscv_vmv_v_v_i32mf2(__VA_ARGS__) +#define vmv_v_x_i32mf2(...) __riscv_vmv_v_x_i32mf2(__VA_ARGS__) +#define vmv_v_v_i32m1(...) __riscv_vmv_v_v_i32m1(__VA_ARGS__) +#define vmv_v_x_i32m1(...) __riscv_vmv_v_x_i32m1(__VA_ARGS__) +#define vmv_v_v_i32m2(...) __riscv_vmv_v_v_i32m2(__VA_ARGS__) +#define vmv_v_x_i32m2(...) __riscv_vmv_v_x_i32m2(__VA_ARGS__) +#define vmv_v_v_i32m4(...) __riscv_vmv_v_v_i32m4(__VA_ARGS__) +#define vmv_v_x_i32m4(...) __riscv_vmv_v_x_i32m4(__VA_ARGS__) +#define vmv_v_v_i32m8(...) __riscv_vmv_v_v_i32m8(__VA_ARGS__) +#define vmv_v_x_i32m8(...) __riscv_vmv_v_x_i32m8(__VA_ARGS__) +#define vmv_v_v_i64m1(...) __riscv_vmv_v_v_i64m1(__VA_ARGS__) +#define vmv_v_x_i64m1(...) __riscv_vmv_v_x_i64m1(__VA_ARGS__) +#define vmv_v_v_i64m2(...) __riscv_vmv_v_v_i64m2(__VA_ARGS__) +#define vmv_v_x_i64m2(...) __riscv_vmv_v_x_i64m2(__VA_ARGS__) +#define vmv_v_v_i64m4(...) __riscv_vmv_v_v_i64m4(__VA_ARGS__) +#define vmv_v_x_i64m4(...) __riscv_vmv_v_x_i64m4(__VA_ARGS__) +#define vmv_v_v_i64m8(...) __riscv_vmv_v_v_i64m8(__VA_ARGS__) +#define vmv_v_x_i64m8(...) __riscv_vmv_v_x_i64m8(__VA_ARGS__) +#define vmv_v_v_u8mf8(...) __riscv_vmv_v_v_u8mf8(__VA_ARGS__) +#define vmv_v_x_u8mf8(...) __riscv_vmv_v_x_u8mf8(__VA_ARGS__) +#define vmv_v_v_u8mf4(...) __riscv_vmv_v_v_u8mf4(__VA_ARGS__) +#define vmv_v_x_u8mf4(...) __riscv_vmv_v_x_u8mf4(__VA_ARGS__) +#define vmv_v_v_u8mf2(...) __riscv_vmv_v_v_u8mf2(__VA_ARGS__) +#define vmv_v_x_u8mf2(...) __riscv_vmv_v_x_u8mf2(__VA_ARGS__) +#define vmv_v_v_u8m1(...) __riscv_vmv_v_v_u8m1(__VA_ARGS__) +#define vmv_v_x_u8m1(...) __riscv_vmv_v_x_u8m1(__VA_ARGS__) +#define vmv_v_v_u8m2(...) __riscv_vmv_v_v_u8m2(__VA_ARGS__) +#define vmv_v_x_u8m2(...) __riscv_vmv_v_x_u8m2(__VA_ARGS__) +#define vmv_v_v_u8m4(...) __riscv_vmv_v_v_u8m4(__VA_ARGS__) +#define vmv_v_x_u8m4(...) __riscv_vmv_v_x_u8m4(__VA_ARGS__) +#define vmv_v_v_u8m8(...) __riscv_vmv_v_v_u8m8(__VA_ARGS__) +#define vmv_v_x_u8m8(...) __riscv_vmv_v_x_u8m8(__VA_ARGS__) +#define vmv_v_v_u16mf4(...) __riscv_vmv_v_v_u16mf4(__VA_ARGS__) +#define vmv_v_x_u16mf4(...) __riscv_vmv_v_x_u16mf4(__VA_ARGS__) +#define vmv_v_v_u16mf2(...) __riscv_vmv_v_v_u16mf2(__VA_ARGS__) +#define vmv_v_x_u16mf2(...) __riscv_vmv_v_x_u16mf2(__VA_ARGS__) +#define vmv_v_v_u16m1(...) __riscv_vmv_v_v_u16m1(__VA_ARGS__) +#define vmv_v_x_u16m1(...) __riscv_vmv_v_x_u16m1(__VA_ARGS__) +#define vmv_v_v_u16m2(...) __riscv_vmv_v_v_u16m2(__VA_ARGS__) +#define vmv_v_x_u16m2(...) __riscv_vmv_v_x_u16m2(__VA_ARGS__) +#define vmv_v_v_u16m4(...) __riscv_vmv_v_v_u16m4(__VA_ARGS__) +#define vmv_v_x_u16m4(...) __riscv_vmv_v_x_u16m4(__VA_ARGS__) +#define vmv_v_v_u16m8(...) __riscv_vmv_v_v_u16m8(__VA_ARGS__) +#define vmv_v_x_u16m8(...) __riscv_vmv_v_x_u16m8(__VA_ARGS__) +#define vmv_v_v_u32mf2(...) __riscv_vmv_v_v_u32mf2(__VA_ARGS__) +#define vmv_v_x_u32mf2(...) __riscv_vmv_v_x_u32mf2(__VA_ARGS__) +#define vmv_v_v_u32m1(...) __riscv_vmv_v_v_u32m1(__VA_ARGS__) +#define vmv_v_x_u32m1(...) __riscv_vmv_v_x_u32m1(__VA_ARGS__) +#define vmv_v_v_u32m2(...) __riscv_vmv_v_v_u32m2(__VA_ARGS__) +#define vmv_v_x_u32m2(...) __riscv_vmv_v_x_u32m2(__VA_ARGS__) +#define vmv_v_v_u32m4(...) __riscv_vmv_v_v_u32m4(__VA_ARGS__) +#define vmv_v_x_u32m4(...) __riscv_vmv_v_x_u32m4(__VA_ARGS__) +#define vmv_v_v_u32m8(...) __riscv_vmv_v_v_u32m8(__VA_ARGS__) +#define vmv_v_x_u32m8(...) __riscv_vmv_v_x_u32m8(__VA_ARGS__) +#define vmv_v_v_u64m1(...) __riscv_vmv_v_v_u64m1(__VA_ARGS__) +#define vmv_v_x_u64m1(...) __riscv_vmv_v_x_u64m1(__VA_ARGS__) +#define vmv_v_v_u64m2(...) __riscv_vmv_v_v_u64m2(__VA_ARGS__) +#define vmv_v_x_u64m2(...) __riscv_vmv_v_x_u64m2(__VA_ARGS__) +#define vmv_v_v_u64m4(...) __riscv_vmv_v_v_u64m4(__VA_ARGS__) +#define vmv_v_x_u64m4(...) __riscv_vmv_v_x_u64m4(__VA_ARGS__) +#define vmv_v_v_u64m8(...) __riscv_vmv_v_v_u64m8(__VA_ARGS__) +#define vmv_v_x_u64m8(...) __riscv_vmv_v_x_u64m8(__VA_ARGS__) +#define vsadd_vv_i8mf8(...) __riscv_vsadd_vv_i8mf8(__VA_ARGS__) +#define vsadd_vx_i8mf8(...) __riscv_vsadd_vx_i8mf8(__VA_ARGS__) +#define vsadd_vv_i8mf4(...) __riscv_vsadd_vv_i8mf4(__VA_ARGS__) +#define vsadd_vx_i8mf4(...) __riscv_vsadd_vx_i8mf4(__VA_ARGS__) +#define vsadd_vv_i8mf2(...) __riscv_vsadd_vv_i8mf2(__VA_ARGS__) +#define vsadd_vx_i8mf2(...) __riscv_vsadd_vx_i8mf2(__VA_ARGS__) +#define vsadd_vv_i8m1(...) __riscv_vsadd_vv_i8m1(__VA_ARGS__) +#define vsadd_vx_i8m1(...) __riscv_vsadd_vx_i8m1(__VA_ARGS__) +#define vsadd_vv_i8m2(...) __riscv_vsadd_vv_i8m2(__VA_ARGS__) +#define vsadd_vx_i8m2(...) __riscv_vsadd_vx_i8m2(__VA_ARGS__) +#define vsadd_vv_i8m4(...) __riscv_vsadd_vv_i8m4(__VA_ARGS__) +#define vsadd_vx_i8m4(...) __riscv_vsadd_vx_i8m4(__VA_ARGS__) +#define vsadd_vv_i8m8(...) __riscv_vsadd_vv_i8m8(__VA_ARGS__) +#define vsadd_vx_i8m8(...) __riscv_vsadd_vx_i8m8(__VA_ARGS__) +#define vsadd_vv_i16mf4(...) __riscv_vsadd_vv_i16mf4(__VA_ARGS__) +#define vsadd_vx_i16mf4(...) __riscv_vsadd_vx_i16mf4(__VA_ARGS__) +#define vsadd_vv_i16mf2(...) __riscv_vsadd_vv_i16mf2(__VA_ARGS__) +#define vsadd_vx_i16mf2(...) __riscv_vsadd_vx_i16mf2(__VA_ARGS__) +#define vsadd_vv_i16m1(...) __riscv_vsadd_vv_i16m1(__VA_ARGS__) +#define vsadd_vx_i16m1(...) __riscv_vsadd_vx_i16m1(__VA_ARGS__) +#define vsadd_vv_i16m2(...) __riscv_vsadd_vv_i16m2(__VA_ARGS__) +#define vsadd_vx_i16m2(...) __riscv_vsadd_vx_i16m2(__VA_ARGS__) +#define vsadd_vv_i16m4(...) __riscv_vsadd_vv_i16m4(__VA_ARGS__) +#define vsadd_vx_i16m4(...) __riscv_vsadd_vx_i16m4(__VA_ARGS__) +#define vsadd_vv_i16m8(...) __riscv_vsadd_vv_i16m8(__VA_ARGS__) +#define vsadd_vx_i16m8(...) __riscv_vsadd_vx_i16m8(__VA_ARGS__) +#define vsadd_vv_i32mf2(...) __riscv_vsadd_vv_i32mf2(__VA_ARGS__) +#define vsadd_vx_i32mf2(...) __riscv_vsadd_vx_i32mf2(__VA_ARGS__) +#define vsadd_vv_i32m1(...) __riscv_vsadd_vv_i32m1(__VA_ARGS__) +#define vsadd_vx_i32m1(...) __riscv_vsadd_vx_i32m1(__VA_ARGS__) +#define vsadd_vv_i32m2(...) __riscv_vsadd_vv_i32m2(__VA_ARGS__) +#define vsadd_vx_i32m2(...) __riscv_vsadd_vx_i32m2(__VA_ARGS__) +#define vsadd_vv_i32m4(...) __riscv_vsadd_vv_i32m4(__VA_ARGS__) +#define vsadd_vx_i32m4(...) __riscv_vsadd_vx_i32m4(__VA_ARGS__) +#define vsadd_vv_i32m8(...) __riscv_vsadd_vv_i32m8(__VA_ARGS__) +#define vsadd_vx_i32m8(...) __riscv_vsadd_vx_i32m8(__VA_ARGS__) +#define vsadd_vv_i64m1(...) __riscv_vsadd_vv_i64m1(__VA_ARGS__) +#define vsadd_vx_i64m1(...) __riscv_vsadd_vx_i64m1(__VA_ARGS__) +#define vsadd_vv_i64m2(...) __riscv_vsadd_vv_i64m2(__VA_ARGS__) +#define vsadd_vx_i64m2(...) __riscv_vsadd_vx_i64m2(__VA_ARGS__) +#define vsadd_vv_i64m4(...) __riscv_vsadd_vv_i64m4(__VA_ARGS__) +#define vsadd_vx_i64m4(...) __riscv_vsadd_vx_i64m4(__VA_ARGS__) +#define vsadd_vv_i64m8(...) __riscv_vsadd_vv_i64m8(__VA_ARGS__) +#define vsadd_vx_i64m8(...) __riscv_vsadd_vx_i64m8(__VA_ARGS__) +#define vssub_vv_i8mf8(...) __riscv_vssub_vv_i8mf8(__VA_ARGS__) +#define vssub_vx_i8mf8(...) __riscv_vssub_vx_i8mf8(__VA_ARGS__) +#define vssub_vv_i8mf4(...) __riscv_vssub_vv_i8mf4(__VA_ARGS__) +#define vssub_vx_i8mf4(...) __riscv_vssub_vx_i8mf4(__VA_ARGS__) +#define vssub_vv_i8mf2(...) __riscv_vssub_vv_i8mf2(__VA_ARGS__) +#define vssub_vx_i8mf2(...) __riscv_vssub_vx_i8mf2(__VA_ARGS__) +#define vssub_vv_i8m1(...) __riscv_vssub_vv_i8m1(__VA_ARGS__) +#define vssub_vx_i8m1(...) __riscv_vssub_vx_i8m1(__VA_ARGS__) +#define vssub_vv_i8m2(...) __riscv_vssub_vv_i8m2(__VA_ARGS__) +#define vssub_vx_i8m2(...) __riscv_vssub_vx_i8m2(__VA_ARGS__) +#define vssub_vv_i8m4(...) __riscv_vssub_vv_i8m4(__VA_ARGS__) +#define vssub_vx_i8m4(...) __riscv_vssub_vx_i8m4(__VA_ARGS__) +#define vssub_vv_i8m8(...) __riscv_vssub_vv_i8m8(__VA_ARGS__) +#define vssub_vx_i8m8(...) __riscv_vssub_vx_i8m8(__VA_ARGS__) +#define vssub_vv_i16mf4(...) __riscv_vssub_vv_i16mf4(__VA_ARGS__) +#define vssub_vx_i16mf4(...) __riscv_vssub_vx_i16mf4(__VA_ARGS__) +#define vssub_vv_i16mf2(...) __riscv_vssub_vv_i16mf2(__VA_ARGS__) +#define vssub_vx_i16mf2(...) __riscv_vssub_vx_i16mf2(__VA_ARGS__) +#define vssub_vv_i16m1(...) __riscv_vssub_vv_i16m1(__VA_ARGS__) +#define vssub_vx_i16m1(...) __riscv_vssub_vx_i16m1(__VA_ARGS__) +#define vssub_vv_i16m2(...) __riscv_vssub_vv_i16m2(__VA_ARGS__) +#define vssub_vx_i16m2(...) __riscv_vssub_vx_i16m2(__VA_ARGS__) +#define vssub_vv_i16m4(...) __riscv_vssub_vv_i16m4(__VA_ARGS__) +#define vssub_vx_i16m4(...) __riscv_vssub_vx_i16m4(__VA_ARGS__) +#define vssub_vv_i16m8(...) __riscv_vssub_vv_i16m8(__VA_ARGS__) +#define vssub_vx_i16m8(...) __riscv_vssub_vx_i16m8(__VA_ARGS__) +#define vssub_vv_i32mf2(...) __riscv_vssub_vv_i32mf2(__VA_ARGS__) +#define vssub_vx_i32mf2(...) __riscv_vssub_vx_i32mf2(__VA_ARGS__) +#define vssub_vv_i32m1(...) __riscv_vssub_vv_i32m1(__VA_ARGS__) +#define vssub_vx_i32m1(...) __riscv_vssub_vx_i32m1(__VA_ARGS__) +#define vssub_vv_i32m2(...) __riscv_vssub_vv_i32m2(__VA_ARGS__) +#define vssub_vx_i32m2(...) __riscv_vssub_vx_i32m2(__VA_ARGS__) +#define vssub_vv_i32m4(...) __riscv_vssub_vv_i32m4(__VA_ARGS__) +#define vssub_vx_i32m4(...) __riscv_vssub_vx_i32m4(__VA_ARGS__) +#define vssub_vv_i32m8(...) __riscv_vssub_vv_i32m8(__VA_ARGS__) +#define vssub_vx_i32m8(...) __riscv_vssub_vx_i32m8(__VA_ARGS__) +#define vssub_vv_i64m1(...) __riscv_vssub_vv_i64m1(__VA_ARGS__) +#define vssub_vx_i64m1(...) __riscv_vssub_vx_i64m1(__VA_ARGS__) +#define vssub_vv_i64m2(...) __riscv_vssub_vv_i64m2(__VA_ARGS__) +#define vssub_vx_i64m2(...) __riscv_vssub_vx_i64m2(__VA_ARGS__) +#define vssub_vv_i64m4(...) __riscv_vssub_vv_i64m4(__VA_ARGS__) +#define vssub_vx_i64m4(...) __riscv_vssub_vx_i64m4(__VA_ARGS__) +#define vssub_vv_i64m8(...) __riscv_vssub_vv_i64m8(__VA_ARGS__) +#define vssub_vx_i64m8(...) __riscv_vssub_vx_i64m8(__VA_ARGS__) +#define vsaddu_vv_u8mf8(...) __riscv_vsaddu_vv_u8mf8(__VA_ARGS__) +#define vsaddu_vx_u8mf8(...) __riscv_vsaddu_vx_u8mf8(__VA_ARGS__) +#define vsaddu_vv_u8mf4(...) __riscv_vsaddu_vv_u8mf4(__VA_ARGS__) +#define vsaddu_vx_u8mf4(...) __riscv_vsaddu_vx_u8mf4(__VA_ARGS__) +#define vsaddu_vv_u8mf2(...) __riscv_vsaddu_vv_u8mf2(__VA_ARGS__) +#define vsaddu_vx_u8mf2(...) __riscv_vsaddu_vx_u8mf2(__VA_ARGS__) +#define vsaddu_vv_u8m1(...) __riscv_vsaddu_vv_u8m1(__VA_ARGS__) +#define vsaddu_vx_u8m1(...) __riscv_vsaddu_vx_u8m1(__VA_ARGS__) +#define vsaddu_vv_u8m2(...) __riscv_vsaddu_vv_u8m2(__VA_ARGS__) +#define vsaddu_vx_u8m2(...) __riscv_vsaddu_vx_u8m2(__VA_ARGS__) +#define vsaddu_vv_u8m4(...) __riscv_vsaddu_vv_u8m4(__VA_ARGS__) +#define vsaddu_vx_u8m4(...) __riscv_vsaddu_vx_u8m4(__VA_ARGS__) +#define vsaddu_vv_u8m8(...) __riscv_vsaddu_vv_u8m8(__VA_ARGS__) +#define vsaddu_vx_u8m8(...) __riscv_vsaddu_vx_u8m8(__VA_ARGS__) +#define vsaddu_vv_u16mf4(...) __riscv_vsaddu_vv_u16mf4(__VA_ARGS__) +#define vsaddu_vx_u16mf4(...) __riscv_vsaddu_vx_u16mf4(__VA_ARGS__) +#define vsaddu_vv_u16mf2(...) __riscv_vsaddu_vv_u16mf2(__VA_ARGS__) +#define vsaddu_vx_u16mf2(...) __riscv_vsaddu_vx_u16mf2(__VA_ARGS__) +#define vsaddu_vv_u16m1(...) __riscv_vsaddu_vv_u16m1(__VA_ARGS__) +#define vsaddu_vx_u16m1(...) __riscv_vsaddu_vx_u16m1(__VA_ARGS__) +#define vsaddu_vv_u16m2(...) __riscv_vsaddu_vv_u16m2(__VA_ARGS__) +#define vsaddu_vx_u16m2(...) __riscv_vsaddu_vx_u16m2(__VA_ARGS__) +#define vsaddu_vv_u16m4(...) __riscv_vsaddu_vv_u16m4(__VA_ARGS__) +#define vsaddu_vx_u16m4(...) __riscv_vsaddu_vx_u16m4(__VA_ARGS__) +#define vsaddu_vv_u16m8(...) __riscv_vsaddu_vv_u16m8(__VA_ARGS__) +#define vsaddu_vx_u16m8(...) __riscv_vsaddu_vx_u16m8(__VA_ARGS__) +#define vsaddu_vv_u32mf2(...) __riscv_vsaddu_vv_u32mf2(__VA_ARGS__) +#define vsaddu_vx_u32mf2(...) __riscv_vsaddu_vx_u32mf2(__VA_ARGS__) +#define vsaddu_vv_u32m1(...) __riscv_vsaddu_vv_u32m1(__VA_ARGS__) +#define vsaddu_vx_u32m1(...) __riscv_vsaddu_vx_u32m1(__VA_ARGS__) +#define vsaddu_vv_u32m2(...) __riscv_vsaddu_vv_u32m2(__VA_ARGS__) +#define vsaddu_vx_u32m2(...) __riscv_vsaddu_vx_u32m2(__VA_ARGS__) +#define vsaddu_vv_u32m4(...) __riscv_vsaddu_vv_u32m4(__VA_ARGS__) +#define vsaddu_vx_u32m4(...) __riscv_vsaddu_vx_u32m4(__VA_ARGS__) +#define vsaddu_vv_u32m8(...) __riscv_vsaddu_vv_u32m8(__VA_ARGS__) +#define vsaddu_vx_u32m8(...) __riscv_vsaddu_vx_u32m8(__VA_ARGS__) +#define vsaddu_vv_u64m1(...) __riscv_vsaddu_vv_u64m1(__VA_ARGS__) +#define vsaddu_vx_u64m1(...) __riscv_vsaddu_vx_u64m1(__VA_ARGS__) +#define vsaddu_vv_u64m2(...) __riscv_vsaddu_vv_u64m2(__VA_ARGS__) +#define vsaddu_vx_u64m2(...) __riscv_vsaddu_vx_u64m2(__VA_ARGS__) +#define vsaddu_vv_u64m4(...) __riscv_vsaddu_vv_u64m4(__VA_ARGS__) +#define vsaddu_vx_u64m4(...) __riscv_vsaddu_vx_u64m4(__VA_ARGS__) +#define vsaddu_vv_u64m8(...) __riscv_vsaddu_vv_u64m8(__VA_ARGS__) +#define vsaddu_vx_u64m8(...) __riscv_vsaddu_vx_u64m8(__VA_ARGS__) +#define vssubu_vv_u8mf8(...) __riscv_vssubu_vv_u8mf8(__VA_ARGS__) +#define vssubu_vx_u8mf8(...) __riscv_vssubu_vx_u8mf8(__VA_ARGS__) +#define vssubu_vv_u8mf4(...) __riscv_vssubu_vv_u8mf4(__VA_ARGS__) +#define vssubu_vx_u8mf4(...) __riscv_vssubu_vx_u8mf4(__VA_ARGS__) +#define vssubu_vv_u8mf2(...) __riscv_vssubu_vv_u8mf2(__VA_ARGS__) +#define vssubu_vx_u8mf2(...) __riscv_vssubu_vx_u8mf2(__VA_ARGS__) +#define vssubu_vv_u8m1(...) __riscv_vssubu_vv_u8m1(__VA_ARGS__) +#define vssubu_vx_u8m1(...) __riscv_vssubu_vx_u8m1(__VA_ARGS__) +#define vssubu_vv_u8m2(...) __riscv_vssubu_vv_u8m2(__VA_ARGS__) +#define vssubu_vx_u8m2(...) __riscv_vssubu_vx_u8m2(__VA_ARGS__) +#define vssubu_vv_u8m4(...) __riscv_vssubu_vv_u8m4(__VA_ARGS__) +#define vssubu_vx_u8m4(...) __riscv_vssubu_vx_u8m4(__VA_ARGS__) +#define vssubu_vv_u8m8(...) __riscv_vssubu_vv_u8m8(__VA_ARGS__) +#define vssubu_vx_u8m8(...) __riscv_vssubu_vx_u8m8(__VA_ARGS__) +#define vssubu_vv_u16mf4(...) __riscv_vssubu_vv_u16mf4(__VA_ARGS__) +#define vssubu_vx_u16mf4(...) __riscv_vssubu_vx_u16mf4(__VA_ARGS__) +#define vssubu_vv_u16mf2(...) __riscv_vssubu_vv_u16mf2(__VA_ARGS__) +#define vssubu_vx_u16mf2(...) __riscv_vssubu_vx_u16mf2(__VA_ARGS__) +#define vssubu_vv_u16m1(...) __riscv_vssubu_vv_u16m1(__VA_ARGS__) +#define vssubu_vx_u16m1(...) __riscv_vssubu_vx_u16m1(__VA_ARGS__) +#define vssubu_vv_u16m2(...) __riscv_vssubu_vv_u16m2(__VA_ARGS__) +#define vssubu_vx_u16m2(...) __riscv_vssubu_vx_u16m2(__VA_ARGS__) +#define vssubu_vv_u16m4(...) __riscv_vssubu_vv_u16m4(__VA_ARGS__) +#define vssubu_vx_u16m4(...) __riscv_vssubu_vx_u16m4(__VA_ARGS__) +#define vssubu_vv_u16m8(...) __riscv_vssubu_vv_u16m8(__VA_ARGS__) +#define vssubu_vx_u16m8(...) __riscv_vssubu_vx_u16m8(__VA_ARGS__) +#define vssubu_vv_u32mf2(...) __riscv_vssubu_vv_u32mf2(__VA_ARGS__) +#define vssubu_vx_u32mf2(...) __riscv_vssubu_vx_u32mf2(__VA_ARGS__) +#define vssubu_vv_u32m1(...) __riscv_vssubu_vv_u32m1(__VA_ARGS__) +#define vssubu_vx_u32m1(...) __riscv_vssubu_vx_u32m1(__VA_ARGS__) +#define vssubu_vv_u32m2(...) __riscv_vssubu_vv_u32m2(__VA_ARGS__) +#define vssubu_vx_u32m2(...) __riscv_vssubu_vx_u32m2(__VA_ARGS__) +#define vssubu_vv_u32m4(...) __riscv_vssubu_vv_u32m4(__VA_ARGS__) +#define vssubu_vx_u32m4(...) __riscv_vssubu_vx_u32m4(__VA_ARGS__) +#define vssubu_vv_u32m8(...) __riscv_vssubu_vv_u32m8(__VA_ARGS__) +#define vssubu_vx_u32m8(...) __riscv_vssubu_vx_u32m8(__VA_ARGS__) +#define vssubu_vv_u64m1(...) __riscv_vssubu_vv_u64m1(__VA_ARGS__) +#define vssubu_vx_u64m1(...) __riscv_vssubu_vx_u64m1(__VA_ARGS__) +#define vssubu_vv_u64m2(...) __riscv_vssubu_vv_u64m2(__VA_ARGS__) +#define vssubu_vx_u64m2(...) __riscv_vssubu_vx_u64m2(__VA_ARGS__) +#define vssubu_vv_u64m4(...) __riscv_vssubu_vv_u64m4(__VA_ARGS__) +#define vssubu_vx_u64m4(...) __riscv_vssubu_vx_u64m4(__VA_ARGS__) +#define vssubu_vv_u64m8(...) __riscv_vssubu_vv_u64m8(__VA_ARGS__) +#define vssubu_vx_u64m8(...) __riscv_vssubu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vsadd_vv_i8mf8_m(...) __riscv_vsadd_vv_i8mf8_tumu(__VA_ARGS__) +#define vsadd_vx_i8mf8_m(...) __riscv_vsadd_vx_i8mf8_tumu(__VA_ARGS__) +#define vsadd_vv_i8mf4_m(...) __riscv_vsadd_vv_i8mf4_tumu(__VA_ARGS__) +#define vsadd_vx_i8mf4_m(...) __riscv_vsadd_vx_i8mf4_tumu(__VA_ARGS__) +#define vsadd_vv_i8mf2_m(...) __riscv_vsadd_vv_i8mf2_tumu(__VA_ARGS__) +#define vsadd_vx_i8mf2_m(...) __riscv_vsadd_vx_i8mf2_tumu(__VA_ARGS__) +#define vsadd_vv_i8m1_m(...) __riscv_vsadd_vv_i8m1_tumu(__VA_ARGS__) +#define vsadd_vx_i8m1_m(...) __riscv_vsadd_vx_i8m1_tumu(__VA_ARGS__) +#define vsadd_vv_i8m2_m(...) __riscv_vsadd_vv_i8m2_tumu(__VA_ARGS__) +#define vsadd_vx_i8m2_m(...) __riscv_vsadd_vx_i8m2_tumu(__VA_ARGS__) +#define vsadd_vv_i8m4_m(...) __riscv_vsadd_vv_i8m4_tumu(__VA_ARGS__) +#define vsadd_vx_i8m4_m(...) __riscv_vsadd_vx_i8m4_tumu(__VA_ARGS__) +#define vsadd_vv_i8m8_m(...) __riscv_vsadd_vv_i8m8_tumu(__VA_ARGS__) +#define vsadd_vx_i8m8_m(...) __riscv_vsadd_vx_i8m8_tumu(__VA_ARGS__) +#define vsadd_vv_i16mf4_m(...) __riscv_vsadd_vv_i16mf4_tumu(__VA_ARGS__) +#define vsadd_vx_i16mf4_m(...) __riscv_vsadd_vx_i16mf4_tumu(__VA_ARGS__) +#define vsadd_vv_i16mf2_m(...) __riscv_vsadd_vv_i16mf2_tumu(__VA_ARGS__) +#define vsadd_vx_i16mf2_m(...) __riscv_vsadd_vx_i16mf2_tumu(__VA_ARGS__) +#define vsadd_vv_i16m1_m(...) __riscv_vsadd_vv_i16m1_tumu(__VA_ARGS__) +#define vsadd_vx_i16m1_m(...) __riscv_vsadd_vx_i16m1_tumu(__VA_ARGS__) +#define vsadd_vv_i16m2_m(...) __riscv_vsadd_vv_i16m2_tumu(__VA_ARGS__) +#define vsadd_vx_i16m2_m(...) __riscv_vsadd_vx_i16m2_tumu(__VA_ARGS__) +#define vsadd_vv_i16m4_m(...) __riscv_vsadd_vv_i16m4_tumu(__VA_ARGS__) +#define vsadd_vx_i16m4_m(...) __riscv_vsadd_vx_i16m4_tumu(__VA_ARGS__) +#define vsadd_vv_i16m8_m(...) __riscv_vsadd_vv_i16m8_tumu(__VA_ARGS__) +#define vsadd_vx_i16m8_m(...) __riscv_vsadd_vx_i16m8_tumu(__VA_ARGS__) +#define vsadd_vv_i32mf2_m(...) __riscv_vsadd_vv_i32mf2_tumu(__VA_ARGS__) +#define vsadd_vx_i32mf2_m(...) __riscv_vsadd_vx_i32mf2_tumu(__VA_ARGS__) +#define vsadd_vv_i32m1_m(...) __riscv_vsadd_vv_i32m1_tumu(__VA_ARGS__) +#define vsadd_vx_i32m1_m(...) __riscv_vsadd_vx_i32m1_tumu(__VA_ARGS__) +#define vsadd_vv_i32m2_m(...) __riscv_vsadd_vv_i32m2_tumu(__VA_ARGS__) +#define vsadd_vx_i32m2_m(...) __riscv_vsadd_vx_i32m2_tumu(__VA_ARGS__) +#define vsadd_vv_i32m4_m(...) __riscv_vsadd_vv_i32m4_tumu(__VA_ARGS__) +#define vsadd_vx_i32m4_m(...) __riscv_vsadd_vx_i32m4_tumu(__VA_ARGS__) +#define vsadd_vv_i32m8_m(...) __riscv_vsadd_vv_i32m8_tumu(__VA_ARGS__) +#define vsadd_vx_i32m8_m(...) __riscv_vsadd_vx_i32m8_tumu(__VA_ARGS__) +#define vsadd_vv_i64m1_m(...) __riscv_vsadd_vv_i64m1_tumu(__VA_ARGS__) +#define vsadd_vx_i64m1_m(...) __riscv_vsadd_vx_i64m1_tumu(__VA_ARGS__) +#define vsadd_vv_i64m2_m(...) __riscv_vsadd_vv_i64m2_tumu(__VA_ARGS__) +#define vsadd_vx_i64m2_m(...) __riscv_vsadd_vx_i64m2_tumu(__VA_ARGS__) +#define vsadd_vv_i64m4_m(...) __riscv_vsadd_vv_i64m4_tumu(__VA_ARGS__) +#define vsadd_vx_i64m4_m(...) __riscv_vsadd_vx_i64m4_tumu(__VA_ARGS__) +#define vsadd_vv_i64m8_m(...) __riscv_vsadd_vv_i64m8_tumu(__VA_ARGS__) +#define vsadd_vx_i64m8_m(...) __riscv_vsadd_vx_i64m8_tumu(__VA_ARGS__) +#define vssub_vv_i8mf8_m(...) __riscv_vssub_vv_i8mf8_tumu(__VA_ARGS__) +#define vssub_vx_i8mf8_m(...) __riscv_vssub_vx_i8mf8_tumu(__VA_ARGS__) +#define vssub_vv_i8mf4_m(...) __riscv_vssub_vv_i8mf4_tumu(__VA_ARGS__) +#define vssub_vx_i8mf4_m(...) __riscv_vssub_vx_i8mf4_tumu(__VA_ARGS__) +#define vssub_vv_i8mf2_m(...) __riscv_vssub_vv_i8mf2_tumu(__VA_ARGS__) +#define vssub_vx_i8mf2_m(...) __riscv_vssub_vx_i8mf2_tumu(__VA_ARGS__) +#define vssub_vv_i8m1_m(...) __riscv_vssub_vv_i8m1_tumu(__VA_ARGS__) +#define vssub_vx_i8m1_m(...) __riscv_vssub_vx_i8m1_tumu(__VA_ARGS__) +#define vssub_vv_i8m2_m(...) __riscv_vssub_vv_i8m2_tumu(__VA_ARGS__) +#define vssub_vx_i8m2_m(...) __riscv_vssub_vx_i8m2_tumu(__VA_ARGS__) +#define vssub_vv_i8m4_m(...) __riscv_vssub_vv_i8m4_tumu(__VA_ARGS__) +#define vssub_vx_i8m4_m(...) __riscv_vssub_vx_i8m4_tumu(__VA_ARGS__) +#define vssub_vv_i8m8_m(...) __riscv_vssub_vv_i8m8_tumu(__VA_ARGS__) +#define vssub_vx_i8m8_m(...) __riscv_vssub_vx_i8m8_tumu(__VA_ARGS__) +#define vssub_vv_i16mf4_m(...) __riscv_vssub_vv_i16mf4_tumu(__VA_ARGS__) +#define vssub_vx_i16mf4_m(...) __riscv_vssub_vx_i16mf4_tumu(__VA_ARGS__) +#define vssub_vv_i16mf2_m(...) __riscv_vssub_vv_i16mf2_tumu(__VA_ARGS__) +#define vssub_vx_i16mf2_m(...) __riscv_vssub_vx_i16mf2_tumu(__VA_ARGS__) +#define vssub_vv_i16m1_m(...) __riscv_vssub_vv_i16m1_tumu(__VA_ARGS__) +#define vssub_vx_i16m1_m(...) __riscv_vssub_vx_i16m1_tumu(__VA_ARGS__) +#define vssub_vv_i16m2_m(...) __riscv_vssub_vv_i16m2_tumu(__VA_ARGS__) +#define vssub_vx_i16m2_m(...) __riscv_vssub_vx_i16m2_tumu(__VA_ARGS__) +#define vssub_vv_i16m4_m(...) __riscv_vssub_vv_i16m4_tumu(__VA_ARGS__) +#define vssub_vx_i16m4_m(...) __riscv_vssub_vx_i16m4_tumu(__VA_ARGS__) +#define vssub_vv_i16m8_m(...) __riscv_vssub_vv_i16m8_tumu(__VA_ARGS__) +#define vssub_vx_i16m8_m(...) __riscv_vssub_vx_i16m8_tumu(__VA_ARGS__) +#define vssub_vv_i32mf2_m(...) __riscv_vssub_vv_i32mf2_tumu(__VA_ARGS__) +#define vssub_vx_i32mf2_m(...) __riscv_vssub_vx_i32mf2_tumu(__VA_ARGS__) +#define vssub_vv_i32m1_m(...) __riscv_vssub_vv_i32m1_tumu(__VA_ARGS__) +#define vssub_vx_i32m1_m(...) __riscv_vssub_vx_i32m1_tumu(__VA_ARGS__) +#define vssub_vv_i32m2_m(...) __riscv_vssub_vv_i32m2_tumu(__VA_ARGS__) +#define vssub_vx_i32m2_m(...) __riscv_vssub_vx_i32m2_tumu(__VA_ARGS__) +#define vssub_vv_i32m4_m(...) __riscv_vssub_vv_i32m4_tumu(__VA_ARGS__) +#define vssub_vx_i32m4_m(...) __riscv_vssub_vx_i32m4_tumu(__VA_ARGS__) +#define vssub_vv_i32m8_m(...) __riscv_vssub_vv_i32m8_tumu(__VA_ARGS__) +#define vssub_vx_i32m8_m(...) __riscv_vssub_vx_i32m8_tumu(__VA_ARGS__) +#define vssub_vv_i64m1_m(...) __riscv_vssub_vv_i64m1_tumu(__VA_ARGS__) +#define vssub_vx_i64m1_m(...) __riscv_vssub_vx_i64m1_tumu(__VA_ARGS__) +#define vssub_vv_i64m2_m(...) __riscv_vssub_vv_i64m2_tumu(__VA_ARGS__) +#define vssub_vx_i64m2_m(...) __riscv_vssub_vx_i64m2_tumu(__VA_ARGS__) +#define vssub_vv_i64m4_m(...) __riscv_vssub_vv_i64m4_tumu(__VA_ARGS__) +#define vssub_vx_i64m4_m(...) __riscv_vssub_vx_i64m4_tumu(__VA_ARGS__) +#define vssub_vv_i64m8_m(...) __riscv_vssub_vv_i64m8_tumu(__VA_ARGS__) +#define vssub_vx_i64m8_m(...) __riscv_vssub_vx_i64m8_tumu(__VA_ARGS__) +#define vsaddu_vv_u8mf8_m(...) __riscv_vsaddu_vv_u8mf8_tumu(__VA_ARGS__) +#define vsaddu_vx_u8mf8_m(...) __riscv_vsaddu_vx_u8mf8_tumu(__VA_ARGS__) +#define vsaddu_vv_u8mf4_m(...) __riscv_vsaddu_vv_u8mf4_tumu(__VA_ARGS__) +#define vsaddu_vx_u8mf4_m(...) __riscv_vsaddu_vx_u8mf4_tumu(__VA_ARGS__) +#define vsaddu_vv_u8mf2_m(...) __riscv_vsaddu_vv_u8mf2_tumu(__VA_ARGS__) +#define vsaddu_vx_u8mf2_m(...) __riscv_vsaddu_vx_u8mf2_tumu(__VA_ARGS__) +#define vsaddu_vv_u8m1_m(...) __riscv_vsaddu_vv_u8m1_tumu(__VA_ARGS__) +#define vsaddu_vx_u8m1_m(...) __riscv_vsaddu_vx_u8m1_tumu(__VA_ARGS__) +#define vsaddu_vv_u8m2_m(...) __riscv_vsaddu_vv_u8m2_tumu(__VA_ARGS__) +#define vsaddu_vx_u8m2_m(...) __riscv_vsaddu_vx_u8m2_tumu(__VA_ARGS__) +#define vsaddu_vv_u8m4_m(...) __riscv_vsaddu_vv_u8m4_tumu(__VA_ARGS__) +#define vsaddu_vx_u8m4_m(...) __riscv_vsaddu_vx_u8m4_tumu(__VA_ARGS__) +#define vsaddu_vv_u8m8_m(...) __riscv_vsaddu_vv_u8m8_tumu(__VA_ARGS__) +#define vsaddu_vx_u8m8_m(...) __riscv_vsaddu_vx_u8m8_tumu(__VA_ARGS__) +#define vsaddu_vv_u16mf4_m(...) __riscv_vsaddu_vv_u16mf4_tumu(__VA_ARGS__) +#define vsaddu_vx_u16mf4_m(...) __riscv_vsaddu_vx_u16mf4_tumu(__VA_ARGS__) +#define vsaddu_vv_u16mf2_m(...) __riscv_vsaddu_vv_u16mf2_tumu(__VA_ARGS__) +#define vsaddu_vx_u16mf2_m(...) __riscv_vsaddu_vx_u16mf2_tumu(__VA_ARGS__) +#define vsaddu_vv_u16m1_m(...) __riscv_vsaddu_vv_u16m1_tumu(__VA_ARGS__) +#define vsaddu_vx_u16m1_m(...) __riscv_vsaddu_vx_u16m1_tumu(__VA_ARGS__) +#define vsaddu_vv_u16m2_m(...) __riscv_vsaddu_vv_u16m2_tumu(__VA_ARGS__) +#define vsaddu_vx_u16m2_m(...) __riscv_vsaddu_vx_u16m2_tumu(__VA_ARGS__) +#define vsaddu_vv_u16m4_m(...) __riscv_vsaddu_vv_u16m4_tumu(__VA_ARGS__) +#define vsaddu_vx_u16m4_m(...) __riscv_vsaddu_vx_u16m4_tumu(__VA_ARGS__) +#define vsaddu_vv_u16m8_m(...) __riscv_vsaddu_vv_u16m8_tumu(__VA_ARGS__) +#define vsaddu_vx_u16m8_m(...) __riscv_vsaddu_vx_u16m8_tumu(__VA_ARGS__) +#define vsaddu_vv_u32mf2_m(...) __riscv_vsaddu_vv_u32mf2_tumu(__VA_ARGS__) +#define vsaddu_vx_u32mf2_m(...) __riscv_vsaddu_vx_u32mf2_tumu(__VA_ARGS__) +#define vsaddu_vv_u32m1_m(...) __riscv_vsaddu_vv_u32m1_tumu(__VA_ARGS__) +#define vsaddu_vx_u32m1_m(...) __riscv_vsaddu_vx_u32m1_tumu(__VA_ARGS__) +#define vsaddu_vv_u32m2_m(...) __riscv_vsaddu_vv_u32m2_tumu(__VA_ARGS__) +#define vsaddu_vx_u32m2_m(...) __riscv_vsaddu_vx_u32m2_tumu(__VA_ARGS__) +#define vsaddu_vv_u32m4_m(...) __riscv_vsaddu_vv_u32m4_tumu(__VA_ARGS__) +#define vsaddu_vx_u32m4_m(...) __riscv_vsaddu_vx_u32m4_tumu(__VA_ARGS__) +#define vsaddu_vv_u32m8_m(...) __riscv_vsaddu_vv_u32m8_tumu(__VA_ARGS__) +#define vsaddu_vx_u32m8_m(...) __riscv_vsaddu_vx_u32m8_tumu(__VA_ARGS__) +#define vsaddu_vv_u64m1_m(...) __riscv_vsaddu_vv_u64m1_tumu(__VA_ARGS__) +#define vsaddu_vx_u64m1_m(...) __riscv_vsaddu_vx_u64m1_tumu(__VA_ARGS__) +#define vsaddu_vv_u64m2_m(...) __riscv_vsaddu_vv_u64m2_tumu(__VA_ARGS__) +#define vsaddu_vx_u64m2_m(...) __riscv_vsaddu_vx_u64m2_tumu(__VA_ARGS__) +#define vsaddu_vv_u64m4_m(...) __riscv_vsaddu_vv_u64m4_tumu(__VA_ARGS__) +#define vsaddu_vx_u64m4_m(...) __riscv_vsaddu_vx_u64m4_tumu(__VA_ARGS__) +#define vsaddu_vv_u64m8_m(...) __riscv_vsaddu_vv_u64m8_tumu(__VA_ARGS__) +#define vsaddu_vx_u64m8_m(...) __riscv_vsaddu_vx_u64m8_tumu(__VA_ARGS__) +#define vssubu_vv_u8mf8_m(...) __riscv_vssubu_vv_u8mf8_tumu(__VA_ARGS__) +#define vssubu_vx_u8mf8_m(...) __riscv_vssubu_vx_u8mf8_tumu(__VA_ARGS__) +#define vssubu_vv_u8mf4_m(...) __riscv_vssubu_vv_u8mf4_tumu(__VA_ARGS__) +#define vssubu_vx_u8mf4_m(...) __riscv_vssubu_vx_u8mf4_tumu(__VA_ARGS__) +#define vssubu_vv_u8mf2_m(...) __riscv_vssubu_vv_u8mf2_tumu(__VA_ARGS__) +#define vssubu_vx_u8mf2_m(...) __riscv_vssubu_vx_u8mf2_tumu(__VA_ARGS__) +#define vssubu_vv_u8m1_m(...) __riscv_vssubu_vv_u8m1_tumu(__VA_ARGS__) +#define vssubu_vx_u8m1_m(...) __riscv_vssubu_vx_u8m1_tumu(__VA_ARGS__) +#define vssubu_vv_u8m2_m(...) __riscv_vssubu_vv_u8m2_tumu(__VA_ARGS__) +#define vssubu_vx_u8m2_m(...) __riscv_vssubu_vx_u8m2_tumu(__VA_ARGS__) +#define vssubu_vv_u8m4_m(...) __riscv_vssubu_vv_u8m4_tumu(__VA_ARGS__) +#define vssubu_vx_u8m4_m(...) __riscv_vssubu_vx_u8m4_tumu(__VA_ARGS__) +#define vssubu_vv_u8m8_m(...) __riscv_vssubu_vv_u8m8_tumu(__VA_ARGS__) +#define vssubu_vx_u8m8_m(...) __riscv_vssubu_vx_u8m8_tumu(__VA_ARGS__) +#define vssubu_vv_u16mf4_m(...) __riscv_vssubu_vv_u16mf4_tumu(__VA_ARGS__) +#define vssubu_vx_u16mf4_m(...) __riscv_vssubu_vx_u16mf4_tumu(__VA_ARGS__) +#define vssubu_vv_u16mf2_m(...) __riscv_vssubu_vv_u16mf2_tumu(__VA_ARGS__) +#define vssubu_vx_u16mf2_m(...) __riscv_vssubu_vx_u16mf2_tumu(__VA_ARGS__) +#define vssubu_vv_u16m1_m(...) __riscv_vssubu_vv_u16m1_tumu(__VA_ARGS__) +#define vssubu_vx_u16m1_m(...) __riscv_vssubu_vx_u16m1_tumu(__VA_ARGS__) +#define vssubu_vv_u16m2_m(...) __riscv_vssubu_vv_u16m2_tumu(__VA_ARGS__) +#define vssubu_vx_u16m2_m(...) __riscv_vssubu_vx_u16m2_tumu(__VA_ARGS__) +#define vssubu_vv_u16m4_m(...) __riscv_vssubu_vv_u16m4_tumu(__VA_ARGS__) +#define vssubu_vx_u16m4_m(...) __riscv_vssubu_vx_u16m4_tumu(__VA_ARGS__) +#define vssubu_vv_u16m8_m(...) __riscv_vssubu_vv_u16m8_tumu(__VA_ARGS__) +#define vssubu_vx_u16m8_m(...) __riscv_vssubu_vx_u16m8_tumu(__VA_ARGS__) +#define vssubu_vv_u32mf2_m(...) __riscv_vssubu_vv_u32mf2_tumu(__VA_ARGS__) +#define vssubu_vx_u32mf2_m(...) __riscv_vssubu_vx_u32mf2_tumu(__VA_ARGS__) +#define vssubu_vv_u32m1_m(...) __riscv_vssubu_vv_u32m1_tumu(__VA_ARGS__) +#define vssubu_vx_u32m1_m(...) __riscv_vssubu_vx_u32m1_tumu(__VA_ARGS__) +#define vssubu_vv_u32m2_m(...) __riscv_vssubu_vv_u32m2_tumu(__VA_ARGS__) +#define vssubu_vx_u32m2_m(...) __riscv_vssubu_vx_u32m2_tumu(__VA_ARGS__) +#define vssubu_vv_u32m4_m(...) __riscv_vssubu_vv_u32m4_tumu(__VA_ARGS__) +#define vssubu_vx_u32m4_m(...) __riscv_vssubu_vx_u32m4_tumu(__VA_ARGS__) +#define vssubu_vv_u32m8_m(...) __riscv_vssubu_vv_u32m8_tumu(__VA_ARGS__) +#define vssubu_vx_u32m8_m(...) __riscv_vssubu_vx_u32m8_tumu(__VA_ARGS__) +#define vssubu_vv_u64m1_m(...) __riscv_vssubu_vv_u64m1_tumu(__VA_ARGS__) +#define vssubu_vx_u64m1_m(...) __riscv_vssubu_vx_u64m1_tumu(__VA_ARGS__) +#define vssubu_vv_u64m2_m(...) __riscv_vssubu_vv_u64m2_tumu(__VA_ARGS__) +#define vssubu_vx_u64m2_m(...) __riscv_vssubu_vx_u64m2_tumu(__VA_ARGS__) +#define vssubu_vv_u64m4_m(...) __riscv_vssubu_vv_u64m4_tumu(__VA_ARGS__) +#define vssubu_vx_u64m4_m(...) __riscv_vssubu_vx_u64m4_tumu(__VA_ARGS__) +#define vssubu_vv_u64m8_m(...) __riscv_vssubu_vv_u64m8_tumu(__VA_ARGS__) +#define vssubu_vx_u64m8_m(...) __riscv_vssubu_vx_u64m8_tumu(__VA_ARGS__) +#define vaadd_vv_i8mf8(...) __riscv_vaadd_vv_i8mf8(__VA_ARGS__) +#define vaadd_vx_i8mf8(...) __riscv_vaadd_vx_i8mf8(__VA_ARGS__) +#define vaadd_vv_i8mf4(...) __riscv_vaadd_vv_i8mf4(__VA_ARGS__) +#define vaadd_vx_i8mf4(...) __riscv_vaadd_vx_i8mf4(__VA_ARGS__) +#define vaadd_vv_i8mf2(...) __riscv_vaadd_vv_i8mf2(__VA_ARGS__) +#define vaadd_vx_i8mf2(...) __riscv_vaadd_vx_i8mf2(__VA_ARGS__) +#define vaadd_vv_i8m1(...) __riscv_vaadd_vv_i8m1(__VA_ARGS__) +#define vaadd_vx_i8m1(...) __riscv_vaadd_vx_i8m1(__VA_ARGS__) +#define vaadd_vv_i8m2(...) __riscv_vaadd_vv_i8m2(__VA_ARGS__) +#define vaadd_vx_i8m2(...) __riscv_vaadd_vx_i8m2(__VA_ARGS__) +#define vaadd_vv_i8m4(...) __riscv_vaadd_vv_i8m4(__VA_ARGS__) +#define vaadd_vx_i8m4(...) __riscv_vaadd_vx_i8m4(__VA_ARGS__) +#define vaadd_vv_i8m8(...) __riscv_vaadd_vv_i8m8(__VA_ARGS__) +#define vaadd_vx_i8m8(...) __riscv_vaadd_vx_i8m8(__VA_ARGS__) +#define vaadd_vv_i16mf4(...) __riscv_vaadd_vv_i16mf4(__VA_ARGS__) +#define vaadd_vx_i16mf4(...) __riscv_vaadd_vx_i16mf4(__VA_ARGS__) +#define vaadd_vv_i16mf2(...) __riscv_vaadd_vv_i16mf2(__VA_ARGS__) +#define vaadd_vx_i16mf2(...) __riscv_vaadd_vx_i16mf2(__VA_ARGS__) +#define vaadd_vv_i16m1(...) __riscv_vaadd_vv_i16m1(__VA_ARGS__) +#define vaadd_vx_i16m1(...) __riscv_vaadd_vx_i16m1(__VA_ARGS__) +#define vaadd_vv_i16m2(...) __riscv_vaadd_vv_i16m2(__VA_ARGS__) +#define vaadd_vx_i16m2(...) __riscv_vaadd_vx_i16m2(__VA_ARGS__) +#define vaadd_vv_i16m4(...) __riscv_vaadd_vv_i16m4(__VA_ARGS__) +#define vaadd_vx_i16m4(...) __riscv_vaadd_vx_i16m4(__VA_ARGS__) +#define vaadd_vv_i16m8(...) __riscv_vaadd_vv_i16m8(__VA_ARGS__) +#define vaadd_vx_i16m8(...) __riscv_vaadd_vx_i16m8(__VA_ARGS__) +#define vaadd_vv_i32mf2(...) __riscv_vaadd_vv_i32mf2(__VA_ARGS__) +#define vaadd_vx_i32mf2(...) __riscv_vaadd_vx_i32mf2(__VA_ARGS__) +#define vaadd_vv_i32m1(...) __riscv_vaadd_vv_i32m1(__VA_ARGS__) +#define vaadd_vx_i32m1(...) __riscv_vaadd_vx_i32m1(__VA_ARGS__) +#define vaadd_vv_i32m2(...) __riscv_vaadd_vv_i32m2(__VA_ARGS__) +#define vaadd_vx_i32m2(...) __riscv_vaadd_vx_i32m2(__VA_ARGS__) +#define vaadd_vv_i32m4(...) __riscv_vaadd_vv_i32m4(__VA_ARGS__) +#define vaadd_vx_i32m4(...) __riscv_vaadd_vx_i32m4(__VA_ARGS__) +#define vaadd_vv_i32m8(...) __riscv_vaadd_vv_i32m8(__VA_ARGS__) +#define vaadd_vx_i32m8(...) __riscv_vaadd_vx_i32m8(__VA_ARGS__) +#define vaadd_vv_i64m1(...) __riscv_vaadd_vv_i64m1(__VA_ARGS__) +#define vaadd_vx_i64m1(...) __riscv_vaadd_vx_i64m1(__VA_ARGS__) +#define vaadd_vv_i64m2(...) __riscv_vaadd_vv_i64m2(__VA_ARGS__) +#define vaadd_vx_i64m2(...) __riscv_vaadd_vx_i64m2(__VA_ARGS__) +#define vaadd_vv_i64m4(...) __riscv_vaadd_vv_i64m4(__VA_ARGS__) +#define vaadd_vx_i64m4(...) __riscv_vaadd_vx_i64m4(__VA_ARGS__) +#define vaadd_vv_i64m8(...) __riscv_vaadd_vv_i64m8(__VA_ARGS__) +#define vaadd_vx_i64m8(...) __riscv_vaadd_vx_i64m8(__VA_ARGS__) +#define vasub_vv_i8mf8(...) __riscv_vasub_vv_i8mf8(__VA_ARGS__) +#define vasub_vx_i8mf8(...) __riscv_vasub_vx_i8mf8(__VA_ARGS__) +#define vasub_vv_i8mf4(...) __riscv_vasub_vv_i8mf4(__VA_ARGS__) +#define vasub_vx_i8mf4(...) __riscv_vasub_vx_i8mf4(__VA_ARGS__) +#define vasub_vv_i8mf2(...) __riscv_vasub_vv_i8mf2(__VA_ARGS__) +#define vasub_vx_i8mf2(...) __riscv_vasub_vx_i8mf2(__VA_ARGS__) +#define vasub_vv_i8m1(...) __riscv_vasub_vv_i8m1(__VA_ARGS__) +#define vasub_vx_i8m1(...) __riscv_vasub_vx_i8m1(__VA_ARGS__) +#define vasub_vv_i8m2(...) __riscv_vasub_vv_i8m2(__VA_ARGS__) +#define vasub_vx_i8m2(...) __riscv_vasub_vx_i8m2(__VA_ARGS__) +#define vasub_vv_i8m4(...) __riscv_vasub_vv_i8m4(__VA_ARGS__) +#define vasub_vx_i8m4(...) __riscv_vasub_vx_i8m4(__VA_ARGS__) +#define vasub_vv_i8m8(...) __riscv_vasub_vv_i8m8(__VA_ARGS__) +#define vasub_vx_i8m8(...) __riscv_vasub_vx_i8m8(__VA_ARGS__) +#define vasub_vv_i16mf4(...) __riscv_vasub_vv_i16mf4(__VA_ARGS__) +#define vasub_vx_i16mf4(...) __riscv_vasub_vx_i16mf4(__VA_ARGS__) +#define vasub_vv_i16mf2(...) __riscv_vasub_vv_i16mf2(__VA_ARGS__) +#define vasub_vx_i16mf2(...) __riscv_vasub_vx_i16mf2(__VA_ARGS__) +#define vasub_vv_i16m1(...) __riscv_vasub_vv_i16m1(__VA_ARGS__) +#define vasub_vx_i16m1(...) __riscv_vasub_vx_i16m1(__VA_ARGS__) +#define vasub_vv_i16m2(...) __riscv_vasub_vv_i16m2(__VA_ARGS__) +#define vasub_vx_i16m2(...) __riscv_vasub_vx_i16m2(__VA_ARGS__) +#define vasub_vv_i16m4(...) __riscv_vasub_vv_i16m4(__VA_ARGS__) +#define vasub_vx_i16m4(...) __riscv_vasub_vx_i16m4(__VA_ARGS__) +#define vasub_vv_i16m8(...) __riscv_vasub_vv_i16m8(__VA_ARGS__) +#define vasub_vx_i16m8(...) __riscv_vasub_vx_i16m8(__VA_ARGS__) +#define vasub_vv_i32mf2(...) __riscv_vasub_vv_i32mf2(__VA_ARGS__) +#define vasub_vx_i32mf2(...) __riscv_vasub_vx_i32mf2(__VA_ARGS__) +#define vasub_vv_i32m1(...) __riscv_vasub_vv_i32m1(__VA_ARGS__) +#define vasub_vx_i32m1(...) __riscv_vasub_vx_i32m1(__VA_ARGS__) +#define vasub_vv_i32m2(...) __riscv_vasub_vv_i32m2(__VA_ARGS__) +#define vasub_vx_i32m2(...) __riscv_vasub_vx_i32m2(__VA_ARGS__) +#define vasub_vv_i32m4(...) __riscv_vasub_vv_i32m4(__VA_ARGS__) +#define vasub_vx_i32m4(...) __riscv_vasub_vx_i32m4(__VA_ARGS__) +#define vasub_vv_i32m8(...) __riscv_vasub_vv_i32m8(__VA_ARGS__) +#define vasub_vx_i32m8(...) __riscv_vasub_vx_i32m8(__VA_ARGS__) +#define vasub_vv_i64m1(...) __riscv_vasub_vv_i64m1(__VA_ARGS__) +#define vasub_vx_i64m1(...) __riscv_vasub_vx_i64m1(__VA_ARGS__) +#define vasub_vv_i64m2(...) __riscv_vasub_vv_i64m2(__VA_ARGS__) +#define vasub_vx_i64m2(...) __riscv_vasub_vx_i64m2(__VA_ARGS__) +#define vasub_vv_i64m4(...) __riscv_vasub_vv_i64m4(__VA_ARGS__) +#define vasub_vx_i64m4(...) __riscv_vasub_vx_i64m4(__VA_ARGS__) +#define vasub_vv_i64m8(...) __riscv_vasub_vv_i64m8(__VA_ARGS__) +#define vasub_vx_i64m8(...) __riscv_vasub_vx_i64m8(__VA_ARGS__) +#define vaaddu_vv_u8mf8(...) __riscv_vaaddu_vv_u8mf8(__VA_ARGS__) +#define vaaddu_vx_u8mf8(...) __riscv_vaaddu_vx_u8mf8(__VA_ARGS__) +#define vaaddu_vv_u8mf4(...) __riscv_vaaddu_vv_u8mf4(__VA_ARGS__) +#define vaaddu_vx_u8mf4(...) __riscv_vaaddu_vx_u8mf4(__VA_ARGS__) +#define vaaddu_vv_u8mf2(...) __riscv_vaaddu_vv_u8mf2(__VA_ARGS__) +#define vaaddu_vx_u8mf2(...) __riscv_vaaddu_vx_u8mf2(__VA_ARGS__) +#define vaaddu_vv_u8m1(...) __riscv_vaaddu_vv_u8m1(__VA_ARGS__) +#define vaaddu_vx_u8m1(...) __riscv_vaaddu_vx_u8m1(__VA_ARGS__) +#define vaaddu_vv_u8m2(...) __riscv_vaaddu_vv_u8m2(__VA_ARGS__) +#define vaaddu_vx_u8m2(...) __riscv_vaaddu_vx_u8m2(__VA_ARGS__) +#define vaaddu_vv_u8m4(...) __riscv_vaaddu_vv_u8m4(__VA_ARGS__) +#define vaaddu_vx_u8m4(...) __riscv_vaaddu_vx_u8m4(__VA_ARGS__) +#define vaaddu_vv_u8m8(...) __riscv_vaaddu_vv_u8m8(__VA_ARGS__) +#define vaaddu_vx_u8m8(...) __riscv_vaaddu_vx_u8m8(__VA_ARGS__) +#define vaaddu_vv_u16mf4(...) __riscv_vaaddu_vv_u16mf4(__VA_ARGS__) +#define vaaddu_vx_u16mf4(...) __riscv_vaaddu_vx_u16mf4(__VA_ARGS__) +#define vaaddu_vv_u16mf2(...) __riscv_vaaddu_vv_u16mf2(__VA_ARGS__) +#define vaaddu_vx_u16mf2(...) __riscv_vaaddu_vx_u16mf2(__VA_ARGS__) +#define vaaddu_vv_u16m1(...) __riscv_vaaddu_vv_u16m1(__VA_ARGS__) +#define vaaddu_vx_u16m1(...) __riscv_vaaddu_vx_u16m1(__VA_ARGS__) +#define vaaddu_vv_u16m2(...) __riscv_vaaddu_vv_u16m2(__VA_ARGS__) +#define vaaddu_vx_u16m2(...) __riscv_vaaddu_vx_u16m2(__VA_ARGS__) +#define vaaddu_vv_u16m4(...) __riscv_vaaddu_vv_u16m4(__VA_ARGS__) +#define vaaddu_vx_u16m4(...) __riscv_vaaddu_vx_u16m4(__VA_ARGS__) +#define vaaddu_vv_u16m8(...) __riscv_vaaddu_vv_u16m8(__VA_ARGS__) +#define vaaddu_vx_u16m8(...) __riscv_vaaddu_vx_u16m8(__VA_ARGS__) +#define vaaddu_vv_u32mf2(...) __riscv_vaaddu_vv_u32mf2(__VA_ARGS__) +#define vaaddu_vx_u32mf2(...) __riscv_vaaddu_vx_u32mf2(__VA_ARGS__) +#define vaaddu_vv_u32m1(...) __riscv_vaaddu_vv_u32m1(__VA_ARGS__) +#define vaaddu_vx_u32m1(...) __riscv_vaaddu_vx_u32m1(__VA_ARGS__) +#define vaaddu_vv_u32m2(...) __riscv_vaaddu_vv_u32m2(__VA_ARGS__) +#define vaaddu_vx_u32m2(...) __riscv_vaaddu_vx_u32m2(__VA_ARGS__) +#define vaaddu_vv_u32m4(...) __riscv_vaaddu_vv_u32m4(__VA_ARGS__) +#define vaaddu_vx_u32m4(...) __riscv_vaaddu_vx_u32m4(__VA_ARGS__) +#define vaaddu_vv_u32m8(...) __riscv_vaaddu_vv_u32m8(__VA_ARGS__) +#define vaaddu_vx_u32m8(...) __riscv_vaaddu_vx_u32m8(__VA_ARGS__) +#define vaaddu_vv_u64m1(...) __riscv_vaaddu_vv_u64m1(__VA_ARGS__) +#define vaaddu_vx_u64m1(...) __riscv_vaaddu_vx_u64m1(__VA_ARGS__) +#define vaaddu_vv_u64m2(...) __riscv_vaaddu_vv_u64m2(__VA_ARGS__) +#define vaaddu_vx_u64m2(...) __riscv_vaaddu_vx_u64m2(__VA_ARGS__) +#define vaaddu_vv_u64m4(...) __riscv_vaaddu_vv_u64m4(__VA_ARGS__) +#define vaaddu_vx_u64m4(...) __riscv_vaaddu_vx_u64m4(__VA_ARGS__) +#define vaaddu_vv_u64m8(...) __riscv_vaaddu_vv_u64m8(__VA_ARGS__) +#define vaaddu_vx_u64m8(...) __riscv_vaaddu_vx_u64m8(__VA_ARGS__) +#define vasubu_vv_u8mf8(...) __riscv_vasubu_vv_u8mf8(__VA_ARGS__) +#define vasubu_vx_u8mf8(...) __riscv_vasubu_vx_u8mf8(__VA_ARGS__) +#define vasubu_vv_u8mf4(...) __riscv_vasubu_vv_u8mf4(__VA_ARGS__) +#define vasubu_vx_u8mf4(...) __riscv_vasubu_vx_u8mf4(__VA_ARGS__) +#define vasubu_vv_u8mf2(...) __riscv_vasubu_vv_u8mf2(__VA_ARGS__) +#define vasubu_vx_u8mf2(...) __riscv_vasubu_vx_u8mf2(__VA_ARGS__) +#define vasubu_vv_u8m1(...) __riscv_vasubu_vv_u8m1(__VA_ARGS__) +#define vasubu_vx_u8m1(...) __riscv_vasubu_vx_u8m1(__VA_ARGS__) +#define vasubu_vv_u8m2(...) __riscv_vasubu_vv_u8m2(__VA_ARGS__) +#define vasubu_vx_u8m2(...) __riscv_vasubu_vx_u8m2(__VA_ARGS__) +#define vasubu_vv_u8m4(...) __riscv_vasubu_vv_u8m4(__VA_ARGS__) +#define vasubu_vx_u8m4(...) __riscv_vasubu_vx_u8m4(__VA_ARGS__) +#define vasubu_vv_u8m8(...) __riscv_vasubu_vv_u8m8(__VA_ARGS__) +#define vasubu_vx_u8m8(...) __riscv_vasubu_vx_u8m8(__VA_ARGS__) +#define vasubu_vv_u16mf4(...) __riscv_vasubu_vv_u16mf4(__VA_ARGS__) +#define vasubu_vx_u16mf4(...) __riscv_vasubu_vx_u16mf4(__VA_ARGS__) +#define vasubu_vv_u16mf2(...) __riscv_vasubu_vv_u16mf2(__VA_ARGS__) +#define vasubu_vx_u16mf2(...) __riscv_vasubu_vx_u16mf2(__VA_ARGS__) +#define vasubu_vv_u16m1(...) __riscv_vasubu_vv_u16m1(__VA_ARGS__) +#define vasubu_vx_u16m1(...) __riscv_vasubu_vx_u16m1(__VA_ARGS__) +#define vasubu_vv_u16m2(...) __riscv_vasubu_vv_u16m2(__VA_ARGS__) +#define vasubu_vx_u16m2(...) __riscv_vasubu_vx_u16m2(__VA_ARGS__) +#define vasubu_vv_u16m4(...) __riscv_vasubu_vv_u16m4(__VA_ARGS__) +#define vasubu_vx_u16m4(...) __riscv_vasubu_vx_u16m4(__VA_ARGS__) +#define vasubu_vv_u16m8(...) __riscv_vasubu_vv_u16m8(__VA_ARGS__) +#define vasubu_vx_u16m8(...) __riscv_vasubu_vx_u16m8(__VA_ARGS__) +#define vasubu_vv_u32mf2(...) __riscv_vasubu_vv_u32mf2(__VA_ARGS__) +#define vasubu_vx_u32mf2(...) __riscv_vasubu_vx_u32mf2(__VA_ARGS__) +#define vasubu_vv_u32m1(...) __riscv_vasubu_vv_u32m1(__VA_ARGS__) +#define vasubu_vx_u32m1(...) __riscv_vasubu_vx_u32m1(__VA_ARGS__) +#define vasubu_vv_u32m2(...) __riscv_vasubu_vv_u32m2(__VA_ARGS__) +#define vasubu_vx_u32m2(...) __riscv_vasubu_vx_u32m2(__VA_ARGS__) +#define vasubu_vv_u32m4(...) __riscv_vasubu_vv_u32m4(__VA_ARGS__) +#define vasubu_vx_u32m4(...) __riscv_vasubu_vx_u32m4(__VA_ARGS__) +#define vasubu_vv_u32m8(...) __riscv_vasubu_vv_u32m8(__VA_ARGS__) +#define vasubu_vx_u32m8(...) __riscv_vasubu_vx_u32m8(__VA_ARGS__) +#define vasubu_vv_u64m1(...) __riscv_vasubu_vv_u64m1(__VA_ARGS__) +#define vasubu_vx_u64m1(...) __riscv_vasubu_vx_u64m1(__VA_ARGS__) +#define vasubu_vv_u64m2(...) __riscv_vasubu_vv_u64m2(__VA_ARGS__) +#define vasubu_vx_u64m2(...) __riscv_vasubu_vx_u64m2(__VA_ARGS__) +#define vasubu_vv_u64m4(...) __riscv_vasubu_vv_u64m4(__VA_ARGS__) +#define vasubu_vx_u64m4(...) __riscv_vasubu_vx_u64m4(__VA_ARGS__) +#define vasubu_vv_u64m8(...) __riscv_vasubu_vv_u64m8(__VA_ARGS__) +#define vasubu_vx_u64m8(...) __riscv_vasubu_vx_u64m8(__VA_ARGS__) +// masked functions +#define vaadd_vv_i8mf8_m(...) __riscv_vaadd_vv_i8mf8_tumu(__VA_ARGS__) +#define vaadd_vx_i8mf8_m(...) __riscv_vaadd_vx_i8mf8_tumu(__VA_ARGS__) +#define vaadd_vv_i8mf4_m(...) __riscv_vaadd_vv_i8mf4_tumu(__VA_ARGS__) +#define vaadd_vx_i8mf4_m(...) __riscv_vaadd_vx_i8mf4_tumu(__VA_ARGS__) +#define vaadd_vv_i8mf2_m(...) __riscv_vaadd_vv_i8mf2_tumu(__VA_ARGS__) +#define vaadd_vx_i8mf2_m(...) __riscv_vaadd_vx_i8mf2_tumu(__VA_ARGS__) +#define vaadd_vv_i8m1_m(...) __riscv_vaadd_vv_i8m1_tumu(__VA_ARGS__) +#define vaadd_vx_i8m1_m(...) __riscv_vaadd_vx_i8m1_tumu(__VA_ARGS__) +#define vaadd_vv_i8m2_m(...) __riscv_vaadd_vv_i8m2_tumu(__VA_ARGS__) +#define vaadd_vx_i8m2_m(...) __riscv_vaadd_vx_i8m2_tumu(__VA_ARGS__) +#define vaadd_vv_i8m4_m(...) __riscv_vaadd_vv_i8m4_tumu(__VA_ARGS__) +#define vaadd_vx_i8m4_m(...) __riscv_vaadd_vx_i8m4_tumu(__VA_ARGS__) +#define vaadd_vv_i8m8_m(...) __riscv_vaadd_vv_i8m8_tumu(__VA_ARGS__) +#define vaadd_vx_i8m8_m(...) __riscv_vaadd_vx_i8m8_tumu(__VA_ARGS__) +#define vaadd_vv_i16mf4_m(...) __riscv_vaadd_vv_i16mf4_tumu(__VA_ARGS__) +#define vaadd_vx_i16mf4_m(...) __riscv_vaadd_vx_i16mf4_tumu(__VA_ARGS__) +#define vaadd_vv_i16mf2_m(...) __riscv_vaadd_vv_i16mf2_tumu(__VA_ARGS__) +#define vaadd_vx_i16mf2_m(...) __riscv_vaadd_vx_i16mf2_tumu(__VA_ARGS__) +#define vaadd_vv_i16m1_m(...) __riscv_vaadd_vv_i16m1_tumu(__VA_ARGS__) +#define vaadd_vx_i16m1_m(...) __riscv_vaadd_vx_i16m1_tumu(__VA_ARGS__) +#define vaadd_vv_i16m2_m(...) __riscv_vaadd_vv_i16m2_tumu(__VA_ARGS__) +#define vaadd_vx_i16m2_m(...) __riscv_vaadd_vx_i16m2_tumu(__VA_ARGS__) +#define vaadd_vv_i16m4_m(...) __riscv_vaadd_vv_i16m4_tumu(__VA_ARGS__) +#define vaadd_vx_i16m4_m(...) __riscv_vaadd_vx_i16m4_tumu(__VA_ARGS__) +#define vaadd_vv_i16m8_m(...) __riscv_vaadd_vv_i16m8_tumu(__VA_ARGS__) +#define vaadd_vx_i16m8_m(...) __riscv_vaadd_vx_i16m8_tumu(__VA_ARGS__) +#define vaadd_vv_i32mf2_m(...) __riscv_vaadd_vv_i32mf2_tumu(__VA_ARGS__) +#define vaadd_vx_i32mf2_m(...) __riscv_vaadd_vx_i32mf2_tumu(__VA_ARGS__) +#define vaadd_vv_i32m1_m(...) __riscv_vaadd_vv_i32m1_tumu(__VA_ARGS__) +#define vaadd_vx_i32m1_m(...) __riscv_vaadd_vx_i32m1_tumu(__VA_ARGS__) +#define vaadd_vv_i32m2_m(...) __riscv_vaadd_vv_i32m2_tumu(__VA_ARGS__) +#define vaadd_vx_i32m2_m(...) __riscv_vaadd_vx_i32m2_tumu(__VA_ARGS__) +#define vaadd_vv_i32m4_m(...) __riscv_vaadd_vv_i32m4_tumu(__VA_ARGS__) +#define vaadd_vx_i32m4_m(...) __riscv_vaadd_vx_i32m4_tumu(__VA_ARGS__) +#define vaadd_vv_i32m8_m(...) __riscv_vaadd_vv_i32m8_tumu(__VA_ARGS__) +#define vaadd_vx_i32m8_m(...) __riscv_vaadd_vx_i32m8_tumu(__VA_ARGS__) +#define vaadd_vv_i64m1_m(...) __riscv_vaadd_vv_i64m1_tumu(__VA_ARGS__) +#define vaadd_vx_i64m1_m(...) __riscv_vaadd_vx_i64m1_tumu(__VA_ARGS__) +#define vaadd_vv_i64m2_m(...) __riscv_vaadd_vv_i64m2_tumu(__VA_ARGS__) +#define vaadd_vx_i64m2_m(...) __riscv_vaadd_vx_i64m2_tumu(__VA_ARGS__) +#define vaadd_vv_i64m4_m(...) __riscv_vaadd_vv_i64m4_tumu(__VA_ARGS__) +#define vaadd_vx_i64m4_m(...) __riscv_vaadd_vx_i64m4_tumu(__VA_ARGS__) +#define vaadd_vv_i64m8_m(...) __riscv_vaadd_vv_i64m8_tumu(__VA_ARGS__) +#define vaadd_vx_i64m8_m(...) __riscv_vaadd_vx_i64m8_tumu(__VA_ARGS__) +#define vasub_vv_i8mf8_m(...) __riscv_vasub_vv_i8mf8_tumu(__VA_ARGS__) +#define vasub_vx_i8mf8_m(...) __riscv_vasub_vx_i8mf8_tumu(__VA_ARGS__) +#define vasub_vv_i8mf4_m(...) __riscv_vasub_vv_i8mf4_tumu(__VA_ARGS__) +#define vasub_vx_i8mf4_m(...) __riscv_vasub_vx_i8mf4_tumu(__VA_ARGS__) +#define vasub_vv_i8mf2_m(...) __riscv_vasub_vv_i8mf2_tumu(__VA_ARGS__) +#define vasub_vx_i8mf2_m(...) __riscv_vasub_vx_i8mf2_tumu(__VA_ARGS__) +#define vasub_vv_i8m1_m(...) __riscv_vasub_vv_i8m1_tumu(__VA_ARGS__) +#define vasub_vx_i8m1_m(...) __riscv_vasub_vx_i8m1_tumu(__VA_ARGS__) +#define vasub_vv_i8m2_m(...) __riscv_vasub_vv_i8m2_tumu(__VA_ARGS__) +#define vasub_vx_i8m2_m(...) __riscv_vasub_vx_i8m2_tumu(__VA_ARGS__) +#define vasub_vv_i8m4_m(...) __riscv_vasub_vv_i8m4_tumu(__VA_ARGS__) +#define vasub_vx_i8m4_m(...) __riscv_vasub_vx_i8m4_tumu(__VA_ARGS__) +#define vasub_vv_i8m8_m(...) __riscv_vasub_vv_i8m8_tumu(__VA_ARGS__) +#define vasub_vx_i8m8_m(...) __riscv_vasub_vx_i8m8_tumu(__VA_ARGS__) +#define vasub_vv_i16mf4_m(...) __riscv_vasub_vv_i16mf4_tumu(__VA_ARGS__) +#define vasub_vx_i16mf4_m(...) __riscv_vasub_vx_i16mf4_tumu(__VA_ARGS__) +#define vasub_vv_i16mf2_m(...) __riscv_vasub_vv_i16mf2_tumu(__VA_ARGS__) +#define vasub_vx_i16mf2_m(...) __riscv_vasub_vx_i16mf2_tumu(__VA_ARGS__) +#define vasub_vv_i16m1_m(...) __riscv_vasub_vv_i16m1_tumu(__VA_ARGS__) +#define vasub_vx_i16m1_m(...) __riscv_vasub_vx_i16m1_tumu(__VA_ARGS__) +#define vasub_vv_i16m2_m(...) __riscv_vasub_vv_i16m2_tumu(__VA_ARGS__) +#define vasub_vx_i16m2_m(...) __riscv_vasub_vx_i16m2_tumu(__VA_ARGS__) +#define vasub_vv_i16m4_m(...) __riscv_vasub_vv_i16m4_tumu(__VA_ARGS__) +#define vasub_vx_i16m4_m(...) __riscv_vasub_vx_i16m4_tumu(__VA_ARGS__) +#define vasub_vv_i16m8_m(...) __riscv_vasub_vv_i16m8_tumu(__VA_ARGS__) +#define vasub_vx_i16m8_m(...) __riscv_vasub_vx_i16m8_tumu(__VA_ARGS__) +#define vasub_vv_i32mf2_m(...) __riscv_vasub_vv_i32mf2_tumu(__VA_ARGS__) +#define vasub_vx_i32mf2_m(...) __riscv_vasub_vx_i32mf2_tumu(__VA_ARGS__) +#define vasub_vv_i32m1_m(...) __riscv_vasub_vv_i32m1_tumu(__VA_ARGS__) +#define vasub_vx_i32m1_m(...) __riscv_vasub_vx_i32m1_tumu(__VA_ARGS__) +#define vasub_vv_i32m2_m(...) __riscv_vasub_vv_i32m2_tumu(__VA_ARGS__) +#define vasub_vx_i32m2_m(...) __riscv_vasub_vx_i32m2_tumu(__VA_ARGS__) +#define vasub_vv_i32m4_m(...) __riscv_vasub_vv_i32m4_tumu(__VA_ARGS__) +#define vasub_vx_i32m4_m(...) __riscv_vasub_vx_i32m4_tumu(__VA_ARGS__) +#define vasub_vv_i32m8_m(...) __riscv_vasub_vv_i32m8_tumu(__VA_ARGS__) +#define vasub_vx_i32m8_m(...) __riscv_vasub_vx_i32m8_tumu(__VA_ARGS__) +#define vasub_vv_i64m1_m(...) __riscv_vasub_vv_i64m1_tumu(__VA_ARGS__) +#define vasub_vx_i64m1_m(...) __riscv_vasub_vx_i64m1_tumu(__VA_ARGS__) +#define vasub_vv_i64m2_m(...) __riscv_vasub_vv_i64m2_tumu(__VA_ARGS__) +#define vasub_vx_i64m2_m(...) __riscv_vasub_vx_i64m2_tumu(__VA_ARGS__) +#define vasub_vv_i64m4_m(...) __riscv_vasub_vv_i64m4_tumu(__VA_ARGS__) +#define vasub_vx_i64m4_m(...) __riscv_vasub_vx_i64m4_tumu(__VA_ARGS__) +#define vasub_vv_i64m8_m(...) __riscv_vasub_vv_i64m8_tumu(__VA_ARGS__) +#define vasub_vx_i64m8_m(...) __riscv_vasub_vx_i64m8_tumu(__VA_ARGS__) +#define vaaddu_vv_u8mf8_m(...) __riscv_vaaddu_vv_u8mf8_tumu(__VA_ARGS__) +#define vaaddu_vx_u8mf8_m(...) __riscv_vaaddu_vx_u8mf8_tumu(__VA_ARGS__) +#define vaaddu_vv_u8mf4_m(...) __riscv_vaaddu_vv_u8mf4_tumu(__VA_ARGS__) +#define vaaddu_vx_u8mf4_m(...) __riscv_vaaddu_vx_u8mf4_tumu(__VA_ARGS__) +#define vaaddu_vv_u8mf2_m(...) __riscv_vaaddu_vv_u8mf2_tumu(__VA_ARGS__) +#define vaaddu_vx_u8mf2_m(...) __riscv_vaaddu_vx_u8mf2_tumu(__VA_ARGS__) +#define vaaddu_vv_u8m1_m(...) __riscv_vaaddu_vv_u8m1_tumu(__VA_ARGS__) +#define vaaddu_vx_u8m1_m(...) __riscv_vaaddu_vx_u8m1_tumu(__VA_ARGS__) +#define vaaddu_vv_u8m2_m(...) __riscv_vaaddu_vv_u8m2_tumu(__VA_ARGS__) +#define vaaddu_vx_u8m2_m(...) __riscv_vaaddu_vx_u8m2_tumu(__VA_ARGS__) +#define vaaddu_vv_u8m4_m(...) __riscv_vaaddu_vv_u8m4_tumu(__VA_ARGS__) +#define vaaddu_vx_u8m4_m(...) __riscv_vaaddu_vx_u8m4_tumu(__VA_ARGS__) +#define vaaddu_vv_u8m8_m(...) __riscv_vaaddu_vv_u8m8_tumu(__VA_ARGS__) +#define vaaddu_vx_u8m8_m(...) __riscv_vaaddu_vx_u8m8_tumu(__VA_ARGS__) +#define vaaddu_vv_u16mf4_m(...) __riscv_vaaddu_vv_u16mf4_tumu(__VA_ARGS__) +#define vaaddu_vx_u16mf4_m(...) __riscv_vaaddu_vx_u16mf4_tumu(__VA_ARGS__) +#define vaaddu_vv_u16mf2_m(...) __riscv_vaaddu_vv_u16mf2_tumu(__VA_ARGS__) +#define vaaddu_vx_u16mf2_m(...) __riscv_vaaddu_vx_u16mf2_tumu(__VA_ARGS__) +#define vaaddu_vv_u16m1_m(...) __riscv_vaaddu_vv_u16m1_tumu(__VA_ARGS__) +#define vaaddu_vx_u16m1_m(...) __riscv_vaaddu_vx_u16m1_tumu(__VA_ARGS__) +#define vaaddu_vv_u16m2_m(...) __riscv_vaaddu_vv_u16m2_tumu(__VA_ARGS__) +#define vaaddu_vx_u16m2_m(...) __riscv_vaaddu_vx_u16m2_tumu(__VA_ARGS__) +#define vaaddu_vv_u16m4_m(...) __riscv_vaaddu_vv_u16m4_tumu(__VA_ARGS__) +#define vaaddu_vx_u16m4_m(...) __riscv_vaaddu_vx_u16m4_tumu(__VA_ARGS__) +#define vaaddu_vv_u16m8_m(...) __riscv_vaaddu_vv_u16m8_tumu(__VA_ARGS__) +#define vaaddu_vx_u16m8_m(...) __riscv_vaaddu_vx_u16m8_tumu(__VA_ARGS__) +#define vaaddu_vv_u32mf2_m(...) __riscv_vaaddu_vv_u32mf2_tumu(__VA_ARGS__) +#define vaaddu_vx_u32mf2_m(...) __riscv_vaaddu_vx_u32mf2_tumu(__VA_ARGS__) +#define vaaddu_vv_u32m1_m(...) __riscv_vaaddu_vv_u32m1_tumu(__VA_ARGS__) +#define vaaddu_vx_u32m1_m(...) __riscv_vaaddu_vx_u32m1_tumu(__VA_ARGS__) +#define vaaddu_vv_u32m2_m(...) __riscv_vaaddu_vv_u32m2_tumu(__VA_ARGS__) +#define vaaddu_vx_u32m2_m(...) __riscv_vaaddu_vx_u32m2_tumu(__VA_ARGS__) +#define vaaddu_vv_u32m4_m(...) __riscv_vaaddu_vv_u32m4_tumu(__VA_ARGS__) +#define vaaddu_vx_u32m4_m(...) __riscv_vaaddu_vx_u32m4_tumu(__VA_ARGS__) +#define vaaddu_vv_u32m8_m(...) __riscv_vaaddu_vv_u32m8_tumu(__VA_ARGS__) +#define vaaddu_vx_u32m8_m(...) __riscv_vaaddu_vx_u32m8_tumu(__VA_ARGS__) +#define vaaddu_vv_u64m1_m(...) __riscv_vaaddu_vv_u64m1_tumu(__VA_ARGS__) +#define vaaddu_vx_u64m1_m(...) __riscv_vaaddu_vx_u64m1_tumu(__VA_ARGS__) +#define vaaddu_vv_u64m2_m(...) __riscv_vaaddu_vv_u64m2_tumu(__VA_ARGS__) +#define vaaddu_vx_u64m2_m(...) __riscv_vaaddu_vx_u64m2_tumu(__VA_ARGS__) +#define vaaddu_vv_u64m4_m(...) __riscv_vaaddu_vv_u64m4_tumu(__VA_ARGS__) +#define vaaddu_vx_u64m4_m(...) __riscv_vaaddu_vx_u64m4_tumu(__VA_ARGS__) +#define vaaddu_vv_u64m8_m(...) __riscv_vaaddu_vv_u64m8_tumu(__VA_ARGS__) +#define vaaddu_vx_u64m8_m(...) __riscv_vaaddu_vx_u64m8_tumu(__VA_ARGS__) +#define vasubu_vv_u8mf8_m(...) __riscv_vasubu_vv_u8mf8_tumu(__VA_ARGS__) +#define vasubu_vx_u8mf8_m(...) __riscv_vasubu_vx_u8mf8_tumu(__VA_ARGS__) +#define vasubu_vv_u8mf4_m(...) __riscv_vasubu_vv_u8mf4_tumu(__VA_ARGS__) +#define vasubu_vx_u8mf4_m(...) __riscv_vasubu_vx_u8mf4_tumu(__VA_ARGS__) +#define vasubu_vv_u8mf2_m(...) __riscv_vasubu_vv_u8mf2_tumu(__VA_ARGS__) +#define vasubu_vx_u8mf2_m(...) __riscv_vasubu_vx_u8mf2_tumu(__VA_ARGS__) +#define vasubu_vv_u8m1_m(...) __riscv_vasubu_vv_u8m1_tumu(__VA_ARGS__) +#define vasubu_vx_u8m1_m(...) __riscv_vasubu_vx_u8m1_tumu(__VA_ARGS__) +#define vasubu_vv_u8m2_m(...) __riscv_vasubu_vv_u8m2_tumu(__VA_ARGS__) +#define vasubu_vx_u8m2_m(...) __riscv_vasubu_vx_u8m2_tumu(__VA_ARGS__) +#define vasubu_vv_u8m4_m(...) __riscv_vasubu_vv_u8m4_tumu(__VA_ARGS__) +#define vasubu_vx_u8m4_m(...) __riscv_vasubu_vx_u8m4_tumu(__VA_ARGS__) +#define vasubu_vv_u8m8_m(...) __riscv_vasubu_vv_u8m8_tumu(__VA_ARGS__) +#define vasubu_vx_u8m8_m(...) __riscv_vasubu_vx_u8m8_tumu(__VA_ARGS__) +#define vasubu_vv_u16mf4_m(...) __riscv_vasubu_vv_u16mf4_tumu(__VA_ARGS__) +#define vasubu_vx_u16mf4_m(...) __riscv_vasubu_vx_u16mf4_tumu(__VA_ARGS__) +#define vasubu_vv_u16mf2_m(...) __riscv_vasubu_vv_u16mf2_tumu(__VA_ARGS__) +#define vasubu_vx_u16mf2_m(...) __riscv_vasubu_vx_u16mf2_tumu(__VA_ARGS__) +#define vasubu_vv_u16m1_m(...) __riscv_vasubu_vv_u16m1_tumu(__VA_ARGS__) +#define vasubu_vx_u16m1_m(...) __riscv_vasubu_vx_u16m1_tumu(__VA_ARGS__) +#define vasubu_vv_u16m2_m(...) __riscv_vasubu_vv_u16m2_tumu(__VA_ARGS__) +#define vasubu_vx_u16m2_m(...) __riscv_vasubu_vx_u16m2_tumu(__VA_ARGS__) +#define vasubu_vv_u16m4_m(...) __riscv_vasubu_vv_u16m4_tumu(__VA_ARGS__) +#define vasubu_vx_u16m4_m(...) __riscv_vasubu_vx_u16m4_tumu(__VA_ARGS__) +#define vasubu_vv_u16m8_m(...) __riscv_vasubu_vv_u16m8_tumu(__VA_ARGS__) +#define vasubu_vx_u16m8_m(...) __riscv_vasubu_vx_u16m8_tumu(__VA_ARGS__) +#define vasubu_vv_u32mf2_m(...) __riscv_vasubu_vv_u32mf2_tumu(__VA_ARGS__) +#define vasubu_vx_u32mf2_m(...) __riscv_vasubu_vx_u32mf2_tumu(__VA_ARGS__) +#define vasubu_vv_u32m1_m(...) __riscv_vasubu_vv_u32m1_tumu(__VA_ARGS__) +#define vasubu_vx_u32m1_m(...) __riscv_vasubu_vx_u32m1_tumu(__VA_ARGS__) +#define vasubu_vv_u32m2_m(...) __riscv_vasubu_vv_u32m2_tumu(__VA_ARGS__) +#define vasubu_vx_u32m2_m(...) __riscv_vasubu_vx_u32m2_tumu(__VA_ARGS__) +#define vasubu_vv_u32m4_m(...) __riscv_vasubu_vv_u32m4_tumu(__VA_ARGS__) +#define vasubu_vx_u32m4_m(...) __riscv_vasubu_vx_u32m4_tumu(__VA_ARGS__) +#define vasubu_vv_u32m8_m(...) __riscv_vasubu_vv_u32m8_tumu(__VA_ARGS__) +#define vasubu_vx_u32m8_m(...) __riscv_vasubu_vx_u32m8_tumu(__VA_ARGS__) +#define vasubu_vv_u64m1_m(...) __riscv_vasubu_vv_u64m1_tumu(__VA_ARGS__) +#define vasubu_vx_u64m1_m(...) __riscv_vasubu_vx_u64m1_tumu(__VA_ARGS__) +#define vasubu_vv_u64m2_m(...) __riscv_vasubu_vv_u64m2_tumu(__VA_ARGS__) +#define vasubu_vx_u64m2_m(...) __riscv_vasubu_vx_u64m2_tumu(__VA_ARGS__) +#define vasubu_vv_u64m4_m(...) __riscv_vasubu_vv_u64m4_tumu(__VA_ARGS__) +#define vasubu_vx_u64m4_m(...) __riscv_vasubu_vx_u64m4_tumu(__VA_ARGS__) +#define vasubu_vv_u64m8_m(...) __riscv_vasubu_vv_u64m8_tumu(__VA_ARGS__) +#define vasubu_vx_u64m8_m(...) __riscv_vasubu_vx_u64m8_tumu(__VA_ARGS__) +#define vsmul_vv_i8mf8(...) __riscv_vsmul_vv_i8mf8(__VA_ARGS__) +#define vsmul_vx_i8mf8(...) __riscv_vsmul_vx_i8mf8(__VA_ARGS__) +#define vsmul_vv_i8mf4(...) __riscv_vsmul_vv_i8mf4(__VA_ARGS__) +#define vsmul_vx_i8mf4(...) __riscv_vsmul_vx_i8mf4(__VA_ARGS__) +#define vsmul_vv_i8mf2(...) __riscv_vsmul_vv_i8mf2(__VA_ARGS__) +#define vsmul_vx_i8mf2(...) __riscv_vsmul_vx_i8mf2(__VA_ARGS__) +#define vsmul_vv_i8m1(...) __riscv_vsmul_vv_i8m1(__VA_ARGS__) +#define vsmul_vx_i8m1(...) __riscv_vsmul_vx_i8m1(__VA_ARGS__) +#define vsmul_vv_i8m2(...) __riscv_vsmul_vv_i8m2(__VA_ARGS__) +#define vsmul_vx_i8m2(...) __riscv_vsmul_vx_i8m2(__VA_ARGS__) +#define vsmul_vv_i8m4(...) __riscv_vsmul_vv_i8m4(__VA_ARGS__) +#define vsmul_vx_i8m4(...) __riscv_vsmul_vx_i8m4(__VA_ARGS__) +#define vsmul_vv_i8m8(...) __riscv_vsmul_vv_i8m8(__VA_ARGS__) +#define vsmul_vx_i8m8(...) __riscv_vsmul_vx_i8m8(__VA_ARGS__) +#define vsmul_vv_i16mf4(...) __riscv_vsmul_vv_i16mf4(__VA_ARGS__) +#define vsmul_vx_i16mf4(...) __riscv_vsmul_vx_i16mf4(__VA_ARGS__) +#define vsmul_vv_i16mf2(...) __riscv_vsmul_vv_i16mf2(__VA_ARGS__) +#define vsmul_vx_i16mf2(...) __riscv_vsmul_vx_i16mf2(__VA_ARGS__) +#define vsmul_vv_i16m1(...) __riscv_vsmul_vv_i16m1(__VA_ARGS__) +#define vsmul_vx_i16m1(...) __riscv_vsmul_vx_i16m1(__VA_ARGS__) +#define vsmul_vv_i16m2(...) __riscv_vsmul_vv_i16m2(__VA_ARGS__) +#define vsmul_vx_i16m2(...) __riscv_vsmul_vx_i16m2(__VA_ARGS__) +#define vsmul_vv_i16m4(...) __riscv_vsmul_vv_i16m4(__VA_ARGS__) +#define vsmul_vx_i16m4(...) __riscv_vsmul_vx_i16m4(__VA_ARGS__) +#define vsmul_vv_i16m8(...) __riscv_vsmul_vv_i16m8(__VA_ARGS__) +#define vsmul_vx_i16m8(...) __riscv_vsmul_vx_i16m8(__VA_ARGS__) +#define vsmul_vv_i32mf2(...) __riscv_vsmul_vv_i32mf2(__VA_ARGS__) +#define vsmul_vx_i32mf2(...) __riscv_vsmul_vx_i32mf2(__VA_ARGS__) +#define vsmul_vv_i32m1(...) __riscv_vsmul_vv_i32m1(__VA_ARGS__) +#define vsmul_vx_i32m1(...) __riscv_vsmul_vx_i32m1(__VA_ARGS__) +#define vsmul_vv_i32m2(...) __riscv_vsmul_vv_i32m2(__VA_ARGS__) +#define vsmul_vx_i32m2(...) __riscv_vsmul_vx_i32m2(__VA_ARGS__) +#define vsmul_vv_i32m4(...) __riscv_vsmul_vv_i32m4(__VA_ARGS__) +#define vsmul_vx_i32m4(...) __riscv_vsmul_vx_i32m4(__VA_ARGS__) +#define vsmul_vv_i32m8(...) __riscv_vsmul_vv_i32m8(__VA_ARGS__) +#define vsmul_vx_i32m8(...) __riscv_vsmul_vx_i32m8(__VA_ARGS__) +#define vsmul_vv_i64m1(...) __riscv_vsmul_vv_i64m1(__VA_ARGS__) +#define vsmul_vx_i64m1(...) __riscv_vsmul_vx_i64m1(__VA_ARGS__) +#define vsmul_vv_i64m2(...) __riscv_vsmul_vv_i64m2(__VA_ARGS__) +#define vsmul_vx_i64m2(...) __riscv_vsmul_vx_i64m2(__VA_ARGS__) +#define vsmul_vv_i64m4(...) __riscv_vsmul_vv_i64m4(__VA_ARGS__) +#define vsmul_vx_i64m4(...) __riscv_vsmul_vx_i64m4(__VA_ARGS__) +#define vsmul_vv_i64m8(...) __riscv_vsmul_vv_i64m8(__VA_ARGS__) +#define vsmul_vx_i64m8(...) __riscv_vsmul_vx_i64m8(__VA_ARGS__) +// masked functions +#define vsmul_vv_i8mf8_m(...) __riscv_vsmul_vv_i8mf8_mu(__VA_ARGS__) +#define vsmul_vx_i8mf8_m(...) __riscv_vsmul_vx_i8mf8_mu(__VA_ARGS__) +#define vsmul_vv_i8mf4_m(...) __riscv_vsmul_vv_i8mf4_mu(__VA_ARGS__) +#define vsmul_vx_i8mf4_m(...) __riscv_vsmul_vx_i8mf4_mu(__VA_ARGS__) +#define vsmul_vv_i8mf2_m(...) __riscv_vsmul_vv_i8mf2_mu(__VA_ARGS__) +#define vsmul_vx_i8mf2_m(...) __riscv_vsmul_vx_i8mf2_mu(__VA_ARGS__) +#define vsmul_vv_i8m1_m(...) __riscv_vsmul_vv_i8m1_mu(__VA_ARGS__) +#define vsmul_vx_i8m1_m(...) __riscv_vsmul_vx_i8m1_mu(__VA_ARGS__) +#define vsmul_vv_i8m2_m(...) __riscv_vsmul_vv_i8m2_mu(__VA_ARGS__) +#define vsmul_vx_i8m2_m(...) __riscv_vsmul_vx_i8m2_mu(__VA_ARGS__) +#define vsmul_vv_i8m4_m(...) __riscv_vsmul_vv_i8m4_mu(__VA_ARGS__) +#define vsmul_vx_i8m4_m(...) __riscv_vsmul_vx_i8m4_mu(__VA_ARGS__) +#define vsmul_vv_i8m8_m(...) __riscv_vsmul_vv_i8m8_mu(__VA_ARGS__) +#define vsmul_vx_i8m8_m(...) __riscv_vsmul_vx_i8m8_mu(__VA_ARGS__) +#define vsmul_vv_i16mf4_m(...) __riscv_vsmul_vv_i16mf4_mu(__VA_ARGS__) +#define vsmul_vx_i16mf4_m(...) __riscv_vsmul_vx_i16mf4_mu(__VA_ARGS__) +#define vsmul_vv_i16mf2_m(...) __riscv_vsmul_vv_i16mf2_mu(__VA_ARGS__) +#define vsmul_vx_i16mf2_m(...) __riscv_vsmul_vx_i16mf2_mu(__VA_ARGS__) +#define vsmul_vv_i16m1_m(...) __riscv_vsmul_vv_i16m1_mu(__VA_ARGS__) +#define vsmul_vx_i16m1_m(...) __riscv_vsmul_vx_i16m1_mu(__VA_ARGS__) +#define vsmul_vv_i16m2_m(...) __riscv_vsmul_vv_i16m2_mu(__VA_ARGS__) +#define vsmul_vx_i16m2_m(...) __riscv_vsmul_vx_i16m2_mu(__VA_ARGS__) +#define vsmul_vv_i16m4_m(...) __riscv_vsmul_vv_i16m4_mu(__VA_ARGS__) +#define vsmul_vx_i16m4_m(...) __riscv_vsmul_vx_i16m4_mu(__VA_ARGS__) +#define vsmul_vv_i16m8_m(...) __riscv_vsmul_vv_i16m8_mu(__VA_ARGS__) +#define vsmul_vx_i16m8_m(...) __riscv_vsmul_vx_i16m8_mu(__VA_ARGS__) +#define vsmul_vv_i32mf2_m(...) __riscv_vsmul_vv_i32mf2_mu(__VA_ARGS__) +#define vsmul_vx_i32mf2_m(...) __riscv_vsmul_vx_i32mf2_mu(__VA_ARGS__) +#define vsmul_vv_i32m1_m(...) __riscv_vsmul_vv_i32m1_mu(__VA_ARGS__) +#define vsmul_vx_i32m1_m(...) __riscv_vsmul_vx_i32m1_mu(__VA_ARGS__) +#define vsmul_vv_i32m2_m(...) __riscv_vsmul_vv_i32m2_mu(__VA_ARGS__) +#define vsmul_vx_i32m2_m(...) __riscv_vsmul_vx_i32m2_mu(__VA_ARGS__) +#define vsmul_vv_i32m4_m(...) __riscv_vsmul_vv_i32m4_mu(__VA_ARGS__) +#define vsmul_vx_i32m4_m(...) __riscv_vsmul_vx_i32m4_mu(__VA_ARGS__) +#define vsmul_vv_i32m8_m(...) __riscv_vsmul_vv_i32m8_mu(__VA_ARGS__) +#define vsmul_vx_i32m8_m(...) __riscv_vsmul_vx_i32m8_mu(__VA_ARGS__) +#define vsmul_vv_i64m1_m(...) __riscv_vsmul_vv_i64m1_mu(__VA_ARGS__) +#define vsmul_vx_i64m1_m(...) __riscv_vsmul_vx_i64m1_mu(__VA_ARGS__) +#define vsmul_vv_i64m2_m(...) __riscv_vsmul_vv_i64m2_mu(__VA_ARGS__) +#define vsmul_vx_i64m2_m(...) __riscv_vsmul_vx_i64m2_mu(__VA_ARGS__) +#define vsmul_vv_i64m4_m(...) __riscv_vsmul_vv_i64m4_mu(__VA_ARGS__) +#define vsmul_vx_i64m4_m(...) __riscv_vsmul_vx_i64m4_mu(__VA_ARGS__) +#define vsmul_vv_i64m8_m(...) __riscv_vsmul_vv_i64m8_mu(__VA_ARGS__) +#define vsmul_vx_i64m8_m(...) __riscv_vsmul_vx_i64m8_mu(__VA_ARGS__) +#define vssra_vv_i8mf8(...) __riscv_vssra_vv_i8mf8(__VA_ARGS__) +#define vssra_vx_i8mf8(...) __riscv_vssra_vx_i8mf8(__VA_ARGS__) +#define vssra_vv_i8mf4(...) __riscv_vssra_vv_i8mf4(__VA_ARGS__) +#define vssra_vx_i8mf4(...) __riscv_vssra_vx_i8mf4(__VA_ARGS__) +#define vssra_vv_i8mf2(...) __riscv_vssra_vv_i8mf2(__VA_ARGS__) +#define vssra_vx_i8mf2(...) __riscv_vssra_vx_i8mf2(__VA_ARGS__) +#define vssra_vv_i8m1(...) __riscv_vssra_vv_i8m1(__VA_ARGS__) +#define vssra_vx_i8m1(...) __riscv_vssra_vx_i8m1(__VA_ARGS__) +#define vssra_vv_i8m2(...) __riscv_vssra_vv_i8m2(__VA_ARGS__) +#define vssra_vx_i8m2(...) __riscv_vssra_vx_i8m2(__VA_ARGS__) +#define vssra_vv_i8m4(...) __riscv_vssra_vv_i8m4(__VA_ARGS__) +#define vssra_vx_i8m4(...) __riscv_vssra_vx_i8m4(__VA_ARGS__) +#define vssra_vv_i8m8(...) __riscv_vssra_vv_i8m8(__VA_ARGS__) +#define vssra_vx_i8m8(...) __riscv_vssra_vx_i8m8(__VA_ARGS__) +#define vssra_vv_i16mf4(...) __riscv_vssra_vv_i16mf4(__VA_ARGS__) +#define vssra_vx_i16mf4(...) __riscv_vssra_vx_i16mf4(__VA_ARGS__) +#define vssra_vv_i16mf2(...) __riscv_vssra_vv_i16mf2(__VA_ARGS__) +#define vssra_vx_i16mf2(...) __riscv_vssra_vx_i16mf2(__VA_ARGS__) +#define vssra_vv_i16m1(...) __riscv_vssra_vv_i16m1(__VA_ARGS__) +#define vssra_vx_i16m1(...) __riscv_vssra_vx_i16m1(__VA_ARGS__) +#define vssra_vv_i16m2(...) __riscv_vssra_vv_i16m2(__VA_ARGS__) +#define vssra_vx_i16m2(...) __riscv_vssra_vx_i16m2(__VA_ARGS__) +#define vssra_vv_i16m4(...) __riscv_vssra_vv_i16m4(__VA_ARGS__) +#define vssra_vx_i16m4(...) __riscv_vssra_vx_i16m4(__VA_ARGS__) +#define vssra_vv_i16m8(...) __riscv_vssra_vv_i16m8(__VA_ARGS__) +#define vssra_vx_i16m8(...) __riscv_vssra_vx_i16m8(__VA_ARGS__) +#define vssra_vv_i32mf2(...) __riscv_vssra_vv_i32mf2(__VA_ARGS__) +#define vssra_vx_i32mf2(...) __riscv_vssra_vx_i32mf2(__VA_ARGS__) +#define vssra_vv_i32m1(...) __riscv_vssra_vv_i32m1(__VA_ARGS__) +#define vssra_vx_i32m1(...) __riscv_vssra_vx_i32m1(__VA_ARGS__) +#define vssra_vv_i32m2(...) __riscv_vssra_vv_i32m2(__VA_ARGS__) +#define vssra_vx_i32m2(...) __riscv_vssra_vx_i32m2(__VA_ARGS__) +#define vssra_vv_i32m4(...) __riscv_vssra_vv_i32m4(__VA_ARGS__) +#define vssra_vx_i32m4(...) __riscv_vssra_vx_i32m4(__VA_ARGS__) +#define vssra_vv_i32m8(...) __riscv_vssra_vv_i32m8(__VA_ARGS__) +#define vssra_vx_i32m8(...) __riscv_vssra_vx_i32m8(__VA_ARGS__) +#define vssra_vv_i64m1(...) __riscv_vssra_vv_i64m1(__VA_ARGS__) +#define vssra_vx_i64m1(...) __riscv_vssra_vx_i64m1(__VA_ARGS__) +#define vssra_vv_i64m2(...) __riscv_vssra_vv_i64m2(__VA_ARGS__) +#define vssra_vx_i64m2(...) __riscv_vssra_vx_i64m2(__VA_ARGS__) +#define vssra_vv_i64m4(...) __riscv_vssra_vv_i64m4(__VA_ARGS__) +#define vssra_vx_i64m4(...) __riscv_vssra_vx_i64m4(__VA_ARGS__) +#define vssra_vv_i64m8(...) __riscv_vssra_vv_i64m8(__VA_ARGS__) +#define vssra_vx_i64m8(...) __riscv_vssra_vx_i64m8(__VA_ARGS__) +#define vssrl_vv_u8mf8(...) __riscv_vssrl_vv_u8mf8(__VA_ARGS__) +#define vssrl_vx_u8mf8(...) __riscv_vssrl_vx_u8mf8(__VA_ARGS__) +#define vssrl_vv_u8mf4(...) __riscv_vssrl_vv_u8mf4(__VA_ARGS__) +#define vssrl_vx_u8mf4(...) __riscv_vssrl_vx_u8mf4(__VA_ARGS__) +#define vssrl_vv_u8mf2(...) __riscv_vssrl_vv_u8mf2(__VA_ARGS__) +#define vssrl_vx_u8mf2(...) __riscv_vssrl_vx_u8mf2(__VA_ARGS__) +#define vssrl_vv_u8m1(...) __riscv_vssrl_vv_u8m1(__VA_ARGS__) +#define vssrl_vx_u8m1(...) __riscv_vssrl_vx_u8m1(__VA_ARGS__) +#define vssrl_vv_u8m2(...) __riscv_vssrl_vv_u8m2(__VA_ARGS__) +#define vssrl_vx_u8m2(...) __riscv_vssrl_vx_u8m2(__VA_ARGS__) +#define vssrl_vv_u8m4(...) __riscv_vssrl_vv_u8m4(__VA_ARGS__) +#define vssrl_vx_u8m4(...) __riscv_vssrl_vx_u8m4(__VA_ARGS__) +#define vssrl_vv_u8m8(...) __riscv_vssrl_vv_u8m8(__VA_ARGS__) +#define vssrl_vx_u8m8(...) __riscv_vssrl_vx_u8m8(__VA_ARGS__) +#define vssrl_vv_u16mf4(...) __riscv_vssrl_vv_u16mf4(__VA_ARGS__) +#define vssrl_vx_u16mf4(...) __riscv_vssrl_vx_u16mf4(__VA_ARGS__) +#define vssrl_vv_u16mf2(...) __riscv_vssrl_vv_u16mf2(__VA_ARGS__) +#define vssrl_vx_u16mf2(...) __riscv_vssrl_vx_u16mf2(__VA_ARGS__) +#define vssrl_vv_u16m1(...) __riscv_vssrl_vv_u16m1(__VA_ARGS__) +#define vssrl_vx_u16m1(...) __riscv_vssrl_vx_u16m1(__VA_ARGS__) +#define vssrl_vv_u16m2(...) __riscv_vssrl_vv_u16m2(__VA_ARGS__) +#define vssrl_vx_u16m2(...) __riscv_vssrl_vx_u16m2(__VA_ARGS__) +#define vssrl_vv_u16m4(...) __riscv_vssrl_vv_u16m4(__VA_ARGS__) +#define vssrl_vx_u16m4(...) __riscv_vssrl_vx_u16m4(__VA_ARGS__) +#define vssrl_vv_u16m8(...) __riscv_vssrl_vv_u16m8(__VA_ARGS__) +#define vssrl_vx_u16m8(...) __riscv_vssrl_vx_u16m8(__VA_ARGS__) +#define vssrl_vv_u32mf2(...) __riscv_vssrl_vv_u32mf2(__VA_ARGS__) +#define vssrl_vx_u32mf2(...) __riscv_vssrl_vx_u32mf2(__VA_ARGS__) +#define vssrl_vv_u32m1(...) __riscv_vssrl_vv_u32m1(__VA_ARGS__) +#define vssrl_vx_u32m1(...) __riscv_vssrl_vx_u32m1(__VA_ARGS__) +#define vssrl_vv_u32m2(...) __riscv_vssrl_vv_u32m2(__VA_ARGS__) +#define vssrl_vx_u32m2(...) __riscv_vssrl_vx_u32m2(__VA_ARGS__) +#define vssrl_vv_u32m4(...) __riscv_vssrl_vv_u32m4(__VA_ARGS__) +#define vssrl_vx_u32m4(...) __riscv_vssrl_vx_u32m4(__VA_ARGS__) +#define vssrl_vv_u32m8(...) __riscv_vssrl_vv_u32m8(__VA_ARGS__) +#define vssrl_vx_u32m8(...) __riscv_vssrl_vx_u32m8(__VA_ARGS__) +#define vssrl_vv_u64m1(...) __riscv_vssrl_vv_u64m1(__VA_ARGS__) +#define vssrl_vx_u64m1(...) __riscv_vssrl_vx_u64m1(__VA_ARGS__) +#define vssrl_vv_u64m2(...) __riscv_vssrl_vv_u64m2(__VA_ARGS__) +#define vssrl_vx_u64m2(...) __riscv_vssrl_vx_u64m2(__VA_ARGS__) +#define vssrl_vv_u64m4(...) __riscv_vssrl_vv_u64m4(__VA_ARGS__) +#define vssrl_vx_u64m4(...) __riscv_vssrl_vx_u64m4(__VA_ARGS__) +#define vssrl_vv_u64m8(...) __riscv_vssrl_vv_u64m8(__VA_ARGS__) +#define vssrl_vx_u64m8(...) __riscv_vssrl_vx_u64m8(__VA_ARGS__) +// masked functions +#define vssra_vv_i8mf8_m(...) __riscv_vssra_vv_i8mf8_tumu(__VA_ARGS__) +#define vssra_vx_i8mf8_m(...) __riscv_vssra_vx_i8mf8_tumu(__VA_ARGS__) +#define vssra_vv_i8mf4_m(...) __riscv_vssra_vv_i8mf4_tumu(__VA_ARGS__) +#define vssra_vx_i8mf4_m(...) __riscv_vssra_vx_i8mf4_tumu(__VA_ARGS__) +#define vssra_vv_i8mf2_m(...) __riscv_vssra_vv_i8mf2_tumu(__VA_ARGS__) +#define vssra_vx_i8mf2_m(...) __riscv_vssra_vx_i8mf2_tumu(__VA_ARGS__) +#define vssra_vv_i8m1_m(...) __riscv_vssra_vv_i8m1_tumu(__VA_ARGS__) +#define vssra_vx_i8m1_m(...) __riscv_vssra_vx_i8m1_tumu(__VA_ARGS__) +#define vssra_vv_i8m2_m(...) __riscv_vssra_vv_i8m2_tumu(__VA_ARGS__) +#define vssra_vx_i8m2_m(...) __riscv_vssra_vx_i8m2_tumu(__VA_ARGS__) +#define vssra_vv_i8m4_m(...) __riscv_vssra_vv_i8m4_tumu(__VA_ARGS__) +#define vssra_vx_i8m4_m(...) __riscv_vssra_vx_i8m4_tumu(__VA_ARGS__) +#define vssra_vv_i8m8_m(...) __riscv_vssra_vv_i8m8_tumu(__VA_ARGS__) +#define vssra_vx_i8m8_m(...) __riscv_vssra_vx_i8m8_tumu(__VA_ARGS__) +#define vssra_vv_i16mf4_m(...) __riscv_vssra_vv_i16mf4_tumu(__VA_ARGS__) +#define vssra_vx_i16mf4_m(...) __riscv_vssra_vx_i16mf4_tumu(__VA_ARGS__) +#define vssra_vv_i16mf2_m(...) __riscv_vssra_vv_i16mf2_tumu(__VA_ARGS__) +#define vssra_vx_i16mf2_m(...) __riscv_vssra_vx_i16mf2_tumu(__VA_ARGS__) +#define vssra_vv_i16m1_m(...) __riscv_vssra_vv_i16m1_tumu(__VA_ARGS__) +#define vssra_vx_i16m1_m(...) __riscv_vssra_vx_i16m1_tumu(__VA_ARGS__) +#define vssra_vv_i16m2_m(...) __riscv_vssra_vv_i16m2_tumu(__VA_ARGS__) +#define vssra_vx_i16m2_m(...) __riscv_vssra_vx_i16m2_tumu(__VA_ARGS__) +#define vssra_vv_i16m4_m(...) __riscv_vssra_vv_i16m4_tumu(__VA_ARGS__) +#define vssra_vx_i16m4_m(...) __riscv_vssra_vx_i16m4_tumu(__VA_ARGS__) +#define vssra_vv_i16m8_m(...) __riscv_vssra_vv_i16m8_tumu(__VA_ARGS__) +#define vssra_vx_i16m8_m(...) __riscv_vssra_vx_i16m8_tumu(__VA_ARGS__) +#define vssra_vv_i32mf2_m(...) __riscv_vssra_vv_i32mf2_tumu(__VA_ARGS__) +#define vssra_vx_i32mf2_m(...) __riscv_vssra_vx_i32mf2_tumu(__VA_ARGS__) +#define vssra_vv_i32m1_m(...) __riscv_vssra_vv_i32m1_tumu(__VA_ARGS__) +#define vssra_vx_i32m1_m(...) __riscv_vssra_vx_i32m1_tumu(__VA_ARGS__) +#define vssra_vv_i32m2_m(...) __riscv_vssra_vv_i32m2_tumu(__VA_ARGS__) +#define vssra_vx_i32m2_m(...) __riscv_vssra_vx_i32m2_tumu(__VA_ARGS__) +#define vssra_vv_i32m4_m(...) __riscv_vssra_vv_i32m4_tumu(__VA_ARGS__) +#define vssra_vx_i32m4_m(...) __riscv_vssra_vx_i32m4_tumu(__VA_ARGS__) +#define vssra_vv_i32m8_m(...) __riscv_vssra_vv_i32m8_tumu(__VA_ARGS__) +#define vssra_vx_i32m8_m(...) __riscv_vssra_vx_i32m8_tumu(__VA_ARGS__) +#define vssra_vv_i64m1_m(...) __riscv_vssra_vv_i64m1_tumu(__VA_ARGS__) +#define vssra_vx_i64m1_m(...) __riscv_vssra_vx_i64m1_tumu(__VA_ARGS__) +#define vssra_vv_i64m2_m(...) __riscv_vssra_vv_i64m2_tumu(__VA_ARGS__) +#define vssra_vx_i64m2_m(...) __riscv_vssra_vx_i64m2_tumu(__VA_ARGS__) +#define vssra_vv_i64m4_m(...) __riscv_vssra_vv_i64m4_tumu(__VA_ARGS__) +#define vssra_vx_i64m4_m(...) __riscv_vssra_vx_i64m4_tumu(__VA_ARGS__) +#define vssra_vv_i64m8_m(...) __riscv_vssra_vv_i64m8_tumu(__VA_ARGS__) +#define vssra_vx_i64m8_m(...) __riscv_vssra_vx_i64m8_tumu(__VA_ARGS__) +#define vssrl_vv_u8mf8_m(...) __riscv_vssrl_vv_u8mf8_tumu(__VA_ARGS__) +#define vssrl_vx_u8mf8_m(...) __riscv_vssrl_vx_u8mf8_tumu(__VA_ARGS__) +#define vssrl_vv_u8mf4_m(...) __riscv_vssrl_vv_u8mf4_tumu(__VA_ARGS__) +#define vssrl_vx_u8mf4_m(...) __riscv_vssrl_vx_u8mf4_tumu(__VA_ARGS__) +#define vssrl_vv_u8mf2_m(...) __riscv_vssrl_vv_u8mf2_tumu(__VA_ARGS__) +#define vssrl_vx_u8mf2_m(...) __riscv_vssrl_vx_u8mf2_tumu(__VA_ARGS__) +#define vssrl_vv_u8m1_m(...) __riscv_vssrl_vv_u8m1_tumu(__VA_ARGS__) +#define vssrl_vx_u8m1_m(...) __riscv_vssrl_vx_u8m1_tumu(__VA_ARGS__) +#define vssrl_vv_u8m2_m(...) __riscv_vssrl_vv_u8m2_tumu(__VA_ARGS__) +#define vssrl_vx_u8m2_m(...) __riscv_vssrl_vx_u8m2_tumu(__VA_ARGS__) +#define vssrl_vv_u8m4_m(...) __riscv_vssrl_vv_u8m4_tumu(__VA_ARGS__) +#define vssrl_vx_u8m4_m(...) __riscv_vssrl_vx_u8m4_tumu(__VA_ARGS__) +#define vssrl_vv_u8m8_m(...) __riscv_vssrl_vv_u8m8_tumu(__VA_ARGS__) +#define vssrl_vx_u8m8_m(...) __riscv_vssrl_vx_u8m8_tumu(__VA_ARGS__) +#define vssrl_vv_u16mf4_m(...) __riscv_vssrl_vv_u16mf4_tumu(__VA_ARGS__) +#define vssrl_vx_u16mf4_m(...) __riscv_vssrl_vx_u16mf4_tumu(__VA_ARGS__) +#define vssrl_vv_u16mf2_m(...) __riscv_vssrl_vv_u16mf2_tumu(__VA_ARGS__) +#define vssrl_vx_u16mf2_m(...) __riscv_vssrl_vx_u16mf2_tumu(__VA_ARGS__) +#define vssrl_vv_u16m1_m(...) __riscv_vssrl_vv_u16m1_tumu(__VA_ARGS__) +#define vssrl_vx_u16m1_m(...) __riscv_vssrl_vx_u16m1_tumu(__VA_ARGS__) +#define vssrl_vv_u16m2_m(...) __riscv_vssrl_vv_u16m2_tumu(__VA_ARGS__) +#define vssrl_vx_u16m2_m(...) __riscv_vssrl_vx_u16m2_tumu(__VA_ARGS__) +#define vssrl_vv_u16m4_m(...) __riscv_vssrl_vv_u16m4_tumu(__VA_ARGS__) +#define vssrl_vx_u16m4_m(...) __riscv_vssrl_vx_u16m4_tumu(__VA_ARGS__) +#define vssrl_vv_u16m8_m(...) __riscv_vssrl_vv_u16m8_tumu(__VA_ARGS__) +#define vssrl_vx_u16m8_m(...) __riscv_vssrl_vx_u16m8_tumu(__VA_ARGS__) +#define vssrl_vv_u32mf2_m(...) __riscv_vssrl_vv_u32mf2_tumu(__VA_ARGS__) +#define vssrl_vx_u32mf2_m(...) __riscv_vssrl_vx_u32mf2_tumu(__VA_ARGS__) +#define vssrl_vv_u32m1_m(...) __riscv_vssrl_vv_u32m1_tumu(__VA_ARGS__) +#define vssrl_vx_u32m1_m(...) __riscv_vssrl_vx_u32m1_tumu(__VA_ARGS__) +#define vssrl_vv_u32m2_m(...) __riscv_vssrl_vv_u32m2_tumu(__VA_ARGS__) +#define vssrl_vx_u32m2_m(...) __riscv_vssrl_vx_u32m2_tumu(__VA_ARGS__) +#define vssrl_vv_u32m4_m(...) __riscv_vssrl_vv_u32m4_tumu(__VA_ARGS__) +#define vssrl_vx_u32m4_m(...) __riscv_vssrl_vx_u32m4_tumu(__VA_ARGS__) +#define vssrl_vv_u32m8_m(...) __riscv_vssrl_vv_u32m8_tumu(__VA_ARGS__) +#define vssrl_vx_u32m8_m(...) __riscv_vssrl_vx_u32m8_tumu(__VA_ARGS__) +#define vssrl_vv_u64m1_m(...) __riscv_vssrl_vv_u64m1_tumu(__VA_ARGS__) +#define vssrl_vx_u64m1_m(...) __riscv_vssrl_vx_u64m1_tumu(__VA_ARGS__) +#define vssrl_vv_u64m2_m(...) __riscv_vssrl_vv_u64m2_tumu(__VA_ARGS__) +#define vssrl_vx_u64m2_m(...) __riscv_vssrl_vx_u64m2_tumu(__VA_ARGS__) +#define vssrl_vv_u64m4_m(...) __riscv_vssrl_vv_u64m4_tumu(__VA_ARGS__) +#define vssrl_vx_u64m4_m(...) __riscv_vssrl_vx_u64m4_tumu(__VA_ARGS__) +#define vssrl_vv_u64m8_m(...) __riscv_vssrl_vv_u64m8_tumu(__VA_ARGS__) +#define vssrl_vx_u64m8_m(...) __riscv_vssrl_vx_u64m8_tumu(__VA_ARGS__) +#define vnclip_wv_i8mf8(...) __riscv_vnclip_wv_i8mf8(__VA_ARGS__) +#define vnclip_wx_i8mf8(...) __riscv_vnclip_wx_i8mf8(__VA_ARGS__) +#define vnclip_wv_i8mf4(...) __riscv_vnclip_wv_i8mf4(__VA_ARGS__) +#define vnclip_wx_i8mf4(...) __riscv_vnclip_wx_i8mf4(__VA_ARGS__) +#define vnclip_wv_i8mf2(...) __riscv_vnclip_wv_i8mf2(__VA_ARGS__) +#define vnclip_wx_i8mf2(...) __riscv_vnclip_wx_i8mf2(__VA_ARGS__) +#define vnclip_wv_i8m1(...) __riscv_vnclip_wv_i8m1(__VA_ARGS__) +#define vnclip_wx_i8m1(...) __riscv_vnclip_wx_i8m1(__VA_ARGS__) +#define vnclip_wv_i8m2(...) __riscv_vnclip_wv_i8m2(__VA_ARGS__) +#define vnclip_wx_i8m2(...) __riscv_vnclip_wx_i8m2(__VA_ARGS__) +#define vnclip_wv_i8m4(...) __riscv_vnclip_wv_i8m4(__VA_ARGS__) +#define vnclip_wx_i8m4(...) __riscv_vnclip_wx_i8m4(__VA_ARGS__) +#define vnclip_wv_i16mf4(...) __riscv_vnclip_wv_i16mf4(__VA_ARGS__) +#define vnclip_wx_i16mf4(...) __riscv_vnclip_wx_i16mf4(__VA_ARGS__) +#define vnclip_wv_i16mf2(...) __riscv_vnclip_wv_i16mf2(__VA_ARGS__) +#define vnclip_wx_i16mf2(...) __riscv_vnclip_wx_i16mf2(__VA_ARGS__) +#define vnclip_wv_i16m1(...) __riscv_vnclip_wv_i16m1(__VA_ARGS__) +#define vnclip_wx_i16m1(...) __riscv_vnclip_wx_i16m1(__VA_ARGS__) +#define vnclip_wv_i16m2(...) __riscv_vnclip_wv_i16m2(__VA_ARGS__) +#define vnclip_wx_i16m2(...) __riscv_vnclip_wx_i16m2(__VA_ARGS__) +#define vnclip_wv_i16m4(...) __riscv_vnclip_wv_i16m4(__VA_ARGS__) +#define vnclip_wx_i16m4(...) __riscv_vnclip_wx_i16m4(__VA_ARGS__) +#define vnclip_wv_i32mf2(...) __riscv_vnclip_wv_i32mf2(__VA_ARGS__) +#define vnclip_wx_i32mf2(...) __riscv_vnclip_wx_i32mf2(__VA_ARGS__) +#define vnclip_wv_i32m1(...) __riscv_vnclip_wv_i32m1(__VA_ARGS__) +#define vnclip_wx_i32m1(...) __riscv_vnclip_wx_i32m1(__VA_ARGS__) +#define vnclip_wv_i32m2(...) __riscv_vnclip_wv_i32m2(__VA_ARGS__) +#define vnclip_wx_i32m2(...) __riscv_vnclip_wx_i32m2(__VA_ARGS__) +#define vnclip_wv_i32m4(...) __riscv_vnclip_wv_i32m4(__VA_ARGS__) +#define vnclip_wx_i32m4(...) __riscv_vnclip_wx_i32m4(__VA_ARGS__) +#define vnclipu_wv_u8mf8(...) __riscv_vnclipu_wv_u8mf8(__VA_ARGS__) +#define vnclipu_wx_u8mf8(...) __riscv_vnclipu_wx_u8mf8(__VA_ARGS__) +#define vnclipu_wv_u8mf4(...) __riscv_vnclipu_wv_u8mf4(__VA_ARGS__) +#define vnclipu_wx_u8mf4(...) __riscv_vnclipu_wx_u8mf4(__VA_ARGS__) +#define vnclipu_wv_u8mf2(...) __riscv_vnclipu_wv_u8mf2(__VA_ARGS__) +#define vnclipu_wx_u8mf2(...) __riscv_vnclipu_wx_u8mf2(__VA_ARGS__) +#define vnclipu_wv_u8m1(...) __riscv_vnclipu_wv_u8m1(__VA_ARGS__) +#define vnclipu_wx_u8m1(...) __riscv_vnclipu_wx_u8m1(__VA_ARGS__) +#define vnclipu_wv_u8m2(...) __riscv_vnclipu_wv_u8m2(__VA_ARGS__) +#define vnclipu_wx_u8m2(...) __riscv_vnclipu_wx_u8m2(__VA_ARGS__) +#define vnclipu_wv_u8m4(...) __riscv_vnclipu_wv_u8m4(__VA_ARGS__) +#define vnclipu_wx_u8m4(...) __riscv_vnclipu_wx_u8m4(__VA_ARGS__) +#define vnclipu_wv_u16mf4(...) __riscv_vnclipu_wv_u16mf4(__VA_ARGS__) +#define vnclipu_wx_u16mf4(...) __riscv_vnclipu_wx_u16mf4(__VA_ARGS__) +#define vnclipu_wv_u16mf2(...) __riscv_vnclipu_wv_u16mf2(__VA_ARGS__) +#define vnclipu_wx_u16mf2(...) __riscv_vnclipu_wx_u16mf2(__VA_ARGS__) +#define vnclipu_wv_u16m1(...) __riscv_vnclipu_wv_u16m1(__VA_ARGS__) +#define vnclipu_wx_u16m1(...) __riscv_vnclipu_wx_u16m1(__VA_ARGS__) +#define vnclipu_wv_u16m2(...) __riscv_vnclipu_wv_u16m2(__VA_ARGS__) +#define vnclipu_wx_u16m2(...) __riscv_vnclipu_wx_u16m2(__VA_ARGS__) +#define vnclipu_wv_u16m4(...) __riscv_vnclipu_wv_u16m4(__VA_ARGS__) +#define vnclipu_wx_u16m4(...) __riscv_vnclipu_wx_u16m4(__VA_ARGS__) +#define vnclipu_wv_u32mf2(...) __riscv_vnclipu_wv_u32mf2(__VA_ARGS__) +#define vnclipu_wx_u32mf2(...) __riscv_vnclipu_wx_u32mf2(__VA_ARGS__) +#define vnclipu_wv_u32m1(...) __riscv_vnclipu_wv_u32m1(__VA_ARGS__) +#define vnclipu_wx_u32m1(...) __riscv_vnclipu_wx_u32m1(__VA_ARGS__) +#define vnclipu_wv_u32m2(...) __riscv_vnclipu_wv_u32m2(__VA_ARGS__) +#define vnclipu_wx_u32m2(...) __riscv_vnclipu_wx_u32m2(__VA_ARGS__) +#define vnclipu_wv_u32m4(...) __riscv_vnclipu_wv_u32m4(__VA_ARGS__) +#define vnclipu_wx_u32m4(...) __riscv_vnclipu_wx_u32m4(__VA_ARGS__) +// masked functions +#define vnclip_wv_i8mf8_m(...) __riscv_vnclip_wv_i8mf8_tumu(__VA_ARGS__) +#define vnclip_wx_i8mf8_m(...) __riscv_vnclip_wx_i8mf8_tumu(__VA_ARGS__) +#define vnclip_wv_i8mf4_m(...) __riscv_vnclip_wv_i8mf4_tumu(__VA_ARGS__) +#define vnclip_wx_i8mf4_m(...) __riscv_vnclip_wx_i8mf4_tumu(__VA_ARGS__) +#define vnclip_wv_i8mf2_m(...) __riscv_vnclip_wv_i8mf2_tumu(__VA_ARGS__) +#define vnclip_wx_i8mf2_m(...) __riscv_vnclip_wx_i8mf2_tumu(__VA_ARGS__) +#define vnclip_wv_i8m1_m(...) __riscv_vnclip_wv_i8m1_tumu(__VA_ARGS__) +#define vnclip_wx_i8m1_m(...) __riscv_vnclip_wx_i8m1_tumu(__VA_ARGS__) +#define vnclip_wv_i8m2_m(...) __riscv_vnclip_wv_i8m2_tumu(__VA_ARGS__) +#define vnclip_wx_i8m2_m(...) __riscv_vnclip_wx_i8m2_tumu(__VA_ARGS__) +#define vnclip_wv_i8m4_m(...) __riscv_vnclip_wv_i8m4_tumu(__VA_ARGS__) +#define vnclip_wx_i8m4_m(...) __riscv_vnclip_wx_i8m4_tumu(__VA_ARGS__) +#define vnclip_wv_i16mf4_m(...) __riscv_vnclip_wv_i16mf4_tumu(__VA_ARGS__) +#define vnclip_wx_i16mf4_m(...) __riscv_vnclip_wx_i16mf4_tumu(__VA_ARGS__) +#define vnclip_wv_i16mf2_m(...) __riscv_vnclip_wv_i16mf2_tumu(__VA_ARGS__) +#define vnclip_wx_i16mf2_m(...) __riscv_vnclip_wx_i16mf2_tumu(__VA_ARGS__) +#define vnclip_wv_i16m1_m(...) __riscv_vnclip_wv_i16m1_tumu(__VA_ARGS__) +#define vnclip_wx_i16m1_m(...) __riscv_vnclip_wx_i16m1_tumu(__VA_ARGS__) +#define vnclip_wv_i16m2_m(...) __riscv_vnclip_wv_i16m2_tumu(__VA_ARGS__) +#define vnclip_wx_i16m2_m(...) __riscv_vnclip_wx_i16m2_tumu(__VA_ARGS__) +#define vnclip_wv_i16m4_m(...) __riscv_vnclip_wv_i16m4_tumu(__VA_ARGS__) +#define vnclip_wx_i16m4_m(...) __riscv_vnclip_wx_i16m4_tumu(__VA_ARGS__) +#define vnclip_wv_i32mf2_m(...) __riscv_vnclip_wv_i32mf2_tumu(__VA_ARGS__) +#define vnclip_wx_i32mf2_m(...) __riscv_vnclip_wx_i32mf2_tumu(__VA_ARGS__) +#define vnclip_wv_i32m1_m(...) __riscv_vnclip_wv_i32m1_tumu(__VA_ARGS__) +#define vnclip_wx_i32m1_m(...) __riscv_vnclip_wx_i32m1_tumu(__VA_ARGS__) +#define vnclip_wv_i32m2_m(...) __riscv_vnclip_wv_i32m2_tumu(__VA_ARGS__) +#define vnclip_wx_i32m2_m(...) __riscv_vnclip_wx_i32m2_tumu(__VA_ARGS__) +#define vnclip_wv_i32m4_m(...) __riscv_vnclip_wv_i32m4_tumu(__VA_ARGS__) +#define vnclip_wx_i32m4_m(...) __riscv_vnclip_wx_i32m4_tumu(__VA_ARGS__) +#define vnclipu_wv_u8mf8_m(...) __riscv_vnclipu_wv_u8mf8_tumu(__VA_ARGS__) +#define vnclipu_wx_u8mf8_m(...) __riscv_vnclipu_wx_u8mf8_tumu(__VA_ARGS__) +#define vnclipu_wv_u8mf4_m(...) __riscv_vnclipu_wv_u8mf4_tumu(__VA_ARGS__) +#define vnclipu_wx_u8mf4_m(...) __riscv_vnclipu_wx_u8mf4_tumu(__VA_ARGS__) +#define vnclipu_wv_u8mf2_m(...) __riscv_vnclipu_wv_u8mf2_tumu(__VA_ARGS__) +#define vnclipu_wx_u8mf2_m(...) __riscv_vnclipu_wx_u8mf2_tumu(__VA_ARGS__) +#define vnclipu_wv_u8m1_m(...) __riscv_vnclipu_wv_u8m1_tumu(__VA_ARGS__) +#define vnclipu_wx_u8m1_m(...) __riscv_vnclipu_wx_u8m1_tumu(__VA_ARGS__) +#define vnclipu_wv_u8m2_m(...) __riscv_vnclipu_wv_u8m2_tumu(__VA_ARGS__) +#define vnclipu_wx_u8m2_m(...) __riscv_vnclipu_wx_u8m2_tumu(__VA_ARGS__) +#define vnclipu_wv_u8m4_m(...) __riscv_vnclipu_wv_u8m4_tumu(__VA_ARGS__) +#define vnclipu_wx_u8m4_m(...) __riscv_vnclipu_wx_u8m4_tumu(__VA_ARGS__) +#define vnclipu_wv_u16mf4_m(...) __riscv_vnclipu_wv_u16mf4_tumu(__VA_ARGS__) +#define vnclipu_wx_u16mf4_m(...) __riscv_vnclipu_wx_u16mf4_tumu(__VA_ARGS__) +#define vnclipu_wv_u16mf2_m(...) __riscv_vnclipu_wv_u16mf2_tumu(__VA_ARGS__) +#define vnclipu_wx_u16mf2_m(...) __riscv_vnclipu_wx_u16mf2_tumu(__VA_ARGS__) +#define vnclipu_wv_u16m1_m(...) __riscv_vnclipu_wv_u16m1_tumu(__VA_ARGS__) +#define vnclipu_wx_u16m1_m(...) __riscv_vnclipu_wx_u16m1_tumu(__VA_ARGS__) +#define vnclipu_wv_u16m2_m(...) __riscv_vnclipu_wv_u16m2_tumu(__VA_ARGS__) +#define vnclipu_wx_u16m2_m(...) __riscv_vnclipu_wx_u16m2_tumu(__VA_ARGS__) +#define vnclipu_wv_u16m4_m(...) __riscv_vnclipu_wv_u16m4_tumu(__VA_ARGS__) +#define vnclipu_wx_u16m4_m(...) __riscv_vnclipu_wx_u16m4_tumu(__VA_ARGS__) +#define vnclipu_wv_u32mf2_m(...) __riscv_vnclipu_wv_u32mf2_tumu(__VA_ARGS__) +#define vnclipu_wx_u32mf2_m(...) __riscv_vnclipu_wx_u32mf2_tumu(__VA_ARGS__) +#define vnclipu_wv_u32m1_m(...) __riscv_vnclipu_wv_u32m1_tumu(__VA_ARGS__) +#define vnclipu_wx_u32m1_m(...) __riscv_vnclipu_wx_u32m1_tumu(__VA_ARGS__) +#define vnclipu_wv_u32m2_m(...) __riscv_vnclipu_wv_u32m2_tumu(__VA_ARGS__) +#define vnclipu_wx_u32m2_m(...) __riscv_vnclipu_wx_u32m2_tumu(__VA_ARGS__) +#define vnclipu_wv_u32m4_m(...) __riscv_vnclipu_wv_u32m4_tumu(__VA_ARGS__) +#define vnclipu_wx_u32m4_m(...) __riscv_vnclipu_wx_u32m4_tumu(__VA_ARGS__) +#define vfadd_vv_f16mf4(...) __riscv_vfadd_vv_f16mf4(__VA_ARGS__) +#define vfadd_vf_f16mf4(...) __riscv_vfadd_vf_f16mf4(__VA_ARGS__) +#define vfadd_vv_f16mf2(...) __riscv_vfadd_vv_f16mf2(__VA_ARGS__) +#define vfadd_vf_f16mf2(...) __riscv_vfadd_vf_f16mf2(__VA_ARGS__) +#define vfadd_vv_f16m1(...) __riscv_vfadd_vv_f16m1(__VA_ARGS__) +#define vfadd_vf_f16m1(...) __riscv_vfadd_vf_f16m1(__VA_ARGS__) +#define vfadd_vv_f16m2(...) __riscv_vfadd_vv_f16m2(__VA_ARGS__) +#define vfadd_vf_f16m2(...) __riscv_vfadd_vf_f16m2(__VA_ARGS__) +#define vfadd_vv_f16m4(...) __riscv_vfadd_vv_f16m4(__VA_ARGS__) +#define vfadd_vf_f16m4(...) __riscv_vfadd_vf_f16m4(__VA_ARGS__) +#define vfadd_vv_f16m8(...) __riscv_vfadd_vv_f16m8(__VA_ARGS__) +#define vfadd_vf_f16m8(...) __riscv_vfadd_vf_f16m8(__VA_ARGS__) +#define vfadd_vv_f32mf2(...) __riscv_vfadd_vv_f32mf2(__VA_ARGS__) +#define vfadd_vf_f32mf2(...) __riscv_vfadd_vf_f32mf2(__VA_ARGS__) +#define vfadd_vv_f32m1(...) __riscv_vfadd_vv_f32m1(__VA_ARGS__) +#define vfadd_vf_f32m1(...) __riscv_vfadd_vf_f32m1(__VA_ARGS__) +#define vfadd_vv_f32m2(...) __riscv_vfadd_vv_f32m2(__VA_ARGS__) +#define vfadd_vf_f32m2(...) __riscv_vfadd_vf_f32m2(__VA_ARGS__) +#define vfadd_vv_f32m4(...) __riscv_vfadd_vv_f32m4(__VA_ARGS__) +#define vfadd_vf_f32m4(...) __riscv_vfadd_vf_f32m4(__VA_ARGS__) +#define vfadd_vv_f32m8(...) __riscv_vfadd_vv_f32m8(__VA_ARGS__) +#define vfadd_vf_f32m8(...) __riscv_vfadd_vf_f32m8(__VA_ARGS__) +#define vfadd_vv_f64m1(...) __riscv_vfadd_vv_f64m1(__VA_ARGS__) +#define vfadd_vf_f64m1(...) __riscv_vfadd_vf_f64m1(__VA_ARGS__) +#define vfadd_vv_f64m2(...) __riscv_vfadd_vv_f64m2(__VA_ARGS__) +#define vfadd_vf_f64m2(...) __riscv_vfadd_vf_f64m2(__VA_ARGS__) +#define vfadd_vv_f64m4(...) __riscv_vfadd_vv_f64m4(__VA_ARGS__) +#define vfadd_vf_f64m4(...) __riscv_vfadd_vf_f64m4(__VA_ARGS__) +#define vfadd_vv_f64m8(...) __riscv_vfadd_vv_f64m8(__VA_ARGS__) +#define vfadd_vf_f64m8(...) __riscv_vfadd_vf_f64m8(__VA_ARGS__) +#define vfsub_vv_f16mf4(...) __riscv_vfsub_vv_f16mf4(__VA_ARGS__) +#define vfsub_vf_f16mf4(...) __riscv_vfsub_vf_f16mf4(__VA_ARGS__) +#define vfsub_vv_f16mf2(...) __riscv_vfsub_vv_f16mf2(__VA_ARGS__) +#define vfsub_vf_f16mf2(...) __riscv_vfsub_vf_f16mf2(__VA_ARGS__) +#define vfsub_vv_f16m1(...) __riscv_vfsub_vv_f16m1(__VA_ARGS__) +#define vfsub_vf_f16m1(...) __riscv_vfsub_vf_f16m1(__VA_ARGS__) +#define vfsub_vv_f16m2(...) __riscv_vfsub_vv_f16m2(__VA_ARGS__) +#define vfsub_vf_f16m2(...) __riscv_vfsub_vf_f16m2(__VA_ARGS__) +#define vfsub_vv_f16m4(...) __riscv_vfsub_vv_f16m4(__VA_ARGS__) +#define vfsub_vf_f16m4(...) __riscv_vfsub_vf_f16m4(__VA_ARGS__) +#define vfsub_vv_f16m8(...) __riscv_vfsub_vv_f16m8(__VA_ARGS__) +#define vfsub_vf_f16m8(...) __riscv_vfsub_vf_f16m8(__VA_ARGS__) +#define vfsub_vv_f32mf2(...) __riscv_vfsub_vv_f32mf2(__VA_ARGS__) +#define vfsub_vf_f32mf2(...) __riscv_vfsub_vf_f32mf2(__VA_ARGS__) +#define vfsub_vv_f32m1(...) __riscv_vfsub_vv_f32m1(__VA_ARGS__) +#define vfsub_vf_f32m1(...) __riscv_vfsub_vf_f32m1(__VA_ARGS__) +#define vfsub_vv_f32m2(...) __riscv_vfsub_vv_f32m2(__VA_ARGS__) +#define vfsub_vf_f32m2(...) __riscv_vfsub_vf_f32m2(__VA_ARGS__) +#define vfsub_vv_f32m4(...) __riscv_vfsub_vv_f32m4(__VA_ARGS__) +#define vfsub_vf_f32m4(...) __riscv_vfsub_vf_f32m4(__VA_ARGS__) +#define vfsub_vv_f32m8(...) __riscv_vfsub_vv_f32m8(__VA_ARGS__) +#define vfsub_vf_f32m8(...) __riscv_vfsub_vf_f32m8(__VA_ARGS__) +#define vfsub_vv_f64m1(...) __riscv_vfsub_vv_f64m1(__VA_ARGS__) +#define vfsub_vf_f64m1(...) __riscv_vfsub_vf_f64m1(__VA_ARGS__) +#define vfsub_vv_f64m2(...) __riscv_vfsub_vv_f64m2(__VA_ARGS__) +#define vfsub_vf_f64m2(...) __riscv_vfsub_vf_f64m2(__VA_ARGS__) +#define vfsub_vv_f64m4(...) __riscv_vfsub_vv_f64m4(__VA_ARGS__) +#define vfsub_vf_f64m4(...) __riscv_vfsub_vf_f64m4(__VA_ARGS__) +#define vfsub_vv_f64m8(...) __riscv_vfsub_vv_f64m8(__VA_ARGS__) +#define vfsub_vf_f64m8(...) __riscv_vfsub_vf_f64m8(__VA_ARGS__) +#define vfrsub_vf_f16mf4(...) __riscv_vfrsub_vf_f16mf4(__VA_ARGS__) +#define vfrsub_vf_f16mf2(...) __riscv_vfrsub_vf_f16mf2(__VA_ARGS__) +#define vfrsub_vf_f16m1(...) __riscv_vfrsub_vf_f16m1(__VA_ARGS__) +#define vfrsub_vf_f16m2(...) __riscv_vfrsub_vf_f16m2(__VA_ARGS__) +#define vfrsub_vf_f16m4(...) __riscv_vfrsub_vf_f16m4(__VA_ARGS__) +#define vfrsub_vf_f16m8(...) __riscv_vfrsub_vf_f16m8(__VA_ARGS__) +#define vfrsub_vf_f32mf2(...) __riscv_vfrsub_vf_f32mf2(__VA_ARGS__) +#define vfrsub_vf_f32m1(...) __riscv_vfrsub_vf_f32m1(__VA_ARGS__) +#define vfrsub_vf_f32m2(...) __riscv_vfrsub_vf_f32m2(__VA_ARGS__) +#define vfrsub_vf_f32m4(...) __riscv_vfrsub_vf_f32m4(__VA_ARGS__) +#define vfrsub_vf_f32m8(...) __riscv_vfrsub_vf_f32m8(__VA_ARGS__) +#define vfrsub_vf_f64m1(...) __riscv_vfrsub_vf_f64m1(__VA_ARGS__) +#define vfrsub_vf_f64m2(...) __riscv_vfrsub_vf_f64m2(__VA_ARGS__) +#define vfrsub_vf_f64m4(...) __riscv_vfrsub_vf_f64m4(__VA_ARGS__) +#define vfrsub_vf_f64m8(...) __riscv_vfrsub_vf_f64m8(__VA_ARGS__) +#define vfneg_v_f16mf4(...) __riscv_vfneg_v_f16mf4(__VA_ARGS__) +#define vfneg_v_f16mf2(...) __riscv_vfneg_v_f16mf2(__VA_ARGS__) +#define vfneg_v_f16m1(...) __riscv_vfneg_v_f16m1(__VA_ARGS__) +#define vfneg_v_f16m2(...) __riscv_vfneg_v_f16m2(__VA_ARGS__) +#define vfneg_v_f16m4(...) __riscv_vfneg_v_f16m4(__VA_ARGS__) +#define vfneg_v_f16m8(...) __riscv_vfneg_v_f16m8(__VA_ARGS__) +#define vfneg_v_f32mf2(...) __riscv_vfneg_v_f32mf2(__VA_ARGS__) +#define vfneg_v_f32m1(...) __riscv_vfneg_v_f32m1(__VA_ARGS__) +#define vfneg_v_f32m2(...) __riscv_vfneg_v_f32m2(__VA_ARGS__) +#define vfneg_v_f32m4(...) __riscv_vfneg_v_f32m4(__VA_ARGS__) +#define vfneg_v_f32m8(...) __riscv_vfneg_v_f32m8(__VA_ARGS__) +#define vfneg_v_f64m1(...) __riscv_vfneg_v_f64m1(__VA_ARGS__) +#define vfneg_v_f64m2(...) __riscv_vfneg_v_f64m2(__VA_ARGS__) +#define vfneg_v_f64m4(...) __riscv_vfneg_v_f64m4(__VA_ARGS__) +#define vfneg_v_f64m8(...) __riscv_vfneg_v_f64m8(__VA_ARGS__) +// masked functions +#define vfadd_vv_f16mf4_m(...) __riscv_vfadd_vv_f16mf4_tumu(__VA_ARGS__) +#define vfadd_vf_f16mf4_m(...) __riscv_vfadd_vf_f16mf4_tumu(__VA_ARGS__) +#define vfadd_vv_f16mf2_m(...) __riscv_vfadd_vv_f16mf2_tumu(__VA_ARGS__) +#define vfadd_vf_f16mf2_m(...) __riscv_vfadd_vf_f16mf2_tumu(__VA_ARGS__) +#define vfadd_vv_f16m1_m(...) __riscv_vfadd_vv_f16m1_tumu(__VA_ARGS__) +#define vfadd_vf_f16m1_m(...) __riscv_vfadd_vf_f16m1_tumu(__VA_ARGS__) +#define vfadd_vv_f16m2_m(...) __riscv_vfadd_vv_f16m2_tumu(__VA_ARGS__) +#define vfadd_vf_f16m2_m(...) __riscv_vfadd_vf_f16m2_tumu(__VA_ARGS__) +#define vfadd_vv_f16m4_m(...) __riscv_vfadd_vv_f16m4_tumu(__VA_ARGS__) +#define vfadd_vf_f16m4_m(...) __riscv_vfadd_vf_f16m4_tumu(__VA_ARGS__) +#define vfadd_vv_f16m8_m(...) __riscv_vfadd_vv_f16m8_tumu(__VA_ARGS__) +#define vfadd_vf_f16m8_m(...) __riscv_vfadd_vf_f16m8_tumu(__VA_ARGS__) +#define vfadd_vv_f32mf2_m(...) __riscv_vfadd_vv_f32mf2_tumu(__VA_ARGS__) +#define vfadd_vf_f32mf2_m(...) __riscv_vfadd_vf_f32mf2_tumu(__VA_ARGS__) +#define vfadd_vv_f32m1_m(...) __riscv_vfadd_vv_f32m1_tumu(__VA_ARGS__) +#define vfadd_vf_f32m1_m(...) __riscv_vfadd_vf_f32m1_tumu(__VA_ARGS__) +#define vfadd_vv_f32m2_m(...) __riscv_vfadd_vv_f32m2_tumu(__VA_ARGS__) +#define vfadd_vf_f32m2_m(...) __riscv_vfadd_vf_f32m2_tumu(__VA_ARGS__) +#define vfadd_vv_f32m4_m(...) __riscv_vfadd_vv_f32m4_tumu(__VA_ARGS__) +#define vfadd_vf_f32m4_m(...) __riscv_vfadd_vf_f32m4_tumu(__VA_ARGS__) +#define vfadd_vv_f32m8_m(...) __riscv_vfadd_vv_f32m8_tumu(__VA_ARGS__) +#define vfadd_vf_f32m8_m(...) __riscv_vfadd_vf_f32m8_tumu(__VA_ARGS__) +#define vfadd_vv_f64m1_m(...) __riscv_vfadd_vv_f64m1_tumu(__VA_ARGS__) +#define vfadd_vf_f64m1_m(...) __riscv_vfadd_vf_f64m1_tumu(__VA_ARGS__) +#define vfadd_vv_f64m2_m(...) __riscv_vfadd_vv_f64m2_tumu(__VA_ARGS__) +#define vfadd_vf_f64m2_m(...) __riscv_vfadd_vf_f64m2_tumu(__VA_ARGS__) +#define vfadd_vv_f64m4_m(...) __riscv_vfadd_vv_f64m4_tumu(__VA_ARGS__) +#define vfadd_vf_f64m4_m(...) __riscv_vfadd_vf_f64m4_tumu(__VA_ARGS__) +#define vfadd_vv_f64m8_m(...) __riscv_vfadd_vv_f64m8_tumu(__VA_ARGS__) +#define vfadd_vf_f64m8_m(...) __riscv_vfadd_vf_f64m8_tumu(__VA_ARGS__) +#define vfsub_vv_f16mf4_m(...) __riscv_vfsub_vv_f16mf4_tumu(__VA_ARGS__) +#define vfsub_vf_f16mf4_m(...) __riscv_vfsub_vf_f16mf4_tumu(__VA_ARGS__) +#define vfsub_vv_f16mf2_m(...) __riscv_vfsub_vv_f16mf2_tumu(__VA_ARGS__) +#define vfsub_vf_f16mf2_m(...) __riscv_vfsub_vf_f16mf2_tumu(__VA_ARGS__) +#define vfsub_vv_f16m1_m(...) __riscv_vfsub_vv_f16m1_tumu(__VA_ARGS__) +#define vfsub_vf_f16m1_m(...) __riscv_vfsub_vf_f16m1_tumu(__VA_ARGS__) +#define vfsub_vv_f16m2_m(...) __riscv_vfsub_vv_f16m2_tumu(__VA_ARGS__) +#define vfsub_vf_f16m2_m(...) __riscv_vfsub_vf_f16m2_tumu(__VA_ARGS__) +#define vfsub_vv_f16m4_m(...) __riscv_vfsub_vv_f16m4_tumu(__VA_ARGS__) +#define vfsub_vf_f16m4_m(...) __riscv_vfsub_vf_f16m4_tumu(__VA_ARGS__) +#define vfsub_vv_f16m8_m(...) __riscv_vfsub_vv_f16m8_tumu(__VA_ARGS__) +#define vfsub_vf_f16m8_m(...) __riscv_vfsub_vf_f16m8_tumu(__VA_ARGS__) +#define vfsub_vv_f32mf2_m(...) __riscv_vfsub_vv_f32mf2_tumu(__VA_ARGS__) +#define vfsub_vf_f32mf2_m(...) __riscv_vfsub_vf_f32mf2_tumu(__VA_ARGS__) +#define vfsub_vv_f32m1_m(...) __riscv_vfsub_vv_f32m1_tumu(__VA_ARGS__) +#define vfsub_vf_f32m1_m(...) __riscv_vfsub_vf_f32m1_tumu(__VA_ARGS__) +#define vfsub_vv_f32m2_m(...) __riscv_vfsub_vv_f32m2_tumu(__VA_ARGS__) +#define vfsub_vf_f32m2_m(...) __riscv_vfsub_vf_f32m2_tumu(__VA_ARGS__) +#define vfsub_vv_f32m4_m(...) __riscv_vfsub_vv_f32m4_tumu(__VA_ARGS__) +#define vfsub_vf_f32m4_m(...) __riscv_vfsub_vf_f32m4_tumu(__VA_ARGS__) +#define vfsub_vv_f32m8_m(...) __riscv_vfsub_vv_f32m8_tumu(__VA_ARGS__) +#define vfsub_vf_f32m8_m(...) __riscv_vfsub_vf_f32m8_tumu(__VA_ARGS__) +#define vfsub_vv_f64m1_m(...) __riscv_vfsub_vv_f64m1_tumu(__VA_ARGS__) +#define vfsub_vf_f64m1_m(...) __riscv_vfsub_vf_f64m1_tumu(__VA_ARGS__) +#define vfsub_vv_f64m2_m(...) __riscv_vfsub_vv_f64m2_tumu(__VA_ARGS__) +#define vfsub_vf_f64m2_m(...) __riscv_vfsub_vf_f64m2_tumu(__VA_ARGS__) +#define vfsub_vv_f64m4_m(...) __riscv_vfsub_vv_f64m4_tumu(__VA_ARGS__) +#define vfsub_vf_f64m4_m(...) __riscv_vfsub_vf_f64m4_tumu(__VA_ARGS__) +#define vfsub_vv_f64m8_m(...) __riscv_vfsub_vv_f64m8_tumu(__VA_ARGS__) +#define vfsub_vf_f64m8_m(...) __riscv_vfsub_vf_f64m8_tumu(__VA_ARGS__) +#define vfrsub_vf_f16mf4_m(...) __riscv_vfrsub_vf_f16mf4_tumu(__VA_ARGS__) +#define vfrsub_vf_f16mf2_m(...) __riscv_vfrsub_vf_f16mf2_tumu(__VA_ARGS__) +#define vfrsub_vf_f16m1_m(...) __riscv_vfrsub_vf_f16m1_tumu(__VA_ARGS__) +#define vfrsub_vf_f16m2_m(...) __riscv_vfrsub_vf_f16m2_tumu(__VA_ARGS__) +#define vfrsub_vf_f16m4_m(...) __riscv_vfrsub_vf_f16m4_tumu(__VA_ARGS__) +#define vfrsub_vf_f16m8_m(...) __riscv_vfrsub_vf_f16m8_tumu(__VA_ARGS__) +#define vfrsub_vf_f32mf2_m(...) __riscv_vfrsub_vf_f32mf2_tumu(__VA_ARGS__) +#define vfrsub_vf_f32m1_m(...) __riscv_vfrsub_vf_f32m1_tumu(__VA_ARGS__) +#define vfrsub_vf_f32m2_m(...) __riscv_vfrsub_vf_f32m2_tumu(__VA_ARGS__) +#define vfrsub_vf_f32m4_m(...) __riscv_vfrsub_vf_f32m4_tumu(__VA_ARGS__) +#define vfrsub_vf_f32m8_m(...) __riscv_vfrsub_vf_f32m8_tumu(__VA_ARGS__) +#define vfrsub_vf_f64m1_m(...) __riscv_vfrsub_vf_f64m1_tumu(__VA_ARGS__) +#define vfrsub_vf_f64m2_m(...) __riscv_vfrsub_vf_f64m2_tumu(__VA_ARGS__) +#define vfrsub_vf_f64m4_m(...) __riscv_vfrsub_vf_f64m4_tumu(__VA_ARGS__) +#define vfrsub_vf_f64m8_m(...) __riscv_vfrsub_vf_f64m8_tumu(__VA_ARGS__) +#define vfneg_v_f16mf4_m(...) __riscv_vfneg_v_f16mf4_tumu(__VA_ARGS__) +#define vfneg_v_f16mf2_m(...) __riscv_vfneg_v_f16mf2_tumu(__VA_ARGS__) +#define vfneg_v_f16m1_m(...) __riscv_vfneg_v_f16m1_tumu(__VA_ARGS__) +#define vfneg_v_f16m2_m(...) __riscv_vfneg_v_f16m2_tumu(__VA_ARGS__) +#define vfneg_v_f16m4_m(...) __riscv_vfneg_v_f16m4_tumu(__VA_ARGS__) +#define vfneg_v_f16m8_m(...) __riscv_vfneg_v_f16m8_tumu(__VA_ARGS__) +#define vfneg_v_f32mf2_m(...) __riscv_vfneg_v_f32mf2_tumu(__VA_ARGS__) +#define vfneg_v_f32m1_m(...) __riscv_vfneg_v_f32m1_tumu(__VA_ARGS__) +#define vfneg_v_f32m2_m(...) __riscv_vfneg_v_f32m2_tumu(__VA_ARGS__) +#define vfneg_v_f32m4_m(...) __riscv_vfneg_v_f32m4_tumu(__VA_ARGS__) +#define vfneg_v_f32m8_m(...) __riscv_vfneg_v_f32m8_tumu(__VA_ARGS__) +#define vfneg_v_f64m1_m(...) __riscv_vfneg_v_f64m1_tumu(__VA_ARGS__) +#define vfneg_v_f64m2_m(...) __riscv_vfneg_v_f64m2_tumu(__VA_ARGS__) +#define vfneg_v_f64m4_m(...) __riscv_vfneg_v_f64m4_tumu(__VA_ARGS__) +#define vfneg_v_f64m8_m(...) __riscv_vfneg_v_f64m8_tumu(__VA_ARGS__) +#define vfwadd_vv_f32mf2(...) __riscv_vfwadd_vv_f32mf2(__VA_ARGS__) +#define vfwadd_vf_f32mf2(...) __riscv_vfwadd_vf_f32mf2(__VA_ARGS__) +#define vfwadd_wv_f32mf2(...) __riscv_vfwadd_wv_f32mf2(__VA_ARGS__) +#define vfwadd_wf_f32mf2(...) __riscv_vfwadd_wf_f32mf2(__VA_ARGS__) +#define vfwadd_vv_f32m1(...) __riscv_vfwadd_vv_f32m1(__VA_ARGS__) +#define vfwadd_vf_f32m1(...) __riscv_vfwadd_vf_f32m1(__VA_ARGS__) +#define vfwadd_wv_f32m1(...) __riscv_vfwadd_wv_f32m1(__VA_ARGS__) +#define vfwadd_wf_f32m1(...) __riscv_vfwadd_wf_f32m1(__VA_ARGS__) +#define vfwadd_vv_f32m2(...) __riscv_vfwadd_vv_f32m2(__VA_ARGS__) +#define vfwadd_vf_f32m2(...) __riscv_vfwadd_vf_f32m2(__VA_ARGS__) +#define vfwadd_wv_f32m2(...) __riscv_vfwadd_wv_f32m2(__VA_ARGS__) +#define vfwadd_wf_f32m2(...) __riscv_vfwadd_wf_f32m2(__VA_ARGS__) +#define vfwadd_vv_f32m4(...) __riscv_vfwadd_vv_f32m4(__VA_ARGS__) +#define vfwadd_vf_f32m4(...) __riscv_vfwadd_vf_f32m4(__VA_ARGS__) +#define vfwadd_wv_f32m4(...) __riscv_vfwadd_wv_f32m4(__VA_ARGS__) +#define vfwadd_wf_f32m4(...) __riscv_vfwadd_wf_f32m4(__VA_ARGS__) +#define vfwadd_vv_f32m8(...) __riscv_vfwadd_vv_f32m8(__VA_ARGS__) +#define vfwadd_vf_f32m8(...) __riscv_vfwadd_vf_f32m8(__VA_ARGS__) +#define vfwadd_wv_f32m8(...) __riscv_vfwadd_wv_f32m8(__VA_ARGS__) +#define vfwadd_wf_f32m8(...) __riscv_vfwadd_wf_f32m8(__VA_ARGS__) +#define vfwadd_vv_f64m1(...) __riscv_vfwadd_vv_f64m1(__VA_ARGS__) +#define vfwadd_vf_f64m1(...) __riscv_vfwadd_vf_f64m1(__VA_ARGS__) +#define vfwadd_wv_f64m1(...) __riscv_vfwadd_wv_f64m1(__VA_ARGS__) +#define vfwadd_wf_f64m1(...) __riscv_vfwadd_wf_f64m1(__VA_ARGS__) +#define vfwadd_vv_f64m2(...) __riscv_vfwadd_vv_f64m2(__VA_ARGS__) +#define vfwadd_vf_f64m2(...) __riscv_vfwadd_vf_f64m2(__VA_ARGS__) +#define vfwadd_wv_f64m2(...) __riscv_vfwadd_wv_f64m2(__VA_ARGS__) +#define vfwadd_wf_f64m2(...) __riscv_vfwadd_wf_f64m2(__VA_ARGS__) +#define vfwadd_vv_f64m4(...) __riscv_vfwadd_vv_f64m4(__VA_ARGS__) +#define vfwadd_vf_f64m4(...) __riscv_vfwadd_vf_f64m4(__VA_ARGS__) +#define vfwadd_wv_f64m4(...) __riscv_vfwadd_wv_f64m4(__VA_ARGS__) +#define vfwadd_wf_f64m4(...) __riscv_vfwadd_wf_f64m4(__VA_ARGS__) +#define vfwadd_vv_f64m8(...) __riscv_vfwadd_vv_f64m8(__VA_ARGS__) +#define vfwadd_vf_f64m8(...) __riscv_vfwadd_vf_f64m8(__VA_ARGS__) +#define vfwadd_wv_f64m8(...) __riscv_vfwadd_wv_f64m8(__VA_ARGS__) +#define vfwadd_wf_f64m8(...) __riscv_vfwadd_wf_f64m8(__VA_ARGS__) +#define vfwsub_vv_f32mf2(...) __riscv_vfwsub_vv_f32mf2(__VA_ARGS__) +#define vfwsub_vf_f32mf2(...) __riscv_vfwsub_vf_f32mf2(__VA_ARGS__) +#define vfwsub_wv_f32mf2(...) __riscv_vfwsub_wv_f32mf2(__VA_ARGS__) +#define vfwsub_wf_f32mf2(...) __riscv_vfwsub_wf_f32mf2(__VA_ARGS__) +#define vfwsub_vv_f32m1(...) __riscv_vfwsub_vv_f32m1(__VA_ARGS__) +#define vfwsub_vf_f32m1(...) __riscv_vfwsub_vf_f32m1(__VA_ARGS__) +#define vfwsub_wv_f32m1(...) __riscv_vfwsub_wv_f32m1(__VA_ARGS__) +#define vfwsub_wf_f32m1(...) __riscv_vfwsub_wf_f32m1(__VA_ARGS__) +#define vfwsub_vv_f32m2(...) __riscv_vfwsub_vv_f32m2(__VA_ARGS__) +#define vfwsub_vf_f32m2(...) __riscv_vfwsub_vf_f32m2(__VA_ARGS__) +#define vfwsub_wv_f32m2(...) __riscv_vfwsub_wv_f32m2(__VA_ARGS__) +#define vfwsub_wf_f32m2(...) __riscv_vfwsub_wf_f32m2(__VA_ARGS__) +#define vfwsub_vv_f32m4(...) __riscv_vfwsub_vv_f32m4(__VA_ARGS__) +#define vfwsub_vf_f32m4(...) __riscv_vfwsub_vf_f32m4(__VA_ARGS__) +#define vfwsub_wv_f32m4(...) __riscv_vfwsub_wv_f32m4(__VA_ARGS__) +#define vfwsub_wf_f32m4(...) __riscv_vfwsub_wf_f32m4(__VA_ARGS__) +#define vfwsub_vv_f32m8(...) __riscv_vfwsub_vv_f32m8(__VA_ARGS__) +#define vfwsub_vf_f32m8(...) __riscv_vfwsub_vf_f32m8(__VA_ARGS__) +#define vfwsub_wv_f32m8(...) __riscv_vfwsub_wv_f32m8(__VA_ARGS__) +#define vfwsub_wf_f32m8(...) __riscv_vfwsub_wf_f32m8(__VA_ARGS__) +#define vfwsub_vv_f64m1(...) __riscv_vfwsub_vv_f64m1(__VA_ARGS__) +#define vfwsub_vf_f64m1(...) __riscv_vfwsub_vf_f64m1(__VA_ARGS__) +#define vfwsub_wv_f64m1(...) __riscv_vfwsub_wv_f64m1(__VA_ARGS__) +#define vfwsub_wf_f64m1(...) __riscv_vfwsub_wf_f64m1(__VA_ARGS__) +#define vfwsub_vv_f64m2(...) __riscv_vfwsub_vv_f64m2(__VA_ARGS__) +#define vfwsub_vf_f64m2(...) __riscv_vfwsub_vf_f64m2(__VA_ARGS__) +#define vfwsub_wv_f64m2(...) __riscv_vfwsub_wv_f64m2(__VA_ARGS__) +#define vfwsub_wf_f64m2(...) __riscv_vfwsub_wf_f64m2(__VA_ARGS__) +#define vfwsub_vv_f64m4(...) __riscv_vfwsub_vv_f64m4(__VA_ARGS__) +#define vfwsub_vf_f64m4(...) __riscv_vfwsub_vf_f64m4(__VA_ARGS__) +#define vfwsub_wv_f64m4(...) __riscv_vfwsub_wv_f64m4(__VA_ARGS__) +#define vfwsub_wf_f64m4(...) __riscv_vfwsub_wf_f64m4(__VA_ARGS__) +#define vfwsub_vv_f64m8(...) __riscv_vfwsub_vv_f64m8(__VA_ARGS__) +#define vfwsub_vf_f64m8(...) __riscv_vfwsub_vf_f64m8(__VA_ARGS__) +#define vfwsub_wv_f64m8(...) __riscv_vfwsub_wv_f64m8(__VA_ARGS__) +#define vfwsub_wf_f64m8(...) __riscv_vfwsub_wf_f64m8(__VA_ARGS__) +// masked functions +#define vfwadd_vv_f32mf2_m(...) __riscv_vfwadd_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwadd_vf_f32mf2_m(...) __riscv_vfwadd_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwadd_wv_f32mf2_m(...) __riscv_vfwadd_wv_f32mf2_tumu(__VA_ARGS__) +#define vfwadd_wf_f32mf2_m(...) __riscv_vfwadd_wf_f32mf2_tumu(__VA_ARGS__) +#define vfwadd_vv_f32m1_m(...) __riscv_vfwadd_vv_f32m1_tumu(__VA_ARGS__) +#define vfwadd_vf_f32m1_m(...) __riscv_vfwadd_vf_f32m1_tumu(__VA_ARGS__) +#define vfwadd_wv_f32m1_m(...) __riscv_vfwadd_wv_f32m1_tumu(__VA_ARGS__) +#define vfwadd_wf_f32m1_m(...) __riscv_vfwadd_wf_f32m1_tumu(__VA_ARGS__) +#define vfwadd_vv_f32m2_m(...) __riscv_vfwadd_vv_f32m2_tumu(__VA_ARGS__) +#define vfwadd_vf_f32m2_m(...) __riscv_vfwadd_vf_f32m2_tumu(__VA_ARGS__) +#define vfwadd_wv_f32m2_m(...) __riscv_vfwadd_wv_f32m2_tumu(__VA_ARGS__) +#define vfwadd_wf_f32m2_m(...) __riscv_vfwadd_wf_f32m2_tumu(__VA_ARGS__) +#define vfwadd_vv_f32m4_m(...) __riscv_vfwadd_vv_f32m4_tumu(__VA_ARGS__) +#define vfwadd_vf_f32m4_m(...) __riscv_vfwadd_vf_f32m4_tumu(__VA_ARGS__) +#define vfwadd_wv_f32m4_m(...) __riscv_vfwadd_wv_f32m4_tumu(__VA_ARGS__) +#define vfwadd_wf_f32m4_m(...) __riscv_vfwadd_wf_f32m4_tumu(__VA_ARGS__) +#define vfwadd_vv_f32m8_m(...) __riscv_vfwadd_vv_f32m8_tumu(__VA_ARGS__) +#define vfwadd_vf_f32m8_m(...) __riscv_vfwadd_vf_f32m8_tumu(__VA_ARGS__) +#define vfwadd_wv_f32m8_m(...) __riscv_vfwadd_wv_f32m8_tumu(__VA_ARGS__) +#define vfwadd_wf_f32m8_m(...) __riscv_vfwadd_wf_f32m8_tumu(__VA_ARGS__) +#define vfwadd_vv_f64m1_m(...) __riscv_vfwadd_vv_f64m1_tumu(__VA_ARGS__) +#define vfwadd_vf_f64m1_m(...) __riscv_vfwadd_vf_f64m1_tumu(__VA_ARGS__) +#define vfwadd_wv_f64m1_m(...) __riscv_vfwadd_wv_f64m1_tumu(__VA_ARGS__) +#define vfwadd_wf_f64m1_m(...) __riscv_vfwadd_wf_f64m1_tumu(__VA_ARGS__) +#define vfwadd_vv_f64m2_m(...) __riscv_vfwadd_vv_f64m2_tumu(__VA_ARGS__) +#define vfwadd_vf_f64m2_m(...) __riscv_vfwadd_vf_f64m2_tumu(__VA_ARGS__) +#define vfwadd_wv_f64m2_m(...) __riscv_vfwadd_wv_f64m2_tumu(__VA_ARGS__) +#define vfwadd_wf_f64m2_m(...) __riscv_vfwadd_wf_f64m2_tumu(__VA_ARGS__) +#define vfwadd_vv_f64m4_m(...) __riscv_vfwadd_vv_f64m4_tumu(__VA_ARGS__) +#define vfwadd_vf_f64m4_m(...) __riscv_vfwadd_vf_f64m4_tumu(__VA_ARGS__) +#define vfwadd_wv_f64m4_m(...) __riscv_vfwadd_wv_f64m4_tumu(__VA_ARGS__) +#define vfwadd_wf_f64m4_m(...) __riscv_vfwadd_wf_f64m4_tumu(__VA_ARGS__) +#define vfwadd_vv_f64m8_m(...) __riscv_vfwadd_vv_f64m8_tumu(__VA_ARGS__) +#define vfwadd_vf_f64m8_m(...) __riscv_vfwadd_vf_f64m8_tumu(__VA_ARGS__) +#define vfwadd_wv_f64m8_m(...) __riscv_vfwadd_wv_f64m8_tumu(__VA_ARGS__) +#define vfwadd_wf_f64m8_m(...) __riscv_vfwadd_wf_f64m8_tumu(__VA_ARGS__) +#define vfwsub_vv_f32mf2_m(...) __riscv_vfwsub_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwsub_vf_f32mf2_m(...) __riscv_vfwsub_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwsub_wv_f32mf2_m(...) __riscv_vfwsub_wv_f32mf2_tumu(__VA_ARGS__) +#define vfwsub_wf_f32mf2_m(...) __riscv_vfwsub_wf_f32mf2_tumu(__VA_ARGS__) +#define vfwsub_vv_f32m1_m(...) __riscv_vfwsub_vv_f32m1_tumu(__VA_ARGS__) +#define vfwsub_vf_f32m1_m(...) __riscv_vfwsub_vf_f32m1_tumu(__VA_ARGS__) +#define vfwsub_wv_f32m1_m(...) __riscv_vfwsub_wv_f32m1_tumu(__VA_ARGS__) +#define vfwsub_wf_f32m1_m(...) __riscv_vfwsub_wf_f32m1_tumu(__VA_ARGS__) +#define vfwsub_vv_f32m2_m(...) __riscv_vfwsub_vv_f32m2_tumu(__VA_ARGS__) +#define vfwsub_vf_f32m2_m(...) __riscv_vfwsub_vf_f32m2_tumu(__VA_ARGS__) +#define vfwsub_wv_f32m2_m(...) __riscv_vfwsub_wv_f32m2_tumu(__VA_ARGS__) +#define vfwsub_wf_f32m2_m(...) __riscv_vfwsub_wf_f32m2_tumu(__VA_ARGS__) +#define vfwsub_vv_f32m4_m(...) __riscv_vfwsub_vv_f32m4_tumu(__VA_ARGS__) +#define vfwsub_vf_f32m4_m(...) __riscv_vfwsub_vf_f32m4_tumu(__VA_ARGS__) +#define vfwsub_wv_f32m4_m(...) __riscv_vfwsub_wv_f32m4_tumu(__VA_ARGS__) +#define vfwsub_wf_f32m4_m(...) __riscv_vfwsub_wf_f32m4_tumu(__VA_ARGS__) +#define vfwsub_vv_f32m8_m(...) __riscv_vfwsub_vv_f32m8_tumu(__VA_ARGS__) +#define vfwsub_vf_f32m8_m(...) __riscv_vfwsub_vf_f32m8_tumu(__VA_ARGS__) +#define vfwsub_wv_f32m8_m(...) __riscv_vfwsub_wv_f32m8_tumu(__VA_ARGS__) +#define vfwsub_wf_f32m8_m(...) __riscv_vfwsub_wf_f32m8_tumu(__VA_ARGS__) +#define vfwsub_vv_f64m1_m(...) __riscv_vfwsub_vv_f64m1_tumu(__VA_ARGS__) +#define vfwsub_vf_f64m1_m(...) __riscv_vfwsub_vf_f64m1_tumu(__VA_ARGS__) +#define vfwsub_wv_f64m1_m(...) __riscv_vfwsub_wv_f64m1_tumu(__VA_ARGS__) +#define vfwsub_wf_f64m1_m(...) __riscv_vfwsub_wf_f64m1_tumu(__VA_ARGS__) +#define vfwsub_vv_f64m2_m(...) __riscv_vfwsub_vv_f64m2_tumu(__VA_ARGS__) +#define vfwsub_vf_f64m2_m(...) __riscv_vfwsub_vf_f64m2_tumu(__VA_ARGS__) +#define vfwsub_wv_f64m2_m(...) __riscv_vfwsub_wv_f64m2_tumu(__VA_ARGS__) +#define vfwsub_wf_f64m2_m(...) __riscv_vfwsub_wf_f64m2_tumu(__VA_ARGS__) +#define vfwsub_vv_f64m4_m(...) __riscv_vfwsub_vv_f64m4_tumu(__VA_ARGS__) +#define vfwsub_vf_f64m4_m(...) __riscv_vfwsub_vf_f64m4_tumu(__VA_ARGS__) +#define vfwsub_wv_f64m4_m(...) __riscv_vfwsub_wv_f64m4_tumu(__VA_ARGS__) +#define vfwsub_wf_f64m4_m(...) __riscv_vfwsub_wf_f64m4_tumu(__VA_ARGS__) +#define vfwsub_vv_f64m8_m(...) __riscv_vfwsub_vv_f64m8_tumu(__VA_ARGS__) +#define vfwsub_vf_f64m8_m(...) __riscv_vfwsub_vf_f64m8_tumu(__VA_ARGS__) +#define vfwsub_wv_f64m8_m(...) __riscv_vfwsub_wv_f64m8_tumu(__VA_ARGS__) +#define vfwsub_wf_f64m8_m(...) __riscv_vfwsub_wf_f64m8_tumu(__VA_ARGS__) +#define vfmul_vv_f16mf4(...) __riscv_vfmul_vv_f16mf4(__VA_ARGS__) +#define vfmul_vf_f16mf4(...) __riscv_vfmul_vf_f16mf4(__VA_ARGS__) +#define vfmul_vv_f16mf2(...) __riscv_vfmul_vv_f16mf2(__VA_ARGS__) +#define vfmul_vf_f16mf2(...) __riscv_vfmul_vf_f16mf2(__VA_ARGS__) +#define vfmul_vv_f16m1(...) __riscv_vfmul_vv_f16m1(__VA_ARGS__) +#define vfmul_vf_f16m1(...) __riscv_vfmul_vf_f16m1(__VA_ARGS__) +#define vfmul_vv_f16m2(...) __riscv_vfmul_vv_f16m2(__VA_ARGS__) +#define vfmul_vf_f16m2(...) __riscv_vfmul_vf_f16m2(__VA_ARGS__) +#define vfmul_vv_f16m4(...) __riscv_vfmul_vv_f16m4(__VA_ARGS__) +#define vfmul_vf_f16m4(...) __riscv_vfmul_vf_f16m4(__VA_ARGS__) +#define vfmul_vv_f16m8(...) __riscv_vfmul_vv_f16m8(__VA_ARGS__) +#define vfmul_vf_f16m8(...) __riscv_vfmul_vf_f16m8(__VA_ARGS__) +#define vfmul_vv_f32mf2(...) __riscv_vfmul_vv_f32mf2(__VA_ARGS__) +#define vfmul_vf_f32mf2(...) __riscv_vfmul_vf_f32mf2(__VA_ARGS__) +#define vfmul_vv_f32m1(...) __riscv_vfmul_vv_f32m1(__VA_ARGS__) +#define vfmul_vf_f32m1(...) __riscv_vfmul_vf_f32m1(__VA_ARGS__) +#define vfmul_vv_f32m2(...) __riscv_vfmul_vv_f32m2(__VA_ARGS__) +#define vfmul_vf_f32m2(...) __riscv_vfmul_vf_f32m2(__VA_ARGS__) +#define vfmul_vv_f32m4(...) __riscv_vfmul_vv_f32m4(__VA_ARGS__) +#define vfmul_vf_f32m4(...) __riscv_vfmul_vf_f32m4(__VA_ARGS__) +#define vfmul_vv_f32m8(...) __riscv_vfmul_vv_f32m8(__VA_ARGS__) +#define vfmul_vf_f32m8(...) __riscv_vfmul_vf_f32m8(__VA_ARGS__) +#define vfmul_vv_f64m1(...) __riscv_vfmul_vv_f64m1(__VA_ARGS__) +#define vfmul_vf_f64m1(...) __riscv_vfmul_vf_f64m1(__VA_ARGS__) +#define vfmul_vv_f64m2(...) __riscv_vfmul_vv_f64m2(__VA_ARGS__) +#define vfmul_vf_f64m2(...) __riscv_vfmul_vf_f64m2(__VA_ARGS__) +#define vfmul_vv_f64m4(...) __riscv_vfmul_vv_f64m4(__VA_ARGS__) +#define vfmul_vf_f64m4(...) __riscv_vfmul_vf_f64m4(__VA_ARGS__) +#define vfmul_vv_f64m8(...) __riscv_vfmul_vv_f64m8(__VA_ARGS__) +#define vfmul_vf_f64m8(...) __riscv_vfmul_vf_f64m8(__VA_ARGS__) +#define vfdiv_vv_f16mf4(...) __riscv_vfdiv_vv_f16mf4(__VA_ARGS__) +#define vfdiv_vf_f16mf4(...) __riscv_vfdiv_vf_f16mf4(__VA_ARGS__) +#define vfdiv_vv_f16mf2(...) __riscv_vfdiv_vv_f16mf2(__VA_ARGS__) +#define vfdiv_vf_f16mf2(...) __riscv_vfdiv_vf_f16mf2(__VA_ARGS__) +#define vfdiv_vv_f16m1(...) __riscv_vfdiv_vv_f16m1(__VA_ARGS__) +#define vfdiv_vf_f16m1(...) __riscv_vfdiv_vf_f16m1(__VA_ARGS__) +#define vfdiv_vv_f16m2(...) __riscv_vfdiv_vv_f16m2(__VA_ARGS__) +#define vfdiv_vf_f16m2(...) __riscv_vfdiv_vf_f16m2(__VA_ARGS__) +#define vfdiv_vv_f16m4(...) __riscv_vfdiv_vv_f16m4(__VA_ARGS__) +#define vfdiv_vf_f16m4(...) __riscv_vfdiv_vf_f16m4(__VA_ARGS__) +#define vfdiv_vv_f16m8(...) __riscv_vfdiv_vv_f16m8(__VA_ARGS__) +#define vfdiv_vf_f16m8(...) __riscv_vfdiv_vf_f16m8(__VA_ARGS__) +#define vfdiv_vv_f32mf2(...) __riscv_vfdiv_vv_f32mf2(__VA_ARGS__) +#define vfdiv_vf_f32mf2(...) __riscv_vfdiv_vf_f32mf2(__VA_ARGS__) +#define vfdiv_vv_f32m1(...) __riscv_vfdiv_vv_f32m1(__VA_ARGS__) +#define vfdiv_vf_f32m1(...) __riscv_vfdiv_vf_f32m1(__VA_ARGS__) +#define vfdiv_vv_f32m2(...) __riscv_vfdiv_vv_f32m2(__VA_ARGS__) +#define vfdiv_vf_f32m2(...) __riscv_vfdiv_vf_f32m2(__VA_ARGS__) +#define vfdiv_vv_f32m4(...) __riscv_vfdiv_vv_f32m4(__VA_ARGS__) +#define vfdiv_vf_f32m4(...) __riscv_vfdiv_vf_f32m4(__VA_ARGS__) +#define vfdiv_vv_f32m8(...) __riscv_vfdiv_vv_f32m8(__VA_ARGS__) +#define vfdiv_vf_f32m8(...) __riscv_vfdiv_vf_f32m8(__VA_ARGS__) +#define vfdiv_vv_f64m1(...) __riscv_vfdiv_vv_f64m1(__VA_ARGS__) +#define vfdiv_vf_f64m1(...) __riscv_vfdiv_vf_f64m1(__VA_ARGS__) +#define vfdiv_vv_f64m2(...) __riscv_vfdiv_vv_f64m2(__VA_ARGS__) +#define vfdiv_vf_f64m2(...) __riscv_vfdiv_vf_f64m2(__VA_ARGS__) +#define vfdiv_vv_f64m4(...) __riscv_vfdiv_vv_f64m4(__VA_ARGS__) +#define vfdiv_vf_f64m4(...) __riscv_vfdiv_vf_f64m4(__VA_ARGS__) +#define vfdiv_vv_f64m8(...) __riscv_vfdiv_vv_f64m8(__VA_ARGS__) +#define vfdiv_vf_f64m8(...) __riscv_vfdiv_vf_f64m8(__VA_ARGS__) +#define vfrdiv_vf_f16mf4(...) __riscv_vfrdiv_vf_f16mf4(__VA_ARGS__) +#define vfrdiv_vf_f16mf2(...) __riscv_vfrdiv_vf_f16mf2(__VA_ARGS__) +#define vfrdiv_vf_f16m1(...) __riscv_vfrdiv_vf_f16m1(__VA_ARGS__) +#define vfrdiv_vf_f16m2(...) __riscv_vfrdiv_vf_f16m2(__VA_ARGS__) +#define vfrdiv_vf_f16m4(...) __riscv_vfrdiv_vf_f16m4(__VA_ARGS__) +#define vfrdiv_vf_f16m8(...) __riscv_vfrdiv_vf_f16m8(__VA_ARGS__) +#define vfrdiv_vf_f32mf2(...) __riscv_vfrdiv_vf_f32mf2(__VA_ARGS__) +#define vfrdiv_vf_f32m1(...) __riscv_vfrdiv_vf_f32m1(__VA_ARGS__) +#define vfrdiv_vf_f32m2(...) __riscv_vfrdiv_vf_f32m2(__VA_ARGS__) +#define vfrdiv_vf_f32m4(...) __riscv_vfrdiv_vf_f32m4(__VA_ARGS__) +#define vfrdiv_vf_f32m8(...) __riscv_vfrdiv_vf_f32m8(__VA_ARGS__) +#define vfrdiv_vf_f64m1(...) __riscv_vfrdiv_vf_f64m1(__VA_ARGS__) +#define vfrdiv_vf_f64m2(...) __riscv_vfrdiv_vf_f64m2(__VA_ARGS__) +#define vfrdiv_vf_f64m4(...) __riscv_vfrdiv_vf_f64m4(__VA_ARGS__) +#define vfrdiv_vf_f64m8(...) __riscv_vfrdiv_vf_f64m8(__VA_ARGS__) +// masked functions +#define vfmul_vv_f16mf4_m(...) __riscv_vfmul_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmul_vf_f16mf4_m(...) __riscv_vfmul_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmul_vv_f16mf2_m(...) __riscv_vfmul_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmul_vf_f16mf2_m(...) __riscv_vfmul_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmul_vv_f16m1_m(...) __riscv_vfmul_vv_f16m1_tumu(__VA_ARGS__) +#define vfmul_vf_f16m1_m(...) __riscv_vfmul_vf_f16m1_tumu(__VA_ARGS__) +#define vfmul_vv_f16m2_m(...) __riscv_vfmul_vv_f16m2_tumu(__VA_ARGS__) +#define vfmul_vf_f16m2_m(...) __riscv_vfmul_vf_f16m2_tumu(__VA_ARGS__) +#define vfmul_vv_f16m4_m(...) __riscv_vfmul_vv_f16m4_tumu(__VA_ARGS__) +#define vfmul_vf_f16m4_m(...) __riscv_vfmul_vf_f16m4_tumu(__VA_ARGS__) +#define vfmul_vv_f16m8_m(...) __riscv_vfmul_vv_f16m8_tumu(__VA_ARGS__) +#define vfmul_vf_f16m8_m(...) __riscv_vfmul_vf_f16m8_tumu(__VA_ARGS__) +#define vfmul_vv_f32mf2_m(...) __riscv_vfmul_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmul_vf_f32mf2_m(...) __riscv_vfmul_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmul_vv_f32m1_m(...) __riscv_vfmul_vv_f32m1_tumu(__VA_ARGS__) +#define vfmul_vf_f32m1_m(...) __riscv_vfmul_vf_f32m1_tumu(__VA_ARGS__) +#define vfmul_vv_f32m2_m(...) __riscv_vfmul_vv_f32m2_tumu(__VA_ARGS__) +#define vfmul_vf_f32m2_m(...) __riscv_vfmul_vf_f32m2_tumu(__VA_ARGS__) +#define vfmul_vv_f32m4_m(...) __riscv_vfmul_vv_f32m4_tumu(__VA_ARGS__) +#define vfmul_vf_f32m4_m(...) __riscv_vfmul_vf_f32m4_tumu(__VA_ARGS__) +#define vfmul_vv_f32m8_m(...) __riscv_vfmul_vv_f32m8_tumu(__VA_ARGS__) +#define vfmul_vf_f32m8_m(...) __riscv_vfmul_vf_f32m8_tumu(__VA_ARGS__) +#define vfmul_vv_f64m1_m(...) __riscv_vfmul_vv_f64m1_tumu(__VA_ARGS__) +#define vfmul_vf_f64m1_m(...) __riscv_vfmul_vf_f64m1_tumu(__VA_ARGS__) +#define vfmul_vv_f64m2_m(...) __riscv_vfmul_vv_f64m2_tumu(__VA_ARGS__) +#define vfmul_vf_f64m2_m(...) __riscv_vfmul_vf_f64m2_tumu(__VA_ARGS__) +#define vfmul_vv_f64m4_m(...) __riscv_vfmul_vv_f64m4_tumu(__VA_ARGS__) +#define vfmul_vf_f64m4_m(...) __riscv_vfmul_vf_f64m4_tumu(__VA_ARGS__) +#define vfmul_vv_f64m8_m(...) __riscv_vfmul_vv_f64m8_tumu(__VA_ARGS__) +#define vfmul_vf_f64m8_m(...) __riscv_vfmul_vf_f64m8_tumu(__VA_ARGS__) +#define vfdiv_vv_f16mf4_m(...) __riscv_vfdiv_vv_f16mf4_tumu(__VA_ARGS__) +#define vfdiv_vf_f16mf4_m(...) __riscv_vfdiv_vf_f16mf4_tumu(__VA_ARGS__) +#define vfdiv_vv_f16mf2_m(...) __riscv_vfdiv_vv_f16mf2_tumu(__VA_ARGS__) +#define vfdiv_vf_f16mf2_m(...) __riscv_vfdiv_vf_f16mf2_tumu(__VA_ARGS__) +#define vfdiv_vv_f16m1_m(...) __riscv_vfdiv_vv_f16m1_tumu(__VA_ARGS__) +#define vfdiv_vf_f16m1_m(...) __riscv_vfdiv_vf_f16m1_tumu(__VA_ARGS__) +#define vfdiv_vv_f16m2_m(...) __riscv_vfdiv_vv_f16m2_tumu(__VA_ARGS__) +#define vfdiv_vf_f16m2_m(...) __riscv_vfdiv_vf_f16m2_tumu(__VA_ARGS__) +#define vfdiv_vv_f16m4_m(...) __riscv_vfdiv_vv_f16m4_tumu(__VA_ARGS__) +#define vfdiv_vf_f16m4_m(...) __riscv_vfdiv_vf_f16m4_tumu(__VA_ARGS__) +#define vfdiv_vv_f16m8_m(...) __riscv_vfdiv_vv_f16m8_tumu(__VA_ARGS__) +#define vfdiv_vf_f16m8_m(...) __riscv_vfdiv_vf_f16m8_tumu(__VA_ARGS__) +#define vfdiv_vv_f32mf2_m(...) __riscv_vfdiv_vv_f32mf2_tumu(__VA_ARGS__) +#define vfdiv_vf_f32mf2_m(...) __riscv_vfdiv_vf_f32mf2_tumu(__VA_ARGS__) +#define vfdiv_vv_f32m1_m(...) __riscv_vfdiv_vv_f32m1_tumu(__VA_ARGS__) +#define vfdiv_vf_f32m1_m(...) __riscv_vfdiv_vf_f32m1_tumu(__VA_ARGS__) +#define vfdiv_vv_f32m2_m(...) __riscv_vfdiv_vv_f32m2_tumu(__VA_ARGS__) +#define vfdiv_vf_f32m2_m(...) __riscv_vfdiv_vf_f32m2_tumu(__VA_ARGS__) +#define vfdiv_vv_f32m4_m(...) __riscv_vfdiv_vv_f32m4_tumu(__VA_ARGS__) +#define vfdiv_vf_f32m4_m(...) __riscv_vfdiv_vf_f32m4_tumu(__VA_ARGS__) +#define vfdiv_vv_f32m8_m(...) __riscv_vfdiv_vv_f32m8_tumu(__VA_ARGS__) +#define vfdiv_vf_f32m8_m(...) __riscv_vfdiv_vf_f32m8_tumu(__VA_ARGS__) +#define vfdiv_vv_f64m1_m(...) __riscv_vfdiv_vv_f64m1_tumu(__VA_ARGS__) +#define vfdiv_vf_f64m1_m(...) __riscv_vfdiv_vf_f64m1_tumu(__VA_ARGS__) +#define vfdiv_vv_f64m2_m(...) __riscv_vfdiv_vv_f64m2_tumu(__VA_ARGS__) +#define vfdiv_vf_f64m2_m(...) __riscv_vfdiv_vf_f64m2_tumu(__VA_ARGS__) +#define vfdiv_vv_f64m4_m(...) __riscv_vfdiv_vv_f64m4_tumu(__VA_ARGS__) +#define vfdiv_vf_f64m4_m(...) __riscv_vfdiv_vf_f64m4_tumu(__VA_ARGS__) +#define vfdiv_vv_f64m8_m(...) __riscv_vfdiv_vv_f64m8_tumu(__VA_ARGS__) +#define vfdiv_vf_f64m8_m(...) __riscv_vfdiv_vf_f64m8_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16mf4_m(...) __riscv_vfrdiv_vf_f16mf4_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16mf2_m(...) __riscv_vfrdiv_vf_f16mf2_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16m1_m(...) __riscv_vfrdiv_vf_f16m1_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16m2_m(...) __riscv_vfrdiv_vf_f16m2_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16m4_m(...) __riscv_vfrdiv_vf_f16m4_tumu(__VA_ARGS__) +#define vfrdiv_vf_f16m8_m(...) __riscv_vfrdiv_vf_f16m8_tumu(__VA_ARGS__) +#define vfrdiv_vf_f32mf2_m(...) __riscv_vfrdiv_vf_f32mf2_tumu(__VA_ARGS__) +#define vfrdiv_vf_f32m1_m(...) __riscv_vfrdiv_vf_f32m1_tumu(__VA_ARGS__) +#define vfrdiv_vf_f32m2_m(...) __riscv_vfrdiv_vf_f32m2_tumu(__VA_ARGS__) +#define vfrdiv_vf_f32m4_m(...) __riscv_vfrdiv_vf_f32m4_tumu(__VA_ARGS__) +#define vfrdiv_vf_f32m8_m(...) __riscv_vfrdiv_vf_f32m8_tumu(__VA_ARGS__) +#define vfrdiv_vf_f64m1_m(...) __riscv_vfrdiv_vf_f64m1_tumu(__VA_ARGS__) +#define vfrdiv_vf_f64m2_m(...) __riscv_vfrdiv_vf_f64m2_tumu(__VA_ARGS__) +#define vfrdiv_vf_f64m4_m(...) __riscv_vfrdiv_vf_f64m4_tumu(__VA_ARGS__) +#define vfrdiv_vf_f64m8_m(...) __riscv_vfrdiv_vf_f64m8_tumu(__VA_ARGS__) +#define vfwmul_vv_f32mf2(...) __riscv_vfwmul_vv_f32mf2(__VA_ARGS__) +#define vfwmul_vf_f32mf2(...) __riscv_vfwmul_vf_f32mf2(__VA_ARGS__) +#define vfwmul_vv_f32m1(...) __riscv_vfwmul_vv_f32m1(__VA_ARGS__) +#define vfwmul_vf_f32m1(...) __riscv_vfwmul_vf_f32m1(__VA_ARGS__) +#define vfwmul_vv_f32m2(...) __riscv_vfwmul_vv_f32m2(__VA_ARGS__) +#define vfwmul_vf_f32m2(...) __riscv_vfwmul_vf_f32m2(__VA_ARGS__) +#define vfwmul_vv_f32m4(...) __riscv_vfwmul_vv_f32m4(__VA_ARGS__) +#define vfwmul_vf_f32m4(...) __riscv_vfwmul_vf_f32m4(__VA_ARGS__) +#define vfwmul_vv_f32m8(...) __riscv_vfwmul_vv_f32m8(__VA_ARGS__) +#define vfwmul_vf_f32m8(...) __riscv_vfwmul_vf_f32m8(__VA_ARGS__) +#define vfwmul_vv_f64m1(...) __riscv_vfwmul_vv_f64m1(__VA_ARGS__) +#define vfwmul_vf_f64m1(...) __riscv_vfwmul_vf_f64m1(__VA_ARGS__) +#define vfwmul_vv_f64m2(...) __riscv_vfwmul_vv_f64m2(__VA_ARGS__) +#define vfwmul_vf_f64m2(...) __riscv_vfwmul_vf_f64m2(__VA_ARGS__) +#define vfwmul_vv_f64m4(...) __riscv_vfwmul_vv_f64m4(__VA_ARGS__) +#define vfwmul_vf_f64m4(...) __riscv_vfwmul_vf_f64m4(__VA_ARGS__) +#define vfwmul_vv_f64m8(...) __riscv_vfwmul_vv_f64m8(__VA_ARGS__) +#define vfwmul_vf_f64m8(...) __riscv_vfwmul_vf_f64m8(__VA_ARGS__) +// masked functions +#define vfwmul_vv_f32mf2_m(...) __riscv_vfwmul_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwmul_vf_f32mf2_m(...) __riscv_vfwmul_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwmul_vv_f32m1_m(...) __riscv_vfwmul_vv_f32m1_tumu(__VA_ARGS__) +#define vfwmul_vf_f32m1_m(...) __riscv_vfwmul_vf_f32m1_tumu(__VA_ARGS__) +#define vfwmul_vv_f32m2_m(...) __riscv_vfwmul_vv_f32m2_tumu(__VA_ARGS__) +#define vfwmul_vf_f32m2_m(...) __riscv_vfwmul_vf_f32m2_tumu(__VA_ARGS__) +#define vfwmul_vv_f32m4_m(...) __riscv_vfwmul_vv_f32m4_tumu(__VA_ARGS__) +#define vfwmul_vf_f32m4_m(...) __riscv_vfwmul_vf_f32m4_tumu(__VA_ARGS__) +#define vfwmul_vv_f32m8_m(...) __riscv_vfwmul_vv_f32m8_tumu(__VA_ARGS__) +#define vfwmul_vf_f32m8_m(...) __riscv_vfwmul_vf_f32m8_tumu(__VA_ARGS__) +#define vfwmul_vv_f64m1_m(...) __riscv_vfwmul_vv_f64m1_tumu(__VA_ARGS__) +#define vfwmul_vf_f64m1_m(...) __riscv_vfwmul_vf_f64m1_tumu(__VA_ARGS__) +#define vfwmul_vv_f64m2_m(...) __riscv_vfwmul_vv_f64m2_tumu(__VA_ARGS__) +#define vfwmul_vf_f64m2_m(...) __riscv_vfwmul_vf_f64m2_tumu(__VA_ARGS__) +#define vfwmul_vv_f64m4_m(...) __riscv_vfwmul_vv_f64m4_tumu(__VA_ARGS__) +#define vfwmul_vf_f64m4_m(...) __riscv_vfwmul_vf_f64m4_tumu(__VA_ARGS__) +#define vfwmul_vv_f64m8_m(...) __riscv_vfwmul_vv_f64m8_tumu(__VA_ARGS__) +#define vfwmul_vf_f64m8_m(...) __riscv_vfwmul_vf_f64m8_tumu(__VA_ARGS__) +#define vfmacc_vv_f16mf4(...) __riscv_vfmacc_vv_f16mf4_tu(__VA_ARGS__) +#define vfmacc_vf_f16mf4(...) __riscv_vfmacc_vf_f16mf4_tu(__VA_ARGS__) +#define vfmacc_vv_f16mf2(...) __riscv_vfmacc_vv_f16mf2_tu(__VA_ARGS__) +#define vfmacc_vf_f16mf2(...) __riscv_vfmacc_vf_f16mf2_tu(__VA_ARGS__) +#define vfmacc_vv_f16m1(...) __riscv_vfmacc_vv_f16m1_tu(__VA_ARGS__) +#define vfmacc_vf_f16m1(...) __riscv_vfmacc_vf_f16m1_tu(__VA_ARGS__) +#define vfmacc_vv_f16m2(...) __riscv_vfmacc_vv_f16m2_tu(__VA_ARGS__) +#define vfmacc_vf_f16m2(...) __riscv_vfmacc_vf_f16m2_tu(__VA_ARGS__) +#define vfmacc_vv_f16m4(...) __riscv_vfmacc_vv_f16m4_tu(__VA_ARGS__) +#define vfmacc_vf_f16m4(...) __riscv_vfmacc_vf_f16m4_tu(__VA_ARGS__) +#define vfmacc_vv_f16m8(...) __riscv_vfmacc_vv_f16m8_tu(__VA_ARGS__) +#define vfmacc_vf_f16m8(...) __riscv_vfmacc_vf_f16m8_tu(__VA_ARGS__) +#define vfmacc_vv_f32mf2(...) __riscv_vfmacc_vv_f32mf2_tu(__VA_ARGS__) +#define vfmacc_vf_f32mf2(...) __riscv_vfmacc_vf_f32mf2_tu(__VA_ARGS__) +#define vfmacc_vv_f32m1(...) __riscv_vfmacc_vv_f32m1_tu(__VA_ARGS__) +#define vfmacc_vf_f32m1(...) __riscv_vfmacc_vf_f32m1_tu(__VA_ARGS__) +#define vfmacc_vv_f32m2(...) __riscv_vfmacc_vv_f32m2_tu(__VA_ARGS__) +#define vfmacc_vf_f32m2(...) __riscv_vfmacc_vf_f32m2_tu(__VA_ARGS__) +#define vfmacc_vv_f32m4(...) __riscv_vfmacc_vv_f32m4_tu(__VA_ARGS__) +#define vfmacc_vf_f32m4(...) __riscv_vfmacc_vf_f32m4_tu(__VA_ARGS__) +#define vfmacc_vv_f32m8(...) __riscv_vfmacc_vv_f32m8_tu(__VA_ARGS__) +#define vfmacc_vf_f32m8(...) __riscv_vfmacc_vf_f32m8_tu(__VA_ARGS__) +#define vfmacc_vv_f64m1(...) __riscv_vfmacc_vv_f64m1_tu(__VA_ARGS__) +#define vfmacc_vf_f64m1(...) __riscv_vfmacc_vf_f64m1_tu(__VA_ARGS__) +#define vfmacc_vv_f64m2(...) __riscv_vfmacc_vv_f64m2_tu(__VA_ARGS__) +#define vfmacc_vf_f64m2(...) __riscv_vfmacc_vf_f64m2_tu(__VA_ARGS__) +#define vfmacc_vv_f64m4(...) __riscv_vfmacc_vv_f64m4_tu(__VA_ARGS__) +#define vfmacc_vf_f64m4(...) __riscv_vfmacc_vf_f64m4_tu(__VA_ARGS__) +#define vfmacc_vv_f64m8(...) __riscv_vfmacc_vv_f64m8_tu(__VA_ARGS__) +#define vfmacc_vf_f64m8(...) __riscv_vfmacc_vf_f64m8_tu(__VA_ARGS__) +#define vfnmacc_vv_f16mf4(...) __riscv_vfnmacc_vv_f16mf4_tu(__VA_ARGS__) +#define vfnmacc_vf_f16mf4(...) __riscv_vfnmacc_vf_f16mf4_tu(__VA_ARGS__) +#define vfnmacc_vv_f16mf2(...) __riscv_vfnmacc_vv_f16mf2_tu(__VA_ARGS__) +#define vfnmacc_vf_f16mf2(...) __riscv_vfnmacc_vf_f16mf2_tu(__VA_ARGS__) +#define vfnmacc_vv_f16m1(...) __riscv_vfnmacc_vv_f16m1_tu(__VA_ARGS__) +#define vfnmacc_vf_f16m1(...) __riscv_vfnmacc_vf_f16m1_tu(__VA_ARGS__) +#define vfnmacc_vv_f16m2(...) __riscv_vfnmacc_vv_f16m2_tu(__VA_ARGS__) +#define vfnmacc_vf_f16m2(...) __riscv_vfnmacc_vf_f16m2_tu(__VA_ARGS__) +#define vfnmacc_vv_f16m4(...) __riscv_vfnmacc_vv_f16m4_tu(__VA_ARGS__) +#define vfnmacc_vf_f16m4(...) __riscv_vfnmacc_vf_f16m4_tu(__VA_ARGS__) +#define vfnmacc_vv_f16m8(...) __riscv_vfnmacc_vv_f16m8_tu(__VA_ARGS__) +#define vfnmacc_vf_f16m8(...) __riscv_vfnmacc_vf_f16m8_tu(__VA_ARGS__) +#define vfnmacc_vv_f32mf2(...) __riscv_vfnmacc_vv_f32mf2_tu(__VA_ARGS__) +#define vfnmacc_vf_f32mf2(...) __riscv_vfnmacc_vf_f32mf2_tu(__VA_ARGS__) +#define vfnmacc_vv_f32m1(...) __riscv_vfnmacc_vv_f32m1_tu(__VA_ARGS__) +#define vfnmacc_vf_f32m1(...) __riscv_vfnmacc_vf_f32m1_tu(__VA_ARGS__) +#define vfnmacc_vv_f32m2(...) __riscv_vfnmacc_vv_f32m2_tu(__VA_ARGS__) +#define vfnmacc_vf_f32m2(...) __riscv_vfnmacc_vf_f32m2_tu(__VA_ARGS__) +#define vfnmacc_vv_f32m4(...) __riscv_vfnmacc_vv_f32m4_tu(__VA_ARGS__) +#define vfnmacc_vf_f32m4(...) __riscv_vfnmacc_vf_f32m4_tu(__VA_ARGS__) +#define vfnmacc_vv_f32m8(...) __riscv_vfnmacc_vv_f32m8_tu(__VA_ARGS__) +#define vfnmacc_vf_f32m8(...) __riscv_vfnmacc_vf_f32m8_tu(__VA_ARGS__) +#define vfnmacc_vv_f64m1(...) __riscv_vfnmacc_vv_f64m1_tu(__VA_ARGS__) +#define vfnmacc_vf_f64m1(...) __riscv_vfnmacc_vf_f64m1_tu(__VA_ARGS__) +#define vfnmacc_vv_f64m2(...) __riscv_vfnmacc_vv_f64m2_tu(__VA_ARGS__) +#define vfnmacc_vf_f64m2(...) __riscv_vfnmacc_vf_f64m2_tu(__VA_ARGS__) +#define vfnmacc_vv_f64m4(...) __riscv_vfnmacc_vv_f64m4_tu(__VA_ARGS__) +#define vfnmacc_vf_f64m4(...) __riscv_vfnmacc_vf_f64m4_tu(__VA_ARGS__) +#define vfnmacc_vv_f64m8(...) __riscv_vfnmacc_vv_f64m8_tu(__VA_ARGS__) +#define vfnmacc_vf_f64m8(...) __riscv_vfnmacc_vf_f64m8_tu(__VA_ARGS__) +#define vfmsac_vv_f16mf4(...) __riscv_vfmsac_vv_f16mf4_tu(__VA_ARGS__) +#define vfmsac_vf_f16mf4(...) __riscv_vfmsac_vf_f16mf4_tu(__VA_ARGS__) +#define vfmsac_vv_f16mf2(...) __riscv_vfmsac_vv_f16mf2_tu(__VA_ARGS__) +#define vfmsac_vf_f16mf2(...) __riscv_vfmsac_vf_f16mf2_tu(__VA_ARGS__) +#define vfmsac_vv_f16m1(...) __riscv_vfmsac_vv_f16m1_tu(__VA_ARGS__) +#define vfmsac_vf_f16m1(...) __riscv_vfmsac_vf_f16m1_tu(__VA_ARGS__) +#define vfmsac_vv_f16m2(...) __riscv_vfmsac_vv_f16m2_tu(__VA_ARGS__) +#define vfmsac_vf_f16m2(...) __riscv_vfmsac_vf_f16m2_tu(__VA_ARGS__) +#define vfmsac_vv_f16m4(...) __riscv_vfmsac_vv_f16m4_tu(__VA_ARGS__) +#define vfmsac_vf_f16m4(...) __riscv_vfmsac_vf_f16m4_tu(__VA_ARGS__) +#define vfmsac_vv_f16m8(...) __riscv_vfmsac_vv_f16m8_tu(__VA_ARGS__) +#define vfmsac_vf_f16m8(...) __riscv_vfmsac_vf_f16m8_tu(__VA_ARGS__) +#define vfmsac_vv_f32mf2(...) __riscv_vfmsac_vv_f32mf2_tu(__VA_ARGS__) +#define vfmsac_vf_f32mf2(...) __riscv_vfmsac_vf_f32mf2_tu(__VA_ARGS__) +#define vfmsac_vv_f32m1(...) __riscv_vfmsac_vv_f32m1_tu(__VA_ARGS__) +#define vfmsac_vf_f32m1(...) __riscv_vfmsac_vf_f32m1_tu(__VA_ARGS__) +#define vfmsac_vv_f32m2(...) __riscv_vfmsac_vv_f32m2_tu(__VA_ARGS__) +#define vfmsac_vf_f32m2(...) __riscv_vfmsac_vf_f32m2_tu(__VA_ARGS__) +#define vfmsac_vv_f32m4(...) __riscv_vfmsac_vv_f32m4_tu(__VA_ARGS__) +#define vfmsac_vf_f32m4(...) __riscv_vfmsac_vf_f32m4_tu(__VA_ARGS__) +#define vfmsac_vv_f32m8(...) __riscv_vfmsac_vv_f32m8_tu(__VA_ARGS__) +#define vfmsac_vf_f32m8(...) __riscv_vfmsac_vf_f32m8_tu(__VA_ARGS__) +#define vfmsac_vv_f64m1(...) __riscv_vfmsac_vv_f64m1_tu(__VA_ARGS__) +#define vfmsac_vf_f64m1(...) __riscv_vfmsac_vf_f64m1_tu(__VA_ARGS__) +#define vfmsac_vv_f64m2(...) __riscv_vfmsac_vv_f64m2_tu(__VA_ARGS__) +#define vfmsac_vf_f64m2(...) __riscv_vfmsac_vf_f64m2_tu(__VA_ARGS__) +#define vfmsac_vv_f64m4(...) __riscv_vfmsac_vv_f64m4_tu(__VA_ARGS__) +#define vfmsac_vf_f64m4(...) __riscv_vfmsac_vf_f64m4_tu(__VA_ARGS__) +#define vfmsac_vv_f64m8(...) __riscv_vfmsac_vv_f64m8_tu(__VA_ARGS__) +#define vfmsac_vf_f64m8(...) __riscv_vfmsac_vf_f64m8_tu(__VA_ARGS__) +#define vfnmsac_vv_f16mf4(...) __riscv_vfnmsac_vv_f16mf4_tu(__VA_ARGS__) +#define vfnmsac_vf_f16mf4(...) __riscv_vfnmsac_vf_f16mf4_tu(__VA_ARGS__) +#define vfnmsac_vv_f16mf2(...) __riscv_vfnmsac_vv_f16mf2_tu(__VA_ARGS__) +#define vfnmsac_vf_f16mf2(...) __riscv_vfnmsac_vf_f16mf2_tu(__VA_ARGS__) +#define vfnmsac_vv_f16m1(...) __riscv_vfnmsac_vv_f16m1_tu(__VA_ARGS__) +#define vfnmsac_vf_f16m1(...) __riscv_vfnmsac_vf_f16m1_tu(__VA_ARGS__) +#define vfnmsac_vv_f16m2(...) __riscv_vfnmsac_vv_f16m2_tu(__VA_ARGS__) +#define vfnmsac_vf_f16m2(...) __riscv_vfnmsac_vf_f16m2_tu(__VA_ARGS__) +#define vfnmsac_vv_f16m4(...) __riscv_vfnmsac_vv_f16m4_tu(__VA_ARGS__) +#define vfnmsac_vf_f16m4(...) __riscv_vfnmsac_vf_f16m4_tu(__VA_ARGS__) +#define vfnmsac_vv_f16m8(...) __riscv_vfnmsac_vv_f16m8_tu(__VA_ARGS__) +#define vfnmsac_vf_f16m8(...) __riscv_vfnmsac_vf_f16m8_tu(__VA_ARGS__) +#define vfnmsac_vv_f32mf2(...) __riscv_vfnmsac_vv_f32mf2_tu(__VA_ARGS__) +#define vfnmsac_vf_f32mf2(...) __riscv_vfnmsac_vf_f32mf2_tu(__VA_ARGS__) +#define vfnmsac_vv_f32m1(...) __riscv_vfnmsac_vv_f32m1_tu(__VA_ARGS__) +#define vfnmsac_vf_f32m1(...) __riscv_vfnmsac_vf_f32m1_tu(__VA_ARGS__) +#define vfnmsac_vv_f32m2(...) __riscv_vfnmsac_vv_f32m2_tu(__VA_ARGS__) +#define vfnmsac_vf_f32m2(...) __riscv_vfnmsac_vf_f32m2_tu(__VA_ARGS__) +#define vfnmsac_vv_f32m4(...) __riscv_vfnmsac_vv_f32m4_tu(__VA_ARGS__) +#define vfnmsac_vf_f32m4(...) __riscv_vfnmsac_vf_f32m4_tu(__VA_ARGS__) +#define vfnmsac_vv_f32m8(...) __riscv_vfnmsac_vv_f32m8_tu(__VA_ARGS__) +#define vfnmsac_vf_f32m8(...) __riscv_vfnmsac_vf_f32m8_tu(__VA_ARGS__) +#define vfnmsac_vv_f64m1(...) __riscv_vfnmsac_vv_f64m1_tu(__VA_ARGS__) +#define vfnmsac_vf_f64m1(...) __riscv_vfnmsac_vf_f64m1_tu(__VA_ARGS__) +#define vfnmsac_vv_f64m2(...) __riscv_vfnmsac_vv_f64m2_tu(__VA_ARGS__) +#define vfnmsac_vf_f64m2(...) __riscv_vfnmsac_vf_f64m2_tu(__VA_ARGS__) +#define vfnmsac_vv_f64m4(...) __riscv_vfnmsac_vv_f64m4_tu(__VA_ARGS__) +#define vfnmsac_vf_f64m4(...) __riscv_vfnmsac_vf_f64m4_tu(__VA_ARGS__) +#define vfnmsac_vv_f64m8(...) __riscv_vfnmsac_vv_f64m8_tu(__VA_ARGS__) +#define vfnmsac_vf_f64m8(...) __riscv_vfnmsac_vf_f64m8_tu(__VA_ARGS__) +#define vfmadd_vv_f16mf4(...) __riscv_vfmadd_vv_f16mf4_tu(__VA_ARGS__) +#define vfmadd_vf_f16mf4(...) __riscv_vfmadd_vf_f16mf4_tu(__VA_ARGS__) +#define vfmadd_vv_f16mf2(...) __riscv_vfmadd_vv_f16mf2_tu(__VA_ARGS__) +#define vfmadd_vf_f16mf2(...) __riscv_vfmadd_vf_f16mf2_tu(__VA_ARGS__) +#define vfmadd_vv_f16m1(...) __riscv_vfmadd_vv_f16m1_tu(__VA_ARGS__) +#define vfmadd_vf_f16m1(...) __riscv_vfmadd_vf_f16m1_tu(__VA_ARGS__) +#define vfmadd_vv_f16m2(...) __riscv_vfmadd_vv_f16m2_tu(__VA_ARGS__) +#define vfmadd_vf_f16m2(...) __riscv_vfmadd_vf_f16m2_tu(__VA_ARGS__) +#define vfmadd_vv_f16m4(...) __riscv_vfmadd_vv_f16m4_tu(__VA_ARGS__) +#define vfmadd_vf_f16m4(...) __riscv_vfmadd_vf_f16m4_tu(__VA_ARGS__) +#define vfmadd_vv_f16m8(...) __riscv_vfmadd_vv_f16m8_tu(__VA_ARGS__) +#define vfmadd_vf_f16m8(...) __riscv_vfmadd_vf_f16m8_tu(__VA_ARGS__) +#define vfmadd_vv_f32mf2(...) __riscv_vfmadd_vv_f32mf2_tu(__VA_ARGS__) +#define vfmadd_vf_f32mf2(...) __riscv_vfmadd_vf_f32mf2_tu(__VA_ARGS__) +#define vfmadd_vv_f32m1(...) __riscv_vfmadd_vv_f32m1_tu(__VA_ARGS__) +#define vfmadd_vf_f32m1(...) __riscv_vfmadd_vf_f32m1_tu(__VA_ARGS__) +#define vfmadd_vv_f32m2(...) __riscv_vfmadd_vv_f32m2_tu(__VA_ARGS__) +#define vfmadd_vf_f32m2(...) __riscv_vfmadd_vf_f32m2_tu(__VA_ARGS__) +#define vfmadd_vv_f32m4(...) __riscv_vfmadd_vv_f32m4_tu(__VA_ARGS__) +#define vfmadd_vf_f32m4(...) __riscv_vfmadd_vf_f32m4_tu(__VA_ARGS__) +#define vfmadd_vv_f32m8(...) __riscv_vfmadd_vv_f32m8_tu(__VA_ARGS__) +#define vfmadd_vf_f32m8(...) __riscv_vfmadd_vf_f32m8_tu(__VA_ARGS__) +#define vfmadd_vv_f64m1(...) __riscv_vfmadd_vv_f64m1_tu(__VA_ARGS__) +#define vfmadd_vf_f64m1(...) __riscv_vfmadd_vf_f64m1_tu(__VA_ARGS__) +#define vfmadd_vv_f64m2(...) __riscv_vfmadd_vv_f64m2_tu(__VA_ARGS__) +#define vfmadd_vf_f64m2(...) __riscv_vfmadd_vf_f64m2_tu(__VA_ARGS__) +#define vfmadd_vv_f64m4(...) __riscv_vfmadd_vv_f64m4_tu(__VA_ARGS__) +#define vfmadd_vf_f64m4(...) __riscv_vfmadd_vf_f64m4_tu(__VA_ARGS__) +#define vfmadd_vv_f64m8(...) __riscv_vfmadd_vv_f64m8_tu(__VA_ARGS__) +#define vfmadd_vf_f64m8(...) __riscv_vfmadd_vf_f64m8_tu(__VA_ARGS__) +#define vfnmadd_vv_f16mf4(...) __riscv_vfnmadd_vv_f16mf4_tu(__VA_ARGS__) +#define vfnmadd_vf_f16mf4(...) __riscv_vfnmadd_vf_f16mf4_tu(__VA_ARGS__) +#define vfnmadd_vv_f16mf2(...) __riscv_vfnmadd_vv_f16mf2_tu(__VA_ARGS__) +#define vfnmadd_vf_f16mf2(...) __riscv_vfnmadd_vf_f16mf2_tu(__VA_ARGS__) +#define vfnmadd_vv_f16m1(...) __riscv_vfnmadd_vv_f16m1_tu(__VA_ARGS__) +#define vfnmadd_vf_f16m1(...) __riscv_vfnmadd_vf_f16m1_tu(__VA_ARGS__) +#define vfnmadd_vv_f16m2(...) __riscv_vfnmadd_vv_f16m2_tu(__VA_ARGS__) +#define vfnmadd_vf_f16m2(...) __riscv_vfnmadd_vf_f16m2_tu(__VA_ARGS__) +#define vfnmadd_vv_f16m4(...) __riscv_vfnmadd_vv_f16m4_tu(__VA_ARGS__) +#define vfnmadd_vf_f16m4(...) __riscv_vfnmadd_vf_f16m4_tu(__VA_ARGS__) +#define vfnmadd_vv_f16m8(...) __riscv_vfnmadd_vv_f16m8_tu(__VA_ARGS__) +#define vfnmadd_vf_f16m8(...) __riscv_vfnmadd_vf_f16m8_tu(__VA_ARGS__) +#define vfnmadd_vv_f32mf2(...) __riscv_vfnmadd_vv_f32mf2_tu(__VA_ARGS__) +#define vfnmadd_vf_f32mf2(...) __riscv_vfnmadd_vf_f32mf2_tu(__VA_ARGS__) +#define vfnmadd_vv_f32m1(...) __riscv_vfnmadd_vv_f32m1_tu(__VA_ARGS__) +#define vfnmadd_vf_f32m1(...) __riscv_vfnmadd_vf_f32m1_tu(__VA_ARGS__) +#define vfnmadd_vv_f32m2(...) __riscv_vfnmadd_vv_f32m2_tu(__VA_ARGS__) +#define vfnmadd_vf_f32m2(...) __riscv_vfnmadd_vf_f32m2_tu(__VA_ARGS__) +#define vfnmadd_vv_f32m4(...) __riscv_vfnmadd_vv_f32m4_tu(__VA_ARGS__) +#define vfnmadd_vf_f32m4(...) __riscv_vfnmadd_vf_f32m4_tu(__VA_ARGS__) +#define vfnmadd_vv_f32m8(...) __riscv_vfnmadd_vv_f32m8_tu(__VA_ARGS__) +#define vfnmadd_vf_f32m8(...) __riscv_vfnmadd_vf_f32m8_tu(__VA_ARGS__) +#define vfnmadd_vv_f64m1(...) __riscv_vfnmadd_vv_f64m1_tu(__VA_ARGS__) +#define vfnmadd_vf_f64m1(...) __riscv_vfnmadd_vf_f64m1_tu(__VA_ARGS__) +#define vfnmadd_vv_f64m2(...) __riscv_vfnmadd_vv_f64m2_tu(__VA_ARGS__) +#define vfnmadd_vf_f64m2(...) __riscv_vfnmadd_vf_f64m2_tu(__VA_ARGS__) +#define vfnmadd_vv_f64m4(...) __riscv_vfnmadd_vv_f64m4_tu(__VA_ARGS__) +#define vfnmadd_vf_f64m4(...) __riscv_vfnmadd_vf_f64m4_tu(__VA_ARGS__) +#define vfnmadd_vv_f64m8(...) __riscv_vfnmadd_vv_f64m8_tu(__VA_ARGS__) +#define vfnmadd_vf_f64m8(...) __riscv_vfnmadd_vf_f64m8_tu(__VA_ARGS__) +#define vfmsub_vv_f16mf4(...) __riscv_vfmsub_vv_f16mf4_tu(__VA_ARGS__) +#define vfmsub_vf_f16mf4(...) __riscv_vfmsub_vf_f16mf4_tu(__VA_ARGS__) +#define vfmsub_vv_f16mf2(...) __riscv_vfmsub_vv_f16mf2_tu(__VA_ARGS__) +#define vfmsub_vf_f16mf2(...) __riscv_vfmsub_vf_f16mf2_tu(__VA_ARGS__) +#define vfmsub_vv_f16m1(...) __riscv_vfmsub_vv_f16m1_tu(__VA_ARGS__) +#define vfmsub_vf_f16m1(...) __riscv_vfmsub_vf_f16m1_tu(__VA_ARGS__) +#define vfmsub_vv_f16m2(...) __riscv_vfmsub_vv_f16m2_tu(__VA_ARGS__) +#define vfmsub_vf_f16m2(...) __riscv_vfmsub_vf_f16m2_tu(__VA_ARGS__) +#define vfmsub_vv_f16m4(...) __riscv_vfmsub_vv_f16m4_tu(__VA_ARGS__) +#define vfmsub_vf_f16m4(...) __riscv_vfmsub_vf_f16m4_tu(__VA_ARGS__) +#define vfmsub_vv_f16m8(...) __riscv_vfmsub_vv_f16m8_tu(__VA_ARGS__) +#define vfmsub_vf_f16m8(...) __riscv_vfmsub_vf_f16m8_tu(__VA_ARGS__) +#define vfmsub_vv_f32mf2(...) __riscv_vfmsub_vv_f32mf2_tu(__VA_ARGS__) +#define vfmsub_vf_f32mf2(...) __riscv_vfmsub_vf_f32mf2_tu(__VA_ARGS__) +#define vfmsub_vv_f32m1(...) __riscv_vfmsub_vv_f32m1_tu(__VA_ARGS__) +#define vfmsub_vf_f32m1(...) __riscv_vfmsub_vf_f32m1_tu(__VA_ARGS__) +#define vfmsub_vv_f32m2(...) __riscv_vfmsub_vv_f32m2_tu(__VA_ARGS__) +#define vfmsub_vf_f32m2(...) __riscv_vfmsub_vf_f32m2_tu(__VA_ARGS__) +#define vfmsub_vv_f32m4(...) __riscv_vfmsub_vv_f32m4_tu(__VA_ARGS__) +#define vfmsub_vf_f32m4(...) __riscv_vfmsub_vf_f32m4_tu(__VA_ARGS__) +#define vfmsub_vv_f32m8(...) __riscv_vfmsub_vv_f32m8_tu(__VA_ARGS__) +#define vfmsub_vf_f32m8(...) __riscv_vfmsub_vf_f32m8_tu(__VA_ARGS__) +#define vfmsub_vv_f64m1(...) __riscv_vfmsub_vv_f64m1_tu(__VA_ARGS__) +#define vfmsub_vf_f64m1(...) __riscv_vfmsub_vf_f64m1_tu(__VA_ARGS__) +#define vfmsub_vv_f64m2(...) __riscv_vfmsub_vv_f64m2_tu(__VA_ARGS__) +#define vfmsub_vf_f64m2(...) __riscv_vfmsub_vf_f64m2_tu(__VA_ARGS__) +#define vfmsub_vv_f64m4(...) __riscv_vfmsub_vv_f64m4_tu(__VA_ARGS__) +#define vfmsub_vf_f64m4(...) __riscv_vfmsub_vf_f64m4_tu(__VA_ARGS__) +#define vfmsub_vv_f64m8(...) __riscv_vfmsub_vv_f64m8_tu(__VA_ARGS__) +#define vfmsub_vf_f64m8(...) __riscv_vfmsub_vf_f64m8_tu(__VA_ARGS__) +#define vfnmsub_vv_f16mf4(...) __riscv_vfnmsub_vv_f16mf4_tu(__VA_ARGS__) +#define vfnmsub_vf_f16mf4(...) __riscv_vfnmsub_vf_f16mf4_tu(__VA_ARGS__) +#define vfnmsub_vv_f16mf2(...) __riscv_vfnmsub_vv_f16mf2_tu(__VA_ARGS__) +#define vfnmsub_vf_f16mf2(...) __riscv_vfnmsub_vf_f16mf2_tu(__VA_ARGS__) +#define vfnmsub_vv_f16m1(...) __riscv_vfnmsub_vv_f16m1_tu(__VA_ARGS__) +#define vfnmsub_vf_f16m1(...) __riscv_vfnmsub_vf_f16m1_tu(__VA_ARGS__) +#define vfnmsub_vv_f16m2(...) __riscv_vfnmsub_vv_f16m2_tu(__VA_ARGS__) +#define vfnmsub_vf_f16m2(...) __riscv_vfnmsub_vf_f16m2_tu(__VA_ARGS__) +#define vfnmsub_vv_f16m4(...) __riscv_vfnmsub_vv_f16m4_tu(__VA_ARGS__) +#define vfnmsub_vf_f16m4(...) __riscv_vfnmsub_vf_f16m4_tu(__VA_ARGS__) +#define vfnmsub_vv_f16m8(...) __riscv_vfnmsub_vv_f16m8_tu(__VA_ARGS__) +#define vfnmsub_vf_f16m8(...) __riscv_vfnmsub_vf_f16m8_tu(__VA_ARGS__) +#define vfnmsub_vv_f32mf2(...) __riscv_vfnmsub_vv_f32mf2_tu(__VA_ARGS__) +#define vfnmsub_vf_f32mf2(...) __riscv_vfnmsub_vf_f32mf2_tu(__VA_ARGS__) +#define vfnmsub_vv_f32m1(...) __riscv_vfnmsub_vv_f32m1_tu(__VA_ARGS__) +#define vfnmsub_vf_f32m1(...) __riscv_vfnmsub_vf_f32m1_tu(__VA_ARGS__) +#define vfnmsub_vv_f32m2(...) __riscv_vfnmsub_vv_f32m2_tu(__VA_ARGS__) +#define vfnmsub_vf_f32m2(...) __riscv_vfnmsub_vf_f32m2_tu(__VA_ARGS__) +#define vfnmsub_vv_f32m4(...) __riscv_vfnmsub_vv_f32m4_tu(__VA_ARGS__) +#define vfnmsub_vf_f32m4(...) __riscv_vfnmsub_vf_f32m4_tu(__VA_ARGS__) +#define vfnmsub_vv_f32m8(...) __riscv_vfnmsub_vv_f32m8_tu(__VA_ARGS__) +#define vfnmsub_vf_f32m8(...) __riscv_vfnmsub_vf_f32m8_tu(__VA_ARGS__) +#define vfnmsub_vv_f64m1(...) __riscv_vfnmsub_vv_f64m1_tu(__VA_ARGS__) +#define vfnmsub_vf_f64m1(...) __riscv_vfnmsub_vf_f64m1_tu(__VA_ARGS__) +#define vfnmsub_vv_f64m2(...) __riscv_vfnmsub_vv_f64m2_tu(__VA_ARGS__) +#define vfnmsub_vf_f64m2(...) __riscv_vfnmsub_vf_f64m2_tu(__VA_ARGS__) +#define vfnmsub_vv_f64m4(...) __riscv_vfnmsub_vv_f64m4_tu(__VA_ARGS__) +#define vfnmsub_vf_f64m4(...) __riscv_vfnmsub_vf_f64m4_tu(__VA_ARGS__) +#define vfnmsub_vv_f64m8(...) __riscv_vfnmsub_vv_f64m8_tu(__VA_ARGS__) +#define vfnmsub_vf_f64m8(...) __riscv_vfnmsub_vf_f64m8_tu(__VA_ARGS__) +// masked functions +#define vfmacc_vv_f16mf4_m(...) __riscv_vfmacc_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmacc_vf_f16mf4_m(...) __riscv_vfmacc_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmacc_vv_f16mf2_m(...) __riscv_vfmacc_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmacc_vf_f16mf2_m(...) __riscv_vfmacc_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmacc_vv_f16m1_m(...) __riscv_vfmacc_vv_f16m1_tumu(__VA_ARGS__) +#define vfmacc_vf_f16m1_m(...) __riscv_vfmacc_vf_f16m1_tumu(__VA_ARGS__) +#define vfmacc_vv_f16m2_m(...) __riscv_vfmacc_vv_f16m2_tumu(__VA_ARGS__) +#define vfmacc_vf_f16m2_m(...) __riscv_vfmacc_vf_f16m2_tumu(__VA_ARGS__) +#define vfmacc_vv_f16m4_m(...) __riscv_vfmacc_vv_f16m4_tumu(__VA_ARGS__) +#define vfmacc_vf_f16m4_m(...) __riscv_vfmacc_vf_f16m4_tumu(__VA_ARGS__) +#define vfmacc_vv_f16m8_m(...) __riscv_vfmacc_vv_f16m8_tumu(__VA_ARGS__) +#define vfmacc_vf_f16m8_m(...) __riscv_vfmacc_vf_f16m8_tumu(__VA_ARGS__) +#define vfmacc_vv_f32mf2_m(...) __riscv_vfmacc_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmacc_vf_f32mf2_m(...) __riscv_vfmacc_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmacc_vv_f32m1_m(...) __riscv_vfmacc_vv_f32m1_tumu(__VA_ARGS__) +#define vfmacc_vf_f32m1_m(...) __riscv_vfmacc_vf_f32m1_tumu(__VA_ARGS__) +#define vfmacc_vv_f32m2_m(...) __riscv_vfmacc_vv_f32m2_tumu(__VA_ARGS__) +#define vfmacc_vf_f32m2_m(...) __riscv_vfmacc_vf_f32m2_tumu(__VA_ARGS__) +#define vfmacc_vv_f32m4_m(...) __riscv_vfmacc_vv_f32m4_tumu(__VA_ARGS__) +#define vfmacc_vf_f32m4_m(...) __riscv_vfmacc_vf_f32m4_tumu(__VA_ARGS__) +#define vfmacc_vv_f32m8_m(...) __riscv_vfmacc_vv_f32m8_tumu(__VA_ARGS__) +#define vfmacc_vf_f32m8_m(...) __riscv_vfmacc_vf_f32m8_tumu(__VA_ARGS__) +#define vfmacc_vv_f64m1_m(...) __riscv_vfmacc_vv_f64m1_tumu(__VA_ARGS__) +#define vfmacc_vf_f64m1_m(...) __riscv_vfmacc_vf_f64m1_tumu(__VA_ARGS__) +#define vfmacc_vv_f64m2_m(...) __riscv_vfmacc_vv_f64m2_tumu(__VA_ARGS__) +#define vfmacc_vf_f64m2_m(...) __riscv_vfmacc_vf_f64m2_tumu(__VA_ARGS__) +#define vfmacc_vv_f64m4_m(...) __riscv_vfmacc_vv_f64m4_tumu(__VA_ARGS__) +#define vfmacc_vf_f64m4_m(...) __riscv_vfmacc_vf_f64m4_tumu(__VA_ARGS__) +#define vfmacc_vv_f64m8_m(...) __riscv_vfmacc_vv_f64m8_tumu(__VA_ARGS__) +#define vfmacc_vf_f64m8_m(...) __riscv_vfmacc_vf_f64m8_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16mf4_m(...) __riscv_vfnmacc_vv_f16mf4_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16mf4_m(...) __riscv_vfnmacc_vf_f16mf4_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16mf2_m(...) __riscv_vfnmacc_vv_f16mf2_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16mf2_m(...) __riscv_vfnmacc_vf_f16mf2_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16m1_m(...) __riscv_vfnmacc_vv_f16m1_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16m1_m(...) __riscv_vfnmacc_vf_f16m1_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16m2_m(...) __riscv_vfnmacc_vv_f16m2_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16m2_m(...) __riscv_vfnmacc_vf_f16m2_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16m4_m(...) __riscv_vfnmacc_vv_f16m4_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16m4_m(...) __riscv_vfnmacc_vf_f16m4_tumu(__VA_ARGS__) +#define vfnmacc_vv_f16m8_m(...) __riscv_vfnmacc_vv_f16m8_tumu(__VA_ARGS__) +#define vfnmacc_vf_f16m8_m(...) __riscv_vfnmacc_vf_f16m8_tumu(__VA_ARGS__) +#define vfnmacc_vv_f32mf2_m(...) __riscv_vfnmacc_vv_f32mf2_tumu(__VA_ARGS__) +#define vfnmacc_vf_f32mf2_m(...) __riscv_vfnmacc_vf_f32mf2_tumu(__VA_ARGS__) +#define vfnmacc_vv_f32m1_m(...) __riscv_vfnmacc_vv_f32m1_tumu(__VA_ARGS__) +#define vfnmacc_vf_f32m1_m(...) __riscv_vfnmacc_vf_f32m1_tumu(__VA_ARGS__) +#define vfnmacc_vv_f32m2_m(...) __riscv_vfnmacc_vv_f32m2_tumu(__VA_ARGS__) +#define vfnmacc_vf_f32m2_m(...) __riscv_vfnmacc_vf_f32m2_tumu(__VA_ARGS__) +#define vfnmacc_vv_f32m4_m(...) __riscv_vfnmacc_vv_f32m4_tumu(__VA_ARGS__) +#define vfnmacc_vf_f32m4_m(...) __riscv_vfnmacc_vf_f32m4_tumu(__VA_ARGS__) +#define vfnmacc_vv_f32m8_m(...) __riscv_vfnmacc_vv_f32m8_tumu(__VA_ARGS__) +#define vfnmacc_vf_f32m8_m(...) __riscv_vfnmacc_vf_f32m8_tumu(__VA_ARGS__) +#define vfnmacc_vv_f64m1_m(...) __riscv_vfnmacc_vv_f64m1_tumu(__VA_ARGS__) +#define vfnmacc_vf_f64m1_m(...) __riscv_vfnmacc_vf_f64m1_tumu(__VA_ARGS__) +#define vfnmacc_vv_f64m2_m(...) __riscv_vfnmacc_vv_f64m2_tumu(__VA_ARGS__) +#define vfnmacc_vf_f64m2_m(...) __riscv_vfnmacc_vf_f64m2_tumu(__VA_ARGS__) +#define vfnmacc_vv_f64m4_m(...) __riscv_vfnmacc_vv_f64m4_tumu(__VA_ARGS__) +#define vfnmacc_vf_f64m4_m(...) __riscv_vfnmacc_vf_f64m4_tumu(__VA_ARGS__) +#define vfnmacc_vv_f64m8_m(...) __riscv_vfnmacc_vv_f64m8_tumu(__VA_ARGS__) +#define vfnmacc_vf_f64m8_m(...) __riscv_vfnmacc_vf_f64m8_tumu(__VA_ARGS__) +#define vfmsac_vv_f16mf4_m(...) __riscv_vfmsac_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmsac_vf_f16mf4_m(...) __riscv_vfmsac_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmsac_vv_f16mf2_m(...) __riscv_vfmsac_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmsac_vf_f16mf2_m(...) __riscv_vfmsac_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmsac_vv_f16m1_m(...) __riscv_vfmsac_vv_f16m1_tumu(__VA_ARGS__) +#define vfmsac_vf_f16m1_m(...) __riscv_vfmsac_vf_f16m1_tumu(__VA_ARGS__) +#define vfmsac_vv_f16m2_m(...) __riscv_vfmsac_vv_f16m2_tumu(__VA_ARGS__) +#define vfmsac_vf_f16m2_m(...) __riscv_vfmsac_vf_f16m2_tumu(__VA_ARGS__) +#define vfmsac_vv_f16m4_m(...) __riscv_vfmsac_vv_f16m4_tumu(__VA_ARGS__) +#define vfmsac_vf_f16m4_m(...) __riscv_vfmsac_vf_f16m4_tumu(__VA_ARGS__) +#define vfmsac_vv_f16m8_m(...) __riscv_vfmsac_vv_f16m8_tumu(__VA_ARGS__) +#define vfmsac_vf_f16m8_m(...) __riscv_vfmsac_vf_f16m8_tumu(__VA_ARGS__) +#define vfmsac_vv_f32mf2_m(...) __riscv_vfmsac_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmsac_vf_f32mf2_m(...) __riscv_vfmsac_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmsac_vv_f32m1_m(...) __riscv_vfmsac_vv_f32m1_tumu(__VA_ARGS__) +#define vfmsac_vf_f32m1_m(...) __riscv_vfmsac_vf_f32m1_tumu(__VA_ARGS__) +#define vfmsac_vv_f32m2_m(...) __riscv_vfmsac_vv_f32m2_tumu(__VA_ARGS__) +#define vfmsac_vf_f32m2_m(...) __riscv_vfmsac_vf_f32m2_tumu(__VA_ARGS__) +#define vfmsac_vv_f32m4_m(...) __riscv_vfmsac_vv_f32m4_tumu(__VA_ARGS__) +#define vfmsac_vf_f32m4_m(...) __riscv_vfmsac_vf_f32m4_tumu(__VA_ARGS__) +#define vfmsac_vv_f32m8_m(...) __riscv_vfmsac_vv_f32m8_tumu(__VA_ARGS__) +#define vfmsac_vf_f32m8_m(...) __riscv_vfmsac_vf_f32m8_tumu(__VA_ARGS__) +#define vfmsac_vv_f64m1_m(...) __riscv_vfmsac_vv_f64m1_tumu(__VA_ARGS__) +#define vfmsac_vf_f64m1_m(...) __riscv_vfmsac_vf_f64m1_tumu(__VA_ARGS__) +#define vfmsac_vv_f64m2_m(...) __riscv_vfmsac_vv_f64m2_tumu(__VA_ARGS__) +#define vfmsac_vf_f64m2_m(...) __riscv_vfmsac_vf_f64m2_tumu(__VA_ARGS__) +#define vfmsac_vv_f64m4_m(...) __riscv_vfmsac_vv_f64m4_tumu(__VA_ARGS__) +#define vfmsac_vf_f64m4_m(...) __riscv_vfmsac_vf_f64m4_tumu(__VA_ARGS__) +#define vfmsac_vv_f64m8_m(...) __riscv_vfmsac_vv_f64m8_tumu(__VA_ARGS__) +#define vfmsac_vf_f64m8_m(...) __riscv_vfmsac_vf_f64m8_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16mf4_m(...) __riscv_vfnmsac_vv_f16mf4_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16mf4_m(...) __riscv_vfnmsac_vf_f16mf4_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16mf2_m(...) __riscv_vfnmsac_vv_f16mf2_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16mf2_m(...) __riscv_vfnmsac_vf_f16mf2_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16m1_m(...) __riscv_vfnmsac_vv_f16m1_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16m1_m(...) __riscv_vfnmsac_vf_f16m1_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16m2_m(...) __riscv_vfnmsac_vv_f16m2_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16m2_m(...) __riscv_vfnmsac_vf_f16m2_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16m4_m(...) __riscv_vfnmsac_vv_f16m4_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16m4_m(...) __riscv_vfnmsac_vf_f16m4_tumu(__VA_ARGS__) +#define vfnmsac_vv_f16m8_m(...) __riscv_vfnmsac_vv_f16m8_tumu(__VA_ARGS__) +#define vfnmsac_vf_f16m8_m(...) __riscv_vfnmsac_vf_f16m8_tumu(__VA_ARGS__) +#define vfnmsac_vv_f32mf2_m(...) __riscv_vfnmsac_vv_f32mf2_tumu(__VA_ARGS__) +#define vfnmsac_vf_f32mf2_m(...) __riscv_vfnmsac_vf_f32mf2_tumu(__VA_ARGS__) +#define vfnmsac_vv_f32m1_m(...) __riscv_vfnmsac_vv_f32m1_tumu(__VA_ARGS__) +#define vfnmsac_vf_f32m1_m(...) __riscv_vfnmsac_vf_f32m1_tumu(__VA_ARGS__) +#define vfnmsac_vv_f32m2_m(...) __riscv_vfnmsac_vv_f32m2_tumu(__VA_ARGS__) +#define vfnmsac_vf_f32m2_m(...) __riscv_vfnmsac_vf_f32m2_tumu(__VA_ARGS__) +#define vfnmsac_vv_f32m4_m(...) __riscv_vfnmsac_vv_f32m4_tumu(__VA_ARGS__) +#define vfnmsac_vf_f32m4_m(...) __riscv_vfnmsac_vf_f32m4_tumu(__VA_ARGS__) +#define vfnmsac_vv_f32m8_m(...) __riscv_vfnmsac_vv_f32m8_tumu(__VA_ARGS__) +#define vfnmsac_vf_f32m8_m(...) __riscv_vfnmsac_vf_f32m8_tumu(__VA_ARGS__) +#define vfnmsac_vv_f64m1_m(...) __riscv_vfnmsac_vv_f64m1_tumu(__VA_ARGS__) +#define vfnmsac_vf_f64m1_m(...) __riscv_vfnmsac_vf_f64m1_tumu(__VA_ARGS__) +#define vfnmsac_vv_f64m2_m(...) __riscv_vfnmsac_vv_f64m2_tumu(__VA_ARGS__) +#define vfnmsac_vf_f64m2_m(...) __riscv_vfnmsac_vf_f64m2_tumu(__VA_ARGS__) +#define vfnmsac_vv_f64m4_m(...) __riscv_vfnmsac_vv_f64m4_tumu(__VA_ARGS__) +#define vfnmsac_vf_f64m4_m(...) __riscv_vfnmsac_vf_f64m4_tumu(__VA_ARGS__) +#define vfnmsac_vv_f64m8_m(...) __riscv_vfnmsac_vv_f64m8_tumu(__VA_ARGS__) +#define vfnmsac_vf_f64m8_m(...) __riscv_vfnmsac_vf_f64m8_tumu(__VA_ARGS__) +#define vfmadd_vv_f16mf4_m(...) __riscv_vfmadd_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmadd_vf_f16mf4_m(...) __riscv_vfmadd_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmadd_vv_f16mf2_m(...) __riscv_vfmadd_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmadd_vf_f16mf2_m(...) __riscv_vfmadd_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmadd_vv_f16m1_m(...) __riscv_vfmadd_vv_f16m1_tumu(__VA_ARGS__) +#define vfmadd_vf_f16m1_m(...) __riscv_vfmadd_vf_f16m1_tumu(__VA_ARGS__) +#define vfmadd_vv_f16m2_m(...) __riscv_vfmadd_vv_f16m2_tumu(__VA_ARGS__) +#define vfmadd_vf_f16m2_m(...) __riscv_vfmadd_vf_f16m2_tumu(__VA_ARGS__) +#define vfmadd_vv_f16m4_m(...) __riscv_vfmadd_vv_f16m4_tumu(__VA_ARGS__) +#define vfmadd_vf_f16m4_m(...) __riscv_vfmadd_vf_f16m4_tumu(__VA_ARGS__) +#define vfmadd_vv_f16m8_m(...) __riscv_vfmadd_vv_f16m8_tumu(__VA_ARGS__) +#define vfmadd_vf_f16m8_m(...) __riscv_vfmadd_vf_f16m8_tumu(__VA_ARGS__) +#define vfmadd_vv_f32mf2_m(...) __riscv_vfmadd_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmadd_vf_f32mf2_m(...) __riscv_vfmadd_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmadd_vv_f32m1_m(...) __riscv_vfmadd_vv_f32m1_tumu(__VA_ARGS__) +#define vfmadd_vf_f32m1_m(...) __riscv_vfmadd_vf_f32m1_tumu(__VA_ARGS__) +#define vfmadd_vv_f32m2_m(...) __riscv_vfmadd_vv_f32m2_tumu(__VA_ARGS__) +#define vfmadd_vf_f32m2_m(...) __riscv_vfmadd_vf_f32m2_tumu(__VA_ARGS__) +#define vfmadd_vv_f32m4_m(...) __riscv_vfmadd_vv_f32m4_tumu(__VA_ARGS__) +#define vfmadd_vf_f32m4_m(...) __riscv_vfmadd_vf_f32m4_tumu(__VA_ARGS__) +#define vfmadd_vv_f32m8_m(...) __riscv_vfmadd_vv_f32m8_tumu(__VA_ARGS__) +#define vfmadd_vf_f32m8_m(...) __riscv_vfmadd_vf_f32m8_tumu(__VA_ARGS__) +#define vfmadd_vv_f64m1_m(...) __riscv_vfmadd_vv_f64m1_tumu(__VA_ARGS__) +#define vfmadd_vf_f64m1_m(...) __riscv_vfmadd_vf_f64m1_tumu(__VA_ARGS__) +#define vfmadd_vv_f64m2_m(...) __riscv_vfmadd_vv_f64m2_tumu(__VA_ARGS__) +#define vfmadd_vf_f64m2_m(...) __riscv_vfmadd_vf_f64m2_tumu(__VA_ARGS__) +#define vfmadd_vv_f64m4_m(...) __riscv_vfmadd_vv_f64m4_tumu(__VA_ARGS__) +#define vfmadd_vf_f64m4_m(...) __riscv_vfmadd_vf_f64m4_tumu(__VA_ARGS__) +#define vfmadd_vv_f64m8_m(...) __riscv_vfmadd_vv_f64m8_tumu(__VA_ARGS__) +#define vfmadd_vf_f64m8_m(...) __riscv_vfmadd_vf_f64m8_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16mf4_m(...) __riscv_vfnmadd_vv_f16mf4_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16mf4_m(...) __riscv_vfnmadd_vf_f16mf4_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16mf2_m(...) __riscv_vfnmadd_vv_f16mf2_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16mf2_m(...) __riscv_vfnmadd_vf_f16mf2_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16m1_m(...) __riscv_vfnmadd_vv_f16m1_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16m1_m(...) __riscv_vfnmadd_vf_f16m1_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16m2_m(...) __riscv_vfnmadd_vv_f16m2_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16m2_m(...) __riscv_vfnmadd_vf_f16m2_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16m4_m(...) __riscv_vfnmadd_vv_f16m4_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16m4_m(...) __riscv_vfnmadd_vf_f16m4_tumu(__VA_ARGS__) +#define vfnmadd_vv_f16m8_m(...) __riscv_vfnmadd_vv_f16m8_tumu(__VA_ARGS__) +#define vfnmadd_vf_f16m8_m(...) __riscv_vfnmadd_vf_f16m8_tumu(__VA_ARGS__) +#define vfnmadd_vv_f32mf2_m(...) __riscv_vfnmadd_vv_f32mf2_tumu(__VA_ARGS__) +#define vfnmadd_vf_f32mf2_m(...) __riscv_vfnmadd_vf_f32mf2_tumu(__VA_ARGS__) +#define vfnmadd_vv_f32m1_m(...) __riscv_vfnmadd_vv_f32m1_tumu(__VA_ARGS__) +#define vfnmadd_vf_f32m1_m(...) __riscv_vfnmadd_vf_f32m1_tumu(__VA_ARGS__) +#define vfnmadd_vv_f32m2_m(...) __riscv_vfnmadd_vv_f32m2_tumu(__VA_ARGS__) +#define vfnmadd_vf_f32m2_m(...) __riscv_vfnmadd_vf_f32m2_tumu(__VA_ARGS__) +#define vfnmadd_vv_f32m4_m(...) __riscv_vfnmadd_vv_f32m4_tumu(__VA_ARGS__) +#define vfnmadd_vf_f32m4_m(...) __riscv_vfnmadd_vf_f32m4_tumu(__VA_ARGS__) +#define vfnmadd_vv_f32m8_m(...) __riscv_vfnmadd_vv_f32m8_tumu(__VA_ARGS__) +#define vfnmadd_vf_f32m8_m(...) __riscv_vfnmadd_vf_f32m8_tumu(__VA_ARGS__) +#define vfnmadd_vv_f64m1_m(...) __riscv_vfnmadd_vv_f64m1_tumu(__VA_ARGS__) +#define vfnmadd_vf_f64m1_m(...) __riscv_vfnmadd_vf_f64m1_tumu(__VA_ARGS__) +#define vfnmadd_vv_f64m2_m(...) __riscv_vfnmadd_vv_f64m2_tumu(__VA_ARGS__) +#define vfnmadd_vf_f64m2_m(...) __riscv_vfnmadd_vf_f64m2_tumu(__VA_ARGS__) +#define vfnmadd_vv_f64m4_m(...) __riscv_vfnmadd_vv_f64m4_tumu(__VA_ARGS__) +#define vfnmadd_vf_f64m4_m(...) __riscv_vfnmadd_vf_f64m4_tumu(__VA_ARGS__) +#define vfnmadd_vv_f64m8_m(...) __riscv_vfnmadd_vv_f64m8_tumu(__VA_ARGS__) +#define vfnmadd_vf_f64m8_m(...) __riscv_vfnmadd_vf_f64m8_tumu(__VA_ARGS__) +#define vfmsub_vv_f16mf4_m(...) __riscv_vfmsub_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmsub_vf_f16mf4_m(...) __riscv_vfmsub_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmsub_vv_f16mf2_m(...) __riscv_vfmsub_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmsub_vf_f16mf2_m(...) __riscv_vfmsub_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmsub_vv_f16m1_m(...) __riscv_vfmsub_vv_f16m1_tumu(__VA_ARGS__) +#define vfmsub_vf_f16m1_m(...) __riscv_vfmsub_vf_f16m1_tumu(__VA_ARGS__) +#define vfmsub_vv_f16m2_m(...) __riscv_vfmsub_vv_f16m2_tumu(__VA_ARGS__) +#define vfmsub_vf_f16m2_m(...) __riscv_vfmsub_vf_f16m2_tumu(__VA_ARGS__) +#define vfmsub_vv_f16m4_m(...) __riscv_vfmsub_vv_f16m4_tumu(__VA_ARGS__) +#define vfmsub_vf_f16m4_m(...) __riscv_vfmsub_vf_f16m4_tumu(__VA_ARGS__) +#define vfmsub_vv_f16m8_m(...) __riscv_vfmsub_vv_f16m8_tumu(__VA_ARGS__) +#define vfmsub_vf_f16m8_m(...) __riscv_vfmsub_vf_f16m8_tumu(__VA_ARGS__) +#define vfmsub_vv_f32mf2_m(...) __riscv_vfmsub_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmsub_vf_f32mf2_m(...) __riscv_vfmsub_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmsub_vv_f32m1_m(...) __riscv_vfmsub_vv_f32m1_tumu(__VA_ARGS__) +#define vfmsub_vf_f32m1_m(...) __riscv_vfmsub_vf_f32m1_tumu(__VA_ARGS__) +#define vfmsub_vv_f32m2_m(...) __riscv_vfmsub_vv_f32m2_tumu(__VA_ARGS__) +#define vfmsub_vf_f32m2_m(...) __riscv_vfmsub_vf_f32m2_tumu(__VA_ARGS__) +#define vfmsub_vv_f32m4_m(...) __riscv_vfmsub_vv_f32m4_tumu(__VA_ARGS__) +#define vfmsub_vf_f32m4_m(...) __riscv_vfmsub_vf_f32m4_tumu(__VA_ARGS__) +#define vfmsub_vv_f32m8_m(...) __riscv_vfmsub_vv_f32m8_tumu(__VA_ARGS__) +#define vfmsub_vf_f32m8_m(...) __riscv_vfmsub_vf_f32m8_tumu(__VA_ARGS__) +#define vfmsub_vv_f64m1_m(...) __riscv_vfmsub_vv_f64m1_tumu(__VA_ARGS__) +#define vfmsub_vf_f64m1_m(...) __riscv_vfmsub_vf_f64m1_tumu(__VA_ARGS__) +#define vfmsub_vv_f64m2_m(...) __riscv_vfmsub_vv_f64m2_tumu(__VA_ARGS__) +#define vfmsub_vf_f64m2_m(...) __riscv_vfmsub_vf_f64m2_tumu(__VA_ARGS__) +#define vfmsub_vv_f64m4_m(...) __riscv_vfmsub_vv_f64m4_tumu(__VA_ARGS__) +#define vfmsub_vf_f64m4_m(...) __riscv_vfmsub_vf_f64m4_tumu(__VA_ARGS__) +#define vfmsub_vv_f64m8_m(...) __riscv_vfmsub_vv_f64m8_tumu(__VA_ARGS__) +#define vfmsub_vf_f64m8_m(...) __riscv_vfmsub_vf_f64m8_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16mf4_m(...) __riscv_vfnmsub_vv_f16mf4_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16mf4_m(...) __riscv_vfnmsub_vf_f16mf4_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16mf2_m(...) __riscv_vfnmsub_vv_f16mf2_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16mf2_m(...) __riscv_vfnmsub_vf_f16mf2_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16m1_m(...) __riscv_vfnmsub_vv_f16m1_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16m1_m(...) __riscv_vfnmsub_vf_f16m1_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16m2_m(...) __riscv_vfnmsub_vv_f16m2_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16m2_m(...) __riscv_vfnmsub_vf_f16m2_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16m4_m(...) __riscv_vfnmsub_vv_f16m4_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16m4_m(...) __riscv_vfnmsub_vf_f16m4_tumu(__VA_ARGS__) +#define vfnmsub_vv_f16m8_m(...) __riscv_vfnmsub_vv_f16m8_tumu(__VA_ARGS__) +#define vfnmsub_vf_f16m8_m(...) __riscv_vfnmsub_vf_f16m8_tumu(__VA_ARGS__) +#define vfnmsub_vv_f32mf2_m(...) __riscv_vfnmsub_vv_f32mf2_tumu(__VA_ARGS__) +#define vfnmsub_vf_f32mf2_m(...) __riscv_vfnmsub_vf_f32mf2_tumu(__VA_ARGS__) +#define vfnmsub_vv_f32m1_m(...) __riscv_vfnmsub_vv_f32m1_tumu(__VA_ARGS__) +#define vfnmsub_vf_f32m1_m(...) __riscv_vfnmsub_vf_f32m1_tumu(__VA_ARGS__) +#define vfnmsub_vv_f32m2_m(...) __riscv_vfnmsub_vv_f32m2_tumu(__VA_ARGS__) +#define vfnmsub_vf_f32m2_m(...) __riscv_vfnmsub_vf_f32m2_tumu(__VA_ARGS__) +#define vfnmsub_vv_f32m4_m(...) __riscv_vfnmsub_vv_f32m4_tumu(__VA_ARGS__) +#define vfnmsub_vf_f32m4_m(...) __riscv_vfnmsub_vf_f32m4_tumu(__VA_ARGS__) +#define vfnmsub_vv_f32m8_m(...) __riscv_vfnmsub_vv_f32m8_tumu(__VA_ARGS__) +#define vfnmsub_vf_f32m8_m(...) __riscv_vfnmsub_vf_f32m8_tumu(__VA_ARGS__) +#define vfnmsub_vv_f64m1_m(...) __riscv_vfnmsub_vv_f64m1_tumu(__VA_ARGS__) +#define vfnmsub_vf_f64m1_m(...) __riscv_vfnmsub_vf_f64m1_tumu(__VA_ARGS__) +#define vfnmsub_vv_f64m2_m(...) __riscv_vfnmsub_vv_f64m2_tumu(__VA_ARGS__) +#define vfnmsub_vf_f64m2_m(...) __riscv_vfnmsub_vf_f64m2_tumu(__VA_ARGS__) +#define vfnmsub_vv_f64m4_m(...) __riscv_vfnmsub_vv_f64m4_tumu(__VA_ARGS__) +#define vfnmsub_vf_f64m4_m(...) __riscv_vfnmsub_vf_f64m4_tumu(__VA_ARGS__) +#define vfnmsub_vv_f64m8_m(...) __riscv_vfnmsub_vv_f64m8_tumu(__VA_ARGS__) +#define vfnmsub_vf_f64m8_m(...) __riscv_vfnmsub_vf_f64m8_tumu(__VA_ARGS__) +#define vfwmacc_vv_f32mf2(...) __riscv_vfwmacc_vv_f32mf2_tu(__VA_ARGS__) +#define vfwmacc_vf_f32mf2(...) __riscv_vfwmacc_vf_f32mf2_tu(__VA_ARGS__) +#define vfwmacc_vv_f32m1(...) __riscv_vfwmacc_vv_f32m1_tu(__VA_ARGS__) +#define vfwmacc_vf_f32m1(...) __riscv_vfwmacc_vf_f32m1_tu(__VA_ARGS__) +#define vfwmacc_vv_f32m2(...) __riscv_vfwmacc_vv_f32m2_tu(__VA_ARGS__) +#define vfwmacc_vf_f32m2(...) __riscv_vfwmacc_vf_f32m2_tu(__VA_ARGS__) +#define vfwmacc_vv_f32m4(...) __riscv_vfwmacc_vv_f32m4_tu(__VA_ARGS__) +#define vfwmacc_vf_f32m4(...) __riscv_vfwmacc_vf_f32m4_tu(__VA_ARGS__) +#define vfwmacc_vv_f32m8(...) __riscv_vfwmacc_vv_f32m8_tu(__VA_ARGS__) +#define vfwmacc_vf_f32m8(...) __riscv_vfwmacc_vf_f32m8_tu(__VA_ARGS__) +#define vfwmacc_vv_f64m1(...) __riscv_vfwmacc_vv_f64m1_tu(__VA_ARGS__) +#define vfwmacc_vf_f64m1(...) __riscv_vfwmacc_vf_f64m1_tu(__VA_ARGS__) +#define vfwmacc_vv_f64m2(...) __riscv_vfwmacc_vv_f64m2_tu(__VA_ARGS__) +#define vfwmacc_vf_f64m2(...) __riscv_vfwmacc_vf_f64m2_tu(__VA_ARGS__) +#define vfwmacc_vv_f64m4(...) __riscv_vfwmacc_vv_f64m4_tu(__VA_ARGS__) +#define vfwmacc_vf_f64m4(...) __riscv_vfwmacc_vf_f64m4_tu(__VA_ARGS__) +#define vfwmacc_vv_f64m8(...) __riscv_vfwmacc_vv_f64m8_tu(__VA_ARGS__) +#define vfwmacc_vf_f64m8(...) __riscv_vfwmacc_vf_f64m8_tu(__VA_ARGS__) +#define vfwnmacc_vv_f32mf2(...) __riscv_vfwnmacc_vv_f32mf2_tu(__VA_ARGS__) +#define vfwnmacc_vf_f32mf2(...) __riscv_vfwnmacc_vf_f32mf2_tu(__VA_ARGS__) +#define vfwnmacc_vv_f32m1(...) __riscv_vfwnmacc_vv_f32m1_tu(__VA_ARGS__) +#define vfwnmacc_vf_f32m1(...) __riscv_vfwnmacc_vf_f32m1_tu(__VA_ARGS__) +#define vfwnmacc_vv_f32m2(...) __riscv_vfwnmacc_vv_f32m2_tu(__VA_ARGS__) +#define vfwnmacc_vf_f32m2(...) __riscv_vfwnmacc_vf_f32m2_tu(__VA_ARGS__) +#define vfwnmacc_vv_f32m4(...) __riscv_vfwnmacc_vv_f32m4_tu(__VA_ARGS__) +#define vfwnmacc_vf_f32m4(...) __riscv_vfwnmacc_vf_f32m4_tu(__VA_ARGS__) +#define vfwnmacc_vv_f32m8(...) __riscv_vfwnmacc_vv_f32m8_tu(__VA_ARGS__) +#define vfwnmacc_vf_f32m8(...) __riscv_vfwnmacc_vf_f32m8_tu(__VA_ARGS__) +#define vfwnmacc_vv_f64m1(...) __riscv_vfwnmacc_vv_f64m1_tu(__VA_ARGS__) +#define vfwnmacc_vf_f64m1(...) __riscv_vfwnmacc_vf_f64m1_tu(__VA_ARGS__) +#define vfwnmacc_vv_f64m2(...) __riscv_vfwnmacc_vv_f64m2_tu(__VA_ARGS__) +#define vfwnmacc_vf_f64m2(...) __riscv_vfwnmacc_vf_f64m2_tu(__VA_ARGS__) +#define vfwnmacc_vv_f64m4(...) __riscv_vfwnmacc_vv_f64m4_tu(__VA_ARGS__) +#define vfwnmacc_vf_f64m4(...) __riscv_vfwnmacc_vf_f64m4_tu(__VA_ARGS__) +#define vfwnmacc_vv_f64m8(...) __riscv_vfwnmacc_vv_f64m8_tu(__VA_ARGS__) +#define vfwnmacc_vf_f64m8(...) __riscv_vfwnmacc_vf_f64m8_tu(__VA_ARGS__) +#define vfwmsac_vv_f32mf2(...) __riscv_vfwmsac_vv_f32mf2_tu(__VA_ARGS__) +#define vfwmsac_vf_f32mf2(...) __riscv_vfwmsac_vf_f32mf2_tu(__VA_ARGS__) +#define vfwmsac_vv_f32m1(...) __riscv_vfwmsac_vv_f32m1_tu(__VA_ARGS__) +#define vfwmsac_vf_f32m1(...) __riscv_vfwmsac_vf_f32m1_tu(__VA_ARGS__) +#define vfwmsac_vv_f32m2(...) __riscv_vfwmsac_vv_f32m2_tu(__VA_ARGS__) +#define vfwmsac_vf_f32m2(...) __riscv_vfwmsac_vf_f32m2_tu(__VA_ARGS__) +#define vfwmsac_vv_f32m4(...) __riscv_vfwmsac_vv_f32m4_tu(__VA_ARGS__) +#define vfwmsac_vf_f32m4(...) __riscv_vfwmsac_vf_f32m4_tu(__VA_ARGS__) +#define vfwmsac_vv_f32m8(...) __riscv_vfwmsac_vv_f32m8_tu(__VA_ARGS__) +#define vfwmsac_vf_f32m8(...) __riscv_vfwmsac_vf_f32m8_tu(__VA_ARGS__) +#define vfwmsac_vv_f64m1(...) __riscv_vfwmsac_vv_f64m1_tu(__VA_ARGS__) +#define vfwmsac_vf_f64m1(...) __riscv_vfwmsac_vf_f64m1_tu(__VA_ARGS__) +#define vfwmsac_vv_f64m2(...) __riscv_vfwmsac_vv_f64m2_tu(__VA_ARGS__) +#define vfwmsac_vf_f64m2(...) __riscv_vfwmsac_vf_f64m2_tu(__VA_ARGS__) +#define vfwmsac_vv_f64m4(...) __riscv_vfwmsac_vv_f64m4_tu(__VA_ARGS__) +#define vfwmsac_vf_f64m4(...) __riscv_vfwmsac_vf_f64m4_tu(__VA_ARGS__) +#define vfwmsac_vv_f64m8(...) __riscv_vfwmsac_vv_f64m8_tu(__VA_ARGS__) +#define vfwmsac_vf_f64m8(...) __riscv_vfwmsac_vf_f64m8_tu(__VA_ARGS__) +#define vfwnmsac_vv_f32mf2(...) __riscv_vfwnmsac_vv_f32mf2_tu(__VA_ARGS__) +#define vfwnmsac_vf_f32mf2(...) __riscv_vfwnmsac_vf_f32mf2_tu(__VA_ARGS__) +#define vfwnmsac_vv_f32m1(...) __riscv_vfwnmsac_vv_f32m1_tu(__VA_ARGS__) +#define vfwnmsac_vf_f32m1(...) __riscv_vfwnmsac_vf_f32m1_tu(__VA_ARGS__) +#define vfwnmsac_vv_f32m2(...) __riscv_vfwnmsac_vv_f32m2_tu(__VA_ARGS__) +#define vfwnmsac_vf_f32m2(...) __riscv_vfwnmsac_vf_f32m2_tu(__VA_ARGS__) +#define vfwnmsac_vv_f32m4(...) __riscv_vfwnmsac_vv_f32m4_tu(__VA_ARGS__) +#define vfwnmsac_vf_f32m4(...) __riscv_vfwnmsac_vf_f32m4_tu(__VA_ARGS__) +#define vfwnmsac_vv_f32m8(...) __riscv_vfwnmsac_vv_f32m8_tu(__VA_ARGS__) +#define vfwnmsac_vf_f32m8(...) __riscv_vfwnmsac_vf_f32m8_tu(__VA_ARGS__) +#define vfwnmsac_vv_f64m1(...) __riscv_vfwnmsac_vv_f64m1_tu(__VA_ARGS__) +#define vfwnmsac_vf_f64m1(...) __riscv_vfwnmsac_vf_f64m1_tu(__VA_ARGS__) +#define vfwnmsac_vv_f64m2(...) __riscv_vfwnmsac_vv_f64m2_tu(__VA_ARGS__) +#define vfwnmsac_vf_f64m2(...) __riscv_vfwnmsac_vf_f64m2_tu(__VA_ARGS__) +#define vfwnmsac_vv_f64m4(...) __riscv_vfwnmsac_vv_f64m4_tu(__VA_ARGS__) +#define vfwnmsac_vf_f64m4(...) __riscv_vfwnmsac_vf_f64m4_tu(__VA_ARGS__) +#define vfwnmsac_vv_f64m8(...) __riscv_vfwnmsac_vv_f64m8_tu(__VA_ARGS__) +#define vfwnmsac_vf_f64m8(...) __riscv_vfwnmsac_vf_f64m8_tu(__VA_ARGS__) +// masked functions +#define vfwmacc_vv_f32mf2_m(...) __riscv_vfwmacc_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwmacc_vf_f32mf2_m(...) __riscv_vfwmacc_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwmacc_vv_f32m1_m(...) __riscv_vfwmacc_vv_f32m1_tumu(__VA_ARGS__) +#define vfwmacc_vf_f32m1_m(...) __riscv_vfwmacc_vf_f32m1_tumu(__VA_ARGS__) +#define vfwmacc_vv_f32m2_m(...) __riscv_vfwmacc_vv_f32m2_tumu(__VA_ARGS__) +#define vfwmacc_vf_f32m2_m(...) __riscv_vfwmacc_vf_f32m2_tumu(__VA_ARGS__) +#define vfwmacc_vv_f32m4_m(...) __riscv_vfwmacc_vv_f32m4_tumu(__VA_ARGS__) +#define vfwmacc_vf_f32m4_m(...) __riscv_vfwmacc_vf_f32m4_tumu(__VA_ARGS__) +#define vfwmacc_vv_f32m8_m(...) __riscv_vfwmacc_vv_f32m8_tumu(__VA_ARGS__) +#define vfwmacc_vf_f32m8_m(...) __riscv_vfwmacc_vf_f32m8_tumu(__VA_ARGS__) +#define vfwmacc_vv_f64m1_m(...) __riscv_vfwmacc_vv_f64m1_tumu(__VA_ARGS__) +#define vfwmacc_vf_f64m1_m(...) __riscv_vfwmacc_vf_f64m1_tumu(__VA_ARGS__) +#define vfwmacc_vv_f64m2_m(...) __riscv_vfwmacc_vv_f64m2_tumu(__VA_ARGS__) +#define vfwmacc_vf_f64m2_m(...) __riscv_vfwmacc_vf_f64m2_tumu(__VA_ARGS__) +#define vfwmacc_vv_f64m4_m(...) __riscv_vfwmacc_vv_f64m4_tumu(__VA_ARGS__) +#define vfwmacc_vf_f64m4_m(...) __riscv_vfwmacc_vf_f64m4_tumu(__VA_ARGS__) +#define vfwmacc_vv_f64m8_m(...) __riscv_vfwmacc_vv_f64m8_tumu(__VA_ARGS__) +#define vfwmacc_vf_f64m8_m(...) __riscv_vfwmacc_vf_f64m8_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f32mf2_m(...) __riscv_vfwnmacc_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f32mf2_m(...) __riscv_vfwnmacc_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f32m1_m(...) __riscv_vfwnmacc_vv_f32m1_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f32m1_m(...) __riscv_vfwnmacc_vf_f32m1_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f32m2_m(...) __riscv_vfwnmacc_vv_f32m2_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f32m2_m(...) __riscv_vfwnmacc_vf_f32m2_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f32m4_m(...) __riscv_vfwnmacc_vv_f32m4_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f32m4_m(...) __riscv_vfwnmacc_vf_f32m4_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f32m8_m(...) __riscv_vfwnmacc_vv_f32m8_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f32m8_m(...) __riscv_vfwnmacc_vf_f32m8_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f64m1_m(...) __riscv_vfwnmacc_vv_f64m1_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f64m1_m(...) __riscv_vfwnmacc_vf_f64m1_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f64m2_m(...) __riscv_vfwnmacc_vv_f64m2_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f64m2_m(...) __riscv_vfwnmacc_vf_f64m2_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f64m4_m(...) __riscv_vfwnmacc_vv_f64m4_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f64m4_m(...) __riscv_vfwnmacc_vf_f64m4_tumu(__VA_ARGS__) +#define vfwnmacc_vv_f64m8_m(...) __riscv_vfwnmacc_vv_f64m8_tumu(__VA_ARGS__) +#define vfwnmacc_vf_f64m8_m(...) __riscv_vfwnmacc_vf_f64m8_tumu(__VA_ARGS__) +#define vfwmsac_vv_f32mf2_m(...) __riscv_vfwmsac_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwmsac_vf_f32mf2_m(...) __riscv_vfwmsac_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwmsac_vv_f32m1_m(...) __riscv_vfwmsac_vv_f32m1_tumu(__VA_ARGS__) +#define vfwmsac_vf_f32m1_m(...) __riscv_vfwmsac_vf_f32m1_tumu(__VA_ARGS__) +#define vfwmsac_vv_f32m2_m(...) __riscv_vfwmsac_vv_f32m2_tumu(__VA_ARGS__) +#define vfwmsac_vf_f32m2_m(...) __riscv_vfwmsac_vf_f32m2_tumu(__VA_ARGS__) +#define vfwmsac_vv_f32m4_m(...) __riscv_vfwmsac_vv_f32m4_tumu(__VA_ARGS__) +#define vfwmsac_vf_f32m4_m(...) __riscv_vfwmsac_vf_f32m4_tumu(__VA_ARGS__) +#define vfwmsac_vv_f32m8_m(...) __riscv_vfwmsac_vv_f32m8_tumu(__VA_ARGS__) +#define vfwmsac_vf_f32m8_m(...) __riscv_vfwmsac_vf_f32m8_tumu(__VA_ARGS__) +#define vfwmsac_vv_f64m1_m(...) __riscv_vfwmsac_vv_f64m1_tumu(__VA_ARGS__) +#define vfwmsac_vf_f64m1_m(...) __riscv_vfwmsac_vf_f64m1_tumu(__VA_ARGS__) +#define vfwmsac_vv_f64m2_m(...) __riscv_vfwmsac_vv_f64m2_tumu(__VA_ARGS__) +#define vfwmsac_vf_f64m2_m(...) __riscv_vfwmsac_vf_f64m2_tumu(__VA_ARGS__) +#define vfwmsac_vv_f64m4_m(...) __riscv_vfwmsac_vv_f64m4_tumu(__VA_ARGS__) +#define vfwmsac_vf_f64m4_m(...) __riscv_vfwmsac_vf_f64m4_tumu(__VA_ARGS__) +#define vfwmsac_vv_f64m8_m(...) __riscv_vfwmsac_vv_f64m8_tumu(__VA_ARGS__) +#define vfwmsac_vf_f64m8_m(...) __riscv_vfwmsac_vf_f64m8_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f32mf2_m(...) __riscv_vfwnmsac_vv_f32mf2_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f32mf2_m(...) __riscv_vfwnmsac_vf_f32mf2_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f32m1_m(...) __riscv_vfwnmsac_vv_f32m1_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f32m1_m(...) __riscv_vfwnmsac_vf_f32m1_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f32m2_m(...) __riscv_vfwnmsac_vv_f32m2_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f32m2_m(...) __riscv_vfwnmsac_vf_f32m2_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f32m4_m(...) __riscv_vfwnmsac_vv_f32m4_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f32m4_m(...) __riscv_vfwnmsac_vf_f32m4_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f32m8_m(...) __riscv_vfwnmsac_vv_f32m8_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f32m8_m(...) __riscv_vfwnmsac_vf_f32m8_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f64m1_m(...) __riscv_vfwnmsac_vv_f64m1_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f64m1_m(...) __riscv_vfwnmsac_vf_f64m1_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f64m2_m(...) __riscv_vfwnmsac_vv_f64m2_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f64m2_m(...) __riscv_vfwnmsac_vf_f64m2_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f64m4_m(...) __riscv_vfwnmsac_vv_f64m4_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f64m4_m(...) __riscv_vfwnmsac_vf_f64m4_tumu(__VA_ARGS__) +#define vfwnmsac_vv_f64m8_m(...) __riscv_vfwnmsac_vv_f64m8_tumu(__VA_ARGS__) +#define vfwnmsac_vf_f64m8_m(...) __riscv_vfwnmsac_vf_f64m8_tumu(__VA_ARGS__) +#define vfsqrt_v_f16mf4(...) __riscv_vfsqrt_v_f16mf4(__VA_ARGS__) +#define vfsqrt_v_f16mf2(...) __riscv_vfsqrt_v_f16mf2(__VA_ARGS__) +#define vfsqrt_v_f16m1(...) __riscv_vfsqrt_v_f16m1(__VA_ARGS__) +#define vfsqrt_v_f16m2(...) __riscv_vfsqrt_v_f16m2(__VA_ARGS__) +#define vfsqrt_v_f16m4(...) __riscv_vfsqrt_v_f16m4(__VA_ARGS__) +#define vfsqrt_v_f16m8(...) __riscv_vfsqrt_v_f16m8(__VA_ARGS__) +#define vfsqrt_v_f32mf2(...) __riscv_vfsqrt_v_f32mf2(__VA_ARGS__) +#define vfsqrt_v_f32m1(...) __riscv_vfsqrt_v_f32m1(__VA_ARGS__) +#define vfsqrt_v_f32m2(...) __riscv_vfsqrt_v_f32m2(__VA_ARGS__) +#define vfsqrt_v_f32m4(...) __riscv_vfsqrt_v_f32m4(__VA_ARGS__) +#define vfsqrt_v_f32m8(...) __riscv_vfsqrt_v_f32m8(__VA_ARGS__) +#define vfsqrt_v_f64m1(...) __riscv_vfsqrt_v_f64m1(__VA_ARGS__) +#define vfsqrt_v_f64m2(...) __riscv_vfsqrt_v_f64m2(__VA_ARGS__) +#define vfsqrt_v_f64m4(...) __riscv_vfsqrt_v_f64m4(__VA_ARGS__) +#define vfsqrt_v_f64m8(...) __riscv_vfsqrt_v_f64m8(__VA_ARGS__) +// masked functions +#define vfsqrt_v_f16mf4_m(...) __riscv_vfsqrt_v_f16mf4_tumu(__VA_ARGS__) +#define vfsqrt_v_f16mf2_m(...) __riscv_vfsqrt_v_f16mf2_tumu(__VA_ARGS__) +#define vfsqrt_v_f16m1_m(...) __riscv_vfsqrt_v_f16m1_tumu(__VA_ARGS__) +#define vfsqrt_v_f16m2_m(...) __riscv_vfsqrt_v_f16m2_tumu(__VA_ARGS__) +#define vfsqrt_v_f16m4_m(...) __riscv_vfsqrt_v_f16m4_tumu(__VA_ARGS__) +#define vfsqrt_v_f16m8_m(...) __riscv_vfsqrt_v_f16m8_tumu(__VA_ARGS__) +#define vfsqrt_v_f32mf2_m(...) __riscv_vfsqrt_v_f32mf2_tumu(__VA_ARGS__) +#define vfsqrt_v_f32m1_m(...) __riscv_vfsqrt_v_f32m1_tumu(__VA_ARGS__) +#define vfsqrt_v_f32m2_m(...) __riscv_vfsqrt_v_f32m2_tumu(__VA_ARGS__) +#define vfsqrt_v_f32m4_m(...) __riscv_vfsqrt_v_f32m4_tumu(__VA_ARGS__) +#define vfsqrt_v_f32m8_m(...) __riscv_vfsqrt_v_f32m8_tumu(__VA_ARGS__) +#define vfsqrt_v_f64m1_m(...) __riscv_vfsqrt_v_f64m1_tumu(__VA_ARGS__) +#define vfsqrt_v_f64m2_m(...) __riscv_vfsqrt_v_f64m2_tumu(__VA_ARGS__) +#define vfsqrt_v_f64m4_m(...) __riscv_vfsqrt_v_f64m4_tumu(__VA_ARGS__) +#define vfsqrt_v_f64m8_m(...) __riscv_vfsqrt_v_f64m8_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16mf4(...) __riscv_vfrsqrt7_v_f16mf4(__VA_ARGS__) +#define vfrsqrt7_v_f16mf2(...) __riscv_vfrsqrt7_v_f16mf2(__VA_ARGS__) +#define vfrsqrt7_v_f16m1(...) __riscv_vfrsqrt7_v_f16m1(__VA_ARGS__) +#define vfrsqrt7_v_f16m2(...) __riscv_vfrsqrt7_v_f16m2(__VA_ARGS__) +#define vfrsqrt7_v_f16m4(...) __riscv_vfrsqrt7_v_f16m4(__VA_ARGS__) +#define vfrsqrt7_v_f16m8(...) __riscv_vfrsqrt7_v_f16m8(__VA_ARGS__) +#define vfrsqrt7_v_f32mf2(...) __riscv_vfrsqrt7_v_f32mf2(__VA_ARGS__) +#define vfrsqrt7_v_f32m1(...) __riscv_vfrsqrt7_v_f32m1(__VA_ARGS__) +#define vfrsqrt7_v_f32m2(...) __riscv_vfrsqrt7_v_f32m2(__VA_ARGS__) +#define vfrsqrt7_v_f32m4(...) __riscv_vfrsqrt7_v_f32m4(__VA_ARGS__) +#define vfrsqrt7_v_f32m8(...) __riscv_vfrsqrt7_v_f32m8(__VA_ARGS__) +#define vfrsqrt7_v_f64m1(...) __riscv_vfrsqrt7_v_f64m1(__VA_ARGS__) +#define vfrsqrt7_v_f64m2(...) __riscv_vfrsqrt7_v_f64m2(__VA_ARGS__) +#define vfrsqrt7_v_f64m4(...) __riscv_vfrsqrt7_v_f64m4(__VA_ARGS__) +#define vfrsqrt7_v_f64m8(...) __riscv_vfrsqrt7_v_f64m8(__VA_ARGS__) +// masked functions +#define vfrsqrt7_v_f16mf4_m(...) __riscv_vfrsqrt7_v_f16mf4_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16mf2_m(...) __riscv_vfrsqrt7_v_f16mf2_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16m1_m(...) __riscv_vfrsqrt7_v_f16m1_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16m2_m(...) __riscv_vfrsqrt7_v_f16m2_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16m4_m(...) __riscv_vfrsqrt7_v_f16m4_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f16m8_m(...) __riscv_vfrsqrt7_v_f16m8_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f32mf2_m(...) __riscv_vfrsqrt7_v_f32mf2_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f32m1_m(...) __riscv_vfrsqrt7_v_f32m1_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f32m2_m(...) __riscv_vfrsqrt7_v_f32m2_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f32m4_m(...) __riscv_vfrsqrt7_v_f32m4_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f32m8_m(...) __riscv_vfrsqrt7_v_f32m8_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f64m1_m(...) __riscv_vfrsqrt7_v_f64m1_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f64m2_m(...) __riscv_vfrsqrt7_v_f64m2_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f64m4_m(...) __riscv_vfrsqrt7_v_f64m4_tumu(__VA_ARGS__) +#define vfrsqrt7_v_f64m8_m(...) __riscv_vfrsqrt7_v_f64m8_tumu(__VA_ARGS__) +#define vfrec7_v_f16mf4(...) __riscv_vfrec7_v_f16mf4(__VA_ARGS__) +#define vfrec7_v_f16mf2(...) __riscv_vfrec7_v_f16mf2(__VA_ARGS__) +#define vfrec7_v_f16m1(...) __riscv_vfrec7_v_f16m1(__VA_ARGS__) +#define vfrec7_v_f16m2(...) __riscv_vfrec7_v_f16m2(__VA_ARGS__) +#define vfrec7_v_f16m4(...) __riscv_vfrec7_v_f16m4(__VA_ARGS__) +#define vfrec7_v_f16m8(...) __riscv_vfrec7_v_f16m8(__VA_ARGS__) +#define vfrec7_v_f32mf2(...) __riscv_vfrec7_v_f32mf2(__VA_ARGS__) +#define vfrec7_v_f32m1(...) __riscv_vfrec7_v_f32m1(__VA_ARGS__) +#define vfrec7_v_f32m2(...) __riscv_vfrec7_v_f32m2(__VA_ARGS__) +#define vfrec7_v_f32m4(...) __riscv_vfrec7_v_f32m4(__VA_ARGS__) +#define vfrec7_v_f32m8(...) __riscv_vfrec7_v_f32m8(__VA_ARGS__) +#define vfrec7_v_f64m1(...) __riscv_vfrec7_v_f64m1(__VA_ARGS__) +#define vfrec7_v_f64m2(...) __riscv_vfrec7_v_f64m2(__VA_ARGS__) +#define vfrec7_v_f64m4(...) __riscv_vfrec7_v_f64m4(__VA_ARGS__) +#define vfrec7_v_f64m8(...) __riscv_vfrec7_v_f64m8(__VA_ARGS__) +// masked functions +#define vfrec7_v_f16mf4_m(...) __riscv_vfrec7_v_f16mf4_tumu(__VA_ARGS__) +#define vfrec7_v_f16mf2_m(...) __riscv_vfrec7_v_f16mf2_tumu(__VA_ARGS__) +#define vfrec7_v_f16m1_m(...) __riscv_vfrec7_v_f16m1_tumu(__VA_ARGS__) +#define vfrec7_v_f16m2_m(...) __riscv_vfrec7_v_f16m2_tumu(__VA_ARGS__) +#define vfrec7_v_f16m4_m(...) __riscv_vfrec7_v_f16m4_tumu(__VA_ARGS__) +#define vfrec7_v_f16m8_m(...) __riscv_vfrec7_v_f16m8_tumu(__VA_ARGS__) +#define vfrec7_v_f32mf2_m(...) __riscv_vfrec7_v_f32mf2_tumu(__VA_ARGS__) +#define vfrec7_v_f32m1_m(...) __riscv_vfrec7_v_f32m1_tumu(__VA_ARGS__) +#define vfrec7_v_f32m2_m(...) __riscv_vfrec7_v_f32m2_tumu(__VA_ARGS__) +#define vfrec7_v_f32m4_m(...) __riscv_vfrec7_v_f32m4_tumu(__VA_ARGS__) +#define vfrec7_v_f32m8_m(...) __riscv_vfrec7_v_f32m8_tumu(__VA_ARGS__) +#define vfrec7_v_f64m1_m(...) __riscv_vfrec7_v_f64m1_tumu(__VA_ARGS__) +#define vfrec7_v_f64m2_m(...) __riscv_vfrec7_v_f64m2_tumu(__VA_ARGS__) +#define vfrec7_v_f64m4_m(...) __riscv_vfrec7_v_f64m4_tumu(__VA_ARGS__) +#define vfrec7_v_f64m8_m(...) __riscv_vfrec7_v_f64m8_tumu(__VA_ARGS__) +#define vfmin_vv_f16mf4(...) __riscv_vfmin_vv_f16mf4(__VA_ARGS__) +#define vfmin_vf_f16mf4(...) __riscv_vfmin_vf_f16mf4(__VA_ARGS__) +#define vfmin_vv_f16mf2(...) __riscv_vfmin_vv_f16mf2(__VA_ARGS__) +#define vfmin_vf_f16mf2(...) __riscv_vfmin_vf_f16mf2(__VA_ARGS__) +#define vfmin_vv_f16m1(...) __riscv_vfmin_vv_f16m1(__VA_ARGS__) +#define vfmin_vf_f16m1(...) __riscv_vfmin_vf_f16m1(__VA_ARGS__) +#define vfmin_vv_f16m2(...) __riscv_vfmin_vv_f16m2(__VA_ARGS__) +#define vfmin_vf_f16m2(...) __riscv_vfmin_vf_f16m2(__VA_ARGS__) +#define vfmin_vv_f16m4(...) __riscv_vfmin_vv_f16m4(__VA_ARGS__) +#define vfmin_vf_f16m4(...) __riscv_vfmin_vf_f16m4(__VA_ARGS__) +#define vfmin_vv_f16m8(...) __riscv_vfmin_vv_f16m8(__VA_ARGS__) +#define vfmin_vf_f16m8(...) __riscv_vfmin_vf_f16m8(__VA_ARGS__) +#define vfmin_vv_f32mf2(...) __riscv_vfmin_vv_f32mf2(__VA_ARGS__) +#define vfmin_vf_f32mf2(...) __riscv_vfmin_vf_f32mf2(__VA_ARGS__) +#define vfmin_vv_f32m1(...) __riscv_vfmin_vv_f32m1(__VA_ARGS__) +#define vfmin_vf_f32m1(...) __riscv_vfmin_vf_f32m1(__VA_ARGS__) +#define vfmin_vv_f32m2(...) __riscv_vfmin_vv_f32m2(__VA_ARGS__) +#define vfmin_vf_f32m2(...) __riscv_vfmin_vf_f32m2(__VA_ARGS__) +#define vfmin_vv_f32m4(...) __riscv_vfmin_vv_f32m4(__VA_ARGS__) +#define vfmin_vf_f32m4(...) __riscv_vfmin_vf_f32m4(__VA_ARGS__) +#define vfmin_vv_f32m8(...) __riscv_vfmin_vv_f32m8(__VA_ARGS__) +#define vfmin_vf_f32m8(...) __riscv_vfmin_vf_f32m8(__VA_ARGS__) +#define vfmin_vv_f64m1(...) __riscv_vfmin_vv_f64m1(__VA_ARGS__) +#define vfmin_vf_f64m1(...) __riscv_vfmin_vf_f64m1(__VA_ARGS__) +#define vfmin_vv_f64m2(...) __riscv_vfmin_vv_f64m2(__VA_ARGS__) +#define vfmin_vf_f64m2(...) __riscv_vfmin_vf_f64m2(__VA_ARGS__) +#define vfmin_vv_f64m4(...) __riscv_vfmin_vv_f64m4(__VA_ARGS__) +#define vfmin_vf_f64m4(...) __riscv_vfmin_vf_f64m4(__VA_ARGS__) +#define vfmin_vv_f64m8(...) __riscv_vfmin_vv_f64m8(__VA_ARGS__) +#define vfmin_vf_f64m8(...) __riscv_vfmin_vf_f64m8(__VA_ARGS__) +#define vfmax_vv_f16mf4(...) __riscv_vfmax_vv_f16mf4(__VA_ARGS__) +#define vfmax_vf_f16mf4(...) __riscv_vfmax_vf_f16mf4(__VA_ARGS__) +#define vfmax_vv_f16mf2(...) __riscv_vfmax_vv_f16mf2(__VA_ARGS__) +#define vfmax_vf_f16mf2(...) __riscv_vfmax_vf_f16mf2(__VA_ARGS__) +#define vfmax_vv_f16m1(...) __riscv_vfmax_vv_f16m1(__VA_ARGS__) +#define vfmax_vf_f16m1(...) __riscv_vfmax_vf_f16m1(__VA_ARGS__) +#define vfmax_vv_f16m2(...) __riscv_vfmax_vv_f16m2(__VA_ARGS__) +#define vfmax_vf_f16m2(...) __riscv_vfmax_vf_f16m2(__VA_ARGS__) +#define vfmax_vv_f16m4(...) __riscv_vfmax_vv_f16m4(__VA_ARGS__) +#define vfmax_vf_f16m4(...) __riscv_vfmax_vf_f16m4(__VA_ARGS__) +#define vfmax_vv_f16m8(...) __riscv_vfmax_vv_f16m8(__VA_ARGS__) +#define vfmax_vf_f16m8(...) __riscv_vfmax_vf_f16m8(__VA_ARGS__) +#define vfmax_vv_f32mf2(...) __riscv_vfmax_vv_f32mf2(__VA_ARGS__) +#define vfmax_vf_f32mf2(...) __riscv_vfmax_vf_f32mf2(__VA_ARGS__) +#define vfmax_vv_f32m1(...) __riscv_vfmax_vv_f32m1(__VA_ARGS__) +#define vfmax_vf_f32m1(...) __riscv_vfmax_vf_f32m1(__VA_ARGS__) +#define vfmax_vv_f32m2(...) __riscv_vfmax_vv_f32m2(__VA_ARGS__) +#define vfmax_vf_f32m2(...) __riscv_vfmax_vf_f32m2(__VA_ARGS__) +#define vfmax_vv_f32m4(...) __riscv_vfmax_vv_f32m4(__VA_ARGS__) +#define vfmax_vf_f32m4(...) __riscv_vfmax_vf_f32m4(__VA_ARGS__) +#define vfmax_vv_f32m8(...) __riscv_vfmax_vv_f32m8(__VA_ARGS__) +#define vfmax_vf_f32m8(...) __riscv_vfmax_vf_f32m8(__VA_ARGS__) +#define vfmax_vv_f64m1(...) __riscv_vfmax_vv_f64m1(__VA_ARGS__) +#define vfmax_vf_f64m1(...) __riscv_vfmax_vf_f64m1(__VA_ARGS__) +#define vfmax_vv_f64m2(...) __riscv_vfmax_vv_f64m2(__VA_ARGS__) +#define vfmax_vf_f64m2(...) __riscv_vfmax_vf_f64m2(__VA_ARGS__) +#define vfmax_vv_f64m4(...) __riscv_vfmax_vv_f64m4(__VA_ARGS__) +#define vfmax_vf_f64m4(...) __riscv_vfmax_vf_f64m4(__VA_ARGS__) +#define vfmax_vv_f64m8(...) __riscv_vfmax_vv_f64m8(__VA_ARGS__) +#define vfmax_vf_f64m8(...) __riscv_vfmax_vf_f64m8(__VA_ARGS__) +// masked functions +#define vfmin_vv_f16mf4_m(...) __riscv_vfmin_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmin_vf_f16mf4_m(...) __riscv_vfmin_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmin_vv_f16mf2_m(...) __riscv_vfmin_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmin_vf_f16mf2_m(...) __riscv_vfmin_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmin_vv_f16m1_m(...) __riscv_vfmin_vv_f16m1_tumu(__VA_ARGS__) +#define vfmin_vf_f16m1_m(...) __riscv_vfmin_vf_f16m1_tumu(__VA_ARGS__) +#define vfmin_vv_f16m2_m(...) __riscv_vfmin_vv_f16m2_tumu(__VA_ARGS__) +#define vfmin_vf_f16m2_m(...) __riscv_vfmin_vf_f16m2_tumu(__VA_ARGS__) +#define vfmin_vv_f16m4_m(...) __riscv_vfmin_vv_f16m4_tumu(__VA_ARGS__) +#define vfmin_vf_f16m4_m(...) __riscv_vfmin_vf_f16m4_tumu(__VA_ARGS__) +#define vfmin_vv_f16m8_m(...) __riscv_vfmin_vv_f16m8_tumu(__VA_ARGS__) +#define vfmin_vf_f16m8_m(...) __riscv_vfmin_vf_f16m8_tumu(__VA_ARGS__) +#define vfmin_vv_f32mf2_m(...) __riscv_vfmin_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmin_vf_f32mf2_m(...) __riscv_vfmin_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmin_vv_f32m1_m(...) __riscv_vfmin_vv_f32m1_tumu(__VA_ARGS__) +#define vfmin_vf_f32m1_m(...) __riscv_vfmin_vf_f32m1_tumu(__VA_ARGS__) +#define vfmin_vv_f32m2_m(...) __riscv_vfmin_vv_f32m2_tumu(__VA_ARGS__) +#define vfmin_vf_f32m2_m(...) __riscv_vfmin_vf_f32m2_tumu(__VA_ARGS__) +#define vfmin_vv_f32m4_m(...) __riscv_vfmin_vv_f32m4_tumu(__VA_ARGS__) +#define vfmin_vf_f32m4_m(...) __riscv_vfmin_vf_f32m4_tumu(__VA_ARGS__) +#define vfmin_vv_f32m8_m(...) __riscv_vfmin_vv_f32m8_tumu(__VA_ARGS__) +#define vfmin_vf_f32m8_m(...) __riscv_vfmin_vf_f32m8_tumu(__VA_ARGS__) +#define vfmin_vv_f64m1_m(...) __riscv_vfmin_vv_f64m1_tumu(__VA_ARGS__) +#define vfmin_vf_f64m1_m(...) __riscv_vfmin_vf_f64m1_tumu(__VA_ARGS__) +#define vfmin_vv_f64m2_m(...) __riscv_vfmin_vv_f64m2_tumu(__VA_ARGS__) +#define vfmin_vf_f64m2_m(...) __riscv_vfmin_vf_f64m2_tumu(__VA_ARGS__) +#define vfmin_vv_f64m4_m(...) __riscv_vfmin_vv_f64m4_tumu(__VA_ARGS__) +#define vfmin_vf_f64m4_m(...) __riscv_vfmin_vf_f64m4_tumu(__VA_ARGS__) +#define vfmin_vv_f64m8_m(...) __riscv_vfmin_vv_f64m8_tumu(__VA_ARGS__) +#define vfmin_vf_f64m8_m(...) __riscv_vfmin_vf_f64m8_tumu(__VA_ARGS__) +#define vfmax_vv_f16mf4_m(...) __riscv_vfmax_vv_f16mf4_tumu(__VA_ARGS__) +#define vfmax_vf_f16mf4_m(...) __riscv_vfmax_vf_f16mf4_tumu(__VA_ARGS__) +#define vfmax_vv_f16mf2_m(...) __riscv_vfmax_vv_f16mf2_tumu(__VA_ARGS__) +#define vfmax_vf_f16mf2_m(...) __riscv_vfmax_vf_f16mf2_tumu(__VA_ARGS__) +#define vfmax_vv_f16m1_m(...) __riscv_vfmax_vv_f16m1_tumu(__VA_ARGS__) +#define vfmax_vf_f16m1_m(...) __riscv_vfmax_vf_f16m1_tumu(__VA_ARGS__) +#define vfmax_vv_f16m2_m(...) __riscv_vfmax_vv_f16m2_tumu(__VA_ARGS__) +#define vfmax_vf_f16m2_m(...) __riscv_vfmax_vf_f16m2_tumu(__VA_ARGS__) +#define vfmax_vv_f16m4_m(...) __riscv_vfmax_vv_f16m4_tumu(__VA_ARGS__) +#define vfmax_vf_f16m4_m(...) __riscv_vfmax_vf_f16m4_tumu(__VA_ARGS__) +#define vfmax_vv_f16m8_m(...) __riscv_vfmax_vv_f16m8_tumu(__VA_ARGS__) +#define vfmax_vf_f16m8_m(...) __riscv_vfmax_vf_f16m8_tumu(__VA_ARGS__) +#define vfmax_vv_f32mf2_m(...) __riscv_vfmax_vv_f32mf2_tumu(__VA_ARGS__) +#define vfmax_vf_f32mf2_m(...) __riscv_vfmax_vf_f32mf2_tumu(__VA_ARGS__) +#define vfmax_vv_f32m1_m(...) __riscv_vfmax_vv_f32m1_tumu(__VA_ARGS__) +#define vfmax_vf_f32m1_m(...) __riscv_vfmax_vf_f32m1_tumu(__VA_ARGS__) +#define vfmax_vv_f32m2_m(...) __riscv_vfmax_vv_f32m2_tumu(__VA_ARGS__) +#define vfmax_vf_f32m2_m(...) __riscv_vfmax_vf_f32m2_tumu(__VA_ARGS__) +#define vfmax_vv_f32m4_m(...) __riscv_vfmax_vv_f32m4_tumu(__VA_ARGS__) +#define vfmax_vf_f32m4_m(...) __riscv_vfmax_vf_f32m4_tumu(__VA_ARGS__) +#define vfmax_vv_f32m8_m(...) __riscv_vfmax_vv_f32m8_tumu(__VA_ARGS__) +#define vfmax_vf_f32m8_m(...) __riscv_vfmax_vf_f32m8_tumu(__VA_ARGS__) +#define vfmax_vv_f64m1_m(...) __riscv_vfmax_vv_f64m1_tumu(__VA_ARGS__) +#define vfmax_vf_f64m1_m(...) __riscv_vfmax_vf_f64m1_tumu(__VA_ARGS__) +#define vfmax_vv_f64m2_m(...) __riscv_vfmax_vv_f64m2_tumu(__VA_ARGS__) +#define vfmax_vf_f64m2_m(...) __riscv_vfmax_vf_f64m2_tumu(__VA_ARGS__) +#define vfmax_vv_f64m4_m(...) __riscv_vfmax_vv_f64m4_tumu(__VA_ARGS__) +#define vfmax_vf_f64m4_m(...) __riscv_vfmax_vf_f64m4_tumu(__VA_ARGS__) +#define vfmax_vv_f64m8_m(...) __riscv_vfmax_vv_f64m8_tumu(__VA_ARGS__) +#define vfmax_vf_f64m8_m(...) __riscv_vfmax_vf_f64m8_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16mf4(...) __riscv_vfsgnj_vv_f16mf4(__VA_ARGS__) +#define vfsgnj_vf_f16mf4(...) __riscv_vfsgnj_vf_f16mf4(__VA_ARGS__) +#define vfsgnj_vv_f16mf2(...) __riscv_vfsgnj_vv_f16mf2(__VA_ARGS__) +#define vfsgnj_vf_f16mf2(...) __riscv_vfsgnj_vf_f16mf2(__VA_ARGS__) +#define vfsgnj_vv_f16m1(...) __riscv_vfsgnj_vv_f16m1(__VA_ARGS__) +#define vfsgnj_vf_f16m1(...) __riscv_vfsgnj_vf_f16m1(__VA_ARGS__) +#define vfsgnj_vv_f16m2(...) __riscv_vfsgnj_vv_f16m2(__VA_ARGS__) +#define vfsgnj_vf_f16m2(...) __riscv_vfsgnj_vf_f16m2(__VA_ARGS__) +#define vfsgnj_vv_f16m4(...) __riscv_vfsgnj_vv_f16m4(__VA_ARGS__) +#define vfsgnj_vf_f16m4(...) __riscv_vfsgnj_vf_f16m4(__VA_ARGS__) +#define vfsgnj_vv_f16m8(...) __riscv_vfsgnj_vv_f16m8(__VA_ARGS__) +#define vfsgnj_vf_f16m8(...) __riscv_vfsgnj_vf_f16m8(__VA_ARGS__) +#define vfsgnj_vv_f32mf2(...) __riscv_vfsgnj_vv_f32mf2(__VA_ARGS__) +#define vfsgnj_vf_f32mf2(...) __riscv_vfsgnj_vf_f32mf2(__VA_ARGS__) +#define vfsgnj_vv_f32m1(...) __riscv_vfsgnj_vv_f32m1(__VA_ARGS__) +#define vfsgnj_vf_f32m1(...) __riscv_vfsgnj_vf_f32m1(__VA_ARGS__) +#define vfsgnj_vv_f32m2(...) __riscv_vfsgnj_vv_f32m2(__VA_ARGS__) +#define vfsgnj_vf_f32m2(...) __riscv_vfsgnj_vf_f32m2(__VA_ARGS__) +#define vfsgnj_vv_f32m4(...) __riscv_vfsgnj_vv_f32m4(__VA_ARGS__) +#define vfsgnj_vf_f32m4(...) __riscv_vfsgnj_vf_f32m4(__VA_ARGS__) +#define vfsgnj_vv_f32m8(...) __riscv_vfsgnj_vv_f32m8(__VA_ARGS__) +#define vfsgnj_vf_f32m8(...) __riscv_vfsgnj_vf_f32m8(__VA_ARGS__) +#define vfsgnj_vv_f64m1(...) __riscv_vfsgnj_vv_f64m1(__VA_ARGS__) +#define vfsgnj_vf_f64m1(...) __riscv_vfsgnj_vf_f64m1(__VA_ARGS__) +#define vfsgnj_vv_f64m2(...) __riscv_vfsgnj_vv_f64m2(__VA_ARGS__) +#define vfsgnj_vf_f64m2(...) __riscv_vfsgnj_vf_f64m2(__VA_ARGS__) +#define vfsgnj_vv_f64m4(...) __riscv_vfsgnj_vv_f64m4(__VA_ARGS__) +#define vfsgnj_vf_f64m4(...) __riscv_vfsgnj_vf_f64m4(__VA_ARGS__) +#define vfsgnj_vv_f64m8(...) __riscv_vfsgnj_vv_f64m8(__VA_ARGS__) +#define vfsgnj_vf_f64m8(...) __riscv_vfsgnj_vf_f64m8(__VA_ARGS__) +#define vfsgnjn_vv_f16mf4(...) __riscv_vfsgnjn_vv_f16mf4(__VA_ARGS__) +#define vfsgnjn_vf_f16mf4(...) __riscv_vfsgnjn_vf_f16mf4(__VA_ARGS__) +#define vfsgnjn_vv_f16mf2(...) __riscv_vfsgnjn_vv_f16mf2(__VA_ARGS__) +#define vfsgnjn_vf_f16mf2(...) __riscv_vfsgnjn_vf_f16mf2(__VA_ARGS__) +#define vfsgnjn_vv_f16m1(...) __riscv_vfsgnjn_vv_f16m1(__VA_ARGS__) +#define vfsgnjn_vf_f16m1(...) __riscv_vfsgnjn_vf_f16m1(__VA_ARGS__) +#define vfsgnjn_vv_f16m2(...) __riscv_vfsgnjn_vv_f16m2(__VA_ARGS__) +#define vfsgnjn_vf_f16m2(...) __riscv_vfsgnjn_vf_f16m2(__VA_ARGS__) +#define vfsgnjn_vv_f16m4(...) __riscv_vfsgnjn_vv_f16m4(__VA_ARGS__) +#define vfsgnjn_vf_f16m4(...) __riscv_vfsgnjn_vf_f16m4(__VA_ARGS__) +#define vfsgnjn_vv_f16m8(...) __riscv_vfsgnjn_vv_f16m8(__VA_ARGS__) +#define vfsgnjn_vf_f16m8(...) __riscv_vfsgnjn_vf_f16m8(__VA_ARGS__) +#define vfsgnjn_vv_f32mf2(...) __riscv_vfsgnjn_vv_f32mf2(__VA_ARGS__) +#define vfsgnjn_vf_f32mf2(...) __riscv_vfsgnjn_vf_f32mf2(__VA_ARGS__) +#define vfsgnjn_vv_f32m1(...) __riscv_vfsgnjn_vv_f32m1(__VA_ARGS__) +#define vfsgnjn_vf_f32m1(...) __riscv_vfsgnjn_vf_f32m1(__VA_ARGS__) +#define vfsgnjn_vv_f32m2(...) __riscv_vfsgnjn_vv_f32m2(__VA_ARGS__) +#define vfsgnjn_vf_f32m2(...) __riscv_vfsgnjn_vf_f32m2(__VA_ARGS__) +#define vfsgnjn_vv_f32m4(...) __riscv_vfsgnjn_vv_f32m4(__VA_ARGS__) +#define vfsgnjn_vf_f32m4(...) __riscv_vfsgnjn_vf_f32m4(__VA_ARGS__) +#define vfsgnjn_vv_f32m8(...) __riscv_vfsgnjn_vv_f32m8(__VA_ARGS__) +#define vfsgnjn_vf_f32m8(...) __riscv_vfsgnjn_vf_f32m8(__VA_ARGS__) +#define vfsgnjn_vv_f64m1(...) __riscv_vfsgnjn_vv_f64m1(__VA_ARGS__) +#define vfsgnjn_vf_f64m1(...) __riscv_vfsgnjn_vf_f64m1(__VA_ARGS__) +#define vfsgnjn_vv_f64m2(...) __riscv_vfsgnjn_vv_f64m2(__VA_ARGS__) +#define vfsgnjn_vf_f64m2(...) __riscv_vfsgnjn_vf_f64m2(__VA_ARGS__) +#define vfsgnjn_vv_f64m4(...) __riscv_vfsgnjn_vv_f64m4(__VA_ARGS__) +#define vfsgnjn_vf_f64m4(...) __riscv_vfsgnjn_vf_f64m4(__VA_ARGS__) +#define vfsgnjn_vv_f64m8(...) __riscv_vfsgnjn_vv_f64m8(__VA_ARGS__) +#define vfsgnjn_vf_f64m8(...) __riscv_vfsgnjn_vf_f64m8(__VA_ARGS__) +#define vfsgnjx_vv_f16mf4(...) __riscv_vfsgnjx_vv_f16mf4(__VA_ARGS__) +#define vfsgnjx_vf_f16mf4(...) __riscv_vfsgnjx_vf_f16mf4(__VA_ARGS__) +#define vfsgnjx_vv_f16mf2(...) __riscv_vfsgnjx_vv_f16mf2(__VA_ARGS__) +#define vfsgnjx_vf_f16mf2(...) __riscv_vfsgnjx_vf_f16mf2(__VA_ARGS__) +#define vfsgnjx_vv_f16m1(...) __riscv_vfsgnjx_vv_f16m1(__VA_ARGS__) +#define vfsgnjx_vf_f16m1(...) __riscv_vfsgnjx_vf_f16m1(__VA_ARGS__) +#define vfsgnjx_vv_f16m2(...) __riscv_vfsgnjx_vv_f16m2(__VA_ARGS__) +#define vfsgnjx_vf_f16m2(...) __riscv_vfsgnjx_vf_f16m2(__VA_ARGS__) +#define vfsgnjx_vv_f16m4(...) __riscv_vfsgnjx_vv_f16m4(__VA_ARGS__) +#define vfsgnjx_vf_f16m4(...) __riscv_vfsgnjx_vf_f16m4(__VA_ARGS__) +#define vfsgnjx_vv_f16m8(...) __riscv_vfsgnjx_vv_f16m8(__VA_ARGS__) +#define vfsgnjx_vf_f16m8(...) __riscv_vfsgnjx_vf_f16m8(__VA_ARGS__) +#define vfsgnjx_vv_f32mf2(...) __riscv_vfsgnjx_vv_f32mf2(__VA_ARGS__) +#define vfsgnjx_vf_f32mf2(...) __riscv_vfsgnjx_vf_f32mf2(__VA_ARGS__) +#define vfsgnjx_vv_f32m1(...) __riscv_vfsgnjx_vv_f32m1(__VA_ARGS__) +#define vfsgnjx_vf_f32m1(...) __riscv_vfsgnjx_vf_f32m1(__VA_ARGS__) +#define vfsgnjx_vv_f32m2(...) __riscv_vfsgnjx_vv_f32m2(__VA_ARGS__) +#define vfsgnjx_vf_f32m2(...) __riscv_vfsgnjx_vf_f32m2(__VA_ARGS__) +#define vfsgnjx_vv_f32m4(...) __riscv_vfsgnjx_vv_f32m4(__VA_ARGS__) +#define vfsgnjx_vf_f32m4(...) __riscv_vfsgnjx_vf_f32m4(__VA_ARGS__) +#define vfsgnjx_vv_f32m8(...) __riscv_vfsgnjx_vv_f32m8(__VA_ARGS__) +#define vfsgnjx_vf_f32m8(...) __riscv_vfsgnjx_vf_f32m8(__VA_ARGS__) +#define vfsgnjx_vv_f64m1(...) __riscv_vfsgnjx_vv_f64m1(__VA_ARGS__) +#define vfsgnjx_vf_f64m1(...) __riscv_vfsgnjx_vf_f64m1(__VA_ARGS__) +#define vfsgnjx_vv_f64m2(...) __riscv_vfsgnjx_vv_f64m2(__VA_ARGS__) +#define vfsgnjx_vf_f64m2(...) __riscv_vfsgnjx_vf_f64m2(__VA_ARGS__) +#define vfsgnjx_vv_f64m4(...) __riscv_vfsgnjx_vv_f64m4(__VA_ARGS__) +#define vfsgnjx_vf_f64m4(...) __riscv_vfsgnjx_vf_f64m4(__VA_ARGS__) +#define vfsgnjx_vv_f64m8(...) __riscv_vfsgnjx_vv_f64m8(__VA_ARGS__) +#define vfsgnjx_vf_f64m8(...) __riscv_vfsgnjx_vf_f64m8(__VA_ARGS__) +// masked functions +#define vfsgnj_vv_f16mf4_m(...) __riscv_vfsgnj_vv_f16mf4_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16mf4_m(...) __riscv_vfsgnj_vf_f16mf4_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16mf2_m(...) __riscv_vfsgnj_vv_f16mf2_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16mf2_m(...) __riscv_vfsgnj_vf_f16mf2_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16m1_m(...) __riscv_vfsgnj_vv_f16m1_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16m1_m(...) __riscv_vfsgnj_vf_f16m1_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16m2_m(...) __riscv_vfsgnj_vv_f16m2_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16m2_m(...) __riscv_vfsgnj_vf_f16m2_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16m4_m(...) __riscv_vfsgnj_vv_f16m4_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16m4_m(...) __riscv_vfsgnj_vf_f16m4_tumu(__VA_ARGS__) +#define vfsgnj_vv_f16m8_m(...) __riscv_vfsgnj_vv_f16m8_tumu(__VA_ARGS__) +#define vfsgnj_vf_f16m8_m(...) __riscv_vfsgnj_vf_f16m8_tumu(__VA_ARGS__) +#define vfsgnj_vv_f32mf2_m(...) __riscv_vfsgnj_vv_f32mf2_tumu(__VA_ARGS__) +#define vfsgnj_vf_f32mf2_m(...) __riscv_vfsgnj_vf_f32mf2_tumu(__VA_ARGS__) +#define vfsgnj_vv_f32m1_m(...) __riscv_vfsgnj_vv_f32m1_tumu(__VA_ARGS__) +#define vfsgnj_vf_f32m1_m(...) __riscv_vfsgnj_vf_f32m1_tumu(__VA_ARGS__) +#define vfsgnj_vv_f32m2_m(...) __riscv_vfsgnj_vv_f32m2_tumu(__VA_ARGS__) +#define vfsgnj_vf_f32m2_m(...) __riscv_vfsgnj_vf_f32m2_tumu(__VA_ARGS__) +#define vfsgnj_vv_f32m4_m(...) __riscv_vfsgnj_vv_f32m4_tumu(__VA_ARGS__) +#define vfsgnj_vf_f32m4_m(...) __riscv_vfsgnj_vf_f32m4_tumu(__VA_ARGS__) +#define vfsgnj_vv_f32m8_m(...) __riscv_vfsgnj_vv_f32m8_tumu(__VA_ARGS__) +#define vfsgnj_vf_f32m8_m(...) __riscv_vfsgnj_vf_f32m8_tumu(__VA_ARGS__) +#define vfsgnj_vv_f64m1_m(...) __riscv_vfsgnj_vv_f64m1_tumu(__VA_ARGS__) +#define vfsgnj_vf_f64m1_m(...) __riscv_vfsgnj_vf_f64m1_tumu(__VA_ARGS__) +#define vfsgnj_vv_f64m2_m(...) __riscv_vfsgnj_vv_f64m2_tumu(__VA_ARGS__) +#define vfsgnj_vf_f64m2_m(...) __riscv_vfsgnj_vf_f64m2_tumu(__VA_ARGS__) +#define vfsgnj_vv_f64m4_m(...) __riscv_vfsgnj_vv_f64m4_tumu(__VA_ARGS__) +#define vfsgnj_vf_f64m4_m(...) __riscv_vfsgnj_vf_f64m4_tumu(__VA_ARGS__) +#define vfsgnj_vv_f64m8_m(...) __riscv_vfsgnj_vv_f64m8_tumu(__VA_ARGS__) +#define vfsgnj_vf_f64m8_m(...) __riscv_vfsgnj_vf_f64m8_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16mf4_m(...) __riscv_vfsgnjn_vv_f16mf4_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16mf4_m(...) __riscv_vfsgnjn_vf_f16mf4_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16mf2_m(...) __riscv_vfsgnjn_vv_f16mf2_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16mf2_m(...) __riscv_vfsgnjn_vf_f16mf2_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16m1_m(...) __riscv_vfsgnjn_vv_f16m1_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16m1_m(...) __riscv_vfsgnjn_vf_f16m1_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16m2_m(...) __riscv_vfsgnjn_vv_f16m2_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16m2_m(...) __riscv_vfsgnjn_vf_f16m2_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16m4_m(...) __riscv_vfsgnjn_vv_f16m4_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16m4_m(...) __riscv_vfsgnjn_vf_f16m4_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f16m8_m(...) __riscv_vfsgnjn_vv_f16m8_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f16m8_m(...) __riscv_vfsgnjn_vf_f16m8_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f32mf2_m(...) __riscv_vfsgnjn_vv_f32mf2_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f32mf2_m(...) __riscv_vfsgnjn_vf_f32mf2_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f32m1_m(...) __riscv_vfsgnjn_vv_f32m1_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f32m1_m(...) __riscv_vfsgnjn_vf_f32m1_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f32m2_m(...) __riscv_vfsgnjn_vv_f32m2_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f32m2_m(...) __riscv_vfsgnjn_vf_f32m2_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f32m4_m(...) __riscv_vfsgnjn_vv_f32m4_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f32m4_m(...) __riscv_vfsgnjn_vf_f32m4_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f32m8_m(...) __riscv_vfsgnjn_vv_f32m8_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f32m8_m(...) __riscv_vfsgnjn_vf_f32m8_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f64m1_m(...) __riscv_vfsgnjn_vv_f64m1_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f64m1_m(...) __riscv_vfsgnjn_vf_f64m1_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f64m2_m(...) __riscv_vfsgnjn_vv_f64m2_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f64m2_m(...) __riscv_vfsgnjn_vf_f64m2_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f64m4_m(...) __riscv_vfsgnjn_vv_f64m4_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f64m4_m(...) __riscv_vfsgnjn_vf_f64m4_tumu(__VA_ARGS__) +#define vfsgnjn_vv_f64m8_m(...) __riscv_vfsgnjn_vv_f64m8_tumu(__VA_ARGS__) +#define vfsgnjn_vf_f64m8_m(...) __riscv_vfsgnjn_vf_f64m8_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16mf4_m(...) __riscv_vfsgnjx_vv_f16mf4_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16mf4_m(...) __riscv_vfsgnjx_vf_f16mf4_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16mf2_m(...) __riscv_vfsgnjx_vv_f16mf2_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16mf2_m(...) __riscv_vfsgnjx_vf_f16mf2_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16m1_m(...) __riscv_vfsgnjx_vv_f16m1_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16m1_m(...) __riscv_vfsgnjx_vf_f16m1_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16m2_m(...) __riscv_vfsgnjx_vv_f16m2_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16m2_m(...) __riscv_vfsgnjx_vf_f16m2_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16m4_m(...) __riscv_vfsgnjx_vv_f16m4_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16m4_m(...) __riscv_vfsgnjx_vf_f16m4_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f16m8_m(...) __riscv_vfsgnjx_vv_f16m8_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f16m8_m(...) __riscv_vfsgnjx_vf_f16m8_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f32mf2_m(...) __riscv_vfsgnjx_vv_f32mf2_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f32mf2_m(...) __riscv_vfsgnjx_vf_f32mf2_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f32m1_m(...) __riscv_vfsgnjx_vv_f32m1_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f32m1_m(...) __riscv_vfsgnjx_vf_f32m1_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f32m2_m(...) __riscv_vfsgnjx_vv_f32m2_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f32m2_m(...) __riscv_vfsgnjx_vf_f32m2_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f32m4_m(...) __riscv_vfsgnjx_vv_f32m4_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f32m4_m(...) __riscv_vfsgnjx_vf_f32m4_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f32m8_m(...) __riscv_vfsgnjx_vv_f32m8_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f32m8_m(...) __riscv_vfsgnjx_vf_f32m8_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f64m1_m(...) __riscv_vfsgnjx_vv_f64m1_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f64m1_m(...) __riscv_vfsgnjx_vf_f64m1_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f64m2_m(...) __riscv_vfsgnjx_vv_f64m2_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f64m2_m(...) __riscv_vfsgnjx_vf_f64m2_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f64m4_m(...) __riscv_vfsgnjx_vv_f64m4_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f64m4_m(...) __riscv_vfsgnjx_vf_f64m4_tumu(__VA_ARGS__) +#define vfsgnjx_vv_f64m8_m(...) __riscv_vfsgnjx_vv_f64m8_tumu(__VA_ARGS__) +#define vfsgnjx_vf_f64m8_m(...) __riscv_vfsgnjx_vf_f64m8_tumu(__VA_ARGS__) +#define vfabs_v_f16mf4(...) __riscv_vfabs_v_f16mf4(__VA_ARGS__) +#define vfabs_v_f16mf2(...) __riscv_vfabs_v_f16mf2(__VA_ARGS__) +#define vfabs_v_f16m1(...) __riscv_vfabs_v_f16m1(__VA_ARGS__) +#define vfabs_v_f16m2(...) __riscv_vfabs_v_f16m2(__VA_ARGS__) +#define vfabs_v_f16m4(...) __riscv_vfabs_v_f16m4(__VA_ARGS__) +#define vfabs_v_f16m8(...) __riscv_vfabs_v_f16m8(__VA_ARGS__) +#define vfabs_v_f32mf2(...) __riscv_vfabs_v_f32mf2(__VA_ARGS__) +#define vfabs_v_f32m1(...) __riscv_vfabs_v_f32m1(__VA_ARGS__) +#define vfabs_v_f32m2(...) __riscv_vfabs_v_f32m2(__VA_ARGS__) +#define vfabs_v_f32m4(...) __riscv_vfabs_v_f32m4(__VA_ARGS__) +#define vfabs_v_f32m8(...) __riscv_vfabs_v_f32m8(__VA_ARGS__) +#define vfabs_v_f64m1(...) __riscv_vfabs_v_f64m1(__VA_ARGS__) +#define vfabs_v_f64m2(...) __riscv_vfabs_v_f64m2(__VA_ARGS__) +#define vfabs_v_f64m4(...) __riscv_vfabs_v_f64m4(__VA_ARGS__) +#define vfabs_v_f64m8(...) __riscv_vfabs_v_f64m8(__VA_ARGS__) +// masked functions +#define vfabs_v_f16mf4_m(...) __riscv_vfabs_v_f16mf4_tumu(__VA_ARGS__) +#define vfabs_v_f16mf2_m(...) __riscv_vfabs_v_f16mf2_tumu(__VA_ARGS__) +#define vfabs_v_f16m1_m(...) __riscv_vfabs_v_f16m1_tumu(__VA_ARGS__) +#define vfabs_v_f16m2_m(...) __riscv_vfabs_v_f16m2_tumu(__VA_ARGS__) +#define vfabs_v_f16m4_m(...) __riscv_vfabs_v_f16m4_tumu(__VA_ARGS__) +#define vfabs_v_f16m8_m(...) __riscv_vfabs_v_f16m8_tumu(__VA_ARGS__) +#define vfabs_v_f32mf2_m(...) __riscv_vfabs_v_f32mf2_tumu(__VA_ARGS__) +#define vfabs_v_f32m1_m(...) __riscv_vfabs_v_f32m1_tumu(__VA_ARGS__) +#define vfabs_v_f32m2_m(...) __riscv_vfabs_v_f32m2_tumu(__VA_ARGS__) +#define vfabs_v_f32m4_m(...) __riscv_vfabs_v_f32m4_tumu(__VA_ARGS__) +#define vfabs_v_f32m8_m(...) __riscv_vfabs_v_f32m8_tumu(__VA_ARGS__) +#define vfabs_v_f64m1_m(...) __riscv_vfabs_v_f64m1_tumu(__VA_ARGS__) +#define vfabs_v_f64m2_m(...) __riscv_vfabs_v_f64m2_tumu(__VA_ARGS__) +#define vfabs_v_f64m4_m(...) __riscv_vfabs_v_f64m4_tumu(__VA_ARGS__) +#define vfabs_v_f64m8_m(...) __riscv_vfabs_v_f64m8_tumu(__VA_ARGS__) +#define vmfeq_vv_f16mf4_b64(...) __riscv_vmfeq_vv_f16mf4_b64(__VA_ARGS__) +#define vmfeq_vf_f16mf4_b64(...) __riscv_vmfeq_vf_f16mf4_b64(__VA_ARGS__) +#define vmfeq_vv_f16mf2_b32(...) __riscv_vmfeq_vv_f16mf2_b32(__VA_ARGS__) +#define vmfeq_vf_f16mf2_b32(...) __riscv_vmfeq_vf_f16mf2_b32(__VA_ARGS__) +#define vmfeq_vv_f16m1_b16(...) __riscv_vmfeq_vv_f16m1_b16(__VA_ARGS__) +#define vmfeq_vf_f16m1_b16(...) __riscv_vmfeq_vf_f16m1_b16(__VA_ARGS__) +#define vmfeq_vv_f16m2_b8(...) __riscv_vmfeq_vv_f16m2_b8(__VA_ARGS__) +#define vmfeq_vf_f16m2_b8(...) __riscv_vmfeq_vf_f16m2_b8(__VA_ARGS__) +#define vmfeq_vv_f16m4_b4(...) __riscv_vmfeq_vv_f16m4_b4(__VA_ARGS__) +#define vmfeq_vf_f16m4_b4(...) __riscv_vmfeq_vf_f16m4_b4(__VA_ARGS__) +#define vmfeq_vv_f16m8_b2(...) __riscv_vmfeq_vv_f16m8_b2(__VA_ARGS__) +#define vmfeq_vf_f16m8_b2(...) __riscv_vmfeq_vf_f16m8_b2(__VA_ARGS__) +#define vmfeq_vv_f32mf2_b64(...) __riscv_vmfeq_vv_f32mf2_b64(__VA_ARGS__) +#define vmfeq_vf_f32mf2_b64(...) __riscv_vmfeq_vf_f32mf2_b64(__VA_ARGS__) +#define vmfeq_vv_f32m1_b32(...) __riscv_vmfeq_vv_f32m1_b32(__VA_ARGS__) +#define vmfeq_vf_f32m1_b32(...) __riscv_vmfeq_vf_f32m1_b32(__VA_ARGS__) +#define vmfeq_vv_f32m2_b16(...) __riscv_vmfeq_vv_f32m2_b16(__VA_ARGS__) +#define vmfeq_vf_f32m2_b16(...) __riscv_vmfeq_vf_f32m2_b16(__VA_ARGS__) +#define vmfeq_vv_f32m4_b8(...) __riscv_vmfeq_vv_f32m4_b8(__VA_ARGS__) +#define vmfeq_vf_f32m4_b8(...) __riscv_vmfeq_vf_f32m4_b8(__VA_ARGS__) +#define vmfeq_vv_f32m8_b4(...) __riscv_vmfeq_vv_f32m8_b4(__VA_ARGS__) +#define vmfeq_vf_f32m8_b4(...) __riscv_vmfeq_vf_f32m8_b4(__VA_ARGS__) +#define vmfeq_vv_f64m1_b64(...) __riscv_vmfeq_vv_f64m1_b64(__VA_ARGS__) +#define vmfeq_vf_f64m1_b64(...) __riscv_vmfeq_vf_f64m1_b64(__VA_ARGS__) +#define vmfeq_vv_f64m2_b32(...) __riscv_vmfeq_vv_f64m2_b32(__VA_ARGS__) +#define vmfeq_vf_f64m2_b32(...) __riscv_vmfeq_vf_f64m2_b32(__VA_ARGS__) +#define vmfeq_vv_f64m4_b16(...) __riscv_vmfeq_vv_f64m4_b16(__VA_ARGS__) +#define vmfeq_vf_f64m4_b16(...) __riscv_vmfeq_vf_f64m4_b16(__VA_ARGS__) +#define vmfeq_vv_f64m8_b8(...) __riscv_vmfeq_vv_f64m8_b8(__VA_ARGS__) +#define vmfeq_vf_f64m8_b8(...) __riscv_vmfeq_vf_f64m8_b8(__VA_ARGS__) +#define vmfne_vv_f16mf4_b64(...) __riscv_vmfne_vv_f16mf4_b64(__VA_ARGS__) +#define vmfne_vf_f16mf4_b64(...) __riscv_vmfne_vf_f16mf4_b64(__VA_ARGS__) +#define vmfne_vv_f16mf2_b32(...) __riscv_vmfne_vv_f16mf2_b32(__VA_ARGS__) +#define vmfne_vf_f16mf2_b32(...) __riscv_vmfne_vf_f16mf2_b32(__VA_ARGS__) +#define vmfne_vv_f16m1_b16(...) __riscv_vmfne_vv_f16m1_b16(__VA_ARGS__) +#define vmfne_vf_f16m1_b16(...) __riscv_vmfne_vf_f16m1_b16(__VA_ARGS__) +#define vmfne_vv_f16m2_b8(...) __riscv_vmfne_vv_f16m2_b8(__VA_ARGS__) +#define vmfne_vf_f16m2_b8(...) __riscv_vmfne_vf_f16m2_b8(__VA_ARGS__) +#define vmfne_vv_f16m4_b4(...) __riscv_vmfne_vv_f16m4_b4(__VA_ARGS__) +#define vmfne_vf_f16m4_b4(...) __riscv_vmfne_vf_f16m4_b4(__VA_ARGS__) +#define vmfne_vv_f16m8_b2(...) __riscv_vmfne_vv_f16m8_b2(__VA_ARGS__) +#define vmfne_vf_f16m8_b2(...) __riscv_vmfne_vf_f16m8_b2(__VA_ARGS__) +#define vmfne_vv_f32mf2_b64(...) __riscv_vmfne_vv_f32mf2_b64(__VA_ARGS__) +#define vmfne_vf_f32mf2_b64(...) __riscv_vmfne_vf_f32mf2_b64(__VA_ARGS__) +#define vmfne_vv_f32m1_b32(...) __riscv_vmfne_vv_f32m1_b32(__VA_ARGS__) +#define vmfne_vf_f32m1_b32(...) __riscv_vmfne_vf_f32m1_b32(__VA_ARGS__) +#define vmfne_vv_f32m2_b16(...) __riscv_vmfne_vv_f32m2_b16(__VA_ARGS__) +#define vmfne_vf_f32m2_b16(...) __riscv_vmfne_vf_f32m2_b16(__VA_ARGS__) +#define vmfne_vv_f32m4_b8(...) __riscv_vmfne_vv_f32m4_b8(__VA_ARGS__) +#define vmfne_vf_f32m4_b8(...) __riscv_vmfne_vf_f32m4_b8(__VA_ARGS__) +#define vmfne_vv_f32m8_b4(...) __riscv_vmfne_vv_f32m8_b4(__VA_ARGS__) +#define vmfne_vf_f32m8_b4(...) __riscv_vmfne_vf_f32m8_b4(__VA_ARGS__) +#define vmfne_vv_f64m1_b64(...) __riscv_vmfne_vv_f64m1_b64(__VA_ARGS__) +#define vmfne_vf_f64m1_b64(...) __riscv_vmfne_vf_f64m1_b64(__VA_ARGS__) +#define vmfne_vv_f64m2_b32(...) __riscv_vmfne_vv_f64m2_b32(__VA_ARGS__) +#define vmfne_vf_f64m2_b32(...) __riscv_vmfne_vf_f64m2_b32(__VA_ARGS__) +#define vmfne_vv_f64m4_b16(...) __riscv_vmfne_vv_f64m4_b16(__VA_ARGS__) +#define vmfne_vf_f64m4_b16(...) __riscv_vmfne_vf_f64m4_b16(__VA_ARGS__) +#define vmfne_vv_f64m8_b8(...) __riscv_vmfne_vv_f64m8_b8(__VA_ARGS__) +#define vmfne_vf_f64m8_b8(...) __riscv_vmfne_vf_f64m8_b8(__VA_ARGS__) +#define vmflt_vv_f16mf4_b64(...) __riscv_vmflt_vv_f16mf4_b64(__VA_ARGS__) +#define vmflt_vf_f16mf4_b64(...) __riscv_vmflt_vf_f16mf4_b64(__VA_ARGS__) +#define vmflt_vv_f16mf2_b32(...) __riscv_vmflt_vv_f16mf2_b32(__VA_ARGS__) +#define vmflt_vf_f16mf2_b32(...) __riscv_vmflt_vf_f16mf2_b32(__VA_ARGS__) +#define vmflt_vv_f16m1_b16(...) __riscv_vmflt_vv_f16m1_b16(__VA_ARGS__) +#define vmflt_vf_f16m1_b16(...) __riscv_vmflt_vf_f16m1_b16(__VA_ARGS__) +#define vmflt_vv_f16m2_b8(...) __riscv_vmflt_vv_f16m2_b8(__VA_ARGS__) +#define vmflt_vf_f16m2_b8(...) __riscv_vmflt_vf_f16m2_b8(__VA_ARGS__) +#define vmflt_vv_f16m4_b4(...) __riscv_vmflt_vv_f16m4_b4(__VA_ARGS__) +#define vmflt_vf_f16m4_b4(...) __riscv_vmflt_vf_f16m4_b4(__VA_ARGS__) +#define vmflt_vv_f16m8_b2(...) __riscv_vmflt_vv_f16m8_b2(__VA_ARGS__) +#define vmflt_vf_f16m8_b2(...) __riscv_vmflt_vf_f16m8_b2(__VA_ARGS__) +#define vmflt_vv_f32mf2_b64(...) __riscv_vmflt_vv_f32mf2_b64(__VA_ARGS__) +#define vmflt_vf_f32mf2_b64(...) __riscv_vmflt_vf_f32mf2_b64(__VA_ARGS__) +#define vmflt_vv_f32m1_b32(...) __riscv_vmflt_vv_f32m1_b32(__VA_ARGS__) +#define vmflt_vf_f32m1_b32(...) __riscv_vmflt_vf_f32m1_b32(__VA_ARGS__) +#define vmflt_vv_f32m2_b16(...) __riscv_vmflt_vv_f32m2_b16(__VA_ARGS__) +#define vmflt_vf_f32m2_b16(...) __riscv_vmflt_vf_f32m2_b16(__VA_ARGS__) +#define vmflt_vv_f32m4_b8(...) __riscv_vmflt_vv_f32m4_b8(__VA_ARGS__) +#define vmflt_vf_f32m4_b8(...) __riscv_vmflt_vf_f32m4_b8(__VA_ARGS__) +#define vmflt_vv_f32m8_b4(...) __riscv_vmflt_vv_f32m8_b4(__VA_ARGS__) +#define vmflt_vf_f32m8_b4(...) __riscv_vmflt_vf_f32m8_b4(__VA_ARGS__) +#define vmflt_vv_f64m1_b64(...) __riscv_vmflt_vv_f64m1_b64(__VA_ARGS__) +#define vmflt_vf_f64m1_b64(...) __riscv_vmflt_vf_f64m1_b64(__VA_ARGS__) +#define vmflt_vv_f64m2_b32(...) __riscv_vmflt_vv_f64m2_b32(__VA_ARGS__) +#define vmflt_vf_f64m2_b32(...) __riscv_vmflt_vf_f64m2_b32(__VA_ARGS__) +#define vmflt_vv_f64m4_b16(...) __riscv_vmflt_vv_f64m4_b16(__VA_ARGS__) +#define vmflt_vf_f64m4_b16(...) __riscv_vmflt_vf_f64m4_b16(__VA_ARGS__) +#define vmflt_vv_f64m8_b8(...) __riscv_vmflt_vv_f64m8_b8(__VA_ARGS__) +#define vmflt_vf_f64m8_b8(...) __riscv_vmflt_vf_f64m8_b8(__VA_ARGS__) +#define vmfle_vv_f16mf4_b64(...) __riscv_vmfle_vv_f16mf4_b64(__VA_ARGS__) +#define vmfle_vf_f16mf4_b64(...) __riscv_vmfle_vf_f16mf4_b64(__VA_ARGS__) +#define vmfle_vv_f16mf2_b32(...) __riscv_vmfle_vv_f16mf2_b32(__VA_ARGS__) +#define vmfle_vf_f16mf2_b32(...) __riscv_vmfle_vf_f16mf2_b32(__VA_ARGS__) +#define vmfle_vv_f16m1_b16(...) __riscv_vmfle_vv_f16m1_b16(__VA_ARGS__) +#define vmfle_vf_f16m1_b16(...) __riscv_vmfle_vf_f16m1_b16(__VA_ARGS__) +#define vmfle_vv_f16m2_b8(...) __riscv_vmfle_vv_f16m2_b8(__VA_ARGS__) +#define vmfle_vf_f16m2_b8(...) __riscv_vmfle_vf_f16m2_b8(__VA_ARGS__) +#define vmfle_vv_f16m4_b4(...) __riscv_vmfle_vv_f16m4_b4(__VA_ARGS__) +#define vmfle_vf_f16m4_b4(...) __riscv_vmfle_vf_f16m4_b4(__VA_ARGS__) +#define vmfle_vv_f16m8_b2(...) __riscv_vmfle_vv_f16m8_b2(__VA_ARGS__) +#define vmfle_vf_f16m8_b2(...) __riscv_vmfle_vf_f16m8_b2(__VA_ARGS__) +#define vmfle_vv_f32mf2_b64(...) __riscv_vmfle_vv_f32mf2_b64(__VA_ARGS__) +#define vmfle_vf_f32mf2_b64(...) __riscv_vmfle_vf_f32mf2_b64(__VA_ARGS__) +#define vmfle_vv_f32m1_b32(...) __riscv_vmfle_vv_f32m1_b32(__VA_ARGS__) +#define vmfle_vf_f32m1_b32(...) __riscv_vmfle_vf_f32m1_b32(__VA_ARGS__) +#define vmfle_vv_f32m2_b16(...) __riscv_vmfle_vv_f32m2_b16(__VA_ARGS__) +#define vmfle_vf_f32m2_b16(...) __riscv_vmfle_vf_f32m2_b16(__VA_ARGS__) +#define vmfle_vv_f32m4_b8(...) __riscv_vmfle_vv_f32m4_b8(__VA_ARGS__) +#define vmfle_vf_f32m4_b8(...) __riscv_vmfle_vf_f32m4_b8(__VA_ARGS__) +#define vmfle_vv_f32m8_b4(...) __riscv_vmfle_vv_f32m8_b4(__VA_ARGS__) +#define vmfle_vf_f32m8_b4(...) __riscv_vmfle_vf_f32m8_b4(__VA_ARGS__) +#define vmfle_vv_f64m1_b64(...) __riscv_vmfle_vv_f64m1_b64(__VA_ARGS__) +#define vmfle_vf_f64m1_b64(...) __riscv_vmfle_vf_f64m1_b64(__VA_ARGS__) +#define vmfle_vv_f64m2_b32(...) __riscv_vmfle_vv_f64m2_b32(__VA_ARGS__) +#define vmfle_vf_f64m2_b32(...) __riscv_vmfle_vf_f64m2_b32(__VA_ARGS__) +#define vmfle_vv_f64m4_b16(...) __riscv_vmfle_vv_f64m4_b16(__VA_ARGS__) +#define vmfle_vf_f64m4_b16(...) __riscv_vmfle_vf_f64m4_b16(__VA_ARGS__) +#define vmfle_vv_f64m8_b8(...) __riscv_vmfle_vv_f64m8_b8(__VA_ARGS__) +#define vmfle_vf_f64m8_b8(...) __riscv_vmfle_vf_f64m8_b8(__VA_ARGS__) +#define vmfgt_vv_f16mf4_b64(...) __riscv_vmfgt_vv_f16mf4_b64(__VA_ARGS__) +#define vmfgt_vf_f16mf4_b64(...) __riscv_vmfgt_vf_f16mf4_b64(__VA_ARGS__) +#define vmfgt_vv_f16mf2_b32(...) __riscv_vmfgt_vv_f16mf2_b32(__VA_ARGS__) +#define vmfgt_vf_f16mf2_b32(...) __riscv_vmfgt_vf_f16mf2_b32(__VA_ARGS__) +#define vmfgt_vv_f16m1_b16(...) __riscv_vmfgt_vv_f16m1_b16(__VA_ARGS__) +#define vmfgt_vf_f16m1_b16(...) __riscv_vmfgt_vf_f16m1_b16(__VA_ARGS__) +#define vmfgt_vv_f16m2_b8(...) __riscv_vmfgt_vv_f16m2_b8(__VA_ARGS__) +#define vmfgt_vf_f16m2_b8(...) __riscv_vmfgt_vf_f16m2_b8(__VA_ARGS__) +#define vmfgt_vv_f16m4_b4(...) __riscv_vmfgt_vv_f16m4_b4(__VA_ARGS__) +#define vmfgt_vf_f16m4_b4(...) __riscv_vmfgt_vf_f16m4_b4(__VA_ARGS__) +#define vmfgt_vv_f16m8_b2(...) __riscv_vmfgt_vv_f16m8_b2(__VA_ARGS__) +#define vmfgt_vf_f16m8_b2(...) __riscv_vmfgt_vf_f16m8_b2(__VA_ARGS__) +#define vmfgt_vv_f32mf2_b64(...) __riscv_vmfgt_vv_f32mf2_b64(__VA_ARGS__) +#define vmfgt_vf_f32mf2_b64(...) __riscv_vmfgt_vf_f32mf2_b64(__VA_ARGS__) +#define vmfgt_vv_f32m1_b32(...) __riscv_vmfgt_vv_f32m1_b32(__VA_ARGS__) +#define vmfgt_vf_f32m1_b32(...) __riscv_vmfgt_vf_f32m1_b32(__VA_ARGS__) +#define vmfgt_vv_f32m2_b16(...) __riscv_vmfgt_vv_f32m2_b16(__VA_ARGS__) +#define vmfgt_vf_f32m2_b16(...) __riscv_vmfgt_vf_f32m2_b16(__VA_ARGS__) +#define vmfgt_vv_f32m4_b8(...) __riscv_vmfgt_vv_f32m4_b8(__VA_ARGS__) +#define vmfgt_vf_f32m4_b8(...) __riscv_vmfgt_vf_f32m4_b8(__VA_ARGS__) +#define vmfgt_vv_f32m8_b4(...) __riscv_vmfgt_vv_f32m8_b4(__VA_ARGS__) +#define vmfgt_vf_f32m8_b4(...) __riscv_vmfgt_vf_f32m8_b4(__VA_ARGS__) +#define vmfgt_vv_f64m1_b64(...) __riscv_vmfgt_vv_f64m1_b64(__VA_ARGS__) +#define vmfgt_vf_f64m1_b64(...) __riscv_vmfgt_vf_f64m1_b64(__VA_ARGS__) +#define vmfgt_vv_f64m2_b32(...) __riscv_vmfgt_vv_f64m2_b32(__VA_ARGS__) +#define vmfgt_vf_f64m2_b32(...) __riscv_vmfgt_vf_f64m2_b32(__VA_ARGS__) +#define vmfgt_vv_f64m4_b16(...) __riscv_vmfgt_vv_f64m4_b16(__VA_ARGS__) +#define vmfgt_vf_f64m4_b16(...) __riscv_vmfgt_vf_f64m4_b16(__VA_ARGS__) +#define vmfgt_vv_f64m8_b8(...) __riscv_vmfgt_vv_f64m8_b8(__VA_ARGS__) +#define vmfgt_vf_f64m8_b8(...) __riscv_vmfgt_vf_f64m8_b8(__VA_ARGS__) +#define vmfge_vv_f16mf4_b64(...) __riscv_vmfge_vv_f16mf4_b64(__VA_ARGS__) +#define vmfge_vf_f16mf4_b64(...) __riscv_vmfge_vf_f16mf4_b64(__VA_ARGS__) +#define vmfge_vv_f16mf2_b32(...) __riscv_vmfge_vv_f16mf2_b32(__VA_ARGS__) +#define vmfge_vf_f16mf2_b32(...) __riscv_vmfge_vf_f16mf2_b32(__VA_ARGS__) +#define vmfge_vv_f16m1_b16(...) __riscv_vmfge_vv_f16m1_b16(__VA_ARGS__) +#define vmfge_vf_f16m1_b16(...) __riscv_vmfge_vf_f16m1_b16(__VA_ARGS__) +#define vmfge_vv_f16m2_b8(...) __riscv_vmfge_vv_f16m2_b8(__VA_ARGS__) +#define vmfge_vf_f16m2_b8(...) __riscv_vmfge_vf_f16m2_b8(__VA_ARGS__) +#define vmfge_vv_f16m4_b4(...) __riscv_vmfge_vv_f16m4_b4(__VA_ARGS__) +#define vmfge_vf_f16m4_b4(...) __riscv_vmfge_vf_f16m4_b4(__VA_ARGS__) +#define vmfge_vv_f16m8_b2(...) __riscv_vmfge_vv_f16m8_b2(__VA_ARGS__) +#define vmfge_vf_f16m8_b2(...) __riscv_vmfge_vf_f16m8_b2(__VA_ARGS__) +#define vmfge_vv_f32mf2_b64(...) __riscv_vmfge_vv_f32mf2_b64(__VA_ARGS__) +#define vmfge_vf_f32mf2_b64(...) __riscv_vmfge_vf_f32mf2_b64(__VA_ARGS__) +#define vmfge_vv_f32m1_b32(...) __riscv_vmfge_vv_f32m1_b32(__VA_ARGS__) +#define vmfge_vf_f32m1_b32(...) __riscv_vmfge_vf_f32m1_b32(__VA_ARGS__) +#define vmfge_vv_f32m2_b16(...) __riscv_vmfge_vv_f32m2_b16(__VA_ARGS__) +#define vmfge_vf_f32m2_b16(...) __riscv_vmfge_vf_f32m2_b16(__VA_ARGS__) +#define vmfge_vv_f32m4_b8(...) __riscv_vmfge_vv_f32m4_b8(__VA_ARGS__) +#define vmfge_vf_f32m4_b8(...) __riscv_vmfge_vf_f32m4_b8(__VA_ARGS__) +#define vmfge_vv_f32m8_b4(...) __riscv_vmfge_vv_f32m8_b4(__VA_ARGS__) +#define vmfge_vf_f32m8_b4(...) __riscv_vmfge_vf_f32m8_b4(__VA_ARGS__) +#define vmfge_vv_f64m1_b64(...) __riscv_vmfge_vv_f64m1_b64(__VA_ARGS__) +#define vmfge_vf_f64m1_b64(...) __riscv_vmfge_vf_f64m1_b64(__VA_ARGS__) +#define vmfge_vv_f64m2_b32(...) __riscv_vmfge_vv_f64m2_b32(__VA_ARGS__) +#define vmfge_vf_f64m2_b32(...) __riscv_vmfge_vf_f64m2_b32(__VA_ARGS__) +#define vmfge_vv_f64m4_b16(...) __riscv_vmfge_vv_f64m4_b16(__VA_ARGS__) +#define vmfge_vf_f64m4_b16(...) __riscv_vmfge_vf_f64m4_b16(__VA_ARGS__) +#define vmfge_vv_f64m8_b8(...) __riscv_vmfge_vv_f64m8_b8(__VA_ARGS__) +#define vmfge_vf_f64m8_b8(...) __riscv_vmfge_vf_f64m8_b8(__VA_ARGS__) +// masked functions +#define vmfeq_vv_f16mf4_b64_m(...) __riscv_vmfeq_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmfeq_vf_f16mf4_b64_m(...) __riscv_vmfeq_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmfeq_vv_f16mf2_b32_m(...) __riscv_vmfeq_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmfeq_vf_f16mf2_b32_m(...) __riscv_vmfeq_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmfeq_vv_f16m1_b16_m(...) __riscv_vmfeq_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmfeq_vf_f16m1_b16_m(...) __riscv_vmfeq_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmfeq_vv_f16m2_b8_m(...) __riscv_vmfeq_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmfeq_vf_f16m2_b8_m(...) __riscv_vmfeq_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmfeq_vv_f16m4_b4_m(...) __riscv_vmfeq_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmfeq_vf_f16m4_b4_m(...) __riscv_vmfeq_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmfeq_vv_f16m8_b2_m(...) __riscv_vmfeq_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmfeq_vf_f16m8_b2_m(...) __riscv_vmfeq_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmfeq_vv_f32mf2_b64_m(...) __riscv_vmfeq_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmfeq_vf_f32mf2_b64_m(...) __riscv_vmfeq_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmfeq_vv_f32m1_b32_m(...) __riscv_vmfeq_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmfeq_vf_f32m1_b32_m(...) __riscv_vmfeq_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmfeq_vv_f32m2_b16_m(...) __riscv_vmfeq_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmfeq_vf_f32m2_b16_m(...) __riscv_vmfeq_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmfeq_vv_f32m4_b8_m(...) __riscv_vmfeq_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmfeq_vf_f32m4_b8_m(...) __riscv_vmfeq_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmfeq_vv_f32m8_b4_m(...) __riscv_vmfeq_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmfeq_vf_f32m8_b4_m(...) __riscv_vmfeq_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmfeq_vv_f64m1_b64_m(...) __riscv_vmfeq_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmfeq_vf_f64m1_b64_m(...) __riscv_vmfeq_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmfeq_vv_f64m2_b32_m(...) __riscv_vmfeq_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmfeq_vf_f64m2_b32_m(...) __riscv_vmfeq_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmfeq_vv_f64m4_b16_m(...) __riscv_vmfeq_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmfeq_vf_f64m4_b16_m(...) __riscv_vmfeq_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmfeq_vv_f64m8_b8_m(...) __riscv_vmfeq_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmfeq_vf_f64m8_b8_m(...) __riscv_vmfeq_vf_f64m8_b8_mu(__VA_ARGS__) +#define vmfne_vv_f16mf4_b64_m(...) __riscv_vmfne_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmfne_vf_f16mf4_b64_m(...) __riscv_vmfne_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmfne_vv_f16mf2_b32_m(...) __riscv_vmfne_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmfne_vf_f16mf2_b32_m(...) __riscv_vmfne_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmfne_vv_f16m1_b16_m(...) __riscv_vmfne_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmfne_vf_f16m1_b16_m(...) __riscv_vmfne_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmfne_vv_f16m2_b8_m(...) __riscv_vmfne_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmfne_vf_f16m2_b8_m(...) __riscv_vmfne_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmfne_vv_f16m4_b4_m(...) __riscv_vmfne_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmfne_vf_f16m4_b4_m(...) __riscv_vmfne_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmfne_vv_f16m8_b2_m(...) __riscv_vmfne_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmfne_vf_f16m8_b2_m(...) __riscv_vmfne_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmfne_vv_f32mf2_b64_m(...) __riscv_vmfne_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmfne_vf_f32mf2_b64_m(...) __riscv_vmfne_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmfne_vv_f32m1_b32_m(...) __riscv_vmfne_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmfne_vf_f32m1_b32_m(...) __riscv_vmfne_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmfne_vv_f32m2_b16_m(...) __riscv_vmfne_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmfne_vf_f32m2_b16_m(...) __riscv_vmfne_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmfne_vv_f32m4_b8_m(...) __riscv_vmfne_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmfne_vf_f32m4_b8_m(...) __riscv_vmfne_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmfne_vv_f32m8_b4_m(...) __riscv_vmfne_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmfne_vf_f32m8_b4_m(...) __riscv_vmfne_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmfne_vv_f64m1_b64_m(...) __riscv_vmfne_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmfne_vf_f64m1_b64_m(...) __riscv_vmfne_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmfne_vv_f64m2_b32_m(...) __riscv_vmfne_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmfne_vf_f64m2_b32_m(...) __riscv_vmfne_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmfne_vv_f64m4_b16_m(...) __riscv_vmfne_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmfne_vf_f64m4_b16_m(...) __riscv_vmfne_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmfne_vv_f64m8_b8_m(...) __riscv_vmfne_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmfne_vf_f64m8_b8_m(...) __riscv_vmfne_vf_f64m8_b8_mu(__VA_ARGS__) +#define vmflt_vv_f16mf4_b64_m(...) __riscv_vmflt_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmflt_vf_f16mf4_b64_m(...) __riscv_vmflt_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmflt_vv_f16mf2_b32_m(...) __riscv_vmflt_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmflt_vf_f16mf2_b32_m(...) __riscv_vmflt_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmflt_vv_f16m1_b16_m(...) __riscv_vmflt_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmflt_vf_f16m1_b16_m(...) __riscv_vmflt_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmflt_vv_f16m2_b8_m(...) __riscv_vmflt_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmflt_vf_f16m2_b8_m(...) __riscv_vmflt_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmflt_vv_f16m4_b4_m(...) __riscv_vmflt_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmflt_vf_f16m4_b4_m(...) __riscv_vmflt_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmflt_vv_f16m8_b2_m(...) __riscv_vmflt_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmflt_vf_f16m8_b2_m(...) __riscv_vmflt_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmflt_vv_f32mf2_b64_m(...) __riscv_vmflt_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmflt_vf_f32mf2_b64_m(...) __riscv_vmflt_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmflt_vv_f32m1_b32_m(...) __riscv_vmflt_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmflt_vf_f32m1_b32_m(...) __riscv_vmflt_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmflt_vv_f32m2_b16_m(...) __riscv_vmflt_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmflt_vf_f32m2_b16_m(...) __riscv_vmflt_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmflt_vv_f32m4_b8_m(...) __riscv_vmflt_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmflt_vf_f32m4_b8_m(...) __riscv_vmflt_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmflt_vv_f32m8_b4_m(...) __riscv_vmflt_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmflt_vf_f32m8_b4_m(...) __riscv_vmflt_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmflt_vv_f64m1_b64_m(...) __riscv_vmflt_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmflt_vf_f64m1_b64_m(...) __riscv_vmflt_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmflt_vv_f64m2_b32_m(...) __riscv_vmflt_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmflt_vf_f64m2_b32_m(...) __riscv_vmflt_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmflt_vv_f64m4_b16_m(...) __riscv_vmflt_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmflt_vf_f64m4_b16_m(...) __riscv_vmflt_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmflt_vv_f64m8_b8_m(...) __riscv_vmflt_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmflt_vf_f64m8_b8_m(...) __riscv_vmflt_vf_f64m8_b8_mu(__VA_ARGS__) +#define vmfle_vv_f16mf4_b64_m(...) __riscv_vmfle_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmfle_vf_f16mf4_b64_m(...) __riscv_vmfle_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmfle_vv_f16mf2_b32_m(...) __riscv_vmfle_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmfle_vf_f16mf2_b32_m(...) __riscv_vmfle_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmfle_vv_f16m1_b16_m(...) __riscv_vmfle_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmfle_vf_f16m1_b16_m(...) __riscv_vmfle_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmfle_vv_f16m2_b8_m(...) __riscv_vmfle_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmfle_vf_f16m2_b8_m(...) __riscv_vmfle_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmfle_vv_f16m4_b4_m(...) __riscv_vmfle_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmfle_vf_f16m4_b4_m(...) __riscv_vmfle_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmfle_vv_f16m8_b2_m(...) __riscv_vmfle_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmfle_vf_f16m8_b2_m(...) __riscv_vmfle_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmfle_vv_f32mf2_b64_m(...) __riscv_vmfle_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmfle_vf_f32mf2_b64_m(...) __riscv_vmfle_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmfle_vv_f32m1_b32_m(...) __riscv_vmfle_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmfle_vf_f32m1_b32_m(...) __riscv_vmfle_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmfle_vv_f32m2_b16_m(...) __riscv_vmfle_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmfle_vf_f32m2_b16_m(...) __riscv_vmfle_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmfle_vv_f32m4_b8_m(...) __riscv_vmfle_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmfle_vf_f32m4_b8_m(...) __riscv_vmfle_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmfle_vv_f32m8_b4_m(...) __riscv_vmfle_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmfle_vf_f32m8_b4_m(...) __riscv_vmfle_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmfle_vv_f64m1_b64_m(...) __riscv_vmfle_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmfle_vf_f64m1_b64_m(...) __riscv_vmfle_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmfle_vv_f64m2_b32_m(...) __riscv_vmfle_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmfle_vf_f64m2_b32_m(...) __riscv_vmfle_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmfle_vv_f64m4_b16_m(...) __riscv_vmfle_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmfle_vf_f64m4_b16_m(...) __riscv_vmfle_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmfle_vv_f64m8_b8_m(...) __riscv_vmfle_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmfle_vf_f64m8_b8_m(...) __riscv_vmfle_vf_f64m8_b8_mu(__VA_ARGS__) +#define vmfgt_vv_f16mf4_b64_m(...) __riscv_vmfgt_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmfgt_vf_f16mf4_b64_m(...) __riscv_vmfgt_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmfgt_vv_f16mf2_b32_m(...) __riscv_vmfgt_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmfgt_vf_f16mf2_b32_m(...) __riscv_vmfgt_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmfgt_vv_f16m1_b16_m(...) __riscv_vmfgt_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmfgt_vf_f16m1_b16_m(...) __riscv_vmfgt_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmfgt_vv_f16m2_b8_m(...) __riscv_vmfgt_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmfgt_vf_f16m2_b8_m(...) __riscv_vmfgt_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmfgt_vv_f16m4_b4_m(...) __riscv_vmfgt_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmfgt_vf_f16m4_b4_m(...) __riscv_vmfgt_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmfgt_vv_f16m8_b2_m(...) __riscv_vmfgt_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmfgt_vf_f16m8_b2_m(...) __riscv_vmfgt_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmfgt_vv_f32mf2_b64_m(...) __riscv_vmfgt_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmfgt_vf_f32mf2_b64_m(...) __riscv_vmfgt_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmfgt_vv_f32m1_b32_m(...) __riscv_vmfgt_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmfgt_vf_f32m1_b32_m(...) __riscv_vmfgt_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmfgt_vv_f32m2_b16_m(...) __riscv_vmfgt_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmfgt_vf_f32m2_b16_m(...) __riscv_vmfgt_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmfgt_vv_f32m4_b8_m(...) __riscv_vmfgt_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmfgt_vf_f32m4_b8_m(...) __riscv_vmfgt_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmfgt_vv_f32m8_b4_m(...) __riscv_vmfgt_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmfgt_vf_f32m8_b4_m(...) __riscv_vmfgt_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmfgt_vv_f64m1_b64_m(...) __riscv_vmfgt_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmfgt_vf_f64m1_b64_m(...) __riscv_vmfgt_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmfgt_vv_f64m2_b32_m(...) __riscv_vmfgt_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmfgt_vf_f64m2_b32_m(...) __riscv_vmfgt_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmfgt_vv_f64m4_b16_m(...) __riscv_vmfgt_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmfgt_vf_f64m4_b16_m(...) __riscv_vmfgt_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmfgt_vv_f64m8_b8_m(...) __riscv_vmfgt_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmfgt_vf_f64m8_b8_m(...) __riscv_vmfgt_vf_f64m8_b8_mu(__VA_ARGS__) +#define vmfge_vv_f16mf4_b64_m(...) __riscv_vmfge_vv_f16mf4_b64_mu(__VA_ARGS__) +#define vmfge_vf_f16mf4_b64_m(...) __riscv_vmfge_vf_f16mf4_b64_mu(__VA_ARGS__) +#define vmfge_vv_f16mf2_b32_m(...) __riscv_vmfge_vv_f16mf2_b32_mu(__VA_ARGS__) +#define vmfge_vf_f16mf2_b32_m(...) __riscv_vmfge_vf_f16mf2_b32_mu(__VA_ARGS__) +#define vmfge_vv_f16m1_b16_m(...) __riscv_vmfge_vv_f16m1_b16_mu(__VA_ARGS__) +#define vmfge_vf_f16m1_b16_m(...) __riscv_vmfge_vf_f16m1_b16_mu(__VA_ARGS__) +#define vmfge_vv_f16m2_b8_m(...) __riscv_vmfge_vv_f16m2_b8_mu(__VA_ARGS__) +#define vmfge_vf_f16m2_b8_m(...) __riscv_vmfge_vf_f16m2_b8_mu(__VA_ARGS__) +#define vmfge_vv_f16m4_b4_m(...) __riscv_vmfge_vv_f16m4_b4_mu(__VA_ARGS__) +#define vmfge_vf_f16m4_b4_m(...) __riscv_vmfge_vf_f16m4_b4_mu(__VA_ARGS__) +#define vmfge_vv_f16m8_b2_m(...) __riscv_vmfge_vv_f16m8_b2_mu(__VA_ARGS__) +#define vmfge_vf_f16m8_b2_m(...) __riscv_vmfge_vf_f16m8_b2_mu(__VA_ARGS__) +#define vmfge_vv_f32mf2_b64_m(...) __riscv_vmfge_vv_f32mf2_b64_mu(__VA_ARGS__) +#define vmfge_vf_f32mf2_b64_m(...) __riscv_vmfge_vf_f32mf2_b64_mu(__VA_ARGS__) +#define vmfge_vv_f32m1_b32_m(...) __riscv_vmfge_vv_f32m1_b32_mu(__VA_ARGS__) +#define vmfge_vf_f32m1_b32_m(...) __riscv_vmfge_vf_f32m1_b32_mu(__VA_ARGS__) +#define vmfge_vv_f32m2_b16_m(...) __riscv_vmfge_vv_f32m2_b16_mu(__VA_ARGS__) +#define vmfge_vf_f32m2_b16_m(...) __riscv_vmfge_vf_f32m2_b16_mu(__VA_ARGS__) +#define vmfge_vv_f32m4_b8_m(...) __riscv_vmfge_vv_f32m4_b8_mu(__VA_ARGS__) +#define vmfge_vf_f32m4_b8_m(...) __riscv_vmfge_vf_f32m4_b8_mu(__VA_ARGS__) +#define vmfge_vv_f32m8_b4_m(...) __riscv_vmfge_vv_f32m8_b4_mu(__VA_ARGS__) +#define vmfge_vf_f32m8_b4_m(...) __riscv_vmfge_vf_f32m8_b4_mu(__VA_ARGS__) +#define vmfge_vv_f64m1_b64_m(...) __riscv_vmfge_vv_f64m1_b64_mu(__VA_ARGS__) +#define vmfge_vf_f64m1_b64_m(...) __riscv_vmfge_vf_f64m1_b64_mu(__VA_ARGS__) +#define vmfge_vv_f64m2_b32_m(...) __riscv_vmfge_vv_f64m2_b32_mu(__VA_ARGS__) +#define vmfge_vf_f64m2_b32_m(...) __riscv_vmfge_vf_f64m2_b32_mu(__VA_ARGS__) +#define vmfge_vv_f64m4_b16_m(...) __riscv_vmfge_vv_f64m4_b16_mu(__VA_ARGS__) +#define vmfge_vf_f64m4_b16_m(...) __riscv_vmfge_vf_f64m4_b16_mu(__VA_ARGS__) +#define vmfge_vv_f64m8_b8_m(...) __riscv_vmfge_vv_f64m8_b8_mu(__VA_ARGS__) +#define vmfge_vf_f64m8_b8_m(...) __riscv_vmfge_vf_f64m8_b8_mu(__VA_ARGS__) +#define vfclass_v_u16mf4(...) __riscv_vfclass_v_u16mf4(__VA_ARGS__) +#define vfclass_v_u16mf2(...) __riscv_vfclass_v_u16mf2(__VA_ARGS__) +#define vfclass_v_u16m1(...) __riscv_vfclass_v_u16m1(__VA_ARGS__) +#define vfclass_v_u16m2(...) __riscv_vfclass_v_u16m2(__VA_ARGS__) +#define vfclass_v_u16m4(...) __riscv_vfclass_v_u16m4(__VA_ARGS__) +#define vfclass_v_u16m8(...) __riscv_vfclass_v_u16m8(__VA_ARGS__) +#define vfclass_v_u32mf2(...) __riscv_vfclass_v_u32mf2(__VA_ARGS__) +#define vfclass_v_u32m1(...) __riscv_vfclass_v_u32m1(__VA_ARGS__) +#define vfclass_v_u32m2(...) __riscv_vfclass_v_u32m2(__VA_ARGS__) +#define vfclass_v_u32m4(...) __riscv_vfclass_v_u32m4(__VA_ARGS__) +#define vfclass_v_u32m8(...) __riscv_vfclass_v_u32m8(__VA_ARGS__) +#define vfclass_v_u64m1(...) __riscv_vfclass_v_u64m1(__VA_ARGS__) +#define vfclass_v_u64m2(...) __riscv_vfclass_v_u64m2(__VA_ARGS__) +#define vfclass_v_u64m4(...) __riscv_vfclass_v_u64m4(__VA_ARGS__) +#define vfclass_v_u64m8(...) __riscv_vfclass_v_u64m8(__VA_ARGS__) +// masked functions +#define vfclass_v_u16mf4_m(...) __riscv_vfclass_v_u16mf4_tumu(__VA_ARGS__) +#define vfclass_v_u16mf2_m(...) __riscv_vfclass_v_u16mf2_tumu(__VA_ARGS__) +#define vfclass_v_u16m1_m(...) __riscv_vfclass_v_u16m1_tumu(__VA_ARGS__) +#define vfclass_v_u16m2_m(...) __riscv_vfclass_v_u16m2_tumu(__VA_ARGS__) +#define vfclass_v_u16m4_m(...) __riscv_vfclass_v_u16m4_tumu(__VA_ARGS__) +#define vfclass_v_u16m8_m(...) __riscv_vfclass_v_u16m8_tumu(__VA_ARGS__) +#define vfclass_v_u32mf2_m(...) __riscv_vfclass_v_u32mf2_tumu(__VA_ARGS__) +#define vfclass_v_u32m1_m(...) __riscv_vfclass_v_u32m1_tumu(__VA_ARGS__) +#define vfclass_v_u32m2_m(...) __riscv_vfclass_v_u32m2_tumu(__VA_ARGS__) +#define vfclass_v_u32m4_m(...) __riscv_vfclass_v_u32m4_tumu(__VA_ARGS__) +#define vfclass_v_u32m8_m(...) __riscv_vfclass_v_u32m8_tumu(__VA_ARGS__) +#define vfclass_v_u64m1_m(...) __riscv_vfclass_v_u64m1_tumu(__VA_ARGS__) +#define vfclass_v_u64m2_m(...) __riscv_vfclass_v_u64m2_tumu(__VA_ARGS__) +#define vfclass_v_u64m4_m(...) __riscv_vfclass_v_u64m4_tumu(__VA_ARGS__) +#define vfclass_v_u64m8_m(...) __riscv_vfclass_v_u64m8_tumu(__VA_ARGS__) +#define vmerge_vvm_f16mf4(mask, op1, op2, vl) __riscv_vmerge_vvm_f16mf4((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16mf4(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16mf4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f16mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_f16mf2((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16mf2(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f16m1(mask, op1, op2, vl) __riscv_vmerge_vvm_f16m1((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16m1(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f16m2(mask, op1, op2, vl) __riscv_vmerge_vvm_f16m2((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16m2(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f16m4(mask, op1, op2, vl) __riscv_vmerge_vvm_f16m4((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16m4(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f16m8(mask, op1, op2, vl) __riscv_vmerge_vvm_f16m8((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f16m8(mask, op1, op2, vl) __riscv_vfmerge_vfm_f16m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f32mf2(mask, op1, op2, vl) __riscv_vmerge_vvm_f32mf2((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f32mf2(mask, op1, op2, vl) __riscv_vfmerge_vfm_f32mf2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f32m1(mask, op1, op2, vl) __riscv_vmerge_vvm_f32m1((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f32m1(mask, op1, op2, vl) __riscv_vfmerge_vfm_f32m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f32m2(mask, op1, op2, vl) __riscv_vmerge_vvm_f32m2((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f32m2(mask, op1, op2, vl) __riscv_vfmerge_vfm_f32m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f32m4(mask, op1, op2, vl) __riscv_vmerge_vvm_f32m4((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f32m4(mask, op1, op2, vl) __riscv_vfmerge_vfm_f32m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f32m8(mask, op1, op2, vl) __riscv_vmerge_vvm_f32m8((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f32m8(mask, op1, op2, vl) __riscv_vfmerge_vfm_f32m8((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f64m1(mask, op1, op2, vl) __riscv_vmerge_vvm_f64m1((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f64m1(mask, op1, op2, vl) __riscv_vfmerge_vfm_f64m1((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f64m2(mask, op1, op2, vl) __riscv_vmerge_vvm_f64m2((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f64m2(mask, op1, op2, vl) __riscv_vfmerge_vfm_f64m2((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f64m4(mask, op1, op2, vl) __riscv_vmerge_vvm_f64m4((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f64m4(mask, op1, op2, vl) __riscv_vfmerge_vfm_f64m4((op1), (op2), (mask), (vl)) +#define vmerge_vvm_f64m8(mask, op1, op2, vl) __riscv_vmerge_vvm_f64m8((op1), (op2), (mask), (vl)) +#define vfmerge_vfm_f64m8(mask, op1, op2, vl) __riscv_vfmerge_vfm_f64m8((op1), (op2), (mask), (vl)) +#define vmv_v_v_f16mf4(...) __riscv_vmv_v_v_f16mf4(__VA_ARGS__) +#define vfmv_v_f_f16mf4(...) __riscv_vfmv_v_f_f16mf4(__VA_ARGS__) +#define vmv_v_v_f16mf2(...) __riscv_vmv_v_v_f16mf2(__VA_ARGS__) +#define vfmv_v_f_f16mf2(...) __riscv_vfmv_v_f_f16mf2(__VA_ARGS__) +#define vmv_v_v_f16m1(...) __riscv_vmv_v_v_f16m1(__VA_ARGS__) +#define vfmv_v_f_f16m1(...) __riscv_vfmv_v_f_f16m1(__VA_ARGS__) +#define vmv_v_v_f16m2(...) __riscv_vmv_v_v_f16m2(__VA_ARGS__) +#define vfmv_v_f_f16m2(...) __riscv_vfmv_v_f_f16m2(__VA_ARGS__) +#define vmv_v_v_f16m4(...) __riscv_vmv_v_v_f16m4(__VA_ARGS__) +#define vfmv_v_f_f16m4(...) __riscv_vfmv_v_f_f16m4(__VA_ARGS__) +#define vmv_v_v_f16m8(...) __riscv_vmv_v_v_f16m8(__VA_ARGS__) +#define vfmv_v_f_f16m8(...) __riscv_vfmv_v_f_f16m8(__VA_ARGS__) +#define vmv_v_v_f32mf2(...) __riscv_vmv_v_v_f32mf2(__VA_ARGS__) +#define vfmv_v_f_f32mf2(...) __riscv_vfmv_v_f_f32mf2(__VA_ARGS__) +#define vmv_v_v_f32m1(...) __riscv_vmv_v_v_f32m1(__VA_ARGS__) +#define vfmv_v_f_f32m1(...) __riscv_vfmv_v_f_f32m1(__VA_ARGS__) +#define vmv_v_v_f32m2(...) __riscv_vmv_v_v_f32m2(__VA_ARGS__) +#define vfmv_v_f_f32m2(...) __riscv_vfmv_v_f_f32m2(__VA_ARGS__) +#define vmv_v_v_f32m4(...) __riscv_vmv_v_v_f32m4(__VA_ARGS__) +#define vfmv_v_f_f32m4(...) __riscv_vfmv_v_f_f32m4(__VA_ARGS__) +#define vmv_v_v_f32m8(...) __riscv_vmv_v_v_f32m8(__VA_ARGS__) +#define vfmv_v_f_f32m8(...) __riscv_vfmv_v_f_f32m8(__VA_ARGS__) +#define vmv_v_v_f64m1(...) __riscv_vmv_v_v_f64m1(__VA_ARGS__) +#define vfmv_v_f_f64m1(...) __riscv_vfmv_v_f_f64m1(__VA_ARGS__) +#define vmv_v_v_f64m2(...) __riscv_vmv_v_v_f64m2(__VA_ARGS__) +#define vfmv_v_f_f64m2(...) __riscv_vfmv_v_f_f64m2(__VA_ARGS__) +#define vmv_v_v_f64m4(...) __riscv_vmv_v_v_f64m4(__VA_ARGS__) +#define vfmv_v_f_f64m4(...) __riscv_vfmv_v_f_f64m4(__VA_ARGS__) +#define vmv_v_v_f64m8(...) __riscv_vmv_v_v_f64m8(__VA_ARGS__) +#define vfmv_v_f_f64m8(...) __riscv_vfmv_v_f_f64m8(__VA_ARGS__) +#define vfcvt_x_f_v_i16mf4(...) __riscv_vfcvt_x_f_v_i16mf4(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16mf4(...) __riscv_vfcvt_rtz_x_f_v_i16mf4(__VA_ARGS__) +#define vfcvt_x_f_v_i16mf2(...) __riscv_vfcvt_x_f_v_i16mf2(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16mf2(...) __riscv_vfcvt_rtz_x_f_v_i16mf2(__VA_ARGS__) +#define vfcvt_x_f_v_i16m1(...) __riscv_vfcvt_x_f_v_i16m1(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m1(...) __riscv_vfcvt_rtz_x_f_v_i16m1(__VA_ARGS__) +#define vfcvt_x_f_v_i16m2(...) __riscv_vfcvt_x_f_v_i16m2(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m2(...) __riscv_vfcvt_rtz_x_f_v_i16m2(__VA_ARGS__) +#define vfcvt_x_f_v_i16m4(...) __riscv_vfcvt_x_f_v_i16m4(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m4(...) __riscv_vfcvt_rtz_x_f_v_i16m4(__VA_ARGS__) +#define vfcvt_x_f_v_i16m8(...) __riscv_vfcvt_x_f_v_i16m8(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m8(...) __riscv_vfcvt_rtz_x_f_v_i16m8(__VA_ARGS__) +#define vfcvt_xu_f_v_u16mf4(...) __riscv_vfcvt_xu_f_v_u16mf4(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16mf4(...) __riscv_vfcvt_rtz_xu_f_v_u16mf4(__VA_ARGS__) +#define vfcvt_xu_f_v_u16mf2(...) __riscv_vfcvt_xu_f_v_u16mf2(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16mf2(...) __riscv_vfcvt_rtz_xu_f_v_u16mf2(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m1(...) __riscv_vfcvt_xu_f_v_u16m1(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m1(...) __riscv_vfcvt_rtz_xu_f_v_u16m1(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m2(...) __riscv_vfcvt_xu_f_v_u16m2(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m2(...) __riscv_vfcvt_rtz_xu_f_v_u16m2(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m4(...) __riscv_vfcvt_xu_f_v_u16m4(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m4(...) __riscv_vfcvt_rtz_xu_f_v_u16m4(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m8(...) __riscv_vfcvt_xu_f_v_u16m8(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m8(...) __riscv_vfcvt_rtz_xu_f_v_u16m8(__VA_ARGS__) +#define vfcvt_f_x_v_f16mf4(...) __riscv_vfcvt_f_x_v_f16mf4(__VA_ARGS__) +#define vfcvt_f_x_v_f16mf2(...) __riscv_vfcvt_f_x_v_f16mf2(__VA_ARGS__) +#define vfcvt_f_x_v_f16m1(...) __riscv_vfcvt_f_x_v_f16m1(__VA_ARGS__) +#define vfcvt_f_x_v_f16m2(...) __riscv_vfcvt_f_x_v_f16m2(__VA_ARGS__) +#define vfcvt_f_x_v_f16m4(...) __riscv_vfcvt_f_x_v_f16m4(__VA_ARGS__) +#define vfcvt_f_x_v_f16m8(...) __riscv_vfcvt_f_x_v_f16m8(__VA_ARGS__) +#define vfcvt_f_xu_v_f16mf4(...) __riscv_vfcvt_f_xu_v_f16mf4(__VA_ARGS__) +#define vfcvt_f_xu_v_f16mf2(...) __riscv_vfcvt_f_xu_v_f16mf2(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m1(...) __riscv_vfcvt_f_xu_v_f16m1(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m2(...) __riscv_vfcvt_f_xu_v_f16m2(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m4(...) __riscv_vfcvt_f_xu_v_f16m4(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m8(...) __riscv_vfcvt_f_xu_v_f16m8(__VA_ARGS__) +#define vfcvt_x_f_v_i32mf2(...) __riscv_vfcvt_x_f_v_i32mf2(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32mf2(...) __riscv_vfcvt_rtz_x_f_v_i32mf2(__VA_ARGS__) +#define vfcvt_x_f_v_i32m1(...) __riscv_vfcvt_x_f_v_i32m1(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m1(...) __riscv_vfcvt_rtz_x_f_v_i32m1(__VA_ARGS__) +#define vfcvt_x_f_v_i32m2(...) __riscv_vfcvt_x_f_v_i32m2(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m2(...) __riscv_vfcvt_rtz_x_f_v_i32m2(__VA_ARGS__) +#define vfcvt_x_f_v_i32m4(...) __riscv_vfcvt_x_f_v_i32m4(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m4(...) __riscv_vfcvt_rtz_x_f_v_i32m4(__VA_ARGS__) +#define vfcvt_x_f_v_i32m8(...) __riscv_vfcvt_x_f_v_i32m8(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m8(...) __riscv_vfcvt_rtz_x_f_v_i32m8(__VA_ARGS__) +#define vfcvt_xu_f_v_u32mf2(...) __riscv_vfcvt_xu_f_v_u32mf2(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32mf2(...) __riscv_vfcvt_rtz_xu_f_v_u32mf2(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m1(...) __riscv_vfcvt_xu_f_v_u32m1(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m1(...) __riscv_vfcvt_rtz_xu_f_v_u32m1(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m2(...) __riscv_vfcvt_xu_f_v_u32m2(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m2(...) __riscv_vfcvt_rtz_xu_f_v_u32m2(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m4(...) __riscv_vfcvt_xu_f_v_u32m4(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m4(...) __riscv_vfcvt_rtz_xu_f_v_u32m4(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m8(...) __riscv_vfcvt_xu_f_v_u32m8(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m8(...) __riscv_vfcvt_rtz_xu_f_v_u32m8(__VA_ARGS__) +#define vfcvt_f_x_v_f32mf2(...) __riscv_vfcvt_f_x_v_f32mf2(__VA_ARGS__) +#define vfcvt_f_x_v_f32m1(...) __riscv_vfcvt_f_x_v_f32m1(__VA_ARGS__) +#define vfcvt_f_x_v_f32m2(...) __riscv_vfcvt_f_x_v_f32m2(__VA_ARGS__) +#define vfcvt_f_x_v_f32m4(...) __riscv_vfcvt_f_x_v_f32m4(__VA_ARGS__) +#define vfcvt_f_x_v_f32m8(...) __riscv_vfcvt_f_x_v_f32m8(__VA_ARGS__) +#define vfcvt_f_xu_v_f32mf2(...) __riscv_vfcvt_f_xu_v_f32mf2(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m1(...) __riscv_vfcvt_f_xu_v_f32m1(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m2(...) __riscv_vfcvt_f_xu_v_f32m2(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m4(...) __riscv_vfcvt_f_xu_v_f32m4(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m8(...) __riscv_vfcvt_f_xu_v_f32m8(__VA_ARGS__) +#define vfcvt_x_f_v_i64m1(...) __riscv_vfcvt_x_f_v_i64m1(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m1(...) __riscv_vfcvt_rtz_x_f_v_i64m1(__VA_ARGS__) +#define vfcvt_x_f_v_i64m2(...) __riscv_vfcvt_x_f_v_i64m2(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m2(...) __riscv_vfcvt_rtz_x_f_v_i64m2(__VA_ARGS__) +#define vfcvt_x_f_v_i64m4(...) __riscv_vfcvt_x_f_v_i64m4(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m4(...) __riscv_vfcvt_rtz_x_f_v_i64m4(__VA_ARGS__) +#define vfcvt_x_f_v_i64m8(...) __riscv_vfcvt_x_f_v_i64m8(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m8(...) __riscv_vfcvt_rtz_x_f_v_i64m8(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m1(...) __riscv_vfcvt_xu_f_v_u64m1(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m1(...) __riscv_vfcvt_rtz_xu_f_v_u64m1(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m2(...) __riscv_vfcvt_xu_f_v_u64m2(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m2(...) __riscv_vfcvt_rtz_xu_f_v_u64m2(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m4(...) __riscv_vfcvt_xu_f_v_u64m4(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m4(...) __riscv_vfcvt_rtz_xu_f_v_u64m4(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m8(...) __riscv_vfcvt_xu_f_v_u64m8(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m8(...) __riscv_vfcvt_rtz_xu_f_v_u64m8(__VA_ARGS__) +#define vfcvt_f_x_v_f64m1(...) __riscv_vfcvt_f_x_v_f64m1(__VA_ARGS__) +#define vfcvt_f_x_v_f64m2(...) __riscv_vfcvt_f_x_v_f64m2(__VA_ARGS__) +#define vfcvt_f_x_v_f64m4(...) __riscv_vfcvt_f_x_v_f64m4(__VA_ARGS__) +#define vfcvt_f_x_v_f64m8(...) __riscv_vfcvt_f_x_v_f64m8(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m1(...) __riscv_vfcvt_f_xu_v_f64m1(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m2(...) __riscv_vfcvt_f_xu_v_f64m2(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m4(...) __riscv_vfcvt_f_xu_v_f64m4(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m8(...) __riscv_vfcvt_f_xu_v_f64m8(__VA_ARGS__) +// masked functions +#define vfcvt_x_f_v_i16mf4_m(...) __riscv_vfcvt_x_f_v_i16mf4_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16mf4_m(...) __riscv_vfcvt_rtz_x_f_v_i16mf4_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i16mf2_m(...) __riscv_vfcvt_x_f_v_i16mf2_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16mf2_m(...) __riscv_vfcvt_rtz_x_f_v_i16mf2_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i16m1_m(...) __riscv_vfcvt_x_f_v_i16m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m1_m(...) __riscv_vfcvt_rtz_x_f_v_i16m1_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i16m2_m(...) __riscv_vfcvt_x_f_v_i16m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m2_m(...) __riscv_vfcvt_rtz_x_f_v_i16m2_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i16m4_m(...) __riscv_vfcvt_x_f_v_i16m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m4_m(...) __riscv_vfcvt_rtz_x_f_v_i16m4_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i16m8_m(...) __riscv_vfcvt_x_f_v_i16m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i16m8_m(...) __riscv_vfcvt_rtz_x_f_v_i16m8_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16mf4_m(...) __riscv_vfcvt_xu_f_v_u16mf4_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16mf4_m(...) __riscv_vfcvt_rtz_xu_f_v_u16mf4_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16mf2_m(...) __riscv_vfcvt_xu_f_v_u16mf2_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16mf2_m(...) __riscv_vfcvt_rtz_xu_f_v_u16mf2_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m1_m(...) __riscv_vfcvt_xu_f_v_u16m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m1_m(...) __riscv_vfcvt_rtz_xu_f_v_u16m1_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m2_m(...) __riscv_vfcvt_xu_f_v_u16m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m2_m(...) __riscv_vfcvt_rtz_xu_f_v_u16m2_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m4_m(...) __riscv_vfcvt_xu_f_v_u16m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m4_m(...) __riscv_vfcvt_rtz_xu_f_v_u16m4_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u16m8_m(...) __riscv_vfcvt_xu_f_v_u16m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u16m8_m(...) __riscv_vfcvt_rtz_xu_f_v_u16m8_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16mf4_m(...) __riscv_vfcvt_f_x_v_f16mf4_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16mf2_m(...) __riscv_vfcvt_f_x_v_f16mf2_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16m1_m(...) __riscv_vfcvt_f_x_v_f16m1_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16m2_m(...) __riscv_vfcvt_f_x_v_f16m2_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16m4_m(...) __riscv_vfcvt_f_x_v_f16m4_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f16m8_m(...) __riscv_vfcvt_f_x_v_f16m8_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16mf4_m(...) __riscv_vfcvt_f_xu_v_f16mf4_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16mf2_m(...) __riscv_vfcvt_f_xu_v_f16mf2_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m1_m(...) __riscv_vfcvt_f_xu_v_f16m1_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m2_m(...) __riscv_vfcvt_f_xu_v_f16m2_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m4_m(...) __riscv_vfcvt_f_xu_v_f16m4_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f16m8_m(...) __riscv_vfcvt_f_xu_v_f16m8_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i32mf2_m(...) __riscv_vfcvt_x_f_v_i32mf2_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32mf2_m(...) __riscv_vfcvt_rtz_x_f_v_i32mf2_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i32m1_m(...) __riscv_vfcvt_x_f_v_i32m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m1_m(...) __riscv_vfcvt_rtz_x_f_v_i32m1_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i32m2_m(...) __riscv_vfcvt_x_f_v_i32m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m2_m(...) __riscv_vfcvt_rtz_x_f_v_i32m2_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i32m4_m(...) __riscv_vfcvt_x_f_v_i32m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m4_m(...) __riscv_vfcvt_rtz_x_f_v_i32m4_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i32m8_m(...) __riscv_vfcvt_x_f_v_i32m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i32m8_m(...) __riscv_vfcvt_rtz_x_f_v_i32m8_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u32mf2_m(...) __riscv_vfcvt_xu_f_v_u32mf2_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32mf2_m(...) __riscv_vfcvt_rtz_xu_f_v_u32mf2_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m1_m(...) __riscv_vfcvt_xu_f_v_u32m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m1_m(...) __riscv_vfcvt_rtz_xu_f_v_u32m1_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m2_m(...) __riscv_vfcvt_xu_f_v_u32m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m2_m(...) __riscv_vfcvt_rtz_xu_f_v_u32m2_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m4_m(...) __riscv_vfcvt_xu_f_v_u32m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m4_m(...) __riscv_vfcvt_rtz_xu_f_v_u32m4_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u32m8_m(...) __riscv_vfcvt_xu_f_v_u32m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u32m8_m(...) __riscv_vfcvt_rtz_xu_f_v_u32m8_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f32mf2_m(...) __riscv_vfcvt_f_x_v_f32mf2_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f32m1_m(...) __riscv_vfcvt_f_x_v_f32m1_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f32m2_m(...) __riscv_vfcvt_f_x_v_f32m2_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f32m4_m(...) __riscv_vfcvt_f_x_v_f32m4_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f32m8_m(...) __riscv_vfcvt_f_x_v_f32m8_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f32mf2_m(...) __riscv_vfcvt_f_xu_v_f32mf2_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m1_m(...) __riscv_vfcvt_f_xu_v_f32m1_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m2_m(...) __riscv_vfcvt_f_xu_v_f32m2_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m4_m(...) __riscv_vfcvt_f_xu_v_f32m4_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f32m8_m(...) __riscv_vfcvt_f_xu_v_f32m8_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i64m1_m(...) __riscv_vfcvt_x_f_v_i64m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m1_m(...) __riscv_vfcvt_rtz_x_f_v_i64m1_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i64m2_m(...) __riscv_vfcvt_x_f_v_i64m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m2_m(...) __riscv_vfcvt_rtz_x_f_v_i64m2_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i64m4_m(...) __riscv_vfcvt_x_f_v_i64m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m4_m(...) __riscv_vfcvt_rtz_x_f_v_i64m4_tumu(__VA_ARGS__) +#define vfcvt_x_f_v_i64m8_m(...) __riscv_vfcvt_x_f_v_i64m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_x_f_v_i64m8_m(...) __riscv_vfcvt_rtz_x_f_v_i64m8_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m1_m(...) __riscv_vfcvt_xu_f_v_u64m1_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m1_m(...) __riscv_vfcvt_rtz_xu_f_v_u64m1_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m2_m(...) __riscv_vfcvt_xu_f_v_u64m2_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m2_m(...) __riscv_vfcvt_rtz_xu_f_v_u64m2_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m4_m(...) __riscv_vfcvt_xu_f_v_u64m4_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m4_m(...) __riscv_vfcvt_rtz_xu_f_v_u64m4_tumu(__VA_ARGS__) +#define vfcvt_xu_f_v_u64m8_m(...) __riscv_vfcvt_xu_f_v_u64m8_tumu(__VA_ARGS__) +#define vfcvt_rtz_xu_f_v_u64m8_m(...) __riscv_vfcvt_rtz_xu_f_v_u64m8_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f64m1_m(...) __riscv_vfcvt_f_x_v_f64m1_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f64m2_m(...) __riscv_vfcvt_f_x_v_f64m2_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f64m4_m(...) __riscv_vfcvt_f_x_v_f64m4_tumu(__VA_ARGS__) +#define vfcvt_f_x_v_f64m8_m(...) __riscv_vfcvt_f_x_v_f64m8_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m1_m(...) __riscv_vfcvt_f_xu_v_f64m1_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m2_m(...) __riscv_vfcvt_f_xu_v_f64m2_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m4_m(...) __riscv_vfcvt_f_xu_v_f64m4_tumu(__VA_ARGS__) +#define vfcvt_f_xu_v_f64m8_m(...) __riscv_vfcvt_f_xu_v_f64m8_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16mf4(...) __riscv_vwcvt_x_x_v_i16mf4(__VA_ARGS__) +#define vwcvt_x_x_v_i16mf2(...) __riscv_vwcvt_x_x_v_i16mf2(__VA_ARGS__) +#define vwcvt_x_x_v_i16m1(...) __riscv_vwcvt_x_x_v_i16m1(__VA_ARGS__) +#define vwcvt_x_x_v_i16m2(...) __riscv_vwcvt_x_x_v_i16m2(__VA_ARGS__) +#define vwcvt_x_x_v_i16m4(...) __riscv_vwcvt_x_x_v_i16m4(__VA_ARGS__) +#define vwcvt_x_x_v_i16m8(...) __riscv_vwcvt_x_x_v_i16m8(__VA_ARGS__) +#define vwcvtu_x_x_v_u16mf4(...) __riscv_vwcvtu_x_x_v_u16mf4(__VA_ARGS__) +#define vwcvtu_x_x_v_u16mf2(...) __riscv_vwcvtu_x_x_v_u16mf2(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m1(...) __riscv_vwcvtu_x_x_v_u16m1(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m2(...) __riscv_vwcvtu_x_x_v_u16m2(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m4(...) __riscv_vwcvtu_x_x_v_u16m4(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m8(...) __riscv_vwcvtu_x_x_v_u16m8(__VA_ARGS__) +#define vfwcvt_f_x_v_f16mf4(...) __riscv_vfwcvt_f_x_v_f16mf4(__VA_ARGS__) +#define vfwcvt_f_x_v_f16mf2(...) __riscv_vfwcvt_f_x_v_f16mf2(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m1(...) __riscv_vfwcvt_f_x_v_f16m1(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m2(...) __riscv_vfwcvt_f_x_v_f16m2(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m4(...) __riscv_vfwcvt_f_x_v_f16m4(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m8(...) __riscv_vfwcvt_f_x_v_f16m8(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16mf4(...) __riscv_vfwcvt_f_xu_v_f16mf4(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16mf2(...) __riscv_vfwcvt_f_xu_v_f16mf2(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m1(...) __riscv_vfwcvt_f_xu_v_f16m1(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m2(...) __riscv_vfwcvt_f_xu_v_f16m2(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m4(...) __riscv_vfwcvt_f_xu_v_f16m4(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m8(...) __riscv_vfwcvt_f_xu_v_f16m8(__VA_ARGS__) +#define vfwcvt_x_f_v_i32mf2(...) __riscv_vfwcvt_x_f_v_i32mf2(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32mf2(...) __riscv_vfwcvt_rtz_x_f_v_i32mf2(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m1(...) __riscv_vfwcvt_x_f_v_i32m1(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m1(...) __riscv_vfwcvt_rtz_x_f_v_i32m1(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m2(...) __riscv_vfwcvt_x_f_v_i32m2(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m2(...) __riscv_vfwcvt_rtz_x_f_v_i32m2(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m4(...) __riscv_vfwcvt_x_f_v_i32m4(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m4(...) __riscv_vfwcvt_rtz_x_f_v_i32m4(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m8(...) __riscv_vfwcvt_x_f_v_i32m8(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m8(...) __riscv_vfwcvt_rtz_x_f_v_i32m8(__VA_ARGS__) +#define vwcvt_x_x_v_i32mf2(...) __riscv_vwcvt_x_x_v_i32mf2(__VA_ARGS__) +#define vwcvt_x_x_v_i32m1(...) __riscv_vwcvt_x_x_v_i32m1(__VA_ARGS__) +#define vwcvt_x_x_v_i32m2(...) __riscv_vwcvt_x_x_v_i32m2(__VA_ARGS__) +#define vwcvt_x_x_v_i32m4(...) __riscv_vwcvt_x_x_v_i32m4(__VA_ARGS__) +#define vwcvt_x_x_v_i32m8(...) __riscv_vwcvt_x_x_v_i32m8(__VA_ARGS__) +#define vwcvtu_x_x_v_u32mf2(...) __riscv_vwcvtu_x_x_v_u32mf2(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m1(...) __riscv_vwcvtu_x_x_v_u32m1(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m2(...) __riscv_vwcvtu_x_x_v_u32m2(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m4(...) __riscv_vwcvtu_x_x_v_u32m4(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m8(...) __riscv_vwcvtu_x_x_v_u32m8(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32mf2(...) __riscv_vfwcvt_xu_f_v_u32mf2(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32mf2(...) __riscv_vfwcvt_rtz_xu_f_v_u32mf2(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m1(...) __riscv_vfwcvt_xu_f_v_u32m1(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m1(...) __riscv_vfwcvt_rtz_xu_f_v_u32m1(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m2(...) __riscv_vfwcvt_xu_f_v_u32m2(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m2(...) __riscv_vfwcvt_rtz_xu_f_v_u32m2(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m4(...) __riscv_vfwcvt_xu_f_v_u32m4(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m4(...) __riscv_vfwcvt_rtz_xu_f_v_u32m4(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m8(...) __riscv_vfwcvt_xu_f_v_u32m8(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m8(...) __riscv_vfwcvt_rtz_xu_f_v_u32m8(__VA_ARGS__) +#define vfwcvt_f_x_v_f32mf2(...) __riscv_vfwcvt_f_x_v_f32mf2(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m1(...) __riscv_vfwcvt_f_x_v_f32m1(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m2(...) __riscv_vfwcvt_f_x_v_f32m2(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m4(...) __riscv_vfwcvt_f_x_v_f32m4(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m8(...) __riscv_vfwcvt_f_x_v_f32m8(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32mf2(...) __riscv_vfwcvt_f_xu_v_f32mf2(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m1(...) __riscv_vfwcvt_f_xu_v_f32m1(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m2(...) __riscv_vfwcvt_f_xu_v_f32m2(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m4(...) __riscv_vfwcvt_f_xu_v_f32m4(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m8(...) __riscv_vfwcvt_f_xu_v_f32m8(__VA_ARGS__) +#define vfwcvt_f_f_v_f32mf2(...) __riscv_vfwcvt_f_f_v_f32mf2(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m1(...) __riscv_vfwcvt_f_f_v_f32m1(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m2(...) __riscv_vfwcvt_f_f_v_f32m2(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m4(...) __riscv_vfwcvt_f_f_v_f32m4(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m8(...) __riscv_vfwcvt_f_f_v_f32m8(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m1(...) __riscv_vfwcvt_x_f_v_i64m1(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m1(...) __riscv_vfwcvt_rtz_x_f_v_i64m1(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m2(...) __riscv_vfwcvt_x_f_v_i64m2(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m2(...) __riscv_vfwcvt_rtz_x_f_v_i64m2(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m4(...) __riscv_vfwcvt_x_f_v_i64m4(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m4(...) __riscv_vfwcvt_rtz_x_f_v_i64m4(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m8(...) __riscv_vfwcvt_x_f_v_i64m8(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m8(...) __riscv_vfwcvt_rtz_x_f_v_i64m8(__VA_ARGS__) +#define vwcvt_x_x_v_i64m1(...) __riscv_vwcvt_x_x_v_i64m1(__VA_ARGS__) +#define vwcvt_x_x_v_i64m2(...) __riscv_vwcvt_x_x_v_i64m2(__VA_ARGS__) +#define vwcvt_x_x_v_i64m4(...) __riscv_vwcvt_x_x_v_i64m4(__VA_ARGS__) +#define vwcvt_x_x_v_i64m8(...) __riscv_vwcvt_x_x_v_i64m8(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m1(...) __riscv_vwcvtu_x_x_v_u64m1(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m2(...) __riscv_vwcvtu_x_x_v_u64m2(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m4(...) __riscv_vwcvtu_x_x_v_u64m4(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m8(...) __riscv_vwcvtu_x_x_v_u64m8(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m1(...) __riscv_vfwcvt_xu_f_v_u64m1(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m1(...) __riscv_vfwcvt_rtz_xu_f_v_u64m1(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m2(...) __riscv_vfwcvt_xu_f_v_u64m2(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m2(...) __riscv_vfwcvt_rtz_xu_f_v_u64m2(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m4(...) __riscv_vfwcvt_xu_f_v_u64m4(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m4(...) __riscv_vfwcvt_rtz_xu_f_v_u64m4(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m8(...) __riscv_vfwcvt_xu_f_v_u64m8(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m8(...) __riscv_vfwcvt_rtz_xu_f_v_u64m8(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m1(...) __riscv_vfwcvt_f_x_v_f64m1(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m2(...) __riscv_vfwcvt_f_x_v_f64m2(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m4(...) __riscv_vfwcvt_f_x_v_f64m4(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m8(...) __riscv_vfwcvt_f_x_v_f64m8(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m1(...) __riscv_vfwcvt_f_xu_v_f64m1(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m2(...) __riscv_vfwcvt_f_xu_v_f64m2(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m4(...) __riscv_vfwcvt_f_xu_v_f64m4(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m8(...) __riscv_vfwcvt_f_xu_v_f64m8(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m1(...) __riscv_vfwcvt_f_f_v_f64m1(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m2(...) __riscv_vfwcvt_f_f_v_f64m2(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m4(...) __riscv_vfwcvt_f_f_v_f64m4(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m8(...) __riscv_vfwcvt_f_f_v_f64m8(__VA_ARGS__) +// masked functions +#define vwcvt_x_x_v_i16mf4_m(...) __riscv_vwcvt_x_x_v_i16mf4_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16mf2_m(...) __riscv_vwcvt_x_x_v_i16mf2_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16m1_m(...) __riscv_vwcvt_x_x_v_i16m1_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16m2_m(...) __riscv_vwcvt_x_x_v_i16m2_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16m4_m(...) __riscv_vwcvt_x_x_v_i16m4_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i16m8_m(...) __riscv_vwcvt_x_x_v_i16m8_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16mf4_m(...) __riscv_vwcvtu_x_x_v_u16mf4_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16mf2_m(...) __riscv_vwcvtu_x_x_v_u16mf2_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m1_m(...) __riscv_vwcvtu_x_x_v_u16m1_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m2_m(...) __riscv_vwcvtu_x_x_v_u16m2_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m4_m(...) __riscv_vwcvtu_x_x_v_u16m4_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u16m8_m(...) __riscv_vwcvtu_x_x_v_u16m8_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16mf4_m(...) __riscv_vfwcvt_f_x_v_f16mf4_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16mf2_m(...) __riscv_vfwcvt_f_x_v_f16mf2_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m1_m(...) __riscv_vfwcvt_f_x_v_f16m1_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m2_m(...) __riscv_vfwcvt_f_x_v_f16m2_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m4_m(...) __riscv_vfwcvt_f_x_v_f16m4_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f16m8_m(...) __riscv_vfwcvt_f_x_v_f16m8_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16mf4_m(...) __riscv_vfwcvt_f_xu_v_f16mf4_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16mf2_m(...) __riscv_vfwcvt_f_xu_v_f16mf2_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m1_m(...) __riscv_vfwcvt_f_xu_v_f16m1_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m2_m(...) __riscv_vfwcvt_f_xu_v_f16m2_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m4_m(...) __riscv_vfwcvt_f_xu_v_f16m4_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f16m8_m(...) __riscv_vfwcvt_f_xu_v_f16m8_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i32mf2_m(...) __riscv_vfwcvt_x_f_v_i32mf2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32mf2_m(...) __riscv_vfwcvt_rtz_x_f_v_i32mf2_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m1_m(...) __riscv_vfwcvt_x_f_v_i32m1_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m1_m(...) __riscv_vfwcvt_rtz_x_f_v_i32m1_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m2_m(...) __riscv_vfwcvt_x_f_v_i32m2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m2_m(...) __riscv_vfwcvt_rtz_x_f_v_i32m2_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m4_m(...) __riscv_vfwcvt_x_f_v_i32m4_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m4_m(...) __riscv_vfwcvt_rtz_x_f_v_i32m4_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i32m8_m(...) __riscv_vfwcvt_x_f_v_i32m8_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i32m8_m(...) __riscv_vfwcvt_rtz_x_f_v_i32m8_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i32mf2_m(...) __riscv_vwcvt_x_x_v_i32mf2_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i32m1_m(...) __riscv_vwcvt_x_x_v_i32m1_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i32m2_m(...) __riscv_vwcvt_x_x_v_i32m2_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i32m4_m(...) __riscv_vwcvt_x_x_v_i32m4_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i32m8_m(...) __riscv_vwcvt_x_x_v_i32m8_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u32mf2_m(...) __riscv_vwcvtu_x_x_v_u32mf2_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m1_m(...) __riscv_vwcvtu_x_x_v_u32m1_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m2_m(...) __riscv_vwcvtu_x_x_v_u32m2_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m4_m(...) __riscv_vwcvtu_x_x_v_u32m4_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u32m8_m(...) __riscv_vwcvtu_x_x_v_u32m8_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32mf2_m(...) __riscv_vfwcvt_xu_f_v_u32mf2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32mf2_m(...) __riscv_vfwcvt_rtz_xu_f_v_u32mf2_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m1_m(...) __riscv_vfwcvt_xu_f_v_u32m1_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m1_m(...) __riscv_vfwcvt_rtz_xu_f_v_u32m1_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m2_m(...) __riscv_vfwcvt_xu_f_v_u32m2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m2_m(...) __riscv_vfwcvt_rtz_xu_f_v_u32m2_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m4_m(...) __riscv_vfwcvt_xu_f_v_u32m4_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m4_m(...) __riscv_vfwcvt_rtz_xu_f_v_u32m4_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u32m8_m(...) __riscv_vfwcvt_xu_f_v_u32m8_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u32m8_m(...) __riscv_vfwcvt_rtz_xu_f_v_u32m8_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f32mf2_m(...) __riscv_vfwcvt_f_x_v_f32mf2_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m1_m(...) __riscv_vfwcvt_f_x_v_f32m1_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m2_m(...) __riscv_vfwcvt_f_x_v_f32m2_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m4_m(...) __riscv_vfwcvt_f_x_v_f32m4_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f32m8_m(...) __riscv_vfwcvt_f_x_v_f32m8_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32mf2_m(...) __riscv_vfwcvt_f_xu_v_f32mf2_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m1_m(...) __riscv_vfwcvt_f_xu_v_f32m1_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m2_m(...) __riscv_vfwcvt_f_xu_v_f32m2_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m4_m(...) __riscv_vfwcvt_f_xu_v_f32m4_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f32m8_m(...) __riscv_vfwcvt_f_xu_v_f32m8_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f32mf2_m(...) __riscv_vfwcvt_f_f_v_f32mf2_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m1_m(...) __riscv_vfwcvt_f_f_v_f32m1_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m2_m(...) __riscv_vfwcvt_f_f_v_f32m2_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m4_m(...) __riscv_vfwcvt_f_f_v_f32m4_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f32m8_m(...) __riscv_vfwcvt_f_f_v_f32m8_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m1_m(...) __riscv_vfwcvt_x_f_v_i64m1_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m1_m(...) __riscv_vfwcvt_rtz_x_f_v_i64m1_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m2_m(...) __riscv_vfwcvt_x_f_v_i64m2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m2_m(...) __riscv_vfwcvt_rtz_x_f_v_i64m2_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m4_m(...) __riscv_vfwcvt_x_f_v_i64m4_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m4_m(...) __riscv_vfwcvt_rtz_x_f_v_i64m4_tumu(__VA_ARGS__) +#define vfwcvt_x_f_v_i64m8_m(...) __riscv_vfwcvt_x_f_v_i64m8_tumu(__VA_ARGS__) +#define vfwcvt_rtz_x_f_v_i64m8_m(...) __riscv_vfwcvt_rtz_x_f_v_i64m8_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i64m1_m(...) __riscv_vwcvt_x_x_v_i64m1_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i64m2_m(...) __riscv_vwcvt_x_x_v_i64m2_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i64m4_m(...) __riscv_vwcvt_x_x_v_i64m4_tumu(__VA_ARGS__) +#define vwcvt_x_x_v_i64m8_m(...) __riscv_vwcvt_x_x_v_i64m8_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m1_m(...) __riscv_vwcvtu_x_x_v_u64m1_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m2_m(...) __riscv_vwcvtu_x_x_v_u64m2_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m4_m(...) __riscv_vwcvtu_x_x_v_u64m4_tumu(__VA_ARGS__) +#define vwcvtu_x_x_v_u64m8_m(...) __riscv_vwcvtu_x_x_v_u64m8_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m1_m(...) __riscv_vfwcvt_xu_f_v_u64m1_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m1_m(...) __riscv_vfwcvt_rtz_xu_f_v_u64m1_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m2_m(...) __riscv_vfwcvt_xu_f_v_u64m2_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m2_m(...) __riscv_vfwcvt_rtz_xu_f_v_u64m2_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m4_m(...) __riscv_vfwcvt_xu_f_v_u64m4_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m4_m(...) __riscv_vfwcvt_rtz_xu_f_v_u64m4_tumu(__VA_ARGS__) +#define vfwcvt_xu_f_v_u64m8_m(...) __riscv_vfwcvt_xu_f_v_u64m8_tumu(__VA_ARGS__) +#define vfwcvt_rtz_xu_f_v_u64m8_m(...) __riscv_vfwcvt_rtz_xu_f_v_u64m8_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m1_m(...) __riscv_vfwcvt_f_x_v_f64m1_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m2_m(...) __riscv_vfwcvt_f_x_v_f64m2_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m4_m(...) __riscv_vfwcvt_f_x_v_f64m4_tumu(__VA_ARGS__) +#define vfwcvt_f_x_v_f64m8_m(...) __riscv_vfwcvt_f_x_v_f64m8_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m1_m(...) __riscv_vfwcvt_f_xu_v_f64m1_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m2_m(...) __riscv_vfwcvt_f_xu_v_f64m2_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m4_m(...) __riscv_vfwcvt_f_xu_v_f64m4_tumu(__VA_ARGS__) +#define vfwcvt_f_xu_v_f64m8_m(...) __riscv_vfwcvt_f_xu_v_f64m8_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m1_m(...) __riscv_vfwcvt_f_f_v_f64m1_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m2_m(...) __riscv_vfwcvt_f_f_v_f64m2_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m4_m(...) __riscv_vfwcvt_f_f_v_f64m4_tumu(__VA_ARGS__) +#define vfwcvt_f_f_v_f64m8_m(...) __riscv_vfwcvt_f_f_v_f64m8_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8mf8(...) __riscv_vfncvt_x_f_w_i8mf8(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf8(...) __riscv_vfncvt_rtz_x_f_w_i8mf8(__VA_ARGS__) +#define vfncvt_x_f_w_i8mf4(...) __riscv_vfncvt_x_f_w_i8mf4(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf4(...) __riscv_vfncvt_rtz_x_f_w_i8mf4(__VA_ARGS__) +#define vfncvt_x_f_w_i8mf2(...) __riscv_vfncvt_x_f_w_i8mf2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf2(...) __riscv_vfncvt_rtz_x_f_w_i8mf2(__VA_ARGS__) +#define vfncvt_x_f_w_i8m1(...) __riscv_vfncvt_x_f_w_i8m1(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m1(...) __riscv_vfncvt_rtz_x_f_w_i8m1(__VA_ARGS__) +#define vfncvt_x_f_w_i8m2(...) __riscv_vfncvt_x_f_w_i8m2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m2(...) __riscv_vfncvt_rtz_x_f_w_i8m2(__VA_ARGS__) +#define vfncvt_x_f_w_i8m4(...) __riscv_vfncvt_x_f_w_i8m4(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m4(...) __riscv_vfncvt_rtz_x_f_w_i8m4(__VA_ARGS__) +#define vncvt_x_x_w_i8mf8(...) __riscv_vncvt_x_x_w_i8mf8(__VA_ARGS__) +#define vncvt_x_x_w_i8mf4(...) __riscv_vncvt_x_x_w_i8mf4(__VA_ARGS__) +#define vncvt_x_x_w_i8mf2(...) __riscv_vncvt_x_x_w_i8mf2(__VA_ARGS__) +#define vncvt_x_x_w_i8m1(...) __riscv_vncvt_x_x_w_i8m1(__VA_ARGS__) +#define vncvt_x_x_w_i8m2(...) __riscv_vncvt_x_x_w_i8m2(__VA_ARGS__) +#define vncvt_x_x_w_i8m4(...) __riscv_vncvt_x_x_w_i8m4(__VA_ARGS__) +#define vncvt_x_x_w_u8mf8(...) __riscv_vncvt_x_x_w_u8mf8(__VA_ARGS__) +#define vncvt_x_x_w_u8mf4(...) __riscv_vncvt_x_x_w_u8mf4(__VA_ARGS__) +#define vncvt_x_x_w_u8mf2(...) __riscv_vncvt_x_x_w_u8mf2(__VA_ARGS__) +#define vncvt_x_x_w_u8m1(...) __riscv_vncvt_x_x_w_u8m1(__VA_ARGS__) +#define vncvt_x_x_w_u8m2(...) __riscv_vncvt_x_x_w_u8m2(__VA_ARGS__) +#define vncvt_x_x_w_u8m4(...) __riscv_vncvt_x_x_w_u8m4(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf8(...) __riscv_vfncvt_xu_f_w_u8mf8(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf8(...) __riscv_vfncvt_rtz_xu_f_w_u8mf8(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf4(...) __riscv_vfncvt_xu_f_w_u8mf4(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf4(...) __riscv_vfncvt_rtz_xu_f_w_u8mf4(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf2(...) __riscv_vfncvt_xu_f_w_u8mf2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf2(...) __riscv_vfncvt_rtz_xu_f_w_u8mf2(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m1(...) __riscv_vfncvt_xu_f_w_u8m1(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m1(...) __riscv_vfncvt_rtz_xu_f_w_u8m1(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m2(...) __riscv_vfncvt_xu_f_w_u8m2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m2(...) __riscv_vfncvt_rtz_xu_f_w_u8m2(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m4(...) __riscv_vfncvt_xu_f_w_u8m4(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m4(...) __riscv_vfncvt_rtz_xu_f_w_u8m4(__VA_ARGS__) +#define vfncvt_x_f_w_i16mf4(...) __riscv_vfncvt_x_f_w_i16mf4(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16mf4(...) __riscv_vfncvt_rtz_x_f_w_i16mf4(__VA_ARGS__) +#define vfncvt_x_f_w_i16mf2(...) __riscv_vfncvt_x_f_w_i16mf2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16mf2(...) __riscv_vfncvt_rtz_x_f_w_i16mf2(__VA_ARGS__) +#define vfncvt_x_f_w_i16m1(...) __riscv_vfncvt_x_f_w_i16m1(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m1(...) __riscv_vfncvt_rtz_x_f_w_i16m1(__VA_ARGS__) +#define vfncvt_x_f_w_i16m2(...) __riscv_vfncvt_x_f_w_i16m2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m2(...) __riscv_vfncvt_rtz_x_f_w_i16m2(__VA_ARGS__) +#define vfncvt_x_f_w_i16m4(...) __riscv_vfncvt_x_f_w_i16m4(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m4(...) __riscv_vfncvt_rtz_x_f_w_i16m4(__VA_ARGS__) +#define vncvt_x_x_w_i16mf4(...) __riscv_vncvt_x_x_w_i16mf4(__VA_ARGS__) +#define vncvt_x_x_w_i16mf2(...) __riscv_vncvt_x_x_w_i16mf2(__VA_ARGS__) +#define vncvt_x_x_w_i16m1(...) __riscv_vncvt_x_x_w_i16m1(__VA_ARGS__) +#define vncvt_x_x_w_i16m2(...) __riscv_vncvt_x_x_w_i16m2(__VA_ARGS__) +#define vncvt_x_x_w_i16m4(...) __riscv_vncvt_x_x_w_i16m4(__VA_ARGS__) +#define vncvt_x_x_w_u16mf4(...) __riscv_vncvt_x_x_w_u16mf4(__VA_ARGS__) +#define vncvt_x_x_w_u16mf2(...) __riscv_vncvt_x_x_w_u16mf2(__VA_ARGS__) +#define vncvt_x_x_w_u16m1(...) __riscv_vncvt_x_x_w_u16m1(__VA_ARGS__) +#define vncvt_x_x_w_u16m2(...) __riscv_vncvt_x_x_w_u16m2(__VA_ARGS__) +#define vncvt_x_x_w_u16m4(...) __riscv_vncvt_x_x_w_u16m4(__VA_ARGS__) +#define vfncvt_xu_f_w_u16mf4(...) __riscv_vfncvt_xu_f_w_u16mf4(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16mf4(...) __riscv_vfncvt_rtz_xu_f_w_u16mf4(__VA_ARGS__) +#define vfncvt_xu_f_w_u16mf2(...) __riscv_vfncvt_xu_f_w_u16mf2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16mf2(...) __riscv_vfncvt_rtz_xu_f_w_u16mf2(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m1(...) __riscv_vfncvt_xu_f_w_u16m1(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m1(...) __riscv_vfncvt_rtz_xu_f_w_u16m1(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m2(...) __riscv_vfncvt_xu_f_w_u16m2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m2(...) __riscv_vfncvt_rtz_xu_f_w_u16m2(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m4(...) __riscv_vfncvt_xu_f_w_u16m4(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m4(...) __riscv_vfncvt_rtz_xu_f_w_u16m4(__VA_ARGS__) +#define vfncvt_f_x_w_f16mf4(...) __riscv_vfncvt_f_x_w_f16mf4(__VA_ARGS__) +#define vfncvt_f_x_w_f16mf2(...) __riscv_vfncvt_f_x_w_f16mf2(__VA_ARGS__) +#define vfncvt_f_x_w_f16m1(...) __riscv_vfncvt_f_x_w_f16m1(__VA_ARGS__) +#define vfncvt_f_x_w_f16m2(...) __riscv_vfncvt_f_x_w_f16m2(__VA_ARGS__) +#define vfncvt_f_x_w_f16m4(...) __riscv_vfncvt_f_x_w_f16m4(__VA_ARGS__) +#define vfncvt_f_xu_w_f16mf4(...) __riscv_vfncvt_f_xu_w_f16mf4(__VA_ARGS__) +#define vfncvt_f_xu_w_f16mf2(...) __riscv_vfncvt_f_xu_w_f16mf2(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m1(...) __riscv_vfncvt_f_xu_w_f16m1(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m2(...) __riscv_vfncvt_f_xu_w_f16m2(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m4(...) __riscv_vfncvt_f_xu_w_f16m4(__VA_ARGS__) +#define vfncvt_f_f_w_f16mf4(...) __riscv_vfncvt_f_f_w_f16mf4(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16mf4(...) __riscv_vfncvt_rod_f_f_w_f16mf4(__VA_ARGS__) +#define vfncvt_f_f_w_f16mf2(...) __riscv_vfncvt_f_f_w_f16mf2(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16mf2(...) __riscv_vfncvt_rod_f_f_w_f16mf2(__VA_ARGS__) +#define vfncvt_f_f_w_f16m1(...) __riscv_vfncvt_f_f_w_f16m1(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m1(...) __riscv_vfncvt_rod_f_f_w_f16m1(__VA_ARGS__) +#define vfncvt_f_f_w_f16m2(...) __riscv_vfncvt_f_f_w_f16m2(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m2(...) __riscv_vfncvt_rod_f_f_w_f16m2(__VA_ARGS__) +#define vfncvt_f_f_w_f16m4(...) __riscv_vfncvt_f_f_w_f16m4(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m4(...) __riscv_vfncvt_rod_f_f_w_f16m4(__VA_ARGS__) +#define vfncvt_x_f_w_i32mf2(...) __riscv_vfncvt_x_f_w_i32mf2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32mf2(...) __riscv_vfncvt_rtz_x_f_w_i32mf2(__VA_ARGS__) +#define vfncvt_x_f_w_i32m1(...) __riscv_vfncvt_x_f_w_i32m1(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m1(...) __riscv_vfncvt_rtz_x_f_w_i32m1(__VA_ARGS__) +#define vfncvt_x_f_w_i32m2(...) __riscv_vfncvt_x_f_w_i32m2(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m2(...) __riscv_vfncvt_rtz_x_f_w_i32m2(__VA_ARGS__) +#define vfncvt_x_f_w_i32m4(...) __riscv_vfncvt_x_f_w_i32m4(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m4(...) __riscv_vfncvt_rtz_x_f_w_i32m4(__VA_ARGS__) +#define vncvt_x_x_w_i32mf2(...) __riscv_vncvt_x_x_w_i32mf2(__VA_ARGS__) +#define vncvt_x_x_w_i32m1(...) __riscv_vncvt_x_x_w_i32m1(__VA_ARGS__) +#define vncvt_x_x_w_i32m2(...) __riscv_vncvt_x_x_w_i32m2(__VA_ARGS__) +#define vncvt_x_x_w_i32m4(...) __riscv_vncvt_x_x_w_i32m4(__VA_ARGS__) +#define vncvt_x_x_w_u32mf2(...) __riscv_vncvt_x_x_w_u32mf2(__VA_ARGS__) +#define vncvt_x_x_w_u32m1(...) __riscv_vncvt_x_x_w_u32m1(__VA_ARGS__) +#define vncvt_x_x_w_u32m2(...) __riscv_vncvt_x_x_w_u32m2(__VA_ARGS__) +#define vncvt_x_x_w_u32m4(...) __riscv_vncvt_x_x_w_u32m4(__VA_ARGS__) +#define vfncvt_xu_f_w_u32mf2(...) __riscv_vfncvt_xu_f_w_u32mf2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32mf2(...) __riscv_vfncvt_rtz_xu_f_w_u32mf2(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m1(...) __riscv_vfncvt_xu_f_w_u32m1(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m1(...) __riscv_vfncvt_rtz_xu_f_w_u32m1(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m2(...) __riscv_vfncvt_xu_f_w_u32m2(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m2(...) __riscv_vfncvt_rtz_xu_f_w_u32m2(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m4(...) __riscv_vfncvt_xu_f_w_u32m4(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m4(...) __riscv_vfncvt_rtz_xu_f_w_u32m4(__VA_ARGS__) +#define vfncvt_f_x_w_f32mf2(...) __riscv_vfncvt_f_x_w_f32mf2(__VA_ARGS__) +#define vfncvt_f_x_w_f32m1(...) __riscv_vfncvt_f_x_w_f32m1(__VA_ARGS__) +#define vfncvt_f_x_w_f32m2(...) __riscv_vfncvt_f_x_w_f32m2(__VA_ARGS__) +#define vfncvt_f_x_w_f32m4(...) __riscv_vfncvt_f_x_w_f32m4(__VA_ARGS__) +#define vfncvt_f_xu_w_f32mf2(...) __riscv_vfncvt_f_xu_w_f32mf2(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m1(...) __riscv_vfncvt_f_xu_w_f32m1(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m2(...) __riscv_vfncvt_f_xu_w_f32m2(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m4(...) __riscv_vfncvt_f_xu_w_f32m4(__VA_ARGS__) +#define vfncvt_f_f_w_f32mf2(...) __riscv_vfncvt_f_f_w_f32mf2(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32mf2(...) __riscv_vfncvt_rod_f_f_w_f32mf2(__VA_ARGS__) +#define vfncvt_f_f_w_f32m1(...) __riscv_vfncvt_f_f_w_f32m1(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m1(...) __riscv_vfncvt_rod_f_f_w_f32m1(__VA_ARGS__) +#define vfncvt_f_f_w_f32m2(...) __riscv_vfncvt_f_f_w_f32m2(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m2(...) __riscv_vfncvt_rod_f_f_w_f32m2(__VA_ARGS__) +#define vfncvt_f_f_w_f32m4(...) __riscv_vfncvt_f_f_w_f32m4(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m4(...) __riscv_vfncvt_rod_f_f_w_f32m4(__VA_ARGS__) +// masked functions +#define vfncvt_x_f_w_i8mf8_m(...) __riscv_vfncvt_x_f_w_i8mf8_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf8_m(...) __riscv_vfncvt_rtz_x_f_w_i8mf8_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8mf4_m(...) __riscv_vfncvt_x_f_w_i8mf4_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf4_m(...) __riscv_vfncvt_rtz_x_f_w_i8mf4_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8mf2_m(...) __riscv_vfncvt_x_f_w_i8mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8mf2_m(...) __riscv_vfncvt_rtz_x_f_w_i8mf2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8m1_m(...) __riscv_vfncvt_x_f_w_i8m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m1_m(...) __riscv_vfncvt_rtz_x_f_w_i8m1_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8m2_m(...) __riscv_vfncvt_x_f_w_i8m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m2_m(...) __riscv_vfncvt_rtz_x_f_w_i8m2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i8m4_m(...) __riscv_vfncvt_x_f_w_i8m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i8m4_m(...) __riscv_vfncvt_rtz_x_f_w_i8m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8mf8_m(...) __riscv_vncvt_x_x_w_i8mf8_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8mf4_m(...) __riscv_vncvt_x_x_w_i8mf4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8mf2_m(...) __riscv_vncvt_x_x_w_i8mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8m1_m(...) __riscv_vncvt_x_x_w_i8m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8m2_m(...) __riscv_vncvt_x_x_w_i8m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i8m4_m(...) __riscv_vncvt_x_x_w_i8m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8mf8_m(...) __riscv_vncvt_x_x_w_u8mf8_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8mf4_m(...) __riscv_vncvt_x_x_w_u8mf4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8mf2_m(...) __riscv_vncvt_x_x_w_u8mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8m1_m(...) __riscv_vncvt_x_x_w_u8m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8m2_m(...) __riscv_vncvt_x_x_w_u8m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u8m4_m(...) __riscv_vncvt_x_x_w_u8m4_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf8_m(...) __riscv_vfncvt_xu_f_w_u8mf8_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf8_m(...) __riscv_vfncvt_rtz_xu_f_w_u8mf8_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf4_m(...) __riscv_vfncvt_xu_f_w_u8mf4_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf4_m(...) __riscv_vfncvt_rtz_xu_f_w_u8mf4_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8mf2_m(...) __riscv_vfncvt_xu_f_w_u8mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8mf2_m(...) __riscv_vfncvt_rtz_xu_f_w_u8mf2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m1_m(...) __riscv_vfncvt_xu_f_w_u8m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m1_m(...) __riscv_vfncvt_rtz_xu_f_w_u8m1_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m2_m(...) __riscv_vfncvt_xu_f_w_u8m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m2_m(...) __riscv_vfncvt_rtz_xu_f_w_u8m2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u8m4_m(...) __riscv_vfncvt_xu_f_w_u8m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u8m4_m(...) __riscv_vfncvt_rtz_xu_f_w_u8m4_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i16mf4_m(...) __riscv_vfncvt_x_f_w_i16mf4_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16mf4_m(...) __riscv_vfncvt_rtz_x_f_w_i16mf4_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i16mf2_m(...) __riscv_vfncvt_x_f_w_i16mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16mf2_m(...) __riscv_vfncvt_rtz_x_f_w_i16mf2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i16m1_m(...) __riscv_vfncvt_x_f_w_i16m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m1_m(...) __riscv_vfncvt_rtz_x_f_w_i16m1_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i16m2_m(...) __riscv_vfncvt_x_f_w_i16m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m2_m(...) __riscv_vfncvt_rtz_x_f_w_i16m2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i16m4_m(...) __riscv_vfncvt_x_f_w_i16m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i16m4_m(...) __riscv_vfncvt_rtz_x_f_w_i16m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i16mf4_m(...) __riscv_vncvt_x_x_w_i16mf4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i16mf2_m(...) __riscv_vncvt_x_x_w_i16mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i16m1_m(...) __riscv_vncvt_x_x_w_i16m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i16m2_m(...) __riscv_vncvt_x_x_w_i16m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i16m4_m(...) __riscv_vncvt_x_x_w_i16m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u16mf4_m(...) __riscv_vncvt_x_x_w_u16mf4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u16mf2_m(...) __riscv_vncvt_x_x_w_u16mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u16m1_m(...) __riscv_vncvt_x_x_w_u16m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u16m2_m(...) __riscv_vncvt_x_x_w_u16m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u16m4_m(...) __riscv_vncvt_x_x_w_u16m4_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u16mf4_m(...) __riscv_vfncvt_xu_f_w_u16mf4_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16mf4_m(...) __riscv_vfncvt_rtz_xu_f_w_u16mf4_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u16mf2_m(...) __riscv_vfncvt_xu_f_w_u16mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16mf2_m(...) __riscv_vfncvt_rtz_xu_f_w_u16mf2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m1_m(...) __riscv_vfncvt_xu_f_w_u16m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m1_m(...) __riscv_vfncvt_rtz_xu_f_w_u16m1_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m2_m(...) __riscv_vfncvt_xu_f_w_u16m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m2_m(...) __riscv_vfncvt_rtz_xu_f_w_u16m2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u16m4_m(...) __riscv_vfncvt_xu_f_w_u16m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u16m4_m(...) __riscv_vfncvt_rtz_xu_f_w_u16m4_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f16mf4_m(...) __riscv_vfncvt_f_x_w_f16mf4_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f16mf2_m(...) __riscv_vfncvt_f_x_w_f16mf2_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f16m1_m(...) __riscv_vfncvt_f_x_w_f16m1_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f16m2_m(...) __riscv_vfncvt_f_x_w_f16m2_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f16m4_m(...) __riscv_vfncvt_f_x_w_f16m4_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f16mf4_m(...) __riscv_vfncvt_f_xu_w_f16mf4_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f16mf2_m(...) __riscv_vfncvt_f_xu_w_f16mf2_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m1_m(...) __riscv_vfncvt_f_xu_w_f16m1_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m2_m(...) __riscv_vfncvt_f_xu_w_f16m2_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f16m4_m(...) __riscv_vfncvt_f_xu_w_f16m4_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f16mf4_m(...) __riscv_vfncvt_f_f_w_f16mf4_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16mf4_m(...) __riscv_vfncvt_rod_f_f_w_f16mf4_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f16mf2_m(...) __riscv_vfncvt_f_f_w_f16mf2_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16mf2_m(...) __riscv_vfncvt_rod_f_f_w_f16mf2_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f16m1_m(...) __riscv_vfncvt_f_f_w_f16m1_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m1_m(...) __riscv_vfncvt_rod_f_f_w_f16m1_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f16m2_m(...) __riscv_vfncvt_f_f_w_f16m2_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m2_m(...) __riscv_vfncvt_rod_f_f_w_f16m2_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f16m4_m(...) __riscv_vfncvt_f_f_w_f16m4_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f16m4_m(...) __riscv_vfncvt_rod_f_f_w_f16m4_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i32mf2_m(...) __riscv_vfncvt_x_f_w_i32mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32mf2_m(...) __riscv_vfncvt_rtz_x_f_w_i32mf2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i32m1_m(...) __riscv_vfncvt_x_f_w_i32m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m1_m(...) __riscv_vfncvt_rtz_x_f_w_i32m1_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i32m2_m(...) __riscv_vfncvt_x_f_w_i32m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m2_m(...) __riscv_vfncvt_rtz_x_f_w_i32m2_tumu(__VA_ARGS__) +#define vfncvt_x_f_w_i32m4_m(...) __riscv_vfncvt_x_f_w_i32m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_x_f_w_i32m4_m(...) __riscv_vfncvt_rtz_x_f_w_i32m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i32mf2_m(...) __riscv_vncvt_x_x_w_i32mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i32m1_m(...) __riscv_vncvt_x_x_w_i32m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i32m2_m(...) __riscv_vncvt_x_x_w_i32m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_i32m4_m(...) __riscv_vncvt_x_x_w_i32m4_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u32mf2_m(...) __riscv_vncvt_x_x_w_u32mf2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u32m1_m(...) __riscv_vncvt_x_x_w_u32m1_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u32m2_m(...) __riscv_vncvt_x_x_w_u32m2_tumu(__VA_ARGS__) +#define vncvt_x_x_w_u32m4_m(...) __riscv_vncvt_x_x_w_u32m4_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u32mf2_m(...) __riscv_vfncvt_xu_f_w_u32mf2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32mf2_m(...) __riscv_vfncvt_rtz_xu_f_w_u32mf2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m1_m(...) __riscv_vfncvt_xu_f_w_u32m1_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m1_m(...) __riscv_vfncvt_rtz_xu_f_w_u32m1_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m2_m(...) __riscv_vfncvt_xu_f_w_u32m2_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m2_m(...) __riscv_vfncvt_rtz_xu_f_w_u32m2_tumu(__VA_ARGS__) +#define vfncvt_xu_f_w_u32m4_m(...) __riscv_vfncvt_xu_f_w_u32m4_tumu(__VA_ARGS__) +#define vfncvt_rtz_xu_f_w_u32m4_m(...) __riscv_vfncvt_rtz_xu_f_w_u32m4_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f32mf2_m(...) __riscv_vfncvt_f_x_w_f32mf2_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f32m1_m(...) __riscv_vfncvt_f_x_w_f32m1_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f32m2_m(...) __riscv_vfncvt_f_x_w_f32m2_tumu(__VA_ARGS__) +#define vfncvt_f_x_w_f32m4_m(...) __riscv_vfncvt_f_x_w_f32m4_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f32mf2_m(...) __riscv_vfncvt_f_xu_w_f32mf2_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m1_m(...) __riscv_vfncvt_f_xu_w_f32m1_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m2_m(...) __riscv_vfncvt_f_xu_w_f32m2_tumu(__VA_ARGS__) +#define vfncvt_f_xu_w_f32m4_m(...) __riscv_vfncvt_f_xu_w_f32m4_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f32mf2_m(...) __riscv_vfncvt_f_f_w_f32mf2_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32mf2_m(...) __riscv_vfncvt_rod_f_f_w_f32mf2_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f32m1_m(...) __riscv_vfncvt_f_f_w_f32m1_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m1_m(...) __riscv_vfncvt_rod_f_f_w_f32m1_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f32m2_m(...) __riscv_vfncvt_f_f_w_f32m2_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m2_m(...) __riscv_vfncvt_rod_f_f_w_f32m2_tumu(__VA_ARGS__) +#define vfncvt_f_f_w_f32m4_m(...) __riscv_vfncvt_f_f_w_f32m4_tumu(__VA_ARGS__) +#define vfncvt_rod_f_f_w_f32m4_m(...) __riscv_vfncvt_rod_f_f_w_f32m4_tumu(__VA_ARGS__) +#define vredsum_vs_i8mf8_i8m1(...) __riscv_vredsum_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8mf4_i8m1(...) __riscv_vredsum_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8mf2_i8m1(...) __riscv_vredsum_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8m1_i8m1(...) __riscv_vredsum_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8m2_i8m1(...) __riscv_vredsum_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8m4_i8m1(...) __riscv_vredsum_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i8m8_i8m1(...) __riscv_vredsum_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredsum_vs_i16mf4_i16m1(...) __riscv_vredsum_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i16mf2_i16m1(...) __riscv_vredsum_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i16m1_i16m1(...) __riscv_vredsum_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i16m2_i16m1(...) __riscv_vredsum_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i16m4_i16m1(...) __riscv_vredsum_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i16m8_i16m1(...) __riscv_vredsum_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredsum_vs_i32mf2_i32m1(...) __riscv_vredsum_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredsum_vs_i32m1_i32m1(...) __riscv_vredsum_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredsum_vs_i32m2_i32m1(...) __riscv_vredsum_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredsum_vs_i32m4_i32m1(...) __riscv_vredsum_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredsum_vs_i32m8_i32m1(...) __riscv_vredsum_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredsum_vs_i64m1_i64m1(...) __riscv_vredsum_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredsum_vs_i64m2_i64m1(...) __riscv_vredsum_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredsum_vs_i64m4_i64m1(...) __riscv_vredsum_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredsum_vs_i64m8_i64m1(...) __riscv_vredsum_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredmax_vs_i8mf8_i8m1(...) __riscv_vredmax_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8mf4_i8m1(...) __riscv_vredmax_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8mf2_i8m1(...) __riscv_vredmax_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8m1_i8m1(...) __riscv_vredmax_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8m2_i8m1(...) __riscv_vredmax_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8m4_i8m1(...) __riscv_vredmax_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i8m8_i8m1(...) __riscv_vredmax_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredmax_vs_i16mf4_i16m1(...) __riscv_vredmax_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i16mf2_i16m1(...) __riscv_vredmax_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i16m1_i16m1(...) __riscv_vredmax_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i16m2_i16m1(...) __riscv_vredmax_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i16m4_i16m1(...) __riscv_vredmax_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i16m8_i16m1(...) __riscv_vredmax_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredmax_vs_i32mf2_i32m1(...) __riscv_vredmax_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredmax_vs_i32m1_i32m1(...) __riscv_vredmax_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredmax_vs_i32m2_i32m1(...) __riscv_vredmax_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredmax_vs_i32m4_i32m1(...) __riscv_vredmax_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredmax_vs_i32m8_i32m1(...) __riscv_vredmax_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredmax_vs_i64m1_i64m1(...) __riscv_vredmax_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredmax_vs_i64m2_i64m1(...) __riscv_vredmax_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredmax_vs_i64m4_i64m1(...) __riscv_vredmax_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredmax_vs_i64m8_i64m1(...) __riscv_vredmax_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredmin_vs_i8mf8_i8m1(...) __riscv_vredmin_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8mf4_i8m1(...) __riscv_vredmin_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8mf2_i8m1(...) __riscv_vredmin_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8m1_i8m1(...) __riscv_vredmin_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8m2_i8m1(...) __riscv_vredmin_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8m4_i8m1(...) __riscv_vredmin_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i8m8_i8m1(...) __riscv_vredmin_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredmin_vs_i16mf4_i16m1(...) __riscv_vredmin_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i16mf2_i16m1(...) __riscv_vredmin_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i16m1_i16m1(...) __riscv_vredmin_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i16m2_i16m1(...) __riscv_vredmin_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i16m4_i16m1(...) __riscv_vredmin_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i16m8_i16m1(...) __riscv_vredmin_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredmin_vs_i32mf2_i32m1(...) __riscv_vredmin_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredmin_vs_i32m1_i32m1(...) __riscv_vredmin_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredmin_vs_i32m2_i32m1(...) __riscv_vredmin_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredmin_vs_i32m4_i32m1(...) __riscv_vredmin_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredmin_vs_i32m8_i32m1(...) __riscv_vredmin_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredmin_vs_i64m1_i64m1(...) __riscv_vredmin_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredmin_vs_i64m2_i64m1(...) __riscv_vredmin_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredmin_vs_i64m4_i64m1(...) __riscv_vredmin_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredmin_vs_i64m8_i64m1(...) __riscv_vredmin_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredand_vs_i8mf8_i8m1(...) __riscv_vredand_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8mf4_i8m1(...) __riscv_vredand_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8mf2_i8m1(...) __riscv_vredand_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8m1_i8m1(...) __riscv_vredand_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8m2_i8m1(...) __riscv_vredand_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8m4_i8m1(...) __riscv_vredand_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i8m8_i8m1(...) __riscv_vredand_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredand_vs_i16mf4_i16m1(...) __riscv_vredand_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i16mf2_i16m1(...) __riscv_vredand_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i16m1_i16m1(...) __riscv_vredand_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i16m2_i16m1(...) __riscv_vredand_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i16m4_i16m1(...) __riscv_vredand_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i16m8_i16m1(...) __riscv_vredand_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredand_vs_i32mf2_i32m1(...) __riscv_vredand_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredand_vs_i32m1_i32m1(...) __riscv_vredand_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredand_vs_i32m2_i32m1(...) __riscv_vredand_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredand_vs_i32m4_i32m1(...) __riscv_vredand_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredand_vs_i32m8_i32m1(...) __riscv_vredand_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredand_vs_i64m1_i64m1(...) __riscv_vredand_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredand_vs_i64m2_i64m1(...) __riscv_vredand_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredand_vs_i64m4_i64m1(...) __riscv_vredand_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredand_vs_i64m8_i64m1(...) __riscv_vredand_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredor_vs_i8mf8_i8m1(...) __riscv_vredor_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8mf4_i8m1(...) __riscv_vredor_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8mf2_i8m1(...) __riscv_vredor_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8m1_i8m1(...) __riscv_vredor_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8m2_i8m1(...) __riscv_vredor_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8m4_i8m1(...) __riscv_vredor_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i8m8_i8m1(...) __riscv_vredor_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredor_vs_i16mf4_i16m1(...) __riscv_vredor_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i16mf2_i16m1(...) __riscv_vredor_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i16m1_i16m1(...) __riscv_vredor_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i16m2_i16m1(...) __riscv_vredor_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i16m4_i16m1(...) __riscv_vredor_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i16m8_i16m1(...) __riscv_vredor_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredor_vs_i32mf2_i32m1(...) __riscv_vredor_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredor_vs_i32m1_i32m1(...) __riscv_vredor_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredor_vs_i32m2_i32m1(...) __riscv_vredor_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredor_vs_i32m4_i32m1(...) __riscv_vredor_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredor_vs_i32m8_i32m1(...) __riscv_vredor_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredor_vs_i64m1_i64m1(...) __riscv_vredor_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredor_vs_i64m2_i64m1(...) __riscv_vredor_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredor_vs_i64m4_i64m1(...) __riscv_vredor_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredor_vs_i64m8_i64m1(...) __riscv_vredor_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredxor_vs_i8mf8_i8m1(...) __riscv_vredxor_vs_i8mf8_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8mf4_i8m1(...) __riscv_vredxor_vs_i8mf4_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8mf2_i8m1(...) __riscv_vredxor_vs_i8mf2_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8m1_i8m1(...) __riscv_vredxor_vs_i8m1_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8m2_i8m1(...) __riscv_vredxor_vs_i8m2_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8m4_i8m1(...) __riscv_vredxor_vs_i8m4_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i8m8_i8m1(...) __riscv_vredxor_vs_i8m8_i8m1_tu(__VA_ARGS__) +#define vredxor_vs_i16mf4_i16m1(...) __riscv_vredxor_vs_i16mf4_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i16mf2_i16m1(...) __riscv_vredxor_vs_i16mf2_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i16m1_i16m1(...) __riscv_vredxor_vs_i16m1_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i16m2_i16m1(...) __riscv_vredxor_vs_i16m2_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i16m4_i16m1(...) __riscv_vredxor_vs_i16m4_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i16m8_i16m1(...) __riscv_vredxor_vs_i16m8_i16m1_tu(__VA_ARGS__) +#define vredxor_vs_i32mf2_i32m1(...) __riscv_vredxor_vs_i32mf2_i32m1_tu(__VA_ARGS__) +#define vredxor_vs_i32m1_i32m1(...) __riscv_vredxor_vs_i32m1_i32m1_tu(__VA_ARGS__) +#define vredxor_vs_i32m2_i32m1(...) __riscv_vredxor_vs_i32m2_i32m1_tu(__VA_ARGS__) +#define vredxor_vs_i32m4_i32m1(...) __riscv_vredxor_vs_i32m4_i32m1_tu(__VA_ARGS__) +#define vredxor_vs_i32m8_i32m1(...) __riscv_vredxor_vs_i32m8_i32m1_tu(__VA_ARGS__) +#define vredxor_vs_i64m1_i64m1(...) __riscv_vredxor_vs_i64m1_i64m1_tu(__VA_ARGS__) +#define vredxor_vs_i64m2_i64m1(...) __riscv_vredxor_vs_i64m2_i64m1_tu(__VA_ARGS__) +#define vredxor_vs_i64m4_i64m1(...) __riscv_vredxor_vs_i64m4_i64m1_tu(__VA_ARGS__) +#define vredxor_vs_i64m8_i64m1(...) __riscv_vredxor_vs_i64m8_i64m1_tu(__VA_ARGS__) +#define vredsum_vs_u8mf8_u8m1(...) __riscv_vredsum_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8mf4_u8m1(...) __riscv_vredsum_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8mf2_u8m1(...) __riscv_vredsum_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8m1_u8m1(...) __riscv_vredsum_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8m2_u8m1(...) __riscv_vredsum_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8m4_u8m1(...) __riscv_vredsum_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u8m8_u8m1(...) __riscv_vredsum_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredsum_vs_u16mf4_u16m1(...) __riscv_vredsum_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u16mf2_u16m1(...) __riscv_vredsum_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u16m1_u16m1(...) __riscv_vredsum_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u16m2_u16m1(...) __riscv_vredsum_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u16m4_u16m1(...) __riscv_vredsum_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u16m8_u16m1(...) __riscv_vredsum_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredsum_vs_u32mf2_u32m1(...) __riscv_vredsum_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredsum_vs_u32m1_u32m1(...) __riscv_vredsum_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredsum_vs_u32m2_u32m1(...) __riscv_vredsum_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredsum_vs_u32m4_u32m1(...) __riscv_vredsum_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredsum_vs_u32m8_u32m1(...) __riscv_vredsum_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredsum_vs_u64m1_u64m1(...) __riscv_vredsum_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredsum_vs_u64m2_u64m1(...) __riscv_vredsum_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredsum_vs_u64m4_u64m1(...) __riscv_vredsum_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredsum_vs_u64m8_u64m1(...) __riscv_vredsum_vs_u64m8_u64m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8mf8_u8m1(...) __riscv_vredmaxu_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8mf4_u8m1(...) __riscv_vredmaxu_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8mf2_u8m1(...) __riscv_vredmaxu_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8m1_u8m1(...) __riscv_vredmaxu_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8m2_u8m1(...) __riscv_vredmaxu_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8m4_u8m1(...) __riscv_vredmaxu_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u8m8_u8m1(...) __riscv_vredmaxu_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16mf4_u16m1(...) __riscv_vredmaxu_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16mf2_u16m1(...) __riscv_vredmaxu_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16m1_u16m1(...) __riscv_vredmaxu_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16m2_u16m1(...) __riscv_vredmaxu_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16m4_u16m1(...) __riscv_vredmaxu_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u16m8_u16m1(...) __riscv_vredmaxu_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u32mf2_u32m1(...) __riscv_vredmaxu_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u32m1_u32m1(...) __riscv_vredmaxu_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u32m2_u32m1(...) __riscv_vredmaxu_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u32m4_u32m1(...) __riscv_vredmaxu_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u32m8_u32m1(...) __riscv_vredmaxu_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u64m1_u64m1(...) __riscv_vredmaxu_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u64m2_u64m1(...) __riscv_vredmaxu_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u64m4_u64m1(...) __riscv_vredmaxu_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredmaxu_vs_u64m8_u64m1(...) __riscv_vredmaxu_vs_u64m8_u64m1_tu(__VA_ARGS__) +#define vredminu_vs_u8mf8_u8m1(...) __riscv_vredminu_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8mf4_u8m1(...) __riscv_vredminu_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8mf2_u8m1(...) __riscv_vredminu_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8m1_u8m1(...) __riscv_vredminu_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8m2_u8m1(...) __riscv_vredminu_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8m4_u8m1(...) __riscv_vredminu_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u8m8_u8m1(...) __riscv_vredminu_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredminu_vs_u16mf4_u16m1(...) __riscv_vredminu_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u16mf2_u16m1(...) __riscv_vredminu_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u16m1_u16m1(...) __riscv_vredminu_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u16m2_u16m1(...) __riscv_vredminu_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u16m4_u16m1(...) __riscv_vredminu_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u16m8_u16m1(...) __riscv_vredminu_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredminu_vs_u32mf2_u32m1(...) __riscv_vredminu_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredminu_vs_u32m1_u32m1(...) __riscv_vredminu_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredminu_vs_u32m2_u32m1(...) __riscv_vredminu_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredminu_vs_u32m4_u32m1(...) __riscv_vredminu_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredminu_vs_u32m8_u32m1(...) __riscv_vredminu_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredminu_vs_u64m1_u64m1(...) __riscv_vredminu_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredminu_vs_u64m2_u64m1(...) __riscv_vredminu_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredminu_vs_u64m4_u64m1(...) __riscv_vredminu_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredminu_vs_u64m8_u64m1(...) __riscv_vredminu_vs_u64m8_u64m1_tu(__VA_ARGS__) +#define vredand_vs_u8mf8_u8m1(...) __riscv_vredand_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8mf4_u8m1(...) __riscv_vredand_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8mf2_u8m1(...) __riscv_vredand_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8m1_u8m1(...) __riscv_vredand_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8m2_u8m1(...) __riscv_vredand_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8m4_u8m1(...) __riscv_vredand_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u8m8_u8m1(...) __riscv_vredand_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredand_vs_u16mf4_u16m1(...) __riscv_vredand_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u16mf2_u16m1(...) __riscv_vredand_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u16m1_u16m1(...) __riscv_vredand_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u16m2_u16m1(...) __riscv_vredand_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u16m4_u16m1(...) __riscv_vredand_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u16m8_u16m1(...) __riscv_vredand_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredand_vs_u32mf2_u32m1(...) __riscv_vredand_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredand_vs_u32m1_u32m1(...) __riscv_vredand_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredand_vs_u32m2_u32m1(...) __riscv_vredand_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredand_vs_u32m4_u32m1(...) __riscv_vredand_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredand_vs_u32m8_u32m1(...) __riscv_vredand_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredand_vs_u64m1_u64m1(...) __riscv_vredand_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredand_vs_u64m2_u64m1(...) __riscv_vredand_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredand_vs_u64m4_u64m1(...) __riscv_vredand_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredand_vs_u64m8_u64m1(...) __riscv_vredand_vs_u64m8_u64m1_tu(__VA_ARGS__) +#define vredor_vs_u8mf8_u8m1(...) __riscv_vredor_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8mf4_u8m1(...) __riscv_vredor_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8mf2_u8m1(...) __riscv_vredor_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8m1_u8m1(...) __riscv_vredor_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8m2_u8m1(...) __riscv_vredor_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8m4_u8m1(...) __riscv_vredor_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u8m8_u8m1(...) __riscv_vredor_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredor_vs_u16mf4_u16m1(...) __riscv_vredor_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u16mf2_u16m1(...) __riscv_vredor_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u16m1_u16m1(...) __riscv_vredor_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u16m2_u16m1(...) __riscv_vredor_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u16m4_u16m1(...) __riscv_vredor_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u16m8_u16m1(...) __riscv_vredor_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredor_vs_u32mf2_u32m1(...) __riscv_vredor_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredor_vs_u32m1_u32m1(...) __riscv_vredor_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredor_vs_u32m2_u32m1(...) __riscv_vredor_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredor_vs_u32m4_u32m1(...) __riscv_vredor_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredor_vs_u32m8_u32m1(...) __riscv_vredor_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredor_vs_u64m1_u64m1(...) __riscv_vredor_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredor_vs_u64m2_u64m1(...) __riscv_vredor_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredor_vs_u64m4_u64m1(...) __riscv_vredor_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredor_vs_u64m8_u64m1(...) __riscv_vredor_vs_u64m8_u64m1_tu(__VA_ARGS__) +#define vredxor_vs_u8mf8_u8m1(...) __riscv_vredxor_vs_u8mf8_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8mf4_u8m1(...) __riscv_vredxor_vs_u8mf4_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8mf2_u8m1(...) __riscv_vredxor_vs_u8mf2_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8m1_u8m1(...) __riscv_vredxor_vs_u8m1_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8m2_u8m1(...) __riscv_vredxor_vs_u8m2_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8m4_u8m1(...) __riscv_vredxor_vs_u8m4_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u8m8_u8m1(...) __riscv_vredxor_vs_u8m8_u8m1_tu(__VA_ARGS__) +#define vredxor_vs_u16mf4_u16m1(...) __riscv_vredxor_vs_u16mf4_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u16mf2_u16m1(...) __riscv_vredxor_vs_u16mf2_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u16m1_u16m1(...) __riscv_vredxor_vs_u16m1_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u16m2_u16m1(...) __riscv_vredxor_vs_u16m2_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u16m4_u16m1(...) __riscv_vredxor_vs_u16m4_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u16m8_u16m1(...) __riscv_vredxor_vs_u16m8_u16m1_tu(__VA_ARGS__) +#define vredxor_vs_u32mf2_u32m1(...) __riscv_vredxor_vs_u32mf2_u32m1_tu(__VA_ARGS__) +#define vredxor_vs_u32m1_u32m1(...) __riscv_vredxor_vs_u32m1_u32m1_tu(__VA_ARGS__) +#define vredxor_vs_u32m2_u32m1(...) __riscv_vredxor_vs_u32m2_u32m1_tu(__VA_ARGS__) +#define vredxor_vs_u32m4_u32m1(...) __riscv_vredxor_vs_u32m4_u32m1_tu(__VA_ARGS__) +#define vredxor_vs_u32m8_u32m1(...) __riscv_vredxor_vs_u32m8_u32m1_tu(__VA_ARGS__) +#define vredxor_vs_u64m1_u64m1(...) __riscv_vredxor_vs_u64m1_u64m1_tu(__VA_ARGS__) +#define vredxor_vs_u64m2_u64m1(...) __riscv_vredxor_vs_u64m2_u64m1_tu(__VA_ARGS__) +#define vredxor_vs_u64m4_u64m1(...) __riscv_vredxor_vs_u64m4_u64m1_tu(__VA_ARGS__) +#define vredxor_vs_u64m8_u64m1(...) __riscv_vredxor_vs_u64m8_u64m1_tu(__VA_ARGS__) +// masked functions +#define vredsum_vs_i8mf8_i8m1_m(...) __riscv_vredsum_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8mf4_i8m1_m(...) __riscv_vredsum_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8mf2_i8m1_m(...) __riscv_vredsum_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8m1_i8m1_m(...) __riscv_vredsum_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8m2_i8m1_m(...) __riscv_vredsum_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8m4_i8m1_m(...) __riscv_vredsum_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i8m8_i8m1_m(...) __riscv_vredsum_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredsum_vs_i16mf4_i16m1_m(...) __riscv_vredsum_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i16mf2_i16m1_m(...) __riscv_vredsum_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i16m1_i16m1_m(...) __riscv_vredsum_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i16m2_i16m1_m(...) __riscv_vredsum_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i16m4_i16m1_m(...) __riscv_vredsum_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i16m8_i16m1_m(...) __riscv_vredsum_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredsum_vs_i32mf2_i32m1_m(...) __riscv_vredsum_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredsum_vs_i32m1_i32m1_m(...) __riscv_vredsum_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredsum_vs_i32m2_i32m1_m(...) __riscv_vredsum_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredsum_vs_i32m4_i32m1_m(...) __riscv_vredsum_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredsum_vs_i32m8_i32m1_m(...) __riscv_vredsum_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredsum_vs_i64m1_i64m1_m(...) __riscv_vredsum_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredsum_vs_i64m2_i64m1_m(...) __riscv_vredsum_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredsum_vs_i64m4_i64m1_m(...) __riscv_vredsum_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredsum_vs_i64m8_i64m1_m(...) __riscv_vredsum_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredmax_vs_i8mf8_i8m1_m(...) __riscv_vredmax_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8mf4_i8m1_m(...) __riscv_vredmax_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8mf2_i8m1_m(...) __riscv_vredmax_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8m1_i8m1_m(...) __riscv_vredmax_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8m2_i8m1_m(...) __riscv_vredmax_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8m4_i8m1_m(...) __riscv_vredmax_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i8m8_i8m1_m(...) __riscv_vredmax_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredmax_vs_i16mf4_i16m1_m(...) __riscv_vredmax_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i16mf2_i16m1_m(...) __riscv_vredmax_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i16m1_i16m1_m(...) __riscv_vredmax_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i16m2_i16m1_m(...) __riscv_vredmax_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i16m4_i16m1_m(...) __riscv_vredmax_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i16m8_i16m1_m(...) __riscv_vredmax_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredmax_vs_i32mf2_i32m1_m(...) __riscv_vredmax_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredmax_vs_i32m1_i32m1_m(...) __riscv_vredmax_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredmax_vs_i32m2_i32m1_m(...) __riscv_vredmax_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredmax_vs_i32m4_i32m1_m(...) __riscv_vredmax_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredmax_vs_i32m8_i32m1_m(...) __riscv_vredmax_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredmax_vs_i64m1_i64m1_m(...) __riscv_vredmax_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredmax_vs_i64m2_i64m1_m(...) __riscv_vredmax_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredmax_vs_i64m4_i64m1_m(...) __riscv_vredmax_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredmax_vs_i64m8_i64m1_m(...) __riscv_vredmax_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredmin_vs_i8mf8_i8m1_m(...) __riscv_vredmin_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8mf4_i8m1_m(...) __riscv_vredmin_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8mf2_i8m1_m(...) __riscv_vredmin_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8m1_i8m1_m(...) __riscv_vredmin_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8m2_i8m1_m(...) __riscv_vredmin_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8m4_i8m1_m(...) __riscv_vredmin_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i8m8_i8m1_m(...) __riscv_vredmin_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredmin_vs_i16mf4_i16m1_m(...) __riscv_vredmin_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i16mf2_i16m1_m(...) __riscv_vredmin_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i16m1_i16m1_m(...) __riscv_vredmin_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i16m2_i16m1_m(...) __riscv_vredmin_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i16m4_i16m1_m(...) __riscv_vredmin_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i16m8_i16m1_m(...) __riscv_vredmin_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredmin_vs_i32mf2_i32m1_m(...) __riscv_vredmin_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredmin_vs_i32m1_i32m1_m(...) __riscv_vredmin_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredmin_vs_i32m2_i32m1_m(...) __riscv_vredmin_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredmin_vs_i32m4_i32m1_m(...) __riscv_vredmin_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredmin_vs_i32m8_i32m1_m(...) __riscv_vredmin_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredmin_vs_i64m1_i64m1_m(...) __riscv_vredmin_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredmin_vs_i64m2_i64m1_m(...) __riscv_vredmin_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredmin_vs_i64m4_i64m1_m(...) __riscv_vredmin_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredmin_vs_i64m8_i64m1_m(...) __riscv_vredmin_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredand_vs_i8mf8_i8m1_m(...) __riscv_vredand_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8mf4_i8m1_m(...) __riscv_vredand_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8mf2_i8m1_m(...) __riscv_vredand_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8m1_i8m1_m(...) __riscv_vredand_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8m2_i8m1_m(...) __riscv_vredand_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8m4_i8m1_m(...) __riscv_vredand_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i8m8_i8m1_m(...) __riscv_vredand_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredand_vs_i16mf4_i16m1_m(...) __riscv_vredand_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i16mf2_i16m1_m(...) __riscv_vredand_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i16m1_i16m1_m(...) __riscv_vredand_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i16m2_i16m1_m(...) __riscv_vredand_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i16m4_i16m1_m(...) __riscv_vredand_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i16m8_i16m1_m(...) __riscv_vredand_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredand_vs_i32mf2_i32m1_m(...) __riscv_vredand_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredand_vs_i32m1_i32m1_m(...) __riscv_vredand_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredand_vs_i32m2_i32m1_m(...) __riscv_vredand_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredand_vs_i32m4_i32m1_m(...) __riscv_vredand_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredand_vs_i32m8_i32m1_m(...) __riscv_vredand_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredand_vs_i64m1_i64m1_m(...) __riscv_vredand_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredand_vs_i64m2_i64m1_m(...) __riscv_vredand_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredand_vs_i64m4_i64m1_m(...) __riscv_vredand_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredand_vs_i64m8_i64m1_m(...) __riscv_vredand_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredor_vs_i8mf8_i8m1_m(...) __riscv_vredor_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8mf4_i8m1_m(...) __riscv_vredor_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8mf2_i8m1_m(...) __riscv_vredor_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8m1_i8m1_m(...) __riscv_vredor_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8m2_i8m1_m(...) __riscv_vredor_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8m4_i8m1_m(...) __riscv_vredor_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i8m8_i8m1_m(...) __riscv_vredor_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredor_vs_i16mf4_i16m1_m(...) __riscv_vredor_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i16mf2_i16m1_m(...) __riscv_vredor_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i16m1_i16m1_m(...) __riscv_vredor_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i16m2_i16m1_m(...) __riscv_vredor_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i16m4_i16m1_m(...) __riscv_vredor_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i16m8_i16m1_m(...) __riscv_vredor_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredor_vs_i32mf2_i32m1_m(...) __riscv_vredor_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredor_vs_i32m1_i32m1_m(...) __riscv_vredor_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredor_vs_i32m2_i32m1_m(...) __riscv_vredor_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredor_vs_i32m4_i32m1_m(...) __riscv_vredor_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredor_vs_i32m8_i32m1_m(...) __riscv_vredor_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredor_vs_i64m1_i64m1_m(...) __riscv_vredor_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredor_vs_i64m2_i64m1_m(...) __riscv_vredor_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredor_vs_i64m4_i64m1_m(...) __riscv_vredor_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredor_vs_i64m8_i64m1_m(...) __riscv_vredor_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredxor_vs_i8mf8_i8m1_m(...) __riscv_vredxor_vs_i8mf8_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8mf4_i8m1_m(...) __riscv_vredxor_vs_i8mf4_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8mf2_i8m1_m(...) __riscv_vredxor_vs_i8mf2_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8m1_i8m1_m(...) __riscv_vredxor_vs_i8m1_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8m2_i8m1_m(...) __riscv_vredxor_vs_i8m2_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8m4_i8m1_m(...) __riscv_vredxor_vs_i8m4_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i8m8_i8m1_m(...) __riscv_vredxor_vs_i8m8_i8m1_tum(__VA_ARGS__) +#define vredxor_vs_i16mf4_i16m1_m(...) __riscv_vredxor_vs_i16mf4_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i16mf2_i16m1_m(...) __riscv_vredxor_vs_i16mf2_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i16m1_i16m1_m(...) __riscv_vredxor_vs_i16m1_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i16m2_i16m1_m(...) __riscv_vredxor_vs_i16m2_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i16m4_i16m1_m(...) __riscv_vredxor_vs_i16m4_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i16m8_i16m1_m(...) __riscv_vredxor_vs_i16m8_i16m1_tum(__VA_ARGS__) +#define vredxor_vs_i32mf2_i32m1_m(...) __riscv_vredxor_vs_i32mf2_i32m1_tum(__VA_ARGS__) +#define vredxor_vs_i32m1_i32m1_m(...) __riscv_vredxor_vs_i32m1_i32m1_tum(__VA_ARGS__) +#define vredxor_vs_i32m2_i32m1_m(...) __riscv_vredxor_vs_i32m2_i32m1_tum(__VA_ARGS__) +#define vredxor_vs_i32m4_i32m1_m(...) __riscv_vredxor_vs_i32m4_i32m1_tum(__VA_ARGS__) +#define vredxor_vs_i32m8_i32m1_m(...) __riscv_vredxor_vs_i32m8_i32m1_tum(__VA_ARGS__) +#define vredxor_vs_i64m1_i64m1_m(...) __riscv_vredxor_vs_i64m1_i64m1_tum(__VA_ARGS__) +#define vredxor_vs_i64m2_i64m1_m(...) __riscv_vredxor_vs_i64m2_i64m1_tum(__VA_ARGS__) +#define vredxor_vs_i64m4_i64m1_m(...) __riscv_vredxor_vs_i64m4_i64m1_tum(__VA_ARGS__) +#define vredxor_vs_i64m8_i64m1_m(...) __riscv_vredxor_vs_i64m8_i64m1_tum(__VA_ARGS__) +#define vredsum_vs_u8mf8_u8m1_m(...) __riscv_vredsum_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8mf4_u8m1_m(...) __riscv_vredsum_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8mf2_u8m1_m(...) __riscv_vredsum_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8m1_u8m1_m(...) __riscv_vredsum_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8m2_u8m1_m(...) __riscv_vredsum_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8m4_u8m1_m(...) __riscv_vredsum_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u8m8_u8m1_m(...) __riscv_vredsum_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredsum_vs_u16mf4_u16m1_m(...) __riscv_vredsum_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u16mf2_u16m1_m(...) __riscv_vredsum_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u16m1_u16m1_m(...) __riscv_vredsum_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u16m2_u16m1_m(...) __riscv_vredsum_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u16m4_u16m1_m(...) __riscv_vredsum_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u16m8_u16m1_m(...) __riscv_vredsum_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredsum_vs_u32mf2_u32m1_m(...) __riscv_vredsum_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredsum_vs_u32m1_u32m1_m(...) __riscv_vredsum_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredsum_vs_u32m2_u32m1_m(...) __riscv_vredsum_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredsum_vs_u32m4_u32m1_m(...) __riscv_vredsum_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredsum_vs_u32m8_u32m1_m(...) __riscv_vredsum_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredsum_vs_u64m1_u64m1_m(...) __riscv_vredsum_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredsum_vs_u64m2_u64m1_m(...) __riscv_vredsum_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredsum_vs_u64m4_u64m1_m(...) __riscv_vredsum_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredsum_vs_u64m8_u64m1_m(...) __riscv_vredsum_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8mf8_u8m1_m(...) __riscv_vredmaxu_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8mf4_u8m1_m(...) __riscv_vredmaxu_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8mf2_u8m1_m(...) __riscv_vredmaxu_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8m1_u8m1_m(...) __riscv_vredmaxu_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8m2_u8m1_m(...) __riscv_vredmaxu_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8m4_u8m1_m(...) __riscv_vredmaxu_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u8m8_u8m1_m(...) __riscv_vredmaxu_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16mf4_u16m1_m(...) __riscv_vredmaxu_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16mf2_u16m1_m(...) __riscv_vredmaxu_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16m1_u16m1_m(...) __riscv_vredmaxu_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16m2_u16m1_m(...) __riscv_vredmaxu_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16m4_u16m1_m(...) __riscv_vredmaxu_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u16m8_u16m1_m(...) __riscv_vredmaxu_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u32mf2_u32m1_m(...) __riscv_vredmaxu_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u32m1_u32m1_m(...) __riscv_vredmaxu_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u32m2_u32m1_m(...) __riscv_vredmaxu_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u32m4_u32m1_m(...) __riscv_vredmaxu_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u32m8_u32m1_m(...) __riscv_vredmaxu_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u64m1_u64m1_m(...) __riscv_vredmaxu_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u64m2_u64m1_m(...) __riscv_vredmaxu_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u64m4_u64m1_m(...) __riscv_vredmaxu_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredmaxu_vs_u64m8_u64m1_m(...) __riscv_vredmaxu_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vredminu_vs_u8mf8_u8m1_m(...) __riscv_vredminu_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8mf4_u8m1_m(...) __riscv_vredminu_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8mf2_u8m1_m(...) __riscv_vredminu_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8m1_u8m1_m(...) __riscv_vredminu_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8m2_u8m1_m(...) __riscv_vredminu_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8m4_u8m1_m(...) __riscv_vredminu_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u8m8_u8m1_m(...) __riscv_vredminu_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredminu_vs_u16mf4_u16m1_m(...) __riscv_vredminu_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u16mf2_u16m1_m(...) __riscv_vredminu_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u16m1_u16m1_m(...) __riscv_vredminu_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u16m2_u16m1_m(...) __riscv_vredminu_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u16m4_u16m1_m(...) __riscv_vredminu_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u16m8_u16m1_m(...) __riscv_vredminu_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredminu_vs_u32mf2_u32m1_m(...) __riscv_vredminu_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredminu_vs_u32m1_u32m1_m(...) __riscv_vredminu_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredminu_vs_u32m2_u32m1_m(...) __riscv_vredminu_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredminu_vs_u32m4_u32m1_m(...) __riscv_vredminu_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredminu_vs_u32m8_u32m1_m(...) __riscv_vredminu_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredminu_vs_u64m1_u64m1_m(...) __riscv_vredminu_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredminu_vs_u64m2_u64m1_m(...) __riscv_vredminu_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredminu_vs_u64m4_u64m1_m(...) __riscv_vredminu_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredminu_vs_u64m8_u64m1_m(...) __riscv_vredminu_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vredand_vs_u8mf8_u8m1_m(...) __riscv_vredand_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8mf4_u8m1_m(...) __riscv_vredand_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8mf2_u8m1_m(...) __riscv_vredand_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8m1_u8m1_m(...) __riscv_vredand_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8m2_u8m1_m(...) __riscv_vredand_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8m4_u8m1_m(...) __riscv_vredand_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u8m8_u8m1_m(...) __riscv_vredand_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredand_vs_u16mf4_u16m1_m(...) __riscv_vredand_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u16mf2_u16m1_m(...) __riscv_vredand_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u16m1_u16m1_m(...) __riscv_vredand_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u16m2_u16m1_m(...) __riscv_vredand_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u16m4_u16m1_m(...) __riscv_vredand_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u16m8_u16m1_m(...) __riscv_vredand_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredand_vs_u32mf2_u32m1_m(...) __riscv_vredand_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredand_vs_u32m1_u32m1_m(...) __riscv_vredand_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredand_vs_u32m2_u32m1_m(...) __riscv_vredand_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredand_vs_u32m4_u32m1_m(...) __riscv_vredand_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredand_vs_u32m8_u32m1_m(...) __riscv_vredand_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredand_vs_u64m1_u64m1_m(...) __riscv_vredand_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredand_vs_u64m2_u64m1_m(...) __riscv_vredand_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredand_vs_u64m4_u64m1_m(...) __riscv_vredand_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredand_vs_u64m8_u64m1_m(...) __riscv_vredand_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vredor_vs_u8mf8_u8m1_m(...) __riscv_vredor_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8mf4_u8m1_m(...) __riscv_vredor_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8mf2_u8m1_m(...) __riscv_vredor_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8m1_u8m1_m(...) __riscv_vredor_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8m2_u8m1_m(...) __riscv_vredor_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8m4_u8m1_m(...) __riscv_vredor_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u8m8_u8m1_m(...) __riscv_vredor_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredor_vs_u16mf4_u16m1_m(...) __riscv_vredor_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u16mf2_u16m1_m(...) __riscv_vredor_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u16m1_u16m1_m(...) __riscv_vredor_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u16m2_u16m1_m(...) __riscv_vredor_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u16m4_u16m1_m(...) __riscv_vredor_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u16m8_u16m1_m(...) __riscv_vredor_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredor_vs_u32mf2_u32m1_m(...) __riscv_vredor_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredor_vs_u32m1_u32m1_m(...) __riscv_vredor_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredor_vs_u32m2_u32m1_m(...) __riscv_vredor_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredor_vs_u32m4_u32m1_m(...) __riscv_vredor_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredor_vs_u32m8_u32m1_m(...) __riscv_vredor_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredor_vs_u64m1_u64m1_m(...) __riscv_vredor_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredor_vs_u64m2_u64m1_m(...) __riscv_vredor_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredor_vs_u64m4_u64m1_m(...) __riscv_vredor_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredor_vs_u64m8_u64m1_m(...) __riscv_vredor_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vredxor_vs_u8mf8_u8m1_m(...) __riscv_vredxor_vs_u8mf8_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8mf4_u8m1_m(...) __riscv_vredxor_vs_u8mf4_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8mf2_u8m1_m(...) __riscv_vredxor_vs_u8mf2_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8m1_u8m1_m(...) __riscv_vredxor_vs_u8m1_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8m2_u8m1_m(...) __riscv_vredxor_vs_u8m2_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8m4_u8m1_m(...) __riscv_vredxor_vs_u8m4_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u8m8_u8m1_m(...) __riscv_vredxor_vs_u8m8_u8m1_tum(__VA_ARGS__) +#define vredxor_vs_u16mf4_u16m1_m(...) __riscv_vredxor_vs_u16mf4_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u16mf2_u16m1_m(...) __riscv_vredxor_vs_u16mf2_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u16m1_u16m1_m(...) __riscv_vredxor_vs_u16m1_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u16m2_u16m1_m(...) __riscv_vredxor_vs_u16m2_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u16m4_u16m1_m(...) __riscv_vredxor_vs_u16m4_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u16m8_u16m1_m(...) __riscv_vredxor_vs_u16m8_u16m1_tum(__VA_ARGS__) +#define vredxor_vs_u32mf2_u32m1_m(...) __riscv_vredxor_vs_u32mf2_u32m1_tum(__VA_ARGS__) +#define vredxor_vs_u32m1_u32m1_m(...) __riscv_vredxor_vs_u32m1_u32m1_tum(__VA_ARGS__) +#define vredxor_vs_u32m2_u32m1_m(...) __riscv_vredxor_vs_u32m2_u32m1_tum(__VA_ARGS__) +#define vredxor_vs_u32m4_u32m1_m(...) __riscv_vredxor_vs_u32m4_u32m1_tum(__VA_ARGS__) +#define vredxor_vs_u32m8_u32m1_m(...) __riscv_vredxor_vs_u32m8_u32m1_tum(__VA_ARGS__) +#define vredxor_vs_u64m1_u64m1_m(...) __riscv_vredxor_vs_u64m1_u64m1_tum(__VA_ARGS__) +#define vredxor_vs_u64m2_u64m1_m(...) __riscv_vredxor_vs_u64m2_u64m1_tum(__VA_ARGS__) +#define vredxor_vs_u64m4_u64m1_m(...) __riscv_vredxor_vs_u64m4_u64m1_tum(__VA_ARGS__) +#define vredxor_vs_u64m8_u64m1_m(...) __riscv_vredxor_vs_u64m8_u64m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8mf8_i16m1(...) __riscv_vwredsum_vs_i8mf8_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8mf4_i16m1(...) __riscv_vwredsum_vs_i8mf4_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8mf2_i16m1(...) __riscv_vwredsum_vs_i8mf2_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8m1_i16m1(...) __riscv_vwredsum_vs_i8m1_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8m2_i16m1(...) __riscv_vwredsum_vs_i8m2_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8m4_i16m1(...) __riscv_vwredsum_vs_i8m4_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i8m8_i16m1(...) __riscv_vwredsum_vs_i8m8_i16m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16mf4_i32m1(...) __riscv_vwredsum_vs_i16mf4_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16mf2_i32m1(...) __riscv_vwredsum_vs_i16mf2_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16m1_i32m1(...) __riscv_vwredsum_vs_i16m1_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16m2_i32m1(...) __riscv_vwredsum_vs_i16m2_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16m4_i32m1(...) __riscv_vwredsum_vs_i16m4_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i16m8_i32m1(...) __riscv_vwredsum_vs_i16m8_i32m1_tu(__VA_ARGS__) +#define vwredsum_vs_i32mf2_i64m1(...) __riscv_vwredsum_vs_i32mf2_i64m1_tu(__VA_ARGS__) +#define vwredsum_vs_i32m1_i64m1(...) __riscv_vwredsum_vs_i32m1_i64m1_tu(__VA_ARGS__) +#define vwredsum_vs_i32m2_i64m1(...) __riscv_vwredsum_vs_i32m2_i64m1_tu(__VA_ARGS__) +#define vwredsum_vs_i32m4_i64m1(...) __riscv_vwredsum_vs_i32m4_i64m1_tu(__VA_ARGS__) +#define vwredsum_vs_i32m8_i64m1(...) __riscv_vwredsum_vs_i32m8_i64m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8mf8_u16m1(...) __riscv_vwredsumu_vs_u8mf8_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8mf4_u16m1(...) __riscv_vwredsumu_vs_u8mf4_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8mf2_u16m1(...) __riscv_vwredsumu_vs_u8mf2_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8m1_u16m1(...) __riscv_vwredsumu_vs_u8m1_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8m2_u16m1(...) __riscv_vwredsumu_vs_u8m2_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8m4_u16m1(...) __riscv_vwredsumu_vs_u8m4_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u8m8_u16m1(...) __riscv_vwredsumu_vs_u8m8_u16m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16mf4_u32m1(...) __riscv_vwredsumu_vs_u16mf4_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16mf2_u32m1(...) __riscv_vwredsumu_vs_u16mf2_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16m1_u32m1(...) __riscv_vwredsumu_vs_u16m1_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16m2_u32m1(...) __riscv_vwredsumu_vs_u16m2_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16m4_u32m1(...) __riscv_vwredsumu_vs_u16m4_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u16m8_u32m1(...) __riscv_vwredsumu_vs_u16m8_u32m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u32mf2_u64m1(...) __riscv_vwredsumu_vs_u32mf2_u64m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u32m1_u64m1(...) __riscv_vwredsumu_vs_u32m1_u64m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u32m2_u64m1(...) __riscv_vwredsumu_vs_u32m2_u64m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u32m4_u64m1(...) __riscv_vwredsumu_vs_u32m4_u64m1_tu(__VA_ARGS__) +#define vwredsumu_vs_u32m8_u64m1(...) __riscv_vwredsumu_vs_u32m8_u64m1_tu(__VA_ARGS__) +// masked functions +#define vwredsum_vs_i8mf8_i16m1_m(...) __riscv_vwredsum_vs_i8mf8_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8mf4_i16m1_m(...) __riscv_vwredsum_vs_i8mf4_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8mf2_i16m1_m(...) __riscv_vwredsum_vs_i8mf2_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8m1_i16m1_m(...) __riscv_vwredsum_vs_i8m1_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8m2_i16m1_m(...) __riscv_vwredsum_vs_i8m2_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8m4_i16m1_m(...) __riscv_vwredsum_vs_i8m4_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i8m8_i16m1_m(...) __riscv_vwredsum_vs_i8m8_i16m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16mf4_i32m1_m(...) __riscv_vwredsum_vs_i16mf4_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16mf2_i32m1_m(...) __riscv_vwredsum_vs_i16mf2_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16m1_i32m1_m(...) __riscv_vwredsum_vs_i16m1_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16m2_i32m1_m(...) __riscv_vwredsum_vs_i16m2_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16m4_i32m1_m(...) __riscv_vwredsum_vs_i16m4_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i16m8_i32m1_m(...) __riscv_vwredsum_vs_i16m8_i32m1_tum(__VA_ARGS__) +#define vwredsum_vs_i32mf2_i64m1_m(...) __riscv_vwredsum_vs_i32mf2_i64m1_tum(__VA_ARGS__) +#define vwredsum_vs_i32m1_i64m1_m(...) __riscv_vwredsum_vs_i32m1_i64m1_tum(__VA_ARGS__) +#define vwredsum_vs_i32m2_i64m1_m(...) __riscv_vwredsum_vs_i32m2_i64m1_tum(__VA_ARGS__) +#define vwredsum_vs_i32m4_i64m1_m(...) __riscv_vwredsum_vs_i32m4_i64m1_tum(__VA_ARGS__) +#define vwredsum_vs_i32m8_i64m1_m(...) __riscv_vwredsum_vs_i32m8_i64m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8mf8_u16m1_m(...) __riscv_vwredsumu_vs_u8mf8_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8mf4_u16m1_m(...) __riscv_vwredsumu_vs_u8mf4_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8mf2_u16m1_m(...) __riscv_vwredsumu_vs_u8mf2_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8m1_u16m1_m(...) __riscv_vwredsumu_vs_u8m1_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8m2_u16m1_m(...) __riscv_vwredsumu_vs_u8m2_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8m4_u16m1_m(...) __riscv_vwredsumu_vs_u8m4_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u8m8_u16m1_m(...) __riscv_vwredsumu_vs_u8m8_u16m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16mf4_u32m1_m(...) __riscv_vwredsumu_vs_u16mf4_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16mf2_u32m1_m(...) __riscv_vwredsumu_vs_u16mf2_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16m1_u32m1_m(...) __riscv_vwredsumu_vs_u16m1_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16m2_u32m1_m(...) __riscv_vwredsumu_vs_u16m2_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16m4_u32m1_m(...) __riscv_vwredsumu_vs_u16m4_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u16m8_u32m1_m(...) __riscv_vwredsumu_vs_u16m8_u32m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u32mf2_u64m1_m(...) __riscv_vwredsumu_vs_u32mf2_u64m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u32m1_u64m1_m(...) __riscv_vwredsumu_vs_u32m1_u64m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u32m2_u64m1_m(...) __riscv_vwredsumu_vs_u32m2_u64m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u32m4_u64m1_m(...) __riscv_vwredsumu_vs_u32m4_u64m1_tum(__VA_ARGS__) +#define vwredsumu_vs_u32m8_u64m1_m(...) __riscv_vwredsumu_vs_u32m8_u64m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16mf4_f16m1(...) __riscv_vfredosum_vs_f16mf4_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f16mf2_f16m1(...) __riscv_vfredosum_vs_f16mf2_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f16m1_f16m1(...) __riscv_vfredosum_vs_f16m1_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f16m2_f16m1(...) __riscv_vfredosum_vs_f16m2_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f16m4_f16m1(...) __riscv_vfredosum_vs_f16m4_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f16m8_f16m1(...) __riscv_vfredosum_vs_f16m8_f16m1_tu(__VA_ARGS__) +#define vfredosum_vs_f32mf2_f32m1(...) __riscv_vfredosum_vs_f32mf2_f32m1_tu(__VA_ARGS__) +#define vfredosum_vs_f32m1_f32m1(...) __riscv_vfredosum_vs_f32m1_f32m1_tu(__VA_ARGS__) +#define vfredosum_vs_f32m2_f32m1(...) __riscv_vfredosum_vs_f32m2_f32m1_tu(__VA_ARGS__) +#define vfredosum_vs_f32m4_f32m1(...) __riscv_vfredosum_vs_f32m4_f32m1_tu(__VA_ARGS__) +#define vfredosum_vs_f32m8_f32m1(...) __riscv_vfredosum_vs_f32m8_f32m1_tu(__VA_ARGS__) +#define vfredosum_vs_f64m1_f64m1(...) __riscv_vfredosum_vs_f64m1_f64m1_tu(__VA_ARGS__) +#define vfredosum_vs_f64m2_f64m1(...) __riscv_vfredosum_vs_f64m2_f64m1_tu(__VA_ARGS__) +#define vfredosum_vs_f64m4_f64m1(...) __riscv_vfredosum_vs_f64m4_f64m1_tu(__VA_ARGS__) +#define vfredosum_vs_f64m8_f64m1(...) __riscv_vfredosum_vs_f64m8_f64m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16mf4_f16m1(...) __riscv_vfredusum_vs_f16mf4_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16mf2_f16m1(...) __riscv_vfredusum_vs_f16mf2_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16m1_f16m1(...) __riscv_vfredusum_vs_f16m1_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16m2_f16m1(...) __riscv_vfredusum_vs_f16m2_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16m4_f16m1(...) __riscv_vfredusum_vs_f16m4_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f16m8_f16m1(...) __riscv_vfredusum_vs_f16m8_f16m1_tu(__VA_ARGS__) +#define vfredusum_vs_f32mf2_f32m1(...) __riscv_vfredusum_vs_f32mf2_f32m1_tu(__VA_ARGS__) +#define vfredusum_vs_f32m1_f32m1(...) __riscv_vfredusum_vs_f32m1_f32m1_tu(__VA_ARGS__) +#define vfredusum_vs_f32m2_f32m1(...) __riscv_vfredusum_vs_f32m2_f32m1_tu(__VA_ARGS__) +#define vfredusum_vs_f32m4_f32m1(...) __riscv_vfredusum_vs_f32m4_f32m1_tu(__VA_ARGS__) +#define vfredusum_vs_f32m8_f32m1(...) __riscv_vfredusum_vs_f32m8_f32m1_tu(__VA_ARGS__) +#define vfredusum_vs_f64m1_f64m1(...) __riscv_vfredusum_vs_f64m1_f64m1_tu(__VA_ARGS__) +#define vfredusum_vs_f64m2_f64m1(...) __riscv_vfredusum_vs_f64m2_f64m1_tu(__VA_ARGS__) +#define vfredusum_vs_f64m4_f64m1(...) __riscv_vfredusum_vs_f64m4_f64m1_tu(__VA_ARGS__) +#define vfredusum_vs_f64m8_f64m1(...) __riscv_vfredusum_vs_f64m8_f64m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16mf4_f16m1(...) __riscv_vfredmax_vs_f16mf4_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16mf2_f16m1(...) __riscv_vfredmax_vs_f16mf2_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16m1_f16m1(...) __riscv_vfredmax_vs_f16m1_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16m2_f16m1(...) __riscv_vfredmax_vs_f16m2_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16m4_f16m1(...) __riscv_vfredmax_vs_f16m4_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f16m8_f16m1(...) __riscv_vfredmax_vs_f16m8_f16m1_tu(__VA_ARGS__) +#define vfredmax_vs_f32mf2_f32m1(...) __riscv_vfredmax_vs_f32mf2_f32m1_tu(__VA_ARGS__) +#define vfredmax_vs_f32m1_f32m1(...) __riscv_vfredmax_vs_f32m1_f32m1_tu(__VA_ARGS__) +#define vfredmax_vs_f32m2_f32m1(...) __riscv_vfredmax_vs_f32m2_f32m1_tu(__VA_ARGS__) +#define vfredmax_vs_f32m4_f32m1(...) __riscv_vfredmax_vs_f32m4_f32m1_tu(__VA_ARGS__) +#define vfredmax_vs_f32m8_f32m1(...) __riscv_vfredmax_vs_f32m8_f32m1_tu(__VA_ARGS__) +#define vfredmax_vs_f64m1_f64m1(...) __riscv_vfredmax_vs_f64m1_f64m1_tu(__VA_ARGS__) +#define vfredmax_vs_f64m2_f64m1(...) __riscv_vfredmax_vs_f64m2_f64m1_tu(__VA_ARGS__) +#define vfredmax_vs_f64m4_f64m1(...) __riscv_vfredmax_vs_f64m4_f64m1_tu(__VA_ARGS__) +#define vfredmax_vs_f64m8_f64m1(...) __riscv_vfredmax_vs_f64m8_f64m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16mf4_f16m1(...) __riscv_vfredmin_vs_f16mf4_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16mf2_f16m1(...) __riscv_vfredmin_vs_f16mf2_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16m1_f16m1(...) __riscv_vfredmin_vs_f16m1_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16m2_f16m1(...) __riscv_vfredmin_vs_f16m2_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16m4_f16m1(...) __riscv_vfredmin_vs_f16m4_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f16m8_f16m1(...) __riscv_vfredmin_vs_f16m8_f16m1_tu(__VA_ARGS__) +#define vfredmin_vs_f32mf2_f32m1(...) __riscv_vfredmin_vs_f32mf2_f32m1_tu(__VA_ARGS__) +#define vfredmin_vs_f32m1_f32m1(...) __riscv_vfredmin_vs_f32m1_f32m1_tu(__VA_ARGS__) +#define vfredmin_vs_f32m2_f32m1(...) __riscv_vfredmin_vs_f32m2_f32m1_tu(__VA_ARGS__) +#define vfredmin_vs_f32m4_f32m1(...) __riscv_vfredmin_vs_f32m4_f32m1_tu(__VA_ARGS__) +#define vfredmin_vs_f32m8_f32m1(...) __riscv_vfredmin_vs_f32m8_f32m1_tu(__VA_ARGS__) +#define vfredmin_vs_f64m1_f64m1(...) __riscv_vfredmin_vs_f64m1_f64m1_tu(__VA_ARGS__) +#define vfredmin_vs_f64m2_f64m1(...) __riscv_vfredmin_vs_f64m2_f64m1_tu(__VA_ARGS__) +#define vfredmin_vs_f64m4_f64m1(...) __riscv_vfredmin_vs_f64m4_f64m1_tu(__VA_ARGS__) +#define vfredmin_vs_f64m8_f64m1(...) __riscv_vfredmin_vs_f64m8_f64m1_tu(__VA_ARGS__) +// masked functions +#define vfredosum_vs_f16mf4_f16m1_m(...) __riscv_vfredosum_vs_f16mf4_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16mf2_f16m1_m(...) __riscv_vfredosum_vs_f16mf2_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16m1_f16m1_m(...) __riscv_vfredosum_vs_f16m1_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16m2_f16m1_m(...) __riscv_vfredosum_vs_f16m2_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16m4_f16m1_m(...) __riscv_vfredosum_vs_f16m4_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f16m8_f16m1_m(...) __riscv_vfredosum_vs_f16m8_f16m1_tum(__VA_ARGS__) +#define vfredosum_vs_f32mf2_f32m1_m(...) __riscv_vfredosum_vs_f32mf2_f32m1_tum(__VA_ARGS__) +#define vfredosum_vs_f32m1_f32m1_m(...) __riscv_vfredosum_vs_f32m1_f32m1_tum(__VA_ARGS__) +#define vfredosum_vs_f32m2_f32m1_m(...) __riscv_vfredosum_vs_f32m2_f32m1_tum(__VA_ARGS__) +#define vfredosum_vs_f32m4_f32m1_m(...) __riscv_vfredosum_vs_f32m4_f32m1_tum(__VA_ARGS__) +#define vfredosum_vs_f32m8_f32m1_m(...) __riscv_vfredosum_vs_f32m8_f32m1_tum(__VA_ARGS__) +#define vfredosum_vs_f64m1_f64m1_m(...) __riscv_vfredosum_vs_f64m1_f64m1_tum(__VA_ARGS__) +#define vfredosum_vs_f64m2_f64m1_m(...) __riscv_vfredosum_vs_f64m2_f64m1_tum(__VA_ARGS__) +#define vfredosum_vs_f64m4_f64m1_m(...) __riscv_vfredosum_vs_f64m4_f64m1_tum(__VA_ARGS__) +#define vfredosum_vs_f64m8_f64m1_m(...) __riscv_vfredosum_vs_f64m8_f64m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16mf4_f16m1_m(...) __riscv_vfredusum_vs_f16mf4_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16mf2_f16m1_m(...) __riscv_vfredusum_vs_f16mf2_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16m1_f16m1_m(...) __riscv_vfredusum_vs_f16m1_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16m2_f16m1_m(...) __riscv_vfredusum_vs_f16m2_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16m4_f16m1_m(...) __riscv_vfredusum_vs_f16m4_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f16m8_f16m1_m(...) __riscv_vfredusum_vs_f16m8_f16m1_tum(__VA_ARGS__) +#define vfredusum_vs_f32mf2_f32m1_m(...) __riscv_vfredusum_vs_f32mf2_f32m1_tum(__VA_ARGS__) +#define vfredusum_vs_f32m1_f32m1_m(...) __riscv_vfredusum_vs_f32m1_f32m1_tum(__VA_ARGS__) +#define vfredusum_vs_f32m2_f32m1_m(...) __riscv_vfredusum_vs_f32m2_f32m1_tum(__VA_ARGS__) +#define vfredusum_vs_f32m4_f32m1_m(...) __riscv_vfredusum_vs_f32m4_f32m1_tum(__VA_ARGS__) +#define vfredusum_vs_f32m8_f32m1_m(...) __riscv_vfredusum_vs_f32m8_f32m1_tum(__VA_ARGS__) +#define vfredusum_vs_f64m1_f64m1_m(...) __riscv_vfredusum_vs_f64m1_f64m1_tum(__VA_ARGS__) +#define vfredusum_vs_f64m2_f64m1_m(...) __riscv_vfredusum_vs_f64m2_f64m1_tum(__VA_ARGS__) +#define vfredusum_vs_f64m4_f64m1_m(...) __riscv_vfredusum_vs_f64m4_f64m1_tum(__VA_ARGS__) +#define vfredusum_vs_f64m8_f64m1_m(...) __riscv_vfredusum_vs_f64m8_f64m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16mf4_f16m1_m(...) __riscv_vfredmax_vs_f16mf4_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16mf2_f16m1_m(...) __riscv_vfredmax_vs_f16mf2_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16m1_f16m1_m(...) __riscv_vfredmax_vs_f16m1_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16m2_f16m1_m(...) __riscv_vfredmax_vs_f16m2_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16m4_f16m1_m(...) __riscv_vfredmax_vs_f16m4_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f16m8_f16m1_m(...) __riscv_vfredmax_vs_f16m8_f16m1_tum(__VA_ARGS__) +#define vfredmax_vs_f32mf2_f32m1_m(...) __riscv_vfredmax_vs_f32mf2_f32m1_tum(__VA_ARGS__) +#define vfredmax_vs_f32m1_f32m1_m(...) __riscv_vfredmax_vs_f32m1_f32m1_tum(__VA_ARGS__) +#define vfredmax_vs_f32m2_f32m1_m(...) __riscv_vfredmax_vs_f32m2_f32m1_tum(__VA_ARGS__) +#define vfredmax_vs_f32m4_f32m1_m(...) __riscv_vfredmax_vs_f32m4_f32m1_tum(__VA_ARGS__) +#define vfredmax_vs_f32m8_f32m1_m(...) __riscv_vfredmax_vs_f32m8_f32m1_tum(__VA_ARGS__) +#define vfredmax_vs_f64m1_f64m1_m(...) __riscv_vfredmax_vs_f64m1_f64m1_tum(__VA_ARGS__) +#define vfredmax_vs_f64m2_f64m1_m(...) __riscv_vfredmax_vs_f64m2_f64m1_tum(__VA_ARGS__) +#define vfredmax_vs_f64m4_f64m1_m(...) __riscv_vfredmax_vs_f64m4_f64m1_tum(__VA_ARGS__) +#define vfredmax_vs_f64m8_f64m1_m(...) __riscv_vfredmax_vs_f64m8_f64m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16mf4_f16m1_m(...) __riscv_vfredmin_vs_f16mf4_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16mf2_f16m1_m(...) __riscv_vfredmin_vs_f16mf2_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16m1_f16m1_m(...) __riscv_vfredmin_vs_f16m1_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16m2_f16m1_m(...) __riscv_vfredmin_vs_f16m2_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16m4_f16m1_m(...) __riscv_vfredmin_vs_f16m4_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f16m8_f16m1_m(...) __riscv_vfredmin_vs_f16m8_f16m1_tum(__VA_ARGS__) +#define vfredmin_vs_f32mf2_f32m1_m(...) __riscv_vfredmin_vs_f32mf2_f32m1_tum(__VA_ARGS__) +#define vfredmin_vs_f32m1_f32m1_m(...) __riscv_vfredmin_vs_f32m1_f32m1_tum(__VA_ARGS__) +#define vfredmin_vs_f32m2_f32m1_m(...) __riscv_vfredmin_vs_f32m2_f32m1_tum(__VA_ARGS__) +#define vfredmin_vs_f32m4_f32m1_m(...) __riscv_vfredmin_vs_f32m4_f32m1_tum(__VA_ARGS__) +#define vfredmin_vs_f32m8_f32m1_m(...) __riscv_vfredmin_vs_f32m8_f32m1_tum(__VA_ARGS__) +#define vfredmin_vs_f64m1_f64m1_m(...) __riscv_vfredmin_vs_f64m1_f64m1_tum(__VA_ARGS__) +#define vfredmin_vs_f64m2_f64m1_m(...) __riscv_vfredmin_vs_f64m2_f64m1_tum(__VA_ARGS__) +#define vfredmin_vs_f64m4_f64m1_m(...) __riscv_vfredmin_vs_f64m4_f64m1_tum(__VA_ARGS__) +#define vfredmin_vs_f64m8_f64m1_m(...) __riscv_vfredmin_vs_f64m8_f64m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16mf4_f32m1(...) __riscv_vfwredosum_vs_f16mf4_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f16mf2_f32m1(...) __riscv_vfwredosum_vs_f16mf2_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f16m1_f32m1(...) __riscv_vfwredosum_vs_f16m1_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f16m2_f32m1(...) __riscv_vfwredosum_vs_f16m2_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f16m4_f32m1(...) __riscv_vfwredosum_vs_f16m4_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f16m8_f32m1(...) __riscv_vfwredosum_vs_f16m8_f32m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f32mf2_f64m1(...) __riscv_vfwredosum_vs_f32mf2_f64m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f32m1_f64m1(...) __riscv_vfwredosum_vs_f32m1_f64m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f32m2_f64m1(...) __riscv_vfwredosum_vs_f32m2_f64m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f32m4_f64m1(...) __riscv_vfwredosum_vs_f32m4_f64m1_tu(__VA_ARGS__) +#define vfwredosum_vs_f32m8_f64m1(...) __riscv_vfwredosum_vs_f32m8_f64m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16mf4_f32m1(...) __riscv_vfwredusum_vs_f16mf4_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16mf2_f32m1(...) __riscv_vfwredusum_vs_f16mf2_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16m1_f32m1(...) __riscv_vfwredusum_vs_f16m1_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16m2_f32m1(...) __riscv_vfwredusum_vs_f16m2_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16m4_f32m1(...) __riscv_vfwredusum_vs_f16m4_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f16m8_f32m1(...) __riscv_vfwredusum_vs_f16m8_f32m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f32mf2_f64m1(...) __riscv_vfwredusum_vs_f32mf2_f64m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f32m1_f64m1(...) __riscv_vfwredusum_vs_f32m1_f64m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f32m2_f64m1(...) __riscv_vfwredusum_vs_f32m2_f64m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f32m4_f64m1(...) __riscv_vfwredusum_vs_f32m4_f64m1_tu(__VA_ARGS__) +#define vfwredusum_vs_f32m8_f64m1(...) __riscv_vfwredusum_vs_f32m8_f64m1_tu(__VA_ARGS__) +// masked functions +#define vfwredosum_vs_f16mf4_f32m1_m(...) __riscv_vfwredosum_vs_f16mf4_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16mf2_f32m1_m(...) __riscv_vfwredosum_vs_f16mf2_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16m1_f32m1_m(...) __riscv_vfwredosum_vs_f16m1_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16m2_f32m1_m(...) __riscv_vfwredosum_vs_f16m2_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16m4_f32m1_m(...) __riscv_vfwredosum_vs_f16m4_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f16m8_f32m1_m(...) __riscv_vfwredosum_vs_f16m8_f32m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f32mf2_f64m1_m(...) __riscv_vfwredosum_vs_f32mf2_f64m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f32m1_f64m1_m(...) __riscv_vfwredosum_vs_f32m1_f64m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f32m2_f64m1_m(...) __riscv_vfwredosum_vs_f32m2_f64m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f32m4_f64m1_m(...) __riscv_vfwredosum_vs_f32m4_f64m1_tum(__VA_ARGS__) +#define vfwredosum_vs_f32m8_f64m1_m(...) __riscv_vfwredosum_vs_f32m8_f64m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16mf4_f32m1_m(...) __riscv_vfwredusum_vs_f16mf4_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16mf2_f32m1_m(...) __riscv_vfwredusum_vs_f16mf2_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16m1_f32m1_m(...) __riscv_vfwredusum_vs_f16m1_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16m2_f32m1_m(...) __riscv_vfwredusum_vs_f16m2_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16m4_f32m1_m(...) __riscv_vfwredusum_vs_f16m4_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f16m8_f32m1_m(...) __riscv_vfwredusum_vs_f16m8_f32m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f32mf2_f64m1_m(...) __riscv_vfwredusum_vs_f32mf2_f64m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f32m1_f64m1_m(...) __riscv_vfwredusum_vs_f32m1_f64m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f32m2_f64m1_m(...) __riscv_vfwredusum_vs_f32m2_f64m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f32m4_f64m1_m(...) __riscv_vfwredusum_vs_f32m4_f64m1_tum(__VA_ARGS__) +#define vfwredusum_vs_f32m8_f64m1_m(...) __riscv_vfwredusum_vs_f32m8_f64m1_tum(__VA_ARGS__) +#define vlm_v_b1(...) __riscv_vlm_v_b1(__VA_ARGS__) +#define vlm_v_b2(...) __riscv_vlm_v_b2(__VA_ARGS__) +#define vlm_v_b4(...) __riscv_vlm_v_b4(__VA_ARGS__) +#define vlm_v_b8(...) __riscv_vlm_v_b8(__VA_ARGS__) +#define vlm_v_b16(...) __riscv_vlm_v_b16(__VA_ARGS__) +#define vlm_v_b32(...) __riscv_vlm_v_b32(__VA_ARGS__) +#define vlm_v_b64(...) __riscv_vlm_v_b64(__VA_ARGS__) +#define vsm_v_b1(...) __riscv_vsm_v_b1(__VA_ARGS__) +#define vsm_v_b2(...) __riscv_vsm_v_b2(__VA_ARGS__) +#define vsm_v_b4(...) __riscv_vsm_v_b4(__VA_ARGS__) +#define vsm_v_b8(...) __riscv_vsm_v_b8(__VA_ARGS__) +#define vsm_v_b16(...) __riscv_vsm_v_b16(__VA_ARGS__) +#define vsm_v_b32(...) __riscv_vsm_v_b32(__VA_ARGS__) +#define vsm_v_b64(...) __riscv_vsm_v_b64(__VA_ARGS__) +#define vmand_mm_b1(...) __riscv_vmand_mm_b1(__VA_ARGS__) +#define vmand_mm_b2(...) __riscv_vmand_mm_b2(__VA_ARGS__) +#define vmand_mm_b4(...) __riscv_vmand_mm_b4(__VA_ARGS__) +#define vmand_mm_b8(...) __riscv_vmand_mm_b8(__VA_ARGS__) +#define vmand_mm_b16(...) __riscv_vmand_mm_b16(__VA_ARGS__) +#define vmand_mm_b32(...) __riscv_vmand_mm_b32(__VA_ARGS__) +#define vmand_mm_b64(...) __riscv_vmand_mm_b64(__VA_ARGS__) +#define vmnand_mm_b1(...) __riscv_vmnand_mm_b1(__VA_ARGS__) +#define vmnand_mm_b2(...) __riscv_vmnand_mm_b2(__VA_ARGS__) +#define vmnand_mm_b4(...) __riscv_vmnand_mm_b4(__VA_ARGS__) +#define vmnand_mm_b8(...) __riscv_vmnand_mm_b8(__VA_ARGS__) +#define vmnand_mm_b16(...) __riscv_vmnand_mm_b16(__VA_ARGS__) +#define vmnand_mm_b32(...) __riscv_vmnand_mm_b32(__VA_ARGS__) +#define vmnand_mm_b64(...) __riscv_vmnand_mm_b64(__VA_ARGS__) +#define vmandn_mm_b1(...) __riscv_vmandn_mm_b1(__VA_ARGS__) +#define vmandn_mm_b2(...) __riscv_vmandn_mm_b2(__VA_ARGS__) +#define vmandn_mm_b4(...) __riscv_vmandn_mm_b4(__VA_ARGS__) +#define vmandn_mm_b8(...) __riscv_vmandn_mm_b8(__VA_ARGS__) +#define vmandn_mm_b16(...) __riscv_vmandn_mm_b16(__VA_ARGS__) +#define vmandn_mm_b32(...) __riscv_vmandn_mm_b32(__VA_ARGS__) +#define vmandn_mm_b64(...) __riscv_vmandn_mm_b64(__VA_ARGS__) +#define vmxor_mm_b1(...) __riscv_vmxor_mm_b1(__VA_ARGS__) +#define vmxor_mm_b2(...) __riscv_vmxor_mm_b2(__VA_ARGS__) +#define vmxor_mm_b4(...) __riscv_vmxor_mm_b4(__VA_ARGS__) +#define vmxor_mm_b8(...) __riscv_vmxor_mm_b8(__VA_ARGS__) +#define vmxor_mm_b16(...) __riscv_vmxor_mm_b16(__VA_ARGS__) +#define vmxor_mm_b32(...) __riscv_vmxor_mm_b32(__VA_ARGS__) +#define vmxor_mm_b64(...) __riscv_vmxor_mm_b64(__VA_ARGS__) +#define vmor_mm_b1(...) __riscv_vmor_mm_b1(__VA_ARGS__) +#define vmor_mm_b2(...) __riscv_vmor_mm_b2(__VA_ARGS__) +#define vmor_mm_b4(...) __riscv_vmor_mm_b4(__VA_ARGS__) +#define vmor_mm_b8(...) __riscv_vmor_mm_b8(__VA_ARGS__) +#define vmor_mm_b16(...) __riscv_vmor_mm_b16(__VA_ARGS__) +#define vmor_mm_b32(...) __riscv_vmor_mm_b32(__VA_ARGS__) +#define vmor_mm_b64(...) __riscv_vmor_mm_b64(__VA_ARGS__) +#define vmnor_mm_b1(...) __riscv_vmnor_mm_b1(__VA_ARGS__) +#define vmnor_mm_b2(...) __riscv_vmnor_mm_b2(__VA_ARGS__) +#define vmnor_mm_b4(...) __riscv_vmnor_mm_b4(__VA_ARGS__) +#define vmnor_mm_b8(...) __riscv_vmnor_mm_b8(__VA_ARGS__) +#define vmnor_mm_b16(...) __riscv_vmnor_mm_b16(__VA_ARGS__) +#define vmnor_mm_b32(...) __riscv_vmnor_mm_b32(__VA_ARGS__) +#define vmnor_mm_b64(...) __riscv_vmnor_mm_b64(__VA_ARGS__) +#define vmorn_mm_b1(...) __riscv_vmorn_mm_b1(__VA_ARGS__) +#define vmorn_mm_b2(...) __riscv_vmorn_mm_b2(__VA_ARGS__) +#define vmorn_mm_b4(...) __riscv_vmorn_mm_b4(__VA_ARGS__) +#define vmorn_mm_b8(...) __riscv_vmorn_mm_b8(__VA_ARGS__) +#define vmorn_mm_b16(...) __riscv_vmorn_mm_b16(__VA_ARGS__) +#define vmorn_mm_b32(...) __riscv_vmorn_mm_b32(__VA_ARGS__) +#define vmorn_mm_b64(...) __riscv_vmorn_mm_b64(__VA_ARGS__) +#define vmxnor_mm_b1(...) __riscv_vmxnor_mm_b1(__VA_ARGS__) +#define vmxnor_mm_b2(...) __riscv_vmxnor_mm_b2(__VA_ARGS__) +#define vmxnor_mm_b4(...) __riscv_vmxnor_mm_b4(__VA_ARGS__) +#define vmxnor_mm_b8(...) __riscv_vmxnor_mm_b8(__VA_ARGS__) +#define vmxnor_mm_b16(...) __riscv_vmxnor_mm_b16(__VA_ARGS__) +#define vmxnor_mm_b32(...) __riscv_vmxnor_mm_b32(__VA_ARGS__) +#define vmxnor_mm_b64(...) __riscv_vmxnor_mm_b64(__VA_ARGS__) +#define vmmv_m_b1(...) __riscv_vmmv_m_b1(__VA_ARGS__) +#define vmmv_m_b2(...) __riscv_vmmv_m_b2(__VA_ARGS__) +#define vmmv_m_b4(...) __riscv_vmmv_m_b4(__VA_ARGS__) +#define vmmv_m_b8(...) __riscv_vmmv_m_b8(__VA_ARGS__) +#define vmmv_m_b16(...) __riscv_vmmv_m_b16(__VA_ARGS__) +#define vmmv_m_b32(...) __riscv_vmmv_m_b32(__VA_ARGS__) +#define vmmv_m_b64(...) __riscv_vmmv_m_b64(__VA_ARGS__) +#define vmclr_m_b1(...) __riscv_vmclr_m_b1(__VA_ARGS__) +#define vmclr_m_b2(...) __riscv_vmclr_m_b2(__VA_ARGS__) +#define vmclr_m_b4(...) __riscv_vmclr_m_b4(__VA_ARGS__) +#define vmclr_m_b8(...) __riscv_vmclr_m_b8(__VA_ARGS__) +#define vmclr_m_b16(...) __riscv_vmclr_m_b16(__VA_ARGS__) +#define vmclr_m_b32(...) __riscv_vmclr_m_b32(__VA_ARGS__) +#define vmclr_m_b64(...) __riscv_vmclr_m_b64(__VA_ARGS__) +#define vmset_m_b1(...) __riscv_vmset_m_b1(__VA_ARGS__) +#define vmset_m_b2(...) __riscv_vmset_m_b2(__VA_ARGS__) +#define vmset_m_b4(...) __riscv_vmset_m_b4(__VA_ARGS__) +#define vmset_m_b8(...) __riscv_vmset_m_b8(__VA_ARGS__) +#define vmset_m_b16(...) __riscv_vmset_m_b16(__VA_ARGS__) +#define vmset_m_b32(...) __riscv_vmset_m_b32(__VA_ARGS__) +#define vmset_m_b64(...) __riscv_vmset_m_b64(__VA_ARGS__) +#define vmnot_m_b1(...) __riscv_vmnot_m_b1(__VA_ARGS__) +#define vmnot_m_b2(...) __riscv_vmnot_m_b2(__VA_ARGS__) +#define vmnot_m_b4(...) __riscv_vmnot_m_b4(__VA_ARGS__) +#define vmnot_m_b8(...) __riscv_vmnot_m_b8(__VA_ARGS__) +#define vmnot_m_b16(...) __riscv_vmnot_m_b16(__VA_ARGS__) +#define vmnot_m_b32(...) __riscv_vmnot_m_b32(__VA_ARGS__) +#define vmnot_m_b64(...) __riscv_vmnot_m_b64(__VA_ARGS__) +#define vcpop_m_b1(...) __riscv_vcpop_m_b1(__VA_ARGS__) +#define vcpop_m_b2(...) __riscv_vcpop_m_b2(__VA_ARGS__) +#define vcpop_m_b4(...) __riscv_vcpop_m_b4(__VA_ARGS__) +#define vcpop_m_b8(...) __riscv_vcpop_m_b8(__VA_ARGS__) +#define vcpop_m_b16(...) __riscv_vcpop_m_b16(__VA_ARGS__) +#define vcpop_m_b32(...) __riscv_vcpop_m_b32(__VA_ARGS__) +#define vcpop_m_b64(...) __riscv_vcpop_m_b64(__VA_ARGS__) +// masked functions +#define vcpop_m_b1_m(...) __riscv_vcpop_m_b1_m(__VA_ARGS__) +#define vcpop_m_b2_m(...) __riscv_vcpop_m_b2_m(__VA_ARGS__) +#define vcpop_m_b4_m(...) __riscv_vcpop_m_b4_m(__VA_ARGS__) +#define vcpop_m_b8_m(...) __riscv_vcpop_m_b8_m(__VA_ARGS__) +#define vcpop_m_b16_m(...) __riscv_vcpop_m_b16_m(__VA_ARGS__) +#define vcpop_m_b32_m(...) __riscv_vcpop_m_b32_m(__VA_ARGS__) +#define vcpop_m_b64_m(...) __riscv_vcpop_m_b64_m(__VA_ARGS__) +#define vfirst_m_b1(...) __riscv_vfirst_m_b1(__VA_ARGS__) +#define vfirst_m_b2(...) __riscv_vfirst_m_b2(__VA_ARGS__) +#define vfirst_m_b4(...) __riscv_vfirst_m_b4(__VA_ARGS__) +#define vfirst_m_b8(...) __riscv_vfirst_m_b8(__VA_ARGS__) +#define vfirst_m_b16(...) __riscv_vfirst_m_b16(__VA_ARGS__) +#define vfirst_m_b32(...) __riscv_vfirst_m_b32(__VA_ARGS__) +#define vfirst_m_b64(...) __riscv_vfirst_m_b64(__VA_ARGS__) +// masked functions +#define vfirst_m_b1_m(...) __riscv_vfirst_m_b1_m(__VA_ARGS__) +#define vfirst_m_b2_m(...) __riscv_vfirst_m_b2_m(__VA_ARGS__) +#define vfirst_m_b4_m(...) __riscv_vfirst_m_b4_m(__VA_ARGS__) +#define vfirst_m_b8_m(...) __riscv_vfirst_m_b8_m(__VA_ARGS__) +#define vfirst_m_b16_m(...) __riscv_vfirst_m_b16_m(__VA_ARGS__) +#define vfirst_m_b32_m(...) __riscv_vfirst_m_b32_m(__VA_ARGS__) +#define vfirst_m_b64_m(...) __riscv_vfirst_m_b64_m(__VA_ARGS__) +#define vmsbf_m_b1(...) __riscv_vmsbf_m_b1(__VA_ARGS__) +#define vmsbf_m_b2(...) __riscv_vmsbf_m_b2(__VA_ARGS__) +#define vmsbf_m_b4(...) __riscv_vmsbf_m_b4(__VA_ARGS__) +#define vmsbf_m_b8(...) __riscv_vmsbf_m_b8(__VA_ARGS__) +#define vmsbf_m_b16(...) __riscv_vmsbf_m_b16(__VA_ARGS__) +#define vmsbf_m_b32(...) __riscv_vmsbf_m_b32(__VA_ARGS__) +#define vmsbf_m_b64(...) __riscv_vmsbf_m_b64(__VA_ARGS__) +// masked functions +#define vmsbf_m_b1_m(...) __riscv_vmsbf_m_b1_mu(__VA_ARGS__) +#define vmsbf_m_b2_m(...) __riscv_vmsbf_m_b2_mu(__VA_ARGS__) +#define vmsbf_m_b4_m(...) __riscv_vmsbf_m_b4_mu(__VA_ARGS__) +#define vmsbf_m_b8_m(...) __riscv_vmsbf_m_b8_mu(__VA_ARGS__) +#define vmsbf_m_b16_m(...) __riscv_vmsbf_m_b16_mu(__VA_ARGS__) +#define vmsbf_m_b32_m(...) __riscv_vmsbf_m_b32_mu(__VA_ARGS__) +#define vmsbf_m_b64_m(...) __riscv_vmsbf_m_b64_mu(__VA_ARGS__) +#define vmsif_m_b1(...) __riscv_vmsif_m_b1(__VA_ARGS__) +#define vmsif_m_b2(...) __riscv_vmsif_m_b2(__VA_ARGS__) +#define vmsif_m_b4(...) __riscv_vmsif_m_b4(__VA_ARGS__) +#define vmsif_m_b8(...) __riscv_vmsif_m_b8(__VA_ARGS__) +#define vmsif_m_b16(...) __riscv_vmsif_m_b16(__VA_ARGS__) +#define vmsif_m_b32(...) __riscv_vmsif_m_b32(__VA_ARGS__) +#define vmsif_m_b64(...) __riscv_vmsif_m_b64(__VA_ARGS__) +// masked functions +#define vmsif_m_b1_m(...) __riscv_vmsif_m_b1_mu(__VA_ARGS__) +#define vmsif_m_b2_m(...) __riscv_vmsif_m_b2_mu(__VA_ARGS__) +#define vmsif_m_b4_m(...) __riscv_vmsif_m_b4_mu(__VA_ARGS__) +#define vmsif_m_b8_m(...) __riscv_vmsif_m_b8_mu(__VA_ARGS__) +#define vmsif_m_b16_m(...) __riscv_vmsif_m_b16_mu(__VA_ARGS__) +#define vmsif_m_b32_m(...) __riscv_vmsif_m_b32_mu(__VA_ARGS__) +#define vmsif_m_b64_m(...) __riscv_vmsif_m_b64_mu(__VA_ARGS__) +#define vmsof_m_b1(...) __riscv_vmsof_m_b1(__VA_ARGS__) +#define vmsof_m_b2(...) __riscv_vmsof_m_b2(__VA_ARGS__) +#define vmsof_m_b4(...) __riscv_vmsof_m_b4(__VA_ARGS__) +#define vmsof_m_b8(...) __riscv_vmsof_m_b8(__VA_ARGS__) +#define vmsof_m_b16(...) __riscv_vmsof_m_b16(__VA_ARGS__) +#define vmsof_m_b32(...) __riscv_vmsof_m_b32(__VA_ARGS__) +#define vmsof_m_b64(...) __riscv_vmsof_m_b64(__VA_ARGS__) +// masked functions +#define vmsof_m_b1_m(...) __riscv_vmsof_m_b1_mu(__VA_ARGS__) +#define vmsof_m_b2_m(...) __riscv_vmsof_m_b2_mu(__VA_ARGS__) +#define vmsof_m_b4_m(...) __riscv_vmsof_m_b4_mu(__VA_ARGS__) +#define vmsof_m_b8_m(...) __riscv_vmsof_m_b8_mu(__VA_ARGS__) +#define vmsof_m_b16_m(...) __riscv_vmsof_m_b16_mu(__VA_ARGS__) +#define vmsof_m_b32_m(...) __riscv_vmsof_m_b32_mu(__VA_ARGS__) +#define vmsof_m_b64_m(...) __riscv_vmsof_m_b64_mu(__VA_ARGS__) +#define viota_m_u8mf8(...) __riscv_viota_m_u8mf8(__VA_ARGS__) +#define viota_m_u8mf4(...) __riscv_viota_m_u8mf4(__VA_ARGS__) +#define viota_m_u8mf2(...) __riscv_viota_m_u8mf2(__VA_ARGS__) +#define viota_m_u8m1(...) __riscv_viota_m_u8m1(__VA_ARGS__) +#define viota_m_u8m2(...) __riscv_viota_m_u8m2(__VA_ARGS__) +#define viota_m_u8m4(...) __riscv_viota_m_u8m4(__VA_ARGS__) +#define viota_m_u8m8(...) __riscv_viota_m_u8m8(__VA_ARGS__) +#define viota_m_u16mf4(...) __riscv_viota_m_u16mf4(__VA_ARGS__) +#define viota_m_u16mf2(...) __riscv_viota_m_u16mf2(__VA_ARGS__) +#define viota_m_u16m1(...) __riscv_viota_m_u16m1(__VA_ARGS__) +#define viota_m_u16m2(...) __riscv_viota_m_u16m2(__VA_ARGS__) +#define viota_m_u16m4(...) __riscv_viota_m_u16m4(__VA_ARGS__) +#define viota_m_u16m8(...) __riscv_viota_m_u16m8(__VA_ARGS__) +#define viota_m_u32mf2(...) __riscv_viota_m_u32mf2(__VA_ARGS__) +#define viota_m_u32m1(...) __riscv_viota_m_u32m1(__VA_ARGS__) +#define viota_m_u32m2(...) __riscv_viota_m_u32m2(__VA_ARGS__) +#define viota_m_u32m4(...) __riscv_viota_m_u32m4(__VA_ARGS__) +#define viota_m_u32m8(...) __riscv_viota_m_u32m8(__VA_ARGS__) +#define viota_m_u64m1(...) __riscv_viota_m_u64m1(__VA_ARGS__) +#define viota_m_u64m2(...) __riscv_viota_m_u64m2(__VA_ARGS__) +#define viota_m_u64m4(...) __riscv_viota_m_u64m4(__VA_ARGS__) +#define viota_m_u64m8(...) __riscv_viota_m_u64m8(__VA_ARGS__) +// masked functions +#define viota_m_u8mf8_m(...) __riscv_viota_m_u8mf8_tumu(__VA_ARGS__) +#define viota_m_u8mf4_m(...) __riscv_viota_m_u8mf4_tumu(__VA_ARGS__) +#define viota_m_u8mf2_m(...) __riscv_viota_m_u8mf2_tumu(__VA_ARGS__) +#define viota_m_u8m1_m(...) __riscv_viota_m_u8m1_tumu(__VA_ARGS__) +#define viota_m_u8m2_m(...) __riscv_viota_m_u8m2_tumu(__VA_ARGS__) +#define viota_m_u8m4_m(...) __riscv_viota_m_u8m4_tumu(__VA_ARGS__) +#define viota_m_u8m8_m(...) __riscv_viota_m_u8m8_tumu(__VA_ARGS__) +#define viota_m_u16mf4_m(...) __riscv_viota_m_u16mf4_tumu(__VA_ARGS__) +#define viota_m_u16mf2_m(...) __riscv_viota_m_u16mf2_tumu(__VA_ARGS__) +#define viota_m_u16m1_m(...) __riscv_viota_m_u16m1_tumu(__VA_ARGS__) +#define viota_m_u16m2_m(...) __riscv_viota_m_u16m2_tumu(__VA_ARGS__) +#define viota_m_u16m4_m(...) __riscv_viota_m_u16m4_tumu(__VA_ARGS__) +#define viota_m_u16m8_m(...) __riscv_viota_m_u16m8_tumu(__VA_ARGS__) +#define viota_m_u32mf2_m(...) __riscv_viota_m_u32mf2_tumu(__VA_ARGS__) +#define viota_m_u32m1_m(...) __riscv_viota_m_u32m1_tumu(__VA_ARGS__) +#define viota_m_u32m2_m(...) __riscv_viota_m_u32m2_tumu(__VA_ARGS__) +#define viota_m_u32m4_m(...) __riscv_viota_m_u32m4_tumu(__VA_ARGS__) +#define viota_m_u32m8_m(...) __riscv_viota_m_u32m8_tumu(__VA_ARGS__) +#define viota_m_u64m1_m(...) __riscv_viota_m_u64m1_tumu(__VA_ARGS__) +#define viota_m_u64m2_m(...) __riscv_viota_m_u64m2_tumu(__VA_ARGS__) +#define viota_m_u64m4_m(...) __riscv_viota_m_u64m4_tumu(__VA_ARGS__) +#define viota_m_u64m8_m(...) __riscv_viota_m_u64m8_tumu(__VA_ARGS__) +#define vid_v_u8mf8(...) __riscv_vid_v_u8mf8(__VA_ARGS__) +#define vid_v_u8mf4(...) __riscv_vid_v_u8mf4(__VA_ARGS__) +#define vid_v_u8mf2(...) __riscv_vid_v_u8mf2(__VA_ARGS__) +#define vid_v_u8m1(...) __riscv_vid_v_u8m1(__VA_ARGS__) +#define vid_v_u8m2(...) __riscv_vid_v_u8m2(__VA_ARGS__) +#define vid_v_u8m4(...) __riscv_vid_v_u8m4(__VA_ARGS__) +#define vid_v_u8m8(...) __riscv_vid_v_u8m8(__VA_ARGS__) +#define vid_v_u16mf4(...) __riscv_vid_v_u16mf4(__VA_ARGS__) +#define vid_v_u16mf2(...) __riscv_vid_v_u16mf2(__VA_ARGS__) +#define vid_v_u16m1(...) __riscv_vid_v_u16m1(__VA_ARGS__) +#define vid_v_u16m2(...) __riscv_vid_v_u16m2(__VA_ARGS__) +#define vid_v_u16m4(...) __riscv_vid_v_u16m4(__VA_ARGS__) +#define vid_v_u16m8(...) __riscv_vid_v_u16m8(__VA_ARGS__) +#define vid_v_u32mf2(...) __riscv_vid_v_u32mf2(__VA_ARGS__) +#define vid_v_u32m1(...) __riscv_vid_v_u32m1(__VA_ARGS__) +#define vid_v_u32m2(...) __riscv_vid_v_u32m2(__VA_ARGS__) +#define vid_v_u32m4(...) __riscv_vid_v_u32m4(__VA_ARGS__) +#define vid_v_u32m8(...) __riscv_vid_v_u32m8(__VA_ARGS__) +#define vid_v_u64m1(...) __riscv_vid_v_u64m1(__VA_ARGS__) +#define vid_v_u64m2(...) __riscv_vid_v_u64m2(__VA_ARGS__) +#define vid_v_u64m4(...) __riscv_vid_v_u64m4(__VA_ARGS__) +#define vid_v_u64m8(...) __riscv_vid_v_u64m8(__VA_ARGS__) +// masked functions +#define vid_v_u8mf8_m(...) __riscv_vid_v_u8mf8_tumu(__VA_ARGS__) +#define vid_v_u8mf4_m(...) __riscv_vid_v_u8mf4_tumu(__VA_ARGS__) +#define vid_v_u8mf2_m(...) __riscv_vid_v_u8mf2_tumu(__VA_ARGS__) +#define vid_v_u8m1_m(...) __riscv_vid_v_u8m1_tumu(__VA_ARGS__) +#define vid_v_u8m2_m(...) __riscv_vid_v_u8m2_tumu(__VA_ARGS__) +#define vid_v_u8m4_m(...) __riscv_vid_v_u8m4_tumu(__VA_ARGS__) +#define vid_v_u8m8_m(...) __riscv_vid_v_u8m8_tumu(__VA_ARGS__) +#define vid_v_u16mf4_m(...) __riscv_vid_v_u16mf4_tumu(__VA_ARGS__) +#define vid_v_u16mf2_m(...) __riscv_vid_v_u16mf2_tumu(__VA_ARGS__) +#define vid_v_u16m1_m(...) __riscv_vid_v_u16m1_tumu(__VA_ARGS__) +#define vid_v_u16m2_m(...) __riscv_vid_v_u16m2_tumu(__VA_ARGS__) +#define vid_v_u16m4_m(...) __riscv_vid_v_u16m4_tumu(__VA_ARGS__) +#define vid_v_u16m8_m(...) __riscv_vid_v_u16m8_tumu(__VA_ARGS__) +#define vid_v_u32mf2_m(...) __riscv_vid_v_u32mf2_tumu(__VA_ARGS__) +#define vid_v_u32m1_m(...) __riscv_vid_v_u32m1_tumu(__VA_ARGS__) +#define vid_v_u32m2_m(...) __riscv_vid_v_u32m2_tumu(__VA_ARGS__) +#define vid_v_u32m4_m(...) __riscv_vid_v_u32m4_tumu(__VA_ARGS__) +#define vid_v_u32m8_m(...) __riscv_vid_v_u32m8_tumu(__VA_ARGS__) +#define vid_v_u64m1_m(...) __riscv_vid_v_u64m1_tumu(__VA_ARGS__) +#define vid_v_u64m2_m(...) __riscv_vid_v_u64m2_tumu(__VA_ARGS__) +#define vid_v_u64m4_m(...) __riscv_vid_v_u64m4_tumu(__VA_ARGS__) +#define vid_v_u64m8_m(...) __riscv_vid_v_u64m8_tumu(__VA_ARGS__) +#define vfmv_f_s_f16mf4_f16(...) __riscv_vfmv_f_s_f16mf4_f16(__VA_ARGS__) +#define vfmv_s_f_f16mf4(...) __riscv_vfmv_s_f_f16mf4_tu(__VA_ARGS__) +#define vfmv_f_s_f16mf2_f16(...) __riscv_vfmv_f_s_f16mf2_f16(__VA_ARGS__) +#define vfmv_s_f_f16mf2(...) __riscv_vfmv_s_f_f16mf2_tu(__VA_ARGS__) +#define vfmv_f_s_f16m1_f16(...) __riscv_vfmv_f_s_f16m1_f16(__VA_ARGS__) +#define vfmv_s_f_f16m1(...) __riscv_vfmv_s_f_f16m1_tu(__VA_ARGS__) +#define vfmv_f_s_f16m2_f16(...) __riscv_vfmv_f_s_f16m2_f16(__VA_ARGS__) +#define vfmv_s_f_f16m2(...) __riscv_vfmv_s_f_f16m2_tu(__VA_ARGS__) +#define vfmv_f_s_f16m4_f16(...) __riscv_vfmv_f_s_f16m4_f16(__VA_ARGS__) +#define vfmv_s_f_f16m4(...) __riscv_vfmv_s_f_f16m4_tu(__VA_ARGS__) +#define vfmv_f_s_f16m8_f16(...) __riscv_vfmv_f_s_f16m8_f16(__VA_ARGS__) +#define vfmv_s_f_f16m8(...) __riscv_vfmv_s_f_f16m8_tu(__VA_ARGS__) +#define vfmv_f_s_f32mf2_f32(...) __riscv_vfmv_f_s_f32mf2_f32(__VA_ARGS__) +#define vfmv_s_f_f32mf2(...) __riscv_vfmv_s_f_f32mf2_tu(__VA_ARGS__) +#define vfmv_f_s_f32m1_f32(...) __riscv_vfmv_f_s_f32m1_f32(__VA_ARGS__) +#define vfmv_s_f_f32m1(...) __riscv_vfmv_s_f_f32m1_tu(__VA_ARGS__) +#define vfmv_f_s_f32m2_f32(...) __riscv_vfmv_f_s_f32m2_f32(__VA_ARGS__) +#define vfmv_s_f_f32m2(...) __riscv_vfmv_s_f_f32m2_tu(__VA_ARGS__) +#define vfmv_f_s_f32m4_f32(...) __riscv_vfmv_f_s_f32m4_f32(__VA_ARGS__) +#define vfmv_s_f_f32m4(...) __riscv_vfmv_s_f_f32m4_tu(__VA_ARGS__) +#define vfmv_f_s_f32m8_f32(...) __riscv_vfmv_f_s_f32m8_f32(__VA_ARGS__) +#define vfmv_s_f_f32m8(...) __riscv_vfmv_s_f_f32m8_tu(__VA_ARGS__) +#define vfmv_f_s_f64m1_f64(...) __riscv_vfmv_f_s_f64m1_f64(__VA_ARGS__) +#define vfmv_s_f_f64m1(...) __riscv_vfmv_s_f_f64m1_tu(__VA_ARGS__) +#define vfmv_f_s_f64m2_f64(...) __riscv_vfmv_f_s_f64m2_f64(__VA_ARGS__) +#define vfmv_s_f_f64m2(...) __riscv_vfmv_s_f_f64m2_tu(__VA_ARGS__) +#define vfmv_f_s_f64m4_f64(...) __riscv_vfmv_f_s_f64m4_f64(__VA_ARGS__) +#define vfmv_s_f_f64m4(...) __riscv_vfmv_s_f_f64m4_tu(__VA_ARGS__) +#define vfmv_f_s_f64m8_f64(...) __riscv_vfmv_f_s_f64m8_f64(__VA_ARGS__) +#define vfmv_s_f_f64m8(...) __riscv_vfmv_s_f_f64m8_tu(__VA_ARGS__) +#define vmv_x_s_i8mf8_i8(...) __riscv_vmv_x_s_i8mf8_i8(__VA_ARGS__) +#define vmv_s_x_i8mf8(...) __riscv_vmv_s_x_i8mf8_tu(__VA_ARGS__) +#define vmv_x_s_i8mf4_i8(...) __riscv_vmv_x_s_i8mf4_i8(__VA_ARGS__) +#define vmv_s_x_i8mf4(...) __riscv_vmv_s_x_i8mf4_tu(__VA_ARGS__) +#define vmv_x_s_i8mf2_i8(...) __riscv_vmv_x_s_i8mf2_i8(__VA_ARGS__) +#define vmv_s_x_i8mf2(...) __riscv_vmv_s_x_i8mf2_tu(__VA_ARGS__) +#define vmv_x_s_i8m1_i8(...) __riscv_vmv_x_s_i8m1_i8(__VA_ARGS__) +#define vmv_s_x_i8m1(...) __riscv_vmv_s_x_i8m1_tu(__VA_ARGS__) +#define vmv_x_s_i8m2_i8(...) __riscv_vmv_x_s_i8m2_i8(__VA_ARGS__) +#define vmv_s_x_i8m2(...) __riscv_vmv_s_x_i8m2_tu(__VA_ARGS__) +#define vmv_x_s_i8m4_i8(...) __riscv_vmv_x_s_i8m4_i8(__VA_ARGS__) +#define vmv_s_x_i8m4(...) __riscv_vmv_s_x_i8m4_tu(__VA_ARGS__) +#define vmv_x_s_i8m8_i8(...) __riscv_vmv_x_s_i8m8_i8(__VA_ARGS__) +#define vmv_s_x_i8m8(...) __riscv_vmv_s_x_i8m8_tu(__VA_ARGS__) +#define vmv_x_s_i16mf4_i16(...) __riscv_vmv_x_s_i16mf4_i16(__VA_ARGS__) +#define vmv_s_x_i16mf4(...) __riscv_vmv_s_x_i16mf4_tu(__VA_ARGS__) +#define vmv_x_s_i16mf2_i16(...) __riscv_vmv_x_s_i16mf2_i16(__VA_ARGS__) +#define vmv_s_x_i16mf2(...) __riscv_vmv_s_x_i16mf2_tu(__VA_ARGS__) +#define vmv_x_s_i16m1_i16(...) __riscv_vmv_x_s_i16m1_i16(__VA_ARGS__) +#define vmv_s_x_i16m1(...) __riscv_vmv_s_x_i16m1_tu(__VA_ARGS__) +#define vmv_x_s_i16m2_i16(...) __riscv_vmv_x_s_i16m2_i16(__VA_ARGS__) +#define vmv_s_x_i16m2(...) __riscv_vmv_s_x_i16m2_tu(__VA_ARGS__) +#define vmv_x_s_i16m4_i16(...) __riscv_vmv_x_s_i16m4_i16(__VA_ARGS__) +#define vmv_s_x_i16m4(...) __riscv_vmv_s_x_i16m4_tu(__VA_ARGS__) +#define vmv_x_s_i16m8_i16(...) __riscv_vmv_x_s_i16m8_i16(__VA_ARGS__) +#define vmv_s_x_i16m8(...) __riscv_vmv_s_x_i16m8_tu(__VA_ARGS__) +#define vmv_x_s_i32mf2_i32(...) __riscv_vmv_x_s_i32mf2_i32(__VA_ARGS__) +#define vmv_s_x_i32mf2(...) __riscv_vmv_s_x_i32mf2_tu(__VA_ARGS__) +#define vmv_x_s_i32m1_i32(...) __riscv_vmv_x_s_i32m1_i32(__VA_ARGS__) +#define vmv_s_x_i32m1(...) __riscv_vmv_s_x_i32m1_tu(__VA_ARGS__) +#define vmv_x_s_i32m2_i32(...) __riscv_vmv_x_s_i32m2_i32(__VA_ARGS__) +#define vmv_s_x_i32m2(...) __riscv_vmv_s_x_i32m2_tu(__VA_ARGS__) +#define vmv_x_s_i32m4_i32(...) __riscv_vmv_x_s_i32m4_i32(__VA_ARGS__) +#define vmv_s_x_i32m4(...) __riscv_vmv_s_x_i32m4_tu(__VA_ARGS__) +#define vmv_x_s_i32m8_i32(...) __riscv_vmv_x_s_i32m8_i32(__VA_ARGS__) +#define vmv_s_x_i32m8(...) __riscv_vmv_s_x_i32m8_tu(__VA_ARGS__) +#define vmv_x_s_i64m1_i64(...) __riscv_vmv_x_s_i64m1_i64(__VA_ARGS__) +#define vmv_s_x_i64m1(...) __riscv_vmv_s_x_i64m1_tu(__VA_ARGS__) +#define vmv_x_s_i64m2_i64(...) __riscv_vmv_x_s_i64m2_i64(__VA_ARGS__) +#define vmv_s_x_i64m2(...) __riscv_vmv_s_x_i64m2_tu(__VA_ARGS__) +#define vmv_x_s_i64m4_i64(...) __riscv_vmv_x_s_i64m4_i64(__VA_ARGS__) +#define vmv_s_x_i64m4(...) __riscv_vmv_s_x_i64m4_tu(__VA_ARGS__) +#define vmv_x_s_i64m8_i64(...) __riscv_vmv_x_s_i64m8_i64(__VA_ARGS__) +#define vmv_s_x_i64m8(...) __riscv_vmv_s_x_i64m8_tu(__VA_ARGS__) +#define vmv_x_s_u8mf8_u8(...) __riscv_vmv_x_s_u8mf8_u8(__VA_ARGS__) +#define vmv_s_x_u8mf8(...) __riscv_vmv_s_x_u8mf8_tu(__VA_ARGS__) +#define vmv_x_s_u8mf4_u8(...) __riscv_vmv_x_s_u8mf4_u8(__VA_ARGS__) +#define vmv_s_x_u8mf4(...) __riscv_vmv_s_x_u8mf4_tu(__VA_ARGS__) +#define vmv_x_s_u8mf2_u8(...) __riscv_vmv_x_s_u8mf2_u8(__VA_ARGS__) +#define vmv_s_x_u8mf2(...) __riscv_vmv_s_x_u8mf2_tu(__VA_ARGS__) +#define vmv_x_s_u8m1_u8(...) __riscv_vmv_x_s_u8m1_u8(__VA_ARGS__) +#define vmv_s_x_u8m1(...) __riscv_vmv_s_x_u8m1_tu(__VA_ARGS__) +#define vmv_x_s_u8m2_u8(...) __riscv_vmv_x_s_u8m2_u8(__VA_ARGS__) +#define vmv_s_x_u8m2(...) __riscv_vmv_s_x_u8m2_tu(__VA_ARGS__) +#define vmv_x_s_u8m4_u8(...) __riscv_vmv_x_s_u8m4_u8(__VA_ARGS__) +#define vmv_s_x_u8m4(...) __riscv_vmv_s_x_u8m4_tu(__VA_ARGS__) +#define vmv_x_s_u8m8_u8(...) __riscv_vmv_x_s_u8m8_u8(__VA_ARGS__) +#define vmv_s_x_u8m8(...) __riscv_vmv_s_x_u8m8_tu(__VA_ARGS__) +#define vmv_x_s_u16mf4_u16(...) __riscv_vmv_x_s_u16mf4_u16(__VA_ARGS__) +#define vmv_s_x_u16mf4(...) __riscv_vmv_s_x_u16mf4_tu(__VA_ARGS__) +#define vmv_x_s_u16mf2_u16(...) __riscv_vmv_x_s_u16mf2_u16(__VA_ARGS__) +#define vmv_s_x_u16mf2(...) __riscv_vmv_s_x_u16mf2_tu(__VA_ARGS__) +#define vmv_x_s_u16m1_u16(...) __riscv_vmv_x_s_u16m1_u16(__VA_ARGS__) +#define vmv_s_x_u16m1(...) __riscv_vmv_s_x_u16m1_tu(__VA_ARGS__) +#define vmv_x_s_u16m2_u16(...) __riscv_vmv_x_s_u16m2_u16(__VA_ARGS__) +#define vmv_s_x_u16m2(...) __riscv_vmv_s_x_u16m2_tu(__VA_ARGS__) +#define vmv_x_s_u16m4_u16(...) __riscv_vmv_x_s_u16m4_u16(__VA_ARGS__) +#define vmv_s_x_u16m4(...) __riscv_vmv_s_x_u16m4_tu(__VA_ARGS__) +#define vmv_x_s_u16m8_u16(...) __riscv_vmv_x_s_u16m8_u16(__VA_ARGS__) +#define vmv_s_x_u16m8(...) __riscv_vmv_s_x_u16m8_tu(__VA_ARGS__) +#define vmv_x_s_u32mf2_u32(...) __riscv_vmv_x_s_u32mf2_u32(__VA_ARGS__) +#define vmv_s_x_u32mf2(...) __riscv_vmv_s_x_u32mf2_tu(__VA_ARGS__) +#define vmv_x_s_u32m1_u32(...) __riscv_vmv_x_s_u32m1_u32(__VA_ARGS__) +#define vmv_s_x_u32m1(...) __riscv_vmv_s_x_u32m1_tu(__VA_ARGS__) +#define vmv_x_s_u32m2_u32(...) __riscv_vmv_x_s_u32m2_u32(__VA_ARGS__) +#define vmv_s_x_u32m2(...) __riscv_vmv_s_x_u32m2_tu(__VA_ARGS__) +#define vmv_x_s_u32m4_u32(...) __riscv_vmv_x_s_u32m4_u32(__VA_ARGS__) +#define vmv_s_x_u32m4(...) __riscv_vmv_s_x_u32m4_tu(__VA_ARGS__) +#define vmv_x_s_u32m8_u32(...) __riscv_vmv_x_s_u32m8_u32(__VA_ARGS__) +#define vmv_s_x_u32m8(...) __riscv_vmv_s_x_u32m8_tu(__VA_ARGS__) +#define vmv_x_s_u64m1_u64(...) __riscv_vmv_x_s_u64m1_u64(__VA_ARGS__) +#define vmv_s_x_u64m1(...) __riscv_vmv_s_x_u64m1_tu(__VA_ARGS__) +#define vmv_x_s_u64m2_u64(...) __riscv_vmv_x_s_u64m2_u64(__VA_ARGS__) +#define vmv_s_x_u64m2(...) __riscv_vmv_s_x_u64m2_tu(__VA_ARGS__) +#define vmv_x_s_u64m4_u64(...) __riscv_vmv_x_s_u64m4_u64(__VA_ARGS__) +#define vmv_s_x_u64m4(...) __riscv_vmv_s_x_u64m4_tu(__VA_ARGS__) +#define vmv_x_s_u64m8_u64(...) __riscv_vmv_x_s_u64m8_u64(__VA_ARGS__) +#define vmv_s_x_u64m8(...) __riscv_vmv_s_x_u64m8_tu(__VA_ARGS__) +#define vslideup_vx_f16mf4(...) __riscv_vslideup_vx_f16mf4_tu(__VA_ARGS__) +#define vslideup_vx_f16mf2(...) __riscv_vslideup_vx_f16mf2_tu(__VA_ARGS__) +#define vslideup_vx_f16m1(...) __riscv_vslideup_vx_f16m1_tu(__VA_ARGS__) +#define vslideup_vx_f16m2(...) __riscv_vslideup_vx_f16m2_tu(__VA_ARGS__) +#define vslideup_vx_f16m4(...) __riscv_vslideup_vx_f16m4_tu(__VA_ARGS__) +#define vslideup_vx_f16m8(...) __riscv_vslideup_vx_f16m8_tu(__VA_ARGS__) +#define vslideup_vx_f32mf2(...) __riscv_vslideup_vx_f32mf2_tu(__VA_ARGS__) +#define vslideup_vx_f32m1(...) __riscv_vslideup_vx_f32m1_tu(__VA_ARGS__) +#define vslideup_vx_f32m2(...) __riscv_vslideup_vx_f32m2_tu(__VA_ARGS__) +#define vslideup_vx_f32m4(...) __riscv_vslideup_vx_f32m4_tu(__VA_ARGS__) +#define vslideup_vx_f32m8(...) __riscv_vslideup_vx_f32m8_tu(__VA_ARGS__) +#define vslideup_vx_f64m1(...) __riscv_vslideup_vx_f64m1_tu(__VA_ARGS__) +#define vslideup_vx_f64m2(...) __riscv_vslideup_vx_f64m2_tu(__VA_ARGS__) +#define vslideup_vx_f64m4(...) __riscv_vslideup_vx_f64m4_tu(__VA_ARGS__) +#define vslideup_vx_f64m8(...) __riscv_vslideup_vx_f64m8_tu(__VA_ARGS__) +#define vslideup_vx_i8mf8(...) __riscv_vslideup_vx_i8mf8_tu(__VA_ARGS__) +#define vslideup_vx_i8mf4(...) __riscv_vslideup_vx_i8mf4_tu(__VA_ARGS__) +#define vslideup_vx_i8mf2(...) __riscv_vslideup_vx_i8mf2_tu(__VA_ARGS__) +#define vslideup_vx_i8m1(...) __riscv_vslideup_vx_i8m1_tu(__VA_ARGS__) +#define vslideup_vx_i8m2(...) __riscv_vslideup_vx_i8m2_tu(__VA_ARGS__) +#define vslideup_vx_i8m4(...) __riscv_vslideup_vx_i8m4_tu(__VA_ARGS__) +#define vslideup_vx_i8m8(...) __riscv_vslideup_vx_i8m8_tu(__VA_ARGS__) +#define vslideup_vx_i16mf4(...) __riscv_vslideup_vx_i16mf4_tu(__VA_ARGS__) +#define vslideup_vx_i16mf2(...) __riscv_vslideup_vx_i16mf2_tu(__VA_ARGS__) +#define vslideup_vx_i16m1(...) __riscv_vslideup_vx_i16m1_tu(__VA_ARGS__) +#define vslideup_vx_i16m2(...) __riscv_vslideup_vx_i16m2_tu(__VA_ARGS__) +#define vslideup_vx_i16m4(...) __riscv_vslideup_vx_i16m4_tu(__VA_ARGS__) +#define vslideup_vx_i16m8(...) __riscv_vslideup_vx_i16m8_tu(__VA_ARGS__) +#define vslideup_vx_i32mf2(...) __riscv_vslideup_vx_i32mf2_tu(__VA_ARGS__) +#define vslideup_vx_i32m1(...) __riscv_vslideup_vx_i32m1_tu(__VA_ARGS__) +#define vslideup_vx_i32m2(...) __riscv_vslideup_vx_i32m2_tu(__VA_ARGS__) +#define vslideup_vx_i32m4(...) __riscv_vslideup_vx_i32m4_tu(__VA_ARGS__) +#define vslideup_vx_i32m8(...) __riscv_vslideup_vx_i32m8_tu(__VA_ARGS__) +#define vslideup_vx_i64m1(...) __riscv_vslideup_vx_i64m1_tu(__VA_ARGS__) +#define vslideup_vx_i64m2(...) __riscv_vslideup_vx_i64m2_tu(__VA_ARGS__) +#define vslideup_vx_i64m4(...) __riscv_vslideup_vx_i64m4_tu(__VA_ARGS__) +#define vslideup_vx_i64m8(...) __riscv_vslideup_vx_i64m8_tu(__VA_ARGS__) +#define vslideup_vx_u8mf8(...) __riscv_vslideup_vx_u8mf8_tu(__VA_ARGS__) +#define vslideup_vx_u8mf4(...) __riscv_vslideup_vx_u8mf4_tu(__VA_ARGS__) +#define vslideup_vx_u8mf2(...) __riscv_vslideup_vx_u8mf2_tu(__VA_ARGS__) +#define vslideup_vx_u8m1(...) __riscv_vslideup_vx_u8m1_tu(__VA_ARGS__) +#define vslideup_vx_u8m2(...) __riscv_vslideup_vx_u8m2_tu(__VA_ARGS__) +#define vslideup_vx_u8m4(...) __riscv_vslideup_vx_u8m4_tu(__VA_ARGS__) +#define vslideup_vx_u8m8(...) __riscv_vslideup_vx_u8m8_tu(__VA_ARGS__) +#define vslideup_vx_u16mf4(...) __riscv_vslideup_vx_u16mf4_tu(__VA_ARGS__) +#define vslideup_vx_u16mf2(...) __riscv_vslideup_vx_u16mf2_tu(__VA_ARGS__) +#define vslideup_vx_u16m1(...) __riscv_vslideup_vx_u16m1_tu(__VA_ARGS__) +#define vslideup_vx_u16m2(...) __riscv_vslideup_vx_u16m2_tu(__VA_ARGS__) +#define vslideup_vx_u16m4(...) __riscv_vslideup_vx_u16m4_tu(__VA_ARGS__) +#define vslideup_vx_u16m8(...) __riscv_vslideup_vx_u16m8_tu(__VA_ARGS__) +#define vslideup_vx_u32mf2(...) __riscv_vslideup_vx_u32mf2_tu(__VA_ARGS__) +#define vslideup_vx_u32m1(...) __riscv_vslideup_vx_u32m1_tu(__VA_ARGS__) +#define vslideup_vx_u32m2(...) __riscv_vslideup_vx_u32m2_tu(__VA_ARGS__) +#define vslideup_vx_u32m4(...) __riscv_vslideup_vx_u32m4_tu(__VA_ARGS__) +#define vslideup_vx_u32m8(...) __riscv_vslideup_vx_u32m8_tu(__VA_ARGS__) +#define vslideup_vx_u64m1(...) __riscv_vslideup_vx_u64m1_tu(__VA_ARGS__) +#define vslideup_vx_u64m2(...) __riscv_vslideup_vx_u64m2_tu(__VA_ARGS__) +#define vslideup_vx_u64m4(...) __riscv_vslideup_vx_u64m4_tu(__VA_ARGS__) +#define vslideup_vx_u64m8(...) __riscv_vslideup_vx_u64m8_tu(__VA_ARGS__) +// masked functions +#define vslideup_vx_f16mf4_m(...) __riscv_vslideup_vx_f16mf4_tumu(__VA_ARGS__) +#define vslideup_vx_f16mf2_m(...) __riscv_vslideup_vx_f16mf2_tumu(__VA_ARGS__) +#define vslideup_vx_f16m1_m(...) __riscv_vslideup_vx_f16m1_tumu(__VA_ARGS__) +#define vslideup_vx_f16m2_m(...) __riscv_vslideup_vx_f16m2_tumu(__VA_ARGS__) +#define vslideup_vx_f16m4_m(...) __riscv_vslideup_vx_f16m4_tumu(__VA_ARGS__) +#define vslideup_vx_f16m8_m(...) __riscv_vslideup_vx_f16m8_tumu(__VA_ARGS__) +#define vslideup_vx_f32mf2_m(...) __riscv_vslideup_vx_f32mf2_tumu(__VA_ARGS__) +#define vslideup_vx_f32m1_m(...) __riscv_vslideup_vx_f32m1_tumu(__VA_ARGS__) +#define vslideup_vx_f32m2_m(...) __riscv_vslideup_vx_f32m2_tumu(__VA_ARGS__) +#define vslideup_vx_f32m4_m(...) __riscv_vslideup_vx_f32m4_tumu(__VA_ARGS__) +#define vslideup_vx_f32m8_m(...) __riscv_vslideup_vx_f32m8_tumu(__VA_ARGS__) +#define vslideup_vx_f64m1_m(...) __riscv_vslideup_vx_f64m1_tumu(__VA_ARGS__) +#define vslideup_vx_f64m2_m(...) __riscv_vslideup_vx_f64m2_tumu(__VA_ARGS__) +#define vslideup_vx_f64m4_m(...) __riscv_vslideup_vx_f64m4_tumu(__VA_ARGS__) +#define vslideup_vx_f64m8_m(...) __riscv_vslideup_vx_f64m8_tumu(__VA_ARGS__) +#define vslideup_vx_i8mf8_m(...) __riscv_vslideup_vx_i8mf8_tumu(__VA_ARGS__) +#define vslideup_vx_i8mf4_m(...) __riscv_vslideup_vx_i8mf4_tumu(__VA_ARGS__) +#define vslideup_vx_i8mf2_m(...) __riscv_vslideup_vx_i8mf2_tumu(__VA_ARGS__) +#define vslideup_vx_i8m1_m(...) __riscv_vslideup_vx_i8m1_tumu(__VA_ARGS__) +#define vslideup_vx_i8m2_m(...) __riscv_vslideup_vx_i8m2_tumu(__VA_ARGS__) +#define vslideup_vx_i8m4_m(...) __riscv_vslideup_vx_i8m4_tumu(__VA_ARGS__) +#define vslideup_vx_i8m8_m(...) __riscv_vslideup_vx_i8m8_tumu(__VA_ARGS__) +#define vslideup_vx_i16mf4_m(...) __riscv_vslideup_vx_i16mf4_tumu(__VA_ARGS__) +#define vslideup_vx_i16mf2_m(...) __riscv_vslideup_vx_i16mf2_tumu(__VA_ARGS__) +#define vslideup_vx_i16m1_m(...) __riscv_vslideup_vx_i16m1_tumu(__VA_ARGS__) +#define vslideup_vx_i16m2_m(...) __riscv_vslideup_vx_i16m2_tumu(__VA_ARGS__) +#define vslideup_vx_i16m4_m(...) __riscv_vslideup_vx_i16m4_tumu(__VA_ARGS__) +#define vslideup_vx_i16m8_m(...) __riscv_vslideup_vx_i16m8_tumu(__VA_ARGS__) +#define vslideup_vx_i32mf2_m(...) __riscv_vslideup_vx_i32mf2_tumu(__VA_ARGS__) +#define vslideup_vx_i32m1_m(...) __riscv_vslideup_vx_i32m1_tumu(__VA_ARGS__) +#define vslideup_vx_i32m2_m(...) __riscv_vslideup_vx_i32m2_tumu(__VA_ARGS__) +#define vslideup_vx_i32m4_m(...) __riscv_vslideup_vx_i32m4_tumu(__VA_ARGS__) +#define vslideup_vx_i32m8_m(...) __riscv_vslideup_vx_i32m8_tumu(__VA_ARGS__) +#define vslideup_vx_i64m1_m(...) __riscv_vslideup_vx_i64m1_tumu(__VA_ARGS__) +#define vslideup_vx_i64m2_m(...) __riscv_vslideup_vx_i64m2_tumu(__VA_ARGS__) +#define vslideup_vx_i64m4_m(...) __riscv_vslideup_vx_i64m4_tumu(__VA_ARGS__) +#define vslideup_vx_i64m8_m(...) __riscv_vslideup_vx_i64m8_tumu(__VA_ARGS__) +#define vslideup_vx_u8mf8_m(...) __riscv_vslideup_vx_u8mf8_tumu(__VA_ARGS__) +#define vslideup_vx_u8mf4_m(...) __riscv_vslideup_vx_u8mf4_tumu(__VA_ARGS__) +#define vslideup_vx_u8mf2_m(...) __riscv_vslideup_vx_u8mf2_tumu(__VA_ARGS__) +#define vslideup_vx_u8m1_m(...) __riscv_vslideup_vx_u8m1_tumu(__VA_ARGS__) +#define vslideup_vx_u8m2_m(...) __riscv_vslideup_vx_u8m2_tumu(__VA_ARGS__) +#define vslideup_vx_u8m4_m(...) __riscv_vslideup_vx_u8m4_tumu(__VA_ARGS__) +#define vslideup_vx_u8m8_m(...) __riscv_vslideup_vx_u8m8_tumu(__VA_ARGS__) +#define vslideup_vx_u16mf4_m(...) __riscv_vslideup_vx_u16mf4_tumu(__VA_ARGS__) +#define vslideup_vx_u16mf2_m(...) __riscv_vslideup_vx_u16mf2_tumu(__VA_ARGS__) +#define vslideup_vx_u16m1_m(...) __riscv_vslideup_vx_u16m1_tumu(__VA_ARGS__) +#define vslideup_vx_u16m2_m(...) __riscv_vslideup_vx_u16m2_tumu(__VA_ARGS__) +#define vslideup_vx_u16m4_m(...) __riscv_vslideup_vx_u16m4_tumu(__VA_ARGS__) +#define vslideup_vx_u16m8_m(...) __riscv_vslideup_vx_u16m8_tumu(__VA_ARGS__) +#define vslideup_vx_u32mf2_m(...) __riscv_vslideup_vx_u32mf2_tumu(__VA_ARGS__) +#define vslideup_vx_u32m1_m(...) __riscv_vslideup_vx_u32m1_tumu(__VA_ARGS__) +#define vslideup_vx_u32m2_m(...) __riscv_vslideup_vx_u32m2_tumu(__VA_ARGS__) +#define vslideup_vx_u32m4_m(...) __riscv_vslideup_vx_u32m4_tumu(__VA_ARGS__) +#define vslideup_vx_u32m8_m(...) __riscv_vslideup_vx_u32m8_tumu(__VA_ARGS__) +#define vslideup_vx_u64m1_m(...) __riscv_vslideup_vx_u64m1_tumu(__VA_ARGS__) +#define vslideup_vx_u64m2_m(...) __riscv_vslideup_vx_u64m2_tumu(__VA_ARGS__) +#define vslideup_vx_u64m4_m(...) __riscv_vslideup_vx_u64m4_tumu(__VA_ARGS__) +#define vslideup_vx_u64m8_m(...) __riscv_vslideup_vx_u64m8_tumu(__VA_ARGS__) +#define vslidedown_vx_f16mf4(...) __riscv_vslidedown_vx_f16mf4_tu(__VA_ARGS__) +#define vslidedown_vx_f16mf2(...) __riscv_vslidedown_vx_f16mf2_tu(__VA_ARGS__) +#define vslidedown_vx_f16m1(...) __riscv_vslidedown_vx_f16m1_tu(__VA_ARGS__) +#define vslidedown_vx_f16m2(...) __riscv_vslidedown_vx_f16m2_tu(__VA_ARGS__) +#define vslidedown_vx_f16m4(...) __riscv_vslidedown_vx_f16m4_tu(__VA_ARGS__) +#define vslidedown_vx_f16m8(...) __riscv_vslidedown_vx_f16m8_tu(__VA_ARGS__) +#define vslidedown_vx_f32mf2(...) __riscv_vslidedown_vx_f32mf2_tu(__VA_ARGS__) +#define vslidedown_vx_f32m1(...) __riscv_vslidedown_vx_f32m1_tu(__VA_ARGS__) +#define vslidedown_vx_f32m2(...) __riscv_vslidedown_vx_f32m2_tu(__VA_ARGS__) +#define vslidedown_vx_f32m4(...) __riscv_vslidedown_vx_f32m4_tu(__VA_ARGS__) +#define vslidedown_vx_f32m8(...) __riscv_vslidedown_vx_f32m8_tu(__VA_ARGS__) +#define vslidedown_vx_f64m1(...) __riscv_vslidedown_vx_f64m1_tu(__VA_ARGS__) +#define vslidedown_vx_f64m2(...) __riscv_vslidedown_vx_f64m2_tu(__VA_ARGS__) +#define vslidedown_vx_f64m4(...) __riscv_vslidedown_vx_f64m4_tu(__VA_ARGS__) +#define vslidedown_vx_f64m8(...) __riscv_vslidedown_vx_f64m8_tu(__VA_ARGS__) +#define vslidedown_vx_i8mf8(...) __riscv_vslidedown_vx_i8mf8_tu(__VA_ARGS__) +#define vslidedown_vx_i8mf4(...) __riscv_vslidedown_vx_i8mf4_tu(__VA_ARGS__) +#define vslidedown_vx_i8mf2(...) __riscv_vslidedown_vx_i8mf2_tu(__VA_ARGS__) +#define vslidedown_vx_i8m1(...) __riscv_vslidedown_vx_i8m1_tu(__VA_ARGS__) +#define vslidedown_vx_i8m2(...) __riscv_vslidedown_vx_i8m2_tu(__VA_ARGS__) +#define vslidedown_vx_i8m4(...) __riscv_vslidedown_vx_i8m4_tu(__VA_ARGS__) +#define vslidedown_vx_i8m8(...) __riscv_vslidedown_vx_i8m8_tu(__VA_ARGS__) +#define vslidedown_vx_i16mf4(...) __riscv_vslidedown_vx_i16mf4_tu(__VA_ARGS__) +#define vslidedown_vx_i16mf2(...) __riscv_vslidedown_vx_i16mf2_tu(__VA_ARGS__) +#define vslidedown_vx_i16m1(...) __riscv_vslidedown_vx_i16m1_tu(__VA_ARGS__) +#define vslidedown_vx_i16m2(...) __riscv_vslidedown_vx_i16m2_tu(__VA_ARGS__) +#define vslidedown_vx_i16m4(...) __riscv_vslidedown_vx_i16m4_tu(__VA_ARGS__) +#define vslidedown_vx_i16m8(...) __riscv_vslidedown_vx_i16m8_tu(__VA_ARGS__) +#define vslidedown_vx_i32mf2(...) __riscv_vslidedown_vx_i32mf2_tu(__VA_ARGS__) +#define vslidedown_vx_i32m1(...) __riscv_vslidedown_vx_i32m1_tu(__VA_ARGS__) +#define vslidedown_vx_i32m2(...) __riscv_vslidedown_vx_i32m2_tu(__VA_ARGS__) +#define vslidedown_vx_i32m4(...) __riscv_vslidedown_vx_i32m4_tu(__VA_ARGS__) +#define vslidedown_vx_i32m8(...) __riscv_vslidedown_vx_i32m8_tu(__VA_ARGS__) +#define vslidedown_vx_i64m1(...) __riscv_vslidedown_vx_i64m1_tu(__VA_ARGS__) +#define vslidedown_vx_i64m2(...) __riscv_vslidedown_vx_i64m2_tu(__VA_ARGS__) +#define vslidedown_vx_i64m4(...) __riscv_vslidedown_vx_i64m4_tu(__VA_ARGS__) +#define vslidedown_vx_i64m8(...) __riscv_vslidedown_vx_i64m8_tu(__VA_ARGS__) +#define vslidedown_vx_u8mf8(...) __riscv_vslidedown_vx_u8mf8_tu(__VA_ARGS__) +#define vslidedown_vx_u8mf4(...) __riscv_vslidedown_vx_u8mf4_tu(__VA_ARGS__) +#define vslidedown_vx_u8mf2(...) __riscv_vslidedown_vx_u8mf2_tu(__VA_ARGS__) +#define vslidedown_vx_u8m1(...) __riscv_vslidedown_vx_u8m1_tu(__VA_ARGS__) +#define vslidedown_vx_u8m2(...) __riscv_vslidedown_vx_u8m2_tu(__VA_ARGS__) +#define vslidedown_vx_u8m4(...) __riscv_vslidedown_vx_u8m4_tu(__VA_ARGS__) +#define vslidedown_vx_u8m8(...) __riscv_vslidedown_vx_u8m8_tu(__VA_ARGS__) +#define vslidedown_vx_u16mf4(...) __riscv_vslidedown_vx_u16mf4_tu(__VA_ARGS__) +#define vslidedown_vx_u16mf2(...) __riscv_vslidedown_vx_u16mf2_tu(__VA_ARGS__) +#define vslidedown_vx_u16m1(...) __riscv_vslidedown_vx_u16m1_tu(__VA_ARGS__) +#define vslidedown_vx_u16m2(...) __riscv_vslidedown_vx_u16m2_tu(__VA_ARGS__) +#define vslidedown_vx_u16m4(...) __riscv_vslidedown_vx_u16m4_tu(__VA_ARGS__) +#define vslidedown_vx_u16m8(...) __riscv_vslidedown_vx_u16m8_tu(__VA_ARGS__) +#define vslidedown_vx_u32mf2(...) __riscv_vslidedown_vx_u32mf2_tu(__VA_ARGS__) +#define vslidedown_vx_u32m1(...) __riscv_vslidedown_vx_u32m1_tu(__VA_ARGS__) +#define vslidedown_vx_u32m2(...) __riscv_vslidedown_vx_u32m2_tu(__VA_ARGS__) +#define vslidedown_vx_u32m4(...) __riscv_vslidedown_vx_u32m4_tu(__VA_ARGS__) +#define vslidedown_vx_u32m8(...) __riscv_vslidedown_vx_u32m8_tu(__VA_ARGS__) +#define vslidedown_vx_u64m1(...) __riscv_vslidedown_vx_u64m1_tu(__VA_ARGS__) +#define vslidedown_vx_u64m2(...) __riscv_vslidedown_vx_u64m2_tu(__VA_ARGS__) +#define vslidedown_vx_u64m4(...) __riscv_vslidedown_vx_u64m4_tu(__VA_ARGS__) +#define vslidedown_vx_u64m8(...) __riscv_vslidedown_vx_u64m8_tu(__VA_ARGS__) +// masked functions +#define vslidedown_vx_f16mf4_m(...) __riscv_vslidedown_vx_f16mf4_tumu(__VA_ARGS__) +#define vslidedown_vx_f16mf2_m(...) __riscv_vslidedown_vx_f16mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_f16m1_m(...) __riscv_vslidedown_vx_f16m1_tumu(__VA_ARGS__) +#define vslidedown_vx_f16m2_m(...) __riscv_vslidedown_vx_f16m2_tumu(__VA_ARGS__) +#define vslidedown_vx_f16m4_m(...) __riscv_vslidedown_vx_f16m4_tumu(__VA_ARGS__) +#define vslidedown_vx_f16m8_m(...) __riscv_vslidedown_vx_f16m8_tumu(__VA_ARGS__) +#define vslidedown_vx_f32mf2_m(...) __riscv_vslidedown_vx_f32mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_f32m1_m(...) __riscv_vslidedown_vx_f32m1_tumu(__VA_ARGS__) +#define vslidedown_vx_f32m2_m(...) __riscv_vslidedown_vx_f32m2_tumu(__VA_ARGS__) +#define vslidedown_vx_f32m4_m(...) __riscv_vslidedown_vx_f32m4_tumu(__VA_ARGS__) +#define vslidedown_vx_f32m8_m(...) __riscv_vslidedown_vx_f32m8_tumu(__VA_ARGS__) +#define vslidedown_vx_f64m1_m(...) __riscv_vslidedown_vx_f64m1_tumu(__VA_ARGS__) +#define vslidedown_vx_f64m2_m(...) __riscv_vslidedown_vx_f64m2_tumu(__VA_ARGS__) +#define vslidedown_vx_f64m4_m(...) __riscv_vslidedown_vx_f64m4_tumu(__VA_ARGS__) +#define vslidedown_vx_f64m8_m(...) __riscv_vslidedown_vx_f64m8_tumu(__VA_ARGS__) +#define vslidedown_vx_i8mf8_m(...) __riscv_vslidedown_vx_i8mf8_tumu(__VA_ARGS__) +#define vslidedown_vx_i8mf4_m(...) __riscv_vslidedown_vx_i8mf4_tumu(__VA_ARGS__) +#define vslidedown_vx_i8mf2_m(...) __riscv_vslidedown_vx_i8mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_i8m1_m(...) __riscv_vslidedown_vx_i8m1_tumu(__VA_ARGS__) +#define vslidedown_vx_i8m2_m(...) __riscv_vslidedown_vx_i8m2_tumu(__VA_ARGS__) +#define vslidedown_vx_i8m4_m(...) __riscv_vslidedown_vx_i8m4_tumu(__VA_ARGS__) +#define vslidedown_vx_i8m8_m(...) __riscv_vslidedown_vx_i8m8_tumu(__VA_ARGS__) +#define vslidedown_vx_i16mf4_m(...) __riscv_vslidedown_vx_i16mf4_tumu(__VA_ARGS__) +#define vslidedown_vx_i16mf2_m(...) __riscv_vslidedown_vx_i16mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_i16m1_m(...) __riscv_vslidedown_vx_i16m1_tumu(__VA_ARGS__) +#define vslidedown_vx_i16m2_m(...) __riscv_vslidedown_vx_i16m2_tumu(__VA_ARGS__) +#define vslidedown_vx_i16m4_m(...) __riscv_vslidedown_vx_i16m4_tumu(__VA_ARGS__) +#define vslidedown_vx_i16m8_m(...) __riscv_vslidedown_vx_i16m8_tumu(__VA_ARGS__) +#define vslidedown_vx_i32mf2_m(...) __riscv_vslidedown_vx_i32mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_i32m1_m(...) __riscv_vslidedown_vx_i32m1_tumu(__VA_ARGS__) +#define vslidedown_vx_i32m2_m(...) __riscv_vslidedown_vx_i32m2_tumu(__VA_ARGS__) +#define vslidedown_vx_i32m4_m(...) __riscv_vslidedown_vx_i32m4_tumu(__VA_ARGS__) +#define vslidedown_vx_i32m8_m(...) __riscv_vslidedown_vx_i32m8_tumu(__VA_ARGS__) +#define vslidedown_vx_i64m1_m(...) __riscv_vslidedown_vx_i64m1_tumu(__VA_ARGS__) +#define vslidedown_vx_i64m2_m(...) __riscv_vslidedown_vx_i64m2_tumu(__VA_ARGS__) +#define vslidedown_vx_i64m4_m(...) __riscv_vslidedown_vx_i64m4_tumu(__VA_ARGS__) +#define vslidedown_vx_i64m8_m(...) __riscv_vslidedown_vx_i64m8_tumu(__VA_ARGS__) +#define vslidedown_vx_u8mf8_m(...) __riscv_vslidedown_vx_u8mf8_tumu(__VA_ARGS__) +#define vslidedown_vx_u8mf4_m(...) __riscv_vslidedown_vx_u8mf4_tumu(__VA_ARGS__) +#define vslidedown_vx_u8mf2_m(...) __riscv_vslidedown_vx_u8mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_u8m1_m(...) __riscv_vslidedown_vx_u8m1_tumu(__VA_ARGS__) +#define vslidedown_vx_u8m2_m(...) __riscv_vslidedown_vx_u8m2_tumu(__VA_ARGS__) +#define vslidedown_vx_u8m4_m(...) __riscv_vslidedown_vx_u8m4_tumu(__VA_ARGS__) +#define vslidedown_vx_u8m8_m(...) __riscv_vslidedown_vx_u8m8_tumu(__VA_ARGS__) +#define vslidedown_vx_u16mf4_m(...) __riscv_vslidedown_vx_u16mf4_tumu(__VA_ARGS__) +#define vslidedown_vx_u16mf2_m(...) __riscv_vslidedown_vx_u16mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_u16m1_m(...) __riscv_vslidedown_vx_u16m1_tumu(__VA_ARGS__) +#define vslidedown_vx_u16m2_m(...) __riscv_vslidedown_vx_u16m2_tumu(__VA_ARGS__) +#define vslidedown_vx_u16m4_m(...) __riscv_vslidedown_vx_u16m4_tumu(__VA_ARGS__) +#define vslidedown_vx_u16m8_m(...) __riscv_vslidedown_vx_u16m8_tumu(__VA_ARGS__) +#define vslidedown_vx_u32mf2_m(...) __riscv_vslidedown_vx_u32mf2_tumu(__VA_ARGS__) +#define vslidedown_vx_u32m1_m(...) __riscv_vslidedown_vx_u32m1_tumu(__VA_ARGS__) +#define vslidedown_vx_u32m2_m(...) __riscv_vslidedown_vx_u32m2_tumu(__VA_ARGS__) +#define vslidedown_vx_u32m4_m(...) __riscv_vslidedown_vx_u32m4_tumu(__VA_ARGS__) +#define vslidedown_vx_u32m8_m(...) __riscv_vslidedown_vx_u32m8_tumu(__VA_ARGS__) +#define vslidedown_vx_u64m1_m(...) __riscv_vslidedown_vx_u64m1_tumu(__VA_ARGS__) +#define vslidedown_vx_u64m2_m(...) __riscv_vslidedown_vx_u64m2_tumu(__VA_ARGS__) +#define vslidedown_vx_u64m4_m(...) __riscv_vslidedown_vx_u64m4_tumu(__VA_ARGS__) +#define vslidedown_vx_u64m8_m(...) __riscv_vslidedown_vx_u64m8_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16mf4(...) __riscv_vfslide1up_vf_f16mf4(__VA_ARGS__) +#define vfslide1up_vf_f16mf2(...) __riscv_vfslide1up_vf_f16mf2(__VA_ARGS__) +#define vfslide1up_vf_f16m1(...) __riscv_vfslide1up_vf_f16m1(__VA_ARGS__) +#define vfslide1up_vf_f16m2(...) __riscv_vfslide1up_vf_f16m2(__VA_ARGS__) +#define vfslide1up_vf_f16m4(...) __riscv_vfslide1up_vf_f16m4(__VA_ARGS__) +#define vfslide1up_vf_f16m8(...) __riscv_vfslide1up_vf_f16m8(__VA_ARGS__) +#define vfslide1up_vf_f32mf2(...) __riscv_vfslide1up_vf_f32mf2(__VA_ARGS__) +#define vfslide1up_vf_f32m1(...) __riscv_vfslide1up_vf_f32m1(__VA_ARGS__) +#define vfslide1up_vf_f32m2(...) __riscv_vfslide1up_vf_f32m2(__VA_ARGS__) +#define vfslide1up_vf_f32m4(...) __riscv_vfslide1up_vf_f32m4(__VA_ARGS__) +#define vfslide1up_vf_f32m8(...) __riscv_vfslide1up_vf_f32m8(__VA_ARGS__) +#define vfslide1up_vf_f64m1(...) __riscv_vfslide1up_vf_f64m1(__VA_ARGS__) +#define vfslide1up_vf_f64m2(...) __riscv_vfslide1up_vf_f64m2(__VA_ARGS__) +#define vfslide1up_vf_f64m4(...) __riscv_vfslide1up_vf_f64m4(__VA_ARGS__) +#define vfslide1up_vf_f64m8(...) __riscv_vfslide1up_vf_f64m8(__VA_ARGS__) +#define vfslide1down_vf_f16mf4(...) __riscv_vfslide1down_vf_f16mf4(__VA_ARGS__) +#define vfslide1down_vf_f16mf2(...) __riscv_vfslide1down_vf_f16mf2(__VA_ARGS__) +#define vfslide1down_vf_f16m1(...) __riscv_vfslide1down_vf_f16m1(__VA_ARGS__) +#define vfslide1down_vf_f16m2(...) __riscv_vfslide1down_vf_f16m2(__VA_ARGS__) +#define vfslide1down_vf_f16m4(...) __riscv_vfslide1down_vf_f16m4(__VA_ARGS__) +#define vfslide1down_vf_f16m8(...) __riscv_vfslide1down_vf_f16m8(__VA_ARGS__) +#define vfslide1down_vf_f32mf2(...) __riscv_vfslide1down_vf_f32mf2(__VA_ARGS__) +#define vfslide1down_vf_f32m1(...) __riscv_vfslide1down_vf_f32m1(__VA_ARGS__) +#define vfslide1down_vf_f32m2(...) __riscv_vfslide1down_vf_f32m2(__VA_ARGS__) +#define vfslide1down_vf_f32m4(...) __riscv_vfslide1down_vf_f32m4(__VA_ARGS__) +#define vfslide1down_vf_f32m8(...) __riscv_vfslide1down_vf_f32m8(__VA_ARGS__) +#define vfslide1down_vf_f64m1(...) __riscv_vfslide1down_vf_f64m1(__VA_ARGS__) +#define vfslide1down_vf_f64m2(...) __riscv_vfslide1down_vf_f64m2(__VA_ARGS__) +#define vfslide1down_vf_f64m4(...) __riscv_vfslide1down_vf_f64m4(__VA_ARGS__) +#define vfslide1down_vf_f64m8(...) __riscv_vfslide1down_vf_f64m8(__VA_ARGS__) +#define vslide1up_vx_i8mf8(...) __riscv_vslide1up_vx_i8mf8(__VA_ARGS__) +#define vslide1up_vx_i8mf4(...) __riscv_vslide1up_vx_i8mf4(__VA_ARGS__) +#define vslide1up_vx_i8mf2(...) __riscv_vslide1up_vx_i8mf2(__VA_ARGS__) +#define vslide1up_vx_i8m1(...) __riscv_vslide1up_vx_i8m1(__VA_ARGS__) +#define vslide1up_vx_i8m2(...) __riscv_vslide1up_vx_i8m2(__VA_ARGS__) +#define vslide1up_vx_i8m4(...) __riscv_vslide1up_vx_i8m4(__VA_ARGS__) +#define vslide1up_vx_i8m8(...) __riscv_vslide1up_vx_i8m8(__VA_ARGS__) +#define vslide1up_vx_i16mf4(...) __riscv_vslide1up_vx_i16mf4(__VA_ARGS__) +#define vslide1up_vx_i16mf2(...) __riscv_vslide1up_vx_i16mf2(__VA_ARGS__) +#define vslide1up_vx_i16m1(...) __riscv_vslide1up_vx_i16m1(__VA_ARGS__) +#define vslide1up_vx_i16m2(...) __riscv_vslide1up_vx_i16m2(__VA_ARGS__) +#define vslide1up_vx_i16m4(...) __riscv_vslide1up_vx_i16m4(__VA_ARGS__) +#define vslide1up_vx_i16m8(...) __riscv_vslide1up_vx_i16m8(__VA_ARGS__) +#define vslide1up_vx_i32mf2(...) __riscv_vslide1up_vx_i32mf2(__VA_ARGS__) +#define vslide1up_vx_i32m1(...) __riscv_vslide1up_vx_i32m1(__VA_ARGS__) +#define vslide1up_vx_i32m2(...) __riscv_vslide1up_vx_i32m2(__VA_ARGS__) +#define vslide1up_vx_i32m4(...) __riscv_vslide1up_vx_i32m4(__VA_ARGS__) +#define vslide1up_vx_i32m8(...) __riscv_vslide1up_vx_i32m8(__VA_ARGS__) +#define vslide1up_vx_i64m1(...) __riscv_vslide1up_vx_i64m1(__VA_ARGS__) +#define vslide1up_vx_i64m2(...) __riscv_vslide1up_vx_i64m2(__VA_ARGS__) +#define vslide1up_vx_i64m4(...) __riscv_vslide1up_vx_i64m4(__VA_ARGS__) +#define vslide1up_vx_i64m8(...) __riscv_vslide1up_vx_i64m8(__VA_ARGS__) +#define vslide1down_vx_i8mf8(...) __riscv_vslide1down_vx_i8mf8(__VA_ARGS__) +#define vslide1down_vx_i8mf4(...) __riscv_vslide1down_vx_i8mf4(__VA_ARGS__) +#define vslide1down_vx_i8mf2(...) __riscv_vslide1down_vx_i8mf2(__VA_ARGS__) +#define vslide1down_vx_i8m1(...) __riscv_vslide1down_vx_i8m1(__VA_ARGS__) +#define vslide1down_vx_i8m2(...) __riscv_vslide1down_vx_i8m2(__VA_ARGS__) +#define vslide1down_vx_i8m4(...) __riscv_vslide1down_vx_i8m4(__VA_ARGS__) +#define vslide1down_vx_i8m8(...) __riscv_vslide1down_vx_i8m8(__VA_ARGS__) +#define vslide1down_vx_i16mf4(...) __riscv_vslide1down_vx_i16mf4(__VA_ARGS__) +#define vslide1down_vx_i16mf2(...) __riscv_vslide1down_vx_i16mf2(__VA_ARGS__) +#define vslide1down_vx_i16m1(...) __riscv_vslide1down_vx_i16m1(__VA_ARGS__) +#define vslide1down_vx_i16m2(...) __riscv_vslide1down_vx_i16m2(__VA_ARGS__) +#define vslide1down_vx_i16m4(...) __riscv_vslide1down_vx_i16m4(__VA_ARGS__) +#define vslide1down_vx_i16m8(...) __riscv_vslide1down_vx_i16m8(__VA_ARGS__) +#define vslide1down_vx_i32mf2(...) __riscv_vslide1down_vx_i32mf2(__VA_ARGS__) +#define vslide1down_vx_i32m1(...) __riscv_vslide1down_vx_i32m1(__VA_ARGS__) +#define vslide1down_vx_i32m2(...) __riscv_vslide1down_vx_i32m2(__VA_ARGS__) +#define vslide1down_vx_i32m4(...) __riscv_vslide1down_vx_i32m4(__VA_ARGS__) +#define vslide1down_vx_i32m8(...) __riscv_vslide1down_vx_i32m8(__VA_ARGS__) +#define vslide1down_vx_i64m1(...) __riscv_vslide1down_vx_i64m1(__VA_ARGS__) +#define vslide1down_vx_i64m2(...) __riscv_vslide1down_vx_i64m2(__VA_ARGS__) +#define vslide1down_vx_i64m4(...) __riscv_vslide1down_vx_i64m4(__VA_ARGS__) +#define vslide1down_vx_i64m8(...) __riscv_vslide1down_vx_i64m8(__VA_ARGS__) +#define vslide1up_vx_u8mf8(...) __riscv_vslide1up_vx_u8mf8(__VA_ARGS__) +#define vslide1up_vx_u8mf4(...) __riscv_vslide1up_vx_u8mf4(__VA_ARGS__) +#define vslide1up_vx_u8mf2(...) __riscv_vslide1up_vx_u8mf2(__VA_ARGS__) +#define vslide1up_vx_u8m1(...) __riscv_vslide1up_vx_u8m1(__VA_ARGS__) +#define vslide1up_vx_u8m2(...) __riscv_vslide1up_vx_u8m2(__VA_ARGS__) +#define vslide1up_vx_u8m4(...) __riscv_vslide1up_vx_u8m4(__VA_ARGS__) +#define vslide1up_vx_u8m8(...) __riscv_vslide1up_vx_u8m8(__VA_ARGS__) +#define vslide1up_vx_u16mf4(...) __riscv_vslide1up_vx_u16mf4(__VA_ARGS__) +#define vslide1up_vx_u16mf2(...) __riscv_vslide1up_vx_u16mf2(__VA_ARGS__) +#define vslide1up_vx_u16m1(...) __riscv_vslide1up_vx_u16m1(__VA_ARGS__) +#define vslide1up_vx_u16m2(...) __riscv_vslide1up_vx_u16m2(__VA_ARGS__) +#define vslide1up_vx_u16m4(...) __riscv_vslide1up_vx_u16m4(__VA_ARGS__) +#define vslide1up_vx_u16m8(...) __riscv_vslide1up_vx_u16m8(__VA_ARGS__) +#define vslide1up_vx_u32mf2(...) __riscv_vslide1up_vx_u32mf2(__VA_ARGS__) +#define vslide1up_vx_u32m1(...) __riscv_vslide1up_vx_u32m1(__VA_ARGS__) +#define vslide1up_vx_u32m2(...) __riscv_vslide1up_vx_u32m2(__VA_ARGS__) +#define vslide1up_vx_u32m4(...) __riscv_vslide1up_vx_u32m4(__VA_ARGS__) +#define vslide1up_vx_u32m8(...) __riscv_vslide1up_vx_u32m8(__VA_ARGS__) +#define vslide1up_vx_u64m1(...) __riscv_vslide1up_vx_u64m1(__VA_ARGS__) +#define vslide1up_vx_u64m2(...) __riscv_vslide1up_vx_u64m2(__VA_ARGS__) +#define vslide1up_vx_u64m4(...) __riscv_vslide1up_vx_u64m4(__VA_ARGS__) +#define vslide1up_vx_u64m8(...) __riscv_vslide1up_vx_u64m8(__VA_ARGS__) +#define vslide1down_vx_u8mf8(...) __riscv_vslide1down_vx_u8mf8(__VA_ARGS__) +#define vslide1down_vx_u8mf4(...) __riscv_vslide1down_vx_u8mf4(__VA_ARGS__) +#define vslide1down_vx_u8mf2(...) __riscv_vslide1down_vx_u8mf2(__VA_ARGS__) +#define vslide1down_vx_u8m1(...) __riscv_vslide1down_vx_u8m1(__VA_ARGS__) +#define vslide1down_vx_u8m2(...) __riscv_vslide1down_vx_u8m2(__VA_ARGS__) +#define vslide1down_vx_u8m4(...) __riscv_vslide1down_vx_u8m4(__VA_ARGS__) +#define vslide1down_vx_u8m8(...) __riscv_vslide1down_vx_u8m8(__VA_ARGS__) +#define vslide1down_vx_u16mf4(...) __riscv_vslide1down_vx_u16mf4(__VA_ARGS__) +#define vslide1down_vx_u16mf2(...) __riscv_vslide1down_vx_u16mf2(__VA_ARGS__) +#define vslide1down_vx_u16m1(...) __riscv_vslide1down_vx_u16m1(__VA_ARGS__) +#define vslide1down_vx_u16m2(...) __riscv_vslide1down_vx_u16m2(__VA_ARGS__) +#define vslide1down_vx_u16m4(...) __riscv_vslide1down_vx_u16m4(__VA_ARGS__) +#define vslide1down_vx_u16m8(...) __riscv_vslide1down_vx_u16m8(__VA_ARGS__) +#define vslide1down_vx_u32mf2(...) __riscv_vslide1down_vx_u32mf2(__VA_ARGS__) +#define vslide1down_vx_u32m1(...) __riscv_vslide1down_vx_u32m1(__VA_ARGS__) +#define vslide1down_vx_u32m2(...) __riscv_vslide1down_vx_u32m2(__VA_ARGS__) +#define vslide1down_vx_u32m4(...) __riscv_vslide1down_vx_u32m4(__VA_ARGS__) +#define vslide1down_vx_u32m8(...) __riscv_vslide1down_vx_u32m8(__VA_ARGS__) +#define vslide1down_vx_u64m1(...) __riscv_vslide1down_vx_u64m1(__VA_ARGS__) +#define vslide1down_vx_u64m2(...) __riscv_vslide1down_vx_u64m2(__VA_ARGS__) +#define vslide1down_vx_u64m4(...) __riscv_vslide1down_vx_u64m4(__VA_ARGS__) +#define vslide1down_vx_u64m8(...) __riscv_vslide1down_vx_u64m8(__VA_ARGS__) +// masked functions +#define vfslide1up_vf_f16mf4_m(...) __riscv_vfslide1up_vf_f16mf4_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16mf2_m(...) __riscv_vfslide1up_vf_f16mf2_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16m1_m(...) __riscv_vfslide1up_vf_f16m1_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16m2_m(...) __riscv_vfslide1up_vf_f16m2_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16m4_m(...) __riscv_vfslide1up_vf_f16m4_tumu(__VA_ARGS__) +#define vfslide1up_vf_f16m8_m(...) __riscv_vfslide1up_vf_f16m8_tumu(__VA_ARGS__) +#define vfslide1up_vf_f32mf2_m(...) __riscv_vfslide1up_vf_f32mf2_tumu(__VA_ARGS__) +#define vfslide1up_vf_f32m1_m(...) __riscv_vfslide1up_vf_f32m1_tumu(__VA_ARGS__) +#define vfslide1up_vf_f32m2_m(...) __riscv_vfslide1up_vf_f32m2_tumu(__VA_ARGS__) +#define vfslide1up_vf_f32m4_m(...) __riscv_vfslide1up_vf_f32m4_tumu(__VA_ARGS__) +#define vfslide1up_vf_f32m8_m(...) __riscv_vfslide1up_vf_f32m8_tumu(__VA_ARGS__) +#define vfslide1up_vf_f64m1_m(...) __riscv_vfslide1up_vf_f64m1_tumu(__VA_ARGS__) +#define vfslide1up_vf_f64m2_m(...) __riscv_vfslide1up_vf_f64m2_tumu(__VA_ARGS__) +#define vfslide1up_vf_f64m4_m(...) __riscv_vfslide1up_vf_f64m4_tumu(__VA_ARGS__) +#define vfslide1up_vf_f64m8_m(...) __riscv_vfslide1up_vf_f64m8_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16mf4_m(...) __riscv_vfslide1down_vf_f16mf4_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16mf2_m(...) __riscv_vfslide1down_vf_f16mf2_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16m1_m(...) __riscv_vfslide1down_vf_f16m1_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16m2_m(...) __riscv_vfslide1down_vf_f16m2_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16m4_m(...) __riscv_vfslide1down_vf_f16m4_tumu(__VA_ARGS__) +#define vfslide1down_vf_f16m8_m(...) __riscv_vfslide1down_vf_f16m8_tumu(__VA_ARGS__) +#define vfslide1down_vf_f32mf2_m(...) __riscv_vfslide1down_vf_f32mf2_tumu(__VA_ARGS__) +#define vfslide1down_vf_f32m1_m(...) __riscv_vfslide1down_vf_f32m1_tumu(__VA_ARGS__) +#define vfslide1down_vf_f32m2_m(...) __riscv_vfslide1down_vf_f32m2_tumu(__VA_ARGS__) +#define vfslide1down_vf_f32m4_m(...) __riscv_vfslide1down_vf_f32m4_tumu(__VA_ARGS__) +#define vfslide1down_vf_f32m8_m(...) __riscv_vfslide1down_vf_f32m8_tumu(__VA_ARGS__) +#define vfslide1down_vf_f64m1_m(...) __riscv_vfslide1down_vf_f64m1_tumu(__VA_ARGS__) +#define vfslide1down_vf_f64m2_m(...) __riscv_vfslide1down_vf_f64m2_tumu(__VA_ARGS__) +#define vfslide1down_vf_f64m4_m(...) __riscv_vfslide1down_vf_f64m4_tumu(__VA_ARGS__) +#define vfslide1down_vf_f64m8_m(...) __riscv_vfslide1down_vf_f64m8_tumu(__VA_ARGS__) +#define vslide1up_vx_i8mf8_m(...) __riscv_vslide1up_vx_i8mf8_tumu(__VA_ARGS__) +#define vslide1up_vx_i8mf4_m(...) __riscv_vslide1up_vx_i8mf4_tumu(__VA_ARGS__) +#define vslide1up_vx_i8mf2_m(...) __riscv_vslide1up_vx_i8mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_i8m1_m(...) __riscv_vslide1up_vx_i8m1_tumu(__VA_ARGS__) +#define vslide1up_vx_i8m2_m(...) __riscv_vslide1up_vx_i8m2_tumu(__VA_ARGS__) +#define vslide1up_vx_i8m4_m(...) __riscv_vslide1up_vx_i8m4_tumu(__VA_ARGS__) +#define vslide1up_vx_i8m8_m(...) __riscv_vslide1up_vx_i8m8_tumu(__VA_ARGS__) +#define vslide1up_vx_i16mf4_m(...) __riscv_vslide1up_vx_i16mf4_tumu(__VA_ARGS__) +#define vslide1up_vx_i16mf2_m(...) __riscv_vslide1up_vx_i16mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_i16m1_m(...) __riscv_vslide1up_vx_i16m1_tumu(__VA_ARGS__) +#define vslide1up_vx_i16m2_m(...) __riscv_vslide1up_vx_i16m2_tumu(__VA_ARGS__) +#define vslide1up_vx_i16m4_m(...) __riscv_vslide1up_vx_i16m4_tumu(__VA_ARGS__) +#define vslide1up_vx_i16m8_m(...) __riscv_vslide1up_vx_i16m8_tumu(__VA_ARGS__) +#define vslide1up_vx_i32mf2_m(...) __riscv_vslide1up_vx_i32mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_i32m1_m(...) __riscv_vslide1up_vx_i32m1_tumu(__VA_ARGS__) +#define vslide1up_vx_i32m2_m(...) __riscv_vslide1up_vx_i32m2_tumu(__VA_ARGS__) +#define vslide1up_vx_i32m4_m(...) __riscv_vslide1up_vx_i32m4_tumu(__VA_ARGS__) +#define vslide1up_vx_i32m8_m(...) __riscv_vslide1up_vx_i32m8_tumu(__VA_ARGS__) +#define vslide1up_vx_i64m1_m(...) __riscv_vslide1up_vx_i64m1_tumu(__VA_ARGS__) +#define vslide1up_vx_i64m2_m(...) __riscv_vslide1up_vx_i64m2_tumu(__VA_ARGS__) +#define vslide1up_vx_i64m4_m(...) __riscv_vslide1up_vx_i64m4_tumu(__VA_ARGS__) +#define vslide1up_vx_i64m8_m(...) __riscv_vslide1up_vx_i64m8_tumu(__VA_ARGS__) +#define vslide1down_vx_i8mf8_m(...) __riscv_vslide1down_vx_i8mf8_tumu(__VA_ARGS__) +#define vslide1down_vx_i8mf4_m(...) __riscv_vslide1down_vx_i8mf4_tumu(__VA_ARGS__) +#define vslide1down_vx_i8mf2_m(...) __riscv_vslide1down_vx_i8mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_i8m1_m(...) __riscv_vslide1down_vx_i8m1_tumu(__VA_ARGS__) +#define vslide1down_vx_i8m2_m(...) __riscv_vslide1down_vx_i8m2_tumu(__VA_ARGS__) +#define vslide1down_vx_i8m4_m(...) __riscv_vslide1down_vx_i8m4_tumu(__VA_ARGS__) +#define vslide1down_vx_i8m8_m(...) __riscv_vslide1down_vx_i8m8_tumu(__VA_ARGS__) +#define vslide1down_vx_i16mf4_m(...) __riscv_vslide1down_vx_i16mf4_tumu(__VA_ARGS__) +#define vslide1down_vx_i16mf2_m(...) __riscv_vslide1down_vx_i16mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_i16m1_m(...) __riscv_vslide1down_vx_i16m1_tumu(__VA_ARGS__) +#define vslide1down_vx_i16m2_m(...) __riscv_vslide1down_vx_i16m2_tumu(__VA_ARGS__) +#define vslide1down_vx_i16m4_m(...) __riscv_vslide1down_vx_i16m4_tumu(__VA_ARGS__) +#define vslide1down_vx_i16m8_m(...) __riscv_vslide1down_vx_i16m8_tumu(__VA_ARGS__) +#define vslide1down_vx_i32mf2_m(...) __riscv_vslide1down_vx_i32mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_i32m1_m(...) __riscv_vslide1down_vx_i32m1_tumu(__VA_ARGS__) +#define vslide1down_vx_i32m2_m(...) __riscv_vslide1down_vx_i32m2_tumu(__VA_ARGS__) +#define vslide1down_vx_i32m4_m(...) __riscv_vslide1down_vx_i32m4_tumu(__VA_ARGS__) +#define vslide1down_vx_i32m8_m(...) __riscv_vslide1down_vx_i32m8_tumu(__VA_ARGS__) +#define vslide1down_vx_i64m1_m(...) __riscv_vslide1down_vx_i64m1_tumu(__VA_ARGS__) +#define vslide1down_vx_i64m2_m(...) __riscv_vslide1down_vx_i64m2_tumu(__VA_ARGS__) +#define vslide1down_vx_i64m4_m(...) __riscv_vslide1down_vx_i64m4_tumu(__VA_ARGS__) +#define vslide1down_vx_i64m8_m(...) __riscv_vslide1down_vx_i64m8_tumu(__VA_ARGS__) +#define vslide1up_vx_u8mf8_m(...) __riscv_vslide1up_vx_u8mf8_tumu(__VA_ARGS__) +#define vslide1up_vx_u8mf4_m(...) __riscv_vslide1up_vx_u8mf4_tumu(__VA_ARGS__) +#define vslide1up_vx_u8mf2_m(...) __riscv_vslide1up_vx_u8mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_u8m1_m(...) __riscv_vslide1up_vx_u8m1_tumu(__VA_ARGS__) +#define vslide1up_vx_u8m2_m(...) __riscv_vslide1up_vx_u8m2_tumu(__VA_ARGS__) +#define vslide1up_vx_u8m4_m(...) __riscv_vslide1up_vx_u8m4_tumu(__VA_ARGS__) +#define vslide1up_vx_u8m8_m(...) __riscv_vslide1up_vx_u8m8_tumu(__VA_ARGS__) +#define vslide1up_vx_u16mf4_m(...) __riscv_vslide1up_vx_u16mf4_tumu(__VA_ARGS__) +#define vslide1up_vx_u16mf2_m(...) __riscv_vslide1up_vx_u16mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_u16m1_m(...) __riscv_vslide1up_vx_u16m1_tumu(__VA_ARGS__) +#define vslide1up_vx_u16m2_m(...) __riscv_vslide1up_vx_u16m2_tumu(__VA_ARGS__) +#define vslide1up_vx_u16m4_m(...) __riscv_vslide1up_vx_u16m4_tumu(__VA_ARGS__) +#define vslide1up_vx_u16m8_m(...) __riscv_vslide1up_vx_u16m8_tumu(__VA_ARGS__) +#define vslide1up_vx_u32mf2_m(...) __riscv_vslide1up_vx_u32mf2_tumu(__VA_ARGS__) +#define vslide1up_vx_u32m1_m(...) __riscv_vslide1up_vx_u32m1_tumu(__VA_ARGS__) +#define vslide1up_vx_u32m2_m(...) __riscv_vslide1up_vx_u32m2_tumu(__VA_ARGS__) +#define vslide1up_vx_u32m4_m(...) __riscv_vslide1up_vx_u32m4_tumu(__VA_ARGS__) +#define vslide1up_vx_u32m8_m(...) __riscv_vslide1up_vx_u32m8_tumu(__VA_ARGS__) +#define vslide1up_vx_u64m1_m(...) __riscv_vslide1up_vx_u64m1_tumu(__VA_ARGS__) +#define vslide1up_vx_u64m2_m(...) __riscv_vslide1up_vx_u64m2_tumu(__VA_ARGS__) +#define vslide1up_vx_u64m4_m(...) __riscv_vslide1up_vx_u64m4_tumu(__VA_ARGS__) +#define vslide1up_vx_u64m8_m(...) __riscv_vslide1up_vx_u64m8_tumu(__VA_ARGS__) +#define vslide1down_vx_u8mf8_m(...) __riscv_vslide1down_vx_u8mf8_tumu(__VA_ARGS__) +#define vslide1down_vx_u8mf4_m(...) __riscv_vslide1down_vx_u8mf4_tumu(__VA_ARGS__) +#define vslide1down_vx_u8mf2_m(...) __riscv_vslide1down_vx_u8mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_u8m1_m(...) __riscv_vslide1down_vx_u8m1_tumu(__VA_ARGS__) +#define vslide1down_vx_u8m2_m(...) __riscv_vslide1down_vx_u8m2_tumu(__VA_ARGS__) +#define vslide1down_vx_u8m4_m(...) __riscv_vslide1down_vx_u8m4_tumu(__VA_ARGS__) +#define vslide1down_vx_u8m8_m(...) __riscv_vslide1down_vx_u8m8_tumu(__VA_ARGS__) +#define vslide1down_vx_u16mf4_m(...) __riscv_vslide1down_vx_u16mf4_tumu(__VA_ARGS__) +#define vslide1down_vx_u16mf2_m(...) __riscv_vslide1down_vx_u16mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_u16m1_m(...) __riscv_vslide1down_vx_u16m1_tumu(__VA_ARGS__) +#define vslide1down_vx_u16m2_m(...) __riscv_vslide1down_vx_u16m2_tumu(__VA_ARGS__) +#define vslide1down_vx_u16m4_m(...) __riscv_vslide1down_vx_u16m4_tumu(__VA_ARGS__) +#define vslide1down_vx_u16m8_m(...) __riscv_vslide1down_vx_u16m8_tumu(__VA_ARGS__) +#define vslide1down_vx_u32mf2_m(...) __riscv_vslide1down_vx_u32mf2_tumu(__VA_ARGS__) +#define vslide1down_vx_u32m1_m(...) __riscv_vslide1down_vx_u32m1_tumu(__VA_ARGS__) +#define vslide1down_vx_u32m2_m(...) __riscv_vslide1down_vx_u32m2_tumu(__VA_ARGS__) +#define vslide1down_vx_u32m4_m(...) __riscv_vslide1down_vx_u32m4_tumu(__VA_ARGS__) +#define vslide1down_vx_u32m8_m(...) __riscv_vslide1down_vx_u32m8_tumu(__VA_ARGS__) +#define vslide1down_vx_u64m1_m(...) __riscv_vslide1down_vx_u64m1_tumu(__VA_ARGS__) +#define vslide1down_vx_u64m2_m(...) __riscv_vslide1down_vx_u64m2_tumu(__VA_ARGS__) +#define vslide1down_vx_u64m4_m(...) __riscv_vslide1down_vx_u64m4_tumu(__VA_ARGS__) +#define vslide1down_vx_u64m8_m(...) __riscv_vslide1down_vx_u64m8_tumu(__VA_ARGS__) +#define vrgather_vv_f16mf4(...) __riscv_vrgather_vv_f16mf4(__VA_ARGS__) +#define vrgather_vx_f16mf4(...) __riscv_vrgather_vx_f16mf4(__VA_ARGS__) +#define vrgather_vv_f16mf2(...) __riscv_vrgather_vv_f16mf2(__VA_ARGS__) +#define vrgather_vx_f16mf2(...) __riscv_vrgather_vx_f16mf2(__VA_ARGS__) +#define vrgather_vv_f16m1(...) __riscv_vrgather_vv_f16m1(__VA_ARGS__) +#define vrgather_vx_f16m1(...) __riscv_vrgather_vx_f16m1(__VA_ARGS__) +#define vrgather_vv_f16m2(...) __riscv_vrgather_vv_f16m2(__VA_ARGS__) +#define vrgather_vx_f16m2(...) __riscv_vrgather_vx_f16m2(__VA_ARGS__) +#define vrgather_vv_f16m4(...) __riscv_vrgather_vv_f16m4(__VA_ARGS__) +#define vrgather_vx_f16m4(...) __riscv_vrgather_vx_f16m4(__VA_ARGS__) +#define vrgather_vv_f16m8(...) __riscv_vrgather_vv_f16m8(__VA_ARGS__) +#define vrgather_vx_f16m8(...) __riscv_vrgather_vx_f16m8(__VA_ARGS__) +#define vrgather_vv_f32mf2(...) __riscv_vrgather_vv_f32mf2(__VA_ARGS__) +#define vrgather_vx_f32mf2(...) __riscv_vrgather_vx_f32mf2(__VA_ARGS__) +#define vrgather_vv_f32m1(...) __riscv_vrgather_vv_f32m1(__VA_ARGS__) +#define vrgather_vx_f32m1(...) __riscv_vrgather_vx_f32m1(__VA_ARGS__) +#define vrgather_vv_f32m2(...) __riscv_vrgather_vv_f32m2(__VA_ARGS__) +#define vrgather_vx_f32m2(...) __riscv_vrgather_vx_f32m2(__VA_ARGS__) +#define vrgather_vv_f32m4(...) __riscv_vrgather_vv_f32m4(__VA_ARGS__) +#define vrgather_vx_f32m4(...) __riscv_vrgather_vx_f32m4(__VA_ARGS__) +#define vrgather_vv_f32m8(...) __riscv_vrgather_vv_f32m8(__VA_ARGS__) +#define vrgather_vx_f32m8(...) __riscv_vrgather_vx_f32m8(__VA_ARGS__) +#define vrgather_vv_f64m1(...) __riscv_vrgather_vv_f64m1(__VA_ARGS__) +#define vrgather_vx_f64m1(...) __riscv_vrgather_vx_f64m1(__VA_ARGS__) +#define vrgather_vv_f64m2(...) __riscv_vrgather_vv_f64m2(__VA_ARGS__) +#define vrgather_vx_f64m2(...) __riscv_vrgather_vx_f64m2(__VA_ARGS__) +#define vrgather_vv_f64m4(...) __riscv_vrgather_vv_f64m4(__VA_ARGS__) +#define vrgather_vx_f64m4(...) __riscv_vrgather_vx_f64m4(__VA_ARGS__) +#define vrgather_vv_f64m8(...) __riscv_vrgather_vv_f64m8(__VA_ARGS__) +#define vrgather_vx_f64m8(...) __riscv_vrgather_vx_f64m8(__VA_ARGS__) +#define vrgatherei16_vv_f16mf4(...) __riscv_vrgatherei16_vv_f16mf4(__VA_ARGS__) +#define vrgatherei16_vv_f16mf2(...) __riscv_vrgatherei16_vv_f16mf2(__VA_ARGS__) +#define vrgatherei16_vv_f16m1(...) __riscv_vrgatherei16_vv_f16m1(__VA_ARGS__) +#define vrgatherei16_vv_f16m2(...) __riscv_vrgatherei16_vv_f16m2(__VA_ARGS__) +#define vrgatherei16_vv_f16m4(...) __riscv_vrgatherei16_vv_f16m4(__VA_ARGS__) +#define vrgatherei16_vv_f16m8(...) __riscv_vrgatherei16_vv_f16m8(__VA_ARGS__) +#define vrgatherei16_vv_f32mf2(...) __riscv_vrgatherei16_vv_f32mf2(__VA_ARGS__) +#define vrgatherei16_vv_f32m1(...) __riscv_vrgatherei16_vv_f32m1(__VA_ARGS__) +#define vrgatherei16_vv_f32m2(...) __riscv_vrgatherei16_vv_f32m2(__VA_ARGS__) +#define vrgatherei16_vv_f32m4(...) __riscv_vrgatherei16_vv_f32m4(__VA_ARGS__) +#define vrgatherei16_vv_f32m8(...) __riscv_vrgatherei16_vv_f32m8(__VA_ARGS__) +#define vrgatherei16_vv_f64m1(...) __riscv_vrgatherei16_vv_f64m1(__VA_ARGS__) +#define vrgatherei16_vv_f64m2(...) __riscv_vrgatherei16_vv_f64m2(__VA_ARGS__) +#define vrgatherei16_vv_f64m4(...) __riscv_vrgatherei16_vv_f64m4(__VA_ARGS__) +#define vrgatherei16_vv_f64m8(...) __riscv_vrgatherei16_vv_f64m8(__VA_ARGS__) +#define vrgather_vv_i8mf8(...) __riscv_vrgather_vv_i8mf8(__VA_ARGS__) +#define vrgather_vx_i8mf8(...) __riscv_vrgather_vx_i8mf8(__VA_ARGS__) +#define vrgather_vv_i8mf4(...) __riscv_vrgather_vv_i8mf4(__VA_ARGS__) +#define vrgather_vx_i8mf4(...) __riscv_vrgather_vx_i8mf4(__VA_ARGS__) +#define vrgather_vv_i8mf2(...) __riscv_vrgather_vv_i8mf2(__VA_ARGS__) +#define vrgather_vx_i8mf2(...) __riscv_vrgather_vx_i8mf2(__VA_ARGS__) +#define vrgather_vv_i8m1(...) __riscv_vrgather_vv_i8m1(__VA_ARGS__) +#define vrgather_vx_i8m1(...) __riscv_vrgather_vx_i8m1(__VA_ARGS__) +#define vrgather_vv_i8m2(...) __riscv_vrgather_vv_i8m2(__VA_ARGS__) +#define vrgather_vx_i8m2(...) __riscv_vrgather_vx_i8m2(__VA_ARGS__) +#define vrgather_vv_i8m4(...) __riscv_vrgather_vv_i8m4(__VA_ARGS__) +#define vrgather_vx_i8m4(...) __riscv_vrgather_vx_i8m4(__VA_ARGS__) +#define vrgather_vv_i8m8(...) __riscv_vrgather_vv_i8m8(__VA_ARGS__) +#define vrgather_vx_i8m8(...) __riscv_vrgather_vx_i8m8(__VA_ARGS__) +#define vrgather_vv_i16mf4(...) __riscv_vrgather_vv_i16mf4(__VA_ARGS__) +#define vrgather_vx_i16mf4(...) __riscv_vrgather_vx_i16mf4(__VA_ARGS__) +#define vrgather_vv_i16mf2(...) __riscv_vrgather_vv_i16mf2(__VA_ARGS__) +#define vrgather_vx_i16mf2(...) __riscv_vrgather_vx_i16mf2(__VA_ARGS__) +#define vrgather_vv_i16m1(...) __riscv_vrgather_vv_i16m1(__VA_ARGS__) +#define vrgather_vx_i16m1(...) __riscv_vrgather_vx_i16m1(__VA_ARGS__) +#define vrgather_vv_i16m2(...) __riscv_vrgather_vv_i16m2(__VA_ARGS__) +#define vrgather_vx_i16m2(...) __riscv_vrgather_vx_i16m2(__VA_ARGS__) +#define vrgather_vv_i16m4(...) __riscv_vrgather_vv_i16m4(__VA_ARGS__) +#define vrgather_vx_i16m4(...) __riscv_vrgather_vx_i16m4(__VA_ARGS__) +#define vrgather_vv_i16m8(...) __riscv_vrgather_vv_i16m8(__VA_ARGS__) +#define vrgather_vx_i16m8(...) __riscv_vrgather_vx_i16m8(__VA_ARGS__) +#define vrgather_vv_i32mf2(...) __riscv_vrgather_vv_i32mf2(__VA_ARGS__) +#define vrgather_vx_i32mf2(...) __riscv_vrgather_vx_i32mf2(__VA_ARGS__) +#define vrgather_vv_i32m1(...) __riscv_vrgather_vv_i32m1(__VA_ARGS__) +#define vrgather_vx_i32m1(...) __riscv_vrgather_vx_i32m1(__VA_ARGS__) +#define vrgather_vv_i32m2(...) __riscv_vrgather_vv_i32m2(__VA_ARGS__) +#define vrgather_vx_i32m2(...) __riscv_vrgather_vx_i32m2(__VA_ARGS__) +#define vrgather_vv_i32m4(...) __riscv_vrgather_vv_i32m4(__VA_ARGS__) +#define vrgather_vx_i32m4(...) __riscv_vrgather_vx_i32m4(__VA_ARGS__) +#define vrgather_vv_i32m8(...) __riscv_vrgather_vv_i32m8(__VA_ARGS__) +#define vrgather_vx_i32m8(...) __riscv_vrgather_vx_i32m8(__VA_ARGS__) +#define vrgather_vv_i64m1(...) __riscv_vrgather_vv_i64m1(__VA_ARGS__) +#define vrgather_vx_i64m1(...) __riscv_vrgather_vx_i64m1(__VA_ARGS__) +#define vrgather_vv_i64m2(...) __riscv_vrgather_vv_i64m2(__VA_ARGS__) +#define vrgather_vx_i64m2(...) __riscv_vrgather_vx_i64m2(__VA_ARGS__) +#define vrgather_vv_i64m4(...) __riscv_vrgather_vv_i64m4(__VA_ARGS__) +#define vrgather_vx_i64m4(...) __riscv_vrgather_vx_i64m4(__VA_ARGS__) +#define vrgather_vv_i64m8(...) __riscv_vrgather_vv_i64m8(__VA_ARGS__) +#define vrgather_vx_i64m8(...) __riscv_vrgather_vx_i64m8(__VA_ARGS__) +#define vrgatherei16_vv_i8mf8(...) __riscv_vrgatherei16_vv_i8mf8(__VA_ARGS__) +#define vrgatherei16_vv_i8mf4(...) __riscv_vrgatherei16_vv_i8mf4(__VA_ARGS__) +#define vrgatherei16_vv_i8mf2(...) __riscv_vrgatherei16_vv_i8mf2(__VA_ARGS__) +#define vrgatherei16_vv_i8m1(...) __riscv_vrgatherei16_vv_i8m1(__VA_ARGS__) +#define vrgatherei16_vv_i8m2(...) __riscv_vrgatherei16_vv_i8m2(__VA_ARGS__) +#define vrgatherei16_vv_i8m4(...) __riscv_vrgatherei16_vv_i8m4(__VA_ARGS__) +#define vrgatherei16_vv_i16mf4(...) __riscv_vrgatherei16_vv_i16mf4(__VA_ARGS__) +#define vrgatherei16_vv_i16mf2(...) __riscv_vrgatherei16_vv_i16mf2(__VA_ARGS__) +#define vrgatherei16_vv_i16m1(...) __riscv_vrgatherei16_vv_i16m1(__VA_ARGS__) +#define vrgatherei16_vv_i16m2(...) __riscv_vrgatherei16_vv_i16m2(__VA_ARGS__) +#define vrgatherei16_vv_i16m4(...) __riscv_vrgatherei16_vv_i16m4(__VA_ARGS__) +#define vrgatherei16_vv_i16m8(...) __riscv_vrgatherei16_vv_i16m8(__VA_ARGS__) +#define vrgatherei16_vv_i32mf2(...) __riscv_vrgatherei16_vv_i32mf2(__VA_ARGS__) +#define vrgatherei16_vv_i32m1(...) __riscv_vrgatherei16_vv_i32m1(__VA_ARGS__) +#define vrgatherei16_vv_i32m2(...) __riscv_vrgatherei16_vv_i32m2(__VA_ARGS__) +#define vrgatherei16_vv_i32m4(...) __riscv_vrgatherei16_vv_i32m4(__VA_ARGS__) +#define vrgatherei16_vv_i32m8(...) __riscv_vrgatherei16_vv_i32m8(__VA_ARGS__) +#define vrgatherei16_vv_i64m1(...) __riscv_vrgatherei16_vv_i64m1(__VA_ARGS__) +#define vrgatherei16_vv_i64m2(...) __riscv_vrgatherei16_vv_i64m2(__VA_ARGS__) +#define vrgatherei16_vv_i64m4(...) __riscv_vrgatherei16_vv_i64m4(__VA_ARGS__) +#define vrgatherei16_vv_i64m8(...) __riscv_vrgatherei16_vv_i64m8(__VA_ARGS__) +#define vrgather_vv_u8mf8(...) __riscv_vrgather_vv_u8mf8(__VA_ARGS__) +#define vrgather_vx_u8mf8(...) __riscv_vrgather_vx_u8mf8(__VA_ARGS__) +#define vrgather_vv_u8mf4(...) __riscv_vrgather_vv_u8mf4(__VA_ARGS__) +#define vrgather_vx_u8mf4(...) __riscv_vrgather_vx_u8mf4(__VA_ARGS__) +#define vrgather_vv_u8mf2(...) __riscv_vrgather_vv_u8mf2(__VA_ARGS__) +#define vrgather_vx_u8mf2(...) __riscv_vrgather_vx_u8mf2(__VA_ARGS__) +#define vrgather_vv_u8m1(...) __riscv_vrgather_vv_u8m1(__VA_ARGS__) +#define vrgather_vx_u8m1(...) __riscv_vrgather_vx_u8m1(__VA_ARGS__) +#define vrgather_vv_u8m2(...) __riscv_vrgather_vv_u8m2(__VA_ARGS__) +#define vrgather_vx_u8m2(...) __riscv_vrgather_vx_u8m2(__VA_ARGS__) +#define vrgather_vv_u8m4(...) __riscv_vrgather_vv_u8m4(__VA_ARGS__) +#define vrgather_vx_u8m4(...) __riscv_vrgather_vx_u8m4(__VA_ARGS__) +#define vrgather_vv_u8m8(...) __riscv_vrgather_vv_u8m8(__VA_ARGS__) +#define vrgather_vx_u8m8(...) __riscv_vrgather_vx_u8m8(__VA_ARGS__) +#define vrgather_vv_u16mf4(...) __riscv_vrgather_vv_u16mf4(__VA_ARGS__) +#define vrgather_vx_u16mf4(...) __riscv_vrgather_vx_u16mf4(__VA_ARGS__) +#define vrgather_vv_u16mf2(...) __riscv_vrgather_vv_u16mf2(__VA_ARGS__) +#define vrgather_vx_u16mf2(...) __riscv_vrgather_vx_u16mf2(__VA_ARGS__) +#define vrgather_vv_u16m1(...) __riscv_vrgather_vv_u16m1(__VA_ARGS__) +#define vrgather_vx_u16m1(...) __riscv_vrgather_vx_u16m1(__VA_ARGS__) +#define vrgather_vv_u16m2(...) __riscv_vrgather_vv_u16m2(__VA_ARGS__) +#define vrgather_vx_u16m2(...) __riscv_vrgather_vx_u16m2(__VA_ARGS__) +#define vrgather_vv_u16m4(...) __riscv_vrgather_vv_u16m4(__VA_ARGS__) +#define vrgather_vx_u16m4(...) __riscv_vrgather_vx_u16m4(__VA_ARGS__) +#define vrgather_vv_u16m8(...) __riscv_vrgather_vv_u16m8(__VA_ARGS__) +#define vrgather_vx_u16m8(...) __riscv_vrgather_vx_u16m8(__VA_ARGS__) +#define vrgather_vv_u32mf2(...) __riscv_vrgather_vv_u32mf2(__VA_ARGS__) +#define vrgather_vx_u32mf2(...) __riscv_vrgather_vx_u32mf2(__VA_ARGS__) +#define vrgather_vv_u32m1(...) __riscv_vrgather_vv_u32m1(__VA_ARGS__) +#define vrgather_vx_u32m1(...) __riscv_vrgather_vx_u32m1(__VA_ARGS__) +#define vrgather_vv_u32m2(...) __riscv_vrgather_vv_u32m2(__VA_ARGS__) +#define vrgather_vx_u32m2(...) __riscv_vrgather_vx_u32m2(__VA_ARGS__) +#define vrgather_vv_u32m4(...) __riscv_vrgather_vv_u32m4(__VA_ARGS__) +#define vrgather_vx_u32m4(...) __riscv_vrgather_vx_u32m4(__VA_ARGS__) +#define vrgather_vv_u32m8(...) __riscv_vrgather_vv_u32m8(__VA_ARGS__) +#define vrgather_vx_u32m8(...) __riscv_vrgather_vx_u32m8(__VA_ARGS__) +#define vrgather_vv_u64m1(...) __riscv_vrgather_vv_u64m1(__VA_ARGS__) +#define vrgather_vx_u64m1(...) __riscv_vrgather_vx_u64m1(__VA_ARGS__) +#define vrgather_vv_u64m2(...) __riscv_vrgather_vv_u64m2(__VA_ARGS__) +#define vrgather_vx_u64m2(...) __riscv_vrgather_vx_u64m2(__VA_ARGS__) +#define vrgather_vv_u64m4(...) __riscv_vrgather_vv_u64m4(__VA_ARGS__) +#define vrgather_vx_u64m4(...) __riscv_vrgather_vx_u64m4(__VA_ARGS__) +#define vrgather_vv_u64m8(...) __riscv_vrgather_vv_u64m8(__VA_ARGS__) +#define vrgather_vx_u64m8(...) __riscv_vrgather_vx_u64m8(__VA_ARGS__) +#define vrgatherei16_vv_u8mf8(...) __riscv_vrgatherei16_vv_u8mf8(__VA_ARGS__) +#define vrgatherei16_vv_u8mf4(...) __riscv_vrgatherei16_vv_u8mf4(__VA_ARGS__) +#define vrgatherei16_vv_u8mf2(...) __riscv_vrgatherei16_vv_u8mf2(__VA_ARGS__) +#define vrgatherei16_vv_u8m1(...) __riscv_vrgatherei16_vv_u8m1(__VA_ARGS__) +#define vrgatherei16_vv_u8m2(...) __riscv_vrgatherei16_vv_u8m2(__VA_ARGS__) +#define vrgatherei16_vv_u8m4(...) __riscv_vrgatherei16_vv_u8m4(__VA_ARGS__) +#define vrgatherei16_vv_u16mf4(...) __riscv_vrgatherei16_vv_u16mf4(__VA_ARGS__) +#define vrgatherei16_vv_u16mf2(...) __riscv_vrgatherei16_vv_u16mf2(__VA_ARGS__) +#define vrgatherei16_vv_u16m1(...) __riscv_vrgatherei16_vv_u16m1(__VA_ARGS__) +#define vrgatherei16_vv_u16m2(...) __riscv_vrgatherei16_vv_u16m2(__VA_ARGS__) +#define vrgatherei16_vv_u16m4(...) __riscv_vrgatherei16_vv_u16m4(__VA_ARGS__) +#define vrgatherei16_vv_u16m8(...) __riscv_vrgatherei16_vv_u16m8(__VA_ARGS__) +#define vrgatherei16_vv_u32mf2(...) __riscv_vrgatherei16_vv_u32mf2(__VA_ARGS__) +#define vrgatherei16_vv_u32m1(...) __riscv_vrgatherei16_vv_u32m1(__VA_ARGS__) +#define vrgatherei16_vv_u32m2(...) __riscv_vrgatherei16_vv_u32m2(__VA_ARGS__) +#define vrgatherei16_vv_u32m4(...) __riscv_vrgatherei16_vv_u32m4(__VA_ARGS__) +#define vrgatherei16_vv_u32m8(...) __riscv_vrgatherei16_vv_u32m8(__VA_ARGS__) +#define vrgatherei16_vv_u64m1(...) __riscv_vrgatherei16_vv_u64m1(__VA_ARGS__) +#define vrgatherei16_vv_u64m2(...) __riscv_vrgatherei16_vv_u64m2(__VA_ARGS__) +#define vrgatherei16_vv_u64m4(...) __riscv_vrgatherei16_vv_u64m4(__VA_ARGS__) +#define vrgatherei16_vv_u64m8(...) __riscv_vrgatherei16_vv_u64m8(__VA_ARGS__) +// masked functions +#define vrgather_vv_f16mf4_m(...) __riscv_vrgather_vv_f16mf4_tumu(__VA_ARGS__) +#define vrgather_vx_f16mf4_m(...) __riscv_vrgather_vx_f16mf4_tumu(__VA_ARGS__) +#define vrgather_vv_f16mf2_m(...) __riscv_vrgather_vv_f16mf2_tumu(__VA_ARGS__) +#define vrgather_vx_f16mf2_m(...) __riscv_vrgather_vx_f16mf2_tumu(__VA_ARGS__) +#define vrgather_vv_f16m1_m(...) __riscv_vrgather_vv_f16m1_tumu(__VA_ARGS__) +#define vrgather_vx_f16m1_m(...) __riscv_vrgather_vx_f16m1_tumu(__VA_ARGS__) +#define vrgather_vv_f16m2_m(...) __riscv_vrgather_vv_f16m2_tumu(__VA_ARGS__) +#define vrgather_vx_f16m2_m(...) __riscv_vrgather_vx_f16m2_tumu(__VA_ARGS__) +#define vrgather_vv_f16m4_m(...) __riscv_vrgather_vv_f16m4_tumu(__VA_ARGS__) +#define vrgather_vx_f16m4_m(...) __riscv_vrgather_vx_f16m4_tumu(__VA_ARGS__) +#define vrgather_vv_f16m8_m(...) __riscv_vrgather_vv_f16m8_tumu(__VA_ARGS__) +#define vrgather_vx_f16m8_m(...) __riscv_vrgather_vx_f16m8_tumu(__VA_ARGS__) +#define vrgather_vv_f32mf2_m(...) __riscv_vrgather_vv_f32mf2_tumu(__VA_ARGS__) +#define vrgather_vx_f32mf2_m(...) __riscv_vrgather_vx_f32mf2_tumu(__VA_ARGS__) +#define vrgather_vv_f32m1_m(...) __riscv_vrgather_vv_f32m1_tumu(__VA_ARGS__) +#define vrgather_vx_f32m1_m(...) __riscv_vrgather_vx_f32m1_tumu(__VA_ARGS__) +#define vrgather_vv_f32m2_m(...) __riscv_vrgather_vv_f32m2_tumu(__VA_ARGS__) +#define vrgather_vx_f32m2_m(...) __riscv_vrgather_vx_f32m2_tumu(__VA_ARGS__) +#define vrgather_vv_f32m4_m(...) __riscv_vrgather_vv_f32m4_tumu(__VA_ARGS__) +#define vrgather_vx_f32m4_m(...) __riscv_vrgather_vx_f32m4_tumu(__VA_ARGS__) +#define vrgather_vv_f32m8_m(...) __riscv_vrgather_vv_f32m8_tumu(__VA_ARGS__) +#define vrgather_vx_f32m8_m(...) __riscv_vrgather_vx_f32m8_tumu(__VA_ARGS__) +#define vrgather_vv_f64m1_m(...) __riscv_vrgather_vv_f64m1_tumu(__VA_ARGS__) +#define vrgather_vx_f64m1_m(...) __riscv_vrgather_vx_f64m1_tumu(__VA_ARGS__) +#define vrgather_vv_f64m2_m(...) __riscv_vrgather_vv_f64m2_tumu(__VA_ARGS__) +#define vrgather_vx_f64m2_m(...) __riscv_vrgather_vx_f64m2_tumu(__VA_ARGS__) +#define vrgather_vv_f64m4_m(...) __riscv_vrgather_vv_f64m4_tumu(__VA_ARGS__) +#define vrgather_vx_f64m4_m(...) __riscv_vrgather_vx_f64m4_tumu(__VA_ARGS__) +#define vrgather_vv_f64m8_m(...) __riscv_vrgather_vv_f64m8_tumu(__VA_ARGS__) +#define vrgather_vx_f64m8_m(...) __riscv_vrgather_vx_f64m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16mf4_m(...) __riscv_vrgatherei16_vv_f16mf4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16mf2_m(...) __riscv_vrgatherei16_vv_f16mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16m1_m(...) __riscv_vrgatherei16_vv_f16m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16m2_m(...) __riscv_vrgatherei16_vv_f16m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16m4_m(...) __riscv_vrgatherei16_vv_f16m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f16m8_m(...) __riscv_vrgatherei16_vv_f16m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f32mf2_m(...) __riscv_vrgatherei16_vv_f32mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f32m1_m(...) __riscv_vrgatherei16_vv_f32m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f32m2_m(...) __riscv_vrgatherei16_vv_f32m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f32m4_m(...) __riscv_vrgatherei16_vv_f32m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f32m8_m(...) __riscv_vrgatherei16_vv_f32m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f64m1_m(...) __riscv_vrgatherei16_vv_f64m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f64m2_m(...) __riscv_vrgatherei16_vv_f64m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f64m4_m(...) __riscv_vrgatherei16_vv_f64m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_f64m8_m(...) __riscv_vrgatherei16_vv_f64m8_tumu(__VA_ARGS__) +#define vrgather_vv_i8mf8_m(...) __riscv_vrgather_vv_i8mf8_tumu(__VA_ARGS__) +#define vrgather_vx_i8mf8_m(...) __riscv_vrgather_vx_i8mf8_tumu(__VA_ARGS__) +#define vrgather_vv_i8mf4_m(...) __riscv_vrgather_vv_i8mf4_tumu(__VA_ARGS__) +#define vrgather_vx_i8mf4_m(...) __riscv_vrgather_vx_i8mf4_tumu(__VA_ARGS__) +#define vrgather_vv_i8mf2_m(...) __riscv_vrgather_vv_i8mf2_tumu(__VA_ARGS__) +#define vrgather_vx_i8mf2_m(...) __riscv_vrgather_vx_i8mf2_tumu(__VA_ARGS__) +#define vrgather_vv_i8m1_m(...) __riscv_vrgather_vv_i8m1_tumu(__VA_ARGS__) +#define vrgather_vx_i8m1_m(...) __riscv_vrgather_vx_i8m1_tumu(__VA_ARGS__) +#define vrgather_vv_i8m2_m(...) __riscv_vrgather_vv_i8m2_tumu(__VA_ARGS__) +#define vrgather_vx_i8m2_m(...) __riscv_vrgather_vx_i8m2_tumu(__VA_ARGS__) +#define vrgather_vv_i8m4_m(...) __riscv_vrgather_vv_i8m4_tumu(__VA_ARGS__) +#define vrgather_vx_i8m4_m(...) __riscv_vrgather_vx_i8m4_tumu(__VA_ARGS__) +#define vrgather_vv_i8m8_m(...) __riscv_vrgather_vv_i8m8_tumu(__VA_ARGS__) +#define vrgather_vx_i8m8_m(...) __riscv_vrgather_vx_i8m8_tumu(__VA_ARGS__) +#define vrgather_vv_i16mf4_m(...) __riscv_vrgather_vv_i16mf4_tumu(__VA_ARGS__) +#define vrgather_vx_i16mf4_m(...) __riscv_vrgather_vx_i16mf4_tumu(__VA_ARGS__) +#define vrgather_vv_i16mf2_m(...) __riscv_vrgather_vv_i16mf2_tumu(__VA_ARGS__) +#define vrgather_vx_i16mf2_m(...) __riscv_vrgather_vx_i16mf2_tumu(__VA_ARGS__) +#define vrgather_vv_i16m1_m(...) __riscv_vrgather_vv_i16m1_tumu(__VA_ARGS__) +#define vrgather_vx_i16m1_m(...) __riscv_vrgather_vx_i16m1_tumu(__VA_ARGS__) +#define vrgather_vv_i16m2_m(...) __riscv_vrgather_vv_i16m2_tumu(__VA_ARGS__) +#define vrgather_vx_i16m2_m(...) __riscv_vrgather_vx_i16m2_tumu(__VA_ARGS__) +#define vrgather_vv_i16m4_m(...) __riscv_vrgather_vv_i16m4_tumu(__VA_ARGS__) +#define vrgather_vx_i16m4_m(...) __riscv_vrgather_vx_i16m4_tumu(__VA_ARGS__) +#define vrgather_vv_i16m8_m(...) __riscv_vrgather_vv_i16m8_tumu(__VA_ARGS__) +#define vrgather_vx_i16m8_m(...) __riscv_vrgather_vx_i16m8_tumu(__VA_ARGS__) +#define vrgather_vv_i32mf2_m(...) __riscv_vrgather_vv_i32mf2_tumu(__VA_ARGS__) +#define vrgather_vx_i32mf2_m(...) __riscv_vrgather_vx_i32mf2_tumu(__VA_ARGS__) +#define vrgather_vv_i32m1_m(...) __riscv_vrgather_vv_i32m1_tumu(__VA_ARGS__) +#define vrgather_vx_i32m1_m(...) __riscv_vrgather_vx_i32m1_tumu(__VA_ARGS__) +#define vrgather_vv_i32m2_m(...) __riscv_vrgather_vv_i32m2_tumu(__VA_ARGS__) +#define vrgather_vx_i32m2_m(...) __riscv_vrgather_vx_i32m2_tumu(__VA_ARGS__) +#define vrgather_vv_i32m4_m(...) __riscv_vrgather_vv_i32m4_tumu(__VA_ARGS__) +#define vrgather_vx_i32m4_m(...) __riscv_vrgather_vx_i32m4_tumu(__VA_ARGS__) +#define vrgather_vv_i32m8_m(...) __riscv_vrgather_vv_i32m8_tumu(__VA_ARGS__) +#define vrgather_vx_i32m8_m(...) __riscv_vrgather_vx_i32m8_tumu(__VA_ARGS__) +#define vrgather_vv_i64m1_m(...) __riscv_vrgather_vv_i64m1_tumu(__VA_ARGS__) +#define vrgather_vx_i64m1_m(...) __riscv_vrgather_vx_i64m1_tumu(__VA_ARGS__) +#define vrgather_vv_i64m2_m(...) __riscv_vrgather_vv_i64m2_tumu(__VA_ARGS__) +#define vrgather_vx_i64m2_m(...) __riscv_vrgather_vx_i64m2_tumu(__VA_ARGS__) +#define vrgather_vv_i64m4_m(...) __riscv_vrgather_vv_i64m4_tumu(__VA_ARGS__) +#define vrgather_vx_i64m4_m(...) __riscv_vrgather_vx_i64m4_tumu(__VA_ARGS__) +#define vrgather_vv_i64m8_m(...) __riscv_vrgather_vv_i64m8_tumu(__VA_ARGS__) +#define vrgather_vx_i64m8_m(...) __riscv_vrgather_vx_i64m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8mf8_m(...) __riscv_vrgatherei16_vv_i8mf8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8mf4_m(...) __riscv_vrgatherei16_vv_i8mf4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8mf2_m(...) __riscv_vrgatherei16_vv_i8mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8m1_m(...) __riscv_vrgatherei16_vv_i8m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8m2_m(...) __riscv_vrgatherei16_vv_i8m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i8m4_m(...) __riscv_vrgatherei16_vv_i8m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16mf4_m(...) __riscv_vrgatherei16_vv_i16mf4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16mf2_m(...) __riscv_vrgatherei16_vv_i16mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16m1_m(...) __riscv_vrgatherei16_vv_i16m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16m2_m(...) __riscv_vrgatherei16_vv_i16m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16m4_m(...) __riscv_vrgatherei16_vv_i16m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i16m8_m(...) __riscv_vrgatherei16_vv_i16m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i32mf2_m(...) __riscv_vrgatherei16_vv_i32mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i32m1_m(...) __riscv_vrgatherei16_vv_i32m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i32m2_m(...) __riscv_vrgatherei16_vv_i32m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i32m4_m(...) __riscv_vrgatherei16_vv_i32m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i32m8_m(...) __riscv_vrgatherei16_vv_i32m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i64m1_m(...) __riscv_vrgatherei16_vv_i64m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i64m2_m(...) __riscv_vrgatherei16_vv_i64m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i64m4_m(...) __riscv_vrgatherei16_vv_i64m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_i64m8_m(...) __riscv_vrgatherei16_vv_i64m8_tumu(__VA_ARGS__) +#define vrgather_vv_u8mf8_m(...) __riscv_vrgather_vv_u8mf8_tumu(__VA_ARGS__) +#define vrgather_vx_u8mf8_m(...) __riscv_vrgather_vx_u8mf8_tumu(__VA_ARGS__) +#define vrgather_vv_u8mf4_m(...) __riscv_vrgather_vv_u8mf4_tumu(__VA_ARGS__) +#define vrgather_vx_u8mf4_m(...) __riscv_vrgather_vx_u8mf4_tumu(__VA_ARGS__) +#define vrgather_vv_u8mf2_m(...) __riscv_vrgather_vv_u8mf2_tumu(__VA_ARGS__) +#define vrgather_vx_u8mf2_m(...) __riscv_vrgather_vx_u8mf2_tumu(__VA_ARGS__) +#define vrgather_vv_u8m1_m(...) __riscv_vrgather_vv_u8m1_tumu(__VA_ARGS__) +#define vrgather_vx_u8m1_m(...) __riscv_vrgather_vx_u8m1_tumu(__VA_ARGS__) +#define vrgather_vv_u8m2_m(...) __riscv_vrgather_vv_u8m2_tumu(__VA_ARGS__) +#define vrgather_vx_u8m2_m(...) __riscv_vrgather_vx_u8m2_tumu(__VA_ARGS__) +#define vrgather_vv_u8m4_m(...) __riscv_vrgather_vv_u8m4_tumu(__VA_ARGS__) +#define vrgather_vx_u8m4_m(...) __riscv_vrgather_vx_u8m4_tumu(__VA_ARGS__) +#define vrgather_vv_u8m8_m(...) __riscv_vrgather_vv_u8m8_tumu(__VA_ARGS__) +#define vrgather_vx_u8m8_m(...) __riscv_vrgather_vx_u8m8_tumu(__VA_ARGS__) +#define vrgather_vv_u16mf4_m(...) __riscv_vrgather_vv_u16mf4_tumu(__VA_ARGS__) +#define vrgather_vx_u16mf4_m(...) __riscv_vrgather_vx_u16mf4_tumu(__VA_ARGS__) +#define vrgather_vv_u16mf2_m(...) __riscv_vrgather_vv_u16mf2_tumu(__VA_ARGS__) +#define vrgather_vx_u16mf2_m(...) __riscv_vrgather_vx_u16mf2_tumu(__VA_ARGS__) +#define vrgather_vv_u16m1_m(...) __riscv_vrgather_vv_u16m1_tumu(__VA_ARGS__) +#define vrgather_vx_u16m1_m(...) __riscv_vrgather_vx_u16m1_tumu(__VA_ARGS__) +#define vrgather_vv_u16m2_m(...) __riscv_vrgather_vv_u16m2_tumu(__VA_ARGS__) +#define vrgather_vx_u16m2_m(...) __riscv_vrgather_vx_u16m2_tumu(__VA_ARGS__) +#define vrgather_vv_u16m4_m(...) __riscv_vrgather_vv_u16m4_tumu(__VA_ARGS__) +#define vrgather_vx_u16m4_m(...) __riscv_vrgather_vx_u16m4_tumu(__VA_ARGS__) +#define vrgather_vv_u16m8_m(...) __riscv_vrgather_vv_u16m8_tumu(__VA_ARGS__) +#define vrgather_vx_u16m8_m(...) __riscv_vrgather_vx_u16m8_tumu(__VA_ARGS__) +#define vrgather_vv_u32mf2_m(...) __riscv_vrgather_vv_u32mf2_tumu(__VA_ARGS__) +#define vrgather_vx_u32mf2_m(...) __riscv_vrgather_vx_u32mf2_tumu(__VA_ARGS__) +#define vrgather_vv_u32m1_m(...) __riscv_vrgather_vv_u32m1_tumu(__VA_ARGS__) +#define vrgather_vx_u32m1_m(...) __riscv_vrgather_vx_u32m1_tumu(__VA_ARGS__) +#define vrgather_vv_u32m2_m(...) __riscv_vrgather_vv_u32m2_tumu(__VA_ARGS__) +#define vrgather_vx_u32m2_m(...) __riscv_vrgather_vx_u32m2_tumu(__VA_ARGS__) +#define vrgather_vv_u32m4_m(...) __riscv_vrgather_vv_u32m4_tumu(__VA_ARGS__) +#define vrgather_vx_u32m4_m(...) __riscv_vrgather_vx_u32m4_tumu(__VA_ARGS__) +#define vrgather_vv_u32m8_m(...) __riscv_vrgather_vv_u32m8_tumu(__VA_ARGS__) +#define vrgather_vx_u32m8_m(...) __riscv_vrgather_vx_u32m8_tumu(__VA_ARGS__) +#define vrgather_vv_u64m1_m(...) __riscv_vrgather_vv_u64m1_tumu(__VA_ARGS__) +#define vrgather_vx_u64m1_m(...) __riscv_vrgather_vx_u64m1_tumu(__VA_ARGS__) +#define vrgather_vv_u64m2_m(...) __riscv_vrgather_vv_u64m2_tumu(__VA_ARGS__) +#define vrgather_vx_u64m2_m(...) __riscv_vrgather_vx_u64m2_tumu(__VA_ARGS__) +#define vrgather_vv_u64m4_m(...) __riscv_vrgather_vv_u64m4_tumu(__VA_ARGS__) +#define vrgather_vx_u64m4_m(...) __riscv_vrgather_vx_u64m4_tumu(__VA_ARGS__) +#define vrgather_vv_u64m8_m(...) __riscv_vrgather_vv_u64m8_tumu(__VA_ARGS__) +#define vrgather_vx_u64m8_m(...) __riscv_vrgather_vx_u64m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8mf8_m(...) __riscv_vrgatherei16_vv_u8mf8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8mf4_m(...) __riscv_vrgatherei16_vv_u8mf4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8mf2_m(...) __riscv_vrgatherei16_vv_u8mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8m1_m(...) __riscv_vrgatherei16_vv_u8m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8m2_m(...) __riscv_vrgatherei16_vv_u8m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u8m4_m(...) __riscv_vrgatherei16_vv_u8m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16mf4_m(...) __riscv_vrgatherei16_vv_u16mf4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16mf2_m(...) __riscv_vrgatherei16_vv_u16mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16m1_m(...) __riscv_vrgatherei16_vv_u16m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16m2_m(...) __riscv_vrgatherei16_vv_u16m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16m4_m(...) __riscv_vrgatherei16_vv_u16m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u16m8_m(...) __riscv_vrgatherei16_vv_u16m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u32mf2_m(...) __riscv_vrgatherei16_vv_u32mf2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u32m1_m(...) __riscv_vrgatherei16_vv_u32m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u32m2_m(...) __riscv_vrgatherei16_vv_u32m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u32m4_m(...) __riscv_vrgatherei16_vv_u32m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u32m8_m(...) __riscv_vrgatherei16_vv_u32m8_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u64m1_m(...) __riscv_vrgatherei16_vv_u64m1_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u64m2_m(...) __riscv_vrgatherei16_vv_u64m2_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u64m4_m(...) __riscv_vrgatherei16_vv_u64m4_tumu(__VA_ARGS__) +#define vrgatherei16_vv_u64m8_m(...) __riscv_vrgatherei16_vv_u64m8_tumu(__VA_ARGS__) +#define vcompress_vm_f16mf4(mask, dest, src, vl) __riscv_vcompress_vm_f16mf4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f16mf2(mask, dest, src, vl) __riscv_vcompress_vm_f16mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f16m1(mask, dest, src, vl) __riscv_vcompress_vm_f16m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f16m2(mask, dest, src, vl) __riscv_vcompress_vm_f16m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f16m4(mask, dest, src, vl) __riscv_vcompress_vm_f16m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f16m8(mask, dest, src, vl) __riscv_vcompress_vm_f16m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f32mf2(mask, dest, src, vl) __riscv_vcompress_vm_f32mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f32m1(mask, dest, src, vl) __riscv_vcompress_vm_f32m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f32m2(mask, dest, src, vl) __riscv_vcompress_vm_f32m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f32m4(mask, dest, src, vl) __riscv_vcompress_vm_f32m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f32m8(mask, dest, src, vl) __riscv_vcompress_vm_f32m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f64m1(mask, dest, src, vl) __riscv_vcompress_vm_f64m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f64m2(mask, dest, src, vl) __riscv_vcompress_vm_f64m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f64m4(mask, dest, src, vl) __riscv_vcompress_vm_f64m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_f64m8(mask, dest, src, vl) __riscv_vcompress_vm_f64m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8mf8(mask, dest, src, vl) __riscv_vcompress_vm_i8mf8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8mf4(mask, dest, src, vl) __riscv_vcompress_vm_i8mf4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8mf2(mask, dest, src, vl) __riscv_vcompress_vm_i8mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8m1(mask, dest, src, vl) __riscv_vcompress_vm_i8m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8m2(mask, dest, src, vl) __riscv_vcompress_vm_i8m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8m4(mask, dest, src, vl) __riscv_vcompress_vm_i8m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i8m8(mask, dest, src, vl) __riscv_vcompress_vm_i8m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16mf4(mask, dest, src, vl) __riscv_vcompress_vm_i16mf4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16mf2(mask, dest, src, vl) __riscv_vcompress_vm_i16mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16m1(mask, dest, src, vl) __riscv_vcompress_vm_i16m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16m2(mask, dest, src, vl) __riscv_vcompress_vm_i16m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16m4(mask, dest, src, vl) __riscv_vcompress_vm_i16m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i16m8(mask, dest, src, vl) __riscv_vcompress_vm_i16m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i32mf2(mask, dest, src, vl) __riscv_vcompress_vm_i32mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i32m1(mask, dest, src, vl) __riscv_vcompress_vm_i32m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i32m2(mask, dest, src, vl) __riscv_vcompress_vm_i32m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i32m4(mask, dest, src, vl) __riscv_vcompress_vm_i32m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i32m8(mask, dest, src, vl) __riscv_vcompress_vm_i32m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i64m1(mask, dest, src, vl) __riscv_vcompress_vm_i64m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i64m2(mask, dest, src, vl) __riscv_vcompress_vm_i64m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i64m4(mask, dest, src, vl) __riscv_vcompress_vm_i64m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_i64m8(mask, dest, src, vl) __riscv_vcompress_vm_i64m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8mf8(mask, dest, src, vl) __riscv_vcompress_vm_u8mf8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8mf4(mask, dest, src, vl) __riscv_vcompress_vm_u8mf4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8mf2(mask, dest, src, vl) __riscv_vcompress_vm_u8mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8m1(mask, dest, src, vl) __riscv_vcompress_vm_u8m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8m2(mask, dest, src, vl) __riscv_vcompress_vm_u8m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8m4(mask, dest, src, vl) __riscv_vcompress_vm_u8m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u8m8(mask, dest, src, vl) __riscv_vcompress_vm_u8m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16mf4(mask, dest, src, vl) __riscv_vcompress_vm_u16mf4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16mf2(mask, dest, src, vl) __riscv_vcompress_vm_u16mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16m1(mask, dest, src, vl) __riscv_vcompress_vm_u16m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16m2(mask, dest, src, vl) __riscv_vcompress_vm_u16m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16m4(mask, dest, src, vl) __riscv_vcompress_vm_u16m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u16m8(mask, dest, src, vl) __riscv_vcompress_vm_u16m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u32mf2(mask, dest, src, vl) __riscv_vcompress_vm_u32mf2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u32m1(mask, dest, src, vl) __riscv_vcompress_vm_u32m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u32m2(mask, dest, src, vl) __riscv_vcompress_vm_u32m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u32m4(mask, dest, src, vl) __riscv_vcompress_vm_u32m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u32m8(mask, dest, src, vl) __riscv_vcompress_vm_u32m8_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u64m1(mask, dest, src, vl) __riscv_vcompress_vm_u64m1_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u64m2(mask, dest, src, vl) __riscv_vcompress_vm_u64m2_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u64m4(mask, dest, src, vl) __riscv_vcompress_vm_u64m4_tu((dest), (src), (mask), (vl)) +#define vcompress_vm_u64m8(mask, dest, src, vl) __riscv_vcompress_vm_u64m8_tu((dest), (src), (mask), (vl)) +// Reinterpret between different type under the same SEW/LMUL +#define vreinterpret_v_i8mf8_u8mf8(...) __riscv_vreinterpret_v_i8mf8_u8mf8(__VA_ARGS__) +#define vreinterpret_v_i8mf4_u8mf4(...) __riscv_vreinterpret_v_i8mf4_u8mf4(__VA_ARGS__) +#define vreinterpret_v_i8mf2_u8mf2(...) __riscv_vreinterpret_v_i8mf2_u8mf2(__VA_ARGS__) +#define vreinterpret_v_i8m1_u8m1(...) __riscv_vreinterpret_v_i8m1_u8m1(__VA_ARGS__) +#define vreinterpret_v_i8m2_u8m2(...) __riscv_vreinterpret_v_i8m2_u8m2(__VA_ARGS__) +#define vreinterpret_v_i8m4_u8m4(...) __riscv_vreinterpret_v_i8m4_u8m4(__VA_ARGS__) +#define vreinterpret_v_i8m8_u8m8(...) __riscv_vreinterpret_v_i8m8_u8m8(__VA_ARGS__) +#define vreinterpret_v_u8mf8_i8mf8(...) __riscv_vreinterpret_v_u8mf8_i8mf8(__VA_ARGS__) +#define vreinterpret_v_u8mf4_i8mf4(...) __riscv_vreinterpret_v_u8mf4_i8mf4(__VA_ARGS__) +#define vreinterpret_v_u8mf2_i8mf2(...) __riscv_vreinterpret_v_u8mf2_i8mf2(__VA_ARGS__) +#define vreinterpret_v_u8m1_i8m1(...) __riscv_vreinterpret_v_u8m1_i8m1(__VA_ARGS__) +#define vreinterpret_v_u8m2_i8m2(...) __riscv_vreinterpret_v_u8m2_i8m2(__VA_ARGS__) +#define vreinterpret_v_u8m4_i8m4(...) __riscv_vreinterpret_v_u8m4_i8m4(__VA_ARGS__) +#define vreinterpret_v_u8m8_i8m8(...) __riscv_vreinterpret_v_u8m8_i8m8(__VA_ARGS__) +#define vreinterpret_v_i16mf4_f16mf4(...) __riscv_vreinterpret_v_i16mf4_f16mf4(__VA_ARGS__) +#define vreinterpret_v_i16mf2_f16mf2(...) __riscv_vreinterpret_v_i16mf2_f16mf2(__VA_ARGS__) +#define vreinterpret_v_i16m1_f16m1(...) __riscv_vreinterpret_v_i16m1_f16m1(__VA_ARGS__) +#define vreinterpret_v_i16m2_f16m2(...) __riscv_vreinterpret_v_i16m2_f16m2(__VA_ARGS__) +#define vreinterpret_v_i16m4_f16m4(...) __riscv_vreinterpret_v_i16m4_f16m4(__VA_ARGS__) +#define vreinterpret_v_i16m8_f16m8(...) __riscv_vreinterpret_v_i16m8_f16m8(__VA_ARGS__) +#define vreinterpret_v_u16mf4_f16mf4(...) __riscv_vreinterpret_v_u16mf4_f16mf4(__VA_ARGS__) +#define vreinterpret_v_u16mf2_f16mf2(...) __riscv_vreinterpret_v_u16mf2_f16mf2(__VA_ARGS__) +#define vreinterpret_v_u16m1_f16m1(...) __riscv_vreinterpret_v_u16m1_f16m1(__VA_ARGS__) +#define vreinterpret_v_u16m2_f16m2(...) __riscv_vreinterpret_v_u16m2_f16m2(__VA_ARGS__) +#define vreinterpret_v_u16m4_f16m4(...) __riscv_vreinterpret_v_u16m4_f16m4(__VA_ARGS__) +#define vreinterpret_v_u16m8_f16m8(...) __riscv_vreinterpret_v_u16m8_f16m8(__VA_ARGS__) +#define vreinterpret_v_i16mf4_u16mf4(...) __riscv_vreinterpret_v_i16mf4_u16mf4(__VA_ARGS__) +#define vreinterpret_v_i16mf2_u16mf2(...) __riscv_vreinterpret_v_i16mf2_u16mf2(__VA_ARGS__) +#define vreinterpret_v_i16m1_u16m1(...) __riscv_vreinterpret_v_i16m1_u16m1(__VA_ARGS__) +#define vreinterpret_v_i16m2_u16m2(...) __riscv_vreinterpret_v_i16m2_u16m2(__VA_ARGS__) +#define vreinterpret_v_i16m4_u16m4(...) __riscv_vreinterpret_v_i16m4_u16m4(__VA_ARGS__) +#define vreinterpret_v_i16m8_u16m8(...) __riscv_vreinterpret_v_i16m8_u16m8(__VA_ARGS__) +#define vreinterpret_v_u16mf4_i16mf4(...) __riscv_vreinterpret_v_u16mf4_i16mf4(__VA_ARGS__) +#define vreinterpret_v_u16mf2_i16mf2(...) __riscv_vreinterpret_v_u16mf2_i16mf2(__VA_ARGS__) +#define vreinterpret_v_u16m1_i16m1(...) __riscv_vreinterpret_v_u16m1_i16m1(__VA_ARGS__) +#define vreinterpret_v_u16m2_i16m2(...) __riscv_vreinterpret_v_u16m2_i16m2(__VA_ARGS__) +#define vreinterpret_v_u16m4_i16m4(...) __riscv_vreinterpret_v_u16m4_i16m4(__VA_ARGS__) +#define vreinterpret_v_u16m8_i16m8(...) __riscv_vreinterpret_v_u16m8_i16m8(__VA_ARGS__) +#define vreinterpret_v_f16mf4_i16mf4(...) __riscv_vreinterpret_v_f16mf4_i16mf4(__VA_ARGS__) +#define vreinterpret_v_f16mf2_i16mf2(...) __riscv_vreinterpret_v_f16mf2_i16mf2(__VA_ARGS__) +#define vreinterpret_v_f16m1_i16m1(...) __riscv_vreinterpret_v_f16m1_i16m1(__VA_ARGS__) +#define vreinterpret_v_f16m2_i16m2(...) __riscv_vreinterpret_v_f16m2_i16m2(__VA_ARGS__) +#define vreinterpret_v_f16m4_i16m4(...) __riscv_vreinterpret_v_f16m4_i16m4(__VA_ARGS__) +#define vreinterpret_v_f16m8_i16m8(...) __riscv_vreinterpret_v_f16m8_i16m8(__VA_ARGS__) +#define vreinterpret_v_f16mf4_u16mf4(...) __riscv_vreinterpret_v_f16mf4_u16mf4(__VA_ARGS__) +#define vreinterpret_v_f16mf2_u16mf2(...) __riscv_vreinterpret_v_f16mf2_u16mf2(__VA_ARGS__) +#define vreinterpret_v_f16m1_u16m1(...) __riscv_vreinterpret_v_f16m1_u16m1(__VA_ARGS__) +#define vreinterpret_v_f16m2_u16m2(...) __riscv_vreinterpret_v_f16m2_u16m2(__VA_ARGS__) +#define vreinterpret_v_f16m4_u16m4(...) __riscv_vreinterpret_v_f16m4_u16m4(__VA_ARGS__) +#define vreinterpret_v_f16m8_u16m8(...) __riscv_vreinterpret_v_f16m8_u16m8(__VA_ARGS__) +#define vreinterpret_v_i32mf2_f32mf2(...) __riscv_vreinterpret_v_i32mf2_f32mf2(__VA_ARGS__) +#define vreinterpret_v_i32m1_f32m1(...) __riscv_vreinterpret_v_i32m1_f32m1(__VA_ARGS__) +#define vreinterpret_v_i32m2_f32m2(...) __riscv_vreinterpret_v_i32m2_f32m2(__VA_ARGS__) +#define vreinterpret_v_i32m4_f32m4(...) __riscv_vreinterpret_v_i32m4_f32m4(__VA_ARGS__) +#define vreinterpret_v_i32m8_f32m8(...) __riscv_vreinterpret_v_i32m8_f32m8(__VA_ARGS__) +#define vreinterpret_v_u32mf2_f32mf2(...) __riscv_vreinterpret_v_u32mf2_f32mf2(__VA_ARGS__) +#define vreinterpret_v_u32m1_f32m1(...) __riscv_vreinterpret_v_u32m1_f32m1(__VA_ARGS__) +#define vreinterpret_v_u32m2_f32m2(...) __riscv_vreinterpret_v_u32m2_f32m2(__VA_ARGS__) +#define vreinterpret_v_u32m4_f32m4(...) __riscv_vreinterpret_v_u32m4_f32m4(__VA_ARGS__) +#define vreinterpret_v_u32m8_f32m8(...) __riscv_vreinterpret_v_u32m8_f32m8(__VA_ARGS__) +#define vreinterpret_v_i32mf2_u32mf2(...) __riscv_vreinterpret_v_i32mf2_u32mf2(__VA_ARGS__) +#define vreinterpret_v_i32m1_u32m1(...) __riscv_vreinterpret_v_i32m1_u32m1(__VA_ARGS__) +#define vreinterpret_v_i32m2_u32m2(...) __riscv_vreinterpret_v_i32m2_u32m2(__VA_ARGS__) +#define vreinterpret_v_i32m4_u32m4(...) __riscv_vreinterpret_v_i32m4_u32m4(__VA_ARGS__) +#define vreinterpret_v_i32m8_u32m8(...) __riscv_vreinterpret_v_i32m8_u32m8(__VA_ARGS__) +#define vreinterpret_v_u32mf2_i32mf2(...) __riscv_vreinterpret_v_u32mf2_i32mf2(__VA_ARGS__) +#define vreinterpret_v_u32m1_i32m1(...) __riscv_vreinterpret_v_u32m1_i32m1(__VA_ARGS__) +#define vreinterpret_v_u32m2_i32m2(...) __riscv_vreinterpret_v_u32m2_i32m2(__VA_ARGS__) +#define vreinterpret_v_u32m4_i32m4(...) __riscv_vreinterpret_v_u32m4_i32m4(__VA_ARGS__) +#define vreinterpret_v_u32m8_i32m8(...) __riscv_vreinterpret_v_u32m8_i32m8(__VA_ARGS__) +#define vreinterpret_v_f32mf2_i32mf2(...) __riscv_vreinterpret_v_f32mf2_i32mf2(__VA_ARGS__) +#define vreinterpret_v_f32m1_i32m1(...) __riscv_vreinterpret_v_f32m1_i32m1(__VA_ARGS__) +#define vreinterpret_v_f32m2_i32m2(...) __riscv_vreinterpret_v_f32m2_i32m2(__VA_ARGS__) +#define vreinterpret_v_f32m4_i32m4(...) __riscv_vreinterpret_v_f32m4_i32m4(__VA_ARGS__) +#define vreinterpret_v_f32m8_i32m8(...) __riscv_vreinterpret_v_f32m8_i32m8(__VA_ARGS__) +#define vreinterpret_v_f32mf2_u32mf2(...) __riscv_vreinterpret_v_f32mf2_u32mf2(__VA_ARGS__) +#define vreinterpret_v_f32m1_u32m1(...) __riscv_vreinterpret_v_f32m1_u32m1(__VA_ARGS__) +#define vreinterpret_v_f32m2_u32m2(...) __riscv_vreinterpret_v_f32m2_u32m2(__VA_ARGS__) +#define vreinterpret_v_f32m4_u32m4(...) __riscv_vreinterpret_v_f32m4_u32m4(__VA_ARGS__) +#define vreinterpret_v_f32m8_u32m8(...) __riscv_vreinterpret_v_f32m8_u32m8(__VA_ARGS__) +#define vreinterpret_v_i64m1_f64m1(...) __riscv_vreinterpret_v_i64m1_f64m1(__VA_ARGS__) +#define vreinterpret_v_i64m2_f64m2(...) __riscv_vreinterpret_v_i64m2_f64m2(__VA_ARGS__) +#define vreinterpret_v_i64m4_f64m4(...) __riscv_vreinterpret_v_i64m4_f64m4(__VA_ARGS__) +#define vreinterpret_v_i64m8_f64m8(...) __riscv_vreinterpret_v_i64m8_f64m8(__VA_ARGS__) +#define vreinterpret_v_u64m1_f64m1(...) __riscv_vreinterpret_v_u64m1_f64m1(__VA_ARGS__) +#define vreinterpret_v_u64m2_f64m2(...) __riscv_vreinterpret_v_u64m2_f64m2(__VA_ARGS__) +#define vreinterpret_v_u64m4_f64m4(...) __riscv_vreinterpret_v_u64m4_f64m4(__VA_ARGS__) +#define vreinterpret_v_u64m8_f64m8(...) __riscv_vreinterpret_v_u64m8_f64m8(__VA_ARGS__) +#define vreinterpret_v_i64m1_u64m1(...) __riscv_vreinterpret_v_i64m1_u64m1(__VA_ARGS__) +#define vreinterpret_v_i64m2_u64m2(...) __riscv_vreinterpret_v_i64m2_u64m2(__VA_ARGS__) +#define vreinterpret_v_i64m4_u64m4(...) __riscv_vreinterpret_v_i64m4_u64m4(__VA_ARGS__) +#define vreinterpret_v_i64m8_u64m8(...) __riscv_vreinterpret_v_i64m8_u64m8(__VA_ARGS__) +#define vreinterpret_v_u64m1_i64m1(...) __riscv_vreinterpret_v_u64m1_i64m1(__VA_ARGS__) +#define vreinterpret_v_u64m2_i64m2(...) __riscv_vreinterpret_v_u64m2_i64m2(__VA_ARGS__) +#define vreinterpret_v_u64m4_i64m4(...) __riscv_vreinterpret_v_u64m4_i64m4(__VA_ARGS__) +#define vreinterpret_v_u64m8_i64m8(...) __riscv_vreinterpret_v_u64m8_i64m8(__VA_ARGS__) +#define vreinterpret_v_f64m1_i64m1(...) __riscv_vreinterpret_v_f64m1_i64m1(__VA_ARGS__) +#define vreinterpret_v_f64m2_i64m2(...) __riscv_vreinterpret_v_f64m2_i64m2(__VA_ARGS__) +#define vreinterpret_v_f64m4_i64m4(...) __riscv_vreinterpret_v_f64m4_i64m4(__VA_ARGS__) +#define vreinterpret_v_f64m8_i64m8(...) __riscv_vreinterpret_v_f64m8_i64m8(__VA_ARGS__) +#define vreinterpret_v_f64m1_u64m1(...) __riscv_vreinterpret_v_f64m1_u64m1(__VA_ARGS__) +#define vreinterpret_v_f64m2_u64m2(...) __riscv_vreinterpret_v_f64m2_u64m2(__VA_ARGS__) +#define vreinterpret_v_f64m4_u64m4(...) __riscv_vreinterpret_v_f64m4_u64m4(__VA_ARGS__) +#define vreinterpret_v_f64m8_u64m8(...) __riscv_vreinterpret_v_f64m8_u64m8(__VA_ARGS__) +// Reinterpret between different SEW under the same LMUL +#define vreinterpret_v_i8mf4_i16mf4(...) __riscv_vreinterpret_v_i8mf4_i16mf4(__VA_ARGS__) +#define vreinterpret_v_i8mf2_i16mf2(...) __riscv_vreinterpret_v_i8mf2_i16mf2(__VA_ARGS__) +#define vreinterpret_v_i8m1_i16m1(...) __riscv_vreinterpret_v_i8m1_i16m1(__VA_ARGS__) +#define vreinterpret_v_i8m2_i16m2(...) __riscv_vreinterpret_v_i8m2_i16m2(__VA_ARGS__) +#define vreinterpret_v_i8m4_i16m4(...) __riscv_vreinterpret_v_i8m4_i16m4(__VA_ARGS__) +#define vreinterpret_v_i8m8_i16m8(...) __riscv_vreinterpret_v_i8m8_i16m8(__VA_ARGS__) +#define vreinterpret_v_u8mf4_u16mf4(...) __riscv_vreinterpret_v_u8mf4_u16mf4(__VA_ARGS__) +#define vreinterpret_v_u8mf2_u16mf2(...) __riscv_vreinterpret_v_u8mf2_u16mf2(__VA_ARGS__) +#define vreinterpret_v_u8m1_u16m1(...) __riscv_vreinterpret_v_u8m1_u16m1(__VA_ARGS__) +#define vreinterpret_v_u8m2_u16m2(...) __riscv_vreinterpret_v_u8m2_u16m2(__VA_ARGS__) +#define vreinterpret_v_u8m4_u16m4(...) __riscv_vreinterpret_v_u8m4_u16m4(__VA_ARGS__) +#define vreinterpret_v_u8m8_u16m8(...) __riscv_vreinterpret_v_u8m8_u16m8(__VA_ARGS__) +#define vreinterpret_v_i8mf2_i32mf2(...) __riscv_vreinterpret_v_i8mf2_i32mf2(__VA_ARGS__) +#define vreinterpret_v_i8m1_i32m1(...) __riscv_vreinterpret_v_i8m1_i32m1(__VA_ARGS__) +#define vreinterpret_v_i8m2_i32m2(...) __riscv_vreinterpret_v_i8m2_i32m2(__VA_ARGS__) +#define vreinterpret_v_i8m4_i32m4(...) __riscv_vreinterpret_v_i8m4_i32m4(__VA_ARGS__) +#define vreinterpret_v_i8m8_i32m8(...) __riscv_vreinterpret_v_i8m8_i32m8(__VA_ARGS__) +#define vreinterpret_v_u8mf2_u32mf2(...) __riscv_vreinterpret_v_u8mf2_u32mf2(__VA_ARGS__) +#define vreinterpret_v_u8m1_u32m1(...) __riscv_vreinterpret_v_u8m1_u32m1(__VA_ARGS__) +#define vreinterpret_v_u8m2_u32m2(...) __riscv_vreinterpret_v_u8m2_u32m2(__VA_ARGS__) +#define vreinterpret_v_u8m4_u32m4(...) __riscv_vreinterpret_v_u8m4_u32m4(__VA_ARGS__) +#define vreinterpret_v_u8m8_u32m8(...) __riscv_vreinterpret_v_u8m8_u32m8(__VA_ARGS__) +#define vreinterpret_v_i8m1_i64m1(...) __riscv_vreinterpret_v_i8m1_i64m1(__VA_ARGS__) +#define vreinterpret_v_i8m2_i64m2(...) __riscv_vreinterpret_v_i8m2_i64m2(__VA_ARGS__) +#define vreinterpret_v_i8m4_i64m4(...) __riscv_vreinterpret_v_i8m4_i64m4(__VA_ARGS__) +#define vreinterpret_v_i8m8_i64m8(...) __riscv_vreinterpret_v_i8m8_i64m8(__VA_ARGS__) +#define vreinterpret_v_u8m1_u64m1(...) __riscv_vreinterpret_v_u8m1_u64m1(__VA_ARGS__) +#define vreinterpret_v_u8m2_u64m2(...) __riscv_vreinterpret_v_u8m2_u64m2(__VA_ARGS__) +#define vreinterpret_v_u8m4_u64m4(...) __riscv_vreinterpret_v_u8m4_u64m4(__VA_ARGS__) +#define vreinterpret_v_u8m8_u64m8(...) __riscv_vreinterpret_v_u8m8_u64m8(__VA_ARGS__) +#define vreinterpret_v_i16mf4_i8mf4(...) __riscv_vreinterpret_v_i16mf4_i8mf4(__VA_ARGS__) +#define vreinterpret_v_i16mf2_i8mf2(...) __riscv_vreinterpret_v_i16mf2_i8mf2(__VA_ARGS__) +#define vreinterpret_v_i16m1_i8m1(...) __riscv_vreinterpret_v_i16m1_i8m1(__VA_ARGS__) +#define vreinterpret_v_i16m2_i8m2(...) __riscv_vreinterpret_v_i16m2_i8m2(__VA_ARGS__) +#define vreinterpret_v_i16m4_i8m4(...) __riscv_vreinterpret_v_i16m4_i8m4(__VA_ARGS__) +#define vreinterpret_v_i16m8_i8m8(...) __riscv_vreinterpret_v_i16m8_i8m8(__VA_ARGS__) +#define vreinterpret_v_u16mf4_u8mf4(...) __riscv_vreinterpret_v_u16mf4_u8mf4(__VA_ARGS__) +#define vreinterpret_v_u16mf2_u8mf2(...) __riscv_vreinterpret_v_u16mf2_u8mf2(__VA_ARGS__) +#define vreinterpret_v_u16m1_u8m1(...) __riscv_vreinterpret_v_u16m1_u8m1(__VA_ARGS__) +#define vreinterpret_v_u16m2_u8m2(...) __riscv_vreinterpret_v_u16m2_u8m2(__VA_ARGS__) +#define vreinterpret_v_u16m4_u8m4(...) __riscv_vreinterpret_v_u16m4_u8m4(__VA_ARGS__) +#define vreinterpret_v_u16m8_u8m8(...) __riscv_vreinterpret_v_u16m8_u8m8(__VA_ARGS__) +#define vreinterpret_v_i16mf2_i32mf2(...) __riscv_vreinterpret_v_i16mf2_i32mf2(__VA_ARGS__) +#define vreinterpret_v_i16m1_i32m1(...) __riscv_vreinterpret_v_i16m1_i32m1(__VA_ARGS__) +#define vreinterpret_v_i16m2_i32m2(...) __riscv_vreinterpret_v_i16m2_i32m2(__VA_ARGS__) +#define vreinterpret_v_i16m4_i32m4(...) __riscv_vreinterpret_v_i16m4_i32m4(__VA_ARGS__) +#define vreinterpret_v_i16m8_i32m8(...) __riscv_vreinterpret_v_i16m8_i32m8(__VA_ARGS__) +#define vreinterpret_v_u16mf2_u32mf2(...) __riscv_vreinterpret_v_u16mf2_u32mf2(__VA_ARGS__) +#define vreinterpret_v_u16m1_u32m1(...) __riscv_vreinterpret_v_u16m1_u32m1(__VA_ARGS__) +#define vreinterpret_v_u16m2_u32m2(...) __riscv_vreinterpret_v_u16m2_u32m2(__VA_ARGS__) +#define vreinterpret_v_u16m4_u32m4(...) __riscv_vreinterpret_v_u16m4_u32m4(__VA_ARGS__) +#define vreinterpret_v_u16m8_u32m8(...) __riscv_vreinterpret_v_u16m8_u32m8(__VA_ARGS__) +#define vreinterpret_v_i16m1_i64m1(...) __riscv_vreinterpret_v_i16m1_i64m1(__VA_ARGS__) +#define vreinterpret_v_i16m2_i64m2(...) __riscv_vreinterpret_v_i16m2_i64m2(__VA_ARGS__) +#define vreinterpret_v_i16m4_i64m4(...) __riscv_vreinterpret_v_i16m4_i64m4(__VA_ARGS__) +#define vreinterpret_v_i16m8_i64m8(...) __riscv_vreinterpret_v_i16m8_i64m8(__VA_ARGS__) +#define vreinterpret_v_u16m1_u64m1(...) __riscv_vreinterpret_v_u16m1_u64m1(__VA_ARGS__) +#define vreinterpret_v_u16m2_u64m2(...) __riscv_vreinterpret_v_u16m2_u64m2(__VA_ARGS__) +#define vreinterpret_v_u16m4_u64m4(...) __riscv_vreinterpret_v_u16m4_u64m4(__VA_ARGS__) +#define vreinterpret_v_u16m8_u64m8(...) __riscv_vreinterpret_v_u16m8_u64m8(__VA_ARGS__) +#define vreinterpret_v_i32mf2_i8mf2(...) __riscv_vreinterpret_v_i32mf2_i8mf2(__VA_ARGS__) +#define vreinterpret_v_i32m1_i8m1(...) __riscv_vreinterpret_v_i32m1_i8m1(__VA_ARGS__) +#define vreinterpret_v_i32m2_i8m2(...) __riscv_vreinterpret_v_i32m2_i8m2(__VA_ARGS__) +#define vreinterpret_v_i32m4_i8m4(...) __riscv_vreinterpret_v_i32m4_i8m4(__VA_ARGS__) +#define vreinterpret_v_i32m8_i8m8(...) __riscv_vreinterpret_v_i32m8_i8m8(__VA_ARGS__) +#define vreinterpret_v_u32mf2_u8mf2(...) __riscv_vreinterpret_v_u32mf2_u8mf2(__VA_ARGS__) +#define vreinterpret_v_u32m1_u8m1(...) __riscv_vreinterpret_v_u32m1_u8m1(__VA_ARGS__) +#define vreinterpret_v_u32m2_u8m2(...) __riscv_vreinterpret_v_u32m2_u8m2(__VA_ARGS__) +#define vreinterpret_v_u32m4_u8m4(...) __riscv_vreinterpret_v_u32m4_u8m4(__VA_ARGS__) +#define vreinterpret_v_u32m8_u8m8(...) __riscv_vreinterpret_v_u32m8_u8m8(__VA_ARGS__) +#define vreinterpret_v_i32mf2_i16mf2(...) __riscv_vreinterpret_v_i32mf2_i16mf2(__VA_ARGS__) +#define vreinterpret_v_i32m1_i16m1(...) __riscv_vreinterpret_v_i32m1_i16m1(__VA_ARGS__) +#define vreinterpret_v_i32m2_i16m2(...) __riscv_vreinterpret_v_i32m2_i16m2(__VA_ARGS__) +#define vreinterpret_v_i32m4_i16m4(...) __riscv_vreinterpret_v_i32m4_i16m4(__VA_ARGS__) +#define vreinterpret_v_i32m8_i16m8(...) __riscv_vreinterpret_v_i32m8_i16m8(__VA_ARGS__) +#define vreinterpret_v_u32mf2_u16mf2(...) __riscv_vreinterpret_v_u32mf2_u16mf2(__VA_ARGS__) +#define vreinterpret_v_u32m1_u16m1(...) __riscv_vreinterpret_v_u32m1_u16m1(__VA_ARGS__) +#define vreinterpret_v_u32m2_u16m2(...) __riscv_vreinterpret_v_u32m2_u16m2(__VA_ARGS__) +#define vreinterpret_v_u32m4_u16m4(...) __riscv_vreinterpret_v_u32m4_u16m4(__VA_ARGS__) +#define vreinterpret_v_u32m8_u16m8(...) __riscv_vreinterpret_v_u32m8_u16m8(__VA_ARGS__) +#define vreinterpret_v_i32m1_i64m1(...) __riscv_vreinterpret_v_i32m1_i64m1(__VA_ARGS__) +#define vreinterpret_v_i32m2_i64m2(...) __riscv_vreinterpret_v_i32m2_i64m2(__VA_ARGS__) +#define vreinterpret_v_i32m4_i64m4(...) __riscv_vreinterpret_v_i32m4_i64m4(__VA_ARGS__) +#define vreinterpret_v_i32m8_i64m8(...) __riscv_vreinterpret_v_i32m8_i64m8(__VA_ARGS__) +#define vreinterpret_v_u32m1_u64m1(...) __riscv_vreinterpret_v_u32m1_u64m1(__VA_ARGS__) +#define vreinterpret_v_u32m2_u64m2(...) __riscv_vreinterpret_v_u32m2_u64m2(__VA_ARGS__) +#define vreinterpret_v_u32m4_u64m4(...) __riscv_vreinterpret_v_u32m4_u64m4(__VA_ARGS__) +#define vreinterpret_v_u32m8_u64m8(...) __riscv_vreinterpret_v_u32m8_u64m8(__VA_ARGS__) +#define vreinterpret_v_i64m1_i8m1(...) __riscv_vreinterpret_v_i64m1_i8m1(__VA_ARGS__) +#define vreinterpret_v_i64m2_i8m2(...) __riscv_vreinterpret_v_i64m2_i8m2(__VA_ARGS__) +#define vreinterpret_v_i64m4_i8m4(...) __riscv_vreinterpret_v_i64m4_i8m4(__VA_ARGS__) +#define vreinterpret_v_i64m8_i8m8(...) __riscv_vreinterpret_v_i64m8_i8m8(__VA_ARGS__) +#define vreinterpret_v_u64m1_u8m1(...) __riscv_vreinterpret_v_u64m1_u8m1(__VA_ARGS__) +#define vreinterpret_v_u64m2_u8m2(...) __riscv_vreinterpret_v_u64m2_u8m2(__VA_ARGS__) +#define vreinterpret_v_u64m4_u8m4(...) __riscv_vreinterpret_v_u64m4_u8m4(__VA_ARGS__) +#define vreinterpret_v_u64m8_u8m8(...) __riscv_vreinterpret_v_u64m8_u8m8(__VA_ARGS__) +#define vreinterpret_v_i64m1_i16m1(...) __riscv_vreinterpret_v_i64m1_i16m1(__VA_ARGS__) +#define vreinterpret_v_i64m2_i16m2(...) __riscv_vreinterpret_v_i64m2_i16m2(__VA_ARGS__) +#define vreinterpret_v_i64m4_i16m4(...) __riscv_vreinterpret_v_i64m4_i16m4(__VA_ARGS__) +#define vreinterpret_v_i64m8_i16m8(...) __riscv_vreinterpret_v_i64m8_i16m8(__VA_ARGS__) +#define vreinterpret_v_u64m1_u16m1(...) __riscv_vreinterpret_v_u64m1_u16m1(__VA_ARGS__) +#define vreinterpret_v_u64m2_u16m2(...) __riscv_vreinterpret_v_u64m2_u16m2(__VA_ARGS__) +#define vreinterpret_v_u64m4_u16m4(...) __riscv_vreinterpret_v_u64m4_u16m4(__VA_ARGS__) +#define vreinterpret_v_u64m8_u16m8(...) __riscv_vreinterpret_v_u64m8_u16m8(__VA_ARGS__) +#define vreinterpret_v_i64m1_i32m1(...) __riscv_vreinterpret_v_i64m1_i32m1(__VA_ARGS__) +#define vreinterpret_v_i64m2_i32m2(...) __riscv_vreinterpret_v_i64m2_i32m2(__VA_ARGS__) +#define vreinterpret_v_i64m4_i32m4(...) __riscv_vreinterpret_v_i64m4_i32m4(__VA_ARGS__) +#define vreinterpret_v_i64m8_i32m8(...) __riscv_vreinterpret_v_i64m8_i32m8(__VA_ARGS__) +#define vreinterpret_v_u64m1_u32m1(...) __riscv_vreinterpret_v_u64m1_u32m1(__VA_ARGS__) +#define vreinterpret_v_u64m2_u32m2(...) __riscv_vreinterpret_v_u64m2_u32m2(__VA_ARGS__) +#define vreinterpret_v_u64m4_u32m4(...) __riscv_vreinterpret_v_u64m4_u32m4(__VA_ARGS__) +#define vreinterpret_v_u64m8_u32m8(...) __riscv_vreinterpret_v_u64m8_u32m8(__VA_ARGS__) +#define vlmul_ext_v_f16mf4_f16mf2(...) __riscv_vlmul_ext_v_f16mf4_f16mf2(__VA_ARGS__) +#define vlmul_ext_v_f16mf4_f16m1(...) __riscv_vlmul_ext_v_f16mf4_f16m1(__VA_ARGS__) +#define vlmul_ext_v_f16mf4_f16m2(...) __riscv_vlmul_ext_v_f16mf4_f16m2(__VA_ARGS__) +#define vlmul_ext_v_f16mf4_f16m4(...) __riscv_vlmul_ext_v_f16mf4_f16m4(__VA_ARGS__) +#define vlmul_ext_v_f16mf4_f16m8(...) __riscv_vlmul_ext_v_f16mf4_f16m8(__VA_ARGS__) +#define vlmul_ext_v_f16mf2_f16m1(...) __riscv_vlmul_ext_v_f16mf2_f16m1(__VA_ARGS__) +#define vlmul_ext_v_f16mf2_f16m2(...) __riscv_vlmul_ext_v_f16mf2_f16m2(__VA_ARGS__) +#define vlmul_ext_v_f16mf2_f16m4(...) __riscv_vlmul_ext_v_f16mf2_f16m4(__VA_ARGS__) +#define vlmul_ext_v_f16mf2_f16m8(...) __riscv_vlmul_ext_v_f16mf2_f16m8(__VA_ARGS__) +#define vlmul_ext_v_f16m1_f16m2(...) __riscv_vlmul_ext_v_f16m1_f16m2(__VA_ARGS__) +#define vlmul_ext_v_f16m1_f16m4(...) __riscv_vlmul_ext_v_f16m1_f16m4(__VA_ARGS__) +#define vlmul_ext_v_f16m1_f16m8(...) __riscv_vlmul_ext_v_f16m1_f16m8(__VA_ARGS__) +#define vlmul_ext_v_f16m2_f16m4(...) __riscv_vlmul_ext_v_f16m2_f16m4(__VA_ARGS__) +#define vlmul_ext_v_f16m2_f16m8(...) __riscv_vlmul_ext_v_f16m2_f16m8(__VA_ARGS__) +#define vlmul_ext_v_f16m4_f16m8(...) __riscv_vlmul_ext_v_f16m4_f16m8(__VA_ARGS__) +#define vlmul_ext_v_f32mf2_f32m1(...) __riscv_vlmul_ext_v_f32mf2_f32m1(__VA_ARGS__) +#define vlmul_ext_v_f32mf2_f32m2(...) __riscv_vlmul_ext_v_f32mf2_f32m2(__VA_ARGS__) +#define vlmul_ext_v_f32mf2_f32m4(...) __riscv_vlmul_ext_v_f32mf2_f32m4(__VA_ARGS__) +#define vlmul_ext_v_f32mf2_f32m8(...) __riscv_vlmul_ext_v_f32mf2_f32m8(__VA_ARGS__) +#define vlmul_ext_v_f32m1_f32m2(...) __riscv_vlmul_ext_v_f32m1_f32m2(__VA_ARGS__) +#define vlmul_ext_v_f32m1_f32m4(...) __riscv_vlmul_ext_v_f32m1_f32m4(__VA_ARGS__) +#define vlmul_ext_v_f32m1_f32m8(...) __riscv_vlmul_ext_v_f32m1_f32m8(__VA_ARGS__) +#define vlmul_ext_v_f32m2_f32m4(...) __riscv_vlmul_ext_v_f32m2_f32m4(__VA_ARGS__) +#define vlmul_ext_v_f32m2_f32m8(...) __riscv_vlmul_ext_v_f32m2_f32m8(__VA_ARGS__) +#define vlmul_ext_v_f32m4_f32m8(...) __riscv_vlmul_ext_v_f32m4_f32m8(__VA_ARGS__) +#define vlmul_ext_v_f64m1_f64m2(...) __riscv_vlmul_ext_v_f64m1_f64m2(__VA_ARGS__) +#define vlmul_ext_v_f64m1_f64m4(...) __riscv_vlmul_ext_v_f64m1_f64m4(__VA_ARGS__) +#define vlmul_ext_v_f64m1_f64m8(...) __riscv_vlmul_ext_v_f64m1_f64m8(__VA_ARGS__) +#define vlmul_ext_v_f64m2_f64m4(...) __riscv_vlmul_ext_v_f64m2_f64m4(__VA_ARGS__) +#define vlmul_ext_v_f64m2_f64m8(...) __riscv_vlmul_ext_v_f64m2_f64m8(__VA_ARGS__) +#define vlmul_ext_v_f64m4_f64m8(...) __riscv_vlmul_ext_v_f64m4_f64m8(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8mf4(...) __riscv_vlmul_ext_v_i8mf8_i8mf4(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8mf2(...) __riscv_vlmul_ext_v_i8mf8_i8mf2(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8m1(...) __riscv_vlmul_ext_v_i8mf8_i8m1(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8m2(...) __riscv_vlmul_ext_v_i8mf8_i8m2(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8m4(...) __riscv_vlmul_ext_v_i8mf8_i8m4(__VA_ARGS__) +#define vlmul_ext_v_i8mf8_i8m8(...) __riscv_vlmul_ext_v_i8mf8_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i8mf4_i8mf2(...) __riscv_vlmul_ext_v_i8mf4_i8mf2(__VA_ARGS__) +#define vlmul_ext_v_i8mf4_i8m1(...) __riscv_vlmul_ext_v_i8mf4_i8m1(__VA_ARGS__) +#define vlmul_ext_v_i8mf4_i8m2(...) __riscv_vlmul_ext_v_i8mf4_i8m2(__VA_ARGS__) +#define vlmul_ext_v_i8mf4_i8m4(...) __riscv_vlmul_ext_v_i8mf4_i8m4(__VA_ARGS__) +#define vlmul_ext_v_i8mf4_i8m8(...) __riscv_vlmul_ext_v_i8mf4_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i8mf2_i8m1(...) __riscv_vlmul_ext_v_i8mf2_i8m1(__VA_ARGS__) +#define vlmul_ext_v_i8mf2_i8m2(...) __riscv_vlmul_ext_v_i8mf2_i8m2(__VA_ARGS__) +#define vlmul_ext_v_i8mf2_i8m4(...) __riscv_vlmul_ext_v_i8mf2_i8m4(__VA_ARGS__) +#define vlmul_ext_v_i8mf2_i8m8(...) __riscv_vlmul_ext_v_i8mf2_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i8m1_i8m2(...) __riscv_vlmul_ext_v_i8m1_i8m2(__VA_ARGS__) +#define vlmul_ext_v_i8m1_i8m4(...) __riscv_vlmul_ext_v_i8m1_i8m4(__VA_ARGS__) +#define vlmul_ext_v_i8m1_i8m8(...) __riscv_vlmul_ext_v_i8m1_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i8m2_i8m4(...) __riscv_vlmul_ext_v_i8m2_i8m4(__VA_ARGS__) +#define vlmul_ext_v_i8m2_i8m8(...) __riscv_vlmul_ext_v_i8m2_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i8m4_i8m8(...) __riscv_vlmul_ext_v_i8m4_i8m8(__VA_ARGS__) +#define vlmul_ext_v_i16mf4_i16mf2(...) __riscv_vlmul_ext_v_i16mf4_i16mf2(__VA_ARGS__) +#define vlmul_ext_v_i16mf4_i16m1(...) __riscv_vlmul_ext_v_i16mf4_i16m1(__VA_ARGS__) +#define vlmul_ext_v_i16mf4_i16m2(...) __riscv_vlmul_ext_v_i16mf4_i16m2(__VA_ARGS__) +#define vlmul_ext_v_i16mf4_i16m4(...) __riscv_vlmul_ext_v_i16mf4_i16m4(__VA_ARGS__) +#define vlmul_ext_v_i16mf4_i16m8(...) __riscv_vlmul_ext_v_i16mf4_i16m8(__VA_ARGS__) +#define vlmul_ext_v_i16mf2_i16m1(...) __riscv_vlmul_ext_v_i16mf2_i16m1(__VA_ARGS__) +#define vlmul_ext_v_i16mf2_i16m2(...) __riscv_vlmul_ext_v_i16mf2_i16m2(__VA_ARGS__) +#define vlmul_ext_v_i16mf2_i16m4(...) __riscv_vlmul_ext_v_i16mf2_i16m4(__VA_ARGS__) +#define vlmul_ext_v_i16mf2_i16m8(...) __riscv_vlmul_ext_v_i16mf2_i16m8(__VA_ARGS__) +#define vlmul_ext_v_i16m1_i16m2(...) __riscv_vlmul_ext_v_i16m1_i16m2(__VA_ARGS__) +#define vlmul_ext_v_i16m1_i16m4(...) __riscv_vlmul_ext_v_i16m1_i16m4(__VA_ARGS__) +#define vlmul_ext_v_i16m1_i16m8(...) __riscv_vlmul_ext_v_i16m1_i16m8(__VA_ARGS__) +#define vlmul_ext_v_i16m2_i16m4(...) __riscv_vlmul_ext_v_i16m2_i16m4(__VA_ARGS__) +#define vlmul_ext_v_i16m2_i16m8(...) __riscv_vlmul_ext_v_i16m2_i16m8(__VA_ARGS__) +#define vlmul_ext_v_i16m4_i16m8(...) __riscv_vlmul_ext_v_i16m4_i16m8(__VA_ARGS__) +#define vlmul_ext_v_i32mf2_i32m1(...) __riscv_vlmul_ext_v_i32mf2_i32m1(__VA_ARGS__) +#define vlmul_ext_v_i32mf2_i32m2(...) __riscv_vlmul_ext_v_i32mf2_i32m2(__VA_ARGS__) +#define vlmul_ext_v_i32mf2_i32m4(...) __riscv_vlmul_ext_v_i32mf2_i32m4(__VA_ARGS__) +#define vlmul_ext_v_i32mf2_i32m8(...) __riscv_vlmul_ext_v_i32mf2_i32m8(__VA_ARGS__) +#define vlmul_ext_v_i32m1_i32m2(...) __riscv_vlmul_ext_v_i32m1_i32m2(__VA_ARGS__) +#define vlmul_ext_v_i32m1_i32m4(...) __riscv_vlmul_ext_v_i32m1_i32m4(__VA_ARGS__) +#define vlmul_ext_v_i32m1_i32m8(...) __riscv_vlmul_ext_v_i32m1_i32m8(__VA_ARGS__) +#define vlmul_ext_v_i32m2_i32m4(...) __riscv_vlmul_ext_v_i32m2_i32m4(__VA_ARGS__) +#define vlmul_ext_v_i32m2_i32m8(...) __riscv_vlmul_ext_v_i32m2_i32m8(__VA_ARGS__) +#define vlmul_ext_v_i32m4_i32m8(...) __riscv_vlmul_ext_v_i32m4_i32m8(__VA_ARGS__) +#define vlmul_ext_v_i64m1_i64m2(...) __riscv_vlmul_ext_v_i64m1_i64m2(__VA_ARGS__) +#define vlmul_ext_v_i64m1_i64m4(...) __riscv_vlmul_ext_v_i64m1_i64m4(__VA_ARGS__) +#define vlmul_ext_v_i64m1_i64m8(...) __riscv_vlmul_ext_v_i64m1_i64m8(__VA_ARGS__) +#define vlmul_ext_v_i64m2_i64m4(...) __riscv_vlmul_ext_v_i64m2_i64m4(__VA_ARGS__) +#define vlmul_ext_v_i64m2_i64m8(...) __riscv_vlmul_ext_v_i64m2_i64m8(__VA_ARGS__) +#define vlmul_ext_v_i64m4_i64m8(...) __riscv_vlmul_ext_v_i64m4_i64m8(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8mf4(...) __riscv_vlmul_ext_v_u8mf8_u8mf4(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8mf2(...) __riscv_vlmul_ext_v_u8mf8_u8mf2(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8m1(...) __riscv_vlmul_ext_v_u8mf8_u8m1(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8m2(...) __riscv_vlmul_ext_v_u8mf8_u8m2(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8m4(...) __riscv_vlmul_ext_v_u8mf8_u8m4(__VA_ARGS__) +#define vlmul_ext_v_u8mf8_u8m8(...) __riscv_vlmul_ext_v_u8mf8_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u8mf4_u8mf2(...) __riscv_vlmul_ext_v_u8mf4_u8mf2(__VA_ARGS__) +#define vlmul_ext_v_u8mf4_u8m1(...) __riscv_vlmul_ext_v_u8mf4_u8m1(__VA_ARGS__) +#define vlmul_ext_v_u8mf4_u8m2(...) __riscv_vlmul_ext_v_u8mf4_u8m2(__VA_ARGS__) +#define vlmul_ext_v_u8mf4_u8m4(...) __riscv_vlmul_ext_v_u8mf4_u8m4(__VA_ARGS__) +#define vlmul_ext_v_u8mf4_u8m8(...) __riscv_vlmul_ext_v_u8mf4_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u8mf2_u8m1(...) __riscv_vlmul_ext_v_u8mf2_u8m1(__VA_ARGS__) +#define vlmul_ext_v_u8mf2_u8m2(...) __riscv_vlmul_ext_v_u8mf2_u8m2(__VA_ARGS__) +#define vlmul_ext_v_u8mf2_u8m4(...) __riscv_vlmul_ext_v_u8mf2_u8m4(__VA_ARGS__) +#define vlmul_ext_v_u8mf2_u8m8(...) __riscv_vlmul_ext_v_u8mf2_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u8m1_u8m2(...) __riscv_vlmul_ext_v_u8m1_u8m2(__VA_ARGS__) +#define vlmul_ext_v_u8m1_u8m4(...) __riscv_vlmul_ext_v_u8m1_u8m4(__VA_ARGS__) +#define vlmul_ext_v_u8m1_u8m8(...) __riscv_vlmul_ext_v_u8m1_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u8m2_u8m4(...) __riscv_vlmul_ext_v_u8m2_u8m4(__VA_ARGS__) +#define vlmul_ext_v_u8m2_u8m8(...) __riscv_vlmul_ext_v_u8m2_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u8m4_u8m8(...) __riscv_vlmul_ext_v_u8m4_u8m8(__VA_ARGS__) +#define vlmul_ext_v_u16mf4_u16mf2(...) __riscv_vlmul_ext_v_u16mf4_u16mf2(__VA_ARGS__) +#define vlmul_ext_v_u16mf4_u16m1(...) __riscv_vlmul_ext_v_u16mf4_u16m1(__VA_ARGS__) +#define vlmul_ext_v_u16mf4_u16m2(...) __riscv_vlmul_ext_v_u16mf4_u16m2(__VA_ARGS__) +#define vlmul_ext_v_u16mf4_u16m4(...) __riscv_vlmul_ext_v_u16mf4_u16m4(__VA_ARGS__) +#define vlmul_ext_v_u16mf4_u16m8(...) __riscv_vlmul_ext_v_u16mf4_u16m8(__VA_ARGS__) +#define vlmul_ext_v_u16mf2_u16m1(...) __riscv_vlmul_ext_v_u16mf2_u16m1(__VA_ARGS__) +#define vlmul_ext_v_u16mf2_u16m2(...) __riscv_vlmul_ext_v_u16mf2_u16m2(__VA_ARGS__) +#define vlmul_ext_v_u16mf2_u16m4(...) __riscv_vlmul_ext_v_u16mf2_u16m4(__VA_ARGS__) +#define vlmul_ext_v_u16mf2_u16m8(...) __riscv_vlmul_ext_v_u16mf2_u16m8(__VA_ARGS__) +#define vlmul_ext_v_u16m1_u16m2(...) __riscv_vlmul_ext_v_u16m1_u16m2(__VA_ARGS__) +#define vlmul_ext_v_u16m1_u16m4(...) __riscv_vlmul_ext_v_u16m1_u16m4(__VA_ARGS__) +#define vlmul_ext_v_u16m1_u16m8(...) __riscv_vlmul_ext_v_u16m1_u16m8(__VA_ARGS__) +#define vlmul_ext_v_u16m2_u16m4(...) __riscv_vlmul_ext_v_u16m2_u16m4(__VA_ARGS__) +#define vlmul_ext_v_u16m2_u16m8(...) __riscv_vlmul_ext_v_u16m2_u16m8(__VA_ARGS__) +#define vlmul_ext_v_u16m4_u16m8(...) __riscv_vlmul_ext_v_u16m4_u16m8(__VA_ARGS__) +#define vlmul_ext_v_u32mf2_u32m1(...) __riscv_vlmul_ext_v_u32mf2_u32m1(__VA_ARGS__) +#define vlmul_ext_v_u32mf2_u32m2(...) __riscv_vlmul_ext_v_u32mf2_u32m2(__VA_ARGS__) +#define vlmul_ext_v_u32mf2_u32m4(...) __riscv_vlmul_ext_v_u32mf2_u32m4(__VA_ARGS__) +#define vlmul_ext_v_u32mf2_u32m8(...) __riscv_vlmul_ext_v_u32mf2_u32m8(__VA_ARGS__) +#define vlmul_ext_v_u32m1_u32m2(...) __riscv_vlmul_ext_v_u32m1_u32m2(__VA_ARGS__) +#define vlmul_ext_v_u32m1_u32m4(...) __riscv_vlmul_ext_v_u32m1_u32m4(__VA_ARGS__) +#define vlmul_ext_v_u32m1_u32m8(...) __riscv_vlmul_ext_v_u32m1_u32m8(__VA_ARGS__) +#define vlmul_ext_v_u32m2_u32m4(...) __riscv_vlmul_ext_v_u32m2_u32m4(__VA_ARGS__) +#define vlmul_ext_v_u32m2_u32m8(...) __riscv_vlmul_ext_v_u32m2_u32m8(__VA_ARGS__) +#define vlmul_ext_v_u32m4_u32m8(...) __riscv_vlmul_ext_v_u32m4_u32m8(__VA_ARGS__) +#define vlmul_ext_v_u64m1_u64m2(...) __riscv_vlmul_ext_v_u64m1_u64m2(__VA_ARGS__) +#define vlmul_ext_v_u64m1_u64m4(...) __riscv_vlmul_ext_v_u64m1_u64m4(__VA_ARGS__) +#define vlmul_ext_v_u64m1_u64m8(...) __riscv_vlmul_ext_v_u64m1_u64m8(__VA_ARGS__) +#define vlmul_ext_v_u64m2_u64m4(...) __riscv_vlmul_ext_v_u64m2_u64m4(__VA_ARGS__) +#define vlmul_ext_v_u64m2_u64m8(...) __riscv_vlmul_ext_v_u64m2_u64m8(__VA_ARGS__) +#define vlmul_ext_v_u64m4_u64m8(...) __riscv_vlmul_ext_v_u64m4_u64m8(__VA_ARGS__) +#define vlmul_trunc_v_f16mf2_f16mf4(...) __riscv_vlmul_trunc_v_f16mf2_f16mf4(__VA_ARGS__) +#define vlmul_trunc_v_f16m1_f16mf4(...) __riscv_vlmul_trunc_v_f16m1_f16mf4(__VA_ARGS__) +#define vlmul_trunc_v_f16m1_f16mf2(...) __riscv_vlmul_trunc_v_f16m1_f16mf2(__VA_ARGS__) +#define vlmul_trunc_v_f16m2_f16mf4(...) __riscv_vlmul_trunc_v_f16m2_f16mf4(__VA_ARGS__) +#define vlmul_trunc_v_f16m2_f16mf2(...) __riscv_vlmul_trunc_v_f16m2_f16mf2(__VA_ARGS__) +#define vlmul_trunc_v_f16m2_f16m1(...) __riscv_vlmul_trunc_v_f16m2_f16m1(__VA_ARGS__) +#define vlmul_trunc_v_f16m4_f16mf4(...) __riscv_vlmul_trunc_v_f16m4_f16mf4(__VA_ARGS__) +#define vlmul_trunc_v_f16m4_f16mf2(...) __riscv_vlmul_trunc_v_f16m4_f16mf2(__VA_ARGS__) +#define vlmul_trunc_v_f16m4_f16m1(...) __riscv_vlmul_trunc_v_f16m4_f16m1(__VA_ARGS__) +#define vlmul_trunc_v_f16m4_f16m2(...) __riscv_vlmul_trunc_v_f16m4_f16m2(__VA_ARGS__) +#define vlmul_trunc_v_f16m8_f16mf4(...) __riscv_vlmul_trunc_v_f16m8_f16mf4(__VA_ARGS__) +#define vlmul_trunc_v_f16m8_f16mf2(...) __riscv_vlmul_trunc_v_f16m8_f16mf2(__VA_ARGS__) +#define vlmul_trunc_v_f16m8_f16m1(...) __riscv_vlmul_trunc_v_f16m8_f16m1(__VA_ARGS__) +#define vlmul_trunc_v_f16m8_f16m2(...) __riscv_vlmul_trunc_v_f16m8_f16m2(__VA_ARGS__) +#define vlmul_trunc_v_f16m8_f16m4(...) __riscv_vlmul_trunc_v_f16m8_f16m4(__VA_ARGS__) +#define vlmul_trunc_v_f32m1_f32mf2(...) __riscv_vlmul_trunc_v_f32m1_f32mf2(__VA_ARGS__) +#define vlmul_trunc_v_f32m2_f32mf2(...) __riscv_vlmul_trunc_v_f32m2_f32mf2(__VA_ARGS__) +#define vlmul_trunc_v_f32m2_f32m1(...) __riscv_vlmul_trunc_v_f32m2_f32m1(__VA_ARGS__) +#define vlmul_trunc_v_f32m4_f32mf2(...) __riscv_vlmul_trunc_v_f32m4_f32mf2(__VA_ARGS__) +#define vlmul_trunc_v_f32m4_f32m1(...) __riscv_vlmul_trunc_v_f32m4_f32m1(__VA_ARGS__) +#define vlmul_trunc_v_f32m4_f32m2(...) __riscv_vlmul_trunc_v_f32m4_f32m2(__VA_ARGS__) +#define vlmul_trunc_v_f32m8_f32mf2(...) __riscv_vlmul_trunc_v_f32m8_f32mf2(__VA_ARGS__) +#define vlmul_trunc_v_f32m8_f32m1(...) __riscv_vlmul_trunc_v_f32m8_f32m1(__VA_ARGS__) +#define vlmul_trunc_v_f32m8_f32m2(...) __riscv_vlmul_trunc_v_f32m8_f32m2(__VA_ARGS__) +#define vlmul_trunc_v_f32m8_f32m4(...) __riscv_vlmul_trunc_v_f32m8_f32m4(__VA_ARGS__) +#define vlmul_trunc_v_f64m2_f64m1(...) __riscv_vlmul_trunc_v_f64m2_f64m1(__VA_ARGS__) +#define vlmul_trunc_v_f64m4_f64m1(...) __riscv_vlmul_trunc_v_f64m4_f64m1(__VA_ARGS__) +#define vlmul_trunc_v_f64m4_f64m2(...) __riscv_vlmul_trunc_v_f64m4_f64m2(__VA_ARGS__) +#define vlmul_trunc_v_f64m8_f64m1(...) __riscv_vlmul_trunc_v_f64m8_f64m1(__VA_ARGS__) +#define vlmul_trunc_v_f64m8_f64m2(...) __riscv_vlmul_trunc_v_f64m8_f64m2(__VA_ARGS__) +#define vlmul_trunc_v_f64m8_f64m4(...) __riscv_vlmul_trunc_v_f64m8_f64m4(__VA_ARGS__) +#define vlmul_trunc_v_i8mf4_i8mf8(...) __riscv_vlmul_trunc_v_i8mf4_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8mf2_i8mf8(...) __riscv_vlmul_trunc_v_i8mf2_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8mf2_i8mf4(...) __riscv_vlmul_trunc_v_i8mf2_i8mf4(__VA_ARGS__) +#define vlmul_trunc_v_i8m1_i8mf8(...) __riscv_vlmul_trunc_v_i8m1_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8m1_i8mf4(...) __riscv_vlmul_trunc_v_i8m1_i8mf4(__VA_ARGS__) +#define vlmul_trunc_v_i8m1_i8mf2(...) __riscv_vlmul_trunc_v_i8m1_i8mf2(__VA_ARGS__) +#define vlmul_trunc_v_i8m2_i8mf8(...) __riscv_vlmul_trunc_v_i8m2_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8m2_i8mf4(...) __riscv_vlmul_trunc_v_i8m2_i8mf4(__VA_ARGS__) +#define vlmul_trunc_v_i8m2_i8mf2(...) __riscv_vlmul_trunc_v_i8m2_i8mf2(__VA_ARGS__) +#define vlmul_trunc_v_i8m2_i8m1(...) __riscv_vlmul_trunc_v_i8m2_i8m1(__VA_ARGS__) +#define vlmul_trunc_v_i8m4_i8mf8(...) __riscv_vlmul_trunc_v_i8m4_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8m4_i8mf4(...) __riscv_vlmul_trunc_v_i8m4_i8mf4(__VA_ARGS__) +#define vlmul_trunc_v_i8m4_i8mf2(...) __riscv_vlmul_trunc_v_i8m4_i8mf2(__VA_ARGS__) +#define vlmul_trunc_v_i8m4_i8m1(...) __riscv_vlmul_trunc_v_i8m4_i8m1(__VA_ARGS__) +#define vlmul_trunc_v_i8m4_i8m2(...) __riscv_vlmul_trunc_v_i8m4_i8m2(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8mf8(...) __riscv_vlmul_trunc_v_i8m8_i8mf8(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8mf4(...) __riscv_vlmul_trunc_v_i8m8_i8mf4(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8mf2(...) __riscv_vlmul_trunc_v_i8m8_i8mf2(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8m1(...) __riscv_vlmul_trunc_v_i8m8_i8m1(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8m2(...) __riscv_vlmul_trunc_v_i8m8_i8m2(__VA_ARGS__) +#define vlmul_trunc_v_i8m8_i8m4(...) __riscv_vlmul_trunc_v_i8m8_i8m4(__VA_ARGS__) +#define vlmul_trunc_v_i16mf2_i16mf4(...) __riscv_vlmul_trunc_v_i16mf2_i16mf4(__VA_ARGS__) +#define vlmul_trunc_v_i16m1_i16mf4(...) __riscv_vlmul_trunc_v_i16m1_i16mf4(__VA_ARGS__) +#define vlmul_trunc_v_i16m1_i16mf2(...) __riscv_vlmul_trunc_v_i16m1_i16mf2(__VA_ARGS__) +#define vlmul_trunc_v_i16m2_i16mf4(...) __riscv_vlmul_trunc_v_i16m2_i16mf4(__VA_ARGS__) +#define vlmul_trunc_v_i16m2_i16mf2(...) __riscv_vlmul_trunc_v_i16m2_i16mf2(__VA_ARGS__) +#define vlmul_trunc_v_i16m2_i16m1(...) __riscv_vlmul_trunc_v_i16m2_i16m1(__VA_ARGS__) +#define vlmul_trunc_v_i16m4_i16mf4(...) __riscv_vlmul_trunc_v_i16m4_i16mf4(__VA_ARGS__) +#define vlmul_trunc_v_i16m4_i16mf2(...) __riscv_vlmul_trunc_v_i16m4_i16mf2(__VA_ARGS__) +#define vlmul_trunc_v_i16m4_i16m1(...) __riscv_vlmul_trunc_v_i16m4_i16m1(__VA_ARGS__) +#define vlmul_trunc_v_i16m4_i16m2(...) __riscv_vlmul_trunc_v_i16m4_i16m2(__VA_ARGS__) +#define vlmul_trunc_v_i16m8_i16mf4(...) __riscv_vlmul_trunc_v_i16m8_i16mf4(__VA_ARGS__) +#define vlmul_trunc_v_i16m8_i16mf2(...) __riscv_vlmul_trunc_v_i16m8_i16mf2(__VA_ARGS__) +#define vlmul_trunc_v_i16m8_i16m1(...) __riscv_vlmul_trunc_v_i16m8_i16m1(__VA_ARGS__) +#define vlmul_trunc_v_i16m8_i16m2(...) __riscv_vlmul_trunc_v_i16m8_i16m2(__VA_ARGS__) +#define vlmul_trunc_v_i16m8_i16m4(...) __riscv_vlmul_trunc_v_i16m8_i16m4(__VA_ARGS__) +#define vlmul_trunc_v_i32m1_i32mf2(...) __riscv_vlmul_trunc_v_i32m1_i32mf2(__VA_ARGS__) +#define vlmul_trunc_v_i32m2_i32mf2(...) __riscv_vlmul_trunc_v_i32m2_i32mf2(__VA_ARGS__) +#define vlmul_trunc_v_i32m2_i32m1(...) __riscv_vlmul_trunc_v_i32m2_i32m1(__VA_ARGS__) +#define vlmul_trunc_v_i32m4_i32mf2(...) __riscv_vlmul_trunc_v_i32m4_i32mf2(__VA_ARGS__) +#define vlmul_trunc_v_i32m4_i32m1(...) __riscv_vlmul_trunc_v_i32m4_i32m1(__VA_ARGS__) +#define vlmul_trunc_v_i32m4_i32m2(...) __riscv_vlmul_trunc_v_i32m4_i32m2(__VA_ARGS__) +#define vlmul_trunc_v_i32m8_i32mf2(...) __riscv_vlmul_trunc_v_i32m8_i32mf2(__VA_ARGS__) +#define vlmul_trunc_v_i32m8_i32m1(...) __riscv_vlmul_trunc_v_i32m8_i32m1(__VA_ARGS__) +#define vlmul_trunc_v_i32m8_i32m2(...) __riscv_vlmul_trunc_v_i32m8_i32m2(__VA_ARGS__) +#define vlmul_trunc_v_i32m8_i32m4(...) __riscv_vlmul_trunc_v_i32m8_i32m4(__VA_ARGS__) +#define vlmul_trunc_v_i64m2_i64m1(...) __riscv_vlmul_trunc_v_i64m2_i64m1(__VA_ARGS__) +#define vlmul_trunc_v_i64m4_i64m1(...) __riscv_vlmul_trunc_v_i64m4_i64m1(__VA_ARGS__) +#define vlmul_trunc_v_i64m4_i64m2(...) __riscv_vlmul_trunc_v_i64m4_i64m2(__VA_ARGS__) +#define vlmul_trunc_v_i64m8_i64m1(...) __riscv_vlmul_trunc_v_i64m8_i64m1(__VA_ARGS__) +#define vlmul_trunc_v_i64m8_i64m2(...) __riscv_vlmul_trunc_v_i64m8_i64m2(__VA_ARGS__) +#define vlmul_trunc_v_i64m8_i64m4(...) __riscv_vlmul_trunc_v_i64m8_i64m4(__VA_ARGS__) +#define vlmul_trunc_v_u8mf4_u8mf8(...) __riscv_vlmul_trunc_v_u8mf4_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8mf2_u8mf8(...) __riscv_vlmul_trunc_v_u8mf2_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8mf2_u8mf4(...) __riscv_vlmul_trunc_v_u8mf2_u8mf4(__VA_ARGS__) +#define vlmul_trunc_v_u8m1_u8mf8(...) __riscv_vlmul_trunc_v_u8m1_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8m1_u8mf4(...) __riscv_vlmul_trunc_v_u8m1_u8mf4(__VA_ARGS__) +#define vlmul_trunc_v_u8m1_u8mf2(...) __riscv_vlmul_trunc_v_u8m1_u8mf2(__VA_ARGS__) +#define vlmul_trunc_v_u8m2_u8mf8(...) __riscv_vlmul_trunc_v_u8m2_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8m2_u8mf4(...) __riscv_vlmul_trunc_v_u8m2_u8mf4(__VA_ARGS__) +#define vlmul_trunc_v_u8m2_u8mf2(...) __riscv_vlmul_trunc_v_u8m2_u8mf2(__VA_ARGS__) +#define vlmul_trunc_v_u8m2_u8m1(...) __riscv_vlmul_trunc_v_u8m2_u8m1(__VA_ARGS__) +#define vlmul_trunc_v_u8m4_u8mf8(...) __riscv_vlmul_trunc_v_u8m4_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8m4_u8mf4(...) __riscv_vlmul_trunc_v_u8m4_u8mf4(__VA_ARGS__) +#define vlmul_trunc_v_u8m4_u8mf2(...) __riscv_vlmul_trunc_v_u8m4_u8mf2(__VA_ARGS__) +#define vlmul_trunc_v_u8m4_u8m1(...) __riscv_vlmul_trunc_v_u8m4_u8m1(__VA_ARGS__) +#define vlmul_trunc_v_u8m4_u8m2(...) __riscv_vlmul_trunc_v_u8m4_u8m2(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8mf8(...) __riscv_vlmul_trunc_v_u8m8_u8mf8(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8mf4(...) __riscv_vlmul_trunc_v_u8m8_u8mf4(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8mf2(...) __riscv_vlmul_trunc_v_u8m8_u8mf2(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8m1(...) __riscv_vlmul_trunc_v_u8m8_u8m1(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8m2(...) __riscv_vlmul_trunc_v_u8m8_u8m2(__VA_ARGS__) +#define vlmul_trunc_v_u8m8_u8m4(...) __riscv_vlmul_trunc_v_u8m8_u8m4(__VA_ARGS__) +#define vlmul_trunc_v_u16mf2_u16mf4(...) __riscv_vlmul_trunc_v_u16mf2_u16mf4(__VA_ARGS__) +#define vlmul_trunc_v_u16m1_u16mf4(...) __riscv_vlmul_trunc_v_u16m1_u16mf4(__VA_ARGS__) +#define vlmul_trunc_v_u16m1_u16mf2(...) __riscv_vlmul_trunc_v_u16m1_u16mf2(__VA_ARGS__) +#define vlmul_trunc_v_u16m2_u16mf4(...) __riscv_vlmul_trunc_v_u16m2_u16mf4(__VA_ARGS__) +#define vlmul_trunc_v_u16m2_u16mf2(...) __riscv_vlmul_trunc_v_u16m2_u16mf2(__VA_ARGS__) +#define vlmul_trunc_v_u16m2_u16m1(...) __riscv_vlmul_trunc_v_u16m2_u16m1(__VA_ARGS__) +#define vlmul_trunc_v_u16m4_u16mf4(...) __riscv_vlmul_trunc_v_u16m4_u16mf4(__VA_ARGS__) +#define vlmul_trunc_v_u16m4_u16mf2(...) __riscv_vlmul_trunc_v_u16m4_u16mf2(__VA_ARGS__) +#define vlmul_trunc_v_u16m4_u16m1(...) __riscv_vlmul_trunc_v_u16m4_u16m1(__VA_ARGS__) +#define vlmul_trunc_v_u16m4_u16m2(...) __riscv_vlmul_trunc_v_u16m4_u16m2(__VA_ARGS__) +#define vlmul_trunc_v_u16m8_u16mf4(...) __riscv_vlmul_trunc_v_u16m8_u16mf4(__VA_ARGS__) +#define vlmul_trunc_v_u16m8_u16mf2(...) __riscv_vlmul_trunc_v_u16m8_u16mf2(__VA_ARGS__) +#define vlmul_trunc_v_u16m8_u16m1(...) __riscv_vlmul_trunc_v_u16m8_u16m1(__VA_ARGS__) +#define vlmul_trunc_v_u16m8_u16m2(...) __riscv_vlmul_trunc_v_u16m8_u16m2(__VA_ARGS__) +#define vlmul_trunc_v_u16m8_u16m4(...) __riscv_vlmul_trunc_v_u16m8_u16m4(__VA_ARGS__) +#define vlmul_trunc_v_u32m1_u32mf2(...) __riscv_vlmul_trunc_v_u32m1_u32mf2(__VA_ARGS__) +#define vlmul_trunc_v_u32m2_u32mf2(...) __riscv_vlmul_trunc_v_u32m2_u32mf2(__VA_ARGS__) +#define vlmul_trunc_v_u32m2_u32m1(...) __riscv_vlmul_trunc_v_u32m2_u32m1(__VA_ARGS__) +#define vlmul_trunc_v_u32m4_u32mf2(...) __riscv_vlmul_trunc_v_u32m4_u32mf2(__VA_ARGS__) +#define vlmul_trunc_v_u32m4_u32m1(...) __riscv_vlmul_trunc_v_u32m4_u32m1(__VA_ARGS__) +#define vlmul_trunc_v_u32m4_u32m2(...) __riscv_vlmul_trunc_v_u32m4_u32m2(__VA_ARGS__) +#define vlmul_trunc_v_u32m8_u32mf2(...) __riscv_vlmul_trunc_v_u32m8_u32mf2(__VA_ARGS__) +#define vlmul_trunc_v_u32m8_u32m1(...) __riscv_vlmul_trunc_v_u32m8_u32m1(__VA_ARGS__) +#define vlmul_trunc_v_u32m8_u32m2(...) __riscv_vlmul_trunc_v_u32m8_u32m2(__VA_ARGS__) +#define vlmul_trunc_v_u32m8_u32m4(...) __riscv_vlmul_trunc_v_u32m8_u32m4(__VA_ARGS__) +#define vlmul_trunc_v_u64m2_u64m1(...) __riscv_vlmul_trunc_v_u64m2_u64m1(__VA_ARGS__) +#define vlmul_trunc_v_u64m4_u64m1(...) __riscv_vlmul_trunc_v_u64m4_u64m1(__VA_ARGS__) +#define vlmul_trunc_v_u64m4_u64m2(...) __riscv_vlmul_trunc_v_u64m4_u64m2(__VA_ARGS__) +#define vlmul_trunc_v_u64m8_u64m1(...) __riscv_vlmul_trunc_v_u64m8_u64m1(__VA_ARGS__) +#define vlmul_trunc_v_u64m8_u64m2(...) __riscv_vlmul_trunc_v_u64m8_u64m2(__VA_ARGS__) +#define vlmul_trunc_v_u64m8_u64m4(...) __riscv_vlmul_trunc_v_u64m8_u64m4(__VA_ARGS__) +#define vundefined_f16mf4(...) __riscv_vundefined_f16mf4(__VA_ARGS__) +#define vundefined_f16mf2(...) __riscv_vundefined_f16mf2(__VA_ARGS__) +#define vundefined_f16m1(...) __riscv_vundefined_f16m1(__VA_ARGS__) +#define vundefined_f16m2(...) __riscv_vundefined_f16m2(__VA_ARGS__) +#define vundefined_f16m4(...) __riscv_vundefined_f16m4(__VA_ARGS__) +#define vundefined_f16m8(...) __riscv_vundefined_f16m8(__VA_ARGS__) +#define vundefined_f32mf2(...) __riscv_vundefined_f32mf2(__VA_ARGS__) +#define vundefined_f32m1(...) __riscv_vundefined_f32m1(__VA_ARGS__) +#define vundefined_f32m2(...) __riscv_vundefined_f32m2(__VA_ARGS__) +#define vundefined_f32m4(...) __riscv_vundefined_f32m4(__VA_ARGS__) +#define vundefined_f32m8(...) __riscv_vundefined_f32m8(__VA_ARGS__) +#define vundefined_f64m1(...) __riscv_vundefined_f64m1(__VA_ARGS__) +#define vundefined_f64m2(...) __riscv_vundefined_f64m2(__VA_ARGS__) +#define vundefined_f64m4(...) __riscv_vundefined_f64m4(__VA_ARGS__) +#define vundefined_f64m8(...) __riscv_vundefined_f64m8(__VA_ARGS__) +#define vundefined_i8mf8(...) __riscv_vundefined_i8mf8(__VA_ARGS__) +#define vundefined_i8mf4(...) __riscv_vundefined_i8mf4(__VA_ARGS__) +#define vundefined_i8mf2(...) __riscv_vundefined_i8mf2(__VA_ARGS__) +#define vundefined_i8m1(...) __riscv_vundefined_i8m1(__VA_ARGS__) +#define vundefined_i8m2(...) __riscv_vundefined_i8m2(__VA_ARGS__) +#define vundefined_i8m4(...) __riscv_vundefined_i8m4(__VA_ARGS__) +#define vundefined_i8m8(...) __riscv_vundefined_i8m8(__VA_ARGS__) +#define vundefined_i16mf4(...) __riscv_vundefined_i16mf4(__VA_ARGS__) +#define vundefined_i16mf2(...) __riscv_vundefined_i16mf2(__VA_ARGS__) +#define vundefined_i16m1(...) __riscv_vundefined_i16m1(__VA_ARGS__) +#define vundefined_i16m2(...) __riscv_vundefined_i16m2(__VA_ARGS__) +#define vundefined_i16m4(...) __riscv_vundefined_i16m4(__VA_ARGS__) +#define vundefined_i16m8(...) __riscv_vundefined_i16m8(__VA_ARGS__) +#define vundefined_i32mf2(...) __riscv_vundefined_i32mf2(__VA_ARGS__) +#define vundefined_i32m1(...) __riscv_vundefined_i32m1(__VA_ARGS__) +#define vundefined_i32m2(...) __riscv_vundefined_i32m2(__VA_ARGS__) +#define vundefined_i32m4(...) __riscv_vundefined_i32m4(__VA_ARGS__) +#define vundefined_i32m8(...) __riscv_vundefined_i32m8(__VA_ARGS__) +#define vundefined_i64m1(...) __riscv_vundefined_i64m1(__VA_ARGS__) +#define vundefined_i64m2(...) __riscv_vundefined_i64m2(__VA_ARGS__) +#define vundefined_i64m4(...) __riscv_vundefined_i64m4(__VA_ARGS__) +#define vundefined_i64m8(...) __riscv_vundefined_i64m8(__VA_ARGS__) +#define vundefined_u8mf8(...) __riscv_vundefined_u8mf8(__VA_ARGS__) +#define vundefined_u8mf4(...) __riscv_vundefined_u8mf4(__VA_ARGS__) +#define vundefined_u8mf2(...) __riscv_vundefined_u8mf2(__VA_ARGS__) +#define vundefined_u8m1(...) __riscv_vundefined_u8m1(__VA_ARGS__) +#define vundefined_u8m2(...) __riscv_vundefined_u8m2(__VA_ARGS__) +#define vundefined_u8m4(...) __riscv_vundefined_u8m4(__VA_ARGS__) +#define vundefined_u8m8(...) __riscv_vundefined_u8m8(__VA_ARGS__) +#define vundefined_u16mf4(...) __riscv_vundefined_u16mf4(__VA_ARGS__) +#define vundefined_u16mf2(...) __riscv_vundefined_u16mf2(__VA_ARGS__) +#define vundefined_u16m1(...) __riscv_vundefined_u16m1(__VA_ARGS__) +#define vundefined_u16m2(...) __riscv_vundefined_u16m2(__VA_ARGS__) +#define vundefined_u16m4(...) __riscv_vundefined_u16m4(__VA_ARGS__) +#define vundefined_u16m8(...) __riscv_vundefined_u16m8(__VA_ARGS__) +#define vundefined_u32mf2(...) __riscv_vundefined_u32mf2(__VA_ARGS__) +#define vundefined_u32m1(...) __riscv_vundefined_u32m1(__VA_ARGS__) +#define vundefined_u32m2(...) __riscv_vundefined_u32m2(__VA_ARGS__) +#define vundefined_u32m4(...) __riscv_vundefined_u32m4(__VA_ARGS__) +#define vundefined_u32m8(...) __riscv_vundefined_u32m8(__VA_ARGS__) +#define vundefined_u64m1(...) __riscv_vundefined_u64m1(__VA_ARGS__) +#define vundefined_u64m2(...) __riscv_vundefined_u64m2(__VA_ARGS__) +#define vundefined_u64m4(...) __riscv_vundefined_u64m4(__VA_ARGS__) +#define vundefined_u64m8(...) __riscv_vundefined_u64m8(__VA_ARGS__) +#define vset_v_f16m1_f16m2(...) __riscv_vset_v_f16m1_f16m2(__VA_ARGS__) +#define vset_v_f16m1_f16m4(...) __riscv_vset_v_f16m1_f16m4(__VA_ARGS__) +#define vset_v_f16m2_f16m4(...) __riscv_vset_v_f16m2_f16m4(__VA_ARGS__) +#define vset_v_f16m1_f16m8(...) __riscv_vset_v_f16m1_f16m8(__VA_ARGS__) +#define vset_v_f16m2_f16m8(...) __riscv_vset_v_f16m2_f16m8(__VA_ARGS__) +#define vset_v_f16m4_f16m8(...) __riscv_vset_v_f16m4_f16m8(__VA_ARGS__) +#define vset_v_f32m1_f32m2(...) __riscv_vset_v_f32m1_f32m2(__VA_ARGS__) +#define vset_v_f32m1_f32m4(...) __riscv_vset_v_f32m1_f32m4(__VA_ARGS__) +#define vset_v_f32m2_f32m4(...) __riscv_vset_v_f32m2_f32m4(__VA_ARGS__) +#define vset_v_f32m1_f32m8(...) __riscv_vset_v_f32m1_f32m8(__VA_ARGS__) +#define vset_v_f32m2_f32m8(...) __riscv_vset_v_f32m2_f32m8(__VA_ARGS__) +#define vset_v_f32m4_f32m8(...) __riscv_vset_v_f32m4_f32m8(__VA_ARGS__) +#define vset_v_f64m1_f64m2(...) __riscv_vset_v_f64m1_f64m2(__VA_ARGS__) +#define vset_v_f64m1_f64m4(...) __riscv_vset_v_f64m1_f64m4(__VA_ARGS__) +#define vset_v_f64m2_f64m4(...) __riscv_vset_v_f64m2_f64m4(__VA_ARGS__) +#define vset_v_f64m1_f64m8(...) __riscv_vset_v_f64m1_f64m8(__VA_ARGS__) +#define vset_v_f64m2_f64m8(...) __riscv_vset_v_f64m2_f64m8(__VA_ARGS__) +#define vset_v_f64m4_f64m8(...) __riscv_vset_v_f64m4_f64m8(__VA_ARGS__) +#define vset_v_i8m1_i8m2(...) __riscv_vset_v_i8m1_i8m2(__VA_ARGS__) +#define vset_v_i8m1_i8m4(...) __riscv_vset_v_i8m1_i8m4(__VA_ARGS__) +#define vset_v_i8m2_i8m4(...) __riscv_vset_v_i8m2_i8m4(__VA_ARGS__) +#define vset_v_i8m1_i8m8(...) __riscv_vset_v_i8m1_i8m8(__VA_ARGS__) +#define vset_v_i8m2_i8m8(...) __riscv_vset_v_i8m2_i8m8(__VA_ARGS__) +#define vset_v_i8m4_i8m8(...) __riscv_vset_v_i8m4_i8m8(__VA_ARGS__) +#define vset_v_i16m1_i16m2(...) __riscv_vset_v_i16m1_i16m2(__VA_ARGS__) +#define vset_v_i16m1_i16m4(...) __riscv_vset_v_i16m1_i16m4(__VA_ARGS__) +#define vset_v_i16m2_i16m4(...) __riscv_vset_v_i16m2_i16m4(__VA_ARGS__) +#define vset_v_i16m1_i16m8(...) __riscv_vset_v_i16m1_i16m8(__VA_ARGS__) +#define vset_v_i16m2_i16m8(...) __riscv_vset_v_i16m2_i16m8(__VA_ARGS__) +#define vset_v_i16m4_i16m8(...) __riscv_vset_v_i16m4_i16m8(__VA_ARGS__) +#define vset_v_i32m1_i32m2(...) __riscv_vset_v_i32m1_i32m2(__VA_ARGS__) +#define vset_v_i32m1_i32m4(...) __riscv_vset_v_i32m1_i32m4(__VA_ARGS__) +#define vset_v_i32m2_i32m4(...) __riscv_vset_v_i32m2_i32m4(__VA_ARGS__) +#define vset_v_i32m1_i32m8(...) __riscv_vset_v_i32m1_i32m8(__VA_ARGS__) +#define vset_v_i32m2_i32m8(...) __riscv_vset_v_i32m2_i32m8(__VA_ARGS__) +#define vset_v_i32m4_i32m8(...) __riscv_vset_v_i32m4_i32m8(__VA_ARGS__) +#define vset_v_i64m1_i64m2(...) __riscv_vset_v_i64m1_i64m2(__VA_ARGS__) +#define vset_v_i64m1_i64m4(...) __riscv_vset_v_i64m1_i64m4(__VA_ARGS__) +#define vset_v_i64m2_i64m4(...) __riscv_vset_v_i64m2_i64m4(__VA_ARGS__) +#define vset_v_i64m1_i64m8(...) __riscv_vset_v_i64m1_i64m8(__VA_ARGS__) +#define vset_v_i64m2_i64m8(...) __riscv_vset_v_i64m2_i64m8(__VA_ARGS__) +#define vset_v_i64m4_i64m8(...) __riscv_vset_v_i64m4_i64m8(__VA_ARGS__) +#define vset_v_u8m1_u8m2(...) __riscv_vset_v_u8m1_u8m2(__VA_ARGS__) +#define vset_v_u8m1_u8m4(...) __riscv_vset_v_u8m1_u8m4(__VA_ARGS__) +#define vset_v_u8m2_u8m4(...) __riscv_vset_v_u8m2_u8m4(__VA_ARGS__) +#define vset_v_u8m1_u8m8(...) __riscv_vset_v_u8m1_u8m8(__VA_ARGS__) +#define vset_v_u8m2_u8m8(...) __riscv_vset_v_u8m2_u8m8(__VA_ARGS__) +#define vset_v_u8m4_u8m8(...) __riscv_vset_v_u8m4_u8m8(__VA_ARGS__) +#define vset_v_u16m1_u16m2(...) __riscv_vset_v_u16m1_u16m2(__VA_ARGS__) +#define vset_v_u16m1_u16m4(...) __riscv_vset_v_u16m1_u16m4(__VA_ARGS__) +#define vset_v_u16m2_u16m4(...) __riscv_vset_v_u16m2_u16m4(__VA_ARGS__) +#define vset_v_u16m1_u16m8(...) __riscv_vset_v_u16m1_u16m8(__VA_ARGS__) +#define vset_v_u16m2_u16m8(...) __riscv_vset_v_u16m2_u16m8(__VA_ARGS__) +#define vset_v_u16m4_u16m8(...) __riscv_vset_v_u16m4_u16m8(__VA_ARGS__) +#define vset_v_u32m1_u32m2(...) __riscv_vset_v_u32m1_u32m2(__VA_ARGS__) +#define vset_v_u32m1_u32m4(...) __riscv_vset_v_u32m1_u32m4(__VA_ARGS__) +#define vset_v_u32m2_u32m4(...) __riscv_vset_v_u32m2_u32m4(__VA_ARGS__) +#define vset_v_u32m1_u32m8(...) __riscv_vset_v_u32m1_u32m8(__VA_ARGS__) +#define vset_v_u32m2_u32m8(...) __riscv_vset_v_u32m2_u32m8(__VA_ARGS__) +#define vset_v_u32m4_u32m8(...) __riscv_vset_v_u32m4_u32m8(__VA_ARGS__) +#define vset_v_u64m1_u64m2(...) __riscv_vset_v_u64m1_u64m2(__VA_ARGS__) +#define vset_v_u64m1_u64m4(...) __riscv_vset_v_u64m1_u64m4(__VA_ARGS__) +#define vset_v_u64m2_u64m4(...) __riscv_vset_v_u64m2_u64m4(__VA_ARGS__) +#define vset_v_u64m1_u64m8(...) __riscv_vset_v_u64m1_u64m8(__VA_ARGS__) +#define vset_v_u64m2_u64m8(...) __riscv_vset_v_u64m2_u64m8(__VA_ARGS__) +#define vset_v_u64m4_u64m8(...) __riscv_vset_v_u64m4_u64m8(__VA_ARGS__) +#define vget_v_f16m2_f16m1(...) __riscv_vget_v_f16m2_f16m1(__VA_ARGS__) +#define vget_v_f16m4_f16m1(...) __riscv_vget_v_f16m4_f16m1(__VA_ARGS__) +#define vget_v_f16m8_f16m1(...) __riscv_vget_v_f16m8_f16m1(__VA_ARGS__) +#define vget_v_f16m4_f16m2(...) __riscv_vget_v_f16m4_f16m2(__VA_ARGS__) +#define vget_v_f16m8_f16m2(...) __riscv_vget_v_f16m8_f16m2(__VA_ARGS__) +#define vget_v_f16m8_f16m4(...) __riscv_vget_v_f16m8_f16m4(__VA_ARGS__) +#define vget_v_f32m2_f32m1(...) __riscv_vget_v_f32m2_f32m1(__VA_ARGS__) +#define vget_v_f32m4_f32m1(...) __riscv_vget_v_f32m4_f32m1(__VA_ARGS__) +#define vget_v_f32m8_f32m1(...) __riscv_vget_v_f32m8_f32m1(__VA_ARGS__) +#define vget_v_f32m4_f32m2(...) __riscv_vget_v_f32m4_f32m2(__VA_ARGS__) +#define vget_v_f32m8_f32m2(...) __riscv_vget_v_f32m8_f32m2(__VA_ARGS__) +#define vget_v_f32m8_f32m4(...) __riscv_vget_v_f32m8_f32m4(__VA_ARGS__) +#define vget_v_f64m2_f64m1(...) __riscv_vget_v_f64m2_f64m1(__VA_ARGS__) +#define vget_v_f64m4_f64m1(...) __riscv_vget_v_f64m4_f64m1(__VA_ARGS__) +#define vget_v_f64m8_f64m1(...) __riscv_vget_v_f64m8_f64m1(__VA_ARGS__) +#define vget_v_f64m4_f64m2(...) __riscv_vget_v_f64m4_f64m2(__VA_ARGS__) +#define vget_v_f64m8_f64m2(...) __riscv_vget_v_f64m8_f64m2(__VA_ARGS__) +#define vget_v_f64m8_f64m4(...) __riscv_vget_v_f64m8_f64m4(__VA_ARGS__) +#define vget_v_i8m2_i8m1(...) __riscv_vget_v_i8m2_i8m1(__VA_ARGS__) +#define vget_v_i8m4_i8m1(...) __riscv_vget_v_i8m4_i8m1(__VA_ARGS__) +#define vget_v_i8m8_i8m1(...) __riscv_vget_v_i8m8_i8m1(__VA_ARGS__) +#define vget_v_i8m4_i8m2(...) __riscv_vget_v_i8m4_i8m2(__VA_ARGS__) +#define vget_v_i8m8_i8m2(...) __riscv_vget_v_i8m8_i8m2(__VA_ARGS__) +#define vget_v_i8m8_i8m4(...) __riscv_vget_v_i8m8_i8m4(__VA_ARGS__) +#define vget_v_i16m2_i16m1(...) __riscv_vget_v_i16m2_i16m1(__VA_ARGS__) +#define vget_v_i16m4_i16m1(...) __riscv_vget_v_i16m4_i16m1(__VA_ARGS__) +#define vget_v_i16m8_i16m1(...) __riscv_vget_v_i16m8_i16m1(__VA_ARGS__) +#define vget_v_i16m4_i16m2(...) __riscv_vget_v_i16m4_i16m2(__VA_ARGS__) +#define vget_v_i16m8_i16m2(...) __riscv_vget_v_i16m8_i16m2(__VA_ARGS__) +#define vget_v_i16m8_i16m4(...) __riscv_vget_v_i16m8_i16m4(__VA_ARGS__) +#define vget_v_i32m2_i32m1(...) __riscv_vget_v_i32m2_i32m1(__VA_ARGS__) +#define vget_v_i32m4_i32m1(...) __riscv_vget_v_i32m4_i32m1(__VA_ARGS__) +#define vget_v_i32m8_i32m1(...) __riscv_vget_v_i32m8_i32m1(__VA_ARGS__) +#define vget_v_i32m4_i32m2(...) __riscv_vget_v_i32m4_i32m2(__VA_ARGS__) +#define vget_v_i32m8_i32m2(...) __riscv_vget_v_i32m8_i32m2(__VA_ARGS__) +#define vget_v_i32m8_i32m4(...) __riscv_vget_v_i32m8_i32m4(__VA_ARGS__) +#define vget_v_i64m2_i64m1(...) __riscv_vget_v_i64m2_i64m1(__VA_ARGS__) +#define vget_v_i64m4_i64m1(...) __riscv_vget_v_i64m4_i64m1(__VA_ARGS__) +#define vget_v_i64m8_i64m1(...) __riscv_vget_v_i64m8_i64m1(__VA_ARGS__) +#define vget_v_i64m4_i64m2(...) __riscv_vget_v_i64m4_i64m2(__VA_ARGS__) +#define vget_v_i64m8_i64m2(...) __riscv_vget_v_i64m8_i64m2(__VA_ARGS__) +#define vget_v_i64m8_i64m4(...) __riscv_vget_v_i64m8_i64m4(__VA_ARGS__) +#define vget_v_u8m2_u8m1(...) __riscv_vget_v_u8m2_u8m1(__VA_ARGS__) +#define vget_v_u8m4_u8m1(...) __riscv_vget_v_u8m4_u8m1(__VA_ARGS__) +#define vget_v_u8m8_u8m1(...) __riscv_vget_v_u8m8_u8m1(__VA_ARGS__) +#define vget_v_u8m4_u8m2(...) __riscv_vget_v_u8m4_u8m2(__VA_ARGS__) +#define vget_v_u8m8_u8m2(...) __riscv_vget_v_u8m8_u8m2(__VA_ARGS__) +#define vget_v_u8m8_u8m4(...) __riscv_vget_v_u8m8_u8m4(__VA_ARGS__) +#define vget_v_u16m2_u16m1(...) __riscv_vget_v_u16m2_u16m1(__VA_ARGS__) +#define vget_v_u16m4_u16m1(...) __riscv_vget_v_u16m4_u16m1(__VA_ARGS__) +#define vget_v_u16m8_u16m1(...) __riscv_vget_v_u16m8_u16m1(__VA_ARGS__) +#define vget_v_u16m4_u16m2(...) __riscv_vget_v_u16m4_u16m2(__VA_ARGS__) +#define vget_v_u16m8_u16m2(...) __riscv_vget_v_u16m8_u16m2(__VA_ARGS__) +#define vget_v_u16m8_u16m4(...) __riscv_vget_v_u16m8_u16m4(__VA_ARGS__) +#define vget_v_u32m2_u32m1(...) __riscv_vget_v_u32m2_u32m1(__VA_ARGS__) +#define vget_v_u32m4_u32m1(...) __riscv_vget_v_u32m4_u32m1(__VA_ARGS__) +#define vget_v_u32m8_u32m1(...) __riscv_vget_v_u32m8_u32m1(__VA_ARGS__) +#define vget_v_u32m4_u32m2(...) __riscv_vget_v_u32m4_u32m2(__VA_ARGS__) +#define vget_v_u32m8_u32m2(...) __riscv_vget_v_u32m8_u32m2(__VA_ARGS__) +#define vget_v_u32m8_u32m4(...) __riscv_vget_v_u32m8_u32m4(__VA_ARGS__) +#define vget_v_u64m2_u64m1(...) __riscv_vget_v_u64m2_u64m1(__VA_ARGS__) +#define vget_v_u64m4_u64m1(...) __riscv_vget_v_u64m4_u64m1(__VA_ARGS__) +#define vget_v_u64m8_u64m1(...) __riscv_vget_v_u64m8_u64m1(__VA_ARGS__) +#define vget_v_u64m4_u64m2(...) __riscv_vget_v_u64m4_u64m2(__VA_ARGS__) +#define vget_v_u64m8_u64m2(...) __riscv_vget_v_u64m8_u64m2(__VA_ARGS__) +#define vget_v_u64m8_u64m4(...) __riscv_vget_v_u64m8_u64m4(__VA_ARGS__) +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_overloaded-non-policy.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_overloaded-non-policy.hpp new file mode 100644 index 0000000..12a34d2 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_010_compat_overloaded-non-policy.hpp @@ -0,0 +1,768 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copied from +// https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/auto-generated/rvv-v0p10-compatible-headers + +#ifndef __RVV_0P10_COMPATIBLE_HEADERS_OVERLOADED_NON_POLICY_H +#define __RVV_0P10_COMPATIBLE_HEADERS_OVERLOADED_NON_POLICY_H + + +// The maximum number of parameters is 20, this is held by segment load +// instructions with a NFIELD (NF) of 8. 20 is contributed by 8 vector register +// pointers passed, 1 vector mask register, 8 passthrough register for +// undisturbed policy, and 3 for address base, byte index, vl. +#define _GET_OVERRIDE(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13,\ +_14, _15, _16, _17, _18, _19, _20, NAME, ...) NAME + + +#if __has_include ("riscv_vector.h") +#include +#endif +#ifndef __RISCV_VECTOR_H +#include_next +#endif + +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +#define vmerge(mask, op1, op2, vl) __riscv_vmerge((op1), (op2), (mask), (vl)) +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +#define vfmerge(mask, op1, op2, vl) __riscv_vfmerge((op1), (op2), (mask), (vl)) +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +// masked functions +#define vcompress(mask, dest, src, vl) __riscv_vcompress_tu((dest), (src), (mask), (vl)) +// Reinterpret between different type under the same SEW/LMUL +// Reinterpret between different SEW under the same LMUL +#define vse16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vse16, __riscv_vse16, 2, 1)(__VA_ARGS__) +#define vse32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vse32, __riscv_vse32, 2, 1)(__VA_ARGS__) +#define vse64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vse64, __riscv_vse64, 2, 1)(__VA_ARGS__) +#define vse8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vse8, __riscv_vse8, 2, 1)(__VA_ARGS__) +#define vsse16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsse16, __riscv_vsse16, 3, 2, 1)(__VA_ARGS__) +#define vsse32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsse32, __riscv_vsse32, 3, 2, 1)(__VA_ARGS__) +#define vsse64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsse64, __riscv_vsse64, 3, 2, 1)(__VA_ARGS__) +#define vsse8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsse8, __riscv_vsse8, 3, 2, 1)(__VA_ARGS__) +#define vloxei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vloxei8_tumu, 4, __riscv_vloxei8, 2, 1)(__VA_ARGS__) +#define vloxei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vloxei16_tumu, 4, __riscv_vloxei16, 2, 1)(__VA_ARGS__) +#define vloxei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vloxei32_tumu, 4, __riscv_vloxei32, 2, 1)(__VA_ARGS__) +#define vloxei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vloxei64_tumu, 4, __riscv_vloxei64, 2, 1)(__VA_ARGS__) +#define vluxei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vluxei8_tumu, 4, __riscv_vluxei8, 2, 1)(__VA_ARGS__) +#define vluxei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vluxei16_tumu, 4, __riscv_vluxei16, 2, 1)(__VA_ARGS__) +#define vluxei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vluxei32_tumu, 4, __riscv_vluxei32, 2, 1)(__VA_ARGS__) +#define vluxei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vluxei64_tumu, 4, __riscv_vluxei64, 2, 1)(__VA_ARGS__) +#define vsoxei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsoxei8, __riscv_vsoxei8, 3, 2, 1)(__VA_ARGS__) +#define vsoxei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsoxei16, __riscv_vsoxei16, 3, 2, 1)(__VA_ARGS__) +#define vsoxei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsoxei32, __riscv_vsoxei32, 3, 2, 1)(__VA_ARGS__) +#define vsoxei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsoxei64, __riscv_vsoxei64, 3, 2, 1)(__VA_ARGS__) +#define vsuxei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsuxei8, __riscv_vsuxei8, 3, 2, 1)(__VA_ARGS__) +#define vsuxei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsuxei16, __riscv_vsuxei16, 3, 2, 1)(__VA_ARGS__) +#define vsuxei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsuxei32, __riscv_vsuxei32, 3, 2, 1)(__VA_ARGS__) +#define vsuxei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsuxei64, __riscv_vsuxei64, 3, 2, 1)(__VA_ARGS__) +#define vsseg2e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsseg2e16, __riscv_vsseg2e16, 3, 2, 1)(__VA_ARGS__) +#define vsseg3e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsseg3e16, __riscv_vsseg3e16, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg4e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsseg4e16, __riscv_vsseg4e16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg5e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsseg5e16, __riscv_vsseg5e16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg6e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsseg6e16, __riscv_vsseg6e16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg7e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsseg7e16, __riscv_vsseg7e16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg8e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsseg8e16, __riscv_vsseg8e16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg2e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsseg2e32, __riscv_vsseg2e32, 3, 2, 1)(__VA_ARGS__) +#define vsseg3e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsseg3e32, __riscv_vsseg3e32, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg4e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsseg4e32, __riscv_vsseg4e32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg5e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsseg5e32, __riscv_vsseg5e32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg6e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsseg6e32, __riscv_vsseg6e32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg7e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsseg7e32, __riscv_vsseg7e32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg8e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsseg8e32, __riscv_vsseg8e32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg2e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsseg2e64, __riscv_vsseg2e64, 3, 2, 1)(__VA_ARGS__) +#define vsseg3e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsseg3e64, __riscv_vsseg3e64, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg4e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsseg4e64, __riscv_vsseg4e64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg5e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsseg5e64, __riscv_vsseg5e64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg6e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsseg6e64, __riscv_vsseg6e64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg7e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsseg7e64, __riscv_vsseg7e64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg8e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsseg8e64, __riscv_vsseg8e64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg2e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsseg2e8, __riscv_vsseg2e8, 3, 2, 1)(__VA_ARGS__) +#define vsseg3e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsseg3e8, __riscv_vsseg3e8, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg4e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsseg4e8, __riscv_vsseg4e8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg5e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsseg5e8, __riscv_vsseg5e8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg6e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsseg6e8, __riscv_vsseg6e8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg7e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsseg7e8, __riscv_vsseg7e8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsseg8e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsseg8e8, __riscv_vsseg8e8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg2e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vssseg2e16, __riscv_vssseg2e16, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg3e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vssseg3e16, __riscv_vssseg3e16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg4e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vssseg4e16, __riscv_vssseg4e16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg5e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vssseg5e16, __riscv_vssseg5e16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg6e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vssseg6e16, __riscv_vssseg6e16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg7e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vssseg7e16, __riscv_vssseg7e16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg8e16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vssseg8e16, __riscv_vssseg8e16, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg2e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vssseg2e32, __riscv_vssseg2e32, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg3e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vssseg3e32, __riscv_vssseg3e32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg4e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vssseg4e32, __riscv_vssseg4e32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg5e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vssseg5e32, __riscv_vssseg5e32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg6e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vssseg6e32, __riscv_vssseg6e32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg7e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vssseg7e32, __riscv_vssseg7e32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg8e32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vssseg8e32, __riscv_vssseg8e32, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg2e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vssseg2e64, __riscv_vssseg2e64, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg3e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vssseg3e64, __riscv_vssseg3e64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg4e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vssseg4e64, __riscv_vssseg4e64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg5e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vssseg5e64, __riscv_vssseg5e64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg6e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vssseg6e64, __riscv_vssseg6e64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg7e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vssseg7e64, __riscv_vssseg7e64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg8e64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vssseg8e64, __riscv_vssseg8e64, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg2e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vssseg2e8, __riscv_vssseg2e8, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg3e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vssseg3e8, __riscv_vssseg3e8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg4e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vssseg4e8, __riscv_vssseg4e8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg5e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vssseg5e8, __riscv_vssseg5e8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg6e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vssseg6e8, __riscv_vssseg6e8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg7e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vssseg7e8, __riscv_vssseg7e8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vssseg8e8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vssseg8e8, __riscv_vssseg8e8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg2ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vloxseg2ei8_tumu, 7, 6, __riscv_vloxseg2ei8, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg3ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg3ei8_tumu, 9, 8, 7, __riscv_vloxseg3ei8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg4ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vloxseg4ei8_tumu, 11, 10, 9, 8, __riscv_vloxseg4ei8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg5ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vloxseg5ei8_tumu, 13, 12, 11, 10, 9, __riscv_vloxseg5ei8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg6ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vloxseg6ei8_tumu, 15, 14, 13, 12, 11, 10, __riscv_vloxseg6ei8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg7ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vloxseg7ei8_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg7ei8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg8ei8(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vloxseg8ei8_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vloxseg8ei8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg2ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vloxseg2ei16_tumu, 7, 6, __riscv_vloxseg2ei16, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg3ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg3ei16_tumu, 9, 8, 7, __riscv_vloxseg3ei16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg4ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vloxseg4ei16_tumu, 11, 10, 9, 8, __riscv_vloxseg4ei16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg5ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vloxseg5ei16_tumu, 13, 12, 11, 10, 9, __riscv_vloxseg5ei16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg6ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vloxseg6ei16_tumu, 15, 14, 13, 12, 11, 10, __riscv_vloxseg6ei16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg7ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vloxseg7ei16_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg7ei16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg8ei16(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vloxseg8ei16_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vloxseg8ei16, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg2ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vloxseg2ei32_tumu, 7, 6, __riscv_vloxseg2ei32, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg3ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg3ei32_tumu, 9, 8, 7, __riscv_vloxseg3ei32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg4ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vloxseg4ei32_tumu, 11, 10, 9, 8, __riscv_vloxseg4ei32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg5ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vloxseg5ei32_tumu, 13, 12, 11, 10, 9, __riscv_vloxseg5ei32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg6ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vloxseg6ei32_tumu, 15, 14, 13, 12, 11, 10, __riscv_vloxseg6ei32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg7ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vloxseg7ei32_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg7ei32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg8ei32(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vloxseg8ei32_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vloxseg8ei32, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg2ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vloxseg2ei64_tumu, 7, 6, __riscv_vloxseg2ei64, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg3ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg3ei64_tumu, 9, 8, 7, __riscv_vloxseg3ei64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg4ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vloxseg4ei64_tumu, 11, 10, 9, 8, __riscv_vloxseg4ei64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg5ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vloxseg5ei64_tumu, 13, 12, 11, 10, 9, __riscv_vloxseg5ei64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg6ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vloxseg6ei64_tumu, 15, 14, 13, 12, 11, 10, __riscv_vloxseg6ei64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg7ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vloxseg7ei64_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vloxseg7ei64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vloxseg8ei64(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vloxseg8ei64_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vloxseg8ei64, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg2ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vluxseg2ei8_tumu, 7, 6, __riscv_vluxseg2ei8, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg3ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg3ei8_tumu, 9, 8, 7, __riscv_vluxseg3ei8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg4ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vluxseg4ei8_tumu, 11, 10, 9, 8, __riscv_vluxseg4ei8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg5ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vluxseg5ei8_tumu, 13, 12, 11, 10, 9, __riscv_vluxseg5ei8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg6ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vluxseg6ei8_tumu, 15, 14, 13, 12, 11, 10, __riscv_vluxseg6ei8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg7ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vluxseg7ei8_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg7ei8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg8ei8(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vluxseg8ei8_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vluxseg8ei8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg2ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vluxseg2ei16_tumu, 7, 6, __riscv_vluxseg2ei16, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg3ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg3ei16_tumu, 9, 8, 7, __riscv_vluxseg3ei16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg4ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vluxseg4ei16_tumu, 11, 10, 9, 8, __riscv_vluxseg4ei16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg5ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vluxseg5ei16_tumu, 13, 12, 11, 10, 9, __riscv_vluxseg5ei16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg6ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vluxseg6ei16_tumu, 15, 14, 13, 12, 11, 10, __riscv_vluxseg6ei16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg7ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vluxseg7ei16_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg7ei16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg8ei16(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vluxseg8ei16_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vluxseg8ei16, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg2ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vluxseg2ei32_tumu, 7, 6, __riscv_vluxseg2ei32, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg3ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg3ei32_tumu, 9, 8, 7, __riscv_vluxseg3ei32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg4ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vluxseg4ei32_tumu, 11, 10, 9, 8, __riscv_vluxseg4ei32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg5ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vluxseg5ei32_tumu, 13, 12, 11, 10, 9, __riscv_vluxseg5ei32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg6ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vluxseg6ei32_tumu, 15, 14, 13, 12, 11, 10, __riscv_vluxseg6ei32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg7ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vluxseg7ei32_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg7ei32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg8ei32(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vluxseg8ei32_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vluxseg8ei32, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg2ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vluxseg2ei64_tumu, 7, 6, __riscv_vluxseg2ei64, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg3ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg3ei64_tumu, 9, 8, 7, __riscv_vluxseg3ei64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg4ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vluxseg4ei64_tumu, 11, 10, 9, 8, __riscv_vluxseg4ei64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg5ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, __riscv_vluxseg5ei64_tumu, 13, 12, 11, 10, 9, __riscv_vluxseg5ei64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg6ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, __riscv_vluxseg6ei64_tumu, 15, 14, 13, 12, 11, 10, __riscv_vluxseg6ei64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg7ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, __riscv_vluxseg7ei64_tumu, 17, 16, 15, 14, 13, 12, 11, __riscv_vluxseg7ei64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vluxseg8ei64(...) _GET_OVERRIDE(__VA_ARGS__, __riscv_vluxseg8ei64_tumu, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vluxseg8ei64, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg2ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsoxseg2ei8, __riscv_vsoxseg2ei8, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg3ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsoxseg3ei8, __riscv_vsoxseg3ei8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg4ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsoxseg4ei8, __riscv_vsoxseg4ei8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg5ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsoxseg5ei8, __riscv_vsoxseg5ei8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg6ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsoxseg6ei8, __riscv_vsoxseg6ei8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg7ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsoxseg7ei8, __riscv_vsoxseg7ei8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg8ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsoxseg8ei8, __riscv_vsoxseg8ei8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg2ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsoxseg2ei16, __riscv_vsoxseg2ei16, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg3ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsoxseg3ei16, __riscv_vsoxseg3ei16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg4ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsoxseg4ei16, __riscv_vsoxseg4ei16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg5ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsoxseg5ei16, __riscv_vsoxseg5ei16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg6ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsoxseg6ei16, __riscv_vsoxseg6ei16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg7ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsoxseg7ei16, __riscv_vsoxseg7ei16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg8ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsoxseg8ei16, __riscv_vsoxseg8ei16, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg2ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsoxseg2ei32, __riscv_vsoxseg2ei32, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg3ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsoxseg3ei32, __riscv_vsoxseg3ei32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg4ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsoxseg4ei32, __riscv_vsoxseg4ei32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg5ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsoxseg5ei32, __riscv_vsoxseg5ei32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg6ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsoxseg6ei32, __riscv_vsoxseg6ei32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg7ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsoxseg7ei32, __riscv_vsoxseg7ei32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg8ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsoxseg8ei32, __riscv_vsoxseg8ei32, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg2ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsoxseg2ei64, __riscv_vsoxseg2ei64, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg3ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsoxseg3ei64, __riscv_vsoxseg3ei64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg4ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsoxseg4ei64, __riscv_vsoxseg4ei64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg5ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsoxseg5ei64, __riscv_vsoxseg5ei64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg6ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsoxseg6ei64, __riscv_vsoxseg6ei64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg7ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsoxseg7ei64, __riscv_vsoxseg7ei64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsoxseg8ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsoxseg8ei64, __riscv_vsoxseg8ei64, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg2ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsuxseg2ei8, __riscv_vsuxseg2ei8, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg3ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsuxseg3ei8, __riscv_vsuxseg3ei8, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg4ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsuxseg4ei8, __riscv_vsuxseg4ei8, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg5ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsuxseg5ei8, __riscv_vsuxseg5ei8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg6ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsuxseg6ei8, __riscv_vsuxseg6ei8, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg7ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsuxseg7ei8, __riscv_vsuxseg7ei8, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg8ei8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsuxseg8ei8, __riscv_vsuxseg8ei8, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg2ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsuxseg2ei16, __riscv_vsuxseg2ei16, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg3ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsuxseg3ei16, __riscv_vsuxseg3ei16, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg4ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsuxseg4ei16, __riscv_vsuxseg4ei16, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg5ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsuxseg5ei16, __riscv_vsuxseg5ei16, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg6ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsuxseg6ei16, __riscv_vsuxseg6ei16, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg7ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsuxseg7ei16, __riscv_vsuxseg7ei16, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg8ei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsuxseg8ei16, __riscv_vsuxseg8ei16, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg2ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsuxseg2ei32, __riscv_vsuxseg2ei32, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg3ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsuxseg3ei32, __riscv_vsuxseg3ei32, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg4ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsuxseg4ei32, __riscv_vsuxseg4ei32, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg5ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsuxseg5ei32, __riscv_vsuxseg5ei32, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg6ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsuxseg6ei32, __riscv_vsuxseg6ei32, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg7ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsuxseg7ei32, __riscv_vsuxseg7ei32, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg8ei32(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsuxseg8ei32, __riscv_vsuxseg8ei32, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg2ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, __riscv_vsuxseg2ei64, __riscv_vsuxseg2ei64, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg3ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, __riscv_vsuxseg3ei64, __riscv_vsuxseg3ei64, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg4ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, __riscv_vsuxseg4ei64, __riscv_vsuxseg4ei64, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg5ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, __riscv_vsuxseg5ei64, __riscv_vsuxseg5ei64, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg6ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, __riscv_vsuxseg6ei64, __riscv_vsuxseg6ei64, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg7ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, __riscv_vsuxseg7ei64, __riscv_vsuxseg7ei64, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vsuxseg8ei64(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, __riscv_vsuxseg8ei64, __riscv_vsuxseg8ei64, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)(__VA_ARGS__) +#define vadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vadd_tumu, 4, __riscv_vadd, 2, 1)(__VA_ARGS__) +#define vsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsub_tumu, 4, __riscv_vsub, 2, 1)(__VA_ARGS__) +#define vrsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vrsub_tumu, 4, __riscv_vrsub, 2, 1)(__VA_ARGS__) +#define vneg(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vneg_tumu, 3, __riscv_vneg, 1)(__VA_ARGS__) +#define vwadd_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwadd_vv_tumu, 4, __riscv_vwadd_vv, 2, 1)(__VA_ARGS__) +#define vwadd_vx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwadd_vx_tumu, 4, __riscv_vwadd_vx, 2, 1)(__VA_ARGS__) +#define vwadd_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwadd_wv_tumu, 4, __riscv_vwadd_wv, 2, 1)(__VA_ARGS__) +#define vwadd_wx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwadd_wx_tumu, 4, __riscv_vwadd_wx, 2, 1)(__VA_ARGS__) +#define vwsub_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsub_vv_tumu, 4, __riscv_vwsub_vv, 2, 1)(__VA_ARGS__) +#define vwsub_vx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsub_vx_tumu, 4, __riscv_vwsub_vx, 2, 1)(__VA_ARGS__) +#define vwsub_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsub_wv_tumu, 4, __riscv_vwsub_wv, 2, 1)(__VA_ARGS__) +#define vwsub_wx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsub_wx_tumu, 4, __riscv_vwsub_wx, 2, 1)(__VA_ARGS__) +#define vwaddu_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwaddu_vv_tumu, 4, __riscv_vwaddu_vv, 2, 1)(__VA_ARGS__) +#define vwaddu_vx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwaddu_vx_tumu, 4, __riscv_vwaddu_vx, 2, 1)(__VA_ARGS__) +#define vwaddu_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwaddu_wv_tumu, 4, __riscv_vwaddu_wv, 2, 1)(__VA_ARGS__) +#define vwaddu_wx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwaddu_wx_tumu, 4, __riscv_vwaddu_wx, 2, 1)(__VA_ARGS__) +#define vwsubu_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsubu_vv_tumu, 4, __riscv_vwsubu_vv, 2, 1)(__VA_ARGS__) +#define vwsubu_vx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsubu_vx_tumu, 4, __riscv_vwsubu_vx, 2, 1)(__VA_ARGS__) +#define vwsubu_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsubu_wv_tumu, 4, __riscv_vwsubu_wv, 2, 1)(__VA_ARGS__) +#define vwsubu_wx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwsubu_wx_tumu, 4, __riscv_vwsubu_wx, 2, 1)(__VA_ARGS__) +#define vsext_vf2(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vsext_vf2_tumu, 3, __riscv_vsext_vf2, 1)(__VA_ARGS__) +#define vsext_vf4(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vsext_vf4_tumu, 3, __riscv_vsext_vf4, 1)(__VA_ARGS__) +#define vsext_vf8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vsext_vf8_tumu, 3, __riscv_vsext_vf8, 1)(__VA_ARGS__) +#define vzext_vf2(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vzext_vf2_tumu, 3, __riscv_vzext_vf2, 1)(__VA_ARGS__) +#define vzext_vf4(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vzext_vf4_tumu, 3, __riscv_vzext_vf4, 1)(__VA_ARGS__) +#define vzext_vf8(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vzext_vf8_tumu, 3, __riscv_vzext_vf8, 1)(__VA_ARGS__) +#define vadc(...) __riscv_vadc(__VA_ARGS__) +#define vsbc(...) __riscv_vsbc(__VA_ARGS__) +#define vmadc(...) __riscv_vmadc(__VA_ARGS__) +#define vmsbc(...) __riscv_vmsbc(__VA_ARGS__) +#define vand(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vand_tumu, 4, __riscv_vand, 2, 1)(__VA_ARGS__) +#define vor(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vor_tumu, 4, __riscv_vor, 2, 1)(__VA_ARGS__) +#define vxor(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vxor_tumu, 4, __riscv_vxor, 2, 1)(__VA_ARGS__) +#define vnot(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vnot_tumu, 3, __riscv_vnot, 1)(__VA_ARGS__) +#define vsll(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsll_tumu, 4, __riscv_vsll, 2, 1)(__VA_ARGS__) +#define vsra(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsra_tumu, 4, __riscv_vsra, 2, 1)(__VA_ARGS__) +#define vsrl(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsrl_tumu, 4, __riscv_vsrl, 2, 1)(__VA_ARGS__) +#define vnsra(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnsra_tumu, 4, __riscv_vnsra, 2, 1)(__VA_ARGS__) +#define vnsrl(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnsrl_tumu, 4, __riscv_vnsrl, 2, 1)(__VA_ARGS__) +#define vmseq(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmseq_mu, 4, __riscv_vmseq, 2, 1)(__VA_ARGS__) +#define vmsne(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsne_mu, 4, __riscv_vmsne, 2, 1)(__VA_ARGS__) +#define vmslt(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmslt_mu, 4, __riscv_vmslt, 2, 1)(__VA_ARGS__) +#define vmsle(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsle_mu, 4, __riscv_vmsle, 2, 1)(__VA_ARGS__) +#define vmsgt(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsgt_mu, 4, __riscv_vmsgt, 2, 1)(__VA_ARGS__) +#define vmsge(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsge_mu, 4, __riscv_vmsge, 2, 1)(__VA_ARGS__) +#define vmsltu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsltu_mu, 4, __riscv_vmsltu, 2, 1)(__VA_ARGS__) +#define vmsleu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsleu_mu, 4, __riscv_vmsleu, 2, 1)(__VA_ARGS__) +#define vmsgtu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsgtu_mu, 4, __riscv_vmsgtu, 2, 1)(__VA_ARGS__) +#define vmsgeu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmsgeu_mu, 4, __riscv_vmsgeu, 2, 1)(__VA_ARGS__) +#define vmin(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmin_tumu, 4, __riscv_vmin, 2, 1)(__VA_ARGS__) +#define vmax(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmax_tumu, 4, __riscv_vmax, 2, 1)(__VA_ARGS__) +#define vminu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vminu_tumu, 4, __riscv_vminu, 2, 1)(__VA_ARGS__) +#define vmaxu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmaxu_tumu, 4, __riscv_vmaxu, 2, 1)(__VA_ARGS__) +#define vmul(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmul_tumu, 4, __riscv_vmul, 2, 1)(__VA_ARGS__) +#define vmulh(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmulh_tumu, 4, __riscv_vmulh, 2, 1)(__VA_ARGS__) +#define vmulhsu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmulhsu_tumu, 4, __riscv_vmulhsu, 2, 1)(__VA_ARGS__) +#define vmulhu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmulhu_tumu, 4, __riscv_vmulhu, 2, 1)(__VA_ARGS__) +#define vdiv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vdiv_tumu, 4, __riscv_vdiv, 2, 1)(__VA_ARGS__) +#define vrem(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vrem_tumu, 4, __riscv_vrem, 2, 1)(__VA_ARGS__) +#define vdivu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vdivu_tumu, 4, __riscv_vdivu, 2, 1)(__VA_ARGS__) +#define vremu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vremu_tumu, 4, __riscv_vremu, 2, 1)(__VA_ARGS__) +#define vwmul(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmul_tumu, 4, __riscv_vwmul, 2, 1)(__VA_ARGS__) +#define vwmulsu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmulsu_tumu, 4, __riscv_vwmulsu, 2, 1)(__VA_ARGS__) +#define vwmulu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmulu_tumu, 4, __riscv_vwmulu, 2, 1)(__VA_ARGS__) +#define vmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmacc_tumu, __riscv_vmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vnmsac(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnmsac_tumu, __riscv_vnmsac_tu, 3, 2, 1)(__VA_ARGS__) +#define vmadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmadd_tumu, __riscv_vmadd_tu, 3, 2, 1)(__VA_ARGS__) +#define vnmsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnmsub_tumu, __riscv_vnmsub_tu, 3, 2, 1)(__VA_ARGS__) +#define vwmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmacc_tumu, __riscv_vwmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vwmaccsu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmaccsu_tumu, __riscv_vwmaccsu_tu, 3, 2, 1)(__VA_ARGS__) +#define vwmaccus(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmaccus_tumu, __riscv_vwmaccus_tu, 3, 2, 1)(__VA_ARGS__) +#define vwmaccu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwmaccu_tumu, __riscv_vwmaccu_tu, 3, 2, 1)(__VA_ARGS__) +#define vmv_v(...) __riscv_vmv_v(__VA_ARGS__) +#define vsadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsadd_tumu, 4, __riscv_vsadd, 2, 1)(__VA_ARGS__) +#define vssub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vssub_tumu, 4, __riscv_vssub, 2, 1)(__VA_ARGS__) +#define vsaddu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsaddu_tumu, 4, __riscv_vsaddu, 2, 1)(__VA_ARGS__) +#define vssubu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vssubu_tumu, 4, __riscv_vssubu, 2, 1)(__VA_ARGS__) +#define vaadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vaadd_tumu, 4, __riscv_vaadd, 2, 1)(__VA_ARGS__) +#define vasub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vasub_tumu, 4, __riscv_vasub, 2, 1)(__VA_ARGS__) +#define vaaddu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vaaddu_tumu, 4, __riscv_vaaddu, 2, 1)(__VA_ARGS__) +#define vasubu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vasubu_tumu, 4, __riscv_vasubu, 2, 1)(__VA_ARGS__) +#define vsmul(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vsmul_mu, 4, __riscv_vsmul, 2, 1)(__VA_ARGS__) +#define vssra(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vssra_tumu, 4, __riscv_vssra, 2, 1)(__VA_ARGS__) +#define vssrl(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vssrl_tumu, 4, __riscv_vssrl, 2, 1)(__VA_ARGS__) +#define vnclip(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnclip_tumu, 4, __riscv_vnclip, 2, 1)(__VA_ARGS__) +#define vnclipu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vnclipu_tumu, 4, __riscv_vnclipu, 2, 1)(__VA_ARGS__) +#define vfadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfadd_tumu, 4, __riscv_vfadd, 2, 1)(__VA_ARGS__) +#define vfsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfsub_tumu, 4, __riscv_vfsub, 2, 1)(__VA_ARGS__) +#define vfrsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfrsub_tumu, 4, __riscv_vfrsub, 2, 1)(__VA_ARGS__) +#define vfneg(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfneg_tumu, 3, __riscv_vfneg, 1)(__VA_ARGS__) +#define vfwadd_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwadd_vv_tumu, 4, __riscv_vfwadd_vv, 2, 1)(__VA_ARGS__) +#define vfwadd_vf(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwadd_vf_tumu, 4, __riscv_vfwadd_vf, 2, 1)(__VA_ARGS__) +#define vfwadd_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwadd_wv_tumu, 4, __riscv_vfwadd_wv, 2, 1)(__VA_ARGS__) +#define vfwadd_wf(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwadd_wf_tumu, 4, __riscv_vfwadd_wf, 2, 1)(__VA_ARGS__) +#define vfwsub_vv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwsub_vv_tumu, 4, __riscv_vfwsub_vv, 2, 1)(__VA_ARGS__) +#define vfwsub_vf(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwsub_vf_tumu, 4, __riscv_vfwsub_vf, 2, 1)(__VA_ARGS__) +#define vfwsub_wv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwsub_wv_tumu, 4, __riscv_vfwsub_wv, 2, 1)(__VA_ARGS__) +#define vfwsub_wf(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwsub_wf_tumu, 4, __riscv_vfwsub_wf, 2, 1)(__VA_ARGS__) +#define vfmul(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmul_tumu, 4, __riscv_vfmul, 2, 1)(__VA_ARGS__) +#define vfdiv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfdiv_tumu, 4, __riscv_vfdiv, 2, 1)(__VA_ARGS__) +#define vfrdiv(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfrdiv_tumu, 4, __riscv_vfrdiv, 2, 1)(__VA_ARGS__) +#define vfwmul(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwmul_tumu, 4, __riscv_vfwmul, 2, 1)(__VA_ARGS__) +#define vfmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmacc_tumu, __riscv_vfmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vfnmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfnmacc_tumu, __riscv_vfnmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vfmsac(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmsac_tumu, __riscv_vfmsac_tu, 3, 2, 1)(__VA_ARGS__) +#define vfnmsac(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfnmsac_tumu, __riscv_vfnmsac_tu, 3, 2, 1)(__VA_ARGS__) +#define vfmadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmadd_tumu, __riscv_vfmadd_tu, 3, 2, 1)(__VA_ARGS__) +#define vfnmadd(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfnmadd_tumu, __riscv_vfnmadd_tu, 3, 2, 1)(__VA_ARGS__) +#define vfmsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmsub_tumu, __riscv_vfmsub_tu, 3, 2, 1)(__VA_ARGS__) +#define vfnmsub(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfnmsub_tumu, __riscv_vfnmsub_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwmacc_tumu, __riscv_vfwmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwnmacc(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwnmacc_tumu, __riscv_vfwnmacc_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwmsac(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwmsac_tumu, __riscv_vfwmsac_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwnmsac(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwnmsac_tumu, __riscv_vfwnmsac_tu, 3, 2, 1)(__VA_ARGS__) +#define vfsqrt(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfsqrt_tumu, 3, __riscv_vfsqrt, 1)(__VA_ARGS__) +#define vfrsqrt7(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfrsqrt7_tumu, 3, __riscv_vfrsqrt7, 1)(__VA_ARGS__) +#define vfrec7(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfrec7_tumu, 3, __riscv_vfrec7, 1)(__VA_ARGS__) +#define vfmin(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmin_tumu, 4, __riscv_vfmin, 2, 1)(__VA_ARGS__) +#define vfmax(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfmax_tumu, 4, __riscv_vfmax, 2, 1)(__VA_ARGS__) +#define vfsgnj(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfsgnj_tumu, 4, __riscv_vfsgnj, 2, 1)(__VA_ARGS__) +#define vfsgnjn(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfsgnjn_tumu, 4, __riscv_vfsgnjn, 2, 1)(__VA_ARGS__) +#define vfsgnjx(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfsgnjx_tumu, 4, __riscv_vfsgnjx, 2, 1)(__VA_ARGS__) +#define vfabs(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfabs_tumu, 3, __riscv_vfabs, 1)(__VA_ARGS__) +#define vmfeq(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmfeq_mu, 4, __riscv_vmfeq, 2, 1)(__VA_ARGS__) +#define vmfne(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmfne_mu, 4, __riscv_vmfne, 2, 1)(__VA_ARGS__) +#define vmflt(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmflt_mu, 4, __riscv_vmflt, 2, 1)(__VA_ARGS__) +#define vmfle(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmfle_mu, 4, __riscv_vmfle, 2, 1)(__VA_ARGS__) +#define vmfgt(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmfgt_mu, 4, __riscv_vmfgt, 2, 1)(__VA_ARGS__) +#define vmfge(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vmfge_mu, 4, __riscv_vmfge, 2, 1)(__VA_ARGS__) +#define vfclass(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfclass_tumu, 3, __riscv_vfclass, 1)(__VA_ARGS__) +#define vfcvt_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfcvt_x_tumu, 3, __riscv_vfcvt_x, 1)(__VA_ARGS__) +#define vfcvt_rtz_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfcvt_rtz_x_tumu, 3, __riscv_vfcvt_rtz_x, 1)(__VA_ARGS__) +#define vfcvt_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfcvt_xu_tumu, 3, __riscv_vfcvt_xu, 1)(__VA_ARGS__) +#define vfcvt_rtz_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfcvt_rtz_xu_tumu, 3, __riscv_vfcvt_rtz_xu, 1)(__VA_ARGS__) +#define vfcvt_f(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfcvt_f_tumu, 3, __riscv_vfcvt_f, 1)(__VA_ARGS__) +#define vwcvt_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vwcvt_x_tumu, 3, __riscv_vwcvt_x, 1)(__VA_ARGS__) +#define vwcvtu_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vwcvtu_x_tumu, 3, __riscv_vwcvtu_x, 1)(__VA_ARGS__) +#define vfwcvt_f(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfwcvt_f_tumu, 3, __riscv_vfwcvt_f, 1)(__VA_ARGS__) +#define vfwcvt_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfwcvt_x_tumu, 3, __riscv_vfwcvt_x, 1)(__VA_ARGS__) +#define vfwcvt_rtz_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfwcvt_rtz_x_tumu, 3, __riscv_vfwcvt_rtz_x, 1)(__VA_ARGS__) +#define vfwcvt_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfwcvt_xu_tumu, 3, __riscv_vfwcvt_xu, 1)(__VA_ARGS__) +#define vfwcvt_rtz_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfwcvt_rtz_xu_tumu, 3, __riscv_vfwcvt_rtz_xu, 1)(__VA_ARGS__) +#define vfncvt_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_x_tumu, 3, __riscv_vfncvt_x, 1)(__VA_ARGS__) +#define vfncvt_rtz_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_rtz_x_tumu, 3, __riscv_vfncvt_rtz_x, 1)(__VA_ARGS__) +#define vncvt_x(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vncvt_x_tumu, 3, __riscv_vncvt_x, 1)(__VA_ARGS__) +#define vfncvt_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_xu_tumu, 3, __riscv_vfncvt_xu, 1)(__VA_ARGS__) +#define vfncvt_rtz_xu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_rtz_xu_tumu, 3, __riscv_vfncvt_rtz_xu, 1)(__VA_ARGS__) +#define vfncvt_f(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_f_tumu, 3, __riscv_vfncvt_f, 1)(__VA_ARGS__) +#define vfncvt_rod_f(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vfncvt_rod_f_tumu, 3, __riscv_vfncvt_rod_f, 1)(__VA_ARGS__) +#define vredsum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredsum_tum, __riscv_vredsum_tu, 3, 2, 1)(__VA_ARGS__) +#define vredmax(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredmax_tum, __riscv_vredmax_tu, 3, 2, 1)(__VA_ARGS__) +#define vredmin(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredmin_tum, __riscv_vredmin_tu, 3, 2, 1)(__VA_ARGS__) +#define vredand(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredand_tum, __riscv_vredand_tu, 3, 2, 1)(__VA_ARGS__) +#define vredor(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredor_tum, __riscv_vredor_tu, 3, 2, 1)(__VA_ARGS__) +#define vredxor(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredxor_tum, __riscv_vredxor_tu, 3, 2, 1)(__VA_ARGS__) +#define vredmaxu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredmaxu_tum, __riscv_vredmaxu_tu, 3, 2, 1)(__VA_ARGS__) +#define vredminu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vredminu_tum, __riscv_vredminu_tu, 3, 2, 1)(__VA_ARGS__) +#define vwredsum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwredsum_tum, __riscv_vwredsum_tu, 3, 2, 1)(__VA_ARGS__) +#define vwredsumu(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vwredsumu_tum, __riscv_vwredsumu_tu, 3, 2, 1)(__VA_ARGS__) +#define vfredosum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfredosum_tum, __riscv_vfredosum_tu, 3, 2, 1)(__VA_ARGS__) +#define vfredusum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfredusum_tum, __riscv_vfredusum_tu, 3, 2, 1)(__VA_ARGS__) +#define vfredmax(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfredmax_tum, __riscv_vfredmax_tu, 3, 2, 1)(__VA_ARGS__) +#define vfredmin(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfredmin_tum, __riscv_vfredmin_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwredosum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwredosum_tum, __riscv_vfwredosum_tu, 3, 2, 1)(__VA_ARGS__) +#define vfwredusum(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfwredusum_tum, __riscv_vfwredusum_tu, 3, 2, 1)(__VA_ARGS__) +#define vsm(...) __riscv_vsm(__VA_ARGS__) +#define vmand(...) __riscv_vmand(__VA_ARGS__) +#define vmnand(...) __riscv_vmnand(__VA_ARGS__) +#define vmandn(...) __riscv_vmandn(__VA_ARGS__) +#define vmxor(...) __riscv_vmxor(__VA_ARGS__) +#define vmor(...) __riscv_vmor(__VA_ARGS__) +#define vmnor(...) __riscv_vmnor(__VA_ARGS__) +#define vmorn(...) __riscv_vmorn(__VA_ARGS__) +#define vmxnor(...) __riscv_vmxnor(__VA_ARGS__) +#define vmmv(...) __riscv_vmmv(__VA_ARGS__) +#define vmnot(...) __riscv_vmnot(__VA_ARGS__) +#define vcpop(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, __riscv_vcpop, __riscv_vcpop, 1)(__VA_ARGS__) +#define vfirst(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, __riscv_vfirst, __riscv_vfirst, 1)(__VA_ARGS__) +#define vmsbf(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vmsbf_mu, 3, __riscv_vmsbf, 1)(__VA_ARGS__) +#define vmsif(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vmsif_mu, 3, __riscv_vmsif, 1)(__VA_ARGS__) +#define vmsof(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, __riscv_vmsof_mu, 3, __riscv_vmsof, 1)(__VA_ARGS__) +#define vfmv_f(...) __riscv_vfmv_f(__VA_ARGS__) +#define vfmv_s(...) __riscv_vfmv_s_tu(__VA_ARGS__) +#define vmv_x(...) __riscv_vmv_x(__VA_ARGS__) +#define vmv_s(...) __riscv_vmv_s_tu(__VA_ARGS__) +#define vslideup(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vslideup_tumu, __riscv_vslideup_tu, 3, 2, 1)(__VA_ARGS__) +#define vslidedown(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vslidedown_tumu, __riscv_vslidedown_tu, 3, 2, 1)(__VA_ARGS__) +#define vfslide1up(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfslide1up_tumu, 4, __riscv_vfslide1up, 2, 1)(__VA_ARGS__) +#define vfslide1down(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vfslide1down_tumu, 4, __riscv_vfslide1down, 2, 1)(__VA_ARGS__) +#define vslide1up(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vslide1up_tumu, 4, __riscv_vslide1up, 2, 1)(__VA_ARGS__) +#define vslide1down(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vslide1down_tumu, 4, __riscv_vslide1down, 2, 1)(__VA_ARGS__) +#define vrgather(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vrgather_tumu, 4, __riscv_vrgather, 2, 1)(__VA_ARGS__) +#define vrgatherei16(...) _GET_OVERRIDE(__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, __riscv_vrgatherei16_tumu, 4, __riscv_vrgatherei16, 2, 1)(__VA_ARGS__) +#define vreinterpret_u8mf8(...) __riscv_vreinterpret_u8mf8(__VA_ARGS__) +#define vreinterpret_u8mf4(...) __riscv_vreinterpret_u8mf4(__VA_ARGS__) +#define vreinterpret_u8mf2(...) __riscv_vreinterpret_u8mf2(__VA_ARGS__) +#define vreinterpret_u8m1(...) __riscv_vreinterpret_u8m1(__VA_ARGS__) +#define vreinterpret_u8m2(...) __riscv_vreinterpret_u8m2(__VA_ARGS__) +#define vreinterpret_u8m4(...) __riscv_vreinterpret_u8m4(__VA_ARGS__) +#define vreinterpret_u8m8(...) __riscv_vreinterpret_u8m8(__VA_ARGS__) +#define vreinterpret_i8mf8(...) __riscv_vreinterpret_i8mf8(__VA_ARGS__) +#define vreinterpret_i8mf4(...) __riscv_vreinterpret_i8mf4(__VA_ARGS__) +#define vreinterpret_i8mf2(...) __riscv_vreinterpret_i8mf2(__VA_ARGS__) +#define vreinterpret_i8m1(...) __riscv_vreinterpret_i8m1(__VA_ARGS__) +#define vreinterpret_i8m2(...) __riscv_vreinterpret_i8m2(__VA_ARGS__) +#define vreinterpret_i8m4(...) __riscv_vreinterpret_i8m4(__VA_ARGS__) +#define vreinterpret_i8m8(...) __riscv_vreinterpret_i8m8(__VA_ARGS__) +#define vreinterpret_f16mf4(...) __riscv_vreinterpret_f16mf4(__VA_ARGS__) +#define vreinterpret_f16mf2(...) __riscv_vreinterpret_f16mf2(__VA_ARGS__) +#define vreinterpret_f16m1(...) __riscv_vreinterpret_f16m1(__VA_ARGS__) +#define vreinterpret_f16m2(...) __riscv_vreinterpret_f16m2(__VA_ARGS__) +#define vreinterpret_f16m4(...) __riscv_vreinterpret_f16m4(__VA_ARGS__) +#define vreinterpret_f16m8(...) __riscv_vreinterpret_f16m8(__VA_ARGS__) +#define vreinterpret_u16mf4(...) __riscv_vreinterpret_u16mf4(__VA_ARGS__) +#define vreinterpret_u16mf2(...) __riscv_vreinterpret_u16mf2(__VA_ARGS__) +#define vreinterpret_u16m1(...) __riscv_vreinterpret_u16m1(__VA_ARGS__) +#define vreinterpret_u16m2(...) __riscv_vreinterpret_u16m2(__VA_ARGS__) +#define vreinterpret_u16m4(...) __riscv_vreinterpret_u16m4(__VA_ARGS__) +#define vreinterpret_u16m8(...) __riscv_vreinterpret_u16m8(__VA_ARGS__) +#define vreinterpret_i16mf4(...) __riscv_vreinterpret_i16mf4(__VA_ARGS__) +#define vreinterpret_i16mf2(...) __riscv_vreinterpret_i16mf2(__VA_ARGS__) +#define vreinterpret_i16m1(...) __riscv_vreinterpret_i16m1(__VA_ARGS__) +#define vreinterpret_i16m2(...) __riscv_vreinterpret_i16m2(__VA_ARGS__) +#define vreinterpret_i16m4(...) __riscv_vreinterpret_i16m4(__VA_ARGS__) +#define vreinterpret_i16m8(...) __riscv_vreinterpret_i16m8(__VA_ARGS__) +#define vreinterpret_f32mf2(...) __riscv_vreinterpret_f32mf2(__VA_ARGS__) +#define vreinterpret_f32m1(...) __riscv_vreinterpret_f32m1(__VA_ARGS__) +#define vreinterpret_f32m2(...) __riscv_vreinterpret_f32m2(__VA_ARGS__) +#define vreinterpret_f32m4(...) __riscv_vreinterpret_f32m4(__VA_ARGS__) +#define vreinterpret_f32m8(...) __riscv_vreinterpret_f32m8(__VA_ARGS__) +#define vreinterpret_u32mf2(...) __riscv_vreinterpret_u32mf2(__VA_ARGS__) +#define vreinterpret_u32m1(...) __riscv_vreinterpret_u32m1(__VA_ARGS__) +#define vreinterpret_u32m2(...) __riscv_vreinterpret_u32m2(__VA_ARGS__) +#define vreinterpret_u32m4(...) __riscv_vreinterpret_u32m4(__VA_ARGS__) +#define vreinterpret_u32m8(...) __riscv_vreinterpret_u32m8(__VA_ARGS__) +#define vreinterpret_i32mf2(...) __riscv_vreinterpret_i32mf2(__VA_ARGS__) +#define vreinterpret_i32m1(...) __riscv_vreinterpret_i32m1(__VA_ARGS__) +#define vreinterpret_i32m2(...) __riscv_vreinterpret_i32m2(__VA_ARGS__) +#define vreinterpret_i32m4(...) __riscv_vreinterpret_i32m4(__VA_ARGS__) +#define vreinterpret_i32m8(...) __riscv_vreinterpret_i32m8(__VA_ARGS__) +#define vreinterpret_f64m1(...) __riscv_vreinterpret_f64m1(__VA_ARGS__) +#define vreinterpret_f64m2(...) __riscv_vreinterpret_f64m2(__VA_ARGS__) +#define vreinterpret_f64m4(...) __riscv_vreinterpret_f64m4(__VA_ARGS__) +#define vreinterpret_f64m8(...) __riscv_vreinterpret_f64m8(__VA_ARGS__) +#define vreinterpret_u64m1(...) __riscv_vreinterpret_u64m1(__VA_ARGS__) +#define vreinterpret_u64m2(...) __riscv_vreinterpret_u64m2(__VA_ARGS__) +#define vreinterpret_u64m4(...) __riscv_vreinterpret_u64m4(__VA_ARGS__) +#define vreinterpret_u64m8(...) __riscv_vreinterpret_u64m8(__VA_ARGS__) +#define vreinterpret_i64m1(...) __riscv_vreinterpret_i64m1(__VA_ARGS__) +#define vreinterpret_i64m2(...) __riscv_vreinterpret_i64m2(__VA_ARGS__) +#define vreinterpret_i64m4(...) __riscv_vreinterpret_i64m4(__VA_ARGS__) +#define vreinterpret_i64m8(...) __riscv_vreinterpret_i64m8(__VA_ARGS__) +#define vlmul_ext_f16mf2(...) __riscv_vlmul_ext_f16mf2(__VA_ARGS__) +#define vlmul_ext_f16m1(...) __riscv_vlmul_ext_f16m1(__VA_ARGS__) +#define vlmul_ext_f16m2(...) __riscv_vlmul_ext_f16m2(__VA_ARGS__) +#define vlmul_ext_f16m4(...) __riscv_vlmul_ext_f16m4(__VA_ARGS__) +#define vlmul_ext_f16m8(...) __riscv_vlmul_ext_f16m8(__VA_ARGS__) +#define vlmul_ext_f32m1(...) __riscv_vlmul_ext_f32m1(__VA_ARGS__) +#define vlmul_ext_f32m2(...) __riscv_vlmul_ext_f32m2(__VA_ARGS__) +#define vlmul_ext_f32m4(...) __riscv_vlmul_ext_f32m4(__VA_ARGS__) +#define vlmul_ext_f32m8(...) __riscv_vlmul_ext_f32m8(__VA_ARGS__) +#define vlmul_ext_f64m2(...) __riscv_vlmul_ext_f64m2(__VA_ARGS__) +#define vlmul_ext_f64m4(...) __riscv_vlmul_ext_f64m4(__VA_ARGS__) +#define vlmul_ext_f64m8(...) __riscv_vlmul_ext_f64m8(__VA_ARGS__) +#define vlmul_ext_i8mf4(...) __riscv_vlmul_ext_i8mf4(__VA_ARGS__) +#define vlmul_ext_i8mf2(...) __riscv_vlmul_ext_i8mf2(__VA_ARGS__) +#define vlmul_ext_i8m1(...) __riscv_vlmul_ext_i8m1(__VA_ARGS__) +#define vlmul_ext_i8m2(...) __riscv_vlmul_ext_i8m2(__VA_ARGS__) +#define vlmul_ext_i8m4(...) __riscv_vlmul_ext_i8m4(__VA_ARGS__) +#define vlmul_ext_i8m8(...) __riscv_vlmul_ext_i8m8(__VA_ARGS__) +#define vlmul_ext_i16mf2(...) __riscv_vlmul_ext_i16mf2(__VA_ARGS__) +#define vlmul_ext_i16m1(...) __riscv_vlmul_ext_i16m1(__VA_ARGS__) +#define vlmul_ext_i16m2(...) __riscv_vlmul_ext_i16m2(__VA_ARGS__) +#define vlmul_ext_i16m4(...) __riscv_vlmul_ext_i16m4(__VA_ARGS__) +#define vlmul_ext_i16m8(...) __riscv_vlmul_ext_i16m8(__VA_ARGS__) +#define vlmul_ext_i32m1(...) __riscv_vlmul_ext_i32m1(__VA_ARGS__) +#define vlmul_ext_i32m2(...) __riscv_vlmul_ext_i32m2(__VA_ARGS__) +#define vlmul_ext_i32m4(...) __riscv_vlmul_ext_i32m4(__VA_ARGS__) +#define vlmul_ext_i32m8(...) __riscv_vlmul_ext_i32m8(__VA_ARGS__) +#define vlmul_ext_i64m2(...) __riscv_vlmul_ext_i64m2(__VA_ARGS__) +#define vlmul_ext_i64m4(...) __riscv_vlmul_ext_i64m4(__VA_ARGS__) +#define vlmul_ext_i64m8(...) __riscv_vlmul_ext_i64m8(__VA_ARGS__) +#define vlmul_ext_u8mf4(...) __riscv_vlmul_ext_u8mf4(__VA_ARGS__) +#define vlmul_ext_u8mf2(...) __riscv_vlmul_ext_u8mf2(__VA_ARGS__) +#define vlmul_ext_u8m1(...) __riscv_vlmul_ext_u8m1(__VA_ARGS__) +#define vlmul_ext_u8m2(...) __riscv_vlmul_ext_u8m2(__VA_ARGS__) +#define vlmul_ext_u8m4(...) __riscv_vlmul_ext_u8m4(__VA_ARGS__) +#define vlmul_ext_u8m8(...) __riscv_vlmul_ext_u8m8(__VA_ARGS__) +#define vlmul_ext_u16mf2(...) __riscv_vlmul_ext_u16mf2(__VA_ARGS__) +#define vlmul_ext_u16m1(...) __riscv_vlmul_ext_u16m1(__VA_ARGS__) +#define vlmul_ext_u16m2(...) __riscv_vlmul_ext_u16m2(__VA_ARGS__) +#define vlmul_ext_u16m4(...) __riscv_vlmul_ext_u16m4(__VA_ARGS__) +#define vlmul_ext_u16m8(...) __riscv_vlmul_ext_u16m8(__VA_ARGS__) +#define vlmul_ext_u32m1(...) __riscv_vlmul_ext_u32m1(__VA_ARGS__) +#define vlmul_ext_u32m2(...) __riscv_vlmul_ext_u32m2(__VA_ARGS__) +#define vlmul_ext_u32m4(...) __riscv_vlmul_ext_u32m4(__VA_ARGS__) +#define vlmul_ext_u32m8(...) __riscv_vlmul_ext_u32m8(__VA_ARGS__) +#define vlmul_ext_u64m2(...) __riscv_vlmul_ext_u64m2(__VA_ARGS__) +#define vlmul_ext_u64m4(...) __riscv_vlmul_ext_u64m4(__VA_ARGS__) +#define vlmul_ext_u64m8(...) __riscv_vlmul_ext_u64m8(__VA_ARGS__) +#define vlmul_trunc_f16mf4(...) __riscv_vlmul_trunc_f16mf4(__VA_ARGS__) +#define vlmul_trunc_f16mf2(...) __riscv_vlmul_trunc_f16mf2(__VA_ARGS__) +#define vlmul_trunc_f16m1(...) __riscv_vlmul_trunc_f16m1(__VA_ARGS__) +#define vlmul_trunc_f16m2(...) __riscv_vlmul_trunc_f16m2(__VA_ARGS__) +#define vlmul_trunc_f16m4(...) __riscv_vlmul_trunc_f16m4(__VA_ARGS__) +#define vlmul_trunc_f32mf2(...) __riscv_vlmul_trunc_f32mf2(__VA_ARGS__) +#define vlmul_trunc_f32m1(...) __riscv_vlmul_trunc_f32m1(__VA_ARGS__) +#define vlmul_trunc_f32m2(...) __riscv_vlmul_trunc_f32m2(__VA_ARGS__) +#define vlmul_trunc_f32m4(...) __riscv_vlmul_trunc_f32m4(__VA_ARGS__) +#define vlmul_trunc_f64m1(...) __riscv_vlmul_trunc_f64m1(__VA_ARGS__) +#define vlmul_trunc_f64m2(...) __riscv_vlmul_trunc_f64m2(__VA_ARGS__) +#define vlmul_trunc_f64m4(...) __riscv_vlmul_trunc_f64m4(__VA_ARGS__) +#define vlmul_trunc_i8mf8(...) __riscv_vlmul_trunc_i8mf8(__VA_ARGS__) +#define vlmul_trunc_i8mf4(...) __riscv_vlmul_trunc_i8mf4(__VA_ARGS__) +#define vlmul_trunc_i8mf2(...) __riscv_vlmul_trunc_i8mf2(__VA_ARGS__) +#define vlmul_trunc_i8m1(...) __riscv_vlmul_trunc_i8m1(__VA_ARGS__) +#define vlmul_trunc_i8m2(...) __riscv_vlmul_trunc_i8m2(__VA_ARGS__) +#define vlmul_trunc_i8m4(...) __riscv_vlmul_trunc_i8m4(__VA_ARGS__) +#define vlmul_trunc_i16mf4(...) __riscv_vlmul_trunc_i16mf4(__VA_ARGS__) +#define vlmul_trunc_i16mf2(...) __riscv_vlmul_trunc_i16mf2(__VA_ARGS__) +#define vlmul_trunc_i16m1(...) __riscv_vlmul_trunc_i16m1(__VA_ARGS__) +#define vlmul_trunc_i16m2(...) __riscv_vlmul_trunc_i16m2(__VA_ARGS__) +#define vlmul_trunc_i16m4(...) __riscv_vlmul_trunc_i16m4(__VA_ARGS__) +#define vlmul_trunc_i32mf2(...) __riscv_vlmul_trunc_i32mf2(__VA_ARGS__) +#define vlmul_trunc_i32m1(...) __riscv_vlmul_trunc_i32m1(__VA_ARGS__) +#define vlmul_trunc_i32m2(...) __riscv_vlmul_trunc_i32m2(__VA_ARGS__) +#define vlmul_trunc_i32m4(...) __riscv_vlmul_trunc_i32m4(__VA_ARGS__) +#define vlmul_trunc_i64m1(...) __riscv_vlmul_trunc_i64m1(__VA_ARGS__) +#define vlmul_trunc_i64m2(...) __riscv_vlmul_trunc_i64m2(__VA_ARGS__) +#define vlmul_trunc_i64m4(...) __riscv_vlmul_trunc_i64m4(__VA_ARGS__) +#define vlmul_trunc_u8mf8(...) __riscv_vlmul_trunc_u8mf8(__VA_ARGS__) +#define vlmul_trunc_u8mf4(...) __riscv_vlmul_trunc_u8mf4(__VA_ARGS__) +#define vlmul_trunc_u8mf2(...) __riscv_vlmul_trunc_u8mf2(__VA_ARGS__) +#define vlmul_trunc_u8m1(...) __riscv_vlmul_trunc_u8m1(__VA_ARGS__) +#define vlmul_trunc_u8m2(...) __riscv_vlmul_trunc_u8m2(__VA_ARGS__) +#define vlmul_trunc_u8m4(...) __riscv_vlmul_trunc_u8m4(__VA_ARGS__) +#define vlmul_trunc_u16mf4(...) __riscv_vlmul_trunc_u16mf4(__VA_ARGS__) +#define vlmul_trunc_u16mf2(...) __riscv_vlmul_trunc_u16mf2(__VA_ARGS__) +#define vlmul_trunc_u16m1(...) __riscv_vlmul_trunc_u16m1(__VA_ARGS__) +#define vlmul_trunc_u16m2(...) __riscv_vlmul_trunc_u16m2(__VA_ARGS__) +#define vlmul_trunc_u16m4(...) __riscv_vlmul_trunc_u16m4(__VA_ARGS__) +#define vlmul_trunc_u32mf2(...) __riscv_vlmul_trunc_u32mf2(__VA_ARGS__) +#define vlmul_trunc_u32m1(...) __riscv_vlmul_trunc_u32m1(__VA_ARGS__) +#define vlmul_trunc_u32m2(...) __riscv_vlmul_trunc_u32m2(__VA_ARGS__) +#define vlmul_trunc_u32m4(...) __riscv_vlmul_trunc_u32m4(__VA_ARGS__) +#define vlmul_trunc_u64m1(...) __riscv_vlmul_trunc_u64m1(__VA_ARGS__) +#define vlmul_trunc_u64m2(...) __riscv_vlmul_trunc_u64m2(__VA_ARGS__) +#define vlmul_trunc_u64m4(...) __riscv_vlmul_trunc_u64m4(__VA_ARGS__) +#define vset(...) __riscv_vset(__VA_ARGS__) +#define vget_f16m1(...) __riscv_vget_f16m1(__VA_ARGS__) +#define vget_f16m2(...) __riscv_vget_f16m2(__VA_ARGS__) +#define vget_f16m4(...) __riscv_vget_f16m4(__VA_ARGS__) +#define vget_f32m1(...) __riscv_vget_f32m1(__VA_ARGS__) +#define vget_f32m2(...) __riscv_vget_f32m2(__VA_ARGS__) +#define vget_f32m4(...) __riscv_vget_f32m4(__VA_ARGS__) +#define vget_f64m1(...) __riscv_vget_f64m1(__VA_ARGS__) +#define vget_f64m2(...) __riscv_vget_f64m2(__VA_ARGS__) +#define vget_f64m4(...) __riscv_vget_f64m4(__VA_ARGS__) +#define vget_i8m1(...) __riscv_vget_i8m1(__VA_ARGS__) +#define vget_i8m2(...) __riscv_vget_i8m2(__VA_ARGS__) +#define vget_i8m4(...) __riscv_vget_i8m4(__VA_ARGS__) +#define vget_i16m1(...) __riscv_vget_i16m1(__VA_ARGS__) +#define vget_i16m2(...) __riscv_vget_i16m2(__VA_ARGS__) +#define vget_i16m4(...) __riscv_vget_i16m4(__VA_ARGS__) +#define vget_i32m1(...) __riscv_vget_i32m1(__VA_ARGS__) +#define vget_i32m2(...) __riscv_vget_i32m2(__VA_ARGS__) +#define vget_i32m4(...) __riscv_vget_i32m4(__VA_ARGS__) +#define vget_i64m1(...) __riscv_vget_i64m1(__VA_ARGS__) +#define vget_i64m2(...) __riscv_vget_i64m2(__VA_ARGS__) +#define vget_i64m4(...) __riscv_vget_i64m4(__VA_ARGS__) +#define vget_u8m1(...) __riscv_vget_u8m1(__VA_ARGS__) +#define vget_u8m2(...) __riscv_vget_u8m2(__VA_ARGS__) +#define vget_u8m4(...) __riscv_vget_u8m4(__VA_ARGS__) +#define vget_u16m1(...) __riscv_vget_u16m1(__VA_ARGS__) +#define vget_u16m2(...) __riscv_vget_u16m2(__VA_ARGS__) +#define vget_u16m4(...) __riscv_vget_u16m4(__VA_ARGS__) +#define vget_u32m1(...) __riscv_vget_u32m1(__VA_ARGS__) +#define vget_u32m2(...) __riscv_vget_u32m2(__VA_ARGS__) +#define vget_u32m4(...) __riscv_vget_u32m4(__VA_ARGS__) +#define vget_u64m1(...) __riscv_vget_u64m1(__VA_ARGS__) +#define vget_u64m2(...) __riscv_vget_u64m2(__VA_ARGS__) +#define vget_u64m4(...) __riscv_vget_u64m4(__VA_ARGS__) +#define vle16(...) __riscv_vle16_tumu(__VA_ARGS__) +#define vle32(...) __riscv_vle32_tumu(__VA_ARGS__) +#define vle64(...) __riscv_vle64_tumu(__VA_ARGS__) +#define vle8(...) __riscv_vle8_tumu(__VA_ARGS__) +#define vlse16(...) __riscv_vlse16_tumu(__VA_ARGS__) +#define vlse32(...) __riscv_vlse32_tumu(__VA_ARGS__) +#define vlse64(...) __riscv_vlse64_tumu(__VA_ARGS__) +#define vlse8(...) __riscv_vlse8_tumu(__VA_ARGS__) +#define vle16ff(...) __riscv_vle16ff_tumu(__VA_ARGS__) +#define vle32ff(...) __riscv_vle32ff_tumu(__VA_ARGS__) +#define vle64ff(...) __riscv_vle64ff_tumu(__VA_ARGS__) +#define vle8ff(...) __riscv_vle8ff_tumu(__VA_ARGS__) +#define vlseg2e16(...) __riscv_vlseg2e16_tumu(__VA_ARGS__) +#define vlseg3e16(...) __riscv_vlseg3e16_tumu(__VA_ARGS__) +#define vlseg4e16(...) __riscv_vlseg4e16_tumu(__VA_ARGS__) +#define vlseg5e16(...) __riscv_vlseg5e16_tumu(__VA_ARGS__) +#define vlseg6e16(...) __riscv_vlseg6e16_tumu(__VA_ARGS__) +#define vlseg7e16(...) __riscv_vlseg7e16_tumu(__VA_ARGS__) +#define vlseg8e16(...) __riscv_vlseg8e16_tumu(__VA_ARGS__) +#define vlseg2e32(...) __riscv_vlseg2e32_tumu(__VA_ARGS__) +#define vlseg3e32(...) __riscv_vlseg3e32_tumu(__VA_ARGS__) +#define vlseg4e32(...) __riscv_vlseg4e32_tumu(__VA_ARGS__) +#define vlseg5e32(...) __riscv_vlseg5e32_tumu(__VA_ARGS__) +#define vlseg6e32(...) __riscv_vlseg6e32_tumu(__VA_ARGS__) +#define vlseg7e32(...) __riscv_vlseg7e32_tumu(__VA_ARGS__) +#define vlseg8e32(...) __riscv_vlseg8e32_tumu(__VA_ARGS__) +#define vlseg2e64(...) __riscv_vlseg2e64_tumu(__VA_ARGS__) +#define vlseg3e64(...) __riscv_vlseg3e64_tumu(__VA_ARGS__) +#define vlseg4e64(...) __riscv_vlseg4e64_tumu(__VA_ARGS__) +#define vlseg5e64(...) __riscv_vlseg5e64_tumu(__VA_ARGS__) +#define vlseg6e64(...) __riscv_vlseg6e64_tumu(__VA_ARGS__) +#define vlseg7e64(...) __riscv_vlseg7e64_tumu(__VA_ARGS__) +#define vlseg8e64(...) __riscv_vlseg8e64_tumu(__VA_ARGS__) +#define vlseg2e16ff(...) __riscv_vlseg2e16ff_tumu(__VA_ARGS__) +#define vlseg3e16ff(...) __riscv_vlseg3e16ff_tumu(__VA_ARGS__) +#define vlseg4e16ff(...) __riscv_vlseg4e16ff_tumu(__VA_ARGS__) +#define vlseg5e16ff(...) __riscv_vlseg5e16ff_tumu(__VA_ARGS__) +#define vlseg6e16ff(...) __riscv_vlseg6e16ff_tumu(__VA_ARGS__) +#define vlseg7e16ff(...) __riscv_vlseg7e16ff_tumu(__VA_ARGS__) +#define vlseg8e16ff(...) __riscv_vlseg8e16ff_tumu(__VA_ARGS__) +#define vlseg2e32ff(...) __riscv_vlseg2e32ff_tumu(__VA_ARGS__) +#define vlseg3e32ff(...) __riscv_vlseg3e32ff_tumu(__VA_ARGS__) +#define vlseg4e32ff(...) __riscv_vlseg4e32ff_tumu(__VA_ARGS__) +#define vlseg5e32ff(...) __riscv_vlseg5e32ff_tumu(__VA_ARGS__) +#define vlseg6e32ff(...) __riscv_vlseg6e32ff_tumu(__VA_ARGS__) +#define vlseg7e32ff(...) __riscv_vlseg7e32ff_tumu(__VA_ARGS__) +#define vlseg8e32ff(...) __riscv_vlseg8e32ff_tumu(__VA_ARGS__) +#define vlseg2e64ff(...) __riscv_vlseg2e64ff_tumu(__VA_ARGS__) +#define vlseg3e64ff(...) __riscv_vlseg3e64ff_tumu(__VA_ARGS__) +#define vlseg4e64ff(...) __riscv_vlseg4e64ff_tumu(__VA_ARGS__) +#define vlseg5e64ff(...) __riscv_vlseg5e64ff_tumu(__VA_ARGS__) +#define vlseg6e64ff(...) __riscv_vlseg6e64ff_tumu(__VA_ARGS__) +#define vlseg7e64ff(...) __riscv_vlseg7e64ff_tumu(__VA_ARGS__) +#define vlseg8e64ff(...) __riscv_vlseg8e64ff_tumu(__VA_ARGS__) +#define vlseg2e8(...) __riscv_vlseg2e8_tumu(__VA_ARGS__) +#define vlseg3e8(...) __riscv_vlseg3e8_tumu(__VA_ARGS__) +#define vlseg4e8(...) __riscv_vlseg4e8_tumu(__VA_ARGS__) +#define vlseg5e8(...) __riscv_vlseg5e8_tumu(__VA_ARGS__) +#define vlseg6e8(...) __riscv_vlseg6e8_tumu(__VA_ARGS__) +#define vlseg7e8(...) __riscv_vlseg7e8_tumu(__VA_ARGS__) +#define vlseg8e8(...) __riscv_vlseg8e8_tumu(__VA_ARGS__) +#define vlseg2e8ff(...) __riscv_vlseg2e8ff_tumu(__VA_ARGS__) +#define vlseg3e8ff(...) __riscv_vlseg3e8ff_tumu(__VA_ARGS__) +#define vlseg4e8ff(...) __riscv_vlseg4e8ff_tumu(__VA_ARGS__) +#define vlseg5e8ff(...) __riscv_vlseg5e8ff_tumu(__VA_ARGS__) +#define vlseg6e8ff(...) __riscv_vlseg6e8ff_tumu(__VA_ARGS__) +#define vlseg7e8ff(...) __riscv_vlseg7e8ff_tumu(__VA_ARGS__) +#define vlseg8e8ff(...) __riscv_vlseg8e8ff_tumu(__VA_ARGS__) +#define vlsseg2e16(...) __riscv_vlsseg2e16_tumu(__VA_ARGS__) +#define vlsseg3e16(...) __riscv_vlsseg3e16_tumu(__VA_ARGS__) +#define vlsseg4e16(...) __riscv_vlsseg4e16_tumu(__VA_ARGS__) +#define vlsseg5e16(...) __riscv_vlsseg5e16_tumu(__VA_ARGS__) +#define vlsseg6e16(...) __riscv_vlsseg6e16_tumu(__VA_ARGS__) +#define vlsseg7e16(...) __riscv_vlsseg7e16_tumu(__VA_ARGS__) +#define vlsseg8e16(...) __riscv_vlsseg8e16_tumu(__VA_ARGS__) +#define vlsseg2e32(...) __riscv_vlsseg2e32_tumu(__VA_ARGS__) +#define vlsseg3e32(...) __riscv_vlsseg3e32_tumu(__VA_ARGS__) +#define vlsseg4e32(...) __riscv_vlsseg4e32_tumu(__VA_ARGS__) +#define vlsseg5e32(...) __riscv_vlsseg5e32_tumu(__VA_ARGS__) +#define vlsseg6e32(...) __riscv_vlsseg6e32_tumu(__VA_ARGS__) +#define vlsseg7e32(...) __riscv_vlsseg7e32_tumu(__VA_ARGS__) +#define vlsseg8e32(...) __riscv_vlsseg8e32_tumu(__VA_ARGS__) +#define vlsseg2e64(...) __riscv_vlsseg2e64_tumu(__VA_ARGS__) +#define vlsseg3e64(...) __riscv_vlsseg3e64_tumu(__VA_ARGS__) +#define vlsseg4e64(...) __riscv_vlsseg4e64_tumu(__VA_ARGS__) +#define vlsseg5e64(...) __riscv_vlsseg5e64_tumu(__VA_ARGS__) +#define vlsseg6e64(...) __riscv_vlsseg6e64_tumu(__VA_ARGS__) +#define vlsseg7e64(...) __riscv_vlsseg7e64_tumu(__VA_ARGS__) +#define vlsseg8e64(...) __riscv_vlsseg8e64_tumu(__VA_ARGS__) +#define vlsseg2e8(...) __riscv_vlsseg2e8_tumu(__VA_ARGS__) +#define vlsseg3e8(...) __riscv_vlsseg3e8_tumu(__VA_ARGS__) +#define vlsseg4e8(...) __riscv_vlsseg4e8_tumu(__VA_ARGS__) +#define vlsseg5e8(...) __riscv_vlsseg5e8_tumu(__VA_ARGS__) +#define vlsseg6e8(...) __riscv_vlsseg6e8_tumu(__VA_ARGS__) +#define vlsseg7e8(...) __riscv_vlsseg7e8_tumu(__VA_ARGS__) +#define vlsseg8e8(...) __riscv_vlsseg8e8_tumu(__VA_ARGS__) +#define viota(...) __riscv_viota_tumu(__VA_ARGS__) +#define vid(...) __riscv_vid_tumu(__VA_ARGS__) +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_011_compat.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_011_compat.hpp new file mode 100644 index 0000000..da5e0fd --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_011_compat.hpp @@ -0,0 +1,33 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// 0.11 -> 0.12 compatibility + +#ifndef _RVV_IMPLICIT_VXRM +#define _RVV_IMPLICIT_VXRM __RISCV_VXRM_RNU +#endif + +// NOTE: masked should go first to avoid extra substitution (3 arg -> 4 arg -> 5 arg) + +// masked +#define __riscv_vaadd(_1, _2, _3, _4) __riscv_vaadd(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vasub(_1, _2, _3, _4) __riscv_vasub(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vaaddu(_1, _2, _3, _4) __riscv_vaaddu(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vasubu(_1, _2, _3, _4) __riscv_vasubu(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vsmul(_1, _2, _3, _4) __riscv_vsmul(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vssra(_1, _2, _3, _4) __riscv_vssra(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vssrl(_1, _2, _3, _4) __riscv_vssrl(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vnclip(_1, _2, _3, _4) __riscv_vnclip(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) +#define __riscv_vnclipu(_1, _2, _3, _4) __riscv_vnclipu(_1, _2, _3, _RVV_IMPLICIT_VXRM, _4) + +// unmasked +#define __riscv_vaadd(_1, _2, _3) __riscv_vaadd(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vasub(_1, _2, _3) __riscv_vasub(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vaaddu(_1, _2, _3) __riscv_vaaddu(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vasubu(_1, _2, _3) __riscv_vasubu(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vsmul(_1, _2, _3) __riscv_vsmul(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vssra(_1, _2, _3) __riscv_vssra(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vssrl(_1, _2, _3) __riscv_vssrl(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vnclip(_1, _2, _3) __riscv_vnclip(_1, _2, _RVV_IMPLICIT_VXRM, _3) +#define __riscv_vnclipu(_1, _2, _3) __riscv_vnclipu(_1, _2, _RVV_IMPLICIT_VXRM, _3) diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_compat_overloaded.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_compat_overloaded.hpp new file mode 100644 index 0000000..914ad28 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_compat_overloaded.hpp @@ -0,0 +1,208 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_HAL_INTRIN_RVV_COMPAT_OVERLOAD_HPP +#define OPENCV_HAL_INTRIN_RVV_COMPAT_OVERLOAD_HPP + +// This file requires VTraits to be defined for vector types + +#define OPENCV_HAL_IMPL_RVV_FUN_AND(REG, SUF) \ +inline static REG vand(const REG & op1, const REG & op2, size_t vl) \ +{ \ + return vand_vv_##SUF(op1, op2, vl); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_AND(vint8m1_t, i8m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vuint8m1_t, u8m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vint16m1_t, i16m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vuint16m1_t, u16m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vint32m1_t, i32m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vuint32m1_t, u32m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vint64m1_t, i64m1) +OPENCV_HAL_IMPL_RVV_FUN_AND(vuint64m1_t, u64m1) + +#define OPENCV_HAL_IMPL_RVV_FUN_LOXEI(REG, SUF, INDX, ISUF) \ +inline static REG vloxe##ISUF(const VTraits::lane_type *base, INDX bindex, size_t vl) \ +{ \ + return vloxe##ISUF##_v_##SUF(base, bindex, vl); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m1_t, i8m1, vuint8m1_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m2_t, i8m2, vuint8m2_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m4_t, i8m4, vuint8m4_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m8_t, i8m8, vuint8m8_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m1_t, i8m1, vuint32m4_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint8m2_t, i8m2, vuint32m8_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint16m1_t, i16m1, vuint32m2_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint32m1_t, i32m1, vuint32m1_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint32m2_t, i32m2, vuint32m2_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint32m4_t, i32m4, vuint32m4_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint32m8_t, i32m8, vuint32m8_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vint64m1_t, i64m1, vuint32mf2_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vuint8m1_t, u8m1, vuint8m1_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vuint8m2_t, u8m2, vuint8m2_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vuint8m4_t, u8m4, vuint8m4_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vuint8m8_t, u8m8, vuint8m8_t, i8) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vfloat32m1_t, f32m1, vuint32m1_t, i32) +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vuint32m1_t, u32m1, vuint32m1_t, i32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_FUN_LOXEI(vfloat64m1_t, f64m1, vuint32mf2_t, i32) +#endif + +#define OPENCV_HAL_IMPL_RVV_FUN_MUL(REG, SUF) \ +inline static REG##m1_t vmul(const REG##m1_t & op1, const REG##m1_t & op2, size_t vl) \ +{ \ + return vmul_vv_##SUF##m1(op1, op2, vl); \ +} \ +inline static REG##m1_t vmul(const REG##m1_t & op1, VTraits::lane_type op2, size_t vl) \ +{ \ + return vmul_vx_##SUF##m1(op1, op2, vl); \ +} \ +inline static REG##m2_t vmul(const REG##m2_t & op1, const REG##m2_t & op2, size_t vl) \ +{ \ + return vmul_vv_##SUF##m2(op1, op2, vl); \ +} \ +inline static REG##m2_t vmul(const REG##m2_t & op1, VTraits::lane_type op2, size_t vl) \ +{ \ + return vmul_vx_##SUF##m2(op1, op2, vl); \ +} \ +inline static REG##m4_t vmul(const REG##m4_t & op1, const REG##m4_t & op2, size_t vl) \ +{ \ + return vmul_vv_##SUF##m4(op1, op2, vl); \ +} \ +inline static REG##m4_t vmul(const REG##m4_t & op1, VTraits::lane_type op2, size_t vl) \ +{ \ + return vmul_vx_##SUF##m4(op1, op2, vl); \ +} \ +inline static REG##m8_t vmul(const REG##m8_t & op1, const REG##m8_t & op2, size_t vl) \ +{ \ + return vmul_vv_##SUF##m8(op1, op2, vl); \ +} \ +inline static REG##m8_t vmul(const REG##m8_t & op1, VTraits::lane_type op2, size_t vl) \ +{ \ + return vmul_vx_##SUF##m8(op1, op2, vl); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_MUL(vint8, i8) +OPENCV_HAL_IMPL_RVV_FUN_MUL(vuint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_MUL(vint16, i16) +OPENCV_HAL_IMPL_RVV_FUN_MUL(vuint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_MUL(vint32, i32) +OPENCV_HAL_IMPL_RVV_FUN_MUL(vuint32, u32) + +#define OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(REG1, SUF1, REG2, SUF2) \ +inline static REG1##m1_t vreinterpret_##SUF1##m1(const REG2##m1_t & src) \ +{\ + return vreinterpret_v_##SUF2##m1_##SUF1##m1(src); \ +} \ +inline static REG1##m2_t vreinterpret_##SUF1##m2(const REG2##m2_t & src) \ +{\ + return vreinterpret_v_##SUF2##m2_##SUF1##m2(src); \ +} \ +inline static REG1##m4_t vreinterpret_##SUF1##m4(const REG2##m4_t & src) \ +{\ + return vreinterpret_v_##SUF2##m4_##SUF1##m4(src); \ +} \ +inline static REG1##m8_t vreinterpret_##SUF1##m8(const REG2##m8_t & src) \ +{\ + return vreinterpret_v_##SUF2##m8_##SUF1##m8(src); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vint8, i8, vuint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vint16, i16, vuint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vint32, i32, vuint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vfloat32, f32, vuint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vfloat32, f32, vint32, i32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint32, u32, vfloat32, f32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vint32, i32, vfloat32, f32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint8, u8, vint8, i8) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint8, u8, vuint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint8, u8, vuint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint8, u8, vuint64, u64) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint16, u16, vint16, i16) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint16, u16, vuint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint16, u16, vuint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint16, u16, vuint64, u64) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint32, u32, vint32, i32) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint32, u32, vuint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint32, u32, vuint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_REINTERPRET(vuint32, u32, vuint64, u64) + +#define OPENCV_HAL_IMPL_RVV_FUN_STORE(REG, SUF, SZ) \ +inline static void vse##SZ(VTraits::lane_type *base, REG value, size_t vl) \ +{ \ + return vse##SZ##_v_##SUF##m1(base, value, vl); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_uint8, u8, 8) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_int8, i8, 8) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_uint16, u16, 16) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_int16, i16, 16) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_uint32, u32, 32) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_int32, i32, 32) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_uint64, u64, 64) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_int64, i64, 64) +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_float32, f32, 32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_FUN_STORE(v_float64, f64, 64) +#endif + +#define OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(REG, SUF) \ +inline static VTraits::lane_type vmv_x(const REG & reg) \ +{\ + return vmv_x_s_##SUF##m1_##SUF(reg); \ +} +#define OPENCV_HAL_IMPL_RVV_FUN_EXTRACT_F(REG, SUF) \ +inline static VTraits::lane_type vfmv_f(const REG & reg) \ +{\ + return vfmv_f_s_##SUF##m1_##SUF(reg); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_uint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_int8, i8) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_uint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_int16, i16) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_uint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_int32, i32) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_uint64, u64) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT(v_int64, i64) +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT_F(v_float32, f32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_FUN_EXTRACT_F(v_float64, f64) +#endif + +#define OPENCV_HAL_IMPL_RVV_FUN_SLIDE(REG, SUF) \ +inline static REG vslidedown(const REG & dst, const REG & src, size_t offset, size_t vl) \ +{ \ + return vslidedown_vx_##SUF##m1(dst, src, offset, vl); \ +} \ +inline static REG vslideup(const REG & dst, const REG & src, size_t offset, size_t vl) \ +{ \ + return vslideup_vx_##SUF##m1(dst, src, offset, vl); \ +} + +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_uint8, u8) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_int8, i8) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_uint16, u16) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_int16, i16) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_uint32, u32) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_int32, i32) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_float32, f32) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_uint64, u64) +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_int64, i64) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_FUN_SLIDE(v_float64, f64) +#endif + +inline static vuint32mf2_t vmul(const vuint32mf2_t & op1, uint32_t op2, size_t vl) +{ + return vmul_vx_u32mf2(op1, op2, vl); +} + +inline static vuint32mf2_t vreinterpret_u32mf2(vint32mf2_t val) +{ + return vreinterpret_v_i32mf2_u32mf2(val); +} + +#endif //OPENCV_HAL_INTRIN_RVV_COMPAT_OVERLOAD_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_scalable.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_scalable.hpp new file mode 100644 index 0000000..14988fc --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_rvv_scalable.hpp @@ -0,0 +1,2131 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// The original implementation is contributed by HAN Liutong. +// Copyright (C) 2022, Institute of Software, Chinese Academy of Sciences. + +#ifndef OPENCV_HAL_INTRIN_RVV_SCALABLE_HPP +#define OPENCV_HAL_INTRIN_RVV_SCALABLE_HPP + +#include +#include +#include +#include + +// RVV intrinsics have been renamed in version 0.11, so we need to include +// compatibility headers: +// https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/auto-generated/rvv-v0p10-compatible-headers +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic>10999 +#include "intrin_rvv_010_compat_non-policy.hpp" +#include "intrin_rvv_010_compat_overloaded-non-policy.hpp" +#endif + +#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic>11999 +#include "intrin_rvv_011_compat.hpp" +#endif + +#if defined(__GNUC__) && !defined(__clang__) +// FIXIT: eliminate massive warnigs from templates +// GCC from 'rvv-next': riscv64-unknown-linux-gnu-g++ (g42df3464463) 12.0.1 20220505 (prerelease) +// doesn't work: #pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wignored-attributes" +#endif + +#ifndef CV_RVV_MAX_VLEN +#define CV_RVV_MAX_VLEN 1024 +#endif + +namespace cv +{ +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define CV_SIMD_SCALABLE 1 +#define CV_SIMD_SCALABLE_64F 1 + +using v_uint8 = vuint8m1_t; +using v_int8 = vint8m1_t; +using v_uint16 = vuint16m1_t; +using v_int16 = vint16m1_t; +using v_uint32 = vuint32m1_t; +using v_int32 = vint32m1_t; +using v_uint64 = vuint64m1_t; +using v_int64 = vint64m1_t; + +using v_float32 = vfloat32m1_t; +#if CV_SIMD_SCALABLE_64F +using v_float64 = vfloat64m1_t; +#endif + +using uchar = unsigned char; +using schar = signed char; +using ushort = unsigned short; +using uint = unsigned int; +using uint64 = unsigned long int; +using int64 = long int; + +static const int __cv_rvv_e8m1_nlanes = vsetvlmax_e8m1(); +static const int __cv_rvv_e16m1_nlanes = vsetvlmax_e16m1(); +static const int __cv_rvv_e32m1_nlanes = vsetvlmax_e32m1(); +static const int __cv_rvv_e64m1_nlanes = vsetvlmax_e64m1(); +static const int __cv_rvv_e8m2_nlanes = vsetvlmax_e8m2(); +static const int __cv_rvv_e16m2_nlanes = vsetvlmax_e16m2(); +static const int __cv_rvv_e32m2_nlanes = vsetvlmax_e32m2(); +static const int __cv_rvv_e64m2_nlanes = vsetvlmax_e64m2(); +static const int __cv_rvv_e8m4_nlanes = vsetvlmax_e8m4(); +static const int __cv_rvv_e16m4_nlanes = vsetvlmax_e16m4(); +static const int __cv_rvv_e32m4_nlanes = vsetvlmax_e32m4(); +static const int __cv_rvv_e64m4_nlanes = vsetvlmax_e64m4(); +static const int __cv_rvv_e8m8_nlanes = vsetvlmax_e8m8(); +static const int __cv_rvv_e16m8_nlanes = vsetvlmax_e16m8(); +static const int __cv_rvv_e32m8_nlanes = vsetvlmax_e32m8(); +static const int __cv_rvv_e64m8_nlanes = vsetvlmax_e64m8(); + +template +struct VTraits; + +#define OPENCV_HAL_IMPL_RVV_TRAITS(REG, TYP, SUF, SZ) \ +template <> \ +struct VTraits \ +{ \ + static inline int vlanes() { return __cv_rvv_##SUF##_nlanes; } \ + using lane_type = TYP; \ + static const int max_nlanes = CV_RVV_MAX_VLEN/SZ; \ +}; + +OPENCV_HAL_IMPL_RVV_TRAITS(vint8m1_t, int8_t, e8m1, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vint8m2_t, int8_t, e8m2, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vint8m4_t, int8_t, e8m4, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vint8m8_t, int8_t, e8m8, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint8m1_t, uint8_t, e8m1, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint8m2_t, uint8_t, e8m2, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint8m4_t, uint8_t, e8m4, 8) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint8m8_t, uint8_t, e8m8, 8) + +OPENCV_HAL_IMPL_RVV_TRAITS(vint16m1_t, int16_t, e16m1, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vint16m2_t, int16_t, e16m2, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vint16m4_t, int16_t, e16m4, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vint16m8_t, int16_t, e16m8, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint16m1_t, uint16_t, e16m1, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint16m2_t, uint16_t, e16m2, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint16m4_t, uint16_t, e16m4, 16) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint16m8_t, uint16_t, e16m8, 16) + +OPENCV_HAL_IMPL_RVV_TRAITS(vint32m1_t, int32_t, e32m1, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vint32m2_t, int32_t, e32m2, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vint32m4_t, int32_t, e32m4, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vint32m8_t, int32_t, e32m8, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint32m1_t, uint32_t, e32m1, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint32m2_t, uint32_t, e32m2, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint32m4_t, uint32_t, e32m4, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint32m8_t, uint32_t, e32m8, 32) + +OPENCV_HAL_IMPL_RVV_TRAITS(vint64m1_t, int64_t, e64m1, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vint64m2_t, int64_t, e64m2, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vint64m4_t, int64_t, e64m4, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vint64m8_t, int64_t, e64m8, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint64m1_t, uint64_t, e64m1, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint64m2_t, uint64_t, e64m2, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint64m4_t, uint64_t, e64m4, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vuint64m8_t, uint64_t, e64m8, 64) + +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat32m1_t, float, e32m1, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat32m2_t, float, e32m2, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat32m4_t, float, e32m4, 32) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat32m8_t, float, e32m8, 32) + +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat64m1_t, double, e64m1, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat64m2_t, double, e64m2, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat64m4_t, double, e64m4, 64) +OPENCV_HAL_IMPL_RVV_TRAITS(vfloat64m8_t, double, e64m8, 64) +#endif + + +// LLVM/Clang defines "overloaded intrinsics" e.g. 'vand(op1, op2)' +// GCC does not have these functions, so we need to implement them manually +// We implement only selected subset required to build current state of the code +// Included inside namespace cv:: +#ifndef __riscv_v_intrinsic_overloading +#include "intrin_rvv_compat_overloaded.hpp" +#endif // __riscv_v_intrinsic_overloading + + +//////////// get0 //////////// +#define OPENCV_HAL_IMPL_RVV_GRT0_INT(_Tpvec, _Tp) \ +inline _Tp v_get0(const v_##_Tpvec& v) \ +{ \ + return vmv_x(v); \ +} + +OPENCV_HAL_IMPL_RVV_GRT0_INT(uint8, uchar) +OPENCV_HAL_IMPL_RVV_GRT0_INT(int8, schar) +OPENCV_HAL_IMPL_RVV_GRT0_INT(uint16, ushort) +OPENCV_HAL_IMPL_RVV_GRT0_INT(int16, short) +OPENCV_HAL_IMPL_RVV_GRT0_INT(uint32, unsigned) +OPENCV_HAL_IMPL_RVV_GRT0_INT(int32, int) +OPENCV_HAL_IMPL_RVV_GRT0_INT(uint64, uint64) +OPENCV_HAL_IMPL_RVV_GRT0_INT(int64, int64) + +inline float v_get0(const v_float32& v) \ +{ \ + return vfmv_f(v); \ +} +#if CV_SIMD_SCALABLE_64F +inline double v_get0(const v_float64& v) \ +{ \ + return vfmv_f(v); \ +} +#endif + +//////////// Initial //////////// + +#define OPENCV_HAL_IMPL_RVV_INIT_INTEGER(_Tpvec, _Tp, suffix1, suffix2, vl) \ +inline v_##_Tpvec v_setzero_##suffix1() \ +{ \ + return vmv_v_x_##suffix2##m1(0, vl); \ +} \ +inline v_##_Tpvec v_setall_##suffix1(_Tp v) \ +{ \ + return vmv_v_x_##suffix2##m1(v, vl); \ +} + +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint8, uchar, u8, u8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int8, schar, s8, i8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint16, ushort, u16, u16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int16, short, s16, i16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint32, uint, u32, u32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int32, int, s32, i32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(uint64, uint64, u64, u64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INIT_INTEGER(int64, int64, s64, i64, VTraits::vlanes()) + +#define OPENCV_HAL_IMPL_RVV_INIT_FP(_Tpv, _Tp, suffix, vl) \ +inline v_##_Tpv v_setzero_##suffix() \ +{ \ + return vfmv_v_f_##suffix##m1(0, vl); \ +} \ +inline v_##_Tpv v_setall_##suffix(_Tp v) \ +{ \ + return vfmv_v_f_##suffix##m1(v, vl); \ +} + +OPENCV_HAL_IMPL_RVV_INIT_FP(float32, float, f32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_INIT_FP(float64, double, f64, VTraits::vlanes()) +#endif + +//////////// Reinterpret //////////// +#define OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(_Tpvec1, suffix1) \ +inline v_##_Tpvec1 v_reinterpret_as_##suffix1(const v_##_Tpvec1& v) \ +{ \ + return v;\ +} +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(uint8, u8) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(uint16, u16) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(uint32, u32) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(uint64, u64) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(int8, s8) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(int16, s16) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(int32, s32) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(int64, s64) +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(float32, f32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_NOTHING_REINTERPRET(float64, f64) +#endif +// TODO: can be simplified by using overloaded RV intrinsic +#define OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(_Tpvec1, _Tpvec2, suffix1, suffix2, nsuffix1, nsuffix2) \ +inline v_##_Tpvec1 v_reinterpret_as_##suffix1(const v_##_Tpvec2& v) \ +{ \ + return v_##_Tpvec1(vreinterpret_v_##nsuffix2##m1_##nsuffix1##m1(v));\ +} \ +inline v_##_Tpvec2 v_reinterpret_as_##suffix2(const v_##_Tpvec1& v) \ +{ \ + return v_##_Tpvec2(vreinterpret_v_##nsuffix1##m1_##nsuffix2##m1(v));\ +} + +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8, int8, u8, s8, u8, i8) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16, int16, u16, s16, u16, i16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32, int32, u32, s32, u32, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32, float32, u32, f32, u32, f32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int32, float32, s32, f32, i32, f32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint64, int64, u64, s64, u64, i64) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint64, float64, u64, f64, u64, f64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int64, float64, s64, f64, i64, f64) +#endif +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8, uint16, u8, u16, u8, u16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8, uint32, u8, u32, u8, u32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint8, uint64, u8, u64, u8, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16, uint32, u16, u32, u16, u32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint16, uint64, u16, u64, u16, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(uint32, uint64, u32, u64, u32, u64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8, int16, s8, s16, i8, i16) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8, int32, s8, s32, i8, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int8, int64, s8, s64, i8, i64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int16, int32, s16, s32, i16, i32) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int16, int64, s16, s64, i16, i64) +OPENCV_HAL_IMPL_RVV_NATIVE_REINTERPRET(int32, int64, s32, s64, i32, i64) + + +#define OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(_Tpvec1, _Tpvec2, suffix1, suffix2, nsuffix1, nsuffix2, width1, width2) \ +inline v_##_Tpvec1 v_reinterpret_as_##suffix1(const v_##_Tpvec2& v) \ +{ \ + return vreinterpret_v_##nsuffix1##width2##m1_##nsuffix1##width1##m1(vreinterpret_v_##nsuffix2##width2##m1_##nsuffix1##width2##m1(v));\ +} \ +inline v_##_Tpvec2 v_reinterpret_as_##suffix2(const v_##_Tpvec1& v) \ +{ \ + return vreinterpret_v_##nsuffix1##width2##m1_##nsuffix2##width2##m1(vreinterpret_v_##nsuffix1##width1##m1_##nsuffix1##width2##m1(v));\ +} + +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8, int16, u8, s16, u, i, 8, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8, int32, u8, s32, u, i, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8, int64, u8, s64, u, i, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16, int8, u16, s8, u, i, 16, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16, int32, u16, s32, u, i, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16, int64, u16, s64, u, i, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32, int8, u32, s8, u, i, 32, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32, int16, u32, s16, u, i, 32, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32, int64, u32, s64, u, i, 32, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64, int8, u64, s8, u, i, 64, 8) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64, int16, u64, s16, u, i, 64, 16) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64, int32, u64, s32, u, i, 64, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8, float32, u8, f32, u, f, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16, float32, u16, f32, u, f, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint64, float32, u64, f32, u, f, 64, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int8, float32, s8, f32, i, f, 8, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int16, float32, s16, f32, i, f, 16, 32) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int64, float32, s64, f32, i, f, 64, 32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint8, float64, u8, f64, u, f, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint16, float64, u16, f64, u, f, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(uint32, float64, u32, f64, u, f, 32, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int8, float64, s8, f64, i, f, 8, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int16, float64, s16, f64, i, f, 16, 64) +OPENCV_HAL_IMPL_RVV_TWO_TIMES_REINTERPRET(int32, float64, s32, f64, i, f, 32, 64) +// Three times reinterpret +inline v_float32 v_reinterpret_as_f32(const v_float64& v) \ +{ \ + return vreinterpret_v_u32m1_f32m1(vreinterpret_v_u64m1_u32m1(vreinterpret_v_f64m1_u64m1(v)));\ +} + +inline v_float64 v_reinterpret_as_f64(const v_float32& v) \ +{ \ + return vreinterpret_v_u64m1_f64m1(vreinterpret_v_u32m1_u64m1(vreinterpret_v_f32m1_u32m1(v)));\ +} +#endif + +//////////// Extract ////////////// + +#define OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(_Tpvec, _Tp, suffix, vl) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b, int i = s) \ +{ \ + return vslideup(vslidedown(v_setzero_##suffix(), a, i, vl), b, VTraits<_Tpvec>::vlanes() - i, vl); \ +} \ +template inline _Tp v_extract_n(_Tpvec v, int i = s) \ +{ \ + return vmv_x(vslidedown(v_setzero_##suffix(), v, i, vl)); \ +} + + +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint8, uchar, u8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int8, schar, s8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint16, ushort, u16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int16, short, s16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint32, unsigned int, u32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int32, int, s32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_uint64, uint64, u64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT_INTEGER(v_int64, int64, s64, VTraits::vlanes()) + +#define OPENCV_HAL_IMPL_RVV_EXTRACT_FP(_Tpvec, _Tp, suffix, vl) \ +template \ +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b, int i = s) \ +{ \ + return vslideup(vslidedown(v_setzero_##suffix(), a, i, vl), b, VTraits<_Tpvec>::vlanes() - i, vl); \ +} \ +template inline _Tp v_extract_n(_Tpvec v, int i = s) \ +{ \ + return vfmv_f(vslidedown(v_setzero_##suffix(), v, i, vl)); \ +} + +OPENCV_HAL_IMPL_RVV_EXTRACT_FP(v_float32, float, f32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_EXTRACT_FP(v_float64, double, f64, VTraits::vlanes()) +#endif + +#define OPENCV_HAL_IMPL_RVV_EXTRACT(_Tpvec, _Tp, vl) \ +inline _Tp v_extract_highest(_Tpvec v) \ +{ \ + return v_extract_n(v, vl-1); \ +} + +OPENCV_HAL_IMPL_RVV_EXTRACT(v_uint8, uchar, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_int8, schar, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_uint16, ushort, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_int16, short, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_uint32, unsigned int, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_int32, int, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_uint64, uint64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_int64, int64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_EXTRACT(v_float32, float, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_EXTRACT(v_float64, double, VTraits::vlanes()) +#endif + + +////////////// Load/Store ////////////// +#define OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(_Tpvec, _nTpvec, _Tp, hvl, vl, width, suffix, vmv) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ \ + return vle##width##_v_##suffix##m1(ptr, vl); \ +} \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ \ + return vle##width##_v_##suffix##m1(ptr, vl); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ \ + vse##width##_v_##suffix##m1(ptr, a, vl); \ +} \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ \ + return vle##width##_v_##suffix##m1(ptr, hvl); \ +} \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ \ + return vslideup(vle##width##_v_##suffix##m1(ptr0, hvl), vle##width##_v_##suffix##m1(ptr1, hvl), hvl, vl); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width(ptr, a, vl); \ +} \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width(ptr, a, vl); \ +} \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width(ptr, a, vl); \ +} \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width(ptr, a, hvl); \ +} \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + vse##width(ptr, vslidedown_vx_##suffix##m1(vmv(0, vl), a, hvl, vl), hvl); \ +} \ +inline _Tpvec v_load(std::initializer_list<_Tp> nScalars) \ +{ \ + assert(nScalars.size() == vl); \ + return vle##width##_v_##suffix##m1(nScalars.begin(), nScalars.size()); \ +} \ +template \ +_Tpvec v_load_##suffix(Targs... nScalars) \ +{ \ + return v_load({nScalars...}); \ +} + + +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint8, vuint8m1_t, uchar, VTraits::vlanes() / 2, VTraits::vlanes(), 8, u8, vmv_v_x_u8m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int8, vint8m1_t, schar, VTraits::vlanes() / 2, VTraits::vlanes(), 8, i8, vmv_v_x_i8m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint16, vuint16m1_t, ushort, VTraits::vlanes() / 2, VTraits::vlanes(), 16, u16, vmv_v_x_u16m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int16, vint16m1_t, short, VTraits::vlanes() / 2, VTraits::vlanes(), 16, i16, vmv_v_x_i16m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint32, vuint32m1_t, unsigned int, VTraits::vlanes() / 2, VTraits::vlanes(), 32, u32, vmv_v_x_u32m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int32, vint32m1_t, int, VTraits::vlanes() / 2, VTraits::vlanes(), 32, i32, vmv_v_x_i32m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_uint64, vuint64m1_t, uint64, VTraits::vlanes() / 2, VTraits::vlanes(), 64, u64, vmv_v_x_u64m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_int64, vint64m1_t, int64, VTraits::vlanes() / 2, VTraits::vlanes(), 64, i64, vmv_v_x_i64m1) +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_float32, vfloat32m1_t, float, VTraits::vlanes() /2 , VTraits::vlanes(), 32, f32, vfmv_v_f_f32m1) + +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_LOADSTORE_OP(v_float64, vfloat64m1_t, double, VTraits::vlanes() / 2, VTraits::vlanes(), 64, f64, vfmv_v_f_f64m1) +#endif + +////////////// Lookup table access //////////////////// +#define OPENCV_HAL_IMPL_RVV_LUT(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_lut(const _Tp* tab, const int* idx) \ +{ \ + vuint32##suffix##_t vidx = vmul(vreinterpret_u32##suffix(vle32_v_i32##suffix(idx, VTraits<_Tpvec>::vlanes())), sizeof(_Tp), VTraits<_Tpvec>::vlanes()); \ + return vloxei32(tab, vidx, VTraits<_Tpvec>::vlanes()); \ +} \ +inline _Tpvec v_lut_pairs(const _Tp* tab, const int* idx) \ +{ \ + std::vector idx_; \ + for (int i = 0; i < VTraits::vlanes(); ++i) { \ + idx_.push_back(idx[i]); \ + idx_.push_back(idx[i]+1); \ + } \ + vuint32##suffix##_t vidx = vmul(vle32_v_u32##suffix(idx_.data(), VTraits<_Tpvec>::vlanes()), sizeof(_Tp), VTraits<_Tpvec>::vlanes()); \ + return vloxei32(tab, vidx, VTraits<_Tpvec>::vlanes()); \ +} \ +inline _Tpvec v_lut_quads(const _Tp* tab, const int* idx) \ +{ \ + std::vector idx_; \ + for (int i = 0; i < VTraits::vlanes(); ++i) { \ + idx_.push_back(idx[i]); \ + idx_.push_back(idx[i]+1); \ + idx_.push_back(idx[i]+2); \ + idx_.push_back(idx[i]+3); \ + } \ + vuint32##suffix##_t vidx = vmul(vle32_v_u32##suffix(idx_.data(), VTraits<_Tpvec>::vlanes()), sizeof(_Tp), VTraits<_Tpvec>::vlanes()); \ + return vloxei32(tab, vidx, VTraits<_Tpvec>::vlanes()); \ +} +OPENCV_HAL_IMPL_RVV_LUT(v_int8, schar, m4) +OPENCV_HAL_IMPL_RVV_LUT(v_int16, short, m2) +OPENCV_HAL_IMPL_RVV_LUT(v_int32, int, m1) +OPENCV_HAL_IMPL_RVV_LUT(v_int64, int64_t, mf2) +OPENCV_HAL_IMPL_RVV_LUT(v_float32, float, m1) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_LUT(v_float64, double, mf2) +#endif + +#define OPENCV_HAL_IMPL_RVV_LUT_VEC(_Tpvec, _Tp) \ +inline _Tpvec v_lut(const _Tp* tab, const v_int32& vidx) \ +{ \ + v_uint32 vidx_ = vmul(vreinterpret_u32m1(vidx), sizeof(_Tp), VTraits::vlanes()); \ + return vloxei32(tab, vidx_, VTraits<_Tpvec>::vlanes()); \ +} +OPENCV_HAL_IMPL_RVV_LUT_VEC(v_float32, float) +OPENCV_HAL_IMPL_RVV_LUT_VEC(v_int32, int) +OPENCV_HAL_IMPL_RVV_LUT_VEC(v_uint32, unsigned) + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_lut(const double* tab, const v_int32& vidx) \ +{ \ + vuint32mf2_t vidx_ = vmul(vlmul_trunc_u32mf2(vreinterpret_u32m1(vidx)), sizeof(double), VTraits::vlanes()); \ + return vloxei32(tab, vidx_, VTraits::vlanes()); \ +} +#endif + + +inline v_uint8 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((schar*)tab, idx)); } +inline v_uint8 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((schar*)tab, idx)); } +inline v_uint8 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((schar*)tab, idx)); } +inline v_uint16 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((short*)tab, idx)); } +inline v_uint16 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((short*)tab, idx)); } +inline v_uint16 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((short*)tab, idx)); } +inline v_uint32 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((int*)tab, idx)); } +inline v_uint32 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((int*)tab, idx)); } +inline v_uint32 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((int*)tab, idx)); } +inline v_uint64 v_lut(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64 v_lut_pairs(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } +inline v_uint64 v_lut_quads(const uint64* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_quads((const int64_t*)tab, idx)); } + +////////////// Pack boolean //////////////////// +inline v_uint8 v_pack_b(const v_uint16& a, const v_uint16& b) +{ + return vnsrl(vset(vlmul_ext_v_u16m1_u16m2(a),1,b), 0, VTraits::vlanes()); +} + +inline v_uint8 v_pack_b(const v_uint32& a, const v_uint32& b, + const v_uint32& c, const v_uint32& d) +{ + + return vnsrl(vnsrl(vset(vset(vset(vlmul_ext_u32m4(a),1,b),2,c),3,d), 0, VTraits::vlanes()), 0, VTraits::vlanes()); +} + +inline v_uint8 v_pack_b(const v_uint64& a, const v_uint64& b, const v_uint64& c, + const v_uint64& d, const v_uint64& e, const v_uint64& f, + const v_uint64& g, const v_uint64& h) +{ + return vnsrl(vnsrl(vnsrl( + vset(vset(vset(vset(vset(vset(vset(vlmul_ext_u64m8(a), + 1,b),2,c),3,d),4,e),5,f),6,g),7,h), + 0, VTraits::vlanes()), 0, VTraits::vlanes()), 0, VTraits::vlanes()); +} + +////////////// Arithmetics ////////////// +#define OPENCV_HAL_IMPL_RVV_BIN_OP(_Tpvec, ocv_intrin, rvv_intrin) \ +inline _Tpvec v_##ocv_intrin(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return rvv_intrin(a, b, VTraits<_Tpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint8, add, vsaddu) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint8, sub, vssubu) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int8, add, vsadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int8, sub, vssub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint16, add, vsaddu) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint16, sub, vssubu) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int16, add, vsadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int16, sub, vssub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint32, add, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint32, sub, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint32, mul, vmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int32, add, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int32, sub, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int32, mul, vmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float32, add, vfadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float32, sub, vfsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float32, mul, vfmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float32, div, vfdiv) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint64, add, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint64, sub, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int64, add, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int64, sub, vsub) + +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float64, add, vfadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float64, sub, vfsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float64, mul, vfmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_float64, div, vfdiv) +#endif + +#define OPENCV_HAL_IMPL_RVV_BIN_MADD(_Tpvec, rvv_add) \ +template \ +inline _Tpvec v_add(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_add(rvv_add(f1, f2, VTraits<_Tpvec>::vlanes()), vf...); \ +} +#define OPENCV_HAL_IMPL_RVV_BIN_MMUL(_Tpvec, rvv_mul) \ +template \ +inline _Tpvec v_mul(const _Tpvec& f1, const _Tpvec& f2, const Args&... vf) { \ + return v_mul(rvv_mul(f1, f2, VTraits<_Tpvec>::vlanes()), vf...); \ +} +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_uint8, vsaddu) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_int8, vsadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_uint16, vsaddu) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_int16, vsadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_uint32, vadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_int32, vadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_float32, vfadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_uint64, vadd) +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_int64, vadd) + +OPENCV_HAL_IMPL_RVV_BIN_MMUL(v_uint32, vmul) +OPENCV_HAL_IMPL_RVV_BIN_MMUL(v_int32, vmul) +OPENCV_HAL_IMPL_RVV_BIN_MMUL(v_float32, vfmul) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_BIN_MADD(v_float64, vfadd) +OPENCV_HAL_IMPL_RVV_BIN_MMUL(v_float64, vfmul) +#endif + +#define OPENCV_HAL_IMPL_RVV_MUL_EXPAND(_Tpvec, _Tpwvec, _TpwvecM2, suffix, wmul) \ +inline void v_mul_expand(const _Tpvec& a, const _Tpvec& b, _Tpwvec& c, _Tpwvec& d) \ +{ \ + _TpwvecM2 temp = wmul(a, b, VTraits<_Tpvec>::vlanes()); \ + c = vget_##suffix##m1(temp, 0); \ + d = vget_##suffix##m1(temp, 1); \ +} + +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint8, v_uint16, vuint16m2_t, u16, vwmulu) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_int8, v_int16, vint16m2_t, i16, vwmul) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint16, v_uint32, vuint32m2_t, u32, vwmulu) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_int16, v_int32, vint32m2_t, i32, vwmul) +OPENCV_HAL_IMPL_RVV_MUL_EXPAND(v_uint32, v_uint64, vuint64m2_t, u64, vwmulu) + +inline v_int16 v_mul_hi(const v_int16& a, const v_int16& b) +{ + return vmulh(a, b, VTraits::vlanes()); +} +inline v_uint16 v_mul_hi(const v_uint16& a, const v_uint16& b) +{ + return vmulhu(a, b, VTraits::vlanes()); +} + +////////////// Arithmetics (wrap)////////////// +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint8, add_wrap, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int8, add_wrap, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint16, add_wrap, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int16, add_wrap, vadd) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint8, sub_wrap, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int8, sub_wrap, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint16, sub_wrap, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int16, sub_wrap, vsub) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint8, mul_wrap, vmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int8, mul_wrap, vmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_uint16, mul_wrap, vmul) +OPENCV_HAL_IMPL_RVV_BIN_OP(v_int16, mul_wrap, vmul) + +//////// Saturating Multiply //////// +#define OPENCV_HAL_IMPL_RVV_MUL_SAT(_Tpvec, _clip, _wmul) \ +inline _Tpvec v_mul(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _clip(_wmul(a, b, VTraits<_Tpvec>::vlanes()), 0, VTraits<_Tpvec>::vlanes()); \ +} \ +template \ +inline _Tpvec v_mul(const _Tpvec& a1, const _Tpvec& a2, const Args&... va) { \ + return v_mul(_clip(_wmul(a1, a2, VTraits<_Tpvec>::vlanes()), 0, VTraits<_Tpvec>::vlanes()), va...); \ +} + +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_uint8, vnclipu, vwmulu) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_int8, vnclip, vwmul) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_uint16, vnclipu, vwmulu) +OPENCV_HAL_IMPL_RVV_MUL_SAT(v_int16, vnclip, vwmul) + +////////////// Bitwise logic ////////////// + +#define OPENCV_HAL_IMPL_RVV_LOGIC_OP(_Tpvec, vl) \ +inline _Tpvec v_and(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vand(a, b, vl); \ +} \ +inline _Tpvec v_or(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vor(a, b, vl); \ +} \ +inline _Tpvec v_xor(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vxor(a, b, vl); \ +} \ +inline _Tpvec v_not (const _Tpvec& a) \ +{ \ + return vnot(a, vl); \ +} + +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_uint64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_LOGIC_OP(v_int64, VTraits::vlanes()) + +#define OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(intrin) \ +inline v_float32 intrin (const v_float32& a, const v_float32& b) \ +{ \ + return vreinterpret_f32m1(intrin(vreinterpret_i32m1(a), vreinterpret_i32m1(b))); \ +} +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(v_and) +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(v_or) +OPENCV_HAL_IMPL_RVV_FLT_BIT_OP(v_xor) + +inline v_float32 v_not (const v_float32& a) \ +{ \ + return vreinterpret_f32m1(v_not(vreinterpret_i32m1(a))); \ +} + +#if CV_SIMD_SCALABLE_64F +#define OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(intrin) \ +inline v_float64 intrin (const v_float64& a, const v_float64& b) \ +{ \ + return vreinterpret_f64m1(intrin(vreinterpret_i64m1(a), vreinterpret_i64m1(b))); \ +} +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(v_and) +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(v_or) +OPENCV_HAL_IMPL_RVV_FLT64_BIT_OP(v_xor) + +inline v_float64 v_not (const v_float64& a) \ +{ \ + return vreinterpret_f64m1(v_not(vreinterpret_i64m1(a))); \ +} +#endif + + +////////////// Bitwise shifts ////////////// +/* Usage +1. v_shl(vec); +2. v_shl(vec, N); // instead of vec << N, when N is non-constant. +*/ + +#define OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(_Tpvec, vl) \ +template inline _Tpvec v_shl(const _Tpvec& a, int n = s) \ +{ \ + return _Tpvec(vsll(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shr(const _Tpvec& a, int n = s) \ +{ \ + return _Tpvec(vsrl(a, uint8_t(n), vl)); \ +} + +#define OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(_Tpvec, vl) \ +template inline _Tpvec v_shl(const _Tpvec& a, int n = s) \ +{ \ + return _Tpvec(vsll(a, uint8_t(n), vl)); \ +} \ +template inline _Tpvec v_shr(const _Tpvec& a, int n = s) \ +{ \ + return _Tpvec(vsra(a, uint8_t(n), vl)); \ +} + +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_UNSIGNED_SHIFT_OP(v_uint64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_SHIFT_OP(v_int64, VTraits::vlanes()) + +////////////// Comparison ////////////// +#define OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, op, intrin, suffix, vl) \ +inline _Tpvec v_##op(const _Tpvec& a, const _Tpvec& b) \ +{ \ + uint64_t ones = -1; \ + return vmerge(intrin(a, b, vl), vmv_v_x_##suffix##m1(0, vl), ones, vl); \ +} + +#define OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, op, intrin, suffix, vl) \ +inline _Tpvec v_##op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + union { uint64 u; double d; } ones; ones.u = -1; \ + return _Tpvec(vfmerge(intrin(a, b, vl), vfmv_v_f_##suffix##m1(0, vl), ones.d, vl)); \ +} //TODO + +#define OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(_Tpvec, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, eq, vmseq, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ne, vmsne, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, lt, vmsltu, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, gt, vmsgtu, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, le, vmsleu, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ge, vmsgeu, suffix, vl) + +#define OPENCV_HAL_IMPL_RVV_SIGNED_CMP(_Tpvec, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, eq, vmseq, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ne, vmsne, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, lt, vmslt, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, gt, vmsgt, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, le, vmsle, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_INT_CMP_OP(_Tpvec, ge, vmsge, suffix, vl) + +#define OPENCV_HAL_IMPL_RVV_FLOAT_CMP(_Tpvec, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, eq, vmfeq, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, ne, vmfne, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, lt, vmflt, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, gt, vmfgt, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, le, vmfle, suffix, vl) \ +OPENCV_HAL_IMPL_RVV_FLOAT_CMP_OP(_Tpvec, ge, vmfge, suffix, vl) + + +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint8, u8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint16, u16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint32, u32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_UNSIGNED_CMP(v_uint64, u64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int8, i8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int16, i16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int32, i32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SIGNED_CMP(v_int64, i64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_FLOAT_CMP(v_float32, f32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_FLOAT_CMP(v_float64, f64, VTraits::vlanes()) +#endif + +inline v_float32 v_not_nan(const v_float32& a) +{ return v_eq(a, a); } + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_not_nan(const v_float64& a) +{ return v_eq(a, a); } +#endif + +////////////// Min/Max ////////////// + +#define OPENCV_HAL_IMPL_RVV_BIN_FUNC(_Tpvec, func, intrin, vl) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return intrin(a, b, vl); \ +} + +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8, v_min, vminu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint8, v_max, vmaxu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8, v_min, vmin, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int8, v_max, vmax, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16, v_min, vminu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint16, v_max, vmaxu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16, v_min, vmin, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int16, v_max, vmax, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint32, v_min, vminu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_uint32, v_max, vmaxu, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int32, v_min, vmin, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_int32, v_max, vmax, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float32, v_min, vfmin, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float32, v_max, vfmax, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float64, v_min, vfmin, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_BIN_FUNC(v_float64, v_max, vfmax, VTraits::vlanes()) +#endif + +////////////// Transpose4x4 ////////////// +#define OPENCV_HAL_IMPL_RVV_ZIP4(_Tpvec, _wTpvec, suffix, convert2u, convert) \ +inline void v_zip4(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) { \ + int vl = 4; \ + _wTpvec temp = vreinterpret_##suffix##m2(convert2u( \ + vor(vzext_vf2(convert(a0), vl), \ + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(convert(a1), vl)), 0, vl*2)), \ + vl))); \ + b0 = vget_##suffix##m1(temp, 0); \ + b1 = vget_##suffix##m1(vrgather(temp, vadd(vid_v_u32m2(vl), 4, vl)/*{4,5,6,7} */, vl) ,0); \ +} + +OPENCV_HAL_IMPL_RVV_ZIP4(v_uint32, vuint32m2_t, u32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_ZIP4(v_int32, vint32m2_t, i32, vreinterpret_u32m2, vreinterpret_u32m1) +OPENCV_HAL_IMPL_RVV_ZIP4(v_float32, vfloat32m2_t, f32, vreinterpret_u32m2, vreinterpret_u32m1) + +#if 0 +// this is v_zip4 and v_tranpose4x4 for scalable VLEN, costs more instruction than current 128-bit only version. +inline void v_zip4(const v_float32& a0, const v_float32& a1, v_float32& b0, v_float32& b1) { + vuint64m1_t vid1 = vid_v_u64m1(VTraits::vlanes()); + vuint16m1_t t1 = vreinterpret_u16m1(vid1); + vuint16m1_t t2 = vslide1up(t1, 0, VTraits::vlanes()); + vuint16m1_t t3 = vslide1up(t2, 0, VTraits::vlanes()); + vuint16m1_t t4 = vslide1up(t3, 0, VTraits::vlanes()); + t1 = vor( + vor(t1, t2, VTraits::vlanes()), + vor(t3, t4, VTraits::vlanes()), + VTraits::vlanes() + ); + vuint32m2_t vidx0 = vwmulu(t1, 4, VTraits::vlanes()); + vidx0 = vadd(vidx0, vid_v_u32m2(VTraits::vlanes()), VTraits::vlanes()); + vuint32m2_t vidx1 = vadd(vidx0, 4, VTraits::vlanes()); + vfloat32m2_t temp = vreinterpret_f32m2(vreinterpret_u32m2( + vor(vzext_vf2(vreinterpret_u32m1(a0), VTraits::vlanes()), + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(vreinterpret_u32m1(a1), VTraits::vlanes())), 0, VTraits::vlanes()*2)), + VTraits::vlanes()))); + b0 = vlmul_trunc_f32m1(vrgather(temp, vidx0, VTraits::vlanes())); + b1 = vlmul_trunc_f32m1(vrgather(temp, vidx1, VTraits::vlanes())); +} + +inline void v_transpose4x4(const v_float32& a0, const v_float32& a1, const v_float32& a2, const v_float32& a3,\ + v_float32& b0, v_float32& b1, v_float32& b2, v_float32& b3) { \ + vuint64m2_t vid1 = vid_v_u64m2(VTraits::vlanes()); + vuint16m2_t t1 = vreinterpret_u16m2(vid1); + vuint16m2_t t2 = vslide1up(t1, 0, VTraits::vlanes()); + vuint16m2_t t3 = vslide1up(t2, 0, VTraits::vlanes()); + vuint16m2_t t4 = vslide1up(t3, 0, VTraits::vlanes()); + t1 = vor( + vor(t1, t2, VTraits::vlanes()), + vor(t3, t4, VTraits::vlanes()), + VTraits::vlanes() + ); + vuint16m2_t vidx0 = vmul(t1, 12, VTraits::vlanes()); + vidx0 = vadd(vidx0, vid_v_u16m2(VTraits::vlanes()), VTraits::vlanes()); + vuint16m2_t vidx1 = vadd(vidx0, 4, VTraits::vlanes()); + vuint16m2_t vidx2 = vadd(vidx0, 8, VTraits::vlanes()); + vuint16m2_t vidx3 = vadd(vidx0, 12, VTraits::vlanes()); + vuint32m2_t tempA = vreinterpret_u32m2( \ + vor(vzext_vf2(vreinterpret_u32m1(a0), VTraits::vlanes()), \ + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(vreinterpret_u32m1(a2), VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes())); \ + vuint32m2_t tempB = vreinterpret_u32m2( \ + vor(vzext_vf2(vreinterpret_u32m1(a1), VTraits::vlanes()), \ + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(vreinterpret_u32m1(a3), VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes())); \ + vfloat32m4_t temp = vreinterpret_f32m4(vreinterpret_u32m4( \ + vor(vzext_vf2(tempA, VTraits::vlanes()), \ + vreinterpret_u64m4(vslide1up(vreinterpret_u32m4(vzext_vf2(tempB, VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes()))); \ + b0 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx0, VTraits::vlanes())); + b1 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx1, VTraits::vlanes())); + b2 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx2, VTraits::vlanes())); + b3 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx3, VTraits::vlanes())); +} +#endif + +#define OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(_Tpvec, suffix) \ +inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, const _Tpvec& a2, const _Tpvec& a3, _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) { \ + _Tpvec t0,t1,t2,t3; \ + v_zip4(a0, a2, t0, t2); \ + v_zip4(a1, a3, t1, t3); \ + v_zip4(t0, t1, b0, b1); \ + v_zip4(t2, t3, b2, b3); \ +} + +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(v_uint32, u32) +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(v_int32, i32) +OPENCV_HAL_IMPL_RVV_TRANSPOSE4x4(v_float32, f32) + +////////////// Reduce ////////////// + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SUM(_Tpvec, _wTpvec, _nwTpvec, scalartype, wsuffix, vl, red) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + _nwTpvec zero = vmv_v_x_##wsuffix##m1(0, vl); \ + _nwTpvec res = vmv_v_x_##wsuffix##m1(0, vl); \ + res = v##red(res, a, zero, vl); \ + return (scalartype)v_get0(res); \ +} +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint8, v_uint16, vuint16m1_t, unsigned, u16, VTraits::vlanes(), wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int8, v_int16, vint16m1_t, int, i16, VTraits::vlanes(), wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint16, v_uint32, vuint32m1_t, unsigned, u32, VTraits::vlanes(), wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int16, v_int32, vint32m1_t, int, i32, VTraits::vlanes(), wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint32, v_uint64, vuint64m1_t, unsigned, u64, VTraits::vlanes(), wredsumu) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int32, v_int64, vint64m1_t, int, i64, VTraits::vlanes(), wredsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_uint64, v_uint64, vuint64m1_t, uint64, u64, VTraits::vlanes(), redsum) +OPENCV_HAL_IMPL_RVV_REDUCE_SUM(v_int64, v_int64, vint64m1_t, int64, i64, VTraits::vlanes(), redsum) + + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(_Tpvec, _wTpvec, _nwTpvec, scalartype, wsuffix, vl) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + _nwTpvec zero = vfmv_v_f_##wsuffix##m1(0, vl); \ + _nwTpvec res = vfmv_v_f_##wsuffix##m1(0, vl); \ + res = vfredosum(res, a, zero, vl); \ + return (scalartype)v_get0(res); \ +} +OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(v_float32, v_float32, vfloat32m1_t, float, f32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_REDUCE_SUM_FP(v_float64, v_float64, vfloat64m1_t, float, f64, VTraits::vlanes()) +#endif + +#define OPENCV_HAL_IMPL_RVV_REDUCE(_Tpvec, func, scalartype, suffix, vl, red) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + _Tpvec res = _Tpvec(v##red(a, a, a, vl)); \ + return (scalartype)v_get0(res); \ +} + +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint8, min, uchar, u8, VTraits::vlanes(), redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int8, min, schar, i8, VTraits::vlanes(), redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint16, min, ushort, u16, VTraits::vlanes(), redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int16, min, short, i16, VTraits::vlanes(), redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint32, min, unsigned, u32, VTraits::vlanes(), redminu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int32, min, int, i32, VTraits::vlanes(), redmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_float32, min, float, f32, VTraits::vlanes(), fredmin) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint8, max, uchar, u8, VTraits::vlanes(), redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int8, max, schar, i8, VTraits::vlanes(), redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint16, max, ushort, u16, VTraits::vlanes(), redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int16, max, short, i16, VTraits::vlanes(), redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_uint32, max, unsigned, u32, VTraits::vlanes(), redmaxu) +OPENCV_HAL_IMPL_RVV_REDUCE(v_int32, max, int, i32, VTraits::vlanes(), redmax) +OPENCV_HAL_IMPL_RVV_REDUCE(v_float32, max, float, f32, VTraits::vlanes(), fredmax) + +inline v_float32 v_reduce_sum4(const v_float32& a, const v_float32& b, + const v_float32& c, const v_float32& d) +{ + // 0000 1111 2222 3333 .... + vuint64m2_t vid1 = vid_v_u64m2(VTraits::vlanes()); + vuint16m2_t t1 = vreinterpret_u16m2(vid1); + vuint16m2_t t2 = vslide1up(t1, 0, VTraits::vlanes()); + vuint16m2_t t3 = vslide1up(t2, 0, VTraits::vlanes()); + vuint16m2_t t4 = vslide1up(t3, 0, VTraits::vlanes()); + t1 = vor( + vor(t1, t2, VTraits::vlanes()), + vor(t3, t4, VTraits::vlanes()), + VTraits::vlanes() + ); + + // index for transpose4X4 + vuint16m2_t vidx0 = vmul(t1, 12, VTraits::vlanes()); + vidx0 = vadd(vidx0, vid_v_u16m2(VTraits::vlanes()), VTraits::vlanes()); + vuint16m2_t vidx1 = vadd(vidx0, 4, VTraits::vlanes()); + vuint16m2_t vidx2 = vadd(vidx0, 8, VTraits::vlanes()); + vuint16m2_t vidx3 = vadd(vidx0, 12, VTraits::vlanes()); + + // zip + vuint32m2_t tempA = vreinterpret_u32m2( \ + vor(vzext_vf2(vreinterpret_u32m1(a), VTraits::vlanes()), \ + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(vreinterpret_u32m1(c), VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes())); \ + vuint32m2_t tempB = vreinterpret_u32m2( \ + vor(vzext_vf2(vreinterpret_u32m1(b), VTraits::vlanes()), \ + vreinterpret_u64m2(vslide1up(vreinterpret_u32m2(vzext_vf2(vreinterpret_u32m1(d), VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes())); \ + vfloat32m4_t temp = vreinterpret_f32m4(vreinterpret_u32m4( \ + vor(vzext_vf2(tempA, VTraits::vlanes()), \ + vreinterpret_u64m4(vslide1up(vreinterpret_u32m4(vzext_vf2(tempB, VTraits::vlanes())), 0, VTraits::vlanes())), \ + VTraits::vlanes()))); + + // transpose + vfloat32m1_t b0 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx0, VTraits::vlanes())); + vfloat32m1_t b1 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx1, VTraits::vlanes())); + vfloat32m1_t b2 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx2, VTraits::vlanes())); + vfloat32m1_t b3 = vlmul_trunc_f32m1(vrgatherei16(temp, vidx3, VTraits::vlanes())); + + // vector add + v_float32 res = vfadd( + vfadd(b0, b1, VTraits::vlanes()), + vfadd(b2, b3, VTraits::vlanes()), + VTraits::vlanes() + ); + return res; +} + +////////////// Square-Root ////////////// + +inline v_float32 v_sqrt(const v_float32& x) +{ + return vfsqrt(x, VTraits::vlanes()); +} + +inline v_float32 v_invsqrt(const v_float32& x) +{ + v_float32 one = v_setall_f32(1.0f); + return v_div(one, v_sqrt(x)); +} + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_sqrt(const v_float64& x) +{ + return vfsqrt(x, VTraits::vlanes()); +} + +inline v_float64 v_invsqrt(const v_float64& x) +{ + v_float64 one = v_setall_f64(1.0f); + return v_div(one, v_sqrt(x)); +} +#endif + +inline v_float32 v_magnitude(const v_float32& a, const v_float32& b) +{ + v_float32 x = vfmacc(vfmul(a, a, VTraits::vlanes()), b, b, VTraits::vlanes()); + return v_sqrt(x); +} + +inline v_float32 v_sqr_magnitude(const v_float32& a, const v_float32& b) +{ + return v_float32(vfmacc(vfmul(a, a, VTraits::vlanes()), b, b, VTraits::vlanes())); +} + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_magnitude(const v_float64& a, const v_float64& b) +{ + v_float64 x = vfmacc(vfmul(a, a, VTraits::vlanes()), b, b, VTraits::vlanes()); + return v_sqrt(x); +} + +inline v_float64 v_sqr_magnitude(const v_float64& a, const v_float64& b) +{ + return vfmacc(vfmul(a, a, VTraits::vlanes()), b, b, VTraits::vlanes()); +} +#endif + +////////////// Multiply-Add ////////////// + +inline v_float32 v_fma(const v_float32& a, const v_float32& b, const v_float32& c) +{ + return vfmacc(c, a, b, VTraits::vlanes()); +} +inline v_int32 v_fma(const v_int32& a, const v_int32& b, const v_int32& c) +{ + return vmacc(c, a, b, VTraits::vlanes()); +} + +inline v_float32 v_muladd(const v_float32& a, const v_float32& b, const v_float32& c) +{ + return v_fma(a, b, c); +} + +inline v_int32 v_muladd(const v_int32& a, const v_int32& b, const v_int32& c) +{ + return v_fma(a, b, c); +} + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_fma(const v_float64& a, const v_float64& b, const v_float64& c) +{ + return vfmacc_vv_f64m1(c, a, b, VTraits::vlanes()); +} + +inline v_float64 v_muladd(const v_float64& a, const v_float64& b, const v_float64& c) +{ + return v_fma(a, b, c); +} +#endif + +////////////// Check all/any ////////////// + +#define OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(_Tpvec, vl) \ +inline bool v_check_all(const _Tpvec& a) \ +{ \ + return (int)vcpop(vmslt(a, 0, vl), vl) == vl; \ +} \ +inline bool v_check_any(const _Tpvec& a) \ +{ \ + return (int)vcpop(vmslt(a, 0, vl), vl) != 0; \ +} + +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_CHECK_ALLANY(v_int64, VTraits::vlanes()) + + +inline bool v_check_all(const v_uint8& a) +{ return v_check_all(v_reinterpret_as_s8(a)); } +inline bool v_check_any(const v_uint8& a) +{ return v_check_any(v_reinterpret_as_s8(a)); } + +inline bool v_check_all(const v_uint16& a) +{ return v_check_all(v_reinterpret_as_s16(a)); } +inline bool v_check_any(const v_uint16& a) +{ return v_check_any(v_reinterpret_as_s16(a)); } + +inline bool v_check_all(const v_uint32& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_uint32& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } + +inline bool v_check_all(const v_float32& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_float32& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } + +inline bool v_check_all(const v_uint64& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_uint64& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } + +#if CV_SIMD_SCALABLE_64F +inline bool v_check_all(const v_float64& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_float64& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } +#endif + +////////////// abs ////////////// + +#define OPENCV_HAL_IMPL_RVV_ABSDIFF(_Tpvec, abs) \ +inline _Tpvec v_##abs(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return v_sub(v_max(a, b), v_min(a, b)); \ +} + +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint8, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint16, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_uint32, absdiff) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_float32, absdiff) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_float64, absdiff) +#endif +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_int8, absdiffs) +OPENCV_HAL_IMPL_RVV_ABSDIFF(v_int16, absdiffs) + +#define OPENCV_HAL_IMPL_RVV_ABSDIFF_S(_Tpvec, _rTpvec, width) \ +inline _rTpvec v_absdiff(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vnclipu(vreinterpret_u##width##m2(vwsub_vv(v_max(a, b), v_min(a, b), VTraits<_Tpvec>::vlanes())), 0, VTraits<_Tpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int8, v_uint8, 16) +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int16, v_uint16, 32) +OPENCV_HAL_IMPL_RVV_ABSDIFF_S(v_int32, v_uint32, 64) + +#define OPENCV_HAL_IMPL_RVV_ABS(_Tprvec, _Tpvec, suffix) \ +inline _Tprvec v_abs(const _Tpvec& a) \ +{ \ + return v_absdiff(a, v_setzero_##suffix()); \ +} + +OPENCV_HAL_IMPL_RVV_ABS(v_uint8, v_int8, s8) +OPENCV_HAL_IMPL_RVV_ABS(v_uint16, v_int16, s16) +OPENCV_HAL_IMPL_RVV_ABS(v_uint32, v_int32, s32) +OPENCV_HAL_IMPL_RVV_ABS(v_float32, v_float32, f32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_ABS(v_float64, v_float64, f64) +#endif + + +#define OPENCV_HAL_IMPL_RVV_REDUCE_SAD(_Tpvec, scalartype) \ +inline scalartype v_reduce_sad(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return v_reduce_sum(v_absdiff(a, b)); \ +} + +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint8, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int8, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint16, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int16, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_uint32, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_int32, unsigned) +OPENCV_HAL_IMPL_RVV_REDUCE_SAD(v_float32, float) + +////////////// Select ////////////// + +#define OPENCV_HAL_IMPL_RVV_SELECT(_Tpvec, vl) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vmerge(vmsne(mask, 0, vl), b, a, vl); \ +} + +OPENCV_HAL_IMPL_RVV_SELECT(v_uint8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SELECT(v_uint16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SELECT(v_uint32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SELECT(v_int8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SELECT(v_int16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_SELECT(v_int32, VTraits::vlanes()) + +inline v_float32 v_select(const v_float32& mask, const v_float32& a, const v_float32& b) \ +{ \ + return vmerge(vmfne(mask, 0, VTraits::vlanes()), b, a, VTraits::vlanes()); \ +} + +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_select(const v_float64& mask, const v_float64& a, const v_float64& b) \ +{ \ + return vmerge(vmfne(mask, 0, VTraits::vlanes()), b, a, VTraits::vlanes()); \ +} +#endif + +////////////// Rotate shift ////////////// + +#define OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(_Tpvec, suffix, vl) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return vslidedown(vmv_v_x_##suffix##m1(0, vl), a, n, vl); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + return vslideup(vmv_v_x_##suffix##m1(0, vl), a, n, vl); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup(vslidedown(vmv_v_x_##suffix##m1(0, vl), a, n, vl), b, VTraits<_Tpvec>::vlanes() - n, vl); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup(vslidedown(vmv_v_x_##suffix##m1(0, vl), b, VTraits<_Tpvec>::vlanes() - n, vl), a, n, vl); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ CV_UNUSED(b); return a; } + +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint8, u8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int8, i8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint16, u16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int16, i16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint32, u32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int32, i32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_uint64, u64, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_ROTATE_INTEGER(v_int64, i64, VTraits::vlanes()) + +#define OPENCV_HAL_IMPL_RVV_ROTATE_FP(_Tpvec, suffix, vl) \ +template inline _Tpvec v_rotate_right(const _Tpvec& a) \ +{ \ + return vslidedown(vfmv_v_f_##suffix##m1(0, vl), a, n, vl); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a) \ +{ \ + return vslideup(vfmv_v_f_##suffix##m1(0, vl), a, n, vl); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a) \ +{ return a; } \ +template inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup(vslidedown(vfmv_v_f_##suffix##m1(0, vl), a, n, vl), b, VTraits<_Tpvec>::vlanes() - n, vl); \ +} \ +template inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup(vslidedown(vfmv_v_f_##suffix##m1(0, vl), b, VTraits<_Tpvec>::vlanes() - n, vl), a, n, vl); \ +} \ +template<> inline _Tpvec v_rotate_left<0>(const _Tpvec& a, const _Tpvec& b) \ +{ CV_UNUSED(b); return a; } + +OPENCV_HAL_IMPL_RVV_ROTATE_FP(v_float32, f32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_ROTATE_FP(v_float64, f64, VTraits::vlanes()) +#endif + +////////////// Convert to float ////////////// +inline v_float32 v_cvt_f32(const v_int32& a) +{ + return vfcvt_f_x_v_f32m1(a, VTraits::vlanes()); +} + +#if CV_SIMD_SCALABLE_64F +inline v_float32 v_cvt_f32(const v_float64& a) +{ + return vfncvt_f(vlmul_ext_f64m2(a), VTraits::vlanes()); +} + +inline v_float32 v_cvt_f32(const v_float64& a, const v_float64& b) +{ + return vfncvt_f(vset(vlmul_ext_f64m2(a),1,b), VTraits::vlanes()); +} + +inline v_float64 v_cvt_f64(const v_int32& a) +{ + return vget_f64m1(vfwcvt_f(a, VTraits::vlanes()), 0); +} + +inline v_float64 v_cvt_f64_high(const v_int32& a) +{ + return vget_f64m1(vfwcvt_f(a, VTraits::vlanes()), 1); +} + +inline v_float64 v_cvt_f64(const v_float32& a) +{ + return vget_f64m1(vfwcvt_f(a, VTraits::vlanes()), 0); +} + +inline v_float64 v_cvt_f64_high(const v_float32& a) +{ + return vget_f64m1(vfwcvt_f(a, VTraits::vlanes()), 1); +} + +inline v_float64 v_cvt_f64(const v_int64& a) +{ + return vfcvt_f(a, VTraits::vlanes()); +} +#endif + +//////////// Broadcast ////////////// + +#define OPENCV_HAL_IMPL_RVV_BROADCAST(_Tpvec, suffix) \ +template inline _Tpvec v_broadcast_element(_Tpvec v, int i = s) \ +{ \ + return v_setall_##suffix(v_extract_n(v, i)); \ +} \ +inline _Tpvec v_broadcast_highest(_Tpvec v) \ +{ \ + return v_setall_##suffix(v_extract_n(v, VTraits<_Tpvec>::vlanes()-1)); \ +} + +OPENCV_HAL_IMPL_RVV_BROADCAST(v_uint32, u32) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_int32, s32) +OPENCV_HAL_IMPL_RVV_BROADCAST(v_float32, f32) + + +////////////// Reverse ////////////// +#define OPENCV_HAL_IMPL_RVV_REVERSE(_Tpvec, width) \ +inline _Tpvec v_reverse(const _Tpvec& a) \ +{ \ + vuint##width##m1_t vidx = vrsub(vid_v_u##width##m1(VTraits<_Tpvec>::vlanes()), VTraits<_Tpvec>::vlanes()-1, VTraits<_Tpvec>::vlanes()); \ + return vrgather(a, vidx, VTraits<_Tpvec>::vlanes()); \ +} +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint8, 8) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int8, 8) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint16, 16) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int16, 16) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint32, 32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int32, 32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_float32, 32) +OPENCV_HAL_IMPL_RVV_REVERSE(v_uint64, 64) +OPENCV_HAL_IMPL_RVV_REVERSE(v_int64, 64) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_REVERSE(v_float64, 64) +#endif + +//////////// Value reordering //////////// + +#define OPENCV_HAL_IMPL_RVV_EXPAND(_Tp, _Tpwvec, _Tpwvec_m2, _Tpvec, width, suffix, suffix2, cvt) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + _Tpwvec_m2 temp = cvt(a, vsetvlmax_e##width##m1()); \ + b0 = vget_##suffix##m1(temp, 0); \ + b1 = vget_##suffix##m1(temp, 1); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ \ + _Tpwvec_m2 temp = cvt(a, vsetvlmax_e##width##m1()); \ + return vget_##suffix##m1(temp, 0); \ +} \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ \ + _Tpwvec_m2 temp = cvt(a, vsetvlmax_e##width##m1()); \ + return vget_##suffix##m1(temp, 1); \ +} \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + return cvt(vle##width##_v_##suffix2##mf2(ptr, vsetvlmax_e##width##m1()), vsetvlmax_e##width##m1()); \ +} + +OPENCV_HAL_IMPL_RVV_EXPAND(uchar, v_uint16, vuint16m2_t, v_uint8, 8, u16, u8, vwcvtu_x) +OPENCV_HAL_IMPL_RVV_EXPAND(schar, v_int16, vint16m2_t, v_int8, 8, i16, i8, vwcvt_x) +OPENCV_HAL_IMPL_RVV_EXPAND(ushort, v_uint32, vuint32m2_t, v_uint16, 16, u32, u16, vwcvtu_x) +OPENCV_HAL_IMPL_RVV_EXPAND(short, v_int32, vint32m2_t, v_int16, 16, i32, i16, vwcvt_x) +OPENCV_HAL_IMPL_RVV_EXPAND(uint, v_uint64, vuint64m2_t, v_uint32, 32, u64, u32, vwcvtu_x) +OPENCV_HAL_IMPL_RVV_EXPAND(int, v_int64, vint64m2_t, v_int32, 32, i64, i32, vwcvt_x) + +inline v_uint32 v_load_expand_q(const uchar* ptr) +{ + return vwcvtu_x(vwcvtu_x(vle8_v_u8mf4(ptr, VTraits::vlanes()), VTraits::vlanes()), VTraits::vlanes()); +} + +inline v_int32 v_load_expand_q(const schar* ptr) +{ + return vwcvt_x(vwcvt_x(vle8_v_i8mf4(ptr, VTraits::vlanes()), VTraits::vlanes()), VTraits::vlanes()); +} + +#define OPENCV_HAL_IMPL_RVV_PACK(_Tpvec, _Tp, _wTpvec, hwidth, hsuffix, suffix, rshr, shr) \ +inline _Tpvec v_pack(const _wTpvec& a, const _wTpvec& b) \ +{ \ + return shr(vset(vlmul_ext_##suffix##m2(a), 1, b), 0, VTraits<_Tpvec>::vlanes()); \ +} \ +inline void v_pack_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + vse##hwidth##_v_##hsuffix##mf2(ptr, shr(a, 0, VTraits<_Tpvec>::vlanes()), VTraits<_wTpvec>::vlanes()); \ +} \ +template inline \ +_Tpvec v_rshr_pack(const _wTpvec& a, const _wTpvec& b, int N = n) \ +{ \ + return rshr(vset(vlmul_ext_##suffix##m2(a), 1, b), N, VTraits<_Tpvec>::vlanes()); \ +} \ +template inline \ +void v_rshr_pack_store(_Tp* ptr, const _wTpvec& a, int N = n) \ +{ \ + vse##hwidth##_v_##hsuffix##mf2(ptr, rshr(a, N, VTraits<_Tpvec>::vlanes()), VTraits<_wTpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_PACK(v_uint8, uchar, v_uint16, 8, u8, u16, vnclipu, vnclipu) +OPENCV_HAL_IMPL_RVV_PACK(v_int8, schar, v_int16, 8, i8, i16, vnclip, vnclip) +OPENCV_HAL_IMPL_RVV_PACK(v_uint16, ushort, v_uint32, 16, u16, u32, vnclipu, vnclipu) +OPENCV_HAL_IMPL_RVV_PACK(v_int16, short, v_int32, 16, i16, i32, vnclip, vnclip) +OPENCV_HAL_IMPL_RVV_PACK(v_uint32, unsigned, v_uint64, 32, u32, u64, vnclipu, vnsrl) +OPENCV_HAL_IMPL_RVV_PACK(v_int32, int, v_int64, 32, i32, i64, vnclip, vnsra) + +#define OPENCV_HAL_IMPL_RVV_PACK_U(_Tpvec, _Tp, _wTpvec, _wTp, hwidth, width, hsuffix, suffix, rshr, cast, hvl, vl) \ +inline _Tpvec v_pack_u(const _wTpvec& a, const _wTpvec& b) \ +{ \ + return vnclipu(cast(vmax(vset(vlmul_ext_##suffix##m2(a), 1, b), 0, vl)), 0, vl); \ +} \ +inline void v_pack_u_store(_Tp* ptr, const _wTpvec& a) \ +{ \ + vse##hwidth##_v_##hsuffix##mf2(ptr, vnclipu(vreinterpret_u##width##m1(vmax(a, 0, vl)), 0, vl), hvl); \ +} \ +template inline \ +_Tpvec v_rshr_pack_u(const _wTpvec& a, const _wTpvec& b, int n = N) \ +{ \ + return vnclipu(cast(vmax(vset(vlmul_ext_##suffix##m2(a), 1, b), 0, vl)), n, vl); \ +} \ +template inline \ +void v_rshr_pack_u_store(_Tp* ptr, const _wTpvec& a, int n = N) \ +{ \ + vse##hwidth##_v_##hsuffix##mf2(ptr, vnclipu(vreinterpret_u##width##m1(vmax(a, 0, vl)), n, vl), hvl); \ +} + +OPENCV_HAL_IMPL_RVV_PACK_U(v_uint8, uchar, v_int16, short, 8, 16, u8, i16, vnclipu_wx_u8m1, vreinterpret_v_i16m2_u16m2, VTraits::vlanes(), VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_PACK_U(v_uint16, ushort, v_int32, int, 16, 32, u16, i32, vnclipu_wx_u16m1, vreinterpret_v_i32m2_u32m2, VTraits::vlanes(), VTraits::vlanes()) + + +/* void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) + a0 = {A1 A2 A3 A4} + a1 = {B1 B2 B3 B4} +--------------- + {A1 B1 A2 B2} and {A3 B3 A4 B4} +*/ + +#define OPENCV_HAL_IMPL_RVV_ZIP(_Tpvec, _wTpvec, suffix, width, width2, convert2um2, convert2um1) \ +inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) { \ + _wTpvec temp = vreinterpret_##suffix##m2(convert2um2( \ + vor(vzext_vf2(convert2um1(a0), VTraits<_Tpvec>::vlanes()*2), \ + vreinterpret_u##width2##m2(vslide1up(vreinterpret_u##width##m2(vzext_vf2(convert2um1(a1), VTraits<_Tpvec>::vlanes()*2)), 0, VTraits<_Tpvec>::vlanes()*2)), \ + VTraits<_Tpvec>::vlanes()))); \ + b0 = vget_##suffix##m1(temp, 0); \ + b1 = vget_##suffix##m1(temp, 1); \ +} +OPENCV_HAL_IMPL_RVV_ZIP(v_uint8, vuint8m2_t, u8, 8, 16, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_ZIP(v_int8, vint8m2_t, i8, 8, 16, vreinterpret_u8m2, vreinterpret_u8m1) +OPENCV_HAL_IMPL_RVV_ZIP(v_uint16, vuint16m2_t, u16, 16, 32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_ZIP(v_int16, vint16m2_t, i16, 16, 32, vreinterpret_u16m2, vreinterpret_u16m1) +OPENCV_HAL_IMPL_RVV_ZIP(v_uint32, vuint32m2_t, u32, 32, 64, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_ZIP(v_int32, vint32m2_t, i32, 32, 64, vreinterpret_u32m2, vreinterpret_u32m1) +OPENCV_HAL_IMPL_RVV_ZIP(v_float32, vfloat32m2_t, f32, 32, 64, vreinterpret_u32m2, vreinterpret_u32m1) + +#define OPENCV_HAL_IMPL_RVV_UNPACKS(_Tpvec, width) \ +inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup(a, b, VTraits<_Tpvec>::vlanes()/2, VTraits<_Tpvec>::vlanes());\ +} \ +inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return vslideup( \ + vslidedown(a, a, VTraits<_Tpvec>::vlanes()/2, VTraits<_Tpvec>::vlanes()), \ + vslidedown(b, b, VTraits<_Tpvec>::vlanes()/2, VTraits<_Tpvec>::vlanes()), \ + VTraits<_Tpvec>::vlanes()/2, \ + VTraits<_Tpvec>::vlanes()); \ +} \ +inline void v_recombine(const _Tpvec& a, const _Tpvec& b, _Tpvec& c, _Tpvec& d) \ +{ \ + c = v_combine_low(a, b); \ + d = v_combine_high(a, b); \ +} + +OPENCV_HAL_IMPL_RVV_UNPACKS(v_uint8, 8) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_int8, 8) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_uint16, 16) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_int16, 16) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_uint32, 32) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_int32, 32) +OPENCV_HAL_IMPL_RVV_UNPACKS(v_float32, 32) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_UNPACKS(v_float64, 64) +#endif + +#define OPENCV_HAL_IMPL_RVV_INTERLEAVED(_Tpvec, _Tp, suffix, width, hwidth, vl) \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b) \ +{ \ + a = vlse##width##_v_##suffix##m1(ptr , sizeof(_Tp)*2, VTraits::vlanes()); \ + b = vlse##width##_v_##suffix##m1(ptr+1, sizeof(_Tp)*2, VTraits::vlanes()); \ +}\ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, v_##_Tpvec& c) \ +{ \ + a = vlse##width##_v_##suffix##m1(ptr , sizeof(_Tp)*3, VTraits::vlanes()); \ + b = vlse##width##_v_##suffix##m1(ptr+1, sizeof(_Tp)*3, VTraits::vlanes()); \ + c = vlse##width##_v_##suffix##m1(ptr+2, sizeof(_Tp)*3, VTraits::vlanes()); \ +} \ +inline void v_load_deinterleave(const _Tp* ptr, v_##_Tpvec& a, v_##_Tpvec& b, \ + v_##_Tpvec& c, v_##_Tpvec& d) \ +{ \ + \ + a = vlse##width##_v_##suffix##m1(ptr , sizeof(_Tp)*4, VTraits::vlanes()); \ + b = vlse##width##_v_##suffix##m1(ptr+1, sizeof(_Tp)*4, VTraits::vlanes()); \ + c = vlse##width##_v_##suffix##m1(ptr+2, sizeof(_Tp)*4, VTraits::vlanes()); \ + d = vlse##width##_v_##suffix##m1(ptr+3, sizeof(_Tp)*4, VTraits::vlanes()); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + vsse##width(ptr, sizeof(_Tp)*2, a, VTraits::vlanes()); \ + vsse##width(ptr+1, sizeof(_Tp)*2, b, VTraits::vlanes()); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ \ + vsse##width(ptr, sizeof(_Tp)*3, a, VTraits::vlanes()); \ + vsse##width(ptr+1, sizeof(_Tp)*3, b, VTraits::vlanes()); \ + vsse##width(ptr+2, sizeof(_Tp)*3, c, VTraits::vlanes()); \ +} \ +inline void v_store_interleave( _Tp* ptr, const v_##_Tpvec& a, const v_##_Tpvec& b, \ + const v_##_Tpvec& c, const v_##_Tpvec& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED ) \ +{ \ + vsse##width(ptr, sizeof(_Tp)*4, a, VTraits::vlanes()); \ + vsse##width(ptr+1, sizeof(_Tp)*4, b, VTraits::vlanes()); \ + vsse##width(ptr+2, sizeof(_Tp)*4, c, VTraits::vlanes()); \ + vsse##width(ptr+3, sizeof(_Tp)*4, d, VTraits::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint8, uchar, u8, 8, 4, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int8, schar, i8, 8, 4, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint16, ushort, u16, 16, 8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int16, short, i16, 16, 8, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint32, unsigned, u32, 32, 16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int32, int, i32, 32, 16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(float32, float, f32, 32, 16, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(uint64, uint64, u64, 64, 32, VTraits::vlanes()) +OPENCV_HAL_IMPL_RVV_INTERLEAVED(int64, int64, i64, 64, 32, VTraits::vlanes()) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_INTERLEAVED(float64, double, f64, 64, 32, VTraits::vlanes()) +#endif + +static uint64_t idx_interleave_pairs[] = { \ + 0x0705060403010200, 0x0f0d0e0c0b090a08, 0x1715161413111210, 0x1f1d1e1c1b191a18, \ + 0x2725262423212220, 0x2f2d2e2c2b292a28, 0x3735363433313230, 0x3f3d3e3c3b393a38, \ + 0x4745464443414240, 0x4f4d4e4c4b494a48, 0x5755565453515250, 0x5f5d5e5c5b595a58, \ + 0x6765666463616260, 0x6f6d6e6c6b696a68, 0x7775767473717270, 0x7f7d7e7c7b797a78}; + +static uint64_t idx_interleave_quads[] = { \ + 0x0703060205010400, 0x0f0b0e0a0d090c08, 0x1713161215111410, 0x1f1b1e1a1d191c18, \ + 0x2723262225212420, 0x2f2b2e2a2d292c28, 0x3733363235313430, 0x3f3b3e3a3d393c38, \ + 0x4743464245414440, 0x4f4b4e4a4d494c48, 0x5753565255515450, 0x5f5b5e5a5d595c58, \ + 0x6763666265616460, 0x6f6b6e6a6d696c68, 0x7773767275717470, 0x7f7b7e7a7d797c78}; + +#define OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ_NOEXPEND(_Tpvec, func) \ +inline _Tpvec v_interleave_##func(const _Tpvec& vec) { \ + CV_CheckLE(VTraits<_Tpvec>::vlanes(), VTraits<_Tpvec>::max_nlanes, "RVV implementation only supports VLEN in the range [128, 1024]"); \ + vuint8m1_t vidx = vundefined_u8m1();\ + vidx = vreinterpret_u8m1(vle64_v_u64m1(idx_interleave_##func, 16)); \ + return vrgather(vec, vidx, VTraits::vlanes()); \ +} +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ_NOEXPEND(v_uint8, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ_NOEXPEND(v_int8, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ_NOEXPEND(v_uint8, quads) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ_NOEXPEND(v_int8, quads) + +#define OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(_Tpvec, width, vzext_vfx, func) \ +inline _Tpvec v_interleave_##func(const _Tpvec& vec) { \ + CV_CheckLE(VTraits<_Tpvec>::vlanes(), VTraits<_Tpvec>::max_nlanes, "RVV implementation only supports VLEN in the range [128, 1024]"); \ + vuint##width##m1_t vidx = vundefined_u##width##m1();\ + vidx = vget_u##width##m1(vzext_vfx(vreinterpret_u8m1(vle64_v_u64m1(idx_interleave_##func, 16)), VTraits::vlanes()), 0); \ + return vrgather(vec, vidx, VTraits<_Tpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_uint16, 16, vzext_vf2, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_int16, 16, vzext_vf2, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_uint32, 32, vzext_vf4, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_int32, 32, vzext_vf4, pairs) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_float32, 32, vzext_vf4, pairs) + +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_uint16, 16, vzext_vf2, quads) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_int16, 16, vzext_vf2, quads) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_uint32, 32, vzext_vf4, quads) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_int32, 32, vzext_vf4, quads) +OPENCV_HAL_IMPL_RVV_INTERLEAVED_PQ(v_float32, 32, vzext_vf4, quads) + +//////////// PopCount ////////// +static const unsigned char popCountTable[256] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; +#define OPENCV_HAL_IMPL_RVV_HADD(_Tpvec, _Tpvec2, _Tm2, width, width2, suffix, add) \ +static inline _Tpvec2 v_hadd(_Tpvec a) { \ + vuint##width2##m1_t oneX2 = vmv_v_x_u##width2##m1(1, VTraits::vlanes()); \ + vuint##width##m1_t one = vreinterpret_u##width##m1(oneX2); \ + _Tm2 res = add(a, vslide1down(a, 0, VTraits::vlanes()), VTraits::vlanes()); \ + return vget_##suffix##m1(vcompress(vmseq(one, 1, VTraits::vlanes()), res, res, VTraits::vlanes()), 0); \ +} +OPENCV_HAL_IMPL_RVV_HADD(v_uint8, v_uint16, vuint16m2_t, 8, 16, u16, vwaddu_vv) +OPENCV_HAL_IMPL_RVV_HADD(v_uint16, v_uint32, vuint32m2_t, 16, 32, u32, vwaddu_vv) +OPENCV_HAL_IMPL_RVV_HADD(v_uint32, v_uint64, vuint64m2_t, 32, 64, u64, vwaddu_vv) +OPENCV_HAL_IMPL_RVV_HADD(v_int8, v_int16, vint16m2_t, 8, 16, i16, vwadd_vv) +OPENCV_HAL_IMPL_RVV_HADD(v_int16, v_int32, vint32m2_t, 16, 32, i32, vwadd_vv) +OPENCV_HAL_IMPL_RVV_HADD(v_int32, v_int64, vint64m2_t, 32, 64, i64, vwadd_vv) + +OPENCV_HAL_IMPL_RVV_HADD(vint32m2_t, v_int32, vint32m2_t, 16, 32, i32, vadd) +OPENCV_HAL_IMPL_RVV_HADD(vint64m2_t, v_int64, vint64m2_t, 32, 64, i64, vadd) + +inline v_uint8 v_popcount(const v_uint8& a) +{ + return vloxei8(popCountTable, a, VTraits::vlanes()); +} +inline v_uint16 v_popcount(const v_uint16& a) +{ + return v_hadd(v_popcount(vreinterpret_u8m1(a))); +} +inline v_uint32 v_popcount(const v_uint32& a) +{ + return v_hadd(v_hadd(v_popcount(vreinterpret_u8m1(a)))); +} +inline v_uint64 v_popcount(const v_uint64& a) +{ + return v_hadd(v_hadd(v_hadd(v_popcount(vreinterpret_u8m1(a))))); +} + +inline v_uint8 v_popcount(const v_int8& a) +{ + return v_popcount(v_abs(a));\ +} +inline v_uint16 v_popcount(const v_int16& a) +{ + return v_popcount(v_abs(a));\ +} +inline v_uint32 v_popcount(const v_int32& a) +{ + return v_popcount(v_abs(a));\ +} +inline v_uint64 v_popcount(const v_int64& a) +{ + // max(0 - a) is used, since v_abs does not support 64-bit integers. + return v_popcount(v_reinterpret_as_u64(vmax(a, v_sub(v_setzero_s64(), a), VTraits::vlanes()))); +} + + +//////////// SignMask //////////// +#define OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(_Tpvec) \ +inline int v_signmask(const _Tpvec& a) \ +{ \ + uint8_t ans[4] = {0}; \ + vsm(ans, vmslt(a, 0, VTraits<_Tpvec>::vlanes()), VTraits<_Tpvec>::vlanes()); \ + return *(reinterpret_cast(ans)) & (((__int128_t)1 << VTraits<_Tpvec>::vlanes()) - 1); \ +} \ +inline int v_scan_forward(const _Tpvec& a) \ +{ \ + return (int)vfirst(vmslt(a, 0, VTraits<_Tpvec>::vlanes()), VTraits<_Tpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int8) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int16) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int32) +OPENCV_HAL_IMPL_RVV_SIGNMASK_OP(v_int64) + +inline int64 v_signmask(const v_uint8& a) +{ return v_signmask(v_reinterpret_as_s8(a)); } +inline int64 v_signmask(const v_uint16& a) +{ return v_signmask(v_reinterpret_as_s16(a)); } +inline int v_signmask(const v_uint32& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_float32& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_uint64& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } +#if CV_SIMD_SCALABLE_64F +inline int v_signmask(const v_float64& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } +#endif + +//////////// Scan forward //////////// +inline int v_scan_forward(const v_uint8& a) +{ return v_scan_forward(v_reinterpret_as_s8(a)); } +inline int v_scan_forward(const v_uint16& a) +{ return v_scan_forward(v_reinterpret_as_s16(a)); } +inline int v_scan_forward(const v_uint32& a) +{ return v_scan_forward(v_reinterpret_as_s32(a)); } +inline int v_scan_forward(const v_float32& a) +{ return v_scan_forward(v_reinterpret_as_s32(a)); } +inline int v_scan_forward(const v_uint64& a) +{ return v_scan_forward(v_reinterpret_as_s64(a)); } +#if CV_SIMD_SCALABLE_64F +inline int v_scan_forward(const v_float64& a) +{ return v_scan_forward(v_reinterpret_as_s64(a)); } +#endif + +//////////// Pack triplets //////////// +// {A0, A1, A2, A3, B0, B1, B2, B3, C0 ...} --> {A0, A1, A2, B0, B1, B2, C0 ...} +// mask: {0,0,0,1, ...} -> {T,T,T,F, ...} +#define OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(_Tpvec, v_trunc) \ +inline _Tpvec v_pack_triplets(const _Tpvec& vec) { \ + size_t vl = vsetvlmax_e8m1(); \ + vuint32m1_t one = vmv_v_x_u32m1(1, vl/4); \ + vuint8m1_t zero = vmv_v_x_u8m1(0, vl); \ + vuint8m1_t mask = vreinterpret_u8m1(one); \ + return vcompress(vmseq(v_trunc(vslideup(zero, mask, 3, vl)), 0, vl), vec, vec, VTraits<_Tpvec>::vlanes()); \ +} + +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_uint8, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_int8, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_uint16, vlmul_trunc_u8mf2) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_int16, vlmul_trunc_u8mf2) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_uint32, vlmul_trunc_u8mf4) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_int32, vlmul_trunc_u8mf4) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_float32, vlmul_trunc_u8mf4) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_uint64, vlmul_trunc_u8mf8) +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_int64, vlmul_trunc_u8mf8) +#if CV_SIMD_SCALABLE_64F +OPENCV_HAL_IMPL_RVV_PACK_TRIPLETS(v_float64, vlmul_trunc_u8mf8) +#endif + + +////// FP16 support /////// + +#if defined(__riscv_zfh) && __riscv_zfh +inline v_float32 v_load_expand(const float16_t* ptr) +{ + return vfwcvt_f(vle16_v_f16mf2((_Float16*)ptr, VTraits::vlanes()) ,VTraits::vlanes());; +} + +inline void v_pack_store(float16_t* ptr, const v_float32& v) +{ + vse16_v_f16mf2((_Float16*)ptr, vfncvt_f_f_w_f16mf2(v, VTraits::vlanes()), VTraits::vlanes()); +} +#else +inline v_float32 v_load_expand(const float16_t* ptr) +{ + float buf[32]; + for( int i = 0; i < VTraits::vlanes(); i++ ) buf[i] = (float)ptr[i]; + return v_load(buf); +} + +inline void v_pack_store(float16_t* ptr, const v_float32& v) +{ + float buf[32]; + v_store(buf, v); + for( int i = 0; i < VTraits::vlanes(); i++ ) ptr[i] = float16_t(buf[i]); +} +#endif +////////////// Rounding ////////////// +inline v_int32 v_round(const v_float32& a) +{ + // return vfcvt_x(vfadd(a, 1e-6, VTraits::vlanes()), VTraits::vlanes()); + return vfcvt_x(a, VTraits::vlanes()); +} + +inline v_int32 v_floor(const v_float32& a) +{ + return vfcvt_x(vfsub(a, 0.5f - 1e-5, VTraits::vlanes()), VTraits::vlanes()); + // return vfcvt_x(a, VTraits::vlanes()); +} + +inline v_int32 v_ceil(const v_float32& a) +{ + return vfcvt_x(vfadd(a, 0.5f - 1e-5, VTraits::vlanes()), VTraits::vlanes()); +} + +inline v_int32 v_trunc(const v_float32& a) +{ + return vfcvt_rtz_x(a, VTraits::vlanes()); +} +#if CV_SIMD_SCALABLE_64F +inline v_int32 v_round(const v_float64& a) +{ + return vfncvt_x(vlmul_ext_f64m2(vfadd(a, 1e-6, VTraits::vlanes())), VTraits::vlanes()); +} + +inline v_int32 v_round(const v_float64& a, const v_float64& b) +{ + return vfncvt_x(vset(vlmul_ext_f64m2(vfadd(a, 1e-6, VTraits::vlanes())), 1, b), VTraits::vlanes()); +} + +inline v_int32 v_floor(const v_float64& a) +{ + return vfncvt_x(vlmul_ext_f64m2(vfsub(a, 0.5f - 1e-6, VTraits::vlanes())), VTraits::vlanes()); +} + +inline v_int32 v_ceil(const v_float64& a) +{ + return vfncvt_x(vlmul_ext_f64m2(vfadd(a, 0.5f - 1e-6, VTraits::vlanes())), VTraits::vlanes()); +} + +inline v_int32 v_trunc(const v_float64& a) +{ + return vfncvt_rtz_x(vlmul_ext_f64m2(a), VTraits::vlanes()); +} +#endif + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32 v_dotprod(const v_int16& a, const v_int16& b) +{ + vint32m2_t temp1 = vwmul(a, b, VTraits::vlanes()); + return v_hadd(temp1); +} + +inline v_int32 v_dotprod(const v_int16& a, const v_int16& b, const v_int32& c) +{ + vint32m2_t temp1 = vwmul(a, b, VTraits::vlanes()); + return vadd(v_hadd(temp1), c, VTraits::vlanes()); +} + +// 32 >> 64 +inline v_int64 v_dotprod(const v_int32& a, const v_int32& b) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint32m1_t one32 = vreinterpret_u32m1(one64); \ + vbool32_t mask = vmseq(one32, 1, VTraits::vlanes()); \ + vint64m2_t temp1 = vwmul(a, b, VTraits::vlanes()); \ + vint64m2_t temp2 = vslide1down(temp1, 0, VTraits::vlanes()); + vint64m2_t res = vadd(temp1, temp2, VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vlmul_trunc_i64m1(res); \ +} +inline v_int64 v_dotprod(const v_int32& a, const v_int32& b, const v_int64& c) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint32m1_t one32 = vreinterpret_u32m1(one64); \ + vbool32_t mask = vmseq(one32, 1, VTraits::vlanes()); \ + vint64m2_t temp1 = vwmul(a, b, VTraits::vlanes()); \ + vint64m2_t temp2 = vslide1down(temp1, 0, VTraits::vlanes()); + vint64m2_t res = vadd(temp1, temp2, VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vadd(vlmul_trunc_i64m1(res), c, VTraits::vlanes()); \ +} + +// 8 >> 32 +inline v_uint32 v_dotprod_expand(const v_uint8& a, const v_uint8& b) +{ + vuint32m1_t one32 = vmv_v_x_u32m1(1, VTraits::vlanes()); \ + vuint8m1_t one8 = vreinterpret_u8m1(one32); \ + vbool8_t mask = vmseq(one8, 1, VTraits::vlanes()); \ + vuint16m2_t t0 = vwmulu(a, b, VTraits::vlanes()); \ + vuint16m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vuint16m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vuint16m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vuint32m4_t res = vadd(vwaddu_vv(t2, t3, VTraits::vlanes()), vwaddu_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vlmul_trunc_u32m1(res); +} + +inline v_uint32 v_dotprod_expand(const v_uint8& a, const v_uint8& b, + const v_uint32& c) +{ + vuint32m1_t one32 = vmv_v_x_u32m1(1, VTraits::vlanes()); \ + vuint8m1_t one8 = vreinterpret_u8m1(one32); \ + vbool8_t mask = vmseq(one8, 1, VTraits::vlanes()); \ + vuint16m2_t t0 = vwmulu(a, b, VTraits::vlanes()); \ + vuint16m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vuint16m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vuint16m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vuint32m4_t res = vadd(vwaddu_vv(t2, t3, VTraits::vlanes()), vwaddu_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vadd(vlmul_trunc_u32m1(res), c, VTraits::vlanes()); +} + +inline v_int32 v_dotprod_expand(const v_int8& a, const v_int8& b) +{ + vuint32m1_t one32 = vmv_v_x_u32m1(1, VTraits::vlanes()); \ + vuint8m1_t one8 = vreinterpret_u8m1(one32); \ + vbool8_t mask = vmseq(one8, 1, VTraits::vlanes()); \ + vint16m2_t t0 = vwmul(a, b, VTraits::vlanes()); \ + vint16m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vint16m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vint16m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vint32m4_t res = vadd(vwadd_vv(t2, t3, VTraits::vlanes()), vwadd_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vlmul_trunc_i32m1(res); +} + +inline v_int32 v_dotprod_expand(const v_int8& a, const v_int8& b, + const v_int32& c) +{ + vuint32m1_t one32 = vmv_v_x_u32m1(1, VTraits::vlanes()); \ + vuint8m1_t one8 = vreinterpret_u8m1(one32); \ + vbool8_t mask = vmseq(one8, 1, VTraits::vlanes()); \ + vint16m2_t t0 = vwmul(a, b, VTraits::vlanes()); \ + vint16m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vint16m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vint16m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vint32m4_t res = vadd(vwadd_vv(t2, t3, VTraits::vlanes()), vwadd_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vadd(vlmul_trunc_i32m1(res), c, VTraits::vlanes()); +} + + +// // 16 >> 64 +inline v_uint64 v_dotprod_expand(const v_uint16& a, const v_uint16& b) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint16m1_t one16 = vreinterpret_u16m1(one64); \ + vbool16_t mask = vmseq(one16, 1, VTraits::vlanes()); \ + vuint32m2_t t0 = vwmulu(a, b, VTraits::vlanes()); \ + vuint32m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vuint32m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vuint32m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vuint64m4_t res = vadd(vwaddu_vv(t2, t3, VTraits::vlanes()), vwaddu_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vlmul_trunc_u64m1(res); +} +inline v_uint64 v_dotprod_expand(const v_uint16& a, const v_uint16& b, const v_uint64& c) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint16m1_t one16 = vreinterpret_u16m1(one64); \ + vbool16_t mask = vmseq(one16, 1, VTraits::vlanes()); \ + vuint32m2_t t0 = vwmulu(a, b, VTraits::vlanes()); \ + vuint32m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vuint32m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vuint32m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vuint64m4_t res = vadd(vwaddu_vv(t2, t3, VTraits::vlanes()), vwaddu_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vadd(vlmul_trunc_u64m1(res), c, VTraits::vlanes()); +} + +inline v_int64 v_dotprod_expand(const v_int16& a, const v_int16& b) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint16m1_t one16 = vreinterpret_u16m1(one64); \ + vbool16_t mask = vmseq(one16, 1, VTraits::vlanes()); \ + vint32m2_t t0 = vwmul(a, b, VTraits::vlanes()); \ + vint32m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vint32m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vint32m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vint64m4_t res = vadd(vwadd_vv(t2, t3, VTraits::vlanes()), vwadd_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vlmul_trunc_i64m1(res); +} +inline v_int64 v_dotprod_expand(const v_int16& a, const v_int16& b, + const v_int64& c) +{ + vuint64m1_t one64 = vmv_v_x_u64m1(1, VTraits::vlanes()); \ + vuint16m1_t one16 = vreinterpret_u16m1(one64); \ + vbool16_t mask = vmseq(one16, 1, VTraits::vlanes()); \ + vint32m2_t t0 = vwmul(a, b, VTraits::vlanes()); \ + vint32m2_t t1= vslide1down(t0, 0, VTraits::vlanes()); + vint32m2_t t2= vslide1down(t1, 0, VTraits::vlanes()); + vint32m2_t t3= vslide1down(t2, 0, VTraits::vlanes()); + vint64m4_t res = vadd(vwadd_vv(t2, t3, VTraits::vlanes()), vwadd_vv(t0, t1, VTraits::vlanes()), VTraits::vlanes()); + res = vcompress(mask, res, res, VTraits::vlanes()); \ + return vadd(vlmul_trunc_i64m1(res), c, VTraits::vlanes()); +} + +// // 32 >> 64f +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_dotprod_expand(const v_int32& a, const v_int32& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64 v_dotprod_expand(const v_int32& a, const v_int32& b, + const v_float64& c) +{ return v_add(v_dotprod_expand(a, b) , c); } +#endif + +//////// Fast Dot Product //////// +// 16 >> 32 +inline v_int32 v_dotprod_fast(const v_int16& a, const v_int16& b) +{ + v_int32 zero = v_setzero_s32(); + return vredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_int32 v_dotprod_fast(const v_int16& a, const v_int16& b, const v_int32& c) +{ + v_int32 zero = v_setzero_s32(); + return vredsum(zero, vwmul(a, b, VTraits::vlanes()), vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} + +// 32 >> 64 +inline v_int64 v_dotprod_fast(const v_int32& a, const v_int32& b) +{ + v_int64 zero = v_setzero_s64(); + return vredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_int64 v_dotprod_fast(const v_int32& a, const v_int32& b, const v_int64& c) +{ + v_int64 zero = v_setzero_s64(); + return vadd(vredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()) , vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} + + +// 8 >> 32 +inline v_uint32 v_dotprod_expand_fast(const v_uint8& a, const v_uint8& b) +{ + v_uint32 zero = v_setzero_u32(); + return vwredsumu(zero, vwmulu(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_uint32 v_dotprod_expand_fast(const v_uint8& a, const v_uint8& b, const v_uint32& c) +{ + v_uint32 zero = v_setzero_u32(); + return vadd(vwredsumu(zero, vwmulu(a, b, VTraits::vlanes()), zero, VTraits::vlanes()) , vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} +inline v_int32 v_dotprod_expand_fast(const v_int8& a, const v_int8& b) +{ + v_int32 zero = v_setzero_s32(); + return vwredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_int32 v_dotprod_expand_fast(const v_int8& a, const v_int8& b, const v_int32& c) +{ + v_int32 zero = v_setzero_s32(); + return vadd(vwredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()) , vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} + +// 16 >> 64 +inline v_uint64 v_dotprod_expand_fast(const v_uint16& a, const v_uint16& b) +{ + v_uint64 zero = v_setzero_u64(); + return vwredsumu(zero, vwmulu(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_uint64 v_dotprod_expand_fast(const v_uint16& a, const v_uint16& b, const v_uint64& c) +{ + v_uint64 zero = v_setzero_u64(); + return vadd(vwredsumu(zero, vwmulu(a, b, VTraits::vlanes()), zero, VTraits::vlanes()), vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} +inline v_int64 v_dotprod_expand_fast(const v_int16& a, const v_int16& b) +{ + v_int64 zero = v_setzero_s64(); + return vwredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()); +} +inline v_int64 v_dotprod_expand_fast(const v_int16& a, const v_int16& b, const v_int64& c) +{ + v_int64 zero = v_setzero_s64(); + return vadd(vwredsum(zero, vwmul(a, b, VTraits::vlanes()), zero, VTraits::vlanes()), vredsum(zero, c, zero, VTraits::vlanes()), VTraits::vlanes()); +} + +// 32 >> 64f +#if CV_SIMD_SCALABLE_64F +inline v_float64 v_dotprod_expand_fast(const v_int32& a, const v_int32& b) +{ return v_cvt_f64(v_dotprod_fast(a, b)); } +inline v_float64 v_dotprod_expand_fast(const v_int32& a, const v_int32& b, const v_float64& c) +{ return v_add(v_dotprod_expand_fast(a, b) , c); } +#endif + +// TODO: only 128 bit now. +inline v_float32 v_matmul(const v_float32& v, const v_float32& m0, + const v_float32& m1, const v_float32& m2, + const v_float32& m3) +{ + vfloat32m1_t res; + res = vfmul_vf_f32m1(m0, v_extract_n(v, 0), VTraits::vlanes()); + res = vfmacc_vf_f32m1(res, v_extract_n(v, 1), m1, VTraits::vlanes()); + res = vfmacc_vf_f32m1(res, v_extract_n(v, 2), m2, VTraits::vlanes()); + res = vfmacc_vf_f32m1(res, v_extract_n(v, 3), m3, VTraits::vlanes()); + return res; +} + +// TODO: only 128 bit now. +inline v_float32 v_matmuladd(const v_float32& v, const v_float32& m0, + const v_float32& m1, const v_float32& m2, + const v_float32& a) +{ + vfloat32m1_t res = vfmul_vf_f32m1(m0, v_extract_n(v,0), VTraits::vlanes()); + res = vfmacc_vf_f32m1(res, v_extract_n(v,1), m1, VTraits::vlanes()); + res = vfmacc_vf_f32m1(res, v_extract_n(v,2), m2, VTraits::vlanes()); + return vfadd(res, a, VTraits::vlanes()); +} + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +} //namespace cv + +#endif //OPENCV_HAL_INTRIN_RVV_SCALABLE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse.hpp new file mode 100644 index 0000000..9d17f71 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse.hpp @@ -0,0 +1,3468 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_SSE_HPP +#define OPENCV_HAL_SSE_HPP + +#include +#include "opencv2/core/utility.hpp" + +#define CV_SIMD128 1 +#define CV_SIMD128_64F 1 +#define CV_SIMD128_FP16 0 // no native operations with FP16 type. + +namespace cv +{ + +//! @cond IGNORED + +// +// Compilation troubleshooting: +// - MSVC: error C2719: 'a': formal parameter with requested alignment of 16 won't be aligned +// Replace parameter declaration to const reference: +// -v_int32x4 a +// +const v_int32x4& a +// + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +///////// Types //////////// + +struct v_uint8x16 +{ + typedef uchar lane_type; + typedef __m128i vector_type; + enum { nlanes = 16 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_uint8x16() {} + explicit v_uint8x16(__m128i v) : val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + val = _mm_setr_epi8((char)v0, (char)v1, (char)v2, (char)v3, + (char)v4, (char)v5, (char)v6, (char)v7, + (char)v8, (char)v9, (char)v10, (char)v11, + (char)v12, (char)v13, (char)v14, (char)v15); + } + + uchar get0() const + { + return (uchar)_mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + typedef __m128i vector_type; + enum { nlanes = 16 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_int8x16() {} + explicit v_int8x16(__m128i v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + val = _mm_setr_epi8((char)v0, (char)v1, (char)v2, (char)v3, + (char)v4, (char)v5, (char)v6, (char)v7, + (char)v8, (char)v9, (char)v10, (char)v11, + (char)v12, (char)v13, (char)v14, (char)v15); + } + + schar get0() const + { + return (schar)_mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + typedef __m128i vector_type; + enum { nlanes = 8 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_uint16x8() {} + explicit v_uint16x8(__m128i v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + val = _mm_setr_epi16((short)v0, (short)v1, (short)v2, (short)v3, + (short)v4, (short)v5, (short)v6, (short)v7); + } + + ushort get0() const + { + return (ushort)_mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + typedef __m128i vector_type; + enum { nlanes = 8 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_int16x8() {} + explicit v_int16x8(__m128i v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + val = _mm_setr_epi16((short)v0, (short)v1, (short)v2, (short)v3, + (short)v4, (short)v5, (short)v6, (short)v7); + } + + short get0() const + { + return (short)_mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + typedef __m128i vector_type; + enum { nlanes = 4 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_uint32x4() {} + explicit v_uint32x4(__m128i v) : val(v) {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + val = _mm_setr_epi32((int)v0, (int)v1, (int)v2, (int)v3); + } + + unsigned get0() const + { + return (unsigned)_mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + typedef __m128i vector_type; + enum { nlanes = 4 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_int32x4() {} + explicit v_int32x4(__m128i v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + val = _mm_setr_epi32(v0, v1, v2, v3); + } + + int get0() const + { + return _mm_cvtsi128_si32(val); + } + + __m128i val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + typedef __m128 vector_type; + enum { nlanes = 4 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_float32x4() {} + explicit v_float32x4(__m128 v) : val(v) {} + v_float32x4(float v0, float v1, float v2, float v3) + { + val = _mm_setr_ps(v0, v1, v2, v3); + } + + float get0() const + { + return _mm_cvtss_f32(val); + } + + __m128 val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + typedef __m128i vector_type; + enum { nlanes = 2 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_uint64x2() {} + explicit v_uint64x2(__m128i v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { +#if defined(_MSC_VER) && _MSC_VER >= 1920/*MSVS 2019*/ && defined(_M_X64) && !defined(__clang__) + val = _mm_setr_epi64x((int64_t)v0, (int64_t)v1); +#elif defined(__GNUC__) + val = _mm_setr_epi64((__m64)v0, (__m64)v1); +#else + val = _mm_setr_epi32((int)v0, (int)(v0 >> 32), (int)v1, (int)(v1 >> 32)); +#endif + } + + uint64 get0() const + { + #if !defined(__x86_64__) && !defined(_M_X64) + int a = _mm_cvtsi128_si32(val); + int b = _mm_cvtsi128_si32(_mm_srli_epi64(val, 32)); + return (unsigned)a | ((uint64)(unsigned)b << 32); + #else + return (uint64)_mm_cvtsi128_si64(val); + #endif + } + + __m128i val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + typedef __m128i vector_type; + enum { nlanes = 2 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_int64x2() {} + explicit v_int64x2(__m128i v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { +#if defined(_MSC_VER) && _MSC_VER >= 1920/*MSVS 2019*/ && defined(_M_X64) && !defined(__clang__) + val = _mm_setr_epi64x((int64_t)v0, (int64_t)v1); +#elif defined(__GNUC__) + val = _mm_setr_epi64((__m64)v0, (__m64)v1); +#else + val = _mm_setr_epi32((int)v0, (int)(v0 >> 32), (int)v1, (int)(v1 >> 32)); +#endif + } + + int64 get0() const + { + #if !defined(__x86_64__) && !defined(_M_X64) + int a = _mm_cvtsi128_si32(val); + int b = _mm_cvtsi128_si32(_mm_srli_epi64(val, 32)); + return (int64)((unsigned)a | ((uint64)(unsigned)b << 32)); + #else + return _mm_cvtsi128_si64(val); + #endif + } + + __m128i val; +}; + +struct v_float64x2 +{ + typedef double lane_type; + typedef __m128d vector_type; + enum { nlanes = 2 }; + + /* coverity[uninit_ctor]: suppress warning */ + v_float64x2() {} + explicit v_float64x2(__m128d v) : val(v) {} + v_float64x2(double v0, double v1) + { + val = _mm_setr_pd(v0, v1); + } + + double get0() const + { + return _mm_cvtsd_f64(val); + } + + __m128d val; +}; + +namespace hal_sse_internal +{ + template + to_sse_type v_sse_reinterpret_as(const from_sse_type& val); + +#define OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(to_sse_type, from_sse_type, sse_cast_intrin) \ + template<> inline \ + to_sse_type v_sse_reinterpret_as(const from_sse_type& a) \ + { return sse_cast_intrin(a); } + + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128i, __m128i, OPENCV_HAL_NOP) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128i, __m128, _mm_castps_si128) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128i, __m128d, _mm_castpd_si128) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128, __m128i, _mm_castsi128_ps) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128, __m128, OPENCV_HAL_NOP) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128, __m128d, _mm_castpd_ps) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128d, __m128i, _mm_castsi128_pd) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128d, __m128, _mm_castps_pd) + OPENCV_HAL_IMPL_SSE_REINTERPRET_RAW(__m128d, __m128d, OPENCV_HAL_NOP) +} + +#define OPENCV_HAL_IMPL_SSE_INITVEC(_Tpvec, _Tp, suffix, zsuffix, ssuffix, _Tps, cast) \ +inline _Tpvec v_setzero_##suffix() { return _Tpvec(_mm_setzero_##zsuffix()); } \ +inline _Tpvec v_setall_##suffix(_Tp v) { return _Tpvec(_mm_set1_##ssuffix((_Tps)v)); } \ +template inline _Tpvec v_reinterpret_as_##suffix(const _Tpvec0& a) \ +{ return _Tpvec(cast(a.val)); } + +OPENCV_HAL_IMPL_SSE_INITVEC(v_uint8x16, uchar, u8, si128, epi8, schar, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_int8x16, schar, s8, si128, epi8, schar, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_uint16x8, ushort, u16, si128, epi16, short, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_int16x8, short, s16, si128, epi16, short, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_uint32x4, unsigned, u32, si128, epi32, int, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_int32x4, int, s32, si128, epi32, int, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_INITVEC(v_float32x4, float, f32, ps, ps, float, _mm_castsi128_ps) +OPENCV_HAL_IMPL_SSE_INITVEC(v_float64x2, double, f64, pd, pd, double, _mm_castsi128_pd) + +inline v_uint64x2 v_setzero_u64() { return v_uint64x2(_mm_setzero_si128()); } +inline v_int64x2 v_setzero_s64() { return v_int64x2(_mm_setzero_si128()); } +inline v_uint64x2 v_setall_u64(uint64 val) { return v_uint64x2(val, val); } +inline v_int64x2 v_setall_s64(int64 val) { return v_int64x2(val, val); } + +template inline +v_uint64x2 v_reinterpret_as_u64(const _Tpvec& a) { return v_uint64x2(a.val); } +template inline +v_int64x2 v_reinterpret_as_s64(const _Tpvec& a) { return v_int64x2(a.val); } +inline v_float32x4 v_reinterpret_as_f32(const v_uint64x2& a) +{ return v_float32x4(_mm_castsi128_ps(a.val)); } +inline v_float32x4 v_reinterpret_as_f32(const v_int64x2& a) +{ return v_float32x4(_mm_castsi128_ps(a.val)); } +inline v_float64x2 v_reinterpret_as_f64(const v_uint64x2& a) +{ return v_float64x2(_mm_castsi128_pd(a.val)); } +inline v_float64x2 v_reinterpret_as_f64(const v_int64x2& a) +{ return v_float64x2(_mm_castsi128_pd(a.val)); } + +#define OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(_Tpvec, suffix) \ +inline _Tpvec v_reinterpret_as_##suffix(const v_float32x4& a) \ +{ return _Tpvec(_mm_castps_si128(a.val)); } \ +inline _Tpvec v_reinterpret_as_##suffix(const v_float64x2& a) \ +{ return _Tpvec(_mm_castpd_si128(a.val)); } + +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_uint8x16, u8) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_int8x16, s8) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_uint16x8, u16) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_int16x8, s16) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_uint32x4, u32) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_int32x4, s32) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_uint64x2, u64) +OPENCV_HAL_IMPL_SSE_INIT_FROM_FLT(v_int64x2, s64) + +inline v_float32x4 v_reinterpret_as_f32(const v_float32x4& a) {return a; } +inline v_float64x2 v_reinterpret_as_f64(const v_float64x2& a) {return a; } +inline v_float32x4 v_reinterpret_as_f32(const v_float64x2& a) {return v_float32x4(_mm_castpd_ps(a.val)); } +inline v_float64x2 v_reinterpret_as_f64(const v_float32x4& a) {return v_float64x2(_mm_castps_pd(a.val)); } + +//////////////// PACK /////////////// +inline v_uint8x16 v_pack(const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i delta = _mm_set1_epi16(255); + return v_uint8x16(_mm_packus_epi16(_mm_subs_epu16(a.val, _mm_subs_epu16(a.val, delta)), + _mm_subs_epu16(b.val, _mm_subs_epu16(b.val, delta)))); +} + +inline void v_pack_store(uchar* ptr, const v_uint16x8& a) +{ + __m128i delta = _mm_set1_epi16(255); + __m128i a1 = _mm_subs_epu16(a.val, _mm_subs_epu16(a.val, delta)); + _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi16(a1, a1)); +} + +inline v_uint8x16 v_pack_u(const v_int16x8& a, const v_int16x8& b) +{ return v_uint8x16(_mm_packus_epi16(a.val, b.val)); } + +inline void v_pack_u_store(uchar* ptr, const v_int16x8& a) +{ _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi16(a.val, a.val)); } + +template inline +v_uint8x16 v_rshr_pack(const v_uint16x8& a, const v_uint16x8& b) +{ + // we assume that n > 0, and so the shifted 16-bit values can be treated as signed numbers. + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + return v_uint8x16(_mm_packus_epi16(_mm_srli_epi16(_mm_adds_epu16(a.val, delta), n), + _mm_srli_epi16(_mm_adds_epu16(b.val, delta), n))); +} + +template inline +void v_rshr_pack_store(uchar* ptr, const v_uint16x8& a) +{ + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + __m128i a1 = _mm_srli_epi16(_mm_adds_epu16(a.val, delta), n); + _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi16(a1, a1)); +} + +template inline +v_uint8x16 v_rshr_pack_u(const v_int16x8& a, const v_int16x8& b) +{ + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + return v_uint8x16(_mm_packus_epi16(_mm_srai_epi16(_mm_adds_epi16(a.val, delta), n), + _mm_srai_epi16(_mm_adds_epi16(b.val, delta), n))); +} + +template inline +void v_rshr_pack_u_store(uchar* ptr, const v_int16x8& a) +{ + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + __m128i a1 = _mm_srai_epi16(_mm_adds_epi16(a.val, delta), n); + _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi16(a1, a1)); +} + +inline v_int8x16 v_pack(const v_int16x8& a, const v_int16x8& b) +{ return v_int8x16(_mm_packs_epi16(a.val, b.val)); } + +inline void v_pack_store(schar* ptr, const v_int16x8& a) +{ _mm_storel_epi64((__m128i*)ptr, _mm_packs_epi16(a.val, a.val)); } + +template inline +v_int8x16 v_rshr_pack(const v_int16x8& a, const v_int16x8& b) +{ + // we assume that n > 0, and so the shifted 16-bit values can be treated as signed numbers. + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + return v_int8x16(_mm_packs_epi16(_mm_srai_epi16(_mm_adds_epi16(a.val, delta), n), + _mm_srai_epi16(_mm_adds_epi16(b.val, delta), n))); +} +template inline +void v_rshr_pack_store(schar* ptr, const v_int16x8& a) +{ + // we assume that n > 0, and so the shifted 16-bit values can be treated as signed numbers. + __m128i delta = _mm_set1_epi16((short)(1 << (n-1))); + __m128i a1 = _mm_srai_epi16(_mm_adds_epi16(a.val, delta), n); + _mm_storel_epi64((__m128i*)ptr, _mm_packs_epi16(a1, a1)); +} + + +// byte-wise "mask ? a : b" +inline __m128i v_select_si128(__m128i mask, __m128i a, __m128i b) +{ +#if CV_SSE4_1 + return _mm_blendv_epi8(b, a, mask); +#else + return _mm_xor_si128(b, _mm_and_si128(_mm_xor_si128(a, b), mask)); +#endif +} + +inline v_uint16x8 v_pack(const v_uint32x4& a, const v_uint32x4& b) +{ return v_uint16x8(_v128_packs_epu32(a.val, b.val)); } + +inline void v_pack_store(ushort* ptr, const v_uint32x4& a) +{ + __m128i z = _mm_setzero_si128(), maxval32 = _mm_set1_epi32(65535), delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(v_select_si128(_mm_cmpgt_epi32(z, a.val), maxval32, a.val), delta32); + __m128i r = _mm_packs_epi32(a1, a1); + _mm_storel_epi64((__m128i*)ptr, _mm_sub_epi16(r, _mm_set1_epi16(-32768))); +} + +template inline +v_uint16x8 v_rshr_pack(const v_uint32x4& a, const v_uint32x4& b) +{ + __m128i delta = _mm_set1_epi32(1 << (n-1)), delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(_mm_srli_epi32(_mm_add_epi32(a.val, delta), n), delta32); + __m128i b1 = _mm_sub_epi32(_mm_srli_epi32(_mm_add_epi32(b.val, delta), n), delta32); + return v_uint16x8(_mm_sub_epi16(_mm_packs_epi32(a1, b1), _mm_set1_epi16(-32768))); +} + +template inline +void v_rshr_pack_store(ushort* ptr, const v_uint32x4& a) +{ + __m128i delta = _mm_set1_epi32(1 << (n-1)), delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(_mm_srli_epi32(_mm_add_epi32(a.val, delta), n), delta32); + __m128i a2 = _mm_sub_epi16(_mm_packs_epi32(a1, a1), _mm_set1_epi16(-32768)); + _mm_storel_epi64((__m128i*)ptr, a2); +} + +inline v_uint16x8 v_pack_u(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + return v_uint16x8(_mm_packus_epi32(a.val, b.val)); +#else + __m128i delta32 = _mm_set1_epi32(32768); + + // preliminary saturate negative values to zero + __m128i a1 = _mm_and_si128(a.val, _mm_cmpgt_epi32(a.val, _mm_set1_epi32(0))); + __m128i b1 = _mm_and_si128(b.val, _mm_cmpgt_epi32(b.val, _mm_set1_epi32(0))); + + __m128i r = _mm_packs_epi32(_mm_sub_epi32(a1, delta32), _mm_sub_epi32(b1, delta32)); + return v_uint16x8(_mm_sub_epi16(r, _mm_set1_epi16(-32768))); +#endif +} + +inline void v_pack_u_store(ushort* ptr, const v_int32x4& a) +{ +#if CV_SSE4_1 + _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi32(a.val, a.val)); +#else + __m128i delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(a.val, delta32); + __m128i r = _mm_sub_epi16(_mm_packs_epi32(a1, a1), _mm_set1_epi16(-32768)); + _mm_storel_epi64((__m128i*)ptr, r); +#endif +} + +template inline +v_uint16x8 v_rshr_pack_u(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + __m128i delta = _mm_set1_epi32(1 << (n - 1)); + return v_uint16x8(_mm_packus_epi32(_mm_srai_epi32(_mm_add_epi32(a.val, delta), n), + _mm_srai_epi32(_mm_add_epi32(b.val, delta), n))); +#else + __m128i delta = _mm_set1_epi32(1 << (n-1)), delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(_mm_srai_epi32(_mm_add_epi32(a.val, delta), n), delta32); + __m128i a2 = _mm_sub_epi16(_mm_packs_epi32(a1, a1), _mm_set1_epi16(-32768)); + __m128i b1 = _mm_sub_epi32(_mm_srai_epi32(_mm_add_epi32(b.val, delta), n), delta32); + __m128i b2 = _mm_sub_epi16(_mm_packs_epi32(b1, b1), _mm_set1_epi16(-32768)); + return v_uint16x8(_mm_unpacklo_epi64(a2, b2)); +#endif +} + +template inline +void v_rshr_pack_u_store(ushort* ptr, const v_int32x4& a) +{ +#if CV_SSE4_1 + __m128i delta = _mm_set1_epi32(1 << (n - 1)); + __m128i a1 = _mm_srai_epi32(_mm_add_epi32(a.val, delta), n); + _mm_storel_epi64((__m128i*)ptr, _mm_packus_epi32(a1, a1)); +#else + __m128i delta = _mm_set1_epi32(1 << (n-1)), delta32 = _mm_set1_epi32(32768); + __m128i a1 = _mm_sub_epi32(_mm_srai_epi32(_mm_add_epi32(a.val, delta), n), delta32); + __m128i a2 = _mm_sub_epi16(_mm_packs_epi32(a1, a1), _mm_set1_epi16(-32768)); + _mm_storel_epi64((__m128i*)ptr, a2); +#endif +} + +inline v_int16x8 v_pack(const v_int32x4& a, const v_int32x4& b) +{ return v_int16x8(_mm_packs_epi32(a.val, b.val)); } + +inline void v_pack_store(short* ptr, const v_int32x4& a) +{ + _mm_storel_epi64((__m128i*)ptr, _mm_packs_epi32(a.val, a.val)); +} + +template inline +v_int16x8 v_rshr_pack(const v_int32x4& a, const v_int32x4& b) +{ + __m128i delta = _mm_set1_epi32(1 << (n-1)); + return v_int16x8(_mm_packs_epi32(_mm_srai_epi32(_mm_add_epi32(a.val, delta), n), + _mm_srai_epi32(_mm_add_epi32(b.val, delta), n))); +} + +template inline +void v_rshr_pack_store(short* ptr, const v_int32x4& a) +{ + __m128i delta = _mm_set1_epi32(1 << (n-1)); + __m128i a1 = _mm_srai_epi32(_mm_add_epi32(a.val, delta), n); + _mm_storel_epi64((__m128i*)ptr, _mm_packs_epi32(a1, a1)); +} + + +// [a0 0 | b0 0] [a1 0 | b1 0] +inline v_uint32x4 v_pack(const v_uint64x2& a, const v_uint64x2& b) +{ + __m128i v0 = _mm_unpacklo_epi32(a.val, b.val); // a0 a1 0 0 + __m128i v1 = _mm_unpackhi_epi32(a.val, b.val); // b0 b1 0 0 + return v_uint32x4(_mm_unpacklo_epi32(v0, v1)); +} + +inline void v_pack_store(unsigned* ptr, const v_uint64x2& a) +{ + __m128i a1 = _mm_shuffle_epi32(a.val, _MM_SHUFFLE(0, 2, 2, 0)); + _mm_storel_epi64((__m128i*)ptr, a1); +} + +// [a0 0 | b0 0] [a1 0 | b1 0] +inline v_int32x4 v_pack(const v_int64x2& a, const v_int64x2& b) +{ + __m128i v0 = _mm_unpacklo_epi32(a.val, b.val); // a0 a1 0 0 + __m128i v1 = _mm_unpackhi_epi32(a.val, b.val); // b0 b1 0 0 + return v_int32x4(_mm_unpacklo_epi32(v0, v1)); +} + +inline void v_pack_store(int* ptr, const v_int64x2& a) +{ + __m128i a1 = _mm_shuffle_epi32(a.val, _MM_SHUFFLE(0, 2, 2, 0)); + _mm_storel_epi64((__m128i*)ptr, a1); +} + +template inline +v_uint32x4 v_rshr_pack(const v_uint64x2& a, const v_uint64x2& b) +{ + uint64 delta = (uint64)1 << (n-1); + v_uint64x2 delta2(delta, delta); + __m128i a1 = _mm_srli_epi64(_mm_add_epi64(a.val, delta2.val), n); + __m128i b1 = _mm_srli_epi64(_mm_add_epi64(b.val, delta2.val), n); + __m128i v0 = _mm_unpacklo_epi32(a1, b1); // a0 a1 0 0 + __m128i v1 = _mm_unpackhi_epi32(a1, b1); // b0 b1 0 0 + return v_uint32x4(_mm_unpacklo_epi32(v0, v1)); +} + +template inline +void v_rshr_pack_store(unsigned* ptr, const v_uint64x2& a) +{ + uint64 delta = (uint64)1 << (n-1); + v_uint64x2 delta2(delta, delta); + __m128i a1 = _mm_srli_epi64(_mm_add_epi64(a.val, delta2.val), n); + __m128i a2 = _mm_shuffle_epi32(a1, _MM_SHUFFLE(0, 2, 2, 0)); + _mm_storel_epi64((__m128i*)ptr, a2); +} + +inline __m128i v_sign_epi64(__m128i a) +{ + return _mm_shuffle_epi32(_mm_srai_epi32(a, 31), _MM_SHUFFLE(3, 3, 1, 1)); // x m0 | x m1 +} + +inline __m128i v_srai_epi64(__m128i a, int imm) +{ + __m128i smask = v_sign_epi64(a); + return _mm_xor_si128(_mm_srli_epi64(_mm_xor_si128(a, smask), imm), smask); +} + +template inline +v_int32x4 v_rshr_pack(const v_int64x2& a, const v_int64x2& b) +{ + int64 delta = (int64)1 << (n-1); + v_int64x2 delta2(delta, delta); + __m128i a1 = v_srai_epi64(_mm_add_epi64(a.val, delta2.val), n); + __m128i b1 = v_srai_epi64(_mm_add_epi64(b.val, delta2.val), n); + __m128i v0 = _mm_unpacklo_epi32(a1, b1); // a0 a1 0 0 + __m128i v1 = _mm_unpackhi_epi32(a1, b1); // b0 b1 0 0 + return v_int32x4(_mm_unpacklo_epi32(v0, v1)); +} + +template inline +void v_rshr_pack_store(int* ptr, const v_int64x2& a) +{ + int64 delta = (int64)1 << (n-1); + v_int64x2 delta2(delta, delta); + __m128i a1 = v_srai_epi64(_mm_add_epi64(a.val, delta2.val), n); + __m128i a2 = _mm_shuffle_epi32(a1, _MM_SHUFFLE(0, 2, 2, 0)); + _mm_storel_epi64((__m128i*)ptr, a2); +} + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + __m128i ab = _mm_packs_epi16(a.val, b.val); + return v_uint8x16(ab); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + __m128i ab = _mm_packs_epi32(a.val, b.val); + __m128i cd = _mm_packs_epi32(c.val, d.val); + return v_uint8x16(_mm_packs_epi16(ab, cd)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + __m128i ab = _mm_packs_epi32(a.val, b.val); + __m128i cd = _mm_packs_epi32(c.val, d.val); + __m128i ef = _mm_packs_epi32(e.val, f.val); + __m128i gh = _mm_packs_epi32(g.val, h.val); + + __m128i abcd = _mm_packs_epi32(ab, cd); + __m128i efgh = _mm_packs_epi32(ef, gh); + return v_uint8x16(_mm_packs_epi16(abcd, efgh)); +} + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + __m128 v0 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(0, 0, 0, 0)), m0.val); + __m128 v1 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(1, 1, 1, 1)), m1.val); + __m128 v2 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(2, 2, 2, 2)), m2.val); + __m128 v3 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(3, 3, 3, 3)), m3.val); + + return v_float32x4(_mm_add_ps(_mm_add_ps(v0, v1), _mm_add_ps(v2, v3))); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + __m128 v0 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(0, 0, 0, 0)), m0.val); + __m128 v1 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(1, 1, 1, 1)), m1.val); + __m128 v2 = _mm_mul_ps(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE(2, 2, 2, 2)), m2.val); + + return v_float32x4(_mm_add_ps(_mm_add_ps(v0, v1), _mm_add_ps(v2, a.val))); +} + +#define OPENCV_HAL_IMPL_SSE_BIN_OP(bin_op, _Tpvec, intrin) \ + inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ + { \ + return _Tpvec(intrin(a.val, b.val)); \ + } \ + inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ + { \ + a.val = intrin(a.val, b.val); \ + return a; \ + } + +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_uint8x16, _mm_adds_epu8) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_uint8x16, _mm_subs_epu8) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_int8x16, _mm_adds_epi8) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_int8x16, _mm_subs_epi8) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_uint16x8, _mm_adds_epu16) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_uint16x8, _mm_subs_epu16) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_int16x8, _mm_adds_epi16) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_int16x8, _mm_subs_epi16) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_uint32x4, _mm_add_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_uint32x4, _mm_sub_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(*, v_uint32x4, _v128_mullo_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_int32x4, _mm_add_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_int32x4, _mm_sub_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(*, v_int32x4, _v128_mullo_epi32) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_float32x4, _mm_add_ps) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_float32x4, _mm_sub_ps) +OPENCV_HAL_IMPL_SSE_BIN_OP(*, v_float32x4, _mm_mul_ps) +OPENCV_HAL_IMPL_SSE_BIN_OP(/, v_float32x4, _mm_div_ps) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_float64x2, _mm_add_pd) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_float64x2, _mm_sub_pd) +OPENCV_HAL_IMPL_SSE_BIN_OP(*, v_float64x2, _mm_mul_pd) +OPENCV_HAL_IMPL_SSE_BIN_OP(/, v_float64x2, _mm_div_pd) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_uint64x2, _mm_add_epi64) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_uint64x2, _mm_sub_epi64) +OPENCV_HAL_IMPL_SSE_BIN_OP(+, v_int64x2, _mm_add_epi64) +OPENCV_HAL_IMPL_SSE_BIN_OP(-, v_int64x2, _mm_sub_epi64) + +// saturating multiply 8-bit, 16-bit +#define OPENCV_HAL_IMPL_SSE_MUL_SAT(_Tpvec, _Tpwvec) \ + inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ + { \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ + } \ + inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ + { a = a * b; return a; } + +OPENCV_HAL_IMPL_SSE_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_SSE_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_SSE_MUL_SAT(v_uint16x8, v_uint32x4) +OPENCV_HAL_IMPL_SSE_MUL_SAT(v_int16x8, v_int32x4) + +// Multiply and expand +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + v_uint16x8 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + v_int16x8 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + __m128i v0 = _mm_mullo_epi16(a.val, b.val); + __m128i v1 = _mm_mulhi_epi16(a.val, b.val); + c.val = _mm_unpacklo_epi16(v0, v1); + d.val = _mm_unpackhi_epi16(v0, v1); +} + +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + __m128i v0 = _mm_mullo_epi16(a.val, b.val); + __m128i v1 = _mm_mulhi_epu16(a.val, b.val); + c.val = _mm_unpacklo_epi16(v0, v1); + d.val = _mm_unpackhi_epi16(v0, v1); +} + +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + __m128i c0 = _mm_mul_epu32(a.val, b.val); + __m128i c1 = _mm_mul_epu32(_mm_srli_epi64(a.val, 32), _mm_srli_epi64(b.val, 32)); + c.val = _mm_unpacklo_epi64(c0, c1); + d.val = _mm_unpackhi_epi64(c0, c1); +} + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) { return v_int16x8(_mm_mulhi_epi16(a.val, b.val)); } +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) { return v_uint16x8(_mm_mulhi_epu16(a.val, b.val)); } + +//////// Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ return v_int32x4(_mm_madd_epi16(a.val, b.val)); } +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b) + c; } + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + __m128i even = _mm_mul_epi32(a.val, b.val); + __m128i odd = _mm_mul_epi32(_mm_srli_epi64(a.val, 32), _mm_srli_epi64(b.val, 32)); + return v_int64x2(_mm_add_epi64(even, odd)); +#else + __m128i even_u = _mm_mul_epu32(a.val, b.val); + __m128i odd_u = _mm_mul_epu32(_mm_srli_epi64(a.val, 32), _mm_srli_epi64(b.val, 32)); + // convert unsigned to signed high multiplication (from: Agner Fog(veclib) and H S Warren: Hacker's delight, 2003, p. 132) + __m128i a_sign = _mm_srai_epi32(a.val, 31); + __m128i b_sign = _mm_srai_epi32(b.val, 31); + // |x * sign of x + __m128i axb = _mm_and_si128(a.val, b_sign); + __m128i bxa = _mm_and_si128(b.val, a_sign); + // sum of sign corrections + __m128i ssum = _mm_add_epi32(bxa, axb); + __m128i even_ssum = _mm_slli_epi64(ssum, 32); + __m128i odd_ssum = _mm_and_si128(ssum, _mm_set_epi32(-1, 0, -1, 0)); + // convert to signed and prod + return v_int64x2(_mm_add_epi64(_mm_sub_epi64(even_u, even_ssum), _mm_sub_epi64(odd_u, odd_ssum))); +#endif +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b) + c; } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i a0 = _mm_srli_epi16(_mm_slli_si128(a.val, 1), 8); // even + __m128i a1 = _mm_srli_epi16(a.val, 8); // odd + __m128i b0 = _mm_srli_epi16(_mm_slli_si128(b.val, 1), 8); + __m128i b1 = _mm_srli_epi16(b.val, 8); + __m128i p0 = _mm_madd_epi16(a0, b0); + __m128i p1 = _mm_madd_epi16(a1, b1); + return v_uint32x4(_mm_add_epi32(p0, p1)); +} +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + __m128i a0 = _mm_srai_epi16(_mm_slli_si128(a.val, 1), 8); // even + __m128i a1 = _mm_srai_epi16(a.val, 8); // odd + __m128i b0 = _mm_srai_epi16(_mm_slli_si128(b.val, 1), 8); + __m128i b1 = _mm_srai_epi16(b.val, 8); + __m128i p0 = _mm_madd_epi16(a0, b0); + __m128i p1 = _mm_madd_epi16(a1, b1); + return v_int32x4(_mm_add_epi32(p0, p1)); +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + v_uint32x4 c, d; + v_mul_expand(a, b, c, d); + + v_uint64x2 c0, c1, d0, d1; + v_expand(c, c0, c1); + v_expand(d, d0, d1); + + c0 += c1; d0 += d1; + return v_uint64x2(_mm_add_epi64( + _mm_unpacklo_epi64(c0.val, d0.val), + _mm_unpackhi_epi64(c0.val, d0.val) + )); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + v_int32x4 prod = v_dotprod(a, b); + v_int64x2 c, d; + v_expand(prod, c, d); + return v_int64x2(_mm_add_epi64( + _mm_unpacklo_epi64(c.val, d.val), + _mm_unpackhi_epi64(c.val, d.val) + )); +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + return v_cvt_f64(v_dotprod(a, b)); +#else + v_float64x2 c = v_cvt_f64(a) * v_cvt_f64(b); + v_float64x2 d = v_cvt_f64_high(a) * v_cvt_f64_high(b); + + return v_float64x2(_mm_add_pd( + _mm_unpacklo_pd(c.val, d.val), + _mm_unpackhi_pd(c.val, d.val) + )); +#endif +} +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod(a, b); } +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b) + c; } + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod(a, b); } +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod_fast(a, b) + c; } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i a0 = v_expand_low(a).val; + __m128i a1 = v_expand_high(a).val; + __m128i b0 = v_expand_low(b).val; + __m128i b1 = v_expand_high(b).val; + __m128i p0 = _mm_madd_epi16(a0, b0); + __m128i p1 = _mm_madd_epi16(a1, b1); + return v_uint32x4(_mm_add_epi32(p0, p1)); +} +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ +#if CV_SSE4_1 + __m128i a0 = _mm_cvtepi8_epi16(a.val); + __m128i a1 = v_expand_high(a).val; + __m128i b0 = _mm_cvtepi8_epi16(b.val); + __m128i b1 = v_expand_high(b).val; + __m128i p0 = _mm_madd_epi16(a0, b0); + __m128i p1 = _mm_madd_epi16(a1, b1); + return v_int32x4(_mm_add_epi32(p0, p1)); +#else + return v_dotprod_expand(a, b); +#endif +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ + v_uint32x4 c, d; + v_mul_expand(a, b, c, d); + + v_uint64x2 c0, c1, d0, d1; + v_expand(c, c0, c1); + v_expand(d, d0, d1); + + c0 += c1; d0 += d1; + return c0 + d0; +} +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + v_int32x4 prod = v_dotprod(a, b); + v_int64x2 c, d; + v_expand(prod, c, d); + return c + d; +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 32 >> 64f +v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c); +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_fma(v_cvt_f64(a), v_cvt_f64(b), v_cvt_f64_high(a) * v_cvt_f64_high(b)); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_fma(v_cvt_f64(a), v_cvt_f64(b), v_fma(v_cvt_f64_high(a), v_cvt_f64_high(b), c)); } + +#define OPENCV_HAL_IMPL_SSE_LOGIC_OP(_Tpvec, suffix, not_const) \ + OPENCV_HAL_IMPL_SSE_BIN_OP(&, _Tpvec, _mm_and_##suffix) \ + OPENCV_HAL_IMPL_SSE_BIN_OP(|, _Tpvec, _mm_or_##suffix) \ + OPENCV_HAL_IMPL_SSE_BIN_OP(^, _Tpvec, _mm_xor_##suffix) \ + inline _Tpvec operator ~ (const _Tpvec& a) \ + { \ + return _Tpvec(_mm_xor_##suffix(a.val, not_const)); \ + } + +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_uint8x16, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_int8x16, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_uint16x8, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_int16x8, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_uint32x4, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_int32x4, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_uint64x2, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_int64x2, si128, _mm_set1_epi32(-1)) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_float32x4, ps, _mm_castsi128_ps(_mm_set1_epi32(-1))) +OPENCV_HAL_IMPL_SSE_LOGIC_OP(v_float64x2, pd, _mm_castsi128_pd(_mm_set1_epi32(-1))) + +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ return v_float32x4(_mm_sqrt_ps(x.val)); } + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + const __m128 _0_5 = _mm_set1_ps(0.5f), _1_5 = _mm_set1_ps(1.5f); + __m128 t = x.val; + __m128 h = _mm_mul_ps(t, _0_5); + t = _mm_rsqrt_ps(t); + t = _mm_mul_ps(t, _mm_sub_ps(_1_5, _mm_mul_ps(_mm_mul_ps(t, t), h))); + return v_float32x4(t); +} + +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ return v_float64x2(_mm_sqrt_pd(x.val)); } + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + const __m128d v_1 = _mm_set1_pd(1.); + return v_float64x2(_mm_div_pd(v_1, _mm_sqrt_pd(x.val))); +} + +#define OPENCV_HAL_IMPL_SSE_ABS_INT_FUNC(_Tpuvec, _Tpsvec, func, suffix, subWidth) \ +inline _Tpuvec v_abs(const _Tpsvec& x) \ +{ return _Tpuvec(_mm_##func##_ep##suffix(x.val, _mm_sub_ep##subWidth(_mm_setzero_si128(), x.val))); } + +OPENCV_HAL_IMPL_SSE_ABS_INT_FUNC(v_uint8x16, v_int8x16, min, u8, i8) +OPENCV_HAL_IMPL_SSE_ABS_INT_FUNC(v_uint16x8, v_int16x8, max, i16, i16) +inline v_uint32x4 v_abs(const v_int32x4& x) +{ + __m128i s = _mm_srli_epi32(x.val, 31); + __m128i f = _mm_srai_epi32(x.val, 31); + return v_uint32x4(_mm_add_epi32(_mm_xor_si128(x.val, f), s)); +} +inline v_float32x4 v_abs(const v_float32x4& x) +{ return v_float32x4(_mm_and_ps(x.val, _mm_castsi128_ps(_mm_set1_epi32(0x7fffffff)))); } +inline v_float64x2 v_abs(const v_float64x2& x) +{ + return v_float64x2(_mm_and_pd(x.val, + _mm_castsi128_pd(_mm_srli_epi64(_mm_set1_epi32(-1), 1)))); +} + +// TODO: exp, log, sin, cos + +#define OPENCV_HAL_IMPL_SSE_BIN_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint8x16, v_min, _mm_min_epu8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint8x16, v_max, _mm_max_epu8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int16x8, v_min, _mm_min_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int16x8, v_max, _mm_max_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_float32x4, v_min, _mm_min_ps) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_float32x4, v_max, _mm_max_ps) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_float64x2, v_min, _mm_min_pd) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_float64x2, v_max, _mm_max_pd) + +inline v_int8x16 v_min(const v_int8x16& a, const v_int8x16& b) +{ +#if CV_SSE4_1 + return v_int8x16(_mm_min_epi8(a.val, b.val)); +#else + __m128i delta = _mm_set1_epi8((char)-128); + return v_int8x16(_mm_xor_si128(delta, _mm_min_epu8(_mm_xor_si128(a.val, delta), + _mm_xor_si128(b.val, delta)))); +#endif +} +inline v_int8x16 v_max(const v_int8x16& a, const v_int8x16& b) +{ +#if CV_SSE4_1 + return v_int8x16(_mm_max_epi8(a.val, b.val)); +#else + __m128i delta = _mm_set1_epi8((char)-128); + return v_int8x16(_mm_xor_si128(delta, _mm_max_epu8(_mm_xor_si128(a.val, delta), + _mm_xor_si128(b.val, delta)))); +#endif +} +inline v_uint16x8 v_min(const v_uint16x8& a, const v_uint16x8& b) +{ +#if CV_SSE4_1 + return v_uint16x8(_mm_min_epu16(a.val, b.val)); +#else + return v_uint16x8(_mm_subs_epu16(a.val, _mm_subs_epu16(a.val, b.val))); +#endif +} +inline v_uint16x8 v_max(const v_uint16x8& a, const v_uint16x8& b) +{ +#if CV_SSE4_1 + return v_uint16x8(_mm_max_epu16(a.val, b.val)); +#else + return v_uint16x8(_mm_adds_epu16(_mm_subs_epu16(a.val, b.val), b.val)); +#endif +} +inline v_uint32x4 v_min(const v_uint32x4& a, const v_uint32x4& b) +{ +#if CV_SSE4_1 + return v_uint32x4(_mm_min_epu32(a.val, b.val)); +#else + __m128i delta = _mm_set1_epi32((int)0x80000000); + __m128i mask = _mm_cmpgt_epi32(_mm_xor_si128(a.val, delta), _mm_xor_si128(b.val, delta)); + return v_uint32x4(v_select_si128(mask, b.val, a.val)); +#endif +} +inline v_uint32x4 v_max(const v_uint32x4& a, const v_uint32x4& b) +{ +#if CV_SSE4_1 + return v_uint32x4(_mm_max_epu32(a.val, b.val)); +#else + __m128i delta = _mm_set1_epi32((int)0x80000000); + __m128i mask = _mm_cmpgt_epi32(_mm_xor_si128(a.val, delta), _mm_xor_si128(b.val, delta)); + return v_uint32x4(v_select_si128(mask, a.val, b.val)); +#endif +} +inline v_int32x4 v_min(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + return v_int32x4(_mm_min_epi32(a.val, b.val)); +#else + return v_int32x4(v_select_si128(_mm_cmpgt_epi32(a.val, b.val), b.val, a.val)); +#endif +} +inline v_int32x4 v_max(const v_int32x4& a, const v_int32x4& b) +{ +#if CV_SSE4_1 + return v_int32x4(_mm_max_epi32(a.val, b.val)); +#else + return v_int32x4(v_select_si128(_mm_cmpgt_epi32(a.val, b.val), a.val, b.val)); +#endif +} + +#define OPENCV_HAL_IMPL_SSE_INT_CMP_OP(_Tpuvec, _Tpsvec, suffix, sbit) \ +inline _Tpuvec operator == (const _Tpuvec& a, const _Tpuvec& b) \ +{ return _Tpuvec(_mm_cmpeq_##suffix(a.val, b.val)); } \ +inline _Tpuvec operator != (const _Tpuvec& a, const _Tpuvec& b) \ +{ \ + __m128i not_mask = _mm_set1_epi32(-1); \ + return _Tpuvec(_mm_xor_si128(_mm_cmpeq_##suffix(a.val, b.val), not_mask)); \ +} \ +inline _Tpsvec operator == (const _Tpsvec& a, const _Tpsvec& b) \ +{ return _Tpsvec(_mm_cmpeq_##suffix(a.val, b.val)); } \ +inline _Tpsvec operator != (const _Tpsvec& a, const _Tpsvec& b) \ +{ \ + __m128i not_mask = _mm_set1_epi32(-1); \ + return _Tpsvec(_mm_xor_si128(_mm_cmpeq_##suffix(a.val, b.val), not_mask)); \ +} \ +inline _Tpuvec operator < (const _Tpuvec& a, const _Tpuvec& b) \ +{ \ + __m128i smask = _mm_set1_##suffix(sbit); \ + return _Tpuvec(_mm_cmpgt_##suffix(_mm_xor_si128(b.val, smask), _mm_xor_si128(a.val, smask))); \ +} \ +inline _Tpuvec operator > (const _Tpuvec& a, const _Tpuvec& b) \ +{ \ + __m128i smask = _mm_set1_##suffix(sbit); \ + return _Tpuvec(_mm_cmpgt_##suffix(_mm_xor_si128(a.val, smask), _mm_xor_si128(b.val, smask))); \ +} \ +inline _Tpuvec operator <= (const _Tpuvec& a, const _Tpuvec& b) \ +{ \ + __m128i smask = _mm_set1_##suffix(sbit); \ + __m128i not_mask = _mm_set1_epi32(-1); \ + __m128i res = _mm_cmpgt_##suffix(_mm_xor_si128(a.val, smask), _mm_xor_si128(b.val, smask)); \ + return _Tpuvec(_mm_xor_si128(res, not_mask)); \ +} \ +inline _Tpuvec operator >= (const _Tpuvec& a, const _Tpuvec& b) \ +{ \ + __m128i smask = _mm_set1_##suffix(sbit); \ + __m128i not_mask = _mm_set1_epi32(-1); \ + __m128i res = _mm_cmpgt_##suffix(_mm_xor_si128(b.val, smask), _mm_xor_si128(a.val, smask)); \ + return _Tpuvec(_mm_xor_si128(res, not_mask)); \ +} \ +inline _Tpsvec operator < (const _Tpsvec& a, const _Tpsvec& b) \ +{ \ + return _Tpsvec(_mm_cmpgt_##suffix(b.val, a.val)); \ +} \ +inline _Tpsvec operator > (const _Tpsvec& a, const _Tpsvec& b) \ +{ \ + return _Tpsvec(_mm_cmpgt_##suffix(a.val, b.val)); \ +} \ +inline _Tpsvec operator <= (const _Tpsvec& a, const _Tpsvec& b) \ +{ \ + __m128i not_mask = _mm_set1_epi32(-1); \ + return _Tpsvec(_mm_xor_si128(_mm_cmpgt_##suffix(a.val, b.val), not_mask)); \ +} \ +inline _Tpsvec operator >= (const _Tpsvec& a, const _Tpsvec& b) \ +{ \ + __m128i not_mask = _mm_set1_epi32(-1); \ + return _Tpsvec(_mm_xor_si128(_mm_cmpgt_##suffix(b.val, a.val), not_mask)); \ +} + +OPENCV_HAL_IMPL_SSE_INT_CMP_OP(v_uint8x16, v_int8x16, epi8, (char)-128) +OPENCV_HAL_IMPL_SSE_INT_CMP_OP(v_uint16x8, v_int16x8, epi16, (short)-32768) +OPENCV_HAL_IMPL_SSE_INT_CMP_OP(v_uint32x4, v_int32x4, epi32, (int)0x80000000) + +#define OPENCV_HAL_IMPL_SSE_FLT_CMP_OP(_Tpvec, suffix) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmpeq_##suffix(a.val, b.val)); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmpneq_##suffix(a.val, b.val)); } \ +inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmplt_##suffix(a.val, b.val)); } \ +inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmpgt_##suffix(a.val, b.val)); } \ +inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmple_##suffix(a.val, b.val)); } \ +inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmpge_##suffix(a.val, b.val)); } + +OPENCV_HAL_IMPL_SSE_FLT_CMP_OP(v_float32x4, ps) +OPENCV_HAL_IMPL_SSE_FLT_CMP_OP(v_float64x2, pd) + +#if CV_SSE4_1 +#define OPENCV_HAL_IMPL_SSE_64BIT_CMP_OP(_Tpvec) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(_mm_cmpeq_epi64(a.val, b.val)); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return ~(a == b); } +#else +#define OPENCV_HAL_IMPL_SSE_64BIT_CMP_OP(_Tpvec) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ __m128i cmp = _mm_cmpeq_epi32(a.val, b.val); \ + return _Tpvec(_mm_and_si128(cmp, _mm_shuffle_epi32(cmp, _MM_SHUFFLE(2, 3, 0, 1)))); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return ~(a == b); } +#endif + +OPENCV_HAL_IMPL_SSE_64BIT_CMP_OP(v_uint64x2) +OPENCV_HAL_IMPL_SSE_64BIT_CMP_OP(v_int64x2) + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return v_float32x4(_mm_cmpord_ps(a.val, a.val)); } +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return v_float64x2(_mm_cmpord_pd(a.val, a.val)); } + +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint8x16, v_add_wrap, _mm_add_epi8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int8x16, v_add_wrap, _mm_add_epi8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint16x8, v_add_wrap, _mm_add_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int16x8, v_add_wrap, _mm_add_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint8x16, v_sub_wrap, _mm_sub_epi8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int8x16, v_sub_wrap, _mm_sub_epi8) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint16x8, v_sub_wrap, _mm_sub_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int16x8, v_sub_wrap, _mm_sub_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_uint16x8, v_mul_wrap, _mm_mullo_epi16) +OPENCV_HAL_IMPL_SSE_BIN_FUNC(v_int16x8, v_mul_wrap, _mm_mullo_epi16) + +inline v_uint8x16 v_mul_wrap(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i ad = _mm_srai_epi16(a.val, 8); + __m128i bd = _mm_srai_epi16(b.val, 8); + __m128i p0 = _mm_mullo_epi16(a.val, b.val); // even + __m128i p1 = _mm_slli_epi16(_mm_mullo_epi16(ad, bd), 8); // odd + const __m128i b01 = _mm_set1_epi32(0xFF00FF00); + return v_uint8x16(_v128_blendv_epi8(p0, p1, b01)); +} +inline v_int8x16 v_mul_wrap(const v_int8x16& a, const v_int8x16& b) +{ + return v_reinterpret_as_s8(v_mul_wrap(v_reinterpret_as_u8(a), v_reinterpret_as_u8(b))); +} + +/** Absolute difference **/ + +inline v_uint8x16 v_absdiff(const v_uint8x16& a, const v_uint8x16& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint16x8 v_absdiff(const v_uint16x8& a, const v_uint16x8& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint32x4 v_absdiff(const v_uint32x4& a, const v_uint32x4& b) +{ return v_max(a, b) - v_min(a, b); } + +inline v_uint8x16 v_absdiff(const v_int8x16& a, const v_int8x16& b) +{ + v_int8x16 d = v_sub_wrap(a, b); + v_int8x16 m = a < b; + return v_reinterpret_as_u8(v_sub_wrap(d ^ m, m)); +} +inline v_uint16x8 v_absdiff(const v_int16x8& a, const v_int16x8& b) +{ + return v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))); +} +inline v_uint32x4 v_absdiff(const v_int32x4& a, const v_int32x4& b) +{ + v_int32x4 d = a - b; + v_int32x4 m = a < b; + return v_reinterpret_as_u32((d ^ m) - m); +} + +/** Saturating absolute difference **/ +inline v_int8x16 v_absdiffs(const v_int8x16& a, const v_int8x16& b) +{ + v_int8x16 d = a - b; + v_int8x16 m = a < b; + return (d ^ m) - m; + } +inline v_int16x8 v_absdiffs(const v_int16x8& a, const v_int16x8& b) +{ return v_max(a, b) - v_min(a, b); } + + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return a * b + c; +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ +#if CV_FMA3 + return v_float32x4(_mm_fmadd_ps(a.val, b.val, c.val)); +#else + return v_float32x4(_mm_add_ps(_mm_mul_ps(a.val, b.val), c.val)); +#endif +} + +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ +#if CV_FMA3 + return v_float64x2(_mm_fmadd_pd(a.val, b.val, c.val)); +#else + return v_float64x2(_mm_add_pd(_mm_mul_pd(a.val, b.val), c.val)); +#endif +} + +#define OPENCV_HAL_IMPL_SSE_MISC_FLT_OP(_Tpvec, _Tp, _Tpreg, suffix, absmask_vec) \ +inline _Tpvec v_absdiff(const _Tpvec& a, const _Tpvec& b) \ +{ \ + _Tpreg absmask = _mm_castsi128_##suffix(absmask_vec); \ + return _Tpvec(_mm_and_##suffix(_mm_sub_##suffix(a.val, b.val), absmask)); \ +} \ +inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ \ + _Tpvec res = v_fma(a, a, b*b); \ + return _Tpvec(_mm_sqrt_##suffix(res.val)); \ +} \ +inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return v_fma(a, a, b*b); \ +} \ +inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ +{ \ + return v_fma(a, b, c); \ +} + +OPENCV_HAL_IMPL_SSE_MISC_FLT_OP(v_float32x4, float, __m128, ps, _mm_set1_epi32((int)0x7fffffff)) +OPENCV_HAL_IMPL_SSE_MISC_FLT_OP(v_float64x2, double, __m128d, pd, _mm_srli_epi64(_mm_set1_epi32(-1), 1)) + +#define OPENCV_HAL_IMPL_SSE_SHIFT_OP(_Tpuvec, _Tpsvec, suffix, srai) \ +inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ +{ \ + return _Tpuvec(_mm_slli_##suffix(a.val, imm)); \ +} \ +inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ +{ \ + return _Tpsvec(_mm_slli_##suffix(a.val, imm)); \ +} \ +inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ +{ \ + return _Tpuvec(_mm_srli_##suffix(a.val, imm)); \ +} \ +inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ +{ \ + return _Tpsvec(srai(a.val, imm)); \ +} \ +template \ +inline _Tpuvec v_shl(const _Tpuvec& a) \ +{ \ + return _Tpuvec(_mm_slli_##suffix(a.val, imm)); \ +} \ +template \ +inline _Tpsvec v_shl(const _Tpsvec& a) \ +{ \ + return _Tpsvec(_mm_slli_##suffix(a.val, imm)); \ +} \ +template \ +inline _Tpuvec v_shr(const _Tpuvec& a) \ +{ \ + return _Tpuvec(_mm_srli_##suffix(a.val, imm)); \ +} \ +template \ +inline _Tpsvec v_shr(const _Tpsvec& a) \ +{ \ + return _Tpsvec(srai(a.val, imm)); \ +} + +OPENCV_HAL_IMPL_SSE_SHIFT_OP(v_uint16x8, v_int16x8, epi16, _mm_srai_epi16) +OPENCV_HAL_IMPL_SSE_SHIFT_OP(v_uint32x4, v_int32x4, epi32, _mm_srai_epi32) +OPENCV_HAL_IMPL_SSE_SHIFT_OP(v_uint64x2, v_int64x2, epi64, v_srai_epi64) + +namespace hal_sse_internal +{ + template 16)), + bool is_first = (imm == 0), + bool is_half = (imm == 8), + bool is_second = (imm == 16), + bool is_other = (((imm > 0) && (imm < 8)) || ((imm > 8) && (imm < 16)))> + class v_sse_palignr_u8_class; + + template + class v_sse_palignr_u8_class; + + template + class v_sse_palignr_u8_class + { + public: + inline __m128i operator()(const __m128i& a, const __m128i&) const + { + return a; + } + }; + + template + class v_sse_palignr_u8_class + { + public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + return _mm_unpacklo_epi64(_mm_unpackhi_epi64(a, a), b); + } + }; + + template + class v_sse_palignr_u8_class + { + public: + inline __m128i operator()(const __m128i&, const __m128i& b) const + { + return b; + } + }; + + template + class v_sse_palignr_u8_class + { +#if CV_SSSE3 + public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + return _mm_alignr_epi8(b, a, imm); + } +#else + public: + inline __m128i operator()(const __m128i& a, const __m128i& b) const + { + enum { imm2 = (sizeof(__m128i) - imm) }; + return _mm_or_si128(_mm_srli_si128(a, imm), _mm_slli_si128(b, imm2)); + } +#endif + }; + + template + inline __m128i v_sse_palignr_u8(const __m128i& a, const __m128i& b) + { + CV_StaticAssert((imm >= 0) && (imm <= 16), "Invalid imm for v_sse_palignr_u8."); + return v_sse_palignr_u8_class()(a, b); + } +} + +template +inline _Tpvec v_rotate_right(const _Tpvec &a) +{ + using namespace hal_sse_internal; + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_sse_reinterpret_as( + _mm_srli_si128( + v_sse_reinterpret_as<__m128i>(a.val), imm2))); +} + +template +inline _Tpvec v_rotate_left(const _Tpvec &a) +{ + using namespace hal_sse_internal; + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_sse_reinterpret_as( + _mm_slli_si128( + v_sse_reinterpret_as<__m128i>(a.val), imm2))); +} + +template +inline _Tpvec v_rotate_right(const _Tpvec &a, const _Tpvec &b) +{ + using namespace hal_sse_internal; + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_sse_reinterpret_as( + v_sse_palignr_u8( + v_sse_reinterpret_as<__m128i>(a.val), + v_sse_reinterpret_as<__m128i>(b.val)))); +} + +template +inline _Tpvec v_rotate_left(const _Tpvec &a, const _Tpvec &b) +{ + using namespace hal_sse_internal; + enum { imm2 = ((_Tpvec::nlanes - imm) * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_sse_reinterpret_as( + v_sse_palignr_u8( + v_sse_reinterpret_as<__m128i>(b.val), + v_sse_reinterpret_as<__m128i>(a.val)))); +} + +#define OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(_Tpvec, _Tp) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(_mm_loadu_si128((const __m128i*)ptr)); } \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(_mm_load_si128((const __m128i*)ptr)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(_mm_loadl_epi64((const __m128i*)ptr)); } \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ \ + return _Tpvec(_mm_unpacklo_epi64(_mm_loadl_epi64((const __m128i*)ptr0), \ + _mm_loadl_epi64((const __m128i*)ptr1))); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ _mm_storeu_si128((__m128i*)ptr, a.val); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ _mm_store_si128((__m128i*)ptr, a.val); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ _mm_stream_si128((__m128i*)ptr, a.val); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ +{ \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm_storeu_si128((__m128i*)ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm_stream_si128((__m128i*)ptr, a.val); \ + else \ + _mm_store_si128((__m128i*)ptr, a.val); \ +} \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ _mm_storel_epi64((__m128i*)ptr, a.val); } \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ _mm_storel_epi64((__m128i*)ptr, _mm_unpackhi_epi64(a.val, a.val)); } + +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_uint8x16, uchar) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_int8x16, schar) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_uint16x8, ushort) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_int16x8, short) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_uint32x4, unsigned) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_int32x4, int) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_uint64x2, uint64) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INT_OP(v_int64x2, int64) + +#define OPENCV_HAL_IMPL_SSE_LOADSTORE_FLT_OP(_Tpvec, _Tp, suffix) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(_mm_loadu_##suffix(ptr)); } \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(_mm_load_##suffix(ptr)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(_mm_castsi128_##suffix(_mm_loadl_epi64((const __m128i*)ptr))); } \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ \ + return _Tpvec(_mm_castsi128_##suffix( \ + _mm_unpacklo_epi64(_mm_loadl_epi64((const __m128i*)ptr0), \ + _mm_loadl_epi64((const __m128i*)ptr1)))); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ _mm_storeu_##suffix(ptr, a.val); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ _mm_store_##suffix(ptr, a.val); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ _mm_stream_##suffix(ptr, a.val); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ +{ \ + if( mode == hal::STORE_UNALIGNED ) \ + _mm_storeu_##suffix(ptr, a.val); \ + else if( mode == hal::STORE_ALIGNED_NOCACHE ) \ + _mm_stream_##suffix(ptr, a.val); \ + else \ + _mm_store_##suffix(ptr, a.val); \ +} \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ _mm_storel_epi64((__m128i*)ptr, _mm_cast##suffix##_si128(a.val)); } \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + __m128i a1 = _mm_cast##suffix##_si128(a.val); \ + _mm_storel_epi64((__m128i*)ptr, _mm_unpackhi_epi64(a1, a1)); \ +} + +OPENCV_HAL_IMPL_SSE_LOADSTORE_FLT_OP(v_float32x4, float, ps) +OPENCV_HAL_IMPL_SSE_LOADSTORE_FLT_OP(v_float64x2, double, pd) + +inline unsigned v_reduce_sum(const v_uint8x16& a) +{ + __m128i half = _mm_sad_epu8(a.val, _mm_setzero_si128()); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(half, _mm_unpackhi_epi64(half, half))); +} +inline int v_reduce_sum(const v_int8x16& a) +{ + __m128i half = _mm_set1_epi8((schar)-128); + half = _mm_sad_epu8(_mm_xor_si128(a.val, half), _mm_setzero_si128()); + return _mm_cvtsi128_si32(_mm_add_epi32(half, _mm_unpackhi_epi64(half, half))) - 2048; +} +#define OPENCV_HAL_IMPL_SSE_REDUCE_OP_16(func) \ +inline schar v_reduce_##func(const v_int8x16& a) \ +{ \ + __m128i val = a.val; \ + __m128i smask = _mm_set1_epi8((schar)-128); \ + val = _mm_xor_si128(val, smask); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,8)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,4)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,2)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,1)); \ + return (schar)_mm_cvtsi128_si32(val) ^ (schar)-128; \ +} \ +inline uchar v_reduce_##func(const v_uint8x16& a) \ +{ \ + __m128i val = a.val; \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,8)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,4)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,2)); \ + val = _mm_##func##_epu8(val, _mm_srli_si128(val,1)); \ + return (uchar)_mm_cvtsi128_si32(val); \ +} +OPENCV_HAL_IMPL_SSE_REDUCE_OP_16(max) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_16(min) + +#define OPENCV_HAL_IMPL_SSE_REDUCE_OP_8(_Tpvec, scalartype, func, suffix, sbit) \ +inline scalartype v_reduce_##func(const v_##_Tpvec& a) \ +{ \ + __m128i val = a.val; \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,8)); \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,4)); \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,2)); \ + return (scalartype)_mm_cvtsi128_si32(val); \ +} \ +inline unsigned scalartype v_reduce_##func(const v_u##_Tpvec& a) \ +{ \ + __m128i val = a.val; \ + __m128i smask = _mm_set1_epi16(sbit); \ + val = _mm_xor_si128(val, smask); \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,8)); \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,4)); \ + val = _mm_##func##_##suffix(val, _mm_srli_si128(val,2)); \ + return (unsigned scalartype)(_mm_cvtsi128_si32(val) ^ sbit); \ +} +OPENCV_HAL_IMPL_SSE_REDUCE_OP_8(int16x8, short, max, epi16, (short)-32768) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_8(int16x8, short, min, epi16, (short)-32768) + +#define OPENCV_HAL_IMPL_SSE_REDUCE_OP_4_SUM(_Tpvec, scalartype, regtype, suffix, cast_from, cast_to, extract) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + regtype val = a.val; \ + val = _mm_add_##suffix(val, cast_to(_mm_srli_si128(cast_from(val), 8))); \ + val = _mm_add_##suffix(val, cast_to(_mm_srli_si128(cast_from(val), 4))); \ + return (scalartype)_mm_cvt##extract(val); \ +} + +#define OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(_Tpvec, scalartype, func, scalar_func) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + scalartype CV_DECL_ALIGNED(16) buf[4]; \ + v_store_aligned(buf, a); \ + scalartype s0 = scalar_func(buf[0], buf[1]); \ + scalartype s1 = scalar_func(buf[2], buf[3]); \ + return scalar_func(s0, s1); \ +} + +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4_SUM(v_uint32x4, unsigned, __m128i, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP, si128_si32) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4_SUM(v_int32x4, int, __m128i, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP, si128_si32) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4_SUM(v_float32x4, float, __m128, ps, _mm_castps_si128, _mm_castsi128_ps, ss_f32) + +inline int v_reduce_sum(const v_int16x8& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } +inline unsigned v_reduce_sum(const v_uint16x8& a) +{ return v_reduce_sum(v_expand_low(a) + v_expand_high(a)); } + +inline uint64 v_reduce_sum(const v_uint64x2& a) +{ + uint64 CV_DECL_ALIGNED(32) idx[2]; + v_store_aligned(idx, a); + return idx[0] + idx[1]; +} +inline int64 v_reduce_sum(const v_int64x2& a) +{ + int64 CV_DECL_ALIGNED(32) idx[2]; + v_store_aligned(idx, a); + return idx[0] + idx[1]; +} +inline double v_reduce_sum(const v_float64x2& a) +{ + double CV_DECL_ALIGNED(32) idx[2]; + v_store_aligned(idx, a); + return idx[0] + idx[1]; +} + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ +#if CV_SSE3 + __m128 ab = _mm_hadd_ps(a.val, b.val); + __m128 cd = _mm_hadd_ps(c.val, d.val); + return v_float32x4(_mm_hadd_ps(ab, cd)); +#else + __m128 ac = _mm_add_ps(_mm_unpacklo_ps(a.val, c.val), _mm_unpackhi_ps(a.val, c.val)); + __m128 bd = _mm_add_ps(_mm_unpacklo_ps(b.val, d.val), _mm_unpackhi_ps(b.val, d.val)); + return v_float32x4(_mm_add_ps(_mm_unpacklo_ps(ac, bd), _mm_unpackhi_ps(ac, bd))); +#endif +} + +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, max, std::max) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, min, std::min) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, max, std::max) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, min, std::min) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, max, std::max) +OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, min, std::min) + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ + __m128i half = _mm_sad_epu8(a.val, b.val); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(half, _mm_unpackhi_epi64(half, half))); +} +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ + __m128i half = _mm_set1_epi8(0x7f); + half = _mm_sad_epu8(_mm_add_epi8(a.val, half), _mm_add_epi8(b.val, half)); + return (unsigned)_mm_cvtsi128_si32(_mm_add_epi32(half, _mm_unpackhi_epi64(half, half))); +} +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ + v_uint32x4 l, h; + v_expand(v_absdiff(a, b), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ + v_uint32x4 l, h; + v_expand(v_absdiff(a, b), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} + +inline v_uint8x16 v_popcount(const v_uint8x16& a) +{ + __m128i m1 = _mm_set1_epi32(0x55555555); + __m128i m2 = _mm_set1_epi32(0x33333333); + __m128i m4 = _mm_set1_epi32(0x0f0f0f0f); + __m128i p = a.val; + p = _mm_add_epi32(_mm_and_si128(_mm_srli_epi32(p, 1), m1), _mm_and_si128(p, m1)); + p = _mm_add_epi32(_mm_and_si128(_mm_srli_epi32(p, 2), m2), _mm_and_si128(p, m2)); + p = _mm_add_epi32(_mm_and_si128(_mm_srli_epi32(p, 4), m4), _mm_and_si128(p, m4)); + return v_uint8x16(p); +} +inline v_uint16x8 v_popcount(const v_uint16x8& a) +{ + v_uint8x16 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + return v_reinterpret_as_u16(p) & v_setall_u16(0x00ff); +} +inline v_uint32x4 v_popcount(const v_uint32x4& a) +{ + v_uint8x16 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + p += v_rotate_right<2>(p); + return v_reinterpret_as_u32(p) & v_setall_u32(0x000000ff); +} +inline v_uint64x2 v_popcount(const v_uint64x2& a) +{ + return v_uint64x2(_mm_sad_epu8(v_popcount(v_reinterpret_as_u8(a)).val, _mm_setzero_si128())); +} +inline v_uint8x16 v_popcount(const v_int8x16& a) +{ return v_popcount(v_reinterpret_as_u8(a)); } +inline v_uint16x8 v_popcount(const v_int16x8& a) +{ return v_popcount(v_reinterpret_as_u16(a)); } +inline v_uint32x4 v_popcount(const v_int32x4& a) +{ return v_popcount(v_reinterpret_as_u32(a)); } +inline v_uint64x2 v_popcount(const v_int64x2& a) +{ return v_popcount(v_reinterpret_as_u64(a)); } + +#define OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(_Tpvec, suffix, cast_op, allmask) \ +inline int v_signmask(const _Tpvec& a) { return _mm_movemask_##suffix(cast_op(a.val)); } \ +inline bool v_check_all(const _Tpvec& a) { return _mm_movemask_##suffix(cast_op(a.val)) == allmask; } \ +inline bool v_check_any(const _Tpvec& a) { return _mm_movemask_##suffix(cast_op(a.val)) != 0; } +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_uint8x16, epi8, OPENCV_HAL_NOP, 65535) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_int8x16, epi8, OPENCV_HAL_NOP, 65535) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_uint32x4, ps, _mm_castsi128_ps, 15) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_int32x4, ps, _mm_castsi128_ps, 15) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_uint64x2, pd, _mm_castsi128_pd, 3) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_int64x2, pd, _mm_castsi128_pd, 3) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_float32x4, ps, OPENCV_HAL_NOP, 15) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS(v_float64x2, pd, OPENCV_HAL_NOP, 3) + +#define OPENCV_HAL_IMPL_SSE_CHECK_SIGNS_SHORT(_Tpvec) \ +inline int v_signmask(const _Tpvec& a) { return _mm_movemask_epi8(_mm_packs_epi16(a.val, a.val)) & 255; } \ +inline bool v_check_all(const _Tpvec& a) { return (_mm_movemask_epi8(a.val) & 0xaaaa) == 0xaaaa; } \ +inline bool v_check_any(const _Tpvec& a) { return (_mm_movemask_epi8(a.val) & 0xaaaa) != 0; } +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS_SHORT(v_uint16x8) +OPENCV_HAL_IMPL_SSE_CHECK_SIGNS_SHORT(v_int16x8) + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } + +#if CV_SSE4_1 +#define OPENCV_HAL_IMPL_SSE_SELECT(_Tpvec, cast_ret, cast, suffix) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(cast_ret(_mm_blendv_##suffix(cast(b.val), cast(a.val), cast(mask.val)))); \ +} + +OPENCV_HAL_IMPL_SSE_SELECT(v_uint8x16, OPENCV_HAL_NOP, OPENCV_HAL_NOP, epi8) +OPENCV_HAL_IMPL_SSE_SELECT(v_int8x16, OPENCV_HAL_NOP, OPENCV_HAL_NOP, epi8) +OPENCV_HAL_IMPL_SSE_SELECT(v_uint16x8, OPENCV_HAL_NOP, OPENCV_HAL_NOP, epi8) +OPENCV_HAL_IMPL_SSE_SELECT(v_int16x8, OPENCV_HAL_NOP, OPENCV_HAL_NOP, epi8) +OPENCV_HAL_IMPL_SSE_SELECT(v_uint32x4, _mm_castps_si128, _mm_castsi128_ps, ps) +OPENCV_HAL_IMPL_SSE_SELECT(v_int32x4, _mm_castps_si128, _mm_castsi128_ps, ps) +// OPENCV_HAL_IMPL_SSE_SELECT(v_uint64x2, TBD, TBD, pd) +// OPENCV_HAL_IMPL_SSE_SELECT(v_int64x2, TBD, TBD, ps) +OPENCV_HAL_IMPL_SSE_SELECT(v_float32x4, OPENCV_HAL_NOP, OPENCV_HAL_NOP, ps) +OPENCV_HAL_IMPL_SSE_SELECT(v_float64x2, OPENCV_HAL_NOP, OPENCV_HAL_NOP, pd) + +#else // CV_SSE4_1 + +#define OPENCV_HAL_IMPL_SSE_SELECT(_Tpvec, suffix) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(_mm_xor_##suffix(b.val, _mm_and_##suffix(_mm_xor_##suffix(b.val, a.val), mask.val))); \ +} + +OPENCV_HAL_IMPL_SSE_SELECT(v_uint8x16, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_int8x16, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_uint16x8, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_int16x8, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_uint32x4, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_int32x4, si128) +// OPENCV_HAL_IMPL_SSE_SELECT(v_uint64x2, si128) +// OPENCV_HAL_IMPL_SSE_SELECT(v_int64x2, si128) +OPENCV_HAL_IMPL_SSE_SELECT(v_float32x4, ps) +OPENCV_HAL_IMPL_SSE_SELECT(v_float64x2, pd) +#endif + +/* Expand */ +#define OPENCV_HAL_IMPL_SSE_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin) \ + inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ + { \ + b0.val = intrin(a.val); \ + b1.val = __CV_CAT(intrin, _high)(a.val); \ + } \ + inline _Tpwvec v_expand_low(const _Tpvec& a) \ + { return _Tpwvec(intrin(a.val)); } \ + inline _Tpwvec v_expand_high(const _Tpvec& a) \ + { return _Tpwvec(__CV_CAT(intrin, _high)(a.val)); } \ + inline _Tpwvec v_load_expand(const _Tp* ptr) \ + { \ + __m128i a = _mm_loadl_epi64((const __m128i*)ptr); \ + return _Tpwvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_SSE_EXPAND(v_uint8x16, v_uint16x8, uchar, _v128_cvtepu8_epi16) +OPENCV_HAL_IMPL_SSE_EXPAND(v_int8x16, v_int16x8, schar, _v128_cvtepi8_epi16) +OPENCV_HAL_IMPL_SSE_EXPAND(v_uint16x8, v_uint32x4, ushort, _v128_cvtepu16_epi32) +OPENCV_HAL_IMPL_SSE_EXPAND(v_int16x8, v_int32x4, short, _v128_cvtepi16_epi32) +OPENCV_HAL_IMPL_SSE_EXPAND(v_uint32x4, v_uint64x2, unsigned, _v128_cvtepu32_epi64) +OPENCV_HAL_IMPL_SSE_EXPAND(v_int32x4, v_int64x2, int, _v128_cvtepi32_epi64) + +#define OPENCV_HAL_IMPL_SSE_EXPAND_Q(_Tpvec, _Tp, intrin) \ + inline _Tpvec v_load_expand_q(const _Tp* ptr) \ + { \ + typedef int CV_DECL_ALIGNED(1) unaligned_int; \ + __m128i a = _mm_cvtsi32_si128(*(const unaligned_int*)ptr); \ + return _Tpvec(intrin(a)); \ + } + +OPENCV_HAL_IMPL_SSE_EXPAND_Q(v_uint32x4, uchar, _v128_cvtepu8_epi32) +OPENCV_HAL_IMPL_SSE_EXPAND_Q(v_int32x4, schar, _v128_cvtepi8_epi32) + +#define OPENCV_HAL_IMPL_SSE_UNPACKS(_Tpvec, suffix, cast_from, cast_to) \ +inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) \ +{ \ + b0.val = _mm_unpacklo_##suffix(a0.val, a1.val); \ + b1.val = _mm_unpackhi_##suffix(a0.val, a1.val); \ +} \ +inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ +{ \ + __m128i a1 = cast_from(a.val), b1 = cast_from(b.val); \ + return _Tpvec(cast_to(_mm_unpacklo_epi64(a1, b1))); \ +} \ +inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ +{ \ + __m128i a1 = cast_from(a.val), b1 = cast_from(b.val); \ + return _Tpvec(cast_to(_mm_unpackhi_epi64(a1, b1))); \ +} \ +inline void v_recombine(const _Tpvec& a, const _Tpvec& b, _Tpvec& c, _Tpvec& d) \ +{ \ + __m128i a1 = cast_from(a.val), b1 = cast_from(b.val); \ + c.val = cast_to(_mm_unpacklo_epi64(a1, b1)); \ + d.val = cast_to(_mm_unpackhi_epi64(a1, b1)); \ +} + +OPENCV_HAL_IMPL_SSE_UNPACKS(v_uint8x16, epi8, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_int8x16, epi8, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_uint16x8, epi16, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_int16x8, epi16, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_uint32x4, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_int32x4, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_float32x4, ps, _mm_castps_si128, _mm_castsi128_ps) +OPENCV_HAL_IMPL_SSE_UNPACKS(v_float64x2, pd, _mm_castpd_si128, _mm_castsi128_pd) + +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ +#if CV_SSSE3 + static const __m128i perm = _mm_setr_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); + return v_uint8x16(_mm_shuffle_epi8(a.val, perm)); +#else + uchar CV_DECL_ALIGNED(32) d[16]; + v_store_aligned(d, a); + return v_uint8x16(d[15], d[14], d[13], d[12], d[11], d[10], d[9], d[8], d[7], d[6], d[5], d[4], d[3], d[2], d[1], d[0]); +#endif +} + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ +#if CV_SSSE3 + static const __m128i perm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); + return v_uint16x8(_mm_shuffle_epi8(a.val, perm)); +#else + __m128i r = _mm_shuffle_epi32(a.val, _MM_SHUFFLE(0, 1, 2, 3)); + r = _mm_shufflelo_epi16(r, _MM_SHUFFLE(2, 3, 0, 1)); + r = _mm_shufflehi_epi16(r, _MM_SHUFFLE(2, 3, 0, 1)); + return v_uint16x8(r); +#endif +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ + return v_uint32x4(_mm_shuffle_epi32(a.val, _MM_SHUFFLE(0, 1, 2, 3))); +} + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ + return v_uint64x2(_mm_shuffle_epi32(a.val, _MM_SHUFFLE(1, 0, 3, 2))); +} + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +template +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) +{ + return v_rotate_right(a, b); +} + +inline v_int32x4 v_round(const v_float32x4& a) +{ return v_int32x4(_mm_cvtps_epi32(a.val)); } + +inline v_int32x4 v_floor(const v_float32x4& a) +{ + __m128i a1 = _mm_cvtps_epi32(a.val); + __m128i mask = _mm_castps_si128(_mm_cmpgt_ps(_mm_cvtepi32_ps(a1), a.val)); + return v_int32x4(_mm_add_epi32(a1, mask)); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + __m128i a1 = _mm_cvtps_epi32(a.val); + __m128i mask = _mm_castps_si128(_mm_cmpgt_ps(a.val, _mm_cvtepi32_ps(a1))); + return v_int32x4(_mm_sub_epi32(a1, mask)); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ return v_int32x4(_mm_cvttps_epi32(a.val)); } + +inline v_int32x4 v_round(const v_float64x2& a) +{ return v_int32x4(_mm_cvtpd_epi32(a.val)); } + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + __m128i ai = _mm_cvtpd_epi32(a.val), bi = _mm_cvtpd_epi32(b.val); + return v_int32x4(_mm_unpacklo_epi64(ai, bi)); +} + +inline v_int32x4 v_floor(const v_float64x2& a) +{ + __m128i a1 = _mm_cvtpd_epi32(a.val); + __m128i mask = _mm_castpd_si128(_mm_cmpgt_pd(_mm_cvtepi32_pd(a1), a.val)); + mask = _mm_srli_si128(_mm_slli_si128(mask, 4), 8); // m0 m0 m1 m1 => m0 m1 0 0 + return v_int32x4(_mm_add_epi32(a1, mask)); +} + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ + __m128i a1 = _mm_cvtpd_epi32(a.val); + __m128i mask = _mm_castpd_si128(_mm_cmpgt_pd(a.val, _mm_cvtepi32_pd(a1))); + mask = _mm_srli_si128(_mm_slli_si128(mask, 4), 8); // m0 m0 m1 m1 => m0 m1 0 0 + return v_int32x4(_mm_sub_epi32(a1, mask)); +} + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ return v_int32x4(_mm_cvttpd_epi32(a.val)); } + +#define OPENCV_HAL_IMPL_SSE_TRANSPOSE4x4(_Tpvec, suffix, cast_from, cast_to) \ +inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, \ + _Tpvec& b2, _Tpvec& b3) \ +{ \ + __m128i t0 = cast_from(_mm_unpacklo_##suffix(a0.val, a1.val)); \ + __m128i t1 = cast_from(_mm_unpacklo_##suffix(a2.val, a3.val)); \ + __m128i t2 = cast_from(_mm_unpackhi_##suffix(a0.val, a1.val)); \ + __m128i t3 = cast_from(_mm_unpackhi_##suffix(a2.val, a3.val)); \ +\ + b0.val = cast_to(_mm_unpacklo_epi64(t0, t1)); \ + b1.val = cast_to(_mm_unpackhi_epi64(t0, t1)); \ + b2.val = cast_to(_mm_unpacklo_epi64(t2, t3)); \ + b3.val = cast_to(_mm_unpackhi_epi64(t2, t3)); \ +} + +OPENCV_HAL_IMPL_SSE_TRANSPOSE4x4(v_uint32x4, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_TRANSPOSE4x4(v_int32x4, epi32, OPENCV_HAL_NOP, OPENCV_HAL_NOP) +OPENCV_HAL_IMPL_SSE_TRANSPOSE4x4(v_float32x4, ps, _mm_castps_si128, _mm_castsi128_ps) + +// load deinterleave +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b) +{ + __m128i t00 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t01 = _mm_loadu_si128((const __m128i*)(ptr + 16)); + + __m128i t10 = _mm_unpacklo_epi8(t00, t01); + __m128i t11 = _mm_unpackhi_epi8(t00, t01); + + __m128i t20 = _mm_unpacklo_epi8(t10, t11); + __m128i t21 = _mm_unpackhi_epi8(t10, t11); + + __m128i t30 = _mm_unpacklo_epi8(t20, t21); + __m128i t31 = _mm_unpackhi_epi8(t20, t21); + + a.val = _mm_unpacklo_epi8(t30, t31); + b.val = _mm_unpackhi_epi8(t30, t31); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c) +{ +#if CV_SSE4_1 + const __m128i m0 = _mm_setr_epi8(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); + const __m128i m1 = _mm_setr_epi8(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + __m128i s0 = _mm_loadu_si128((const __m128i*)ptr); + __m128i s1 = _mm_loadu_si128((const __m128i*)(ptr + 16)); + __m128i s2 = _mm_loadu_si128((const __m128i*)(ptr + 32)); + __m128i a0 = _mm_blendv_epi8(_mm_blendv_epi8(s0, s1, m0), s2, m1); + __m128i b0 = _mm_blendv_epi8(_mm_blendv_epi8(s1, s2, m0), s0, m1); + __m128i c0 = _mm_blendv_epi8(_mm_blendv_epi8(s2, s0, m0), s1, m1); + const __m128i sh_b = _mm_setr_epi8(0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14, 1, 4, 7, 10, 13); + const __m128i sh_g = _mm_setr_epi8(1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 5, 8, 11, 14); + const __m128i sh_r = _mm_setr_epi8(2, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15); + a0 = _mm_shuffle_epi8(a0, sh_b); + b0 = _mm_shuffle_epi8(b0, sh_g); + c0 = _mm_shuffle_epi8(c0, sh_r); + a.val = a0; + b.val = b0; + c.val = c0; +#elif CV_SSSE3 + const __m128i m0 = _mm_setr_epi8(0, 3, 6, 9, 12, 15, 1, 4, 7, 10, 13, 2, 5, 8, 11, 14); + const __m128i m1 = _mm_alignr_epi8(m0, m0, 11); + const __m128i m2 = _mm_alignr_epi8(m0, m0, 6); + + __m128i t0 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t1 = _mm_loadu_si128((const __m128i*)(ptr + 16)); + __m128i t2 = _mm_loadu_si128((const __m128i*)(ptr + 32)); + + __m128i s0 = _mm_shuffle_epi8(t0, m0); + __m128i s1 = _mm_shuffle_epi8(t1, m1); + __m128i s2 = _mm_shuffle_epi8(t2, m2); + + t0 = _mm_alignr_epi8(s1, _mm_slli_si128(s0, 10), 5); + a.val = _mm_alignr_epi8(s2, t0, 5); + + t1 = _mm_alignr_epi8(_mm_srli_si128(s1, 5), _mm_slli_si128(s0, 5), 6); + b.val = _mm_alignr_epi8(_mm_srli_si128(s2, 5), t1, 5); + + t2 = _mm_alignr_epi8(_mm_srli_si128(s2, 10), s1, 11); + c.val = _mm_alignr_epi8(t2, s0, 11); +#else + __m128i t00 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t01 = _mm_loadu_si128((const __m128i*)(ptr + 16)); + __m128i t02 = _mm_loadu_si128((const __m128i*)(ptr + 32)); + + __m128i t10 = _mm_unpacklo_epi8(t00, _mm_unpackhi_epi64(t01, t01)); + __m128i t11 = _mm_unpacklo_epi8(_mm_unpackhi_epi64(t00, t00), t02); + __m128i t12 = _mm_unpacklo_epi8(t01, _mm_unpackhi_epi64(t02, t02)); + + __m128i t20 = _mm_unpacklo_epi8(t10, _mm_unpackhi_epi64(t11, t11)); + __m128i t21 = _mm_unpacklo_epi8(_mm_unpackhi_epi64(t10, t10), t12); + __m128i t22 = _mm_unpacklo_epi8(t11, _mm_unpackhi_epi64(t12, t12)); + + __m128i t30 = _mm_unpacklo_epi8(t20, _mm_unpackhi_epi64(t21, t21)); + __m128i t31 = _mm_unpacklo_epi8(_mm_unpackhi_epi64(t20, t20), t22); + __m128i t32 = _mm_unpacklo_epi8(t21, _mm_unpackhi_epi64(t22, t22)); + + a.val = _mm_unpacklo_epi8(t30, _mm_unpackhi_epi64(t31, t31)); + b.val = _mm_unpacklo_epi8(_mm_unpackhi_epi64(t30, t30), t32); + c.val = _mm_unpacklo_epi8(t31, _mm_unpackhi_epi64(t32, t32)); +#endif +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c, v_uint8x16& d) +{ + __m128i u0 = _mm_loadu_si128((const __m128i*)ptr); // a0 b0 c0 d0 a1 b1 c1 d1 ... + __m128i u1 = _mm_loadu_si128((const __m128i*)(ptr + 16)); // a4 b4 c4 d4 ... + __m128i u2 = _mm_loadu_si128((const __m128i*)(ptr + 32)); // a8 b8 c8 d8 ... + __m128i u3 = _mm_loadu_si128((const __m128i*)(ptr + 48)); // a12 b12 c12 d12 ... + + __m128i v0 = _mm_unpacklo_epi8(u0, u2); // a0 a8 b0 b8 ... + __m128i v1 = _mm_unpackhi_epi8(u0, u2); // a2 a10 b2 b10 ... + __m128i v2 = _mm_unpacklo_epi8(u1, u3); // a4 a12 b4 b12 ... + __m128i v3 = _mm_unpackhi_epi8(u1, u3); // a6 a14 b6 b14 ... + + u0 = _mm_unpacklo_epi8(v0, v2); // a0 a4 a8 a12 ... + u1 = _mm_unpacklo_epi8(v1, v3); // a2 a6 a10 a14 ... + u2 = _mm_unpackhi_epi8(v0, v2); // a1 a5 a9 a13 ... + u3 = _mm_unpackhi_epi8(v1, v3); // a3 a7 a11 a15 ... + + v0 = _mm_unpacklo_epi8(u0, u1); // a0 a2 a4 a6 ... + v1 = _mm_unpacklo_epi8(u2, u3); // a1 a3 a5 a7 ... + v2 = _mm_unpackhi_epi8(u0, u1); // c0 c2 c4 c6 ... + v3 = _mm_unpackhi_epi8(u2, u3); // c1 c3 c5 c7 ... + + a.val = _mm_unpacklo_epi8(v0, v1); + b.val = _mm_unpackhi_epi8(v0, v1); + c.val = _mm_unpacklo_epi8(v2, v3); + d.val = _mm_unpackhi_epi8(v2, v3); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b) +{ + __m128i v0 = _mm_loadu_si128((__m128i*)(ptr)); // a0 b0 a1 b1 a2 b2 a3 b3 + __m128i v1 = _mm_loadu_si128((__m128i*)(ptr + 8)); // a4 b4 a5 b5 a6 b6 a7 b7 + + __m128i v2 = _mm_unpacklo_epi16(v0, v1); // a0 a4 b0 b4 a1 a5 b1 b5 + __m128i v3 = _mm_unpackhi_epi16(v0, v1); // a2 a6 b2 b6 a3 a7 b3 b7 + __m128i v4 = _mm_unpacklo_epi16(v2, v3); // a0 a2 a4 a6 b0 b2 b4 b6 + __m128i v5 = _mm_unpackhi_epi16(v2, v3); // a1 a3 a5 a7 b1 b3 b5 b7 + + a.val = _mm_unpacklo_epi16(v4, v5); // a0 a1 a2 a3 a4 a5 a6 a7 + b.val = _mm_unpackhi_epi16(v4, v5); // b0 b1 ab b3 b4 b5 b6 b7 +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c) +{ +#if CV_SSE4_1 + __m128i v0 = _mm_loadu_si128((__m128i*)(ptr)); + __m128i v1 = _mm_loadu_si128((__m128i*)(ptr + 8)); + __m128i v2 = _mm_loadu_si128((__m128i*)(ptr + 16)); + __m128i a0 = _mm_blend_epi16(_mm_blend_epi16(v0, v1, 0x92), v2, 0x24); + __m128i b0 = _mm_blend_epi16(_mm_blend_epi16(v2, v0, 0x92), v1, 0x24); + __m128i c0 = _mm_blend_epi16(_mm_blend_epi16(v1, v2, 0x92), v0, 0x24); + + const __m128i sh_a = _mm_setr_epi8(0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m128i sh_b = _mm_setr_epi8(2, 3, 8, 9, 14, 15, 4, 5, 10, 11, 0, 1, 6, 7, 12, 13); + const __m128i sh_c = _mm_setr_epi8(4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + a0 = _mm_shuffle_epi8(a0, sh_a); + b0 = _mm_shuffle_epi8(b0, sh_b); + c0 = _mm_shuffle_epi8(c0, sh_c); + + a.val = a0; + b.val = b0; + c.val = c0; +#else + __m128i t00 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t01 = _mm_loadu_si128((const __m128i*)(ptr + 8)); + __m128i t02 = _mm_loadu_si128((const __m128i*)(ptr + 16)); + + __m128i t10 = _mm_unpacklo_epi16(t00, _mm_unpackhi_epi64(t01, t01)); + __m128i t11 = _mm_unpacklo_epi16(_mm_unpackhi_epi64(t00, t00), t02); + __m128i t12 = _mm_unpacklo_epi16(t01, _mm_unpackhi_epi64(t02, t02)); + + __m128i t20 = _mm_unpacklo_epi16(t10, _mm_unpackhi_epi64(t11, t11)); + __m128i t21 = _mm_unpacklo_epi16(_mm_unpackhi_epi64(t10, t10), t12); + __m128i t22 = _mm_unpacklo_epi16(t11, _mm_unpackhi_epi64(t12, t12)); + + a.val = _mm_unpacklo_epi16(t20, _mm_unpackhi_epi64(t21, t21)); + b.val = _mm_unpacklo_epi16(_mm_unpackhi_epi64(t20, t20), t22); + c.val = _mm_unpacklo_epi16(t21, _mm_unpackhi_epi64(t22, t22)); +#endif +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c, v_uint16x8& d) +{ + __m128i u0 = _mm_loadu_si128((const __m128i*)ptr); // a0 b0 c0 d0 a1 b1 c1 d1 + __m128i u1 = _mm_loadu_si128((const __m128i*)(ptr + 8)); // a2 b2 c2 d2 ... + __m128i u2 = _mm_loadu_si128((const __m128i*)(ptr + 16)); // a4 b4 c4 d4 ... + __m128i u3 = _mm_loadu_si128((const __m128i*)(ptr + 24)); // a6 b6 c6 d6 ... + + __m128i v0 = _mm_unpacklo_epi16(u0, u2); // a0 a4 b0 b4 ... + __m128i v1 = _mm_unpackhi_epi16(u0, u2); // a1 a5 b1 b5 ... + __m128i v2 = _mm_unpacklo_epi16(u1, u3); // a2 a6 b2 b6 ... + __m128i v3 = _mm_unpackhi_epi16(u1, u3); // a3 a7 b3 b7 ... + + u0 = _mm_unpacklo_epi16(v0, v2); // a0 a2 a4 a6 ... + u1 = _mm_unpacklo_epi16(v1, v3); // a1 a3 a5 a7 ... + u2 = _mm_unpackhi_epi16(v0, v2); // c0 c2 c4 c6 ... + u3 = _mm_unpackhi_epi16(v1, v3); // c1 c3 c5 c7 ... + + a.val = _mm_unpacklo_epi16(u0, u1); + b.val = _mm_unpackhi_epi16(u0, u1); + c.val = _mm_unpacklo_epi16(u2, u3); + d.val = _mm_unpackhi_epi16(u2, u3); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b) +{ + __m128i v0 = _mm_loadu_si128((__m128i*)(ptr)); // a0 b0 a1 b1 + __m128i v1 = _mm_loadu_si128((__m128i*)(ptr + 4)); // a2 b2 a3 b3 + + __m128i v2 = _mm_unpacklo_epi32(v0, v1); // a0 a2 b0 b2 + __m128i v3 = _mm_unpackhi_epi32(v0, v1); // a1 a3 b1 b3 + + a.val = _mm_unpacklo_epi32(v2, v3); // a0 a1 a2 a3 + b.val = _mm_unpackhi_epi32(v2, v3); // b0 b1 ab b3 +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c) +{ + __m128i t00 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t01 = _mm_loadu_si128((const __m128i*)(ptr + 4)); + __m128i t02 = _mm_loadu_si128((const __m128i*)(ptr + 8)); + + __m128i t10 = _mm_unpacklo_epi32(t00, _mm_unpackhi_epi64(t01, t01)); + __m128i t11 = _mm_unpacklo_epi32(_mm_unpackhi_epi64(t00, t00), t02); + __m128i t12 = _mm_unpacklo_epi32(t01, _mm_unpackhi_epi64(t02, t02)); + + a.val = _mm_unpacklo_epi32(t10, _mm_unpackhi_epi64(t11, t11)); + b.val = _mm_unpacklo_epi32(_mm_unpackhi_epi64(t10, t10), t12); + c.val = _mm_unpacklo_epi32(t11, _mm_unpackhi_epi64(t12, t12)); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c, v_uint32x4& d) +{ + v_uint32x4 s0(_mm_loadu_si128((const __m128i*)ptr)); // a0 b0 c0 d0 + v_uint32x4 s1(_mm_loadu_si128((const __m128i*)(ptr + 4))); // a1 b1 c1 d1 + v_uint32x4 s2(_mm_loadu_si128((const __m128i*)(ptr + 8))); // a2 b2 c2 d2 + v_uint32x4 s3(_mm_loadu_si128((const __m128i*)(ptr + 12))); // a3 b3 c3 d3 + + v_transpose4x4(s0, s1, s2, s3, a, b, c, d); +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b) +{ + __m128 u0 = _mm_loadu_ps(ptr); // a0 b0 a1 b1 + __m128 u1 = _mm_loadu_ps((ptr + 4)); // a2 b2 a3 b3 + + a.val = _mm_shuffle_ps(u0, u1, _MM_SHUFFLE(2, 0, 2, 0)); // a0 a1 a2 a3 + b.val = _mm_shuffle_ps(u0, u1, _MM_SHUFFLE(3, 1, 3, 1)); // b0 b1 ab b3 +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b, v_float32x4& c) +{ + __m128 t0 = _mm_loadu_ps(ptr + 0); + __m128 t1 = _mm_loadu_ps(ptr + 4); + __m128 t2 = _mm_loadu_ps(ptr + 8); + + __m128 at12 = _mm_shuffle_ps(t1, t2, _MM_SHUFFLE(0, 1, 0, 2)); + a.val = _mm_shuffle_ps(t0, at12, _MM_SHUFFLE(2, 0, 3, 0)); + + __m128 bt01 = _mm_shuffle_ps(t0, t1, _MM_SHUFFLE(0, 0, 0, 1)); + __m128 bt12 = _mm_shuffle_ps(t1, t2, _MM_SHUFFLE(0, 2, 0, 3)); + b.val = _mm_shuffle_ps(bt01, bt12, _MM_SHUFFLE(2, 0, 2, 0)); + + __m128 ct01 = _mm_shuffle_ps(t0, t1, _MM_SHUFFLE(0, 1, 0, 2)); + c.val = _mm_shuffle_ps(ct01, t2, _MM_SHUFFLE(3, 0, 2, 0)); +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b, v_float32x4& c, v_float32x4& d) +{ + __m128 t0 = _mm_loadu_ps(ptr + 0); + __m128 t1 = _mm_loadu_ps(ptr + 4); + __m128 t2 = _mm_loadu_ps(ptr + 8); + __m128 t3 = _mm_loadu_ps(ptr + 12); + __m128 t02lo = _mm_unpacklo_ps(t0, t2); + __m128 t13lo = _mm_unpacklo_ps(t1, t3); + __m128 t02hi = _mm_unpackhi_ps(t0, t2); + __m128 t13hi = _mm_unpackhi_ps(t1, t3); + a.val = _mm_unpacklo_ps(t02lo, t13lo); + b.val = _mm_unpackhi_ps(t02lo, t13lo); + c.val = _mm_unpacklo_ps(t02hi, t13hi); + d.val = _mm_unpackhi_ps(t02hi, t13hi); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, v_uint64x2& b) +{ + __m128i t0 = _mm_loadu_si128((const __m128i*)ptr); + __m128i t1 = _mm_loadu_si128((const __m128i*)(ptr + 2)); + + a = v_uint64x2(_mm_unpacklo_epi64(t0, t1)); + b = v_uint64x2(_mm_unpackhi_epi64(t0, t1)); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, v_uint64x2& b, v_uint64x2& c) +{ + __m128i t0 = _mm_loadu_si128((const __m128i*)ptr); // a0, b0 + __m128i t1 = _mm_loadu_si128((const __m128i*)(ptr + 2)); // c0, a1 + __m128i t2 = _mm_loadu_si128((const __m128i*)(ptr + 4)); // b1, c1 + + t1 = _mm_shuffle_epi32(t1, 0x4e); // a1, c0 + + a = v_uint64x2(_mm_unpacklo_epi64(t0, t1)); + b = v_uint64x2(_mm_unpacklo_epi64(_mm_unpackhi_epi64(t0, t0), t2)); + c = v_uint64x2(_mm_unpackhi_epi64(t1, t2)); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, + v_uint64x2& b, v_uint64x2& c, v_uint64x2& d) +{ + __m128i t0 = _mm_loadu_si128((const __m128i*)ptr); // a0 b0 + __m128i t1 = _mm_loadu_si128((const __m128i*)(ptr + 2)); // c0 d0 + __m128i t2 = _mm_loadu_si128((const __m128i*)(ptr + 4)); // a1 b1 + __m128i t3 = _mm_loadu_si128((const __m128i*)(ptr + 6)); // c1 d1 + + a = v_uint64x2(_mm_unpacklo_epi64(t0, t2)); + b = v_uint64x2(_mm_unpackhi_epi64(t0, t2)); + c = v_uint64x2(_mm_unpacklo_epi64(t1, t3)); + d = v_uint64x2(_mm_unpackhi_epi64(t1, t3)); +} + +// store interleave + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi8(a.val, b.val); + __m128i v1 = _mm_unpackhi_epi8(a.val, b.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 16), v1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 16), v1); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 16), v1); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + const v_uint8x16& c, hal::StoreMode mode = hal::STORE_UNALIGNED) +{ +#if CV_SSE4_1 + const __m128i sh_a = _mm_setr_epi8(0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10, 5); + const __m128i sh_b = _mm_setr_epi8(5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15, 10); + const __m128i sh_c = _mm_setr_epi8(10, 5, 0, 11, 6, 1, 12, 7, 2, 13, 8, 3, 14, 9, 4, 15); + __m128i a0 = _mm_shuffle_epi8(a.val, sh_a); + __m128i b0 = _mm_shuffle_epi8(b.val, sh_b); + __m128i c0 = _mm_shuffle_epi8(c.val, sh_c); + + const __m128i m0 = _mm_setr_epi8(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0); + const __m128i m1 = _mm_setr_epi8(0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0); + __m128i v0 = _mm_blendv_epi8(_mm_blendv_epi8(a0, b0, m1), c0, m0); + __m128i v1 = _mm_blendv_epi8(_mm_blendv_epi8(b0, c0, m1), a0, m0); + __m128i v2 = _mm_blendv_epi8(_mm_blendv_epi8(c0, a0, m1), b0, m0); +#elif CV_SSSE3 + const __m128i m0 = _mm_setr_epi8(0, 6, 11, 1, 7, 12, 2, 8, 13, 3, 9, 14, 4, 10, 15, 5); + const __m128i m1 = _mm_setr_epi8(5, 11, 0, 6, 12, 1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10); + const __m128i m2 = _mm_setr_epi8(10, 0, 5, 11, 1, 6, 12, 2, 7, 13, 3, 8, 14, 4, 9, 15); + + __m128i t0 = _mm_alignr_epi8(b.val, _mm_slli_si128(a.val, 10), 5); + t0 = _mm_alignr_epi8(c.val, t0, 5); + __m128i v0 = _mm_shuffle_epi8(t0, m0); + + __m128i t1 = _mm_alignr_epi8(_mm_srli_si128(b.val, 5), _mm_slli_si128(a.val, 5), 6); + t1 = _mm_alignr_epi8(_mm_srli_si128(c.val, 5), t1, 5); + __m128i v1 = _mm_shuffle_epi8(t1, m1); + + __m128i t2 = _mm_alignr_epi8(_mm_srli_si128(c.val, 10), b.val, 11); + t2 = _mm_alignr_epi8(t2, a.val, 11); + __m128i v2 = _mm_shuffle_epi8(t2, m2); +#else + __m128i z = _mm_setzero_si128(); + __m128i ab0 = _mm_unpacklo_epi8(a.val, b.val); + __m128i ab1 = _mm_unpackhi_epi8(a.val, b.val); + __m128i c0 = _mm_unpacklo_epi8(c.val, z); + __m128i c1 = _mm_unpackhi_epi8(c.val, z); + + __m128i p00 = _mm_unpacklo_epi16(ab0, c0); + __m128i p01 = _mm_unpackhi_epi16(ab0, c0); + __m128i p02 = _mm_unpacklo_epi16(ab1, c1); + __m128i p03 = _mm_unpackhi_epi16(ab1, c1); + + __m128i p10 = _mm_unpacklo_epi32(p00, p01); + __m128i p11 = _mm_unpackhi_epi32(p00, p01); + __m128i p12 = _mm_unpacklo_epi32(p02, p03); + __m128i p13 = _mm_unpackhi_epi32(p02, p03); + + __m128i p20 = _mm_unpacklo_epi64(p10, p11); + __m128i p21 = _mm_unpackhi_epi64(p10, p11); + __m128i p22 = _mm_unpacklo_epi64(p12, p13); + __m128i p23 = _mm_unpackhi_epi64(p12, p13); + + p20 = _mm_slli_si128(p20, 1); + p22 = _mm_slli_si128(p22, 1); + + __m128i p30 = _mm_slli_epi64(_mm_unpacklo_epi32(p20, p21), 8); + __m128i p31 = _mm_srli_epi64(_mm_unpackhi_epi32(p20, p21), 8); + __m128i p32 = _mm_slli_epi64(_mm_unpacklo_epi32(p22, p23), 8); + __m128i p33 = _mm_srli_epi64(_mm_unpackhi_epi32(p22, p23), 8); + + __m128i p40 = _mm_unpacklo_epi64(p30, p31); + __m128i p41 = _mm_unpackhi_epi64(p30, p31); + __m128i p42 = _mm_unpacklo_epi64(p32, p33); + __m128i p43 = _mm_unpackhi_epi64(p32, p33); + + __m128i v0 = _mm_or_si128(_mm_srli_si128(p40, 2), _mm_slli_si128(p41, 10)); + __m128i v1 = _mm_or_si128(_mm_srli_si128(p41, 6), _mm_slli_si128(p42, 6)); + __m128i v2 = _mm_or_si128(_mm_srli_si128(p42, 10), _mm_slli_si128(p43, 2)); +#endif + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 16), v1); + _mm_stream_si128((__m128i*)(ptr + 32), v2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 16), v1); + _mm_store_si128((__m128i*)(ptr + 32), v2); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 16), v1); + _mm_storeu_si128((__m128i*)(ptr + 32), v2); + } +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + const v_uint8x16& c, const v_uint8x16& d, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + // a0 a1 a2 a3 .... + // b0 b1 b2 b3 .... + // c0 c1 c2 c3 .... + // d0 d1 d2 d3 .... + __m128i u0 = _mm_unpacklo_epi8(a.val, c.val); // a0 c0 a1 c1 ... + __m128i u1 = _mm_unpackhi_epi8(a.val, c.val); // a8 c8 a9 c9 ... + __m128i u2 = _mm_unpacklo_epi8(b.val, d.val); // b0 d0 b1 d1 ... + __m128i u3 = _mm_unpackhi_epi8(b.val, d.val); // b8 d8 b9 d9 ... + + __m128i v0 = _mm_unpacklo_epi8(u0, u2); // a0 b0 c0 d0 ... + __m128i v1 = _mm_unpackhi_epi8(u0, u2); // a4 b4 c4 d4 ... + __m128i v2 = _mm_unpacklo_epi8(u1, u3); // a8 b8 c8 d8 ... + __m128i v3 = _mm_unpackhi_epi8(u1, u3); // a12 b12 c12 d12 ... + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 16), v1); + _mm_stream_si128((__m128i*)(ptr + 32), v2); + _mm_stream_si128((__m128i*)(ptr + 48), v3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 16), v1); + _mm_store_si128((__m128i*)(ptr + 32), v2); + _mm_store_si128((__m128i*)(ptr + 48), v3); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 16), v1); + _mm_storeu_si128((__m128i*)(ptr + 32), v2); + _mm_storeu_si128((__m128i*)(ptr + 48), v3); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi16(a.val, b.val); + __m128i v1 = _mm_unpackhi_epi16(a.val, b.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 8), v1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 8), v1); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 8), v1); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, + const v_uint16x8& b, const v_uint16x8& c, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ +#if CV_SSE4_1 + const __m128i sh_a = _mm_setr_epi8(0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5, 10, 11); + const __m128i sh_b = _mm_setr_epi8(10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15, 4, 5); + const __m128i sh_c = _mm_setr_epi8(4, 5, 10, 11, 0, 1, 6, 7, 12, 13, 2, 3, 8, 9, 14, 15); + __m128i a0 = _mm_shuffle_epi8(a.val, sh_a); + __m128i b0 = _mm_shuffle_epi8(b.val, sh_b); + __m128i c0 = _mm_shuffle_epi8(c.val, sh_c); + + __m128i v0 = _mm_blend_epi16(_mm_blend_epi16(a0, b0, 0x92), c0, 0x24); + __m128i v1 = _mm_blend_epi16(_mm_blend_epi16(c0, a0, 0x92), b0, 0x24); + __m128i v2 = _mm_blend_epi16(_mm_blend_epi16(b0, c0, 0x92), a0, 0x24); +#else + __m128i z = _mm_setzero_si128(); + __m128i ab0 = _mm_unpacklo_epi16(a.val, b.val); + __m128i ab1 = _mm_unpackhi_epi16(a.val, b.val); + __m128i c0 = _mm_unpacklo_epi16(c.val, z); + __m128i c1 = _mm_unpackhi_epi16(c.val, z); + + __m128i p10 = _mm_unpacklo_epi32(ab0, c0); + __m128i p11 = _mm_unpackhi_epi32(ab0, c0); + __m128i p12 = _mm_unpacklo_epi32(ab1, c1); + __m128i p13 = _mm_unpackhi_epi32(ab1, c1); + + __m128i p20 = _mm_unpacklo_epi64(p10, p11); + __m128i p21 = _mm_unpackhi_epi64(p10, p11); + __m128i p22 = _mm_unpacklo_epi64(p12, p13); + __m128i p23 = _mm_unpackhi_epi64(p12, p13); + + p20 = _mm_slli_si128(p20, 2); + p22 = _mm_slli_si128(p22, 2); + + __m128i p30 = _mm_unpacklo_epi64(p20, p21); + __m128i p31 = _mm_unpackhi_epi64(p20, p21); + __m128i p32 = _mm_unpacklo_epi64(p22, p23); + __m128i p33 = _mm_unpackhi_epi64(p22, p23); + + __m128i v0 = _mm_or_si128(_mm_srli_si128(p30, 2), _mm_slli_si128(p31, 10)); + __m128i v1 = _mm_or_si128(_mm_srli_si128(p31, 6), _mm_slli_si128(p32, 6)); + __m128i v2 = _mm_or_si128(_mm_srli_si128(p32, 10), _mm_slli_si128(p33, 2)); +#endif + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 8), v1); + _mm_stream_si128((__m128i*)(ptr + 16), v2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 8), v1); + _mm_store_si128((__m128i*)(ptr + 16), v2); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 8), v1); + _mm_storeu_si128((__m128i*)(ptr + 16), v2); + } +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + const v_uint16x8& c, const v_uint16x8& d, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + // a0 a1 a2 a3 .... + // b0 b1 b2 b3 .... + // c0 c1 c2 c3 .... + // d0 d1 d2 d3 .... + __m128i u0 = _mm_unpacklo_epi16(a.val, c.val); // a0 c0 a1 c1 ... + __m128i u1 = _mm_unpackhi_epi16(a.val, c.val); // a4 c4 a5 c5 ... + __m128i u2 = _mm_unpacklo_epi16(b.val, d.val); // b0 d0 b1 d1 ... + __m128i u3 = _mm_unpackhi_epi16(b.val, d.val); // b4 d4 b5 d5 ... + + __m128i v0 = _mm_unpacklo_epi16(u0, u2); // a0 b0 c0 d0 ... + __m128i v1 = _mm_unpackhi_epi16(u0, u2); // a2 b2 c2 d2 ... + __m128i v2 = _mm_unpacklo_epi16(u1, u3); // a4 b4 c4 d4 ... + __m128i v3 = _mm_unpackhi_epi16(u1, u3); // a6 b6 c6 d6 ... + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 8), v1); + _mm_stream_si128((__m128i*)(ptr + 16), v2); + _mm_stream_si128((__m128i*)(ptr + 24), v3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 8), v1); + _mm_store_si128((__m128i*)(ptr + 16), v2); + _mm_store_si128((__m128i*)(ptr + 24), v3); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 8), v1); + _mm_storeu_si128((__m128i*)(ptr + 16), v2); + _mm_storeu_si128((__m128i*)(ptr + 24), v3); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi32(a.val, b.val); + __m128i v1 = _mm_unpackhi_epi32(a.val, b.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 4), v1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 4), v1); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 4), v1); + } +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + v_uint32x4 z = v_setzero_u32(), u0, u1, u2, u3; + v_transpose4x4(a, b, c, z, u0, u1, u2, u3); + + __m128i v0 = _mm_or_si128(u0.val, _mm_slli_si128(u1.val, 12)); + __m128i v1 = _mm_or_si128(_mm_srli_si128(u1.val, 4), _mm_slli_si128(u2.val, 8)); + __m128i v2 = _mm_or_si128(_mm_srli_si128(u2.val, 8), _mm_slli_si128(u3.val, 4)); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 4), v1); + _mm_stream_si128((__m128i*)(ptr + 8), v2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 4), v1); + _mm_store_si128((__m128i*)(ptr + 8), v2); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 4), v1); + _mm_storeu_si128((__m128i*)(ptr + 8), v2); + } +} + +inline void v_store_interleave(unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + v_uint32x4 v0, v1, v2, v3; + v_transpose4x4(a, b, c, d, v0, v1, v2, v3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0.val); + _mm_stream_si128((__m128i*)(ptr + 4), v1.val); + _mm_stream_si128((__m128i*)(ptr + 8), v2.val); + _mm_stream_si128((__m128i*)(ptr + 12), v3.val); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0.val); + _mm_store_si128((__m128i*)(ptr + 4), v1.val); + _mm_store_si128((__m128i*)(ptr + 8), v2.val); + _mm_store_si128((__m128i*)(ptr + 12), v3.val); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0.val); + _mm_storeu_si128((__m128i*)(ptr + 4), v1.val); + _mm_storeu_si128((__m128i*)(ptr + 8), v2.val); + _mm_storeu_si128((__m128i*)(ptr + 12), v3.val); + } +} + +// 2-channel, float only +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128 v0 = _mm_unpacklo_ps(a.val, b.val); // a0 b0 a1 b1 + __m128 v1 = _mm_unpackhi_ps(a.val, b.val); // a2 b2 a3 b3 + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_ps(ptr, v0); + _mm_stream_ps(ptr + 4, v1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_ps(ptr, v0); + _mm_store_ps(ptr + 4, v1); + } + else + { + _mm_storeu_ps(ptr, v0); + _mm_storeu_ps(ptr + 4, v1); + } +} + +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128 u0 = _mm_shuffle_ps(a.val, b.val, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 u1 = _mm_shuffle_ps(c.val, a.val, _MM_SHUFFLE(1, 1, 0, 0)); + __m128 v0 = _mm_shuffle_ps(u0, u1, _MM_SHUFFLE(2, 0, 2, 0)); + __m128 u2 = _mm_shuffle_ps(b.val, c.val, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 u3 = _mm_shuffle_ps(a.val, b.val, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v1 = _mm_shuffle_ps(u2, u3, _MM_SHUFFLE(2, 0, 2, 0)); + __m128 u4 = _mm_shuffle_ps(c.val, a.val, _MM_SHUFFLE(3, 3, 2, 2)); + __m128 u5 = _mm_shuffle_ps(b.val, c.val, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 v2 = _mm_shuffle_ps(u4, u5, _MM_SHUFFLE(2, 0, 2, 0)); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_ps(ptr, v0); + _mm_stream_ps(ptr + 4, v1); + _mm_stream_ps(ptr + 8, v2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_ps(ptr, v0); + _mm_store_ps(ptr + 4, v1); + _mm_store_ps(ptr + 8, v2); + } + else + { + _mm_storeu_ps(ptr, v0); + _mm_storeu_ps(ptr + 4, v1); + _mm_storeu_ps(ptr + 8, v2); + } +} + +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128 u0 = _mm_unpacklo_ps(a.val, c.val); + __m128 u1 = _mm_unpacklo_ps(b.val, d.val); + __m128 u2 = _mm_unpackhi_ps(a.val, c.val); + __m128 u3 = _mm_unpackhi_ps(b.val, d.val); + __m128 v0 = _mm_unpacklo_ps(u0, u1); + __m128 v2 = _mm_unpacklo_ps(u2, u3); + __m128 v1 = _mm_unpackhi_ps(u0, u1); + __m128 v3 = _mm_unpackhi_ps(u2, u3); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_ps(ptr, v0); + _mm_stream_ps(ptr + 4, v1); + _mm_stream_ps(ptr + 8, v2); + _mm_stream_ps(ptr + 12, v3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_ps(ptr, v0); + _mm_store_ps(ptr + 4, v1); + _mm_store_ps(ptr + 8, v2); + _mm_store_ps(ptr + 12, v3); + } + else + { + _mm_storeu_ps(ptr, v0); + _mm_storeu_ps(ptr + 4, v1); + _mm_storeu_ps(ptr + 8, v2); + _mm_storeu_ps(ptr + 12, v3); + } +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi64(a.val, b.val); + __m128i v1 = _mm_unpackhi_epi64(a.val, b.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 2), v1); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 2), v1); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 2), v1); + } +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + const v_uint64x2& c, hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi64(a.val, b.val); + __m128i v1 = _mm_unpacklo_epi64(c.val, _mm_unpackhi_epi64(a.val, a.val)); + __m128i v2 = _mm_unpackhi_epi64(b.val, c.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 2), v1); + _mm_stream_si128((__m128i*)(ptr + 4), v2); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 2), v1); + _mm_store_si128((__m128i*)(ptr + 4), v2); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 2), v1); + _mm_storeu_si128((__m128i*)(ptr + 4), v2); + } +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + const v_uint64x2& c, const v_uint64x2& d, + hal::StoreMode mode = hal::STORE_UNALIGNED) +{ + __m128i v0 = _mm_unpacklo_epi64(a.val, b.val); + __m128i v1 = _mm_unpacklo_epi64(c.val, d.val); + __m128i v2 = _mm_unpackhi_epi64(a.val, b.val); + __m128i v3 = _mm_unpackhi_epi64(c.val, d.val); + + if( mode == hal::STORE_ALIGNED_NOCACHE ) + { + _mm_stream_si128((__m128i*)(ptr), v0); + _mm_stream_si128((__m128i*)(ptr + 2), v1); + _mm_stream_si128((__m128i*)(ptr + 4), v2); + _mm_stream_si128((__m128i*)(ptr + 6), v3); + } + else if( mode == hal::STORE_ALIGNED ) + { + _mm_store_si128((__m128i*)(ptr), v0); + _mm_store_si128((__m128i*)(ptr + 2), v1); + _mm_store_si128((__m128i*)(ptr + 4), v2); + _mm_store_si128((__m128i*)(ptr + 6), v3); + } + else + { + _mm_storeu_si128((__m128i*)(ptr), v0); + _mm_storeu_si128((__m128i*)(ptr + 2), v1); + _mm_storeu_si128((__m128i*)(ptr + 4), v2); + _mm_storeu_si128((__m128i*)(ptr + 6), v3); + } +} + +#define OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0 ) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0 ) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0, _Tpvec0& d0 ) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1, mode); \ +} + +OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(v_int8x16, schar, s8, v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(v_int16x8, short, s16, v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(v_int32x4, int, s32, v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(v_int64x2, int64, s64, v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_SSE_LOADSTORE_INTERLEAVE(v_float64x2, double, f64, v_uint64x2, uint64, u64) + +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(_mm_cvtepi32_ps(a.val)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + return v_float32x4(_mm_cvtpd_ps(a.val)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + return v_float32x4(_mm_movelh_ps(_mm_cvtpd_ps(a.val), _mm_cvtpd_ps(b.val))); +} + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ + return v_float64x2(_mm_cvtepi32_pd(a.val)); +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ + return v_float64x2(_mm_cvtepi32_pd(_mm_srli_si128(a.val,8))); +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + return v_float64x2(_mm_cvtps_pd(a.val)); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + return v_float64x2(_mm_cvtps_pd(_mm_movehl_ps(a.val, a.val))); +} + +// from (Mysticial and wim) https://stackoverflow.com/q/41144668 +inline v_float64x2 v_cvt_f64(const v_int64x2& v) +{ + // constants encoded as floating-point + __m128i magic_i_hi32 = _mm_set1_epi64x(0x4530000080000000); // 2^84 + 2^63 + __m128i magic_i_all = _mm_set1_epi64x(0x4530000080100000); // 2^84 + 2^63 + 2^52 + __m128d magic_d_all = _mm_castsi128_pd(magic_i_all); + // Blend the 32 lowest significant bits of v with magic_int_lo +#if CV_SSE4_1 + __m128i magic_i_lo = _mm_set1_epi64x(0x4330000000000000); // 2^52 + __m128i v_lo = _mm_blend_epi16(v.val, magic_i_lo, 0xcc); +#else + __m128i magic_i_lo = _mm_set1_epi32(0x43300000); // 2^52 + __m128i v_lo = _mm_unpacklo_epi32(_mm_shuffle_epi32(v.val, _MM_SHUFFLE(0, 0, 2, 0)), magic_i_lo); +#endif + // Extract the 32 most significant bits of v + __m128i v_hi = _mm_srli_epi64(v.val, 32); + // Flip the msb of v_hi and blend with 0x45300000 + v_hi = _mm_xor_si128(v_hi, magic_i_hi32); + // Compute in double precision + __m128d v_hi_dbl = _mm_sub_pd(_mm_castsi128_pd(v_hi), magic_d_all); + // (v_hi - magic_d_all) + v_lo Do not assume associativity of floating point addition + __m128d result = _mm_add_pd(v_hi_dbl, _mm_castsi128_pd(v_lo)); + return v_float64x2(result); +} + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int8x16(_mm_setr_epi8(tab[idx[0]], tab[idx[1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]], + tab[idx[8]], tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]])); +#else + return v_int8x16(_mm_setr_epi64( + _mm_setr_pi8(tab[idx[0]], tab[idx[1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]]), + _mm_setr_pi8(tab[idx[8]], tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]]) + )); +#endif +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int8x16(_mm_setr_epi16(*(const short*)(tab + idx[0]), *(const short*)(tab + idx[1]), *(const short*)(tab + idx[2]), *(const short*)(tab + idx[3]), + *(const short*)(tab + idx[4]), *(const short*)(tab + idx[5]), *(const short*)(tab + idx[6]), *(const short*)(tab + idx[7]))); +#else + return v_int8x16(_mm_setr_epi64( + _mm_setr_pi16(*(const short*)(tab + idx[0]), *(const short*)(tab + idx[1]), *(const short*)(tab + idx[2]), *(const short*)(tab + idx[3])), + _mm_setr_pi16(*(const short*)(tab + idx[4]), *(const short*)(tab + idx[5]), *(const short*)(tab + idx[6]), *(const short*)(tab + idx[7])) + )); +#endif +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int8x16(_mm_setr_epi32(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]))); +#else + return v_int8x16(_mm_setr_epi64( + _mm_setr_pi32(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1])), + _mm_setr_pi32(*(const int*)(tab + idx[2]), *(const int*)(tab + idx[3])) + )); +#endif +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((const schar *)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((const schar *)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((const schar *)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int16x8(_mm_setr_epi16(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], + tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]])); +#else + return v_int16x8(_mm_setr_epi64( + _mm_setr_pi16(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]), + _mm_setr_pi16(tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]]) + )); +#endif +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int16x8(_mm_setr_epi32(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), + *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]))); +#else + return v_int16x8(_mm_setr_epi64( + _mm_setr_pi32(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1])), + _mm_setr_pi32(*(const int*)(tab + idx[2]), *(const int*)(tab + idx[3])) + )); +#endif +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_int16x8(_mm_set_epi64x(*(const int64_t*)(tab + idx[1]), *(const int64_t*)(tab + idx[0]))); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((const short *)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((const short *)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((const short *)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ +#if defined(_MSC_VER) + return v_int32x4(_mm_setr_epi32(tab[idx[0]], tab[idx[1]], + tab[idx[2]], tab[idx[3]])); +#else + return v_int32x4(_mm_setr_epi64( + _mm_setr_pi32(tab[idx[0]], tab[idx[1]]), + _mm_setr_pi32(tab[idx[2]], tab[idx[3]]) + )); +#endif +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + return v_int32x4(_mm_set_epi64x(*(const int64_t*)(tab + idx[1]), *(const int64_t*)(tab + idx[0]))); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(_mm_loadu_si128((const __m128i*)(tab + idx[0]))); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((const int *)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((const int *)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((const int *)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + return v_int64x2(_mm_set_epi64x(tab[idx[1]], tab[idx[0]])); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(_mm_loadu_si128((const __m128i*)(tab + idx[0]))); +} +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + return v_float32x4(_mm_setr_ps(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v_lut_pairs((const int *)tab, idx)); } +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) { return v_reinterpret_as_f32(v_lut_quads((const int *)tab, idx)); } + +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + return v_float64x2(_mm_setr_pd(tab[idx[0]], tab[idx[1]])); +} +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) { return v_float64x2(_mm_castsi128_pd(_mm_loadu_si128((const __m128i*)(tab + idx[0])))); } + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + return v_int32x4(_mm_setr_epi32(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + return v_float32x4(_mm_setr_ps(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]])); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + int idx[2]; + v_store_low(idx, idxvec); + return v_float64x2(_mm_setr_pd(tab[idx[0]], tab[idx[1]])); +} + +// loads pairs from the table and deinterleaves them, e.g. returns: +// x = (tab[idxvec[0], tab[idxvec[1]], tab[idxvec[2]], tab[idxvec[3]]), +// y = (tab[idxvec[0]+1], tab[idxvec[1]+1], tab[idxvec[2]+1], tab[idxvec[3]+1]) +// note that the indices are float's indices, not the float-pair indices. +// in theory, this function can be used to implement bilinear interpolation, +// when idxvec are the offsets within the image. +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + int CV_DECL_ALIGNED(32) idx[4]; + v_store_aligned(idx, idxvec); + __m128 z = _mm_setzero_ps(); + __m128 xy01 = _mm_loadl_pi(z, (__m64*)(tab + idx[0])); + __m128 xy23 = _mm_loadl_pi(z, (__m64*)(tab + idx[2])); + xy01 = _mm_loadh_pi(xy01, (__m64*)(tab + idx[1])); + xy23 = _mm_loadh_pi(xy23, (__m64*)(tab + idx[3])); + __m128 xxyy02 = _mm_unpacklo_ps(xy01, xy23); + __m128 xxyy13 = _mm_unpackhi_ps(xy01, xy23); + x = v_float32x4(_mm_unpacklo_ps(xxyy02, xxyy13)); + y = v_float32x4(_mm_unpackhi_ps(xxyy02, xxyy13)); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + int idx[2]; + v_store_low(idx, idxvec); + __m128d xy0 = _mm_loadu_pd(tab + idx[0]); + __m128d xy1 = _mm_loadu_pd(tab + idx[1]); + x = v_float64x2(_mm_unpacklo_pd(xy0, xy1)); + y = v_float64x2(_mm_unpackhi_pd(xy0, xy1)); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ +#if CV_SSSE3 + return v_int8x16(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0x0f0d0e0c0b090a08, 0x0705060403010200))); +#else + __m128i a = _mm_shufflelo_epi16(vec.val, _MM_SHUFFLE(3, 1, 2, 0)); + a = _mm_shufflehi_epi16(a, _MM_SHUFFLE(3, 1, 2, 0)); + a = _mm_shuffle_epi32(a, _MM_SHUFFLE(3, 1, 2, 0)); + return v_int8x16(_mm_unpacklo_epi8(a, _mm_unpackhi_epi64(a, a))); +#endif +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ +#if CV_SSSE3 + return v_int8x16(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0x0f0b0e0a0d090c08, 0x0703060205010400))); +#else + __m128i a = _mm_shuffle_epi32(vec.val, _MM_SHUFFLE(3, 1, 2, 0)); + return v_int8x16(_mm_unpacklo_epi8(a, _mm_unpackhi_epi64(a, a))); +#endif +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ +#if CV_SSSE3 + return v_int16x8(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0x0f0e0b0a0d0c0908, 0x0706030205040100))); +#else + __m128i a = _mm_shufflelo_epi16(vec.val, _MM_SHUFFLE(3, 1, 2, 0)); + return v_int16x8(_mm_shufflehi_epi16(a, _MM_SHUFFLE(3, 1, 2, 0))); +#endif +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ +#if CV_SSSE3 + return v_int16x8(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0x0f0e07060d0c0504, 0x0b0a030209080100))); +#else + return v_int16x8(_mm_unpacklo_epi16(vec.val, _mm_unpackhi_epi64(vec.val, vec.val))); +#endif +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + return v_int32x4(_mm_shuffle_epi32(vec.val, _MM_SHUFFLE(3, 1, 2, 0))); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) { return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ +#if CV_SSSE3 + return v_int8x16(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0xffffff0f0e0d0c0a, 0x0908060504020100))); +#else + __m128i mask = _mm_set1_epi64x(0x00000000FFFFFFFF); + __m128i a = _mm_srli_si128(_mm_or_si128(_mm_andnot_si128(mask, vec.val), _mm_and_si128(mask, _mm_sll_epi32(vec.val, _mm_set_epi64x(0, 8)))), 1); + return v_int8x16(_mm_srli_si128(_mm_shufflelo_epi16(a, _MM_SHUFFLE(2, 1, 0, 3)), 2)); +#endif +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ +#if CV_SSSE3 + return v_int16x8(_mm_shuffle_epi8(vec.val, _mm_set_epi64x(0xffff0f0e0d0c0b0a, 0x0908050403020100))); +#else + return v_int16x8(_mm_srli_si128(_mm_shufflelo_epi16(vec.val, _MM_SHUFFLE(2, 1, 0, 3)), 2)); +#endif +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +template +inline uchar v_extract_n(const v_uint8x16& v) +{ +#if CV_SSE4_1 + return (uchar)_mm_extract_epi8(v.val, i); +#else + return v_rotate_right(v).get0(); +#endif +} + +template +inline schar v_extract_n(const v_int8x16& v) +{ + return (schar)v_extract_n(v_reinterpret_as_u8(v)); +} + +template +inline ushort v_extract_n(const v_uint16x8& v) +{ + return (ushort)_mm_extract_epi16(v.val, i); +} + +template +inline short v_extract_n(const v_int16x8& v) +{ + return (short)v_extract_n(v_reinterpret_as_u16(v)); +} + +template +inline uint v_extract_n(const v_uint32x4& v) +{ +#if CV_SSE4_1 + return (uint)_mm_extract_epi32(v.val, i); +#else + return v_rotate_right(v).get0(); +#endif +} + +template +inline int v_extract_n(const v_int32x4& v) +{ + return (int)v_extract_n(v_reinterpret_as_u32(v)); +} + +template +inline uint64 v_extract_n(const v_uint64x2& v) +{ +#ifdef CV__SIMD_NATIVE_mm_extract_epi64 + return (uint64)_v128_extract_epi64(v.val); +#else + return v_rotate_right(v).get0(); +#endif +} + +template +inline int64 v_extract_n(const v_int64x2& v) +{ + return (int64)v_extract_n(v_reinterpret_as_u64(v)); +} + +template +inline float v_extract_n(const v_float32x4& v) +{ + union { uint iv; float fv; } d; + d.iv = v_extract_n(v_reinterpret_as_u32(v)); + return d.fv; +} + +template +inline double v_extract_n(const v_float64x2& v) +{ + union { uint64 iv; double dv; } d; + d.iv = v_extract_n(v_reinterpret_as_u64(v)); + return d.dv; +} + +template +inline v_int32x4 v_broadcast_element(const v_int32x4& v) +{ + return v_int32x4(_mm_shuffle_epi32(v.val, _MM_SHUFFLE(i,i,i,i))); +} + +template +inline v_uint32x4 v_broadcast_element(const v_uint32x4& v) +{ + return v_uint32x4(_mm_shuffle_epi32(v.val, _MM_SHUFFLE(i,i,i,i))); +} + +template +inline v_float32x4 v_broadcast_element(const v_float32x4& v) +{ + return v_float32x4(_mm_shuffle_ps(v.val, v.val, _MM_SHUFFLE((char)i,(char)i,(char)i,(char)i))); +} + +////////////// FP16 support /////////////////////////// + +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ +#if CV_FP16 + return v_float32x4(_mm_cvtph_ps(_mm_loadu_si128((const __m128i*)ptr))); +#else + const __m128i z = _mm_setzero_si128(), delta = _mm_set1_epi32(0x38000000); + const __m128i signmask = _mm_set1_epi32(0x80000000), maxexp = _mm_set1_epi32(0x7c000000); + const __m128 deltaf = _mm_castsi128_ps(_mm_set1_epi32(0x38800000)); + __m128i bits = _mm_unpacklo_epi16(z, _mm_loadl_epi64((const __m128i*)ptr)); // h << 16 + __m128i e = _mm_and_si128(bits, maxexp), sign = _mm_and_si128(bits, signmask); + __m128i t = _mm_add_epi32(_mm_srli_epi32(_mm_xor_si128(bits, sign), 3), delta); // ((h & 0x7fff) << 13) + delta + __m128i zt = _mm_castps_si128(_mm_sub_ps(_mm_castsi128_ps(_mm_add_epi32(t, _mm_set1_epi32(1 << 23))), deltaf)); + + t = _mm_add_epi32(t, _mm_and_si128(delta, _mm_cmpeq_epi32(maxexp, e))); + __m128i zmask = _mm_cmpeq_epi32(e, z); + __m128i ft = v_select_si128(zmask, zt, t); + return v_float32x4(_mm_castsi128_ps(_mm_or_si128(ft, sign))); +#endif +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ +#if CV_FP16 + __m128i fp16_value = _mm_cvtps_ph(v.val, 0); + _mm_storel_epi64((__m128i*)ptr, fp16_value); +#else + const __m128i signmask = _mm_set1_epi32(0x80000000); + const __m128i rval = _mm_set1_epi32(0x3f000000); + + __m128i t = _mm_castps_si128(v.val); + __m128i sign = _mm_srai_epi32(_mm_and_si128(t, signmask), 16); + t = _mm_andnot_si128(signmask, t); + + __m128i finitemask = _mm_cmpgt_epi32(_mm_set1_epi32(0x47800000), t); + __m128i isnan = _mm_cmpgt_epi32(t, _mm_set1_epi32(0x7f800000)); + __m128i naninf = v_select_si128(isnan, _mm_set1_epi32(0x7e00), _mm_set1_epi32(0x7c00)); + __m128i tinymask = _mm_cmpgt_epi32(_mm_set1_epi32(0x38800000), t); + __m128i tt = _mm_castps_si128(_mm_add_ps(_mm_castsi128_ps(t), _mm_castsi128_ps(rval))); + tt = _mm_sub_epi32(tt, rval); + __m128i odd = _mm_and_si128(_mm_srli_epi32(t, 13), _mm_set1_epi32(1)); + __m128i nt = _mm_add_epi32(t, _mm_set1_epi32(0xc8000fff)); + nt = _mm_srli_epi32(_mm_add_epi32(nt, odd), 13); + t = v_select_si128(tinymask, tt, nt); + t = v_select_si128(finitemask, t, naninf); + t = _mm_or_si128(t, sign); + t = _mm_packs_epi32(t, t); + _mm_storel_epi64((__m128i*)ptr, t); +#endif +} + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse_em.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse_em.hpp new file mode 100644 index 0000000..6fb0881 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_sse_em.hpp @@ -0,0 +1,180 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_INTRIN_SSE_EM_HPP +#define OPENCV_HAL_INTRIN_SSE_EM_HPP + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#define OPENCV_HAL_SSE_WRAP_1(fun, tp) \ + inline tp _v128_##fun(const tp& a) \ + { return _mm_##fun(a); } + +#define OPENCV_HAL_SSE_WRAP_2(fun, tp) \ + inline tp _v128_##fun(const tp& a, const tp& b) \ + { return _mm_##fun(a, b); } + +#define OPENCV_HAL_SSE_WRAP_3(fun, tp) \ + inline tp _v128_##fun(const tp& a, const tp& b, const tp& c) \ + { return _mm_##fun(a, b, c); } + +///////////////////////////// XOP ///////////////////////////// + +// [todo] define CV_XOP +#if 1 // CV_XOP +inline __m128i _v128_comgt_epu32(const __m128i& a, const __m128i& b) +{ + const __m128i delta = _mm_set1_epi32((int)0x80000000); + return _mm_cmpgt_epi32(_mm_xor_si128(a, delta), _mm_xor_si128(b, delta)); +} +// wrapping XOP +#else +OPENCV_HAL_SSE_WRAP_2(_v128_comgt_epu32, __m128i) +#endif // !CV_XOP + +///////////////////////////// SSE4.1 ///////////////////////////// + +#if !CV_SSE4_1 + +/** Swizzle **/ +inline __m128i _v128_blendv_epi8(const __m128i& a, const __m128i& b, const __m128i& mask) +{ return _mm_xor_si128(a, _mm_and_si128(_mm_xor_si128(b, a), mask)); } + +/** Convert **/ +// 8 >> 16 +inline __m128i _v128_cvtepu8_epi16(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpacklo_epi8(a, z); +} +inline __m128i _v128_cvtepi8_epi16(const __m128i& a) +{ return _mm_srai_epi16(_mm_unpacklo_epi8(a, a), 8); } +// 8 >> 32 +inline __m128i _v128_cvtepu8_epi32(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpacklo_epi16(_mm_unpacklo_epi8(a, z), z); +} +inline __m128i _v128_cvtepi8_epi32(const __m128i& a) +{ + __m128i r = _mm_unpacklo_epi8(a, a); + r = _mm_unpacklo_epi8(r, r); + return _mm_srai_epi32(r, 24); +} +// 16 >> 32 +inline __m128i _v128_cvtepu16_epi32(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpacklo_epi16(a, z); +} +inline __m128i _v128_cvtepi16_epi32(const __m128i& a) +{ return _mm_srai_epi32(_mm_unpacklo_epi16(a, a), 16); } +// 32 >> 64 +inline __m128i _v128_cvtepu32_epi64(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpacklo_epi32(a, z); +} +inline __m128i _v128_cvtepi32_epi64(const __m128i& a) +{ return _mm_unpacklo_epi32(a, _mm_srai_epi32(a, 31)); } + +/** Arithmetic **/ +inline __m128i _v128_mullo_epi32(const __m128i& a, const __m128i& b) +{ + __m128i c0 = _mm_mul_epu32(a, b); + __m128i c1 = _mm_mul_epu32(_mm_srli_epi64(a, 32), _mm_srli_epi64(b, 32)); + __m128i d0 = _mm_unpacklo_epi32(c0, c1); + __m128i d1 = _mm_unpackhi_epi32(c0, c1); + return _mm_unpacklo_epi64(d0, d1); +} + +/** Math **/ +inline __m128i _v128_min_epu32(const __m128i& a, const __m128i& b) +{ return _v128_blendv_epi8(a, b, _v128_comgt_epu32(a, b)); } + +// wrapping SSE4.1 +#else +OPENCV_HAL_SSE_WRAP_1(cvtepu8_epi16, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepi8_epi16, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepu8_epi32, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepi8_epi32, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepu16_epi32, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepi16_epi32, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepu32_epi64, __m128i) +OPENCV_HAL_SSE_WRAP_1(cvtepi32_epi64, __m128i) +OPENCV_HAL_SSE_WRAP_2(min_epu32, __m128i) +OPENCV_HAL_SSE_WRAP_2(mullo_epi32, __m128i) +OPENCV_HAL_SSE_WRAP_3(blendv_epi8, __m128i) +#endif // !CV_SSE4_1 + +///////////////////////////// Revolutionary ///////////////////////////// + +/** Convert **/ +// 16 << 8 +inline __m128i _v128_cvtepu8_epi16_high(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpackhi_epi8(a, z); +} +inline __m128i _v128_cvtepi8_epi16_high(const __m128i& a) +{ return _mm_srai_epi16(_mm_unpackhi_epi8(a, a), 8); } +// 32 << 16 +inline __m128i _v128_cvtepu16_epi32_high(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpackhi_epi16(a, z); +} +inline __m128i _v128_cvtepi16_epi32_high(const __m128i& a) +{ return _mm_srai_epi32(_mm_unpackhi_epi16(a, a), 16); } +// 64 << 32 +inline __m128i _v128_cvtepu32_epi64_high(const __m128i& a) +{ + const __m128i z = _mm_setzero_si128(); + return _mm_unpackhi_epi32(a, z); +} +inline __m128i _v128_cvtepi32_epi64_high(const __m128i& a) +{ return _mm_unpackhi_epi32(a, _mm_srai_epi32(a, 31)); } + +/** Miscellaneous **/ +inline __m128i _v128_packs_epu32(const __m128i& a, const __m128i& b) +{ + const __m128i m = _mm_set1_epi32(65535); + __m128i am = _v128_min_epu32(a, m); + __m128i bm = _v128_min_epu32(b, m); +#if CV_SSE4_1 + return _mm_packus_epi32(am, bm); +#else + const __m128i d = _mm_set1_epi32(32768), nd = _mm_set1_epi16(-32768); + am = _mm_sub_epi32(am, d); + bm = _mm_sub_epi32(bm, d); + am = _mm_packs_epi32(am, bm); + return _mm_sub_epi16(am, nd); +#endif +} + +template +inline int64 _v128_extract_epi64(const __m128i& a) +{ +#if defined(CV__SIMD_HAVE_mm_extract_epi64) || (CV_SSE4_1 && (defined(__x86_64__)/*GCC*/ || defined(_M_X64)/*MSVC*/)) +#define CV__SIMD_NATIVE_mm_extract_epi64 1 + return _mm_extract_epi64(a, i); +#else + CV_DECL_ALIGNED(16) int64 tmp[2]; + _mm_store_si128((__m128i*)tmp, a); + return tmp[i]; +#endif +} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} // cv:: + +#endif // OPENCV_HAL_INTRIN_SSE_EM_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_vsx.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_vsx.hpp new file mode 100644 index 0000000..b198643 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_vsx.hpp @@ -0,0 +1,1608 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_VSX_HPP +#define OPENCV_HAL_VSX_HPP + +#include +#include "opencv2/core/utility.hpp" + +#define CV_SIMD128 1 +#define CV_SIMD128_64F 1 + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +///////// Types //////////// + +struct v_uint8x16 +{ + typedef uchar lane_type; + enum { nlanes = 16 }; + vec_uchar16 val; + + explicit v_uint8x16(const vec_uchar16& v) : val(v) + {} + v_uint8x16() + {} + v_uint8x16(vec_bchar16 v) : val(vec_uchar16_c(v)) + {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + : val(vec_uchar16_set(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)) + {} + + static inline v_uint8x16 zero() { return v_uint8x16(vec_uchar16_z); } + + uchar get0() const + { return vec_extract(val, 0); } +}; + +struct v_int8x16 +{ + typedef schar lane_type; + enum { nlanes = 16 }; + vec_char16 val; + + explicit v_int8x16(const vec_char16& v) : val(v) + {} + v_int8x16() + {} + v_int8x16(vec_bchar16 v) : val(vec_char16_c(v)) + {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + : val(vec_char16_set(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)) + {} + + static inline v_int8x16 zero() { return v_int8x16(vec_char16_z); } + + schar get0() const + { return vec_extract(val, 0); } +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + enum { nlanes = 8 }; + vec_ushort8 val; + + explicit v_uint16x8(const vec_ushort8& v) : val(v) + {} + v_uint16x8() + {} + v_uint16x8(vec_bshort8 v) : val(vec_ushort8_c(v)) + {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + : val(vec_ushort8_set(v0, v1, v2, v3, v4, v5, v6, v7)) + {} + + static inline v_uint16x8 zero() { return v_uint16x8(vec_ushort8_z); } + + ushort get0() const + { return vec_extract(val, 0); } +}; + +struct v_int16x8 +{ + typedef short lane_type; + enum { nlanes = 8 }; + vec_short8 val; + + explicit v_int16x8(const vec_short8& v) : val(v) + {} + v_int16x8() + {} + v_int16x8(vec_bshort8 v) : val(vec_short8_c(v)) + {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + : val(vec_short8_set(v0, v1, v2, v3, v4, v5, v6, v7)) + {} + + static inline v_int16x8 zero() { return v_int16x8(vec_short8_z); } + + short get0() const + { return vec_extract(val, 0); } +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + enum { nlanes = 4 }; + vec_uint4 val; + + explicit v_uint32x4(const vec_uint4& v) : val(v) + {} + v_uint32x4() + {} + v_uint32x4(vec_bint4 v) : val(vec_uint4_c(v)) + {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) : val(vec_uint4_set(v0, v1, v2, v3)) + {} + + static inline v_uint32x4 zero() { return v_uint32x4(vec_uint4_z); } + + uint get0() const + { return vec_extract(val, 0); } +}; + +struct v_int32x4 +{ + typedef int lane_type; + enum { nlanes = 4 }; + vec_int4 val; + + explicit v_int32x4(const vec_int4& v) : val(v) + {} + v_int32x4() + {} + v_int32x4(vec_bint4 v) : val(vec_int4_c(v)) + {} + v_int32x4(int v0, int v1, int v2, int v3) : val(vec_int4_set(v0, v1, v2, v3)) + {} + + static inline v_int32x4 zero() { return v_int32x4(vec_int4_z); } + + int get0() const + { return vec_extract(val, 0); } +}; + +struct v_float32x4 +{ + typedef float lane_type; + enum { nlanes = 4 }; + vec_float4 val; + + explicit v_float32x4(const vec_float4& v) : val(v) + {} + v_float32x4() + {} + v_float32x4(vec_bint4 v) : val(vec_float4_c(v)) + {} + v_float32x4(float v0, float v1, float v2, float v3) : val(vec_float4_set(v0, v1, v2, v3)) + {} + + static inline v_float32x4 zero() { return v_float32x4(vec_float4_z); } + + float get0() const + { return vec_extract(val, 0); } +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + enum { nlanes = 2 }; + vec_udword2 val; + + explicit v_uint64x2(const vec_udword2& v) : val(v) + {} + v_uint64x2() + {} + v_uint64x2(vec_bdword2 v) : val(vec_udword2_c(v)) + {} + v_uint64x2(uint64 v0, uint64 v1) : val(vec_udword2_set(v0, v1)) + {} + + static inline v_uint64x2 zero() { return v_uint64x2(vec_udword2_z); } + + uint64 get0() const + { return vec_extract(val, 0); } +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + enum { nlanes = 2 }; + vec_dword2 val; + + explicit v_int64x2(const vec_dword2& v) : val(v) + {} + v_int64x2() + {} + v_int64x2(vec_bdword2 v) : val(vec_dword2_c(v)) + {} + v_int64x2(int64 v0, int64 v1) : val(vec_dword2_set(v0, v1)) + {} + + static inline v_int64x2 zero() { return v_int64x2(vec_dword2_z); } + + int64 get0() const + { return vec_extract(val, 0); } +}; + +struct v_float64x2 +{ + typedef double lane_type; + enum { nlanes = 2 }; + vec_double2 val; + + explicit v_float64x2(const vec_double2& v) : val(v) + {} + v_float64x2() + {} + v_float64x2(vec_bdword2 v) : val(vec_double2_c(v)) + {} + v_float64x2(double v0, double v1) : val(vec_double2_set(v0, v1)) + {} + + static inline v_float64x2 zero() { return v_float64x2(vec_double2_z); } + + double get0() const + { return vec_extract(val, 0); } +}; + +#define OPENCV_HAL_IMPL_VSX_EXTRACT_N(_Tpvec, _Tp) \ +template inline _Tp v_extract_n(VSX_UNUSED(_Tpvec v)) { return vec_extract(v.val, i); } + +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_uint8x16, uchar) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_int8x16, schar) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_uint16x8, ushort) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_int16x8, short) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_uint32x4, uint) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_int32x4, int) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_uint64x2, uint64) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_int64x2, int64) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_float32x4, float) +OPENCV_HAL_IMPL_VSX_EXTRACT_N(v_float64x2, double) + +//////////////// Load and store operations /////////////// + +/* + * clang-5 aborted during parse "vec_xxx_c" only if it's + * inside a function template which is defined by preprocessor macro. + * + * if vec_xxx_c defined as C++ cast, clang-5 will pass it +*/ +#define OPENCV_HAL_IMPL_VSX_INITVEC(_Tpvec, _Tp, suffix, cast) \ +inline _Tpvec v_setzero_##suffix() { return _Tpvec(vec_splats((_Tp)0)); } \ +inline _Tpvec v_setall_##suffix(_Tp v) { return _Tpvec(vec_splats((_Tp)v));} \ +template inline _Tpvec v_reinterpret_as_##suffix(const _Tpvec0 &a) \ +{ return _Tpvec((cast)a.val); } + +OPENCV_HAL_IMPL_VSX_INITVEC(v_uint8x16, uchar, u8, vec_uchar16) +OPENCV_HAL_IMPL_VSX_INITVEC(v_int8x16, schar, s8, vec_char16) +OPENCV_HAL_IMPL_VSX_INITVEC(v_uint16x8, ushort, u16, vec_ushort8) +OPENCV_HAL_IMPL_VSX_INITVEC(v_int16x8, short, s16, vec_short8) +OPENCV_HAL_IMPL_VSX_INITVEC(v_uint32x4, uint, u32, vec_uint4) +OPENCV_HAL_IMPL_VSX_INITVEC(v_int32x4, int, s32, vec_int4) +OPENCV_HAL_IMPL_VSX_INITVEC(v_uint64x2, uint64, u64, vec_udword2) +OPENCV_HAL_IMPL_VSX_INITVEC(v_int64x2, int64, s64, vec_dword2) +OPENCV_HAL_IMPL_VSX_INITVEC(v_float32x4, float, f32, vec_float4) +OPENCV_HAL_IMPL_VSX_INITVEC(v_float64x2, double, f64, vec_double2) + +#define OPENCV_HAL_IMPL_VSX_LOADSTORE_C(_Tpvec, _Tp, ld, ld_a, st, st_a) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(ld(0, ptr)); } \ +inline _Tpvec v_load_aligned(VSX_UNUSED(const _Tp* ptr)) \ +{ return _Tpvec(ld_a(0, ptr)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ return _Tpvec(vec_ld_l8(ptr)); } \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ return _Tpvec(vec_mergesqh(vec_ld_l8(ptr0), vec_ld_l8(ptr1))); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ st(a.val, 0, ptr); } \ +inline void v_store_aligned(VSX_UNUSED(_Tp* ptr), const _Tpvec& a) \ +{ st_a(a.val, 0, ptr); } \ +inline void v_store_aligned_nocache(VSX_UNUSED(_Tp* ptr), const _Tpvec& a) \ +{ st_a(a.val, 0, ptr); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode mode) \ +{ if(mode == hal::STORE_UNALIGNED) st(a.val, 0, ptr); else st_a(a.val, 0, ptr); } \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ vec_st_l8(a.val, ptr); } \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ vec_st_h8(a.val, ptr); } + +// working around gcc bug for aligned ld/st +// if runtime check for vec_ld/st fail we failback to unaligned ld/st +// https://github.com/opencv/opencv/issues/13211 +#ifdef CV_COMPILER_VSX_BROKEN_ALIGNED + #define OPENCV_HAL_IMPL_VSX_LOADSTORE(_Tpvec, _Tp) \ + OPENCV_HAL_IMPL_VSX_LOADSTORE_C(_Tpvec, _Tp, vsx_ld, vsx_ld, vsx_st, vsx_st) +#else + #define OPENCV_HAL_IMPL_VSX_LOADSTORE(_Tpvec, _Tp) \ + OPENCV_HAL_IMPL_VSX_LOADSTORE_C(_Tpvec, _Tp, vsx_ld, vec_ld, vsx_st, vec_st) +#endif + +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_uint8x16, uchar) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_int8x16, schar) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_uint16x8, ushort) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_int16x8, short) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_uint32x4, uint) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_int32x4, int) +OPENCV_HAL_IMPL_VSX_LOADSTORE(v_float32x4, float) + +OPENCV_HAL_IMPL_VSX_LOADSTORE_C(v_float64x2, double, vsx_ld, vsx_ld, vsx_st, vsx_st) +OPENCV_HAL_IMPL_VSX_LOADSTORE_C(v_uint64x2, uint64, vsx_ld2, vsx_ld2, vsx_st2, vsx_st2) +OPENCV_HAL_IMPL_VSX_LOADSTORE_C(v_int64x2, int64, vsx_ld2, vsx_ld2, vsx_st2, vsx_st2) + +//////////////// Value reordering /////////////// + +/* de&interleave */ +#define OPENCV_HAL_IMPL_VSX_INTERLEAVE(_Tp, _Tpvec) \ +inline void v_load_deinterleave(const _Tp* ptr, _Tpvec& a, _Tpvec& b) \ +{ vec_ld_deinterleave(ptr, a.val, b.val);} \ +inline void v_load_deinterleave(const _Tp* ptr, _Tpvec& a, \ + _Tpvec& b, _Tpvec& c) \ +{ vec_ld_deinterleave(ptr, a.val, b.val, c.val); } \ +inline void v_load_deinterleave(const _Tp* ptr, _Tpvec& a, _Tpvec& b, \ + _Tpvec& c, _Tpvec& d) \ +{ vec_ld_deinterleave(ptr, a.val, b.val, c.val, d.val); } \ +inline void v_store_interleave(_Tp* ptr, const _Tpvec& a, const _Tpvec& b, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ vec_st_interleave(a.val, b.val, ptr); } \ +inline void v_store_interleave(_Tp* ptr, const _Tpvec& a, \ + const _Tpvec& b, const _Tpvec& c, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ vec_st_interleave(a.val, b.val, c.val, ptr); } \ +inline void v_store_interleave(_Tp* ptr, const _Tpvec& a, const _Tpvec& b, \ + const _Tpvec& c, const _Tpvec& d, \ + hal::StoreMode /*mode*/=hal::STORE_UNALIGNED) \ +{ vec_st_interleave(a.val, b.val, c.val, d.val, ptr); } + +OPENCV_HAL_IMPL_VSX_INTERLEAVE(uchar, v_uint8x16) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(schar, v_int8x16) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(ushort, v_uint16x8) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(short, v_int16x8) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(uint, v_uint32x4) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(int, v_int32x4) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(float, v_float32x4) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(double, v_float64x2) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(int64, v_int64x2) +OPENCV_HAL_IMPL_VSX_INTERLEAVE(uint64, v_uint64x2) + +/* Expand */ +#define OPENCV_HAL_IMPL_VSX_EXPAND(_Tpvec, _Tpwvec, _Tp, fl, fh) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + b0.val = fh(a.val); \ + b1.val = fl(a.val); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ return _Tpwvec(fh(a.val)); } \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ return _Tpwvec(fl(a.val)); } \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ return _Tpwvec(fh(vec_ld_l8(ptr))); } + +OPENCV_HAL_IMPL_VSX_EXPAND(v_uint8x16, v_uint16x8, uchar, vec_unpacklu, vec_unpackhu) +OPENCV_HAL_IMPL_VSX_EXPAND(v_int8x16, v_int16x8, schar, vec_unpackl, vec_unpackh) +OPENCV_HAL_IMPL_VSX_EXPAND(v_uint16x8, v_uint32x4, ushort, vec_unpacklu, vec_unpackhu) +OPENCV_HAL_IMPL_VSX_EXPAND(v_int16x8, v_int32x4, short, vec_unpackl, vec_unpackh) +OPENCV_HAL_IMPL_VSX_EXPAND(v_uint32x4, v_uint64x2, uint, vec_unpacklu, vec_unpackhu) +OPENCV_HAL_IMPL_VSX_EXPAND(v_int32x4, v_int64x2, int, vec_unpackl, vec_unpackh) + +/* Load and zero expand a 4 byte value into the second dword, first is don't care. */ +#if !defined(CV_COMPILER_VSX_BROKEN_ASM) + #define _LXSIWZX(out, ptr, T) __asm__ ("lxsiwzx %x0, 0, %1\r\n" : "=wa"(out) : "r" (ptr) : "memory"); +#else + /* This is compiler-agnostic, but will introduce an unneeded splat on the critical path. */ + #define _LXSIWZX(out, ptr, T) out = (T)vec_udword2_sp(*(uint32_t*)(ptr)); +#endif + +inline v_uint32x4 v_load_expand_q(const uchar* ptr) +{ + // Zero-extend the extra 24B instead of unpacking. Usually faster in small kernel + // Likewise note, value is zero extended and upper 4 bytes are zero'ed. + vec_uchar16 pmu = {8, 12, 12, 12, 9, 12, 12, 12, 10, 12, 12, 12, 11, 12, 12, 12}; + vec_uchar16 out; + + _LXSIWZX(out, ptr, vec_uchar16); + out = vec_perm(out, out, pmu); + return v_uint32x4((vec_uint4)out); +} + +inline v_int32x4 v_load_expand_q(const schar* ptr) +{ + vec_char16 out; + vec_short8 outs; + vec_int4 outw; + + _LXSIWZX(out, ptr, vec_char16); + outs = vec_unpackl(out); + outw = vec_unpackh(outs); + return v_int32x4(outw); +} + +/* pack */ +#define OPENCV_HAL_IMPL_VSX_PACK(_Tpvec, _Tp, _Tpwvec, _Tpvn, _Tpdel, sfnc, pkfnc, addfnc, pack) \ +inline _Tpvec v_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + return _Tpvec(pkfnc(a.val, b.val)); \ +} \ +inline void v_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + vec_st_l8(pkfnc(a.val, a.val), ptr); \ +} \ +template \ +inline _Tpvec v_rshr_##pack(const _Tpwvec& a, const _Tpwvec& b) \ +{ \ + const __vector _Tpvn vn = vec_splats((_Tpvn)n); \ + const __vector _Tpdel delta = vec_splats((_Tpdel)((_Tpdel)1 << (n-1))); \ + return _Tpvec(pkfnc(sfnc(addfnc(a.val, delta), vn), sfnc(addfnc(b.val, delta), vn))); \ +} \ +template \ +inline void v_rshr_##pack##_store(_Tp* ptr, const _Tpwvec& a) \ +{ \ + const __vector _Tpvn vn = vec_splats((_Tpvn)n); \ + const __vector _Tpdel delta = vec_splats((_Tpdel)((_Tpdel)1 << (n-1))); \ + vec_st_l8(pkfnc(sfnc(addfnc(a.val, delta), vn), delta), ptr); \ +} + +OPENCV_HAL_IMPL_VSX_PACK(v_uint8x16, uchar, v_uint16x8, unsigned short, unsigned short, + vec_sr, vec_packs, vec_adds, pack) +OPENCV_HAL_IMPL_VSX_PACK(v_int8x16, schar, v_int16x8, unsigned short, short, + vec_sra, vec_packs, vec_adds, pack) + +OPENCV_HAL_IMPL_VSX_PACK(v_uint16x8, ushort, v_uint32x4, unsigned int, unsigned int, + vec_sr, vec_packs, vec_add, pack) +OPENCV_HAL_IMPL_VSX_PACK(v_int16x8, short, v_int32x4, unsigned int, int, + vec_sra, vec_packs, vec_add, pack) + +OPENCV_HAL_IMPL_VSX_PACK(v_uint32x4, uint, v_uint64x2, unsigned long long, unsigned long long, + vec_sr, vec_pack, vec_add, pack) +OPENCV_HAL_IMPL_VSX_PACK(v_int32x4, int, v_int64x2, unsigned long long, long long, + vec_sra, vec_pack, vec_add, pack) + +OPENCV_HAL_IMPL_VSX_PACK(v_uint8x16, uchar, v_int16x8, unsigned short, short, + vec_sra, vec_packsu, vec_adds, pack_u) +OPENCV_HAL_IMPL_VSX_PACK(v_uint16x8, ushort, v_int32x4, unsigned int, int, + vec_sra, vec_packsu, vec_add, pack_u) +// Following variant is not implemented on other platforms: +//OPENCV_HAL_IMPL_VSX_PACK(v_uint32x4, uint, v_int64x2, unsigned long long, long long, +// vec_sra, vec_packsu, vec_add, pack_u) + +// pack boolean +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + vec_uchar16 ab = vec_pack(a.val, b.val); + return v_uint8x16(ab); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + vec_ushort8 ab = vec_pack(a.val, b.val); + vec_ushort8 cd = vec_pack(c.val, d.val); + return v_uint8x16(vec_pack(ab, cd)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + vec_uint4 ab = vec_pack(a.val, b.val); + vec_uint4 cd = vec_pack(c.val, d.val); + vec_uint4 ef = vec_pack(e.val, f.val); + vec_uint4 gh = vec_pack(g.val, h.val); + + vec_ushort8 abcd = vec_pack(ab, cd); + vec_ushort8 efgh = vec_pack(ef, gh); + return v_uint8x16(vec_pack(abcd, efgh)); +} + +/* Recombine */ +template +inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) +{ + b0.val = vec_mergeh(a0.val, a1.val); + b1.val = vec_mergel(a0.val, a1.val); +} + +template +inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(vec_mergesql(a.val, b.val)); } + +template +inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) +{ return _Tpvec(vec_mergesqh(a.val, b.val)); } + +template +inline void v_recombine(const _Tpvec& a, const _Tpvec& b, _Tpvec& c, _Tpvec& d) +{ + c.val = vec_mergesqh(a.val, b.val); + d.val = vec_mergesql(a.val, b.val); +} + +////////// Arithmetic, bitwise and comparison operations ///////// + +/* Element-wise binary and unary operations */ +/** Arithmetics **/ +#define OPENCV_HAL_IMPL_VSX_BIN_OP(bin_op, _Tpvec, intrin) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(intrin(a.val, b.val)); } \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ a.val = intrin(a.val, b.val); return a; } + +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_uint8x16, vec_adds) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_uint8x16, vec_subs) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_int8x16, vec_adds) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_int8x16, vec_subs) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_uint16x8, vec_adds) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_uint16x8, vec_subs) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_int16x8, vec_adds) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_int16x8, vec_subs) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_uint32x4, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_uint32x4, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_OP(*, v_uint32x4, vec_mul) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_int32x4, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_int32x4, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_OP(*, v_int32x4, vec_mul) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_float32x4, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_float32x4, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_OP(*, v_float32x4, vec_mul) +OPENCV_HAL_IMPL_VSX_BIN_OP(/, v_float32x4, vec_div) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_float64x2, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_float64x2, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_OP(*, v_float64x2, vec_mul) +OPENCV_HAL_IMPL_VSX_BIN_OP(/, v_float64x2, vec_div) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_uint64x2, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_uint64x2, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_OP(+, v_int64x2, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_OP(-, v_int64x2, vec_sub) + +// saturating multiply +#define OPENCV_HAL_IMPL_VSX_MUL_SAT(_Tpvec, _Tpwvec) \ + inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ + { \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ + } \ + inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ + { a = a * b; return a; } + +OPENCV_HAL_IMPL_VSX_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_VSX_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_VSX_MUL_SAT(v_int16x8, v_int32x4) +OPENCV_HAL_IMPL_VSX_MUL_SAT(v_uint16x8, v_uint32x4) + +template +inline void v_mul_expand(const Tvec& a, const Tvec& b, Twvec& c, Twvec& d) +{ + Twvec p0 = Twvec(vec_mule(a.val, b.val)); + Twvec p1 = Twvec(vec_mulo(a.val, b.val)); + v_zip(p0, p1, c, d); +} + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ + vec_int4 p0 = vec_mule(a.val, b.val); + vec_int4 p1 = vec_mulo(a.val, b.val); + static const vec_uchar16 perm = {2, 3, 18, 19, 6, 7, 22, 23, 10, 11, 26, 27, 14, 15, 30, 31}; + return v_int16x8(vec_perm(vec_short8_c(p0), vec_short8_c(p1), perm)); +} +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ + vec_uint4 p0 = vec_mule(a.val, b.val); + vec_uint4 p1 = vec_mulo(a.val, b.val); + static const vec_uchar16 perm = {2, 3, 18, 19, 6, 7, 22, 23, 10, 11, 26, 27, 14, 15, 30, 31}; + return v_uint16x8(vec_perm(vec_ushort8_c(p0), vec_ushort8_c(p1), perm)); +} + +/** Non-saturating arithmetics **/ +#define OPENCV_HAL_IMPL_VSX_BIN_FUNC(func, intrin) \ +template \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(intrin(a.val, b.val)); } + +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_add_wrap, vec_add) +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_sub_wrap, vec_sub) +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_mul_wrap, vec_mul) + +/** Bitwise shifts **/ +#define OPENCV_HAL_IMPL_VSX_SHIFT_OP(_Tpvec, shr, splfunc) \ +inline _Tpvec operator << (const _Tpvec& a, int imm) \ +{ return _Tpvec(vec_sl(a.val, splfunc(imm))); } \ +inline _Tpvec operator >> (const _Tpvec& a, int imm) \ +{ return _Tpvec(shr(a.val, splfunc(imm))); } \ +template inline _Tpvec v_shl(const _Tpvec& a) \ +{ return _Tpvec(vec_sl(a.val, splfunc(imm))); } \ +template inline _Tpvec v_shr(const _Tpvec& a) \ +{ return _Tpvec(shr(a.val, splfunc(imm))); } + +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_uint8x16, vec_sr, vec_uchar16_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_uint16x8, vec_sr, vec_ushort8_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_uint32x4, vec_sr, vec_uint4_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_uint64x2, vec_sr, vec_udword2_sp) +// algebraic right shift +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_int8x16, vec_sra, vec_uchar16_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_int16x8, vec_sra, vec_ushort8_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_int32x4, vec_sra, vec_uint4_sp) +OPENCV_HAL_IMPL_VSX_SHIFT_OP(v_int64x2, vec_sra, vec_udword2_sp) + +/** Bitwise logic **/ +#define OPENCV_HAL_IMPL_VSX_LOGIC_OP(_Tpvec) \ +OPENCV_HAL_IMPL_VSX_BIN_OP(&, _Tpvec, vec_and) \ +OPENCV_HAL_IMPL_VSX_BIN_OP(|, _Tpvec, vec_or) \ +OPENCV_HAL_IMPL_VSX_BIN_OP(^, _Tpvec, vec_xor) \ +inline _Tpvec operator ~ (const _Tpvec& a) \ +{ return _Tpvec(vec_not(a.val)); } + +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_uint8x16) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_int8x16) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_uint16x8) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_int16x8) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_uint32x4) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_int32x4) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_uint64x2) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_int64x2) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_float32x4) +OPENCV_HAL_IMPL_VSX_LOGIC_OP(v_float64x2) + +/** Bitwise select **/ +#define OPENCV_HAL_IMPL_VSX_SELECT(_Tpvec, cast) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_sel(b.val, a.val, cast(mask.val))); } + +OPENCV_HAL_IMPL_VSX_SELECT(v_uint8x16, vec_bchar16_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_int8x16, vec_bchar16_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_uint16x8, vec_bshort8_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_int16x8, vec_bshort8_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_uint32x4, vec_bint4_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_int32x4, vec_bint4_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_float32x4, vec_bint4_c) +OPENCV_HAL_IMPL_VSX_SELECT(v_float64x2, vec_bdword2_c) + +/** Comparison **/ +#define OPENCV_HAL_IMPL_VSX_INT_CMP_OP(_Tpvec) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmpeq(a.val, b.val)); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmpne(a.val, b.val)); } \ +inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmplt(a.val, b.val)); } \ +inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmpgt(a.val, b.val)); } \ +inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmple(a.val, b.val)); } \ +inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_cmpge(a.val, b.val)); } + +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_uint8x16) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_int8x16) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_uint16x8) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_int16x8) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_uint32x4) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_int32x4) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_float32x4) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_float64x2) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_uint64x2) +OPENCV_HAL_IMPL_VSX_INT_CMP_OP(v_int64x2) + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ return v_float32x4(vec_cmpeq(a.val, a.val)); } +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ return v_float64x2(vec_cmpeq(a.val, a.val)); } + +/** min/max **/ +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_min, vec_min) +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_max, vec_max) + +/** Rotate **/ +#define OPENCV_IMPL_VSX_ROTATE(_Tpvec, suffix, shf, cast) \ +template \ +inline _Tpvec v_rotate_##suffix(const _Tpvec& a) \ +{ \ + const int wd = imm * sizeof(typename _Tpvec::lane_type); \ + if (wd > 15) \ + return _Tpvec::zero(); \ + return _Tpvec((cast)shf(vec_uchar16_c(a.val), vec_uchar16_sp(wd << 3))); \ +} + +#define OPENCV_IMPL_VSX_ROTATE_LR(_Tpvec, cast) \ +OPENCV_IMPL_VSX_ROTATE(_Tpvec, left, vec_slo, cast) \ +OPENCV_IMPL_VSX_ROTATE(_Tpvec, right, vec_sro, cast) + +OPENCV_IMPL_VSX_ROTATE_LR(v_uint8x16, vec_uchar16) +OPENCV_IMPL_VSX_ROTATE_LR(v_int8x16, vec_char16) +OPENCV_IMPL_VSX_ROTATE_LR(v_uint16x8, vec_ushort8) +OPENCV_IMPL_VSX_ROTATE_LR(v_int16x8, vec_short8) +OPENCV_IMPL_VSX_ROTATE_LR(v_uint32x4, vec_uint4) +OPENCV_IMPL_VSX_ROTATE_LR(v_int32x4, vec_int4) +OPENCV_IMPL_VSX_ROTATE_LR(v_float32x4, vec_float4) +OPENCV_IMPL_VSX_ROTATE_LR(v_uint64x2, vec_udword2) +OPENCV_IMPL_VSX_ROTATE_LR(v_int64x2, vec_dword2) +OPENCV_IMPL_VSX_ROTATE_LR(v_float64x2, vec_double2) + +template +inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b) +{ + enum { CV_SHIFT = 16 - imm * (sizeof(typename _Tpvec::lane_type)) }; + if (CV_SHIFT == 16) + return a; +#ifdef __IBMCPP__ + return _Tpvec(vec_sld(b.val, a.val, CV_SHIFT & 15)); +#else + return _Tpvec(vec_sld(b.val, a.val, CV_SHIFT)); +#endif +} + +template +inline _Tpvec v_rotate_left(const _Tpvec& a, const _Tpvec& b) +{ + enum { CV_SHIFT = imm * (sizeof(typename _Tpvec::lane_type)) }; + if (CV_SHIFT == 16) + return b; + return _Tpvec(vec_sld(a.val, b.val, CV_SHIFT)); +} + +#define OPENCV_IMPL_VSX_ROTATE_64_2RG(_Tpvec, suffix, rg1, rg2) \ +template \ +inline _Tpvec v_rotate_##suffix(const _Tpvec& a, const _Tpvec& b) \ +{ \ + if (imm == 1) \ + return _Tpvec(vec_permi(rg1.val, rg2.val, 2)); \ + return imm ? b : a; \ +} + +#define OPENCV_IMPL_VSX_ROTATE_64_2RG_LR(_Tpvec) \ +OPENCV_IMPL_VSX_ROTATE_64_2RG(_Tpvec, left, b, a) \ +OPENCV_IMPL_VSX_ROTATE_64_2RG(_Tpvec, right, a, b) + +OPENCV_IMPL_VSX_ROTATE_64_2RG_LR(v_float64x2) +OPENCV_IMPL_VSX_ROTATE_64_2RG_LR(v_uint64x2) +OPENCV_IMPL_VSX_ROTATE_64_2RG_LR(v_int64x2) + +/* Reverse */ +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ + static const vec_uchar16 perm = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; + vec_uchar16 vec = (vec_uchar16)a.val; + return v_uint8x16(vec_perm(vec, vec, perm)); +} + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ + static const vec_uchar16 perm = {14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1}; + vec_uchar16 vec = (vec_uchar16)a.val; + return v_reinterpret_as_u16(v_uint8x16(vec_perm(vec, vec, perm))); +} + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ + static const vec_uchar16 perm = {12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3}; + vec_uchar16 vec = (vec_uchar16)a.val; + return v_reinterpret_as_u32(v_uint8x16(vec_perm(vec, vec, perm))); +} + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ + static const vec_uchar16 perm = {8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}; + vec_uchar16 vec = (vec_uchar16)a.val; + return v_reinterpret_as_u64(v_uint8x16(vec_perm(vec, vec, perm))); +} + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + +/* Extract */ +template +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) +{ return v_rotate_right(a, b); } + +////////// Reduce and mask ///////// + +/** Reduce **/ +inline uint v_reduce_sum(const v_uint8x16& a) +{ + const vec_uint4 zero4 = vec_uint4_z; + vec_uint4 sum4 = vec_sum4s(a.val, zero4); + return (uint)vec_extract(vec_sums(vec_int4_c(sum4), vec_int4_c(zero4)), 3); +} +inline int v_reduce_sum(const v_int8x16& a) +{ + const vec_int4 zero4 = vec_int4_z; + vec_int4 sum4 = vec_sum4s(a.val, zero4); + return (int)vec_extract(vec_sums(sum4, zero4), 3); +} +inline int v_reduce_sum(const v_int16x8& a) +{ + const vec_int4 zero = vec_int4_z; + return saturate_cast(vec_extract(vec_sums(vec_sum4s(a.val, zero), zero), 3)); +} +inline uint v_reduce_sum(const v_uint16x8& a) +{ + const vec_int4 v4 = vec_int4_c(vec_unpackhu(vec_adds(a.val, vec_sld(a.val, a.val, 8)))); + return saturate_cast(vec_extract(vec_sums(v4, vec_int4_z), 3)); +} + +#define OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(_Tpvec, _Tpvec2, scalartype, suffix, func) \ +inline scalartype v_reduce_##suffix(const _Tpvec& a) \ +{ \ + const _Tpvec2 rs = func(a.val, vec_sld(a.val, a.val, 8)); \ + return vec_extract(func(rs, vec_sld(rs, rs, 4)), 0); \ +} +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_uint32x4, vec_uint4, uint, sum, vec_add) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_uint32x4, vec_uint4, uint, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_uint32x4, vec_uint4, uint, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_int32x4, vec_int4, int, sum, vec_add) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_int32x4, vec_int4, int, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_int32x4, vec_int4, int, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_float32x4, vec_float4, float, sum, vec_add) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_float32x4, vec_float4, float, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_4(v_float32x4, vec_float4, float, min, vec_min) + +inline uint64 v_reduce_sum(const v_uint64x2& a) +{ + return vec_extract(vec_add(a.val, vec_permi(a.val, a.val, 3)), 0); +} +inline int64 v_reduce_sum(const v_int64x2& a) +{ + return vec_extract(vec_add(a.val, vec_permi(a.val, a.val, 3)), 0); +} +inline double v_reduce_sum(const v_float64x2& a) +{ + return vec_extract(vec_add(a.val, vec_permi(a.val, a.val, 3)), 0); +} + +#define OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(_Tpvec, _Tpvec2, scalartype, suffix, func) \ +inline scalartype v_reduce_##suffix(const _Tpvec& a) \ +{ \ + _Tpvec2 rs = func(a.val, vec_sld(a.val, a.val, 8)); \ + rs = func(rs, vec_sld(rs, rs, 4)); \ + return vec_extract(func(rs, vec_sld(rs, rs, 2)), 0); \ +} +OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_uint16x8, vec_ushort8, ushort, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_uint16x8, vec_ushort8, ushort, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_int16x8, vec_short8, short, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_int16x8, vec_short8, short, min, vec_min) + +#define OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(_Tpvec, _Tpvec2, scalartype, suffix, func) \ +inline scalartype v_reduce_##suffix(const _Tpvec& a) \ +{ \ + _Tpvec2 rs = func(a.val, vec_sld(a.val, a.val, 8)); \ + rs = func(rs, vec_sld(rs, rs, 4)); \ + rs = func(rs, vec_sld(rs, rs, 2)); \ + return vec_extract(func(rs, vec_sld(rs, rs, 1)), 0); \ +} +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_uint8x16, vec_uchar16, uchar, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_uint8x16, vec_uchar16, uchar, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_int8x16, vec_char16, schar, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_int8x16, vec_char16, schar, min, vec_min) + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + vec_float4 ac = vec_add(vec_mergel(a.val, c.val), vec_mergeh(a.val, c.val)); + ac = vec_add(ac, vec_sld(ac, ac, 8)); + + vec_float4 bd = vec_add(vec_mergel(b.val, d.val), vec_mergeh(b.val, d.val)); + bd = vec_add(bd, vec_sld(bd, bd, 8)); + return v_float32x4(vec_mergeh(ac, bd)); +} + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ + const vec_uint4 zero4 = vec_uint4_z; + vec_uint4 sum4 = vec_sum4s(vec_absd(a.val, b.val), zero4); + return (unsigned)vec_extract(vec_sums(vec_int4_c(sum4), vec_int4_c(zero4)), 3); +} +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ + const vec_int4 zero4 = vec_int4_z; + vec_char16 ad = vec_abss(vec_subs(a.val, b.val)); + vec_int4 sum4 = vec_sum4s(ad, zero4); + return (unsigned)vec_extract(vec_sums(sum4, zero4), 3); +} +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ + vec_ushort8 ad = vec_absd(a.val, b.val); + VSX_UNUSED(vec_int4) sum = vec_sums(vec_int4_c(vec_unpackhu(ad)) + vec_int4_c(vec_unpacklu(ad)), vec_int4_z); + return (unsigned)vec_extract(sum, 3); +} +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ + const vec_int4 zero4 = vec_int4_z; + vec_short8 ad = vec_abss(vec_subs(a.val, b.val)); + vec_int4 sum4 = vec_sum4s(ad, zero4); + return (unsigned)vec_extract(vec_sums(sum4, zero4), 3); +} +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ + const vec_uint4 ad = vec_absd(a.val, b.val); + const vec_uint4 rd = vec_add(ad, vec_sld(ad, ad, 8)); + return vec_extract(vec_add(rd, vec_sld(rd, rd, 4)), 0); +} +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ + vec_int4 ad = vec_abss(vec_sub(a.val, b.val)); + return (unsigned)vec_extract(vec_sums(ad, vec_int4_z), 3); +} +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + const vec_float4 ad = vec_abs(vec_sub(a.val, b.val)); + const vec_float4 rd = vec_add(ad, vec_sld(ad, ad, 8)); + return vec_extract(vec_add(rd, vec_sld(rd, rd, 4)), 0); +} + +/** Popcount **/ +inline v_uint8x16 v_popcount(const v_uint8x16& a) +{ return v_uint8x16(vec_popcntu(a.val)); } +inline v_uint8x16 v_popcount(const v_int8x16& a) +{ return v_uint8x16(vec_popcntu(a.val)); } +inline v_uint16x8 v_popcount(const v_uint16x8& a) +{ return v_uint16x8(vec_popcntu(a.val)); } +inline v_uint16x8 v_popcount(const v_int16x8& a) +{ return v_uint16x8(vec_popcntu(a.val)); } +inline v_uint32x4 v_popcount(const v_uint32x4& a) +{ return v_uint32x4(vec_popcntu(a.val)); } +inline v_uint32x4 v_popcount(const v_int32x4& a) +{ return v_uint32x4(vec_popcntu(a.val)); } +inline v_uint64x2 v_popcount(const v_uint64x2& a) +{ return v_uint64x2(vec_popcntu(a.val)); } +inline v_uint64x2 v_popcount(const v_int64x2& a) +{ return v_uint64x2(vec_popcntu(a.val)); } + +/** Mask **/ +inline int v_signmask(const v_uint8x16& a) +{ + static const vec_uchar16 qperm = {120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0}; + return vec_extract((vec_int4)vec_vbpermq(v_reinterpret_as_u8(a).val, qperm), 2); +} +inline int v_signmask(const v_int8x16& a) +{ return v_signmask(v_reinterpret_as_u8(a)); } + +inline int v_signmask(const v_int16x8& a) +{ + static const vec_uchar16 qperm = {112, 96, 80, 64, 48, 32, 16, 0, 128, 128, 128, 128, 128, 128, 128, 128}; + return vec_extract((vec_int4)vec_vbpermq(v_reinterpret_as_u8(a).val, qperm), 2); +} +inline int v_signmask(const v_uint16x8& a) +{ return v_signmask(v_reinterpret_as_s16(a)); } + +inline int v_signmask(const v_int32x4& a) +{ + static const vec_uchar16 qperm = {96, 64, 32, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}; + return vec_extract((vec_int4)vec_vbpermq(v_reinterpret_as_u8(a).val, qperm), 2); +} +inline int v_signmask(const v_uint32x4& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } +inline int v_signmask(const v_float32x4& a) +{ return v_signmask(v_reinterpret_as_s32(a)); } + +inline int v_signmask(const v_int64x2& a) +{ + VSX_UNUSED(const vec_dword2) sv = vec_sr(a.val, vec_udword2_sp(63)); + return (int)vec_extract(sv, 0) | (int)vec_extract(sv, 1) << 1; +} +inline int v_signmask(const v_uint64x2& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } +inline int v_signmask(const v_float64x2& a) +{ return v_signmask(v_reinterpret_as_s64(a)); } + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(a)); } +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(a)); } + +template +inline bool v_check_all(const _Tpvec& a) +{ return vec_all_lt(a.val, _Tpvec::zero().val); } +inline bool v_check_all(const v_uint8x16& a) +{ return v_check_all(v_reinterpret_as_s8(a)); } +inline bool v_check_all(const v_uint16x8& a) +{ return v_check_all(v_reinterpret_as_s16(a)); } +inline bool v_check_all(const v_uint32x4& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_all(const v_uint64x2& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } +inline bool v_check_all(const v_float32x4& a) +{ return v_check_all(v_reinterpret_as_s32(a)); } +inline bool v_check_all(const v_float64x2& a) +{ return v_check_all(v_reinterpret_as_s64(a)); } + +template +inline bool v_check_any(const _Tpvec& a) +{ return vec_any_lt(a.val, _Tpvec::zero().val); } +inline bool v_check_any(const v_uint8x16& a) +{ return v_check_any(v_reinterpret_as_s8(a)); } +inline bool v_check_any(const v_uint16x8& a) +{ return v_check_any(v_reinterpret_as_s16(a)); } +inline bool v_check_any(const v_uint32x4& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_uint64x2& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } +inline bool v_check_any(const v_float32x4& a) +{ return v_check_any(v_reinterpret_as_s32(a)); } +inline bool v_check_any(const v_float64x2& a) +{ return v_check_any(v_reinterpret_as_s64(a)); } + +////////// Other math ///////// + +/** Some frequent operations **/ +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ return v_float32x4(vec_sqrt(x.val)); } +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ return v_float64x2(vec_sqrt(x.val)); } + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ return v_float32x4(vec_rsqrt(x.val)); } +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ return v_float64x2(vec_rsqrt(x.val)); } + +#define OPENCV_HAL_IMPL_VSX_MULADD(_Tpvec) \ +inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_sqrt(vec_madd(a.val, a.val, vec_mul(b.val, b.val)))); } \ +inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(vec_madd(a.val, a.val, vec_mul(b.val, b.val))); } \ +inline _Tpvec v_fma(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ +{ return _Tpvec(vec_madd(a.val, b.val, c.val)); } \ +inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ +{ return _Tpvec(vec_madd(a.val, b.val, c.val)); } + +OPENCV_HAL_IMPL_VSX_MULADD(v_float32x4) +OPENCV_HAL_IMPL_VSX_MULADD(v_float64x2) + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ return a * b + c; } + +// TODO: exp, log, sin, cos + +/** Absolute values **/ +inline v_uint8x16 v_abs(const v_int8x16& x) +{ return v_uint8x16(vec_uchar16_c(vec_abs(x.val))); } + +inline v_uint16x8 v_abs(const v_int16x8& x) +{ return v_uint16x8(vec_ushort8_c(vec_abs(x.val))); } + +inline v_uint32x4 v_abs(const v_int32x4& x) +{ return v_uint32x4(vec_uint4_c(vec_abs(x.val))); } + +inline v_float32x4 v_abs(const v_float32x4& x) +{ return v_float32x4(vec_abs(x.val)); } + +inline v_float64x2 v_abs(const v_float64x2& x) +{ return v_float64x2(vec_abs(x.val)); } + +/** Absolute difference **/ +// unsigned +OPENCV_HAL_IMPL_VSX_BIN_FUNC(v_absdiff, vec_absd) + +inline v_uint8x16 v_absdiff(const v_int8x16& a, const v_int8x16& b) +{ return v_reinterpret_as_u8(v_sub_wrap(v_max(a, b), v_min(a, b))); } +inline v_uint16x8 v_absdiff(const v_int16x8& a, const v_int16x8& b) +{ return v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))); } +inline v_uint32x4 v_absdiff(const v_int32x4& a, const v_int32x4& b) +{ return v_reinterpret_as_u32(v_max(a, b) - v_min(a, b)); } + +inline v_float32x4 v_absdiff(const v_float32x4& a, const v_float32x4& b) +{ return v_abs(a - b); } +inline v_float64x2 v_absdiff(const v_float64x2& a, const v_float64x2& b) +{ return v_abs(a - b); } + +/** Absolute difference for signed integers **/ +inline v_int8x16 v_absdiffs(const v_int8x16& a, const v_int8x16& b) +{ return v_int8x16(vec_abss(vec_subs(a.val, b.val))); } +inline v_int16x8 v_absdiffs(const v_int16x8& a, const v_int16x8& b) +{ return v_int16x8(vec_abss(vec_subs(a.val, b.val))); } + +////////// Conversions ///////// + +/** Rounding **/ +inline v_int32x4 v_round(const v_float32x4& a) +{ return v_int32x4(vec_cts(vec_rint(a.val))); } + +inline v_int32x4 v_round(const v_float64x2& a) +{ return v_int32x4(vec_mergesqo(vec_ctso(vec_rint(a.val)), vec_int4_z)); } + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ return v_int32x4(vec_mergesqo(vec_ctso(vec_rint(a.val)), vec_ctso(vec_rint(b.val)))); } + +inline v_int32x4 v_floor(const v_float32x4& a) +{ return v_int32x4(vec_cts(vec_floor(a.val))); } + +inline v_int32x4 v_floor(const v_float64x2& a) +{ return v_int32x4(vec_mergesqo(vec_ctso(vec_floor(a.val)), vec_int4_z)); } + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ return v_int32x4(vec_cts(vec_ceil(a.val))); } + +inline v_int32x4 v_ceil(const v_float64x2& a) +{ return v_int32x4(vec_mergesqo(vec_ctso(vec_ceil(a.val)), vec_int4_z)); } + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ return v_int32x4(vec_cts(a.val)); } + +inline v_int32x4 v_trunc(const v_float64x2& a) +{ return v_int32x4(vec_mergesqo(vec_ctso(a.val), vec_int4_z)); } + +/** To float **/ +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ return v_float32x4(vec_ctf(a.val)); } + +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ return v_float32x4(vec_mergesqo(vec_cvfo(a.val), vec_float4_z)); } + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ return v_float32x4(vec_mergesqo(vec_cvfo(a.val), vec_cvfo(b.val))); } + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ return v_float64x2(vec_ctdo(vec_mergeh(a.val, a.val))); } + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ return v_float64x2(vec_ctdo(vec_mergel(a.val, a.val))); } + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ return v_float64x2(vec_cvfo(vec_mergeh(a.val, a.val))); } + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ return v_float64x2(vec_cvfo(vec_mergel(a.val, a.val))); } + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ return v_float64x2(vec_ctd(a.val)); } + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + return v_int8x16(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]], + tab[idx[8]], tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]]); +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + return v_reinterpret_as_s8(v_int16x8(*(const short*)(tab+idx[0]), *(const short*)(tab+idx[1]), *(const short*)(tab+idx[2]), *(const short*)(tab+idx[3]), + *(const short*)(tab+idx[4]), *(const short*)(tab+idx[5]), *(const short*)(tab+idx[6]), *(const short*)(tab+idx[7]))); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + return v_reinterpret_as_s8(v_int32x4(*(const int*)(tab+idx[0]), *(const int*)(tab+idx[1]), *(const int*)(tab+idx[2]), *(const int*)(tab+idx[3]))); +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((const schar*)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((const schar*)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((const schar*)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + return v_int16x8(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]]); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + return v_reinterpret_as_s16(v_int32x4(*(const int*)(tab + idx[0]), *(const int*)(tab + idx[1]), *(const int*)(tab + idx[2]), *(const int*)(tab + idx[3]))); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_reinterpret_as_s16(v_int64x2(*(const int64*)(tab + idx[0]), *(const int64*)(tab + idx[1]))); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((const short*)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((const short*)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((const short*)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + return v_int32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + return v_reinterpret_as_s32(v_int64x2(*(const int64*)(tab + idx[0]), *(const int64*)(tab + idx[1]))); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(vsx_ld(0, tab + idx[0])); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((const int*)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((const int*)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((const int*)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + return v_int64x2(tab[idx[0]], tab[idx[1]]); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(vsx_ld2(0, tab + idx[0])); +} +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + return v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v_lut_pairs((const int*)tab, idx)); } +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) { return v_load(tab + *idx); } + +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + return v_float64x2(tab[idx[0]], tab[idx[1]]); +} +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) { return v_load(tab + *idx); } + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + const int idx[4] = { + vec_extract(idxvec.val, 0), + vec_extract(idxvec.val, 1), + vec_extract(idxvec.val, 2), + vec_extract(idxvec.val, 3) + }; + return v_int32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + const int idx[4] = { + vec_extract(idxvec.val, 0), + vec_extract(idxvec.val, 1), + vec_extract(idxvec.val, 2), + vec_extract(idxvec.val, 3) + }; + return v_uint32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + const int idx[4] = { + vec_extract(idxvec.val, 0), + vec_extract(idxvec.val, 1), + vec_extract(idxvec.val, 2), + vec_extract(idxvec.val, 3) + }; + return v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + const int idx[2] = { + vec_extract(idxvec.val, 0), + vec_extract(idxvec.val, 1) + }; + return v_float64x2(tab[idx[0]], tab[idx[1]]); +} + +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + vec_float4 xy0 = vec_ld_l8(tab + vec_extract(idxvec.val, 0)); + vec_float4 xy1 = vec_ld_l8(tab + vec_extract(idxvec.val, 1)); + vec_float4 xy2 = vec_ld_l8(tab + vec_extract(idxvec.val, 2)); + vec_float4 xy3 = vec_ld_l8(tab + vec_extract(idxvec.val, 3)); + vec_float4 xy02 = vec_mergeh(xy0, xy2); // x0, x2, y0, y2 + vec_float4 xy13 = vec_mergeh(xy1, xy3); // x1, x3, y1, y3 + x.val = vec_mergeh(xy02, xy13); + y.val = vec_mergel(xy02, xy13); +} +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + vec_double2 xy0 = vsx_ld(vec_extract(idxvec.val, 0), tab); + vec_double2 xy1 = vsx_ld(vec_extract(idxvec.val, 1), tab); + x.val = vec_mergeh(xy0, xy1); + y.val = vec_mergel(xy0, xy1); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + static const vec_uchar16 perm = {0, 2, 1, 3, 4, 6, 5, 7, 8, 10, 9, 11, 12, 14, 13, 15}; + return v_int8x16(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } + +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + static const vec_uchar16 perm = {0, 4, 1, 5, 2, 6, 3, 7, 8, 12, 9, 13, 10, 14, 11, 15}; + return v_int8x16(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + static const vec_uchar16 perm = {0,1, 4,5, 2,3, 6,7, 8,9, 12,13, 10,11, 14,15}; + return v_int16x8(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } + +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + static const vec_uchar16 perm = {0,1, 8,9, 2,3, 10,11, 4,5, 12,13, 6,7, 14,15}; + return v_int16x8(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + static const vec_uchar16 perm = {0,1,2,3, 8,9,10,11, 4,5,6,7, 12,13,14,15}; + return v_int32x4(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) +{ return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) +{ return v_reinterpret_as_f32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + static const vec_uchar16 perm = {0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 15, 15, 15, 15}; + return v_int8x16(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) +{ return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + static const vec_uchar16 perm = {0,1, 2,3, 4,5, 8,9, 10,11, 12,13, 14,15, 14,15}; + return v_int16x8(vec_perm(vec.val, vec.val, perm)); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) +{ return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) +{ return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) +{ return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) +{ return vec; } + +/////// FP16 support //////// + +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + vec_ushort8 vf16 = vec_ld_l8((const ushort*)ptr); +#if CV_VSX3 && defined(vec_extract_fp_from_shorth) + return v_float32x4(vec_extract_fp_from_shorth(vf16)); +#elif CV_VSX3 && !defined(CV_COMPILER_VSX_BROKEN_ASM) + vec_float4 vf32; + __asm__ __volatile__ ("xvcvhpsp %x0,%x1" : "=wa" (vf32) : "wa" (vec_mergeh(vf16, vf16))); + return v_float32x4(vf32); +#else + const vec_int4 z = vec_int4_z, delta = vec_int4_sp(0x38000000); + const vec_int4 signmask = vec_int4_sp(0x80000000); + const vec_int4 maxexp = vec_int4_sp(0x7c000000); + const vec_float4 deltaf = vec_float4_c(vec_int4_sp(0x38800000)); + + vec_int4 bits = vec_int4_c(vec_mergeh(vec_short8_c(z), vec_short8_c(vf16))); + vec_int4 e = vec_and(bits, maxexp), sign = vec_and(bits, signmask); + vec_int4 t = vec_add(vec_sr(vec_xor(bits, sign), vec_uint4_sp(3)), delta); // ((h & 0x7fff) << 13) + delta + vec_int4 zt = vec_int4_c(vec_sub(vec_float4_c(vec_add(t, vec_int4_sp(1 << 23))), deltaf)); + + t = vec_add(t, vec_and(delta, vec_cmpeq(maxexp, e))); + vec_bint4 zmask = vec_cmpeq(e, z); + vec_int4 ft = vec_sel(t, zt, zmask); + return v_float32x4(vec_float4_c(vec_or(ft, sign))); +#endif +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ +// fixme: Is there any builtin op or intrinsic that cover "xvcvsphp"? +#if CV_VSX3 && !defined(CV_COMPILER_VSX_BROKEN_ASM) + vec_ushort8 vf16; + __asm__ __volatile__ ("xvcvsphp %x0,%x1" : "=wa" (vf16) : "wa" (v.val)); + vec_st_l8(vec_mergesqe(vf16, vf16), ptr); +#else + const vec_int4 signmask = vec_int4_sp(0x80000000); + const vec_int4 rval = vec_int4_sp(0x3f000000); + + vec_int4 t = vec_int4_c(v.val); + vec_int4 sign = vec_sra(vec_and(t, signmask), vec_uint4_sp(16)); + t = vec_and(vec_nor(signmask, signmask), t); + + vec_bint4 finitemask = vec_cmpgt(vec_int4_sp(0x47800000), t); + vec_bint4 isnan = vec_cmpgt(t, vec_int4_sp(0x7f800000)); + vec_int4 naninf = vec_sel(vec_int4_sp(0x7c00), vec_int4_sp(0x7e00), isnan); + vec_bint4 tinymask = vec_cmpgt(vec_int4_sp(0x38800000), t); + vec_int4 tt = vec_int4_c(vec_add(vec_float4_c(t), vec_float4_c(rval))); + tt = vec_sub(tt, rval); + vec_int4 odd = vec_and(vec_sr(t, vec_uint4_sp(13)), vec_int4_sp(1)); + vec_int4 nt = vec_add(t, vec_int4_sp(0xc8000fff)); + nt = vec_sr(vec_add(nt, odd), vec_uint4_sp(13)); + t = vec_sel(nt, tt, tinymask); + t = vec_sel(naninf, t, finitemask); + t = vec_or(t, sign); + vec_st_l8(vec_packs(t, t), ptr); +#endif +} + +inline void v_cleanup() {} + + +/** Reinterpret **/ +/** its up there with load and store operations **/ + +////////// Matrix operations ///////// + +//////// Dot Product //////// +// 16 >> 32 +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ return v_int32x4(vec_msum(a.val, b.val, vec_int4_z)); } +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_int32x4(vec_msum(a.val, b.val, c.val)); } + +// 32 >> 64 +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + vec_dword2 even = vec_mule(a.val, b.val); + vec_dword2 odd = vec_mulo(a.val, b.val); + return v_int64x2(vec_add(even, odd)); +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b) + c; } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_uint32x4(vec_msum(a.val, b.val, c.val)); } +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ return v_uint32x4(vec_msum(a.val, b.val, vec_uint4_z)); } + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + const vec_ushort8 eight = vec_ushort8_sp(8); + vec_short8 a0 = vec_sra((vec_short8)vec_sld(a.val, a.val, 1), eight); // even + vec_short8 a1 = vec_sra((vec_short8)a.val, eight); // odd + vec_short8 b0 = vec_sra((vec_short8)vec_sld(b.val, b.val, 1), eight); + vec_short8 b1 = vec_sra((vec_short8)b.val, eight); + return v_int32x4(vec_msum(a0, b0, vec_msum(a1, b1, vec_int4_z))); +} + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ + const vec_ushort8 eight = vec_ushort8_sp(8); + vec_short8 a0 = vec_sra((vec_short8)vec_sld(a.val, a.val, 1), eight); // even + vec_short8 a1 = vec_sra((vec_short8)a.val, eight); // odd + vec_short8 b0 = vec_sra((vec_short8)vec_sld(b.val, b.val, 1), eight); + vec_short8 b1 = vec_sra((vec_short8)b.val, eight); + return v_int32x4(vec_msum(a0, b0, vec_msum(a1, b1, c.val))); +} + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + const vec_uint4 zero = vec_uint4_z; + vec_uint4 even = vec_mule(a.val, b.val); + vec_uint4 odd = vec_mulo(a.val, b.val); + vec_udword2 e0 = (vec_udword2)vec_mergee(even, zero); + vec_udword2 e1 = (vec_udword2)vec_mergeo(even, zero); + vec_udword2 o0 = (vec_udword2)vec_mergee(odd, zero); + vec_udword2 o1 = (vec_udword2)vec_mergeo(odd, zero); + vec_udword2 s0 = vec_add(e0, o0); + vec_udword2 s1 = vec_add(e1, o1); + return v_uint64x2(vec_add(s0, s1)); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + v_int32x4 prod = v_dotprod(a, b); + v_int64x2 c, d; + v_expand(prod, c, d); + return v_int64x2(vec_add(vec_mergeh(c.val, d.val), vec_mergel(c.val, d.val))); +} +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod(a, b); } +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_int32x4(vec_msum(a.val, b.val, vec_int4_z)) + c; } +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod(a, b); } +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_uint32x4(vec_msum(a.val, b.val, vec_uint4_z)) + c; } + +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ + vec_short8 a0 = vec_unpackh(a.val); + vec_short8 a1 = vec_unpackl(a.val); + vec_short8 b0 = vec_unpackh(b.val); + vec_short8 b1 = vec_unpackl(b.val); + return v_int32x4(vec_msum(a0, b0, vec_msum(a1, b1, vec_int4_z))); +} +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ return v_dotprod_expand(a, b); } +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ + v_int32x4 prod = v_dotprod(a, b); + v_int64x2 c, d; + v_expand(prod, c, d); + return c + d; +} +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand_fast(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b, c); } + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + const vec_float4 v0 = vec_splat(v.val, 0); + const vec_float4 v1 = vec_splat(v.val, 1); + const vec_float4 v2 = vec_splat(v.val, 2); + VSX_UNUSED(const vec_float4) v3 = vec_splat(v.val, 3); + return v_float32x4(vec_madd(v0, m0.val, vec_madd(v1, m1.val, vec_madd(v2, m2.val, vec_mul(v3, m3.val))))); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + const vec_float4 v0 = vec_splat(v.val, 0); + const vec_float4 v1 = vec_splat(v.val, 1); + const vec_float4 v2 = vec_splat(v.val, 2); + return v_float32x4(vec_madd(v0, m0.val, vec_madd(v1, m1.val, vec_madd(v2, m2.val, a.val)))); +} + +#define OPENCV_HAL_IMPL_VSX_TRANSPOSE4x4(_Tpvec, _Tpvec2) \ +inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, _Tpvec& b2, _Tpvec& b3) \ +{ \ + _Tpvec2 a02 = vec_mergeh(a0.val, a2.val); \ + _Tpvec2 a13 = vec_mergeh(a1.val, a3.val); \ + b0.val = vec_mergeh(a02, a13); \ + b1.val = vec_mergel(a02, a13); \ + a02 = vec_mergel(a0.val, a2.val); \ + a13 = vec_mergel(a1.val, a3.val); \ + b2.val = vec_mergeh(a02, a13); \ + b3.val = vec_mergel(a02, a13); \ +} +OPENCV_HAL_IMPL_VSX_TRANSPOSE4x4(v_uint32x4, vec_uint4) +OPENCV_HAL_IMPL_VSX_TRANSPOSE4x4(v_int32x4, vec_int4) +OPENCV_HAL_IMPL_VSX_TRANSPOSE4x4(v_float32x4, vec_float4) + +template +inline Tvec v_broadcast_element(const Tvec& v) +{ return Tvec(vec_splat(v.val, i)); } + + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} + +#endif // OPENCV_HAL_VSX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/intrin_wasm.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_wasm.hpp new file mode 100644 index 0000000..db3cb2a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/intrin_wasm.hpp @@ -0,0 +1,2783 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_HAL_INTRIN_WASM_HPP +#define OPENCV_HAL_INTRIN_WASM_HPP + +#include +#include +#include +#include +#include "opencv2/core/saturate.hpp" + +#define CV_SIMD128 1 +#define CV_SIMD128_64F 0 // Now all implementation of f64 use fallback, so disable it. +#define CV_SIMD128_FP16 0 + +namespace cv +{ + +//! @cond IGNORED + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN + +#if (__EMSCRIPTEN_major__ * 1000000 + __EMSCRIPTEN_minor__ * 1000 + __EMSCRIPTEN_tiny__) < (1038046) +// handle renames: https://github.com/emscripten-core/emscripten/pull/9440 (https://github.com/emscripten-core/emscripten/commit/755d5b46cb84d0aa120c10981b11d05646c29673) +#define wasm_i32x4_trunc_saturate_f32x4 wasm_trunc_saturate_i32x4_f32x4 +#define wasm_u32x4_trunc_saturate_f32x4 wasm_trunc_saturate_u32x4_f32x4 +#define wasm_i64x2_trunc_saturate_f64x2 wasm_trunc_saturate_i64x2_f64x2 +#define wasm_u64x2_trunc_saturate_f64x2 wasm_trunc_saturate_u64x2_f64x2 +#define wasm_f32x4_convert_i32x4 wasm_convert_f32x4_i32x4 +#define wasm_f32x4_convert_u32x4 wasm_convert_f32x4_u32x4 +#define wasm_f64x2_convert_i64x2 wasm_convert_f64x2_i64x2 +#define wasm_f64x2_convert_u64x2 wasm_convert_f64x2_u64x2 +#endif // COMPATIBILITY: <1.38.46 + +///////// Types /////////// + +struct v_uint8x16 +{ + typedef uchar lane_type; + typedef v128_t vector_type; + enum { nlanes = 16 }; + + v_uint8x16() {} + explicit v_uint8x16(v128_t v) : val(v) {} + v_uint8x16(uchar v0, uchar v1, uchar v2, uchar v3, uchar v4, uchar v5, uchar v6, uchar v7, + uchar v8, uchar v9, uchar v10, uchar v11, uchar v12, uchar v13, uchar v14, uchar v15) + { + uchar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = wasm_v128_load(v); + } + + uchar get0() const + { + return (uchar)wasm_i8x16_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_int8x16 +{ + typedef schar lane_type; + typedef v128_t vector_type; + enum { nlanes = 16 }; + + v_int8x16() {} + explicit v_int8x16(v128_t v) : val(v) {} + v_int8x16(schar v0, schar v1, schar v2, schar v3, schar v4, schar v5, schar v6, schar v7, + schar v8, schar v9, schar v10, schar v11, schar v12, schar v13, schar v14, schar v15) + { + schar v[] = {v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15}; + val = wasm_v128_load(v); + } + + schar get0() const + { + return wasm_i8x16_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_uint16x8 +{ + typedef ushort lane_type; + typedef v128_t vector_type; + enum { nlanes = 8 }; + + v_uint16x8() {} + explicit v_uint16x8(v128_t v) : val(v) {} + v_uint16x8(ushort v0, ushort v1, ushort v2, ushort v3, ushort v4, ushort v5, ushort v6, ushort v7) + { + ushort v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = wasm_v128_load(v); + } + + ushort get0() const + { + return (ushort)wasm_i16x8_extract_lane(val, 0); // wasm_u16x8_extract_lane() unimplemented yet + } + + v128_t val; +}; + +struct v_int16x8 +{ + typedef short lane_type; + typedef v128_t vector_type; + enum { nlanes = 8 }; + + v_int16x8() {} + explicit v_int16x8(v128_t v) : val(v) {} + v_int16x8(short v0, short v1, short v2, short v3, short v4, short v5, short v6, short v7) + { + short v[] = {v0, v1, v2, v3, v4, v5, v6, v7}; + val = wasm_v128_load(v); + } + + short get0() const + { + return wasm_i16x8_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_uint32x4 +{ + typedef unsigned lane_type; + typedef v128_t vector_type; + enum { nlanes = 4 }; + + v_uint32x4() {} + explicit v_uint32x4(v128_t v) : val(v) {} + v_uint32x4(unsigned v0, unsigned v1, unsigned v2, unsigned v3) + { + unsigned v[] = {v0, v1, v2, v3}; + val = wasm_v128_load(v); + } + + unsigned get0() const + { + return (unsigned)wasm_i32x4_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_int32x4 +{ + typedef int lane_type; + typedef v128_t vector_type; + enum { nlanes = 4 }; + + v_int32x4() {} + explicit v_int32x4(v128_t v) : val(v) {} + v_int32x4(int v0, int v1, int v2, int v3) + { + int v[] = {v0, v1, v2, v3}; + val = wasm_v128_load(v); + } + + int get0() const + { + return wasm_i32x4_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_float32x4 +{ + typedef float lane_type; + typedef v128_t vector_type; + enum { nlanes = 4 }; + + v_float32x4() {} + explicit v_float32x4(v128_t v) : val(v) {} + v_float32x4(float v0, float v1, float v2, float v3) + { + float v[] = {v0, v1, v2, v3}; + val = wasm_v128_load(v); + } + + float get0() const + { + return wasm_f32x4_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_uint64x2 +{ + typedef uint64 lane_type; + typedef v128_t vector_type; + enum { nlanes = 2 }; + + v_uint64x2() {} + explicit v_uint64x2(v128_t v) : val(v) {} + v_uint64x2(uint64 v0, uint64 v1) + { + uint64 v[] = {v0, v1}; + val = wasm_v128_load(v); + } + + uint64 get0() const + { + return (uint64)wasm_i64x2_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_int64x2 +{ + typedef int64 lane_type; + typedef v128_t vector_type; + enum { nlanes = 2 }; + + v_int64x2() {} + explicit v_int64x2(v128_t v) : val(v) {} + v_int64x2(int64 v0, int64 v1) + { + int64 v[] = {v0, v1}; + val = wasm_v128_load(v); + } + + int64 get0() const + { + return wasm_i64x2_extract_lane(val, 0); + } + + v128_t val; +}; + +struct v_float64x2 +{ + typedef double lane_type; + typedef v128_t vector_type; + enum { nlanes = 2 }; + + v_float64x2() {} + explicit v_float64x2(v128_t v) : val(v) {} + v_float64x2(double v0, double v1) + { + double v[] = {v0, v1}; + val = wasm_v128_load(v); + } + + double get0() const + { + return wasm_f64x2_extract_lane(val, 0); + } + + v128_t val; +}; + +namespace +{ +#define OPENCV_HAL_IMPL_REINTERPRET_INT(ft, tt) \ +inline tt reinterpret_int(ft x) { union { ft l; tt i; } v; v.l = x; return v.i; } +OPENCV_HAL_IMPL_REINTERPRET_INT(uchar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(schar, schar) +OPENCV_HAL_IMPL_REINTERPRET_INT(ushort, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(short, short) +OPENCV_HAL_IMPL_REINTERPRET_INT(unsigned, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(int, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(float, int) +OPENCV_HAL_IMPL_REINTERPRET_INT(uint64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(int64, int64) +OPENCV_HAL_IMPL_REINTERPRET_INT(double, int64) + +static const unsigned char popCountTable[] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; +} // namespace + +static v128_t wasm_unpacklo_i8x16(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 0,16,1,17,2,18,3,19,4,20,5,21,6,22,7,23); +} + +static v128_t wasm_unpacklo_i16x8(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 0,1,16,17,2,3,18,19,4,5,20,21,6,7,22,23); +} + +static v128_t wasm_unpacklo_i32x4(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 0,1,2,3,16,17,18,19,4,5,6,7,20,21,22,23); +} + +static v128_t wasm_unpacklo_i64x2(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); +} + +static v128_t wasm_unpackhi_i8x16(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 8,24,9,25,10,26,11,27,12,28,13,29,14,30,15,31); +} + +static v128_t wasm_unpackhi_i16x8(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 8,9,24,25,10,11,26,27,12,13,28,29,14,15,30,31); +} + +static v128_t wasm_unpackhi_i32x4(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 8,9,10,11,24,25,26,27,12,13,14,15,28,29,30,31); +} + +static v128_t wasm_unpackhi_i64x2(v128_t a, v128_t b) { + return wasm_v8x16_shuffle(a, b, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); +} + +/** Convert **/ +// 8 >> 16 +inline v128_t v128_cvtu8x16_i16x8(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpacklo_i8x16(a, z); +} +inline v128_t v128_cvti8x16_i16x8(const v128_t& a) +{ return wasm_i16x8_shr(wasm_unpacklo_i8x16(a, a), 8); } +// 8 >> 32 +inline v128_t v128_cvtu8x16_i32x4(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpacklo_i16x8(wasm_unpacklo_i8x16(a, z), z); +} +inline v128_t v128_cvti8x16_i32x4(const v128_t& a) +{ + v128_t r = wasm_unpacklo_i8x16(a, a); + r = wasm_unpacklo_i8x16(r, r); + return wasm_i32x4_shr(r, 24); +} +// 16 >> 32 +inline v128_t v128_cvtu16x8_i32x4(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpacklo_i16x8(a, z); +} +inline v128_t v128_cvti16x8_i32x4(const v128_t& a) +{ return wasm_i32x4_shr(wasm_unpacklo_i16x8(a, a), 16); } +// 32 >> 64 +inline v128_t v128_cvtu32x4_i64x2(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpacklo_i32x4(a, z); +} +inline v128_t v128_cvti32x4_i64x2(const v128_t& a) +{ return wasm_unpacklo_i32x4(a, wasm_i32x4_shr(a, 31)); } + +// 16 << 8 +inline v128_t v128_cvtu8x16_i16x8_high(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpackhi_i8x16(a, z); +} +inline v128_t v128_cvti8x16_i16x8_high(const v128_t& a) +{ return wasm_i16x8_shr(wasm_unpackhi_i8x16(a, a), 8); } +// 32 << 16 +inline v128_t v128_cvtu16x8_i32x4_high(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpackhi_i16x8(a, z); +} +inline v128_t v128_cvti16x8_i32x4_high(const v128_t& a) +{ return wasm_i32x4_shr(wasm_unpackhi_i16x8(a, a), 16); } +// 64 << 32 +inline v128_t v128_cvtu32x4_i64x2_high(const v128_t& a) +{ + const v128_t z = wasm_i8x16_splat(0); + return wasm_unpackhi_i32x4(a, z); +} +inline v128_t v128_cvti32x4_i64x2_high(const v128_t& a) +{ return wasm_unpackhi_i32x4(a, wasm_i32x4_shr(a, 31)); } + +#define OPENCV_HAL_IMPL_WASM_INITVEC(_Tpvec, _Tp, suffix, zsuffix, _Tps) \ +inline _Tpvec v_setzero_##suffix() { return _Tpvec(wasm_##zsuffix##_splat((_Tps)0)); } \ +inline _Tpvec v_setall_##suffix(_Tp v) { return _Tpvec(wasm_##zsuffix##_splat((_Tps)v)); } \ +template inline _Tpvec v_reinterpret_as_##suffix(const _Tpvec0& a) \ +{ return _Tpvec(a.val); } + +OPENCV_HAL_IMPL_WASM_INITVEC(v_uint8x16, uchar, u8, i8x16, schar) +OPENCV_HAL_IMPL_WASM_INITVEC(v_int8x16, schar, s8, i8x16, schar) +OPENCV_HAL_IMPL_WASM_INITVEC(v_uint16x8, ushort, u16, i16x8, short) +OPENCV_HAL_IMPL_WASM_INITVEC(v_int16x8, short, s16, i16x8, short) +OPENCV_HAL_IMPL_WASM_INITVEC(v_uint32x4, unsigned, u32, i32x4, int) +OPENCV_HAL_IMPL_WASM_INITVEC(v_int32x4, int, s32, i32x4, int) +OPENCV_HAL_IMPL_WASM_INITVEC(v_float32x4, float, f32, f32x4, float) +OPENCV_HAL_IMPL_WASM_INITVEC(v_uint64x2, uint64, u64, i64x2, int64) +OPENCV_HAL_IMPL_WASM_INITVEC(v_int64x2, int64, s64, i64x2, int64) +OPENCV_HAL_IMPL_WASM_INITVEC(v_float64x2, double, f64, f64x2, double) + +//////////////// PACK /////////////// +inline v_uint8x16 v_pack(const v_uint16x8& a, const v_uint16x8& b) +{ + v128_t maxval = wasm_i16x8_splat(255); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u16x8_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_u16x8_gt(b.val, maxval)); + return v_uint8x16(wasm_v8x16_shuffle(a1, b1, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +inline v_int8x16 v_pack(const v_int16x8& a, const v_int16x8& b) +{ + v128_t maxval = wasm_i16x8_splat(127); + v128_t minval = wasm_i16x8_splat(-128); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i16x8_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_i16x8_gt(b.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i16x8_lt(a1, minval)); + v128_t b2 = wasm_v128_bitselect(minval, b1, wasm_i16x8_lt(b1, minval)); + return v_int8x16(wasm_v8x16_shuffle(a2, b2, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +inline v_uint16x8 v_pack(const v_uint32x4& a, const v_uint32x4& b) +{ + v128_t maxval = wasm_i32x4_splat(65535); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u32x4_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_u32x4_gt(b.val, maxval)); + return v_uint16x8(wasm_v8x16_shuffle(a1, b1, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} +inline v_int16x8 v_pack(const v_int32x4& a, const v_int32x4& b) +{ + v128_t maxval = wasm_i32x4_splat(32767); + v128_t minval = wasm_i32x4_splat(-32768); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i32x4_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_i32x4_gt(b.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i32x4_lt(a1, minval)); + v128_t b2 = wasm_v128_bitselect(minval, b1, wasm_i32x4_lt(b1, minval)); + return v_int16x8(wasm_v8x16_shuffle(a2, b2, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} +inline v_uint32x4 v_pack(const v_uint64x2& a, const v_uint64x2& b) +{ + return v_uint32x4(wasm_v8x16_shuffle(a.val, b.val, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27)); +} +inline v_int32x4 v_pack(const v_int64x2& a, const v_int64x2& b) +{ + return v_int32x4(wasm_v8x16_shuffle(a.val, b.val, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27)); +} +inline v_uint8x16 v_pack_u(const v_int16x8& a, const v_int16x8& b) +{ + v128_t maxval = wasm_i16x8_splat(255); + v128_t minval = wasm_i16x8_splat(0); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i16x8_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_i16x8_gt(b.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i16x8_lt(a1, minval)); + v128_t b2 = wasm_v128_bitselect(minval, b1, wasm_i16x8_lt(b1, minval)); + return v_uint8x16(wasm_v8x16_shuffle(a2, b2, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +inline v_uint16x8 v_pack_u(const v_int32x4& a, const v_int32x4& b) +{ + v128_t maxval = wasm_i32x4_splat(65535); + v128_t minval = wasm_i32x4_splat(0); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i32x4_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_i32x4_gt(b.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i32x4_lt(a1, minval)); + v128_t b2 = wasm_v128_bitselect(minval, b1, wasm_i32x4_lt(b1, minval)); + return v_uint16x8(wasm_v8x16_shuffle(a2, b2, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} + +template +inline v_uint8x16 v_rshr_pack(const v_uint16x8& a, const v_uint16x8& b) +{ + v128_t delta = wasm_i16x8_splat(((short)1 << (n-1))); + v128_t a1 = wasm_u16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t b1 = wasm_u16x8_shr(wasm_i16x8_add(b.val, delta), n); + v128_t maxval = wasm_i16x8_splat(255); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_u16x8_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_u16x8_gt(b1, maxval)); + return v_uint8x16(wasm_v8x16_shuffle(a2, b2, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +template +inline v_int8x16 v_rshr_pack(const v_int16x8& a, const v_int16x8& b) +{ + v128_t delta = wasm_i16x8_splat(((short)1 << (n-1))); + v128_t a1 = wasm_i16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t b1 = wasm_i16x8_shr(wasm_i16x8_add(b.val, delta), n); + v128_t maxval = wasm_i16x8_splat(127); + v128_t minval = wasm_i16x8_splat(-128); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i16x8_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_i16x8_gt(b1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i16x8_lt(a1, minval)); + v128_t b3 = wasm_v128_bitselect(minval, b2, wasm_i16x8_lt(b1, minval)); + return v_int8x16(wasm_v8x16_shuffle(a3, b3, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +template +inline v_uint16x8 v_rshr_pack(const v_uint32x4& a, const v_uint32x4& b) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_u32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t b1 = wasm_u32x4_shr(wasm_i32x4_add(b.val, delta), n); + v128_t maxval = wasm_i32x4_splat(65535); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_u32x4_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_u32x4_gt(b1, maxval)); + return v_uint16x8(wasm_v8x16_shuffle(a2, b2, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} +template +inline v_int16x8 v_rshr_pack(const v_int32x4& a, const v_int32x4& b) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_i32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t b1 = wasm_i32x4_shr(wasm_i32x4_add(b.val, delta), n); + v128_t maxval = wasm_i32x4_splat(32767); + v128_t minval = wasm_i16x8_splat(-32768); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i32x4_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_i32x4_gt(b1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i32x4_lt(a1, minval)); + v128_t b3 = wasm_v128_bitselect(minval, b2, wasm_i32x4_lt(b1, minval)); + return v_int16x8(wasm_v8x16_shuffle(a3, b3, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} +template +inline v_uint32x4 v_rshr_pack(const v_uint64x2& a, const v_uint64x2& b) +{ + v128_t delta = wasm_i64x2_splat(((int64)1 << (n-1))); + v128_t a1 = wasm_u64x2_shr(wasm_i64x2_add(a.val, delta), n); + v128_t b1 = wasm_u64x2_shr(wasm_i64x2_add(b.val, delta), n); + return v_uint32x4(wasm_v8x16_shuffle(a1, b1, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27)); +} +template +inline v_int32x4 v_rshr_pack(const v_int64x2& a, const v_int64x2& b) +{ + v128_t delta = wasm_i64x2_splat(((int64)1 << (n-1))); + v128_t a1 = wasm_i64x2_shr(wasm_i64x2_add(a.val, delta), n); + v128_t b1 = wasm_i64x2_shr(wasm_i64x2_add(b.val, delta), n); + return v_int32x4(wasm_v8x16_shuffle(a1, b1, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27)); +} +template +inline v_uint8x16 v_rshr_pack_u(const v_int16x8& a, const v_int16x8& b) +{ + v128_t delta = wasm_i16x8_splat(((short)1 << (n-1))); + v128_t a1 = wasm_i16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t b1 = wasm_i16x8_shr(wasm_i16x8_add(b.val, delta), n); + v128_t maxval = wasm_i16x8_splat(255); + v128_t minval = wasm_i16x8_splat(0); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i16x8_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_i16x8_gt(b1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i16x8_lt(a1, minval)); + v128_t b3 = wasm_v128_bitselect(minval, b2, wasm_i16x8_lt(b1, minval)); + return v_uint8x16(wasm_v8x16_shuffle(a3, b3, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} +template +inline v_uint16x8 v_rshr_pack_u(const v_int32x4& a, const v_int32x4& b) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_i32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t b1 = wasm_i32x4_shr(wasm_i32x4_add(b.val, delta), n); + v128_t maxval = wasm_i32x4_splat(65535); + v128_t minval = wasm_i16x8_splat(0); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i32x4_gt(a1, maxval)); + v128_t b2 = wasm_v128_bitselect(maxval, b1, wasm_i32x4_gt(b1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i32x4_lt(a1, minval)); + v128_t b3 = wasm_v128_bitselect(minval, b2, wasm_i32x4_lt(b1, minval)); + return v_uint16x8(wasm_v8x16_shuffle(a3, b3, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29)); +} + +inline void v_pack_store(uchar* ptr, const v_uint16x8& a) +{ + v128_t maxval = wasm_i16x8_splat(255); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u16x8_gt(a.val, maxval)); + v128_t r = wasm_v8x16_shuffle(a1, a1, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + uchar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_store(schar* ptr, const v_int16x8& a) +{ + v128_t maxval = wasm_i16x8_splat(127); + v128_t minval = wasm_i16x8_splat(-128); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i16x8_gt(a.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i16x8_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + schar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_store(ushort* ptr, const v_uint32x4& a) +{ + v128_t maxval = wasm_i32x4_splat(65535); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u32x4_gt(a.val, maxval)); + v128_t r = wasm_v8x16_shuffle(a1, a1, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + ushort t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_store(short* ptr, const v_int32x4& a) +{ + v128_t maxval = wasm_i32x4_splat(32767); + v128_t minval = wasm_i32x4_splat(-32768); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i32x4_gt(a.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i32x4_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + short t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_store(unsigned* ptr, const v_uint64x2& a) +{ + v128_t r = wasm_v8x16_shuffle(a.val, a.val, 0,1,2,3,8,9,10,11,0,1,2,3,8,9,10,11); + unsigned t_ptr[4]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<2; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_store(int* ptr, const v_int64x2& a) +{ + v128_t r = wasm_v8x16_shuffle(a.val, a.val, 0,1,2,3,8,9,10,11,0,1,2,3,8,9,10,11); + int t_ptr[4]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<2; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_u_store(uchar* ptr, const v_int16x8& a) +{ + v128_t maxval = wasm_i16x8_splat(255); + v128_t minval = wasm_i16x8_splat(0); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i16x8_gt(a.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i16x8_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + uchar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +inline void v_pack_u_store(ushort* ptr, const v_int32x4& a) +{ + v128_t maxval = wasm_i32x4_splat(65535); + v128_t minval = wasm_i32x4_splat(0); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_i32x4_gt(a.val, maxval)); + v128_t a2 = wasm_v128_bitselect(minval, a1, wasm_i32x4_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + ushort t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} + +template +inline void v_rshr_pack_store(uchar* ptr, const v_uint16x8& a) +{ + v128_t delta = wasm_i16x8_splat((short)(1 << (n-1))); + v128_t a1 = wasm_u16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t maxval = wasm_i16x8_splat(255); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_u16x8_gt(a1, maxval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + uchar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_store(schar* ptr, const v_int16x8& a) +{ + v128_t delta = wasm_i16x8_splat(((short)1 << (n-1))); + v128_t a1 = wasm_i16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t maxval = wasm_i16x8_splat(127); + v128_t minval = wasm_i16x8_splat(-128); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i16x8_gt(a1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i16x8_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a3, a3, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + schar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_store(ushort* ptr, const v_uint32x4& a) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_u32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t maxval = wasm_i32x4_splat(65535); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_u32x4_gt(a1, maxval)); + v128_t r = wasm_v8x16_shuffle(a2, a2, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + ushort t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_store(short* ptr, const v_int32x4& a) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_i32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t maxval = wasm_i32x4_splat(32767); + v128_t minval = wasm_i32x4_splat(-32768); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i32x4_gt(a1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i32x4_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a3, a3, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + short t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_store(unsigned* ptr, const v_uint64x2& a) +{ + v128_t delta = wasm_i64x2_splat(((int64)1 << (n-1))); + v128_t a1 = wasm_u64x2_shr(wasm_i64x2_add(a.val, delta), n); + v128_t r = wasm_v8x16_shuffle(a1, a1, 0,1,2,3,8,9,10,11,0,1,2,3,8,9,10,11); + unsigned t_ptr[4]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<2; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_store(int* ptr, const v_int64x2& a) +{ + v128_t delta = wasm_i64x2_splat(((int64)1 << (n-1))); + v128_t a1 = wasm_i64x2_shr(wasm_i64x2_add(a.val, delta), n); + v128_t r = wasm_v8x16_shuffle(a1, a1, 0,1,2,3,8,9,10,11,0,1,2,3,8,9,10,11); + int t_ptr[4]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<2; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_u_store(uchar* ptr, const v_int16x8& a) +{ + v128_t delta = wasm_i16x8_splat(((short)1 << (n-1))); + v128_t a1 = wasm_i16x8_shr(wasm_i16x8_add(a.val, delta), n); + v128_t maxval = wasm_i16x8_splat(255); + v128_t minval = wasm_i16x8_splat(0); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i16x8_gt(a1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i16x8_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a3, a3, 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14); + uchar t_ptr[16]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<8; ++i) { + ptr[i] = t_ptr[i]; + } +} +template +inline void v_rshr_pack_u_store(ushort* ptr, const v_int32x4& a) +{ + v128_t delta = wasm_i32x4_splat(((int)1 << (n-1))); + v128_t a1 = wasm_i32x4_shr(wasm_i32x4_add(a.val, delta), n); + v128_t maxval = wasm_i32x4_splat(65535); + v128_t minval = wasm_i32x4_splat(0); + v128_t a2 = wasm_v128_bitselect(maxval, a1, wasm_i32x4_gt(a1, maxval)); + v128_t a3 = wasm_v128_bitselect(minval, a2, wasm_i32x4_lt(a1, minval)); + v128_t r = wasm_v8x16_shuffle(a3, a3, 0,1,4,5,8,9,12,13,0,1,4,5,8,9,12,13); + ushort t_ptr[8]; + wasm_v128_store(t_ptr, r); + for (int i=0; i<4; ++i) { + ptr[i] = t_ptr[i]; + } +} + +inline v_uint8x16 v_pack_b(const v_uint16x8& a, const v_uint16x8& b) +{ + v128_t maxval = wasm_i16x8_splat(255); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u16x8_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_u16x8_gt(b.val, maxval)); + return v_uint8x16(wasm_v8x16_shuffle(a1, b1, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30)); +} + +inline v_uint8x16 v_pack_b(const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d) +{ + v128_t maxval = wasm_i32x4_splat(255); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, wasm_u32x4_gt(a.val, maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, wasm_u32x4_gt(b.val, maxval)); + v128_t c1 = wasm_v128_bitselect(maxval, c.val, wasm_u32x4_gt(c.val, maxval)); + v128_t d1 = wasm_v128_bitselect(maxval, d.val, wasm_u32x4_gt(d.val, maxval)); + v128_t ab = wasm_v8x16_shuffle(a1, b1, 0,4,8,12,16,20,24,28,0,4,8,12,16,20,24,28); + v128_t cd = wasm_v8x16_shuffle(c1, d1, 0,4,8,12,16,20,24,28,0,4,8,12,16,20,24,28); + return v_uint8x16(wasm_v8x16_shuffle(ab, cd, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23)); +} + +inline v_uint8x16 v_pack_b(const v_uint64x2& a, const v_uint64x2& b, const v_uint64x2& c, + const v_uint64x2& d, const v_uint64x2& e, const v_uint64x2& f, + const v_uint64x2& g, const v_uint64x2& h) +{ + v128_t maxval = wasm_i32x4_splat(255); + v128_t a1 = wasm_v128_bitselect(maxval, a.val, ((__u64x2)(a.val) > (__u64x2)maxval)); + v128_t b1 = wasm_v128_bitselect(maxval, b.val, ((__u64x2)(b.val) > (__u64x2)maxval)); + v128_t c1 = wasm_v128_bitselect(maxval, c.val, ((__u64x2)(c.val) > (__u64x2)maxval)); + v128_t d1 = wasm_v128_bitselect(maxval, d.val, ((__u64x2)(d.val) > (__u64x2)maxval)); + v128_t e1 = wasm_v128_bitselect(maxval, e.val, ((__u64x2)(e.val) > (__u64x2)maxval)); + v128_t f1 = wasm_v128_bitselect(maxval, f.val, ((__u64x2)(f.val) > (__u64x2)maxval)); + v128_t g1 = wasm_v128_bitselect(maxval, g.val, ((__u64x2)(g.val) > (__u64x2)maxval)); + v128_t h1 = wasm_v128_bitselect(maxval, h.val, ((__u64x2)(h.val) > (__u64x2)maxval)); + v128_t ab = wasm_v8x16_shuffle(a1, b1, 0,8,16,24,0,8,16,24,0,8,16,24,0,8,16,24); + v128_t cd = wasm_v8x16_shuffle(c1, d1, 0,8,16,24,0,8,16,24,0,8,16,24,0,8,16,24); + v128_t ef = wasm_v8x16_shuffle(e1, f1, 0,8,16,24,0,8,16,24,0,8,16,24,0,8,16,24); + v128_t gh = wasm_v8x16_shuffle(g1, h1, 0,8,16,24,0,8,16,24,0,8,16,24,0,8,16,24); + v128_t abcd = wasm_v8x16_shuffle(ab, cd, 0,1,2,3,16,17,18,19,0,1,2,3,16,17,18,19); + v128_t efgh = wasm_v8x16_shuffle(ef, gh, 0,1,2,3,16,17,18,19,0,1,2,3,16,17,18,19); + return v_uint8x16(wasm_v8x16_shuffle(abcd, efgh, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23)); +} + +inline v_float32x4 v_matmul(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& m3) +{ + v128_t v0 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 0)); + v128_t v1 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 1)); + v128_t v2 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 2)); + v128_t v3 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 3)); + v0 = wasm_f32x4_mul(v0, m0.val); + v1 = wasm_f32x4_mul(v1, m1.val); + v2 = wasm_f32x4_mul(v2, m2.val); + v3 = wasm_f32x4_mul(v3, m3.val); + + return v_float32x4(wasm_f32x4_add(wasm_f32x4_add(v0, v1), wasm_f32x4_add(v2, v3))); +} + +inline v_float32x4 v_matmuladd(const v_float32x4& v, const v_float32x4& m0, + const v_float32x4& m1, const v_float32x4& m2, + const v_float32x4& a) +{ + v128_t v0 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 0)); + v128_t v1 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 1)); + v128_t v2 = wasm_f32x4_splat(wasm_f32x4_extract_lane(v.val, 2)); + v0 = wasm_f32x4_mul(v0, m0.val); + v1 = wasm_f32x4_mul(v1, m1.val); + v2 = wasm_f32x4_mul(v2, m2.val); + + return v_float32x4(wasm_f32x4_add(wasm_f32x4_add(v0, v1), wasm_f32x4_add(v2, a.val))); +} + +#define OPENCV_HAL_IMPL_WASM_BIN_OP(bin_op, _Tpvec, intrin) \ +inline _Tpvec operator bin_op (const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} \ +inline _Tpvec& operator bin_op##= (_Tpvec& a, const _Tpvec& b) \ +{ \ + a.val = intrin(a.val, b.val); \ + return a; \ +} + +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_uint8x16, wasm_u8x16_add_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_uint8x16, wasm_u8x16_sub_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_int8x16, wasm_i8x16_add_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_int8x16, wasm_i8x16_sub_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_uint16x8, wasm_u16x8_add_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_uint16x8, wasm_u16x8_sub_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_int16x8, wasm_i16x8_add_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_int16x8, wasm_i16x8_sub_saturate) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_uint32x4, wasm_i32x4_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_uint32x4, wasm_i32x4_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(*, v_uint32x4, wasm_i32x4_mul) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_int32x4, wasm_i32x4_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_int32x4, wasm_i32x4_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(*, v_int32x4, wasm_i32x4_mul) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_float32x4, wasm_f32x4_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_float32x4, wasm_f32x4_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(*, v_float32x4, wasm_f32x4_mul) +OPENCV_HAL_IMPL_WASM_BIN_OP(/, v_float32x4, wasm_f32x4_div) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_uint64x2, wasm_i64x2_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_uint64x2, wasm_i64x2_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_int64x2, wasm_i64x2_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_int64x2, wasm_i64x2_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(+, v_float64x2, wasm_f64x2_add) +OPENCV_HAL_IMPL_WASM_BIN_OP(-, v_float64x2, wasm_f64x2_sub) +OPENCV_HAL_IMPL_WASM_BIN_OP(*, v_float64x2, wasm_f64x2_mul) +OPENCV_HAL_IMPL_WASM_BIN_OP(/, v_float64x2, wasm_f64x2_div) + +// saturating multiply 8-bit, 16-bit +#define OPENCV_HAL_IMPL_WASM_MUL_SAT(_Tpvec, _Tpwvec) \ +inline _Tpvec operator * (const _Tpvec& a, const _Tpvec& b) \ +{ \ + _Tpwvec c, d; \ + v_mul_expand(a, b, c, d); \ + return v_pack(c, d); \ +} \ +inline _Tpvec& operator *= (_Tpvec& a, const _Tpvec& b) \ +{ a = a * b; return a; } + +OPENCV_HAL_IMPL_WASM_MUL_SAT(v_uint8x16, v_uint16x8) +OPENCV_HAL_IMPL_WASM_MUL_SAT(v_int8x16, v_int16x8) +OPENCV_HAL_IMPL_WASM_MUL_SAT(v_uint16x8, v_uint32x4) +OPENCV_HAL_IMPL_WASM_MUL_SAT(v_int16x8, v_int32x4) + +// Multiply and expand +inline void v_mul_expand(const v_uint8x16& a, const v_uint8x16& b, + v_uint16x8& c, v_uint16x8& d) +{ + v_uint16x8 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int8x16& a, const v_int8x16& b, + v_int16x8& c, v_int16x8& d) +{ + v_int16x8 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c = v_mul_wrap(a0, b0); + d = v_mul_wrap(a1, b1); +} + +inline void v_mul_expand(const v_int16x8& a, const v_int16x8& b, + v_int32x4& c, v_int32x4& d) +{ + v_int32x4 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c.val = wasm_i32x4_mul(a0.val, b0.val); + d.val = wasm_i32x4_mul(a1.val, b1.val); +} + +inline void v_mul_expand(const v_uint16x8& a, const v_uint16x8& b, + v_uint32x4& c, v_uint32x4& d) +{ + v_uint32x4 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c.val = wasm_i32x4_mul(a0.val, b0.val); + d.val = wasm_i32x4_mul(a1.val, b1.val); +} + +inline void v_mul_expand(const v_uint32x4& a, const v_uint32x4& b, + v_uint64x2& c, v_uint64x2& d) +{ + v_uint64x2 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + c.val = ((__u64x2)(a0.val) * (__u64x2)(b0.val)); + d.val = ((__u64x2)(a1.val) * (__u64x2)(b1.val)); +} + +inline v_int16x8 v_mul_hi(const v_int16x8& a, const v_int16x8& b) +{ + v_int32x4 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + v128_t c = wasm_i32x4_mul(a0.val, b0.val); + v128_t d = wasm_i32x4_mul(a1.val, b1.val); + return v_int16x8(wasm_v8x16_shuffle(c, d, 2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31)); +} +inline v_uint16x8 v_mul_hi(const v_uint16x8& a, const v_uint16x8& b) +{ + v_uint32x4 a0, a1, b0, b1; + v_expand(a, a0, a1); + v_expand(b, b0, b1); + v128_t c = wasm_i32x4_mul(a0.val, b0.val); + v128_t d = wasm_i32x4_mul(a1.val, b1.val); + return v_uint16x8(wasm_v8x16_shuffle(c, d, 2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31)); +} + +//////// Dot Product //////// + +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b) +{ + v128_t a0 = wasm_i32x4_shr(wasm_i32x4_shl(a.val, 16), 16); + v128_t a1 = wasm_i32x4_shr(a.val, 16); + v128_t b0 = wasm_i32x4_shr(wasm_i32x4_shl(b.val, 16), 16); + v128_t b1 = wasm_i32x4_shr(b.val, 16); + v128_t c = wasm_i32x4_mul(a0, b0); + v128_t d = wasm_i32x4_mul(a1, b1); + return v_int32x4(wasm_i32x4_add(c, d)); +} + +inline v_int32x4 v_dotprod(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b) + c; } + +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b) +{ + v128_t a0 = wasm_i64x2_shr(wasm_i64x2_shl(a.val, 32), 32); + v128_t a1 = wasm_i64x2_shr(a.val, 32); + v128_t b0 = wasm_i64x2_shr(wasm_i64x2_shl(b.val, 32), 32); + v128_t b1 = wasm_i64x2_shr(b.val, 32); + v128_t c = (v128_t)((__i64x2)a0 * (__i64x2)b0); + v128_t d = (v128_t)((__i64x2)a1 * (__i64x2)b1); + return v_int64x2(wasm_i64x2_add(c, d)); +} +inline v_int64x2 v_dotprod(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ + return v_dotprod(a, b) + c; +} + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b) +{ + v128_t a0 = wasm_u16x8_shr(wasm_i16x8_shl(a.val, 8), 8); + v128_t a1 = wasm_u16x8_shr(a.val, 8); + v128_t b0 = wasm_u16x8_shr(wasm_i16x8_shl(b.val, 8), 8); + v128_t b1 = wasm_u16x8_shr(b.val, 8); + return v_uint32x4(( + v_dotprod(v_int16x8(a0), v_int16x8(b0)) + + v_dotprod(v_int16x8(a1), v_int16x8(b1))).val + ); +} +inline v_uint32x4 v_dotprod_expand(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b) +{ + v128_t a0 = wasm_i16x8_shr(wasm_i16x8_shl(a.val, 8), 8); + v128_t a1 = wasm_i16x8_shr(a.val, 8); + v128_t b0 = wasm_i16x8_shr(wasm_i16x8_shl(b.val, 8), 8); + v128_t b1 = wasm_i16x8_shr(b.val, 8); + return v_int32x4( + v_dotprod(v_int16x8(a0), v_int16x8(b0)) + + v_dotprod(v_int16x8(a1), v_int16x8(b1)) + ); +} +inline v_int32x4 v_dotprod_expand(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b) + c; } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b) +{ + v128_t a0 = wasm_u32x4_shr(wasm_i32x4_shl(a.val, 16), 16); + v128_t a1 = wasm_u32x4_shr(a.val, 16); + v128_t b0 = wasm_u32x4_shr(wasm_i32x4_shl(b.val, 16), 16); + v128_t b1 = wasm_u32x4_shr(b.val, 16); + return v_uint64x2(( + v_dotprod(v_int32x4(a0), v_int32x4(b0)) + + v_dotprod(v_int32x4(a1), v_int32x4(b1))).val + ); +} +inline v_uint64x2 v_dotprod_expand(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b) +{ + v128_t a0 = wasm_i32x4_shr(wasm_i32x4_shl(a.val, 16), 16); + v128_t a1 = wasm_i32x4_shr(a.val, 16); + v128_t b0 = wasm_i32x4_shr(wasm_i32x4_shl(b.val, 16), 16); + v128_t b1 = wasm_i32x4_shr(b.val, 16); + return v_int64x2(( + v_dotprod(v_int32x4(a0), v_int32x4(b0)) + + v_dotprod(v_int32x4(a1), v_int32x4(b1))) + ); +} + +inline v_int64x2 v_dotprod_expand(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b) +{ return v_cvt_f64(v_dotprod(a, b)); } +inline v_float64x2 v_dotprod_expand(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b) + c; } + +//////// Fast Dot Product //////// + +// 16 >> 32 +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod(a, b); } +inline v_int32x4 v_dotprod_fast(const v_int16x8& a, const v_int16x8& b, const v_int32x4& c) +{ return v_dotprod(a, b, c); } + +// 32 >> 64 +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod(a, b); } +inline v_int64x2 v_dotprod_fast(const v_int32x4& a, const v_int32x4& b, const v_int64x2& c) +{ return v_dotprod(a, b, c); } + +// 8 >> 32 +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_uint32x4 v_dotprod_expand_fast(const v_uint8x16& a, const v_uint8x16& b, const v_uint32x4& c) +{ return v_dotprod_expand(a, b, c); } +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b) +{ return v_dotprod_expand(a, b); } +inline v_int32x4 v_dotprod_expand_fast(const v_int8x16& a, const v_int8x16& b, const v_int32x4& c) +{ return v_dotprod_expand(a, b, c); } + +// 16 >> 64 +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b) +{ return v_dotprod_expand(a, b); } +inline v_uint64x2 v_dotprod_expand_fast(const v_uint16x8& a, const v_uint16x8& b, const v_uint64x2& c) +{ return v_dotprod_expand(a, b, c); } +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b) +{ return v_dotprod_expand(a, b); } +inline v_int64x2 v_dotprod_expand_fast(const v_int16x8& a, const v_int16x8& b, const v_int64x2& c) +{ return v_dotprod_expand(a, b, c); } + +// 32 >> 64f +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b) +{ return v_dotprod_expand(a, b); } +inline v_float64x2 v_dotprod_expand_fast(const v_int32x4& a, const v_int32x4& b, const v_float64x2& c) +{ return v_dotprod_expand(a, b, c); } + +#define OPENCV_HAL_IMPL_WASM_LOGIC_OP(_Tpvec) \ +OPENCV_HAL_IMPL_WASM_BIN_OP(&, _Tpvec, wasm_v128_and) \ +OPENCV_HAL_IMPL_WASM_BIN_OP(|, _Tpvec, wasm_v128_or) \ +OPENCV_HAL_IMPL_WASM_BIN_OP(^, _Tpvec, wasm_v128_xor) \ +inline _Tpvec operator ~ (const _Tpvec& a) \ +{ \ + return _Tpvec(wasm_v128_not(a.val)); \ +} + +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_uint8x16) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_int8x16) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_uint16x8) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_int16x8) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_uint32x4) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_int32x4) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_uint64x2) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_int64x2) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_float32x4) +OPENCV_HAL_IMPL_WASM_LOGIC_OP(v_float64x2) + +inline v_float32x4 v_sqrt(const v_float32x4& x) +{ + return v_float32x4(wasm_f32x4_sqrt(x.val)); +} + +inline v_float32x4 v_invsqrt(const v_float32x4& x) +{ + const v128_t _1_0 = wasm_f32x4_splat(1.0); + return v_float32x4(wasm_f32x4_div(_1_0, wasm_f32x4_sqrt(x.val))); +} + +inline v_float64x2 v_sqrt(const v_float64x2& x) +{ + return v_float64x2(wasm_f64x2_sqrt(x.val)); +} + +inline v_float64x2 v_invsqrt(const v_float64x2& x) +{ + const v128_t _1_0 = wasm_f64x2_splat(1.0); + return v_float64x2(wasm_f64x2_div(_1_0, wasm_f64x2_sqrt(x.val))); +} + +#define OPENCV_HAL_IMPL_WASM_ABS_INT_FUNC(_Tpuvec, _Tpsvec, suffix, zsuffix, shiftWidth) \ +inline _Tpuvec v_abs(const _Tpsvec& x) \ +{ \ + v128_t s = wasm_##suffix##_shr(x.val, shiftWidth); \ + v128_t f = wasm_##zsuffix##_shr(x.val, shiftWidth); \ + return _Tpuvec(wasm_##zsuffix##_add(wasm_v128_xor(x.val, f), s)); \ +} + +OPENCV_HAL_IMPL_WASM_ABS_INT_FUNC(v_uint8x16, v_int8x16, u8x16, i8x16, 7) +OPENCV_HAL_IMPL_WASM_ABS_INT_FUNC(v_uint16x8, v_int16x8, u16x8, i16x8, 15) +OPENCV_HAL_IMPL_WASM_ABS_INT_FUNC(v_uint32x4, v_int32x4, u32x4, i32x4, 31) + +inline v_float32x4 v_abs(const v_float32x4& x) +{ return v_float32x4(wasm_f32x4_abs(x.val)); } +inline v_float64x2 v_abs(const v_float64x2& x) +{ + return v_float64x2(wasm_f64x2_abs(x.val)); +} + +// TODO: exp, log, sin, cos + +#define OPENCV_HAL_IMPL_WASM_BIN_FUNC(_Tpvec, func, intrin) \ +inline _Tpvec func(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(intrin(a.val, b.val)); \ +} + +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_float32x4, v_min, wasm_f32x4_min) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_float32x4, v_max, wasm_f32x4_max) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_float64x2, v_min, wasm_f64x2_min) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_float64x2, v_max, wasm_f64x2_max) + +#define OPENCV_HAL_IMPL_WASM_MINMAX_S_INIT_FUNC(_Tpvec, suffix) \ +inline _Tpvec v_min(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(wasm_v128_bitselect(b.val, a.val, wasm_##suffix##_gt(a.val, b.val))); \ +} \ +inline _Tpvec v_max(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(wasm_v128_bitselect(a.val, b.val, wasm_##suffix##_gt(a.val, b.val))); \ +} + +OPENCV_HAL_IMPL_WASM_MINMAX_S_INIT_FUNC(v_int8x16, i8x16) +OPENCV_HAL_IMPL_WASM_MINMAX_S_INIT_FUNC(v_int16x8, i16x8) +OPENCV_HAL_IMPL_WASM_MINMAX_S_INIT_FUNC(v_int32x4, i32x4) + +#define OPENCV_HAL_IMPL_WASM_MINMAX_U_INIT_FUNC(_Tpvec, suffix, deltaNum) \ +inline _Tpvec v_min(const _Tpvec& a, const _Tpvec& b) \ +{ \ + v128_t delta = wasm_##suffix##_splat(deltaNum); \ + v128_t mask = wasm_##suffix##_gt(wasm_v128_xor(a.val, delta), wasm_v128_xor(b.val, delta)); \ + return _Tpvec(wasm_v128_bitselect(b.val, a.val, mask)); \ +} \ +inline _Tpvec v_max(const _Tpvec& a, const _Tpvec& b) \ +{ \ + v128_t delta = wasm_##suffix##_splat(deltaNum); \ + v128_t mask = wasm_##suffix##_gt(wasm_v128_xor(a.val, delta), wasm_v128_xor(b.val, delta)); \ + return _Tpvec(wasm_v128_bitselect(a.val, b.val, mask)); \ +} + +OPENCV_HAL_IMPL_WASM_MINMAX_U_INIT_FUNC(v_uint8x16, i8x16, (schar)0x80) +OPENCV_HAL_IMPL_WASM_MINMAX_U_INIT_FUNC(v_uint16x8, i16x8, (short)0x8000) +OPENCV_HAL_IMPL_WASM_MINMAX_U_INIT_FUNC(v_uint32x4, i32x4, (int)0x80000000) + +#define OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(_Tpvec, suffix, esuffix) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##esuffix##_eq(a.val, b.val)); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##esuffix##_ne(a.val, b.val)); } \ +inline _Tpvec operator < (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##suffix##_lt(a.val, b.val)); } \ +inline _Tpvec operator > (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##suffix##_gt(a.val, b.val)); } \ +inline _Tpvec operator <= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##suffix##_le(a.val, b.val)); } \ +inline _Tpvec operator >= (const _Tpvec& a, const _Tpvec& b) \ +{ return _Tpvec(wasm_##suffix##_ge(a.val, b.val)); } + +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_uint8x16, u8x16, i8x16) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_int8x16, i8x16, i8x16) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_uint16x8, u16x8, i16x8) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_int16x8, i16x8, i16x8) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_uint32x4, u32x4, i32x4) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_int32x4, i32x4, i32x4) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_float32x4, f32x4, f32x4) +OPENCV_HAL_IMPL_WASM_INIT_CMP_OP(v_float64x2, f64x2, f64x2) + +#define OPENCV_HAL_IMPL_WASM_64BIT_CMP_OP(_Tpvec, cast) \ +inline _Tpvec operator == (const _Tpvec& a, const _Tpvec& b) \ +{ return cast(v_reinterpret_as_f64(a) == v_reinterpret_as_f64(b)); } \ +inline _Tpvec operator != (const _Tpvec& a, const _Tpvec& b) \ +{ return cast(v_reinterpret_as_f64(a) != v_reinterpret_as_f64(b)); } + +OPENCV_HAL_IMPL_WASM_64BIT_CMP_OP(v_uint64x2, v_reinterpret_as_u64) +OPENCV_HAL_IMPL_WASM_64BIT_CMP_OP(v_int64x2, v_reinterpret_as_s64) + +inline v_float32x4 v_not_nan(const v_float32x4& a) +{ + v128_t z = wasm_i32x4_splat(0x7fffffff); + v128_t t = wasm_i32x4_splat(0x7f800000); + return v_float32x4(wasm_u32x4_lt(wasm_v128_and(a.val, z), t)); +} +inline v_float64x2 v_not_nan(const v_float64x2& a) +{ + v128_t z = wasm_i64x2_splat(0x7fffffffffffffff); + v128_t t = wasm_i64x2_splat(0x7ff0000000000000); + return v_float64x2((__u64x2)(wasm_v128_and(a.val, z)) < (__u64x2)t); +} + +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint8x16, v_add_wrap, wasm_i8x16_add) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int8x16, v_add_wrap, wasm_i8x16_add) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint16x8, v_add_wrap, wasm_i16x8_add) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int16x8, v_add_wrap, wasm_i16x8_add) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint8x16, v_sub_wrap, wasm_i8x16_sub) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int8x16, v_sub_wrap, wasm_i8x16_sub) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint16x8, v_sub_wrap, wasm_i16x8_sub) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int16x8, v_sub_wrap, wasm_i16x8_sub) +#if (__EMSCRIPTEN_major__ * 1000000 + __EMSCRIPTEN_minor__ * 1000 + __EMSCRIPTEN_tiny__) >= (1039012) +// details: https://github.com/opencv/opencv/issues/18097 ( https://github.com/emscripten-core/emscripten/issues/12018 ) +// 1.39.12: https://github.com/emscripten-core/emscripten/commit/cd801d0f110facfd694212a3c8b2ed2ffcd630e2 +inline v_uint8x16 v_mul_wrap(const v_uint8x16& a, const v_uint8x16& b) +{ + uchar a_[16], b_[16]; + wasm_v128_store(a_, a.val); + wasm_v128_store(b_, b.val); + for (int i = 0; i < 16; i++) + a_[i] = (uchar)(a_[i] * b_[i]); + return v_uint8x16(wasm_v128_load(a_)); +} +inline v_int8x16 v_mul_wrap(const v_int8x16& a, const v_int8x16& b) +{ + schar a_[16], b_[16]; + wasm_v128_store(a_, a.val); + wasm_v128_store(b_, b.val); + for (int i = 0; i < 16; i++) + a_[i] = (schar)(a_[i] * b_[i]); + return v_int8x16(wasm_v128_load(a_)); +} +#else +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint8x16, v_mul_wrap, wasm_i8x16_mul) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int8x16, v_mul_wrap, wasm_i8x16_mul) +#endif +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_uint16x8, v_mul_wrap, wasm_i16x8_mul) +OPENCV_HAL_IMPL_WASM_BIN_FUNC(v_int16x8, v_mul_wrap, wasm_i16x8_mul) + + +/** Absolute difference **/ + +inline v_uint8x16 v_absdiff(const v_uint8x16& a, const v_uint8x16& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint16x8 v_absdiff(const v_uint16x8& a, const v_uint16x8& b) +{ return v_add_wrap(a - b, b - a); } +inline v_uint32x4 v_absdiff(const v_uint32x4& a, const v_uint32x4& b) +{ return v_max(a, b) - v_min(a, b); } + +inline v_uint8x16 v_absdiff(const v_int8x16& a, const v_int8x16& b) +{ + v_int8x16 d = v_sub_wrap(a, b); + v_int8x16 m = a < b; + return v_reinterpret_as_u8(v_sub_wrap(d ^ m, m)); +} +inline v_uint16x8 v_absdiff(const v_int16x8& a, const v_int16x8& b) +{ + return v_reinterpret_as_u16(v_sub_wrap(v_max(a, b), v_min(a, b))); +} +inline v_uint32x4 v_absdiff(const v_int32x4& a, const v_int32x4& b) +{ + v_int32x4 d = a - b; + v_int32x4 m = a < b; + return v_reinterpret_as_u32((d ^ m) - m); +} + +/** Saturating absolute difference **/ +inline v_int8x16 v_absdiffs(const v_int8x16& a, const v_int8x16& b) +{ + v_int8x16 d = a - b; + v_int8x16 m = a < b; + return (d ^ m) - m; + } +inline v_int16x8 v_absdiffs(const v_int16x8& a, const v_int16x8& b) +{ return v_max(a, b) - v_min(a, b); } + + +inline v_int32x4 v_fma(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return a * b + c; +} + +inline v_int32x4 v_muladd(const v_int32x4& a, const v_int32x4& b, const v_int32x4& c) +{ + return v_fma(a, b, c); +} + +inline v_float32x4 v_fma(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c) +{ + return a * b + c; +} + +inline v_float64x2 v_fma(const v_float64x2& a, const v_float64x2& b, const v_float64x2& c) +{ + return a * b + c; +} + +inline v_float32x4 v_absdiff(const v_float32x4& a, const v_float32x4& b) +{ + v128_t absmask_vec = wasm_i32x4_splat(0x7fffffff); + return v_float32x4(wasm_v128_and(wasm_f32x4_sub(a.val, b.val), absmask_vec)); +} +inline v_float64x2 v_absdiff(const v_float64x2& a, const v_float64x2& b) +{ + v128_t absmask_vec = wasm_u64x2_shr(wasm_i32x4_splat(-1), 1); + return v_float64x2(wasm_v128_and(wasm_f64x2_sub(a.val, b.val), absmask_vec)); +} + +#define OPENCV_HAL_IMPL_WASM_MISC_FLT_OP(_Tpvec, suffix) \ +inline _Tpvec v_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ \ + v128_t a_Square = wasm_##suffix##_mul(a.val, a.val); \ + v128_t b_Square = wasm_##suffix##_mul(b.val, b.val); \ + return _Tpvec(wasm_##suffix##_sqrt(wasm_##suffix##_add(a_Square, b_Square))); \ +} \ +inline _Tpvec v_sqr_magnitude(const _Tpvec& a, const _Tpvec& b) \ +{ \ + v128_t a_Square = wasm_##suffix##_mul(a.val, a.val); \ + v128_t b_Square = wasm_##suffix##_mul(b.val, b.val); \ + return _Tpvec(wasm_##suffix##_add(a_Square, b_Square)); \ +} \ +inline _Tpvec v_muladd(const _Tpvec& a, const _Tpvec& b, const _Tpvec& c) \ +{ \ + return _Tpvec(wasm_##suffix##_add(wasm_##suffix##_mul(a.val, b.val), c.val)); \ +} + +OPENCV_HAL_IMPL_WASM_MISC_FLT_OP(v_float32x4, f32x4) +OPENCV_HAL_IMPL_WASM_MISC_FLT_OP(v_float64x2, f64x2) + +#define OPENCV_HAL_IMPL_WASM_SHIFT_OP(_Tpuvec, _Tpsvec, suffix, ssuffix) \ +inline _Tpuvec operator << (const _Tpuvec& a, int imm) \ +{ \ + return _Tpuvec(wasm_##suffix##_shl(a.val, imm)); \ +} \ +inline _Tpsvec operator << (const _Tpsvec& a, int imm) \ +{ \ + return _Tpsvec(wasm_##suffix##_shl(a.val, imm)); \ +} \ +inline _Tpuvec operator >> (const _Tpuvec& a, int imm) \ +{ \ + return _Tpuvec(wasm_##ssuffix##_shr(a.val, imm)); \ +} \ +inline _Tpsvec operator >> (const _Tpsvec& a, int imm) \ +{ \ + return _Tpsvec(wasm_##suffix##_shr(a.val, imm)); \ +} \ +template \ +inline _Tpuvec v_shl(const _Tpuvec& a) \ +{ \ + return _Tpuvec(wasm_##suffix##_shl(a.val, imm)); \ +} \ +template \ +inline _Tpsvec v_shl(const _Tpsvec& a) \ +{ \ + return _Tpsvec(wasm_##suffix##_shl(a.val, imm)); \ +} \ +template \ +inline _Tpuvec v_shr(const _Tpuvec& a) \ +{ \ + return _Tpuvec(wasm_##ssuffix##_shr(a.val, imm)); \ +} \ +template \ +inline _Tpsvec v_shr(const _Tpsvec& a) \ +{ \ + return _Tpsvec(wasm_##suffix##_shr(a.val, imm)); \ +} + +OPENCV_HAL_IMPL_WASM_SHIFT_OP(v_uint8x16, v_int8x16, i8x16, u8x16) +OPENCV_HAL_IMPL_WASM_SHIFT_OP(v_uint16x8, v_int16x8, i16x8, u16x8) +OPENCV_HAL_IMPL_WASM_SHIFT_OP(v_uint32x4, v_int32x4, i32x4, u32x4) +OPENCV_HAL_IMPL_WASM_SHIFT_OP(v_uint64x2, v_int64x2, i64x2, u64x2) + +namespace hal_wasm_internal +{ + template 16)), + bool is_first = (imm == 0), + bool is_second = (imm == 16), + bool is_other = (((imm > 0) && (imm < 16)))> + class v_wasm_palignr_u8_class; + + template + class v_wasm_palignr_u8_class; + + template + class v_wasm_palignr_u8_class + { + public: + inline v128_t operator()(const v128_t& a, const v128_t&) const + { + return a; + } + }; + + template + class v_wasm_palignr_u8_class + { + public: + inline v128_t operator()(const v128_t&, const v128_t& b) const + { + return b; + } + }; + + template + class v_wasm_palignr_u8_class + { + public: + inline v128_t operator()(const v128_t& a, const v128_t& b) const + { + enum { imm2 = (sizeof(v128_t) - imm) }; + return wasm_v8x16_shuffle(a, b, + imm, imm+1, imm+2, imm+3, + imm+4, imm+5, imm+6, imm+7, + imm+8, imm+9, imm+10, imm+11, + imm+12, imm+13, imm+14, imm+15); + } + }; + + template + inline v128_t v_wasm_palignr_u8(const v128_t& a, const v128_t& b) + { + CV_StaticAssert((imm >= 0) && (imm <= 16), "Invalid imm for v_wasm_palignr_u8."); + return v_wasm_palignr_u8_class()(a, b); + } +} + +template +inline _Tpvec v_rotate_right(const _Tpvec &a) +{ + using namespace hal_wasm_internal; + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type)) }; + v128_t z = wasm_i8x16_splat(0); + return _Tpvec(v_wasm_palignr_u8(a.val, z)); +} + +template +inline _Tpvec v_rotate_left(const _Tpvec &a) +{ + using namespace hal_wasm_internal; + enum { imm2 = ((_Tpvec::nlanes - imm) * sizeof(typename _Tpvec::lane_type)) }; + v128_t z = wasm_i8x16_splat(0); + return _Tpvec(v_wasm_palignr_u8(z, a.val)); +} + +template +inline _Tpvec v_rotate_right(const _Tpvec &a, const _Tpvec &b) +{ + using namespace hal_wasm_internal; + enum { imm2 = (imm * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_wasm_palignr_u8(a.val, b.val)); +} + +template +inline _Tpvec v_rotate_left(const _Tpvec &a, const _Tpvec &b) +{ + using namespace hal_wasm_internal; + enum { imm2 = ((_Tpvec::nlanes - imm) * sizeof(typename _Tpvec::lane_type)) }; + return _Tpvec(v_wasm_palignr_u8(b.val, a.val)); +} + +#define OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(_Tpvec, _Tp) \ +inline _Tpvec v_load(const _Tp* ptr) \ +{ return _Tpvec(wasm_v128_load(ptr)); } \ +inline _Tpvec v_load_aligned(const _Tp* ptr) \ +{ return _Tpvec(wasm_v128_load(ptr)); } \ +inline _Tpvec v_load_low(const _Tp* ptr) \ +{ \ + _Tp tmp[_Tpvec::nlanes] = {0}; \ + for (int i=0; i<_Tpvec::nlanes/2; ++i) { \ + tmp[i] = ptr[i]; \ + } \ + return _Tpvec(wasm_v128_load(tmp)); \ +} \ +inline _Tpvec v_load_halves(const _Tp* ptr0, const _Tp* ptr1) \ +{ \ + _Tp tmp[_Tpvec::nlanes]; \ + for (int i=0; i<_Tpvec::nlanes/2; ++i) { \ + tmp[i] = ptr0[i]; \ + tmp[i+_Tpvec::nlanes/2] = ptr1[i]; \ + } \ + return _Tpvec(wasm_v128_load(tmp)); \ +} \ +inline void v_store(_Tp* ptr, const _Tpvec& a) \ +{ wasm_v128_store(ptr, a.val); } \ +inline void v_store_aligned(_Tp* ptr, const _Tpvec& a) \ +{ wasm_v128_store(ptr, a.val); } \ +inline void v_store_aligned_nocache(_Tp* ptr, const _Tpvec& a) \ +{ wasm_v128_store(ptr, a.val); } \ +inline void v_store(_Tp* ptr, const _Tpvec& a, hal::StoreMode /*mode*/) \ +{ \ + wasm_v128_store(ptr, a.val); \ +} \ +inline void v_store_low(_Tp* ptr, const _Tpvec& a) \ +{ \ + _Tpvec::lane_type a_[_Tpvec::nlanes]; \ + wasm_v128_store(a_, a.val); \ + for (int i = 0; i < (_Tpvec::nlanes / 2); i++) \ + ptr[i] = a_[i]; \ +} \ +inline void v_store_high(_Tp* ptr, const _Tpvec& a) \ +{ \ + _Tpvec::lane_type a_[_Tpvec::nlanes]; \ + wasm_v128_store(a_, a.val); \ + for (int i = 0; i < (_Tpvec::nlanes / 2); i++) \ + ptr[i] = a_[i + (_Tpvec::nlanes / 2)]; \ +} + +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_uint8x16, uchar) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_int8x16, schar) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_uint16x8, ushort) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_int16x8, short) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_uint32x4, unsigned) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_int32x4, int) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_uint64x2, uint64) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_int64x2, int64) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_float32x4, float) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INT_OP(v_float64x2, double) + + +/** Reverse **/ +inline v_uint8x16 v_reverse(const v_uint8x16 &a) +{ return v_uint8x16(wasm_v8x16_shuffle(a.val, a.val, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)); } + +inline v_int8x16 v_reverse(const v_int8x16 &a) +{ return v_reinterpret_as_s8(v_reverse(v_reinterpret_as_u8(a))); } + +inline v_uint16x8 v_reverse(const v_uint16x8 &a) +{ return v_uint16x8(wasm_v8x16_shuffle(a.val, a.val, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1)); } + +inline v_int16x8 v_reverse(const v_int16x8 &a) +{ return v_reinterpret_as_s16(v_reverse(v_reinterpret_as_u16(a))); } + +inline v_uint32x4 v_reverse(const v_uint32x4 &a) +{ return v_uint32x4(wasm_v8x16_shuffle(a.val, a.val, 12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3)); } + +inline v_int32x4 v_reverse(const v_int32x4 &a) +{ return v_reinterpret_as_s32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_float32x4 v_reverse(const v_float32x4 &a) +{ return v_reinterpret_as_f32(v_reverse(v_reinterpret_as_u32(a))); } + +inline v_uint64x2 v_reverse(const v_uint64x2 &a) +{ return v_uint64x2(wasm_v8x16_shuffle(a.val, a.val, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7)); } + +inline v_int64x2 v_reverse(const v_int64x2 &a) +{ return v_reinterpret_as_s64(v_reverse(v_reinterpret_as_u64(a))); } + +inline v_float64x2 v_reverse(const v_float64x2 &a) +{ return v_reinterpret_as_f64(v_reverse(v_reinterpret_as_u64(a))); } + + +#define OPENCV_HAL_IMPL_WASM_REDUCE_OP_4_SUM(_Tpvec, scalartype, regtype, suffix, esuffix) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + regtype val = a.val; \ + val = wasm_##suffix##_add(val, wasm_v8x16_shuffle(val, val, 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7)); \ + val = wasm_##suffix##_add(val, wasm_v8x16_shuffle(val, val, 4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3)); \ + return (scalartype)wasm_##esuffix##_extract_lane(val, 0); \ +} + +OPENCV_HAL_IMPL_WASM_REDUCE_OP_4_SUM(v_uint32x4, unsigned, v128_t, i32x4, i32x4) +OPENCV_HAL_IMPL_WASM_REDUCE_OP_4_SUM(v_int32x4, int, v128_t, i32x4, i32x4) +OPENCV_HAL_IMPL_WASM_REDUCE_OP_4_SUM(v_float32x4, float, v128_t, f32x4, f32x4) + +// To do: Optimize v_reduce_sum with wasm intrin. +// Now use fallback implementation as there is no widening op in wasm intrin. + +#define OPENCV_HAL_IMPL_FALLBACK_REDUCE_OP_SUM(_Tpvec, scalartype) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + _Tpvec::lane_type a_[_Tpvec::nlanes]; \ + wasm_v128_store(a_, a.val); \ + scalartype c = a_[0]; \ + for (int i = 1; i < _Tpvec::nlanes; i++) \ + c += a_[i]; \ + return c; \ +} + +OPENCV_HAL_IMPL_FALLBACK_REDUCE_OP_SUM(v_uint8x16, unsigned) +OPENCV_HAL_IMPL_FALLBACK_REDUCE_OP_SUM(v_int8x16, int) +OPENCV_HAL_IMPL_FALLBACK_REDUCE_OP_SUM(v_uint16x8, unsigned) +OPENCV_HAL_IMPL_FALLBACK_REDUCE_OP_SUM(v_int16x8, int) + + +#define OPENCV_HAL_IMPL_WASM_REDUCE_OP_2_SUM(_Tpvec, scalartype, regtype, suffix, esuffix) \ +inline scalartype v_reduce_sum(const _Tpvec& a) \ +{ \ + regtype val = a.val; \ + val = wasm_##suffix##_add(val, wasm_v8x16_shuffle(val, val, 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7)); \ + return (scalartype)wasm_##esuffix##_extract_lane(val, 0); \ +} +OPENCV_HAL_IMPL_WASM_REDUCE_OP_2_SUM(v_uint64x2, uint64, v128_t, i64x2, i64x2) +OPENCV_HAL_IMPL_WASM_REDUCE_OP_2_SUM(v_int64x2, int64, v128_t, i64x2, i64x2) +OPENCV_HAL_IMPL_WASM_REDUCE_OP_2_SUM(v_float64x2, double, v128_t, f64x2,f64x2) + +inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d) +{ + v128_t ac = wasm_f32x4_add(wasm_unpacklo_i32x4(a.val, c.val), wasm_unpackhi_i32x4(a.val, c.val)); + v128_t bd = wasm_f32x4_add(wasm_unpacklo_i32x4(b.val, d.val), wasm_unpackhi_i32x4(b.val, d.val)); + return v_float32x4(wasm_f32x4_add(wasm_unpacklo_i32x4(ac, bd), wasm_unpackhi_i32x4(ac, bd))); +} + +#define OPENCV_HAL_IMPL_WASM_REDUCE_OP(_Tpvec, scalartype, func, scalar_func) \ +inline scalartype v_reduce_##func(const _Tpvec& a) \ +{ \ + scalartype buf[_Tpvec::nlanes]; \ + v_store(buf, a); \ + scalartype tmp = buf[0]; \ + for (int i=1; i<_Tpvec::nlanes; ++i) { \ + tmp = scalar_func(tmp, buf[i]); \ + } \ + return tmp; \ +} + +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint8x16, uchar, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint8x16, uchar, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int8x16, schar, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int8x16, schar, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint16x8, ushort, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint16x8, ushort, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int16x8, short, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int16x8, short, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint32x4, unsigned, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_uint32x4, unsigned, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int32x4, int, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_int32x4, int, min, std::min) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_float32x4, float, max, std::max) +OPENCV_HAL_IMPL_WASM_REDUCE_OP(v_float32x4, float, min, std::min) + +inline unsigned v_reduce_sad(const v_uint8x16& a, const v_uint8x16& b) +{ + v_uint16x8 l16, h16; + v_uint32x4 l16_l32, l16_h32, h16_l32, h16_h32; + v_expand(v_absdiff(a, b), l16, h16); + v_expand(l16, l16_l32, l16_h32); + v_expand(h16, h16_l32, h16_h32); + return v_reduce_sum(l16_l32+l16_h32+h16_l32+h16_h32); +} +inline unsigned v_reduce_sad(const v_int8x16& a, const v_int8x16& b) +{ + v_uint16x8 l16, h16; + v_uint32x4 l16_l32, l16_h32, h16_l32, h16_h32; + v_expand(v_absdiff(a, b), l16, h16); + v_expand(l16, l16_l32, l16_h32); + v_expand(h16, h16_l32, h16_h32); + return v_reduce_sum(l16_l32+l16_h32+h16_l32+h16_h32); +} +inline unsigned v_reduce_sad(const v_uint16x8& a, const v_uint16x8& b) +{ + v_uint32x4 l, h; + v_expand(v_absdiff(a, b), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_int16x8& a, const v_int16x8& b) +{ + v_uint32x4 l, h; + v_expand(v_absdiff(a, b), l, h); + return v_reduce_sum(l + h); +} +inline unsigned v_reduce_sad(const v_uint32x4& a, const v_uint32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} +inline unsigned v_reduce_sad(const v_int32x4& a, const v_int32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} +inline float v_reduce_sad(const v_float32x4& a, const v_float32x4& b) +{ + return v_reduce_sum(v_absdiff(a, b)); +} + +inline v_uint8x16 v_popcount(const v_uint8x16& a) +{ + v128_t m1 = wasm_i32x4_splat(0x55555555); + v128_t m2 = wasm_i32x4_splat(0x33333333); + v128_t m4 = wasm_i32x4_splat(0x0f0f0f0f); + v128_t p = a.val; + p = wasm_i32x4_add(wasm_v128_and(wasm_u32x4_shr(p, 1), m1), wasm_v128_and(p, m1)); + p = wasm_i32x4_add(wasm_v128_and(wasm_u32x4_shr(p, 2), m2), wasm_v128_and(p, m2)); + p = wasm_i32x4_add(wasm_v128_and(wasm_u32x4_shr(p, 4), m4), wasm_v128_and(p, m4)); + return v_uint8x16(p); +} +inline v_uint16x8 v_popcount(const v_uint16x8& a) +{ + v_uint8x16 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + return v_reinterpret_as_u16(p) & v_setall_u16(0x00ff); +} +inline v_uint32x4 v_popcount(const v_uint32x4& a) +{ + v_uint8x16 p = v_popcount(v_reinterpret_as_u8(a)); + p += v_rotate_right<1>(p); + p += v_rotate_right<2>(p); + return v_reinterpret_as_u32(p) & v_setall_u32(0x000000ff); +} +inline v_uint64x2 v_popcount(const v_uint64x2& a) +{ + uint64 a_[2], b_[2] = { 0 }; + wasm_v128_store(a_, a.val); + for (int i = 0; i < 16; i++) + b_[i / 8] += popCountTable[((uint8_t*)a_)[i]]; + return v_uint64x2(wasm_v128_load(b_)); +} +inline v_uint8x16 v_popcount(const v_int8x16& a) +{ return v_popcount(v_reinterpret_as_u8(a)); } +inline v_uint16x8 v_popcount(const v_int16x8& a) +{ return v_popcount(v_reinterpret_as_u16(a)); } +inline v_uint32x4 v_popcount(const v_int32x4& a) +{ return v_popcount(v_reinterpret_as_u32(a)); } +inline v_uint64x2 v_popcount(const v_int64x2& a) +{ return v_popcount(v_reinterpret_as_u64(a)); } + +#define OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(_Tpvec, suffix, scalarType) \ +inline int v_signmask(const _Tpvec& a) \ +{ \ + _Tpvec::lane_type a_[_Tpvec::nlanes]; \ + wasm_v128_store(a_, a.val); \ + int mask = 0; \ + for (int i = 0; i < _Tpvec::nlanes; i++) \ + mask |= (reinterpret_int(a_[i]) < 0) << i; \ + return mask; \ +} \ +inline bool v_check_all(const _Tpvec& a) \ +{ return wasm_i8x16_all_true(wasm_##suffix##_lt(a.val, wasm_##suffix##_splat(0))); } \ +inline bool v_check_any(const _Tpvec& a) \ +{ return wasm_i8x16_any_true(wasm_##suffix##_lt(a.val, wasm_##suffix##_splat(0)));; } + +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_uint8x16, i8x16, schar) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_int8x16, i8x16, schar) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_uint16x8, i16x8, short) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_int16x8, i16x8, short) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_uint32x4, i32x4, int) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_int32x4, i32x4, int) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_float32x4, i32x4, float) +OPENCV_HAL_IMPL_WASM_CHECK_SIGNS(v_float64x2, f64x2, double) + +#define OPENCV_HAL_IMPL_WASM_CHECK_ALL_ANY(_Tpvec, suffix, esuffix) \ +inline bool v_check_all(const _Tpvec& a) \ +{ \ + v128_t masked = v_reinterpret_as_##esuffix(a).val; \ + masked = wasm_i32x4_replace_lane(masked, 0, 0xffffffff); \ + masked = wasm_i32x4_replace_lane(masked, 2, 0xffffffff); \ + return wasm_i8x16_all_true(wasm_##suffix##_lt(masked, wasm_##suffix##_splat(0))); \ +} \ +inline bool v_check_any(const _Tpvec& a) \ +{ \ + v128_t masked = v_reinterpret_as_##esuffix(a).val; \ + masked = wasm_i32x4_replace_lane(masked, 0, 0x0); \ + masked = wasm_i32x4_replace_lane(masked, 2, 0x0); \ + return wasm_i8x16_any_true(wasm_##suffix##_lt(masked, wasm_##suffix##_splat(0))); \ +} \ + +OPENCV_HAL_IMPL_WASM_CHECK_ALL_ANY(v_int64x2, i32x4, s32) +OPENCV_HAL_IMPL_WASM_CHECK_ALL_ANY(v_uint64x2, i32x4, u32) + + +inline int v_scan_forward(const v_int8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_uint8x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } +inline int v_scan_forward(const v_int16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_uint16x8& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } +inline int v_scan_forward(const v_int32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_uint32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_float32x4& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 4; } +inline int v_scan_forward(const v_int64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_uint64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } +inline int v_scan_forward(const v_float64x2& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 8; } + +#define OPENCV_HAL_IMPL_WASM_SELECT(_Tpvec) \ +inline _Tpvec v_select(const _Tpvec& mask, const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(wasm_v128_bitselect(a.val, b.val, mask.val)); \ +} + +OPENCV_HAL_IMPL_WASM_SELECT(v_uint8x16) +OPENCV_HAL_IMPL_WASM_SELECT(v_int8x16) +OPENCV_HAL_IMPL_WASM_SELECT(v_uint16x8) +OPENCV_HAL_IMPL_WASM_SELECT(v_int16x8) +OPENCV_HAL_IMPL_WASM_SELECT(v_uint32x4) +OPENCV_HAL_IMPL_WASM_SELECT(v_int32x4) +OPENCV_HAL_IMPL_WASM_SELECT(v_uint64x2) +OPENCV_HAL_IMPL_WASM_SELECT(v_int64x2) +OPENCV_HAL_IMPL_WASM_SELECT(v_float32x4) +OPENCV_HAL_IMPL_WASM_SELECT(v_float64x2) + +#define OPENCV_HAL_IMPL_WASM_EXPAND(_Tpvec, _Tpwvec, _Tp, intrin) \ +inline void v_expand(const _Tpvec& a, _Tpwvec& b0, _Tpwvec& b1) \ +{ \ + b0.val = intrin(a.val); \ + b1.val = __CV_CAT(intrin, _high)(a.val); \ +} \ +inline _Tpwvec v_expand_low(const _Tpvec& a) \ +{ return _Tpwvec(intrin(a.val)); } \ +inline _Tpwvec v_expand_high(const _Tpvec& a) \ +{ return _Tpwvec(__CV_CAT(intrin, _high)(a.val)); } \ +inline _Tpwvec v_load_expand(const _Tp* ptr) \ +{ \ + v128_t a = wasm_v128_load(ptr); \ + return _Tpwvec(intrin(a)); \ +} + +OPENCV_HAL_IMPL_WASM_EXPAND(v_uint8x16, v_uint16x8, uchar, v128_cvtu8x16_i16x8) +OPENCV_HAL_IMPL_WASM_EXPAND(v_int8x16, v_int16x8, schar, v128_cvti8x16_i16x8) +OPENCV_HAL_IMPL_WASM_EXPAND(v_uint16x8, v_uint32x4, ushort, v128_cvtu16x8_i32x4) +OPENCV_HAL_IMPL_WASM_EXPAND(v_int16x8, v_int32x4, short, v128_cvti16x8_i32x4) +OPENCV_HAL_IMPL_WASM_EXPAND(v_uint32x4, v_uint64x2, unsigned, v128_cvtu32x4_i64x2) +OPENCV_HAL_IMPL_WASM_EXPAND(v_int32x4, v_int64x2, int, v128_cvti32x4_i64x2) + +#define OPENCV_HAL_IMPL_WASM_EXPAND_Q(_Tpvec, _Tp, intrin) \ +inline _Tpvec v_load_expand_q(const _Tp* ptr) \ +{ \ + v128_t a = wasm_v128_load(ptr); \ + return _Tpvec(intrin(a)); \ +} + +OPENCV_HAL_IMPL_WASM_EXPAND_Q(v_uint32x4, uchar, v128_cvtu8x16_i32x4) +OPENCV_HAL_IMPL_WASM_EXPAND_Q(v_int32x4, schar, v128_cvti8x16_i32x4) + +#define OPENCV_HAL_IMPL_WASM_UNPACKS(_Tpvec, suffix) \ +inline void v_zip(const _Tpvec& a0, const _Tpvec& a1, _Tpvec& b0, _Tpvec& b1) \ +{ \ + b0.val = wasm_unpacklo_##suffix(a0.val, a1.val); \ + b1.val = wasm_unpackhi_##suffix(a0.val, a1.val); \ +} \ +inline _Tpvec v_combine_low(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(wasm_unpacklo_i64x2(a.val, b.val)); \ +} \ +inline _Tpvec v_combine_high(const _Tpvec& a, const _Tpvec& b) \ +{ \ + return _Tpvec(wasm_unpackhi_i64x2(a.val, b.val)); \ +} \ +inline void v_recombine(const _Tpvec& a, const _Tpvec& b, _Tpvec& c, _Tpvec& d) \ +{ \ + c.val = wasm_unpacklo_i64x2(a.val, b.val); \ + d.val = wasm_unpackhi_i64x2(a.val, b.val); \ +} + +OPENCV_HAL_IMPL_WASM_UNPACKS(v_uint8x16, i8x16) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_int8x16, i8x16) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_uint16x8, i16x8) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_int16x8, i16x8) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_uint32x4, i32x4) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_int32x4, i32x4) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_float32x4, i32x4) +OPENCV_HAL_IMPL_WASM_UNPACKS(v_float64x2, i64x2) + +template +inline _Tpvec v_extract(const _Tpvec& a, const _Tpvec& b) +{ + return v_rotate_right(a, b); +} + +inline v_int32x4 v_round(const v_float32x4& a) +{ + v128_t h = wasm_f32x4_splat(0.5); + return v_int32x4(wasm_i32x4_trunc_saturate_f32x4(wasm_f32x4_add(a.val, h))); +} + +inline v_int32x4 v_floor(const v_float32x4& a) +{ + v128_t a1 = wasm_i32x4_trunc_saturate_f32x4(a.val); + v128_t mask = wasm_f32x4_lt(a.val, wasm_f32x4_convert_i32x4(a1)); + return v_int32x4(wasm_i32x4_add(a1, mask)); +} + +inline v_int32x4 v_ceil(const v_float32x4& a) +{ + v128_t a1 = wasm_i32x4_trunc_saturate_f32x4(a.val); + v128_t mask = wasm_f32x4_gt(a.val, wasm_f32x4_convert_i32x4(a1)); + return v_int32x4(wasm_i32x4_sub(a1, mask)); +} + +inline v_int32x4 v_trunc(const v_float32x4& a) +{ return v_int32x4(wasm_i32x4_trunc_saturate_f32x4(a.val)); } + +#define OPENCV_HAL_IMPL_WASM_MATH_FUNC(func, cfunc) \ +inline v_int32x4 func(const v_float64x2& a) \ +{ \ + double a_[2]; \ + wasm_v128_store(a_, a.val); \ + int c_[4]; \ + c_[0] = cfunc(a_[0]); \ + c_[1] = cfunc(a_[1]); \ + c_[2] = 0; \ + c_[3] = 0; \ + return v_int32x4(wasm_v128_load(c_)); \ +} + +OPENCV_HAL_IMPL_WASM_MATH_FUNC(v_round, cvRound) +OPENCV_HAL_IMPL_WASM_MATH_FUNC(v_floor, cvFloor) +OPENCV_HAL_IMPL_WASM_MATH_FUNC(v_ceil, cvCeil) +OPENCV_HAL_IMPL_WASM_MATH_FUNC(v_trunc, int) + +inline v_int32x4 v_round(const v_float64x2& a, const v_float64x2& b) +{ + double a_[2], b_[2]; + wasm_v128_store(a_, a.val); + wasm_v128_store(b_, b.val); + int c_[4]; + c_[0] = cvRound(a_[0]); + c_[1] = cvRound(a_[1]); + c_[2] = cvRound(b_[0]); + c_[3] = cvRound(b_[1]); + return v_int32x4(wasm_v128_load(c_)); +} + +#define OPENCV_HAL_IMPL_WASM_TRANSPOSE4x4(_Tpvec, suffix) \ +inline void v_transpose4x4(const _Tpvec& a0, const _Tpvec& a1, \ + const _Tpvec& a2, const _Tpvec& a3, \ + _Tpvec& b0, _Tpvec& b1, \ + _Tpvec& b2, _Tpvec& b3) \ +{ \ + v128_t t0 = wasm_unpacklo_##suffix(a0.val, a1.val); \ + v128_t t1 = wasm_unpacklo_##suffix(a2.val, a3.val); \ + v128_t t2 = wasm_unpackhi_##suffix(a0.val, a1.val); \ + v128_t t3 = wasm_unpackhi_##suffix(a2.val, a3.val); \ +\ + b0.val = wasm_unpacklo_i64x2(t0, t1); \ + b1.val = wasm_unpackhi_i64x2(t0, t1); \ + b2.val = wasm_unpacklo_i64x2(t2, t3); \ + b3.val = wasm_unpackhi_i64x2(t2, t3); \ +} + +OPENCV_HAL_IMPL_WASM_TRANSPOSE4x4(v_uint32x4, i32x4) +OPENCV_HAL_IMPL_WASM_TRANSPOSE4x4(v_int32x4, i32x4) +OPENCV_HAL_IMPL_WASM_TRANSPOSE4x4(v_float32x4, i32x4) + +// load deinterleave +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b) +{ + v128_t t00 = wasm_v128_load(ptr); + v128_t t01 = wasm_v128_load(ptr + 16); + + a.val = wasm_v8x16_shuffle(t00, t01, 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30); + b.val = wasm_v8x16_shuffle(t00, t01, 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c) +{ + v128_t t00 = wasm_v128_load(ptr); + v128_t t01 = wasm_v128_load(ptr + 16); + v128_t t02 = wasm_v128_load(ptr + 32); + + v128_t t10 = wasm_v8x16_shuffle(t00, t01, 0,3,6,9,12,15,18,21,24,27,30,1,2,4,5,7); + v128_t t11 = wasm_v8x16_shuffle(t00, t01, 1,4,7,10,13,16,19,22,25,28,31,0,2,3,5,6); + v128_t t12 = wasm_v8x16_shuffle(t00, t01, 2,5,8,11,14,17,20,23,26,29,0,1,3,4,6,7); + + a.val = wasm_v8x16_shuffle(t10, t02, 0,1,2,3,4,5,6,7,8,9,10,17,20,23,26,29); + b.val = wasm_v8x16_shuffle(t11, t02, 0,1,2,3,4,5,6,7,8,9,10,18,21,24,27,30); + c.val = wasm_v8x16_shuffle(t12, t02, 0,1,2,3,4,5,6,7,8,9,16,19,22,25,28,31); +} + +inline void v_load_deinterleave(const uchar* ptr, v_uint8x16& a, v_uint8x16& b, v_uint8x16& c, v_uint8x16& d) +{ + v128_t u0 = wasm_v128_load(ptr); // a0 b0 c0 d0 a1 b1 c1 d1 ... + v128_t u1 = wasm_v128_load(ptr + 16); // a4 b4 c4 d4 ... + v128_t u2 = wasm_v128_load(ptr + 32); // a8 b8 c8 d8 ... + v128_t u3 = wasm_v128_load(ptr + 48); // a12 b12 c12 d12 ... + + v128_t v0 = wasm_v8x16_shuffle(u0, u1, 0,4,8,12,16,20,24,28,1,5,9,13,17,21,25,29); + v128_t v1 = wasm_v8x16_shuffle(u2, u3, 0,4,8,12,16,20,24,28,1,5,9,13,17,21,25,29); + v128_t v2 = wasm_v8x16_shuffle(u0, u1, 2,6,10,14,18,22,26,30,3,7,11,15,19,23,27,31); + v128_t v3 = wasm_v8x16_shuffle(u2, u3, 2,6,10,14,18,22,26,30,3,7,11,15,19,23,27,31); + + a.val = wasm_v8x16_shuffle(v0, v1, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); + b.val = wasm_v8x16_shuffle(v0, v1, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); + c.val = wasm_v8x16_shuffle(v2, v3, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); + d.val = wasm_v8x16_shuffle(v2, v3, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b) +{ + v128_t v0 = wasm_v128_load(ptr); // a0 b0 a1 b1 a2 b2 a3 b3 + v128_t v1 = wasm_v128_load(ptr + 8); // a4 b4 a5 b5 a6 b6 a7 b7 + + a.val = wasm_v8x16_shuffle(v0, v1, 0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29); // a0 a1 a2 a3 a4 a5 a6 a7 + b.val = wasm_v8x16_shuffle(v0, v1, 2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31); // b0 b1 ab b3 b4 b5 b6 b7 +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c) +{ + v128_t t00 = wasm_v128_load(ptr); // a0 b0 c0 a1 b1 c1 a2 b2 + v128_t t01 = wasm_v128_load(ptr + 8); // c2 a3 b3 c3 a4 b4 c4 a5 + v128_t t02 = wasm_v128_load(ptr + 16); // b5 c5 a6 b6 c6 a7 b7 c7 + + v128_t t10 = wasm_v8x16_shuffle(t00, t01, 0,1,6,7,12,13,18,19,24,25,30,31,2,3,4,5); + v128_t t11 = wasm_v8x16_shuffle(t00, t01, 2,3,8,9,14,15,20,21,26,27,0,1,4,5,6,7); + v128_t t12 = wasm_v8x16_shuffle(t00, t01, 4,5,10,11,16,17,22,23,28,29,0,1,2,3,6,7); + + a.val = wasm_v8x16_shuffle(t10, t02, 0,1,2,3,4,5,6,7,8,9,10,11,20,21,26,27); + b.val = wasm_v8x16_shuffle(t11, t02, 0,1,2,3,4,5,6,7,8,9,16,17,22,23,28,29); + c.val = wasm_v8x16_shuffle(t12, t02, 0,1,2,3,4,5,6,7,8,9,18,19,24,25,30,31); +} + +inline void v_load_deinterleave(const ushort* ptr, v_uint16x8& a, v_uint16x8& b, v_uint16x8& c, v_uint16x8& d) +{ + v128_t u0 = wasm_v128_load(ptr); // a0 b0 c0 d0 a1 b1 c1 d1 + v128_t u1 = wasm_v128_load(ptr + 8); // a2 b2 c2 d2 ... + v128_t u2 = wasm_v128_load(ptr + 16); // a4 b4 c4 d4 ... + v128_t u3 = wasm_v128_load(ptr + 24); // a6 b6 c6 d6 ... + + v128_t v0 = wasm_v8x16_shuffle(u0, u1, 0,1,8,9,16,17,24,25,2,3,10,11,18,19,26,27); // a0 a1 a2 a3 b0 b1 b2 b3 + v128_t v1 = wasm_v8x16_shuffle(u2, u3, 0,1,8,9,16,17,24,25,2,3,10,11,18,19,26,27); // a4 a5 a6 a7 b4 b5 b6 b7 + v128_t v2 = wasm_v8x16_shuffle(u0, u1, 4,5,12,13,20,21,28,29,6,7,14,15,22,23,30,31); // c0 c1 c2 c3 d0 d1 d2 d3 + v128_t v3 = wasm_v8x16_shuffle(u2, u3, 4,5,12,13,20,21,28,29,6,7,14,15,22,23,30,31); // c4 c5 c6 c7 d4 d5 d6 d7 + + a.val = wasm_v8x16_shuffle(v0, v1, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); + b.val = wasm_v8x16_shuffle(v0, v1, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); + c.val = wasm_v8x16_shuffle(v2, v3, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); + d.val = wasm_v8x16_shuffle(v2, v3, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b) +{ + v128_t v0 = wasm_v128_load(ptr); // a0 b0 a1 b1 + v128_t v1 = wasm_v128_load(ptr + 4); // a2 b2 a3 b3 + + a.val = wasm_v8x16_shuffle(v0, v1, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27); // a0 a1 a2 a3 + b.val = wasm_v8x16_shuffle(v0, v1, 4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31); // b0 b1 b2 b3 +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c) +{ + v128_t t00 = wasm_v128_load(ptr); // a0 b0 c0 a1 + v128_t t01 = wasm_v128_load(ptr + 4); // b2 c2 a3 b3 + v128_t t02 = wasm_v128_load(ptr + 8); // c3 a4 b4 c4 + + v128_t t10 = wasm_v8x16_shuffle(t00, t01, 0,1,2,3,12,13,14,15,24,25,26,27,4,5,6,7); + v128_t t11 = wasm_v8x16_shuffle(t00, t01, 4,5,6,7,16,17,18,19,28,29,30,31,0,1,2,3); + v128_t t12 = wasm_v8x16_shuffle(t00, t01, 8,9,10,11,20,21,22,23,0,1,2,3,4,5,6,7); + + a.val = wasm_v8x16_shuffle(t10, t02, 0,1,2,3,4,5,6,7,8,9,10,11,20,21,22,23); + b.val = wasm_v8x16_shuffle(t11, t02, 0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,27); + c.val = wasm_v8x16_shuffle(t12, t02, 0,1,2,3,4,5,6,7,16,17,18,19,28,29,30,31); +} + +inline void v_load_deinterleave(const unsigned* ptr, v_uint32x4& a, v_uint32x4& b, v_uint32x4& c, v_uint32x4& d) +{ + v_uint32x4 s0(wasm_v128_load(ptr)); // a0 b0 c0 d0 + v_uint32x4 s1(wasm_v128_load(ptr + 4)); // a1 b1 c1 d1 + v_uint32x4 s2(wasm_v128_load(ptr + 8)); // a2 b2 c2 d2 + v_uint32x4 s3(wasm_v128_load(ptr + 12)); // a3 b3 c3 d3 + + v_transpose4x4(s0, s1, s2, s3, a, b, c, d); +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b) +{ + v128_t v0 = wasm_v128_load(ptr); // a0 b0 a1 b1 + v128_t v1 = wasm_v128_load((ptr + 4)); // a2 b2 a3 b3 + + a.val = wasm_v8x16_shuffle(v0, v1, 0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27); // a0 a1 a2 a3 + b.val = wasm_v8x16_shuffle(v0, v1, 4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31); // b0 b1 b2 b3 +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b, v_float32x4& c) +{ + v128_t t00 = wasm_v128_load(ptr); // a0 b0 c0 a1 + v128_t t01 = wasm_v128_load(ptr + 4); // b2 c2 a3 b3 + v128_t t02 = wasm_v128_load(ptr + 8); // c3 a4 b4 c4 + + v128_t t10 = wasm_v8x16_shuffle(t00, t01, 0,1,2,3,12,13,14,15,24,25,26,27,4,5,6,7); + v128_t t11 = wasm_v8x16_shuffle(t00, t01, 4,5,6,7,16,17,18,19,28,29,30,31,0,1,2,3); + v128_t t12 = wasm_v8x16_shuffle(t00, t01, 8,9,10,11,20,21,22,23,0,1,2,3,4,5,6,7); + + a.val = wasm_v8x16_shuffle(t10, t02, 0,1,2,3,4,5,6,7,8,9,10,11,20,21,22,23); + b.val = wasm_v8x16_shuffle(t11, t02, 0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,27); + c.val = wasm_v8x16_shuffle(t12, t02, 0,1,2,3,4,5,6,7,16,17,18,19,28,29,30,31); +} + +inline void v_load_deinterleave(const float* ptr, v_float32x4& a, v_float32x4& b, v_float32x4& c, v_float32x4& d) +{ + v_float32x4 s0(wasm_v128_load(ptr)); // a0 b0 c0 d0 + v_float32x4 s1(wasm_v128_load(ptr + 4)); // a1 b1 c1 d1 + v_float32x4 s2(wasm_v128_load(ptr + 8)); // a2 b2 c2 d2 + v_float32x4 s3(wasm_v128_load(ptr + 12)); // a3 b3 c3 d3 + + v_transpose4x4(s0, s1, s2, s3, a, b, c, d); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, v_uint64x2& b) +{ + v128_t t0 = wasm_v128_load(ptr); // a0 b0 + v128_t t1 = wasm_v128_load(ptr + 2); // a1 b1 + + a.val = wasm_unpacklo_i64x2(t0, t1); + b.val = wasm_unpackhi_i64x2(t0, t1); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, v_uint64x2& b, v_uint64x2& c) +{ + v128_t t0 = wasm_v128_load(ptr); // a0, b0 + v128_t t1 = wasm_v128_load(ptr + 2); // c0, a1 + v128_t t2 = wasm_v128_load(ptr + 4); // b1, c1 + + a.val = wasm_v8x16_shuffle(t0, t1, 0,1,2,3,4,5,6,7,24,25,26,27,28,29,30,31); + b.val = wasm_v8x16_shuffle(t0, t2, 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23); + c.val = wasm_v8x16_shuffle(t1, t2, 0,1,2,3,4,5,6,7,24,25,26,27,28,29,30,31); +} + +inline void v_load_deinterleave(const uint64 *ptr, v_uint64x2& a, + v_uint64x2& b, v_uint64x2& c, v_uint64x2& d) +{ + v128_t t0 = wasm_v128_load(ptr); // a0 b0 + v128_t t1 = wasm_v128_load(ptr + 2); // c0 d0 + v128_t t2 = wasm_v128_load(ptr + 4); // a1 b1 + v128_t t3 = wasm_v128_load(ptr + 6); // c1 d1 + + a.val = wasm_unpacklo_i64x2(t0, t2); + b.val = wasm_unpackhi_i64x2(t0, t2); + c.val = wasm_unpacklo_i64x2(t1, t3); + d.val = wasm_unpackhi_i64x2(t1, t3); +} + +// store interleave + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i8x16(a.val, b.val); + v128_t v1 = wasm_unpackhi_i8x16(a.val, b.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 16, v1); +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + const v_uint8x16& c, hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t t00 = wasm_v8x16_shuffle(a.val, b.val, 0,16,0,1,17,0,2,18,0,3,19,0,4,20,0,5); + v128_t t01 = wasm_v8x16_shuffle(a.val, b.val, 21,0,6,22,0,7,23,0,8,24,0,9,25,0,10,26); + v128_t t02 = wasm_v8x16_shuffle(a.val, b.val, 0,11,27,0,12,28,0,13,29,0,14,30,0,15,31,0); + + v128_t t10 = wasm_v8x16_shuffle(t00, c.val, 0,1,16,3,4,17,6,7,18,9,10,19,12,13,20,15); + v128_t t11 = wasm_v8x16_shuffle(t01, c.val, 0,21,2,3,22,5,6,23,8,9,24,11,12,25,14,15); + v128_t t12 = wasm_v8x16_shuffle(t02, c.val, 26,1,2,27,4,5,28,7,8,29,10,11,30,13,14,31); + + wasm_v128_store(ptr, t10); + wasm_v128_store(ptr + 16, t11); + wasm_v128_store(ptr + 32, t12); +} + +inline void v_store_interleave( uchar* ptr, const v_uint8x16& a, const v_uint8x16& b, + const v_uint8x16& c, const v_uint8x16& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + // a0 a1 a2 a3 .... + // b0 b1 b2 b3 .... + // c0 c1 c2 c3 .... + // d0 d1 d2 d3 .... + v128_t u0 = wasm_unpacklo_i8x16(a.val, c.val); // a0 c0 a1 c1 ... + v128_t u1 = wasm_unpackhi_i8x16(a.val, c.val); // a8 c8 a9 c9 ... + v128_t u2 = wasm_unpacklo_i8x16(b.val, d.val); // b0 d0 b1 d1 ... + v128_t u3 = wasm_unpackhi_i8x16(b.val, d.val); // b8 d8 b9 d9 ... + + v128_t v0 = wasm_unpacklo_i8x16(u0, u2); // a0 b0 c0 d0 ... + v128_t v1 = wasm_unpackhi_i8x16(u0, u2); // a4 b4 c4 d4 ... + v128_t v2 = wasm_unpacklo_i8x16(u1, u3); // a8 b8 c8 d8 ... + v128_t v3 = wasm_unpackhi_i8x16(u1, u3); // a12 b12 c12 d12 ... + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 16, v1); + wasm_v128_store(ptr + 32, v2); + wasm_v128_store(ptr + 48, v3); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i16x8(a.val, b.val); + v128_t v1 = wasm_unpackhi_i16x8(a.val, b.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 8, v1); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, + const v_uint16x8& b, const v_uint16x8& c, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t t00 = wasm_v8x16_shuffle(a.val, b.val, 0,1,16,17,0,0,2,3,18,19,0,0,4,5,20,21); + v128_t t01 = wasm_v8x16_shuffle(a.val, b.val, 0,0,6,7,22,23,0,0,8,9,24,25,0,0,10,11); + v128_t t02 = wasm_v8x16_shuffle(a.val, b.val, 26,27,0,0,12,13,28,29,0,0,14,15,30,31,0,0); + + v128_t t10 = wasm_v8x16_shuffle(t00, c.val, 0,1,2,3,16,17,6,7,8,9,18,19,12,13,14,15); + v128_t t11 = wasm_v8x16_shuffle(t01, c.val, 20,21,2,3,4,5,22,23,8,9,10,11,24,25,14,15); + v128_t t12 = wasm_v8x16_shuffle(t02, c.val, 0,1,26,27,4,5,6,7,28,29,10,11,12,13,30,31); + + wasm_v128_store(ptr, t10); + wasm_v128_store(ptr + 8, t11); + wasm_v128_store(ptr + 16, t12); +} + +inline void v_store_interleave( ushort* ptr, const v_uint16x8& a, const v_uint16x8& b, + const v_uint16x8& c, const v_uint16x8& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + // a0 a1 a2 a3 .... + // b0 b1 b2 b3 .... + // c0 c1 c2 c3 .... + // d0 d1 d2 d3 .... + v128_t u0 = wasm_unpacklo_i16x8(a.val, c.val); // a0 c0 a1 c1 ... + v128_t u1 = wasm_unpackhi_i16x8(a.val, c.val); // a4 c4 a5 c5 ... + v128_t u2 = wasm_unpacklo_i16x8(b.val, d.val); // b0 d0 b1 d1 ... + v128_t u3 = wasm_unpackhi_i16x8(b.val, d.val); // b4 d4 b5 d5 ... + + v128_t v0 = wasm_unpacklo_i16x8(u0, u2); // a0 b0 c0 d0 ... + v128_t v1 = wasm_unpackhi_i16x8(u0, u2); // a2 b2 c2 d2 ... + v128_t v2 = wasm_unpacklo_i16x8(u1, u3); // a4 b4 c4 d4 ... + v128_t v3 = wasm_unpackhi_i16x8(u1, u3); // a6 b6 c6 d6 ... + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 8, v1); + wasm_v128_store(ptr + 16, v2); + wasm_v128_store(ptr + 24, v3); +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i32x4(a.val, b.val); + v128_t v1 = wasm_unpackhi_i32x4(a.val, b.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 4, v1); +} + +inline void v_store_interleave( unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t t00 = wasm_v8x16_shuffle(a.val, b.val, 0,1,2,3,16,17,18,19,0,0,0,0,4,5,6,7); + v128_t t01 = wasm_v8x16_shuffle(a.val, b.val, 20,21,22,23,0,0,0,0,8,9,10,11,24,25,26,27); + v128_t t02 = wasm_v8x16_shuffle(a.val, b.val, 0,0,0,0,12,13,14,15,28,29,30,31,0,0,0,0); + + v128_t t10 = wasm_v8x16_shuffle(t00, c.val, 0,1,2,3,4,5,6,7,16,17,18,19,12,13,14,15); + v128_t t11 = wasm_v8x16_shuffle(t01, c.val, 0,1,2,3,20,21,22,23,8,9,10,11,12,13,14,15); + v128_t t12 = wasm_v8x16_shuffle(t02, c.val, 24,25,26,27,4,5,6,7,8,9,10,11,28,29,30,31); + + wasm_v128_store(ptr, t10); + wasm_v128_store(ptr + 4, t11); + wasm_v128_store(ptr + 8, t12); +} + +inline void v_store_interleave(unsigned* ptr, const v_uint32x4& a, const v_uint32x4& b, + const v_uint32x4& c, const v_uint32x4& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v_uint32x4 v0, v1, v2, v3; + v_transpose4x4(a, b, c, d, v0, v1, v2, v3); + + wasm_v128_store(ptr, v0.val); + wasm_v128_store(ptr + 4, v1.val); + wasm_v128_store(ptr + 8, v2.val); + wasm_v128_store(ptr + 12, v3.val); +} + +// 2-channel, float only +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i32x4(a.val, b.val); + v128_t v1 = wasm_unpackhi_i32x4(a.val, b.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 4, v1); +} + +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t t00 = wasm_v8x16_shuffle(a.val, b.val, 0,1,2,3,16,17,18,19,0,0,0,0,4,5,6,7); + v128_t t01 = wasm_v8x16_shuffle(a.val, b.val, 20,21,22,23,0,0,0,0,8,9,10,11,24,25,26,27); + v128_t t02 = wasm_v8x16_shuffle(a.val, b.val, 0,0,0,0,12,13,14,15,28,29,30,31,0,0,0,0); + + v128_t t10 = wasm_v8x16_shuffle(t00, c.val, 0,1,2,3,4,5,6,7,16,17,18,19,12,13,14,15); + v128_t t11 = wasm_v8x16_shuffle(t01, c.val, 0,1,2,3,20,21,22,23,8,9,10,11,12,13,14,15); + v128_t t12 = wasm_v8x16_shuffle(t02, c.val, 24,25,26,27,4,5,6,7,8,9,10,11,28,29,30,31); + + wasm_v128_store(ptr, t10); + wasm_v128_store(ptr + 4, t11); + wasm_v128_store(ptr + 8, t12); +} + +inline void v_store_interleave(float* ptr, const v_float32x4& a, const v_float32x4& b, + const v_float32x4& c, const v_float32x4& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v_float32x4 v0, v1, v2, v3; + v_transpose4x4(a, b, c, d, v0, v1, v2, v3); + + wasm_v128_store(ptr, v0.val); + wasm_v128_store(ptr + 4, v1.val); + wasm_v128_store(ptr + 8, v2.val); + wasm_v128_store(ptr + 12, v3.val); +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i64x2(a.val, b.val); + v128_t v1 = wasm_unpackhi_i64x2(a.val, b.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 2, v1); +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + const v_uint64x2& c, hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_v8x16_shuffle(a.val, b.val, 0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23); + v128_t v1 = wasm_v8x16_shuffle(a.val, c.val, 16,17,18,19,20,21,22,23,8,9,10,11,12,13,14,15); + v128_t v2 = wasm_v8x16_shuffle(b.val, c.val, 8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 2, v1); + wasm_v128_store(ptr + 4, v2); +} + +inline void v_store_interleave(uint64 *ptr, const v_uint64x2& a, const v_uint64x2& b, + const v_uint64x2& c, const v_uint64x2& d, + hal::StoreMode /*mode*/ = hal::STORE_UNALIGNED) +{ + v128_t v0 = wasm_unpacklo_i64x2(a.val, b.val); + v128_t v1 = wasm_unpacklo_i64x2(c.val, d.val); + v128_t v2 = wasm_unpackhi_i64x2(a.val, b.val); + v128_t v3 = wasm_unpackhi_i64x2(c.val, d.val); + + wasm_v128_store(ptr, v0); + wasm_v128_store(ptr + 2, v1); + wasm_v128_store(ptr + 4, v2); + wasm_v128_store(ptr + 6, v3); +} + +#define OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(_Tpvec0, _Tp0, suffix0, _Tpvec1, _Tp1, suffix1) \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0 ) \ +{ \ + _Tpvec1 a1, b1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0 ) \ +{ \ + _Tpvec1 a1, b1, c1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ +} \ +inline void v_load_deinterleave( const _Tp0* ptr, _Tpvec0& a0, _Tpvec0& b0, _Tpvec0& c0, _Tpvec0& d0 ) \ +{ \ + _Tpvec1 a1, b1, c1, d1; \ + v_load_deinterleave((const _Tp1*)ptr, a1, b1, c1, d1); \ + a0 = v_reinterpret_as_##suffix0(a1); \ + b0 = v_reinterpret_as_##suffix0(b1); \ + c0 = v_reinterpret_as_##suffix0(c1); \ + d0 = v_reinterpret_as_##suffix0(d1); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, mode); \ +} \ +inline void v_store_interleave( _Tp0* ptr, const _Tpvec0& a0, const _Tpvec0& b0, \ + const _Tpvec0& c0, const _Tpvec0& d0, \ + hal::StoreMode mode = hal::STORE_UNALIGNED ) \ +{ \ + _Tpvec1 a1 = v_reinterpret_as_##suffix1(a0); \ + _Tpvec1 b1 = v_reinterpret_as_##suffix1(b0); \ + _Tpvec1 c1 = v_reinterpret_as_##suffix1(c0); \ + _Tpvec1 d1 = v_reinterpret_as_##suffix1(d0); \ + v_store_interleave((_Tp1*)ptr, a1, b1, c1, d1, mode); \ +} + +OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(v_int8x16, schar, s8, v_uint8x16, uchar, u8) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(v_int16x8, short, s16, v_uint16x8, ushort, u16) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(v_int32x4, int, s32, v_uint32x4, unsigned, u32) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(v_int64x2, int64, s64, v_uint64x2, uint64, u64) +OPENCV_HAL_IMPL_WASM_LOADSTORE_INTERLEAVE(v_float64x2, double, f64, v_uint64x2, uint64, u64) + +inline v_float32x4 v_cvt_f32(const v_int32x4& a) +{ + return v_float32x4(wasm_f32x4_convert_i32x4(a.val)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a) +{ + double a_[2]; + wasm_v128_store(a_, a.val); + float c_[4]; + c_[0] = (float)(a_[0]); + c_[1] = (float)(a_[1]); + c_[2] = 0; + c_[3] = 0; + return v_float32x4(wasm_v128_load(c_)); +} + +inline v_float32x4 v_cvt_f32(const v_float64x2& a, const v_float64x2& b) +{ + double a_[2], b_[2]; + wasm_v128_store(a_, a.val); + wasm_v128_store(b_, b.val); + float c_[4]; + c_[0] = (float)(a_[0]); + c_[1] = (float)(a_[1]); + c_[2] = (float)(b_[0]); + c_[3] = (float)(b_[1]); + return v_float32x4(wasm_v128_load(c_)); +} + +inline v_float64x2 v_cvt_f64(const v_int32x4& a) +{ +#ifdef __wasm_unimplemented_simd128__ + v128_t p = v128_cvti32x4_i64x2(a.val); + return v_float64x2(wasm_f64x2_convert_i64x2(p)); +#else + int a_[4]; + wasm_v128_store(a_, a.val); + double c_[2]; + c_[0] = (double)(a_[0]); + c_[1] = (double)(a_[1]); + return v_float64x2(wasm_v128_load(c_)); +#endif +} + +inline v_float64x2 v_cvt_f64_high(const v_int32x4& a) +{ +#ifdef __wasm_unimplemented_simd128__ + v128_t p = v128_cvti32x4_i64x2_high(a.val); + return v_float64x2(wasm_f64x2_convert_i64x2(p)); +#else + int a_[4]; + wasm_v128_store(a_, a.val); + double c_[2]; + c_[0] = (double)(a_[2]); + c_[1] = (double)(a_[3]); + return v_float64x2(wasm_v128_load(c_)); +#endif +} + +inline v_float64x2 v_cvt_f64(const v_float32x4& a) +{ + float a_[4]; + wasm_v128_store(a_, a.val); + double c_[2]; + c_[0] = (double)(a_[0]); + c_[1] = (double)(a_[1]); + return v_float64x2(wasm_v128_load(c_)); +} + +inline v_float64x2 v_cvt_f64_high(const v_float32x4& a) +{ + float a_[4]; + wasm_v128_store(a_, a.val); + double c_[2]; + c_[0] = (double)(a_[2]); + c_[1] = (double)(a_[3]); + return v_float64x2(wasm_v128_load(c_)); +} + +inline v_float64x2 v_cvt_f64(const v_int64x2& a) +{ +#ifdef __wasm_unimplemented_simd128__ + return v_float64x2(wasm_f64x2_convert_i64x2(a.val)); +#else + int64 a_[2]; + wasm_v128_store(a_, a.val); + double c_[2]; + c_[0] = (double)(a_[0]); + c_[1] = (double)(a_[1]); + return v_float64x2(wasm_v128_load(c_)); +#endif +} + +////////////// Lookup table access //////////////////// + +inline v_int8x16 v_lut(const schar* tab, const int* idx) +{ + return v_int8x16(tab[idx[0]], tab[idx[1]], tab[idx[ 2]], tab[idx[ 3]], tab[idx[ 4]], tab[idx[ 5]], tab[idx[ 6]], tab[idx[ 7]], + tab[idx[8]], tab[idx[9]], tab[idx[10]], tab[idx[11]], tab[idx[12]], tab[idx[13]], tab[idx[14]], tab[idx[15]]); +} +inline v_int8x16 v_lut_pairs(const schar* tab, const int* idx) +{ + return v_int8x16(tab[idx[0]], tab[idx[0]+1], tab[idx[1]], tab[idx[1]+1], tab[idx[2]], tab[idx[2]+1], tab[idx[3]], tab[idx[3]+1], + tab[idx[4]], tab[idx[4]+1], tab[idx[5]], tab[idx[5]+1], tab[idx[6]], tab[idx[6]+1], tab[idx[7]], tab[idx[7]+1]); +} +inline v_int8x16 v_lut_quads(const schar* tab, const int* idx) +{ + return v_int8x16(tab[idx[0]], tab[idx[0]+1], tab[idx[0]+2], tab[idx[0]+3], tab[idx[1]], tab[idx[1]+1], tab[idx[1]+2], tab[idx[1]+3], + tab[idx[2]], tab[idx[2]+1], tab[idx[2]+2], tab[idx[2]+3], tab[idx[3]], tab[idx[3]+1], tab[idx[3]+2], tab[idx[3]+3]); +} +inline v_uint8x16 v_lut(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut((const schar *)tab, idx)); } +inline v_uint8x16 v_lut_pairs(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_pairs((const schar *)tab, idx)); } +inline v_uint8x16 v_lut_quads(const uchar* tab, const int* idx) { return v_reinterpret_as_u8(v_lut_quads((const schar *)tab, idx)); } + +inline v_int16x8 v_lut(const short* tab, const int* idx) +{ + return v_int16x8(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]], + tab[idx[4]], tab[idx[5]], tab[idx[6]], tab[idx[7]]); +} +inline v_int16x8 v_lut_pairs(const short* tab, const int* idx) +{ + return v_int16x8(tab[idx[0]], tab[idx[0]+1], tab[idx[1]], tab[idx[1]+1], + tab[idx[2]], tab[idx[2]+1], tab[idx[3]], tab[idx[3]+1]); +} +inline v_int16x8 v_lut_quads(const short* tab, const int* idx) +{ + return v_int16x8(tab[idx[0]], tab[idx[0]+1], tab[idx[0]+2], tab[idx[0]+3], + tab[idx[1]], tab[idx[1]+1], tab[idx[1]+2], tab[idx[1]+3]); +} +inline v_uint16x8 v_lut(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut((const short *)tab, idx)); } +inline v_uint16x8 v_lut_pairs(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_pairs((const short *)tab, idx)); } +inline v_uint16x8 v_lut_quads(const ushort* tab, const int* idx) { return v_reinterpret_as_u16(v_lut_quads((const short *)tab, idx)); } + +inline v_int32x4 v_lut(const int* tab, const int* idx) +{ + return v_int32x4(tab[idx[0]], tab[idx[1]], + tab[idx[2]], tab[idx[3]]); +} +inline v_int32x4 v_lut_pairs(const int* tab, const int* idx) +{ + return v_int32x4(tab[idx[0]], tab[idx[0]+1], + tab[idx[1]], tab[idx[1]+1]); +} +inline v_int32x4 v_lut_quads(const int* tab, const int* idx) +{ + return v_int32x4(wasm_v128_load(tab + idx[0])); +} +inline v_uint32x4 v_lut(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut((const int *)tab, idx)); } +inline v_uint32x4 v_lut_pairs(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_pairs((const int *)tab, idx)); } +inline v_uint32x4 v_lut_quads(const unsigned* tab, const int* idx) { return v_reinterpret_as_u32(v_lut_quads((const int *)tab, idx)); } + +inline v_int64x2 v_lut(const int64_t* tab, const int* idx) +{ + return v_int64x2(tab[idx[0]], tab[idx[1]]); +} +inline v_int64x2 v_lut_pairs(const int64_t* tab, const int* idx) +{ + return v_int64x2(wasm_v128_load(tab + idx[0])); +} +inline v_uint64x2 v_lut(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut((const int64_t *)tab, idx)); } +inline v_uint64x2 v_lut_pairs(const uint64_t* tab, const int* idx) { return v_reinterpret_as_u64(v_lut_pairs((const int64_t *)tab, idx)); } + +inline v_float32x4 v_lut(const float* tab, const int* idx) +{ + return v_float32x4(tab[idx[0]], tab[idx[1]], tab[idx[2]], tab[idx[3]]); +} +inline v_float32x4 v_lut_pairs(const float* tab, const int* idx) { return v_reinterpret_as_f32(v_lut_pairs((const int *)tab, idx)); } +inline v_float32x4 v_lut_quads(const float* tab, const int* idx) { return v_reinterpret_as_f32(v_lut_quads((const int *)tab, idx)); } + +inline v_float64x2 v_lut(const double* tab, const int* idx) +{ + return v_float64x2(tab[idx[0]], tab[idx[1]]); +} +inline v_float64x2 v_lut_pairs(const double* tab, const int* idx) +{ + return v_float64x2(wasm_v128_load(tab + idx[0])); +} + +inline v_int32x4 v_lut(const int* tab, const v_int32x4& idxvec) +{ + return v_int32x4(tab[wasm_i32x4_extract_lane(idxvec.val, 0)], + tab[wasm_i32x4_extract_lane(idxvec.val, 1)], + tab[wasm_i32x4_extract_lane(idxvec.val, 2)], + tab[wasm_i32x4_extract_lane(idxvec.val, 3)]); +} + +inline v_uint32x4 v_lut(const unsigned* tab, const v_int32x4& idxvec) +{ + return v_reinterpret_as_u32(v_lut((const int *)tab, idxvec)); +} + +inline v_float32x4 v_lut(const float* tab, const v_int32x4& idxvec) +{ + return v_float32x4(tab[wasm_i32x4_extract_lane(idxvec.val, 0)], + tab[wasm_i32x4_extract_lane(idxvec.val, 1)], + tab[wasm_i32x4_extract_lane(idxvec.val, 2)], + tab[wasm_i32x4_extract_lane(idxvec.val, 3)]); +} + +inline v_float64x2 v_lut(const double* tab, const v_int32x4& idxvec) +{ + return v_float64x2(tab[wasm_i32x4_extract_lane(idxvec.val, 0)], + tab[wasm_i32x4_extract_lane(idxvec.val, 1)]); +} + +// loads pairs from the table and deinterleaves them, e.g. returns: +// x = (tab[idxvec[0], tab[idxvec[1]], tab[idxvec[2]], tab[idxvec[3]]), +// y = (tab[idxvec[0]+1], tab[idxvec[1]+1], tab[idxvec[2]+1], tab[idxvec[3]+1]) +// note that the indices are float's indices, not the float-pair indices. +// in theory, this function can be used to implement bilinear interpolation, +// when idxvec are the offsets within the image. +inline void v_lut_deinterleave(const float* tab, const v_int32x4& idxvec, v_float32x4& x, v_float32x4& y) +{ + x = v_float32x4(tab[wasm_i32x4_extract_lane(idxvec.val, 0)], + tab[wasm_i32x4_extract_lane(idxvec.val, 1)], + tab[wasm_i32x4_extract_lane(idxvec.val, 2)], + tab[wasm_i32x4_extract_lane(idxvec.val, 3)]); + y = v_float32x4(tab[wasm_i32x4_extract_lane(idxvec.val, 0)+1], + tab[wasm_i32x4_extract_lane(idxvec.val, 1)+1], + tab[wasm_i32x4_extract_lane(idxvec.val, 2)+1], + tab[wasm_i32x4_extract_lane(idxvec.val, 3)+1]); +} + +inline void v_lut_deinterleave(const double* tab, const v_int32x4& idxvec, v_float64x2& x, v_float64x2& y) +{ + v128_t xy0 = wasm_v128_load(tab + wasm_i32x4_extract_lane(idxvec.val, 0)); + v128_t xy1 = wasm_v128_load(tab + wasm_i32x4_extract_lane(idxvec.val, 1)); + x.val = wasm_unpacklo_i64x2(xy0, xy1); + y.val = wasm_unpacklo_i64x2(xy0, xy1); +} + +inline v_int8x16 v_interleave_pairs(const v_int8x16& vec) +{ + return v_int8x16(wasm_v8x16_shuffle(vec.val, vec.val, 0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15)); +} +inline v_uint8x16 v_interleave_pairs(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_pairs(v_reinterpret_as_s8(vec))); } +inline v_int8x16 v_interleave_quads(const v_int8x16& vec) +{ + return v_int8x16(wasm_v8x16_shuffle(vec.val, vec.val, 0,4,1,5,2,6,3,7,8,12,9,13,10,14,11,15)); +} +inline v_uint8x16 v_interleave_quads(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_interleave_quads(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_interleave_pairs(const v_int16x8& vec) +{ + return v_int16x8(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15)); +} +inline v_uint16x8 v_interleave_pairs(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_pairs(v_reinterpret_as_s16(vec))); } +inline v_int16x8 v_interleave_quads(const v_int16x8& vec) +{ + return v_int16x8(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,8,9,2,3,10,11,4,5,12,13,6,7,14,15)); +} +inline v_uint16x8 v_interleave_quads(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_interleave_quads(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_interleave_pairs(const v_int32x4& vec) +{ + return v_int32x4(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,2,3,8,9,10,11,4,5,6,7,12,13,14,15)); +} +inline v_uint32x4 v_interleave_pairs(const v_uint32x4& vec) { return v_reinterpret_as_u32(v_interleave_pairs(v_reinterpret_as_s32(vec))); } +inline v_float32x4 v_interleave_pairs(const v_float32x4& vec) +{ + return v_float32x4(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,2,3,8,9,10,11,4,5,6,7,12,13,14,15)); +} + +inline v_int8x16 v_pack_triplets(const v_int8x16& vec) +{ + return v_int8x16(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,2,4,5,6,8,9,10,12,13,14,16,16,16,16)); +} +inline v_uint8x16 v_pack_triplets(const v_uint8x16& vec) { return v_reinterpret_as_u8(v_pack_triplets(v_reinterpret_as_s8(vec))); } + +inline v_int16x8 v_pack_triplets(const v_int16x8& vec) +{ + return v_int16x8(wasm_v8x16_shuffle(vec.val, vec.val, 0,1,2,3,4,5,8,9,10,11,12,13,14,15,6,7)); +} +inline v_uint16x8 v_pack_triplets(const v_uint16x8& vec) { return v_reinterpret_as_u16(v_pack_triplets(v_reinterpret_as_s16(vec))); } + +inline v_int32x4 v_pack_triplets(const v_int32x4& vec) { return vec; } +inline v_uint32x4 v_pack_triplets(const v_uint32x4& vec) { return vec; } +inline v_float32x4 v_pack_triplets(const v_float32x4& vec) { return vec; } + +template +inline typename _Tp::lane_type v_extract_n(const _Tp& a) +{ + return v_rotate_right(a).get0(); +} + +template +inline v_uint32x4 v_broadcast_element(const v_uint32x4& a) +{ + return v_setall_u32(v_extract_n(a)); +} +template +inline v_int32x4 v_broadcast_element(const v_int32x4& a) +{ + return v_setall_s32(v_extract_n(a)); +} +template +inline v_float32x4 v_broadcast_element(const v_float32x4& a) +{ + return v_setall_f32(v_extract_n(a)); +} + + +////////////// FP16 support /////////////////////////// + +inline v_float32x4 v_load_expand(const float16_t* ptr) +{ + float a[4]; + for (int i = 0; i < 4; i++) + a[i] = ptr[i]; + return v_float32x4(wasm_v128_load(a)); +} + +inline void v_pack_store(float16_t* ptr, const v_float32x4& v) +{ + double v_[4]; + wasm_v128_store(v_, v.val); + ptr[0] = float16_t(v_[0]); + ptr[1] = float16_t(v_[1]); + ptr[2] = float16_t(v_[2]); + ptr[3] = float16_t(v_[3]); +} + +inline void v_cleanup() {} + +CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END + +//! @endcond + +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/msa_macros.h b/Thirdparty/opencv2/include/opencv2/core/hal/msa_macros.h new file mode 100644 index 0000000..fad8c5a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/msa_macros.h @@ -0,0 +1,1558 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_HAL_MSA_MACROS_H +#define OPENCV_CORE_HAL_MSA_MACROS_H + +#ifdef __mips_msa +#include "msa.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Define 64 bits vector types */ +typedef signed char v8i8 __attribute__ ((vector_size(8), aligned(8))); +typedef unsigned char v8u8 __attribute__ ((vector_size(8), aligned(8))); +typedef short v4i16 __attribute__ ((vector_size(8), aligned(8))); +typedef unsigned short v4u16 __attribute__ ((vector_size(8), aligned(8))); +typedef int v2i32 __attribute__ ((vector_size(8), aligned(8))); +typedef unsigned int v2u32 __attribute__ ((vector_size(8), aligned(8))); +typedef long long v1i64 __attribute__ ((vector_size(8), aligned(8))); +typedef unsigned long long v1u64 __attribute__ ((vector_size(8), aligned(8))); +typedef float v2f32 __attribute__ ((vector_size(8), aligned(8))); +typedef double v1f64 __attribute__ ((vector_size(8), aligned(8))); + + +/* Load values from the given memory a 64-bit vector. */ +#define msa_ld1_s8(__a) (*((v8i8*)(__a))) +#define msa_ld1_s16(__a) (*((v4i16*)(__a))) +#define msa_ld1_s32(__a) (*((v2i32*)(__a))) +#define msa_ld1_s64(__a) (*((v1i64*)(__a))) +#define msa_ld1_u8(__a) (*((v8u8*)(__a))) +#define msa_ld1_u16(__a) (*((v4u16*)(__a))) +#define msa_ld1_u32(__a) (*((v2u32*)(__a))) +#define msa_ld1_u64(__a) (*((v1u64*)(__a))) +#define msa_ld1_f32(__a) (*((v2f32*)(__a))) +#define msa_ld1_f64(__a) (*((v1f64*)(__a))) + +/* Load values from the given memory address to a 128-bit vector */ +#define msa_ld1q_s8(__a) ((v16i8)__builtin_msa_ld_b(__a, 0)) +#define msa_ld1q_s16(__a) ((v8i16)__builtin_msa_ld_h(__a, 0)) +#define msa_ld1q_s32(__a) ((v4i32)__builtin_msa_ld_w(__a, 0)) +#define msa_ld1q_s64(__a) ((v2i64)__builtin_msa_ld_d(__a, 0)) +#define msa_ld1q_u8(__a) ((v16u8)__builtin_msa_ld_b(__a, 0)) +#define msa_ld1q_u16(__a) ((v8u16)__builtin_msa_ld_h(__a, 0)) +#define msa_ld1q_u32(__a) ((v4u32)__builtin_msa_ld_w(__a, 0)) +#define msa_ld1q_u64(__a) ((v2u64)__builtin_msa_ld_d(__a, 0)) +#define msa_ld1q_f32(__a) ((v4f32)__builtin_msa_ld_w(__a, 0)) +#define msa_ld1q_f64(__a) ((v2f64)__builtin_msa_ld_d(__a, 0)) + +/* Store 64bits vector elements values to the given memory address. */ +#define msa_st1_s8(__a, __b) (*((v8i8*)(__a)) = __b) +#define msa_st1_s16(__a, __b) (*((v4i16*)(__a)) = __b) +#define msa_st1_s32(__a, __b) (*((v2i32*)(__a)) = __b) +#define msa_st1_s64(__a, __b) (*((v1i64*)(__a)) = __b) +#define msa_st1_u8(__a, __b) (*((v8u8*)(__a)) = __b) +#define msa_st1_u16(__a, __b) (*((v4u16*)(__a)) = __b) +#define msa_st1_u32(__a, __b) (*((v2u32*)(__a)) = __b) +#define msa_st1_u64(__a, __b) (*((v1u64*)(__a)) = __b) +#define msa_st1_f32(__a, __b) (*((v2f32*)(__a)) = __b) +#define msa_st1_f64(__a, __b) (*((v1f64*)(__a)) = __b) + +/* Store the values of elements in the 128 bits vector __a to the given memory address __a. */ +#define msa_st1q_s8(__a, __b) (__builtin_msa_st_b((v16i8)(__b), __a, 0)) +#define msa_st1q_s16(__a, __b) (__builtin_msa_st_h((v8i16)(__b), __a, 0)) +#define msa_st1q_s32(__a, __b) (__builtin_msa_st_w((v4i32)(__b), __a, 0)) +#define msa_st1q_s64(__a, __b) (__builtin_msa_st_d((v2i64)(__b), __a, 0)) +#define msa_st1q_u8(__a, __b) (__builtin_msa_st_b((v16i8)(__b), __a, 0)) +#define msa_st1q_u16(__a, __b) (__builtin_msa_st_h((v8i16)(__b), __a, 0)) +#define msa_st1q_u32(__a, __b) (__builtin_msa_st_w((v4i32)(__b), __a, 0)) +#define msa_st1q_u64(__a, __b) (__builtin_msa_st_d((v2i64)(__b), __a, 0)) +#define msa_st1q_f32(__a, __b) (__builtin_msa_st_w((v4i32)(__b), __a, 0)) +#define msa_st1q_f64(__a, __b) (__builtin_msa_st_d((v2i64)(__b), __a, 0)) + +/* Store the value of the element with the index __c in vector __a to the given memory address __a. */ +#define msa_st1_lane_s8(__a, __b, __c) (*((int8_t*)(__a)) = __b[__c]) +#define msa_st1_lane_s16(__a, __b, __c) (*((int16_t*)(__a)) = __b[__c]) +#define msa_st1_lane_s32(__a, __b, __c) (*((int32_t*)(__a)) = __b[__c]) +#define msa_st1_lane_s64(__a, __b, __c) (*((int64_t*)(__a)) = __b[__c]) +#define msa_st1_lane_u8(__a, __b, __c) (*((uint8_t*)(__a)) = __b[__c]) +#define msa_st1_lane_u16(__a, __b, __c) (*((uint16_t*)(__a)) = __b[__c]) +#define msa_st1_lane_u32(__a, __b, __c) (*((uint32_t*)(__a)) = __b[__c]) +#define msa_st1_lane_u64(__a, __b, __c) (*((uint64_t*)(__a)) = __b[__c]) +#define msa_st1_lane_f32(__a, __b, __c) (*((float*)(__a)) = __b[__c]) +#define msa_st1_lane_f64(__a, __b, __c) (*((double*)(__a)) = __b[__c]) +#define msa_st1q_lane_s8(__a, __b, __c) (*((int8_t*)(__a)) = (int8_t)__builtin_msa_copy_s_b(__b, __c)) +#define msa_st1q_lane_s16(__a, __b, __c) (*((int16_t*)(__a)) = (int16_t)__builtin_msa_copy_s_h(__b, __c)) +#define msa_st1q_lane_s32(__a, __b, __c) (*((int32_t*)(__a)) = __builtin_msa_copy_s_w(__b, __c)) +#define msa_st1q_lane_s64(__a, __b, __c) (*((int64_t*)(__a)) = __builtin_msa_copy_s_d(__b, __c)) +#define msa_st1q_lane_u8(__a, __b, __c) (*((uint8_t*)(__a)) = (uint8_t)__builtin_msa_copy_u_b((v16i8)(__b), __c)) +#define msa_st1q_lane_u16(__a, __b, __c) (*((uint16_t*)(__a)) = (uint16_t)__builtin_msa_copy_u_h((v8i16)(__b), __c)) +#define msa_st1q_lane_u32(__a, __b, __c) (*((uint32_t*)(__a)) = __builtin_msa_copy_u_w((v4i32)(__b), __c)) +#define msa_st1q_lane_u64(__a, __b, __c) (*((uint64_t*)(__a)) = __builtin_msa_copy_u_d((v2i64)(__b), __c)) +#define msa_st1q_lane_f32(__a, __b, __c) (*((float*)(__a)) = __b[__c]) +#define msa_st1q_lane_f64(__a, __b, __c) (*((double*)(__a)) = __b[__c]) + +/* Duplicate elements for 64-bit doubleword vectors */ +#define msa_dup_n_s8(__a) ((v8i8)__builtin_msa_copy_s_d((v2i64)__builtin_msa_fill_b((int32_t)(__a)), 0)) +#define msa_dup_n_s16(__a) ((v4i16)__builtin_msa_copy_s_d((v2i64)__builtin_msa_fill_h((int32_t)(__a)), 0)) +#define msa_dup_n_s32(__a) ((v2i32){__a, __a}) +#define msa_dup_n_s64(__a) ((v1i64){__a}) +#define msa_dup_n_u8(__a) ((v8u8)__builtin_msa_copy_u_d((v2i64)__builtin_msa_fill_b((int32_t)(__a)), 0)) +#define msa_dup_n_u16(__a) ((v4u16)__builtin_msa_copy_u_d((v2i64)__builtin_msa_fill_h((int32_t)(__a)), 0)) +#define msa_dup_n_u32(__a) ((v2u32){__a, __a}) +#define msa_dup_n_u64(__a) ((v1u64){__a}) +#define msa_dup_n_f32(__a) ((v2f32){__a, __a}) +#define msa_dup_n_f64(__a) ((v1f64){__a}) + +/* Duplicate elements for 128-bit quadword vectors */ +#define msa_dupq_n_s8(__a) (__builtin_msa_fill_b((int32_t)(__a))) +#define msa_dupq_n_s16(__a) (__builtin_msa_fill_h((int32_t)(__a))) +#define msa_dupq_n_s32(__a) (__builtin_msa_fill_w((int32_t)(__a))) +#define msa_dupq_n_s64(__a) (__builtin_msa_fill_d((int64_t)(__a))) +#define msa_dupq_n_u8(__a) ((v16u8)__builtin_msa_fill_b((int32_t)(__a))) +#define msa_dupq_n_u16(__a) ((v8u16)__builtin_msa_fill_h((int32_t)(__a))) +#define msa_dupq_n_u32(__a) ((v4u32)__builtin_msa_fill_w((int32_t)(__a))) +#define msa_dupq_n_u64(__a) ((v2u64)__builtin_msa_fill_d((int64_t)(__a))) +#define msa_dupq_n_f32(__a) ((v4f32){__a, __a, __a, __a}) +#define msa_dupq_n_f64(__a) ((v2f64){__a, __a}) +#define msa_dupq_lane_s8(__a, __b) (__builtin_msa_splat_b(__a, __b)) +#define msa_dupq_lane_s16(__a, __b) (__builtin_msa_splat_h(__a, __b)) +#define msa_dupq_lane_s32(__a, __b) (__builtin_msa_splat_w(__a, __b)) +#define msa_dupq_lane_s64(__a, __b) (__builtin_msa_splat_d(__a, __b)) +#define msa_dupq_lane_u8(__a, __b) ((v16u8)__builtin_msa_splat_b((v16i8)(__a), __b)) +#define msa_dupq_lane_u16(__a, __b) ((v8u16)__builtin_msa_splat_h((v8i16)(__a), __b)) +#define msa_dupq_lane_u32(__a, __b) ((v4u32)__builtin_msa_splat_w((v4i32)(__a), __b)) +#define msa_dupq_lane_u64(__a, __b) ((v2u64)__builtin_msa_splat_d((v2i64)(__a), __b)) + +/* Create a 64 bits vector */ +#define msa_create_s8(__a) ((v8i8)((uint64_t)(__a))) +#define msa_create_s16(__a) ((v4i16)((uint64_t)(__a))) +#define msa_create_s32(__a) ((v2i32)((uint64_t)(__a))) +#define msa_create_s64(__a) ((v1i64)((uint64_t)(__a))) +#define msa_create_u8(__a) ((v8u8)((uint64_t)(__a))) +#define msa_create_u16(__a) ((v4u16)((uint64_t)(__a))) +#define msa_create_u32(__a) ((v2u32)((uint64_t)(__a))) +#define msa_create_u64(__a) ((v1u64)((uint64_t)(__a))) +#define msa_create_f32(__a) ((v2f32)((uint64_t)(__a))) +#define msa_create_f64(__a) ((v1f64)((uint64_t)(__a))) + +/* Sign extends or zero extends each element in a 64 bits vector to twice its original length, and places the results in a 128 bits vector. */ +/*Transform v8i8 to v8i16*/ +#define msa_movl_s8(__a) \ +((v8i16){(__a)[0], (__a)[1], (__a)[2], (__a)[3], \ + (__a)[4], (__a)[5], (__a)[6], (__a)[7]}) + +/*Transform v8u8 to v8u16*/ +#define msa_movl_u8(__a) \ +((v8u16){(__a)[0], (__a)[1], (__a)[2], (__a)[3], \ + (__a)[4], (__a)[5], (__a)[6], (__a)[7]}) + +/*Transform v4i16 to v8i16*/ +#define msa_movl_s16(__a) ((v4i32){(__a)[0], (__a)[1], (__a)[2], (__a)[3]}) + +/*Transform v2i32 to v4i32*/ +#define msa_movl_s32(__a) ((v2i64){(__a)[0], (__a)[1]}) + +/*Transform v4u16 to v8u16*/ +#define msa_movl_u16(__a) ((v4u32){(__a)[0], (__a)[1], (__a)[2], (__a)[3]}) + +/*Transform v2u32 to v4u32*/ +#define msa_movl_u32(__a) ((v2u64){(__a)[0], (__a)[1]}) + +/* Copies the least significant half of each element of a 128 bits vector into the corresponding elements of a 64 bits vector. */ +#define msa_movn_s16(__a) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)(__a)); \ + (v8i8)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_movn_s32(__a) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)(__a)); \ + (v4i16)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_movn_s64(__a) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)(__a)); \ + (v2i32)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_movn_u16(__a) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)(__a)); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_movn_u32(__a) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)(__a)); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_movn_u64(__a) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)(__a)); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +/* qmovn */ +#define msa_qmovn_s16(__a) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_sat_s_h((v8i16)(__a), 7)); \ + (v8i8)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_qmovn_s32(__a) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_sat_s_w((v4i32)(__a), 15)); \ + (v4i16)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_qmovn_s64(__a) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_sat_s_d((v2i64)(__a), 31)); \ + (v2i32)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_qmovn_u16(__a) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_sat_u_h((v8u16)(__a), 7)); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_qmovn_u32(__a) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_sat_u_w((v4u32)(__a), 15)); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_qmovn_u64(__a) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_sat_u_d((v2u64)(__a), 31)); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +/* qmovun */ +#define msa_qmovun_s16(__a) \ +({ \ + v8i16 __d = __builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__a)); \ + v16i8 __e = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_sat_u_h((v8u16)__d, 7)); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qmovun_s32(__a) \ +({ \ + v4i32 __d = __builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__a)); \ + v8i16 __e = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_sat_u_w((v4u32)__d, 15)); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qmovun_s64(__a) \ +({ \ + v2i64 __d = __builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__a)); \ + v4i32 __e = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_sat_u_d((v2u64)__d, 31)); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +/* Right shift elements in a 128 bits vector by an immediate value, and places the results in a 64 bits vector. */ +#define msa_shrn_n_s16(__a, __b) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_srai_h((v8i16)(__a), (int)(__b))); \ + (v8i8)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_shrn_n_s32(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_srai_w((v4i32)(__a), (int)(__b))); \ + (v4i16)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_shrn_n_s64(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_srai_d((v2i64)(__a), (int)(__b))); \ + (v2i32)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_shrn_n_u16(__a, __b) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_srli_h((v8i16)(__a), (int)(__b))); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_shrn_n_u32(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_srli_w((v4i32)(__a), (int)(__b))); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_shrn_n_u64(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_srli_d((v2i64)(__a), (int)(__b))); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +/* Right shift elements in a 128 bits vector by an immediate value, and places the results in a 64 bits vector. */ +#define msa_rshrn_n_s16(__a, __b) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_srari_h((v8i16)(__a), (int)__b)); \ + (v8i8)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_rshrn_n_s32(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_srari_w((v4i32)(__a), (int)__b)); \ + (v4i16)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_rshrn_n_s64(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_srari_d((v2i64)(__a), (int)__b)); \ + (v2i32)__builtin_msa_copy_s_d((v2i64)__d, 0); \ +}) + +#define msa_rshrn_n_u16(__a, __b) \ +({ \ + v16i8 __d = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_srlri_h((v8i16)(__a), (int)__b)); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_rshrn_n_u32(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_srlri_w((v4i32)(__a), (int)__b)); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +#define msa_rshrn_n_u64(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_srlri_d((v2i64)(__a), (int)__b)); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__d, 0); \ +}) + +/* Right shift elements in a 128 bits vector by an immediate value, saturate the results and them in a 64 bits vector. */ +#define msa_qrshrn_n_s16(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_sat_s_h(__builtin_msa_srari_h((v8i16)(__a), (int)(__b)), 7); \ + v16i8 __e = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__d); \ + (v8i8)__builtin_msa_copy_s_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrn_n_s32(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_sat_s_w(__builtin_msa_srari_w((v4i32)(__a), (int)(__b)), 15); \ + v8i16 __e = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__d); \ + (v4i16)__builtin_msa_copy_s_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrn_n_s64(__a, __b) \ +({ \ + v2i64 __d = __builtin_msa_sat_s_d(__builtin_msa_srari_d((v2i64)(__a), (int)(__b)), 31); \ + v4i32 __e = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__d); \ + (v2i32)__builtin_msa_copy_s_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrn_n_u16(__a, __b) \ +({ \ + v8u16 __d = __builtin_msa_sat_u_h((v8u16)__builtin_msa_srlri_h((v8i16)(__a), (int)(__b)), 7); \ + v16i8 __e = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__d); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrn_n_u32(__a, __b) \ +({ \ + v4u32 __d = __builtin_msa_sat_u_w((v4u32)__builtin_msa_srlri_w((v4i32)(__a), (int)(__b)), 15); \ + v8i16 __e = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__d); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrn_n_u64(__a, __b) \ +({ \ + v2u64 __d = __builtin_msa_sat_u_d((v2u64)__builtin_msa_srlri_d((v2i64)(__a), (int)(__b)), 31); \ + v4i32 __e = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__d); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +/* Right shift elements in a 128 bits vector by an immediate value, saturate the results and them in a 64 bits vector. + Input is signed and output is unsigned. */ +#define msa_qrshrun_n_s16(__a, __b) \ +({ \ + v8i16 __d = __builtin_msa_srlri_h(__builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__a)), (int)(__b)); \ + v16i8 __e = __builtin_msa_pckev_b(__builtin_msa_fill_b(0), (v16i8)__builtin_msa_sat_u_h((v8u16)__d, 7)); \ + (v8u8)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrun_n_s32(__a, __b) \ +({ \ + v4i32 __d = __builtin_msa_srlri_w(__builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__a)), (int)(__b)); \ + v8i16 __e = __builtin_msa_pckev_h(__builtin_msa_fill_h(0), (v8i16)__builtin_msa_sat_u_w((v4u32)__d, 15)); \ + (v4u16)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +#define msa_qrshrun_n_s64(__a, __b) \ +({ \ + v2i64 __d = __builtin_msa_srlri_d(__builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__a)), (int)(__b)); \ + v4i32 __e = __builtin_msa_pckev_w(__builtin_msa_fill_w(0), (v4i32)__builtin_msa_sat_u_d((v2u64)__d, 31)); \ + (v2u32)__builtin_msa_copy_u_d((v2i64)__e, 0); \ +}) + +/* pack */ +#define msa_pack_s16(__a, __b) (__builtin_msa_pckev_b((v16i8)(__b), (v16i8)(__a))) +#define msa_pack_s32(__a, __b) (__builtin_msa_pckev_h((v8i16)(__b), (v8i16)(__a))) +#define msa_pack_s64(__a, __b) (__builtin_msa_pckev_w((v4i32)(__b), (v4i32)(__a))) +#define msa_pack_u16(__a, __b) ((v16u8)__builtin_msa_pckev_b((v16i8)(__b), (v16i8)(__a))) +#define msa_pack_u32(__a, __b) ((v8u16)__builtin_msa_pckev_h((v8i16)(__b), (v8i16)(__a))) +#define msa_pack_u64(__a, __b) ((v4u32)__builtin_msa_pckev_w((v4i32)(__b), (v4i32)(__a))) + +/* qpack */ +#define msa_qpack_s16(__a, __b) \ +(__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_s_h((v8i16)(__b), 7), (v16i8)__builtin_msa_sat_s_h((v8i16)(__a), 7))) +#define msa_qpack_s32(__a, __b) \ +(__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_s_w((v4i32)(__b), 15), (v8i16)__builtin_msa_sat_s_w((v4i32)(__a), 15))) +#define msa_qpack_s64(__a, __b) \ +(__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_s_d((v2i64)(__b), 31), (v4i32)__builtin_msa_sat_s_d((v2i64)(__a), 31))) +#define msa_qpack_u16(__a, __b) \ +((v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_u_h((v8u16)(__b), 7), (v16i8)__builtin_msa_sat_u_h((v8u16)(__a), 7))) +#define msa_qpack_u32(__a, __b) \ +((v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_u_w((v4u32)(__b), 15), (v8i16)__builtin_msa_sat_u_w((v4u32)(__a), 15))) +#define msa_qpack_u64(__a, __b) \ +((v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_u_d((v2u64)(__b), 31), (v4i32)__builtin_msa_sat_u_d((v2u64)(__a), 31))) + +/* qpacku */ +#define msa_qpacku_s16(__a, __b) \ +((v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_u_h((v8u16)(__builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__b))), 7), \ + (v16i8)__builtin_msa_sat_u_h((v8u16)(__builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__a))), 7))) +#define msa_qpacku_s32(__a, __b) \ +((v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_u_w((v4u32)(__builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__b))), 15), \ + (v8i16)__builtin_msa_sat_u_w((v4u32)(__builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__a))), 15))) +#define msa_qpacku_s64(__a, __b) \ +((v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_u_d((v2u64)(__builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__b))), 31), \ + (v4i32)__builtin_msa_sat_u_d((v2u64)(__builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__a))), 31))) + +/* packr */ +#define msa_packr_s16(__a, __b, __c) \ +(__builtin_msa_pckev_b((v16i8)__builtin_msa_srai_h((v8i16)(__b), (int)(__c)), (v16i8)__builtin_msa_srai_h((v8i16)(__a), (int)(__c)))) +#define msa_packr_s32(__a, __b, __c) \ +(__builtin_msa_pckev_h((v8i16)__builtin_msa_srai_w((v4i32)(__b), (int)(__c)), (v8i16)__builtin_msa_srai_w((v4i32)(__a), (int)(__c)))) +#define msa_packr_s64(__a, __b, __c) \ +(__builtin_msa_pckev_w((v4i32)__builtin_msa_srai_d((v2i64)(__b), (int)(__c)), (v4i32)__builtin_msa_srai_d((v2i64)(__a), (int)(__c)))) +#define msa_packr_u16(__a, __b, __c) \ +((v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_srli_h((v8i16)(__b), (int)(__c)), (v16i8)__builtin_msa_srli_h((v8i16)(__a), (int)(__c)))) +#define msa_packr_u32(__a, __b, __c) \ +((v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_srli_w((v4i32)(__b), (int)(__c)), (v8i16)__builtin_msa_srli_w((v4i32)(__a), (int)(__c)))) +#define msa_packr_u64(__a, __b, __c) \ +((v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_srli_d((v2i64)(__b), (int)(__c)), (v4i32)__builtin_msa_srli_d((v2i64)(__a), (int)(__c)))) + +/* rpackr */ +#define msa_rpackr_s16(__a, __b, __c) \ +(__builtin_msa_pckev_b((v16i8)__builtin_msa_srari_h((v8i16)(__b), (int)(__c)), (v16i8)__builtin_msa_srari_h((v8i16)(__a), (int)(__c)))) +#define msa_rpackr_s32(__a, __b, __c) \ +(__builtin_msa_pckev_h((v8i16)__builtin_msa_srari_w((v4i32)(__b), (int)(__c)), (v8i16)__builtin_msa_srari_w((v4i32)(__a), (int)(__c)))) +#define msa_rpackr_s64(__a, __b, __c) \ +(__builtin_msa_pckev_w((v4i32)__builtin_msa_srari_d((v2i64)(__b), (int)(__c)), (v4i32)__builtin_msa_srari_d((v2i64)(__a), (int)(__c)))) +#define msa_rpackr_u16(__a, __b, __c) \ +((v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_srlri_h((v8i16)(__b), (int)(__c)), (v16i8)__builtin_msa_srlri_h((v8i16)(__a), (int)(__c)))) +#define msa_rpackr_u32(__a, __b, __c) \ +((v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_srlri_w((v4i32)(__b), (int)(__c)), (v8i16)__builtin_msa_srlri_w((v4i32)(__a), (int)(__c)))) +#define msa_rpackr_u64(__a, __b, __c) \ +((v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_srlri_d((v2i64)(__b), (int)(__c)), (v4i32)__builtin_msa_srlri_d((v2i64)(__a), (int)(__c)))) + +/* qrpackr */ +#define msa_qrpackr_s16(__a, __b, __c) \ +(__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_s_h(__builtin_msa_srari_h((v8i16)(__b), (int)(__c)), 7), \ + (v16i8)__builtin_msa_sat_s_h(__builtin_msa_srari_h((v8i16)(__a), (int)(__c)), 7))) +#define msa_qrpackr_s32(__a, __b, __c) \ +(__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_s_w(__builtin_msa_srari_w((v4i32)(__b), (int)(__c)), 15), \ + (v8i16)__builtin_msa_sat_s_w(__builtin_msa_srari_w((v4i32)(__a), (int)(__c)), 15))) +#define msa_qrpackr_s64(__a, __b, __c) \ +(__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_s_d(__builtin_msa_srari_d((v2i64)(__b), (int)(__c)), 31), \ + (v4i32)__builtin_msa_sat_s_d(__builtin_msa_srari_d((v2i64)(__a), (int)(__c)), 31))) +#define msa_qrpackr_u16(__a, __b, __c) \ +((v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_u_h((v8u16)__builtin_msa_srlri_h((v8i16)(__b), (int)(__c)), 7), \ + (v16i8)__builtin_msa_sat_u_h((v8u16)__builtin_msa_srlri_h((v8i16)(__a), (int)(__c)), 7))) +#define msa_qrpackr_u32(__a, __b, __c) \ +((v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_u_w((v4u32)__builtin_msa_srlri_w((v4i32)(__b), (int)(__c)), 15), \ + (v8i16)__builtin_msa_sat_u_w((v4u32)__builtin_msa_srlri_w((v4i32)(__a), (int)(__c)), 15))) +#define msa_qrpackr_u64(__a, __b, __c) \ +((v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_u_d((v2u64)__builtin_msa_srlri_d((v2i64)(__b), (int)(__c)), 31), \ + (v4i32)__builtin_msa_sat_u_d((v2u64)__builtin_msa_srlri_d((v2i64)(__a), (int)(__c)), 31))) + +/* qrpackru */ +#define msa_qrpackru_s16(__a, __b, __c) \ +({ \ + v8i16 __d = __builtin_msa_srlri_h(__builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__a)), (int)(__c)); \ + v8i16 __e = __builtin_msa_srlri_h(__builtin_msa_max_s_h(__builtin_msa_fill_h(0), (v8i16)(__b)), (int)(__c)); \ + (v16u8)__builtin_msa_pckev_b((v16i8)__builtin_msa_sat_u_h((v8u16)__e, 7), (v16i8)__builtin_msa_sat_u_h((v8u16)__d, 7)); \ +}) + +#define msa_qrpackru_s32(__a, __b, __c) \ +({ \ + v4i32 __d = __builtin_msa_srlri_w(__builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__a)), (int)(__c)); \ + v4i32 __e = __builtin_msa_srlri_w(__builtin_msa_max_s_w(__builtin_msa_fill_w(0), (v4i32)(__b)), (int)(__c)); \ + (v8u16)__builtin_msa_pckev_h((v8i16)__builtin_msa_sat_u_w((v4u32)__e, 15), (v8i16)__builtin_msa_sat_u_w((v4u32)__d, 15)); \ +}) + +#define msa_qrpackru_s64(__a, __b, __c) \ +({ \ + v2i64 __d = __builtin_msa_srlri_d(__builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__a)), (int)(__c)); \ + v2i64 __e = __builtin_msa_srlri_d(__builtin_msa_max_s_d(__builtin_msa_fill_d(0), (v2i64)(__b)), (int)(__c)); \ + (v4u32)__builtin_msa_pckev_w((v4i32)__builtin_msa_sat_u_d((v2u64)__e, 31), (v4i32)__builtin_msa_sat_u_d((v2u64)__d, 31)); \ +}) + +/* Minimum values between corresponding elements in the two vectors are written to the returned vector. */ +#define msa_minq_s8(__a, __b) (__builtin_msa_min_s_b(__a, __b)) +#define msa_minq_s16(__a, __b) (__builtin_msa_min_s_h(__a, __b)) +#define msa_minq_s32(__a, __b) (__builtin_msa_min_s_w(__a, __b)) +#define msa_minq_s64(__a, __b) (__builtin_msa_min_s_d(__a, __b)) +#define msa_minq_u8(__a, __b) ((v16u8)__builtin_msa_min_u_b(__a, __b)) +#define msa_minq_u16(__a, __b) ((v8u16)__builtin_msa_min_u_h(__a, __b)) +#define msa_minq_u32(__a, __b) ((v4u32)__builtin_msa_min_u_w(__a, __b)) +#define msa_minq_u64(__a, __b) ((v2u64)__builtin_msa_min_u_d(__a, __b)) +#define msa_minq_f32(__a, __b) (__builtin_msa_fmin_w(__a, __b)) +#define msa_minq_f64(__a, __b) (__builtin_msa_fmin_d(__a, __b)) + +/* Maximum values between corresponding elements in the two vectors are written to the returned vector. */ +#define msa_maxq_s8(__a, __b) (__builtin_msa_max_s_b(__a, __b)) +#define msa_maxq_s16(__a, __b) (__builtin_msa_max_s_h(__a, __b)) +#define msa_maxq_s32(__a, __b) (__builtin_msa_max_s_w(__a, __b)) +#define msa_maxq_s64(__a, __b) (__builtin_msa_max_s_d(__a, __b)) +#define msa_maxq_u8(__a, __b) ((v16u8)__builtin_msa_max_u_b(__a, __b)) +#define msa_maxq_u16(__a, __b) ((v8u16)__builtin_msa_max_u_h(__a, __b)) +#define msa_maxq_u32(__a, __b) ((v4u32)__builtin_msa_max_u_w(__a, __b)) +#define msa_maxq_u64(__a, __b) ((v2u64)__builtin_msa_max_u_d(__a, __b)) +#define msa_maxq_f32(__a, __b) (__builtin_msa_fmax_w(__a, __b)) +#define msa_maxq_f64(__a, __b) (__builtin_msa_fmax_d(__a, __b)) + +/* Vector type reinterpretion */ +#define MSA_TPV_REINTERPRET(_Tpv, Vec) ((_Tpv)(Vec)) + +/* Add the odd elements in vector __a with the even elements in vector __b to double width elements in the returned vector. */ +/* v8i16 msa_hadd_s16 ((v16i8)__a, (v16i8)__b) */ +#define msa_hadd_s16(__a, __b) (__builtin_msa_hadd_s_h((v16i8)(__a), (v16i8)(__b))) +/* v4i32 msa_hadd_s32 ((v8i16)__a, (v8i16)__b) */ +#define msa_hadd_s32(__a, __b) (__builtin_msa_hadd_s_w((v8i16)(__a), (v8i16)(__b))) +/* v2i64 msa_hadd_s64 ((v4i32)__a, (v4i32)__b) */ +#define msa_hadd_s64(__a, __b) (__builtin_msa_hadd_s_d((v4i32)(__a), (v4i32)(__b))) + +/* Copy even elements in __a to the left half and even elements in __b to the right half and return the result vector. */ +#define msa_pckev_s8(__a, __b) (__builtin_msa_pckev_b((v16i8)(__a), (v16i8)(__b))) +#define msa_pckev_s16(__a, __b) (__builtin_msa_pckev_h((v8i16)(__a), (v8i16)(__b))) +#define msa_pckev_s32(__a, __b) (__builtin_msa_pckev_w((v4i32)(__a), (v4i32)(__b))) +#define msa_pckev_s64(__a, __b) (__builtin_msa_pckev_d((v2i64)(__a), (v2i64)(__b))) + +/* Copy even elements in __a to the left half and even elements in __b to the right half and return the result vector. */ +#define msa_pckod_s8(__a, __b) (__builtin_msa_pckod_b((v16i8)(__a), (v16i8)(__b))) +#define msa_pckod_s16(__a, __b) (__builtin_msa_pckod_h((v8i16)(__a), (v8i16)(__b))) +#define msa_pckod_s32(__a, __b) (__builtin_msa_pckod_w((v4i32)(__a), (v4i32)(__b))) +#define msa_pckod_s64(__a, __b) (__builtin_msa_pckod_d((v2i64)(__a), (v2i64)(__b))) + +#ifdef _MIPSEB +#define LANE_IMM0_1(x) (0b1 - ((x) & 0b1)) +#define LANE_IMM0_3(x) (0b11 - ((x) & 0b11)) +#define LANE_IMM0_7(x) (0b111 - ((x) & 0b111)) +#define LANE_IMM0_15(x) (0b1111 - ((x) & 0b1111)) +#else +#define LANE_IMM0_1(x) ((x) & 0b1) +#define LANE_IMM0_3(x) ((x) & 0b11) +#define LANE_IMM0_7(x) ((x) & 0b111) +#define LANE_IMM0_15(x) ((x) & 0b1111) +#endif + +#define msa_get_lane_u8(__a, __b) ((uint8_t)(__a)[LANE_IMM0_7(__b)]) +#define msa_get_lane_s8(__a, __b) ((int8_t)(__a)[LANE_IMM0_7(__b)]) +#define msa_get_lane_u16(__a, __b) ((uint16_t)(__a)[LANE_IMM0_3(__b)]) +#define msa_get_lane_s16(__a, __b) ((int16_t)(__a)[LANE_IMM0_3(__b)]) +#define msa_get_lane_u32(__a, __b) ((uint32_t)(__a)[LANE_IMM0_1(__b)]) +#define msa_get_lane_s32(__a, __b) ((int32_t)(__a)[LANE_IMM0_1(__b)]) +#define msa_get_lane_f32(__a, __b) ((float)(__a)[LANE_IMM0_3(__b)]) +#define msa_get_lane_s64(__a, __b) ((int64_t)(__a)[LANE_IMM0_1(__b)]) +#define msa_get_lane_u64(__a, __b) ((uint64_t)(__a)[LANE_IMM0_1(__b)]) +#define msa_get_lane_f64(__a, __b) ((double)(__a)[LANE_IMM0_1(__b)]) +#define msa_getq_lane_u8(__a, imm0_15) ((uint8_t)__builtin_msa_copy_u_b((v16i8)(__a), imm0_15)) +#define msa_getq_lane_s8(__a, imm0_15) ((int8_t)__builtin_msa_copy_s_b(__a, imm0_15)) +#define msa_getq_lane_u16(__a, imm0_7) ((uint16_t)__builtin_msa_copy_u_h((v8i16)(__a), imm0_7)) +#define msa_getq_lane_s16(__a, imm0_7) ((int16_t)__builtin_msa_copy_s_h(__a, imm0_7)) +#define msa_getq_lane_u32(__a, imm0_3) __builtin_msa_copy_u_w((v4i32)(__a), imm0_3) +#define msa_getq_lane_s32 __builtin_msa_copy_s_w +#define msa_getq_lane_f32(__a, __b) ((float)(__a)[LANE_IMM0_3(__b)]) +#define msa_getq_lane_f64(__a, __b) ((double)(__a)[LANE_IMM0_1(__b)]) +#if (__mips == 64) +#define msa_getq_lane_u64(__a, imm0_1) __builtin_msa_copy_u_d((v2i64)(__a), imm0_1) +#define msa_getq_lane_s64 __builtin_msa_copy_s_d +#else +#define msa_getq_lane_u64(__a, imm0_1) ((uint64_t)(__a)[LANE_IMM0_1(imm0_1)]) +#define msa_getq_lane_s64(__a, imm0_1) ((int64_t)(__a)[LANE_IMM0_1(imm0_1)]) +#endif + +/* combine */ +#if (__mips == 64) +#define __COMBINE_64_64(__TYPE, a, b) ((__TYPE)((v2u64){((v1u64)(a))[0], ((v1u64)(b))[0]})) +#else +#define __COMBINE_64_64(__TYPE, a, b) ((__TYPE)((v4u32){((v2u32)(a))[0], ((v2u32)(a))[1], \ + ((v2u32)(b))[0], ((v2u32)(b))[1]})) +#endif + +/* v16i8 msa_combine_s8 (v8i8 __a, v8i8 __b) */ +#define msa_combine_s8(__a, __b) __COMBINE_64_64(v16i8, __a, __b) + +/* v8i16 msa_combine_s16(v4i16 __a, v4i16 __b) */ +#define msa_combine_s16(__a, __b) __COMBINE_64_64(v8i16, __a, __b) + +/* v4i32 msa_combine_s32(v2i32 __a, v2i32 __b) */ +#define msa_combine_s32(__a, __b) __COMBINE_64_64(v4i32, __a, __b) + +/* v2i64 msa_combine_s64(v1i64 __a, v1i64 __b) */ +#define msa_combine_s64(__a, __b) __COMBINE_64_64(v2i64, __a, __b) + +/* v4f32 msa_combine_f32(v2f32 __a, v2f32 __b) */ +#define msa_combine_f32(__a, __b) __COMBINE_64_64(v4f32, __a, __b) + +/* v16u8 msa_combine_u8(v8u8 __a, v8u8 __b) */ +#define msa_combine_u8(__a, __b) __COMBINE_64_64(v16u8, __a, __b) + +/* v8u16 msa_combine_u16(v4u16 __a, v4u16 __b) */ +#define msa_combine_u16(__a, __b) __COMBINE_64_64(v8u16, __a, __b) + +/* v4u32 msa_combine_u32(v2u32 __a, v2u32 __b) */ +#define msa_combine_u32(__a, __b) __COMBINE_64_64(v4u32, __a, __b) + +/* v2u64 msa_combine_u64(v1u64 __a, v1u64 __b) */ +#define msa_combine_u64(__a, __b) __COMBINE_64_64(v2u64, __a, __b) + +/* v2f64 msa_combine_f64(v1f64 __a, v1f64 __b) */ +#define msa_combine_f64(__a, __b) __COMBINE_64_64(v2f64, __a, __b) + +/* get_low, get_high */ +#if (__mips == 64) +#define __GET_LOW(__TYPE, a) ((__TYPE)((v1u64)(__builtin_msa_copy_u_d((v2i64)(a), 0)))) +#define __GET_HIGH(__TYPE, a) ((__TYPE)((v1u64)(__builtin_msa_copy_u_d((v2i64)(a), 1)))) +#else +#define __GET_LOW(__TYPE, a) ((__TYPE)(((v2u64)(a))[0])) +#define __GET_HIGH(__TYPE, a) ((__TYPE)(((v2u64)(a))[1])) +#endif + +/* v8i8 msa_get_low_s8(v16i8 __a) */ +#define msa_get_low_s8(__a) __GET_LOW(v8i8, __a) + +/* v4i16 msa_get_low_s16(v8i16 __a) */ +#define msa_get_low_s16(__a) __GET_LOW(v4i16, __a) + +/* v2i32 msa_get_low_s32(v4i32 __a) */ +#define msa_get_low_s32(__a) __GET_LOW(v2i32, __a) + +/* v1i64 msa_get_low_s64(v2i64 __a) */ +#define msa_get_low_s64(__a) __GET_LOW(v1i64, __a) + +/* v8u8 msa_get_low_u8(v16u8 __a) */ +#define msa_get_low_u8(__a) __GET_LOW(v8u8, __a) + +/* v4u16 msa_get_low_u16(v8u16 __a) */ +#define msa_get_low_u16(__a) __GET_LOW(v4u16, __a) + +/* v2u32 msa_get_low_u32(v4u32 __a) */ +#define msa_get_low_u32(__a) __GET_LOW(v2u32, __a) + +/* v1u64 msa_get_low_u64(v2u64 __a) */ +#define msa_get_low_u64(__a) __GET_LOW(v1u64, __a) + +/* v2f32 msa_get_low_f32(v4f32 __a) */ +#define msa_get_low_f32(__a) __GET_LOW(v2f32, __a) + +/* v1f64 msa_get_low_f64(v2f64 __a) */ +#define msa_get_low_f64(__a) __GET_LOW(v1f64, __a) + +/* v8i8 msa_get_high_s8(v16i8 __a) */ +#define msa_get_high_s8(__a) __GET_HIGH(v8i8, __a) + +/* v4i16 msa_get_high_s16(v8i16 __a) */ +#define msa_get_high_s16(__a) __GET_HIGH(v4i16, __a) + +/* v2i32 msa_get_high_s32(v4i32 __a) */ +#define msa_get_high_s32(__a) __GET_HIGH(v2i32, __a) + +/* v1i64 msa_get_high_s64(v2i64 __a) */ +#define msa_get_high_s64(__a) __GET_HIGH(v1i64, __a) + +/* v8u8 msa_get_high_u8(v16u8 __a) */ +#define msa_get_high_u8(__a) __GET_HIGH(v8u8, __a) + +/* v4u16 msa_get_high_u16(v8u16 __a) */ +#define msa_get_high_u16(__a) __GET_HIGH(v4u16, __a) + +/* v2u32 msa_get_high_u32(v4u32 __a) */ +#define msa_get_high_u32(__a) __GET_HIGH(v2u32, __a) + +/* v1u64 msa_get_high_u64(v2u64 __a) */ +#define msa_get_high_u64(__a) __GET_HIGH(v1u64, __a) + +/* v2f32 msa_get_high_f32(v4f32 __a) */ +#define msa_get_high_f32(__a) __GET_HIGH(v2f32, __a) + +/* v1f64 msa_get_high_f64(v2f64 __a) */ +#define msa_get_high_f64(__a) __GET_HIGH(v1f64, __a) + +/* ri = ai * b[lane] */ +/* v4f32 msa_mulq_lane_f32(v4f32 __a, v4f32 __b, const int __lane) */ +#define msa_mulq_lane_f32(__a, __b, __lane) ((__a) * msa_getq_lane_f32(__b, __lane)) + +/* ri = ai + bi * c[lane] */ +/* v4f32 msa_mlaq_lane_f32(v4f32 __a, v4f32 __b, v4f32 __c, const int __lane) */ +#define msa_mlaq_lane_f32(__a, __b, __c, __lane) ((__a) + ((__b) * msa_getq_lane_f32(__c, __lane))) + +/* uint16_t msa_sum_u16(v8u16 __a)*/ +#define msa_sum_u16(__a) \ +({ \ + v4u32 _b; \ + v2u64 _c; \ + _b = __builtin_msa_hadd_u_w(__a, __a); \ + _c = __builtin_msa_hadd_u_d(_b, _b); \ + (uint16_t)(_c[0] + _c[1]); \ +}) + +/* int16_t msa_sum_s16(v8i16 __a) */ +#define msa_sum_s16(__a) \ +({ \ + v4i32 _b; \ + v2i64 _c; \ + _b = __builtin_msa_hadd_s_w(__a, __a); \ + _c = __builtin_msa_hadd_s_d(_b, _b); \ + (int32_t)(_c[0] + _c[1]); \ +}) + + +/* uint32_t msa_sum_u32(v4u32 __a)*/ +#define msa_sum_u32(__a) \ +({ \ + v2u64 _b; \ + _b = __builtin_msa_hadd_u_d(__a, __a); \ + (uint32_t)(_b[0] + _b[1]); \ +}) + +/* int32_t msa_sum_s32(v4i32 __a)*/ +#define msa_sum_s32(__a) \ +({ \ + v2i64 _b; \ + _b = __builtin_msa_hadd_s_d(__a, __a); \ + (int64_t)(_b[0] + _b[1]); \ +}) + +/* uint8_t msa_sum_u8(v16u8 __a)*/ +#define msa_sum_u8(__a) \ +({ \ + v8u16 _b16; \ + v4u32 _c32; \ + _b16 = __builtin_msa_hadd_u_h(__a, __a); \ + _c32 = __builtin_msa_hadd_u_w(_b16, _b16); \ + (uint8_t)msa_sum_u32(_c32); \ +}) + +/* int8_t msa_sum_s8(v16s8 __a)*/ +#define msa_sum_s8(__a) \ +({ \ + v8i16 _b16; \ + v4i32 _c32; \ + _b16 = __builtin_msa_hadd_s_h(__a, __a); \ + _c32 = __builtin_msa_hadd_s_w(_b16, _b16); \ + (int16_t)msa_sum_s32(_c32); \ +}) + +/* float msa_sum_f32(v4f32 __a)*/ +#define msa_sum_f32(__a) ((__a)[0] + (__a)[1] + (__a)[2] + (__a)[3]) + +/* v8u16 msa_paddlq_u8(v16u8 __a) */ +#define msa_paddlq_u8(__a) (__builtin_msa_hadd_u_h(__a, __a)) + +/* v8i16 msa_paddlq_s8(v16i8 __a) */ +#define msa_paddlq_s8(__a) (__builtin_msa_hadd_s_h(__a, __a)) + +/* v4u32 msa_paddlq_u16 (v8u16 __a)*/ +#define msa_paddlq_u16(__a) (__builtin_msa_hadd_u_w(__a, __a)) + +/* v4i32 msa_paddlq_s16 (v8i16 __a)*/ +#define msa_paddlq_s16(__a) (__builtin_msa_hadd_s_w(__a, __a)) + +/* v2u64 msa_paddlq_u32(v4u32 __a) */ +#define msa_paddlq_u32(__a) (__builtin_msa_hadd_u_d(__a, __a)) + +/* v2i64 msa_paddlq_s32(v4i32 __a) */ +#define msa_paddlq_s32(__a) (__builtin_msa_hadd_s_d(__a, __a)) + +#define V8U8_2_V8U16(x) {(uint16_t)x[0], (uint16_t)x[1], (uint16_t)x[2], (uint16_t)x[3], \ + (uint16_t)x[4], (uint16_t)x[5], (uint16_t)x[6], (uint16_t)x[7]} +#define V8U8_2_V8I16(x) {(int16_t)x[0], (int16_t)x[1], (int16_t)x[2], (int16_t)x[3], \ + (int16_t)x[4], (int16_t)x[5], (int16_t)x[6], (int16_t)x[7]} +#define V8I8_2_V8I16(x) {(int16_t)x[0], (int16_t)x[1], (int16_t)x[2], (int16_t)x[3], \ + (int16_t)x[4], (int16_t)x[5], (int16_t)x[6], (int16_t)x[7]} +#define V4U16_2_V4U32(x) {(uint32_t)x[0], (uint32_t)x[1], (uint32_t)x[2], (uint32_t)x[3]} +#define V4U16_2_V4I32(x) {(int32_t)x[0], (int32_t)x[1], (int32_t)x[2], (int32_t)x[3]} +#define V4I16_2_V4I32(x) {(int32_t)x[0], (int32_t)x[1], (int32_t)x[2], (int32_t)x[3]} +#define V2U32_2_V2U64(x) {(uint64_t)x[0], (uint64_t)x[1]} +#define V2U32_2_V2I64(x) {(int64_t)x[0], (int64_t)x[1]} + +/* v8u16 msa_mull_u8(v8u8 __a, v8u8 __b) */ +#define msa_mull_u8(__a, __b) ((v8u16)__builtin_msa_mulv_h((v8i16)V8U8_2_V8I16(__a), (v8i16)V8U8_2_V8I16(__b))) + +/* v8i16 msa_mull_s8(v8i8 __a, v8i8 __b)*/ +#define msa_mull_s8(__a, __b) (__builtin_msa_mulv_h((v8i16)V8I8_2_V8I16(__a), (v8i16)V8I8_2_V8I16(__b))) + +/* v4u32 msa_mull_u16(v4u16 __a, v4u16 __b) */ +#define msa_mull_u16(__a, __b) ((v4u32)__builtin_msa_mulv_w((v4i32)V4U16_2_V4I32(__a), (v4i32)V4U16_2_V4I32(__b))) + +/* v4i32 msa_mull_s16(v4i16 __a, v4i16 __b) */ +#define msa_mull_s16(__a, __b) (__builtin_msa_mulv_w((v4i32)V4I16_2_V4I32(__a), (v4i32)V4I16_2_V4I32(__b))) + +/* v2u64 msa_mull_u32(v2u32 __a, v2u32 __b) */ +#define msa_mull_u32(__a, __b) ((v2u64)__builtin_msa_mulv_d((v2i64)V2U32_2_V2I64(__a), (v2i64)V2U32_2_V2I64(__b))) + +/* bitwise and: __builtin_msa_and_v */ +#define msa_andq_u8(__a, __b) ((v16u8)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_s8(__a, __b) ((v16i8)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_u16(__a, __b) ((v8u16)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_s16(__a, __b) ((v8i16)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_u32(__a, __b) ((v4u32)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_s32(__a, __b) ((v4i32)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_u64(__a, __b) ((v2u64)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) +#define msa_andq_s64(__a, __b) ((v2i64)__builtin_msa_and_v((v16u8)(__a), (v16u8)(__b))) + +/* bitwise or: __builtin_msa_or_v */ +#define msa_orrq_u8(__a, __b) ((v16u8)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_s8(__a, __b) ((v16i8)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_u16(__a, __b) ((v8u16)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_s16(__a, __b) ((v8i16)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_u32(__a, __b) ((v4u32)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_s32(__a, __b) ((v4i32)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_u64(__a, __b) ((v2u64)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) +#define msa_orrq_s64(__a, __b) ((v2i64)__builtin_msa_or_v((v16u8)(__a), (v16u8)(__b))) + +/* bitwise xor: __builtin_msa_xor_v */ +#define msa_eorq_u8(__a, __b) ((v16u8)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_s8(__a, __b) ((v16i8)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_u16(__a, __b) ((v8u16)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_s16(__a, __b) ((v8i16)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_u32(__a, __b) ((v4u32)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_s32(__a, __b) ((v4i32)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_u64(__a, __b) ((v2u64)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) +#define msa_eorq_s64(__a, __b) ((v2i64)__builtin_msa_xor_v((v16u8)(__a), (v16u8)(__b))) + +/* bitwise not: v16u8 __builtin_msa_xori_b (v16u8, 0xff) */ +#define msa_mvnq_u8(__a) ((v16u8)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_s8(__a) ((v16i8)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_u16(__a) ((v8u16)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_s16(__a) ((v8i16)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_u32(__a) ((v4u32)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_s32(__a) ((v4i32)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_u64(__a) ((v2u64)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) +#define msa_mvnq_s64(__a) ((v2i64)__builtin_msa_xori_b((v16u8)(__a), 0xFF)) + +/* compare equal: ceq -> ri = ai == bi ? 1...1:0...0 */ +#define msa_ceqq_u8(__a, __b) ((v16u8)__builtin_msa_ceq_b((v16i8)(__a), (v16i8)(__b))) +#define msa_ceqq_s8(__a, __b) ((v16u8)__builtin_msa_ceq_b((v16i8)(__a), (v16i8)(__b))) +#define msa_ceqq_u16(__a, __b) ((v8u16)__builtin_msa_ceq_h((v8i16)(__a), (v8i16)(__b))) +#define msa_ceqq_s16(__a, __b) ((v8u16)__builtin_msa_ceq_h((v8i16)(__a), (v8i16)(__b))) +#define msa_ceqq_u32(__a, __b) ((v4u32)__builtin_msa_ceq_w((v4i32)(__a), (v4i32)(__b))) +#define msa_ceqq_s32(__a, __b) ((v4u32)__builtin_msa_ceq_w((v4i32)(__a), (v4i32)(__b))) +#define msa_ceqq_f32(__a, __b) ((v4u32)__builtin_msa_fceq_w((v4f32)(__a), (v4f32)(__b))) +#define msa_ceqq_u64(__a, __b) ((v2u64)__builtin_msa_ceq_d((v2i64)(__a), (v2i64)(__b))) +#define msa_ceqq_s64(__a, __b) ((v2u64)__builtin_msa_ceq_d((v2i64)(__a), (v2i64)(__b))) +#define msa_ceqq_f64(__a, __b) ((v2u64)__builtin_msa_fceq_d((v2f64)(__a), (v2f64)(__b))) + +/* Compare less-than: clt -> ri = ai < bi ? 1...1:0...0 */ +#define msa_cltq_u8(__a, __b) ((v16u8)__builtin_msa_clt_u_b((v16u8)(__a), (v16u8)(__b))) +#define msa_cltq_s8(__a, __b) ((v16u8)__builtin_msa_clt_s_b((v16i8)(__a), (v16i8)(__b))) +#define msa_cltq_u16(__a, __b) ((v8u16)__builtin_msa_clt_u_h((v8u16)(__a), (v8u16)(__b))) +#define msa_cltq_s16(__a, __b) ((v8u16)__builtin_msa_clt_s_h((v8i16)(__a), (v8i16)(__b))) +#define msa_cltq_u32(__a, __b) ((v4u32)__builtin_msa_clt_u_w((v4u32)(__a), (v4u32)(__b))) +#define msa_cltq_s32(__a, __b) ((v4u32)__builtin_msa_clt_s_w((v4i32)(__a), (v4i32)(__b))) +#define msa_cltq_f32(__a, __b) ((v4u32)__builtin_msa_fclt_w((v4f32)(__a), (v4f32)(__b))) +#define msa_cltq_u64(__a, __b) ((v2u64)__builtin_msa_clt_u_d((v2u64)(__a), (v2u64)(__b))) +#define msa_cltq_s64(__a, __b) ((v2u64)__builtin_msa_clt_s_d((v2i64)(__a), (v2i64)(__b))) +#define msa_cltq_f64(__a, __b) ((v2u64)__builtin_msa_fclt_d((v2f64)(__a), (v2f64)(__b))) + +/* compare greater-than: cgt -> ri = ai > bi ? 1...1:0...0 */ +#define msa_cgtq_u8(__a, __b) ((v16u8)__builtin_msa_clt_u_b((v16u8)(__b), (v16u8)(__a))) +#define msa_cgtq_s8(__a, __b) ((v16u8)__builtin_msa_clt_s_b((v16i8)(__b), (v16i8)(__a))) +#define msa_cgtq_u16(__a, __b) ((v8u16)__builtin_msa_clt_u_h((v8u16)(__b), (v8u16)(__a))) +#define msa_cgtq_s16(__a, __b) ((v8u16)__builtin_msa_clt_s_h((v8i16)(__b), (v8i16)(__a))) +#define msa_cgtq_u32(__a, __b) ((v4u32)__builtin_msa_clt_u_w((v4u32)(__b), (v4u32)(__a))) +#define msa_cgtq_s32(__a, __b) ((v4u32)__builtin_msa_clt_s_w((v4i32)(__b), (v4i32)(__a))) +#define msa_cgtq_f32(__a, __b) ((v4u32)__builtin_msa_fclt_w((v4f32)(__b), (v4f32)(__a))) +#define msa_cgtq_u64(__a, __b) ((v2u64)__builtin_msa_clt_u_d((v2u64)(__b), (v2u64)(__a))) +#define msa_cgtq_s64(__a, __b) ((v2u64)__builtin_msa_clt_s_d((v2i64)(__b), (v2i64)(__a))) +#define msa_cgtq_f64(__a, __b) ((v2u64)__builtin_msa_fclt_d((v2f64)(__b), (v2f64)(__a))) + +/* compare less-equal: cle -> ri = ai <= bi ? 1...1:0...0 */ +#define msa_cleq_u8(__a, __b) ((v16u8)__builtin_msa_cle_u_b((v16u8)(__a), (v16u8)(__b))) +#define msa_cleq_s8(__a, __b) ((v16u8)__builtin_msa_cle_s_b((v16i8)(__a), (v16i8)(__b))) +#define msa_cleq_u16(__a, __b) ((v8u16)__builtin_msa_cle_u_h((v8u16)(__a), (v8u16)(__b))) +#define msa_cleq_s16(__a, __b) ((v8u16)__builtin_msa_cle_s_h((v8i16)(__a), (v8i16)(__b))) +#define msa_cleq_u32(__a, __b) ((v4u32)__builtin_msa_cle_u_w((v4u32)(__a), (v4u32)(__b))) +#define msa_cleq_s32(__a, __b) ((v4u32)__builtin_msa_cle_s_w((v4i32)(__a), (v4i32)(__b))) +#define msa_cleq_f32(__a, __b) ((v4u32)__builtin_msa_fcle_w((v4f32)(__a), (v4f32)(__b))) +#define msa_cleq_u64(__a, __b) ((v2u64)__builtin_msa_cle_u_d((v2u64)(__a), (v2u64)(__b))) +#define msa_cleq_s64(__a, __b) ((v2u64)__builtin_msa_cle_s_d((v2i64)(__a), (v2i64)(__b))) +#define msa_cleq_f64(__a, __b) ((v2u64)__builtin_msa_fcle_d((v2f64)(__a), (v2f64)(__b))) + +/* compare greater-equal: cge -> ri = ai >= bi ? 1...1:0...0 */ +#define msa_cgeq_u8(__a, __b) ((v16u8)__builtin_msa_cle_u_b((v16u8)(__b), (v16u8)(__a))) +#define msa_cgeq_s8(__a, __b) ((v16u8)__builtin_msa_cle_s_b((v16i8)(__b), (v16i8)(__a))) +#define msa_cgeq_u16(__a, __b) ((v8u16)__builtin_msa_cle_u_h((v8u16)(__b), (v8u16)(__a))) +#define msa_cgeq_s16(__a, __b) ((v8u16)__builtin_msa_cle_s_h((v8i16)(__b), (v8i16)(__a))) +#define msa_cgeq_u32(__a, __b) ((v4u32)__builtin_msa_cle_u_w((v4u32)(__b), (v4u32)(__a))) +#define msa_cgeq_s32(__a, __b) ((v4u32)__builtin_msa_cle_s_w((v4i32)(__b), (v4i32)(__a))) +#define msa_cgeq_f32(__a, __b) ((v4u32)__builtin_msa_fcle_w((v4f32)(__b), (v4f32)(__a))) +#define msa_cgeq_u64(__a, __b) ((v2u64)__builtin_msa_cle_u_d((v2u64)(__b), (v2u64)(__a))) +#define msa_cgeq_s64(__a, __b) ((v2u64)__builtin_msa_cle_s_d((v2i64)(__b), (v2i64)(__a))) +#define msa_cgeq_f64(__a, __b) ((v2u64)__builtin_msa_fcle_d((v2f64)(__b), (v2f64)(__a))) + +/* Shift Left Logical: shl -> ri = ai << bi; */ +#define msa_shlq_u8(__a, __b) ((v16u8)__builtin_msa_sll_b((v16i8)(__a), (v16i8)(__b))) +#define msa_shlq_s8(__a, __b) ((v16i8)__builtin_msa_sll_b((v16i8)(__a), (v16i8)(__b))) +#define msa_shlq_u16(__a, __b) ((v8u16)__builtin_msa_sll_h((v8i16)(__a), (v8i16)(__b))) +#define msa_shlq_s16(__a, __b) ((v8i16)__builtin_msa_sll_h((v8i16)(__a), (v8i16)(__b))) +#define msa_shlq_u32(__a, __b) ((v4u32)__builtin_msa_sll_w((v4i32)(__a), (v4i32)(__b))) +#define msa_shlq_s32(__a, __b) ((v4i32)__builtin_msa_sll_w((v4i32)(__a), (v4i32)(__b))) +#define msa_shlq_u64(__a, __b) ((v2u64)__builtin_msa_sll_d((v2i64)(__a), (v2i64)(__b))) +#define msa_shlq_s64(__a, __b) ((v2i64)__builtin_msa_sll_d((v2i64)(__a), (v2i64)(__b))) + +/* Immediate Shift Left Logical: shl -> ri = ai << imm; */ +#define msa_shlq_n_u8(__a, __imm) ((v16u8)__builtin_msa_slli_b((v16i8)(__a), __imm)) +#define msa_shlq_n_s8(__a, __imm) ((v16i8)__builtin_msa_slli_b((v16i8)(__a), __imm)) +#define msa_shlq_n_u16(__a, __imm) ((v8u16)__builtin_msa_slli_h((v8i16)(__a), __imm)) +#define msa_shlq_n_s16(__a, __imm) ((v8i16)__builtin_msa_slli_h((v8i16)(__a), __imm)) +#define msa_shlq_n_u32(__a, __imm) ((v4u32)__builtin_msa_slli_w((v4i32)(__a), __imm)) +#define msa_shlq_n_s32(__a, __imm) ((v4i32)__builtin_msa_slli_w((v4i32)(__a), __imm)) +#define msa_shlq_n_u64(__a, __imm) ((v2u64)__builtin_msa_slli_d((v2i64)(__a), __imm)) +#define msa_shlq_n_s64(__a, __imm) ((v2i64)__builtin_msa_slli_d((v2i64)(__a), __imm)) + +/* shift right: shrq -> ri = ai >> bi; */ +#define msa_shrq_u8(__a, __b) ((v16u8)__builtin_msa_srl_b((v16i8)(__a), (v16i8)(__b))) +#define msa_shrq_s8(__a, __b) ((v16i8)__builtin_msa_sra_b((v16i8)(__a), (v16i8)(__b))) +#define msa_shrq_u16(__a, __b) ((v8u16)__builtin_msa_srl_h((v8i16)(__a), (v8i16)(__b))) +#define msa_shrq_s16(__a, __b) ((v8i16)__builtin_msa_sra_h((v8i16)(__a), (v8i16)(__b))) +#define msa_shrq_u32(__a, __b) ((v4u32)__builtin_msa_srl_w((v4i32)(__a), (v4i32)(__b))) +#define msa_shrq_s32(__a, __b) ((v4i32)__builtin_msa_sra_w((v4i32)(__a), (v4i32)(__b))) +#define msa_shrq_u64(__a, __b) ((v2u64)__builtin_msa_srl_d((v2i64)(__a), (v2i64)(__b))) +#define msa_shrq_s64(__a, __b) ((v2i64)__builtin_msa_sra_d((v2i64)(__a), (v2i64)(__b))) + +/* Immediate Shift Right: shr -> ri = ai >> imm; */ +#define msa_shrq_n_u8(__a, __imm) ((v16u8)__builtin_msa_srli_b((v16i8)(__a), __imm)) +#define msa_shrq_n_s8(__a, __imm) ((v16i8)__builtin_msa_srai_b((v16i8)(__a), __imm)) +#define msa_shrq_n_u16(__a, __imm) ((v8u16)__builtin_msa_srli_h((v8i16)(__a), __imm)) +#define msa_shrq_n_s16(__a, __imm) ((v8i16)__builtin_msa_srai_h((v8i16)(__a), __imm)) +#define msa_shrq_n_u32(__a, __imm) ((v4u32)__builtin_msa_srli_w((v4i32)(__a), __imm)) +#define msa_shrq_n_s32(__a, __imm) ((v4i32)__builtin_msa_srai_w((v4i32)(__a), __imm)) +#define msa_shrq_n_u64(__a, __imm) ((v2u64)__builtin_msa_srli_d((v2i64)(__a), __imm)) +#define msa_shrq_n_s64(__a, __imm) ((v2i64)__builtin_msa_srai_d((v2i64)(__a), __imm)) + +/* Immediate Shift Right Rounded: shr -> ri = ai >> (rounded)imm; */ +#define msa_rshrq_n_u8(__a, __imm) ((v16u8)__builtin_msa_srlri_b((v16i8)(__a), __imm)) +#define msa_rshrq_n_s8(__a, __imm) ((v16i8)__builtin_msa_srari_b((v16i8)(__a), __imm)) +#define msa_rshrq_n_u16(__a, __imm) ((v8u16)__builtin_msa_srlri_h((v8i16)(__a), __imm)) +#define msa_rshrq_n_s16(__a, __imm) ((v8i16)__builtin_msa_srari_h((v8i16)(__a), __imm)) +#define msa_rshrq_n_u32(__a, __imm) ((v4u32)__builtin_msa_srlri_w((v4i32)(__a), __imm)) +#define msa_rshrq_n_s32(__a, __imm) ((v4i32)__builtin_msa_srari_w((v4i32)(__a), __imm)) +#define msa_rshrq_n_u64(__a, __imm) ((v2u64)__builtin_msa_srlri_d((v2i64)(__a), __imm)) +#define msa_rshrq_n_s64(__a, __imm) ((v2i64)__builtin_msa_srari_d((v2i64)(__a), __imm)) + +/* Vector saturating rounding shift left, qrshl -> ri = ai << bi; */ +#define msa_qrshrq_s32(a, b) ((v4i32)__msa_srar_w((v4i32)(a), (v4i32)(b))) + +/* Rename the msa builtin func to unify the name style for intrin_msa.hpp */ +#define msa_qaddq_u8 __builtin_msa_adds_u_b +#define msa_qaddq_s8 __builtin_msa_adds_s_b +#define msa_qaddq_u16 __builtin_msa_adds_u_h +#define msa_qaddq_s16 __builtin_msa_adds_s_h +#define msa_qaddq_u32 __builtin_msa_adds_u_w +#define msa_qaddq_s32 __builtin_msa_adds_s_w +#define msa_qaddq_u64 __builtin_msa_adds_u_d +#define msa_qaddq_s64 __builtin_msa_adds_s_d +#define msa_addq_u8(a, b) ((v16u8)__builtin_msa_addv_b((v16i8)(a), (v16i8)(b))) +#define msa_addq_s8 __builtin_msa_addv_b +#define msa_addq_u16(a, b) ((v8u16)__builtin_msa_addv_h((v8i16)(a), (v8i16)(b))) +#define msa_addq_s16 __builtin_msa_addv_h +#define msa_addq_u32(a, b) ((v4u32)__builtin_msa_addv_w((v4i32)(a), (v4i32)(b))) +#define msa_addq_s32 __builtin_msa_addv_w +#define msa_addq_f32 __builtin_msa_fadd_w +#define msa_addq_u64(a, b) ((v2u64)__builtin_msa_addv_d((v2i64)(a), (v2i64)(b))) +#define msa_addq_s64 __builtin_msa_addv_d +#define msa_addq_f64 __builtin_msa_fadd_d +#define msa_qsubq_u8 __builtin_msa_subs_u_b +#define msa_qsubq_s8 __builtin_msa_subs_s_b +#define msa_qsubq_u16 __builtin_msa_subs_u_h +#define msa_qsubq_s16 __builtin_msa_subs_s_h +#define msa_subq_u8(a, b) ((v16u8)__builtin_msa_subv_b((v16i8)(a), (v16i8)(b))) +#define msa_subq_s8 __builtin_msa_subv_b +#define msa_subq_u16(a, b) ((v8u16)__builtin_msa_subv_h((v8i16)(a), (v8i16)(b))) +#define msa_subq_s16 __builtin_msa_subv_h +#define msa_subq_u32(a, b) ((v4u32)__builtin_msa_subv_w((v4i32)(a), (v4i32)(b))) +#define msa_subq_s32 __builtin_msa_subv_w +#define msa_subq_f32 __builtin_msa_fsub_w +#define msa_subq_u64(a, b) ((v2u64)__builtin_msa_subv_d((v2i64)(a), (v2i64)(b))) +#define msa_subq_s64 __builtin_msa_subv_d +#define msa_subq_f64 __builtin_msa_fsub_d +#define msa_mulq_u8(a, b) ((v16u8)__builtin_msa_mulv_b((v16i8)(a), (v16i8)(b))) +#define msa_mulq_s8(a, b) ((v16i8)__builtin_msa_mulv_b((v16i8)(a), (v16i8)(b))) +#define msa_mulq_u16(a, b) ((v8u16)__builtin_msa_mulv_h((v8i16)(a), (v8i16)(b))) +#define msa_mulq_s16(a, b) ((v8i16)__builtin_msa_mulv_h((v8i16)(a), (v8i16)(b))) +#define msa_mulq_u32(a, b) ((v4u32)__builtin_msa_mulv_w((v4i32)(a), (v4i32)(b))) +#define msa_mulq_s32(a, b) ((v4i32)__builtin_msa_mulv_w((v4i32)(a), (v4i32)(b))) +#define msa_mulq_u64(a, b) ((v2u64)__builtin_msa_mulv_d((v2i64)(a), (v2i64)(b))) +#define msa_mulq_s64(a, b) ((v2i64)__builtin_msa_mulv_d((v2i64)(a), (v2i64)(b))) +#define msa_mulq_f32 __builtin_msa_fmul_w +#define msa_mulq_f64 __builtin_msa_fmul_d +#define msa_divq_f32 __builtin_msa_fdiv_w +#define msa_divq_f64 __builtin_msa_fdiv_d +#define msa_dotp_s_h __builtin_msa_dotp_s_h +#define msa_dotp_s_w __builtin_msa_dotp_s_w +#define msa_dotp_s_d __builtin_msa_dotp_s_d +#define msa_dotp_u_h __builtin_msa_dotp_u_h +#define msa_dotp_u_w __builtin_msa_dotp_u_w +#define msa_dotp_u_d __builtin_msa_dotp_u_d +#define msa_dpadd_s_h __builtin_msa_dpadd_s_h +#define msa_dpadd_s_w __builtin_msa_dpadd_s_w +#define msa_dpadd_s_d __builtin_msa_dpadd_s_d +#define msa_dpadd_u_h __builtin_msa_dpadd_u_h +#define msa_dpadd_u_w __builtin_msa_dpadd_u_w +#define msa_dpadd_u_d __builtin_msa_dpadd_u_d + +#define ILVRL_B2(RTYPE, in0, in1, low, hi) do { \ + low = (RTYPE)__builtin_msa_ilvr_b((v16i8)(in0), (v16i8)(in1)); \ + hi = (RTYPE)__builtin_msa_ilvl_b((v16i8)(in0), (v16i8)(in1)); \ + } while (0) +#define ILVRL_B2_UB(...) ILVRL_B2(v16u8, __VA_ARGS__) +#define ILVRL_B2_SB(...) ILVRL_B2(v16i8, __VA_ARGS__) +#define ILVRL_B2_UH(...) ILVRL_B2(v8u16, __VA_ARGS__) +#define ILVRL_B2_SH(...) ILVRL_B2(v8i16, __VA_ARGS__) +#define ILVRL_B2_SW(...) ILVRL_B2(v4i32, __VA_ARGS__) + +#define ILVRL_H2(RTYPE, in0, in1, low, hi) do { \ + low = (RTYPE)__builtin_msa_ilvr_h((v8i16)(in0), (v8i16)(in1)); \ + hi = (RTYPE)__builtin_msa_ilvl_h((v8i16)(in0), (v8i16)(in1)); \ + } while (0) +#define ILVRL_H2_UB(...) ILVRL_H2(v16u8, __VA_ARGS__) +#define ILVRL_H2_SB(...) ILVRL_H2(v16i8, __VA_ARGS__) +#define ILVRL_H2_UH(...) ILVRL_H2(v8u16, __VA_ARGS__) +#define ILVRL_H2_SH(...) ILVRL_H2(v8i16, __VA_ARGS__) +#define ILVRL_H2_SW(...) ILVRL_H2(v4i32, __VA_ARGS__) +#define ILVRL_H2_UW(...) ILVRL_H2(v4u32, __VA_ARGS__) + +#define ILVRL_W2(RTYPE, in0, in1, low, hi) do { \ + low = (RTYPE)__builtin_msa_ilvr_w((v4i32)(in0), (v4i32)(in1)); \ + hi = (RTYPE)__builtin_msa_ilvl_w((v4i32)(in0), (v4i32)(in1)); \ + } while (0) +#define ILVRL_W2_UB(...) ILVRL_W2(v16u8, __VA_ARGS__) +#define ILVRL_W2_SH(...) ILVRL_W2(v8i16, __VA_ARGS__) +#define ILVRL_W2_SW(...) ILVRL_W2(v4i32, __VA_ARGS__) +#define ILVRL_W2_UW(...) ILVRL_W2(v4u32, __VA_ARGS__) + +/* absq, qabsq (r = |a|;) */ +#define msa_absq_s8(a) __builtin_msa_add_a_b(a, __builtin_msa_fill_b(0)) +#define msa_absq_s16(a) __builtin_msa_add_a_h(a, __builtin_msa_fill_h(0)) +#define msa_absq_s32(a) __builtin_msa_add_a_w(a, __builtin_msa_fill_w(0)) +#define msa_absq_s64(a) __builtin_msa_add_a_d(a, __builtin_msa_fill_d(0)) +#define msa_absq_f32(a) ((v4f32)__builtin_msa_bclri_w((v4u32)(a), 31)) +#define msa_absq_f64(a) ((v2f64)__builtin_msa_bclri_d((v2u64)(a), 63)) +#define msa_qabsq_s8(a) __builtin_msa_adds_a_b(a, __builtin_msa_fill_b(0)) +#define msa_qabsq_s16(a) __builtin_msa_adds_a_h(a, __builtin_msa_fill_h(0)) +#define msa_qabsq_s32(a) __builtin_msa_adds_a_w(a, __builtin_msa_fill_w(0)) +#define msa_qabsq_s64(a) __builtin_msa_adds_a_d(a, __builtin_msa_fill_d(0)) + +/* abdq, qabdq (r = |a - b|;) */ +#define msa_abdq_u8 __builtin_msa_asub_u_b +#define msa_abdq_s8 __builtin_msa_asub_s_b +#define msa_abdq_u16 __builtin_msa_asub_u_h +#define msa_abdq_s16 __builtin_msa_asub_s_h +#define msa_abdq_u32 __builtin_msa_asub_u_w +#define msa_abdq_s32 __builtin_msa_asub_s_w +#define msa_abdq_u64 __builtin_msa_asub_u_d +#define msa_abdq_s64 __builtin_msa_asub_s_d +#define msa_abdq_f32(a, b) msa_absq_f32(__builtin_msa_fsub_w(a, b)) +#define msa_abdq_f64(a, b) msa_absq_f64(__builtin_msa_fsub_d(a, b)) +#define msa_qabdq_s8(a, b) msa_qabsq_s8(__builtin_msa_subs_s_b(a, b)) +#define msa_qabdq_s16(a, b) msa_qabsq_s16(__builtin_msa_subs_s_h(a, b)) +#define msa_qabdq_s32(a, b) msa_qabsq_s32(__builtin_msa_subs_s_w(a, b)) +#define msa_qabdq_s64(a, b) msa_qabsq_s64(__builtin_msa_subs_s_d(a, b)) + +/* sqrtq, rsqrtq */ +#define msa_sqrtq_f32 __builtin_msa_fsqrt_w +#define msa_sqrtq_f64 __builtin_msa_fsqrt_d +#define msa_rsqrtq_f32 __builtin_msa_frsqrt_w +#define msa_rsqrtq_f64 __builtin_msa_frsqrt_d + + +/* mlaq: r = a + b * c; */ +__extension__ extern __inline v4i32 +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +msa_mlaq_s32(v4i32 __a, v4i32 __b, v4i32 __c) +{ + __asm__ volatile("maddv.w %w[__a], %w[__b], %w[__c]\n" + // Outputs + : [__a] "+f"(__a) + // Inputs + : [__b] "f"(__b), [__c] "f"(__c)); + return __a; +} + +__extension__ extern __inline v2i64 +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +msa_mlaq_s64(v2i64 __a, v2i64 __b, v2i64 __c) +{ + __asm__ volatile("maddv.d %w[__a], %w[__b], %w[__c]\n" + // Outputs + : [__a] "+f"(__a) + // Inputs + : [__b] "f"(__b), [__c] "f"(__c)); + return __a; +} + +__extension__ extern __inline v4f32 +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +msa_mlaq_f32(v4f32 __a, v4f32 __b, v4f32 __c) +{ + __asm__ volatile("fmadd.w %w[__a], %w[__b], %w[__c]\n" + // Outputs + : [__a] "+f"(__a) + // Inputs + : [__b] "f"(__b), [__c] "f"(__c)); + return __a; +} + +__extension__ extern __inline v2f64 +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +msa_mlaq_f64(v2f64 __a, v2f64 __b, v2f64 __c) +{ + __asm__ volatile("fmadd.d %w[__a], %w[__b], %w[__c]\n" + // Outputs + : [__a] "+f"(__a) + // Inputs + : [__b] "f"(__b), [__c] "f"(__c)); + return __a; +} + +/* cntq */ +#define msa_cntq_s8 __builtin_msa_pcnt_b +#define msa_cntq_s16 __builtin_msa_pcnt_h +#define msa_cntq_s32 __builtin_msa_pcnt_w +#define msa_cntq_s64 __builtin_msa_pcnt_d + +/* bslq (a: mask; r = b(if a == 0); r = c(if a == 1);) */ +#define msa_bslq_u8 __builtin_msa_bsel_v + +/* ilvrq, ilvlq (For EL only, ilvrq: b0, a0, b1, a1; ilvlq: b2, a2, b3, a3;) */ +#define msa_ilvrq_s8 __builtin_msa_ilvr_b +#define msa_ilvrq_s16 __builtin_msa_ilvr_h +#define msa_ilvrq_s32 __builtin_msa_ilvr_w +#define msa_ilvrq_s64 __builtin_msa_ilvr_d +#define msa_ilvlq_s8 __builtin_msa_ilvl_b +#define msa_ilvlq_s16 __builtin_msa_ilvl_h +#define msa_ilvlq_s32 __builtin_msa_ilvl_w +#define msa_ilvlq_s64 __builtin_msa_ilvl_d + +/* ilvevq, ilvodq (ilvevq: b0, a0, b2, a2; ilvodq: b1, a1, b3, a3; ) */ +#define msa_ilvevq_s8 __builtin_msa_ilvev_b +#define msa_ilvevq_s16 __builtin_msa_ilvev_h +#define msa_ilvevq_s32 __builtin_msa_ilvev_w +#define msa_ilvevq_s64 __builtin_msa_ilvev_d +#define msa_ilvodq_s8 __builtin_msa_ilvod_b +#define msa_ilvodq_s16 __builtin_msa_ilvod_h +#define msa_ilvodq_s32 __builtin_msa_ilvod_w +#define msa_ilvodq_s64 __builtin_msa_ilvod_d + +/* extq (r = (a || b); a concatenation b and get elements from index c) */ +#ifdef _MIPSEB +#define msa_extq_s8(a, b, c) \ +(__builtin_msa_vshf_b(__builtin_msa_subv_b((v16i8)((v2i64){0x1716151413121110, 0x1F1E1D1C1B1A1918}), __builtin_msa_fill_b(c)), a, b)) +#define msa_extq_s16(a, b, c) \ +(__builtin_msa_vshf_h(__builtin_msa_subv_h((v8i16)((v2i64){0x000B000A00090008, 0x000F000E000D000C}), __builtin_msa_fill_h(c)), a, b)) +#define msa_extq_s32(a, b, c) \ +(__builtin_msa_vshf_w(__builtin_msa_subv_w((v4i32)((v2i64){0x0000000500000004, 0x0000000700000006}), __builtin_msa_fill_w(c)), a, b)) +#define msa_extq_s64(a, b, c) \ +(__builtin_msa_vshf_d(__builtin_msa_subv_d((v2i64){0x0000000000000002, 0x0000000000000003}, __builtin_msa_fill_d(c)), a, b)) +#else +#define msa_extq_s8(a, b, c) \ +(__builtin_msa_vshf_b(__builtin_msa_addv_b((v16i8)((v2i64){0x0706050403020100, 0x0F0E0D0C0B0A0908}), __builtin_msa_fill_b(c)), b, a)) +#define msa_extq_s16(a, b, c) \ +(__builtin_msa_vshf_h(__builtin_msa_addv_h((v8i16)((v2i64){0x0003000200010000, 0x0007000600050004}), __builtin_msa_fill_h(c)), b, a)) +#define msa_extq_s32(a, b, c) \ +(__builtin_msa_vshf_w(__builtin_msa_addv_w((v4i32)((v2i64){0x0000000100000000, 0x0000000300000002}), __builtin_msa_fill_w(c)), b, a)) +#define msa_extq_s64(a, b, c) \ +(__builtin_msa_vshf_d(__builtin_msa_addv_d((v2i64){0x0000000000000000, 0x0000000000000001}, __builtin_msa_fill_d(c)), b, a)) +#endif /* _MIPSEB */ + +/* cvttruncq, cvttintq, cvtrintq */ +#define msa_cvttruncq_u32_f32 __builtin_msa_ftrunc_u_w +#define msa_cvttruncq_s32_f32 __builtin_msa_ftrunc_s_w +#define msa_cvttruncq_u64_f64 __builtin_msa_ftrunc_u_d +#define msa_cvttruncq_s64_f64 __builtin_msa_ftrunc_s_d +#define msa_cvttintq_u32_f32 __builtin_msa_ftint_u_w +#define msa_cvttintq_s32_f32 __builtin_msa_ftint_s_w +#define msa_cvttintq_u64_f64 __builtin_msa_ftint_u_d +#define msa_cvttintq_s64_f64 __builtin_msa_ftint_s_d +#define msa_cvtrintq_f32 __builtin_msa_frint_w +#define msa_cvtrintq_f64 __builtin_msa_frint_d + +/* cvtfintq, cvtfq */ +#define msa_cvtfintq_f32_u32 __builtin_msa_ffint_u_w +#define msa_cvtfintq_f32_s32 __builtin_msa_ffint_s_w +#define msa_cvtfintq_f64_u64 __builtin_msa_ffint_u_d +#define msa_cvtfintq_f64_s64 __builtin_msa_ffint_s_d +#define msa_cvtfq_f32_f64 __builtin_msa_fexdo_w +#define msa_cvtflq_f64_f32 __builtin_msa_fexupr_d +#define msa_cvtfhq_f64_f32 __builtin_msa_fexupl_d + +#define msa_addl_u8(a, b) ((v8u16)__builtin_msa_addv_h((v8i16)V8U8_2_V8I16(a), (v8i16)V8U8_2_V8I16(b))) +#define msa_addl_s8(a, b) (__builtin_msa_addv_h((v8i16)V8I8_2_V8I16(a), (v8i16)V8I8_2_V8I16(b))) +#define msa_addl_u16(a, b) ((v4u32)__builtin_msa_addv_w((v4i32)V4U16_2_V4I32(a), (v4i32)V4U16_2_V4I32(b))) +#define msa_addl_s16(a, b) (__builtin_msa_addv_w((v4i32)V4I16_2_V4I32(a), (v4i32)V4I16_2_V4I32(b))) +#define msa_subl_s16(a, b) (__builtin_msa_subv_w((v4i32)V4I16_2_V4I32(a), (v4i32)V4I16_2_V4I32(b))) +#define msa_recpeq_f32 __builtin_msa_frcp_w +#define msa_recpsq_f32(a, b) (__builtin_msa_fsub_w(msa_dupq_n_f32(2.0f), __builtin_msa_fmul_w(a, b))) + +#define MSA_INTERLEAVED_IMPL_LOAD2_STORE2(_Tp, _Tpv, _Tpvs, suffix, df, nlanes) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld2q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + nlanes); \ + *a = (_Tpv)__builtin_msa_pckev_##df((_Tpvs)v1, (_Tpvs)v0); \ + *b = (_Tpv)__builtin_msa_pckod_##df((_Tpvs)v1, (_Tpvs)v0); \ +} \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st2q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b) \ +{ \ + msa_st1q_##suffix(ptr, (_Tpv)__builtin_msa_ilvr_##df((_Tpvs)b, (_Tpvs)a)); \ + msa_st1q_##suffix(ptr + nlanes, (_Tpv)__builtin_msa_ilvl_##df((_Tpvs)b, (_Tpvs)a)); \ +} + +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(uint8_t, v16u8, v16i8, u8, b, 16) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(int8_t, v16i8, v16i8, s8, b, 16) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(uint16_t, v8u16, v8i16, u16, h, 8) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(int16_t, v8i16, v8i16, s16, h, 8) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(uint32_t, v4u32, v4i32, u32, w, 4) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(int32_t, v4i32, v4i32, s32, w, 4) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(float, v4f32, v4i32, f32, w, 4) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(uint64_t, v2u64, v2i64, u64, d, 2) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(int64_t, v2i64, v2i64, s64, d, 2) +MSA_INTERLEAVED_IMPL_LOAD2_STORE2(double, v2f64, v2i64, f64, d, 2) + +#ifdef _MIPSEB +#define MSA_INTERLEAVED_IMPL_LOAD3_8(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + 16); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + 32); \ + _Tpvs v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0704011F1F1F1F1F, 0x1F1C191613100D0A}), (_Tpvs)v0, (_Tpvs)v1); \ + *a = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x1716150E0B080502, 0x1F1E1D1C1B1A1918}), v3, (_Tpvs)v2); \ + v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0603001F1F1F1F1F, 0x1E1B1815120F0C09}), (_Tpvs)v0, (_Tpvs)v1); \ + *b = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x1716150D0A070401, 0x1F1E1D1C1B1A1918}), v3, (_Tpvs)v2); \ + v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x05021F1F1F1F1F1F, 0x1D1A1714110E0B08}), (_Tpvs)v0, (_Tpvs)v1); \ + *c = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x17160F0C09060300, 0x1F1E1D1C1B1A1918}), v3, (_Tpvs)v2); \ +} +#else +#define MSA_INTERLEAVED_IMPL_LOAD3_8(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + 16); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + 32); \ + _Tpvs v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x15120F0C09060300, 0x00000000001E1B18}), (_Tpvs)v1, (_Tpvs)v0); \ + *a = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x0706050403020100, 0x1D1A1714110A0908}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x1613100D0A070401, 0x00000000001F1C19}), (_Tpvs)v1, (_Tpvs)v0); \ + *b = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x0706050403020100, 0x1E1B1815120A0908}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x1714110E0B080502, 0x0000000000001D1A}), (_Tpvs)v1, (_Tpvs)v0); \ + *c = (_Tpv)__builtin_msa_vshf_b((_Tpvs)((v2i64){0x0706050403020100, 0x1F1C191613100908}), (_Tpvs)v2, v3); \ +} +#endif + +MSA_INTERLEAVED_IMPL_LOAD3_8(uint8_t, v16u8, v16i8, u8) +MSA_INTERLEAVED_IMPL_LOAD3_8(int8_t, v16i8, v16i8, s8) + +#ifdef _MIPSEB +#define MSA_INTERLEAVED_IMPL_LOAD3_16(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + 8); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + 16); \ + _Tpvs v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x00030000000F000F, 0x000F000C00090006}), (_Tpvs)v1, (_Tpvs)v0); \ + *a = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x000B000A00050002, 0x000F000E000D000C}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0002000F000F000F, 0x000E000B00080005}), (_Tpvs)v1, (_Tpvs)v0); \ + *b = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x000B000700040001, 0x000F000E000D000C}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0001000F000F000F, 0x000D000A00070004}), (_Tpvs)v1, (_Tpvs)v0); \ + *c = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x000B000600030000, 0x000F000E000D000C}), (_Tpvs)v2, v3); \ +} +#else +#define MSA_INTERLEAVED_IMPL_LOAD3_16(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + 8); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + 16); \ + _Tpvs v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0009000600030000, 0x00000000000F000C}), (_Tpvs)v1, (_Tpvs)v0); \ + *a = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x0003000200010000, 0x000D000A00050004}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000A000700040001, 0x000000000000000D}), (_Tpvs)v1, (_Tpvs)v0); \ + *b = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x0003000200010000, 0x000E000B00080004}), (_Tpvs)v2, v3); \ + v3 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000B000800050002, 0x000000000000000E}), (_Tpvs)v1, (_Tpvs)v0); \ + *c = (_Tpv)__builtin_msa_vshf_h((_Tpvs)((v2i64){0x0003000200010000, 0x000F000C00090004}), (_Tpvs)v2, v3); \ +} +#endif + +MSA_INTERLEAVED_IMPL_LOAD3_16(uint16_t, v8u16, v8i16, u16) +MSA_INTERLEAVED_IMPL_LOAD3_16(int16_t, v8i16, v8i16, s16) + +#define MSA_INTERLEAVED_IMPL_LOAD3_32(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + _Tpv v00 = msa_ld1q_##suffix(ptr); \ + _Tpv v01 = msa_ld1q_##suffix(ptr + 4); \ + _Tpv v02 = msa_ld1q_##suffix(ptr + 8); \ + _Tpvs v10 = __builtin_msa_ilvr_w((_Tpvs)__builtin_msa_ilvl_d((v2i64)v01, (v2i64)v01), (_Tpvs)v00); \ + _Tpvs v11 = __builtin_msa_ilvr_w((_Tpvs)v02, (_Tpvs)__builtin_msa_ilvl_d((v2i64)v00, (v2i64)v00)); \ + _Tpvs v12 = __builtin_msa_ilvr_w((_Tpvs)__builtin_msa_ilvl_d((v2i64)v02, (v2i64)v02), (_Tpvs)v01); \ + *a = (_Tpv)__builtin_msa_ilvr_w((_Tpvs)__builtin_msa_ilvl_d((v2i64)v11, (v2i64)v11), v10); \ + *b = (_Tpv)__builtin_msa_ilvr_w(v12, (_Tpvs)__builtin_msa_ilvl_d((v2i64)v10, (v2i64)v10)); \ + *c = (_Tpv)__builtin_msa_ilvr_w((_Tpvs)__builtin_msa_ilvl_d((v2i64)v12, (v2i64)v12), v11); \ +} + +MSA_INTERLEAVED_IMPL_LOAD3_32(uint32_t, v4u32, v4i32, u32) +MSA_INTERLEAVED_IMPL_LOAD3_32(int32_t, v4i32, v4i32, s32) +MSA_INTERLEAVED_IMPL_LOAD3_32(float, v4f32, v4i32, f32) + +#define MSA_INTERLEAVED_IMPL_LOAD3_64(_Tp, _Tpv, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld3q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c) \ +{ \ + *((_Tp*)a) = *ptr; *((_Tp*)b) = *(ptr + 1); *((_Tp*)c) = *(ptr + 2); \ + *((_Tp*)a + 1) = *(ptr + 3); *((_Tp*)b + 1) = *(ptr + 4); *((_Tp*)c + 1) = *(ptr + 5); \ +} + +MSA_INTERLEAVED_IMPL_LOAD3_64(uint64_t, v2u64, u64) +MSA_INTERLEAVED_IMPL_LOAD3_64(int64_t, v2i64, s64) +MSA_INTERLEAVED_IMPL_LOAD3_64(double, v2f64, f64) + +#ifdef _MIPSEB +#define MSA_INTERLEAVED_IMPL_STORE3_8(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0F0E0D0C0B1F1F1F, 0x1F1E1D1C1B1A1F1F}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0D1C140C1B130B1A, 0x1F170F1E160E1D15}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0A09080706051F1F, 0x19181716151F1F1F}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x1D14071C13061B12, 0x170A1F16091E1508}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 16, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x04030201001F1F1F, 0x14131211101F1F1F}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x15021C14011B1300, 0x051F17041E16031D}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 32, (_Tpv)v1); \ +} +#else +#define MSA_INTERLEAVED_IMPL_STORE3_8(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0000050403020100, 0x0000001413121110}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0A02110901100800, 0x05140C04130B0312}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0000000A09080706, 0x00001A1918171615}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x170A011609001508, 0x0D04190C03180B02}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 16, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x0000000F0E0D0C0B, 0x0000001F1E1D1C1B}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_b((_Tpvs)((v2i64){0x021C09011B08001A, 0x1F0C041E0B031D0A}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 32, (_Tpv)v1); \ +} +#endif + +MSA_INTERLEAVED_IMPL_STORE3_8(uint8_t, v16u8, v16i8, u8) +MSA_INTERLEAVED_IMPL_STORE3_8(int8_t, v16i8, v16i8, s8) + +#ifdef _MIPSEB +#define MSA_INTERLEAVED_IMPL_STORE3_16(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000700060005000F, 0x000F000E000D000F}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000A0006000D0009, 0x000F000B0007000E}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x00040003000F000F, 0x000C000B000A000F}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000E000A0003000D, 0x0005000F000B0004}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 8, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000200010000000F, 0x00090008000F000F}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0001000E00090000, 0x000B0002000F000A}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 16, (_Tpv)v1); \ +} +#else +#define MSA_INTERLEAVED_IMPL_STORE3_16(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0000000200010000, 0x0000000A00090008}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0001000800040000, 0x0006000200090005}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0000000500040003, 0x00000000000C000B}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x000B00040000000A, 0x0002000C00050001}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 8, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x0000000000070006, 0x0000000F000E000D}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_h((_Tpvs)((v2i64){0x00050000000D0004, 0x000F00060001000E}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 16, (_Tpv)v1); \ +} +#endif + +MSA_INTERLEAVED_IMPL_STORE3_16(uint16_t, v8u16, v8i16, u16) +MSA_INTERLEAVED_IMPL_STORE3_16(int16_t, v8i16, v8i16, s16) + +#ifdef _MIPSEB +#define MSA_INTERLEAVED_IMPL_STORE3_32(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000300000007, 0x0000000700000006}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000300000006, 0x0000000700000005}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000200000001, 0x0000000500000007}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000700000004, 0x0000000500000002}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 4, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000000000007, 0x0000000400000007}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000500000000, 0x0000000100000007}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 8, (_Tpv)v1); \ +} +#else +#define MSA_INTERLEAVED_IMPL_STORE3_32(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + _Tpvs v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000100000000, 0x0000000000000004}), (_Tpvs)b, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000200000000, 0x0000000100000004}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000000000002, 0x0000000600000005}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000500000002, 0x0000000300000000}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 4, (_Tpv)v1); \ + v0 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000000000003, 0x0000000000000007}), (_Tpvs)b, (_Tpvs)a); \ + v1 = __builtin_msa_vshf_w((_Tpvs)((v2i64){0x0000000000000006, 0x0000000700000002}), (_Tpvs)c, (_Tpvs)v0); \ + msa_st1q_##suffix(ptr + 8, (_Tpv)v1); \ +} +#endif + +MSA_INTERLEAVED_IMPL_STORE3_32(uint32_t, v4u32, v4i32, u32) +MSA_INTERLEAVED_IMPL_STORE3_32(int32_t, v4i32, v4i32, s32) +MSA_INTERLEAVED_IMPL_STORE3_32(float, v4f32, v4i32, f32) + +#define MSA_INTERLEAVED_IMPL_STORE3_64(_Tp, _Tpv, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st3q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c) \ +{ \ + *ptr = a[0]; *(ptr + 1) = b[0]; *(ptr + 2) = c[0]; \ + *(ptr + 3) = a[1]; *(ptr + 4) = b[1]; *(ptr + 5) = c[1]; \ +} + +MSA_INTERLEAVED_IMPL_STORE3_64(uint64_t, v2u64, u64) +MSA_INTERLEAVED_IMPL_STORE3_64(int64_t, v2i64, s64) +MSA_INTERLEAVED_IMPL_STORE3_64(double, v2f64, f64) + +#define MSA_INTERLEAVED_IMPL_LOAD4_STORE4(_Tp, _Tpv, _Tpvs, suffix, df, nlanes) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld4q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c, _Tpv* d) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + nlanes); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + nlanes * 2); \ + _Tpv v3 = msa_ld1q_##suffix(ptr + nlanes * 3); \ + _Tpvs t0 = __builtin_msa_pckev_##df((_Tpvs)v1, (_Tpvs)v0); \ + _Tpvs t1 = __builtin_msa_pckev_##df((_Tpvs)v3, (_Tpvs)v2); \ + _Tpvs t2 = __builtin_msa_pckod_##df((_Tpvs)v1, (_Tpvs)v0); \ + _Tpvs t3 = __builtin_msa_pckod_##df((_Tpvs)v3, (_Tpvs)v2); \ + *a = (_Tpv)__builtin_msa_pckev_##df(t1, t0); \ + *b = (_Tpv)__builtin_msa_pckev_##df(t3, t2); \ + *c = (_Tpv)__builtin_msa_pckod_##df(t1, t0); \ + *d = (_Tpv)__builtin_msa_pckod_##df(t3, t2); \ +} \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st4q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c, const _Tpv d) \ +{ \ + _Tpvs v0 = __builtin_msa_ilvr_##df((_Tpvs)c, (_Tpvs)a); \ + _Tpvs v1 = __builtin_msa_ilvr_##df((_Tpvs)d, (_Tpvs)b); \ + _Tpvs v2 = __builtin_msa_ilvl_##df((_Tpvs)c, (_Tpvs)a); \ + _Tpvs v3 = __builtin_msa_ilvl_##df((_Tpvs)d, (_Tpvs)b); \ + msa_st1q_##suffix(ptr, (_Tpv)__builtin_msa_ilvr_##df(v1, v0)); \ + msa_st1q_##suffix(ptr + nlanes, (_Tpv)__builtin_msa_ilvl_##df(v1, v0)); \ + msa_st1q_##suffix(ptr + 2 * nlanes, (_Tpv)__builtin_msa_ilvr_##df(v3, v2)); \ + msa_st1q_##suffix(ptr + 3 * nlanes, (_Tpv)__builtin_msa_ilvl_##df(v3, v2)); \ +} + +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(uint8_t, v16u8, v16i8, u8, b, 16) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(int8_t, v16i8, v16i8, s8, b, 16) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(uint16_t, v8u16, v8i16, u16, h, 8) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(int16_t, v8i16, v8i16, s16, h, 8) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(uint32_t, v4u32, v4i32, u32, w, 4) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(int32_t, v4i32, v4i32, s32, w, 4) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4(float, v4f32, v4i32, f32, w, 4) + +#define MSA_INTERLEAVED_IMPL_LOAD4_STORE4_64(_Tp, _Tpv, _Tpvs, suffix) \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_ld4q_##suffix(const _Tp* ptr, _Tpv* a, _Tpv* b, _Tpv* c, _Tpv* d) \ +{ \ + _Tpv v0 = msa_ld1q_##suffix(ptr); \ + _Tpv v1 = msa_ld1q_##suffix(ptr + 2); \ + _Tpv v2 = msa_ld1q_##suffix(ptr + 4); \ + _Tpv v3 = msa_ld1q_##suffix(ptr + 6); \ + *a = (_Tpv)__builtin_msa_ilvr_d((_Tpvs)v2, (_Tpvs)v0); \ + *b = (_Tpv)__builtin_msa_ilvl_d((_Tpvs)v2, (_Tpvs)v0); \ + *c = (_Tpv)__builtin_msa_ilvr_d((_Tpvs)v3, (_Tpvs)v1); \ + *d = (_Tpv)__builtin_msa_ilvl_d((_Tpvs)v3, (_Tpvs)v1); \ +} \ +__extension__ extern __inline void \ +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ +msa_st4q_##suffix(_Tp* ptr, const _Tpv a, const _Tpv b, const _Tpv c, const _Tpv d) \ +{ \ + msa_st1q_##suffix(ptr, (_Tpv)__builtin_msa_ilvr_d((_Tpvs)b, (_Tpvs)a)); \ + msa_st1q_##suffix(ptr + 2, (_Tpv)__builtin_msa_ilvr_d((_Tpvs)d, (_Tpvs)c)); \ + msa_st1q_##suffix(ptr + 4, (_Tpv)__builtin_msa_ilvl_d((_Tpvs)b, (_Tpvs)a)); \ + msa_st1q_##suffix(ptr + 6, (_Tpv)__builtin_msa_ilvl_d((_Tpvs)d, (_Tpvs)c)); \ +} + +MSA_INTERLEAVED_IMPL_LOAD4_STORE4_64(uint64_t, v2u64, v2i64, u64) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4_64(int64_t, v2i64, v2i64, s64) +MSA_INTERLEAVED_IMPL_LOAD4_STORE4_64(double, v2f64, v2i64, f64) + +__extension__ extern __inline v8i16 +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +msa_qdmulhq_n_s16(v8i16 a, int16_t b) +{ + v8i16 a_lo, a_hi; + ILVRL_H2_SH(a, msa_dupq_n_s16(0), a_lo, a_hi); + return msa_packr_s32(msa_shlq_n_s32(msa_mulq_s32(msa_paddlq_s16(a_lo), msa_dupq_n_s32(b)), 1), + msa_shlq_n_s32(msa_mulq_s32(msa_paddlq_s16(a_hi), msa_dupq_n_s32(b)), 1), 16); +} + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /*__mips_msa*/ +#endif /* OPENCV_CORE_MSA_MACROS_H */ diff --git a/Thirdparty/opencv2/include/opencv2/core/hal/simd_utils.impl.hpp b/Thirdparty/opencv2/include/opencv2/core/hal/simd_utils.impl.hpp new file mode 100644 index 0000000..0a1ab2c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/hal/simd_utils.impl.hpp @@ -0,0 +1,186 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +// This header is not standalone. Don't include directly, use "intrin.hpp" instead. +#ifdef OPENCV_HAL_INTRIN_HPP // defined in intrin.hpp + + +#if CV_SIMD128 || CV_SIMD128_CPP + +template struct Type2Vec128_Traits; +#define CV_INTRIN_DEF_TYPE2VEC128_TRAITS(type_, vec_type_) \ + template<> struct Type2Vec128_Traits \ + { \ + typedef vec_type_ vec_type; \ + } + +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(uchar, v_uint8x16); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(schar, v_int8x16); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(ushort, v_uint16x8); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(short, v_int16x8); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(unsigned, v_uint32x4); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(int, v_int32x4); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(float, v_float32x4); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(uint64, v_uint64x2); +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(int64, v_int64x2); +#if CV_SIMD128_64F +CV_INTRIN_DEF_TYPE2VEC128_TRAITS(double, v_float64x2); +#endif + +template static inline +typename Type2Vec128_Traits<_T>::vec_type v_setall(const _T& a); + +template<> inline Type2Vec128_Traits< uchar>::vec_type v_setall< uchar>(const uchar& a) { return v_setall_u8(a); } +template<> inline Type2Vec128_Traits< schar>::vec_type v_setall< schar>(const schar& a) { return v_setall_s8(a); } +template<> inline Type2Vec128_Traits::vec_type v_setall(const ushort& a) { return v_setall_u16(a); } +template<> inline Type2Vec128_Traits< short>::vec_type v_setall< short>(const short& a) { return v_setall_s16(a); } +template<> inline Type2Vec128_Traits< uint>::vec_type v_setall< uint>(const uint& a) { return v_setall_u32(a); } +template<> inline Type2Vec128_Traits< int>::vec_type v_setall< int>(const int& a) { return v_setall_s32(a); } +template<> inline Type2Vec128_Traits::vec_type v_setall(const uint64& a) { return v_setall_u64(a); } +template<> inline Type2Vec128_Traits< int64>::vec_type v_setall< int64>(const int64& a) { return v_setall_s64(a); } +template<> inline Type2Vec128_Traits< float>::vec_type v_setall< float>(const float& a) { return v_setall_f32(a); } +#if CV_SIMD128_64F +template<> inline Type2Vec128_Traits::vec_type v_setall(const double& a) { return v_setall_f64(a); } +#endif + +#endif // SIMD128 + + +#if CV_SIMD256 + +template struct Type2Vec256_Traits; +#define CV_INTRIN_DEF_TYPE2VEC256_TRAITS(type_, vec_type_) \ + template<> struct Type2Vec256_Traits \ + { \ + typedef vec_type_ vec_type; \ + } + +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(uchar, v_uint8x32); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(schar, v_int8x32); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(ushort, v_uint16x16); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(short, v_int16x16); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(unsigned, v_uint32x8); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(int, v_int32x8); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(float, v_float32x8); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(uint64, v_uint64x4); +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(int64, v_int64x4); +#if CV_SIMD256_64F +CV_INTRIN_DEF_TYPE2VEC256_TRAITS(double, v_float64x4); +#endif + +template static inline +typename Type2Vec256_Traits<_T>::vec_type v256_setall(const _T& a); + +template<> inline Type2Vec256_Traits< uchar>::vec_type v256_setall< uchar>(const uchar& a) { return v256_setall_u8(a); } +template<> inline Type2Vec256_Traits< schar>::vec_type v256_setall< schar>(const schar& a) { return v256_setall_s8(a); } +template<> inline Type2Vec256_Traits::vec_type v256_setall(const ushort& a) { return v256_setall_u16(a); } +template<> inline Type2Vec256_Traits< short>::vec_type v256_setall< short>(const short& a) { return v256_setall_s16(a); } +template<> inline Type2Vec256_Traits< uint>::vec_type v256_setall< uint>(const uint& a) { return v256_setall_u32(a); } +template<> inline Type2Vec256_Traits< int>::vec_type v256_setall< int>(const int& a) { return v256_setall_s32(a); } +template<> inline Type2Vec256_Traits::vec_type v256_setall(const uint64& a) { return v256_setall_u64(a); } +template<> inline Type2Vec256_Traits< int64>::vec_type v256_setall< int64>(const int64& a) { return v256_setall_s64(a); } +template<> inline Type2Vec256_Traits< float>::vec_type v256_setall< float>(const float& a) { return v256_setall_f32(a); } +#if CV_SIMD256_64F +template<> inline Type2Vec256_Traits::vec_type v256_setall(const double& a) { return v256_setall_f64(a); } +#endif + +#endif // SIMD256 + + +#if CV_SIMD512 + +template struct Type2Vec512_Traits; +#define CV_INTRIN_DEF_TYPE2VEC512_TRAITS(type_, vec_type_) \ + template<> struct Type2Vec512_Traits \ + { \ + typedef vec_type_ vec_type; \ + } + +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(uchar, v_uint8x64); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(schar, v_int8x64); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(ushort, v_uint16x32); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(short, v_int16x32); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(unsigned, v_uint32x16); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(int, v_int32x16); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(float, v_float32x16); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(uint64, v_uint64x8); +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(int64, v_int64x8); +#if CV_SIMD512_64F +CV_INTRIN_DEF_TYPE2VEC512_TRAITS(double, v_float64x8); +#endif + +template static inline +typename Type2Vec512_Traits<_T>::vec_type v512_setall(const _T& a); + +template<> inline Type2Vec512_Traits< uchar>::vec_type v512_setall< uchar>(const uchar& a) { return v512_setall_u8(a); } +template<> inline Type2Vec512_Traits< schar>::vec_type v512_setall< schar>(const schar& a) { return v512_setall_s8(a); } +template<> inline Type2Vec512_Traits::vec_type v512_setall(const ushort& a) { return v512_setall_u16(a); } +template<> inline Type2Vec512_Traits< short>::vec_type v512_setall< short>(const short& a) { return v512_setall_s16(a); } +template<> inline Type2Vec512_Traits< uint>::vec_type v512_setall< uint>(const uint& a) { return v512_setall_u32(a); } +template<> inline Type2Vec512_Traits< int>::vec_type v512_setall< int>(const int& a) { return v512_setall_s32(a); } +template<> inline Type2Vec512_Traits::vec_type v512_setall(const uint64& a) { return v512_setall_u64(a); } +template<> inline Type2Vec512_Traits< int64>::vec_type v512_setall< int64>(const int64& a) { return v512_setall_s64(a); } +template<> inline Type2Vec512_Traits< float>::vec_type v512_setall< float>(const float& a) { return v512_setall_f32(a); } +#if CV_SIMD512_64F +template<> inline Type2Vec512_Traits::vec_type v512_setall(const double& a) { return v512_setall_f64(a); } +#endif + +#endif // SIMD512 + +#if CV_SIMD_SCALABLE +template struct Type2Vec_Traits; +#define CV_INTRIN_DEF_TYPE2VEC_TRAITS(type_, vec_type_) \ + template<> struct Type2Vec_Traits \ + { \ + typedef vec_type_ vec_type; \ + } + +CV_INTRIN_DEF_TYPE2VEC_TRAITS(uchar, v_uint8); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(schar, v_int8); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(ushort, v_uint16); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(short, v_int16); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(unsigned, v_uint32); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(int, v_int32); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(float, v_float32); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(uint64, v_uint64); +CV_INTRIN_DEF_TYPE2VEC_TRAITS(int64, v_int64); +#if CV_SIMD_SCALABLE_64F +CV_INTRIN_DEF_TYPE2VEC_TRAITS(double, v_float64); +#endif +template static inline +typename Type2Vec_Traits<_T>::vec_type v_setall(const _T& a); + +template<> inline Type2Vec_Traits< uchar>::vec_type v_setall< uchar>(const uchar& a) { return v_setall_u8(a); } +template<> inline Type2Vec_Traits< schar>::vec_type v_setall< schar>(const schar& a) { return v_setall_s8(a); } +template<> inline Type2Vec_Traits::vec_type v_setall(const ushort& a) { return v_setall_u16(a); } +template<> inline Type2Vec_Traits< short>::vec_type v_setall< short>(const short& a) { return v_setall_s16(a); } +template<> inline Type2Vec_Traits< uint>::vec_type v_setall< uint>(const uint& a) { return v_setall_u32(a); } +template<> inline Type2Vec_Traits< int>::vec_type v_setall< int>(const int& a) { return v_setall_s32(a); } +template<> inline Type2Vec_Traits::vec_type v_setall(const uint64& a) { return v_setall_u64(a); } +template<> inline Type2Vec_Traits< int64>::vec_type v_setall< int64>(const int64& a) { return v_setall_s64(a); } +template<> inline Type2Vec_Traits< float>::vec_type v_setall< float>(const float& a) { return v_setall_f32(a); } +#if CV_SIMD_SCALABLE_64F +template<> inline Type2Vec_Traits::vec_type v_setall(const double& a) { return v_setall_f64(a); } +#endif +#endif + + +#if CV_SIMD_SCALABLE +template static inline +typename Type2Vec_Traits<_T>::vec_type vx_setall(const _T& a) { return v_setall(a); } +#elif CV_SIMD_WIDTH == 16 +template static inline +typename Type2Vec128_Traits<_T>::vec_type vx_setall(const _T& a) { return v_setall(a); } +#elif CV_SIMD_WIDTH == 32 +template static inline +typename Type2Vec256_Traits<_T>::vec_type vx_setall(const _T& a) { return v256_setall(a); } +#elif CV_SIMD_WIDTH == 64 +template static inline +typename Type2Vec512_Traits<_T>::vec_type vx_setall(const _T& a) { return v512_setall(a); } +#else +#error "Build configuration error, unsupported CV_SIMD_WIDTH" +#endif + + +#endif // OPENCV_HAL_INTRIN_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/mat.hpp b/Thirdparty/opencv2/include/opencv2/core/mat.hpp new file mode 100644 index 0000000..c4c6ff6 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/mat.hpp @@ -0,0 +1,3796 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_MAT_HPP +#define OPENCV_CORE_MAT_HPP + +#ifndef __cplusplus +# error mat.hpp header must be compiled as C++ +#endif + +#include "opencv2/core/matx.hpp" +#include "opencv2/core/types.hpp" + +#include "opencv2/core/bufferpool.hpp" + +#include + +namespace cv +{ + +//! @addtogroup core_basic +//! @{ + +enum AccessFlag { ACCESS_READ=1<<24, ACCESS_WRITE=1<<25, + ACCESS_RW=3<<24, ACCESS_MASK=ACCESS_RW, ACCESS_FAST=1<<26 }; +CV_ENUM_FLAGS(AccessFlag) +__CV_ENUM_FLAGS_BITWISE_AND(AccessFlag, int, AccessFlag) + +CV__DEBUG_NS_BEGIN + +class CV_EXPORTS _OutputArray; + +//////////////////////// Input/Output Array Arguments ///////////////////////////////// + +/** @brief This is the proxy class for passing read-only input arrays into OpenCV functions. + +It is defined as: +@code + typedef const _InputArray& InputArray; +@endcode +where _InputArray is a class that can be constructed from `Mat`, `Mat_`, `Matx`, +`std::vector`, `std::vector >`, `std::vector`, `std::vector >`, +`UMat`, `std::vector` or `double`. It can also be constructed from a matrix expression. + +Since this is mostly implementation-level class, and its interface may change in future versions, we +do not describe it in details. There are a few key things, though, that should be kept in mind: + +- When you see in the reference manual or in OpenCV source code a function that takes + InputArray, it means that you can actually pass `Mat`, `Matx`, `vector` etc. (see above the + complete list). +- Optional input arguments: If some of the input arrays may be empty, pass cv::noArray() (or + simply cv::Mat() as you probably did before). +- The class is designed solely for passing parameters. That is, normally you *should not* + declare class members, local and global variables of this type. +- If you want to design your own function or a class method that can operate of arrays of + multiple types, you can use InputArray (or OutputArray) for the respective parameters. Inside + a function you should use _InputArray::getMat() method to construct a matrix header for the + array (without copying data). _InputArray::kind() can be used to distinguish Mat from + `vector<>` etc., but normally it is not needed. + +Here is how you can use a function that takes InputArray : +@code + std::vector vec; + // points or a circle + for( int i = 0; i < 30; i++ ) + vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)), + (float)(100 - 30*sin(i*CV_PI*2/5)))); + cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20)); +@endcode +That is, we form an STL vector containing points, and apply in-place affine transformation to the +vector using the 2x3 matrix created inline as `Matx` instance. + +Here is how such a function can be implemented (for simplicity, we implement a very specific case of +it, according to the assertion statement inside) : +@code + void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m) + { + // get Mat headers for input arrays. This is O(1) operation, + // unless _src and/or _m are matrix expressions. + Mat src = _src.getMat(), m = _m.getMat(); + CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) ); + + // [re]create the output array so that it has the proper size and type. + // In case of Mat it calls Mat::create, in case of STL vector it calls vector::resize. + _dst.create(src.size(), src.type()); + Mat dst = _dst.getMat(); + + for( int i = 0; i < src.rows; i++ ) + for( int j = 0; j < src.cols; j++ ) + { + Point2f pt = src.at(i, j); + dst.at(i, j) = Point2f(m.at(0, 0)*pt.x + + m.at(0, 1)*pt.y + + m.at(0, 2), + m.at(1, 0)*pt.x + + m.at(1, 1)*pt.y + + m.at(1, 2)); + } + } +@endcode +There is another related type, InputArrayOfArrays, which is currently defined as a synonym for +InputArray: +@code + typedef InputArray InputArrayOfArrays; +@endcode +It denotes function arguments that are either vectors of vectors or vectors of matrices. A separate +synonym is needed to generate Python/Java etc. wrappers properly. At the function implementation +level their use is similar, but _InputArray::getMat(idx) should be used to get header for the +idx-th component of the outer vector and _InputArray::size().area() should be used to find the +number of components (vectors/matrices) of the outer vector. + +In general, type support is limited to cv::Mat types. Other types are forbidden. +But in some cases we need to support passing of custom non-general Mat types, like arrays of cv::KeyPoint, cv::DMatch, etc. +This data is not intended to be interpreted as an image data, or processed somehow like regular cv::Mat. +To pass such custom type use rawIn() / rawOut() / rawInOut() wrappers. +Custom type is wrapped as Mat-compatible `CV_8UC` values (N = sizeof(T), N <= CV_CN_MAX). + */ +class CV_EXPORTS _InputArray +{ +public: + enum KindFlag { + KIND_SHIFT = 16, + FIXED_TYPE = 0x8000 << KIND_SHIFT, + FIXED_SIZE = 0x4000 << KIND_SHIFT, + KIND_MASK = 31 << KIND_SHIFT, + + NONE = 0 << KIND_SHIFT, + MAT = 1 << KIND_SHIFT, + MATX = 2 << KIND_SHIFT, + STD_VECTOR = 3 << KIND_SHIFT, + STD_VECTOR_VECTOR = 4 << KIND_SHIFT, + STD_VECTOR_MAT = 5 << KIND_SHIFT, +#if OPENCV_ABI_COMPATIBILITY < 500 + EXPR = 6 << KIND_SHIFT, //!< removed: https://github.com/opencv/opencv/pull/17046 +#endif + OPENGL_BUFFER = 7 << KIND_SHIFT, + CUDA_HOST_MEM = 8 << KIND_SHIFT, + CUDA_GPU_MAT = 9 << KIND_SHIFT, + UMAT =10 << KIND_SHIFT, + STD_VECTOR_UMAT =11 << KIND_SHIFT, + STD_BOOL_VECTOR =12 << KIND_SHIFT, + STD_VECTOR_CUDA_GPU_MAT = 13 << KIND_SHIFT, +#if OPENCV_ABI_COMPATIBILITY < 500 + STD_ARRAY =14 << KIND_SHIFT, //!< removed: https://github.com/opencv/opencv/issues/18897 +#endif + STD_ARRAY_MAT =15 << KIND_SHIFT + }; + + _InputArray(); + _InputArray(int _flags, void* _obj); + _InputArray(const Mat& m); + _InputArray(const MatExpr& expr); + _InputArray(const std::vector& vec); + template _InputArray(const Mat_<_Tp>& m); + template _InputArray(const std::vector<_Tp>& vec); + _InputArray(const std::vector& vec); + template _InputArray(const std::vector >& vec); + _InputArray(const std::vector >&) = delete; // not supported + template _InputArray(const std::vector >& vec); + template _InputArray(const _Tp* vec, int n); + template _InputArray(const Matx<_Tp, m, n>& matx); + _InputArray(const double& val); + _InputArray(const cuda::GpuMat& d_mat); + _InputArray(const std::vector& d_mat_array); + _InputArray(const ogl::Buffer& buf); + _InputArray(const cuda::HostMem& cuda_mem); + template _InputArray(const cudev::GpuMat_<_Tp>& m); + _InputArray(const UMat& um); + _InputArray(const std::vector& umv); + + template _InputArray(const std::array<_Tp, _Nm>& arr); + template _InputArray(const std::array& arr); + + template static _InputArray rawIn(const std::vector<_Tp>& vec); + template static _InputArray rawIn(const std::array<_Tp, _Nm>& arr); + + Mat getMat(int idx=-1) const; + Mat getMat_(int idx=-1) const; + UMat getUMat(int idx=-1) const; + void getMatVector(std::vector& mv) const; + void getUMatVector(std::vector& umv) const; + void getGpuMatVector(std::vector& gpumv) const; + cuda::GpuMat getGpuMat() const; + ogl::Buffer getOGlBuffer() const; + + int getFlags() const; + void* getObj() const; + Size getSz() const; + + _InputArray::KindFlag kind() const; + int dims(int i=-1) const; + int cols(int i=-1) const; + int rows(int i=-1) const; + Size size(int i=-1) const; + int sizend(int* sz, int i=-1) const; + bool sameSize(const _InputArray& arr) const; + size_t total(int i=-1) const; + int type(int i=-1) const; + int depth(int i=-1) const; + int channels(int i=-1) const; + bool isContinuous(int i=-1) const; + bool isSubmatrix(int i=-1) const; + bool empty() const; + void copyTo(const _OutputArray& arr) const; + void copyTo(const _OutputArray& arr, const _InputArray & mask) const; + size_t offset(int i=-1) const; + size_t step(int i=-1) const; + bool isMat() const; + bool isUMat() const; + bool isMatVector() const; + bool isUMatVector() const; + bool isMatx() const; + bool isVector() const; + bool isGpuMat() const; + bool isGpuMatVector() const; + ~_InputArray(); + +protected: + int flags; + void* obj; + Size sz; + + void init(int _flags, const void* _obj); + void init(int _flags, const void* _obj, Size _sz); +}; +CV_ENUM_FLAGS(_InputArray::KindFlag) +__CV_ENUM_FLAGS_BITWISE_AND(_InputArray::KindFlag, int, _InputArray::KindFlag) + +/** @brief This type is very similar to InputArray except that it is used for input/output and output function +parameters. + +Just like with InputArray, OpenCV users should not care about OutputArray, they just pass `Mat`, +`vector` etc. to the functions. The same limitation as for `InputArray`: *Do not explicitly +create OutputArray instances* applies here too. + +If you want to make your function polymorphic (i.e. accept different arrays as output parameters), +it is also not very difficult. Take the sample above as the reference. Note that +_OutputArray::create() needs to be called before _OutputArray::getMat(). This way you guarantee +that the output array is properly allocated. + +Optional output parameters. If you do not need certain output array to be computed and returned to +you, pass cv::noArray(), just like you would in the case of optional input array. At the +implementation level, use _OutputArray::needed() to check if certain output array needs to be +computed or not. + +There are several synonyms for OutputArray that are used to assist automatic Python/Java/... wrapper +generators: +@code + typedef OutputArray OutputArrayOfArrays; + typedef OutputArray InputOutputArray; + typedef OutputArray InputOutputArrayOfArrays; +@endcode + */ +class CV_EXPORTS _OutputArray : public _InputArray +{ +public: + enum DepthMask + { + DEPTH_MASK_8U = 1 << CV_8U, + DEPTH_MASK_8S = 1 << CV_8S, + DEPTH_MASK_16U = 1 << CV_16U, + DEPTH_MASK_16S = 1 << CV_16S, + DEPTH_MASK_32S = 1 << CV_32S, + DEPTH_MASK_32F = 1 << CV_32F, + DEPTH_MASK_64F = 1 << CV_64F, + DEPTH_MASK_16F = 1 << CV_16F, + DEPTH_MASK_ALL = (DEPTH_MASK_64F<<1)-1, + DEPTH_MASK_ALL_BUT_8S = DEPTH_MASK_ALL & ~DEPTH_MASK_8S, + DEPTH_MASK_ALL_16F = (DEPTH_MASK_16F<<1)-1, + DEPTH_MASK_FLT = DEPTH_MASK_32F + DEPTH_MASK_64F + }; + + _OutputArray(); + _OutputArray(int _flags, void* _obj); + _OutputArray(Mat& m); + _OutputArray(std::vector& vec); + _OutputArray(cuda::GpuMat& d_mat); + _OutputArray(std::vector& d_mat); + _OutputArray(ogl::Buffer& buf); + _OutputArray(cuda::HostMem& cuda_mem); + template _OutputArray(cudev::GpuMat_<_Tp>& m); + template _OutputArray(std::vector<_Tp>& vec); + _OutputArray(std::vector& vec) = delete; // not supported + template _OutputArray(std::vector >& vec); + _OutputArray(std::vector >&) = delete; // not supported + template _OutputArray(std::vector >& vec); + template _OutputArray(Mat_<_Tp>& m); + template _OutputArray(_Tp* vec, int n); + template _OutputArray(Matx<_Tp, m, n>& matx); + _OutputArray(UMat& m); + _OutputArray(std::vector& vec); + + _OutputArray(const Mat& m); + _OutputArray(const std::vector& vec); + _OutputArray(const cuda::GpuMat& d_mat); + _OutputArray(const std::vector& d_mat); + _OutputArray(const ogl::Buffer& buf); + _OutputArray(const cuda::HostMem& cuda_mem); + template _OutputArray(const cudev::GpuMat_<_Tp>& m); + template _OutputArray(const std::vector<_Tp>& vec); + template _OutputArray(const std::vector >& vec); + template _OutputArray(const std::vector >& vec); + template _OutputArray(const Mat_<_Tp>& m); + template _OutputArray(const _Tp* vec, int n); + template _OutputArray(const Matx<_Tp, m, n>& matx); + _OutputArray(const UMat& m); + _OutputArray(const std::vector& vec); + + template _OutputArray(std::array<_Tp, _Nm>& arr); + template _OutputArray(const std::array<_Tp, _Nm>& arr); + template _OutputArray(std::array& arr); + template _OutputArray(const std::array& arr); + + template static _OutputArray rawOut(std::vector<_Tp>& vec); + template static _OutputArray rawOut(std::array<_Tp, _Nm>& arr); + + bool fixedSize() const; + bool fixedType() const; + bool needed() const; + Mat& getMatRef(int i=-1) const; + UMat& getUMatRef(int i=-1) const; + cuda::GpuMat& getGpuMatRef() const; + std::vector& getGpuMatVecRef() const; + ogl::Buffer& getOGlBufferRef() const; + cuda::HostMem& getHostMemRef() const; + void create(Size sz, int type, int i=-1, bool allowTransposed=false, _OutputArray::DepthMask fixedDepthMask=static_cast<_OutputArray::DepthMask>(0)) const; + void create(int rows, int cols, int type, int i=-1, bool allowTransposed=false, _OutputArray::DepthMask fixedDepthMask=static_cast<_OutputArray::DepthMask>(0)) const; + void create(int dims, const int* size, int type, int i=-1, bool allowTransposed=false, _OutputArray::DepthMask fixedDepthMask=static_cast<_OutputArray::DepthMask>(0)) const; + void createSameSize(const _InputArray& arr, int mtype) const; + void release() const; + void clear() const; + void setTo(const _InputArray& value, const _InputArray & mask = _InputArray()) const; + + void assign(const UMat& u) const; + void assign(const Mat& m) const; + + void assign(const std::vector& v) const; + void assign(const std::vector& v) const; + + void move(UMat& u) const; + void move(Mat& m) const; +}; + + +class CV_EXPORTS _InputOutputArray : public _OutputArray +{ +public: + _InputOutputArray(); + _InputOutputArray(int _flags, void* _obj); + _InputOutputArray(Mat& m); + _InputOutputArray(std::vector& vec); + _InputOutputArray(cuda::GpuMat& d_mat); + _InputOutputArray(ogl::Buffer& buf); + _InputOutputArray(cuda::HostMem& cuda_mem); + template _InputOutputArray(cudev::GpuMat_<_Tp>& m); + template _InputOutputArray(std::vector<_Tp>& vec); + _InputOutputArray(std::vector& vec) = delete; // not supported + template _InputOutputArray(std::vector >& vec); + template _InputOutputArray(std::vector >& vec); + template _InputOutputArray(Mat_<_Tp>& m); + template _InputOutputArray(_Tp* vec, int n); + template _InputOutputArray(Matx<_Tp, m, n>& matx); + _InputOutputArray(UMat& m); + _InputOutputArray(std::vector& vec); + + _InputOutputArray(const Mat& m); + _InputOutputArray(const std::vector& vec); + _InputOutputArray(const cuda::GpuMat& d_mat); + _InputOutputArray(const std::vector& d_mat); + _InputOutputArray(const ogl::Buffer& buf); + _InputOutputArray(const cuda::HostMem& cuda_mem); + template _InputOutputArray(const cudev::GpuMat_<_Tp>& m); + template _InputOutputArray(const std::vector<_Tp>& vec); + template _InputOutputArray(const std::vector >& vec); + template _InputOutputArray(const std::vector >& vec); + template _InputOutputArray(const Mat_<_Tp>& m); + template _InputOutputArray(const _Tp* vec, int n); + template _InputOutputArray(const Matx<_Tp, m, n>& matx); + _InputOutputArray(const UMat& m); + _InputOutputArray(const std::vector& vec); + + template _InputOutputArray(std::array<_Tp, _Nm>& arr); + template _InputOutputArray(const std::array<_Tp, _Nm>& arr); + template _InputOutputArray(std::array& arr); + template _InputOutputArray(const std::array& arr); + + template static _InputOutputArray rawInOut(std::vector<_Tp>& vec); + template _InputOutputArray rawInOut(std::array<_Tp, _Nm>& arr); + +}; + +/** Helper to wrap custom types. @see InputArray */ +template static inline _InputArray rawIn(_Tp& v); +/** Helper to wrap custom types. @see InputArray */ +template static inline _OutputArray rawOut(_Tp& v); +/** Helper to wrap custom types. @see InputArray */ +template static inline _InputOutputArray rawInOut(_Tp& v); + +CV__DEBUG_NS_END + +typedef const _InputArray& InputArray; +typedef InputArray InputArrayOfArrays; +typedef const _OutputArray& OutputArray; +typedef OutputArray OutputArrayOfArrays; +typedef const _InputOutputArray& InputOutputArray; +typedef InputOutputArray InputOutputArrayOfArrays; + +CV_EXPORTS InputOutputArray noArray(); + +/////////////////////////////////// MatAllocator ////////////////////////////////////// + +/** @brief Usage flags for allocator + + @warning All flags except `USAGE_DEFAULT` are experimental. + + @warning For the OpenCL allocator, `USAGE_ALLOCATE_SHARED_MEMORY` depends on + OpenCV's optional, experimental integration with OpenCL SVM. To enable this + integration, build OpenCV using the `WITH_OPENCL_SVM=ON` CMake option and, at + runtime, call `cv::ocl::Context::getDefault().setUseSVM(true);` or similar + code. Note that SVM is incompatible with OpenCL 1.x. +*/ +enum UMatUsageFlags +{ + USAGE_DEFAULT = 0, + + // buffer allocation policy is platform and usage specific + USAGE_ALLOCATE_HOST_MEMORY = 1 << 0, + USAGE_ALLOCATE_DEVICE_MEMORY = 1 << 1, + USAGE_ALLOCATE_SHARED_MEMORY = 1 << 2, // It is not equal to: USAGE_ALLOCATE_HOST_MEMORY | USAGE_ALLOCATE_DEVICE_MEMORY + + __UMAT_USAGE_FLAGS_32BIT = 0x7fffffff // Binary compatibility hint +}; + +struct CV_EXPORTS UMatData; + +/** @brief Custom array allocator +*/ +class CV_EXPORTS MatAllocator +{ +public: + MatAllocator() {} + virtual ~MatAllocator() {} + + // let's comment it off for now to detect and fix all the uses of allocator + //virtual void allocate(int dims, const int* sizes, int type, int*& refcount, + // uchar*& datastart, uchar*& data, size_t* step) = 0; + //virtual void deallocate(int* refcount, uchar* datastart, uchar* data) = 0; + virtual UMatData* allocate(int dims, const int* sizes, int type, + void* data, size_t* step, AccessFlag flags, UMatUsageFlags usageFlags) const = 0; + virtual bool allocate(UMatData* data, AccessFlag accessflags, UMatUsageFlags usageFlags) const = 0; + virtual void deallocate(UMatData* data) const = 0; + virtual void map(UMatData* data, AccessFlag accessflags) const; + virtual void unmap(UMatData* data) const; + virtual void download(UMatData* data, void* dst, int dims, const size_t sz[], + const size_t srcofs[], const size_t srcstep[], + const size_t dststep[]) const; + virtual void upload(UMatData* data, const void* src, int dims, const size_t sz[], + const size_t dstofs[], const size_t dststep[], + const size_t srcstep[]) const; + virtual void copy(UMatData* srcdata, UMatData* dstdata, int dims, const size_t sz[], + const size_t srcofs[], const size_t srcstep[], + const size_t dstofs[], const size_t dststep[], bool sync) const; + + // default implementation returns DummyBufferPoolController + virtual BufferPoolController* getBufferPoolController(const char* id = NULL) const; +}; + + +//////////////////////////////// MatCommaInitializer ////////////////////////////////// + +/** @brief Comma-separated Matrix Initializer + + The class instances are usually not created explicitly. + Instead, they are created on "matrix << firstValue" operator. + + The sample below initializes 2x2 rotation matrix: + + \code + double angle = 30, a = cos(angle*CV_PI/180), b = sin(angle*CV_PI/180); + Mat R = (Mat_(2,2) << a, -b, b, a); + \endcode +*/ +template class MatCommaInitializer_ +{ +public: + //! the constructor, created by "matrix << firstValue" operator, where matrix is cv::Mat + MatCommaInitializer_(Mat_<_Tp>* _m); + //! the operator that takes the next value and put it to the matrix + template MatCommaInitializer_<_Tp>& operator , (T2 v); + //! another form of conversion operator + operator Mat_<_Tp>() const; +protected: + MatIterator_<_Tp> it; +}; + + +/////////////////////////////////////// Mat /////////////////////////////////////////// + +// note that umatdata might be allocated together +// with the matrix data, not as a separate object. +// therefore, it does not have constructor or destructor; +// it should be explicitly initialized using init(). +struct CV_EXPORTS UMatData +{ + enum MemoryFlag { COPY_ON_MAP=1, HOST_COPY_OBSOLETE=2, + DEVICE_COPY_OBSOLETE=4, TEMP_UMAT=8, TEMP_COPIED_UMAT=24, + USER_ALLOCATED=32, DEVICE_MEM_MAPPED=64, + ASYNC_CLEANUP=128 + }; + UMatData(const MatAllocator* allocator); + ~UMatData(); + + // provide atomic access to the structure + void lock(); + void unlock(); + + bool hostCopyObsolete() const; + bool deviceCopyObsolete() const; + bool deviceMemMapped() const; + bool copyOnMap() const; + bool tempUMat() const; + bool tempCopiedUMat() const; + void markHostCopyObsolete(bool flag); + void markDeviceCopyObsolete(bool flag); + void markDeviceMemMapped(bool flag); + + const MatAllocator* prevAllocator; + const MatAllocator* currAllocator; + int urefcount; + int refcount; + uchar* data; + uchar* origdata; + size_t size; + + UMatData::MemoryFlag flags; + void* handle; + void* userdata; + int allocatorFlags_; + int mapcount; + UMatData* originalUMatData; + std::shared_ptr allocatorContext; +}; +CV_ENUM_FLAGS(UMatData::MemoryFlag) + + +struct CV_EXPORTS MatSize +{ + explicit MatSize(int* _p) CV_NOEXCEPT; + int dims() const CV_NOEXCEPT; + Size operator()() const; + const int& operator[](int i) const; + int& operator[](int i); + operator const int*() const CV_NOEXCEPT; // TODO OpenCV 4.0: drop this + bool operator == (const MatSize& sz) const CV_NOEXCEPT; + bool operator != (const MatSize& sz) const CV_NOEXCEPT; + + int* p; +}; + +struct CV_EXPORTS MatStep +{ + MatStep() CV_NOEXCEPT; + explicit MatStep(size_t s) CV_NOEXCEPT; + const size_t& operator[](int i) const CV_NOEXCEPT; + size_t& operator[](int i) CV_NOEXCEPT; + operator size_t() const; + MatStep& operator = (size_t s); + + size_t* p; + size_t buf[2]; +protected: + MatStep& operator = (const MatStep&); +}; + +/** @example samples/cpp/cout_mat.cpp +An example demonstrating the serial out capabilities of cv::Mat +*/ + + /** @brief n-dimensional dense array class \anchor CVMat_Details + +The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It +can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel +volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms +may be better stored in a SparseMat ). The data layout of the array `M` is defined by the array +`M.step[]`, so that the address of element \f$(i_0,...,i_{M.dims-1})\f$, where \f$0\leq i_k= M.step[i+1]` (in fact, `M.step[i] >= M.step[i+1]*M.size[i+1]` ). This means +that 2-dimensional matrices are stored row-by-row, 3-dimensional matrices are stored plane-by-plane, +and so on. M.step[M.dims-1] is minimal and always equal to the element size M.elemSize() . + +So, the data layout in Mat is compatible with the majority of dense array types from the standard +toolkits and SDKs, such as Numpy (ndarray), Win32 (independent device bitmaps), and others, +that is, with any array that uses *steps* (or *strides*) to compute the position of a pixel. +Due to this compatibility, it is possible to make a Mat header for user-allocated data and process +it in-place using OpenCV functions. + +There are many different ways to create a Mat object. The most popular options are listed below: + +- Use the create(nrows, ncols, type) method or the similar Mat(nrows, ncols, type[, fillValue]) +constructor. A new array of the specified size and type is allocated. type has the same meaning as +in the cvCreateMat method. For example, CV_8UC1 means a 8-bit single-channel array, CV_32FC2 +means a 2-channel (complex) floating-point array, and so on. +@code + // make a 7x7 complex matrix filled with 1+3j. + Mat M(7,7,CV_32FC2,Scalar(1,3)); + // and now turn M to a 100x60 15-channel 8-bit matrix. + // The old content will be deallocated + M.create(100,60,CV_8UC(15)); +@endcode +As noted in the introduction to this chapter, create() allocates only a new array when the shape +or type of the current array are different from the specified ones. + +- Create a multi-dimensional array: +@code + // create a 100x100x100 8-bit array + int sz[] = {100, 100, 100}; + Mat bigCube(3, sz, CV_8U, Scalar::all(0)); +@endcode +It passes the number of dimensions =1 to the Mat constructor but the created array will be +2-dimensional with the number of columns set to 1. So, Mat::dims is always \>= 2 (can also be 0 +when the array is empty). + +- Use a copy constructor or assignment operator where there can be an array or expression on the +right side (see below). As noted in the introduction, the array assignment is an O(1) operation +because it only copies the header and increases the reference counter. The Mat::clone() method can +be used to get a full (deep) copy of the array when you need it. + +- Construct a header for a part of another array. It can be a single row, single column, several +rows, several columns, rectangular region in the array (called a *minor* in algebra) or a +diagonal. Such operations are also O(1) because the new header references the same data. You can +actually modify a part of the array using this feature, for example: +@code + // add the 5-th row, multiplied by 3 to the 3rd row + M.row(3) = M.row(3) + M.row(5)*3; + // now copy the 7-th column to the 1-st column + // M.col(1) = M.col(7); // this will not work + Mat M1 = M.col(1); + M.col(7).copyTo(M1); + // create a new 320x240 image + Mat img(Size(320,240),CV_8UC3); + // select a ROI + Mat roi(img, Rect(10,10,100,100)); + // fill the ROI with (0,255,0) (which is green in RGB space); + // the original 320x240 image will be modified + roi = Scalar(0,255,0); +@endcode +Due to the additional datastart and dataend members, it is possible to compute a relative +sub-array position in the main *container* array using locateROI(): +@code + Mat A = Mat::eye(10, 10, CV_32S); + // extracts A columns, 1 (inclusive) to 3 (exclusive). + Mat B = A(Range::all(), Range(1, 3)); + // extracts B rows, 5 (inclusive) to 9 (exclusive). + // that is, C \~ A(Range(5, 9), Range(1, 3)) + Mat C = B(Range(5, 9), Range::all()); + Size size; Point ofs; + C.locateROI(size, ofs); + // size will be (width=10,height=10) and the ofs will be (x=1, y=5) +@endcode +As in case of whole matrices, if you need a deep copy, use the `clone()` method of the extracted +sub-matrices. + +- Make a header for user-allocated data. It can be useful to do the following: + -# Process "foreign" data using OpenCV (for example, when you implement a DirectShow\* filter or + a processing module for gstreamer, and so on). For example: + @code + Mat process_video_frame(const unsigned char* pixels, + int width, int height, int step) + { + // wrap input buffer + Mat img(height, width, CV_8UC3, (unsigned char*)pixels, step); + + Mat result; + GaussianBlur(img, result, Size(7, 7), 1.5, 1.5); + + return result; + } + @endcode + -# Quickly initialize small matrices and/or get a super-fast element access. + @code + double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}}; + Mat M = Mat(3, 3, CV_64F, m).inv(); + @endcode + . + +- Use MATLAB-style array initializers, zeros(), ones(), eye(), for example: +@code + // create a double-precision identity matrix and add it to M. + M += Mat::eye(M.rows, M.cols, CV_64F); +@endcode + +- Use a comma-separated initializer: +@code + // create a 3x3 double-precision identity matrix + Mat M = (Mat_(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1); +@endcode +With this approach, you first call a constructor of the Mat class with the proper parameters, and +then you just put `<< operator` followed by comma-separated values that can be constants, +variables, expressions, and so on. Also, note the extra parentheses required to avoid compilation +errors. + +Once the array is created, it is automatically managed via a reference-counting mechanism. If the +array header is built on top of user-allocated data, you should handle the data by yourself. The +array data is deallocated when no one points to it. If you want to release the data pointed by a +array header before the array destructor is called, use Mat::release(). + +The next important thing to learn about the array class is element access. This manual already +described how to compute an address of each array element. Normally, you are not required to use the +formula directly in the code. If you know the array element type (which can be retrieved using the +method Mat::type() ), you can access the element \f$M_{ij}\f$ of a 2-dimensional array as: +@code + M.at(i,j) += 1.f; +@endcode +assuming that `M` is a double-precision floating-point array. There are several variants of the method +at for a different number of dimensions. + +If you need to process a whole row of a 2D array, the most efficient way is to get the pointer to +the row first, and then just use the plain C operator [] : +@code + // compute sum of positive matrix elements + // (assuming that M is a double-precision matrix) + double sum=0; + for(int i = 0; i < M.rows; i++) + { + const double* Mi = M.ptr(i); + for(int j = 0; j < M.cols; j++) + sum += std::max(Mi[j], 0.); + } +@endcode +Some operations, like the one above, do not actually depend on the array shape. They just process +elements of an array one by one (or elements from multiple arrays that have the same coordinates, +for example, array addition). Such operations are called *element-wise*. It makes sense to check +whether all the input/output arrays are continuous, namely, have no gaps at the end of each row. If +yes, process them as a long single row: +@code + // compute the sum of positive matrix elements, optimized variant + double sum=0; + int cols = M.cols, rows = M.rows; + if(M.isContinuous()) + { + cols *= rows; + rows = 1; + } + for(int i = 0; i < rows; i++) + { + const double* Mi = M.ptr(i); + for(int j = 0; j < cols; j++) + sum += std::max(Mi[j], 0.); + } +@endcode +In case of the continuous matrix, the outer loop body is executed just once. So, the overhead is +smaller, which is especially noticeable in case of small matrices. + +Finally, there are STL-style iterators that are smart enough to skip gaps between successive rows: +@code + // compute sum of positive matrix elements, iterator-based variant + double sum=0; + MatConstIterator_ it = M.begin(), it_end = M.end(); + for(; it != it_end; ++it) + sum += std::max(*it, 0.); +@endcode +The matrix iterators are random-access iterators, so they can be passed to any STL algorithm, +including std::sort(). + +@note Matrix Expressions and arithmetic see MatExpr +*/ +class CV_EXPORTS Mat +{ +public: + /** + These are various constructors that form a matrix. As noted in the AutomaticAllocation, often + the default constructor is enough, and the proper matrix will be allocated by an OpenCV function. + The constructed matrix can further be assigned to another matrix or matrix expression or can be + allocated with Mat::create . In the former case, the old content is de-referenced. + */ + Mat() CV_NOEXCEPT; + + /** @overload + @param rows Number of rows in a 2D array. + @param cols Number of columns in a 2D array. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + */ + Mat(int rows, int cols, int type); + + /** @overload + @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the + number of columns go in the reverse order. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + */ + Mat(Size size, int type); + + /** @overload + @param rows Number of rows in a 2D array. + @param cols Number of columns in a 2D array. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param s An optional value to initialize each matrix element with. To set all the matrix elements to + the particular value after the construction, use the assignment operator + Mat::operator=(const Scalar& value) . + */ + Mat(int rows, int cols, int type, const Scalar& s); + + /** @overload + @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the + number of columns go in the reverse order. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param s An optional value to initialize each matrix element with. To set all the matrix elements to + the particular value after the construction, use the assignment operator + Mat::operator=(const Scalar& value) . + */ + Mat(Size size, int type, const Scalar& s); + + /** @overload + @param ndims Array dimensionality. + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + */ + Mat(int ndims, const int* sizes, int type); + + /** @overload + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + */ + Mat(const std::vector& sizes, int type); + + /** @overload + @param ndims Array dimensionality. + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param s An optional value to initialize each matrix element with. To set all the matrix elements to + the particular value after the construction, use the assignment operator + Mat::operator=(const Scalar& value) . + */ + Mat(int ndims, const int* sizes, int type, const Scalar& s); + + /** @overload + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param s An optional value to initialize each matrix element with. To set all the matrix elements to + the particular value after the construction, use the assignment operator + Mat::operator=(const Scalar& value) . + */ + Mat(const std::vector& sizes, int type, const Scalar& s); + + + /** @overload + @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied + by these constructors. Instead, the header pointing to m data or its sub-array is constructed and + associated with it. The reference counter, if any, is incremented. So, when you modify the matrix + formed using such a constructor, you also modify the corresponding elements of m . If you want to + have an independent copy of the sub-array, use Mat::clone() . + */ + Mat(const Mat& m); + + /** @overload + @param rows Number of rows in a 2D array. + @param cols Number of columns in a 2D array. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param data Pointer to the user data. Matrix constructors that take data and step parameters do not + allocate matrix data. Instead, they just initialize the matrix header that points to the specified + data, which means that no data is copied. This operation is very efficient and can be used to + process external data using OpenCV functions. The external data is not automatically deallocated, so + you should take care of it. + @param step Number of bytes each matrix row occupies. The value should include the padding bytes at + the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed + and the actual step is calculated as cols*elemSize(). See Mat::elemSize. + */ + Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP); + + /** @overload + @param size 2D array size: Size(cols, rows) . In the Size() constructor, the number of rows and the + number of columns go in the reverse order. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param data Pointer to the user data. Matrix constructors that take data and step parameters do not + allocate matrix data. Instead, they just initialize the matrix header that points to the specified + data, which means that no data is copied. This operation is very efficient and can be used to + process external data using OpenCV functions. The external data is not automatically deallocated, so + you should take care of it. + @param step Number of bytes each matrix row occupies. The value should include the padding bytes at + the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed + and the actual step is calculated as cols*elemSize(). See Mat::elemSize. + */ + Mat(Size size, int type, void* data, size_t step=AUTO_STEP); + + /** @overload + @param ndims Array dimensionality. + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param data Pointer to the user data. Matrix constructors that take data and step parameters do not + allocate matrix data. Instead, they just initialize the matrix header that points to the specified + data, which means that no data is copied. This operation is very efficient and can be used to + process external data using OpenCV functions. The external data is not automatically deallocated, so + you should take care of it. + @param steps Array of ndims-1 steps in case of a multi-dimensional array (the last step is always + set to the element size). If not specified, the matrix is assumed to be continuous. + */ + Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0); + + /** @overload + @param sizes Array of integers specifying an n-dimensional array shape. + @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or + CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. + @param data Pointer to the user data. Matrix constructors that take data and step parameters do not + allocate matrix data. Instead, they just initialize the matrix header that points to the specified + data, which means that no data is copied. This operation is very efficient and can be used to + process external data using OpenCV functions. The external data is not automatically deallocated, so + you should take care of it. + @param steps Array of ndims-1 steps in case of a multi-dimensional array (the last step is always + set to the element size). If not specified, the matrix is assumed to be continuous. + */ + Mat(const std::vector& sizes, int type, void* data, const size_t* steps=0); + + /** @overload + @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied + by these constructors. Instead, the header pointing to m data or its sub-array is constructed and + associated with it. The reference counter, if any, is incremented. So, when you modify the matrix + formed using such a constructor, you also modify the corresponding elements of m . If you want to + have an independent copy of the sub-array, use Mat::clone() . + @param rowRange Range of the m rows to take. As usual, the range start is inclusive and the range + end is exclusive. Use Range::all() to take all the rows. + @param colRange Range of the m columns to take. Use Range::all() to take all the columns. + */ + Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all()); + + /** @overload + @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied + by these constructors. Instead, the header pointing to m data or its sub-array is constructed and + associated with it. The reference counter, if any, is incremented. So, when you modify the matrix + formed using such a constructor, you also modify the corresponding elements of m . If you want to + have an independent copy of the sub-array, use Mat::clone() . + @param roi Region of interest. + */ + Mat(const Mat& m, const Rect& roi); + + /** @overload + @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied + by these constructors. Instead, the header pointing to m data or its sub-array is constructed and + associated with it. The reference counter, if any, is incremented. So, when you modify the matrix + formed using such a constructor, you also modify the corresponding elements of m . If you want to + have an independent copy of the sub-array, use Mat::clone() . + @param ranges Array of selected ranges of m along each dimensionality. + */ + Mat(const Mat& m, const Range* ranges); + + /** @overload + @param m Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied + by these constructors. Instead, the header pointing to m data or its sub-array is constructed and + associated with it. The reference counter, if any, is incremented. So, when you modify the matrix + formed using such a constructor, you also modify the corresponding elements of m . If you want to + have an independent copy of the sub-array, use Mat::clone() . + @param ranges Array of selected ranges of m along each dimensionality. + */ + Mat(const Mat& m, const std::vector& ranges); + + /** @overload + @param vec STL vector whose elements form the matrix. The matrix has a single column and the number + of rows equal to the number of vector elements. Type of the matrix matches the type of vector + elements. The constructor can handle arbitrary types, for which there is a properly declared + DataType . This means that the vector elements must be primitive numbers or uni-type numerical + tuples of numbers. Mixed-type structures are not supported. The corresponding constructor is + explicit. Since STL vectors are not automatically converted to Mat instances, you should write + Mat(vec) explicitly. Unless you copy the data into the matrix ( copyData=true ), no new elements + will be added to the vector because it can potentially yield vector data reallocation, and, thus, + the matrix data pointer will be invalid. + @param copyData Flag to specify whether the underlying data of the STL vector should be copied + to (true) or shared with (false) the newly constructed matrix. When the data is copied, the + allocated buffer is managed using Mat reference counting mechanism. While the data is shared, + the reference counter is NULL, and you should not deallocate the data until the matrix is + destructed. + */ + template explicit Mat(const std::vector<_Tp>& vec, bool copyData=false); + + /** @overload + */ + template::value>::type> + explicit Mat(const std::initializer_list<_Tp> list); + + /** @overload + */ + template explicit Mat(const std::initializer_list sizes, const std::initializer_list<_Tp> list); + + /** @overload + */ + template explicit Mat(const std::array<_Tp, _Nm>& arr, bool copyData=false); + + /** @overload + */ + template explicit Mat(const Vec<_Tp, n>& vec, bool copyData=true); + + /** @overload + */ + template explicit Mat(const Matx<_Tp, m, n>& mtx, bool copyData=true); + + /** @overload + */ + template explicit Mat(const Point_<_Tp>& pt, bool copyData=true); + + /** @overload + */ + template explicit Mat(const Point3_<_Tp>& pt, bool copyData=true); + + /** @overload + */ + template explicit Mat(const MatCommaInitializer_<_Tp>& commaInitializer); + + //! download data from GpuMat + explicit Mat(const cuda::GpuMat& m); + + //! destructor - calls release() + ~Mat(); + + /** @brief assignment operators + + These are available assignment operators. Since they all are very different, make sure to read the + operator parameters description. + @param m Assigned, right-hand-side matrix. Matrix assignment is an O(1) operation. This means that + no data is copied but the data is shared and the reference counter, if any, is incremented. Before + assigning new data, the old data is de-referenced via Mat::release . + */ + Mat& operator = (const Mat& m); + + /** @overload + @param expr Assigned matrix expression object. As opposite to the first form of the assignment + operation, the second form can reuse already allocated matrix if it has the right size and type to + fit the matrix expression result. It is automatically handled by the real function that the matrix + expressions is expanded to. For example, C=A+B is expanded to add(A, B, C), and add takes care of + automatic C reallocation. + */ + Mat& operator = (const MatExpr& expr); + + //! retrieve UMat from Mat + UMat getUMat(AccessFlag accessFlags, UMatUsageFlags usageFlags = USAGE_DEFAULT) const; + + /** @brief Creates a matrix header for the specified matrix row. + + The method makes a new header for the specified matrix row and returns it. This is an O(1) + operation, regardless of the matrix size. The underlying data of the new matrix is shared with the + original matrix. Here is the example of one of the classical basic matrix processing operations, + axpy, used by LU and many other algorithms: + @code + inline void matrix_axpy(Mat& A, int i, int j, double alpha) + { + A.row(i) += A.row(j)*alpha; + } + @endcode + @note In the current implementation, the following code does not work as expected: + @code + Mat A; + ... + A.row(i) = A.row(j); // will not work + @endcode + This happens because A.row(i) forms a temporary header that is further assigned to another header. + Remember that each of these operations is O(1), that is, no data is copied. Thus, the above + assignment is not true if you may have expected the j-th row to be copied to the i-th row. To + achieve that, you should either turn this simple assignment into an expression or use the + Mat::copyTo method: + @code + Mat A; + ... + // works, but looks a bit obscure. + A.row(i) = A.row(j) + 0; + // this is a bit longer, but the recommended method. + A.row(j).copyTo(A.row(i)); + @endcode + @param y A 0-based row index. + */ + Mat row(int y) const; + + /** @brief Creates a matrix header for the specified matrix column. + + The method makes a new header for the specified matrix column and returns it. This is an O(1) + operation, regardless of the matrix size. The underlying data of the new matrix is shared with the + original matrix. See also the Mat::row description. + @param x A 0-based column index. + */ + Mat col(int x) const; + + /** @brief Creates a matrix header for the specified row span. + + The method makes a new header for the specified row span of the matrix. Similarly to Mat::row and + Mat::col , this is an O(1) operation. + @param startrow An inclusive 0-based start index of the row span. + @param endrow An exclusive 0-based ending index of the row span. + */ + Mat rowRange(int startrow, int endrow) const; + + /** @overload + @param r Range structure containing both the start and the end indices. + */ + Mat rowRange(const Range& r) const; + + /** @brief Creates a matrix header for the specified column span. + + The method makes a new header for the specified column span of the matrix. Similarly to Mat::row and + Mat::col , this is an O(1) operation. + @param startcol An inclusive 0-based start index of the column span. + @param endcol An exclusive 0-based ending index of the column span. + */ + Mat colRange(int startcol, int endcol) const; + + /** @overload + @param r Range structure containing both the start and the end indices. + */ + Mat colRange(const Range& r) const; + + /** @brief Extracts a diagonal from a matrix + + The method makes a new header for the specified matrix diagonal. The new matrix is represented as a + single-column matrix. Similarly to Mat::row and Mat::col, this is an O(1) operation. + @param d index of the diagonal, with the following values: + - `d=0` is the main diagonal. + - `d<0` is a diagonal from the lower half. For example, d=-1 means the diagonal is set + immediately below the main one. + - `d>0` is a diagonal from the upper half. For example, d=1 means the diagonal is set + immediately above the main one. + For example: + @code + Mat m = (Mat_(3,3) << + 1,2,3, + 4,5,6, + 7,8,9); + Mat d0 = m.diag(0); + Mat d1 = m.diag(1); + Mat d_1 = m.diag(-1); + @endcode + The resulting matrices are + @code + d0 = + [1; + 5; + 9] + d1 = + [2; + 6] + d_1 = + [4; + 8] + @endcode + */ + Mat diag(int d=0) const; + + /** @brief creates a diagonal matrix + + The method creates a square diagonal matrix from specified main diagonal. + @param d One-dimensional matrix that represents the main diagonal. + */ + CV_NODISCARD_STD static Mat diag(const Mat& d); + + /** @brief Creates a full copy of the array and the underlying data. + + The method creates a full copy of the array. The original step[] is not taken into account. So, the + array copy is a continuous array occupying total()*elemSize() bytes. + */ + CV_NODISCARD_STD Mat clone() const; + + /** @brief Copies the matrix to another one. + + The method copies the matrix data to another matrix. Before copying the data, the method invokes : + @code + m.create(this->size(), this->type()); + @endcode + so that the destination matrix is reallocated if needed. While m.copyTo(m); works flawlessly, the + function does not handle the case of a partial overlap between the source and the destination + matrices. + + When the operation mask is specified, if the Mat::create call shown above reallocates the matrix, + the newly allocated matrix is initialized with all zeros before copying the data. + @param m Destination matrix. If it does not have a proper size or type before the operation, it is + reallocated. + */ + void copyTo( OutputArray m ) const; + + /** @overload + @param m Destination matrix. If it does not have a proper size or type before the operation, it is + reallocated. + @param mask Operation mask of the same size as \*this. Its non-zero elements indicate which matrix + elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels. + */ + void copyTo( OutputArray m, InputArray mask ) const; + + /** @brief Converts an array to another data type with optional scaling. + + The method converts source pixel values to the target data type. saturate_cast\<\> is applied at + the end to avoid possible overflows: + + \f[m(x,y) = saturate \_ cast( \alpha (*this)(x,y) + \beta )\f] + @param m output matrix; if it does not have a proper size or type before the operation, it is + reallocated. + @param rtype desired output matrix type or, rather, the depth since the number of channels are the + same as the input has; if rtype is negative, the output matrix will have the same type as the input. + @param alpha optional scale factor. + @param beta optional delta added to the scaled values. + */ + void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const; + + /** @brief Provides a functional form of convertTo. + + This is an internally used method called by the @ref MatrixExpressions engine. + @param m Destination array. + @param type Desired destination array depth (or -1 if it should be the same as the source type). + */ + void assignTo( Mat& m, int type=-1 ) const; + + /** @brief Sets all or some of the array elements to the specified value. + @param s Assigned scalar converted to the actual array type. + */ + Mat& operator = (const Scalar& s); + + /** @brief Sets all or some of the array elements to the specified value. + + This is an advanced variant of the Mat::operator=(const Scalar& s) operator. + @param value Assigned scalar converted to the actual array type. + @param mask Operation mask of the same size as \*this. Its non-zero elements indicate which matrix + elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels + */ + Mat& setTo(InputArray value, InputArray mask=noArray()); + + /** @brief Changes the shape and/or the number of channels of a 2D matrix without copying the data. + + The method makes a new matrix header for \*this elements. The new matrix may have a different size + and/or different number of channels. Any combination is possible if: + - No extra elements are included into the new matrix and no elements are excluded. Consequently, + the product rows\*cols\*channels() must stay the same after the transformation. + - No data is copied. That is, this is an O(1) operation. Consequently, if you change the number of + rows, or the operation changes the indices of elements row in some other way, the matrix must be + continuous. See Mat::isContinuous . + + For example, if there is a set of 3D points stored as an STL vector, and you want to represent the + points as a 3xN matrix, do the following: + @code + std::vector vec; + ... + Mat pointMat = Mat(vec). // convert vector to Mat, O(1) operation + reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel. + // Also, an O(1) operation + t(); // finally, transpose the Nx3 matrix. + // This involves copying all the elements + @endcode + 3-channel 2x2 matrix reshaped to 1-channel 4x3 matrix, each column has values from one of original channels: + @code + Mat m(Size(2, 2), CV_8UC3, Scalar(1, 2, 3)); + vector new_shape {4, 3}; + m = m.reshape(1, new_shape); + @endcode + or: + @code + Mat m(Size(2, 2), CV_8UC3, Scalar(1, 2, 3)); + const int new_shape[] = {4, 3}; + m = m.reshape(1, 2, new_shape); + @endcode + @param cn New number of channels. If the parameter is 0, the number of channels remains the same. + @param rows New number of rows. If the parameter is 0, the number of rows remains the same. + */ + Mat reshape(int cn, int rows=0) const; + + /** @overload + * @param cn New number of channels. If the parameter is 0, the number of channels remains the same. + * @param newndims New number of dimentions. + * @param newsz Array with new matrix size by all dimentions. If some sizes are zero, + * the original sizes in those dimensions are presumed. + */ + Mat reshape(int cn, int newndims, const int* newsz) const; + + /** @overload + * @param cn New number of channels. If the parameter is 0, the number of channels remains the same. + * @param newshape Vector with new matrix size by all dimentions. If some sizes are zero, + * the original sizes in those dimensions are presumed. + */ + Mat reshape(int cn, const std::vector& newshape) const; + + /** @brief Transposes a matrix. + + The method performs matrix transposition by means of matrix expressions. It does not perform the + actual transposition but returns a temporary matrix transposition object that can be further used as + a part of more complex matrix expressions or can be assigned to a matrix: + @code + Mat A1 = A + Mat::eye(A.size(), A.type())*lambda; + Mat C = A1.t()*A1; // compute (A + lambda*I)^t * (A + lamda*I) + @endcode + */ + MatExpr t() const; + + /** @brief Inverses a matrix. + + The method performs a matrix inversion by means of matrix expressions. This means that a temporary + matrix inversion object is returned by the method and can be used further as a part of more complex + matrix expressions or can be assigned to a matrix. + @param method Matrix inversion method. One of cv::DecompTypes + */ + MatExpr inv(int method=DECOMP_LU) const; + + /** @brief Performs an element-wise multiplication or division of the two matrices. + + The method returns a temporary object encoding per-element array multiplication, with optional + scale. Note that this is not a matrix multiplication that corresponds to a simpler "\*" operator. + + Example: + @code + Mat C = A.mul(5/B); // equivalent to divide(A, B, C, 5) + @endcode + @param m Another array of the same type and the same size as \*this, or a matrix expression. + @param scale Optional scale factor. + */ + MatExpr mul(InputArray m, double scale=1) const; + + /** @brief Computes a cross-product of two 3-element vectors. + + The method computes a cross-product of two 3-element vectors. The vectors must be 3-element + floating-point vectors of the same shape and size. The result is another 3-element vector of the + same shape and type as operands. + @param m Another cross-product operand. + */ + Mat cross(InputArray m) const; + + /** @brief Computes a dot-product of two vectors. + + The method computes a dot-product of two matrices. If the matrices are not single-column or + single-row vectors, the top-to-bottom left-to-right scan ordering is used to treat them as 1D + vectors. The vectors must have the same size and type. If the matrices have more than one channel, + the dot products from all the channels are summed together. + @param m another dot-product operand. + */ + double dot(InputArray m) const; + + /** @brief Returns a zero array of the specified size and type. + + The method returns a Matlab-style zero array initializer. It can be used to quickly form a constant + array as a function parameter, part of a matrix expression, or as a matrix initializer: + @code + Mat A; + A = Mat::zeros(3, 3, CV_32F); + @endcode + In the example above, a new matrix is allocated only if A is not a 3x3 floating-point matrix. + Otherwise, the existing matrix A is filled with zeros. + @param rows Number of rows. + @param cols Number of columns. + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr zeros(int rows, int cols, int type); + + /** @overload + @param size Alternative to the matrix size specification Size(cols, rows) . + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr zeros(Size size, int type); + + /** @overload + @param ndims Array dimensionality. + @param sz Array of integers specifying the array shape. + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr zeros(int ndims, const int* sz, int type); + + /** @brief Returns an array of all 1's of the specified size and type. + + The method returns a Matlab-style 1's array initializer, similarly to Mat::zeros. Note that using + this method you can initialize an array with an arbitrary value, using the following Matlab idiom: + @code + Mat A = Mat::ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3. + @endcode + The above operation does not form a 100x100 matrix of 1's and then multiply it by 3. Instead, it + just remembers the scale factor (3 in this case) and use it when actually invoking the matrix + initializer. + @note In case of multi-channels type, only the first channel will be initialized with 1's, the + others will be set to 0's. + @param rows Number of rows. + @param cols Number of columns. + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr ones(int rows, int cols, int type); + + /** @overload + @param size Alternative to the matrix size specification Size(cols, rows) . + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr ones(Size size, int type); + + /** @overload + @param ndims Array dimensionality. + @param sz Array of integers specifying the array shape. + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr ones(int ndims, const int* sz, int type); + + /** @brief Returns an identity matrix of the specified size and type. + + The method returns a Matlab-style identity matrix initializer, similarly to Mat::zeros. Similarly to + Mat::ones, you can use a scale operation to create a scaled identity matrix efficiently: + @code + // make a 4x4 diagonal matrix with 0.1's on the diagonal. + Mat A = Mat::eye(4, 4, CV_32F)*0.1; + @endcode + @note In case of multi-channels type, identity matrix will be initialized only for the first channel, + the others will be set to 0's + @param rows Number of rows. + @param cols Number of columns. + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr eye(int rows, int cols, int type); + + /** @overload + @param size Alternative matrix size specification as Size(cols, rows) . + @param type Created matrix type. + */ + CV_NODISCARD_STD static MatExpr eye(Size size, int type); + + /** @brief Allocates new array data if needed. + + This is one of the key Mat methods. Most new-style OpenCV functions and methods that produce arrays + call this method for each output array. The method uses the following algorithm: + + -# If the current array shape and the type match the new ones, return immediately. Otherwise, + de-reference the previous data by calling Mat::release. + -# Initialize the new header. + -# Allocate the new data of total()\*elemSize() bytes. + -# Allocate the new, associated with the data, reference counter and set it to 1. + + Such a scheme makes the memory management robust and efficient at the same time and helps avoid + extra typing for you. This means that usually there is no need to explicitly allocate output arrays. + That is, instead of writing: + @code + Mat color; + ... + Mat gray(color.rows, color.cols, color.depth()); + cvtColor(color, gray, COLOR_BGR2GRAY); + @endcode + you can simply write: + @code + Mat color; + ... + Mat gray; + cvtColor(color, gray, COLOR_BGR2GRAY); + @endcode + because cvtColor, as well as the most of OpenCV functions, calls Mat::create() for the output array + internally. + @param rows New number of rows. + @param cols New number of columns. + @param type New matrix type. + */ + void create(int rows, int cols, int type); + + /** @overload + @param size Alternative new matrix size specification: Size(cols, rows) + @param type New matrix type. + */ + void create(Size size, int type); + + /** @overload + @param ndims New array dimensionality. + @param sizes Array of integers specifying a new array shape. + @param type New matrix type. + */ + void create(int ndims, const int* sizes, int type); + + /** @overload + @param sizes Array of integers specifying a new array shape. + @param type New matrix type. + */ + void create(const std::vector& sizes, int type); + + /** @brief Increments the reference counter. + + The method increments the reference counter associated with the matrix data. If the matrix header + points to an external data set (see Mat::Mat ), the reference counter is NULL, and the method has no + effect in this case. Normally, to avoid memory leaks, the method should not be called explicitly. It + is called implicitly by the matrix assignment operator. The reference counter increment is an atomic + operation on the platforms that support it. Thus, it is safe to operate on the same matrices + asynchronously in different threads. + */ + void addref(); + + /** @brief Decrements the reference counter and deallocates the matrix if needed. + + The method decrements the reference counter associated with the matrix data. When the reference + counter reaches 0, the matrix data is deallocated and the data and the reference counter pointers + are set to NULL's. If the matrix header points to an external data set (see Mat::Mat ), the + reference counter is NULL, and the method has no effect in this case. + + This method can be called manually to force the matrix data deallocation. But since this method is + automatically called in the destructor, or by any other method that changes the data pointer, it is + usually not needed. The reference counter decrement and check for 0 is an atomic operation on the + platforms that support it. Thus, it is safe to operate on the same matrices asynchronously in + different threads. + */ + void release(); + + //! internal use function, consider to use 'release' method instead; deallocates the matrix data + void deallocate(); + //! internal use function; properly re-allocates _size, _step arrays + void copySize(const Mat& m); + + /** @brief Reserves space for the certain number of rows. + + The method reserves space for sz rows. If the matrix already has enough space to store sz rows, + nothing happens. If the matrix is reallocated, the first Mat::rows rows are preserved. The method + emulates the corresponding method of the STL vector class. + @param sz Number of rows. + */ + void reserve(size_t sz); + + /** @brief Reserves space for the certain number of bytes. + + The method reserves space for sz bytes. If the matrix already has enough space to store sz bytes, + nothing happens. If matrix has to be reallocated its previous content could be lost. + @param sz Number of bytes. + */ + void reserveBuffer(size_t sz); + + /** @brief Changes the number of matrix rows. + + The methods change the number of matrix rows. If the matrix is reallocated, the first + min(Mat::rows, sz) rows are preserved. The methods emulate the corresponding methods of the STL + vector class. + @param sz New number of rows. + */ + void resize(size_t sz); + + /** @overload + @param sz New number of rows. + @param s Value assigned to the newly added elements. + */ + void resize(size_t sz, const Scalar& s); + + //! internal function + void push_back_(const void* elem); + + /** @brief Adds elements to the bottom of the matrix. + + The methods add one or more elements to the bottom of the matrix. They emulate the corresponding + method of the STL vector class. When elem is Mat , its type and the number of columns must be the + same as in the container matrix. + @param elem Added element(s). + */ + template void push_back(const _Tp& elem); + + /** @overload + @param elem Added element(s). + */ + template void push_back(const Mat_<_Tp>& elem); + + /** @overload + @param elem Added element(s). + */ + template void push_back(const std::vector<_Tp>& elem); + + /** @overload + @param m Added line(s). + */ + void push_back(const Mat& m); + + /** @brief Removes elements from the bottom of the matrix. + + The method removes one or more rows from the bottom of the matrix. + @param nelems Number of removed rows. If it is greater than the total number of rows, an exception + is thrown. + */ + void pop_back(size_t nelems=1); + + /** @brief Locates the matrix header within a parent matrix. + + After you extracted a submatrix from a matrix using Mat::row, Mat::col, Mat::rowRange, + Mat::colRange, and others, the resultant submatrix points just to the part of the original big + matrix. However, each submatrix contains information (represented by datastart and dataend + fields) that helps reconstruct the original matrix size and the position of the extracted + submatrix within the original matrix. The method locateROI does exactly that. + @param wholeSize Output parameter that contains the size of the whole matrix containing *this* + as a part. + @param ofs Output parameter that contains an offset of *this* inside the whole matrix. + */ + void locateROI( Size& wholeSize, Point& ofs ) const; + + /** @brief Adjusts a submatrix size and position within the parent matrix. + + The method is complimentary to Mat::locateROI . The typical use of these functions is to determine + the submatrix position within the parent matrix and then shift the position somehow. Typically, it + can be required for filtering operations when pixels outside of the ROI should be taken into + account. When all the method parameters are positive, the ROI needs to grow in all directions by the + specified amount, for example: + @code + A.adjustROI(2, 2, 2, 2); + @endcode + In this example, the matrix size is increased by 4 elements in each direction. The matrix is shifted + by 2 elements to the left and 2 elements up, which brings in all the necessary pixels for the + filtering with the 5x5 kernel. + + adjustROI forces the adjusted ROI to be inside of the parent matrix that is boundaries of the + adjusted ROI are constrained by boundaries of the parent matrix. For example, if the submatrix A is + located in the first row of a parent matrix and you called A.adjustROI(2, 2, 2, 2) then A will not + be increased in the upward direction. + + The function is used internally by the OpenCV filtering functions, like filter2D , morphological + operations, and so on. + @param dtop Shift of the top submatrix boundary upwards. + @param dbottom Shift of the bottom submatrix boundary downwards. + @param dleft Shift of the left submatrix boundary to the left. + @param dright Shift of the right submatrix boundary to the right. + @sa copyMakeBorder + */ + Mat& adjustROI( int dtop, int dbottom, int dleft, int dright ); + + /** @brief Extracts a rectangular submatrix. + + The operators make a new header for the specified sub-array of \*this . They are the most + generalized forms of Mat::row, Mat::col, Mat::rowRange, and Mat::colRange . For example, + `A(Range(0, 10), Range::all())` is equivalent to `A.rowRange(0, 10)`. Similarly to all of the above, + the operators are O(1) operations, that is, no matrix data is copied. + @param rowRange Start and end row of the extracted submatrix. The upper boundary is not included. To + select all the rows, use Range::all(). + @param colRange Start and end column of the extracted submatrix. The upper boundary is not included. + To select all the columns, use Range::all(). + */ + Mat operator()( Range rowRange, Range colRange ) const; + + /** @overload + @param roi Extracted submatrix specified as a rectangle. + */ + Mat operator()( const Rect& roi ) const; + + /** @overload + @param ranges Array of selected ranges along each array dimension. + */ + Mat operator()( const Range* ranges ) const; + + /** @overload + @param ranges Array of selected ranges along each array dimension. + */ + Mat operator()(const std::vector& ranges) const; + + template operator std::vector<_Tp>() const; + template operator Vec<_Tp, n>() const; + template operator Matx<_Tp, m, n>() const; + + template operator std::array<_Tp, _Nm>() const; + + /** @brief Reports whether the matrix is continuous or not. + + The method returns true if the matrix elements are stored continuously without gaps at the end of + each row. Otherwise, it returns false. Obviously, 1x1 or 1xN matrices are always continuous. + Matrices created with Mat::create are always continuous. But if you extract a part of the matrix + using Mat::col, Mat::diag, and so on, or constructed a matrix header for externally allocated data, + such matrices may no longer have this property. + + The continuity flag is stored as a bit in the Mat::flags field and is computed automatically when + you construct a matrix header. Thus, the continuity check is a very fast operation, though + theoretically it could be done as follows: + @code + // alternative implementation of Mat::isContinuous() + bool myCheckMatContinuity(const Mat& m) + { + //return (m.flags & Mat::CONTINUOUS_FLAG) != 0; + return m.rows == 1 || m.step == m.cols*m.elemSize(); + } + @endcode + The method is used in quite a few of OpenCV functions. The point is that element-wise operations + (such as arithmetic and logical operations, math functions, alpha blending, color space + transformations, and others) do not depend on the image geometry. Thus, if all the input and output + arrays are continuous, the functions can process them as very long single-row vectors. The example + below illustrates how an alpha-blending function can be implemented: + @code + template + void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst) + { + const float alpha_scale = (float)std::numeric_limits::max(), + inv_scale = 1.f/alpha_scale; + + CV_Assert( src1.type() == src2.type() && + src1.type() == CV_MAKETYPE(traits::Depth::value, 4) && + src1.size() == src2.size()); + Size size = src1.size(); + dst.create(size, src1.type()); + + // here is the idiom: check the arrays for continuity and, + // if this is the case, + // treat the arrays as 1D vectors + if( src1.isContinuous() && src2.isContinuous() && dst.isContinuous() ) + { + size.width *= size.height; + size.height = 1; + } + size.width *= 4; + + for( int i = 0; i < size.height; i++ ) + { + // when the arrays are continuous, + // the outer loop is executed only once + const T* ptr1 = src1.ptr(i); + const T* ptr2 = src2.ptr(i); + T* dptr = dst.ptr(i); + + for( int j = 0; j < size.width; j += 4 ) + { + float alpha = ptr1[j+3]*inv_scale, beta = ptr2[j+3]*inv_scale; + dptr[j] = saturate_cast(ptr1[j]*alpha + ptr2[j]*beta); + dptr[j+1] = saturate_cast(ptr1[j+1]*alpha + ptr2[j+1]*beta); + dptr[j+2] = saturate_cast(ptr1[j+2]*alpha + ptr2[j+2]*beta); + dptr[j+3] = saturate_cast((1 - (1-alpha)*(1-beta))*alpha_scale); + } + } + } + @endcode + This approach, while being very simple, can boost the performance of a simple element-operation by + 10-20 percents, especially if the image is rather small and the operation is quite simple. + + Another OpenCV idiom in this function, a call of Mat::create for the destination array, that + allocates the destination array unless it already has the proper size and type. And while the newly + allocated arrays are always continuous, you still need to check the destination array because + Mat::create does not always allocate a new matrix. + */ + bool isContinuous() const; + + //! returns true if the matrix is a submatrix of another matrix + bool isSubmatrix() const; + + /** @brief Returns the matrix element size in bytes. + + The method returns the matrix element size in bytes. For example, if the matrix type is CV_16SC3 , + the method returns 3\*sizeof(short) or 6. + */ + size_t elemSize() const; + + /** @brief Returns the size of each matrix element channel in bytes. + + The method returns the matrix element channel size in bytes, that is, it ignores the number of + channels. For example, if the matrix type is CV_16SC3 , the method returns sizeof(short) or 2. + */ + size_t elemSize1() const; + + /** @brief Returns the type of a matrix element. + + The method returns a matrix element type. This is an identifier compatible with the CvMat type + system, like CV_16SC3 or 16-bit signed 3-channel array, and so on. + */ + int type() const; + + /** @brief Returns the depth of a matrix element. + + The method returns the identifier of the matrix element depth (the type of each individual channel). + For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of + matrix types contains the following values: + - CV_8U - 8-bit unsigned integers ( 0..255 ) + - CV_8S - 8-bit signed integers ( -128..127 ) + - CV_16U - 16-bit unsigned integers ( 0..65535 ) + - CV_16S - 16-bit signed integers ( -32768..32767 ) + - CV_32S - 32-bit signed integers ( -2147483648..2147483647 ) + - CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN ) + - CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN ) + */ + int depth() const; + + /** @brief Returns the number of matrix channels. + + The method returns the number of matrix channels. + */ + int channels() const; + + /** @brief Returns a normalized step. + + The method returns a matrix step divided by Mat::elemSize1() . It can be useful to quickly access an + arbitrary matrix element. + */ + size_t step1(int i=0) const; + + /** @brief Returns true if the array has no elements. + + The method returns true if Mat::total() is 0 or if Mat::data is NULL. Because of pop_back() and + resize() methods `M.total() == 0` does not imply that `M.data == NULL`. + */ + bool empty() const; + + /** @brief Returns the total number of array elements. + + The method returns the number of array elements (a number of pixels if the array represents an + image). + */ + size_t total() const; + + /** @brief Returns the total number of array elements. + + The method returns the number of elements within a certain sub-array slice with startDim <= dim < endDim + */ + size_t total(int startDim, int endDim=INT_MAX) const; + + /** + * @param elemChannels Number of channels or number of columns the matrix should have. + * For a 2-D matrix, when the matrix has only 1 column, then it should have + * elemChannels channels; When the matrix has only 1 channel, + * then it should have elemChannels columns. + * For a 3-D matrix, it should have only one channel. Furthermore, + * if the number of planes is not one, then the number of rows + * within every plane has to be 1; if the number of rows within + * every plane is not 1, then the number of planes has to be 1. + * @param depth The depth the matrix should have. Set it to -1 when any depth is fine. + * @param requireContinuous Set it to true to require the matrix to be continuous + * @return -1 if the requirement is not satisfied. + * Otherwise, it returns the number of elements in the matrix. Note + * that an element may have multiple channels. + * + * The following code demonstrates its usage for a 2-d matrix: + * @snippet snippets/core_mat_checkVector.cpp example-2d + * + * The following code demonstrates its usage for a 3-d matrix: + * @snippet snippets/core_mat_checkVector.cpp example-3d + */ + int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const; + + /** @brief Returns a pointer to the specified matrix row. + + The methods return `uchar*` or typed pointer to the specified matrix row. See the sample in + Mat::isContinuous to know how to use these methods. + @param i0 A 0-based row index. + */ + uchar* ptr(int i0=0); + /** @overload */ + const uchar* ptr(int i0=0) const; + + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + uchar* ptr(int row, int col); + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + const uchar* ptr(int row, int col) const; + + /** @overload */ + uchar* ptr(int i0, int i1, int i2); + /** @overload */ + const uchar* ptr(int i0, int i1, int i2) const; + + /** @overload */ + uchar* ptr(const int* idx); + /** @overload */ + const uchar* ptr(const int* idx) const; + /** @overload */ + template uchar* ptr(const Vec& idx); + /** @overload */ + template const uchar* ptr(const Vec& idx) const; + + /** @overload */ + template _Tp* ptr(int i0=0); + /** @overload */ + template const _Tp* ptr(int i0=0) const; + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + template _Tp* ptr(int row, int col); + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + template const _Tp* ptr(int row, int col) const; + /** @overload */ + template _Tp* ptr(int i0, int i1, int i2); + /** @overload */ + template const _Tp* ptr(int i0, int i1, int i2) const; + /** @overload */ + template _Tp* ptr(const int* idx); + /** @overload */ + template const _Tp* ptr(const int* idx) const; + /** @overload */ + template _Tp* ptr(const Vec& idx); + /** @overload */ + template const _Tp* ptr(const Vec& idx) const; + + /** @brief Returns a reference to the specified array element. + + The template methods return a reference to the specified array element. For the sake of higher + performance, the index range checks are only performed in the Debug configuration. + + Note that the variants with a single index (i) can be used to access elements of single-row or + single-column 2-dimensional arrays. That is, if, for example, A is a 1 x N floating-point matrix and + B is an M x 1 integer matrix, you can simply write `A.at(k+4)` and `B.at(2*i+1)` + instead of `A.at(0,k+4)` and `B.at(2*i+1,0)`, respectively. + + The example below initializes a Hilbert matrix: + @code + Mat H(100, 100, CV_64F); + for(int i = 0; i < H.rows; i++) + for(int j = 0; j < H.cols; j++) + H.at(i,j)=1./(i+j+1); + @endcode + + Keep in mind that the size identifier used in the at operator cannot be chosen at random. It depends + on the image from which you are trying to retrieve the data. The table below gives a better insight in this: + - If matrix is of type `CV_8U` then use `Mat.at(y,x)`. + - If matrix is of type `CV_8S` then use `Mat.at(y,x)`. + - If matrix is of type `CV_16U` then use `Mat.at(y,x)`. + - If matrix is of type `CV_16S` then use `Mat.at(y,x)`. + - If matrix is of type `CV_32S` then use `Mat.at(y,x)`. + - If matrix is of type `CV_32F` then use `Mat.at(y,x)`. + - If matrix is of type `CV_64F` then use `Mat.at(y,x)`. + + @param i0 Index along the dimension 0 + */ + template _Tp& at(int i0=0); + /** @overload + @param i0 Index along the dimension 0 + */ + template const _Tp& at(int i0=0) const; + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + template _Tp& at(int row, int col); + /** @overload + @param row Index along the dimension 0 + @param col Index along the dimension 1 + */ + template const _Tp& at(int row, int col) const; + + /** @overload + @param i0 Index along the dimension 0 + @param i1 Index along the dimension 1 + @param i2 Index along the dimension 2 + */ + template _Tp& at(int i0, int i1, int i2); + /** @overload + @param i0 Index along the dimension 0 + @param i1 Index along the dimension 1 + @param i2 Index along the dimension 2 + */ + template const _Tp& at(int i0, int i1, int i2) const; + + /** @overload + @param idx Array of Mat::dims indices. + */ + template _Tp& at(const int* idx); + /** @overload + @param idx Array of Mat::dims indices. + */ + template const _Tp& at(const int* idx) const; + + /** @overload */ + template _Tp& at(const Vec& idx); + /** @overload */ + template const _Tp& at(const Vec& idx) const; + + /** @overload + special versions for 2D arrays (especially convenient for referencing image pixels) + @param pt Element position specified as Point(j,i) . + */ + template _Tp& at(Point pt); + /** @overload + special versions for 2D arrays (especially convenient for referencing image pixels) + @param pt Element position specified as Point(j,i) . + */ + template const _Tp& at(Point pt) const; + + /** @brief Returns the matrix iterator and sets it to the first matrix element. + + The methods return the matrix read-only or read-write iterators. The use of matrix iterators is very + similar to the use of bi-directional STL iterators. In the example below, the alpha blending + function is rewritten using the matrix iterators: + @code + template + void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst) + { + typedef Vec VT; + + const float alpha_scale = (float)std::numeric_limits::max(), + inv_scale = 1.f/alpha_scale; + + CV_Assert( src1.type() == src2.type() && + src1.type() == traits::Type::value && + src1.size() == src2.size()); + Size size = src1.size(); + dst.create(size, src1.type()); + + MatConstIterator_ it1 = src1.begin(), it1_end = src1.end(); + MatConstIterator_ it2 = src2.begin(); + MatIterator_ dst_it = dst.begin(); + + for( ; it1 != it1_end; ++it1, ++it2, ++dst_it ) + { + VT pix1 = *it1, pix2 = *it2; + float alpha = pix1[3]*inv_scale, beta = pix2[3]*inv_scale; + *dst_it = VT(saturate_cast(pix1[0]*alpha + pix2[0]*beta), + saturate_cast(pix1[1]*alpha + pix2[1]*beta), + saturate_cast(pix1[2]*alpha + pix2[2]*beta), + saturate_cast((1 - (1-alpha)*(1-beta))*alpha_scale)); + } + } + @endcode + */ + template MatIterator_<_Tp> begin(); + template MatConstIterator_<_Tp> begin() const; + + /** @brief Same as begin() but for inverse traversal + */ + template std::reverse_iterator> rbegin(); + template std::reverse_iterator> rbegin() const; + + /** @brief Returns the matrix iterator and sets it to the after-last matrix element. + + The methods return the matrix read-only or read-write iterators, set to the point following the last + matrix element. + */ + template MatIterator_<_Tp> end(); + template MatConstIterator_<_Tp> end() const; + + /** @brief Same as end() but for inverse traversal + */ + template std::reverse_iterator< MatIterator_<_Tp>> rend(); + template std::reverse_iterator< MatConstIterator_<_Tp>> rend() const; + + + /** @brief Runs the given functor over all matrix elements in parallel. + + The operation passed as argument has to be a function pointer, a function object or a lambda(C++11). + + Example 1. All of the operations below put 0xFF the first channel of all matrix elements: + @code + Mat image(1920, 1080, CV_8UC3); + typedef cv::Point3_ Pixel; + + // first. raw pointer access. + for (int r = 0; r < image.rows; ++r) { + Pixel* ptr = image.ptr(r, 0); + const Pixel* ptr_end = ptr + image.cols; + for (; ptr != ptr_end; ++ptr) { + ptr->x = 255; + } + } + + // Using MatIterator. (Simple but there are a Iterator's overhead) + for (Pixel &p : cv::Mat_(image)) { + p.x = 255; + } + + // Parallel execution with function object. + struct Operator { + void operator ()(Pixel &pixel, const int * position) { + pixel.x = 255; + } + }; + image.forEach(Operator()); + + // Parallel execution using C++11 lambda. + image.forEach([](Pixel &p, const int * position) -> void { + p.x = 255; + }); + @endcode + Example 2. Using the pixel's position: + @code + // Creating 3D matrix (255 x 255 x 255) typed uint8_t + // and initialize all elements by the value which equals elements position. + // i.e. pixels (x,y,z) = (1,2,3) is (b,g,r) = (1,2,3). + + int sizes[] = { 255, 255, 255 }; + typedef cv::Point3_ Pixel; + + Mat_ image = Mat::zeros(3, sizes, CV_8UC3); + + image.forEach([](Pixel& pixel, const int position[]) -> void { + pixel.x = position[0]; + pixel.y = position[1]; + pixel.z = position[2]; + }); + @endcode + */ + template void forEach(const Functor& operation); + /** @overload */ + template void forEach(const Functor& operation) const; + + Mat(Mat&& m); + Mat& operator = (Mat&& m); + + enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG }; + enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 }; + + /*! includes several bit-fields: + - the magic signature + - continuity flag + - depth + - number of channels + */ + int flags; + //! the matrix dimensionality, >= 2 + int dims; + //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions + int rows, cols; + //! pointer to the data + uchar* data; + + //! helper fields used in locateROI and adjustROI + const uchar* datastart; + const uchar* dataend; + const uchar* datalimit; + + //! custom allocator + MatAllocator* allocator; + //! and the standard allocator + static MatAllocator* getStdAllocator(); + static MatAllocator* getDefaultAllocator(); + static void setDefaultAllocator(MatAllocator* allocator); + + //! internal use method: updates the continuity flag + void updateContinuityFlag(); + + //! interaction with UMat + UMatData* u; + + MatSize size; + MatStep step; + +protected: + template void forEach_impl(const Functor& operation); +}; + + +///////////////////////////////// Mat_<_Tp> //////////////////////////////////// + +/** @brief Template matrix class derived from Mat + +@code{.cpp} + template class Mat_ : public Mat + { + public: + // ... some specific methods + // and + // no new extra fields + }; +@endcode +The class `Mat_<_Tp>` is a *thin* template wrapper on top of the Mat class. It does not have any +extra data fields. Nor this class nor Mat has any virtual methods. Thus, references or pointers to +these two classes can be freely but carefully converted one to another. For example: +@code{.cpp} + // create a 100x100 8-bit matrix + Mat M(100,100,CV_8U); + // this will be compiled fine. no any data conversion will be done. + Mat_& M1 = (Mat_&)M; + // the program is likely to crash at the statement below + M1(99,99) = 1.f; +@endcode +While Mat is sufficient in most cases, Mat_ can be more convenient if you use a lot of element +access operations and if you know matrix type at the compilation time. Note that +`Mat::at(int y,int x)` and `Mat_::operator()(int y,int x)` do absolutely the same +and run at the same speed, but the latter is certainly shorter: +@code{.cpp} + Mat_ M(20,20); + for(int i = 0; i < M.rows; i++) + for(int j = 0; j < M.cols; j++) + M(i,j) = 1./(i+j+1); + Mat E, V; + eigen(M,E,V); + cout << E.at(0,0)/E.at(M.rows-1,0); +@endcode +To use Mat_ for multi-channel images/matrices, pass Vec as a Mat_ parameter: +@code{.cpp} + // allocate a 320x240 color image and fill it with green (in RGB space) + Mat_ img(240, 320, Vec3b(0,255,0)); + // now draw a diagonal white line + for(int i = 0; i < 100; i++) + img(i,i)=Vec3b(255,255,255); + // and now scramble the 2nd (red) channel of each pixel + for(int i = 0; i < img.rows; i++) + for(int j = 0; j < img.cols; j++) + img(i,j)[2] ^= (uchar)(i ^ j); +@endcode +Mat_ is fully compatible with C++11 range-based for loop. For example such loop +can be used to safely apply look-up table: +@code{.cpp} +void applyTable(Mat_& I, const uchar* const table) +{ + for(auto& pixel : I) + { + pixel = table[pixel]; + } +} +@endcode + */ +template class Mat_ : public Mat +{ +public: + typedef _Tp value_type; + typedef typename DataType<_Tp>::channel_type channel_type; + typedef MatIterator_<_Tp> iterator; + typedef MatConstIterator_<_Tp> const_iterator; + + //! default constructor + Mat_() CV_NOEXCEPT; + //! equivalent to Mat(_rows, _cols, DataType<_Tp>::type) + Mat_(int _rows, int _cols); + //! constructor that sets each matrix element to specified value + Mat_(int _rows, int _cols, const _Tp& value); + //! equivalent to Mat(_size, DataType<_Tp>::type) + explicit Mat_(Size _size); + //! constructor that sets each matrix element to specified value + Mat_(Size _size, const _Tp& value); + //! n-dim array constructor + Mat_(int _ndims, const int* _sizes); + //! n-dim array constructor that sets each matrix element to specified value + Mat_(int _ndims, const int* _sizes, const _Tp& value); + //! copy/conversion constructor. If m is of different type, it's converted + Mat_(const Mat& m); + //! copy constructor + Mat_(const Mat_& m); + //! constructs a matrix on top of user-allocated data. step is in bytes(!!!), regardless of the type + Mat_(int _rows, int _cols, _Tp* _data, size_t _step=AUTO_STEP); + //! constructs n-dim matrix on top of user-allocated data. steps are in bytes(!!!), regardless of the type + Mat_(int _ndims, const int* _sizes, _Tp* _data, const size_t* _steps=0); + //! selects a submatrix + Mat_(const Mat_& m, const Range& rowRange, const Range& colRange=Range::all()); + //! selects a submatrix + Mat_(const Mat_& m, const Rect& roi); + //! selects a submatrix, n-dim version + Mat_(const Mat_& m, const Range* ranges); + //! selects a submatrix, n-dim version + Mat_(const Mat_& m, const std::vector& ranges); + //! from a matrix expression + explicit Mat_(const MatExpr& e); + //! makes a matrix out of Vec, std::vector, Point_ or Point3_. The matrix will have a single column + explicit Mat_(const std::vector<_Tp>& vec, bool copyData=false); + template explicit Mat_(const Vec::channel_type, n>& vec, bool copyData=true); + template explicit Mat_(const Matx::channel_type, m, n>& mtx, bool copyData=true); + explicit Mat_(const Point_::channel_type>& pt, bool copyData=true); + explicit Mat_(const Point3_::channel_type>& pt, bool copyData=true); + explicit Mat_(const MatCommaInitializer_<_Tp>& commaInitializer); + + Mat_(std::initializer_list<_Tp> values); + explicit Mat_(const std::initializer_list sizes, const std::initializer_list<_Tp> values); + + template explicit Mat_(const std::array<_Tp, _Nm>& arr, bool copyData=false); + + Mat_& operator = (const Mat& m); + Mat_& operator = (const Mat_& m); + //! set all the elements to s. + Mat_& operator = (const _Tp& s); + //! assign a matrix expression + Mat_& operator = (const MatExpr& e); + + //! iterators; they are smart enough to skip gaps in the end of rows + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + //reverse iterators + std::reverse_iterator rbegin(); + std::reverse_iterator rend(); + std::reverse_iterator rbegin() const; + std::reverse_iterator rend() const; + + //! template methods for operation over all matrix elements. + // the operations take care of skipping gaps in the end of rows (if any) + template void forEach(const Functor& operation); + template void forEach(const Functor& operation) const; + + //! equivalent to Mat::create(_rows, _cols, DataType<_Tp>::type) + void create(int _rows, int _cols); + //! equivalent to Mat::create(_size, DataType<_Tp>::type) + void create(Size _size); + //! equivalent to Mat::create(_ndims, _sizes, DatType<_Tp>::type) + void create(int _ndims, const int* _sizes); + //! equivalent to Mat::release() + void release(); + //! cross-product + Mat_ cross(const Mat_& m) const; + //! data type conversion + template operator Mat_() const; + //! overridden forms of Mat::row() etc. + Mat_ row(int y) const; + Mat_ col(int x) const; + Mat_ diag(int d=0) const; + CV_NODISCARD_STD Mat_ clone() const; + + //! overridden forms of Mat::elemSize() etc. + size_t elemSize() const; + size_t elemSize1() const; + int type() const; + int depth() const; + int channels() const; + size_t step1(int i=0) const; + //! returns step()/sizeof(_Tp) + size_t stepT(int i=0) const; + + //! overridden forms of Mat::zeros() etc. Data type is omitted, of course + CV_NODISCARD_STD static MatExpr zeros(int rows, int cols); + CV_NODISCARD_STD static MatExpr zeros(Size size); + CV_NODISCARD_STD static MatExpr zeros(int _ndims, const int* _sizes); + CV_NODISCARD_STD static MatExpr ones(int rows, int cols); + CV_NODISCARD_STD static MatExpr ones(Size size); + CV_NODISCARD_STD static MatExpr ones(int _ndims, const int* _sizes); + CV_NODISCARD_STD static MatExpr eye(int rows, int cols); + CV_NODISCARD_STD static MatExpr eye(Size size); + + //! some more overridden methods + Mat_& adjustROI( int dtop, int dbottom, int dleft, int dright ); + Mat_ operator()( const Range& rowRange, const Range& colRange ) const; + Mat_ operator()( const Rect& roi ) const; + Mat_ operator()( const Range* ranges ) const; + Mat_ operator()(const std::vector& ranges) const; + + //! more convenient forms of row and element access operators + _Tp* operator [](int y); + const _Tp* operator [](int y) const; + + //! returns reference to the specified element + _Tp& operator ()(const int* idx); + //! returns read-only reference to the specified element + const _Tp& operator ()(const int* idx) const; + + //! returns reference to the specified element + template _Tp& operator ()(const Vec& idx); + //! returns read-only reference to the specified element + template const _Tp& operator ()(const Vec& idx) const; + + //! returns reference to the specified element (1D case) + _Tp& operator ()(int idx0); + //! returns read-only reference to the specified element (1D case) + const _Tp& operator ()(int idx0) const; + //! returns reference to the specified element (2D case) + _Tp& operator ()(int row, int col); + //! returns read-only reference to the specified element (2D case) + const _Tp& operator ()(int row, int col) const; + //! returns reference to the specified element (3D case) + _Tp& operator ()(int idx0, int idx1, int idx2); + //! returns read-only reference to the specified element (3D case) + const _Tp& operator ()(int idx0, int idx1, int idx2) const; + + _Tp& operator ()(Point pt); + const _Tp& operator ()(Point pt) const; + + //! conversion to vector. + operator std::vector<_Tp>() const; + + //! conversion to array. + template operator std::array<_Tp, _Nm>() const; + + //! conversion to Vec + template operator Vec::channel_type, n>() const; + //! conversion to Matx + template operator Matx::channel_type, m, n>() const; + + Mat_(Mat_&& m); + Mat_& operator = (Mat_&& m); + + Mat_(Mat&& m); + Mat_& operator = (Mat&& m); + + Mat_(MatExpr&& e); +}; + +typedef Mat_ Mat1b; +typedef Mat_ Mat2b; +typedef Mat_ Mat3b; +typedef Mat_ Mat4b; + +typedef Mat_ Mat1s; +typedef Mat_ Mat2s; +typedef Mat_ Mat3s; +typedef Mat_ Mat4s; + +typedef Mat_ Mat1w; +typedef Mat_ Mat2w; +typedef Mat_ Mat3w; +typedef Mat_ Mat4w; + +typedef Mat_ Mat1i; +typedef Mat_ Mat2i; +typedef Mat_ Mat3i; +typedef Mat_ Mat4i; + +typedef Mat_ Mat1f; +typedef Mat_ Mat2f; +typedef Mat_ Mat3f; +typedef Mat_ Mat4f; + +typedef Mat_ Mat1d; +typedef Mat_ Mat2d; +typedef Mat_ Mat3d; +typedef Mat_ Mat4d; + +/** @todo document */ +class CV_EXPORTS UMat +{ +public: + //! default constructor + UMat(UMatUsageFlags usageFlags = USAGE_DEFAULT) CV_NOEXCEPT; + //! constructs 2D matrix of the specified size and type + // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.) + UMat(int rows, int cols, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + UMat(Size size, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + //! constructs 2D matrix and fills it with the specified value _s. + UMat(int rows, int cols, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT); + UMat(Size size, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT); + + //! constructs n-dimensional matrix + UMat(int ndims, const int* sizes, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + UMat(int ndims, const int* sizes, int type, const Scalar& s, UMatUsageFlags usageFlags = USAGE_DEFAULT); + + //! copy constructor + UMat(const UMat& m); + + //! creates a matrix header for a part of the bigger matrix + UMat(const UMat& m, const Range& rowRange, const Range& colRange=Range::all()); + UMat(const UMat& m, const Rect& roi); + UMat(const UMat& m, const Range* ranges); + UMat(const UMat& m, const std::vector& ranges); + + // FIXIT copyData=false is not implemented, drop this in favor of cv::Mat (OpenCV 5.0) + //! builds matrix from std::vector with or without copying the data + template explicit UMat(const std::vector<_Tp>& vec, bool copyData=false); + + //! destructor - calls release() + ~UMat(); + //! assignment operators + UMat& operator = (const UMat& m); + + Mat getMat(AccessFlag flags) const; + + //! returns a new matrix header for the specified row + UMat row(int y) const; + //! returns a new matrix header for the specified column + UMat col(int x) const; + //! ... for the specified row span + UMat rowRange(int startrow, int endrow) const; + UMat rowRange(const Range& r) const; + //! ... for the specified column span + UMat colRange(int startcol, int endcol) const; + UMat colRange(const Range& r) const; + //! ... for the specified diagonal + //! (d=0 - the main diagonal, + //! >0 - a diagonal from the upper half, + //! <0 - a diagonal from the lower half) + UMat diag(int d=0) const; + //! constructs a square diagonal matrix which main diagonal is vector "d" + CV_NODISCARD_STD static UMat diag(const UMat& d, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat diag(const UMat& d) { return diag(d, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + + //! returns deep copy of the matrix, i.e. the data is copied + CV_NODISCARD_STD UMat clone() const; + //! copies the matrix content to "m". + // It calls m.create(this->size(), this->type()). + void copyTo( OutputArray m ) const; + //! copies those matrix elements to "m" that are marked with non-zero mask elements. + void copyTo( OutputArray m, InputArray mask ) const; + //! converts matrix to another datatype with optional scaling. See cvConvertScale. + void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const; + + void assignTo( UMat& m, int type=-1 ) const; + + //! sets every matrix element to s + UMat& operator = (const Scalar& s); + //! sets some of the matrix elements to s, according to the mask + UMat& setTo(InputArray value, InputArray mask=noArray()); + //! creates alternative matrix header for the same data, with different + // number of channels and/or different number of rows. see cvReshape. + UMat reshape(int cn, int rows=0) const; + UMat reshape(int cn, int newndims, const int* newsz) const; + + //! matrix transposition by means of matrix expressions + UMat t() const; + //! matrix inversion by means of matrix expressions + UMat inv(int method=DECOMP_LU) const; + //! per-element matrix multiplication by means of matrix expressions + UMat mul(InputArray m, double scale=1) const; + + //! computes dot-product + double dot(InputArray m) const; + + //! Matlab-style matrix initialization + CV_NODISCARD_STD static UMat zeros(int rows, int cols, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat zeros(Size size, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat zeros(int ndims, const int* sz, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat zeros(int rows, int cols, int type) { return zeros(rows, cols, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat zeros(Size size, int type) { return zeros(size, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat zeros(int ndims, const int* sz, int type) { return zeros(ndims, sz, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat ones(int rows, int cols, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat ones(Size size, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat ones(int ndims, const int* sz, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat ones(int rows, int cols, int type) { return ones(rows, cols, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat ones(Size size, int type) { return ones(size, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat ones(int ndims, const int* sz, int type) { return ones(ndims, sz, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat eye(int rows, int cols, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat eye(Size size, int type, UMatUsageFlags usageFlags /*= USAGE_DEFAULT*/); + CV_NODISCARD_STD static UMat eye(int rows, int cols, int type) { return eye(rows, cols, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + CV_NODISCARD_STD static UMat eye(Size size, int type) { return eye(size, type, USAGE_DEFAULT); } // OpenCV 5.0: remove abi compatibility overload + + //! allocates new matrix data unless the matrix already has specified size and type. + // previous data is unreferenced if needed. + void create(int rows, int cols, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + void create(Size size, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + void create(int ndims, const int* sizes, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + void create(const std::vector& sizes, int type, UMatUsageFlags usageFlags = USAGE_DEFAULT); + + //! increases the reference counter; use with care to avoid memleaks + void addref(); + //! decreases reference counter; + // deallocates the data when reference counter reaches 0. + void release(); + + //! deallocates the matrix data + void deallocate(); + //! internal use function; properly re-allocates _size, _step arrays + void copySize(const UMat& m); + + //! locates matrix header within a parent matrix. See below + void locateROI( Size& wholeSize, Point& ofs ) const; + //! moves/resizes the current matrix ROI inside the parent matrix. + UMat& adjustROI( int dtop, int dbottom, int dleft, int dright ); + //! extracts a rectangular sub-matrix + // (this is a generalized form of row, rowRange etc.) + UMat operator()( Range rowRange, Range colRange ) const; + UMat operator()( const Rect& roi ) const; + UMat operator()( const Range* ranges ) const; + UMat operator()(const std::vector& ranges) const; + + //! returns true iff the matrix data is continuous + // (i.e. when there are no gaps between successive rows). + // similar to CV_IS_MAT_CONT(cvmat->type) + bool isContinuous() const; + + //! returns true if the matrix is a submatrix of another matrix + bool isSubmatrix() const; + + //! returns element size in bytes, + // similar to CV_ELEM_SIZE(cvmat->type) + size_t elemSize() const; + //! returns the size of element channel in bytes. + size_t elemSize1() const; + //! returns element type, similar to CV_MAT_TYPE(cvmat->type) + int type() const; + //! returns element type, similar to CV_MAT_DEPTH(cvmat->type) + int depth() const; + //! returns element type, similar to CV_MAT_CN(cvmat->type) + int channels() const; + //! returns step/elemSize1() + size_t step1(int i=0) const; + //! returns true if matrix data is NULL + bool empty() const; + //! returns the total number of matrix elements + size_t total() const; + + //! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise + int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const; + + UMat(UMat&& m); + UMat& operator = (UMat&& m); + + /*! Returns the OpenCL buffer handle on which UMat operates on. + The UMat instance should be kept alive during the use of the handle to prevent the buffer to be + returned to the OpenCV buffer pool. + */ + void* handle(AccessFlag accessFlags) const; + void ndoffset(size_t* ofs) const; + + enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG }; + enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 }; + + /*! includes several bit-fields: + - the magic signature + - continuity flag + - depth + - number of channels + */ + int flags; + + //! the matrix dimensionality, >= 2 + int dims; + + //! number of rows in the matrix; -1 when the matrix has more than 2 dimensions + int rows; + + //! number of columns in the matrix; -1 when the matrix has more than 2 dimensions + int cols; + + //! custom allocator + MatAllocator* allocator; + + //! usage flags for allocator; recommend do not set directly, instead set during construct/create/getUMat + UMatUsageFlags usageFlags; + + //! and the standard allocator + static MatAllocator* getStdAllocator(); + + //! internal use method: updates the continuity flag + void updateContinuityFlag(); + + //! black-box container of UMat data + UMatData* u; + + //! offset of the submatrix (or 0) + size_t offset; + + //! dimensional size of the matrix; accessible in various formats + MatSize size; + + //! number of bytes each matrix element/row/plane/dimension occupies + MatStep step; + +protected: +}; + + +/////////////////////////// multi-dimensional sparse matrix ////////////////////////// + +/** @brief The class SparseMat represents multi-dimensional sparse numerical arrays. + +Such a sparse array can store elements of any type that Mat can store. *Sparse* means that only +non-zero elements are stored (though, as a result of operations on a sparse matrix, some of its +stored elements can actually become 0. It is up to you to detect such elements and delete them +using SparseMat::erase ). The non-zero elements are stored in a hash table that grows when it is +filled so that the search time is O(1) in average (regardless of whether element is there or not). +Elements can be accessed using the following methods: +- Query operations (SparseMat::ptr and the higher-level SparseMat::ref, SparseMat::value and + SparseMat::find), for example: + @code + const int dims = 5; + int size[5] = {10, 10, 10, 10, 10}; + SparseMat sparse_mat(dims, size, CV_32F); + for(int i = 0; i < 1000; i++) + { + int idx[dims]; + for(int k = 0; k < dims; k++) + idx[k] = rand() % size[k]; + sparse_mat.ref(idx) += 1.f; + } + cout << "nnz = " << sparse_mat.nzcount() << endl; + @endcode +- Sparse matrix iterators. They are similar to MatIterator but different from NAryMatIterator. + That is, the iteration loop is familiar to STL users: + @code + // prints elements of a sparse floating-point matrix + // and the sum of elements. + SparseMatConstIterator_ + it = sparse_mat.begin(), + it_end = sparse_mat.end(); + double s = 0; + int dims = sparse_mat.dims(); + for(; it != it_end; ++it) + { + // print element indices and the element value + const SparseMat::Node* n = it.node(); + printf("("); + for(int i = 0; i < dims; i++) + printf("%d%s", n->idx[i], i < dims-1 ? ", " : ")"); + printf(": %g\n", it.value()); + s += *it; + } + printf("Element sum is %g\n", s); + @endcode + If you run this loop, you will notice that elements are not enumerated in a logical order + (lexicographical, and so on). They come in the same order as they are stored in the hash table + (semi-randomly). You may collect pointers to the nodes and sort them to get the proper ordering. + Note, however, that pointers to the nodes may become invalid when you add more elements to the + matrix. This may happen due to possible buffer reallocation. +- Combination of the above 2 methods when you need to process 2 or more sparse matrices + simultaneously. For example, this is how you can compute unnormalized cross-correlation of the 2 + floating-point sparse matrices: + @code + double cross_corr(const SparseMat& a, const SparseMat& b) + { + const SparseMat *_a = &a, *_b = &b; + // if b contains less elements than a, + // it is faster to iterate through b + if(_a->nzcount() > _b->nzcount()) + std::swap(_a, _b); + SparseMatConstIterator_ it = _a->begin(), + it_end = _a->end(); + double ccorr = 0; + for(; it != it_end; ++it) + { + // take the next element from the first matrix + float avalue = *it; + const Node* anode = it.node(); + // and try to find an element with the same index in the second matrix. + // since the hash value depends only on the element index, + // reuse the hash value stored in the node + float bvalue = _b->value(anode->idx,&anode->hashval); + ccorr += avalue*bvalue; + } + return ccorr; + } + @endcode + */ +class CV_EXPORTS SparseMat +{ +public: + typedef SparseMatIterator iterator; + typedef SparseMatConstIterator const_iterator; + + enum { MAGIC_VAL=0x42FD0000, MAX_DIM=32, HASH_SCALE=0x5bd1e995, HASH_BIT=0x80000000 }; + + //! the sparse matrix header + struct CV_EXPORTS Hdr + { + Hdr(int _dims, const int* _sizes, int _type); + void clear(); + int refcount; + int dims; + int valueOffset; + size_t nodeSize; + size_t nodeCount; + size_t freeList; + std::vector pool; + std::vector hashtab; + int size[MAX_DIM]; + }; + + //! sparse matrix node - element of a hash table + struct CV_EXPORTS Node + { + //! hash value + size_t hashval; + //! index of the next node in the same hash table entry + size_t next; + //! index of the matrix element + int idx[MAX_DIM]; + }; + + /** @brief Various SparseMat constructors. + */ + SparseMat(); + + /** @overload + @param dims Array dimensionality. + @param _sizes Sparce matrix size on all dementions. + @param _type Sparse matrix data type. + */ + SparseMat(int dims, const int* _sizes, int _type); + + /** @overload + @param m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted + to sparse representation. + */ + SparseMat(const SparseMat& m); + + /** @overload + @param m Source matrix for copy constructor. If m is dense matrix (ocvMat) then it will be converted + to sparse representation. + */ + explicit SparseMat(const Mat& m); + + //! the destructor + ~SparseMat(); + + //! assignment operator. This is O(1) operation, i.e. no data is copied + SparseMat& operator = (const SparseMat& m); + //! equivalent to the corresponding constructor + SparseMat& operator = (const Mat& m); + + //! creates full copy of the matrix + CV_NODISCARD_STD SparseMat clone() const; + + //! copies all the data to the destination matrix. All the previous content of m is erased + void copyTo( SparseMat& m ) const; + //! converts sparse matrix to dense matrix. + void copyTo( Mat& m ) const; + //! multiplies all the matrix elements by the specified scale factor alpha and converts the results to the specified data type + void convertTo( SparseMat& m, int rtype, double alpha=1 ) const; + //! converts sparse matrix to dense n-dim matrix with optional type conversion and scaling. + /*! + @param [out] m - output matrix; if it does not have a proper size or type before the operation, + it is reallocated + @param [in] rtype - desired output matrix type or, rather, the depth since the number of channels + are the same as the input has; if rtype is negative, the output matrix will have the + same type as the input. + @param [in] alpha - optional scale factor + @param [in] beta - optional delta added to the scaled values + */ + void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const; + + // not used now + void assignTo( SparseMat& m, int type=-1 ) const; + + //! reallocates sparse matrix. + /*! + If the matrix already had the proper size and type, + it is simply cleared with clear(), otherwise, + the old matrix is released (using release()) and the new one is allocated. + */ + void create(int dims, const int* _sizes, int _type); + //! sets all the sparse matrix elements to 0, which means clearing the hash table. + void clear(); + //! manually increments the reference counter to the header. + void addref(); + // decrements the header reference counter. When the counter reaches 0, the header and all the underlying data are deallocated. + void release(); + + //! converts sparse matrix to the old-style representation; all the elements are copied. + //operator CvSparseMat*() const; + //! returns the size of each element in bytes (not including the overhead - the space occupied by SparseMat::Node elements) + size_t elemSize() const; + //! returns elemSize()/channels() + size_t elemSize1() const; + + //! returns type of sparse matrix elements + int type() const; + //! returns the depth of sparse matrix elements + int depth() const; + //! returns the number of channels + int channels() const; + + //! returns the array of sizes, or NULL if the matrix is not allocated + const int* size() const; + //! returns the size of i-th matrix dimension (or 0) + int size(int i) const; + //! returns the matrix dimensionality + int dims() const; + //! returns the number of non-zero elements (=the number of hash table nodes) + size_t nzcount() const; + + //! computes the element hash value (1D case) + size_t hash(int i0) const; + //! computes the element hash value (2D case) + size_t hash(int i0, int i1) const; + //! computes the element hash value (3D case) + size_t hash(int i0, int i1, int i2) const; + //! computes the element hash value (nD case) + size_t hash(const int* idx) const; + + //!@{ + /*! + specialized variants for 1D, 2D, 3D cases and the generic_type one for n-D case. + return pointer to the matrix element. + - if the element is there (it's non-zero), the pointer to it is returned + - if it's not there and createMissing=false, NULL pointer is returned + - if it's not there and createMissing=true, then the new element + is created and initialized with 0. Pointer to it is returned + - if the optional hashval pointer is not NULL, the element hash value is + not computed, but *hashval is taken instead. + */ + //! returns pointer to the specified element (1D case) + uchar* ptr(int i0, bool createMissing, size_t* hashval=0); + //! returns pointer to the specified element (2D case) + uchar* ptr(int i0, int i1, bool createMissing, size_t* hashval=0); + //! returns pointer to the specified element (3D case) + uchar* ptr(int i0, int i1, int i2, bool createMissing, size_t* hashval=0); + //! returns pointer to the specified element (nD case) + uchar* ptr(const int* idx, bool createMissing, size_t* hashval=0); + //!@} + + //!@{ + /*! + return read-write reference to the specified sparse matrix element. + + `ref<_Tp>(i0,...[,hashval])` is equivalent to `*(_Tp*)ptr(i0,...,true[,hashval])`. + The methods always return a valid reference. + If the element did not exist, it is created and initialized with 0. + */ + //! returns reference to the specified element (1D case) + template _Tp& ref(int i0, size_t* hashval=0); + //! returns reference to the specified element (2D case) + template _Tp& ref(int i0, int i1, size_t* hashval=0); + //! returns reference to the specified element (3D case) + template _Tp& ref(int i0, int i1, int i2, size_t* hashval=0); + //! returns reference to the specified element (nD case) + template _Tp& ref(const int* idx, size_t* hashval=0); + //!@} + + //!@{ + /*! + return value of the specified sparse matrix element. + + `value<_Tp>(i0,...[,hashval])` is equivalent to + @code + { const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); } + @endcode + + That is, if the element did not exist, the methods return 0. + */ + //! returns value of the specified element (1D case) + template _Tp value(int i0, size_t* hashval=0) const; + //! returns value of the specified element (2D case) + template _Tp value(int i0, int i1, size_t* hashval=0) const; + //! returns value of the specified element (3D case) + template _Tp value(int i0, int i1, int i2, size_t* hashval=0) const; + //! returns value of the specified element (nD case) + template _Tp value(const int* idx, size_t* hashval=0) const; + //!@} + + //!@{ + /*! + Return pointer to the specified sparse matrix element if it exists + + `find<_Tp>(i0,...[,hashval])` is equivalent to `(_const Tp*)ptr(i0,...false[,hashval])`. + + If the specified element does not exist, the methods return NULL. + */ + //! returns pointer to the specified element (1D case) + template const _Tp* find(int i0, size_t* hashval=0) const; + //! returns pointer to the specified element (2D case) + template const _Tp* find(int i0, int i1, size_t* hashval=0) const; + //! returns pointer to the specified element (3D case) + template const _Tp* find(int i0, int i1, int i2, size_t* hashval=0) const; + //! returns pointer to the specified element (nD case) + template const _Tp* find(const int* idx, size_t* hashval=0) const; + //!@} + + //! erases the specified element (2D case) + void erase(int i0, int i1, size_t* hashval=0); + //! erases the specified element (3D case) + void erase(int i0, int i1, int i2, size_t* hashval=0); + //! erases the specified element (nD case) + void erase(const int* idx, size_t* hashval=0); + + //!@{ + /*! + return the sparse matrix iterator pointing to the first sparse matrix element + */ + //! returns the sparse matrix iterator at the matrix beginning + SparseMatIterator begin(); + //! returns the sparse matrix iterator at the matrix beginning + template SparseMatIterator_<_Tp> begin(); + //! returns the read-only sparse matrix iterator at the matrix beginning + SparseMatConstIterator begin() const; + //! returns the read-only sparse matrix iterator at the matrix beginning + template SparseMatConstIterator_<_Tp> begin() const; + //!@} + /*! + return the sparse matrix iterator pointing to the element following the last sparse matrix element + */ + //! returns the sparse matrix iterator at the matrix end + SparseMatIterator end(); + //! returns the read-only sparse matrix iterator at the matrix end + SparseMatConstIterator end() const; + //! returns the typed sparse matrix iterator at the matrix end + template SparseMatIterator_<_Tp> end(); + //! returns the typed read-only sparse matrix iterator at the matrix end + template SparseMatConstIterator_<_Tp> end() const; + + //! returns the value stored in the sparse martix node + template _Tp& value(Node* n); + //! returns the value stored in the sparse martix node + template const _Tp& value(const Node* n) const; + + ////////////// some internal-use methods /////////////// + Node* node(size_t nidx); + const Node* node(size_t nidx) const; + + uchar* newNode(const int* idx, size_t hashval); + void removeNode(size_t hidx, size_t nidx, size_t previdx); + void resizeHashTab(size_t newsize); + + int flags; + Hdr* hdr; +}; + + + +///////////////////////////////// SparseMat_<_Tp> //////////////////////////////////// + +/** @brief Template sparse n-dimensional array class derived from SparseMat + +SparseMat_ is a thin wrapper on top of SparseMat created in the same way as Mat_ . It simplifies +notation of some operations: +@code + int sz[] = {10, 20, 30}; + SparseMat_ M(3, sz); + ... + M.ref(1, 2, 3) = M(4, 5, 6) + M(7, 8, 9); +@endcode + */ +template class SparseMat_ : public SparseMat +{ +public: + typedef SparseMatIterator_<_Tp> iterator; + typedef SparseMatConstIterator_<_Tp> const_iterator; + + //! the default constructor + SparseMat_(); + //! the full constructor equivalent to SparseMat(dims, _sizes, DataType<_Tp>::type) + SparseMat_(int dims, const int* _sizes); + //! the copy constructor. If DataType<_Tp>.type != m.type(), the m elements are converted + SparseMat_(const SparseMat& m); + //! the copy constructor. This is O(1) operation - no data is copied + SparseMat_(const SparseMat_& m); + //! converts dense matrix to the sparse form + SparseMat_(const Mat& m); + //! converts the old-style sparse matrix to the C++ class. All the elements are copied + //SparseMat_(const CvSparseMat* m); + //! the assignment operator. If DataType<_Tp>.type != m.type(), the m elements are converted + SparseMat_& operator = (const SparseMat& m); + //! the assignment operator. This is O(1) operation - no data is copied + SparseMat_& operator = (const SparseMat_& m); + //! converts dense matrix to the sparse form + SparseMat_& operator = (const Mat& m); + + //! makes full copy of the matrix. All the elements are duplicated + CV_NODISCARD_STD SparseMat_ clone() const; + //! equivalent to cv::SparseMat::create(dims, _sizes, DataType<_Tp>::type) + void create(int dims, const int* _sizes); + //! converts sparse matrix to the old-style CvSparseMat. All the elements are copied + //operator CvSparseMat*() const; + + //! returns type of the matrix elements + int type() const; + //! returns depth of the matrix elements + int depth() const; + //! returns the number of channels in each matrix element + int channels() const; + + //! equivalent to SparseMat::ref<_Tp>(i0, hashval) + _Tp& ref(int i0, size_t* hashval=0); + //! equivalent to SparseMat::ref<_Tp>(i0, i1, hashval) + _Tp& ref(int i0, int i1, size_t* hashval=0); + //! equivalent to SparseMat::ref<_Tp>(i0, i1, i2, hashval) + _Tp& ref(int i0, int i1, int i2, size_t* hashval=0); + //! equivalent to SparseMat::ref<_Tp>(idx, hashval) + _Tp& ref(const int* idx, size_t* hashval=0); + + //! equivalent to SparseMat::value<_Tp>(i0, hashval) + _Tp operator()(int i0, size_t* hashval=0) const; + //! equivalent to SparseMat::value<_Tp>(i0, i1, hashval) + _Tp operator()(int i0, int i1, size_t* hashval=0) const; + //! equivalent to SparseMat::value<_Tp>(i0, i1, i2, hashval) + _Tp operator()(int i0, int i1, int i2, size_t* hashval=0) const; + //! equivalent to SparseMat::value<_Tp>(idx, hashval) + _Tp operator()(const int* idx, size_t* hashval=0) const; + + //! returns sparse matrix iterator pointing to the first sparse matrix element + SparseMatIterator_<_Tp> begin(); + //! returns read-only sparse matrix iterator pointing to the first sparse matrix element + SparseMatConstIterator_<_Tp> begin() const; + //! returns sparse matrix iterator pointing to the element following the last sparse matrix element + SparseMatIterator_<_Tp> end(); + //! returns read-only sparse matrix iterator pointing to the element following the last sparse matrix element + SparseMatConstIterator_<_Tp> end() const; +}; + + + +////////////////////////////////// MatConstIterator ////////////////////////////////// + +class CV_EXPORTS MatConstIterator +{ +public: + typedef uchar* value_type; + typedef ptrdiff_t difference_type; + typedef const uchar** pointer; + typedef uchar* reference; + + typedef std::random_access_iterator_tag iterator_category; + + //! default constructor + MatConstIterator(); + //! constructor that sets the iterator to the beginning of the matrix + MatConstIterator(const Mat* _m); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator(const Mat* _m, int _row, int _col=0); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator(const Mat* _m, Point _pt); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator(const Mat* _m, const int* _idx); + //! copy constructor + MatConstIterator(const MatConstIterator& it); + + //! copy operator + MatConstIterator& operator = (const MatConstIterator& it); + //! returns the current matrix element + const uchar* operator *() const; + //! returns the i-th matrix element, relative to the current + const uchar* operator [](ptrdiff_t i) const; + + //! shifts the iterator forward by the specified number of elements + MatConstIterator& operator += (ptrdiff_t ofs); + //! shifts the iterator backward by the specified number of elements + MatConstIterator& operator -= (ptrdiff_t ofs); + //! decrements the iterator + MatConstIterator& operator --(); + //! decrements the iterator + MatConstIterator operator --(int); + //! increments the iterator + MatConstIterator& operator ++(); + //! increments the iterator + MatConstIterator operator ++(int); + //! returns the current iterator position + Point pos() const; + //! returns the current iterator position + void pos(int* _idx) const; + + ptrdiff_t lpos() const; + void seek(ptrdiff_t ofs, bool relative = false); + void seek(const int* _idx, bool relative = false); + + const Mat* m; + size_t elemSize; + const uchar* ptr; + const uchar* sliceStart; + const uchar* sliceEnd; +}; + + + +////////////////////////////////// MatConstIterator_ ///////////////////////////////// + +/** @brief Matrix read-only iterator + */ +template +class MatConstIterator_ : public MatConstIterator +{ +public: + typedef _Tp value_type; + typedef ptrdiff_t difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; + + typedef std::random_access_iterator_tag iterator_category; + + //! default constructor + MatConstIterator_(); + //! constructor that sets the iterator to the beginning of the matrix + MatConstIterator_(const Mat_<_Tp>* _m); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col=0); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator_(const Mat_<_Tp>* _m, Point _pt); + //! constructor that sets the iterator to the specified element of the matrix + MatConstIterator_(const Mat_<_Tp>* _m, const int* _idx); + //! copy constructor + MatConstIterator_(const MatConstIterator_& it); + + //! copy operator + MatConstIterator_& operator = (const MatConstIterator_& it); + //! returns the current matrix element + const _Tp& operator *() const; + //! returns the i-th matrix element, relative to the current + const _Tp& operator [](ptrdiff_t i) const; + + //! shifts the iterator forward by the specified number of elements + MatConstIterator_& operator += (ptrdiff_t ofs); + //! shifts the iterator backward by the specified number of elements + MatConstIterator_& operator -= (ptrdiff_t ofs); + //! decrements the iterator + MatConstIterator_& operator --(); + //! decrements the iterator + MatConstIterator_ operator --(int); + //! increments the iterator + MatConstIterator_& operator ++(); + //! increments the iterator + MatConstIterator_ operator ++(int); + //! returns the current iterator position + Point pos() const; +}; + + + +//////////////////////////////////// MatIterator_ //////////////////////////////////// + +/** @brief Matrix read-write iterator +*/ +template +class MatIterator_ : public MatConstIterator_<_Tp> +{ +public: + typedef _Tp* pointer; + typedef _Tp& reference; + + typedef std::random_access_iterator_tag iterator_category; + + //! the default constructor + MatIterator_(); + //! constructor that sets the iterator to the beginning of the matrix + MatIterator_(Mat_<_Tp>* _m); + //! constructor that sets the iterator to the specified element of the matrix + MatIterator_(Mat_<_Tp>* _m, int _row, int _col=0); + //! constructor that sets the iterator to the specified element of the matrix + MatIterator_(Mat_<_Tp>* _m, Point _pt); + //! constructor that sets the iterator to the specified element of the matrix + MatIterator_(Mat_<_Tp>* _m, const int* _idx); + //! copy constructor + MatIterator_(const MatIterator_& it); + //! copy operator + MatIterator_& operator = (const MatIterator_<_Tp>& it ); + + //! returns the current matrix element + _Tp& operator *() const; + //! returns the i-th matrix element, relative to the current + _Tp& operator [](ptrdiff_t i) const; + + //! shifts the iterator forward by the specified number of elements + MatIterator_& operator += (ptrdiff_t ofs); + //! shifts the iterator backward by the specified number of elements + MatIterator_& operator -= (ptrdiff_t ofs); + //! decrements the iterator + MatIterator_& operator --(); + //! decrements the iterator + MatIterator_ operator --(int); + //! increments the iterator + MatIterator_& operator ++(); + //! increments the iterator + MatIterator_ operator ++(int); +}; + + + +/////////////////////////////// SparseMatConstIterator /////////////////////////////// + +/** @brief Read-Only Sparse Matrix Iterator. + + Here is how to use the iterator to compute the sum of floating-point sparse matrix elements: + + \code + SparseMatConstIterator it = m.begin(), it_end = m.end(); + double s = 0; + CV_Assert( m.type() == CV_32F ); + for( ; it != it_end; ++it ) + s += it.value(); + \endcode +*/ +class CV_EXPORTS SparseMatConstIterator +{ +public: + //! the default constructor + SparseMatConstIterator(); + //! the full constructor setting the iterator to the first sparse matrix element + SparseMatConstIterator(const SparseMat* _m); + //! the copy constructor + SparseMatConstIterator(const SparseMatConstIterator& it); + + //! the assignment operator + SparseMatConstIterator& operator = (const SparseMatConstIterator& it); + + //! template method returning the current matrix element + template const _Tp& value() const; + //! returns the current node of the sparse matrix. it.node->idx is the current element index + const SparseMat::Node* node() const; + + //! moves iterator to the previous element + SparseMatConstIterator& operator --(); + //! moves iterator to the previous element + SparseMatConstIterator operator --(int); + //! moves iterator to the next element + SparseMatConstIterator& operator ++(); + //! moves iterator to the next element + SparseMatConstIterator operator ++(int); + + //! moves iterator to the element after the last element + void seekEnd(); + + const SparseMat* m; + size_t hashidx; + uchar* ptr; +}; + + + +////////////////////////////////// SparseMatIterator ///////////////////////////////// + +/** @brief Read-write Sparse Matrix Iterator + + The class is similar to cv::SparseMatConstIterator, + but can be used for in-place modification of the matrix elements. +*/ +class CV_EXPORTS SparseMatIterator : public SparseMatConstIterator +{ +public: + //! the default constructor + SparseMatIterator(); + //! the full constructor setting the iterator to the first sparse matrix element + SparseMatIterator(SparseMat* _m); + //! the full constructor setting the iterator to the specified sparse matrix element + SparseMatIterator(SparseMat* _m, const int* idx); + //! the copy constructor + SparseMatIterator(const SparseMatIterator& it); + + //! the assignment operator + SparseMatIterator& operator = (const SparseMatIterator& it); + //! returns read-write reference to the current sparse matrix element + template _Tp& value() const; + //! returns pointer to the current sparse matrix node. it.node->idx is the index of the current element (do not modify it!) + SparseMat::Node* node() const; + + //! moves iterator to the next element + SparseMatIterator& operator ++(); + //! moves iterator to the next element + SparseMatIterator operator ++(int); +}; + + + +/////////////////////////////// SparseMatConstIterator_ ////////////////////////////// + +/** @brief Template Read-Only Sparse Matrix Iterator Class. + + This is the derived from SparseMatConstIterator class that + introduces more convenient operator *() for accessing the current element. +*/ +template class SparseMatConstIterator_ : public SparseMatConstIterator +{ +public: + + typedef std::forward_iterator_tag iterator_category; + + //! the default constructor + SparseMatConstIterator_(); + //! the full constructor setting the iterator to the first sparse matrix element + SparseMatConstIterator_(const SparseMat_<_Tp>* _m); + SparseMatConstIterator_(const SparseMat* _m); + //! the copy constructor + SparseMatConstIterator_(const SparseMatConstIterator_& it); + + //! the assignment operator + SparseMatConstIterator_& operator = (const SparseMatConstIterator_& it); + //! the element access operator + const _Tp& operator *() const; + + //! moves iterator to the next element + SparseMatConstIterator_& operator ++(); + //! moves iterator to the next element + SparseMatConstIterator_ operator ++(int); +}; + + + +///////////////////////////////// SparseMatIterator_ ///////////////////////////////// + +/** @brief Template Read-Write Sparse Matrix Iterator Class. + + This is the derived from cv::SparseMatConstIterator_ class that + introduces more convenient operator *() for accessing the current element. +*/ +template class SparseMatIterator_ : public SparseMatConstIterator_<_Tp> +{ +public: + + typedef std::forward_iterator_tag iterator_category; + + //! the default constructor + SparseMatIterator_(); + //! the full constructor setting the iterator to the first sparse matrix element + SparseMatIterator_(SparseMat_<_Tp>* _m); + SparseMatIterator_(SparseMat* _m); + //! the copy constructor + SparseMatIterator_(const SparseMatIterator_& it); + + //! the assignment operator + SparseMatIterator_& operator = (const SparseMatIterator_& it); + //! returns the reference to the current element + _Tp& operator *() const; + + //! moves the iterator to the next element + SparseMatIterator_& operator ++(); + //! moves the iterator to the next element + SparseMatIterator_ operator ++(int); +}; + + + +/////////////////////////////////// NAryMatIterator ////////////////////////////////// + +/** @brief n-ary multi-dimensional array iterator. + +Use the class to implement unary, binary, and, generally, n-ary element-wise operations on +multi-dimensional arrays. Some of the arguments of an n-ary function may be continuous arrays, some +may be not. It is possible to use conventional MatIterator 's for each array but incrementing all of +the iterators after each small operations may be a big overhead. In this case consider using +NAryMatIterator to iterate through several matrices simultaneously as long as they have the same +geometry (dimensionality and all the dimension sizes are the same). On each iteration `it.planes[0]`, +`it.planes[1]`,... will be the slices of the corresponding matrices. + +The example below illustrates how you can compute a normalized and threshold 3D color histogram: +@code + void computeNormalizedColorHist(const Mat& image, Mat& hist, int N, double minProb) + { + const int histSize[] = {N, N, N}; + + // make sure that the histogram has a proper size and type + hist.create(3, histSize, CV_32F); + + // and clear it + hist = Scalar(0); + + // the loop below assumes that the image + // is a 8-bit 3-channel. check it. + CV_Assert(image.type() == CV_8UC3); + MatConstIterator_ it = image.begin(), + it_end = image.end(); + for( ; it != it_end; ++it ) + { + const Vec3b& pix = *it; + hist.at(pix[0]*N/256, pix[1]*N/256, pix[2]*N/256) += 1.f; + } + + minProb *= image.rows*image.cols; + + // initialize iterator (the style is different from STL). + // after initialization the iterator will contain + // the number of slices or planes the iterator will go through. + // it simultaneously increments iterators for several matrices + // supplied as a null terminated list of pointers + const Mat* arrays[] = {&hist, 0}; + Mat planes[1]; + NAryMatIterator itNAry(arrays, planes, 1); + double s = 0; + // iterate through the matrix. on each iteration + // itNAry.planes[i] (of type Mat) will be set to the current plane + // of the i-th n-dim matrix passed to the iterator constructor. + for(int p = 0; p < itNAry.nplanes; p++, ++itNAry) + { + threshold(itNAry.planes[0], itNAry.planes[0], minProb, 0, THRESH_TOZERO); + s += sum(itNAry.planes[0])[0]; + } + + s = 1./s; + itNAry = NAryMatIterator(arrays, planes, 1); + for(int p = 0; p < itNAry.nplanes; p++, ++itNAry) + itNAry.planes[0] *= s; + } +@endcode + */ +class CV_EXPORTS NAryMatIterator +{ +public: + //! the default constructor + NAryMatIterator(); + //! the full constructor taking arbitrary number of n-dim matrices + NAryMatIterator(const Mat** arrays, uchar** ptrs, int narrays=-1); + //! the full constructor taking arbitrary number of n-dim matrices + NAryMatIterator(const Mat** arrays, Mat* planes, int narrays=-1); + //! the separate iterator initialization method + void init(const Mat** arrays, Mat* planes, uchar** ptrs, int narrays=-1); + + //! proceeds to the next plane of every iterated matrix + NAryMatIterator& operator ++(); + //! proceeds to the next plane of every iterated matrix (postfix increment operator) + NAryMatIterator operator ++(int); + + //! the iterated arrays + const Mat** arrays; + //! the current planes + Mat* planes; + //! data pointers + uchar** ptrs; + //! the number of arrays + int narrays; + //! the number of hyper-planes that the iterator steps through + size_t nplanes; + //! the size of each segment (in elements) + size_t size; +protected: + int iterdepth; + size_t idx; +}; + + + +///////////////////////////////// Matrix Expressions ///////////////////////////////// + +class CV_EXPORTS MatOp +{ +public: + MatOp(); + virtual ~MatOp(); + + virtual bool elementWise(const MatExpr& expr) const; + virtual void assign(const MatExpr& expr, Mat& m, int type=-1) const = 0; + virtual void roi(const MatExpr& expr, const Range& rowRange, + const Range& colRange, MatExpr& res) const; + virtual void diag(const MatExpr& expr, int d, MatExpr& res) const; + virtual void augAssignAdd(const MatExpr& expr, Mat& m) const; + virtual void augAssignSubtract(const MatExpr& expr, Mat& m) const; + virtual void augAssignMultiply(const MatExpr& expr, Mat& m) const; + virtual void augAssignDivide(const MatExpr& expr, Mat& m) const; + virtual void augAssignAnd(const MatExpr& expr, Mat& m) const; + virtual void augAssignOr(const MatExpr& expr, Mat& m) const; + virtual void augAssignXor(const MatExpr& expr, Mat& m) const; + + virtual void add(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const; + virtual void add(const MatExpr& expr1, const Scalar& s, MatExpr& res) const; + + virtual void subtract(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const; + virtual void subtract(const Scalar& s, const MatExpr& expr, MatExpr& res) const; + + virtual void multiply(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=1) const; + virtual void multiply(const MatExpr& expr1, double s, MatExpr& res) const; + + virtual void divide(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res, double scale=1) const; + virtual void divide(double s, const MatExpr& expr, MatExpr& res) const; + + virtual void abs(const MatExpr& expr, MatExpr& res) const; + + virtual void transpose(const MatExpr& expr, MatExpr& res) const; + virtual void matmul(const MatExpr& expr1, const MatExpr& expr2, MatExpr& res) const; + virtual void invert(const MatExpr& expr, int method, MatExpr& res) const; + + virtual Size size(const MatExpr& expr) const; + virtual int type(const MatExpr& expr) const; +}; + +/** @brief Matrix expression representation +@anchor MatrixExpressions +This is a list of implemented matrix operations that can be combined in arbitrary complex +expressions (here A, B stand for matrices ( Mat ), s for a scalar ( Scalar ), alpha for a +real-valued scalar ( double )): +- Addition, subtraction, negation: `A+B`, `A-B`, `A+s`, `A-s`, `s+A`, `s-A`, `-A` +- Scaling: `A*alpha` +- Per-element multiplication and division: `A.mul(B)`, `A/B`, `alpha/A` +- Matrix multiplication: `A*B` +- Transposition: `A.t()` (means AT) +- Matrix inversion and pseudo-inversion, solving linear systems and least-squares problems: + `A.inv([method]) (~ A-1)`, `A.inv([method])*B (~ X: AX=B)` +- Comparison: `A cmpop B`, `A cmpop alpha`, `alpha cmpop A`, where *cmpop* is one of + `>`, `>=`, `==`, `!=`, `<=`, `<`. The result of comparison is an 8-bit single channel mask whose + elements are set to 255 (if the particular element or pair of elements satisfy the condition) or + 0. +- Bitwise logical operations: `A logicop B`, `A logicop s`, `s logicop A`, `~A`, where *logicop* is one of + `&`, `|`, `^`. +- Element-wise minimum and maximum: `min(A, B)`, `min(A, alpha)`, `max(A, B)`, `max(A, alpha)` +- Element-wise absolute value: `abs(A)` +- Cross-product, dot-product: `A.cross(B)`, `A.dot(B)` +- Any function of matrix or matrices and scalars that returns a matrix or a scalar, such as norm, + mean, sum, countNonZero, trace, determinant, repeat, and others. +- Matrix initializers ( Mat::eye(), Mat::zeros(), Mat::ones() ), matrix comma-separated + initializers, matrix constructors and operators that extract sub-matrices (see Mat description). +- Mat_() constructors to cast the result to the proper type. +@note Comma-separated initializers and probably some other operations may require additional +explicit Mat() or Mat_() constructor calls to resolve a possible ambiguity. + +Here are examples of matrix expressions: +@code + // compute pseudo-inverse of A, equivalent to A.inv(DECOMP_SVD) + SVD svd(A); + Mat pinvA = svd.vt.t()*Mat::diag(1./svd.w)*svd.u.t(); + + // compute the new vector of parameters in the Levenberg-Marquardt algorithm + x -= (A.t()*A + lambda*Mat::eye(A.cols,A.cols,A.type())).inv(DECOMP_CHOLESKY)*(A.t()*err); + + // sharpen image using "unsharp mask" algorithm + Mat blurred; double sigma = 1, threshold = 5, amount = 1; + GaussianBlur(img, blurred, Size(), sigma, sigma); + Mat lowContrastMask = abs(img - blurred) < threshold; + Mat sharpened = img*(1+amount) + blurred*(-amount); + img.copyTo(sharpened, lowContrastMask); +@endcode +*/ +class CV_EXPORTS MatExpr +{ +public: + MatExpr(); + explicit MatExpr(const Mat& m); + + MatExpr(const MatOp* _op, int _flags, const Mat& _a = Mat(), const Mat& _b = Mat(), + const Mat& _c = Mat(), double _alpha = 1, double _beta = 1, const Scalar& _s = Scalar()); + + operator Mat() const; + template operator Mat_<_Tp>() const; + + Size size() const; + int type() const; + + MatExpr row(int y) const; + MatExpr col(int x) const; + MatExpr diag(int d = 0) const; + MatExpr operator()( const Range& rowRange, const Range& colRange ) const; + MatExpr operator()( const Rect& roi ) const; + + MatExpr t() const; + MatExpr inv(int method = DECOMP_LU) const; + MatExpr mul(const MatExpr& e, double scale=1) const; + MatExpr mul(const Mat& m, double scale=1) const; + + Mat cross(const Mat& m) const; + double dot(const Mat& m) const; + + void swap(MatExpr& b); + + const MatOp* op; + int flags; + + Mat a, b, c; + double alpha, beta; + Scalar s; +}; + +//! @} core_basic + +//! @relates cv::MatExpr +//! @{ +CV_EXPORTS MatExpr operator + (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator + (const Mat& a, const Scalar& s); +CV_EXPORTS MatExpr operator + (const Scalar& s, const Mat& a); +CV_EXPORTS MatExpr operator + (const MatExpr& e, const Mat& m); +CV_EXPORTS MatExpr operator + (const Mat& m, const MatExpr& e); +CV_EXPORTS MatExpr operator + (const MatExpr& e, const Scalar& s); +CV_EXPORTS MatExpr operator + (const Scalar& s, const MatExpr& e); +CV_EXPORTS MatExpr operator + (const MatExpr& e1, const MatExpr& e2); +template static inline +MatExpr operator + (const Mat& a, const Matx<_Tp, m, n>& b) { return a + Mat(b); } +template static inline +MatExpr operator + (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) + b; } + +CV_EXPORTS MatExpr operator - (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator - (const Mat& a, const Scalar& s); +CV_EXPORTS MatExpr operator - (const Scalar& s, const Mat& a); +CV_EXPORTS MatExpr operator - (const MatExpr& e, const Mat& m); +CV_EXPORTS MatExpr operator - (const Mat& m, const MatExpr& e); +CV_EXPORTS MatExpr operator - (const MatExpr& e, const Scalar& s); +CV_EXPORTS MatExpr operator - (const Scalar& s, const MatExpr& e); +CV_EXPORTS MatExpr operator - (const MatExpr& e1, const MatExpr& e2); +template static inline +MatExpr operator - (const Mat& a, const Matx<_Tp, m, n>& b) { return a - Mat(b); } +template static inline +MatExpr operator - (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) - b; } + +CV_EXPORTS MatExpr operator - (const Mat& m); +CV_EXPORTS MatExpr operator - (const MatExpr& e); + +CV_EXPORTS MatExpr operator * (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator * (const Mat& a, double s); +CV_EXPORTS MatExpr operator * (double s, const Mat& a); +CV_EXPORTS MatExpr operator * (const MatExpr& e, const Mat& m); +CV_EXPORTS MatExpr operator * (const Mat& m, const MatExpr& e); +CV_EXPORTS MatExpr operator * (const MatExpr& e, double s); +CV_EXPORTS MatExpr operator * (double s, const MatExpr& e); +CV_EXPORTS MatExpr operator * (const MatExpr& e1, const MatExpr& e2); +template static inline +MatExpr operator * (const Mat& a, const Matx<_Tp, m, n>& b) { return a * Mat(b); } +template static inline +MatExpr operator * (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) * b; } + +CV_EXPORTS MatExpr operator / (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator / (const Mat& a, double s); +CV_EXPORTS MatExpr operator / (double s, const Mat& a); +CV_EXPORTS MatExpr operator / (const MatExpr& e, const Mat& m); +CV_EXPORTS MatExpr operator / (const Mat& m, const MatExpr& e); +CV_EXPORTS MatExpr operator / (const MatExpr& e, double s); +CV_EXPORTS MatExpr operator / (double s, const MatExpr& e); +CV_EXPORTS MatExpr operator / (const MatExpr& e1, const MatExpr& e2); +template static inline +MatExpr operator / (const Mat& a, const Matx<_Tp, m, n>& b) { return a / Mat(b); } +template static inline +MatExpr operator / (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) / b; } + +CV_EXPORTS MatExpr operator < (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator < (const Mat& a, double s); +CV_EXPORTS MatExpr operator < (double s, const Mat& a); +template static inline +MatExpr operator < (const Mat& a, const Matx<_Tp, m, n>& b) { return a < Mat(b); } +template static inline +MatExpr operator < (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) < b; } + +CV_EXPORTS MatExpr operator <= (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator <= (const Mat& a, double s); +CV_EXPORTS MatExpr operator <= (double s, const Mat& a); +template static inline +MatExpr operator <= (const Mat& a, const Matx<_Tp, m, n>& b) { return a <= Mat(b); } +template static inline +MatExpr operator <= (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) <= b; } + +CV_EXPORTS MatExpr operator == (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator == (const Mat& a, double s); +CV_EXPORTS MatExpr operator == (double s, const Mat& a); +template static inline +MatExpr operator == (const Mat& a, const Matx<_Tp, m, n>& b) { return a == Mat(b); } +template static inline +MatExpr operator == (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) == b; } + +CV_EXPORTS MatExpr operator != (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator != (const Mat& a, double s); +CV_EXPORTS MatExpr operator != (double s, const Mat& a); +template static inline +MatExpr operator != (const Mat& a, const Matx<_Tp, m, n>& b) { return a != Mat(b); } +template static inline +MatExpr operator != (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) != b; } + +CV_EXPORTS MatExpr operator >= (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator >= (const Mat& a, double s); +CV_EXPORTS MatExpr operator >= (double s, const Mat& a); +template static inline +MatExpr operator >= (const Mat& a, const Matx<_Tp, m, n>& b) { return a >= Mat(b); } +template static inline +MatExpr operator >= (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) >= b; } + +CV_EXPORTS MatExpr operator > (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator > (const Mat& a, double s); +CV_EXPORTS MatExpr operator > (double s, const Mat& a); +template static inline +MatExpr operator > (const Mat& a, const Matx<_Tp, m, n>& b) { return a > Mat(b); } +template static inline +MatExpr operator > (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) > b; } + +CV_EXPORTS MatExpr operator & (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator & (const Mat& a, const Scalar& s); +CV_EXPORTS MatExpr operator & (const Scalar& s, const Mat& a); +template static inline +MatExpr operator & (const Mat& a, const Matx<_Tp, m, n>& b) { return a & Mat(b); } +template static inline +MatExpr operator & (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) & b; } + +CV_EXPORTS MatExpr operator | (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator | (const Mat& a, const Scalar& s); +CV_EXPORTS MatExpr operator | (const Scalar& s, const Mat& a); +template static inline +MatExpr operator | (const Mat& a, const Matx<_Tp, m, n>& b) { return a | Mat(b); } +template static inline +MatExpr operator | (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) | b; } + +CV_EXPORTS MatExpr operator ^ (const Mat& a, const Mat& b); +CV_EXPORTS MatExpr operator ^ (const Mat& a, const Scalar& s); +CV_EXPORTS MatExpr operator ^ (const Scalar& s, const Mat& a); +template static inline +MatExpr operator ^ (const Mat& a, const Matx<_Tp, m, n>& b) { return a ^ Mat(b); } +template static inline +MatExpr operator ^ (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) ^ b; } + +CV_EXPORTS MatExpr operator ~(const Mat& m); + +CV_EXPORTS MatExpr min(const Mat& a, const Mat& b); +CV_EXPORTS MatExpr min(const Mat& a, double s); +CV_EXPORTS MatExpr min(double s, const Mat& a); +template static inline +MatExpr min (const Mat& a, const Matx<_Tp, m, n>& b) { return min(a, Mat(b)); } +template static inline +MatExpr min (const Matx<_Tp, m, n>& a, const Mat& b) { return min(Mat(a), b); } + +CV_EXPORTS MatExpr max(const Mat& a, const Mat& b); +CV_EXPORTS MatExpr max(const Mat& a, double s); +CV_EXPORTS MatExpr max(double s, const Mat& a); +template static inline +MatExpr max (const Mat& a, const Matx<_Tp, m, n>& b) { return max(a, Mat(b)); } +template static inline +MatExpr max (const Matx<_Tp, m, n>& a, const Mat& b) { return max(Mat(a), b); } + +/** @brief Calculates an absolute value of each matrix element. + +abs is a meta-function that is expanded to one of absdiff or convertScaleAbs forms: +- C = abs(A-B) is equivalent to `absdiff(A, B, C)` +- C = abs(A) is equivalent to `absdiff(A, Scalar::all(0), C)` +- C = `Mat_ >(abs(A*alpha + beta))` is equivalent to `convertScaleAbs(A, C, alpha, +beta)` + +The output matrix has the same size and the same type as the input one except for the last case, +where C is depth=CV_8U . +@param m matrix. +@sa @ref MatrixExpressions, absdiff, convertScaleAbs + */ +CV_EXPORTS MatExpr abs(const Mat& m); +/** @overload +@param e matrix expression. +*/ +CV_EXPORTS MatExpr abs(const MatExpr& e); +//! @} relates cv::MatExpr + +} // cv + +#include "opencv2/core/mat.inl.hpp" + +#endif // OPENCV_CORE_MAT_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/mat.inl.hpp b/Thirdparty/opencv2/include/opencv2/core/mat.inl.hpp new file mode 100644 index 0000000..f0eed78 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/mat.inl.hpp @@ -0,0 +1,3422 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_MATRIX_OPERATIONS_HPP +#define OPENCV_CORE_MATRIX_OPERATIONS_HPP + +#ifndef __cplusplus +# error mat.inl.hpp header must be compiled as C++ +#endif + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4127 5054 ) +#endif + +#if defined(CV_SKIP_DISABLE_CLANG_ENUM_WARNINGS) + // nothing +#elif defined(CV_FORCE_DISABLE_CLANG_ENUM_WARNINGS) + #define CV_DISABLE_CLANG_ENUM_WARNINGS +#elif defined(__clang__) && defined(__has_warning) + #if __has_warning("-Wdeprecated-enum-enum-conversion") && __has_warning("-Wdeprecated-anon-enum-enum-conversion") + #define CV_DISABLE_CLANG_ENUM_WARNINGS + #endif +#endif +#ifdef CV_DISABLE_CLANG_ENUM_WARNINGS +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion" +#pragma clang diagnostic ignored "-Wdeprecated-anon-enum-enum-conversion" +#endif + +namespace cv +{ +CV__DEBUG_NS_BEGIN + + +//! @cond IGNORED + +////////////////////////// Custom (raw) type wrapper ////////////////////////// + +template static inline +int rawType() +{ + CV_StaticAssert(sizeof(_Tp) <= CV_CN_MAX, "sizeof(_Tp) is too large"); + const int elemSize = sizeof(_Tp); + return (int)CV_MAKETYPE(CV_8U, elemSize); +} + +//////////////////////// Input/Output Arrays //////////////////////// + +inline void _InputArray::init(int _flags, const void* _obj) +{ flags = _flags; obj = (void*)_obj; } + +inline void _InputArray::init(int _flags, const void* _obj, Size _sz) +{ flags = _flags; obj = (void*)_obj; sz = _sz; } + +inline void* _InputArray::getObj() const { return obj; } +inline int _InputArray::getFlags() const { return flags; } +inline Size _InputArray::getSz() const { return sz; } + +inline _InputArray::_InputArray() { init(0 + NONE, 0); } +inline _InputArray::_InputArray(int _flags, void* _obj) { init(_flags, _obj); } +inline _InputArray::_InputArray(const Mat& m) { init(MAT+ACCESS_READ, &m); } +inline _InputArray::_InputArray(const std::vector& vec) { init(STD_VECTOR_MAT+ACCESS_READ, &vec); } +inline _InputArray::_InputArray(const UMat& m) { init(UMAT+ACCESS_READ, &m); } +inline _InputArray::_InputArray(const std::vector& vec) { init(STD_VECTOR_UMAT+ACCESS_READ, &vec); } + +template inline +_InputArray::_InputArray(const std::vector<_Tp>& vec) +{ init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_READ, &vec); } + +template inline +_InputArray::_InputArray(const std::array<_Tp, _Nm>& arr) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, arr.data(), Size(1, _Nm)); } + +template inline +_InputArray::_InputArray(const std::array& arr) +{ init(STD_ARRAY_MAT + ACCESS_READ, arr.data(), Size(1, _Nm)); } + +inline +_InputArray::_InputArray(const std::vector& vec) +{ init(FIXED_TYPE + STD_BOOL_VECTOR + traits::Type::value + ACCESS_READ, &vec); } + +template inline +_InputArray::_InputArray(const std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_READ, &vec); } + +template inline +_InputArray::_InputArray(const std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_READ, &vec); } + +template inline +_InputArray::_InputArray(const Matx<_Tp, m, n>& mtx) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, &mtx, Size(n, m)); } + +template inline +_InputArray::_InputArray(const _Tp* vec, int n) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, vec, Size(n, 1)); } + +template inline +_InputArray::_InputArray(const Mat_<_Tp>& m) +{ init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_READ, &m); } + +inline _InputArray::_InputArray(const double& val) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F + ACCESS_READ, &val, Size(1,1)); } + +inline _InputArray::_InputArray(const cuda::GpuMat& d_mat) +{ init(CUDA_GPU_MAT + ACCESS_READ, &d_mat); } + +inline _InputArray::_InputArray(const std::vector& d_mat) +{ init(STD_VECTOR_CUDA_GPU_MAT + ACCESS_READ, &d_mat);} + +inline _InputArray::_InputArray(const ogl::Buffer& buf) +{ init(OPENGL_BUFFER + ACCESS_READ, &buf); } + +inline _InputArray::_InputArray(const cuda::HostMem& cuda_mem) +{ init(CUDA_HOST_MEM + ACCESS_READ, &cuda_mem); } + +template inline +_InputArray _InputArray::rawIn(const std::vector<_Tp>& vec) +{ + _InputArray v; + v.flags = _InputArray::FIXED_TYPE + _InputArray::STD_VECTOR + rawType<_Tp>() + ACCESS_READ; + v.obj = (void*)&vec; + return v; +} + +template inline +_InputArray _InputArray::rawIn(const std::array<_Tp, _Nm>& arr) +{ + _InputArray v; + v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ; + v.obj = (void*)arr.data(); + v.sz = Size(1, _Nm); + return v; +} + +inline _InputArray::~_InputArray() {} + +inline Mat _InputArray::getMat(int i) const +{ + if( kind() == MAT && i < 0 ) + return *(const Mat*)obj; + return getMat_(i); +} + +inline bool _InputArray::isMat() const { return kind() == _InputArray::MAT; } +inline bool _InputArray::isUMat() const { return kind() == _InputArray::UMAT; } +inline bool _InputArray::isMatVector() const { return kind() == _InputArray::STD_VECTOR_MAT; } +inline bool _InputArray::isUMatVector() const { return kind() == _InputArray::STD_VECTOR_UMAT; } +inline bool _InputArray::isMatx() const { return kind() == _InputArray::MATX; } +inline bool _InputArray::isVector() const { return kind() == _InputArray::STD_VECTOR || + kind() == _InputArray::STD_BOOL_VECTOR || + (kind() == _InputArray::MATX && (sz.width <= 1 || sz.height <= 1)); } +inline bool _InputArray::isGpuMat() const { return kind() == _InputArray::CUDA_GPU_MAT; } +inline bool _InputArray::isGpuMatVector() const { return kind() == _InputArray::STD_VECTOR_CUDA_GPU_MAT; } + +//////////////////////////////////////////////////////////////////////////////////////// + +inline _OutputArray::_OutputArray() { init(NONE + ACCESS_WRITE, 0); } +inline _OutputArray::_OutputArray(int _flags, void* _obj) { init(_flags + ACCESS_WRITE, _obj); } +inline _OutputArray::_OutputArray(Mat& m) { init(MAT+ACCESS_WRITE, &m); } +inline _OutputArray::_OutputArray(std::vector& vec) { init(STD_VECTOR_MAT + ACCESS_WRITE, &vec); } +inline _OutputArray::_OutputArray(UMat& m) { init(UMAT + ACCESS_WRITE, &m); } +inline _OutputArray::_OutputArray(std::vector& vec) { init(STD_VECTOR_UMAT + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(std::vector<_Tp>& vec) +{ init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(std::array<_Tp, _Nm>& arr) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); } + +template inline +_OutputArray::_OutputArray(std::array& arr) +{ init(STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _Nm)); } + +template inline +_OutputArray::_OutputArray(std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(Mat_<_Tp>& m) +{ init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &m); } + +template inline +_OutputArray::_OutputArray(Matx<_Tp, m, n>& mtx) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, &mtx, Size(n, m)); } + +template inline +_OutputArray::_OutputArray(_Tp* vec, int n) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, vec, Size(n, 1)); } + +template inline +_OutputArray::_OutputArray(const std::vector<_Tp>& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(const std::array<_Tp, _Nm>& arr) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); } + +template inline +_OutputArray::_OutputArray(const std::array& arr) +{ init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _Nm)); } + +template inline +_OutputArray::_OutputArray(const std::vector >& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(const std::vector >& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &vec); } + +template inline +_OutputArray::_OutputArray(const Mat_<_Tp>& m) +{ init(FIXED_TYPE + FIXED_SIZE + MAT + traits::Type<_Tp>::value + ACCESS_WRITE, &m); } + +template inline +_OutputArray::_OutputArray(const Matx<_Tp, m, n>& mtx) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, &mtx, Size(n, m)); } + +template inline +_OutputArray::_OutputArray(const _Tp* vec, int n) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, vec, Size(n, 1)); } + +inline _OutputArray::_OutputArray(cuda::GpuMat& d_mat) +{ init(CUDA_GPU_MAT + ACCESS_WRITE, &d_mat); } + +inline _OutputArray::_OutputArray(std::vector& d_mat) +{ init(STD_VECTOR_CUDA_GPU_MAT + ACCESS_WRITE, &d_mat);} + +inline _OutputArray::_OutputArray(ogl::Buffer& buf) +{ init(OPENGL_BUFFER + ACCESS_WRITE, &buf); } + +inline _OutputArray::_OutputArray(cuda::HostMem& cuda_mem) +{ init(CUDA_HOST_MEM + ACCESS_WRITE, &cuda_mem); } + +inline _OutputArray::_OutputArray(const Mat& m) +{ init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_WRITE, &m); } + +inline _OutputArray::_OutputArray(const std::vector& vec) +{ init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_WRITE, &vec); } + +inline _OutputArray::_OutputArray(const UMat& m) +{ init(FIXED_TYPE + FIXED_SIZE + UMAT + ACCESS_WRITE, &m); } + +inline _OutputArray::_OutputArray(const std::vector& vec) +{ init(FIXED_SIZE + STD_VECTOR_UMAT + ACCESS_WRITE, &vec); } + +inline _OutputArray::_OutputArray(const cuda::GpuMat& d_mat) +{ init(FIXED_TYPE + FIXED_SIZE + CUDA_GPU_MAT + ACCESS_WRITE, &d_mat); } + + +inline _OutputArray::_OutputArray(const ogl::Buffer& buf) +{ init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_WRITE, &buf); } + +inline _OutputArray::_OutputArray(const cuda::HostMem& cuda_mem) +{ init(FIXED_TYPE + FIXED_SIZE + CUDA_HOST_MEM + ACCESS_WRITE, &cuda_mem); } + +template inline +_OutputArray _OutputArray::rawOut(std::vector<_Tp>& vec) +{ + _OutputArray v; + v.flags = _InputArray::FIXED_TYPE + _InputArray::STD_VECTOR + rawType<_Tp>() + ACCESS_WRITE; + v.obj = (void*)&vec; + return v; +} + +template inline +_OutputArray _OutputArray::rawOut(std::array<_Tp, _Nm>& arr) +{ + _OutputArray v; + v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE; + v.obj = (void*)arr.data(); + v.sz = Size(1, _Nm); + return v; +} + +/////////////////////////////////////////////////////////////////////////////////////////// + +inline _InputOutputArray::_InputOutputArray() { init(0+ACCESS_RW, 0); } +inline _InputOutputArray::_InputOutputArray(int _flags, void* _obj) { init(_flags+ACCESS_RW, _obj); } +inline _InputOutputArray::_InputOutputArray(Mat& m) { init(MAT+ACCESS_RW, &m); } +inline _InputOutputArray::_InputOutputArray(std::vector& vec) { init(STD_VECTOR_MAT+ACCESS_RW, &vec); } +inline _InputOutputArray::_InputOutputArray(UMat& m) { init(UMAT+ACCESS_RW, &m); } +inline _InputOutputArray::_InputOutputArray(std::vector& vec) { init(STD_VECTOR_UMAT+ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec) +{ init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(std::array<_Tp, _Nm>& arr) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); } + +template inline +_InputOutputArray::_InputOutputArray(std::array& arr) +{ init(STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _Nm)); } + +template inline +_InputOutputArray::_InputOutputArray(std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(std::vector >& vec) +{ init(FIXED_TYPE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(Mat_<_Tp>& m) +{ init(FIXED_TYPE + MAT + traits::Type<_Tp>::value + ACCESS_RW, &m); } + +template inline +_InputOutputArray::_InputOutputArray(Matx<_Tp, m, n>& mtx) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, &mtx, Size(n, m)); } + +template inline +_InputOutputArray::_InputOutputArray(_Tp* vec, int n) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, vec, Size(n, 1)); } + +template inline +_InputOutputArray::_InputOutputArray(const std::vector<_Tp>& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(const std::array<_Tp, _Nm>& arr) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); } + +template inline +_InputOutputArray::_InputOutputArray(const std::array& arr) +{ init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _Nm)); } + +template inline +_InputOutputArray::_InputOutputArray(const std::vector >& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(const std::vector >& vec) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + traits::Type<_Tp>::value + ACCESS_RW, &vec); } + +template inline +_InputOutputArray::_InputOutputArray(const Mat_<_Tp>& m) +{ init(FIXED_TYPE + FIXED_SIZE + MAT + traits::Type<_Tp>::value + ACCESS_RW, &m); } + +template inline +_InputOutputArray::_InputOutputArray(const Matx<_Tp, m, n>& mtx) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, &mtx, Size(n, m)); } + +template inline +_InputOutputArray::_InputOutputArray(const _Tp* vec, int n) +{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, vec, Size(n, 1)); } + +inline _InputOutputArray::_InputOutputArray(cuda::GpuMat& d_mat) +{ init(CUDA_GPU_MAT + ACCESS_RW, &d_mat); } + +inline _InputOutputArray::_InputOutputArray(ogl::Buffer& buf) +{ init(OPENGL_BUFFER + ACCESS_RW, &buf); } + +inline _InputOutputArray::_InputOutputArray(cuda::HostMem& cuda_mem) +{ init(CUDA_HOST_MEM + ACCESS_RW, &cuda_mem); } + +inline _InputOutputArray::_InputOutputArray(const Mat& m) +{ init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_RW, &m); } + +inline _InputOutputArray::_InputOutputArray(const std::vector& vec) +{ init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_RW, &vec); } + +inline _InputOutputArray::_InputOutputArray(const UMat& m) +{ init(FIXED_TYPE + FIXED_SIZE + UMAT + ACCESS_RW, &m); } + +inline _InputOutputArray::_InputOutputArray(const std::vector& vec) +{ init(FIXED_SIZE + STD_VECTOR_UMAT + ACCESS_RW, &vec); } + +inline _InputOutputArray::_InputOutputArray(const cuda::GpuMat& d_mat) +{ init(FIXED_TYPE + FIXED_SIZE + CUDA_GPU_MAT + ACCESS_RW, &d_mat); } + +inline _InputOutputArray::_InputOutputArray(const std::vector& d_mat) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_CUDA_GPU_MAT + ACCESS_RW, &d_mat);} + +template<> inline _InputOutputArray::_InputOutputArray(std::vector& d_mat) +{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_CUDA_GPU_MAT + ACCESS_RW, &d_mat);} + +inline _InputOutputArray::_InputOutputArray(const ogl::Buffer& buf) +{ init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_RW, &buf); } + +inline _InputOutputArray::_InputOutputArray(const cuda::HostMem& cuda_mem) +{ init(FIXED_TYPE + FIXED_SIZE + CUDA_HOST_MEM + ACCESS_RW, &cuda_mem); } + +template inline +_InputOutputArray _InputOutputArray::rawInOut(std::vector<_Tp>& vec) +{ + _InputOutputArray v; + v.flags = _InputArray::FIXED_TYPE + _InputArray::STD_VECTOR + rawType<_Tp>() + ACCESS_RW; + v.obj = (void*)&vec; + return v; +} + +template inline +_InputOutputArray _InputOutputArray::rawInOut(std::array<_Tp, _Nm>& arr) +{ + _InputOutputArray v; + v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW; + v.obj = (void*)arr.data(); + v.sz = Size(1, _Nm); + return v; +} + + +template static inline _InputArray rawIn(_Tp& v) { return _InputArray::rawIn(v); } +template static inline _OutputArray rawOut(_Tp& v) { return _OutputArray::rawOut(v); } +template static inline _InputOutputArray rawInOut(_Tp& v) { return _InputOutputArray::rawInOut(v); } + +CV__DEBUG_NS_END + +//////////////////////////////////////////// Mat ////////////////////////////////////////// + +template inline +Mat::Mat(const std::vector<_Tp>& vec, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()), + cols(1), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if(vec.empty()) + return; + if( !copyData ) + { + step[0] = step[1] = sizeof(_Tp); + datastart = data = (uchar*)&vec[0]; + datalimit = dataend = datastart + rows * step[0]; + } + else + Mat((int)vec.size(), 1, traits::Type<_Tp>::value, (uchar*)&vec[0]).copyTo(*this); +} + +template inline +Mat::Mat(const std::initializer_list<_Tp> list) + : Mat() +{ + CV_Assert(list.size() != 0); + Mat((int)list.size(), 1, traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this); +} + +template inline +Mat::Mat(const std::initializer_list sizes, const std::initializer_list<_Tp> list) + : Mat() +{ + size_t size_total = 1; + for(auto s : sizes) + size_total *= s; + CV_Assert(list.size() != 0); + CV_Assert(size_total == list.size()); + Mat((int)sizes.size(), (int*)sizes.begin(), traits::Type<_Tp>::value, (uchar*)list.begin()).copyTo(*this); +} + +template inline +Mat::Mat(const std::array<_Tp, _Nm>& arr, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows((int)arr.size()), + cols(1), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if(arr.empty()) + return; + if( !copyData ) + { + step[0] = step[1] = sizeof(_Tp); + datastart = data = (uchar*)arr.data(); + datalimit = dataend = datastart + rows * step[0]; + } + else + Mat((int)arr.size(), 1, traits::Type<_Tp>::value, (uchar*)arr.data()).copyTo(*this); +} + +template inline +Mat::Mat(const Vec<_Tp, n>& vec, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows(n), cols(1), data(0), + datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if( !copyData ) + { + step[0] = step[1] = sizeof(_Tp); + datastart = data = (uchar*)vec.val; + datalimit = dataend = datastart + rows * step[0]; + } + else + Mat(n, 1, traits::Type<_Tp>::value, (void*)vec.val).copyTo(*this); +} + + +template inline +Mat::Mat(const Matx<_Tp,m,n>& M, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows(m), cols(n), data(0), + datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if( !copyData ) + { + step[0] = cols * sizeof(_Tp); + step[1] = sizeof(_Tp); + datastart = data = (uchar*)M.val; + datalimit = dataend = datastart + rows * step[0]; + } + else + Mat(m, n, traits::Type<_Tp>::value, (uchar*)M.val).copyTo(*this); +} + +template inline +Mat::Mat(const Point_<_Tp>& pt, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows(2), cols(1), data(0), + datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if( !copyData ) + { + step[0] = step[1] = sizeof(_Tp); + datastart = data = (uchar*)&pt.x; + datalimit = dataend = datastart + rows * step[0]; + } + else + { + create(2, 1, traits::Type<_Tp>::value); + ((_Tp*)data)[0] = pt.x; + ((_Tp*)data)[1] = pt.y; + } +} + +template inline +Mat::Mat(const Point3_<_Tp>& pt, bool copyData) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows(3), cols(1), data(0), + datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows), step(0) +{ + if( !copyData ) + { + step[0] = step[1] = sizeof(_Tp); + datastart = data = (uchar*)&pt.x; + datalimit = dataend = datastart + rows * step[0]; + } + else + { + create(3, 1, traits::Type<_Tp>::value); + ((_Tp*)data)[0] = pt.x; + ((_Tp*)data)[1] = pt.y; + ((_Tp*)data)[2] = pt.z; + } +} + +template inline +Mat::Mat(const MatCommaInitializer_<_Tp>& commaInitializer) + : flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(0), rows(0), cols(0), data(0), + datastart(0), dataend(0), allocator(0), u(0), size(&rows) +{ + *this = commaInitializer.operator Mat_<_Tp>(); +} + +inline +Mat Mat::row(int y) const +{ + return Mat(*this, Range(y, y + 1), Range::all()); +} + +inline +Mat Mat::col(int x) const +{ + return Mat(*this, Range::all(), Range(x, x + 1)); +} + +inline +Mat Mat::rowRange(int startrow, int endrow) const +{ + return Mat(*this, Range(startrow, endrow), Range::all()); +} + +inline +Mat Mat::rowRange(const Range& r) const +{ + return Mat(*this, r, Range::all()); +} + +inline +Mat Mat::colRange(int startcol, int endcol) const +{ + return Mat(*this, Range::all(), Range(startcol, endcol)); +} + +inline +Mat Mat::colRange(const Range& r) const +{ + return Mat(*this, Range::all(), r); +} + +inline +Mat Mat::operator()( Range _rowRange, Range _colRange ) const +{ + return Mat(*this, _rowRange, _colRange); +} + +inline +Mat Mat::operator()( const Rect& roi ) const +{ + return Mat(*this, roi); +} + +inline +Mat Mat::operator()(const Range* ranges) const +{ + return Mat(*this, ranges); +} + +inline +Mat Mat::operator()(const std::vector& ranges) const +{ + return Mat(*this, ranges); +} + +inline +bool Mat::isContinuous() const +{ + return (flags & CONTINUOUS_FLAG) != 0; +} + +inline +bool Mat::isSubmatrix() const +{ + return (flags & SUBMATRIX_FLAG) != 0; +} + +inline +size_t Mat::elemSize() const +{ + size_t res = dims > 0 ? step.p[dims - 1] : 0; + CV_DbgAssert(res != 0); + return res; +} + +inline +size_t Mat::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +int Mat::type() const +{ + return CV_MAT_TYPE(flags); +} + +inline +int Mat::depth() const +{ + return CV_MAT_DEPTH(flags); +} + +inline +int Mat::channels() const +{ + return CV_MAT_CN(flags); +} + +inline +uchar* Mat::ptr(int y) +{ + CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) ); + return data + step.p[0] * y; +} + +inline +const uchar* Mat::ptr(int y) const +{ + CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) ); + return data + step.p[0] * y; +} + +template inline +_Tp* Mat::ptr(int y) +{ + CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) ); + return (_Tp*)(data + step.p[0] * y); +} + +template inline +const _Tp* Mat::ptr(int y) const +{ + CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) ); + return (const _Tp*)(data + step.p[0] * y); +} + +inline +uchar* Mat::ptr(int i0, int i1) +{ + CV_DbgAssert(dims >= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + return data + i0 * step.p[0] + i1 * step.p[1]; +} + +inline +const uchar* Mat::ptr(int i0, int i1) const +{ + CV_DbgAssert(dims >= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + return data + i0 * step.p[0] + i1 * step.p[1]; +} + +template inline +_Tp* Mat::ptr(int i0, int i1) +{ + CV_DbgAssert(dims >= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + return (_Tp*)(data + i0 * step.p[0] + i1 * step.p[1]); +} + +template inline +const _Tp* Mat::ptr(int i0, int i1) const +{ + CV_DbgAssert(dims >= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + return (const _Tp*)(data + i0 * step.p[0] + i1 * step.p[1]); +} + +inline +uchar* Mat::ptr(int i0, int i1, int i2) +{ + CV_DbgAssert(dims >= 3); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]); + return data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]; +} + +inline +const uchar* Mat::ptr(int i0, int i1, int i2) const +{ + CV_DbgAssert(dims >= 3); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]); + return data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]; +} + +template inline +_Tp* Mat::ptr(int i0, int i1, int i2) +{ + CV_DbgAssert(dims >= 3); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]); + return (_Tp*)(data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]); +} + +template inline +const _Tp* Mat::ptr(int i0, int i1, int i2) const +{ + CV_DbgAssert(dims >= 3); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]); + return (const _Tp*)(data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2]); +} + +inline +uchar* Mat::ptr(const int* idx) +{ + int i, d = dims; + uchar* p = data; + CV_DbgAssert( d >= 1 && p ); + for( i = 0; i < d; i++ ) + { + CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] ); + p += idx[i] * step.p[i]; + } + return p; +} + +inline +const uchar* Mat::ptr(const int* idx) const +{ + int i, d = dims; + uchar* p = data; + CV_DbgAssert( d >= 1 && p ); + for( i = 0; i < d; i++ ) + { + CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] ); + p += idx[i] * step.p[i]; + } + return p; +} + +template inline +_Tp* Mat::ptr(const int* idx) +{ + int i, d = dims; + uchar* p = data; + CV_DbgAssert( d >= 1 && p ); + for( i = 0; i < d; i++ ) + { + CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] ); + p += idx[i] * step.p[i]; + } + return (_Tp*)p; +} + +template inline +const _Tp* Mat::ptr(const int* idx) const +{ + int i, d = dims; + uchar* p = data; + CV_DbgAssert( d >= 1 && p ); + for( i = 0; i < d; i++ ) + { + CV_DbgAssert( (unsigned)idx[i] < (unsigned)size.p[i] ); + p += idx[i] * step.p[i]; + } + return (const _Tp*)p; +} + +template inline +uchar* Mat::ptr(const Vec& idx) +{ + return Mat::ptr(idx.val); +} + +template inline +const uchar* Mat::ptr(const Vec& idx) const +{ + return Mat::ptr(idx.val); +} + +template inline +_Tp* Mat::ptr(const Vec& idx) +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return Mat::ptr<_Tp>(idx.val); +} + +template inline +const _Tp* Mat::ptr(const Vec& idx) const +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return Mat::ptr<_Tp>(idx.val); +} + + +template inline +_Tp& Mat::at(int i0, int i1) +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); + CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1()); + return ((_Tp*)(data + step.p[0] * i0))[i1]; +} + +template inline +const _Tp& Mat::at(int i0, int i1) const +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); + CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1()); + return ((const _Tp*)(data + step.p[0] * i0))[i1]; +} + +template inline +_Tp& Mat::at(Point pt) +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)(pt.x * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); + CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1()); + return ((_Tp*)(data + step.p[0] * pt.y))[pt.x]; +} + +template inline +const _Tp& Mat::at(Point pt) const +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)(pt.x * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())); + CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1()); + return ((const _Tp*)(data + step.p[0] * pt.y))[pt.x]; +} + +template inline +_Tp& Mat::at(int i0) +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)(size.p[0] * size.p[1])); + CV_DbgAssert(elemSize() == sizeof(_Tp)); + if( isContinuous() || size.p[0] == 1 ) + return ((_Tp*)data)[i0]; + if( size.p[1] == 1 ) + return *(_Tp*)(data + step.p[0] * i0); + int i = i0 / cols, j = i0 - i * cols; + return ((_Tp*)(data + step.p[0] * i))[j]; +} + +template inline +const _Tp& Mat::at(int i0) const +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)(size.p[0] * size.p[1])); + CV_DbgAssert(elemSize() == sizeof(_Tp)); + if( isContinuous() || size.p[0] == 1 ) + return ((const _Tp*)data)[i0]; + if( size.p[1] == 1 ) + return *(const _Tp*)(data + step.p[0] * i0); + int i = i0 / cols, j = i0 - i * cols; + return ((const _Tp*)(data + step.p[0] * i))[j]; +} + +template inline +_Tp& Mat::at(int i0, int i1, int i2) +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(_Tp*)ptr(i0, i1, i2); +} + +template inline +const _Tp& Mat::at(int i0, int i1, int i2) const +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(const _Tp*)ptr(i0, i1, i2); +} + +template inline +_Tp& Mat::at(const int* idx) +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(_Tp*)ptr(idx); +} + +template inline +const _Tp& Mat::at(const int* idx) const +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(const _Tp*)ptr(idx); +} + +template inline +_Tp& Mat::at(const Vec& idx) +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(_Tp*)ptr(idx.val); +} + +template inline +const _Tp& Mat::at(const Vec& idx) const +{ + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return *(const _Tp*)ptr(idx.val); +} + +template inline +MatConstIterator_<_Tp> Mat::begin() const +{ + if (empty()) + return MatConstIterator_<_Tp>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return MatConstIterator_<_Tp>((const Mat_<_Tp>*)this); +} + +template inline +std::reverse_iterator> Mat::rbegin() const +{ + if (empty()) + return std::reverse_iterator>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + MatConstIterator_<_Tp> it((const Mat_<_Tp>*)this); + it += total(); + return std::reverse_iterator> (it); +} + +template inline +MatConstIterator_<_Tp> Mat::end() const +{ + if (empty()) + return MatConstIterator_<_Tp>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + MatConstIterator_<_Tp> it((const Mat_<_Tp>*)this); + it += total(); + return it; +} + +template inline +std::reverse_iterator> Mat::rend() const +{ + if (empty()) + return std::reverse_iterator>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return std::reverse_iterator>((const Mat_<_Tp>*)this); +} + +template inline +MatIterator_<_Tp> Mat::begin() +{ + if (empty()) + return MatIterator_<_Tp>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return MatIterator_<_Tp>((Mat_<_Tp>*)this); +} + +template inline +std::reverse_iterator> Mat::rbegin() +{ + if (empty()) + return std::reverse_iterator>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + MatIterator_<_Tp> it((Mat_<_Tp>*)this); + it += total(); + return std::reverse_iterator>(it); +} + +template inline +MatIterator_<_Tp> Mat::end() +{ + if (empty()) + return MatIterator_<_Tp>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + MatIterator_<_Tp> it((Mat_<_Tp>*)this); + it += total(); + return it; +} + +template inline +std::reverse_iterator> Mat::rend() +{ + if (empty()) + return std::reverse_iterator>(); + CV_DbgAssert( elemSize() == sizeof(_Tp) ); + return std::reverse_iterator>(MatIterator_<_Tp>((Mat_<_Tp>*)this)); +} + +template inline +void Mat::forEach(const Functor& operation) { + this->forEach_impl<_Tp>(operation); +} + +template inline +void Mat::forEach(const Functor& operation) const { + // call as not const + (const_cast(this))->forEach<_Tp>(operation); +} + +template inline +Mat::operator std::vector<_Tp>() const +{ + std::vector<_Tp> v; + copyTo(v); + return v; +} + +template inline +Mat::operator std::array<_Tp, _Nm>() const +{ + std::array<_Tp, _Nm> v; + copyTo(v); + return v; +} + +template inline +Mat::operator Vec<_Tp, n>() const +{ + CV_Assert( data && dims <= 2 && (rows == 1 || cols == 1) && + rows + cols - 1 == n && channels() == 1 ); + + if( isContinuous() && type() == traits::Type<_Tp>::value ) + return Vec<_Tp, n>((_Tp*)data); + Vec<_Tp, n> v; + Mat tmp(rows, cols, traits::Type<_Tp>::value, v.val); + convertTo(tmp, tmp.type()); + return v; +} + +template inline +Mat::operator Matx<_Tp, m, n>() const +{ + CV_Assert( data && dims <= 2 && rows == m && cols == n && channels() == 1 ); + + if( isContinuous() && type() == traits::Type<_Tp>::value ) + return Matx<_Tp, m, n>((_Tp*)data); + Matx<_Tp, m, n> mtx; + Mat tmp(rows, cols, traits::Type<_Tp>::value, mtx.val); + convertTo(tmp, tmp.type()); + return mtx; +} + +template inline +void Mat::push_back(const _Tp& elem) +{ + if( !data ) + { + *this = Mat(1, 1, traits::Type<_Tp>::value, (void*)&elem).clone(); + return; + } + CV_Assert(traits::Type<_Tp>::value == type() && cols == 1 + /* && dims == 2 (cols == 1 implies dims == 2) */); + const uchar* tmp = dataend + step[0]; + if( !isSubmatrix() && isContinuous() && tmp <= datalimit ) + { + *(_Tp*)(data + (size.p[0]++) * step.p[0]) = elem; + dataend = tmp; + } + else + push_back_(&elem); +} + +template inline +void Mat::push_back(const Mat_<_Tp>& m) +{ + push_back((const Mat&)m); +} + +template<> inline +void Mat::push_back(const MatExpr& expr) +{ + push_back(static_cast(expr)); +} + + +template inline +void Mat::push_back(const std::vector<_Tp>& v) +{ + push_back(Mat(v)); +} + + +///////////////////////////// MatSize //////////////////////////// + +inline +MatSize::MatSize(int* _p) CV_NOEXCEPT + : p(_p) {} + +inline +int MatSize::dims() const CV_NOEXCEPT +{ + return (p - 1)[0]; +} + +inline +Size MatSize::operator()() const +{ + CV_DbgAssert(dims() <= 2); + return Size(p[1], p[0]); +} + +inline +const int& MatSize::operator[](int i) const +{ + CV_DbgAssert(i < dims()); +#ifdef __OPENCV_BUILD + CV_DbgAssert(i >= 0); +#endif + return p[i]; +} + +inline +int& MatSize::operator[](int i) +{ + CV_DbgAssert(i < dims()); +#ifdef __OPENCV_BUILD + CV_DbgAssert(i >= 0); +#endif + return p[i]; +} + +inline +MatSize::operator const int*() const CV_NOEXCEPT +{ + return p; +} + +inline +bool MatSize::operator != (const MatSize& sz) const CV_NOEXCEPT +{ + return !(*this == sz); +} + + + +///////////////////////////// MatStep //////////////////////////// + +inline +MatStep::MatStep() CV_NOEXCEPT +{ + p = buf; p[0] = p[1] = 0; +} + +inline +MatStep::MatStep(size_t s) CV_NOEXCEPT +{ + p = buf; p[0] = s; p[1] = 0; +} + +inline +const size_t& MatStep::operator[](int i) const CV_NOEXCEPT +{ + return p[i]; +} + +inline +size_t& MatStep::operator[](int i) CV_NOEXCEPT +{ + return p[i]; +} + +inline MatStep::operator size_t() const +{ + CV_DbgAssert( p == buf ); + return buf[0]; +} + +inline MatStep& MatStep::operator = (size_t s) +{ + CV_DbgAssert( p == buf ); + buf[0] = s; + return *this; +} + + + +////////////////////////////// Mat_<_Tp> //////////////////////////// + +template inline +Mat_<_Tp>::Mat_() CV_NOEXCEPT + : Mat() +{ + flags = (flags & ~CV_MAT_TYPE_MASK) + traits::Type<_Tp>::value; +} + +template inline +Mat_<_Tp>::Mat_(int _rows, int _cols) + : Mat(_rows, _cols, traits::Type<_Tp>::value) +{ +} + +template inline +Mat_<_Tp>::Mat_(int _rows, int _cols, const _Tp& value) + : Mat(_rows, _cols, traits::Type<_Tp>::value) +{ + *this = value; +} + +template inline +Mat_<_Tp>::Mat_(Size _sz) + : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value) +{} + +template inline +Mat_<_Tp>::Mat_(Size _sz, const _Tp& value) + : Mat(_sz.height, _sz.width, traits::Type<_Tp>::value) +{ + *this = value; +} + +template inline +Mat_<_Tp>::Mat_(int _dims, const int* _sz) + : Mat(_dims, _sz, traits::Type<_Tp>::value) +{} + +template inline +Mat_<_Tp>::Mat_(int _dims, const int* _sz, const _Tp& _s) + : Mat(_dims, _sz, traits::Type<_Tp>::value, Scalar(_s)) +{} + +template inline +Mat_<_Tp>::Mat_(int _dims, const int* _sz, _Tp* _data, const size_t* _steps) + : Mat(_dims, _sz, traits::Type<_Tp>::value, _data, _steps) +{} + +template inline +Mat_<_Tp>::Mat_(const Mat_<_Tp>& m, const Range* ranges) + : Mat(m, ranges) +{} + +template inline +Mat_<_Tp>::Mat_(const Mat_<_Tp>& m, const std::vector& ranges) + : Mat(m, ranges) +{} + +template inline +Mat_<_Tp>::Mat_(const Mat& m) + : Mat() +{ + flags = (flags & ~CV_MAT_TYPE_MASK) + traits::Type<_Tp>::value; + *this = m; +} + +template inline +Mat_<_Tp>::Mat_(const Mat_& m) + : Mat(m) +{} + +template inline +Mat_<_Tp>::Mat_(int _rows, int _cols, _Tp* _data, size_t steps) + : Mat(_rows, _cols, traits::Type<_Tp>::value, _data, steps) +{} + +template inline +Mat_<_Tp>::Mat_(const Mat_& m, const Range& _rowRange, const Range& _colRange) + : Mat(m, _rowRange, _colRange) +{} + +template inline +Mat_<_Tp>::Mat_(const Mat_& m, const Rect& roi) + : Mat(m, roi) +{} + +template template inline +Mat_<_Tp>::Mat_(const Vec::channel_type, n>& vec, bool copyData) + : Mat(n / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&vec) +{ + CV_Assert(n%DataType<_Tp>::channels == 0); + if( copyData ) + *this = clone(); +} + +template template inline +Mat_<_Tp>::Mat_(const Matx::channel_type, m, n>& M, bool copyData) + : Mat(m, n / DataType<_Tp>::channels, traits::Type<_Tp>::value, (void*)&M) +{ + CV_Assert(n % DataType<_Tp>::channels == 0); + if( copyData ) + *this = clone(); +} + +template inline +Mat_<_Tp>::Mat_(const Point_::channel_type>& pt, bool copyData) + : Mat(2 / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&pt) +{ + CV_Assert(2 % DataType<_Tp>::channels == 0); + if( copyData ) + *this = clone(); +} + +template inline +Mat_<_Tp>::Mat_(const Point3_::channel_type>& pt, bool copyData) + : Mat(3 / DataType<_Tp>::channels, 1, traits::Type<_Tp>::value, (void*)&pt) +{ + CV_Assert(3 % DataType<_Tp>::channels == 0); + if( copyData ) + *this = clone(); +} + +template inline +Mat_<_Tp>::Mat_(const MatCommaInitializer_<_Tp>& commaInitializer) + : Mat(commaInitializer) +{} + +template inline +Mat_<_Tp>::Mat_(const std::vector<_Tp>& vec, bool copyData) + : Mat(vec, copyData) +{} + +template inline +Mat_<_Tp>::Mat_(std::initializer_list<_Tp> list) + : Mat(list) +{} + +template inline +Mat_<_Tp>::Mat_(const std::initializer_list sizes, std::initializer_list<_Tp> list) + : Mat(sizes, list) +{} + +template template inline +Mat_<_Tp>::Mat_(const std::array<_Tp, _Nm>& arr, bool copyData) + : Mat(arr, copyData) +{} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m) +{ + if (m.empty()) + { + release(); + return *this; + } + if( traits::Type<_Tp>::value == m.type() ) + { + Mat::operator = (m); + return *this; + } + if( traits::Depth<_Tp>::value == m.depth() ) + { + return (*this = m.reshape(DataType<_Tp>::channels, m.dims, 0)); + } + CV_Assert(DataType<_Tp>::channels == m.channels() || m.empty()); + m.convertTo(*this, type()); + return *this; +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat_& m) +{ + Mat::operator=(m); + return *this; +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (const _Tp& s) +{ + typedef typename DataType<_Tp>::vec_type VT; + Mat::operator=(Scalar((const VT&)s)); + return *this; +} + +template inline +void Mat_<_Tp>::create(int _rows, int _cols) +{ + Mat::create(_rows, _cols, traits::Type<_Tp>::value); +} + +template inline +void Mat_<_Tp>::create(Size _sz) +{ + Mat::create(_sz, traits::Type<_Tp>::value); +} + +template inline +void Mat_<_Tp>::create(int _dims, const int* _sz) +{ + Mat::create(_dims, _sz, traits::Type<_Tp>::value); +} + +template inline +void Mat_<_Tp>::release() +{ + Mat::release(); + flags = (flags & ~CV_MAT_TYPE_MASK) + traits::Type<_Tp>::value; +} + +template inline +Mat_<_Tp> Mat_<_Tp>::cross(const Mat_& m) const +{ + return Mat_<_Tp>(Mat::cross(m)); +} + +template template inline +Mat_<_Tp>::operator Mat_() const +{ + return Mat_(static_cast(*this)); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::row(int y) const +{ + return Mat_(*this, Range(y, y+1), Range::all()); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::col(int x) const +{ + return Mat_(*this, Range::all(), Range(x, x+1)); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::diag(int d) const +{ + return Mat_(Mat::diag(d)); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::clone() const +{ + return Mat_(Mat::clone()); +} + +template inline +size_t Mat_<_Tp>::elemSize() const +{ + CV_DbgAssert( Mat::elemSize() == sizeof(_Tp) ); + return sizeof(_Tp); +} + +template inline +size_t Mat_<_Tp>::elemSize1() const +{ + CV_DbgAssert( Mat::elemSize1() == sizeof(_Tp) / DataType<_Tp>::channels ); + return sizeof(_Tp) / DataType<_Tp>::channels; +} + +template inline +int Mat_<_Tp>::type() const +{ + CV_DbgAssert( Mat::type() == traits::Type<_Tp>::value ); + return traits::Type<_Tp>::value; +} + +template inline +int Mat_<_Tp>::depth() const +{ + CV_DbgAssert( Mat::depth() == traits::Depth<_Tp>::value ); + return traits::Depth<_Tp>::value; +} + +template inline +int Mat_<_Tp>::channels() const +{ + CV_DbgAssert( Mat::channels() == DataType<_Tp>::channels ); + return DataType<_Tp>::channels; +} + +template inline +size_t Mat_<_Tp>::stepT(int i) const +{ + return step.p[i] / elemSize(); +} + +template inline +size_t Mat_<_Tp>::step1(int i) const +{ + return step.p[i] / elemSize1(); +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::adjustROI( int dtop, int dbottom, int dleft, int dright ) +{ + return (Mat_<_Tp>&)(Mat::adjustROI(dtop, dbottom, dleft, dright)); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::operator()( const Range& _rowRange, const Range& _colRange ) const +{ + return Mat_<_Tp>(*this, _rowRange, _colRange); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::operator()( const Rect& roi ) const +{ + return Mat_<_Tp>(*this, roi); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::operator()( const Range* ranges ) const +{ + return Mat_<_Tp>(*this, ranges); +} + +template inline +Mat_<_Tp> Mat_<_Tp>::operator()(const std::vector& ranges) const +{ + return Mat_<_Tp>(*this, ranges); +} + +template inline +_Tp* Mat_<_Tp>::operator [](int y) +{ + CV_DbgAssert( 0 <= y && y < size.p[0] ); + return (_Tp*)(data + y*step.p[0]); +} + +template inline +const _Tp* Mat_<_Tp>::operator [](int y) const +{ + CV_DbgAssert( 0 <= y && y < size.p[0] ); + return (const _Tp*)(data + y*step.p[0]); +} + +template inline +_Tp& Mat_<_Tp>::operator ()(int i0, int i1) +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert(type() == traits::Type<_Tp>::value); + return ((_Tp*)(data + step.p[0] * i0))[i1]; +} + +template inline +const _Tp& Mat_<_Tp>::operator ()(int i0, int i1) const +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]); + CV_DbgAssert(type() == traits::Type<_Tp>::value); + return ((const _Tp*)(data + step.p[0] * i0))[i1]; +} + +template inline +_Tp& Mat_<_Tp>::operator ()(Point pt) +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)pt.x < (unsigned)size.p[1]); + CV_DbgAssert(type() == traits::Type<_Tp>::value); + return ((_Tp*)(data + step.p[0] * pt.y))[pt.x]; +} + +template inline +const _Tp& Mat_<_Tp>::operator ()(Point pt) const +{ + CV_DbgAssert(dims <= 2); + CV_DbgAssert(data); + CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]); + CV_DbgAssert((unsigned)pt.x < (unsigned)size.p[1]); + CV_DbgAssert(type() == traits::Type<_Tp>::value); + return ((const _Tp*)(data + step.p[0] * pt.y))[pt.x]; +} + +template inline +_Tp& Mat_<_Tp>::operator ()(const int* idx) +{ + return Mat::at<_Tp>(idx); +} + +template inline +const _Tp& Mat_<_Tp>::operator ()(const int* idx) const +{ + return Mat::at<_Tp>(idx); +} + +template template inline +_Tp& Mat_<_Tp>::operator ()(const Vec& idx) +{ + return Mat::at<_Tp>(idx); +} + +template template inline +const _Tp& Mat_<_Tp>::operator ()(const Vec& idx) const +{ + return Mat::at<_Tp>(idx); +} + +template inline +_Tp& Mat_<_Tp>::operator ()(int i0) +{ + return this->at<_Tp>(i0); +} + +template inline +const _Tp& Mat_<_Tp>::operator ()(int i0) const +{ + return this->at<_Tp>(i0); +} + +template inline +_Tp& Mat_<_Tp>::operator ()(int i0, int i1, int i2) +{ + return this->at<_Tp>(i0, i1, i2); +} + +template inline +const _Tp& Mat_<_Tp>::operator ()(int i0, int i1, int i2) const +{ + return this->at<_Tp>(i0, i1, i2); +} + +template inline +Mat_<_Tp>::operator std::vector<_Tp>() const +{ + std::vector<_Tp> v; + copyTo(v); + return v; +} + +template template inline +Mat_<_Tp>::operator std::array<_Tp, _Nm>() const +{ + std::array<_Tp, _Nm> a; + copyTo(a); + return a; +} + +template template inline +Mat_<_Tp>::operator Vec::channel_type, n>() const +{ + CV_Assert(n % DataType<_Tp>::channels == 0); + +#if defined _MSC_VER + const Mat* pMat = (const Mat*)this; // workaround for MSVS <= 2012 compiler bugs (but GCC 4.6 dislikes this workaround) + return pMat->operator Vec::channel_type, n>(); +#else + return this->Mat::operator Vec::channel_type, n>(); +#endif +} + +template template inline +Mat_<_Tp>::operator Matx::channel_type, m, n>() const +{ + CV_Assert(n % DataType<_Tp>::channels == 0); + +#if defined _MSC_VER + const Mat* pMat = (const Mat*)this; // workaround for MSVS <= 2012 compiler bugs (but GCC 4.6 dislikes this workaround) + Matx::channel_type, m, n> res = pMat->operator Matx::channel_type, m, n>(); + return res; +#else + Matx::channel_type, m, n> res = this->Mat::operator Matx::channel_type, m, n>(); + return res; +#endif +} + +template inline +MatConstIterator_<_Tp> Mat_<_Tp>::begin() const +{ + return Mat::begin<_Tp>(); +} + +template inline +std::reverse_iterator> Mat_<_Tp>::rbegin() const +{ + return Mat::rbegin<_Tp>(); +} + +template inline +MatConstIterator_<_Tp> Mat_<_Tp>::end() const +{ + return Mat::end<_Tp>(); +} + +template inline +std::reverse_iterator> Mat_<_Tp>::rend() const +{ + return Mat::rend<_Tp>(); +} + +template inline +MatIterator_<_Tp> Mat_<_Tp>::begin() +{ + return Mat::begin<_Tp>(); +} + +template inline +std::reverse_iterator> Mat_<_Tp>::rbegin() +{ + return Mat::rbegin<_Tp>(); +} + +template inline +MatIterator_<_Tp> Mat_<_Tp>::end() +{ + return Mat::end<_Tp>(); +} + +template inline +std::reverse_iterator> Mat_<_Tp>::rend() +{ + return Mat::rend<_Tp>(); +} + +template template inline +void Mat_<_Tp>::forEach(const Functor& operation) { + Mat::forEach<_Tp, Functor>(operation); +} + +template template inline +void Mat_<_Tp>::forEach(const Functor& operation) const { + Mat::forEach<_Tp, Functor>(operation); +} + +template inline +Mat_<_Tp>::Mat_(Mat_&& m) + : Mat(std::move(m)) +{ +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (Mat_&& m) +{ + Mat::operator = (std::move(m)); + return *this; +} + +template inline +Mat_<_Tp>::Mat_(Mat&& m) + : Mat() +{ + flags = (flags & ~CV_MAT_TYPE_MASK) + traits::Type<_Tp>::value; + *this = std::move(m); +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (Mat&& m) +{ + if (m.empty()) + { + release(); + return *this; + } + if( traits::Type<_Tp>::value == m.type() ) + { + Mat::operator = ((Mat&&)m); + return *this; + } + if( traits::Depth<_Tp>::value == m.depth() ) + { + Mat::operator = ((Mat&&)m.reshape(DataType<_Tp>::channels, m.dims, 0)); + return *this; + } + CV_DbgAssert(DataType<_Tp>::channels == m.channels()); + m.convertTo(*this, type()); + return *this; +} + +template inline +Mat_<_Tp>::Mat_(MatExpr&& e) + : Mat() +{ + flags = (flags & ~CV_MAT_TYPE_MASK) + traits::Type<_Tp>::value; + *this = Mat(e); +} + + +///////////////////////////// SparseMat ///////////////////////////// + +inline +SparseMat SparseMat::clone() const +{ + SparseMat temp; + this->copyTo(temp); + return temp; +} + +inline +size_t SparseMat::elemSize() const +{ + return CV_ELEM_SIZE(flags); +} + +inline +size_t SparseMat::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +int SparseMat::type() const +{ + return CV_MAT_TYPE(flags); +} + +inline +int SparseMat::depth() const +{ + return CV_MAT_DEPTH(flags); +} + +inline +int SparseMat::channels() const +{ + return CV_MAT_CN(flags); +} + +inline +const int* SparseMat::size() const +{ + return hdr ? hdr->size : 0; +} + +inline +int SparseMat::size(int i) const +{ + if( hdr ) + { + CV_DbgAssert((unsigned)i < (unsigned)hdr->dims); + return hdr->size[i]; + } + return 0; +} + +inline +int SparseMat::dims() const +{ + return hdr ? hdr->dims : 0; +} + +inline +size_t SparseMat::nzcount() const +{ + return hdr ? hdr->nodeCount : 0; +} + +template inline +_Tp& SparseMat::ref(int i0, size_t* hashval) +{ + return *(_Tp*)((SparseMat*)this)->ptr(i0, true, hashval); +} + +template inline +_Tp& SparseMat::ref(int i0, int i1, size_t* hashval) +{ + return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, true, hashval); +} + +template inline +_Tp& SparseMat::ref(int i0, int i1, int i2, size_t* hashval) +{ + return *(_Tp*)((SparseMat*)this)->ptr(i0, i1, i2, true, hashval); +} + +template inline +_Tp& SparseMat::ref(const int* idx, size_t* hashval) +{ + return *(_Tp*)((SparseMat*)this)->ptr(idx, true, hashval); +} + +template inline +_Tp SparseMat::value(int i0, size_t* hashval) const +{ + const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval); + return p ? *p : _Tp(); +} + +template inline +_Tp SparseMat::value(int i0, int i1, size_t* hashval) const +{ + const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval); + return p ? *p : _Tp(); +} + +template inline +_Tp SparseMat::value(int i0, int i1, int i2, size_t* hashval) const +{ + const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval); + return p ? *p : _Tp(); +} + +template inline +_Tp SparseMat::value(const int* idx, size_t* hashval) const +{ + const _Tp* p = (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval); + return p ? *p : _Tp(); +} + +template inline +const _Tp* SparseMat::find(int i0, size_t* hashval) const +{ + return (const _Tp*)((SparseMat*)this)->ptr(i0, false, hashval); +} + +template inline +const _Tp* SparseMat::find(int i0, int i1, size_t* hashval) const +{ + return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, false, hashval); +} + +template inline +const _Tp* SparseMat::find(int i0, int i1, int i2, size_t* hashval) const +{ + return (const _Tp*)((SparseMat*)this)->ptr(i0, i1, i2, false, hashval); +} + +template inline +const _Tp* SparseMat::find(const int* idx, size_t* hashval) const +{ + return (const _Tp*)((SparseMat*)this)->ptr(idx, false, hashval); +} + +template inline +_Tp& SparseMat::value(Node* n) +{ + return *(_Tp*)((uchar*)n + hdr->valueOffset); +} + +template inline +const _Tp& SparseMat::value(const Node* n) const +{ + return *(const _Tp*)((const uchar*)n + hdr->valueOffset); +} + +inline +SparseMat::Node* SparseMat::node(size_t nidx) +{ + return (Node*)(void*)&hdr->pool[nidx]; +} + +inline +const SparseMat::Node* SparseMat::node(size_t nidx) const +{ + return (const Node*)(const void*)&hdr->pool[nidx]; +} + +inline +SparseMatIterator SparseMat::begin() +{ + return SparseMatIterator(this); +} + +inline +SparseMatConstIterator SparseMat::begin() const +{ + return SparseMatConstIterator(this); +} + +inline +SparseMatIterator SparseMat::end() +{ + SparseMatIterator it(this); + it.seekEnd(); + return it; +} + +inline +SparseMatConstIterator SparseMat::end() const +{ + SparseMatConstIterator it(this); + it.seekEnd(); + return it; +} + +template inline +SparseMatIterator_<_Tp> SparseMat::begin() +{ + return SparseMatIterator_<_Tp>(this); +} + +template inline +SparseMatConstIterator_<_Tp> SparseMat::begin() const +{ + return SparseMatConstIterator_<_Tp>(this); +} + +template inline +SparseMatIterator_<_Tp> SparseMat::end() +{ + SparseMatIterator_<_Tp> it(this); + it.seekEnd(); + return it; +} + +template inline +SparseMatConstIterator_<_Tp> SparseMat::end() const +{ + SparseMatConstIterator_<_Tp> it(this); + it.seekEnd(); + return it; +} + + + +///////////////////////////// SparseMat_ //////////////////////////// + +template inline +SparseMat_<_Tp>::SparseMat_() +{ + flags = MAGIC_VAL + traits::Type<_Tp>::value; +} + +template inline +SparseMat_<_Tp>::SparseMat_(int _dims, const int* _sizes) + : SparseMat(_dims, _sizes, traits::Type<_Tp>::value) +{} + +template inline +SparseMat_<_Tp>::SparseMat_(const SparseMat& m) +{ + if( m.type() == traits::Type<_Tp>::value ) + *this = (const SparseMat_<_Tp>&)m; + else + m.convertTo(*this, traits::Type<_Tp>::value); +} + +template inline +SparseMat_<_Tp>::SparseMat_(const SparseMat_<_Tp>& m) +{ + this->flags = m.flags; + this->hdr = m.hdr; + if( this->hdr ) + CV_XADD(&this->hdr->refcount, 1); +} + +template inline +SparseMat_<_Tp>::SparseMat_(const Mat& m) +{ + SparseMat sm(m); + *this = sm; +} + +template inline +SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const SparseMat_<_Tp>& m) +{ + if( this != &m ) + { + if( m.hdr ) CV_XADD(&m.hdr->refcount, 1); + release(); + flags = m.flags; + hdr = m.hdr; + } + return *this; +} + +template inline +SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const SparseMat& m) +{ + if( m.type() == traits::Type<_Tp>::value ) + return (*this = (const SparseMat_<_Tp>&)m); + m.convertTo(*this, traits::Type<_Tp>::value); + return *this; +} + +template inline +SparseMat_<_Tp>& SparseMat_<_Tp>::operator = (const Mat& m) +{ + return (*this = SparseMat(m)); +} + +template inline +SparseMat_<_Tp> SparseMat_<_Tp>::clone() const +{ + SparseMat_<_Tp> m; + this->copyTo(m); + return m; +} + +template inline +void SparseMat_<_Tp>::create(int _dims, const int* _sizes) +{ + SparseMat::create(_dims, _sizes, traits::Type<_Tp>::value); +} + +template inline +int SparseMat_<_Tp>::type() const +{ + return traits::Type<_Tp>::value; +} + +template inline +int SparseMat_<_Tp>::depth() const +{ + return traits::Depth<_Tp>::value; +} + +template inline +int SparseMat_<_Tp>::channels() const +{ + return DataType<_Tp>::channels; +} + +template inline +_Tp& SparseMat_<_Tp>::ref(int i0, size_t* hashval) +{ + return SparseMat::ref<_Tp>(i0, hashval); +} + +template inline +_Tp SparseMat_<_Tp>::operator()(int i0, size_t* hashval) const +{ + return SparseMat::value<_Tp>(i0, hashval); +} + +template inline +_Tp& SparseMat_<_Tp>::ref(int i0, int i1, size_t* hashval) +{ + return SparseMat::ref<_Tp>(i0, i1, hashval); +} + +template inline +_Tp SparseMat_<_Tp>::operator()(int i0, int i1, size_t* hashval) const +{ + return SparseMat::value<_Tp>(i0, i1, hashval); +} + +template inline +_Tp& SparseMat_<_Tp>::ref(int i0, int i1, int i2, size_t* hashval) +{ + return SparseMat::ref<_Tp>(i0, i1, i2, hashval); +} + +template inline +_Tp SparseMat_<_Tp>::operator()(int i0, int i1, int i2, size_t* hashval) const +{ + return SparseMat::value<_Tp>(i0, i1, i2, hashval); +} + +template inline +_Tp& SparseMat_<_Tp>::ref(const int* idx, size_t* hashval) +{ + return SparseMat::ref<_Tp>(idx, hashval); +} + +template inline +_Tp SparseMat_<_Tp>::operator()(const int* idx, size_t* hashval) const +{ + return SparseMat::value<_Tp>(idx, hashval); +} + +template inline +SparseMatIterator_<_Tp> SparseMat_<_Tp>::begin() +{ + return SparseMatIterator_<_Tp>(this); +} + +template inline +SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::begin() const +{ + return SparseMatConstIterator_<_Tp>(this); +} + +template inline +SparseMatIterator_<_Tp> SparseMat_<_Tp>::end() +{ + SparseMatIterator_<_Tp> it(this); + it.seekEnd(); + return it; +} + +template inline +SparseMatConstIterator_<_Tp> SparseMat_<_Tp>::end() const +{ + SparseMatConstIterator_<_Tp> it(this); + it.seekEnd(); + return it; +} + + + +////////////////////////// MatConstIterator ///////////////////////// + +inline +MatConstIterator::MatConstIterator() + : m(0), elemSize(0), ptr(0), sliceStart(0), sliceEnd(0) +{} + +inline +MatConstIterator::MatConstIterator(const Mat* _m) + : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0) +{ + if( m && m->isContinuous() ) + { + CV_Assert(!m->empty()); + sliceStart = m->ptr(); + sliceEnd = sliceStart + m->total()*elemSize; + } + seek((const int*)0); +} + +inline +MatConstIterator::MatConstIterator(const Mat* _m, int _row, int _col) + : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0) +{ + CV_Assert(m && m->dims <= 2); + if( m->isContinuous() ) + { + CV_Assert(!m->empty()); + sliceStart = m->ptr(); + sliceEnd = sliceStart + m->total()*elemSize; + } + int idx[] = {_row, _col}; + seek(idx); +} + +inline +MatConstIterator::MatConstIterator(const Mat* _m, Point _pt) + : m(_m), elemSize(_m->elemSize()), ptr(0), sliceStart(0), sliceEnd(0) +{ + CV_Assert(m && m->dims <= 2); + if( m->isContinuous() ) + { + CV_Assert(!m->empty()); + sliceStart = m->ptr(); + sliceEnd = sliceStart + m->total()*elemSize; + } + int idx[] = {_pt.y, _pt.x}; + seek(idx); +} + +inline +MatConstIterator::MatConstIterator(const MatConstIterator& it) + : m(it.m), elemSize(it.elemSize), ptr(it.ptr), sliceStart(it.sliceStart), sliceEnd(it.sliceEnd) +{} + +inline +MatConstIterator& MatConstIterator::operator = (const MatConstIterator& it ) +{ + m = it.m; elemSize = it.elemSize; ptr = it.ptr; + sliceStart = it.sliceStart; sliceEnd = it.sliceEnd; + return *this; +} + +inline +const uchar* MatConstIterator::operator *() const +{ + return ptr; +} + +inline MatConstIterator& MatConstIterator::operator += (ptrdiff_t ofs) +{ + if( !m || ofs == 0 ) + return *this; + ptrdiff_t ofsb = ofs*elemSize; + ptr += ofsb; + if( ptr < sliceStart || sliceEnd <= ptr ) + { + ptr -= ofsb; + seek(ofs, true); + } + return *this; +} + +inline +MatConstIterator& MatConstIterator::operator -= (ptrdiff_t ofs) +{ + return (*this += -ofs); +} + +inline +MatConstIterator& MatConstIterator::operator --() +{ + if( m && (ptr -= elemSize) < sliceStart ) + { + ptr += elemSize; + seek(-1, true); + } + return *this; +} + +inline +MatConstIterator MatConstIterator::operator --(int) +{ + MatConstIterator b = *this; + *this += -1; + return b; +} + +inline +MatConstIterator& MatConstIterator::operator ++() +{ + if( m && (ptr += elemSize) >= sliceEnd ) + { + ptr -= elemSize; + seek(1, true); + } + return *this; +} + +inline MatConstIterator MatConstIterator::operator ++(int) +{ + MatConstIterator b = *this; + *this += 1; + return b; +} + + +static inline +bool operator == (const MatConstIterator& a, const MatConstIterator& b) +{ + return a.m == b.m && a.ptr == b.ptr; +} + +static inline +bool operator != (const MatConstIterator& a, const MatConstIterator& b) +{ + return !(a == b); +} + +static inline +bool operator < (const MatConstIterator& a, const MatConstIterator& b) +{ + return a.ptr < b.ptr; +} + +static inline +bool operator > (const MatConstIterator& a, const MatConstIterator& b) +{ + return a.ptr > b.ptr; +} + +static inline +bool operator <= (const MatConstIterator& a, const MatConstIterator& b) +{ + return a.ptr <= b.ptr; +} + +static inline +bool operator >= (const MatConstIterator& a, const MatConstIterator& b) +{ + return a.ptr >= b.ptr; +} + +static inline +ptrdiff_t operator - (const MatConstIterator& b, const MatConstIterator& a) +{ + if( a.m != b.m ) + return ((size_t)(-1) >> 1); + if( a.sliceEnd == b.sliceEnd ) + return (b.ptr - a.ptr)/static_cast(b.elemSize); + + return b.lpos() - a.lpos(); +} + +static inline +MatConstIterator operator + (const MatConstIterator& a, ptrdiff_t ofs) +{ + MatConstIterator b = a; + return b += ofs; +} + +static inline +MatConstIterator operator + (ptrdiff_t ofs, const MatConstIterator& a) +{ + MatConstIterator b = a; + return b += ofs; +} + +static inline +MatConstIterator operator - (const MatConstIterator& a, ptrdiff_t ofs) +{ + MatConstIterator b = a; + return b += -ofs; +} + + +inline +const uchar* MatConstIterator::operator [](ptrdiff_t i) const +{ + return *(*this + i); +} + + + +///////////////////////// MatConstIterator_ ///////////////////////// + +template inline +MatConstIterator_<_Tp>::MatConstIterator_() +{} + +template inline +MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m) + : MatConstIterator(_m) +{} + +template inline +MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m, int _row, int _col) + : MatConstIterator(_m, _row, _col) +{} + +template inline +MatConstIterator_<_Tp>::MatConstIterator_(const Mat_<_Tp>* _m, Point _pt) + : MatConstIterator(_m, _pt) +{} + +template inline +MatConstIterator_<_Tp>::MatConstIterator_(const MatConstIterator_& it) + : MatConstIterator(it) +{} + +template inline +MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator = (const MatConstIterator_& it ) +{ + MatConstIterator::operator = (it); + return *this; +} + +template inline +const _Tp& MatConstIterator_<_Tp>::operator *() const +{ + return *(_Tp*)(this->ptr); +} + +template inline +MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator += (ptrdiff_t ofs) +{ + MatConstIterator::operator += (ofs); + return *this; +} + +template inline +MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator -= (ptrdiff_t ofs) +{ + return (*this += -ofs); +} + +template inline +MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator --() +{ + MatConstIterator::operator --(); + return *this; +} + +template inline +MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator --(int) +{ + MatConstIterator_ b = *this; + MatConstIterator::operator --(); + return b; +} + +template inline +MatConstIterator_<_Tp>& MatConstIterator_<_Tp>::operator ++() +{ + MatConstIterator::operator ++(); + return *this; +} + +template inline +MatConstIterator_<_Tp> MatConstIterator_<_Tp>::operator ++(int) +{ + MatConstIterator_ b = *this; + MatConstIterator::operator ++(); + return b; +} + + +template inline +Point MatConstIterator_<_Tp>::pos() const +{ + if( !m ) + return Point(); + CV_DbgAssert( m->dims <= 2 ); + if( m->isContinuous() ) + { + ptrdiff_t ofs = (const _Tp*)ptr - (const _Tp*)m->data; + int y = (int)(ofs / m->cols); + int x = (int)(ofs - (ptrdiff_t)y * m->cols); + return Point(x, y); + } + else + { + ptrdiff_t ofs = (uchar*)ptr - m->data; + int y = (int)(ofs / m->step); + int x = (int)((ofs - y * m->step)/sizeof(_Tp)); + return Point(x, y); + } +} + + +template static inline +bool operator == (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b) +{ + return a.m == b.m && a.ptr == b.ptr; +} + +template static inline +bool operator != (const MatConstIterator_<_Tp>& a, const MatConstIterator_<_Tp>& b) +{ + return a.m != b.m || a.ptr != b.ptr; +} + +template static inline +MatConstIterator_<_Tp> operator + (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs) +{ + MatConstIterator t = (const MatConstIterator&)a + ofs; + return (MatConstIterator_<_Tp>&)t; +} + +template static inline +MatConstIterator_<_Tp> operator + (ptrdiff_t ofs, const MatConstIterator_<_Tp>& a) +{ + MatConstIterator t = (const MatConstIterator&)a + ofs; + return (MatConstIterator_<_Tp>&)t; +} + +template static inline +MatConstIterator_<_Tp> operator - (const MatConstIterator_<_Tp>& a, ptrdiff_t ofs) +{ + MatConstIterator t = (const MatConstIterator&)a - ofs; + return (MatConstIterator_<_Tp>&)t; +} + +template inline +const _Tp& MatConstIterator_<_Tp>::operator [](ptrdiff_t i) const +{ + return *(_Tp*)MatConstIterator::operator [](i); +} + + + +//////////////////////////// MatIterator_ /////////////////////////// + +template inline +MatIterator_<_Tp>::MatIterator_() + : MatConstIterator_<_Tp>() +{} + +template inline +MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m) + : MatConstIterator_<_Tp>(_m) +{} + +template inline +MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, int _row, int _col) + : MatConstIterator_<_Tp>(_m, _row, _col) +{} + +template inline +MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, Point _pt) + : MatConstIterator_<_Tp>(_m, _pt) +{} + +template inline +MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, const int* _idx) + : MatConstIterator_<_Tp>(_m, _idx) +{} + +template inline +MatIterator_<_Tp>::MatIterator_(const MatIterator_& it) + : MatConstIterator_<_Tp>(it) +{} + +template inline +MatIterator_<_Tp>& MatIterator_<_Tp>::operator = (const MatIterator_<_Tp>& it ) +{ + MatConstIterator::operator = (it); + return *this; +} + +template inline +_Tp& MatIterator_<_Tp>::operator *() const +{ + return *(_Tp*)(this->ptr); +} + +template inline +MatIterator_<_Tp>& MatIterator_<_Tp>::operator += (ptrdiff_t ofs) +{ + MatConstIterator::operator += (ofs); + return *this; +} + +template inline +MatIterator_<_Tp>& MatIterator_<_Tp>::operator -= (ptrdiff_t ofs) +{ + MatConstIterator::operator += (-ofs); + return *this; +} + +template inline +MatIterator_<_Tp>& MatIterator_<_Tp>::operator --() +{ + MatConstIterator::operator --(); + return *this; +} + +template inline +MatIterator_<_Tp> MatIterator_<_Tp>::operator --(int) +{ + MatIterator_ b = *this; + MatConstIterator::operator --(); + return b; +} + +template inline +MatIterator_<_Tp>& MatIterator_<_Tp>::operator ++() +{ + MatConstIterator::operator ++(); + return *this; +} + +template inline +MatIterator_<_Tp> MatIterator_<_Tp>::operator ++(int) +{ + MatIterator_ b = *this; + MatConstIterator::operator ++(); + return b; +} + +template inline +_Tp& MatIterator_<_Tp>::operator [](ptrdiff_t i) const +{ + return *(*this + i); +} + + +template static inline +bool operator == (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b) +{ + return a.m == b.m && a.ptr == b.ptr; +} + +template static inline +bool operator != (const MatIterator_<_Tp>& a, const MatIterator_<_Tp>& b) +{ + return a.m != b.m || a.ptr != b.ptr; +} + +template static inline +MatIterator_<_Tp> operator + (const MatIterator_<_Tp>& a, ptrdiff_t ofs) +{ + MatConstIterator t = (const MatConstIterator&)a + ofs; + return (MatIterator_<_Tp>&)t; +} + +template static inline +MatIterator_<_Tp> operator + (ptrdiff_t ofs, const MatIterator_<_Tp>& a) +{ + MatConstIterator t = (const MatConstIterator&)a + ofs; + return (MatIterator_<_Tp>&)t; +} + +template static inline +MatIterator_<_Tp> operator - (const MatIterator_<_Tp>& a, ptrdiff_t ofs) +{ + MatConstIterator t = (const MatConstIterator&)a - ofs; + return (MatIterator_<_Tp>&)t; +} + + + +/////////////////////// SparseMatConstIterator ////////////////////// + +inline +SparseMatConstIterator::SparseMatConstIterator() + : m(0), hashidx(0), ptr(0) +{} + +inline +SparseMatConstIterator::SparseMatConstIterator(const SparseMatConstIterator& it) + : m(it.m), hashidx(it.hashidx), ptr(it.ptr) +{} + +inline SparseMatConstIterator& SparseMatConstIterator::operator = (const SparseMatConstIterator& it) +{ + if( this != &it ) + { + m = it.m; + hashidx = it.hashidx; + ptr = it.ptr; + } + return *this; +} + +template inline +const _Tp& SparseMatConstIterator::value() const +{ + return *(const _Tp*)ptr; +} + +inline +const SparseMat::Node* SparseMatConstIterator::node() const +{ + return (ptr && m && m->hdr) ? (const SparseMat::Node*)(const void*)(ptr - m->hdr->valueOffset) : 0; +} + +inline +SparseMatConstIterator SparseMatConstIterator::operator ++(int) +{ + SparseMatConstIterator it = *this; + ++*this; + return it; +} + +inline +void SparseMatConstIterator::seekEnd() +{ + if( m && m->hdr ) + { + hashidx = m->hdr->hashtab.size(); + ptr = 0; + } +} + + +static inline +bool operator == (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2) +{ + return it1.m == it2.m && it1.ptr == it2.ptr; +} + +static inline +bool operator != (const SparseMatConstIterator& it1, const SparseMatConstIterator& it2) +{ + return !(it1 == it2); +} + + + +///////////////////////// SparseMatIterator ///////////////////////// + +inline +SparseMatIterator::SparseMatIterator() +{} + +inline +SparseMatIterator::SparseMatIterator(SparseMat* _m) + : SparseMatConstIterator(_m) +{} + +inline +SparseMatIterator::SparseMatIterator(const SparseMatIterator& it) + : SparseMatConstIterator(it) +{} + +inline +SparseMatIterator& SparseMatIterator::operator = (const SparseMatIterator& it) +{ + (SparseMatConstIterator&)*this = it; + return *this; +} + +template inline +_Tp& SparseMatIterator::value() const +{ + return *(_Tp*)ptr; +} + +inline +SparseMat::Node* SparseMatIterator::node() const +{ + return (SparseMat::Node*)SparseMatConstIterator::node(); +} + +inline +SparseMatIterator& SparseMatIterator::operator ++() +{ + SparseMatConstIterator::operator ++(); + return *this; +} + +inline +SparseMatIterator SparseMatIterator::operator ++(int) +{ + SparseMatIterator it = *this; + ++*this; + return it; +} + + + +////////////////////// SparseMatConstIterator_ ////////////////////// + +template inline +SparseMatConstIterator_<_Tp>::SparseMatConstIterator_() +{} + +template inline +SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat_<_Tp>* _m) + : SparseMatConstIterator(_m) +{} + +template inline +SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat* _m) + : SparseMatConstIterator(_m) +{ + CV_Assert( _m->type() == traits::Type<_Tp>::value ); +} + +template inline +SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it) + : SparseMatConstIterator(it) +{} + +template inline +SparseMatConstIterator_<_Tp>& SparseMatConstIterator_<_Tp>::operator = (const SparseMatConstIterator_<_Tp>& it) +{ + return reinterpret_cast&> + (*reinterpret_cast(this) = + reinterpret_cast(it)); +} + +template inline +const _Tp& SparseMatConstIterator_<_Tp>::operator *() const +{ + return *(const _Tp*)this->ptr; +} + +template inline +SparseMatConstIterator_<_Tp>& SparseMatConstIterator_<_Tp>::operator ++() +{ + SparseMatConstIterator::operator ++(); + return *this; +} + +template inline +SparseMatConstIterator_<_Tp> SparseMatConstIterator_<_Tp>::operator ++(int) +{ + SparseMatConstIterator_<_Tp> it = *this; + SparseMatConstIterator::operator ++(); + return it; +} + + + +///////////////////////// SparseMatIterator_ //////////////////////// + +template inline +SparseMatIterator_<_Tp>::SparseMatIterator_() +{} + +template inline +SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat_<_Tp>* _m) + : SparseMatConstIterator_<_Tp>(_m) +{} + +template inline +SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat* _m) + : SparseMatConstIterator_<_Tp>(_m) +{} + +template inline +SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it) + : SparseMatConstIterator_<_Tp>(it) +{} + +template inline +SparseMatIterator_<_Tp>& SparseMatIterator_<_Tp>::operator = (const SparseMatIterator_<_Tp>& it) +{ + return reinterpret_cast&> + (*reinterpret_cast(this) = + reinterpret_cast(it)); +} + +template inline +_Tp& SparseMatIterator_<_Tp>::operator *() const +{ + return *(_Tp*)this->ptr; +} + +template inline +SparseMatIterator_<_Tp>& SparseMatIterator_<_Tp>::operator ++() +{ + SparseMatConstIterator::operator ++(); + return *this; +} + +template inline +SparseMatIterator_<_Tp> SparseMatIterator_<_Tp>::operator ++(int) +{ + SparseMatIterator_<_Tp> it = *this; + SparseMatConstIterator::operator ++(); + return it; +} + + + +//////////////////////// MatCommaInitializer_ /////////////////////// + +template inline +MatCommaInitializer_<_Tp>::MatCommaInitializer_(Mat_<_Tp>* _m) + : it(_m) +{} + +template template inline +MatCommaInitializer_<_Tp>& MatCommaInitializer_<_Tp>::operator , (T2 v) +{ + CV_DbgAssert( this->it < ((const Mat_<_Tp>*)this->it.m)->end() ); + *this->it = _Tp(v); + ++this->it; + return *this; +} + +template inline +MatCommaInitializer_<_Tp>::operator Mat_<_Tp>() const +{ + CV_DbgAssert( this->it == ((const Mat_<_Tp>*)this->it.m)->end() ); + return Mat_<_Tp>(*this->it.m); +} + + +template static inline +MatCommaInitializer_<_Tp> operator << (const Mat_<_Tp>& m, T2 val) +{ + MatCommaInitializer_<_Tp> commaInitializer((Mat_<_Tp>*)&m); + return (commaInitializer, val); +} + + + +///////////////////////// Matrix Expressions //////////////////////// + +inline +Mat& Mat::operator = (const MatExpr& e) +{ + e.op->assign(e, *this); + return *this; +} + +template inline +Mat_<_Tp>::Mat_(const MatExpr& e) +{ + e.op->assign(e, *this, traits::Type<_Tp>::value); +} + +template inline +Mat_<_Tp>& Mat_<_Tp>::operator = (const MatExpr& e) +{ + e.op->assign(e, *this, traits::Type<_Tp>::value); + return *this; +} + +template inline +MatExpr Mat_<_Tp>::zeros(int rows, int cols) +{ + return Mat::zeros(rows, cols, traits::Type<_Tp>::value); +} + +template inline +MatExpr Mat_<_Tp>::zeros(Size sz) +{ + return Mat::zeros(sz, traits::Type<_Tp>::value); +} + +template inline +MatExpr Mat_<_Tp>::ones(int rows, int cols) +{ + return Mat::ones(rows, cols, traits::Type<_Tp>::value); +} + +template inline +MatExpr Mat_<_Tp>::ones(Size sz) +{ + return Mat::ones(sz, traits::Type<_Tp>::value); +} + +template inline +MatExpr Mat_<_Tp>::eye(int rows, int cols) +{ + return Mat::eye(rows, cols, traits::Type<_Tp>::value); +} + +template inline +MatExpr Mat_<_Tp>::eye(Size sz) +{ + return Mat::eye(sz, traits::Type<_Tp>::value); +} + +inline +MatExpr::MatExpr() + : op(0), flags(0), a(Mat()), b(Mat()), c(Mat()), alpha(0), beta(0), s() +{} + +inline +MatExpr::MatExpr(const MatOp* _op, int _flags, const Mat& _a, const Mat& _b, + const Mat& _c, double _alpha, double _beta, const Scalar& _s) + : op(_op), flags(_flags), a(_a), b(_b), c(_c), alpha(_alpha), beta(_beta), s(_s) +{} + +inline +MatExpr::operator Mat() const +{ + Mat m; + op->assign(*this, m); + return m; +} + +template inline +MatExpr::operator Mat_<_Tp>() const +{ + Mat_<_Tp> m; + op->assign(*this, m, traits::Type<_Tp>::value); + return m; +} + + +template static inline +MatExpr min(const Mat_<_Tp>& a, const Mat_<_Tp>& b) +{ + return cv::min((const Mat&)a, (const Mat&)b); +} + +template static inline +MatExpr min(const Mat_<_Tp>& a, double s) +{ + return cv::min((const Mat&)a, s); +} + +template static inline +MatExpr min(double s, const Mat_<_Tp>& a) +{ + return cv::min((const Mat&)a, s); +} + +template static inline +MatExpr max(const Mat_<_Tp>& a, const Mat_<_Tp>& b) +{ + return cv::max((const Mat&)a, (const Mat&)b); +} + +template static inline +MatExpr max(const Mat_<_Tp>& a, double s) +{ + return cv::max((const Mat&)a, s); +} + +template static inline +MatExpr max(double s, const Mat_<_Tp>& a) +{ + return cv::max((const Mat&)a, s); +} + +template static inline +MatExpr abs(const Mat_<_Tp>& m) +{ + return cv::abs((const Mat&)m); +} + + +static inline +Mat& operator += (Mat& a, const MatExpr& b) +{ + b.op->augAssignAdd(b, a); + return a; +} + +static inline +const Mat& operator += (const Mat& a, const MatExpr& b) +{ + b.op->augAssignAdd(b, (Mat&)a); + return a; +} + +template static inline +Mat_<_Tp>& operator += (Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignAdd(b, a); + return a; +} + +template static inline +const Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignAdd(b, (Mat&)a); + return a; +} + +static inline +Mat& operator -= (Mat& a, const MatExpr& b) +{ + b.op->augAssignSubtract(b, a); + return a; +} + +static inline +const Mat& operator -= (const Mat& a, const MatExpr& b) +{ + b.op->augAssignSubtract(b, (Mat&)a); + return a; +} + +template static inline +Mat_<_Tp>& operator -= (Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignSubtract(b, a); + return a; +} + +template static inline +const Mat_<_Tp>& operator -= (const Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignSubtract(b, (Mat&)a); + return a; +} + +static inline +Mat& operator *= (Mat& a, const MatExpr& b) +{ + b.op->augAssignMultiply(b, a); + return a; +} + +static inline +const Mat& operator *= (const Mat& a, const MatExpr& b) +{ + b.op->augAssignMultiply(b, (Mat&)a); + return a; +} + +template static inline +Mat_<_Tp>& operator *= (Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignMultiply(b, a); + return a; +} + +template static inline +const Mat_<_Tp>& operator *= (const Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignMultiply(b, (Mat&)a); + return a; +} + +static inline +Mat& operator /= (Mat& a, const MatExpr& b) +{ + b.op->augAssignDivide(b, a); + return a; +} + +static inline +const Mat& operator /= (const Mat& a, const MatExpr& b) +{ + b.op->augAssignDivide(b, (Mat&)a); + return a; +} + +template static inline +Mat_<_Tp>& operator /= (Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignDivide(b, a); + return a; +} + +template static inline +const Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const MatExpr& b) +{ + b.op->augAssignDivide(b, (Mat&)a); + return a; +} + + +//////////////////////////////// UMat //////////////////////////////// + +template inline +UMat::UMat(const std::vector<_Tp>& vec, bool copyData) +: flags(MAGIC_VAL + traits::Type<_Tp>::value + CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()), +cols(1), allocator(0), usageFlags(USAGE_DEFAULT), u(0), offset(0), size(&rows) +{ + if(vec.empty()) + return; + if( !copyData ) + { + // !!!TODO!!! + CV_Error(Error::StsNotImplemented, ""); + } + else + Mat((int)vec.size(), 1, traits::Type<_Tp>::value, (uchar*)&vec[0]).copyTo(*this); +} + +inline +UMat UMat::row(int y) const +{ + return UMat(*this, Range(y, y + 1), Range::all()); +} + +inline +UMat UMat::col(int x) const +{ + return UMat(*this, Range::all(), Range(x, x + 1)); +} + +inline +UMat UMat::rowRange(int startrow, int endrow) const +{ + return UMat(*this, Range(startrow, endrow), Range::all()); +} + +inline +UMat UMat::rowRange(const Range& r) const +{ + return UMat(*this, r, Range::all()); +} + +inline +UMat UMat::colRange(int startcol, int endcol) const +{ + return UMat(*this, Range::all(), Range(startcol, endcol)); +} + +inline +UMat UMat::colRange(const Range& r) const +{ + return UMat(*this, Range::all(), r); +} + +inline +UMat UMat::operator()( Range _rowRange, Range _colRange ) const +{ + return UMat(*this, _rowRange, _colRange); +} + +inline +UMat UMat::operator()( const Rect& roi ) const +{ + return UMat(*this, roi); +} + +inline +UMat UMat::operator()(const Range* ranges) const +{ + return UMat(*this, ranges); +} + +inline +UMat UMat::operator()(const std::vector& ranges) const +{ + return UMat(*this, ranges); +} + +inline +bool UMat::isContinuous() const +{ + return (flags & CONTINUOUS_FLAG) != 0; +} + +inline +bool UMat::isSubmatrix() const +{ + return (flags & SUBMATRIX_FLAG) != 0; +} + +inline +size_t UMat::elemSize() const +{ + size_t res = dims > 0 ? step.p[dims - 1] : 0; + CV_DbgAssert(res != 0); + return res; +} + +inline +size_t UMat::elemSize1() const +{ + return CV_ELEM_SIZE1(flags); +} + +inline +int UMat::type() const +{ + return CV_MAT_TYPE(flags); +} + +inline +int UMat::depth() const +{ + return CV_MAT_DEPTH(flags); +} + +inline +int UMat::channels() const +{ + return CV_MAT_CN(flags); +} + +inline +size_t UMat::step1(int i) const +{ + return step.p[i] / elemSize1(); +} + + +inline bool UMatData::hostCopyObsolete() const { return (flags & HOST_COPY_OBSOLETE) != 0; } +inline bool UMatData::deviceCopyObsolete() const { return (flags & DEVICE_COPY_OBSOLETE) != 0; } +inline bool UMatData::deviceMemMapped() const { return (flags & DEVICE_MEM_MAPPED) != 0; } +inline bool UMatData::copyOnMap() const { return (flags & COPY_ON_MAP) != 0; } +inline bool UMatData::tempUMat() const { return (flags & TEMP_UMAT) != 0; } +inline bool UMatData::tempCopiedUMat() const { return (flags & TEMP_COPIED_UMAT) == TEMP_COPIED_UMAT; } + +inline void UMatData::markDeviceMemMapped(bool flag) +{ + if(flag) + flags |= DEVICE_MEM_MAPPED; + else + flags &= ~DEVICE_MEM_MAPPED; +} + +inline void UMatData::markHostCopyObsolete(bool flag) +{ + if(flag) + flags |= HOST_COPY_OBSOLETE; + else + flags &= ~HOST_COPY_OBSOLETE; +} +inline void UMatData::markDeviceCopyObsolete(bool flag) +{ + if(flag) + flags |= DEVICE_COPY_OBSOLETE; + else + flags &= ~DEVICE_COPY_OBSOLETE; +} + +//! @endcond + +static inline +void swap(MatExpr& a, MatExpr& b) { a.swap(b); } + +} //cv + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#ifdef CV_DISABLE_CLANG_ENUM_WARNINGS +#undef CV_DISABLE_CLANG_ENUM_WARNINGS +#pragma clang diagnostic pop +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/matx.hpp b/Thirdparty/opencv2/include/opencv2/core/matx.hpp new file mode 100644 index 0000000..d671685 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/matx.hpp @@ -0,0 +1,1536 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_MATX_HPP +#define OPENCV_CORE_MATX_HPP + +#ifndef __cplusplus +# error matx.hpp header must be compiled as C++ +#endif + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/base.hpp" +#include "opencv2/core/traits.hpp" +#include "opencv2/core/saturate.hpp" + +#include + +namespace cv +{ + +//! @addtogroup core_basic +//! @{ + +////////////////////////////// Small Matrix /////////////////////////// + +//! @cond IGNORED +// FIXIT Remove this (especially CV_EXPORTS modifier) +struct CV_EXPORTS Matx_AddOp { Matx_AddOp() {} Matx_AddOp(const Matx_AddOp&) {} }; +struct CV_EXPORTS Matx_SubOp { Matx_SubOp() {} Matx_SubOp(const Matx_SubOp&) {} }; +struct CV_EXPORTS Matx_ScaleOp { Matx_ScaleOp() {} Matx_ScaleOp(const Matx_ScaleOp&) {} }; +struct CV_EXPORTS Matx_MulOp { Matx_MulOp() {} Matx_MulOp(const Matx_MulOp&) {} }; +struct CV_EXPORTS Matx_DivOp { Matx_DivOp() {} Matx_DivOp(const Matx_DivOp&) {} }; +struct CV_EXPORTS Matx_MatMulOp { Matx_MatMulOp() {} Matx_MatMulOp(const Matx_MatMulOp&) {} }; +struct CV_EXPORTS Matx_TOp { Matx_TOp() {} Matx_TOp(const Matx_TOp&) {} }; +//! @endcond + +/** @brief Template class for small matrices whose type and size are known at compilation time + +If you need a more flexible type, use Mat . The elements of the matrix M are accessible using the +M(i,j) notation. Most of the common matrix operations (see also @ref MatrixExpressions ) are +available. To do an operation on Matx that is not implemented, you can easily convert the matrix to +Mat and backwards: +@code{.cpp} + Matx33f m(1, 2, 3, + 4, 5, 6, + 7, 8, 9); + cout << sum(Mat(m*m.t())) << endl; +@endcode +Except of the plain constructor which takes a list of elements, Matx can be initialized from a C-array: +@code{.cpp} + float values[] = { 1, 2, 3}; + Matx31f m(values); +@endcode +In case if C++11 features are available, std::initializer_list can be also used to initialize Matx: +@code{.cpp} + Matx31f m = { 1, 2, 3}; +@endcode + */ +template class Matx +{ +public: + enum { + rows = m, + cols = n, + channels = rows*cols, +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + depth = traits::Type<_Tp>::value, + type = CV_MAKETYPE(depth, channels), +#endif + shortdim = (m < n ? m : n) + }; + + typedef _Tp value_type; + typedef Matx<_Tp, m, n> mat_type; + typedef Matx<_Tp, shortdim, 1> diag_type; + + //! default constructor + Matx(); + + explicit Matx(_Tp v0); //!< 1x1 matrix + Matx(_Tp v0, _Tp v1); //!< 1x2 or 2x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2); //!< 1x3 or 3x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3); //!< 1x4, 2x2 or 4x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4); //!< 1x5 or 5x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5); //!< 1x6, 2x3, 3x2 or 6x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6); //!< 1x7 or 7x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7); //!< 1x8, 2x4, 4x2 or 8x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8); //!< 1x9, 3x3 or 9x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9); //!< 1x10, 2x5 or 5x2 or 10x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, + _Tp v4, _Tp v5, _Tp v6, _Tp v7, + _Tp v8, _Tp v9, _Tp v10, _Tp v11); //!< 1x12, 2x6, 3x4, 4x3, 6x2 or 12x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, + _Tp v4, _Tp v5, _Tp v6, _Tp v7, + _Tp v8, _Tp v9, _Tp v10, _Tp v11, + _Tp v12, _Tp v13); //!< 1x14, 2x7, 7x2 or 14x1 matrix + Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, + _Tp v4, _Tp v5, _Tp v6, _Tp v7, + _Tp v8, _Tp v9, _Tp v10, _Tp v11, + _Tp v12, _Tp v13, _Tp v14, _Tp v15); //!< 1x16, 4x4 or 16x1 matrix + explicit Matx(const _Tp* vals); //!< initialize from a plain array + + Matx(std::initializer_list<_Tp>); //!< initialize from an initializer list + + CV_NODISCARD_STD static Matx all(_Tp alpha); + CV_NODISCARD_STD static Matx zeros(); + CV_NODISCARD_STD static Matx ones(); + CV_NODISCARD_STD static Matx eye(); + CV_NODISCARD_STD static Matx diag(const diag_type& d); + /** @brief Generates uniformly distributed random numbers + @param a Range boundary. + @param b The other range boundary (boundaries don't have to be ordered, the lower boundary is inclusive, + the upper one is exclusive). + */ + CV_NODISCARD_STD static Matx randu(_Tp a, _Tp b); + /** @brief Generates normally distributed random numbers + @param a Mean value. + @param b Standard deviation. + */ + CV_NODISCARD_STD static Matx randn(_Tp a, _Tp b); + + //! dot product computed with the default precision + _Tp dot(const Matx<_Tp, m, n>& v) const; + + //! dot product computed in double-precision arithmetics + double ddot(const Matx<_Tp, m, n>& v) const; + + //! conversion to another data type + template operator Matx() const; + + //! change the matrix shape + template Matx<_Tp, m1, n1> reshape() const; + + //! extract part of the matrix + template Matx<_Tp, m1, n1> get_minor(int base_row, int base_col) const; + + //! extract the matrix row + Matx<_Tp, 1, n> row(int i) const; + + //! extract the matrix column + Matx<_Tp, m, 1> col(int i) const; + + //! extract the matrix diagonal + diag_type diag() const; + + //! transpose the matrix + Matx<_Tp, n, m> t() const; + + //! invert the matrix + Matx<_Tp, n, m> inv(int method=DECOMP_LU, bool *p_is_ok = NULL) const; + + //! solve linear system + template Matx<_Tp, n, l> solve(const Matx<_Tp, m, l>& rhs, int flags=DECOMP_LU) const; + Vec<_Tp, n> solve(const Vec<_Tp, m>& rhs, int method) const; + + //! multiply two matrices element-wise + Matx<_Tp, m, n> mul(const Matx<_Tp, m, n>& a) const; + + //! divide two matrices element-wise + Matx<_Tp, m, n> div(const Matx<_Tp, m, n>& a) const; + + //! element access + const _Tp& operator ()(int row, int col) const; + _Tp& operator ()(int row, int col); + + //! 1D element access + const _Tp& operator ()(int i) const; + _Tp& operator ()(int i); + + Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_AddOp); + Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_SubOp); + template Matx(const Matx<_Tp, m, n>& a, _T2 alpha, Matx_ScaleOp); + Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_MulOp); + Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_DivOp); + template Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp); + Matx(const Matx<_Tp, n, m>& a, Matx_TOp); + + _Tp val[m*n]; ///< matrix elements +}; + +typedef Matx Matx12f; +typedef Matx Matx12d; +typedef Matx Matx13f; +typedef Matx Matx13d; +typedef Matx Matx14f; +typedef Matx Matx14d; +typedef Matx Matx16f; +typedef Matx Matx16d; + +typedef Matx Matx21f; +typedef Matx Matx21d; +typedef Matx Matx31f; +typedef Matx Matx31d; +typedef Matx Matx41f; +typedef Matx Matx41d; +typedef Matx Matx61f; +typedef Matx Matx61d; + +typedef Matx Matx22f; +typedef Matx Matx22d; +typedef Matx Matx23f; +typedef Matx Matx23d; +typedef Matx Matx32f; +typedef Matx Matx32d; + +typedef Matx Matx33f; +typedef Matx Matx33d; + +typedef Matx Matx34f; +typedef Matx Matx34d; +typedef Matx Matx43f; +typedef Matx Matx43d; + +typedef Matx Matx44f; +typedef Matx Matx44d; +typedef Matx Matx66f; +typedef Matx Matx66d; + +/*! + traits +*/ +template class DataType< Matx<_Tp, m, n> > +{ +public: + typedef Matx<_Tp, m, n> value_type; + typedef Matx::work_type, m, n> work_type; + typedef _Tp channel_type; + typedef value_type vec_type; + + enum { generic_type = 0, + channels = m * n, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; +}; + +namespace traits { +template +struct Depth< Matx<_Tp, m, n> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Matx<_Tp, m, n> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, n*m) }; }; +} // namespace + + +/** @brief Comma-separated Matrix Initializer +*/ +template class MatxCommaInitializer +{ +public: + MatxCommaInitializer(Matx<_Tp, m, n>* _mtx); + template MatxCommaInitializer<_Tp, m, n>& operator , (T2 val); + Matx<_Tp, m, n> operator *() const; + + Matx<_Tp, m, n>* dst; + int idx; +}; + +/* + Utility methods +*/ +template static double determinant(const Matx<_Tp, m, m>& a); +template static double trace(const Matx<_Tp, m, n>& a); +template static double norm(const Matx<_Tp, m, n>& M); +template static double norm(const Matx<_Tp, m, n>& M, int normType); + + + +/////////////////////// Vec (used as element of multi-channel images ///////////////////// + +/** @brief Template class for short numerical vectors, a partial case of Matx + +This template class represents short numerical vectors (of 1, 2, 3, 4 ... elements) on which you +can perform basic arithmetical operations, access individual elements using [] operator etc. The +vectors are allocated on stack, as opposite to std::valarray, std::vector, cv::Mat etc., which +elements are dynamically allocated in the heap. + +The template takes 2 parameters: +@tparam _Tp element type +@tparam cn the number of elements + +In addition to the universal notation like Vec, you can use shorter aliases +for the most popular specialized variants of Vec, e.g. Vec3f ~ Vec. + +It is possible to convert Vec\ to/from Point_, Vec\ to/from Point3_ , and Vec\ +to CvScalar or Scalar_. Use operator[] to access the elements of Vec. + +All the expected vector operations are also implemented: +- v1 = v2 + v3 +- v1 = v2 - v3 +- v1 = v2 \* scale +- v1 = scale \* v2 +- v1 = -v2 +- v1 += v2 and other augmenting operations +- v1 == v2, v1 != v2 +- norm(v1) (euclidean norm) +The Vec class is commonly used to describe pixel types of multi-channel arrays. See Mat for details. +*/ +template class Vec : public Matx<_Tp, cn, 1> +{ +public: + typedef _Tp value_type; + enum { + channels = cn, +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + depth = Matx<_Tp, cn, 1>::depth, + type = CV_MAKETYPE(depth, channels), +#endif + _dummy_enum_finalizer = 0 + }; + + //! default constructor + Vec(); + + Vec(_Tp v0); //!< 1-element vector constructor + Vec(_Tp v0, _Tp v1); //!< 2-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2); //!< 3-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3); //!< 4-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4); //!< 5-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5); //!< 6-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6); //!< 7-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7); //!< 8-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8); //!< 9-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9); //!< 10-element vector constructor + Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13); //!< 14-element vector constructor + explicit Vec(const _Tp* values); + + Vec(std::initializer_list<_Tp>); + + Vec(const Vec<_Tp, cn>& v); + + static Vec all(_Tp alpha); + static Vec ones(); + static Vec randn(_Tp a, _Tp b); + static Vec randu(_Tp a, _Tp b); + static Vec zeros(); +#ifdef CV_CXX11 + static Vec diag(_Tp alpha) = delete; + static Vec eye() = delete; +#endif + + //! per-element multiplication + Vec mul(const Vec<_Tp, cn>& v) const; + + //! conjugation (makes sense for complex numbers and quaternions) + Vec conj() const; + + /*! + cross product of the two 3D vectors. + + For other dimensionalities the exception is raised + */ + Vec cross(const Vec& v) const; + //! conversion to another data type + template operator Vec() const; + + /*! element access */ + const _Tp& operator [](int i) const; + _Tp& operator[](int i); + const _Tp& operator ()(int i) const; + _Tp& operator ()(int i); + +#ifdef CV_CXX11 + Vec<_Tp, cn>& operator=(const Vec<_Tp, cn>& rhs) = default; +#endif + + Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp); + Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp); + template Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp); +}; + +/** @name Shorter aliases for the most popular specializations of Vec + @{ +*/ +typedef Vec Vec2b; +typedef Vec Vec3b; +typedef Vec Vec4b; + +typedef Vec Vec2s; +typedef Vec Vec3s; +typedef Vec Vec4s; + +typedef Vec Vec2w; +typedef Vec Vec3w; +typedef Vec Vec4w; + +typedef Vec Vec2i; +typedef Vec Vec3i; +typedef Vec Vec4i; +typedef Vec Vec6i; +typedef Vec Vec8i; + +typedef Vec Vec2f; +typedef Vec Vec3f; +typedef Vec Vec4f; +typedef Vec Vec6f; + +typedef Vec Vec2d; +typedef Vec Vec3d; +typedef Vec Vec4d; +typedef Vec Vec6d; +/** @} */ + +/*! + traits +*/ +template class DataType< Vec<_Tp, cn> > +{ +public: + typedef Vec<_Tp, cn> value_type; + typedef Vec::work_type, cn> work_type; + typedef _Tp channel_type; + typedef value_type vec_type; + + enum { generic_type = 0, + channels = cn, + fmt = DataType::fmt + ((channels - 1) << 8), +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + depth = DataType::depth, + type = CV_MAKETYPE(depth, channels), +#endif + _dummy_enum_finalizer = 0 + }; +}; + +namespace traits { +template +struct Depth< Vec<_Tp, cn> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Vec<_Tp, cn> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, cn) }; }; +} // namespace + + +/** @brief Comma-separated Vec Initializer +*/ +template class VecCommaInitializer : public MatxCommaInitializer<_Tp, m, 1> +{ +public: + VecCommaInitializer(Vec<_Tp, m>* _vec); + template VecCommaInitializer<_Tp, m>& operator , (T2 val); + Vec<_Tp, m> operator *() const; +}; + +template static Vec<_Tp, cn> normalize(const Vec<_Tp, cn>& v); + +//! @} core_basic + +//! @cond IGNORED + +///////////////////////////////////// helper classes ///////////////////////////////////// +namespace internal +{ + +template struct Matx_DetOp +{ + double operator ()(const Matx<_Tp, m, m>& a) const + { + Matx<_Tp, m, m> temp = a; + double p = LU(temp.val, m*sizeof(_Tp), m, 0, 0, 0); + if( p == 0 ) + return p; + for( int i = 0; i < m; i++ ) + p *= temp(i, i); + return p; + } +}; + +template struct Matx_DetOp<_Tp, 1> +{ + double operator ()(const Matx<_Tp, 1, 1>& a) const + { + return a(0,0); + } +}; + +template struct Matx_DetOp<_Tp, 2> +{ + double operator ()(const Matx<_Tp, 2, 2>& a) const + { + return a(0,0)*a(1,1) - a(0,1)*a(1,0); + } +}; + +template struct Matx_DetOp<_Tp, 3> +{ + double operator ()(const Matx<_Tp, 3, 3>& a) const + { + return a(0,0)*(a(1,1)*a(2,2) - a(2,1)*a(1,2)) - + a(0,1)*(a(1,0)*a(2,2) - a(2,0)*a(1,2)) + + a(0,2)*(a(1,0)*a(2,1) - a(2,0)*a(1,1)); + } +}; + +template Vec<_Tp, 2> inline conjugate(const Vec<_Tp, 2>& v) +{ + return Vec<_Tp, 2>(v[0], -v[1]); +} + +template Vec<_Tp, 4> inline conjugate(const Vec<_Tp, 4>& v) +{ + return Vec<_Tp, 4>(v[0], -v[1], -v[2], -v[3]); +} + +} // internal + + + +////////////////////////////////// Matx Implementation /////////////////////////////////// + +template inline +Matx<_Tp, m, n>::Matx() +{ + for(int i = 0; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0) +{ + val[0] = v0; + for(int i = 1; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1) +{ + CV_StaticAssert(channels >= 2, "Matx should have at least 2 elements."); + val[0] = v0; val[1] = v1; + for(int i = 2; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2) +{ + CV_StaticAssert(channels >= 3, "Matx should have at least 3 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; + for(int i = 3; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3) +{ + CV_StaticAssert(channels >= 4, "Matx should have at least 4 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + for(int i = 4; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4) +{ + CV_StaticAssert(channels >= 5, "Matx should have at least 5 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; val[4] = v4; + for(int i = 5; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5) +{ + CV_StaticAssert(channels >= 6, "Matx should have at least 6 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; + for(int i = 6; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6) +{ + CV_StaticAssert(channels >= 7, "Matx should have at least 7 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; + for(int i = 7; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7) +{ + CV_StaticAssert(channels >= 8, "Matx should have at least 8 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + for(int i = 8; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8) +{ + CV_StaticAssert(channels >= 9, "Matx should have at least 9 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + val[8] = v8; + for(int i = 9; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp, m, n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9) +{ + CV_StaticAssert(channels >= 10, "Matx should have at least 10 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + val[8] = v8; val[9] = v9; + for(int i = 10; i < channels; i++) val[i] = _Tp(0); +} + + +template inline +Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11) +{ + CV_StaticAssert(channels >= 12, "Matx should have at least 12 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11; + for(int i = 12; i < channels; i++) val[i] = _Tp(0); +} + +template inline +Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13) +{ + CV_StaticAssert(channels >= 14, "Matx should have at least 14 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11; + val[12] = v12; val[13] = v13; + for (int i = 14; i < channels; i++) val[i] = _Tp(0); +} + + +template inline +Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13, _Tp v14, _Tp v15) +{ + CV_StaticAssert(channels >= 16, "Matx should have at least 16 elements."); + val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3; + val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7; + val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11; + val[12] = v12; val[13] = v13; val[14] = v14; val[15] = v15; + for(int i = 16; i < channels; i++) val[i] = _Tp(0); +} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +template inline +Matx<_Tp, m, n>::Matx(const _Tp* values) +{ + for( int i = 0; i < channels; i++ ) val[i] = values[i]; +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +template inline +Matx<_Tp, m, n>::Matx(std::initializer_list<_Tp> list) +{ + CV_DbgAssert(list.size() == channels); + int i = 0; + for(const auto& elem : list) + { + val[i++] = elem; + } +} + +template inline +Matx<_Tp, m, n> Matx<_Tp, m, n>::all(_Tp alpha) +{ + Matx<_Tp, m, n> M; + for( int i = 0; i < m*n; i++ ) M.val[i] = alpha; + return M; +} + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::zeros() +{ + return all(0); +} + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::ones() +{ + return all(1); +} + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::eye() +{ + Matx<_Tp,m,n> M; + for(int i = 0; i < shortdim; i++) + M(i,i) = 1; + return M; +} + +template inline +_Tp Matx<_Tp, m, n>::dot(const Matx<_Tp, m, n>& M) const +{ + _Tp s = 0; + for( int i = 0; i < channels; i++ ) s += val[i]*M.val[i]; + return s; +} + +template inline +double Matx<_Tp, m, n>::ddot(const Matx<_Tp, m, n>& M) const +{ + double s = 0; + for( int i = 0; i < channels; i++ ) s += (double)val[i]*M.val[i]; + return s; +} + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::diag(const typename Matx<_Tp,m,n>::diag_type& d) +{ + Matx<_Tp,m,n> M; + for(int i = 0; i < shortdim; i++) + M(i,i) = d(i, 0); + return M; +} + +template template +inline Matx<_Tp, m, n>::operator Matx() const +{ + Matx M; + for( int i = 0; i < m*n; i++ ) M.val[i] = saturate_cast(val[i]); + return M; +} + +template template inline +Matx<_Tp, m1, n1> Matx<_Tp, m, n>::reshape() const +{ + CV_StaticAssert(m1*n1 == m*n, "Input and destnarion matrices must have the same number of elements"); + return (const Matx<_Tp, m1, n1>&)*this; +} + +template +template inline +Matx<_Tp, m1, n1> Matx<_Tp, m, n>::get_minor(int base_row, int base_col) const +{ + CV_DbgAssert(0 <= base_row && base_row+m1 <= m && 0 <= base_col && base_col+n1 <= n); + Matx<_Tp, m1, n1> s; + for( int di = 0; di < m1; di++ ) + for( int dj = 0; dj < n1; dj++ ) + s(di, dj) = (*this)(base_row+di, base_col+dj); + return s; +} + +template inline +Matx<_Tp, 1, n> Matx<_Tp, m, n>::row(int i) const +{ + CV_DbgAssert((unsigned)i < (unsigned)m); + return Matx<_Tp, 1, n>(&val[i*n]); +} + +template inline +Matx<_Tp, m, 1> Matx<_Tp, m, n>::col(int j) const +{ + CV_DbgAssert((unsigned)j < (unsigned)n); + Matx<_Tp, m, 1> v; + for( int i = 0; i < m; i++ ) + v.val[i] = val[i*n + j]; + return v; +} + +template inline +typename Matx<_Tp, m, n>::diag_type Matx<_Tp, m, n>::diag() const +{ + diag_type d; + for( int i = 0; i < shortdim; i++ ) + d.val[i] = val[i*n + i]; + return d; +} + +template inline +const _Tp& Matx<_Tp, m, n>::operator()(int row_idx, int col_idx) const +{ + CV_DbgAssert( (unsigned)row_idx < (unsigned)m && (unsigned)col_idx < (unsigned)n ); + return this->val[row_idx*n + col_idx]; +} + +template inline +_Tp& Matx<_Tp, m, n>::operator ()(int row_idx, int col_idx) +{ + CV_DbgAssert( (unsigned)row_idx < (unsigned)m && (unsigned)col_idx < (unsigned)n ); + return val[row_idx*n + col_idx]; +} + +template inline +const _Tp& Matx<_Tp, m, n>::operator ()(int i) const +{ + CV_StaticAssert(m == 1 || n == 1, "Single index indexation requires matrix to be a column or a row"); + CV_DbgAssert( (unsigned)i < (unsigned)(m+n-1) ); + return val[i]; +} + +template inline +_Tp& Matx<_Tp, m, n>::operator ()(int i) +{ + CV_StaticAssert(m == 1 || n == 1, "Single index indexation requires matrix to be a column or a row"); + CV_DbgAssert( (unsigned)i < (unsigned)(m+n-1) ); + return val[i]; +} + +template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_AddOp) +{ + for( int i = 0; i < channels; i++ ) + val[i] = saturate_cast<_Tp>(a.val[i] + b.val[i]); +} + +template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_SubOp) +{ + for( int i = 0; i < channels; i++ ) + val[i] = saturate_cast<_Tp>(a.val[i] - b.val[i]); +} + +template template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, _T2 alpha, Matx_ScaleOp) +{ + for( int i = 0; i < channels; i++ ) + val[i] = saturate_cast<_Tp>(a.val[i] * alpha); +} + +template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_MulOp) +{ + for( int i = 0; i < channels; i++ ) + val[i] = saturate_cast<_Tp>(a.val[i] * b.val[i]); +} + +template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_DivOp) +{ + for( int i = 0; i < channels; i++ ) + val[i] = saturate_cast<_Tp>(a.val[i] / b.val[i]); +} + +template template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp) +{ + for( int i = 0; i < m; i++ ) + for( int j = 0; j < n; j++ ) + { + _Tp s = 0; + for( int k = 0; k < l; k++ ) + s += a(i, k) * b(k, j); + val[i*n + j] = s; + } +} + +template inline +Matx<_Tp,m,n>::Matx(const Matx<_Tp, n, m>& a, Matx_TOp) +{ + for( int i = 0; i < m; i++ ) + for( int j = 0; j < n; j++ ) + val[i*n + j] = a(j, i); +} + +template inline +Matx<_Tp, m, n> Matx<_Tp, m, n>::mul(const Matx<_Tp, m, n>& a) const +{ + return Matx<_Tp, m, n>(*this, a, Matx_MulOp()); +} + +template inline +Matx<_Tp, m, n> Matx<_Tp, m, n>::div(const Matx<_Tp, m, n>& a) const +{ + return Matx<_Tp, m, n>(*this, a, Matx_DivOp()); +} + +template inline +Matx<_Tp, n, m> Matx<_Tp, m, n>::t() const +{ + return Matx<_Tp, n, m>(*this, Matx_TOp()); +} + +template inline +Vec<_Tp, n> Matx<_Tp, m, n>::solve(const Vec<_Tp, m>& rhs, int method) const +{ + Matx<_Tp, n, 1> x = solve((const Matx<_Tp, m, 1>&)(rhs), method); + return (Vec<_Tp, n>&)(x); +} + +template static inline +double determinant(const Matx<_Tp, m, m>& a) +{ + return cv::internal::Matx_DetOp<_Tp, m>()(a); +} + +template static inline +double trace(const Matx<_Tp, m, n>& a) +{ + _Tp s = 0; + for( int i = 0; i < std::min(m, n); i++ ) + s += a(i,i); + return s; +} + +template static inline +double norm(const Matx<_Tp, m, n>& M) +{ + return std::sqrt(normL2Sqr<_Tp, double>(M.val, m*n)); +} + +template static inline +double norm(const Matx<_Tp, m, n>& M, int normType) +{ + switch(normType) { + case NORM_INF: + return (double)normInf<_Tp, typename DataType<_Tp>::work_type>(M.val, m*n); + case NORM_L1: + return (double)normL1<_Tp, typename DataType<_Tp>::work_type>(M.val, m*n); + case NORM_L2SQR: + return (double)normL2Sqr<_Tp, typename DataType<_Tp>::work_type>(M.val, m*n); + default: + case NORM_L2: + return std::sqrt((double)normL2Sqr<_Tp, typename DataType<_Tp>::work_type>(M.val, m*n)); + } +} + + + +//////////////////////////////// matx comma initializer ////////////////////////////////// + +template static inline +MatxCommaInitializer<_Tp, m, n> operator << (const Matx<_Tp, m, n>& mtx, _T2 val) +{ + MatxCommaInitializer<_Tp, m, n> commaInitializer((Matx<_Tp, m, n>*)&mtx); + return (commaInitializer, val); +} + +template inline +MatxCommaInitializer<_Tp, m, n>::MatxCommaInitializer(Matx<_Tp, m, n>* _mtx) + : dst(_mtx), idx(0) +{} + +template template inline +MatxCommaInitializer<_Tp, m, n>& MatxCommaInitializer<_Tp, m, n>::operator , (_T2 value) +{ + CV_DbgAssert( idx < m*n ); + dst->val[idx++] = saturate_cast<_Tp>(value); + return *this; +} + +template inline +Matx<_Tp, m, n> MatxCommaInitializer<_Tp, m, n>::operator *() const +{ + CV_DbgAssert( idx == n*m ); + return *dst; +} + + + +/////////////////////////////////// Vec Implementation /////////////////////////////////// + +template inline +Vec<_Tp, cn>::Vec() {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0) + : Matx<_Tp, cn, 1>(v0) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1) + : Matx<_Tp, cn, 1>(v0, v1) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2) + : Matx<_Tp, cn, 1>(v0, v1, v2) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5, v6) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5, v6, v7) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5, v6, v7, v8) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {} + +template inline +Vec<_Tp, cn>::Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13) + : Matx<_Tp, cn, 1>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) {} + +template inline +Vec<_Tp, cn>::Vec(const _Tp* values) + : Matx<_Tp, cn, 1>(values) {} + +template inline +Vec<_Tp, cn>::Vec(std::initializer_list<_Tp> list) + : Matx<_Tp, cn, 1>(list) {} + +template inline +Vec<_Tp, cn>::Vec(const Vec<_Tp, cn>& m) + : Matx<_Tp, cn, 1>(m.val) {} + +template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp op) + : Matx<_Tp, cn, 1>(a, b, op) {} + +template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp op) + : Matx<_Tp, cn, 1>(a, b, op) {} + +template template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp op) + : Matx<_Tp, cn, 1>(a, alpha, op) {} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::all(_Tp alpha) +{ + Vec v; + for( int i = 0; i < cn; i++ ) v.val[i] = alpha; + return v; +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::ones() +{ + return Vec::all(1); +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::zeros() +{ + return Vec::all(0); +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::mul(const Vec<_Tp, cn>& v) const +{ + Vec<_Tp, cn> w; + for( int i = 0; i < cn; i++ ) w.val[i] = saturate_cast<_Tp>(this->val[i]*v.val[i]); + return w; +} + +template<> inline +Vec Vec::conj() const +{ + return cv::internal::conjugate(*this); +} + +template<> inline +Vec Vec::conj() const +{ + return cv::internal::conjugate(*this); +} + +template<> inline +Vec Vec::conj() const +{ + return cv::internal::conjugate(*this); +} + +template<> inline +Vec Vec::conj() const +{ + return cv::internal::conjugate(*this); +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::cross(const Vec<_Tp, cn>&) const +{ + CV_StaticAssert(cn == 3, "for arbitrary-size vector there is no cross-product defined"); + return Vec<_Tp, cn>(); +} + +template<> inline +Vec Vec::cross(const Vec& v) const +{ + return Vec(this->val[1]*v.val[2] - this->val[2]*v.val[1], + this->val[2]*v.val[0] - this->val[0]*v.val[2], + this->val[0]*v.val[1] - this->val[1]*v.val[0]); +} + +template<> inline +Vec Vec::cross(const Vec& v) const +{ + return Vec(this->val[1]*v.val[2] - this->val[2]*v.val[1], + this->val[2]*v.val[0] - this->val[0]*v.val[2], + this->val[0]*v.val[1] - this->val[1]*v.val[0]); +} + +template template inline +Vec<_Tp, cn>::operator Vec() const +{ + Vec v; + for( int i = 0; i < cn; i++ ) v.val[i] = saturate_cast(this->val[i]); + return v; +} + +template inline +const _Tp& Vec<_Tp, cn>::operator [](int i) const +{ + CV_DbgAssert( (unsigned)i < (unsigned)cn ); + return this->val[i]; +} + +template inline +_Tp& Vec<_Tp, cn>::operator [](int i) +{ + CV_DbgAssert( (unsigned)i < (unsigned)cn ); + return this->val[i]; +} + +template inline +const _Tp& Vec<_Tp, cn>::operator ()(int i) const +{ + CV_DbgAssert( (unsigned)i < (unsigned)cn ); + return this->val[i]; +} + +template inline +_Tp& Vec<_Tp, cn>::operator ()(int i) +{ + CV_DbgAssert( (unsigned)i < (unsigned)cn ); + return this->val[i]; +} + +template inline +Vec<_Tp, cn> normalize(const Vec<_Tp, cn>& v) +{ + double nv = norm(v); + return v * (nv ? 1./nv : 0.); +} + + + +//////////////////////////////// vec comma initializer ////////////////////////////////// + + +template static inline +VecCommaInitializer<_Tp, cn> operator << (const Vec<_Tp, cn>& vec, _T2 val) +{ + VecCommaInitializer<_Tp, cn> commaInitializer((Vec<_Tp, cn>*)&vec); + return (commaInitializer, val); +} + +template inline +VecCommaInitializer<_Tp, cn>::VecCommaInitializer(Vec<_Tp, cn>* _vec) + : MatxCommaInitializer<_Tp, cn, 1>(_vec) +{} + +template template inline +VecCommaInitializer<_Tp, cn>& VecCommaInitializer<_Tp, cn>::operator , (_T2 value) +{ + CV_DbgAssert( this->idx < cn ); + this->dst->val[this->idx++] = saturate_cast<_Tp>(value); + return *this; +} + +template inline +Vec<_Tp, cn> VecCommaInitializer<_Tp, cn>::operator *() const +{ + CV_DbgAssert( this->idx == cn ); + return *this->dst; +} + +//! @endcond + +///////////////////////////// Matx out-of-class operators //////////////////////////////// + +//! @relates cv::Matx +//! @{ + +template static inline +Matx<_Tp1, m, n>& operator += (Matx<_Tp1, m, n>& a, const Matx<_Tp2, m, n>& b) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = saturate_cast<_Tp1>(a.val[i] + b.val[i]); + return a; +} + +template static inline +Matx<_Tp1, m, n>& operator -= (Matx<_Tp1, m, n>& a, const Matx<_Tp2, m, n>& b) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = saturate_cast<_Tp1>(a.val[i] - b.val[i]); + return a; +} + +template static inline +Matx<_Tp, m, n> operator + (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b) +{ + return Matx<_Tp, m, n>(a, b, Matx_AddOp()); +} + +template static inline +Matx<_Tp, m, n> operator - (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b) +{ + return Matx<_Tp, m, n>(a, b, Matx_SubOp()); +} + +template static inline +Matx<_Tp, m, n>& operator *= (Matx<_Tp, m, n>& a, int alpha) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = saturate_cast<_Tp>(a.val[i] * alpha); + return a; +} + +template static inline +Matx<_Tp, m, n>& operator *= (Matx<_Tp, m, n>& a, float alpha) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = saturate_cast<_Tp>(a.val[i] * alpha); + return a; +} + +template static inline +Matx<_Tp, m, n>& operator *= (Matx<_Tp, m, n>& a, double alpha) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = saturate_cast<_Tp>(a.val[i] * alpha); + return a; +} + +template static inline +Matx<_Tp, m, n> operator * (const Matx<_Tp, m, n>& a, int alpha) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (const Matx<_Tp, m, n>& a, float alpha) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (const Matx<_Tp, m, n>& a, double alpha) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (int alpha, const Matx<_Tp, m, n>& a) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (float alpha, const Matx<_Tp, m, n>& a) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (double alpha, const Matx<_Tp, m, n>& a) +{ + return Matx<_Tp, m, n>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n>& operator /= (Matx<_Tp, m, n>& a, float alpha) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = a.val[i] / alpha; + return a; +} + +template static inline +Matx<_Tp, m, n>& operator /= (Matx<_Tp, m, n>& a, double alpha) +{ + for( int i = 0; i < m*n; i++ ) + a.val[i] = a.val[i] / alpha; + return a; +} + +template static inline +Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n>& a, float alpha) +{ + return Matx<_Tp, m, n>(a, 1.f/alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n>& a, double alpha) +{ + return Matx<_Tp, m, n>(a, 1./alpha, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator - (const Matx<_Tp, m, n>& a) +{ + return Matx<_Tp, m, n>(a, -1, Matx_ScaleOp()); +} + +template static inline +Matx<_Tp, m, n> operator * (const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b) +{ + return Matx<_Tp, m, n>(a, b, Matx_MatMulOp()); +} + +template static inline +Vec<_Tp, m> operator * (const Matx<_Tp, m, n>& a, const Vec<_Tp, n>& b) +{ + Matx<_Tp, m, 1> c(a, b, Matx_MatMulOp()); + return (const Vec<_Tp, m>&)(c); +} + +template static inline +bool operator == (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b) +{ + for( int i = 0; i < m*n; i++ ) + if( a.val[i] != b.val[i] ) return false; + return true; +} + +template static inline +bool operator != (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b) +{ + return !(a == b); +} + +//! @} + +////////////////////////////// Vec out-of-class operators //////////////////////////////// + +//! @relates cv::Vec +//! @{ + +template static inline +Vec<_Tp1, cn>& operator += (Vec<_Tp1, cn>& a, const Vec<_Tp2, cn>& b) +{ + for( int i = 0; i < cn; i++ ) + a.val[i] = saturate_cast<_Tp1>(a.val[i] + b.val[i]); + return a; +} + +template static inline +Vec<_Tp1, cn>& operator -= (Vec<_Tp1, cn>& a, const Vec<_Tp2, cn>& b) +{ + for( int i = 0; i < cn; i++ ) + a.val[i] = saturate_cast<_Tp1>(a.val[i] - b.val[i]); + return a; +} + +template static inline +Vec<_Tp, cn> operator + (const Vec<_Tp, cn>& a, const Vec<_Tp, cn>& b) +{ + return Vec<_Tp, cn>(a, b, Matx_AddOp()); +} + +template static inline +Vec<_Tp, cn> operator - (const Vec<_Tp, cn>& a, const Vec<_Tp, cn>& b) +{ + return Vec<_Tp, cn>(a, b, Matx_SubOp()); +} + +template static inline +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, int alpha) +{ + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*alpha); + return a; +} + +template static inline +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, float alpha) +{ + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*alpha); + return a; +} + +template static inline +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, double alpha) +{ + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*alpha); + return a; +} + +template static inline +Vec<_Tp, cn>& operator /= (Vec<_Tp, cn>& a, int alpha) +{ + double ialpha = 1./alpha; + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*ialpha); + return a; +} + +template static inline +Vec<_Tp, cn>& operator /= (Vec<_Tp, cn>& a, float alpha) +{ + float ialpha = 1.f/alpha; + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*ialpha); + return a; +} + +template static inline +Vec<_Tp, cn>& operator /= (Vec<_Tp, cn>& a, double alpha) +{ + double ialpha = 1./alpha; + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*ialpha); + return a; +} + +template static inline +Vec<_Tp, cn> operator * (const Vec<_Tp, cn>& a, int alpha) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator * (int alpha, const Vec<_Tp, cn>& a) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator * (const Vec<_Tp, cn>& a, float alpha) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator * (float alpha, const Vec<_Tp, cn>& a) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator * (const Vec<_Tp, cn>& a, double alpha) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator * (double alpha, const Vec<_Tp, cn>& a) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator / (const Vec<_Tp, cn>& a, int alpha) +{ + return Vec<_Tp, cn>(a, 1./alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator / (const Vec<_Tp, cn>& a, float alpha) +{ + return Vec<_Tp, cn>(a, 1.f/alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator / (const Vec<_Tp, cn>& a, double alpha) +{ + return Vec<_Tp, cn>(a, 1./alpha, Matx_ScaleOp()); +} + +template static inline +Vec<_Tp, cn> operator - (const Vec<_Tp, cn>& a) +{ + Vec<_Tp,cn> t; + for( int i = 0; i < cn; i++ ) t.val[i] = saturate_cast<_Tp>(-a.val[i]); + return t; +} + +template inline Vec<_Tp, 4> operator * (const Vec<_Tp, 4>& v1, const Vec<_Tp, 4>& v2) +{ + return Vec<_Tp, 4>(saturate_cast<_Tp>(v1[0]*v2[0] - v1[1]*v2[1] - v1[2]*v2[2] - v1[3]*v2[3]), + saturate_cast<_Tp>(v1[0]*v2[1] + v1[1]*v2[0] + v1[2]*v2[3] - v1[3]*v2[2]), + saturate_cast<_Tp>(v1[0]*v2[2] - v1[1]*v2[3] + v1[2]*v2[0] + v1[3]*v2[1]), + saturate_cast<_Tp>(v1[0]*v2[3] + v1[1]*v2[2] - v1[2]*v2[1] + v1[3]*v2[0])); +} + +template inline Vec<_Tp, 4>& operator *= (Vec<_Tp, 4>& v1, const Vec<_Tp, 4>& v2) +{ + v1 = v1 * v2; + return v1; +} + +//! @} + +} // cv + +#endif // OPENCV_CORE_MATX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/neon_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/neon_utils.hpp new file mode 100644 index 0000000..573ba99 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/neon_utils.hpp @@ -0,0 +1,128 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HAL_NEON_UTILS_HPP +#define OPENCV_HAL_NEON_UTILS_HPP + +#include "opencv2/core/cvdef.h" + +//! @addtogroup core_utils_neon +//! @{ + +#if CV_NEON + +inline int32x2_t cv_vrnd_s32_f32(float32x2_t v) +{ + static int32x2_t v_sign = vdup_n_s32(1 << 31), + v_05 = vreinterpret_s32_f32(vdup_n_f32(0.5f)); + + int32x2_t v_addition = vorr_s32(v_05, vand_s32(v_sign, vreinterpret_s32_f32(v))); + return vcvt_s32_f32(vadd_f32(v, vreinterpret_f32_s32(v_addition))); +} + +inline int32x4_t cv_vrndq_s32_f32(float32x4_t v) +{ + static int32x4_t v_sign = vdupq_n_s32(1 << 31), + v_05 = vreinterpretq_s32_f32(vdupq_n_f32(0.5f)); + + int32x4_t v_addition = vorrq_s32(v_05, vandq_s32(v_sign, vreinterpretq_s32_f32(v))); + return vcvtq_s32_f32(vaddq_f32(v, vreinterpretq_f32_s32(v_addition))); +} + +inline uint32x2_t cv_vrnd_u32_f32(float32x2_t v) +{ + static float32x2_t v_05 = vdup_n_f32(0.5f); + return vcvt_u32_f32(vadd_f32(v, v_05)); +} + +inline uint32x4_t cv_vrndq_u32_f32(float32x4_t v) +{ + static float32x4_t v_05 = vdupq_n_f32(0.5f); + return vcvtq_u32_f32(vaddq_f32(v, v_05)); +} + +inline float32x4_t cv_vrecpq_f32(float32x4_t val) +{ + float32x4_t reciprocal = vrecpeq_f32(val); + reciprocal = vmulq_f32(vrecpsq_f32(val, reciprocal), reciprocal); + reciprocal = vmulq_f32(vrecpsq_f32(val, reciprocal), reciprocal); + return reciprocal; +} + +inline float32x2_t cv_vrecp_f32(float32x2_t val) +{ + float32x2_t reciprocal = vrecpe_f32(val); + reciprocal = vmul_f32(vrecps_f32(val, reciprocal), reciprocal); + reciprocal = vmul_f32(vrecps_f32(val, reciprocal), reciprocal); + return reciprocal; +} + +inline float32x4_t cv_vrsqrtq_f32(float32x4_t val) +{ + float32x4_t e = vrsqrteq_f32(val); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(e, e), val), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(e, e), val), e); + return e; +} + +inline float32x2_t cv_vrsqrt_f32(float32x2_t val) +{ + float32x2_t e = vrsqrte_f32(val); + e = vmul_f32(vrsqrts_f32(vmul_f32(e, e), val), e); + e = vmul_f32(vrsqrts_f32(vmul_f32(e, e), val), e); + return e; +} + +inline float32x4_t cv_vsqrtq_f32(float32x4_t val) +{ + return cv_vrecpq_f32(cv_vrsqrtq_f32(val)); +} + +inline float32x2_t cv_vsqrt_f32(float32x2_t val) +{ + return cv_vrecp_f32(cv_vrsqrt_f32(val)); +} + +#endif + +//! @} + +#endif // OPENCV_HAL_NEON_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/ocl.hpp b/Thirdparty/opencv2/include/opencv2/core/ocl.hpp new file mode 100644 index 0000000..0000343 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/ocl.hpp @@ -0,0 +1,918 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_OPENCL_HPP +#define OPENCV_OPENCL_HPP + +#include "opencv2/core.hpp" +#include +#include + +namespace cv { namespace ocl { + +//! @addtogroup core_opencl +//! @{ + +CV_EXPORTS_W bool haveOpenCL(); +CV_EXPORTS_W bool useOpenCL(); +CV_EXPORTS_W bool haveAmdBlas(); +CV_EXPORTS_W bool haveAmdFft(); +CV_EXPORTS_W void setUseOpenCL(bool flag); +CV_EXPORTS_W void finish(); + +CV_EXPORTS bool haveSVM(); + +class CV_EXPORTS Context; +class CV_EXPORTS_W_SIMPLE Device; +class CV_EXPORTS Kernel; +class CV_EXPORTS Program; +class CV_EXPORTS ProgramSource; +class CV_EXPORTS Queue; +class CV_EXPORTS PlatformInfo; +class CV_EXPORTS Image2D; + +class CV_EXPORTS_W_SIMPLE Device +{ +public: + CV_WRAP Device() CV_NOEXCEPT; + explicit Device(void* d); + Device(const Device& d); + Device& operator = (const Device& d); + Device(Device&& d) CV_NOEXCEPT; + Device& operator = (Device&& d) CV_NOEXCEPT; + CV_WRAP ~Device(); + + void set(void* d); + + enum + { + TYPE_DEFAULT = (1 << 0), + TYPE_CPU = (1 << 1), + TYPE_GPU = (1 << 2), + TYPE_ACCELERATOR = (1 << 3), + TYPE_DGPU = TYPE_GPU + (1 << 16), + TYPE_IGPU = TYPE_GPU + (1 << 17), + TYPE_ALL = 0xFFFFFFFF + }; + + CV_WRAP String name() const; + CV_WRAP String extensions() const; + CV_WRAP bool isExtensionSupported(const String& extensionName) const; + CV_WRAP String version() const; + CV_WRAP String vendorName() const; + CV_WRAP String OpenCL_C_Version() const; + CV_WRAP String OpenCLVersion() const; + CV_WRAP int deviceVersionMajor() const; + CV_WRAP int deviceVersionMinor() const; + CV_WRAP String driverVersion() const; + void* ptr() const; + + CV_WRAP int type() const; + + CV_WRAP int addressBits() const; + CV_WRAP bool available() const; + CV_WRAP bool compilerAvailable() const; + CV_WRAP bool linkerAvailable() const; + + enum + { + FP_DENORM=(1 << 0), + FP_INF_NAN=(1 << 1), + FP_ROUND_TO_NEAREST=(1 << 2), + FP_ROUND_TO_ZERO=(1 << 3), + FP_ROUND_TO_INF=(1 << 4), + FP_FMA=(1 << 5), + FP_SOFT_FLOAT=(1 << 6), + FP_CORRECTLY_ROUNDED_DIVIDE_SQRT=(1 << 7) + }; + CV_WRAP int doubleFPConfig() const; + CV_WRAP int singleFPConfig() const; + CV_WRAP int halfFPConfig() const; + + CV_WRAP bool endianLittle() const; + CV_WRAP bool errorCorrectionSupport() const; + + enum + { + EXEC_KERNEL=(1 << 0), + EXEC_NATIVE_KERNEL=(1 << 1) + }; + CV_WRAP int executionCapabilities() const; + + CV_WRAP size_t globalMemCacheSize() const; + + enum + { + NO_CACHE=0, + READ_ONLY_CACHE=1, + READ_WRITE_CACHE=2 + }; + CV_WRAP int globalMemCacheType() const; + CV_WRAP int globalMemCacheLineSize() const; + CV_WRAP size_t globalMemSize() const; + + CV_WRAP size_t localMemSize() const; + enum + { + NO_LOCAL_MEM=0, + LOCAL_IS_LOCAL=1, + LOCAL_IS_GLOBAL=2 + }; + CV_WRAP int localMemType() const; + CV_WRAP bool hostUnifiedMemory() const; + + CV_WRAP bool imageSupport() const; + + CV_WRAP bool imageFromBufferSupport() const; + uint imagePitchAlignment() const; + uint imageBaseAddressAlignment() const; + + /// deprecated, use isExtensionSupported() method (probably with "cl_khr_subgroups" value) + CV_WRAP bool intelSubgroupsSupport() const; + + CV_WRAP size_t image2DMaxWidth() const; + CV_WRAP size_t image2DMaxHeight() const; + + CV_WRAP size_t image3DMaxWidth() const; + CV_WRAP size_t image3DMaxHeight() const; + CV_WRAP size_t image3DMaxDepth() const; + + CV_WRAP size_t imageMaxBufferSize() const; + CV_WRAP size_t imageMaxArraySize() const; + + enum + { + UNKNOWN_VENDOR=0, + VENDOR_AMD=1, + VENDOR_INTEL=2, + VENDOR_NVIDIA=3 + }; + CV_WRAP int vendorID() const; + // FIXIT + // dev.isAMD() doesn't work for OpenCL CPU devices from AMD OpenCL platform. + // This method should use platform name instead of vendor name. + // After fix restore code in arithm.cpp: ocl_compare() + CV_WRAP inline bool isAMD() const { return vendorID() == VENDOR_AMD; } + CV_WRAP inline bool isIntel() const { return vendorID() == VENDOR_INTEL; } + CV_WRAP inline bool isNVidia() const { return vendorID() == VENDOR_NVIDIA; } + + CV_WRAP int maxClockFrequency() const; + CV_WRAP int maxComputeUnits() const; + CV_WRAP int maxConstantArgs() const; + CV_WRAP size_t maxConstantBufferSize() const; + + CV_WRAP size_t maxMemAllocSize() const; + CV_WRAP size_t maxParameterSize() const; + + CV_WRAP int maxReadImageArgs() const; + CV_WRAP int maxWriteImageArgs() const; + CV_WRAP int maxSamplers() const; + + CV_WRAP size_t maxWorkGroupSize() const; + CV_WRAP int maxWorkItemDims() const; + void maxWorkItemSizes(size_t*) const; + + CV_WRAP int memBaseAddrAlign() const; + + CV_WRAP int nativeVectorWidthChar() const; + CV_WRAP int nativeVectorWidthShort() const; + CV_WRAP int nativeVectorWidthInt() const; + CV_WRAP int nativeVectorWidthLong() const; + CV_WRAP int nativeVectorWidthFloat() const; + CV_WRAP int nativeVectorWidthDouble() const; + CV_WRAP int nativeVectorWidthHalf() const; + + CV_WRAP int preferredVectorWidthChar() const; + CV_WRAP int preferredVectorWidthShort() const; + CV_WRAP int preferredVectorWidthInt() const; + CV_WRAP int preferredVectorWidthLong() const; + CV_WRAP int preferredVectorWidthFloat() const; + CV_WRAP int preferredVectorWidthDouble() const; + CV_WRAP int preferredVectorWidthHalf() const; + + CV_WRAP size_t printfBufferSize() const; + CV_WRAP size_t profilingTimerResolution() const; + + CV_WRAP static const Device& getDefault(); + + /** + * @param d OpenCL handle (cl_device_id). clRetainDevice() is called on success. + * + * @note Ownership of the passed device is passed to OpenCV on success. + * The caller should additionally call `clRetainDevice` on it if it intends + * to continue using the device. + */ + static Device fromHandle(void* d); + + struct Impl; + inline Impl* getImpl() const { return (Impl*)p; } + inline bool empty() const { return !p; } +protected: + Impl* p; +}; + + +class CV_EXPORTS Context +{ +public: + Context() CV_NOEXCEPT; + explicit Context(int dtype); //!< @deprecated + ~Context(); + Context(const Context& c); + Context& operator= (const Context& c); + Context(Context&& c) CV_NOEXCEPT; + Context& operator = (Context&& c) CV_NOEXCEPT; + + /** @deprecated */ + bool create(); + /** @deprecated */ + bool create(int dtype); + + size_t ndevices() const; + Device& device(size_t idx) const; + Program getProg(const ProgramSource& prog, + const String& buildopt, String& errmsg); + void unloadProg(Program& prog); + + + /** Get thread-local OpenCL context (initialize if necessary) */ +#if 0 // OpenCV 5.0 + static Context& getDefault(); +#else + static Context& getDefault(bool initialize = true); +#endif + + /** @returns cl_context value */ + void* ptr() const; + + /** + * @brief Get OpenCL context property specified on context creation + * @param propertyId Property id (CL_CONTEXT_* as defined in cl_context_properties type) + * @returns Property value if property was specified on clCreateContext, or NULL if context created without the property + */ + void* getOpenCLContextProperty(int propertyId) const; + + bool useSVM() const; + void setUseSVM(bool enabled); + + /** + * @param context OpenCL handle (cl_context). clRetainContext() is called on success + */ + static Context fromHandle(void* context); + static Context fromDevice(const ocl::Device& device); + static Context create(const std::string& configuration); + + void release(); + + class CV_EXPORTS UserContext { + public: + virtual ~UserContext(); + }; + template + inline void setUserContext(const std::shared_ptr& userContext) { + setUserContext(typeid(T), userContext); + } + template + inline std::shared_ptr getUserContext() { + return std::dynamic_pointer_cast(getUserContext(typeid(T))); + } + void setUserContext(std::type_index typeId, const std::shared_ptr& userContext); + std::shared_ptr getUserContext(std::type_index typeId); + + struct Impl; + inline Impl* getImpl() const { return (Impl*)p; } + inline bool empty() const { return !p; } +// TODO OpenCV 5.0 +//protected: + Impl* p; +}; + +/** @deprecated */ +class CV_EXPORTS Platform +{ +public: + Platform() CV_NOEXCEPT; + ~Platform(); + Platform(const Platform& p); + Platform& operator = (const Platform& p); + Platform(Platform&& p) CV_NOEXCEPT; + Platform& operator = (Platform&& p) CV_NOEXCEPT; + + void* ptr() const; + + /** @deprecated */ + static Platform& getDefault(); + + struct Impl; + inline Impl* getImpl() const { return (Impl*)p; } + inline bool empty() const { return !p; } +protected: + Impl* p; +}; + +/** @brief Attaches OpenCL context to OpenCV +@note + OpenCV will check if available OpenCL platform has platformName name, then assign context to + OpenCV and call `clRetainContext` function. The deviceID device will be used as target device and + new command queue will be created. +@param platformName name of OpenCL platform to attach, this string is used to check if platform is available to OpenCV at runtime +@param platformID ID of platform attached context was created for +@param context OpenCL context to be attached to OpenCV +@param deviceID ID of device, must be created from attached context +*/ +CV_EXPORTS void attachContext(const String& platformName, void* platformID, void* context, void* deviceID); + +/** @brief Convert OpenCL buffer to UMat +@note + OpenCL buffer (cl_mem_buffer) should contain 2D image data, compatible with OpenCV. Memory + content is not copied from `clBuffer` to UMat. Instead, buffer handle assigned to UMat and + `clRetainMemObject` is called. +@param cl_mem_buffer source clBuffer handle +@param step num of bytes in single row +@param rows number of rows +@param cols number of cols +@param type OpenCV type of image +@param dst destination UMat +*/ +CV_EXPORTS void convertFromBuffer(void* cl_mem_buffer, size_t step, int rows, int cols, int type, UMat& dst); + +/** @brief Convert OpenCL image2d_t to UMat +@note + OpenCL `image2d_t` (cl_mem_image), should be compatible with OpenCV UMat formats. Memory content + is copied from image to UMat with `clEnqueueCopyImageToBuffer` function. +@param cl_mem_image source image2d_t handle +@param dst destination UMat +*/ +CV_EXPORTS void convertFromImage(void* cl_mem_image, UMat& dst); + +// TODO Move to internal header +/// @deprecated +void initializeContextFromHandle(Context& ctx, void* platform, void* context, void* device); + +class CV_EXPORTS Queue +{ +public: + Queue() CV_NOEXCEPT; + explicit Queue(const Context& c, const Device& d=Device()); + ~Queue(); + Queue(const Queue& q); + Queue& operator = (const Queue& q); + Queue(Queue&& q) CV_NOEXCEPT; + Queue& operator = (Queue&& q) CV_NOEXCEPT; + + bool create(const Context& c=Context(), const Device& d=Device()); + void finish(); + void* ptr() const; + static Queue& getDefault(); + + /// @brief Returns OpenCL command queue with enable profiling mode support + const Queue& getProfilingQueue() const; + + struct Impl; friend struct Impl; + inline Impl* getImpl() const { return p; } + inline bool empty() const { return !p; } +protected: + Impl* p; +}; + + +class CV_EXPORTS KernelArg +{ +public: + enum { LOCAL=1, READ_ONLY=2, WRITE_ONLY=4, READ_WRITE=6, CONSTANT=8, PTR_ONLY = 16, NO_SIZE=256 }; + KernelArg(int _flags, UMat* _m, int wscale=1, int iwscale=1, const void* _obj=0, size_t _sz=0); + KernelArg() CV_NOEXCEPT; + + static KernelArg Local(size_t localMemSize) + { return KernelArg(LOCAL, 0, 1, 1, 0, localMemSize); } + static KernelArg PtrWriteOnly(const UMat& m) + { return KernelArg(PTR_ONLY+WRITE_ONLY, (UMat*)&m); } + static KernelArg PtrReadOnly(const UMat& m) + { return KernelArg(PTR_ONLY+READ_ONLY, (UMat*)&m); } + static KernelArg PtrReadWrite(const UMat& m) + { return KernelArg(PTR_ONLY+READ_WRITE, (UMat*)&m); } + static KernelArg ReadWrite(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(READ_WRITE, (UMat*)&m, wscale, iwscale); } + static KernelArg ReadWriteNoSize(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(READ_WRITE+NO_SIZE, (UMat*)&m, wscale, iwscale); } + static KernelArg ReadOnly(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(READ_ONLY, (UMat*)&m, wscale, iwscale); } + static KernelArg WriteOnly(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(WRITE_ONLY, (UMat*)&m, wscale, iwscale); } + static KernelArg ReadOnlyNoSize(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(READ_ONLY+NO_SIZE, (UMat*)&m, wscale, iwscale); } + static KernelArg WriteOnlyNoSize(const UMat& m, int wscale=1, int iwscale=1) + { return KernelArg(WRITE_ONLY+NO_SIZE, (UMat*)&m, wscale, iwscale); } + static KernelArg Constant(const Mat& m); + template static KernelArg Constant(const _Tp* arr, size_t n) + { return KernelArg(CONSTANT, 0, 1, 1, (void*)arr, n); } + + int flags; + UMat* m; + const void* obj; + size_t sz; + int wscale, iwscale; +}; + + +class CV_EXPORTS Kernel +{ +public: + Kernel() CV_NOEXCEPT; + Kernel(const char* kname, const Program& prog); + Kernel(const char* kname, const ProgramSource& prog, + const String& buildopts = String(), String* errmsg=0); + ~Kernel(); + Kernel(const Kernel& k); + Kernel& operator = (const Kernel& k); + Kernel(Kernel&& k) CV_NOEXCEPT; + Kernel& operator = (Kernel&& k) CV_NOEXCEPT; + + bool empty() const; + bool create(const char* kname, const Program& prog); + bool create(const char* kname, const ProgramSource& prog, + const String& buildopts, String* errmsg=0); + + int set(int i, const void* value, size_t sz); + int set(int i, const Image2D& image2D); + int set(int i, const UMat& m); + int set(int i, const KernelArg& arg); + template int set(int i, const _Tp& value) + { return set(i, &value, sizeof(value)); } + + +protected: + template inline + int set_args_(int i, const _Tp0& a0) { return set(i, a0); } + template inline + int set_args_(int i, const _Tp0& a0, const _Tps&... rest_args) { i = set(i, a0); return set_args_(i, rest_args...); } +public: + /** @brief Setup OpenCL Kernel arguments. + Avoid direct using of set(i, ...) methods. + @code + bool ok = kernel + .args( + srcUMat, dstUMat, + (float)some_float_param + ).run(ndims, globalSize, localSize); + if (!ok) return false; + @endcode + */ + template inline + Kernel& args(const _Tps&... kernel_args) { set_args_(0, kernel_args...); return *this; } + + /** @brief Run the OpenCL kernel (globalsize value may be adjusted) + + @param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3. + @param globalsize work items for each dimension. It is not the final globalsize passed to + OpenCL. Each dimension will be adjusted to the nearest integer divisible by the corresponding + value in localsize. If localsize is NULL, it will still be adjusted depending on dims. The + adjusted values are greater than or equal to the original values. + @param localsize work-group size for each dimension. + @param sync specify whether to wait for OpenCL computation to finish before return. + @param q command queue + + @note Use run_() if your kernel code doesn't support adjusted globalsize. + */ + bool run(int dims, size_t globalsize[], + size_t localsize[], bool sync, const Queue& q=Queue()); + + /** @brief Run the OpenCL kernel + * + * @param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3. + * @param globalsize work items for each dimension. This value is passed to OpenCL without changes. + * @param localsize work-group size for each dimension. + * @param sync specify whether to wait for OpenCL computation to finish before return. + * @param q command queue + */ + bool run_(int dims, size_t globalsize[], size_t localsize[], bool sync, const Queue& q=Queue()); + + bool runTask(bool sync, const Queue& q=Queue()); + + /** @brief Similar to synchronized run_() call with returning of kernel execution time + * + * Separate OpenCL command queue may be used (with CL_QUEUE_PROFILING_ENABLE) + * @return Execution time in nanoseconds or negative number on error + */ + int64 runProfiling(int dims, size_t globalsize[], size_t localsize[], const Queue& q=Queue()); + + size_t workGroupSize() const; + size_t preferedWorkGroupSizeMultiple() const; + bool compileWorkGroupSize(size_t wsz[]) const; + size_t localMemSize() const; + + void* ptr() const; + struct Impl; + +protected: + Impl* p; +}; + +class CV_EXPORTS Program +{ +public: + Program() CV_NOEXCEPT; + Program(const ProgramSource& src, + const String& buildflags, String& errmsg); + Program(const Program& prog); + Program& operator = (const Program& prog); + Program(Program&& prog) CV_NOEXCEPT; + Program& operator = (Program&& prog) CV_NOEXCEPT; + ~Program(); + + bool create(const ProgramSource& src, + const String& buildflags, String& errmsg); + + void* ptr() const; + + /** + * @brief Query device-specific program binary. + * + * Returns RAW OpenCL executable binary without additional attachments. + * + * @sa ProgramSource::fromBinary + * + * @param[out] binary output buffer + */ + void getBinary(std::vector& binary) const; + + struct Impl; friend struct Impl; + inline Impl* getImpl() const { return (Impl*)p; } + inline bool empty() const { return !p; } +protected: + Impl* p; +public: +#ifndef OPENCV_REMOVE_DEPRECATED_API + // TODO Remove this + CV_DEPRECATED bool read(const String& buf, const String& buildflags); // removed, use ProgramSource instead + CV_DEPRECATED bool write(String& buf) const; // removed, use getBinary() method instead (RAW OpenCL binary) + CV_DEPRECATED const ProgramSource& source() const; // implementation removed + CV_DEPRECATED String getPrefix() const; // deprecated, implementation replaced + CV_DEPRECATED static String getPrefix(const String& buildflags); // deprecated, implementation replaced +#endif +}; + + +class CV_EXPORTS ProgramSource +{ +public: + typedef uint64 hash_t; // deprecated + + ProgramSource() CV_NOEXCEPT; + explicit ProgramSource(const String& module, const String& name, const String& codeStr, const String& codeHash); + explicit ProgramSource(const String& prog); // deprecated + explicit ProgramSource(const char* prog); // deprecated + ~ProgramSource(); + ProgramSource(const ProgramSource& prog); + ProgramSource& operator = (const ProgramSource& prog); + ProgramSource(ProgramSource&& prog) CV_NOEXCEPT; + ProgramSource& operator = (ProgramSource&& prog) CV_NOEXCEPT; + + const String& source() const; // deprecated + hash_t hash() const; // deprecated + + + /** @brief Describe OpenCL program binary. + * Do not call clCreateProgramWithBinary() and/or clBuildProgram(). + * + * Caller should guarantee binary buffer lifetime greater than ProgramSource object (and any of its copies). + * + * This kind of binary is not portable between platforms in general - it is specific to OpenCL vendor / device / driver version. + * + * @param module name of program owner module + * @param name unique name of program (module+name is used as key for OpenCL program caching) + * @param binary buffer address. See buffer lifetime requirement in description. + * @param size buffer size + * @param buildOptions additional program-related build options passed to clBuildProgram() + * @return created ProgramSource object + */ + static ProgramSource fromBinary(const String& module, const String& name, + const unsigned char* binary, const size_t size, + const cv::String& buildOptions = cv::String()); + + /** @brief Describe OpenCL program in SPIR format. + * Do not call clCreateProgramWithBinary() and/or clBuildProgram(). + * + * Supports SPIR 1.2 by default (pass '-spir-std=X.Y' in buildOptions to override this behavior) + * + * Caller should guarantee binary buffer lifetime greater than ProgramSource object (and any of its copies). + * + * Programs in this format are portable between OpenCL implementations with 'khr_spir' extension: + * https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/cl_khr_spir.html + * (but they are not portable between different platforms: 32-bit / 64-bit) + * + * Note: these programs can't support vendor specific extensions, like 'cl_intel_subgroups'. + * + * @param module name of program owner module + * @param name unique name of program (module+name is used as key for OpenCL program caching) + * @param binary buffer address. See buffer lifetime requirement in description. + * @param size buffer size + * @param buildOptions additional program-related build options passed to clBuildProgram() + * (these options are added automatically: '-x spir' and '-spir-std=1.2') + * @return created ProgramSource object. + */ + static ProgramSource fromSPIR(const String& module, const String& name, + const unsigned char* binary, const size_t size, + const cv::String& buildOptions = cv::String()); + + //OpenCL 2.1+ only + //static Program fromSPIRV(const String& module, const String& name, + // const unsigned char* binary, const size_t size, + // const cv::String& buildOptions = cv::String()); + + struct Impl; friend struct Impl; + inline Impl* getImpl() const { return (Impl*)p; } + inline bool empty() const { return !p; } +protected: + Impl* p; +}; + +class CV_EXPORTS PlatformInfo +{ +public: + PlatformInfo() CV_NOEXCEPT; + /** + * @param id pointer cl_platform_id (cl_platform_id*) + */ + explicit PlatformInfo(void* id); + ~PlatformInfo(); + + PlatformInfo(const PlatformInfo& i); + PlatformInfo& operator =(const PlatformInfo& i); + PlatformInfo(PlatformInfo&& i) CV_NOEXCEPT; + PlatformInfo& operator = (PlatformInfo&& i) CV_NOEXCEPT; + + String name() const; + String vendor() const; + + /// See CL_PLATFORM_VERSION + String version() const; + int versionMajor() const; + int versionMinor() const; + + int deviceNumber() const; + void getDevice(Device& device, int d) const; + + struct Impl; + bool empty() const { return !p; } +protected: + Impl* p; +}; + +CV_EXPORTS CV_DEPRECATED const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf); +CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf, size_t buf_size); +CV_EXPORTS const char* typeToStr(int t); +CV_EXPORTS const char* memopTypeToStr(int t); +CV_EXPORTS const char* vecopTypeToStr(int t); +CV_EXPORTS const char* getOpenCLErrorString(int errorCode); +CV_EXPORTS String kernelToStr(InputArray _kernel, int ddepth = -1, const char * name = NULL); +CV_EXPORTS void getPlatfomsInfo(std::vector& platform_info); + + +enum OclVectorStrategy +{ + // all matrices have its own vector width + OCL_VECTOR_OWN = 0, + // all matrices have maximal vector width among all matrices + // (useful for cases when matrices have different data types) + OCL_VECTOR_MAX = 1, + + // default strategy + OCL_VECTOR_DEFAULT = OCL_VECTOR_OWN +}; + +CV_EXPORTS int predictOptimalVectorWidth(InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(), + InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(), + InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray(), + OclVectorStrategy strat = OCL_VECTOR_DEFAULT); + +CV_EXPORTS int checkOptimalVectorWidth(const int *vectorWidths, + InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(), + InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(), + InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray(), + OclVectorStrategy strat = OCL_VECTOR_DEFAULT); + +// with OCL_VECTOR_MAX strategy +CV_EXPORTS int predictOptimalVectorWidthMax(InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(), + InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(), + InputArray src7 = noArray(), InputArray src8 = noArray(), InputArray src9 = noArray()); + +CV_EXPORTS void buildOptionsAddMatrixDescription(String& buildOptions, const String& name, InputArray _m); + +class CV_EXPORTS Image2D +{ +public: + Image2D() CV_NOEXCEPT; + + /** + @param src UMat object from which to get image properties and data + @param norm flag to enable the use of normalized channel data types + @param alias flag indicating that the image should alias the src UMat. If true, changes to the + image or src will be reflected in both objects. + */ + explicit Image2D(const UMat &src, bool norm = false, bool alias = false); + Image2D(const Image2D & i); + ~Image2D(); + + Image2D & operator = (const Image2D & i); + Image2D(Image2D &&) CV_NOEXCEPT; + Image2D &operator=(Image2D &&) CV_NOEXCEPT; + + /** Indicates if creating an aliased image should succeed. + Depends on the underlying platform and the dimensions of the UMat. + */ + static bool canCreateAlias(const UMat &u); + + /** Indicates if the image format is supported. + */ + static bool isFormatSupported(int depth, int cn, bool norm); + + void* ptr() const; +protected: + struct Impl; + Impl* p; +}; + +class CV_EXPORTS Timer +{ +public: + Timer(const Queue& q); + ~Timer(); + void start(); + void stop(); + + uint64 durationNS() const; ///< duration in nanoseconds + +protected: + struct Impl; + Impl* const p; + +private: + Timer(const Timer&); // disabled + Timer& operator=(const Timer&); // disabled +}; + +CV_EXPORTS MatAllocator* getOpenCLAllocator(); + + +class CV_EXPORTS_W OpenCLExecutionContext +{ +public: + OpenCLExecutionContext() = default; + ~OpenCLExecutionContext() = default; + + OpenCLExecutionContext(const OpenCLExecutionContext&) = default; + OpenCLExecutionContext(OpenCLExecutionContext&&) = default; + + OpenCLExecutionContext& operator=(const OpenCLExecutionContext&) = default; + OpenCLExecutionContext& operator=(OpenCLExecutionContext&&) = default; + + /** Get associated ocl::Context */ + Context& getContext() const; + /** Get the single default associated ocl::Device */ + Device& getDevice() const; + /** Get the single ocl::Queue that is associated with the ocl::Context and + * the single default ocl::Device + */ + Queue& getQueue() const; + + bool useOpenCL() const; + void setUseOpenCL(bool flag); + + /** Get OpenCL execution context of current thread. + * + * Initialize OpenCL execution context if it is empty + * - create new + * - reuse context of the main thread (threadID = 0) + */ + static OpenCLExecutionContext& getCurrent(); + + /** Get OpenCL execution context of current thread (can be empty) */ + static OpenCLExecutionContext& getCurrentRef(); + + /** Bind this OpenCL execution context to current thread. + * + * Context can't be empty. + * + * @note clFinish is not called for queue of previous execution context + */ + void bind() const; + + /** Creates new execution context with same OpenCV context and device + * + * @param q OpenCL queue + */ + OpenCLExecutionContext cloneWithNewQueue(const ocl::Queue& q) const; + /** @overload */ + OpenCLExecutionContext cloneWithNewQueue() const; + + /** @brief Creates OpenCL execution context + * OpenCV will check if available OpenCL platform has platformName name, + * then assign context to OpenCV. + * The deviceID device will be used as target device and a new command queue will be created. + * + * @note On success, ownership of one reference of the context and device is taken. + * The caller should additionally call `clRetainContext` and/or `clRetainDevice` + * to increase the reference count if it wishes to continue using them. + * + * @param platformName name of OpenCL platform to attach, this string is used to check if platform is available to OpenCV at runtime + * @param platformID ID of platform attached context was created for (cl_platform_id) + * @param context OpenCL context to be attached to OpenCV (cl_context) + * @param deviceID OpenCL device (cl_device_id) + */ + static OpenCLExecutionContext create(const std::string& platformName, void* platformID, void* context, void* deviceID); + + /** @brief Creates OpenCL execution context + * + * @param context non-empty OpenCL context + * @param device non-empty OpenCL device (must be a part of context) + * @param queue non-empty OpenCL queue for provided context and device + */ + static OpenCLExecutionContext create(const Context& context, const Device& device, const ocl::Queue& queue); + /** @overload */ + static OpenCLExecutionContext create(const Context& context, const Device& device); + + struct Impl; + inline bool empty() const { return !p; } + void release(); +protected: + std::shared_ptr p; +}; + +class OpenCLExecutionContextScope +{ + OpenCLExecutionContext ctx_; +public: + inline OpenCLExecutionContextScope(const OpenCLExecutionContext& ctx) + { + CV_Assert(!ctx.empty()); + ctx_ = OpenCLExecutionContext::getCurrentRef(); + ctx.bind(); + } + + inline ~OpenCLExecutionContextScope() + { + if (!ctx_.empty()) + { + ctx_.bind(); + } + } +}; + +#ifdef __OPENCV_BUILD +namespace internal { + +CV_EXPORTS bool isOpenCLForced(); +#define OCL_FORCE_CHECK(condition) (cv::ocl::internal::isOpenCLForced() || (condition)) + +CV_EXPORTS bool isPerformanceCheckBypassed(); +#define OCL_PERFORMANCE_CHECK(condition) (cv::ocl::internal::isPerformanceCheckBypassed() || (condition)) + +CV_EXPORTS bool isCLBuffer(UMat& u); + +} // namespace internal +#endif + +//! @} + +}} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/ocl_genbase.hpp b/Thirdparty/opencv2/include/opencv2/core/ocl_genbase.hpp new file mode 100644 index 0000000..5334cf1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/ocl_genbase.hpp @@ -0,0 +1,69 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_OPENCL_GENBASE_HPP +#define OPENCV_OPENCL_GENBASE_HPP + +//! @cond IGNORED + +namespace cv { +namespace ocl { + +class ProgramSource; + +namespace internal { + +struct CV_EXPORTS ProgramEntry +{ + const char* module; + const char* name; + const char* programCode; + const char* programHash; + ProgramSource* pProgramSource; + + operator ProgramSource& () const; +}; + +} } } // namespace + +//! @endcond + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/ocl_defs.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/ocl_defs.hpp new file mode 100644 index 0000000..14df750 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/ocl_defs.hpp @@ -0,0 +1,82 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copyright (C) 2014, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. + +#ifndef OPENCV_CORE_OPENCL_DEFS_HPP +#define OPENCV_CORE_OPENCL_DEFS_HPP + +#include "opencv2/core/utility.hpp" +#include "cvconfig.h" + +namespace cv { namespace ocl { +#ifdef HAVE_OPENCL +/// Call is similar to useOpenCL() but doesn't try to load OpenCL runtime or create OpenCL context +CV_EXPORTS bool isOpenCLActivated(); +#else +static inline bool isOpenCLActivated() { return false; } +#endif +}} // namespace + + +//#define CV_OPENCL_RUN_ASSERT + +#ifdef HAVE_OPENCL + +#ifdef CV_OPENCL_RUN_VERBOSE +#define CV_OCL_RUN_(condition, func, ...) \ + { \ + if (cv::ocl::isOpenCLActivated() && (condition) && func) \ + { \ + printf("%s: OpenCL implementation is running\n", CV_Func); \ + fflush(stdout); \ + CV_IMPL_ADD(CV_IMPL_OCL); \ + return __VA_ARGS__; \ + } \ + else \ + { \ + printf("%s: Plain implementation is running\n", CV_Func); \ + fflush(stdout); \ + } \ + } +#elif defined CV_OPENCL_RUN_ASSERT +#define CV_OCL_RUN_(condition, func, ...) \ + { \ + if (cv::ocl::isOpenCLActivated() && (condition)) \ + { \ + if(func) \ + { \ + CV_IMPL_ADD(CV_IMPL_OCL); \ + } \ + else \ + { \ + CV_Error(cv::Error::StsAssert, #func); \ + } \ + return __VA_ARGS__; \ + } \ + } +#else +#define CV_OCL_RUN_(condition, func, ...) \ +try \ +{ \ + if (cv::ocl::isOpenCLActivated() && (condition) && func) \ + { \ + CV_IMPL_ADD(CV_IMPL_OCL); \ + return __VA_ARGS__; \ + } \ +} \ +catch (const cv::Exception& e) \ +{ \ + CV_UNUSED(e); /* TODO: Add some logging here */ \ +} +#endif + +#else +#define CV_OCL_RUN_(condition, func, ...) +#endif + +#define CV_OCL_RUN(condition, func) CV_OCL_RUN_(condition, func) + +#endif // OPENCV_CORE_OPENCL_DEFS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_info.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_info.hpp new file mode 100644 index 0000000..0f0de89 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_info.hpp @@ -0,0 +1,213 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#include +#include + +#include +#include + +#ifndef DUMP_CONFIG_PROPERTY +#define DUMP_CONFIG_PROPERTY(...) +#endif + +#ifndef DUMP_MESSAGE_STDOUT +#define DUMP_MESSAGE_STDOUT(...) do { std::cout << __VA_ARGS__ << std::endl; } while (false) +#endif + +namespace cv { + +namespace { +static std::string bytesToStringRepr(size_t value) +{ + size_t b = value % 1024; + value /= 1024; + + size_t kb = value % 1024; + value /= 1024; + + size_t mb = value % 1024; + value /= 1024; + + size_t gb = value; + + std::ostringstream stream; + + if (gb > 0) + stream << gb << " GB "; + if (mb > 0) + stream << mb << " MB "; + if (kb > 0) + stream << kb << " KB "; + if (b > 0) + stream << b << " B"; + + std::string s = stream.str(); + if (s[s.size() - 1] == ' ') + s = s.substr(0, s.size() - 1); + return s; +} + +static String getDeviceTypeString(const cv::ocl::Device& device) +{ + if (device.type() == cv::ocl::Device::TYPE_CPU) { + return "CPU"; + } + + if (device.type() == cv::ocl::Device::TYPE_GPU) { + if (device.hostUnifiedMemory()) { + return "iGPU"; + } else { + return "dGPU"; + } + } + + return "unknown"; +} +} // namespace + +static void dumpOpenCLInformation() +{ + using namespace cv::ocl; + + try + { + if (!haveOpenCL() || !useOpenCL()) + { + DUMP_MESSAGE_STDOUT("OpenCL is disabled"); + DUMP_CONFIG_PROPERTY("cv_ocl", "disabled"); + return; + } + + std::vector platforms; + cv::ocl::getPlatfomsInfo(platforms); + if (platforms.empty()) + { + DUMP_MESSAGE_STDOUT("OpenCL is not available"); + DUMP_CONFIG_PROPERTY("cv_ocl", "not available"); + return; + } + + DUMP_MESSAGE_STDOUT("OpenCL Platforms: "); + for (size_t i = 0; i < platforms.size(); i++) + { + const PlatformInfo* platform = &platforms[i]; + DUMP_MESSAGE_STDOUT(" " << platform->name()); + Device current_device; + for (int j = 0; j < platform->deviceNumber(); j++) + { + platform->getDevice(current_device, j); + String deviceTypeStr = getDeviceTypeString(current_device); + DUMP_MESSAGE_STDOUT( " " << deviceTypeStr << ": " << current_device.name() << " (" << current_device.version() << ")"); + DUMP_CONFIG_PROPERTY( cv::format("cv_ocl_platform_%d_device_%d", (int)i, j ), + cv::format("(Platform=%s)(Type=%s)(Name=%s)(Version=%s)", + platform->name().c_str(), deviceTypeStr.c_str(), current_device.name().c_str(), current_device.version().c_str()) ); + } + } + const Device& device = Device::getDefault(); + if (!device.available()) + CV_Error(Error::OpenCLInitError, "OpenCL device is not available"); + + DUMP_MESSAGE_STDOUT("Current OpenCL device: "); + + String deviceTypeStr = getDeviceTypeString(device); + DUMP_MESSAGE_STDOUT(" Type = " << deviceTypeStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_deviceType", deviceTypeStr); + + DUMP_MESSAGE_STDOUT(" Name = " << device.name()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_deviceName", device.name()); + + DUMP_MESSAGE_STDOUT(" Version = " << device.version()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_deviceVersion", device.version()); + + DUMP_MESSAGE_STDOUT(" Driver version = " << device.driverVersion()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_driverVersion", device.driverVersion()); + + DUMP_MESSAGE_STDOUT(" Address bits = " << device.addressBits()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_addressBits", device.addressBits()); + + DUMP_MESSAGE_STDOUT(" Compute units = " << device.maxComputeUnits()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_maxComputeUnits", device.maxComputeUnits()); + + DUMP_MESSAGE_STDOUT(" Max work group size = " << device.maxWorkGroupSize()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_maxWorkGroupSize", device.maxWorkGroupSize()); + + std::string localMemorySizeStr = bytesToStringRepr(device.localMemSize()); + DUMP_MESSAGE_STDOUT(" Local memory size = " << localMemorySizeStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_localMemSize", device.localMemSize()); + + std::string maxMemAllocSizeStr = bytesToStringRepr(device.maxMemAllocSize()); + DUMP_MESSAGE_STDOUT(" Max memory allocation size = " << maxMemAllocSizeStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_maxMemAllocSize", device.maxMemAllocSize()); + + const char* doubleSupportStr = device.doubleFPConfig() > 0 ? "Yes" : "No"; + DUMP_MESSAGE_STDOUT(" Double support = " << doubleSupportStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_haveDoubleSupport", device.doubleFPConfig() > 0); + + const char* halfSupportStr = device.halfFPConfig() > 0 ? "Yes" : "No"; + DUMP_MESSAGE_STDOUT(" Half support = " << halfSupportStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_haveHalfSupport", device.halfFPConfig() > 0); + + const char* isUnifiedMemoryStr = device.hostUnifiedMemory() ? "Yes" : "No"; + DUMP_MESSAGE_STDOUT(" Host unified memory = " << isUnifiedMemoryStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_hostUnifiedMemory", device.hostUnifiedMemory()); + + DUMP_MESSAGE_STDOUT(" Device extensions:"); + String extensionsStr = device.extensions(); + size_t pos = 0; + while (pos < extensionsStr.size()) + { + size_t pos2 = extensionsStr.find(' ', pos); + if (pos2 == String::npos) + pos2 = extensionsStr.size(); + if (pos2 > pos) + { + String extensionName = extensionsStr.substr(pos, pos2 - pos); + DUMP_MESSAGE_STDOUT(" " << extensionName); + } + pos = pos2 + 1; + } + DUMP_CONFIG_PROPERTY("cv_ocl_current_extensions", extensionsStr); + + const char* haveAmdBlasStr = haveAmdBlas() ? "Yes" : "No"; + DUMP_MESSAGE_STDOUT(" Has AMD Blas = " << haveAmdBlasStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_AmdBlas", haveAmdBlas()); + + const char* haveAmdFftStr = haveAmdFft() ? "Yes" : "No"; + DUMP_MESSAGE_STDOUT(" Has AMD Fft = " << haveAmdFftStr); + DUMP_CONFIG_PROPERTY("cv_ocl_current_AmdFft", haveAmdFft()); + + + DUMP_MESSAGE_STDOUT(" Preferred vector width char = " << device.preferredVectorWidthChar()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthChar", device.preferredVectorWidthChar()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width short = " << device.preferredVectorWidthShort()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthShort", device.preferredVectorWidthShort()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width int = " << device.preferredVectorWidthInt()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthInt", device.preferredVectorWidthInt()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width long = " << device.preferredVectorWidthLong()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthLong", device.preferredVectorWidthLong()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width float = " << device.preferredVectorWidthFloat()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthFloat", device.preferredVectorWidthFloat()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width double = " << device.preferredVectorWidthDouble()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthDouble", device.preferredVectorWidthDouble()); + + DUMP_MESSAGE_STDOUT(" Preferred vector width half = " << device.preferredVectorWidthHalf()); + DUMP_CONFIG_PROPERTY("cv_ocl_current_preferredVectorWidthHalf", device.preferredVectorWidthHalf()); + } + catch (...) + { + DUMP_MESSAGE_STDOUT("Exception. Can't dump OpenCL info"); + DUMP_MESSAGE_STDOUT("OpenCL device not available"); + DUMP_CONFIG_PROPERTY("cv_ocl", "not available"); + } +} +#undef DUMP_MESSAGE_STDOUT +#undef DUMP_CONFIG_PROPERTY + +} // namespace diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_svm.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_svm.hpp new file mode 100644 index 0000000..7453082 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/opencl_svm.hpp @@ -0,0 +1,81 @@ +/* See LICENSE file in the root OpenCV directory */ + +#ifndef OPENCV_CORE_OPENCL_SVM_HPP +#define OPENCV_CORE_OPENCL_SVM_HPP + +// +// Internal usage only (binary compatibility is not guaranteed) +// +#ifndef __OPENCV_BUILD +#error Internal header file +#endif + +#if defined(HAVE_OPENCL) && defined(HAVE_OPENCL_SVM) +#include "runtime/opencl_core.hpp" +#include "runtime/opencl_svm_20.hpp" +#include "runtime/opencl_svm_hsa_extension.hpp" + +namespace cv { namespace ocl { namespace svm { + +struct SVMCapabilities +{ + enum Value + { + SVM_COARSE_GRAIN_BUFFER = (1 << 0), + SVM_FINE_GRAIN_BUFFER = (1 << 1), + SVM_FINE_GRAIN_SYSTEM = (1 << 2), + SVM_ATOMICS = (1 << 3), + }; + int value_; + + SVMCapabilities(int capabilities = 0) : value_(capabilities) { } + operator int() const { return value_; } + + inline bool isNoSVMSupport() const { return value_ == 0; } + inline bool isSupportCoarseGrainBuffer() const { return (value_ & SVM_COARSE_GRAIN_BUFFER) != 0; } + inline bool isSupportFineGrainBuffer() const { return (value_ & SVM_FINE_GRAIN_BUFFER) != 0; } + inline bool isSupportFineGrainSystem() const { return (value_ & SVM_FINE_GRAIN_SYSTEM) != 0; } + inline bool isSupportAtomics() const { return (value_ & SVM_ATOMICS) != 0; } +}; + +CV_EXPORTS const SVMCapabilities getSVMCapabilitites(const ocl::Context& context); + +struct SVMFunctions +{ + clSVMAllocAMD_fn fn_clSVMAlloc; + clSVMFreeAMD_fn fn_clSVMFree; + clSetKernelArgSVMPointerAMD_fn fn_clSetKernelArgSVMPointer; + //clSetKernelExecInfoAMD_fn fn_clSetKernelExecInfo; + //clEnqueueSVMFreeAMD_fn fn_clEnqueueSVMFree; + clEnqueueSVMMemcpyAMD_fn fn_clEnqueueSVMMemcpy; + clEnqueueSVMMemFillAMD_fn fn_clEnqueueSVMMemFill; + clEnqueueSVMMapAMD_fn fn_clEnqueueSVMMap; + clEnqueueSVMUnmapAMD_fn fn_clEnqueueSVMUnmap; + + inline SVMFunctions() + : fn_clSVMAlloc(NULL), fn_clSVMFree(NULL), + fn_clSetKernelArgSVMPointer(NULL), /*fn_clSetKernelExecInfo(NULL),*/ + /*fn_clEnqueueSVMFree(NULL),*/ fn_clEnqueueSVMMemcpy(NULL), fn_clEnqueueSVMMemFill(NULL), + fn_clEnqueueSVMMap(NULL), fn_clEnqueueSVMUnmap(NULL) + { + // nothing + } + + inline bool isValid() const + { + return fn_clSVMAlloc != NULL && fn_clSVMFree && fn_clSetKernelArgSVMPointer && + /*fn_clSetKernelExecInfo && fn_clEnqueueSVMFree &&*/ fn_clEnqueueSVMMemcpy && + fn_clEnqueueSVMMemFill && fn_clEnqueueSVMMap && fn_clEnqueueSVMUnmap; + } +}; + +// We should guarantee that SVMFunctions lifetime is not less than context's lifetime +CV_EXPORTS const SVMFunctions* getSVMFunctions(const ocl::Context& context); + +CV_EXPORTS bool useSVM(UMatUsageFlags usageFlags); + +}}} //namespace cv::ocl::svm +#endif + +#endif // OPENCV_CORE_OPENCL_SVM_HPP +/* End of file. */ diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clblas.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clblas.hpp new file mode 100644 index 0000000..2749927 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clblas.hpp @@ -0,0 +1,602 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_CLAMDBLAS_HPP +#error "Invalid usage" +#endif + +// generated by parser_clblas.py +#define clblasCaxpy clblasCaxpy_ +#define clblasCcopy clblasCcopy_ +#define clblasCdotc clblasCdotc_ +#define clblasCdotu clblasCdotu_ +#define clblasCgbmv clblasCgbmv_ +#define clblasCgemm clblasCgemm_ +#define clblasCgemv clblasCgemv_ +#define clblasCgerc clblasCgerc_ +#define clblasCgeru clblasCgeru_ +#define clblasChbmv clblasChbmv_ +#define clblasChemm clblasChemm_ +#define clblasChemv clblasChemv_ +#define clblasCher clblasCher_ +#define clblasCher2 clblasCher2_ +#define clblasCher2k clblasCher2k_ +#define clblasCherk clblasCherk_ +#define clblasChpmv clblasChpmv_ +#define clblasChpr clblasChpr_ +#define clblasChpr2 clblasChpr2_ +#define clblasCrotg clblasCrotg_ +#define clblasCscal clblasCscal_ +#define clblasCsrot clblasCsrot_ +#define clblasCsscal clblasCsscal_ +#define clblasCswap clblasCswap_ +#define clblasCsymm clblasCsymm_ +#define clblasCsyr2k clblasCsyr2k_ +#define clblasCsyrk clblasCsyrk_ +#define clblasCtbmv clblasCtbmv_ +#define clblasCtbsv clblasCtbsv_ +#define clblasCtpmv clblasCtpmv_ +#define clblasCtpsv clblasCtpsv_ +#define clblasCtrmm clblasCtrmm_ +#define clblasCtrmv clblasCtrmv_ +#define clblasCtrsm clblasCtrsm_ +#define clblasCtrsv clblasCtrsv_ +#define clblasDasum clblasDasum_ +#define clblasDaxpy clblasDaxpy_ +#define clblasDcopy clblasDcopy_ +#define clblasDdot clblasDdot_ +#define clblasDgbmv clblasDgbmv_ +#define clblasDgemm clblasDgemm_ +#define clblasDgemv clblasDgemv_ +#define clblasDger clblasDger_ +#define clblasDnrm2 clblasDnrm2_ +#define clblasDrot clblasDrot_ +#define clblasDrotg clblasDrotg_ +#define clblasDrotm clblasDrotm_ +#define clblasDrotmg clblasDrotmg_ +#define clblasDsbmv clblasDsbmv_ +#define clblasDscal clblasDscal_ +#define clblasDspmv clblasDspmv_ +#define clblasDspr clblasDspr_ +#define clblasDspr2 clblasDspr2_ +#define clblasDswap clblasDswap_ +#define clblasDsymm clblasDsymm_ +#define clblasDsymv clblasDsymv_ +#define clblasDsyr clblasDsyr_ +#define clblasDsyr2 clblasDsyr2_ +#define clblasDsyr2k clblasDsyr2k_ +#define clblasDsyrk clblasDsyrk_ +#define clblasDtbmv clblasDtbmv_ +#define clblasDtbsv clblasDtbsv_ +#define clblasDtpmv clblasDtpmv_ +#define clblasDtpsv clblasDtpsv_ +#define clblasDtrmm clblasDtrmm_ +#define clblasDtrmv clblasDtrmv_ +#define clblasDtrsm clblasDtrsm_ +#define clblasDtrsv clblasDtrsv_ +#define clblasDzasum clblasDzasum_ +#define clblasDznrm2 clblasDznrm2_ +#define clblasGetVersion clblasGetVersion_ +#define clblasSasum clblasSasum_ +#define clblasSaxpy clblasSaxpy_ +#define clblasScasum clblasScasum_ +#define clblasScnrm2 clblasScnrm2_ +#define clblasScopy clblasScopy_ +#define clblasSdot clblasSdot_ +#define clblasSetup clblasSetup_ +#define clblasSgbmv clblasSgbmv_ +#define clblasSgemm clblasSgemm_ +#define clblasSgemv clblasSgemv_ +#define clblasSger clblasSger_ +#define clblasSnrm2 clblasSnrm2_ +#define clblasSrot clblasSrot_ +#define clblasSrotg clblasSrotg_ +#define clblasSrotm clblasSrotm_ +#define clblasSrotmg clblasSrotmg_ +#define clblasSsbmv clblasSsbmv_ +#define clblasSscal clblasSscal_ +#define clblasSspmv clblasSspmv_ +#define clblasSspr clblasSspr_ +#define clblasSspr2 clblasSspr2_ +#define clblasSswap clblasSswap_ +#define clblasSsymm clblasSsymm_ +#define clblasSsymv clblasSsymv_ +#define clblasSsyr clblasSsyr_ +#define clblasSsyr2 clblasSsyr2_ +#define clblasSsyr2k clblasSsyr2k_ +#define clblasSsyrk clblasSsyrk_ +#define clblasStbmv clblasStbmv_ +#define clblasStbsv clblasStbsv_ +#define clblasStpmv clblasStpmv_ +#define clblasStpsv clblasStpsv_ +#define clblasStrmm clblasStrmm_ +#define clblasStrmv clblasStrmv_ +#define clblasStrsm clblasStrsm_ +#define clblasStrsv clblasStrsv_ +#define clblasTeardown clblasTeardown_ +#define clblasZaxpy clblasZaxpy_ +#define clblasZcopy clblasZcopy_ +#define clblasZdotc clblasZdotc_ +#define clblasZdotu clblasZdotu_ +#define clblasZdrot clblasZdrot_ +#define clblasZdscal clblasZdscal_ +#define clblasZgbmv clblasZgbmv_ +#define clblasZgemm clblasZgemm_ +#define clblasZgemv clblasZgemv_ +#define clblasZgerc clblasZgerc_ +#define clblasZgeru clblasZgeru_ +#define clblasZhbmv clblasZhbmv_ +#define clblasZhemm clblasZhemm_ +#define clblasZhemv clblasZhemv_ +#define clblasZher clblasZher_ +#define clblasZher2 clblasZher2_ +#define clblasZher2k clblasZher2k_ +#define clblasZherk clblasZherk_ +#define clblasZhpmv clblasZhpmv_ +#define clblasZhpr clblasZhpr_ +#define clblasZhpr2 clblasZhpr2_ +#define clblasZrotg clblasZrotg_ +#define clblasZscal clblasZscal_ +#define clblasZswap clblasZswap_ +#define clblasZsymm clblasZsymm_ +#define clblasZsyr2k clblasZsyr2k_ +#define clblasZsyrk clblasZsyrk_ +#define clblasZtbmv clblasZtbmv_ +#define clblasZtbsv clblasZtbsv_ +#define clblasZtpmv clblasZtpmv_ +#define clblasZtpsv clblasZtpsv_ +#define clblasZtrmm clblasZtrmm_ +#define clblasZtrmv clblasZtrmv_ +#define clblasZtrsm clblasZtrsm_ +#define clblasZtrsv clblasZtrsv_ +#define clblasiCamax clblasiCamax_ +#define clblasiDamax clblasiDamax_ +#define clblasiSamax clblasiSamax_ +#define clblasiZamax clblasiZamax_ + +#include + +// generated by parser_clblas.py +#undef clblasCaxpy +//#define clblasCaxpy clblasCaxpy_pfn +#undef clblasCcopy +//#define clblasCcopy clblasCcopy_pfn +#undef clblasCdotc +//#define clblasCdotc clblasCdotc_pfn +#undef clblasCdotu +//#define clblasCdotu clblasCdotu_pfn +#undef clblasCgbmv +//#define clblasCgbmv clblasCgbmv_pfn +#undef clblasCgemm +#define clblasCgemm clblasCgemm_pfn +#undef clblasCgemv +//#define clblasCgemv clblasCgemv_pfn +#undef clblasCgerc +//#define clblasCgerc clblasCgerc_pfn +#undef clblasCgeru +//#define clblasCgeru clblasCgeru_pfn +#undef clblasChbmv +//#define clblasChbmv clblasChbmv_pfn +#undef clblasChemm +//#define clblasChemm clblasChemm_pfn +#undef clblasChemv +//#define clblasChemv clblasChemv_pfn +#undef clblasCher +//#define clblasCher clblasCher_pfn +#undef clblasCher2 +//#define clblasCher2 clblasCher2_pfn +#undef clblasCher2k +//#define clblasCher2k clblasCher2k_pfn +#undef clblasCherk +//#define clblasCherk clblasCherk_pfn +#undef clblasChpmv +//#define clblasChpmv clblasChpmv_pfn +#undef clblasChpr +//#define clblasChpr clblasChpr_pfn +#undef clblasChpr2 +//#define clblasChpr2 clblasChpr2_pfn +#undef clblasCrotg +//#define clblasCrotg clblasCrotg_pfn +#undef clblasCscal +//#define clblasCscal clblasCscal_pfn +#undef clblasCsrot +//#define clblasCsrot clblasCsrot_pfn +#undef clblasCsscal +//#define clblasCsscal clblasCsscal_pfn +#undef clblasCswap +//#define clblasCswap clblasCswap_pfn +#undef clblasCsymm +//#define clblasCsymm clblasCsymm_pfn +#undef clblasCsyr2k +//#define clblasCsyr2k clblasCsyr2k_pfn +#undef clblasCsyrk +//#define clblasCsyrk clblasCsyrk_pfn +#undef clblasCtbmv +//#define clblasCtbmv clblasCtbmv_pfn +#undef clblasCtbsv +//#define clblasCtbsv clblasCtbsv_pfn +#undef clblasCtpmv +//#define clblasCtpmv clblasCtpmv_pfn +#undef clblasCtpsv +//#define clblasCtpsv clblasCtpsv_pfn +#undef clblasCtrmm +//#define clblasCtrmm clblasCtrmm_pfn +#undef clblasCtrmv +//#define clblasCtrmv clblasCtrmv_pfn +#undef clblasCtrsm +//#define clblasCtrsm clblasCtrsm_pfn +#undef clblasCtrsv +//#define clblasCtrsv clblasCtrsv_pfn +#undef clblasDasum +//#define clblasDasum clblasDasum_pfn +#undef clblasDaxpy +//#define clblasDaxpy clblasDaxpy_pfn +#undef clblasDcopy +//#define clblasDcopy clblasDcopy_pfn +#undef clblasDdot +//#define clblasDdot clblasDdot_pfn +#undef clblasDgbmv +//#define clblasDgbmv clblasDgbmv_pfn +#undef clblasDgemm +#define clblasDgemm clblasDgemm_pfn +#undef clblasDgemv +//#define clblasDgemv clblasDgemv_pfn +#undef clblasDger +//#define clblasDger clblasDger_pfn +#undef clblasDnrm2 +//#define clblasDnrm2 clblasDnrm2_pfn +#undef clblasDrot +//#define clblasDrot clblasDrot_pfn +#undef clblasDrotg +//#define clblasDrotg clblasDrotg_pfn +#undef clblasDrotm +//#define clblasDrotm clblasDrotm_pfn +#undef clblasDrotmg +//#define clblasDrotmg clblasDrotmg_pfn +#undef clblasDsbmv +//#define clblasDsbmv clblasDsbmv_pfn +#undef clblasDscal +//#define clblasDscal clblasDscal_pfn +#undef clblasDspmv +//#define clblasDspmv clblasDspmv_pfn +#undef clblasDspr +//#define clblasDspr clblasDspr_pfn +#undef clblasDspr2 +//#define clblasDspr2 clblasDspr2_pfn +#undef clblasDswap +//#define clblasDswap clblasDswap_pfn +#undef clblasDsymm +//#define clblasDsymm clblasDsymm_pfn +#undef clblasDsymv +//#define clblasDsymv clblasDsymv_pfn +#undef clblasDsyr +//#define clblasDsyr clblasDsyr_pfn +#undef clblasDsyr2 +//#define clblasDsyr2 clblasDsyr2_pfn +#undef clblasDsyr2k +//#define clblasDsyr2k clblasDsyr2k_pfn +#undef clblasDsyrk +//#define clblasDsyrk clblasDsyrk_pfn +#undef clblasDtbmv +//#define clblasDtbmv clblasDtbmv_pfn +#undef clblasDtbsv +//#define clblasDtbsv clblasDtbsv_pfn +#undef clblasDtpmv +//#define clblasDtpmv clblasDtpmv_pfn +#undef clblasDtpsv +//#define clblasDtpsv clblasDtpsv_pfn +#undef clblasDtrmm +//#define clblasDtrmm clblasDtrmm_pfn +#undef clblasDtrmv +//#define clblasDtrmv clblasDtrmv_pfn +#undef clblasDtrsm +//#define clblasDtrsm clblasDtrsm_pfn +#undef clblasDtrsv +//#define clblasDtrsv clblasDtrsv_pfn +#undef clblasDzasum +//#define clblasDzasum clblasDzasum_pfn +#undef clblasDznrm2 +//#define clblasDznrm2 clblasDznrm2_pfn +#undef clblasGetVersion +//#define clblasGetVersion clblasGetVersion_pfn +#undef clblasSasum +//#define clblasSasum clblasSasum_pfn +#undef clblasSaxpy +//#define clblasSaxpy clblasSaxpy_pfn +#undef clblasScasum +//#define clblasScasum clblasScasum_pfn +#undef clblasScnrm2 +//#define clblasScnrm2 clblasScnrm2_pfn +#undef clblasScopy +//#define clblasScopy clblasScopy_pfn +#undef clblasSdot +//#define clblasSdot clblasSdot_pfn +#undef clblasSetup +#define clblasSetup clblasSetup_pfn +#undef clblasSgbmv +//#define clblasSgbmv clblasSgbmv_pfn +#undef clblasSgemm +#define clblasSgemm clblasSgemm_pfn +#undef clblasSgemv +//#define clblasSgemv clblasSgemv_pfn +#undef clblasSger +//#define clblasSger clblasSger_pfn +#undef clblasSnrm2 +//#define clblasSnrm2 clblasSnrm2_pfn +#undef clblasSrot +//#define clblasSrot clblasSrot_pfn +#undef clblasSrotg +//#define clblasSrotg clblasSrotg_pfn +#undef clblasSrotm +//#define clblasSrotm clblasSrotm_pfn +#undef clblasSrotmg +//#define clblasSrotmg clblasSrotmg_pfn +#undef clblasSsbmv +//#define clblasSsbmv clblasSsbmv_pfn +#undef clblasSscal +//#define clblasSscal clblasSscal_pfn +#undef clblasSspmv +//#define clblasSspmv clblasSspmv_pfn +#undef clblasSspr +//#define clblasSspr clblasSspr_pfn +#undef clblasSspr2 +//#define clblasSspr2 clblasSspr2_pfn +#undef clblasSswap +//#define clblasSswap clblasSswap_pfn +#undef clblasSsymm +//#define clblasSsymm clblasSsymm_pfn +#undef clblasSsymv +//#define clblasSsymv clblasSsymv_pfn +#undef clblasSsyr +//#define clblasSsyr clblasSsyr_pfn +#undef clblasSsyr2 +//#define clblasSsyr2 clblasSsyr2_pfn +#undef clblasSsyr2k +//#define clblasSsyr2k clblasSsyr2k_pfn +#undef clblasSsyrk +//#define clblasSsyrk clblasSsyrk_pfn +#undef clblasStbmv +//#define clblasStbmv clblasStbmv_pfn +#undef clblasStbsv +//#define clblasStbsv clblasStbsv_pfn +#undef clblasStpmv +//#define clblasStpmv clblasStpmv_pfn +#undef clblasStpsv +//#define clblasStpsv clblasStpsv_pfn +#undef clblasStrmm +//#define clblasStrmm clblasStrmm_pfn +#undef clblasStrmv +//#define clblasStrmv clblasStrmv_pfn +#undef clblasStrsm +//#define clblasStrsm clblasStrsm_pfn +#undef clblasStrsv +//#define clblasStrsv clblasStrsv_pfn +#undef clblasTeardown +#define clblasTeardown clblasTeardown_pfn +#undef clblasZaxpy +//#define clblasZaxpy clblasZaxpy_pfn +#undef clblasZcopy +//#define clblasZcopy clblasZcopy_pfn +#undef clblasZdotc +//#define clblasZdotc clblasZdotc_pfn +#undef clblasZdotu +//#define clblasZdotu clblasZdotu_pfn +#undef clblasZdrot +//#define clblasZdrot clblasZdrot_pfn +#undef clblasZdscal +//#define clblasZdscal clblasZdscal_pfn +#undef clblasZgbmv +//#define clblasZgbmv clblasZgbmv_pfn +#undef clblasZgemm +#define clblasZgemm clblasZgemm_pfn +#undef clblasZgemv +//#define clblasZgemv clblasZgemv_pfn +#undef clblasZgerc +//#define clblasZgerc clblasZgerc_pfn +#undef clblasZgeru +//#define clblasZgeru clblasZgeru_pfn +#undef clblasZhbmv +//#define clblasZhbmv clblasZhbmv_pfn +#undef clblasZhemm +//#define clblasZhemm clblasZhemm_pfn +#undef clblasZhemv +//#define clblasZhemv clblasZhemv_pfn +#undef clblasZher +//#define clblasZher clblasZher_pfn +#undef clblasZher2 +//#define clblasZher2 clblasZher2_pfn +#undef clblasZher2k +//#define clblasZher2k clblasZher2k_pfn +#undef clblasZherk +//#define clblasZherk clblasZherk_pfn +#undef clblasZhpmv +//#define clblasZhpmv clblasZhpmv_pfn +#undef clblasZhpr +//#define clblasZhpr clblasZhpr_pfn +#undef clblasZhpr2 +//#define clblasZhpr2 clblasZhpr2_pfn +#undef clblasZrotg +//#define clblasZrotg clblasZrotg_pfn +#undef clblasZscal +//#define clblasZscal clblasZscal_pfn +#undef clblasZswap +//#define clblasZswap clblasZswap_pfn +#undef clblasZsymm +//#define clblasZsymm clblasZsymm_pfn +#undef clblasZsyr2k +//#define clblasZsyr2k clblasZsyr2k_pfn +#undef clblasZsyrk +//#define clblasZsyrk clblasZsyrk_pfn +#undef clblasZtbmv +//#define clblasZtbmv clblasZtbmv_pfn +#undef clblasZtbsv +//#define clblasZtbsv clblasZtbsv_pfn +#undef clblasZtpmv +//#define clblasZtpmv clblasZtpmv_pfn +#undef clblasZtpsv +//#define clblasZtpsv clblasZtpsv_pfn +#undef clblasZtrmm +//#define clblasZtrmm clblasZtrmm_pfn +#undef clblasZtrmv +//#define clblasZtrmv clblasZtrmv_pfn +#undef clblasZtrsm +//#define clblasZtrsm clblasZtrsm_pfn +#undef clblasZtrsv +//#define clblasZtrsv clblasZtrsv_pfn +#undef clblasiCamax +//#define clblasiCamax clblasiCamax_pfn +#undef clblasiDamax +//#define clblasiDamax clblasiDamax_pfn +#undef clblasiSamax +//#define clblasiSamax clblasiSamax_pfn +#undef clblasiZamax +//#define clblasiZamax clblasiZamax_pfn + +// generated by parser_clblas.py +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCaxpy)(size_t N, cl_float2 alpha, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCcopy)(size_t N, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCdotc)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCdotu)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCgbmv)(clblasOrder order, clblasTranspose trans, size_t M, size_t N, size_t KL, size_t KU, cl_float2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_float2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT clblasStatus (*clblasCgemm)(clblasOrder order, clblasTranspose transA, clblasTranspose transB, size_t M, size_t N, size_t K, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, FloatComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCgemv)(clblasOrder order, clblasTranspose transA, size_t M, size_t N, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, FloatComplex beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCgerc)(clblasOrder order, size_t M, size_t N, cl_float2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCgeru)(clblasOrder order, size_t M, size_t N, cl_float2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChbmv)(clblasOrder order, clblasUplo uplo, size_t N, size_t K, cl_float2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_float2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChemm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_float2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_float2 beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChemv)(clblasOrder order, clblasUplo uplo, size_t N, FloatComplex alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, FloatComplex beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCher)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCher2)(clblasOrder order, clblasUplo uplo, size_t N, cl_float2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCher2k)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, size_t N, size_t K, FloatComplex alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_float beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCherk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, float alpha, const cl_mem A, size_t offa, size_t lda, float beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChpmv)(clblasOrder order, clblasUplo uplo, size_t N, cl_float2 alpha, const cl_mem AP, size_t offa, const cl_mem X, size_t offx, int incx, cl_float2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChpr)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasChpr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_float2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCrotg)(cl_mem CA, size_t offCA, cl_mem CB, size_t offCB, cl_mem C, size_t offC, cl_mem S, size_t offS, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCscal)(size_t N, cl_float2 alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCsrot)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_float C, cl_float S, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCsscal)(size_t N, cl_float alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCswap)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCsymm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_float2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_float2 beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCsyr2k)(clblasOrder order, clblasUplo uplo, clblasTranspose transAB, size_t N, size_t K, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, FloatComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCsyrk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, FloatComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtbmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtbsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtpmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem AP, size_t offa, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtpsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtrmm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtrmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtrsm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, FloatComplex alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasCtrsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDasum)(size_t N, cl_mem asum, size_t offAsum, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDaxpy)(size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDcopy)(size_t N, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDdot)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDgbmv)(clblasOrder order, clblasTranspose trans, size_t M, size_t N, size_t KL, size_t KU, cl_double alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_double beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT clblasStatus (*clblasDgemm)(clblasOrder order, clblasTranspose transA, clblasTranspose transB, size_t M, size_t N, size_t K, cl_double alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, cl_double beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDgemv)(clblasOrder order, clblasTranspose transA, size_t M, size_t N, cl_double alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, cl_double beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDger)(clblasOrder order, size_t M, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDnrm2)(size_t N, cl_mem NRM2, size_t offNRM2, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDrot)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_double C, cl_double S, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDrotg)(cl_mem DA, size_t offDA, cl_mem DB, size_t offDB, cl_mem C, size_t offC, cl_mem S, size_t offS, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDrotm)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, const cl_mem DPARAM, size_t offDparam, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDrotmg)(cl_mem DD1, size_t offDD1, cl_mem DD2, size_t offDD2, cl_mem DX1, size_t offDX1, const cl_mem DY1, size_t offDY1, cl_mem DPARAM, size_t offDparam, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsbmv)(clblasOrder order, clblasUplo uplo, size_t N, size_t K, cl_double alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_double beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDscal)(size_t N, cl_double alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDspmv)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem AP, size_t offa, const cl_mem X, size_t offx, int incx, cl_double beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDspr)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDspr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDswap)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsymm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_double alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_double beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsymv)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, cl_double beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsyr)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsyr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsyr2k)(clblasOrder order, clblasUplo uplo, clblasTranspose transAB, size_t N, size_t K, cl_double alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, cl_double beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDsyrk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, cl_double alpha, const cl_mem A, size_t offA, size_t lda, cl_double beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtbmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtbsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtpmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem AP, size_t offa, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtpsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtrmm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, cl_double alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtrmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtrsm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, cl_double alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDtrsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDzasum)(size_t N, cl_mem asum, size_t offAsum, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasDznrm2)(size_t N, cl_mem NRM2, size_t offNRM2, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasGetVersion)(cl_uint* major, cl_uint* minor, cl_uint* patch); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSasum)(size_t N, cl_mem asum, size_t offAsum, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSaxpy)(size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasScasum)(size_t N, cl_mem asum, size_t offAsum, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasScnrm2)(size_t N, cl_mem NRM2, size_t offNRM2, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasScopy)(size_t N, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSdot)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT clblasStatus (*clblasSetup)(); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSgbmv)(clblasOrder order, clblasTranspose trans, size_t M, size_t N, size_t KL, size_t KU, cl_float alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_float beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT clblasStatus (*clblasSgemm)(clblasOrder order, clblasTranspose transA, clblasTranspose transB, size_t M, size_t N, size_t K, cl_float alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, cl_float beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSgemv)(clblasOrder order, clblasTranspose transA, size_t M, size_t N, cl_float alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, cl_float beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSger)(clblasOrder order, size_t M, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSnrm2)(size_t N, cl_mem NRM2, size_t offNRM2, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSrot)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_float C, cl_float S, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSrotg)(cl_mem SA, size_t offSA, cl_mem SB, size_t offSB, cl_mem C, size_t offC, cl_mem S, size_t offS, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSrotm)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, const cl_mem SPARAM, size_t offSparam, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSrotmg)(cl_mem SD1, size_t offSD1, cl_mem SD2, size_t offSD2, cl_mem SX1, size_t offSX1, const cl_mem SY1, size_t offSY1, cl_mem SPARAM, size_t offSparam, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsbmv)(clblasOrder order, clblasUplo uplo, size_t N, size_t K, cl_float alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_float beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSscal)(size_t N, cl_float alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSspmv)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem AP, size_t offa, const cl_mem X, size_t offx, int incx, cl_float beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSspr)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSspr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSswap)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsymm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_float alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_float beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsymv)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, cl_float beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsyr)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsyr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_float alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsyr2k)(clblasOrder order, clblasUplo uplo, clblasTranspose transAB, size_t N, size_t K, cl_float alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, cl_float beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasSsyrk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, cl_float alpha, const cl_mem A, size_t offA, size_t lda, cl_float beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStbmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStbsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStpmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem AP, size_t offa, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStpsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStrmm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, cl_float alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStrmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStrsm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, cl_float alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasStrsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT void (*clblasTeardown)(); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZaxpy)(size_t N, cl_double2 alpha, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZcopy)(size_t N, const cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZdotc)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZdotu)(size_t N, cl_mem dotProduct, size_t offDP, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZdrot)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_double C, cl_double S, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZdscal)(size_t N, cl_double alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZgbmv)(clblasOrder order, clblasTranspose trans, size_t M, size_t N, size_t KL, size_t KU, cl_double2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_double2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +extern CL_RUNTIME_EXPORT clblasStatus (*clblasZgemm)(clblasOrder order, clblasTranspose transA, clblasTranspose transB, size_t M, size_t N, size_t K, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, DoubleComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZgemv)(clblasOrder order, clblasTranspose transA, size_t M, size_t N, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem x, size_t offx, int incx, DoubleComplex beta, cl_mem y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZgerc)(clblasOrder order, size_t M, size_t N, cl_double2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZgeru)(clblasOrder order, size_t M, size_t N, cl_double2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhbmv)(clblasOrder order, clblasUplo uplo, size_t N, size_t K, cl_double2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, cl_double2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhemm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_double2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_double2 beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhemv)(clblasOrder order, clblasUplo uplo, size_t N, DoubleComplex alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem X, size_t offx, int incx, DoubleComplex beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZher)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZher2)(clblasOrder order, clblasUplo uplo, size_t N, cl_double2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem A, size_t offa, size_t lda, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZher2k)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, size_t N, size_t K, DoubleComplex alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_double beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZherk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, double alpha, const cl_mem A, size_t offa, size_t lda, double beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhpmv)(clblasOrder order, clblasUplo uplo, size_t N, cl_double2 alpha, const cl_mem AP, size_t offa, const cl_mem X, size_t offx, int incx, cl_double2 beta, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhpr)(clblasOrder order, clblasUplo uplo, size_t N, cl_double alpha, const cl_mem X, size_t offx, int incx, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZhpr2)(clblasOrder order, clblasUplo uplo, size_t N, cl_double2 alpha, const cl_mem X, size_t offx, int incx, const cl_mem Y, size_t offy, int incy, cl_mem AP, size_t offa, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZrotg)(cl_mem CA, size_t offCA, cl_mem CB, size_t offCB, cl_mem C, size_t offC, cl_mem S, size_t offS, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZscal)(size_t N, cl_double2 alpha, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZswap)(size_t N, cl_mem X, size_t offx, int incx, cl_mem Y, size_t offy, int incy, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZsymm)(clblasOrder order, clblasSide side, clblasUplo uplo, size_t M, size_t N, cl_double2 alpha, const cl_mem A, size_t offa, size_t lda, const cl_mem B, size_t offb, size_t ldb, cl_double2 beta, cl_mem C, size_t offc, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZsyr2k)(clblasOrder order, clblasUplo uplo, clblasTranspose transAB, size_t N, size_t K, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, const cl_mem B, size_t offB, size_t ldb, DoubleComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZsyrk)(clblasOrder order, clblasUplo uplo, clblasTranspose transA, size_t N, size_t K, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, DoubleComplex beta, cl_mem C, size_t offC, size_t ldc, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtbmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtbsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, size_t K, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtpmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem AP, size_t offa, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtpsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtrmm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtrmv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtrsm)(clblasOrder order, clblasSide side, clblasUplo uplo, clblasTranspose transA, clblasDiag diag, size_t M, size_t N, DoubleComplex alpha, const cl_mem A, size_t offA, size_t lda, cl_mem B, size_t offB, size_t ldb, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasZtrsv)(clblasOrder order, clblasUplo uplo, clblasTranspose trans, clblasDiag diag, size_t N, const cl_mem A, size_t offa, size_t lda, cl_mem X, size_t offx, int incx, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasiCamax)(size_t N, cl_mem iMax, size_t offiMax, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasiDamax)(size_t N, cl_mem iMax, size_t offiMax, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasiSamax)(size_t N, cl_mem iMax, size_t offiMax, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); +//extern CL_RUNTIME_EXPORT clblasStatus (*clblasiZamax)(size_t N, cl_mem iMax, size_t offiMax, const cl_mem X, size_t offx, int incx, cl_mem scratchBuff, cl_uint numCommandQueues, cl_command_queue* commandQueues, cl_uint numEventsInWaitList, const cl_event* eventWaitList, cl_event* events); diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clfft.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clfft.hpp new file mode 100644 index 0000000..dff3b40 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_clfft.hpp @@ -0,0 +1,146 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_CLAMDFFT_HPP +#error "Invalid usage" +#endif + +// generated by parser_clfft.py +#define clfftBakePlan clfftBakePlan_ +#define clfftCopyPlan clfftCopyPlan_ +#define clfftCreateDefaultPlan clfftCreateDefaultPlan_ +#define clfftDestroyPlan clfftDestroyPlan_ +#define clfftEnqueueTransform clfftEnqueueTransform_ +#define clfftGetLayout clfftGetLayout_ +#define clfftGetPlanBatchSize clfftGetPlanBatchSize_ +#define clfftGetPlanContext clfftGetPlanContext_ +#define clfftGetPlanDim clfftGetPlanDim_ +#define clfftGetPlanDistance clfftGetPlanDistance_ +#define clfftGetPlanInStride clfftGetPlanInStride_ +#define clfftGetPlanLength clfftGetPlanLength_ +#define clfftGetPlanOutStride clfftGetPlanOutStride_ +#define clfftGetPlanPrecision clfftGetPlanPrecision_ +#define clfftGetPlanScale clfftGetPlanScale_ +#define clfftGetPlanTransposeResult clfftGetPlanTransposeResult_ +#define clfftGetResultLocation clfftGetResultLocation_ +#define clfftGetTmpBufSize clfftGetTmpBufSize_ +#define clfftGetVersion clfftGetVersion_ +#define clfftSetLayout clfftSetLayout_ +#define clfftSetPlanBatchSize clfftSetPlanBatchSize_ +#define clfftSetPlanCallback clfftSetPlanCallback_ +#define clfftSetPlanDim clfftSetPlanDim_ +#define clfftSetPlanDistance clfftSetPlanDistance_ +#define clfftSetPlanInStride clfftSetPlanInStride_ +#define clfftSetPlanLength clfftSetPlanLength_ +#define clfftSetPlanOutStride clfftSetPlanOutStride_ +#define clfftSetPlanPrecision clfftSetPlanPrecision_ +#define clfftSetPlanScale clfftSetPlanScale_ +#define clfftSetPlanTransposeResult clfftSetPlanTransposeResult_ +#define clfftSetResultLocation clfftSetResultLocation_ +#define clfftSetup clfftSetup_ +#define clfftTeardown clfftTeardown_ + +#include + +// generated by parser_clfft.py +#undef clfftBakePlan +#define clfftBakePlan clfftBakePlan_pfn +#undef clfftCopyPlan +//#define clfftCopyPlan clfftCopyPlan_pfn +#undef clfftCreateDefaultPlan +#define clfftCreateDefaultPlan clfftCreateDefaultPlan_pfn +#undef clfftDestroyPlan +#define clfftDestroyPlan clfftDestroyPlan_pfn +#undef clfftEnqueueTransform +#define clfftEnqueueTransform clfftEnqueueTransform_pfn +#undef clfftGetLayout +//#define clfftGetLayout clfftGetLayout_pfn +#undef clfftGetPlanBatchSize +//#define clfftGetPlanBatchSize clfftGetPlanBatchSize_pfn +#undef clfftGetPlanContext +//#define clfftGetPlanContext clfftGetPlanContext_pfn +#undef clfftGetPlanDim +//#define clfftGetPlanDim clfftGetPlanDim_pfn +#undef clfftGetPlanDistance +//#define clfftGetPlanDistance clfftGetPlanDistance_pfn +#undef clfftGetPlanInStride +//#define clfftGetPlanInStride clfftGetPlanInStride_pfn +#undef clfftGetPlanLength +//#define clfftGetPlanLength clfftGetPlanLength_pfn +#undef clfftGetPlanOutStride +//#define clfftGetPlanOutStride clfftGetPlanOutStride_pfn +#undef clfftGetPlanPrecision +//#define clfftGetPlanPrecision clfftGetPlanPrecision_pfn +#undef clfftGetPlanScale +//#define clfftGetPlanScale clfftGetPlanScale_pfn +#undef clfftGetPlanTransposeResult +//#define clfftGetPlanTransposeResult clfftGetPlanTransposeResult_pfn +#undef clfftGetResultLocation +//#define clfftGetResultLocation clfftGetResultLocation_pfn +#undef clfftGetTmpBufSize +#define clfftGetTmpBufSize clfftGetTmpBufSize_pfn +#undef clfftGetVersion +#define clfftGetVersion clfftGetVersion_pfn +#undef clfftSetLayout +#define clfftSetLayout clfftSetLayout_pfn +#undef clfftSetPlanBatchSize +#define clfftSetPlanBatchSize clfftSetPlanBatchSize_pfn +#undef clfftSetPlanCallback +//#define clfftSetPlanCallback clfftSetPlanCallback_pfn +#undef clfftSetPlanDim +//#define clfftSetPlanDim clfftSetPlanDim_pfn +#undef clfftSetPlanDistance +#define clfftSetPlanDistance clfftSetPlanDistance_pfn +#undef clfftSetPlanInStride +#define clfftSetPlanInStride clfftSetPlanInStride_pfn +#undef clfftSetPlanLength +//#define clfftSetPlanLength clfftSetPlanLength_pfn +#undef clfftSetPlanOutStride +#define clfftSetPlanOutStride clfftSetPlanOutStride_pfn +#undef clfftSetPlanPrecision +#define clfftSetPlanPrecision clfftSetPlanPrecision_pfn +#undef clfftSetPlanScale +#define clfftSetPlanScale clfftSetPlanScale_pfn +#undef clfftSetPlanTransposeResult +//#define clfftSetPlanTransposeResult clfftSetPlanTransposeResult_pfn +#undef clfftSetResultLocation +#define clfftSetResultLocation clfftSetResultLocation_pfn +#undef clfftSetup +#define clfftSetup clfftSetup_pfn +#undef clfftTeardown +#define clfftTeardown clfftTeardown_pfn + +// generated by parser_clfft.py +extern CL_RUNTIME_EXPORT clfftStatus (*clfftBakePlan)(clfftPlanHandle plHandle, cl_uint numQueues, cl_command_queue* commQueueFFT, void (CL_CALLBACK* pfn_notify) (clfftPlanHandle plHandle, void* user_data), void* user_data); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftCopyPlan)(clfftPlanHandle* out_plHandle, cl_context new_context, clfftPlanHandle in_plHandle); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftCreateDefaultPlan)(clfftPlanHandle* plHandle, cl_context context, const clfftDim dim, const size_t* clLengths); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftDestroyPlan)(clfftPlanHandle* plHandle); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftEnqueueTransform)(clfftPlanHandle plHandle, clfftDirection dir, cl_uint numQueuesAndEvents, cl_command_queue* commQueues, cl_uint numWaitEvents, const cl_event* waitEvents, cl_event* outEvents, cl_mem* inputBuffers, cl_mem* outputBuffers, cl_mem tmpBuffer); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetLayout)(const clfftPlanHandle plHandle, clfftLayout* iLayout, clfftLayout* oLayout); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanBatchSize)(const clfftPlanHandle plHandle, size_t* batchSize); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanContext)(const clfftPlanHandle plHandle, cl_context* context); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanDim)(const clfftPlanHandle plHandle, clfftDim* dim, cl_uint* size); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanDistance)(const clfftPlanHandle plHandle, size_t* iDist, size_t* oDist); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanInStride)(const clfftPlanHandle plHandle, const clfftDim dim, size_t* clStrides); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanLength)(const clfftPlanHandle plHandle, const clfftDim dim, size_t* clLengths); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanOutStride)(const clfftPlanHandle plHandle, const clfftDim dim, size_t* clStrides); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanPrecision)(const clfftPlanHandle plHandle, clfftPrecision* precision); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanScale)(const clfftPlanHandle plHandle, clfftDirection dir, cl_float* scale); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetPlanTransposeResult)(const clfftPlanHandle plHandle, clfftResultTransposed* transposed); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetResultLocation)(const clfftPlanHandle plHandle, clfftResultLocation* placeness); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetTmpBufSize)(const clfftPlanHandle plHandle, size_t* buffersize); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftGetVersion)(cl_uint* major, cl_uint* minor, cl_uint* patch); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetLayout)(clfftPlanHandle plHandle, clfftLayout iLayout, clfftLayout oLayout); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanBatchSize)(clfftPlanHandle plHandle, size_t batchSize); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanCallback)(clfftPlanHandle plHandle, const char* funcName, const char* funcString, int localMemSize, clfftCallbackType callbackType, cl_mem* userdata, int numUserdataBuffers); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanDim)(clfftPlanHandle plHandle, const clfftDim dim); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanDistance)(clfftPlanHandle plHandle, size_t iDist, size_t oDist); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanInStride)(clfftPlanHandle plHandle, const clfftDim dim, size_t* clStrides); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanLength)(clfftPlanHandle plHandle, const clfftDim dim, const size_t* clLengths); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanOutStride)(clfftPlanHandle plHandle, const clfftDim dim, size_t* clStrides); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanPrecision)(clfftPlanHandle plHandle, clfftPrecision precision); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanScale)(clfftPlanHandle plHandle, clfftDirection dir, cl_float scale); +//extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetPlanTransposeResult)(clfftPlanHandle plHandle, clfftResultTransposed transposed); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetResultLocation)(clfftPlanHandle plHandle, clfftResultLocation placeness); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftSetup)(const clfftSetupData* setupData); +extern CL_RUNTIME_EXPORT clfftStatus (*clfftTeardown)(); diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core.hpp new file mode 100644 index 0000000..28618a1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core.hpp @@ -0,0 +1,371 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_CORE_HPP +#error "Invalid usage" +#endif + +// generated by parser_cl.py +#define clBuildProgram clBuildProgram_ +#define clCompileProgram clCompileProgram_ +#define clCreateBuffer clCreateBuffer_ +#define clCreateCommandQueue clCreateCommandQueue_ +#define clCreateContext clCreateContext_ +#define clCreateContextFromType clCreateContextFromType_ +#define clCreateImage clCreateImage_ +#define clCreateImage2D clCreateImage2D_ +#define clCreateImage3D clCreateImage3D_ +#define clCreateKernel clCreateKernel_ +#define clCreateKernelsInProgram clCreateKernelsInProgram_ +#define clCreateProgramWithBinary clCreateProgramWithBinary_ +#define clCreateProgramWithBuiltInKernels clCreateProgramWithBuiltInKernels_ +#define clCreateProgramWithSource clCreateProgramWithSource_ +#define clCreateSampler clCreateSampler_ +#define clCreateSubBuffer clCreateSubBuffer_ +#define clCreateSubDevices clCreateSubDevices_ +#define clCreateUserEvent clCreateUserEvent_ +#define clEnqueueBarrier clEnqueueBarrier_ +#define clEnqueueBarrierWithWaitList clEnqueueBarrierWithWaitList_ +#define clEnqueueCopyBuffer clEnqueueCopyBuffer_ +#define clEnqueueCopyBufferRect clEnqueueCopyBufferRect_ +#define clEnqueueCopyBufferToImage clEnqueueCopyBufferToImage_ +#define clEnqueueCopyImage clEnqueueCopyImage_ +#define clEnqueueCopyImageToBuffer clEnqueueCopyImageToBuffer_ +#define clEnqueueFillBuffer clEnqueueFillBuffer_ +#define clEnqueueFillImage clEnqueueFillImage_ +#define clEnqueueMapBuffer clEnqueueMapBuffer_ +#define clEnqueueMapImage clEnqueueMapImage_ +#define clEnqueueMarker clEnqueueMarker_ +#define clEnqueueMarkerWithWaitList clEnqueueMarkerWithWaitList_ +#define clEnqueueMigrateMemObjects clEnqueueMigrateMemObjects_ +#define clEnqueueNDRangeKernel clEnqueueNDRangeKernel_ +#define clEnqueueNativeKernel clEnqueueNativeKernel_ +#define clEnqueueReadBuffer clEnqueueReadBuffer_ +#define clEnqueueReadBufferRect clEnqueueReadBufferRect_ +#define clEnqueueReadImage clEnqueueReadImage_ +#define clEnqueueTask clEnqueueTask_ +#define clEnqueueUnmapMemObject clEnqueueUnmapMemObject_ +#define clEnqueueWaitForEvents clEnqueueWaitForEvents_ +#define clEnqueueWriteBuffer clEnqueueWriteBuffer_ +#define clEnqueueWriteBufferRect clEnqueueWriteBufferRect_ +#define clEnqueueWriteImage clEnqueueWriteImage_ +#define clFinish clFinish_ +#define clFlush clFlush_ +#define clGetCommandQueueInfo clGetCommandQueueInfo_ +#define clGetContextInfo clGetContextInfo_ +#define clGetDeviceIDs clGetDeviceIDs_ +#define clGetDeviceInfo clGetDeviceInfo_ +#define clGetEventInfo clGetEventInfo_ +#define clGetEventProfilingInfo clGetEventProfilingInfo_ +#define clGetExtensionFunctionAddress clGetExtensionFunctionAddress_ +#define clGetExtensionFunctionAddressForPlatform clGetExtensionFunctionAddressForPlatform_ +#define clGetImageInfo clGetImageInfo_ +#define clGetKernelArgInfo clGetKernelArgInfo_ +#define clGetKernelInfo clGetKernelInfo_ +#define clGetKernelWorkGroupInfo clGetKernelWorkGroupInfo_ +#define clGetMemObjectInfo clGetMemObjectInfo_ +#define clGetPlatformIDs clGetPlatformIDs_ +#define clGetPlatformInfo clGetPlatformInfo_ +#define clGetProgramBuildInfo clGetProgramBuildInfo_ +#define clGetProgramInfo clGetProgramInfo_ +#define clGetSamplerInfo clGetSamplerInfo_ +#define clGetSupportedImageFormats clGetSupportedImageFormats_ +#define clLinkProgram clLinkProgram_ +#define clReleaseCommandQueue clReleaseCommandQueue_ +#define clReleaseContext clReleaseContext_ +#define clReleaseDevice clReleaseDevice_ +#define clReleaseEvent clReleaseEvent_ +#define clReleaseKernel clReleaseKernel_ +#define clReleaseMemObject clReleaseMemObject_ +#define clReleaseProgram clReleaseProgram_ +#define clReleaseSampler clReleaseSampler_ +#define clRetainCommandQueue clRetainCommandQueue_ +#define clRetainContext clRetainContext_ +#define clRetainDevice clRetainDevice_ +#define clRetainEvent clRetainEvent_ +#define clRetainKernel clRetainKernel_ +#define clRetainMemObject clRetainMemObject_ +#define clRetainProgram clRetainProgram_ +#define clRetainSampler clRetainSampler_ +#define clSetEventCallback clSetEventCallback_ +#define clSetKernelArg clSetKernelArg_ +#define clSetMemObjectDestructorCallback clSetMemObjectDestructorCallback_ +#define clSetUserEventStatus clSetUserEventStatus_ +#define clUnloadCompiler clUnloadCompiler_ +#define clUnloadPlatformCompiler clUnloadPlatformCompiler_ +#define clWaitForEvents clWaitForEvents_ + +#if defined __APPLE__ +#define CL_SILENCE_DEPRECATION +#include +#else +#include +#endif + +// generated by parser_cl.py +#undef clBuildProgram +#define clBuildProgram clBuildProgram_pfn +#undef clCompileProgram +#define clCompileProgram clCompileProgram_pfn +#undef clCreateBuffer +#define clCreateBuffer clCreateBuffer_pfn +#undef clCreateCommandQueue +#define clCreateCommandQueue clCreateCommandQueue_pfn +#undef clCreateContext +#define clCreateContext clCreateContext_pfn +#undef clCreateContextFromType +#define clCreateContextFromType clCreateContextFromType_pfn +#undef clCreateImage +#define clCreateImage clCreateImage_pfn +#undef clCreateImage2D +#define clCreateImage2D clCreateImage2D_pfn +#undef clCreateImage3D +#define clCreateImage3D clCreateImage3D_pfn +#undef clCreateKernel +#define clCreateKernel clCreateKernel_pfn +#undef clCreateKernelsInProgram +#define clCreateKernelsInProgram clCreateKernelsInProgram_pfn +#undef clCreateProgramWithBinary +#define clCreateProgramWithBinary clCreateProgramWithBinary_pfn +#undef clCreateProgramWithBuiltInKernels +#define clCreateProgramWithBuiltInKernels clCreateProgramWithBuiltInKernels_pfn +#undef clCreateProgramWithSource +#define clCreateProgramWithSource clCreateProgramWithSource_pfn +#undef clCreateSampler +#define clCreateSampler clCreateSampler_pfn +#undef clCreateSubBuffer +#define clCreateSubBuffer clCreateSubBuffer_pfn +#undef clCreateSubDevices +#define clCreateSubDevices clCreateSubDevices_pfn +#undef clCreateUserEvent +#define clCreateUserEvent clCreateUserEvent_pfn +#undef clEnqueueBarrier +#define clEnqueueBarrier clEnqueueBarrier_pfn +#undef clEnqueueBarrierWithWaitList +#define clEnqueueBarrierWithWaitList clEnqueueBarrierWithWaitList_pfn +#undef clEnqueueCopyBuffer +#define clEnqueueCopyBuffer clEnqueueCopyBuffer_pfn +#undef clEnqueueCopyBufferRect +#define clEnqueueCopyBufferRect clEnqueueCopyBufferRect_pfn +#undef clEnqueueCopyBufferToImage +#define clEnqueueCopyBufferToImage clEnqueueCopyBufferToImage_pfn +#undef clEnqueueCopyImage +#define clEnqueueCopyImage clEnqueueCopyImage_pfn +#undef clEnqueueCopyImageToBuffer +#define clEnqueueCopyImageToBuffer clEnqueueCopyImageToBuffer_pfn +#undef clEnqueueFillBuffer +#define clEnqueueFillBuffer clEnqueueFillBuffer_pfn +#undef clEnqueueFillImage +#define clEnqueueFillImage clEnqueueFillImage_pfn +#undef clEnqueueMapBuffer +#define clEnqueueMapBuffer clEnqueueMapBuffer_pfn +#undef clEnqueueMapImage +#define clEnqueueMapImage clEnqueueMapImage_pfn +#undef clEnqueueMarker +#define clEnqueueMarker clEnqueueMarker_pfn +#undef clEnqueueMarkerWithWaitList +#define clEnqueueMarkerWithWaitList clEnqueueMarkerWithWaitList_pfn +#undef clEnqueueMigrateMemObjects +#define clEnqueueMigrateMemObjects clEnqueueMigrateMemObjects_pfn +#undef clEnqueueNDRangeKernel +#define clEnqueueNDRangeKernel clEnqueueNDRangeKernel_pfn +#undef clEnqueueNativeKernel +#define clEnqueueNativeKernel clEnqueueNativeKernel_pfn +#undef clEnqueueReadBuffer +#define clEnqueueReadBuffer clEnqueueReadBuffer_pfn +#undef clEnqueueReadBufferRect +#define clEnqueueReadBufferRect clEnqueueReadBufferRect_pfn +#undef clEnqueueReadImage +#define clEnqueueReadImage clEnqueueReadImage_pfn +#undef clEnqueueTask +#define clEnqueueTask clEnqueueTask_pfn +#undef clEnqueueUnmapMemObject +#define clEnqueueUnmapMemObject clEnqueueUnmapMemObject_pfn +#undef clEnqueueWaitForEvents +#define clEnqueueWaitForEvents clEnqueueWaitForEvents_pfn +#undef clEnqueueWriteBuffer +#define clEnqueueWriteBuffer clEnqueueWriteBuffer_pfn +#undef clEnqueueWriteBufferRect +#define clEnqueueWriteBufferRect clEnqueueWriteBufferRect_pfn +#undef clEnqueueWriteImage +#define clEnqueueWriteImage clEnqueueWriteImage_pfn +#undef clFinish +#define clFinish clFinish_pfn +#undef clFlush +#define clFlush clFlush_pfn +#undef clGetCommandQueueInfo +#define clGetCommandQueueInfo clGetCommandQueueInfo_pfn +#undef clGetContextInfo +#define clGetContextInfo clGetContextInfo_pfn +#undef clGetDeviceIDs +#define clGetDeviceIDs clGetDeviceIDs_pfn +#undef clGetDeviceInfo +#define clGetDeviceInfo clGetDeviceInfo_pfn +#undef clGetEventInfo +#define clGetEventInfo clGetEventInfo_pfn +#undef clGetEventProfilingInfo +#define clGetEventProfilingInfo clGetEventProfilingInfo_pfn +#undef clGetExtensionFunctionAddress +#define clGetExtensionFunctionAddress clGetExtensionFunctionAddress_pfn +#undef clGetExtensionFunctionAddressForPlatform +#define clGetExtensionFunctionAddressForPlatform clGetExtensionFunctionAddressForPlatform_pfn +#undef clGetImageInfo +#define clGetImageInfo clGetImageInfo_pfn +#undef clGetKernelArgInfo +#define clGetKernelArgInfo clGetKernelArgInfo_pfn +#undef clGetKernelInfo +#define clGetKernelInfo clGetKernelInfo_pfn +#undef clGetKernelWorkGroupInfo +#define clGetKernelWorkGroupInfo clGetKernelWorkGroupInfo_pfn +#undef clGetMemObjectInfo +#define clGetMemObjectInfo clGetMemObjectInfo_pfn +#undef clGetPlatformIDs +#define clGetPlatformIDs clGetPlatformIDs_pfn +#undef clGetPlatformInfo +#define clGetPlatformInfo clGetPlatformInfo_pfn +#undef clGetProgramBuildInfo +#define clGetProgramBuildInfo clGetProgramBuildInfo_pfn +#undef clGetProgramInfo +#define clGetProgramInfo clGetProgramInfo_pfn +#undef clGetSamplerInfo +#define clGetSamplerInfo clGetSamplerInfo_pfn +#undef clGetSupportedImageFormats +#define clGetSupportedImageFormats clGetSupportedImageFormats_pfn +#undef clLinkProgram +#define clLinkProgram clLinkProgram_pfn +#undef clReleaseCommandQueue +#define clReleaseCommandQueue clReleaseCommandQueue_pfn +#undef clReleaseContext +#define clReleaseContext clReleaseContext_pfn +#undef clReleaseDevice +#define clReleaseDevice clReleaseDevice_pfn +#undef clReleaseEvent +#define clReleaseEvent clReleaseEvent_pfn +#undef clReleaseKernel +#define clReleaseKernel clReleaseKernel_pfn +#undef clReleaseMemObject +#define clReleaseMemObject clReleaseMemObject_pfn +#undef clReleaseProgram +#define clReleaseProgram clReleaseProgram_pfn +#undef clReleaseSampler +#define clReleaseSampler clReleaseSampler_pfn +#undef clRetainCommandQueue +#define clRetainCommandQueue clRetainCommandQueue_pfn +#undef clRetainContext +#define clRetainContext clRetainContext_pfn +#undef clRetainDevice +#define clRetainDevice clRetainDevice_pfn +#undef clRetainEvent +#define clRetainEvent clRetainEvent_pfn +#undef clRetainKernel +#define clRetainKernel clRetainKernel_pfn +#undef clRetainMemObject +#define clRetainMemObject clRetainMemObject_pfn +#undef clRetainProgram +#define clRetainProgram clRetainProgram_pfn +#undef clRetainSampler +#define clRetainSampler clRetainSampler_pfn +#undef clSetEventCallback +#define clSetEventCallback clSetEventCallback_pfn +#undef clSetKernelArg +#define clSetKernelArg clSetKernelArg_pfn +#undef clSetMemObjectDestructorCallback +#define clSetMemObjectDestructorCallback clSetMemObjectDestructorCallback_pfn +#undef clSetUserEventStatus +#define clSetUserEventStatus clSetUserEventStatus_pfn +#undef clUnloadCompiler +#define clUnloadCompiler clUnloadCompiler_pfn +#undef clUnloadPlatformCompiler +#define clUnloadPlatformCompiler clUnloadPlatformCompiler_pfn +#undef clWaitForEvents +#define clWaitForEvents clWaitForEvents_pfn + +// generated by parser_cl.py +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clBuildProgram)(cl_program, cl_uint, const cl_device_id*, const char*, void (CL_CALLBACK*) (cl_program, void*), void*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clCompileProgram)(cl_program, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, const char**, void (CL_CALLBACK*) (cl_program, void*), void*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateBuffer)(cl_context, cl_mem_flags, size_t, void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_command_queue (CL_API_CALL*clCreateCommandQueue)(cl_context, cl_device_id, cl_command_queue_properties, cl_int*); +extern CL_RUNTIME_EXPORT cl_context (CL_API_CALL*clCreateContext)(const cl_context_properties*, cl_uint, const cl_device_id*, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_context (CL_API_CALL*clCreateContextFromType)(const cl_context_properties*, cl_device_type, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateImage)(cl_context, cl_mem_flags, const cl_image_format*, const cl_image_desc*, void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateImage2D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateImage3D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, size_t, size_t, void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_kernel (CL_API_CALL*clCreateKernel)(cl_program, const char*, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clCreateKernelsInProgram)(cl_program, cl_uint, cl_kernel*, cl_uint*); +extern CL_RUNTIME_EXPORT cl_program (CL_API_CALL*clCreateProgramWithBinary)(cl_context, cl_uint, const cl_device_id*, const size_t*, const unsigned char**, cl_int*, cl_int*); +extern CL_RUNTIME_EXPORT cl_program (CL_API_CALL*clCreateProgramWithBuiltInKernels)(cl_context, cl_uint, const cl_device_id*, const char*, cl_int*); +extern CL_RUNTIME_EXPORT cl_program (CL_API_CALL*clCreateProgramWithSource)(cl_context, cl_uint, const char**, const size_t*, cl_int*); +extern CL_RUNTIME_EXPORT cl_sampler (CL_API_CALL*clCreateSampler)(cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateSubBuffer)(cl_mem, cl_mem_flags, cl_buffer_create_type, const void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clCreateSubDevices)(cl_device_id, const cl_device_partition_property*, cl_uint, cl_device_id*, cl_uint*); +extern CL_RUNTIME_EXPORT cl_event (CL_API_CALL*clCreateUserEvent)(cl_context, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueBarrier)(cl_command_queue); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueBarrierWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueCopyBuffer)(cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueCopyBufferRect)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueCopyBufferToImage)(cl_command_queue, cl_mem, cl_mem, size_t, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueCopyImage)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueCopyImageToBuffer)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, size_t, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueFillBuffer)(cl_command_queue, cl_mem, const void*, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueFillImage)(cl_command_queue, cl_mem, const void*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT void* (CL_API_CALL*clEnqueueMapBuffer)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event*, cl_event*, cl_int*); +extern CL_RUNTIME_EXPORT void* (CL_API_CALL*clEnqueueMapImage)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, const size_t*, const size_t*, size_t*, size_t*, cl_uint, const cl_event*, cl_event*, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueMarker)(cl_command_queue, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueMarkerWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueMigrateMemObjects)(cl_command_queue, cl_uint, const cl_mem*, cl_mem_migration_flags, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueNDRangeKernel)(cl_command_queue, cl_kernel, cl_uint, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueNativeKernel)(cl_command_queue, void (CL_CALLBACK*) (void*), void*, size_t, cl_uint, const cl_mem*, const void**, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueReadBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueReadBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueReadImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueTask)(cl_command_queue, cl_kernel, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueUnmapMemObject)(cl_command_queue, cl_mem, void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueWaitForEvents)(cl_command_queue, cl_uint, const cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueWriteBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueWriteBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueWriteImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clFinish)(cl_command_queue); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clFlush)(cl_command_queue); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetCommandQueueInfo)(cl_command_queue, cl_command_queue_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetContextInfo)(cl_context, cl_context_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetDeviceIDs)(cl_platform_id, cl_device_type, cl_uint, cl_device_id*, cl_uint*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetDeviceInfo)(cl_device_id, cl_device_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetEventInfo)(cl_event, cl_event_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetEventProfilingInfo)(cl_event, cl_profiling_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT void* (CL_API_CALL*clGetExtensionFunctionAddress)(const char*); +extern CL_RUNTIME_EXPORT void* (CL_API_CALL*clGetExtensionFunctionAddressForPlatform)(cl_platform_id, const char*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetImageInfo)(cl_mem, cl_image_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetKernelArgInfo)(cl_kernel, cl_uint, cl_kernel_arg_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetKernelInfo)(cl_kernel, cl_kernel_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetKernelWorkGroupInfo)(cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetMemObjectInfo)(cl_mem, cl_mem_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetPlatformIDs)(cl_uint, cl_platform_id*, cl_uint*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetPlatformInfo)(cl_platform_id, cl_platform_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetProgramBuildInfo)(cl_program, cl_device_id, cl_program_build_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetProgramInfo)(cl_program, cl_program_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetSamplerInfo)(cl_sampler, cl_sampler_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetSupportedImageFormats)(cl_context, cl_mem_flags, cl_mem_object_type, cl_uint, cl_image_format*, cl_uint*); +extern CL_RUNTIME_EXPORT cl_program (CL_API_CALL*clLinkProgram)(cl_context, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, void (CL_CALLBACK*) (cl_program, void*), void*, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseCommandQueue)(cl_command_queue); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseContext)(cl_context); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseDevice)(cl_device_id); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseEvent)(cl_event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseKernel)(cl_kernel); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseMemObject)(cl_mem); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseProgram)(cl_program); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clReleaseSampler)(cl_sampler); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainCommandQueue)(cl_command_queue); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainContext)(cl_context); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainDevice)(cl_device_id); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainEvent)(cl_event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainKernel)(cl_kernel); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainMemObject)(cl_mem); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainProgram)(cl_program); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clRetainSampler)(cl_sampler); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clSetEventCallback)(cl_event, cl_int, void (CL_CALLBACK*) (cl_event, cl_int, void*), void*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clSetKernelArg)(cl_kernel, cl_uint, size_t, const void*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clSetMemObjectDestructorCallback)(cl_mem, void (CL_CALLBACK*) (cl_mem, void*), void*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clSetUserEventStatus)(cl_event, cl_int); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clUnloadCompiler)(); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clUnloadPlatformCompiler)(cl_platform_id); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clWaitForEvents)(cl_uint, const cl_event*); diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core_wrappers.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core_wrappers.hpp new file mode 100644 index 0000000..216b22b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_core_wrappers.hpp @@ -0,0 +1,272 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_WRAPPERS_HPP +#error "Invalid usage" +#endif + +// generated by parser_cl.py +#undef clBuildProgram +#define clBuildProgram clBuildProgram_fn +inline cl_int clBuildProgram(cl_program p0, cl_uint p1, const cl_device_id* p2, const char* p3, void (CL_CALLBACK*p4) (cl_program, void*), void* p5) { return clBuildProgram_pfn(p0, p1, p2, p3, p4, p5); } +#undef clCompileProgram +#define clCompileProgram clCompileProgram_fn +inline cl_int clCompileProgram(cl_program p0, cl_uint p1, const cl_device_id* p2, const char* p3, cl_uint p4, const cl_program* p5, const char** p6, void (CL_CALLBACK*p7) (cl_program, void*), void* p8) { return clCompileProgram_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clCreateBuffer +#define clCreateBuffer clCreateBuffer_fn +inline cl_mem clCreateBuffer(cl_context p0, cl_mem_flags p1, size_t p2, void* p3, cl_int* p4) { return clCreateBuffer_pfn(p0, p1, p2, p3, p4); } +#undef clCreateCommandQueue +#define clCreateCommandQueue clCreateCommandQueue_fn +inline cl_command_queue clCreateCommandQueue(cl_context p0, cl_device_id p1, cl_command_queue_properties p2, cl_int* p3) { return clCreateCommandQueue_pfn(p0, p1, p2, p3); } +#undef clCreateContext +#define clCreateContext clCreateContext_fn +inline cl_context clCreateContext(const cl_context_properties* p0, cl_uint p1, const cl_device_id* p2, void (CL_CALLBACK*p3) (const char*, const void*, size_t, void*), void* p4, cl_int* p5) { return clCreateContext_pfn(p0, p1, p2, p3, p4, p5); } +#undef clCreateContextFromType +#define clCreateContextFromType clCreateContextFromType_fn +inline cl_context clCreateContextFromType(const cl_context_properties* p0, cl_device_type p1, void (CL_CALLBACK*p2) (const char*, const void*, size_t, void*), void* p3, cl_int* p4) { return clCreateContextFromType_pfn(p0, p1, p2, p3, p4); } +#undef clCreateImage +#define clCreateImage clCreateImage_fn +inline cl_mem clCreateImage(cl_context p0, cl_mem_flags p1, const cl_image_format* p2, const cl_image_desc* p3, void* p4, cl_int* p5) { return clCreateImage_pfn(p0, p1, p2, p3, p4, p5); } +#undef clCreateImage2D +#define clCreateImage2D clCreateImage2D_fn +inline cl_mem clCreateImage2D(cl_context p0, cl_mem_flags p1, const cl_image_format* p2, size_t p3, size_t p4, size_t p5, void* p6, cl_int* p7) { return clCreateImage2D_pfn(p0, p1, p2, p3, p4, p5, p6, p7); } +#undef clCreateImage3D +#define clCreateImage3D clCreateImage3D_fn +inline cl_mem clCreateImage3D(cl_context p0, cl_mem_flags p1, const cl_image_format* p2, size_t p3, size_t p4, size_t p5, size_t p6, size_t p7, void* p8, cl_int* p9) { return clCreateImage3D_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); } +#undef clCreateKernel +#define clCreateKernel clCreateKernel_fn +inline cl_kernel clCreateKernel(cl_program p0, const char* p1, cl_int* p2) { return clCreateKernel_pfn(p0, p1, p2); } +#undef clCreateKernelsInProgram +#define clCreateKernelsInProgram clCreateKernelsInProgram_fn +inline cl_int clCreateKernelsInProgram(cl_program p0, cl_uint p1, cl_kernel* p2, cl_uint* p3) { return clCreateKernelsInProgram_pfn(p0, p1, p2, p3); } +#undef clCreateProgramWithBinary +#define clCreateProgramWithBinary clCreateProgramWithBinary_fn +inline cl_program clCreateProgramWithBinary(cl_context p0, cl_uint p1, const cl_device_id* p2, const size_t* p3, const unsigned char** p4, cl_int* p5, cl_int* p6) { return clCreateProgramWithBinary_pfn(p0, p1, p2, p3, p4, p5, p6); } +#undef clCreateProgramWithBuiltInKernels +#define clCreateProgramWithBuiltInKernels clCreateProgramWithBuiltInKernels_fn +inline cl_program clCreateProgramWithBuiltInKernels(cl_context p0, cl_uint p1, const cl_device_id* p2, const char* p3, cl_int* p4) { return clCreateProgramWithBuiltInKernels_pfn(p0, p1, p2, p3, p4); } +#undef clCreateProgramWithSource +#define clCreateProgramWithSource clCreateProgramWithSource_fn +inline cl_program clCreateProgramWithSource(cl_context p0, cl_uint p1, const char** p2, const size_t* p3, cl_int* p4) { return clCreateProgramWithSource_pfn(p0, p1, p2, p3, p4); } +#undef clCreateSampler +#define clCreateSampler clCreateSampler_fn +inline cl_sampler clCreateSampler(cl_context p0, cl_bool p1, cl_addressing_mode p2, cl_filter_mode p3, cl_int* p4) { return clCreateSampler_pfn(p0, p1, p2, p3, p4); } +#undef clCreateSubBuffer +#define clCreateSubBuffer clCreateSubBuffer_fn +inline cl_mem clCreateSubBuffer(cl_mem p0, cl_mem_flags p1, cl_buffer_create_type p2, const void* p3, cl_int* p4) { return clCreateSubBuffer_pfn(p0, p1, p2, p3, p4); } +#undef clCreateSubDevices +#define clCreateSubDevices clCreateSubDevices_fn +inline cl_int clCreateSubDevices(cl_device_id p0, const cl_device_partition_property* p1, cl_uint p2, cl_device_id* p3, cl_uint* p4) { return clCreateSubDevices_pfn(p0, p1, p2, p3, p4); } +#undef clCreateUserEvent +#define clCreateUserEvent clCreateUserEvent_fn +inline cl_event clCreateUserEvent(cl_context p0, cl_int* p1) { return clCreateUserEvent_pfn(p0, p1); } +#undef clEnqueueBarrier +#define clEnqueueBarrier clEnqueueBarrier_fn +inline cl_int clEnqueueBarrier(cl_command_queue p0) { return clEnqueueBarrier_pfn(p0); } +#undef clEnqueueBarrierWithWaitList +#define clEnqueueBarrierWithWaitList clEnqueueBarrierWithWaitList_fn +inline cl_int clEnqueueBarrierWithWaitList(cl_command_queue p0, cl_uint p1, const cl_event* p2, cl_event* p3) { return clEnqueueBarrierWithWaitList_pfn(p0, p1, p2, p3); } +#undef clEnqueueCopyBuffer +#define clEnqueueCopyBuffer clEnqueueCopyBuffer_fn +inline cl_int clEnqueueCopyBuffer(cl_command_queue p0, cl_mem p1, cl_mem p2, size_t p3, size_t p4, size_t p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueCopyBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueCopyBufferRect +#define clEnqueueCopyBufferRect clEnqueueCopyBufferRect_fn +inline cl_int clEnqueueCopyBufferRect(cl_command_queue p0, cl_mem p1, cl_mem p2, const size_t* p3, const size_t* p4, const size_t* p5, size_t p6, size_t p7, size_t p8, size_t p9, cl_uint p10, const cl_event* p11, cl_event* p12) { return clEnqueueCopyBufferRect_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } +#undef clEnqueueCopyBufferToImage +#define clEnqueueCopyBufferToImage clEnqueueCopyBufferToImage_fn +inline cl_int clEnqueueCopyBufferToImage(cl_command_queue p0, cl_mem p1, cl_mem p2, size_t p3, const size_t* p4, const size_t* p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueCopyBufferToImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueCopyImage +#define clEnqueueCopyImage clEnqueueCopyImage_fn +inline cl_int clEnqueueCopyImage(cl_command_queue p0, cl_mem p1, cl_mem p2, const size_t* p3, const size_t* p4, const size_t* p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueCopyImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueCopyImageToBuffer +#define clEnqueueCopyImageToBuffer clEnqueueCopyImageToBuffer_fn +inline cl_int clEnqueueCopyImageToBuffer(cl_command_queue p0, cl_mem p1, cl_mem p2, const size_t* p3, const size_t* p4, size_t p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueCopyImageToBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueFillBuffer +#define clEnqueueFillBuffer clEnqueueFillBuffer_fn +inline cl_int clEnqueueFillBuffer(cl_command_queue p0, cl_mem p1, const void* p2, size_t p3, size_t p4, size_t p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueFillBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueFillImage +#define clEnqueueFillImage clEnqueueFillImage_fn +inline cl_int clEnqueueFillImage(cl_command_queue p0, cl_mem p1, const void* p2, const size_t* p3, const size_t* p4, cl_uint p5, const cl_event* p6, cl_event* p7) { return clEnqueueFillImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7); } +#undef clEnqueueMapBuffer +#define clEnqueueMapBuffer clEnqueueMapBuffer_fn +inline void* clEnqueueMapBuffer(cl_command_queue p0, cl_mem p1, cl_bool p2, cl_map_flags p3, size_t p4, size_t p5, cl_uint p6, const cl_event* p7, cl_event* p8, cl_int* p9) { return clEnqueueMapBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); } +#undef clEnqueueMapImage +#define clEnqueueMapImage clEnqueueMapImage_fn +inline void* clEnqueueMapImage(cl_command_queue p0, cl_mem p1, cl_bool p2, cl_map_flags p3, const size_t* p4, const size_t* p5, size_t* p6, size_t* p7, cl_uint p8, const cl_event* p9, cl_event* p10, cl_int* p11) { return clEnqueueMapImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } +#undef clEnqueueMarker +#define clEnqueueMarker clEnqueueMarker_fn +inline cl_int clEnqueueMarker(cl_command_queue p0, cl_event* p1) { return clEnqueueMarker_pfn(p0, p1); } +#undef clEnqueueMarkerWithWaitList +#define clEnqueueMarkerWithWaitList clEnqueueMarkerWithWaitList_fn +inline cl_int clEnqueueMarkerWithWaitList(cl_command_queue p0, cl_uint p1, const cl_event* p2, cl_event* p3) { return clEnqueueMarkerWithWaitList_pfn(p0, p1, p2, p3); } +#undef clEnqueueMigrateMemObjects +#define clEnqueueMigrateMemObjects clEnqueueMigrateMemObjects_fn +inline cl_int clEnqueueMigrateMemObjects(cl_command_queue p0, cl_uint p1, const cl_mem* p2, cl_mem_migration_flags p3, cl_uint p4, const cl_event* p5, cl_event* p6) { return clEnqueueMigrateMemObjects_pfn(p0, p1, p2, p3, p4, p5, p6); } +#undef clEnqueueNDRangeKernel +#define clEnqueueNDRangeKernel clEnqueueNDRangeKernel_fn +inline cl_int clEnqueueNDRangeKernel(cl_command_queue p0, cl_kernel p1, cl_uint p2, const size_t* p3, const size_t* p4, const size_t* p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueNDRangeKernel_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueNativeKernel +#define clEnqueueNativeKernel clEnqueueNativeKernel_fn +inline cl_int clEnqueueNativeKernel(cl_command_queue p0, void (CL_CALLBACK*p1) (void*), void* p2, size_t p3, cl_uint p4, const cl_mem* p5, const void** p6, cl_uint p7, const cl_event* p8, cl_event* p9) { return clEnqueueNativeKernel_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); } +#undef clEnqueueReadBuffer +#define clEnqueueReadBuffer clEnqueueReadBuffer_fn +inline cl_int clEnqueueReadBuffer(cl_command_queue p0, cl_mem p1, cl_bool p2, size_t p3, size_t p4, void* p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueReadBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueReadBufferRect +#define clEnqueueReadBufferRect clEnqueueReadBufferRect_fn +inline cl_int clEnqueueReadBufferRect(cl_command_queue p0, cl_mem p1, cl_bool p2, const size_t* p3, const size_t* p4, const size_t* p5, size_t p6, size_t p7, size_t p8, size_t p9, void* p10, cl_uint p11, const cl_event* p12, cl_event* p13) { return clEnqueueReadBufferRect_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } +#undef clEnqueueReadImage +#define clEnqueueReadImage clEnqueueReadImage_fn +inline cl_int clEnqueueReadImage(cl_command_queue p0, cl_mem p1, cl_bool p2, const size_t* p3, const size_t* p4, size_t p5, size_t p6, void* p7, cl_uint p8, const cl_event* p9, cl_event* p10) { return clEnqueueReadImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } +#undef clEnqueueTask +#define clEnqueueTask clEnqueueTask_fn +inline cl_int clEnqueueTask(cl_command_queue p0, cl_kernel p1, cl_uint p2, const cl_event* p3, cl_event* p4) { return clEnqueueTask_pfn(p0, p1, p2, p3, p4); } +#undef clEnqueueUnmapMemObject +#define clEnqueueUnmapMemObject clEnqueueUnmapMemObject_fn +inline cl_int clEnqueueUnmapMemObject(cl_command_queue p0, cl_mem p1, void* p2, cl_uint p3, const cl_event* p4, cl_event* p5) { return clEnqueueUnmapMemObject_pfn(p0, p1, p2, p3, p4, p5); } +#undef clEnqueueWaitForEvents +#define clEnqueueWaitForEvents clEnqueueWaitForEvents_fn +inline cl_int clEnqueueWaitForEvents(cl_command_queue p0, cl_uint p1, const cl_event* p2) { return clEnqueueWaitForEvents_pfn(p0, p1, p2); } +#undef clEnqueueWriteBuffer +#define clEnqueueWriteBuffer clEnqueueWriteBuffer_fn +inline cl_int clEnqueueWriteBuffer(cl_command_queue p0, cl_mem p1, cl_bool p2, size_t p3, size_t p4, const void* p5, cl_uint p6, const cl_event* p7, cl_event* p8) { return clEnqueueWriteBuffer_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clEnqueueWriteBufferRect +#define clEnqueueWriteBufferRect clEnqueueWriteBufferRect_fn +inline cl_int clEnqueueWriteBufferRect(cl_command_queue p0, cl_mem p1, cl_bool p2, const size_t* p3, const size_t* p4, const size_t* p5, size_t p6, size_t p7, size_t p8, size_t p9, const void* p10, cl_uint p11, const cl_event* p12, cl_event* p13) { return clEnqueueWriteBufferRect_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } +#undef clEnqueueWriteImage +#define clEnqueueWriteImage clEnqueueWriteImage_fn +inline cl_int clEnqueueWriteImage(cl_command_queue p0, cl_mem p1, cl_bool p2, const size_t* p3, const size_t* p4, size_t p5, size_t p6, const void* p7, cl_uint p8, const cl_event* p9, cl_event* p10) { return clEnqueueWriteImage_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } +#undef clFinish +#define clFinish clFinish_fn +inline cl_int clFinish(cl_command_queue p0) { return clFinish_pfn(p0); } +#undef clFlush +#define clFlush clFlush_fn +inline cl_int clFlush(cl_command_queue p0) { return clFlush_pfn(p0); } +#undef clGetCommandQueueInfo +#define clGetCommandQueueInfo clGetCommandQueueInfo_fn +inline cl_int clGetCommandQueueInfo(cl_command_queue p0, cl_command_queue_info p1, size_t p2, void* p3, size_t* p4) { return clGetCommandQueueInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetContextInfo +#define clGetContextInfo clGetContextInfo_fn +inline cl_int clGetContextInfo(cl_context p0, cl_context_info p1, size_t p2, void* p3, size_t* p4) { return clGetContextInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetDeviceIDs +#define clGetDeviceIDs clGetDeviceIDs_fn +inline cl_int clGetDeviceIDs(cl_platform_id p0, cl_device_type p1, cl_uint p2, cl_device_id* p3, cl_uint* p4) { return clGetDeviceIDs_pfn(p0, p1, p2, p3, p4); } +#undef clGetDeviceInfo +#define clGetDeviceInfo clGetDeviceInfo_fn +inline cl_int clGetDeviceInfo(cl_device_id p0, cl_device_info p1, size_t p2, void* p3, size_t* p4) { return clGetDeviceInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetEventInfo +#define clGetEventInfo clGetEventInfo_fn +inline cl_int clGetEventInfo(cl_event p0, cl_event_info p1, size_t p2, void* p3, size_t* p4) { return clGetEventInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetEventProfilingInfo +#define clGetEventProfilingInfo clGetEventProfilingInfo_fn +inline cl_int clGetEventProfilingInfo(cl_event p0, cl_profiling_info p1, size_t p2, void* p3, size_t* p4) { return clGetEventProfilingInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetExtensionFunctionAddress +#define clGetExtensionFunctionAddress clGetExtensionFunctionAddress_fn +inline void* clGetExtensionFunctionAddress(const char* p0) { return clGetExtensionFunctionAddress_pfn(p0); } +#undef clGetExtensionFunctionAddressForPlatform +#define clGetExtensionFunctionAddressForPlatform clGetExtensionFunctionAddressForPlatform_fn +inline void* clGetExtensionFunctionAddressForPlatform(cl_platform_id p0, const char* p1) { return clGetExtensionFunctionAddressForPlatform_pfn(p0, p1); } +#undef clGetImageInfo +#define clGetImageInfo clGetImageInfo_fn +inline cl_int clGetImageInfo(cl_mem p0, cl_image_info p1, size_t p2, void* p3, size_t* p4) { return clGetImageInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetKernelArgInfo +#define clGetKernelArgInfo clGetKernelArgInfo_fn +inline cl_int clGetKernelArgInfo(cl_kernel p0, cl_uint p1, cl_kernel_arg_info p2, size_t p3, void* p4, size_t* p5) { return clGetKernelArgInfo_pfn(p0, p1, p2, p3, p4, p5); } +#undef clGetKernelInfo +#define clGetKernelInfo clGetKernelInfo_fn +inline cl_int clGetKernelInfo(cl_kernel p0, cl_kernel_info p1, size_t p2, void* p3, size_t* p4) { return clGetKernelInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetKernelWorkGroupInfo +#define clGetKernelWorkGroupInfo clGetKernelWorkGroupInfo_fn +inline cl_int clGetKernelWorkGroupInfo(cl_kernel p0, cl_device_id p1, cl_kernel_work_group_info p2, size_t p3, void* p4, size_t* p5) { return clGetKernelWorkGroupInfo_pfn(p0, p1, p2, p3, p4, p5); } +#undef clGetMemObjectInfo +#define clGetMemObjectInfo clGetMemObjectInfo_fn +inline cl_int clGetMemObjectInfo(cl_mem p0, cl_mem_info p1, size_t p2, void* p3, size_t* p4) { return clGetMemObjectInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetPlatformIDs +#define clGetPlatformIDs clGetPlatformIDs_fn +inline cl_int clGetPlatformIDs(cl_uint p0, cl_platform_id* p1, cl_uint* p2) { return clGetPlatformIDs_pfn(p0, p1, p2); } +#undef clGetPlatformInfo +#define clGetPlatformInfo clGetPlatformInfo_fn +inline cl_int clGetPlatformInfo(cl_platform_id p0, cl_platform_info p1, size_t p2, void* p3, size_t* p4) { return clGetPlatformInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetProgramBuildInfo +#define clGetProgramBuildInfo clGetProgramBuildInfo_fn +inline cl_int clGetProgramBuildInfo(cl_program p0, cl_device_id p1, cl_program_build_info p2, size_t p3, void* p4, size_t* p5) { return clGetProgramBuildInfo_pfn(p0, p1, p2, p3, p4, p5); } +#undef clGetProgramInfo +#define clGetProgramInfo clGetProgramInfo_fn +inline cl_int clGetProgramInfo(cl_program p0, cl_program_info p1, size_t p2, void* p3, size_t* p4) { return clGetProgramInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetSamplerInfo +#define clGetSamplerInfo clGetSamplerInfo_fn +inline cl_int clGetSamplerInfo(cl_sampler p0, cl_sampler_info p1, size_t p2, void* p3, size_t* p4) { return clGetSamplerInfo_pfn(p0, p1, p2, p3, p4); } +#undef clGetSupportedImageFormats +#define clGetSupportedImageFormats clGetSupportedImageFormats_fn +inline cl_int clGetSupportedImageFormats(cl_context p0, cl_mem_flags p1, cl_mem_object_type p2, cl_uint p3, cl_image_format* p4, cl_uint* p5) { return clGetSupportedImageFormats_pfn(p0, p1, p2, p3, p4, p5); } +#undef clLinkProgram +#define clLinkProgram clLinkProgram_fn +inline cl_program clLinkProgram(cl_context p0, cl_uint p1, const cl_device_id* p2, const char* p3, cl_uint p4, const cl_program* p5, void (CL_CALLBACK*p6) (cl_program, void*), void* p7, cl_int* p8) { return clLinkProgram_pfn(p0, p1, p2, p3, p4, p5, p6, p7, p8); } +#undef clReleaseCommandQueue +#define clReleaseCommandQueue clReleaseCommandQueue_fn +inline cl_int clReleaseCommandQueue(cl_command_queue p0) { return clReleaseCommandQueue_pfn(p0); } +#undef clReleaseContext +#define clReleaseContext clReleaseContext_fn +inline cl_int clReleaseContext(cl_context p0) { return clReleaseContext_pfn(p0); } +#undef clReleaseDevice +#define clReleaseDevice clReleaseDevice_fn +inline cl_int clReleaseDevice(cl_device_id p0) { return clReleaseDevice_pfn(p0); } +#undef clReleaseEvent +#define clReleaseEvent clReleaseEvent_fn +inline cl_int clReleaseEvent(cl_event p0) { return clReleaseEvent_pfn(p0); } +#undef clReleaseKernel +#define clReleaseKernel clReleaseKernel_fn +inline cl_int clReleaseKernel(cl_kernel p0) { return clReleaseKernel_pfn(p0); } +#undef clReleaseMemObject +#define clReleaseMemObject clReleaseMemObject_fn +inline cl_int clReleaseMemObject(cl_mem p0) { return clReleaseMemObject_pfn(p0); } +#undef clReleaseProgram +#define clReleaseProgram clReleaseProgram_fn +inline cl_int clReleaseProgram(cl_program p0) { return clReleaseProgram_pfn(p0); } +#undef clReleaseSampler +#define clReleaseSampler clReleaseSampler_fn +inline cl_int clReleaseSampler(cl_sampler p0) { return clReleaseSampler_pfn(p0); } +#undef clRetainCommandQueue +#define clRetainCommandQueue clRetainCommandQueue_fn +inline cl_int clRetainCommandQueue(cl_command_queue p0) { return clRetainCommandQueue_pfn(p0); } +#undef clRetainContext +#define clRetainContext clRetainContext_fn +inline cl_int clRetainContext(cl_context p0) { return clRetainContext_pfn(p0); } +#undef clRetainDevice +#define clRetainDevice clRetainDevice_fn +inline cl_int clRetainDevice(cl_device_id p0) { return clRetainDevice_pfn(p0); } +#undef clRetainEvent +#define clRetainEvent clRetainEvent_fn +inline cl_int clRetainEvent(cl_event p0) { return clRetainEvent_pfn(p0); } +#undef clRetainKernel +#define clRetainKernel clRetainKernel_fn +inline cl_int clRetainKernel(cl_kernel p0) { return clRetainKernel_pfn(p0); } +#undef clRetainMemObject +#define clRetainMemObject clRetainMemObject_fn +inline cl_int clRetainMemObject(cl_mem p0) { return clRetainMemObject_pfn(p0); } +#undef clRetainProgram +#define clRetainProgram clRetainProgram_fn +inline cl_int clRetainProgram(cl_program p0) { return clRetainProgram_pfn(p0); } +#undef clRetainSampler +#define clRetainSampler clRetainSampler_fn +inline cl_int clRetainSampler(cl_sampler p0) { return clRetainSampler_pfn(p0); } +#undef clSetEventCallback +#define clSetEventCallback clSetEventCallback_fn +inline cl_int clSetEventCallback(cl_event p0, cl_int p1, void (CL_CALLBACK*p2) (cl_event, cl_int, void*), void* p3) { return clSetEventCallback_pfn(p0, p1, p2, p3); } +#undef clSetKernelArg +#define clSetKernelArg clSetKernelArg_fn +inline cl_int clSetKernelArg(cl_kernel p0, cl_uint p1, size_t p2, const void* p3) { return clSetKernelArg_pfn(p0, p1, p2, p3); } +#undef clSetMemObjectDestructorCallback +#define clSetMemObjectDestructorCallback clSetMemObjectDestructorCallback_fn +inline cl_int clSetMemObjectDestructorCallback(cl_mem p0, void (CL_CALLBACK*p1) (cl_mem, void*), void* p2) { return clSetMemObjectDestructorCallback_pfn(p0, p1, p2); } +#undef clSetUserEventStatus +#define clSetUserEventStatus clSetUserEventStatus_fn +inline cl_int clSetUserEventStatus(cl_event p0, cl_int p1) { return clSetUserEventStatus_pfn(p0, p1); } +#undef clUnloadCompiler +#define clUnloadCompiler clUnloadCompiler_fn +inline cl_int clUnloadCompiler() { return clUnloadCompiler_pfn(); } +#undef clUnloadPlatformCompiler +#define clUnloadPlatformCompiler clUnloadPlatformCompiler_fn +inline cl_int clUnloadPlatformCompiler(cl_platform_id p0) { return clUnloadPlatformCompiler_pfn(p0); } +#undef clWaitForEvents +#define clWaitForEvents clWaitForEvents_fn +inline cl_int clWaitForEvents(cl_uint p0, const cl_event* p1) { return clWaitForEvents_pfn(p0, p1); } diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp new file mode 100644 index 0000000..0b12aed --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl.hpp @@ -0,0 +1,62 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP +#error "Invalid usage" +#endif + +// generated by parser_cl.py +#define clCreateFromGLBuffer clCreateFromGLBuffer_ +#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_ +#define clCreateFromGLTexture clCreateFromGLTexture_ +#define clCreateFromGLTexture2D clCreateFromGLTexture2D_ +#define clCreateFromGLTexture3D clCreateFromGLTexture3D_ +#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_ +#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_ +#define clGetGLContextInfoKHR clGetGLContextInfoKHR_ +#define clGetGLObjectInfo clGetGLObjectInfo_ +#define clGetGLTextureInfo clGetGLTextureInfo_ + +#if defined __APPLE__ +#include +#else +#include +#endif + +// generated by parser_cl.py +#undef clCreateFromGLBuffer +#define clCreateFromGLBuffer clCreateFromGLBuffer_pfn +#undef clCreateFromGLRenderbuffer +#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_pfn +#undef clCreateFromGLTexture +#define clCreateFromGLTexture clCreateFromGLTexture_pfn +#undef clCreateFromGLTexture2D +#define clCreateFromGLTexture2D clCreateFromGLTexture2D_pfn +#undef clCreateFromGLTexture3D +#define clCreateFromGLTexture3D clCreateFromGLTexture3D_pfn +#undef clEnqueueAcquireGLObjects +#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_pfn +#undef clEnqueueReleaseGLObjects +#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_pfn +#undef clGetGLContextInfoKHR +#define clGetGLContextInfoKHR clGetGLContextInfoKHR_pfn +#undef clGetGLObjectInfo +#define clGetGLObjectInfo clGetGLObjectInfo_pfn +#undef clGetGLTextureInfo +#define clGetGLTextureInfo clGetGLTextureInfo_pfn + +#ifdef cl_khr_gl_sharing + +// generated by parser_cl.py +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateFromGLBuffer)(cl_context, cl_mem_flags, cl_GLuint, int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateFromGLRenderbuffer)(cl_context, cl_mem_flags, cl_GLuint, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateFromGLTexture)(cl_context, cl_mem_flags, cl_GLenum, cl_GLint, cl_GLuint, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateFromGLTexture2D)(cl_context, cl_mem_flags, cl_GLenum, cl_GLint, cl_GLuint, cl_int*); +extern CL_RUNTIME_EXPORT cl_mem (CL_API_CALL*clCreateFromGLTexture3D)(cl_context, cl_mem_flags, cl_GLenum, cl_GLint, cl_GLuint, cl_int*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueAcquireGLObjects)(cl_command_queue, cl_uint, const cl_mem*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clEnqueueReleaseGLObjects)(cl_command_queue, cl_uint, const cl_mem*, cl_uint, const cl_event*, cl_event*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetGLContextInfoKHR)(const cl_context_properties*, cl_gl_context_info, size_t, void*, size_t*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetGLObjectInfo)(cl_mem, cl_gl_object_type*, cl_GLuint*); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL*clGetGLTextureInfo)(cl_mem, cl_gl_texture_info, size_t, void*, size_t*); + +#endif // cl_khr_gl_sharing diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp new file mode 100644 index 0000000..12f342b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/autogenerated/opencl_gl_wrappers.hpp @@ -0,0 +1,42 @@ +// +// AUTOGENERATED, DO NOT EDIT +// +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP +#error "Invalid usage" +#endif + +#ifdef cl_khr_gl_sharing + +// generated by parser_cl.py +#undef clCreateFromGLBuffer +#define clCreateFromGLBuffer clCreateFromGLBuffer_fn +inline cl_mem clCreateFromGLBuffer(cl_context p0, cl_mem_flags p1, cl_GLuint p2, int* p3) { return clCreateFromGLBuffer_pfn(p0, p1, p2, p3); } +#undef clCreateFromGLRenderbuffer +#define clCreateFromGLRenderbuffer clCreateFromGLRenderbuffer_fn +inline cl_mem clCreateFromGLRenderbuffer(cl_context p0, cl_mem_flags p1, cl_GLuint p2, cl_int* p3) { return clCreateFromGLRenderbuffer_pfn(p0, p1, p2, p3); } +#undef clCreateFromGLTexture +#define clCreateFromGLTexture clCreateFromGLTexture_fn +inline cl_mem clCreateFromGLTexture(cl_context p0, cl_mem_flags p1, cl_GLenum p2, cl_GLint p3, cl_GLuint p4, cl_int* p5) { return clCreateFromGLTexture_pfn(p0, p1, p2, p3, p4, p5); } +#undef clCreateFromGLTexture2D +#define clCreateFromGLTexture2D clCreateFromGLTexture2D_fn +inline cl_mem clCreateFromGLTexture2D(cl_context p0, cl_mem_flags p1, cl_GLenum p2, cl_GLint p3, cl_GLuint p4, cl_int* p5) { return clCreateFromGLTexture2D_pfn(p0, p1, p2, p3, p4, p5); } +#undef clCreateFromGLTexture3D +#define clCreateFromGLTexture3D clCreateFromGLTexture3D_fn +inline cl_mem clCreateFromGLTexture3D(cl_context p0, cl_mem_flags p1, cl_GLenum p2, cl_GLint p3, cl_GLuint p4, cl_int* p5) { return clCreateFromGLTexture3D_pfn(p0, p1, p2, p3, p4, p5); } +#undef clEnqueueAcquireGLObjects +#define clEnqueueAcquireGLObjects clEnqueueAcquireGLObjects_fn +inline cl_int clEnqueueAcquireGLObjects(cl_command_queue p0, cl_uint p1, const cl_mem* p2, cl_uint p3, const cl_event* p4, cl_event* p5) { return clEnqueueAcquireGLObjects_pfn(p0, p1, p2, p3, p4, p5); } +#undef clEnqueueReleaseGLObjects +#define clEnqueueReleaseGLObjects clEnqueueReleaseGLObjects_fn +inline cl_int clEnqueueReleaseGLObjects(cl_command_queue p0, cl_uint p1, const cl_mem* p2, cl_uint p3, const cl_event* p4, cl_event* p5) { return clEnqueueReleaseGLObjects_pfn(p0, p1, p2, p3, p4, p5); } +#undef clGetGLContextInfoKHR +#define clGetGLContextInfoKHR clGetGLContextInfoKHR_fn +inline cl_int clGetGLContextInfoKHR(const cl_context_properties* p0, cl_gl_context_info p1, size_t p2, void* p3, size_t* p4) { return clGetGLContextInfoKHR_pfn(p0, p1, p2, p3, p4); } +#undef clGetGLObjectInfo +#define clGetGLObjectInfo clGetGLObjectInfo_fn +inline cl_int clGetGLObjectInfo(cl_mem p0, cl_gl_object_type* p1, cl_GLuint* p2) { return clGetGLObjectInfo_pfn(p0, p1, p2); } +#undef clGetGLTextureInfo +#define clGetGLTextureInfo clGetGLTextureInfo_fn +inline cl_int clGetGLTextureInfo(cl_mem p0, cl_gl_texture_info p1, size_t p2, void* p3, size_t* p4) { return clGetGLTextureInfo_pfn(p0, p1, p2, p3, p4); } + +#endif // cl_khr_gl_sharing diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clblas.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clblas.hpp new file mode 100644 index 0000000..ccddf8f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clblas.hpp @@ -0,0 +1,53 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_CLAMDBLAS_HPP +#define OPENCV_CORE_OCL_RUNTIME_CLAMDBLAS_HPP + +#ifdef HAVE_CLAMDBLAS + +#include "opencl_core.hpp" + +#include "autogenerated/opencl_clblas.hpp" + +#endif // HAVE_CLAMDBLAS + +#endif // OPENCV_CORE_OCL_RUNTIME_CLAMDBLAS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clfft.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clfft.hpp new file mode 100644 index 0000000..7f4af5e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_clfft.hpp @@ -0,0 +1,53 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_CLAMDFFT_HPP +#define OPENCV_CORE_OCL_RUNTIME_CLAMDFFT_HPP + +#ifdef HAVE_CLAMDFFT + +#include "opencl_core.hpp" + +#include "autogenerated/opencl_clfft.hpp" + +#endif // HAVE_CLAMDFFT + +#endif // OPENCV_CORE_OCL_RUNTIME_CLAMDFFT_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core.hpp new file mode 100644 index 0000000..0404b31 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core.hpp @@ -0,0 +1,84 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_CORE_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_CORE_HPP + +#ifdef HAVE_OPENCL + +#ifndef CL_RUNTIME_EXPORT +#if (defined(BUILD_SHARED_LIBS) || defined(OPENCV_CORE_SHARED)) && (defined _WIN32 || defined WINCE) && \ + !(defined(__OPENCV_BUILD) && defined(OPENCV_MODULE_IS_PART_OF_WORLD)) +#define CL_RUNTIME_EXPORT __declspec(dllimport) +#else +#define CL_RUNTIME_EXPORT +#endif +#endif + +#ifdef HAVE_OPENCL_SVM +#define clSVMAlloc clSVMAlloc_ +#define clSVMFree clSVMFree_ +#define clSetKernelArgSVMPointer clSetKernelArgSVMPointer_ +#define clSetKernelExecInfo clSetKernelExecInfo_ +#define clEnqueueSVMFree clEnqueueSVMFree_ +#define clEnqueueSVMMemcpy clEnqueueSVMMemcpy_ +#define clEnqueueSVMMemFill clEnqueueSVMMemFill_ +#define clEnqueueSVMMap clEnqueueSVMMap_ +#define clEnqueueSVMUnmap clEnqueueSVMUnmap_ +#endif + +#include "autogenerated/opencl_core.hpp" + +#ifndef CL_DEVICE_DOUBLE_FP_CONFIG +#define CL_DEVICE_DOUBLE_FP_CONFIG 0x1032 +#endif + +#ifndef CL_DEVICE_HALF_FP_CONFIG +#define CL_DEVICE_HALF_FP_CONFIG 0x1033 +#endif + +#ifndef CL_VERSION_1_2 +#define CV_REQUIRE_OPENCL_1_2_ERROR CV_Error(cv::Error::OpenCLApiCallError, "OpenCV compiled without OpenCL v1.2 support, so we can't use functionality from OpenCL v1.2") +#endif + +#endif // HAVE_OPENCL + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_CORE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core_wrappers.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core_wrappers.hpp new file mode 100644 index 0000000..38fcae9 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_core_wrappers.hpp @@ -0,0 +1,47 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_WRAPPERS_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_WRAPPERS_HPP + +#include "autogenerated/opencl_core_wrappers.hpp" + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_WRAPPERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl.hpp new file mode 100644 index 0000000..659c7d8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl.hpp @@ -0,0 +1,53 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP + +#if defined HAVE_OPENCL && defined HAVE_OPENGL + +#include "opencl_core.hpp" + +#include "autogenerated/opencl_gl.hpp" + +#endif // defined HAVE_OPENCL && defined HAVE_OPENGL + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp new file mode 100644 index 0000000..9700004 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_gl_wrappers.hpp @@ -0,0 +1,47 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP + +#include "autogenerated/opencl_gl_wrappers.hpp" + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_GL_WRAPPERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_20.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_20.hpp new file mode 100644 index 0000000..9636b19 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_20.hpp @@ -0,0 +1,48 @@ +/* See LICENSE file in the root OpenCV directory */ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_2_0_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_2_0_HPP + +#if defined(HAVE_OPENCL_SVM) +#include "opencl_core.hpp" + +#include "opencl_svm_definitions.hpp" + +#undef clSVMAlloc +#define clSVMAlloc clSVMAlloc_pfn +#undef clSVMFree +#define clSVMFree clSVMFree_pfn +#undef clSetKernelArgSVMPointer +#define clSetKernelArgSVMPointer clSetKernelArgSVMPointer_pfn +#undef clSetKernelExecInfo +//#define clSetKernelExecInfo clSetKernelExecInfo_pfn +#undef clEnqueueSVMFree +//#define clEnqueueSVMFree clEnqueueSVMFree_pfn +#undef clEnqueueSVMMemcpy +#define clEnqueueSVMMemcpy clEnqueueSVMMemcpy_pfn +#undef clEnqueueSVMMemFill +#define clEnqueueSVMMemFill clEnqueueSVMMemFill_pfn +#undef clEnqueueSVMMap +#define clEnqueueSVMMap clEnqueueSVMMap_pfn +#undef clEnqueueSVMUnmap +#define clEnqueueSVMUnmap clEnqueueSVMUnmap_pfn + +extern CL_RUNTIME_EXPORT void* (CL_API_CALL *clSVMAlloc)(cl_context context, cl_svm_mem_flags flags, size_t size, unsigned int alignment); +extern CL_RUNTIME_EXPORT void (CL_API_CALL *clSVMFree)(cl_context context, void* svm_pointer); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clSetKernelArgSVMPointer)(cl_kernel kernel, cl_uint arg_index, const void* arg_value); +//extern CL_RUNTIME_EXPORT void* (CL_API_CALL *clSetKernelExecInfo)(cl_kernel kernel, cl_kernel_exec_info param_name, size_t param_value_size, const void* param_value); +//extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clEnqueueSVMFree)(cl_command_queue command_queue, cl_uint num_svm_pointers, void* svm_pointers[], +// void (CL_CALLBACK *pfn_free_func)(cl_command_queue queue, cl_uint num_svm_pointers, void* svm_pointers[], void* user_data), void* user_data, +// cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clEnqueueSVMMemcpy)(cl_command_queue command_queue, cl_bool blocking_copy, void* dst_ptr, const void* src_ptr, size_t size, + cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clEnqueueSVMMemFill)(cl_command_queue command_queue, void* svm_ptr, const void* pattern, size_t pattern_size, size_t size, + cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clEnqueueSVMMap)(cl_command_queue command_queue, cl_bool blocking_map, cl_map_flags map_flags, void* svm_ptr, size_t size, + cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); +extern CL_RUNTIME_EXPORT cl_int (CL_API_CALL *clEnqueueSVMUnmap)(cl_command_queue command_queue, void* svm_ptr, + cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); + +#endif // HAVE_OPENCL_SVM + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_2_0_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_definitions.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_definitions.hpp new file mode 100644 index 0000000..97c927b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_definitions.hpp @@ -0,0 +1,42 @@ +/* See LICENSE file in the root OpenCV directory */ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_DEFINITIONS_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_DEFINITIONS_HPP + +#if defined(HAVE_OPENCL_SVM) +#if defined(CL_VERSION_2_0) + +// OpenCL 2.0 contains SVM definitions + +#else + +typedef cl_bitfield cl_device_svm_capabilities; +typedef cl_bitfield cl_svm_mem_flags; +typedef cl_uint cl_kernel_exec_info; + +// +// TODO Add real values after OpenCL 2.0 release +// + +#ifndef CL_DEVICE_SVM_CAPABILITIES +#define CL_DEVICE_SVM_CAPABILITIES 0x1053 + +#define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER (1 << 0) +#define CL_DEVICE_SVM_FINE_GRAIN_BUFFER (1 << 1) +#define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM (1 << 2) +#define CL_DEVICE_SVM_ATOMICS (1 << 3) +#endif + +#ifndef CL_MEM_SVM_FINE_GRAIN_BUFFER +#define CL_MEM_SVM_FINE_GRAIN_BUFFER (1 << 10) +#endif + +#ifndef CL_MEM_SVM_ATOMICS +#define CL_MEM_SVM_ATOMICS (1 << 11) +#endif + + +#endif // CL_VERSION_2_0 +#endif // HAVE_OPENCL_SVM + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_DEFINITIONS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_hsa_extension.hpp b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_hsa_extension.hpp new file mode 100644 index 0000000..497bc3d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opencl/runtime/opencl_svm_hsa_extension.hpp @@ -0,0 +1,166 @@ +/* See LICENSE file in the root OpenCV directory */ + +#ifndef OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_HSA_EXTENSION_HPP +#define OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_HSA_EXTENSION_HPP + +#if defined(HAVE_OPENCL_SVM) +#include "opencl_core.hpp" + +#ifndef CL_DEVICE_SVM_CAPABILITIES_AMD +// +// Part of the file is an extract from the cl_ext.h file from AMD APP SDK package. +// Below is the original copyright. +// +/******************************************************************************* + * Copyright (c) 2008-2013 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. + ******************************************************************************/ + +/******************************************* + * Shared Virtual Memory (SVM) extension + *******************************************/ +typedef cl_bitfield cl_device_svm_capabilities_amd; +typedef cl_bitfield cl_svm_mem_flags_amd; +typedef cl_uint cl_kernel_exec_info_amd; + +/* cl_device_info */ +#define CL_DEVICE_SVM_CAPABILITIES_AMD 0x1053 +#define CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT_AMD 0x1054 + +/* cl_device_svm_capabilities_amd */ +#define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER_AMD (1 << 0) +#define CL_DEVICE_SVM_FINE_GRAIN_BUFFER_AMD (1 << 1) +#define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM_AMD (1 << 2) +#define CL_DEVICE_SVM_ATOMICS_AMD (1 << 3) + +/* cl_svm_mem_flags_amd */ +#define CL_MEM_SVM_FINE_GRAIN_BUFFER_AMD (1 << 10) +#define CL_MEM_SVM_ATOMICS_AMD (1 << 11) + +/* cl_mem_info */ +#define CL_MEM_USES_SVM_POINTER_AMD 0x1109 + +/* cl_kernel_exec_info_amd */ +#define CL_KERNEL_EXEC_INFO_SVM_PTRS_AMD 0x11B6 +#define CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM_AMD 0x11B7 + +/* cl_command_type */ +#define CL_COMMAND_SVM_FREE_AMD 0x1209 +#define CL_COMMAND_SVM_MEMCPY_AMD 0x120A +#define CL_COMMAND_SVM_MEMFILL_AMD 0x120B +#define CL_COMMAND_SVM_MAP_AMD 0x120C +#define CL_COMMAND_SVM_UNMAP_AMD 0x120D + +typedef CL_API_ENTRY void* +(CL_API_CALL * clSVMAllocAMD_fn)( + cl_context /* context */, + cl_svm_mem_flags_amd /* flags */, + size_t /* size */, + unsigned int /* alignment */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY void +(CL_API_CALL * clSVMFreeAMD_fn)( + cl_context /* context */, + void* /* svm_pointer */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clEnqueueSVMFreeAMD_fn)( + cl_command_queue /* command_queue */, + cl_uint /* num_svm_pointers */, + void** /* svm_pointers */, + void (CL_CALLBACK *)( /*pfn_free_func*/ + cl_command_queue /* queue */, + cl_uint /* num_svm_pointers */, + void** /* svm_pointers */, + void* /* user_data */), + void* /* user_data */, + cl_uint /* num_events_in_wait_list */, + const cl_event* /* event_wait_list */, + cl_event* /* event */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clEnqueueSVMMemcpyAMD_fn)( + cl_command_queue /* command_queue */, + cl_bool /* blocking_copy */, + void* /* dst_ptr */, + const void* /* src_ptr */, + size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event* /* event_wait_list */, + cl_event* /* event */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clEnqueueSVMMemFillAMD_fn)( + cl_command_queue /* command_queue */, + void* /* svm_ptr */, + const void* /* pattern */, + size_t /* pattern_size */, + size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event* /* event_wait_list */, + cl_event* /* event */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clEnqueueSVMMapAMD_fn)( + cl_command_queue /* command_queue */, + cl_bool /* blocking_map */, + cl_map_flags /* map_flags */, + void* /* svm_ptr */, + size_t /* size */, + cl_uint /* num_events_in_wait_list */, + const cl_event* /* event_wait_list */, + cl_event* /* event */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clEnqueueSVMUnmapAMD_fn)( + cl_command_queue /* command_queue */, + void* /* svm_ptr */, + cl_uint /* num_events_in_wait_list */, + const cl_event* /* event_wait_list */, + cl_event* /* event */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clSetKernelArgSVMPointerAMD_fn)( + cl_kernel /* kernel */, + cl_uint /* arg_index */, + const void * /* arg_value */ +) CL_EXT_SUFFIX__VERSION_1_2; + +typedef CL_API_ENTRY cl_int +(CL_API_CALL * clSetKernelExecInfoAMD_fn)( + cl_kernel /* kernel */, + cl_kernel_exec_info_amd /* param_name */, + size_t /* param_value_size */, + const void * /* param_value */ +) CL_EXT_SUFFIX__VERSION_1_2; + +#endif + +#endif // HAVE_OPENCL_SVM + +#endif // OPENCV_CORE_OCL_RUNTIME_OPENCL_SVM_HSA_EXTENSION_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/opengl.hpp b/Thirdparty/opencv2/include/opencv2/core/opengl.hpp new file mode 100644 index 0000000..fceb85b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/opengl.hpp @@ -0,0 +1,733 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OPENGL_HPP +#define OPENCV_CORE_OPENGL_HPP + +#ifndef __cplusplus +# error opengl.hpp header must be compiled as C++ +#endif + +#include "opencv2/core.hpp" +#include "ocl.hpp" + +namespace cv { namespace ogl { + +/** @addtogroup core_opengl +This section describes OpenGL interoperability. + +To enable OpenGL support, configure OpenCV using CMake with WITH_OPENGL=ON . Currently OpenGL is +supported only with WIN32, GTK and Qt backends on Windows and Linux (MacOS and Android are not +supported). For GTK backend gtkglext-1.0 library is required. + +To use OpenGL functionality you should first create OpenGL context (window or frame buffer). You can +do this with namedWindow function or with other OpenGL toolkit (GLUT, for example). +*/ +//! @{ + +/////////////////// OpenGL Objects /////////////////// + +/** @brief Smart pointer for OpenGL buffer object with reference counting. + +Buffer Objects are OpenGL objects that store an array of unformatted memory allocated by the OpenGL +context. These can be used to store vertex data, pixel data retrieved from images or the +framebuffer, and a variety of other things. + +ogl::Buffer has interface similar with Mat interface and represents 2D array memory. + +ogl::Buffer supports memory transfers between host and device and also can be mapped to CUDA memory. + */ +class CV_EXPORTS Buffer +{ +public: + /** @brief The target defines how you intend to use the buffer object. + */ + enum Target + { + ARRAY_BUFFER = 0x8892, //!< The buffer will be used as a source for vertex data + ELEMENT_ARRAY_BUFFER = 0x8893, //!< The buffer will be used for indices (in glDrawElements, for example) + PIXEL_PACK_BUFFER = 0x88EB, //!< The buffer will be used for reading from OpenGL textures + PIXEL_UNPACK_BUFFER = 0x88EC //!< The buffer will be used for writing to OpenGL textures + }; + + enum Access + { + READ_ONLY = 0x88B8, + WRITE_ONLY = 0x88B9, + READ_WRITE = 0x88BA + }; + + /** @brief The constructors. + + Creates empty ogl::Buffer object, creates ogl::Buffer object from existed buffer ( abufId + parameter), allocates memory for ogl::Buffer object or copies from host/device memory. + */ + Buffer(); + + /** @overload + @param arows Number of rows in a 2D array. + @param acols Number of columns in a 2D array. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param abufId Buffer object name. + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Buffer(int arows, int acols, int atype, unsigned int abufId, bool autoRelease = false); + + /** @overload + @param asize 2D array size. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param abufId Buffer object name. + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Buffer(Size asize, int atype, unsigned int abufId, bool autoRelease = false); + + /** @overload + @param arows Number of rows in a 2D array. + @param acols Number of columns in a 2D array. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Buffer(int arows, int acols, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @overload + @param asize 2D array size. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Buffer(Size asize, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @overload + @param arr Input array (host or device memory, it can be Mat , cuda::GpuMat or std::vector ). + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + explicit Buffer(InputArray arr, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @brief Allocates memory for ogl::Buffer object. + + @param arows Number of rows in a 2D array. + @param acols Number of columns in a 2D array. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void create(int arows, int acols, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @overload + @param asize 2D array size. + @param atype Array type ( CV_8UC1, ..., CV_64FC4 ). See Mat for details. + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void create(Size asize, int atype, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @brief Decrements the reference counter and destroys the buffer object if needed. + + The function will call setAutoRelease(true) . + */ + void release(); + + /** @brief Sets auto release mode. + + The lifetime of the OpenGL object is tied to the lifetime of the context. If OpenGL context was + bound to a window it could be released at any time (user can close a window). If object's destructor + is called after destruction of the context it will cause an error. Thus ogl::Buffer doesn't destroy + OpenGL object in destructor by default (all OpenGL resources will be released with OpenGL context). + This function can force ogl::Buffer destructor to destroy OpenGL object. + @param flag Auto release mode (if true, release will be called in object's destructor). + */ + void setAutoRelease(bool flag); + + /** @brief Copies from host/device memory to OpenGL buffer. + @param arr Input array (host or device memory, it can be Mat , cuda::GpuMat or std::vector ). + @param target Buffer usage. See cv::ogl::Buffer::Target . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void copyFrom(InputArray arr, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @overload */ + void copyFrom(InputArray arr, cuda::Stream& stream, Target target = ARRAY_BUFFER, bool autoRelease = false); + + /** @brief Copies from OpenGL buffer to host/device memory or another OpenGL buffer object. + + @param arr Destination array (host or device memory, can be Mat , cuda::GpuMat , std::vector or + ogl::Buffer ). + */ + void copyTo(OutputArray arr) const; + + /** @overload */ + void copyTo(OutputArray arr, cuda::Stream& stream) const; + + /** @brief Creates a full copy of the buffer object and the underlying data. + + @param target Buffer usage for destination buffer. + @param autoRelease Auto release mode for destination buffer. + */ + Buffer clone(Target target = ARRAY_BUFFER, bool autoRelease = false) const; + + /** @brief Binds OpenGL buffer to the specified buffer binding point. + + @param target Binding point. See cv::ogl::Buffer::Target . + */ + void bind(Target target) const; + + /** @brief Unbind any buffers from the specified binding point. + + @param target Binding point. See cv::ogl::Buffer::Target . + */ + static void unbind(Target target); + + /** @brief Maps OpenGL buffer to host memory. + + mapHost maps to the client's address space the entire data store of the buffer object. The data can + then be directly read and/or written relative to the returned pointer, depending on the specified + access policy. + + A mapped data store must be unmapped with ogl::Buffer::unmapHost before its buffer object is used. + + This operation can lead to memory transfers between host and device. + + Only one buffer object can be mapped at a time. + @param access Access policy, indicating whether it will be possible to read from, write to, or both + read from and write to the buffer object's mapped data store. The symbolic constant must be + ogl::Buffer::READ_ONLY , ogl::Buffer::WRITE_ONLY or ogl::Buffer::READ_WRITE . + */ + Mat mapHost(Access access); + + /** @brief Unmaps OpenGL buffer. + */ + void unmapHost(); + + //! map to device memory (blocking) + cuda::GpuMat mapDevice(); + void unmapDevice(); + + /** @brief Maps OpenGL buffer to CUDA device memory. + + This operation doesn't copy data. Several buffer objects can be mapped to CUDA memory at a time. + + A mapped data store must be unmapped with ogl::Buffer::unmapDevice before its buffer object is used. + */ + cuda::GpuMat mapDevice(cuda::Stream& stream); + + /** @brief Unmaps OpenGL buffer. + */ + void unmapDevice(cuda::Stream& stream); + + int rows() const; + int cols() const; + Size size() const; + bool empty() const; + + int type() const; + int depth() const; + int channels() const; + int elemSize() const; + int elemSize1() const; + + //! get OpenGL opject id + unsigned int bufId() const; + + class Impl; + +private: + Ptr impl_; + int rows_; + int cols_; + int type_; +}; + +/** @brief Smart pointer for OpenGL 2D texture memory with reference counting. + */ +class CV_EXPORTS Texture2D +{ +public: + /** @brief An Image Format describes the way that the images in Textures store their data. + */ + enum Format + { + NONE = 0, + DEPTH_COMPONENT = 0x1902, //!< Depth + RGB = 0x1907, //!< Red, Green, Blue + RGBA = 0x1908 //!< Red, Green, Blue, Alpha + }; + + /** @brief The constructors. + + Creates empty ogl::Texture2D object, allocates memory for ogl::Texture2D object or copies from + host/device memory. + */ + Texture2D(); + + /** @overload */ + Texture2D(int arows, int acols, Format aformat, unsigned int atexId, bool autoRelease = false); + + /** @overload */ + Texture2D(Size asize, Format aformat, unsigned int atexId, bool autoRelease = false); + + /** @overload + @param arows Number of rows. + @param acols Number of columns. + @param aformat Image format. See cv::ogl::Texture2D::Format . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Texture2D(int arows, int acols, Format aformat, bool autoRelease = false); + + /** @overload + @param asize 2D array size. + @param aformat Image format. See cv::ogl::Texture2D::Format . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + Texture2D(Size asize, Format aformat, bool autoRelease = false); + + /** @overload + @param arr Input array (host or device memory, it can be Mat , cuda::GpuMat or ogl::Buffer ). + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + explicit Texture2D(InputArray arr, bool autoRelease = false); + + /** @brief Allocates memory for ogl::Texture2D object. + + @param arows Number of rows. + @param acols Number of columns. + @param aformat Image format. See cv::ogl::Texture2D::Format . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void create(int arows, int acols, Format aformat, bool autoRelease = false); + /** @overload + @param asize 2D array size. + @param aformat Image format. See cv::ogl::Texture2D::Format . + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void create(Size asize, Format aformat, bool autoRelease = false); + + /** @brief Decrements the reference counter and destroys the texture object if needed. + + The function will call setAutoRelease(true) . + */ + void release(); + + /** @brief Sets auto release mode. + + @param flag Auto release mode (if true, release will be called in object's destructor). + + The lifetime of the OpenGL object is tied to the lifetime of the context. If OpenGL context was + bound to a window it could be released at any time (user can close a window). If object's destructor + is called after destruction of the context it will cause an error. Thus ogl::Texture2D doesn't + destroy OpenGL object in destructor by default (all OpenGL resources will be released with OpenGL + context). This function can force ogl::Texture2D destructor to destroy OpenGL object. + */ + void setAutoRelease(bool flag); + + /** @brief Copies from host/device memory to OpenGL texture. + + @param arr Input array (host or device memory, it can be Mat , cuda::GpuMat or ogl::Buffer ). + @param autoRelease Auto release mode (if true, release will be called in object's destructor). + */ + void copyFrom(InputArray arr, bool autoRelease = false); + + /** @brief Copies from OpenGL texture to host/device memory or another OpenGL texture object. + + @param arr Destination array (host or device memory, can be Mat , cuda::GpuMat , ogl::Buffer or + ogl::Texture2D ). + @param ddepth Destination depth. + @param autoRelease Auto release mode for destination buffer (if arr is OpenGL buffer or texture). + */ + void copyTo(OutputArray arr, int ddepth = CV_32F, bool autoRelease = false) const; + + /** @brief Binds texture to current active texture unit for GL_TEXTURE_2D target. + */ + void bind() const; + + int rows() const; + int cols() const; + Size size() const; + bool empty() const; + + Format format() const; + + //! get OpenGL opject id + unsigned int texId() const; + + class Impl; + +private: + Ptr impl_; + int rows_; + int cols_; + Format format_; +}; + +/** @brief Wrapper for OpenGL Client-Side Vertex arrays. + +ogl::Arrays stores vertex data in ogl::Buffer objects. + */ +class CV_EXPORTS Arrays +{ +public: + /** @brief Default constructor + */ + Arrays(); + + /** @brief Sets an array of vertex coordinates. + @param vertex array with vertex coordinates, can be both host and device memory. + */ + void setVertexArray(InputArray vertex); + + /** @brief Resets vertex coordinates. + */ + void resetVertexArray(); + + /** @brief Sets an array of vertex colors. + @param color array with vertex colors, can be both host and device memory. + */ + void setColorArray(InputArray color); + + /** @brief Resets vertex colors. + */ + void resetColorArray(); + + /** @brief Sets an array of vertex normals. + @param normal array with vertex normals, can be both host and device memory. + */ + void setNormalArray(InputArray normal); + + /** @brief Resets vertex normals. + */ + void resetNormalArray(); + + /** @brief Sets an array of vertex texture coordinates. + @param texCoord array with vertex texture coordinates, can be both host and device memory. + */ + void setTexCoordArray(InputArray texCoord); + + /** @brief Resets vertex texture coordinates. + */ + void resetTexCoordArray(); + + /** @brief Releases all inner buffers. + */ + void release(); + + /** @brief Sets auto release mode all inner buffers. + @param flag Auto release mode. + */ + void setAutoRelease(bool flag); + + /** @brief Binds all vertex arrays. + */ + void bind() const; + + /** @brief Returns the vertex count. + */ + int size() const; + bool empty() const; + +private: + int size_; + Buffer vertex_; + Buffer color_; + Buffer normal_; + Buffer texCoord_; +}; + +/////////////////// Render Functions /////////////////// + +//! render mode +enum RenderModes { + POINTS = 0x0000, + LINES = 0x0001, + LINE_LOOP = 0x0002, + LINE_STRIP = 0x0003, + TRIANGLES = 0x0004, + TRIANGLE_STRIP = 0x0005, + TRIANGLE_FAN = 0x0006, + QUADS = 0x0007, + QUAD_STRIP = 0x0008, + POLYGON = 0x0009 +}; + +/** @brief Render OpenGL texture or primitives. +@param tex Texture to draw. +@param wndRect Region of window, where to draw a texture (normalized coordinates). +@param texRect Region of texture to draw (normalized coordinates). + */ +CV_EXPORTS void render(const Texture2D& tex, + Rect_ wndRect = Rect_(0.0, 0.0, 1.0, 1.0), + Rect_ texRect = Rect_(0.0, 0.0, 1.0, 1.0)); + +/** @overload +@param arr Array of privitives vertices. +@param mode Render mode. One of cv::ogl::RenderModes +@param color Color for all vertices. Will be used if arr doesn't contain color array. +*/ +CV_EXPORTS void render(const Arrays& arr, int mode = POINTS, Scalar color = Scalar::all(255)); + +/** @overload +@param arr Array of privitives vertices. +@param indices Array of vertices indices (host or device memory). +@param mode Render mode. One of cv::ogl::RenderModes +@param color Color for all vertices. Will be used if arr doesn't contain color array. +*/ +CV_EXPORTS void render(const Arrays& arr, InputArray indices, int mode = POINTS, Scalar color = Scalar::all(255)); + +/////////////////// CL-GL Interoperability Functions /////////////////// + +namespace ocl { +using namespace cv::ocl; + +// TODO static functions in the Context class +/** @brief Creates OpenCL context from GL. +@return Returns reference to OpenCL Context + */ +CV_EXPORTS Context& initializeContextFromGL(); + +} // namespace cv::ogl::ocl + +/** @brief Converts InputArray to Texture2D object. +@param src - source InputArray. +@param texture - destination Texture2D object. + */ +CV_EXPORTS void convertToGLTexture2D(InputArray src, Texture2D& texture); + +/** @brief Converts Texture2D object to OutputArray. +@param texture - source Texture2D object. +@param dst - destination OutputArray. + */ +CV_EXPORTS void convertFromGLTexture2D(const Texture2D& texture, OutputArray dst); + +/** @brief Maps Buffer object to process on CL side (convert to UMat). + +Function creates CL buffer from GL one, and then constructs UMat that can be used +to process buffer data with OpenCV functions. Note that in current implementation +UMat constructed this way doesn't own corresponding GL buffer object, so it is +the user responsibility to close down CL/GL buffers relationships by explicitly +calling unmapGLBuffer() function. +@param buffer - source Buffer object. +@param accessFlags - data access flags (ACCESS_READ|ACCESS_WRITE). +@return Returns UMat object + */ +CV_EXPORTS UMat mapGLBuffer(const Buffer& buffer, AccessFlag accessFlags = ACCESS_READ | ACCESS_WRITE); + +/** @brief Unmaps Buffer object (releases UMat, previously mapped from Buffer). + +Function must be called explicitly by the user for each UMat previously constructed +by the call to mapGLBuffer() function. +@param u - source UMat, created by mapGLBuffer(). + */ +CV_EXPORTS void unmapGLBuffer(UMat& u); + +//! @} +}} // namespace cv::ogl + +namespace cv { namespace cuda { + +/** @brief Sets a CUDA device and initializes it for the current thread with OpenGL interoperability. + +This function should be explicitly called after OpenGL context creation and before any CUDA calls. +@param device System index of a CUDA device starting with 0. +@ingroup core_opengl + */ +CV_EXPORTS void setGlDevice(int device = 0); + +}} + +//! @cond IGNORED + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + +inline +cv::ogl::Buffer::Buffer(int arows, int acols, int atype, Target target, bool autoRelease) : rows_(0), cols_(0), type_(0) +{ + create(arows, acols, atype, target, autoRelease); +} + +inline +cv::ogl::Buffer::Buffer(Size asize, int atype, Target target, bool autoRelease) : rows_(0), cols_(0), type_(0) +{ + create(asize, atype, target, autoRelease); +} + +inline +void cv::ogl::Buffer::create(Size asize, int atype, Target target, bool autoRelease) +{ + create(asize.height, asize.width, atype, target, autoRelease); +} + +inline +int cv::ogl::Buffer::rows() const +{ + return rows_; +} + +inline +int cv::ogl::Buffer::cols() const +{ + return cols_; +} + +inline +cv::Size cv::ogl::Buffer::size() const +{ + return Size(cols_, rows_); +} + +inline +bool cv::ogl::Buffer::empty() const +{ + return rows_ == 0 || cols_ == 0; +} + +inline +int cv::ogl::Buffer::type() const +{ + return type_; +} + +inline +int cv::ogl::Buffer::depth() const +{ + return CV_MAT_DEPTH(type_); +} + +inline +int cv::ogl::Buffer::channels() const +{ + return CV_MAT_CN(type_); +} + +inline +int cv::ogl::Buffer::elemSize() const +{ + return CV_ELEM_SIZE(type_); +} + +inline +int cv::ogl::Buffer::elemSize1() const +{ + return CV_ELEM_SIZE1(type_); +} + +/////// + +inline +cv::ogl::Texture2D::Texture2D(int arows, int acols, Format aformat, bool autoRelease) : rows_(0), cols_(0), format_(NONE) +{ + create(arows, acols, aformat, autoRelease); +} + +inline +cv::ogl::Texture2D::Texture2D(Size asize, Format aformat, bool autoRelease) : rows_(0), cols_(0), format_(NONE) +{ + create(asize, aformat, autoRelease); +} + +inline +void cv::ogl::Texture2D::create(Size asize, Format aformat, bool autoRelease) +{ + create(asize.height, asize.width, aformat, autoRelease); +} + +inline +int cv::ogl::Texture2D::rows() const +{ + return rows_; +} + +inline +int cv::ogl::Texture2D::cols() const +{ + return cols_; +} + +inline +cv::Size cv::ogl::Texture2D::size() const +{ + return Size(cols_, rows_); +} + +inline +bool cv::ogl::Texture2D::empty() const +{ + return rows_ == 0 || cols_ == 0; +} + +inline +cv::ogl::Texture2D::Format cv::ogl::Texture2D::format() const +{ + return format_; +} + +/////// + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif +inline +cv::ogl::Arrays::Arrays() : size_(0) +{ +} +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + +inline +int cv::ogl::Arrays::size() const +{ + return size_; +} + +inline +bool cv::ogl::Arrays::empty() const +{ + return size_ == 0; +} + +//! @endcond + +#endif /* OPENCV_CORE_OPENGL_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/operations.hpp b/Thirdparty/opencv2/include/opencv2/core/operations.hpp new file mode 100644 index 0000000..ab7d429 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/operations.hpp @@ -0,0 +1,612 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_OPERATIONS_HPP +#define OPENCV_CORE_OPERATIONS_HPP + +#ifndef __cplusplus +# error operations.hpp header must be compiled as C++ +#endif + +#include + +#if defined(__GNUC__) || defined(__clang__) // at least GCC 3.1+, clang 3.5+ +# if defined(__MINGW_PRINTF_FORMAT) // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/. +# define CV_FORMAT_PRINTF(string_idx, first_to_check) __attribute__ ((format (__MINGW_PRINTF_FORMAT, string_idx, first_to_check))) +# else +# define CV_FORMAT_PRINTF(string_idx, first_to_check) __attribute__ ((format (printf, string_idx, first_to_check))) +# endif +#else +# define CV_FORMAT_PRINTF(A, B) +#endif + +namespace cv +{ +//! @cond IGNORED + + +////////////////////////////// Matx methods depending on core API ///////////////////////////// + +namespace internal +{ + +template struct Matx_FastInvOp +{ + bool operator()(const Matx<_Tp, m, n>& a, Matx<_Tp, n, m>& b, int method) const + { + return invert(a, b, method) != 0; + } +}; + +template struct Matx_FastInvOp<_Tp, m, m> +{ + bool operator()(const Matx<_Tp, m, m>& a, Matx<_Tp, m, m>& b, int method) const + { + if (method == DECOMP_LU || method == DECOMP_CHOLESKY) + { + Matx<_Tp, m, m> temp = a; + + // assume that b is all 0's on input => make it a unity matrix + for (int i = 0; i < m; i++) + b(i, i) = (_Tp)1; + + if (method == DECOMP_CHOLESKY) + return Cholesky(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m); + + return LU(temp.val, m*sizeof(_Tp), m, b.val, m*sizeof(_Tp), m) != 0; + } + else + { + return invert(a, b, method) != 0; + } + } +}; + +template struct Matx_FastInvOp<_Tp, 2, 2> +{ + bool operator()(const Matx<_Tp, 2, 2>& a, Matx<_Tp, 2, 2>& b, int /*method*/) const + { + _Tp d = (_Tp)determinant(a); + if (d == 0) + return false; + d = 1/d; + b(1,1) = a(0,0)*d; + b(0,0) = a(1,1)*d; + b(0,1) = -a(0,1)*d; + b(1,0) = -a(1,0)*d; + return true; + } +}; + +template struct Matx_FastInvOp<_Tp, 3, 3> +{ + bool operator()(const Matx<_Tp, 3, 3>& a, Matx<_Tp, 3, 3>& b, int /*method*/) const + { + _Tp d = (_Tp)determinant(a); + if (d == 0) + return false; + d = 1/d; + b(0,0) = (a(1,1) * a(2,2) - a(1,2) * a(2,1)) * d; + b(0,1) = (a(0,2) * a(2,1) - a(0,1) * a(2,2)) * d; + b(0,2) = (a(0,1) * a(1,2) - a(0,2) * a(1,1)) * d; + + b(1,0) = (a(1,2) * a(2,0) - a(1,0) * a(2,2)) * d; + b(1,1) = (a(0,0) * a(2,2) - a(0,2) * a(2,0)) * d; + b(1,2) = (a(0,2) * a(1,0) - a(0,0) * a(1,2)) * d; + + b(2,0) = (a(1,0) * a(2,1) - a(1,1) * a(2,0)) * d; + b(2,1) = (a(0,1) * a(2,0) - a(0,0) * a(2,1)) * d; + b(2,2) = (a(0,0) * a(1,1) - a(0,1) * a(1,0)) * d; + return true; + } +}; + + +template struct Matx_FastSolveOp +{ + bool operator()(const Matx<_Tp, m, l>& a, const Matx<_Tp, m, n>& b, + Matx<_Tp, l, n>& x, int method) const + { + return cv::solve(a, b, x, method); + } +}; + +template struct Matx_FastSolveOp<_Tp, m, m, n> +{ + bool operator()(const Matx<_Tp, m, m>& a, const Matx<_Tp, m, n>& b, + Matx<_Tp, m, n>& x, int method) const + { + if (method == DECOMP_LU || method == DECOMP_CHOLESKY) + { + Matx<_Tp, m, m> temp = a; + x = b; + if( method == DECOMP_CHOLESKY ) + return Cholesky(temp.val, m*sizeof(_Tp), m, x.val, n*sizeof(_Tp), n); + + return LU(temp.val, m*sizeof(_Tp), m, x.val, n*sizeof(_Tp), n) != 0; + } + else + { + return cv::solve(a, b, x, method); + } + } +}; + +template struct Matx_FastSolveOp<_Tp, 2, 2, 1> +{ + bool operator()(const Matx<_Tp, 2, 2>& a, const Matx<_Tp, 2, 1>& b, + Matx<_Tp, 2, 1>& x, int) const + { + _Tp d = (_Tp)determinant(a); + if (d == 0) + return false; + d = 1/d; + x(0) = (b(0)*a(1,1) - b(1)*a(0,1))*d; + x(1) = (b(1)*a(0,0) - b(0)*a(1,0))*d; + return true; + } +}; + +template struct Matx_FastSolveOp<_Tp, 3, 3, 1> +{ + bool operator()(const Matx<_Tp, 3, 3>& a, const Matx<_Tp, 3, 1>& b, + Matx<_Tp, 3, 1>& x, int) const + { + _Tp d = (_Tp)determinant(a); + if (d == 0) + return false; + d = 1/d; + x(0) = d*(b(0)*(a(1,1)*a(2,2) - a(1,2)*a(2,1)) - + a(0,1)*(b(1)*a(2,2) - a(1,2)*b(2)) + + a(0,2)*(b(1)*a(2,1) - a(1,1)*b(2))); + + x(1) = d*(a(0,0)*(b(1)*a(2,2) - a(1,2)*b(2)) - + b(0)*(a(1,0)*a(2,2) - a(1,2)*a(2,0)) + + a(0,2)*(a(1,0)*b(2) - b(1)*a(2,0))); + + x(2) = d*(a(0,0)*(a(1,1)*b(2) - b(1)*a(2,1)) - + a(0,1)*(a(1,0)*b(2) - b(1)*a(2,0)) + + b(0)*(a(1,0)*a(2,1) - a(1,1)*a(2,0))); + return true; + } +}; + +} // internal + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::randu(_Tp a, _Tp b) +{ + Matx<_Tp,m,n> M; + cv::randu(M, Scalar(a), Scalar(b)); + return M; +} + +template inline +Matx<_Tp,m,n> Matx<_Tp,m,n>::randn(_Tp a, _Tp b) +{ + Matx<_Tp,m,n> M; + cv::randn(M, Scalar(a), Scalar(b)); + return M; +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::randu(_Tp a, _Tp b) +{ + Vec<_Tp,cn> V; + cv::randu(V, Scalar(a), Scalar(b)); + return V; +} + +template inline +Vec<_Tp, cn> Vec<_Tp, cn>::randn(_Tp a, _Tp b) +{ + Vec<_Tp,cn> V; + cv::randn(V, Scalar(a), Scalar(b)); + return V; +} + +template inline +Matx<_Tp, n, m> Matx<_Tp, m, n>::inv(int method, bool *p_is_ok /*= NULL*/) const +{ + Matx<_Tp, n, m> b; + bool ok = cv::internal::Matx_FastInvOp<_Tp, m, n>()(*this, b, method); + if (p_is_ok) *p_is_ok = ok; + return ok ? b : Matx<_Tp, n, m>::zeros(); +} + +template template inline +Matx<_Tp, n, l> Matx<_Tp, m, n>::solve(const Matx<_Tp, m, l>& rhs, int method) const +{ + Matx<_Tp, n, l> x; + bool ok = cv::internal::Matx_FastSolveOp<_Tp, m, n, l>()(*this, rhs, x, method); + return ok ? x : Matx<_Tp, n, l>::zeros(); +} + + + +////////////////////////// Augmenting algebraic & logical operations ////////////////////////// + +#define CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \ + static inline A& operator op (A& a, const B& b) { cvop; return a; } + +#define CV_MAT_AUG_OPERATOR(op, cvop, A, B) \ + CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \ + CV_MAT_AUG_OPERATOR1(op, cvop, const A, B) + +#define CV_MAT_AUG_OPERATOR_T(op, cvop, A, B) \ + template CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \ + template CV_MAT_AUG_OPERATOR1(op, cvop, const A, B) + +#define CV_MAT_AUG_OPERATOR_TN(op, cvop, A) \ + template static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \ + template static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } + +CV_MAT_AUG_OPERATOR (+=, cv::add(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR (+=, cv::add(a, b, (const Mat&)a), Mat, Scalar) +CV_MAT_AUG_OPERATOR_T(+=, cv::add(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(+=, cv::add(a, b, (const Mat&)a), Mat_<_Tp>, Scalar) +CV_MAT_AUG_OPERATOR_T(+=, cv::add(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (-=, cv::subtract(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR (-=, cv::subtract(a, b, (const Mat&)a), Mat, Scalar) +CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a, b, (const Mat&)a), Mat_<_Tp>, Scalar) +CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat, Mat) +CV_MAT_AUG_OPERATOR_T(*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR (*=, a.convertTo(a, -1, b), Mat, double) +CV_MAT_AUG_OPERATOR_T(*=, a.convertTo(a, -1, b), Mat_<_Tp>, double) +CV_MAT_AUG_OPERATOR_TN(*=, cv::gemm(a, Mat(b), 1, Mat(), 0, a, 0), Mat) +CV_MAT_AUG_OPERATOR_TN(*=, cv::gemm(a, Mat(b), 1, Mat(), 0, a, 0), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (/=, cv::divide(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR_T(/=, cv::divide(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(/=, cv::divide(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR (/=, a.convertTo((Mat&)a, -1, 1./b), Mat, double) +CV_MAT_AUG_OPERATOR_T(/=, a.convertTo((Mat&)a, -1, 1./b), Mat_<_Tp>, double) +CV_MAT_AUG_OPERATOR_TN(/=, cv::divide(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(/=, cv::divide(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (&=, cv::bitwise_and(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR (&=, cv::bitwise_and(a, b, (const Mat&)a), Mat, Scalar) +CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a, b, (const Mat&)a), Mat_<_Tp>, Scalar) +CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (|=, cv::bitwise_or(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR (|=, cv::bitwise_or(a, b, (const Mat&)a), Mat, Scalar) +CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a, b, (const Mat&)a), Mat_<_Tp>, Scalar) +CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +CV_MAT_AUG_OPERATOR (^=, cv::bitwise_xor(a, b, (const Mat&)a), Mat, Mat) +CV_MAT_AUG_OPERATOR (^=, cv::bitwise_xor(a, b, (const Mat&)a), Mat, Scalar) +CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a, b, (const Mat&)a), Mat_<_Tp>, Mat) +CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a, b, (const Mat&)a), Mat_<_Tp>, Scalar) +CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a, b, (const Mat&)a), Mat_<_Tp>, Mat_<_Tp>) +CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), (const Mat&)a), Mat) +CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), (const Mat&)a), Mat_<_Tp>) + +#undef CV_MAT_AUG_OPERATOR_TN +#undef CV_MAT_AUG_OPERATOR_T +#undef CV_MAT_AUG_OPERATOR +#undef CV_MAT_AUG_OPERATOR1 + + + +///////////////////////////////////////////// SVD ///////////////////////////////////////////// + +inline SVD::SVD() {} +inline SVD::SVD( InputArray m, int flags ) { operator ()(m, flags); } +inline void SVD::solveZ( InputArray m, OutputArray _dst ) +{ + Mat mtx = m.getMat(); + SVD svd(mtx, (mtx.rows >= mtx.cols ? 0 : SVD::FULL_UV)); + _dst.create(svd.vt.cols, 1, svd.vt.type()); + Mat dst = _dst.getMat(); + svd.vt.row(svd.vt.rows-1).reshape(1,svd.vt.cols).copyTo(dst); +} + +template inline void + SVD::compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w, Matx<_Tp, m, nm>& u, Matx<_Tp, n, nm>& vt ) +{ + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); + Mat _a(a, false), _u(u, false), _w(w, false), _vt(vt, false); + SVD::compute(_a, _w, _u, _vt); + CV_Assert(_w.data == (uchar*)&w.val[0] && _u.data == (uchar*)&u.val[0] && _vt.data == (uchar*)&vt.val[0]); +} + +template inline void +SVD::compute( const Matx<_Tp, m, n>& a, Matx<_Tp, nm, 1>& w ) +{ + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); + Mat _a(a, false), _w(w, false); + SVD::compute(_a, _w); + CV_Assert(_w.data == (uchar*)&w.val[0]); +} + +template inline void +SVD::backSubst( const Matx<_Tp, nm, 1>& w, const Matx<_Tp, m, nm>& u, + const Matx<_Tp, n, nm>& vt, const Matx<_Tp, m, nb>& rhs, + Matx<_Tp, n, nb>& dst ) +{ + CV_StaticAssert( nm == MIN(m, n), "Invalid size of output vector."); + Mat _u(u, false), _w(w, false), _vt(vt, false), _rhs(rhs, false), _dst(dst, false); + SVD::backSubst(_w, _u, _vt, _rhs, _dst); + CV_Assert(_dst.data == (uchar*)&dst.val[0]); +} + + + +/////////////////////////////////// Multiply-with-Carry RNG /////////////////////////////////// + +inline RNG::RNG() { state = 0xffffffff; } +inline RNG::RNG(uint64 _state) { state = _state ? _state : 0xffffffff; } + +inline RNG::operator uchar() { return (uchar)next(); } +inline RNG::operator schar() { return (schar)next(); } +inline RNG::operator ushort() { return (ushort)next(); } +inline RNG::operator short() { return (short)next(); } +inline RNG::operator int() { return (int)next(); } +inline RNG::operator unsigned() { return next(); } +inline RNG::operator float() { return next()*2.3283064365386962890625e-10f; } +inline RNG::operator double() { unsigned t = next(); return (((uint64)t << 32) | next()) * 5.4210108624275221700372640043497e-20; } + +inline unsigned RNG::operator ()(unsigned N) { return (unsigned)uniform(0,N); } +inline unsigned RNG::operator ()() { return next(); } + +inline int RNG::uniform(int a, int b) { return a == b ? a : (int)(next() % (b - a) + a); } +inline float RNG::uniform(float a, float b) { return ((float)*this)*(b - a) + a; } +inline double RNG::uniform(double a, double b) { return ((double)*this)*(b - a) + a; } + +inline bool RNG::operator ==(const RNG& other) const { return state == other.state; } + +inline unsigned RNG::next() +{ + state = (uint64)(unsigned)state* /*CV_RNG_COEFF*/ 4164903690U + (unsigned)(state >> 32); + return (unsigned)state; +} + +//! returns the next uniformly-distributed random number of the specified type +template static inline _Tp randu() +{ + return (_Tp)theRNG(); +} + + +///////////////////////////////// Formatted output of cv::Mat ///////////////////////////////// + +static inline +Ptr format(InputArray mtx, Formatter::FormatType fmt) +{ + return Formatter::get(fmt)->format(mtx.getMat()); +} + +static inline +int print(Ptr fmtd, FILE* stream = stdout) +{ + int written = 0; + fmtd->reset(); + for(const char* str = fmtd->next(); str; str = fmtd->next()) + written += fputs(str, stream); + + return written; +} + +static inline +int print(const Mat& mtx, FILE* stream = stdout) +{ + return print(Formatter::get()->format(mtx), stream); +} + +static inline +int print(const UMat& mtx, FILE* stream = stdout) +{ + return print(Formatter::get()->format(mtx.getMat(ACCESS_READ)), stream); +} + +template static inline +int print(const std::vector >& vec, FILE* stream = stdout) +{ + return print(Formatter::get()->format(Mat(vec)), stream); +} + +template static inline +int print(const std::vector >& vec, FILE* stream = stdout) +{ + return print(Formatter::get()->format(Mat(vec)), stream); +} + +template static inline +int print(const Matx<_Tp, m, n>& matx, FILE* stream = stdout) +{ + return print(Formatter::get()->format(cv::Mat(matx)), stream); +} + +//! @endcond + +///////////////////////////////// Formatted string generation ///////////////////////////////// + +/** @brief Returns a text string formatted using the printf-like expression. + +The function acts like sprintf but forms and returns an STL string. It can be used to form an error +message in the Exception constructor. +@param fmt printf-compatible formatting specifiers. + +**Note**: +|Type|Specifier| +|-|-| +|`const char*`|`%s`| +|`char`|`%c`| +|`float` / `double`|`%f`,`%g`| +|`int`, `long`, `long long`|`%d`, `%ld`, ``%lld`| +|`unsigned`, `unsigned long`, `unsigned long long`|`%u`, `%lu`, `%llu`| +|`uint64` -> `uintmax_t`, `int64` -> `intmax_t`|`%ju`, `%jd`| +|`size_t`|`%zu`| +@ingroup core_utils + */ +CV_EXPORTS String format(const char* fmt, ...) CV_FORMAT_PRINTF(1, 2); + +/****************************************************************************************\ +* Auxiliary algorithms * +\****************************************************************************************/ + +/** @brief Splits an element set into equivalency classes. + +The generic function partition implements an \f$O(N^2)\f$ algorithm for splitting a set of \f$N\f$ elements +into one or more equivalency classes, as described in + . The function returns the number of +equivalency classes. +@param _vec Set of elements stored as a vector. +@param labels Output vector of labels. It contains as many elements as vec. Each label labels[i] is +a 0-based cluster index of `vec[i]`. +@param predicate Equivalence predicate (pointer to a boolean function of two arguments or an +instance of the class that has the method bool operator()(const _Tp& a, const _Tp& b) ). The +predicate returns true when the elements are certainly in the same class, and returns false if they +may or may not be in the same class. +@ingroup core_cluster +*/ +template int +partition( const std::vector<_Tp>& _vec, std::vector& labels, + _EqPredicate predicate=_EqPredicate()) +{ + int i, j, N = (int)_vec.size(); + const _Tp* vec = &_vec[0]; + + const int PARENT=0; + const int RANK=1; + + std::vector _nodes(N*2); + int (*nodes)[2] = (int(*)[2])&_nodes[0]; + + // The first O(N) pass: create N single-vertex trees + for(i = 0; i < N; i++) + { + nodes[i][PARENT]=-1; + nodes[i][RANK] = 0; + } + + // The main O(N^2) pass: merge connected components + for( i = 0; i < N; i++ ) + { + int root = i; + + // find root + while( nodes[root][PARENT] >= 0 ) + root = nodes[root][PARENT]; + + for( j = 0; j < N; j++ ) + { + if( i == j || !predicate(vec[i], vec[j])) + continue; + int root2 = j; + + while( nodes[root2][PARENT] >= 0 ) + root2 = nodes[root2][PARENT]; + + if( root2 != root ) + { + // unite both trees + int rank = nodes[root][RANK], rank2 = nodes[root2][RANK]; + if( rank > rank2 ) + nodes[root2][PARENT] = root; + else + { + nodes[root][PARENT] = root2; + nodes[root2][RANK] += rank == rank2; + root = root2; + } + CV_Assert( nodes[root][PARENT] < 0 ); + + int k = j, parent; + + // compress the path from node2 to root + while( (parent = nodes[k][PARENT]) >= 0 ) + { + nodes[k][PARENT] = root; + k = parent; + } + + // compress the path from node to root + k = i; + while( (parent = nodes[k][PARENT]) >= 0 ) + { + nodes[k][PARENT] = root; + k = parent; + } + } + } + } + + // Final O(N) pass: enumerate classes + labels.resize(N); + int nclasses = 0; + + for( i = 0; i < N; i++ ) + { + int root = i; + while( nodes[root][PARENT] >= 0 ) + root = nodes[root][PARENT]; + // re-use the rank as the class label + if( nodes[root][RANK] >= 0 ) + nodes[root][RANK] = ~nclasses++; + labels[i] = ~nodes[root][RANK]; + } + + return nclasses; +} + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/optim.hpp b/Thirdparty/opencv2/include/opencv2/core/optim.hpp new file mode 100644 index 0000000..59fe978 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/optim.hpp @@ -0,0 +1,307 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_OPTIM_HPP +#define OPENCV_OPTIM_HPP + +#include "opencv2/core.hpp" + +namespace cv +{ + +/** @addtogroup core_optim +The algorithms in this section minimize or maximize function value within specified constraints or +without any constraints. +@{ +*/ + +/** @brief Basic interface for all solvers + */ +class CV_EXPORTS MinProblemSolver : public Algorithm +{ +public: + /** @brief Represents function being optimized + */ + class CV_EXPORTS Function + { + public: + virtual ~Function() {} + virtual int getDims() const = 0; + virtual double getGradientEps() const; + virtual double calc(const double* x) const = 0; + virtual void getGradient(const double* x,double* grad); + }; + + /** @brief Getter for the optimized function. + + The optimized function is represented by Function interface, which requires derivatives to + implement the calc(double*) and getDim() methods to evaluate the function. + + @return Smart-pointer to an object that implements Function interface - it represents the + function that is being optimized. It can be empty, if no function was given so far. + */ + virtual Ptr getFunction() const = 0; + + /** @brief Setter for the optimized function. + + *It should be called at least once before the call to* minimize(), as default value is not usable. + + @param f The new function to optimize. + */ + virtual void setFunction(const Ptr& f) = 0; + + /** @brief Getter for the previously set terminal criteria for this algorithm. + + @return Deep copy of the terminal criteria used at the moment. + */ + virtual TermCriteria getTermCriteria() const = 0; + + /** @brief Set terminal criteria for solver. + + This method *is not necessary* to be called before the first call to minimize(), as the default + value is sensible. + + Algorithm stops when the number of function evaluations done exceeds termcrit.maxCount, when + the function values at the vertices of simplex are within termcrit.epsilon range or simplex + becomes so small that it can enclosed in a box with termcrit.epsilon sides, whatever comes + first. + @param termcrit Terminal criteria to be used, represented as cv::TermCriteria structure. + */ + virtual void setTermCriteria(const TermCriteria& termcrit) = 0; + + /** @brief actually runs the algorithm and performs the minimization. + + The sole input parameter determines the centroid of the starting simplex (roughly, it tells + where to start), all the others (terminal criteria, initial step, function to be minimized) are + supposed to be set via the setters before the call to this method or the default values (not + always sensible) will be used. + + @param x The initial point, that will become a centroid of an initial simplex. After the algorithm + will terminate, it will be set to the point where the algorithm stops, the point of possible + minimum. + @return The value of a function at the point found. + */ + virtual double minimize(InputOutputArray x) = 0; +}; + +/** @brief This class is used to perform the non-linear non-constrained minimization of a function, + +defined on an `n`-dimensional Euclidean space, using the **Nelder-Mead method**, also known as +**downhill simplex method**. The basic idea about the method can be obtained from +. + +It should be noted, that this method, although deterministic, is rather a heuristic and therefore +may converge to a local minima, not necessary a global one. It is iterative optimization technique, +which at each step uses an information about the values of a function evaluated only at `n+1` +points, arranged as a *simplex* in `n`-dimensional space (hence the second name of the method). At +each step new point is chosen to evaluate function at, obtained value is compared with previous +ones and based on this information simplex changes it's shape , slowly moving to the local minimum. +Thus this method is using *only* function values to make decision, on contrary to, say, Nonlinear +Conjugate Gradient method (which is also implemented in optim). + +Algorithm stops when the number of function evaluations done exceeds termcrit.maxCount, when the +function values at the vertices of simplex are within termcrit.epsilon range or simplex becomes so +small that it can enclosed in a box with termcrit.epsilon sides, whatever comes first, for some +defined by user positive integer termcrit.maxCount and positive non-integer termcrit.epsilon. + +@note DownhillSolver is a derivative of the abstract interface +cv::MinProblemSolver, which in turn is derived from the Algorithm interface and is used to +encapsulate the functionality, common to all non-linear optimization algorithms in the optim +module. + +@note term criteria should meet following condition: +@code + termcrit.type == (TermCriteria::MAX_ITER + TermCriteria::EPS) && termcrit.epsilon > 0 && termcrit.maxCount > 0 +@endcode + */ +class CV_EXPORTS DownhillSolver : public MinProblemSolver +{ +public: + /** @brief Returns the initial step that will be used in downhill simplex algorithm. + + @param step Initial step that will be used in algorithm. Note, that although corresponding setter + accepts column-vectors as well as row-vectors, this method will return a row-vector. + @see DownhillSolver::setInitStep + */ + virtual void getInitStep(OutputArray step) const=0; + + /** @brief Sets the initial step that will be used in downhill simplex algorithm. + + Step, together with initial point (given in DownhillSolver::minimize) are two `n`-dimensional + vectors that are used to determine the shape of initial simplex. Roughly said, initial point + determines the position of a simplex (it will become simplex's centroid), while step determines the + spread (size in each dimension) of a simplex. To be more precise, if \f$s,x_0\in\mathbb{R}^n\f$ are + the initial step and initial point respectively, the vertices of a simplex will be: + \f$v_0:=x_0-\frac{1}{2} s\f$ and \f$v_i:=x_0+s_i\f$ for \f$i=1,2,\dots,n\f$ where \f$s_i\f$ denotes + projections of the initial step of *n*-th coordinate (the result of projection is treated to be + vector given by \f$s_i:=e_i\cdot\left\f$, where \f$e_i\f$ form canonical basis) + + @param step Initial step that will be used in algorithm. Roughly said, it determines the spread + (size in each dimension) of an initial simplex. + */ + virtual void setInitStep(InputArray step)=0; + + /** @brief This function returns the reference to the ready-to-use DownhillSolver object. + + All the parameters are optional, so this procedure can be called even without parameters at + all. In this case, the default values will be used. As default value for terminal criteria are + the only sensible ones, MinProblemSolver::setFunction() and DownhillSolver::setInitStep() + should be called upon the obtained object, if the respective parameters were not given to + create(). Otherwise, the two ways (give parameters to createDownhillSolver() or miss them out + and call the MinProblemSolver::setFunction() and DownhillSolver::setInitStep()) are absolutely + equivalent (and will drop the same errors in the same way, should invalid input be detected). + @param f Pointer to the function that will be minimized, similarly to the one you submit via + MinProblemSolver::setFunction. + @param initStep Initial step, that will be used to construct the initial simplex, similarly to the one + you submit via MinProblemSolver::setInitStep. + @param termcrit Terminal criteria to the algorithm, similarly to the one you submit via + MinProblemSolver::setTermCriteria. + */ + static Ptr create(const Ptr& f=Ptr(), + InputArray initStep=Mat_(1,1,0.0), + TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5000,0.000001)); +}; + +/** @brief This class is used to perform the non-linear non-constrained minimization of a function +with known gradient, + +defined on an *n*-dimensional Euclidean space, using the **Nonlinear Conjugate Gradient method**. +The implementation was done based on the beautifully clear explanatory article [An Introduction to +the Conjugate Gradient Method Without the Agonizing +Pain](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf) by Jonathan Richard +Shewchuk. The method can be seen as an adaptation of a standard Conjugate Gradient method (see, for +example ) for numerically solving the +systems of linear equations. + +It should be noted, that this method, although deterministic, is rather a heuristic method and +therefore may converge to a local minima, not necessary a global one. What is even more disastrous, +most of its behaviour is ruled by gradient, therefore it essentially cannot distinguish between +local minima and maxima. Therefore, if it starts sufficiently near to the local maximum, it may +converge to it. Another obvious restriction is that it should be possible to compute the gradient of +a function at any point, thus it is preferable to have analytic expression for gradient and +computational burden should be born by the user. + +The latter responsibility is accomplished via the getGradient method of a +MinProblemSolver::Function interface (which represents function being optimized). This method takes +point a point in *n*-dimensional space (first argument represents the array of coordinates of that +point) and compute its gradient (it should be stored in the second argument as an array). + +@note class ConjGradSolver thus does not add any new methods to the basic MinProblemSolver interface. + +@note term criteria should meet following condition: +@code + termcrit.type == (TermCriteria::MAX_ITER + TermCriteria::EPS) && termcrit.epsilon > 0 && termcrit.maxCount > 0 + // or + termcrit.type == TermCriteria::MAX_ITER) && termcrit.maxCount > 0 +@endcode + */ +class CV_EXPORTS ConjGradSolver : public MinProblemSolver +{ +public: + /** @brief This function returns the reference to the ready-to-use ConjGradSolver object. + + All the parameters are optional, so this procedure can be called even without parameters at + all. In this case, the default values will be used. As default value for terminal criteria are + the only sensible ones, MinProblemSolver::setFunction() should be called upon the obtained + object, if the function was not given to create(). Otherwise, the two ways (submit it to + create() or miss it out and call the MinProblemSolver::setFunction()) are absolutely equivalent + (and will drop the same errors in the same way, should invalid input be detected). + @param f Pointer to the function that will be minimized, similarly to the one you submit via + MinProblemSolver::setFunction. + @param termcrit Terminal criteria to the algorithm, similarly to the one you submit via + MinProblemSolver::setTermCriteria. + */ + static Ptr create(const Ptr& f=Ptr(), + TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5000,0.000001)); +}; + +//! return codes for cv::solveLP() function +enum SolveLPResult +{ + SOLVELP_LOST = -3, //!< problem is feasible, but solver lost solution due to floating-point arithmetic errors + SOLVELP_UNBOUNDED = -2, //!< problem is unbounded (target function can achieve arbitrary high values) + SOLVELP_UNFEASIBLE = -1, //!< problem is unfeasible (there are no points that satisfy all the constraints imposed) + SOLVELP_SINGLE = 0, //!< there is only one maximum for target function + SOLVELP_MULTI = 1 //!< there are multiple maxima for target function - the arbitrary one is returned +}; + +/** @brief Solve given (non-integer) linear programming problem using the Simplex Algorithm (Simplex Method). + +What we mean here by "linear programming problem" (or LP problem, for short) can be formulated as: + +\f[\mbox{Maximize } c\cdot x\\ + \mbox{Subject to:}\\ + Ax\leq b\\ + x\geq 0\f] + +Where \f$c\f$ is fixed `1`-by-`n` row-vector, \f$A\f$ is fixed `m`-by-`n` matrix, \f$b\f$ is fixed `m`-by-`1` +column vector and \f$x\f$ is an arbitrary `n`-by-`1` column vector, which satisfies the constraints. + +Simplex algorithm is one of many algorithms that are designed to handle this sort of problems +efficiently. Although it is not optimal in theoretical sense (there exist algorithms that can solve +any problem written as above in polynomial time, while simplex method degenerates to exponential +time for some special cases), it is well-studied, easy to implement and is shown to work well for +real-life purposes. + +The particular implementation is taken almost verbatim from **Introduction to Algorithms, third +edition** by T. H. Cormen, C. E. Leiserson, R. L. Rivest and Clifford Stein. In particular, the +Bland's rule is used to prevent cycling. + +@param Func This row-vector corresponds to \f$c\f$ in the LP problem formulation (see above). It should +contain 32- or 64-bit floating point numbers. As a convenience, column-vector may be also submitted, +in the latter case it is understood to correspond to \f$c^T\f$. +@param Constr `m`-by-`n+1` matrix, whose rightmost column corresponds to \f$b\f$ in formulation above +and the remaining to \f$A\f$. It should contain 32- or 64-bit floating point numbers. +@param z The solution will be returned here as a column-vector - it corresponds to \f$c\f$ in the +formulation above. It will contain 64-bit floating point numbers. +@param constr_eps allowed numeric disparity for constraints +@return One of cv::SolveLPResult + */ +CV_EXPORTS_W int solveLP(InputArray Func, InputArray Constr, OutputArray z, double constr_eps); + +/** @overload */ +CV_EXPORTS_W int solveLP(InputArray Func, InputArray Constr, OutputArray z); + +//! @} + +}// cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/ovx.hpp b/Thirdparty/opencv2/include/opencv2/core/ovx.hpp new file mode 100644 index 0000000..8bb7d54 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/ovx.hpp @@ -0,0 +1,28 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copyright (C) 2016, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +// OpenVX related definitions and declarations + +#pragma once +#ifndef OPENCV_OVX_HPP +#define OPENCV_OVX_HPP + +#include "cvdef.h" + +namespace cv +{ +/// Check if use of OpenVX is possible +CV_EXPORTS_W bool haveOpenVX(); + +/// Check if use of OpenVX is enabled +CV_EXPORTS_W bool useOpenVX(); + +/// Enable/disable use of OpenVX +CV_EXPORTS_W void setUseOpenVX(bool flag); +} // namespace cv + +#endif // OPENCV_OVX_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.openmp.hpp b/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.openmp.hpp new file mode 100644 index 0000000..b172cac --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.openmp.hpp @@ -0,0 +1,72 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_PARALLEL_FOR_OPENMP_HPP +#define OPENCV_CORE_PARALLEL_FOR_OPENMP_HPP + +#include "opencv2/core/parallel/parallel_backend.hpp" + +#if !defined(_OPENMP) && !defined(OPENCV_SKIP_OPENMP_PRESENSE_CHECK) +#error "This file must be compiled with enabled OpenMP" +#endif + +#include + +namespace cv { namespace parallel { namespace openmp { + +/** OpenMP parallel_for API implementation + * + * @sa setParallelForBackend + * @ingroup core_parallel_backend + */ +class ParallelForBackend : public ParallelForAPI +{ +protected: + int numThreads; + int numThreadsMax; +public: + ParallelForBackend() + { + numThreads = 0; + numThreadsMax = omp_get_max_threads(); + } + + virtual ~ParallelForBackend() {} + + virtual void parallel_for(int tasks, FN_parallel_for_body_cb_t body_callback, void* callback_data) CV_OVERRIDE + { +#pragma omp parallel for schedule(dynamic) num_threads(numThreads > 0 ? numThreads : numThreadsMax) + for (int i = 0; i < tasks; ++i) + body_callback(i, i + 1, callback_data); + } + + virtual int getThreadNum() const CV_OVERRIDE + { + return omp_get_thread_num(); + } + + virtual int getNumThreads() const CV_OVERRIDE + { + return numThreads > 0 + ? numThreads + : numThreadsMax; + } + + virtual int setNumThreads(int nThreads) CV_OVERRIDE + { + int oldNumThreads = numThreads; + numThreads = nThreads; + // nothing needed as numThreads is used in #pragma omp parallel for directly + return oldNumThreads; + } + + const char* getName() const CV_OVERRIDE + { + return "openmp"; + } +}; + +}}} // namespace + +#endif // OPENCV_CORE_PARALLEL_FOR_OPENMP_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.tbb.hpp b/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.tbb.hpp new file mode 100644 index 0000000..04b0c4c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/parallel/backend/parallel_for.tbb.hpp @@ -0,0 +1,153 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_PARALLEL_FOR_TBB_HPP +#define OPENCV_CORE_PARALLEL_FOR_TBB_HPP + +#include "opencv2/core/parallel/parallel_backend.hpp" +#include + +#ifndef TBB_SUPPRESS_DEPRECATED_MESSAGES // supress warning +#define TBB_SUPPRESS_DEPRECATED_MESSAGES 1 +#endif +#include "tbb/tbb.h" +#if !defined(TBB_INTERFACE_VERSION) +#error "Unknows/unsupported TBB version" +#endif + +#if TBB_INTERFACE_VERSION >= 8000 +#include "tbb/task_arena.h" +#endif + +namespace cv { namespace parallel { namespace tbb { + +using namespace ::tbb; + +#if TBB_INTERFACE_VERSION >= 8000 +static tbb::task_arena& getArena() +{ + static tbb::task_arena tbbArena(tbb::task_arena::automatic); + return tbbArena; +} +#else +static tbb::task_scheduler_init& getScheduler() +{ + static tbb::task_scheduler_init tbbScheduler(tbb::task_scheduler_init::deferred); + return tbbScheduler; +} +#endif + +/** TBB parallel_for API implementation + * + * @sa setParallelForBackend + * @ingroup core_parallel_backend + */ +class ParallelForBackend : public ParallelForAPI +{ +protected: + int numThreads; + int numThreadsMax; +public: + ParallelForBackend() + { + CV_LOG_INFO(NULL, "Initializing TBB parallel backend: TBB_INTERFACE_VERSION=" << TBB_INTERFACE_VERSION); + numThreads = 0; +#if TBB_INTERFACE_VERSION >= 8000 + (void)getArena(); +#else + (void)getScheduler(); +#endif + } + + virtual ~ParallelForBackend() {} + + class CallbackProxy + { + const FN_parallel_for_body_cb_t& callback; + void* const callback_data; + const int tasks; + public: + inline CallbackProxy(int tasks_, FN_parallel_for_body_cb_t& callback_, void* callback_data_) + : callback(callback_), callback_data(callback_data_), tasks(tasks_) + { + // nothing + } + + void operator()(const tbb::blocked_range& range) const + { + this->callback(range.begin(), range.end(), callback_data); + } + + void operator()() const + { + tbb::parallel_for(tbb::blocked_range(0, tasks), *this); + } + }; + + virtual void parallel_for(int tasks, FN_parallel_for_body_cb_t body_callback, void* callback_data) CV_OVERRIDE + { + CallbackProxy task(tasks, body_callback, callback_data); +#if TBB_INTERFACE_VERSION >= 8000 + getArena().execute(task); +#else + task(); +#endif + } + + virtual int getThreadNum() const CV_OVERRIDE + { +#if TBB_INTERFACE_VERSION >= 9100 + return tbb::this_task_arena::current_thread_index(); +#elif TBB_INTERFACE_VERSION >= 8000 + return tbb::task_arena::current_thread_index(); +#else + return 0; +#endif + } + + virtual int getNumThreads() const CV_OVERRIDE + { +#if TBB_INTERFACE_VERSION >= 9100 + return getArena().max_concurrency(); +#elif TBB_INTERFACE_VERSION >= 8000 + return numThreads > 0 + ? numThreads + : tbb::task_scheduler_init::default_num_threads(); +#else + return getScheduler().is_active() + ? numThreads + : tbb::task_scheduler_init::default_num_threads(); +#endif + } + + virtual int setNumThreads(int nThreads) CV_OVERRIDE + { + int oldNumThreads = numThreads; + numThreads = nThreads; + +#if TBB_INTERFACE_VERSION >= 8000 + auto& tbbArena = getArena(); + if (tbbArena.is_active()) + tbbArena.terminate(); + if (numThreads > 0) + tbbArena.initialize(numThreads); +#else + auto& tbbScheduler = getScheduler(); + if (tbbScheduler.is_active()) + tbbScheduler.terminate(); + if (numThreads > 0) + tbbScheduler.initialize(numThreads); +#endif + return oldNumThreads; + } + + const char* getName() const CV_OVERRIDE + { + return "tbb"; + } +}; + +}}} // namespace + +#endif // OPENCV_CORE_PARALLEL_FOR_TBB_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/parallel/parallel_backend.hpp b/Thirdparty/opencv2/include/opencv2/core/parallel/parallel_backend.hpp new file mode 100644 index 0000000..c3e8333 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/parallel/parallel_backend.hpp @@ -0,0 +1,90 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_PARALLEL_BACKEND_HPP +#define OPENCV_CORE_PARALLEL_BACKEND_HPP + +#include "opencv2/core/cvdef.h" +#include + +namespace cv { namespace parallel { +#ifndef CV_API_CALL +#define CV_API_CALL +#endif + +/** @addtogroup core_parallel_backend + * @{ + * API below is provided to resolve problem of CPU resource over-subscription by multiple thread pools from different multi-threading frameworks. + * This is common problem for cases when OpenCV compiled threading framework is different from the Users Applications framework. + * + * Applications can replace OpenCV `parallel_for()` backend with own implementation (to reuse Application's thread pool). + * + * + * ### Backend API usage examples + * + * #### Intel TBB + * + * - include header with simple implementation of TBB backend: + * @snippet parallel_backend/example-tbb.cpp tbb_include + * - execute backend replacement code: + * @snippet parallel_backend/example-tbb.cpp tbb_backend + * - configuration of compiler/linker options is responsibility of Application's scripts + * + * #### OpenMP + * + * - include header with simple implementation of OpenMP backend: + * @snippet parallel_backend/example-openmp.cpp openmp_include + * - execute backend replacement code: + * @snippet parallel_backend/example-openmp.cpp openmp_backend + * - Configuration of compiler/linker options is responsibility of Application's scripts + * + * + * ### Plugins support + * + * Runtime configuration options: + * - change backend priority: `OPENCV_PARALLEL_PRIORITY_=9999` + * - disable backend: `OPENCV_PARALLEL_PRIORITY_=0` + * - specify list of backends with high priority (>100000): `OPENCV_PARALLEL_PRIORITY_LIST=TBB,OPENMP`. Unknown backends are registered as new plugins. + * + */ + +/** Interface for parallel_for backends implementations + * + * @sa setParallelForBackend + */ +class CV_EXPORTS ParallelForAPI +{ +public: + virtual ~ParallelForAPI(); + + typedef void (CV_API_CALL *FN_parallel_for_body_cb_t)(int start, int end, void* data); + + virtual void parallel_for(int tasks, FN_parallel_for_body_cb_t body_callback, void* callback_data) = 0; + + virtual int getThreadNum() const = 0; + + virtual int getNumThreads() const = 0; + + virtual int setNumThreads(int nThreads) = 0; + + virtual const char* getName() const = 0; +}; + +/** @brief Replace OpenCV parallel_for backend + * + * Application can replace OpenCV `parallel_for()` backend with own implementation. + * + * @note This call is not thread-safe. Consider calling this function from the `main()` before any other OpenCV processing functions (and without any other created threads). + */ +CV_EXPORTS void setParallelForBackend(const std::shared_ptr& api, bool propagateNumThreads = true); + +/** @brief Change OpenCV parallel_for backend + * + * @note This call is not thread-safe. Consider calling this function from the `main()` before any other OpenCV processing functions (and without any other created threads). + */ +CV_EXPORTS_W bool setParallelForBackend(const std::string& backendName, bool propagateNumThreads = true); + +//! @} +}} // namespace +#endif // OPENCV_CORE_PARALLEL_BACKEND_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/persistence.hpp b/Thirdparty/opencv2/include/opencv2/core/persistence.hpp new file mode 100644 index 0000000..8e135d1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/persistence.hpp @@ -0,0 +1,1350 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_PERSISTENCE_HPP +#define OPENCV_CORE_PERSISTENCE_HPP + +#ifndef CV_DOXYGEN +/// Define to support persistence legacy formats +#define CV__LEGACY_PERSISTENCE +#endif + +#ifndef __cplusplus +# error persistence.hpp header must be compiled as C++ +#endif + +//! @addtogroup core_c +//! @{ + +/** @brief "black box" representation of the file storage associated with a file on disk. + +Several functions that are described below take CvFileStorage\* as inputs and allow the user to +save or to load hierarchical collections that consist of scalar values, standard CXCore objects +(such as matrices, sequences, graphs), and user-defined objects. + +OpenCV can read and write data in XML (), YAML () or +JSON () formats. Below is an example of 3x3 floating-point identity matrix A, +stored in XML and YAML files +using CXCore functions: +XML: +@code{.xml} + + +
    + 3 + 3 +

    f
    + 1. 0. 0. 0. 1. 0. 0. 0. 1. + + +@endcode +YAML: +@code{.yaml} + %YAML:1.0 + A: !!opencv-matrix + rows: 3 + cols: 3 + dt: f + data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1.] +@endcode +As it can be seen from the examples, XML uses nested tags to represent hierarchy, while YAML uses +indentation for that purpose (similar to the Python programming language). + +The same functions can read and write data in both formats; the particular format is determined by +the extension of the opened file, ".xml" for XML files, ".yml" or ".yaml" for YAML and ".json" for +JSON. + */ + +//! @} core_c + +#include "opencv2/core/types.hpp" +#include "opencv2/core/mat.hpp" + +namespace cv { + +/** @addtogroup core_xml + +XML/YAML/JSON file storages. {#xml_storage} +======================= +Writing to a file storage. +-------------------------- +You can store and then restore various OpenCV data structures to/from XML (), +YAML () or JSON () formats. Also, it is possible to store +and load arbitrarily complex data structures, which include OpenCV data structures, as well as +primitive data types (integer and floating-point numbers and text strings) as their elements. + +Use the following procedure to write something to XML, YAML or JSON: +-# Create new FileStorage and open it for writing. It can be done with a single call to +FileStorage::FileStorage constructor that takes a filename, or you can use the default constructor +and then call FileStorage::open. Format of the file (XML, YAML or JSON) is determined from the filename +extension (".xml", ".yml"/".yaml" and ".json", respectively) +-# Write all the data you want using the streaming operator `<<`, just like in the case of STL +streams. +-# Close the file using FileStorage::release. FileStorage destructor also closes the file. + +Here is an example: +@code + #include "opencv2/core.hpp" + #include + + using namespace cv; + + int main(int, char** argv) + { + FileStorage fs("test.yml", FileStorage::WRITE); + + fs << "frameCount" << 5; + time_t rawtime; time(&rawtime); + fs << "calibrationDate" << asctime(localtime(&rawtime)); + Mat cameraMatrix = (Mat_(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1); + Mat distCoeffs = (Mat_(5,1) << 0.1, 0.01, -0.001, 0, 0); + fs << "cameraMatrix" << cameraMatrix << "distCoeffs" << distCoeffs; + fs << "features" << "["; + for( int i = 0; i < 3; i++ ) + { + int x = rand() % 640; + int y = rand() % 480; + uchar lbp = rand() % 256; + + fs << "{:" << "x" << x << "y" << y << "lbp" << "[:"; + for( int j = 0; j < 8; j++ ) + fs << ((lbp >> j) & 1); + fs << "]" << "}"; + } + fs << "]"; + fs.release(); + return 0; + } +@endcode +The sample above stores to YML an integer, a text string (calibration date), 2 matrices, and a custom +structure "feature", which includes feature coordinates and LBP (local binary pattern) value. Here +is output of the sample: +@code{.yaml} +%YAML:1.0 +frameCount: 5 +calibrationDate: "Fri Jun 17 14:09:29 2011\n" +cameraMatrix: !!opencv-matrix + rows: 3 + cols: 3 + dt: d + data: [ 1000., 0., 320., 0., 1000., 240., 0., 0., 1. ] +distCoeffs: !!opencv-matrix + rows: 5 + cols: 1 + dt: d + data: [ 1.0000000000000001e-01, 1.0000000000000000e-02, + -1.0000000000000000e-03, 0., 0. ] +features: + - { x:167, y:49, lbp:[ 1, 0, 0, 1, 1, 0, 1, 1 ] } + - { x:298, y:130, lbp:[ 0, 0, 0, 1, 0, 0, 1, 1 ] } + - { x:344, y:158, lbp:[ 1, 1, 0, 0, 0, 0, 1, 0 ] } +@endcode + +As an exercise, you can replace ".yml" with ".xml" or ".json" in the sample above and see, how the +corresponding XML file will look like. + +Several things can be noted by looking at the sample code and the output: + +- The produced YAML (and XML/JSON) consists of heterogeneous collections that can be nested. There are + 2 types of collections: named collections (mappings) and unnamed collections (sequences). In mappings + each element has a name and is accessed by name. This is similar to structures and std::map in + C/C++ and dictionaries in Python. In sequences elements do not have names, they are accessed by + indices. This is similar to arrays and std::vector in C/C++ and lists, tuples in Python. + "Heterogeneous" means that elements of each single collection can have different types. + + Top-level collection in YAML/XML/JSON is a mapping. Each matrix is stored as a mapping, and the matrix + elements are stored as a sequence. Then, there is a sequence of features, where each feature is + represented a mapping, and lbp value in a nested sequence. + +- When you write to a mapping (a structure), you write element name followed by its value. When you + write to a sequence, you simply write the elements one by one. OpenCV data structures (such as + cv::Mat) are written in absolutely the same way as simple C data structures - using `<<` + operator. + +- To write a mapping, you first write the special string `{` to the storage, then write the + elements as pairs (`fs << << `) and then write the closing + `}`. + +- To write a sequence, you first write the special string `[`, then write the elements, then + write the closing `]`. + +- In YAML/JSON (but not XML), mappings and sequences can be written in a compact Python-like inline + form. In the sample above matrix elements, as well as each feature, including its lbp value, is + stored in such inline form. To store a mapping/sequence in a compact form, put `:` after the + opening character, e.g. use `{:` instead of `{` and `[:` instead of `[`. When the + data is written to XML, those extra `:` are ignored. + +Reading data from a file storage. +--------------------------------- +To read the previously written XML, YAML or JSON file, do the following: +-# Open the file storage using FileStorage::FileStorage constructor or FileStorage::open method. + In the current implementation the whole file is parsed and the whole representation of file + storage is built in memory as a hierarchy of file nodes (see FileNode) + +-# Read the data you are interested in. Use FileStorage::operator [], FileNode::operator [] + and/or FileNodeIterator. + +-# Close the storage using FileStorage::release. + +Here is how to read the file created by the code sample above: +@code + FileStorage fs2("test.yml", FileStorage::READ); + + // first method: use (type) operator on FileNode. + int frameCount = (int)fs2["frameCount"]; + + String date; + // second method: use FileNode::operator >> + fs2["calibrationDate"] >> date; + + Mat cameraMatrix2, distCoeffs2; + fs2["cameraMatrix"] >> cameraMatrix2; + fs2["distCoeffs"] >> distCoeffs2; + + cout << "frameCount: " << frameCount << endl + << "calibration date: " << date << endl + << "camera matrix: " << cameraMatrix2 << endl + << "distortion coeffs: " << distCoeffs2 << endl; + + FileNode features = fs2["features"]; + FileNodeIterator it = features.begin(), it_end = features.end(); + int idx = 0; + std::vector lbpval; + + // iterate through a sequence using FileNodeIterator + for( ; it != it_end; ++it, idx++ ) + { + cout << "feature #" << idx << ": "; + cout << "x=" << (int)(*it)["x"] << ", y=" << (int)(*it)["y"] << ", lbp: ("; + // you can also easily read numerical arrays using FileNode >> std::vector operator. + (*it)["lbp"] >> lbpval; + for( int i = 0; i < (int)lbpval.size(); i++ ) + cout << " " << (int)lbpval[i]; + cout << ")" << endl; + } + fs2.release(); +@endcode + +Format specification {#format_spec} +-------------------- +`([count]{u|c|w|s|i|f|d})`... where the characters correspond to fundamental C++ types: +- `u` 8-bit unsigned number +- `c` 8-bit signed number +- `w` 16-bit unsigned number +- `s` 16-bit signed number +- `i` 32-bit signed number +- `f` single precision floating-point number +- `d` double precision floating-point number +- `r` pointer, 32 lower bits of which are written as a signed integer. The type can be used to + store structures with links between the elements. + +`count` is the optional counter of values of a given type. For example, `2if` means that each array +element is a structure of 2 integers, followed by a single-precision floating-point number. The +equivalent notations of the above specification are `iif`, `2i1f` and so forth. Other examples: `u` +means that the array consists of bytes, and `2d` means the array consists of pairs of doubles. + +@see @ref samples/cpp/filestorage.cpp +*/ + +//! @{ + +/** @example samples/cpp/filestorage.cpp +A complete example using the FileStorage interface +*/ + +////////////////////////// XML & YAML I/O ////////////////////////// + +class CV_EXPORTS FileNode; +class CV_EXPORTS FileNodeIterator; + +/** @brief XML/YAML/JSON file storage class that encapsulates all the information necessary for writing or +reading data to/from a file. + */ +class CV_EXPORTS_W FileStorage +{ +public: + //! file storage mode + enum Mode + { + READ = 0, //!< value, open the file for reading + WRITE = 1, //!< value, open the file for writing + APPEND = 2, //!< value, open the file for appending + MEMORY = 4, /**< flag, read data from source or write data to the internal buffer (which is + returned by FileStorage::release) */ + FORMAT_MASK = (7<<3), //!< mask for format flags + FORMAT_AUTO = 0, //!< flag, auto format + FORMAT_XML = (1<<3), //!< flag, XML format + FORMAT_YAML = (2<<3), //!< flag, YAML format + FORMAT_JSON = (3<<3), //!< flag, JSON format + + BASE64 = 64, //!< flag, write rawdata in Base64 by default. (consider using WRITE_BASE64) + WRITE_BASE64 = BASE64 | WRITE, //!< flag, enable both WRITE and BASE64 + }; + enum State + { + UNDEFINED = 0, + VALUE_EXPECTED = 1, + NAME_EXPECTED = 2, + INSIDE_MAP = 4 + }; + + /** @brief The constructors. + + The full constructor opens the file. Alternatively you can use the default constructor and then + call FileStorage::open. + */ + CV_WRAP FileStorage(); + + /** @overload + @copydoc open() + */ + CV_WRAP FileStorage(const String& filename, int flags, const String& encoding=String()); + + //! the destructor. calls release() + virtual ~FileStorage(); + + /** @brief Opens a file. + + See description of parameters in FileStorage::FileStorage. The method calls FileStorage::release + before opening the file. + @param filename Name of the file to open or the text string to read the data from. + Extension of the file (.xml, .yml/.yaml or .json) determines its format (XML, YAML or JSON + respectively). Also you can append .gz to work with compressed files, for example myHugeMatrix.xml.gz. If both + FileStorage::WRITE and FileStorage::MEMORY flags are specified, source is used just to specify + the output file format (e.g. mydata.xml, .yml etc.). A file name can also contain parameters. + You can use this format, "*?base64" (e.g. "file.json?base64" (case sensitive)), as an alternative to + FileStorage::BASE64 flag. + @param flags Mode of operation. One of FileStorage::Mode + @param encoding Encoding of the file. Note that UTF-16 XML encoding is not supported currently and + you should use 8-bit encoding instead of it. + */ + CV_WRAP virtual bool open(const String& filename, int flags, const String& encoding=String()); + + /** @brief Checks whether the file is opened. + + @returns true if the object is associated with the current file and false otherwise. It is a + good practice to call this method after you tried to open a file. + */ + CV_WRAP virtual bool isOpened() const; + + /** @brief Closes the file and releases all the memory buffers. + + Call this method after all I/O operations with the storage are finished. + */ + CV_WRAP virtual void release(); + + /** @brief Closes the file and releases all the memory buffers. + + Call this method after all I/O operations with the storage are finished. If the storage was + opened for writing data and FileStorage::WRITE was specified + */ + CV_WRAP virtual String releaseAndGetString(); + + /** @brief Returns the first element of the top-level mapping. + @returns The first element of the top-level mapping. + */ + CV_WRAP FileNode getFirstTopLevelNode() const; + + /** @brief Returns the top-level mapping + @param streamidx Zero-based index of the stream. In most cases there is only one stream in the file. + However, YAML supports multiple streams and so there can be several. + @returns The top-level mapping. + */ + CV_WRAP FileNode root(int streamidx=0) const; + + /** @brief Returns the specified element of the top-level mapping. + @param nodename Name of the file node. + @returns Node with the given name. + */ + FileNode operator[](const String& nodename) const; + + /** @overload */ + CV_WRAP_AS(getNode) FileNode operator[](const char* nodename) const; + + /** + * @brief Simplified writing API to use with bindings. + * @param name Name of the written object. When writing to sequences (a.k.a. "arrays"), pass an empty string. + * @param val Value of the written object. + */ + CV_WRAP void write(const String& name, int val); + /// @overload + CV_WRAP void write(const String& name, double val); + /// @overload + CV_WRAP void write(const String& name, const String& val); + /// @overload + CV_WRAP void write(const String& name, const Mat& val); + /// @overload + CV_WRAP void write(const String& name, const std::vector& val); + + /** @brief Writes multiple numbers. + + Writes one or more numbers of the specified format to the currently written structure. Usually it is + more convenient to use operator `<<` instead of this method. + @param fmt Specification of each array element, see @ref format_spec "format specification" + @param vec Pointer to the written array. + @param len Number of the uchar elements to write. + */ + void writeRaw( const String& fmt, const void* vec, size_t len ); + + /** @brief Writes a comment. + + The function writes a comment into file storage. The comments are skipped when the storage is read. + @param comment The written comment, single-line or multi-line + @param append If true, the function tries to put the comment at the end of current line. + Else if the comment is multi-line, or if it does not fit at the end of the current + line, the comment starts a new line. + */ + CV_WRAP void writeComment(const String& comment, bool append = false); + + /** @brief Starts to write a nested structure (sequence or a mapping). + @param name name of the structure. When writing to sequences (a.k.a. "arrays"), pass an empty string. + @param flags type of the structure (FileNode::MAP or FileNode::SEQ (both with optional FileNode::FLOW)). + @param typeName optional name of the type you store. The effect of setting this depends on the storage format. + I.e. if the format has a specification for storing type information, this parameter is used. + */ + CV_WRAP void startWriteStruct(const String& name, int flags, const String& typeName=String()); + + /** @brief Finishes writing nested structure (should pair startWriteStruct()) + */ + CV_WRAP void endWriteStruct(); + + /** @brief Returns the normalized object name for the specified name of a file. + @param filename Name of a file + @returns The normalized object name. + */ + static String getDefaultObjectName(const String& filename); + + /** @brief Returns the current format. + * @returns The current format, see FileStorage::Mode + */ + CV_WRAP int getFormat() const; + + int state; + std::string elname; + + class Impl; + Ptr p; +}; + +/** @brief File Storage Node class. + +The node is used to store each and every element of the file storage opened for reading. When +XML/YAML file is read, it is first parsed and stored in the memory as a hierarchical collection of +nodes. Each node can be a "leaf" that is contain a single number or a string, or be a collection of +other nodes. There can be named collections (mappings) where each element has a name and it is +accessed by a name, and ordered collections (sequences) where elements do not have names but rather +accessed by index. Type of the file node can be determined using FileNode::type method. + +Note that file nodes are only used for navigating file storages opened for reading. When a file +storage is opened for writing, no data is stored in memory after it is written. + */ +class CV_EXPORTS_W_SIMPLE FileNode +{ +public: + //! type of the file storage node + enum + { + NONE = 0, //!< empty node + INT = 1, //!< an integer + REAL = 2, //!< floating-point number + FLOAT = REAL, //!< synonym or REAL + STR = 3, //!< text string in UTF-8 encoding + STRING = STR, //!< synonym for STR + SEQ = 4, //!< sequence + MAP = 5, //!< mapping + TYPE_MASK = 7, + + FLOW = 8, //!< compact representation of a sequence or mapping. Used only by YAML writer + UNIFORM = 8, //!< if set, means that all the collection elements are numbers of the same type (real's or int's). + //!< UNIFORM is used only when reading FileStorage; FLOW is used only when writing. So they share the same bit + EMPTY = 16, //!< empty structure (sequence or mapping) + NAMED = 32 //!< the node has a name (i.e. it is element of a mapping). + }; + /** @brief The constructors. + + These constructors are used to create a default file node, construct it from obsolete structures or + from the another file node. + */ + CV_WRAP FileNode(); + + /** @overload + @param fs Pointer to the file storage structure. + @param blockIdx Index of the memory block where the file node is stored + @param ofs Offset in bytes from the beginning of the serialized storage + + @deprecated + */ + FileNode(const FileStorage* fs, size_t blockIdx, size_t ofs); + + /** @overload + @param node File node to be used as initialization for the created file node. + */ + FileNode(const FileNode& node); + + FileNode& operator=(const FileNode& node); + + /** @brief Returns element of a mapping node or a sequence node. + @param nodename Name of an element in the mapping node. + @returns Returns the element with the given identifier. + */ + FileNode operator[](const String& nodename) const; + + /** @overload + @param nodename Name of an element in the mapping node. + */ + CV_WRAP_AS(getNode) FileNode operator[](const char* nodename) const; + + /** @overload + @param i Index of an element in the sequence node. + */ + CV_WRAP_AS(at) FileNode operator[](int i) const; + + /** @brief Returns keys of a mapping node. + @returns Keys of a mapping node. + */ + CV_WRAP std::vector keys() const; + + /** @brief Returns type of the node. + @returns Type of the node. See FileNode::Type + */ + CV_WRAP int type() const; + + //! returns true if the node is empty + CV_WRAP bool empty() const; + //! returns true if the node is a "none" object + CV_WRAP bool isNone() const; + //! returns true if the node is a sequence + CV_WRAP bool isSeq() const; + //! returns true if the node is a mapping + CV_WRAP bool isMap() const; + //! returns true if the node is an integer + CV_WRAP bool isInt() const; + //! returns true if the node is a floating-point number + CV_WRAP bool isReal() const; + //! returns true if the node is a text string + CV_WRAP bool isString() const; + //! returns true if the node has a name + CV_WRAP bool isNamed() const; + //! returns the node name or an empty string if the node is nameless + CV_WRAP std::string name() const; + //! returns the number of elements in the node, if it is a sequence or mapping, or 1 otherwise. + CV_WRAP size_t size() const; + //! returns raw size of the FileNode in bytes + CV_WRAP size_t rawSize() const; + //! returns the node content as an integer. If the node stores floating-point number, it is rounded. + operator int() const; + //! returns the node content as float + operator float() const; + //! returns the node content as double + operator double() const; + //! returns the node content as text string + inline operator std::string() const { return this->string(); } + + static bool isMap(int flags); + static bool isSeq(int flags); + static bool isCollection(int flags); + static bool isEmptyCollection(int flags); + static bool isFlow(int flags); + + uchar* ptr(); + const uchar* ptr() const; + + //! returns iterator pointing to the first node element + FileNodeIterator begin() const; + //! returns iterator pointing to the element following the last node element + FileNodeIterator end() const; + + /** @brief Reads node elements to the buffer with the specified format. + + Usually it is more convenient to use operator `>>` instead of this method. + @param fmt Specification of each array element. See @ref format_spec "format specification" + @param vec Pointer to the destination array. + @param len Number of bytes to read (buffer size limit). If it is greater than number of + remaining elements then all of them will be read. + */ + void readRaw( const String& fmt, void* vec, size_t len ) const; + + /** Internal method used when reading FileStorage. + Sets the type (int, real or string) and value of the previously created node. + */ + void setValue( int type, const void* value, int len=-1 ); + + //! Simplified reading API to use with bindings. + CV_WRAP double real() const; + //! Simplified reading API to use with bindings. + CV_WRAP std::string string() const; + //! Simplified reading API to use with bindings. + CV_WRAP Mat mat() const; + + //protected: + FileNode(FileStorage::Impl* fs, size_t blockIdx, size_t ofs); + + FileStorage::Impl* fs; + size_t blockIdx; + size_t ofs; +}; + + +/** @brief used to iterate through sequences and mappings. + + A standard STL notation, with node.begin(), node.end() denoting the beginning and the end of a + sequence, stored in node. See the data reading sample in the beginning of the section. + */ +class CV_EXPORTS FileNodeIterator +{ +public: + /** @brief The constructors. + + These constructors are used to create a default iterator, set it to specific element in a file node + or construct it from another iterator. + */ + FileNodeIterator(); + + /** @overload + @param node File node - the collection to iterate over; + it can be a scalar (equivalent to 1-element collection) or "none" (equivalent to empty collection). + @param seekEnd - true if iterator needs to be set after the last element of the node; + that is: + * node.begin() => FileNodeIterator(node, false) + * node.end() => FileNodeIterator(node, true) + */ + FileNodeIterator(const FileNode& node, bool seekEnd); + + /** @overload + @param it Iterator to be used as initialization for the created iterator. + */ + FileNodeIterator(const FileNodeIterator& it); + + FileNodeIterator& operator=(const FileNodeIterator& it); + + //! returns the currently observed element + FileNode operator *() const; + + //! moves iterator to the next node + FileNodeIterator& operator ++ (); + //! moves iterator to the next node + FileNodeIterator operator ++ (int); + //! moves iterator forward by the specified offset (possibly negative) + FileNodeIterator& operator += (int ofs); + + /** @brief Reads node elements to the buffer with the specified format. + + Usually it is more convenient to use operator `>>` instead of this method. + @param fmt Specification of each array element. See @ref format_spec "format specification" + @param vec Pointer to the destination array. + @param len Number of bytes to read (buffer size limit). If it is greater than number of + remaining elements then all of them will be read. + */ + FileNodeIterator& readRaw( const String& fmt, void* vec, + size_t len=(size_t)INT_MAX ); + + //! returns the number of remaining (not read yet) elements + size_t remaining() const; + + bool equalTo(const FileNodeIterator& it) const; + +protected: + FileStorage::Impl* fs; + size_t blockIdx; + size_t ofs; + size_t blockSize; + size_t nodeNElems; + size_t idx; +}; + +//! @} core_xml + +/////////////////// XML & YAML I/O implementation ////////////////// + +//! @relates cv::FileStorage +//! @{ + +CV_EXPORTS void write( FileStorage& fs, const String& name, int value ); +CV_EXPORTS void write( FileStorage& fs, const String& name, float value ); +CV_EXPORTS void write( FileStorage& fs, const String& name, double value ); +CV_EXPORTS void write( FileStorage& fs, const String& name, const String& value ); +CV_EXPORTS void write( FileStorage& fs, const String& name, const Mat& value ); +CV_EXPORTS void write( FileStorage& fs, const String& name, const SparseMat& value ); +#ifdef CV__LEGACY_PERSISTENCE +CV_EXPORTS void write( FileStorage& fs, const String& name, const std::vector& value); +CV_EXPORTS void write( FileStorage& fs, const String& name, const std::vector& value); +#endif + +CV_EXPORTS void writeScalar( FileStorage& fs, int value ); +CV_EXPORTS void writeScalar( FileStorage& fs, float value ); +CV_EXPORTS void writeScalar( FileStorage& fs, double value ); +CV_EXPORTS void writeScalar( FileStorage& fs, const String& value ); + +//! @} + +//! @relates cv::FileNode +//! @{ + +CV_EXPORTS void read(const FileNode& node, int& value, int default_value); +CV_EXPORTS void read(const FileNode& node, float& value, float default_value); +CV_EXPORTS void read(const FileNode& node, double& value, double default_value); +CV_EXPORTS void read(const FileNode& node, std::string& value, const std::string& default_value); +CV_EXPORTS void read(const FileNode& node, Mat& mat, const Mat& default_mat = Mat() ); +CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat = SparseMat() ); +#ifdef CV__LEGACY_PERSISTENCE +CV_EXPORTS void read(const FileNode& node, std::vector& keypoints); +CV_EXPORTS void read(const FileNode& node, std::vector& matches); +#endif +CV_EXPORTS void read(const FileNode& node, KeyPoint& value, const KeyPoint& default_value); +CV_EXPORTS void read(const FileNode& node, DMatch& value, const DMatch& default_value); + +template static inline void read(const FileNode& node, Point_<_Tp>& value, const Point_<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 2 ? default_value : Point_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1])); +} + +template static inline void read(const FileNode& node, Point3_<_Tp>& value, const Point3_<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 3 ? default_value : Point3_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]), + saturate_cast<_Tp>(temp[2])); +} + +template static inline void read(const FileNode& node, Size_<_Tp>& value, const Size_<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 2 ? default_value : Size_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1])); +} + +template static inline void read(const FileNode& node, Complex<_Tp>& value, const Complex<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 2 ? default_value : Complex<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1])); +} + +template static inline void read(const FileNode& node, Rect_<_Tp>& value, const Rect_<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 4 ? default_value : Rect_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]), + saturate_cast<_Tp>(temp[2]), saturate_cast<_Tp>(temp[3])); +} + +template static inline void read(const FileNode& node, Vec<_Tp, cn>& value, const Vec<_Tp, cn>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != cn ? default_value : Vec<_Tp, cn>(&temp[0]); +} + +template static inline void read(const FileNode& node, Matx<_Tp, m, n>& value, const Matx<_Tp, m, n>& default_matx = Matx<_Tp, m, n>()) +{ + Mat temp; + read(node, temp); // read as a Mat class + + if (temp.empty()) + value = default_matx; + else + value = Matx<_Tp, m, n>(temp); +} + +template static inline void read(const FileNode& node, Scalar_<_Tp>& value, const Scalar_<_Tp>& default_value) +{ + std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp; + value = temp.size() != 4 ? default_value : Scalar_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]), + saturate_cast<_Tp>(temp[2]), saturate_cast<_Tp>(temp[3])); +} + +static inline void read(const FileNode& node, Range& value, const Range& default_value) +{ + Point2i temp(value.start, value.end); const Point2i default_temp = Point2i(default_value.start, default_value.end); + read(node, temp, default_temp); + value.start = temp.x; value.end = temp.y; +} + +//! @} + +/** @brief Writes string to a file storage. +@relates cv::FileStorage + */ +CV_EXPORTS FileStorage& operator << (FileStorage& fs, const String& str); + +//! @cond IGNORED + +namespace internal +{ + class CV_EXPORTS WriteStructContext + { + public: + WriteStructContext(FileStorage& _fs, const String& name, int flags, const String& typeName = String()); + ~WriteStructContext(); + private: + FileStorage* fs; + }; + + template class VecWriterProxy + { + public: + VecWriterProxy( FileStorage* _fs ) : fs(_fs) {} + void operator()(const std::vector<_Tp>& vec) const + { + size_t count = vec.size(); + for (size_t i = 0; i < count; i++) + write(*fs, vec[i]); + } + private: + FileStorage* fs; + }; + + template class VecWriterProxy<_Tp, 1> + { + public: + VecWriterProxy( FileStorage* _fs ) : fs(_fs) {} + void operator()(const std::vector<_Tp>& vec) const + { + int _fmt = traits::SafeFmt<_Tp>::fmt; + char fmt[] = { (char)((_fmt >> 8) + '1'), (char)_fmt, '\0' }; + fs->writeRaw(fmt, !vec.empty() ? (uchar*)&vec[0] : 0, vec.size() * sizeof(_Tp)); + } + private: + FileStorage* fs; + }; + + template class VecReaderProxy + { + public: + VecReaderProxy( FileNodeIterator* _it ) : it(_it) {} + void operator()(std::vector<_Tp>& vec, size_t count) const + { + count = std::min(count, it->remaining()); + vec.resize(count); + for (size_t i = 0; i < count; i++, ++(*it)) + read(**it, vec[i], _Tp()); + } + private: + FileNodeIterator* it; + }; + + template class VecReaderProxy<_Tp, 1> + { + public: + VecReaderProxy( FileNodeIterator* _it ) : it(_it) {} + void operator()(std::vector<_Tp>& vec, size_t count) const + { + size_t remaining = it->remaining(); + size_t cn = DataType<_Tp>::channels; + int _fmt = traits::SafeFmt<_Tp>::fmt; + CV_Assert((_fmt >> 8) < 9); + char fmt[] = { (char)((_fmt >> 8)+'1'), (char)_fmt, '\0' }; + CV_Assert((remaining % cn) == 0); + size_t remaining1 = remaining / cn; + count = count > remaining1 ? remaining1 : count; + vec.resize(count); + it->readRaw(fmt, !vec.empty() ? (uchar*)&vec[0] : 0, count*sizeof(_Tp)); + } + private: + FileNodeIterator* it; + }; + +} // internal + +//! @endcond + +//! @relates cv::FileStorage +//! @{ + +template static inline +void write(FileStorage& fs, const _Tp& value) +{ + write(fs, String(), value); +} + +template<> inline +void write( FileStorage& fs, const int& value ) +{ + writeScalar(fs, value); +} + +template<> inline +void write( FileStorage& fs, const float& value ) +{ + writeScalar(fs, value); +} + +template<> inline +void write( FileStorage& fs, const double& value ) +{ + writeScalar(fs, value); +} + +template<> inline +void write( FileStorage& fs, const String& value ) +{ + writeScalar(fs, value); +} + +template static inline +void write(FileStorage& fs, const Point_<_Tp>& pt ) +{ + write(fs, pt.x); + write(fs, pt.y); +} + +template static inline +void write(FileStorage& fs, const Point3_<_Tp>& pt ) +{ + write(fs, pt.x); + write(fs, pt.y); + write(fs, pt.z); +} + +template static inline +void write(FileStorage& fs, const Size_<_Tp>& sz ) +{ + write(fs, sz.width); + write(fs, sz.height); +} + +template static inline +void write(FileStorage& fs, const Complex<_Tp>& c ) +{ + write(fs, c.re); + write(fs, c.im); +} + +template static inline +void write(FileStorage& fs, const Rect_<_Tp>& r ) +{ + write(fs, r.x); + write(fs, r.y); + write(fs, r.width); + write(fs, r.height); +} + +template static inline +void write(FileStorage& fs, const Vec<_Tp, cn>& v ) +{ + for(int i = 0; i < cn; i++) + write(fs, v.val[i]); +} + +template static inline +void write(FileStorage& fs, const Matx<_Tp, m, n>& x ) +{ + write(fs, Mat(x)); // write as a Mat class +} + +template static inline +void write(FileStorage& fs, const Scalar_<_Tp>& s ) +{ + write(fs, s.val[0]); + write(fs, s.val[1]); + write(fs, s.val[2]); + write(fs, s.val[3]); +} + +static inline +void write(FileStorage& fs, const Range& r ) +{ + write(fs, r.start); + write(fs, r.end); +} + +template static inline +void write( FileStorage& fs, const std::vector<_Tp>& vec ) +{ + cv::internal::VecWriterProxy<_Tp, traits::SafeFmt<_Tp>::fmt != 0> w(&fs); + w(vec); +} + +template static inline +void write(FileStorage& fs, const String& name, const Point_<_Tp>& pt ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, pt); +} + +template static inline +void write(FileStorage& fs, const String& name, const Point3_<_Tp>& pt ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, pt); +} + +template static inline +void write(FileStorage& fs, const String& name, const Size_<_Tp>& sz ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, sz); +} + +template static inline +void write(FileStorage& fs, const String& name, const Complex<_Tp>& c ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, c); +} + +template static inline +void write(FileStorage& fs, const String& name, const Rect_<_Tp>& r ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, r); +} + +template static inline +void write(FileStorage& fs, const String& name, const Vec<_Tp, cn>& v ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, v); +} + +template static inline +void write(FileStorage& fs, const String& name, const Matx<_Tp, m, n>& x ) +{ + write(fs, name, Mat(x)); // write as a Mat class +} + +template static inline +void write(FileStorage& fs, const String& name, const Scalar_<_Tp>& s ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, s); +} + +static inline +void write(FileStorage& fs, const String& name, const Range& r ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, r); +} + +static inline +void write(FileStorage& fs, const String& name, const KeyPoint& kpt) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, kpt.pt.x); + write(fs, kpt.pt.y); + write(fs, kpt.size); + write(fs, kpt.angle); + write(fs, kpt.response); + write(fs, kpt.octave); + write(fs, kpt.class_id); +} + +static inline +void write(FileStorage& fs, const String& name, const DMatch& m) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+FileNode::FLOW); + write(fs, m.queryIdx); + write(fs, m.trainIdx); + write(fs, m.imgIdx); + write(fs, m.distance); +} + +template::value >::type* = nullptr> +static inline void write( FileStorage& fs, const String& name, const _Tp& val ) +{ + write(fs, name, static_cast(val)); +} + +template static inline +void write( FileStorage& fs, const String& name, const std::vector<_Tp>& vec ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ+(traits::SafeFmt<_Tp>::fmt != 0 ? FileNode::FLOW : 0)); + write(fs, vec); +} + +template static inline +void write( FileStorage& fs, const String& name, const std::vector< std::vector<_Tp> >& vec ) +{ + cv::internal::WriteStructContext ws(fs, name, FileNode::SEQ); + for(size_t i = 0; i < vec.size(); i++) + { + cv::internal::WriteStructContext ws_(fs, name, FileNode::SEQ+(traits::SafeFmt<_Tp>::fmt != 0 ? FileNode::FLOW : 0)); + write(fs, vec[i]); + } +} + +#ifdef CV__LEGACY_PERSISTENCE +// This code is not needed anymore, but it is preserved here to keep source compatibility +// Implementation is similar to templates instantiations +static inline void write(FileStorage& fs, const KeyPoint& kpt) { write(fs, String(), kpt); } +static inline void write(FileStorage& fs, const DMatch& m) { write(fs, String(), m); } +static inline void write(FileStorage& fs, const std::vector& vec) +{ + cv::internal::VecWriterProxy w(&fs); + w(vec); +} +static inline void write(FileStorage& fs, const std::vector& vec) +{ + cv::internal::VecWriterProxy w(&fs); + w(vec); + +} +#endif + +//! @} FileStorage + +//! @relates cv::FileNode +//! @{ + +static inline +void read(const FileNode& node, bool& value, bool default_value) +{ + int temp; + read(node, temp, (int)default_value); + value = temp != 0; +} + +static inline +void read(const FileNode& node, uchar& value, uchar default_value) +{ + int temp; + read(node, temp, (int)default_value); + value = saturate_cast(temp); +} + +static inline +void read(const FileNode& node, schar& value, schar default_value) +{ + int temp; + read(node, temp, (int)default_value); + value = saturate_cast(temp); +} + +static inline +void read(const FileNode& node, ushort& value, ushort default_value) +{ + int temp; + read(node, temp, (int)default_value); + value = saturate_cast(temp); +} + +static inline +void read(const FileNode& node, short& value, short default_value) +{ + int temp; + read(node, temp, (int)default_value); + value = saturate_cast(temp); +} + +template static inline +void read( FileNodeIterator& it, std::vector<_Tp>& vec, size_t maxCount = (size_t)INT_MAX ) +{ + cv::internal::VecReaderProxy<_Tp, traits::SafeFmt<_Tp>::fmt != 0> r(&it); + r(vec, maxCount); +} + +template::value >::type* = nullptr> +static inline void read(const FileNode& node, _Tp& value, const _Tp& default_value = static_cast<_Tp>(0)) +{ + int temp; + read(node, temp, static_cast(default_value)); + value = static_cast<_Tp>(temp); +} + +template static inline +void read( const FileNode& node, std::vector<_Tp>& vec, const std::vector<_Tp>& default_value = std::vector<_Tp>() ) +{ + if(node.empty()) + vec = default_value; + else + { + FileNodeIterator it = node.begin(); + read( it, vec ); + } +} + +static inline +void read( const FileNode& node, std::vector& vec, const std::vector& default_value ) +{ + if(node.empty()) + vec = default_value; + else + read(node, vec); +} + +static inline +void read( const FileNode& node, std::vector& vec, const std::vector& default_value ) +{ + if(node.empty()) + vec = default_value; + else + read(node, vec); +} + +//! @} FileNode + +//! @relates cv::FileStorage +//! @{ + +/** @brief Writes data to a file storage. + */ +template static inline +FileStorage& operator << (FileStorage& fs, const _Tp& value) +{ + if( !fs.isOpened() ) + return fs; + if( fs.state == FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP ) + CV_Error( Error::StsError, "No element name has been given" ); + write( fs, fs.elname, value ); + if( fs.state & FileStorage::INSIDE_MAP ) + fs.state = FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP; + return fs; +} + +/** @brief Writes data to a file storage. + */ +static inline +FileStorage& operator << (FileStorage& fs, const char* str) +{ + return (fs << String(str)); +} + +/** @brief Writes data to a file storage. + */ +static inline +FileStorage& operator << (FileStorage& fs, char* value) +{ + return (fs << String(value)); +} + +//! @} FileStorage + +//! @relates cv::FileNodeIterator +//! @{ + +/** @brief Reads data from a file storage. + */ +template static inline +FileNodeIterator& operator >> (FileNodeIterator& it, _Tp& value) +{ + read( *it, value, _Tp()); + return ++it; +} + +/** @brief Reads data from a file storage. + */ +template static inline +FileNodeIterator& operator >> (FileNodeIterator& it, std::vector<_Tp>& vec) +{ + cv::internal::VecReaderProxy<_Tp, traits::SafeFmt<_Tp>::fmt != 0> r(&it); + r(vec, (size_t)INT_MAX); + return it; +} + +//! @} FileNodeIterator + +//! @relates cv::FileNode +//! @{ + +/** @brief Reads data from a file storage. + */ +template static inline +void operator >> (const FileNode& n, _Tp& value) +{ + read( n, value, _Tp()); +} + +/** @brief Reads data from a file storage. + */ +template static inline +void operator >> (const FileNode& n, std::vector<_Tp>& vec) +{ + FileNodeIterator it = n.begin(); + it >> vec; +} + +/** @brief Reads KeyPoint from a file storage. +*/ +//It needs special handling because it contains two types of fields, int & float. +static inline +void operator >> (const FileNode& n, KeyPoint& kpt) +{ + FileNodeIterator it = n.begin(); + it >> kpt.pt.x >> kpt.pt.y >> kpt.size >> kpt.angle >> kpt.response >> kpt.octave >> kpt.class_id; +} + +#ifdef CV__LEGACY_PERSISTENCE +static inline +void operator >> (const FileNode& n, std::vector& vec) +{ + read(n, vec); +} +static inline +void operator >> (const FileNode& n, std::vector& vec) +{ + read(n, vec); +} +#endif + +/** @brief Reads DMatch from a file storage. +*/ +//It needs special handling because it contains two types of fields, int & float. +static inline +void operator >> (const FileNode& n, DMatch& m) +{ + FileNodeIterator it = n.begin(); + it >> m.queryIdx >> m.trainIdx >> m.imgIdx >> m.distance; +} + +//! @} FileNode + +//! @relates cv::FileNodeIterator +//! @{ + +CV_EXPORTS bool operator == (const FileNodeIterator& it1, const FileNodeIterator& it2); +CV_EXPORTS bool operator != (const FileNodeIterator& it1, const FileNodeIterator& it2); + +static inline +ptrdiff_t operator - (const FileNodeIterator& it1, const FileNodeIterator& it2) +{ + return it2.remaining() - it1.remaining(); +} + +static inline +bool operator < (const FileNodeIterator& it1, const FileNodeIterator& it2) +{ + return it1.remaining() > it2.remaining(); +} + +//! @} FileNodeIterator + +} // cv + +#endif // OPENCV_CORE_PERSISTENCE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/quaternion.hpp b/Thirdparty/opencv2/include/opencv2/core/quaternion.hpp new file mode 100644 index 0000000..9e3e443 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/quaternion.hpp @@ -0,0 +1,1696 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2020, Huawei Technologies Co., Ltd. All rights reserved. +// Third party copyrights are property of their respective owners. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Liangqian Kong +// Longbu Wang +#ifndef OPENCV_CORE_QUATERNION_HPP +#define OPENCV_CORE_QUATERNION_HPP + +#include +#include +#include +namespace cv +{ +//! @addtogroup core +//! @{ + +//! Unit quaternion flag +enum QuatAssumeType +{ + /** + * This flag is specified by default. + * If this flag is specified, the input quaternions are assumed to be not unit quaternions. + * It can guarantee the correctness of the calculations, + * although the calculation speed will be slower than the flag QUAT_ASSUME_UNIT. + */ + QUAT_ASSUME_NOT_UNIT, + /** + * If this flag is specified, the input quaternions are assumed to be unit quaternions which + * will save some computations. However, if this flag is specified without unit quaternion, + * the program correctness of the result will not be guaranteed. + */ + QUAT_ASSUME_UNIT +}; + +class QuatEnum +{ +public: + /** @brief Enum of Euler angles type. + * + * Without considering the possibility of using two different convertions for the definition of the rotation axes , + * there exists twelve possible sequences of rotation axes, divided into two groups: + * - Proper Euler angles (Z-X-Z, X-Y-X, Y-Z-Y, Z-Y-Z, X-Z-X, Y-X-Y) + * - Tait–Bryan angles (X-Y-Z, Y-Z-X, Z-X-Y, X-Z-Y, Z-Y-X, Y-X-Z). + * + * The three elemental rotations may be [extrinsic](https://en.wikipedia.org/wiki/Euler_angles#Definition_by_extrinsic_rotations) + * (rotations about the axes *xyz* of the original coordinate system, which is assumed to remain motionless), + * or [intrinsic](https://en.wikipedia.org/wiki/Euler_angles#Definition_by_intrinsic_rotations)(rotations about the axes of the rotating coordinate system *XYZ*, solidary with the moving body, which changes its orientation after each elemental rotation). + * + * + * Extrinsic and intrinsic rotations are relevant. + * + * The definition of the Euler angles is as following, + * - \f$\theta_1 \f$ represents the first rotation angle, + * - \f$\theta_2 \f$ represents the second rotation angle, + * - \f$\theta_3 \f$ represents the third rotation angle. + * + * For intrinsic rotations in the order of X-Y-Z, the rotation matrix R can be calculated by:\f[R =X(\theta_1) Y(\theta_2) Z(\theta_3) \f] + * For extrinsic rotations in the order of X-Y-Z, the rotation matrix R can be calculated by:\f[R =Z({\theta_3}) Y({\theta_2}) X({\theta_1})\f] + * where + * \f[X({\theta_1})={\begin{bmatrix}1&0&0\\0&\cos {\theta_1} &-\sin {\theta_1} \\0&\sin {\theta_1} &\cos {\theta_1} \\\end{bmatrix}}, + * Y({\theta_2})={\begin{bmatrix}\cos \theta_{2}&0&\sin \theta_{2}\\0&1 &0 \\\ -sin \theta_2& 0&\cos \theta_{2} \\\end{bmatrix}}, + * Z({\theta_3})={\begin{bmatrix}\cos\theta_{3} &-\sin \theta_3&0\\\sin \theta_3 &\cos \theta_3 &0\\0&0&1\\\end{bmatrix}}. + * \f] + * + * The function is designed according to this set of conventions: + * - [Right handed](https://en.wikipedia.org/wiki/Right_hand_rule) reference frames are adopted, and the [right hand rule](https://en.wikipedia.org/wiki/Right_hand_rule) is used to determine the sign of angles. + * - Each matrix is meant to represent an [active rotation](https://en.wikipedia.org/wiki/Active_and_passive_transformation) (the composing and composed matrices + * are supposed to act on the coordinates of vectors defined in the initial fixed reference frame and give as a result the coordinates of a rotated vector defined in the same reference frame). + * - For \f$\theta_1\f$ and \f$\theta_3\f$, the valid range is (−π, π]. + * + * For \f$\theta_2\f$, the valid range is [−π/2, π/2] or [0, π]. + * + * For Tait–Bryan angles, the valid range of \f$\theta_2\f$ is [−π/2, π/2]. When transforming a quaternion to Euler angles, the solution of Euler angles is unique in condition of \f$ \theta_2 \in (−π/2, π/2)\f$ . + * If \f$\theta_2 = −π/2 \f$ or \f$ \theta_2 = Ï€/2\f$, there are infinite solutions. The common name for this situation is gimbal lock. + * For Proper Euler angles,the valid range of \f$\theta_2\f$ is in [0, π]. The solutions of Euler angles are unique in condition of \f$ \theta_2 \in (0, π)\f$ . If \f$\theta_2 =0 \f$ or \f$\theta_2 =Ï€ \f$, + * there are infinite solutions and gimbal lock will occur. + */ + enum EulerAnglesType + { + INT_XYZ, ///< Intrinsic rotations with the Euler angles type X-Y-Z + INT_XZY, ///< Intrinsic rotations with the Euler angles type X-Z-Y + INT_YXZ, ///< Intrinsic rotations with the Euler angles type Y-X-Z + INT_YZX, ///< Intrinsic rotations with the Euler angles type Y-Z-X + INT_ZXY, ///< Intrinsic rotations with the Euler angles type Z-X-Y + INT_ZYX, ///< Intrinsic rotations with the Euler angles type Z-Y-X + INT_XYX, ///< Intrinsic rotations with the Euler angles type X-Y-X + INT_XZX, ///< Intrinsic rotations with the Euler angles type X-Z-X + INT_YXY, ///< Intrinsic rotations with the Euler angles type Y-X-Y + INT_YZY, ///< Intrinsic rotations with the Euler angles type Y-Z-Y + INT_ZXZ, ///< Intrinsic rotations with the Euler angles type Z-X-Z + INT_ZYZ, ///< Intrinsic rotations with the Euler angles type Z-Y-Z + + EXT_XYZ, ///< Extrinsic rotations with the Euler angles type X-Y-Z + EXT_XZY, ///< Extrinsic rotations with the Euler angles type X-Z-Y + EXT_YXZ, ///< Extrinsic rotations with the Euler angles type Y-X-Z + EXT_YZX, ///< Extrinsic rotations with the Euler angles type Y-Z-X + EXT_ZXY, ///< Extrinsic rotations with the Euler angles type Z-X-Y + EXT_ZYX, ///< Extrinsic rotations with the Euler angles type Z-Y-X + EXT_XYX, ///< Extrinsic rotations with the Euler angles type X-Y-X + EXT_XZX, ///< Extrinsic rotations with the Euler angles type X-Z-X + EXT_YXY, ///< Extrinsic rotations with the Euler angles type Y-X-Y + EXT_YZY, ///< Extrinsic rotations with the Euler angles type Y-Z-Y + EXT_ZXZ, ///< Extrinsic rotations with the Euler angles type Z-X-Z + EXT_ZYZ, ///< Extrinsic rotations with the Euler angles type Z-Y-Z + #ifndef CV_DOXYGEN + EULER_ANGLES_MAX_VALUE + #endif + }; + +}; + +template class Quat; +template std::ostream& operator<<(std::ostream&, const Quat<_Tp>&); + +/** + * Quaternion is a number system that extends the complex numbers. It can be expressed as a + * rotation in three-dimensional space. + * A quaternion is generally represented in the form: + * \f[q = w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\f] + * \f[q = [w, x, y, z]\f] + * \f[q = [w, \boldsymbol{v}] \f] + * \f[q = ||q||[\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\f] + * \f[q = ||q||[\cos\psi, \boldsymbol{u}\sin\psi]\f] + * where \f$\psi = \frac{\theta}{2}\f$, \f$\theta\f$ represents rotation angle, + * \f$\boldsymbol{u} = [u_x, u_y, u_z]\f$ represents normalized rotation axis, + * and \f$||q||\f$ represents the norm of \f$q\f$. + * + * A unit quaternion is usually represents rotation, which has the form: + * \f[q = [\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\f] + * + * To create a quaternion representing the rotation around the axis \f$\boldsymbol{u}\f$ + * with angle \f$\theta\f$, you can use + * ``` + * using namespace cv; + * double angle = CV_PI; + * Vec3d axis = {0, 0, 1}; + * Quatd q = Quatd::createFromAngleAxis(angle, axis); + * ``` + * + * You can simply use four same type number to create a quaternion + * ``` + * Quatd q(1, 2, 3, 4); + * ``` + * Or use a Vec4d or Vec4f vector. + * ``` + * Vec4d vec{1, 2, 3, 4}; + * Quatd q(vec); + * ``` + * + * ``` + * Vec4f vec{1, 2, 3, 4}; + * Quatf q(vec); + * ``` + * + * If you already have a 3x3 rotation matrix R, then you can use + * ``` + * Quatd q = Quatd::createFromRotMat(R); + * ``` + * + * If you already have a rotation vector rvec which has the form of `angle * axis`, then you can use + * ``` + * Quatd q = Quatd::createFromRvec(rvec); + * ``` + * + * To extract the rotation matrix from quaternion, see toRotMat3x3() + * + * To extract the Vec4d or Vec4f, see toVec() + * + * To extract the rotation vector, see toRotVec() + * + * If there are two quaternions \f$q_0, q_1\f$ are needed to interpolate, you can use nlerp(), slerp() or spline() + * ``` + * Quatd::nlerp(q0, q1, t) + * + * Quatd::slerp(q0, q1, t) + * + * Quatd::spline(q0, q0, q1, q1, t) + * ``` + * spline can smoothly connect rotations of multiple quaternions + * + * Three ways to get an element in Quaternion + * ``` + * Quatf q(1,2,3,4); + * std::cout << q.w << std::endl; // w=1, x=2, y=3, z=4 + * std::cout << q[0] << std::endl; // q[0]=1, q[1]=2, q[2]=3, q[3]=4 + * std::cout << q.at(0) << std::endl; + * ``` + */ +template +class Quat +{ + static_assert(std::is_floating_point<_Tp>::value, "Quaternion only make sense with type of float or double"); + using value_type = _Tp; +public: + static constexpr _Tp CV_QUAT_EPS = (_Tp)1.e-6; + static constexpr _Tp CV_QUAT_CONVERT_THRESHOLD = (_Tp)1.e-6; + + Quat(); + + /** + * @brief From Vec4d or Vec4f. + */ + explicit Quat(const Vec<_Tp, 4> &coeff); + + /** + * @brief from four numbers. + */ + Quat(_Tp w, _Tp x, _Tp y, _Tp z); + + /** + * @brief from an angle, axis. Axis will be normalized in this function. And + * it generates + * \f[q = [\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\f] + * where \f$\psi = \frac{\theta}{2}\f$, \f$\theta\f$ is the rotation angle. + */ + static Quat<_Tp> createFromAngleAxis(const _Tp angle, const Vec<_Tp, 3> &axis); + + /** + * @brief from a 3x3 rotation matrix. + */ + static Quat<_Tp> createFromRotMat(InputArray R); + + /** + * @brief from a rotation vector + * \f$r\f$ has the form \f$\theta \cdot \boldsymbol{u}\f$, where \f$\theta\f$ + * represents rotation angle and \f$\boldsymbol{u}\f$ represents normalized rotation axis. + * + * Angle and axis could be easily derived as: + * \f[ + * \begin{equation} + * \begin{split} + * \psi &= ||r||\\ + * \boldsymbol{u} &= \frac{r}{\theta} + * \end{split} + * \end{equation} + * \f] + * Then a quaternion can be calculated by + * \f[q = [\cos\psi, \boldsymbol{u}\sin\psi]\f] + * where \f$\psi = \theta / 2 \f$ + */ + static Quat<_Tp> createFromRvec(InputArray rvec); + + /** + * @brief + * from Euler angles + * + * A quaternion can be generated from Euler angles by combining the quaternion representations of the Euler rotations. + * + * For example, if we use intrinsic rotations in the order of X-Y-Z,\f$\theta_1 \f$ is rotation around the X-axis, \f$\theta_2 \f$ is rotation around the Y-axis, + * \f$\theta_3 \f$ is rotation around the Z-axis. The final quaternion q can be calculated by + * + * \f[ {q} = q_{X, \theta_1} q_{Y, \theta_2} q_{Z, \theta_3}\f] + * where \f$ q_{X, \theta_1} \f$ is created from @ref createFromXRot, \f$ q_{Y, \theta_2} \f$ is created from @ref createFromYRot, + * \f$ q_{Z, \theta_3} \f$ is created from @ref createFromZRot. + * @param angles the Euler angles in a vector of length 3 + * @param eulerAnglesType the convertion Euler angles type + */ + static Quat<_Tp> createFromEulerAngles(const Vec<_Tp, 3> &angles, QuatEnum::EulerAnglesType eulerAnglesType); + + /** + * @brief get a quaternion from a rotation about the Y-axis by \f$\theta\f$ . + * \f[q = \cos(\theta/2)+0 i+ sin(\theta/2) j +0k \f] + */ + static Quat<_Tp> createFromYRot(const _Tp theta); + + /** + * @brief get a quaternion from a rotation about the X-axis by \f$\theta\f$ . + * \f[q = \cos(\theta/2)+sin(\theta/2) i +0 j +0 k \f] + */ + static Quat<_Tp> createFromXRot(const _Tp theta); + + /** + * @brief get a quaternion from a rotation about the Z-axis by \f$\theta\f$. + * \f[q = \cos(\theta/2)+0 i +0 j +sin(\theta/2) k \f] + */ + static Quat<_Tp> createFromZRot(const _Tp theta); + + /** + * @brief a way to get element. + * @param index over a range [0, 3]. + * + * A quaternion q + * + * q.at(0) is equivalent to q.w, + * + * q.at(1) is equivalent to q.x, + * + * q.at(2) is equivalent to q.y, + * + * q.at(3) is equivalent to q.z. + */ + _Tp at(size_t index) const; + + /** + * @brief return the conjugate of this quaternion. + * \f[q.conjugate() = (w, -x, -y, -z).\f] + */ + Quat<_Tp> conjugate() const; + + /** + * + * @brief return the value of exponential value. + * \f[\exp(q) = e^w (\cos||\boldsymbol{v}||+ \frac{v}{||\boldsymbol{v}||})\sin||\boldsymbol{v}||\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example: + * ``` + * Quatd q{1,2,3,4}; + * cout << exp(q) << endl; + * ``` + */ + template + friend Quat exp(const Quat &q); + + /** + * @brief return the value of exponential value. + * \f[\exp(q) = e^w (\cos||\boldsymbol{v}||+ \frac{v}{||\boldsymbol{v}||}\sin||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q{1,2,3,4}; + * cout << q.exp() << endl; + * ``` + */ + Quat<_Tp> exp() const; + + /** + * @brief return the value of logarithm function. + * \f[\ln(q) = \ln||q|| + \frac{\boldsymbol{v}}{||\boldsymbol{v}||}\arccos\frac{w}{||q||}.\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * @param assumeUnit if QUAT_ASSUME_UNIT, q assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q1{1,2,3,4}; + * cout << log(q1) << endl; + * ``` + */ + template + friend Quat log(const Quat &q, QuatAssumeType assumeUnit); + + /** + * @brief return the value of logarithm function. + * \f[\ln(q) = \ln||q|| + \frac{\boldsymbol{v}}{||\boldsymbol{v}||}\arccos\frac{w}{||q||}\f]. + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.log(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * Quatd q1(1,2,3,4); + * q1.normalize().log(assumeUnit); + * ``` + */ + Quat<_Tp> log(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the value of power function with index \f$x\f$. + * \f[q^x = ||q||(cos(x\theta) + \boldsymbol{u}sin(x\theta))).\f] + * @param q a quaternion. + * @param x index of exponentiation. + * @param assumeUnit if QUAT_ASSUME_UNIT, quaternion q assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * power(q, 2.0); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * double angle = CV_PI; + * Vec3d axis{0, 0, 1}; + * Quatd q1 = Quatd::createFromAngleAxis(angle, axis); //generate a unit quat by axis and angle + * power(q1, 2.0, assumeUnit);//This assumeUnit means q1 is a unit quaternion. + * ``` + * @note the type of the index should be the same as the quaternion. + */ + template + friend Quat power(const Quat &q, const T x, QuatAssumeType assumeUnit); + + /** + * @brief return the value of power function with index \f$x\f$. + * \f[q^x = ||q||(\cos(x\theta) + \boldsymbol{u}\sin(x\theta))).\f] + * @param x index of exponentiation. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.power(2.0); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * double angle = CV_PI; + * Vec3d axis{0, 0, 1}; + * Quatd q1 = Quatd::createFromAngleAxis(angle, axis); //generate a unit quat by axis and angle + * q1.power(2.0, assumeUnit); //This assumeUnt means q1 is a unit quaternion + * ``` + */ + Quat<_Tp> power(const _Tp x, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return \f$\sqrt{q}\f$. + * @param q a quaternion. + * @param assumeUnit if QUAT_ASSUME_UNIT, quaternion q assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatf q(1,2,3,4); + * sqrt(q); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q = {1,0,0,0}; + * sqrt(q, assumeUnit); //This assumeUnit means q is a unit quaternion. + * ``` + */ + template + friend Quat sqrt(const Quat &q, QuatAssumeType assumeUnit); + + /** + * @brief return \f$\sqrt{q}\f$. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatf q(1,2,3,4); + * q.sqrt(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q = {1,0,0,0}; + * q.sqrt(assumeUnit); //This assumeUnit means q is a unit quaternion + * ``` + */ + Quat<_Tp> sqrt(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the value of power function with quaternion \f$q\f$. + * \f[p^q = e^{q\ln(p)}.\f] + * @param p base quaternion of power function. + * @param q index quaternion of power function. + * @param assumeUnit if QUAT_ASSUME_UNIT, quaternion \f$p\f$ assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd p(1,2,3,4); + * Quatd q(5,6,7,8); + * power(p, q); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * p = p.normalize(); + * power(p, q, assumeUnit); //This assumeUnit means p is a unit quaternion + * ``` + */ + template + friend Quat power(const Quat &p, const Quat &q, QuatAssumeType assumeUnit); + + /** + * @brief return the value of power function with quaternion \f$q\f$. + * \f[p^q = e^{q\ln(p)}.\f] + * @param q index quaternion of power function. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd p(1,2,3,4); + * Quatd q(5,6,7,8); + * p.power(q); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * p = p.normalize(); + * p.power(q, assumeUnit); //This assumeUnit means p is a unit quaternion + * ``` + */ + Quat<_Tp> power(const Quat<_Tp> &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the crossProduct between \f$p = (a, b, c, d) = (a, \boldsymbol{u})\f$ and \f$q = (w, x, y, z) = (w, \boldsymbol{v})\f$. + * \f[p \times q = \frac{pq- qp}{2}\f] + * \f[p \times q = \boldsymbol{u} \times \boldsymbol{v}\f] + * \f[p \times q = (cz-dy)i + (dx-bz)j + (by-xc)k \f] + * + * For example + * ``` + * Quatd q{1,2,3,4}; + * Quatd p{5,6,7,8}; + * crossProduct(p, q); + * ``` + */ + template + friend Quat crossProduct(const Quat &p, const Quat &q); + + /** + * @brief return the crossProduct between \f$p = (a, b, c, d) = (a, \boldsymbol{u})\f$ and \f$q = (w, x, y, z) = (w, \boldsymbol{v})\f$. + * \f[p \times q = \frac{pq- qp}{2}.\f] + * \f[p \times q = \boldsymbol{u} \times \boldsymbol{v}.\f] + * \f[p \times q = (cz-dy)i + (dx-bz)j + (by-xc)k. \f] + * + * For example + * ``` + * Quatd q{1,2,3,4}; + * Quatd p{5,6,7,8}; + * p.crossProduct(q) + * ``` + */ + Quat<_Tp> crossProduct(const Quat<_Tp> &q) const; + + /** + * @brief return the norm of quaternion. + * \f[||q|| = \sqrt{w^2 + x^2 + y^2 + z^2}.\f] + */ + _Tp norm() const; + + /** + * @brief return a normalized \f$p\f$. + * \f[p = \frac{q}{||q||}\f] + * where \f$p\f$ satisfies \f$(p.x)^2 + (p.y)^2 + (p.z)^2 + (p.w)^2 = 1.\f$ + */ + Quat<_Tp> normalize() const; + + /** + * @brief return \f$q^{-1}\f$ which is an inverse of \f$q\f$ + * which satisfies \f$q * q^{-1} = 1\f$. + * @param q a quaternion. + * @param assumeUnit if QUAT_ASSUME_UNIT, quaternion q assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * inv(q); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q = q.normalize(); + * inv(q, assumeUnit);//This assumeUnit means p is a unit quaternion + * ``` + */ + template + friend Quat inv(const Quat &q, QuatAssumeType assumeUnit); + + /** + * @brief return \f$q^{-1}\f$ which is an inverse of \f$q\f$ + * satisfying \f$q * q^{-1} = 1\f$. + * @param assumeUnit if QUAT_ASSUME_UNIT, quaternion q assume to be a unit quaternion and this function will save some computations. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.inv(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q = q.normalize(); + * q.inv(assumeUnit); //assumeUnit means p is a unit quaternion + * ``` + */ + Quat<_Tp> inv(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return sinh value of quaternion q, sinh could be calculated as: + * \f[\sinh(p) = \sin(w)\cos(||\boldsymbol{v}||) + \cosh(w)\frac{v}{||\boldsymbol{v}||}\sin||\boldsymbol{v}||\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * sinh(q); + * ``` + */ + template + friend Quat sinh(const Quat &q); + + /** + * @brief return sinh value of this quaternion, sinh could be calculated as: + * \f$\sinh(p) = \sin(w)\cos(||\boldsymbol{v}||) + \cosh(w)\frac{v}{||\boldsymbol{v}||}\sin||\boldsymbol{v}||\f$ + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.sinh(); + * ``` + */ + Quat<_Tp> sinh() const; + + /** + * @brief return cosh value of quaternion q, cosh could be calculated as: + * \f[\cosh(p) = \cosh(w) * \cos(||\boldsymbol{v}||) + \sinh(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sin(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * cosh(q); + * ``` + */ + template + friend Quat cosh(const Quat &q); + + /** + * @brief return cosh value of this quaternion, cosh could be calculated as: + * \f[\cosh(p) = \cosh(w) * \cos(||\boldsymbol{v}||) + \sinh(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}sin(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.cosh(); + * ``` + */ + Quat<_Tp> cosh() const; + + /** + * @brief return tanh value of quaternion q, tanh could be calculated as: + * \f[ \tanh(q) = \frac{\sinh(q)}{\cosh(q)}.\f] + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * tanh(q); + * ``` + * @sa sinh, cosh + */ + template + friend Quat tanh(const Quat &q); + + /** + * @brief return tanh value of this quaternion, tanh could be calculated as: + * \f[ \tanh(q) = \frac{\sinh(q)}{\cosh(q)}.\f] + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.tanh(); + * ``` + * @sa sinh, cosh + */ + Quat<_Tp> tanh() const; + + /** + * @brief return tanh value of quaternion q, sin could be calculated as: + * \f[\sin(p) = \sin(w) * \cosh(||\boldsymbol{v}||) + \cos(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sinh(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * sin(q); + * ``` + */ + template + friend Quat sin(const Quat &q); + + /** + * @brief return sin value of this quaternion, sin could be calculated as: + * \f[\sin(p) = \sin(w) * \cosh(||\boldsymbol{v}||) + \cos(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sinh(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.sin(); + * ``` + */ + Quat<_Tp> sin() const; + + /** + * @brief return sin value of quaternion q, cos could be calculated as: + * \f[\cos(p) = \cos(w) * \cosh(||\boldsymbol{v}||) - \sin(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sinh(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * cos(q); + * ``` + */ + template + friend Quat cos(const Quat &q); + + /** + * @brief return cos value of this quaternion, cos could be calculated as: + * \f[\cos(p) = \cos(w) * \cosh(||\boldsymbol{v}||) - \sin(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sinh(||\boldsymbol{v}||)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.cos(); + * ``` + */ + Quat<_Tp> cos() const; + + /** + * @brief return tan value of quaternion q, tan could be calculated as: + * \f[\tan(q) = \frac{\sin(q)}{\cos(q)}.\f] + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * tan(q); + * ``` + */ + template + friend Quat tan(const Quat &q); + + /** + * @brief return tan value of this quaternion, tan could be calculated as: + * \f[\tan(q) = \frac{\sin(q)}{\cos(q)}.\f] + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.tan(); + * ``` + */ + Quat<_Tp> tan() const; + + /** + * @brief return arcsin value of quaternion q, arcsin could be calculated as: + * \f[\arcsin(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arcsinh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * asin(q); + * ``` + */ + template + friend Quat asin(const Quat &q); + + /** + * @brief return arcsin value of this quaternion, arcsin could be calculated as: + * \f[\arcsin(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arcsinh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.asin(); + * ``` + */ + Quat<_Tp> asin() const; + + /** + * @brief return arccos value of quaternion q, arccos could be calculated as: + * \f[\arccos(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arccosh(q)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * acos(q); + * ``` + */ + template + friend Quat acos(const Quat &q); + + /** + * @brief return arccos value of this quaternion, arccos could be calculated as: + * \f[\arccos(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arccosh(q)\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.acos(); + * ``` + */ + Quat<_Tp> acos() const; + + /** + * @brief return arctan value of quaternion q, arctan could be calculated as: + * \f[\arctan(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arctanh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * atan(q); + * ``` + */ + template + friend Quat atan(const Quat &q); + + /** + * @brief return arctan value of this quaternion, arctan could be calculated as: + * \f[\arctan(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arctanh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\f] + * where \f$\boldsymbol{v} = [x, y, z].\f$ + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.atan(); + * ``` + */ + Quat<_Tp> atan() const; + + /** + * @brief return arcsinh value of quaternion q, arcsinh could be calculated as: + * \f[arcsinh(q) = \ln(q + \sqrt{q^2 + 1})\f]. + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * asinh(q); + * ``` + */ + template + friend Quat asinh(const Quat &q); + + /** + * @brief return arcsinh value of this quaternion, arcsinh could be calculated as: + * \f[arcsinh(q) = \ln(q + \sqrt{q^2 + 1})\f]. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.asinh(); + * ``` + */ + Quat<_Tp> asinh() const; + + /** + * @brief return arccosh value of quaternion q, arccosh could be calculated as: + * \f[arccosh(q) = \ln(q + \sqrt{q^2 - 1})\f]. + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * acosh(q); + * ``` + */ + template + friend Quat acosh(const Quat &q); + + /** + * @brief return arccosh value of this quaternion, arccosh could be calculated as: + * \f[arcosh(q) = \ln(q + \sqrt{q^2 - 1})\f]. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.acosh(); + * ``` + */ + Quat<_Tp> acosh() const; + + /** + * @brief return arctanh value of quaternion q, arctanh could be calculated as: + * \f[arctanh(q) = \frac{\ln(q + 1) - \ln(1 - q)}{2}\f]. + * @param q a quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * atanh(q); + * ``` + */ + template + friend Quat atanh(const Quat &q); + + /** + * @brief return arctanh value of this quaternion, arctanh could be calculated as: + * \f[arcsinh(q) = \frac{\ln(q + 1) - \ln(1 - q)}{2}\f]. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.atanh(); + * ``` + */ + Quat<_Tp> atanh() const; + + /** + * @brief return true if this quaternion is a unit quaternion. + * @param eps tolerance scope of normalization. The eps could be defined as + * + * \f[eps = |1 - dotValue|\f] where \f[dotValue = (this.w^2 + this.x^2 + this,y^2 + this.z^2).\f] + * And this function will consider it is normalized when the dotValue over a range \f$[1-eps, 1+eps]\f$. + */ + bool isNormal(_Tp eps=CV_QUAT_EPS) const; + + /** + * @brief to throw an error if this quaternion is not a unit quaternion. + * @param eps tolerance scope of normalization. + * @sa isNormal + */ + void assertNormal(_Tp eps=CV_QUAT_EPS) const; + + /** + * @brief transform a quaternion to a 3x3 rotation matrix. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and + * this function will save some computations. Otherwise, this function will normalize this + * quaternion at first then do the transformation. + * + * @note Matrix A which is to be rotated should have the form + * \f[\begin{bmatrix} + * x_0& x_1& x_2&...&x_n\\ + * y_0& y_1& y_2&...&y_n\\ + * z_0& z_1& z_2&...&z_n + * \end{bmatrix}\f] + * where the same subscript represents a point. The shape of A assume to be [3, n] + * The points matrix A can be rotated by toRotMat3x3() * A. + * The result has 3 rows and n columns too. + + * For example + * ``` + * double angle = CV_PI; + * Vec3d axis{0,0,1}; + * Quatd q_unit = Quatd::createFromAngleAxis(angle, axis); //quaternion could also be get by interpolation by two or more quaternions. + * + * //assume there is two points (1,0,0) and (1,0,1) to be rotated + * Mat pointsA = (Mat_(2, 3) << 1,0,0,1,0,1); + * //change the shape + * pointsA = pointsA.t(); + * // rotate 180 degrees around the z axis + * Mat new_point = q_unit.toRotMat3x3() * pointsA; + * // print two points + * cout << new_point << endl; + * ``` + */ + Matx<_Tp, 3, 3> toRotMat3x3(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief transform a quaternion to a 4x4 rotation matrix. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and + * this function will save some computations. Otherwise, this function will normalize this + * quaternion at first then do the transformation. + * + * The operations is similar as toRotMat3x3 + * except that the points matrix should have the form + * \f[\begin{bmatrix} + * x_0& x_1& x_2&...&x_n\\ + * y_0& y_1& y_2&...&y_n\\ + * z_0& z_1& z_2&...&z_n\\ + * 0&0&0&...&0 + * \end{bmatrix}\f] + * + * @sa toRotMat3x3 + */ + + Matx<_Tp, 4, 4> toRotMat4x4(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief transform the this quaternion to a Vec. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.toVec(); + * ``` + */ + Vec<_Tp, 4> toVec() const; + + /** + * @brief transform this quaternion to a Rotation vector. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and + * this function will save some computations. + * Rotation vector rVec is defined as: + * \f[ rVec = [\theta v_x, \theta v_y, \theta v_z]\f] + * where \f$\theta\f$ represents rotation angle, and \f$\boldsymbol{v}\f$ represents the normalized rotation axis. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.toRotVec(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q.normalize().toRotVec(assumeUnit); //answer is same as q.toRotVec(). + * ``` + */ + Vec<_Tp, 3> toRotVec(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief get the angle of quaternion, it returns the rotation angle. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and + * this function will save some computations. + * \f[\psi = 2 *arccos(\frac{w}{||q||})\f] + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.getAngle(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q.normalize().getAngle(assumeUnit);//same as q.getAngle(). + * ``` + * @note It always return the value between \f$[0, 2\pi]\f$. + */ + _Tp getAngle(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief get the axis of quaternion, it returns a vector of length 3. + * @param assumeUnit if QUAT_ASSUME_UNIT, this quaternion assume to be a unit quaternion and + * this function will save some computations. + * + * the unit axis \f$\boldsymbol{u}\f$ is defined by + * \f[\begin{equation} + * \begin{split} + * \boldsymbol{v} + * &= \boldsymbol{u} ||\boldsymbol{v}||\\ + * &= \boldsymbol{u}||q||sin(\frac{\theta}{2}) + * \end{split} + * \end{equation}\f] + * where \f$v=[x, y ,z]\f$ and \f$\theta\f$ represents rotation angle. + * + * + * For example + * ``` + * Quatd q(1,2,3,4); + * q.getAxis(); + * + * QuatAssumeType assumeUnit = QUAT_ASSUME_UNIT; + * q.normalize().getAxis(assumeUnit);//same as q.getAxis() + * ``` + */ + Vec<_Tp, 3> getAxis(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const; + + /** + * @brief return the dot between quaternion \f$q\f$ and this quaternion. + * + * dot(p, q) is a good metric of how close the quaternions are. + * Indeed, consider the unit quaternion difference \f$p^{-1} * q\f$, its real part is dot(p, q). + * At the same time its real part is equal to \f$\cos(\beta/2)\f$ where \f$\beta\f$ is + * an angle of rotation between p and q, i.e., + * Therefore, the closer dot(p, q) to 1, + * the smaller rotation between them. + * \f[p \cdot q = p.w \cdot q.w + p.x \cdot q.x + p.y \cdot q.y + p.z \cdot q.z\f] + * @param q the other quaternion. + * + * For example + * ``` + * Quatd q(1,2,3,4); + * Quatd p(5,6,7,8); + * p.dot(q); + * ``` + */ + _Tp dot(Quat<_Tp> q) const; + + /** + * @brief To calculate the interpolation from \f$q_0\f$ to \f$q_1\f$ by Linear Interpolation(Nlerp) + * For two quaternions, this interpolation curve can be displayed as: + * \f[Lerp(q_0, q_1, t) = (1 - t)q_0 + tq_1.\f] + * Obviously, the lerp will interpolate along a straight line if we think of \f$q_0\f$ and \f$q_1\f$ as a vector + * in a two-dimensional space. When \f$t = 0\f$, it returns \f$q_0\f$ and when \f$t= 1\f$, it returns \f$q_1\f$. + * \f$t\f$ should to be ranged in \f$[0, 1]\f$ normally. + * @param q0 a quaternion used in linear interpolation. + * @param q1 a quaternion used in linear interpolation. + * @param t percent of vector \f$\overrightarrow{q_0q_1}\f$ over a range [0, 1]. + * @note it returns a non-unit quaternion. + */ + static Quat<_Tp> lerp(const Quat<_Tp> &q0, const Quat &q1, const _Tp t); + + /** + * @brief To calculate the interpolation from \f$q_0\f$ to \f$q_1\f$ by Normalized Linear Interpolation(Nlerp). + * it returns a normalized quaternion of Linear Interpolation(Lerp). + * \f[ Nlerp(q_0, q_1, t) = \frac{(1 - t)q_0 + tq_1}{||(1 - t)q_0 + tq_1||}.\f] + * The interpolation will always choose the shortest path but the constant speed is not guaranteed. + * @param q0 a quaternion used in normalized linear interpolation. + * @param q1 a quaternion used in normalized linear interpolation. + * @param t percent of vector \f$\overrightarrow{q_0q_1}\f$ over a range [0, 1]. + * @param assumeUnit if QUAT_ASSUME_UNIT, all input quaternions assume to be unit quaternion. Otherwise, all inputs + quaternion will be normalized inside the function. + * @sa lerp + */ + static Quat<_Tp> nlerp(const Quat<_Tp> &q0, const Quat &q1, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + @brief To calculate the interpolation between \f$q_0\f$ and \f$q_1\f$ by Spherical Linear + Interpolation(Slerp), which can be defined as: + \f[ Slerp(q_0, q_1, t) = \frac{\sin((1-t)\theta)}{\sin(\theta)}q_0 + \frac{\sin(t\theta)}{\sin(\theta)}q_1\f] + where \f$\theta\f$ can be calculated as: + \f[\theta=cos^{-1}(q_0\cdot q_1)\f] + resulting from the both of their norm is unit. + @param q0 a quaternion used in Slerp. + @param q1 a quaternion used in Slerp. + @param t percent of angle between \f$q_0\f$ and \f$q_1\f$ over a range [0, 1]. + @param assumeUnit if QUAT_ASSUME_UNIT, all input quaternions assume to be unit quaternions. Otherwise, all input + quaternions will be normalized inside the function. + @param directChange if QUAT_ASSUME_UNIT, the interpolation will choose the nearest path. + @note If the interpolation angle is small, the error between Nlerp and Slerp is not so large. To improve efficiency and + avoid zero division error, we use Nlerp instead of Slerp. + */ + static Quat<_Tp> slerp(const Quat<_Tp> &q0, const Quat &q1, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT, bool directChange=true); + + /** + * @brief To calculate the interpolation between \f$q_0\f$,\f$q_1\f$,\f$q_2\f$,\f$q_3\f$ by Spherical and quadrangle(Squad). This could be defined as: + * \f[Squad(q_i, s_i, s_{i+1}, q_{i+1}, t) = Slerp(Slerp(q_i, q_{i+1}, t), Slerp(s_i, s_{i+1}, t), 2t(1-t))\f] + * where + * \f[s_i = q_i\exp(-\frac{\log(q^*_iq_{i+1}) + \log(q^*_iq_{i-1})}{4})\f] + * + * The Squad expression is analogous to the \f$B\acute{e}zier\f$ curve, but involves spherical linear + * interpolation instead of simple linear interpolation. Each \f$s_i\f$ needs to be calculated by three + * quaternions. + * + * @param q0 the first quaternion. + * @param s0 the second quaternion. + * @param s1 the third quaternion. + * @param q1 thr fourth quaternion. + * @param t interpolation parameter of quadratic and linear interpolation over a range \f$[0, 1]\f$. + * @param assumeUnit if QUAT_ASSUME_UNIT, all input quaternions assume to be unit quaternion. Otherwise, all input + * quaternions will be normalized inside the function. + * @param directChange if QUAT_ASSUME_UNIT, squad will find the nearest path to interpolate. + * @sa interPoint, spline + */ + static Quat<_Tp> squad(const Quat<_Tp> &q0, const Quat<_Tp> &s0, + const Quat<_Tp> &s1, const Quat<_Tp> &q1, + const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT, + bool directChange=true); + + /** + * @brief This is the part calculation of squad. + * To calculate the intermedia quaternion \f$s_i\f$ between each three quaternion + * \f[s_i = q_i\exp(-\frac{\log(q^*_iq_{i+1}) + \log(q^*_iq_{i-1})}{4}).\f] + * @param q0 the first quaternion. + * @param q1 the second quaternion. + * @param q2 the third quaternion. + * @param assumeUnit if QUAT_ASSUME_UNIT, all input quaternions assume to be unit quaternion. Otherwise, all input + * quaternions will be normalized inside the function. + * @sa squad + */ + static Quat<_Tp> interPoint(const Quat<_Tp> &q0, const Quat<_Tp> &q1, + const Quat<_Tp> &q2, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + * @brief to calculate a quaternion which is the result of a \f$C^1\f$ continuous + * spline curve constructed by squad at the ratio t. Here, the interpolation values are + * between \f$q_1\f$ and \f$q_2\f$. \f$q_0\f$ and \f$q_2\f$ are used to ensure the \f$C^1\f$ + * continuity. if t = 0, it returns \f$q_1\f$, if t = 1, it returns \f$q_2\f$. + * @param q0 the first input quaternion to ensure \f$C^1\f$ continuity. + * @param q1 the second input quaternion. + * @param q2 the third input quaternion. + * @param q3 the fourth input quaternion the same use of \f$q1\f$. + * @param t ratio over a range [0, 1]. + * @param assumeUnit if QUAT_ASSUME_UNIT, \f$q_0, q_1, q_2, q_3\f$ assume to be unit quaternion. Otherwise, all input + * quaternions will be normalized inside the function. + * + * For example: + * + * If there are three double quaternions \f$v_0, v_1, v_2\f$ waiting to be interpolated. + * + * Interpolation between \f$v_0\f$ and \f$v_1\f$ with a ratio \f$t_0\f$ could be calculated as + * ``` + * Quatd::spline(v0, v0, v1, v2, t0); + * ``` + * Interpolation between \f$v_1\f$ and \f$v_2\f$ with a ratio \f$t_0\f$ could be calculated as + * ``` + * Quatd::spline(v0, v1, v2, v2, t0); + * ``` + * @sa squad, slerp + */ + static Quat<_Tp> spline(const Quat<_Tp> &q0, const Quat<_Tp> &q1, + const Quat<_Tp> &q2, const Quat<_Tp> &q3, + const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + + /** + * @brief Return opposite quaternion \f$-p\f$ + * which satisfies \f$p + (-p) = 0.\f$ + * + * For example + * ``` + * Quatd q{1, 2, 3, 4}; + * std::cout << -q << std::endl; // [-1, -2, -3, -4] + * ``` + */ + Quat<_Tp> operator-() const; + + /** + * @brief return true if two quaternions p and q are nearly equal, i.e. when the absolute + * value of each \f$p_i\f$ and \f$q_i\f$ is less than CV_QUAT_EPS. + */ + bool operator==(const Quat<_Tp>&) const; + + /** + * @brief Addition operator of two quaternions p and q. + * It returns a new quaternion that each value is the sum of \f$p_i\f$ and \f$q_i\f$. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * std::cout << p + q << std::endl; //[6, 8, 10, 12] + * ``` + */ + Quat<_Tp> operator+(const Quat<_Tp>&) const; + + /** + * @brief Addition assignment operator of two quaternions p and q. + * It adds right operand to the left operand and assign the result to left operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * p += q; // equivalent to p = p + q + * std::cout << p << std::endl; //[6, 8, 10, 12] + * + * ``` + */ + Quat<_Tp>& operator+=(const Quat<_Tp>&); + + /** + * @brief Subtraction operator of two quaternions p and q. + * It returns a new quaternion that each value is the sum of \f$p_i\f$ and \f$-q_i\f$. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * std::cout << p - q << std::endl; //[-4, -4, -4, -4] + * ``` + */ + Quat<_Tp> operator-(const Quat<_Tp>&) const; + + /** + * @brief Subtraction assignment operator of two quaternions p and q. + * It subtracts right operand from the left operand and assign the result to left operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * p -= q; // equivalent to p = p - q + * std::cout << p << std::endl; //[-4, -4, -4, -4] + * + * ``` + */ + Quat<_Tp>& operator-=(const Quat<_Tp>&); + + /** + * @brief Multiplication assignment operator of two quaternions q and p. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of quaternion multiplication: + * \f[ + * \begin{equation} + * \begin{split} + * p * q &= [p_0, \boldsymbol{u}]*[q_0, \boldsymbol{v}]\\ + * &=[p_0q_0 - \boldsymbol{u}\cdot \boldsymbol{v}, p_0\boldsymbol{v} + q_0\boldsymbol{u}+ \boldsymbol{u}\times \boldsymbol{v}]. + * \end{split} + * \end{equation} + * \f] + * where \f$\cdot\f$ means dot product and \f$\times \f$ means cross product. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * p *= q; // equivalent to p = p * q + * std::cout << p << std::endl; //[-60, 12, 30, 24] + * ``` + */ + Quat<_Tp>& operator*=(const Quat<_Tp>&); + + /** + * @brief Multiplication assignment operator of a quaternions and a scalar. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z] * s\\ + * &=[w * s, x * s, y * s, z * s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double s = 2.0; + * p *= s; // equivalent to p = p * s + * std::cout << p << std::endl; //[2.0, 4.0, 6.0, 8.0] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + Quat<_Tp>& operator*=(const _Tp s); + + /** + * @brief Multiplication operator of two quaternions q and p. + * Multiplies values on either side of the operator. + * + * Rule of quaternion multiplication: + * \f[ + * \begin{equation} + * \begin{split} + * p * q &= [p_0, \boldsymbol{u}]*[q_0, \boldsymbol{v}]\\ + * &=[p_0q_0 - \boldsymbol{u}\cdot \boldsymbol{v}, p_0\boldsymbol{v} + q_0\boldsymbol{u}+ \boldsymbol{u}\times \boldsymbol{v}]. + * \end{split} + * \end{equation} + * \f] + * where \f$\cdot\f$ means dot product and \f$\times \f$ means cross product. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * std::cout << p * q << std::endl; //[-60, 12, 30, 24] + * ``` + */ + Quat<_Tp> operator*(const Quat<_Tp>&) const; + + /** + * @brief Division operator of a quaternions and a scalar. + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of quaternion division with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p / s &= [w, x, y, z] / s\\ + * &=[w/s, x/s, y/s, z/s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double s = 2.0; + * p /= s; // equivalent to p = p / s + * std::cout << p << std::endl; //[0.5, 1, 1.5, 2] + * ``` + * @note the type of scalar should be equal to this quaternion. + */ + Quat<_Tp> operator/(const _Tp s) const; + + /** + * @brief Division operator of two quaternions p and q. + * Divides left hand operand by right hand operand. + * + * Rule of quaternion division with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p / q &= p * q.inv()\\ + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * std::cout << p / q << std::endl; // equivalent to p * q.inv() + * ``` + */ + Quat<_Tp> operator/(const Quat<_Tp>&) const; + + /** + * @brief Division assignment operator of a quaternions and a scalar. + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of quaternion division with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p / s &= [w, x, y, z] / s\\ + * &=[w / s, x / s, y / s, z / s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double s = 2.0;; + * p /= s; // equivalent to p = p / s + * std::cout << p << std::endl; //[0.5, 1.0, 1.5, 2.0] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + Quat<_Tp>& operator/=(const _Tp s); + + /** + * @brief Division assignment operator of two quaternions p and q; + * It divides left operand with the right operand and assign the result to left operand. + * + * Rule of quaternion division with a quaternion: + * \f[ + * \begin{equation} + * \begin{split} + * p / q&= p * q.inv()\\ + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * Quatd q{5, 6, 7, 8}; + * p /= q; // equivalent to p = p * q.inv() + * std::cout << p << std::endl; + * ``` + */ + Quat<_Tp>& operator/=(const Quat<_Tp>&); + + _Tp& operator[](std::size_t n); + + const _Tp& operator[](std::size_t n) const; + + /** + * @brief Subtraction operator of a scalar and a quaternions. + * Subtracts right hand operand from left hand operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double scalar = 2.0; + * std::cout << scalar - p << std::endl; //[1.0, -2, -3, -4] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator-(const T s, const Quat&); + + /** + * @brief Subtraction operator of a quaternions and a scalar. + * Subtracts right hand operand from left hand operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double scalar = 2.0; + * std::cout << p - scalar << std::endl; //[-1.0, 2, 3, 4] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator-(const Quat&, const T s); + + /** + * @brief Addition operator of a quaternions and a scalar. + * Adds right hand operand from left hand operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double scalar = 2.0; + * std::cout << scalar + p << std::endl; //[3.0, 2, 3, 4] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator+(const T s, const Quat&); + + /** + * @brief Addition operator of a quaternions and a scalar. + * Adds right hand operand from left hand operand. + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double scalar = 2.0; + * std::cout << p + scalar << std::endl; //[3.0, 2, 3, 4] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator+(const Quat&, const T s); + + /** + * @brief Multiplication operator of a scalar and a quaternions. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z] * s\\ + * &=[w * s, x * s, y * s, z * s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double s = 2.0; + * std::cout << s * p << std::endl; //[2.0, 4.0, 6.0, 8.0] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator*(const T s, const Quat&); + + /** + * @brief Multiplication operator of a quaternion and a scalar. + * It multiplies right operand with the left operand and assign the result to left operand. + * + * Rule of quaternion multiplication with a scalar: + * \f[ + * \begin{equation} + * \begin{split} + * p * s &= [w, x, y, z] * s\\ + * &=[w * s, x * s, y * s, z * s]. + * \end{split} + * \end{equation} + * \f] + * + * For example + * ``` + * Quatd p{1, 2, 3, 4}; + * double s = 2.0; + * std::cout << p * s << std::endl; //[2.0, 4.0, 6.0, 8.0] + * ``` + * @note the type of scalar should be equal to the quaternion. + */ + template + friend Quat cv::operator*(const Quat&, const T s); + + template + friend std::ostream& cv::operator<<(std::ostream&, const Quat&); + + /** + * @brief Transform a quaternion q to Euler angles. + * + * + * When transforming a quaternion \f$q = w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\f$ to Euler angles, rotation matrix M can be calculated by: + * \f[ \begin{aligned} {M} &={\begin{bmatrix}1-2(y^{2}+z^{2})&2(xy-zx)&2(xz+yw)\\2(xy+zw)&1-2(x^{2}+z^{2})&2(yz-xw)\\2(xz-yw)&2(yz+xw)&1-2(x^{2}+y^{2})\end{bmatrix}}\end{aligned}.\f] + * On the other hand, the rotation matrix can be obtained from Euler angles. + * Using intrinsic rotations with Euler angles type XYZ as an example, + * \f$\theta_1 \f$, \f$\theta_2 \f$, \f$\theta_3 \f$ are three angles for Euler angles, the rotation matrix R can be calculated by:\f[R =X(\theta_1)Y(\theta_2)Z(\theta_3) + * ={\begin{bmatrix}\cos\theta_{2}\cos\theta_{3}&-\cos\theta_{2}\sin\theta_{3}&\sin\theta_{2}\\\cos\theta_{1}\sin\theta_{3}+\cos\theta_{3}\sin\theta_{1}\sin\theta_{2}&\cos\theta_{1}\cos\theta_{3}-\sin\theta_{1}\sin\theta_{2}\sin\theta_{3}&-\cos\theta_{2}\sin\theta_{1}\\\sin\theta_{1}\sin\theta_{3}-\cos\theta_{1}\cos\theta_{3}\sin\theta_{2}&\cos\theta_{3}\sin\theta_{1}+\cos\theta_{1}\sin\theta_{2}\sin\theta_{3}&\cos\theta_{1}\cos_{2}\end{bmatrix}}\f] + * Rotation matrix M and R are equal. As long as \f$ s_{2} \neq 1 \f$, by comparing each element of two matrices ,the solution is\f$\begin{cases} \theta_1 = \arctan2(-m_{23},m_{33})\\\theta_2 = arcsin(m_{13}) \\\theta_3 = \arctan2(-m_{12},m_{11}) \end{cases}\f$. + * + * When \f$ s_{2}=1\f$ or \f$ s_{2}=-1\f$, the gimbal lock occurs. The function will prompt "WARNING: Gimbal Lock will occur. Euler angles is non-unique. For intrinsic rotations, we set the third angle to 0, and for external rotation, we set the first angle to 0.". + * + * When \f$ s_{2}=1\f$ , + * The rotation matrix R is \f$R = {\begin{bmatrix}0&0&1\\\sin(\theta_1+\theta_3)&\cos(\theta_1+\theta_3)&0\\-\cos(\theta_1+\theta_3)&\sin(\theta_1+\theta_3)&0\end{bmatrix}}\f$. + * + * The number of solutions is infinite with the condition \f$\begin{cases} \theta_1+\theta_3 = \arctan2(m_{21},m_{22})\\ \theta_2=\pi/2 \end{cases}\ \f$. + * + * We set \f$ \theta_3 = 0\f$, the solution is \f$\begin{cases} \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \end{cases}\f$. + * + * When \f$ s_{2}=-1\f$, + * The rotation matrix R is \f$X_{1}Y_{2}Z_{3}={\begin{bmatrix}0&0&-1\\-\sin(\theta_1-\theta_3)&\cos(\theta_1-\theta_3)&0\\\cos(\theta_1-\theta_3)&\sin(\theta_1-\theta_3)&0\end{bmatrix}}\f$. + * + * The number of solutions is infinite with the condition \f$\begin{cases} \theta_1+\theta_3 = \arctan2(m_{32},m_{22})\\ \theta_2=\pi/2 \end{cases}\ \f$. + * + * We set \f$ \theta_3 = 0\f$, the solution is \f$ \begin{cases}\theta_1=\arctan2(m_{32},m_{22}) \\ \theta_2=-\pi/2\\ \theta_3=0\end{cases}\f$. + * + * Since \f$ sin \theta\in [-1,1] \f$ and \f$ cos \theta \in [-1,1] \f$, the unnormalized quaternion will cause computational troubles. For this reason, this function will normalize the quaternion at first and @ref QuatAssumeType is not needed. + * + * When the gimbal lock occurs, we set \f$\theta_3 = 0\f$ for intrinsic rotations or \f$\theta_1 = 0\f$ for extrinsic rotations. + * + * As a result, for every Euler angles type, we can get solution as shown in the following table. + * EulerAnglesType | Ordinary | \f$\theta_2 = Ï€/2\f$ | \f$\theta_2 = -Ï€/2\f$ + * ------------- | -------------| -------------| ------------- + * INT_XYZ|\f$ \theta_1 = \arctan2(-m_{23},m_{33})\\\theta_2 = \arcsin(m_{13}) \\\theta_3= \arctan2(-m_{12},m_{11}) \f$|\f$ \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(m_{32},m_{22})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * INT_XZY|\f$ \theta_1 = \arctan2(m_{32},m_{22})\\\theta_2 = -\arcsin(m_{12}) \\\theta_3= \arctan2(m_{13},m_{11}) \f$|\f$ \theta_1=\arctan2(m_{31},m_{33})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(-m_{23},m_{33})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * INT_YXZ|\f$ \theta_1 = \arctan2(m_{13},m_{33})\\\theta_2 = -\arcsin(m_{23}) \\\theta_3= \arctan2(m_{21},m_{22}) \f$|\f$ \theta_1=\arctan2(m_{12},m_{11})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(-m_{12},m_{11})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * INT_YZX|\f$ \theta_1 = \arctan2(-m_{31},m_{11})\\\theta_2 = \arcsin(m_{21}) \\\theta_3= \arctan2(-m_{23},m_{22}) \f$|\f$ \theta_1=\arctan2(m_{13},m_{33})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(m_{13},m_{12})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * INT_ZXY|\f$ \theta_1 = \arctan2(-m_{12},m_{22})\\\theta_2 = \arcsin(m_{32}) \\\theta_3= \arctan2(-m_{31},m_{33}) \f$|\f$ \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * INT_ZYX|\f$ \theta_1 = \arctan2(m_{21},m_{11})\\\theta_2 = \arcsin(-m_{31}) \\\theta_3= \arctan2(m_{32},m_{33}) \f$|\f$ \theta_1=\arctan2(m_{23},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \f$|\f$ \theta_1=\arctan2(-m_{12},m_{22})\\ \theta_2=-\pi/2\\ \theta_3=0 \f$ + * EXT_XYZ|\f$ \theta_1 = \arctan2(m_{32},m_{33})\\\theta_2 = \arcsin(-m_{31}) \\\ \theta_3 = \arctan2(m_{21},m_{11})\f$|\f$ \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{23},m_{22}) \f$|\f$ \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{12},m_{22}) \f$ + * EXT_XZY|\f$ \theta_1 = \arctan2(-m_{23},m_{22})\\\theta_2 = \arcsin(m_{21}) \\\theta_3= \arctan2(-m_{31},m_{11})\f$|\f$ \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{13},m_{33}) \f$|\f$ \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{13},m_{12}) \f$ + * EXT_YXZ|\f$ \theta_1 = \arctan2(-m_{31},m_{33}) \\\theta_2 = \arcsin(m_{32}) \\\theta_3= \arctan2(-m_{12},m_{22})\f$|\f$ \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{21},m_{11}) \f$|\f$ \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{21},m_{11}) \f$ + * EXT_YZX|\f$ \theta_1 = \arctan2(m_{13},m_{11})\\\theta_2 = -\arcsin(m_{12}) \\\theta_3= \arctan2(m_{32},m_{22})\f$|\f$ \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{31},m_{33}) \f$|\f$ \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{23},m_{33}) \f$ + * EXT_ZXY|\f$ \theta_1 = \arctan2(m_{21},m_{22})\\\theta_2 = -\arcsin(m_{23}) \\\theta_3= \arctan2(m_{13},m_{33})\f$|\f$ \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{12},m_{11}) \f$|\f$ \theta_1= 0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{12},m_{11}) \f$ + * EXT_ZYX|\f$ \theta_1 = \arctan2(-m_{12},m_{11})\\\theta_2 = \arcsin(m_{13}) \\\theta_3= \arctan2(-m_{23},m_{33})\f$|\f$ \theta_1=0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{21},m_{22}) \f$|\f$ \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{32},m_{22}) \f$ + * + * EulerAnglesType | Ordinary | \f$\theta_2 = 0\f$ | \f$\theta_2 = Ï€\f$ + * ------------- | -------------| -------------| ------------- + * INT_XYX| \f$ \theta_1 = \arctan2(m_{21},-m_{31})\\\theta_2 =\arccos(m_{11}) \\\theta_3 = \arctan2(m_{12},m_{13}) \f$| \f$ \theta_1=\arctan2(m_{32},m_{33})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(m_{23},m_{22})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * INT_XZX| \f$ \theta_1 = \arctan2(m_{31},m_{21})\\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{13},-m_{12}) \f$| \f$ \theta_1=\arctan2(m_{32},m_{33})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(-m_{32},m_{33})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * INT_YXY| \f$ \theta_1 = \arctan2(m_{12},m_{32})\\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{21},-m_{23}) \f$| \f$ \theta_1=\arctan2(m_{13},m_{11})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(-m_{31},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * INT_YZY| \f$ \theta_1 = \arctan2(m_{32},-m_{12})\\\theta_2 = \arccos(m_{22}) \\\theta_3 =\arctan2(m_{23},m_{21}) \f$| \f$ \theta_1=\arctan2(m_{13},m_{11})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(m_{13},-m_{11})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * INT_ZXZ| \f$ \theta_1 = \arctan2(-m_{13},m_{23})\\\theta_2 = \arccos(m_{33}) \\\theta_3 =\arctan2(m_{31},m_{32}) \f$| \f$ \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * INT_ZYZ| \f$ \theta_1 = \arctan2(m_{23},m_{13})\\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(m_{32},-m_{31}) \f$| \f$ \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=0\\ \theta_3=0 \f$| \f$ \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \f$ + * EXT_XYX| \f$ \theta_1 = \arctan2(m_{12},m_{13}) \\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{21},-m_{31})\f$| \f$ \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{32},m_{33}) \f$| \f$ \theta_1= 0\\ \theta_2=\pi\\ \theta_3= \arctan2(m_{23},m_{22}) \f$ + * EXT_XZX| \f$ \theta_1 = \arctan2(m_{13},-m_{12})\\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{31},m_{21})\f$| \f$ \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{32},m_{33}) \f$| \f$ \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(-m_{32},m_{33}) \f$ + * EXT_YXY| \f$ \theta_1 = \arctan2(m_{21},-m_{23})\\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{12},m_{32}) \f$| \f$ \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{13},m_{11}) \f$| \f$ \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(-m_{31},m_{11}) \f$ + * EXT_YZY| \f$ \theta_1 = \arctan2(m_{23},m_{21}) \\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{32},-m_{12}) \f$| \f$ \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{13},m_{11}) \f$| \f$ \theta_1=0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{13},-m_{11}) \f$ + * EXT_ZXZ| \f$ \theta_1 = \arctan2(m_{31},m_{32}) \\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(-m_{13},m_{23})\f$| \f$ \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{21},m_{22}) \f$| \f$ \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{21},m_{11}) \f$ + * EXT_ZYZ| \f$ \theta_1 = \arctan2(m_{32},-m_{31})\\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(m_{23},m_{13}) \f$| \f$ \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{21},m_{11}) \f$| \f$ \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{21},m_{11}) \f$ + * + * @param eulerAnglesType the convertion Euler angles type + */ + + Vec<_Tp, 3> toEulerAngles(QuatEnum::EulerAnglesType eulerAnglesType); + + _Tp w, x, y, z; + +}; + +template +Quat inv(const Quat &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + +template +Quat sinh(const Quat &q); + +template +Quat cosh(const Quat &q); + +template +Quat tanh(const Quat &q); + +template +Quat sin(const Quat &q); + +template +Quat cos(const Quat &q); + +template +Quat tan(const Quat &q); + +template +Quat asinh(const Quat &q); + +template +Quat acosh(const Quat &q); + +template +Quat atanh(const Quat &q); + +template +Quat asin(const Quat &q); + +template +Quat acos(const Quat &q); + +template +Quat atan(const Quat &q); + +template +Quat power(const Quat &q, const Quat &p, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + +template +Quat exp(const Quat &q); + +template +Quat log(const Quat &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + +template +Quat power(const Quat& q, const T x, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + +template +Quat crossProduct(const Quat &p, const Quat &q); + +template +Quat sqrt(const Quat &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT); + +template +Quat operator*(const T, const Quat&); + +template +Quat operator*(const Quat&, const T); + +template +std::ostream& operator<<(std::ostream&, const Quat&); + +using Quatd = Quat; +using Quatf = Quat; + +//! @} core +} + +#include "opencv2/core/quaternion.inl.hpp" + +#endif /* OPENCV_CORE_QUATERNION_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/quaternion.inl.hpp b/Thirdparty/opencv2/include/opencv2/core/quaternion.inl.hpp new file mode 100644 index 0000000..b901ecb --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/quaternion.inl.hpp @@ -0,0 +1,1063 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2020, Huawei Technologies Co., Ltd. All rights reserved. +// Third party copyrights are property of their respective owners. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Liangqian Kong +// Longbu Wang + +#ifndef OPENCV_CORE_QUATERNION_INL_HPP +#define OPENCV_CORE_QUATERNION_INL_HPP + +#ifndef OPENCV_CORE_QUATERNION_HPP +#erorr This is not a standalone header. Include quaternion.hpp instead. +#endif + +//@cond IGNORE +/////////////////////////////////////////////////////////////////////////////////////// +//Implementation +namespace cv { + +template +Quat::Quat() : w(0), x(0), y(0), z(0) {} + +template +Quat::Quat(const Vec &coeff):w(coeff[0]), x(coeff[1]), y(coeff[2]), z(coeff[3]){} + +template +Quat::Quat(const T qw, const T qx, const T qy, const T qz):w(qw), x(qx), y(qy), z(qz){} + +template +Quat Quat::createFromAngleAxis(const T angle, const Vec &axis) +{ + T w, x, y, z; + T vNorm = std::sqrt(axis.dot(axis)); + if (vNorm < CV_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "this quaternion does not represent a rotation"); + } + const T angle_half = angle * T(0.5); + w = std::cos(angle_half); + const T sin_v = std::sin(angle_half); + const T sin_norm = sin_v / vNorm; + x = sin_norm * axis[0]; + y = sin_norm * axis[1]; + z = sin_norm * axis[2]; + return Quat(w, x, y, z); +} + +template +Quat Quat::createFromRotMat(InputArray _R) +{ + CV_CheckTypeEQ(_R.type(), cv::traits::Type::value, ""); + if (_R.rows() != 3 || _R.cols() != 3) + { + CV_Error(Error::StsBadArg, "Cannot convert matrix to quaternion: rotation matrix should be a 3x3 matrix"); + } + Matx R; + _R.copyTo(R); + + T S, w, x, y, z; + T trace = R(0, 0) + R(1, 1) + R(2, 2); + if (trace > 0) + { + S = std::sqrt(trace + 1) * T(2); + x = (R(1, 2) - R(2, 1)) / S; + y = (R(2, 0) - R(0, 2)) / S; + z = (R(0, 1) - R(1, 0)) / S; + w = -T(0.25) * S; + } + else if (R(0, 0) > R(1, 1) && R(0, 0) > R(2, 2)) + { + + S = std::sqrt(T(1.0) + R(0, 0) - R(1, 1) - R(2, 2)) * T(2); + x = -T(0.25) * S; + y = -(R(1, 0) + R(0, 1)) / S; + z = -(R(0, 2) + R(2, 0)) / S; + w = (R(1, 2) - R(2, 1)) / S; + } + else if (R(1, 1) > R(2, 2)) + { + S = std::sqrt(T(1.0) - R(0, 0) + R(1, 1) - R(2, 2)) * T(2); + x = (R(0, 1) + R(1, 0)) / S; + y = T(0.25) * S; + z = (R(1, 2) + R(2, 1)) / S; + w = (R(0, 2) - R(2, 0)) / S; + } + else + { + S = std::sqrt(T(1.0) - R(0, 0) - R(1, 1) + R(2, 2)) * T(2); + x = (R(0, 2) + R(2, 0)) / S; + y = (R(1, 2) + R(2, 1)) / S; + z = T(0.25) * S; + w = -(R(0, 1) - R(1, 0)) / S; + } + return Quat (w, x, y, z); +} + +template +Quat Quat::createFromRvec(InputArray _rvec) +{ + if (!((_rvec.cols() == 1 && _rvec.rows() == 3) || (_rvec.cols() == 3 && _rvec.rows() == 1))) { + CV_Error(Error::StsBadArg, "Cannot convert rotation vector to quaternion: The length of rotation vector should be 3"); + } + Vec rvec; + _rvec.copyTo(rvec); + T psi = std::sqrt(rvec.dot(rvec)); + if (abs(psi) < CV_QUAT_EPS) { + return Quat (1, 0, 0, 0); + } + Vec axis = rvec / psi; + return createFromAngleAxis(psi, axis); +} + +template +inline Quat Quat::operator-() const +{ + return Quat(-w, -x, -y, -z); +} + + +template +inline bool Quat::operator==(const Quat &q) const +{ + return (abs(w - q.w) < CV_QUAT_EPS && abs(x - q.x) < CV_QUAT_EPS && abs(y - q.y) < CV_QUAT_EPS && abs(z - q.z) < CV_QUAT_EPS); +} + +template +inline Quat Quat::operator+(const Quat &q1) const +{ + return Quat(w + q1.w, x + q1.x, y + q1.y, z + q1.z); +} + +template +inline Quat operator+(const T a, const Quat& q) +{ + return Quat(q.w + a, q.x, q.y, q.z); +} + +template +inline Quat operator+(const Quat& q, const T a) +{ + return Quat(q.w + a, q.x, q.y, q.z); +} + +template +inline Quat operator-(const T a, const Quat& q) +{ + return Quat(a - q.w, -q.x, -q.y, -q.z); +} + +template +inline Quat operator-(const Quat& q, const T a) +{ + return Quat(q.w - a, q.x, q.y, q.z); +} + +template +inline Quat Quat::operator-(const Quat &q1) const +{ + return Quat(w - q1.w, x - q1.x, y - q1.y, z - q1.z); +} + +template +inline Quat& Quat::operator+=(const Quat &q1) +{ + w += q1.w; + x += q1.x; + y += q1.y; + z += q1.z; + return *this; +} + +template +inline Quat& Quat::operator-=(const Quat &q1) +{ + w -= q1.w; + x -= q1.x; + y -= q1.y; + z -= q1.z; + return *this; +} + +template +inline Quat Quat::operator*(const Quat &q1) const +{ + Vec q{w, x, y, z}; + Vec q2{q1.w, q1.x, q1.y, q1.z}; + return Quat(q * q2); +} + + +template +Quat operator*(const Quat &q1, const T a) +{ + return Quat(a * q1.w, a * q1.x, a * q1.y, a * q1.z); +} + +template +Quat operator*(const T a, const Quat &q1) +{ + return Quat(a * q1.w, a * q1.x, a * q1.y, a * q1.z); +} + +template +inline Quat& Quat::operator*=(const Quat &q1) +{ + T qw, qx, qy, qz; + qw = w * q1.w - x * q1.x - y * q1.y - z * q1.z; + qx = x * q1.w + w * q1.x + y * q1.z - z * q1.y; + qy = y * q1.w + w * q1.y + z * q1.x - x * q1.z; + qz = z * q1.w + w * q1.z + x * q1.y - y * q1.x; + w = qw; + x = qx; + y = qy; + z = qz; + return *this; +} + +template +inline Quat& Quat::operator/=(const Quat &q1) +{ + Quat q(*this * q1.inv()); + w = q.w; + x = q.x; + y = q.y; + z = q.z; + return *this; +} +template +Quat& Quat::operator*=(const T q1) +{ + w *= q1; + x *= q1; + y *= q1; + z *= q1; + return *this; +} + +template +inline Quat& Quat::operator/=(const T a) +{ + const T a_inv = 1.0 / a; + w *= a_inv; + x *= a_inv; + y *= a_inv; + z *= a_inv; + return *this; +} + +template +inline Quat Quat::operator/(const T a) const +{ + const T a_inv = T(1.0) / a; + return Quat(w * a_inv, x * a_inv, y * a_inv, z * a_inv); +} + +template +inline Quat Quat::operator/(const Quat &q) const +{ + return *this * q.inv(); +} + +template +inline const T& Quat::operator[](std::size_t n) const +{ + switch (n) { + case 0: + return w; + case 1: + return x; + case 2: + return y; + case 3: + return z; + default: + CV_Error(Error::StsOutOfRange, "subscript exceeds the index range"); + } +} + +template +inline T& Quat::operator[](std::size_t n) +{ + switch (n) { + case 0: + return w; + case 1: + return x; + case 2: + return y; + case 3: + return z; + default: + CV_Error(Error::StsOutOfRange, "subscript exceeds the index range"); + } +} + +template +std::ostream & operator<<(std::ostream &os, const Quat &q) +{ + os << "Quat " << Vec{q.w, q.x, q.y, q.z}; + return os; +} + +template +inline T Quat::at(size_t index) const +{ + return (*this)[index]; +} + +template +inline Quat Quat::conjugate() const +{ + return Quat(w, -x, -y, -z); +} + +template +inline T Quat::norm() const +{ + return std::sqrt(dot(*this)); +} + +template +Quat exp(const Quat &q) +{ + return q.exp(); +} + +template +Quat Quat::exp() const +{ + Vec v{x, y, z}; + T normV = std::sqrt(v.dot(v)); + T k = normV < CV_QUAT_EPS ? 1 : std::sin(normV) / normV; + return std::exp(w) * Quat(std::cos(normV), v[0] * k, v[1] * k, v[2] * k); +} + +template +Quat log(const Quat &q, QuatAssumeType assumeUnit) +{ + return q.log(assumeUnit); +} + +template +Quat Quat::log(QuatAssumeType assumeUnit) const +{ + Vec v{x, y, z}; + T vNorm = std::sqrt(v.dot(v)); + if (assumeUnit) + { + T k = vNorm < CV_QUAT_EPS ? 1 : std::acos(w) / vNorm; + return Quat(0, v[0] * k, v[1] * k, v[2] * k); + } + T qNorm = norm(); + if (qNorm < CV_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "Cannot apply this quaternion to log function: undefined"); + } + T k = vNorm < CV_QUAT_EPS ? 1 : std::acos(w / qNorm) / vNorm; + return Quat(std::log(qNorm), v[0] * k, v[1] * k, v[2] *k); +} + +template +inline Quat power(const Quat &q1, const T alpha, QuatAssumeType assumeUnit) +{ + return q1.power(alpha, assumeUnit); +} + +template +inline Quat Quat::power(const T alpha, QuatAssumeType assumeUnit) const +{ + if (x * x + y * y + z * z > CV_QUAT_EPS) + { + T angle = getAngle(assumeUnit); + Vec axis = getAxis(assumeUnit); + if (assumeUnit) + { + return createFromAngleAxis(alpha * angle, axis); + } + return std::pow(norm(), alpha) * createFromAngleAxis(alpha * angle, axis); + } + else + { + return std::pow(norm(), alpha) * Quat(w, x, y, z); + } +} + + +template +inline Quat sqrt(const Quat &q, QuatAssumeType assumeUnit) +{ + return q.sqrt(assumeUnit); +} + +template +inline Quat Quat::sqrt(QuatAssumeType assumeUnit) const +{ + return power(0.5, assumeUnit); +} + + +template +inline Quat power(const Quat &p, const Quat &q, QuatAssumeType assumeUnit) +{ + return p.power(q, assumeUnit); +} + + +template +inline Quat Quat::power(const Quat &q, QuatAssumeType assumeUnit) const +{ + return cv::exp(q * log(assumeUnit)); +} + +template +inline T Quat::dot(Quat q1) const +{ + return w * q1.w + x * q1.x + y * q1.y + z * q1.z; +} + + +template +inline Quat crossProduct(const Quat &p, const Quat &q) +{ + return p.crossProduct(q); +} + + +template +inline Quat Quat::crossProduct(const Quat &q) const +{ + return Quat (0, y * q.z - z * q.y, z * q.x - x * q.z, x * q.y - q.x * y); +} + +template +inline Quat Quat::normalize() const +{ + T normVal = norm(); + if (normVal < CV_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "Cannot normalize this quaternion: the norm is too small."); + } + return Quat(w / normVal, x / normVal, y / normVal, z / normVal) ; +} + +template +inline Quat inv(const Quat &q, QuatAssumeType assumeUnit) +{ + return q.inv(assumeUnit); +} + + +template +inline Quat Quat::inv(QuatAssumeType assumeUnit) const +{ + if (assumeUnit) + { + return conjugate(); + } + T norm2 = dot(*this); + if (norm2 < CV_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "This quaternion do not have inverse quaternion"); + } + return conjugate() / norm2; +} + +template +inline Quat sinh(const Quat &q) +{ + return q.sinh(); +} + + +template +inline Quat Quat::sinh() const +{ + Vec v{x, y ,z}; + T vNorm = std::sqrt(v.dot(v)); + T k = vNorm < CV_QUAT_EPS ? 1 : std::cosh(w) * std::sin(vNorm) / vNorm; + return Quat(std::sinh(w) * std::cos(vNorm), v[0] * k, v[1] * k, v[2] * k); +} + + +template +inline Quat cosh(const Quat &q) +{ + return q.cosh(); +} + + +template +inline Quat Quat::cosh() const +{ + Vec v{x, y ,z}; + T vNorm = std::sqrt(v.dot(v)); + T k = vNorm < CV_QUAT_EPS ? 1 : std::sinh(w) * std::sin(vNorm) / vNorm; + return Quat(std::cosh(w) * std::cos(vNorm), v[0] * k, v[1] * k, v[2] * k); +} + +template +inline Quat tanh(const Quat &q) +{ + return q.tanh(); +} + +template +inline Quat Quat::tanh() const +{ + return sinh() * cosh().inv(); +} + + +template +inline Quat sin(const Quat &q) +{ + return q.sin(); +} + + +template +inline Quat Quat::sin() const +{ + Vec v{x, y ,z}; + T vNorm = std::sqrt(v.dot(v)); + T k = vNorm < CV_QUAT_EPS ? 1 : std::cos(w) * std::sinh(vNorm) / vNorm; + return Quat(std::sin(w) * std::cosh(vNorm), v[0] * k, v[1] * k, v[2] * k); +} + +template +inline Quat cos(const Quat &q) +{ + return q.cos(); +} + +template +inline Quat Quat::cos() const +{ + Vec v{x, y ,z}; + T vNorm = std::sqrt(v.dot(v)); + T k = vNorm < CV_QUAT_EPS ? 1 : std::sin(w) * std::sinh(vNorm) / vNorm; + return Quat(std::cos(w) * std::cosh(vNorm), -v[0] * k, -v[1] * k, -v[2] * k); +} + +template +inline Quat tan(const Quat &q) +{ + return q.tan(); +} + +template +inline Quat Quat::tan() const +{ + return sin() * cos().inv(); +} + +template +inline Quat asinh(const Quat &q) +{ + return q.asinh(); +} + +template +inline Quat Quat::asinh() const +{ + return cv::log(*this + cv::power(*this * *this + Quat(1, 0, 0, 0), 0.5)); +} + +template +inline Quat acosh(const Quat &q) +{ + return q.acosh(); +} + +template +inline Quat Quat::acosh() const +{ + return cv::log(*this + cv::power(*this * *this - Quat(1,0,0,0), 0.5)); +} + +template +inline Quat atanh(const Quat &q) +{ + return q.atanh(); +} + +template +inline Quat Quat::atanh() const +{ + Quat ident(1, 0, 0, 0); + Quat c1 = (ident + *this).log(); + Quat c2 = (ident - *this).log(); + return 0.5 * (c1 - c2); +} + +template +inline Quat asin(const Quat &q) +{ + return q.asin(); +} + +template +inline Quat Quat::asin() const +{ + Quat v(0, x, y, z); + T vNorm = v.norm(); + T k = vNorm < CV_QUAT_EPS ? 1 : vNorm; + return -v / k * (*this * v / k).asinh(); +} + +template +inline Quat acos(const Quat &q) +{ + return q.acos(); +} + +template +inline Quat Quat::acos() const +{ + Quat v(0, x, y, z); + T vNorm = v.norm(); + T k = vNorm < CV_QUAT_EPS ? 1 : vNorm; + return -v / k * acosh(); +} + +template +inline Quat atan(const Quat &q) +{ + return q.atan(); +} + +template +inline Quat Quat::atan() const +{ + Quat v(0, x, y, z); + T vNorm = v.norm(); + T k = vNorm < CV_QUAT_EPS ? 1 : vNorm; + return -v / k * (*this * v / k).atanh(); +} + +template +inline T Quat::getAngle(QuatAssumeType assumeUnit) const +{ + if (assumeUnit) + { + return 2 * std::acos(w); + } + if (norm() < CV_QUAT_EPS) + { + CV_Error(Error::StsBadArg, "This quaternion does not represent a rotation"); + } + return 2 * std::acos(w / norm()); +} + +template +inline Vec Quat::getAxis(QuatAssumeType assumeUnit) const +{ + T angle = getAngle(assumeUnit); + const T sin_v = std::sin(angle * 0.5); + if (assumeUnit) + { + return Vec{x, y, z} / sin_v; + } + return Vec {x, y, z} / (norm() * sin_v); +} + +template +Matx Quat::toRotMat4x4(QuatAssumeType assumeUnit) const +{ + T a = w, b = x, c = y, d = z; + if (!assumeUnit) + { + Quat qTemp = normalize(); + a = qTemp.w; + b = qTemp.x; + c = qTemp.y; + d = qTemp.z; + } + Matx R{ + 1 - 2 * (c * c + d * d), 2 * (b * c - a * d) , 2 * (b * d + a * c) , 0, + 2 * (b * c + a * d) , 1 - 2 * (b * b + d * d), 2 * (c * d - a * b) , 0, + 2 * (b * d - a * c) , 2 * (c * d + a * b) , 1 - 2 * (b * b + c * c), 0, + 0 , 0 , 0 , 1, + }; + return R; +} + +template +Matx Quat::toRotMat3x3(QuatAssumeType assumeUnit) const +{ + T a = w, b = x, c = y, d = z; + if (!assumeUnit) + { + Quat qTemp = normalize(); + a = qTemp.w; + b = qTemp.x; + c = qTemp.y; + d = qTemp.z; + } + Matx R{ + 1 - 2 * (c * c + d * d), 2 * (b * c - a * d) , 2 * (b * d + a * c), + 2 * (b * c + a * d) , 1 - 2 * (b * b + d * d), 2 * (c * d - a * b), + 2 * (b * d - a * c) , 2 * (c * d + a * b) , 1 - 2 * (b * b + c * c) + }; + return R; +} + +template +Vec Quat::toRotVec(QuatAssumeType assumeUnit) const +{ + T angle = getAngle(assumeUnit); + Vec axis = getAxis(assumeUnit); + return angle * axis; +} + +template +Vec Quat::toVec() const +{ + return Vec{w, x, y, z}; +} + +template +Quat Quat::lerp(const Quat &q0, const Quat &q1, const T t) +{ + return (1 - t) * q0 + t * q1; +} + +template +Quat Quat::slerp(const Quat &q0, const Quat &q1, const T t, QuatAssumeType assumeUnit, bool directChange) +{ + Quat v0(q0); + Quat v1(q1); + if (!assumeUnit) + { + v0 = v0.normalize(); + v1 = v1.normalize(); + } + T cosTheta = v0.dot(v1); + constexpr T DOT_THRESHOLD = 0.995; + if (std::abs(cosTheta) > DOT_THRESHOLD) + { + return nlerp(v0, v1, t, QUAT_ASSUME_UNIT); + } + + if (directChange && cosTheta < 0) + { + v0 = -v0; + cosTheta = -cosTheta; + } + T sinTheta = std::sqrt(1 - cosTheta * cosTheta); + T angle = atan2(sinTheta, cosTheta); + return (std::sin((1 - t) * angle) / (sinTheta) * v0 + std::sin(t * angle) / (sinTheta) * v1).normalize(); +} + + +template +inline Quat Quat::nlerp(const Quat &q0, const Quat &q1, const T t, QuatAssumeType assumeUnit) +{ + Quat v0(q0), v1(q1); + if (v1.dot(v0) < 0) + { + v0 = -v0; + } + if (assumeUnit) + { + return ((1 - t) * v0 + t * v1).normalize(); + } + v0 = v0.normalize(); + v1 = v1.normalize(); + return ((1 - t) * v0 + t * v1).normalize(); +} + + +template +inline bool Quat::isNormal(T eps) const +{ + + double normVar = norm(); + if ((normVar > 1 - eps) && (normVar < 1 + eps)) + return true; + return false; +} + +template +inline void Quat::assertNormal(T eps) const +{ + if (!isNormal(eps)) + CV_Error(Error::StsBadArg, "Quaternion should be normalized"); +} + + +template +inline Quat Quat::squad(const Quat &q0, const Quat &q1, + const Quat &q2, const Quat &q3, + const T t, QuatAssumeType assumeUnit, + bool directChange) +{ + Quat v0(q0), v1(q1), v2(q2), v3(q3); + if (!assumeUnit) + { + v0 = v0.normalize(); + v1 = v1.normalize(); + v2 = v2.normalize(); + v3 = v3.normalize(); + } + + Quat c0 = slerp(v0, v3, t, assumeUnit, directChange); + Quat c1 = slerp(v1, v2, t, assumeUnit, directChange); + return slerp(c0, c1, 2 * t * (1 - t), assumeUnit, directChange); +} + +template +Quat Quat::interPoint(const Quat &q0, const Quat &q1, + const Quat &q2, QuatAssumeType assumeUnit) +{ + Quat v0(q0), v1(q1), v2(q2); + if (!assumeUnit) + { + v0 = v0.normalize(); + v1 = v1.normalize(); + v2 = v2.normalize(); + } + return v1 * cv::exp(-(cv::log(v1.conjugate() * v0, assumeUnit) + (cv::log(v1.conjugate() * v2, assumeUnit))) / 4); +} + +template +Quat Quat::spline(const Quat &q0, const Quat &q1, const Quat &q2, const Quat &q3, const T t, QuatAssumeType assumeUnit) +{ + Quat v0(q0), v1(q1), v2(q2), v3(q3); + if (!assumeUnit) + { + v0 = v0.normalize(); + v1 = v1.normalize(); + v2 = v2.normalize(); + v3 = v3.normalize(); + } + T cosTheta; + std::vector> vec{v0, v1, v2, v3}; + for (size_t i = 0; i < 3; ++i) + { + cosTheta = vec[i].dot(vec[i + 1]); + if (cosTheta < 0) + { + vec[i + 1] = -vec[i + 1]; + } + } + Quat s1 = interPoint(vec[0], vec[1], vec[2], QUAT_ASSUME_UNIT); + Quat s2 = interPoint(vec[1], vec[2], vec[3], QUAT_ASSUME_UNIT); + return squad(vec[1], s1, s2, vec[2], t, assumeUnit, QUAT_ASSUME_NOT_UNIT); +} + +namespace detail { + +template static +Quat createFromAxisRot(int axis, const T theta) +{ + if (axis == 0) + return Quat::createFromXRot(theta); + if (axis == 1) + return Quat::createFromYRot(theta); + if (axis == 2) + return Quat::createFromZRot(theta); + CV_Assert(0); +} + +inline bool isIntAngleType(QuatEnum::EulerAnglesType eulerAnglesType) +{ + return eulerAnglesType < QuatEnum::EXT_XYZ; +} + +inline bool isTaitBryan(QuatEnum::EulerAnglesType eulerAnglesType) +{ + return eulerAnglesType/6 == 1 || eulerAnglesType/6 == 3; +} +} // namespace detail + +template +Quat Quat::createFromYRot(const T theta) +{ + return Quat{std::cos(theta * 0.5f), 0, std::sin(theta * 0.5f), 0}; +} + +template +Quat Quat::createFromXRot(const T theta){ + return Quat{std::cos(theta * 0.5f), std::sin(theta * 0.5f), 0, 0}; +} + +template +Quat Quat::createFromZRot(const T theta){ + return Quat{std::cos(theta * 0.5f), 0, 0, std::sin(theta * 0.5f)}; +} + + +template +Quat Quat::createFromEulerAngles(const Vec &angles, QuatEnum::EulerAnglesType eulerAnglesType) { + CV_Assert(eulerAnglesType < QuatEnum::EulerAnglesType::EULER_ANGLES_MAX_VALUE); + static const int rotationAxis[24][3] = { + {0, 1, 2}, ///< Intrinsic rotations with the Euler angles type X-Y-Z + {0, 2, 1}, ///< Intrinsic rotations with the Euler angles type X-Z-Y + {1, 0, 2}, ///< Intrinsic rotations with the Euler angles type Y-X-Z + {1, 2, 0}, ///< Intrinsic rotations with the Euler angles type Y-Z-X + {2, 0, 1}, ///< Intrinsic rotations with the Euler angles type Z-X-Y + {2, 1, 0}, ///< Intrinsic rotations with the Euler angles type Z-Y-X + {0, 1, 0}, ///< Intrinsic rotations with the Euler angles type X-Y-X + {0, 2, 0}, ///< Intrinsic rotations with the Euler angles type X-Z-X + {1, 0, 1}, ///< Intrinsic rotations with the Euler angles type Y-X-Y + {1, 2, 1}, ///< Intrinsic rotations with the Euler angles type Y-Z-Y + {2, 0, 2}, ///< Intrinsic rotations with the Euler angles type Z-X-Z + {2, 1, 2}, ///< Intrinsic rotations with the Euler angles type Z-Y-Z + {0, 1, 2}, ///< Extrinsic rotations with the Euler angles type X-Y-Z + {0, 2, 1}, ///< Extrinsic rotations with the Euler angles type X-Z-Y + {1, 0, 2}, ///< Extrinsic rotations with the Euler angles type Y-X-Z + {1, 2, 0}, ///< Extrinsic rotations with the Euler angles type Y-Z-X + {2, 0, 1}, ///< Extrinsic rotations with the Euler angles type Z-X-Y + {2, 1, 0}, ///< Extrinsic rotations with the Euler angles type Z-Y-X + {0, 1, 0}, ///< Extrinsic rotations with the Euler angles type X-Y-X + {0, 2, 0}, ///< Extrinsic rotations with the Euler angles type X-Z-X + {1, 0, 1}, ///< Extrinsic rotations with the Euler angles type Y-X-Y + {1, 2, 1}, ///< Extrinsic rotations with the Euler angles type Y-Z-Y + {2, 0, 2}, ///< Extrinsic rotations with the Euler angles type Z-X-Z + {2, 1, 2} ///< Extrinsic rotations with the Euler angles type Z-Y-Z + }; + Quat q1 = detail::createFromAxisRot(rotationAxis[eulerAnglesType][0], angles(0)); + Quat q2 = detail::createFromAxisRot(rotationAxis[eulerAnglesType][1], angles(1)); + Quat q3 = detail::createFromAxisRot(rotationAxis[eulerAnglesType][2], angles(2)); + if (detail::isIntAngleType(eulerAnglesType)) + { + return q1 * q2 * q3; + } + else // (!detail::isIntAngleType(eulerAnglesType)) + { + return q3 * q2 * q1; + } +} + +template +Vec Quat::toEulerAngles(QuatEnum::EulerAnglesType eulerAnglesType){ + CV_Assert(eulerAnglesType < QuatEnum::EulerAnglesType::EULER_ANGLES_MAX_VALUE); + Matx33d R = toRotMat3x3(); + enum { + C_ZERO, + C_PI, + C_PI_2, + N_CONSTANTS, + R_0_0 = N_CONSTANTS, R_0_1, R_0_2, + R_1_0, R_1_1, R_1_2, + R_2_0, R_2_1, R_2_2 + }; + static const T constants_[N_CONSTANTS] = { + 0, // C_ZERO + (T)CV_PI, // C_PI + (T)(CV_PI * 0.5) // C_PI_2, -C_PI_2 + }; + static const int rotationR_[24][12] = { + {+R_0_2, +R_1_0, +R_1_1, C_PI_2, +R_2_1, +R_1_1, -C_PI_2, -R_1_2, +R_2_2, +R_0_2, -R_0_1, +R_0_0}, // INT_XYZ + {+R_0_1, -R_1_2, +R_2_2, -C_PI_2, +R_2_0, +R_2_2, C_PI_2, +R_2_1, +R_1_1, -R_0_1, +R_0_2, +R_0_0}, // INT_XZY + {+R_1_2, -R_0_1, +R_0_0, -C_PI_2, +R_0_1, +R_0_0, C_PI_2, +R_0_2, +R_2_2, -R_1_2, +R_1_0, +R_1_1}, // INT_YXZ + {+R_1_0, +R_0_2, +R_2_2, C_PI_2, +R_0_2, +R_0_1, -C_PI_2, -R_2_0, +R_0_0, +R_1_0, -R_1_2, +R_1_1}, // INT_YZX + {+R_2_1, +R_1_0, +R_0_0, C_PI_2, +R_1_0, +R_0_0, -C_PI_2, -R_0_1, +R_1_1, +R_2_1, -R_2_0, +R_2_2}, // INT_ZXY + {+R_2_0, -R_0_1, +R_1_1, -C_PI_2, +R_1_2, +R_1_1, C_PI_2, +R_1_0, +R_0_0, -R_2_0, +R_2_1, +R_2_2}, // INT_ZYX + {+R_0_0, +R_2_1, +R_2_2, C_ZERO, +R_1_2, +R_1_1, C_PI, +R_1_0, -R_2_0, +R_0_0, +R_0_1, +R_0_2}, // INT_XYX + {+R_0_0, +R_2_1, +R_2_2, C_ZERO, -R_2_1, +R_2_2, C_PI, +R_2_0, +R_1_0, +R_0_0, +R_0_2, -R_0_1}, // INT_XZX + {+R_1_1, +R_0_2, +R_0_0, C_ZERO, -R_2_0, +R_0_0, C_PI, +R_0_1, +R_2_1, +R_1_1, +R_1_0, -R_1_2}, // INT_YXY + {+R_1_1, +R_0_2, +R_0_0, C_ZERO, +R_0_2, -R_0_0, C_PI, +R_2_1, -R_0_1, +R_1_1, +R_1_2, +R_1_0}, // INT_YZY + {+R_2_2, +R_1_0, +R_1_1, C_ZERO, +R_1_0, +R_0_0, C_PI, +R_0_2, -R_1_2, +R_2_2, +R_2_0, +R_2_1}, // INT_ZXZ + {+R_2_2, +R_1_0, +R_0_0, C_ZERO, +R_1_0, +R_0_0, C_PI, +R_1_2, +R_0_2, +R_2_2, +R_2_1, -R_2_0}, // INT_ZYZ + + {+R_2_0, -C_PI_2, -R_0_1, +R_1_1, C_PI_2, +R_1_2, +R_1_1, +R_2_1, +R_2_2, -R_2_0, +R_1_0, +R_0_0}, // EXT_XYZ + {+R_1_0, C_PI_2, +R_0_2, +R_2_2, -C_PI_2, +R_0_2, +R_0_1, -R_1_2, +R_1_1, +R_1_0, -R_2_0, +R_0_0}, // EXT_XZY + {+R_2_1, C_PI_2, +R_1_0, +R_0_0, -C_PI_2, +R_1_0, +R_0_0, -R_2_0, +R_2_2, +R_2_1, -R_0_1, +R_1_1}, // EXT_YXZ + {+R_0_2, -C_PI_2, -R_1_2, +R_2_2, C_PI_2, +R_2_0, +R_2_2, +R_0_2, +R_0_0, -R_0_1, +R_2_1, +R_1_1}, // EXT_YZX + {+R_1_2, -C_PI_2, -R_0_1, +R_0_0, C_PI_2, +R_0_1, +R_0_0, +R_1_0, +R_1_1, -R_1_2, +R_0_2, +R_2_2}, // EXT_ZXY + {+R_0_2, C_PI_2, +R_1_0, +R_1_1, -C_PI_2, +R_2_1, +R_1_1, -R_0_1, +R_0_0, +R_0_2, -R_1_2, +R_2_2}, // EXT_ZYX + {+R_0_0, C_ZERO, +R_2_1, +R_2_2, C_PI, +R_1_2, +R_1_1, +R_0_1, +R_0_2, +R_0_0, +R_1_0, -R_2_0}, // EXT_XYX + {+R_0_0, C_ZERO, +R_2_1, +R_2_2, C_PI, +R_2_1, +R_2_2, +R_0_2, -R_0_1, +R_0_0, +R_2_0, +R_1_0}, // EXT_XZX + {+R_1_1, C_ZERO, +R_0_2, +R_0_0, C_PI, -R_2_0, +R_0_0, +R_1_0, -R_1_2, +R_1_1, +R_0_1, +R_2_1}, // EXT_YXY + {+R_1_1, C_ZERO, +R_0_2, +R_0_0, C_PI, +R_0_2, -R_0_0, +R_1_2, +R_1_0, +R_1_1, +R_2_1, -R_0_1}, // EXT_YZY + {+R_2_2, C_ZERO, +R_1_0, +R_1_1, C_PI, +R_1_0, +R_0_0, +R_2_0, +R_2_1, +R_2_2, +R_0_2, -R_1_2}, // EXT_ZXZ + {+R_2_2, C_ZERO, +R_1_0, +R_0_0, C_PI, +R_1_0, +R_0_0, +R_2_1, -R_2_0, +R_2_2, +R_1_2, +R_0_2}, // EXT_ZYZ + }; + T rotationR[12]; + for (int i = 0; i < 12; i++) + { + int id = rotationR_[eulerAnglesType][i]; + unsigned idx = std::abs(id); + T value = 0.0f; + if (idx < N_CONSTANTS) + { + value = constants_[idx]; + } + else + { + unsigned r_idx = idx - N_CONSTANTS; + CV_DbgAssert(r_idx < 9); + value = R.val[r_idx]; + } + bool isNegative = id < 0; + if (isNegative) + value = -value; + rotationR[i] = value; + } + Vec angles; + if (detail::isIntAngleType(eulerAnglesType)) + { + if (abs(rotationR[0] - 1) < CV_QUAT_CONVERT_THRESHOLD) + { + CV_LOG_WARNING(NULL,"Gimbal Lock occurs. Euler angles are non-unique, we set the third angle to 0"); + angles = {std::atan2(rotationR[1], rotationR[2]), rotationR[3], 0}; + return angles; + } + else if(abs(rotationR[0] + 1) < CV_QUAT_CONVERT_THRESHOLD) + { + CV_LOG_WARNING(NULL,"Gimbal Lock occurs. Euler angles are non-unique, we set the third angle to 0"); + angles = {std::atan2(rotationR[4], rotationR[5]), rotationR[6], 0}; + return angles; + } + } + else // (!detail::isIntAngleType(eulerAnglesType)) + { + if (abs(rotationR[0] - 1) < CV_QUAT_CONVERT_THRESHOLD) + { + CV_LOG_WARNING(NULL,"Gimbal Lock occurs. Euler angles are non-unique, we set the first angle to 0"); + angles = {0, rotationR[1], std::atan2(rotationR[2], rotationR[3])}; + return angles; + } + else if (abs(rotationR[0] + 1) < CV_QUAT_CONVERT_THRESHOLD) + { + CV_LOG_WARNING(NULL,"Gimbal Lock occurs. Euler angles are non-unique, we set the first angle to 0"); + angles = {0, rotationR[4], std::atan2(rotationR[5], rotationR[6])}; + return angles; + } + } + + angles(0) = std::atan2(rotationR[7], rotationR[8]); + if (detail::isTaitBryan(eulerAnglesType)) + angles(1) = std::acos(rotationR[9]); + else + angles(1) = std::asin(rotationR[9]); + angles(2) = std::atan2(rotationR[10], rotationR[11]); + return angles; +} + +} // namepsace +//! @endcond + +#endif /*OPENCV_CORE_QUATERNION_INL_HPP*/ diff --git a/Thirdparty/opencv2/include/opencv2/core/saturate.hpp b/Thirdparty/opencv2/include/opencv2/core/saturate.hpp new file mode 100644 index 0000000..e0cc965 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/saturate.hpp @@ -0,0 +1,180 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2014, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_SATURATE_HPP +#define OPENCV_CORE_SATURATE_HPP + +#include "opencv2/core/cvdef.h" +#include +#include "opencv2/core/fast_math.hpp" + +namespace cv +{ + +//! @addtogroup core_utils +//! @{ + +/////////////// saturate_cast (used in image & signal processing) /////////////////// + +/** @brief Template function for accurate conversion from one primitive type to another. + + The function saturate_cast resembles the standard C++ cast operations, such as static_cast\() + and others. It perform an efficient and accurate conversion from one primitive type to another + (see the introduction chapter). saturate in the name means that when the input value v is out of the + range of the target type, the result is not formed just by taking low bits of the input, but instead + the value is clipped. For example: + @code + uchar a = saturate_cast(-100); // a = 0 (UCHAR_MIN) + short b = saturate_cast(33333.33333); // b = 32767 (SHRT_MAX) + @endcode + Such clipping is done when the target type is unsigned char , signed char , unsigned short or + signed short . For 32-bit integers, no clipping is done. + + When the parameter is a floating-point value and the target type is an integer (8-, 16- or 32-bit), + the floating-point value is first rounded to the nearest integer and then clipped if needed (when + the target type is 8- or 16-bit). + + @param v Function parameter. + @sa add, subtract, multiply, divide, Mat::convertTo + */ +template static inline _Tp saturate_cast(uchar v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(schar v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(ushort v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(short v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(unsigned v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(int v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(float v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(double v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(int64 v) { return _Tp(v); } +/** @overload */ +template static inline _Tp saturate_cast(uint64 v) { return _Tp(v); } + +template<> inline uchar saturate_cast(schar v) { return (uchar)std::max((int)v, 0); } +template<> inline uchar saturate_cast(ushort v) { return (uchar)std::min((unsigned)v, (unsigned)UCHAR_MAX); } +template<> inline uchar saturate_cast(int v) { return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); } +template<> inline uchar saturate_cast(short v) { return saturate_cast((int)v); } +template<> inline uchar saturate_cast(unsigned v) { return (uchar)std::min(v, (unsigned)UCHAR_MAX); } +template<> inline uchar saturate_cast(float v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline uchar saturate_cast(double v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline uchar saturate_cast(int64 v) { return (uchar)((uint64)v <= (uint64)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0); } +template<> inline uchar saturate_cast(uint64 v) { return (uchar)std::min(v, (uint64)UCHAR_MAX); } + +template<> inline schar saturate_cast(uchar v) { return (schar)std::min((int)v, SCHAR_MAX); } +template<> inline schar saturate_cast(ushort v) { return (schar)std::min((unsigned)v, (unsigned)SCHAR_MAX); } +template<> inline schar saturate_cast(int v) { return (schar)((unsigned)(v-SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); } +template<> inline schar saturate_cast(short v) { return saturate_cast((int)v); } +template<> inline schar saturate_cast(unsigned v) { return (schar)std::min(v, (unsigned)SCHAR_MAX); } +template<> inline schar saturate_cast(float v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline schar saturate_cast(double v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline schar saturate_cast(int64 v) { return (schar)((uint64)((int64)v-SCHAR_MIN) <= (uint64)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN); } +template<> inline schar saturate_cast(uint64 v) { return (schar)std::min(v, (uint64)SCHAR_MAX); } + +template<> inline ushort saturate_cast(schar v) { return (ushort)std::max((int)v, 0); } +template<> inline ushort saturate_cast(short v) { return (ushort)std::max((int)v, 0); } +template<> inline ushort saturate_cast(int v) { return (ushort)((unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); } +template<> inline ushort saturate_cast(unsigned v) { return (ushort)std::min(v, (unsigned)USHRT_MAX); } +template<> inline ushort saturate_cast(float v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline ushort saturate_cast(double v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline ushort saturate_cast(int64 v) { return (ushort)((uint64)v <= (uint64)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); } +template<> inline ushort saturate_cast(uint64 v) { return (ushort)std::min(v, (uint64)USHRT_MAX); } + +template<> inline short saturate_cast(ushort v) { return (short)std::min((int)v, SHRT_MAX); } +template<> inline short saturate_cast(int v) { return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); } +template<> inline short saturate_cast(unsigned v) { return (short)std::min(v, (unsigned)SHRT_MAX); } +template<> inline short saturate_cast(float v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline short saturate_cast(double v) { int iv = cvRound(v); return saturate_cast(iv); } +template<> inline short saturate_cast(int64 v) { return (short)((uint64)((int64)v - SHRT_MIN) <= (uint64)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); } +template<> inline short saturate_cast(uint64 v) { return (short)std::min(v, (uint64)SHRT_MAX); } + +template<> inline int saturate_cast(unsigned v) { return (int)std::min(v, (unsigned)INT_MAX); } +template<> inline int saturate_cast(int64 v) { return (int)((uint64)(v - INT_MIN) <= (uint64)UINT_MAX ? v : v > 0 ? INT_MAX : INT_MIN); } +template<> inline int saturate_cast(uint64 v) { return (int)std::min(v, (uint64)INT_MAX); } +template<> inline int saturate_cast(float v) { return cvRound(v); } +template<> inline int saturate_cast(double v) { return cvRound(v); } + +template<> inline unsigned saturate_cast(schar v) { return (unsigned)std::max(v, (schar)0); } +template<> inline unsigned saturate_cast(short v) { return (unsigned)std::max(v, (short)0); } +template<> inline unsigned saturate_cast(int v) { return (unsigned)std::max(v, (int)0); } +template<> inline unsigned saturate_cast(int64 v) { return (unsigned)((uint64)v <= (uint64)UINT_MAX ? v : v > 0 ? UINT_MAX : 0); } +template<> inline unsigned saturate_cast(uint64 v) { return (unsigned)std::min(v, (uint64)UINT_MAX); } +// we intentionally do not clip negative numbers, to make -1 become 0xffffffff etc. +template<> inline unsigned saturate_cast(float v) { return static_cast(cvRound(v)); } +template<> inline unsigned saturate_cast(double v) { return static_cast(cvRound(v)); } + +template<> inline uint64 saturate_cast(schar v) { return (uint64)std::max(v, (schar)0); } +template<> inline uint64 saturate_cast(short v) { return (uint64)std::max(v, (short)0); } +template<> inline uint64 saturate_cast(int v) { return (uint64)std::max(v, (int)0); } +template<> inline uint64 saturate_cast(int64 v) { return (uint64)std::max(v, (int64)0); } + +template<> inline int64 saturate_cast(uint64 v) { return (int64)std::min(v, (uint64)LLONG_MAX); } + +/** @overload */ +template static inline _Tp saturate_cast(float16_t v) { return saturate_cast<_Tp>((float)v); } + +// in theory, we could use a LUT for 8u/8s->16f conversion, +// but with hardware support for FP32->FP16 conversion the current approach is preferable +template<> inline float16_t saturate_cast(uchar v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(schar v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(ushort v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(short v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(unsigned v){ return float16_t((float)v); } +template<> inline float16_t saturate_cast(int v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(uint64 v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(int64 v) { return float16_t((float)v); } +template<> inline float16_t saturate_cast(float v) { return float16_t(v); } +template<> inline float16_t saturate_cast(double v) { return float16_t((float)v); } + +//! @} + +} // cv + +#endif // OPENCV_CORE_SATURATE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/simd_intrinsics.hpp b/Thirdparty/opencv2/include/opencv2/core/simd_intrinsics.hpp new file mode 100644 index 0000000..2658d92 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/simd_intrinsics.hpp @@ -0,0 +1,87 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_SIMD_INTRINSICS_HPP +#define OPENCV_CORE_SIMD_INTRINSICS_HPP + +/** +Helper header to support SIMD intrinsics (universal intrinsics) in user code. +Intrinsics documentation: https://docs.opencv.org/4.x/df/d91/group__core__hal__intrin.html + + +Checks of target CPU instruction set based on compiler definitions don't work well enough. +More reliable solutions require utilization of configuration systems (like CMake). + +So, probably you need to specify your own configuration. + +You can do that via CMake in this way: + add_definitions(/DOPENCV_SIMD_CONFIG_HEADER=opencv_simd_config_custom.hpp) +or + add_definitions(/DOPENCV_SIMD_CONFIG_INCLUDE_DIR=1) + +Additionally you may need to add include directory to your files: + include_directories("${CMAKE_CURRENT_LIST_DIR}/opencv_config_${MYTARGET}") + +These files can be pre-generated for target configurations of your application +or generated by CMake on the fly (use CMAKE_BINARY_DIR for that). + +Notes: +- H/W capability checks are still responsibility of your application +- runtime dispatching is not covered by this helper header +*/ + +#ifdef __OPENCV_BUILD +#error "Use core/hal/intrin.hpp during OpenCV build" +#endif + +#ifdef OPENCV_HAL_INTRIN_HPP +#error "core/simd_intrinsics.hpp must be included before core/hal/intrin.hpp" +#endif + +#include "opencv2/core/cvdef.h" + +#ifdef OPENCV_SIMD_CONFIG_HEADER +#include CVAUX_STR(OPENCV_SIMD_CONFIG_HEADER) +#elif defined(OPENCV_SIMD_CONFIG_INCLUDE_DIR) +#include "opencv_simd_config.hpp" // corresponding directory should be added via -I compiler parameter +#else // custom config headers + +#if (!defined(CV_AVX_512F) || !CV_AVX_512F) && (defined(__AVX512__) || defined(__AVX512F__)) +# include +# undef CV_AVX_512F +# define CV_AVX_512F 1 +# ifndef OPENCV_SIMD_DONT_ASSUME_SKX // Skylake-X with AVX-512F/CD/BW/DQ/VL +# undef CV_AVX512_SKX +# define CV_AVX512_SKX 1 +# undef CV_AVX_512CD +# define CV_AVX_512CD 1 +# undef CV_AVX_512BW +# define CV_AVX_512BW 1 +# undef CV_AVX_512DQ +# define CV_AVX_512DQ 1 +# undef CV_AVX_512VL +# define CV_AVX_512VL 1 +# endif +#endif // AVX512 + +// GCC/Clang: -mavx2 +// MSVC: /arch:AVX2 +#if defined __AVX2__ +# include +# undef CV_AVX2 +# define CV_AVX2 1 +# if defined __F16C__ +# undef CV_FP16 +# define CV_FP16 1 +# endif +#endif + +#endif + +// SSE / NEON / VSX is handled by cv_cpu_dispatch.h compatibility block +#include "cv_cpu_dispatch.h" + +#include "hal/intrin.hpp" + +#endif // OPENCV_CORE_SIMD_INTRINSICS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/softfloat.hpp b/Thirdparty/opencv2/include/opencv2/core/softfloat.hpp new file mode 100644 index 0000000..485e15c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/softfloat.hpp @@ -0,0 +1,514 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +// This file is based on files from package issued with the following license: + +/*============================================================================ + +This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic +Package, Release 3c, by John R. Hauser. + +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the +University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions, and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the University nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=============================================================================*/ + +#pragma once +#ifndef softfloat_h +#define softfloat_h 1 + +#include "cvdef.h" + +namespace cv +{ + +/** @addtogroup core_utils_softfloat + + [SoftFloat](http://www.jhauser.us/arithmetic/SoftFloat.html) is a software implementation + of floating-point calculations according to IEEE 754 standard. + All calculations are done in integers, that's why they are machine-independent and bit-exact. + This library can be useful in accuracy-critical parts like look-up tables generation, tests, etc. + OpenCV contains a subset of SoftFloat partially rewritten to C++. + + ### Types + + There are two basic types: @ref softfloat and @ref softdouble. + These types are binary compatible with float and double types respectively + and support conversions to/from them. + Other types from original SoftFloat library like fp16 or fp128 were thrown away + as well as quiet/signaling NaN support, on-the-fly rounding mode switch + and exception flags (though exceptions can be implemented in the future). + + ### Operations + + Both types support the following: + - Construction from signed and unsigned 32-bit and 64 integers, + float/double or raw binary representation + - Conversions between each other, to float or double and to int + using @ref cvRound, @ref cvTrunc, @ref cvFloor, @ref cvCeil or a bunch of + saturate_cast functions + - Add, subtract, multiply, divide, remainder, square root, FMA with absolute precision + - Comparison operations + - Explicit sign, exponent and significand manipulation through get/set methods, + number state indicators (isInf, isNan, isSubnormal) + - Type-specific constants like eps, minimum/maximum value, best pi approximation, etc. + - min(), max(), abs(), exp(), log() and pow() functions + +*/ +//! @{ + +struct softfloat; +struct softdouble; + +struct CV_EXPORTS softfloat +{ +public: + /** @brief Default constructor */ + softfloat() { v = 0; } + /** @brief Copy constructor */ + softfloat( const softfloat& c) { v = c.v; } + /** @brief Assign constructor */ + softfloat& operator=( const softfloat& c ) + { + if(&c != this) v = c.v; + return *this; + } + /** @brief Construct from raw + + Builds new value from raw binary representation + */ + static const softfloat fromRaw( const uint32_t a ) { softfloat x; x.v = a; return x; } + + /** @brief Construct from integer */ + explicit softfloat( const uint32_t ); + explicit softfloat( const uint64_t ); + explicit softfloat( const int32_t ); + explicit softfloat( const int64_t ); + +#ifdef CV_INT32_T_IS_LONG_INT + // for platforms with int32_t = long int + explicit softfloat( const int a ) { *this = softfloat(static_cast(a)); } +#endif + + /** @brief Construct from float */ + explicit softfloat( const float a ) { Cv32suf s; s.f = a; v = s.u; } + + /** @brief Type casts */ + operator softdouble() const; + operator float() const { Cv32suf s; s.u = v; return s.f; } + + /** @brief Basic arithmetics */ + softfloat operator + (const softfloat&) const; + softfloat operator - (const softfloat&) const; + softfloat operator * (const softfloat&) const; + softfloat operator / (const softfloat&) const; + softfloat operator - () const { softfloat x; x.v = v ^ (1U << 31); return x; } + + /** @brief Remainder operator + + A quote from original SoftFloat manual: + + > The IEEE Standard remainder operation computes the value + > a - n * b, where n is the integer closest to a / b. + > If a / b is exactly halfway between two integers, n is the even integer + > closest to a / b. The IEEE Standard’s remainder operation is always exact and so requires no rounding. + > Depending on the relative magnitudes of the operands, the remainder functions + > can take considerably longer to execute than the other SoftFloat functions. + > This is an inherent characteristic of the remainder operation itself and is not a flaw + > in the SoftFloat implementation. + */ + softfloat operator % (const softfloat&) const; + + softfloat& operator += (const softfloat& a) { *this = *this + a; return *this; } + softfloat& operator -= (const softfloat& a) { *this = *this - a; return *this; } + softfloat& operator *= (const softfloat& a) { *this = *this * a; return *this; } + softfloat& operator /= (const softfloat& a) { *this = *this / a; return *this; } + softfloat& operator %= (const softfloat& a) { *this = *this % a; return *this; } + + /** @brief Comparison operations + + - Any operation with NaN produces false + + The only exception is when x is NaN: x != y for any y. + - Positive and negative zeros are equal + */ + bool operator == ( const softfloat& ) const; + bool operator != ( const softfloat& ) const; + bool operator > ( const softfloat& ) const; + bool operator >= ( const softfloat& ) const; + bool operator < ( const softfloat& ) const; + bool operator <= ( const softfloat& ) const; + + /** @brief NaN state indicator */ + inline bool isNaN() const { return (v & 0x7fffffff) > 0x7f800000; } + /** @brief Inf state indicator */ + inline bool isInf() const { return (v & 0x7fffffff) == 0x7f800000; } + /** @brief Subnormal number indicator */ + inline bool isSubnormal() const { return ((v >> 23) & 0xFF) == 0; } + + /** @brief Get sign bit */ + inline bool getSign() const { return (v >> 31) != 0; } + /** @brief Construct a copy with new sign bit */ + inline softfloat setSign(bool sign) const { softfloat x; x.v = (v & ((1U << 31) - 1)) | ((uint32_t)sign << 31); return x; } + /** @brief Get 0-based exponent */ + inline int getExp() const { return ((v >> 23) & 0xFF) - 127; } + /** @brief Construct a copy with new 0-based exponent */ + inline softfloat setExp(int e) const { softfloat x; x.v = (v & 0x807fffff) | (((e + 127) & 0xFF) << 23 ); return x; } + + /** @brief Get a fraction part + + Returns a number 1 <= x < 2 with the same significand + */ + inline softfloat getFrac() const + { + uint_fast32_t vv = (v & 0x007fffff) | (127 << 23); + return softfloat::fromRaw(vv); + } + /** @brief Construct a copy with provided significand + + Constructs a copy of a number with significand taken from parameter + */ + inline softfloat setFrac(const softfloat& s) const + { + softfloat x; + x.v = (v & 0xff800000) | (s.v & 0x007fffff); + return x; + } + + /** @brief Zero constant */ + static softfloat zero() { return softfloat::fromRaw( 0 ); } + /** @brief Positive infinity constant */ + static softfloat inf() { return softfloat::fromRaw( 0xFF << 23 ); } + /** @brief Default NaN constant */ + static softfloat nan() { return softfloat::fromRaw( 0x7fffffff ); } + /** @brief One constant */ + static softfloat one() { return softfloat::fromRaw( 127 << 23 ); } + /** @brief Smallest normalized value */ + static softfloat min() { return softfloat::fromRaw( 0x01 << 23 ); } + /** @brief Difference between 1 and next representable value */ + static softfloat eps() { return softfloat::fromRaw( (127 - 23) << 23 ); } + /** @brief Biggest finite value */ + static softfloat max() { return softfloat::fromRaw( (0xFF << 23) - 1 ); } + /** @brief Correct pi approximation */ + static softfloat pi() { return softfloat::fromRaw( 0x40490fdb ); } + + uint32_t v; +}; + +/*---------------------------------------------------------------------------- +*----------------------------------------------------------------------------*/ + +struct CV_EXPORTS softdouble +{ +public: + /** @brief Default constructor */ + softdouble() : v(0) { } + /** @brief Copy constructor */ + softdouble( const softdouble& c) { v = c.v; } + /** @brief Assign constructor */ + softdouble& operator=( const softdouble& c ) + { + if(&c != this) v = c.v; + return *this; + } + /** @brief Construct from raw + + Builds new value from raw binary representation + */ + static softdouble fromRaw( const uint64_t a ) { softdouble x; x.v = a; return x; } + + /** @brief Construct from integer */ + explicit softdouble( const uint32_t ); + explicit softdouble( const uint64_t ); + explicit softdouble( const int32_t ); + explicit softdouble( const int64_t ); + +#ifdef CV_INT32_T_IS_LONG_INT + // for platforms with int32_t = long int + explicit softdouble( const int a ) { *this = softdouble(static_cast(a)); } +#endif + + /** @brief Construct from double */ + explicit softdouble( const double a ) { Cv64suf s; s.f = a; v = s.u; } + + /** @brief Type casts */ + operator softfloat() const; + operator double() const { Cv64suf s; s.u = v; return s.f; } + + /** @brief Basic arithmetics */ + softdouble operator + (const softdouble&) const; + softdouble operator - (const softdouble&) const; + softdouble operator * (const softdouble&) const; + softdouble operator / (const softdouble&) const; + softdouble operator - () const { softdouble x; x.v = v ^ (1ULL << 63); return x; } + + /** @brief Remainder operator + + A quote from original SoftFloat manual: + + > The IEEE Standard remainder operation computes the value + > a - n * b, where n is the integer closest to a / b. + > If a / b is exactly halfway between two integers, n is the even integer + > closest to a / b. The IEEE Standard’s remainder operation is always exact and so requires no rounding. + > Depending on the relative magnitudes of the operands, the remainder functions + > can take considerably longer to execute than the other SoftFloat functions. + > This is an inherent characteristic of the remainder operation itself and is not a flaw + > in the SoftFloat implementation. + */ + softdouble operator % (const softdouble&) const; + + softdouble& operator += (const softdouble& a) { *this = *this + a; return *this; } + softdouble& operator -= (const softdouble& a) { *this = *this - a; return *this; } + softdouble& operator *= (const softdouble& a) { *this = *this * a; return *this; } + softdouble& operator /= (const softdouble& a) { *this = *this / a; return *this; } + softdouble& operator %= (const softdouble& a) { *this = *this % a; return *this; } + + /** @brief Comparison operations + + - Any operation with NaN produces false + + The only exception is when x is NaN: x != y for any y. + - Positive and negative zeros are equal + */ + bool operator == ( const softdouble& ) const; + bool operator != ( const softdouble& ) const; + bool operator > ( const softdouble& ) const; + bool operator >= ( const softdouble& ) const; + bool operator < ( const softdouble& ) const; + bool operator <= ( const softdouble& ) const; + + /** @brief NaN state indicator */ + inline bool isNaN() const { return (v & 0x7fffffffffffffff) > 0x7ff0000000000000; } + /** @brief Inf state indicator */ + inline bool isInf() const { return (v & 0x7fffffffffffffff) == 0x7ff0000000000000; } + /** @brief Subnormal number indicator */ + inline bool isSubnormal() const { return ((v >> 52) & 0x7FF) == 0; } + + /** @brief Get sign bit */ + inline bool getSign() const { return (v >> 63) != 0; } + /** @brief Construct a copy with new sign bit */ + softdouble setSign(bool sign) const { softdouble x; x.v = (v & ((1ULL << 63) - 1)) | ((uint_fast64_t)(sign) << 63); return x; } + /** @brief Get 0-based exponent */ + inline int getExp() const { return ((v >> 52) & 0x7FF) - 1023; } + /** @brief Construct a copy with new 0-based exponent */ + inline softdouble setExp(int e) const + { + softdouble x; + x.v = (v & 0x800FFFFFFFFFFFFF) | ((uint_fast64_t)((e + 1023) & 0x7FF) << 52); + return x; + } + + /** @brief Get a fraction part + + Returns a number 1 <= x < 2 with the same significand + */ + inline softdouble getFrac() const + { + uint_fast64_t vv = (v & 0x000FFFFFFFFFFFFF) | ((uint_fast64_t)(1023) << 52); + return softdouble::fromRaw(vv); + } + /** @brief Construct a copy with provided significand + + Constructs a copy of a number with significand taken from parameter + */ + inline softdouble setFrac(const softdouble& s) const + { + softdouble x; + x.v = (v & 0xFFF0000000000000) | (s.v & 0x000FFFFFFFFFFFFF); + return x; + } + + /** @brief Zero constant */ + static softdouble zero() { return softdouble::fromRaw( 0 ); } + /** @brief Positive infinity constant */ + static softdouble inf() { return softdouble::fromRaw( (uint_fast64_t)(0x7FF) << 52 ); } + /** @brief Default NaN constant */ + static softdouble nan() { return softdouble::fromRaw( CV_BIG_INT(0x7FFFFFFFFFFFFFFF) ); } + /** @brief One constant */ + static softdouble one() { return softdouble::fromRaw( (uint_fast64_t)( 1023) << 52 ); } + /** @brief Smallest normalized value */ + static softdouble min() { return softdouble::fromRaw( (uint_fast64_t)( 0x01) << 52 ); } + /** @brief Difference between 1 and next representable value */ + static softdouble eps() { return softdouble::fromRaw( (uint_fast64_t)( 1023 - 52 ) << 52 ); } + /** @brief Biggest finite value */ + static softdouble max() { return softdouble::fromRaw( ((uint_fast64_t)(0x7FF) << 52) - 1 ); } + /** @brief Correct pi approximation */ + static softdouble pi() { return softdouble::fromRaw( CV_BIG_INT(0x400921FB54442D18) ); } + + uint64_t v; +}; + +/*---------------------------------------------------------------------------- +*----------------------------------------------------------------------------*/ + +/** @brief Fused Multiplication and Addition + +Computes (a*b)+c with single rounding +*/ +CV_EXPORTS softfloat mulAdd( const softfloat& a, const softfloat& b, const softfloat & c); +CV_EXPORTS softdouble mulAdd( const softdouble& a, const softdouble& b, const softdouble& c); + +/** @brief Square root */ +CV_EXPORTS softfloat sqrt( const softfloat& a ); +CV_EXPORTS softdouble sqrt( const softdouble& a ); +} + +/*---------------------------------------------------------------------------- +| Ported from OpenCV and added for usability +*----------------------------------------------------------------------------*/ + +/** @brief Truncates number to integer with minimum magnitude */ +CV_EXPORTS int cvTrunc(const cv::softfloat& a); +CV_EXPORTS int cvTrunc(const cv::softdouble& a); + +/** @brief Rounds a number to nearest even integer */ +CV_EXPORTS int cvRound(const cv::softfloat& a); +CV_EXPORTS int cvRound(const cv::softdouble& a); + +/** @brief Rounds a number to nearest even long long integer */ +CV_EXPORTS int64_t cvRound64(const cv::softdouble& a); + +/** @brief Rounds a number down to integer */ +CV_EXPORTS int cvFloor(const cv::softfloat& a); +CV_EXPORTS int cvFloor(const cv::softdouble& a); + +/** @brief Rounds number up to integer */ +CV_EXPORTS int cvCeil(const cv::softfloat& a); +CV_EXPORTS int cvCeil(const cv::softdouble& a); + +namespace cv +{ +/** @brief Saturate casts */ +template static inline _Tp saturate_cast(softfloat a) { return _Tp(a); } +template static inline _Tp saturate_cast(softdouble a) { return _Tp(a); } + +template<> inline uchar saturate_cast(softfloat a) { return (uchar)std::max(std::min(cvRound(a), (int)UCHAR_MAX), 0); } +template<> inline uchar saturate_cast(softdouble a) { return (uchar)std::max(std::min(cvRound(a), (int)UCHAR_MAX), 0); } + +template<> inline schar saturate_cast(softfloat a) { return (schar)std::min(std::max(cvRound(a), (int)SCHAR_MIN), (int)SCHAR_MAX); } +template<> inline schar saturate_cast(softdouble a) { return (schar)std::min(std::max(cvRound(a), (int)SCHAR_MIN), (int)SCHAR_MAX); } + +template<> inline ushort saturate_cast(softfloat a) { return (ushort)std::max(std::min(cvRound(a), (int)USHRT_MAX), 0); } +template<> inline ushort saturate_cast(softdouble a) { return (ushort)std::max(std::min(cvRound(a), (int)USHRT_MAX), 0); } + +template<> inline short saturate_cast(softfloat a) { return (short)std::min(std::max(cvRound(a), (int)SHRT_MIN), (int)SHRT_MAX); } +template<> inline short saturate_cast(softdouble a) { return (short)std::min(std::max(cvRound(a), (int)SHRT_MIN), (int)SHRT_MAX); } + +template<> inline int saturate_cast(softfloat a) { return cvRound(a); } +template<> inline int saturate_cast(softdouble a) { return cvRound(a); } + +template<> inline int64_t saturate_cast(softfloat a) { return cvRound(a); } +template<> inline int64_t saturate_cast(softdouble a) { return cvRound64(a); } + +/** @brief Saturate cast to unsigned integer and unsigned long long integer +We intentionally do not clip negative numbers, to make -1 become 0xffffffff etc. +*/ +template<> inline unsigned saturate_cast(softfloat a) { return cvRound(a); } +template<> inline unsigned saturate_cast(softdouble a) { return cvRound(a); } + +template<> inline uint64_t saturate_cast(softfloat a) { return cvRound(a); } +template<> inline uint64_t saturate_cast(softdouble a) { return cvRound64(a); } + +/** @brief Min and Max functions */ +inline softfloat min(const softfloat& a, const softfloat& b) { return (a > b) ? b : a; } +inline softdouble min(const softdouble& a, const softdouble& b) { return (a > b) ? b : a; } + +inline softfloat max(const softfloat& a, const softfloat& b) { return (a > b) ? a : b; } +inline softdouble max(const softdouble& a, const softdouble& b) { return (a > b) ? a : b; } + +/** @brief Absolute value */ +inline softfloat abs( softfloat a) { softfloat x; x.v = a.v & ((1U << 31) - 1); return x; } +inline softdouble abs( softdouble a) { softdouble x; x.v = a.v & ((1ULL << 63) - 1); return x; } + +/** @brief Exponent + +Special cases: +- exp(NaN) is NaN +- exp(-Inf) == 0 +- exp(+Inf) == +Inf +*/ +CV_EXPORTS softfloat exp( const softfloat& a); +CV_EXPORTS softdouble exp( const softdouble& a); + +/** @brief Natural logarithm + +Special cases: +- log(NaN), log(x < 0) are NaN +- log(0) == -Inf +*/ +CV_EXPORTS softfloat log( const softfloat& a ); +CV_EXPORTS softdouble log( const softdouble& a ); + +/** @brief Raising to the power + +Special cases: +- x**NaN is NaN for any x +- ( |x| == 1 )**Inf is NaN +- ( |x| > 1 )**+Inf or ( |x| < 1 )**-Inf is +Inf +- ( |x| > 1 )**-Inf or ( |x| < 1 )**+Inf is 0 +- x ** 0 == 1 for any x +- x ** 1 == 1 for any x +- NaN ** y is NaN for any other y +- Inf**(y < 0) == 0 +- Inf ** y is +Inf for any other y +- (x < 0)**y is NaN for any other y if x can't be correctly rounded to integer +- 0 ** 0 == 1 +- 0 ** (y < 0) is +Inf +- 0 ** (y > 0) is 0 +*/ +CV_EXPORTS softfloat pow( const softfloat& a, const softfloat& b); +CV_EXPORTS softdouble pow( const softdouble& a, const softdouble& b); + +/** @brief Cube root + +Special cases: +- cbrt(NaN) is NaN +- cbrt(+/-Inf) is +/-Inf +*/ +CV_EXPORTS softfloat cbrt( const softfloat& a ); + +/** @brief Sine + +Special cases: +- sin(Inf) or sin(NaN) is NaN +- sin(x) == x when sin(x) is close to zero +*/ +CV_EXPORTS softdouble sin( const softdouble& a ); + +/** @brief Cosine + * +Special cases: +- cos(Inf) or cos(NaN) is NaN +- cos(x) == +/- 1 when cos(x) is close to +/- 1 +*/ +CV_EXPORTS softdouble cos( const softdouble& a ); + +//! @} core_utils_softfloat + +} // cv:: + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/sse_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/sse_utils.hpp new file mode 100644 index 0000000..0906583 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/sse_utils.hpp @@ -0,0 +1,652 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_SSE_UTILS_HPP +#define OPENCV_CORE_SSE_UTILS_HPP + +#ifndef __cplusplus +# error sse_utils.hpp header must be compiled as C++ +#endif + +#include "opencv2/core/cvdef.h" + +//! @addtogroup core_utils_sse +//! @{ + +#if CV_SSE2 + +inline void _mm_deinterleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi8(v_r0, v_g0); + __m128i layer1_chunk1 = _mm_unpackhi_epi8(v_r0, v_g0); + __m128i layer1_chunk2 = _mm_unpacklo_epi8(v_r1, v_g1); + __m128i layer1_chunk3 = _mm_unpackhi_epi8(v_r1, v_g1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi8(layer1_chunk0, layer1_chunk2); + __m128i layer2_chunk1 = _mm_unpackhi_epi8(layer1_chunk0, layer1_chunk2); + __m128i layer2_chunk2 = _mm_unpacklo_epi8(layer1_chunk1, layer1_chunk3); + __m128i layer2_chunk3 = _mm_unpackhi_epi8(layer1_chunk1, layer1_chunk3); + + __m128i layer3_chunk0 = _mm_unpacklo_epi8(layer2_chunk0, layer2_chunk2); + __m128i layer3_chunk1 = _mm_unpackhi_epi8(layer2_chunk0, layer2_chunk2); + __m128i layer3_chunk2 = _mm_unpacklo_epi8(layer2_chunk1, layer2_chunk3); + __m128i layer3_chunk3 = _mm_unpackhi_epi8(layer2_chunk1, layer2_chunk3); + + __m128i layer4_chunk0 = _mm_unpacklo_epi8(layer3_chunk0, layer3_chunk2); + __m128i layer4_chunk1 = _mm_unpackhi_epi8(layer3_chunk0, layer3_chunk2); + __m128i layer4_chunk2 = _mm_unpacklo_epi8(layer3_chunk1, layer3_chunk3); + __m128i layer4_chunk3 = _mm_unpackhi_epi8(layer3_chunk1, layer3_chunk3); + + v_r0 = _mm_unpacklo_epi8(layer4_chunk0, layer4_chunk2); + v_r1 = _mm_unpackhi_epi8(layer4_chunk0, layer4_chunk2); + v_g0 = _mm_unpacklo_epi8(layer4_chunk1, layer4_chunk3); + v_g1 = _mm_unpackhi_epi8(layer4_chunk1, layer4_chunk3); +} + +inline void _mm_deinterleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, + __m128i & v_g1, __m128i & v_b0, __m128i & v_b1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi8(v_r0, v_g1); + __m128i layer1_chunk1 = _mm_unpackhi_epi8(v_r0, v_g1); + __m128i layer1_chunk2 = _mm_unpacklo_epi8(v_r1, v_b0); + __m128i layer1_chunk3 = _mm_unpackhi_epi8(v_r1, v_b0); + __m128i layer1_chunk4 = _mm_unpacklo_epi8(v_g0, v_b1); + __m128i layer1_chunk5 = _mm_unpackhi_epi8(v_g0, v_b1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi8(layer1_chunk0, layer1_chunk3); + __m128i layer2_chunk1 = _mm_unpackhi_epi8(layer1_chunk0, layer1_chunk3); + __m128i layer2_chunk2 = _mm_unpacklo_epi8(layer1_chunk1, layer1_chunk4); + __m128i layer2_chunk3 = _mm_unpackhi_epi8(layer1_chunk1, layer1_chunk4); + __m128i layer2_chunk4 = _mm_unpacklo_epi8(layer1_chunk2, layer1_chunk5); + __m128i layer2_chunk5 = _mm_unpackhi_epi8(layer1_chunk2, layer1_chunk5); + + __m128i layer3_chunk0 = _mm_unpacklo_epi8(layer2_chunk0, layer2_chunk3); + __m128i layer3_chunk1 = _mm_unpackhi_epi8(layer2_chunk0, layer2_chunk3); + __m128i layer3_chunk2 = _mm_unpacklo_epi8(layer2_chunk1, layer2_chunk4); + __m128i layer3_chunk3 = _mm_unpackhi_epi8(layer2_chunk1, layer2_chunk4); + __m128i layer3_chunk4 = _mm_unpacklo_epi8(layer2_chunk2, layer2_chunk5); + __m128i layer3_chunk5 = _mm_unpackhi_epi8(layer2_chunk2, layer2_chunk5); + + __m128i layer4_chunk0 = _mm_unpacklo_epi8(layer3_chunk0, layer3_chunk3); + __m128i layer4_chunk1 = _mm_unpackhi_epi8(layer3_chunk0, layer3_chunk3); + __m128i layer4_chunk2 = _mm_unpacklo_epi8(layer3_chunk1, layer3_chunk4); + __m128i layer4_chunk3 = _mm_unpackhi_epi8(layer3_chunk1, layer3_chunk4); + __m128i layer4_chunk4 = _mm_unpacklo_epi8(layer3_chunk2, layer3_chunk5); + __m128i layer4_chunk5 = _mm_unpackhi_epi8(layer3_chunk2, layer3_chunk5); + + v_r0 = _mm_unpacklo_epi8(layer4_chunk0, layer4_chunk3); + v_r1 = _mm_unpackhi_epi8(layer4_chunk0, layer4_chunk3); + v_g0 = _mm_unpacklo_epi8(layer4_chunk1, layer4_chunk4); + v_g1 = _mm_unpackhi_epi8(layer4_chunk1, layer4_chunk4); + v_b0 = _mm_unpacklo_epi8(layer4_chunk2, layer4_chunk5); + v_b1 = _mm_unpackhi_epi8(layer4_chunk2, layer4_chunk5); +} + +inline void _mm_deinterleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1, + __m128i & v_b0, __m128i & v_b1, __m128i & v_a0, __m128i & v_a1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi8(v_r0, v_b0); + __m128i layer1_chunk1 = _mm_unpackhi_epi8(v_r0, v_b0); + __m128i layer1_chunk2 = _mm_unpacklo_epi8(v_r1, v_b1); + __m128i layer1_chunk3 = _mm_unpackhi_epi8(v_r1, v_b1); + __m128i layer1_chunk4 = _mm_unpacklo_epi8(v_g0, v_a0); + __m128i layer1_chunk5 = _mm_unpackhi_epi8(v_g0, v_a0); + __m128i layer1_chunk6 = _mm_unpacklo_epi8(v_g1, v_a1); + __m128i layer1_chunk7 = _mm_unpackhi_epi8(v_g1, v_a1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi8(layer1_chunk0, layer1_chunk4); + __m128i layer2_chunk1 = _mm_unpackhi_epi8(layer1_chunk0, layer1_chunk4); + __m128i layer2_chunk2 = _mm_unpacklo_epi8(layer1_chunk1, layer1_chunk5); + __m128i layer2_chunk3 = _mm_unpackhi_epi8(layer1_chunk1, layer1_chunk5); + __m128i layer2_chunk4 = _mm_unpacklo_epi8(layer1_chunk2, layer1_chunk6); + __m128i layer2_chunk5 = _mm_unpackhi_epi8(layer1_chunk2, layer1_chunk6); + __m128i layer2_chunk6 = _mm_unpacklo_epi8(layer1_chunk3, layer1_chunk7); + __m128i layer2_chunk7 = _mm_unpackhi_epi8(layer1_chunk3, layer1_chunk7); + + __m128i layer3_chunk0 = _mm_unpacklo_epi8(layer2_chunk0, layer2_chunk4); + __m128i layer3_chunk1 = _mm_unpackhi_epi8(layer2_chunk0, layer2_chunk4); + __m128i layer3_chunk2 = _mm_unpacklo_epi8(layer2_chunk1, layer2_chunk5); + __m128i layer3_chunk3 = _mm_unpackhi_epi8(layer2_chunk1, layer2_chunk5); + __m128i layer3_chunk4 = _mm_unpacklo_epi8(layer2_chunk2, layer2_chunk6); + __m128i layer3_chunk5 = _mm_unpackhi_epi8(layer2_chunk2, layer2_chunk6); + __m128i layer3_chunk6 = _mm_unpacklo_epi8(layer2_chunk3, layer2_chunk7); + __m128i layer3_chunk7 = _mm_unpackhi_epi8(layer2_chunk3, layer2_chunk7); + + __m128i layer4_chunk0 = _mm_unpacklo_epi8(layer3_chunk0, layer3_chunk4); + __m128i layer4_chunk1 = _mm_unpackhi_epi8(layer3_chunk0, layer3_chunk4); + __m128i layer4_chunk2 = _mm_unpacklo_epi8(layer3_chunk1, layer3_chunk5); + __m128i layer4_chunk3 = _mm_unpackhi_epi8(layer3_chunk1, layer3_chunk5); + __m128i layer4_chunk4 = _mm_unpacklo_epi8(layer3_chunk2, layer3_chunk6); + __m128i layer4_chunk5 = _mm_unpackhi_epi8(layer3_chunk2, layer3_chunk6); + __m128i layer4_chunk6 = _mm_unpacklo_epi8(layer3_chunk3, layer3_chunk7); + __m128i layer4_chunk7 = _mm_unpackhi_epi8(layer3_chunk3, layer3_chunk7); + + v_r0 = _mm_unpacklo_epi8(layer4_chunk0, layer4_chunk4); + v_r1 = _mm_unpackhi_epi8(layer4_chunk0, layer4_chunk4); + v_g0 = _mm_unpacklo_epi8(layer4_chunk1, layer4_chunk5); + v_g1 = _mm_unpackhi_epi8(layer4_chunk1, layer4_chunk5); + v_b0 = _mm_unpacklo_epi8(layer4_chunk2, layer4_chunk6); + v_b1 = _mm_unpackhi_epi8(layer4_chunk2, layer4_chunk6); + v_a0 = _mm_unpacklo_epi8(layer4_chunk3, layer4_chunk7); + v_a1 = _mm_unpackhi_epi8(layer4_chunk3, layer4_chunk7); +} + +inline void _mm_interleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1) +{ + __m128i v_mask = _mm_set1_epi16(0x00ff); + + __m128i layer4_chunk0 = _mm_packus_epi16(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer4_chunk2 = _mm_packus_epi16(_mm_srli_epi16(v_r0, 8), _mm_srli_epi16(v_r1, 8)); + __m128i layer4_chunk1 = _mm_packus_epi16(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer4_chunk3 = _mm_packus_epi16(_mm_srli_epi16(v_g0, 8), _mm_srli_epi16(v_g1, 8)); + + __m128i layer3_chunk0 = _mm_packus_epi16(_mm_and_si128(layer4_chunk0, v_mask), _mm_and_si128(layer4_chunk1, v_mask)); + __m128i layer3_chunk2 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk0, 8), _mm_srli_epi16(layer4_chunk1, 8)); + __m128i layer3_chunk1 = _mm_packus_epi16(_mm_and_si128(layer4_chunk2, v_mask), _mm_and_si128(layer4_chunk3, v_mask)); + __m128i layer3_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk2, 8), _mm_srli_epi16(layer4_chunk3, 8)); + + __m128i layer2_chunk0 = _mm_packus_epi16(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk2 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk0, 8), _mm_srli_epi16(layer3_chunk1, 8)); + __m128i layer2_chunk1 = _mm_packus_epi16(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk2, 8), _mm_srli_epi16(layer3_chunk3, 8)); + + __m128i layer1_chunk0 = _mm_packus_epi16(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk2 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk0, 8), _mm_srli_epi16(layer2_chunk1, 8)); + __m128i layer1_chunk1 = _mm_packus_epi16(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk2, 8), _mm_srli_epi16(layer2_chunk3, 8)); + + v_r0 = _mm_packus_epi16(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_g0 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk0, 8), _mm_srli_epi16(layer1_chunk1, 8)); + v_r1 = _mm_packus_epi16(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_g1 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk2, 8), _mm_srli_epi16(layer1_chunk3, 8)); +} + +inline void _mm_interleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, + __m128i & v_g1, __m128i & v_b0, __m128i & v_b1) +{ + __m128i v_mask = _mm_set1_epi16(0x00ff); + + __m128i layer4_chunk0 = _mm_packus_epi16(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer4_chunk3 = _mm_packus_epi16(_mm_srli_epi16(v_r0, 8), _mm_srli_epi16(v_r1, 8)); + __m128i layer4_chunk1 = _mm_packus_epi16(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer4_chunk4 = _mm_packus_epi16(_mm_srli_epi16(v_g0, 8), _mm_srli_epi16(v_g1, 8)); + __m128i layer4_chunk2 = _mm_packus_epi16(_mm_and_si128(v_b0, v_mask), _mm_and_si128(v_b1, v_mask)); + __m128i layer4_chunk5 = _mm_packus_epi16(_mm_srli_epi16(v_b0, 8), _mm_srli_epi16(v_b1, 8)); + + __m128i layer3_chunk0 = _mm_packus_epi16(_mm_and_si128(layer4_chunk0, v_mask), _mm_and_si128(layer4_chunk1, v_mask)); + __m128i layer3_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk0, 8), _mm_srli_epi16(layer4_chunk1, 8)); + __m128i layer3_chunk1 = _mm_packus_epi16(_mm_and_si128(layer4_chunk2, v_mask), _mm_and_si128(layer4_chunk3, v_mask)); + __m128i layer3_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk2, 8), _mm_srli_epi16(layer4_chunk3, 8)); + __m128i layer3_chunk2 = _mm_packus_epi16(_mm_and_si128(layer4_chunk4, v_mask), _mm_and_si128(layer4_chunk5, v_mask)); + __m128i layer3_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk4, 8), _mm_srli_epi16(layer4_chunk5, 8)); + + __m128i layer2_chunk0 = _mm_packus_epi16(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk0, 8), _mm_srli_epi16(layer3_chunk1, 8)); + __m128i layer2_chunk1 = _mm_packus_epi16(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk2, 8), _mm_srli_epi16(layer3_chunk3, 8)); + __m128i layer2_chunk2 = _mm_packus_epi16(_mm_and_si128(layer3_chunk4, v_mask), _mm_and_si128(layer3_chunk5, v_mask)); + __m128i layer2_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk4, 8), _mm_srli_epi16(layer3_chunk5, 8)); + + __m128i layer1_chunk0 = _mm_packus_epi16(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk3 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk0, 8), _mm_srli_epi16(layer2_chunk1, 8)); + __m128i layer1_chunk1 = _mm_packus_epi16(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk2, 8), _mm_srli_epi16(layer2_chunk3, 8)); + __m128i layer1_chunk2 = _mm_packus_epi16(_mm_and_si128(layer2_chunk4, v_mask), _mm_and_si128(layer2_chunk5, v_mask)); + __m128i layer1_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk4, 8), _mm_srli_epi16(layer2_chunk5, 8)); + + v_r0 = _mm_packus_epi16(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_g1 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk0, 8), _mm_srli_epi16(layer1_chunk1, 8)); + v_r1 = _mm_packus_epi16(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_b0 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk2, 8), _mm_srli_epi16(layer1_chunk3, 8)); + v_g0 = _mm_packus_epi16(_mm_and_si128(layer1_chunk4, v_mask), _mm_and_si128(layer1_chunk5, v_mask)); + v_b1 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk4, 8), _mm_srli_epi16(layer1_chunk5, 8)); +} + +inline void _mm_interleave_epi8(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1, + __m128i & v_b0, __m128i & v_b1, __m128i & v_a0, __m128i & v_a1) +{ + __m128i v_mask = _mm_set1_epi16(0x00ff); + + __m128i layer4_chunk0 = _mm_packus_epi16(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer4_chunk4 = _mm_packus_epi16(_mm_srli_epi16(v_r0, 8), _mm_srli_epi16(v_r1, 8)); + __m128i layer4_chunk1 = _mm_packus_epi16(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer4_chunk5 = _mm_packus_epi16(_mm_srli_epi16(v_g0, 8), _mm_srli_epi16(v_g1, 8)); + __m128i layer4_chunk2 = _mm_packus_epi16(_mm_and_si128(v_b0, v_mask), _mm_and_si128(v_b1, v_mask)); + __m128i layer4_chunk6 = _mm_packus_epi16(_mm_srli_epi16(v_b0, 8), _mm_srli_epi16(v_b1, 8)); + __m128i layer4_chunk3 = _mm_packus_epi16(_mm_and_si128(v_a0, v_mask), _mm_and_si128(v_a1, v_mask)); + __m128i layer4_chunk7 = _mm_packus_epi16(_mm_srli_epi16(v_a0, 8), _mm_srli_epi16(v_a1, 8)); + + __m128i layer3_chunk0 = _mm_packus_epi16(_mm_and_si128(layer4_chunk0, v_mask), _mm_and_si128(layer4_chunk1, v_mask)); + __m128i layer3_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk0, 8), _mm_srli_epi16(layer4_chunk1, 8)); + __m128i layer3_chunk1 = _mm_packus_epi16(_mm_and_si128(layer4_chunk2, v_mask), _mm_and_si128(layer4_chunk3, v_mask)); + __m128i layer3_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk2, 8), _mm_srli_epi16(layer4_chunk3, 8)); + __m128i layer3_chunk2 = _mm_packus_epi16(_mm_and_si128(layer4_chunk4, v_mask), _mm_and_si128(layer4_chunk5, v_mask)); + __m128i layer3_chunk6 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk4, 8), _mm_srli_epi16(layer4_chunk5, 8)); + __m128i layer3_chunk3 = _mm_packus_epi16(_mm_and_si128(layer4_chunk6, v_mask), _mm_and_si128(layer4_chunk7, v_mask)); + __m128i layer3_chunk7 = _mm_packus_epi16(_mm_srli_epi16(layer4_chunk6, 8), _mm_srli_epi16(layer4_chunk7, 8)); + + __m128i layer2_chunk0 = _mm_packus_epi16(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk0, 8), _mm_srli_epi16(layer3_chunk1, 8)); + __m128i layer2_chunk1 = _mm_packus_epi16(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk2, 8), _mm_srli_epi16(layer3_chunk3, 8)); + __m128i layer2_chunk2 = _mm_packus_epi16(_mm_and_si128(layer3_chunk4, v_mask), _mm_and_si128(layer3_chunk5, v_mask)); + __m128i layer2_chunk6 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk4, 8), _mm_srli_epi16(layer3_chunk5, 8)); + __m128i layer2_chunk3 = _mm_packus_epi16(_mm_and_si128(layer3_chunk6, v_mask), _mm_and_si128(layer3_chunk7, v_mask)); + __m128i layer2_chunk7 = _mm_packus_epi16(_mm_srli_epi16(layer3_chunk6, 8), _mm_srli_epi16(layer3_chunk7, 8)); + + __m128i layer1_chunk0 = _mm_packus_epi16(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk4 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk0, 8), _mm_srli_epi16(layer2_chunk1, 8)); + __m128i layer1_chunk1 = _mm_packus_epi16(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk5 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk2, 8), _mm_srli_epi16(layer2_chunk3, 8)); + __m128i layer1_chunk2 = _mm_packus_epi16(_mm_and_si128(layer2_chunk4, v_mask), _mm_and_si128(layer2_chunk5, v_mask)); + __m128i layer1_chunk6 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk4, 8), _mm_srli_epi16(layer2_chunk5, 8)); + __m128i layer1_chunk3 = _mm_packus_epi16(_mm_and_si128(layer2_chunk6, v_mask), _mm_and_si128(layer2_chunk7, v_mask)); + __m128i layer1_chunk7 = _mm_packus_epi16(_mm_srli_epi16(layer2_chunk6, 8), _mm_srli_epi16(layer2_chunk7, 8)); + + v_r0 = _mm_packus_epi16(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_b0 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk0, 8), _mm_srli_epi16(layer1_chunk1, 8)); + v_r1 = _mm_packus_epi16(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_b1 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk2, 8), _mm_srli_epi16(layer1_chunk3, 8)); + v_g0 = _mm_packus_epi16(_mm_and_si128(layer1_chunk4, v_mask), _mm_and_si128(layer1_chunk5, v_mask)); + v_a0 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk4, 8), _mm_srli_epi16(layer1_chunk5, 8)); + v_g1 = _mm_packus_epi16(_mm_and_si128(layer1_chunk6, v_mask), _mm_and_si128(layer1_chunk7, v_mask)); + v_a1 = _mm_packus_epi16(_mm_srli_epi16(layer1_chunk6, 8), _mm_srli_epi16(layer1_chunk7, 8)); +} + +inline void _mm_deinterleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi16(v_r0, v_g0); + __m128i layer1_chunk1 = _mm_unpackhi_epi16(v_r0, v_g0); + __m128i layer1_chunk2 = _mm_unpacklo_epi16(v_r1, v_g1); + __m128i layer1_chunk3 = _mm_unpackhi_epi16(v_r1, v_g1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi16(layer1_chunk0, layer1_chunk2); + __m128i layer2_chunk1 = _mm_unpackhi_epi16(layer1_chunk0, layer1_chunk2); + __m128i layer2_chunk2 = _mm_unpacklo_epi16(layer1_chunk1, layer1_chunk3); + __m128i layer2_chunk3 = _mm_unpackhi_epi16(layer1_chunk1, layer1_chunk3); + + __m128i layer3_chunk0 = _mm_unpacklo_epi16(layer2_chunk0, layer2_chunk2); + __m128i layer3_chunk1 = _mm_unpackhi_epi16(layer2_chunk0, layer2_chunk2); + __m128i layer3_chunk2 = _mm_unpacklo_epi16(layer2_chunk1, layer2_chunk3); + __m128i layer3_chunk3 = _mm_unpackhi_epi16(layer2_chunk1, layer2_chunk3); + + v_r0 = _mm_unpacklo_epi16(layer3_chunk0, layer3_chunk2); + v_r1 = _mm_unpackhi_epi16(layer3_chunk0, layer3_chunk2); + v_g0 = _mm_unpacklo_epi16(layer3_chunk1, layer3_chunk3); + v_g1 = _mm_unpackhi_epi16(layer3_chunk1, layer3_chunk3); +} + +inline void _mm_deinterleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, + __m128i & v_g1, __m128i & v_b0, __m128i & v_b1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi16(v_r0, v_g1); + __m128i layer1_chunk1 = _mm_unpackhi_epi16(v_r0, v_g1); + __m128i layer1_chunk2 = _mm_unpacklo_epi16(v_r1, v_b0); + __m128i layer1_chunk3 = _mm_unpackhi_epi16(v_r1, v_b0); + __m128i layer1_chunk4 = _mm_unpacklo_epi16(v_g0, v_b1); + __m128i layer1_chunk5 = _mm_unpackhi_epi16(v_g0, v_b1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi16(layer1_chunk0, layer1_chunk3); + __m128i layer2_chunk1 = _mm_unpackhi_epi16(layer1_chunk0, layer1_chunk3); + __m128i layer2_chunk2 = _mm_unpacklo_epi16(layer1_chunk1, layer1_chunk4); + __m128i layer2_chunk3 = _mm_unpackhi_epi16(layer1_chunk1, layer1_chunk4); + __m128i layer2_chunk4 = _mm_unpacklo_epi16(layer1_chunk2, layer1_chunk5); + __m128i layer2_chunk5 = _mm_unpackhi_epi16(layer1_chunk2, layer1_chunk5); + + __m128i layer3_chunk0 = _mm_unpacklo_epi16(layer2_chunk0, layer2_chunk3); + __m128i layer3_chunk1 = _mm_unpackhi_epi16(layer2_chunk0, layer2_chunk3); + __m128i layer3_chunk2 = _mm_unpacklo_epi16(layer2_chunk1, layer2_chunk4); + __m128i layer3_chunk3 = _mm_unpackhi_epi16(layer2_chunk1, layer2_chunk4); + __m128i layer3_chunk4 = _mm_unpacklo_epi16(layer2_chunk2, layer2_chunk5); + __m128i layer3_chunk5 = _mm_unpackhi_epi16(layer2_chunk2, layer2_chunk5); + + v_r0 = _mm_unpacklo_epi16(layer3_chunk0, layer3_chunk3); + v_r1 = _mm_unpackhi_epi16(layer3_chunk0, layer3_chunk3); + v_g0 = _mm_unpacklo_epi16(layer3_chunk1, layer3_chunk4); + v_g1 = _mm_unpackhi_epi16(layer3_chunk1, layer3_chunk4); + v_b0 = _mm_unpacklo_epi16(layer3_chunk2, layer3_chunk5); + v_b1 = _mm_unpackhi_epi16(layer3_chunk2, layer3_chunk5); +} + +inline void _mm_deinterleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1, + __m128i & v_b0, __m128i & v_b1, __m128i & v_a0, __m128i & v_a1) +{ + __m128i layer1_chunk0 = _mm_unpacklo_epi16(v_r0, v_b0); + __m128i layer1_chunk1 = _mm_unpackhi_epi16(v_r0, v_b0); + __m128i layer1_chunk2 = _mm_unpacklo_epi16(v_r1, v_b1); + __m128i layer1_chunk3 = _mm_unpackhi_epi16(v_r1, v_b1); + __m128i layer1_chunk4 = _mm_unpacklo_epi16(v_g0, v_a0); + __m128i layer1_chunk5 = _mm_unpackhi_epi16(v_g0, v_a0); + __m128i layer1_chunk6 = _mm_unpacklo_epi16(v_g1, v_a1); + __m128i layer1_chunk7 = _mm_unpackhi_epi16(v_g1, v_a1); + + __m128i layer2_chunk0 = _mm_unpacklo_epi16(layer1_chunk0, layer1_chunk4); + __m128i layer2_chunk1 = _mm_unpackhi_epi16(layer1_chunk0, layer1_chunk4); + __m128i layer2_chunk2 = _mm_unpacklo_epi16(layer1_chunk1, layer1_chunk5); + __m128i layer2_chunk3 = _mm_unpackhi_epi16(layer1_chunk1, layer1_chunk5); + __m128i layer2_chunk4 = _mm_unpacklo_epi16(layer1_chunk2, layer1_chunk6); + __m128i layer2_chunk5 = _mm_unpackhi_epi16(layer1_chunk2, layer1_chunk6); + __m128i layer2_chunk6 = _mm_unpacklo_epi16(layer1_chunk3, layer1_chunk7); + __m128i layer2_chunk7 = _mm_unpackhi_epi16(layer1_chunk3, layer1_chunk7); + + __m128i layer3_chunk0 = _mm_unpacklo_epi16(layer2_chunk0, layer2_chunk4); + __m128i layer3_chunk1 = _mm_unpackhi_epi16(layer2_chunk0, layer2_chunk4); + __m128i layer3_chunk2 = _mm_unpacklo_epi16(layer2_chunk1, layer2_chunk5); + __m128i layer3_chunk3 = _mm_unpackhi_epi16(layer2_chunk1, layer2_chunk5); + __m128i layer3_chunk4 = _mm_unpacklo_epi16(layer2_chunk2, layer2_chunk6); + __m128i layer3_chunk5 = _mm_unpackhi_epi16(layer2_chunk2, layer2_chunk6); + __m128i layer3_chunk6 = _mm_unpacklo_epi16(layer2_chunk3, layer2_chunk7); + __m128i layer3_chunk7 = _mm_unpackhi_epi16(layer2_chunk3, layer2_chunk7); + + v_r0 = _mm_unpacklo_epi16(layer3_chunk0, layer3_chunk4); + v_r1 = _mm_unpackhi_epi16(layer3_chunk0, layer3_chunk4); + v_g0 = _mm_unpacklo_epi16(layer3_chunk1, layer3_chunk5); + v_g1 = _mm_unpackhi_epi16(layer3_chunk1, layer3_chunk5); + v_b0 = _mm_unpacklo_epi16(layer3_chunk2, layer3_chunk6); + v_b1 = _mm_unpackhi_epi16(layer3_chunk2, layer3_chunk6); + v_a0 = _mm_unpacklo_epi16(layer3_chunk3, layer3_chunk7); + v_a1 = _mm_unpackhi_epi16(layer3_chunk3, layer3_chunk7); +} + +#if CV_SSE4_1 + +inline void _mm_interleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1) +{ + __m128i v_mask = _mm_set1_epi32(0x0000ffff); + + __m128i layer3_chunk0 = _mm_packus_epi32(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer3_chunk2 = _mm_packus_epi32(_mm_srli_epi32(v_r0, 16), _mm_srli_epi32(v_r1, 16)); + __m128i layer3_chunk1 = _mm_packus_epi32(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer3_chunk3 = _mm_packus_epi32(_mm_srli_epi32(v_g0, 16), _mm_srli_epi32(v_g1, 16)); + + __m128i layer2_chunk0 = _mm_packus_epi32(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk2 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk0, 16), _mm_srli_epi32(layer3_chunk1, 16)); + __m128i layer2_chunk1 = _mm_packus_epi32(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk3 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk2, 16), _mm_srli_epi32(layer3_chunk3, 16)); + + __m128i layer1_chunk0 = _mm_packus_epi32(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk2 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk0, 16), _mm_srli_epi32(layer2_chunk1, 16)); + __m128i layer1_chunk1 = _mm_packus_epi32(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk3 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk2, 16), _mm_srli_epi32(layer2_chunk3, 16)); + + v_r0 = _mm_packus_epi32(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_g0 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk0, 16), _mm_srli_epi32(layer1_chunk1, 16)); + v_r1 = _mm_packus_epi32(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_g1 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk2, 16), _mm_srli_epi32(layer1_chunk3, 16)); +} + +inline void _mm_interleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, + __m128i & v_g1, __m128i & v_b0, __m128i & v_b1) +{ + __m128i v_mask = _mm_set1_epi32(0x0000ffff); + + __m128i layer3_chunk0 = _mm_packus_epi32(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer3_chunk3 = _mm_packus_epi32(_mm_srli_epi32(v_r0, 16), _mm_srli_epi32(v_r1, 16)); + __m128i layer3_chunk1 = _mm_packus_epi32(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer3_chunk4 = _mm_packus_epi32(_mm_srli_epi32(v_g0, 16), _mm_srli_epi32(v_g1, 16)); + __m128i layer3_chunk2 = _mm_packus_epi32(_mm_and_si128(v_b0, v_mask), _mm_and_si128(v_b1, v_mask)); + __m128i layer3_chunk5 = _mm_packus_epi32(_mm_srli_epi32(v_b0, 16), _mm_srli_epi32(v_b1, 16)); + + __m128i layer2_chunk0 = _mm_packus_epi32(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk3 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk0, 16), _mm_srli_epi32(layer3_chunk1, 16)); + __m128i layer2_chunk1 = _mm_packus_epi32(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk4 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk2, 16), _mm_srli_epi32(layer3_chunk3, 16)); + __m128i layer2_chunk2 = _mm_packus_epi32(_mm_and_si128(layer3_chunk4, v_mask), _mm_and_si128(layer3_chunk5, v_mask)); + __m128i layer2_chunk5 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk4, 16), _mm_srli_epi32(layer3_chunk5, 16)); + + __m128i layer1_chunk0 = _mm_packus_epi32(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk3 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk0, 16), _mm_srli_epi32(layer2_chunk1, 16)); + __m128i layer1_chunk1 = _mm_packus_epi32(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk4 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk2, 16), _mm_srli_epi32(layer2_chunk3, 16)); + __m128i layer1_chunk2 = _mm_packus_epi32(_mm_and_si128(layer2_chunk4, v_mask), _mm_and_si128(layer2_chunk5, v_mask)); + __m128i layer1_chunk5 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk4, 16), _mm_srli_epi32(layer2_chunk5, 16)); + + v_r0 = _mm_packus_epi32(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_g1 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk0, 16), _mm_srli_epi32(layer1_chunk1, 16)); + v_r1 = _mm_packus_epi32(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_b0 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk2, 16), _mm_srli_epi32(layer1_chunk3, 16)); + v_g0 = _mm_packus_epi32(_mm_and_si128(layer1_chunk4, v_mask), _mm_and_si128(layer1_chunk5, v_mask)); + v_b1 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk4, 16), _mm_srli_epi32(layer1_chunk5, 16)); +} + +inline void _mm_interleave_epi16(__m128i & v_r0, __m128i & v_r1, __m128i & v_g0, __m128i & v_g1, + __m128i & v_b0, __m128i & v_b1, __m128i & v_a0, __m128i & v_a1) +{ + __m128i v_mask = _mm_set1_epi32(0x0000ffff); + + __m128i layer3_chunk0 = _mm_packus_epi32(_mm_and_si128(v_r0, v_mask), _mm_and_si128(v_r1, v_mask)); + __m128i layer3_chunk4 = _mm_packus_epi32(_mm_srli_epi32(v_r0, 16), _mm_srli_epi32(v_r1, 16)); + __m128i layer3_chunk1 = _mm_packus_epi32(_mm_and_si128(v_g0, v_mask), _mm_and_si128(v_g1, v_mask)); + __m128i layer3_chunk5 = _mm_packus_epi32(_mm_srli_epi32(v_g0, 16), _mm_srli_epi32(v_g1, 16)); + __m128i layer3_chunk2 = _mm_packus_epi32(_mm_and_si128(v_b0, v_mask), _mm_and_si128(v_b1, v_mask)); + __m128i layer3_chunk6 = _mm_packus_epi32(_mm_srli_epi32(v_b0, 16), _mm_srli_epi32(v_b1, 16)); + __m128i layer3_chunk3 = _mm_packus_epi32(_mm_and_si128(v_a0, v_mask), _mm_and_si128(v_a1, v_mask)); + __m128i layer3_chunk7 = _mm_packus_epi32(_mm_srli_epi32(v_a0, 16), _mm_srli_epi32(v_a1, 16)); + + __m128i layer2_chunk0 = _mm_packus_epi32(_mm_and_si128(layer3_chunk0, v_mask), _mm_and_si128(layer3_chunk1, v_mask)); + __m128i layer2_chunk4 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk0, 16), _mm_srli_epi32(layer3_chunk1, 16)); + __m128i layer2_chunk1 = _mm_packus_epi32(_mm_and_si128(layer3_chunk2, v_mask), _mm_and_si128(layer3_chunk3, v_mask)); + __m128i layer2_chunk5 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk2, 16), _mm_srli_epi32(layer3_chunk3, 16)); + __m128i layer2_chunk2 = _mm_packus_epi32(_mm_and_si128(layer3_chunk4, v_mask), _mm_and_si128(layer3_chunk5, v_mask)); + __m128i layer2_chunk6 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk4, 16), _mm_srli_epi32(layer3_chunk5, 16)); + __m128i layer2_chunk3 = _mm_packus_epi32(_mm_and_si128(layer3_chunk6, v_mask), _mm_and_si128(layer3_chunk7, v_mask)); + __m128i layer2_chunk7 = _mm_packus_epi32(_mm_srli_epi32(layer3_chunk6, 16), _mm_srli_epi32(layer3_chunk7, 16)); + + __m128i layer1_chunk0 = _mm_packus_epi32(_mm_and_si128(layer2_chunk0, v_mask), _mm_and_si128(layer2_chunk1, v_mask)); + __m128i layer1_chunk4 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk0, 16), _mm_srli_epi32(layer2_chunk1, 16)); + __m128i layer1_chunk1 = _mm_packus_epi32(_mm_and_si128(layer2_chunk2, v_mask), _mm_and_si128(layer2_chunk3, v_mask)); + __m128i layer1_chunk5 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk2, 16), _mm_srli_epi32(layer2_chunk3, 16)); + __m128i layer1_chunk2 = _mm_packus_epi32(_mm_and_si128(layer2_chunk4, v_mask), _mm_and_si128(layer2_chunk5, v_mask)); + __m128i layer1_chunk6 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk4, 16), _mm_srli_epi32(layer2_chunk5, 16)); + __m128i layer1_chunk3 = _mm_packus_epi32(_mm_and_si128(layer2_chunk6, v_mask), _mm_and_si128(layer2_chunk7, v_mask)); + __m128i layer1_chunk7 = _mm_packus_epi32(_mm_srli_epi32(layer2_chunk6, 16), _mm_srli_epi32(layer2_chunk7, 16)); + + v_r0 = _mm_packus_epi32(_mm_and_si128(layer1_chunk0, v_mask), _mm_and_si128(layer1_chunk1, v_mask)); + v_b0 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk0, 16), _mm_srli_epi32(layer1_chunk1, 16)); + v_r1 = _mm_packus_epi32(_mm_and_si128(layer1_chunk2, v_mask), _mm_and_si128(layer1_chunk3, v_mask)); + v_b1 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk2, 16), _mm_srli_epi32(layer1_chunk3, 16)); + v_g0 = _mm_packus_epi32(_mm_and_si128(layer1_chunk4, v_mask), _mm_and_si128(layer1_chunk5, v_mask)); + v_a0 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk4, 16), _mm_srli_epi32(layer1_chunk5, 16)); + v_g1 = _mm_packus_epi32(_mm_and_si128(layer1_chunk6, v_mask), _mm_and_si128(layer1_chunk7, v_mask)); + v_a1 = _mm_packus_epi32(_mm_srli_epi32(layer1_chunk6, 16), _mm_srli_epi32(layer1_chunk7, 16)); +} + +#endif // CV_SSE4_1 + +inline void _mm_deinterleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, __m128 & v_g1) +{ + __m128 layer1_chunk0 = _mm_unpacklo_ps(v_r0, v_g0); + __m128 layer1_chunk1 = _mm_unpackhi_ps(v_r0, v_g0); + __m128 layer1_chunk2 = _mm_unpacklo_ps(v_r1, v_g1); + __m128 layer1_chunk3 = _mm_unpackhi_ps(v_r1, v_g1); + + __m128 layer2_chunk0 = _mm_unpacklo_ps(layer1_chunk0, layer1_chunk2); + __m128 layer2_chunk1 = _mm_unpackhi_ps(layer1_chunk0, layer1_chunk2); + __m128 layer2_chunk2 = _mm_unpacklo_ps(layer1_chunk1, layer1_chunk3); + __m128 layer2_chunk3 = _mm_unpackhi_ps(layer1_chunk1, layer1_chunk3); + + v_r0 = _mm_unpacklo_ps(layer2_chunk0, layer2_chunk2); + v_r1 = _mm_unpackhi_ps(layer2_chunk0, layer2_chunk2); + v_g0 = _mm_unpacklo_ps(layer2_chunk1, layer2_chunk3); + v_g1 = _mm_unpackhi_ps(layer2_chunk1, layer2_chunk3); +} + +inline void _mm_deinterleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, + __m128 & v_g1, __m128 & v_b0, __m128 & v_b1) +{ + __m128 layer1_chunk0 = _mm_unpacklo_ps(v_r0, v_g1); + __m128 layer1_chunk1 = _mm_unpackhi_ps(v_r0, v_g1); + __m128 layer1_chunk2 = _mm_unpacklo_ps(v_r1, v_b0); + __m128 layer1_chunk3 = _mm_unpackhi_ps(v_r1, v_b0); + __m128 layer1_chunk4 = _mm_unpacklo_ps(v_g0, v_b1); + __m128 layer1_chunk5 = _mm_unpackhi_ps(v_g0, v_b1); + + __m128 layer2_chunk0 = _mm_unpacklo_ps(layer1_chunk0, layer1_chunk3); + __m128 layer2_chunk1 = _mm_unpackhi_ps(layer1_chunk0, layer1_chunk3); + __m128 layer2_chunk2 = _mm_unpacklo_ps(layer1_chunk1, layer1_chunk4); + __m128 layer2_chunk3 = _mm_unpackhi_ps(layer1_chunk1, layer1_chunk4); + __m128 layer2_chunk4 = _mm_unpacklo_ps(layer1_chunk2, layer1_chunk5); + __m128 layer2_chunk5 = _mm_unpackhi_ps(layer1_chunk2, layer1_chunk5); + + v_r0 = _mm_unpacklo_ps(layer2_chunk0, layer2_chunk3); + v_r1 = _mm_unpackhi_ps(layer2_chunk0, layer2_chunk3); + v_g0 = _mm_unpacklo_ps(layer2_chunk1, layer2_chunk4); + v_g1 = _mm_unpackhi_ps(layer2_chunk1, layer2_chunk4); + v_b0 = _mm_unpacklo_ps(layer2_chunk2, layer2_chunk5); + v_b1 = _mm_unpackhi_ps(layer2_chunk2, layer2_chunk5); +} + +inline void _mm_deinterleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, __m128 & v_g1, + __m128 & v_b0, __m128 & v_b1, __m128 & v_a0, __m128 & v_a1) +{ + __m128 layer1_chunk0 = _mm_unpacklo_ps(v_r0, v_b0); + __m128 layer1_chunk1 = _mm_unpackhi_ps(v_r0, v_b0); + __m128 layer1_chunk2 = _mm_unpacklo_ps(v_r1, v_b1); + __m128 layer1_chunk3 = _mm_unpackhi_ps(v_r1, v_b1); + __m128 layer1_chunk4 = _mm_unpacklo_ps(v_g0, v_a0); + __m128 layer1_chunk5 = _mm_unpackhi_ps(v_g0, v_a0); + __m128 layer1_chunk6 = _mm_unpacklo_ps(v_g1, v_a1); + __m128 layer1_chunk7 = _mm_unpackhi_ps(v_g1, v_a1); + + __m128 layer2_chunk0 = _mm_unpacklo_ps(layer1_chunk0, layer1_chunk4); + __m128 layer2_chunk1 = _mm_unpackhi_ps(layer1_chunk0, layer1_chunk4); + __m128 layer2_chunk2 = _mm_unpacklo_ps(layer1_chunk1, layer1_chunk5); + __m128 layer2_chunk3 = _mm_unpackhi_ps(layer1_chunk1, layer1_chunk5); + __m128 layer2_chunk4 = _mm_unpacklo_ps(layer1_chunk2, layer1_chunk6); + __m128 layer2_chunk5 = _mm_unpackhi_ps(layer1_chunk2, layer1_chunk6); + __m128 layer2_chunk6 = _mm_unpacklo_ps(layer1_chunk3, layer1_chunk7); + __m128 layer2_chunk7 = _mm_unpackhi_ps(layer1_chunk3, layer1_chunk7); + + v_r0 = _mm_unpacklo_ps(layer2_chunk0, layer2_chunk4); + v_r1 = _mm_unpackhi_ps(layer2_chunk0, layer2_chunk4); + v_g0 = _mm_unpacklo_ps(layer2_chunk1, layer2_chunk5); + v_g1 = _mm_unpackhi_ps(layer2_chunk1, layer2_chunk5); + v_b0 = _mm_unpacklo_ps(layer2_chunk2, layer2_chunk6); + v_b1 = _mm_unpackhi_ps(layer2_chunk2, layer2_chunk6); + v_a0 = _mm_unpacklo_ps(layer2_chunk3, layer2_chunk7); + v_a1 = _mm_unpackhi_ps(layer2_chunk3, layer2_chunk7); +} + +inline void _mm_interleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, __m128 & v_g1) +{ + enum { mask_lo = _MM_SHUFFLE(2, 0, 2, 0), mask_hi = _MM_SHUFFLE(3, 1, 3, 1) }; + + __m128 layer2_chunk0 = _mm_shuffle_ps(v_r0, v_r1, mask_lo); + __m128 layer2_chunk2 = _mm_shuffle_ps(v_r0, v_r1, mask_hi); + __m128 layer2_chunk1 = _mm_shuffle_ps(v_g0, v_g1, mask_lo); + __m128 layer2_chunk3 = _mm_shuffle_ps(v_g0, v_g1, mask_hi); + + __m128 layer1_chunk0 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_lo); + __m128 layer1_chunk2 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_hi); + __m128 layer1_chunk1 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_lo); + __m128 layer1_chunk3 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_hi); + + v_r0 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_lo); + v_g0 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_hi); + v_r1 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_lo); + v_g1 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_hi); +} + +inline void _mm_interleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, + __m128 & v_g1, __m128 & v_b0, __m128 & v_b1) +{ + enum { mask_lo = _MM_SHUFFLE(2, 0, 2, 0), mask_hi = _MM_SHUFFLE(3, 1, 3, 1) }; + + __m128 layer2_chunk0 = _mm_shuffle_ps(v_r0, v_r1, mask_lo); + __m128 layer2_chunk3 = _mm_shuffle_ps(v_r0, v_r1, mask_hi); + __m128 layer2_chunk1 = _mm_shuffle_ps(v_g0, v_g1, mask_lo); + __m128 layer2_chunk4 = _mm_shuffle_ps(v_g0, v_g1, mask_hi); + __m128 layer2_chunk2 = _mm_shuffle_ps(v_b0, v_b1, mask_lo); + __m128 layer2_chunk5 = _mm_shuffle_ps(v_b0, v_b1, mask_hi); + + __m128 layer1_chunk0 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_lo); + __m128 layer1_chunk3 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_hi); + __m128 layer1_chunk1 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_lo); + __m128 layer1_chunk4 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_hi); + __m128 layer1_chunk2 = _mm_shuffle_ps(layer2_chunk4, layer2_chunk5, mask_lo); + __m128 layer1_chunk5 = _mm_shuffle_ps(layer2_chunk4, layer2_chunk5, mask_hi); + + v_r0 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_lo); + v_g1 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_hi); + v_r1 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_lo); + v_b0 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_hi); + v_g0 = _mm_shuffle_ps(layer1_chunk4, layer1_chunk5, mask_lo); + v_b1 = _mm_shuffle_ps(layer1_chunk4, layer1_chunk5, mask_hi); +} + +inline void _mm_interleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, __m128 & v_g1, + __m128 & v_b0, __m128 & v_b1, __m128 & v_a0, __m128 & v_a1) +{ + enum { mask_lo = _MM_SHUFFLE(2, 0, 2, 0), mask_hi = _MM_SHUFFLE(3, 1, 3, 1) }; + + __m128 layer2_chunk0 = _mm_shuffle_ps(v_r0, v_r1, mask_lo); + __m128 layer2_chunk4 = _mm_shuffle_ps(v_r0, v_r1, mask_hi); + __m128 layer2_chunk1 = _mm_shuffle_ps(v_g0, v_g1, mask_lo); + __m128 layer2_chunk5 = _mm_shuffle_ps(v_g0, v_g1, mask_hi); + __m128 layer2_chunk2 = _mm_shuffle_ps(v_b0, v_b1, mask_lo); + __m128 layer2_chunk6 = _mm_shuffle_ps(v_b0, v_b1, mask_hi); + __m128 layer2_chunk3 = _mm_shuffle_ps(v_a0, v_a1, mask_lo); + __m128 layer2_chunk7 = _mm_shuffle_ps(v_a0, v_a1, mask_hi); + + __m128 layer1_chunk0 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_lo); + __m128 layer1_chunk4 = _mm_shuffle_ps(layer2_chunk0, layer2_chunk1, mask_hi); + __m128 layer1_chunk1 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_lo); + __m128 layer1_chunk5 = _mm_shuffle_ps(layer2_chunk2, layer2_chunk3, mask_hi); + __m128 layer1_chunk2 = _mm_shuffle_ps(layer2_chunk4, layer2_chunk5, mask_lo); + __m128 layer1_chunk6 = _mm_shuffle_ps(layer2_chunk4, layer2_chunk5, mask_hi); + __m128 layer1_chunk3 = _mm_shuffle_ps(layer2_chunk6, layer2_chunk7, mask_lo); + __m128 layer1_chunk7 = _mm_shuffle_ps(layer2_chunk6, layer2_chunk7, mask_hi); + + v_r0 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_lo); + v_b0 = _mm_shuffle_ps(layer1_chunk0, layer1_chunk1, mask_hi); + v_r1 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_lo); + v_b1 = _mm_shuffle_ps(layer1_chunk2, layer1_chunk3, mask_hi); + v_g0 = _mm_shuffle_ps(layer1_chunk4, layer1_chunk5, mask_lo); + v_a0 = _mm_shuffle_ps(layer1_chunk4, layer1_chunk5, mask_hi); + v_g1 = _mm_shuffle_ps(layer1_chunk6, layer1_chunk7, mask_lo); + v_a1 = _mm_shuffle_ps(layer1_chunk6, layer1_chunk7, mask_hi); +} + +#endif // CV_SSE2 + +//! @} + +#endif //OPENCV_CORE_SSE_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/traits.hpp b/Thirdparty/opencv2/include/opencv2/core/traits.hpp new file mode 100644 index 0000000..52ab083 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/traits.hpp @@ -0,0 +1,417 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_TRAITS_HPP +#define OPENCV_CORE_TRAITS_HPP + +#include "opencv2/core/cvdef.h" + +namespace cv +{ + +//#define OPENCV_TRAITS_ENABLE_DEPRECATED + +//! @addtogroup core_basic +//! @{ + +/** @brief Template "trait" class for OpenCV primitive data types. + +@note Deprecated. This is replaced by "single purpose" traits: traits::Type and traits::Depth + +A primitive OpenCV data type is one of unsigned char, bool, signed char, unsigned short, signed +short, int, float, double, or a tuple of values of one of these types, where all the values in the +tuple have the same type. Any primitive type from the list can be defined by an identifier in the +form CV_\{U|S|F}C(\), for example: uchar \~ CV_8UC1, 3-element +floating-point tuple \~ CV_32FC3, and so on. A universal OpenCV structure that is able to store a +single instance of such a primitive data type is Vec. Multiple instances of such a type can be +stored in a std::vector, Mat, Mat_, SparseMat, SparseMat_, or any other container that is able to +store Vec instances. + +The DataType class is basically used to provide a description of such primitive data types without +adding any fields or methods to the corresponding classes (and it is actually impossible to add +anything to primitive C/C++ data types). This technique is known in C++ as class traits. It is not +DataType itself that is used but its specialized versions, such as: +@code + template<> class DataType + { + typedef uchar value_type; + typedef int work_type; + typedef uchar channel_type; + enum { channel_type = CV_8U, channels = 1, fmt='u', type = CV_8U }; + }; + ... + template DataType > + { + typedef std::complex<_Tp> value_type; + typedef std::complex<_Tp> work_type; + typedef _Tp channel_type; + // DataDepth is another helper trait class + enum { depth = DataDepth<_Tp>::value, channels=2, + fmt=(channels-1)*256+DataDepth<_Tp>::fmt, + type=CV_MAKETYPE(depth, channels) }; + }; + ... +@endcode +The main purpose of this class is to convert compilation-time type information to an +OpenCV-compatible data type identifier, for example: +@code + // allocates a 30x40 floating-point matrix + Mat A(30, 40, DataType::type); + + Mat B = Mat_ >(3, 3); + // the statement below will print 6, 2 , that is depth == CV_64F, channels == 2 + cout << B.depth() << ", " << B.channels() << endl; +@endcode +So, such traits are used to tell OpenCV which data type you are working with, even if such a type is +not native to OpenCV. For example, the matrix B initialization above is compiled because OpenCV +defines the proper specialized template class DataType\ \> . This mechanism is also +useful (and used in OpenCV this way) for generic algorithms implementations. + +@note Default values were dropped to stop confusing developers about using of unsupported types (see #7599) +*/ +template class DataType +{ +public: +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + typedef _Tp value_type; + typedef value_type work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 1, + depth = -1, + channels = 1, + fmt = 0, + type = CV_MAKETYPE(depth, channels) + }; +#endif +}; + +template<> class DataType +{ +public: + typedef bool value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_8U, + channels = 1, + fmt = (int)'u', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef uchar value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_8U, + channels = 1, + fmt = (int)'u', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef schar value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_8S, + channels = 1, + fmt = (int)'c', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef schar value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_8S, + channels = 1, + fmt = (int)'c', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef ushort value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_16U, + channels = 1, + fmt = (int)'w', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef short value_type; + typedef int work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_16S, + channels = 1, + fmt = (int)'s', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef int value_type; + typedef value_type work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_32S, + channels = 1, + fmt = (int)'i', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef float value_type; + typedef value_type work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_32F, + channels = 1, + fmt = (int)'f', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef double value_type; + typedef value_type work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_64F, + channels = 1, + fmt = (int)'d', + type = CV_MAKETYPE(depth, channels) + }; +}; + +template<> class DataType +{ +public: + typedef float16_t value_type; + typedef float work_type; + typedef value_type channel_type; + typedef value_type vec_type; + enum { generic_type = 0, + depth = CV_16F, + channels = 1, + fmt = (int)'h', + type = CV_MAKETYPE(depth, channels) + }; +}; + +/** @brief A helper class for cv::DataType + +The class is specialized for each fundamental numerical data type supported by OpenCV. It provides +DataDepth::value constant. +*/ +template class DataDepth +{ +public: + enum + { + value = DataType<_Tp>::depth, + fmt = DataType<_Tp>::fmt + }; +}; + + +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + +template class TypeDepth +{ +#ifdef OPENCV_TRAITS_ENABLE_LEGACY_DEFAULTS + enum { depth = CV_USRTYPE1 }; + typedef void value_type; +#endif +}; + +template<> class TypeDepth +{ + enum { depth = CV_8U }; + typedef uchar value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_8S }; + typedef schar value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_16U }; + typedef ushort value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_16S }; + typedef short value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_32S }; + typedef int value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_32F }; + typedef float value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_64F }; + typedef double value_type; +}; + +template<> class TypeDepth +{ + enum { depth = CV_16F }; + typedef float16_t value_type; +}; + +#endif + +//! @} + +namespace traits { + +namespace internal { +#define CV_CREATE_MEMBER_CHECK(X) \ +template class CheckMember_##X { \ + struct Fallback { int X; }; \ + struct Derived : T, Fallback { }; \ + template struct Check; \ + typedef char CV_NO[1]; \ + typedef char CV_YES[2]; \ + template static CV_NO & func(Check *); \ + template static CV_YES & func(...); \ +public: \ + typedef CheckMember_##X type; \ + enum { value = sizeof(func(0)) == sizeof(CV_YES) }; \ +}; + +CV_CREATE_MEMBER_CHECK(fmt) +CV_CREATE_MEMBER_CHECK(type) + +} // namespace internal + + +template +struct Depth +{ enum { value = DataType::depth }; }; + +template +struct Type +{ enum { value = DataType::type }; }; + +/** Similar to traits::Type but has value = -1 in case of unknown type (instead of compiler error) */ +template >::value > +struct SafeType {}; + +template +struct SafeType +{ enum { value = -1 }; }; + +template +struct SafeType +{ enum { value = Type::value }; }; + + +template >::value > +struct SafeFmt {}; + +template +struct SafeFmt +{ enum { fmt = 0 }; }; + +template +struct SafeFmt +{ enum { fmt = DataType::fmt }; }; + + +} // namespace + +} // cv + +#endif // OPENCV_CORE_TRAITS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/types.hpp b/Thirdparty/opencv2/include/opencv2/core/types.hpp new file mode 100644 index 0000000..8a0886f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/types.hpp @@ -0,0 +1,2463 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_TYPES_HPP +#define OPENCV_CORE_TYPES_HPP + +#ifndef __cplusplus +# error types.hpp header must be compiled as C++ +#endif + +#include +#include +#include +#include + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/cvstd.hpp" +#include "opencv2/core/matx.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4459) // declaration of '...' hides global declaration +#endif + +namespace cv +{ + +//! @addtogroup core_basic +//! @{ + +//////////////////////////////// Complex ////////////////////////////// + +/** @brief A complex number class. + + The template class is similar and compatible with std::complex, however it provides slightly + more convenient access to the real and imaginary parts using through the simple field access, as opposite + to std::complex::real() and std::complex::imag(). +*/ +template class Complex +{ +public: + + //! default constructor + Complex(); + Complex( _Tp _re, _Tp _im = 0 ); + + //! conversion to another data type + template operator Complex() const; + //! conjugation + Complex conj() const; + + _Tp re, im; ///< the real and the imaginary parts +}; + +typedef Complex Complexf; +typedef Complex Complexd; + +template class DataType< Complex<_Tp> > +{ +public: + typedef Complex<_Tp> value_type; + typedef value_type work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 2, + fmt = DataType::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Complex<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Complex<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 2) }; }; +} // namespace + + +//////////////////////////////// Point_ //////////////////////////////// + +/** @brief Template class for 2D points specified by its coordinates `x` and `y`. + +An instance of the class is interchangeable with C structures, CvPoint and CvPoint2D32f . There is +also a cast operator to convert point coordinates to the specified type. The conversion from +floating-point coordinates to integer coordinates is done by rounding. Commonly, the conversion +uses this operation for each of the coordinates. Besides the class members listed in the +declaration above, the following operations on points are implemented: +@code + pt1 = pt2 + pt3; + pt1 = pt2 - pt3; + pt1 = pt2 * a; + pt1 = a * pt2; + pt1 = pt2 / a; + pt1 += pt2; + pt1 -= pt2; + pt1 *= a; + pt1 /= a; + double value = norm(pt); // L2 norm + pt1 == pt2; + pt1 != pt2; +@endcode +For your convenience, the following type aliases are defined: +@code + typedef Point_ Point2i; + typedef Point2i Point; + typedef Point_ Point2f; + typedef Point_ Point2d; +@endcode +Example: +@code + Point2f a(0.3f, 0.f), b(0.f, 0.4f); + Point pt = (a + b)*10.f; + cout << pt.x << ", " << pt.y << endl; +@endcode +*/ +template class Point_ +{ +public: + typedef _Tp value_type; + + //! default constructor + Point_(); + Point_(_Tp _x, _Tp _y); +#if (defined(__GNUC__) && __GNUC__ < 5) && !defined(__clang__) // GCC 4.x bug. Details: https://github.com/opencv/opencv/pull/20837 + Point_(const Point_& pt); + Point_(Point_&& pt) CV_NOEXCEPT = default; +#elif OPENCV_ABI_COMPATIBILITY < 500 + Point_(const Point_& pt) = default; + Point_(Point_&& pt) CV_NOEXCEPT = default; +#endif + Point_(const Size_<_Tp>& sz); + Point_(const Vec<_Tp, 2>& v); + +#if (defined(__GNUC__) && __GNUC__ < 5) && !defined(__clang__) // GCC 4.x bug. Details: https://github.com/opencv/opencv/pull/20837 + Point_& operator = (const Point_& pt); + Point_& operator = (Point_&& pt) CV_NOEXCEPT = default; +#elif OPENCV_ABI_COMPATIBILITY < 500 + Point_& operator = (const Point_& pt) = default; + Point_& operator = (Point_&& pt) CV_NOEXCEPT = default; +#endif + //! conversion to another data type + template operator Point_<_Tp2>() const; + + //! conversion to the old-style C structures + operator Vec<_Tp, 2>() const; + + //! dot product + _Tp dot(const Point_& pt) const; + //! dot product computed in double-precision arithmetics + double ddot(const Point_& pt) const; + //! cross-product + double cross(const Point_& pt) const; + //! checks whether the point is inside the specified rectangle + bool inside(const Rect_<_Tp>& r) const; + _Tp x; //!< x coordinate of the point + _Tp y; //!< y coordinate of the point +}; + +typedef Point_ Point2i; +typedef Point_ Point2l; +typedef Point_ Point2f; +typedef Point_ Point2d; +typedef Point2i Point; + +template class DataType< Point_<_Tp> > +{ +public: + typedef Point_<_Tp> value_type; + typedef Point_::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 2, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Point_<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Point_<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 2) }; }; +} // namespace + + +//////////////////////////////// Point3_ //////////////////////////////// + +/** @brief Template class for 3D points specified by its coordinates `x`, `y` and `z`. + +An instance of the class is interchangeable with the C structure CvPoint2D32f . Similarly to +Point_ , the coordinates of 3D points can be converted to another type. The vector arithmetic and +comparison operations are also supported. + +The following Point3_\<\> aliases are available: +@code + typedef Point3_ Point3i; + typedef Point3_ Point3f; + typedef Point3_ Point3d; +@endcode +@see cv::Point3i, cv::Point3f and cv::Point3d +*/ +template class Point3_ +{ +public: + typedef _Tp value_type; + + //! default constructor + Point3_(); + Point3_(_Tp _x, _Tp _y, _Tp _z); +#if OPENCV_ABI_COMPATIBILITY < 500 + Point3_(const Point3_& pt) = default; + Point3_(Point3_&& pt) CV_NOEXCEPT = default; +#endif + explicit Point3_(const Point_<_Tp>& pt); + Point3_(const Vec<_Tp, 3>& v); + +#if OPENCV_ABI_COMPATIBILITY < 500 + Point3_& operator = (const Point3_& pt) = default; + Point3_& operator = (Point3_&& pt) CV_NOEXCEPT = default; +#endif + //! conversion to another data type + template operator Point3_<_Tp2>() const; + //! conversion to cv::Vec<> + operator Vec<_Tp, 3>() const; + + //! dot product + _Tp dot(const Point3_& pt) const; + //! dot product computed in double-precision arithmetics + double ddot(const Point3_& pt) const; + //! cross product of the 2 3D points + Point3_ cross(const Point3_& pt) const; + _Tp x; //!< x coordinate of the 3D point + _Tp y; //!< y coordinate of the 3D point + _Tp z; //!< z coordinate of the 3D point +}; + +typedef Point3_ Point3i; +typedef Point3_ Point3f; +typedef Point3_ Point3d; + +template class DataType< Point3_<_Tp> > +{ +public: + typedef Point3_<_Tp> value_type; + typedef Point3_::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 3, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Point3_<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Point3_<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 3) }; }; +} // namespace + +//////////////////////////////// Size_ //////////////////////////////// + +/** @brief Template class for specifying the size of an image or rectangle. + +The class includes two members called width and height. The structure can be converted to and from +the old OpenCV structures CvSize and CvSize2D32f . The same set of arithmetic and comparison +operations as for Point_ is available. + +OpenCV defines the following Size_\<\> aliases: +@code + typedef Size_ Size2i; + typedef Size2i Size; + typedef Size_ Size2f; +@endcode +*/ +template class Size_ +{ +public: + typedef _Tp value_type; + + //! default constructor + Size_(); + Size_(_Tp _width, _Tp _height); +#if OPENCV_ABI_COMPATIBILITY < 500 + Size_(const Size_& sz) = default; + Size_(Size_&& sz) CV_NOEXCEPT = default; +#endif + Size_(const Point_<_Tp>& pt); + +#if OPENCV_ABI_COMPATIBILITY < 500 + Size_& operator = (const Size_& sz) = default; + Size_& operator = (Size_&& sz) CV_NOEXCEPT = default; +#endif + //! the area (width*height) + _Tp area() const; + //! aspect ratio (width/height) + double aspectRatio() const; + //! true if empty + bool empty() const; + + //! conversion of another data type. + template operator Size_<_Tp2>() const; + + _Tp width; //!< the width + _Tp height; //!< the height +}; + +typedef Size_ Size2i; +typedef Size_ Size2l; +typedef Size_ Size2f; +typedef Size_ Size2d; +typedef Size2i Size; + +template class DataType< Size_<_Tp> > +{ +public: + typedef Size_<_Tp> value_type; + typedef Size_::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 2, + fmt = DataType::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Size_<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Size_<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 2) }; }; +} // namespace + +//////////////////////////////// Rect_ //////////////////////////////// + +/** @brief Template class for 2D rectangles + +described by the following parameters: +- Coordinates of the top-left corner. This is a default interpretation of Rect_::x and Rect_::y + in OpenCV. Though, in your algorithms you may count x and y from the bottom-left corner. +- Rectangle width and height. + +OpenCV typically assumes that the top and left boundary of the rectangle are inclusive, while the +right and bottom boundaries are not. For example, the method Rect_::contains returns true if + +\f[x \leq pt.x < x+width, + y \leq pt.y < y+height\f] + +Virtually every loop over an image ROI in OpenCV (where ROI is specified by Rect_\ ) is +implemented as: +@code + for(int y = roi.y; y < roi.y + roi.height; y++) + for(int x = roi.x; x < roi.x + roi.width; x++) + { + // ... + } +@endcode +In addition to the class members, the following operations on rectangles are implemented: +- \f$\texttt{rect} = \texttt{rect} \pm \texttt{point}\f$ (shifting a rectangle by a certain offset) +- \f$\texttt{rect} = \texttt{rect} \pm \texttt{size}\f$ (expanding or shrinking a rectangle by a + certain amount) +- rect += point, rect -= point, rect += size, rect -= size (augmenting operations) +- rect = rect1 & rect2 (rectangle intersection) +- rect = rect1 | rect2 (minimum area rectangle containing rect1 and rect2 ) +- rect &= rect1, rect |= rect1 (and the corresponding augmenting operations) +- rect == rect1, rect != rect1 (rectangle comparison) + +This is an example how the partial ordering on rectangles can be established (rect1 \f$\subseteq\f$ +rect2): +@code + template inline bool + operator <= (const Rect_<_Tp>& r1, const Rect_<_Tp>& r2) + { + return (r1 & r2) == r1; + } +@endcode +For your convenience, the Rect_\<\> alias is available: cv::Rect +*/ +template class Rect_ +{ +public: + typedef _Tp value_type; + + //! default constructor + Rect_(); + Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height); +#if OPENCV_ABI_COMPATIBILITY < 500 + Rect_(const Rect_& r) = default; + Rect_(Rect_&& r) CV_NOEXCEPT = default; +#endif + Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz); + Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2); + +#if OPENCV_ABI_COMPATIBILITY < 500 + Rect_& operator = (const Rect_& r) = default; + Rect_& operator = (Rect_&& r) CV_NOEXCEPT = default; +#endif + //! the top-left corner + Point_<_Tp> tl() const; + //! the bottom-right corner + Point_<_Tp> br() const; + + //! size (width, height) of the rectangle + Size_<_Tp> size() const; + //! area (width*height) of the rectangle + _Tp area() const; + //! true if empty + bool empty() const; + + //! conversion to another data type + template operator Rect_<_Tp2>() const; + + //! checks whether the rectangle contains the point + bool contains(const Point_<_Tp>& pt) const; + + _Tp x; //!< x coordinate of the top-left corner + _Tp y; //!< y coordinate of the top-left corner + _Tp width; //!< width of the rectangle + _Tp height; //!< height of the rectangle +}; + +typedef Rect_ Rect2i; +typedef Rect_ Rect2f; +typedef Rect_ Rect2d; +typedef Rect2i Rect; + +template class DataType< Rect_<_Tp> > +{ +public: + typedef Rect_<_Tp> value_type; + typedef Rect_::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 4, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Rect_<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Rect_<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 4) }; }; +} // namespace + +///////////////////////////// RotatedRect ///////////////////////////// + +/** @brief The class represents rotated (i.e. not up-right) rectangles on a plane. + +Each rectangle is specified by the center point (mass center), length of each side (represented by +#Size2f structure) and the rotation angle in degrees. + +The sample below demonstrates how to use RotatedRect: +@snippet snippets/core_various.cpp RotatedRect_demo +![image](pics/rotatedrect.png) + +@sa CamShift, fitEllipse, minAreaRect, CvBox2D +*/ +class CV_EXPORTS_W_SIMPLE RotatedRect +{ +public: + //! default constructor + CV_WRAP RotatedRect(); + /** full constructor + @param center The rectangle mass center. + @param size Width and height of the rectangle. + @param angle The rotation angle in a clockwise direction. When the angle is 0, 90, 180, 270 etc., + the rectangle becomes an up-right rectangle. + */ + CV_WRAP RotatedRect(const Point2f& center, const Size2f& size, float angle); + /** + Any 3 end points of the RotatedRect. They must be given in order (either clockwise or + anticlockwise). + */ + CV_WRAP RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3); + + /** returns 4 vertices of the rotated rectangle + @param pts The points array for storing rectangle vertices. The order is _bottomLeft_, _topLeft_, topRight, bottomRight. + @note _Bottom_, _Top_, _Left_ and _Right_ sides refer to the original rectangle (angle is 0), + so after 180 degree rotation _bottomLeft_ point will be located at the top right corner of the + rectangle. + */ + void points(Point2f pts[]) const; + + CV_WRAP void points(CV_OUT std::vector& pts) const; + + //! returns the minimal up-right integer rectangle containing the rotated rectangle + CV_WRAP Rect boundingRect() const; + //! returns the minimal (exact) floating point rectangle containing the rotated rectangle, not intended for use with images + Rect_ boundingRect2f() const; + //! returns the rectangle mass center + CV_PROP_RW Point2f center; + //! returns width and height of the rectangle + CV_PROP_RW Size2f size; + //! returns the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle. + CV_PROP_RW float angle; +}; + +template<> class DataType< RotatedRect > +{ +public: + typedef RotatedRect value_type; + typedef value_type work_type; + typedef float channel_type; + + enum { generic_type = 0, + channels = (int)sizeof(value_type)/sizeof(channel_type), // 5 + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template<> +struct Depth< RotatedRect > { enum { value = Depth::value }; }; +template<> +struct Type< RotatedRect > { enum { value = CV_MAKETYPE(Depth::value, (int)sizeof(RotatedRect)/sizeof(float)) }; }; +} // namespace + + +//////////////////////////////// Range ///////////////////////////////// + +/** @brief Template class specifying a continuous subsequence (slice) of a sequence. + +The class is used to specify a row or a column span in a matrix ( Mat ) and for many other purposes. +Range(a,b) is basically the same as a:b in Matlab or a..b in Python. As in Python, start is an +inclusive left boundary of the range and end is an exclusive right boundary of the range. Such a +half-opened interval is usually denoted as \f$[start,end)\f$ . + +The static method Range::all() returns a special variable that means "the whole sequence" or "the +whole range", just like " : " in Matlab or " ... " in Python. All the methods and functions in +OpenCV that take Range support this special Range::all() value. But, of course, in case of your own +custom processing, you will probably have to check and handle it explicitly: +@code + void my_function(..., const Range& r, ....) + { + if(r == Range::all()) { + // process all the data + } + else { + // process [r.start, r.end) + } + } +@endcode +*/ +class CV_EXPORTS Range +{ +public: + Range(); + Range(int _start, int _end); + int size() const; + bool empty() const; + static Range all(); + + int start, end; +}; + +template<> class DataType +{ +public: + typedef Range value_type; + typedef value_type work_type; + typedef int channel_type; + + enum { generic_type = 0, + channels = 2, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template<> +struct Depth< Range > { enum { value = Depth::value }; }; +template<> +struct Type< Range > { enum { value = CV_MAKETYPE(Depth::value, 2) }; }; +} // namespace + + +//////////////////////////////// Scalar_ /////////////////////////////// + +/** @brief Template class for a 4-element vector derived from Vec. + +Being derived from Vec\<_Tp, 4\> , Scalar\_ and Scalar can be used just as typical 4-element +vectors. In addition, they can be converted to/from CvScalar . The type Scalar is widely used in +OpenCV to pass pixel values. +*/ +template class Scalar_ : public Vec<_Tp, 4> +{ +public: + //! default constructor + Scalar_(); + Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0); + Scalar_(_Tp v0); + + Scalar_(const Scalar_& s); + Scalar_(Scalar_&& s) CV_NOEXCEPT; + + Scalar_& operator=(const Scalar_& s); + Scalar_& operator=(Scalar_&& s) CV_NOEXCEPT; + + template + Scalar_(const Vec<_Tp2, cn>& v); + + //! returns a scalar with all elements set to v0 + static Scalar_<_Tp> all(_Tp v0); + + //! conversion to another data type + template operator Scalar_() const; + + //! per-element product + Scalar_<_Tp> mul(const Scalar_<_Tp>& a, double scale=1 ) const; + + //! returns (v0, -v1, -v2, -v3) + Scalar_<_Tp> conj() const; + + //! returns true iff v1 == v2 == v3 == 0 + bool isReal() const; +}; + +typedef Scalar_ Scalar; + +template class DataType< Scalar_<_Tp> > +{ +public: + typedef Scalar_<_Tp> value_type; + typedef Scalar_::work_type> work_type; + typedef _Tp channel_type; + + enum { generic_type = 0, + channels = 4, + fmt = traits::SafeFmt::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template +struct Depth< Scalar_<_Tp> > { enum { value = Depth<_Tp>::value }; }; +template +struct Type< Scalar_<_Tp> > { enum { value = CV_MAKETYPE(Depth<_Tp>::value, 4) }; }; +} // namespace + + +/////////////////////////////// KeyPoint //////////////////////////////// + +/** @brief Data structure for salient point detectors. + +The class instance stores a keypoint, i.e. a point feature found by one of many available keypoint +detectors, such as Harris corner detector, #FAST, %StarDetector, %SURF, %SIFT etc. + +The keypoint is characterized by the 2D position, scale (proportional to the diameter of the +neighborhood that needs to be taken into account), orientation and some other parameters. The +keypoint neighborhood is then analyzed by another algorithm that builds a descriptor (usually +represented as a feature vector). The keypoints representing the same object in different images +can then be matched using %KDTree or another method. +*/ +class CV_EXPORTS_W_SIMPLE KeyPoint +{ +public: + //! the default constructor + CV_WRAP KeyPoint(); + /** + @param pt x & y coordinates of the keypoint + @param size keypoint diameter + @param angle keypoint orientation + @param response keypoint detector response on the keypoint (that is, strength of the keypoint) + @param octave pyramid octave in which the keypoint has been detected + @param class_id object id + */ + KeyPoint(Point2f pt, float size, float angle=-1, float response=0, int octave=0, int class_id=-1); + /** + @param x x-coordinate of the keypoint + @param y y-coordinate of the keypoint + @param size keypoint diameter + @param angle keypoint orientation + @param response keypoint detector response on the keypoint (that is, strength of the keypoint) + @param octave pyramid octave in which the keypoint has been detected + @param class_id object id + */ + CV_WRAP KeyPoint(float x, float y, float size, float angle=-1, float response=0, int octave=0, int class_id=-1); + + size_t hash() const; + + /** + This method converts vector of keypoints to vector of points or the reverse, where each keypoint is + assigned the same size and the same orientation. + + @param keypoints Keypoints obtained from any feature detection algorithm like SIFT/SURF/ORB + @param points2f Array of (x,y) coordinates of each keypoint + @param keypointIndexes Array of indexes of keypoints to be converted to points. (Acts like a mask to + convert only specified keypoints) + */ + CV_WRAP static void convert(const std::vector& keypoints, + CV_OUT std::vector& points2f, + const std::vector& keypointIndexes=std::vector()); + /** @overload + @param points2f Array of (x,y) coordinates of each keypoint + @param keypoints Keypoints obtained from any feature detection algorithm like SIFT/SURF/ORB + @param size keypoint diameter + @param response keypoint detector response on the keypoint (that is, strength of the keypoint) + @param octave pyramid octave in which the keypoint has been detected + @param class_id object id + */ + CV_WRAP static void convert(const std::vector& points2f, + CV_OUT std::vector& keypoints, + float size=1, float response=1, int octave=0, int class_id=-1); + + /** + This method computes overlap for pair of keypoints. Overlap is the ratio between area of keypoint + regions' intersection and area of keypoint regions' union (considering keypoint region as circle). + If they don't overlap, we get zero. If they coincide at same location with same size, we get 1. + @param kp1 First keypoint + @param kp2 Second keypoint + */ + CV_WRAP static float overlap(const KeyPoint& kp1, const KeyPoint& kp2); + + CV_PROP_RW Point2f pt; //!< coordinates of the keypoints + CV_PROP_RW float size; //!< diameter of the meaningful keypoint neighborhood + CV_PROP_RW float angle; //!< computed orientation of the keypoint (-1 if not applicable); + //!< it's in [0,360) degrees and measured relative to + //!< image coordinate system, ie in clockwise. + CV_PROP_RW float response; //!< the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling + CV_PROP_RW int octave; //!< octave (pyramid layer) from which the keypoint has been extracted + CV_PROP_RW int class_id; //!< object class (if the keypoints need to be clustered by an object they belong to) +}; + +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED +template<> class DataType +{ +public: + typedef KeyPoint value_type; + typedef float work_type; + typedef float channel_type; + + enum { generic_type = 0, + depth = DataType::depth, + channels = (int)(sizeof(value_type)/sizeof(channel_type)), // 7 + fmt = DataType::fmt + ((channels - 1) << 8), + type = CV_MAKETYPE(depth, channels) + }; + + typedef Vec vec_type; +}; +#endif + + +//////////////////////////////// DMatch ///////////////////////////////// + +/** @brief Class for matching keypoint descriptors + +query descriptor index, train descriptor index, train image index, and distance between +descriptors. +*/ +class CV_EXPORTS_W_SIMPLE DMatch +{ +public: + CV_WRAP DMatch(); + CV_WRAP DMatch(int _queryIdx, int _trainIdx, float _distance); + CV_WRAP DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance); + + CV_PROP_RW int queryIdx; //!< query descriptor index + CV_PROP_RW int trainIdx; //!< train descriptor index + CV_PROP_RW int imgIdx; //!< train image index + + CV_PROP_RW float distance; + + // less is better + bool operator<(const DMatch &m) const; +}; + +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED +template<> class DataType +{ +public: + typedef DMatch value_type; + typedef int work_type; + typedef int channel_type; + + enum { generic_type = 0, + depth = DataType::depth, + channels = (int)(sizeof(value_type)/sizeof(channel_type)), // 4 + fmt = DataType::fmt + ((channels - 1) << 8), + type = CV_MAKETYPE(depth, channels) + }; + + typedef Vec vec_type; +}; +#endif + + +///////////////////////////// TermCriteria ////////////////////////////// + +/** @brief The class defining termination criteria for iterative algorithms. + +You can initialize it by default constructor and then override any parameters, or the structure may +be fully initialized using the advanced variant of the constructor. +*/ +class CV_EXPORTS TermCriteria +{ +public: + /** + Criteria type, can be one of: COUNT, EPS or COUNT + EPS + */ + enum Type + { + COUNT=1, //!< the maximum number of iterations or elements to compute + MAX_ITER=COUNT, //!< ditto + EPS=2 //!< the desired accuracy or change in parameters at which the iterative algorithm stops + }; + + //! default constructor + TermCriteria(); + /** + @param type The type of termination criteria, one of TermCriteria::Type + @param maxCount The maximum number of iterations or elements to compute. + @param epsilon The desired accuracy or change in parameters at which the iterative algorithm stops. + */ + TermCriteria(int type, int maxCount, double epsilon); + + inline bool isValid() const + { + const bool isCount = (type & COUNT) && maxCount > 0; + const bool isEps = (type & EPS) && !cvIsNaN(epsilon); + return isCount || isEps; + } + + int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS + int maxCount; //!< the maximum number of iterations/elements + double epsilon; //!< the desired accuracy +}; + + +//! @} core_basic + +///////////////////////// raster image moments ////////////////////////// + +//! @addtogroup imgproc_shape +//! @{ + +/** @brief struct returned by cv::moments + +The spatial moments \f$\texttt{Moments::m}_{ji}\f$ are computed as: + +\f[\texttt{m} _{ji}= \sum _{x,y} \left ( \texttt{array} (x,y) \cdot x^j \cdot y^i \right )\f] + +The central moments \f$\texttt{Moments::mu}_{ji}\f$ are computed as: + +\f[\texttt{mu} _{ji}= \sum _{x,y} \left ( \texttt{array} (x,y) \cdot (x - \bar{x} )^j \cdot (y - \bar{y} )^i \right )\f] + +where \f$(\bar{x}, \bar{y})\f$ is the mass center: + +\f[\bar{x} = \frac{\texttt{m}_{10}}{\texttt{m}_{00}} , \; \bar{y} = \frac{\texttt{m}_{01}}{\texttt{m}_{00}}\f] + +The normalized central moments \f$\texttt{Moments::nu}_{ij}\f$ are computed as: + +\f[\texttt{nu} _{ji}= \frac{\texttt{mu}_{ji}}{\texttt{m}_{00}^{(i+j)/2+1}} .\f] + +@note +\f$\texttt{mu}_{00}=\texttt{m}_{00}\f$, \f$\texttt{nu}_{00}=1\f$ +\f$\texttt{nu}_{10}=\texttt{mu}_{10}=\texttt{mu}_{01}=\texttt{mu}_{10}=0\f$ , hence the values are not +stored. + +The moments of a contour are defined in the same way but computed using the Green's formula (see +). So, due to a limited raster resolution, the moments +computed for a contour are slightly different from the moments computed for the same rasterized +contour. + +@note +Since the contour moments are computed using Green formula, you may get seemingly odd results for +contours with self-intersections, e.g. a zero area (m00) for butterfly-shaped contours. + */ +class CV_EXPORTS_W_MAP Moments +{ +public: + //! the default constructor + Moments(); + //! the full constructor + Moments(double m00, double m10, double m01, double m20, double m11, + double m02, double m30, double m21, double m12, double m03 ); + ////! the conversion from CvMoments + //Moments( const CvMoments& moments ); + ////! the conversion to CvMoments + //operator CvMoments() const; + + //! @name spatial moments + //! @{ + CV_PROP_RW double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; + //! @} + + //! @name central moments + //! @{ + CV_PROP_RW double mu20, mu11, mu02, mu30, mu21, mu12, mu03; + //! @} + + //! @name central normalized moments + //! @{ + CV_PROP_RW double nu20, nu11, nu02, nu30, nu21, nu12, nu03; + //! @} +}; + +template<> class DataType +{ +public: + typedef Moments value_type; + typedef double work_type; + typedef double channel_type; + + enum { generic_type = 0, + channels = (int)(sizeof(value_type)/sizeof(channel_type)), // 24 + fmt = DataType::fmt + ((channels - 1) << 8) +#ifdef OPENCV_TRAITS_ENABLE_DEPRECATED + ,depth = DataType::depth + ,type = CV_MAKETYPE(depth, channels) +#endif + }; + + typedef Vec vec_type; +}; + +namespace traits { +template<> +struct Depth< Moments > { enum { value = Depth::value }; }; +template<> +struct Type< Moments > { enum { value = CV_MAKETYPE(Depth::value, (int)(sizeof(Moments)/sizeof(double))) }; }; +} // namespace + +//! @} imgproc_shape + +//! @cond IGNORED + +///////////////////////////////////////////////////////////////////////// +///////////////////////////// Implementation //////////////////////////// +///////////////////////////////////////////////////////////////////////// + +//////////////////////////////// Complex //////////////////////////////// + +template inline +Complex<_Tp>::Complex() + : re(0), im(0) {} + +template inline +Complex<_Tp>::Complex( _Tp _re, _Tp _im ) + : re(_re), im(_im) {} + +template template inline +Complex<_Tp>::operator Complex() const +{ + return Complex(saturate_cast(re), saturate_cast(im)); +} + +template inline +Complex<_Tp> Complex<_Tp>::conj() const +{ + return Complex<_Tp>(re, -im); +} + + +template static inline +bool operator == (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + return a.re == b.re && a.im == b.im; +} + +template static inline +bool operator != (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + return a.re != b.re || a.im != b.im; +} + +template static inline +Complex<_Tp> operator + (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + return Complex<_Tp>( a.re + b.re, a.im + b.im ); +} + +template static inline +Complex<_Tp>& operator += (Complex<_Tp>& a, const Complex<_Tp>& b) +{ + a.re += b.re; a.im += b.im; + return a; +} + +template static inline +Complex<_Tp> operator - (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + return Complex<_Tp>( a.re - b.re, a.im - b.im ); +} + +template static inline +Complex<_Tp>& operator -= (Complex<_Tp>& a, const Complex<_Tp>& b) +{ + a.re -= b.re; a.im -= b.im; + return a; +} + +template static inline +Complex<_Tp> operator - (const Complex<_Tp>& a) +{ + return Complex<_Tp>(-a.re, -a.im); +} + +template static inline +Complex<_Tp> operator * (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + return Complex<_Tp>( a.re*b.re - a.im*b.im, a.re*b.im + a.im*b.re ); +} + +template static inline +Complex<_Tp> operator * (const Complex<_Tp>& a, _Tp b) +{ + return Complex<_Tp>( a.re*b, a.im*b ); +} + +template static inline +Complex<_Tp> operator * (_Tp b, const Complex<_Tp>& a) +{ + return Complex<_Tp>( a.re*b, a.im*b ); +} + +template static inline +Complex<_Tp> operator + (const Complex<_Tp>& a, _Tp b) +{ + return Complex<_Tp>( a.re + b, a.im ); +} + +template static inline +Complex<_Tp> operator - (const Complex<_Tp>& a, _Tp b) +{ return Complex<_Tp>( a.re - b, a.im ); } + +template static inline +Complex<_Tp> operator + (_Tp b, const Complex<_Tp>& a) +{ + return Complex<_Tp>( a.re + b, a.im ); +} + +template static inline +Complex<_Tp> operator - (_Tp b, const Complex<_Tp>& a) +{ + return Complex<_Tp>( b - a.re, -a.im ); +} + +template static inline +Complex<_Tp>& operator += (Complex<_Tp>& a, _Tp b) +{ + a.re += b; return a; +} + +template static inline +Complex<_Tp>& operator -= (Complex<_Tp>& a, _Tp b) +{ + a.re -= b; return a; +} + +template static inline +Complex<_Tp>& operator *= (Complex<_Tp>& a, _Tp b) +{ + a.re *= b; a.im *= b; return a; +} + +template static inline +double abs(const Complex<_Tp>& a) +{ + return std::sqrt( (double)a.re*a.re + (double)a.im*a.im); +} + +template static inline +Complex<_Tp> operator / (const Complex<_Tp>& a, const Complex<_Tp>& b) +{ + double t = 1./((double)b.re*b.re + (double)b.im*b.im); + return Complex<_Tp>( (_Tp)((a.re*b.re + a.im*b.im)*t), + (_Tp)((-a.re*b.im + a.im*b.re)*t) ); +} + +template static inline +Complex<_Tp>& operator /= (Complex<_Tp>& a, const Complex<_Tp>& b) +{ + a = a / b; + return a; +} + +template static inline +Complex<_Tp> operator / (const Complex<_Tp>& a, _Tp b) +{ + _Tp t = (_Tp)1/b; + return Complex<_Tp>( a.re*t, a.im*t ); +} + +template static inline +Complex<_Tp> operator / (_Tp b, const Complex<_Tp>& a) +{ + return Complex<_Tp>(b)/a; +} + +template static inline +Complex<_Tp> operator /= (const Complex<_Tp>& a, _Tp b) +{ + _Tp t = (_Tp)1/b; + a.re *= t; a.im *= t; return a; +} + + + +//////////////////////////////// 2D Point /////////////////////////////// + +template inline +Point_<_Tp>::Point_() + : x(0), y(0) {} + +template inline +Point_<_Tp>::Point_(_Tp _x, _Tp _y) + : x(_x), y(_y) {} + +#if (defined(__GNUC__) && __GNUC__ < 5) && !defined(__clang__) // GCC 4.x bug. Details: https://github.com/opencv/opencv/pull/20837 +template inline +Point_<_Tp>::Point_(const Point_& pt) + : x(pt.x), y(pt.y) {} +#endif + +template inline +Point_<_Tp>::Point_(const Size_<_Tp>& sz) + : x(sz.width), y(sz.height) {} + +template inline +Point_<_Tp>::Point_(const Vec<_Tp,2>& v) + : x(v[0]), y(v[1]) {} + +#if (defined(__GNUC__) && __GNUC__ < 5) && !defined(__clang__) // GCC 4.x bug. Details: https://github.com/opencv/opencv/pull/20837 +template inline +Point_<_Tp>& Point_<_Tp>::operator = (const Point_& pt) +{ + x = pt.x; y = pt.y; + return *this; +} +#endif + +template template inline +Point_<_Tp>::operator Point_<_Tp2>() const +{ + return Point_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y)); +} + +template inline +Point_<_Tp>::operator Vec<_Tp, 2>() const +{ + return Vec<_Tp, 2>(x, y); +} + +template inline +_Tp Point_<_Tp>::dot(const Point_& pt) const +{ + return saturate_cast<_Tp>(x*pt.x + y*pt.y); +} + +template inline +double Point_<_Tp>::ddot(const Point_& pt) const +{ + return (double)x*(double)(pt.x) + (double)y*(double)(pt.y); +} + +template inline +double Point_<_Tp>::cross(const Point_& pt) const +{ + return (double)x*pt.y - (double)y*pt.x; +} + +template inline bool +Point_<_Tp>::inside( const Rect_<_Tp>& r ) const +{ + return r.contains(*this); +} + + +template static inline +Point_<_Tp>& operator += (Point_<_Tp>& a, const Point_<_Tp>& b) +{ + a.x += b.x; + a.y += b.y; + return a; +} + +template static inline +Point_<_Tp>& operator -= (Point_<_Tp>& a, const Point_<_Tp>& b) +{ + a.x -= b.x; + a.y -= b.y; + return a; +} + +template static inline +Point_<_Tp>& operator *= (Point_<_Tp>& a, int b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + return a; +} + +template static inline +Point_<_Tp>& operator *= (Point_<_Tp>& a, float b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + return a; +} + +template static inline +Point_<_Tp>& operator *= (Point_<_Tp>& a, double b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + return a; +} + +template static inline +Point_<_Tp>& operator /= (Point_<_Tp>& a, int b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + return a; +} + +template static inline +Point_<_Tp>& operator /= (Point_<_Tp>& a, float b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + return a; +} + +template static inline +Point_<_Tp>& operator /= (Point_<_Tp>& a, double b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + return a; +} + +template static inline +double norm(const Point_<_Tp>& pt) +{ + return std::sqrt((double)pt.x*pt.x + (double)pt.y*pt.y); +} + +template static inline +bool operator == (const Point_<_Tp>& a, const Point_<_Tp>& b) +{ + return a.x == b.x && a.y == b.y; +} + +template static inline +bool operator != (const Point_<_Tp>& a, const Point_<_Tp>& b) +{ + return a.x != b.x || a.y != b.y; +} + +template static inline +Point_<_Tp> operator + (const Point_<_Tp>& a, const Point_<_Tp>& b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(a.x + b.x), saturate_cast<_Tp>(a.y + b.y) ); +} + +template static inline +Point_<_Tp> operator - (const Point_<_Tp>& a, const Point_<_Tp>& b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(a.x - b.x), saturate_cast<_Tp>(a.y - b.y) ); +} + +template static inline +Point_<_Tp> operator - (const Point_<_Tp>& a) +{ + return Point_<_Tp>( saturate_cast<_Tp>(-a.x), saturate_cast<_Tp>(-a.y) ); +} + +template static inline +Point_<_Tp> operator * (const Point_<_Tp>& a, int b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) ); +} + +template static inline +Point_<_Tp> operator * (int a, const Point_<_Tp>& b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) ); +} + +template static inline +Point_<_Tp> operator * (const Point_<_Tp>& a, float b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) ); +} + +template static inline +Point_<_Tp> operator * (float a, const Point_<_Tp>& b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) ); +} + +template static inline +Point_<_Tp> operator * (const Point_<_Tp>& a, double b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b) ); +} + +template static inline +Point_<_Tp> operator * (double a, const Point_<_Tp>& b) +{ + return Point_<_Tp>( saturate_cast<_Tp>(b.x*a), saturate_cast<_Tp>(b.y*a) ); +} + +template static inline +Point_<_Tp> operator * (const Matx<_Tp, 2, 2>& a, const Point_<_Tp>& b) +{ + Matx<_Tp, 2, 1> tmp = a * Vec<_Tp,2>(b.x, b.y); + return Point_<_Tp>(tmp.val[0], tmp.val[1]); +} + +template static inline +Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point_<_Tp>& b) +{ + Matx<_Tp, 3, 1> tmp = a * Vec<_Tp,3>(b.x, b.y, 1); + return Point3_<_Tp>(tmp.val[0], tmp.val[1], tmp.val[2]); +} + +template static inline +Point_<_Tp> operator / (const Point_<_Tp>& a, int b) +{ + Point_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + +template static inline +Point_<_Tp> operator / (const Point_<_Tp>& a, float b) +{ + Point_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + +template static inline +Point_<_Tp> operator / (const Point_<_Tp>& a, double b) +{ + Point_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + + +template static inline _AccTp normL2Sqr(const Point_& pt); +template static inline _AccTp normL2Sqr(const Point_& pt); +template static inline _AccTp normL2Sqr(const Point_& pt); +template static inline _AccTp normL2Sqr(const Point_& pt); + +template<> inline int normL2Sqr(const Point_& pt) { return pt.dot(pt); } +template<> inline int64 normL2Sqr(const Point_& pt) { return pt.dot(pt); } +template<> inline float normL2Sqr(const Point_& pt) { return pt.dot(pt); } +template<> inline double normL2Sqr(const Point_& pt) { return pt.dot(pt); } + +template<> inline double normL2Sqr(const Point_& pt) { return pt.ddot(pt); } +template<> inline double normL2Sqr(const Point_& pt) { return pt.ddot(pt); } + + + +//////////////////////////////// 3D Point /////////////////////////////// + +template inline +Point3_<_Tp>::Point3_() + : x(0), y(0), z(0) {} + +template inline +Point3_<_Tp>::Point3_(_Tp _x, _Tp _y, _Tp _z) + : x(_x), y(_y), z(_z) {} + +template inline +Point3_<_Tp>::Point3_(const Point_<_Tp>& pt) + : x(pt.x), y(pt.y), z(_Tp()) {} + +template inline +Point3_<_Tp>::Point3_(const Vec<_Tp, 3>& v) + : x(v[0]), y(v[1]), z(v[2]) {} + +template template inline +Point3_<_Tp>::operator Point3_<_Tp2>() const +{ + return Point3_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y), saturate_cast<_Tp2>(z)); +} + +template inline +Point3_<_Tp>::operator Vec<_Tp, 3>() const +{ + return Vec<_Tp, 3>(x, y, z); +} + +template inline +_Tp Point3_<_Tp>::dot(const Point3_& pt) const +{ + return saturate_cast<_Tp>(x*pt.x + y*pt.y + z*pt.z); +} + +template inline +double Point3_<_Tp>::ddot(const Point3_& pt) const +{ + return (double)x*pt.x + (double)y*pt.y + (double)z*pt.z; +} + +template inline +Point3_<_Tp> Point3_<_Tp>::cross(const Point3_<_Tp>& pt) const +{ + return Point3_<_Tp>(y*pt.z - z*pt.y, z*pt.x - x*pt.z, x*pt.y - y*pt.x); +} + + +template static inline +Point3_<_Tp>& operator += (Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + a.x += b.x; + a.y += b.y; + a.z += b.z; + return a; +} + +template static inline +Point3_<_Tp>& operator -= (Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + a.x -= b.x; + a.y -= b.y; + a.z -= b.z; + return a; +} + +template static inline +Point3_<_Tp>& operator *= (Point3_<_Tp>& a, int b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + a.z = saturate_cast<_Tp>(a.z * b); + return a; +} + +template static inline +Point3_<_Tp>& operator *= (Point3_<_Tp>& a, float b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + a.z = saturate_cast<_Tp>(a.z * b); + return a; +} + +template static inline +Point3_<_Tp>& operator *= (Point3_<_Tp>& a, double b) +{ + a.x = saturate_cast<_Tp>(a.x * b); + a.y = saturate_cast<_Tp>(a.y * b); + a.z = saturate_cast<_Tp>(a.z * b); + return a; +} + +template static inline +Point3_<_Tp>& operator /= (Point3_<_Tp>& a, int b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + a.z = saturate_cast<_Tp>(a.z / b); + return a; +} + +template static inline +Point3_<_Tp>& operator /= (Point3_<_Tp>& a, float b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + a.z = saturate_cast<_Tp>(a.z / b); + return a; +} + +template static inline +Point3_<_Tp>& operator /= (Point3_<_Tp>& a, double b) +{ + a.x = saturate_cast<_Tp>(a.x / b); + a.y = saturate_cast<_Tp>(a.y / b); + a.z = saturate_cast<_Tp>(a.z / b); + return a; +} + +template static inline +double norm(const Point3_<_Tp>& pt) +{ + return std::sqrt((double)pt.x*pt.x + (double)pt.y*pt.y + (double)pt.z*pt.z); +} + +template static inline +bool operator == (const Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + return a.x == b.x && a.y == b.y && a.z == b.z; +} + +template static inline +bool operator != (const Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + return a.x != b.x || a.y != b.y || a.z != b.z; +} + +template static inline +Point3_<_Tp> operator + (const Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(a.x + b.x), saturate_cast<_Tp>(a.y + b.y), saturate_cast<_Tp>(a.z + b.z)); +} + +template static inline +Point3_<_Tp> operator - (const Point3_<_Tp>& a, const Point3_<_Tp>& b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(a.x - b.x), saturate_cast<_Tp>(a.y - b.y), saturate_cast<_Tp>(a.z - b.z)); +} + +template static inline +Point3_<_Tp> operator - (const Point3_<_Tp>& a) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(-a.x), saturate_cast<_Tp>(-a.y), saturate_cast<_Tp>(-a.z) ); +} + +template static inline +Point3_<_Tp> operator * (const Point3_<_Tp>& a, int b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(a.x*b), saturate_cast<_Tp>(a.y*b), saturate_cast<_Tp>(a.z*b) ); +} + +template static inline +Point3_<_Tp> operator * (int a, const Point3_<_Tp>& b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) ); +} + +template static inline +Point3_<_Tp> operator * (const Point3_<_Tp>& a, float b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(a.x * b), saturate_cast<_Tp>(a.y * b), saturate_cast<_Tp>(a.z * b) ); +} + +template static inline +Point3_<_Tp> operator * (float a, const Point3_<_Tp>& b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) ); +} + +template static inline +Point3_<_Tp> operator * (const Point3_<_Tp>& a, double b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(a.x * b), saturate_cast<_Tp>(a.y * b), saturate_cast<_Tp>(a.z * b) ); +} + +template static inline +Point3_<_Tp> operator * (double a, const Point3_<_Tp>& b) +{ + return Point3_<_Tp>( saturate_cast<_Tp>(b.x * a), saturate_cast<_Tp>(b.y * a), saturate_cast<_Tp>(b.z * a) ); +} + +template static inline +Point3_<_Tp> operator * (const Matx<_Tp, 3, 3>& a, const Point3_<_Tp>& b) +{ + Matx<_Tp, 3, 1> tmp = a * Vec<_Tp,3>(b.x, b.y, b.z); + return Point3_<_Tp>(tmp.val[0], tmp.val[1], tmp.val[2]); +} + +template static inline +Matx<_Tp, 4, 1> operator * (const Matx<_Tp, 4, 4>& a, const Point3_<_Tp>& b) +{ + return a * Matx<_Tp, 4, 1>(b.x, b.y, b.z, 1); +} + +template static inline +Point3_<_Tp> operator / (const Point3_<_Tp>& a, int b) +{ + Point3_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + +template static inline +Point3_<_Tp> operator / (const Point3_<_Tp>& a, float b) +{ + Point3_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + +template static inline +Point3_<_Tp> operator / (const Point3_<_Tp>& a, double b) +{ + Point3_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + + + +////////////////////////////////// Size ///////////////////////////////// + +template inline +Size_<_Tp>::Size_() + : width(0), height(0) {} + +template inline +Size_<_Tp>::Size_(_Tp _width, _Tp _height) + : width(_width), height(_height) {} + +template inline +Size_<_Tp>::Size_(const Point_<_Tp>& pt) + : width(pt.x), height(pt.y) {} + +template template inline +Size_<_Tp>::operator Size_<_Tp2>() const +{ + return Size_<_Tp2>(saturate_cast<_Tp2>(width), saturate_cast<_Tp2>(height)); +} + +template inline +_Tp Size_<_Tp>::area() const +{ + const _Tp result = width * height; + CV_DbgAssert(!std::numeric_limits<_Tp>::is_integer + || width == 0 || result / width == height); // make sure the result fits in the return value + return result; +} + +template inline +double Size_<_Tp>::aspectRatio() const +{ + return width / static_cast(height); +} + +template inline +bool Size_<_Tp>::empty() const +{ + return width <= 0 || height <= 0; +} + + +template static inline +Size_<_Tp>& operator *= (Size_<_Tp>& a, _Tp b) +{ + a.width *= b; + a.height *= b; + return a; +} + +template static inline +Size_<_Tp> operator * (const Size_<_Tp>& a, _Tp b) +{ + Size_<_Tp> tmp(a); + tmp *= b; + return tmp; +} + +template static inline +Size_<_Tp>& operator /= (Size_<_Tp>& a, _Tp b) +{ + a.width /= b; + a.height /= b; + return a; +} + +template static inline +Size_<_Tp> operator / (const Size_<_Tp>& a, _Tp b) +{ + Size_<_Tp> tmp(a); + tmp /= b; + return tmp; +} + +template static inline +Size_<_Tp>& operator += (Size_<_Tp>& a, const Size_<_Tp>& b) +{ + a.width += b.width; + a.height += b.height; + return a; +} + +template static inline +Size_<_Tp> operator + (const Size_<_Tp>& a, const Size_<_Tp>& b) +{ + Size_<_Tp> tmp(a); + tmp += b; + return tmp; +} + +template static inline +Size_<_Tp>& operator -= (Size_<_Tp>& a, const Size_<_Tp>& b) +{ + a.width -= b.width; + a.height -= b.height; + return a; +} + +template static inline +Size_<_Tp> operator - (const Size_<_Tp>& a, const Size_<_Tp>& b) +{ + Size_<_Tp> tmp(a); + tmp -= b; + return tmp; +} + +template static inline +bool operator == (const Size_<_Tp>& a, const Size_<_Tp>& b) +{ + return a.width == b.width && a.height == b.height; +} + +template static inline +bool operator != (const Size_<_Tp>& a, const Size_<_Tp>& b) +{ + return !(a == b); +} + + + +////////////////////////////////// Rect ///////////////////////////////// + +template inline +Rect_<_Tp>::Rect_() + : x(0), y(0), width(0), height(0) {} + +template inline +Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height) + : x(_x), y(_y), width(_width), height(_height) {} + +template inline +Rect_<_Tp>::Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz) + : x(org.x), y(org.y), width(sz.width), height(sz.height) {} + +template inline +Rect_<_Tp>::Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2) +{ + x = std::min(pt1.x, pt2.x); + y = std::min(pt1.y, pt2.y); + width = std::max(pt1.x, pt2.x) - x; + height = std::max(pt1.y, pt2.y) - y; +} + +template inline +Point_<_Tp> Rect_<_Tp>::tl() const +{ + return Point_<_Tp>(x,y); +} + +template inline +Point_<_Tp> Rect_<_Tp>::br() const +{ + return Point_<_Tp>(x + width, y + height); +} + +template inline +Size_<_Tp> Rect_<_Tp>::size() const +{ + return Size_<_Tp>(width, height); +} + +template inline +_Tp Rect_<_Tp>::area() const +{ + const _Tp result = width * height; + CV_DbgAssert(!std::numeric_limits<_Tp>::is_integer + || width == 0 || result / width == height); // make sure the result fits in the return value + return result; +} + +template inline +bool Rect_<_Tp>::empty() const +{ + return width <= 0 || height <= 0; +} + +template template inline +Rect_<_Tp>::operator Rect_<_Tp2>() const +{ + return Rect_<_Tp2>(saturate_cast<_Tp2>(x), saturate_cast<_Tp2>(y), saturate_cast<_Tp2>(width), saturate_cast<_Tp2>(height)); +} + +template inline +bool Rect_<_Tp>::contains(const Point_<_Tp>& pt) const +{ + return x <= pt.x && pt.x < x + width && y <= pt.y && pt.y < y + height; +} + + +template static inline +Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Point_<_Tp>& b ) +{ + a.x += b.x; + a.y += b.y; + return a; +} + +template static inline +Rect_<_Tp>& operator -= ( Rect_<_Tp>& a, const Point_<_Tp>& b ) +{ + a.x -= b.x; + a.y -= b.y; + return a; +} + +template static inline +Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Size_<_Tp>& b ) +{ + a.width += b.width; + a.height += b.height; + return a; +} + +template static inline +Rect_<_Tp>& operator -= ( Rect_<_Tp>& a, const Size_<_Tp>& b ) +{ + const _Tp width = a.width - b.width; + const _Tp height = a.height - b.height; + CV_DbgAssert(width >= 0 && height >= 0); + a.width = width; + a.height = height; + return a; +} + +template static inline +Rect_<_Tp>& operator &= ( Rect_<_Tp>& a, const Rect_<_Tp>& b ) +{ + if (a.empty() || b.empty()) { + a = Rect(); + return a; + } + const Rect_<_Tp>& Rx_min = (a.x < b.x) ? a : b; + const Rect_<_Tp>& Rx_max = (a.x < b.x) ? b : a; + const Rect_<_Tp>& Ry_min = (a.y < b.y) ? a : b; + const Rect_<_Tp>& Ry_max = (a.y < b.y) ? b : a; + // Looking at the formula below, we will compute Rx_min.width - (Rx_max.x - Rx_min.x) + // but we want to avoid overflows. Rx_min.width >= 0 and (Rx_max.x - Rx_min.x) >= 0 + // by definition so the difference does not overflow. The only thing that can overflow + // is (Rx_max.x - Rx_min.x). And it can only overflow if Rx_min.x < 0. + // Let us first deal with the following case. + if ((Rx_min.x < 0 && Rx_min.x + Rx_min.width < Rx_max.x) || + (Ry_min.y < 0 && Ry_min.y + Ry_min.height < Ry_max.y)) { + a = Rect(); + return a; + } + // We now know that either Rx_min.x >= 0, or + // Rx_min.x < 0 && Rx_min.x + Rx_min.width >= Rx_max.x and therefore + // Rx_min.width >= (Rx_max.x - Rx_min.x) which means (Rx_max.x - Rx_min.x) + // is inferior to a valid int and therefore does not overflow. + a.width = std::min(Rx_min.width - (Rx_max.x - Rx_min.x), Rx_max.width); + a.height = std::min(Ry_min.height - (Ry_max.y - Ry_min.y), Ry_max.height); + a.x = Rx_max.x; + a.y = Ry_max.y; + if (a.empty()) + a = Rect(); + return a; +} + +template static inline +Rect_<_Tp>& operator |= ( Rect_<_Tp>& a, const Rect_<_Tp>& b ) +{ + if (a.empty()) { + a = b; + } + else if (!b.empty()) { + _Tp x1 = std::min(a.x, b.x); + _Tp y1 = std::min(a.y, b.y); + a.width = std::max(a.x + a.width, b.x + b.width) - x1; + a.height = std::max(a.y + a.height, b.y + b.height) - y1; + a.x = x1; + a.y = y1; + } + return a; +} + +template static inline +bool operator == (const Rect_<_Tp>& a, const Rect_<_Tp>& b) +{ + return a.x == b.x && a.y == b.y && a.width == b.width && a.height == b.height; +} + +template static inline +bool operator != (const Rect_<_Tp>& a, const Rect_<_Tp>& b) +{ + return a.x != b.x || a.y != b.y || a.width != b.width || a.height != b.height; +} + +template static inline +Rect_<_Tp> operator + (const Rect_<_Tp>& a, const Point_<_Tp>& b) +{ + return Rect_<_Tp>( a.x + b.x, a.y + b.y, a.width, a.height ); +} + +template static inline +Rect_<_Tp> operator - (const Rect_<_Tp>& a, const Point_<_Tp>& b) +{ + return Rect_<_Tp>( a.x - b.x, a.y - b.y, a.width, a.height ); +} + +template static inline +Rect_<_Tp> operator + (const Rect_<_Tp>& a, const Size_<_Tp>& b) +{ + return Rect_<_Tp>( a.x, a.y, a.width + b.width, a.height + b.height ); +} + +template static inline +Rect_<_Tp> operator - (const Rect_<_Tp>& a, const Size_<_Tp>& b) +{ + const _Tp width = a.width - b.width; + const _Tp height = a.height - b.height; + CV_DbgAssert(width >= 0 && height >= 0); + return Rect_<_Tp>( a.x, a.y, width, height ); +} + +template static inline +Rect_<_Tp> operator & (const Rect_<_Tp>& a, const Rect_<_Tp>& b) +{ + Rect_<_Tp> c = a; + return c &= b; +} + +template static inline +Rect_<_Tp> operator | (const Rect_<_Tp>& a, const Rect_<_Tp>& b) +{ + Rect_<_Tp> c = a; + return c |= b; +} + +/** + * @brief measure dissimilarity between two sample sets + * + * computes the complement of the Jaccard Index as described in . + * For rectangles this reduces to computing the intersection over the union. + */ +template static inline +double jaccardDistance(const Rect_<_Tp>& a, const Rect_<_Tp>& b) { + _Tp Aa = a.area(); + _Tp Ab = b.area(); + + if ((Aa + Ab) <= std::numeric_limits<_Tp>::epsilon()) { + // jaccard_index = 1 -> distance = 0 + return 0.0; + } + + double Aab = (a & b).area(); + // distance = 1 - jaccard_index + return 1.0 - Aab / (Aa + Ab - Aab); +} + +/** @brief Finds out if there is any intersection between two rectangles + * + * mainly useful for language bindings + * @param a First rectangle + * @param b Second rectangle + * @return the area of the intersection + */ +CV_EXPORTS_W inline double rectangleIntersectionArea(const Rect2d& a, const Rect2d& b) { return (a & b).area(); } + +////////////////////////////// RotatedRect ////////////////////////////// + +inline +RotatedRect::RotatedRect() + : center(), size(), angle(0) {} + +inline +RotatedRect::RotatedRect(const Point2f& _center, const Size2f& _size, float _angle) + : center(_center), size(_size), angle(_angle) {} + +///////////////////////////////// Range ///////////////////////////////// + +inline +Range::Range() + : start(0), end(0) {} + +inline +Range::Range(int _start, int _end) + : start(_start), end(_end) {} + +inline +int Range::size() const +{ + return end - start; +} + +inline +bool Range::empty() const +{ + return start == end; +} + +inline +Range Range::all() +{ + return Range(INT_MIN, INT_MAX); +} + + +static inline +bool operator == (const Range& r1, const Range& r2) +{ + return r1.start == r2.start && r1.end == r2.end; +} + +static inline +bool operator != (const Range& r1, const Range& r2) +{ + return !(r1 == r2); +} + +static inline +bool operator !(const Range& r) +{ + return r.start == r.end; +} + +static inline +Range operator & (const Range& r1, const Range& r2) +{ + Range r(std::max(r1.start, r2.start), std::min(r1.end, r2.end)); + r.end = std::max(r.end, r.start); + return r; +} + +static inline +Range& operator &= (Range& r1, const Range& r2) +{ + r1 = r1 & r2; + return r1; +} + +static inline +Range operator + (const Range& r1, int delta) +{ + return Range(r1.start + delta, r1.end + delta); +} + +static inline +Range operator + (int delta, const Range& r1) +{ + return Range(r1.start + delta, r1.end + delta); +} + +static inline +Range operator - (const Range& r1, int delta) +{ + return r1 + (-delta); +} + + + +///////////////////////////////// Scalar //////////////////////////////// + +template inline +Scalar_<_Tp>::Scalar_() +{ + this->val[0] = this->val[1] = this->val[2] = this->val[3] = 0; +} + +template inline +Scalar_<_Tp>::Scalar_(_Tp v0, _Tp v1, _Tp v2, _Tp v3) +{ + this->val[0] = v0; + this->val[1] = v1; + this->val[2] = v2; + this->val[3] = v3; +} + +template inline +Scalar_<_Tp>::Scalar_(const Scalar_<_Tp>& s) : Vec<_Tp, 4>(s) { +} + +template inline +Scalar_<_Tp>::Scalar_(Scalar_<_Tp>&& s) CV_NOEXCEPT { + this->val[0] = std::move(s.val[0]); + this->val[1] = std::move(s.val[1]); + this->val[2] = std::move(s.val[2]); + this->val[3] = std::move(s.val[3]); +} + +template inline +Scalar_<_Tp>& Scalar_<_Tp>::operator=(const Scalar_<_Tp>& s) { + this->val[0] = s.val[0]; + this->val[1] = s.val[1]; + this->val[2] = s.val[2]; + this->val[3] = s.val[3]; + return *this; +} + +template inline +Scalar_<_Tp>& Scalar_<_Tp>::operator=(Scalar_<_Tp>&& s) CV_NOEXCEPT { + this->val[0] = std::move(s.val[0]); + this->val[1] = std::move(s.val[1]); + this->val[2] = std::move(s.val[2]); + this->val[3] = std::move(s.val[3]); + return *this; +} + +template template inline +Scalar_<_Tp>::Scalar_(const Vec<_Tp2, cn>& v) +{ + int i; + for( i = 0; i < (cn < 4 ? cn : 4); i++ ) + this->val[i] = cv::saturate_cast<_Tp>(v.val[i]); + for( ; i < 4; i++ ) + this->val[i] = 0; +} + +template inline +Scalar_<_Tp>::Scalar_(_Tp v0) +{ + this->val[0] = v0; + this->val[1] = this->val[2] = this->val[3] = 0; +} + +template inline +Scalar_<_Tp> Scalar_<_Tp>::all(_Tp v0) +{ + return Scalar_<_Tp>(v0, v0, v0, v0); +} + + +template inline +Scalar_<_Tp> Scalar_<_Tp>::mul(const Scalar_<_Tp>& a, double scale ) const +{ + return Scalar_<_Tp>(saturate_cast<_Tp>(this->val[0] * a.val[0] * scale), + saturate_cast<_Tp>(this->val[1] * a.val[1] * scale), + saturate_cast<_Tp>(this->val[2] * a.val[2] * scale), + saturate_cast<_Tp>(this->val[3] * a.val[3] * scale)); +} + +template inline +Scalar_<_Tp> Scalar_<_Tp>::conj() const +{ + return Scalar_<_Tp>(saturate_cast<_Tp>( this->val[0]), + saturate_cast<_Tp>(-this->val[1]), + saturate_cast<_Tp>(-this->val[2]), + saturate_cast<_Tp>(-this->val[3])); +} + +template inline +bool Scalar_<_Tp>::isReal() const +{ + return this->val[1] == 0 && this->val[2] == 0 && this->val[3] == 0; +} + + +template template inline +Scalar_<_Tp>::operator Scalar_() const +{ + return Scalar_(saturate_cast(this->val[0]), + saturate_cast(this->val[1]), + saturate_cast(this->val[2]), + saturate_cast(this->val[3])); +} + + +template static inline +Scalar_<_Tp>& operator += (Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + a.val[0] += b.val[0]; + a.val[1] += b.val[1]; + a.val[2] += b.val[2]; + a.val[3] += b.val[3]; + return a; +} + +template static inline +Scalar_<_Tp>& operator -= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + a.val[0] -= b.val[0]; + a.val[1] -= b.val[1]; + a.val[2] -= b.val[2]; + a.val[3] -= b.val[3]; + return a; +} + +template static inline +Scalar_<_Tp>& operator *= ( Scalar_<_Tp>& a, _Tp v ) +{ + a.val[0] *= v; + a.val[1] *= v; + a.val[2] *= v; + a.val[3] *= v; + return a; +} + +template static inline +bool operator == ( const Scalar_<_Tp>& a, const Scalar_<_Tp>& b ) +{ + return a.val[0] == b.val[0] && a.val[1] == b.val[1] && + a.val[2] == b.val[2] && a.val[3] == b.val[3]; +} + +template static inline +bool operator != ( const Scalar_<_Tp>& a, const Scalar_<_Tp>& b ) +{ + return a.val[0] != b.val[0] || a.val[1] != b.val[1] || + a.val[2] != b.val[2] || a.val[3] != b.val[3]; +} + +template static inline +Scalar_<_Tp> operator + (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + return Scalar_<_Tp>(a.val[0] + b.val[0], + a.val[1] + b.val[1], + a.val[2] + b.val[2], + a.val[3] + b.val[3]); +} + +template static inline +Scalar_<_Tp> operator - (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + return Scalar_<_Tp>(saturate_cast<_Tp>(a.val[0] - b.val[0]), + saturate_cast<_Tp>(a.val[1] - b.val[1]), + saturate_cast<_Tp>(a.val[2] - b.val[2]), + saturate_cast<_Tp>(a.val[3] - b.val[3])); +} + +template static inline +Scalar_<_Tp> operator * (const Scalar_<_Tp>& a, _Tp alpha) +{ + return Scalar_<_Tp>(a.val[0] * alpha, + a.val[1] * alpha, + a.val[2] * alpha, + a.val[3] * alpha); +} + +template static inline +Scalar_<_Tp> operator * (_Tp alpha, const Scalar_<_Tp>& a) +{ + return a*alpha; +} + +template static inline +Scalar_<_Tp> operator - (const Scalar_<_Tp>& a) +{ + return Scalar_<_Tp>(saturate_cast<_Tp>(-a.val[0]), + saturate_cast<_Tp>(-a.val[1]), + saturate_cast<_Tp>(-a.val[2]), + saturate_cast<_Tp>(-a.val[3])); +} + + +template static inline +Scalar_<_Tp> operator * (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + return Scalar_<_Tp>(saturate_cast<_Tp>(a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3]), + saturate_cast<_Tp>(a[0]*b[1] + a[1]*b[0] + a[2]*b[3] - a[3]*b[2]), + saturate_cast<_Tp>(a[0]*b[2] - a[1]*b[3] + a[2]*b[0] + a[3]*b[1]), + saturate_cast<_Tp>(a[0]*b[3] + a[1]*b[2] - a[2]*b[1] + a[3]*b[0])); +} + +template static inline +Scalar_<_Tp>& operator *= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + a = a * b; + return a; +} + +template static inline +Scalar_<_Tp> operator / (const Scalar_<_Tp>& a, _Tp alpha) +{ + return Scalar_<_Tp>(a.val[0] / alpha, + a.val[1] / alpha, + a.val[2] / alpha, + a.val[3] / alpha); +} + +template static inline +Scalar_ operator / (const Scalar_& a, float alpha) +{ + float s = 1 / alpha; + return Scalar_(a.val[0] * s, a.val[1] * s, a.val[2] * s, a.val[3] * s); +} + +template static inline +Scalar_ operator / (const Scalar_& a, double alpha) +{ + double s = 1 / alpha; + return Scalar_(a.val[0] * s, a.val[1] * s, a.val[2] * s, a.val[3] * s); +} + +template static inline +Scalar_<_Tp>& operator /= (Scalar_<_Tp>& a, _Tp alpha) +{ + a = a / alpha; + return a; +} + +template static inline +Scalar_<_Tp> operator / (_Tp a, const Scalar_<_Tp>& b) +{ + _Tp s = a / (b[0]*b[0] + b[1]*b[1] + b[2]*b[2] + b[3]*b[3]); + return b.conj() * s; +} + +template static inline +Scalar_<_Tp> operator / (const Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + return a * ((_Tp)1 / b); +} + +template static inline +Scalar_<_Tp>& operator /= (Scalar_<_Tp>& a, const Scalar_<_Tp>& b) +{ + a = a / b; + return a; +} + +template static inline +Scalar operator * (const Matx<_Tp, 4, 4>& a, const Scalar& b) +{ + Matx c((Matx)a, b, Matx_MatMulOp()); + return reinterpret_cast(c); +} + +template<> inline +Scalar operator * (const Matx& a, const Scalar& b) +{ + Matx c(a, b, Matx_MatMulOp()); + return reinterpret_cast(c); +} + + + +//////////////////////////////// KeyPoint /////////////////////////////// + +inline +KeyPoint::KeyPoint() + : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {} + +inline +KeyPoint::KeyPoint(Point2f _pt, float _size, float _angle, float _response, int _octave, int _class_id) + : pt(_pt), size(_size), angle(_angle), response(_response), octave(_octave), class_id(_class_id) {} + +inline +KeyPoint::KeyPoint(float x, float y, float _size, float _angle, float _response, int _octave, int _class_id) + : pt(x, y), size(_size), angle(_angle), response(_response), octave(_octave), class_id(_class_id) {} + + + +///////////////////////////////// DMatch //////////////////////////////// + +inline +DMatch::DMatch() + : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(FLT_MAX) {} + +inline +DMatch::DMatch(int _queryIdx, int _trainIdx, float _distance) + : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {} + +inline +DMatch::DMatch(int _queryIdx, int _trainIdx, int _imgIdx, float _distance) + : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {} + +inline +bool DMatch::operator < (const DMatch &m) const +{ + return distance < m.distance; +} + + + +////////////////////////////// TermCriteria ///////////////////////////// + +inline +TermCriteria::TermCriteria() + : type(0), maxCount(0), epsilon(0) {} + +inline +TermCriteria::TermCriteria(int _type, int _maxCount, double _epsilon) + : type(_type), maxCount(_maxCount), epsilon(_epsilon) {} + +//! @endcond + +} // cv + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#endif //OPENCV_CORE_TYPES_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/types_c.h b/Thirdparty/opencv2/include/opencv2/core/types_c.h new file mode 100644 index 0000000..32f3c8c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/types_c.h @@ -0,0 +1,2126 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_TYPES_H +#define OPENCV_CORE_TYPES_H + +#ifdef CV__ENABLE_C_API_CTORS // invalid C API ctors (must be removed) +#if defined(_WIN32) && !defined(CV__SKIP_MESSAGE_MALFORMED_C_API_CTORS) +#error "C API ctors don't work on Win32: https://github.com/opencv/opencv/issues/15990" +#endif +#endif + +//#define CV__VALIDATE_UNUNITIALIZED_VARS 1 // C++11 & GCC only + +#ifdef __cplusplus + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#define CV_STRUCT_INITIALIZER {0,} +#else +#if defined(__GNUC__) && __GNUC__ == 4 // GCC 4.x warns on "= {}" initialization, fixed in GCC 5.0 +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif +#define CV_STRUCT_INITIALIZER {} +#endif + +#else +#define CV_STRUCT_INITIALIZER {0} +#endif + + +#ifdef HAVE_IPL +# ifndef __IPL_H__ +# if defined _WIN32 +# include +# else +# include +# endif +# endif +#elif defined __IPL_H__ +# define HAVE_IPL +#endif + +#include "opencv2/core/cvdef.h" + +#ifndef SKIP_INCLUDES +#include +#include +#include +#include +#endif // SKIP_INCLUDES + +#if defined _WIN32 +# define CV_CDECL __cdecl +# define CV_STDCALL __stdcall +#else +# define CV_CDECL +# define CV_STDCALL +#endif + +#ifndef CV_DEFAULT +# ifdef __cplusplus +# define CV_DEFAULT(val) = val +# else +# define CV_DEFAULT(val) +# endif +#endif + +#ifndef CV_EXTERN_C_FUNCPTR +# ifdef __cplusplus +# define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; } +# else +# define CV_EXTERN_C_FUNCPTR(x) typedef x +# endif +#endif + +#ifndef CVAPI +# define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL +#endif + +#ifndef CV_IMPL +# define CV_IMPL CV_EXTERN_C +#endif + +#ifdef __cplusplus +# include "opencv2/core.hpp" +#endif + +/** @addtogroup core_c + @{ +*/ + +/** @brief This is the "metatype" used *only* as a function parameter. + +It denotes that the function accepts arrays of multiple types, such as IplImage*, CvMat* or even +CvSeq* sometimes. The particular array type is determined at runtime by analyzing the first 4 +bytes of the header. In C++ interface the role of CvArr is played by InputArray and OutputArray. + */ +typedef void CvArr; + +typedef int CVStatus; + +/** @see cv::Error::Code */ +enum { + CV_StsOk= 0, /**< everything is ok */ + CV_StsBackTrace= -1, /**< pseudo error for back trace */ + CV_StsError= -2, /**< unknown /unspecified error */ + CV_StsInternal= -3, /**< internal error (bad state) */ + CV_StsNoMem= -4, /**< insufficient memory */ + CV_StsBadArg= -5, /**< function arg/param is bad */ + CV_StsBadFunc= -6, /**< unsupported function */ + CV_StsNoConv= -7, /**< iter. didn't converge */ + CV_StsAutoTrace= -8, /**< tracing */ + CV_HeaderIsNull= -9, /**< image header is NULL */ + CV_BadImageSize= -10, /**< image size is invalid */ + CV_BadOffset= -11, /**< offset is invalid */ + CV_BadDataPtr= -12, /**/ + CV_BadStep= -13, /**< image step is wrong, this may happen for a non-continuous matrix */ + CV_BadModelOrChSeq= -14, /**/ + CV_BadNumChannels= -15, /**< bad number of channels, for example, some functions accept only single channel matrices */ + CV_BadNumChannel1U= -16, /**/ + CV_BadDepth= -17, /**< input image depth is not supported by the function */ + CV_BadAlphaChannel= -18, /**/ + CV_BadOrder= -19, /**< number of dimensions is out of range */ + CV_BadOrigin= -20, /**< incorrect input origin */ + CV_BadAlign= -21, /**< incorrect input align */ + CV_BadCallBack= -22, /**/ + CV_BadTileSize= -23, /**/ + CV_BadCOI= -24, /**< input COI is not supported */ + CV_BadROISize= -25, /**< incorrect input roi */ + CV_MaskIsTiled= -26, /**/ + CV_StsNullPtr= -27, /**< null pointer */ + CV_StsVecLengthErr= -28, /**< incorrect vector length */ + CV_StsFilterStructContentErr= -29, /**< incorrect filter structure content */ + CV_StsKernelStructContentErr= -30, /**< incorrect transform kernel content */ + CV_StsFilterOffsetErr= -31, /**< incorrect filter offset value */ + CV_StsBadSize= -201, /**< the input/output structure size is incorrect */ + CV_StsDivByZero= -202, /**< division by zero */ + CV_StsInplaceNotSupported= -203, /**< in-place operation is not supported */ + CV_StsObjectNotFound= -204, /**< request can't be completed */ + CV_StsUnmatchedFormats= -205, /**< formats of input/output arrays differ */ + CV_StsBadFlag= -206, /**< flag is wrong or not supported */ + CV_StsBadPoint= -207, /**< bad CvPoint */ + CV_StsBadMask= -208, /**< bad format of mask (neither 8uC1 nor 8sC1)*/ + CV_StsUnmatchedSizes= -209, /**< sizes of input/output structures do not match */ + CV_StsUnsupportedFormat= -210, /**< the data format/type is not supported by the function*/ + CV_StsOutOfRange= -211, /**< some of parameters are out of range */ + CV_StsParseError= -212, /**< invalid syntax/structure of the parsed file */ + CV_StsNotImplemented= -213, /**< the requested function/feature is not implemented */ + CV_StsBadMemBlock= -214, /**< an allocated block has been corrupted */ + CV_StsAssert= -215, /**< assertion failed */ + CV_GpuNotSupported= -216, /**< no CUDA support */ + CV_GpuApiCallError= -217, /**< GPU API call error */ + CV_OpenGlNotSupported= -218, /**< no OpenGL support */ + CV_OpenGlApiCallError= -219, /**< OpenGL API call error */ + CV_OpenCLApiCallError= -220, /**< OpenCL API call error */ + CV_OpenCLDoubleNotSupported= -221, + CV_OpenCLInitError= -222, /**< OpenCL initialization error */ + CV_OpenCLNoAMDBlasFft= -223 +}; + +/****************************************************************************************\ +* Common macros and inline functions * +\****************************************************************************************/ + +#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t)) + +/** min & max without jumps */ +#define CV_IMIN(a, b) ((a) ^ (((a)^(b)) & (((a) < (b)) - 1))) + +#define CV_IMAX(a, b) ((a) ^ (((a)^(b)) & (((a) > (b)) - 1))) + +/** absolute value without jumps */ +#ifndef __cplusplus +# define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0)) +#else +# define CV_IABS(a) abs(a) +#endif +#define CV_CMP(a,b) (((a) > (b)) - ((a) < (b))) +#define CV_SIGN(a) CV_CMP((a),0) + +#define cvInvSqrt(value) ((float)(1./sqrt(value))) +#define cvSqrt(value) ((float)sqrt(value)) + + +/*************** Random number generation *******************/ + +typedef uint64 CvRNG; + +#define CV_RNG_COEFF 4164903690U + +/** @brief Initializes a random number generator state. + +The function initializes a random number generator and returns the state. The pointer to the state +can be then passed to the cvRandInt, cvRandReal and cvRandArr functions. In the current +implementation a multiply-with-carry generator is used. +@param seed 64-bit value used to initiate a random sequence +@sa the C++ class RNG replaced CvRNG. + */ +CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1)) +{ + CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1; + return rng; +} + +/** @brief Returns a 32-bit unsigned integer and updates RNG. + +The function returns a uniformly-distributed random 32-bit unsigned integer and updates the RNG +state. It is similar to the rand() function from the C runtime library, except that OpenCV functions +always generates a 32-bit random number, regardless of the platform. +@param rng CvRNG state initialized by cvRNG. + */ +CV_INLINE unsigned cvRandInt( CvRNG* rng ) +{ + uint64 temp = *rng; + temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> 32); + *rng = temp; + return (unsigned)temp; +} + +/** @brief Returns a floating-point random number and updates RNG. + +The function returns a uniformly-distributed random floating-point number between 0 and 1 (1 is not +included). +@param rng RNG state initialized by cvRNG + */ +CV_INLINE double cvRandReal( CvRNG* rng ) +{ + return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */; +} + +/****************************************************************************************\ +* Image type (IplImage) * +\****************************************************************************************/ + +#ifndef HAVE_IPL + +/* + * The following definitions (until #endif) + * is an extract from IPL headers. + * Copyright (c) 1995 Intel Corporation. + */ +#define IPL_DEPTH_SIGN 0x80000000 + +#define IPL_DEPTH_1U 1 +#define IPL_DEPTH_8U 8 +#define IPL_DEPTH_16U 16 +#define IPL_DEPTH_32F 32 + +#define IPL_DEPTH_8S (IPL_DEPTH_SIGN| 8) +#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16) +#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32) + +#define IPL_DATA_ORDER_PIXEL 0 +#define IPL_DATA_ORDER_PLANE 1 + +#define IPL_ORIGIN_TL 0 +#define IPL_ORIGIN_BL 1 + +#define IPL_ALIGN_4BYTES 4 +#define IPL_ALIGN_8BYTES 8 +#define IPL_ALIGN_16BYTES 16 +#define IPL_ALIGN_32BYTES 32 + +#define IPL_ALIGN_DWORD IPL_ALIGN_4BYTES +#define IPL_ALIGN_QWORD IPL_ALIGN_8BYTES + +#define IPL_BORDER_CONSTANT 0 +#define IPL_BORDER_REPLICATE 1 +#define IPL_BORDER_REFLECT 2 +#define IPL_BORDER_WRAP 3 + +#ifdef __cplusplus +typedef struct _IplImage IplImage; +CV_EXPORTS _IplImage cvIplImage(const cv::Mat& m); +#endif + +/** The IplImage is taken from the Intel Image Processing Library, in which the format is native. OpenCV +only supports a subset of possible IplImage formats, as outlined in the parameter list above. + +In addition to the above restrictions, OpenCV handles ROIs differently. OpenCV functions require +that the image size or ROI size of all source and destination images match exactly. On the other +hand, the Intel Image Processing Library processes the area of intersection between the source and +destination images (or ROIs), allowing them to vary independently. +*/ +typedef struct +_IplImage +{ + int nSize; /**< sizeof(IplImage) */ + int ID; /**< version (=0)*/ + int nChannels; /**< Most of OpenCV functions support 1,2,3 or 4 channels */ + int alphaChannel; /**< Ignored by OpenCV */ + int depth; /**< Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, + IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */ + char colorModel[4]; /**< Ignored by OpenCV */ + char channelSeq[4]; /**< ditto */ + int dataOrder; /**< 0 - interleaved color channels, 1 - separate color channels. + cvCreateImage can only create interleaved images */ + int origin; /**< 0 - top-left origin, + 1 - bottom-left origin (Windows bitmaps style). */ + int align; /**< Alignment of image rows (4 or 8). + OpenCV ignores it and uses widthStep instead. */ + int width; /**< Image width in pixels. */ + int height; /**< Image height in pixels. */ + struct _IplROI *roi; /**< Image ROI. If NULL, the whole image is selected. */ + struct _IplImage *maskROI; /**< Must be NULL. */ + void *imageId; /**< " " */ + struct _IplTileInfo *tileInfo; /**< " " */ + int imageSize; /**< Image data size in bytes + (==image->height*image->widthStep + in case of interleaved data)*/ + char *imageData; /**< Pointer to aligned image data. */ + int widthStep; /**< Size of aligned image row in bytes. */ + int BorderMode[4]; /**< Ignored by OpenCV. */ + int BorderConst[4]; /**< Ditto. */ + char *imageDataOrigin; /**< Pointer to very origin of image data + (not necessarily aligned) - + needed for correct deallocation */ + +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + _IplImage() + { + memset(this, 0, sizeof(*this)); // valid for POD structure + nSize = sizeof(IplImage); + } + _IplImage(const cv::Mat& m) { *this = cvIplImage(m); } +#endif +} +IplImage; + +CV_INLINE IplImage cvIplImage() +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + IplImage self = CV_STRUCT_INITIALIZER; self.nSize = sizeof(IplImage); return self; +#else + return _IplImage(); +#endif +} + +typedef struct _IplTileInfo IplTileInfo; + +typedef struct _IplROI +{ + int coi; /**< 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/ + int xOffset; + int yOffset; + int width; + int height; +} +IplROI; + +typedef struct _IplConvKernel +{ + int nCols; + int nRows; + int anchorX; + int anchorY; + int *values; + int nShiftR; +} +IplConvKernel; + +typedef struct _IplConvKernelFP +{ + int nCols; + int nRows; + int anchorX; + int anchorY; + float *values; +} +IplConvKernelFP; + +#define IPL_IMAGE_HEADER 1 +#define IPL_IMAGE_DATA 2 +#define IPL_IMAGE_ROI 4 + +#endif/*HAVE_IPL*/ + +/** extra border mode */ +#define IPL_BORDER_REFLECT_101 4 +#define IPL_BORDER_TRANSPARENT 5 + +#define IPL_IMAGE_MAGIC_VAL ((int)sizeof(IplImage)) +#define CV_TYPE_NAME_IMAGE "opencv-image" + +#define CV_IS_IMAGE_HDR(img) \ + ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage)) + +#define CV_IS_IMAGE(img) \ + (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL) + +/** for storing double-precision + floating point data in IplImage's */ +#define IPL_DEPTH_64F 64 + +/** get reference to pixel at (col,row), + for multi-channel images (col) should be multiplied by number of channels */ +#define CV_IMAGE_ELEM( image, elemtype, row, col ) \ + (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)]) + +/****************************************************************************************\ +* Matrix type (CvMat) * +\****************************************************************************************/ + +#define CV_AUTO_STEP 0x7fffffff +#define CV_WHOLE_ARR cvSlice( 0, 0x3fffffff ) + +#define CV_MAGIC_MASK 0xFFFF0000 +#define CV_MAT_MAGIC_VAL 0x42420000 +#define CV_TYPE_NAME_MAT "opencv-matrix" + +#ifdef __cplusplus +typedef struct CvMat CvMat; +CV_INLINE CvMat cvMat(const cv::Mat& m); +#endif + +/** Matrix elements are stored row by row. Element (i, j) (i - 0-based row index, j - 0-based column +index) of a matrix can be retrieved or modified using CV_MAT_ELEM macro: + + uchar pixval = CV_MAT_ELEM(grayimg, uchar, i, j) + CV_MAT_ELEM(cameraMatrix, float, 0, 2) = image.width*0.5f; + +To access multiple-channel matrices, you can use +CV_MAT_ELEM(matrix, type, i, j\*nchannels + channel_idx). + +@deprecated CvMat is now obsolete; consider using Mat instead. + */ +typedef struct CvMat +{ + int type; + int step; + + /* for internal use only */ + int* refcount; + int hdr_refcount; + + union + { + uchar* ptr; + short* s; + int* i; + float* fl; + double* db; + } data; + +#ifdef __cplusplus + union + { + int rows; + int height; + }; + + union + { + int cols; + int width; + }; +#else + int rows; + int cols; +#endif + +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvMat() {} + CvMat(const cv::Mat& m) { *this = cvMat(m); } +#endif +} +CvMat; + + +#define CV_IS_MAT_HDR(mat) \ + ((mat) != NULL && \ + (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \ + ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0) + +#define CV_IS_MAT_HDR_Z(mat) \ + ((mat) != NULL && \ + (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \ + ((const CvMat*)(mat))->cols >= 0 && ((const CvMat*)(mat))->rows >= 0) + +#define CV_IS_MAT(mat) \ + (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL) + +#define CV_IS_MASK_ARR(mat) \ + (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0) + +#define CV_ARE_TYPES_EQ(mat1, mat2) \ + ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0) + +#define CV_ARE_CNS_EQ(mat1, mat2) \ + ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0) + +#define CV_ARE_DEPTHS_EQ(mat1, mat2) \ + ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0) + +#define CV_ARE_SIZES_EQ(mat1, mat2) \ + ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols) + +#define CV_IS_MAT_CONST(mat) \ + (((mat)->rows|(mat)->cols) == 1) + +#define IPL2CV_DEPTH(depth) \ + ((((CV_8U)+(CV_16U<<4)+(CV_32F<<8)+(CV_64F<<16)+(CV_8S<<20)+ \ + (CV_16S<<24)+(CV_32S<<28)) >> ((((depth) & 0xF0) >> 2) + \ + (((depth) & IPL_DEPTH_SIGN) ? 20 : 0))) & 15) + +/** Inline constructor. No data is allocated internally!!! + * (Use together with cvCreateData, or use cvCreateMat instead to + * get a matrix with allocated data): + */ +CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL)) +{ + CvMat m; + + assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F ); + type = CV_MAT_TYPE(type); + m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type; + m.cols = cols; + m.rows = rows; + m.step = m.cols*CV_ELEM_SIZE(type); + m.data.ptr = (uchar*)data; + m.refcount = NULL; + m.hdr_refcount = 0; + + return m; +} + +#ifdef __cplusplus + +CV_INLINE CvMat cvMat(const cv::Mat& m) +{ + CvMat self; + CV_DbgAssert(m.dims <= 2); + self = cvMat(m.rows, m.dims == 1 ? 1 : m.cols, m.type(), m.data); + self.step = (int)m.step[0]; + self.type = (self.type & ~cv::Mat::CONTINUOUS_FLAG) | (m.flags & cv::Mat::CONTINUOUS_FLAG); + return self; +} +CV_INLINE CvMat cvMat() +{ +#if !defined(CV__ENABLE_C_API_CTORS) + CvMat self = CV_STRUCT_INITIALIZER; return self; +#else + return CvMat(); +#endif +} +CV_INLINE CvMat cvMat(const CvMat& m) +{ +#if !defined(CV__ENABLE_C_API_CTORS) + CvMat self = CV_STRUCT_INITIALIZER; memcpy(&self, &m, sizeof(self)); return self; +#else + return CvMat(m); +#endif +} + +#endif // __cplusplus + + +#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size ) \ + (assert( (unsigned)(row) < (unsigned)(mat).rows && \ + (unsigned)(col) < (unsigned)(mat).cols ), \ + (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col)) + +#define CV_MAT_ELEM_PTR( mat, row, col ) \ + CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) ) + +#define CV_MAT_ELEM( mat, elemtype, row, col ) \ + (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype))) + +/** @brief Returns the particular element of single-channel floating-point matrix. + +The function is a fast replacement for cvGetReal2D in the case of single-channel floating-point +matrices. It is faster because it is inline, it does fewer checks for array type and array element +type, and it checks for the row and column ranges only in debug mode. +@param mat Input matrix +@param row The zero-based index of row +@param col The zero-based index of column + */ +CV_INLINE double cvmGet( const CvMat* mat, int row, int col ) +{ + int type; + + type = CV_MAT_TYPE(mat->type); + assert( (unsigned)row < (unsigned)mat->rows && + (unsigned)col < (unsigned)mat->cols ); + + if( type == CV_32FC1 ) + return ((float*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col]; + else + { + assert( type == CV_64FC1 ); + return ((double*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col]; + } +} + +/** @brief Sets a specific element of a single-channel floating-point matrix. + +The function is a fast replacement for cvSetReal2D in the case of single-channel floating-point +matrices. It is faster because it is inline, it does fewer checks for array type and array element +type, and it checks for the row and column ranges only in debug mode. +@param mat The matrix +@param row The zero-based index of row +@param col The zero-based index of column +@param value The new value of the matrix element + */ +CV_INLINE void cvmSet( CvMat* mat, int row, int col, double value ) +{ + int type; + type = CV_MAT_TYPE(mat->type); + assert( (unsigned)row < (unsigned)mat->rows && + (unsigned)col < (unsigned)mat->cols ); + + if( type == CV_32FC1 ) + ((float*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col] = (float)value; + else + { + assert( type == CV_64FC1 ); + ((double*)(void*)(mat->data.ptr + (size_t)mat->step*row))[col] = value; + } +} + + +CV_INLINE int cvIplDepth( int type ) +{ + int depth = CV_MAT_DEPTH(type); + return CV_ELEM_SIZE1(depth)*8 | (depth == CV_8S || depth == CV_16S || + depth == CV_32S ? IPL_DEPTH_SIGN : 0); +} + + +/****************************************************************************************\ +* Multi-dimensional dense array (CvMatND) * +\****************************************************************************************/ + +#define CV_MATND_MAGIC_VAL 0x42430000 +#define CV_TYPE_NAME_MATND "opencv-nd-matrix" + +#define CV_MAX_DIM 32 + +#ifdef __cplusplus +typedef struct CvMatND CvMatND; +CV_EXPORTS CvMatND cvMatND(const cv::Mat& m); +#endif + +/** + @deprecated consider using cv::Mat instead + */ +typedef struct +CvMatND +{ + int type; + int dims; + + int* refcount; + int hdr_refcount; + + union + { + uchar* ptr; + float* fl; + double* db; + int* i; + short* s; + } data; + + struct + { + int size; + int step; + } + dim[CV_MAX_DIM]; + +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvMatND() {} + CvMatND(const cv::Mat& m) { *this = cvMatND(m); } +#endif +} +CvMatND; + + +CV_INLINE CvMatND cvMatND() +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvMatND self = CV_STRUCT_INITIALIZER; return self; +#else + return CvMatND(); +#endif +} + +#define CV_IS_MATND_HDR(mat) \ + ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL) + +#define CV_IS_MATND(mat) \ + (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL) + + +/****************************************************************************************\ +* Multi-dimensional sparse array (CvSparseMat) * +\****************************************************************************************/ + +#define CV_SPARSE_MAT_MAGIC_VAL 0x42440000 +#define CV_TYPE_NAME_SPARSE_MAT "opencv-sparse-matrix" + +struct CvSet; + +typedef struct CvSparseMat +{ + int type; + int dims; + int* refcount; + int hdr_refcount; + + struct CvSet* heap; + void** hashtable; + int hashsize; + int valoffset; + int idxoffset; + int size[CV_MAX_DIM]; + +#ifdef __cplusplus + CV_EXPORTS void copyToSparseMat(cv::SparseMat& m) const; +#endif +} +CvSparseMat; + +#ifdef __cplusplus +CV_EXPORTS CvSparseMat* cvCreateSparseMat(const cv::SparseMat& m); +#endif + +#define CV_IS_SPARSE_MAT_HDR(mat) \ + ((mat) != NULL && \ + (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL) + +#define CV_IS_SPARSE_MAT(mat) \ + CV_IS_SPARSE_MAT_HDR(mat) + +/**************** iteration through a sparse array *****************/ + +typedef struct CvSparseNode +{ + unsigned hashval; + struct CvSparseNode* next; +} +CvSparseNode; + +typedef struct CvSparseMatIterator +{ + CvSparseMat* mat; + CvSparseNode* node; + int curidx; +} +CvSparseMatIterator; + +#define CV_NODE_VAL(mat,node) ((void*)((uchar*)(node) + (mat)->valoffset)) +#define CV_NODE_IDX(mat,node) ((int*)((uchar*)(node) + (mat)->idxoffset)) + +/****************************************************************************************\ +* Histogram * +\****************************************************************************************/ + +typedef int CvHistType; + +#define CV_HIST_MAGIC_VAL 0x42450000 +#define CV_HIST_UNIFORM_FLAG (1 << 10) + +/** indicates whether bin ranges are set already or not */ +#define CV_HIST_RANGES_FLAG (1 << 11) + +#define CV_HIST_ARRAY 0 +#define CV_HIST_SPARSE 1 +#define CV_HIST_TREE CV_HIST_SPARSE + +/** should be used as a parameter only, + it turns to CV_HIST_UNIFORM_FLAG of hist->type */ +#define CV_HIST_UNIFORM 1 + +typedef struct CvHistogram +{ + int type; + CvArr* bins; + float thresh[CV_MAX_DIM][2]; /**< For uniform histograms. */ + float** thresh2; /**< For non-uniform histograms. */ + CvMatND mat; /**< Embedded matrix header for array histograms. */ +} +CvHistogram; + +#define CV_IS_HIST( hist ) \ + ((hist) != NULL && \ + (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \ + (hist)->bins != NULL) + +#define CV_IS_UNIFORM_HIST( hist ) \ + (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0) + +#define CV_IS_SPARSE_HIST( hist ) \ + CV_IS_SPARSE_MAT((hist)->bins) + +#define CV_HIST_HAS_RANGES( hist ) \ + (((hist)->type & CV_HIST_RANGES_FLAG) != 0) + +/****************************************************************************************\ +* Other supplementary data type definitions * +\****************************************************************************************/ + +/*************************************** CvRect *****************************************/ +/** @sa Rect_ */ +typedef struct CvRect +{ + int x; + int y; + int width; + int height; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvRect() __attribute__(( warning("Non-initialized variable") )) {}; + template CvRect(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 4); + x = y = width = height = 0; + if (list.size() == 4) + { + x = list.begin()[0]; y = list.begin()[1]; width = list.begin()[2]; height = list.begin()[3]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvRect(int _x = 0, int _y = 0, int w = 0, int h = 0): x(_x), y(_y), width(w), height(h) {} + template + CvRect(const cv::Rect_<_Tp>& r): x(cv::saturate_cast(r.x)), y(cv::saturate_cast(r.y)), width(cv::saturate_cast(r.width)), height(cv::saturate_cast(r.height)) {} +#endif +#ifdef __cplusplus + template + operator cv::Rect_<_Tp>() const { return cv::Rect_<_Tp>((_Tp)x, (_Tp)y, (_Tp)width, (_Tp)height); } +#endif +} +CvRect; + +/** constructs CvRect structure. */ +CV_INLINE CvRect cvRect( int x, int y, int width, int height ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvRect r = {x, y, width, height}; +#else + CvRect r(x, y , width, height); +#endif + return r; +} +#ifdef __cplusplus +CV_INLINE CvRect cvRect(const cv::Rect& rc) { return cvRect(rc.x, rc.y, rc.width, rc.height); } +#endif + +CV_INLINE IplROI cvRectToROI( CvRect rect, int coi ) +{ + IplROI roi; + roi.xOffset = rect.x; + roi.yOffset = rect.y; + roi.width = rect.width; + roi.height = rect.height; + roi.coi = coi; + + return roi; +} + + +CV_INLINE CvRect cvROIToRect( IplROI roi ) +{ + return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height ); +} + +/*********************************** CvTermCriteria *************************************/ + +#define CV_TERMCRIT_ITER 1 +#define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER +#define CV_TERMCRIT_EPS 2 + +/** @sa TermCriteria + */ +typedef struct CvTermCriteria +{ + int type; /**< may be combination of + CV_TERMCRIT_ITER + CV_TERMCRIT_EPS */ + int max_iter; + double epsilon; +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvTermCriteria(int _type = 0, int _iter = 0, double _eps = 0) : type(_type), max_iter(_iter), epsilon(_eps) {} + CvTermCriteria(const cv::TermCriteria& t) : type(t.type), max_iter(t.maxCount), epsilon(t.epsilon) {} +#endif +#ifdef __cplusplus + operator cv::TermCriteria() const { return cv::TermCriteria(type, max_iter, epsilon); } +#endif +} +CvTermCriteria; + +CV_INLINE CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvTermCriteria t = { type, max_iter, (float)epsilon}; +#else + CvTermCriteria t(type, max_iter, epsilon); +#endif + return t; +} +#ifdef __cplusplus +CV_INLINE CvTermCriteria cvTermCriteria(const cv::TermCriteria& t) { return cvTermCriteria(t.type, t.maxCount, t.epsilon); } +#endif + + +/******************************* CvPoint and variants ***********************************/ + +typedef struct CvPoint +{ + int x; + int y; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvPoint() __attribute__(( warning("Non-initialized variable") )) {} + template CvPoint(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + x = y = 0; + if (list.size() == 2) + { + x = list.begin()[0]; y = list.begin()[1]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvPoint(int _x = 0, int _y = 0): x(_x), y(_y) {} + template + CvPoint(const cv::Point_<_Tp>& pt): x((int)pt.x), y((int)pt.y) {} +#endif +#ifdef __cplusplus + template + operator cv::Point_<_Tp>() const { return cv::Point_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y)); } +#endif +} +CvPoint; + +/** constructs CvPoint structure. */ +CV_INLINE CvPoint cvPoint( int x, int y ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint p = {x, y}; +#else + CvPoint p(x, y); +#endif + return p; +} +#ifdef __cplusplus +CV_INLINE CvPoint cvPoint(const cv::Point& pt) { return cvPoint(pt.x, pt.y); } +#endif + +typedef struct CvPoint2D32f +{ + float x; + float y; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvPoint2D32f() __attribute__(( warning("Non-initialized variable") )) {} + template CvPoint2D32f(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + x = y = 0; + if (list.size() == 2) + { + x = list.begin()[0]; y = list.begin()[1]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvPoint2D32f(float _x = 0, float _y = 0): x(_x), y(_y) {} + template + CvPoint2D32f(const cv::Point_<_Tp>& pt): x((float)pt.x), y((float)pt.y) {} +#endif +#ifdef __cplusplus + template + operator cv::Point_<_Tp>() const { return cv::Point_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y)); } +#endif +} +CvPoint2D32f; + +/** constructs CvPoint2D32f structure. */ +CV_INLINE CvPoint2D32f cvPoint2D32f( double x, double y ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint2D32f p = { (float)x, (float)y }; +#else + CvPoint2D32f p((float)x, (float)y); +#endif + return p; +} + +#ifdef __cplusplus +template +CvPoint2D32f cvPoint2D32f(const cv::Point_<_Tp>& pt) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint2D32f p = { (float)pt.x, (float)pt.y }; +#else + CvPoint2D32f p((float)pt.x, (float)pt.y); +#endif + return p; +} +#endif + +/** converts CvPoint to CvPoint2D32f. */ +CV_INLINE CvPoint2D32f cvPointTo32f( CvPoint point ) +{ + return cvPoint2D32f( (float)point.x, (float)point.y ); +} + +/** converts CvPoint2D32f to CvPoint. */ +CV_INLINE CvPoint cvPointFrom32f( CvPoint2D32f point ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint ipt = { cvRound(point.x), cvRound(point.y) }; +#else + CvPoint ipt(cvRound(point.x), cvRound(point.y)); +#endif + return ipt; +} + + +typedef struct CvPoint3D32f +{ + float x; + float y; + float z; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvPoint3D32f() __attribute__(( warning("Non-initialized variable") )) {} + template CvPoint3D32f(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 3); + x = y = z = 0; + if (list.size() == 3) + { + x = list.begin()[0]; y = list.begin()[1]; z = list.begin()[2]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvPoint3D32f(float _x = 0, float _y = 0, float _z = 0): x(_x), y(_y), z(_z) {} + template + CvPoint3D32f(const cv::Point3_<_Tp>& pt): x((float)pt.x), y((float)pt.y), z((float)pt.z) {} +#endif +#ifdef __cplusplus + template + operator cv::Point3_<_Tp>() const { return cv::Point3_<_Tp>(cv::saturate_cast<_Tp>(x), cv::saturate_cast<_Tp>(y), cv::saturate_cast<_Tp>(z)); } +#endif +} +CvPoint3D32f; + +/** constructs CvPoint3D32f structure. */ +CV_INLINE CvPoint3D32f cvPoint3D32f( double x, double y, double z ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint3D32f p = { (float)x, (float)y, (float)z }; +#else + CvPoint3D32f p((float)x, (float)y, (float)z); +#endif + return p; +} + +#ifdef __cplusplus +template +CvPoint3D32f cvPoint3D32f(const cv::Point3_<_Tp>& pt) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvPoint3D32f p = { (float)pt.x, (float)pt.y, (float)pt.z }; +#else + CvPoint3D32f p((float)pt.x, (float)pt.y, (float)pt.z); +#endif + return p; +} +#endif + + +typedef struct CvPoint2D64f +{ + double x; + double y; +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvPoint2D64f() __attribute__(( warning("Non-initialized variable") )) {} + template CvPoint2D64f(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + x = y = 0; + if (list.size() == 2) + { + x = list.begin()[0]; y = list.begin()[1]; + } + }; +#endif +} +CvPoint2D64f; + +/** constructs CvPoint2D64f structure.*/ +CV_INLINE CvPoint2D64f cvPoint2D64f( double x, double y ) +{ + CvPoint2D64f p = { x, y }; + return p; +} + + +typedef struct CvPoint3D64f +{ + double x; + double y; + double z; +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvPoint3D64f() __attribute__(( warning("Non-initialized variable") )) {} + template CvPoint3D64f(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 3); + x = y = z = 0; + if (list.size() == 3) + { + x = list.begin()[0]; y = list.begin()[1]; z = list.begin()[2]; + } + }; +#endif +} +CvPoint3D64f; + +/** constructs CvPoint3D64f structure. */ +CV_INLINE CvPoint3D64f cvPoint3D64f( double x, double y, double z ) +{ + CvPoint3D64f p = { x, y, z }; + return p; +} + + +/******************************** CvSize's & CvBox **************************************/ + +typedef struct CvSize +{ + int width; + int height; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvSize() __attribute__(( warning("Non-initialized variable") )) {} + template CvSize(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + width = 0; height = 0; + if (list.size() == 2) + { + width = list.begin()[0]; height = list.begin()[1]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvSize(int w = 0, int h = 0): width(w), height(h) {} + template + CvSize(const cv::Size_<_Tp>& sz): width(cv::saturate_cast(sz.width)), height(cv::saturate_cast(sz.height)) {} +#endif +#ifdef __cplusplus + template + operator cv::Size_<_Tp>() const { return cv::Size_<_Tp>(cv::saturate_cast<_Tp>(width), cv::saturate_cast<_Tp>(height)); } +#endif +} +CvSize; + +/** constructs CvSize structure. */ +CV_INLINE CvSize cvSize( int width, int height ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvSize s = { width, height }; +#else + CvSize s(width, height); +#endif + return s; +} + +#ifdef __cplusplus +CV_INLINE CvSize cvSize(const cv::Size& sz) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvSize s = { sz.width, sz.height }; +#else + CvSize s(sz.width, sz.height); +#endif + return s; +} +#endif + +typedef struct CvSize2D32f +{ + float width; + float height; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvSize2D32f() __attribute__(( warning("Non-initialized variable") )) {} + template CvSize2D32f(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + width = 0; height = 0; + if (list.size() == 2) + { + width = list.begin()[0]; height = list.begin()[1]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvSize2D32f(float w = 0, float h = 0): width(w), height(h) {} + template + CvSize2D32f(const cv::Size_<_Tp>& sz): width(cv::saturate_cast(sz.width)), height(cv::saturate_cast(sz.height)) {} +#endif +#ifdef __cplusplus + template + operator cv::Size_<_Tp>() const { return cv::Size_<_Tp>(cv::saturate_cast<_Tp>(width), cv::saturate_cast<_Tp>(height)); } +#endif +} +CvSize2D32f; + +/** constructs CvSize2D32f structure. */ +CV_INLINE CvSize2D32f cvSize2D32f( double width, double height ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvSize2D32f s = { (float)width, (float)height }; +#else + CvSize2D32f s((float)width, (float)height); +#endif + return s; +} +#ifdef __cplusplus +template +CvSize2D32f cvSize2D32f(const cv::Size_<_Tp>& sz) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvSize2D32f s = { (float)sz.width, (float)sz.height }; +#else + CvSize2D32f s((float)sz.width, (float)sz.height); +#endif + return s; +} +#endif + +/** @sa RotatedRect + */ +typedef struct CvBox2D +{ + CvPoint2D32f center; /**< Center of the box. */ + CvSize2D32f size; /**< Box width and length. */ + float angle; /**< Angle between the horizontal axis */ + /**< and the first side (i.e. length) in degrees */ + +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvBox2D(CvPoint2D32f c = CvPoint2D32f(), CvSize2D32f s = CvSize2D32f(), float a = 0) : center(c), size(s), angle(a) {} + CvBox2D(const cv::RotatedRect& rr) : center(rr.center), size(rr.size), angle(rr.angle) {} +#endif +#ifdef __cplusplus + operator cv::RotatedRect() const { return cv::RotatedRect(center, size, angle); } +#endif +} +CvBox2D; + + +#ifdef __cplusplus +CV_INLINE CvBox2D cvBox2D(CvPoint2D32f c = CvPoint2D32f(), CvSize2D32f s = CvSize2D32f(), float a = 0) +{ + CvBox2D self; + self.center = c; + self.size = s; + self.angle = a; + return self; +} +CV_INLINE CvBox2D cvBox2D(const cv::RotatedRect& rr) +{ + CvBox2D self; + self.center = cvPoint2D32f(rr.center); + self.size = cvSize2D32f(rr.size); + self.angle = rr.angle; + return self; +} +#endif + + +/** Line iterator state: */ +typedef struct CvLineIterator +{ + /** Pointer to the current point: */ + uchar* ptr; + + /* Bresenham algorithm state: */ + int err; + int plus_delta; + int minus_delta; + int plus_step; + int minus_step; +} +CvLineIterator; + + + +/************************************* CvSlice ******************************************/ +#define CV_WHOLE_SEQ_END_INDEX 0x3fffffff +#define CV_WHOLE_SEQ cvSlice(0, CV_WHOLE_SEQ_END_INDEX) + +typedef struct CvSlice +{ + int start_index, end_index; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvSlice() __attribute__(( warning("Non-initialized variable") )) {} + template CvSlice(const std::initializer_list<_Tp> list) + { + CV_Assert(list.size() == 0 || list.size() == 2); + start_index = end_index = 0; + if (list.size() == 2) + { + start_index = list.begin()[0]; end_index = list.begin()[1]; + } + }; +#endif +#if defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) && !defined(__CUDACC__) + CvSlice(int start = 0, int end = 0) : start_index(start), end_index(end) {} + CvSlice(const cv::Range& r) { *this = (r.start != INT_MIN && r.end != INT_MAX) ? CvSlice(r.start, r.end) : CvSlice(0, CV_WHOLE_SEQ_END_INDEX); } + operator cv::Range() const { return (start_index == 0 && end_index == CV_WHOLE_SEQ_END_INDEX ) ? cv::Range::all() : cv::Range(start_index, end_index); } +#endif +} +CvSlice; + +CV_INLINE CvSlice cvSlice( int start, int end ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) && !defined(__CUDACC__)) + CvSlice slice = { start, end }; +#else + CvSlice slice(start, end); +#endif + return slice; +} + +#if defined(__cplusplus) +CV_INLINE CvSlice cvSlice(const cv::Range& r) +{ + CvSlice slice = (r.start != INT_MIN && r.end != INT_MAX) ? cvSlice(r.start, r.end) : cvSlice(0, CV_WHOLE_SEQ_END_INDEX); + return slice; +} +#endif + + +/************************************* CvScalar *****************************************/ +/** @sa Scalar_ + */ +typedef struct CvScalar +{ + double val[4]; + +#ifdef CV__VALIDATE_UNUNITIALIZED_VARS + CvScalar() __attribute__(( warning("Non-initialized variable") )) {} + CvScalar(const std::initializer_list list) + { + CV_Assert(list.size() == 0 || list.size() == 4); + val[0] = val[1] = val[2] = val[3] = 0; + if (list.size() == 4) + { + val[0] = list.begin()[0]; val[1] = list.begin()[1]; val[2] = list.begin()[2]; val[3] = list.begin()[3]; + } + }; +#elif defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus) + CvScalar() {} + CvScalar(double d0, double d1 = 0, double d2 = 0, double d3 = 0) { val[0] = d0; val[1] = d1; val[2] = d2; val[3] = d3; } + template + CvScalar(const cv::Scalar_<_Tp>& s) { val[0] = s.val[0]; val[1] = s.val[1]; val[2] = s.val[2]; val[3] = s.val[3]; } + template + CvScalar(const cv::Vec<_Tp, cn>& v) + { + int i; + for( i = 0; i < (cn < 4 ? cn : 4); i++ ) val[i] = v.val[i]; + for( ; i < 4; i++ ) val[i] = 0; + } +#endif +#ifdef __cplusplus + template + operator cv::Scalar_<_Tp>() const { return cv::Scalar_<_Tp>(cv::saturate_cast<_Tp>(val[0]), cv::saturate_cast<_Tp>(val[1]), cv::saturate_cast<_Tp>(val[2]), cv::saturate_cast<_Tp>(val[3])); } +#endif +} +CvScalar; + +CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0), + double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0)) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvScalar scalar = CV_STRUCT_INITIALIZER; +#else + CvScalar scalar; +#endif + scalar.val[0] = val0; scalar.val[1] = val1; + scalar.val[2] = val2; scalar.val[3] = val3; + return scalar; +} + +#ifdef __cplusplus +CV_INLINE CvScalar cvScalar() +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvScalar scalar = CV_STRUCT_INITIALIZER; +#else + CvScalar scalar; +#endif + scalar.val[0] = scalar.val[1] = scalar.val[2] = scalar.val[3] = 0; + return scalar; +} +CV_INLINE CvScalar cvScalar(const cv::Scalar& s) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvScalar scalar = CV_STRUCT_INITIALIZER; +#else + CvScalar scalar; +#endif + scalar.val[0] = s.val[0]; + scalar.val[1] = s.val[1]; + scalar.val[2] = s.val[2]; + scalar.val[3] = s.val[3]; + return scalar; +} +#endif + +CV_INLINE CvScalar cvRealScalar( double val0 ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvScalar scalar = CV_STRUCT_INITIALIZER; +#else + CvScalar scalar; +#endif + scalar.val[0] = val0; + scalar.val[1] = scalar.val[2] = scalar.val[3] = 0; + return scalar; +} + +CV_INLINE CvScalar cvScalarAll( double val0123 ) +{ +#if !(defined(CV__ENABLE_C_API_CTORS) && defined(__cplusplus)) + CvScalar scalar = CV_STRUCT_INITIALIZER; +#else + CvScalar scalar; +#endif + scalar.val[0] = val0123; + scalar.val[1] = val0123; + scalar.val[2] = val0123; + scalar.val[3] = val0123; + return scalar; +} + +/****************************************************************************************\ +* Dynamic Data structures * +\****************************************************************************************/ + +/******************************** Memory storage ****************************************/ + +typedef struct CvMemBlock +{ + struct CvMemBlock* prev; + struct CvMemBlock* next; +} +CvMemBlock; + +#define CV_STORAGE_MAGIC_VAL 0x42890000 + +typedef struct CvMemStorage +{ + int signature; + CvMemBlock* bottom; /**< First allocated block. */ + CvMemBlock* top; /**< Current memory block - top of the stack. */ + struct CvMemStorage* parent; /**< We get new blocks from parent as needed. */ + int block_size; /**< Block size. */ + int free_space; /**< Remaining free space in current block. */ +} +CvMemStorage; + +#define CV_IS_STORAGE(storage) \ + ((storage) != NULL && \ + (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL) + + +typedef struct CvMemStoragePos +{ + CvMemBlock* top; + int free_space; +} +CvMemStoragePos; + + +/*********************************** Sequence *******************************************/ + +typedef struct CvSeqBlock +{ + struct CvSeqBlock* prev; /**< Previous sequence block. */ + struct CvSeqBlock* next; /**< Next sequence block. */ + int start_index; /**< Index of the first element in the block + */ + /**< sequence->first->start_index. */ + int count; /**< Number of elements in the block. */ + schar* data; /**< Pointer to the first element of the block. */ +} +CvSeqBlock; + + +#define CV_TREE_NODE_FIELDS(node_type) \ + int flags; /**< Miscellaneous flags. */ \ + int header_size; /**< Size of sequence header. */ \ + struct node_type* h_prev; /**< Previous sequence. */ \ + struct node_type* h_next; /**< Next sequence. */ \ + struct node_type* v_prev; /**< 2nd previous sequence. */ \ + struct node_type* v_next /**< 2nd next sequence. */ + +/** + Read/Write sequence. + Elements can be dynamically inserted to or deleted from the sequence. +*/ +#define CV_SEQUENCE_FIELDS() \ + CV_TREE_NODE_FIELDS(CvSeq); \ + int total; /**< Total number of elements. */ \ + int elem_size; /**< Size of sequence element in bytes. */ \ + schar* block_max; /**< Maximal bound of the last block. */ \ + schar* ptr; /**< Current write pointer. */ \ + int delta_elems; /**< Grow seq this many at a time. */ \ + CvMemStorage* storage; /**< Where the seq is stored. */ \ + CvSeqBlock* free_blocks; /**< Free blocks list. */ \ + CvSeqBlock* first; /**< Pointer to the first sequence block. */ + +typedef struct CvSeq +{ + CV_SEQUENCE_FIELDS() +} +CvSeq; + +#define CV_TYPE_NAME_SEQ "opencv-sequence" +#define CV_TYPE_NAME_SEQ_TREE "opencv-sequence-tree" + +/*************************************** Set ********************************************/ +/** @brief Set + Order is not preserved. There can be gaps between sequence elements. + After the element has been inserted it stays in the same place all the time. + The MSB(most-significant or sign bit) of the first field (flags) is 0 iff the element exists. +*/ +#define CV_SET_ELEM_FIELDS(elem_type) \ + int flags; \ + struct elem_type* next_free; + +typedef struct CvSetElem +{ + CV_SET_ELEM_FIELDS(CvSetElem) +} +CvSetElem; + +#define CV_SET_FIELDS() \ + CV_SEQUENCE_FIELDS() \ + CvSetElem* free_elems; \ + int active_count; + +typedef struct CvSet +{ + CV_SET_FIELDS() +} +CvSet; + + +#define CV_SET_ELEM_IDX_MASK ((1 << 26) - 1) +#define CV_SET_ELEM_FREE_FLAG (1 << (sizeof(int)*8-1)) + +/** Checks whether the element pointed by ptr belongs to a set or not */ +#define CV_IS_SET_ELEM( ptr ) (((CvSetElem*)(ptr))->flags >= 0) + +/************************************* Graph ********************************************/ + +/** @name Graph + +We represent a graph as a set of vertices. Vertices contain their adjacency lists (more exactly, +pointers to first incoming or outcoming edge (or 0 if isolated vertex)). Edges are stored in +another set. There is a singly-linked list of incoming/outcoming edges for each vertex. + +Each edge consists of: + +- Two pointers to the starting and ending vertices (vtx[0] and vtx[1] respectively). + + A graph may be oriented or not. In the latter case, edges between vertex i to vertex j are not +distinguished during search operations. + +- Two pointers to next edges for the starting and ending vertices, where next[0] points to the +next edge in the vtx[0] adjacency list and next[1] points to the next edge in the vtx[1] +adjacency list. + +@see CvGraphEdge, CvGraphVtx, CvGraphVtx2D, CvGraph +@{ +*/ +#define CV_GRAPH_EDGE_FIELDS() \ + int flags; \ + float weight; \ + struct CvGraphEdge* next[2]; \ + struct CvGraphVtx* vtx[2]; + + +#define CV_GRAPH_VERTEX_FIELDS() \ + int flags; \ + struct CvGraphEdge* first; + + +typedef struct CvGraphEdge +{ + CV_GRAPH_EDGE_FIELDS() +} +CvGraphEdge; + +typedef struct CvGraphVtx +{ + CV_GRAPH_VERTEX_FIELDS() +} +CvGraphVtx; + +typedef struct CvGraphVtx2D +{ + CV_GRAPH_VERTEX_FIELDS() + CvPoint2D32f* ptr; +} +CvGraphVtx2D; + +/** + Graph is "derived" from the set (this is set a of vertices) + and includes another set (edges) +*/ +#define CV_GRAPH_FIELDS() \ + CV_SET_FIELDS() \ + CvSet* edges; + +typedef struct CvGraph +{ + CV_GRAPH_FIELDS() +} +CvGraph; + +#define CV_TYPE_NAME_GRAPH "opencv-graph" + +/** @} */ + +/*********************************** Chain/Contour *************************************/ + +typedef struct CvChain +{ + CV_SEQUENCE_FIELDS() + CvPoint origin; +} +CvChain; + +#define CV_CONTOUR_FIELDS() \ + CV_SEQUENCE_FIELDS() \ + CvRect rect; \ + int color; \ + int reserved[3]; + +typedef struct CvContour +{ + CV_CONTOUR_FIELDS() +} +CvContour; + +typedef CvContour CvPoint2DSeq; + +/****************************************************************************************\ +* Sequence types * +\****************************************************************************************/ + +#define CV_SEQ_MAGIC_VAL 0x42990000 + +#define CV_IS_SEQ(seq) \ + ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL) + +#define CV_SET_MAGIC_VAL 0x42980000 +#define CV_IS_SET(set) \ + ((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL) + +#define CV_SEQ_ELTYPE_BITS 12 +#define CV_SEQ_ELTYPE_MASK ((1 << CV_SEQ_ELTYPE_BITS) - 1) + +#define CV_SEQ_ELTYPE_POINT CV_32SC2 /**< (x,y) */ +#define CV_SEQ_ELTYPE_CODE CV_8UC1 /**< freeman code: 0..7 */ +#define CV_SEQ_ELTYPE_GENERIC 0 +#define CV_SEQ_ELTYPE_PTR CV_MAKE_TYPE(CV_8U, 8 /*sizeof(void*)*/) +#define CV_SEQ_ELTYPE_PPOINT CV_SEQ_ELTYPE_PTR /**< &(x,y) */ +#define CV_SEQ_ELTYPE_INDEX CV_32SC1 /**< #(x,y) */ +#define CV_SEQ_ELTYPE_GRAPH_EDGE 0 /**< &next_o, &next_d, &vtx_o, &vtx_d */ +#define CV_SEQ_ELTYPE_GRAPH_VERTEX 0 /**< first_edge, &(x,y) */ +#define CV_SEQ_ELTYPE_TRIAN_ATR 0 /**< vertex of the binary tree */ +#define CV_SEQ_ELTYPE_CONNECTED_COMP 0 /**< connected component */ +#define CV_SEQ_ELTYPE_POINT3D CV_32FC3 /**< (x,y,z) */ + +#define CV_SEQ_KIND_BITS 2 +#define CV_SEQ_KIND_MASK (((1 << CV_SEQ_KIND_BITS) - 1)<flags & CV_SEQ_ELTYPE_MASK) +#define CV_SEQ_KIND( seq ) ((seq)->flags & CV_SEQ_KIND_MASK ) + +/** flag checking */ +#define CV_IS_SEQ_INDEX( seq ) ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \ + (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC)) + +#define CV_IS_SEQ_CURVE( seq ) (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE) +#define CV_IS_SEQ_CLOSED( seq ) (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0) +#define CV_IS_SEQ_CONVEX( seq ) 0 +#define CV_IS_SEQ_HOLE( seq ) (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0) +#define CV_IS_SEQ_SIMPLE( seq ) 1 + +/** type checking macros */ +#define CV_IS_SEQ_POINT_SET( seq ) \ + ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2)) + +#define CV_IS_SEQ_POINT_SUBSET( seq ) \ + (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT) + +#define CV_IS_SEQ_POLYLINE( seq ) \ + (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq)) + +#define CV_IS_SEQ_POLYGON( seq ) \ + (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq)) + +#define CV_IS_SEQ_CHAIN( seq ) \ + (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1) + +#define CV_IS_SEQ_CONTOUR( seq ) \ + (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq))) + +#define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \ + (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq )) + +#define CV_IS_SEQ_POLYGON_TREE( seq ) \ + (CV_SEQ_ELTYPE (seq) == CV_SEQ_ELTYPE_TRIAN_ATR && \ + CV_SEQ_KIND( seq ) == CV_SEQ_KIND_BIN_TREE ) + +#define CV_IS_GRAPH( seq ) \ + (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH) + +#define CV_IS_GRAPH_ORIENTED( seq ) \ + (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0) + +#define CV_IS_SUBDIV2D( seq ) \ + (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D) + +/****************************************************************************************/ +/* Sequence writer & reader */ +/****************************************************************************************/ + +#define CV_SEQ_WRITER_FIELDS() \ + int header_size; \ + CvSeq* seq; /**< the sequence written */ \ + CvSeqBlock* block; /**< current block */ \ + schar* ptr; /**< pointer to free space */ \ + schar* block_min; /**< pointer to the beginning of block*/\ + schar* block_max; /**< pointer to the end of block */ + +typedef struct CvSeqWriter +{ + CV_SEQ_WRITER_FIELDS() +} +CvSeqWriter; + + +#define CV_SEQ_READER_FIELDS() \ + int header_size; \ + CvSeq* seq; /**< sequence, beign read */ \ + CvSeqBlock* block; /**< current block */ \ + schar* ptr; /**< pointer to element be read next */ \ + schar* block_min; /**< pointer to the beginning of block */\ + schar* block_max; /**< pointer to the end of block */ \ + int delta_index;/**< = seq->first->start_index */ \ + schar* prev_elem; /**< pointer to previous element */ + +typedef struct CvSeqReader +{ + CV_SEQ_READER_FIELDS() +} +CvSeqReader; + +/****************************************************************************************/ +/* Operations on sequences */ +/****************************************************************************************/ + +#define CV_SEQ_ELEM( seq, elem_type, index ) \ +/** assert gives some guarantee that parameter is valid */ \ +( assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) && \ + (seq)->elem_size == sizeof(elem_type)), \ + (elem_type*)((seq)->first && (unsigned)index < \ + (unsigned)((seq)->first->count) ? \ + (seq)->first->data + (index) * sizeof(elem_type) : \ + cvGetSeqElem( (CvSeq*)(seq), (index) ))) +#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) ) + +/** Add element to sequence: */ +#define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer ) \ +{ \ + if( (writer).ptr >= (writer).block_max ) \ + { \ + cvCreateSeqBlock( &writer); \ + } \ + memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\ + (writer).ptr += (writer).seq->elem_size; \ +} + +#define CV_WRITE_SEQ_ELEM( elem, writer ) \ +{ \ + assert( (writer).seq->elem_size == sizeof(elem)); \ + if( (writer).ptr >= (writer).block_max ) \ + { \ + cvCreateSeqBlock( &writer); \ + } \ + assert( (writer).ptr <= (writer).block_max - sizeof(elem));\ + memcpy((writer).ptr, &(elem), sizeof(elem)); \ + (writer).ptr += sizeof(elem); \ +} + + +/** Move reader position forward: */ +#define CV_NEXT_SEQ_ELEM( elem_size, reader ) \ +{ \ + if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \ + { \ + cvChangeSeqBlock( &(reader), 1 ); \ + } \ +} + + +/** Move reader position backward: */ +#define CV_PREV_SEQ_ELEM( elem_size, reader ) \ +{ \ + if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \ + { \ + cvChangeSeqBlock( &(reader), -1 ); \ + } \ +} + +/** Read element and move read position forward: */ +#define CV_READ_SEQ_ELEM( elem, reader ) \ +{ \ + assert( (reader).seq->elem_size == sizeof(elem)); \ + memcpy( &(elem), (reader).ptr, sizeof((elem))); \ + CV_NEXT_SEQ_ELEM( sizeof(elem), reader ) \ +} + +/** Read element and move read position backward: */ +#define CV_REV_READ_SEQ_ELEM( elem, reader ) \ +{ \ + assert( (reader).seq->elem_size == sizeof(elem)); \ + memcpy(&(elem), (reader).ptr, sizeof((elem))); \ + CV_PREV_SEQ_ELEM( sizeof(elem), reader ) \ +} + + +#define CV_READ_CHAIN_POINT( _pt, reader ) \ +{ \ + (_pt) = (reader).pt; \ + if( (reader).ptr ) \ + { \ + CV_READ_SEQ_ELEM( (reader).code, (reader)); \ + assert( ((reader).code & ~7) == 0 ); \ + (reader).pt.x += (reader).deltas[(int)(reader).code][0]; \ + (reader).pt.y += (reader).deltas[(int)(reader).code][1]; \ + } \ +} + +#define CV_CURRENT_POINT( reader ) (*((CvPoint*)((reader).ptr))) +#define CV_PREV_POINT( reader ) (*((CvPoint*)((reader).prev_elem))) + +#define CV_READ_EDGE( pt1, pt2, reader ) \ +{ \ + assert( sizeof(pt1) == sizeof(CvPoint) && \ + sizeof(pt2) == sizeof(CvPoint) && \ + reader.seq->elem_size == sizeof(CvPoint)); \ + (pt1) = CV_PREV_POINT( reader ); \ + (pt2) = CV_CURRENT_POINT( reader ); \ + (reader).prev_elem = (reader).ptr; \ + CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader)); \ +} + +/************ Graph macros ************/ + +/** Return next graph edge for given vertex: */ +#define CV_NEXT_GRAPH_EDGE( edge, vertex ) \ + (assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)), \ + (edge)->next[(edge)->vtx[1] == (vertex)]) + + + +/****************************************************************************************\ +* Data structures for persistence (a.k.a serialization) functionality * +\****************************************************************************************/ + +#if 0 + +/** "black box" file storage */ +typedef struct CvFileStorage CvFileStorage; + +/** Storage flags: */ +#define CV_STORAGE_READ 0 +#define CV_STORAGE_WRITE 1 +#define CV_STORAGE_WRITE_TEXT CV_STORAGE_WRITE +#define CV_STORAGE_WRITE_BINARY CV_STORAGE_WRITE +#define CV_STORAGE_APPEND 2 +#define CV_STORAGE_MEMORY 4 +#define CV_STORAGE_FORMAT_MASK (7<<3) +#define CV_STORAGE_FORMAT_AUTO 0 +#define CV_STORAGE_FORMAT_XML 8 +#define CV_STORAGE_FORMAT_YAML 16 +#define CV_STORAGE_FORMAT_JSON 24 +#define CV_STORAGE_BASE64 64 +#define CV_STORAGE_WRITE_BASE64 (CV_STORAGE_BASE64 | CV_STORAGE_WRITE) + +/** @brief List of attributes. : + +In the current implementation, attributes are used to pass extra parameters when writing user +objects (see cvWrite). XML attributes inside tags are not supported, aside from the object type +specification (type_id attribute). +@see cvAttrList, cvAttrValue + */ +typedef struct CvAttrList +{ + const char** attr; /**< NULL-terminated array of (attribute_name,attribute_value) pairs. */ + struct CvAttrList* next; /**< Pointer to next chunk of the attributes list. */ +} +CvAttrList; + +/** initializes CvAttrList structure */ +CV_INLINE CvAttrList cvAttrList( const char** attr CV_DEFAULT(NULL), + CvAttrList* next CV_DEFAULT(NULL) ) +{ + CvAttrList l; + l.attr = attr; + l.next = next; + + return l; +} + +struct CvTypeInfo; + +#define CV_NODE_NONE 0 +#define CV_NODE_INT 1 +#define CV_NODE_INTEGER CV_NODE_INT +#define CV_NODE_REAL 2 +#define CV_NODE_FLOAT CV_NODE_REAL +#define CV_NODE_STR 3 +#define CV_NODE_STRING CV_NODE_STR +#define CV_NODE_REF 4 /**< not used */ +#define CV_NODE_SEQ 5 +#define CV_NODE_MAP 6 +#define CV_NODE_TYPE_MASK 7 + +#define CV_NODE_TYPE(flags) ((flags) & CV_NODE_TYPE_MASK) + +/** file node flags */ +#define CV_NODE_FLOW 8 /**= CV_NODE_SEQ) +#define CV_NODE_IS_FLOW(flags) (((flags) & CV_NODE_FLOW) != 0) +#define CV_NODE_IS_EMPTY(flags) (((flags) & CV_NODE_EMPTY) != 0) +#define CV_NODE_IS_USER(flags) (((flags) & CV_NODE_USER) != 0) +#define CV_NODE_HAS_NAME(flags) (((flags) & CV_NODE_NAMED) != 0) + +#define CV_NODE_SEQ_SIMPLE 256 +#define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0) + +typedef struct CvString +{ + int len; + char* ptr; +} +CvString; + +/** All the keys (names) of elements in the read file storage + are stored in the hash to speed up the lookup operations: */ +typedef struct CvStringHashNode +{ + unsigned hashval; + CvString str; + struct CvStringHashNode* next; +} +CvStringHashNode; + +typedef struct CvGenericHash CvFileNodeHash; + +/** Basic element of the file storage - scalar or collection: */ +typedef struct CvFileNode +{ + int tag; + struct CvTypeInfo* info; /**< type information + (only for user-defined object, for others it is 0) */ + union + { + double f; /**< scalar floating-point number */ + int i; /**< scalar integer number */ + CvString str; /**< text string */ + CvSeq* seq; /**< sequence (ordered collection of file nodes) */ + CvFileNodeHash* map; /**< map (collection of named file nodes) */ + } data; +} +CvFileNode; + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (CV_CDECL *CvIsInstanceFunc)( const void* struct_ptr ); +typedef void (CV_CDECL *CvReleaseFunc)( void** struct_dblptr ); +typedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node ); +typedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name, + const void* struct_ptr, CvAttrList attributes ); +typedef void* (CV_CDECL *CvCloneFunc)( const void* struct_ptr ); +#ifdef __cplusplus +} +#endif + +/** @brief Type information + +The structure contains information about one of the standard or user-defined types. Instances of the +type may or may not contain a pointer to the corresponding CvTypeInfo structure. In any case, there +is a way to find the type info structure for a given object using the cvTypeOf function. +Alternatively, type info can be found by type name using cvFindType, which is used when an object +is read from file storage. The user can register a new type with cvRegisterType that adds the type +information structure into the beginning of the type list. Thus, it is possible to create +specialized types from generic standard types and override the basic methods. + */ +typedef struct CvTypeInfo +{ + int flags; /**< not used */ + int header_size; /**< sizeof(CvTypeInfo) */ + struct CvTypeInfo* prev; /**< previous registered type in the list */ + struct CvTypeInfo* next; /**< next registered type in the list */ + const char* type_name; /**< type name, written to file storage */ + CvIsInstanceFunc is_instance; /**< checks if the passed object belongs to the type */ + CvReleaseFunc release; /**< releases object (memory etc.) */ + CvReadFunc read; /**< reads object from file storage */ + CvWriteFunc write; /**< writes object to file storage */ + CvCloneFunc clone; /**< creates a copy of the object */ +} +CvTypeInfo; +#endif + +/** @} */ + +#endif /*OPENCV_CORE_TYPES_H*/ + +/* End of file. */ diff --git a/Thirdparty/opencv2/include/opencv2/core/utility.hpp b/Thirdparty/opencv2/include/opencv2/core/utility.hpp new file mode 100644 index 0000000..db8c429 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utility.hpp @@ -0,0 +1,1229 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2015, Itseez Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_CORE_UTILITY_H +#define OPENCV_CORE_UTILITY_H + +#ifndef __cplusplus +# error utility.hpp header must be compiled as C++ +#endif + +#if defined(check) +# warning Detected Apple 'check' macro definition, it can cause build conflicts. Please, include this header before any Apple headers. +#endif + +#include "opencv2/core.hpp" +#include + +#include + +#if !defined(_M_CEE) +#include // std::mutex, std::lock_guard +#endif + +namespace cv +{ + +//! @addtogroup core_utils +//! @{ + +/** @brief Automatically Allocated Buffer Class + + The class is used for temporary buffers in functions and methods. + If a temporary buffer is usually small (a few K's of memory), + but its size depends on the parameters, it makes sense to create a small + fixed-size array on stack and use it if it's large enough. If the required buffer size + is larger than the fixed size, another buffer of sufficient size is allocated dynamically + and released after the processing. Therefore, in typical cases, when the buffer size is small, + there is no overhead associated with malloc()/free(). + At the same time, there is no limit on the size of processed data. + + This is what AutoBuffer does. The template takes 2 parameters - type of the buffer elements and + the number of stack-allocated elements. Here is how the class is used: + + \code + void my_func(const cv::Mat& m) + { + cv::AutoBuffer buf(1000); // create automatic buffer containing 1000 floats + + buf.allocate(m.rows); // if m.rows <= 1000, the pre-allocated buffer is used, + // otherwise the buffer of "m.rows" floats will be allocated + // dynamically and deallocated in cv::AutoBuffer destructor + ... + } + \endcode +*/ +#ifdef OPENCV_ENABLE_MEMORY_SANITIZER +template class AutoBuffer +#else +template class AutoBuffer +#endif +{ +public: + typedef _Tp value_type; + + //! the default constructor + AutoBuffer(); + //! constructor taking the real buffer size + explicit AutoBuffer(size_t _size); + + //! the copy constructor + AutoBuffer(const AutoBuffer<_Tp, fixed_size>& buf); + //! the assignment operator + AutoBuffer<_Tp, fixed_size>& operator = (const AutoBuffer<_Tp, fixed_size>& buf); + + //! destructor. calls deallocate() + ~AutoBuffer(); + + //! allocates the new buffer of size _size. if the _size is small enough, stack-allocated buffer is used + void allocate(size_t _size); + //! deallocates the buffer if it was dynamically allocated + void deallocate(); + //! resizes the buffer and preserves the content + void resize(size_t _size); + //! returns the current buffer size + size_t size() const; + //! returns pointer to the real buffer, stack-allocated or heap-allocated + inline _Tp* data() { return ptr; } + //! returns read-only pointer to the real buffer, stack-allocated or heap-allocated + inline const _Tp* data() const { return ptr; } + +#if !defined(OPENCV_DISABLE_DEPRECATED_COMPATIBILITY) // use to .data() calls instead + //! returns pointer to the real buffer, stack-allocated or heap-allocated + operator _Tp* () { return ptr; } + //! returns read-only pointer to the real buffer, stack-allocated or heap-allocated + operator const _Tp* () const { return ptr; } +#else + //! returns a reference to the element at specified location. No bounds checking is performed in Release builds. + inline _Tp& operator[] (size_t i) { CV_DbgCheckLT(i, sz, "out of range"); return ptr[i]; } + //! returns a reference to the element at specified location. No bounds checking is performed in Release builds. + inline const _Tp& operator[] (size_t i) const { CV_DbgCheckLT(i, sz, "out of range"); return ptr[i]; } +#endif + +protected: + //! pointer to the real buffer, can point to buf if the buffer is small enough + _Tp* ptr; + //! size of the real buffer + size_t sz; + //! pre-allocated buffer. At least 1 element to confirm C++ standard requirements + _Tp buf[(fixed_size > 0) ? fixed_size : 1]; +}; + +/** @brief Sets/resets the break-on-error mode. + +When the break-on-error mode is set, the default error handler issues a hardware exception, which +can make debugging more convenient. + +\return the previous state + */ +CV_EXPORTS bool setBreakOnError(bool flag); + +extern "C" typedef int (*ErrorCallback)( int status, const char* func_name, + const char* err_msg, const char* file_name, + int line, void* userdata ); + + +/** @brief Sets the new error handler and the optional user data. + + The function sets the new error handler, called from cv::error(). + + \param errCallback the new error handler. If NULL, the default error handler is used. + \param userdata the optional user data pointer, passed to the callback. + \param prevUserdata the optional output parameter where the previous user data pointer is stored + + \return the previous error handler +*/ +CV_EXPORTS ErrorCallback redirectError( ErrorCallback errCallback, void* userdata=0, void** prevUserdata=0); + +CV_EXPORTS String tempfile( const char* suffix = 0); +CV_EXPORTS void glob(String pattern, std::vector& result, bool recursive = false); + +/** @brief OpenCV will try to set the number of threads for subsequent parallel regions. + +If threads == 1, OpenCV will disable threading optimizations and run all it's functions +sequentially. Passing threads \< 0 will reset threads number to system default. +The function is not thread-safe. It must not be called in parallel region or concurrent threads. + +OpenCV will try to run its functions with specified threads number, but some behaviour differs from +framework: +- `TBB` - User-defined parallel constructions will run with the same threads number, if + another is not specified. If later on user creates his own scheduler, OpenCV will use it. +- `OpenMP` - No special defined behaviour. +- `Concurrency` - If threads == 1, OpenCV will disable threading optimizations and run its + functions sequentially. +- `GCD` - Supports only values \<= 0. +- `C=` - No special defined behaviour. +@param nthreads Number of threads used by OpenCV. +@sa getNumThreads, getThreadNum + */ +CV_EXPORTS_W void setNumThreads(int nthreads); + +/** @brief Returns the number of threads used by OpenCV for parallel regions. + +Always returns 1 if OpenCV is built without threading support. + +The exact meaning of return value depends on the threading framework used by OpenCV library: +- `TBB` - The number of threads, that OpenCV will try to use for parallel regions. If there is + any tbb::thread_scheduler_init in user code conflicting with OpenCV, then function returns + default number of threads used by TBB library. +- `OpenMP` - An upper bound on the number of threads that could be used to form a new team. +- `Concurrency` - The number of threads, that OpenCV will try to use for parallel regions. +- `GCD` - Unsupported; returns the GCD thread pool limit (512) for compatibility. +- `C=` - The number of threads, that OpenCV will try to use for parallel regions, if before + called setNumThreads with threads \> 0, otherwise returns the number of logical CPUs, + available for the process. +@sa setNumThreads, getThreadNum + */ +CV_EXPORTS_W int getNumThreads(); + +/** @brief Returns the index of the currently executed thread within the current parallel region. Always +returns 0 if called outside of parallel region. + +@deprecated Current implementation doesn't corresponding to this documentation. + +The exact meaning of the return value depends on the threading framework used by OpenCV library: +- `TBB` - Unsupported with current 4.1 TBB release. Maybe will be supported in future. +- `OpenMP` - The thread number, within the current team, of the calling thread. +- `Concurrency` - An ID for the virtual processor that the current context is executing on (0 + for master thread and unique number for others, but not necessary 1,2,3,...). +- `GCD` - System calling thread's ID. Never returns 0 inside parallel region. +- `C=` - The index of the current parallel task. +@sa setNumThreads, getNumThreads + */ +CV_EXPORTS_W int getThreadNum(); + +/** @brief Returns full configuration time cmake output. + +Returned value is raw cmake output including version control system revision, compiler version, +compiler flags, enabled modules and third party libraries, etc. Output format depends on target +architecture. + */ +CV_EXPORTS_W const String& getBuildInformation(); + +/** @brief Returns library version string + +For example "3.4.1-dev". + +@sa getMajorVersion, getMinorVersion, getRevisionVersion +*/ +CV_EXPORTS_W String getVersionString(); + +/** @brief Returns major library version */ +CV_EXPORTS_W int getVersionMajor(); + +/** @brief Returns minor library version */ +CV_EXPORTS_W int getVersionMinor(); + +/** @brief Returns revision field of the library version */ +CV_EXPORTS_W int getVersionRevision(); + +/** @brief Returns the number of ticks. + +The function returns the number of ticks after the certain event (for example, when the machine was +turned on). It can be used to initialize RNG or to measure a function execution time by reading the +tick count before and after the function call. +@sa getTickFrequency, TickMeter + */ +CV_EXPORTS_W int64 getTickCount(); + +/** @brief Returns the number of ticks per second. + +The function returns the number of ticks per second. That is, the following code computes the +execution time in seconds: +@code + double t = (double)getTickCount(); + // do something ... + t = ((double)getTickCount() - t)/getTickFrequency(); +@endcode +@sa getTickCount, TickMeter + */ +CV_EXPORTS_W double getTickFrequency(); + +/** @brief a Class to measure passing time. + +The class computes passing time by counting the number of ticks per second. That is, the following code computes the +execution time in seconds: +@snippet snippets/core_various.cpp TickMeter_total + +It is also possible to compute the average time over multiple runs: +@snippet snippets/core_various.cpp TickMeter_average + +@sa getTickCount, getTickFrequency +*/ +class CV_EXPORTS_W TickMeter +{ +public: + //! the default constructor + CV_WRAP TickMeter() + { + reset(); + } + + //! starts counting ticks. + CV_WRAP void start() + { + startTime = cv::getTickCount(); + } + + //! stops counting ticks. + CV_WRAP void stop() + { + int64 time = cv::getTickCount(); + if (startTime == 0) + return; + ++counter; + sumTime += (time - startTime); + startTime = 0; + } + + //! returns counted ticks. + CV_WRAP int64 getTimeTicks() const + { + return sumTime; + } + + //! returns passed time in microseconds. + CV_WRAP double getTimeMicro() const + { + return getTimeMilli()*1e3; + } + + //! returns passed time in milliseconds. + CV_WRAP double getTimeMilli() const + { + return getTimeSec()*1e3; + } + + //! returns passed time in seconds. + CV_WRAP double getTimeSec() const + { + return (double)getTimeTicks() / getTickFrequency(); + } + + //! returns internal counter value. + CV_WRAP int64 getCounter() const + { + return counter; + } + + //! returns average FPS (frames per second) value. + CV_WRAP double getFPS() const + { + const double sec = getTimeSec(); + if (sec < DBL_EPSILON) + return 0.; + return counter / sec; + } + + //! returns average time in seconds + CV_WRAP double getAvgTimeSec() const + { + if (counter <= 0) + return 0.; + return getTimeSec() / counter; + } + + //! returns average time in milliseconds + CV_WRAP double getAvgTimeMilli() const + { + return getAvgTimeSec() * 1e3; + } + + //! resets internal values. + CV_WRAP void reset() + { + startTime = 0; + sumTime = 0; + counter = 0; + } + +private: + int64 counter; + int64 sumTime; + int64 startTime; +}; + +/** @brief output operator +@code +TickMeter tm; +tm.start(); +// do something ... +tm.stop(); +std::cout << tm; +@endcode +*/ + +static inline +std::ostream& operator << (std::ostream& out, const TickMeter& tm) +{ + return out << tm.getTimeSec() << "sec"; +} + +/** @brief Returns the number of CPU ticks. + +The function returns the current number of CPU ticks on some architectures (such as x86, x64, +PowerPC). On other platforms the function is equivalent to getTickCount. It can also be used for +very accurate time measurements, as well as for RNG initialization. Note that in case of multi-CPU +systems a thread, from which getCPUTickCount is called, can be suspended and resumed at another CPU +with its own counter. So, theoretically (and practically) the subsequent calls to the function do +not necessary return the monotonously increasing values. Also, since a modern CPU varies the CPU +frequency depending on the load, the number of CPU clocks spent in some code cannot be directly +converted to time units. Therefore, getTickCount is generally a preferable solution for measuring +execution time. + */ +CV_EXPORTS_W int64 getCPUTickCount(); + +/** @brief Returns true if the specified feature is supported by the host hardware. + +The function returns true if the host hardware supports the specified feature. When user calls +setUseOptimized(false), the subsequent calls to checkHardwareSupport() will return false until +setUseOptimized(true) is called. This way user can dynamically switch on and off the optimized code +in OpenCV. +@param feature The feature of interest, one of cv::CpuFeatures + */ +CV_EXPORTS_W bool checkHardwareSupport(int feature); + +/** @brief Returns feature name by ID + +Returns empty string if feature is not defined +*/ +CV_EXPORTS_W String getHardwareFeatureName(int feature); + +/** @brief Returns list of CPU features enabled during compilation. + +Returned value is a string containing space separated list of CPU features with following markers: + +- no markers - baseline features +- prefix `*` - features enabled in dispatcher +- suffix `?` - features enabled but not available in HW + +Example: `SSE SSE2 SSE3 *SSE4.1 *SSE4.2 *FP16 *AVX *AVX2 *AVX512-SKX?` +*/ +CV_EXPORTS_W std::string getCPUFeaturesLine(); + +/** @brief Returns the number of logical CPUs available for the process. + */ +CV_EXPORTS_W int getNumberOfCPUs(); + + +/** @brief Aligns a pointer to the specified number of bytes. + +The function returns the aligned pointer of the same type as the input pointer: +\f[\texttt{(_Tp*)(((size_t)ptr + n-1) & -n)}\f] +@param ptr Aligned pointer. +@param n Alignment size that must be a power of two. + */ +template static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)) +{ + CV_DbgAssert((n & (n - 1)) == 0); // n is a power of 2 + return (_Tp*)(((size_t)ptr + n-1) & -n); +} + +/** @brief Aligns a buffer size to the specified number of bytes. + +The function returns the minimum number that is greater than or equal to sz and is divisible by n : +\f[\texttt{(sz + n-1) & -n}\f] +@param sz Buffer size to align. +@param n Alignment size that must be a power of two. + */ +static inline size_t alignSize(size_t sz, int n) +{ + CV_DbgAssert((n & (n - 1)) == 0); // n is a power of 2 + return (sz + n-1) & -n; +} + +/** @brief Integer division with result round up. + +Use this function instead of `ceil((float)a / b)` expressions. + +@sa alignSize +*/ +static inline int divUp(int a, unsigned int b) +{ + CV_DbgAssert(a >= 0); + return (a + b - 1) / b; +} +/** @overload */ +static inline size_t divUp(size_t a, unsigned int b) +{ + return (a + b - 1) / b; +} + +/** @brief Round first value up to the nearest multiple of second value. + +Use this function instead of `ceil((float)a / b) * b` expressions. + +@sa divUp +*/ +static inline int roundUp(int a, unsigned int b) +{ + CV_DbgAssert(a >= 0); + return a + b - 1 - (a + b -1) % b; +} +/** @overload */ +static inline size_t roundUp(size_t a, unsigned int b) +{ + return a + b - 1 - (a + b - 1) % b; +} + +/** @brief Alignment check of passed values + +Usage: `isAligned(...)` + +@note Alignment(N) must be a power of 2 (2**k, 2^k) +*/ +template static inline +bool isAligned(const T& data) +{ + CV_StaticAssert((N & (N - 1)) == 0, ""); // power of 2 + return (((size_t)data) & (N - 1)) == 0; +} +/** @overload */ +template static inline +bool isAligned(const void* p1) +{ + return isAligned((size_t)p1); +} +/** @overload */ +template static inline +bool isAligned(const void* p1, const void* p2) +{ + return isAligned(((size_t)p1)|((size_t)p2)); +} +/** @overload */ +template static inline +bool isAligned(const void* p1, const void* p2, const void* p3) +{ + return isAligned(((size_t)p1)|((size_t)p2)|((size_t)p3)); +} +/** @overload */ +template static inline +bool isAligned(const void* p1, const void* p2, const void* p3, const void* p4) +{ + return isAligned(((size_t)p1)|((size_t)p2)|((size_t)p3)|((size_t)p4)); +} + +/** @brief Enables or disables the optimized code. + +The function can be used to dynamically turn on and off optimized dispatched code (code that uses SSE4.2, AVX/AVX2, +and other instructions on the platforms that support it). It sets a global flag that is further +checked by OpenCV functions. Since the flag is not checked in the inner OpenCV loops, it is only +safe to call the function on the very top level in your application where you can be sure that no +other OpenCV function is currently executed. + +By default, the optimized code is enabled unless you disable it in CMake. The current status can be +retrieved using useOptimized. +@param onoff The boolean flag specifying whether the optimized code should be used (onoff=true) +or not (onoff=false). + */ +CV_EXPORTS_W void setUseOptimized(bool onoff); + +/** @brief Returns the status of optimized code usage. + +The function returns true if the optimized code is enabled. Otherwise, it returns false. + */ +CV_EXPORTS_W bool useOptimized(); + +static inline size_t getElemSize(int type) { return (size_t)CV_ELEM_SIZE(type); } + +/////////////////////////////// Parallel Primitives ////////////////////////////////// + +/** @brief Base class for parallel data processors + +@ingroup core_parallel +*/ +class CV_EXPORTS ParallelLoopBody +{ +public: + virtual ~ParallelLoopBody(); + virtual void operator() (const Range& range) const = 0; +}; + +/** @brief Parallel data processor + +@ingroup core_parallel +*/ +CV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body, double nstripes=-1.); + +//! @ingroup core_parallel +class ParallelLoopBodyLambdaWrapper : public ParallelLoopBody +{ +private: + std::function m_functor; +public: + inline + ParallelLoopBodyLambdaWrapper(std::function functor) + : m_functor(functor) + { + // nothing + } + + virtual void operator() (const cv::Range& range) const CV_OVERRIDE + { + m_functor(range); + } +}; + +//! @ingroup core_parallel +static inline +void parallel_for_(const Range& range, std::function functor, double nstripes=-1.) +{ + parallel_for_(range, ParallelLoopBodyLambdaWrapper(functor), nstripes); +} + + +/////////////////////////////// forEach method of cv::Mat //////////////////////////// +template inline +void Mat::forEach_impl(const Functor& operation) { + if (false) { + operation(*reinterpret_cast<_Tp*>(0), reinterpret_cast(0)); + // If your compiler fails in this line. + // Please check that your functor signature is + // (_Tp&, const int*) <- multi-dimensional + // or (_Tp&, void*) <- in case you don't need current idx. + } + + CV_Assert(!empty()); + CV_Assert(this->total() / this->size[this->dims - 1] <= INT_MAX); + const int LINES = static_cast(this->total() / this->size[this->dims - 1]); + + class PixelOperationWrapper :public ParallelLoopBody + { + public: + PixelOperationWrapper(Mat_<_Tp>* const frame, const Functor& _operation) + : mat(frame), op(_operation) {} + virtual ~PixelOperationWrapper(){} + // ! Overloaded virtual operator + // convert range call to row call. + virtual void operator()(const Range &range) const CV_OVERRIDE + { + const int DIMS = mat->dims; + const int COLS = mat->size[DIMS - 1]; + if (DIMS <= 2) { + for (int row = range.start; row < range.end; ++row) { + this->rowCall2(row, COLS); + } + } else { + std::vector idx(DIMS); /// idx is modified in this->rowCall + idx[DIMS - 2] = range.start - 1; + + for (int line_num = range.start; line_num < range.end; ++line_num) { + idx[DIMS - 2]++; + for (int i = DIMS - 2; i >= 0; --i) { + if (idx[i] >= mat->size[i]) { + idx[i - 1] += idx[i] / mat->size[i]; + idx[i] %= mat->size[i]; + continue; // carry-over; + } + else { + break; + } + } + this->rowCall(&idx[0], COLS, DIMS); + } + } + } + private: + Mat_<_Tp>* const mat; + const Functor op; + // ! Call operator for each elements in this row. + inline void rowCall(int* const idx, const int COLS, const int DIMS) const { + int &col = idx[DIMS - 1]; + col = 0; + _Tp* pixel = &(mat->template at<_Tp>(idx)); + + while (col < COLS) { + op(*pixel, const_cast(idx)); + pixel++; col++; + } + col = 0; + } + // ! Call operator for each elements in this row. 2d mat special version. + inline void rowCall2(const int row, const int COLS) const { + union Index{ + int body[2]; + operator const int*() const { + return reinterpret_cast(this); + } + int& operator[](const int i) { + return body[i]; + } + } idx = {{row, 0}}; + // Special union is needed to avoid + // "error: array subscript is above array bounds [-Werror=array-bounds]" + // when call the functor `op` such that access idx[3]. + + _Tp* pixel = &(mat->template at<_Tp>(idx)); + const _Tp* const pixel_end = pixel + COLS; + while(pixel < pixel_end) { + op(*pixel++, static_cast(idx)); + idx[1]++; + } + } + PixelOperationWrapper& operator=(const PixelOperationWrapper &) { + CV_Assert(false); + // We can not remove this implementation because Visual Studio warning C4822. + return *this; + } + }; + + parallel_for_(cv::Range(0, LINES), PixelOperationWrapper(reinterpret_cast*>(this), operation)); +} + +/////////////////////////// Synchronization Primitives /////////////////////////////// + +#if !defined(_M_CEE) +#ifndef OPENCV_DISABLE_THREAD_SUPPORT +typedef std::recursive_mutex Mutex; +typedef std::lock_guard AutoLock; +#else // OPENCV_DISABLE_THREAD_SUPPORT +// Custom (failing) implementation of `std::recursive_mutex`. +struct Mutex { + void lock(){ + CV_Error(cv::Error::StsNotImplemented, + "cv::Mutex is disabled by OPENCV_DISABLE_THREAD_SUPPORT=ON"); + } + void unlock(){ + CV_Error(cv::Error::StsNotImplemented, + "cv::Mutex is disabled by OPENCV_DISABLE_THREAD_SUPPORT=ON"); + } +}; +// Stub for cv::AutoLock when threads are disabled. +struct AutoLock { + AutoLock(Mutex &) { } +}; +#endif // OPENCV_DISABLE_THREAD_SUPPORT +#endif // !defined(_M_CEE) + + +/** @brief Designed for command line parsing + +The sample below demonstrates how to use CommandLineParser: +@code + CommandLineParser parser(argc, argv, keys); + parser.about("Application name v1.0.0"); + + if (parser.has("help")) + { + parser.printMessage(); + return 0; + } + + int N = parser.get("N"); + double fps = parser.get("fps"); + String path = parser.get("path"); + + use_time_stamp = parser.has("timestamp"); + + String img1 = parser.get(0); + String img2 = parser.get(1); + + int repeat = parser.get(2); + + if (!parser.check()) + { + parser.printErrors(); + return 0; + } +@endcode + +### Keys syntax + +The keys parameter is a string containing several blocks, each one is enclosed in curly braces and +describes one argument. Each argument contains three parts separated by the `|` symbol: + +-# argument names is a space-separated list of option synonyms (to mark argument as positional, prefix it with the `@` symbol) +-# default value will be used if the argument was not provided (can be empty) +-# help message (can be empty) + +For example: + +@code{.cpp} + const String keys = + "{help h usage ? | | print this message }" + "{@image1 | | image1 for compare }" + "{@image2 || image2 for compare }" + "{@repeat |1 | number }" + "{path |. | path to file }" + "{fps | -1.0 | fps for output video }" + "{N count |100 | count of objects }" + "{ts timestamp | | use time stamp }" + ; +} +@endcode + +Note that there are no default values for `help` and `timestamp` so we can check their presence using the `has()` method. +Arguments with default values are considered to be always present. Use the `get()` method in these cases to check their +actual value instead. + +String keys like `get("@image1")` return the empty string `""` by default - even with an empty default value. +Use the special `` default value to enforce that the returned string must not be empty. (like in `get("@image2")`) + +### Usage + +For the described keys: + +@code{.sh} + # Good call (3 positional parameters: image1, image2 and repeat; N is 200, ts is true) + $ ./app -N=200 1.png 2.jpg 19 -ts + + # Bad call + $ ./app -fps=aaa + ERRORS: + Parameter 'fps': can not convert: [aaa] to [double] +@endcode + */ +class CV_EXPORTS CommandLineParser +{ +public: + + /** @brief Constructor + + Initializes command line parser object + + @param argc number of command line arguments (from main()) + @param argv array of command line arguments (from main()) + @param keys string describing acceptable command line parameters (see class description for syntax) + */ + CommandLineParser(int argc, const char* const argv[], const String& keys); + + /** @brief Copy constructor */ + CommandLineParser(const CommandLineParser& parser); + + /** @brief Assignment operator */ + CommandLineParser& operator = (const CommandLineParser& parser); + + /** @brief Destructor */ + ~CommandLineParser(); + + /** @brief Returns application path + + This method returns the path to the executable from the command line (`argv[0]`). + + For example, if the application has been started with such a command: + @code{.sh} + $ ./bin/my-executable + @endcode + this method will return `./bin`. + */ + String getPathToApplication() const; + + /** @brief Access arguments by name + + Returns argument converted to selected type. If the argument is not known or can not be + converted to selected type, the error flag is set (can be checked with @ref check). + + For example, define: + @code{.cpp} + String keys = "{N count||}"; + @endcode + + Call: + @code{.sh} + $ ./my-app -N=20 + # or + $ ./my-app --count=20 + @endcode + + Access: + @code{.cpp} + int N = parser.get("N"); + @endcode + + @param name name of the argument + @param space_delete remove spaces from the left and right of the string + @tparam T the argument will be converted to this type if possible + + @note You can access positional arguments by their `@`-prefixed name: + @code{.cpp} + parser.get("@image"); + @endcode + */ + template + T get(const String& name, bool space_delete = true) const + { + T val = T(); + getByName(name, space_delete, ParamType::type, (void*)&val); + return val; + } + + /** @brief Access positional arguments by index + + Returns argument converted to selected type. Indexes are counted from zero. + + For example, define: + @code{.cpp} + String keys = "{@arg1||}{@arg2||}" + @endcode + + Call: + @code{.sh} + ./my-app abc qwe + @endcode + + Access arguments: + @code{.cpp} + String val_1 = parser.get(0); // returns "abc", arg1 + String val_2 = parser.get(1); // returns "qwe", arg2 + @endcode + + @param index index of the argument + @param space_delete remove spaces from the left and right of the string + @tparam T the argument will be converted to this type if possible + */ + template + T get(int index, bool space_delete = true) const + { + T val = T(); + getByIndex(index, space_delete, ParamType::type, (void*)&val); + return val; + } + + /** @brief Check if field was provided in the command line + + @param name argument name to check + */ + bool has(const String& name) const; + + /** @brief Check for parsing errors + + Returns false if error occurred while accessing the parameters (bad conversion, missing arguments, + etc.). Call @ref printErrors to print error messages list. + */ + bool check() const; + + /** @brief Set the about message + + The about message will be shown when @ref printMessage is called, right before arguments table. + */ + void about(const String& message); + + /** @brief Print help message + + This method will print standard help message containing the about message and arguments description. + + @sa about + */ + void printMessage() const; + + /** @brief Print list of errors occurred + + @sa check + */ + void printErrors() const; + +protected: + void getByName(const String& name, bool space_delete, Param type, void* dst) const; + void getByIndex(int index, bool space_delete, Param type, void* dst) const; + + struct Impl; + Impl* impl; +}; + +//! @} core_utils + +//! @cond IGNORED + +/////////////////////////////// AutoBuffer implementation //////////////////////////////////////// + +template inline +AutoBuffer<_Tp, fixed_size>::AutoBuffer() +{ + ptr = buf; + sz = fixed_size; +} + +template inline +AutoBuffer<_Tp, fixed_size>::AutoBuffer(size_t _size) +{ + ptr = buf; + sz = fixed_size; + allocate(_size); +} + +template inline +AutoBuffer<_Tp, fixed_size>::AutoBuffer(const AutoBuffer<_Tp, fixed_size>& abuf ) +{ + ptr = buf; + sz = fixed_size; + allocate(abuf.size()); + for( size_t i = 0; i < sz; i++ ) + ptr[i] = abuf.ptr[i]; +} + +template inline AutoBuffer<_Tp, fixed_size>& +AutoBuffer<_Tp, fixed_size>::operator = (const AutoBuffer<_Tp, fixed_size>& abuf) +{ + if( this != &abuf ) + { + deallocate(); + allocate(abuf.size()); + for( size_t i = 0; i < sz; i++ ) + ptr[i] = abuf.ptr[i]; + } + return *this; +} + +template inline +AutoBuffer<_Tp, fixed_size>::~AutoBuffer() +{ deallocate(); } + +template inline void +AutoBuffer<_Tp, fixed_size>::allocate(size_t _size) +{ + if(_size <= sz) + { + sz = _size; + return; + } + deallocate(); + sz = _size; + if(_size > fixed_size) + { + ptr = new _Tp[_size]; + } +} + +template inline void +AutoBuffer<_Tp, fixed_size>::deallocate() +{ + if( ptr != buf ) + { + delete[] ptr; + ptr = buf; + sz = fixed_size; + } +} + +template inline void +AutoBuffer<_Tp, fixed_size>::resize(size_t _size) +{ + if(_size <= sz) + { + sz = _size; + return; + } + size_t i, prevsize = sz, minsize = MIN(prevsize, _size); + _Tp* prevptr = ptr; + + ptr = _size > fixed_size ? new _Tp[_size] : buf; + sz = _size; + + if( ptr != prevptr ) + for( i = 0; i < minsize; i++ ) + ptr[i] = prevptr[i]; + for( i = prevsize; i < _size; i++ ) + ptr[i] = _Tp(); + + if( prevptr != buf ) + delete[] prevptr; +} + +template inline size_t +AutoBuffer<_Tp, fixed_size>::size() const +{ return sz; } + +//! @endcond + + +// Basic Node class for tree building +template +class CV_EXPORTS Node +{ +public: + Node() + { + m_pParent = 0; + } + Node(OBJECT& payload) : m_payload(payload) + { + m_pParent = 0; + } + ~Node() + { + removeChilds(); + if (m_pParent) + { + int idx = m_pParent->findChild(this); + if (idx >= 0) + m_pParent->m_childs.erase(m_pParent->m_childs.begin() + idx); + } + } + + Node* findChild(OBJECT& payload) const + { + for(size_t i = 0; i < this->m_childs.size(); i++) + { + if(this->m_childs[i]->m_payload == payload) + return this->m_childs[i]; + } + return NULL; + } + + int findChild(Node *pNode) const + { + for (size_t i = 0; i < this->m_childs.size(); i++) + { + if(this->m_childs[i] == pNode) + return (int)i; + } + return -1; + } + + void addChild(Node *pNode) + { + if(!pNode) + return; + + CV_Assert(pNode->m_pParent == 0); + pNode->m_pParent = this; + this->m_childs.push_back(pNode); + } + + void removeChilds() + { + for(size_t i = 0; i < m_childs.size(); i++) + { + m_childs[i]->m_pParent = 0; // avoid excessive parent vector trimming + delete m_childs[i]; + } + m_childs.clear(); + } + + int getDepth() + { + int count = 0; + Node *pParent = m_pParent; + while(pParent) count++, pParent = pParent->m_pParent; + return count; + } + +public: + OBJECT m_payload; + Node* m_pParent; + std::vector*> m_childs; +}; + + +namespace samples { + +//! @addtogroup core_utils_samples +// This section describes utility functions for OpenCV samples. +// +// @note Implementation of these utilities is not thread-safe. +// +//! @{ + +/** @brief Try to find requested data file + +Search directories: + +1. Directories passed via `addSamplesDataSearchPath()` +2. OPENCV_SAMPLES_DATA_PATH_HINT environment variable +3. OPENCV_SAMPLES_DATA_PATH environment variable + If parameter value is not empty and nothing is found then stop searching. +4. Detects build/install path based on: + a. current working directory (CWD) + b. and/or binary module location (opencv_core/opencv_world, doesn't work with static linkage) +5. Scan `/{,data,samples/data}` directories if build directory is detected or the current directory is in source tree. +6. Scan `/share/OpenCV` directory if install directory is detected. + +@see cv::utils::findDataFile + +@param relative_path Relative path to data file +@param required Specify "file not found" handling. + If true, function prints information message and raises cv::Exception. + If false, function returns empty result +@param silentMode Disables messages +@return Returns path (absolute or relative to the current directory) or empty string if file is not found +*/ +CV_EXPORTS_W cv::String findFile(const cv::String& relative_path, bool required = true, bool silentMode = false); + +CV_EXPORTS_W cv::String findFileOrKeep(const cv::String& relative_path, bool silentMode = false); + +inline cv::String findFileOrKeep(const cv::String& relative_path, bool silentMode) +{ + cv::String res = findFile(relative_path, false, silentMode); + if (res.empty()) + return relative_path; + return res; +} + +/** @brief Override search data path by adding new search location + +Use this only to override default behavior +Passed paths are used in LIFO order. + +@param path Path to used samples data +*/ +CV_EXPORTS_W void addSamplesDataSearchPath(const cv::String& path); + +/** @brief Append samples search data sub directory + +General usage is to add OpenCV modules name (`/modules//samples/data` -> `/samples/data` + `modules//samples/data`). +Passed subdirectories are used in LIFO order. + +@param subdir samples data sub directory +*/ +CV_EXPORTS_W void addSamplesDataSearchSubDirectory(const cv::String& subdir); + +//! @} +} // namespace samples + +namespace utils { + +CV_EXPORTS int getThreadID(); + +} // namespace + +} //namespace cv + +#ifdef CV_COLLECT_IMPL_DATA +#include "opencv2/core/utils/instrumentation.hpp" +#else +/// Collect implementation data on OpenCV function call. Requires ENABLE_IMPL_COLLECTION build option. +#define CV_IMPL_ADD(impl) +#endif + +#endif //OPENCV_CORE_UTILITY_H diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.hpp new file mode 100644 index 0000000..79e9338 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.hpp @@ -0,0 +1,29 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_ALLOCATOR_STATS_HPP +#define OPENCV_CORE_ALLOCATOR_STATS_HPP + +#include "../cvdef.h" + +namespace cv { namespace utils { + +class AllocatorStatisticsInterface +{ +protected: + AllocatorStatisticsInterface() {} + virtual ~AllocatorStatisticsInterface() {} +public: + virtual uint64_t getCurrentUsage() const = 0; + virtual uint64_t getTotalUsage() const = 0; + virtual uint64_t getNumberOfAllocations() const = 0; + virtual uint64_t getPeakUsage() const = 0; + + /** set peak usage = current usage */ + virtual void resetPeakUsage() = 0; +}; + +}} // namespace + +#endif // OPENCV_CORE_ALLOCATOR_STATS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.impl.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.impl.hpp new file mode 100644 index 0000000..eb5ecde --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/allocator_stats.impl.hpp @@ -0,0 +1,158 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_ALLOCATOR_STATS_IMPL_HPP +#define OPENCV_CORE_ALLOCATOR_STATS_IMPL_HPP + +#include "./allocator_stats.hpp" + +//#define OPENCV_DISABLE_ALLOCATOR_STATS + +#ifdef CV_CXX11 + +#include + +#ifndef OPENCV_ALLOCATOR_STATS_COUNTER_TYPE +#if defined(__GNUC__) && (\ + (defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 4) || \ + (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)) \ + ) +#define OPENCV_ALLOCATOR_STATS_COUNTER_TYPE int +#endif +#endif + +#ifndef OPENCV_ALLOCATOR_STATS_COUNTER_TYPE +#define OPENCV_ALLOCATOR_STATS_COUNTER_TYPE long long +#endif + +#else // CV_CXX11 + +#ifndef OPENCV_ALLOCATOR_STATS_COUNTER_TYPE +#define OPENCV_ALLOCATOR_STATS_COUNTER_TYPE int // CV_XADD supports int only +#endif + +#endif // CV_CXX11 + +namespace cv { namespace utils { + +#ifdef CV__ALLOCATOR_STATS_LOG +namespace { +#endif + +class AllocatorStatistics : public AllocatorStatisticsInterface +{ +#ifdef OPENCV_DISABLE_ALLOCATOR_STATS + +public: + AllocatorStatistics() {} + ~AllocatorStatistics() CV_OVERRIDE {} + + uint64_t getCurrentUsage() const CV_OVERRIDE { return 0; } + uint64_t getTotalUsage() const CV_OVERRIDE { return 0; } + uint64_t getNumberOfAllocations() const CV_OVERRIDE { return 0; } + uint64_t getPeakUsage() const CV_OVERRIDE { return 0; } + + /** set peak usage = current usage */ + void resetPeakUsage() CV_OVERRIDE {}; + + void onAllocate(size_t /*sz*/) {} + void onFree(size_t /*sz*/) {} + +#elif defined(CV_CXX11) + +protected: + typedef OPENCV_ALLOCATOR_STATS_COUNTER_TYPE counter_t; + std::atomic curr, total, total_allocs, peak; +public: + AllocatorStatistics() {} + ~AllocatorStatistics() CV_OVERRIDE {} + + uint64_t getCurrentUsage() const CV_OVERRIDE { return (uint64_t)curr.load(); } + uint64_t getTotalUsage() const CV_OVERRIDE { return (uint64_t)total.load(); } + uint64_t getNumberOfAllocations() const CV_OVERRIDE { return (uint64_t)total_allocs.load(); } + uint64_t getPeakUsage() const CV_OVERRIDE { return (uint64_t)peak.load(); } + + /** set peak usage = current usage */ + void resetPeakUsage() CV_OVERRIDE { peak.store(curr.load()); } + + // Controller interface + void onAllocate(size_t sz) + { +#ifdef CV__ALLOCATOR_STATS_LOG + CV__ALLOCATOR_STATS_LOG(cv::format("allocate: %lld (curr=%lld)", (long long int)sz, (long long int)curr.load())); +#endif + + counter_t new_curr = curr.fetch_add((counter_t)sz) + (counter_t)sz; + + // peak = std::max((uint64_t)peak, new_curr); + auto prev_peak = peak.load(); + while (prev_peak < new_curr) + { + if (peak.compare_exchange_weak(prev_peak, new_curr)) + break; + } + // end of peak = max(...) + + total += (counter_t)sz; + total_allocs++; + } + void onFree(size_t sz) + { +#ifdef CV__ALLOCATOR_STATS_LOG + CV__ALLOCATOR_STATS_LOG(cv::format("free: %lld (curr=%lld)", (long long int)sz, (long long int)curr.load())); +#endif + curr -= (counter_t)sz; + } + +#else // non C++11 + +protected: + typedef OPENCV_ALLOCATOR_STATS_COUNTER_TYPE counter_t; + volatile counter_t curr, total, total_allocs, peak; // overflow is possible, CV_XADD operates with 'int' only +public: + AllocatorStatistics() + : curr(0), total(0), total_allocs(0), peak(0) + {} + ~AllocatorStatistics() CV_OVERRIDE {} + + uint64_t getCurrentUsage() const CV_OVERRIDE { return (uint64_t)curr; } + uint64_t getTotalUsage() const CV_OVERRIDE { return (uint64_t)total; } + uint64_t getNumberOfAllocations() const CV_OVERRIDE { return (uint64_t)total_allocs; } + uint64_t getPeakUsage() const CV_OVERRIDE { return (uint64_t)peak; } + + void resetPeakUsage() CV_OVERRIDE { peak = curr; } + + // Controller interface + void onAllocate(size_t sz) + { +#ifdef CV__ALLOCATOR_STATS_LOG + CV__ALLOCATOR_STATS_LOG(cv::format("allocate: %lld (curr=%lld)", (long long int)sz, (long long int)curr)); +#endif + + counter_t new_curr = (counter_t)CV_XADD(&curr, (counter_t)sz) + (counter_t)sz; + + peak = std::max((counter_t)peak, new_curr); // non-thread safe + + //CV_XADD(&total, (uint64_t)sz); // overflow with int, non-reliable... + total += sz; + + CV_XADD(&total_allocs, (counter_t)1); + } + void onFree(size_t sz) + { +#ifdef CV__ALLOCATOR_STATS_LOG + CV__ALLOCATOR_STATS_LOG(cv::format("free: %lld (curr=%lld)", (long long int)sz, (long long int)curr)); +#endif + CV_XADD(&curr, (counter_t)-sz); + } +#endif +}; + +#ifdef CV__ALLOCATOR_STATS_LOG +} // namespace +#endif + +}} // namespace + +#endif // OPENCV_CORE_ALLOCATOR_STATS_IMPL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/filesystem.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/filesystem.hpp new file mode 100644 index 0000000..8619ae4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/filesystem.hpp @@ -0,0 +1,82 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_UTILS_FILESYSTEM_HPP +#define OPENCV_UTILS_FILESYSTEM_HPP + +namespace cv { namespace utils { namespace fs { + + +CV_EXPORTS bool exists(const cv::String& path); +CV_EXPORTS bool isDirectory(const cv::String& path); + +CV_EXPORTS void remove_all(const cv::String& path); + + +CV_EXPORTS cv::String getcwd(); + +/** @brief Converts path p to a canonical absolute path + * Symlinks are processed if there is support for them on running platform. + * + * @param path input path. Target file/directory should exist. + */ +CV_EXPORTS cv::String canonical(const cv::String& path); + +/** Join path components */ +CV_EXPORTS cv::String join(const cv::String& base, const cv::String& path); + +/** Get parent directory */ +CV_EXPORTS cv::String getParent(const cv::String &path); +CV_EXPORTS std::wstring getParent(const std::wstring& path); + +/** + * Generate a list of all files that match the globbing pattern. + * + * Result entries are prefixed by base directory path. + * + * @param directory base directory + * @param pattern filter pattern (based on '*'/'?' symbols). Use empty string to disable filtering and return all results + * @param[out] result result of globing. + * @param recursive scan nested directories too + * @param includeDirectories include directories into results list + */ +CV_EXPORTS void glob(const cv::String& directory, const cv::String& pattern, + CV_OUT std::vector& result, + bool recursive = false, bool includeDirectories = false); + +/** + * Generate a list of all files that match the globbing pattern. + * + * @param directory base directory + * @param pattern filter pattern (based on '*'/'?' symbols). Use empty string to disable filtering and return all results + * @param[out] result globbing result with relative paths from base directory + * @param recursive scan nested directories too + * @param includeDirectories include directories into results list + */ +CV_EXPORTS void glob_relative(const cv::String& directory, const cv::String& pattern, + CV_OUT std::vector& result, + bool recursive = false, bool includeDirectories = false); + + +CV_EXPORTS bool createDirectory(const cv::String& path); +CV_EXPORTS bool createDirectories(const cv::String& path); + +#if defined(__OPENCV_BUILD) || defined(BUILD_PLUGIN) +// TODO +//CV_EXPORTS cv::String getTempDirectory(); + +/** + * @brief Returns directory to store OpenCV cache files + * Create sub-directory in common OpenCV cache directory if it doesn't exist. + * @param sub_directory_name name of sub-directory. NULL or "" value asks to return root cache directory. + * @param configuration_name optional name of configuration parameter name which overrides default behavior. + * @return Path to cache directory. Returns empty string if cache directories support is not available. Returns "disabled" if cache disabled by user. + */ +CV_EXPORTS cv::String getCacheDirectory(const char* sub_directory_name, const char* configuration_name = NULL); + +#endif + +}}} // namespace + +#endif // OPENCV_UTILS_FILESYSTEM_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/fp_control_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/fp_control_utils.hpp new file mode 100644 index 0000000..930bc5d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/fp_control_utils.hpp @@ -0,0 +1,69 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_FP_CONTROL_UTILS_HPP +#define OPENCV_CORE_FP_CONTROL_UTILS_HPP + +namespace cv { + +namespace details { + +struct FPDenormalsModeState +{ + uint32_t reserved[16]; // 64-bytes +}; // FPDenormalsModeState + +CV_EXPORTS void setFPDenormalsIgnoreHint(bool ignore, CV_OUT FPDenormalsModeState& state); +CV_EXPORTS int saveFPDenormalsState(CV_OUT FPDenormalsModeState& state); +CV_EXPORTS bool restoreFPDenormalsState(const FPDenormalsModeState& state); + +class FPDenormalsIgnoreHintScope +{ +public: + inline explicit FPDenormalsIgnoreHintScope(bool ignore = true) + { + details::setFPDenormalsIgnoreHint(ignore, saved_state); + } + + inline explicit FPDenormalsIgnoreHintScope(const FPDenormalsModeState& state) + { + details::saveFPDenormalsState(saved_state); + details::restoreFPDenormalsState(state); + } + + inline ~FPDenormalsIgnoreHintScope() + { + details::restoreFPDenormalsState(saved_state); + } + +protected: + FPDenormalsModeState saved_state; +}; // FPDenormalsIgnoreHintScope + +class FPDenormalsIgnoreHintScopeNOOP +{ +public: + inline FPDenormalsIgnoreHintScopeNOOP(bool ignore = true) { CV_UNUSED(ignore); } + inline FPDenormalsIgnoreHintScopeNOOP(const FPDenormalsModeState& state) { CV_UNUSED(state); } + inline ~FPDenormalsIgnoreHintScopeNOOP() { } +}; // FPDenormalsIgnoreHintScopeNOOP + +} // namespace details + + +// Should depend on target compilation architecture only +// Note: previously added archs should NOT be removed to preserve ABI compatibility +#if defined(OPENCV_SUPPORTS_FP_DENORMALS_HINT) + // preserve configuration overloading through ports +#elif defined(__i386__) || defined(__x86_64__) || defined(_M_X64) || defined(_X86_) +typedef details::FPDenormalsIgnoreHintScope FPDenormalsIgnoreHintScope; +#define OPENCV_SUPPORTS_FP_DENORMALS_HINT 1 +#else +#define OPENCV_SUPPORTS_FP_DENORMALS_HINT 0 +typedef details::FPDenormalsIgnoreHintScopeNOOP FPDenormalsIgnoreHintScope; +#endif + +} // namespace cv + +#endif // OPENCV_CORE_FP_CONTROL_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/instrumentation.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/instrumentation.hpp new file mode 100644 index 0000000..3639867 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/instrumentation.hpp @@ -0,0 +1,125 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_UTILS_INSTR_HPP +#define OPENCV_UTILS_INSTR_HPP + +#include +#include + +namespace cv { + +//! @addtogroup core_utils +//! @{ + +#ifdef CV_COLLECT_IMPL_DATA +CV_EXPORTS void setImpl(int flags); // set implementation flags and reset storage arrays +CV_EXPORTS void addImpl(int flag, const char* func = 0); // add implementation and function name to storage arrays +// Get stored implementation flags and functions names arrays +// Each implementation entry correspond to function name entry, so you can find which implementation was executed in which function +CV_EXPORTS int getImpl(std::vector &impl, std::vector &funName); + +CV_EXPORTS bool useCollection(); // return implementation collection state +CV_EXPORTS void setUseCollection(bool flag); // set implementation collection state + +#define CV_IMPL_PLAIN 0x01 // native CPU OpenCV implementation +#define CV_IMPL_OCL 0x02 // OpenCL implementation +#define CV_IMPL_IPP 0x04 // IPP implementation +#define CV_IMPL_MT 0x10 // multithreaded implementation + +#undef CV_IMPL_ADD +#define CV_IMPL_ADD(impl) \ + if(cv::useCollection()) \ + { \ + cv::addImpl(impl, CV_Func); \ + } +#endif + +// Instrumentation external interface +namespace instr +{ + +#if !defined OPENCV_ABI_CHECK + +enum TYPE +{ + TYPE_GENERAL = 0, // OpenCV API function, e.g. exported function + TYPE_MARKER, // Information marker + TYPE_WRAPPER, // Wrapper function for implementation + TYPE_FUN, // Simple function call +}; + +enum IMPL +{ + IMPL_PLAIN = 0, + IMPL_IPP, + IMPL_OPENCL, +}; + +struct NodeDataTls +{ + NodeDataTls() + { + m_ticksTotal = 0; + } + uint64 m_ticksTotal; +}; + +class CV_EXPORTS NodeData +{ +public: + NodeData(const char* funName = 0, const char* fileName = NULL, int lineNum = 0, void* retAddress = NULL, bool alwaysExpand = false, cv::instr::TYPE instrType = TYPE_GENERAL, cv::instr::IMPL implType = IMPL_PLAIN); + NodeData(NodeData &ref); + ~NodeData(); + NodeData& operator=(const NodeData&); + + cv::String m_funName; + cv::instr::TYPE m_instrType; + cv::instr::IMPL m_implType; + const char* m_fileName; + int m_lineNum; + void* m_retAddress; + bool m_alwaysExpand; + bool m_funError; + + volatile int m_counter; + volatile uint64 m_ticksTotal; + TLSDataAccumulator m_tls; + int m_threads; + + // No synchronization + double getTotalMs() const { return ((double)m_ticksTotal / cv::getTickFrequency()) * 1000; } + double getMeanMs() const { return (((double)m_ticksTotal/m_counter) / cv::getTickFrequency()) * 1000; } +}; +bool operator==(const NodeData& lhs, const NodeData& rhs); + +typedef Node InstrNode; + +CV_EXPORTS InstrNode* getTrace(); + +#endif // !defined OPENCV_ABI_CHECK + + +CV_EXPORTS bool useInstrumentation(); +CV_EXPORTS void setUseInstrumentation(bool flag); +CV_EXPORTS void resetTrace(); + +enum FLAGS +{ + FLAGS_NONE = 0, + FLAGS_MAPPING = 0x01, + FLAGS_EXPAND_SAME_NAMES = 0x02, +}; + +CV_EXPORTS void setFlags(FLAGS modeFlags); +static inline void setFlags(int modeFlags) { setFlags((FLAGS)modeFlags); } +CV_EXPORTS FLAGS getFlags(); + +} // namespace instr + +//! @} + +} // namespace + +#endif // OPENCV_UTILS_TLS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/logger.defines.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/logger.defines.hpp new file mode 100644 index 0000000..7d73f02 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/logger.defines.hpp @@ -0,0 +1,42 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_LOGGER_DEFINES_HPP +#define OPENCV_LOGGER_DEFINES_HPP + +//! @addtogroup core_logging +//! @{ + +// Supported logging levels and their semantic +#define CV_LOG_LEVEL_SILENT 0 //!< for using in setLogLevel() call +#define CV_LOG_LEVEL_FATAL 1 //!< Fatal (critical) error (unrecoverable internal error) +#define CV_LOG_LEVEL_ERROR 2 //!< Error message +#define CV_LOG_LEVEL_WARN 3 //!< Warning message +#define CV_LOG_LEVEL_INFO 4 //!< Info message +#define CV_LOG_LEVEL_DEBUG 5 //!< Debug message. Disabled in the "Release" build. +#define CV_LOG_LEVEL_VERBOSE 6 //!< Verbose (trace) messages. Requires verbosity level. Disabled in the "Release" build. + +namespace cv { +namespace utils { +namespace logging { + +//! Supported logging levels and their semantic +enum LogLevel { + LOG_LEVEL_SILENT = 0, //!< for using in setLogVevel() call + LOG_LEVEL_FATAL = 1, //!< Fatal (critical) error (unrecoverable internal error) + LOG_LEVEL_ERROR = 2, //!< Error message + LOG_LEVEL_WARNING = 3, //!< Warning message + LOG_LEVEL_INFO = 4, //!< Info message + LOG_LEVEL_DEBUG = 5, //!< Debug message. Disabled in the "Release" build. + LOG_LEVEL_VERBOSE = 6, //!< Verbose (trace) messages. Requires verbosity level. Disabled in the "Release" build. +#ifndef CV_DOXYGEN + ENUM_LOG_LEVEL_FORCE_INT = INT_MAX +#endif +}; + +}}} // namespace + +//! @} + +#endif // OPENCV_LOGGER_DEFINES_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/logger.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/logger.hpp new file mode 100644 index 0000000..accb860 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/logger.hpp @@ -0,0 +1,218 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_LOGGER_HPP +#define OPENCV_LOGGER_HPP + +#include +#include +#include // INT_MAX + +#include "logger.defines.hpp" +#include "logtag.hpp" + +namespace cv { +namespace utils { +namespace logging { + +//! @addtogroup core_logging +//! @{ + +/** Set global logging level +@return previous logging level +*/ +CV_EXPORTS LogLevel setLogLevel(LogLevel logLevel); +/** Get global logging level */ +CV_EXPORTS LogLevel getLogLevel(); + +CV_EXPORTS void registerLogTag(cv::utils::logging::LogTag* plogtag); + +CV_EXPORTS void setLogTagLevel(const char* tag, cv::utils::logging::LogLevel level); + +CV_EXPORTS cv::utils::logging::LogLevel getLogTagLevel(const char* tag); + +namespace internal { + +/** Get global log tag */ +CV_EXPORTS cv::utils::logging::LogTag* getGlobalLogTag(); + +/** Write log message */ +CV_EXPORTS void writeLogMessage(LogLevel logLevel, const char* message); + +/** Write log message */ +CV_EXPORTS void writeLogMessageEx(LogLevel logLevel, const char* tag, const char* file, int line, const char* func, const char* message); + +} // namespace + +struct LogTagAuto + : public LogTag +{ + inline LogTagAuto(const char* _name, LogLevel _level) + : LogTag(_name, _level) + { + registerLogTag(this); + } +}; + +/** + * \def CV_LOG_STRIP_LEVEL + * + * Define CV_LOG_STRIP_LEVEL=CV_LOG_LEVEL_[DEBUG|INFO|WARN|ERROR|FATAL|SILENT] to compile out anything at that and before that logging level + */ +#ifndef CV_LOG_STRIP_LEVEL +# if defined NDEBUG +# define CV_LOG_STRIP_LEVEL CV_LOG_LEVEL_DEBUG +# else +# define CV_LOG_STRIP_LEVEL CV_LOG_LEVEL_VERBOSE +# endif +#endif + +#define CV_LOGTAG_PTR_CAST(expr) static_cast(expr) + +// CV_LOGTAG_EXPAND_NAME is intended to be re-defined (undef and then define again) +// to allows logging users to use a shorter name argument when calling +// CV_LOG_WITH_TAG or its related macros such as CV_LOG_INFO. +// +// This macro is intended to modify the tag argument as a string (token), via +// preprocessor token pasting or metaprogramming techniques. A typical usage +// is to apply a prefix, such as +// ...... #define CV_LOGTAG_EXPAND_NAME(tag) cv_logtag_##tag +// +// It is permitted to re-define to a hard-coded expression, ignoring the tag. +// This would work identically like the CV_LOGTAG_FALLBACK macro. +// +// Important: When the logging macro is called with tag being NULL, a user-defined +// CV_LOGTAG_EXPAND_NAME may expand it into cv_logtag_0, cv_logtag_NULL, or +// cv_logtag_nullptr. Use with care. Also be mindful of C++ symbol redefinitions. +// +// If there is significant amount of logging code with tag being NULL, it is +// recommended to use (re-define) CV_LOGTAG_FALLBACK to inject locally a default +// tag at the beginning of a compilation unit, to minimize lines of code changes. +// +#define CV_LOGTAG_EXPAND_NAME(tag) tag + +// CV_LOGTAG_FALLBACK is intended to be re-defined (undef and then define again) +// by any other compilation units to provide a log tag when the logging statement +// does not specify one. The macro needs to expand into a C++ expression that can +// be static_cast into (cv::utils::logging::LogTag*). Null (nullptr) is permitted. +#define CV_LOGTAG_FALLBACK nullptr + +// CV_LOGTAG_GLOBAL is the tag used when a log tag is not specified in the logging +// statement nor the compilation unit. The macro needs to expand into a C++ +// expression that can be static_cast into (cv::utils::logging::LogTag*). Must be +// non-null. Do not re-define. +#define CV_LOGTAG_GLOBAL cv::utils::logging::internal::getGlobalLogTag() + +#define CV_LOG_WITH_TAG(tag, msgLevel, extra_check0, extra_check1, ...) \ + for(;;) { \ + extra_check0; \ + const auto cv_temp_msglevel = (cv::utils::logging::LogLevel)(msgLevel); \ + if (cv_temp_msglevel >= (CV_LOG_STRIP_LEVEL)) break; \ + auto cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_EXPAND_NAME(tag)); \ + if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_FALLBACK); \ + if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_GLOBAL); \ + if (cv_temp_logtagptr && (cv_temp_msglevel > cv_temp_logtagptr->level)) break; \ + extra_check1; \ + std::stringstream cv_temp_logstream; \ + cv_temp_logstream << __VA_ARGS__; \ + cv::utils::logging::internal::writeLogMessageEx( \ + cv_temp_msglevel, \ + (cv_temp_logtagptr ? cv_temp_logtagptr->name : nullptr), \ + __FILE__, \ + __LINE__, \ + CV_Func, \ + cv_temp_logstream.str().c_str()); \ + break; \ + } + +#define CV_LOG_FATAL(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , , __VA_ARGS__) +#define CV_LOG_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , , __VA_ARGS__) +#define CV_LOG_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , , __VA_ARGS__) +#define CV_LOG_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , , __VA_ARGS__) +#define CV_LOG_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , , __VA_ARGS__) +#define CV_LOG_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), , , __VA_ARGS__) + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO +#undef CV_LOG_INFO +#define CV_LOG_INFO(tag, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG +#undef CV_LOG_DEBUG +#define CV_LOG_DEBUG(tag, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE +#undef CV_LOG_VERBOSE +#define CV_LOG_VERBOSE(tag, v, ...) +#endif + +//! @cond IGNORED +#define CV__LOG_ONCE_CHECK_PRE \ + static bool _cv_log_once_ ## __LINE__ = false; \ + if (_cv_log_once_ ## __LINE__) break; + +#define CV__LOG_ONCE_CHECK_POST \ + _cv_log_once_ ## __LINE__ = true; + +#define CV__LOG_IF_CHECK(logging_cond) \ + if (!(logging_cond)) break; + +//! @endcond + + +// CV_LOG_ONCE_XXX macros + +#define CV_LOG_ONCE_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__) +#define CV_LOG_ONCE_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__) +#define CV_LOG_ONCE_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__) +#define CV_LOG_ONCE_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__) +#define CV_LOG_ONCE_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__) + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO +#undef CV_LOG_ONCE_INFO +#define CV_LOG_ONCE_INFO(tag, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG +#undef CV_LOG_ONCE_DEBUG +#define CV_LOG_ONCE_DEBUG(tag, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE +#undef CV_LOG_ONCE_VERBOSE +#define CV_LOG_ONCE_VERBOSE(tag, v, ...) +#endif + + +// CV_LOG_IF_XXX macros + +#define CV_LOG_IF_FATAL(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) +#define CV_LOG_IF_ERROR(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) +#define CV_LOG_IF_WARNING(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) +#define CV_LOG_IF_INFO(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) +#define CV_LOG_IF_DEBUG(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) +#define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__) + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO +#undef CV_LOG_IF_INFO +#define CV_LOG_IF_INFO(tag, logging_cond, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG +#undef CV_LOG_IF_DEBUG +#define CV_LOG_IF_DEBUG(tag, logging_cond, ...) +#endif + +#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE +#undef CV_LOG_IF_VERBOSE +#define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...) +#endif + + +//! @} + +}}} // namespace + +#endif // OPENCV_LOGGER_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/logtag.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/logtag.hpp new file mode 100644 index 0000000..4089720 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/logtag.hpp @@ -0,0 +1,28 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_CORE_LOGTAG_HPP +#define OPENCV_CORE_LOGTAG_HPP + +#include "opencv2/core/cvstd.hpp" +#include "logger.defines.hpp" + +namespace cv { +namespace utils { +namespace logging { + +struct LogTag +{ + const char* name; + LogLevel level; + + inline LogTag(const char* _name, LogLevel _level) + : name(_name) + , level(_level) + {} +}; + +}}} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/tls.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/tls.hpp new file mode 100644 index 0000000..124caeb --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/tls.hpp @@ -0,0 +1,235 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_UTILS_TLS_HPP +#define OPENCV_UTILS_TLS_HPP + +#ifndef OPENCV_CORE_UTILITY_H +#error "tls.hpp must be included after opencv2/core/utility.hpp or opencv2/core.hpp" +#endif + +namespace cv { + +//! @addtogroup core_utils +//! @{ + +namespace details { class TlsStorage; } + +/** TLS container base implementation + * + * Don't use directly. + * + * @sa TLSData, TLSDataAccumulator templates + */ +class CV_EXPORTS TLSDataContainer +{ +protected: + TLSDataContainer(); + virtual ~TLSDataContainer(); + + /// @deprecated use detachData() instead + void gatherData(std::vector &data) const; + /// get TLS data and detach all data from threads (similar to cleanup() call) + void detachData(std::vector& data); + + void* getData() const; + void release(); + +protected: + virtual void* createDataInstance() const = 0; + virtual void deleteDataInstance(void* pData) const = 0; + +private: + int key_; + + friend class cv::details::TlsStorage; // core/src/system.cpp + +public: + void cleanup(); //!< Release created TLS data container objects. It is similar to release() call, but it keeps TLS container valid. + +private: + // Disable copy/assign (noncopyable pattern) + TLSDataContainer(TLSDataContainer &) = delete; + TLSDataContainer& operator =(const TLSDataContainer &) = delete; +}; + + +/** @brief Simple TLS data class + * + * @sa TLSDataAccumulator + */ +template +class TLSData : protected TLSDataContainer +{ +public: + inline TLSData() {} + inline ~TLSData() { release(); } + + inline T* get() const { return (T*)getData(); } //!< Get data associated with key + inline T& getRef() const { T* ptr = (T*)getData(); CV_DbgAssert(ptr); return *ptr; } //!< Get data associated with key + + /// Release associated thread data + inline void cleanup() + { + TLSDataContainer::cleanup(); + } + +protected: + /// Wrapper to allocate data by template + virtual void* createDataInstance() const CV_OVERRIDE { return new T; } + /// Wrapper to release data by template + virtual void deleteDataInstance(void* pData) const CV_OVERRIDE { delete (T*)pData; } +}; + + +/// TLS data accumulator with gathering methods +template +class TLSDataAccumulator : public TLSData +{ + mutable cv::Mutex mutex; + mutable std::vector dataFromTerminatedThreads; + std::vector detachedData; + bool cleanupMode; +public: + TLSDataAccumulator() : cleanupMode(false) {} + ~TLSDataAccumulator() + { + release(); + } + + /** @brief Get data from all threads + * @deprecated replaced by detachData() + * + * Lifetime of vector data is valid until next detachData()/cleanup()/release() calls + * + * @param[out] data result buffer (should be empty) + */ + void gather(std::vector &data) const + { + CV_Assert(cleanupMode == false); // state is not valid + CV_Assert(data.empty()); + { + std::vector &dataVoid = reinterpret_cast&>(data); + TLSDataContainer::gatherData(dataVoid); + } + { + AutoLock lock(mutex); + data.reserve(data.size() + dataFromTerminatedThreads.size()); + for (typename std::vector::const_iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i) + { + data.push_back((T*)*i); + } + } + } + + /** @brief Get and detach data from all threads + * + * Call cleanupDetachedData() when returned vector is not needed anymore. + * + * @return Vector with associated data. Content is preserved (including lifetime of attached data pointers) until next detachData()/cleanupDetachedData()/cleanup()/release() calls + */ + std::vector& detachData() + { + CV_Assert(cleanupMode == false); // state is not valid + std::vector dataVoid; + { + TLSDataContainer::detachData(dataVoid); + } + { + AutoLock lock(mutex); + detachedData.reserve(dataVoid.size() + dataFromTerminatedThreads.size()); + for (typename std::vector::const_iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i) + { + detachedData.push_back((T*)*i); + } + dataFromTerminatedThreads.clear(); + for (typename std::vector::const_iterator i = dataVoid.begin(); i != dataVoid.end(); ++i) + { + detachedData.push_back((T*)(void*)*i); + } + } + dataVoid.clear(); + return detachedData; + } + + /// Release associated thread data returned by detachData() call + void cleanupDetachedData() + { + AutoLock lock(mutex); + cleanupMode = true; + _cleanupDetachedData(); + cleanupMode = false; + } + + /// Release associated thread data + void cleanup() + { + cleanupMode = true; + TLSDataContainer::cleanup(); + + AutoLock lock(mutex); + _cleanupDetachedData(); + _cleanupTerminatedData(); + cleanupMode = false; + } + + /// Release associated thread data and free TLS key + void release() + { + cleanupMode = true; + TLSDataContainer::release(); + { + AutoLock lock(mutex); + _cleanupDetachedData(); + _cleanupTerminatedData(); + } + } + +protected: + // synchronized + void _cleanupDetachedData() + { + for (typename std::vector::iterator i = detachedData.begin(); i != detachedData.end(); ++i) + { + deleteDataInstance((T*)*i); + } + detachedData.clear(); + } + + // synchronized + void _cleanupTerminatedData() + { + for (typename std::vector::iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i) + { + deleteDataInstance((T*)*i); + } + dataFromTerminatedThreads.clear(); + } + +protected: + virtual void* createDataInstance() const CV_OVERRIDE + { + // Note: we can collect all allocated data here, but this would require raced mutex locks + return new T; + } + virtual void deleteDataInstance(void* pData) const CV_OVERRIDE + { + if (cleanupMode) + { + delete (T*)pData; + } + else + { + AutoLock lock(mutex); + dataFromTerminatedThreads.push_back((T*)pData); + } + } +}; + + +//! @} + +} // namespace + +#endif // OPENCV_UTILS_TLS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/utils/trace.hpp b/Thirdparty/opencv2/include/opencv2/core/utils/trace.hpp new file mode 100644 index 0000000..ea43bbe --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/utils/trace.hpp @@ -0,0 +1,252 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_TRACE_HPP +#define OPENCV_TRACE_HPP + +#include + +namespace cv { +namespace utils { +namespace trace { + +//! @addtogroup core_logging +//! @{ + +//! Macro to trace function +#define CV_TRACE_FUNCTION() + +#define CV_TRACE_FUNCTION_SKIP_NESTED() + +//! Trace code scope. +//! @note Dynamic names are not supported in this macro (on stack or heap). Use string literals here only, like "initialize". +#define CV_TRACE_REGION(name_as_static_string_literal) +//! mark completed of the current opened region and create new one +//! @note Dynamic names are not supported in this macro (on stack or heap). Use string literals here only, like "step1". +#define CV_TRACE_REGION_NEXT(name_as_static_string_literal) + +//! Macro to trace argument value +#define CV_TRACE_ARG(arg_id) + +//! Macro to trace argument value (expanded version) +#define CV_TRACE_ARG_VALUE(arg_id, arg_name, value) + +//! @cond IGNORED +#define CV_TRACE_NS cv::utils::trace + +#if !defined(OPENCV_DISABLE_TRACE) && defined(__EMSCRIPTEN__) +#define OPENCV_DISABLE_TRACE 1 +#endif + +namespace details { + +#ifndef __OPENCV_TRACE +# if defined __OPENCV_BUILD && !defined __OPENCV_TESTS && !defined __OPENCV_APPS +# define __OPENCV_TRACE 1 +# else +# define __OPENCV_TRACE 0 +# endif +#endif + +#ifndef CV_TRACE_FILENAME +# define CV_TRACE_FILENAME __FILE__ +#endif + +#ifndef CV__TRACE_FUNCTION +# if defined _MSC_VER +# define CV__TRACE_FUNCTION __FUNCSIG__ +# elif defined __GNUC__ +# define CV__TRACE_FUNCTION __PRETTY_FUNCTION__ +# else +# define CV__TRACE_FUNCTION "" +# endif +#endif + +//! Thread-local instance (usually allocated on stack) +class CV_EXPORTS Region +{ +public: + struct LocationExtraData; + struct LocationStaticStorage + { + LocationExtraData** ppExtra; ///< implementation specific data + const char* name; ///< region name (function name or other custom name) + const char* filename; ///< source code filename + int line; ///< source code line + int flags; ///< flags (implementation code path: Plain, IPP, OpenCL) + }; + + Region(const LocationStaticStorage& location); + inline ~Region() + { + if (implFlags != 0) + destroy(); + CV_DbgAssert(implFlags == 0); + CV_DbgAssert(pImpl == NULL); + } + + class Impl; + Impl* pImpl; // NULL if current region is not active + int implFlags; // see RegionFlag, 0 if region is ignored + + bool isActive() const { return pImpl != NULL; } + + void destroy(); +private: + Region(const Region&); // disabled + Region& operator= (const Region&); // disabled +}; + +//! Specify region flags +enum RegionLocationFlag { + REGION_FLAG_FUNCTION = (1 << 0), ///< region is function (=1) / nested named region (=0) + REGION_FLAG_APP_CODE = (1 << 1), ///< region is Application code (=1) / OpenCV library code (=0) + REGION_FLAG_SKIP_NESTED = (1 << 2), ///< avoid processing of nested regions + + REGION_FLAG_IMPL_IPP = (1 << 16), ///< region is part of IPP code path + REGION_FLAG_IMPL_OPENCL = (2 << 16), ///< region is part of OpenCL code path + REGION_FLAG_IMPL_OPENVX = (3 << 16), ///< region is part of OpenVX code path + + REGION_FLAG_IMPL_MASK = (15 << 16), + + REGION_FLAG_REGION_FORCE = (1 << 30), + REGION_FLAG_REGION_NEXT = (1 << 31), ///< close previous region (see #CV_TRACE_REGION_NEXT macro) + + ENUM_REGION_FLAG_FORCE_INT = INT_MAX +}; + +struct CV_EXPORTS TraceArg { +public: + struct ExtraData; + ExtraData** ppExtra; + const char* name; + int flags; +}; +/** @brief Add meta information to current region (function) + * See CV_TRACE_ARG macro + * @param arg argument information structure (global static cache) + * @param value argument value (can by dynamic string literal in case of string, static allocation is not required) + */ +CV_EXPORTS void traceArg(const TraceArg& arg, const char* value); +//! @overload +CV_EXPORTS void traceArg(const TraceArg& arg, int value); +//! @overload +CV_EXPORTS void traceArg(const TraceArg& arg, int64 value); +//! @overload +CV_EXPORTS void traceArg(const TraceArg& arg, double value); + +#define CV__TRACE_LOCATION_VARNAME(loc_id) CVAUX_CONCAT(CVAUX_CONCAT(__cv_trace_location_, loc_id), __LINE__) +#define CV__TRACE_LOCATION_EXTRA_VARNAME(loc_id) CVAUX_CONCAT(CVAUX_CONCAT(__cv_trace_location_extra_, loc_id) , __LINE__) + +#define CV__TRACE_DEFINE_LOCATION_(loc_id, name, flags) \ + static CV_TRACE_NS::details::Region::LocationExtraData* CV__TRACE_LOCATION_EXTRA_VARNAME(loc_id) = 0; \ + static const CV_TRACE_NS::details::Region::LocationStaticStorage \ + CV__TRACE_LOCATION_VARNAME(loc_id) = { &(CV__TRACE_LOCATION_EXTRA_VARNAME(loc_id)), name, CV_TRACE_FILENAME, __LINE__, flags}; + +#define CV__TRACE_DEFINE_LOCATION_FN(name, flags) CV__TRACE_DEFINE_LOCATION_(fn, name, ((flags) | CV_TRACE_NS::details::REGION_FLAG_FUNCTION)) + + +#define CV__TRACE_OPENCV_FUNCTION() \ + CV__TRACE_DEFINE_LOCATION_FN(CV__TRACE_FUNCTION, 0); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + +#define CV__TRACE_OPENCV_FUNCTION_NAME(name) \ + CV__TRACE_DEFINE_LOCATION_FN(name, 0); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + +#define CV__TRACE_APP_FUNCTION() \ + CV__TRACE_DEFINE_LOCATION_FN(CV__TRACE_FUNCTION, CV_TRACE_NS::details::REGION_FLAG_APP_CODE); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + +#define CV__TRACE_APP_FUNCTION_NAME(name) \ + CV__TRACE_DEFINE_LOCATION_FN(name, CV_TRACE_NS::details::REGION_FLAG_APP_CODE); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + + +#define CV__TRACE_OPENCV_FUNCTION_SKIP_NESTED() \ + CV__TRACE_DEFINE_LOCATION_FN(CV__TRACE_FUNCTION, CV_TRACE_NS::details::REGION_FLAG_SKIP_NESTED); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + +#define CV__TRACE_OPENCV_FUNCTION_NAME_SKIP_NESTED(name) \ + CV__TRACE_DEFINE_LOCATION_FN(name, CV_TRACE_NS::details::REGION_FLAG_SKIP_NESTED); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + +#define CV__TRACE_APP_FUNCTION_SKIP_NESTED() \ + CV__TRACE_DEFINE_LOCATION_FN(CV__TRACE_FUNCTION, CV_TRACE_NS::details::REGION_FLAG_SKIP_NESTED | CV_TRACE_NS::details::REGION_FLAG_APP_CODE); \ + const CV_TRACE_NS::details::Region __region_fn(CV__TRACE_LOCATION_VARNAME(fn)); + + +#define CV__TRACE_REGION_(name_as_static_string_literal, flags) \ + CV__TRACE_DEFINE_LOCATION_(region, name_as_static_string_literal, flags); \ + CV_TRACE_NS::details::Region CVAUX_CONCAT(__region_, __LINE__)(CV__TRACE_LOCATION_VARNAME(region)); + +#define CV__TRACE_REGION(name_as_static_string_literal) CV__TRACE_REGION_(name_as_static_string_literal, 0) +#define CV__TRACE_REGION_NEXT(name_as_static_string_literal) CV__TRACE_REGION_(name_as_static_string_literal, CV_TRACE_NS::details::REGION_FLAG_REGION_NEXT) + +#define CV__TRACE_ARG_VARNAME(arg_id) CVAUX_CONCAT(__cv_trace_arg_ ## arg_id, __LINE__) +#define CV__TRACE_ARG_EXTRA_VARNAME(arg_id) CVAUX_CONCAT(__cv_trace_arg_extra_ ## arg_id, __LINE__) + +#define CV__TRACE_DEFINE_ARG_(arg_id, name, flags) \ + static CV_TRACE_NS::details::TraceArg::ExtraData* CV__TRACE_ARG_EXTRA_VARNAME(arg_id) = 0; \ + static const CV_TRACE_NS::details::TraceArg \ + CV__TRACE_ARG_VARNAME(arg_id) = { &(CV__TRACE_ARG_EXTRA_VARNAME(arg_id)), name, flags }; + +#define CV__TRACE_ARG_VALUE(arg_id, arg_name, value) \ + CV__TRACE_DEFINE_ARG_(arg_id, arg_name, 0); \ + CV_TRACE_NS::details::traceArg((CV__TRACE_ARG_VARNAME(arg_id)), value); + +#define CV__TRACE_ARG(arg_id) CV_TRACE_ARG_VALUE(arg_id, #arg_id, (arg_id)) + +} // namespace + +#ifndef OPENCV_DISABLE_TRACE +#undef CV_TRACE_FUNCTION +#undef CV_TRACE_FUNCTION_SKIP_NESTED +#if __OPENCV_TRACE +#define CV_TRACE_FUNCTION CV__TRACE_OPENCV_FUNCTION +#define CV_TRACE_FUNCTION_SKIP_NESTED CV__TRACE_OPENCV_FUNCTION_SKIP_NESTED +#else +#define CV_TRACE_FUNCTION CV__TRACE_APP_FUNCTION +#define CV_TRACE_FUNCTION_SKIP_NESTED CV__TRACE_APP_FUNCTION_SKIP_NESTED +#endif + +#undef CV_TRACE_REGION +#define CV_TRACE_REGION CV__TRACE_REGION + +#undef CV_TRACE_REGION_NEXT +#define CV_TRACE_REGION_NEXT CV__TRACE_REGION_NEXT + +#undef CV_TRACE_ARG_VALUE +#define CV_TRACE_ARG_VALUE(arg_id, arg_name, value) \ + if (__region_fn.isActive()) \ + { \ + CV__TRACE_ARG_VALUE(arg_id, arg_name, value); \ + } + +#undef CV_TRACE_ARG +#define CV_TRACE_ARG CV__TRACE_ARG + +#endif // OPENCV_DISABLE_TRACE + +#ifdef OPENCV_TRACE_VERBOSE +#define CV_TRACE_FUNCTION_VERBOSE CV_TRACE_FUNCTION +#define CV_TRACE_REGION_VERBOSE CV_TRACE_REGION +#define CV_TRACE_REGION_NEXT_VERBOSE CV_TRACE_REGION_NEXT +#define CV_TRACE_ARG_VALUE_VERBOSE CV_TRACE_ARG_VALUE +#define CV_TRACE_ARG_VERBOSE CV_TRACE_ARG +#else +#define CV_TRACE_FUNCTION_VERBOSE(...) +#define CV_TRACE_REGION_VERBOSE(...) +#define CV_TRACE_REGION_NEXT_VERBOSE(...) +#define CV_TRACE_ARG_VALUE_VERBOSE(...) +#define CV_TRACE_ARG_VERBOSE(...) +#endif + +//! @endcond + +//! @} + +}}} // namespace + +#endif // OPENCV_TRACE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/va_intel.hpp b/Thirdparty/opencv2/include/opencv2/core/va_intel.hpp new file mode 100644 index 0000000..b37ce75 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/va_intel.hpp @@ -0,0 +1,75 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +// Copyright (C) 2015, Itseez, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. + +#ifndef OPENCV_CORE_VA_INTEL_HPP +#define OPENCV_CORE_VA_INTEL_HPP + +#ifndef __cplusplus +# error va_intel.hpp header must be compiled as C++ +#endif + +#include "opencv2/core.hpp" +#include "ocl.hpp" + +#if defined(HAVE_VA) +# include "va/va.h" +#else // HAVE_VA +# if !defined(_VA_H_) + typedef void* VADisplay; + typedef unsigned int VASurfaceID; +# endif // !_VA_H_ +#endif // HAVE_VA + +namespace cv { namespace va_intel { + +/** @addtogroup core_va_intel +This section describes Intel VA-API/OpenCL (CL-VA) interoperability. + +To enable basic VA interoperability build OpenCV with libva library integration enabled: `-DWITH_VA=ON` (corresponding dev package should be installed). + +To enable advanced CL-VA interoperability support on Intel HW, enable option: `-DWITH_VA_INTEL=ON` (OpenCL integration should be enabled which is the default setting). Special runtime environment should be set up in order to use this feature: correct combination of [libva](https://github.com/intel/libva), [OpenCL runtime](https://github.com/intel/compute-runtime) and [media driver](https://github.com/intel/media-driver) should be installed. + +Check usage example for details: samples/va_intel/va_intel_interop.cpp +*/ +//! @{ + +/////////////////// CL-VA Interoperability Functions /////////////////// + +namespace ocl { +using namespace cv::ocl; + +// TODO static functions in the Context class +/** @brief Creates OpenCL context from VA. +@param display - VADisplay for which CL interop should be established. +@param tryInterop - try to set up for interoperability, if true; set up for use slow copy if false. +@return Returns reference to OpenCL Context + */ +CV_EXPORTS Context& initializeContextFromVA(VADisplay display, bool tryInterop = true); + +} // namespace cv::va_intel::ocl + +/** @brief Converts InputArray to VASurfaceID object. +@param display - VADisplay object. +@param src - source InputArray. +@param surface - destination VASurfaceID object. +@param size - size of image represented by VASurfaceID object. + */ +CV_EXPORTS void convertToVASurface(VADisplay display, InputArray src, VASurfaceID surface, Size size); + +/** @brief Converts VASurfaceID object to OutputArray. +@param display - VADisplay object. +@param surface - source VASurfaceID object. +@param size - size of image represented by VASurfaceID object. +@param dst - destination OutputArray. + */ +CV_EXPORTS void convertFromVASurface(VADisplay display, VASurfaceID surface, Size size, OutputArray dst); + +//! @} + +}} // namespace cv::va_intel + +#endif /* OPENCV_CORE_VA_INTEL_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/core/version.hpp b/Thirdparty/opencv2/include/opencv2/core/version.hpp new file mode 100644 index 0000000..f022142 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/version.hpp @@ -0,0 +1,26 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_VERSION_HPP +#define OPENCV_VERSION_HPP + +#define CV_VERSION_MAJOR 4 +#define CV_VERSION_MINOR 8 +#define CV_VERSION_REVISION 0 +#define CV_VERSION_STATUS "-dev" + +#define CVAUX_STR_EXP(__A) #__A +#define CVAUX_STR(__A) CVAUX_STR_EXP(__A) + +#define CVAUX_STRW_EXP(__A) L ## #__A +#define CVAUX_STRW(__A) CVAUX_STRW_EXP(__A) + +#define CV_VERSION CVAUX_STR(CV_VERSION_MAJOR) "." CVAUX_STR(CV_VERSION_MINOR) "." CVAUX_STR(CV_VERSION_REVISION) CV_VERSION_STATUS + +/* old style version constants*/ +#define CV_MAJOR_VERSION CV_VERSION_MAJOR +#define CV_MINOR_VERSION CV_VERSION_MINOR +#define CV_SUBMINOR_VERSION CV_VERSION_REVISION + +#endif // OPENCV_VERSION_HPP diff --git a/Thirdparty/opencv2/include/opencv2/core/vsx_utils.hpp b/Thirdparty/opencv2/include/opencv2/core/vsx_utils.hpp new file mode 100644 index 0000000..79a1074 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/core/vsx_utils.hpp @@ -0,0 +1,1047 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html + +#ifndef OPENCV_HAL_VSX_UTILS_HPP +#define OPENCV_HAL_VSX_UTILS_HPP + +#include "opencv2/core/cvdef.h" + +#ifndef SKIP_INCLUDES +# include +#endif + +//! @addtogroup core_utils_vsx +//! @{ +#if CV_VSX + +#define __VSX_S16__(c, v) (c){v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v} +#define __VSX_S8__(c, v) (c){v, v, v, v, v, v, v, v} +#define __VSX_S4__(c, v) (c){v, v, v, v} +#define __VSX_S2__(c, v) (c){v, v} + +typedef __vector unsigned char vec_uchar16; +#define vec_uchar16_set(...) (vec_uchar16){__VA_ARGS__} +#define vec_uchar16_sp(c) (__VSX_S16__(vec_uchar16, (unsigned char)c)) +#define vec_uchar16_c(v) ((vec_uchar16)(v)) +#define vec_uchar16_z vec_uchar16_sp(0) + +typedef __vector signed char vec_char16; +#define vec_char16_set(...) (vec_char16){__VA_ARGS__} +#define vec_char16_sp(c) (__VSX_S16__(vec_char16, (signed char)c)) +#define vec_char16_c(v) ((vec_char16)(v)) +#define vec_char16_z vec_char16_sp(0) + +typedef __vector unsigned short vec_ushort8; +#define vec_ushort8_set(...) (vec_ushort8){__VA_ARGS__} +#define vec_ushort8_sp(c) (__VSX_S8__(vec_ushort8, (unsigned short)c)) +#define vec_ushort8_c(v) ((vec_ushort8)(v)) +#define vec_ushort8_z vec_ushort8_sp(0) + +typedef __vector signed short vec_short8; +#define vec_short8_set(...) (vec_short8){__VA_ARGS__} +#define vec_short8_sp(c) (__VSX_S8__(vec_short8, (signed short)c)) +#define vec_short8_c(v) ((vec_short8)(v)) +#define vec_short8_z vec_short8_sp(0) + +typedef __vector unsigned int vec_uint4; +#define vec_uint4_set(...) (vec_uint4){__VA_ARGS__} +#define vec_uint4_sp(c) (__VSX_S4__(vec_uint4, (unsigned int)c)) +#define vec_uint4_c(v) ((vec_uint4)(v)) +#define vec_uint4_z vec_uint4_sp(0) + +typedef __vector signed int vec_int4; +#define vec_int4_set(...) (vec_int4){__VA_ARGS__} +#define vec_int4_sp(c) (__VSX_S4__(vec_int4, (signed int)c)) +#define vec_int4_c(v) ((vec_int4)(v)) +#define vec_int4_z vec_int4_sp(0) + +typedef __vector float vec_float4; +#define vec_float4_set(...) (vec_float4){__VA_ARGS__} +#define vec_float4_sp(c) (__VSX_S4__(vec_float4, c)) +#define vec_float4_c(v) ((vec_float4)(v)) +#define vec_float4_z vec_float4_sp(0) + +typedef __vector unsigned long long vec_udword2; +#define vec_udword2_set(...) (vec_udword2){__VA_ARGS__} +#define vec_udword2_sp(c) (__VSX_S2__(vec_udword2, (unsigned long long)c)) +#define vec_udword2_c(v) ((vec_udword2)(v)) +#define vec_udword2_z vec_udword2_sp(0) + +typedef __vector signed long long vec_dword2; +#define vec_dword2_set(...) (vec_dword2){__VA_ARGS__} +#define vec_dword2_sp(c) (__VSX_S2__(vec_dword2, (signed long long)c)) +#define vec_dword2_c(v) ((vec_dword2)(v)) +#define vec_dword2_z vec_dword2_sp(0) + +typedef __vector double vec_double2; +#define vec_double2_set(...) (vec_double2){__VA_ARGS__} +#define vec_double2_c(v) ((vec_double2)(v)) +#define vec_double2_sp(c) (__VSX_S2__(vec_double2, c)) +#define vec_double2_z vec_double2_sp(0) + +#define vec_bchar16 __vector __bool char +#define vec_bchar16_set(...) (vec_bchar16){__VA_ARGS__} +#define vec_bchar16_c(v) ((vec_bchar16)(v)) + +#define vec_bshort8 __vector __bool short +#define vec_bshort8_set(...) (vec_bshort8){__VA_ARGS__} +#define vec_bshort8_c(v) ((vec_bshort8)(v)) + +#define vec_bint4 __vector __bool int +#define vec_bint4_set(...) (vec_bint4){__VA_ARGS__} +#define vec_bint4_c(v) ((vec_bint4)(v)) + +#define vec_bdword2 __vector __bool long long +#define vec_bdword2_set(...) (vec_bdword2){__VA_ARGS__} +#define vec_bdword2_c(v) ((vec_bdword2)(v)) + +#define VSX_FINLINE(tp) extern inline tp __attribute__((always_inline)) + +#define VSX_REDIRECT_1RG(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a) { return fn2(a); } + +#define VSX_REDIRECT_2RG(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a, const rg& b) { return fn2(a, b); } + +/* + * GCC VSX compatibility +**/ +#if defined(__GNUG__) && !defined(__clang__) + +// inline asm helper +#define VSX_IMPL_1RG(rt, rg, opc, fnm) \ +VSX_FINLINE(rt) fnm(const rg& a) \ +{ rt rs; __asm__ __volatile__(#opc" %x0,%x1" : "=wa" (rs) : "wa" (a)); return rs; } + +#define VSX_IMPL_1VRG(rt, rg, opc, fnm) \ +VSX_FINLINE(rt) fnm(const rg& a) \ +{ rt rs; __asm__ __volatile__(#opc" %0,%1" : "=v" (rs) : "v" (a)); return rs; } + +#define VSX_IMPL_2VRG_F(rt, rg, fopc, fnm) \ +VSX_FINLINE(rt) fnm(const rg& a, const rg& b) \ +{ rt rs; __asm__ __volatile__(fopc : "=v" (rs) : "v" (a), "v" (b)); return rs; } + +#define VSX_IMPL_2VRG(rt, rg, opc, fnm) VSX_IMPL_2VRG_F(rt, rg, #opc" %0,%1,%2", fnm) + +#if __GNUG__ < 8 + + // Support for int4 -> dword2 expanding multiply was added in GCC 8. + #ifdef vec_mule + #undef vec_mule + #endif + #ifdef vec_mulo + #undef vec_mulo + #endif + + VSX_REDIRECT_2RG(vec_ushort8, vec_uchar16, vec_mule, __builtin_vec_mule) + VSX_REDIRECT_2RG(vec_short8, vec_char16, vec_mule, __builtin_vec_mule) + VSX_REDIRECT_2RG(vec_int4, vec_short8, vec_mule, __builtin_vec_mule) + VSX_REDIRECT_2RG(vec_uint4, vec_ushort8, vec_mule, __builtin_vec_mule) + VSX_REDIRECT_2RG(vec_ushort8, vec_uchar16, vec_mulo, __builtin_vec_mulo) + VSX_REDIRECT_2RG(vec_short8, vec_char16, vec_mulo, __builtin_vec_mulo) + VSX_REDIRECT_2RG(vec_int4, vec_short8, vec_mulo, __builtin_vec_mulo) + VSX_REDIRECT_2RG(vec_uint4, vec_ushort8, vec_mulo, __builtin_vec_mulo) + + // dword2 support arrived in ISA 2.07 and GCC 8+ + VSX_IMPL_2VRG(vec_dword2, vec_int4, vmulosw, vec_mule) + VSX_IMPL_2VRG(vec_udword2, vec_uint4, vmulouw, vec_mule) + VSX_IMPL_2VRG(vec_dword2, vec_int4, vmulesw, vec_mulo) + VSX_IMPL_2VRG(vec_udword2, vec_uint4, vmuleuw, vec_mulo) + +#endif + +#if __GNUG__ < 7 +// up to GCC 6 vec_mul only supports precisions and llong +# ifdef vec_mul +# undef vec_mul +# endif +/* + * there's no a direct instruction for supporting 8-bit, 16-bit multiplication in ISA 2.07, + * XLC Implement it by using instruction "multiply even", "multiply odd" and "permute" +**/ +# define VSX_IMPL_MULH(Tvec, cperm) \ + VSX_FINLINE(Tvec) vec_mul(const Tvec& a, const Tvec& b) \ + { \ + static const vec_uchar16 ev_od = {cperm}; \ + return vec_perm((Tvec)vec_mule(a, b), (Tvec)vec_mulo(a, b), ev_od); \ + } + #define VSX_IMPL_MULH_P16 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 + VSX_IMPL_MULH(vec_char16, VSX_IMPL_MULH_P16) + VSX_IMPL_MULH(vec_uchar16, VSX_IMPL_MULH_P16) + #define VSX_IMPL_MULH_P8 0, 1, 16, 17, 4, 5, 20, 21, 8, 9, 24, 25, 12, 13, 28, 29 + VSX_IMPL_MULH(vec_short8, VSX_IMPL_MULH_P8) + VSX_IMPL_MULH(vec_ushort8, VSX_IMPL_MULH_P8) + // vmuluwm can be used for unsigned or signed integers, that's what they said + VSX_IMPL_2VRG(vec_int4, vec_int4, vmuluwm, vec_mul) + VSX_IMPL_2VRG(vec_uint4, vec_uint4, vmuluwm, vec_mul) + // redirect to GCC builtin vec_mul, since it already supports precisions and llong + VSX_REDIRECT_2RG(vec_float4, vec_float4, vec_mul, __builtin_vec_mul) + VSX_REDIRECT_2RG(vec_double2, vec_double2, vec_mul, __builtin_vec_mul) + VSX_REDIRECT_2RG(vec_dword2, vec_dword2, vec_mul, __builtin_vec_mul) + VSX_REDIRECT_2RG(vec_udword2, vec_udword2, vec_mul, __builtin_vec_mul) +#endif // __GNUG__ < 7 + +#if __GNUG__ < 6 +/* + * Instruction "compare greater than or equal" in ISA 2.07 only supports single + * and double precision. + * In XLC and new versions of GCC implement integers by using instruction "greater than" and NOR. +**/ +# ifdef vec_cmpge +# undef vec_cmpge +# endif +# ifdef vec_cmple +# undef vec_cmple +# endif +# define vec_cmple(a, b) vec_cmpge(b, a) +# define VSX_IMPL_CMPGE(rt, rg, opc, fnm) \ + VSX_IMPL_2VRG_F(rt, rg, #opc" %0,%2,%1\n\t xxlnor %x0,%x0,%x0", fnm) + + VSX_IMPL_CMPGE(vec_bchar16, vec_char16, vcmpgtsb, vec_cmpge) + VSX_IMPL_CMPGE(vec_bchar16, vec_uchar16, vcmpgtub, vec_cmpge) + VSX_IMPL_CMPGE(vec_bshort8, vec_short8, vcmpgtsh, vec_cmpge) + VSX_IMPL_CMPGE(vec_bshort8, vec_ushort8, vcmpgtuh, vec_cmpge) + VSX_IMPL_CMPGE(vec_bint4, vec_int4, vcmpgtsw, vec_cmpge) + VSX_IMPL_CMPGE(vec_bint4, vec_uint4, vcmpgtuw, vec_cmpge) + VSX_IMPL_CMPGE(vec_bdword2, vec_dword2, vcmpgtsd, vec_cmpge) + VSX_IMPL_CMPGE(vec_bdword2, vec_udword2, vcmpgtud, vec_cmpge) + +// redirect to GCC builtin cmpge, since it already supports precisions + VSX_REDIRECT_2RG(vec_bint4, vec_float4, vec_cmpge, __builtin_vec_cmpge) + VSX_REDIRECT_2RG(vec_bdword2, vec_double2, vec_cmpge, __builtin_vec_cmpge) + +// up to gcc5 vec_nor doesn't support bool long long +# undef vec_nor + template + VSX_REDIRECT_2RG(T, T, vec_nor, __builtin_vec_nor) + + VSX_FINLINE(vec_bdword2) vec_nor(const vec_bdword2& a, const vec_bdword2& b) + { return vec_bdword2_c(__builtin_vec_nor(vec_dword2_c(a), vec_dword2_c(b))); } + +// vec_packs doesn't support double words in gcc4 and old versions of gcc5 +# undef vec_packs + VSX_REDIRECT_2RG(vec_char16, vec_short8, vec_packs, __builtin_vec_packs) + VSX_REDIRECT_2RG(vec_uchar16, vec_ushort8, vec_packs, __builtin_vec_packs) + VSX_REDIRECT_2RG(vec_short8, vec_int4, vec_packs, __builtin_vec_packs) + VSX_REDIRECT_2RG(vec_ushort8, vec_uint4, vec_packs, __builtin_vec_packs) + + VSX_IMPL_2VRG_F(vec_int4, vec_dword2, "vpksdss %0,%2,%1", vec_packs) + VSX_IMPL_2VRG_F(vec_uint4, vec_udword2, "vpkudus %0,%2,%1", vec_packs) +#endif // __GNUG__ < 6 + +#if __GNUG__ < 5 +// vec_xxpermdi in gcc4 missing little-endian supports just like clang +# define vec_permi(a, b, c) vec_xxpermdi(b, a, (3 ^ (((c) & 1) << 1 | (c) >> 1))) +// same as vec_xxpermdi +# undef vec_vbpermq + VSX_IMPL_2VRG(vec_udword2, vec_uchar16, vbpermq, vec_vbpermq) + VSX_IMPL_2VRG(vec_dword2, vec_char16, vbpermq, vec_vbpermq) +#else +# define vec_permi vec_xxpermdi +#endif // __GNUG__ < 5 + +// shift left double by word immediate +#ifndef vec_sldw +# define vec_sldw __builtin_vsx_xxsldwi +#endif + +// vector population count +VSX_IMPL_1VRG(vec_uchar16, vec_uchar16, vpopcntb, vec_popcntu) +VSX_IMPL_1VRG(vec_uchar16, vec_char16, vpopcntb, vec_popcntu) +VSX_IMPL_1VRG(vec_ushort8, vec_ushort8, vpopcnth, vec_popcntu) +VSX_IMPL_1VRG(vec_ushort8, vec_short8, vpopcnth, vec_popcntu) +VSX_IMPL_1VRG(vec_uint4, vec_uint4, vpopcntw, vec_popcntu) +VSX_IMPL_1VRG(vec_uint4, vec_int4, vpopcntw, vec_popcntu) +VSX_IMPL_1VRG(vec_udword2, vec_udword2, vpopcntd, vec_popcntu) +VSX_IMPL_1VRG(vec_udword2, vec_dword2, vpopcntd, vec_popcntu) + +// converts between single and double-precision +VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp) +VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp) + +// converts word and doubleword to double-precision +#undef vec_ctd +VSX_IMPL_1RG(vec_double2, vec_int4, xvcvsxwdp, vec_ctdo) +VSX_IMPL_1RG(vec_double2, vec_uint4, xvcvuxwdp, vec_ctdo) +VSX_IMPL_1RG(vec_double2, vec_dword2, xvcvsxddp, vec_ctd) +VSX_IMPL_1RG(vec_double2, vec_udword2, xvcvuxddp, vec_ctd) + +// converts word and doubleword to single-precision +#undef vec_ctf +VSX_IMPL_1RG(vec_float4, vec_int4, xvcvsxwsp, vec_ctf) +VSX_IMPL_1RG(vec_float4, vec_uint4, xvcvuxwsp, vec_ctf) +VSX_IMPL_1RG(vec_float4, vec_dword2, xvcvsxdsp, vec_ctfo) +VSX_IMPL_1RG(vec_float4, vec_udword2, xvcvuxdsp, vec_ctfo) + +// converts single and double precision to signed word +#undef vec_cts +VSX_IMPL_1RG(vec_int4, vec_double2, xvcvdpsxws, vec_ctso) +VSX_IMPL_1RG(vec_int4, vec_float4, xvcvspsxws, vec_cts) + +// converts single and double precision to unsigned word +#undef vec_ctu +VSX_IMPL_1RG(vec_uint4, vec_double2, xvcvdpuxws, vec_ctuo) +VSX_IMPL_1RG(vec_uint4, vec_float4, xvcvspuxws, vec_ctu) + +// converts single and double precision to signed doubleword +#undef vec_ctsl +VSX_IMPL_1RG(vec_dword2, vec_double2, xvcvdpsxds, vec_ctsl) +VSX_IMPL_1RG(vec_dword2, vec_float4, xvcvspsxds, vec_ctslo) + +// converts single and double precision to unsigned doubleword +#undef vec_ctul +VSX_IMPL_1RG(vec_udword2, vec_double2, xvcvdpuxds, vec_ctul) +VSX_IMPL_1RG(vec_udword2, vec_float4, xvcvspuxds, vec_ctulo) + +// just in case if GCC doesn't define it +#ifndef vec_xl +# define vec_xl vec_vsx_ld +# define vec_xst vec_vsx_st +#endif + +#endif // GCC VSX compatibility + +/* + * CLANG VSX compatibility +**/ +#if defined(__clang__) && !defined(__IBMCPP__) + +/* + * CLANG doesn't support %x in the inline asm template which fixes register number + * when using any of the register constraints wa, wd, wf + * + * For more explanation checkout PowerPC and IBM RS6000 in https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html + * Also there's already an open bug https://bugs.llvm.org/show_bug.cgi?id=31837 + * + * So we're not able to use inline asm and only use built-in functions that CLANG supports + * and use __builtin_convertvector if clang missing any of vector conversions built-in functions + * + * todo: clang asm template bug is fixed, need to reconsider the current workarounds. +*/ + +// convert vector helper +#define VSX_IMPL_CONVERT(rt, rg, fnm) \ +VSX_FINLINE(rt) fnm(const rg& a) { return __builtin_convertvector(a, rt); } + +#ifndef vec_permi +#if __clang_major__ < 5 +// implement vec_permi in a dirty way +# define VSX_IMPL_CLANG_4_PERMI(Tvec) \ + VSX_FINLINE(Tvec) vec_permi(const Tvec& a, const Tvec& b, unsigned const char c) \ + { \ + switch (c) \ + { \ + case 0: \ + return vec_mergeh(a, b); \ + case 1: \ + return vec_mergel(vec_mergeh(a, a), b); \ + case 2: \ + return vec_mergeh(vec_mergel(a, a), b); \ + default: \ + return vec_mergel(a, b); \ + } \ + } + VSX_IMPL_CLANG_4_PERMI(vec_udword2) + VSX_IMPL_CLANG_4_PERMI(vec_dword2) + VSX_IMPL_CLANG_4_PERMI(vec_double2) + +// vec_xxsldwi is missing in clang 4 +# define vec_xxsldwi(a, b, c) vec_sld(a, b, (c) * 4) +#else +// vec_xxpermdi is missing little-endian supports in clang 4 just like gcc4 +# define vec_permi(a, b, c) vec_xxpermdi(b, a, (3 ^ (((c) & 1) << 1 | (c) >> 1))) +#endif // __clang_major__ < 5 +#endif + +// shift left double by word immediate +#ifndef vec_sldw +# define vec_sldw vec_xxsldwi +#endif + +#if __clang_major__ < 13 +// Implement vec_rsqrt since clang only supports vec_rsqrte +#ifndef vec_rsqrt + VSX_FINLINE(vec_float4) vec_rsqrt(const vec_float4& a) + { return vec_div(vec_float4_sp(1), vec_sqrt(a)); } + + VSX_FINLINE(vec_double2) vec_rsqrt(const vec_double2& a) + { return vec_div(vec_double2_sp(1), vec_sqrt(a)); } +#endif + +// vec_promote missing support for doubleword +VSX_FINLINE(vec_dword2) vec_promote(long long a, int b) +{ + vec_dword2 ret = vec_dword2_z; + ret[b & 1] = a; + return ret; +} + +VSX_FINLINE(vec_udword2) vec_promote(unsigned long long a, int b) +{ + vec_udword2 ret = vec_udword2_z; + ret[b & 1] = a; + return ret; +} +#endif + +// vec_popcnt should return unsigned but clang has different thought just like gcc in vec_vpopcnt +#define VSX_IMPL_POPCNTU(Tvec, Tvec2, ucast) \ +VSX_FINLINE(Tvec) vec_popcntu(const Tvec2& a) \ +{ return ucast(vec_popcnt(a)); } +VSX_IMPL_POPCNTU(vec_uchar16, vec_char16, vec_uchar16_c); +VSX_IMPL_POPCNTU(vec_ushort8, vec_short8, vec_ushort8_c); +VSX_IMPL_POPCNTU(vec_uint4, vec_int4, vec_uint4_c); +VSX_IMPL_POPCNTU(vec_udword2, vec_dword2, vec_udword2_c); +// redirect unsigned types +VSX_REDIRECT_1RG(vec_uchar16, vec_uchar16, vec_popcntu, vec_popcnt) +VSX_REDIRECT_1RG(vec_ushort8, vec_ushort8, vec_popcntu, vec_popcnt) +VSX_REDIRECT_1RG(vec_uint4, vec_uint4, vec_popcntu, vec_popcnt) +VSX_REDIRECT_1RG(vec_udword2, vec_udword2, vec_popcntu, vec_popcnt) + +// converts between single and double precision +VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp) +VSX_REDIRECT_1RG(vec_double2, vec_float4, vec_cvfo, __builtin_vsx_xvcvspdp) + +// converts word and doubleword to double-precision +#ifdef vec_ctd +# undef vec_ctd +#endif +VSX_REDIRECT_1RG(vec_double2, vec_int4, vec_ctdo, __builtin_vsx_xvcvsxwdp) +VSX_REDIRECT_1RG(vec_double2, vec_uint4, vec_ctdo, __builtin_vsx_xvcvuxwdp) + +VSX_IMPL_CONVERT(vec_double2, vec_dword2, vec_ctd) +VSX_IMPL_CONVERT(vec_double2, vec_udword2, vec_ctd) + +// converts word and doubleword to single-precision +#if __clang_major__ > 4 +# undef vec_ctf +#endif +VSX_IMPL_CONVERT(vec_float4, vec_int4, vec_ctf) +VSX_IMPL_CONVERT(vec_float4, vec_uint4, vec_ctf) +VSX_REDIRECT_1RG(vec_float4, vec_dword2, vec_ctfo, __builtin_vsx_xvcvsxdsp) +VSX_REDIRECT_1RG(vec_float4, vec_udword2, vec_ctfo, __builtin_vsx_xvcvuxdsp) + +// converts single and double precision to signed word +#if __clang_major__ > 4 +# undef vec_cts +#endif +VSX_REDIRECT_1RG(vec_int4, vec_double2, vec_ctso, __builtin_vsx_xvcvdpsxws) +VSX_IMPL_CONVERT(vec_int4, vec_float4, vec_cts) + +// converts single and double precision to unsigned word +#if __clang_major__ > 4 +# undef vec_ctu +#endif +VSX_REDIRECT_1RG(vec_uint4, vec_double2, vec_ctuo, __builtin_vsx_xvcvdpuxws) +VSX_IMPL_CONVERT(vec_uint4, vec_float4, vec_ctu) + +// converts single and double precision to signed doubleword +#ifdef vec_ctsl +# undef vec_ctsl +#endif +VSX_IMPL_CONVERT(vec_dword2, vec_double2, vec_ctsl) +// __builtin_convertvector unable to convert, xvcvspsxds is missing on it +VSX_FINLINE(vec_dword2) vec_ctslo(const vec_float4& a) +{ return vec_ctsl(vec_cvfo(a)); } + +// converts single and double precision to unsigned doubleword +#ifdef vec_ctul +# undef vec_ctul +#endif +VSX_IMPL_CONVERT(vec_udword2, vec_double2, vec_ctul) +// __builtin_convertvector unable to convert, xvcvspuxds is missing on it +VSX_FINLINE(vec_udword2) vec_ctulo(const vec_float4& a) +{ return vec_ctul(vec_cvfo(a)); } + +#endif // CLANG VSX compatibility + +/* + * Common GCC, CLANG compatibility +**/ +#if defined(__GNUG__) && !defined(__IBMCPP__) + +#ifdef vec_cvf +# undef vec_cvf +#endif + +#define VSX_IMPL_CONV_EVEN_4_2(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a) \ +{ return fn2(vec_sldw(a, a, 1)); } + +VSX_IMPL_CONV_EVEN_4_2(vec_double2, vec_float4, vec_cvf, vec_cvfo) +VSX_IMPL_CONV_EVEN_4_2(vec_double2, vec_int4, vec_ctd, vec_ctdo) +VSX_IMPL_CONV_EVEN_4_2(vec_double2, vec_uint4, vec_ctd, vec_ctdo) + +VSX_IMPL_CONV_EVEN_4_2(vec_dword2, vec_float4, vec_ctsl, vec_ctslo) +VSX_IMPL_CONV_EVEN_4_2(vec_udword2, vec_float4, vec_ctul, vec_ctulo) + +#define VSX_IMPL_CONV_EVEN_2_4(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a) \ +{ \ + rt v4 = fn2(a); \ + return vec_sldw(v4, v4, 3); \ +} + +VSX_IMPL_CONV_EVEN_2_4(vec_float4, vec_double2, vec_cvf, vec_cvfo) +VSX_IMPL_CONV_EVEN_2_4(vec_float4, vec_dword2, vec_ctf, vec_ctfo) +VSX_IMPL_CONV_EVEN_2_4(vec_float4, vec_udword2, vec_ctf, vec_ctfo) + +VSX_IMPL_CONV_EVEN_2_4(vec_int4, vec_double2, vec_cts, vec_ctso) +VSX_IMPL_CONV_EVEN_2_4(vec_uint4, vec_double2, vec_ctu, vec_ctuo) + +// Only for Eigen! +/* + * changing behavior of conversion intrinsics for gcc has effect on Eigen + * so we redefine old behavior again only on gcc, clang +*/ +#if !defined(__clang__) || __clang_major__ > 4 + // ignoring second arg since Eigen only truncates toward zero +# define VSX_IMPL_CONV_2VARIANT(rt, rg, fnm, fn2) \ + VSX_FINLINE(rt) fnm(const rg& a, int only_truncate) \ + { \ + assert(only_truncate == 0); \ + CV_UNUSED(only_truncate); \ + return fn2(a); \ + } + VSX_IMPL_CONV_2VARIANT(vec_int4, vec_float4, vec_cts, vec_cts) + VSX_IMPL_CONV_2VARIANT(vec_uint4, vec_float4, vec_ctu, vec_ctu) + VSX_IMPL_CONV_2VARIANT(vec_float4, vec_int4, vec_ctf, vec_ctf) + VSX_IMPL_CONV_2VARIANT(vec_float4, vec_uint4, vec_ctf, vec_ctf) + // define vec_cts for converting double precision to signed doubleword + // which isn't compatible with xlc but its okay since Eigen only uses it for gcc + VSX_IMPL_CONV_2VARIANT(vec_dword2, vec_double2, vec_cts, vec_ctsl) +#endif // Eigen + +#endif // Common GCC, CLANG compatibility + +/* + * XLC VSX compatibility +**/ +#if defined(__IBMCPP__) + +// vector population count +#define vec_popcntu vec_popcnt + +// overload and redirect with setting second arg to zero +// since we only support conversions without the second arg +#define VSX_IMPL_OVERLOAD_Z2(rt, rg, fnm) \ +VSX_FINLINE(rt) fnm(const rg& a) { return fnm(a, 0); } + +VSX_IMPL_OVERLOAD_Z2(vec_double2, vec_int4, vec_ctd) +VSX_IMPL_OVERLOAD_Z2(vec_double2, vec_uint4, vec_ctd) +VSX_IMPL_OVERLOAD_Z2(vec_double2, vec_dword2, vec_ctd) +VSX_IMPL_OVERLOAD_Z2(vec_double2, vec_udword2, vec_ctd) + +VSX_IMPL_OVERLOAD_Z2(vec_float4, vec_int4, vec_ctf) +VSX_IMPL_OVERLOAD_Z2(vec_float4, vec_uint4, vec_ctf) +VSX_IMPL_OVERLOAD_Z2(vec_float4, vec_dword2, vec_ctf) +VSX_IMPL_OVERLOAD_Z2(vec_float4, vec_udword2, vec_ctf) + +VSX_IMPL_OVERLOAD_Z2(vec_int4, vec_double2, vec_cts) +VSX_IMPL_OVERLOAD_Z2(vec_int4, vec_float4, vec_cts) + +VSX_IMPL_OVERLOAD_Z2(vec_uint4, vec_double2, vec_ctu) +VSX_IMPL_OVERLOAD_Z2(vec_uint4, vec_float4, vec_ctu) + +VSX_IMPL_OVERLOAD_Z2(vec_dword2, vec_double2, vec_ctsl) +VSX_IMPL_OVERLOAD_Z2(vec_dword2, vec_float4, vec_ctsl) + +VSX_IMPL_OVERLOAD_Z2(vec_udword2, vec_double2, vec_ctul) +VSX_IMPL_OVERLOAD_Z2(vec_udword2, vec_float4, vec_ctul) + +// fixme: implement conversions of odd-numbered elements in a dirty way +// since xlc doesn't support VSX registers operand in inline asm. +#define VSX_IMPL_CONV_ODD_4_2(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a) { return fn2(vec_sldw(a, a, 3)); } + +VSX_IMPL_CONV_ODD_4_2(vec_double2, vec_float4, vec_cvfo, vec_cvf) +VSX_IMPL_CONV_ODD_4_2(vec_double2, vec_int4, vec_ctdo, vec_ctd) +VSX_IMPL_CONV_ODD_4_2(vec_double2, vec_uint4, vec_ctdo, vec_ctd) + +VSX_IMPL_CONV_ODD_4_2(vec_dword2, vec_float4, vec_ctslo, vec_ctsl) +VSX_IMPL_CONV_ODD_4_2(vec_udword2, vec_float4, vec_ctulo, vec_ctul) + +#define VSX_IMPL_CONV_ODD_2_4(rt, rg, fnm, fn2) \ +VSX_FINLINE(rt) fnm(const rg& a) \ +{ \ + rt v4 = fn2(a); \ + return vec_sldw(v4, v4, 1); \ +} + +VSX_IMPL_CONV_ODD_2_4(vec_float4, vec_double2, vec_cvfo, vec_cvf) +VSX_IMPL_CONV_ODD_2_4(vec_float4, vec_dword2, vec_ctfo, vec_ctf) +VSX_IMPL_CONV_ODD_2_4(vec_float4, vec_udword2, vec_ctfo, vec_ctf) + +VSX_IMPL_CONV_ODD_2_4(vec_int4, vec_double2, vec_ctso, vec_cts) +VSX_IMPL_CONV_ODD_2_4(vec_uint4, vec_double2, vec_ctuo, vec_ctu) + +#endif // XLC VSX compatibility + +// ignore GCC warning that caused by -Wunused-but-set-variable in rare cases +#if defined(__GNUG__) && !defined(__clang__) +# define VSX_UNUSED(Tvec) Tvec __attribute__((__unused__)) +#else // CLANG, XLC +# define VSX_UNUSED(Tvec) Tvec +#endif + +// gcc can find his way in casting log int and XLC, CLANG ambiguous +#if defined(__clang__) || defined(__IBMCPP__) + VSX_FINLINE(vec_udword2) vec_splats(uint64 v) + { return vec_splats((unsigned long long) v); } + + VSX_FINLINE(vec_dword2) vec_splats(int64 v) + { return vec_splats((long long) v); } + + VSX_FINLINE(vec_udword2) vec_promote(uint64 a, int b) + { return vec_promote((unsigned long long) a, b); } + + VSX_FINLINE(vec_dword2) vec_promote(int64 a, int b) + { return vec_promote((long long) a, b); } +#endif + +/* + * implement vsx_ld(offset, pointer), vsx_st(vector, offset, pointer) + * load and set using offset depend on the pointer type + * + * implement vsx_ldf(offset, pointer), vsx_stf(vector, offset, pointer) + * load and set using offset depend on fixed bytes size + * + * Note: In clang vec_xl and vec_xst fails to load unaligned addresses + * so we are using vec_vsx_ld, vec_vsx_st instead +*/ + +#if defined(__clang__) && !defined(__IBMCPP__) +# define vsx_ldf vec_vsx_ld +# define vsx_stf vec_vsx_st +#else // GCC , XLC +# define vsx_ldf vec_xl +# define vsx_stf vec_xst +#endif + +#define VSX_OFFSET(o, p) ((o) * sizeof(*(p))) +#define vsx_ld(o, p) vsx_ldf(VSX_OFFSET(o, p), p) +#define vsx_st(v, o, p) vsx_stf(v, VSX_OFFSET(o, p), p) + +/* + * implement vsx_ld2(offset, pointer), vsx_st2(vector, offset, pointer) to load and store double words + * In GCC vec_xl and vec_xst it maps to vec_vsx_ld, vec_vsx_st which doesn't support long long + * and in CLANG we are using vec_vsx_ld, vec_vsx_st because vec_xl, vec_xst fails to load unaligned addresses + * + * In XLC vec_xl and vec_xst fail to cast int64(long int) to long long +*/ +#if (defined(__GNUG__) || defined(__clang__)) && !defined(__IBMCPP__) + VSX_FINLINE(vec_udword2) vsx_ld2(long o, const uint64* p) + { return vec_udword2_c(vsx_ldf(VSX_OFFSET(o, p), (unsigned int*)p)); } + + VSX_FINLINE(vec_dword2) vsx_ld2(long o, const int64* p) + { return vec_dword2_c(vsx_ldf(VSX_OFFSET(o, p), (int*)p)); } + + VSX_FINLINE(void) vsx_st2(const vec_udword2& vec, long o, uint64* p) + { vsx_stf(vec_uint4_c(vec), VSX_OFFSET(o, p), (unsigned int*)p); } + + VSX_FINLINE(void) vsx_st2(const vec_dword2& vec, long o, int64* p) + { vsx_stf(vec_int4_c(vec), VSX_OFFSET(o, p), (int*)p); } +#else // XLC + VSX_FINLINE(vec_udword2) vsx_ld2(long o, const uint64* p) + { return vsx_ldf(VSX_OFFSET(o, p), (unsigned long long*)p); } + + VSX_FINLINE(vec_dword2) vsx_ld2(long o, const int64* p) + { return vsx_ldf(VSX_OFFSET(o, p), (long long*)p); } + + VSX_FINLINE(void) vsx_st2(const vec_udword2& vec, long o, uint64* p) + { vsx_stf(vec, VSX_OFFSET(o, p), (unsigned long long*)p); } + + VSX_FINLINE(void) vsx_st2(const vec_dword2& vec, long o, int64* p) + { vsx_stf(vec, VSX_OFFSET(o, p), (long long*)p); } +#endif + +// Store lower 8 byte +#define vec_st_l8(v, p) *((uint64*)(p)) = vec_extract(vec_udword2_c(v), 0) + +// Store higher 8 byte +#define vec_st_h8(v, p) *((uint64*)(p)) = vec_extract(vec_udword2_c(v), 1) + +// Load 64-bits of integer data to lower part +#define VSX_IMPL_LOAD_L8(Tvec, Tp) \ +VSX_FINLINE(Tvec) vec_ld_l8(const Tp *p) \ +{ return ((Tvec)vec_promote(*((uint64*)p), 0)); } + +VSX_IMPL_LOAD_L8(vec_uchar16, uchar) +VSX_IMPL_LOAD_L8(vec_char16, schar) +VSX_IMPL_LOAD_L8(vec_ushort8, ushort) +VSX_IMPL_LOAD_L8(vec_short8, short) +VSX_IMPL_LOAD_L8(vec_uint4, uint) +VSX_IMPL_LOAD_L8(vec_int4, int) +VSX_IMPL_LOAD_L8(vec_float4, float) +VSX_IMPL_LOAD_L8(vec_udword2, uint64) +VSX_IMPL_LOAD_L8(vec_dword2, int64) +VSX_IMPL_LOAD_L8(vec_double2, double) + +// logical not +#define vec_not(a) vec_nor(a, a) + +// power9 yaya +// not equal +#ifndef vec_cmpne +# define vec_cmpne(a, b) vec_not(vec_cmpeq(a, b)) +#endif + +// absolute difference +#ifndef _ARCH_PWR9 +# undef vec_absd +# define vec_absd(a, b) vec_sub(vec_max(a, b), vec_min(a, b)) +#endif + +/* + * Implement vec_unpacklu and vec_unpackhu + * since vec_unpackl, vec_unpackh only support signed integers +**/ +#define VSX_IMPL_UNPACKU(rt, rg, zero) \ +VSX_FINLINE(rt) vec_unpacklu(const rg& a) \ +{ return (rt)(vec_mergel(a, zero)); } \ +VSX_FINLINE(rt) vec_unpackhu(const rg& a) \ +{ return (rt)(vec_mergeh(a, zero)); } + +VSX_IMPL_UNPACKU(vec_ushort8, vec_uchar16, vec_uchar16_z) +VSX_IMPL_UNPACKU(vec_uint4, vec_ushort8, vec_ushort8_z) +VSX_IMPL_UNPACKU(vec_udword2, vec_uint4, vec_uint4_z) + +/* + * Implement vec_mergesqe and vec_mergesqo + * Merges the sequence values of even and odd elements of two vectors +*/ +#define VSX_IMPL_PERM(rt, fnm, ...) \ +VSX_FINLINE(rt) fnm(const rt& a, const rt& b) \ +{ static const vec_uchar16 perm = {__VA_ARGS__}; return vec_perm(a, b, perm); } + +// 16 +#define perm16_mergesqe 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 +#define perm16_mergesqo 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 +VSX_IMPL_PERM(vec_uchar16, vec_mergesqe, perm16_mergesqe) +VSX_IMPL_PERM(vec_uchar16, vec_mergesqo, perm16_mergesqo) +VSX_IMPL_PERM(vec_char16, vec_mergesqe, perm16_mergesqe) +VSX_IMPL_PERM(vec_char16, vec_mergesqo, perm16_mergesqo) +// 8 +#define perm8_mergesqe 0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29 +#define perm8_mergesqo 2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31 +VSX_IMPL_PERM(vec_ushort8, vec_mergesqe, perm8_mergesqe) +VSX_IMPL_PERM(vec_ushort8, vec_mergesqo, perm8_mergesqo) +VSX_IMPL_PERM(vec_short8, vec_mergesqe, perm8_mergesqe) +VSX_IMPL_PERM(vec_short8, vec_mergesqo, perm8_mergesqo) +// 4 +#define perm4_mergesqe 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 +#define perm4_mergesqo 4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31 +VSX_IMPL_PERM(vec_uint4, vec_mergesqe, perm4_mergesqe) +VSX_IMPL_PERM(vec_uint4, vec_mergesqo, perm4_mergesqo) +VSX_IMPL_PERM(vec_int4, vec_mergesqe, perm4_mergesqe) +VSX_IMPL_PERM(vec_int4, vec_mergesqo, perm4_mergesqo) +VSX_IMPL_PERM(vec_float4, vec_mergesqe, perm4_mergesqe) +VSX_IMPL_PERM(vec_float4, vec_mergesqo, perm4_mergesqo) +// 2 +VSX_REDIRECT_2RG(vec_double2, vec_double2, vec_mergesqe, vec_mergeh) +VSX_REDIRECT_2RG(vec_double2, vec_double2, vec_mergesqo, vec_mergel) +VSX_REDIRECT_2RG(vec_dword2, vec_dword2, vec_mergesqe, vec_mergeh) +VSX_REDIRECT_2RG(vec_dword2, vec_dword2, vec_mergesqo, vec_mergel) +VSX_REDIRECT_2RG(vec_udword2, vec_udword2, vec_mergesqe, vec_mergeh) +VSX_REDIRECT_2RG(vec_udword2, vec_udword2, vec_mergesqo, vec_mergel) + +/* + * Implement vec_mergesqh and vec_mergesql + * Merges the sequence most and least significant halves of two vectors +*/ +#define VSX_IMPL_MERGESQHL(Tvec) \ +VSX_FINLINE(Tvec) vec_mergesqh(const Tvec& a, const Tvec& b) \ +{ return (Tvec)vec_mergeh(vec_udword2_c(a), vec_udword2_c(b)); } \ +VSX_FINLINE(Tvec) vec_mergesql(const Tvec& a, const Tvec& b) \ +{ return (Tvec)vec_mergel(vec_udword2_c(a), vec_udword2_c(b)); } +VSX_IMPL_MERGESQHL(vec_uchar16) +VSX_IMPL_MERGESQHL(vec_char16) +VSX_IMPL_MERGESQHL(vec_ushort8) +VSX_IMPL_MERGESQHL(vec_short8) +VSX_IMPL_MERGESQHL(vec_uint4) +VSX_IMPL_MERGESQHL(vec_int4) +VSX_IMPL_MERGESQHL(vec_float4) +VSX_REDIRECT_2RG(vec_udword2, vec_udword2, vec_mergesqh, vec_mergeh) +VSX_REDIRECT_2RG(vec_udword2, vec_udword2, vec_mergesql, vec_mergel) +VSX_REDIRECT_2RG(vec_dword2, vec_dword2, vec_mergesqh, vec_mergeh) +VSX_REDIRECT_2RG(vec_dword2, vec_dword2, vec_mergesql, vec_mergel) +VSX_REDIRECT_2RG(vec_double2, vec_double2, vec_mergesqh, vec_mergeh) +VSX_REDIRECT_2RG(vec_double2, vec_double2, vec_mergesql, vec_mergel) + + +// 2 and 4 channels interleave for all types except 2 lanes +#define VSX_IMPL_ST_INTERLEAVE(Tp, Tvec) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, Tp* ptr) \ +{ \ + vsx_stf(vec_mergeh(a, b), 0, ptr); \ + vsx_stf(vec_mergel(a, b), 16, ptr); \ +} \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, const Tvec& d, Tp* ptr) \ +{ \ + Tvec ac = vec_mergeh(a, c); \ + Tvec bd = vec_mergeh(b, d); \ + vsx_stf(vec_mergeh(ac, bd), 0, ptr); \ + vsx_stf(vec_mergel(ac, bd), 16, ptr); \ + ac = vec_mergel(a, c); \ + bd = vec_mergel(b, d); \ + vsx_stf(vec_mergeh(ac, bd), 32, ptr); \ + vsx_stf(vec_mergel(ac, bd), 48, ptr); \ +} +VSX_IMPL_ST_INTERLEAVE(uchar, vec_uchar16) +VSX_IMPL_ST_INTERLEAVE(schar, vec_char16) +VSX_IMPL_ST_INTERLEAVE(ushort, vec_ushort8) +VSX_IMPL_ST_INTERLEAVE(short, vec_short8) +VSX_IMPL_ST_INTERLEAVE(uint, vec_uint4) +VSX_IMPL_ST_INTERLEAVE(int, vec_int4) +VSX_IMPL_ST_INTERLEAVE(float, vec_float4) + +// 2 and 4 channels deinterleave for 16 lanes +#define VSX_IMPL_ST_DINTERLEAVE_8(Tp, Tvec) \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b) \ +{ \ + Tvec v0 = vsx_ld(0, ptr); \ + Tvec v1 = vsx_ld(16, ptr); \ + a = vec_mergesqe(v0, v1); \ + b = vec_mergesqo(v0, v1); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, \ + Tvec& c, Tvec& d) \ +{ \ + Tvec v0 = vsx_ld(0, ptr); \ + Tvec v1 = vsx_ld(16, ptr); \ + Tvec v2 = vsx_ld(32, ptr); \ + Tvec v3 = vsx_ld(48, ptr); \ + Tvec m0 = vec_mergesqe(v0, v1); \ + Tvec m1 = vec_mergesqe(v2, v3); \ + a = vec_mergesqe(m0, m1); \ + c = vec_mergesqo(m0, m1); \ + m0 = vec_mergesqo(v0, v1); \ + m1 = vec_mergesqo(v2, v3); \ + b = vec_mergesqe(m0, m1); \ + d = vec_mergesqo(m0, m1); \ +} +VSX_IMPL_ST_DINTERLEAVE_8(uchar, vec_uchar16) +VSX_IMPL_ST_DINTERLEAVE_8(schar, vec_char16) + +// 2 and 4 channels deinterleave for 8 lanes +#define VSX_IMPL_ST_DINTERLEAVE_16(Tp, Tvec) \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b) \ +{ \ + Tvec v0 = vsx_ld(0, ptr); \ + Tvec v1 = vsx_ld(8, ptr); \ + a = vec_mergesqe(v0, v1); \ + b = vec_mergesqo(v0, v1); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, \ + Tvec& c, Tvec& d) \ +{ \ + Tvec v0 = vsx_ld(0, ptr); \ + Tvec v1 = vsx_ld(8, ptr); \ + Tvec m0 = vec_mergeh(v0, v1); \ + Tvec m1 = vec_mergel(v0, v1); \ + Tvec ab0 = vec_mergeh(m0, m1); \ + Tvec cd0 = vec_mergel(m0, m1); \ + v0 = vsx_ld(16, ptr); \ + v1 = vsx_ld(24, ptr); \ + m0 = vec_mergeh(v0, v1); \ + m1 = vec_mergel(v0, v1); \ + Tvec ab1 = vec_mergeh(m0, m1); \ + Tvec cd1 = vec_mergel(m0, m1); \ + a = vec_mergesqh(ab0, ab1); \ + b = vec_mergesql(ab0, ab1); \ + c = vec_mergesqh(cd0, cd1); \ + d = vec_mergesql(cd0, cd1); \ +} +VSX_IMPL_ST_DINTERLEAVE_16(ushort, vec_ushort8) +VSX_IMPL_ST_DINTERLEAVE_16(short, vec_short8) + +// 2 and 4 channels deinterleave for 4 lanes +#define VSX_IMPL_ST_DINTERLEAVE_32(Tp, Tvec) \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b) \ +{ \ + a = vsx_ld(0, ptr); \ + b = vsx_ld(4, ptr); \ + Tvec m0 = vec_mergeh(a, b); \ + Tvec m1 = vec_mergel(a, b); \ + a = vec_mergeh(m0, m1); \ + b = vec_mergel(m0, m1); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, \ + Tvec& c, Tvec& d) \ +{ \ + Tvec v0 = vsx_ld(0, ptr); \ + Tvec v1 = vsx_ld(4, ptr); \ + Tvec v2 = vsx_ld(8, ptr); \ + Tvec v3 = vsx_ld(12, ptr); \ + Tvec m0 = vec_mergeh(v0, v2); \ + Tvec m1 = vec_mergeh(v1, v3); \ + a = vec_mergeh(m0, m1); \ + b = vec_mergel(m0, m1); \ + m0 = vec_mergel(v0, v2); \ + m1 = vec_mergel(v1, v3); \ + c = vec_mergeh(m0, m1); \ + d = vec_mergel(m0, m1); \ +} +VSX_IMPL_ST_DINTERLEAVE_32(uint, vec_uint4) +VSX_IMPL_ST_DINTERLEAVE_32(int, vec_int4) +VSX_IMPL_ST_DINTERLEAVE_32(float, vec_float4) + +// 2 and 4 channels interleave and deinterleave for 2 lanes +#define VSX_IMPL_ST_D_INTERLEAVE_64(Tp, Tvec, ld_func, st_func) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, Tp* ptr) \ +{ \ + st_func(vec_mergeh(a, b), 0, ptr); \ + st_func(vec_mergel(a, b), 2, ptr); \ +} \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, const Tvec& d, Tp* ptr) \ +{ \ + st_func(vec_mergeh(a, b), 0, ptr); \ + st_func(vec_mergeh(c, d), 2, ptr); \ + st_func(vec_mergel(a, b), 4, ptr); \ + st_func(vec_mergel(c, d), 6, ptr); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b) \ +{ \ + Tvec m0 = ld_func(0, ptr); \ + Tvec m1 = ld_func(2, ptr); \ + a = vec_mergeh(m0, m1); \ + b = vec_mergel(m0, m1); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, \ + Tvec& c, Tvec& d) \ +{ \ + Tvec v0 = ld_func(0, ptr); \ + Tvec v1 = ld_func(2, ptr); \ + Tvec v2 = ld_func(4, ptr); \ + Tvec v3 = ld_func(6, ptr); \ + a = vec_mergeh(v0, v2); \ + b = vec_mergel(v0, v2); \ + c = vec_mergeh(v1, v3); \ + d = vec_mergel(v1, v3); \ +} +VSX_IMPL_ST_D_INTERLEAVE_64(int64, vec_dword2, vsx_ld2, vsx_st2) +VSX_IMPL_ST_D_INTERLEAVE_64(uint64, vec_udword2, vsx_ld2, vsx_st2) +VSX_IMPL_ST_D_INTERLEAVE_64(double, vec_double2, vsx_ld, vsx_st) + +/* 3 channels */ +#define VSX_IMPL_ST_INTERLEAVE_3CH_16(Tp, Tvec) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, Tp* ptr) \ +{ \ + static const vec_uchar16 a12 = {0, 16, 0, 1, 17, 0, 2, 18, 0, 3, 19, 0, 4, 20, 0, 5}; \ + static const vec_uchar16 a123 = {0, 1, 16, 3, 4, 17, 6, 7, 18, 9, 10, 19, 12, 13, 20, 15}; \ + vsx_st(vec_perm(vec_perm(a, b, a12), c, a123), 0, ptr); \ + static const vec_uchar16 b12 = {21, 0, 6, 22, 0, 7, 23, 0, 8, 24, 0, 9, 25, 0, 10, 26}; \ + static const vec_uchar16 b123 = {0, 21, 2, 3, 22, 5, 6, 23, 8, 9, 24, 11, 12, 25, 14, 15}; \ + vsx_st(vec_perm(vec_perm(a, b, b12), c, b123), 16, ptr); \ + static const vec_uchar16 c12 = {0, 11, 27, 0, 12, 28, 0, 13, 29, 0, 14, 30, 0, 15, 31, 0}; \ + static const vec_uchar16 c123 = {26, 1, 2, 27, 4, 5, 28, 7, 8, 29, 10, 11, 30, 13, 14, 31}; \ + vsx_st(vec_perm(vec_perm(a, b, c12), c, c123), 32, ptr); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, Tvec& c) \ +{ \ + Tvec v1 = vsx_ld(0, ptr); \ + Tvec v2 = vsx_ld(16, ptr); \ + Tvec v3 = vsx_ld(32, ptr); \ + static const vec_uchar16 a12_perm = {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 0, 0, 0, 0, 0}; \ + static const vec_uchar16 a123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 17, 20, 23, 26, 29}; \ + a = vec_perm(vec_perm(v1, v2, a12_perm), v3, a123_perm); \ + static const vec_uchar16 b12_perm = {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 0, 0, 0, 0, 0}; \ + static const vec_uchar16 b123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 21, 24, 27, 30}; \ + b = vec_perm(vec_perm(v1, v2, b12_perm), v3, b123_perm); \ + static const vec_uchar16 c12_perm = {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 0, 0, 0, 0, 0, 0}; \ + static const vec_uchar16 c123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 19, 22, 25, 28, 31}; \ + c = vec_perm(vec_perm(v1, v2, c12_perm), v3, c123_perm); \ +} +VSX_IMPL_ST_INTERLEAVE_3CH_16(uchar, vec_uchar16) +VSX_IMPL_ST_INTERLEAVE_3CH_16(schar, vec_char16) + +#define VSX_IMPL_ST_INTERLEAVE_3CH_8(Tp, Tvec) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, Tp* ptr) \ +{ \ + static const vec_uchar16 a12 = {0, 1, 16, 17, 0, 0, 2, 3, 18, 19, 0, 0, 4, 5, 20, 21}; \ + static const vec_uchar16 a123 = {0, 1, 2, 3, 16, 17, 6, 7, 8, 9, 18, 19, 12, 13, 14, 15}; \ + vsx_st(vec_perm(vec_perm(a, b, a12), c, a123), 0, ptr); \ + static const vec_uchar16 b12 = {0, 0, 6, 7, 22, 23, 0, 0, 8, 9, 24, 25, 0, 0, 10, 11}; \ + static const vec_uchar16 b123 = {20, 21, 2, 3, 4, 5, 22, 23, 8, 9, 10, 11, 24, 25, 14, 15}; \ + vsx_st(vec_perm(vec_perm(a, b, b12), c, b123), 8, ptr); \ + static const vec_uchar16 c12 = {26, 27, 0, 0, 12, 13, 28, 29, 0, 0, 14, 15, 30, 31, 0, 0}; \ + static const vec_uchar16 c123 = {0, 1, 26, 27, 4, 5, 6, 7, 28, 29, 10, 11, 12, 13, 30, 31}; \ + vsx_st(vec_perm(vec_perm(a, b, c12), c, c123), 16, ptr); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, Tvec& c) \ +{ \ + Tvec v1 = vsx_ld(0, ptr); \ + Tvec v2 = vsx_ld(8, ptr); \ + Tvec v3 = vsx_ld(16, ptr); \ + static const vec_uchar16 a12_perm = {0, 1, 6, 7, 12, 13, 18, 19, 24, 25, 30, 31, 0, 0, 0, 0}; \ + static const vec_uchar16 a123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 26, 27}; \ + a = vec_perm(vec_perm(v1, v2, a12_perm), v3, a123_perm); \ + static const vec_uchar16 b12_perm = {2, 3, 8, 9, 14, 15, 20, 21, 26, 27, 0, 0, 0, 0, 0, 0}; \ + static const vec_uchar16 b123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 22, 23, 28, 29}; \ + b = vec_perm(vec_perm(v1, v2, b12_perm), v3, b123_perm); \ + static const vec_uchar16 c12_perm = {4, 5, 10, 11, 16, 17, 22, 23, 28, 29, 0, 0, 0, 0, 0, 0}; \ + static const vec_uchar16 c123_perm = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 18, 19, 24, 25, 30, 31}; \ + c = vec_perm(vec_perm(v1, v2, c12_perm), v3, c123_perm); \ +} +VSX_IMPL_ST_INTERLEAVE_3CH_8(ushort, vec_ushort8) +VSX_IMPL_ST_INTERLEAVE_3CH_8(short, vec_short8) + +#define VSX_IMPL_ST_INTERLEAVE_3CH_4(Tp, Tvec) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, Tp* ptr) \ +{ \ + Tvec hbc = vec_mergeh(b, c); \ + static const vec_uchar16 ahbc = {0, 1, 2, 3, 16, 17, 18, 19, 20, 21, 22, 23, 4, 5, 6, 7}; \ + vsx_st(vec_perm(a, hbc, ahbc), 0, ptr); \ + Tvec lab = vec_mergel(a, b); \ + vsx_st(vec_sld(lab, hbc, 8), 4, ptr); \ + static const vec_uchar16 clab = {8, 9, 10, 11, 24, 25, 26, 27, 28, 29, 30, 31, 12, 13, 14, 15};\ + vsx_st(vec_perm(c, lab, clab), 8, ptr); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, Tvec& b, Tvec& c) \ +{ \ + Tvec v1 = vsx_ld(0, ptr); \ + Tvec v2 = vsx_ld(4, ptr); \ + Tvec v3 = vsx_ld(8, ptr); \ + static const vec_uchar16 flp = {0, 1, 2, 3, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29, 30, 31}; \ + a = vec_perm(v1, vec_sld(v3, v2, 8), flp); \ + static const vec_uchar16 flp2 = {28, 29, 30, 31, 0, 1, 2, 3, 12, 13, 14, 15, 16, 17, 18, 19}; \ + b = vec_perm(v2, vec_sld(v1, v3, 8), flp2); \ + c = vec_perm(vec_sld(v2, v1, 8), v3, flp); \ +} +VSX_IMPL_ST_INTERLEAVE_3CH_4(uint, vec_uint4) +VSX_IMPL_ST_INTERLEAVE_3CH_4(int, vec_int4) +VSX_IMPL_ST_INTERLEAVE_3CH_4(float, vec_float4) + +#define VSX_IMPL_ST_INTERLEAVE_3CH_2(Tp, Tvec, ld_func, st_func) \ +VSX_FINLINE(void) vec_st_interleave(const Tvec& a, const Tvec& b, \ + const Tvec& c, Tp* ptr) \ +{ \ + st_func(vec_mergeh(a, b), 0, ptr); \ + st_func(vec_permi(c, a, 1), 2, ptr); \ + st_func(vec_mergel(b, c), 4, ptr); \ +} \ +VSX_FINLINE(void) vec_ld_deinterleave(const Tp* ptr, Tvec& a, \ + Tvec& b, Tvec& c) \ +{ \ + Tvec v1 = ld_func(0, ptr); \ + Tvec v2 = ld_func(2, ptr); \ + Tvec v3 = ld_func(4, ptr); \ + a = vec_permi(v1, v2, 1); \ + b = vec_permi(v1, v3, 2); \ + c = vec_permi(v2, v3, 1); \ +} +VSX_IMPL_ST_INTERLEAVE_3CH_2(int64, vec_dword2, vsx_ld2, vsx_st2) +VSX_IMPL_ST_INTERLEAVE_3CH_2(uint64, vec_udword2, vsx_ld2, vsx_st2) +VSX_IMPL_ST_INTERLEAVE_3CH_2(double, vec_double2, vsx_ld, vsx_st) + +#endif // CV_VSX + +//! @} + +#endif // OPENCV_HAL_VSX_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/cvconfig.h b/Thirdparty/opencv2/include/opencv2/cvconfig.h new file mode 100644 index 0000000..e388fc4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/cvconfig.h @@ -0,0 +1,155 @@ +#ifndef OPENCV_CVCONFIG_H_INCLUDED +#define OPENCV_CVCONFIG_H_INCLUDED + +/* OpenCV compiled as static or dynamic libs */ +#define BUILD_SHARED_LIBS + +/* OpenCV intrinsics optimized code */ +#define CV_ENABLE_INTRINSICS + +/* OpenCV additional optimized code */ +/* #undef CV_DISABLE_OPTIMIZATION */ + +/* Compile for 'real' NVIDIA GPU architectures */ +#define CUDA_ARCH_BIN "" + +/* NVIDIA GPU features are used */ +#define CUDA_ARCH_FEATURES "" + +/* Compile for 'virtual' NVIDIA PTX architectures */ +#define CUDA_ARCH_PTX "" + +/* AMD's Basic Linear Algebra Subprograms Library*/ +/* #undef HAVE_CLAMDBLAS */ + +/* AMD's OpenCL Fast Fourier Transform Library*/ +/* #undef HAVE_CLAMDFFT */ + +/* Clp support */ +/* #undef HAVE_CLP */ + +/* NVIDIA CUDA Runtime API*/ +/* #undef HAVE_CUDA */ + +/* NVIDIA CUDA Basic Linear Algebra Subprograms (BLAS) API*/ +/* #undef HAVE_CUBLAS */ + +/* NVIDIA CUDA Deep Neural Network (cuDNN) API*/ +/* #undef HAVE_CUDNN */ + +/* NVIDIA CUDA Fast Fourier Transform (FFT) API*/ +/* #undef HAVE_CUFFT */ + +/* DirectX */ +#define HAVE_DIRECTX +#define HAVE_DIRECTX_NV12 +#define HAVE_D3D11 +#define HAVE_D3D10 +#define HAVE_D3D9 + +/* Eigen Matrix & Linear Algebra Library */ +/* #undef HAVE_EIGEN */ + +/* Geospatial Data Abstraction Library */ +/* #undef HAVE_GDAL */ + +/* Halide support */ +/* #undef HAVE_HALIDE */ + +/* Vulkan support */ +/* #undef HAVE_VULKAN */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Intel Integrated Performance Primitives */ +/* #undef HAVE_IPP */ +/* #undef HAVE_IPP_ICV */ +/* #undef HAVE_IPP_IW */ +/* #undef HAVE_IPP_IW_LL */ + +/* JPEG-2000 codec */ +#define HAVE_OPENJPEG +/* #undef HAVE_JASPER */ + +/* AVIF codec */ +/* #undef HAVE_AVIF */ + +/* IJG JPEG codec */ +#define HAVE_JPEG + +/* libpng/png.h needs to be included */ +/* #undef HAVE_LIBPNG_PNG_H */ + +/* GDCM DICOM codec */ +/* #undef HAVE_GDCM */ + +/* NVIDIA Video Decoding API*/ +/* #undef HAVE_NVCUVID */ +/* #undef HAVE_NVCUVID_HEADER */ +/* #undef HAVE_DYNLINK_NVCUVID_HEADER */ + +/* NVIDIA Video Encoding API*/ +/* #undef HAVE_NVCUVENC */ + +/* OpenCL Support */ +#define HAVE_OPENCL +/* #undef HAVE_OPENCL_STATIC */ +/* #undef HAVE_OPENCL_SVM */ + +/* NVIDIA OpenCL D3D Extensions support */ +#define HAVE_OPENCL_D3D11_NV + +/* OpenEXR codec */ +#define HAVE_OPENEXR + +/* OpenGL support*/ +/* #undef HAVE_OPENGL */ + +/* PNG codec */ +#define HAVE_PNG + +/* PNG codec */ +/* #undef HAVE_SPNG */ + +/* Posix threads (pthreads) */ +/* #undef HAVE_PTHREAD */ + +/* parallel_for with pthreads */ +/* #undef HAVE_PTHREADS_PF */ + +/* Intel Threading Building Blocks */ +/* #undef HAVE_TBB */ + +/* Ste||ar Group High Performance ParallelX */ +/* #undef HAVE_HPX */ + +/* TIFF codec */ +#define HAVE_TIFF + +/* Define if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* VA library (libva) */ +/* #undef HAVE_VA */ + +/* Intel VA-API/OpenCL */ +/* #undef HAVE_VA_INTEL */ + +/* Lapack */ +/* #undef HAVE_LAPACK */ + +/* Library was compiled with functions instrumentation */ +/* #undef ENABLE_INSTRUMENTATION */ + +/* OpenVX */ +/* #undef HAVE_OPENVX */ + +/* OpenCV trace utilities */ +#define OPENCV_TRACE + +/* Library QR-code decoding */ +#define HAVE_QUIRC + +#endif // OPENCV_CVCONFIG_H_INCLUDED diff --git a/Thirdparty/opencv2/include/opencv2/dnn.hpp b/Thirdparty/opencv2/include/opencv2/dnn.hpp new file mode 100644 index 0000000..97f2fe3 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn.hpp @@ -0,0 +1,78 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_HPP +#define OPENCV_DNN_HPP + +// This is an umbrella header to include into you project. +// We are free to change headers layout in dnn subfolder, so please include +// this header for future compatibility + + +/** @defgroup dnn Deep Neural Network module + @{ + This module contains: + - API for new layers creation, layers are building bricks of neural networks; + - set of built-in most-useful Layers; + - API to construct and modify comprehensive neural networks from layers; + - functionality for loading serialized networks models from different frameworks. + + Functionality of this module is designed only for forward pass computations (i.e. network testing). + A network training is in principle not supported. + @} +*/ +/** @example samples/dnn/classification.cpp +Check @ref tutorial_dnn_googlenet "the corresponding tutorial" for more details +*/ +/** @example samples/dnn/colorization.cpp +*/ +/** @example samples/dnn/object_detection.cpp +Check @ref tutorial_dnn_yolo "the corresponding tutorial" for more details +*/ +/** @example samples/dnn/openpose.cpp +*/ +/** @example samples/dnn/segmentation.cpp +*/ +/** @example samples/dnn/text_detection.cpp +*/ +#include + +#endif /* OPENCV_DNN_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/dnn/all_layers.hpp b/Thirdparty/opencv2/include/opencv2/dnn/all_layers.hpp new file mode 100644 index 0000000..0f1518f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/all_layers.hpp @@ -0,0 +1,1174 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_DNN_ALL_LAYERS_HPP +#define OPENCV_DNN_DNN_ALL_LAYERS_HPP +#include + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN +//! @addtogroup dnn +//! @{ + +/** @defgroup dnnLayerList Partial List of Implemented Layers + @{ + This subsection of dnn module contains information about built-in layers and their descriptions. + + Classes listed here, in fact, provides C++ API for creating instances of built-in layers. + In addition to this way of layers instantiation, there is a more common factory API (see @ref dnnLayerFactory), it allows to create layers dynamically (by name) and register new ones. + You can use both API, but factory API is less convenient for native C++ programming and basically designed for use inside importers (see @ref readNetFromCaffe(), @ref readNetFromTorch(), @ref readNetFromTensorflow()). + + Built-in layers partially reproduce functionality of corresponding Caffe and Torch7 layers. + In particular, the following layers and Caffe importer were tested to reproduce Caffe functionality: + - Convolution + - Deconvolution + - Pooling + - InnerProduct + - TanH, ReLU, Sigmoid, BNLL, Power, AbsVal + - Softmax + - Reshape, Flatten, Slice, Split + - LRN + - MVN + - Dropout (since it does nothing on forward pass -)) +*/ + + class CV_EXPORTS BlankLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + /** + * Constant layer produces the same data blob at an every forward pass. + */ + class CV_EXPORTS ConstLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + //! LSTM recurrent layer + class CV_EXPORTS LSTMLayer : public Layer + { + public: + /** Creates instance of LSTM layer */ + static Ptr create(const LayerParams& params); + + /** @deprecated Use LayerParams::blobs instead. + @brief Set trained weights for LSTM layer. + + LSTM behavior on each step is defined by current input, previous output, previous cell state and learned weights. + + Let @f$x_t@f$ be current input, @f$h_t@f$ be current output, @f$c_t@f$ be current state. + Than current output and current cell state is computed as follows: + @f{eqnarray*}{ + h_t &= o_t \odot tanh(c_t), \\ + c_t &= f_t \odot c_{t-1} + i_t \odot g_t, \\ + @f} + where @f$\odot@f$ is per-element multiply operation and @f$i_t, f_t, o_t, g_t@f$ is internal gates that are computed using learned weights. + + Gates are computed as follows: + @f{eqnarray*}{ + i_t &= sigmoid&(W_{xi} x_t + W_{hi} h_{t-1} + b_i), \\ + f_t &= sigmoid&(W_{xf} x_t + W_{hf} h_{t-1} + b_f), \\ + o_t &= sigmoid&(W_{xo} x_t + W_{ho} h_{t-1} + b_o), \\ + g_t &= tanh &(W_{xg} x_t + W_{hg} h_{t-1} + b_g), \\ + @f} + where @f$W_{x?}@f$, @f$W_{h?}@f$ and @f$b_{?}@f$ are learned weights represented as matrices: + @f$W_{x?} \in R^{N_h \times N_x}@f$, @f$W_{h?} \in R^{N_h \times N_h}@f$, @f$b_? \in R^{N_h}@f$. + + For simplicity and performance purposes we use @f$ W_x = [W_{xi}; W_{xf}; W_{xo}, W_{xg}] @f$ + (i.e. @f$W_x@f$ is vertical concatenation of @f$ W_{x?} @f$), @f$ W_x \in R^{4N_h \times N_x} @f$. + The same for @f$ W_h = [W_{hi}; W_{hf}; W_{ho}, W_{hg}], W_h \in R^{4N_h \times N_h} @f$ + and for @f$ b = [b_i; b_f, b_o, b_g]@f$, @f$b \in R^{4N_h} @f$. + + @param Wh is matrix defining how previous output is transformed to internal gates (i.e. according to above mentioned notation is @f$ W_h @f$) + @param Wx is matrix defining how current input is transformed to internal gates (i.e. according to above mentioned notation is @f$ W_x @f$) + @param b is bias vector (i.e. according to above mentioned notation is @f$ b @f$) + */ + CV_DEPRECATED virtual void setWeights(const Mat &Wh, const Mat &Wx, const Mat &b) = 0; + + /** @brief Specifies shape of output blob which will be [[`T`], `N`] + @p outTailShape. + * @details If this parameter is empty or unset then @p outTailShape = [`Wh`.size(0)] will be used, + * where `Wh` is parameter from setWeights(). + */ + virtual void setOutShape(const MatShape &outTailShape = MatShape()) = 0; + + /** @deprecated Use flag `produce_cell_output` in LayerParams. + * @brief Specifies either interpret first dimension of input blob as timestamp dimension either as sample. + * + * If flag is set to true then shape of input blob will be interpreted as [`T`, `N`, `[data dims]`] where `T` specifies number of timestamps, `N` is number of independent streams. + * In this case each forward() call will iterate through `T` timestamps and update layer's state `T` times. + * + * If flag is set to false then shape of input blob will be interpreted as [`N`, `[data dims]`]. + * In this case each forward() call will make one iteration and produce one timestamp with shape [`N`, `[out dims]`]. + */ + CV_DEPRECATED virtual void setUseTimstampsDim(bool use = true) = 0; + + /** @deprecated Use flag `use_timestamp_dim` in LayerParams. + * @brief If this flag is set to true then layer will produce @f$ c_t @f$ as second output. + * @details Shape of the second output is the same as first output. + */ + CV_DEPRECATED virtual void setProduceCellOutput(bool produce = false) = 0; + + /* In common case it use single input with @f$x_t@f$ values to compute output(s) @f$h_t@f$ (and @f$c_t@f$). + * @param input should contain packed values @f$x_t@f$ + * @param output contains computed outputs: @f$h_t@f$ (and @f$c_t@f$ if setProduceCellOutput() flag was set to true). + * + * If setUseTimstampsDim() is set to true then @p input[0] should has at least two dimensions with the following shape: [`T`, `N`, `[data dims]`], + * where `T` specifies number of timestamps, `N` is number of independent streams (i.e. @f$ x_{t_0 + t}^{stream} @f$ is stored inside @p input[0][t, stream, ...]). + * + * If setUseTimstampsDim() is set to false then @p input[0] should contain single timestamp, its shape should has form [`N`, `[data dims]`] with at least one dimension. + * (i.e. @f$ x_{t}^{stream} @f$ is stored inside @p input[0][stream, ...]). + */ + + int inputNameToIndex(String inputName) CV_OVERRIDE; + int outputNameToIndex(const String& outputName) CV_OVERRIDE; + }; + + /** @brief GRU recurrent one-layer + * + * Accepts input sequence and computes the final hidden state for each element in the batch. + * + * - input[0] containing the features of the input sequence. + * input[0] should have shape [`T`, `N`, `data_dims`] where `T` is sequence length, `N` is batch size, `data_dims` is input size + * - output would have shape [`T`, `N`, `D` * `hidden_size`] where `D = 2` if layer is bidirectional otherwise `D = 1` + * + * Depends on the following attributes: + * - hidden_size - Number of neurons in the hidden layer + * - direction - RNN could be bidirectional or forward + * + * The final hidden state @f$ h_t @f$ computes by the following formulas: + * + @f{eqnarray*}{ + r_t = \sigma(W_{ir} x_t + b_{ir} + W_{hr} h_{(t-1)} + b_{hr}) \\ + z_t = \sigma(W_{iz} x_t + b_{iz} + W_{hz} h_{(t-1)} + b_{hz}) \\ + n_t = \tanh(W_{in} x_t + b_{in} + r_t \odot (W_{hn} h_{(t-1)}+ b_{hn})) \\ + h_t = (1 - z_t) \odot n_t + z_t \odot h_{(t-1)} \\ + @f} + * Where @f$x_t@f$ is current input, @f$h_{(t-1)}@f$ is previous or initial hidden state. + * + * @f$W_{x?}@f$, @f$W_{h?}@f$ and @f$b_{?}@f$ are learned weights represented as matrices: + * @f$W_{x?} \in R^{N_h \times N_x}@f$, @f$W_{h?} \in R^{N_h \times N_h}@f$, @f$b_? \in R^{N_h}@f$. + * + * @f$\odot@f$ is per-element multiply operation. + */ + class CV_EXPORTS GRULayer : public Layer + { + public: + /** Creates instance of GRU layer */ + static Ptr create(const LayerParams& params); + }; + + /** @brief Classical recurrent layer + + Accepts two inputs @f$x_t@f$ and @f$h_{t-1}@f$ and compute two outputs @f$o_t@f$ and @f$h_t@f$. + + - input: should contain packed input @f$x_t@f$. + - output: should contain output @f$o_t@f$ (and @f$h_t@f$ if setProduceHiddenOutput() is set to true). + + input[0] should have shape [`T`, `N`, `data_dims`] where `T` and `N` is number of timestamps and number of independent samples of @f$x_t@f$ respectively. + + output[0] will have shape [`T`, `N`, @f$N_o@f$], where @f$N_o@f$ is number of rows in @f$ W_{xo} @f$ matrix. + + If setProduceHiddenOutput() is set to true then @p output[1] will contain a Mat with shape [`T`, `N`, @f$N_h@f$], where @f$N_h@f$ is number of rows in @f$ W_{hh} @f$ matrix. + */ + class CV_EXPORTS RNNLayer : public Layer + { + public: + /** Creates instance of RNNLayer */ + static Ptr create(const LayerParams& params); + + /** Setups learned weights. + + Recurrent-layer behavior on each step is defined by current input @f$ x_t @f$, previous state @f$ h_t @f$ and learned weights as follows: + @f{eqnarray*}{ + h_t &= tanh&(W_{hh} h_{t-1} + W_{xh} x_t + b_h), \\ + o_t &= tanh&(W_{ho} h_t + b_o), + @f} + + @param Wxh is @f$ W_{xh} @f$ matrix + @param bh is @f$ b_{h} @f$ vector + @param Whh is @f$ W_{hh} @f$ matrix + @param Who is @f$ W_{xo} @f$ matrix + @param bo is @f$ b_{o} @f$ vector + */ + virtual void setWeights(const Mat &Wxh, const Mat &bh, const Mat &Whh, const Mat &Who, const Mat &bo) = 0; + + /** @brief If this flag is set to true then layer will produce @f$ h_t @f$ as second output. + * @details Shape of the second output is the same as first output. + */ + virtual void setProduceHiddenOutput(bool produce = false) = 0; + + }; + + /** @brief This function performs array summation based + * on the Einstein summation convention. The function + * allows for concise expressions of various mathematical + * operations using subscripts. + * + * By default, the labels are placed in alphabetical + * order at the end of the output. + * For example: + * if `c = einsum("i,j", a, b)`, then `c[i,j] == a[i]*b[j]`. + * However, if `c = einsum("j,i", a, b)`, then `c[i,j] = a[j]*b[i]`. + * Alternatively, you can control the output order or prevent + * an axis from being summed/force an axis to be summed + * by providing indices for the output. + * For example: + * `diag(a)` -> `einsum("ii->i", a)` + * `sum(a, axis=0)` -> `einsum("i...->", a)` + * Subscripts at the beginning and end may be specified + * by putting an ellipsis "..." in the middle. + * For instance, the function `einsum("i...i", a)` takes + * the diagonal of the first and last dimensions of + * the operand, and `einsum("ij...,jk...->ik...")` performs + * the matrix product using the first two indices + * of each operand instead of the last two. + * When there is only one operand, no axes being summed, + * and no output parameter, this function returns + * a view into the operand instead of creating a copy. + */ + class CV_EXPORTS EinsumLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS BaseConvolutionLayer : public Layer + { + public: + CV_DEPRECATED_EXTERNAL Size kernel, stride, pad, dilation, adjustPad; + std::vector adjust_pads; + std::vector kernel_size, strides, dilations; + std::vector pads_begin, pads_end; + String padMode; + int numOutput; + }; + + class CV_EXPORTS ConvolutionLayer : public BaseConvolutionLayer + { + public: + static Ptr create(const LayerParams& params); + bool fusedActivation = false; + bool fusedAdd = false; + bool useWinograd = false; // Flag whether to use Winograd to speed up 3x3 convolution. + }; + + class CV_EXPORTS ConvolutionLayerInt8 : public BaseConvolutionLayer + { + public: + int input_zp, output_zp; + float input_sc, output_sc; + + // quantization type flag. The perChannel default is true, that means it contains the parameters + // of per-Channel quantization. Otherwise, that means this layer contains per-Tensor quantized parameters. + bool per_channel; + bool useWinograd = true; // Flag whether to use Winograd to speed up 3x3 convolution. + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS DeconvolutionLayer : public BaseConvolutionLayer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS LRNLayer : public Layer + { + public: + int type; + + int size; + float alpha, beta, bias; + bool normBySize; + + static Ptr create(const LayerParams& params); + }; + + + /** @brief ArgMax/ArgMin layer + * @note returns indices as floats, which means the supported range is [-2^24; 2^24] + */ + class CV_EXPORTS ArgLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /** @brief Gather layer + */ + class CV_EXPORTS GatherLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /** @brief GatherElements layer + * GatherElements takes two inputs data and indices of the same rank r >= 1 and an optional attribute axis and works such that: + * output[i][j][k] = data[index[i][j][k]][j][k] if axis = 0 and r = 3 + * output[i][j][k] = data[i][index[i][j][k]][k] if axis = 1 and r = 3 + * output[i][j][k] = data[i][j][index[i][j][k]] if axis = 2 and r = 3 + * + * Gather, on the other hand, takes a data tensor of rank r >= 1, and indices tensor of rank q, and works such that: + * it gathers the enteries along axis dimension of the input data indexed by indices and concatenates them in an output tensor of rank q + (r - 1) + * e.g. If axis = 0, let k = indices[i_{0}, ..., i_{q-1}] then output[i_{0}, ..., i_{q-1}, j_{0}, ..., j_{r-2}] = input[k , j_{0}, ..., j_{r-2}]: + **/ + class CV_EXPORTS GatherElementsLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS PoolingLayer : public Layer + { + public: + int type; + std::vector kernel_size, strides; + std::vector pads_begin, pads_end; + bool globalPooling; //!< Flag is true if at least one of the axes is global pooled. + std::vector isGlobalPooling; + bool computeMaxIdx; + String padMode; + bool ceilMode; + // If true for average pooling with padding, divide an every output region + // by a whole kernel area. Otherwise exclude zero padded values and divide + // by number of real values. + bool avePoolPaddedArea; + // ROIPooling parameters. + Size pooledSize; + float spatialScale; + // PSROIPooling parameters. + int psRoiOutChannels; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS PoolingLayerInt8 : public PoolingLayer + { + public: + int input_zp, output_zp; + float input_sc, output_sc; + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ReduceLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS SoftmaxLayer : public Layer + { + public: + bool logSoftMax; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS SoftmaxLayerInt8 : public SoftmaxLayer + { + public: + float output_sc; + int output_zp; + static Ptr create(const LayerParams& params); + }; + + /** + * `InnerProduct`, `MatMul` and `Gemm` operations are all implemented by Fully Connected Layer. + * Parameter `is_matmul` is used to distinguish `MatMul` and `Gemm` from `InnerProduct`. + */ + class CV_EXPORTS InnerProductLayer : public Layer + { + public: + int axis; + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS InnerProductLayerInt8 : public InnerProductLayer + { + public: + int input_zp, output_zp; + float input_sc, output_sc; + + // quantization type flag. The perChannel default is true, that means it contains the parameters + // of per-Channel quantization. Otherwise, that means this layer contains per-Tensor quantized parameters. + bool per_channel; + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS MVNLayer : public Layer + { + public: + float eps; + bool normVariance, acrossChannels; + + static Ptr create(const LayerParams& params); + }; + + /* Reshaping */ + + class CV_EXPORTS ReshapeLayer : public Layer + { + public: + MatShape newShapeDesc; + Range newShapeRange; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS FlattenLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS QuantizeLayer : public Layer + { + public: + std::vector scales; + std::vector zeropoints; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS DequantizeLayer : public Layer + { + public: + std::vector scales; + std::vector zeropoints; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS RequantizeLayer : public Layer + { + public: + float scale, shift; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ConcatLayer : public Layer + { + public: + int axis; + /** + * @brief Add zero padding in case of concatenation of blobs with different + * spatial sizes. + * + * Details: https://github.com/torch/nn/blob/master/doc/containers.md#depthconcat + */ + bool padding; + int paddingValue; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SplitLayer : public Layer + { + public: + int outputsCount; //!< Number of copies that will be produced (is ignored when negative). + + static Ptr create(const LayerParams ¶ms); + }; + + /** + * Slice layer has several modes: + * 1. Caffe mode + * @param[in] axis Axis of split operation + * @param[in] slice_point Array of split points + * + * Number of output blobs equals to number of split points plus one. The + * first blob is a slice on input from 0 to @p slice_point[0] - 1 by @p axis, + * the second output blob is a slice of input from @p slice_point[0] to + * @p slice_point[1] - 1 by @p axis and the last output blob is a slice of + * input from @p slice_point[-1] up to the end of @p axis size. + * + * 2. TensorFlow mode + * @param begin Vector of start indices + * @param size Vector of sizes + * + * More convenient numpy-like slice. One and only output blob + * is a slice `input[begin[0]:begin[0]+size[0], begin[1]:begin[1]+size[1], ...]` + * + * 3. Torch mode + * @param axis Axis of split operation + * + * Split input blob on the equal parts by @p axis. + */ + class CV_EXPORTS SliceLayer : public Layer + { + public: + /** + * @brief Vector of slice ranges. + * + * The first dimension equals number of output blobs. + * Inner vector has slice ranges for the first number of input dimensions. + */ + std::vector > sliceRanges; + std::vector > sliceSteps; + int axis; + int num_split; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS PermuteLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /** + * Permute channels of 4-dimensional input blob. + * @param group Number of groups to split input channels and pick in turns + * into output blob. + * + * \f[ groupSize = \frac{number\ of\ channels}{group} \f] + * \f[ output(n, c, h, w) = input(n, groupSize \times (c \% group) + \lfloor \frac{c}{group} \rfloor, h, w) \f] + * Read more at https://arxiv.org/pdf/1707.01083.pdf + */ + class CV_EXPORTS ShuffleChannelLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + + int group; + }; + + /** + * @brief Adds extra values for specific axes. + * @param paddings Vector of paddings in format + * @code + * [ pad_before, pad_after, // [0]th dimension + * pad_before, pad_after, // [1]st dimension + * ... + * pad_before, pad_after ] // [n]th dimension + * @endcode + * that represents number of padded values at every dimension + * starting from the first one. The rest of dimensions won't + * be padded. + * @param value Value to be padded. Defaults to zero. + * @param type Padding type: 'constant', 'reflect' + * @param input_dims Torch's parameter. If @p input_dims is not equal to the + * actual input dimensionality then the `[0]th` dimension + * is considered as a batch dimension and @p paddings are shifted + * to a one dimension. Defaults to `-1` that means padding + * corresponding to @p paddings. + */ + class CV_EXPORTS PaddingLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /* Activations */ + class CV_EXPORTS ActivationLayer : public Layer + { + public: + virtual void forwardSlice(const float* src, float* dst, int len, + size_t outPlaneSize, int cn0, int cn1) const {} + virtual void forwardSlice(const int* src, const int* lut, int* dst, int len, + size_t outPlaneSize, int cn0, int cn1) const {} + virtual void forwardSlice(const int8_t* src, const int8_t* lut, int8_t* dst, int len, + size_t outPlaneSize, int cn0, int cn1) const {} + }; + + class CV_EXPORTS ReLULayer : public ActivationLayer + { + public: + float negativeSlope; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ReLU6Layer : public ActivationLayer + { + public: + float minValue, maxValue; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ChannelsPReLULayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ELULayer : public ActivationLayer + { + public: + float alpha; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS TanHLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SwishLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS MishLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SigmoidLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS BNLLLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AbsLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS PowerLayer : public ActivationLayer + { + public: + float power, scale, shift; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ExpLayer : public ActivationLayer + { + public: + float base, scale, shift; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS CeilLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS FloorLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS LogLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS RoundLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SqrtLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS NotLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AcosLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AcoshLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AsinLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AsinhLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AtanLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS AtanhLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS CosLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS CoshLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ErfLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS HardSwishLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SinLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SinhLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SoftplusLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SoftsignLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS TanLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS CeluLayer : public ActivationLayer + { + public: + float alpha; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS HardSigmoidLayer : public ActivationLayer + { + public: + float alpha; + float beta; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SeluLayer : public ActivationLayer + { + public: + float alpha; + float gamma; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS GeluLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS GeluApproximationLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ThresholdedReluLayer : public ActivationLayer + { + public: + float alpha; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ActivationLayerInt8 : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS SignLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ShrinkLayer : public ActivationLayer + { + public: + float bias; + float lambd; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ReciprocalLayer : public ActivationLayer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + /* Layers used in semantic segmentation */ + + class CV_EXPORTS CropLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + /** @brief Element wise operation on inputs + + Extra optional parameters: + - "operation" as string. Values are "sum" (default), "prod", "max", "div", "min" + - "coeff" as float array. Specify weights of inputs for SUM operation + - "output_channels_mode" as string. Values are "same" (default, all input must have the same layout), "input_0", "input_0_truncate", "max_input_channels" + */ + class CV_EXPORTS EltwiseLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS EltwiseLayerInt8 : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS NaryEltwiseLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS BatchNormLayer : public ActivationLayer + { + public: + bool hasWeights, hasBias; + float epsilon; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS BatchNormLayerInt8 : public BatchNormLayer + { + public: + float input_sc, output_sc; + int input_zp, output_zp; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS MaxUnpoolLayer : public Layer + { + public: + Size poolKernel; + Size poolPad; + Size poolStride; + + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ScaleLayer : public Layer + { + public: + bool hasBias; + int axis; + String mode; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ScaleLayerInt8 : public ScaleLayer + { + public: + float output_sc; + int output_zp; + static Ptr create(const LayerParams ¶ms); + }; + + class CV_EXPORTS ShiftLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ShiftLayerInt8 : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS CompareLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS DataAugmentationLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS CorrelationLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS AccumLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS FlowWarpLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS PriorBoxLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ReorgLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS RegionLayer : public Layer + { + public: + float nmsThreshold; + + static Ptr create(const LayerParams& params); + }; + + /** + * @brief Detection output layer. + * + * The layer size is: @f$ (1 \times 1 \times N \times 7) @f$ + * where N is [keep_top_k] parameter multiplied by batch size. Each row is: + * [image_id, label, confidence, xmin, ymin, xmax, ymax] + * where image_id is the index of image input in the batch. + */ + class CV_EXPORTS DetectionOutputLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /** + * @brief \f$ L_p \f$ - normalization layer. + * @param p Normalization factor. The most common `p = 1` for \f$ L_1 \f$ - + * normalization or `p = 2` for \f$ L_2 \f$ - normalization or a custom one. + * @param eps Parameter \f$ \epsilon \f$ to prevent a division by zero. + * @param across_spatial If true, normalize an input across all non-batch dimensions. + * Otherwise normalize an every channel separately. + * + * Across spatial: + * @f[ + * norm = \sqrt[p]{\epsilon + \sum_{x, y, c} |src(x, y, c)|^p } \\ + * dst(x, y, c) = \frac{ src(x, y, c) }{norm} + * @f] + * + * Channel wise normalization: + * @f[ + * norm(c) = \sqrt[p]{\epsilon + \sum_{x, y} |src(x, y, c)|^p } \\ + * dst(x, y, c) = \frac{ src(x, y, c) }{norm(c)} + * @f] + * + * Where `x, y` - spatial coordinates, `c` - channel. + * + * An every sample in the batch is normalized separately. Optionally, + * output is scaled by the trained parameters. + */ + class CV_EXPORTS NormalizeBBoxLayer : public Layer + { + public: + float pnorm, epsilon; + CV_DEPRECATED_EXTERNAL bool acrossSpatial; + + static Ptr create(const LayerParams& params); + }; + + /** + * @brief Resize input 4-dimensional blob by nearest neighbor or bilinear strategy. + * + * Layer is used to support TensorFlow's resize_nearest_neighbor and resize_bilinear ops. + */ + class CV_EXPORTS ResizeLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + /** + * @brief Bilinear resize layer from https://github.com/cdmh/deeplab-public-ver2 + * + * It differs from @ref ResizeLayer in output shape and resize scales computations. + */ + class CV_EXPORTS InterpLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ProposalLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS CropAndResizeLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS CumSumLayer : public Layer + { + public: + int exclusive; + int reverse; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ScatterLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ScatterNDLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS TileLayer : public Layer + { + public: + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS LayerNormLayer : public Layer + { + public: + bool hasBias; + int axis; + float epsilon; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS GemmLayer : public Layer { + public: + bool trans_a; + bool trans_b; + float alpha; + float beta; + + static Ptr create(const LayerParams& params); + }; + + class CV_EXPORTS ExpandLayer : public Layer + { + public: + static Ptr create(const LayerParams ¶ms); + }; + +//! @} +//! @} +CV__DNN_INLINE_NS_END +} +} +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/dict.hpp b/Thirdparty/opencv2/include/opencv2/dnn/dict.hpp new file mode 100644 index 0000000..059ce9b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/dict.hpp @@ -0,0 +1,160 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include +#include +#include + +#include + +#ifndef OPENCV_DNN_DNN_DICT_HPP +#define OPENCV_DNN_DNN_DICT_HPP + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN +//! @addtogroup dnn +//! @{ + +/** @brief This struct stores the scalar value (or array) of one of the following type: double, cv::String or int64. + * @todo Maybe int64 is useless because double type exactly stores at least 2^52 integers. + */ +struct CV_EXPORTS_W DictValue +{ + DictValue(const DictValue &r); + explicit DictValue(bool i) : type(Param::INT), pi(new AutoBuffer) { (*pi)[0] = i ? 1 : 0; } //!< Constructs integer scalar + explicit DictValue(int64 i = 0) : type(Param::INT), pi(new AutoBuffer) { (*pi)[0] = i; } //!< Constructs integer scalar + CV_WRAP explicit DictValue(int i) : type(Param::INT), pi(new AutoBuffer) { (*pi)[0] = i; } //!< Constructs integer scalar + explicit DictValue(unsigned p) : type(Param::INT), pi(new AutoBuffer) { (*pi)[0] = p; } //!< Constructs integer scalar + CV_WRAP explicit DictValue(double p) : type(Param::REAL), pd(new AutoBuffer) { (*pd)[0] = p; } //!< Constructs floating point scalar + CV_WRAP explicit DictValue(const String &s) : type(Param::STRING), ps(new AutoBuffer) { (*ps)[0] = s; } //!< Constructs string scalar + explicit DictValue(const char *s) : type(Param::STRING), ps(new AutoBuffer) { (*ps)[0] = s; } //!< @overload + + template + static DictValue arrayInt(TypeIter begin, int size); //!< Constructs integer array + template + static DictValue arrayReal(TypeIter begin, int size); //!< Constructs floating point array + template + static DictValue arrayString(TypeIter begin, int size); //!< Constructs array of strings + + template + T get(int idx = -1) const; //!< Tries to convert array element with specified index to requested type and returns its. + + int size() const; + + CV_WRAP bool isInt() const; + CV_WRAP bool isString() const; + CV_WRAP bool isReal() const; + + CV_WRAP int getIntValue(int idx = -1) const; + CV_WRAP double getRealValue(int idx = -1) const; + CV_WRAP String getStringValue(int idx = -1) const; + + DictValue &operator=(const DictValue &r); + + friend std::ostream &operator<<(std::ostream &stream, const DictValue &dictv); + + ~DictValue(); + +private: + + Param type; + + union + { + AutoBuffer *pi; + AutoBuffer *pd; + AutoBuffer *ps; + void *pv; + }; + + DictValue(Param _type, void *_p) : type(_type), pv(_p) {} + void release(); +}; + +/** @brief This class implements name-value dictionary, values are instances of DictValue. */ +class CV_EXPORTS Dict +{ + typedef std::map _Dict; + _Dict dict; + +public: + + //! Checks a presence of the @p key in the dictionary. + bool has(const String &key) const; + + //! If the @p key in the dictionary then returns pointer to its value, else returns NULL. + DictValue *ptr(const String &key); + + /** @overload */ + const DictValue *ptr(const String &key) const; + + //! If the @p key in the dictionary then returns its value, else an error will be generated. + const DictValue &get(const String &key) const; + + /** @overload */ + template + T get(const String &key) const; + + //! If the @p key in the dictionary then returns its value, else returns @p defaultValue. + template + T get(const String &key, const T &defaultValue) const; + + //! Sets new @p value for the @p key, or adds new key-value pair into the dictionary. + template + const T &set(const String &key, const T &value); + + //! Erase @p key from the dictionary. + void erase(const String &key); + + friend std::ostream &operator<<(std::ostream &stream, const Dict &dict); + + std::map::const_iterator begin() const; + + std::map::const_iterator end() const; +}; + +//! @} +CV__DNN_INLINE_NS_END +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/dnn.hpp b/Thirdparty/opencv2/include/opencv2/dnn/dnn.hpp new file mode 100644 index 0000000..02a76d4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/dnn.hpp @@ -0,0 +1,1915 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_DNN_HPP +#define OPENCV_DNN_DNN_HPP + +#include +#include +#include "opencv2/core/async.hpp" + +#include "../dnn/version.hpp" + +#include + +namespace cv { +namespace dnn { + +namespace accessor { +class DnnNetAccessor; // forward declaration +} + +CV__DNN_INLINE_NS_BEGIN +//! @addtogroup dnn +//! @{ + + typedef std::vector MatShape; + + /** + * @brief Enum of computation backends supported by layers. + * @see Net::setPreferableBackend + */ + enum Backend + { + //! DNN_BACKEND_DEFAULT equals to OPENCV_DNN_BACKEND_DEFAULT, which can be defined using CMake or a configuration parameter + DNN_BACKEND_DEFAULT = 0, + DNN_BACKEND_HALIDE, + DNN_BACKEND_INFERENCE_ENGINE, //!< Intel OpenVINO computational backend + //!< @note Tutorial how to build OpenCV with OpenVINO: @ref tutorial_dnn_openvino + DNN_BACKEND_OPENCV, + DNN_BACKEND_VKCOM, + DNN_BACKEND_CUDA, + DNN_BACKEND_WEBNN, + DNN_BACKEND_TIMVX, + DNN_BACKEND_CANN, +#if defined(__OPENCV_BUILD) || defined(BUILD_PLUGIN) +#if !defined(OPENCV_BINDING_PARSER) + DNN_BACKEND_INFERENCE_ENGINE_NGRAPH = 1000000, // internal - use DNN_BACKEND_INFERENCE_ENGINE + setInferenceEngineBackendType() + DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019, // internal - use DNN_BACKEND_INFERENCE_ENGINE + setInferenceEngineBackendType() +#endif +#endif + }; + + /** + * @brief Enum of target devices for computations. + * @see Net::setPreferableTarget + */ + enum Target + { + DNN_TARGET_CPU = 0, + DNN_TARGET_OPENCL, + DNN_TARGET_OPENCL_FP16, + DNN_TARGET_MYRIAD, + DNN_TARGET_VULKAN, + DNN_TARGET_FPGA, //!< FPGA device with CPU fallbacks using Inference Engine's Heterogeneous plugin. + DNN_TARGET_CUDA, + DNN_TARGET_CUDA_FP16, + DNN_TARGET_HDDL, + DNN_TARGET_NPU, + DNN_TARGET_CPU_FP16, // Only the ARM platform is supported. Low precision computing, accelerate model inference. + }; + + /** + * @brief Enum of data layout for model inference. + * @see Image2BlobParams + */ + enum DataLayout + { + DNN_LAYOUT_UNKNOWN = 0, + DNN_LAYOUT_ND = 1, //!< OpenCV data layout for 2D data. + DNN_LAYOUT_NCHW = 2, //!< OpenCV data layout for 4D data. + DNN_LAYOUT_NCDHW = 3, //!< OpenCV data layout for 5D data. + DNN_LAYOUT_NHWC = 4, //!< Tensorflow-like data layout for 4D data. + DNN_LAYOUT_NDHWC = 5, //!< Tensorflow-like data layout for 5D data. + DNN_LAYOUT_PLANAR = 6, //!< Tensorflow-like data layout, it should only be used at tf or tflite model parsing. + }; + + CV_EXPORTS std::vector< std::pair > getAvailableBackends(); + CV_EXPORTS_W std::vector getAvailableTargets(dnn::Backend be); + + /** + * @brief Enables detailed logging of the DNN model loading with CV DNN API. + * @param[in] isDiagnosticsMode Indicates whether diagnostic mode should be set. + * + * Diagnostic mode provides detailed logging of the model loading stage to explore + * potential problems (ex.: not implemented layer type). + * + * @note In diagnostic mode series of assertions will be skipped, it can lead to the + * expected application crash. + */ + CV_EXPORTS void enableModelDiagnostics(bool isDiagnosticsMode); + + /** @brief This class provides all data needed to initialize layer. + * + * It includes dictionary with scalar params (which can be read by using Dict interface), + * blob params #blobs and optional meta information: #name and #type of layer instance. + */ + class CV_EXPORTS LayerParams : public Dict + { + public: + //TODO: Add ability to name blob params + std::vector blobs; //!< List of learned parameters stored as blobs. + + String name; //!< Name of the layer instance (optional, can be used internal purposes). + String type; //!< Type name which was used for creating layer by layer factory (optional). + }; + + /** + * @brief Derivatives of this class encapsulates functions of certain backends. + */ + class BackendNode + { + public: + explicit BackendNode(int backendId); + + virtual ~BackendNode(); //!< Virtual destructor to make polymorphism. + + int backendId; //!< Backend identifier. + }; + + /** + * @brief Derivatives of this class wraps cv::Mat for different backends and targets. + */ + class BackendWrapper + { + public: + BackendWrapper(int backendId, int targetId); + + /** + * @brief Wrap cv::Mat for specific backend and target. + * @param[in] targetId Target identifier. + * @param[in] m cv::Mat for wrapping. + * + * Make CPU->GPU data transfer if it's require for the target. + */ + BackendWrapper(int targetId, const cv::Mat& m); + + /** + * @brief Make wrapper for reused cv::Mat. + * @param[in] base Wrapper of cv::Mat that will be reused. + * @param[in] shape Specific shape. + * + * Initialize wrapper from another one. It'll wrap the same host CPU + * memory and mustn't allocate memory on device(i.e. GPU). It might + * has different shape. Use in case of CPU memory reusing for reuse + * associated memory on device too. + */ + BackendWrapper(const Ptr& base, const MatShape& shape); + + virtual ~BackendWrapper(); //!< Virtual destructor to make polymorphism. + + /** + * @brief Transfer data to CPU host memory. + */ + virtual void copyToHost() = 0; + + /** + * @brief Indicate that an actual data is on CPU. + */ + virtual void setHostDirty() = 0; + + int backendId; //!< Backend identifier. + int targetId; //!< Target identifier. + }; + + class CV_EXPORTS ActivationLayer; + + /** @brief This interface class allows to build new Layers - are building blocks of networks. + * + * Each class, derived from Layer, must implement allocate() methods to declare own outputs and forward() to compute outputs. + * Also before using the new layer into networks you must register your layer by using one of @ref dnnLayerFactory "LayerFactory" macros. + */ + class CV_EXPORTS_W Layer : public Algorithm + { + public: + + //! List of learned parameters must be stored here to allow read them by using Net::getParam(). + CV_PROP_RW std::vector blobs; + + /** @brief Computes and sets internal parameters according to inputs, outputs and blobs. + * @deprecated Use Layer::finalize(InputArrayOfArrays, OutputArrayOfArrays) instead + * @param[in] input vector of already allocated input blobs + * @param[out] output vector of already allocated output blobs + * + * If this method is called after network has allocated all memory for input and output blobs + * and before inferencing. + */ + CV_DEPRECATED_EXTERNAL + virtual void finalize(const std::vector &input, std::vector &output); + + /** @brief Computes and sets internal parameters according to inputs, outputs and blobs. + * @param[in] inputs vector of already allocated input blobs + * @param[out] outputs vector of already allocated output blobs + * + * If this method is called after network has allocated all memory for input and output blobs + * and before inferencing. + */ + CV_WRAP virtual void finalize(InputArrayOfArrays inputs, OutputArrayOfArrays outputs); + + /** @brief Given the @p input blobs, computes the output @p blobs. + * @deprecated Use Layer::forward(InputArrayOfArrays, OutputArrayOfArrays, OutputArrayOfArrays) instead + * @param[in] input the input blobs. + * @param[out] output allocated output blobs, which will store results of the computation. + * @param[out] internals allocated internal blobs + */ + CV_DEPRECATED_EXTERNAL + virtual void forward(std::vector &input, std::vector &output, std::vector &internals); + + /** @brief Given the @p input blobs, computes the output @p blobs. + * @param[in] inputs the input blobs. + * @param[out] outputs allocated output blobs, which will store results of the computation. + * @param[out] internals allocated internal blobs + */ + virtual void forward(InputArrayOfArrays inputs, OutputArrayOfArrays outputs, OutputArrayOfArrays internals); + + /** @brief Tries to quantize the given layer and compute the quantization parameters required for fixed point implementation. + * @param[in] scales input and output scales. + * @param[in] zeropoints input and output zeropoints. + * @param[out] params Quantized parameters required for fixed point implementation of that layer. + * @returns True if layer can be quantized. + */ + virtual bool tryQuantize(const std::vector > &scales, + const std::vector > &zeropoints, LayerParams& params); + + /** @brief Given the @p input blobs, computes the output @p blobs. + * @param[in] inputs the input blobs. + * @param[out] outputs allocated output blobs, which will store results of the computation. + * @param[out] internals allocated internal blobs + */ + void forward_fallback(InputArrayOfArrays inputs, OutputArrayOfArrays outputs, OutputArrayOfArrays internals); + + /** @brief + * @overload + * @deprecated Use Layer::finalize(InputArrayOfArrays, OutputArrayOfArrays) instead + */ + CV_DEPRECATED_EXTERNAL + void finalize(const std::vector &inputs, CV_OUT std::vector &outputs); + + /** @brief + * @overload + * @deprecated Use Layer::finalize(InputArrayOfArrays, OutputArrayOfArrays) instead + */ + CV_DEPRECATED std::vector finalize(const std::vector &inputs); + + /** @brief Allocates layer and computes output. + * @deprecated This method will be removed in the future release. + */ + CV_DEPRECATED CV_WRAP void run(const std::vector &inputs, CV_OUT std::vector &outputs, + CV_IN_OUT std::vector &internals); + + /** @brief Returns index of input blob into the input array. + * @param inputName label of input blob + * + * Each layer input and output can be labeled to easily identify them using "%[.output_name]" notation. + * This method maps label of input blob to its index into input vector. + */ + virtual int inputNameToIndex(String inputName); // FIXIT const + /** @brief Returns index of output blob in output array. + * @see inputNameToIndex() + */ + CV_WRAP virtual int outputNameToIndex(const String& outputName); // FIXIT const + + /** + * @brief Ask layer if it support specific backend for doing computations. + * @param[in] backendId computation backend identifier. + * @see Backend + */ + virtual bool supportBackend(int backendId); // FIXIT const + + /** + * @brief Returns Halide backend node. + * @param[in] inputs Input Halide buffers. + * @see BackendNode, BackendWrapper + * + * Input buffers should be exactly the same that will be used in forward invocations. + * Despite we can use Halide::ImageParam based on input shape only, + * it helps prevent some memory management issues (if something wrong, + * Halide tests will be failed). + */ + virtual Ptr initHalide(const std::vector > &inputs); + + virtual Ptr initNgraph(const std::vector > &inputs, const std::vector >& nodes); + + virtual Ptr initVkCom(const std::vector > &inputs, std::vector > &outputs); + + virtual Ptr initWebnn(const std::vector > &inputs, const std::vector >& nodes); + + /** + * @brief Returns a CUDA backend node + * + * @param context void pointer to CSLContext object + * @param inputs layer inputs + * @param outputs layer outputs + */ + virtual Ptr initCUDA( + void *context, + const std::vector>& inputs, + const std::vector>& outputs + ); + + /** + * @brief Returns a TimVX backend node + * + * @param timVxInfo void pointer to CSLContext object + * @param inputsWrapper layer inputs + * @param outputsWrapper layer outputs + * @param isLast if the node is the last one of the TimVX Graph. + */ + virtual Ptr initTimVX(void* timVxInfo, + const std::vector > &inputsWrapper, + const std::vector > &outputsWrapper, + bool isLast); + + /** + * @brief Returns a CANN backend node + * + * @param inputs input tensors of CANN operator + * @param outputs output tensors of CANN operator + * @param nodes nodes of input tensors + */ + virtual Ptr initCann(const std::vector > &inputs, + const std::vector > &outputs, + const std::vector >& nodes); + + /** + * @brief Automatic Halide scheduling based on layer hyper-parameters. + * @param[in] node Backend node with Halide functions. + * @param[in] inputs Blobs that will be used in forward invocations. + * @param[in] outputs Blobs that will be used in forward invocations. + * @param[in] targetId Target identifier + * @see BackendNode, Target + * + * Layer don't use own Halide::Func members because we can have applied + * layers fusing. In this way the fused function should be scheduled. + */ + virtual void applyHalideScheduler(Ptr& node, + const std::vector &inputs, + const std::vector &outputs, + int targetId) const; + + /** + * @brief Implement layers fusing. + * @param[in] node Backend node of bottom layer. + * @see BackendNode + * + * Actual for graph-based backends. If layer attached successfully, + * returns non-empty cv::Ptr to node of the same backend. + * Fuse only over the last function. + */ + virtual Ptr tryAttach(const Ptr& node); + + /** + * @brief Tries to attach to the layer the subsequent activation layer, i.e. do the layer fusion in a partial case. + * @param[in] layer The subsequent activation layer. + * + * Returns true if the activation layer has been attached successfully. + */ + virtual bool setActivation(const Ptr& layer); + + /** + * @brief Try to fuse current layer with a next one + * @param[in] top Next layer to be fused. + * @returns True if fusion was performed. + */ + virtual bool tryFuse(Ptr& top); + + /** + * @brief Returns parameters of layers with channel-wise multiplication and addition. + * @param[out] scale Channel-wise multipliers. Total number of values should + * be equal to number of channels. + * @param[out] shift Channel-wise offsets. Total number of values should + * be equal to number of channels. + * + * Some layers can fuse their transformations with further layers. + * In example, convolution + batch normalization. This way base layer + * use weights from layer after it. Fused layer is skipped. + * By default, @p scale and @p shift are empty that means layer has no + * element-wise multiplications or additions. + */ + virtual void getScaleShift(Mat& scale, Mat& shift) const; + + /** + * @brief Returns scale and zeropoint of layers + * @param[out] scale Output scale + * @param[out] zeropoint Output zeropoint + * + * By default, @p scale is 1 and @p zeropoint is 0. + */ + virtual void getScaleZeropoint(float& scale, int& zeropoint) const; + + + /** + * @brief "Detaches" all the layers, attached to particular layer. + */ + virtual void unsetAttached(); + + virtual bool getMemoryShapes(const std::vector &inputs, + const int requiredOutputs, + std::vector &outputs, + std::vector &internals) const; + + virtual int64 getFLOPS(const std::vector &inputs, + const std::vector &outputs) const {CV_UNUSED(inputs); CV_UNUSED(outputs); return 0;} + + virtual bool updateMemoryShapes(const std::vector &inputs); + + CV_PROP String name; //!< Name of the layer instance, can be used for logging or other internal purposes. + CV_PROP String type; //!< Type name which was used for creating layer by layer factory. + CV_PROP int preferableTarget; //!< prefer target for layer forwarding + + Layer(); + explicit Layer(const LayerParams ¶ms); //!< Initializes only #name, #type and #blobs fields. + void setParamsFrom(const LayerParams ¶ms); //!< Initializes only #name, #type and #blobs fields. + virtual ~Layer(); + }; + + /** @brief This class allows to create and manipulate comprehensive artificial neural networks. + * + * Neural network is presented as directed acyclic graph (DAG), where vertices are Layer instances, + * and edges specify relationships between layers inputs and outputs. + * + * Each network layer has unique integer id and unique string name inside its network. + * LayerId can store either layer name or layer id. + * + * This class supports reference counting of its instances, i. e. copies point to the same instance. + */ + class CV_EXPORTS_W_SIMPLE Net + { + public: + + CV_WRAP Net(); //!< Default constructor. + CV_WRAP ~Net(); //!< Destructor frees the net only if there aren't references to the net anymore. + + /** @brief Create a network from Intel's Model Optimizer intermediate representation (IR). + * @param[in] xml XML configuration file with network's topology. + * @param[in] bin Binary file with trained weights. + * Networks imported from Intel's Model Optimizer are launched in Intel's Inference Engine + * backend. + */ + CV_WRAP static Net readFromModelOptimizer(const String& xml, const String& bin); + + /** @brief Create a network from Intel's Model Optimizer in-memory buffers with intermediate representation (IR). + * @param[in] bufferModelConfig buffer with model's configuration. + * @param[in] bufferWeights buffer with model's trained weights. + * @returns Net object. + */ + CV_WRAP static + Net readFromModelOptimizer(const std::vector& bufferModelConfig, const std::vector& bufferWeights); + + /** @brief Create a network from Intel's Model Optimizer in-memory buffers with intermediate representation (IR). + * @param[in] bufferModelConfigPtr buffer pointer of model's configuration. + * @param[in] bufferModelConfigSize buffer size of model's configuration. + * @param[in] bufferWeightsPtr buffer pointer of model's trained weights. + * @param[in] bufferWeightsSize buffer size of model's trained weights. + * @returns Net object. + */ + static + Net readFromModelOptimizer(const uchar* bufferModelConfigPtr, size_t bufferModelConfigSize, + const uchar* bufferWeightsPtr, size_t bufferWeightsSize); + + /** Returns true if there are no layers in the network. */ + CV_WRAP bool empty() const; + + /** @brief Dump net to String + * @returns String with structure, hyperparameters, backend, target and fusion + * Call method after setInput(). To see correct backend, target and fusion run after forward(). + */ + CV_WRAP String dump(); + /** @brief Dump net structure, hyperparameters, backend, target and fusion to dot file + * @param path path to output file with .dot extension + * @see dump() + */ + CV_WRAP void dumpToFile(const String& path); + /** @brief Adds new layer to the net. + * @param name unique name of the adding layer. + * @param type typename of the adding layer (type must be registered in LayerRegister). + * @param dtype datatype of output blobs. + * @param params parameters which will be used to initialize the creating layer. + * @returns unique identifier of created layer, or -1 if a failure will happen. + */ + int addLayer(const String &name, const String &type, const int &dtype, LayerParams ¶ms); + + /** @overload Datatype of output blobs set to default CV_32F */ + int addLayer(const String &name, const String &type, LayerParams ¶ms); + + /** @brief Adds new layer and connects its first input to the first output of previously added layer. + * @see addLayer() + */ + int addLayerToPrev(const String &name, const String &type, const int &dtype, LayerParams ¶ms); + + /** @overload */ + int addLayerToPrev(const String &name, const String &type, LayerParams ¶ms); + + /** @brief Converts string name of the layer to the integer identifier. + * @returns id of the layer, or -1 if the layer wasn't found. + */ + CV_WRAP int getLayerId(const String &layer) const; + + CV_WRAP std::vector getLayerNames() const; + + /** @brief Container for strings and integers. + * + * @deprecated Use getLayerId() with int result. + */ + typedef DictValue LayerId; + + /** @brief Returns pointer to layer with specified id or name which the network use. */ + CV_WRAP Ptr getLayer(int layerId) const; + /** @overload + * @deprecated Use int getLayerId(const String &layer) + */ + CV_WRAP inline Ptr getLayer(const String& layerName) const { return getLayer(getLayerId(layerName)); } + /** @overload + * @deprecated to be removed + */ + CV_WRAP Ptr getLayer(const LayerId& layerId) const; + + /** @brief Returns pointers to input layers of specific layer. */ + std::vector > getLayerInputs(int layerId) const; // FIXIT: CV_WRAP + + /** @brief Connects output of the first layer to input of the second layer. + * @param outPin descriptor of the first layer output. + * @param inpPin descriptor of the second layer input. + * + * Descriptors have the following template <layer_name>[.input_number]: + * - the first part of the template layer_name is string name of the added layer. + * If this part is empty then the network input pseudo layer will be used; + * - the second optional part of the template input_number + * is either number of the layer input, either label one. + * If this part is omitted then the first layer input will be used. + * + * @see setNetInputs(), Layer::inputNameToIndex(), Layer::outputNameToIndex() + */ + CV_WRAP void connect(String outPin, String inpPin); + + /** @brief Connects #@p outNum output of the first layer to #@p inNum input of the second layer. + * @param outLayerId identifier of the first layer + * @param outNum number of the first layer output + * @param inpLayerId identifier of the second layer + * @param inpNum number of the second layer input + */ + void connect(int outLayerId, int outNum, int inpLayerId, int inpNum); + + /** @brief Registers network output with name + * + * Function may create additional 'Identity' layer. + * + * @param outputName identifier of the output + * @param layerId identifier of the second layer + * @param outputPort number of the second layer input + * + * @returns index of bound layer (the same as layerId or newly created) + */ + int registerOutput(const std::string& outputName, int layerId, int outputPort); + + /** @brief Sets outputs names of the network input pseudo layer. + * + * Each net always has special own the network input pseudo layer with id=0. + * This layer stores the user blobs only and don't make any computations. + * In fact, this layer provides the only way to pass user data into the network. + * As any other layer, this layer can label its outputs and this function provides an easy way to do this. + */ + CV_WRAP void setInputsNames(const std::vector &inputBlobNames); + + /** @brief Specify shape of network input. + */ + CV_WRAP void setInputShape(const String &inputName, const MatShape& shape); + + /** @brief Runs forward pass to compute output of layer with name @p outputName. + * @param outputName name for layer which output is needed to get + * @return blob for first output of specified layer. + * @details By default runs forward pass for the whole network. + */ + CV_WRAP Mat forward(const String& outputName = String()); + + /** @brief Runs forward pass to compute output of layer with name @p outputName. + * @param outputName name for layer which output is needed to get + * @details By default runs forward pass for the whole network. + * + * This is an asynchronous version of forward(const String&). + * dnn::DNN_BACKEND_INFERENCE_ENGINE backend is required. + */ + CV_WRAP AsyncArray forwardAsync(const String& outputName = String()); + + /** @brief Runs forward pass to compute output of layer with name @p outputName. + * @param outputBlobs contains all output blobs for specified layer. + * @param outputName name for layer which output is needed to get + * @details If @p outputName is empty, runs forward pass for the whole network. + */ + CV_WRAP void forward(OutputArrayOfArrays outputBlobs, const String& outputName = String()); + + /** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames. + * @param outputBlobs contains blobs for first outputs of specified layers. + * @param outBlobNames names for layers which outputs are needed to get + */ + CV_WRAP void forward(OutputArrayOfArrays outputBlobs, + const std::vector& outBlobNames); + + /** @brief Runs forward pass to compute outputs of layers listed in @p outBlobNames. + * @param outputBlobs contains all output blobs for each layer specified in @p outBlobNames. + * @param outBlobNames names for layers which outputs are needed to get + */ + CV_WRAP_AS(forwardAndRetrieve) void forward(CV_OUT std::vector >& outputBlobs, + const std::vector& outBlobNames); + + /** @brief Returns a quantized Net from a floating-point Net. + * @param calibData Calibration data to compute the quantization parameters. + * @param inputsDtype Datatype of quantized net's inputs. Can be CV_32F or CV_8S. + * @param outputsDtype Datatype of quantized net's outputs. Can be CV_32F or CV_8S. + * @param perChannel Quantization granularity of quantized Net. The default is true, that means quantize model + * in per-channel way (channel-wise). Set it false to quantize model in per-tensor way (or tensor-wise). + */ + CV_WRAP Net quantize(InputArrayOfArrays calibData, int inputsDtype, int outputsDtype, bool perChannel=true); + + /** @brief Returns input scale and zeropoint for a quantized Net. + * @param scales output parameter for returning input scales. + * @param zeropoints output parameter for returning input zeropoints. + */ + CV_WRAP void getInputDetails(CV_OUT std::vector& scales, CV_OUT std::vector& zeropoints) const; + + /** @brief Returns output scale and zeropoint for a quantized Net. + * @param scales output parameter for returning output scales. + * @param zeropoints output parameter for returning output zeropoints. + */ + CV_WRAP void getOutputDetails(CV_OUT std::vector& scales, CV_OUT std::vector& zeropoints) const; + + /** + * @brief Compile Halide layers. + * @param[in] scheduler Path to YAML file with scheduling directives. + * @see setPreferableBackend + * + * Schedule layers that support Halide backend. Then compile them for + * specific target. For layers that not represented in scheduling file + * or if no manual scheduling used at all, automatic scheduling will be applied. + */ + CV_WRAP void setHalideScheduler(const String& scheduler); + + /** + * @brief Ask network to use specific computation backend where it supported. + * @param[in] backendId backend identifier. + * @see Backend + */ + CV_WRAP void setPreferableBackend(int backendId); + + /** + * @brief Ask network to make computations on specific target device. + * @param[in] targetId target identifier. + * @see Target + * + * List of supported combinations backend / target: + * | | DNN_BACKEND_OPENCV | DNN_BACKEND_INFERENCE_ENGINE | DNN_BACKEND_HALIDE | DNN_BACKEND_CUDA | + * |------------------------|--------------------|------------------------------|--------------------|-------------------| + * | DNN_TARGET_CPU | + | + | + | | + * | DNN_TARGET_OPENCL | + | + | + | | + * | DNN_TARGET_OPENCL_FP16 | + | + | | | + * | DNN_TARGET_MYRIAD | | + | | | + * | DNN_TARGET_FPGA | | + | | | + * | DNN_TARGET_CUDA | | | | + | + * | DNN_TARGET_CUDA_FP16 | | | | + | + * | DNN_TARGET_HDDL | | + | | | + */ + CV_WRAP void setPreferableTarget(int targetId); + + /** @brief Sets the new input value for the network + * @param blob A new blob. Should have CV_32F or CV_8U depth. + * @param name A name of input layer. + * @param scalefactor An optional normalization scale. + * @param mean An optional mean subtraction values. + * @see connect(String, String) to know format of the descriptor. + * + * If scale or mean values are specified, a final input blob is computed + * as: + * \f[input(n,c,h,w) = scalefactor \times (blob(n,c,h,w) - mean_c)\f] + */ + CV_WRAP void setInput(InputArray blob, const String& name = "", + double scalefactor = 1.0, const Scalar& mean = Scalar()); + + /** @brief Sets the new value for the learned param of the layer. + * @param layer name or id of the layer. + * @param numParam index of the layer parameter in the Layer::blobs array. + * @param blob the new value. + * @see Layer::blobs + * @note If shape of the new blob differs from the previous shape, + * then the following forward pass may fail. + */ + CV_WRAP void setParam(int layer, int numParam, const Mat &blob); + CV_WRAP inline void setParam(const String& layerName, int numParam, const Mat &blob) { return setParam(getLayerId(layerName), numParam, blob); } + + /** @brief Returns parameter blob of the layer. + * @param layer name or id of the layer. + * @param numParam index of the layer parameter in the Layer::blobs array. + * @see Layer::blobs + */ + CV_WRAP Mat getParam(int layer, int numParam = 0) const; + CV_WRAP inline Mat getParam(const String& layerName, int numParam = 0) const { return getParam(getLayerId(layerName), numParam); } + + /** @brief Returns indexes of layers with unconnected outputs. + * + * FIXIT: Rework API to registerOutput() approach, deprecate this call + */ + CV_WRAP std::vector getUnconnectedOutLayers() const; + + /** @brief Returns names of layers with unconnected outputs. + * + * FIXIT: Rework API to registerOutput() approach, deprecate this call + */ + CV_WRAP std::vector getUnconnectedOutLayersNames() const; + + /** @brief Returns input and output shapes for all layers in loaded model; + * preliminary inferencing isn't necessary. + * @param netInputShapes shapes for all input blobs in net input layer. + * @param layersIds output parameter for layer IDs. + * @param inLayersShapes output parameter for input layers shapes; + * order is the same as in layersIds + * @param outLayersShapes output parameter for output layers shapes; + * order is the same as in layersIds + */ + CV_WRAP void getLayersShapes(const std::vector& netInputShapes, + CV_OUT std::vector& layersIds, + CV_OUT std::vector >& inLayersShapes, + CV_OUT std::vector >& outLayersShapes) const; + + /** @overload */ + CV_WRAP void getLayersShapes(const MatShape& netInputShape, + CV_OUT std::vector& layersIds, + CV_OUT std::vector >& inLayersShapes, + CV_OUT std::vector >& outLayersShapes) const; + + /** @brief Returns input and output shapes for layer with specified + * id in loaded model; preliminary inferencing isn't necessary. + * @param netInputShape shape input blob in net input layer. + * @param layerId id for layer. + * @param inLayerShapes output parameter for input layers shapes; + * order is the same as in layersIds + * @param outLayerShapes output parameter for output layers shapes; + * order is the same as in layersIds + */ + void getLayerShapes(const MatShape& netInputShape, + const int layerId, + CV_OUT std::vector& inLayerShapes, + CV_OUT std::vector& outLayerShapes) const; // FIXIT: CV_WRAP + + /** @overload */ + void getLayerShapes(const std::vector& netInputShapes, + const int layerId, + CV_OUT std::vector& inLayerShapes, + CV_OUT std::vector& outLayerShapes) const; // FIXIT: CV_WRAP + + /** @brief Computes FLOP for whole loaded model with specified input shapes. + * @param netInputShapes vector of shapes for all net inputs. + * @returns computed FLOP. + */ + CV_WRAP int64 getFLOPS(const std::vector& netInputShapes) const; + /** @overload */ + CV_WRAP int64 getFLOPS(const MatShape& netInputShape) const; + /** @overload */ + CV_WRAP int64 getFLOPS(const int layerId, + const std::vector& netInputShapes) const; + /** @overload */ + CV_WRAP int64 getFLOPS(const int layerId, + const MatShape& netInputShape) const; + + /** @brief Returns list of types for layer used in model. + * @param layersTypes output parameter for returning types. + */ + CV_WRAP void getLayerTypes(CV_OUT std::vector& layersTypes) const; + + /** @brief Returns count of layers of specified type. + * @param layerType type. + * @returns count of layers + */ + CV_WRAP int getLayersCount(const String& layerType) const; + + /** @brief Computes bytes number which are required to store + * all weights and intermediate blobs for model. + * @param netInputShapes vector of shapes for all net inputs. + * @param weights output parameter to store resulting bytes for weights. + * @param blobs output parameter to store resulting bytes for intermediate blobs. + */ + void getMemoryConsumption(const std::vector& netInputShapes, + CV_OUT size_t& weights, CV_OUT size_t& blobs) const; // FIXIT: CV_WRAP + /** @overload */ + CV_WRAP void getMemoryConsumption(const MatShape& netInputShape, + CV_OUT size_t& weights, CV_OUT size_t& blobs) const; + /** @overload */ + CV_WRAP void getMemoryConsumption(const int layerId, + const std::vector& netInputShapes, + CV_OUT size_t& weights, CV_OUT size_t& blobs) const; + /** @overload */ + CV_WRAP void getMemoryConsumption(const int layerId, + const MatShape& netInputShape, + CV_OUT size_t& weights, CV_OUT size_t& blobs) const; + + /** @brief Computes bytes number which are required to store + * all weights and intermediate blobs for each layer. + * @param netInputShapes vector of shapes for all net inputs. + * @param layerIds output vector to save layer IDs. + * @param weights output parameter to store resulting bytes for weights. + * @param blobs output parameter to store resulting bytes for intermediate blobs. + */ + void getMemoryConsumption(const std::vector& netInputShapes, + CV_OUT std::vector& layerIds, + CV_OUT std::vector& weights, + CV_OUT std::vector& blobs) const; // FIXIT: CV_WRAP + /** @overload */ + void getMemoryConsumption(const MatShape& netInputShape, + CV_OUT std::vector& layerIds, + CV_OUT std::vector& weights, + CV_OUT std::vector& blobs) const; // FIXIT: CV_WRAP + + /** @brief Enables or disables layer fusion in the network. + * @param fusion true to enable the fusion, false to disable. The fusion is enabled by default. + */ + CV_WRAP void enableFusion(bool fusion); + + /** @brief Enables or disables the Winograd compute branch. The Winograd compute branch can speed up + * 3x3 Convolution at a small loss of accuracy. + * @param useWinograd true to enable the Winograd compute branch. The default is true. + */ + CV_WRAP void enableWinograd(bool useWinograd); + + /** @brief Returns overall time for inference and timings (in ticks) for layers. + * + * Indexes in returned vector correspond to layers ids. Some layers can be fused with others, + * in this case zero ticks count will be return for that skipped layers. Supported by DNN_BACKEND_OPENCV on DNN_TARGET_CPU only. + * + * @param[out] timings vector for tick timings for all layers. + * @return overall ticks for model inference. + */ + CV_WRAP int64 getPerfProfile(CV_OUT std::vector& timings); + + + struct Impl; + inline Impl* getImpl() const { return impl.get(); } + inline Impl& getImplRef() const { CV_DbgAssert(impl); return *impl.get(); } + friend class accessor::DnnNetAccessor; + protected: + Ptr impl; + }; + + /** @brief Reads a network model stored in Darknet model files. + * @param cfgFile path to the .cfg file with text description of the network architecture. + * @param darknetModel path to the .weights file with learned network. + * @returns Network object that ready to do forward, throw an exception in failure cases. + */ + CV_EXPORTS_W Net readNetFromDarknet(const String &cfgFile, const String &darknetModel = String()); + + /** @brief Reads a network model stored in Darknet model files. + * @param bufferCfg A buffer contains a content of .cfg file with text description of the network architecture. + * @param bufferModel A buffer contains a content of .weights file with learned network. + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromDarknet(const std::vector& bufferCfg, + const std::vector& bufferModel = std::vector()); + + /** @brief Reads a network model stored in Darknet model files. + * @param bufferCfg A buffer contains a content of .cfg file with text description of the network architecture. + * @param lenCfg Number of bytes to read from bufferCfg + * @param bufferModel A buffer contains a content of .weights file with learned network. + * @param lenModel Number of bytes to read from bufferModel + * @returns Net object. + */ + CV_EXPORTS Net readNetFromDarknet(const char *bufferCfg, size_t lenCfg, + const char *bufferModel = NULL, size_t lenModel = 0); + + /** @brief Reads a network model stored in Caffe framework's format. + * @param prototxt path to the .prototxt file with text description of the network architecture. + * @param caffeModel path to the .caffemodel file with learned network. + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromCaffe(const String &prototxt, const String &caffeModel = String()); + + /** @brief Reads a network model stored in Caffe model in memory. + * @param bufferProto buffer containing the content of the .prototxt file + * @param bufferModel buffer containing the content of the .caffemodel file + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromCaffe(const std::vector& bufferProto, + const std::vector& bufferModel = std::vector()); + + /** @brief Reads a network model stored in Caffe model in memory. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + * @param bufferProto buffer containing the content of the .prototxt file + * @param lenProto length of bufferProto + * @param bufferModel buffer containing the content of the .caffemodel file + * @param lenModel length of bufferModel + * @returns Net object. + */ + CV_EXPORTS Net readNetFromCaffe(const char *bufferProto, size_t lenProto, + const char *bufferModel = NULL, size_t lenModel = 0); + + /** @brief Reads a network model stored in TensorFlow framework's format. + * @param model path to the .pb file with binary protobuf description of the network architecture + * @param config path to the .pbtxt file that contains text graph definition in protobuf format. + * Resulting Net object is built by text graph using weights from a binary one that + * let us make it more flexible. + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromTensorflow(const String &model, const String &config = String()); + + /** @brief Reads a network model stored in TensorFlow framework's format. + * @param bufferModel buffer containing the content of the pb file + * @param bufferConfig buffer containing the content of the pbtxt file + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromTensorflow(const std::vector& bufferModel, + const std::vector& bufferConfig = std::vector()); + + /** @brief Reads a network model stored in TensorFlow framework's format. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + * @param bufferModel buffer containing the content of the pb file + * @param lenModel length of bufferModel + * @param bufferConfig buffer containing the content of the pbtxt file + * @param lenConfig length of bufferConfig + */ + CV_EXPORTS Net readNetFromTensorflow(const char *bufferModel, size_t lenModel, + const char *bufferConfig = NULL, size_t lenConfig = 0); + + /** @brief Reads a network model stored in TFLite framework's format. + * @param model path to the .tflite file with binary flatbuffers description of the network architecture + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromTFLite(const String &model); + + /** @brief Reads a network model stored in TFLite framework's format. + * @param bufferModel buffer containing the content of the tflite file + * @returns Net object. + */ + CV_EXPORTS_W Net readNetFromTFLite(const std::vector& bufferModel); + + /** @brief Reads a network model stored in TFLite framework's format. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + * @param bufferModel buffer containing the content of the tflite file + * @param lenModel length of bufferModel + */ + CV_EXPORTS Net readNetFromTFLite(const char *bufferModel, size_t lenModel); + + /** + * @brief Reads a network model stored in Torch7 framework's format. + * @param model path to the file, dumped from Torch by using torch.save() function. + * @param isBinary specifies whether the network was serialized in ascii mode or binary. + * @param evaluate specifies testing phase of network. If true, it's similar to evaluate() method in Torch. + * @returns Net object. + * + * @note Ascii mode of Torch serializer is more preferable, because binary mode extensively use `long` type of C language, + * which has various bit-length on different systems. + * + * The loading file must contain serialized nn.Module object + * with importing network. Try to eliminate a custom objects from serialazing data to avoid importing errors. + * + * List of supported layers (i.e. object instances derived from Torch nn.Module class): + * - nn.Sequential + * - nn.Parallel + * - nn.Concat + * - nn.Linear + * - nn.SpatialConvolution + * - nn.SpatialMaxPooling, nn.SpatialAveragePooling + * - nn.ReLU, nn.TanH, nn.Sigmoid + * - nn.Reshape + * - nn.SoftMax, nn.LogSoftMax + * + * Also some equivalents of these classes from cunn, cudnn, and fbcunn may be successfully imported. + */ + CV_EXPORTS_W Net readNetFromTorch(const String &model, bool isBinary = true, bool evaluate = true); + + /** + * @brief Read deep learning network represented in one of the supported formats. + * @param[in] model Binary file contains trained weights. The following file + * extensions are expected for models from different frameworks: + * * `*.caffemodel` (Caffe, http://caffe.berkeleyvision.org/) + * * `*.pb` (TensorFlow, https://www.tensorflow.org/) + * * `*.t7` | `*.net` (Torch, http://torch.ch/) + * * `*.weights` (Darknet, https://pjreddie.com/darknet/) + * * `*.bin` | `*.onnx` (OpenVINO, https://software.intel.com/openvino-toolkit) + * * `*.onnx` (ONNX, https://onnx.ai/) + * @param[in] config Text file contains network configuration. It could be a + * file with the following extensions: + * * `*.prototxt` (Caffe, http://caffe.berkeleyvision.org/) + * * `*.pbtxt` (TensorFlow, https://www.tensorflow.org/) + * * `*.cfg` (Darknet, https://pjreddie.com/darknet/) + * * `*.xml` (OpenVINO, https://software.intel.com/openvino-toolkit) + * @param[in] framework Explicit framework name tag to determine a format. + * @returns Net object. + * + * This function automatically detects an origin framework of trained model + * and calls an appropriate function such @ref readNetFromCaffe, @ref readNetFromTensorflow, + * @ref readNetFromTorch or @ref readNetFromDarknet. An order of @p model and @p config + * arguments does not matter. + */ + CV_EXPORTS_W Net readNet(const String& model, const String& config = "", const String& framework = ""); + + /** + * @brief Read deep learning network represented in one of the supported formats. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + * @param[in] framework Name of origin framework. + * @param[in] bufferModel A buffer with a content of binary file with weights + * @param[in] bufferConfig A buffer with a content of text file contains network configuration. + * @returns Net object. + */ + CV_EXPORTS_W Net readNet(const String& framework, const std::vector& bufferModel, + const std::vector& bufferConfig = std::vector()); + + /** @brief Loads blob which was serialized as torch.Tensor object of Torch7 framework. + * @warning This function has the same limitations as readNetFromTorch(). + */ + CV_EXPORTS_W Mat readTorchBlob(const String &filename, bool isBinary = true); + + /** @brief Load a network from Intel's Model Optimizer intermediate representation. + * @param[in] xml XML configuration file with network's topology. + * @param[in] bin Binary file with trained weights. + * @returns Net object. + * Networks imported from Intel's Model Optimizer are launched in Intel's Inference Engine + * backend. + */ + CV_EXPORTS_W + Net readNetFromModelOptimizer(const String &xml, const String &bin = ""); + + /** @brief Load a network from Intel's Model Optimizer intermediate representation. + * @param[in] bufferModelConfig Buffer contains XML configuration with network's topology. + * @param[in] bufferWeights Buffer contains binary data with trained weights. + * @returns Net object. + * Networks imported from Intel's Model Optimizer are launched in Intel's Inference Engine + * backend. + */ + CV_EXPORTS_W + Net readNetFromModelOptimizer(const std::vector& bufferModelConfig, const std::vector& bufferWeights); + + /** @brief Load a network from Intel's Model Optimizer intermediate representation. + * @param[in] bufferModelConfigPtr Pointer to buffer which contains XML configuration with network's topology. + * @param[in] bufferModelConfigSize Binary size of XML configuration data. + * @param[in] bufferWeightsPtr Pointer to buffer which contains binary data with trained weights. + * @param[in] bufferWeightsSize Binary size of trained weights data. + * @returns Net object. + * Networks imported from Intel's Model Optimizer are launched in Intel's Inference Engine + * backend. + */ + CV_EXPORTS + Net readNetFromModelOptimizer(const uchar* bufferModelConfigPtr, size_t bufferModelConfigSize, + const uchar* bufferWeightsPtr, size_t bufferWeightsSize); + + /** @brief Reads a network model ONNX. + * @param onnxFile path to the .onnx file with text description of the network architecture. + * @returns Network object that ready to do forward, throw an exception in failure cases. + */ + CV_EXPORTS_W Net readNetFromONNX(const String &onnxFile); + + /** @brief Reads a network model from ONNX + * in-memory buffer. + * @param buffer memory address of the first byte of the buffer. + * @param sizeBuffer size of the buffer. + * @returns Network object that ready to do forward, throw an exception + * in failure cases. + */ + CV_EXPORTS Net readNetFromONNX(const char* buffer, size_t sizeBuffer); + + /** @brief Reads a network model from ONNX + * in-memory buffer. + * @param buffer in-memory buffer that stores the ONNX model bytes. + * @returns Network object that ready to do forward, throw an exception + * in failure cases. + */ + CV_EXPORTS_W Net readNetFromONNX(const std::vector& buffer); + + /** @brief Creates blob from .pb file. + * @param path to the .pb file with input tensor. + * @returns Mat. + */ + CV_EXPORTS_W Mat readTensorFromONNX(const String& path); + + /** @brief Creates 4-dimensional blob from image. Optionally resizes and crops @p image from center, + * subtract @p mean values, scales values by @p scalefactor, swap Blue and Red channels. + * @param image input image (with 1-, 3- or 4-channels). + * @param scalefactor multiplier for @p images values. + * @param size spatial size for output image + * @param mean scalar with mean values which are subtracted from channels. Values are intended + * to be in (mean-R, mean-G, mean-B) order if @p image has BGR ordering and @p swapRB is true. + * @param swapRB flag which indicates that swap first and last channels + * in 3-channel image is necessary. + * @param crop flag which indicates whether image will be cropped after resize or not + * @param ddepth Depth of output blob. Choose CV_32F or CV_8U. + * @details if @p crop is true, input image is resized so one side after resize is equal to corresponding + * dimension in @p size and another one is equal or larger. Then, crop from the center is performed. + * If @p crop is false, direct resize without cropping and preserving aspect ratio is performed. + * @returns 4-dimensional Mat with NCHW dimensions order. + * + * @note + * The order and usage of `scalefactor` and `mean` are (input - mean) * scalefactor. + */ + CV_EXPORTS_W Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size& size = Size(), + const Scalar& mean = Scalar(), bool swapRB=false, bool crop=false, + int ddepth=CV_32F); + + /** @brief Creates 4-dimensional blob from image. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + */ + CV_EXPORTS void blobFromImage(InputArray image, OutputArray blob, double scalefactor=1.0, + const Size& size = Size(), const Scalar& mean = Scalar(), + bool swapRB=false, bool crop=false, int ddepth=CV_32F); + + + /** @brief Creates 4-dimensional blob from series of images. Optionally resizes and + * crops @p images from center, subtract @p mean values, scales values by @p scalefactor, + * swap Blue and Red channels. + * @param images input images (all with 1-, 3- or 4-channels). + * @param size spatial size for output image + * @param mean scalar with mean values which are subtracted from channels. Values are intended + * to be in (mean-R, mean-G, mean-B) order if @p image has BGR ordering and @p swapRB is true. + * @param scalefactor multiplier for @p images values. + * @param swapRB flag which indicates that swap first and last channels + * in 3-channel image is necessary. + * @param crop flag which indicates whether image will be cropped after resize or not + * @param ddepth Depth of output blob. Choose CV_32F or CV_8U. + * @details if @p crop is true, input image is resized so one side after resize is equal to corresponding + * dimension in @p size and another one is equal or larger. Then, crop from the center is performed. + * If @p crop is false, direct resize without cropping and preserving aspect ratio is performed. + * @returns 4-dimensional Mat with NCHW dimensions order. + * + * @note + * The order and usage of `scalefactor` and `mean` are (input - mean) * scalefactor. + */ + CV_EXPORTS_W Mat blobFromImages(InputArrayOfArrays images, double scalefactor=1.0, + Size size = Size(), const Scalar& mean = Scalar(), bool swapRB=false, bool crop=false, + int ddepth=CV_32F); + + /** @brief Creates 4-dimensional blob from series of images. + * @details This is an overloaded member function, provided for convenience. + * It differs from the above function only in what argument(s) it accepts. + */ + CV_EXPORTS void blobFromImages(InputArrayOfArrays images, OutputArray blob, + double scalefactor=1.0, Size size = Size(), + const Scalar& mean = Scalar(), bool swapRB=false, bool crop=false, + int ddepth=CV_32F); + + /** + * @brief Enum of image processing mode. + * To facilitate the specialization pre-processing requirements of the dnn model. + * For example, the `letter box` often used in the Yolo series of models. + * @see Image2BlobParams + */ + enum ImagePaddingMode + { + DNN_PMODE_NULL = 0, // !< Default. Resize to required input size without extra processing. + DNN_PMODE_CROP_CENTER = 1, // !< Image will be cropped after resize. + DNN_PMODE_LETTERBOX = 2, // !< Resize image to the desired size while preserving the aspect ratio of original image. + }; + + /** @brief Processing params of image to blob. + * + * It includes all possible image processing operations and corresponding parameters. + * + * @see blobFromImageWithParams + * + * @note + * The order and usage of `scalefactor` and `mean` are (input - mean) * scalefactor. + * The order and usage of `scalefactor`, `size`, `mean`, `swapRB`, and `ddepth` are consistent + * with the function of @ref blobFromImage. + */ + struct CV_EXPORTS_W_SIMPLE Image2BlobParams + { + CV_WRAP Image2BlobParams(); + CV_WRAP Image2BlobParams(const Scalar& scalefactor, const Size& size = Size(), const Scalar& mean = Scalar(), + bool swapRB = false, int ddepth = CV_32F, DataLayout datalayout = DNN_LAYOUT_NCHW, + ImagePaddingMode mode = DNN_PMODE_NULL); + + CV_PROP_RW Scalar scalefactor; //!< scalefactor multiplier for input image values. + CV_PROP_RW Size size; //!< Spatial size for output image. + CV_PROP_RW Scalar mean; //!< Scalar with mean values which are subtracted from channels. + CV_PROP_RW bool swapRB; //!< Flag which indicates that swap first and last channels + CV_PROP_RW int ddepth; //!< Depth of output blob. Choose CV_32F or CV_8U. + CV_PROP_RW DataLayout datalayout; //!< Order of output dimensions. Choose DNN_LAYOUT_NCHW or DNN_LAYOUT_NHWC. + CV_PROP_RW ImagePaddingMode paddingmode; //!< Image padding mode. @see ImagePaddingMode. + }; + + /** @brief Creates 4-dimensional blob from image with given params. + * + * @details This function is an extension of @ref blobFromImage to meet more image preprocess needs. + * Given input image and preprocessing parameters, and function outputs the blob. + * + * @param image input image (all with 1-, 3- or 4-channels). + * @param param struct of Image2BlobParams, contains all parameters needed by processing of image to blob. + * @return 4-dimensional Mat. + */ + CV_EXPORTS_W Mat blobFromImageWithParams(InputArray image, const Image2BlobParams& param = Image2BlobParams()); + + /** @overload */ + CV_EXPORTS_W void blobFromImageWithParams(InputArray image, OutputArray blob, const Image2BlobParams& param = Image2BlobParams()); + + /** @brief Creates 4-dimensional blob from series of images with given params. + * + * @details This function is an extension of @ref blobFromImages to meet more image preprocess needs. + * Given input image and preprocessing parameters, and function outputs the blob. + * + * @param images input image (all with 1-, 3- or 4-channels). + * @param param struct of Image2BlobParams, contains all parameters needed by processing of image to blob. + * @returns 4-dimensional Mat. + */ + CV_EXPORTS_W Mat blobFromImagesWithParams(InputArrayOfArrays images, const Image2BlobParams& param = Image2BlobParams()); + + /** @overload */ + CV_EXPORTS_W void blobFromImagesWithParams(InputArrayOfArrays images, OutputArray blob, const Image2BlobParams& param = Image2BlobParams()); + + /** @brief Parse a 4D blob and output the images it contains as 2D arrays through a simpler data structure + * (std::vector). + * @param[in] blob_ 4 dimensional array (images, channels, height, width) in floating point precision (CV_32F) from + * which you would like to extract the images. + * @param[out] images_ array of 2D Mat containing the images extracted from the blob in floating point precision + * (CV_32F). They are non normalized neither mean added. The number of returned images equals the first dimension + * of the blob (batch size). Every image has a number of channels equals to the second dimension of the blob (depth). + */ + CV_EXPORTS_W void imagesFromBlob(const cv::Mat& blob_, OutputArrayOfArrays images_); + + /** @brief Convert all weights of Caffe network to half precision floating point. + * @param src Path to origin model from Caffe framework contains single + * precision floating point weights (usually has `.caffemodel` extension). + * @param dst Path to destination model with updated weights. + * @param layersTypes Set of layers types which parameters will be converted. + * By default, converts only Convolutional and Fully-Connected layers' + * weights. + * + * @note Shrinked model has no origin float32 weights so it can't be used + * in origin Caffe framework anymore. However the structure of data + * is taken from NVidia's Caffe fork: https://github.com/NVIDIA/caffe. + * So the resulting model may be used there. + */ + CV_EXPORTS_W void shrinkCaffeModel(const String& src, const String& dst, + const std::vector& layersTypes = std::vector()); + + /** @brief Create a text representation for a binary network stored in protocol buffer format. + * @param[in] model A path to binary network. + * @param[in] output A path to output text file to be created. + * + * @note To reduce output file size, trained weights are not included. + */ + CV_EXPORTS_W void writeTextGraph(const String& model, const String& output); + + /** @brief Performs non maximum suppression given boxes and corresponding scores. + + * @param bboxes a set of bounding boxes to apply NMS. + * @param scores a set of corresponding confidences. + * @param score_threshold a threshold used to filter boxes by score. + * @param nms_threshold a threshold used in non maximum suppression. + * @param indices the kept indices of bboxes after NMS. + * @param eta a coefficient in adaptive threshold formula: \f$nms\_threshold_{i+1}=eta\cdot nms\_threshold_i\f$. + * @param top_k if `>0`, keep at most @p top_k picked indices. + */ + CV_EXPORTS void NMSBoxes(const std::vector& bboxes, const std::vector& scores, + const float score_threshold, const float nms_threshold, + CV_OUT std::vector& indices, + const float eta = 1.f, const int top_k = 0); + + CV_EXPORTS_W void NMSBoxes(const std::vector& bboxes, const std::vector& scores, + const float score_threshold, const float nms_threshold, + CV_OUT std::vector& indices, + const float eta = 1.f, const int top_k = 0); + + CV_EXPORTS_AS(NMSBoxesRotated) void NMSBoxes(const std::vector& bboxes, const std::vector& scores, + const float score_threshold, const float nms_threshold, + CV_OUT std::vector& indices, + const float eta = 1.f, const int top_k = 0); + + /** @brief Performs batched non maximum suppression on given boxes and corresponding scores across different classes. + + * @param bboxes a set of bounding boxes to apply NMS. + * @param scores a set of corresponding confidences. + * @param class_ids a set of corresponding class ids. Ids are integer and usually start from 0. + * @param score_threshold a threshold used to filter boxes by score. + * @param nms_threshold a threshold used in non maximum suppression. + * @param indices the kept indices of bboxes after NMS. + * @param eta a coefficient in adaptive threshold formula: \f$nms\_threshold_{i+1}=eta\cdot nms\_threshold_i\f$. + * @param top_k if `>0`, keep at most @p top_k picked indices. + */ + CV_EXPORTS void NMSBoxesBatched(const std::vector& bboxes, const std::vector& scores, const std::vector& class_ids, + const float score_threshold, const float nms_threshold, + CV_OUT std::vector& indices, + const float eta = 1.f, const int top_k = 0); + + CV_EXPORTS_W void NMSBoxesBatched(const std::vector& bboxes, const std::vector& scores, const std::vector& class_ids, + const float score_threshold, const float nms_threshold, + CV_OUT std::vector& indices, + const float eta = 1.f, const int top_k = 0); + + /** + * @brief Enum of Soft NMS methods. + * @see softNMSBoxes + */ + enum class SoftNMSMethod + { + SOFTNMS_LINEAR = 1, + SOFTNMS_GAUSSIAN = 2 + }; + + /** @brief Performs soft non maximum suppression given boxes and corresponding scores. + * Reference: https://arxiv.org/abs/1704.04503 + * @param bboxes a set of bounding boxes to apply Soft NMS. + * @param scores a set of corresponding confidences. + * @param updated_scores a set of corresponding updated confidences. + * @param score_threshold a threshold used to filter boxes by score. + * @param nms_threshold a threshold used in non maximum suppression. + * @param indices the kept indices of bboxes after NMS. + * @param top_k keep at most @p top_k picked indices. + * @param sigma parameter of Gaussian weighting. + * @param method Gaussian or linear. + * @see SoftNMSMethod + */ + CV_EXPORTS_W void softNMSBoxes(const std::vector& bboxes, + const std::vector& scores, + CV_OUT std::vector& updated_scores, + const float score_threshold, + const float nms_threshold, + CV_OUT std::vector& indices, + size_t top_k = 0, + const float sigma = 0.5, + SoftNMSMethod method = SoftNMSMethod::SOFTNMS_GAUSSIAN); + + + /** @brief This class is presented high-level API for neural networks. + * + * Model allows to set params for preprocessing input image. + * Model creates net from file with trained weights and config, + * sets preprocessing input and runs forward pass. + */ + class CV_EXPORTS_W_SIMPLE Model + { + public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + Model(); + + Model(const Model&) = default; + Model(Model&&) = default; + Model& operator=(const Model&) = default; + Model& operator=(Model&&) = default; + + /** + * @brief Create model from deep learning network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP Model(const String& model, const String& config = ""); + + /** + * @brief Create model from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP Model(const Net& network); + + /** @brief Set input size for frame. + * @param[in] size New input size. + * @note If shape of the new blob less than 0, then frame size not change. + */ + CV_WRAP Model& setInputSize(const Size& size); + + /** @overload + * @param[in] width New input width. + * @param[in] height New input height. + */ + CV_WRAP inline + Model& setInputSize(int width, int height) { return setInputSize(Size(width, height)); } + + /** @brief Set mean value for frame. + * @param[in] mean Scalar with mean values which are subtracted from channels. + */ + CV_WRAP Model& setInputMean(const Scalar& mean); + + /** @brief Set scalefactor value for frame. + * @param[in] scale Multiplier for frame values. + */ + CV_WRAP Model& setInputScale(const Scalar& scale); + + /** @brief Set flag crop for frame. + * @param[in] crop Flag which indicates whether image will be cropped after resize or not. + */ + CV_WRAP Model& setInputCrop(bool crop); + + /** @brief Set flag swapRB for frame. + * @param[in] swapRB Flag which indicates that swap first and last channels. + */ + CV_WRAP Model& setInputSwapRB(bool swapRB); + + /** @brief Set preprocessing parameters for frame. + * @param[in] size New input size. + * @param[in] mean Scalar with mean values which are subtracted from channels. + * @param[in] scale Multiplier for frame values. + * @param[in] swapRB Flag which indicates that swap first and last channels. + * @param[in] crop Flag which indicates whether image will be cropped after resize or not. + * blob(n, c, y, x) = scale * resize( frame(y, x, c) ) - mean(c) ) + */ + CV_WRAP void setInputParams(double scale = 1.0, const Size& size = Size(), + const Scalar& mean = Scalar(), bool swapRB = false, bool crop = false); + + /** @brief Given the @p input frame, create input blob, run net and return the output @p blobs. + * @param[in] frame The input image. + * @param[out] outs Allocated output blobs, which will store results of the computation. + */ + CV_WRAP void predict(InputArray frame, OutputArrayOfArrays outs) const; + + + // ============================== Net proxy methods ============================== + // Never expose methods with network implementation details, like: + // - addLayer, addLayerToPrev, connect, setInputsNames, setInputShape, setParam, getParam + // - getLayer*, getUnconnectedOutLayers, getUnconnectedOutLayersNames, getLayersShapes + // - forward* methods, setInput + + /// @sa Net::setPreferableBackend + CV_WRAP Model& setPreferableBackend(dnn::Backend backendId); + /// @sa Net::setPreferableTarget + CV_WRAP Model& setPreferableTarget(dnn::Target targetId); + + CV_DEPRECATED_EXTERNAL + operator Net&() const { return getNetwork_(); } + + //protected: - internal/tests usage only + Net& getNetwork_() const; + inline Net& getNetwork_() { return const_cast(this)->getNetwork_(); } + + struct Impl; + inline Impl* getImpl() const { return impl.get(); } + inline Impl& getImplRef() const { CV_DbgAssert(impl); return *impl.get(); } + protected: + Ptr impl; + }; + + /** @brief This class represents high-level API for classification models. + * + * ClassificationModel allows to set params for preprocessing input image. + * ClassificationModel creates net from file with trained weights and config, + * sets preprocessing input, runs forward pass and return top-1 prediction. + */ + class CV_EXPORTS_W_SIMPLE ClassificationModel : public Model + { + public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + ClassificationModel(); + + /** + * @brief Create classification model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP ClassificationModel(const String& model, const String& config = ""); + + /** + * @brief Create model from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP ClassificationModel(const Net& network); + + /** + * @brief Set enable/disable softmax post processing option. + * + * If this option is true, softmax is applied after forward inference within the classify() function + * to convert the confidences range to [0.0-1.0]. + * This function allows you to toggle this behavior. + * Please turn true when not contain softmax layer in model. + * @param[in] enable Set enable softmax post processing within the classify() function. + */ + CV_WRAP ClassificationModel& setEnableSoftmaxPostProcessing(bool enable); + + /** + * @brief Get enable/disable softmax post processing option. + * + * This option defaults to false, softmax post processing is not applied within the classify() function. + */ + CV_WRAP bool getEnableSoftmaxPostProcessing() const; + + /** @brief Given the @p input frame, create input blob, run net and return top-1 prediction. + * @param[in] frame The input image. + */ + std::pair classify(InputArray frame); + + /** @overload */ + CV_WRAP void classify(InputArray frame, CV_OUT int& classId, CV_OUT float& conf); + }; + + /** @brief This class represents high-level API for keypoints models + * + * KeypointsModel allows to set params for preprocessing input image. + * KeypointsModel creates net from file with trained weights and config, + * sets preprocessing input, runs forward pass and returns the x and y coordinates of each detected keypoint + */ + class CV_EXPORTS_W_SIMPLE KeypointsModel: public Model + { + public: + /** + * @brief Create keypoints model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP KeypointsModel(const String& model, const String& config = ""); + + /** + * @brief Create model from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP KeypointsModel(const Net& network); + + /** @brief Given the @p input frame, create input blob, run net + * @param[in] frame The input image. + * @param thresh minimum confidence threshold to select a keypoint + * @returns a vector holding the x and y coordinates of each detected keypoint + * + */ + CV_WRAP std::vector estimate(InputArray frame, float thresh=0.5); + }; + + /** @brief This class represents high-level API for segmentation models + * + * SegmentationModel allows to set params for preprocessing input image. + * SegmentationModel creates net from file with trained weights and config, + * sets preprocessing input, runs forward pass and returns the class prediction for each pixel. + */ + class CV_EXPORTS_W_SIMPLE SegmentationModel: public Model + { + public: + /** + * @brief Create segmentation model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP SegmentationModel(const String& model, const String& config = ""); + + /** + * @brief Create model from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP SegmentationModel(const Net& network); + + /** @brief Given the @p input frame, create input blob, run net + * @param[in] frame The input image. + * @param[out] mask Allocated class prediction for each pixel + */ + CV_WRAP void segment(InputArray frame, OutputArray mask); + }; + + /** @brief This class represents high-level API for object detection networks. + * + * DetectionModel allows to set params for preprocessing input image. + * DetectionModel creates net from file with trained weights and config, + * sets preprocessing input, runs forward pass and return result detections. + * For DetectionModel SSD, Faster R-CNN, YOLO topologies are supported. + */ + class CV_EXPORTS_W_SIMPLE DetectionModel : public Model + { + public: + /** + * @brief Create detection model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP DetectionModel(const String& model, const String& config = ""); + + /** + * @brief Create model from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP DetectionModel(const Net& network); + + CV_DEPRECATED_EXTERNAL // avoid using in C++ code (need to fix bindings first) + DetectionModel(); + + /** + * @brief nmsAcrossClasses defaults to false, + * such that when non max suppression is used during the detect() function, it will do so per-class. + * This function allows you to toggle this behaviour. + * @param[in] value The new value for nmsAcrossClasses + */ + CV_WRAP DetectionModel& setNmsAcrossClasses(bool value); + + /** + * @brief Getter for nmsAcrossClasses. This variable defaults to false, + * such that when non max suppression is used during the detect() function, it will do so only per-class + */ + CV_WRAP bool getNmsAcrossClasses(); + + /** @brief Given the @p input frame, create input blob, run net and return result detections. + * @param[in] frame The input image. + * @param[out] classIds Class indexes in result detection. + * @param[out] confidences A set of corresponding confidences. + * @param[out] boxes A set of bounding boxes. + * @param[in] confThreshold A threshold used to filter boxes by confidences. + * @param[in] nmsThreshold A threshold used in non maximum suppression. + */ + CV_WRAP void detect(InputArray frame, CV_OUT std::vector& classIds, + CV_OUT std::vector& confidences, CV_OUT std::vector& boxes, + float confThreshold = 0.5f, float nmsThreshold = 0.0f); + }; + + +/** @brief This class represents high-level API for text recognition networks. + * + * TextRecognitionModel allows to set params for preprocessing input image. + * TextRecognitionModel creates net from file with trained weights and config, + * sets preprocessing input, runs forward pass and return recognition result. + * For TextRecognitionModel, CRNN-CTC is supported. + */ +class CV_EXPORTS_W_SIMPLE TextRecognitionModel : public Model +{ +public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + TextRecognitionModel(); + + /** + * @brief Create Text Recognition model from deep learning network + * Call setDecodeType() and setVocabulary() after constructor to initialize the decoding method + * @param[in] network Net object + */ + CV_WRAP TextRecognitionModel(const Net& network); + + /** + * @brief Create text recognition model from network represented in one of the supported formats + * Call setDecodeType() and setVocabulary() after constructor to initialize the decoding method + * @param[in] model Binary file contains trained weights + * @param[in] config Text file contains network configuration + */ + CV_WRAP inline + TextRecognitionModel(const std::string& model, const std::string& config = "") + : TextRecognitionModel(readNet(model, config)) { /* nothing */ } + + /** + * @brief Set the decoding method of translating the network output into string + * @param[in] decodeType The decoding method of translating the network output into string, currently supported type: + * - `"CTC-greedy"` greedy decoding for the output of CTC-based methods + * - `"CTC-prefix-beam-search"` Prefix beam search decoding for the output of CTC-based methods + */ + CV_WRAP + TextRecognitionModel& setDecodeType(const std::string& decodeType); + + /** + * @brief Get the decoding method + * @return the decoding method + */ + CV_WRAP + const std::string& getDecodeType() const; + + /** + * @brief Set the decoding method options for `"CTC-prefix-beam-search"` decode usage + * @param[in] beamSize Beam size for search + * @param[in] vocPruneSize Parameter to optimize big vocabulary search, + * only take top @p vocPruneSize tokens in each search step, @p vocPruneSize <= 0 stands for disable this prune. + */ + CV_WRAP + TextRecognitionModel& setDecodeOptsCTCPrefixBeamSearch(int beamSize, int vocPruneSize = 0); + + /** + * @brief Set the vocabulary for recognition. + * @param[in] vocabulary the associated vocabulary of the network. + */ + CV_WRAP + TextRecognitionModel& setVocabulary(const std::vector& vocabulary); + + /** + * @brief Get the vocabulary for recognition. + * @return vocabulary the associated vocabulary + */ + CV_WRAP + const std::vector& getVocabulary() const; + + /** + * @brief Given the @p input frame, create input blob, run net and return recognition result + * @param[in] frame The input image + * @return The text recognition result + */ + CV_WRAP + std::string recognize(InputArray frame) const; + + /** + * @brief Given the @p input frame, create input blob, run net and return recognition result + * @param[in] frame The input image + * @param[in] roiRects List of text detection regions of interest (cv::Rect, CV_32SC4). ROIs is be cropped as the network inputs + * @param[out] results A set of text recognition results. + */ + CV_WRAP + void recognize(InputArray frame, InputArrayOfArrays roiRects, CV_OUT std::vector& results) const; +}; + + +/** @brief Base class for text detection networks + */ +class CV_EXPORTS_W_SIMPLE TextDetectionModel : public Model +{ +protected: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + TextDetectionModel(); + +public: + + /** @brief Performs detection + * + * Given the input @p frame, prepare network input, run network inference, post-process network output and return result detections. + * + * Each result is quadrangle's 4 points in this order: + * - bottom-left + * - top-left + * - top-right + * - bottom-right + * + * Use cv::getPerspectiveTransform function to retrieve image region without perspective transformations. + * + * @note If DL model doesn't support that kind of output then result may be derived from detectTextRectangles() output. + * + * @param[in] frame The input image + * @param[out] detections array with detections' quadrangles (4 points per result) + * @param[out] confidences array with detection confidences + */ + CV_WRAP + void detect( + InputArray frame, + CV_OUT std::vector< std::vector >& detections, + CV_OUT std::vector& confidences + ) const; + + /** @overload */ + CV_WRAP + void detect( + InputArray frame, + CV_OUT std::vector< std::vector >& detections + ) const; + + /** @brief Performs detection + * + * Given the input @p frame, prepare network input, run network inference, post-process network output and return result detections. + * + * Each result is rotated rectangle. + * + * @note Result may be inaccurate in case of strong perspective transformations. + * + * @param[in] frame the input image + * @param[out] detections array with detections' RotationRect results + * @param[out] confidences array with detection confidences + */ + CV_WRAP + void detectTextRectangles( + InputArray frame, + CV_OUT std::vector& detections, + CV_OUT std::vector& confidences + ) const; + + /** @overload */ + CV_WRAP + void detectTextRectangles( + InputArray frame, + CV_OUT std::vector& detections + ) const; +}; + +/** @brief This class represents high-level API for text detection DL networks compatible with EAST model. + * + * Configurable parameters: + * - (float) confThreshold - used to filter boxes by confidences, default: 0.5f + * - (float) nmsThreshold - used in non maximum suppression, default: 0.0f + */ +class CV_EXPORTS_W_SIMPLE TextDetectionModel_EAST : public TextDetectionModel +{ +public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + TextDetectionModel_EAST(); + + /** + * @brief Create text detection algorithm from deep learning network + * @param[in] network Net object + */ + CV_WRAP TextDetectionModel_EAST(const Net& network); + + /** + * @brief Create text detection model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP inline + TextDetectionModel_EAST(const std::string& model, const std::string& config = "") + : TextDetectionModel_EAST(readNet(model, config)) { /* nothing */ } + + /** + * @brief Set the detection confidence threshold + * @param[in] confThreshold A threshold used to filter boxes by confidences + */ + CV_WRAP + TextDetectionModel_EAST& setConfidenceThreshold(float confThreshold); + + /** + * @brief Get the detection confidence threshold + */ + CV_WRAP + float getConfidenceThreshold() const; + + /** + * @brief Set the detection NMS filter threshold + * @param[in] nmsThreshold A threshold used in non maximum suppression + */ + CV_WRAP + TextDetectionModel_EAST& setNMSThreshold(float nmsThreshold); + + /** + * @brief Get the detection confidence threshold + */ + CV_WRAP + float getNMSThreshold() const; +}; + +/** @brief This class represents high-level API for text detection DL networks compatible with DB model. + * + * Related publications: @cite liao2020real + * Paper: https://arxiv.org/abs/1911.08947 + * For more information about the hyper-parameters setting, please refer to https://github.com/MhLiao/DB + * + * Configurable parameters: + * - (float) binaryThreshold - The threshold of the binary map. It is usually set to 0.3. + * - (float) polygonThreshold - The threshold of text polygons. It is usually set to 0.5, 0.6, and 0.7. Default is 0.5f + * - (double) unclipRatio - The unclip ratio of the detected text region, which determines the output size. It is usually set to 2.0. + * - (int) maxCandidates - The max number of the output results. + */ +class CV_EXPORTS_W_SIMPLE TextDetectionModel_DB : public TextDetectionModel +{ +public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + TextDetectionModel_DB(); + + /** + * @brief Create text detection algorithm from deep learning network. + * @param[in] network Net object. + */ + CV_WRAP TextDetectionModel_DB(const Net& network); + + /** + * @brief Create text detection model from network represented in one of the supported formats. + * An order of @p model and @p config arguments does not matter. + * @param[in] model Binary file contains trained weights. + * @param[in] config Text file contains network configuration. + */ + CV_WRAP inline + TextDetectionModel_DB(const std::string& model, const std::string& config = "") + : TextDetectionModel_DB(readNet(model, config)) { /* nothing */ } + + CV_WRAP TextDetectionModel_DB& setBinaryThreshold(float binaryThreshold); + CV_WRAP float getBinaryThreshold() const; + + CV_WRAP TextDetectionModel_DB& setPolygonThreshold(float polygonThreshold); + CV_WRAP float getPolygonThreshold() const; + + CV_WRAP TextDetectionModel_DB& setUnclipRatio(double unclipRatio); + CV_WRAP double getUnclipRatio() const; + + CV_WRAP TextDetectionModel_DB& setMaxCandidates(int maxCandidates); + CV_WRAP int getMaxCandidates() const; +}; + +//! @} +CV__DNN_INLINE_NS_END +} +} + +#include +#include + +/// @deprecated Include this header directly from application. Automatic inclusion will be removed +#include + +#endif /* OPENCV_DNN_DNN_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/dnn/dnn.inl.hpp b/Thirdparty/opencv2/include/opencv2/dnn/dnn.inl.hpp new file mode 100644 index 0000000..8312a41 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/dnn.inl.hpp @@ -0,0 +1,412 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_DNN_INL_HPP +#define OPENCV_DNN_DNN_INL_HPP + +#include + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN + +template +DictValue DictValue::arrayInt(TypeIter begin, int size) +{ + DictValue res(Param::INT, new AutoBuffer(size)); + for (int j = 0; j < size; begin++, j++) + (*res.pi)[j] = *begin; + return res; +} + +template +DictValue DictValue::arrayReal(TypeIter begin, int size) +{ + DictValue res(Param::REAL, new AutoBuffer(size)); + for (int j = 0; j < size; begin++, j++) + (*res.pd)[j] = *begin; + return res; +} + +template +DictValue DictValue::arrayString(TypeIter begin, int size) +{ + DictValue res(Param::STRING, new AutoBuffer(size)); + for (int j = 0; j < size; begin++, j++) + (*res.ps)[j] = *begin; + return res; +} + +template<> +inline DictValue DictValue::get(int idx) const +{ + CV_Assert(idx == -1); + return *this; +} + +template<> +inline int64 DictValue::get(int idx) const +{ + CV_Assert((idx == -1 && size() == 1) || (idx >= 0 && idx < size())); + idx = (idx == -1) ? 0 : idx; + + if (type == Param::INT) + { + return (*pi)[idx]; + } + else if (type == Param::REAL) + { + double doubleValue = (*pd)[idx]; + + double fracpart, intpart; + fracpart = std::modf(doubleValue, &intpart); + CV_Assert(fracpart == 0.0); + + return (int64)doubleValue; + } + else if (type == Param::STRING) + { + return std::atoi((*ps)[idx].c_str()); + } + else + { + CV_Assert(isInt() || isReal() || isString()); + return 0; + } +} + +template<> +inline int DictValue::get(int idx) const +{ + return (int)get(idx); +} + +inline int DictValue::getIntValue(int idx) const +{ + return (int)get(idx); +} + +template<> +inline unsigned DictValue::get(int idx) const +{ + return (unsigned)get(idx); +} + +template<> +inline bool DictValue::get(int idx) const +{ + return (get(idx) != 0); +} + +template<> +inline double DictValue::get(int idx) const +{ + CV_Assert((idx == -1 && size() == 1) || (idx >= 0 && idx < size())); + idx = (idx == -1) ? 0 : idx; + + if (type == Param::REAL) + { + return (*pd)[idx]; + } + else if (type == Param::INT) + { + return (double)(*pi)[idx]; + } + else if (type == Param::STRING) + { + return std::atof((*ps)[idx].c_str()); + } + else + { + CV_Assert(isReal() || isInt() || isString()); + return 0; + } +} + +inline double DictValue::getRealValue(int idx) const +{ + return get(idx); +} + +template<> +inline float DictValue::get(int idx) const +{ + return (float)get(idx); +} + +template<> +inline String DictValue::get(int idx) const +{ + CV_Assert(isString()); + CV_Assert((idx == -1 && ps->size() == 1) || (idx >= 0 && idx < (int)ps->size())); + return (*ps)[(idx == -1) ? 0 : idx]; +} + + +inline String DictValue::getStringValue(int idx) const +{ + return get(idx); +} + +inline void DictValue::release() +{ + switch (type) + { + case Param::INT: + delete pi; + break; + case Param::STRING: + delete ps; + break; + case Param::REAL: + delete pd; + break; + case Param::BOOLEAN: + case Param::MAT: + case Param::MAT_VECTOR: + case Param::ALGORITHM: + case Param::FLOAT: + case Param::UNSIGNED_INT: + case Param::UINT64: + case Param::UCHAR: + case Param::SCALAR: + break; // unhandled + } +} + +inline DictValue::~DictValue() +{ + release(); +} + +inline DictValue & DictValue::operator=(const DictValue &r) +{ + if (&r == this) + return *this; + + if (r.type == Param::INT) + { + AutoBuffer *tmp = new AutoBuffer(*r.pi); + release(); + pi = tmp; + } + else if (r.type == Param::STRING) + { + AutoBuffer *tmp = new AutoBuffer(*r.ps); + release(); + ps = tmp; + } + else if (r.type == Param::REAL) + { + AutoBuffer *tmp = new AutoBuffer(*r.pd); + release(); + pd = tmp; + } + + type = r.type; + + return *this; +} + +inline DictValue::DictValue(const DictValue &r) + : pv(NULL) +{ + type = r.type; + + if (r.type == Param::INT) + pi = new AutoBuffer(*r.pi); + else if (r.type == Param::STRING) + ps = new AutoBuffer(*r.ps); + else if (r.type == Param::REAL) + pd = new AutoBuffer(*r.pd); +} + +inline bool DictValue::isString() const +{ + return (type == Param::STRING); +} + +inline bool DictValue::isInt() const +{ + return (type == Param::INT); +} + +inline bool DictValue::isReal() const +{ + return (type == Param::REAL || type == Param::INT); +} + +inline int DictValue::size() const +{ + switch (type) + { + case Param::INT: + return (int)pi->size(); + case Param::STRING: + return (int)ps->size(); + case Param::REAL: + return (int)pd->size(); + case Param::BOOLEAN: + case Param::MAT: + case Param::MAT_VECTOR: + case Param::ALGORITHM: + case Param::FLOAT: + case Param::UNSIGNED_INT: + case Param::UINT64: + case Param::UCHAR: + case Param::SCALAR: + break; // unhandled + } + CV_Error_(Error::StsInternal, ("Unhandled type (%d)", static_cast(type))); +} + +inline std::ostream &operator<<(std::ostream &stream, const DictValue &dictv) +{ + int i; + + if (dictv.isInt()) + { + for (i = 0; i < dictv.size() - 1; i++) + stream << dictv.get(i) << ", "; + stream << dictv.get(i); + } + else if (dictv.isReal()) + { + for (i = 0; i < dictv.size() - 1; i++) + stream << dictv.get(i) << ", "; + stream << dictv.get(i); + } + else if (dictv.isString()) + { + for (i = 0; i < dictv.size() - 1; i++) + stream << "\"" << dictv.get(i) << "\", "; + stream << dictv.get(i); + } + + return stream; +} + +///////////////////////////////////////////////////////////////// + +inline bool Dict::has(const String &key) const +{ + return dict.count(key) != 0; +} + +inline DictValue *Dict::ptr(const String &key) +{ + _Dict::iterator i = dict.find(key); + return (i == dict.end()) ? NULL : &i->second; +} + +inline const DictValue *Dict::ptr(const String &key) const +{ + _Dict::const_iterator i = dict.find(key); + return (i == dict.end()) ? NULL : &i->second; +} + +inline const DictValue &Dict::get(const String &key) const +{ + _Dict::const_iterator i = dict.find(key); + if (i == dict.end()) + CV_Error(Error::StsObjectNotFound, "Required argument \"" + key + "\" not found into dictionary"); + return i->second; +} + +template +inline T Dict::get(const String &key) const +{ + return this->get(key).get(); +} + +template +inline T Dict::get(const String &key, const T &defaultValue) const +{ + _Dict::const_iterator i = dict.find(key); + + if (i != dict.end()) + return i->second.get(); + else + return defaultValue; +} + +template +inline const T &Dict::set(const String &key, const T &value) +{ + _Dict::iterator i = dict.find(key); + + if (i != dict.end()) + i->second = DictValue(value); + else + dict.insert(std::make_pair(key, DictValue(value))); + + return value; +} + +inline void Dict::erase(const String &key) +{ + dict.erase(key); +} + +inline std::ostream &operator<<(std::ostream &stream, const Dict &dict) +{ + Dict::_Dict::const_iterator it; + for (it = dict.dict.begin(); it != dict.dict.end(); it++) + stream << it->first << " : " << it->second << "\n"; + + return stream; +} + +inline std::map::const_iterator Dict::begin() const +{ + return dict.begin(); +} + +inline std::map::const_iterator Dict::end() const +{ + return dict.end(); +} + +CV__DNN_INLINE_NS_END +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/layer.details.hpp b/Thirdparty/opencv2/include/opencv2/dnn/layer.details.hpp new file mode 100644 index 0000000..1133da5 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/layer.details.hpp @@ -0,0 +1,78 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +#ifndef OPENCV_DNN_LAYER_DETAILS_HPP +#define OPENCV_DNN_LAYER_DETAILS_HPP + +#include + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN + +/** @brief Registers layer constructor in runtime. +* @param type string, containing type name of the layer. +* @param constructorFunc pointer to the function of type LayerRegister::Constructor, which creates the layer. +* @details This macros must be placed inside the function code. +*/ +#define CV_DNN_REGISTER_LAYER_FUNC(type, constructorFunc) \ + cv::dnn::LayerFactory::registerLayer(#type, constructorFunc); + +/** @brief Registers layer class in runtime. + * @param type string, containing type name of the layer. + * @param class C++ class, derived from Layer. + * @details This macros must be placed inside the function code. + */ +#define CV_DNN_REGISTER_LAYER_CLASS(type, class) \ + cv::dnn::LayerFactory::registerLayer(#type, cv::dnn::details::_layerDynamicRegisterer); + +/** @brief Registers layer constructor on module load time. +* @param type string, containing type name of the layer. +* @param constructorFunc pointer to the function of type LayerRegister::Constructor, which creates the layer. +* @details This macros must be placed outside the function code. +*/ +#define CV_DNN_REGISTER_LAYER_FUNC_STATIC(type, constructorFunc) \ +static cv::dnn::details::_LayerStaticRegisterer __LayerStaticRegisterer_##type(#type, constructorFunc); + +/** @brief Registers layer class on module load time. + * @param type string, containing type name of the layer. + * @param class C++ class, derived from Layer. + * @details This macros must be placed outside the function code. + */ +#define CV_DNN_REGISTER_LAYER_CLASS_STATIC(type, class) \ +Ptr __LayerStaticRegisterer_func_##type(LayerParams ¶ms) \ + { return Ptr(new class(params)); } \ +static cv::dnn::details::_LayerStaticRegisterer __LayerStaticRegisterer_##type(#type, __LayerStaticRegisterer_func_##type); + +namespace details { + +template +Ptr _layerDynamicRegisterer(LayerParams ¶ms) +{ + return Ptr(LayerClass::create(params)); +} + +//allows automatically register created layer on module load time +class _LayerStaticRegisterer +{ + String type; +public: + + _LayerStaticRegisterer(const String &layerType, LayerFactory::Constructor layerConstructor) + { + this->type = layerType; + LayerFactory::registerLayer(layerType, layerConstructor); + } + + ~_LayerStaticRegisterer() + { + LayerFactory::unregisterLayer(type); + } +}; + +} // namespace +CV__DNN_INLINE_NS_END +}} // namespace + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/layer.hpp b/Thirdparty/opencv2/include/opencv2/dnn/layer.hpp new file mode 100644 index 0000000..a4d1675 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/layer.hpp @@ -0,0 +1,88 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_LAYER_HPP +#define OPENCV_DNN_LAYER_HPP +#include + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN +//! @addtogroup dnn +//! @{ +//! +//! @defgroup dnnLayerFactory Utilities for New Layers Registration +//! @{ + +/** @brief %Layer factory allows to create instances of registered layers. */ +class CV_EXPORTS LayerFactory +{ +public: + + //! Each Layer class must provide this function to the factory + typedef Ptr(*Constructor)(LayerParams ¶ms); + + //! Registers the layer class with typename @p type and specified @p constructor. Thread-safe. + static void registerLayer(const String &type, Constructor constructor); + + //! Unregisters registered layer with specified type name. Thread-safe. + static void unregisterLayer(const String &type); + + //! Check if layer is registered. + static bool isLayerRegistered(const std::string& type); + + /** @brief Creates instance of registered layer. + * @param type type name of creating layer. + * @param params parameters which will be used for layer initialization. + * @note Thread-safe. + */ + static Ptr createLayerInstance(const String &type, LayerParams& params); + +private: + LayerFactory(); +}; + +//! @} +//! @} +CV__DNN_INLINE_NS_END +} +} +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/shape_utils.hpp b/Thirdparty/opencv2/include/opencv2/dnn/shape_utils.hpp new file mode 100644 index 0000000..6f4c0d5 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/shape_utils.hpp @@ -0,0 +1,290 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_DNN_DNN_SHAPE_UTILS_HPP +#define OPENCV_DNN_DNN_SHAPE_UTILS_HPP + +#include +#include // CV_MAX_DIM +#include +#include +#include + +namespace cv { +namespace dnn { +CV__DNN_INLINE_NS_BEGIN + +//Slicing + +struct _Range : public cv::Range +{ + _Range(const Range &r) : cv::Range(r) {} + _Range(int start_, int size_ = 1) : cv::Range(start_, start_ + size_) {} +}; + +static inline Mat slice(const Mat &m, const _Range &r0) +{ + Range ranges[CV_MAX_DIM]; + for (int i = 1; i < m.dims; i++) + ranges[i] = Range::all(); + ranges[0] = r0; + return m(&ranges[0]); +} + +static inline Mat slice(const Mat &m, const _Range &r0, const _Range &r1) +{ + CV_Assert(m.dims >= 2); + Range ranges[CV_MAX_DIM]; + for (int i = 2; i < m.dims; i++) + ranges[i] = Range::all(); + ranges[0] = r0; + ranges[1] = r1; + return m(&ranges[0]); +} + +static inline Mat slice(const Mat &m, const _Range &r0, const _Range &r1, const _Range &r2) +{ + CV_Assert(m.dims >= 3); + Range ranges[CV_MAX_DIM]; + for (int i = 3; i < m.dims; i++) + ranges[i] = Range::all(); + ranges[0] = r0; + ranges[1] = r1; + ranges[2] = r2; + return m(&ranges[0]); +} + +static inline Mat slice(const Mat &m, const _Range &r0, const _Range &r1, const _Range &r2, const _Range &r3) +{ + CV_Assert(m.dims >= 4); + Range ranges[CV_MAX_DIM]; + for (int i = 4; i < m.dims; i++) + ranges[i] = Range::all(); + ranges[0] = r0; + ranges[1] = r1; + ranges[2] = r2; + ranges[3] = r3; + return m(&ranges[0]); +} + +static inline Mat getPlane(const Mat &m, int n, int cn) +{ + CV_Assert(m.dims > 2); + int sz[CV_MAX_DIM]; + for(int i = 2; i < m.dims; i++) + { + sz[i-2] = m.size.p[i]; + } + return Mat(m.dims - 2, sz, m.type(), (void*)m.ptr(n, cn)); +} + +static inline MatShape shape(const int* dims, const int n) +{ + MatShape shape; + shape.assign(dims, dims + n); + return shape; +} + +static inline MatShape shape(const Mat& mat) +{ + return shape(mat.size.p, mat.dims); +} + +static inline MatShape shape(const MatSize& sz) +{ + return shape(sz.p, sz.dims()); +} + +static inline MatShape shape(const UMat& mat) +{ + return shape(mat.size.p, mat.dims); +} + +#if 0 // issues with MatExpr wrapped into InputArray +static inline +MatShape shape(InputArray input) +{ + int sz[CV_MAX_DIM]; + int ndims = input.sizend(sz); + return shape(sz, ndims); +} +#endif + +namespace {inline bool is_neg(int i) { return i < 0; }} + +static inline MatShape shape(int a0, int a1=-1, int a2=-1, int a3=-1) +{ + int dims[] = {a0, a1, a2, a3}; + MatShape s = shape(dims, 4); + s.erase(std::remove_if(s.begin(), s.end(), is_neg), s.end()); + return s; +} + +static inline int total(const MatShape& shape, int start = -1, int end = -1) +{ + if (shape.empty()) + return 0; + + int dims = (int)shape.size(); + + if (start == -1) start = 0; + if (end == -1) end = dims; + + CV_CheckLE(0, start, ""); + CV_CheckLE(start, end, ""); + CV_CheckLE(end, dims, ""); + + int elems = 1; + for (int i = start; i < end; i++) + { + elems *= shape[i]; + } + return elems; +} + +// TODO: rename to countDimsElements() +static inline int total(const Mat& mat, int start = -1, int end = -1) +{ + if (mat.empty()) + return 0; + + int dims = mat.dims; + + if (start == -1) start = 0; + if (end == -1) end = dims; + + CV_CheckLE(0, start, ""); + CV_CheckLE(start, end, ""); + CV_CheckLE(end, dims, ""); + + int elems = 1; + for (int i = start; i < end; i++) + { + elems *= mat.size[i]; + } + return elems; +} + +static inline MatShape concat(const MatShape& a, const MatShape& b) +{ + MatShape c = a; + c.insert(c.end(), b.begin(), b.end()); + + return c; +} + +template +static inline std::string toString(const std::vector<_Tp>& shape, const String& name = "") +{ + std::ostringstream ss; + if (!name.empty()) + ss << name << ' '; + ss << '['; + for(size_t i = 0, n = shape.size(); i < n; ++i) + ss << ' ' << shape[i]; + ss << " ]"; + return ss.str(); +} + +template +static inline void print(const std::vector<_Tp>& shape, const String& name = "") +{ + std::cout << toString(shape, name) << std::endl; +} +template +static inline std::ostream& operator<<(std::ostream &out, const std::vector<_Tp>& shape) +{ + out << toString(shape); + return out; +} + +/// @brief Converts axis from `[-dims; dims)` (similar to Python's slice notation) to `[0; dims)` range. +static inline +int normalize_axis(int axis, int dims) +{ + CV_Check(axis, axis >= -dims && axis < dims, ""); + axis = (axis < 0) ? (dims + axis) : axis; + CV_DbgCheck(axis, axis >= 0 && axis < dims, ""); + return axis; +} + +static inline +int normalize_axis(int axis, const MatShape& shape) +{ + return normalize_axis(axis, (int)shape.size()); +} + +static inline +Range normalize_axis_range(const Range& r, int axisSize) +{ + if (r == Range::all()) + return Range(0, axisSize); + CV_CheckGE(r.start, 0, ""); + Range clamped(r.start, + r.end > 0 ? std::min(r.end, axisSize) : axisSize + r.end + 1); + CV_DbgCheckGE(clamped.start, 0, ""); + CV_CheckLT(clamped.start, clamped.end, ""); + CV_CheckLE(clamped.end, axisSize, ""); + return clamped; +} + +static inline +bool isAllOnes(const MatShape &inputShape, int startPos, int endPos) +{ + CV_Assert(!inputShape.empty()); + + CV_CheckGE((int) inputShape.size(), startPos, ""); + CV_CheckGE(startPos, 0, ""); + CV_CheckLE(startPos, endPos, ""); + CV_CheckLE((size_t)endPos, inputShape.size(), ""); + + for (size_t i = startPos; i < endPos; i++) + { + if (inputShape[i] != 1) + return false; + } + return true; +} + +CV__DNN_INLINE_NS_END +} +} +#endif diff --git a/Thirdparty/opencv2/include/opencv2/dnn/utils/debug_utils.hpp b/Thirdparty/opencv2/include/opencv2/dnn/utils/debug_utils.hpp new file mode 100644 index 0000000..71dd3ab --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/utils/debug_utils.hpp @@ -0,0 +1,24 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_DNN_UTILS_DEBUG_UTILS_HPP +#define OPENCV_DNN_UTILS_DEBUG_UTILS_HPP + +#include "../dnn.hpp" + +namespace cv { namespace dnn { +CV__DNN_INLINE_NS_BEGIN + +/** + * @brief Skip model import after diagnostic run in readNet() functions. + * @param[in] skip Indicates whether to skip the import. + * + * This is an internal OpenCV function not intended for users. + */ +CV_EXPORTS void skipModelImport(bool skip); + +CV__DNN_INLINE_NS_END +}} // namespace + +#endif // OPENCV_DNN_UTILS_DEBUG_UTILS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/dnn/utils/inference_engine.hpp b/Thirdparty/opencv2/include/opencv2/dnn/utils/inference_engine.hpp new file mode 100644 index 0000000..b81806e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/utils/inference_engine.hpp @@ -0,0 +1,82 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// +// Copyright (C) 2018-2019, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. + +#ifndef OPENCV_DNN_UTILS_INF_ENGINE_HPP +#define OPENCV_DNN_UTILS_INF_ENGINE_HPP + +#include "../dnn.hpp" + +namespace cv { namespace dnn { +CV__DNN_INLINE_NS_BEGIN + + +/* Values for 'OPENCV_DNN_BACKEND_INFERENCE_ENGINE_TYPE' parameter */ +/// @deprecated +#define CV_DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_API "NN_BUILDER" +/// @deprecated +#define CV_DNN_BACKEND_INFERENCE_ENGINE_NGRAPH "NGRAPH" + +/** @brief Returns Inference Engine internal backend API. + * + * See values of `CV_DNN_BACKEND_INFERENCE_ENGINE_*` macros. + * + * `OPENCV_DNN_BACKEND_INFERENCE_ENGINE_TYPE` runtime parameter (environment variable) is ignored since 4.6.0. + * + * @deprecated + */ +CV_EXPORTS_W cv::String getInferenceEngineBackendType(); + +/** @brief Specify Inference Engine internal backend API. + * + * See values of `CV_DNN_BACKEND_INFERENCE_ENGINE_*` macros. + * + * @returns previous value of internal backend API + * + * @deprecated + */ +CV_EXPORTS_W cv::String setInferenceEngineBackendType(const cv::String& newBackendType); + + +/** @brief Release a Myriad device (binded by OpenCV). + * + * Single Myriad device cannot be shared across multiple processes which uses + * Inference Engine's Myriad plugin. + */ +CV_EXPORTS_W void resetMyriadDevice(); + + +/* Values for 'OPENCV_DNN_IE_VPU_TYPE' parameter */ +#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_UNSPECIFIED "" +/// Intel(R) Movidius(TM) Neural Compute Stick, NCS (USB 03e7:2150), Myriad2 (https://software.intel.com/en-us/movidius-ncs) +#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_2 "Myriad2" +/// Intel(R) Neural Compute Stick 2, NCS2 (USB 03e7:2485), MyriadX (https://software.intel.com/ru-ru/neural-compute-stick) +#define CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X "MyriadX" +#define CV_DNN_INFERENCE_ENGINE_CPU_TYPE_ARM_COMPUTE "ARM_COMPUTE" +#define CV_DNN_INFERENCE_ENGINE_CPU_TYPE_X86 "X86" + + +/** @brief Returns Inference Engine VPU type. + * + * See values of `CV_DNN_INFERENCE_ENGINE_VPU_TYPE_*` macros. + */ +CV_EXPORTS_W cv::String getInferenceEngineVPUType(); + +/** @brief Returns Inference Engine CPU type. + * + * Specify OpenVINO plugin: CPU or ARM. + */ +CV_EXPORTS_W cv::String getInferenceEngineCPUType(); + +/** @brief Release a HDDL plugin. + */ +CV_EXPORTS_W void releaseHDDLPlugin(); + + +CV__DNN_INLINE_NS_END +}} // namespace + +#endif // OPENCV_DNN_UTILS_INF_ENGINE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/dnn/version.hpp b/Thirdparty/opencv2/include/opencv2/dnn/version.hpp new file mode 100644 index 0000000..b93622d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/dnn/version.hpp @@ -0,0 +1,21 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_DNN_VERSION_HPP +#define OPENCV_DNN_VERSION_HPP + +/// Use with major OpenCV version only. +#define OPENCV_DNN_API_VERSION 20230620 + +#if !defined CV_DOXYGEN && !defined CV_STATIC_ANALYSIS && !defined CV_DNN_DONT_ADD_INLINE_NS +#define CV__DNN_INLINE_NS __CV_CAT(dnn4_v, OPENCV_DNN_API_VERSION) +#define CV__DNN_INLINE_NS_BEGIN namespace CV__DNN_INLINE_NS { +#define CV__DNN_INLINE_NS_END } +namespace cv { namespace dnn { namespace CV__DNN_INLINE_NS { } using namespace CV__DNN_INLINE_NS; }} +#else +#define CV__DNN_INLINE_NS_BEGIN +#define CV__DNN_INLINE_NS_END +#endif + +#endif // OPENCV_DNN_VERSION_HPP diff --git a/Thirdparty/opencv2/include/opencv2/features2d.hpp b/Thirdparty/opencv2/include/opencv2/features2d.hpp new file mode 100644 index 0000000..a7d348d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/features2d.hpp @@ -0,0 +1,1610 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_FEATURES_2D_HPP +#define OPENCV_FEATURES_2D_HPP + +#include "opencv2/opencv_modules.hpp" +#include "opencv2/core.hpp" + +#ifdef HAVE_OPENCV_FLANN +#include "opencv2/flann/miniflann.hpp" +#endif + +/** + @defgroup features2d 2D Features Framework + @{ + @defgroup features2d_main Feature Detection and Description + @defgroup features2d_match Descriptor Matchers + +Matchers of keypoint descriptors in OpenCV have wrappers with a common interface that enables you to +easily switch between different algorithms solving the same problem. This section is devoted to +matching descriptors that are represented as vectors in a multidimensional space. All objects that +implement vector descriptor matchers inherit the DescriptorMatcher interface. + + @defgroup features2d_draw Drawing Function of Keypoints and Matches + @defgroup features2d_category Object Categorization + +This section describes approaches based on local 2D features and used to categorize objects. + + @defgroup feature2d_hal Hardware Acceleration Layer + @{ + @defgroup features2d_hal_interface Interface + @} + @} + */ + +namespace cv +{ + +//! @addtogroup features2d_main +//! @{ + +// //! writes vector of keypoints to the file storage +// CV_EXPORTS void write(FileStorage& fs, const String& name, const std::vector& keypoints); +// //! reads vector of keypoints from the specified file storage node +// CV_EXPORTS void read(const FileNode& node, CV_OUT std::vector& keypoints); + +/** @brief A class filters a vector of keypoints. + + Because now it is difficult to provide a convenient interface for all usage scenarios of the + keypoints filter class, it has only several needed by now static methods. + */ +class CV_EXPORTS KeyPointsFilter +{ +public: + KeyPointsFilter(){} + + /* + * Remove keypoints within borderPixels of an image edge. + */ + static void runByImageBorder( std::vector& keypoints, Size imageSize, int borderSize ); + /* + * Remove keypoints of sizes out of range. + */ + static void runByKeypointSize( std::vector& keypoints, float minSize, + float maxSize=FLT_MAX ); + /* + * Remove keypoints from some image by mask for pixels of this image. + */ + static void runByPixelsMask( std::vector& keypoints, const Mat& mask ); + /* + * Remove objects from some image and a vector of points by mask for pixels of this image + */ + static void runByPixelsMask2VectorPoint(std::vector &keypoints, std::vector > &removeFrom, const Mat &mask); + /* + * Remove duplicated keypoints. + */ + static void removeDuplicated( std::vector& keypoints ); + /* + * Remove duplicated keypoints and sort the remaining keypoints + */ + static void removeDuplicatedSorted( std::vector& keypoints ); + + /* + * Retain the specified number of the best keypoints (according to the response) + */ + static void retainBest( std::vector& keypoints, int npoints ); +}; + + +/************************************ Base Classes ************************************/ + +/** @brief Abstract base class for 2D image feature detectors and descriptor extractors +*/ +#ifdef __EMSCRIPTEN__ +class CV_EXPORTS_W Feature2D : public Algorithm +#else +class CV_EXPORTS_W Feature2D : public virtual Algorithm +#endif +{ +public: + virtual ~Feature2D(); + + /** @brief Detects keypoints in an image (first variant) or image set (second variant). + + @param image Image. + @param keypoints The detected keypoints. In the second variant of the method keypoints[i] is a set + of keypoints detected in images[i] . + @param mask Mask specifying where to look for keypoints (optional). It must be a 8-bit integer + matrix with non-zero values in the region of interest. + */ + CV_WRAP virtual void detect( InputArray image, + CV_OUT std::vector& keypoints, + InputArray mask=noArray() ); + + /** @overload + @param images Image set. + @param keypoints The detected keypoints. In the second variant of the method keypoints[i] is a set + of keypoints detected in images[i] . + @param masks Masks for each input image specifying where to look for keypoints (optional). + masks[i] is a mask for images[i]. + */ + CV_WRAP virtual void detect( InputArrayOfArrays images, + CV_OUT std::vector >& keypoints, + InputArrayOfArrays masks=noArray() ); + + /** @brief Computes the descriptors for a set of keypoints detected in an image (first variant) or image set + (second variant). + + @param image Image. + @param keypoints Input collection of keypoints. Keypoints for which a descriptor cannot be + computed are removed. Sometimes new keypoints can be added, for example: SIFT duplicates keypoint + with several dominant orientations (for each orientation). + @param descriptors Computed descriptors. In the second variant of the method descriptors[i] are + descriptors computed for a keypoints[i]. Row j is the keypoints (or keypoints[i]) is the + descriptor for keypoint j-th keypoint. + */ + CV_WRAP virtual void compute( InputArray image, + CV_OUT CV_IN_OUT std::vector& keypoints, + OutputArray descriptors ); + + /** @overload + + @param images Image set. + @param keypoints Input collection of keypoints. Keypoints for which a descriptor cannot be + computed are removed. Sometimes new keypoints can be added, for example: SIFT duplicates keypoint + with several dominant orientations (for each orientation). + @param descriptors Computed descriptors. In the second variant of the method descriptors[i] are + descriptors computed for a keypoints[i]. Row j is the keypoints (or keypoints[i]) is the + descriptor for keypoint j-th keypoint. + */ + CV_WRAP virtual void compute( InputArrayOfArrays images, + CV_OUT CV_IN_OUT std::vector >& keypoints, + OutputArrayOfArrays descriptors ); + + /** Detects keypoints and computes the descriptors */ + CV_WRAP virtual void detectAndCompute( InputArray image, InputArray mask, + CV_OUT std::vector& keypoints, + OutputArray descriptors, + bool useProvidedKeypoints=false ); + + CV_WRAP virtual int descriptorSize() const; + CV_WRAP virtual int descriptorType() const; + CV_WRAP virtual int defaultNorm() const; + + CV_WRAP void write( const String& fileName ) const; + + CV_WRAP void read( const String& fileName ); + + virtual void write( FileStorage&) const CV_OVERRIDE; + + // see corresponding cv::Algorithm method + CV_WRAP virtual void read( const FileNode&) CV_OVERRIDE; + + //! Return true if detector object is empty + CV_WRAP virtual bool empty() const CV_OVERRIDE; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; + + // see corresponding cv::Algorithm method + CV_WRAP inline void write(FileStorage& fs, const String& name) const { Algorithm::write(fs, name); } +#if CV_VERSION_MAJOR < 5 + inline void write(const Ptr& fs, const String& name) const { CV_Assert(fs); Algorithm::write(*fs, name); } +#endif +}; + +/** Feature detectors in OpenCV have wrappers with a common interface that enables you to easily switch +between different algorithms solving the same problem. All objects that implement keypoint detectors +inherit the FeatureDetector interface. */ +typedef Feature2D FeatureDetector; + +/** Extractors of keypoint descriptors in OpenCV have wrappers with a common interface that enables you +to easily switch between different algorithms solving the same problem. This section is devoted to +computing descriptors represented as vectors in a multidimensional space. All objects that implement +the vector descriptor extractors inherit the DescriptorExtractor interface. + */ +typedef Feature2D DescriptorExtractor; + + +/** @brief Class for implementing the wrapper which makes detectors and extractors to be affine invariant, +described as ASIFT in @cite YM11 . +*/ +class CV_EXPORTS_W AffineFeature : public Feature2D +{ +public: + /** + @param backend The detector/extractor you want to use as backend. + @param maxTilt The highest power index of tilt factor. 5 is used in the paper as tilt sampling range n. + @param minTilt The lowest power index of tilt factor. 0 is used in the paper. + @param tiltStep Tilt sampling step \f$\delta_t\f$ in Algorithm 1 in the paper. + @param rotateStepBase Rotation sampling step factor b in Algorithm 1 in the paper. + */ + CV_WRAP static Ptr create(const Ptr& backend, + int maxTilt = 5, int minTilt = 0, float tiltStep = 1.4142135623730951f, float rotateStepBase = 72); + + CV_WRAP virtual void setViewParams(const std::vector& tilts, const std::vector& rolls) = 0; + CV_WRAP virtual void getViewParams(std::vector& tilts, std::vector& rolls) const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +typedef AffineFeature AffineFeatureDetector; +typedef AffineFeature AffineDescriptorExtractor; + + +/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform +(SIFT) algorithm by D. Lowe @cite Lowe04 . +*/ +class CV_EXPORTS_W SIFT : public Feature2D +{ +public: + /** + @param nfeatures The number of best features to retain. The features are ranked by their scores + (measured in SIFT algorithm as the local contrast) + + @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The + number of octaves is computed automatically from the image resolution. + + @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform + (low-contrast) regions. The larger the threshold, the less features are produced by the detector. + + @note The contrast threshold will be divided by nOctaveLayers when the filtering is applied. When + nOctaveLayers is set to default and if you want to use the value used in D. Lowe paper, 0.03, set + this argument to 0.09. + + @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning + is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are + filtered out (more features are retained). + + @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image + is captured with a weak camera with soft lenses, you might want to reduce the number. + + @param enable_precise_upscale Whether to enable precise upscaling in the scale pyramid, which maps + index \f$\texttt{x}\f$ to \f$\texttt{2x}\f$. This prevents localization bias. The option + is disabled by default. + */ + CV_WRAP static Ptr create(int nfeatures = 0, int nOctaveLayers = 3, + double contrastThreshold = 0.04, double edgeThreshold = 10, + double sigma = 1.6, bool enable_precise_upscale = false); + + /** @brief Create SIFT with specified descriptorType. + @param nfeatures The number of best features to retain. The features are ranked by their scores + (measured in SIFT algorithm as the local contrast) + + @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The + number of octaves is computed automatically from the image resolution. + + @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform + (low-contrast) regions. The larger the threshold, the less features are produced by the detector. + + @note The contrast threshold will be divided by nOctaveLayers when the filtering is applied. When + nOctaveLayers is set to default and if you want to use the value used in D. Lowe paper, 0.03, set + this argument to 0.09. + + @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning + is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are + filtered out (more features are retained). + + @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image + is captured with a weak camera with soft lenses, you might want to reduce the number. + + @param descriptorType The type of descriptors. Only CV_32F and CV_8U are supported. + + @param enable_precise_upscale Whether to enable precise upscaling in the scale pyramid, which maps + index \f$\texttt{x}\f$ to \f$\texttt{2x}\f$. This prevents localization bias. The option + is disabled by default. + */ + CV_WRAP static Ptr create(int nfeatures, int nOctaveLayers, + double contrastThreshold, double edgeThreshold, + double sigma, int descriptorType, bool enable_precise_upscale = false); + + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; + + CV_WRAP virtual void setNFeatures(int maxFeatures) = 0; + CV_WRAP virtual int getNFeatures() const = 0; + + CV_WRAP virtual void setNOctaveLayers(int nOctaveLayers) = 0; + CV_WRAP virtual int getNOctaveLayers() const = 0; + + CV_WRAP virtual void setContrastThreshold(double contrastThreshold) = 0; + CV_WRAP virtual double getContrastThreshold() const = 0; + + CV_WRAP virtual void setEdgeThreshold(double edgeThreshold) = 0; + CV_WRAP virtual double getEdgeThreshold() const = 0; + + CV_WRAP virtual void setSigma(double sigma) = 0; + CV_WRAP virtual double getSigma() const = 0; +}; + +typedef SIFT SiftFeatureDetector; +typedef SIFT SiftDescriptorExtractor; + + +/** @brief Class implementing the BRISK keypoint detector and descriptor extractor, described in @cite LCS11 . + */ +class CV_EXPORTS_W BRISK : public Feature2D +{ +public: + /** @brief The BRISK constructor + + @param thresh AGAST detection threshold score. + @param octaves detection octaves. Use 0 to do single scale. + @param patternScale apply this scale to the pattern used for sampling the neighbourhood of a + keypoint. + */ + CV_WRAP static Ptr create(int thresh=30, int octaves=3, float patternScale=1.0f); + + /** @brief The BRISK constructor for a custom pattern + + @param radiusList defines the radii (in pixels) where the samples around a keypoint are taken (for + keypoint scale 1). + @param numberList defines the number of sampling points on the sampling circle. Must be the same + size as radiusList.. + @param dMax threshold for the short pairings used for descriptor formation (in pixels for keypoint + scale 1). + @param dMin threshold for the long pairings used for orientation determination (in pixels for + keypoint scale 1). + @param indexChange index remapping of the bits. */ + CV_WRAP static Ptr create(const std::vector &radiusList, const std::vector &numberList, + float dMax=5.85f, float dMin=8.2f, const std::vector& indexChange=std::vector()); + + /** @brief The BRISK constructor for a custom pattern, detection threshold and octaves + + @param thresh AGAST detection threshold score. + @param octaves detection octaves. Use 0 to do single scale. + @param radiusList defines the radii (in pixels) where the samples around a keypoint are taken (for + keypoint scale 1). + @param numberList defines the number of sampling points on the sampling circle. Must be the same + size as radiusList.. + @param dMax threshold for the short pairings used for descriptor formation (in pixels for keypoint + scale 1). + @param dMin threshold for the long pairings used for orientation determination (in pixels for + keypoint scale 1). + @param indexChange index remapping of the bits. */ + CV_WRAP static Ptr create(int thresh, int octaves, const std::vector &radiusList, + const std::vector &numberList, float dMax=5.85f, float dMin=8.2f, + const std::vector& indexChange=std::vector()); + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; + + /** @brief Set detection threshold. + @param threshold AGAST detection threshold score. + */ + CV_WRAP virtual void setThreshold(int threshold) = 0; + CV_WRAP virtual int getThreshold() const = 0; + + /** @brief Set detection octaves. + @param octaves detection octaves. Use 0 to do single scale. + */ + CV_WRAP virtual void setOctaves(int octaves) = 0; + CV_WRAP virtual int getOctaves() const = 0; + /** @brief Set detection patternScale. + @param patternScale apply this scale to the pattern used for sampling the neighbourhood of a + keypoint. + */ + CV_WRAP virtual void setPatternScale(float patternScale) = 0; + CV_WRAP virtual float getPatternScale() const = 0; +}; + +/** @brief Class implementing the ORB (*oriented BRIEF*) keypoint detector and descriptor extractor + +described in @cite RRKB11 . The algorithm uses FAST in pyramids to detect stable keypoints, selects +the strongest features using FAST or Harris response, finds their orientation using first-order +moments and computes the descriptors using BRIEF (where the coordinates of random point pairs (or +k-tuples) are rotated according to the measured orientation). + */ +class CV_EXPORTS_W ORB : public Feature2D +{ +public: + enum ScoreType { HARRIS_SCORE=0, FAST_SCORE=1 }; + static const int kBytes = 32; + + /** @brief The ORB constructor + + @param nfeatures The maximum number of features to retain. + @param scaleFactor Pyramid decimation ratio, greater than 1. scaleFactor==2 means the classical + pyramid, where each next level has 4x less pixels than the previous, but such a big scale factor + will degrade feature matching scores dramatically. On the other hand, too close to 1 scale factor + will mean that to cover certain scale range you will need more pyramid levels and so the speed + will suffer. + @param nlevels The number of pyramid levels. The smallest level will have linear size equal to + input_image_linear_size/pow(scaleFactor, nlevels - firstLevel). + @param edgeThreshold This is size of the border where the features are not detected. It should + roughly match the patchSize parameter. + @param firstLevel The level of pyramid to put source image to. Previous layers are filled + with upscaled source image. + @param WTA_K The number of points that produce each element of the oriented BRIEF descriptor. The + default value 2 means the BRIEF where we take a random point pair and compare their brightnesses, + so we get 0/1 response. Other possible values are 3 and 4. For example, 3 means that we take 3 + random points (of course, those point coordinates are random, but they are generated from the + pre-defined seed, so each element of BRIEF descriptor is computed deterministically from the pixel + rectangle), find point of maximum brightness and output index of the winner (0, 1 or 2). Such + output will occupy 2 bits, and therefore it will need a special variant of Hamming distance, + denoted as NORM_HAMMING2 (2 bits per bin). When WTA_K=4, we take 4 random points to compute each + bin (that will also occupy 2 bits with possible values 0, 1, 2 or 3). + @param scoreType The default HARRIS_SCORE means that Harris algorithm is used to rank features + (the score is written to KeyPoint::score and is used to retain best nfeatures features); + FAST_SCORE is alternative value of the parameter that produces slightly less stable keypoints, + but it is a little faster to compute. + @param patchSize size of the patch used by the oriented BRIEF descriptor. Of course, on smaller + pyramid layers the perceived image area covered by a feature will be larger. + @param fastThreshold the fast threshold + */ + CV_WRAP static Ptr create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, + int firstLevel=0, int WTA_K=2, ORB::ScoreType scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20); + + CV_WRAP virtual void setMaxFeatures(int maxFeatures) = 0; + CV_WRAP virtual int getMaxFeatures() const = 0; + + CV_WRAP virtual void setScaleFactor(double scaleFactor) = 0; + CV_WRAP virtual double getScaleFactor() const = 0; + + CV_WRAP virtual void setNLevels(int nlevels) = 0; + CV_WRAP virtual int getNLevels() const = 0; + + CV_WRAP virtual void setEdgeThreshold(int edgeThreshold) = 0; + CV_WRAP virtual int getEdgeThreshold() const = 0; + + CV_WRAP virtual void setFirstLevel(int firstLevel) = 0; + CV_WRAP virtual int getFirstLevel() const = 0; + + CV_WRAP virtual void setWTA_K(int wta_k) = 0; + CV_WRAP virtual int getWTA_K() const = 0; + + CV_WRAP virtual void setScoreType(ORB::ScoreType scoreType) = 0; + CV_WRAP virtual ORB::ScoreType getScoreType() const = 0; + + CV_WRAP virtual void setPatchSize(int patchSize) = 0; + CV_WRAP virtual int getPatchSize() const = 0; + + CV_WRAP virtual void setFastThreshold(int fastThreshold) = 0; + CV_WRAP virtual int getFastThreshold() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +/** @brief Maximally stable extremal region extractor + +The class encapsulates all the parameters of the %MSER extraction algorithm (see [wiki +article](http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions)). + +- there are two different implementation of %MSER: one for grey image, one for color image + +- the grey image algorithm is taken from: @cite nister2008linear ; the paper claims to be faster +than union-find method; it actually get 1.5~2m/s on my centrino L7200 1.2GHz laptop. + +- the color image algorithm is taken from: @cite forssen2007maximally ; it should be much slower +than grey image method ( 3~4 times ) + +- (Python) A complete example showing the use of the %MSER detector can be found at samples/python/mser.py +*/ +class CV_EXPORTS_W MSER : public Feature2D +{ +public: + /** @brief Full constructor for %MSER detector + + @param delta it compares \f$(size_{i}-size_{i-delta})/size_{i-delta}\f$ + @param min_area prune the area which smaller than minArea + @param max_area prune the area which bigger than maxArea + @param max_variation prune the area have similar size to its children + @param min_diversity for color image, trace back to cut off mser with diversity less than min_diversity + @param max_evolution for color image, the evolution steps + @param area_threshold for color image, the area threshold to cause re-initialize + @param min_margin for color image, ignore too small margin + @param edge_blur_size for color image, the aperture size for edge blur + */ + CV_WRAP static Ptr create( int delta=5, int min_area=60, int max_area=14400, + double max_variation=0.25, double min_diversity=.2, + int max_evolution=200, double area_threshold=1.01, + double min_margin=0.003, int edge_blur_size=5 ); + + /** @brief Detect %MSER regions + + @param image input image (8UC1, 8UC3 or 8UC4, must be greater or equal than 3x3) + @param msers resulting list of point sets + @param bboxes resulting bounding boxes + */ + CV_WRAP virtual void detectRegions( InputArray image, + CV_OUT std::vector >& msers, + CV_OUT std::vector& bboxes ) = 0; + + CV_WRAP virtual void setDelta(int delta) = 0; + CV_WRAP virtual int getDelta() const = 0; + + CV_WRAP virtual void setMinArea(int minArea) = 0; + CV_WRAP virtual int getMinArea() const = 0; + + CV_WRAP virtual void setMaxArea(int maxArea) = 0; + CV_WRAP virtual int getMaxArea() const = 0; + + CV_WRAP virtual void setMaxVariation(double maxVariation) = 0; + CV_WRAP virtual double getMaxVariation() const = 0; + + CV_WRAP virtual void setMinDiversity(double minDiversity) = 0; + CV_WRAP virtual double getMinDiversity() const = 0; + + CV_WRAP virtual void setMaxEvolution(int maxEvolution) = 0; + CV_WRAP virtual int getMaxEvolution() const = 0; + + CV_WRAP virtual void setAreaThreshold(double areaThreshold) = 0; + CV_WRAP virtual double getAreaThreshold() const = 0; + + CV_WRAP virtual void setMinMargin(double min_margin) = 0; + CV_WRAP virtual double getMinMargin() const = 0; + + CV_WRAP virtual void setEdgeBlurSize(int edge_blur_size) = 0; + CV_WRAP virtual int getEdgeBlurSize() const = 0; + + CV_WRAP virtual void setPass2Only(bool f) = 0; + CV_WRAP virtual bool getPass2Only() const = 0; + + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +//! @} features2d_main + +//! @addtogroup features2d_main +//! @{ + +/** @brief Wrapping class for feature detection using the FAST method. : + */ +class CV_EXPORTS_W FastFeatureDetector : public Feature2D +{ +public: + enum DetectorType + { + TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2 + }; + enum + { + THRESHOLD = 10000, NONMAX_SUPPRESSION=10001, FAST_N=10002 + }; + + + CV_WRAP static Ptr create( int threshold=10, + bool nonmaxSuppression=true, + FastFeatureDetector::DetectorType type=FastFeatureDetector::TYPE_9_16 ); + + CV_WRAP virtual void setThreshold(int threshold) = 0; + CV_WRAP virtual int getThreshold() const = 0; + + CV_WRAP virtual void setNonmaxSuppression(bool f) = 0; + CV_WRAP virtual bool getNonmaxSuppression() const = 0; + + CV_WRAP virtual void setType(FastFeatureDetector::DetectorType type) = 0; + CV_WRAP virtual FastFeatureDetector::DetectorType getType() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +/** @overload */ +CV_EXPORTS void FAST( InputArray image, CV_OUT std::vector& keypoints, + int threshold, bool nonmaxSuppression=true ); + +/** @brief Detects corners using the FAST algorithm + +@param image grayscale image where keypoints (corners) are detected. +@param keypoints keypoints detected on the image. +@param threshold threshold on difference between intensity of the central pixel and pixels of a +circle around this pixel. +@param nonmaxSuppression if true, non-maximum suppression is applied to detected corners +(keypoints). +@param type one of the three neighborhoods as defined in the paper: +FastFeatureDetector::TYPE_9_16, FastFeatureDetector::TYPE_7_12, +FastFeatureDetector::TYPE_5_8 + +Detects corners using the FAST algorithm by @cite Rosten06 . + +@note In Python API, types are given as cv.FAST_FEATURE_DETECTOR_TYPE_5_8, +cv.FAST_FEATURE_DETECTOR_TYPE_7_12 and cv.FAST_FEATURE_DETECTOR_TYPE_9_16. For corner +detection, use cv.FAST.detect() method. + */ +CV_EXPORTS void FAST( InputArray image, CV_OUT std::vector& keypoints, + int threshold, bool nonmaxSuppression, FastFeatureDetector::DetectorType type ); + +//! @} features2d_main + +//! @addtogroup features2d_main +//! @{ + +/** @brief Wrapping class for feature detection using the AGAST method. : + */ +class CV_EXPORTS_W AgastFeatureDetector : public Feature2D +{ +public: + enum DetectorType + { + AGAST_5_8 = 0, AGAST_7_12d = 1, AGAST_7_12s = 2, OAST_9_16 = 3, + }; + + enum + { + THRESHOLD = 10000, NONMAX_SUPPRESSION = 10001, + }; + + CV_WRAP static Ptr create( int threshold=10, + bool nonmaxSuppression=true, + AgastFeatureDetector::DetectorType type = AgastFeatureDetector::OAST_9_16); + + CV_WRAP virtual void setThreshold(int threshold) = 0; + CV_WRAP virtual int getThreshold() const = 0; + + CV_WRAP virtual void setNonmaxSuppression(bool f) = 0; + CV_WRAP virtual bool getNonmaxSuppression() const = 0; + + CV_WRAP virtual void setType(AgastFeatureDetector::DetectorType type) = 0; + CV_WRAP virtual AgastFeatureDetector::DetectorType getType() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +/** @overload */ +CV_EXPORTS void AGAST( InputArray image, CV_OUT std::vector& keypoints, + int threshold, bool nonmaxSuppression=true ); + +/** @brief Detects corners using the AGAST algorithm + +@param image grayscale image where keypoints (corners) are detected. +@param keypoints keypoints detected on the image. +@param threshold threshold on difference between intensity of the central pixel and pixels of a +circle around this pixel. +@param nonmaxSuppression if true, non-maximum suppression is applied to detected corners +(keypoints). +@param type one of the four neighborhoods as defined in the paper: +AgastFeatureDetector::AGAST_5_8, AgastFeatureDetector::AGAST_7_12d, +AgastFeatureDetector::AGAST_7_12s, AgastFeatureDetector::OAST_9_16 + +For non-Intel platforms, there is a tree optimised variant of AGAST with same numerical results. +The 32-bit binary tree tables were generated automatically from original code using perl script. +The perl script and examples of tree generation are placed in features2d/doc folder. +Detects corners using the AGAST algorithm by @cite mair2010_agast . + + */ +CV_EXPORTS void AGAST( InputArray image, CV_OUT std::vector& keypoints, + int threshold, bool nonmaxSuppression, AgastFeatureDetector::DetectorType type ); + +/** @brief Wrapping class for feature detection using the goodFeaturesToTrack function. : + */ +class CV_EXPORTS_W GFTTDetector : public Feature2D +{ +public: + CV_WRAP static Ptr create( int maxCorners=1000, double qualityLevel=0.01, double minDistance=1, + int blockSize=3, bool useHarrisDetector=false, double k=0.04 ); + CV_WRAP static Ptr create( int maxCorners, double qualityLevel, double minDistance, + int blockSize, int gradiantSize, bool useHarrisDetector=false, double k=0.04 ); + CV_WRAP virtual void setMaxFeatures(int maxFeatures) = 0; + CV_WRAP virtual int getMaxFeatures() const = 0; + + CV_WRAP virtual void setQualityLevel(double qlevel) = 0; + CV_WRAP virtual double getQualityLevel() const = 0; + + CV_WRAP virtual void setMinDistance(double minDistance) = 0; + CV_WRAP virtual double getMinDistance() const = 0; + + CV_WRAP virtual void setBlockSize(int blockSize) = 0; + CV_WRAP virtual int getBlockSize() const = 0; + + CV_WRAP virtual void setGradientSize(int gradientSize_) = 0; + CV_WRAP virtual int getGradientSize() = 0; + + CV_WRAP virtual void setHarrisDetector(bool val) = 0; + CV_WRAP virtual bool getHarrisDetector() const = 0; + + CV_WRAP virtual void setK(double k) = 0; + CV_WRAP virtual double getK() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +/** @brief Class for extracting blobs from an image. : + +The class implements a simple algorithm for extracting blobs from an image: + +1. Convert the source image to binary images by applying thresholding with several thresholds from + minThreshold (inclusive) to maxThreshold (exclusive) with distance thresholdStep between + neighboring thresholds. +2. Extract connected components from every binary image by findContours and calculate their + centers. +3. Group centers from several binary images by their coordinates. Close centers form one group that + corresponds to one blob, which is controlled by the minDistBetweenBlobs parameter. +4. From the groups, estimate final centers of blobs and their radiuses and return as locations and + sizes of keypoints. + +This class performs several filtrations of returned blobs. You should set filterBy\* to true/false +to turn on/off corresponding filtration. Available filtrations: + +- **By color**. This filter compares the intensity of a binary image at the center of a blob to +blobColor. If they differ, the blob is filtered out. Use blobColor = 0 to extract dark blobs +and blobColor = 255 to extract light blobs. +- **By area**. Extracted blobs have an area between minArea (inclusive) and maxArea (exclusive). +- **By circularity**. Extracted blobs have circularity +(\f$\frac{4*\pi*Area}{perimeter * perimeter}\f$) between minCircularity (inclusive) and +maxCircularity (exclusive). +- **By ratio of the minimum inertia to maximum inertia**. Extracted blobs have this ratio +between minInertiaRatio (inclusive) and maxInertiaRatio (exclusive). +- **By convexity**. Extracted blobs have convexity (area / area of blob convex hull) between +minConvexity (inclusive) and maxConvexity (exclusive). + +Default values of parameters are tuned to extract dark circular blobs. + */ +class CV_EXPORTS_W SimpleBlobDetector : public Feature2D +{ +public: + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + CV_PROP_RW float thresholdStep; + CV_PROP_RW float minThreshold; + CV_PROP_RW float maxThreshold; + CV_PROP_RW size_t minRepeatability; + CV_PROP_RW float minDistBetweenBlobs; + + CV_PROP_RW bool filterByColor; + CV_PROP_RW uchar blobColor; + + CV_PROP_RW bool filterByArea; + CV_PROP_RW float minArea, maxArea; + + CV_PROP_RW bool filterByCircularity; + CV_PROP_RW float minCircularity, maxCircularity; + + CV_PROP_RW bool filterByInertia; + CV_PROP_RW float minInertiaRatio, maxInertiaRatio; + + CV_PROP_RW bool filterByConvexity; + CV_PROP_RW float minConvexity, maxConvexity; + + CV_PROP_RW bool collectContours; + + void read( const FileNode& fn ); + void write( FileStorage& fs ) const; + }; + + CV_WRAP static Ptr + create(const SimpleBlobDetector::Params ¶meters = SimpleBlobDetector::Params()); + + CV_WRAP virtual void setParams(const SimpleBlobDetector::Params& params ) = 0; + CV_WRAP virtual SimpleBlobDetector::Params getParams() const = 0; + + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; + CV_WRAP virtual const std::vector >& getBlobContours() const; +}; + +//! @} features2d_main + +//! @addtogroup features2d_main +//! @{ + +/** @brief Class implementing the KAZE keypoint detector and descriptor extractor, described in @cite ABD12 . + +@note AKAZE descriptor can only be used with KAZE or AKAZE keypoints .. [ABD12] KAZE Features. Pablo +F. Alcantarilla, Adrien Bartoli and Andrew J. Davison. In European Conference on Computer Vision +(ECCV), Fiorenze, Italy, October 2012. +*/ +class CV_EXPORTS_W KAZE : public Feature2D +{ +public: + enum DiffusivityType + { + DIFF_PM_G1 = 0, + DIFF_PM_G2 = 1, + DIFF_WEICKERT = 2, + DIFF_CHARBONNIER = 3 + }; + + /** @brief The KAZE constructor + + @param extended Set to enable extraction of extended (128-byte) descriptor. + @param upright Set to enable use of upright descriptors (non rotation-invariant). + @param threshold Detector response threshold to accept point + @param nOctaves Maximum octave evolution of the image + @param nOctaveLayers Default number of sublevels per scale level + @param diffusivity Diffusivity type. DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT or + DIFF_CHARBONNIER + */ + CV_WRAP static Ptr create(bool extended=false, bool upright=false, + float threshold = 0.001f, + int nOctaves = 4, int nOctaveLayers = 4, + KAZE::DiffusivityType diffusivity = KAZE::DIFF_PM_G2); + + CV_WRAP virtual void setExtended(bool extended) = 0; + CV_WRAP virtual bool getExtended() const = 0; + + CV_WRAP virtual void setUpright(bool upright) = 0; + CV_WRAP virtual bool getUpright() const = 0; + + CV_WRAP virtual void setThreshold(double threshold) = 0; + CV_WRAP virtual double getThreshold() const = 0; + + CV_WRAP virtual void setNOctaves(int octaves) = 0; + CV_WRAP virtual int getNOctaves() const = 0; + + CV_WRAP virtual void setNOctaveLayers(int octaveLayers) = 0; + CV_WRAP virtual int getNOctaveLayers() const = 0; + + CV_WRAP virtual void setDiffusivity(KAZE::DiffusivityType diff) = 0; + CV_WRAP virtual KAZE::DiffusivityType getDiffusivity() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; +}; + +/** @brief Class implementing the AKAZE keypoint detector and descriptor extractor, described in @cite ANB13. + +@details AKAZE descriptors can only be used with KAZE or AKAZE keypoints. This class is thread-safe. + +@note When you need descriptors use Feature2D::detectAndCompute, which +provides better performance. When using Feature2D::detect followed by +Feature2D::compute scale space pyramid is computed twice. + +@note AKAZE implements T-API. When image is passed as UMat some parts of the algorithm +will use OpenCL. + +@note [ANB13] Fast Explicit Diffusion for Accelerated Features in Nonlinear +Scale Spaces. Pablo F. Alcantarilla, Jesús Nuevo and Adrien Bartoli. In +British Machine Vision Conference (BMVC), Bristol, UK, September 2013. + +*/ +class CV_EXPORTS_W AKAZE : public Feature2D +{ +public: + // AKAZE descriptor type + enum DescriptorType + { + DESCRIPTOR_KAZE_UPRIGHT = 2, ///< Upright descriptors, not invariant to rotation + DESCRIPTOR_KAZE = 3, + DESCRIPTOR_MLDB_UPRIGHT = 4, ///< Upright descriptors, not invariant to rotation + DESCRIPTOR_MLDB = 5 + }; + + /** @brief The AKAZE constructor + + @param descriptor_type Type of the extracted descriptor: DESCRIPTOR_KAZE, + DESCRIPTOR_KAZE_UPRIGHT, DESCRIPTOR_MLDB or DESCRIPTOR_MLDB_UPRIGHT. + @param descriptor_size Size of the descriptor in bits. 0 -\> Full size + @param descriptor_channels Number of channels in the descriptor (1, 2, 3) + @param threshold Detector response threshold to accept point + @param nOctaves Maximum octave evolution of the image + @param nOctaveLayers Default number of sublevels per scale level + @param diffusivity Diffusivity type. DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT or + DIFF_CHARBONNIER + @param max_points Maximum amount of returned points. In case if image contains + more features, then the features with highest response are returned. + Negative value means no limitation. + */ + CV_WRAP static Ptr create(AKAZE::DescriptorType descriptor_type = AKAZE::DESCRIPTOR_MLDB, + int descriptor_size = 0, int descriptor_channels = 3, + float threshold = 0.001f, int nOctaves = 4, + int nOctaveLayers = 4, KAZE::DiffusivityType diffusivity = KAZE::DIFF_PM_G2, + int max_points = -1); + + CV_WRAP virtual void setDescriptorType(AKAZE::DescriptorType dtype) = 0; + CV_WRAP virtual AKAZE::DescriptorType getDescriptorType() const = 0; + + CV_WRAP virtual void setDescriptorSize(int dsize) = 0; + CV_WRAP virtual int getDescriptorSize() const = 0; + + CV_WRAP virtual void setDescriptorChannels(int dch) = 0; + CV_WRAP virtual int getDescriptorChannels() const = 0; + + CV_WRAP virtual void setThreshold(double threshold) = 0; + CV_WRAP virtual double getThreshold() const = 0; + + CV_WRAP virtual void setNOctaves(int octaves) = 0; + CV_WRAP virtual int getNOctaves() const = 0; + + CV_WRAP virtual void setNOctaveLayers(int octaveLayers) = 0; + CV_WRAP virtual int getNOctaveLayers() const = 0; + + CV_WRAP virtual void setDiffusivity(KAZE::DiffusivityType diff) = 0; + CV_WRAP virtual KAZE::DiffusivityType getDiffusivity() const = 0; + CV_WRAP virtual String getDefaultName() const CV_OVERRIDE; + + CV_WRAP virtual void setMaxPoints(int max_points) = 0; + CV_WRAP virtual int getMaxPoints() const = 0; +}; + +//! @} features2d_main + +/****************************************************************************************\ +* Distance * +\****************************************************************************************/ + +template +struct CV_EXPORTS Accumulator +{ + typedef T Type; +}; + +template<> struct Accumulator { typedef float Type; }; +template<> struct Accumulator { typedef float Type; }; +template<> struct Accumulator { typedef float Type; }; +template<> struct Accumulator { typedef float Type; }; + +/* + * Squared Euclidean distance functor + */ +template +struct CV_EXPORTS SL2 +{ + static const NormTypes normType = NORM_L2SQR; + typedef T ValueType; + typedef typename Accumulator::Type ResultType; + + ResultType operator()( const T* a, const T* b, int size ) const + { + return normL2Sqr(a, b, size); + } +}; + +/* + * Euclidean distance functor + */ +template +struct L2 +{ + static const NormTypes normType = NORM_L2; + typedef T ValueType; + typedef typename Accumulator::Type ResultType; + + ResultType operator()( const T* a, const T* b, int size ) const + { + return (ResultType)std::sqrt((double)normL2Sqr(a, b, size)); + } +}; + +/* + * Manhattan distance (city block distance) functor + */ +template +struct L1 +{ + static const NormTypes normType = NORM_L1; + typedef T ValueType; + typedef typename Accumulator::Type ResultType; + + ResultType operator()( const T* a, const T* b, int size ) const + { + return normL1(a, b, size); + } +}; + +/****************************************************************************************\ +* DescriptorMatcher * +\****************************************************************************************/ + +//! @addtogroup features2d_match +//! @{ + +/** @brief Abstract base class for matching keypoint descriptors. + +It has two groups of match methods: for matching descriptors of an image with another image or with +an image set. + */ +class CV_EXPORTS_W DescriptorMatcher : public Algorithm +{ +public: + enum MatcherType + { + FLANNBASED = 1, + BRUTEFORCE = 2, + BRUTEFORCE_L1 = 3, + BRUTEFORCE_HAMMING = 4, + BRUTEFORCE_HAMMINGLUT = 5, + BRUTEFORCE_SL2 = 6 + }; + + virtual ~DescriptorMatcher(); + + /** @brief Adds descriptors to train a CPU(trainDescCollectionis) or GPU(utrainDescCollectionis) descriptor + collection. + + If the collection is not empty, the new descriptors are added to existing train descriptors. + + @param descriptors Descriptors to add. Each descriptors[i] is a set of descriptors from the same + train image. + */ + CV_WRAP virtual void add( InputArrayOfArrays descriptors ); + + /** @brief Returns a constant link to the train descriptor collection trainDescCollection . + */ + CV_WRAP const std::vector& getTrainDescriptors() const; + + /** @brief Clears the train descriptor collections. + */ + CV_WRAP virtual void clear() CV_OVERRIDE; + + /** @brief Returns true if there are no train descriptors in the both collections. + */ + CV_WRAP virtual bool empty() const CV_OVERRIDE; + + /** @brief Returns true if the descriptor matcher supports masking permissible matches. + */ + CV_WRAP virtual bool isMaskSupported() const = 0; + + /** @brief Trains a descriptor matcher + + Trains a descriptor matcher (for example, the flann index). In all methods to match, the method + train() is run every time before matching. Some descriptor matchers (for example, BruteForceMatcher) + have an empty implementation of this method. Other matchers really train their inner structures (for + example, FlannBasedMatcher trains flann::Index ). + */ + CV_WRAP virtual void train(); + + /** @brief Finds the best match for each descriptor from a query set. + + @param queryDescriptors Query set of descriptors. + @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors + collection stored in the class object. + @param matches Matches. If a query descriptor is masked out in mask , no match is added for this + descriptor. So, matches size may be smaller than the query descriptors count. + @param mask Mask specifying permissible matches between an input query and train matrices of + descriptors. + + In the first variant of this method, the train descriptors are passed as an input argument. In the + second variant of the method, train descriptors collection that was set by DescriptorMatcher::add is + used. Optional mask (or masks) can be passed to specify which query and training descriptors can be + matched. Namely, queryDescriptors[i] can be matched with trainDescriptors[j] only if + mask.at\(i,j) is non-zero. + */ + CV_WRAP void match( InputArray queryDescriptors, InputArray trainDescriptors, + CV_OUT std::vector& matches, InputArray mask=noArray() ) const; + + /** @brief Finds the k best matches for each descriptor from a query set. + + @param queryDescriptors Query set of descriptors. + @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors + collection stored in the class object. + @param mask Mask specifying permissible matches between an input query and train matrices of + descriptors. + @param matches Matches. Each matches[i] is k or less matches for the same query descriptor. + @param k Count of best matches found per each query descriptor or less if a query descriptor has + less than k possible matches in total. + @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is + false, the matches vector has the same size as queryDescriptors rows. If compactResult is true, + the matches vector does not contain matches for fully masked-out query descriptors. + + These extended variants of DescriptorMatcher::match methods find several best matches for each query + descriptor. The matches are returned in the distance increasing order. See DescriptorMatcher::match + for the details about query and train descriptors. + */ + CV_WRAP void knnMatch( InputArray queryDescriptors, InputArray trainDescriptors, + CV_OUT std::vector >& matches, int k, + InputArray mask=noArray(), bool compactResult=false ) const; + + /** @brief For each query descriptor, finds the training descriptors not farther than the specified distance. + + @param queryDescriptors Query set of descriptors. + @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors + collection stored in the class object. + @param matches Found matches. + @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is + false, the matches vector has the same size as queryDescriptors rows. If compactResult is true, + the matches vector does not contain matches for fully masked-out query descriptors. + @param maxDistance Threshold for the distance between matched descriptors. Distance means here + metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured + in Pixels)! + @param mask Mask specifying permissible matches between an input query and train matrices of + descriptors. + + For each query descriptor, the methods find such training descriptors that the distance between the + query descriptor and the training descriptor is equal or smaller than maxDistance. Found matches are + returned in the distance increasing order. + */ + CV_WRAP void radiusMatch( InputArray queryDescriptors, InputArray trainDescriptors, + CV_OUT std::vector >& matches, float maxDistance, + InputArray mask=noArray(), bool compactResult=false ) const; + + /** @overload + @param queryDescriptors Query set of descriptors. + @param matches Matches. If a query descriptor is masked out in mask , no match is added for this + descriptor. So, matches size may be smaller than the query descriptors count. + @param masks Set of masks. Each masks[i] specifies permissible matches between the input query + descriptors and stored train descriptors from the i-th image trainDescCollection[i]. + */ + CV_WRAP void match( InputArray queryDescriptors, CV_OUT std::vector& matches, + InputArrayOfArrays masks=noArray() ); + /** @overload + @param queryDescriptors Query set of descriptors. + @param matches Matches. Each matches[i] is k or less matches for the same query descriptor. + @param k Count of best matches found per each query descriptor or less if a query descriptor has + less than k possible matches in total. + @param masks Set of masks. Each masks[i] specifies permissible matches between the input query + descriptors and stored train descriptors from the i-th image trainDescCollection[i]. + @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is + false, the matches vector has the same size as queryDescriptors rows. If compactResult is true, + the matches vector does not contain matches for fully masked-out query descriptors. + */ + CV_WRAP void knnMatch( InputArray queryDescriptors, CV_OUT std::vector >& matches, int k, + InputArrayOfArrays masks=noArray(), bool compactResult=false ); + /** @overload + @param queryDescriptors Query set of descriptors. + @param matches Found matches. + @param maxDistance Threshold for the distance between matched descriptors. Distance means here + metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured + in Pixels)! + @param masks Set of masks. Each masks[i] specifies permissible matches between the input query + descriptors and stored train descriptors from the i-th image trainDescCollection[i]. + @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is + false, the matches vector has the same size as queryDescriptors rows. If compactResult is true, + the matches vector does not contain matches for fully masked-out query descriptors. + */ + CV_WRAP void radiusMatch( InputArray queryDescriptors, CV_OUT std::vector >& matches, float maxDistance, + InputArrayOfArrays masks=noArray(), bool compactResult=false ); + + + CV_WRAP void write( const String& fileName ) const + { + FileStorage fs(fileName, FileStorage::WRITE); + write(fs); + } + + CV_WRAP void read( const String& fileName ) + { + FileStorage fs(fileName, FileStorage::READ); + read(fs.root()); + } + // Reads matcher object from a file node + // see corresponding cv::Algorithm method + CV_WRAP virtual void read( const FileNode& ) CV_OVERRIDE; + // Writes matcher object to a file storage + virtual void write( FileStorage& ) const CV_OVERRIDE; + + /** @brief Clones the matcher. + + @param emptyTrainData If emptyTrainData is false, the method creates a deep copy of the object, + that is, copies both parameters and train data. If emptyTrainData is true, the method creates an + object copy with the current parameters but with empty train data. + */ + CV_WRAP CV_NODISCARD_STD virtual Ptr clone( bool emptyTrainData=false ) const = 0; + + /** @brief Creates a descriptor matcher of a given type with the default parameters (using default + constructor). + + @param descriptorMatcherType Descriptor matcher type. Now the following matcher types are + supported: + - `BruteForce` (it uses L2 ) + - `BruteForce-L1` + - `BruteForce-Hamming` + - `BruteForce-Hamming(2)` + - `FlannBased` + */ + CV_WRAP static Ptr create( const String& descriptorMatcherType ); + + CV_WRAP static Ptr create( const DescriptorMatcher::MatcherType& matcherType ); + + + // see corresponding cv::Algorithm method + CV_WRAP inline void write(FileStorage& fs, const String& name) const { Algorithm::write(fs, name); } +#if CV_VERSION_MAJOR < 5 + inline void write(const Ptr& fs, const String& name) const { CV_Assert(fs); Algorithm::write(*fs, name); } +#endif + +protected: + /** + * Class to work with descriptors from several images as with one merged matrix. + * It is used e.g. in FlannBasedMatcher. + */ + class CV_EXPORTS DescriptorCollection + { + public: + DescriptorCollection(); + DescriptorCollection( const DescriptorCollection& collection ); + virtual ~DescriptorCollection(); + + // Vector of matrices "descriptors" will be merged to one matrix "mergedDescriptors" here. + void set( const std::vector& descriptors ); + virtual void clear(); + + const Mat& getDescriptors() const; + Mat getDescriptor( int imgIdx, int localDescIdx ) const; + Mat getDescriptor( int globalDescIdx ) const; + void getLocalIdx( int globalDescIdx, int& imgIdx, int& localDescIdx ) const; + + int size() const; + + protected: + Mat mergedDescriptors; + std::vector startIdxs; + }; + + //! In fact the matching is implemented only by the following two methods. These methods suppose + //! that the class object has been trained already. Public match methods call these methods + //! after calling train(). + virtual void knnMatchImpl( InputArray queryDescriptors, std::vector >& matches, int k, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) = 0; + virtual void radiusMatchImpl( InputArray queryDescriptors, std::vector >& matches, float maxDistance, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) = 0; + + static bool isPossibleMatch( InputArray mask, int queryIdx, int trainIdx ); + static bool isMaskedOut( InputArrayOfArrays masks, int queryIdx ); + + CV_NODISCARD_STD static Mat clone_op( Mat m ) { return m.clone(); } + void checkMasks( InputArrayOfArrays masks, int queryDescriptorsCount ) const; + + //! Collection of descriptors from train images. + std::vector trainDescCollection; + std::vector utrainDescCollection; +}; + +/** @brief Brute-force descriptor matcher. + +For each descriptor in the first set, this matcher finds the closest descriptor in the second set +by trying each one. This descriptor matcher supports masking permissible matches of descriptor +sets. + */ +class CV_EXPORTS_W BFMatcher : public DescriptorMatcher +{ +public: + /** @brief Brute-force matcher constructor (obsolete). Please use BFMatcher.create() + * + * + */ + CV_WRAP BFMatcher( int normType=NORM_L2, bool crossCheck=false ); + + virtual ~BFMatcher() {} + + virtual bool isMaskSupported() const CV_OVERRIDE { return true; } + + /** @brief Brute-force matcher create method. + @param normType One of NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2. L1 and L2 norms are + preferable choices for SIFT and SURF descriptors, NORM_HAMMING should be used with ORB, BRISK and + BRIEF, NORM_HAMMING2 should be used with ORB when WTA_K==3 or 4 (see ORB::ORB constructor + description). + @param crossCheck If it is false, this is will be default BFMatcher behaviour when it finds the k + nearest neighbors for each query descriptor. If crossCheck==true, then the knnMatch() method with + k=1 will only return pairs (i,j) such that for i-th query descriptor the j-th descriptor in the + matcher's collection is the nearest and vice versa, i.e. the BFMatcher will only return consistent + pairs. Such technique usually produces best results with minimal number of outliers when there are + enough matches. This is alternative to the ratio test, used by D. Lowe in SIFT paper. + */ + CV_WRAP static Ptr create( int normType=NORM_L2, bool crossCheck=false ) ; + + CV_NODISCARD_STD virtual Ptr clone( bool emptyTrainData=false ) const CV_OVERRIDE; +protected: + virtual void knnMatchImpl( InputArray queryDescriptors, std::vector >& matches, int k, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) CV_OVERRIDE; + virtual void radiusMatchImpl( InputArray queryDescriptors, std::vector >& matches, float maxDistance, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) CV_OVERRIDE; + + int normType; + bool crossCheck; +}; + +#if defined(HAVE_OPENCV_FLANN) || defined(CV_DOXYGEN) + +/** @brief Flann-based descriptor matcher. + +This matcher trains cv::flann::Index on a train descriptor collection and calls its nearest search +methods to find the best matches. So, this matcher may be faster when matching a large train +collection than the brute force matcher. FlannBasedMatcher does not support masking permissible +matches of descriptor sets because flann::Index does not support this. : + */ +class CV_EXPORTS_W FlannBasedMatcher : public DescriptorMatcher +{ +public: + CV_WRAP FlannBasedMatcher( const Ptr& indexParams=makePtr(), + const Ptr& searchParams=makePtr() ); + + virtual void add( InputArrayOfArrays descriptors ) CV_OVERRIDE; + virtual void clear() CV_OVERRIDE; + + // Reads matcher object from a file node + virtual void read( const FileNode& ) CV_OVERRIDE; + // Writes matcher object to a file storage + virtual void write( FileStorage& ) const CV_OVERRIDE; + + virtual void train() CV_OVERRIDE; + virtual bool isMaskSupported() const CV_OVERRIDE; + + CV_WRAP static Ptr create(); + + CV_NODISCARD_STD virtual Ptr clone( bool emptyTrainData=false ) const CV_OVERRIDE; +protected: + static void convertToDMatches( const DescriptorCollection& descriptors, + const Mat& indices, const Mat& distances, + std::vector >& matches ); + + virtual void knnMatchImpl( InputArray queryDescriptors, std::vector >& matches, int k, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) CV_OVERRIDE; + virtual void radiusMatchImpl( InputArray queryDescriptors, std::vector >& matches, float maxDistance, + InputArrayOfArrays masks=noArray(), bool compactResult=false ) CV_OVERRIDE; + + Ptr indexParams; + Ptr searchParams; + Ptr flannIndex; + + DescriptorCollection mergedDescriptors; + int addedDescCount; +}; + +#endif + +//! @} features2d_match + +/****************************************************************************************\ +* Drawing functions * +\****************************************************************************************/ + +//! @addtogroup features2d_draw +//! @{ + +enum struct DrawMatchesFlags +{ + DEFAULT = 0, //!< Output image matrix will be created (Mat::create), + //!< i.e. existing memory of output image may be reused. + //!< Two source image, matches and single keypoints will be drawn. + //!< For each keypoint only the center point will be drawn (without + //!< the circle around keypoint with keypoint size and orientation). + DRAW_OVER_OUTIMG = 1, //!< Output image matrix will not be created (Mat::create). + //!< Matches will be drawn on existing content of output image. + NOT_DRAW_SINGLE_POINTS = 2, //!< Single keypoints will not be drawn. + DRAW_RICH_KEYPOINTS = 4 //!< For each keypoint the circle around keypoint with keypoint size and + //!< orientation will be drawn. +}; +CV_ENUM_FLAGS(DrawMatchesFlags) + +/** @brief Draws keypoints. + +@param image Source image. +@param keypoints Keypoints from the source image. +@param outImage Output image. Its content depends on the flags value defining what is drawn in the +output image. See possible flags bit values below. +@param color Color of keypoints. +@param flags Flags setting drawing features. Possible flags bit values are defined by +DrawMatchesFlags. See details above in drawMatches . + +@note +For Python API, flags are modified as cv.DRAW_MATCHES_FLAGS_DEFAULT, +cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG, +cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS + */ +CV_EXPORTS_W void drawKeypoints( InputArray image, const std::vector& keypoints, InputOutputArray outImage, + const Scalar& color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT ); + +/** @brief Draws the found matches of keypoints from two images. + +@param img1 First source image. +@param keypoints1 Keypoints from the first source image. +@param img2 Second source image. +@param keypoints2 Keypoints from the second source image. +@param matches1to2 Matches from the first image to the second one, which means that keypoints1[i] +has a corresponding point in keypoints2[matches[i]] . +@param outImg Output image. Its content depends on the flags value defining what is drawn in the +output image. See possible flags bit values below. +@param matchColor Color of matches (lines and connected keypoints). If matchColor==Scalar::all(-1) +, the color is generated randomly. +@param singlePointColor Color of single keypoints (circles), which means that keypoints do not +have the matches. If singlePointColor==Scalar::all(-1) , the color is generated randomly. +@param matchesMask Mask determining which matches are drawn. If the mask is empty, all matches are +drawn. +@param flags Flags setting drawing features. Possible flags bit values are defined by +DrawMatchesFlags. + +This function draws matches of keypoints from two images in the output image. Match is a line +connecting two keypoints (circles). See cv::DrawMatchesFlags. + */ +CV_EXPORTS_W void drawMatches( InputArray img1, const std::vector& keypoints1, + InputArray img2, const std::vector& keypoints2, + const std::vector& matches1to2, InputOutputArray outImg, + const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), + const std::vector& matchesMask=std::vector(), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT ); + +/** @overload */ +CV_EXPORTS_W void drawMatches( InputArray img1, const std::vector& keypoints1, + InputArray img2, const std::vector& keypoints2, + const std::vector& matches1to2, InputOutputArray outImg, + const int matchesThickness, const Scalar& matchColor=Scalar::all(-1), + const Scalar& singlePointColor=Scalar::all(-1), const std::vector& matchesMask=std::vector(), + DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT ); + +CV_EXPORTS_AS(drawMatchesKnn) void drawMatches( InputArray img1, const std::vector& keypoints1, + InputArray img2, const std::vector& keypoints2, + const std::vector >& matches1to2, InputOutputArray outImg, + const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), + const std::vector >& matchesMask=std::vector >(), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT ); + +//! @} features2d_draw + +/****************************************************************************************\ +* Functions to evaluate the feature detectors and [generic] descriptor extractors * +\****************************************************************************************/ + +CV_EXPORTS void evaluateFeatureDetector( const Mat& img1, const Mat& img2, const Mat& H1to2, + std::vector* keypoints1, std::vector* keypoints2, + float& repeatability, int& correspCount, + const Ptr& fdetector=Ptr() ); + +CV_EXPORTS void computeRecallPrecisionCurve( const std::vector >& matches1to2, + const std::vector >& correctMatches1to2Mask, + std::vector& recallPrecisionCurve ); + +CV_EXPORTS float getRecall( const std::vector& recallPrecisionCurve, float l_precision ); +CV_EXPORTS int getNearestPoint( const std::vector& recallPrecisionCurve, float l_precision ); + +/****************************************************************************************\ +* Bag of visual words * +\****************************************************************************************/ + +//! @addtogroup features2d_category +//! @{ + +/** @brief Abstract base class for training the *bag of visual words* vocabulary from a set of descriptors. + +For details, see, for example, *Visual Categorization with Bags of Keypoints* by Gabriella Csurka, +Christopher R. Dance, Lixin Fan, Jutta Willamowski, Cedric Bray, 2004. : + */ +class CV_EXPORTS_W BOWTrainer +{ +public: + BOWTrainer(); + virtual ~BOWTrainer(); + + /** @brief Adds descriptors to a training set. + + @param descriptors Descriptors to add to a training set. Each row of the descriptors matrix is a + descriptor. + + The training set is clustered using clustermethod to construct the vocabulary. + */ + CV_WRAP void add( const Mat& descriptors ); + + /** @brief Returns a training set of descriptors. + */ + CV_WRAP const std::vector& getDescriptors() const; + + /** @brief Returns the count of all descriptors stored in the training set. + */ + CV_WRAP int descriptorsCount() const; + + CV_WRAP virtual void clear(); + + /** @overload */ + CV_WRAP virtual Mat cluster() const = 0; + + /** @brief Clusters train descriptors. + + @param descriptors Descriptors to cluster. Each row of the descriptors matrix is a descriptor. + Descriptors are not added to the inner train descriptor set. + + The vocabulary consists of cluster centers. So, this method returns the vocabulary. In the first + variant of the method, train descriptors stored in the object are clustered. In the second variant, + input descriptors are clustered. + */ + CV_WRAP virtual Mat cluster( const Mat& descriptors ) const = 0; + +protected: + std::vector descriptors; + int size; +}; + +/** @brief kmeans -based class to train visual vocabulary using the *bag of visual words* approach. : + */ +class CV_EXPORTS_W BOWKMeansTrainer : public BOWTrainer +{ +public: + /** @brief The constructor. + + @see cv::kmeans + */ + CV_WRAP BOWKMeansTrainer( int clusterCount, const TermCriteria& termcrit=TermCriteria(), + int attempts=3, int flags=KMEANS_PP_CENTERS ); + virtual ~BOWKMeansTrainer(); + + // Returns trained vocabulary (i.e. cluster centers). + CV_WRAP virtual Mat cluster() const CV_OVERRIDE; + CV_WRAP virtual Mat cluster( const Mat& descriptors ) const CV_OVERRIDE; + +protected: + + int clusterCount; + TermCriteria termcrit; + int attempts; + int flags; +}; + +/** @brief Class to compute an image descriptor using the *bag of visual words*. + +Such a computation consists of the following steps: + +1. Compute descriptors for a given image and its keypoints set. +2. Find the nearest visual words from the vocabulary for each keypoint descriptor. +3. Compute the bag-of-words image descriptor as is a normalized histogram of vocabulary words +encountered in the image. The i-th bin of the histogram is a frequency of i-th word of the +vocabulary in the given image. + */ +class CV_EXPORTS_W BOWImgDescriptorExtractor +{ +public: + /** @brief The constructor. + + @param dextractor Descriptor extractor that is used to compute descriptors for an input image and + its keypoints. + @param dmatcher Descriptor matcher that is used to find the nearest word of the trained vocabulary + for each keypoint descriptor of the image. + */ + CV_WRAP BOWImgDescriptorExtractor( const Ptr& dextractor, + const Ptr& dmatcher ); + /** @overload */ + BOWImgDescriptorExtractor( const Ptr& dmatcher ); + virtual ~BOWImgDescriptorExtractor(); + + /** @brief Sets a visual vocabulary. + + @param vocabulary Vocabulary (can be trained using the inheritor of BOWTrainer ). Each row of the + vocabulary is a visual word (cluster center). + */ + CV_WRAP void setVocabulary( const Mat& vocabulary ); + + /** @brief Returns the set vocabulary. + */ + CV_WRAP const Mat& getVocabulary() const; + + /** @brief Computes an image descriptor using the set visual vocabulary. + + @param image Image, for which the descriptor is computed. + @param keypoints Keypoints detected in the input image. + @param imgDescriptor Computed output image descriptor. + @param pointIdxsOfClusters Indices of keypoints that belong to the cluster. This means that + pointIdxsOfClusters[i] are keypoint indices that belong to the i -th cluster (word of vocabulary) + returned if it is non-zero. + @param descriptors Descriptors of the image keypoints that are returned if they are non-zero. + */ + void compute( InputArray image, std::vector& keypoints, OutputArray imgDescriptor, + std::vector >* pointIdxsOfClusters=0, Mat* descriptors=0 ); + /** @overload + @param keypointDescriptors Computed descriptors to match with vocabulary. + @param imgDescriptor Computed output image descriptor. + @param pointIdxsOfClusters Indices of keypoints that belong to the cluster. This means that + pointIdxsOfClusters[i] are keypoint indices that belong to the i -th cluster (word of vocabulary) + returned if it is non-zero. + */ + void compute( InputArray keypointDescriptors, OutputArray imgDescriptor, + std::vector >* pointIdxsOfClusters=0 ); + // compute() is not constant because DescriptorMatcher::match is not constant + + CV_WRAP_AS(compute) void compute2( const Mat& image, std::vector& keypoints, CV_OUT Mat& imgDescriptor ) + { compute(image,keypoints,imgDescriptor); } + + /** @brief Returns an image descriptor size if the vocabulary is set. Otherwise, it returns 0. + */ + CV_WRAP int descriptorSize() const; + + /** @brief Returns an image descriptor type. + */ + CV_WRAP int descriptorType() const; + +protected: + Mat vocabulary; + Ptr dextractor; + Ptr dmatcher; +}; + +//! @} features2d_category + +//! @} features2d + +} /* namespace cv */ + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/features2d/features2d.hpp b/Thirdparty/opencv2/include/opencv2/features2d/features2d.hpp new file mode 100644 index 0000000..e81df0a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/features2d/features2d.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/features2d.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/features2d/hal/interface.h b/Thirdparty/opencv2/include/opencv2/features2d/hal/interface.h new file mode 100644 index 0000000..bc3b084 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/features2d/hal/interface.h @@ -0,0 +1,33 @@ +#ifndef OPENCV_FEATURE2D_HAL_INTERFACE_H +#define OPENCV_FEATURE2D_HAL_INTERFACE_H + +#include "opencv2/core/cvdef.h" +//! @addtogroup features2d_hal_interface +//! @{ + +//! @name Fast feature detector types +//! @sa cv::FastFeatureDetector +//! @{ +#define CV_HAL_TYPE_5_8 0 +#define CV_HAL_TYPE_7_12 1 +#define CV_HAL_TYPE_9_16 2 +//! @} + +//! @name Key point +//! @sa cv::KeyPoint +//! @{ +struct CV_EXPORTS cvhalKeyPoint +{ + float x; + float y; + float size; + float angle; + float response; + int octave; + int class_id; +}; +//! @} + +//! @} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/flann.hpp b/Thirdparty/opencv2/include/opencv2/flann.hpp new file mode 100644 index 0000000..90ee59e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann.hpp @@ -0,0 +1,629 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_FLANN_HPP +#define OPENCV_FLANN_HPP + +#include "opencv2/core.hpp" +#include "opencv2/flann/miniflann.hpp" +#include "opencv2/flann/flann_base.hpp" + +/** +@defgroup flann Clustering and Search in Multi-Dimensional Spaces + +This section documents OpenCV's interface to the FLANN library. FLANN (Fast Library for Approximate +Nearest Neighbors) is a library that contains a collection of algorithms optimized for fast nearest +neighbor search in large datasets and for high dimensional features. More information about FLANN +can be found in @cite Muja2009 . +*/ + +namespace cvflann +{ + CV_EXPORTS flann_distance_t flann_distance_type(); + CV_DEPRECATED CV_EXPORTS void set_distance_type(flann_distance_t distance_type, int order); +} + + +namespace cv +{ +namespace flann +{ + + +//! @addtogroup flann +//! @{ + +template struct CvType {}; +template <> struct CvType { static int type() { return CV_8U; } }; +template <> struct CvType { static int type() { return CV_8S; } }; +template <> struct CvType { static int type() { return CV_16U; } }; +template <> struct CvType { static int type() { return CV_16S; } }; +template <> struct CvType { static int type() { return CV_32S; } }; +template <> struct CvType { static int type() { return CV_32F; } }; +template <> struct CvType { static int type() { return CV_64F; } }; + + +// bring the flann parameters into this namespace +using ::cvflann::get_param; +using ::cvflann::print_params; + +// bring the flann distances into this namespace +using ::cvflann::L2_Simple; +using ::cvflann::L2; +using ::cvflann::L1; +using ::cvflann::MinkowskiDistance; +using ::cvflann::MaxDistance; +using ::cvflann::HammingLUT; +using ::cvflann::Hamming; +using ::cvflann::Hamming2; +using ::cvflann::DNAmmingLUT; +using ::cvflann::DNAmming2; +using ::cvflann::HistIntersectionDistance; +using ::cvflann::HellingerDistance; +using ::cvflann::ChiSquareDistance; +using ::cvflann::KL_Divergence; + + +/** @brief The FLANN nearest neighbor index class. This class is templated with the type of elements for which +the index is built. + +`Distance` functor specifies the metric to be used to calculate the distance between two points. +There are several `Distance` functors that are readily available: + +cv::cvflann::L2_Simple - Squared Euclidean distance functor. +This is the simpler, unrolled version. This is preferable for very low dimensionality data (eg 3D points) + +cv::flann::L2 - Squared Euclidean distance functor, optimized version. + +cv::flann::L1 - Manhattan distance functor, optimized version. + +cv::flann::MinkowskiDistance - The Minkowski distance functor. +This is highly optimised with loop unrolling. +The computation of squared root at the end is omitted for efficiency. + +cv::flann::MaxDistance - The max distance functor. It computes the +maximum distance between two vectors. This distance is not a valid kdtree distance, it's not +dimensionwise additive. + +cv::flann::HammingLUT - %Hamming distance functor. It counts the bit +differences between two strings using a lookup table implementation. + +cv::flann::Hamming - %Hamming distance functor. Population count is +performed using library calls, if available. Lookup table implementation is used as a fallback. + +cv::flann::Hamming2 - %Hamming distance functor. Population count is +implemented in 12 arithmetic operations (one of which is multiplication). + +cv::flann::DNAmmingLUT - %Adaptation of the Hamming distance functor to DNA comparison. +As the four bases A, C, G, T of the DNA (or A, G, C, U for RNA) can be coded on 2 bits, +it counts the bits pairs differences between two sequences using a lookup table implementation. + +cv::flann::DNAmming2 - %Adaptation of the Hamming distance functor to DNA comparison. +Bases differences count are vectorised thanks to arithmetic operations using standard +registers (AVX2 and AVX-512 should come in a near future). + +cv::flann::HistIntersectionDistance - The histogram +intersection distance functor. + +cv::flann::HellingerDistance - The Hellinger distance functor. + +cv::flann::ChiSquareDistance - The chi-square distance functor. + +cv::flann::KL_Divergence - The Kullback-Leibler divergence functor. + +Although the provided implementations cover a vast range of cases, it is also possible to use +a custom implementation. The distance functor is a class whose `operator()` computes the distance +between two features. If the distance is also a kd-tree compatible distance, it should also provide an +`accum_dist()` method that computes the distance between individual feature dimensions. + +In addition to `operator()` and `accum_dist()`, a distance functor should also define the +`ElementType` and the `ResultType` as the types of the elements it operates on and the type of the +result it computes. If a distance functor can be used as a kd-tree distance (meaning that the full +distance between a pair of features can be accumulated from the partial distances between the +individual dimensions) a typedef `is_kdtree_distance` should be present inside the distance functor. +If the distance is not a kd-tree distance, but it's a distance in a vector space (the individual +dimensions of the elements it operates on can be accessed independently) a typedef +`is_vector_space_distance` should be defined inside the functor. If neither typedef is defined, the +distance is assumed to be a metric distance and will only be used with indexes operating on +generic metric distances. + */ +template +class GenericIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + /** @brief Constructs a nearest neighbor search index for a given dataset. + + @param features Matrix of containing the features(points) to index. The size of the matrix is + num_features x feature_dimensionality and the data type of the elements in the matrix must + coincide with the type of the index. + @param params Structure containing the index parameters. The type of index that will be + constructed depends on the type of this parameter. See the description. + @param distance + + The method constructs a fast search structure from a set of features using the specified algorithm + with specified parameters, as defined by params. params is a reference to one of the following class + IndexParams descendants: + + - **LinearIndexParams** When passing an object of this type, the index will perform a linear, + brute-force search. : + @code + struct LinearIndexParams : public IndexParams + { + }; + @endcode + - **KDTreeIndexParams** When passing an object of this type the index constructed will consist of + a set of randomized kd-trees which will be searched in parallel. : + @code + struct KDTreeIndexParams : public IndexParams + { + KDTreeIndexParams( int trees = 4 ); + }; + @endcode + - **HierarchicalClusteringIndexParams** When passing an object of this type the index constructed + will be a hierarchical tree of clusters, dividing each set of points into n clusters whose centers + are picked among the points without further refinement of their position. + This algorithm fits both floating, integer and binary vectors. : + @code + struct HierarchicalClusteringIndexParams : public IndexParams + { + HierarchicalClusteringIndexParams( + int branching = 32, + flann_centers_init_t centers_init = CENTERS_RANDOM, + int trees = 4, + int leaf_size = 100); + + }; + @endcode + - **KMeansIndexParams** When passing an object of this type the index constructed will be a + hierarchical k-means tree (one tree by default), dividing each set of points into n clusters + whose barycenters are refined iteratively. + Note that this algorithm has been extended to the support of binary vectors as an alternative + to LSH when knn search speed is the criterium. It will also outperform LSH when processing + directly (i.e. without the use of MCA/PCA) datasets whose points share mostly the same values + for most of the dimensions. It is recommended to set more than one tree with binary data. : + @code + struct KMeansIndexParams : public IndexParams + { + KMeansIndexParams( + int branching = 32, + int iterations = 11, + flann_centers_init_t centers_init = CENTERS_RANDOM, + float cb_index = 0.2, + int trees = 1); + }; + @endcode + - **CompositeIndexParams** When using a parameters object of this type the index created + combines the randomized kd-trees and the hierarchical k-means tree. : + @code + struct CompositeIndexParams : public IndexParams + { + CompositeIndexParams( + int trees = 4, + int branching = 32, + int iterations = 11, + flann_centers_init_t centers_init = CENTERS_RANDOM, + float cb_index = 0.2 ); + }; + @endcode + - **LshIndexParams** When using a parameters object of this type the index created uses + multi-probe LSH (by Multi-Probe LSH: Efficient Indexing for High-Dimensional Similarity Search + by Qin Lv, William Josephson, Zhe Wang, Moses Charikar, Kai Li., Proceedings of the 33rd + International Conference on Very Large Data Bases (VLDB). Vienna, Austria. September 2007). + This algorithm is designed for binary vectors. : + @code + struct LshIndexParams : public IndexParams + { + LshIndexParams( + int table_number, + int key_size, + int multi_probe_level ); + }; + @endcode + - **AutotunedIndexParams** When passing an object of this type the index created is + automatically tuned to offer the best performance, by choosing the optimal index type + (randomized kd-trees, hierarchical kmeans, linear) and parameters for the dataset provided. : + @code + struct AutotunedIndexParams : public IndexParams + { + AutotunedIndexParams( + float target_precision = 0.9, + float build_weight = 0.01, + float memory_weight = 0, + float sample_fraction = 0.1 ); + }; + @endcode + - **SavedIndexParams** This object type is used for loading a previously saved index from the + disk. : + @code + struct SavedIndexParams : public IndexParams + { + SavedIndexParams( String filename ); + }; + @endcode + */ + GenericIndex(const Mat& features, const ::cvflann::IndexParams& params, Distance distance = Distance()); + + ~GenericIndex(); + + /** @brief Performs a K-nearest neighbor search for a given query point using the index. + + @param query The query point + @param indices Vector that will contain the indices of the K-nearest neighbors found. It must have + at least knn size. + @param dists Vector that will contain the distances to the K-nearest neighbors found. It must have + at least knn size. + @param knn Number of nearest neighbors to search for. + @param params SearchParams + */ + void knnSearch(const std::vector& query, std::vector& indices, + std::vector& dists, int knn, const ::cvflann::SearchParams& params); + void knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& params); + + /** @brief Performs a radius nearest neighbor search for a given query point using the index. + + @param query The query point. + @param indices Vector that will contain the indices of the nearest neighbors found. + @param dists Vector that will contain the distances to the nearest neighbors found. It has the same + number of elements as indices. + @param radius The search radius. + @param params SearchParams + + This function returns the number of nearest neighbors found. + */ + int radiusSearch(const std::vector& query, std::vector& indices, + std::vector& dists, DistanceType radius, const ::cvflann::SearchParams& params); + int radiusSearch(const Mat& query, Mat& indices, Mat& dists, + DistanceType radius, const ::cvflann::SearchParams& params); + + void save(String filename) { nnIndex->save(filename); } + + int veclen() const { return nnIndex->veclen(); } + + int size() const { return (int)nnIndex->size(); } + + ::cvflann::IndexParams getParameters() { return nnIndex->getParameters(); } + + CV_DEPRECATED const ::cvflann::IndexParams* getIndexParameters() { return nnIndex->getIndexParameters(); } + +private: + ::cvflann::Index* nnIndex; + Mat _dataset; +}; + +//! @cond IGNORED + +#define FLANN_DISTANCE_CHECK \ + if ( ::cvflann::flann_distance_type() != cvflann::FLANN_DIST_L2) { \ + printf("[WARNING] You are using cv::flann::Index (or cv::flann::GenericIndex) and have also changed "\ + "the distance using cvflann::set_distance_type. This is no longer working as expected "\ + "(cv::flann::Index always uses L2). You should create the index templated on the distance, "\ + "for example for L1 distance use: GenericIndex< L1 > \n"); \ + } + + +template +GenericIndex::GenericIndex(const Mat& dataset, const ::cvflann::IndexParams& params, Distance distance) +: _dataset(dataset) +{ + CV_Assert(dataset.type() == CvType::type()); + CV_Assert(dataset.isContinuous()); + ::cvflann::Matrix m_dataset((ElementType*)_dataset.ptr(0), _dataset.rows, _dataset.cols); + + nnIndex = new ::cvflann::Index(m_dataset, params, distance); + + FLANN_DISTANCE_CHECK + + nnIndex->buildIndex(); +} + +template +GenericIndex::~GenericIndex() +{ + delete nnIndex; +} + +template +void GenericIndex::knnSearch(const std::vector& query, std::vector& indices, std::vector& dists, int knn, const ::cvflann::SearchParams& searchParams) +{ + ::cvflann::Matrix m_query((ElementType*)&query[0], 1, query.size()); + ::cvflann::Matrix m_indices(&indices[0], 1, indices.size()); + ::cvflann::Matrix m_dists(&dists[0], 1, dists.size()); + + FLANN_DISTANCE_CHECK + + nnIndex->knnSearch(m_query,m_indices,m_dists,knn,searchParams); +} + + +template +void GenericIndex::knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& searchParams) +{ + CV_Assert(queries.type() == CvType::type()); + CV_Assert(queries.isContinuous()); + ::cvflann::Matrix m_queries((ElementType*)queries.ptr(0), queries.rows, queries.cols); + + CV_Assert(indices.type() == CV_32S); + CV_Assert(indices.isContinuous()); + ::cvflann::Matrix m_indices((int*)indices.ptr(0), indices.rows, indices.cols); + + CV_Assert(dists.type() == CvType::type()); + CV_Assert(dists.isContinuous()); + ::cvflann::Matrix m_dists((DistanceType*)dists.ptr(0), dists.rows, dists.cols); + + FLANN_DISTANCE_CHECK + + nnIndex->knnSearch(m_queries,m_indices,m_dists,knn, searchParams); +} + +template +int GenericIndex::radiusSearch(const std::vector& query, std::vector& indices, std::vector& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams) +{ + ::cvflann::Matrix m_query((ElementType*)&query[0], 1, query.size()); + ::cvflann::Matrix m_indices(&indices[0], 1, indices.size()); + ::cvflann::Matrix m_dists(&dists[0], 1, dists.size()); + + FLANN_DISTANCE_CHECK + + return nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); +} + +template +int GenericIndex::radiusSearch(const Mat& query, Mat& indices, Mat& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams) +{ + CV_Assert(query.type() == CvType::type()); + CV_Assert(query.isContinuous()); + ::cvflann::Matrix m_query((ElementType*)query.ptr(0), query.rows, query.cols); + + CV_Assert(indices.type() == CV_32S); + CV_Assert(indices.isContinuous()); + ::cvflann::Matrix m_indices((int*)indices.ptr(0), indices.rows, indices.cols); + + CV_Assert(dists.type() == CvType::type()); + CV_Assert(dists.isContinuous()); + ::cvflann::Matrix m_dists((DistanceType*)dists.ptr(0), dists.rows, dists.cols); + + FLANN_DISTANCE_CHECK + + return nnIndex->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); +} + +/** + * @deprecated Use GenericIndex class instead + */ +template +class Index_ +{ +public: + typedef typename L2::ElementType ElementType; + typedef typename L2::ResultType DistanceType; + + CV_DEPRECATED Index_(const Mat& dataset, const ::cvflann::IndexParams& params) + { + printf("[WARNING] The cv::flann::Index_ class is deperecated, use cv::flann::GenericIndex instead\n"); + + CV_Assert(dataset.type() == CvType::type()); + CV_Assert(dataset.isContinuous()); + ::cvflann::Matrix m_dataset((ElementType*)dataset.ptr(0), dataset.rows, dataset.cols); + + if ( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L2 ) { + nnIndex_L1 = NULL; + nnIndex_L2 = new ::cvflann::Index< L2 >(m_dataset, params); + } + else if ( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L1 ) { + nnIndex_L1 = new ::cvflann::Index< L1 >(m_dataset, params); + nnIndex_L2 = NULL; + } + else { + printf("[ERROR] cv::flann::Index_ only provides backwards compatibility for the L1 and L2 distances. " + "For other distance types you must use cv::flann::GenericIndex\n"); + CV_Assert(0); + } + if (nnIndex_L1) nnIndex_L1->buildIndex(); + if (nnIndex_L2) nnIndex_L2->buildIndex(); + } + CV_DEPRECATED ~Index_() + { + if (nnIndex_L1) delete nnIndex_L1; + if (nnIndex_L2) delete nnIndex_L2; + } + + CV_DEPRECATED void knnSearch(const std::vector& query, std::vector& indices, std::vector& dists, int knn, const ::cvflann::SearchParams& searchParams) + { + ::cvflann::Matrix m_query((ElementType*)&query[0], 1, query.size()); + ::cvflann::Matrix m_indices(&indices[0], 1, indices.size()); + ::cvflann::Matrix m_dists(&dists[0], 1, dists.size()); + + if (nnIndex_L1) nnIndex_L1->knnSearch(m_query,m_indices,m_dists,knn,searchParams); + if (nnIndex_L2) nnIndex_L2->knnSearch(m_query,m_indices,m_dists,knn,searchParams); + } + CV_DEPRECATED void knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& searchParams) + { + CV_Assert(queries.type() == CvType::type()); + CV_Assert(queries.isContinuous()); + ::cvflann::Matrix m_queries((ElementType*)queries.ptr(0), queries.rows, queries.cols); + + CV_Assert(indices.type() == CV_32S); + CV_Assert(indices.isContinuous()); + ::cvflann::Matrix m_indices((int*)indices.ptr(0), indices.rows, indices.cols); + + CV_Assert(dists.type() == CvType::type()); + CV_Assert(dists.isContinuous()); + ::cvflann::Matrix m_dists((DistanceType*)dists.ptr(0), dists.rows, dists.cols); + + if (nnIndex_L1) nnIndex_L1->knnSearch(m_queries,m_indices,m_dists,knn, searchParams); + if (nnIndex_L2) nnIndex_L2->knnSearch(m_queries,m_indices,m_dists,knn, searchParams); + } + + CV_DEPRECATED int radiusSearch(const std::vector& query, std::vector& indices, std::vector& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams) + { + ::cvflann::Matrix m_query((ElementType*)&query[0], 1, query.size()); + ::cvflann::Matrix m_indices(&indices[0], 1, indices.size()); + ::cvflann::Matrix m_dists(&dists[0], 1, dists.size()); + + if (nnIndex_L1) return nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); + if (nnIndex_L2) return nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); + } + + CV_DEPRECATED int radiusSearch(const Mat& query, Mat& indices, Mat& dists, DistanceType radius, const ::cvflann::SearchParams& searchParams) + { + CV_Assert(query.type() == CvType::type()); + CV_Assert(query.isContinuous()); + ::cvflann::Matrix m_query((ElementType*)query.ptr(0), query.rows, query.cols); + + CV_Assert(indices.type() == CV_32S); + CV_Assert(indices.isContinuous()); + ::cvflann::Matrix m_indices((int*)indices.ptr(0), indices.rows, indices.cols); + + CV_Assert(dists.type() == CvType::type()); + CV_Assert(dists.isContinuous()); + ::cvflann::Matrix m_dists((DistanceType*)dists.ptr(0), dists.rows, dists.cols); + + if (nnIndex_L1) return nnIndex_L1->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); + if (nnIndex_L2) return nnIndex_L2->radiusSearch(m_query,m_indices,m_dists,radius,searchParams); + } + + CV_DEPRECATED void save(String filename) + { + if (nnIndex_L1) nnIndex_L1->save(filename); + if (nnIndex_L2) nnIndex_L2->save(filename); + } + + CV_DEPRECATED int veclen() const + { + if (nnIndex_L1) return nnIndex_L1->veclen(); + if (nnIndex_L2) return nnIndex_L2->veclen(); + } + + CV_DEPRECATED int size() const + { + if (nnIndex_L1) return nnIndex_L1->size(); + if (nnIndex_L2) return nnIndex_L2->size(); + } + + CV_DEPRECATED ::cvflann::IndexParams getParameters() + { + if (nnIndex_L1) return nnIndex_L1->getParameters(); + if (nnIndex_L2) return nnIndex_L2->getParameters(); + + } + + CV_DEPRECATED const ::cvflann::IndexParams* getIndexParameters() + { + if (nnIndex_L1) return nnIndex_L1->getIndexParameters(); + if (nnIndex_L2) return nnIndex_L2->getIndexParameters(); + } + +private: + // providing backwards compatibility for L2 and L1 distances (most common) + ::cvflann::Index< L2 >* nnIndex_L2; + ::cvflann::Index< L1 >* nnIndex_L1; +}; + +//! @endcond + +/** @brief Clusters features using hierarchical k-means algorithm. + +@param features The points to be clustered. The matrix must have elements of type +Distance::ElementType. +@param centers The centers of the clusters obtained. The matrix must have type +Distance::CentersType. The number of rows in this matrix represents the number of clusters desired, +however, because of the way the cut in the hierarchical tree is chosen, the number of clusters +computed will be the highest number of the form (branching-1)\*k+1 that's lower than the number of +clusters desired, where branching is the tree's branching factor (see description of the +KMeansIndexParams). +@param params Parameters used in the construction of the hierarchical k-means tree. +@param d Distance to be used for clustering. + +The method clusters the given feature vectors by constructing a hierarchical k-means tree and +choosing a cut in the tree that minimizes the cluster's variance. It returns the number of clusters +found. + */ +template +int hierarchicalClustering(const Mat& features, Mat& centers, const ::cvflann::KMeansIndexParams& params, + Distance d = Distance()) +{ + typedef typename Distance::ElementType ElementType; + typedef typename Distance::CentersType CentersType; + + CV_Assert(features.type() == CvType::type()); + CV_Assert(features.isContinuous()); + ::cvflann::Matrix m_features((ElementType*)features.ptr(0), features.rows, features.cols); + + CV_Assert(centers.type() == CvType::type()); + CV_Assert(centers.isContinuous()); + ::cvflann::Matrix m_centers((CentersType*)centers.ptr(0), centers.rows, centers.cols); + + return ::cvflann::hierarchicalClustering(m_features, m_centers, params, d); +} + +//! @cond IGNORED + +template +CV_DEPRECATED int hierarchicalClustering(const Mat& features, Mat& centers, const ::cvflann::KMeansIndexParams& params) +{ + printf("[WARNING] cv::flann::hierarchicalClustering is deprecated, use " + "cv::flann::hierarchicalClustering instead\n"); + + if ( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L2 ) { + return hierarchicalClustering< L2 >(features, centers, params); + } + else if ( ::cvflann::flann_distance_type() == cvflann::FLANN_DIST_L1 ) { + return hierarchicalClustering< L1 >(features, centers, params); + } + else { + printf("[ERROR] cv::flann::hierarchicalClustering only provides backwards " + "compatibility for the L1 and L2 distances. " + "For other distance types you must use cv::flann::hierarchicalClustering\n"); + CV_Assert(0); + } +} + +//! @endcond + +//! @} flann + +} } // namespace cv::flann + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/flann/all_indices.h b/Thirdparty/opencv2/include/opencv2/flann/all_indices.h new file mode 100644 index 0000000..03877ab --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/all_indices.h @@ -0,0 +1,162 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_ALL_INDICES_H_ +#define OPENCV_FLANN_ALL_INDICES_H_ + +//! @cond IGNORED + +#include "general.h" + +#include "nn_index.h" +#include "kdtree_index.h" +#include "kdtree_single_index.h" +#include "kmeans_index.h" +#include "composite_index.h" +#include "linear_index.h" +#include "hierarchical_clustering_index.h" +#include "lsh_index.h" +#include "autotuned_index.h" + + +namespace cvflann +{ + +template +struct index_creator +{ + static NNIndex* create(const Matrix& dataset, const IndexParams& params, const Distance& distance) + { + flann_algorithm_t index_type = get_param(params, "algorithm"); + + NNIndex* nnIndex; + switch (index_type) { + case FLANN_INDEX_LINEAR: + nnIndex = new LinearIndex(dataset, params, distance); + break; + case FLANN_INDEX_KDTREE_SINGLE: + nnIndex = new KDTreeSingleIndex(dataset, params, distance); + break; + case FLANN_INDEX_KDTREE: + nnIndex = new KDTreeIndex(dataset, params, distance); + break; + case FLANN_INDEX_KMEANS: + nnIndex = new KMeansIndex(dataset, params, distance); + break; + case FLANN_INDEX_COMPOSITE: + nnIndex = new CompositeIndex(dataset, params, distance); + break; + case FLANN_INDEX_AUTOTUNED: + nnIndex = new AutotunedIndex(dataset, params, distance); + break; + case FLANN_INDEX_HIERARCHICAL: + nnIndex = new HierarchicalClusteringIndex(dataset, params, distance); + break; + case FLANN_INDEX_LSH: + nnIndex = new LshIndex(dataset, params, distance); + break; + default: + FLANN_THROW(cv::Error::StsBadArg, "Unknown index type"); + } + + return nnIndex; + } +}; + +template +struct index_creator +{ + static NNIndex* create(const Matrix& dataset, const IndexParams& params, const Distance& distance) + { + flann_algorithm_t index_type = get_param(params, "algorithm"); + + NNIndex* nnIndex; + switch (index_type) { + case FLANN_INDEX_LINEAR: + nnIndex = new LinearIndex(dataset, params, distance); + break; + case FLANN_INDEX_KMEANS: + nnIndex = new KMeansIndex(dataset, params, distance); + break; + case FLANN_INDEX_HIERARCHICAL: + nnIndex = new HierarchicalClusteringIndex(dataset, params, distance); + break; + case FLANN_INDEX_LSH: + nnIndex = new LshIndex(dataset, params, distance); + break; + default: + FLANN_THROW(cv::Error::StsBadArg, "Unknown index type"); + } + + return nnIndex; + } +}; + +template +struct index_creator +{ + static NNIndex* create(const Matrix& dataset, const IndexParams& params, const Distance& distance) + { + flann_algorithm_t index_type = get_param(params, "algorithm"); + + NNIndex* nnIndex; + switch (index_type) { + case FLANN_INDEX_LINEAR: + nnIndex = new LinearIndex(dataset, params, distance); + break; + case FLANN_INDEX_KMEANS: + nnIndex = new KMeansIndex(dataset, params, distance); + break; + case FLANN_INDEX_HIERARCHICAL: + nnIndex = new HierarchicalClusteringIndex(dataset, params, distance); + break; + case FLANN_INDEX_LSH: + nnIndex = new LshIndex(dataset, params, distance); + break; + default: + FLANN_THROW(cv::Error::StsBadArg, "Unknown index type"); + } + + return nnIndex; + } +}; + +template +NNIndex* create_index_by_type(const Matrix& dataset, const IndexParams& params, const Distance& distance) +{ + return index_creator::create(dataset, params,distance); +} + +} + +//! @endcond + +#endif /* OPENCV_FLANN_ALL_INDICES_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/allocator.h b/Thirdparty/opencv2/include/opencv2/flann/allocator.h new file mode 100644 index 0000000..d5870a0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/allocator.h @@ -0,0 +1,196 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_ALLOCATOR_H_ +#define OPENCV_FLANN_ALLOCATOR_H_ + +//! @cond IGNORED + +#include +#include + + +namespace cvflann +{ + +/** + * Allocates (using C's malloc) a generic type T. + * + * Params: + * count = number of instances to allocate. + * Returns: pointer (of type T*) to memory buffer + */ +template +T* allocate(size_t count = 1) +{ + T* mem = (T*) ::malloc(sizeof(T)*count); + return mem; +} + + +/** + * Pooled storage allocator + * + * The following routines allow for the efficient allocation of storage in + * small chunks from a specified pool. Rather than allowing each structure + * to be freed individually, an entire pool of storage is freed at once. + * This method has two advantages over just using malloc() and free(). First, + * it is far more efficient for allocating small objects, as there is + * no overhead for remembering all the information needed to free each + * object or consolidating fragmented memory. Second, the decision about + * how long to keep an object is made at the time of allocation, and there + * is no need to track down all the objects to free them. + * + */ + +const size_t WORDSIZE=16; +const size_t BLOCKSIZE=8192; + +class PooledAllocator +{ + /* We maintain memory alignment to word boundaries by requiring that all + allocations be in multiples of the machine wordsize. */ + /* Size of machine word in bytes. Must be power of 2. */ + /* Minimum number of bytes requested at a time from the system. Must be multiple of WORDSIZE. */ + + + int remaining; /* Number of bytes left in current block of storage. */ + void* base; /* Pointer to base of current block of storage. */ + void* loc; /* Current location in block to next allocate memory. */ + int blocksize; + + +public: + int usedMemory; + int wastedMemory; + + /** + Default constructor. Initializes a new pool. + */ + PooledAllocator(int blockSize = BLOCKSIZE) + { + blocksize = blockSize; + remaining = 0; + base = NULL; + loc = NULL; + + usedMemory = 0; + wastedMemory = 0; + } + + /** + * Destructor. Frees all the memory allocated in this pool. + */ + ~PooledAllocator() + { + void* prev; + + while (base != NULL) { + prev = *((void**) base); /* Get pointer to prev block. */ + ::free(base); + base = prev; + } + } + + /** + * Returns a pointer to a piece of new memory of the given size in bytes + * allocated from the pool. + */ + void* allocateMemory(int size) + { + int blockSize; + + /* Round size up to a multiple of wordsize. The following expression + only works for WORDSIZE that is a power of 2, by masking last bits of + incremented size to zero. + */ + size = (size + (WORDSIZE - 1)) & ~(WORDSIZE - 1); + + /* Check whether a new block must be allocated. Note that the first word + of a block is reserved for a pointer to the previous block. + */ + if (size > remaining) { + + wastedMemory += remaining; + + /* Allocate new storage. */ + blockSize = (size + sizeof(void*) + (WORDSIZE-1) > BLOCKSIZE) ? + size + sizeof(void*) + (WORDSIZE-1) : BLOCKSIZE; + + // use the standard C malloc to allocate memory + void* m = ::malloc(blockSize); + if (!m) { + fprintf(stderr,"Failed to allocate memory.\n"); + return NULL; + } + + /* Fill first word of new block with pointer to previous block. */ + ((void**) m)[0] = base; + base = m; + + int shift = 0; + //int shift = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & (WORDSIZE-1))) & (WORDSIZE-1); + + remaining = blockSize - sizeof(void*) - shift; + loc = ((char*)m + sizeof(void*) + shift); + } + void* rloc = loc; + loc = (char*)loc + size; + remaining -= size; + + usedMemory += size; + + return rloc; + } + + /** + * Allocates (using this pool) a generic type T. + * + * Params: + * count = number of instances to allocate. + * Returns: pointer (of type T*) to memory buffer + */ + template + T* allocate(size_t count = 1) + { + T* mem = (T*) this->allocateMemory((int)(sizeof(T)*count)); + return mem; + } + +private: + PooledAllocator(const PooledAllocator &); // copy disabled + PooledAllocator& operator=(const PooledAllocator &); // assign disabled +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_ALLOCATOR_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/any.h b/Thirdparty/opencv2/include/opencv2/flann/any.h new file mode 100644 index 0000000..2228bd1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/any.h @@ -0,0 +1,355 @@ +#ifndef OPENCV_FLANN_ANY_H_ +#define OPENCV_FLANN_ANY_H_ +/* + * (C) Copyright Christopher Diggins 2005-2011 + * (C) Copyright Pablo Aguilar 2005 + * (C) Copyright Kevlin Henney 2001 + * + * Distributed under the Boost Software License, Version 1.0. (See + * accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt + * + * Adapted for FLANN by Marius Muja + */ + +//! @cond IGNORED + +#include "defines.h" +#include +#include +#include + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/utility.hpp" + +namespace cvflann +{ + +namespace anyimpl +{ + +struct bad_any_cast : public std::exception +{ + bad_any_cast() = default; + + bad_any_cast(const char* src, const char* dst) + : message_(cv::format("cvflann::bad_any_cast(from %s to %s)", src, dst)) {} + + + const char* what() const noexcept override + { + return message_.c_str(); + } + +private: + std::string message_{"cvflann::bad_any_cast"}; +}; + +#ifndef CV_THROW_IF_TYPE_MISMATCH +#define CV_THROW_IF_TYPE_MISMATCH(src_type_info, dst_type_info) \ + if ((src_type_info) != (dst_type_info)) \ + throw cvflann::anyimpl::bad_any_cast((src_type_info).name(), \ + (dst_type_info).name()) +#endif + +struct empty_any +{ +}; + +inline std::ostream& operator <<(std::ostream& out, const empty_any&) +{ + out << "[empty_any]"; + return out; +} + +struct base_any_policy +{ + virtual void static_delete(void** x) = 0; + virtual void copy_from_value(void const* src, void** dest) = 0; + virtual void clone(void* const* src, void** dest) = 0; + virtual void move(void* const* src, void** dest) = 0; + virtual void* get_value(void** src) = 0; + virtual const void* get_value(void* const * src) = 0; + virtual ::size_t get_size() = 0; + virtual const std::type_info& type() = 0; + virtual void print(std::ostream& out, void* const* src) = 0; + virtual ~base_any_policy() {} +}; + +template +struct typed_base_any_policy : base_any_policy +{ + virtual ::size_t get_size() CV_OVERRIDE { return sizeof(T); } + virtual const std::type_info& type() CV_OVERRIDE { return typeid(T); } + +}; + +template +struct small_any_policy CV_FINAL : typed_base_any_policy +{ + virtual void static_delete(void**) CV_OVERRIDE { } + virtual void copy_from_value(void const* src, void** dest) CV_OVERRIDE + { + new (dest) T(* reinterpret_cast(src)); + } + virtual void clone(void* const* src, void** dest) CV_OVERRIDE { *dest = *src; } + virtual void move(void* const* src, void** dest) CV_OVERRIDE { *dest = *src; } + virtual void* get_value(void** src) CV_OVERRIDE { return reinterpret_cast(src); } + virtual const void* get_value(void* const * src) CV_OVERRIDE { return reinterpret_cast(src); } + virtual void print(std::ostream& out, void* const* src) CV_OVERRIDE { out << *reinterpret_cast(src); } +}; + +template +struct big_any_policy CV_FINAL : typed_base_any_policy +{ + virtual void static_delete(void** x) CV_OVERRIDE + { + if (* x) delete (* reinterpret_cast(x)); + *x = NULL; + } + virtual void copy_from_value(void const* src, void** dest) CV_OVERRIDE + { + *dest = new T(*reinterpret_cast(src)); + } + virtual void clone(void* const* src, void** dest) CV_OVERRIDE + { + *dest = new T(**reinterpret_cast(src)); + } + virtual void move(void* const* src, void** dest) CV_OVERRIDE + { + (*reinterpret_cast(dest))->~T(); + **reinterpret_cast(dest) = **reinterpret_cast(src); + } + virtual void* get_value(void** src) CV_OVERRIDE { return *src; } + virtual const void* get_value(void* const * src) CV_OVERRIDE { return *src; } + virtual void print(std::ostream& out, void* const* src) CV_OVERRIDE { out << *reinterpret_cast(*src); } +}; + +template<> inline void big_any_policy::print(std::ostream& out, void* const* src) +{ + out << int(*reinterpret_cast(*src)); +} + +template<> inline void big_any_policy::print(std::ostream& out, void* const* src) +{ + out << int(*reinterpret_cast(*src)); +} + +template<> inline void big_any_policy::print(std::ostream& out, void* const* src) +{ + out << (*reinterpret_cast(*src)).c_str(); +} + +template +struct choose_policy +{ + typedef big_any_policy type; +}; + +template +struct choose_policy +{ + typedef small_any_policy type; +}; + +struct any; + +/// Choosing the policy for an any type is illegal, but should never happen. +/// This is designed to throw a compiler error. +template<> +struct choose_policy +{ + typedef void type; +}; + +/// Specializations for small types. +#define SMALL_POLICY(TYPE) \ + template<> \ + struct choose_policy { typedef small_any_policy type; \ + } + +SMALL_POLICY(signed char); +SMALL_POLICY(unsigned char); +SMALL_POLICY(signed short); +SMALL_POLICY(unsigned short); +SMALL_POLICY(signed int); +SMALL_POLICY(unsigned int); +SMALL_POLICY(signed long); +SMALL_POLICY(unsigned long); +SMALL_POLICY(float); +SMALL_POLICY(bool); + +#undef SMALL_POLICY + +template +class SinglePolicy +{ + SinglePolicy(); + SinglePolicy(const SinglePolicy& other); + SinglePolicy& operator=(const SinglePolicy& other); + +public: + static base_any_policy* get_policy(); +}; + +/// This function will return a different policy for each type. +template +inline base_any_policy* SinglePolicy::get_policy() +{ + static typename choose_policy::type policy; + return &policy; +} + +} // namespace anyimpl + +struct any +{ +private: + // fields + anyimpl::base_any_policy* policy; + void* object; + +public: + /// Initializing constructor. + template + any(const T& x) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) + { + assign(x); + } + + /// Empty constructor. + any() + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) + { } + + /// Special initializing constructor for string literals. + any(const char* x) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) + { + assign(x); + } + + /// Copy constructor. + any(const any& x) + : policy(anyimpl::SinglePolicy::get_policy()), object(NULL) + { + assign(x); + } + + /// Destructor. + ~any() + { + policy->static_delete(&object); + } + + /// Assignment function from another any. + any& assign(const any& x) + { + reset(); + policy = x.policy; + policy->clone(&x.object, &object); + return *this; + } + + /// Assignment function. + template + any& assign(const T& x) + { + reset(); + policy = anyimpl::SinglePolicy::get_policy(); + policy->copy_from_value(&x, &object); + return *this; + } + + /// Assignment operator. + template + any& operator=(const T& x) + { + return assign(x); + } + + /// Assignment operator. Template-based version above doesn't work as expected. We need regular assignment operator here. + any& operator=(const any& x) + { + return assign(x); + } + + /// Assignment operator, specialed for literal strings. + /// They have types like const char [6] which don't work as expected. + any& operator=(const char* x) + { + return assign(x); + } + + /// Utility functions + any& swap(any& x) + { + std::swap(policy, x.policy); + std::swap(object, x.object); + return *this; + } + + /// Cast operator. You can only cast to the original type. + template + T& cast() + { + CV_THROW_IF_TYPE_MISMATCH(policy->type(), typeid(T)); + T* r = reinterpret_cast(policy->get_value(&object)); + return *r; + } + + /// Cast operator. You can only cast to the original type. + template + const T& cast() const + { + CV_THROW_IF_TYPE_MISMATCH(policy->type(), typeid(T)); + const T* r = reinterpret_cast(policy->get_value(&object)); + return *r; + } + + /// Returns true if the any contains no value. + bool empty() const + { + return policy->type() == typeid(anyimpl::empty_any); + } + + /// Frees any allocated memory, and sets the value to NULL. + void reset() + { + policy->static_delete(&object); + policy = anyimpl::SinglePolicy::get_policy(); + } + + /// Returns true if the two types are the same. + bool compatible(const any& x) const + { + return policy->type() == x.policy->type(); + } + + /// Returns if the type is compatible with the policy + template + bool has_type() + { + return policy->type() == typeid(T); + } + + const std::type_info& type() const + { + return policy->type(); + } + + friend std::ostream& operator <<(std::ostream& out, const any& any_val); +}; + +inline std::ostream& operator <<(std::ostream& out, const any& any_val) +{ + any_val.policy->print(out,&any_val.object); + return out; +} + +} + +//! @endcond + +#endif // OPENCV_FLANN_ANY_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/autotuned_index.h b/Thirdparty/opencv2/include/opencv2/flann/autotuned_index.h new file mode 100644 index 0000000..d90f739 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/autotuned_index.h @@ -0,0 +1,594 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ +#ifndef OPENCV_FLANN_AUTOTUNED_INDEX_H_ +#define OPENCV_FLANN_AUTOTUNED_INDEX_H_ + +//! @cond IGNORED + +#include + +#include "nn_index.h" +#include "ground_truth.h" +#include "index_testing.h" +#include "sampling.h" +#include "kdtree_index.h" +#include "kdtree_single_index.h" +#include "kmeans_index.h" +#include "composite_index.h" +#include "linear_index.h" +#include "logger.h" + +namespace cvflann +{ + +template +NNIndex* create_index_by_type(const Matrix& dataset, const IndexParams& params, const Distance& distance); + + +struct AutotunedIndexParams : public IndexParams +{ + AutotunedIndexParams(float target_precision = 0.8, float build_weight = 0.01, float memory_weight = 0, float sample_fraction = 0.1) + { + (*this)["algorithm"] = FLANN_INDEX_AUTOTUNED; + // precision desired (used for autotuning, -1 otherwise) + (*this)["target_precision"] = target_precision; + // build tree time weighting factor + (*this)["build_weight"] = build_weight; + // index memory weighting factor + (*this)["memory_weight"] = memory_weight; + // what fraction of the dataset to use for autotuning + (*this)["sample_fraction"] = sample_fraction; + } +}; + + +template +class AutotunedIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + AutotunedIndex(const Matrix& inputData, const IndexParams& params = AutotunedIndexParams(), Distance d = Distance()) : + dataset_(inputData), distance_(d) + { + target_precision_ = get_param(params, "target_precision",0.8f); + build_weight_ = get_param(params,"build_weight", 0.01f); + memory_weight_ = get_param(params, "memory_weight", 0.0f); + sample_fraction_ = get_param(params,"sample_fraction", 0.1f); + bestIndex_ = NULL; + speedup_ = 0; + } + + AutotunedIndex(const AutotunedIndex&); + AutotunedIndex& operator=(const AutotunedIndex&); + + virtual ~AutotunedIndex() + { + if (bestIndex_ != NULL) { + delete bestIndex_; + bestIndex_ = NULL; + } + } + + /** + * Method responsible with building the index. + */ + virtual void buildIndex() CV_OVERRIDE + { + std::ostringstream stream; + bestParams_ = estimateBuildParams(); + print_params(bestParams_, stream); + Logger::info("----------------------------------------------------\n"); + Logger::info("Autotuned parameters:\n"); + Logger::info("%s", stream.str().c_str()); + Logger::info("----------------------------------------------------\n"); + + bestIndex_ = create_index_by_type(dataset_, bestParams_, distance_); + bestIndex_->buildIndex(); + speedup_ = estimateSearchParams(bestSearchParams_); + stream.str(std::string()); + print_params(bestSearchParams_, stream); + Logger::info("----------------------------------------------------\n"); + Logger::info("Search parameters:\n"); + Logger::info("%s", stream.str().c_str()); + Logger::info("----------------------------------------------------\n"); + } + + /** + * Saves the index to a stream + */ + virtual void saveIndex(FILE* stream) CV_OVERRIDE + { + save_value(stream, (int)bestIndex_->getType()); + bestIndex_->saveIndex(stream); + save_value(stream, get_param(bestSearchParams_, "checks")); + } + + /** + * Loads the index from a stream + */ + virtual void loadIndex(FILE* stream) CV_OVERRIDE + { + int index_type; + + load_value(stream, index_type); + IndexParams params; + params["algorithm"] = (flann_algorithm_t)index_type; + bestIndex_ = create_index_by_type(dataset_, params, distance_); + bestIndex_->loadIndex(stream); + int checks; + load_value(stream, checks); + bestSearchParams_["checks"] = checks; + } + + /** + * Method that searches for nearest-neighbors + */ + virtual void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + int checks = get_param(searchParams,"checks",FLANN_CHECKS_AUTOTUNED); + if (checks == FLANN_CHECKS_AUTOTUNED) { + bestIndex_->findNeighbors(result, vec, bestSearchParams_); + } + else { + bestIndex_->findNeighbors(result, vec, searchParams); + } + } + + + IndexParams getParameters() const CV_OVERRIDE + { + return bestIndex_->getParameters(); + } + + SearchParams getSearchParameters() const + { + return bestSearchParams_; + } + + float getSpeedup() const + { + return speedup_; + } + + + /** + * Number of features in this index. + */ + virtual size_t size() const CV_OVERRIDE + { + return bestIndex_->size(); + } + + /** + * The length of each vector in this index. + */ + virtual size_t veclen() const CV_OVERRIDE + { + return bestIndex_->veclen(); + } + + /** + * The amount of memory (in bytes) this index uses. + */ + virtual int usedMemory() const CV_OVERRIDE + { + return bestIndex_->usedMemory(); + } + + /** + * Algorithm name + */ + virtual flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_AUTOTUNED; + } + +private: + + struct CostData + { + float searchTimeCost; + float buildTimeCost; + float memoryCost; + float totalCost; + IndexParams params; + }; + + void evaluate_kmeans(CostData& cost) + { + StartStopTimer t; + int checks; + const int nn = 1; + + Logger::info("KMeansTree using params: max_iterations=%d, branching=%d\n", + get_param(cost.params,"iterations"), + get_param(cost.params,"branching")); + KMeansIndex kmeans(sampledDataset_, cost.params, distance_); + // measure index build time + t.start(); + kmeans.buildIndex(); + t.stop(); + float buildTime = (float)t.value; + + // measure search time + float searchTime = test_index_precision(kmeans, sampledDataset_, testDataset_, gt_matches_, target_precision_, checks, distance_, nn); + + float datasetMemory = float(sampledDataset_.rows * sampledDataset_.cols * sizeof(float)); + cost.memoryCost = (kmeans.usedMemory() + datasetMemory) / datasetMemory; + cost.searchTimeCost = searchTime; + cost.buildTimeCost = buildTime; + Logger::info("KMeansTree buildTime=%g, searchTime=%g, build_weight=%g\n", buildTime, searchTime, build_weight_); + } + + + void evaluate_kdtree(CostData& cost) + { + StartStopTimer t; + int checks; + const int nn = 1; + + Logger::info("KDTree using params: trees=%d\n", get_param(cost.params,"trees")); + KDTreeIndex kdtree(sampledDataset_, cost.params, distance_); + + t.start(); + kdtree.buildIndex(); + t.stop(); + float buildTime = (float)t.value; + + //measure search time + float searchTime = test_index_precision(kdtree, sampledDataset_, testDataset_, gt_matches_, target_precision_, checks, distance_, nn); + + float datasetMemory = float(sampledDataset_.rows * sampledDataset_.cols * sizeof(float)); + cost.memoryCost = (kdtree.usedMemory() + datasetMemory) / datasetMemory; + cost.searchTimeCost = searchTime; + cost.buildTimeCost = buildTime; + Logger::info("KDTree buildTime=%g, searchTime=%g\n", buildTime, searchTime); + } + + + // struct KMeansSimpleDownhillFunctor { + // + // Autotune& autotuner; + // KMeansSimpleDownhillFunctor(Autotune& autotuner_) : autotuner(autotuner_) {} + // + // float operator()(int* params) { + // + // float maxFloat = numeric_limits::max(); + // + // if (params[0]<2) return maxFloat; + // if (params[1]<0) return maxFloat; + // + // CostData c; + // c.params["algorithm"] = KMEANS; + // c.params["centers-init"] = CENTERS_RANDOM; + // c.params["branching"] = params[0]; + // c.params["max-iterations"] = params[1]; + // + // autotuner.evaluate_kmeans(c); + // + // return c.timeCost; + // + // } + // }; + // + // struct KDTreeSimpleDownhillFunctor { + // + // Autotune& autotuner; + // KDTreeSimpleDownhillFunctor(Autotune& autotuner_) : autotuner(autotuner_) {} + // + // float operator()(int* params) { + // float maxFloat = numeric_limits::max(); + // + // if (params[0]<1) return maxFloat; + // + // CostData c; + // c.params["algorithm"] = KDTREE; + // c.params["trees"] = params[0]; + // + // autotuner.evaluate_kdtree(c); + // + // return c.timeCost; + // + // } + // }; + + + + void optimizeKMeans(std::vector& costs) + { + Logger::info("KMEANS, Step 1: Exploring parameter space\n"); + + // explore kmeans parameters space using combinations of the parameters below + int maxIterations[] = { 1, 5, 10, 15 }; + int branchingFactors[] = { 16, 32, 64, 128, 256 }; + + int kmeansParamSpaceSize = FLANN_ARRAY_LEN(maxIterations) * FLANN_ARRAY_LEN(branchingFactors); + costs.reserve(costs.size() + kmeansParamSpaceSize); + + // evaluate kmeans for all parameter combinations + for (size_t i = 0; i < FLANN_ARRAY_LEN(maxIterations); ++i) { + for (size_t j = 0; j < FLANN_ARRAY_LEN(branchingFactors); ++j) { + CostData cost; + cost.params["algorithm"] = FLANN_INDEX_KMEANS; + cost.params["centers_init"] = FLANN_CENTERS_RANDOM; + cost.params["iterations"] = maxIterations[i]; + cost.params["branching"] = branchingFactors[j]; + + evaluate_kmeans(cost); + costs.push_back(cost); + } + } + + // Logger::info("KMEANS, Step 2: simplex-downhill optimization\n"); + // + // const int n = 2; + // // choose initial simplex points as the best parameters so far + // int kmeansNMPoints[n*(n+1)]; + // float kmeansVals[n+1]; + // for (int i=0;i& costs) + { + Logger::info("KD-TREE, Step 1: Exploring parameter space\n"); + + // explore kd-tree parameters space using the parameters below + int testTrees[] = { 1, 4, 8, 16, 32 }; + + // evaluate kdtree for all parameter combinations + for (size_t i = 0; i < FLANN_ARRAY_LEN(testTrees); ++i) { + CostData cost; + cost.params["algorithm"] = FLANN_INDEX_KDTREE; + cost.params["trees"] = testTrees[i]; + + evaluate_kdtree(cost); + costs.push_back(cost); + } + + // Logger::info("KD-TREE, Step 2: simplex-downhill optimization\n"); + // + // const int n = 1; + // // choose initial simplex points as the best parameters so far + // int kdtreeNMPoints[n*(n+1)]; + // float kdtreeVals[n+1]; + // for (int i=0;i costs; + + int sampleSize = int(sample_fraction_ * dataset_.rows); + int testSampleSize = std::min(sampleSize / 10, 1000); + + Logger::info("Entering autotuning, dataset size: %d, sampleSize: %d, testSampleSize: %d, target precision: %g\n", dataset_.rows, sampleSize, testSampleSize, target_precision_); + + // For a very small dataset, it makes no sense to build any fancy index, just + // use linear search + if (testSampleSize < 10) { + Logger::info("Choosing linear, dataset too small\n"); + return LinearIndexParams(); + } + + // We use a fraction of the original dataset to speedup the autotune algorithm + sampledDataset_ = random_sample(dataset_, sampleSize); + // We use a cross-validation approach, first we sample a testset from the dataset + testDataset_ = random_sample(sampledDataset_, testSampleSize, true); + + // We compute the ground truth using linear search + Logger::info("Computing ground truth... \n"); + gt_matches_ = Matrix(new int[testDataset_.rows], testDataset_.rows, 1); + StartStopTimer t; + t.start(); + compute_ground_truth(sampledDataset_, testDataset_, gt_matches_, 0, distance_); + t.stop(); + + CostData linear_cost; + linear_cost.searchTimeCost = (float)t.value; + linear_cost.buildTimeCost = 0; + linear_cost.memoryCost = 0; + linear_cost.params["algorithm"] = FLANN_INDEX_LINEAR; + + costs.push_back(linear_cost); + + // Start parameter autotune process + Logger::info("Autotuning parameters...\n"); + + optimizeKMeans(costs); + optimizeKDTree(costs); + + float bestTimeCost = costs[0].searchTimeCost; + for (size_t i = 0; i < costs.size(); ++i) { + float timeCost = costs[i].buildTimeCost * build_weight_ + costs[i].searchTimeCost; + if (timeCost < bestTimeCost) { + bestTimeCost = timeCost; + } + } + + float bestCost = costs[0].searchTimeCost / bestTimeCost; + IndexParams bestParams = costs[0].params; + if (bestTimeCost > 0) { + for (size_t i = 0; i < costs.size(); ++i) { + float crtCost = (costs[i].buildTimeCost * build_weight_ + costs[i].searchTimeCost) / bestTimeCost + + memory_weight_ * costs[i].memoryCost; + if (crtCost < bestCost) { + bestCost = crtCost; + bestParams = costs[i].params; + } + } + } + + delete[] gt_matches_.data; + delete[] testDataset_.data; + delete[] sampledDataset_.data; + + return bestParams; + } + + + + /** + * Estimates the search time parameters needed to get the desired precision. + * Precondition: the index is built + * Postcondition: the searchParams will have the optimum params set, also the speedup obtained over linear search. + */ + float estimateSearchParams(SearchParams& searchParams) + { + const int nn = 1; + const size_t SAMPLE_COUNT = 1000; + + CV_Assert(bestIndex_ != NULL && "Requires a valid index"); // must have a valid index + + float speedup = 0; + + int samples = (int)std::min(dataset_.rows / 10, SAMPLE_COUNT); + if (samples > 0) { + Matrix testDataset = random_sample(dataset_, samples); + + Logger::info("Computing ground truth\n"); + + // we need to compute the ground truth first + Matrix gt_matches(new int[testDataset.rows], testDataset.rows, 1); + StartStopTimer t; + t.start(); + compute_ground_truth(dataset_, testDataset, gt_matches, 1, distance_); + t.stop(); + float linear = (float)t.value; + + int checks; + Logger::info("Estimating number of checks\n"); + + float searchTime; + float cb_index; + if (bestIndex_->getType() == FLANN_INDEX_KMEANS) { + Logger::info("KMeans algorithm, estimating cluster border factor\n"); + KMeansIndex* kmeans = (KMeansIndex*)bestIndex_; + float bestSearchTime = -1; + float best_cb_index = -1; + int best_checks = -1; + for (cb_index = 0; cb_index < 1.1f; cb_index += 0.2f) { + kmeans->set_cb_index(cb_index); + searchTime = test_index_precision(*kmeans, dataset_, testDataset, gt_matches, target_precision_, checks, distance_, nn, 1); + if ((searchTime < bestSearchTime) || (bestSearchTime == -1)) { + bestSearchTime = searchTime; + best_cb_index = cb_index; + best_checks = checks; + } + } + searchTime = bestSearchTime; + cb_index = best_cb_index; + checks = best_checks; + + kmeans->set_cb_index(best_cb_index); + Logger::info("Optimum cb_index: %g\n", cb_index); + bestParams_["cb_index"] = cb_index; + } + else { + searchTime = test_index_precision(*bestIndex_, dataset_, testDataset, gt_matches, target_precision_, checks, distance_, nn, 1); + } + + Logger::info("Required number of checks: %d \n", checks); + searchParams["checks"] = checks; + + speedup = linear / searchTime; + + delete[] gt_matches.data; + delete[] testDataset.data; + } + + return speedup; + } + +private: + NNIndex* bestIndex_; + + IndexParams bestParams_; + SearchParams bestSearchParams_; + + Matrix sampledDataset_; + Matrix testDataset_; + Matrix gt_matches_; + + float speedup_; + + /** + * The dataset used by this index + */ + const Matrix dataset_; + + /** + * Index parameters + */ + float target_precision_; + float build_weight_; + float memory_weight_; + float sample_fraction_; + + Distance distance_; + + +}; +} + +//! @endcond + +#endif /* OPENCV_FLANN_AUTOTUNED_INDEX_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/composite_index.h b/Thirdparty/opencv2/include/opencv2/flann/composite_index.h new file mode 100644 index 0000000..37a6223 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/composite_index.h @@ -0,0 +1,196 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_COMPOSITE_INDEX_H_ +#define OPENCV_FLANN_COMPOSITE_INDEX_H_ + +//! @cond IGNORED + +#include "nn_index.h" +#include "kdtree_index.h" +#include "kmeans_index.h" + +namespace cvflann +{ + +/** + * Index parameters for the CompositeIndex. + */ +struct CompositeIndexParams : public IndexParams +{ + CompositeIndexParams(int trees = 4, int branching = 32, int iterations = 11, + flann_centers_init_t centers_init = FLANN_CENTERS_RANDOM, float cb_index = 0.2 ) + { + (*this)["algorithm"] = FLANN_INDEX_KMEANS; + // number of randomized trees to use (for kdtree) + (*this)["trees"] = trees; + // branching factor + (*this)["branching"] = branching; + // max iterations to perform in one kmeans clustering (kmeans tree) + (*this)["iterations"] = iterations; + // algorithm used for picking the initial cluster centers for kmeans tree + (*this)["centers_init"] = centers_init; + // cluster boundary index. Used when searching the kmeans tree + (*this)["cb_index"] = cb_index; + } +}; + + +/** + * This index builds a kd-tree index and a k-means index and performs nearest + * neighbour search both indexes. This gives a slight boost in search performance + * as some of the neighbours that are missed by one index are found by the other. + */ +template +class CompositeIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + /** + * Index constructor + * @param inputData dataset containing the points to index + * @param params Index parameters + * @param d Distance functor + */ + CompositeIndex(const Matrix& inputData, const IndexParams& params = CompositeIndexParams(), + Distance d = Distance()) : index_params_(params) + { + kdtree_index_ = new KDTreeIndex(inputData, params, d); + kmeans_index_ = new KMeansIndex(inputData, params, d); + + } + + CompositeIndex(const CompositeIndex&); + CompositeIndex& operator=(const CompositeIndex&); + + virtual ~CompositeIndex() + { + delete kdtree_index_; + delete kmeans_index_; + } + + /** + * @return The index type + */ + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_COMPOSITE; + } + + /** + * @return Size of the index + */ + size_t size() const CV_OVERRIDE + { + return kdtree_index_->size(); + } + + /** + * \returns The dimensionality of the features in this index. + */ + size_t veclen() const CV_OVERRIDE + { + return kdtree_index_->veclen(); + } + + /** + * \returns The amount of memory (in bytes) used by the index. + */ + int usedMemory() const CV_OVERRIDE + { + return kmeans_index_->usedMemory() + kdtree_index_->usedMemory(); + } + + /** + * \brief Builds the index + */ + void buildIndex() CV_OVERRIDE + { + Logger::info("Building kmeans tree...\n"); + kmeans_index_->buildIndex(); + Logger::info("Building kdtree tree...\n"); + kdtree_index_->buildIndex(); + } + + /** + * \brief Saves the index to a stream + * \param stream The stream to save the index to + */ + void saveIndex(FILE* stream) CV_OVERRIDE + { + kmeans_index_->saveIndex(stream); + kdtree_index_->saveIndex(stream); + } + + /** + * \brief Loads the index from a stream + * \param stream The stream from which the index is loaded + */ + void loadIndex(FILE* stream) CV_OVERRIDE + { + kmeans_index_->loadIndex(stream); + kdtree_index_->loadIndex(stream); + } + + /** + * \returns The index parameters + */ + IndexParams getParameters() const CV_OVERRIDE + { + return index_params_; + } + + /** + * \brief Method that searches for nearest-neighbours + */ + void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + kmeans_index_->findNeighbors(result, vec, searchParams); + kdtree_index_->findNeighbors(result, vec, searchParams); + } + +private: + /** The k-means index */ + KMeansIndex* kmeans_index_; + + /** The kd-tree index */ + KDTreeIndex* kdtree_index_; + + /** The index parameters */ + const IndexParams index_params_; +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_COMPOSITE_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/config.h b/Thirdparty/opencv2/include/opencv2/flann/config.h new file mode 100644 index 0000000..c9342c0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/config.h @@ -0,0 +1,42 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_CONFIG_H_ +#define OPENCV_FLANN_CONFIG_H_ + +//! @cond IGNORED + +#ifdef FLANN_VERSION_ +#undef FLANN_VERSION_ +#endif +#define FLANN_VERSION_ "1.6.10" + +//! @endcond + +#endif /* OPENCV_FLANN_CONFIG_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/defines.h b/Thirdparty/opencv2/include/opencv2/flann/defines.h new file mode 100644 index 0000000..8ab8329 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/defines.h @@ -0,0 +1,169 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_DEFINES_H_ +#define OPENCV_FLANN_DEFINES_H_ + +//! @cond IGNORED + +#include "config.h" + +#ifdef FLANN_EXPORT +#undef FLANN_EXPORT +#endif +#ifdef _WIN32 +/* win32 dll export/import directives */ + #ifdef FLANN_EXPORTS + #define FLANN_EXPORT __declspec(dllexport) + #elif defined(FLANN_STATIC) + #define FLANN_EXPORT + #else + #define FLANN_EXPORT __declspec(dllimport) + #endif +#else +/* unix needs nothing */ + #define FLANN_EXPORT +#endif + + +#undef FLANN_PLATFORM_32_BIT +#undef FLANN_PLATFORM_64_BIT +#if defined __amd64__ || defined __x86_64__ || defined _WIN64 || defined _M_X64 +#define FLANN_PLATFORM_64_BIT +#else +#define FLANN_PLATFORM_32_BIT +#endif + + +#undef FLANN_ARRAY_LEN +#define FLANN_ARRAY_LEN(a) (sizeof(a)/sizeof(a[0])) + +namespace cvflann { + +/* Nearest neighbour index algorithms */ +enum flann_algorithm_t +{ + FLANN_INDEX_LINEAR = 0, + FLANN_INDEX_KDTREE = 1, + FLANN_INDEX_KMEANS = 2, + FLANN_INDEX_COMPOSITE = 3, + FLANN_INDEX_KDTREE_SINGLE = 4, + FLANN_INDEX_HIERARCHICAL = 5, + FLANN_INDEX_LSH = 6, + FLANN_INDEX_SAVED = 254, + FLANN_INDEX_AUTOTUNED = 255, + + // deprecated constants, should use the FLANN_INDEX_* ones instead + LINEAR = 0, + KDTREE = 1, + KMEANS = 2, + COMPOSITE = 3, + KDTREE_SINGLE = 4, + SAVED = 254, + AUTOTUNED = 255 +}; + + + +enum flann_centers_init_t +{ + FLANN_CENTERS_RANDOM = 0, + FLANN_CENTERS_GONZALES = 1, + FLANN_CENTERS_KMEANSPP = 2, + FLANN_CENTERS_GROUPWISE = 3, + + // deprecated constants, should use the FLANN_CENTERS_* ones instead + CENTERS_RANDOM = 0, + CENTERS_GONZALES = 1, + CENTERS_KMEANSPP = 2 +}; + +enum flann_log_level_t +{ + FLANN_LOG_NONE = 0, + FLANN_LOG_FATAL = 1, + FLANN_LOG_ERROR = 2, + FLANN_LOG_WARN = 3, + FLANN_LOG_INFO = 4 +}; + +enum flann_distance_t +{ + FLANN_DIST_EUCLIDEAN = 1, + FLANN_DIST_L2 = 1, + FLANN_DIST_MANHATTAN = 2, + FLANN_DIST_L1 = 2, + FLANN_DIST_MINKOWSKI = 3, + FLANN_DIST_MAX = 4, + FLANN_DIST_HIST_INTERSECT = 5, + FLANN_DIST_HELLINGER = 6, + FLANN_DIST_CHI_SQUARE = 7, + FLANN_DIST_CS = 7, + FLANN_DIST_KULLBACK_LEIBLER = 8, + FLANN_DIST_KL = 8, + FLANN_DIST_HAMMING = 9, + FLANN_DIST_DNAMMING = 10, + + // deprecated constants, should use the FLANN_DIST_* ones instead + EUCLIDEAN = 1, + MANHATTAN = 2, + MINKOWSKI = 3, + MAX_DIST = 4, + HIST_INTERSECT = 5, + HELLINGER = 6, + CS = 7, + KL = 8, + KULLBACK_LEIBLER = 8 +}; + +enum flann_datatype_t +{ + FLANN_INT8 = 0, + FLANN_INT16 = 1, + FLANN_INT32 = 2, + FLANN_INT64 = 3, + FLANN_UINT8 = 4, + FLANN_UINT16 = 5, + FLANN_UINT32 = 6, + FLANN_UINT64 = 7, + FLANN_FLOAT32 = 8, + FLANN_FLOAT64 = 9 +}; + +enum +{ + FLANN_CHECKS_UNLIMITED = -1, + FLANN_CHECKS_AUTOTUNED = -2 +}; + +} + +//! @endcond + +#endif /* OPENCV_FLANN_DEFINES_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/dist.h b/Thirdparty/opencv2/include/opencv2/flann/dist.h new file mode 100644 index 0000000..2d7cbf1 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/dist.h @@ -0,0 +1,1292 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_DIST_H_ +#define OPENCV_FLANN_DIST_H_ + +//! @cond IGNORED + +#include +#include +#include +#ifdef _MSC_VER +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif + +#include "defines.h" + +#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) +# include +#endif + +#if defined(__ARM_NEON__) && !defined(__CUDACC__) +# include "arm_neon.h" +#endif + +namespace cvflann +{ + +template +inline T abs(T x) { return (x<0) ? -x : x; } + +template<> +inline int abs(int x) { return ::abs(x); } + +template<> +inline float abs(float x) { return fabsf(x); } + +template<> +inline double abs(double x) { return fabs(x); } + + +template +inline TargetType round(float x) { return static_cast(x); } + +template<> +inline unsigned int round(float x) { return static_cast(x + 0.5f); } + +template<> +inline unsigned short round(float x) { return static_cast(x + 0.5f); } + +template<> +inline unsigned char round(float x) { return static_cast(x + 0.5f); } + +template<> +inline long long round(float x) { return static_cast(x + 0.5f); } + +template<> +inline long round(float x) { return static_cast(x + 0.5f); } + +template<> +inline int round(float x) { return static_cast(x + 0.5f) - (x<0); } + +template<> +inline short round(float x) { return static_cast(x + 0.5f) - (x<0); } + +template<> +inline char round(float x) { return static_cast(x + 0.5f) - (x<0); } + + +template +inline TargetType round(double x) { return static_cast(x); } + +template<> +inline unsigned int round(double x) { return static_cast(x + 0.5); } + +template<> +inline unsigned short round(double x) { return static_cast(x + 0.5); } + +template<> +inline unsigned char round(double x) { return static_cast(x + 0.5); } + +template<> +inline long long round(double x) { return static_cast(x + 0.5); } + +template<> +inline long round(double x) { return static_cast(x + 0.5); } + +template<> +inline int round(double x) { return static_cast(x + 0.5) - (x<0); } + +template<> +inline short round(double x) { return static_cast(x + 0.5) - (x<0); } + +template<> +inline char round(double x) { return static_cast(x + 0.5) - (x<0); } + + +template +struct Accumulator { typedef T Type; }; +template<> +struct Accumulator { typedef float Type; }; +template<> +struct Accumulator { typedef float Type; }; +template<> +struct Accumulator { typedef float Type; }; +template<> +struct Accumulator { typedef float Type; }; +template<> +struct Accumulator { typedef float Type; }; +template<> +struct Accumulator { typedef float Type; }; + +#undef True +#undef False + +class True +{ +public: + static const bool val = true; +}; + +class False +{ +public: + static const bool val = false; +}; + + +/* + * This is a "zero iterator". It basically behaves like a zero filled + * array to all algorithms that use arrays as iterators (STL style). + * It's useful when there's a need to compute the distance between feature + * and origin it and allows for better compiler optimisation than using a + * zero-filled array. + */ +template +struct ZeroIterator +{ + + T operator*() + { + return 0; + } + + T operator[](int) + { + return 0; + } + + const ZeroIterator& operator ++() + { + return *this; + } + + ZeroIterator operator ++(int) + { + return *this; + } + + ZeroIterator& operator+=(int) + { + return *this; + } + +}; + + + +/** + * Squared Euclidean distance functor. + * + * This is the simpler, unrolled version. This is preferable for + * very low dimensionality data (eg 3D points) + */ +template +struct L2_Simple +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const + { + ResultType result = ResultType(); + ResultType diff; + for(size_t i = 0; i < size; ++i ) { + diff = (ResultType)(*a++ - *b++); + result += diff*diff; + } + return result; + } + + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + return (a-b)*(a-b); + } +}; + + + +/** + * Squared Euclidean distance functor, optimized version + */ +template +struct L2 +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the squared Euclidean distance between two vectors. + * + * This is highly optimised, with loop unrolling, as it is one + * of the most expensive inner loops. + * + * The computation of squared root at the end is omitted for + * efficiency. + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType diff0, diff1, diff2, diff3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + diff0 = (ResultType)(a[0] - b[0]); + diff1 = (ResultType)(a[1] - b[1]); + diff2 = (ResultType)(a[2] - b[2]); + diff3 = (ResultType)(a[3] - b[3]); + result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3; + a += 4; + b += 4; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + /* Process last 0-3 pixels. Not needed for standard vector lengths. */ + while (a < last) { + diff0 = (ResultType)(*a++ - *b++); + result += diff0 * diff0; + } + return result; + } + + /** + * Partial euclidean distance, using just one dimension. This is used by the + * kd-tree when computing partial distances while traversing the tree. + * + * Squared root is omitted for efficiency. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + return (a-b)*(a-b); + } +}; + + +/* + * Manhattan distance functor, optimized version + */ +template +struct L1 +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the Manhattan (L_1) distance between two vectors. + * + * This is highly optimised, with loop unrolling, as it is one + * of the most expensive inner loops. + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType diff0, diff1, diff2, diff3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + diff0 = (ResultType)abs(a[0] - b[0]); + diff1 = (ResultType)abs(a[1] - b[1]); + diff2 = (ResultType)abs(a[2] - b[2]); + diff3 = (ResultType)abs(a[3] - b[3]); + result += diff0 + diff1 + diff2 + diff3; + a += 4; + b += 4; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + /* Process last 0-3 pixels. Not needed for standard vector lengths. */ + while (a < last) { + diff0 = (ResultType)abs(*a++ - *b++); + result += diff0; + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + return abs(a-b); + } +}; + + + +template +struct MinkowskiDistance +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + int order; + + MinkowskiDistance(int order_) : order(order_) {} + + /** + * Compute the Minkowski (L_p) distance between two vectors. + * + * This is highly optimised, with loop unrolling, as it is one + * of the most expensive inner loops. + * + * The computation of squared root at the end is omitted for + * efficiency. + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType diff0, diff1, diff2, diff3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + diff0 = (ResultType)abs(a[0] - b[0]); + diff1 = (ResultType)abs(a[1] - b[1]); + diff2 = (ResultType)abs(a[2] - b[2]); + diff3 = (ResultType)abs(a[3] - b[3]); + result += pow(diff0,order) + pow(diff1,order) + pow(diff2,order) + pow(diff3,order); + a += 4; + b += 4; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + /* Process last 0-3 pixels. Not needed for standard vector lengths. */ + while (a < last) { + diff0 = (ResultType)abs(*a++ - *b++); + result += pow(diff0,order); + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + return pow(static_cast(abs(a-b)),order); + } +}; + + + +template +struct MaxDistance +{ + typedef False is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the max distance (L_infinity) between two vectors. + * + * This distance is not a valid kdtree distance, it's not dimensionwise additive. + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType diff0, diff1, diff2, diff3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + diff0 = abs(a[0] - b[0]); + diff1 = abs(a[1] - b[1]); + diff2 = abs(a[2] - b[2]); + diff3 = abs(a[3] - b[3]); + if (diff0>result) {result = diff0; } + if (diff1>result) {result = diff1; } + if (diff2>result) {result = diff2; } + if (diff3>result) {result = diff3; } + a += 4; + b += 4; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + /* Process last 0-3 pixels. Not needed for standard vector lengths. */ + while (a < last) { + diff0 = abs(*a++ - *b++); + result = (diff0>result) ? diff0 : result; + } + return result; + } + + /* This distance functor is not dimension-wise additive, which + * makes it an invalid kd-tree distance, not implementing the accum_dist method */ + +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Hamming distance functor - counts the bit differences between two strings - useful for the Brief descriptor + * bit count of A exclusive XOR'ed with B + */ +struct HammingLUT +{ + typedef False is_kdtree_distance; + typedef False is_vector_space_distance; + + typedef unsigned char ElementType; + typedef int ResultType; + typedef ElementType CentersType; + + /** this will count the bits in a ^ b + */ + template + ResultType operator()(const unsigned char* a, const Iterator2 b, size_t size) const + { + static const uchar popCountTable[] = + { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + ResultType result = 0; + const unsigned char* b2 = reinterpret_cast (b); + for (size_t i = 0; i < size; i++) { + result += popCountTable[a[i] ^ b2[i]]; + } + return result; + } + + + ResultType operator()(const unsigned char* a, const ZeroIterator b, size_t size) const + { + (void)b; + static const uchar popCountTable[] = + { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 + }; + ResultType result = 0; + for (size_t i = 0; i < size; i++) { + result += popCountTable[a[i]]; + } + return result; + } +}; + +/** + * Hamming distance functor (pop count between two binary vectors, i.e. xor them and count the number of bits set) + * That code was taken from brief.cpp in OpenCV + */ +template +struct Hamming +{ + typedef False is_kdtree_distance; + typedef False is_vector_space_distance; + + + typedef T ElementType; + typedef int ResultType; + typedef ElementType CentersType; + + template + ResultType operator()(const Iterator1 a, const Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const + { + ResultType result = 0; +#if defined(__ARM_NEON__) && !defined(__CUDACC__) + { + const unsigned char* a2 = reinterpret_cast (a); + const unsigned char* b2 = reinterpret_cast (b); + uint32x4_t bits = vmovq_n_u32(0); + for (size_t i = 0; i < size; i += 16) { + uint8x16_t A_vec = vld1q_u8 (a2 + i); + uint8x16_t B_vec = vld1q_u8 (b2 + i); + uint8x16_t AxorB = veorq_u8 (A_vec, B_vec); + uint8x16_t bitsSet = vcntq_u8 (AxorB); + uint16x8_t bitSet8 = vpaddlq_u8 (bitsSet); + uint32x4_t bitSet4 = vpaddlq_u16 (bitSet8); + bits = vaddq_u32(bits, bitSet4); + } + uint64x2_t bitSet2 = vpaddlq_u32 (bits); + result = vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),0); + result += vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),2); + } +#elif defined(__GNUC__) + { + //for portability just use unsigned long -- and use the __builtin_popcountll (see docs for __builtin_popcountll) + typedef unsigned long long pop_t; + const size_t modulo = size % sizeof(pop_t); + const pop_t* a2 = reinterpret_cast (a); + const pop_t* b2 = reinterpret_cast (b); + const pop_t* a2_end = a2 + (size / sizeof(pop_t)); + + for (; a2 != a2_end; ++a2, ++b2) result += __builtin_popcountll((*a2) ^ (*b2)); + + if (modulo) { + //in the case where size is not dividable by sizeof(size_t) + //need to mask off the bits at the end + pop_t a_final = 0, b_final = 0; + memcpy(&a_final, a2, modulo); + memcpy(&b_final, b2, modulo); + result += __builtin_popcountll(a_final ^ b_final); + } + } +#else // NO NEON and NOT GNUC + HammingLUT lut; + result = lut(reinterpret_cast (a), + reinterpret_cast (b), size); +#endif + return result; + } + + + template + ResultType operator()(const Iterator1 a, ZeroIterator b, size_t size, ResultType /*worst_dist*/ = -1) const + { + (void)b; + ResultType result = 0; +#if defined(__ARM_NEON__) && !defined(__CUDACC__) + { + const unsigned char* a2 = reinterpret_cast (a); + uint32x4_t bits = vmovq_n_u32(0); + for (size_t i = 0; i < size; i += 16) { + uint8x16_t A_vec = vld1q_u8 (a2 + i); + uint8x16_t bitsSet = vcntq_u8 (A_vec); + uint16x8_t bitSet8 = vpaddlq_u8 (bitsSet); + uint32x4_t bitSet4 = vpaddlq_u16 (bitSet8); + bits = vaddq_u32(bits, bitSet4); + } + uint64x2_t bitSet2 = vpaddlq_u32 (bits); + result = vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),0); + result += vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),2); + } +#elif defined(__GNUC__) + { + //for portability just use unsigned long -- and use the __builtin_popcountll (see docs for __builtin_popcountll) + typedef unsigned long long pop_t; + const size_t modulo = size % sizeof(pop_t); + const pop_t* a2 = reinterpret_cast (a); + const pop_t* a2_end = a2 + (size / sizeof(pop_t)); + + for (; a2 != a2_end; ++a2) result += __builtin_popcountll(*a2); + + if (modulo) { + //in the case where size is not dividable by sizeof(size_t) + //need to mask off the bits at the end + pop_t a_final = 0; + memcpy(&a_final, a2, modulo); + result += __builtin_popcountll(a_final); + } + } +#else // NO NEON and NOT GNUC + HammingLUT lut; + result = lut(reinterpret_cast (a), b, size); +#endif + return result; + } +}; + +template +struct Hamming2 +{ + typedef False is_kdtree_distance; + typedef False is_vector_space_distance; + + typedef T ElementType; + typedef int ResultType; + typedef ElementType CentersType; + + /** This is popcount_3() from: + * http://en.wikipedia.org/wiki/Hamming_weight */ + unsigned int popcnt32(uint32_t n) const + { + n -= ((n >> 1) & 0x55555555); + n = (n & 0x33333333) + ((n >> 2) & 0x33333333); + return (((n + (n >> 4))& 0xF0F0F0F)* 0x1010101) >> 24; + } + +#ifdef FLANN_PLATFORM_64_BIT + unsigned int popcnt64(uint64_t n) const + { + n -= ((n >> 1) & 0x5555555555555555); + n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333); + return (((n + (n >> 4))& 0x0f0f0f0f0f0f0f0f)* 0x0101010101010101) >> 56; + } +#endif + + template + ResultType operator()(const Iterator1 a, const Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const + { + CV_DbgAssert(!(size % long_word_size_) && "vectors size must be multiple of long words size (i.e. 8)"); + +#ifdef FLANN_PLATFORM_64_BIT + const uint64_t* pa = reinterpret_cast(a); + const uint64_t* pb = reinterpret_cast(b); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt64(*pa ^ *pb); + ++pa; + ++pb; + } +#else + const uint32_t* pa = reinterpret_cast(a); + const uint32_t* pb = reinterpret_cast(b); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt32(*pa ^ *pb); + ++pa; + ++pb; + } +#endif + return result; + } + + + template + ResultType operator()(const Iterator1 a, ZeroIterator b, size_t size, ResultType /*worst_dist*/ = -1) const + { + CV_DbgAssert(!(size % long_word_size_) && "vectors size must be multiple of long words size (i.e. 8)"); + + (void)b; +#ifdef FLANN_PLATFORM_64_BIT + const uint64_t* pa = reinterpret_cast(a); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt64(*pa); + ++pa; + } +#else + const uint32_t* pa = reinterpret_cast(a); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt32(*pa); + ++pa; + } +#endif + return result; + } + +private: +#ifdef FLANN_PLATFORM_64_BIT + static const size_t long_word_size_ = sizeof(uint64_t)/sizeof(unsigned char); +#else + static const size_t long_word_size_ = sizeof(uint32_t)/sizeof(unsigned char); +#endif +}; + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct DNAmmingLUT +{ + typedef False is_kdtree_distance; + typedef False is_vector_space_distance; + + typedef unsigned char ElementType; + typedef int ResultType; + typedef ElementType CentersType; + + /** this will count the bits in a ^ b + */ + template + ResultType operator()(const unsigned char* a, const Iterator2 b, size_t size) const + { + static const uchar popCountTable[] = + { + 0, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4 + }; + ResultType result = 0; + const unsigned char* b2 = reinterpret_cast (b); + for (size_t i = 0; i < size; i++) { + result += popCountTable[a[i] ^ b2[i]]; + } + return result; + } + + + ResultType operator()(const unsigned char* a, const ZeroIterator b, size_t size) const + { + (void)b; + static const uchar popCountTable[] = + { + 0, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, + 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4 + }; + ResultType result = 0; + for (size_t i = 0; i < size; i++) { + result += popCountTable[a[i]]; + } + return result; + } +}; + + +template +struct DNAmming2 +{ + typedef False is_kdtree_distance; + typedef False is_vector_space_distance; + + typedef T ElementType; + typedef int ResultType; + typedef ElementType CentersType; + + /** This is popcount_3() from: + * http://en.wikipedia.org/wiki/Hamming_weight */ + unsigned int popcnt32(uint32_t n) const + { + n = ((n >> 1) | n) & 0x55555555; + n = (n & 0x33333333) + ((n >> 2) & 0x33333333); + return (((n + (n >> 4))& 0x0F0F0F0F)* 0x01010101) >> 24; + } + +#ifdef FLANN_PLATFORM_64_BIT + unsigned int popcnt64(uint64_t n) const + { + n = ((n >> 1) | n) & 0x5555555555555555; + n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333); + return (((n + (n >> 4))& 0x0f0f0f0f0f0f0f0f)* 0x0101010101010101) >> 56; + } +#endif + + template + ResultType operator()(const Iterator1 a, const Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const + { + CV_DbgAssert(!(size % long_word_size_) && "vectors size must be multiple of long words size (i.e. 8)"); + +#ifdef FLANN_PLATFORM_64_BIT + const uint64_t* pa = reinterpret_cast(a); + const uint64_t* pb = reinterpret_cast(b); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt64(*pa ^ *pb); + ++pa; + ++pb; + } +#else + const uint32_t* pa = reinterpret_cast(a); + const uint32_t* pb = reinterpret_cast(b); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt32(*pa ^ *pb); + ++pa; + ++pb; + } +#endif + return result; + } + + + template + ResultType operator()(const Iterator1 a, ZeroIterator b, size_t size, ResultType /*worst_dist*/ = -1) const + { + CV_DbgAssert(!(size % long_word_size_) && "vectors size must be multiple of long words size (i.e. 8)"); + + (void)b; +#ifdef FLANN_PLATFORM_64_BIT + const uint64_t* pa = reinterpret_cast(a); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt64(*pa); + ++pa; + } +#else + const uint32_t* pa = reinterpret_cast(a); + ResultType result = 0; + size /= long_word_size_; + for(size_t i = 0; i < size; ++i ) { + result += popcnt32(*pa); + ++pa; + } +#endif + return result; + } + +private: +#ifdef FLANN_PLATFORM_64_BIT + static const size_t long_word_size_= sizeof(uint64_t)/sizeof(unsigned char); +#else + static const size_t long_word_size_= sizeof(uint32_t)/sizeof(unsigned char); +#endif +}; + + + +template +struct HistIntersectionDistance +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the histogram intersection distance + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType min0, min1, min2, min3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + min0 = (ResultType)(a[0] < b[0] ? a[0] : b[0]); + min1 = (ResultType)(a[1] < b[1] ? a[1] : b[1]); + min2 = (ResultType)(a[2] < b[2] ? a[2] : b[2]); + min3 = (ResultType)(a[3] < b[3] ? a[3] : b[3]); + result += min0 + min1 + min2 + min3; + a += 4; + b += 4; + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + /* Process last 0-3 pixels. Not needed for standard vector lengths. */ + while (a < last) { + min0 = (ResultType)(*a < *b ? *a : *b); + result += min0; + ++a; + ++b; + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + return a +struct HellingerDistance +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the Hellinger distance + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const + { + ResultType result = ResultType(); + ResultType diff0, diff1, diff2, diff3; + Iterator1 last = a + size; + Iterator1 lastgroup = last - 3; + + /* Process 4 items with each loop for efficiency. */ + while (a < lastgroup) { + diff0 = sqrt(static_cast(a[0])) - sqrt(static_cast(b[0])); + diff1 = sqrt(static_cast(a[1])) - sqrt(static_cast(b[1])); + diff2 = sqrt(static_cast(a[2])) - sqrt(static_cast(b[2])); + diff3 = sqrt(static_cast(a[3])) - sqrt(static_cast(b[3])); + result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3; + a += 4; + b += 4; + } + while (a < last) { + diff0 = sqrt(static_cast(*a++)) - sqrt(static_cast(*b++)); + result += diff0 * diff0; + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + ResultType diff = sqrt(static_cast(a)) - sqrt(static_cast(b)); + return diff * diff; + } +}; + + +template +struct ChiSquareDistance +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the chi-square distance + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + ResultType sum, diff; + Iterator1 last = a + size; + + while (a < last) { + sum = (ResultType)(*a + *b); + if (sum>0) { + diff = (ResultType)(*a - *b); + result += diff*diff/sum; + } + ++a; + ++b; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + ResultType result = ResultType(); + ResultType sum, diff; + + sum = (ResultType)(a+b); + if (sum>0) { + diff = (ResultType)(a-b); + result = diff*diff/sum; + } + return result; + } +}; + + +template +struct KL_Divergence +{ + typedef True is_kdtree_distance; + typedef True is_vector_space_distance; + + typedef T ElementType; + typedef typename Accumulator::Type ResultType; + typedef ResultType CentersType; + + /** + * Compute the Kullback-Leibler divergence + */ + template + ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const + { + ResultType result = ResultType(); + Iterator1 last = a + size; + + while (a < last) { + if ( *a != 0 && *b != 0 ) { + ResultType ratio = (ResultType)(*a / *b); + if (ratio>0) { + result += *a * log(ratio); + } + } + ++a; + ++b; + + if ((worst_dist>0)&&(result>worst_dist)) { + return result; + } + } + return result; + } + + /** + * Partial distance, used by the kd-tree. + */ + template + inline ResultType accum_dist(const U& a, const V& b, int) const + { + ResultType result = ResultType(); + if( a != 0 && b != 0 ) { + ResultType ratio = (ResultType)(a / b); + if (ratio>0) { + result = a * log(ratio); + } + } + return result; + } +}; + + +/* + * Depending on processed distances, some of them are already squared (e.g. L2) + * and some are not (e.g.Hamming). In KMeans++ for instance we want to be sure + * we are working on ^2 distances, thus following templates to ensure that. + */ +template +struct squareDistance +{ + typedef typename Distance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist*dist; } +}; + + +template +struct squareDistance, ElementType> +{ + typedef typename L2_Simple::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + +template +struct squareDistance, ElementType> +{ + typedef typename L2::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + + +template +struct squareDistance, ElementType> +{ + typedef typename MinkowskiDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + +template +struct squareDistance, ElementType> +{ + typedef typename HellingerDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + +template +struct squareDistance, ElementType> +{ + typedef typename ChiSquareDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + + +template +typename Distance::ResultType ensureSquareDistance( typename Distance::ResultType dist ) +{ + typedef typename Distance::ElementType ElementType; + + squareDistance dummy; + return dummy( dist ); +} + + +/* + * ...a template to tell the user if the distance he is working with is actually squared + */ + +template +struct isSquareDist +{ + bool operator()() { return false; } +}; + + +template +struct isSquareDist, ElementType> +{ + bool operator()() { return true; } +}; + +template +struct isSquareDist, ElementType> +{ + bool operator()() { return true; } +}; + + +template +struct isSquareDist, ElementType> +{ + bool operator()() { return true; } +}; + +template +struct isSquareDist, ElementType> +{ + bool operator()() { return true; } +}; + +template +struct isSquareDist, ElementType> +{ + bool operator()() { return true; } +}; + + +template +bool isSquareDistance() +{ + typedef typename Distance::ElementType ElementType; + + isSquareDist dummy; + return dummy(); +} + +/* + * ...and a template to ensure the user that he will process the normal distance, + * and not squared distance, without losing processing time calling sqrt(ensureSquareDistance) + * that will result in doing actually sqrt(dist*dist) for L1 distance for instance. + */ +template +struct simpleDistance +{ + typedef typename Distance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return dist; } +}; + + +template +struct simpleDistance, ElementType> +{ + typedef typename L2_Simple::ResultType ResultType; + ResultType operator()( ResultType dist ) { return sqrt(dist); } +}; + +template +struct simpleDistance, ElementType> +{ + typedef typename L2::ResultType ResultType; + ResultType operator()( ResultType dist ) { return sqrt(dist); } +}; + + +template +struct simpleDistance, ElementType> +{ + typedef typename MinkowskiDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return sqrt(dist); } +}; + +template +struct simpleDistance, ElementType> +{ + typedef typename HellingerDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return sqrt(dist); } +}; + +template +struct simpleDistance, ElementType> +{ + typedef typename ChiSquareDistance::ResultType ResultType; + ResultType operator()( ResultType dist ) { return sqrt(dist); } +}; + + +template +typename Distance::ResultType ensureSimpleDistance( typename Distance::ResultType dist ) +{ + typedef typename Distance::ElementType ElementType; + + simpleDistance dummy; + return dummy( dist ); +} + +} + +//! @endcond + +#endif //OPENCV_FLANN_DIST_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/dummy.h b/Thirdparty/opencv2/include/opencv2/flann/dummy.h new file mode 100644 index 0000000..c176f2e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/dummy.h @@ -0,0 +1,16 @@ + +#ifndef OPENCV_FLANN_DUMMY_H_ +#define OPENCV_FLANN_DUMMY_H_ + +//! @cond IGNORED + +namespace cvflann +{ + +CV_DEPRECATED inline void dummyfunc() {} + +} + +//! @endcond + +#endif /* OPENCV_FLANN_DUMMY_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/dynamic_bitset.h b/Thirdparty/opencv2/include/opencv2/flann/dynamic_bitset.h new file mode 100644 index 0000000..676cb0b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/dynamic_bitset.h @@ -0,0 +1,160 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +/*********************************************************************** + * Author: Vincent Rabaud + *************************************************************************/ + +#ifndef OPENCV_FLANN_DYNAMIC_BITSET_H_ +#define OPENCV_FLANN_DYNAMIC_BITSET_H_ + +//! @cond IGNORED + +#ifndef FLANN_USE_BOOST +# define FLANN_USE_BOOST 0 +#endif +//#define FLANN_USE_BOOST 1 +#if FLANN_USE_BOOST +#include +typedef boost::dynamic_bitset<> DynamicBitset; +#else + +#include + +#include "dist.h" + +namespace cvflann { + +/** Class re-implementing the boost version of it + * This helps not depending on boost, it also does not do the bound checks + * and has a way to reset a block for speed + */ +class DynamicBitset +{ +public: + /** default constructor + */ + DynamicBitset() : size_(0) + { + } + + /** only constructor we use in our code + * @param sz the size of the bitset (in bits) + */ + DynamicBitset(size_t sz) + { + resize(sz); + reset(); + } + + /** Sets all the bits to 0 + */ + void clear() + { + std::fill(bitset_.begin(), bitset_.end(), 0); + } + + /** @brief checks if the bitset is empty + * @return true if the bitset is empty + */ + bool empty() const + { + return bitset_.empty(); + } + + /** set all the bits to 0 + */ + void reset() + { + std::fill(bitset_.begin(), bitset_.end(), 0); + } + + /** @brief set one bit to 0 + */ + void reset(size_t index) + { + bitset_[index / cell_bit_size_] &= ~(size_t(1) << (index % cell_bit_size_)); + } + + /** @brief sets a specific bit to 0, and more bits too + * This function is useful when resetting a given set of bits so that the + * whole bitset ends up being 0: if that's the case, we don't care about setting + * other bits to 0 + */ + void reset_block(size_t index) + { + bitset_[index / cell_bit_size_] = 0; + } + + /** resize the bitset so that it contains at least sz bits + */ + void resize(size_t sz) + { + size_ = sz; + bitset_.resize(sz / cell_bit_size_ + 1); + } + + /** set a bit to true + * @param index the index of the bit to set to 1 + */ + void set(size_t index) + { + bitset_[index / cell_bit_size_] |= size_t(1) << (index % cell_bit_size_); + } + + /** gives the number of contained bits + */ + size_t size() const + { + return size_; + } + + /** check if a bit is set + * @param index the index of the bit to check + * @return true if the bit is set + */ + bool test(size_t index) const + { + return (bitset_[index / cell_bit_size_] & (size_t(1) << (index % cell_bit_size_))) != 0; + } + +private: + std::vector bitset_; + size_t size_; + static const unsigned int cell_bit_size_ = CHAR_BIT * sizeof(size_t); +}; + +} // namespace cvflann + +#endif + +//! @endcond + +#endif // OPENCV_FLANN_DYNAMIC_BITSET_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/flann.hpp b/Thirdparty/opencv2/include/opencv2/flann/flann.hpp new file mode 100644 index 0000000..227683f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/flann.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/flann.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/flann/flann_base.hpp b/Thirdparty/opencv2/include/opencv2/flann/flann_base.hpp new file mode 100644 index 0000000..af0b380 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/flann_base.hpp @@ -0,0 +1,312 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_BASE_HPP_ +#define OPENCV_FLANN_BASE_HPP_ + +//! @cond IGNORED + +#include +#include + +#include "general.h" +#include "matrix.h" +#include "params.h" +#include "saving.h" + +#include "all_indices.h" + +namespace cvflann +{ +class FILEScopeGuard { + +public: + explicit FILEScopeGuard(FILE* file) { + file_ = file; + }; + + ~FILEScopeGuard() { + fclose(file_); + }; + +private: + FILE* file_; +}; + + +/** + * Sets the log level used for all flann functions + * @param level Verbosity level + */ +inline void log_verbosity(int level) +{ + if (level >= 0) { + Logger::setLevel(level); + } +} + +/** + * (Deprecated) Index parameters for creating a saved index. + */ +struct SavedIndexParams : public IndexParams +{ + SavedIndexParams(cv::String filename) + { + (* this)["algorithm"] = FLANN_INDEX_SAVED; + (*this)["filename"] = filename; + } +}; + +template +NNIndex* load_saved_index(const Matrix& dataset, const cv::String& filename, Distance distance) +{ + typedef typename Distance::ElementType ElementType; + + FILE* fin = fopen(filename.c_str(), "rb"); + if (fin == NULL) { + return NULL; + } + FILEScopeGuard fscgd(fin); + + IndexHeader header = load_header(fin); + if (header.data_type != Datatype::type()) { + FLANN_THROW(cv::Error::StsError, "Datatype of saved index is different than of the one to be created."); + } + if ((size_t(header.rows) != dataset.rows)||(size_t(header.cols) != dataset.cols)) { + FLANN_THROW(cv::Error::StsError, "The index saved belongs to a different dataset"); + } + + IndexParams params; + params["algorithm"] = header.index_type; + NNIndex* nnIndex = create_index_by_type(dataset, params, distance); + nnIndex->loadIndex(fin); + + return nnIndex; +} + + +template +class Index : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + Index(const Matrix& features, const IndexParams& params, Distance distance = Distance() ) + :index_params_(params) + { + flann_algorithm_t index_type = get_param(params,"algorithm"); + loaded_ = false; + + if (index_type == FLANN_INDEX_SAVED) { + nnIndex_ = load_saved_index(features, get_param(params,"filename"), distance); + loaded_ = true; + } + else { + nnIndex_ = create_index_by_type(features, params, distance); + } + } + + ~Index() + { + delete nnIndex_; + } + + /** + * Builds the index. + */ + void buildIndex() CV_OVERRIDE + { + if (!loaded_) { + nnIndex_->buildIndex(); + } + } + + void save(cv::String filename) + { + FILE* fout = fopen(filename.c_str(), "wb"); + if (fout == NULL) { + FLANN_THROW(cv::Error::StsError, "Cannot open file"); + } + save_header(fout, *nnIndex_); + saveIndex(fout); + fclose(fout); + } + + /** + * \brief Saves the index to a stream + * \param stream The stream to save the index to + */ + virtual void saveIndex(FILE* stream) CV_OVERRIDE + { + nnIndex_->saveIndex(stream); + } + + /** + * \brief Loads the index from a stream + * \param stream The stream from which the index is loaded + */ + virtual void loadIndex(FILE* stream) CV_OVERRIDE + { + nnIndex_->loadIndex(stream); + } + + /** + * \returns number of features in this index. + */ + size_t veclen() const CV_OVERRIDE + { + return nnIndex_->veclen(); + } + + /** + * \returns The dimensionality of the features in this index. + */ + size_t size() const CV_OVERRIDE + { + return nnIndex_->size(); + } + + /** + * \returns The index type (kdtree, kmeans,...) + */ + flann_algorithm_t getType() const CV_OVERRIDE + { + return nnIndex_->getType(); + } + + /** + * \returns The amount of memory (in bytes) used by the index. + */ + virtual int usedMemory() const CV_OVERRIDE + { + return nnIndex_->usedMemory(); + } + + + /** + * \returns The index parameters + */ + IndexParams getParameters() const CV_OVERRIDE + { + return nnIndex_->getParameters(); + } + + /** + * \brief Perform k-nearest neighbor search + * \param[in] queries The query points for which to find the nearest neighbors + * \param[out] indices The indices of the nearest neighbors found + * \param[out] dists Distances to the nearest neighbors found + * \param[in] knn Number of nearest neighbors to return + * \param[in] params Search parameters + */ + void knnSearch(const Matrix& queries, Matrix& indices, Matrix& dists, int knn, const SearchParams& params) CV_OVERRIDE + { + nnIndex_->knnSearch(queries, indices, dists, knn, params); + } + + /** + * \brief Perform radius search + * \param[in] query The query point + * \param[out] indices The indinces of the neighbors found within the given radius + * \param[out] dists The distances to the nearest neighbors found + * \param[in] radius The radius used for search + * \param[in] params Search parameters + * \returns Number of neighbors found + */ + int radiusSearch(const Matrix& query, Matrix& indices, Matrix& dists, float radius, const SearchParams& params) CV_OVERRIDE + { + return nnIndex_->radiusSearch(query, indices, dists, radius, params); + } + + /** + * \brief Method that searches for nearest-neighbours + */ + void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + nnIndex_->findNeighbors(result, vec, searchParams); + } + + /** + * \brief Returns actual index + */ + CV_DEPRECATED NNIndex* getIndex() + { + return nnIndex_; + } + + /** + * \brief Returns index parameters. + * \deprecated use getParameters() instead. + */ + CV_DEPRECATED const IndexParams* getIndexParameters() + { + return &index_params_; + } + +private: + /** Pointer to actual index class */ + NNIndex* nnIndex_; + /** Indices if the index was loaded from a file */ + bool loaded_; + /** Parameters passed to the index */ + IndexParams index_params_; + + Index(const Index &); // copy disabled + Index& operator=(const Index &); // assign disabled +}; + +/** + * Performs a hierarchical clustering of the points passed as argument and then takes a cut in the + * the clustering tree to return a flat clustering. + * @param[in] points Points to be clustered + * @param centers The computed cluster centres. Matrix should be preallocated and centers.rows is the + * number of clusters requested. + * @param params Clustering parameters (The same as for cvflann::KMeansIndex) + * @param d Distance to be used for clustering (eg: cvflann::L2) + * @return number of clusters computed (can be different than clusters.rows and is the highest number + * of the form (branching-1)*K+1 smaller than clusters.rows). + */ +template +int hierarchicalClustering(const Matrix& points, Matrix& centers, + const KMeansIndexParams& params, Distance d = Distance()) +{ + KMeansIndex kmeans(points, params, d); + kmeans.buildIndex(); + + int clusterNum = kmeans.getClusterCenters(centers); + return clusterNum; +} + +} + +//! @endcond + +#endif /* OPENCV_FLANN_BASE_HPP_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/general.h b/Thirdparty/opencv2/include/opencv2/flann/general.h new file mode 100644 index 0000000..e65cba2 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/general.h @@ -0,0 +1,65 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_GENERAL_H_ +#define OPENCV_FLANN_GENERAL_H_ + +#include "opencv2/core/version.hpp" + +#if CV_VERSION_MAJOR <= 4 + +//! @cond IGNORED + +#include "opencv2/core.hpp" + +namespace cvflann +{ + +class FLANNException : public cv::Exception +{ +public: + FLANNException(const char* message) : cv::Exception(0, message, "", __FILE__, __LINE__) { } + + FLANNException(const cv::String& message) : cv::Exception(0, message, "", __FILE__, __LINE__) { } +}; + +} + +#define FLANN_THROW(TYPE, STR) throw FLANNException(STR) + +#else + +#define FLANN_THROW(TYPE, STR) CV_Error(TYPE, STR) + +#endif + +//! @endcond + +#endif /* OPENCV_FLANN_GENERAL_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/ground_truth.h b/Thirdparty/opencv2/include/opencv2/flann/ground_truth.h new file mode 100644 index 0000000..17f2a8e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/ground_truth.h @@ -0,0 +1,98 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_GROUND_TRUTH_H_ +#define OPENCV_FLANN_GROUND_TRUTH_H_ + +//! @cond IGNORED + +#include "dist.h" +#include "matrix.h" + + +namespace cvflann +{ + +template +void find_nearest(const Matrix& dataset, typename Distance::ElementType* query, int* matches, int nn, + int skip = 0, Distance distance = Distance()) +{ + typedef typename Distance::ResultType DistanceType; + int n = nn + skip; + + std::vector match(n); + std::vector dists(n); + + dists[0] = distance(dataset[0], query, dataset.cols); + match[0] = 0; + int dcnt = 1; + + for (size_t i=1; i=1 && dists[j] +void compute_ground_truth(const Matrix& dataset, const Matrix& testset, Matrix& matches, + int skip=0, Distance d = Distance()) +{ + for (size_t i=0; i(dataset, testset[i], matches[i], (int)matches.cols, skip, d); + } +} + + +} + +//! @endcond + +#endif //OPENCV_FLANN_GROUND_TRUTH_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/hdf5.h b/Thirdparty/opencv2/include/opencv2/flann/hdf5.h new file mode 100644 index 0000000..7554384 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/hdf5.h @@ -0,0 +1,235 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_HDF5_H_ +#define OPENCV_FLANN_HDF5_H_ + +//! @cond IGNORED + +#include + +#include "matrix.h" + + +namespace cvflann +{ + +namespace +{ + +template +hid_t get_hdf5_type() +{ + throw FLANNException("Unsupported type for IO operations"); +} + +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_CHAR; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_UCHAR; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_SHORT; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_USHORT; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_INT; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_UINT; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_LONG; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_ULONG; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_FLOAT; } +template<> +hid_t get_hdf5_type() { return H5T_NATIVE_DOUBLE; } +} + + +#define CHECK_ERROR(x,y) if ((x)<0) throw FLANNException((y)); + +template +void save_to_file(const cvflann::Matrix& dataset, const String& filename, const String& name) +{ + +#if H5Eset_auto_vers == 2 + H5Eset_auto( H5E_DEFAULT, NULL, NULL ); +#else + H5Eset_auto( NULL, NULL ); +#endif + + herr_t status; + hid_t file_id; + file_id = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT); + if (file_id < 0) { + file_id = H5Fcreate(filename.c_str(), H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); + } + CHECK_ERROR(file_id,"Error creating hdf5 file."); + + hsize_t dimsf[2]; // dataset dimensions + dimsf[0] = dataset.rows; + dimsf[1] = dataset.cols; + + hid_t space_id = H5Screate_simple(2, dimsf, NULL); + hid_t memspace_id = H5Screate_simple(2, dimsf, NULL); + + hid_t dataset_id; +#if H5Dcreate_vers == 2 + dataset_id = H5Dcreate2(file_id, name.c_str(), get_hdf5_type(), space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); +#else + dataset_id = H5Dcreate(file_id, name.c_str(), get_hdf5_type(), space_id, H5P_DEFAULT); +#endif + + if (dataset_id<0) { +#if H5Dopen_vers == 2 + dataset_id = H5Dopen2(file_id, name.c_str(), H5P_DEFAULT); +#else + dataset_id = H5Dopen(file_id, name.c_str()); +#endif + } + CHECK_ERROR(dataset_id,"Error creating or opening dataset in file."); + + status = H5Dwrite(dataset_id, get_hdf5_type(), memspace_id, space_id, H5P_DEFAULT, dataset.data ); + CHECK_ERROR(status, "Error writing to dataset"); + + H5Sclose(memspace_id); + H5Sclose(space_id); + H5Dclose(dataset_id); + H5Fclose(file_id); + +} + + +template +void load_from_file(cvflann::Matrix& dataset, const String& filename, const String& name) +{ + herr_t status; + hid_t file_id = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT); + CHECK_ERROR(file_id,"Error opening hdf5 file."); + + hid_t dataset_id; +#if H5Dopen_vers == 2 + dataset_id = H5Dopen2(file_id, name.c_str(), H5P_DEFAULT); +#else + dataset_id = H5Dopen(file_id, name.c_str()); +#endif + CHECK_ERROR(dataset_id,"Error opening dataset in file."); + + hid_t space_id = H5Dget_space(dataset_id); + + hsize_t dims_out[2]; + H5Sget_simple_extent_dims(space_id, dims_out, NULL); + + dataset = cvflann::Matrix(new T[dims_out[0]*dims_out[1]], dims_out[0], dims_out[1]); + + status = H5Dread(dataset_id, get_hdf5_type(), H5S_ALL, H5S_ALL, H5P_DEFAULT, dataset[0]); + CHECK_ERROR(status, "Error reading dataset"); + + H5Sclose(space_id); + H5Dclose(dataset_id); + H5Fclose(file_id); +} + + +#ifdef HAVE_MPI + +namespace mpi +{ +/** + * Loads a the hyperslice corresponding to this processor from a hdf5 file. + * @param flann_dataset Dataset where the data is loaded + * @param filename HDF5 file name + * @param name Name of dataset inside file + */ +template +void load_from_file(cvflann::Matrix& dataset, const String& filename, const String& name) +{ + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Info info = MPI_INFO_NULL; + + int mpi_size, mpi_rank; + MPI_Comm_size(comm, &mpi_size); + MPI_Comm_rank(comm, &mpi_rank); + + herr_t status; + + hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_mpio(plist_id, comm, info); + hid_t file_id = H5Fopen(filename.c_str(), H5F_ACC_RDWR, plist_id); + CHECK_ERROR(file_id,"Error opening hdf5 file."); + H5Pclose(plist_id); + hid_t dataset_id; +#if H5Dopen_vers == 2 + dataset_id = H5Dopen2(file_id, name.c_str(), H5P_DEFAULT); +#else + dataset_id = H5Dopen(file_id, name.c_str()); +#endif + CHECK_ERROR(dataset_id,"Error opening dataset in file."); + + hid_t space_id = H5Dget_space(dataset_id); + hsize_t dims[2]; + H5Sget_simple_extent_dims(space_id, dims, NULL); + + hsize_t count[2]; + hsize_t offset[2]; + + hsize_t item_cnt = dims[0]/mpi_size+(dims[0]%mpi_size==0 ? 0 : 1); + hsize_t cnt = (mpi_rank(), memspace_id, space_id, plist_id, dataset.data); + CHECK_ERROR(status, "Error reading dataset"); + + H5Pclose(plist_id); + H5Sclose(space_id); + H5Sclose(memspace_id); + H5Dclose(dataset_id); + H5Fclose(file_id); +} +} +#endif // HAVE_MPI +} // namespace cvflann::mpi + +//! @endcond + +#endif /* OPENCV_FLANN_HDF5_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/heap.h b/Thirdparty/opencv2/include/opencv2/flann/heap.h new file mode 100644 index 0000000..8cace20 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/heap.h @@ -0,0 +1,244 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_HEAP_H_ +#define OPENCV_FLANN_HEAP_H_ + +//! @cond IGNORED + +#include +#include + +#include + +namespace cvflann +{ + +// TODO: Define x > y operator and use std::greater instead +template +struct greater +{ + bool operator()(const T& x, const T& y) const + { + return y < x; + } +}; + +/** + * Priority Queue Implementation + * + * The priority queue is implemented with a heap. A heap is a complete + * (full) binary tree in which each parent is less than both of its + * children, but the order of the children is unspecified. + */ +template +class Heap +{ + /** + * Storage array for the heap. + * Type T must be comparable. + */ + std::vector heap; +public: + /** + * \brief Constructs a heap with a pre-allocated capacity + * + * \param capacity heap maximum capacity + */ + Heap(const int capacity) + { + reserve(capacity); + } + + /** + * \brief Move-constructs a heap from an external vector + * + * \param vec external vector + */ + Heap(std::vector&& vec) + : heap(std::move(vec)) + { + std::make_heap(heap.begin(), heap.end(), greater()); + } + + /** + * + * \returns heap size + */ + int size() const + { + return (int)heap.size(); + } + + /** + * + * \returns heap capacity + */ + int capacity() const + { + return (int)heap.capacity(); + } + + /** + * \brief Tests if the heap is empty + * + * \returns true is heap empty, false otherwise + */ + bool empty() + { + return heap.empty(); + } + + /** + * \brief Clears the heap. + */ + void clear() + { + heap.clear(); + } + + /** + * \brief Sets the heap maximum capacity. + * + * \param capacity heap maximum capacity + */ + void reserve(const int capacity) + { + heap.reserve(capacity); + } + + /** + * \brief Inserts a new element in the heap. + * + * We select the next empty leaf node, and then keep moving any larger + * parents down until the right location is found to store this element. + * + * \param value the new element to be inserted in the heap + */ + void insert(T value) + { + /* If heap is full, then return without adding this element. */ + if (size() == capacity()) { + return; + } + + heap.push_back(value); + std::push_heap(heap.begin(), heap.end(), greater()); + } + + /** + * \brief Returns the node of minimum value from the heap (top of the heap). + * + * \param[out] value parameter used to return the min element + * \returns false if heap empty + */ + bool popMin(T& value) + { + if (empty()) { + return false; + } + + value = heap[0]; + std::pop_heap(heap.begin(), heap.end(), greater()); + heap.pop_back(); + + return true; /* Return old last node. */ + } + + /** + * \brief Returns a shared heap for the given memory pool ID. + * + * It constructs the heap if it does not already exists. + * + * \param poolId a user-chosen hashable ID for identifying the heap. + * For thread-safe operations, using current thread ID is a good choice. + * \param capacity heap maximum capacity + * \param iterThreshold remove heaps that were not reused for more than specified iterations count + * if iterThreshold value is less 2, it will be internally adjusted to twice the number of CPU threads + * \returns pointer to the heap + */ + template + static cv::Ptr> getPooledInstance( + const HashableT& poolId, const int capacity, int iterThreshold = 0) + { + static cv::Mutex mutex; + const cv::AutoLock lock(mutex); + + struct HeapMapValueType { + cv::Ptr> heapPtr; + int iterCounter; + }; + typedef std::unordered_map HeapMapType; + + static HeapMapType heapsPool; + typename HeapMapType::iterator heapIt = heapsPool.find(poolId); + + if (heapIt == heapsPool.end()) + { + // Construct the heap as it does not already exists + HeapMapValueType heapAndTimePair = {cv::makePtr>(capacity), 0}; + const std::pair& emplaceResult = heapsPool.emplace(poolId, std::move(heapAndTimePair)); + CV_CheckEQ(static_cast(emplaceResult.second), 1, "Failed to insert the heap into its memory pool"); + heapIt = emplaceResult.first; + } + else + { + CV_CheckEQ(heapIt->second.heapPtr.use_count(), 1, "Cannot modify a heap that is currently accessed by another caller"); + heapIt->second.heapPtr->clear(); + heapIt->second.heapPtr->reserve(capacity); + heapIt->second.iterCounter = 0; + } + + if (iterThreshold <= 1) { + iterThreshold = 2 * cv::getNumThreads(); + } + + // Remove heaps that were not reused for more than given iterThreshold + typename HeapMapType::iterator cleanupIt = heapsPool.begin(); + while (cleanupIt != heapsPool.end()) + { + if (cleanupIt->second.iterCounter++ > iterThreshold) + { + CV_Assert(cleanupIt != heapIt); + cleanupIt = heapsPool.erase(cleanupIt); + continue; + } + ++cleanupIt; + } + + return heapIt->second.heapPtr; + } +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_HEAP_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/hierarchical_clustering_index.h b/Thirdparty/opencv2/include/opencv2/flann/hierarchical_clustering_index.h new file mode 100644 index 0000000..60662e7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/hierarchical_clustering_index.h @@ -0,0 +1,846 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_HIERARCHICAL_CLUSTERING_INDEX_H_ +#define OPENCV_FLANN_HIERARCHICAL_CLUSTERING_INDEX_H_ + +//! @cond IGNORED + +#include +#include +#include +#include + +#include "general.h" +#include "nn_index.h" +#include "dist.h" +#include "matrix.h" +#include "result_set.h" +#include "heap.h" +#include "allocator.h" +#include "random.h" +#include "saving.h" + + +namespace cvflann +{ + +struct HierarchicalClusteringIndexParams : public IndexParams +{ + HierarchicalClusteringIndexParams(int branching = 32, + flann_centers_init_t centers_init = FLANN_CENTERS_RANDOM, + int trees = 4, int leaf_size = 100) + { + (*this)["algorithm"] = FLANN_INDEX_HIERARCHICAL; + // The branching factor used in the hierarchical clustering + (*this)["branching"] = branching; + // Algorithm used for picking the initial cluster centers + (*this)["centers_init"] = centers_init; + // number of parallel trees to build + (*this)["trees"] = trees; + // maximum leaf size + (*this)["leaf_size"] = leaf_size; + } +}; + + +/** + * Hierarchical index + * + * Contains a tree constructed through a hierarchical clustering + * and other information for indexing a set of points for nearest-neighbour matching. + */ +template +class HierarchicalClusteringIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + +private: + + + typedef void (HierarchicalClusteringIndex::* centersAlgFunction)(int, int*, int, int*, int&); + + /** + * The function used for choosing the cluster centers. + */ + centersAlgFunction chooseCenters; + + + + /** + * Chooses the initial centers in the k-means clustering in a random manner. + * + * Params: + * k = number of centers + * vecs = the dataset of points + * indices = indices in the dataset + * indices_length = length of indices vector + * + */ + void chooseCentersRandom(int k, int* dsindices, int indices_length, int* centers, int& centers_length) + { + UniqueRandom r(indices_length); + + int index; + for (index=0; index=0 && rnd < n); + + centers[0] = dsindices[rnd]; + + int index; + for (index=1; indexbest_val) { + best_val = dist; + best_index = j; + } + } + if (best_index!=-1) { + centers[index] = dsindices[best_index]; + } + else { + break; + } + } + centers_length = index; + } + + + /** + * Chooses the initial centers in the k-means using the algorithm + * proposed in the KMeans++ paper: + * Arthur, David; Vassilvitskii, Sergei - k-means++: The Advantages of Careful Seeding + * + * Implementation of this function was converted from the one provided in Arthur's code. + * + * Params: + * k = number of centers + * vecs = the dataset of points + * indices = indices in the dataset + * Returns: + */ + void chooseCentersKMeanspp(int k, int* dsindices, int indices_length, int* centers, int& centers_length) + { + int n = indices_length; + + double currentPot = 0; + DistanceType* closestDistSq = new DistanceType[n]; + + // Choose one random center and set the closestDistSq values + int index = rand_int(n); + CV_DbgAssert(index >=0 && index < n); + centers[0] = dsindices[index]; + + // Computing distance^2 will have the advantage of even higher probability further to pick new centers + // far from previous centers (and this complies to "k-means++: the advantages of careful seeding" article) + for (int i = 0; i < n; i++) { + closestDistSq[i] = distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols); + closestDistSq[i] = ensureSquareDistance( closestDistSq[i] ); + currentPot += closestDistSq[i]; + } + + + const int numLocalTries = 1; + + // Choose each center + int centerCount; + for (centerCount = 1; centerCount < k; centerCount++) { + + // Repeat several trials + double bestNewPot = -1; + int bestNewIndex = 0; + for (int localTrial = 0; localTrial < numLocalTries; localTrial++) { + + // Choose our center - have to be slightly careful to return a valid answer even accounting + // for possible rounding errors + double randVal = rand_double(currentPot); + for (index = 0; index < n-1; index++) { + if (randVal <= closestDistSq[index]) break; + else randVal -= closestDistSq[index]; + } + + // Compute the new potential + double newPot = 0; + for (int i = 0; i < n; i++) { + DistanceType dist = distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols); + newPot += std::min( ensureSquareDistance(dist), closestDistSq[i] ); + } + + // Store the best result + if ((bestNewPot < 0)||(newPot < bestNewPot)) { + bestNewPot = newPot; + bestNewIndex = index; + } + } + + // Add the appropriate center + centers[centerCount] = dsindices[bestNewIndex]; + currentPot = bestNewPot; + for (int i = 0; i < n; i++) { + DistanceType dist = distance(dataset[dsindices[i]], dataset[dsindices[bestNewIndex]], dataset.cols); + closestDistSq[i] = std::min( ensureSquareDistance(dist), closestDistSq[i] ); + } + } + + centers_length = centerCount; + + delete[] closestDistSq; + } + + + /** + * Chooses the initial centers in a way inspired by Gonzales (by Pierre-Emmanuel Viel): + * select the first point of the list as a candidate, then parse the points list. If another + * point is further than current candidate from the other centers, test if it is a good center + * of a local aggregation. If it is, replace current candidate by this point. And so on... + * + * Used with KMeansIndex that computes centers coordinates by averaging positions of clusters points, + * this doesn't make a real difference with previous methods. But used with HierarchicalClusteringIndex + * class that pick centers among existing points instead of computing the barycenters, there is a real + * improvement. + * + * Params: + * k = number of centers + * vecs = the dataset of points + * indices = indices in the dataset + * Returns: + */ + void GroupWiseCenterChooser(int k, int* dsindices, int indices_length, int* centers, int& centers_length) + { + const float kSpeedUpFactor = 1.3f; + + int n = indices_length; + + DistanceType* closestDistSq = new DistanceType[n]; + + // Choose one random center and set the closestDistSq values + int index = rand_int(n); + CV_DbgAssert(index >=0 && index < n); + centers[0] = dsindices[index]; + + for (int i = 0; i < n; i++) { + closestDistSq[i] = distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols); + } + + + // Choose each center + int centerCount; + for (centerCount = 1; centerCount < k; centerCount++) { + + // Repeat several trials + double bestNewPot = -1; + int bestNewIndex = 0; + DistanceType furthest = 0; + for (index = 0; index < n; index++) { + + // We will test only the potential of the points further than current candidate + if( closestDistSq[index] > kSpeedUpFactor * (float)furthest ) { + + // Compute the new potential + double newPot = 0; + for (int i = 0; i < n; i++) { + newPot += std::min( distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols) + , closestDistSq[i] ); + } + + // Store the best result + if ((bestNewPot < 0)||(newPot <= bestNewPot)) { + bestNewPot = newPot; + bestNewIndex = index; + furthest = closestDistSq[index]; + } + } + } + + // Add the appropriate center + centers[centerCount] = dsindices[bestNewIndex]; + for (int i = 0; i < n; i++) { + closestDistSq[i] = std::min( distance(dataset[dsindices[i]], dataset[dsindices[bestNewIndex]], dataset.cols) + , closestDistSq[i] ); + } + } + + centers_length = centerCount; + + delete[] closestDistSq; + } + + +public: + + + /** + * Index constructor + * + * Params: + * inputData = dataset with the input features + * params = parameters passed to the hierarchical k-means algorithm + */ + HierarchicalClusteringIndex(const Matrix& inputData, const IndexParams& index_params = HierarchicalClusteringIndexParams(), + Distance d = Distance()) + : dataset(inputData), params(index_params), root(NULL), indices(NULL), distance(d) + { + memoryCounter = 0; + + size_ = dataset.rows; + veclen_ = dataset.cols; + + branching_ = get_param(params,"branching",32); + centers_init_ = get_param(params,"centers_init", FLANN_CENTERS_RANDOM); + trees_ = get_param(params,"trees",4); + leaf_size_ = get_param(params,"leaf_size",100); + + if (centers_init_==FLANN_CENTERS_RANDOM) { + chooseCenters = &HierarchicalClusteringIndex::chooseCentersRandom; + } + else if (centers_init_==FLANN_CENTERS_GONZALES) { + chooseCenters = &HierarchicalClusteringIndex::chooseCentersGonzales; + } + else if (centers_init_==FLANN_CENTERS_KMEANSPP) { + chooseCenters = &HierarchicalClusteringIndex::chooseCentersKMeanspp; + } + else if (centers_init_==FLANN_CENTERS_GROUPWISE) { + chooseCenters = &HierarchicalClusteringIndex::GroupWiseCenterChooser; + } + else { + FLANN_THROW(cv::Error::StsError, "Unknown algorithm for choosing initial centers."); + } + + root = new NodePtr[trees_]; + indices = new int*[trees_]; + + for (int i=0; i(); + computeClustering(root[i], indices[i], (int)size_, branching_,0); + } + } + + + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_HIERARCHICAL; + } + + + void saveIndex(FILE* stream) CV_OVERRIDE + { + save_value(stream, branching_); + save_value(stream, trees_); + save_value(stream, centers_init_); + save_value(stream, leaf_size_); + save_value(stream, memoryCounter); + for (int i=0; i& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + + const int maxChecks = get_param(searchParams,"checks",32); + const bool explore_all_trees = get_param(searchParams,"explore_all_trees",false); + + // Priority queue storing intermediate branches in the best-bin-first search + const cv::Ptr>& heap = Heap::getPooledInstance(cv::utils::getThreadID(), (int)size_); + + std::vector checked(size_,false); + int checks = 0; + for (int i=0; i= maxChecks) && result.full()) + break; + } + + BranchSt branch; + while (heap->popMin(branch) && (checks BranchSt; + + + + void save_tree(FILE* stream, NodePtr node, int num) + { + save_value(stream, *node); + if (node->childs==NULL) { + int indices_offset = (int)(node->indices - indices[num]); + save_value(stream, indices_offset); + } + else { + for(int i=0; ichilds[i], num); + } + } + } + + + void load_tree(FILE* stream, NodePtr& node, int num) + { + node = pool.allocate(); + load_value(stream, *node); + if (node->childs==NULL) { + int indices_offset; + load_value(stream, indices_offset); + node->indices = indices[num] + indices_offset; + } + else { + node->childs = pool.allocate(branching_); + for(int i=0; ichilds[i], num); + } + } + } + + + /** + * Release the inner elements of indices[] + */ + void free_indices() + { + if (indices!=NULL) { + for(int i=0; inew_dist) { + labels[i] = j; + dist = new_dist; + } + } + cost += dist; + } + } + + /** + * The method responsible with actually doing the recursive hierarchical + * clustering + * + * Params: + * node = the node to cluster + * indices = indices of the points belonging to the current node + * branching = the branching factor to use in the clustering + * + * TODO: for 1-sized clusters don't store a cluster center (it's the same as the single cluster point) + */ + void computeClustering(NodePtr node, int* dsindices, int indices_length, int branching, int level) + { + node->size = indices_length; + node->level = level; + + if (indices_length < leaf_size_) { // leaf node + node->indices = dsindices; + std::sort(node->indices,node->indices+indices_length); + node->childs = NULL; + return; + } + + std::vector centers(branching); + std::vector labels(indices_length); + + int centers_length; + (this->*chooseCenters)(branching, dsindices, indices_length, ¢ers[0], centers_length); + + if (centers_lengthindices = dsindices; + std::sort(node->indices,node->indices+indices_length); + node->childs = NULL; + return; + } + + + // assign points to clusters + DistanceType cost; + computeLabels(dsindices, indices_length, ¢ers[0], centers_length, &labels[0], cost); + + node->childs = pool.allocate(branching); + int start = 0; + int end = start; + for (int i=0; ichilds[i] = pool.allocate(); + node->childs[i]->pivot = centers[i]; + node->childs[i]->indices = NULL; + computeClustering(node->childs[i],dsindices+start, end-start, branching, level+1); + start=end; + } + } + + + + /** + * Performs one descent in the hierarchical k-means tree. The branches not + * visited are stored in a priority queue. + * + * Params: + * node = node to explore + * result = container for the k-nearest neighbors found + * vec = query points + * checks = how many points in the dataset have been checked so far + * maxChecks = maximum dataset points to checks + */ + + + void findNN(NodePtr node, ResultSet& result, const ElementType* vec, int& checks, int maxChecks, + const cv::Ptr>& heap, std::vector& checked, bool explore_all_trees = false) + { + if (node->childs==NULL) { + if (!explore_all_trees && (checks>=maxChecks) && result.full()) { + return; + } + for (int i=0; isize; ++i) { + int index = node->indices[i]; + if (!checked[index]) { + DistanceType dist = distance(dataset[index], vec, veclen_); + result.addPoint(dist, index); + checked[index] = true; + ++checks; + } + } + } + else { + DistanceType* domain_distances = new DistanceType[branching_]; + int best_index = 0; + domain_distances[best_index] = distance(vec, dataset[node->childs[best_index]->pivot], veclen_); + for (int i=1; ichilds[i]->pivot], veclen_); + if (domain_distances[i]insert(BranchSt(node->childs[i],domain_distances[i])); + } + } + delete[] domain_distances; + findNN(node->childs[best_index],result,vec, checks, maxChecks, heap, checked, explore_all_trees); + } + } + +private: + + + /** + * The dataset used by this index + */ + const Matrix dataset; + + /** + * Parameters used by this index + */ + IndexParams params; + + + /** + * Number of features in the dataset. + */ + size_t size_; + + /** + * Length of each feature. + */ + size_t veclen_; + + /** + * The root node in the tree. + */ + NodePtr* root; + + /** + * Array of indices to vectors in the dataset. + */ + int** indices; + + + /** + * The distance + */ + Distance distance; + + /** + * Pooled memory allocator. + * + * Using a pooled memory allocator is more efficient + * than allocating memory directly when there is a large + * number small of memory allocations. + */ + PooledAllocator pool; + + /** + * Memory occupied by the index. + */ + int memoryCounter; + + /** index parameters */ + int branching_; + int trees_; + flann_centers_init_t centers_init_; + int leaf_size_; + + +}; + +} + +//! @endcond + +#endif /* OPENCV_FLANN_HIERARCHICAL_CLUSTERING_INDEX_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/index_testing.h b/Thirdparty/opencv2/include/opencv2/flann/index_testing.h new file mode 100644 index 0000000..4c00143 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/index_testing.h @@ -0,0 +1,319 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_INDEX_TESTING_H_ +#define OPENCV_FLANN_INDEX_TESTING_H_ + +//! @cond IGNORED + +#include +#include + +#include "matrix.h" +#include "nn_index.h" +#include "result_set.h" +#include "logger.h" +#include "timer.h" + + +namespace cvflann +{ + +inline int countCorrectMatches(int* neighbors, int* groundTruth, int n) +{ + int count = 0; + for (int i=0; i +typename Distance::ResultType computeDistanceRaport(const Matrix& inputData, typename Distance::ElementType* target, + int* neighbors, int* groundTruth, int veclen, int n, const Distance& distance) +{ + typedef typename Distance::ResultType DistanceType; + + DistanceType ret = 0; + for (int i=0; i +float search_with_ground_truth(NNIndex& index, const Matrix& inputData, + const Matrix& testData, const Matrix& matches, int nn, int checks, + float& time, typename Distance::ResultType& dist, const Distance& distance, int skipMatches) +{ + typedef typename Distance::ResultType DistanceType; + + if (matches.cols resultSet(nn+skipMatches); + SearchParams searchParams(checks); + + std::vector indices(nn+skipMatches); + std::vector dists(nn+skipMatches); + int* neighbors = &indices[skipMatches]; + + int correct = 0; + DistanceType distR = 0; + StartStopTimer t; + int repeats = 0; + while (t.value<0.2) { + repeats++; + t.start(); + correct = 0; + distR = 0; + for (size_t i = 0; i < testData.rows; i++) { + resultSet.init(&indices[0], &dists[0]); + index.findNeighbors(resultSet, testData[i], searchParams); + + correct += countCorrectMatches(neighbors,matches[i], nn); + distR += computeDistanceRaport(inputData, testData[i], neighbors, matches[i], (int)testData.cols, nn, distance); + } + t.stop(); + } + time = float(t.value/repeats); + + float precicion = (float)correct/(nn*testData.rows); + + dist = distR/(testData.rows*nn); + + Logger::info("%8d %10.4g %10.5g %10.5g %10.5g\n", + checks, precicion, time, 1000.0 * time / testData.rows, dist); + + return precicion; +} + + +template +float test_index_checks(NNIndex& index, const Matrix& inputData, + const Matrix& testData, const Matrix& matches, + int checks, float& precision, const Distance& distance, int nn = 1, int skipMatches = 0) +{ + typedef typename Distance::ResultType DistanceType; + + Logger::info(" Nodes Precision(%) Time(s) Time/vec(ms) Mean dist\n"); + Logger::info("---------------------------------------------------------\n"); + + float time = 0; + DistanceType dist = 0; + precision = search_with_ground_truth(index, inputData, testData, matches, nn, checks, time, dist, distance, skipMatches); + + return time; +} + +template +float test_index_precision(NNIndex& index, const Matrix& inputData, + const Matrix& testData, const Matrix& matches, + float precision, int& checks, const Distance& distance, int nn = 1, int skipMatches = 0) +{ + typedef typename Distance::ResultType DistanceType; + const float SEARCH_EPS = 0.001f; + + Logger::info(" Nodes Precision(%) Time(s) Time/vec(ms) Mean dist\n"); + Logger::info("---------------------------------------------------------\n"); + + int c2 = 1; + float p2; + int c1 = 1; + //float p1; + float time; + DistanceType dist; + + p2 = search_with_ground_truth(index, inputData, testData, matches, nn, c2, time, dist, distance, skipMatches); + + if (p2>precision) { + Logger::info("Got as close as I can\n"); + checks = c2; + return time; + } + + while (p2SEARCH_EPS) { + Logger::info("Start linear estimation\n"); + // after we got to values in the vecinity of the desired precision + // use linear approximation get a better estimation + + cx = (c1+c2)/2; + realPrecision = search_with_ground_truth(index, inputData, testData, matches, nn, cx, time, dist, distance, skipMatches); + while (fabs(realPrecision-precision)>SEARCH_EPS) { + + if (realPrecision +void test_index_precisions(NNIndex& index, const Matrix& inputData, + const Matrix& testData, const Matrix& matches, + float* precisions, int precisions_length, const Distance& distance, int nn = 1, int skipMatches = 0, float maxTime = 0) +{ + typedef typename Distance::ResultType DistanceType; + + const float SEARCH_EPS = 0.001; + + // make sure precisions array is sorted + std::sort(precisions, precisions+precisions_length); + + int pindex = 0; + float precision = precisions[pindex]; + + Logger::info(" Nodes Precision(%) Time(s) Time/vec(ms) Mean dist\n"); + Logger::info("---------------------------------------------------------\n"); + + int c2 = 1; + float p2; + + int c1 = 1; + + float time; + DistanceType dist; + + p2 = search_with_ground_truth(index, inputData, testData, matches, nn, c2, time, dist, distance, skipMatches); + + // if precision for 1 run down the tree is already + // better then some of the requested precisions, then + // skip those + while (precisions[pindex] 0)&&(time > maxTime)&&(p2SEARCH_EPS) { + Logger::info("Start linear estimation\n"); + // after we got to values in the vecinity of the desired precision + // use linear approximation get a better estimation + + cx = (c1+c2)/2; + realPrecision = search_with_ground_truth(index, inputData, testData, matches, nn, cx, time, dist, distance, skipMatches); + while (fabs(realPrecision-precision)>SEARCH_EPS) { + + if (realPrecision +#include +#include + +#include "nn_index.h" +#include "dynamic_bitset.h" +#include "matrix.h" +#include "result_set.h" +#include "heap.h" +#include "allocator.h" +#include "random.h" +#include "saving.h" + + +namespace cvflann +{ + +struct KDTreeIndexParams : public IndexParams +{ + KDTreeIndexParams(int trees = 4) + { + (*this)["algorithm"] = FLANN_INDEX_KDTREE; + (*this)["trees"] = trees; + } +}; + + +/** + * Randomized kd-tree index + * + * Contains the k-d trees and other information for indexing a set of points + * for nearest-neighbor matching. + */ +template +class KDTreeIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + + /** + * KDTree constructor + * + * Params: + * inputData = dataset with the input features + * params = parameters passed to the kdtree algorithm + */ + KDTreeIndex(const Matrix& inputData, const IndexParams& params = KDTreeIndexParams(), + Distance d = Distance() ) : + dataset_(inputData), index_params_(params), distance_(d) + { + size_ = dataset_.rows; + veclen_ = dataset_.cols; + + trees_ = get_param(index_params_,"trees",4); + tree_roots_ = new NodePtr[trees_]; + + // Create a permutable array of indices to the input vectors. + vind_.resize(size_); + for (size_t i = 0; i < size_; ++i) { + vind_[i] = int(i); + } + + mean_ = new DistanceType[veclen_]; + var_ = new DistanceType[veclen_]; + } + + + KDTreeIndex(const KDTreeIndex&); + KDTreeIndex& operator=(const KDTreeIndex&); + + /** + * Standard destructor + */ + ~KDTreeIndex() + { + if (tree_roots_!=NULL) { + delete[] tree_roots_; + } + delete[] mean_; + delete[] var_; + } + + /** + * Builds the index + */ + void buildIndex() CV_OVERRIDE + { + /* Construct the randomized trees. */ + for (int i = 0; i < trees_; i++) { + /* Randomize the order of vectors to allow for unbiased sampling. */ +#ifndef OPENCV_FLANN_USE_STD_RAND + cv::randShuffle(vind_); +#else + std::random_shuffle(vind_.begin(), vind_.end()); +#endif + + tree_roots_[i] = divideTree(&vind_[0], int(size_) ); + } + } + + + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_KDTREE; + } + + + void saveIndex(FILE* stream) CV_OVERRIDE + { + save_value(stream, trees_); + for (int i=0; i& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + const int maxChecks = get_param(searchParams,"checks", 32); + const float epsError = 1+get_param(searchParams,"eps",0.0f); + const bool explore_all_trees = get_param(searchParams,"explore_all_trees",false); + + if (maxChecks==FLANN_CHECKS_UNLIMITED) { + getExactNeighbors(result, vec, epsError); + } + else { + getNeighbors(result, vec, maxChecks, epsError, explore_all_trees); + } + } + + IndexParams getParameters() const CV_OVERRIDE + { + return index_params_; + } + +private: + + + /*--------------------- Internal Data Structures --------------------------*/ + struct Node + { + /** + * Dimension used for subdivision. + */ + int divfeat; + /** + * The values used for subdivision. + */ + DistanceType divval; + /** + * The child nodes. + */ + Node* child1, * child2; + }; + typedef Node* NodePtr; + typedef BranchStruct BranchSt; + typedef BranchSt* Branch; + + + + void save_tree(FILE* stream, NodePtr tree) + { + save_value(stream, *tree); + if (tree->child1!=NULL) { + save_tree(stream, tree->child1); + } + if (tree->child2!=NULL) { + save_tree(stream, tree->child2); + } + } + + + void load_tree(FILE* stream, NodePtr& tree) + { + tree = pool_.allocate(); + load_value(stream, *tree); + if (tree->child1!=NULL) { + load_tree(stream, tree->child1); + } + if (tree->child2!=NULL) { + load_tree(stream, tree->child2); + } + } + + + /** + * Create a tree node that subdivides the list of vecs from vind[first] + * to vind[last]. The routine is called recursively on each sublist. + * Place a pointer to this new tree node in the location pTree. + * + * Params: pTree = the new node to create + * first = index of the first vector + * last = index of the last vector + */ + NodePtr divideTree(int* ind, int count) + { + NodePtr node = pool_.allocate(); // allocate memory + + /* If too few exemplars remain, then make this a leaf node. */ + if ( count == 1) { + node->child1 = node->child2 = NULL; /* Mark as leaf node. */ + node->divfeat = *ind; /* Store index of this vec. */ + } + else { + int idx; + int cutfeat; + DistanceType cutval; + meanSplit(ind, count, idx, cutfeat, cutval); + + node->divfeat = cutfeat; + node->divval = cutval; + node->child1 = divideTree(ind, idx); + node->child2 = divideTree(ind+idx, count-idx); + } + + return node; + } + + + /** + * Choose which feature to use in order to subdivide this set of vectors. + * Make a random choice among those with the highest variance, and use + * its variance as the threshold value. + */ + void meanSplit(int* ind, int count, int& index, int& cutfeat, DistanceType& cutval) + { + memset(mean_,0,veclen_*sizeof(DistanceType)); + memset(var_,0,veclen_*sizeof(DistanceType)); + + /* Compute mean values. Only the first SAMPLE_MEAN values need to be + sampled to get a good estimate. + */ + int cnt = std::min((int)SAMPLE_MEAN+1, count); + for (int j = 0; j < cnt; ++j) { + ElementType* v = dataset_[ind[j]]; + for (size_t k=0; kcount/2) index = lim1; + else if (lim2 v[topind[num-1]])) { + /* Put this element at end of topind. */ + if (num < RAND_DIM) { + topind[num++] = i; /* Add to list. */ + } + else { + topind[num-1] = i; /* Replace last element. */ + } + /* Bubble end value down to right location by repeated swapping. */ + int j = num - 1; + while (j > 0 && v[topind[j]] > v[topind[j-1]]) { + std::swap(topind[j], topind[j-1]); + --j; + } + } + } + /* Select a random integer in range [0,num-1], and return that index. */ + int rnd = rand_int(num); + return (int)topind[rnd]; + } + + + /** + * Subdivide the list of points by a plane perpendicular on axe corresponding + * to the 'cutfeat' dimension at 'cutval' position. + * + * On return: + * dataset[ind[0..lim1-1]][cutfeat]cutval + */ + void planeSplit(int* ind, int count, int cutfeat, DistanceType cutval, int& lim1, int& lim2) + { + /* Move vector indices for left subtree to front of list. */ + int left = 0; + int right = count-1; + for (;; ) { + while (left<=right && dataset_[ind[left]][cutfeat]=cutval) --right; + if (left>right) break; + std::swap(ind[left], ind[right]); ++left; --right; + } + lim1 = left; + right = count-1; + for (;; ) { + while (left<=right && dataset_[ind[left]][cutfeat]<=cutval) ++left; + while (left<=right && dataset_[ind[right]][cutfeat]>cutval) --right; + if (left>right) break; + std::swap(ind[left], ind[right]); ++left; --right; + } + lim2 = left; + } + + /** + * Performs an exact nearest neighbor search. The exact search performs a full + * traversal of the tree. + */ + void getExactNeighbors(ResultSet& result, const ElementType* vec, float epsError) + { + // checkID -= 1; /* Set a different unique ID for each search. */ + + if (trees_ > 1) { + fprintf(stderr,"It doesn't make any sense to use more than one tree for exact search"); + } + if (trees_>0) { + searchLevelExact(result, vec, tree_roots_[0], 0.0, epsError); + } + CV_Assert(result.full()); + } + + /** + * Performs the approximate nearest-neighbor search. The search is approximate + * because the tree traversal is abandoned after a given number of descends in + * the tree. + */ + void getNeighbors(ResultSet& result, const ElementType* vec, + int maxCheck, float epsError, bool explore_all_trees = false) + { + int i; + BranchSt branch; + int checkCount = 0; + DynamicBitset checked(size_); + + // Priority queue storing intermediate branches in the best-bin-first search + const cv::Ptr>& heap = Heap::getPooledInstance(cv::utils::getThreadID(), (int)size_); + + /* Search once through each tree down to root. */ + for (i = 0; i < trees_; ++i) { + searchLevel(result, vec, tree_roots_[i], 0, checkCount, maxCheck, + epsError, heap, checked, explore_all_trees); + if (!explore_all_trees && (checkCount >= maxCheck) && result.full()) + break; + } + + /* Keep searching other branches from heap until finished. */ + while ( heap->popMin(branch) && (checkCount < maxCheck || !result.full() )) { + searchLevel(result, vec, branch.node, branch.mindist, checkCount, maxCheck, + epsError, heap, checked, false); + } + + CV_Assert(result.full()); + } + + + /** + * Search starting from a given node of the tree. Based on any mismatches at + * higher levels, all exemplars below this level must have a distance of + * at least "mindistsq". + */ + void searchLevel(ResultSet& result_set, const ElementType* vec, NodePtr node, DistanceType mindist, int& checkCount, int maxCheck, + float epsError, const cv::Ptr>& heap, DynamicBitset& checked, bool explore_all_trees = false) + { + if (result_set.worstDist()child1 == NULL)&&(node->child2 == NULL)) { + /* Do not check same node more than once when searching multiple trees. + Once a vector is checked, we set its location in vind to the + current checkID. + */ + int index = node->divfeat; + if ( checked.test(index) || + (!explore_all_trees && (checkCount>=maxCheck) && result_set.full()) ) { + return; + } + checked.set(index); + checkCount++; + + DistanceType dist = distance_(dataset_[index], vec, veclen_); + result_set.addPoint(dist,index); + + return; + } + + /* Which child branch should be taken first? */ + ElementType val = vec[node->divfeat]; + DistanceType diff = val - node->divval; + NodePtr bestChild = (diff < 0) ? node->child1 : node->child2; + NodePtr otherChild = (diff < 0) ? node->child2 : node->child1; + + /* Create a branch record for the branch not taken. Add distance + of this feature boundary (we don't attempt to correct for any + use of this feature in a parent node, which is unlikely to + happen and would have only a small effect). Don't bother + adding more branches to heap after halfway point, as cost of + adding exceeds their value. + */ + + DistanceType new_distsq = mindist + distance_.accum_dist(val, node->divval, node->divfeat); + // if (2 * checkCount < maxCheck || !result.full()) { + if ((new_distsq*epsError < result_set.worstDist())|| !result_set.full()) { + heap->insert( BranchSt(otherChild, new_distsq) ); + } + + /* Call recursively to search next level down. */ + searchLevel(result_set, vec, bestChild, mindist, checkCount, maxCheck, epsError, heap, checked); + } + + /** + * Performs an exact search in the tree starting from a node. + */ + void searchLevelExact(ResultSet& result_set, const ElementType* vec, const NodePtr node, DistanceType mindist, const float epsError) + { + /* If this is a leaf node, then do check and return. */ + if ((node->child1 == NULL)&&(node->child2 == NULL)) { + int index = node->divfeat; + DistanceType dist = distance_(dataset_[index], vec, veclen_); + result_set.addPoint(dist,index); + return; + } + + /* Which child branch should be taken first? */ + ElementType val = vec[node->divfeat]; + DistanceType diff = val - node->divval; + NodePtr bestChild = (diff < 0) ? node->child1 : node->child2; + NodePtr otherChild = (diff < 0) ? node->child2 : node->child1; + + /* Create a branch record for the branch not taken. Add distance + of this feature boundary (we don't attempt to correct for any + use of this feature in a parent node, which is unlikely to + happen and would have only a small effect). Don't bother + adding more branches to heap after halfway point, as cost of + adding exceeds their value. + */ + + DistanceType new_distsq = mindist + distance_.accum_dist(val, node->divval, node->divfeat); + + /* Call recursively to search next level down. */ + searchLevelExact(result_set, vec, bestChild, mindist, epsError); + + if (new_distsq*epsError<=result_set.worstDist()) { + searchLevelExact(result_set, vec, otherChild, new_distsq, epsError); + } + } + + +private: + + enum + { + /** + * To improve efficiency, only SAMPLE_MEAN random values are used to + * compute the mean and variance at each level when building a tree. + * A value of 100 seems to perform as well as using all values. + */ + SAMPLE_MEAN = 100, + /** + * Top random dimensions to consider + * + * When creating random trees, the dimension on which to subdivide is + * selected at random from among the top RAND_DIM dimensions with the + * highest variance. A value of 5 works well. + */ + RAND_DIM=5 + }; + + + /** + * Number of randomized trees that are used + */ + int trees_; + + /** + * Array of indices to vectors in the dataset. + */ + std::vector vind_; + + /** + * The dataset used by this index + */ + const Matrix dataset_; + + IndexParams index_params_; + + size_t size_; + size_t veclen_; + + + DistanceType* mean_; + DistanceType* var_; + + + /** + * Array of k-d trees used to find neighbours. + */ + NodePtr* tree_roots_; + + /** + * Pooled memory allocator. + * + * Using a pooled memory allocator is more efficient + * than allocating memory directly when there is a large + * number small of memory allocations. + */ + PooledAllocator pool_; + + Distance distance_; + + +}; // class KDTreeForest + +} + +//! @endcond + +#endif //OPENCV_FLANN_KDTREE_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/kdtree_single_index.h b/Thirdparty/opencv2/include/opencv2/flann/kdtree_single_index.h new file mode 100644 index 0000000..ed95c3d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/kdtree_single_index.h @@ -0,0 +1,645 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_KDTREE_SINGLE_INDEX_H_ +#define OPENCV_FLANN_KDTREE_SINGLE_INDEX_H_ + +//! @cond IGNORED + +#include +#include +#include + +#include "nn_index.h" +#include "matrix.h" +#include "result_set.h" +#include "heap.h" +#include "allocator.h" +#include "random.h" +#include "saving.h" + +namespace cvflann +{ + +struct KDTreeSingleIndexParams : public IndexParams +{ + KDTreeSingleIndexParams(int leaf_max_size = 10, bool reorder = true, int dim = -1) + { + (*this)["algorithm"] = FLANN_INDEX_KDTREE_SINGLE; + (*this)["leaf_max_size"] = leaf_max_size; + (*this)["reorder"] = reorder; + (*this)["dim"] = dim; + } +}; + + +/** + * Randomized kd-tree index + * + * Contains the k-d trees and other information for indexing a set of points + * for nearest-neighbor matching. + */ +template +class KDTreeSingleIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + + /** + * KDTree constructor + * + * Params: + * inputData = dataset with the input features + * params = parameters passed to the kdtree algorithm + */ + KDTreeSingleIndex(const Matrix& inputData, const IndexParams& params = KDTreeSingleIndexParams(), + Distance d = Distance() ) : + dataset_(inputData), index_params_(params), distance_(d) + { + size_ = dataset_.rows; + dim_ = dataset_.cols; + root_node_ = 0; + int dim_param = get_param(params,"dim",-1); + if (dim_param>0) dim_ = dim_param; + leaf_max_size_ = get_param(params,"leaf_max_size",10); + reorder_ = get_param(params,"reorder",true); + + // Create a permutable array of indices to the input vectors. + vind_.resize(size_); + for (size_t i = 0; i < size_; i++) { + vind_[i] = (int)i; + } + } + + KDTreeSingleIndex(const KDTreeSingleIndex&); + KDTreeSingleIndex& operator=(const KDTreeSingleIndex&); + + /** + * Standard destructor + */ + ~KDTreeSingleIndex() + { + if (reorder_) delete[] data_.data; + } + + /** + * Builds the index + */ + void buildIndex() CV_OVERRIDE + { + computeBoundingBox(root_bbox_); + root_node_ = divideTree(0, (int)size_, root_bbox_ ); // construct the tree + + if (reorder_) { + delete[] data_.data; + data_ = cvflann::Matrix(new ElementType[size_*dim_], size_, dim_); + for (size_t i=0; i& queries, Matrix& indices, Matrix& dists, int knn, const SearchParams& params) CV_OVERRIDE + { + CV_Assert(queries.cols == veclen()); + CV_Assert(indices.rows >= queries.rows); + CV_Assert(dists.rows >= queries.rows); + CV_Assert(int(indices.cols) >= knn); + CV_Assert(int(dists.cols) >= knn); + + KNNSimpleResultSet resultSet(knn); + for (size_t i = 0; i < queries.rows; i++) { + resultSet.init(indices[i], dists[i]); + findNeighbors(resultSet, queries[i], params); + } + } + + IndexParams getParameters() const CV_OVERRIDE + { + return index_params_; + } + + /** + * Find set of nearest neighbors to vec. Their indices are stored inside + * the result object. + * + * Params: + * result = the result object in which the indices of the nearest-neighbors are stored + * vec = the vector for which to search the nearest neighbors + * maxCheck = the maximum number of restarts (in a best-bin-first manner) + */ + void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + float epsError = 1+get_param(searchParams,"eps",0.0f); + + std::vector dists(dim_,0); + DistanceType distsq = computeInitialDistances(vec, dists); + searchLevel(result, vec, root_node_, distsq, dists, epsError); + } + +private: + + + /*--------------------- Internal Data Structures --------------------------*/ + struct Node + { + /** + * Indices of points in leaf node + */ + int left, right; + /** + * Dimension used for subdivision. + */ + int divfeat; + /** + * The values used for subdivision. + */ + DistanceType divlow, divhigh; + /** + * The child nodes. + */ + Node* child1, * child2; + }; + typedef Node* NodePtr; + + + struct Interval + { + DistanceType low, high; + }; + + typedef std::vector BoundingBox; + + typedef BranchStruct BranchSt; + typedef BranchSt* Branch; + + + + + void save_tree(FILE* stream, NodePtr tree) + { + save_value(stream, *tree); + if (tree->child1!=NULL) { + save_tree(stream, tree->child1); + } + if (tree->child2!=NULL) { + save_tree(stream, tree->child2); + } + } + + + void load_tree(FILE* stream, NodePtr& tree) + { + tree = pool_.allocate(); + load_value(stream, *tree); + if (tree->child1!=NULL) { + load_tree(stream, tree->child1); + } + if (tree->child2!=NULL) { + load_tree(stream, tree->child2); + } + } + + + void computeBoundingBox(BoundingBox& bbox) + { + bbox.resize(dim_); + for (size_t i=0; ibbox[i].high) bbox[i].high = (DistanceType)dataset_[k][i]; + } + } + } + + + /** + * Create a tree node that subdivides the list of vecs from vind[first] + * to vind[last]. The routine is called recursively on each sublist. + * Place a pointer to this new tree node in the location pTree. + * + * Params: pTree = the new node to create + * first = index of the first vector + * last = index of the last vector + */ + NodePtr divideTree(int left, int right, BoundingBox& bbox) + { + NodePtr node = pool_.allocate(); // allocate memory + + /* If too few exemplars remain, then make this a leaf node. */ + if ( (right-left) <= leaf_max_size_) { + node->child1 = node->child2 = NULL; /* Mark as leaf node. */ + node->left = left; + node->right = right; + + // compute bounding-box of leaf points + for (size_t i=0; idataset_[vind_[k]][i]) bbox[i].low=(DistanceType)dataset_[vind_[k]][i]; + if (bbox[i].highdivfeat = cutfeat; + + BoundingBox left_bbox(bbox); + left_bbox[cutfeat].high = cutval; + node->child1 = divideTree(left, left+idx, left_bbox); + + BoundingBox right_bbox(bbox); + right_bbox[cutfeat].low = cutval; + node->child2 = divideTree(left+idx, right, right_bbox); + + node->divlow = left_bbox[cutfeat].high; + node->divhigh = right_bbox[cutfeat].low; + + for (size_t i=0; imax_elem) max_elem = val; + } + } + + void middleSplit(int* ind, int count, int& index, int& cutfeat, DistanceType& cutval, const BoundingBox& bbox) + { + // find the largest span from the approximate bounding box + ElementType max_span = bbox[0].high-bbox[0].low; + cutfeat = 0; + cutval = (bbox[0].high+bbox[0].low)/2; + for (size_t i=1; imax_span) { + max_span = span; + cutfeat = i; + cutval = (bbox[i].high+bbox[i].low)/2; + } + } + + // compute exact span on the found dimension + ElementType min_elem, max_elem; + computeMinMax(ind, count, cutfeat, min_elem, max_elem); + cutval = (min_elem+max_elem)/2; + max_span = max_elem - min_elem; + + // check if a dimension of a largest span exists + size_t k = cutfeat; + for (size_t i=0; imax_span) { + computeMinMax(ind, count, i, min_elem, max_elem); + span = max_elem - min_elem; + if (span>max_span) { + max_span = span; + cutfeat = i; + cutval = (min_elem+max_elem)/2; + } + } + } + int lim1, lim2; + planeSplit(ind, count, cutfeat, cutval, lim1, lim2); + + if (lim1>count/2) index = lim1; + else if (lim2max_span) { + max_span = span; + } + } + DistanceType max_spread = -1; + cutfeat = 0; + for (size_t i=0; i(DistanceType)((1-EPS)*max_span)) { + ElementType min_elem, max_elem; + computeMinMax(ind, count, (int)i, min_elem, max_elem); + DistanceType spread = (DistanceType)(max_elem-min_elem); + if (spread>max_spread) { + cutfeat = (int)i; + max_spread = spread; + } + } + } + // split in the middle + DistanceType split_val = (bbox[cutfeat].low+bbox[cutfeat].high)/2; + ElementType min_elem, max_elem; + computeMinMax(ind, count, cutfeat, min_elem, max_elem); + + if (split_valmax_elem) cutval = (DistanceType)max_elem; + else cutval = split_val; + + int lim1, lim2; + planeSplit(ind, count, cutfeat, cutval, lim1, lim2); + + if (lim1>count/2) index = lim1; + else if (lim2cutval + */ + void planeSplit(int* ind, int count, int cutfeat, DistanceType cutval, int& lim1, int& lim2) + { + /* Move vector indices for left subtree to front of list. */ + int left = 0; + int right = count-1; + for (;; ) { + while (left<=right && dataset_[ind[left]][cutfeat]=cutval) --right; + if (left>right) break; + std::swap(ind[left], ind[right]); ++left; --right; + } + /* If either list is empty, it means that all remaining features + * are identical. Split in the middle to maintain a balanced tree. + */ + lim1 = left; + right = count-1; + for (;; ) { + while (left<=right && dataset_[ind[left]][cutfeat]<=cutval) ++left; + while (left<=right && dataset_[ind[right]][cutfeat]>cutval) --right; + if (left>right) break; + std::swap(ind[left], ind[right]); ++left; --right; + } + lim2 = left; + } + + DistanceType computeInitialDistances(const ElementType* vec, std::vector& dists) + { + DistanceType distsq = 0.0; + + for (size_t i = 0; i < dim_; ++i) { + if (vec[i] < root_bbox_[i].low) { + dists[i] = distance_.accum_dist(vec[i], root_bbox_[i].low, (int)i); + distsq += dists[i]; + } + if (vec[i] > root_bbox_[i].high) { + dists[i] = distance_.accum_dist(vec[i], root_bbox_[i].high, (int)i); + distsq += dists[i]; + } + } + + return distsq; + } + + /** + * Performs an exact search in the tree starting from a node. + */ + void searchLevel(ResultSet& result_set, const ElementType* vec, const NodePtr node, DistanceType mindistsq, + std::vector& dists, const float epsError) + { + /* If this is a leaf node, then do check and return. */ + if ((node->child1 == NULL)&&(node->child2 == NULL)) { + DistanceType worst_dist = result_set.worstDist(); + if (reorder_) { + for (int i=node->left; iright; ++i) { + DistanceType dist = distance_(vec, data_[i], dim_, worst_dist); + if (distleft; iright; ++i) { + DistanceType dist = distance_(vec, data_[vind_[i]], dim_, worst_dist); + if (distdivfeat; + ElementType val = vec[idx]; + DistanceType diff1 = val - node->divlow; + DistanceType diff2 = val - node->divhigh; + + NodePtr bestChild; + NodePtr otherChild; + DistanceType cut_dist; + if ((diff1+diff2)<0) { + bestChild = node->child1; + otherChild = node->child2; + cut_dist = distance_.accum_dist(val, node->divhigh, idx); + } + else { + bestChild = node->child2; + otherChild = node->child1; + cut_dist = distance_.accum_dist( val, node->divlow, idx); + } + + /* Call recursively to search next level down. */ + searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError); + + DistanceType dst = dists[idx]; + mindistsq = mindistsq + cut_dist - dst; + dists[idx] = cut_dist; + if (mindistsq*epsError<=result_set.worstDist()) { + searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError); + } + dists[idx] = dst; + } + +private: + + /** + * The dataset used by this index + */ + const Matrix dataset_; + + IndexParams index_params_; + + int leaf_max_size_; + bool reorder_; + + + /** + * Array of indices to vectors in the dataset. + */ + std::vector vind_; + + Matrix data_; + + size_t size_; + size_t dim_; + + /** + * Array of k-d trees used to find neighbours. + */ + NodePtr root_node_; + + BoundingBox root_bbox_; + + /** + * Pooled memory allocator. + * + * Using a pooled memory allocator is more efficient + * than allocating memory directly when there is a large + * number small of memory allocations. + */ + PooledAllocator pool_; + + Distance distance_; +}; // class KDTree + +} + +//! @endcond + +#endif //OPENCV_FLANN_KDTREE_SINGLE_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/kmeans_index.h b/Thirdparty/opencv2/include/opencv2/flann/kmeans_index.h new file mode 100644 index 0000000..fd7fe2b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/kmeans_index.h @@ -0,0 +1,1819 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_KMEANS_INDEX_H_ +#define OPENCV_FLANN_KMEANS_INDEX_H_ + +//! @cond IGNORED + +#include +#include +#include +#include + +#include "general.h" +#include "nn_index.h" +#include "dist.h" +#include "matrix.h" +#include "result_set.h" +#include "heap.h" +#include "allocator.h" +#include "random.h" +#include "saving.h" +#include "logger.h" + +#define BITS_PER_CHAR 8 +#define BITS_PER_BASE 2 // for DNA/RNA sequences +#define BASE_PER_CHAR (BITS_PER_CHAR/BITS_PER_BASE) +#define HISTOS_PER_BASE (1< +class KMeansIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + typedef typename Distance::CentersType CentersType; + + typedef typename Distance::is_kdtree_distance is_kdtree_distance; + typedef typename Distance::is_vector_space_distance is_vector_space_distance; + + + + typedef void (KMeansIndex::* centersAlgFunction)(int, int*, int, int*, int&); + + /** + * The function used for choosing the cluster centers. + */ + centersAlgFunction chooseCenters; + + + + /** + * Chooses the initial centers in the k-means clustering in a random manner. + * + * Params: + * k = number of centers + * vecs = the dataset of points + * indices = indices in the dataset + * indices_length = length of indices vector + * + */ + void chooseCentersRandom(int k, int* indices, int indices_length, int* centers, int& centers_length) + { + UniqueRandom r(indices_length); + + int index; + for (index=0; index=0 && rnd < n); + + centers[0] = indices[rnd]; + + int index; + for (index=1; indexbest_val) { + best_val = dist; + best_index = j; + } + } + if (best_index!=-1) { + centers[index] = indices[best_index]; + } + else { + break; + } + } + centers_length = index; + } + + + /** + * Chooses the initial centers in the k-means using the algorithm + * proposed in the KMeans++ paper: + * Arthur, David; Vassilvitskii, Sergei - k-means++: The Advantages of Careful Seeding + * + * Implementation of this function was converted from the one provided in Arthur's code. + * + * Params: + * k = number of centers + * vecs = the dataset of points + * indices = indices in the dataset + * Returns: + */ + void chooseCentersKMeanspp(int k, int* indices, int indices_length, int* centers, int& centers_length) + { + int n = indices_length; + + double currentPot = 0; + DistanceType* closestDistSq = new DistanceType[n]; + + // Choose one random center and set the closestDistSq values + int index = rand_int(n); + CV_DbgAssert(index >=0 && index < n); + centers[0] = indices[index]; + + for (int i = 0; i < n; i++) { + closestDistSq[i] = distance_(dataset_[indices[i]], dataset_[indices[index]], dataset_.cols); + closestDistSq[i] = ensureSquareDistance( closestDistSq[i] ); + currentPot += closestDistSq[i]; + } + + + const int numLocalTries = 1; + + // Choose each center + int centerCount; + for (centerCount = 1; centerCount < k; centerCount++) { + + // Repeat several trials + double bestNewPot = -1; + int bestNewIndex = -1; + for (int localTrial = 0; localTrial < numLocalTries; localTrial++) { + + // Choose our center - have to be slightly careful to return a valid answer even accounting + // for possible rounding errors + double randVal = rand_double(currentPot); + for (index = 0; index < n-1; index++) { + if (randVal <= closestDistSq[index]) break; + else randVal -= closestDistSq[index]; + } + + // Compute the new potential + double newPot = 0; + for (int i = 0; i < n; i++) { + DistanceType dist = distance_(dataset_[indices[i]], dataset_[indices[index]], dataset_.cols); + newPot += std::min( ensureSquareDistance(dist), closestDistSq[i] ); + } + + // Store the best result + if ((bestNewPot < 0)||(newPot < bestNewPot)) { + bestNewPot = newPot; + bestNewIndex = index; + } + } + + // Add the appropriate center + centers[centerCount] = indices[bestNewIndex]; + currentPot = bestNewPot; + for (int i = 0; i < n; i++) { + DistanceType dist = distance_(dataset_[indices[i]], dataset_[indices[bestNewIndex]], dataset_.cols); + closestDistSq[i] = std::min( ensureSquareDistance(dist), closestDistSq[i] ); + } + } + + centers_length = centerCount; + + delete[] closestDistSq; + } + + + +public: + + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_KMEANS; + } + + template + class KMeansDistanceComputer : public cv::ParallelLoopBody + { + public: + KMeansDistanceComputer(Distance _distance, const Matrix& _dataset, + const int _branching, const int* _indices, const CentersContainerType& _dcenters, + const size_t _veclen, std::vector &_new_centroids, + std::vector &_sq_dists) + : distance(_distance) + , dataset(_dataset) + , branching(_branching) + , indices(_indices) + , dcenters(_dcenters) + , veclen(_veclen) + , new_centroids(_new_centroids) + , sq_dists(_sq_dists) + { + } + + void operator()(const cv::Range& range) const CV_OVERRIDE + { + const int begin = range.start; + const int end = range.end; + + for( int i = begin; inew_sq_dist) { + new_centroid = j; + sq_dist = new_sq_dist; + } + } + sq_dists[i] = sq_dist; + new_centroids[i] = new_centroid; + } + } + + private: + Distance distance; + const Matrix& dataset; + const int branching; + const int* indices; + const CentersContainerType& dcenters; + const size_t veclen; + std::vector &new_centroids; + std::vector &sq_dists; + KMeansDistanceComputer& operator=( const KMeansDistanceComputer & ) { return *this; } + }; + + /** + * Index constructor + * + * Params: + * inputData = dataset with the input features + * params = parameters passed to the hierarchical k-means algorithm + */ + KMeansIndex(const Matrix& inputData, const IndexParams& params = KMeansIndexParams(), + Distance d = Distance()) + : dataset_(inputData), index_params_(params), root_(NULL), indices_(NULL), distance_(d) + { + memoryCounter_ = 0; + + size_ = dataset_.rows; + veclen_ = dataset_.cols; + + branching_ = get_param(params,"branching",32); + trees_ = get_param(params,"trees",1); + iterations_ = get_param(params,"iterations",11); + if (iterations_<0) { + iterations_ = (std::numeric_limits::max)(); + } + centers_init_ = get_param(params,"centers_init",FLANN_CENTERS_RANDOM); + + if (centers_init_==FLANN_CENTERS_RANDOM) { + chooseCenters = &KMeansIndex::chooseCentersRandom; + } + else if (centers_init_==FLANN_CENTERS_GONZALES) { + chooseCenters = &KMeansIndex::chooseCentersGonzales; + } + else if (centers_init_==FLANN_CENTERS_KMEANSPP) { + chooseCenters = &KMeansIndex::chooseCentersKMeanspp; + } + else { + FLANN_THROW(cv::Error::StsBadArg, "Unknown algorithm for choosing initial centers."); + } + cb_index_ = 0.4f; + + root_ = new KMeansNodePtr[trees_]; + indices_ = new int*[trees_]; + + for (int i=0; i(); + std::memset(root_[i], 0, sizeof(KMeansNode)); + + Distance* dummy = NULL; + computeNodeStatistics(root_[i], indices_[i], (unsigned int)size_, dummy); + + computeClustering(root_[i], indices_[i], (int)size_, branching_,0); + } + } + + + void saveIndex(FILE* stream) CV_OVERRIDE + { + save_value(stream, branching_); + save_value(stream, iterations_); + save_value(stream, memoryCounter_); + save_value(stream, cb_index_); + save_value(stream, trees_); + for (int i=0; i& result, const ElementType* vec, const SearchParams& searchParams) CV_OVERRIDE + { + + const int maxChecks = get_param(searchParams,"checks",32); + + if (maxChecks==FLANN_CHECKS_UNLIMITED) { + findExactNN(root_[0], result, vec); + } + else { + // Priority queue storing intermediate branches in the best-bin-first search + const cv::Ptr>& heap = Heap::getPooledInstance(cv::utils::getThreadID(), (int)size_); + + int checks = 0; + for (int i=0; i= maxChecks) && result.full()) + break; + } + + BranchSt branch; + while (heap->popMin(branch) && (checks& centers) + { + int numClusters = centers.rows; + if (numClusters<1) { + FLANN_THROW(cv::Error::StsBadArg, "Number of clusters must be at least 1"); + } + + DistanceType variance; + KMeansNodePtr* clusters = new KMeansNodePtr[numClusters]; + + int clusterCount = getMinVarianceClusters(root_[0], clusters, numClusters, variance); + + Logger::info("Clusters requested: %d, returning %d\n",numClusters, clusterCount); + + for (int i=0; ipivot; + for (size_t j=0; j BranchSt; + + + + + void save_tree(FILE* stream, KMeansNodePtr node, int num) + { + save_value(stream, *node); + save_value(stream, *(node->pivot), (int)veclen_); + if (node->childs==NULL) { + int indices_offset = (int)(node->indices - indices_[num]); + save_value(stream, indices_offset); + } + else { + for(int i=0; ichilds[i], num); + } + } + } + + + void load_tree(FILE* stream, KMeansNodePtr& node, int num) + { + node = pool_.allocate(); + load_value(stream, *node); + node->pivot = new CentersType[veclen_]; + load_value(stream, *(node->pivot), (int)veclen_); + if (node->childs==NULL) { + int indices_offset; + load_value(stream, indices_offset); + node->indices = indices_[num] + indices_offset; + } + else { + node->childs = pool_.allocate(branching_); + for(int i=0; ichilds[i], num); + } + } + } + + + /** + * Helper function + */ + void free_centers(KMeansNodePtr node) + { + delete[] node->pivot; + if (node->childs!=NULL) { + for (int k=0; kchilds[k]); + } + } + } + + void free_centers() + { + if (root_ != NULL) { + for(int i=0; i(), veclen_); + } + float length = static_cast(indices_length); + for (size_t j=0; j( mean[j] / static_cast(indices_length) ); + } + variance /= static_cast( length ); + variance -= distance_(mean, ZeroIterator(), veclen_); + + DistanceType radius = 0; + for (unsigned int i=0; iradius) { + radius = tmp; + } + } + + node->variance = variance; + node->radius = radius; + node->pivot = mean; + } + + + void computeBitfieldNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length) + { + const unsigned int accumulator_veclen = static_cast( + veclen_*sizeof(CentersType)*BITS_PER_CHAR); + + unsigned long long variance = 0ull; + CentersType* mean = new CentersType[veclen_]; + memoryCounter_ += int(veclen_*sizeof(CentersType)); + unsigned int* mean_accumulator = new unsigned int[accumulator_veclen]; + + memset(mean_accumulator, 0, sizeof(unsigned int)*accumulator_veclen); + + for (unsigned int i=0; i( ensureSquareDistance( + distance_(dataset_[indices[i]], ZeroIterator(), veclen_))); + unsigned char* vec = (unsigned char*)dataset_[indices[i]]; + for (size_t k=0, l=0; k>1) & 0x01; + mean_accumulator[k+2] += (vec[l]>>2) & 0x01; + mean_accumulator[k+3] += (vec[l]>>3) & 0x01; + mean_accumulator[k+4] += (vec[l]>>4) & 0x01; + mean_accumulator[k+5] += (vec[l]>>5) & 0x01; + mean_accumulator[k+6] += (vec[l]>>6) & 0x01; + mean_accumulator[k+7] += (vec[l]>>7) & 0x01; + } + } + double cnt = static_cast(indices_length); + unsigned char* char_mean = (unsigned char*)mean; + for (size_t k=0, l=0; k( + (((int)(0.5 + (double)(mean_accumulator[k]) / cnt))) + | (((int)(0.5 + (double)(mean_accumulator[k+1]) / cnt))<<1) + | (((int)(0.5 + (double)(mean_accumulator[k+2]) / cnt))<<2) + | (((int)(0.5 + (double)(mean_accumulator[k+3]) / cnt))<<3) + | (((int)(0.5 + (double)(mean_accumulator[k+4]) / cnt))<<4) + | (((int)(0.5 + (double)(mean_accumulator[k+5]) / cnt))<<5) + | (((int)(0.5 + (double)(mean_accumulator[k+6]) / cnt))<<6) + | (((int)(0.5 + (double)(mean_accumulator[k+7]) / cnt))<<7)); + } + variance = static_cast( + 0.5 + static_cast(variance) / static_cast(indices_length)); + variance -= static_cast( + ensureSquareDistance( + distance_(mean, ZeroIterator(), veclen_))); + + DistanceType radius = 0; + for (unsigned int i=0; iradius) { + radius = tmp; + } + } + + node->variance = static_cast(variance); + node->radius = radius; + node->pivot = mean; + + delete[] mean_accumulator; + } + + + void computeDnaNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length) + { + const unsigned int histos_veclen = static_cast( + veclen_*sizeof(CentersType)*(HISTOS_PER_BASE*BASE_PER_CHAR)); + + unsigned long long variance = 0ull; + unsigned int* histograms = new unsigned int[histos_veclen]; + memset(histograms, 0, sizeof(unsigned int)*histos_veclen); + + for (unsigned int i=0; i( ensureSquareDistance( + distance_(dataset_[indices[i]], ZeroIterator(), veclen_))); + + unsigned char* vec = (unsigned char*)dataset_[indices[i]]; + for (size_t k=0, l=0; k>2) & 0x03)]++; + histograms[k + 8 + ((vec[l]>>4) & 0x03)]++; + histograms[k +12 + ((vec[l]>>6) & 0x03)]++; + } + } + + CentersType* mean = new CentersType[veclen_]; + memoryCounter_ += int(veclen_*sizeof(CentersType)); + unsigned char* char_mean = (unsigned char*)mean; + unsigned int* h = histograms; + for (size_t k=0, l=0; k h[k+1] ? h[k+2] > h[k+3] ? h[k] > h[k+2] ? 0x00 : 0x10 + : h[k] > h[k+3] ? 0x00 : 0x11 + : h[k+2] > h[k+3] ? h[k+1] > h[k+2] ? 0x01 : 0x10 + : h[k+1] > h[k+3] ? 0x01 : 0x11) + | (h[k+4]>h[k+5] ? h[k+6] > h[k+7] ? h[k+4] > h[k+6] ? 0x00 : 0x1000 + : h[k+4] > h[k+7] ? 0x00 : 0x1100 + : h[k+6] > h[k+7] ? h[k+5] > h[k+6] ? 0x0100 : 0x1000 + : h[k+5] > h[k+7] ? 0x0100 : 0x1100) + | (h[k+8]>h[k+9] ? h[k+10]>h[k+11] ? h[k+8] >h[k+10] ? 0x00 : 0x100000 + : h[k+8] >h[k+11] ? 0x00 : 0x110000 + : h[k+10]>h[k+11] ? h[k+9] >h[k+10] ? 0x010000 : 0x100000 + : h[k+9] >h[k+11] ? 0x010000 : 0x110000) + | (h[k+12]>h[k+13] ? h[k+14]>h[k+15] ? h[k+12] >h[k+14] ? 0x00 : 0x10000000 + : h[k+12] >h[k+15] ? 0x00 : 0x11000000 + : h[k+14]>h[k+15] ? h[k+13] >h[k+14] ? 0x01000000 : 0x10000000 + : h[k+13] >h[k+15] ? 0x01000000 : 0x11000000); + } + variance = static_cast( + 0.5 + static_cast(variance) / static_cast(indices_length)); + variance -= static_cast( + ensureSquareDistance( + distance_(mean, ZeroIterator(), veclen_))); + + DistanceType radius = 0; + for (unsigned int i=0; iradius) { + radius = tmp; + } + } + + node->variance = static_cast(variance); + node->radius = radius; + node->pivot = mean; + + delete[] histograms; + } + + + template + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const DistType* identifier) + { + (void)identifier; + computeNodeStatistics(node, indices, indices_length); + } + + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const cvflann::HammingLUT* identifier) + { + (void)identifier; + computeBitfieldNodeStatistics(node, indices, indices_length); + } + + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const cvflann::Hamming* identifier) + { + (void)identifier; + computeBitfieldNodeStatistics(node, indices, indices_length); + } + + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const cvflann::Hamming2* identifier) + { + (void)identifier; + computeBitfieldNodeStatistics(node, indices, indices_length); + } + + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const cvflann::DNAmmingLUT* identifier) + { + (void)identifier; + computeDnaNodeStatistics(node, indices, indices_length); + } + + void computeNodeStatistics(KMeansNodePtr node, int* indices, + unsigned int indices_length, + const cvflann::DNAmming2* identifier) + { + (void)identifier; + computeDnaNodeStatistics(node, indices, indices_length); + } + + + void refineClustering(int* indices, int indices_length, int branching, CentersType** centers, + std::vector& radiuses, int* belongs_to, int* count) + { + cv::AutoBuffer dcenters_buf(branching*veclen_); + Matrix dcenters(dcenters_buf.data(), branching, veclen_); + + bool converged = false; + int iteration = 0; + while (!converged && iteration new_centroids(indices_length); + std::vector sq_dists(indices_length); + + // reassign points to clusters + KMeansDistanceComputer > invoker( + distance_, dataset_, branching, indices, dcenters, veclen_, new_centroids, sq_dists); + parallel_for_(cv::Range(0, (int)indices_length), invoker); + + for (int i=0; i < (int)indices_length; ++i) { + DistanceType sq_dist(sq_dists[i]); + int new_centroid(new_centroids[i]); + if (sq_dist > radiuses[new_centroid]) { + radiuses[new_centroid] = sq_dist; + } + if (new_centroid != belongs_to[i]) { + count[belongs_to[i]]--; + count[new_centroid]++; + belongs_to[i] = new_centroid; + converged = false; + } + } + + for (int i=0; i& radiuses, int* belongs_to, int* count) + { + for (int i=0; i( + veclen_*sizeof(ElementType)*BITS_PER_CHAR); + cv::AutoBuffer dcenters_buf(branching*accumulator_veclen); + Matrix dcenters(dcenters_buf.data(), branching, accumulator_veclen); + + bool converged = false; + int iteration = 0; + while (!converged && iteration>1) & 0x01; + dcenter[k+2] += (vec[l]>>2) & 0x01; + dcenter[k+3] += (vec[l]>>3) & 0x01; + dcenter[k+4] += (vec[l]>>4) & 0x01; + dcenter[k+5] += (vec[l]>>5) & 0x01; + dcenter[k+6] += (vec[l]>>6) & 0x01; + dcenter[k+7] += (vec[l]>>7) & 0x01; + } + } + for (int i=0; i(count[i]); + unsigned int* dcenter = dcenters[i]; + unsigned char* charCenter = (unsigned char*)centers[i]; + for (size_t k=0, l=0; k( + (((int)(0.5 + (double)(dcenter[k]) / cnt))) + | (((int)(0.5 + (double)(dcenter[k+1]) / cnt))<<1) + | (((int)(0.5 + (double)(dcenter[k+2]) / cnt))<<2) + | (((int)(0.5 + (double)(dcenter[k+3]) / cnt))<<3) + | (((int)(0.5 + (double)(dcenter[k+4]) / cnt))<<4) + | (((int)(0.5 + (double)(dcenter[k+5]) / cnt))<<5) + | (((int)(0.5 + (double)(dcenter[k+6]) / cnt))<<6) + | (((int)(0.5 + (double)(dcenter[k+7]) / cnt))<<7)); + } + } + + std::vector new_centroids(indices_length); + std::vector dists(indices_length); + + // reassign points to clusters + KMeansDistanceComputer invoker( + distance_, dataset_, branching, indices, centers, veclen_, new_centroids, dists); + parallel_for_(cv::Range(0, (int)indices_length), invoker); + + for (int i=0; i < indices_length; ++i) { + DistanceType dist(dists[i]); + int new_centroid(new_centroids[i]); + if (dist > radiuses[new_centroid]) { + radiuses[new_centroid] = dist; + } + if (new_centroid != belongs_to[i]) { + count[belongs_to[i]]--; + count[new_centroid]++; + belongs_to[i] = new_centroid; + converged = false; + } + } + + for (int i=0; i& radiuses, int* belongs_to, int* count) + { + for (int i=0; i( + veclen_*sizeof(CentersType)*(HISTOS_PER_BASE*BASE_PER_CHAR)); + cv::AutoBuffer histos_buf(branching*histos_veclen); + Matrix histos(histos_buf.data(), branching, histos_veclen); + + bool converged = false; + int iteration = 0; + while (!converged && iteration>2) & 0x03)]++; + h[k + 8 + ((vec[l]>>4) & 0x03)]++; + h[k +12 + ((vec[l]>>6) & 0x03)]++; + } + } + for (int i=0; i h[k+1] ? h[k+2] > h[k+3] ? h[k] > h[k+2] ? 0x00 : 0x10 + : h[k] > h[k+3] ? 0x00 : 0x11 + : h[k+2] > h[k+3] ? h[k+1] > h[k+2] ? 0x01 : 0x10 + : h[k+1] > h[k+3] ? 0x01 : 0x11) + | (h[k+4]>h[k+5] ? h[k+6] > h[k+7] ? h[k+4] > h[k+6] ? 0x00 : 0x1000 + : h[k+4] > h[k+7] ? 0x00 : 0x1100 + : h[k+6] > h[k+7] ? h[k+5] > h[k+6] ? 0x0100 : 0x1000 + : h[k+5] > h[k+7] ? 0x0100 : 0x1100) + | (h[k+8]>h[k+9] ? h[k+10]>h[k+11] ? h[k+8] >h[k+10] ? 0x00 : 0x100000 + : h[k+8] >h[k+11] ? 0x00 : 0x110000 + : h[k+10]>h[k+11] ? h[k+9] >h[k+10] ? 0x010000 : 0x100000 + : h[k+9] >h[k+11] ? 0x010000 : 0x110000) + | (h[k+12]>h[k+13] ? h[k+14]>h[k+15] ? h[k+12] >h[k+14] ? 0x00 : 0x10000000 + : h[k+12] >h[k+15] ? 0x00 : 0x11000000 + : h[k+14]>h[k+15] ? h[k+13] >h[k+14] ? 0x01000000 : 0x10000000 + : h[k+13] >h[k+15] ? 0x01000000 : 0x11000000); + } + } + + std::vector new_centroids(indices_length); + std::vector dists(indices_length); + + // reassign points to clusters + KMeansDistanceComputer invoker( + distance_, dataset_, branching, indices, centers, veclen_, new_centroids, dists); + parallel_for_(cv::Range(0, (int)indices_length), invoker); + + for (int i=0; i < indices_length; ++i) { + DistanceType dist(dists[i]); + int new_centroid(new_centroids[i]); + if (dist > radiuses[new_centroid]) { + radiuses[new_centroid] = dist; + } + if (new_centroid != belongs_to[i]) { + count[belongs_to[i]]--; + count[new_centroid]++; + belongs_to[i] = new_centroid; + converged = false; + } + } + + for (int i=0; i& radiuses, int* belongs_to, int* count) + { + // compute kmeans clustering for each of the resulting clusters + node->childs = pool_.allocate(branching); + int start = 0; + int end = start; + for (int c=0; c(), veclen_); + variance += d; + mean_radius += static_cast( sqrt(d) ); + std::swap(indices[i],indices[end]); + std::swap(belongs_to[i],belongs_to[end]); + end++; + } + } + variance /= s; + mean_radius /= s; + variance -= distance_(centers[c], ZeroIterator(), veclen_); + + node->childs[c] = pool_.allocate(); + std::memset(node->childs[c], 0, sizeof(KMeansNode)); + node->childs[c]->radius = radiuses[c]; + node->childs[c]->pivot = centers[c]; + node->childs[c]->variance = variance; + node->childs[c]->mean_radius = mean_radius; + computeClustering(node->childs[c],indices+start, end-start, branching, level+1); + start=end; + } + } + + + void computeAnyBitfieldSubClustering(KMeansNodePtr node, int* indices, int indices_length, + int branching, int level, CentersType** centers, + std::vector& radiuses, int* belongs_to, int* count) + { + // compute kmeans clustering for each of the resulting clusters + node->childs = pool_.allocate(branching); + int start = 0; + int end = start; + for (int c=0; c(), veclen_); + variance += static_cast( ensureSquareDistance(d) ); + mean_radius += ensureSimpleDistance(d); + std::swap(indices[i],indices[end]); + std::swap(belongs_to[i],belongs_to[end]); + end++; + } + } + mean_radius = static_cast( + 0.5f + static_cast(mean_radius) / static_cast(s)); + variance = static_cast( + 0.5 + static_cast(variance) / static_cast(s)); + variance -= static_cast( + ensureSquareDistance( + distance_(centers[c], ZeroIterator(), veclen_))); + + node->childs[c] = pool_.allocate(); + std::memset(node->childs[c], 0, sizeof(KMeansNode)); + node->childs[c]->radius = radiuses[c]; + node->childs[c]->pivot = centers[c]; + node->childs[c]->variance = static_cast(variance); + node->childs[c]->mean_radius = mean_radius; + computeClustering(node->childs[c],indices+start, end-start, branching, level+1); + start=end; + } + } + + + template + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const DistType* identifier) + { + (void)identifier; + refineClustering(indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + /** + * The methods responsible with doing the recursive hierarchical clustering on + * binary vectors. + * As some might have heard that KMeans on binary data doesn't make sense, + * it's worth a little explanation why it actually fairly works. As + * with the Hierarchical Clustering algortihm, we seed several centers for the + * current node by picking some of its points. Then in a first pass each point + * of the node is then related to its closest center. Now let's have a look at + * the 5 central dimensions of the 9 following points: + * + * xxxxxx11100xxxxx (1) + * xxxxxx11010xxxxx (2) + * xxxxxx11001xxxxx (3) + * xxxxxx10110xxxxx (4) + * xxxxxx10101xxxxx (5) + * xxxxxx10011xxxxx (6) + * xxxxxx01110xxxxx (7) + * xxxxxx01101xxxxx (8) + * xxxxxx01011xxxxx (9) + * sum _____ + * of 1: 66555 + * + * Even if the barycenter notion doesn't apply, we can set a center + * xxxxxx11111xxxxx that will better fit the five dimensions we are focusing + * on for these points. + * + * Note that convergence isn't ensured anymore. In practice, using Gonzales + * as seeding algorithm should be fine for getting convergence ("iterations" + * value can be set to -1). But with KMeans++ seeding you should definitely + * set a maximum number of iterations (but make it higher than the "iterations" + * default value of 11). + * + * Params: + * node = the node to cluster + * indices = indices of the points belonging to the current node + * indices_length = number of points in the current node + * branching = the branching factor to use in the clustering + * level = 0 for the root node, it increases with the subdivision levels + * centers = clusters centers to compute + * radiuses = radiuses of clusters + * belongs_to = LookUp Table returning, for a given indice id, the center id it belongs to + * count = array storing the number of indices for a given center id + * identifier = dummy pointer on an instance of Distance (use to branch correctly among templates) + */ + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const cvflann::HammingLUT* identifier) + { + (void)identifier; + refineBitfieldClustering( + indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeAnyBitfieldSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const cvflann::Hamming* identifier) + { + (void)identifier; + refineBitfieldClustering( + indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeAnyBitfieldSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const cvflann::Hamming2* identifier) + { + (void)identifier; + refineBitfieldClustering( + indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeAnyBitfieldSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const cvflann::DNAmmingLUT* identifier) + { + (void)identifier; + refineDnaClustering( + indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeAnyBitfieldSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + void refineAndSplitClustering( + KMeansNodePtr node, int* indices, int indices_length, int branching, + int level, CentersType** centers, std::vector& radiuses, + int* belongs_to, int* count, const cvflann::DNAmming2* identifier) + { + (void)identifier; + refineDnaClustering( + indices, indices_length, branching, centers, radiuses, belongs_to, count); + + computeAnyBitfieldSubClustering(node, indices, indices_length, branching, + level, centers, radiuses, belongs_to, count); + } + + + /** + * The method responsible with actually doing the recursive hierarchical + * clustering + * + * Params: + * node = the node to cluster + * indices = indices of the points belonging to the current node + * branching = the branching factor to use in the clustering + * + * TODO: for 1-sized clusters don't store a cluster center (it's the same as the single cluster point) + */ + void computeClustering(KMeansNodePtr node, int* indices, int indices_length, int branching, int level) + { + node->size = indices_length; + node->level = level; + + if (indices_length < branching) { + node->indices = indices; + std::sort(node->indices,node->indices+indices_length); + node->childs = NULL; + return; + } + + cv::AutoBuffer centers_idx_buf(branching); + int* centers_idx = centers_idx_buf.data(); + int centers_length; + (this->*chooseCenters)(branching, indices, indices_length, centers_idx, centers_length); + + if (centers_lengthindices = indices; + std::sort(node->indices,node->indices+indices_length); + node->childs = NULL; + return; + } + + + std::vector radiuses(branching); + cv::AutoBuffer count_buf(branching); + int* count = count_buf.data(); + for (int i=0; i belongs_to_buf(indices_length); + int* belongs_to = belongs_to_buf.data(); + for (int i=0; inew_sq_dist) { + belongs_to[i] = j; + sq_dist = new_sq_dist; + } + } + if (sq_dist>radiuses[belongs_to[i]]) { + radiuses[belongs_to[i]] = sq_dist; + } + count[belongs_to[i]]++; + } + + CentersType** centers = new CentersType*[branching]; + + Distance* dummy = NULL; + refineAndSplitClustering(node, indices, indices_length, branching, level, + centers, radiuses, belongs_to, count, dummy); + + delete[] centers; + } + + + /** + * Performs one descent in the hierarchical k-means tree. The branches not + * visited are stored in a priority queue. + * + * Params: + * node = node to explore + * result = container for the k-nearest neighbors found + * vec = query points + * checks = how many points in the dataset have been checked so far + * maxChecks = maximum dataset points to checks + */ + + + void findNN(KMeansNodePtr node, ResultSet& result, const ElementType* vec, int& checks, int maxChecks, + const cv::Ptr>& heap) + { + // Ignore those clusters that are too far away + { + DistanceType bsq = distance_(vec, node->pivot, veclen_); + DistanceType rsq = node->radius; + DistanceType wsq = result.worstDist(); + + if (isSquareDistance()) + { + DistanceType val = bsq-rsq-wsq; + if ((val>0) && (val*val > 4*rsq*wsq)) + return; + } + else + { + if (bsq-rsq > wsq) + return; + } + } + + if (node->childs==NULL) { + if ((checks>=maxChecks) && result.full()) { + return; + } + checks += node->size; + for (int i=0; isize; ++i) { + int index = node->indices[i]; + DistanceType dist = distance_(dataset_[index], vec, veclen_); + result.addPoint(dist, index); + } + } + else { + DistanceType* domain_distances = new DistanceType[branching_]; + int closest_center = exploreNodeBranches(node, vec, domain_distances, heap); + delete[] domain_distances; + findNN(node->childs[closest_center],result,vec, checks, maxChecks, heap); + } + } + + /** + * Helper function that computes the nearest childs of a node to a given query point. + * Params: + * node = the node + * q = the query point + * distances = array with the distances to each child node. + * Returns: + */ + int exploreNodeBranches(KMeansNodePtr node, const ElementType* q, DistanceType* domain_distances, const cv::Ptr>& heap) + { + + int best_index = 0; + domain_distances[best_index] = distance_(q, node->childs[best_index]->pivot, veclen_); + for (int i=1; ichilds[i]->pivot, veclen_); + if (domain_distances[i]childs[best_index]->pivot; + for (int i=0; i( + cb_index_*node->childs[i]->variance ); + + // float dist_to_border = getDistanceToBorder(node.childs[i].pivot,best_center,q); + // if (domain_distances[i]insert(BranchSt(node->childs[i],domain_distances[i])); + } + } + + return best_index; + } + + + /** + * Function the performs exact nearest neighbor search by traversing the entire tree. + */ + void findExactNN(KMeansNodePtr node, ResultSet& result, const ElementType* vec) + { + // Ignore those clusters that are too far away + { + DistanceType bsq = distance_(vec, node->pivot, veclen_); + DistanceType rsq = node->radius; + DistanceType wsq = result.worstDist(); + + if (isSquareDistance()) + { + DistanceType val = bsq-rsq-wsq; + if ((val>0) && (val*val > 4*rsq*wsq)) + return; + } + else + { + if (bsq-rsq > wsq) + return; + } + } + + + if (node->childs==NULL) { + for (int i=0; isize; ++i) { + int index = node->indices[i]; + DistanceType dist = distance_(dataset_[index], vec, veclen_); + result.addPoint(dist, index); + } + } + else { + int* sort_indices = new int[branching_]; + + getCenterOrdering(node, vec, sort_indices); + + for (int i=0; ichilds[sort_indices[i]],result,vec); + } + + delete[] sort_indices; + } + } + + + /** + * Helper function. + * + * I computes the order in which to traverse the child nodes of a particular node. + */ + void getCenterOrdering(KMeansNodePtr node, const ElementType* q, int* sort_indices) + { + DistanceType* domain_distances = new DistanceType[branching_]; + for (int i=0; ichilds[i]->pivot, veclen_); + + int j=0; + while (domain_distances[j]j; --k) { + domain_distances[k] = domain_distances[k-1]; + sort_indices[k] = sort_indices[k-1]; + } + domain_distances[j] = dist; + sort_indices[j] = i; + } + delete[] domain_distances; + } + + /** + * Method that computes the squared distance from the query point q + * from inside region with center c to the border between this + * region and the region with center p + */ + DistanceType getDistanceToBorder(DistanceType* p, DistanceType* c, DistanceType* q) + { + DistanceType sum = 0; + DistanceType sum2 = 0; + + for (int i=0; ivariance*root->size; + + while (clusterCount::max)(); + int splitIndex = -1; + + for (int i=0; ichilds != NULL) { + + DistanceType variance = meanVariance - clusters[i]->variance*clusters[i]->size; + + for (int j=0; jchilds[j]->variance*clusters[i]->childs[j]->size; + } + if (variance clusters_length) break; + + meanVariance = minVariance; + + // split node + KMeansNodePtr toSplit = clusters[splitIndex]; + clusters[splitIndex] = toSplit->childs[0]; + for (int i=1; ichilds[i]; + } + } + + varianceValue = meanVariance/root->size; + return clusterCount; + } + +private: + /** The branching factor used in the hierarchical k-means clustering */ + int branching_; + + /** Number of kmeans trees (default is one) */ + int trees_; + + /** Maximum number of iterations to use when performing k-means clustering */ + int iterations_; + + /** Algorithm for choosing the cluster centers */ + flann_centers_init_t centers_init_; + + /** + * Cluster border index. This is used in the tree search phase when determining + * the closest cluster to explore next. A zero value takes into account only + * the cluster centres, a value greater then zero also take into account the size + * of the cluster. + */ + float cb_index_; + + /** + * The dataset used by this index + */ + const Matrix dataset_; + + /** Index parameters */ + IndexParams index_params_; + + /** + * Number of features in the dataset. + */ + size_t size_; + + /** + * Length of each feature. + */ + size_t veclen_; + + /** + * The root node in the tree. + */ + KMeansNodePtr* root_; + + /** + * Array of indices to vectors in the dataset. + */ + int** indices_; + + /** + * The distance + */ + Distance distance_; + + /** + * Pooled memory allocator. + */ + PooledAllocator pool_; + + /** + * Memory occupied by the index. + */ + int memoryCounter_; +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_KMEANS_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/linear_index.h b/Thirdparty/opencv2/include/opencv2/flann/linear_index.h new file mode 100644 index 0000000..6428c0d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/linear_index.h @@ -0,0 +1,135 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_LINEAR_INDEX_H_ +#define OPENCV_FLANN_LINEAR_INDEX_H_ + +//! @cond IGNORED + +#include "nn_index.h" + +namespace cvflann +{ + +struct LinearIndexParams : public IndexParams +{ + LinearIndexParams() + { + (* this)["algorithm"] = FLANN_INDEX_LINEAR; + } +}; + +template +class LinearIndex : public NNIndex +{ +public: + + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + + LinearIndex(const Matrix& inputData, const IndexParams& params = LinearIndexParams(), + Distance d = Distance()) : + dataset_(inputData), index_params_(params), distance_(d) + { + } + + LinearIndex(const LinearIndex&); + LinearIndex& operator=(const LinearIndex&); + + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_LINEAR; + } + + + size_t size() const CV_OVERRIDE + { + return dataset_.rows; + } + + size_t veclen() const CV_OVERRIDE + { + return dataset_.cols; + } + + + int usedMemory() const CV_OVERRIDE + { + return 0; + } + + void buildIndex() CV_OVERRIDE + { + /* nothing to do here for linear search */ + } + + void saveIndex(FILE*) CV_OVERRIDE + { + /* nothing to do here for linear search */ + } + + + void loadIndex(FILE*) CV_OVERRIDE + { + /* nothing to do here for linear search */ + + index_params_["algorithm"] = getType(); + } + + void findNeighbors(ResultSet& resultSet, const ElementType* vec, const SearchParams& /*searchParams*/) CV_OVERRIDE + { + ElementType* data = dataset_.data; + for (size_t i = 0; i < dataset_.rows; ++i, data += dataset_.cols) { + DistanceType dist = distance_(data, vec, dataset_.cols); + resultSet.addPoint(dist, (int)i); + } + } + + IndexParams getParameters() const CV_OVERRIDE + { + return index_params_; + } + +private: + /** The dataset */ + const Matrix dataset_; + /** Index parameters */ + IndexParams index_params_; + /** Index distance */ + Distance distance_; + +}; + +} + +//! @endcond + +#endif // OPENCV_FLANN_LINEAR_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/logger.h b/Thirdparty/opencv2/include/opencv2/flann/logger.h new file mode 100644 index 0000000..31f9bbd --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/logger.h @@ -0,0 +1,138 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_LOGGER_H +#define OPENCV_FLANN_LOGGER_H + +//! @cond IGNORED + +#include +#include + +#include "defines.h" + + +namespace cvflann +{ + +class Logger +{ + Logger() : stream(stdout), logLevel(FLANN_LOG_WARN) {} + + ~Logger() + { + if ((stream!=NULL)&&(stream!=stdout)) { + fclose(stream); + } + } + + static Logger& instance() + { + static Logger logger; + return logger; + } + + void _setDestination(const char* name) + { + if (name==NULL) { + stream = stdout; + } + else { +#ifdef _MSC_VER + if (fopen_s(&stream, name, "w") != 0) + stream = NULL; +#else + stream = fopen(name,"w"); +#endif + if (stream == NULL) { + stream = stdout; + } + } + } + + int _log(int level, const char* fmt, va_list arglist) + { + if (level > logLevel ) return -1; + int ret = vfprintf(stream, fmt, arglist); + return ret; + } + +public: + /** + * Sets the logging level. All messages with lower priority will be ignored. + * @param level Logging level + */ + static void setLevel(int level) { instance().logLevel = level; } + + /** + * Sets the logging destination + * @param name Filename or NULL for console + */ + static void setDestination(const char* name) { instance()._setDestination(name); } + + /** + * Print log message + * @param level Log level + * @param fmt Message format + */ + static int log(int level, const char* fmt, ...) + { + va_list arglist; + va_start(arglist, fmt); + int ret = instance()._log(level,fmt,arglist); + va_end(arglist); + return ret; + } + +#define LOG_METHOD(NAME,LEVEL) \ + static int NAME(const char* fmt, ...) \ + { \ + va_list ap; \ + va_start(ap, fmt); \ + int ret = instance()._log(LEVEL, fmt, ap); \ + va_end(ap); \ + return ret; \ + } + + LOG_METHOD(fatal, FLANN_LOG_FATAL) + LOG_METHOD(error, FLANN_LOG_ERROR) + LOG_METHOD(warn, FLANN_LOG_WARN) + LOG_METHOD(info, FLANN_LOG_INFO) + +private: + FILE* stream; + int logLevel; +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_LOGGER_H diff --git a/Thirdparty/opencv2/include/opencv2/flann/lsh_index.h b/Thirdparty/opencv2/include/opencv2/flann/lsh_index.h new file mode 100644 index 0000000..b5e87f6 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/lsh_index.h @@ -0,0 +1,403 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +/*********************************************************************** + * Author: Vincent Rabaud + *************************************************************************/ + +#ifndef OPENCV_FLANN_LSH_INDEX_H_ +#define OPENCV_FLANN_LSH_INDEX_H_ + +//! @cond IGNORED + +#include +#include +#include +#include + +#include "nn_index.h" +#include "matrix.h" +#include "result_set.h" +#include "heap.h" +#include "lsh_table.h" +#include "allocator.h" +#include "random.h" +#include "saving.h" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4702) //disable unreachable code +#endif + +namespace cvflann +{ + +struct LshIndexParams : public IndexParams +{ + LshIndexParams(int table_number = 12, int key_size = 20, int multi_probe_level = 2) + { + (*this)["algorithm"] = FLANN_INDEX_LSH; + // The number of hash tables to use + (*this)["table_number"] = table_number; + // The length of the key in the hash tables + (*this)["key_size"] = key_size; + // Number of levels to use in multi-probe (0 for standard LSH) + (*this)["multi_probe_level"] = multi_probe_level; + } +}; + +/** + * Locality-sensitive hashing index + * + * Contains the tables and other information for indexing a set of points + * for nearest-neighbor matching. + */ +template +class LshIndex : public NNIndex +{ +public: + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + + /** Constructor + * @param input_data dataset with the input features + * @param params parameters passed to the LSH algorithm + * @param d the distance used + */ + LshIndex(const Matrix& input_data, const IndexParams& params = LshIndexParams(), + Distance d = Distance()) : + dataset_(input_data), index_params_(params), distance_(d) + { + // cv::flann::IndexParams sets integer params as 'int', so it is used with get_param + // in place of 'unsigned int' + table_number_ = get_param(index_params_,"table_number",12); + key_size_ = get_param(index_params_,"key_size",20); + multi_probe_level_ = get_param(index_params_,"multi_probe_level",2); + + feature_size_ = (unsigned)dataset_.cols; + fill_xor_mask(0, key_size_, multi_probe_level_, xor_masks_); + } + + + LshIndex(const LshIndex&); + LshIndex& operator=(const LshIndex&); + + /** + * Builds the index + */ + void buildIndex() CV_OVERRIDE + { + tables_.resize(table_number_); + for (int i = 0; i < table_number_; ++i) { + lsh::LshTable& table = tables_[i]; + table = lsh::LshTable(feature_size_, key_size_); + + // Add the features to the table + table.add(dataset_); + } + } + + flann_algorithm_t getType() const CV_OVERRIDE + { + return FLANN_INDEX_LSH; + } + + + void saveIndex(FILE* stream) CV_OVERRIDE + { + save_value(stream,table_number_); + save_value(stream,key_size_); + save_value(stream,multi_probe_level_); + save_value(stream, dataset_); + } + + void loadIndex(FILE* stream) CV_OVERRIDE + { + load_value(stream, table_number_); + load_value(stream, key_size_); + load_value(stream, multi_probe_level_); + load_value(stream, dataset_); + // Building the index is so fast we can afford not storing it + buildIndex(); + + index_params_["algorithm"] = getType(); + index_params_["table_number"] = table_number_; + index_params_["key_size"] = key_size_; + index_params_["multi_probe_level"] = multi_probe_level_; + } + + /** + * Returns size of index. + */ + size_t size() const CV_OVERRIDE + { + return dataset_.rows; + } + + /** + * Returns the length of an index feature. + */ + size_t veclen() const CV_OVERRIDE + { + return feature_size_; + } + + /** + * Computes the index memory usage + * Returns: memory used by the index + */ + int usedMemory() const CV_OVERRIDE + { + return (int)(dataset_.rows * sizeof(int)); + } + + + IndexParams getParameters() const CV_OVERRIDE + { + return index_params_; + } + + /** + * \brief Perform k-nearest neighbor search + * \param[in] queries The query points for which to find the nearest neighbors + * \param[out] indices The indices of the nearest neighbors found + * \param[out] dists Distances to the nearest neighbors found + * \param[in] knn Number of nearest neighbors to return + * \param[in] params Search parameters + */ + virtual void knnSearch(const Matrix& queries, Matrix& indices, Matrix& dists, int knn, const SearchParams& params) CV_OVERRIDE + { + CV_Assert(queries.cols == veclen()); + CV_Assert(indices.rows >= queries.rows); + CV_Assert(dists.rows >= queries.rows); + CV_Assert(int(indices.cols) >= knn); + CV_Assert(int(dists.cols) >= knn); + + + KNNUniqueResultSet resultSet(knn); + for (size_t i = 0; i < queries.rows; i++) { + resultSet.clear(); + std::fill_n(indices[i], knn, -1); + std::fill_n(dists[i], knn, std::numeric_limits::max()); + findNeighbors(resultSet, queries[i], params); + if (get_param(params,"sorted",true)) resultSet.sortAndCopy(indices[i], dists[i], knn); + else resultSet.copy(indices[i], dists[i], knn); + } + } + + + /** + * Find set of nearest neighbors to vec. Their indices are stored inside + * the result object. + * + * Params: + * result = the result object in which the indices of the nearest-neighbors are stored + * vec = the vector for which to search the nearest neighbors + * maxCheck = the maximum number of restarts (in a best-bin-first manner) + */ + void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& /*searchParams*/) CV_OVERRIDE + { + getNeighbors(vec, result); + } + +private: + /** Defines the comparator on score and index + */ + typedef std::pair ScoreIndexPair; + struct SortScoreIndexPairOnSecond + { + bool operator()(const ScoreIndexPair& left, const ScoreIndexPair& right) const + { + return left.second < right.second; + } + }; + + /** Fills the different xor masks to use when getting the neighbors in multi-probe LSH + * @param key the key we build neighbors from + * @param lowest_index the lowest index of the bit set + * @param level the multi-probe level we are at + * @param xor_masks all the xor mask + */ + void fill_xor_mask(lsh::BucketKey key, int lowest_index, unsigned int level, + std::vector& xor_masks) + { + xor_masks.push_back(key); + if (level == 0) return; + for (int index = lowest_index - 1; index >= 0; --index) { + // Create a new key + lsh::BucketKey new_key = key | (1 << index); + fill_xor_mask(new_key, index, level - 1, xor_masks); + } + } + + /** Performs the approximate nearest-neighbor search. + * @param vec the feature to analyze + * @param do_radius flag indicating if we check the radius too + * @param radius the radius if it is a radius search + * @param do_k flag indicating if we limit the number of nn + * @param k_nn the number of nearest neighbors + * @param checked_average used for debugging + */ + void getNeighbors(const ElementType* vec, bool /*do_radius*/, float radius, bool do_k, unsigned int k_nn, + float& /*checked_average*/) + { + static std::vector score_index_heap; + + if (do_k) { + unsigned int worst_score = std::numeric_limits::max(); + typename std::vector >::const_iterator table = tables_.begin(); + typename std::vector >::const_iterator table_end = tables_.end(); + for (; table != table_end; ++table) { + size_t key = table->getKey(vec); + std::vector::const_iterator xor_mask = xor_masks_.begin(); + std::vector::const_iterator xor_mask_end = xor_masks_.end(); + for (; xor_mask != xor_mask_end; ++xor_mask) { + size_t sub_key = key ^ (*xor_mask); + const lsh::Bucket* bucket = table->getBucketFromKey(sub_key); + if (bucket == 0) continue; + + // Go over each descriptor index + std::vector::const_iterator training_index = bucket->begin(); + std::vector::const_iterator last_training_index = bucket->end(); + DistanceType hamming_distance; + + // Process the rest of the candidates + for (; training_index < last_training_index; ++training_index) { + hamming_distance = distance_(vec, dataset_[*training_index], dataset_.cols); + + if (hamming_distance < worst_score) { + // Insert the new element + score_index_heap.push_back(ScoreIndexPair(hamming_distance, training_index)); + std::push_heap(score_index_heap.begin(), score_index_heap.end()); + + if (score_index_heap.size() > (unsigned int)k_nn) { + // Remove the highest distance value as we have too many elements + std::pop_heap(score_index_heap.begin(), score_index_heap.end()); + score_index_heap.pop_back(); + // Keep track of the worst score + worst_score = score_index_heap.front().first; + } + } + } + } + } + } + else { + typename std::vector >::const_iterator table = tables_.begin(); + typename std::vector >::const_iterator table_end = tables_.end(); + for (; table != table_end; ++table) { + size_t key = table->getKey(vec); + std::vector::const_iterator xor_mask = xor_masks_.begin(); + std::vector::const_iterator xor_mask_end = xor_masks_.end(); + for (; xor_mask != xor_mask_end; ++xor_mask) { + size_t sub_key = key ^ (*xor_mask); + const lsh::Bucket* bucket = table->getBucketFromKey(sub_key); + if (bucket == 0) continue; + + // Go over each descriptor index + std::vector::const_iterator training_index = bucket->begin(); + std::vector::const_iterator last_training_index = bucket->end(); + DistanceType hamming_distance; + + // Process the rest of the candidates + for (; training_index < last_training_index; ++training_index) { + // Compute the Hamming distance + hamming_distance = distance_(vec, dataset_[*training_index], dataset_.cols); + if (hamming_distance < radius) score_index_heap.push_back(ScoreIndexPair(hamming_distance, training_index)); + } + } + } + } + } + + /** Performs the approximate nearest-neighbor search. + * This is a slower version than the above as it uses the ResultSet + * @param vec the feature to analyze + */ + void getNeighbors(const ElementType* vec, ResultSet& result) + { + typename std::vector >::const_iterator table = tables_.begin(); + typename std::vector >::const_iterator table_end = tables_.end(); + for (; table != table_end; ++table) { + size_t key = table->getKey(vec); + std::vector::const_iterator xor_mask = xor_masks_.begin(); + std::vector::const_iterator xor_mask_end = xor_masks_.end(); + for (; xor_mask != xor_mask_end; ++xor_mask) { + size_t sub_key = key ^ (*xor_mask); + const lsh::Bucket* bucket = table->getBucketFromKey((lsh::BucketKey)sub_key); + if (bucket == 0) continue; + + // Go over each descriptor index + std::vector::const_iterator training_index = bucket->begin(); + std::vector::const_iterator last_training_index = bucket->end(); + DistanceType hamming_distance; + + // Process the rest of the candidates + for (; training_index < last_training_index; ++training_index) { + // Compute the Hamming distance + hamming_distance = distance_(vec, dataset_[*training_index], (int)dataset_.cols); + result.addPoint(hamming_distance, *training_index); + } + } + } + } + + /** The different hash tables */ + std::vector > tables_; + + /** The data the LSH tables where built from */ + Matrix dataset_; + + /** The size of the features (as ElementType[]) */ + unsigned int feature_size_; + + IndexParams index_params_; + + /** table number */ + int table_number_; + /** key size */ + int key_size_; + /** How far should we look for neighbors in multi-probe LSH */ + int multi_probe_level_; + + /** The XOR masks to apply to a key to get the neighboring buckets */ + std::vector xor_masks_; + + Distance distance_; +}; +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//! @endcond + +#endif //OPENCV_FLANN_LSH_INDEX_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/lsh_table.h b/Thirdparty/opencv2/include/opencv2/flann/lsh_table.h new file mode 100644 index 0000000..3b8ffd4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/lsh_table.h @@ -0,0 +1,522 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +/*********************************************************************** + * Author: Vincent Rabaud + *************************************************************************/ + +#ifndef OPENCV_FLANN_LSH_TABLE_H_ +#define OPENCV_FLANN_LSH_TABLE_H_ + +//! @cond IGNORED + +#include +#include +#include +#include +// TODO as soon as we use C++0x, use the code in USE_UNORDERED_MAP +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define USE_UNORDERED_MAP 1 +#else +# define USE_UNORDERED_MAP 0 +#endif +#if USE_UNORDERED_MAP +#include +#else +#include +#endif +#include +#include + +#include "dynamic_bitset.h" +#include "matrix.h" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4702) //disable unreachable code +#endif + + +namespace cvflann +{ + +namespace lsh +{ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** What is stored in an LSH bucket + */ +typedef uint32_t FeatureIndex; +/** The id from which we can get a bucket back in an LSH table + */ +typedef unsigned int BucketKey; + +/** A bucket in an LSH table + */ +typedef std::vector Bucket; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** POD for stats about an LSH table + */ +struct LshStats +{ + std::vector bucket_sizes_; + size_t n_buckets_; + size_t bucket_size_mean_; + size_t bucket_size_median_; + size_t bucket_size_min_; + size_t bucket_size_max_; + size_t bucket_size_std_dev; + /** Each contained vector contains three value: beginning/end for interval, number of elements in the bin + */ + std::vector > size_histogram_; +}; + +/** Overload the << operator for LshStats + * @param out the streams + * @param stats the stats to display + * @return the streams + */ +inline std::ostream& operator <<(std::ostream& out, const LshStats& stats) +{ + int w = 20; + out << "Lsh Table Stats:\n" << std::setw(w) << std::setiosflags(std::ios::right) << "N buckets : " + << stats.n_buckets_ << "\n" << std::setw(w) << std::setiosflags(std::ios::right) << "mean size : " + << std::setiosflags(std::ios::left) << stats.bucket_size_mean_ << "\n" << std::setw(w) + << std::setiosflags(std::ios::right) << "median size : " << stats.bucket_size_median_ << "\n" << std::setw(w) + << std::setiosflags(std::ios::right) << "min size : " << std::setiosflags(std::ios::left) + << stats.bucket_size_min_ << "\n" << std::setw(w) << std::setiosflags(std::ios::right) << "max size : " + << std::setiosflags(std::ios::left) << stats.bucket_size_max_; + + // Display the histogram + out << std::endl << std::setw(w) << std::setiosflags(std::ios::right) << "histogram : " + << std::setiosflags(std::ios::left); + for (std::vector >::const_iterator iterator = stats.size_histogram_.begin(), end = + stats.size_histogram_.end(); iterator != end; ++iterator) out << (*iterator)[0] << "-" << (*iterator)[1] << ": " << (*iterator)[2] << ", "; + + return out; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Lsh hash table. As its key is a sub-feature, and as usually + * the size of it is pretty small, we keep it as a continuous memory array. + * The value is an index in the corpus of features (we keep it as an unsigned + * int for pure memory reasons, it could be a size_t) + */ +template +class LshTable +{ +public: + /** A container of all the feature indices. Optimized for space + */ +#if USE_UNORDERED_MAP + typedef std::unordered_map BucketsSpace; +#else + typedef std::map BucketsSpace; +#endif + + /** A container of all the feature indices. Optimized for speed + */ + typedef std::vector BucketsSpeed; + + /** Default constructor + */ + LshTable() + { + key_size_ = 0; + feature_size_ = 0; + speed_level_ = kArray; + } + + /** Default constructor + * Create the mask and allocate the memory + * @param feature_size is the size of the feature (considered as a ElementType[]) + * @param key_size is the number of bits that are turned on in the feature + */ + LshTable(unsigned int feature_size, unsigned int key_size) + { + feature_size_ = feature_size; + CV_UNUSED(key_size); + CV_Error(cv::Error::StsUnsupportedFormat, "LSH is not implemented for that type" ); + } + + /** Add a feature to the table + * @param value the value to store for that feature + * @param feature the feature itself + */ + void add(unsigned int value, const ElementType* feature) + { + // Add the value to the corresponding bucket + BucketKey key = (lsh::BucketKey)getKey(feature); + + switch (speed_level_) { + case kArray: + // That means we get the buckets from an array + buckets_speed_[key].push_back(value); + break; + case kBitsetHash: + // That means we can check the bitset for the presence of a key + key_bitset_.set(key); + buckets_space_[key].push_back(value); + break; + case kHash: + { + // That means we have to check for the hash table for the presence of a key + buckets_space_[key].push_back(value); + break; + } + } + } + + /** Add a set of features to the table + * @param dataset the values to store + */ + void add(Matrix dataset) + { +#if USE_UNORDERED_MAP + buckets_space_.rehash((buckets_space_.size() + dataset.rows) * 1.2); +#endif + // Add the features to the table + for (unsigned int i = 0; i < dataset.rows; ++i) add(i, dataset[i]); + // Now that the table is full, optimize it for speed/space + optimize(); + } + + /** Get a bucket given the key + */ + inline const Bucket* getBucketFromKey(BucketKey key) const + { + // Generate other buckets + switch (speed_level_) { + case kArray: + // That means we get the buckets from an array + return &buckets_speed_[key]; + break; + case kBitsetHash: + // That means we can check the bitset for the presence of a key + if (key_bitset_.test(key)) return &buckets_space_.find(key)->second; + else return 0; + break; + case kHash: + { + // That means we have to check for the hash table for the presence of a key + BucketsSpace::const_iterator bucket_it, bucket_end = buckets_space_.end(); + bucket_it = buckets_space_.find(key); + // Stop here if that bucket does not exist + if (bucket_it == bucket_end) return 0; + else return &bucket_it->second; + break; + } + } + return 0; + } + + /** Compute the sub-signature of a feature + */ + size_t getKey(const ElementType* /*feature*/) const + { + CV_Error(cv::Error::StsUnsupportedFormat, "LSH is not implemented for that type" ); + return 0; + } + + /** Get statistics about the table + */ + LshStats getStats() const; + +private: + /** defines the speed fo the implementation + * kArray uses a vector for storing data + * kBitsetHash uses a hash map but checks for the validity of a key with a bitset + * kHash uses a hash map only + */ + enum SpeedLevel + { + kArray, kBitsetHash, kHash + }; + + /** Initialize some variables + */ + void initialize(size_t key_size) + { + const size_t key_size_lower_bound = 1; + //a value (size_t(1) << key_size) must fit the size_t type so key_size has to be strictly less than size of size_t + const size_t key_size_upper_bound = (std::min)(sizeof(BucketKey) * CHAR_BIT + 1, sizeof(size_t) * CHAR_BIT); + if (key_size < key_size_lower_bound || key_size >= key_size_upper_bound) + { + CV_Error(cv::Error::StsBadArg, cv::format("Invalid key_size (=%d). Valid values for your system are %d <= key_size < %d.", (int)key_size, (int)key_size_lower_bound, (int)key_size_upper_bound)); + } + + speed_level_ = kHash; + key_size_ = (unsigned)key_size; + } + + /** Optimize the table for speed/space + */ + void optimize() + { + // If we are already using the fast storage, no need to do anything + if (speed_level_ == kArray) return; + + // Use an array if it will be more than half full + if (buckets_space_.size() > ((size_t(1) << key_size_) / 2)) { + speed_level_ = kArray; + // Fill the array version of it + buckets_speed_.resize(size_t(1) << key_size_); + for (BucketsSpace::const_iterator key_bucket = buckets_space_.begin(); key_bucket != buckets_space_.end(); ++key_bucket) buckets_speed_[key_bucket->first] = key_bucket->second; + + // Empty the hash table + buckets_space_.clear(); + return; + } + + // If the bitset is going to use less than 10% of the RAM of the hash map (at least 1 size_t for the key and two + // for the vector) or less than 512MB (key_size_ <= 30) + if (((std::max(buckets_space_.size(), buckets_speed_.size()) * CHAR_BIT * 3 * sizeof(BucketKey)) / 10 + >= (size_t(1) << key_size_)) || (key_size_ <= 32)) { + speed_level_ = kBitsetHash; + key_bitset_.resize(size_t(1) << key_size_); + key_bitset_.reset(); + // Try with the BucketsSpace + for (BucketsSpace::const_iterator key_bucket = buckets_space_.begin(); key_bucket != buckets_space_.end(); ++key_bucket) key_bitset_.set(key_bucket->first); + } + else { + speed_level_ = kHash; + key_bitset_.clear(); + } + } + + /** The vector of all the buckets if they are held for speed + */ + BucketsSpeed buckets_speed_; + + /** The hash table of all the buckets in case we cannot use the speed version + */ + BucketsSpace buckets_space_; + + /** What is used to store the data */ + SpeedLevel speed_level_; + + /** If the subkey is small enough, it will keep track of which subkeys are set through that bitset + * That is just a speedup so that we don't look in the hash table (which can be mush slower that checking a bitset) + */ + DynamicBitset key_bitset_; + + /** The size of the sub-signature in bits + */ + unsigned int key_size_; + + unsigned int feature_size_; + + // Members only used for the unsigned char specialization + /** The mask to apply to a feature to get the hash key + * Only used in the unsigned char case + */ + std::vector mask_; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Specialization for unsigned char + +template<> +inline LshTable::LshTable(unsigned int feature_size, unsigned int subsignature_size) +{ + feature_size_ = feature_size; + initialize(subsignature_size); + // Allocate the mask + mask_ = std::vector((feature_size * sizeof(char) + sizeof(size_t) - 1) / sizeof(size_t), 0); + + // A bit brutal but fast to code + std::vector indices(feature_size * CHAR_BIT); + for (size_t i = 0; i < feature_size * CHAR_BIT; ++i) indices[i] = (int)i; +#ifndef OPENCV_FLANN_USE_STD_RAND + cv::randShuffle(indices); +#else + std::random_shuffle(indices.begin(), indices.end()); +#endif + + // Generate a random set of order of subsignature_size_ bits + for (unsigned int i = 0; i < key_size_; ++i) { + size_t index = indices[i]; + + // Set that bit in the mask + size_t divisor = CHAR_BIT * sizeof(size_t); + size_t idx = index / divisor; //pick the right size_t index + mask_[idx] |= size_t(1) << (index % divisor); //use modulo to find the bit offset + } + + // Set to 1 if you want to display the mask for debug +#if 0 + { + size_t bcount = 0; + BOOST_FOREACH(size_t mask_block, mask_){ + out << std::setw(sizeof(size_t) * CHAR_BIT / 4) << std::setfill('0') << std::hex << mask_block + << std::endl; + bcount += __builtin_popcountll(mask_block); + } + out << "bit count : " << std::dec << bcount << std::endl; + out << "mask size : " << mask_.size() << std::endl; + return out; + } +#endif +} + +/** Return the Subsignature of a feature + * @param feature the feature to analyze + */ +template<> +inline size_t LshTable::getKey(const unsigned char* feature) const +{ + // no need to check if T is dividable by sizeof(size_t) like in the Hamming + // distance computation as we have a mask + // FIXIT: This is bad assumption, because we reading tail bytes after of the allocated features buffer + const size_t* feature_block_ptr = reinterpret_cast ((const void*)feature); + + // Figure out the subsignature of the feature + // Given the feature ABCDEF, and the mask 001011, the output will be + // 000CEF + size_t subsignature = 0; + size_t bit_index = 1; + + for (unsigned i = 0; i < feature_size_; i += sizeof(size_t)) { + // get the mask and signature blocks + size_t feature_block; + if (i <= feature_size_ - sizeof(size_t)) + { + feature_block = *feature_block_ptr; + } + else + { + size_t tmp = 0; + memcpy(&tmp, feature_block_ptr, feature_size_ - i); // preserve bytes order + feature_block = tmp; + } + size_t mask_block = mask_[i / sizeof(size_t)]; + while (mask_block) { + // Get the lowest set bit in the mask block + size_t lowest_bit = mask_block & (-(ptrdiff_t)mask_block); + // Add it to the current subsignature if necessary + subsignature += (feature_block & lowest_bit) ? bit_index : 0; + // Reset the bit in the mask block + mask_block ^= lowest_bit; + // increment the bit index for the subsignature + bit_index <<= 1; + } + // Check the next feature block + ++feature_block_ptr; + } + return subsignature; +} + +template<> +inline LshStats LshTable::getStats() const +{ + LshStats stats; + stats.bucket_size_mean_ = 0; + if ((buckets_speed_.empty()) && (buckets_space_.empty())) { + stats.n_buckets_ = 0; + stats.bucket_size_median_ = 0; + stats.bucket_size_min_ = 0; + stats.bucket_size_max_ = 0; + return stats; + } + + if (!buckets_speed_.empty()) { + for (BucketsSpeed::const_iterator pbucket = buckets_speed_.begin(); pbucket != buckets_speed_.end(); ++pbucket) { + stats.bucket_sizes_.push_back((lsh::FeatureIndex)pbucket->size()); + stats.bucket_size_mean_ += pbucket->size(); + } + stats.bucket_size_mean_ /= buckets_speed_.size(); + stats.n_buckets_ = buckets_speed_.size(); + } + else { + for (BucketsSpace::const_iterator x = buckets_space_.begin(); x != buckets_space_.end(); ++x) { + stats.bucket_sizes_.push_back((lsh::FeatureIndex)x->second.size()); + stats.bucket_size_mean_ += x->second.size(); + } + stats.bucket_size_mean_ /= buckets_space_.size(); + stats.n_buckets_ = buckets_space_.size(); + } + + std::sort(stats.bucket_sizes_.begin(), stats.bucket_sizes_.end()); + + // BOOST_FOREACH(int size, stats.bucket_sizes_) + // std::cout << size << " "; + // std::cout << std::endl; + stats.bucket_size_median_ = stats.bucket_sizes_[stats.bucket_sizes_.size() / 2]; + stats.bucket_size_min_ = stats.bucket_sizes_.front(); + stats.bucket_size_max_ = stats.bucket_sizes_.back(); + + // TODO compute mean and std + /*float mean, stddev; + stats.bucket_size_mean_ = mean; + stats.bucket_size_std_dev = stddev;*/ + + // Include a histogram of the buckets + unsigned int bin_start = 0; + unsigned int bin_end = 20; + bool is_new_bin = true; + for (std::vector::iterator iterator = stats.bucket_sizes_.begin(), end = stats.bucket_sizes_.end(); iterator + != end; ) + if (*iterator < bin_end) { + if (is_new_bin) { + stats.size_histogram_.push_back(std::vector(3, 0)); + stats.size_histogram_.back()[0] = bin_start; + stats.size_histogram_.back()[1] = bin_end - 1; + is_new_bin = false; + } + ++stats.size_histogram_.back()[2]; + ++iterator; + } + else { + bin_start += 20; + bin_end += 20; + is_new_bin = true; + } + + return stats; +} + +// End the two namespaces +} +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//! @endcond + +#endif /* OPENCV_FLANN_LSH_TABLE_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/matrix.h b/Thirdparty/opencv2/include/opencv2/flann/matrix.h new file mode 100644 index 0000000..bfbf91e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/matrix.h @@ -0,0 +1,121 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_DATASET_H_ +#define OPENCV_FLANN_DATASET_H_ + +//! @cond IGNORED + +#include + +#include "opencv2/core/cvdef.h" +#include "opencv2/flann/defines.h" + +namespace cvflann +{ + +/** + * Class that implements a simple rectangular matrix stored in a memory buffer and + * provides convenient matrix-like access using the [] operators. + */ +template +class Matrix +{ +public: + typedef T type; + + size_t rows; + size_t cols; + size_t stride; + T* data; + + Matrix() : rows(0), cols(0), stride(0), data(NULL) + { + } + + Matrix(T* data_, size_t rows_, size_t cols_, size_t stride_ = 0) : + rows(rows_), cols(cols_), stride(stride_), data(data_) + { + if (stride==0) stride = cols; + } + + /** + * Convenience function for deallocating the storage data. + */ + CV_DEPRECATED void free() + { + fprintf(stderr, "The cvflann::Matrix::free() method is deprecated " + "and it does not do any memory deallocation any more. You are" + "responsible for deallocating the matrix memory (by doing" + "'delete[] matrix.data' for example)"); + } + + /** + * Operator that return a (pointer to a) row of the data. + */ + T* operator[](size_t index) const + { + return data+index*stride; + } +}; + + +class UntypedMatrix +{ +public: + size_t rows; + size_t cols; + void* data; + flann_datatype_t type; + + UntypedMatrix(void* data_, long rows_, long cols_) : + rows(rows_), cols(cols_), data(data_) + { + } + + ~UntypedMatrix() + { + } + + + template + Matrix as() + { + return Matrix((T*)data, rows, cols); + } +}; + + + +} + +//! @endcond + +#endif //OPENCV_FLANN_DATASET_H_ diff --git a/Thirdparty/opencv2/include/opencv2/flann/miniflann.hpp b/Thirdparty/opencv2/include/opencv2/flann/miniflann.hpp new file mode 100644 index 0000000..b8df92d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/miniflann.hpp @@ -0,0 +1,185 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_MINIFLANN_HPP +#define OPENCV_MINIFLANN_HPP + +//! @cond IGNORED + +#include "opencv2/core.hpp" +#include "opencv2/flann/defines.h" + +namespace cv +{ + +namespace flann +{ + +enum FlannIndexType { + FLANN_INDEX_TYPE_8U = CV_8U, + FLANN_INDEX_TYPE_8S = CV_8S, + FLANN_INDEX_TYPE_16U = CV_16U, + FLANN_INDEX_TYPE_16S = CV_16S, + FLANN_INDEX_TYPE_32S = CV_32S, + FLANN_INDEX_TYPE_32F = CV_32F, + FLANN_INDEX_TYPE_64F = CV_64F, + FLANN_INDEX_TYPE_STRING, + FLANN_INDEX_TYPE_BOOL, + FLANN_INDEX_TYPE_ALGORITHM, + LAST_VALUE_FLANN_INDEX_TYPE = FLANN_INDEX_TYPE_ALGORITHM +}; + +struct CV_EXPORTS IndexParams +{ + IndexParams(); + ~IndexParams(); + + String getString(const String& key, const String& defaultVal=String()) const; + int getInt(const String& key, int defaultVal=-1) const; + double getDouble(const String& key, double defaultVal=-1) const; + + void setString(const String& key, const String& value); + void setInt(const String& key, int value); + void setDouble(const String& key, double value); + void setFloat(const String& key, float value); + void setBool(const String& key, bool value); + void setAlgorithm(int value); + + // FIXIT: replace by void write(FileStorage& fs) const + read() + void getAll(std::vector& names, + std::vector& types, + std::vector& strValues, + std::vector& numValues) const; + + void* params; + +private: + IndexParams(const IndexParams &); // copy disabled + IndexParams& operator=(const IndexParams &); // assign disabled +}; + +struct CV_EXPORTS KDTreeIndexParams : public IndexParams +{ + KDTreeIndexParams(int trees=4); +}; + +struct CV_EXPORTS LinearIndexParams : public IndexParams +{ + LinearIndexParams(); +}; + +struct CV_EXPORTS CompositeIndexParams : public IndexParams +{ + CompositeIndexParams(int trees = 4, int branching = 32, int iterations = 11, + cvflann::flann_centers_init_t centers_init = cvflann::FLANN_CENTERS_RANDOM, float cb_index = 0.2f ); +}; + +struct CV_EXPORTS AutotunedIndexParams : public IndexParams +{ + AutotunedIndexParams(float target_precision = 0.8f, float build_weight = 0.01f, + float memory_weight = 0, float sample_fraction = 0.1f); +}; + +struct CV_EXPORTS HierarchicalClusteringIndexParams : public IndexParams +{ + HierarchicalClusteringIndexParams(int branching = 32, + cvflann::flann_centers_init_t centers_init = cvflann::FLANN_CENTERS_RANDOM, int trees = 4, int leaf_size = 100 ); +}; + +struct CV_EXPORTS KMeansIndexParams : public IndexParams +{ + KMeansIndexParams(int branching = 32, int iterations = 11, + cvflann::flann_centers_init_t centers_init = cvflann::FLANN_CENTERS_RANDOM, float cb_index = 0.2f ); +}; + +struct CV_EXPORTS LshIndexParams : public IndexParams +{ + LshIndexParams(int table_number, int key_size, int multi_probe_level); +}; + +struct CV_EXPORTS SavedIndexParams : public IndexParams +{ + SavedIndexParams(const String& filename); +}; + +struct CV_EXPORTS SearchParams : public IndexParams +{ + SearchParams( int checks, float eps, bool sorted, bool explore_all_trees ); + SearchParams( int checks = 32, float eps = 0, bool sorted = true ); +}; + +class CV_EXPORTS_W Index +{ +public: + CV_WRAP Index(); + CV_WRAP Index(InputArray features, const IndexParams& params, cvflann::flann_distance_t distType=cvflann::FLANN_DIST_L2); + virtual ~Index(); + + CV_WRAP virtual void build(InputArray features, const IndexParams& params, cvflann::flann_distance_t distType=cvflann::FLANN_DIST_L2); + CV_WRAP virtual void knnSearch(InputArray query, OutputArray indices, + OutputArray dists, int knn, const SearchParams& params=SearchParams()); + + CV_WRAP virtual int radiusSearch(InputArray query, OutputArray indices, + OutputArray dists, double radius, int maxResults, + const SearchParams& params=SearchParams()); + + CV_WRAP virtual void save(const String& filename) const; + CV_WRAP virtual bool load(InputArray features, const String& filename); + CV_WRAP virtual void release(); + CV_WRAP cvflann::flann_distance_t getDistance() const; + CV_WRAP cvflann::flann_algorithm_t getAlgorithm() const; + +protected: + bool load_(const String& filename); + + cvflann::flann_distance_t distType; + cvflann::flann_algorithm_t algo; + int featureType; + void* index; + Mat features_clone; // index may store features pointer internally for searching, so avoid dangling pointers: https://github.com/opencv/opencv/issues/17553 +}; + +} } // namespace cv::flann + +//! @endcond + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/flann/nn_index.h b/Thirdparty/opencv2/include/opencv2/flann/nn_index.h new file mode 100644 index 0000000..23a1de7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/nn_index.h @@ -0,0 +1,180 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_NNINDEX_H +#define OPENCV_FLANN_NNINDEX_H + +#include "matrix.h" +#include "result_set.h" +#include "params.h" + +//! @cond IGNORED + +namespace cvflann +{ + +/** + * Nearest-neighbour index base class + */ +template +class NNIndex +{ + typedef typename Distance::ElementType ElementType; + typedef typename Distance::ResultType DistanceType; + +public: + + virtual ~NNIndex() {} + + /** + * \brief Builds the index + */ + virtual void buildIndex() = 0; + + /** + * \brief Perform k-nearest neighbor search + * \param[in] queries The query points for which to find the nearest neighbors + * \param[out] indices The indices of the nearest neighbors found + * \param[out] dists Distances to the nearest neighbors found + * \param[in] knn Number of nearest neighbors to return + * \param[in] params Search parameters + */ + virtual void knnSearch(const Matrix& queries, Matrix& indices, Matrix& dists, int knn, const SearchParams& params) + { + CV_Assert(queries.cols == veclen()); + CV_Assert(indices.rows >= queries.rows); + CV_Assert(dists.rows >= queries.rows); + CV_Assert(int(indices.cols) >= knn); + CV_Assert(int(dists.cols) >= knn); + +#if 0 + KNNResultSet resultSet(knn); + for (size_t i = 0; i < queries.rows; i++) { + resultSet.init(indices[i], dists[i]); + findNeighbors(resultSet, queries[i], params); + } +#else + KNNUniqueResultSet resultSet(knn); + for (size_t i = 0; i < queries.rows; i++) { + resultSet.clear(); + findNeighbors(resultSet, queries[i], params); + if (get_param(params,"sorted",true)) resultSet.sortAndCopy(indices[i], dists[i], knn); + else resultSet.copy(indices[i], dists[i], knn); + } +#endif + } + + /** + * \brief Perform radius search + * \param[in] query The query point + * \param[out] indices The indinces of the neighbors found within the given radius + * \param[out] dists The distances to the nearest neighbors found + * \param[in] radius The radius used for search + * \param[in] params Search parameters + * \returns Number of neighbors found + */ + virtual int radiusSearch(const Matrix& query, Matrix& indices, Matrix& dists, float radius, const SearchParams& params) + { + if (query.rows != 1) { + fprintf(stderr, "I can only search one feature at a time for range search\n"); + return -1; + } + CV_Assert(query.cols == veclen()); + CV_Assert(indices.cols == dists.cols); + + int n = 0; + int* indices_ptr = NULL; + DistanceType* dists_ptr = NULL; + if (indices.cols > 0) { + n = (int)indices.cols; + indices_ptr = indices[0]; + dists_ptr = dists[0]; + } + + RadiusUniqueResultSet resultSet((DistanceType)radius); + resultSet.clear(); + findNeighbors(resultSet, query[0], params); + if (n>0) { + if (get_param(params,"sorted",true)) resultSet.sortAndCopy(indices_ptr, dists_ptr, n); + else resultSet.copy(indices_ptr, dists_ptr, n); + } + + return (int)resultSet.size(); + } + + /** + * \brief Saves the index to a stream + * \param stream The stream to save the index to + */ + virtual void saveIndex(FILE* stream) = 0; + + /** + * \brief Loads the index from a stream + * \param stream The stream from which the index is loaded + */ + virtual void loadIndex(FILE* stream) = 0; + + /** + * \returns number of features in this index. + */ + virtual size_t size() const = 0; + + /** + * \returns The dimensionality of the features in this index. + */ + virtual size_t veclen() const = 0; + + /** + * \returns The amount of memory (in bytes) used by the index. + */ + virtual int usedMemory() const = 0; + + /** + * \returns The index type (kdtree, kmeans,...) + */ + virtual flann_algorithm_t getType() const = 0; + + /** + * \returns The index parameters + */ + virtual IndexParams getParameters() const = 0; + + + /** + * \brief Method that searches for nearest-neighbours + */ + virtual void findNeighbors(ResultSet& result, const ElementType* vec, const SearchParams& searchParams) = 0; +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_NNINDEX_H diff --git a/Thirdparty/opencv2/include/opencv2/flann/object_factory.h b/Thirdparty/opencv2/include/opencv2/flann/object_factory.h new file mode 100644 index 0000000..5cc45ad --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/object_factory.h @@ -0,0 +1,95 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_OBJECT_FACTORY_H_ +#define OPENCV_FLANN_OBJECT_FACTORY_H_ + +//! @cond IGNORED + +#include + +namespace cvflann +{ + +class CreatorNotFound +{ +}; + +template +class ObjectFactory +{ + typedef ObjectFactory ThisClass; + typedef std::map ObjectRegistry; + + // singleton class, private constructor + ObjectFactory() {} + +public: + + bool subscribe(UniqueIdType id, ObjectCreator creator) + { + if (object_registry.find(id) != object_registry.end()) return false; + + object_registry[id] = creator; + return true; + } + + bool unregister(UniqueIdType id) + { + return object_registry.erase(id) == 1; + } + + ObjectCreator create(UniqueIdType id) + { + typename ObjectRegistry::const_iterator iter = object_registry.find(id); + + if (iter == object_registry.end()) { + throw CreatorNotFound(); + } + + return iter->second; + } + + static ThisClass& instance() + { + static ThisClass the_factory; + return the_factory; + } +private: + ObjectRegistry object_registry; +}; + +} + +//! @endcond + +#endif /* OPENCV_FLANN_OBJECT_FACTORY_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/params.h b/Thirdparty/opencv2/include/opencv2/flann/params.h new file mode 100644 index 0000000..1a8e127 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/params.h @@ -0,0 +1,126 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2011 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2011 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_PARAMS_H_ +#define OPENCV_FLANN_PARAMS_H_ + +//! @cond IGNORED + +#include "any.h" +#include "general.h" +#include +#include + + +namespace cvflann +{ + +typedef std::map IndexParams; + +struct SearchParams : public IndexParams +{ + SearchParams(int checks = 32, float eps = 0, bool sorted = true ) + { + init(checks, eps, sorted, false); + } + + SearchParams(int checks, float eps, bool sorted, bool explore_all_trees ) + { + init(checks, eps, sorted, explore_all_trees); + } + + void init(int checks = 32, float eps = 0, bool sorted = true, bool explore_all_trees = false ) + { + // how many leafs to visit when searching for neighbours (-1 for unlimited) + (*this)["checks"] = checks; + // search for eps-approximate neighbours (default: 0) + (*this)["eps"] = eps; + // only for radius search, require neighbours sorted by distance (default: true) + (*this)["sorted"] = sorted; + // if false, search stops at the tree reaching the number of max checks (original behavior). + // When true, we do a descent in each tree and. Like before the alternative paths + // stored in the heap are not be processed further when max checks is reached. + (*this)["explore_all_trees"] = explore_all_trees; + } +}; + + +template +T get_param(const IndexParams& params, const cv::String& name, const T& default_value) +{ + IndexParams::const_iterator it = params.find(name); + if (it != params.end()) { + try { + return it->second.cast(); + } catch (const std::exception& e) { + CV_Error_(cv::Error::StsBadArg, + ("FLANN '%s' param type mismatch: %s", name.c_str(), e.what())); + } + } + else { + return default_value; + } +} + +template +T get_param(const IndexParams& params, const cv::String& name) +{ + IndexParams::const_iterator it = params.find(name); + if (it != params.end()) { + try { + return it->second.cast(); + } catch (const std::exception& e) { + CV_Error_(cv::Error::StsBadArg, + ("FLANN '%s' param type mismatch: %s", name.c_str(), e.what())); + } + } + else { + FLANN_THROW(cv::Error::StsBadArg, cv::String("Missing parameter '")+name+cv::String("' in the parameters given")); + } +} + +inline void print_params(const IndexParams& params, std::ostream& stream) +{ + IndexParams::const_iterator it; + + for(it=params.begin(); it!=params.end(); ++it) { + stream << it->first << " : " << it->second << std::endl; + } +} + +inline void print_params(const IndexParams& params) +{ + print_params(params, std::cout); +} + +} + +//! @endcond + +#endif /* OPENCV_FLANN_PARAMS_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/random.h b/Thirdparty/opencv2/include/opencv2/flann/random.h new file mode 100644 index 0000000..5a12ef3 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/random.h @@ -0,0 +1,156 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_RANDOM_H +#define OPENCV_FLANN_RANDOM_H + +//! @cond IGNORED + +#include +#include +#include + +namespace cvflann +{ + +inline int rand() +{ +#ifndef OPENCV_FLANN_USE_STD_RAND +# if INT_MAX == RAND_MAX + int v = cv::theRNG().next() & INT_MAX; +# else + int v = cv::theRNG().uniform(0, RAND_MAX + 1); +# endif +#else + int v = std::rand(); +#endif // OPENCV_FLANN_USE_STD_RAND + return v; +} + +/** + * Seeds the random number generator + * @param seed Random seed + */ +inline void seed_random(unsigned int seed) +{ +#ifndef OPENCV_FLANN_USE_STD_RAND + cv::theRNG() = cv::RNG(seed); +#else + std::srand(seed); +#endif +} + +/* + * Generates a random double value. + */ +/** + * Generates a random double value. + * @param high Upper limit + * @param low Lower limit + * @return Random double value + */ +inline double rand_double(double high = 1.0, double low = 0) +{ + return low + ((high-low) * (rand() / (RAND_MAX + 1.0))); +} + +/** + * Generates a random integer value. + * @param high Upper limit + * @param low Lower limit + * @return Random integer value + */ +inline int rand_int(int high = RAND_MAX, int low = 0) +{ + return low + (int) ( double(high-low) * (rand() / (RAND_MAX + 1.0))); +} + +/** + * Random number generator that returns a distinct number from + * the [0,n) interval each time. + */ +class UniqueRandom +{ + std::vector vals_; + int size_; + int counter_; + +public: + /** + * Constructor. + * @param n Size of the interval from which to generate + */ + UniqueRandom(int n) + { + init(n); + } + + /** + * Initializes the number generator. + * @param n the size of the interval from which to generate random numbers. + */ + void init(int n) + { + // create and initialize an array of size n + vals_.resize(n); + size_ = n; + for (int i = 0; i < size_; ++i) vals_[i] = i; + + // shuffle the elements in the array +#ifndef OPENCV_FLANN_USE_STD_RAND + cv::randShuffle(vals_); +#else + std::random_shuffle(vals_.begin(), vals_.end()); +#endif + + counter_ = 0; + } + + /** + * Return a distinct random integer in greater or equal to 0 and less + * than 'n' on each call. It should be called maximum 'n' times. + * Returns: a random integer + */ + int next() + { + if (counter_ == size_) { + return -1; + } + else { + return vals_[counter_++]; + } + } +}; + +} + +//! @endcond + +#endif //OPENCV_FLANN_RANDOM_H diff --git a/Thirdparty/opencv2/include/opencv2/flann/result_set.h b/Thirdparty/opencv2/include/opencv2/flann/result_set.h new file mode 100644 index 0000000..aa679df --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/result_set.h @@ -0,0 +1,548 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_RESULTSET_H +#define OPENCV_FLANN_RESULTSET_H + +//! @cond IGNORED + +#include +#include +#include +#include +#include +#include + +#include "opencv2/core/base.hpp" +#include "opencv2/core/cvdef.h" + +namespace cvflann +{ + +/* This record represents a branch point when finding neighbors in + the tree. It contains a record of the minimum distance to the query + point, as well as the node at which the search resumes. + */ + +template +struct BranchStruct +{ + T node; /* Tree node at which search resumes */ + DistanceType mindist; /* Minimum distance to query for all nodes below. */ + + BranchStruct() {} + BranchStruct(const T& aNode, DistanceType dist) : node(aNode), mindist(dist) {} + + bool operator<(const BranchStruct& rhs) const + { + return mindist +class ResultSet +{ +public: + virtual ~ResultSet() {} + + virtual bool full() const = 0; + + virtual void addPoint(DistanceType dist, int index) = 0; + + virtual DistanceType worstDist() const = 0; + +}; + +/** + * KNNSimpleResultSet does not ensure that the element it holds are unique. + * Is used in those cases where the nearest neighbour algorithm used does not + * attempt to insert the same element multiple times. + */ +template +class KNNSimpleResultSet : public ResultSet +{ + int* indices; + DistanceType* dists; + int capacity; + int count; + DistanceType worst_distance_; + +public: + KNNSimpleResultSet(int capacity_) : capacity(capacity_), count(0) + { + } + + void init(int* indices_, DistanceType* dists_) + { + indices = indices_; + dists = dists_; + count = 0; + worst_distance_ = (std::numeric_limits::max)(); + dists[capacity-1] = worst_distance_; + } + + size_t size() const + { + return count; + } + + bool full() const CV_OVERRIDE + { + return count == capacity; + } + + + void addPoint(DistanceType dist, int index) CV_OVERRIDE + { + if (dist >= worst_distance_) return; + int i; + for (i=count; i>0; --i) { +#ifdef FLANN_FIRST_MATCH + if ( (dists[i-1]>dist) || ((dist==dists[i-1])&&(indices[i-1]>index)) ) +#else + if (dists[i-1]>dist) +#endif + { + if (i +class KNNResultSet : public ResultSet +{ + int* indices; + DistanceType* dists; + int capacity; + int count; + DistanceType worst_distance_; + +public: + KNNResultSet(int capacity_) + : indices(NULL), dists(NULL), capacity(capacity_), count(0), worst_distance_(0) + { + } + + void init(int* indices_, DistanceType* dists_) + { + indices = indices_; + dists = dists_; + count = 0; + worst_distance_ = (std::numeric_limits::max)(); + dists[capacity-1] = worst_distance_; + } + + size_t size() const + { + return count; + } + + bool full() const CV_OVERRIDE + { + return count == capacity; + } + + + void addPoint(DistanceType dist, int index) CV_OVERRIDE + { + CV_DbgAssert(indices); + CV_DbgAssert(dists); + if (dist >= worst_distance_) return; + int i; + for (i = count; i > 0; --i) { +#ifdef FLANN_FIRST_MATCH + if ( (dists[i-1]<=dist) && ((dist!=dists[i-1])||(indices[i-1]<=index)) ) +#else + if (dists[i-1]<=dist) +#endif + { + // Check for duplicate indices + for (int j = i; dists[j] == dist && j--;) { + if (indices[j] == index) { + return; + } + } + break; + } + } + + if (count < capacity) ++count; + for (int j = count-1; j > i; --j) { + dists[j] = dists[j-1]; + indices[j] = indices[j-1]; + } + dists[i] = dist; + indices[i] = index; + worst_distance_ = dists[capacity-1]; + } + + DistanceType worstDist() const CV_OVERRIDE + { + return worst_distance_; + } +}; + + +/** + * A result-set class used when performing a radius based search. + */ +template +class RadiusResultSet : public ResultSet +{ + DistanceType radius; + int* indices; + DistanceType* dists; + size_t capacity; + size_t count; + +public: + RadiusResultSet(DistanceType radius_, int* indices_, DistanceType* dists_, int capacity_) : + radius(radius_), indices(indices_), dists(dists_), capacity(capacity_) + { + init(); + } + + ~RadiusResultSet() + { + } + + void init() + { + count = 0; + } + + size_t size() const + { + return count; + } + + bool full() const + { + return true; + } + + void addPoint(DistanceType dist, int index) + { + if (dist0)&&(count < capacity)) { + dists[count] = dist; + indices[count] = index; + } + count++; + } + } + + DistanceType worstDist() const + { + return radius; + } + +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Class that holds the k NN neighbors + * Faster than KNNResultSet as it uses a binary heap and does not maintain two arrays + */ +template +class UniqueResultSet : public ResultSet +{ +public: + struct DistIndex + { + DistIndex(DistanceType dist, unsigned int index) : + dist_(dist), index_(index) + { + } + bool operator<(const DistIndex dist_index) const + { + return (dist_ < dist_index.dist_) || ((dist_ == dist_index.dist_) && index_ < dist_index.index_); + } + DistanceType dist_; + unsigned int index_; + }; + + /** Default constructor */ + UniqueResultSet() : + is_full_(false), worst_distance_(std::numeric_limits::max()) + { + } + + /** Check the status of the set + * @return true if we have k NN + */ + inline bool full() const CV_OVERRIDE + { + return is_full_; + } + + /** Remove all elements in the set + */ + virtual void clear() = 0; + + /** Copy the set to two C arrays + * @param indices pointer to a C array of indices + * @param dist pointer to a C array of distances + * @param n_neighbors the number of neighbors to copy + */ + virtual void copy(int* indices, DistanceType* dist, int n_neighbors = -1) const + { + if (n_neighbors < 0) { + for (typename std::set::const_iterator dist_index = dist_indices_.begin(), dist_index_end = + dist_indices_.end(); dist_index != dist_index_end; ++dist_index, ++indices, ++dist) { + *indices = dist_index->index_; + *dist = dist_index->dist_; + } + } + else { + int i = 0; + for (typename std::set::const_iterator dist_index = dist_indices_.begin(), dist_index_end = + dist_indices_.end(); (dist_index != dist_index_end) && (i < n_neighbors); ++dist_index, ++indices, ++dist, ++i) { + *indices = dist_index->index_; + *dist = dist_index->dist_; + } + } + } + + /** Copy the set to two C arrays but sort it according to the distance first + * @param indices pointer to a C array of indices + * @param dist pointer to a C array of distances + * @param n_neighbors the number of neighbors to copy + */ + virtual void sortAndCopy(int* indices, DistanceType* dist, int n_neighbors = -1) const + { + copy(indices, dist, n_neighbors); + } + + /** The number of neighbors in the set + */ + size_t size() const + { + return dist_indices_.size(); + } + + /** The distance of the furthest neighbor + * If we don't have enough neighbors, it returns the max possible value + */ + inline DistanceType worstDist() const CV_OVERRIDE + { + return worst_distance_; + } +protected: + /** Flag to say if the set is full */ + bool is_full_; + + /** The worst distance found so far */ + DistanceType worst_distance_; + + /** The best candidates so far */ + std::set dist_indices_; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Class that holds the k NN neighbors + * Faster than KNNResultSet as it uses a binary heap and does not maintain two arrays + */ +template +class KNNUniqueResultSet : public UniqueResultSet +{ +public: + /** Constructor + * @param capacity the number of neighbors to store at max + */ + KNNUniqueResultSet(unsigned int capacity) : capacity_(capacity) + { + this->is_full_ = false; + this->clear(); + } + + /** Add a possible candidate to the best neighbors + * @param dist distance for that neighbor + * @param index index of that neighbor + */ + inline void addPoint(DistanceType dist, int index) CV_OVERRIDE + { + // Don't do anything if we are worse than the worst + if (dist >= worst_distance_) return; + dist_indices_.insert(DistIndex(dist, index)); + + if (is_full_) { + if (dist_indices_.size() > capacity_) { + dist_indices_.erase(*dist_indices_.rbegin()); + worst_distance_ = dist_indices_.rbegin()->dist_; + } + } + else if (dist_indices_.size() == capacity_) { + is_full_ = true; + worst_distance_ = dist_indices_.rbegin()->dist_; + } + } + + /** Remove all elements in the set + */ + void clear() CV_OVERRIDE + { + dist_indices_.clear(); + worst_distance_ = std::numeric_limits::max(); + is_full_ = false; + } + +protected: + typedef typename UniqueResultSet::DistIndex DistIndex; + using UniqueResultSet::is_full_; + using UniqueResultSet::worst_distance_; + using UniqueResultSet::dist_indices_; + + /** The number of neighbors to keep */ + unsigned int capacity_; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Class that holds the radius nearest neighbors + * It is more accurate than RadiusResult as it is not limited in the number of neighbors + */ +template +class RadiusUniqueResultSet : public UniqueResultSet +{ +public: + /** Constructor + * @param radius the maximum distance of a neighbor + */ + RadiusUniqueResultSet(DistanceType radius) : + radius_(radius) + { + is_full_ = true; + } + + /** Add a possible candidate to the best neighbors + * @param dist distance for that neighbor + * @param index index of that neighbor + */ + void addPoint(DistanceType dist, int index) CV_OVERRIDE + { + if (dist <= radius_) dist_indices_.insert(DistIndex(dist, index)); + } + + /** Remove all elements in the set + */ + inline void clear() CV_OVERRIDE + { + dist_indices_.clear(); + } + + + /** Check the status of the set + * @return alwys false + */ + inline bool full() const CV_OVERRIDE + { + return true; + } + + /** The distance of the furthest neighbor + * If we don't have enough neighbors, it returns the max possible value + */ + inline DistanceType worstDist() const CV_OVERRIDE + { + return radius_; + } +private: + typedef typename UniqueResultSet::DistIndex DistIndex; + using UniqueResultSet::dist_indices_; + using UniqueResultSet::is_full_; + + /** The furthest distance a neighbor can be */ + DistanceType radius_; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** Class that holds the k NN neighbors within a radius distance + */ +template +class KNNRadiusUniqueResultSet : public KNNUniqueResultSet +{ +public: + /** Constructor + * @param capacity the number of neighbors to store at max + * @param radius the maximum distance of a neighbor + */ + KNNRadiusUniqueResultSet(unsigned int capacity, DistanceType radius) + { + this->capacity_ = capacity; + this->radius_ = radius; + this->dist_indices_.reserve(capacity_); + this->clear(); + } + + /** Remove all elements in the set + */ + void clear() + { + dist_indices_.clear(); + worst_distance_ = radius_; + is_full_ = false; + } +private: + using KNNUniqueResultSet::dist_indices_; + using KNNUniqueResultSet::is_full_; + using KNNUniqueResultSet::worst_distance_; + + /** The maximum number of neighbors to consider */ + unsigned int capacity_; + + /** The maximum distance of a neighbor */ + DistanceType radius_; +}; +} + +//! @endcond + +#endif //OPENCV_FLANN_RESULTSET_H diff --git a/Thirdparty/opencv2/include/opencv2/flann/sampling.h b/Thirdparty/opencv2/include/opencv2/flann/sampling.h new file mode 100644 index 0000000..4e452b9 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/sampling.h @@ -0,0 +1,84 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + + +#ifndef OPENCV_FLANN_SAMPLING_H_ +#define OPENCV_FLANN_SAMPLING_H_ + +//! @cond IGNORED + +#include "matrix.h" +#include "random.h" + +namespace cvflann +{ + +template +Matrix random_sample(Matrix& srcMatrix, long size, bool remove = false) +{ + Matrix newSet(new T[size * srcMatrix.cols], size,srcMatrix.cols); + + T* src,* dest; + for (long i=0; i +Matrix random_sample(const Matrix& srcMatrix, size_t size) +{ + UniqueRandom rand((int)srcMatrix.rows); + Matrix newSet(new T[size * srcMatrix.cols], size,srcMatrix.cols); + + T* src,* dest; + for (size_t i=0; i +#include + +#include "general.h" +#include "nn_index.h" + +#ifdef FLANN_SIGNATURE_ +#undef FLANN_SIGNATURE_ +#endif +#define FLANN_SIGNATURE_ "FLANN_INDEX" + +namespace cvflann +{ + +template +struct Datatype {}; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_INT8; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_INT16; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_INT32; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_UINT8; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_UINT16; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_UINT32; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_FLOAT32; } }; +template<> +struct Datatype { static flann_datatype_t type() { return FLANN_FLOAT64; } }; + + +/** + * Structure representing the index header. + */ +struct IndexHeader +{ + char signature[16]; + char version[16]; + flann_datatype_t data_type; + flann_algorithm_t index_type; + size_t rows; + size_t cols; +}; + +/** + * Saves index header to stream + * + * @param stream - Stream to save to + * @param index - The index to save + */ +template +void save_header(FILE* stream, const NNIndex& index) +{ + IndexHeader header; + memset(header.signature, 0, sizeof(header.signature)); + strcpy(header.signature, FLANN_SIGNATURE_); + memset(header.version, 0, sizeof(header.version)); + strcpy(header.version, FLANN_VERSION_); + header.data_type = Datatype::type(); + header.index_type = index.getType(); + header.rows = index.size(); + header.cols = index.veclen(); + + std::fwrite(&header, sizeof(header),1,stream); +} + + +/** + * + * @param stream - Stream to load from + * @return Index header + */ +inline IndexHeader load_header(FILE* stream) +{ + IndexHeader header; + size_t read_size = fread(&header,sizeof(header),1,stream); + + if (read_size!=(size_t)1) { + FLANN_THROW(cv::Error::StsError, "Invalid index file, cannot read"); + } + + if (strcmp(header.signature,FLANN_SIGNATURE_)!=0) { + FLANN_THROW(cv::Error::StsError, "Invalid index file, wrong signature"); + } + + return header; + +} + + +template +void save_value(FILE* stream, const T& value, size_t count = 1) +{ + fwrite(&value, sizeof(value),count, stream); +} + +template +void save_value(FILE* stream, const cvflann::Matrix& value) +{ + fwrite(&value, sizeof(value),1, stream); + fwrite(value.data, sizeof(T),value.rows*value.cols, stream); +} + +template +void save_value(FILE* stream, const std::vector& value) +{ + size_t size = value.size(); + fwrite(&size, sizeof(size_t), 1, stream); + fwrite(&value[0], sizeof(T), size, stream); +} + +template +void load_value(FILE* stream, T& value, size_t count = 1) +{ + size_t read_cnt = fread(&value, sizeof(value), count, stream); + if (read_cnt != count) { + FLANN_THROW(cv::Error::StsParseError, "Cannot read from file"); + } +} + +template +void load_value(FILE* stream, cvflann::Matrix& value) +{ + size_t read_cnt = fread(&value, sizeof(value), 1, stream); + if (read_cnt != 1) { + FLANN_THROW(cv::Error::StsParseError, "Cannot read from file"); + } + value.data = new T[value.rows*value.cols]; + read_cnt = fread(value.data, sizeof(T), value.rows*value.cols, stream); + if (read_cnt != (size_t)(value.rows*value.cols)) { + FLANN_THROW(cv::Error::StsParseError, "Cannot read from file"); + } +} + + +template +void load_value(FILE* stream, std::vector& value) +{ + size_t size; + size_t read_cnt = fread(&size, sizeof(size_t), 1, stream); + if (read_cnt!=1) { + FLANN_THROW(cv::Error::StsError, "Cannot read from file"); + } + value.resize(size); + read_cnt = fread(&value[0], sizeof(T), size, stream); + if (read_cnt != size) { + FLANN_THROW(cv::Error::StsError, "Cannot read from file"); + } +} + +} + +//! @endcond + +#endif /* OPENCV_FLANN_SAVING_H_ */ diff --git a/Thirdparty/opencv2/include/opencv2/flann/simplex_downhill.h b/Thirdparty/opencv2/include/opencv2/flann/simplex_downhill.h new file mode 100644 index 0000000..0297014 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/flann/simplex_downhill.h @@ -0,0 +1,190 @@ +/*********************************************************************** + * Software License Agreement (BSD License) + * + * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. + * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. + * + * THE BSD LICENSE + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *************************************************************************/ + +#ifndef OPENCV_FLANN_SIMPLEX_DOWNHILL_H_ +#define OPENCV_FLANN_SIMPLEX_DOWNHILL_H_ + +//! @cond IGNORED + +namespace cvflann +{ + +/** + Adds val to array vals (and point to array points) and keeping the arrays sorted by vals. + */ +template +void addValue(int pos, float val, float* vals, T* point, T* points, int n) +{ + vals[pos] = val; + for (int i=0; i0 && vals[j] +float optimizeSimplexDownhill(T* points, int n, F func, float* vals = NULL ) +{ + const int MAX_ITERATIONS = 10; + + CV_DbgAssert(n>0); + + T* p_o = new T[n]; + T* p_r = new T[n]; + T* p_e = new T[n]; + + int alpha = 1; + + int iterations = 0; + + bool ownVals = false; + if (vals == NULL) { + ownVals = true; + vals = new float[n+1]; + for (int i=0; i MAX_ITERATIONS) break; + + // compute average of simplex points (except the highest point) + for (int j=0; j=vals[0])&&(val_r=vals[n]) { + for (int i=0; i +#include "opencv2/core.hpp" +#include "opencv2/core/utility.hpp" + +namespace cvflann +{ + +/** + * A start-stop timer class. + * + * Can be used to time portions of code. + */ +class StartStopTimer +{ + int64 startTime; + +public: + /** + * Value of the timer. + */ + double value; + + + /** + * Constructor. + */ + StartStopTimer() + : startTime(0) + { + reset(); + } + + /** + * Starts the timer. + */ + void start() + { + startTime = cv::getTickCount(); + } + + /** + * Stops the timer and updates timer value. + */ + void stop() + { + int64 stopTime = cv::getTickCount(); + value += ( (double)stopTime - startTime) / cv::getTickFrequency(); + } + + /** + * Resets the timer value to 0. + */ + void reset() + { + value = 0; + } + +}; + +} + +//! @endcond + +#endif // FLANN_TIMER_H diff --git a/Thirdparty/opencv2/include/opencv2/highgui.hpp b/Thirdparty/opencv2/include/opencv2/highgui.hpp new file mode 100644 index 0000000..e6a40ca --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/highgui.hpp @@ -0,0 +1,848 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HIGHGUI_HPP +#define OPENCV_HIGHGUI_HPP + +#include "opencv2/core.hpp" +#ifdef HAVE_OPENCV_IMGCODECS +#include "opencv2/imgcodecs.hpp" +#endif +#ifdef HAVE_OPENCV_VIDEOIO +#include "opencv2/videoio.hpp" +#endif + +/** +@defgroup highgui High-level GUI + +While OpenCV was designed for use in full-scale applications and can be used within functionally +rich UI frameworks (such as Qt\*, WinForms\*, or Cocoa\*) or without any UI at all, sometimes there +it is required to try functionality quickly and visualize the results. This is what the HighGUI +module has been designed for. + +It provides easy interface to: + +- Create and manipulate windows that can display images and "remember" their content (no need to + handle repaint events from OS). +- Add trackbars to the windows, handle simple mouse events as well as keyboard commands. + +@{ + @defgroup highgui_window_flags Flags related creating and manipulating HighGUI windows and mouse events + @defgroup highgui_opengl OpenGL support + @defgroup highgui_qt Qt New Functions + + ![image](pics/qtgui.png) + + This figure explains new functionality implemented with Qt\* GUI. The new GUI provides a statusbar, + a toolbar, and a control panel. The control panel can have trackbars and buttonbars attached to it. + If you cannot see the control panel, press Ctrl+P or right-click any Qt window and select **Display + properties window**. + + - To attach a trackbar, the window name parameter must be NULL. + + - To attach a buttonbar, a button must be created. If the last bar attached to the control panel + is a buttonbar, the new button is added to the right of the last button. If the last bar + attached to the control panel is a trackbar, or the control panel is empty, a new buttonbar is + created. Then, a new button is attached to it. + + See below the example used to generate the figure: + @code + int main(int argc, char *argv[]) + { + + int value = 50; + int value2 = 0; + + + namedWindow("main1",WINDOW_NORMAL); + namedWindow("main2",WINDOW_AUTOSIZE | WINDOW_GUI_NORMAL); + createTrackbar( "track1", "main1", &value, 255, NULL); + + String nameb1 = "button1"; + String nameb2 = "button2"; + + createButton(nameb1,callbackButton,&nameb1,QT_CHECKBOX,1); + createButton(nameb2,callbackButton,NULL,QT_CHECKBOX,0); + createTrackbar( "track2", NULL, &value2, 255, NULL); + createButton("button5",callbackButton1,NULL,QT_RADIOBOX,0); + createButton("button6",callbackButton2,NULL,QT_RADIOBOX,1); + + setMouseCallback( "main2",on_mouse,NULL ); + + Mat img1 = imread("files/flower.jpg"); + VideoCapture video; + video.open("files/hockey.avi"); + + Mat img2,img3; + + while( waitKey(33) != 27 ) + { + img1.convertTo(img2,-1,1,value); + video >> img3; + + imshow("main1",img2); + imshow("main2",img3); + } + + destroyAllWindows(); + + return 0; + } + @endcode + + + @defgroup highgui_winrt WinRT support + + This figure explains new functionality implemented with WinRT GUI. The new GUI provides an Image control, + and a slider panel. Slider panel holds trackbars attached to it. + + Sliders are attached below the image control. Every new slider is added below the previous one. + + See below the example used to generate the figure: + @code + void sample_app::MainPage::ShowWindow() + { + static cv::String windowName("sample"); + cv::winrt_initContainer(this->cvContainer); + cv::namedWindow(windowName); // not required + + cv::Mat image = cv::imread("Assets/sample.jpg"); + cv::Mat converted = cv::Mat(image.rows, image.cols, CV_8UC4); + cv::cvtColor(image, converted, COLOR_BGR2BGRA); + cv::imshow(windowName, converted); // this will create window if it hasn't been created before + + int state = 42; + cv::TrackbarCallback callback = [](int pos, void* userdata) + { + if (pos == 0) { + cv::destroyWindow(windowName); + } + }; + cv::TrackbarCallback callbackTwin = [](int pos, void* userdata) + { + if (pos >= 70) { + cv::destroyAllWindows(); + } + }; + cv::createTrackbar("Sample trackbar", windowName, &state, 100, callback); + cv::createTrackbar("Twin brother", windowName, &state, 100, callbackTwin); + } + @endcode + + @defgroup highgui_c C API +@} +*/ + +///////////////////////// graphical user interface ////////////////////////// +namespace cv +{ + +//! @addtogroup highgui +//! @{ + +//! @addtogroup highgui_window_flags +//! @{ + +//! Flags for cv::namedWindow +enum WindowFlags { + WINDOW_NORMAL = 0x00000000, //!< the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size. + WINDOW_AUTOSIZE = 0x00000001, //!< the user cannot resize the window, the size is constrainted by the image displayed. + WINDOW_OPENGL = 0x00001000, //!< window with opengl support. + + WINDOW_FULLSCREEN = 1, //!< change the window to fullscreen. + WINDOW_FREERATIO = 0x00000100, //!< the image expends as much as it can (no ratio constraint). + WINDOW_KEEPRATIO = 0x00000000, //!< the ratio of the image is respected. + WINDOW_GUI_EXPANDED=0x00000000, //!< status bar and tool bar + WINDOW_GUI_NORMAL = 0x00000010, //!< old fashious way + }; + +//! Flags for cv::setWindowProperty / cv::getWindowProperty +enum WindowPropertyFlags { + WND_PROP_FULLSCREEN = 0, //!< fullscreen property (can be WINDOW_NORMAL or WINDOW_FULLSCREEN). + WND_PROP_AUTOSIZE = 1, //!< autosize property (can be WINDOW_NORMAL or WINDOW_AUTOSIZE). + WND_PROP_ASPECT_RATIO = 2, //!< window's aspect ration (can be set to WINDOW_FREERATIO or WINDOW_KEEPRATIO). + WND_PROP_OPENGL = 3, //!< opengl support. + WND_PROP_VISIBLE = 4, //!< checks whether the window exists and is visible + WND_PROP_TOPMOST = 5, //!< property to toggle normal window being topmost or not + WND_PROP_VSYNC = 6 //!< enable or disable VSYNC (in OpenGL mode) + }; + +//! Mouse Events see cv::MouseCallback +enum MouseEventTypes { + EVENT_MOUSEMOVE = 0, //!< indicates that the mouse pointer has moved over the window. + EVENT_LBUTTONDOWN = 1, //!< indicates that the left mouse button is pressed. + EVENT_RBUTTONDOWN = 2, //!< indicates that the right mouse button is pressed. + EVENT_MBUTTONDOWN = 3, //!< indicates that the middle mouse button is pressed. + EVENT_LBUTTONUP = 4, //!< indicates that left mouse button is released. + EVENT_RBUTTONUP = 5, //!< indicates that right mouse button is released. + EVENT_MBUTTONUP = 6, //!< indicates that middle mouse button is released. + EVENT_LBUTTONDBLCLK = 7, //!< indicates that left mouse button is double clicked. + EVENT_RBUTTONDBLCLK = 8, //!< indicates that right mouse button is double clicked. + EVENT_MBUTTONDBLCLK = 9, //!< indicates that middle mouse button is double clicked. + EVENT_MOUSEWHEEL = 10,//!< positive and negative values mean forward and backward scrolling, respectively. + EVENT_MOUSEHWHEEL = 11 //!< positive and negative values mean right and left scrolling, respectively. + }; + +//! Mouse Event Flags see cv::MouseCallback +enum MouseEventFlags { + EVENT_FLAG_LBUTTON = 1, //!< indicates that the left mouse button is down. + EVENT_FLAG_RBUTTON = 2, //!< indicates that the right mouse button is down. + EVENT_FLAG_MBUTTON = 4, //!< indicates that the middle mouse button is down. + EVENT_FLAG_CTRLKEY = 8, //!< indicates that CTRL Key is pressed. + EVENT_FLAG_SHIFTKEY = 16,//!< indicates that SHIFT Key is pressed. + EVENT_FLAG_ALTKEY = 32 //!< indicates that ALT Key is pressed. + }; + +//! @} highgui_window_flags + +//! @addtogroup highgui_qt +//! @{ + +//! Qt font weight +enum QtFontWeights { + QT_FONT_LIGHT = 25, //!< Weight of 25 + QT_FONT_NORMAL = 50, //!< Weight of 50 + QT_FONT_DEMIBOLD = 63, //!< Weight of 63 + QT_FONT_BOLD = 75, //!< Weight of 75 + QT_FONT_BLACK = 87 //!< Weight of 87 + }; + +//! Qt font style +enum QtFontStyles { + QT_STYLE_NORMAL = 0, //!< Normal font. + QT_STYLE_ITALIC = 1, //!< Italic font. + QT_STYLE_OBLIQUE = 2 //!< Oblique font. + }; + +//! Qt "button" type +enum QtButtonTypes { + QT_PUSH_BUTTON = 0, //!< Push button. + QT_CHECKBOX = 1, //!< Checkbox button. + QT_RADIOBOX = 2, //!< Radiobox button. + QT_NEW_BUTTONBAR = 1024 //!< Button should create a new buttonbar + }; + +//! @} highgui_qt + +/** @brief Callback function for mouse events. see cv::setMouseCallback +@param event one of the cv::MouseEventTypes constants. +@param x The x-coordinate of the mouse event. +@param y The y-coordinate of the mouse event. +@param flags one of the cv::MouseEventFlags constants. +@param userdata The optional parameter. + */ +typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata); + +/** @brief Callback function for Trackbar see cv::createTrackbar +@param pos current position of the specified trackbar. +@param userdata The optional parameter. + */ +typedef void (*TrackbarCallback)(int pos, void* userdata); + +/** @brief Callback function defined to be called every frame. See cv::setOpenGlDrawCallback +@param userdata The optional parameter. + */ +typedef void (*OpenGlDrawCallback)(void* userdata); + +/** @brief Callback function for a button created by cv::createButton +@param state current state of the button. It could be -1 for a push button, 0 or 1 for a check/radio box button. +@param userdata The optional parameter. + */ +typedef void (*ButtonCallback)(int state, void* userdata); + +/** @brief Creates a window. + +The function namedWindow creates a window that can be used as a placeholder for images and +trackbars. Created windows are referred to by their names. + +If a window with the same name already exists, the function does nothing. + +You can call cv::destroyWindow or cv::destroyAllWindows to close the window and de-allocate any associated +memory usage. For a simple program, you do not really have to call these functions because all the +resources and windows of the application are closed automatically by the operating system upon exit. + +@note Qt backend supports additional flags: + - **WINDOW_NORMAL or WINDOW_AUTOSIZE:** WINDOW_NORMAL enables you to resize the + window, whereas WINDOW_AUTOSIZE adjusts automatically the window size to fit the + displayed image (see imshow ), and you cannot change the window size manually. + - **WINDOW_FREERATIO or WINDOW_KEEPRATIO:** WINDOW_FREERATIO adjusts the image + with no respect to its ratio, whereas WINDOW_KEEPRATIO keeps the image ratio. + - **WINDOW_GUI_NORMAL or WINDOW_GUI_EXPANDED:** WINDOW_GUI_NORMAL is the old way to draw the window + without statusbar and toolbar, whereas WINDOW_GUI_EXPANDED is a new enhanced GUI. +By default, flags == WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED + +@param winname Name of the window in the window caption that may be used as a window identifier. +@param flags Flags of the window. The supported flags are: (cv::WindowFlags) + */ +CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE); + +/** @brief Destroys the specified window. + +The function destroyWindow destroys the window with the given name. + +@param winname Name of the window to be destroyed. + */ +CV_EXPORTS_W void destroyWindow(const String& winname); + +/** @brief Destroys all of the HighGUI windows. + +The function destroyAllWindows destroys all of the opened HighGUI windows. + */ +CV_EXPORTS_W void destroyAllWindows(); + +CV_EXPORTS_W int startWindowThread(); + +/** @brief Similar to #waitKey, but returns full key code. + +@note Key code is implementation specific and depends on used backend: QT/GTK/Win32/etc + +*/ +CV_EXPORTS_W int waitKeyEx(int delay = 0); + +/** @brief Waits for a pressed key. + +The function waitKey waits for a key event infinitely (when \f$\texttt{delay}\leq 0\f$ ) or for delay +milliseconds, when it is positive. Since the OS has a minimum time between switching threads, the +function will not wait exactly delay ms, it will wait at least delay ms, depending on what else is +running on your computer at that time. It returns the code of the pressed key or -1 if no key was +pressed before the specified time had elapsed. To check for a key press but not wait for it, use +#pollKey. + +@note The functions #waitKey and #pollKey are the only methods in HighGUI that can fetch and handle +GUI events, so one of them needs to be called periodically for normal event processing unless +HighGUI is used within an environment that takes care of event processing. + +@note The function only works if there is at least one HighGUI window created and the window is +active. If there are several HighGUI windows, any of them can be active. + +@param delay Delay in milliseconds. 0 is the special value that means "forever". + */ +CV_EXPORTS_W int waitKey(int delay = 0); + +/** @brief Polls for a pressed key. + +The function pollKey polls for a key event without waiting. It returns the code of the pressed key +or -1 if no key was pressed since the last invocation. To wait until a key was pressed, use #waitKey. + +@note The functions #waitKey and #pollKey are the only methods in HighGUI that can fetch and handle +GUI events, so one of them needs to be called periodically for normal event processing unless +HighGUI is used within an environment that takes care of event processing. + +@note The function only works if there is at least one HighGUI window created and the window is +active. If there are several HighGUI windows, any of them can be active. + */ +CV_EXPORTS_W int pollKey(); + +/** @brief Displays an image in the specified window. + +The function imshow displays an image in the specified window. If the window was created with the +cv::WINDOW_AUTOSIZE flag, the image is shown with its original size, however it is still limited by the screen resolution. +Otherwise, the image is scaled to fit the window. The function may scale the image, depending on its depth: + +- If the image is 8-bit unsigned, it is displayed as is. +- If the image is 16-bit unsigned, the pixels are divided by 256. That is, the + value range [0,255\*256] is mapped to [0,255]. +- If the image is 32-bit or 64-bit floating-point, the pixel values are multiplied by 255. That is, the + value range [0,1] is mapped to [0,255]. +- 32-bit integer images are not processed anymore due to ambiguouty of required transform. + Convert to 8-bit unsigned matrix using a custom preprocessing specific to image's context. + +If window was created with OpenGL support, cv::imshow also support ogl::Buffer , ogl::Texture2D and +cuda::GpuMat as input. + +If the window was not created before this function, it is assumed creating a window with cv::WINDOW_AUTOSIZE. + +If you need to show an image that is bigger than the screen resolution, you will need to call namedWindow("", WINDOW_NORMAL) before the imshow. + +@note This function should be followed by a call to cv::waitKey or cv::pollKey to perform GUI +housekeeping tasks that are necessary to actually show the given image and make the window respond +to mouse and keyboard events. Otherwise, it won't display the image and the window might lock up. +For example, **waitKey(0)** will display the window infinitely until any keypress (it is suitable +for image display). **waitKey(25)** will display a frame and wait approximately 25 ms for a key +press (suitable for displaying a video frame-by-frame). To remove the window, use cv::destroyWindow. + +@note [__Windows Backend Only__] Pressing Ctrl+C will copy the image to the clipboard. Pressing Ctrl+S will show a dialog to save the image. + +@param winname Name of the window. +@param mat Image to be shown. + */ +CV_EXPORTS_W void imshow(const String& winname, InputArray mat); + +/** @brief Resizes the window to the specified size + +@note The specified window size is for the image area. Toolbars are not counted. +Only windows created without cv::WINDOW_AUTOSIZE flag can be resized. + +@param winname Window name. +@param width The new window width. +@param height The new window height. + */ +CV_EXPORTS_W void resizeWindow(const String& winname, int width, int height); + +/** @overload +@param winname Window name. +@param size The new window size. +*/ +CV_EXPORTS_W void resizeWindow(const String& winname, const cv::Size& size); + +/** @brief Moves the window to the specified position + +@param winname Name of the window. +@param x The new x-coordinate of the window. +@param y The new y-coordinate of the window. + */ +CV_EXPORTS_W void moveWindow(const String& winname, int x, int y); + +/** @brief Changes parameters of a window dynamically. + +The function setWindowProperty enables changing properties of a window. + +@param winname Name of the window. +@param prop_id Window property to edit. The supported operation flags are: (cv::WindowPropertyFlags) +@param prop_value New value of the window property. The supported flags are: (cv::WindowFlags) + */ +CV_EXPORTS_W void setWindowProperty(const String& winname, int prop_id, double prop_value); + +/** @brief Updates window title +@param winname Name of the window. +@param title New title. +*/ +CV_EXPORTS_W void setWindowTitle(const String& winname, const String& title); + +/** @brief Provides parameters of a window. + +The function getWindowProperty returns properties of a window. + +@param winname Name of the window. +@param prop_id Window property to retrieve. The following operation flags are available: (cv::WindowPropertyFlags) + +@sa setWindowProperty + */ +CV_EXPORTS_W double getWindowProperty(const String& winname, int prop_id); + +/** @brief Provides rectangle of image in the window. + +The function getWindowImageRect returns the client screen coordinates, width and height of the image rendering area. + +@param winname Name of the window. + +@sa resizeWindow moveWindow + */ +CV_EXPORTS_W Rect getWindowImageRect(const String& winname); + +/** @example samples/cpp/create_mask.cpp +This program demonstrates using mouse events and how to make and use a mask image (black and white) . +*/ +/** @brief Sets mouse handler for the specified window + +@param winname Name of the window. +@param onMouse Callback function for mouse events. See OpenCV samples on how to specify and use the callback. +@param userdata The optional parameter passed to the callback. + */ +CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0); + +/** @brief Gets the mouse-wheel motion delta, when handling mouse-wheel events cv::EVENT_MOUSEWHEEL and +cv::EVENT_MOUSEHWHEEL. + +For regular mice with a scroll-wheel, delta will be a multiple of 120. The value 120 corresponds to +a one notch rotation of the wheel or the threshold for action to be taken and one such action should +occur for each delta. Some high-precision mice with higher-resolution freely-rotating wheels may +generate smaller values. + +For cv::EVENT_MOUSEWHEEL positive and negative values mean forward and backward scrolling, +respectively. For cv::EVENT_MOUSEHWHEEL, where available, positive and negative values mean right and +left scrolling, respectively. + +@note Mouse-wheel events are currently supported only on Windows and Cocoa. + +@param flags The mouse callback flags parameter. + */ +CV_EXPORTS int getMouseWheelDelta(int flags); + +/** @brief Allows users to select a ROI on the given image. + +The function creates a window and allows users to select a ROI using the mouse. +Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect). + +@param windowName name of the window where selection process will be shown. +@param img image to select a ROI. +@param showCrosshair if true crosshair of selection rectangle will be shown. +@param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of +selection rectangle will correspont to the initial mouse position. +@param printNotice if true a notice to select ROI or cancel selection will be printed in console. +@return selected ROI or empty rect if selection canceled. + +@note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...). +After finish of work an empty callback will be set for the used window. + */ +CV_EXPORTS_W Rect selectROI(const String& windowName, InputArray img, bool showCrosshair = true, bool fromCenter = false, bool printNotice = true); + +/** @overload + */ +CV_EXPORTS_W Rect selectROI(InputArray img, bool showCrosshair = true, bool fromCenter = false, bool printNotice = true); + +/** @brief Allows users to select multiple ROIs on the given image. + +The function creates a window and allows users to select multiple ROIs using the mouse. +Controls: use `space` or `enter` to finish current selection and start a new one, +use `esc` to terminate multiple ROI selection process. + +@param windowName name of the window where selection process will be shown. +@param img image to select a ROI. +@param boundingBoxes selected ROIs. +@param showCrosshair if true crosshair of selection rectangle will be shown. +@param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of +selection rectangle will correspont to the initial mouse position. +@param printNotice if true a notice to select ROI or cancel selection will be printed in console. + +@note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...). +After finish of work an empty callback will be set for the used window. + */ +CV_EXPORTS_W void selectROIs(const String& windowName, InputArray img, + CV_OUT std::vector& boundingBoxes, bool showCrosshair = true, bool fromCenter = false, bool printNotice = true); + +/** @brief Creates a trackbar and attaches it to the specified window. + +The function createTrackbar creates a trackbar (a slider or range control) with the specified name +and range, assigns a variable value to be a position synchronized with the trackbar and specifies +the callback function onChange to be called on the trackbar position change. The created trackbar is +displayed in the specified window winname. + +@note [__Qt Backend Only__] winname can be empty if the trackbar should be attached to the +control panel. + +Clicking the label of each trackbar enables editing the trackbar values manually. + +@param trackbarname Name of the created trackbar. +@param winname Name of the window that will be used as a parent of the created trackbar. +@param value Optional pointer to an integer variable whose value reflects the position of the +slider. Upon creation, the slider position is defined by this variable. +@param count Maximal position of the slider. The minimal position is always 0. +@param onChange Pointer to the function to be called every time the slider changes position. This +function should be prototyped as void Foo(int,void\*); , where the first parameter is the trackbar +position and the second parameter is the user data (see the next parameter). If the callback is +the NULL pointer, no callbacks are called, but only value is updated. +@param userdata User data that is passed as is to the callback. It can be used to handle trackbar +events without using global variables. + */ +CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname, + int* value, int count, + TrackbarCallback onChange = 0, + void* userdata = 0); + +/** @brief Returns the trackbar position. + +The function returns the current position of the specified trackbar. + +@note [__Qt Backend Only__] winname can be empty if the trackbar is attached to the control +panel. + +@param trackbarname Name of the trackbar. +@param winname Name of the window that is the parent of the trackbar. + */ +CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname); + +/** @brief Sets the trackbar position. + +The function sets the position of the specified trackbar in the specified window. + +@note [__Qt Backend Only__] winname can be empty if the trackbar is attached to the control +panel. + +@param trackbarname Name of the trackbar. +@param winname Name of the window that is the parent of trackbar. +@param pos New position. + */ +CV_EXPORTS_W void setTrackbarPos(const String& trackbarname, const String& winname, int pos); + +/** @brief Sets the trackbar maximum position. + +The function sets the maximum position of the specified trackbar in the specified window. + +@note [__Qt Backend Only__] winname can be empty if the trackbar is attached to the control +panel. + +@param trackbarname Name of the trackbar. +@param winname Name of the window that is the parent of trackbar. +@param maxval New maximum position. + */ +CV_EXPORTS_W void setTrackbarMax(const String& trackbarname, const String& winname, int maxval); + +/** @brief Sets the trackbar minimum position. + +The function sets the minimum position of the specified trackbar in the specified window. + +@note [__Qt Backend Only__] winname can be empty if the trackbar is attached to the control +panel. + +@param trackbarname Name of the trackbar. +@param winname Name of the window that is the parent of trackbar. +@param minval New minimum position. + */ +CV_EXPORTS_W void setTrackbarMin(const String& trackbarname, const String& winname, int minval); + +//! @addtogroup highgui_opengl OpenGL support +//! @{ + +/** @brief Displays OpenGL 2D texture in the specified window. + +@param winname Name of the window. +@param tex OpenGL 2D texture data. + */ +CV_EXPORTS void imshow(const String& winname, const ogl::Texture2D& tex); + +/** @brief Sets a callback function to be called to draw on top of displayed image. + +The function setOpenGlDrawCallback can be used to draw 3D data on the window. See the example of +callback function below: +@code + void on_opengl(void* param) + { + glLoadIdentity(); + + glTranslated(0.0, 0.0, -1.0); + + glRotatef( 55, 1, 0, 0 ); + glRotatef( 45, 0, 1, 0 ); + glRotatef( 0, 0, 0, 1 ); + + static const int coords[6][4][3] = { + { { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } }, + { { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } }, + { { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } }, + { { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } }, + { { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } }, + { { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } } + }; + + for (int i = 0; i < 6; ++i) { + glColor3ub( i*20, 100+i*10, i*42 ); + glBegin(GL_QUADS); + for (int j = 0; j < 4; ++j) { + glVertex3d(0.2 * coords[i][j][0], 0.2 * coords[i][j][1], 0.2 * coords[i][j][2]); + } + glEnd(); + } + } +@endcode + +@param winname Name of the window. +@param onOpenGlDraw Pointer to the function to be called every frame. This function should be +prototyped as void Foo(void\*) . +@param userdata Pointer passed to the callback function.(__Optional__) + */ +CV_EXPORTS void setOpenGlDrawCallback(const String& winname, OpenGlDrawCallback onOpenGlDraw, void* userdata = 0); + +/** @brief Sets the specified window as current OpenGL context. + +@param winname Name of the window. + */ +CV_EXPORTS void setOpenGlContext(const String& winname); + +/** @brief Force window to redraw its context and call draw callback ( See cv::setOpenGlDrawCallback ). + +@param winname Name of the window. + */ +CV_EXPORTS void updateWindow(const String& winname); + +//! @} highgui_opengl + +//! @addtogroup highgui_qt +//! @{ + +/** @brief QtFont available only for Qt. See cv::fontQt + */ +struct QtFont +{ + const char* nameFont; //!< Name of the font + Scalar color; //!< Color of the font. Scalar(blue_component, green_component, red_component[, alpha_component]) + int font_face; //!< See cv::QtFontStyles + const int* ascii; //!< font data and metrics + const int* greek; + const int* cyrillic; + float hscale, vscale; + float shear; //!< slope coefficient: 0 - normal, >0 - italic + int thickness; //!< See cv::QtFontWeights + float dx; //!< horizontal interval between letters + int line_type; //!< PointSize +}; + +/** @brief Creates the font to draw a text on an image. + +The function fontQt creates a cv::QtFont object. This cv::QtFont is not compatible with putText . + +A basic usage of this function is the following: : +@code + QtFont font = fontQt("Times"); + addText( img1, "Hello World !", Point(50,50), font); +@endcode + +@param nameFont Name of the font. The name should match the name of a system font (such as +*Times*). If the font is not found, a default one is used. +@param pointSize Size of the font. If not specified, equal zero or negative, the point size of the +font is set to a system-dependent default value. Generally, this is 12 points. +@param color Color of the font in BGRA where A = 255 is fully transparent. Use the macro CV_RGB +for simplicity. +@param weight Font weight. Available operation flags are : cv::QtFontWeights You can also specify a positive integer for better control. +@param style Font style. Available operation flags are : cv::QtFontStyles +@param spacing Spacing between characters. It can be negative or positive. + */ +CV_EXPORTS QtFont fontQt(const String& nameFont, int pointSize = -1, + Scalar color = Scalar::all(0), int weight = QT_FONT_NORMAL, + int style = QT_STYLE_NORMAL, int spacing = 0); + +/** @brief Draws a text on the image. + +The function addText draws *text* on the image *img* using a specific font *font* (see example cv::fontQt +) + +@param img 8-bit 3-channel image where the text should be drawn. +@param text Text to write on an image. +@param org Point(x,y) where the text should start on an image. +@param font Font to use to draw a text. + */ +CV_EXPORTS void addText( const Mat& img, const String& text, Point org, const QtFont& font); + +/** @brief Draws a text on the image. + +@param img 8-bit 3-channel image where the text should be drawn. +@param text Text to write on an image. +@param org Point(x,y) where the text should start on an image. +@param nameFont Name of the font. The name should match the name of a system font (such as +*Times*). If the font is not found, a default one is used. +@param pointSize Size of the font. If not specified, equal zero or negative, the point size of the +font is set to a system-dependent default value. Generally, this is 12 points. +@param color Color of the font in BGRA where A = 255 is fully transparent. +@param weight Font weight. Available operation flags are : cv::QtFontWeights You can also specify a positive integer for better control. +@param style Font style. Available operation flags are : cv::QtFontStyles +@param spacing Spacing between characters. It can be negative or positive. + */ +CV_EXPORTS_W void addText(const Mat& img, const String& text, Point org, const String& nameFont, int pointSize = -1, Scalar color = Scalar::all(0), + int weight = QT_FONT_NORMAL, int style = QT_STYLE_NORMAL, int spacing = 0); + +/** @brief Displays a text on a window image as an overlay for a specified duration. + +The function displayOverlay displays useful information/tips on top of the window for a certain +amount of time *delayms*. The function does not modify the image, displayed in the window, that is, +after the specified delay the original content of the window is restored. + +@param winname Name of the window. +@param text Overlay text to write on a window image. +@param delayms The period (in milliseconds), during which the overlay text is displayed. If this +function is called before the previous overlay text timed out, the timer is restarted and the text +is updated. If this value is zero, the text never disappears. + */ +CV_EXPORTS_W void displayOverlay(const String& winname, const String& text, int delayms = 0); + +/** @brief Displays a text on the window statusbar during the specified period of time. + +The function displayStatusBar displays useful information/tips on top of the window for a certain +amount of time *delayms* . This information is displayed on the window statusbar (the window must be +created with the CV_GUI_EXPANDED flags). + +@param winname Name of the window. +@param text Text to write on the window statusbar. +@param delayms Duration (in milliseconds) to display the text. If this function is called before +the previous text timed out, the timer is restarted and the text is updated. If this value is +zero, the text never disappears. + */ +CV_EXPORTS_W void displayStatusBar(const String& winname, const String& text, int delayms = 0); + +/** @brief Saves parameters of the specified window. + +The function saveWindowParameters saves size, location, flags, trackbars value, zoom and panning +location of the window windowName. + +@param windowName Name of the window. + */ +CV_EXPORTS void saveWindowParameters(const String& windowName); + +/** @brief Loads parameters of the specified window. + +The function loadWindowParameters loads size, location, flags, trackbars value, zoom and panning +location of the window windowName. + +@param windowName Name of the window. + */ +CV_EXPORTS void loadWindowParameters(const String& windowName); + +CV_EXPORTS int startLoop(int (*pt2Func)(int argc, char *argv[]), int argc, char* argv[]); + +CV_EXPORTS void stopLoop(); + +/** @brief Attaches a button to the control panel. + +The function createButton attaches a button to the control panel. Each button is added to a +buttonbar to the right of the last button. A new buttonbar is created if nothing was attached to the +control panel before, or if the last element attached to the control panel was a trackbar or if the +QT_NEW_BUTTONBAR flag is added to the type. + +See below various examples of the cv::createButton function call: : +@code + createButton("",callbackButton);//create a push button "button 0", that will call callbackButton. + createButton("button2",callbackButton,NULL,QT_CHECKBOX,0); + createButton("button3",callbackButton,&value); + createButton("button5",callbackButton1,NULL,QT_RADIOBOX); + createButton("button6",callbackButton2,NULL,QT_PUSH_BUTTON,1); + createButton("button6",callbackButton2,NULL,QT_PUSH_BUTTON|QT_NEW_BUTTONBAR);// create a push button in a new row +@endcode + +@param bar_name Name of the button. +@param on_change Pointer to the function to be called every time the button changes its state. +This function should be prototyped as void Foo(int state,\*void); . *state* is the current state +of the button. It could be -1 for a push button, 0 or 1 for a check/radio box button. +@param userdata Pointer passed to the callback function. +@param type Optional type of the button. Available types are: (cv::QtButtonTypes) +@param initial_button_state Default state of the button. Use for checkbox and radiobox. Its +value could be 0 or 1. (__Optional__) +*/ +CV_EXPORTS int createButton( const String& bar_name, ButtonCallback on_change, + void* userdata = 0, int type = QT_PUSH_BUTTON, + bool initial_button_state = false); + +//! @} highgui_qt + +//! @} highgui + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/highgui/highgui.hpp b/Thirdparty/opencv2/include/opencv2/highgui/highgui.hpp new file mode 100644 index 0000000..160c9cf --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/highgui/highgui.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/highgui.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/highgui/highgui_c.h b/Thirdparty/opencv2/include/opencv2/highgui/highgui_c.h new file mode 100644 index 0000000..e508e14 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/highgui/highgui_c.h @@ -0,0 +1,251 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_HIGHGUI_H +#define OPENCV_HIGHGUI_H + +#include "opencv2/core/core_c.h" +#include "opencv2/imgproc/imgproc_c.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup highgui_c + @{ + */ + +/****************************************************************************************\ +* Basic GUI functions * +\****************************************************************************************/ +//YV +//-----------New for Qt +/* For font */ +enum { CV_FONT_LIGHT = 25,//QFont::Light, + CV_FONT_NORMAL = 50,//QFont::Normal, + CV_FONT_DEMIBOLD = 63,//QFont::DemiBold, + CV_FONT_BOLD = 75,//QFont::Bold, + CV_FONT_BLACK = 87 //QFont::Black +}; + +enum { CV_STYLE_NORMAL = 0,//QFont::StyleNormal, + CV_STYLE_ITALIC = 1,//QFont::StyleItalic, + CV_STYLE_OBLIQUE = 2 //QFont::StyleOblique +}; +/* ---------*/ + +//for color cvScalar(blue_component, green_component, red_component[, alpha_component]) +//and alpha= 0 <-> 0xFF (not transparent <-> transparent) +CVAPI(CvFont) cvFontQt(const char* nameFont, int pointSize CV_DEFAULT(-1), CvScalar color CV_DEFAULT(cvScalarAll(0)), int weight CV_DEFAULT(CV_FONT_NORMAL), int style CV_DEFAULT(CV_STYLE_NORMAL), int spacing CV_DEFAULT(0)); + +CVAPI(void) cvAddText(const CvArr* img, const char* text, CvPoint org, CvFont *arg2); + +CVAPI(void) cvDisplayOverlay(const char* name, const char* text, int delayms CV_DEFAULT(0)); +CVAPI(void) cvDisplayStatusBar(const char* name, const char* text, int delayms CV_DEFAULT(0)); + +CVAPI(void) cvSaveWindowParameters(const char* name); +CVAPI(void) cvLoadWindowParameters(const char* name); +CVAPI(int) cvStartLoop(int (*pt2Func)(int argc, char *argv[]), int argc, char* argv[]); +CVAPI(void) cvStopLoop( void ); + +typedef void (CV_CDECL *CvButtonCallback)(int state, void* userdata); +enum {CV_PUSH_BUTTON = 0, CV_CHECKBOX = 1, CV_RADIOBOX = 2}; +CVAPI(int) cvCreateButton( const char* button_name CV_DEFAULT(NULL),CvButtonCallback on_change CV_DEFAULT(NULL), void* userdata CV_DEFAULT(NULL) , int button_type CV_DEFAULT(CV_PUSH_BUTTON), int initial_button_state CV_DEFAULT(0)); +//---------------------- + + +/* this function is used to set some external parameters in case of X Window */ +CVAPI(int) cvInitSystem( int argc, char** argv ); + +CVAPI(int) cvStartWindowThread( void ); + +// --------- YV --------- +enum +{ + //These 3 flags are used by cvSet/GetWindowProperty + CV_WND_PROP_FULLSCREEN = 0, //to change/get window's fullscreen property + CV_WND_PROP_AUTOSIZE = 1, //to change/get window's autosize property + CV_WND_PROP_ASPECTRATIO= 2, //to change/get window's aspectratio property + CV_WND_PROP_OPENGL = 3, //to change/get window's opengl support + CV_WND_PROP_VISIBLE = 4, + + //These 2 flags are used by cvNamedWindow and cvSet/GetWindowProperty + CV_WINDOW_NORMAL = 0x00000000, //the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size + CV_WINDOW_AUTOSIZE = 0x00000001, //the user cannot resize the window, the size is constrainted by the image displayed + CV_WINDOW_OPENGL = 0x00001000, //window with opengl support + + //Those flags are only for Qt + CV_GUI_EXPANDED = 0x00000000, //status bar and tool bar + CV_GUI_NORMAL = 0x00000010, //old fashious way + + //These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty + CV_WINDOW_FULLSCREEN = 1,//change the window to fullscreen + CV_WINDOW_FREERATIO = 0x00000100,//the image expends as much as it can (no ratio constraint) + CV_WINDOW_KEEPRATIO = 0x00000000//the ration image is respected. +}; + +/* create window */ +CVAPI(int) cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) ); + +/* Set and Get Property of the window */ +CVAPI(void) cvSetWindowProperty(const char* name, int prop_id, double prop_value); +CVAPI(double) cvGetWindowProperty(const char* name, int prop_id); + +/* display image within window (highgui windows remember their content) */ +CVAPI(void) cvShowImage( const char* name, const CvArr* image ); + +/* resize/move window */ +CVAPI(void) cvResizeWindow( const char* name, int width, int height ); +CVAPI(void) cvMoveWindow( const char* name, int x, int y ); + + +/* destroy window and all the trackers associated with it */ +CVAPI(void) cvDestroyWindow( const char* name ); + +CVAPI(void) cvDestroyAllWindows(void); + +/* get native window handle (HWND in case of Win32 and Widget in case of X Window) */ +CVAPI(void*) cvGetWindowHandle( const char* name ); + +/* get name of highgui window given its native handle */ +CVAPI(const char*) cvGetWindowName( void* window_handle ); + + +typedef void (CV_CDECL *CvTrackbarCallback)(int pos); + +/* create trackbar and display it on top of given window, set callback */ +CVAPI(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name, + int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL)); + +typedef void (CV_CDECL *CvTrackbarCallback2)(int pos, void* userdata); + +CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name, + int* value, int count, CvTrackbarCallback2 on_change, + void* userdata CV_DEFAULT(0)); + +/* retrieve or set trackbar position */ +CVAPI(int) cvGetTrackbarPos( const char* trackbar_name, const char* window_name ); +CVAPI(void) cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos ); +CVAPI(void) cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval); +CVAPI(void) cvSetTrackbarMin(const char* trackbar_name, const char* window_name, int minval); + +enum +{ + CV_EVENT_MOUSEMOVE =0, + CV_EVENT_LBUTTONDOWN =1, + CV_EVENT_RBUTTONDOWN =2, + CV_EVENT_MBUTTONDOWN =3, + CV_EVENT_LBUTTONUP =4, + CV_EVENT_RBUTTONUP =5, + CV_EVENT_MBUTTONUP =6, + CV_EVENT_LBUTTONDBLCLK =7, + CV_EVENT_RBUTTONDBLCLK =8, + CV_EVENT_MBUTTONDBLCLK =9, + CV_EVENT_MOUSEWHEEL =10, + CV_EVENT_MOUSEHWHEEL =11 +}; + +enum +{ + CV_EVENT_FLAG_LBUTTON =1, + CV_EVENT_FLAG_RBUTTON =2, + CV_EVENT_FLAG_MBUTTON =4, + CV_EVENT_FLAG_CTRLKEY =8, + CV_EVENT_FLAG_SHIFTKEY =16, + CV_EVENT_FLAG_ALTKEY =32 +}; + + +#define CV_GET_WHEEL_DELTA(flags) ((short)((flags >> 16) & 0xffff)) // upper 16 bits + +typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param); + +/* assign callback for mouse events */ +CVAPI(void) cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, + void* param CV_DEFAULT(NULL)); + +/* wait for key event infinitely (delay<=0) or for "delay" milliseconds */ +CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0)); + +// OpenGL support + +typedef void (CV_CDECL *CvOpenGlDrawCallback)(void* userdata); +CVAPI(void) cvSetOpenGlDrawCallback(const char* window_name, CvOpenGlDrawCallback callback, void* userdata CV_DEFAULT(NULL)); + +CVAPI(void) cvSetOpenGlContext(const char* window_name); +CVAPI(void) cvUpdateWindow(const char* window_name); + + +/****************************************************************************************\ + +* Obsolete functions/synonyms * +\****************************************************************************************/ + +#define cvAddSearchPath(path) +#define cvvInitSystem cvInitSystem +#define cvvNamedWindow cvNamedWindow +#define cvvShowImage cvShowImage +#define cvvResizeWindow cvResizeWindow +#define cvvDestroyWindow cvDestroyWindow +#define cvvCreateTrackbar cvCreateTrackbar +#define cvvAddSearchPath cvAddSearchPath +#define cvvWaitKey(name) cvWaitKey(0) +#define cvvWaitKeyEx(name,delay) cvWaitKey(delay) +#define HG_AUTOSIZE CV_WINDOW_AUTOSIZE +#define set_preprocess_func cvSetPreprocessFuncWin32 +#define set_postprocess_func cvSetPostprocessFuncWin32 + +#if defined _WIN32 + +CVAPI(void) cvSetPreprocessFuncWin32_(const void* callback); +CVAPI(void) cvSetPostprocessFuncWin32_(const void* callback); +#define cvSetPreprocessFuncWin32(callback) cvSetPreprocessFuncWin32_((const void*)(callback)) +#define cvSetPostprocessFuncWin32(callback) cvSetPostprocessFuncWin32_((const void*)(callback)) + +#endif + +/** @} highgui_c */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs.hpp b/Thirdparty/opencv2/include/opencv2/imgcodecs.hpp new file mode 100644 index 0000000..2d3bc4e --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs.hpp @@ -0,0 +1,419 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_IMGCODECS_HPP +#define OPENCV_IMGCODECS_HPP + +#include "opencv2/core.hpp" + +/** + @defgroup imgcodecs Image file reading and writing + @{ + @defgroup imgcodecs_c C API + @defgroup imgcodecs_flags Flags used for image file reading and writing + @defgroup imgcodecs_ios iOS glue + @defgroup imgcodecs_macosx MacOS(OSX) glue + @} +*/ + +//////////////////////////////// image codec //////////////////////////////// +namespace cv +{ + +//! @addtogroup imgcodecs +//! @{ + +//! @addtogroup imgcodecs_flags +//! @{ + +//! Imread flags +enum ImreadModes { + IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation. + IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image (codec internal conversion). + IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image. + IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit. + IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format. + IMREAD_LOAD_GDAL = 8, //!< If set, use the gdal driver for loading the image. + IMREAD_REDUCED_GRAYSCALE_2 = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2. + IMREAD_REDUCED_COLOR_2 = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2. + IMREAD_REDUCED_GRAYSCALE_4 = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4. + IMREAD_REDUCED_COLOR_4 = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4. + IMREAD_REDUCED_GRAYSCALE_8 = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8. + IMREAD_REDUCED_COLOR_8 = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8. + IMREAD_IGNORE_ORIENTATION = 128 //!< If set, do not rotate the image according to EXIF's orientation flag. + }; + +//! Imwrite flags +enum ImwriteFlags { + IMWRITE_JPEG_QUALITY = 1, //!< For JPEG, it can be a quality from 0 to 100 (the higher is the better). Default value is 95. + IMWRITE_JPEG_PROGRESSIVE = 2, //!< Enable JPEG features, 0 or 1, default is False. + IMWRITE_JPEG_OPTIMIZE = 3, //!< Enable JPEG features, 0 or 1, default is False. + IMWRITE_JPEG_RST_INTERVAL = 4, //!< JPEG restart interval, 0 - 65535, default is 0 - no restart. + IMWRITE_JPEG_LUMA_QUALITY = 5, //!< Separate luma quality level, 0 - 100, default is -1 - don't use. + IMWRITE_JPEG_CHROMA_QUALITY = 6, //!< Separate chroma quality level, 0 - 100, default is -1 - don't use. + IMWRITE_JPEG_SAMPLING_FACTOR = 7, //!< For JPEG, set sampling factor. See cv::ImwriteJPEGSamplingFactorParams. + IMWRITE_PNG_COMPRESSION = 16, //!< For PNG, it can be the compression level from 0 to 9. A higher value means a smaller size and longer compression time. If specified, strategy is changed to IMWRITE_PNG_STRATEGY_DEFAULT (Z_DEFAULT_STRATEGY). Default value is 1 (best speed setting). + IMWRITE_PNG_STRATEGY = 17, //!< One of cv::ImwritePNGFlags, default is IMWRITE_PNG_STRATEGY_RLE. + IMWRITE_PNG_BILEVEL = 18, //!< Binary level PNG, 0 or 1, default is 0. + IMWRITE_PXM_BINARY = 32, //!< For PPM, PGM, or PBM, it can be a binary format flag, 0 or 1. Default value is 1. + IMWRITE_EXR_TYPE = (3 << 4) + 0 /* 48 */, //!< override EXR storage type (FLOAT (FP32) is default) + IMWRITE_EXR_COMPRESSION = (3 << 4) + 1 /* 49 */, //!< override EXR compression type (ZIP_COMPRESSION = 3 is default) + IMWRITE_EXR_DWA_COMPRESSION_LEVEL = (3 << 4) + 2 /* 50 */, //!< override EXR DWA compression level (45 is default) + IMWRITE_WEBP_QUALITY = 64, //!< For WEBP, it can be a quality from 1 to 100 (the higher is the better). By default (without any parameter) and for quality above 100 the lossless compression is used. + IMWRITE_HDR_COMPRESSION = (5 << 4) + 0 /* 80 */, //!< specify HDR compression + IMWRITE_PAM_TUPLETYPE = 128,//!< For PAM, sets the TUPLETYPE field to the corresponding string value that is defined for the format + IMWRITE_TIFF_RESUNIT = 256,//!< For TIFF, use to specify which DPI resolution unit to set; see libtiff documentation for valid values + IMWRITE_TIFF_XDPI = 257,//!< For TIFF, use to specify the X direction DPI + IMWRITE_TIFF_YDPI = 258,//!< For TIFF, use to specify the Y direction DPI + IMWRITE_TIFF_COMPRESSION = 259,//!< For TIFF, use to specify the image compression scheme. See libtiff for integer constants corresponding to compression formats. Note, for images whose depth is CV_32F, only libtiff's SGILOG compression scheme is used. For other supported depths, the compression scheme can be specified by this flag; LZW compression is the default. + IMWRITE_JPEG2000_COMPRESSION_X1000 = 272,//!< For JPEG2000, use to specify the target compression rate (multiplied by 1000). The value can be from 0 to 1000. Default is 1000. + IMWRITE_AVIF_QUALITY = 512,//!< For AVIF, it can be a quality between 0 and 100 (the higher the better). Default is 95. + IMWRITE_AVIF_DEPTH = 513,//!< For AVIF, it can be 8, 10 or 12. If >8, it is stored/read as CV_32F. Default is 8. + IMWRITE_AVIF_SPEED = 514 //!< For AVIF, it is between 0 (slowest) and (fastest). Default is 9. + }; + +enum ImwriteJPEGSamplingFactorParams { + IMWRITE_JPEG_SAMPLING_FACTOR_411 = 0x411111, //!< 4x1,1x1,1x1 + IMWRITE_JPEG_SAMPLING_FACTOR_420 = 0x221111, //!< 2x2,1x1,1x1(Default) + IMWRITE_JPEG_SAMPLING_FACTOR_422 = 0x211111, //!< 2x1,1x1,1x1 + IMWRITE_JPEG_SAMPLING_FACTOR_440 = 0x121111, //!< 1x2,1x1,1x1 + IMWRITE_JPEG_SAMPLING_FACTOR_444 = 0x111111 //!< 1x1,1x1,1x1(No subsampling) + }; + + +enum ImwriteEXRTypeFlags { + /*IMWRITE_EXR_TYPE_UNIT = 0, //!< not supported */ + IMWRITE_EXR_TYPE_HALF = 1, //!< store as HALF (FP16) + IMWRITE_EXR_TYPE_FLOAT = 2 //!< store as FP32 (default) + }; + +enum ImwriteEXRCompressionFlags { + IMWRITE_EXR_COMPRESSION_NO = 0, //!< no compression + IMWRITE_EXR_COMPRESSION_RLE = 1, //!< run length encoding + IMWRITE_EXR_COMPRESSION_ZIPS = 2, //!< zlib compression, one scan line at a time + IMWRITE_EXR_COMPRESSION_ZIP = 3, //!< zlib compression, in blocks of 16 scan lines + IMWRITE_EXR_COMPRESSION_PIZ = 4, //!< piz-based wavelet compression + IMWRITE_EXR_COMPRESSION_PXR24 = 5, //!< lossy 24-bit float compression + IMWRITE_EXR_COMPRESSION_B44 = 6, //!< lossy 4-by-4 pixel block compression, fixed compression rate + IMWRITE_EXR_COMPRESSION_B44A = 7, //!< lossy 4-by-4 pixel block compression, flat fields are compressed more + IMWRITE_EXR_COMPRESSION_DWAA = 8, //!< lossy DCT based compression, in blocks of 32 scanlines. More efficient for partial buffer access. Supported since OpenEXR 2.2.0. + IMWRITE_EXR_COMPRESSION_DWAB = 9, //!< lossy DCT based compression, in blocks of 256 scanlines. More efficient space wise and faster to decode full frames than DWAA_COMPRESSION. Supported since OpenEXR 2.2.0. + }; + +//! Imwrite PNG specific flags used to tune the compression algorithm. +/** These flags will be modify the way of PNG image compression and will be passed to the underlying zlib processing stage. + +- The effect of IMWRITE_PNG_STRATEGY_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between IMWRITE_PNG_STRATEGY_DEFAULT and IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY. +- IMWRITE_PNG_STRATEGY_RLE is designed to be almost as fast as IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY, but give better compression for PNG image data. +- The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. +- IMWRITE_PNG_STRATEGY_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. +*/ +enum ImwritePNGFlags { + IMWRITE_PNG_STRATEGY_DEFAULT = 0, //!< Use this value for normal data. + IMWRITE_PNG_STRATEGY_FILTERED = 1, //!< Use this value for data produced by a filter (or predictor).Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. + IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY = 2, //!< Use this value to force Huffman encoding only (no string match). + IMWRITE_PNG_STRATEGY_RLE = 3, //!< Use this value to limit match distances to one (run-length encoding). + IMWRITE_PNG_STRATEGY_FIXED = 4 //!< Using this value prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. + }; + +//! Imwrite PAM specific tupletype flags used to define the 'TUPLETYPE' field of a PAM file. +enum ImwritePAMFlags { + IMWRITE_PAM_FORMAT_NULL = 0, + IMWRITE_PAM_FORMAT_BLACKANDWHITE = 1, + IMWRITE_PAM_FORMAT_GRAYSCALE = 2, + IMWRITE_PAM_FORMAT_GRAYSCALE_ALPHA = 3, + IMWRITE_PAM_FORMAT_RGB = 4, + IMWRITE_PAM_FORMAT_RGB_ALPHA = 5 + }; + +//! Imwrite HDR specific values for IMWRITE_HDR_COMPRESSION parameter key +enum ImwriteHDRCompressionFlags { + IMWRITE_HDR_COMPRESSION_NONE = 0, + IMWRITE_HDR_COMPRESSION_RLE = 1 +}; + +//! @} imgcodecs_flags + +/** @brief Loads an image from a file. + +@anchor imread + +The function imread loads an image from the specified file and returns it. If the image cannot be +read (because of missing file, improper permissions, unsupported or invalid format), the function +returns an empty matrix ( Mat::data==NULL ). + +Currently, the following file formats are supported: + +- Windows bitmaps - \*.bmp, \*.dib (always supported) +- JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Note* section) +- JPEG 2000 files - \*.jp2 (see the *Note* section) +- Portable Network Graphics - \*.png (see the *Note* section) +- WebP - \*.webp (see the *Note* section) +- AVIF - \*.avif (see the *Note* section) +- Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported) +- PFM files - \*.pfm (see the *Note* section) +- Sun rasters - \*.sr, \*.ras (always supported) +- TIFF files - \*.tiff, \*.tif (see the *Note* section) +- OpenEXR Image files - \*.exr (see the *Note* section) +- Radiance HDR - \*.hdr, \*.pic (always supported) +- Raster and Vector geospatial data supported by GDAL (see the *Note* section) + +@note +- The function determines the type of an image by the content, not by the file extension. +- In the case of color images, the decoded images will have the channels stored in **B G R** order. +- When using IMREAD_GRAYSCALE, the codec's internal grayscale conversion will be used, if available. + Results may differ to the output of cvtColor() +- On Microsoft Windows\* OS and MacOSX\*, the codecs shipped with an OpenCV image (libjpeg, + libpng, libtiff, and libjasper) are used by default. So, OpenCV can always read JPEGs, PNGs, + and TIFFs. On MacOSX, there is also an option to use native MacOSX image readers. But beware + that currently these native image loaders give images with different pixel values because of + the color management embedded into MacOSX. +- On Linux\*, BSD flavors and other Unix-like open-source operating systems, OpenCV looks for + codecs supplied with an OS image. Install the relevant packages (do not forget the development + files, for example, "libjpeg-dev", in Debian\* and Ubuntu\*) to get the codec support or turn + on the OPENCV_BUILD_3RDPARTY_LIBS flag in CMake. +- In the case you set *WITH_GDAL* flag to true in CMake and @ref IMREAD_LOAD_GDAL to load the image, + then the [GDAL](http://www.gdal.org) driver will be used in order to decode the image, supporting + the following formats: [Raster](http://www.gdal.org/formats_list.html), + [Vector](http://www.gdal.org/ogr_formats.html). +- If EXIF information is embedded in the image file, the EXIF orientation will be taken into account + and thus the image will be rotated accordingly except if the flags @ref IMREAD_IGNORE_ORIENTATION + or @ref IMREAD_UNCHANGED are passed. +- Use the IMREAD_UNCHANGED flag to keep the floating point values from PFM image. +- By default number of pixels must be less than 2^30. Limit can be set using system + variable OPENCV_IO_MAX_IMAGE_PIXELS + +@param filename Name of file to be loaded. +@param flags Flag that can take values of cv::ImreadModes +*/ +CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR ); + +/** @brief Loads a multi-page image from a file. + +The function imreadmulti loads a multi-page image from the specified file into a vector of Mat objects. +@param filename Name of file to be loaded. +@param mats A vector of Mat objects holding each page. +@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR. +@sa cv::imread +*/ +CV_EXPORTS_W bool imreadmulti(const String& filename, CV_OUT std::vector& mats, int flags = IMREAD_ANYCOLOR); + +/** @brief Loads a of images of a multi-page image from a file. + +The function imreadmulti loads a specified range from a multi-page image from the specified file into a vector of Mat objects. +@param filename Name of file to be loaded. +@param mats A vector of Mat objects holding each page. +@param start Start index of the image to load +@param count Count number of images to load +@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR. +@sa cv::imread +*/ +CV_EXPORTS_W bool imreadmulti(const String& filename, CV_OUT std::vector& mats, int start, int count, int flags = IMREAD_ANYCOLOR); + +/** @brief Returns the number of images inside the give file + +The function imcount will return the number of pages in a multi-page image, or 1 for single-page images +@param filename Name of file to be loaded. +@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR. +*/ +CV_EXPORTS_W size_t imcount(const String& filename, int flags = IMREAD_ANYCOLOR); + +/** @brief Saves an image to a specified file. + +The function imwrite saves the image to the specified file. The image format is chosen based on the +filename extension (see cv::imread for the list of extensions). In general, only 8-bit unsigned (CV_8U) +single-channel or 3-channel (with 'BGR' channel order) images +can be saved using this function, with these exceptions: + +- With OpenEXR encoder, only 32-bit float (CV_32F) images can be saved. + - 8-bit unsigned (CV_8U) images are not supported. +- With Radiance HDR encoder, non 64-bit float (CV_64F) images can be saved. + - All images will be converted to 32-bit float (CV_32F). +- With JPEG 2000 encoder, 8-bit unsigned (CV_8U) and 16-bit unsigned (CV_16U) images can be saved. +- With PAM encoder, 8-bit unsigned (CV_8U) and 16-bit unsigned (CV_16U) images can be saved. +- With PNG encoder, 8-bit unsigned (CV_8U) and 16-bit unsigned (CV_16U) images can be saved. + - PNG images with an alpha channel can be saved using this function. To do this, create + 8-bit (or 16-bit) 4-channel image BGRA, where the alpha channel goes last. Fully transparent pixels + should have alpha set to 0, fully opaque pixels should have alpha set to 255/65535 (see the code sample below). +- With PGM/PPM encoder, 8-bit unsigned (CV_8U) and 16-bit unsigned (CV_16U) images can be saved. +- With TIFF encoder, 8-bit unsigned (CV_8U), 16-bit unsigned (CV_16U), + 32-bit float (CV_32F) and 64-bit float (CV_64F) images can be saved. + - Multiple images (vector of Mat) can be saved in TIFF format (see the code sample below). + - 32-bit float 3-channel (CV_32FC3) TIFF images will be saved + using the LogLuv high dynamic range encoding (4 bytes per pixel) + +If the image format is not supported, the image will be converted to 8-bit unsigned (CV_8U) and saved that way. + +If the format, depth or channel order is different, use +Mat::convertTo and cv::cvtColor to convert it before saving. Or, use the universal FileStorage I/O +functions to save the image to XML or YAML format. + +The sample below shows how to create a BGRA image, how to set custom compression parameters and save it to a PNG file. +It also demonstrates how to save multiple images in a TIFF file: +@include snippets/imgcodecs_imwrite.cpp +@param filename Name of the file. +@param img (Mat or vector of Mat) Image or Images to be saved. +@param params Format-specific parameters encoded as pairs (paramId_1, paramValue_1, paramId_2, paramValue_2, ... .) see cv::ImwriteFlags +*/ +CV_EXPORTS_W bool imwrite( const String& filename, InputArray img, + const std::vector& params = std::vector()); + +/// @overload multi-image overload for bindings +CV_WRAP static inline +bool imwritemulti(const String& filename, InputArrayOfArrays img, + const std::vector& params = std::vector()) +{ + return imwrite(filename, img, params); +} + +/** @brief Reads an image from a buffer in memory. + +The function imdecode reads an image from the specified buffer in the memory. If the buffer is too short or +contains invalid data, the function returns an empty matrix ( Mat::data==NULL ). + +See cv::imread for the list of supported formats and flags description. + +@note In the case of color images, the decoded images will have the channels stored in **B G R** order. +@param buf Input array or vector of bytes. +@param flags The same flags as in cv::imread, see cv::ImreadModes. +*/ +CV_EXPORTS_W Mat imdecode( InputArray buf, int flags ); + +/** @overload +@param buf Input array or vector of bytes. +@param flags The same flags as in cv::imread, see cv::ImreadModes. +@param dst The optional output placeholder for the decoded matrix. It can save the image +reallocations when the function is called repeatedly for images of the same size. +*/ +CV_EXPORTS Mat imdecode( InputArray buf, int flags, Mat* dst); + +/** @brief Reads a multi-page image from a buffer in memory. + +The function imdecodemulti reads a multi-page image from the specified buffer in the memory. If the buffer is too short or +contains invalid data, the function returns false. + +See cv::imreadmulti for the list of supported formats and flags description. + +@note In the case of color images, the decoded images will have the channels stored in **B G R** order. +@param buf Input array or vector of bytes. +@param flags The same flags as in cv::imread, see cv::ImreadModes. +@param mats A vector of Mat objects holding each page, if more than one. +*/ +CV_EXPORTS_W bool imdecodemulti(InputArray buf, int flags, CV_OUT std::vector& mats); + +/** @brief Encodes an image into a memory buffer. + +The function imencode compresses the image and stores it in the memory buffer that is resized to fit the +result. See cv::imwrite for the list of supported formats and flags description. + +@param ext File extension that defines the output format. Must include a leading period. +@param img Image to be written. +@param buf Output buffer resized to fit the compressed image. +@param params Format-specific parameters. See cv::imwrite and cv::ImwriteFlags. +*/ +CV_EXPORTS_W bool imencode( const String& ext, InputArray img, + CV_OUT std::vector& buf, + const std::vector& params = std::vector()); + +/** @brief Returns true if the specified image can be decoded by OpenCV + +@param filename File name of the image +*/ +CV_EXPORTS_W bool haveImageReader( const String& filename ); + +/** @brief Returns true if an image with the specified filename can be encoded by OpenCV + + @param filename File name of the image + */ +CV_EXPORTS_W bool haveImageWriter( const String& filename ); + +/** @brief To read Multi Page images on demand + +The ImageCollection class provides iterator API to read multi page images on demand. Create iterator +to the collection of the images and iterate over the collection. Decode the necessary page with operator*. + +The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page, +then the time Complexity is O(n) because the collection has to be reinitialized every time in order to go to the correct page. +However, the intermediate pages are not decoded during the process, so typically it's quite fast. +This is required because multipage codecs does not support going backwards. +After decoding the one page, it is stored inside the collection cache. Hence, trying to get Mat object from already decoded page is O(1). +If you need memory, you can use .releaseCache() method to release cached index. +The space complexity is O(n) if all pages are decoded into memory. The user is able to decode and release images on demand. +*/ +class CV_EXPORTS ImageCollection { +public: + struct CV_EXPORTS iterator { + iterator(ImageCollection* col); + iterator(ImageCollection* col, int end); + Mat& operator*(); + Mat* operator->(); + iterator& operator++(); + iterator operator++(int); + friend bool operator== (const iterator& a, const iterator& b) { return a.m_curr == b.m_curr; } + friend bool operator!= (const iterator& a, const iterator& b) { return a.m_curr != b.m_curr; } + + private: + ImageCollection* m_pCollection; + int m_curr; + }; + + ImageCollection(); + ImageCollection(const String& filename, int flags); + void init(const String& img, int flags); + size_t size() const; + const Mat& at(int index); + const Mat& operator[](int index); + void releaseCache(int index); + iterator begin(); + iterator end(); + + class Impl; + Ptr getImpl(); +protected: + Ptr pImpl; +}; + +//! @} imgcodecs + +} // cv + +#endif //OPENCV_IMGCODECS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs.hpp b/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs.hpp new file mode 100644 index 0000000..a3cd232 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/imgcodecs.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs_c.h b/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs_c.h new file mode 100644 index 0000000..c78b3f7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs/imgcodecs_c.h @@ -0,0 +1 @@ +#error "This header with legacy C API declarations has been removed from OpenCV. Legacy constants are available from legacy/constants_c.h file." diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs/ios.h b/Thirdparty/opencv2/include/opencv2/imgcodecs/ios.h new file mode 100644 index 0000000..5f17218 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs/ios.h @@ -0,0 +1,59 @@ + +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#import +#import +#import +#import +#include "opencv2/core.hpp" + +//! @addtogroup imgcodecs_ios +//! @{ + +CV_EXPORTS CGImageRef MatToCGImage(const cv::Mat& image) CF_RETURNS_RETAINED; +CV_EXPORTS void CGImageToMat(const CGImageRef image, cv::Mat& m, bool alphaExist = false); +CV_EXPORTS UIImage* MatToUIImage(const cv::Mat& image); +CV_EXPORTS void UIImageToMat(const UIImage* image, + cv::Mat& m, bool alphaExist = false); + +//! @} diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs/legacy/constants_c.h b/Thirdparty/opencv2/include/opencv2/imgcodecs/legacy/constants_c.h new file mode 100644 index 0000000..de7be4f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs/legacy/constants_c.h @@ -0,0 +1,54 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_IMGCODECS_LEGACY_CONSTANTS_H +#define OPENCV_IMGCODECS_LEGACY_CONSTANTS_H + +/* duplicate of "ImreadModes" enumeration for better compatibility with OpenCV 3.x */ +enum +{ +/* 8bit, color or not */ + CV_LOAD_IMAGE_UNCHANGED =-1, +/* 8bit, gray */ + CV_LOAD_IMAGE_GRAYSCALE =0, +/* ?, color */ + CV_LOAD_IMAGE_COLOR =1, +/* any depth, ? */ + CV_LOAD_IMAGE_ANYDEPTH =2, +/* ?, any color */ + CV_LOAD_IMAGE_ANYCOLOR =4, +/* ?, no rotate */ + CV_LOAD_IMAGE_IGNORE_ORIENTATION =128 +}; + +/* duplicate of "ImwriteFlags" enumeration for better compatibility with OpenCV 3.x */ +enum +{ + CV_IMWRITE_JPEG_QUALITY =1, + CV_IMWRITE_JPEG_PROGRESSIVE =2, + CV_IMWRITE_JPEG_OPTIMIZE =3, + CV_IMWRITE_JPEG_RST_INTERVAL =4, + CV_IMWRITE_JPEG_LUMA_QUALITY =5, + CV_IMWRITE_JPEG_CHROMA_QUALITY =6, + CV_IMWRITE_PNG_COMPRESSION =16, + CV_IMWRITE_PNG_STRATEGY =17, + CV_IMWRITE_PNG_BILEVEL =18, + CV_IMWRITE_PNG_STRATEGY_DEFAULT =0, + CV_IMWRITE_PNG_STRATEGY_FILTERED =1, + CV_IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2, + CV_IMWRITE_PNG_STRATEGY_RLE =3, + CV_IMWRITE_PNG_STRATEGY_FIXED =4, + CV_IMWRITE_PXM_BINARY =32, + CV_IMWRITE_EXR_TYPE = 48, + CV_IMWRITE_WEBP_QUALITY =64, + CV_IMWRITE_PAM_TUPLETYPE = 128, + CV_IMWRITE_PAM_FORMAT_NULL = 0, + CV_IMWRITE_PAM_FORMAT_BLACKANDWHITE = 1, + CV_IMWRITE_PAM_FORMAT_GRAYSCALE = 2, + CV_IMWRITE_PAM_FORMAT_GRAYSCALE_ALPHA = 3, + CV_IMWRITE_PAM_FORMAT_RGB = 4, + CV_IMWRITE_PAM_FORMAT_RGB_ALPHA = 5, +}; + +#endif // OPENCV_IMGCODECS_LEGACY_CONSTANTS_H diff --git a/Thirdparty/opencv2/include/opencv2/imgcodecs/macosx.h b/Thirdparty/opencv2/include/opencv2/imgcodecs/macosx.h new file mode 100644 index 0000000..cfb0770 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgcodecs/macosx.h @@ -0,0 +1,20 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#if !defined(__APPLE__) || !defined(__MACH__) +#error This header should be used in macOS ObjC/Swift projects. +#endif + +#import +#include "opencv2/core.hpp" + +//! @addtogroup imgcodecs_macosx +//! @{ + +CV_EXPORTS CGImageRef MatToCGImage(const cv::Mat& image) CF_RETURNS_RETAINED; +CV_EXPORTS void CGImageToMat(const CGImageRef image, cv::Mat& m, bool alphaExist = false); +CV_EXPORTS NSImage* MatToNSImage(const cv::Mat& image); +CV_EXPORTS void NSImageToMat(const NSImage* image, cv::Mat& m, bool alphaExist = false); + +//! @} diff --git a/Thirdparty/opencv2/include/opencv2/imgproc.hpp b/Thirdparty/opencv2/include/opencv2/imgproc.hpp new file mode 100644 index 0000000..951f59b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc.hpp @@ -0,0 +1,5069 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_IMGPROC_HPP +#define OPENCV_IMGPROC_HPP + +#include "opencv2/core.hpp" + +/** + @defgroup imgproc Image Processing + +This module includes image-processing functions. + + @{ + @defgroup imgproc_filter Image Filtering + +Functions and classes described in this section are used to perform various linear or non-linear +filtering operations on 2D images (represented as Mat's). It means that for each pixel location +\f$(x,y)\f$ in the source image (normally, rectangular), its neighborhood is considered and used to +compute the response. In case of a linear filter, it is a weighted sum of pixel values. In case of +morphological operations, it is the minimum or maximum values, and so on. The computed response is +stored in the destination image at the same location \f$(x,y)\f$. It means that the output image +will be of the same size as the input image. Normally, the functions support multi-channel arrays, +in which case every channel is processed independently. Therefore, the output image will also have +the same number of channels as the input one. + +Another common feature of the functions and classes described in this section is that, unlike +simple arithmetic functions, they need to extrapolate values of some non-existing pixels. For +example, if you want to smooth an image using a Gaussian \f$3 \times 3\f$ filter, then, when +processing the left-most pixels in each row, you need pixels to the left of them, that is, outside +of the image. You can let these pixels be the same as the left-most image pixels ("replicated +border" extrapolation method), or assume that all the non-existing pixels are zeros ("constant +border" extrapolation method), and so on. OpenCV enables you to specify the extrapolation method. +For details, see #BorderTypes + +@anchor filter_depths +### Depth combinations +Input depth (src.depth()) | Output depth (ddepth) +--------------------------|---------------------- +CV_8U | -1/CV_16S/CV_32F/CV_64F +CV_16U/CV_16S | -1/CV_32F/CV_64F +CV_32F | -1/CV_32F +CV_64F | -1/CV_64F + +@note when ddepth=-1, the output image will have the same depth as the source. + +@note if you need double floating-point accuracy and using single floating-point input data +(CV_32F input and CV_64F output depth combination), you can use @ref Mat.convertTo to convert +the input data to the desired precision. + + @defgroup imgproc_transform Geometric Image Transformations + +The functions in this section perform various geometrical transformations of 2D images. They do not +change the image content but deform the pixel grid and map this deformed grid to the destination +image. In fact, to avoid sampling artifacts, the mapping is done in the reverse order, from +destination to the source. That is, for each pixel \f$(x, y)\f$ of the destination image, the +functions compute coordinates of the corresponding "donor" pixel in the source image and copy the +pixel value: + +\f[\texttt{dst} (x,y)= \texttt{src} (f_x(x,y), f_y(x,y))\f] + +In case when you specify the forward mapping \f$\left: \texttt{src} \rightarrow +\texttt{dst}\f$, the OpenCV functions first compute the corresponding inverse mapping +\f$\left: \texttt{dst} \rightarrow \texttt{src}\f$ and then use the above formula. + +The actual implementations of the geometrical transformations, from the most generic remap and to +the simplest and the fastest resize, need to solve two main problems with the above formula: + +- Extrapolation of non-existing pixels. Similarly to the filtering functions described in the +previous section, for some \f$(x,y)\f$, either one of \f$f_x(x,y)\f$, or \f$f_y(x,y)\f$, or both +of them may fall outside of the image. In this case, an extrapolation method needs to be used. +OpenCV provides the same selection of extrapolation methods as in the filtering functions. In +addition, it provides the method #BORDER_TRANSPARENT. This means that the corresponding pixels in +the destination image will not be modified at all. + +- Interpolation of pixel values. Usually \f$f_x(x,y)\f$ and \f$f_y(x,y)\f$ are floating-point +numbers. This means that \f$\left\f$ can be either an affine or perspective +transformation, or radial lens distortion correction, and so on. So, a pixel value at fractional +coordinates needs to be retrieved. In the simplest case, the coordinates can be just rounded to the +nearest integer coordinates and the corresponding pixel can be used. This is called a +nearest-neighbor interpolation. However, a better result can be achieved by using more +sophisticated [interpolation methods](http://en.wikipedia.org/wiki/Multivariate_interpolation) , +where a polynomial function is fit into some neighborhood of the computed pixel \f$(f_x(x,y), +f_y(x,y))\f$, and then the value of the polynomial at \f$(f_x(x,y), f_y(x,y))\f$ is taken as the +interpolated pixel value. In OpenCV, you can choose between several interpolation methods. See +#resize for details. + +@note The geometrical transformations do not work with `CV_8S` or `CV_32S` images. + + @defgroup imgproc_misc Miscellaneous Image Transformations + @defgroup imgproc_draw Drawing Functions + +Drawing functions work with matrices/images of arbitrary depth. The boundaries of the shapes can be +rendered with antialiasing (implemented only for 8-bit images for now). All the functions include +the parameter color that uses an RGB value (that may be constructed with the Scalar constructor ) +for color images and brightness for grayscale images. For color images, the channel ordering is +normally *Blue, Green, Red*. This is what imshow, imread, and imwrite expect. So, if you form a +color using the Scalar constructor, it should look like: + +\f[\texttt{Scalar} (blue \_ component, green \_ component, red \_ component[, alpha \_ component])\f] + +If you are using your own image rendering and I/O functions, you can use any channel ordering. The +drawing functions process each channel independently and do not depend on the channel order or even +on the used color space. The whole image can be converted from BGR to RGB or to a different color +space using cvtColor . + +If a drawn figure is partially or completely outside the image, the drawing functions clip it. Also, +many drawing functions can handle pixel coordinates specified with sub-pixel accuracy. This means +that the coordinates can be passed as fixed-point numbers encoded as integers. The number of +fractional bits is specified by the shift parameter and the real point coordinates are calculated as +\f$\texttt{Point}(x,y)\rightarrow\texttt{Point2f}(x*2^{-shift},y*2^{-shift})\f$ . This feature is +especially effective when rendering antialiased shapes. + +@note The functions do not support alpha-transparency when the target image is 4-channel. In this +case, the color[3] is simply copied to the repainted pixels. Thus, if you want to paint +semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main +image. + + @defgroup imgproc_color_conversions Color Space Conversions + @defgroup imgproc_colormap ColorMaps in OpenCV + +The human perception isn't built for observing fine changes in grayscale images. Human eyes are more +sensitive to observing changes between colors, so you often need to recolor your grayscale images to +get a clue about them. OpenCV now comes with various colormaps to enhance the visualization in your +computer vision application. + +In OpenCV you only need applyColorMap to apply a colormap on a given image. The following sample +code reads the path to an image from command line, applies a Jet colormap on it and shows the +result: + +@include snippets/imgproc_applyColorMap.cpp + +@see #ColormapTypes + + @defgroup imgproc_subdiv2d Planar Subdivision + +The Subdiv2D class described in this section is used to perform various planar subdivision on +a set of 2D points (represented as vector of Point2f). OpenCV subdivides a plane into triangles +using the Delaunay's algorithm, which corresponds to the dual graph of the Voronoi diagram. +In the figure below, the Delaunay's triangulation is marked with black lines and the Voronoi +diagram with red lines. + +![Delaunay triangulation (black) and Voronoi (red)](pics/delaunay_voronoi.png) + +The subdivisions can be used for the 3D piece-wise transformation of a plane, morphing, fast +location of points on the plane, building special graphs (such as NNG,RNG), and so forth. + + @defgroup imgproc_hist Histograms + @defgroup imgproc_shape Structural Analysis and Shape Descriptors + @defgroup imgproc_motion Motion Analysis and Object Tracking + @defgroup imgproc_feature Feature Detection + @defgroup imgproc_object Object Detection + @defgroup imgproc_segmentation Image Segmentation + @defgroup imgproc_c C API + @defgroup imgproc_hal Hardware Acceleration Layer + @{ + @defgroup imgproc_hal_functions Functions + @defgroup imgproc_hal_interface Interface + @} + @} +*/ + +namespace cv +{ + +/** @addtogroup imgproc +@{ +*/ + +//! @addtogroup imgproc_filter +//! @{ + +enum SpecialFilter { + FILTER_SCHARR = -1 +}; + +//! type of morphological operation +enum MorphTypes{ + MORPH_ERODE = 0, //!< see #erode + MORPH_DILATE = 1, //!< see #dilate + MORPH_OPEN = 2, //!< an opening operation + //!< \f[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))\f] + MORPH_CLOSE = 3, //!< a closing operation + //!< \f[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))\f] + MORPH_GRADIENT = 4, //!< a morphological gradient + //!< \f[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )\f] + MORPH_TOPHAT = 5, //!< "top hat" + //!< \f[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )\f] + MORPH_BLACKHAT = 6, //!< "black hat" + //!< \f[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}\f] + MORPH_HITMISS = 7 //!< "hit or miss" + //!< .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation +}; + +//! shape of the structuring element +enum MorphShapes { + MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f] + MORPH_CROSS = 1, //!< a cross-shaped structuring element: + //!< \f[E_{ij} = \begin{cases} 1 & \texttt{if } {i=\texttt{anchor.y } {or } {j=\texttt{anchor.x}}} \\0 & \texttt{otherwise} \end{cases}\f] + MORPH_ELLIPSE = 2 //!< an elliptic structuring element, that is, a filled ellipse inscribed + //!< into the rectangle Rect(0, 0, esize.width, 0.esize.height) +}; + +//! @} imgproc_filter + +//! @addtogroup imgproc_transform +//! @{ + +//! interpolation algorithm +enum InterpolationFlags{ + /** nearest neighbor interpolation */ + INTER_NEAREST = 0, + /** bilinear interpolation */ + INTER_LINEAR = 1, + /** bicubic interpolation */ + INTER_CUBIC = 2, + /** resampling using pixel area relation. It may be a preferred method for image decimation, as + it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST + method. */ + INTER_AREA = 3, + /** Lanczos interpolation over 8x8 neighborhood */ + INTER_LANCZOS4 = 4, + /** Bit exact bilinear interpolation */ + INTER_LINEAR_EXACT = 5, + /** Bit exact nearest neighbor interpolation. This will produce same results as + the nearest neighbor method in PIL, scikit-image or Matlab. */ + INTER_NEAREST_EXACT = 6, + /** mask for interpolation codes */ + INTER_MAX = 7, + /** flag, fills all of the destination image pixels. If some of them correspond to outliers in the + source image, they are set to zero */ + WARP_FILL_OUTLIERS = 8, + /** flag, inverse transformation + + For example, #linearPolar or #logPolar transforms: + - flag is __not__ set: \f$dst( \rho , \phi ) = src(x,y)\f$ + - flag is set: \f$dst(x,y) = src( \rho , \phi )\f$ + */ + WARP_INVERSE_MAP = 16 +}; + +/** \brief Specify the polar mapping mode +@sa warpPolar +*/ +enum WarpPolarMode +{ + WARP_POLAR_LINEAR = 0, ///< Remaps an image to/from polar space. + WARP_POLAR_LOG = 256 ///< Remaps an image to/from semilog-polar space. +}; + +enum InterpolationMasks { + INTER_BITS = 5, + INTER_BITS2 = INTER_BITS * 2, + INTER_TAB_SIZE = 1 << INTER_BITS, + INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE + }; + +//! @} imgproc_transform + +//! @addtogroup imgproc_misc +//! @{ + +//! Distance types for Distance Transform and M-estimators +//! @see distanceTransform, fitLine +enum DistanceTypes { + DIST_USER = -1, //!< User defined distance + DIST_L1 = 1, //!< distance = |x1-x2| + |y1-y2| + DIST_L2 = 2, //!< the simple euclidean distance + DIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|) + DIST_L12 = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) + DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 + DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 + DIST_HUBER = 7 //!< distance = |x| \texttt{thresh}\)}{0}{otherwise}\f] + THRESH_BINARY_INV = 1, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxval}}{otherwise}\f] + THRESH_TRUNC = 2, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] + THRESH_TOZERO = 3, //!< \f[\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\f] + THRESH_TOZERO_INV = 4, //!< \f[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\f] + THRESH_MASK = 7, + THRESH_OTSU = 8, //!< flag, use Otsu algorithm to choose the optimal threshold value + THRESH_TRIANGLE = 16 //!< flag, use Triangle algorithm to choose the optimal threshold value +}; + +//! adaptive threshold algorithm +//! @see adaptiveThreshold +enum AdaptiveThresholdTypes { + /** the threshold value \f$T(x,y)\f$ is a mean of the \f$\texttt{blockSize} \times + \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ minus C */ + ADAPTIVE_THRESH_MEAN_C = 0, + /** the threshold value \f$T(x, y)\f$ is a weighted sum (cross-correlation with a Gaussian + window) of the \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ + minus C . The default sigma (standard deviation) is used for the specified blockSize . See + #getGaussianKernel*/ + ADAPTIVE_THRESH_GAUSSIAN_C = 1 +}; + +//! class of the pixel in GrabCut algorithm +enum GrabCutClasses { + GC_BGD = 0, //!< an obvious background pixels + GC_FGD = 1, //!< an obvious foreground (object) pixel + GC_PR_BGD = 2, //!< a possible background pixel + GC_PR_FGD = 3 //!< a possible foreground pixel +}; + +//! GrabCut algorithm flags +enum GrabCutModes { + /** The function initializes the state and the mask using the provided rectangle. After that it + runs iterCount iterations of the algorithm. */ + GC_INIT_WITH_RECT = 0, + /** The function initializes the state using the provided mask. Note that GC_INIT_WITH_RECT + and GC_INIT_WITH_MASK can be combined. Then, all the pixels outside of the ROI are + automatically initialized with GC_BGD .*/ + GC_INIT_WITH_MASK = 1, + /** The value means that the algorithm should just resume. */ + GC_EVAL = 2, + /** The value means that the algorithm should just run the grabCut algorithm (a single iteration) with the fixed model */ + GC_EVAL_FREEZE_MODEL = 3 +}; + +//! distanceTransform algorithm flags +enum DistanceTransformLabelTypes { + /** each connected component of zeros in src (as well as all the non-zero pixels closest to the + connected component) will be assigned the same label */ + DIST_LABEL_CCOMP = 0, + /** each zero pixel (and all the non-zero pixels closest to it) gets its own label. */ + DIST_LABEL_PIXEL = 1 +}; + +//! floodfill algorithm flags +enum FloodFillFlags { + /** If set, the difference between the current pixel and seed pixel is considered. Otherwise, + the difference between neighbor pixels is considered (that is, the range is floating). */ + FLOODFILL_FIXED_RANGE = 1 << 16, + /** If set, the function does not change the image ( newVal is ignored), and only fills the + mask with the value specified in bits 8-16 of flags as described above. This option only make + sense in function variants that have the mask parameter. */ + FLOODFILL_MASK_ONLY = 1 << 17 +}; + +//! @} imgproc_misc + +//! @addtogroup imgproc_shape +//! @{ + +//! connected components statistics +enum ConnectedComponentsTypes { + CC_STAT_LEFT = 0, //!< The leftmost (x) coordinate which is the inclusive start of the bounding + //!< box in the horizontal direction. + CC_STAT_TOP = 1, //!< The topmost (y) coordinate which is the inclusive start of the bounding + //!< box in the vertical direction. + CC_STAT_WIDTH = 2, //!< The horizontal size of the bounding box + CC_STAT_HEIGHT = 3, //!< The vertical size of the bounding box + CC_STAT_AREA = 4, //!< The total area (in pixels) of the connected component +#ifndef CV_DOXYGEN + CC_STAT_MAX = 5 //!< Max enumeration value. Used internally only for memory allocation +#endif +}; + +//! connected components algorithm +enum ConnectedComponentsAlgorithmsTypes { + CCL_DEFAULT = -1, //!< Spaghetti @cite Bolelli2019 algorithm for 8-way connectivity, Spaghetti4C @cite Bolelli2021 algorithm for 4-way connectivity. + CCL_WU = 0, //!< SAUF @cite Wu2009 algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for SAUF. + CCL_GRANA = 1, //!< BBDT @cite Grana2010 algorithm for 8-way connectivity, SAUF algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for both BBDT and SAUF. + CCL_BOLELLI = 2, //!< Spaghetti @cite Bolelli2019 algorithm for 8-way connectivity, Spaghetti4C @cite Bolelli2021 algorithm for 4-way connectivity. The parallel implementation described in @cite Bolelli2017 is available for both Spaghetti and Spaghetti4C. + CCL_SAUF = 3, //!< Same as CCL_WU. It is preferable to use the flag with the name of the algorithm (CCL_SAUF) rather than the one with the name of the first author (CCL_WU). + CCL_BBDT = 4, //!< Same as CCL_GRANA. It is preferable to use the flag with the name of the algorithm (CCL_BBDT) rather than the one with the name of the first author (CCL_GRANA). + CCL_SPAGHETTI = 5, //!< Same as CCL_BOLELLI. It is preferable to use the flag with the name of the algorithm (CCL_SPAGHETTI) rather than the one with the name of the first author (CCL_BOLELLI). +}; + +//! mode of the contour retrieval algorithm +enum RetrievalModes { + /** retrieves only the extreme outer contours. It sets `hierarchy[i][2]=hierarchy[i][3]=-1` for + all the contours. */ + RETR_EXTERNAL = 0, + /** retrieves all of the contours without establishing any hierarchical relationships. */ + RETR_LIST = 1, + /** retrieves all of the contours and organizes them into a two-level hierarchy. At the top + level, there are external boundaries of the components. At the second level, there are + boundaries of the holes. If there is another contour inside a hole of a connected component, it + is still put at the top level. */ + RETR_CCOMP = 2, + /** retrieves all of the contours and reconstructs a full hierarchy of nested contours.*/ + RETR_TREE = 3, + RETR_FLOODFILL = 4 //!< +}; + +//! the contour approximation algorithm +enum ContourApproximationModes { + /** stores absolutely all the contour points. That is, any 2 subsequent points (x1,y1) and + (x2,y2) of the contour will be either horizontal, vertical or diagonal neighbors, that is, + max(abs(x1-x2),abs(y2-y1))==1. */ + CHAIN_APPROX_NONE = 1, + /** compresses horizontal, vertical, and diagonal segments and leaves only their end points. + For example, an up-right rectangular contour is encoded with 4 points. */ + CHAIN_APPROX_SIMPLE = 2, + /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ + CHAIN_APPROX_TC89_L1 = 3, + /** applies one of the flavors of the Teh-Chin chain approximation algorithm @cite TehChin89 */ + CHAIN_APPROX_TC89_KCOS = 4 +}; + +/** @brief Shape matching methods + +\f$A\f$ denotes object1,\f$B\f$ denotes object2 + +\f$\begin{array}{l} m^A_i = \mathrm{sign} (h^A_i) \cdot \log{h^A_i} \\ m^B_i = \mathrm{sign} (h^B_i) \cdot \log{h^B_i} \end{array}\f$ + +and \f$h^A_i, h^B_i\f$ are the Hu moments of \f$A\f$ and \f$B\f$ , respectively. +*/ +enum ShapeMatchModes { + CONTOURS_MATCH_I1 =1, //!< \f[I_1(A,B) = \sum _{i=1...7} \left | \frac{1}{m^A_i} - \frac{1}{m^B_i} \right |\f] + CONTOURS_MATCH_I2 =2, //!< \f[I_2(A,B) = \sum _{i=1...7} \left | m^A_i - m^B_i \right |\f] + CONTOURS_MATCH_I3 =3 //!< \f[I_3(A,B) = \max _{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| }\f] +}; + +//! @} imgproc_shape + +//! @addtogroup imgproc_feature +//! @{ + +//! Variants of a Hough transform +enum HoughModes { + + /** classical or standard Hough transform. Every line is represented by two floating-point + numbers \f$(\rho, \theta)\f$ , where \f$\rho\f$ is a distance between (0,0) point and the line, + and \f$\theta\f$ is the angle between x-axis and the normal to the line. Thus, the matrix must + be (the created sequence will be) of CV_32FC2 type */ + HOUGH_STANDARD = 0, + /** probabilistic Hough transform (more efficient in case if the picture contains a few long + linear segments). It returns line segments rather than the whole line. Each segment is + represented by starting and ending points, and the matrix must be (the created sequence will + be) of the CV_32SC4 type. */ + HOUGH_PROBABILISTIC = 1, + /** multi-scale variant of the classical Hough transform. The lines are encoded the same way as + HOUGH_STANDARD. */ + HOUGH_MULTI_SCALE = 2, + HOUGH_GRADIENT = 3, //!< basically *21HT*, described in @cite Yuen90 + HOUGH_GRADIENT_ALT = 4, //!< variation of HOUGH_GRADIENT to get better accuracy +}; + +//! Variants of Line Segment %Detector +enum LineSegmentDetectorModes { + LSD_REFINE_NONE = 0, //!< No refinement applied + LSD_REFINE_STD = 1, //!< Standard refinement is applied. E.g. breaking arches into smaller straighter line approximations. + LSD_REFINE_ADV = 2 //!< Advanced refinement. Number of false alarms is calculated, lines are + //!< refined through increase of precision, decrement in size, etc. +}; + +//! @} imgproc_feature + +/** Histogram comparison methods + @ingroup imgproc_hist +*/ +enum HistCompMethods { + /** Correlation + \f[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\f] + where + \f[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\f] + and \f$N\f$ is a total number of histogram bins. */ + HISTCMP_CORREL = 0, + /** Chi-Square + \f[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\f] */ + HISTCMP_CHISQR = 1, + /** Intersection + \f[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\f] */ + HISTCMP_INTERSECT = 2, + /** Bhattacharyya distance + (In fact, OpenCV computes Hellinger distance, which is related to Bhattacharyya coefficient.) + \f[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\f] */ + HISTCMP_BHATTACHARYYA = 3, + HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA, //!< Synonym for HISTCMP_BHATTACHARYYA + /** Alternative Chi-Square + \f[d(H_1,H_2) = 2 * \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)+H_2(I)}\f] + This alternative formula is regularly used for texture comparison. See e.g. @cite Puzicha1997 */ + HISTCMP_CHISQR_ALT = 4, + /** Kullback-Leibler divergence + \f[d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)\f] */ + HISTCMP_KL_DIV = 5 +}; + +/** the color conversion codes +@see @ref imgproc_color_conversions +@ingroup imgproc_color_conversions + */ +enum ColorConversionCodes { + COLOR_BGR2BGRA = 0, //!< add alpha channel to RGB or BGR image + COLOR_RGB2RGBA = COLOR_BGR2BGRA, + + COLOR_BGRA2BGR = 1, //!< remove alpha channel from RGB or BGR image + COLOR_RGBA2RGB = COLOR_BGRA2BGR, + + COLOR_BGR2RGBA = 2, //!< convert between RGB and BGR color spaces (with or without alpha channel) + COLOR_RGB2BGRA = COLOR_BGR2RGBA, + + COLOR_RGBA2BGR = 3, + COLOR_BGRA2RGB = COLOR_RGBA2BGR, + + COLOR_BGR2RGB = 4, + COLOR_RGB2BGR = COLOR_BGR2RGB, + + COLOR_BGRA2RGBA = 5, + COLOR_RGBA2BGRA = COLOR_BGRA2RGBA, + + COLOR_BGR2GRAY = 6, //!< convert between RGB/BGR and grayscale, @ref color_convert_rgb_gray "color conversions" + COLOR_RGB2GRAY = 7, + COLOR_GRAY2BGR = 8, + COLOR_GRAY2RGB = COLOR_GRAY2BGR, + COLOR_GRAY2BGRA = 9, + COLOR_GRAY2RGBA = COLOR_GRAY2BGRA, + COLOR_BGRA2GRAY = 10, + COLOR_RGBA2GRAY = 11, + + COLOR_BGR2BGR565 = 12, //!< convert between RGB/BGR and BGR565 (16-bit images) + COLOR_RGB2BGR565 = 13, + COLOR_BGR5652BGR = 14, + COLOR_BGR5652RGB = 15, + COLOR_BGRA2BGR565 = 16, + COLOR_RGBA2BGR565 = 17, + COLOR_BGR5652BGRA = 18, + COLOR_BGR5652RGBA = 19, + + COLOR_GRAY2BGR565 = 20, //!< convert between grayscale to BGR565 (16-bit images) + COLOR_BGR5652GRAY = 21, + + COLOR_BGR2BGR555 = 22, //!< convert between RGB/BGR and BGR555 (16-bit images) + COLOR_RGB2BGR555 = 23, + COLOR_BGR5552BGR = 24, + COLOR_BGR5552RGB = 25, + COLOR_BGRA2BGR555 = 26, + COLOR_RGBA2BGR555 = 27, + COLOR_BGR5552BGRA = 28, + COLOR_BGR5552RGBA = 29, + + COLOR_GRAY2BGR555 = 30, //!< convert between grayscale and BGR555 (16-bit images) + COLOR_BGR5552GRAY = 31, + + COLOR_BGR2XYZ = 32, //!< convert RGB/BGR to CIE XYZ, @ref color_convert_rgb_xyz "color conversions" + COLOR_RGB2XYZ = 33, + COLOR_XYZ2BGR = 34, + COLOR_XYZ2RGB = 35, + + COLOR_BGR2YCrCb = 36, //!< convert RGB/BGR to luma-chroma (aka YCC), @ref color_convert_rgb_ycrcb "color conversions" + COLOR_RGB2YCrCb = 37, + COLOR_YCrCb2BGR = 38, + COLOR_YCrCb2RGB = 39, + + COLOR_BGR2HSV = 40, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hsv "color conversions" + COLOR_RGB2HSV = 41, + + COLOR_BGR2Lab = 44, //!< convert RGB/BGR to CIE Lab, @ref color_convert_rgb_lab "color conversions" + COLOR_RGB2Lab = 45, + + COLOR_BGR2Luv = 50, //!< convert RGB/BGR to CIE Luv, @ref color_convert_rgb_luv "color conversions" + COLOR_RGB2Luv = 51, + COLOR_BGR2HLS = 52, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..180 if 8 bit image, @ref color_convert_rgb_hls "color conversions" + COLOR_RGB2HLS = 53, + + COLOR_HSV2BGR = 54, //!< backward conversions HSV to RGB/BGR with H range 0..180 if 8 bit image + COLOR_HSV2RGB = 55, + + COLOR_Lab2BGR = 56, + COLOR_Lab2RGB = 57, + COLOR_Luv2BGR = 58, + COLOR_Luv2RGB = 59, + COLOR_HLS2BGR = 60, //!< backward conversions HLS to RGB/BGR with H range 0..180 if 8 bit image + COLOR_HLS2RGB = 61, + + COLOR_BGR2HSV_FULL = 66, //!< convert RGB/BGR to HSV (hue saturation value) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hsv "color conversions" + COLOR_RGB2HSV_FULL = 67, + COLOR_BGR2HLS_FULL = 68, //!< convert RGB/BGR to HLS (hue lightness saturation) with H range 0..255 if 8 bit image, @ref color_convert_rgb_hls "color conversions" + COLOR_RGB2HLS_FULL = 69, + + COLOR_HSV2BGR_FULL = 70, //!< backward conversions HSV to RGB/BGR with H range 0..255 if 8 bit image + COLOR_HSV2RGB_FULL = 71, + COLOR_HLS2BGR_FULL = 72, //!< backward conversions HLS to RGB/BGR with H range 0..255 if 8 bit image + COLOR_HLS2RGB_FULL = 73, + + COLOR_LBGR2Lab = 74, + COLOR_LRGB2Lab = 75, + COLOR_LBGR2Luv = 76, + COLOR_LRGB2Luv = 77, + + COLOR_Lab2LBGR = 78, + COLOR_Lab2LRGB = 79, + COLOR_Luv2LBGR = 80, + COLOR_Luv2LRGB = 81, + + COLOR_BGR2YUV = 82, //!< convert between RGB/BGR and YUV + COLOR_RGB2YUV = 83, + COLOR_YUV2BGR = 84, + COLOR_YUV2RGB = 85, + + //! YUV 4:2:0 family to RGB + COLOR_YUV2RGB_NV12 = 90, + COLOR_YUV2BGR_NV12 = 91, + COLOR_YUV2RGB_NV21 = 92, + COLOR_YUV2BGR_NV21 = 93, + COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21, + COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21, + + COLOR_YUV2RGBA_NV12 = 94, + COLOR_YUV2BGRA_NV12 = 95, + COLOR_YUV2RGBA_NV21 = 96, + COLOR_YUV2BGRA_NV21 = 97, + COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21, + COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21, + + COLOR_YUV2RGB_YV12 = 98, + COLOR_YUV2BGR_YV12 = 99, + COLOR_YUV2RGB_IYUV = 100, + COLOR_YUV2BGR_IYUV = 101, + COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV, + COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV, + COLOR_YUV420p2RGB = COLOR_YUV2RGB_YV12, + COLOR_YUV420p2BGR = COLOR_YUV2BGR_YV12, + + COLOR_YUV2RGBA_YV12 = 102, + COLOR_YUV2BGRA_YV12 = 103, + COLOR_YUV2RGBA_IYUV = 104, + COLOR_YUV2BGRA_IYUV = 105, + COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV, + COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV, + COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12, + COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12, + + COLOR_YUV2GRAY_420 = 106, + COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420, + COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420, + COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420, + COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420, + COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420, + COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420, + COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420, + + //! YUV 4:2:2 family to RGB + COLOR_YUV2RGB_UYVY = 107, + COLOR_YUV2BGR_UYVY = 108, + //COLOR_YUV2RGB_VYUY = 109, + //COLOR_YUV2BGR_VYUY = 110, + COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY, + COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY, + COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY, + COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY, + + COLOR_YUV2RGBA_UYVY = 111, + COLOR_YUV2BGRA_UYVY = 112, + //COLOR_YUV2RGBA_VYUY = 113, + //COLOR_YUV2BGRA_VYUY = 114, + COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY, + COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY, + COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY, + COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY, + + COLOR_YUV2RGB_YUY2 = 115, + COLOR_YUV2BGR_YUY2 = 116, + COLOR_YUV2RGB_YVYU = 117, + COLOR_YUV2BGR_YVYU = 118, + COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2, + COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2, + COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2, + COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2, + + COLOR_YUV2RGBA_YUY2 = 119, + COLOR_YUV2BGRA_YUY2 = 120, + COLOR_YUV2RGBA_YVYU = 121, + COLOR_YUV2BGRA_YVYU = 122, + COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2, + COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2, + COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2, + COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2, + + COLOR_YUV2GRAY_UYVY = 123, + COLOR_YUV2GRAY_YUY2 = 124, + //CV_YUV2GRAY_VYUY = CV_YUV2GRAY_UYVY, + COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY, + COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY, + COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2, + COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2, + COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2, + + //! alpha premultiplication + COLOR_RGBA2mRGBA = 125, + COLOR_mRGBA2RGBA = 126, + + //! RGB to YUV 4:2:0 family + COLOR_RGB2YUV_I420 = 127, + COLOR_BGR2YUV_I420 = 128, + COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420, + COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420, + + COLOR_RGBA2YUV_I420 = 129, + COLOR_BGRA2YUV_I420 = 130, + COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420, + COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420, + COLOR_RGB2YUV_YV12 = 131, + COLOR_BGR2YUV_YV12 = 132, + COLOR_RGBA2YUV_YV12 = 133, + COLOR_BGRA2YUV_YV12 = 134, + + //! Demosaicing, see @ref color_convert_bayer "color conversions" for additional information + COLOR_BayerBG2BGR = 46, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2BGR = 47, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2BGR = 48, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2BGR = 49, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerRGGB2BGR = COLOR_BayerBG2BGR, + COLOR_BayerGRBG2BGR = COLOR_BayerGB2BGR, + COLOR_BayerBGGR2BGR = COLOR_BayerRG2BGR, + COLOR_BayerGBRG2BGR = COLOR_BayerGR2BGR, + + COLOR_BayerRGGB2RGB = COLOR_BayerBGGR2BGR, + COLOR_BayerGRBG2RGB = COLOR_BayerGBRG2BGR, + COLOR_BayerBGGR2RGB = COLOR_BayerRGGB2BGR, + COLOR_BayerGBRG2RGB = COLOR_BayerGRBG2BGR, + + COLOR_BayerBG2RGB = COLOR_BayerRG2BGR, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2RGB = COLOR_BayerGR2BGR, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2RGB = COLOR_BayerBG2BGR, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2RGB = COLOR_BayerGB2BGR, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerBG2GRAY = 86, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2GRAY = 87, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2GRAY = 88, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2GRAY = 89, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerRGGB2GRAY = COLOR_BayerBG2GRAY, + COLOR_BayerGRBG2GRAY = COLOR_BayerGB2GRAY, + COLOR_BayerBGGR2GRAY = COLOR_BayerRG2GRAY, + COLOR_BayerGBRG2GRAY = COLOR_BayerGR2GRAY, + + //! Demosaicing using Variable Number of Gradients + COLOR_BayerBG2BGR_VNG = 62, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2BGR_VNG = 63, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2BGR_VNG = 64, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2BGR_VNG = 65, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerRGGB2BGR_VNG = COLOR_BayerBG2BGR_VNG, + COLOR_BayerGRBG2BGR_VNG = COLOR_BayerGB2BGR_VNG, + COLOR_BayerBGGR2BGR_VNG = COLOR_BayerRG2BGR_VNG, + COLOR_BayerGBRG2BGR_VNG = COLOR_BayerGR2BGR_VNG, + + COLOR_BayerRGGB2RGB_VNG = COLOR_BayerBGGR2BGR_VNG, + COLOR_BayerGRBG2RGB_VNG = COLOR_BayerGBRG2BGR_VNG, + COLOR_BayerBGGR2RGB_VNG = COLOR_BayerRGGB2BGR_VNG, + COLOR_BayerGBRG2RGB_VNG = COLOR_BayerGRBG2BGR_VNG, + + COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG, //!< equivalent to GBRG Bayer pattern + + //! Edge-Aware Demosaicing + COLOR_BayerBG2BGR_EA = 135, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2BGR_EA = 136, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2BGR_EA = 137, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2BGR_EA = 138, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerRGGB2BGR_EA = COLOR_BayerBG2BGR_EA, + COLOR_BayerGRBG2BGR_EA = COLOR_BayerGB2BGR_EA, + COLOR_BayerBGGR2BGR_EA = COLOR_BayerRG2BGR_EA, + COLOR_BayerGBRG2BGR_EA = COLOR_BayerGR2BGR_EA, + + COLOR_BayerRGGB2RGB_EA = COLOR_BayerBGGR2BGR_EA, + COLOR_BayerGRBG2RGB_EA = COLOR_BayerGBRG2BGR_EA, + COLOR_BayerBGGR2RGB_EA = COLOR_BayerRGGB2BGR_EA, + COLOR_BayerGBRG2RGB_EA = COLOR_BayerGRBG2BGR_EA, + + COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA, //!< equivalent to GBRG Bayer pattern + + //! Demosaicing with alpha channel + COLOR_BayerBG2BGRA = 139, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2BGRA = 140, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2BGRA = 141, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2BGRA = 142, //!< equivalent to GBRG Bayer pattern + + COLOR_BayerRGGB2BGRA = COLOR_BayerBG2BGRA, + COLOR_BayerGRBG2BGRA = COLOR_BayerGB2BGRA, + COLOR_BayerBGGR2BGRA = COLOR_BayerRG2BGRA, + COLOR_BayerGBRG2BGRA = COLOR_BayerGR2BGRA, + + COLOR_BayerRGGB2RGBA = COLOR_BayerBGGR2BGRA, + COLOR_BayerGRBG2RGBA = COLOR_BayerGBRG2BGRA, + COLOR_BayerBGGR2RGBA = COLOR_BayerRGGB2BGRA, + COLOR_BayerGBRG2RGBA = COLOR_BayerGRBG2BGRA, + + COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA, //!< equivalent to RGGB Bayer pattern + COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA, //!< equivalent to GRBG Bayer pattern + COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA, //!< equivalent to BGGR Bayer pattern + COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA, //!< equivalent to GBRG Bayer pattern + + //! RGB to YUV 4:2:2 family + + COLOR_RGB2YUV_UYVY = 143, + COLOR_BGR2YUV_UYVY = 144, + COLOR_RGB2YUV_Y422 = COLOR_RGB2YUV_UYVY, + COLOR_BGR2YUV_Y422 = COLOR_BGR2YUV_UYVY, + COLOR_RGB2YUV_UYNV = COLOR_RGB2YUV_UYVY, + COLOR_BGR2YUV_UYNV = COLOR_BGR2YUV_UYVY, + + COLOR_RGBA2YUV_UYVY = 145, + COLOR_BGRA2YUV_UYVY = 146, + COLOR_RGBA2YUV_Y422 = COLOR_RGBA2YUV_UYVY, + COLOR_BGRA2YUV_Y422 = COLOR_BGRA2YUV_UYVY, + COLOR_RGBA2YUV_UYNV = COLOR_RGBA2YUV_UYVY, + COLOR_BGRA2YUV_UYNV = COLOR_BGRA2YUV_UYVY, + + COLOR_RGB2YUV_YUY2 = 147, + COLOR_BGR2YUV_YUY2 = 148, + COLOR_RGB2YUV_YVYU = 149, + COLOR_BGR2YUV_YVYU = 150, + COLOR_RGB2YUV_YUYV = COLOR_RGB2YUV_YUY2, + COLOR_BGR2YUV_YUYV = COLOR_BGR2YUV_YUY2, + COLOR_RGB2YUV_YUNV = COLOR_RGB2YUV_YUY2, + COLOR_BGR2YUV_YUNV = COLOR_BGR2YUV_YUY2, + + COLOR_RGBA2YUV_YUY2 = 151, + COLOR_BGRA2YUV_YUY2 = 152, + COLOR_RGBA2YUV_YVYU = 153, + COLOR_BGRA2YUV_YVYU = 154, + COLOR_RGBA2YUV_YUYV = COLOR_RGBA2YUV_YUY2, + COLOR_BGRA2YUV_YUYV = COLOR_BGRA2YUV_YUY2, + COLOR_RGBA2YUV_YUNV = COLOR_RGBA2YUV_YUY2, + COLOR_BGRA2YUV_YUNV = COLOR_BGRA2YUV_YUY2, + + COLOR_COLORCVT_MAX = 155 +}; + +//! @addtogroup imgproc_shape +//! @{ + +//! types of intersection between rectangles +enum RectanglesIntersectTypes { + INTERSECT_NONE = 0, //!< No intersection + INTERSECT_PARTIAL = 1, //!< There is a partial intersection + INTERSECT_FULL = 2 //!< One of the rectangle is fully enclosed in the other +}; + +/** types of line +@ingroup imgproc_draw +*/ +enum LineTypes { + FILLED = -1, + LINE_4 = 4, //!< 4-connected line + LINE_8 = 8, //!< 8-connected line + LINE_AA = 16 //!< antialiased line +}; + +/** Only a subset of Hershey fonts are supported +@ingroup imgproc_draw +*/ +enum HersheyFonts { + FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font + FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font + FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX) + FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font + FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX) + FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX + FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font + FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX + FONT_ITALIC = 16 //!< flag for italic font +}; + +/** Possible set of marker types used for the cv::drawMarker function +@ingroup imgproc_draw +*/ +enum MarkerTypes +{ + MARKER_CROSS = 0, //!< A crosshair marker shape + MARKER_TILTED_CROSS = 1, //!< A 45 degree tilted crosshair marker shape + MARKER_STAR = 2, //!< A star marker shape, combination of cross and tilted cross + MARKER_DIAMOND = 3, //!< A diamond marker shape + MARKER_SQUARE = 4, //!< A square marker shape + MARKER_TRIANGLE_UP = 5, //!< An upwards pointing triangle marker shape + MARKER_TRIANGLE_DOWN = 6 //!< A downwards pointing triangle marker shape +}; + +/** @brief finds arbitrary template in the grayscale image using Generalized Hough Transform +*/ +class CV_EXPORTS_W GeneralizedHough : public Algorithm +{ +public: + //! set template to search + CV_WRAP virtual void setTemplate(InputArray templ, Point templCenter = Point(-1, -1)) = 0; + CV_WRAP virtual void setTemplate(InputArray edges, InputArray dx, InputArray dy, Point templCenter = Point(-1, -1)) = 0; + + //! find template on image + CV_WRAP virtual void detect(InputArray image, OutputArray positions, OutputArray votes = noArray()) = 0; + CV_WRAP virtual void detect(InputArray edges, InputArray dx, InputArray dy, OutputArray positions, OutputArray votes = noArray()) = 0; + + //! Canny low threshold. + CV_WRAP virtual void setCannyLowThresh(int cannyLowThresh) = 0; + CV_WRAP virtual int getCannyLowThresh() const = 0; + + //! Canny high threshold. + CV_WRAP virtual void setCannyHighThresh(int cannyHighThresh) = 0; + CV_WRAP virtual int getCannyHighThresh() const = 0; + + //! Minimum distance between the centers of the detected objects. + CV_WRAP virtual void setMinDist(double minDist) = 0; + CV_WRAP virtual double getMinDist() const = 0; + + //! Inverse ratio of the accumulator resolution to the image resolution. + CV_WRAP virtual void setDp(double dp) = 0; + CV_WRAP virtual double getDp() const = 0; + + //! Maximal size of inner buffers. + CV_WRAP virtual void setMaxBufferSize(int maxBufferSize) = 0; + CV_WRAP virtual int getMaxBufferSize() const = 0; +}; + +/** @brief finds arbitrary template in the grayscale image using Generalized Hough Transform + +Detects position only without translation and rotation @cite Ballard1981 . +*/ +class CV_EXPORTS_W GeneralizedHoughBallard : public GeneralizedHough +{ +public: + //! R-Table levels. + CV_WRAP virtual void setLevels(int levels) = 0; + CV_WRAP virtual int getLevels() const = 0; + + //! The accumulator threshold for the template centers at the detection stage. The smaller it is, the more false positions may be detected. + CV_WRAP virtual void setVotesThreshold(int votesThreshold) = 0; + CV_WRAP virtual int getVotesThreshold() const = 0; +}; + +/** @brief finds arbitrary template in the grayscale image using Generalized Hough Transform + +Detects position, translation and rotation @cite Guil1999 . +*/ +class CV_EXPORTS_W GeneralizedHoughGuil : public GeneralizedHough +{ +public: + //! Angle difference in degrees between two points in feature. + CV_WRAP virtual void setXi(double xi) = 0; + CV_WRAP virtual double getXi() const = 0; + + //! Feature table levels. + CV_WRAP virtual void setLevels(int levels) = 0; + CV_WRAP virtual int getLevels() const = 0; + + //! Maximal difference between angles that treated as equal. + CV_WRAP virtual void setAngleEpsilon(double angleEpsilon) = 0; + CV_WRAP virtual double getAngleEpsilon() const = 0; + + //! Minimal rotation angle to detect in degrees. + CV_WRAP virtual void setMinAngle(double minAngle) = 0; + CV_WRAP virtual double getMinAngle() const = 0; + + //! Maximal rotation angle to detect in degrees. + CV_WRAP virtual void setMaxAngle(double maxAngle) = 0; + CV_WRAP virtual double getMaxAngle() const = 0; + + //! Angle step in degrees. + CV_WRAP virtual void setAngleStep(double angleStep) = 0; + CV_WRAP virtual double getAngleStep() const = 0; + + //! Angle votes threshold. + CV_WRAP virtual void setAngleThresh(int angleThresh) = 0; + CV_WRAP virtual int getAngleThresh() const = 0; + + //! Minimal scale to detect. + CV_WRAP virtual void setMinScale(double minScale) = 0; + CV_WRAP virtual double getMinScale() const = 0; + + //! Maximal scale to detect. + CV_WRAP virtual void setMaxScale(double maxScale) = 0; + CV_WRAP virtual double getMaxScale() const = 0; + + //! Scale step. + CV_WRAP virtual void setScaleStep(double scaleStep) = 0; + CV_WRAP virtual double getScaleStep() const = 0; + + //! Scale votes threshold. + CV_WRAP virtual void setScaleThresh(int scaleThresh) = 0; + CV_WRAP virtual int getScaleThresh() const = 0; + + //! Position votes threshold. + CV_WRAP virtual void setPosThresh(int posThresh) = 0; + CV_WRAP virtual int getPosThresh() const = 0; +}; + +//! @} imgproc_shape + +//! @addtogroup imgproc_hist +//! @{ + +/** @brief Base class for Contrast Limited Adaptive Histogram Equalization. +*/ +class CV_EXPORTS_W CLAHE : public Algorithm +{ +public: + /** @brief Equalizes the histogram of a grayscale image using Contrast Limited Adaptive Histogram Equalization. + + @param src Source image of type CV_8UC1 or CV_16UC1. + @param dst Destination image. + */ + CV_WRAP virtual void apply(InputArray src, OutputArray dst) = 0; + + /** @brief Sets threshold for contrast limiting. + + @param clipLimit threshold value. + */ + CV_WRAP virtual void setClipLimit(double clipLimit) = 0; + + //! Returns threshold value for contrast limiting. + CV_WRAP virtual double getClipLimit() const = 0; + + /** @brief Sets size of grid for histogram equalization. Input image will be divided into + equally sized rectangular tiles. + + @param tileGridSize defines the number of tiles in row and column. + */ + CV_WRAP virtual void setTilesGridSize(Size tileGridSize) = 0; + + //!@brief Returns Size defines the number of tiles in row and column. + CV_WRAP virtual Size getTilesGridSize() const = 0; + + CV_WRAP virtual void collectGarbage() = 0; +}; + +//! @} imgproc_hist + +//! @addtogroup imgproc_subdiv2d +//! @{ + +class CV_EXPORTS_W Subdiv2D +{ +public: + /** Subdiv2D point location cases */ + enum { PTLOC_ERROR = -2, //!< Point location error + PTLOC_OUTSIDE_RECT = -1, //!< Point outside the subdivision bounding rect + PTLOC_INSIDE = 0, //!< Point inside some facet + PTLOC_VERTEX = 1, //!< Point coincides with one of the subdivision vertices + PTLOC_ON_EDGE = 2 //!< Point on some edge + }; + + /** Subdiv2D edge type navigation (see: getEdge()) */ + enum { NEXT_AROUND_ORG = 0x00, + NEXT_AROUND_DST = 0x22, + PREV_AROUND_ORG = 0x11, + PREV_AROUND_DST = 0x33, + NEXT_AROUND_LEFT = 0x13, + NEXT_AROUND_RIGHT = 0x31, + PREV_AROUND_LEFT = 0x20, + PREV_AROUND_RIGHT = 0x02 + }; + + /** creates an empty Subdiv2D object. + To create a new empty Delaunay subdivision you need to use the #initDelaunay function. + */ + CV_WRAP Subdiv2D(); + + /** @overload + + @param rect Rectangle that includes all of the 2D points that are to be added to the subdivision. + + The function creates an empty Delaunay subdivision where 2D points can be added using the function + insert() . All of the points to be added must be within the specified rectangle, otherwise a runtime + error is raised. + */ + CV_WRAP Subdiv2D(Rect rect); + + /** @brief Creates a new empty Delaunay subdivision + + @param rect Rectangle that includes all of the 2D points that are to be added to the subdivision. + + */ + CV_WRAP void initDelaunay(Rect rect); + + /** @brief Insert a single point into a Delaunay triangulation. + + @param pt Point to insert. + + The function inserts a single point into a subdivision and modifies the subdivision topology + appropriately. If a point with the same coordinates exists already, no new point is added. + @returns the ID of the point. + + @note If the point is outside of the triangulation specified rect a runtime error is raised. + */ + CV_WRAP int insert(Point2f pt); + + /** @brief Insert multiple points into a Delaunay triangulation. + + @param ptvec Points to insert. + + The function inserts a vector of points into a subdivision and modifies the subdivision topology + appropriately. + */ + CV_WRAP void insert(const std::vector& ptvec); + + /** @brief Returns the location of a point within a Delaunay triangulation. + + @param pt Point to locate. + @param edge Output edge that the point belongs to or is located to the right of it. + @param vertex Optional output vertex the input point coincides with. + + The function locates the input point within the subdivision and gives one of the triangle edges + or vertices. + + @returns an integer which specify one of the following five cases for point location: + - The point falls into some facet. The function returns #PTLOC_INSIDE and edge will contain one of + edges of the facet. + - The point falls onto the edge. The function returns #PTLOC_ON_EDGE and edge will contain this edge. + - The point coincides with one of the subdivision vertices. The function returns #PTLOC_VERTEX and + vertex will contain a pointer to the vertex. + - The point is outside the subdivision reference rectangle. The function returns #PTLOC_OUTSIDE_RECT + and no pointers are filled. + - One of input arguments is invalid. A runtime error is raised or, if silent or "parent" error + processing mode is selected, #PTLOC_ERROR is returned. + */ + CV_WRAP int locate(Point2f pt, CV_OUT int& edge, CV_OUT int& vertex); + + /** @brief Finds the subdivision vertex closest to the given point. + + @param pt Input point. + @param nearestPt Output subdivision vertex point. + + The function is another function that locates the input point within the subdivision. It finds the + subdivision vertex that is the closest to the input point. It is not necessarily one of vertices + of the facet containing the input point, though the facet (located using locate() ) is used as a + starting point. + + @returns vertex ID. + */ + CV_WRAP int findNearest(Point2f pt, CV_OUT Point2f* nearestPt = 0); + + /** @brief Returns a list of all edges. + + @param edgeList Output vector. + + The function gives each edge as a 4 numbers vector, where each two are one of the edge + vertices. i.e. org_x = v[0], org_y = v[1], dst_x = v[2], dst_y = v[3]. + */ + CV_WRAP void getEdgeList(CV_OUT std::vector& edgeList) const; + + /** @brief Returns a list of the leading edge ID connected to each triangle. + + @param leadingEdgeList Output vector. + + The function gives one edge ID for each triangle. + */ + CV_WRAP void getLeadingEdgeList(CV_OUT std::vector& leadingEdgeList) const; + + /** @brief Returns a list of all triangles. + + @param triangleList Output vector. + + The function gives each triangle as a 6 numbers vector, where each two are one of the triangle + vertices. i.e. p1_x = v[0], p1_y = v[1], p2_x = v[2], p2_y = v[3], p3_x = v[4], p3_y = v[5]. + */ + CV_WRAP void getTriangleList(CV_OUT std::vector& triangleList) const; + + /** @brief Returns a list of all Voronoi facets. + + @param idx Vector of vertices IDs to consider. For all vertices you can pass empty vector. + @param facetList Output vector of the Voronoi facets. + @param facetCenters Output vector of the Voronoi facets center points. + + */ + CV_WRAP void getVoronoiFacetList(const std::vector& idx, CV_OUT std::vector >& facetList, + CV_OUT std::vector& facetCenters); + + /** @brief Returns vertex location from vertex ID. + + @param vertex vertex ID. + @param firstEdge Optional. The first edge ID which is connected to the vertex. + @returns vertex (x,y) + + */ + CV_WRAP Point2f getVertex(int vertex, CV_OUT int* firstEdge = 0) const; + + /** @brief Returns one of the edges related to the given edge. + + @param edge Subdivision edge ID. + @param nextEdgeType Parameter specifying which of the related edges to return. + The following values are possible: + - NEXT_AROUND_ORG next around the edge origin ( eOnext on the picture below if e is the input edge) + - NEXT_AROUND_DST next around the edge vertex ( eDnext ) + - PREV_AROUND_ORG previous around the edge origin (reversed eRnext ) + - PREV_AROUND_DST previous around the edge destination (reversed eLnext ) + - NEXT_AROUND_LEFT next around the left facet ( eLnext ) + - NEXT_AROUND_RIGHT next around the right facet ( eRnext ) + - PREV_AROUND_LEFT previous around the left facet (reversed eOnext ) + - PREV_AROUND_RIGHT previous around the right facet (reversed eDnext ) + + ![sample output](pics/quadedge.png) + + @returns edge ID related to the input edge. + */ + CV_WRAP int getEdge( int edge, int nextEdgeType ) const; + + /** @brief Returns next edge around the edge origin. + + @param edge Subdivision edge ID. + + @returns an integer which is next edge ID around the edge origin: eOnext on the + picture above if e is the input edge). + */ + CV_WRAP int nextEdge(int edge) const; + + /** @brief Returns another edge of the same quad-edge. + + @param edge Subdivision edge ID. + @param rotate Parameter specifying which of the edges of the same quad-edge as the input + one to return. The following values are possible: + - 0 - the input edge ( e on the picture below if e is the input edge) + - 1 - the rotated edge ( eRot ) + - 2 - the reversed edge (reversed e (in green)) + - 3 - the reversed rotated edge (reversed eRot (in green)) + + @returns one of the edges ID of the same quad-edge as the input edge. + */ + CV_WRAP int rotateEdge(int edge, int rotate) const; + CV_WRAP int symEdge(int edge) const; + + /** @brief Returns the edge origin. + + @param edge Subdivision edge ID. + @param orgpt Output vertex location. + + @returns vertex ID. + */ + CV_WRAP int edgeOrg(int edge, CV_OUT Point2f* orgpt = 0) const; + + /** @brief Returns the edge destination. + + @param edge Subdivision edge ID. + @param dstpt Output vertex location. + + @returns vertex ID. + */ + CV_WRAP int edgeDst(int edge, CV_OUT Point2f* dstpt = 0) const; + +protected: + int newEdge(); + void deleteEdge(int edge); + int newPoint(Point2f pt, bool isvirtual, int firstEdge = 0); + void deletePoint(int vtx); + void setEdgePoints( int edge, int orgPt, int dstPt ); + void splice( int edgeA, int edgeB ); + int connectEdges( int edgeA, int edgeB ); + void swapEdges( int edge ); + int isRightOf(Point2f pt, int edge) const; + void calcVoronoi(); + void clearVoronoi(); + void checkSubdiv() const; + + struct CV_EXPORTS Vertex + { + Vertex(); + Vertex(Point2f pt, bool isvirtual, int firstEdge=0); + bool isvirtual() const; + bool isfree() const; + + int firstEdge; + int type; + Point2f pt; + }; + + struct CV_EXPORTS QuadEdge + { + QuadEdge(); + QuadEdge(int edgeidx); + bool isfree() const; + + int next[4]; + int pt[4]; + }; + + //! All of the vertices + std::vector vtx; + //! All of the edges + std::vector qedges; + int freeQEdge; + int freePoint; + bool validGeometry; + + int recentEdge; + //! Top left corner of the bounding rect + Point2f topLeft; + //! Bottom right corner of the bounding rect + Point2f bottomRight; +}; + +//! @} imgproc_subdiv2d + +//! @addtogroup imgproc_feature +//! @{ + +/** @example samples/cpp/lsd_lines.cpp +An example using the LineSegmentDetector +\image html building_lsd.png "Sample output image" width=434 height=300 +*/ + +/** @brief Line segment detector class + +following the algorithm described at @cite Rafael12 . + +@note Implementation has been removed from OpenCV version 3.4.6 to 3.4.15 and version 4.1.0 to 4.5.3 due original code license conflict. +restored again after [Computation of a NFA](https://github.com/rafael-grompone-von-gioi/binomial_nfa) code published under the MIT license. +*/ +class CV_EXPORTS_W LineSegmentDetector : public Algorithm +{ +public: + + /** @brief Finds lines in the input image. + + This is the output of the default parameters of the algorithm on the above shown image. + + ![image](pics/building_lsd.png) + + @param image A grayscale (CV_8UC1) input image. If only a roi needs to be selected, use: + `lsd_ptr-\>detect(image(roi), lines, ...); lines += Scalar(roi.x, roi.y, roi.x, roi.y);` + @param lines A vector of Vec4f elements specifying the beginning and ending point of a line. Where + Vec4f is (x1, y1, x2, y2), point 1 is the start, point 2 - end. Returned lines are strictly + oriented depending on the gradient. + @param width Vector of widths of the regions, where the lines are found. E.g. Width of line. + @param prec Vector of precisions with which the lines are found. + @param nfa Vector containing number of false alarms in the line region, with precision of 10%. The + bigger the value, logarithmically better the detection. + - -1 corresponds to 10 mean false alarms + - 0 corresponds to 1 mean false alarm + - 1 corresponds to 0.1 mean false alarms + This vector will be calculated only when the objects type is #LSD_REFINE_ADV. + */ + CV_WRAP virtual void detect(InputArray image, OutputArray lines, + OutputArray width = noArray(), OutputArray prec = noArray(), + OutputArray nfa = noArray()) = 0; + + /** @brief Draws the line segments on a given image. + @param image The image, where the lines will be drawn. Should be bigger or equal to the image, + where the lines were found. + @param lines A vector of the lines that needed to be drawn. + */ + CV_WRAP virtual void drawSegments(InputOutputArray image, InputArray lines) = 0; + + /** @brief Draws two groups of lines in blue and red, counting the non overlapping (mismatching) pixels. + + @param size The size of the image, where lines1 and lines2 were found. + @param lines1 The first group of lines that needs to be drawn. It is visualized in blue color. + @param lines2 The second group of lines. They visualized in red color. + @param image Optional image, where the lines will be drawn. The image should be color(3-channel) + in order for lines1 and lines2 to be drawn in the above mentioned colors. + */ + CV_WRAP virtual int compareSegments(const Size& size, InputArray lines1, InputArray lines2, InputOutputArray image = noArray()) = 0; + + virtual ~LineSegmentDetector() { } +}; + +/** @brief Creates a smart pointer to a LineSegmentDetector object and initializes it. + +The LineSegmentDetector algorithm is defined using the standard values. Only advanced users may want +to edit those, as to tailor it for their own application. + +@param refine The way found lines will be refined, see #LineSegmentDetectorModes +@param scale The scale of the image that will be used to find the lines. Range (0..1]. +@param sigma_scale Sigma for Gaussian filter. It is computed as sigma = sigma_scale/scale. +@param quant Bound to the quantization error on the gradient norm. +@param ang_th Gradient angle tolerance in degrees. +@param log_eps Detection threshold: -log10(NFA) \> log_eps. Used only when advance refinement is chosen. +@param density_th Minimal density of aligned region points in the enclosing rectangle. +@param n_bins Number of bins in pseudo-ordering of gradient modulus. + */ +CV_EXPORTS_W Ptr createLineSegmentDetector( + int refine = LSD_REFINE_STD, double scale = 0.8, + double sigma_scale = 0.6, double quant = 2.0, double ang_th = 22.5, + double log_eps = 0, double density_th = 0.7, int n_bins = 1024); + +//! @} imgproc_feature + +//! @addtogroup imgproc_filter +//! @{ + +/** @brief Returns Gaussian filter coefficients. + +The function computes and returns the \f$\texttt{ksize} \times 1\f$ matrix of Gaussian filter +coefficients: + +\f[G_i= \alpha *e^{-(i-( \texttt{ksize} -1)/2)^2/(2* \texttt{sigma}^2)},\f] + +where \f$i=0..\texttt{ksize}-1\f$ and \f$\alpha\f$ is the scale factor chosen so that \f$\sum_i G_i=1\f$. + +Two of such generated kernels can be passed to sepFilter2D. Those functions automatically recognize +smoothing kernels (a symmetrical kernel with sum of weights equal to 1) and handle them accordingly. +You may also use the higher-level GaussianBlur. +@param ksize Aperture size. It should be odd ( \f$\texttt{ksize} \mod 2 = 1\f$ ) and positive. +@param sigma Gaussian standard deviation. If it is non-positive, it is computed from ksize as +`sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8`. +@param ktype Type of filter coefficients. It can be CV_32F or CV_64F . +@sa sepFilter2D, getDerivKernels, getStructuringElement, GaussianBlur + */ +CV_EXPORTS_W Mat getGaussianKernel( int ksize, double sigma, int ktype = CV_64F ); + +/** @brief Returns filter coefficients for computing spatial image derivatives. + +The function computes and returns the filter coefficients for spatial image derivatives. When +`ksize=FILTER_SCHARR`, the Scharr \f$3 \times 3\f$ kernels are generated (see #Scharr). Otherwise, Sobel +kernels are generated (see #Sobel). The filters are normally passed to #sepFilter2D or to + +@param kx Output matrix of row filter coefficients. It has the type ktype . +@param ky Output matrix of column filter coefficients. It has the type ktype . +@param dx Derivative order in respect of x. +@param dy Derivative order in respect of y. +@param ksize Aperture size. It can be FILTER_SCHARR, 1, 3, 5, or 7. +@param normalize Flag indicating whether to normalize (scale down) the filter coefficients or not. +Theoretically, the coefficients should have the denominator \f$=2^{ksize*2-dx-dy-2}\f$. If you are +going to filter floating-point images, you are likely to use the normalized kernels. But if you +compute derivatives of an 8-bit image, store the results in a 16-bit image, and wish to preserve +all the fractional bits, you may want to set normalize=false . +@param ktype Type of filter coefficients. It can be CV_32f or CV_64F . + */ +CV_EXPORTS_W void getDerivKernels( OutputArray kx, OutputArray ky, + int dx, int dy, int ksize, + bool normalize = false, int ktype = CV_32F ); + +/** @brief Returns Gabor filter coefficients. + +For more details about gabor filter equations and parameters, see: [Gabor +Filter](http://en.wikipedia.org/wiki/Gabor_filter). + +@param ksize Size of the filter returned. +@param sigma Standard deviation of the gaussian envelope. +@param theta Orientation of the normal to the parallel stripes of a Gabor function. +@param lambd Wavelength of the sinusoidal factor. +@param gamma Spatial aspect ratio. +@param psi Phase offset. +@param ktype Type of filter coefficients. It can be CV_32F or CV_64F . + */ +CV_EXPORTS_W Mat getGaborKernel( Size ksize, double sigma, double theta, double lambd, + double gamma, double psi = CV_PI*0.5, int ktype = CV_64F ); + +//! returns "magic" border value for erosion and dilation. It is automatically transformed to Scalar::all(-DBL_MAX) for dilation. +static inline Scalar morphologyDefaultBorderValue() { return Scalar::all(DBL_MAX); } + +/** @brief Returns a structuring element of the specified size and shape for morphological operations. + +The function constructs and returns the structuring element that can be further passed to #erode, +#dilate or #morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as +the structuring element. + +@param shape Element shape that could be one of #MorphShapes +@param ksize Size of the structuring element. +@param anchor Anchor position within the element. The default value \f$(-1, -1)\f$ means that the +anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor +position. In other cases the anchor just regulates how much the result of the morphological +operation is shifted. + */ +CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1)); + +/** @example samples/cpp/tutorial_code/ImgProc/Smoothing/Smoothing.cpp +Sample code for simple filters +![Sample screenshot](Smoothing_Tutorial_Result_Median_Filter.jpg) +Check @ref tutorial_gausian_median_blur_bilateral_filter "the corresponding tutorial" for more details + */ + +/** @brief Blurs an image using the median filter. + +The function smoothes an image using the median filter with the \f$\texttt{ksize} \times +\texttt{ksize}\f$ aperture. Each channel of a multi-channel image is processed independently. +In-place operation is supported. + +@note The median filter uses #BORDER_REPLICATE internally to cope with border pixels, see #BorderTypes + +@param src input 1-, 3-, or 4-channel image; when ksize is 3 or 5, the image depth should be +CV_8U, CV_16U, or CV_32F, for larger aperture sizes, it can only be CV_8U. +@param dst destination array of the same size and type as src. +@param ksize aperture linear size; it must be odd and greater than 1, for example: 3, 5, 7 ... +@sa bilateralFilter, blur, boxFilter, GaussianBlur + */ +CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize ); + +/** @brief Blurs an image using a Gaussian filter. + +The function convolves the source image with the specified Gaussian kernel. In-place filtering is +supported. + +@param src input image; the image can have any number of channels, which are processed +independently, but the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. +@param dst output image of the same size and type as src. +@param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be +positive and odd. Or, they can be zero's and then they are computed from sigma. +@param sigmaX Gaussian kernel standard deviation in X direction. +@param sigmaY Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be +equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height, +respectively (see #getGaussianKernel for details); to fully control the result regardless of +possible future modifications of all this semantics, it is recommended to specify all of ksize, +sigmaX, and sigmaY. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. + +@sa sepFilter2D, filter2D, blur, boxFilter, bilateralFilter, medianBlur + */ +CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, + double sigmaX, double sigmaY = 0, + int borderType = BORDER_DEFAULT ); + +/** @brief Applies the bilateral filter to an image. + +The function applies bilateral filtering to the input image, as described in +http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html +bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is +very slow compared to most filters. + +_Sigma values_: For simplicity, you can set the 2 sigma values to be the same. If they are small (\< +10), the filter will not have much effect, whereas if they are large (\> 150), they will have a very +strong effect, making the image look "cartoonish". + +_Filter size_: Large filters (d \> 5) are very slow, so it is recommended to use d=5 for real-time +applications, and perhaps d=9 for offline applications that need heavy noise filtering. + +This filter does not work inplace. +@param src Source 8-bit or floating-point, 1-channel or 3-channel image. +@param dst Destination image of the same size and type as src . +@param d Diameter of each pixel neighborhood that is used during filtering. If it is non-positive, +it is computed from sigmaSpace. +@param sigmaColor Filter sigma in the color space. A larger value of the parameter means that +farther colors within the pixel neighborhood (see sigmaSpace) will be mixed together, resulting +in larger areas of semi-equal color. +@param sigmaSpace Filter sigma in the coordinate space. A larger value of the parameter means that +farther pixels will influence each other as long as their colors are close enough (see sigmaColor +). When d\>0, it specifies the neighborhood size regardless of sigmaSpace. Otherwise, d is +proportional to sigmaSpace. +@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes + */ +CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d, + double sigmaColor, double sigmaSpace, + int borderType = BORDER_DEFAULT ); + +/** @brief Blurs an image using the box filter. + +The function smooths an image using the kernel: + +\f[\texttt{K} = \alpha \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \end{bmatrix}\f] + +where + +\f[\alpha = \begin{cases} \frac{1}{\texttt{ksize.width*ksize.height}} & \texttt{when } \texttt{normalize=true} \\1 & \texttt{otherwise}\end{cases}\f] + +Unnormalized box filter is useful for computing various integral characteristics over each pixel +neighborhood, such as covariance matrices of image derivatives (used in dense optical flow +algorithms, and so on). If you need to compute pixel sums over variable-size windows, use #integral. + +@param src input image. +@param dst output image of the same size and type as src. +@param ddepth the output image depth (-1 to use src.depth()). +@param ksize blurring kernel size. +@param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel +center. +@param normalize flag, specifying whether the kernel is normalized by its area or not. +@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes. #BORDER_WRAP is not supported. +@sa blur, bilateralFilter, GaussianBlur, medianBlur, integral + */ +CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth, + Size ksize, Point anchor = Point(-1,-1), + bool normalize = true, + int borderType = BORDER_DEFAULT ); + +/** @brief Calculates the normalized sum of squares of the pixel values overlapping the filter. + +For every pixel \f$ (x, y) \f$ in the source image, the function calculates the sum of squares of those neighboring +pixel values which overlap the filter placed over the pixel \f$ (x, y) \f$. + +The unnormalized square box filter can be useful in computing local image statistics such as the local +variance and standard deviation around the neighborhood of a pixel. + +@param src input image +@param dst output image of the same size and type as src +@param ddepth the output image depth (-1 to use src.depth()) +@param ksize kernel size +@param anchor kernel anchor point. The default value of Point(-1, -1) denotes that the anchor is at the kernel +center. +@param normalize flag, specifying whether the kernel is to be normalized by it's area or not. +@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes. #BORDER_WRAP is not supported. +@sa boxFilter +*/ +CV_EXPORTS_W void sqrBoxFilter( InputArray src, OutputArray dst, int ddepth, + Size ksize, Point anchor = Point(-1, -1), + bool normalize = true, + int borderType = BORDER_DEFAULT ); + +/** @brief Blurs an image using the normalized box filter. + +The function smooths an image using the kernel: + +\f[\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}\f] + +The call `blur(src, dst, ksize, anchor, borderType)` is equivalent to `boxFilter(src, dst, src.type(), ksize, +anchor, true, borderType)`. + +@param src input image; it can have any number of channels, which are processed independently, but +the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. +@param dst output image of the same size and type as src. +@param ksize blurring kernel size. +@param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel +center. +@param borderType border mode used to extrapolate pixels outside of the image, see #BorderTypes. #BORDER_WRAP is not supported. +@sa boxFilter, bilateralFilter, GaussianBlur, medianBlur + */ +CV_EXPORTS_W void blur( InputArray src, OutputArray dst, + Size ksize, Point anchor = Point(-1,-1), + int borderType = BORDER_DEFAULT ); + +/** @brief Blurs an image using the stackBlur. + +The function applies and stackBlur to an image. +stackBlur can generate similar results as Gaussian blur, and the time consumption does not increase with the increase of kernel size. +It creates a kind of moving stack of colors whilst scanning through the image. Thereby it just has to add one new block of color to the right side +of the stack and remove the leftmost color. The remaining colors on the topmost layer of the stack are either added on or reduced by one, +depending on if they are on the right or on the left side of the stack. The only supported borderType is BORDER_REPLICATE. +Original paper was proposed by Mario Klingemann, which can be found http://underdestruction.com/2004/02/25/stackblur-2004. + +@param src input image. The number of channels can be arbitrary, but the depth should be one of +CV_8U, CV_16U, CV_16S or CV_32F. +@param dst output image of the same size and type as src. +@param ksize stack-blurring kernel size. The ksize.width and ksize.height can differ but they both must be +positive and odd. +*/ +CV_EXPORTS_W void stackBlur(InputArray src, OutputArray dst, Size ksize); + +/** @brief Convolves an image with the kernel. + +The function applies an arbitrary linear filter to an image. In-place operation is supported. When +the aperture is partially outside the image, the function interpolates outlier pixel values +according to the specified border mode. + +The function does actually compute correlation, not the convolution: + +\f[\texttt{dst} (x,y) = \sum _{ \substack{0\leq x' < \texttt{kernel.cols}\\{0\leq y' < \texttt{kernel.rows}}}} \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} )\f] + +That is, the kernel is not mirrored around the anchor point. If you need a real convolution, flip +the kernel using #flip and set the new anchor to `(kernel.cols - anchor.x - 1, kernel.rows - +anchor.y - 1)`. + +The function uses the DFT-based algorithm in case of sufficiently large kernels (~`11 x 11` or +larger) and the direct algorithm for small kernels. + +@param src input image. +@param dst output image of the same size and the same number of channels as src. +@param ddepth desired depth of the destination image, see @ref filter_depths "combinations" +@param kernel convolution kernel (or rather a correlation kernel), a single-channel floating point +matrix; if you want to apply different kernels to different channels, split the image into +separate color planes using split and process them individually. +@param anchor anchor of the kernel that indicates the relative position of a filtered point within +the kernel; the anchor should lie within the kernel; default value (-1,-1) means that the anchor +is at the kernel center. +@param delta optional value added to the filtered pixels before storing them in dst. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@sa sepFilter2D, dft, matchTemplate + */ +CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth, + InputArray kernel, Point anchor = Point(-1,-1), + double delta = 0, int borderType = BORDER_DEFAULT ); + +/** @brief Applies a separable linear filter to an image. + +The function applies a separable linear filter to the image. That is, first, every row of src is +filtered with the 1D kernel kernelX. Then, every column of the result is filtered with the 1D +kernel kernelY. The final result shifted by delta is stored in dst . + +@param src Source image. +@param dst Destination image of the same size and the same number of channels as src . +@param ddepth Destination image depth, see @ref filter_depths "combinations" +@param kernelX Coefficients for filtering each row. +@param kernelY Coefficients for filtering each column. +@param anchor Anchor position within the kernel. The default value \f$(-1,-1)\f$ means that the anchor +is at the kernel center. +@param delta Value added to the filtered results before storing them. +@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@sa filter2D, Sobel, GaussianBlur, boxFilter, blur + */ +CV_EXPORTS_W void sepFilter2D( InputArray src, OutputArray dst, int ddepth, + InputArray kernelX, InputArray kernelY, + Point anchor = Point(-1,-1), + double delta = 0, int borderType = BORDER_DEFAULT ); + +/** @example samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp +Sample code using Sobel and/or Scharr OpenCV functions to make a simple Edge Detector +![Sample screenshot](Sobel_Derivatives_Tutorial_Result.jpg) +Check @ref tutorial_sobel_derivatives "the corresponding tutorial" for more details +*/ + +/** @brief Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. + +In all cases except one, the \f$\texttt{ksize} \times \texttt{ksize}\f$ separable kernel is used to +calculate the derivative. When \f$\texttt{ksize = 1}\f$, the \f$3 \times 1\f$ or \f$1 \times 3\f$ +kernel is used (that is, no Gaussian smoothing is done). `ksize = 1` can only be used for the first +or the second x- or y- derivatives. + +There is also the special value `ksize = #FILTER_SCHARR (-1)` that corresponds to the \f$3\times3\f$ Scharr +filter that may give more accurate results than the \f$3\times3\f$ Sobel. The Scharr aperture is + +\f[\vecthreethree{-3}{0}{3}{-10}{0}{10}{-3}{0}{3}\f] + +for the x-derivative, or transposed for the y-derivative. + +The function calculates an image derivative by convolving the image with the appropriate kernel: + +\f[\texttt{dst} = \frac{\partial^{xorder+yorder} \texttt{src}}{\partial x^{xorder} \partial y^{yorder}}\f] + +The Sobel operators combine Gaussian smoothing and differentiation, so the result is more or less +resistant to the noise. Most often, the function is called with ( xorder = 1, yorder = 0, ksize = 3) +or ( xorder = 0, yorder = 1, ksize = 3) to calculate the first x- or y- image derivative. The first +case corresponds to a kernel of: + +\f[\vecthreethree{-1}{0}{1}{-2}{0}{2}{-1}{0}{1}\f] + +The second case corresponds to a kernel of: + +\f[\vecthreethree{-1}{-2}{-1}{0}{0}{0}{1}{2}{1}\f] + +@param src input image. +@param dst output image of the same size and the same number of channels as src . +@param ddepth output image depth, see @ref filter_depths "combinations"; in the case of + 8-bit input images it will result in truncated derivatives. +@param dx order of the derivative x. +@param dy order of the derivative y. +@param ksize size of the extended Sobel kernel; it must be 1, 3, 5, or 7. +@param scale optional scale factor for the computed derivative values; by default, no scaling is +applied (see #getDerivKernels for details). +@param delta optional delta value that is added to the results prior to storing them in dst. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@sa Scharr, Laplacian, sepFilter2D, filter2D, GaussianBlur, cartToPolar + */ +CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth, + int dx, int dy, int ksize = 3, + double scale = 1, double delta = 0, + int borderType = BORDER_DEFAULT ); + +/** @brief Calculates the first order image derivative in both x and y using a Sobel operator + +Equivalent to calling: + +@code +Sobel( src, dx, CV_16SC1, 1, 0, 3 ); +Sobel( src, dy, CV_16SC1, 0, 1, 3 ); +@endcode + +@param src input image. +@param dx output image with first-order derivative in x. +@param dy output image with first-order derivative in y. +@param ksize size of Sobel kernel. It must be 3. +@param borderType pixel extrapolation method, see #BorderTypes. + Only #BORDER_DEFAULT=#BORDER_REFLECT_101 and #BORDER_REPLICATE are supported. + +@sa Sobel + */ + +CV_EXPORTS_W void spatialGradient( InputArray src, OutputArray dx, + OutputArray dy, int ksize = 3, + int borderType = BORDER_DEFAULT ); + +/** @brief Calculates the first x- or y- image derivative using Scharr operator. + +The function computes the first x- or y- spatial image derivative using the Scharr operator. The +call + +\f[\texttt{Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)}\f] + +is equivalent to + +\f[\texttt{Sobel(src, dst, ddepth, dx, dy, FILTER_SCHARR, scale, delta, borderType)} .\f] + +@param src input image. +@param dst output image of the same size and the same number of channels as src. +@param ddepth output image depth, see @ref filter_depths "combinations" +@param dx order of the derivative x. +@param dy order of the derivative y. +@param scale optional scale factor for the computed derivative values; by default, no scaling is +applied (see #getDerivKernels for details). +@param delta optional delta value that is added to the results prior to storing them in dst. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@sa cartToPolar + */ +CV_EXPORTS_W void Scharr( InputArray src, OutputArray dst, int ddepth, + int dx, int dy, double scale = 1, double delta = 0, + int borderType = BORDER_DEFAULT ); + +/** @example samples/cpp/laplace.cpp +An example using Laplace transformations for edge detection +*/ + +/** @brief Calculates the Laplacian of an image. + +The function calculates the Laplacian of the source image by adding up the second x and y +derivatives calculated using the Sobel operator: + +\f[\texttt{dst} = \Delta \texttt{src} = \frac{\partial^2 \texttt{src}}{\partial x^2} + \frac{\partial^2 \texttt{src}}{\partial y^2}\f] + +This is done when `ksize > 1`. When `ksize == 1`, the Laplacian is computed by filtering the image +with the following \f$3 \times 3\f$ aperture: + +\f[\vecthreethree {0}{1}{0}{1}{-4}{1}{0}{1}{0}\f] + +@param src Source image. +@param dst Destination image of the same size and the same number of channels as src . +@param ddepth Desired depth of the destination image, see @ref filter_depths "combinations". +@param ksize Aperture size used to compute the second-derivative filters. See #getDerivKernels for +details. The size must be positive and odd. +@param scale Optional scale factor for the computed Laplacian values. By default, no scaling is +applied. See #getDerivKernels for details. +@param delta Optional delta value that is added to the results prior to storing them in dst . +@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@sa Sobel, Scharr + */ +CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth, + int ksize = 1, double scale = 1, double delta = 0, + int borderType = BORDER_DEFAULT ); + +//! @} imgproc_filter + +//! @addtogroup imgproc_feature +//! @{ + +/** @example samples/cpp/edge.cpp +This program demonstrates usage of the Canny edge detector + +Check @ref tutorial_canny_detector "the corresponding tutorial" for more details +*/ + +/** @brief Finds edges in an image using the Canny algorithm @cite Canny86 . + +The function finds edges in the input image and marks them in the output map edges using the +Canny algorithm. The smallest value between threshold1 and threshold2 is used for edge linking. The +largest value is used to find initial segments of strong edges. See + + +@param image 8-bit input image. +@param edges output edge map; single channels 8-bit image, which has the same size as image . +@param threshold1 first threshold for the hysteresis procedure. +@param threshold2 second threshold for the hysteresis procedure. +@param apertureSize aperture size for the Sobel operator. +@param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm +\f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude ( +L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough ( +L2gradient=false ). + */ +CV_EXPORTS_W void Canny( InputArray image, OutputArray edges, + double threshold1, double threshold2, + int apertureSize = 3, bool L2gradient = false ); + +/** \overload + +Finds edges in an image using the Canny algorithm with custom image gradient. + +@param dx 16-bit x derivative of input image (CV_16SC1 or CV_16SC3). +@param dy 16-bit y derivative of input image (same type as dx). +@param edges output edge map; single channels 8-bit image, which has the same size as image . +@param threshold1 first threshold for the hysteresis procedure. +@param threshold2 second threshold for the hysteresis procedure. +@param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm +\f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude ( +L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough ( +L2gradient=false ). + */ +CV_EXPORTS_W void Canny( InputArray dx, InputArray dy, + OutputArray edges, + double threshold1, double threshold2, + bool L2gradient = false ); + +/** @brief Calculates the minimal eigenvalue of gradient matrices for corner detection. + +The function is similar to cornerEigenValsAndVecs but it calculates and stores only the minimal +eigenvalue of the covariance matrix of derivatives, that is, \f$\min(\lambda_1, \lambda_2)\f$ in terms +of the formulae in the cornerEigenValsAndVecs description. + +@param src Input single-channel 8-bit or floating-point image. +@param dst Image to store the minimal eigenvalues. It has the type CV_32FC1 and the same size as +src . +@param blockSize Neighborhood size (see the details on #cornerEigenValsAndVecs ). +@param ksize Aperture parameter for the Sobel operator. +@param borderType Pixel extrapolation method. See #BorderTypes. #BORDER_WRAP is not supported. + */ +CV_EXPORTS_W void cornerMinEigenVal( InputArray src, OutputArray dst, + int blockSize, int ksize = 3, + int borderType = BORDER_DEFAULT ); + +/** @brief Harris corner detector. + +The function runs the Harris corner detector on the image. Similarly to cornerMinEigenVal and +cornerEigenValsAndVecs , for each pixel \f$(x, y)\f$ it calculates a \f$2\times2\f$ gradient covariance +matrix \f$M^{(x,y)}\f$ over a \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood. Then, it +computes the following characteristic: + +\f[\texttt{dst} (x,y) = \mathrm{det} M^{(x,y)} - k \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2\f] + +Corners in the image can be found as the local maxima of this response map. + +@param src Input single-channel 8-bit or floating-point image. +@param dst Image to store the Harris detector responses. It has the type CV_32FC1 and the same +size as src . +@param blockSize Neighborhood size (see the details on #cornerEigenValsAndVecs ). +@param ksize Aperture parameter for the Sobel operator. +@param k Harris detector free parameter. See the formula above. +@param borderType Pixel extrapolation method. See #BorderTypes. #BORDER_WRAP is not supported. + */ +CV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize, + int ksize, double k, + int borderType = BORDER_DEFAULT ); + +/** @brief Calculates eigenvalues and eigenvectors of image blocks for corner detection. + +For every pixel \f$p\f$ , the function cornerEigenValsAndVecs considers a blockSize \f$\times\f$ blockSize +neighborhood \f$S(p)\f$ . It calculates the covariation matrix of derivatives over the neighborhood as: + +\f[M = \begin{bmatrix} \sum _{S(p)}(dI/dx)^2 & \sum _{S(p)}dI/dx dI/dy \\ \sum _{S(p)}dI/dx dI/dy & \sum _{S(p)}(dI/dy)^2 \end{bmatrix}\f] + +where the derivatives are computed using the Sobel operator. + +After that, it finds eigenvectors and eigenvalues of \f$M\f$ and stores them in the destination image as +\f$(\lambda_1, \lambda_2, x_1, y_1, x_2, y_2)\f$ where + +- \f$\lambda_1, \lambda_2\f$ are the non-sorted eigenvalues of \f$M\f$ +- \f$x_1, y_1\f$ are the eigenvectors corresponding to \f$\lambda_1\f$ +- \f$x_2, y_2\f$ are the eigenvectors corresponding to \f$\lambda_2\f$ + +The output of the function can be used for robust edge or corner detection. + +@param src Input single-channel 8-bit or floating-point image. +@param dst Image to store the results. It has the same size as src and the type CV_32FC(6) . +@param blockSize Neighborhood size (see details below). +@param ksize Aperture parameter for the Sobel operator. +@param borderType Pixel extrapolation method. See #BorderTypes. #BORDER_WRAP is not supported. + +@sa cornerMinEigenVal, cornerHarris, preCornerDetect + */ +CV_EXPORTS_W void cornerEigenValsAndVecs( InputArray src, OutputArray dst, + int blockSize, int ksize, + int borderType = BORDER_DEFAULT ); + +/** @brief Calculates a feature map for corner detection. + +The function calculates the complex spatial derivative-based function of the source image + +\f[\texttt{dst} = (D_x \texttt{src} )^2 \cdot D_{yy} \texttt{src} + (D_y \texttt{src} )^2 \cdot D_{xx} \texttt{src} - 2 D_x \texttt{src} \cdot D_y \texttt{src} \cdot D_{xy} \texttt{src}\f] + +where \f$D_x\f$,\f$D_y\f$ are the first image derivatives, \f$D_{xx}\f$,\f$D_{yy}\f$ are the second image +derivatives, and \f$D_{xy}\f$ is the mixed derivative. + +The corners can be found as local maximums of the functions, as shown below: +@code + Mat corners, dilated_corners; + preCornerDetect(image, corners, 3); + // dilation with 3x3 rectangular structuring element + dilate(corners, dilated_corners, Mat(), 1); + Mat corner_mask = corners == dilated_corners; +@endcode + +@param src Source single-channel 8-bit of floating-point image. +@param dst Output image that has the type CV_32F and the same size as src . +@param ksize %Aperture size of the Sobel . +@param borderType Pixel extrapolation method. See #BorderTypes. #BORDER_WRAP is not supported. + */ +CV_EXPORTS_W void preCornerDetect( InputArray src, OutputArray dst, int ksize, + int borderType = BORDER_DEFAULT ); + +/** @brief Refines the corner locations. + +The function iterates to find the sub-pixel accurate location of corners or radial saddle +points as described in @cite forstner1987fast, and as shown on the figure below. + +![image](pics/cornersubpix.png) + +Sub-pixel accurate corner locator is based on the observation that every vector from the center \f$q\f$ +to a point \f$p\f$ located within a neighborhood of \f$q\f$ is orthogonal to the image gradient at \f$p\f$ +subject to image and measurement noise. Consider the expression: + +\f[\epsilon _i = {DI_{p_i}}^T \cdot (q - p_i)\f] + +where \f${DI_{p_i}}\f$ is an image gradient at one of the points \f$p_i\f$ in a neighborhood of \f$q\f$ . The +value of \f$q\f$ is to be found so that \f$\epsilon_i\f$ is minimized. A system of equations may be set up +with \f$\epsilon_i\f$ set to zero: + +\f[\sum _i(DI_{p_i} \cdot {DI_{p_i}}^T) \cdot q - \sum _i(DI_{p_i} \cdot {DI_{p_i}}^T \cdot p_i)\f] + +where the gradients are summed within a neighborhood ("search window") of \f$q\f$ . Calling the first +gradient term \f$G\f$ and the second gradient term \f$b\f$ gives: + +\f[q = G^{-1} \cdot b\f] + +The algorithm sets the center of the neighborhood window at this new center \f$q\f$ and then iterates +until the center stays within a set threshold. + +@param image Input single-channel, 8-bit or float image. +@param corners Initial coordinates of the input corners and refined coordinates provided for +output. +@param winSize Half of the side length of the search window. For example, if winSize=Size(5,5) , +then a \f$(5*2+1) \times (5*2+1) = 11 \times 11\f$ search window is used. +@param zeroZone Half of the size of the dead region in the middle of the search zone over which +the summation in the formula below is not done. It is used sometimes to avoid possible +singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such +a size. +@param criteria Criteria for termination of the iterative process of corner refinement. That is, +the process of corner position refinement stops either after criteria.maxCount iterations or when +the corner position moves by less than criteria.epsilon on some iteration. + */ +CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners, + Size winSize, Size zeroZone, + TermCriteria criteria ); + +/** @brief Determines strong corners on an image. + +The function finds the most prominent corners in the image or in the specified image region, as +described in @cite Shi94 + +- Function calculates the corner quality measure at every source image pixel using the + #cornerMinEigenVal or #cornerHarris . +- Function performs a non-maximum suppression (the local maximums in *3 x 3* neighborhood are + retained). +- The corners with the minimal eigenvalue less than + \f$\texttt{qualityLevel} \cdot \max_{x,y} qualityMeasureMap(x,y)\f$ are rejected. +- The remaining corners are sorted by the quality measure in the descending order. +- Function throws away each corner for which there is a stronger corner at a distance less than + maxDistance. + +The function can be used to initialize a point-based tracker of an object. + +@note If the function is called with different values A and B of the parameter qualityLevel , and +A \> B, the vector of returned corners with qualityLevel=A will be the prefix of the output vector +with qualityLevel=B . + +@param image Input 8-bit or floating-point 32-bit, single-channel image. +@param corners Output vector of detected corners. +@param maxCorners Maximum number of corners to return. If there are more corners than are found, +the strongest of them is returned. `maxCorners <= 0` implies that no limit on the maximum is set +and all detected corners are returned. +@param qualityLevel Parameter characterizing the minimal accepted quality of image corners. The +parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue +(see #cornerMinEigenVal ) or the Harris function response (see #cornerHarris ). The corners with the +quality measure less than the product are rejected. For example, if the best corner has the +quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure +less than 15 are rejected. +@param minDistance Minimum possible Euclidean distance between the returned corners. +@param mask Optional region of interest. If the image is not empty (it needs to have the type +CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected. +@param blockSize Size of an average block for computing a derivative covariation matrix over each +pixel neighborhood. See cornerEigenValsAndVecs . +@param useHarrisDetector Parameter indicating whether to use a Harris detector (see #cornerHarris) +or #cornerMinEigenVal. +@param k Free parameter of the Harris detector. + +@sa cornerMinEigenVal, cornerHarris, calcOpticalFlowPyrLK, estimateRigidTransform, + */ + +CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners, + int maxCorners, double qualityLevel, double minDistance, + InputArray mask = noArray(), int blockSize = 3, + bool useHarrisDetector = false, double k = 0.04 ); + +CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners, + int maxCorners, double qualityLevel, double minDistance, + InputArray mask, int blockSize, + int gradientSize, bool useHarrisDetector = false, + double k = 0.04 ); + +/** @brief Same as above, but returns also quality measure of the detected corners. + +@param image Input 8-bit or floating-point 32-bit, single-channel image. +@param corners Output vector of detected corners. +@param maxCorners Maximum number of corners to return. If there are more corners than are found, +the strongest of them is returned. `maxCorners <= 0` implies that no limit on the maximum is set +and all detected corners are returned. +@param qualityLevel Parameter characterizing the minimal accepted quality of image corners. The +parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue +(see #cornerMinEigenVal ) or the Harris function response (see #cornerHarris ). The corners with the +quality measure less than the product are rejected. For example, if the best corner has the +quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure +less than 15 are rejected. +@param minDistance Minimum possible Euclidean distance between the returned corners. +@param mask Region of interest. If the image is not empty (it needs to have the type +CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected. +@param cornersQuality Output vector of quality measure of the detected corners. +@param blockSize Size of an average block for computing a derivative covariation matrix over each +pixel neighborhood. See cornerEigenValsAndVecs . +@param gradientSize Aperture parameter for the Sobel operator used for derivatives computation. +See cornerEigenValsAndVecs . +@param useHarrisDetector Parameter indicating whether to use a Harris detector (see #cornerHarris) +or #cornerMinEigenVal. +@param k Free parameter of the Harris detector. + */ +CV_EXPORTS CV_WRAP_AS(goodFeaturesToTrackWithQuality) void goodFeaturesToTrack( + InputArray image, OutputArray corners, + int maxCorners, double qualityLevel, double minDistance, + InputArray mask, OutputArray cornersQuality, int blockSize = 3, + int gradientSize = 3, bool useHarrisDetector = false, double k = 0.04); + +/** @example samples/cpp/tutorial_code/ImgTrans/houghlines.cpp +An example using the Hough line detector +![Sample input image](Hough_Lines_Tutorial_Original_Image.jpg) ![Output image](Hough_Lines_Tutorial_Result.jpg) +*/ + +/** @brief Finds lines in a binary image using the standard Hough transform. + +The function implements the standard or standard multi-scale Hough transform algorithm for line +detection. See for a good explanation of Hough +transform. + +@param image 8-bit, single-channel binary source image. The image may be modified by the function. +@param lines Output vector of lines. Each line is represented by a 2 or 3 element vector +\f$(\rho, \theta)\f$ or \f$(\rho, \theta, \textrm{votes})\f$, where \f$\rho\f$ is the distance from +the coordinate origin \f$(0,0)\f$ (top-left corner of the image), \f$\theta\f$ is the line rotation +angle in radians ( \f$0 \sim \textrm{vertical line}, \pi/2 \sim \textrm{horizontal line}\f$ ), and +\f$\textrm{votes}\f$ is the value of accumulator. +@param rho Distance resolution of the accumulator in pixels. +@param theta Angle resolution of the accumulator in radians. +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough +votes ( \f$>\texttt{threshold}\f$ ). +@param srn For the multi-scale Hough transform, it is a divisor for the distance resolution rho. +The coarse accumulator distance resolution is rho and the accurate accumulator resolution is +rho/srn. If both srn=0 and stn=0, the classical Hough transform is used. Otherwise, both these +parameters should be positive. +@param stn For the multi-scale Hough transform, it is a divisor for the distance resolution theta. +@param min_theta For standard and multi-scale Hough transform, minimum angle to check for lines. +Must fall between 0 and max_theta. +@param max_theta For standard and multi-scale Hough transform, an upper bound for the angle. +Must fall between min_theta and CV_PI. The actual maximum angle in the accumulator may be slightly +less than max_theta, depending on the parameters min_theta and theta. + */ +CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines, + double rho, double theta, int threshold, + double srn = 0, double stn = 0, + double min_theta = 0, double max_theta = CV_PI ); + +/** @brief Finds line segments in a binary image using the probabilistic Hough transform. + +The function implements the probabilistic Hough transform algorithm for line detection, described +in @cite Matas00 + +See the line detection example below: +@include snippets/imgproc_HoughLinesP.cpp +This is a sample picture the function parameters have been tuned for: + +![image](pics/building.jpg) + +And this is the output of the above program in case of the probabilistic Hough transform: + +![image](pics/houghp.png) + +@param image 8-bit, single-channel binary source image. The image may be modified by the function. +@param lines Output vector of lines. Each line is represented by a 4-element vector +\f$(x_1, y_1, x_2, y_2)\f$ , where \f$(x_1,y_1)\f$ and \f$(x_2, y_2)\f$ are the ending points of each detected +line segment. +@param rho Distance resolution of the accumulator in pixels. +@param theta Angle resolution of the accumulator in radians. +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough +votes ( \f$>\texttt{threshold}\f$ ). +@param minLineLength Minimum line length. Line segments shorter than that are rejected. +@param maxLineGap Maximum allowed gap between points on the same line to link them. + +@sa LineSegmentDetector + */ +CV_EXPORTS_W void HoughLinesP( InputArray image, OutputArray lines, + double rho, double theta, int threshold, + double minLineLength = 0, double maxLineGap = 0 ); + +/** @brief Finds lines in a set of points using the standard Hough transform. + +The function finds lines in a set of points using a modification of the Hough transform. +@include snippets/imgproc_HoughLinesPointSet.cpp +@param point Input vector of points. Each vector must be encoded as a Point vector \f$(x,y)\f$. Type must be CV_32FC2 or CV_32SC2. +@param lines Output vector of found lines. Each vector is encoded as a vector \f$(votes, rho, theta)\f$. +The larger the value of 'votes', the higher the reliability of the Hough line. +@param lines_max Max count of Hough lines. +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough +votes ( \f$>\texttt{threshold}\f$ ). +@param min_rho Minimum value for \f$\rho\f$ for the accumulator (Note: \f$\rho\f$ can be negative. The absolute value \f$|\rho|\f$ is the distance of a line to the origin.). +@param max_rho Maximum value for \f$\rho\f$ for the accumulator. +@param rho_step Distance resolution of the accumulator. +@param min_theta Minimum angle value of the accumulator in radians. +@param max_theta Upper bound for the angle value of the accumulator in radians. The actual maximum +angle may be slightly less than max_theta, depending on the parameters min_theta and theta_step. +@param theta_step Angle resolution of the accumulator in radians. + */ +CV_EXPORTS_W void HoughLinesPointSet( InputArray point, OutputArray lines, int lines_max, int threshold, + double min_rho, double max_rho, double rho_step, + double min_theta, double max_theta, double theta_step ); + +/** @example samples/cpp/tutorial_code/ImgTrans/houghcircles.cpp +An example using the Hough circle detector +*/ + +/** @brief Finds circles in a grayscale image using the Hough transform. + +The function finds circles in a grayscale image using a modification of the Hough transform. + +Example: : +@include snippets/imgproc_HoughLinesCircles.cpp + +@note Usually the function detects the centers of circles well. However, it may fail to find correct +radii. You can assist to the function by specifying the radius range ( minRadius and maxRadius ) if +you know it. Or, in the case of #HOUGH_GRADIENT method you may set maxRadius to a negative number +to return centers only without radius search, and find the correct radius using an additional procedure. + +It also helps to smooth image a bit unless it's already soft. For example, +GaussianBlur() with 7x7 kernel and 1.5x1.5 sigma or similar blurring may help. + +@param image 8-bit, single-channel, grayscale input image. +@param circles Output vector of found circles. Each vector is encoded as 3 or 4 element +floating-point vector \f$(x, y, radius)\f$ or \f$(x, y, radius, votes)\f$ . +@param method Detection method, see #HoughModes. The available methods are #HOUGH_GRADIENT and #HOUGH_GRADIENT_ALT. +@param dp Inverse ratio of the accumulator resolution to the image resolution. For example, if +dp=1 , the accumulator has the same resolution as the input image. If dp=2 , the accumulator has +half as big width and height. For #HOUGH_GRADIENT_ALT the recommended value is dp=1.5, +unless some small very circles need to be detected. +@param minDist Minimum distance between the centers of the detected circles. If the parameter is +too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is +too large, some circles may be missed. +@param param1 First method-specific parameter. In case of #HOUGH_GRADIENT and #HOUGH_GRADIENT_ALT, +it is the higher threshold of the two passed to the Canny edge detector (the lower one is twice smaller). +Note that #HOUGH_GRADIENT_ALT uses #Scharr algorithm to compute image derivatives, so the threshold value +shough normally be higher, such as 300 or normally exposed and contrasty images. +@param param2 Second method-specific parameter. In case of #HOUGH_GRADIENT, it is the +accumulator threshold for the circle centers at the detection stage. The smaller it is, the more +false circles may be detected. Circles, corresponding to the larger accumulator values, will be +returned first. In the case of #HOUGH_GRADIENT_ALT algorithm, this is the circle "perfectness" measure. +The closer it to 1, the better shaped circles algorithm selects. In most cases 0.9 should be fine. +If you want get better detection of small circles, you may decrease it to 0.85, 0.8 or even less. +But then also try to limit the search range [minRadius, maxRadius] to avoid many false circles. +@param minRadius Minimum circle radius. +@param maxRadius Maximum circle radius. If <= 0, uses the maximum image dimension. If < 0, #HOUGH_GRADIENT returns +centers without finding the radius. #HOUGH_GRADIENT_ALT always computes circle radiuses. + +@sa fitEllipse, minEnclosingCircle + */ +CV_EXPORTS_W void HoughCircles( InputArray image, OutputArray circles, + int method, double dp, double minDist, + double param1 = 100, double param2 = 100, + int minRadius = 0, int maxRadius = 0 ); + +//! @} imgproc_feature + +//! @addtogroup imgproc_filter +//! @{ + +/** @example samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp +Advanced morphology Transformations sample code +![Sample screenshot](Morphology_2_Tutorial_Result.jpg) +Check @ref tutorial_opening_closing_hats "the corresponding tutorial" for more details +*/ + +/** @brief Erodes an image by using a specific structuring element. + +The function erodes the source image using the specified structuring element that determines the +shape of a pixel neighborhood over which the minimum is taken: + +\f[\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] + +The function supports the in-place mode. Erosion can be applied several ( iterations ) times. In +case of multi-channel images, each channel is processed independently. + +@param src input image; the number of channels can be arbitrary, but the depth should be one of +CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. +@param dst output image of the same size and type as src. +@param kernel structuring element used for erosion; if `element=Mat()`, a `3 x 3` rectangular +structuring element is used. Kernel can be created using #getStructuringElement. +@param anchor position of the anchor within the element; default value (-1, -1) means that the +anchor is at the element center. +@param iterations number of times erosion is applied. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@param borderValue border value in case of a constant border +@sa dilate, morphologyEx, getStructuringElement + */ +CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel, + Point anchor = Point(-1,-1), int iterations = 1, + int borderType = BORDER_CONSTANT, + const Scalar& borderValue = morphologyDefaultBorderValue() ); + +/** @example samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp +Erosion and Dilation sample code +![Sample Screenshot-Erosion](Morphology_1_Tutorial_Erosion_Result.jpg)![Sample Screenshot-Dilation](Morphology_1_Tutorial_Dilation_Result.jpg) +Check @ref tutorial_erosion_dilatation "the corresponding tutorial" for more details +*/ + +/** @brief Dilates an image by using a specific structuring element. + +The function dilates the source image using the specified structuring element that determines the +shape of a pixel neighborhood over which the maximum is taken: +\f[\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\f] + +The function supports the in-place mode. Dilation can be applied several ( iterations ) times. In +case of multi-channel images, each channel is processed independently. + +@param src input image; the number of channels can be arbitrary, but the depth should be one of +CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. +@param dst output image of the same size and type as src. +@param kernel structuring element used for dilation; if element=Mat(), a 3 x 3 rectangular +structuring element is used. Kernel can be created using #getStructuringElement +@param anchor position of the anchor within the element; default value (-1, -1) means that the +anchor is at the element center. +@param iterations number of times dilation is applied. +@param borderType pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not suported. +@param borderValue border value in case of a constant border +@sa erode, morphologyEx, getStructuringElement + */ +CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel, + Point anchor = Point(-1,-1), int iterations = 1, + int borderType = BORDER_CONSTANT, + const Scalar& borderValue = morphologyDefaultBorderValue() ); + +/** @brief Performs advanced morphological transformations. + +The function cv::morphologyEx can perform advanced morphological transformations using an erosion and dilation as +basic operations. + +Any of the operations can be done in-place. In case of multi-channel images, each channel is +processed independently. + +@param src Source image. The number of channels can be arbitrary. The depth should be one of +CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. +@param dst Destination image of the same size and type as source image. +@param op Type of a morphological operation, see #MorphTypes +@param kernel Structuring element. It can be created using #getStructuringElement. +@param anchor Anchor position with the kernel. Negative values mean that the anchor is at the +kernel center. +@param iterations Number of times erosion and dilation are applied. +@param borderType Pixel extrapolation method, see #BorderTypes. #BORDER_WRAP is not supported. +@param borderValue Border value in case of a constant border. The default value has a special +meaning. +@sa dilate, erode, getStructuringElement +@note The number of iterations is the number of times erosion or dilatation operation will be applied. +For instance, an opening operation (#MORPH_OPEN) with two iterations is equivalent to apply +successively: erode -> erode -> dilate -> dilate (and not erode -> dilate -> erode -> dilate). + */ +CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst, + int op, InputArray kernel, + Point anchor = Point(-1,-1), int iterations = 1, + int borderType = BORDER_CONSTANT, + const Scalar& borderValue = morphologyDefaultBorderValue() ); + +//! @} imgproc_filter + +//! @addtogroup imgproc_transform +//! @{ + +/** @brief Resizes an image. + +The function resize resizes the image src down to or up to the specified size. Note that the +initial dst type or size are not taken into account. Instead, the size and type are derived from +the `src`,`dsize`,`fx`, and `fy`. If you want to resize src so that it fits the pre-created dst, +you may call the function as follows: +@code + // explicitly specify dsize=dst.size(); fx and fy will be computed from that. + resize(src, dst, dst.size(), 0, 0, interpolation); +@endcode +If you want to decimate the image by factor of 2 in each direction, you can call the function this +way: +@code + // specify fx and fy and let the function compute the destination image size. + resize(src, dst, Size(), 0.5, 0.5, interpolation); +@endcode +To shrink an image, it will generally look best with #INTER_AREA interpolation, whereas to +enlarge an image, it will generally look best with #INTER_CUBIC (slow) or #INTER_LINEAR +(faster but still looks OK). + +@param src input image. +@param dst output image; it has the size dsize (when it is non-zero) or the size computed from +src.size(), fx, and fy; the type of dst is the same as of src. +@param dsize output image size; if it equals zero (`None` in Python), it is computed as: + \f[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\f] + Either dsize or both fx and fy must be non-zero. +@param fx scale factor along the horizontal axis; when it equals 0, it is computed as +\f[\texttt{(double)dsize.width/src.cols}\f] +@param fy scale factor along the vertical axis; when it equals 0, it is computed as +\f[\texttt{(double)dsize.height/src.rows}\f] +@param interpolation interpolation method, see #InterpolationFlags + +@sa warpAffine, warpPerspective, remap + */ +CV_EXPORTS_W void resize( InputArray src, OutputArray dst, + Size dsize, double fx = 0, double fy = 0, + int interpolation = INTER_LINEAR ); + +/** @brief Applies an affine transformation to an image. + +The function warpAffine transforms the source image using the specified matrix: + +\f[\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})\f] + +when the flag #WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted +with #invertAffineTransform and then put in the formula above instead of M. The function cannot +operate in-place. + +@param src input image. +@param dst output image that has the size dsize and the same type as src . +@param M \f$2\times 3\f$ transformation matrix. +@param dsize size of the output image. +@param flags combination of interpolation methods (see #InterpolationFlags) and the optional +flag #WARP_INVERSE_MAP that means that M is the inverse transformation ( +\f$\texttt{dst}\rightarrow\texttt{src}\f$ ). +@param borderMode pixel extrapolation method (see #BorderTypes); when +borderMode=#BORDER_TRANSPARENT, it means that the pixels in the destination image corresponding to +the "outliers" in the source image are not modified by the function. +@param borderValue value used in case of a constant border; by default, it is 0. + +@sa warpPerspective, resize, remap, getRectSubPix, transform + */ +CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst, + InputArray M, Size dsize, + int flags = INTER_LINEAR, + int borderMode = BORDER_CONSTANT, + const Scalar& borderValue = Scalar()); + +/** @example samples/cpp/warpPerspective_demo.cpp +An example program shows using cv::getPerspectiveTransform and cv::warpPerspective for image warping +*/ + +/** @brief Applies a perspective transformation to an image. + +The function warpPerspective transforms the source image using the specified matrix: + +\f[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , + \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\f] + +when the flag #WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with invert +and then put in the formula above instead of M. The function cannot operate in-place. + +@param src input image. +@param dst output image that has the size dsize and the same type as src . +@param M \f$3\times 3\f$ transformation matrix. +@param dsize size of the output image. +@param flags combination of interpolation methods (#INTER_LINEAR or #INTER_NEAREST) and the +optional flag #WARP_INVERSE_MAP, that sets M as the inverse transformation ( +\f$\texttt{dst}\rightarrow\texttt{src}\f$ ). +@param borderMode pixel extrapolation method (#BORDER_CONSTANT or #BORDER_REPLICATE). +@param borderValue value used in case of a constant border; by default, it equals 0. + +@sa warpAffine, resize, remap, getRectSubPix, perspectiveTransform + */ +CV_EXPORTS_W void warpPerspective( InputArray src, OutputArray dst, + InputArray M, Size dsize, + int flags = INTER_LINEAR, + int borderMode = BORDER_CONSTANT, + const Scalar& borderValue = Scalar()); + +/** @brief Applies a generic geometrical transformation to an image. + +The function remap transforms the source image using the specified map: + +\f[\texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y))\f] + +where values of pixels with non-integer coordinates are computed using one of available +interpolation methods. \f$map_x\f$ and \f$map_y\f$ can be encoded as separate floating-point maps +in \f$map_1\f$ and \f$map_2\f$ respectively, or interleaved floating-point maps of \f$(x,y)\f$ in +\f$map_1\f$, or fixed-point maps created by using #convertMaps. The reason you might want to +convert from floating to fixed-point representations of a map is that they can yield much faster +(\~2x) remapping operations. In the converted case, \f$map_1\f$ contains pairs (cvFloor(x), +cvFloor(y)) and \f$map_2\f$ contains indices in a table of interpolation coefficients. + +This function cannot operate in-place. + +@param src Source image. +@param dst Destination image. It has the same size as map1 and the same type as src . +@param map1 The first map of either (x,y) points or just x values having the type CV_16SC2 , +CV_32FC1, or CV_32FC2. See #convertMaps for details on converting a floating point +representation to fixed-point for speed. +@param map2 The second map of y values having the type CV_16UC1, CV_32FC1, or none (empty map +if map1 is (x,y) points), respectively. +@param interpolation Interpolation method (see #InterpolationFlags). The methods #INTER_AREA +and #INTER_LINEAR_EXACT are not supported by this function. +@param borderMode Pixel extrapolation method (see #BorderTypes). When +borderMode=#BORDER_TRANSPARENT, it means that the pixels in the destination image that +corresponds to the "outliers" in the source image are not modified by the function. +@param borderValue Value used in case of a constant border. By default, it is 0. +@note +Due to current implementation limitations the size of an input and output images should be less than 32767x32767. + */ +CV_EXPORTS_W void remap( InputArray src, OutputArray dst, + InputArray map1, InputArray map2, + int interpolation, int borderMode = BORDER_CONSTANT, + const Scalar& borderValue = Scalar()); + +/** @brief Converts image transformation maps from one representation to another. + +The function converts a pair of maps for remap from one representation to another. The following +options ( (map1.type(), map2.type()) \f$\rightarrow\f$ (dstmap1.type(), dstmap2.type()) ) are +supported: + +- \f$\texttt{(CV_32FC1, CV_32FC1)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}\f$. This is the +most frequently used conversion operation, in which the original floating-point maps (see #remap) +are converted to a more compact and much faster fixed-point representation. The first output array +contains the rounded coordinates and the second array (created only when nninterpolation=false ) +contains indices in the interpolation tables. + +- \f$\texttt{(CV_32FC2)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}\f$. The same as above but +the original maps are stored in one 2-channel matrix. + +- Reverse conversion. Obviously, the reconstructed floating-point maps will not be exactly the same +as the originals. + +@param map1 The first input map of type CV_16SC2, CV_32FC1, or CV_32FC2 . +@param map2 The second input map of type CV_16UC1, CV_32FC1, or none (empty matrix), +respectively. +@param dstmap1 The first output map that has the type dstmap1type and the same size as src . +@param dstmap2 The second output map. +@param dstmap1type Type of the first output map that should be CV_16SC2, CV_32FC1, or +CV_32FC2 . +@param nninterpolation Flag indicating whether the fixed-point maps are used for the +nearest-neighbor or for a more complex interpolation. + +@sa remap, undistort, initUndistortRectifyMap + */ +CV_EXPORTS_W void convertMaps( InputArray map1, InputArray map2, + OutputArray dstmap1, OutputArray dstmap2, + int dstmap1type, bool nninterpolation = false ); + +/** @brief Calculates an affine matrix of 2D rotation. + +The function calculates the following matrix: + +\f[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}\f] + +where + +\f[\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}\f] + +The transformation maps the rotation center to itself. If this is not the target, adjust the shift. + +@param center Center of the rotation in the source image. +@param angle Rotation angle in degrees. Positive values mean counter-clockwise rotation (the +coordinate origin is assumed to be the top-left corner). +@param scale Isotropic scale factor. + +@sa getAffineTransform, warpAffine, transform + */ +CV_EXPORTS_W Mat getRotationMatrix2D(Point2f center, double angle, double scale); + +/** @sa getRotationMatrix2D */ +CV_EXPORTS Matx23d getRotationMatrix2D_(Point2f center, double angle, double scale); + +inline +Mat getRotationMatrix2D(Point2f center, double angle, double scale) +{ + return Mat(getRotationMatrix2D_(center, angle, scale), true); +} + +/** @brief Calculates an affine transform from three pairs of the corresponding points. + +The function calculates the \f$2 \times 3\f$ matrix of an affine transform so that: + +\f[\begin{bmatrix} x'_i \\ y'_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\f] + +where + +\f[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2\f] + +@param src Coordinates of triangle vertices in the source image. +@param dst Coordinates of the corresponding triangle vertices in the destination image. + +@sa warpAffine, transform + */ +CV_EXPORTS Mat getAffineTransform( const Point2f src[], const Point2f dst[] ); + +/** @brief Inverts an affine transformation. + +The function computes an inverse affine transformation represented by \f$2 \times 3\f$ matrix M: + +\f[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ a_{21} & a_{22} & b_2 \end{bmatrix}\f] + +The result is also a \f$2 \times 3\f$ matrix of the same type as M. + +@param M Original affine transformation. +@param iM Output reverse affine transformation. + */ +CV_EXPORTS_W void invertAffineTransform( InputArray M, OutputArray iM ); + +/** @brief Calculates a perspective transform from four pairs of the corresponding points. + +The function calculates the \f$3 \times 3\f$ matrix of a perspective transform so that: + +\f[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\f] + +where + +\f[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\f] + +@param src Coordinates of quadrangle vertices in the source image. +@param dst Coordinates of the corresponding quadrangle vertices in the destination image. +@param solveMethod method passed to cv::solve (#DecompTypes) + +@sa findHomography, warpPerspective, perspectiveTransform + */ +CV_EXPORTS_W Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU); + +/** @overload */ +CV_EXPORTS Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU); + + +CV_EXPORTS_W Mat getAffineTransform( InputArray src, InputArray dst ); + +/** @brief Retrieves a pixel rectangle from an image with sub-pixel accuracy. + +The function getRectSubPix extracts pixels from src: + +\f[patch(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)*0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)*0.5)\f] + +where the values of the pixels at non-integer coordinates are retrieved using bilinear +interpolation. Every channel of multi-channel images is processed independently. Also +the image should be a single channel or three channel image. While the center of the +rectangle must be inside the image, parts of the rectangle may be outside. + +@param image Source image. +@param patchSize Size of the extracted patch. +@param center Floating point coordinates of the center of the extracted rectangle within the +source image. The center must be inside the image. +@param patch Extracted patch that has the size patchSize and the same number of channels as src . +@param patchType Depth of the extracted pixels. By default, they have the same depth as src . + +@sa warpAffine, warpPerspective + */ +CV_EXPORTS_W void getRectSubPix( InputArray image, Size patchSize, + Point2f center, OutputArray patch, int patchType = -1 ); + +/** @example samples/cpp/polar_transforms.cpp +An example using the cv::linearPolar and cv::logPolar operations +*/ + +/** @brief Remaps an image to semilog-polar coordinates space. + +@deprecated This function produces same result as cv::warpPolar(src, dst, src.size(), center, maxRadius, flags+WARP_POLAR_LOG); + +@internal +Transform the source image using the following transformation (See @ref polar_remaps_reference_image "Polar remaps reference image d)"): +\f[\begin{array}{l} + dst( \rho , \phi ) = src(x,y) \\ + dst.size() \leftarrow src.size() +\end{array}\f] + +where +\f[\begin{array}{l} + I = (dx,dy) = (x - center.x,y - center.y) \\ + \rho = M \cdot log_e(\texttt{magnitude} (I)) ,\\ + \phi = Kangle \cdot \texttt{angle} (I) \\ +\end{array}\f] + +and +\f[\begin{array}{l} + M = src.cols / log_e(maxRadius) \\ + Kangle = src.rows / 2\Pi \\ +\end{array}\f] + +The function emulates the human "foveal" vision and can be used for fast scale and +rotation-invariant template matching, for object tracking and so forth. +@param src Source image +@param dst Destination image. It will have same size and type as src. +@param center The transformation center; where the output precision is maximal +@param M Magnitude scale parameter. It determines the radius of the bounding circle to transform too. +@param flags A combination of interpolation methods, see #InterpolationFlags + +@note +- The function can not operate in-place. +- To calculate magnitude and angle in degrees #cartToPolar is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees. + +@sa cv::linearPolar +@endinternal +*/ +CV_EXPORTS_W void logPolar( InputArray src, OutputArray dst, + Point2f center, double M, int flags ); + +/** @brief Remaps an image to polar coordinates space. + +@deprecated This function produces same result as cv::warpPolar(src, dst, src.size(), center, maxRadius, flags) + +@internal +Transform the source image using the following transformation (See @ref polar_remaps_reference_image "Polar remaps reference image c)"): +\f[\begin{array}{l} + dst( \rho , \phi ) = src(x,y) \\ + dst.size() \leftarrow src.size() +\end{array}\f] + +where +\f[\begin{array}{l} + I = (dx,dy) = (x - center.x,y - center.y) \\ + \rho = Kmag \cdot \texttt{magnitude} (I) ,\\ + \phi = angle \cdot \texttt{angle} (I) +\end{array}\f] + +and +\f[\begin{array}{l} + Kx = src.cols / maxRadius \\ + Ky = src.rows / 2\Pi +\end{array}\f] + + +@param src Source image +@param dst Destination image. It will have same size and type as src. +@param center The transformation center; +@param maxRadius The radius of the bounding circle to transform. It determines the inverse magnitude scale parameter too. +@param flags A combination of interpolation methods, see #InterpolationFlags + +@note +- The function can not operate in-place. +- To calculate magnitude and angle in degrees #cartToPolar is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees. + +@sa cv::logPolar +@endinternal +*/ +CV_EXPORTS_W void linearPolar( InputArray src, OutputArray dst, + Point2f center, double maxRadius, int flags ); + + +/** \brief Remaps an image to polar or semilog-polar coordinates space + +@anchor polar_remaps_reference_image +![Polar remaps reference](pics/polar_remap_doc.png) + +Transform the source image using the following transformation: +\f[ +dst(\rho , \phi ) = src(x,y) +\f] + +where +\f[ +\begin{array}{l} +\vec{I} = (x - center.x, \;y - center.y) \\ +\phi = Kangle \cdot \texttt{angle} (\vec{I}) \\ +\rho = \left\{\begin{matrix} +Klin \cdot \texttt{magnitude} (\vec{I}) & default \\ +Klog \cdot log_e(\texttt{magnitude} (\vec{I})) & if \; semilog \\ +\end{matrix}\right. +\end{array} +\f] + +and +\f[ +\begin{array}{l} +Kangle = dsize.height / 2\Pi \\ +Klin = dsize.width / maxRadius \\ +Klog = dsize.width / log_e(maxRadius) \\ +\end{array} +\f] + + +\par Linear vs semilog mapping + +Polar mapping can be linear or semi-log. Add one of #WarpPolarMode to `flags` to specify the polar mapping mode. + +Linear is the default mode. + +The semilog mapping emulates the human "foveal" vision that permit very high acuity on the line of sight (central vision) +in contrast to peripheral vision where acuity is minor. + +\par Option on `dsize`: + +- if both values in `dsize <=0 ` (default), +the destination image will have (almost) same area of source bounding circle: +\f[\begin{array}{l} +dsize.area \leftarrow (maxRadius^2 \cdot \Pi) \\ +dsize.width = \texttt{cvRound}(maxRadius) \\ +dsize.height = \texttt{cvRound}(maxRadius \cdot \Pi) \\ +\end{array}\f] + + +- if only `dsize.height <= 0`, +the destination image area will be proportional to the bounding circle area but scaled by `Kx * Kx`: +\f[\begin{array}{l} +dsize.height = \texttt{cvRound}(dsize.width \cdot \Pi) \\ +\end{array} +\f] + +- if both values in `dsize > 0 `, +the destination image will have the given size therefore the area of the bounding circle will be scaled to `dsize`. + + +\par Reverse mapping + +You can get reverse mapping adding #WARP_INVERSE_MAP to `flags` +\snippet polar_transforms.cpp InverseMap + +In addiction, to calculate the original coordinate from a polar mapped coordinate \f$(rho, phi)->(x, y)\f$: +\snippet polar_transforms.cpp InverseCoordinate + +@param src Source image. +@param dst Destination image. It will have same type as src. +@param dsize The destination image size (see description for valid options). +@param center The transformation center. +@param maxRadius The radius of the bounding circle to transform. It determines the inverse magnitude scale parameter too. +@param flags A combination of interpolation methods, #InterpolationFlags + #WarpPolarMode. + - Add #WARP_POLAR_LINEAR to select linear polar mapping (default) + - Add #WARP_POLAR_LOG to select semilog polar mapping + - Add #WARP_INVERSE_MAP for reverse mapping. +@note +- The function can not operate in-place. +- To calculate magnitude and angle in degrees #cartToPolar is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees. +- This function uses #remap. Due to current implementation limitations the size of an input and output images should be less than 32767x32767. + +@sa cv::remap +*/ +CV_EXPORTS_W void warpPolar(InputArray src, OutputArray dst, Size dsize, + Point2f center, double maxRadius, int flags); + + +//! @} imgproc_transform + +//! @addtogroup imgproc_misc +//! @{ + +/** @brief Calculates the integral of an image. + +The function calculates one or more integral images for the source image as follows: + +\f[\texttt{sum} (X,Y) = \sum _{x + +Calculates the cross-power spectrum of two supplied source arrays. The arrays are padded if needed +with getOptimalDFTSize. + +The function performs the following equations: +- First it applies a Hanning window (see ) to each +image to remove possible edge effects. This window is cached until the array size changes to speed +up processing time. +- Next it computes the forward DFTs of each source array: +\f[\mathbf{G}_a = \mathcal{F}\{src_1\}, \; \mathbf{G}_b = \mathcal{F}\{src_2\}\f] +where \f$\mathcal{F}\f$ is the forward DFT. +- It then computes the cross-power spectrum of each frequency domain array: +\f[R = \frac{ \mathbf{G}_a \mathbf{G}_b^*}{|\mathbf{G}_a \mathbf{G}_b^*|}\f] +- Next the cross-correlation is converted back into the time domain via the inverse DFT: +\f[r = \mathcal{F}^{-1}\{R\}\f] +- Finally, it computes the peak location and computes a 5x5 weighted centroid around the peak to +achieve sub-pixel accuracy. +\f[(\Delta x, \Delta y) = \texttt{weightedCentroid} \{\arg \max_{(x, y)}\{r\}\}\f] +- If non-zero, the response parameter is computed as the sum of the elements of r within the 5x5 +centroid around the peak location. It is normalized to a maximum of 1 (meaning there is a single +peak) and will be smaller when there are multiple peaks. + +@param src1 Source floating point array (CV_32FC1 or CV_64FC1) +@param src2 Source floating point array (CV_32FC1 or CV_64FC1) +@param window Floating point array with windowing coefficients to reduce edge effects (optional). +@param response Signal power within the 5x5 centroid around the peak, between 0 and 1 (optional). +@returns detected phase shift (sub-pixel) between the two arrays. + +@sa dft, getOptimalDFTSize, idft, mulSpectrums createHanningWindow + */ +CV_EXPORTS_W Point2d phaseCorrelate(InputArray src1, InputArray src2, + InputArray window = noArray(), CV_OUT double* response = 0); + +/** @brief This function computes a Hanning window coefficients in two dimensions. + +See (http://en.wikipedia.org/wiki/Hann_function) and (http://en.wikipedia.org/wiki/Window_function) +for more information. + +An example is shown below: +@code + // create hanning window of size 100x100 and type CV_32F + Mat hann; + createHanningWindow(hann, Size(100, 100), CV_32F); +@endcode +@param dst Destination array to place Hann coefficients in +@param winSize The window size specifications (both width and height must be > 1) +@param type Created array type + */ +CV_EXPORTS_W void createHanningWindow(OutputArray dst, Size winSize, int type); + +/** @brief Performs the per-element division of the first Fourier spectrum by the second Fourier spectrum. + +The function cv::divSpectrums performs the per-element division of the first array by the second array. +The arrays are CCS-packed or complex matrices that are results of a real or complex Fourier transform. + +@param a first input array. +@param b second input array of the same size and type as src1 . +@param c output array of the same size and type as src1 . +@param flags operation flags; currently, the only supported flag is cv::DFT_ROWS, which indicates that +each row of src1 and src2 is an independent 1D Fourier spectrum. If you do not want to use this flag, then simply add a `0` as value. +@param conjB optional flag that conjugates the second input array before the multiplication (true) +or not (false). +*/ +CV_EXPORTS_W void divSpectrums(InputArray a, InputArray b, OutputArray c, + int flags, bool conjB = false); + +//! @} imgproc_motion + +//! @addtogroup imgproc_misc +//! @{ + +/** @brief Applies a fixed-level threshold to each array element. + +The function applies fixed-level thresholding to a multiple-channel array. The function is typically +used to get a bi-level (binary) image out of a grayscale image ( #compare could be also used for +this purpose) or for removing a noise, that is, filtering out pixels with too small or too large +values. There are several types of thresholding supported by the function. They are determined by +type parameter. + +Also, the special values #THRESH_OTSU or #THRESH_TRIANGLE may be combined with one of the +above values. In these cases, the function determines the optimal threshold value using the Otsu's +or Triangle algorithm and uses it instead of the specified thresh. + +@note Currently, the Otsu's and Triangle methods are implemented only for 8-bit single-channel images. + +@param src input array (multiple-channel, 8-bit or 32-bit floating point). +@param dst output array of the same size and type and the same number of channels as src. +@param thresh threshold value. +@param maxval maximum value to use with the #THRESH_BINARY and #THRESH_BINARY_INV thresholding +types. +@param type thresholding type (see #ThresholdTypes). +@return the computed threshold value if Otsu's or Triangle methods used. + +@sa adaptiveThreshold, findContours, compare, min, max + */ +CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, + double thresh, double maxval, int type ); + + +/** @brief Applies an adaptive threshold to an array. + +The function transforms a grayscale image to a binary image according to the formulae: +- **THRESH_BINARY** + \f[dst(x,y) = \fork{\texttt{maxValue}}{if \(src(x,y) > T(x,y)\)}{0}{otherwise}\f] +- **THRESH_BINARY_INV** + \f[dst(x,y) = \fork{0}{if \(src(x,y) > T(x,y)\)}{\texttt{maxValue}}{otherwise}\f] +where \f$T(x,y)\f$ is a threshold calculated individually for each pixel (see adaptiveMethod parameter). + +The function can process the image in-place. + +@param src Source 8-bit single-channel image. +@param dst Destination image of the same size and the same type as src. +@param maxValue Non-zero value assigned to the pixels for which the condition is satisfied +@param adaptiveMethod Adaptive thresholding algorithm to use, see #AdaptiveThresholdTypes. +The #BORDER_REPLICATE | #BORDER_ISOLATED is used to process boundaries. +@param thresholdType Thresholding type that must be either #THRESH_BINARY or #THRESH_BINARY_INV, +see #ThresholdTypes. +@param blockSize Size of a pixel neighborhood that is used to calculate a threshold value for the +pixel: 3, 5, 7, and so on. +@param C Constant subtracted from the mean or weighted mean (see the details below). Normally, it +is positive but may be zero or negative as well. + +@sa threshold, blur, GaussianBlur + */ +CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst, + double maxValue, int adaptiveMethod, + int thresholdType, int blockSize, double C ); + +//! @} imgproc_misc + +//! @addtogroup imgproc_filter +//! @{ + +/** @example samples/cpp/tutorial_code/ImgProc/Pyramids/Pyramids.cpp +An example using pyrDown and pyrUp functions +*/ + +/** @brief Blurs an image and downsamples it. + +By default, size of the output image is computed as `Size((src.cols+1)/2, (src.rows+1)/2)`, but in +any case, the following conditions should be satisfied: + +\f[\begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 \\ | \texttt{dstsize.height} *2-src.rows| \leq 2 \end{array}\f] + +The function performs the downsampling step of the Gaussian pyramid construction. First, it +convolves the source image with the kernel: + +\f[\frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}\f] + +Then, it downsamples the image by rejecting even rows and columns. + +@param src input image. +@param dst output image; it has the specified size and the same type as src. +@param dstsize size of the output image. +@param borderType Pixel extrapolation method, see #BorderTypes (#BORDER_CONSTANT isn't supported) + */ +CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst, + const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ); + +/** @brief Upsamples an image and then blurs it. + +By default, size of the output image is computed as `Size(src.cols\*2, (src.rows\*2)`, but in any +case, the following conditions should be satisfied: + +\f[\begin{array}{l} | \texttt{dstsize.width} -src.cols*2| \leq ( \texttt{dstsize.width} \mod 2) \\ | \texttt{dstsize.height} -src.rows*2| \leq ( \texttt{dstsize.height} \mod 2) \end{array}\f] + +The function performs the upsampling step of the Gaussian pyramid construction, though it can +actually be used to construct the Laplacian pyramid. First, it upsamples the source image by +injecting even zero rows and columns and then convolves the result with the same kernel as in +pyrDown multiplied by 4. + +@param src input image. +@param dst output image. It has the specified size and the same type as src . +@param dstsize size of the output image. +@param borderType Pixel extrapolation method, see #BorderTypes (only #BORDER_DEFAULT is supported) + */ +CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst, + const Size& dstsize = Size(), int borderType = BORDER_DEFAULT ); + +/** @brief Constructs the Gaussian pyramid for an image. + +The function constructs a vector of images and builds the Gaussian pyramid by recursively applying +pyrDown to the previously built pyramid layers, starting from `dst[0]==src`. + +@param src Source image. Check pyrDown for the list of supported types. +@param dst Destination vector of maxlevel+1 images of the same type as src. dst[0] will be the +same as src. dst[1] is the next pyramid layer, a smoothed and down-sized src, and so on. +@param maxlevel 0-based index of the last (the smallest) pyramid layer. It must be non-negative. +@param borderType Pixel extrapolation method, see #BorderTypes (#BORDER_CONSTANT isn't supported) + */ +CV_EXPORTS void buildPyramid( InputArray src, OutputArrayOfArrays dst, + int maxlevel, int borderType = BORDER_DEFAULT ); + +//! @} imgproc_filter + +//! @addtogroup imgproc_hist +//! @{ + +/** @example samples/cpp/demhist.cpp +An example for creating histograms of an image +*/ + +/** @brief Calculates a histogram of a set of arrays. + +The function cv::calcHist calculates the histogram of one or more arrays. The elements of a tuple used +to increment a histogram bin are taken from the corresponding input arrays at the same location. The +sample below shows how to compute a 2D Hue-Saturation histogram for a color image. : +@include snippets/imgproc_calcHist.cpp + +@param images Source arrays. They all should have the same depth, CV_8U, CV_16U or CV_32F , and the same +size. Each of them can have an arbitrary number of channels. +@param nimages Number of source images. +@param channels List of the dims channels used to compute the histogram. The first array channels +are numerated from 0 to images[0].channels()-1 , the second array channels are counted from +images[0].channels() to images[0].channels() + images[1].channels()-1, and so on. +@param mask Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size +as images[i] . The non-zero mask elements mark the array elements counted in the histogram. +@param hist Output histogram, which is a dense or sparse dims -dimensional array. +@param dims Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS +(equal to 32 in the current OpenCV version). +@param histSize Array of histogram sizes in each dimension. +@param ranges Array of the dims arrays of the histogram bin boundaries in each dimension. When the +histogram is uniform ( uniform =true), then for each dimension i it is enough to specify the lower +(inclusive) boundary \f$L_0\f$ of the 0-th histogram bin and the upper (exclusive) boundary +\f$U_{\texttt{histSize}[i]-1}\f$ for the last histogram bin histSize[i]-1 . That is, in case of a +uniform histogram each of ranges[i] is an array of 2 elements. When the histogram is not uniform ( +uniform=false ), then each of ranges[i] contains histSize[i]+1 elements: +\f$L_0, U_0=L_1, U_1=L_2, ..., U_{\texttt{histSize[i]}-2}=L_{\texttt{histSize[i]}-1}, U_{\texttt{histSize[i]}-1}\f$ +. The array elements, that are not between \f$L_0\f$ and \f$U_{\texttt{histSize[i]}-1}\f$ , are not +counted in the histogram. +@param uniform Flag indicating whether the histogram is uniform or not (see above). +@param accumulate Accumulation flag. If it is set, the histogram is not cleared in the beginning +when it is allocated. This feature enables you to compute a single histogram from several sets of +arrays, or to update the histogram in time. +*/ +CV_EXPORTS void calcHist( const Mat* images, int nimages, + const int* channels, InputArray mask, + OutputArray hist, int dims, const int* histSize, + const float** ranges, bool uniform = true, bool accumulate = false ); + +/** @overload + +this variant uses %SparseMat for output +*/ +CV_EXPORTS void calcHist( const Mat* images, int nimages, + const int* channels, InputArray mask, + SparseMat& hist, int dims, + const int* histSize, const float** ranges, + bool uniform = true, bool accumulate = false ); + +/** @overload + +this variant supports only uniform histograms. + +ranges argument is either empty vector or a flattened vector of histSize.size()*2 elements +(histSize.size() element pairs). The first and second elements of each pair specify the lower and +upper boundaries. +*/ +CV_EXPORTS_W void calcHist( InputArrayOfArrays images, + const std::vector& channels, + InputArray mask, OutputArray hist, + const std::vector& histSize, + const std::vector& ranges, + bool accumulate = false ); + +/** @brief Calculates the back projection of a histogram. + +The function cv::calcBackProject calculates the back project of the histogram. That is, similarly to +#calcHist , at each location (x, y) the function collects the values from the selected channels +in the input images and finds the corresponding histogram bin. But instead of incrementing it, the +function reads the bin value, scales it by scale , and stores in backProject(x,y) . In terms of +statistics, the function computes probability of each element value in respect with the empirical +probability distribution represented by the histogram. See how, for example, you can find and track +a bright-colored object in a scene: + +- Before tracking, show the object to the camera so that it covers almost the whole frame. +Calculate a hue histogram. The histogram may have strong maximums, corresponding to the dominant +colors in the object. + +- When tracking, calculate a back projection of a hue plane of each input video frame using that +pre-computed histogram. Threshold the back projection to suppress weak colors. It may also make +sense to suppress pixels with non-sufficient color saturation and too dark or too bright pixels. + +- Find connected components in the resulting picture and choose, for example, the largest +component. + +This is an approximate algorithm of the CamShift color object tracker. + +@param images Source arrays. They all should have the same depth, CV_8U, CV_16U or CV_32F , and the same +size. Each of them can have an arbitrary number of channels. +@param nimages Number of source images. +@param channels The list of channels used to compute the back projection. The number of channels +must match the histogram dimensionality. The first array channels are numerated from 0 to +images[0].channels()-1 , the second array channels are counted from images[0].channels() to +images[0].channels() + images[1].channels()-1, and so on. +@param hist Input histogram that can be dense or sparse. +@param backProject Destination back projection array that is a single-channel array of the same +size and depth as images[0] . +@param ranges Array of arrays of the histogram bin boundaries in each dimension. See #calcHist . +@param scale Optional scale factor for the output back projection. +@param uniform Flag indicating whether the histogram is uniform or not (see above). + +@sa calcHist, compareHist + */ +CV_EXPORTS void calcBackProject( const Mat* images, int nimages, + const int* channels, InputArray hist, + OutputArray backProject, const float** ranges, + double scale = 1, bool uniform = true ); + +/** @overload */ +CV_EXPORTS void calcBackProject( const Mat* images, int nimages, + const int* channels, const SparseMat& hist, + OutputArray backProject, const float** ranges, + double scale = 1, bool uniform = true ); + +/** @overload */ +CV_EXPORTS_W void calcBackProject( InputArrayOfArrays images, const std::vector& channels, + InputArray hist, OutputArray dst, + const std::vector& ranges, + double scale ); + +/** @brief Compares two histograms. + +The function cv::compareHist compares two dense or two sparse histograms using the specified method. + +The function returns \f$d(H_1, H_2)\f$ . + +While the function works well with 1-, 2-, 3-dimensional dense histograms, it may not be suitable +for high-dimensional sparse histograms. In such histograms, because of aliasing and sampling +problems, the coordinates of non-zero histogram bins can slightly shift. To compare such histograms +or more general sparse configurations of weighted points, consider using the #EMD function. + +@param H1 First compared histogram. +@param H2 Second compared histogram of the same size as H1 . +@param method Comparison method, see #HistCompMethods + */ +CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method ); + +/** @overload */ +CV_EXPORTS double compareHist( const SparseMat& H1, const SparseMat& H2, int method ); + +/** @brief Equalizes the histogram of a grayscale image. + +The function equalizes the histogram of the input image using the following algorithm: + +- Calculate the histogram \f$H\f$ for src . +- Normalize the histogram so that the sum of histogram bins is 255. +- Compute the integral of the histogram: +\f[H'_i = \sum _{0 \le j < i} H(j)\f] +- Transform the image using \f$H'\f$ as a look-up table: \f$\texttt{dst}(x,y) = H'(\texttt{src}(x,y))\f$ + +The algorithm normalizes the brightness and increases the contrast of the image. + +@param src Source 8-bit single channel image. +@param dst Destination image of the same size and type as src . + */ +CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst ); + +/** @brief Creates a smart pointer to a cv::CLAHE class and initializes it. + +@param clipLimit Threshold for contrast limiting. +@param tileGridSize Size of grid for histogram equalization. Input image will be divided into +equally sized rectangular tiles. tileGridSize defines the number of tiles in row and column. + */ +CV_EXPORTS_W Ptr createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8)); + +/** @brief Computes the "minimal work" distance between two weighted point configurations. + +The function computes the earth mover distance and/or a lower boundary of the distance between the +two weighted point configurations. One of the applications described in @cite RubnerSept98, +@cite Rubner2000 is multi-dimensional histogram comparison for image retrieval. EMD is a transportation +problem that is solved using some modification of a simplex algorithm, thus the complexity is +exponential in the worst case, though, on average it is much faster. In the case of a real metric +the lower boundary can be calculated even faster (using linear-time algorithm) and it can be used +to determine roughly whether the two signatures are far enough so that they cannot relate to the +same object. + +@param signature1 First signature, a \f$\texttt{size1}\times \texttt{dims}+1\f$ floating-point matrix. +Each row stores the point weight followed by the point coordinates. The matrix is allowed to have +a single column (weights only) if the user-defined cost matrix is used. The weights must be +non-negative and have at least one non-zero value. +@param signature2 Second signature of the same format as signature1 , though the number of rows +may be different. The total weights may be different. In this case an extra "dummy" point is added +to either signature1 or signature2. The weights must be non-negative and have at least one non-zero +value. +@param distType Used metric. See #DistanceTypes. +@param cost User-defined \f$\texttt{size1}\times \texttt{size2}\f$ cost matrix. Also, if a cost matrix +is used, lower boundary lowerBound cannot be calculated because it needs a metric function. +@param lowerBound Optional input/output parameter: lower boundary of a distance between the two +signatures that is a distance between mass centers. The lower boundary may not be calculated if +the user-defined cost matrix is used, the total weights of point configurations are not equal, or +if the signatures consist of weights only (the signature matrices have a single column). You +**must** initialize \*lowerBound . If the calculated distance between mass centers is greater or +equal to \*lowerBound (it means that the signatures are far enough), the function does not +calculate EMD. In any case \*lowerBound is set to the calculated distance between mass centers on +return. Thus, if you want to calculate both distance between mass centers and EMD, \*lowerBound +should be set to 0. +@param flow Resultant \f$\texttt{size1} \times \texttt{size2}\f$ flow matrix: \f$\texttt{flow}_{i,j}\f$ is +a flow from \f$i\f$ -th point of signature1 to \f$j\f$ -th point of signature2 . + */ +CV_EXPORTS float EMD( InputArray signature1, InputArray signature2, + int distType, InputArray cost=noArray(), + float* lowerBound = 0, OutputArray flow = noArray() ); + +CV_EXPORTS_AS(EMD) float wrapperEMD( InputArray signature1, InputArray signature2, + int distType, InputArray cost=noArray(), + CV_IN_OUT Ptr lowerBound = Ptr(), OutputArray flow = noArray() ); + +//! @} imgproc_hist + +//! @addtogroup imgproc_segmentation +//! @{ + +/** @example samples/cpp/watershed.cpp +An example using the watershed algorithm +*/ + +/** @brief Performs a marker-based image segmentation using the watershed algorithm. + +The function implements one of the variants of watershed, non-parametric marker-based segmentation +algorithm, described in @cite Meyer92 . + +Before passing the image to the function, you have to roughly outline the desired regions in the +image markers with positive (\>0) indices. So, every region is represented as one or more connected +components with the pixel values 1, 2, 3, and so on. Such markers can be retrieved from a binary +mask using #findContours and #drawContours (see the watershed.cpp demo). The markers are "seeds" of +the future image regions. All the other pixels in markers , whose relation to the outlined regions +is not known and should be defined by the algorithm, should be set to 0's. In the function output, +each pixel in markers is set to a value of the "seed" components or to -1 at boundaries between the +regions. + +@note Any two neighbor connected components are not necessarily separated by a watershed boundary +(-1's pixels); for example, they can touch each other in the initial marker image passed to the +function. + +@param image Input 8-bit 3-channel image. +@param markers Input/output 32-bit single-channel image (map) of markers. It should have the same +size as image . + +@sa findContours + */ +CV_EXPORTS_W void watershed( InputArray image, InputOutputArray markers ); + +//! @} imgproc_segmentation + +//! @addtogroup imgproc_filter +//! @{ + +/** @brief Performs initial step of meanshift segmentation of an image. + +The function implements the filtering stage of meanshift segmentation, that is, the output of the +function is the filtered "posterized" image with color gradients and fine-grain texture flattened. +At every pixel (X,Y) of the input image (or down-sized input image, see below) the function executes +meanshift iterations, that is, the pixel (X,Y) neighborhood in the joint space-color hyperspace is +considered: + +\f[(x,y): X- \texttt{sp} \le x \le X+ \texttt{sp} , Y- \texttt{sp} \le y \le Y+ \texttt{sp} , ||(R,G,B)-(r,g,b)|| \le \texttt{sr}\f] + +where (R,G,B) and (r,g,b) are the vectors of color components at (X,Y) and (x,y), respectively +(though, the algorithm does not depend on the color space used, so any 3-component color space can +be used instead). Over the neighborhood the average spatial value (X',Y') and average color vector +(R',G',B') are found and they act as the neighborhood center on the next iteration: + +\f[(X,Y)~(X',Y'), (R,G,B)~(R',G',B').\f] + +After the iterations over, the color components of the initial pixel (that is, the pixel from where +the iterations started) are set to the final value (average color at the last iteration): + +\f[I(X,Y) <- (R*,G*,B*)\f] + +When maxLevel \> 0, the gaussian pyramid of maxLevel+1 levels is built, and the above procedure is +run on the smallest layer first. After that, the results are propagated to the larger layer and the +iterations are run again only on those pixels where the layer colors differ by more than sr from the +lower-resolution layer of the pyramid. That makes boundaries of color regions sharper. Note that the +results will be actually different from the ones obtained by running the meanshift procedure on the +whole original image (i.e. when maxLevel==0). + +@param src The source 8-bit, 3-channel image. +@param dst The destination image of the same format and the same size as the source. +@param sp The spatial window radius. +@param sr The color window radius. +@param maxLevel Maximum level of the pyramid for the segmentation. +@param termcrit Termination criteria: when to stop meanshift iterations. + */ +CV_EXPORTS_W void pyrMeanShiftFiltering( InputArray src, OutputArray dst, + double sp, double sr, int maxLevel = 1, + TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) ); + +//! @} + +//! @addtogroup imgproc_segmentation +//! @{ + +/** @example samples/cpp/grabcut.cpp +An example using the GrabCut algorithm +![Sample Screenshot](grabcut_output1.jpg) +*/ + +/** @brief Runs the GrabCut algorithm. + +The function implements the [GrabCut image segmentation algorithm](http://en.wikipedia.org/wiki/GrabCut). + +@param img Input 8-bit 3-channel image. +@param mask Input/output 8-bit single-channel mask. The mask is initialized by the function when +mode is set to #GC_INIT_WITH_RECT. Its elements may have one of the #GrabCutClasses. +@param rect ROI containing a segmented object. The pixels outside of the ROI are marked as +"obvious background". The parameter is only used when mode==#GC_INIT_WITH_RECT . +@param bgdModel Temporary array for the background model. Do not modify it while you are +processing the same image. +@param fgdModel Temporary arrays for the foreground model. Do not modify it while you are +processing the same image. +@param iterCount Number of iterations the algorithm should make before returning the result. Note +that the result can be refined with further calls with mode==#GC_INIT_WITH_MASK or +mode==GC_EVAL . +@param mode Operation mode that could be one of the #GrabCutModes + */ +CV_EXPORTS_W void grabCut( InputArray img, InputOutputArray mask, Rect rect, + InputOutputArray bgdModel, InputOutputArray fgdModel, + int iterCount, int mode = GC_EVAL ); + +//! @} imgproc_segmentation + +//! @addtogroup imgproc_misc +//! @{ + +/** @example samples/cpp/distrans.cpp +An example on using the distance transform +*/ + +/** @brief Calculates the distance to the closest zero pixel for each pixel of the source image. + +The function cv::distanceTransform calculates the approximate or precise distance from every binary +image pixel to the nearest zero pixel. For zero image pixels, the distance will obviously be zero. + +When maskSize == #DIST_MASK_PRECISE and distanceType == #DIST_L2 , the function runs the +algorithm described in @cite Felzenszwalb04 . This algorithm is parallelized with the TBB library. + +In other cases, the algorithm @cite Borgefors86 is used. This means that for a pixel the function +finds the shortest path to the nearest zero pixel consisting of basic shifts: horizontal, vertical, +diagonal, or knight's move (the latest is available for a \f$5\times 5\f$ mask). The overall +distance is calculated as a sum of these basic distances. Since the distance function should be +symmetric, all of the horizontal and vertical shifts must have the same cost (denoted as a ), all +the diagonal shifts must have the same cost (denoted as `b`), and all knight's moves must have the +same cost (denoted as `c`). For the #DIST_C and #DIST_L1 types, the distance is calculated +precisely, whereas for #DIST_L2 (Euclidean distance) the distance can be calculated only with a +relative error (a \f$5\times 5\f$ mask gives more accurate results). For `a`,`b`, and `c`, OpenCV +uses the values suggested in the original paper: +- DIST_L1: `a = 1, b = 2` +- DIST_L2: + - `3 x 3`: `a=0.955, b=1.3693` + - `5 x 5`: `a=1, b=1.4, c=2.1969` +- DIST_C: `a = 1, b = 1` + +Typically, for a fast, coarse distance estimation #DIST_L2, a \f$3\times 3\f$ mask is used. For a +more accurate distance estimation #DIST_L2, a \f$5\times 5\f$ mask or the precise algorithm is used. +Note that both the precise and the approximate algorithms are linear on the number of pixels. + +This variant of the function does not only compute the minimum distance for each pixel \f$(x, y)\f$ +but also identifies the nearest connected component consisting of zero pixels +(labelType==#DIST_LABEL_CCOMP) or the nearest zero pixel (labelType==#DIST_LABEL_PIXEL). Index of the +component/pixel is stored in `labels(x, y)`. When labelType==#DIST_LABEL_CCOMP, the function +automatically finds connected components of zero pixels in the input image and marks them with +distinct labels. When labelType==#DIST_LABEL_PIXEL, the function scans through the input image and +marks all the zero pixels with distinct labels. + +In this mode, the complexity is still linear. That is, the function provides a very fast way to +compute the Voronoi diagram for a binary image. Currently, the second variant can use only the +approximate distance transform algorithm, i.e. maskSize=#DIST_MASK_PRECISE is not supported +yet. + +@param src 8-bit, single-channel (binary) source image. +@param dst Output image with calculated distances. It is a 8-bit or 32-bit floating-point, +single-channel image of the same size as src. +@param labels Output 2D array of labels (the discrete Voronoi diagram). It has the type +CV_32SC1 and the same size as src. +@param distanceType Type of distance, see #DistanceTypes +@param maskSize Size of the distance transform mask, see #DistanceTransformMasks. +#DIST_MASK_PRECISE is not supported by this variant. In case of the #DIST_L1 or #DIST_C distance type, +the parameter is forced to 3 because a \f$3\times 3\f$ mask gives the same result as \f$5\times +5\f$ or any larger aperture. +@param labelType Type of the label array to build, see #DistanceTransformLabelTypes. + */ +CV_EXPORTS_AS(distanceTransformWithLabels) void distanceTransform( InputArray src, OutputArray dst, + OutputArray labels, int distanceType, int maskSize, + int labelType = DIST_LABEL_CCOMP ); + +/** @overload +@param src 8-bit, single-channel (binary) source image. +@param dst Output image with calculated distances. It is a 8-bit or 32-bit floating-point, +single-channel image of the same size as src . +@param distanceType Type of distance, see #DistanceTypes +@param maskSize Size of the distance transform mask, see #DistanceTransformMasks. In case of the +#DIST_L1 or #DIST_C distance type, the parameter is forced to 3 because a \f$3\times 3\f$ mask gives +the same result as \f$5\times 5\f$ or any larger aperture. +@param dstType Type of output image. It can be CV_8U or CV_32F. Type CV_8U can be used only for +the first variant of the function and distanceType == #DIST_L1. +*/ +CV_EXPORTS_W void distanceTransform( InputArray src, OutputArray dst, + int distanceType, int maskSize, int dstType=CV_32F); + +/** @brief Fills a connected component with the given color. + +The function cv::floodFill fills a connected component starting from the seed point with the specified +color. The connectivity is determined by the color/brightness closeness of the neighbor pixels. The +pixel at \f$(x,y)\f$ is considered to belong to the repainted domain if: + +- in case of a grayscale image and floating range +\f[\texttt{src} (x',y')- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x',y')+ \texttt{upDiff}\f] + + +- in case of a grayscale image and fixed range +\f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)+ \texttt{upDiff}\f] + + +- in case of a color image and floating range +\f[\texttt{src} (x',y')_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x',y')_r+ \texttt{upDiff} _r,\f] +\f[\texttt{src} (x',y')_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x',y')_g+ \texttt{upDiff} _g\f] +and +\f[\texttt{src} (x',y')_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x',y')_b+ \texttt{upDiff} _b\f] + + +- in case of a color image and fixed range +\f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r+ \texttt{upDiff} _r,\f] +\f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g+ \texttt{upDiff} _g\f] +and +\f[\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b+ \texttt{upDiff} _b\f] + + +where \f$src(x',y')\f$ is the value of one of pixel neighbors that is already known to belong to the +component. That is, to be added to the connected component, a color/brightness of the pixel should +be close enough to: +- Color/brightness of one of its neighbors that already belong to the connected component in case +of a floating range. +- Color/brightness of the seed point in case of a fixed range. + +Use these functions to either mark a connected component with the specified color in-place, or build +a mask and then extract the contour, or copy the region to another image, and so on. + +@param image Input/output 1- or 3-channel, 8-bit, or floating-point image. It is modified by the +function unless the #FLOODFILL_MASK_ONLY flag is set in the second variant of the function. See +the details below. +@param mask Operation mask that should be a single-channel 8-bit image, 2 pixels wider and 2 pixels +taller than image. If an empty Mat is passed it will be created automatically. Since this is both an +input and output parameter, you must take responsibility of initializing it. +Flood-filling cannot go across non-zero pixels in the input mask. For example, +an edge detector output can be used as a mask to stop filling at edges. On output, pixels in the +mask corresponding to filled pixels in the image are set to 1 or to the specified value in flags +as described below. Additionally, the function fills the border of the mask with ones to simplify +internal processing. It is therefore possible to use the same mask in multiple calls to the function +to make sure the filled areas do not overlap. +@param seedPoint Starting point. +@param newVal New value of the repainted domain pixels. +@param loDiff Maximal lower brightness/color difference between the currently observed pixel and +one of its neighbors belonging to the component, or a seed pixel being added to the component. +@param upDiff Maximal upper brightness/color difference between the currently observed pixel and +one of its neighbors belonging to the component, or a seed pixel being added to the component. +@param rect Optional output parameter set by the function to the minimum bounding rectangle of the +repainted domain. +@param flags Operation flags. The first 8 bits contain a connectivity value. The default value of +4 means that only the four nearest neighbor pixels (those that share an edge) are considered. A +connectivity value of 8 means that the eight nearest neighbor pixels (those that share a corner) +will be considered. The next 8 bits (8-16) contain a value between 1 and 255 with which to fill +the mask (the default value is 1). For example, 4 | ( 255 \<\< 8 ) will consider 4 nearest +neighbours and fill the mask with a value of 255. The following additional options occupy higher +bits and therefore may be further combined with the connectivity and mask fill values using +bit-wise or (|), see #FloodFillFlags. + +@note Since the mask is larger than the filled image, a pixel \f$(x, y)\f$ in image corresponds to the +pixel \f$(x+1, y+1)\f$ in the mask . + +@sa findContours + */ +CV_EXPORTS_W int floodFill( InputOutputArray image, InputOutputArray mask, + Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0, + Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), + int flags = 4 ); + +/** @example samples/cpp/ffilldemo.cpp +An example using the FloodFill technique +*/ + +/** @overload + +variant without `mask` parameter +*/ +CV_EXPORTS int floodFill( InputOutputArray image, + Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0, + Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), + int flags = 4 ); + +//! Performs linear blending of two images: +//! \f[ \texttt{dst}(i,j) = \texttt{weights1}(i,j)*\texttt{src1}(i,j) + \texttt{weights2}(i,j)*\texttt{src2}(i,j) \f] +//! @param src1 It has a type of CV_8UC(n) or CV_32FC(n), where n is a positive integer. +//! @param src2 It has the same type and size as src1. +//! @param weights1 It has a type of CV_32FC1 and the same size with src1. +//! @param weights2 It has a type of CV_32FC1 and the same size with src1. +//! @param dst It is created if it does not have the same size and type with src1. +CV_EXPORTS_W void blendLinear(InputArray src1, InputArray src2, InputArray weights1, InputArray weights2, OutputArray dst); + +//! @} imgproc_misc + +//! @addtogroup imgproc_color_conversions +//! @{ + +/** @brief Converts an image from one color space to another. + +The function converts an input image from one color space to another. In case of a transformation +to-from RGB color space, the order of the channels should be specified explicitly (RGB or BGR). Note +that the default color format in OpenCV is often referred to as RGB but it is actually BGR (the +bytes are reversed). So the first byte in a standard (24-bit) color image will be an 8-bit Blue +component, the second byte will be Green, and the third byte will be Red. The fourth, fifth, and +sixth bytes would then be the second pixel (Blue, then Green, then Red), and so on. + +The conventional ranges for R, G, and B channel values are: +- 0 to 255 for CV_8U images +- 0 to 65535 for CV_16U images +- 0 to 1 for CV_32F images + +In case of linear transformations, the range does not matter. But in case of a non-linear +transformation, an input RGB image should be normalized to the proper value range to get the correct +results, for example, for RGB \f$\rightarrow\f$ L\*u\*v\* transformation. For example, if you have a +32-bit floating-point image directly converted from an 8-bit image without any scaling, then it will +have the 0..255 value range instead of 0..1 assumed by the function. So, before calling #cvtColor , +you need first to scale the image down: +@code + img *= 1./255; + cvtColor(img, img, COLOR_BGR2Luv); +@endcode +If you use #cvtColor with 8-bit images, the conversion will have some information lost. For many +applications, this will not be noticeable but it is recommended to use 32-bit images in applications +that need the full range of colors or that convert an image before an operation and then convert +back. + +If conversion adds the alpha channel, its value will set to the maximum of corresponding channel +range: 255 for CV_8U, 65535 for CV_16U, 1 for CV_32F. + +@param src input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), or single-precision +floating-point. +@param dst output image of the same size and depth as src. +@param code color space conversion code (see #ColorConversionCodes). +@param dstCn number of channels in the destination image; if the parameter is 0, the number of the +channels is derived automatically from src and code. + +@see @ref imgproc_color_conversions + */ +CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ); + +/** @brief Converts an image from one color space to another where the source image is +stored in two planes. + +This function only supports YUV420 to RGB conversion as of now. + +@param src1 8-bit image (#CV_8U) of the Y plane. +@param src2 image containing interleaved U/V plane. +@param dst output image. +@param code Specifies the type of conversion. It can take any of the following values: +- #COLOR_YUV2BGR_NV12 +- #COLOR_YUV2RGB_NV12 +- #COLOR_YUV2BGRA_NV12 +- #COLOR_YUV2RGBA_NV12 +- #COLOR_YUV2BGR_NV21 +- #COLOR_YUV2RGB_NV21 +- #COLOR_YUV2BGRA_NV21 +- #COLOR_YUV2RGBA_NV21 +*/ +CV_EXPORTS_W void cvtColorTwoPlane( InputArray src1, InputArray src2, OutputArray dst, int code ); + +/** @brief main function for all demosaicing processes + +@param src input image: 8-bit unsigned or 16-bit unsigned. +@param dst output image of the same size and depth as src. +@param code Color space conversion code (see the description below). +@param dstCn number of channels in the destination image; if the parameter is 0, the number of the +channels is derived automatically from src and code. + +The function can do the following transformations: + +- Demosaicing using bilinear interpolation + + #COLOR_BayerBG2BGR , #COLOR_BayerGB2BGR , #COLOR_BayerRG2BGR , #COLOR_BayerGR2BGR + + #COLOR_BayerBG2GRAY , #COLOR_BayerGB2GRAY , #COLOR_BayerRG2GRAY , #COLOR_BayerGR2GRAY + +- Demosaicing using Variable Number of Gradients. + + #COLOR_BayerBG2BGR_VNG , #COLOR_BayerGB2BGR_VNG , #COLOR_BayerRG2BGR_VNG , #COLOR_BayerGR2BGR_VNG + +- Edge-Aware Demosaicing. + + #COLOR_BayerBG2BGR_EA , #COLOR_BayerGB2BGR_EA , #COLOR_BayerRG2BGR_EA , #COLOR_BayerGR2BGR_EA + +- Demosaicing with alpha channel + + #COLOR_BayerBG2BGRA , #COLOR_BayerGB2BGRA , #COLOR_BayerRG2BGRA , #COLOR_BayerGR2BGRA + +@sa cvtColor +*/ +CV_EXPORTS_W void demosaicing(InputArray src, OutputArray dst, int code, int dstCn = 0); + +//! @} imgproc_color_conversions + +//! @addtogroup imgproc_shape +//! @{ + +/** @brief Calculates all of the moments up to the third order of a polygon or rasterized shape. + +The function computes moments, up to the 3rd order, of a vector shape or a rasterized shape. The +results are returned in the structure cv::Moments. + +@param array Raster image (single-channel, 8-bit or floating-point 2D array) or an array ( +\f$1 \times N\f$ or \f$N \times 1\f$ ) of 2D points (Point or Point2f ). +@param binaryImage If it is true, all non-zero image pixels are treated as 1's. The parameter is +used for images only. +@returns moments. + +@note Only applicable to contour moments calculations from Python bindings: Note that the numpy +type for the input array should be either np.int32 or np.float32. + +@sa contourArea, arcLength + */ +CV_EXPORTS_W Moments moments( InputArray array, bool binaryImage = false ); + +/** @brief Calculates seven Hu invariants. + +The function calculates seven Hu invariants (introduced in @cite Hu62; see also +) defined as: + +\f[\begin{array}{l} hu[0]= \eta _{20}+ \eta _{02} \\ hu[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ hu[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ hu[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ hu[4]=( \eta _{30}-3 \eta _{12})( \eta _{30}+ \eta _{12})[( \eta _{30}+ \eta _{12})^{2}-3( \eta _{21}+ \eta _{03})^{2}]+(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ hu[5]=( \eta _{20}- \eta _{02})[( \eta _{30}+ \eta _{12})^{2}- ( \eta _{21}+ \eta _{03})^{2}]+4 \eta _{11}( \eta _{30}+ \eta _{12})( \eta _{21}+ \eta _{03}) \\ hu[6]=(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}]-( \eta _{30}-3 \eta _{12})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ \end{array}\f] + +where \f$\eta_{ji}\f$ stands for \f$\texttt{Moments::nu}_{ji}\f$ . + +These values are proved to be invariants to the image scale, rotation, and reflection except the +seventh one, whose sign is changed by reflection. This invariance is proved with the assumption of +infinite image resolution. In case of raster images, the computed Hu invariants for the original and +transformed images are a bit different. + +@param moments Input moments computed with moments . +@param hu Output Hu invariants. + +@sa matchShapes + */ +CV_EXPORTS void HuMoments( const Moments& moments, double hu[7] ); + +/** @overload */ +CV_EXPORTS_W void HuMoments( const Moments& m, OutputArray hu ); + +//! @} imgproc_shape + +//! @addtogroup imgproc_object +//! @{ + +//! type of the template matching operation +enum TemplateMatchModes { + TM_SQDIFF = 0, /*!< \f[R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2\f] + with mask: + \f[R(x,y)= \sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot + M(x',y') \right)^2\f] */ + TM_SQDIFF_NORMED = 1, /*!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{ + x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] + with mask: + \f[R(x,y)= \frac{\sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot + M(x',y') \right)^2}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot + M(x',y') \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot + M(x',y') \right)^2}}\f] */ + TM_CCORR = 2, /*!< \f[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))\f] + with mask: + \f[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot M(x',y') + ^2)\f] */ + TM_CCORR_NORMED = 3, /*!< \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{ + \sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\f] + with mask: + \f[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot + M(x',y')^2)}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot M(x',y') + \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot M(x',y') + \right)^2}}\f] */ + TM_CCOEFF = 4, /*!< \f[R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I'(x+x',y+y'))\f] + where + \f[\begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{ + x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) + \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}\f] + with mask: + \f[\begin{array}{l} T'(x',y')=M(x',y') \cdot \left( T(x',y') - + \frac{1}{\sum _{x'',y''} M(x'',y'')} \cdot \sum _{x'',y''} + (T(x'',y'') \cdot M(x'',y'')) \right) \\ I'(x+x',y+y')=M(x',y') + \cdot \left( I(x+x',y+y') - \frac{1}{\sum _{x'',y''} M(x'',y'')} + \cdot \sum _{x'',y''} (I(x+x'',y+y'') \cdot M(x'',y'')) \right) + \end{array} \f] */ + TM_CCOEFF_NORMED = 5 /*!< \f[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ + \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} + }\f] */ +}; + +/** @example samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp +An example using Template Matching algorithm +*/ + +/** @brief Compares a template against overlapped image regions. + +The function slides through image , compares the overlapped patches of size \f$w \times h\f$ against +templ using the specified method and stores the comparison results in result . #TemplateMatchModes +describes the formulae for the available comparison methods ( \f$I\f$ denotes image, \f$T\f$ +template, \f$R\f$ result, \f$M\f$ the optional mask ). The summation is done over template and/or +the image patch: \f$x' = 0...w-1, y' = 0...h-1\f$ + +After the function finishes the comparison, the best matches can be found as global minimums (when +#TM_SQDIFF was used) or maximums (when #TM_CCORR or #TM_CCOEFF was used) using the +#minMaxLoc function. In case of a color image, template summation in the numerator and each sum in +the denominator is done over all of the channels and separate mean values are used for each channel. +That is, the function can take a color template and a color image. The result will still be a +single-channel image, which is easier to analyze. + +@param image Image where the search is running. It must be 8-bit or 32-bit floating-point. +@param templ Searched template. It must be not greater than the source image and have the same +data type. +@param result Map of comparison results. It must be single-channel 32-bit floating-point. If image +is \f$W \times H\f$ and templ is \f$w \times h\f$ , then result is \f$(W-w+1) \times (H-h+1)\f$ . +@param method Parameter specifying the comparison method, see #TemplateMatchModes +@param mask Optional mask. It must have the same size as templ. It must either have the same number + of channels as template or only one channel, which is then used for all template and + image channels. If the data type is #CV_8U, the mask is interpreted as a binary mask, + meaning only elements where mask is nonzero are used and are kept unchanged independent + of the actual mask value (weight equals 1). For data tpye #CV_32F, the mask values are + used as weights. The exact formulas are documented in #TemplateMatchModes. + */ +CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, + OutputArray result, int method, InputArray mask = noArray() ); + +//! @} + +//! @addtogroup imgproc_shape +//! @{ + +/** @example samples/cpp/connected_components.cpp +This program demonstrates connected components and use of the trackbar +*/ + +/** @brief computes the connected components labeled image of boolean image + +image with 4 or 8 way connectivity - returns N, the total number of labels [0, N-1] where 0 +represents the background label. ltype specifies the output label image type, an important +consideration based on the total number of labels or alternatively the total number of pixels in +the source image. ccltype specifies the connected components labeling algorithm to use, currently +Bolelli (Spaghetti) @cite Bolelli2019, Grana (BBDT) @cite Grana2010 and Wu's (SAUF) @cite Wu2009 algorithms +are supported, see the #ConnectedComponentsAlgorithmsTypes for details. Note that SAUF algorithm forces +a row major ordering of labels while Spaghetti and BBDT do not. +This function uses parallel version of the algorithms if at least one allowed +parallel framework is enabled and if the rows of the image are at least twice the number returned by #getNumberOfCPUs. + +@param image the 8-bit single-channel image to be labeled +@param labels destination labeled image +@param connectivity 8 or 4 for 8-way or 4-way connectivity respectively +@param ltype output image label type. Currently CV_32S and CV_16U are supported. +@param ccltype connected components algorithm type (see the #ConnectedComponentsAlgorithmsTypes). +*/ +CV_EXPORTS_AS(connectedComponentsWithAlgorithm) int connectedComponents(InputArray image, OutputArray labels, + int connectivity, int ltype, int ccltype); + + +/** @overload + +@param image the 8-bit single-channel image to be labeled +@param labels destination labeled image +@param connectivity 8 or 4 for 8-way or 4-way connectivity respectively +@param ltype output image label type. Currently CV_32S and CV_16U are supported. +*/ +CV_EXPORTS_W int connectedComponents(InputArray image, OutputArray labels, + int connectivity = 8, int ltype = CV_32S); + + +/** @brief computes the connected components labeled image of boolean image and also produces a statistics output for each label + +image with 4 or 8 way connectivity - returns N, the total number of labels [0, N-1] where 0 +represents the background label. ltype specifies the output label image type, an important +consideration based on the total number of labels or alternatively the total number of pixels in +the source image. ccltype specifies the connected components labeling algorithm to use, currently +Bolelli (Spaghetti) @cite Bolelli2019, Grana (BBDT) @cite Grana2010 and Wu's (SAUF) @cite Wu2009 algorithms +are supported, see the #ConnectedComponentsAlgorithmsTypes for details. Note that SAUF algorithm forces +a row major ordering of labels while Spaghetti and BBDT do not. +This function uses parallel version of the algorithms (statistics included) if at least one allowed +parallel framework is enabled and if the rows of the image are at least twice the number returned by #getNumberOfCPUs. + +@param image the 8-bit single-channel image to be labeled +@param labels destination labeled image +@param stats statistics output for each label, including the background label. +Statistics are accessed via stats(label, COLUMN) where COLUMN is one of +#ConnectedComponentsTypes, selecting the statistic. The data type is CV_32S. +@param centroids centroid output for each label, including the background label. Centroids are +accessed via centroids(label, 0) for x and centroids(label, 1) for y. The data type CV_64F. +@param connectivity 8 or 4 for 8-way or 4-way connectivity respectively +@param ltype output image label type. Currently CV_32S and CV_16U are supported. +@param ccltype connected components algorithm type (see #ConnectedComponentsAlgorithmsTypes). +*/ +CV_EXPORTS_AS(connectedComponentsWithStatsWithAlgorithm) int connectedComponentsWithStats(InputArray image, OutputArray labels, + OutputArray stats, OutputArray centroids, + int connectivity, int ltype, int ccltype); + +/** @overload +@param image the 8-bit single-channel image to be labeled +@param labels destination labeled image +@param stats statistics output for each label, including the background label. +Statistics are accessed via stats(label, COLUMN) where COLUMN is one of +#ConnectedComponentsTypes, selecting the statistic. The data type is CV_32S. +@param centroids centroid output for each label, including the background label. Centroids are +accessed via centroids(label, 0) for x and centroids(label, 1) for y. The data type CV_64F. +@param connectivity 8 or 4 for 8-way or 4-way connectivity respectively +@param ltype output image label type. Currently CV_32S and CV_16U are supported. +*/ +CV_EXPORTS_W int connectedComponentsWithStats(InputArray image, OutputArray labels, + OutputArray stats, OutputArray centroids, + int connectivity = 8, int ltype = CV_32S); + + +/** @brief Finds contours in a binary image. + +The function retrieves contours from the binary image using the algorithm @cite Suzuki85 . The contours +are a useful tool for shape analysis and object detection and recognition. See squares.cpp in the +OpenCV sample directory. +@note Since opencv 3.2 source image is not modified by this function. + +@param image Source, an 8-bit single-channel image. Non-zero pixels are treated as 1's. Zero +pixels remain 0's, so the image is treated as binary . You can use #compare, #inRange, #threshold , +#adaptiveThreshold, #Canny, and others to create a binary image out of a grayscale or color one. +If mode equals to #RETR_CCOMP or #RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1). +@param contours Detected contours. Each contour is stored as a vector of points (e.g. +std::vector >). +@param hierarchy Optional output vector (e.g. std::vector), containing information about the image topology. It has +as many elements as the number of contours. For each i-th contour contours[i], the elements +hierarchy[i][0] , hierarchy[i][1] , hierarchy[i][2] , and hierarchy[i][3] are set to 0-based indices +in contours of the next and previous contours at the same hierarchical level, the first child +contour and the parent contour, respectively. If for the contour i there are no next, previous, +parent, or nested contours, the corresponding elements of hierarchy[i] will be negative. +@note In Python, hierarchy is nested inside a top level array. Use hierarchy[0][i] to access hierarchical elements of i-th contour. +@param mode Contour retrieval mode, see #RetrievalModes +@param method Contour approximation method, see #ContourApproximationModes +@param offset Optional offset by which every contour point is shifted. This is useful if the +contours are extracted from the image ROI and then they should be analyzed in the whole image +context. + */ +CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours, + OutputArray hierarchy, int mode, + int method, Point offset = Point()); + +/** @overload */ +CV_EXPORTS void findContours( InputArray image, OutputArrayOfArrays contours, + int mode, int method, Point offset = Point()); + +/** @example samples/cpp/squares.cpp +A program using pyramid scaling, Canny, contours and contour simplification to find +squares in a list of images (pic1-6.png). Returns sequence of squares detected on the image. +*/ + +/** @example samples/tapi/squares.cpp +A program using pyramid scaling, Canny, contours and contour simplification to find +squares in the input image. +*/ + +/** @brief Approximates a polygonal curve(s) with the specified precision. + +The function cv::approxPolyDP approximates a curve or a polygon with another curve/polygon with less +vertices so that the distance between them is less or equal to the specified precision. It uses the +Douglas-Peucker algorithm + +@param curve Input vector of a 2D point stored in std::vector or Mat +@param approxCurve Result of the approximation. The type should match the type of the input curve. +@param epsilon Parameter specifying the approximation accuracy. This is the maximum distance +between the original curve and its approximation. +@param closed If true, the approximated curve is closed (its first and last vertices are +connected). Otherwise, it is not closed. + */ +CV_EXPORTS_W void approxPolyDP( InputArray curve, + OutputArray approxCurve, + double epsilon, bool closed ); + +/** @brief Calculates a contour perimeter or a curve length. + +The function computes a curve length or a closed contour perimeter. + +@param curve Input vector of 2D points, stored in std::vector or Mat. +@param closed Flag indicating whether the curve is closed or not. + */ +CV_EXPORTS_W double arcLength( InputArray curve, bool closed ); + +/** @brief Calculates the up-right bounding rectangle of a point set or non-zero pixels of gray-scale image. + +The function calculates and returns the minimal up-right bounding rectangle for the specified point set or +non-zero pixels of gray-scale image. + +@param array Input gray-scale image or 2D point set, stored in std::vector or Mat. + */ +CV_EXPORTS_W Rect boundingRect( InputArray array ); + +/** @brief Calculates a contour area. + +The function computes a contour area. Similarly to moments , the area is computed using the Green +formula. Thus, the returned area and the number of non-zero pixels, if you draw the contour using +#drawContours or #fillPoly , can be different. Also, the function will most certainly give a wrong +results for contours with self-intersections. + +Example: +@code + vector contour; + contour.push_back(Point2f(0, 0)); + contour.push_back(Point2f(10, 0)); + contour.push_back(Point2f(10, 10)); + contour.push_back(Point2f(5, 4)); + + double area0 = contourArea(contour); + vector approx; + approxPolyDP(contour, approx, 5, true); + double area1 = contourArea(approx); + + cout << "area0 =" << area0 << endl << + "area1 =" << area1 << endl << + "approx poly vertices" << approx.size() << endl; +@endcode +@param contour Input vector of 2D points (contour vertices), stored in std::vector or Mat. +@param oriented Oriented area flag. If it is true, the function returns a signed area value, +depending on the contour orientation (clockwise or counter-clockwise). Using this feature you can +determine orientation of a contour by taking the sign of an area. By default, the parameter is +false, which means that the absolute value is returned. + */ +CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false ); + +/** @brief Finds a rotated rectangle of the minimum area enclosing the input 2D point set. + +The function calculates and returns the minimum-area bounding rectangle (possibly rotated) for a +specified point set. Developer should keep in mind that the returned RotatedRect can contain negative +indices when data is close to the containing Mat element boundary. + +@param points Input vector of 2D points, stored in std::vector\<\> or Mat + */ +CV_EXPORTS_W RotatedRect minAreaRect( InputArray points ); + +/** @brief Finds the four vertices of a rotated rect. Useful to draw the rotated rectangle. + +The function finds the four vertices of a rotated rectangle. This function is useful to draw the +rectangle. In C++, instead of using this function, you can directly use RotatedRect::points method. Please +visit the @ref tutorial_bounding_rotated_ellipses "tutorial on Creating Bounding rotated boxes and ellipses for contours" for more information. + +@param box The input rotated rectangle. It may be the output of @ref minAreaRect. +@param points The output array of four vertices of rectangles. + */ +CV_EXPORTS_W void boxPoints(RotatedRect box, OutputArray points); + +/** @brief Finds a circle of the minimum area enclosing a 2D point set. + +The function finds the minimal enclosing circle of a 2D point set using an iterative algorithm. + +@param points Input vector of 2D points, stored in std::vector\<\> or Mat +@param center Output center of the circle. +@param radius Output radius of the circle. + */ +CV_EXPORTS_W void minEnclosingCircle( InputArray points, + CV_OUT Point2f& center, CV_OUT float& radius ); + +/** @example samples/cpp/minarea.cpp +*/ + +/** @brief Finds a triangle of minimum area enclosing a 2D point set and returns its area. + +The function finds a triangle of minimum area enclosing the given set of 2D points and returns its +area. The output for a given 2D point set is shown in the image below. 2D points are depicted in +*red* and the enclosing triangle in *yellow*. + +![Sample output of the minimum enclosing triangle function](pics/minenclosingtriangle.png) + +The implementation of the algorithm is based on O'Rourke's @cite ORourke86 and Klee and Laskowski's +@cite KleeLaskowski85 papers. O'Rourke provides a \f$\theta(n)\f$ algorithm for finding the minimal +enclosing triangle of a 2D convex polygon with n vertices. Since the #minEnclosingTriangle function +takes a 2D point set as input an additional preprocessing step of computing the convex hull of the +2D point set is required. The complexity of the #convexHull function is \f$O(n log(n))\f$ which is higher +than \f$\theta(n)\f$. Thus the overall complexity of the function is \f$O(n log(n))\f$. + +@param points Input vector of 2D points with depth CV_32S or CV_32F, stored in std::vector\<\> or Mat +@param triangle Output vector of three 2D points defining the vertices of the triangle. The depth +of the OutputArray must be CV_32F. + */ +CV_EXPORTS_W double minEnclosingTriangle( InputArray points, CV_OUT OutputArray triangle ); + +/** @brief Compares two shapes. + +The function compares two shapes. All three implemented methods use the Hu invariants (see #HuMoments) + +@param contour1 First contour or grayscale image. +@param contour2 Second contour or grayscale image. +@param method Comparison method, see #ShapeMatchModes +@param parameter Method-specific parameter (not supported now). + */ +CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2, + int method, double parameter ); + +/** @example samples/cpp/convexhull.cpp +An example using the convexHull functionality +*/ + +/** @brief Finds the convex hull of a point set. + +The function cv::convexHull finds the convex hull of a 2D point set using the Sklansky's algorithm @cite Sklansky82 +that has *O(N logN)* complexity in the current implementation. + +@param points Input 2D point set, stored in std::vector or Mat. +@param hull Output convex hull. It is either an integer vector of indices or vector of points. In +the first case, the hull elements are 0-based indices of the convex hull points in the original +array (since the set of convex hull points is a subset of the original point set). In the second +case, hull elements are the convex hull points themselves. +@param clockwise Orientation flag. If it is true, the output convex hull is oriented clockwise. +Otherwise, it is oriented counter-clockwise. The assumed coordinate system has its X axis pointing +to the right, and its Y axis pointing upwards. +@param returnPoints Operation flag. In case of a matrix, when the flag is true, the function +returns convex hull points. Otherwise, it returns indices of the convex hull points. When the +output array is std::vector, the flag is ignored, and the output depends on the type of the +vector: std::vector\ implies returnPoints=false, std::vector\ implies +returnPoints=true. + +@note `points` and `hull` should be different arrays, inplace processing isn't supported. + +Check @ref tutorial_hull "the corresponding tutorial" for more details. + +useful links: + +https://www.learnopencv.com/convex-hull-using-opencv-in-python-and-c/ + */ +CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull, + bool clockwise = false, bool returnPoints = true ); + +/** @brief Finds the convexity defects of a contour. + +The figure below displays convexity defects of a hand contour: + +![image](pics/defects.png) + +@param contour Input contour. +@param convexhull Convex hull obtained using convexHull that should contain indices of the contour +points that make the hull. +@param convexityDefects The output vector of convexity defects. In C++ and the new Python/Java +interface each convexity defect is represented as 4-element integer vector (a.k.a. #Vec4i): +(start_index, end_index, farthest_pt_index, fixpt_depth), where indices are 0-based indices +in the original contour of the convexity defect beginning, end and the farthest point, and +fixpt_depth is fixed-point approximation (with 8 fractional bits) of the distance between the +farthest contour point and the hull. That is, to get the floating-point value of the depth will be +fixpt_depth/256.0. + */ +CV_EXPORTS_W void convexityDefects( InputArray contour, InputArray convexhull, OutputArray convexityDefects ); + +/** @brief Tests a contour convexity. + +The function tests whether the input contour is convex or not. The contour must be simple, that is, +without self-intersections. Otherwise, the function output is undefined. + +@param contour Input vector of 2D points, stored in std::vector\<\> or Mat + */ +CV_EXPORTS_W bool isContourConvex( InputArray contour ); + +/** @example samples/cpp/intersectExample.cpp +Examples of how intersectConvexConvex works +*/ + +/** @brief Finds intersection of two convex polygons + +@param p1 First polygon +@param p2 Second polygon +@param p12 Output polygon describing the intersecting area +@param handleNested When true, an intersection is found if one of the polygons is fully enclosed in the other. +When false, no intersection is found. If the polygons share a side or the vertex of one polygon lies on an edge +of the other, they are not considered nested and an intersection will be found regardless of the value of handleNested. + +@returns Absolute value of area of intersecting polygon + +@note intersectConvexConvex doesn't confirm that both polygons are convex and will return invalid results if they aren't. + */ +CV_EXPORTS_W float intersectConvexConvex( InputArray p1, InputArray p2, + OutputArray p12, bool handleNested = true ); + +/** @example samples/cpp/fitellipse.cpp +An example using the fitEllipse technique +*/ + +/** @brief Fits an ellipse around a set of 2D points. + +The function calculates the ellipse that fits (in a least-squares sense) a set of 2D points best of +all. It returns the rotated rectangle in which the ellipse is inscribed. The first algorithm described by @cite Fitzgibbon95 +is used. Developer should keep in mind that it is possible that the returned +ellipse/rotatedRect data contains negative indices, due to the data points being close to the +border of the containing Mat element. + +@param points Input 2D point set, stored in std::vector\<\> or Mat + */ +CV_EXPORTS_W RotatedRect fitEllipse( InputArray points ); + +/** @brief Fits an ellipse around a set of 2D points. + + The function calculates the ellipse that fits a set of 2D points. + It returns the rotated rectangle in which the ellipse is inscribed. + The Approximate Mean Square (AMS) proposed by @cite Taubin1991 is used. + + For an ellipse, this basis set is \f$ \chi= \left(x^2, x y, y^2, x, y, 1\right) \f$, + which is a set of six free coefficients \f$ A^T=\left\{A_{\text{xx}},A_{\text{xy}},A_{\text{yy}},A_x,A_y,A_0\right\} \f$. + However, to specify an ellipse, all that is needed is five numbers; the major and minor axes lengths \f$ (a,b) \f$, + the position \f$ (x_0,y_0) \f$, and the orientation \f$ \theta \f$. This is because the basis set includes lines, + quadratics, parabolic and hyperbolic functions as well as elliptical functions as possible fits. + If the fit is found to be a parabolic or hyperbolic function then the standard #fitEllipse method is used. + The AMS method restricts the fit to parabolic, hyperbolic and elliptical curves + by imposing the condition that \f$ A^T ( D_x^T D_x + D_y^T D_y) A = 1 \f$ where + the matrices \f$ Dx \f$ and \f$ Dy \f$ are the partial derivatives of the design matrix \f$ D \f$ with + respect to x and y. The matrices are formed row by row applying the following to + each of the points in the set: + \f{align*}{ + D(i,:)&=\left\{x_i^2, x_i y_i, y_i^2, x_i, y_i, 1\right\} & + D_x(i,:)&=\left\{2 x_i,y_i,0,1,0,0\right\} & + D_y(i,:)&=\left\{0,x_i,2 y_i,0,1,0\right\} + \f} + The AMS method minimizes the cost function + \f{equation*}{ + \epsilon ^2=\frac{ A^T D^T D A }{ A^T (D_x^T D_x + D_y^T D_y) A^T } + \f} + + The minimum cost is found by solving the generalized eigenvalue problem. + + \f{equation*}{ + D^T D A = \lambda \left( D_x^T D_x + D_y^T D_y\right) A + \f} + + @param points Input 2D point set, stored in std::vector\<\> or Mat + */ +CV_EXPORTS_W RotatedRect fitEllipseAMS( InputArray points ); + + +/** @brief Fits an ellipse around a set of 2D points. + + The function calculates the ellipse that fits a set of 2D points. + It returns the rotated rectangle in which the ellipse is inscribed. + The Direct least square (Direct) method by @cite Fitzgibbon1999 is used. + + For an ellipse, this basis set is \f$ \chi= \left(x^2, x y, y^2, x, y, 1\right) \f$, + which is a set of six free coefficients \f$ A^T=\left\{A_{\text{xx}},A_{\text{xy}},A_{\text{yy}},A_x,A_y,A_0\right\} \f$. + However, to specify an ellipse, all that is needed is five numbers; the major and minor axes lengths \f$ (a,b) \f$, + the position \f$ (x_0,y_0) \f$, and the orientation \f$ \theta \f$. This is because the basis set includes lines, + quadratics, parabolic and hyperbolic functions as well as elliptical functions as possible fits. + The Direct method confines the fit to ellipses by ensuring that \f$ 4 A_{xx} A_{yy}- A_{xy}^2 > 0 \f$. + The condition imposed is that \f$ 4 A_{xx} A_{yy}- A_{xy}^2=1 \f$ which satisfies the inequality + and as the coefficients can be arbitrarily scaled is not overly restrictive. + + \f{equation*}{ + \epsilon ^2= A^T D^T D A \quad \text{with} \quad A^T C A =1 \quad \text{and} \quad C=\left(\begin{matrix} + 0 & 0 & 2 & 0 & 0 & 0 \\ + 0 & -1 & 0 & 0 & 0 & 0 \\ + 2 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 + \end{matrix} \right) + \f} + + The minimum cost is found by solving the generalized eigenvalue problem. + + \f{equation*}{ + D^T D A = \lambda \left( C\right) A + \f} + + The system produces only one positive eigenvalue \f$ \lambda\f$ which is chosen as the solution + with its eigenvector \f$\mathbf{u}\f$. These are used to find the coefficients + + \f{equation*}{ + A = \sqrt{\frac{1}{\mathbf{u}^T C \mathbf{u}}} \mathbf{u} + \f} + The scaling factor guarantees that \f$A^T C A =1\f$. + + @param points Input 2D point set, stored in std::vector\<\> or Mat + */ +CV_EXPORTS_W RotatedRect fitEllipseDirect( InputArray points ); + +/** @brief Fits a line to a 2D or 3D point set. + +The function fitLine fits a line to a 2D or 3D point set by minimizing \f$\sum_i \rho(r_i)\f$ where +\f$r_i\f$ is a distance between the \f$i^{th}\f$ point, the line and \f$\rho(r)\f$ is a distance function, one +of the following: +- DIST_L2 +\f[\rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)}\f] +- DIST_L1 +\f[\rho (r) = r\f] +- DIST_L12 +\f[\rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1)\f] +- DIST_FAIR +\f[\rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998\f] +- DIST_WELSCH +\f[\rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846\f] +- DIST_HUBER +\f[\rho (r) = \fork{r^2/2}{if \(r < C\)}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345\f] + +The algorithm is based on the M-estimator ( ) technique +that iteratively fits the line using the weighted least-squares algorithm. After each iteration the +weights \f$w_i\f$ are adjusted to be inversely proportional to \f$\rho(r_i)\f$ . + +@param points Input vector of 2D or 3D points, stored in std::vector\<\> or Mat. +@param line Output line parameters. In case of 2D fitting, it should be a vector of 4 elements +(like Vec4f) - (vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and +(x0, y0) is a point on the line. In case of 3D fitting, it should be a vector of 6 elements (like +Vec6f) - (vx, vy, vz, x0, y0, z0), where (vx, vy, vz) is a normalized vector collinear to the line +and (x0, y0, z0) is a point on the line. +@param distType Distance used by the M-estimator, see #DistanceTypes +@param param Numerical parameter ( C ) for some types of distances. If it is 0, an optimal value +is chosen. +@param reps Sufficient accuracy for the radius (distance between the coordinate origin and the line). +@param aeps Sufficient accuracy for the angle. 0.01 would be a good default value for reps and aeps. + */ +CV_EXPORTS_W void fitLine( InputArray points, OutputArray line, int distType, + double param, double reps, double aeps ); + +/** @brief Performs a point-in-contour test. + +The function determines whether the point is inside a contour, outside, or lies on an edge (or +coincides with a vertex). It returns positive (inside), negative (outside), or zero (on an edge) +value, correspondingly. When measureDist=false , the return value is +1, -1, and 0, respectively. +Otherwise, the return value is a signed distance between the point and the nearest contour edge. + +See below a sample output of the function where each image pixel is tested against the contour: + +![sample output](pics/pointpolygon.png) + +@param contour Input contour. +@param pt Point tested against the contour. +@param measureDist If true, the function estimates the signed distance from the point to the +nearest contour edge. Otherwise, the function only checks if the point is inside a contour or not. + */ +CV_EXPORTS_W double pointPolygonTest( InputArray contour, Point2f pt, bool measureDist ); + +/** @brief Finds out if there is any intersection between two rotated rectangles. + +If there is then the vertices of the intersecting region are returned as well. + +Below are some examples of intersection configurations. The hatched pattern indicates the +intersecting region and the red vertices are returned by the function. + +![intersection examples](pics/intersection.png) + +@param rect1 First rectangle +@param rect2 Second rectangle +@param intersectingRegion The output array of the vertices of the intersecting region. It returns +at most 8 vertices. Stored as std::vector\ or cv::Mat as Mx1 of type CV_32FC2. +@returns One of #RectanglesIntersectTypes + */ +CV_EXPORTS_W int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& rect2, OutputArray intersectingRegion ); + +/** @brief Creates a smart pointer to a cv::GeneralizedHoughBallard class and initializes it. +*/ +CV_EXPORTS_W Ptr createGeneralizedHoughBallard(); + +/** @brief Creates a smart pointer to a cv::GeneralizedHoughGuil class and initializes it. +*/ +CV_EXPORTS_W Ptr createGeneralizedHoughGuil(); + +//! @} imgproc_shape + +//! @addtogroup imgproc_colormap +//! @{ + +//! GNU Octave/MATLAB equivalent colormaps +enum ColormapTypes +{ + COLORMAP_AUTUMN = 0, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg) + COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg) + COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg) + COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg) + COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg) + COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg) + COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg) + COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg) + COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg) + COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg) + COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg) + COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg) + COLORMAP_PARULA = 12, //!< ![parula](pics/colormaps/colorscale_parula.jpg) + COLORMAP_MAGMA = 13, //!< ![magma](pics/colormaps/colorscale_magma.jpg) + COLORMAP_INFERNO = 14, //!< ![inferno](pics/colormaps/colorscale_inferno.jpg) + COLORMAP_PLASMA = 15, //!< ![plasma](pics/colormaps/colorscale_plasma.jpg) + COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg) + COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg) + COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg) + COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg) + COLORMAP_TURBO = 20, //!< ![turbo](pics/colormaps/colorscale_turbo.jpg) + COLORMAP_DEEPGREEN = 21 //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg) +}; + +/** @example samples/cpp/falsecolor.cpp +An example using applyColorMap function +*/ + +/** @brief Applies a GNU Octave/MATLAB equivalent colormap on a given image. + +@param src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3. +@param dst The result is the colormapped source image. Note: Mat::create is called on dst. +@param colormap The colormap to apply, see #ColormapTypes +*/ +CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, int colormap); + +/** @brief Applies a user colormap on a given image. + +@param src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3. +@param dst The result is the colormapped source image. Note: Mat::create is called on dst. +@param userColor The colormap to apply of type CV_8UC1 or CV_8UC3 and size 256 +*/ +CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, InputArray userColor); + +//! @} imgproc_colormap + +//! @addtogroup imgproc_draw +//! @{ + + +/** OpenCV color channel order is BGR[A] */ +#define CV_RGB(r, g, b) cv::Scalar((b), (g), (r), 0) + +/** @brief Draws a line segment connecting two points. + +The function line draws the line segment between pt1 and pt2 points in the image. The line is +clipped by the image boundaries. For non-antialiased lines with integer coordinates, the 8-connected +or 4-connected Bresenham algorithm is used. Thick lines are drawn with rounding endings. Antialiased +lines are drawn using Gaussian filtering. + +@param img Image. +@param pt1 First point of the line segment. +@param pt2 Second point of the line segment. +@param color Line color. +@param thickness Line thickness. +@param lineType Type of the line. See #LineTypes. +@param shift Number of fractional bits in the point coordinates. + */ +CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, + int thickness = 1, int lineType = LINE_8, int shift = 0); + +/** @brief Draws an arrow segment pointing from the first point to the second one. + +The function cv::arrowedLine draws an arrow between pt1 and pt2 points in the image. See also #line. + +@param img Image. +@param pt1 The point the arrow starts from. +@param pt2 The point the arrow points to. +@param color Line color. +@param thickness Line thickness. +@param line_type Type of the line. See #LineTypes +@param shift Number of fractional bits in the point coordinates. +@param tipLength The length of the arrow tip in relation to the arrow length + */ +CV_EXPORTS_W void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, + int thickness=1, int line_type=8, int shift=0, double tipLength=0.1); + +/** @brief Draws a simple, thick, or filled up-right rectangle. + +The function cv::rectangle draws a rectangle outline or a filled rectangle whose two opposite corners +are pt1 and pt2. + +@param img Image. +@param pt1 Vertex of the rectangle. +@param pt2 Vertex of the rectangle opposite to pt1 . +@param color Rectangle color or brightness (grayscale image). +@param thickness Thickness of lines that make up the rectangle. Negative values, like #FILLED, +mean that the function has to draw a filled rectangle. +@param lineType Type of the line. See #LineTypes +@param shift Number of fractional bits in the point coordinates. + */ +CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2, + const Scalar& color, int thickness = 1, + int lineType = LINE_8, int shift = 0); + +/** @overload + +use `rec` parameter as alternative specification of the drawn rectangle: `r.tl() and +r.br()-Point(1,1)` are opposite corners +*/ +CV_EXPORTS_W void rectangle(InputOutputArray img, Rect rec, + const Scalar& color, int thickness = 1, + int lineType = LINE_8, int shift = 0); + +/** @example samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp +An example using drawing functions +*/ + +/** @brief Draws a circle. + +The function cv::circle draws a simple or filled circle with a given center and radius. +@param img Image where the circle is drawn. +@param center Center of the circle. +@param radius Radius of the circle. +@param color Circle color. +@param thickness Thickness of the circle outline, if positive. Negative values, like #FILLED, +mean that a filled circle is to be drawn. +@param lineType Type of the circle boundary. See #LineTypes +@param shift Number of fractional bits in the coordinates of the center and in the radius value. + */ +CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius, + const Scalar& color, int thickness = 1, + int lineType = LINE_8, int shift = 0); + +/** @brief Draws a simple or thick elliptic arc or fills an ellipse sector. + +The function cv::ellipse with more parameters draws an ellipse outline, a filled ellipse, an elliptic +arc, or a filled ellipse sector. The drawing code uses general parametric form. +A piecewise-linear curve is used to approximate the elliptic arc +boundary. If you need more control of the ellipse rendering, you can retrieve the curve using +#ellipse2Poly and then render it with #polylines or fill it with #fillPoly. If you use the first +variant of the function and want to draw the whole ellipse, not an arc, pass `startAngle=0` and +`endAngle=360`. If `startAngle` is greater than `endAngle`, they are swapped. The figure below explains +the meaning of the parameters to draw the blue arc. + +![Parameters of Elliptic Arc](pics/ellipse.svg) + +@param img Image. +@param center Center of the ellipse. +@param axes Half of the size of the ellipse main axes. +@param angle Ellipse rotation angle in degrees. +@param startAngle Starting angle of the elliptic arc in degrees. +@param endAngle Ending angle of the elliptic arc in degrees. +@param color Ellipse color. +@param thickness Thickness of the ellipse arc outline, if positive. Otherwise, this indicates that +a filled ellipse sector is to be drawn. +@param lineType Type of the ellipse boundary. See #LineTypes +@param shift Number of fractional bits in the coordinates of the center and values of axes. + */ +CV_EXPORTS_W void ellipse(InputOutputArray img, Point center, Size axes, + double angle, double startAngle, double endAngle, + const Scalar& color, int thickness = 1, + int lineType = LINE_8, int shift = 0); + +/** @overload +@param img Image. +@param box Alternative ellipse representation via RotatedRect. This means that the function draws +an ellipse inscribed in the rotated rectangle. +@param color Ellipse color. +@param thickness Thickness of the ellipse arc outline, if positive. Otherwise, this indicates that +a filled ellipse sector is to be drawn. +@param lineType Type of the ellipse boundary. See #LineTypes +*/ +CV_EXPORTS_W void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color, + int thickness = 1, int lineType = LINE_8); + +/* ----------------------------------------------------------------------------------------- */ +/* ADDING A SET OF PREDEFINED MARKERS WHICH COULD BE USED TO HIGHLIGHT POSITIONS IN AN IMAGE */ +/* ----------------------------------------------------------------------------------------- */ + +/** @brief Draws a marker on a predefined position in an image. + +The function cv::drawMarker draws a marker on a given position in the image. For the moment several +marker types are supported, see #MarkerTypes for more information. + +@param img Image. +@param position The point where the crosshair is positioned. +@param color Line color. +@param markerType The specific type of marker you want to use, see #MarkerTypes +@param thickness Line thickness. +@param line_type Type of the line, See #LineTypes +@param markerSize The length of the marker axis [default = 20 pixels] + */ +CV_EXPORTS_W void drawMarker(InputOutputArray img, Point position, const Scalar& color, + int markerType = MARKER_CROSS, int markerSize=20, int thickness=1, + int line_type=8); + +/* ----------------------------------------------------------------------------------------- */ +/* END OF MARKER SECTION */ +/* ----------------------------------------------------------------------------------------- */ + +/** @brief Fills a convex polygon. + +The function cv::fillConvexPoly draws a filled convex polygon. This function is much faster than the +function #fillPoly . It can fill not only convex polygons but any monotonic polygon without +self-intersections, that is, a polygon whose contour intersects every horizontal line (scan line) +twice at the most (though, its top-most and/or the bottom edge could be horizontal). + +@param img Image. +@param points Polygon vertices. +@param color Polygon color. +@param lineType Type of the polygon boundaries. See #LineTypes +@param shift Number of fractional bits in the vertex coordinates. + */ +CV_EXPORTS_W void fillConvexPoly(InputOutputArray img, InputArray points, + const Scalar& color, int lineType = LINE_8, + int shift = 0); + +/** @overload */ +CV_EXPORTS void fillConvexPoly(InputOutputArray img, const Point* pts, int npts, + const Scalar& color, int lineType = LINE_8, + int shift = 0); + +/** @example samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp +An example using drawing functions +Check @ref tutorial_random_generator_and_text "the corresponding tutorial" for more details +*/ + +/** @brief Fills the area bounded by one or more polygons. + +The function cv::fillPoly fills an area bounded by several polygonal contours. The function can fill +complex areas, for example, areas with holes, contours with self-intersections (some of their +parts), and so forth. + +@param img Image. +@param pts Array of polygons where each polygon is represented as an array of points. +@param color Polygon color. +@param lineType Type of the polygon boundaries. See #LineTypes +@param shift Number of fractional bits in the vertex coordinates. +@param offset Optional offset of all points of the contours. + */ +CV_EXPORTS_W void fillPoly(InputOutputArray img, InputArrayOfArrays pts, + const Scalar& color, int lineType = LINE_8, int shift = 0, + Point offset = Point() ); + +/** @overload */ +CV_EXPORTS void fillPoly(InputOutputArray img, const Point** pts, + const int* npts, int ncontours, + const Scalar& color, int lineType = LINE_8, int shift = 0, + Point offset = Point() ); + +/** @brief Draws several polygonal curves. + +@param img Image. +@param pts Array of polygonal curves. +@param isClosed Flag indicating whether the drawn polylines are closed or not. If they are closed, +the function draws a line from the last vertex of each curve to its first vertex. +@param color Polyline color. +@param thickness Thickness of the polyline edges. +@param lineType Type of the line segments. See #LineTypes +@param shift Number of fractional bits in the vertex coordinates. + +The function cv::polylines draws one or more polygonal curves. + */ +CV_EXPORTS_W void polylines(InputOutputArray img, InputArrayOfArrays pts, + bool isClosed, const Scalar& color, + int thickness = 1, int lineType = LINE_8, int shift = 0 ); + +/** @overload */ +CV_EXPORTS void polylines(InputOutputArray img, const Point* const* pts, const int* npts, + int ncontours, bool isClosed, const Scalar& color, + int thickness = 1, int lineType = LINE_8, int shift = 0 ); + +/** @example samples/cpp/contours2.cpp +An example program illustrates the use of cv::findContours and cv::drawContours +\image html WindowsQtContoursOutput.png "Screenshot of the program" +*/ + +/** @example samples/cpp/segment_objects.cpp +An example using drawContours to clean up a background segmentation result +*/ + +/** @brief Draws contours outlines or filled contours. + +The function draws contour outlines in the image if \f$\texttt{thickness} \ge 0\f$ or fills the area +bounded by the contours if \f$\texttt{thickness}<0\f$ . The example below shows how to retrieve +connected components from the binary image and label them: : +@include snippets/imgproc_drawContours.cpp + +@param image Destination image. +@param contours All the input contours. Each contour is stored as a point vector. +@param contourIdx Parameter indicating a contour to draw. If it is negative, all the contours are drawn. +@param color Color of the contours. +@param thickness Thickness of lines the contours are drawn with. If it is negative (for example, +thickness=#FILLED ), the contour interiors are drawn. +@param lineType Line connectivity. See #LineTypes +@param hierarchy Optional information about hierarchy. It is only needed if you want to draw only +some of the contours (see maxLevel ). +@param maxLevel Maximal level for drawn contours. If it is 0, only the specified contour is drawn. +If it is 1, the function draws the contour(s) and all the nested contours. If it is 2, the function +draws the contours, all the nested contours, all the nested-to-nested contours, and so on. This +parameter is only taken into account when there is hierarchy available. +@param offset Optional contour shift parameter. Shift all the drawn contours by the specified +\f$\texttt{offset}=(dx,dy)\f$ . +@note When thickness=#FILLED, the function is designed to handle connected components with holes correctly +even when no hierarchy data is provided. This is done by analyzing all the outlines together +using even-odd rule. This may give incorrect results if you have a joint collection of separately retrieved +contours. In order to solve this problem, you need to call #drawContours separately for each sub-group +of contours, or iterate over the collection using contourIdx parameter. + */ +CV_EXPORTS_W void drawContours( InputOutputArray image, InputArrayOfArrays contours, + int contourIdx, const Scalar& color, + int thickness = 1, int lineType = LINE_8, + InputArray hierarchy = noArray(), + int maxLevel = INT_MAX, Point offset = Point() ); + +/** @brief Clips the line against the image rectangle. + +The function cv::clipLine calculates a part of the line segment that is entirely within the specified +rectangle. It returns false if the line segment is completely outside the rectangle. Otherwise, +it returns true . +@param imgSize Image size. The image rectangle is Rect(0, 0, imgSize.width, imgSize.height) . +@param pt1 First line point. +@param pt2 Second line point. + */ +CV_EXPORTS bool clipLine(Size imgSize, CV_IN_OUT Point& pt1, CV_IN_OUT Point& pt2); + +/** @overload +@param imgSize Image size. The image rectangle is Rect(0, 0, imgSize.width, imgSize.height) . +@param pt1 First line point. +@param pt2 Second line point. +*/ +CV_EXPORTS bool clipLine(Size2l imgSize, CV_IN_OUT Point2l& pt1, CV_IN_OUT Point2l& pt2); + +/** @overload +@param imgRect Image rectangle. +@param pt1 First line point. +@param pt2 Second line point. +*/ +CV_EXPORTS_W bool clipLine(Rect imgRect, CV_OUT CV_IN_OUT Point& pt1, CV_OUT CV_IN_OUT Point& pt2); + +/** @brief Approximates an elliptic arc with a polyline. + +The function ellipse2Poly computes the vertices of a polyline that approximates the specified +elliptic arc. It is used by #ellipse. If `arcStart` is greater than `arcEnd`, they are swapped. + +@param center Center of the arc. +@param axes Half of the size of the ellipse main axes. See #ellipse for details. +@param angle Rotation angle of the ellipse in degrees. See #ellipse for details. +@param arcStart Starting angle of the elliptic arc in degrees. +@param arcEnd Ending angle of the elliptic arc in degrees. +@param delta Angle between the subsequent polyline vertices. It defines the approximation +accuracy. +@param pts Output vector of polyline vertices. + */ +CV_EXPORTS_W void ellipse2Poly( Point center, Size axes, int angle, + int arcStart, int arcEnd, int delta, + CV_OUT std::vector& pts ); + +/** @overload +@param center Center of the arc. +@param axes Half of the size of the ellipse main axes. See #ellipse for details. +@param angle Rotation angle of the ellipse in degrees. See #ellipse for details. +@param arcStart Starting angle of the elliptic arc in degrees. +@param arcEnd Ending angle of the elliptic arc in degrees. +@param delta Angle between the subsequent polyline vertices. It defines the approximation accuracy. +@param pts Output vector of polyline vertices. +*/ +CV_EXPORTS void ellipse2Poly(Point2d center, Size2d axes, int angle, + int arcStart, int arcEnd, int delta, + CV_OUT std::vector& pts); + +/** @brief Draws a text string. + +The function cv::putText renders the specified text string in the image. Symbols that cannot be rendered +using the specified font are replaced by question marks. See #getTextSize for a text rendering code +example. + +@param img Image. +@param text Text string to be drawn. +@param org Bottom-left corner of the text string in the image. +@param fontFace Font type, see #HersheyFonts. +@param fontScale Font scale factor that is multiplied by the font-specific base size. +@param color Text color. +@param thickness Thickness of the lines used to draw a text. +@param lineType Line type. See #LineTypes +@param bottomLeftOrigin When true, the image data origin is at the bottom-left corner. Otherwise, +it is at the top-left corner. + */ +CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org, + int fontFace, double fontScale, Scalar color, + int thickness = 1, int lineType = LINE_8, + bool bottomLeftOrigin = false ); + +/** @brief Calculates the width and height of a text string. + +The function cv::getTextSize calculates and returns the size of a box that contains the specified text. +That is, the following code renders some text, the tight box surrounding it, and the baseline: : +@code + String text = "Funny text inside the box"; + int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX; + double fontScale = 2; + int thickness = 3; + + Mat img(600, 800, CV_8UC3, Scalar::all(0)); + + int baseline=0; + Size textSize = getTextSize(text, fontFace, + fontScale, thickness, &baseline); + baseline += thickness; + + // center the text + Point textOrg((img.cols - textSize.width)/2, + (img.rows + textSize.height)/2); + + // draw the box + rectangle(img, textOrg + Point(0, baseline), + textOrg + Point(textSize.width, -textSize.height), + Scalar(0,0,255)); + // ... and the baseline first + line(img, textOrg + Point(0, thickness), + textOrg + Point(textSize.width, thickness), + Scalar(0, 0, 255)); + + // then put the text itself + putText(img, text, textOrg, fontFace, fontScale, + Scalar::all(255), thickness, 8); +@endcode + +@param text Input text string. +@param fontFace Font to use, see #HersheyFonts. +@param fontScale Font scale factor that is multiplied by the font-specific base size. +@param thickness Thickness of lines used to render the text. See #putText for details. +@param[out] baseLine y-coordinate of the baseline relative to the bottom-most text +point. +@return The size of a box that contains the specified text. + +@see putText + */ +CV_EXPORTS_W Size getTextSize(const String& text, int fontFace, + double fontScale, int thickness, + CV_OUT int* baseLine); + + +/** @brief Calculates the font-specific size to use to achieve a given height in pixels. + +@param fontFace Font to use, see cv::HersheyFonts. +@param pixelHeight Pixel height to compute the fontScale for +@param thickness Thickness of lines used to render the text.See putText for details. +@return The fontSize to use for cv::putText + +@see cv::putText +*/ +CV_EXPORTS_W double getFontScaleFromHeight(const int fontFace, + const int pixelHeight, + const int thickness = 1); + +/** @brief Class for iterating over all pixels on a raster line segment. + +The class LineIterator is used to get each pixel of a raster line connecting +two specified points. +It can be treated as a versatile implementation of the Bresenham algorithm +where you can stop at each pixel and do some extra processing, for +example, grab pixel values along the line or draw a line with an effect +(for example, with XOR operation). + +The number of pixels along the line is stored in LineIterator::count. +The method LineIterator::pos returns the current position in the image: + +@code{.cpp} +// grabs pixels along the line (pt1, pt2) +// from 8-bit 3-channel image to the buffer +LineIterator it(img, pt1, pt2, 8); +LineIterator it2 = it; +vector buf(it.count); + +for(int i = 0; i < it.count; i++, ++it) + buf[i] = *(const Vec3b*)*it; + +// alternative way of iterating through the line +for(int i = 0; i < it2.count; i++, ++it2) +{ + Vec3b val = img.at(it2.pos()); + CV_Assert(buf[i] == val); +} +@endcode +*/ +class CV_EXPORTS LineIterator +{ +public: + /** @brief Initializes iterator object for the given line and image. + + The returned iterator can be used to traverse all pixels on a line that + connects the given two points. + The line will be clipped on the image boundaries. + + @param img Underlying image. + @param pt1 First endpoint of the line. + @param pt2 The other endpoint of the line. + @param connectivity Pixel connectivity of the iterator. Valid values are 4 (iterator can move + up, down, left and right) and 8 (iterator can also move diagonally). + @param leftToRight If true, the line is traversed from the leftmost endpoint to the rightmost + endpoint. Otherwise, the line is traversed from \p pt1 to \p pt2. + */ + LineIterator( const Mat& img, Point pt1, Point pt2, + int connectivity = 8, bool leftToRight = false ) + { + init(&img, Rect(0, 0, img.cols, img.rows), pt1, pt2, connectivity, leftToRight); + ptmode = false; + } + LineIterator( Point pt1, Point pt2, + int connectivity = 8, bool leftToRight = false ) + { + init(0, Rect(std::min(pt1.x, pt2.x), + std::min(pt1.y, pt2.y), + std::max(pt1.x, pt2.x) - std::min(pt1.x, pt2.x) + 1, + std::max(pt1.y, pt2.y) - std::min(pt1.y, pt2.y) + 1), + pt1, pt2, connectivity, leftToRight); + ptmode = true; + } + LineIterator( Size boundingAreaSize, Point pt1, Point pt2, + int connectivity = 8, bool leftToRight = false ) + { + init(0, Rect(0, 0, boundingAreaSize.width, boundingAreaSize.height), + pt1, pt2, connectivity, leftToRight); + ptmode = true; + } + LineIterator( Rect boundingAreaRect, Point pt1, Point pt2, + int connectivity = 8, bool leftToRight = false ) + { + init(0, boundingAreaRect, pt1, pt2, connectivity, leftToRight); + ptmode = true; + } + void init(const Mat* img, Rect boundingAreaRect, Point pt1, Point pt2, int connectivity, bool leftToRight); + + /** @brief Returns pointer to the current pixel. + */ + uchar* operator *(); + + /** @brief Moves iterator to the next pixel on the line. + + This is the prefix version (++it). + */ + LineIterator& operator ++(); + + /** @brief Moves iterator to the next pixel on the line. + + This is the postfix version (it++). + */ + LineIterator operator ++(int); + + /** @brief Returns coordinates of the current pixel. + */ + Point pos() const; + + uchar* ptr; + const uchar* ptr0; + int step, elemSize; + int err, count; + int minusDelta, plusDelta; + int minusStep, plusStep; + int minusShift, plusShift; + Point p; + bool ptmode; +}; + +//! @cond IGNORED + +// === LineIterator implementation === + +inline +uchar* LineIterator::operator *() +{ + return ptmode ? 0 : ptr; +} + +inline +LineIterator& LineIterator::operator ++() +{ + int mask = err < 0 ? -1 : 0; + err += minusDelta + (plusDelta & mask); + if(!ptmode) + { + ptr += minusStep + (plusStep & mask); + } + else + { + p.x += minusShift + (plusShift & mask); + p.y += minusStep + (plusStep & mask); + } + return *this; +} + +inline +LineIterator LineIterator::operator ++(int) +{ + LineIterator it = *this; + ++(*this); + return it; +} + +inline +Point LineIterator::pos() const +{ + if(!ptmode) + { + size_t offset = (size_t)(ptr - ptr0); + int y = (int)(offset/step); + int x = (int)((offset - (size_t)y*step)/elemSize); + return Point(x, y); + } + return p; +} + +//! @endcond + +//! @} imgproc_draw + +//! @} imgproc + +} // cv + + +#include "./imgproc/segmentation.hpp" + + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/bindings.hpp b/Thirdparty/opencv2/include/opencv2/imgproc/bindings.hpp new file mode 100644 index 0000000..c69527a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/bindings.hpp @@ -0,0 +1,34 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_IMGPROC_BINDINGS_HPP +#define OPENCV_IMGPROC_BINDINGS_HPP + +// This file contains special overloads for OpenCV bindings +// No need to use these functions in C++ code. + +namespace cv { + +/** @brief Finds lines in a binary image using the standard Hough transform and get accumulator. + * + * @note This function is for bindings use only. Use original function in C++ code + * + * @sa HoughLines + */ +CV_WRAP static inline +void HoughLinesWithAccumulator( + InputArray image, OutputArray lines, + double rho, double theta, int threshold, + double srn = 0, double stn = 0, + double min_theta = 0, double max_theta = CV_PI +) +{ + std::vector lines_acc; + HoughLines(image, lines_acc, rho, theta, threshold, srn, stn, min_theta, max_theta); + Mat(lines_acc).copyTo(lines); +} + +} // namespace + +#endif // OPENCV_IMGPROC_BINDINGS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/detail/gcgraph.hpp b/Thirdparty/opencv2/include/opencv2/imgproc/detail/gcgraph.hpp new file mode 100644 index 0000000..f17c6e7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/detail/gcgraph.hpp @@ -0,0 +1,395 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_IMGPROC_DETAIL_GCGRAPH_HPP +#define OPENCV_IMGPROC_DETAIL_GCGRAPH_HPP + +//! @cond IGNORED + +namespace cv { namespace detail { +template class GCGraph +{ +public: + GCGraph(); + GCGraph( unsigned int vtxCount, unsigned int edgeCount ); + ~GCGraph(); + void create( unsigned int vtxCount, unsigned int edgeCount ); + int addVtx(); + void addEdges( int i, int j, TWeight w, TWeight revw ); + void addTermWeights( int i, TWeight sourceW, TWeight sinkW ); + TWeight maxFlow(); + bool inSourceSegment( int i ); +private: + class Vtx + { + public: + Vtx *next; // initialized and used in maxFlow() only + int parent; + int first; + int ts; + int dist; + TWeight weight; + uchar t; + }; + class Edge + { + public: + int dst; + int next; + TWeight weight; + }; + + std::vector vtcs; + std::vector edges; + TWeight flow; +}; + +template +GCGraph::GCGraph() +{ + flow = 0; +} +template +GCGraph::GCGraph( unsigned int vtxCount, unsigned int edgeCount ) +{ + create( vtxCount, edgeCount ); +} +template +GCGraph::~GCGraph() +{ +} +template +void GCGraph::create( unsigned int vtxCount, unsigned int edgeCount ) +{ + vtcs.reserve( vtxCount ); + edges.reserve( edgeCount + 2 ); + flow = 0; +} + +template +int GCGraph::addVtx() +{ + Vtx v; + memset( &v, 0, sizeof(Vtx)); + vtcs.push_back(v); + return (int)vtcs.size() - 1; +} + +template +void GCGraph::addEdges( int i, int j, TWeight w, TWeight revw ) +{ + CV_Assert( i>=0 && i<(int)vtcs.size() ); + CV_Assert( j>=0 && j<(int)vtcs.size() ); + CV_Assert( w>=0 && revw>=0 ); + CV_Assert( i != j ); + + if( !edges.size() ) + edges.resize( 2 ); + + Edge fromI, toI; + fromI.dst = j; + fromI.next = vtcs[i].first; + fromI.weight = w; + vtcs[i].first = (int)edges.size(); + edges.push_back( fromI ); + + toI.dst = i; + toI.next = vtcs[j].first; + toI.weight = revw; + vtcs[j].first = (int)edges.size(); + edges.push_back( toI ); +} + +template +void GCGraph::addTermWeights( int i, TWeight sourceW, TWeight sinkW ) +{ + CV_Assert( i>=0 && i<(int)vtcs.size() ); + + TWeight dw = vtcs[i].weight; + if( dw > 0 ) + sourceW += dw; + else + sinkW -= dw; + flow += (sourceW < sinkW) ? sourceW : sinkW; + vtcs[i].weight = sourceW - sinkW; +} + +template +TWeight GCGraph::maxFlow() +{ + CV_Assert(!vtcs.empty()); + CV_Assert(!edges.empty()); + const int TERMINAL = -1, ORPHAN = -2; + Vtx stub, *nilNode = &stub, *first = nilNode, *last = nilNode; + int curr_ts = 0; + stub.next = nilNode; + Vtx *vtxPtr = &vtcs[0]; + Edge *edgePtr = &edges[0]; + + std::vector orphans; + + // initialize the active queue and the graph vertices + for( int i = 0; i < (int)vtcs.size(); i++ ) + { + Vtx* v = vtxPtr + i; + v->ts = 0; + if( v->weight != 0 ) + { + last = last->next = v; + v->dist = 1; + v->parent = TERMINAL; + v->t = v->weight < 0; + } + else + v->parent = 0; + } + first = first->next; + last->next = nilNode; + nilNode->next = 0; + + // run the search-path -> augment-graph -> restore-trees loop + for(;;) + { + Vtx* v, *u; + int e0 = -1, ei = 0, ej = 0; + TWeight minWeight, weight; + uchar vt; + + // grow S & T search trees, find an edge connecting them + while( first != nilNode ) + { + v = first; + if( v->parent ) + { + vt = v->t; + for( ei = v->first; ei != 0; ei = edgePtr[ei].next ) + { + if( edgePtr[ei^vt].weight == 0 ) + continue; + u = vtxPtr+edgePtr[ei].dst; + if( !u->parent ) + { + u->t = vt; + u->parent = ei ^ 1; + u->ts = v->ts; + u->dist = v->dist + 1; + if( !u->next ) + { + u->next = nilNode; + last = last->next = u; + } + continue; + } + + if( u->t != vt ) + { + e0 = ei ^ vt; + break; + } + + if( u->dist > v->dist+1 && u->ts <= v->ts ) + { + // reassign the parent + u->parent = ei ^ 1; + u->ts = v->ts; + u->dist = v->dist + 1; + } + } + if( e0 > 0 ) + break; + } + // exclude the vertex from the active list + first = first->next; + v->next = 0; + } + + if( e0 <= 0 ) + break; + + // find the minimum edge weight along the path + minWeight = edgePtr[e0].weight; + CV_Assert( minWeight > 0 ); + // k = 1: source tree, k = 0: destination tree + for( int k = 1; k >= 0; k-- ) + { + for( v = vtxPtr+edgePtr[e0^k].dst;; v = vtxPtr+edgePtr[ei].dst ) + { + if( (ei = v->parent) < 0 ) + break; + weight = edgePtr[ei^k].weight; + minWeight = MIN(minWeight, weight); + CV_Assert( minWeight > 0 ); + } + weight = fabs(v->weight); + minWeight = MIN(minWeight, weight); + CV_Assert( minWeight > 0 ); + } + + // modify weights of the edges along the path and collect orphans + edgePtr[e0].weight -= minWeight; + edgePtr[e0^1].weight += minWeight; + flow += minWeight; + + // k = 1: source tree, k = 0: destination tree + for( int k = 1; k >= 0; k-- ) + { + for( v = vtxPtr+edgePtr[e0^k].dst;; v = vtxPtr+edgePtr[ei].dst ) + { + if( (ei = v->parent) < 0 ) + break; + edgePtr[ei^(k^1)].weight += minWeight; + if( (edgePtr[ei^k].weight -= minWeight) == 0 ) + { + orphans.push_back(v); + v->parent = ORPHAN; + } + } + + v->weight = v->weight + minWeight*(1-k*2); + if( v->weight == 0 ) + { + orphans.push_back(v); + v->parent = ORPHAN; + } + } + + // restore the search trees by finding new parents for the orphans + curr_ts++; + while( !orphans.empty() ) + { + Vtx* v2 = orphans.back(); + orphans.pop_back(); + + int d, minDist = INT_MAX; + e0 = 0; + vt = v2->t; + + for( ei = v2->first; ei != 0; ei = edgePtr[ei].next ) + { + if( edgePtr[ei^(vt^1)].weight == 0 ) + continue; + u = vtxPtr+edgePtr[ei].dst; + if( u->t != vt || u->parent == 0 ) + continue; + // compute the distance to the tree root + for( d = 0;; ) + { + if( u->ts == curr_ts ) + { + d += u->dist; + break; + } + ej = u->parent; + d++; + if( ej < 0 ) + { + if( ej == ORPHAN ) + d = INT_MAX-1; + else + { + u->ts = curr_ts; + u->dist = 1; + } + break; + } + u = vtxPtr+edgePtr[ej].dst; + } + + // update the distance + if( ++d < INT_MAX ) + { + if( d < minDist ) + { + minDist = d; + e0 = ei; + } + for( u = vtxPtr+edgePtr[ei].dst; u->ts != curr_ts; u = vtxPtr+edgePtr[u->parent].dst ) + { + u->ts = curr_ts; + u->dist = --d; + } + } + } + + if( (v2->parent = e0) > 0 ) + { + v2->ts = curr_ts; + v2->dist = minDist; + continue; + } + + /* no parent is found */ + v2->ts = 0; + for( ei = v2->first; ei != 0; ei = edgePtr[ei].next ) + { + u = vtxPtr+edgePtr[ei].dst; + ej = u->parent; + if( u->t != vt || !ej ) + continue; + if( edgePtr[ei^(vt^1)].weight && !u->next ) + { + u->next = nilNode; + last = last->next = u; + } + if( ej > 0 && vtxPtr+edgePtr[ej].dst == v2 ) + { + orphans.push_back(u); + u->parent = ORPHAN; + } + } + } + } + return flow; +} + +template +bool GCGraph::inSourceSegment( int i ) +{ + CV_Assert( i>=0 && i<(int)vtcs.size() ); + return vtcs[i].t == 0; +} + +}} // namespace detail, cv + + +//! @endcond + +#endif // OPENCV_IMGPROC_DETAIL_GCGRAPH_HPP diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/hal/hal.hpp b/Thirdparty/opencv2/include/opencv2/imgproc/hal/hal.hpp new file mode 100644 index 0000000..48851ec --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/hal/hal.hpp @@ -0,0 +1,251 @@ +#ifndef CV_IMGPROC_HAL_HPP +#define CV_IMGPROC_HAL_HPP + +#include "opencv2/core/cvdef.h" +#include "opencv2/core/cvstd.hpp" +#include "opencv2/core/hal/interface.h" + +namespace cv { namespace hal { + +//! @addtogroup imgproc_hal_functions +//! @{ + +//--------------------------- +//! @cond IGNORED + +struct CV_EXPORTS Filter2D +{ + CV_DEPRECATED static Ptr create(uchar * , size_t , int , + int , int , + int , int , + int , int , + int , double , + int , int , + bool , bool ); + virtual void apply(uchar * , size_t , + uchar * , size_t , + int , int , + int , int , + int , int ) = 0; + virtual ~Filter2D() {} +}; + +struct CV_EXPORTS SepFilter2D +{ + CV_DEPRECATED static Ptr create(int , int , int , + uchar * , int , + uchar * , int , + int , int , + double , int ); + virtual void apply(uchar * , size_t , + uchar * , size_t , + int , int , + int , int , + int , int ) = 0; + virtual ~SepFilter2D() {} +}; + + +struct CV_EXPORTS Morph +{ + CV_DEPRECATED static Ptr create(int , int , int , int , int , + int , uchar * , size_t , + int , int , + int , int , + int , const double *, + int , bool , bool ); + virtual void apply(uchar * , size_t , uchar * , size_t , int , int , + int , int , int , int , + int , int , int , int ) = 0; + virtual ~Morph() {} +}; + +//! @endcond +//--------------------------- + +CV_EXPORTS void filter2D(int stype, int dtype, int kernel_type, + uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int full_width, int full_height, + int offset_x, int offset_y, + uchar * kernel_data, size_t kernel_step, + int kernel_width, int kernel_height, + int anchor_x, int anchor_y, + double delta, int borderType, + bool isSubmatrix); + +CV_EXPORTS void sepFilter2D(int stype, int dtype, int ktype, + uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int full_width, int full_height, + int offset_x, int offset_y, + uchar * kernelx_data, int kernelx_len, + uchar * kernely_data, int kernely_len, + int anchor_x, int anchor_y, + double delta, int borderType); + +CV_EXPORTS void morph(int op, int src_type, int dst_type, + uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int roi_width, int roi_height, int roi_x, int roi_y, + int roi_width2, int roi_height2, int roi_x2, int roi_y2, + int kernel_type, uchar * kernel_data, size_t kernel_step, + int kernel_width, int kernel_height, int anchor_x, int anchor_y, + int borderType, const double borderValue[4], + int iterations, bool isSubmatrix); + + +CV_EXPORTS void resize(int src_type, + const uchar * src_data, size_t src_step, int src_width, int src_height, + uchar * dst_data, size_t dst_step, int dst_width, int dst_height, + double inv_scale_x, double inv_scale_y, int interpolation); + +CV_EXPORTS void warpAffine(int src_type, + const uchar * src_data, size_t src_step, int src_width, int src_height, + uchar * dst_data, size_t dst_step, int dst_width, int dst_height, + const double M[6], int interpolation, int borderType, const double borderValue[4]); + +CV_EXPORTS void warpPerspective(int src_type, + const uchar * src_data, size_t src_step, int src_width, int src_height, + uchar * dst_data, size_t dst_step, int dst_width, int dst_height, + const double M[9], int interpolation, int borderType, const double borderValue[4]); + +CV_EXPORTS void cvtBGRtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, int dcn, bool swapBlue); + +CV_EXPORTS void cvtBGRtoBGR5x5(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int scn, bool swapBlue, int greenBits); + +CV_EXPORTS void cvtBGR5x5toBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int dcn, bool swapBlue, int greenBits); + +CV_EXPORTS void cvtBGRtoGray(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, bool swapBlue); + +CV_EXPORTS void cvtGraytoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int dcn); + +CV_EXPORTS void cvtBGR5x5toGray(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int greenBits); + +CV_EXPORTS void cvtGraytoBGR5x5(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int greenBits); +CV_EXPORTS void cvtBGRtoYUV(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, bool swapBlue, bool isCbCr); + +CV_EXPORTS void cvtYUVtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int dcn, bool swapBlue, bool isCbCr); + +CV_EXPORTS void cvtBGRtoXYZ(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, bool swapBlue); + +CV_EXPORTS void cvtXYZtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int dcn, bool swapBlue); + +CV_EXPORTS void cvtBGRtoHSV(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, bool swapBlue, bool isFullRange, bool isHSV); + +CV_EXPORTS void cvtHSVtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int dcn, bool swapBlue, bool isFullRange, bool isHSV); + +CV_EXPORTS void cvtBGRtoLab(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int scn, bool swapBlue, bool isLab, bool srgb); + +CV_EXPORTS void cvtLabtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int depth, int dcn, bool swapBlue, bool isLab, bool srgb); + +CV_EXPORTS void cvtTwoPlaneYUVtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int dst_width, int dst_height, + int dcn, bool swapBlue, int uIdx); + +//! Separate Y and UV planes +CV_EXPORTS void cvtTwoPlaneYUVtoBGR(const uchar * y_data, const uchar * uv_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int dst_width, int dst_height, + int dcn, bool swapBlue, int uIdx); + +CV_EXPORTS void cvtTwoPlaneYUVtoBGR(const uchar * y_data, size_t y_step, const uchar * uv_data, size_t uv_step, + uchar * dst_data, size_t dst_step, + int dst_width, int dst_height, + int dcn, bool swapBlue, int uIdx); + +CV_EXPORTS void cvtThreePlaneYUVtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int dst_width, int dst_height, + int dcn, bool swapBlue, int uIdx); + +CV_EXPORTS void cvtBGRtoThreePlaneYUV(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int scn, bool swapBlue, int uIdx); + +//! Separate Y and UV planes +CV_EXPORTS void cvtBGRtoTwoPlaneYUV(const uchar * src_data, size_t src_step, + uchar * y_data, uchar * uv_data, size_t dst_step, + int width, int height, + int scn, bool swapBlue, int uIdx); + +CV_EXPORTS void cvtOnePlaneYUVtoBGR(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int dcn, bool swapBlue, int uIdx, int ycn); + +CV_EXPORTS void cvtOnePlaneBGRtoYUV(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height, + int scn, bool swapBlue, int uIdx, int ycn); + +CV_EXPORTS void cvtRGBAtoMultipliedRGBA(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height); + +CV_EXPORTS void cvtMultipliedRGBAtoRGBA(const uchar * src_data, size_t src_step, + uchar * dst_data, size_t dst_step, + int width, int height); + +CV_EXPORTS void integral(int depth, int sdepth, int sqdepth, + const uchar* src, size_t srcstep, + uchar* sum, size_t sumstep, + uchar* sqsum, size_t sqsumstep, + uchar* tilted, size_t tstep, + int width, int height, int cn); + +//! @} + +}} + +#endif // CV_IMGPROC_HAL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/hal/interface.h b/Thirdparty/opencv2/include/opencv2/imgproc/hal/interface.h new file mode 100644 index 0000000..f8dbcfe --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/hal/interface.h @@ -0,0 +1,46 @@ +#ifndef OPENCV_IMGPROC_HAL_INTERFACE_H +#define OPENCV_IMGPROC_HAL_INTERFACE_H + +//! @addtogroup imgproc_hal_interface +//! @{ + +//! @name Interpolation modes +//! @sa cv::InterpolationFlags +//! @{ +#define CV_HAL_INTER_NEAREST 0 +#define CV_HAL_INTER_LINEAR 1 +#define CV_HAL_INTER_CUBIC 2 +#define CV_HAL_INTER_AREA 3 +#define CV_HAL_INTER_LANCZOS4 4 +//! @} + +//! @name Morphology operations +//! @sa cv::MorphTypes +//! @{ +#define CV_HAL_MORPH_ERODE 0 +#define CV_HAL_MORPH_DILATE 1 +//! @} + +//! @name Threshold types +//! @sa cv::ThresholdTypes +//! @{ +#define CV_HAL_THRESH_BINARY 0 +#define CV_HAL_THRESH_BINARY_INV 1 +#define CV_HAL_THRESH_TRUNC 2 +#define CV_HAL_THRESH_TOZERO 3 +#define CV_HAL_THRESH_TOZERO_INV 4 +#define CV_HAL_THRESH_MASK 7 +#define CV_HAL_THRESH_OTSU 8 +#define CV_HAL_THRESH_TRIANGLE 16 +//! @} + +//! @name Adaptive threshold algorithm +//! @sa cv::AdaptiveThresholdTypes +//! @{ +#define CV_HAL_ADAPTIVE_THRESH_MEAN_C 0 +#define CV_HAL_ADAPTIVE_THRESH_GAUSSIAN_C 1 +//! @} + +//! @} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/imgproc.hpp b/Thirdparty/opencv2/include/opencv2/imgproc/imgproc.hpp new file mode 100644 index 0000000..4175bd0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/imgproc.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/imgproc.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/imgproc_c.h b/Thirdparty/opencv2/include/opencv2/imgproc/imgproc_c.h new file mode 100644 index 0000000..e97b802 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/imgproc_c.h @@ -0,0 +1,1185 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_IMGPROC_IMGPROC_C_H +#define OPENCV_IMGPROC_IMGPROC_C_H + +#include "opencv2/imgproc/types_c.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup imgproc_c +@{ +*/ + +/*********************** Background statistics accumulation *****************************/ + +/** @brief Adds image to accumulator +@see cv::accumulate +*/ +CVAPI(void) cvAcc( const CvArr* image, CvArr* sum, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @brief Adds squared image to accumulator +@see cv::accumulateSquare +*/ +CVAPI(void) cvSquareAcc( const CvArr* image, CvArr* sqsum, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @brief Adds a product of two images to accumulator +@see cv::accumulateProduct +*/ +CVAPI(void) cvMultiplyAcc( const CvArr* image1, const CvArr* image2, CvArr* acc, + const CvArr* mask CV_DEFAULT(NULL) ); + +/** @brief Adds image to accumulator with weights: acc = acc*(1-alpha) + image*alpha +@see cv::accumulateWeighted +*/ +CVAPI(void) cvRunningAvg( const CvArr* image, CvArr* acc, double alpha, + const CvArr* mask CV_DEFAULT(NULL) ); + +/****************************************************************************************\ +* Image Processing * +\****************************************************************************************/ + +/** Copies source 2D array inside of the larger destination array and + makes a border of the specified type (IPL_BORDER_*) around the copied area. */ +CVAPI(void) cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset, + int bordertype, CvScalar value CV_DEFAULT(cvScalarAll(0))); + +/** @brief Smooths the image in one of several ways. + +@param src The source image +@param dst The destination image +@param smoothtype Type of the smoothing, see SmoothMethod_c +@param size1 The first parameter of the smoothing operation, the aperture width. Must be a +positive odd number (1, 3, 5, ...) +@param size2 The second parameter of the smoothing operation, the aperture height. Ignored by +CV_MEDIAN and CV_BILATERAL methods. In the case of simple scaled/non-scaled and Gaussian blur if +size2 is zero, it is set to size1. Otherwise it must be a positive odd number. +@param sigma1 In the case of a Gaussian parameter this parameter may specify Gaussian \f$\sigma\f$ +(standard deviation). If it is zero, it is calculated from the kernel size: +\f[\sigma = 0.3 (n/2 - 1) + 0.8 \quad \text{where} \quad n= \begin{array}{l l} \mbox{\texttt{size1} for horizontal kernel} \\ \mbox{\texttt{size2} for vertical kernel} \end{array}\f] +Using standard sigma for small kernels ( \f$3\times 3\f$ to \f$7\times 7\f$ ) gives better speed. If +sigma1 is not zero, while size1 and size2 are zeros, the kernel size is calculated from the +sigma (to provide accurate enough operation). +@param sigma2 additional parameter for bilateral filtering + +@see cv::GaussianBlur, cv::blur, cv::medianBlur, cv::bilateralFilter. + */ +CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, + int smoothtype CV_DEFAULT(CV_GAUSSIAN), + int size1 CV_DEFAULT(3), + int size2 CV_DEFAULT(0), + double sigma1 CV_DEFAULT(0), + double sigma2 CV_DEFAULT(0)); + +/** @brief Convolves an image with the kernel. + +@param src input image. +@param dst output image of the same size and the same number of channels as src. +@param kernel convolution kernel (or rather a correlation kernel), a single-channel floating point +matrix; if you want to apply different kernels to different channels, split the image into +separate color planes using split and process them individually. +@param anchor anchor of the kernel that indicates the relative position of a filtered point within +the kernel; the anchor should lie within the kernel; default value (-1,-1) means that the anchor +is at the kernel center. + +@see cv::filter2D + */ +CVAPI(void) cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, + CvPoint anchor CV_DEFAULT(cvPoint(-1,-1))); + +/** @brief Finds integral image: SUM(X,Y) = sum(x \texttt{hist1}(I)\)}{\frac{\texttt{hist2}(I) \cdot \texttt{scale}}{\texttt{hist1}(I)}}{if \(\texttt{hist1}(I) \ne 0\) and \(\texttt{hist2}(I) \le \texttt{hist1}(I)\)}\f] + +@param hist1 First histogram (the divisor). +@param hist2 Second histogram. +@param dst_hist Destination histogram. +@param scale Scale factor for the destination histogram. + */ +CVAPI(void) cvCalcProbDensity( const CvHistogram* hist1, const CvHistogram* hist2, + CvHistogram* dst_hist, double scale CV_DEFAULT(255) ); + +/** @brief equalizes histogram of 8-bit single-channel image +@see cv::equalizeHist +*/ +CVAPI(void) cvEqualizeHist( const CvArr* src, CvArr* dst ); + + +/** @brief Applies distance transform to binary image +@see cv::distanceTransform +*/ +CVAPI(void) cvDistTransform( const CvArr* src, CvArr* dst, + int distance_type CV_DEFAULT(CV_DIST_L2), + int mask_size CV_DEFAULT(3), + const float* mask CV_DEFAULT(NULL), + CvArr* labels CV_DEFAULT(NULL), + int labelType CV_DEFAULT(CV_DIST_LABEL_CCOMP)); + + +/** @brief Applies fixed-level threshold to grayscale image. + + This is a basic operation applied before retrieving contours +@see cv::threshold +*/ +CVAPI(double) cvThreshold( const CvArr* src, CvArr* dst, + double threshold, double max_value, + int threshold_type ); + +/** @brief Applies adaptive threshold to grayscale image. + + The two parameters for methods CV_ADAPTIVE_THRESH_MEAN_C and + CV_ADAPTIVE_THRESH_GAUSSIAN_C are: + neighborhood size (3, 5, 7 etc.), + and a constant subtracted from mean (...,-3,-2,-1,0,1,2,3,...) +@see cv::adaptiveThreshold +*/ +CVAPI(void) cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value, + int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C), + int threshold_type CV_DEFAULT(CV_THRESH_BINARY), + int block_size CV_DEFAULT(3), + double param1 CV_DEFAULT(5)); + +/** @brief Fills the connected component until the color difference gets large enough +@see cv::floodFill +*/ +CVAPI(void) cvFloodFill( CvArr* image, CvPoint seed_point, + CvScalar new_val, CvScalar lo_diff CV_DEFAULT(cvScalarAll(0)), + CvScalar up_diff CV_DEFAULT(cvScalarAll(0)), + CvConnectedComp* comp CV_DEFAULT(NULL), + int flags CV_DEFAULT(4), + CvArr* mask CV_DEFAULT(NULL)); + +/****************************************************************************************\ +* Feature detection * +\****************************************************************************************/ + +/** @brief Runs canny edge detector +@see cv::Canny +*/ +CVAPI(void) cvCanny( const CvArr* image, CvArr* edges, double threshold1, + double threshold2, int aperture_size CV_DEFAULT(3) ); + +/** @brief Calculates constraint image for corner detection + + Dx^2 * Dyy + Dxx * Dy^2 - 2 * Dx * Dy * Dxy. + Applying threshold to the result gives coordinates of corners +@see cv::preCornerDetect +*/ +CVAPI(void) cvPreCornerDetect( const CvArr* image, CvArr* corners, + int aperture_size CV_DEFAULT(3) ); + +/** @brief Calculates eigen values and vectors of 2x2 + gradient covariation matrix at every image pixel +@see cv::cornerEigenValsAndVecs +*/ +CVAPI(void) cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv, + int block_size, int aperture_size CV_DEFAULT(3) ); + +/** @brief Calculates minimal eigenvalue for 2x2 gradient covariation matrix at + every image pixel +@see cv::cornerMinEigenVal +*/ +CVAPI(void) cvCornerMinEigenVal( const CvArr* image, CvArr* eigenval, + int block_size, int aperture_size CV_DEFAULT(3) ); + +/** @brief Harris corner detector: + + Calculates det(M) - k*(trace(M)^2), where M is 2x2 gradient covariation matrix for each pixel +@see cv::cornerHarris +*/ +CVAPI(void) cvCornerHarris( const CvArr* image, CvArr* harris_response, + int block_size, int aperture_size CV_DEFAULT(3), + double k CV_DEFAULT(0.04) ); + +/** @brief Adjust corner position using some sort of gradient search +@see cv::cornerSubPix +*/ +CVAPI(void) cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners, + int count, CvSize win, CvSize zero_zone, + CvTermCriteria criteria ); + +/** @brief Finds a sparse set of points within the selected region + that seem to be easy to track +@see cv::goodFeaturesToTrack +*/ +CVAPI(void) cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, + CvArr* temp_image, CvPoint2D32f* corners, + int* corner_count, double quality_level, + double min_distance, + const CvArr* mask CV_DEFAULT(NULL), + int block_size CV_DEFAULT(3), + int use_harris CV_DEFAULT(0), + double k CV_DEFAULT(0.04) ); + +/** @brief Finds lines on binary image using one of several methods. + + line_storage is either memory storage or 1 x _max number of lines_ CvMat, its + number of columns is changed by the function. + method is one of CV_HOUGH_*; + rho, theta and threshold are used for each of those methods; + param1 ~ line length, param2 ~ line gap - for probabilistic, + param1 ~ srn, param2 ~ stn - for multi-scale +@see cv::HoughLines +*/ +CVAPI(CvSeq*) cvHoughLines2( CvArr* image, void* line_storage, int method, + double rho, double theta, int threshold, + double param1 CV_DEFAULT(0), double param2 CV_DEFAULT(0), + double min_theta CV_DEFAULT(0), double max_theta CV_DEFAULT(CV_PI)); + +/** @brief Finds circles in the image +@see cv::HoughCircles +*/ +CVAPI(CvSeq*) cvHoughCircles( CvArr* image, void* circle_storage, + int method, double dp, double min_dist, + double param1 CV_DEFAULT(100), + double param2 CV_DEFAULT(100), + int min_radius CV_DEFAULT(0), + int max_radius CV_DEFAULT(0)); + +/** @brief Fits a line into set of 2d or 3d points in a robust way (M-estimator technique) +@see cv::fitLine +*/ +CVAPI(void) cvFitLine( const CvArr* points, int dist_type, double param, + double reps, double aeps, float* line ); + +/****************************************************************************************\ +* Drawing * +\****************************************************************************************/ + +/****************************************************************************************\ +* Drawing functions work with images/matrices of arbitrary type. * +* For color images the channel order is BGR[A] * +* Antialiasing is supported only for 8-bit image now. * +* All the functions include parameter color that means rgb value (that may be * +* constructed with CV_RGB macro) for color images and brightness * +* for grayscale images. * +* If a drawn figure is partially or completely outside of the image, it is clipped.* +\****************************************************************************************/ + +#define CV_FILLED -1 + +#define CV_AA 16 + +/** @brief Draws 4-connected, 8-connected or antialiased line segment connecting two points +@see cv::line +*/ +CVAPI(void) cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, + CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) ); + +/** @brief Draws a rectangle given two opposite corners of the rectangle (pt1 & pt2) + + if thickness<0 (e.g. thickness == CV_FILLED), the filled box is drawn +@see cv::rectangle +*/ +CVAPI(void) cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, + CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), + int shift CV_DEFAULT(0)); + +/** @brief Draws a rectangle specified by a CvRect structure +@see cv::rectangle +*/ +CVAPI(void) cvRectangleR( CvArr* img, CvRect r, + CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), + int shift CV_DEFAULT(0)); + + +/** @brief Draws a circle with specified center and radius. + + Thickness works in the same way as with cvRectangle +@see cv::circle +*/ +CVAPI(void) cvCircle( CvArr* img, CvPoint center, int radius, + CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0)); + +/** @brief Draws ellipse outline, filled ellipse, elliptic arc or filled elliptic sector + + depending on _thickness_, _start_angle_ and _end_angle_ parameters. The resultant figure + is rotated by _angle_. All the angles are in degrees +@see cv::ellipse +*/ +CVAPI(void) cvEllipse( CvArr* img, CvPoint center, CvSize axes, + double angle, double start_angle, double end_angle, + CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0)); + +CV_INLINE void cvEllipseBox( CvArr* img, CvBox2D box, CvScalar color, + int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) ) +{ + CvSize axes = cvSize( + cvRound(box.size.width*0.5), + cvRound(box.size.height*0.5) + ); + + cvEllipse( img, cvPointFrom32f( box.center ), axes, box.angle, + 0, 360, color, thickness, line_type, shift ); +} + +/** @brief Fills convex or monotonous polygon. +@see cv::fillConvexPoly +*/ +CVAPI(void) cvFillConvexPoly( CvArr* img, const CvPoint* pts, int npts, CvScalar color, + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0)); + +/** @brief Fills an area bounded by one or more arbitrary polygons +@see cv::fillPoly +*/ +CVAPI(void) cvFillPoly( CvArr* img, CvPoint** pts, const int* npts, + int contours, CvScalar color, + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) ); + +/** @brief Draws one or more polygonal curves +@see cv::polylines +*/ +CVAPI(void) cvPolyLine( CvArr* img, CvPoint** pts, const int* npts, int contours, + int is_closed, CvScalar color, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) ); + +#define cvDrawRect cvRectangle +#define cvDrawLine cvLine +#define cvDrawCircle cvCircle +#define cvDrawEllipse cvEllipse +#define cvDrawPolyLine cvPolyLine + +/** @brief Clips the line segment connecting *pt1 and *pt2 + by the rectangular window + + (0<=xptr will point to pt1 (or pt2, see left_to_right description) location in +the image. Returns the number of pixels on the line between the ending points. +@see cv::LineIterator +*/ +CVAPI(int) cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, + CvLineIterator* line_iterator, + int connectivity CV_DEFAULT(8), + int left_to_right CV_DEFAULT(0)); + +#define CV_NEXT_LINE_POINT( line_iterator ) \ +{ \ + int _line_iterator_mask = (line_iterator).err < 0 ? -1 : 0; \ + (line_iterator).err += (line_iterator).minus_delta + \ + ((line_iterator).plus_delta & _line_iterator_mask); \ + (line_iterator).ptr += (line_iterator).minus_step + \ + ((line_iterator).plus_step & _line_iterator_mask); \ +} + + +#define CV_FONT_HERSHEY_SIMPLEX 0 +#define CV_FONT_HERSHEY_PLAIN 1 +#define CV_FONT_HERSHEY_DUPLEX 2 +#define CV_FONT_HERSHEY_COMPLEX 3 +#define CV_FONT_HERSHEY_TRIPLEX 4 +#define CV_FONT_HERSHEY_COMPLEX_SMALL 5 +#define CV_FONT_HERSHEY_SCRIPT_SIMPLEX 6 +#define CV_FONT_HERSHEY_SCRIPT_COMPLEX 7 + +#define CV_FONT_ITALIC 16 + +#define CV_FONT_VECTOR0 CV_FONT_HERSHEY_SIMPLEX + + +/** Font structure */ +typedef struct CvFont +{ + const char* nameFont; //Qt:nameFont + CvScalar color; //Qt:ColorFont -> cvScalar(blue_component, green_component, red_component[, alpha_component]) + int font_face; //Qt: bool italic /** =CV_FONT_* */ + const int* ascii; //!< font data and metrics + const int* greek; + const int* cyrillic; + float hscale, vscale; + float shear; //!< slope coefficient: 0 - normal, >0 - italic + int thickness; //!< Qt: weight /** letters thickness */ + float dx; //!< horizontal interval between letters + int line_type; //!< Qt: PointSize +} +CvFont; + +/** @brief Initializes font structure (OpenCV 1.x API). + +The function initializes the font structure that can be passed to text rendering functions. + +@param font Pointer to the font structure initialized by the function +@param font_face Font name identifier. See cv::HersheyFonts and corresponding old CV_* identifiers. +@param hscale Horizontal scale. If equal to 1.0f , the characters have the original width +depending on the font type. If equal to 0.5f , the characters are of half the original width. +@param vscale Vertical scale. If equal to 1.0f , the characters have the original height depending +on the font type. If equal to 0.5f , the characters are of half the original height. +@param shear Approximate tangent of the character slope relative to the vertical line. A zero +value means a non-italic font, 1.0f means about a 45 degree slope, etc. +@param thickness Thickness of the text strokes +@param line_type Type of the strokes, see line description + +@sa cvPutText + */ +CVAPI(void) cvInitFont( CvFont* font, int font_face, + double hscale, double vscale, + double shear CV_DEFAULT(0), + int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8)); + +CV_INLINE CvFont cvFont( double scale, int thickness CV_DEFAULT(1) ) +{ + CvFont font; + cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, scale, scale, 0, thickness, CV_AA ); + return font; +} + +/** @brief Renders text stroke with specified font and color at specified location. + CvFont should be initialized with cvInitFont +@see cvInitFont, cvGetTextSize, cvFont, cv::putText +*/ +CVAPI(void) cvPutText( CvArr* img, const char* text, CvPoint org, + const CvFont* font, CvScalar color ); + +/** @brief Calculates bounding box of text stroke (useful for alignment) +@see cv::getTextSize +*/ +CVAPI(void) cvGetTextSize( const char* text_string, const CvFont* font, + CvSize* text_size, int* baseline ); + +/** @brief Unpacks color value + +if arrtype is CV_8UC?, _color_ is treated as packed color value, otherwise the first channels +(depending on arrtype) of destination scalar are set to the same value = _color_ +*/ +CVAPI(CvScalar) cvColorToScalar( double packed_color, int arrtype ); + +/** @brief Returns the polygon points which make up the given ellipse. + +The ellipse is define by the box of size 'axes' rotated 'angle' around the 'center'. A partial +sweep of the ellipse arc can be done by specifying arc_start and arc_end to be something other than +0 and 360, respectively. The input array 'pts' must be large enough to hold the result. The total +number of points stored into 'pts' is returned by this function. +@see cv::ellipse2Poly +*/ +CVAPI(int) cvEllipse2Poly( CvPoint center, CvSize axes, + int angle, int arc_start, int arc_end, CvPoint * pts, int delta ); + +/** @brief Draws contour outlines or filled interiors on the image +@see cv::drawContours +*/ +CVAPI(void) cvDrawContours( CvArr *img, CvSeq* contour, + CvScalar external_color, CvScalar hole_color, + int max_level, int thickness CV_DEFAULT(1), + int line_type CV_DEFAULT(8), + CvPoint offset CV_DEFAULT(cvPoint(0,0))); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/segmentation.hpp b/Thirdparty/opencv2/include/opencv2/imgproc/segmentation.hpp new file mode 100644 index 0000000..c40d501 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/segmentation.hpp @@ -0,0 +1,141 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_IMGPROC_SEGMENTATION_HPP +#define OPENCV_IMGPROC_SEGMENTATION_HPP + +#include "opencv2/imgproc.hpp" + +namespace cv { + +namespace segmentation { + +//! @addtogroup imgproc_segmentation +//! @{ + + +/** @brief Intelligent Scissors image segmentation + * + * This class is used to find the path (contour) between two points + * which can be used for image segmentation. + * + * Usage example: + * @snippet snippets/imgproc_segmentation.cpp usage_example_intelligent_scissors + * + * Reference: "Intelligent Scissors for Image Composition" + * algorithm designed by Eric N. Mortensen and William A. Barrett, Brigham Young University + * @cite Mortensen95intelligentscissors + */ +class CV_EXPORTS_W_SIMPLE IntelligentScissorsMB +{ +public: + CV_WRAP + IntelligentScissorsMB(); + + /** @brief Specify weights of feature functions + * + * Consider keeping weights normalized (sum of weights equals to 1.0) + * Discrete dynamic programming (DP) goal is minimization of costs between pixels. + * + * @param weight_non_edge Specify cost of non-edge pixels (default: 0.43f) + * @param weight_gradient_direction Specify cost of gradient direction function (default: 0.43f) + * @param weight_gradient_magnitude Specify cost of gradient magnitude function (default: 0.14f) + */ + CV_WRAP + IntelligentScissorsMB& setWeights(float weight_non_edge, float weight_gradient_direction, float weight_gradient_magnitude); + + /** @brief Specify gradient magnitude max value threshold + * + * Zero limit value is used to disable gradient magnitude thresholding (default behavior, as described in original article). + * Otherwize pixels with `gradient magnitude >= threshold` have zero cost. + * + * @note Thresholding should be used for images with irregular regions (to avoid stuck on parameters from high-contract areas, like embedded logos). + * + * @param gradient_magnitude_threshold_max Specify gradient magnitude max value threshold (default: 0, disabled) + */ + CV_WRAP + IntelligentScissorsMB& setGradientMagnitudeMaxLimit(float gradient_magnitude_threshold_max = 0.0f); + + /** @brief Switch to "Laplacian Zero-Crossing" edge feature extractor and specify its parameters + * + * This feature extractor is used by default according to article. + * + * Implementation has additional filtering for regions with low-amplitude noise. + * This filtering is enabled through parameter of minimal gradient amplitude (use some small value 4, 8, 16). + * + * @note Current implementation of this feature extractor is based on processing of grayscale images (color image is converted to grayscale image first). + * + * @note Canny edge detector is a bit slower, but provides better results (especially on color images): use setEdgeFeatureCannyParameters(). + * + * @param gradient_magnitude_min_value Minimal gradient magnitude value for edge pixels (default: 0, check is disabled) + */ + CV_WRAP + IntelligentScissorsMB& setEdgeFeatureZeroCrossingParameters(float gradient_magnitude_min_value = 0.0f); + + /** @brief Switch edge feature extractor to use Canny edge detector + * + * @note "Laplacian Zero-Crossing" feature extractor is used by default (following to original article) + * + * @sa Canny + */ + CV_WRAP + IntelligentScissorsMB& setEdgeFeatureCannyParameters( + double threshold1, double threshold2, + int apertureSize = 3, bool L2gradient = false + ); + + /** @brief Specify input image and extract image features + * + * @param image input image. Type is #CV_8UC1 / #CV_8UC3 + */ + CV_WRAP + IntelligentScissorsMB& applyImage(InputArray image); + + /** @brief Specify custom features of input image + * + * Customized advanced variant of applyImage() call. + * + * @param non_edge Specify cost of non-edge pixels. Type is CV_8UC1. Expected values are `{0, 1}`. + * @param gradient_direction Specify gradient direction feature. Type is CV_32FC2. Values are expected to be normalized: `x^2 + y^2 == 1` + * @param gradient_magnitude Specify cost of gradient magnitude function: Type is CV_32FC1. Values should be in range `[0, 1]`. + * @param image **Optional parameter**. Must be specified if subset of features is specified (non-specified features are calculated internally) + */ + CV_WRAP + IntelligentScissorsMB& applyImageFeatures( + InputArray non_edge, InputArray gradient_direction, InputArray gradient_magnitude, + InputArray image = noArray() + ); + + /** @brief Prepares a map of optimal paths for the given source point on the image + * + * @note applyImage() / applyImageFeatures() must be called before this call + * + * @param sourcePt The source point used to find the paths + */ + CV_WRAP void buildMap(const Point& sourcePt); + + /** @brief Extracts optimal contour for the given target point on the image + * + * @note buildMap() must be called before this call + * + * @param targetPt The target point + * @param[out] contour The list of pixels which contains optimal path between the source and the target points of the image. Type is CV_32SC2 (compatible with `std::vector`) + * @param backward Flag to indicate reverse order of retrived pixels (use "true" value to fetch points from the target to the source point) + */ + CV_WRAP void getContour(const Point& targetPt, OutputArray contour, bool backward = false) const; + +#ifndef CV_DOXYGEN + struct Impl; + inline Impl* getImpl() const { return impl.get(); } +protected: + std::shared_ptr impl; +#endif +}; + +//! @} + +} // namespace segmentation +} // namespace cv + +#endif // OPENCV_IMGPROC_SEGMENTATION_HPP diff --git a/Thirdparty/opencv2/include/opencv2/imgproc/types_c.h b/Thirdparty/opencv2/include/opencv2/imgproc/types_c.h new file mode 100644 index 0000000..d3e55f5 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/imgproc/types_c.h @@ -0,0 +1,659 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_IMGPROC_TYPES_C_H +#define OPENCV_IMGPROC_TYPES_C_H + +#include "opencv2/core/core_c.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup imgproc_c + @{ +*/ + +/** Connected component structure */ +typedef struct CvConnectedComp +{ + double area; /** DBL_EPSILON ? 1./std::sqrt(am00) : 0; + } + operator cv::Moments() const + { + return cv::Moments(m00, m10, m01, m20, m11, m02, m30, m21, m12, m03); + } +#endif +} +CvMoments; + +#ifdef __cplusplus +} // extern "C" + +CV_INLINE CvMoments cvMoments() +{ +#if !defined(CV__ENABLE_C_API_CTORS) + CvMoments self = CV_STRUCT_INITIALIZER; return self; +#else + return CvMoments(); +#endif +} + +CV_INLINE CvMoments cvMoments(const cv::Moments& m) +{ +#if !defined(CV__ENABLE_C_API_CTORS) + double am00 = std::abs(m.m00); + CvMoments self = { + m.m00, m.m10, m.m01, m.m20, m.m11, m.m02, m.m30, m.m21, m.m12, m.m03, + m.mu20, m.mu11, m.mu02, m.mu30, m.mu21, m.mu12, m.mu03, + am00 > DBL_EPSILON ? 1./std::sqrt(am00) : 0 + }; + return self; +#else + return CvMoments(m); +#endif +} + +extern "C" { +#endif // __cplusplus + +/** Hu invariants */ +typedef struct CvHuMoments +{ + double hu1, hu2, hu3, hu4, hu5, hu6, hu7; /**< Hu invariants */ +} +CvHuMoments; + +/** Template matching methods */ +enum +{ + CV_TM_SQDIFF =0, + CV_TM_SQDIFF_NORMED =1, + CV_TM_CCORR =2, + CV_TM_CCORR_NORMED =3, + CV_TM_CCOEFF =4, + CV_TM_CCOEFF_NORMED =5 +}; + +typedef float (CV_CDECL * CvDistanceFunction)( const float* a, const float* b, void* user_param ); + +/** Contour retrieval modes */ +enum +{ + CV_RETR_EXTERNAL=0, + CV_RETR_LIST=1, + CV_RETR_CCOMP=2, + CV_RETR_TREE=3, + CV_RETR_FLOODFILL=4 +}; + +/** Contour approximation methods */ +enum +{ + CV_CHAIN_CODE=0, + CV_CHAIN_APPROX_NONE=1, + CV_CHAIN_APPROX_SIMPLE=2, + CV_CHAIN_APPROX_TC89_L1=3, + CV_CHAIN_APPROX_TC89_KCOS=4, + CV_LINK_RUNS=5 +}; + +/* +Internal structure that is used for sequential retrieving contours from the image. +It supports both hierarchical and plane variants of Suzuki algorithm. +*/ +typedef struct _CvContourScanner* CvContourScanner; + +/** Freeman chain reader state */ +typedef struct CvChainPtReader +{ + CV_SEQ_READER_FIELDS() + char code; + CvPoint pt; + schar deltas[8][2]; +} +CvChainPtReader; + +/** initializes 8-element array for fast access to 3x3 neighborhood of a pixel */ +#define CV_INIT_3X3_DELTAS( deltas, step, nch ) \ + ((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \ + (deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \ + (deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \ + (deltas)[6] = (step), (deltas)[7] = (step) + (nch)) + + +/** Contour approximation algorithms */ +enum +{ + CV_POLY_APPROX_DP = 0 +}; + +/** Shape matching methods */ +enum +{ + CV_CONTOURS_MATCH_I1 =1, //!< \f[I_1(A,B) = \sum _{i=1...7} \left | \frac{1}{m^A_i} - \frac{1}{m^B_i} \right |\f] + CV_CONTOURS_MATCH_I2 =2, //!< \f[I_2(A,B) = \sum _{i=1...7} \left | m^A_i - m^B_i \right |\f] + CV_CONTOURS_MATCH_I3 =3 //!< \f[I_3(A,B) = \max _{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| }\f] +}; + +/** Shape orientation */ +enum +{ + CV_CLOCKWISE =1, + CV_COUNTER_CLOCKWISE =2 +}; + + +/** Convexity defect */ +typedef struct CvConvexityDefect +{ + CvPoint* start; /**< point of the contour where the defect begins */ + CvPoint* end; /**< point of the contour where the defect ends */ + CvPoint* depth_point; /**< the farthest from the convex hull point within the defect */ + float depth; /**< distance between the farthest point and the convex hull */ +} CvConvexityDefect; + + +/** Histogram comparison methods */ +enum +{ + CV_COMP_CORREL =0, + CV_COMP_CHISQR =1, + CV_COMP_INTERSECT =2, + CV_COMP_BHATTACHARYYA =3, + CV_COMP_HELLINGER =CV_COMP_BHATTACHARYYA, + CV_COMP_CHISQR_ALT =4, + CV_COMP_KL_DIV =5 +}; + +/** Mask size for distance transform */ +enum +{ + CV_DIST_MASK_3 =3, + CV_DIST_MASK_5 =5, + CV_DIST_MASK_PRECISE =0 +}; + +/** Content of output label array: connected components or pixels */ +enum +{ + CV_DIST_LABEL_CCOMP = 0, + CV_DIST_LABEL_PIXEL = 1 +}; + +/** Distance types for Distance Transform and M-estimators */ +enum +{ + CV_DIST_USER =-1, /**< User defined distance */ + CV_DIST_L1 =1, /**< distance = |x1-x2| + |y1-y2| */ + CV_DIST_L2 =2, /**< the simple euclidean distance */ + CV_DIST_C =3, /**< distance = max(|x1-x2|,|y1-y2|) */ + CV_DIST_L12 =4, /**< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */ + CV_DIST_FAIR =5, /**< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 */ + CV_DIST_WELSCH =6, /**< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 */ + CV_DIST_HUBER =7 /**< distance = |x| threshold ? max_value : 0 */ + CV_THRESH_BINARY_INV =1, /**< value = value > threshold ? 0 : max_value */ + CV_THRESH_TRUNC =2, /**< value = value > threshold ? threshold : value */ + CV_THRESH_TOZERO =3, /**< value = value > threshold ? value : 0 */ + CV_THRESH_TOZERO_INV =4, /**< value = value > threshold ? 0 : value */ + CV_THRESH_MASK =7, + CV_THRESH_OTSU =8, /**< use Otsu algorithm to choose the optimal threshold value; + combine the flag with one of the above CV_THRESH_* values */ + CV_THRESH_TRIANGLE =16 /**< use Triangle algorithm to choose the optimal threshold value; + combine the flag with one of the above CV_THRESH_* values, but not + with CV_THRESH_OTSU */ +}; + +/** Adaptive threshold methods */ +enum +{ + CV_ADAPTIVE_THRESH_MEAN_C =0, + CV_ADAPTIVE_THRESH_GAUSSIAN_C =1 +}; + +/** FloodFill flags */ +enum +{ + CV_FLOODFILL_FIXED_RANGE =(1 << 16), + CV_FLOODFILL_MASK_ONLY =(1 << 17) +}; + + +/** Canny edge detector flags */ +enum +{ + CV_CANNY_L2_GRADIENT =(1 << 31) +}; + +/** Variants of a Hough transform */ +enum +{ + CV_HOUGH_STANDARD =0, + CV_HOUGH_PROBABILISTIC =1, + CV_HOUGH_MULTI_SCALE =2, + CV_HOUGH_GRADIENT =3 +}; + + +/* Fast search data structures */ +struct CvFeatureTree; +struct CvLSH; +struct CvLSHOperations; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/ml.hpp b/Thirdparty/opencv2/include/opencv2/ml.hpp new file mode 100644 index 0000000..d537ab7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/ml.hpp @@ -0,0 +1,1956 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Copyright (C) 2014, Itseez Inc, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_ML_HPP +#define OPENCV_ML_HPP + +#ifdef __cplusplus +# include "opencv2/core.hpp" +#endif + +#ifdef __cplusplus + +#include +#include +#include + +/** + @defgroup ml Machine Learning + + The Machine Learning Library (MLL) is a set of classes and functions for statistical + classification, regression, and clustering of data. + + Most of the classification and regression algorithms are implemented as C++ classes. As the + algorithms have different sets of features (like an ability to handle missing measurements or + categorical input variables), there is a little common ground between the classes. This common + ground is defined by the class cv::ml::StatModel that all the other ML classes are derived from. + + See detailed overview here: @ref ml_intro. + */ + +namespace cv +{ + +namespace ml +{ + +//! @addtogroup ml +//! @{ + +/** @brief Variable types */ +enum VariableTypes +{ + VAR_NUMERICAL =0, //!< same as VAR_ORDERED + VAR_ORDERED =0, //!< ordered variables + VAR_CATEGORICAL =1 //!< categorical variables +}; + +/** @brief %Error types */ +enum ErrorTypes +{ + TEST_ERROR = 0, + TRAIN_ERROR = 1 +}; + +/** @brief Sample types */ +enum SampleTypes +{ + ROW_SAMPLE = 0, //!< each training sample is a row of samples + COL_SAMPLE = 1 //!< each training sample occupies a column of samples +}; + +/** @brief The structure represents the logarithmic grid range of statmodel parameters. + +It is used for optimizing statmodel accuracy by varying model parameters, the accuracy estimate +being computed by cross-validation. + */ +class CV_EXPORTS_W ParamGrid +{ +public: + /** @brief Default constructor */ + ParamGrid(); + /** @brief Constructor with parameters */ + ParamGrid(double _minVal, double _maxVal, double _logStep); + + CV_PROP_RW double minVal; //!< Minimum value of the statmodel parameter. Default value is 0. + CV_PROP_RW double maxVal; //!< Maximum value of the statmodel parameter. Default value is 0. + /** @brief Logarithmic step for iterating the statmodel parameter. + + The grid determines the following iteration sequence of the statmodel parameter values: + \f[(minVal, minVal*step, minVal*{step}^2, \dots, minVal*{logStep}^n),\f] + where \f$n\f$ is the maximal index satisfying + \f[\texttt{minVal} * \texttt{logStep} ^n < \texttt{maxVal}\f] + The grid is logarithmic, so logStep must always be greater than 1. Default value is 1. + */ + CV_PROP_RW double logStep; + + /** @brief Creates a ParamGrid Ptr that can be given to the %SVM::trainAuto method + + @param minVal minimum value of the parameter grid + @param maxVal maximum value of the parameter grid + @param logstep Logarithmic step for iterating the statmodel parameter + */ + CV_WRAP static Ptr create(double minVal=0., double maxVal=0., double logstep=1.); +}; + +/** @brief Class encapsulating training data. + +Please note that the class only specifies the interface of training data, but not implementation. +All the statistical model classes in _ml_ module accepts Ptr\ as parameter. In other +words, you can create your own class derived from TrainData and pass smart pointer to the instance +of this class into StatModel::train. + +@sa @ref ml_intro_data + */ +class CV_EXPORTS_W TrainData +{ +public: + static inline float missingValue() { return FLT_MAX; } + virtual ~TrainData(); + + CV_WRAP virtual int getLayout() const = 0; + CV_WRAP virtual int getNTrainSamples() const = 0; + CV_WRAP virtual int getNTestSamples() const = 0; + CV_WRAP virtual int getNSamples() const = 0; + CV_WRAP virtual int getNVars() const = 0; + CV_WRAP virtual int getNAllVars() const = 0; + + CV_WRAP virtual void getSample(InputArray varIdx, int sidx, float* buf) const = 0; + CV_WRAP virtual Mat getSamples() const = 0; + CV_WRAP virtual Mat getMissing() const = 0; + + /** @brief Returns matrix of train samples + + @param layout The requested layout. If it's different from the initial one, the matrix is + transposed. See ml::SampleTypes. + @param compressSamples if true, the function returns only the training samples (specified by + sampleIdx) + @param compressVars if true, the function returns the shorter training samples, containing only + the active variables. + + In current implementation the function tries to avoid physical data copying and returns the + matrix stored inside TrainData (unless the transposition or compression is needed). + */ + CV_WRAP virtual Mat getTrainSamples(int layout=ROW_SAMPLE, + bool compressSamples=true, + bool compressVars=true) const = 0; + + /** @brief Returns the vector of responses + + The function returns ordered or the original categorical responses. Usually it's used in + regression algorithms. + */ + CV_WRAP virtual Mat getTrainResponses() const = 0; + + /** @brief Returns the vector of normalized categorical responses + + The function returns vector of responses. Each response is integer from `0` to `-1`. The actual label value can be retrieved then from the class label vector, see + TrainData::getClassLabels. + */ + CV_WRAP virtual Mat getTrainNormCatResponses() const = 0; + CV_WRAP virtual Mat getTestResponses() const = 0; + CV_WRAP virtual Mat getTestNormCatResponses() const = 0; + CV_WRAP virtual Mat getResponses() const = 0; + CV_WRAP virtual Mat getNormCatResponses() const = 0; + CV_WRAP virtual Mat getSampleWeights() const = 0; + CV_WRAP virtual Mat getTrainSampleWeights() const = 0; + CV_WRAP virtual Mat getTestSampleWeights() const = 0; + CV_WRAP virtual Mat getVarIdx() const = 0; + CV_WRAP virtual Mat getVarType() const = 0; + CV_WRAP virtual Mat getVarSymbolFlags() const = 0; + CV_WRAP virtual int getResponseType() const = 0; + CV_WRAP virtual Mat getTrainSampleIdx() const = 0; + CV_WRAP virtual Mat getTestSampleIdx() const = 0; + CV_WRAP virtual void getValues(int vi, InputArray sidx, float* values) const = 0; + virtual void getNormCatValues(int vi, InputArray sidx, int* values) const = 0; + CV_WRAP virtual Mat getDefaultSubstValues() const = 0; + + CV_WRAP virtual int getCatCount(int vi) const = 0; + + /** @brief Returns the vector of class labels + + The function returns vector of unique labels occurred in the responses. + */ + CV_WRAP virtual Mat getClassLabels() const = 0; + + CV_WRAP virtual Mat getCatOfs() const = 0; + CV_WRAP virtual Mat getCatMap() const = 0; + + /** @brief Splits the training data into the training and test parts + @sa TrainData::setTrainTestSplitRatio + */ + CV_WRAP virtual void setTrainTestSplit(int count, bool shuffle=true) = 0; + + /** @brief Splits the training data into the training and test parts + + The function selects a subset of specified relative size and then returns it as the training + set. If the function is not called, all the data is used for training. Please, note that for + each of TrainData::getTrain\* there is corresponding TrainData::getTest\*, so that the test + subset can be retrieved and processed as well. + @sa TrainData::setTrainTestSplit + */ + CV_WRAP virtual void setTrainTestSplitRatio(double ratio, bool shuffle=true) = 0; + CV_WRAP virtual void shuffleTrainTest() = 0; + + /** @brief Returns matrix of test samples */ + CV_WRAP virtual Mat getTestSamples() const = 0; + + /** @brief Returns vector of symbolic names captured in loadFromCSV() */ + CV_WRAP virtual void getNames(std::vector& names) const = 0; + + /** @brief Extract from 1D vector elements specified by passed indexes. + @param vec input vector (supported types: CV_32S, CV_32F, CV_64F) + @param idx 1D index vector + */ + static CV_WRAP Mat getSubVector(const Mat& vec, const Mat& idx); + + /** @brief Extract from matrix rows/cols specified by passed indexes. + @param matrix input matrix (supported types: CV_32S, CV_32F, CV_64F) + @param idx 1D index vector + @param layout specifies to extract rows (cv::ml::ROW_SAMPLES) or to extract columns (cv::ml::COL_SAMPLES) + */ + static CV_WRAP Mat getSubMatrix(const Mat& matrix, const Mat& idx, int layout); + + /** @brief Reads the dataset from a .csv file and returns the ready-to-use training data. + + @param filename The input file name + @param headerLineCount The number of lines in the beginning to skip; besides the header, the + function also skips empty lines and lines staring with `#` + @param responseStartIdx Index of the first output variable. If -1, the function considers the + last variable as the response + @param responseEndIdx Index of the last output variable + 1. If -1, then there is single + response variable at responseStartIdx. + @param varTypeSpec The optional text string that specifies the variables' types. It has the + format `ord[n1-n2,n3,n4-n5,...]cat[n6,n7-n8,...]`. That is, variables from `n1 to n2` + (inclusive range), `n3`, `n4 to n5` ... are considered ordered and `n6`, `n7 to n8` ... are + considered as categorical. The range `[n1..n2] + [n3] + [n4..n5] + ... + [n6] + [n7..n8]` + should cover all the variables. If varTypeSpec is not specified, then algorithm uses the + following rules: + - all input variables are considered ordered by default. If some column contains has non- + numerical values, e.g. 'apple', 'pear', 'apple', 'apple', 'mango', the corresponding + variable is considered categorical. + - if there are several output variables, they are all considered as ordered. Error is + reported when non-numerical values are used. + - if there is a single output variable, then if its values are non-numerical or are all + integers, then it's considered categorical. Otherwise, it's considered ordered. + @param delimiter The character used to separate values in each line. + @param missch The character used to specify missing measurements. It should not be a digit. + Although it's a non-numerical value, it surely does not affect the decision of whether the + variable ordered or categorical. + @note If the dataset only contains input variables and no responses, use responseStartIdx = -2 + and responseEndIdx = 0. The output variables vector will just contain zeros. + */ + static Ptr loadFromCSV(const String& filename, + int headerLineCount, + int responseStartIdx=-1, + int responseEndIdx=-1, + const String& varTypeSpec=String(), + char delimiter=',', + char missch='?'); + + /** @brief Creates training data from in-memory arrays. + + @param samples matrix of samples. It should have CV_32F type. + @param layout see ml::SampleTypes. + @param responses matrix of responses. If the responses are scalar, they should be stored as a + single row or as a single column. The matrix should have type CV_32F or CV_32S (in the + former case the responses are considered as ordered by default; in the latter case - as + categorical) + @param varIdx vector specifying which variables to use for training. It can be an integer vector + (CV_32S) containing 0-based variable indices or byte vector (CV_8U) containing a mask of + active variables. + @param sampleIdx vector specifying which samples to use for training. It can be an integer + vector (CV_32S) containing 0-based sample indices or byte vector (CV_8U) containing a mask + of training samples. + @param sampleWeights optional vector with weights for each sample. It should have CV_32F type. + @param varType optional vector of type CV_8U and size ` + + `, containing types of each input and output variable. See + ml::VariableTypes. + */ + CV_WRAP static Ptr create(InputArray samples, int layout, InputArray responses, + InputArray varIdx=noArray(), InputArray sampleIdx=noArray(), + InputArray sampleWeights=noArray(), InputArray varType=noArray()); +}; + +/** @brief Base class for statistical models in OpenCV ML. + */ +class CV_EXPORTS_W StatModel : public Algorithm +{ +public: + /** Predict options */ + enum Flags { + UPDATE_MODEL = 1, + RAW_OUTPUT=1, //!< makes the method return the raw results (the sum), not the class label + COMPRESSED_INPUT=2, + PREPROCESSED_INPUT=4 + }; + + /** @brief Returns the number of variables in training samples */ + CV_WRAP virtual int getVarCount() const = 0; + + CV_WRAP virtual bool empty() const CV_OVERRIDE; + + /** @brief Returns true if the model is trained */ + CV_WRAP virtual bool isTrained() const = 0; + /** @brief Returns true if the model is classifier */ + CV_WRAP virtual bool isClassifier() const = 0; + + /** @brief Trains the statistical model + + @param trainData training data that can be loaded from file using TrainData::loadFromCSV or + created with TrainData::create. + @param flags optional flags, depending on the model. Some of the models can be updated with the + new training samples, not completely overwritten (such as NormalBayesClassifier or ANN_MLP). + */ + CV_WRAP virtual bool train( const Ptr& trainData, int flags=0 ); + + /** @brief Trains the statistical model + + @param samples training samples + @param layout See ml::SampleTypes. + @param responses vector of responses associated with the training samples. + */ + CV_WRAP virtual bool train( InputArray samples, int layout, InputArray responses ); + + /** @brief Computes error on the training or test dataset + + @param data the training data + @param test if true, the error is computed over the test subset of the data, otherwise it's + computed over the training subset of the data. Please note that if you loaded a completely + different dataset to evaluate already trained classifier, you will probably want not to set + the test subset at all with TrainData::setTrainTestSplitRatio and specify test=false, so + that the error is computed for the whole new set. Yes, this sounds a bit confusing. + @param resp the optional output responses. + + The method uses StatModel::predict to compute the error. For regression models the error is + computed as RMS, for classifiers - as a percent of missclassified samples (0%-100%). + */ + CV_WRAP virtual float calcError( const Ptr& data, bool test, OutputArray resp ) const; + + /** @brief Predicts response(s) for the provided sample(s) + + @param samples The input samples, floating-point matrix + @param results The optional output matrix of results. + @param flags The optional flags, model-dependent. See cv::ml::StatModel::Flags. + */ + CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const = 0; + + /** @brief Create and train model with default parameters + + The class must implement static `create()` method with no parameters or with all default parameter values + */ + template static Ptr<_Tp> train(const Ptr& data, int flags=0) + { + Ptr<_Tp> model = _Tp::create(); + return !model.empty() && model->train(data, flags) ? model : Ptr<_Tp>(); + } +}; + +/****************************************************************************************\ +* Normal Bayes Classifier * +\****************************************************************************************/ + +/** @brief Bayes classifier for normally distributed data. + +@sa @ref ml_intro_bayes + */ +class CV_EXPORTS_W NormalBayesClassifier : public StatModel +{ +public: + /** @brief Predicts the response for sample(s). + + The method estimates the most probable classes for input vectors. Input vectors (one or more) + are stored as rows of the matrix inputs. In case of multiple input vectors, there should be one + output vector outputs. The predicted class for a single input vector is returned by the method. + The vector outputProbs contains the output probabilities corresponding to each element of + result. + */ + CV_WRAP virtual float predictProb( InputArray inputs, OutputArray outputs, + OutputArray outputProbs, int flags=0 ) const = 0; + + /** Creates empty model + Use StatModel::train to train the model after creation. */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized NormalBayesClassifier from a file + * + * Use NormalBayesClassifier::save to serialize and store an NormalBayesClassifier to disk. + * Load the NormalBayesClassifier from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized NormalBayesClassifier + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + +/****************************************************************************************\ +* K-Nearest Neighbour Classifier * +\****************************************************************************************/ + +/** @brief The class implements K-Nearest Neighbors model + +@sa @ref ml_intro_knn + */ +class CV_EXPORTS_W KNearest : public StatModel +{ +public: + + /** Default number of neighbors to use in predict method. */ + /** @see setDefaultK */ + CV_WRAP virtual int getDefaultK() const = 0; + /** @copybrief getDefaultK @see getDefaultK */ + CV_WRAP virtual void setDefaultK(int val) = 0; + + /** Whether classification or regression model should be trained. */ + /** @see setIsClassifier */ + CV_WRAP virtual bool getIsClassifier() const = 0; + /** @copybrief getIsClassifier @see getIsClassifier */ + CV_WRAP virtual void setIsClassifier(bool val) = 0; + + /** Parameter for KDTree implementation. */ + /** @see setEmax */ + CV_WRAP virtual int getEmax() const = 0; + /** @copybrief getEmax @see getEmax */ + CV_WRAP virtual void setEmax(int val) = 0; + + /** %Algorithm type, one of KNearest::Types. */ + /** @see setAlgorithmType */ + CV_WRAP virtual int getAlgorithmType() const = 0; + /** @copybrief getAlgorithmType @see getAlgorithmType */ + CV_WRAP virtual void setAlgorithmType(int val) = 0; + + /** @brief Finds the neighbors and predicts responses for input vectors. + + @param samples Input samples stored by rows. It is a single-precision floating-point matrix of + ` * k` size. + @param k Number of used nearest neighbors. Should be greater than 1. + @param results Vector with results of prediction (regression or classification) for each input + sample. It is a single-precision floating-point vector with `` elements. + @param neighborResponses Optional output values for corresponding neighbors. It is a single- + precision floating-point matrix of ` * k` size. + @param dist Optional output distances from the input vectors to the corresponding neighbors. It + is a single-precision floating-point matrix of ` * k` size. + + For each input vector (a row of the matrix samples), the method finds the k nearest neighbors. + In case of regression, the predicted result is a mean value of the particular vector's neighbor + responses. In case of classification, the class is determined by voting. + + For each input vector, the neighbors are sorted by their distances to the vector. + + In case of C++ interface you can use output pointers to empty matrices and the function will + allocate memory itself. + + If only a single input vector is passed, all output matrices are optional and the predicted + value is returned by the method. + + The function is parallelized with the TBB library. + */ + CV_WRAP virtual float findNearest( InputArray samples, int k, + OutputArray results, + OutputArray neighborResponses=noArray(), + OutputArray dist=noArray() ) const = 0; + + /** @brief Implementations of KNearest algorithm + */ + enum Types + { + BRUTE_FORCE=1, + KDTREE=2 + }; + + /** @brief Creates the empty model + + The static method creates empty %KNearest classifier. It should be then trained using StatModel::train method. + */ + CV_WRAP static Ptr create(); + /** @brief Loads and creates a serialized knearest from a file + * + * Use KNearest::save to serialize and store an KNearest to disk. + * Load the KNearest from this file again, by calling this function with the path to the file. + * + * @param filepath path to serialized KNearest + */ + CV_WRAP static Ptr load(const String& filepath); +}; + +/****************************************************************************************\ +* Support Vector Machines * +\****************************************************************************************/ + +/** @brief Support Vector Machines. + +@sa @ref ml_intro_svm + */ +class CV_EXPORTS_W SVM : public StatModel +{ +public: + + class CV_EXPORTS Kernel : public Algorithm + { + public: + virtual int getType() const = 0; + virtual void calc( int vcount, int n, const float* vecs, const float* another, float* results ) = 0; + }; + + /** Type of a %SVM formulation. + See SVM::Types. Default value is SVM::C_SVC. */ + /** @see setType */ + CV_WRAP virtual int getType() const = 0; + /** @copybrief getType @see getType */ + CV_WRAP virtual void setType(int val) = 0; + + /** Parameter \f$\gamma\f$ of a kernel function. + For SVM::POLY, SVM::RBF, SVM::SIGMOID or SVM::CHI2. Default value is 1. */ + /** @see setGamma */ + CV_WRAP virtual double getGamma() const = 0; + /** @copybrief getGamma @see getGamma */ + CV_WRAP virtual void setGamma(double val) = 0; + + /** Parameter _coef0_ of a kernel function. + For SVM::POLY or SVM::SIGMOID. Default value is 0.*/ + /** @see setCoef0 */ + CV_WRAP virtual double getCoef0() const = 0; + /** @copybrief getCoef0 @see getCoef0 */ + CV_WRAP virtual void setCoef0(double val) = 0; + + /** Parameter _degree_ of a kernel function. + For SVM::POLY. Default value is 0. */ + /** @see setDegree */ + CV_WRAP virtual double getDegree() const = 0; + /** @copybrief getDegree @see getDegree */ + CV_WRAP virtual void setDegree(double val) = 0; + + /** Parameter _C_ of a %SVM optimization problem. + For SVM::C_SVC, SVM::EPS_SVR or SVM::NU_SVR. Default value is 0. */ + /** @see setC */ + CV_WRAP virtual double getC() const = 0; + /** @copybrief getC @see getC */ + CV_WRAP virtual void setC(double val) = 0; + + /** Parameter \f$\nu\f$ of a %SVM optimization problem. + For SVM::NU_SVC, SVM::ONE_CLASS or SVM::NU_SVR. Default value is 0. */ + /** @see setNu */ + CV_WRAP virtual double getNu() const = 0; + /** @copybrief getNu @see getNu */ + CV_WRAP virtual void setNu(double val) = 0; + + /** Parameter \f$\epsilon\f$ of a %SVM optimization problem. + For SVM::EPS_SVR. Default value is 0. */ + /** @see setP */ + CV_WRAP virtual double getP() const = 0; + /** @copybrief getP @see getP */ + CV_WRAP virtual void setP(double val) = 0; + + /** Optional weights in the SVM::C_SVC problem, assigned to particular classes. + They are multiplied by _C_ so the parameter _C_ of class _i_ becomes `classWeights(i) * C`. Thus + these weights affect the misclassification penalty for different classes. The larger weight, + the larger penalty on misclassification of data from the corresponding class. Default value is + empty Mat. */ + /** @see setClassWeights */ + CV_WRAP virtual cv::Mat getClassWeights() const = 0; + /** @copybrief getClassWeights @see getClassWeights */ + CV_WRAP virtual void setClassWeights(const cv::Mat &val) = 0; + + /** Termination criteria of the iterative %SVM training procedure which solves a partial + case of constrained quadratic optimization problem. + You can specify tolerance and/or the maximum number of iterations. Default value is + `TermCriteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON )`; */ + /** @see setTermCriteria */ + CV_WRAP virtual cv::TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0; + + /** Type of a %SVM kernel. + See SVM::KernelTypes. Default value is SVM::RBF. */ + CV_WRAP virtual int getKernelType() const = 0; + + /** Initialize with one of predefined kernels. + See SVM::KernelTypes. */ + CV_WRAP virtual void setKernel(int kernelType) = 0; + + /** Initialize with custom kernel. + See SVM::Kernel class for implementation details */ + virtual void setCustomKernel(const Ptr &_kernel) = 0; + + //! %SVM type + enum Types { + /** C-Support Vector Classification. n-class classification (n \f$\geq\f$ 2), allows + imperfect separation of classes with penalty multiplier C for outliers. */ + C_SVC=100, + /** \f$\nu\f$-Support Vector Classification. n-class classification with possible + imperfect separation. Parameter \f$\nu\f$ (in the range 0..1, the larger the value, the smoother + the decision boundary) is used instead of C. */ + NU_SVC=101, + /** Distribution Estimation (One-class %SVM). All the training data are from + the same class, %SVM builds a boundary that separates the class from the rest of the feature + space. */ + ONE_CLASS=102, + /** \f$\epsilon\f$-Support Vector Regression. The distance between feature vectors + from the training set and the fitting hyper-plane must be less than p. For outliers the + penalty multiplier C is used. */ + EPS_SVR=103, + /** \f$\nu\f$-Support Vector Regression. \f$\nu\f$ is used instead of p. + See @cite LibSVM for details. */ + NU_SVR=104 + }; + + /** @brief %SVM kernel type + + A comparison of different kernels on the following 2D test case with four classes. Four + SVM::C_SVC SVMs have been trained (one against rest) with auto_train. Evaluation on three + different kernels (SVM::CHI2, SVM::INTER, SVM::RBF). The color depicts the class with max score. + Bright means max-score \> 0, dark means max-score \< 0. + ![image](pics/SVM_Comparison.png) + */ + enum KernelTypes { + /** Returned by SVM::getKernelType in case when custom kernel has been set */ + CUSTOM=-1, + /** Linear kernel. No mapping is done, linear discrimination (or regression) is + done in the original feature space. It is the fastest option. \f$K(x_i, x_j) = x_i^T x_j\f$. */ + LINEAR=0, + /** Polynomial kernel: + \f$K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\f$. */ + POLY=1, + /** Radial basis function (RBF), a good choice in most cases. + \f$K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\f$. */ + RBF=2, + /** Sigmoid kernel: \f$K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\f$. */ + SIGMOID=3, + /** Exponential Chi2 kernel, similar to the RBF kernel: + \f$K(x_i, x_j) = e^{-\gamma \chi^2(x_i,x_j)}, \chi^2(x_i,x_j) = (x_i-x_j)^2/(x_i+x_j), \gamma > 0\f$. */ + CHI2=4, + /** Histogram intersection kernel. A fast kernel. \f$K(x_i, x_j) = min(x_i,x_j)\f$. */ + INTER=5 + }; + + //! %SVM params type + enum ParamTypes { + C=0, + GAMMA=1, + P=2, + NU=3, + COEF=4, + DEGREE=5 + }; + + /** @brief Trains an %SVM with optimal parameters. + + @param data the training data that can be constructed using TrainData::create or + TrainData::loadFromCSV. + @param kFold Cross-validation parameter. The training set is divided into kFold subsets. One + subset is used to test the model, the others form the train set. So, the %SVM algorithm is + executed kFold times. + @param Cgrid grid for C + @param gammaGrid grid for gamma + @param pGrid grid for p + @param nuGrid grid for nu + @param coeffGrid grid for coeff + @param degreeGrid grid for degree + @param balanced If true and the problem is 2-class classification then the method creates more + balanced cross-validation subsets that is proportions between classes in subsets are close + to such proportion in the whole train dataset. + + The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p, + nu, coef0, degree. Parameters are considered optimal when the cross-validation + estimate of the test set error is minimal. + + If there is no need to optimize a parameter, the corresponding grid step should be set to any + value less than or equal to 1. For example, to avoid optimization in gamma, set `gammaGrid.step + = 0`, `gammaGrid.minVal`, `gamma_grid.maxVal` as arbitrary numbers. In this case, the value + `Gamma` is taken for gamma. + + And, finally, if the optimization in a parameter is required but the corresponding grid is + unknown, you may call the function SVM::getDefaultGrid. To generate a grid, for example, for + gamma, call `SVM::getDefaultGrid(SVM::GAMMA)`. + + This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the + regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and + the usual %SVM with parameters specified in params is executed. + */ + virtual bool trainAuto( const Ptr& data, int kFold = 10, + ParamGrid Cgrid = getDefaultGrid(C), + ParamGrid gammaGrid = getDefaultGrid(GAMMA), + ParamGrid pGrid = getDefaultGrid(P), + ParamGrid nuGrid = getDefaultGrid(NU), + ParamGrid coeffGrid = getDefaultGrid(COEF), + ParamGrid degreeGrid = getDefaultGrid(DEGREE), + bool balanced=false) = 0; + + /** @brief Trains an %SVM with optimal parameters + + @param samples training samples + @param layout See ml::SampleTypes. + @param responses vector of responses associated with the training samples. + @param kFold Cross-validation parameter. The training set is divided into kFold subsets. One + subset is used to test the model, the others form the train set. So, the %SVM algorithm is + @param Cgrid grid for C + @param gammaGrid grid for gamma + @param pGrid grid for p + @param nuGrid grid for nu + @param coeffGrid grid for coeff + @param degreeGrid grid for degree + @param balanced If true and the problem is 2-class classification then the method creates more + balanced cross-validation subsets that is proportions between classes in subsets are close + to such proportion in the whole train dataset. + + The method trains the %SVM model automatically by choosing the optimal parameters C, gamma, p, + nu, coef0, degree. Parameters are considered optimal when the cross-validation + estimate of the test set error is minimal. + + This function only makes use of SVM::getDefaultGrid for parameter optimization and thus only + offers rudimentary parameter options. + + This function works for the classification (SVM::C_SVC or SVM::NU_SVC) as well as for the + regression (SVM::EPS_SVR or SVM::NU_SVR). If it is SVM::ONE_CLASS, no optimization is made and + the usual %SVM with parameters specified in params is executed. + */ + CV_WRAP virtual bool trainAuto(InputArray samples, + int layout, + InputArray responses, + int kFold = 10, + Ptr Cgrid = SVM::getDefaultGridPtr(SVM::C), + Ptr gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA), + Ptr pGrid = SVM::getDefaultGridPtr(SVM::P), + Ptr nuGrid = SVM::getDefaultGridPtr(SVM::NU), + Ptr coeffGrid = SVM::getDefaultGridPtr(SVM::COEF), + Ptr degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE), + bool balanced=false) = 0; + + /** @brief Retrieves all the support vectors + + The method returns all the support vectors as a floating-point matrix, where support vectors are + stored as matrix rows. + */ + CV_WRAP virtual Mat getSupportVectors() const = 0; + + /** @brief Retrieves all the uncompressed support vectors of a linear %SVM + + The method returns all the uncompressed support vectors of a linear %SVM that the compressed + support vector, used for prediction, was derived from. They are returned in a floating-point + matrix, where the support vectors are stored as matrix rows. + */ + CV_WRAP virtual Mat getUncompressedSupportVectors() const = 0; + + /** @brief Retrieves the decision function + + @param i the index of the decision function. If the problem solved is regression, 1-class or + 2-class classification, then there will be just one decision function and the index should + always be 0. Otherwise, in the case of N-class classification, there will be \f$N(N-1)/2\f$ + decision functions. + @param alpha the optional output vector for weights, corresponding to different support vectors. + In the case of linear %SVM all the alpha's will be 1's. + @param svidx the optional output vector of indices of support vectors within the matrix of + support vectors (which can be retrieved by SVM::getSupportVectors). In the case of linear + %SVM each decision function consists of a single "compressed" support vector. + + The method returns rho parameter of the decision function, a scalar subtracted from the weighted + sum of kernel responses. + */ + CV_WRAP virtual double getDecisionFunction(int i, OutputArray alpha, OutputArray svidx) const = 0; + + /** @brief Generates a grid for %SVM parameters. + + @param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is + generated for the parameter with this ID. + + The function generates a grid for the specified parameter of the %SVM algorithm. The grid may be + passed to the function SVM::trainAuto. + */ + static ParamGrid getDefaultGrid( int param_id ); + + /** @brief Generates a grid for %SVM parameters. + + @param param_id %SVM parameters IDs that must be one of the SVM::ParamTypes. The grid is + generated for the parameter with this ID. + + The function generates a grid pointer for the specified parameter of the %SVM algorithm. + The grid may be passed to the function SVM::trainAuto. + */ + CV_WRAP static Ptr getDefaultGridPtr( int param_id ); + + /** Creates empty model. + Use StatModel::train to train the model. Since %SVM has several parameters, you may want to + find the best parameters for your problem, it can be done with SVM::trainAuto. */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized svm from a file + * + * Use SVM::save to serialize and store an SVM to disk. + * Load the SVM from this file again, by calling this function with the path to the file. + * + * @param filepath path to serialized svm + */ + CV_WRAP static Ptr load(const String& filepath); +}; + +/****************************************************************************************\ +* Expectation - Maximization * +\****************************************************************************************/ + +/** @brief The class implements the Expectation Maximization algorithm. + +@sa @ref ml_intro_em + */ +class CV_EXPORTS_W EM : public StatModel +{ +public: + //! Type of covariation matrices + enum Types { + /** A scaled identity matrix \f$\mu_k * I\f$. There is the only + parameter \f$\mu_k\f$ to be estimated for each matrix. The option may be used in special cases, + when the constraint is relevant, or as a first step in the optimization (for example in case + when the data is preprocessed with PCA). The results of such preliminary estimation may be + passed again to the optimization procedure, this time with + covMatType=EM::COV_MAT_DIAGONAL. */ + COV_MAT_SPHERICAL=0, + /** A diagonal matrix with positive diagonal elements. The number of + free parameters is d for each matrix. This is most commonly used option yielding good + estimation results. */ + COV_MAT_DIAGONAL=1, + /** A symmetric positively defined matrix. The number of free + parameters in each matrix is about \f$d^2/2\f$. It is not recommended to use this option, unless + there is pretty accurate initial estimation of the parameters and/or a huge number of + training samples. */ + COV_MAT_GENERIC=2, + COV_MAT_DEFAULT=COV_MAT_DIAGONAL + }; + + //! Default parameters + enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100}; + + //! The initial step + enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0}; + + /** The number of mixture components in the Gaussian mixture model. + Default value of the parameter is EM::DEFAULT_NCLUSTERS=5. Some of %EM implementation could + determine the optimal number of mixtures within a specified value range, but that is not the + case in ML yet. */ + /** @see setClustersNumber */ + CV_WRAP virtual int getClustersNumber() const = 0; + /** @copybrief getClustersNumber @see getClustersNumber */ + CV_WRAP virtual void setClustersNumber(int val) = 0; + + /** Constraint on covariance matrices which defines type of matrices. + See EM::Types. */ + /** @see setCovarianceMatrixType */ + CV_WRAP virtual int getCovarianceMatrixType() const = 0; + /** @copybrief getCovarianceMatrixType @see getCovarianceMatrixType */ + CV_WRAP virtual void setCovarianceMatrixType(int val) = 0; + + /** The termination criteria of the %EM algorithm. + The %EM algorithm can be terminated by the number of iterations termCrit.maxCount (number of + M-steps) or when relative change of likelihood logarithm is less than termCrit.epsilon. Default + maximum number of iterations is EM::DEFAULT_MAX_ITERS=100. */ + /** @see setTermCriteria */ + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0; + + /** @brief Returns weights of the mixtures + + Returns vector with the number of elements equal to the number of mixtures. + */ + CV_WRAP virtual Mat getWeights() const = 0; + /** @brief Returns the cluster centers (means of the Gaussian mixture) + + Returns matrix with the number of rows equal to the number of mixtures and number of columns + equal to the space dimensionality. + */ + CV_WRAP virtual Mat getMeans() const = 0; + /** @brief Returns covariation matrices + + Returns vector of covariation matrices. Number of matrices is the number of gaussian mixtures, + each matrix is a square floating-point matrix NxN, where N is the space dimensionality. + */ + CV_WRAP virtual void getCovs(CV_OUT std::vector& covs) const = 0; + + /** @brief Returns posterior probabilities for the provided samples + + @param samples The input samples, floating-point matrix + @param results The optional output \f$ nSamples \times nClusters\f$ matrix of results. It contains + posterior probabilities for each sample from the input + @param flags This parameter will be ignored + */ + CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0; + + /** @brief Returns a likelihood logarithm value and an index of the most probable mixture component + for the given sample. + + @param sample A sample for classification. It should be a one-channel matrix of + \f$1 \times dims\f$ or \f$dims \times 1\f$ size. + @param probs Optional output matrix that contains posterior probabilities of each component + given the sample. It has \f$1 \times nclusters\f$ size and CV_64FC1 type. + + The method returns a two-element double vector. Zero element is a likelihood logarithm value for + the sample. First element is an index of the most probable mixture component for the given + sample. + */ + CV_WRAP virtual Vec2d predict2(InputArray sample, OutputArray probs) const = 0; + + /** @brief Estimate the Gaussian mixture parameters from a samples set. + + This variation starts with Expectation step. Initial values of the model parameters will be + estimated by the k-means algorithm. + + Unlike many of the ML models, %EM is an unsupervised learning algorithm and it does not take + responses (class labels or function values) as input. Instead, it computes the *Maximum + Likelihood Estimate* of the Gaussian mixture parameters from an input sample set, stores all the + parameters inside the structure: \f$p_{i,k}\f$ in probs, \f$a_k\f$ in means , \f$S_k\f$ in + covs[k], \f$\pi_k\f$ in weights , and optionally computes the output "class label" for each + sample: \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most + probable mixture component for each sample). + + The trained model can be used further for prediction, just like any other classifier. The + trained model is similar to the NormalBayesClassifier. + + @param samples Samples from which the Gaussian mixture model will be estimated. It should be a + one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type + it will be converted to the inner matrix of such type for the further computing. + @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for + each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. + @param labels The optional output "class label" for each sample: + \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable + mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. + @param probs The optional output matrix that contains posterior probabilities of each Gaussian + mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and + CV_64FC1 type. + */ + CV_WRAP virtual bool trainEM(InputArray samples, + OutputArray logLikelihoods=noArray(), + OutputArray labels=noArray(), + OutputArray probs=noArray()) = 0; + + /** @brief Estimate the Gaussian mixture parameters from a samples set. + + This variation starts with Expectation step. You need to provide initial means \f$a_k\f$ of + mixture components. Optionally you can pass initial weights \f$\pi_k\f$ and covariance matrices + \f$S_k\f$ of mixture components. + + @param samples Samples from which the Gaussian mixture model will be estimated. It should be a + one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type + it will be converted to the inner matrix of such type for the further computing. + @param means0 Initial means \f$a_k\f$ of mixture components. It is a one-channel matrix of + \f$nclusters \times dims\f$ size. If the matrix does not have CV_64F type it will be + converted to the inner matrix of such type for the further computing. + @param covs0 The vector of initial covariance matrices \f$S_k\f$ of mixture components. Each of + covariance matrices is a one-channel matrix of \f$dims \times dims\f$ size. If the matrices + do not have CV_64F type they will be converted to the inner matrices of such type for the + further computing. + @param weights0 Initial weights \f$\pi_k\f$ of mixture components. It should be a one-channel + floating-point matrix with \f$1 \times nclusters\f$ or \f$nclusters \times 1\f$ size. + @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for + each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. + @param labels The optional output "class label" for each sample: + \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable + mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. + @param probs The optional output matrix that contains posterior probabilities of each Gaussian + mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and + CV_64FC1 type. + */ + CV_WRAP virtual bool trainE(InputArray samples, InputArray means0, + InputArray covs0=noArray(), + InputArray weights0=noArray(), + OutputArray logLikelihoods=noArray(), + OutputArray labels=noArray(), + OutputArray probs=noArray()) = 0; + + /** @brief Estimate the Gaussian mixture parameters from a samples set. + + This variation starts with Maximization step. You need to provide initial probabilities + \f$p_{i,k}\f$ to use this option. + + @param samples Samples from which the Gaussian mixture model will be estimated. It should be a + one-channel matrix, each row of which is a sample. If the matrix does not have CV_64F type + it will be converted to the inner matrix of such type for the further computing. + @param probs0 the probabilities + @param logLikelihoods The optional output matrix that contains a likelihood logarithm value for + each sample. It has \f$nsamples \times 1\f$ size and CV_64FC1 type. + @param labels The optional output "class label" for each sample: + \f$\texttt{labels}_i=\texttt{arg max}_k(p_{i,k}), i=1..N\f$ (indices of the most probable + mixture component for each sample). It has \f$nsamples \times 1\f$ size and CV_32SC1 type. + @param probs The optional output matrix that contains posterior probabilities of each Gaussian + mixture component given the each sample. It has \f$nsamples \times nclusters\f$ size and + CV_64FC1 type. + */ + CV_WRAP virtual bool trainM(InputArray samples, InputArray probs0, + OutputArray logLikelihoods=noArray(), + OutputArray labels=noArray(), + OutputArray probs=noArray()) = 0; + + /** Creates empty %EM model. + The model should be trained then using StatModel::train(traindata, flags) method. Alternatively, you + can use one of the EM::train\* methods or load it from file using Algorithm::load\(filename). + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized EM from a file + * + * Use EM::save to serialize and store an EM to disk. + * Load the EM from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized EM + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + +/****************************************************************************************\ +* Decision Tree * +\****************************************************************************************/ + +/** @brief The class represents a single decision tree or a collection of decision trees. + +The current public interface of the class allows user to train only a single decision tree, however +the class is capable of storing multiple decision trees and using them for prediction (by summing +responses or using a voting schemes), and the derived from DTrees classes (such as RTrees and Boost) +use this capability to implement decision tree ensembles. + +@sa @ref ml_intro_trees +*/ +class CV_EXPORTS_W DTrees : public StatModel +{ +public: + /** Predict options */ + enum Flags { PREDICT_AUTO=0, PREDICT_SUM=(1<<8), PREDICT_MAX_VOTE=(2<<8), PREDICT_MASK=(3<<8) }; + + /** Cluster possible values of a categorical variable into K\<=maxCategories clusters to + find a suboptimal split. + If a discrete variable, on which the training procedure tries to make a split, takes more than + maxCategories values, the precise best subset estimation may take a very long time because the + algorithm is exponential. Instead, many decision trees engines (including our implementation) + try to find sub-optimal split in this case by clustering all the samples into maxCategories + clusters that is some categories are merged together. The clustering is applied only in n \> + 2-class classification problems for categorical variables with N \> max_categories possible + values. In case of regression and 2-class classification the optimal split can be found + efficiently without employing clustering, thus the parameter is not used in these cases. + Default value is 10.*/ + /** @see setMaxCategories */ + CV_WRAP virtual int getMaxCategories() const = 0; + /** @copybrief getMaxCategories @see getMaxCategories */ + CV_WRAP virtual void setMaxCategories(int val) = 0; + + /** The maximum possible depth of the tree. + That is the training algorithms attempts to split a node while its depth is less than maxDepth. + The root node has zero depth. The actual depth may be smaller if the other termination criteria + are met (see the outline of the training procedure @ref ml_intro_trees "here"), and/or if the + tree is pruned. Default value is INT_MAX.*/ + /** @see setMaxDepth */ + CV_WRAP virtual int getMaxDepth() const = 0; + /** @copybrief getMaxDepth @see getMaxDepth */ + CV_WRAP virtual void setMaxDepth(int val) = 0; + + /** If the number of samples in a node is less than this parameter then the node will not be split. + + Default value is 10.*/ + /** @see setMinSampleCount */ + CV_WRAP virtual int getMinSampleCount() const = 0; + /** @copybrief getMinSampleCount @see getMinSampleCount */ + CV_WRAP virtual void setMinSampleCount(int val) = 0; + + /** If CVFolds \> 1 then algorithms prunes the built decision tree using K-fold + cross-validation procedure where K is equal to CVFolds. + Default value is 10.*/ + /** @see setCVFolds */ + CV_WRAP virtual int getCVFolds() const = 0; + /** @copybrief getCVFolds @see getCVFolds */ + CV_WRAP virtual void setCVFolds(int val) = 0; + + /** If true then surrogate splits will be built. + These splits allow to work with missing data and compute variable importance correctly. + Default value is false. + @note currently it's not implemented.*/ + /** @see setUseSurrogates */ + CV_WRAP virtual bool getUseSurrogates() const = 0; + /** @copybrief getUseSurrogates @see getUseSurrogates */ + CV_WRAP virtual void setUseSurrogates(bool val) = 0; + + /** If true then a pruning will be harsher. + This will make a tree more compact and more resistant to the training data noise but a bit less + accurate. Default value is true.*/ + /** @see setUse1SERule */ + CV_WRAP virtual bool getUse1SERule() const = 0; + /** @copybrief getUse1SERule @see getUse1SERule */ + CV_WRAP virtual void setUse1SERule(bool val) = 0; + + /** If true then pruned branches are physically removed from the tree. + Otherwise they are retained and it is possible to get results from the original unpruned (or + pruned less aggressively) tree. Default value is true.*/ + /** @see setTruncatePrunedTree */ + CV_WRAP virtual bool getTruncatePrunedTree() const = 0; + /** @copybrief getTruncatePrunedTree @see getTruncatePrunedTree */ + CV_WRAP virtual void setTruncatePrunedTree(bool val) = 0; + + /** Termination criteria for regression trees. + If all absolute differences between an estimated value in a node and values of train samples + in this node are less than this parameter then the node will not be split further. Default + value is 0.01f*/ + /** @see setRegressionAccuracy */ + CV_WRAP virtual float getRegressionAccuracy() const = 0; + /** @copybrief getRegressionAccuracy @see getRegressionAccuracy */ + CV_WRAP virtual void setRegressionAccuracy(float val) = 0; + + /** @brief The array of a priori class probabilities, sorted by the class label value. + + The parameter can be used to tune the decision tree preferences toward a certain class. For + example, if you want to detect some rare anomaly occurrence, the training base will likely + contain much more normal cases than anomalies, so a very good classification performance + will be achieved just by considering every case as normal. To avoid this, the priors can be + specified, where the anomaly probability is artificially increased (up to 0.5 or even + greater), so the weight of the misclassified anomalies becomes much bigger, and the tree is + adjusted properly. + + You can also think about this parameter as weights of prediction categories which determine + relative weights that you give to misclassification. That is, if the weight of the first + category is 1 and the weight of the second category is 10, then each mistake in predicting + the second category is equivalent to making 10 mistakes in predicting the first category. + Default value is empty Mat.*/ + /** @see setPriors */ + CV_WRAP virtual cv::Mat getPriors() const = 0; + /** @copybrief getPriors @see getPriors */ + CV_WRAP virtual void setPriors(const cv::Mat &val) = 0; + + /** @brief The class represents a decision tree node. + */ + class CV_EXPORTS Node + { + public: + Node(); + double value; //!< Value at the node: a class label in case of classification or estimated + //!< function value in case of regression. + int classIdx; //!< Class index normalized to 0..class_count-1 range and assigned to the + //!< node. It is used internally in classification trees and tree ensembles. + int parent; //!< Index of the parent node + int left; //!< Index of the left child node + int right; //!< Index of right child node + int defaultDir; //!< Default direction where to go (-1: left or +1: right). It helps in the + //!< case of missing values. + int split; //!< Index of the first split + }; + + /** @brief The class represents split in a decision tree. + */ + class CV_EXPORTS Split + { + public: + Split(); + int varIdx; //!< Index of variable on which the split is created. + bool inversed; //!< If true, then the inverse split rule is used (i.e. left and right + //!< branches are exchanged in the rule expressions below). + float quality; //!< The split quality, a positive number. It is used to choose the best split. + int next; //!< Index of the next split in the list of splits for the node + float c; /**< The threshold value in case of split on an ordered variable. + The rule is: + @code{.none} + if var_value < c + then next_node <- left + else next_node <- right + @endcode */ + int subsetOfs; /**< Offset of the bitset used by the split on a categorical variable. + The rule is: + @code{.none} + if bitset[var_value] == 1 + then next_node <- left + else next_node <- right + @endcode */ + }; + + /** @brief Returns indices of root nodes + */ + virtual const std::vector& getRoots() const = 0; + /** @brief Returns all the nodes + + all the node indices are indices in the returned vector + */ + virtual const std::vector& getNodes() const = 0; + /** @brief Returns all the splits + + all the split indices are indices in the returned vector + */ + virtual const std::vector& getSplits() const = 0; + /** @brief Returns all the bitsets for categorical splits + + Split::subsetOfs is an offset in the returned vector + */ + virtual const std::vector& getSubsets() const = 0; + + /** @brief Creates the empty model + + The static method creates empty decision tree with the specified parameters. It should be then + trained using train method (see StatModel::train). Alternatively, you can load the model from + file using Algorithm::load\(filename). + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized DTrees from a file + * + * Use DTree::save to serialize and store an DTree to disk. + * Load the DTree from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized DTree + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + +/****************************************************************************************\ +* Random Trees Classifier * +\****************************************************************************************/ + +/** @brief The class implements the random forest predictor. + +@sa @ref ml_intro_rtrees + */ +class CV_EXPORTS_W RTrees : public DTrees +{ +public: + + /** If true then variable importance will be calculated and then it can be retrieved by RTrees::getVarImportance. + Default value is false.*/ + /** @see setCalculateVarImportance */ + CV_WRAP virtual bool getCalculateVarImportance() const = 0; + /** @copybrief getCalculateVarImportance @see getCalculateVarImportance */ + CV_WRAP virtual void setCalculateVarImportance(bool val) = 0; + + /** The size of the randomly selected subset of features at each tree node and that are used + to find the best split(s). + If you set it to 0 then the size will be set to the square root of the total number of + features. Default value is 0.*/ + /** @see setActiveVarCount */ + CV_WRAP virtual int getActiveVarCount() const = 0; + /** @copybrief getActiveVarCount @see getActiveVarCount */ + CV_WRAP virtual void setActiveVarCount(int val) = 0; + + /** The termination criteria that specifies when the training algorithm stops. + Either when the specified number of trees is trained and added to the ensemble or when + sufficient accuracy (measured as OOB error) is achieved. Typically the more trees you have the + better the accuracy. However, the improvement in accuracy generally diminishes and asymptotes + pass a certain number of trees. Also to keep in mind, the number of tree increases the + prediction time linearly. Default value is TermCriteria(TermCriteria::MAX_ITERS + + TermCriteria::EPS, 50, 0.1)*/ + /** @see setTermCriteria */ + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(const TermCriteria &val) = 0; + + /** Returns the variable importance array. + The method returns the variable importance vector, computed at the training stage when + CalculateVarImportance is set to true. If this flag was set to false, the empty matrix is + returned. + */ + CV_WRAP virtual Mat getVarImportance() const = 0; + + /** Returns the result of each individual tree in the forest. + In case the model is a regression problem, the method will return each of the trees' + results for each of the sample cases. If the model is a classifier, it will return + a Mat with samples + 1 rows, where the first row gives the class number and the + following rows return the votes each class had for each sample. + @param samples Array containing the samples for which votes will be calculated. + @param results Array where the result of the calculation will be written. + @param flags Flags for defining the type of RTrees. + */ + CV_WRAP virtual void getVotes(InputArray samples, OutputArray results, int flags) const = 0; + + /** Returns the OOB error value, computed at the training stage when calcOOBError is set to true. + * If this flag was set to false, 0 is returned. The OOB error is also scaled by sample weighting. + */ +#if CV_VERSION_MAJOR == 4 + CV_WRAP virtual double getOOBError() const { return 0; } +#else + /*CV_WRAP*/ virtual double getOOBError() const = 0; +#endif + + /** Creates the empty model. + Use StatModel::train to train the model, StatModel::train to create and train the model, + Algorithm::load to load the pre-trained model. + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized RTree from a file + * + * Use RTree::save to serialize and store an RTree to disk. + * Load the RTree from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized RTree + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + +/****************************************************************************************\ +* Boosted tree classifier * +\****************************************************************************************/ + +/** @brief Boosted tree classifier derived from DTrees + +@sa @ref ml_intro_boost + */ +class CV_EXPORTS_W Boost : public DTrees +{ +public: + /** Type of the boosting algorithm. + See Boost::Types. Default value is Boost::REAL. */ + /** @see setBoostType */ + CV_WRAP virtual int getBoostType() const = 0; + /** @copybrief getBoostType @see getBoostType */ + CV_WRAP virtual void setBoostType(int val) = 0; + + /** The number of weak classifiers. + Default value is 100. */ + /** @see setWeakCount */ + CV_WRAP virtual int getWeakCount() const = 0; + /** @copybrief getWeakCount @see getWeakCount */ + CV_WRAP virtual void setWeakCount(int val) = 0; + + /** A threshold between 0 and 1 used to save computational time. + Samples with summary weight \f$\leq 1 - weight_trim_rate\f$ do not participate in the *next* + iteration of training. Set this parameter to 0 to turn off this functionality. Default value is 0.95.*/ + /** @see setWeightTrimRate */ + CV_WRAP virtual double getWeightTrimRate() const = 0; + /** @copybrief getWeightTrimRate @see getWeightTrimRate */ + CV_WRAP virtual void setWeightTrimRate(double val) = 0; + + /** Boosting type. + Gentle AdaBoost and Real AdaBoost are often the preferable choices. */ + enum Types { + DISCRETE=0, //!< Discrete AdaBoost. + REAL=1, //!< Real AdaBoost. It is a technique that utilizes confidence-rated predictions + //!< and works well with categorical data. + LOGIT=2, //!< LogitBoost. It can produce good regression fits. + GENTLE=3 //!< Gentle AdaBoost. It puts less weight on outlier data points and for that + //!(filename) to load the pre-trained model. */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized Boost from a file + * + * Use Boost::save to serialize and store an RTree to disk. + * Load the Boost from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized Boost + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + +/****************************************************************************************\ +* Gradient Boosted Trees * +\****************************************************************************************/ + +/*class CV_EXPORTS_W GBTrees : public DTrees +{ +public: + struct CV_EXPORTS_W_MAP Params : public DTrees::Params + { + CV_PROP_RW int weakCount; + CV_PROP_RW int lossFunctionType; + CV_PROP_RW float subsamplePortion; + CV_PROP_RW float shrinkage; + + Params(); + Params( int lossFunctionType, int weakCount, float shrinkage, + float subsamplePortion, int maxDepth, bool useSurrogates ); + }; + + enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS}; + + virtual void setK(int k) = 0; + + virtual float predictSerial( InputArray samples, + OutputArray weakResponses, int flags) const = 0; + + static Ptr create(const Params& p); +};*/ + +/****************************************************************************************\ +* Artificial Neural Networks (ANN) * +\****************************************************************************************/ + +/////////////////////////////////// Multi-Layer Perceptrons ////////////////////////////// + +/** @brief Artificial Neural Networks - Multi-Layer Perceptrons. + +Unlike many other models in ML that are constructed and trained at once, in the MLP model these +steps are separated. First, a network with the specified topology is created using the non-default +constructor or the method ANN_MLP::create. All the weights are set to zeros. Then, the network is +trained using a set of input and output vectors. The training procedure can be repeated more than +once, that is, the weights can be adjusted based on the new training data. + +Additional flags for StatModel::train are available: ANN_MLP::TrainFlags. + +@sa @ref ml_intro_ann + */ +class CV_EXPORTS_W ANN_MLP : public StatModel +{ +public: + /** Available training methods */ + enum TrainingMethods { + BACKPROP=0, //!< The back-propagation algorithm. + RPROP = 1, //!< The RPROP algorithm. See @cite RPROP93 for details. + ANNEAL = 2 //!< The simulated annealing algorithm. See @cite Kirkpatrick83 for details. + }; + + /** Sets training method and common parameters. + @param method Default value is ANN_MLP::RPROP. See ANN_MLP::TrainingMethods. + @param param1 passed to setRpropDW0 for ANN_MLP::RPROP and to setBackpropWeightScale for ANN_MLP::BACKPROP and to initialT for ANN_MLP::ANNEAL. + @param param2 passed to setRpropDWMin for ANN_MLP::RPROP and to setBackpropMomentumScale for ANN_MLP::BACKPROP and to finalT for ANN_MLP::ANNEAL. + */ + CV_WRAP virtual void setTrainMethod(int method, double param1 = 0, double param2 = 0) = 0; + + /** Returns current training method */ + CV_WRAP virtual int getTrainMethod() const = 0; + + /** Initialize the activation function for each neuron. + Currently the default and the only fully supported activation function is ANN_MLP::SIGMOID_SYM. + @param type The type of activation function. See ANN_MLP::ActivationFunctions. + @param param1 The first parameter of the activation function, \f$\alpha\f$. Default value is 0. + @param param2 The second parameter of the activation function, \f$\beta\f$. Default value is 0. + */ + CV_WRAP virtual void setActivationFunction(int type, double param1 = 0, double param2 = 0) = 0; + + /** Integer vector specifying the number of neurons in each layer including the input and output layers. + The very first element specifies the number of elements in the input layer. + The last element - number of elements in the output layer. Default value is empty Mat. + @sa getLayerSizes */ + CV_WRAP virtual void setLayerSizes(InputArray _layer_sizes) = 0; + + /** Integer vector specifying the number of neurons in each layer including the input and output layers. + The very first element specifies the number of elements in the input layer. + The last element - number of elements in the output layer. + @sa setLayerSizes */ + CV_WRAP virtual cv::Mat getLayerSizes() const = 0; + + /** Termination criteria of the training algorithm. + You can specify the maximum number of iterations (maxCount) and/or how much the error could + change between the iterations to make the algorithm continue (epsilon). Default value is + TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, 0.01).*/ + /** @see setTermCriteria */ + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0; + + /** BPROP: Strength of the weight gradient term. + The recommended value is about 0.1. Default value is 0.1.*/ + /** @see setBackpropWeightScale */ + CV_WRAP virtual double getBackpropWeightScale() const = 0; + /** @copybrief getBackpropWeightScale @see getBackpropWeightScale */ + CV_WRAP virtual void setBackpropWeightScale(double val) = 0; + + /** BPROP: Strength of the momentum term (the difference between weights on the 2 previous iterations). + This parameter provides some inertia to smooth the random fluctuations of the weights. It can + vary from 0 (the feature is disabled) to 1 and beyond. The value 0.1 or so is good enough. + Default value is 0.1.*/ + /** @see setBackpropMomentumScale */ + CV_WRAP virtual double getBackpropMomentumScale() const = 0; + /** @copybrief getBackpropMomentumScale @see getBackpropMomentumScale */ + CV_WRAP virtual void setBackpropMomentumScale(double val) = 0; + + /** RPROP: Initial value \f$\Delta_0\f$ of update-values \f$\Delta_{ij}\f$. + Default value is 0.1.*/ + /** @see setRpropDW0 */ + CV_WRAP virtual double getRpropDW0() const = 0; + /** @copybrief getRpropDW0 @see getRpropDW0 */ + CV_WRAP virtual void setRpropDW0(double val) = 0; + + /** RPROP: Increase factor \f$\eta^+\f$. + It must be \>1. Default value is 1.2.*/ + /** @see setRpropDWPlus */ + CV_WRAP virtual double getRpropDWPlus() const = 0; + /** @copybrief getRpropDWPlus @see getRpropDWPlus */ + CV_WRAP virtual void setRpropDWPlus(double val) = 0; + + /** RPROP: Decrease factor \f$\eta^-\f$. + It must be \<1. Default value is 0.5.*/ + /** @see setRpropDWMinus */ + CV_WRAP virtual double getRpropDWMinus() const = 0; + /** @copybrief getRpropDWMinus @see getRpropDWMinus */ + CV_WRAP virtual void setRpropDWMinus(double val) = 0; + + /** RPROP: Update-values lower limit \f$\Delta_{min}\f$. + It must be positive. Default value is FLT_EPSILON.*/ + /** @see setRpropDWMin */ + CV_WRAP virtual double getRpropDWMin() const = 0; + /** @copybrief getRpropDWMin @see getRpropDWMin */ + CV_WRAP virtual void setRpropDWMin(double val) = 0; + + /** RPROP: Update-values upper limit \f$\Delta_{max}\f$. + It must be \>1. Default value is 50.*/ + /** @see setRpropDWMax */ + CV_WRAP virtual double getRpropDWMax() const = 0; + /** @copybrief getRpropDWMax @see getRpropDWMax */ + CV_WRAP virtual void setRpropDWMax(double val) = 0; + + /** ANNEAL: Update initial temperature. + It must be \>=0. Default value is 10.*/ + /** @see setAnnealInitialT */ + CV_WRAP virtual double getAnnealInitialT() const = 0; + /** @copybrief getAnnealInitialT @see getAnnealInitialT */ + CV_WRAP virtual void setAnnealInitialT(double val) = 0; + + /** ANNEAL: Update final temperature. + It must be \>=0 and less than initialT. Default value is 0.1.*/ + /** @see setAnnealFinalT */ + CV_WRAP virtual double getAnnealFinalT() const = 0; + /** @copybrief getAnnealFinalT @see getAnnealFinalT */ + CV_WRAP virtual void setAnnealFinalT(double val) = 0; + + /** ANNEAL: Update cooling ratio. + It must be \>0 and less than 1. Default value is 0.95.*/ + /** @see setAnnealCoolingRatio */ + CV_WRAP virtual double getAnnealCoolingRatio() const = 0; + /** @copybrief getAnnealCoolingRatio @see getAnnealCoolingRatio */ + CV_WRAP virtual void setAnnealCoolingRatio(double val) = 0; + + /** ANNEAL: Update iteration per step. + It must be \>0 . Default value is 10.*/ + /** @see setAnnealItePerStep */ + CV_WRAP virtual int getAnnealItePerStep() const = 0; + /** @copybrief getAnnealItePerStep @see getAnnealItePerStep */ + CV_WRAP virtual void setAnnealItePerStep(int val) = 0; + + /** @brief Set/initialize anneal RNG */ + virtual void setAnnealEnergyRNG(const RNG& rng) = 0; + + /** possible activation functions */ + enum ActivationFunctions { + /** Identity function: \f$f(x)=x\f$ */ + IDENTITY = 0, + /** Symmetrical sigmoid: \f$f(x)=\beta*(1-e^{-\alpha x})/(1+e^{-\alpha x})\f$ + @note + If you are using the default sigmoid activation function with the default parameter values + fparam1=0 and fparam2=0 then the function used is y = 1.7159\*tanh(2/3 \* x), so the output + will range from [-1.7159, 1.7159], instead of [0,1].*/ + SIGMOID_SYM = 1, + /** Gaussian function: \f$f(x)=\beta e^{-\alpha x*x}\f$ */ + GAUSSIAN = 2, + /** ReLU function: \f$f(x)=max(0,x)\f$ */ + RELU = 3, + /** Leaky ReLU function: for x>0 \f$f(x)=x \f$ and x<=0 \f$f(x)=\alpha x \f$*/ + LEAKYRELU= 4 + }; + + /** Train options */ + enum TrainFlags { + /** Update the network weights, rather than compute them from scratch. In the latter case + the weights are initialized using the Nguyen-Widrow algorithm. */ + UPDATE_WEIGHTS = 1, + /** Do not normalize the input vectors. If this flag is not set, the training algorithm + normalizes each input feature independently, shifting its mean value to 0 and making the + standard deviation equal to 1. If the network is assumed to be updated frequently, the new + training data could be much different from original one. In this case, you should take care + of proper normalization. */ + NO_INPUT_SCALE = 2, + /** Do not normalize the output vectors. If the flag is not set, the training algorithm + normalizes each output feature independently, by transforming it to the certain range + depending on the used activation function. */ + NO_OUTPUT_SCALE = 4 + }; + + CV_WRAP virtual Mat getWeights(int layerIdx) const = 0; + + /** @brief Creates empty model + + Use StatModel::train to train the model, Algorithm::load\(filename) to load the pre-trained model. + Note that the train method has optional flags: ANN_MLP::TrainFlags. + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized ANN from a file + * + * Use ANN::save to serialize and store an ANN to disk. + * Load the ANN from this file again, by calling this function with the path to the file. + * + * @param filepath path to serialized ANN + */ + CV_WRAP static Ptr load(const String& filepath); + +}; + +#ifndef DISABLE_OPENCV_3_COMPATIBILITY +typedef ANN_MLP ANN_MLP_ANNEAL; +#endif + +/****************************************************************************************\ +* Logistic Regression * +\****************************************************************************************/ + +/** @brief Implements Logistic Regression classifier. + +@sa @ref ml_intro_lr + */ +class CV_EXPORTS_W LogisticRegression : public StatModel +{ +public: + + /** Learning rate. */ + /** @see setLearningRate */ + CV_WRAP virtual double getLearningRate() const = 0; + /** @copybrief getLearningRate @see getLearningRate */ + CV_WRAP virtual void setLearningRate(double val) = 0; + + /** Number of iterations. */ + /** @see setIterations */ + CV_WRAP virtual int getIterations() const = 0; + /** @copybrief getIterations @see getIterations */ + CV_WRAP virtual void setIterations(int val) = 0; + + /** Kind of regularization to be applied. See LogisticRegression::RegKinds. */ + /** @see setRegularization */ + CV_WRAP virtual int getRegularization() const = 0; + /** @copybrief getRegularization @see getRegularization */ + CV_WRAP virtual void setRegularization(int val) = 0; + + /** Kind of training method used. See LogisticRegression::Methods. */ + /** @see setTrainMethod */ + CV_WRAP virtual int getTrainMethod() const = 0; + /** @copybrief getTrainMethod @see getTrainMethod */ + CV_WRAP virtual void setTrainMethod(int val) = 0; + + /** Specifies the number of training samples taken in each step of Mini-Batch Gradient + Descent. Will only be used if using LogisticRegression::MINI_BATCH training algorithm. It + has to take values less than the total number of training samples. */ + /** @see setMiniBatchSize */ + CV_WRAP virtual int getMiniBatchSize() const = 0; + /** @copybrief getMiniBatchSize @see getMiniBatchSize */ + CV_WRAP virtual void setMiniBatchSize(int val) = 0; + + /** Termination criteria of the algorithm. */ + /** @see setTermCriteria */ + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(TermCriteria val) = 0; + + //! Regularization kinds + enum RegKinds { + REG_DISABLE = -1, //!< Regularization disabled + REG_L1 = 0, //!< %L1 norm + REG_L2 = 1 //!< %L2 norm + }; + + //! Training methods + enum Methods { + BATCH = 0, + MINI_BATCH = 1 //!< Set MiniBatchSize to a positive integer when using this method. + }; + + /** @brief Predicts responses for input samples and returns a float type. + + @param samples The input data for the prediction algorithm. Matrix [m x n], where each row + contains variables (features) of one object being classified. Should have data type CV_32F. + @param results Predicted labels as a column matrix of type CV_32S. + @param flags Not used. + */ + CV_WRAP virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const CV_OVERRIDE = 0; + + /** @brief This function returns the trained parameters arranged across rows. + + For a two class classification problem, it returns a row matrix. It returns learnt parameters of + the Logistic Regression as a matrix of type CV_32F. + */ + CV_WRAP virtual Mat get_learnt_thetas() const = 0; + + /** @brief Creates empty model. + + Creates Logistic Regression model with parameters given. + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized LogisticRegression from a file + * + * Use LogisticRegression::save to serialize and store an LogisticRegression to disk. + * Load the LogisticRegression from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized LogisticRegression + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); +}; + + +/****************************************************************************************\ +* Stochastic Gradient Descent SVM Classifier * +\****************************************************************************************/ + +/*! +@brief Stochastic Gradient Descent SVM classifier + +SVMSGD provides a fast and easy-to-use implementation of the SVM classifier using the Stochastic Gradient Descent approach, +as presented in @cite bottou2010large. + +The classifier has following parameters: +- model type, +- margin type, +- margin regularization (\f$\lambda\f$), +- initial step size (\f$\gamma_0\f$), +- step decreasing power (\f$c\f$), +- and termination criteria. + +The model type may have one of the following values: \ref SGD and \ref ASGD. + +- \ref SGD is the classic version of SVMSGD classifier: every next step is calculated by the formula + \f[w_{t+1} = w_t - \gamma(t) \frac{dQ_i}{dw} |_{w = w_t}\f] + where + - \f$w_t\f$ is the weights vector for decision function at step \f$t\f$, + - \f$\gamma(t)\f$ is the step size of model parameters at the iteration \f$t\f$, it is decreased on each step by the formula + \f$\gamma(t) = \gamma_0 (1 + \lambda \gamma_0 t) ^ {-c}\f$ + - \f$Q_i\f$ is the target functional from SVM task for sample with number \f$i\f$, this sample is chosen stochastically on each step of the algorithm. + +- \ref ASGD is Average Stochastic Gradient Descent SVM Classifier. ASGD classifier averages weights vector on each step of algorithm by the formula +\f$\widehat{w}_{t+1} = \frac{t}{1+t}\widehat{w}_{t} + \frac{1}{1+t}w_{t+1}\f$ + +The recommended model type is ASGD (following @cite bottou2010large). + +The margin type may have one of the following values: \ref SOFT_MARGIN or \ref HARD_MARGIN. + +- You should use \ref HARD_MARGIN type, if you have linearly separable sets. +- You should use \ref SOFT_MARGIN type, if you have non-linearly separable sets or sets with outliers. +- In the general case (if you know nothing about linear separability of your sets), use SOFT_MARGIN. + +The other parameters may be described as follows: +- Margin regularization parameter is responsible for weights decreasing at each step and for the strength of restrictions on outliers + (the less the parameter, the less probability that an outlier will be ignored). + Recommended value for SGD model is 0.0001, for ASGD model is 0.00001. + +- Initial step size parameter is the initial value for the step size \f$\gamma(t)\f$. + You will have to find the best initial step for your problem. + +- Step decreasing power is the power parameter for \f$\gamma(t)\f$ decreasing by the formula, mentioned above. + Recommended value for SGD model is 1, for ASGD model is 0.75. + +- Termination criteria can be TermCriteria::COUNT, TermCriteria::EPS or TermCriteria::COUNT + TermCriteria::EPS. + You will have to find the best termination criteria for your problem. + +Note that the parameters margin regularization, initial step size, and step decreasing power should be positive. + +To use SVMSGD algorithm do as follows: + +- first, create the SVMSGD object. The algorithm will set optimal parameters by default, but you can set your own parameters via functions setSvmsgdType(), + setMarginType(), setMarginRegularization(), setInitialStepSize(), and setStepDecreasingPower(). + +- then the SVM model can be trained using the train features and the correspondent labels by the method train(). + +- after that, the label of a new feature vector can be predicted using the method predict(). + +@code +// Create empty object +cv::Ptr svmsgd = SVMSGD::create(); + +// Train the Stochastic Gradient Descent SVM +svmsgd->train(trainData); + +// Predict labels for the new samples +svmsgd->predict(samples, responses); +@endcode + +*/ + +class CV_EXPORTS_W SVMSGD : public cv::ml::StatModel +{ +public: + + /** SVMSGD type. + ASGD is often the preferable choice. */ + enum SvmsgdType + { + SGD, //!< Stochastic Gradient Descent + ASGD //!< Average Stochastic Gradient Descent + }; + + /** Margin type.*/ + enum MarginType + { + SOFT_MARGIN, //!< General case, suits to the case of non-linearly separable sets, allows outliers. + HARD_MARGIN //!< More accurate for the case of linearly separable sets. + }; + + /** + * @return the weights of the trained model (decision function f(x) = weights * x + shift). + */ + CV_WRAP virtual Mat getWeights() = 0; + + /** + * @return the shift of the trained model (decision function f(x) = weights * x + shift). + */ + CV_WRAP virtual float getShift() = 0; + + /** @brief Creates empty model. + * Use StatModel::train to train the model. Since %SVMSGD has several parameters, you may want to + * find the best parameters for your problem or use setOptimalParameters() to set some default parameters. + */ + CV_WRAP static Ptr create(); + + /** @brief Loads and creates a serialized SVMSGD from a file + * + * Use SVMSGD::save to serialize and store an SVMSGD to disk. + * Load the SVMSGD from this file again, by calling this function with the path to the file. + * Optionally specify the node for the file containing the classifier + * + * @param filepath path to serialized SVMSGD + * @param nodeName name of node containing the classifier + */ + CV_WRAP static Ptr load(const String& filepath , const String& nodeName = String()); + + /** @brief Function sets optimal parameters values for chosen SVM SGD model. + * @param svmsgdType is the type of SVMSGD classifier. + * @param marginType is the type of margin constraint. + */ + CV_WRAP virtual void setOptimalParameters(int svmsgdType = SVMSGD::ASGD, int marginType = SVMSGD::SOFT_MARGIN) = 0; + + /** @brief %Algorithm type, one of SVMSGD::SvmsgdType. */ + /** @see setSvmsgdType */ + CV_WRAP virtual int getSvmsgdType() const = 0; + /** @copybrief getSvmsgdType @see getSvmsgdType */ + CV_WRAP virtual void setSvmsgdType(int svmsgdType) = 0; + + /** @brief %Margin type, one of SVMSGD::MarginType. */ + /** @see setMarginType */ + CV_WRAP virtual int getMarginType() const = 0; + /** @copybrief getMarginType @see getMarginType */ + CV_WRAP virtual void setMarginType(int marginType) = 0; + + /** @brief Parameter marginRegularization of a %SVMSGD optimization problem. */ + /** @see setMarginRegularization */ + CV_WRAP virtual float getMarginRegularization() const = 0; + /** @copybrief getMarginRegularization @see getMarginRegularization */ + CV_WRAP virtual void setMarginRegularization(float marginRegularization) = 0; + + /** @brief Parameter initialStepSize of a %SVMSGD optimization problem. */ + /** @see setInitialStepSize */ + CV_WRAP virtual float getInitialStepSize() const = 0; + /** @copybrief getInitialStepSize @see getInitialStepSize */ + CV_WRAP virtual void setInitialStepSize(float InitialStepSize) = 0; + + /** @brief Parameter stepDecreasingPower of a %SVMSGD optimization problem. */ + /** @see setStepDecreasingPower */ + CV_WRAP virtual float getStepDecreasingPower() const = 0; + /** @copybrief getStepDecreasingPower @see getStepDecreasingPower */ + CV_WRAP virtual void setStepDecreasingPower(float stepDecreasingPower) = 0; + + /** @brief Termination criteria of the training algorithm. + You can specify the maximum number of iterations (maxCount) and/or how much the error could + change between the iterations to make the algorithm continue (epsilon).*/ + /** @see setTermCriteria */ + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + /** @copybrief getTermCriteria @see getTermCriteria */ + CV_WRAP virtual void setTermCriteria(const cv::TermCriteria &val) = 0; +}; + + +/****************************************************************************************\ +* Auxiliary functions declarations * +\****************************************************************************************/ + +/** @brief Generates _sample_ from multivariate normal distribution + +@param mean an average row vector +@param cov symmetric covariation matrix +@param nsamples returned samples count +@param samples returned samples array +*/ +CV_EXPORTS void randMVNormal( InputArray mean, InputArray cov, int nsamples, OutputArray samples); + +/** @brief Creates test set */ +CV_EXPORTS void createConcentricSpheresTestSet( int nsamples, int nfeatures, int nclasses, + OutputArray samples, OutputArray responses); + + +/****************************************************************************************\ +* Simulated annealing solver * +\****************************************************************************************/ + +#ifdef CV_DOXYGEN +/** @brief This class declares example interface for system state used in simulated annealing optimization algorithm. + +@note This class is not defined in C++ code and can't be use directly - you need your own implementation with the same methods. +*/ +struct SimulatedAnnealingSolverSystem +{ + /** Give energy value for a state of system.*/ + double energy() const; + /** Function which change the state of system (random perturbation).*/ + void changeState(); + /** Function to reverse to the previous state. Can be called once only after changeState(). */ + void reverseState(); +}; +#endif // CV_DOXYGEN + +/** @brief The class implements simulated annealing for optimization. + +@cite Kirkpatrick83 for details + +@param solverSystem optimization system (see SimulatedAnnealingSolverSystem) +@param initialTemperature initial temperature +@param finalTemperature final temperature +@param coolingRatio temperature step multiplies +@param iterationsPerStep number of iterations per temperature changing step +@param lastTemperature optional output for last used temperature +@param rngEnergy specify custom random numbers generator (cv::theRNG() by default) +*/ +template +int simulatedAnnealingSolver(SimulatedAnnealingSolverSystem& solverSystem, + double initialTemperature, double finalTemperature, double coolingRatio, + size_t iterationsPerStep, + CV_OUT double* lastTemperature = NULL, + cv::RNG& rngEnergy = cv::theRNG() +); + +//! @} ml + +} +} + +#include + +#endif // __cplusplus +#endif // OPENCV_ML_HPP + +/* End of file. */ diff --git a/Thirdparty/opencv2/include/opencv2/ml/ml.hpp b/Thirdparty/opencv2/include/opencv2/ml/ml.hpp new file mode 100644 index 0000000..f6f9cd8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/ml/ml.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/ml.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/ml/ml.inl.hpp b/Thirdparty/opencv2/include/opencv2/ml/ml.inl.hpp new file mode 100644 index 0000000..dc9c783 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/ml/ml.inl.hpp @@ -0,0 +1,60 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_ML_INL_HPP +#define OPENCV_ML_INL_HPP + +namespace cv { namespace ml { + +// declared in ml.hpp +template +int simulatedAnnealingSolver(SimulatedAnnealingSolverSystem& solverSystem, + double initialTemperature, double finalTemperature, double coolingRatio, + size_t iterationsPerStep, + CV_OUT double* lastTemperature, + cv::RNG& rngEnergy +) +{ + CV_Assert(finalTemperature > 0); + CV_Assert(initialTemperature > finalTemperature); + CV_Assert(iterationsPerStep > 0); + CV_Assert(coolingRatio < 1.0f); + double Ti = initialTemperature; + double previousEnergy = solverSystem.energy(); + int exchange = 0; + while (Ti > finalTemperature) + { + for (size_t i = 0; i < iterationsPerStep; i++) + { + solverSystem.changeState(); + double newEnergy = solverSystem.energy(); + if (newEnergy < previousEnergy) + { + previousEnergy = newEnergy; + exchange++; + } + else + { + double r = rngEnergy.uniform(0.0, 1.0); + if (r < std::exp(-(newEnergy - previousEnergy) / Ti)) + { + previousEnergy = newEnergy; + exchange++; + } + else + { + solverSystem.reverseState(); + } + } + } + Ti *= coolingRatio; + } + if (lastTemperature) + *lastTemperature = Ti; + return exchange; +} + +}} //namespace + +#endif // OPENCV_ML_INL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/objdetect.hpp b/Thirdparty/opencv2/include/opencv2/objdetect.hpp new file mode 100644 index 0000000..ae8c2bf --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect.hpp @@ -0,0 +1,871 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_OBJDETECT_HPP +#define OPENCV_OBJDETECT_HPP + +#include "opencv2/core.hpp" +#include "opencv2/objdetect/aruco_detector.hpp" +#include "opencv2/objdetect/graphical_code_detector.hpp" + +/** +@defgroup objdetect Object Detection + +@{ + @defgroup objdetect_cascade_classifier Cascade Classifier for Object Detection + +The object detector described below has been initially proposed by Paul Viola @cite Viola01 and +improved by Rainer Lienhart @cite Lienhart02 . + +First, a classifier (namely a *cascade of boosted classifiers working with haar-like features*) is +trained with a few hundred sample views of a particular object (i.e., a face or a car), called +positive examples, that are scaled to the same size (say, 20x20), and negative examples - arbitrary +images of the same size. + +After a classifier is trained, it can be applied to a region of interest (of the same size as used +during the training) in an input image. The classifier outputs a "1" if the region is likely to show +the object (i.e., face/car), and "0" otherwise. To search for the object in the whole image one can +move the search window across the image and check every location using the classifier. The +classifier is designed so that it can be easily "resized" in order to be able to find the objects of +interest at different sizes, which is more efficient than resizing the image itself. So, to find an +object of an unknown size in the image the scan procedure should be done several times at different +scales. + +The word "cascade" in the classifier name means that the resultant classifier consists of several +simpler classifiers (*stages*) that are applied subsequently to a region of interest until at some +stage the candidate is rejected or all the stages are passed. The word "boosted" means that the +classifiers at every stage of the cascade are complex themselves and they are built out of basic +classifiers using one of four different boosting techniques (weighted voting). Currently Discrete +Adaboost, Real Adaboost, Gentle Adaboost and Logitboost are supported. The basic classifiers are +decision-tree classifiers with at least 2 leaves. Haar-like features are the input to the basic +classifiers, and are calculated as described below. The current algorithm uses the following +Haar-like features: + +![image](pics/haarfeatures.png) + +The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within +the region of interest and the scale (this scale is not the same as the scale used at the detection +stage, though these two scales are multiplied). For example, in the case of the third line feature +(2c) the response is calculated as the difference between the sum of image pixels under the +rectangle covering the whole feature (including the two white stripes and the black stripe in the +middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to +compensate for the differences in the size of areas. The sums of pixel values over a rectangular +regions are calculated rapidly using integral images (see below and the integral description). + +Check @ref tutorial_cascade_classifier "the corresponding tutorial" for more details. + +The following reference is for the detection part only. There is a separate application called +opencv_traincascade that can train a cascade of boosted classifiers from a set of samples. + +@note In the new C++ interface it is also possible to use LBP (local binary pattern) features in +addition to Haar-like features. .. [Viola01] Paul Viola and Michael J. Jones. Rapid Object Detection +using a Boosted Cascade of Simple Features. IEEE CVPR, 2001. The paper is available online at + + + @defgroup objdetect_hog HOG (Histogram of Oriented Gradients) descriptor and object detector + @defgroup objdetect_barcode Barcode detection and decoding + @defgroup objdetect_qrcode QRCode detection and encoding + @defgroup objdetect_dnn_face DNN-based face detection and recognition +Check @ref tutorial_dnn_face "the corresponding tutorial" for more details. + @defgroup objdetect_common Common functions and classes + @defgroup objdetect_aruco ArUco markers and boards detection for robust camera pose estimation + @{ + ArUco Marker Detection + Square fiducial markers (also known as Augmented Reality Markers) are useful for easy, + fast and robust camera pose estimation. + + The main functionality of ArucoDetector class is detection of markers in an image. If the markers are grouped + as a board, then you can try to recover the missing markers with ArucoDetector::refineDetectedMarkers(). + ArUco markers can also be used for advanced chessboard corner finding. To do this, group the markers in the + CharucoBoard and find the corners of the chessboard with the CharucoDetector::detectBoard(). + + The implementation is based on the ArUco Library by R. Muñoz-Salinas and S. Garrido-Jurado @cite Aruco2014. + + Markers can also be detected based on the AprilTag 2 @cite wang2016iros fiducial detection method. + + @sa @cite Aruco2014 + This code has been originally developed by Sergio Garrido-Jurado as a project + for Google Summer of Code 2015 (GSoC 15). + @} + +@} + */ + +typedef struct CvHaarClassifierCascade CvHaarClassifierCascade; + +namespace cv +{ + +//! @addtogroup objdetect_common +//! @{ + +///////////////////////////// Object Detection //////////////////////////// + +/** @brief This class is used for grouping object candidates detected by Cascade Classifier, HOG etc. + +instance of the class is to be passed to cv::partition + */ +class CV_EXPORTS SimilarRects +{ +public: + SimilarRects(double _eps) : eps(_eps) {} + inline bool operator()(const Rect& r1, const Rect& r2) const + { + double delta = eps * ((std::min)(r1.width, r2.width) + (std::min)(r1.height, r2.height)) * 0.5; + return std::abs(r1.x - r2.x) <= delta && + std::abs(r1.y - r2.y) <= delta && + std::abs(r1.x + r1.width - r2.x - r2.width) <= delta && + std::abs(r1.y + r1.height - r2.y - r2.height) <= delta; + } + double eps; +}; + +/** @brief Groups the object candidate rectangles. + +@param rectList Input/output vector of rectangles. Output vector includes retained and grouped +rectangles. (The Python list is not modified in place.) +@param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a +group of rectangles to retain it. +@param eps Relative difference between sides of the rectangles to merge them into a group. + +The function is a wrapper for the generic function partition . It clusters all the input rectangles +using the rectangle equivalence criteria that combines rectangles with similar sizes and similar +locations. The similarity is defined by eps. When eps=0 , no clustering is done at all. If +\f$\texttt{eps}\rightarrow +\inf\f$ , all the rectangles are put in one cluster. Then, the small +clusters containing less than or equal to groupThreshold rectangles are rejected. In each other +cluster, the average rectangle is computed and put into the output rectangle list. + */ +CV_EXPORTS void groupRectangles(std::vector& rectList, int groupThreshold, double eps = 0.2); +/** @overload */ +CV_EXPORTS_W void groupRectangles(CV_IN_OUT std::vector& rectList, CV_OUT std::vector& weights, + int groupThreshold, double eps = 0.2); +/** @overload */ +CV_EXPORTS void groupRectangles(std::vector& rectList, int groupThreshold, + double eps, std::vector* weights, std::vector* levelWeights ); +/** @overload */ +CV_EXPORTS void groupRectangles(std::vector& rectList, std::vector& rejectLevels, + std::vector& levelWeights, int groupThreshold, double eps = 0.2); +/** @overload */ +CV_EXPORTS void groupRectangles_meanshift(std::vector& rectList, std::vector& foundWeights, + std::vector& foundScales, + double detectThreshold = 0.0, Size winDetSize = Size(64, 128)); +//! @} + +//! @addtogroup objdetect_cascade_classifier +//! @{ + +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvHaarClassifierCascade* obj) const; }; + +enum { CASCADE_DO_CANNY_PRUNING = 1, + CASCADE_SCALE_IMAGE = 2, + CASCADE_FIND_BIGGEST_OBJECT = 4, + CASCADE_DO_ROUGH_SEARCH = 8 + }; + +class CV_EXPORTS_W BaseCascadeClassifier : public Algorithm +{ +public: + virtual ~BaseCascadeClassifier(); + virtual bool empty() const CV_OVERRIDE = 0; + virtual bool load( const String& filename ) = 0; + virtual void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + double scaleFactor, + int minNeighbors, int flags, + Size minSize, Size maxSize ) = 0; + + virtual void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + CV_OUT std::vector& numDetections, + double scaleFactor, + int minNeighbors, int flags, + Size minSize, Size maxSize ) = 0; + + virtual void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + CV_OUT std::vector& rejectLevels, + CV_OUT std::vector& levelWeights, + double scaleFactor, + int minNeighbors, int flags, + Size minSize, Size maxSize, + bool outputRejectLevels ) = 0; + + virtual bool isOldFormatCascade() const = 0; + virtual Size getOriginalWindowSize() const = 0; + virtual int getFeatureType() const = 0; + virtual void* getOldCascade() = 0; + + class CV_EXPORTS MaskGenerator + { + public: + virtual ~MaskGenerator() {} + virtual Mat generateMask(const Mat& src)=0; + virtual void initializeMask(const Mat& /*src*/) { } + }; + virtual void setMaskGenerator(const Ptr& maskGenerator) = 0; + virtual Ptr getMaskGenerator() = 0; +}; + +/** @example samples/cpp/facedetect.cpp +This program demonstrates usage of the Cascade classifier class +\image html Cascade_Classifier_Tutorial_Result_Haar.jpg "Sample screenshot" width=321 height=254 +*/ +/** @brief Cascade classifier class for object detection. + */ +class CV_EXPORTS_W CascadeClassifier +{ +public: + CV_WRAP CascadeClassifier(); + /** @brief Loads a classifier from a file. + + @param filename Name of the file from which the classifier is loaded. + */ + CV_WRAP CascadeClassifier(const String& filename); + ~CascadeClassifier(); + /** @brief Checks whether the classifier has been loaded. + */ + CV_WRAP bool empty() const; + /** @brief Loads a classifier from a file. + + @param filename Name of the file from which the classifier is loaded. The file may contain an old + HAAR classifier trained by the haartraining application or a new cascade classifier trained by the + traincascade application. + */ + CV_WRAP bool load( const String& filename ); + /** @brief Reads a classifier from a FileStorage node. + + @note The file may contain a new cascade classifier (trained by the traincascade application) only. + */ + CV_WRAP bool read( const FileNode& node ); + + /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list + of rectangles. + + @param image Matrix of the type CV_8U containing an image where objects are detected. + @param objects Vector of rectangles where each rectangle contains the detected object, the + rectangles may be partially outside the original image. + @param scaleFactor Parameter specifying how much the image size is reduced at each image scale. + @param minNeighbors Parameter specifying how many neighbors each candidate rectangle should have + to retain it. + @param flags Parameter with the same meaning for an old cascade as in the function + cvHaarDetectObjects. It is not used for a new cascade. + @param minSize Minimum possible object size. Objects smaller than that are ignored. + @param maxSize Maximum possible object size. Objects larger than that are ignored. If `maxSize == minSize` model is evaluated on single scale. + */ + CV_WRAP void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + double scaleFactor = 1.1, + int minNeighbors = 3, int flags = 0, + Size minSize = Size(), + Size maxSize = Size() ); + + /** @overload + @param image Matrix of the type CV_8U containing an image where objects are detected. + @param objects Vector of rectangles where each rectangle contains the detected object, the + rectangles may be partially outside the original image. + @param numDetections Vector of detection numbers for the corresponding objects. An object's number + of detections is the number of neighboring positively classified rectangles that were joined + together to form the object. + @param scaleFactor Parameter specifying how much the image size is reduced at each image scale. + @param minNeighbors Parameter specifying how many neighbors each candidate rectangle should have + to retain it. + @param flags Parameter with the same meaning for an old cascade as in the function + cvHaarDetectObjects. It is not used for a new cascade. + @param minSize Minimum possible object size. Objects smaller than that are ignored. + @param maxSize Maximum possible object size. Objects larger than that are ignored. If `maxSize == minSize` model is evaluated on single scale. + */ + CV_WRAP_AS(detectMultiScale2) void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + CV_OUT std::vector& numDetections, + double scaleFactor=1.1, + int minNeighbors=3, int flags=0, + Size minSize=Size(), + Size maxSize=Size() ); + + /** @overload + This function allows you to retrieve the final stage decision certainty of classification. + For this, one needs to set `outputRejectLevels` on true and provide the `rejectLevels` and `levelWeights` parameter. + For each resulting detection, `levelWeights` will then contain the certainty of classification at the final stage. + This value can then be used to separate strong from weaker classifications. + + A code sample on how to use it efficiently can be found below: + @code + Mat img; + vector weights; + vector levels; + vector detections; + CascadeClassifier model("/path/to/your/model.xml"); + model.detectMultiScale(img, detections, levels, weights, 1.1, 3, 0, Size(), Size(), true); + cerr << "Detection " << detections[0] << " with weight " << weights[0] << endl; + @endcode + */ + CV_WRAP_AS(detectMultiScale3) void detectMultiScale( InputArray image, + CV_OUT std::vector& objects, + CV_OUT std::vector& rejectLevels, + CV_OUT std::vector& levelWeights, + double scaleFactor = 1.1, + int minNeighbors = 3, int flags = 0, + Size minSize = Size(), + Size maxSize = Size(), + bool outputRejectLevels = false ); + + CV_WRAP bool isOldFormatCascade() const; + CV_WRAP Size getOriginalWindowSize() const; + CV_WRAP int getFeatureType() const; + void* getOldCascade(); + + CV_WRAP static bool convert(const String& oldcascade, const String& newcascade); + + void setMaskGenerator(const Ptr& maskGenerator); + Ptr getMaskGenerator(); + + Ptr cc; +}; + +CV_EXPORTS Ptr createFaceDetectionMaskGenerator(); +//! @} + +//! @addtogroup objdetect_hog +//! @{ +//////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector ////////////// + +//! struct for detection region of interest (ROI) +struct DetectionROI +{ + //! scale(size) of the bounding box + double scale; + //! set of requested locations to be evaluated + std::vector locations; + //! vector that will contain confidence values for each location + std::vector confidences; +}; + +/**@brief Implementation of HOG (Histogram of Oriented Gradients) descriptor and object detector. + +the HOG descriptor algorithm introduced by Navneet Dalal and Bill Triggs @cite Dalal2005 . + +useful links: + +https://hal.inria.fr/inria-00548512/document/ + +https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients + +https://software.intel.com/en-us/ipp-dev-reference-histogram-of-oriented-gradients-hog-descriptor + +http://www.learnopencv.com/histogram-of-oriented-gradients + +http://www.learnopencv.com/handwritten-digits-classification-an-opencv-c-python-tutorial + + */ +struct CV_EXPORTS_W HOGDescriptor +{ +public: + enum HistogramNormType { L2Hys = 0 //!< Default histogramNormType + }; + enum { DEFAULT_NLEVELS = 64 //!< Default nlevels value. + }; + enum DescriptorStorageFormat { DESCR_FORMAT_COL_BY_COL, DESCR_FORMAT_ROW_BY_ROW }; + + /**@brief Creates the HOG descriptor and detector with default parameters. + + aqual to HOGDescriptor(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9 ) + */ + CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8), + cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1), + histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true), + free_coef(-1.f), nlevels(HOGDescriptor::DEFAULT_NLEVELS), signedGradient(false) + {} + + /** @overload + @param _winSize sets winSize with given value. + @param _blockSize sets blockSize with given value. + @param _blockStride sets blockStride with given value. + @param _cellSize sets cellSize with given value. + @param _nbins sets nbins with given value. + @param _derivAperture sets derivAperture with given value. + @param _winSigma sets winSigma with given value. + @param _histogramNormType sets histogramNormType with given value. + @param _L2HysThreshold sets L2HysThreshold with given value. + @param _gammaCorrection sets gammaCorrection with given value. + @param _nlevels sets nlevels with given value. + @param _signedGradient sets signedGradient with given value. + */ + CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride, + Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1, + HOGDescriptor::HistogramNormType _histogramNormType=HOGDescriptor::L2Hys, + double _L2HysThreshold=0.2, bool _gammaCorrection=false, + int _nlevels=HOGDescriptor::DEFAULT_NLEVELS, bool _signedGradient=false) + : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize), + nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma), + histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold), + gammaCorrection(_gammaCorrection), free_coef(-1.f), nlevels(_nlevels), signedGradient(_signedGradient) + {} + + /** @overload + + Creates the HOG descriptor and detector and loads HOGDescriptor parameters and coefficients for the linear SVM classifier from a file. + @param filename The file name containing HOGDescriptor properties and coefficients for the linear SVM classifier. + */ + CV_WRAP HOGDescriptor(const String& filename) + { + load(filename); + } + + /** @overload + @param d the HOGDescriptor which cloned to create a new one. + */ + HOGDescriptor(const HOGDescriptor& d) + { + d.copyTo(*this); + } + + /**@brief Default destructor. + */ + virtual ~HOGDescriptor() {} + + /**@brief Returns the number of coefficients required for the classification. + */ + CV_WRAP size_t getDescriptorSize() const; + + /** @brief Checks if detector size equal to descriptor size. + */ + CV_WRAP bool checkDetectorSize() const; + + /** @brief Returns winSigma value + */ + CV_WRAP double getWinSigma() const; + + /**@example samples/cpp/peopledetect.cpp + */ + /**@brief Sets coefficients for the linear SVM classifier. + @param svmdetector coefficients for the linear SVM classifier. + */ + CV_WRAP virtual void setSVMDetector(InputArray svmdetector); + + /** @brief Reads HOGDescriptor parameters and coefficients for the linear SVM classifier from a file node. + @param fn File node + */ + virtual bool read(FileNode& fn); + + /** @brief Stores HOGDescriptor parameters and coefficients for the linear SVM classifier in a file storage. + @param fs File storage + @param objname Object name + */ + virtual void write(FileStorage& fs, const String& objname) const; + + /** @brief loads HOGDescriptor parameters and coefficients for the linear SVM classifier from a file + @param filename Name of the file to read. + @param objname The optional name of the node to read (if empty, the first top-level node will be used). + */ + CV_WRAP virtual bool load(const String& filename, const String& objname = String()); + + /** @brief saves HOGDescriptor parameters and coefficients for the linear SVM classifier to a file + @param filename File name + @param objname Object name + */ + CV_WRAP virtual void save(const String& filename, const String& objname = String()) const; + + /** @brief clones the HOGDescriptor + @param c cloned HOGDescriptor + */ + virtual void copyTo(HOGDescriptor& c) const; + + /**@example samples/cpp/train_HOG.cpp + */ + /** @brief Computes HOG descriptors of given image. + @param img Matrix of the type CV_8U containing an image where HOG features will be calculated. + @param descriptors Matrix of the type CV_32F + @param winStride Window stride. It must be a multiple of block stride. + @param padding Padding + @param locations Vector of Point + */ + CV_WRAP virtual void compute(InputArray img, + CV_OUT std::vector& descriptors, + Size winStride = Size(), Size padding = Size(), + const std::vector& locations = std::vector()) const; + + /** @brief Performs object detection without a multi-scale window. + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param foundLocations Vector of point where each point contains left-top corner point of detected object boundaries. + @param weights Vector that will contain confidence values for each detected object. + @param hitThreshold Threshold for the distance between features and SVM classifying plane. + Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient). + But if the free coefficient is omitted (which is allowed), you can specify it manually here. + @param winStride Window stride. It must be a multiple of block stride. + @param padding Padding + @param searchLocations Vector of Point includes set of requested locations to be evaluated. + */ + CV_WRAP virtual void detect(InputArray img, CV_OUT std::vector& foundLocations, + CV_OUT std::vector& weights, + double hitThreshold = 0, Size winStride = Size(), + Size padding = Size(), + const std::vector& searchLocations = std::vector()) const; + + /** @brief Performs object detection without a multi-scale window. + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param foundLocations Vector of point where each point contains left-top corner point of detected object boundaries. + @param hitThreshold Threshold for the distance between features and SVM classifying plane. + Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient). + But if the free coefficient is omitted (which is allowed), you can specify it manually here. + @param winStride Window stride. It must be a multiple of block stride. + @param padding Padding + @param searchLocations Vector of Point includes locations to search. + */ + virtual void detect(InputArray img, CV_OUT std::vector& foundLocations, + double hitThreshold = 0, Size winStride = Size(), + Size padding = Size(), + const std::vector& searchLocations=std::vector()) const; + + /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list + of rectangles. + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param foundLocations Vector of rectangles where each rectangle contains the detected object. + @param foundWeights Vector that will contain confidence values for each detected object. + @param hitThreshold Threshold for the distance between features and SVM classifying plane. + Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient). + But if the free coefficient is omitted (which is allowed), you can specify it manually here. + @param winStride Window stride. It must be a multiple of block stride. + @param padding Padding + @param scale Coefficient of the detection window increase. + @param groupThreshold Coefficient to regulate the similarity threshold. When detected, some objects can be covered + by many rectangles. 0 means not to perform grouping. + @param useMeanshiftGrouping indicates grouping algorithm + */ + CV_WRAP virtual void detectMultiScale(InputArray img, CV_OUT std::vector& foundLocations, + CV_OUT std::vector& foundWeights, double hitThreshold = 0, + Size winStride = Size(), Size padding = Size(), double scale = 1.05, + double groupThreshold = 2.0, bool useMeanshiftGrouping = false) const; + + /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list + of rectangles. + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param foundLocations Vector of rectangles where each rectangle contains the detected object. + @param hitThreshold Threshold for the distance between features and SVM classifying plane. + Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient). + But if the free coefficient is omitted (which is allowed), you can specify it manually here. + @param winStride Window stride. It must be a multiple of block stride. + @param padding Padding + @param scale Coefficient of the detection window increase. + @param groupThreshold Coefficient to regulate the similarity threshold. When detected, some objects can be covered + by many rectangles. 0 means not to perform grouping. + @param useMeanshiftGrouping indicates grouping algorithm + */ + virtual void detectMultiScale(InputArray img, CV_OUT std::vector& foundLocations, + double hitThreshold = 0, Size winStride = Size(), + Size padding = Size(), double scale = 1.05, + double groupThreshold = 2.0, bool useMeanshiftGrouping = false) const; + + /** @brief Computes gradients and quantized gradient orientations. + @param img Matrix contains the image to be computed + @param grad Matrix of type CV_32FC2 contains computed gradients + @param angleOfs Matrix of type CV_8UC2 contains quantized gradient orientations + @param paddingTL Padding from top-left + @param paddingBR Padding from bottom-right + */ + CV_WRAP virtual void computeGradient(InputArray img, InputOutputArray grad, InputOutputArray angleOfs, + Size paddingTL = Size(), Size paddingBR = Size()) const; + + /** @brief Returns coefficients of the classifier trained for people detection (for 64x128 windows). + */ + CV_WRAP static std::vector getDefaultPeopleDetector(); + + /**@example samples/tapi/hog.cpp + */ + /** @brief Returns coefficients of the classifier trained for people detection (for 48x96 windows). + */ + CV_WRAP static std::vector getDaimlerPeopleDetector(); + + //! Detection window size. Align to block size and block stride. Default value is Size(64,128). + CV_PROP Size winSize; + + //! Block size in pixels. Align to cell size. Default value is Size(16,16). + CV_PROP Size blockSize; + + //! Block stride. It must be a multiple of cell size. Default value is Size(8,8). + CV_PROP Size blockStride; + + //! Cell size. Default value is Size(8,8). + CV_PROP Size cellSize; + + //! Number of bins used in the calculation of histogram of gradients. Default value is 9. + CV_PROP int nbins; + + //! not documented + CV_PROP int derivAperture; + + //! Gaussian smoothing window parameter. + CV_PROP double winSigma; + + //! histogramNormType + CV_PROP HOGDescriptor::HistogramNormType histogramNormType; + + //! L2-Hys normalization method shrinkage. + CV_PROP double L2HysThreshold; + + //! Flag to specify whether the gamma correction preprocessing is required or not. + CV_PROP bool gammaCorrection; + + //! coefficients for the linear SVM classifier. + CV_PROP std::vector svmDetector; + + //! coefficients for the linear SVM classifier used when OpenCL is enabled + UMat oclSvmDetector; + + //! not documented + float free_coef; + + //! Maximum number of detection window increases. Default value is 64 + CV_PROP int nlevels; + + //! Indicates signed gradient will be used or not + CV_PROP bool signedGradient; + + /** @brief evaluate specified ROI and return confidence value for each location + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param locations Vector of Point + @param foundLocations Vector of Point where each Point is detected object's top-left point. + @param confidences confidences + @param hitThreshold Threshold for the distance between features and SVM classifying plane. Usually + it is 0 and should be specified in the detector coefficients (as the last free coefficient). But if + the free coefficient is omitted (which is allowed), you can specify it manually here + @param winStride winStride + @param padding padding + */ + virtual void detectROI(InputArray img, const std::vector &locations, + CV_OUT std::vector& foundLocations, CV_OUT std::vector& confidences, + double hitThreshold = 0, cv::Size winStride = Size(), + cv::Size padding = Size()) const; + + /** @brief evaluate specified ROI and return confidence value for each location in multiple scales + @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected. + @param foundLocations Vector of rectangles where each rectangle contains the detected object. + @param locations Vector of DetectionROI + @param hitThreshold Threshold for the distance between features and SVM classifying plane. Usually it is 0 and should be specified + in the detector coefficients (as the last free coefficient). But if the free coefficient is omitted (which is allowed), you can specify it manually here. + @param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it. + */ + virtual void detectMultiScaleROI(InputArray img, + CV_OUT std::vector& foundLocations, + std::vector& locations, + double hitThreshold = 0, + int groupThreshold = 0) const; + + /** @brief Groups the object candidate rectangles. + @param rectList Input/output vector of rectangles. Output vector includes retained and grouped rectangles. (The Python list is not modified in place.) + @param weights Input/output vector of weights of rectangles. Output vector includes weights of retained and grouped rectangles. (The Python list is not modified in place.) + @param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it. + @param eps Relative difference between sides of the rectangles to merge them into a group. + */ + void groupRectangles(std::vector& rectList, std::vector& weights, int groupThreshold, double eps) const; +}; +//! @} + +//! @addtogroup objdetect_qrcode +//! @{ + +class CV_EXPORTS_W QRCodeEncoder { +protected: + QRCodeEncoder(); // use ::create() +public: + virtual ~QRCodeEncoder(); + + enum EncodeMode { + MODE_AUTO = -1, + MODE_NUMERIC = 1, // 0b0001 + MODE_ALPHANUMERIC = 2, // 0b0010 + MODE_BYTE = 4, // 0b0100 + MODE_ECI = 7, // 0b0111 + MODE_KANJI = 8, // 0b1000 + MODE_STRUCTURED_APPEND = 3 // 0b0011 + }; + + enum CorrectionLevel { + CORRECT_LEVEL_L = 0, + CORRECT_LEVEL_M = 1, + CORRECT_LEVEL_Q = 2, + CORRECT_LEVEL_H = 3 + }; + + enum ECIEncodings { + ECI_UTF8 = 26 + }; + + /** @brief QR code encoder parameters. */ + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + + //! The optional version of QR code (by default - maximum possible depending on the length of the string). + CV_PROP_RW int version; + + //! The optional level of error correction (by default - the lowest). + CV_PROP_RW CorrectionLevel correction_level; + + //! The optional encoding mode - Numeric, Alphanumeric, Byte, Kanji, ECI or Structured Append. + CV_PROP_RW EncodeMode mode; + + //! The optional number of QR codes to generate in Structured Append mode. + CV_PROP_RW int structure_number; + }; + + /** @brief Constructor + @param parameters QR code encoder parameters QRCodeEncoder::Params + */ + static CV_WRAP + Ptr create(const QRCodeEncoder::Params& parameters = QRCodeEncoder::Params()); + + /** @brief Generates QR code from input string. + @param encoded_info Input string to encode. + @param qrcode Generated QR code. + */ + CV_WRAP virtual void encode(const String& encoded_info, OutputArray qrcode) = 0; + + /** @brief Generates QR code from input string in Structured Append mode. The encoded message is splitting over a number of QR codes. + @param encoded_info Input string to encode. + @param qrcodes Vector of generated QR codes. + */ + CV_WRAP virtual void encodeStructuredAppend(const String& encoded_info, OutputArrayOfArrays qrcodes) = 0; + +}; +class CV_EXPORTS_W_SIMPLE QRCodeDetector : public GraphicalCodeDetector +{ +public: + CV_WRAP QRCodeDetector(); + + /** @brief sets the epsilon used during the horizontal scan of QR code stop marker detection. + @param epsX Epsilon neighborhood, which allows you to determine the horizontal pattern + of the scheme 1:1:3:1:1 according to QR code standard. + */ + CV_WRAP QRCodeDetector& setEpsX(double epsX); + /** @brief sets the epsilon used during the vertical scan of QR code stop marker detection. + @param epsY Epsilon neighborhood, which allows you to determine the vertical pattern + of the scheme 1:1:3:1:1 according to QR code standard. + */ + CV_WRAP QRCodeDetector& setEpsY(double epsY); + + /** @brief use markers to improve the position of the corners of the QR code + * + * alignmentMarkers using by default + */ + CV_WRAP QRCodeDetector& setUseAlignmentMarkers(bool useAlignmentMarkers); + + /** @brief Decodes QR code on a curved surface in image once it's found by the detect() method. + + Returns UTF8-encoded output string or empty string if the code cannot be decoded. + @param img grayscale or color (BGR) image containing QR code. + @param points Quadrangle vertices found by detect() method (or some other algorithm). + @param straight_qrcode The optional output image containing rectified and binarized QR code + */ + CV_WRAP cv::String decodeCurved(InputArray img, InputArray points, OutputArray straight_qrcode = noArray()); + + /** @brief Both detects and decodes QR code on a curved surface + + @param img grayscale or color (BGR) image containing QR code. + @param points optional output array of vertices of the found QR code quadrangle. Will be empty if not found. + @param straight_qrcode The optional output image containing rectified and binarized QR code + */ + CV_WRAP std::string detectAndDecodeCurved(InputArray img, OutputArray points=noArray(), + OutputArray straight_qrcode = noArray()); +}; + +class CV_EXPORTS_W_SIMPLE QRCodeDetectorAruco : public GraphicalCodeDetector { +public: + CV_WRAP QRCodeDetectorAruco(); + + struct CV_EXPORTS_W_SIMPLE Params { + CV_WRAP Params(); + + /** @brief The minimum allowed pixel size of a QR module in the smallest image in the image pyramid, default 4.f */ + CV_PROP_RW float minModuleSizeInPyramid; + + /** @brief The maximum allowed relative rotation for finder patterns in the same QR code, default pi/12 */ + CV_PROP_RW float maxRotation; + + /** @brief The maximum allowed relative mismatch in module sizes for finder patterns in the same QR code, default 1.75f */ + CV_PROP_RW float maxModuleSizeMismatch; + + /** @brief The maximum allowed module relative mismatch for timing pattern module, default 2.f + * + * If relative mismatch of timing pattern module more this value, penalty points will be added. + * If a lot of penalty points are added, QR code will be rejected. */ + CV_PROP_RW float maxTimingPatternMismatch; + + /** @brief The maximum allowed percentage of penalty points out of total pins in timing pattern, default 0.4f */ + CV_PROP_RW float maxPenalties; + + /** @brief The maximum allowed relative color mismatch in the timing pattern, default 0.2f*/ + CV_PROP_RW float maxColorsMismatch; + + /** @brief The algorithm find QR codes with almost minimum timing pattern score and minimum size, default 0.9f + * + * The QR code with the minimum "timing pattern score" and minimum "size" is selected as the best QR code. + * If for the current QR code "timing pattern score" * scaleTimingPatternScore < "previous timing pattern score" and "size" < "previous size", then + * current QR code set as the best QR code. */ + CV_PROP_RW float scaleTimingPatternScore; + }; + + /** @brief QR code detector constructor for Aruco-based algorithm. See cv::QRCodeDetectorAruco::Params */ + CV_WRAP explicit QRCodeDetectorAruco(const QRCodeDetectorAruco::Params& params); + + /** @brief Detector parameters getter. See cv::QRCodeDetectorAruco::Params */ + CV_WRAP const QRCodeDetectorAruco::Params& getDetectorParameters() const; + + /** @brief Detector parameters setter. See cv::QRCodeDetectorAruco::Params */ + CV_WRAP QRCodeDetectorAruco& setDetectorParameters(const QRCodeDetectorAruco::Params& params); + + /** @brief Aruco detector parameters are used to search for the finder patterns. */ + CV_WRAP aruco::DetectorParameters getArucoParameters(); + + /** @brief Aruco detector parameters are used to search for the finder patterns. */ + CV_WRAP void setArucoParameters(const aruco::DetectorParameters& params); +}; + +//! @} +} + +#include "opencv2/objdetect/detection_based_tracker.hpp" +#include "opencv2/objdetect/face.hpp" +#include "opencv2/objdetect/charuco_detector.hpp" +#include "opencv2/objdetect/barcode.hpp" + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/aruco_board.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_board.hpp new file mode 100644 index 0000000..e8300c8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_board.hpp @@ -0,0 +1,199 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_ARUCO_BOARD_HPP +#define OPENCV_OBJDETECT_ARUCO_BOARD_HPP + +#include + +namespace cv { +namespace aruco { +//! @addtogroup objdetect_aruco +//! @{ + +class Dictionary; + +/** @brief Board of ArUco markers + * + * A board is a set of markers in the 3D space with a common coordinate system. + * The common form of a board of marker is a planar (2D) board, however any 3D layout can be used. + * A Board object is composed by: + * - The object points of the marker corners, i.e. their coordinates respect to the board system. + * - The dictionary which indicates the type of markers of the board + * - The identifier of all the markers in the board. + */ +class CV_EXPORTS_W_SIMPLE Board { +public: + /** @brief Common Board constructor + * + * @param objPoints array of object points of all the marker corners in the board + * @param dictionary the dictionary of markers employed for this board + * @param ids vector of the identifiers of the markers in the board + */ + CV_WRAP Board(InputArrayOfArrays objPoints, const Dictionary& dictionary, InputArray ids); + + /** @brief return the Dictionary of markers employed for this board + */ + CV_WRAP const Dictionary& getDictionary() const; + + /** @brief return array of object points of all the marker corners in the board. + * + * Each marker include its 4 corners in this order: + * - objPoints[i][0] - left-top point of i-th marker + * - objPoints[i][1] - right-top point of i-th marker + * - objPoints[i][2] - right-bottom point of i-th marker + * - objPoints[i][3] - left-bottom point of i-th marker + * + * Markers are placed in a certain order - row by row, left to right in every row. For M markers, the size is Mx4. + */ + CV_WRAP const std::vector >& getObjPoints() const; + + /** @brief vector of the identifiers of the markers in the board (should be the same size as objPoints) + * @return vector of the identifiers of the markers + */ + CV_WRAP const std::vector& getIds() const; + + /** @brief get coordinate of the bottom right corner of the board, is set when calling the function create() + */ + CV_WRAP const Point3f& getRightBottomCorner() const; + + /** @brief Given a board configuration and a set of detected markers, returns the corresponding + * image points and object points, can be used in solvePnP() + * + * @param detectedCorners List of detected marker corners of the board. + * For cv::Board and cv::GridBoard the method expects std::vector> or std::vector with Aruco marker corners. + * For cv::CharucoBoard the method expects std::vector or Mat with ChAruco corners (chess board corners matched with Aruco markers). + * + * @param detectedIds List of identifiers for each marker or charuco corner. + * For any Board class the method expects std::vector or Mat. + * + * @param objPoints Vector of marker points in the board coordinate space. + * For any Board class the method expects std::vector objectPoints or cv::Mat + * + * @param imgPoints Vector of marker points in the image coordinate space. + * For any Board class the method expects std::vector objectPoints or cv::Mat + * + * @sa solvePnP + */ + CV_WRAP void matchImagePoints(InputArrayOfArrays detectedCorners, InputArray detectedIds, + OutputArray objPoints, OutputArray imgPoints) const; + + /** @brief Draw a planar board + * + * @param outSize size of the output image in pixels. + * @param img output image with the board. The size of this image will be outSize + * and the board will be on the center, keeping the board proportions. + * @param marginSize minimum margins (in pixels) of the board in the output image + * @param borderBits width of the marker borders. + * + * This function return the image of the board, ready to be printed. + */ + CV_WRAP void generateImage(Size outSize, OutputArray img, int marginSize = 0, int borderBits = 1) const; + + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + Board(); + + struct Impl; +protected: + Board(const Ptr& impl); + Ptr impl; +}; + +/** @brief Planar board with grid arrangement of markers + * + * More common type of board. All markers are placed in the same plane in a grid arrangement. + * The board image can be drawn using generateImage() method. + */ +class CV_EXPORTS_W_SIMPLE GridBoard : public Board { +public: + /** + * @brief GridBoard constructor + * + * @param size number of markers in x and y directions + * @param markerLength marker side length (normally in meters) + * @param markerSeparation separation between two markers (same unit as markerLength) + * @param dictionary dictionary of markers indicating the type of markers + * @param ids set of marker ids in dictionary to use on board. + */ + CV_WRAP GridBoard(const Size& size, float markerLength, float markerSeparation, + const Dictionary &dictionary, InputArray ids = noArray()); + + CV_WRAP Size getGridSize() const; + CV_WRAP float getMarkerLength() const; + CV_WRAP float getMarkerSeparation() const; + + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + GridBoard(); +}; + +/** + * @brief ChArUco board is a planar chessboard where the markers are placed inside the white squares of a chessboard. + * + * The benefits of ChArUco boards is that they provide both, ArUco markers versatility and chessboard corner precision, + * which is important for calibration and pose estimation. The board image can be drawn using generateImage() method. + */ +class CV_EXPORTS_W_SIMPLE CharucoBoard : public Board { +public: + /** @brief CharucoBoard constructor + * + * @param size number of chessboard squares in x and y directions + * @param squareLength squareLength chessboard square side length (normally in meters) + * @param markerLength marker side length (same unit than squareLength) + * @param dictionary dictionary of markers indicating the type of markers + * @param ids array of id used markers + * The first markers in the dictionary are used to fill the white chessboard squares. + */ + CV_WRAP CharucoBoard(const Size& size, float squareLength, float markerLength, + const Dictionary &dictionary, InputArray ids = noArray()); + + /** @brief set legacy chessboard pattern. + * + * Legacy setting creates chessboard patterns starting with a white box in the upper left corner + * if there is an even row count of chessboard boxes, otherwise it starts with a black box. + * This setting ensures compatibility to patterns created with OpenCV versions prior OpenCV 4.6.0. + * See https://github.com/opencv/opencv/issues/23152. + * + * Default value: false. + */ + CV_WRAP void setLegacyPattern(bool legacyPattern); + CV_WRAP bool getLegacyPattern() const; + + CV_WRAP Size getChessboardSize() const; + CV_WRAP float getSquareLength() const; + CV_WRAP float getMarkerLength() const; + + /** @brief get CharucoBoard::chessboardCorners + */ + CV_WRAP std::vector getChessboardCorners() const; + + /** @brief get CharucoBoard::nearestMarkerIdx, for each charuco corner, nearest marker index in ids array + */ + CV_PROP std::vector > getNearestMarkerIdx() const; + + /** @brief get CharucoBoard::nearestMarkerCorners, for each charuco corner, nearest marker corner id of each marker + */ + CV_PROP std::vector > getNearestMarkerCorners() const; + + /** @brief check whether the ChArUco markers are collinear + * + * @param charucoIds list of identifiers for each corner in charucoCorners per frame. + * @return bool value, 1 (true) if detected corners form a line, 0 (false) if they do not. + * solvePnP, calibration functions will fail if the corners are collinear (true). + * + * The number of ids in charucoIDs should be <= the number of chessboard corners in the board. + * This functions checks whether the charuco corners are on a straight line (returns true, if so), or not (false). + * Axis parallel, as well as diagonal and other straight lines detected. Degenerate cases: + * for number of charucoIDs <= 2,the function returns true. + */ + CV_WRAP bool checkCharucoCornersCollinear(InputArray charucoIds) const; + + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + CharucoBoard(); +}; + +//! @} + +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/aruco_detector.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_detector.hpp new file mode 100644 index 0000000..c51abb0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_detector.hpp @@ -0,0 +1,386 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_ARUCO_DETECTOR_HPP +#define OPENCV_OBJDETECT_ARUCO_DETECTOR_HPP + +#include +#include + +namespace cv { +namespace aruco { + +//! @addtogroup objdetect_aruco +//! @{ + +enum CornerRefineMethod{ + CORNER_REFINE_NONE, ///< Tag and corners detection based on the ArUco approach + CORNER_REFINE_SUBPIX, ///< ArUco approach and refine the corners locations using corner subpixel accuracy + CORNER_REFINE_CONTOUR, ///< ArUco approach and refine the corners locations using the contour-points line fitting + CORNER_REFINE_APRILTAG, ///< Tag and corners detection based on the AprilTag 2 approach @cite wang2016iros +}; + +/** @brief struct DetectorParameters is used by ArucoDetector + */ +struct CV_EXPORTS_W_SIMPLE DetectorParameters { + CV_WRAP DetectorParameters() { + adaptiveThreshWinSizeMin = 3; + adaptiveThreshWinSizeMax = 23; + adaptiveThreshWinSizeStep = 10; + adaptiveThreshConstant = 7; + minMarkerPerimeterRate = 0.03; + maxMarkerPerimeterRate = 4.; + polygonalApproxAccuracyRate = 0.03; + minCornerDistanceRate = 0.05; + minDistanceToBorder = 3; + minMarkerDistanceRate = 0.05; + cornerRefinementMethod = (int)CORNER_REFINE_NONE; + cornerRefinementWinSize = 5; + relativeCornerRefinmentWinSize = 0.3f; + cornerRefinementMaxIterations = 30; + cornerRefinementMinAccuracy = 0.1; + markerBorderBits = 1; + perspectiveRemovePixelPerCell = 4; + perspectiveRemoveIgnoredMarginPerCell = 0.13; + maxErroneousBitsInBorderRate = 0.35; + minOtsuStdDev = 5.0; + errorCorrectionRate = 0.6; + aprilTagQuadDecimate = 0.0; + aprilTagQuadSigma = 0.0; + aprilTagMinClusterPixels = 5; + aprilTagMaxNmaxima = 10; + aprilTagCriticalRad = (float)(10* CV_PI /180); + aprilTagMaxLineFitMse = 10.0; + aprilTagMinWhiteBlackDiff = 5; + aprilTagDeglitch = 0; + detectInvertedMarker = false; + useAruco3Detection = false; + minSideLengthCanonicalImg = 32; + minMarkerLengthRatioOriginalImg = 0.0; + } + + /** @brief Read a new set of DetectorParameters from FileNode (use FileStorage.root()). + */ + CV_WRAP bool readDetectorParameters(const FileNode& fn); + + /** @brief Write a set of DetectorParameters to FileStorage + */ + CV_WRAP bool writeDetectorParameters(FileStorage& fs, const String& name = String()); + + /// minimum window size for adaptive thresholding before finding contours (default 3). + CV_PROP_RW int adaptiveThreshWinSizeMin; + + /// maximum window size for adaptive thresholding before finding contours (default 23). + CV_PROP_RW int adaptiveThreshWinSizeMax; + + /// increments from adaptiveThreshWinSizeMin to adaptiveThreshWinSizeMax during the thresholding (default 10). + CV_PROP_RW int adaptiveThreshWinSizeStep; + + /// constant for adaptive thresholding before finding contours (default 7) + CV_PROP_RW double adaptiveThreshConstant; + + /** @brief determine minimum perimeter for marker contour to be detected. + * + * This is defined as a rate respect to the maximum dimension of the input image (default 0.03). + */ + CV_PROP_RW double minMarkerPerimeterRate; + + /** @brief determine maximum perimeter for marker contour to be detected. + * + * This is defined as a rate respect to the maximum dimension of the input image (default 4.0). + */ + CV_PROP_RW double maxMarkerPerimeterRate; + + /// minimum accuracy during the polygonal approximation process to determine which contours are squares. (default 0.03) + CV_PROP_RW double polygonalApproxAccuracyRate; + + /// minimum distance between corners for detected markers relative to its perimeter (default 0.05) + CV_PROP_RW double minCornerDistanceRate; + + /// minimum distance of any corner to the image border for detected markers (in pixels) (default 3) + CV_PROP_RW int minDistanceToBorder; + + /** @brief minimum mean distance beetween two marker corners to be considered imilar, so that the smaller one is removed. + * + * The rate is relative to the smaller perimeter of the two markers (default 0.05). + */ + CV_PROP_RW double minMarkerDistanceRate; + + /** @brief default value CORNER_REFINE_NONE */ + CV_PROP_RW int cornerRefinementMethod; + + /** @brief maximum window size for the corner refinement process (in pixels) (default 5). + * + * The window size may decrease if the ArUco marker is too small, check relativeCornerRefinmentWinSize. + * The final window size is calculated as: + * min(cornerRefinementWinSize, averageArucoModuleSize*relativeCornerRefinmentWinSize), + * where averageArucoModuleSize is average module size of ArUco marker in pixels. + * (ArUco marker is composed of black and white modules) + */ + CV_PROP_RW int cornerRefinementWinSize; + + /** @brief Dynamic window size for corner refinement relative to Aruco module size (default 0.3). + * + * The final window size is calculated as: + * min(cornerRefinementWinSize, averageArucoModuleSize*relativeCornerRefinmentWinSize), + * where averageArucoModuleSize is average module size of ArUco marker in pixels. + * (ArUco marker is composed of black and white modules) + * In the case of markers located far from each other, it may be useful to increase the value of the parameter to 0.4-0.5. + * In the case of markers located close to each other, it may be useful to decrease the parameter value to 0.1-0.2. + */ + CV_PROP_RW float relativeCornerRefinmentWinSize; + + /// maximum number of iterations for stop criteria of the corner refinement process (default 30). + CV_PROP_RW int cornerRefinementMaxIterations; + + /// minimum error for the stop cristeria of the corner refinement process (default: 0.1) + CV_PROP_RW double cornerRefinementMinAccuracy; + + /// number of bits of the marker border, i.e. marker border width (default 1). + CV_PROP_RW int markerBorderBits; + + /// number of bits (per dimension) for each cell of the marker when removing the perspective (default 4). + CV_PROP_RW int perspectiveRemovePixelPerCell; + + /** @brief width of the margin of pixels on each cell not considered for the determination of the cell bit. + * + * Represents the rate respect to the total size of the cell, i.e. perspectiveRemovePixelPerCell (default 0.13) + */ + CV_PROP_RW double perspectiveRemoveIgnoredMarginPerCell; + + /** @brief maximum number of accepted erroneous bits in the border (i.e. number of allowed white bits in the border). + * + * Represented as a rate respect to the total number of bits per marker (default 0.35). + */ + CV_PROP_RW double maxErroneousBitsInBorderRate; + + /** @brief minimun standard deviation in pixels values during the decodification step to apply Otsu + * thresholding (otherwise, all the bits are set to 0 or 1 depending on mean higher than 128 or not) (default 5.0) + */ + CV_PROP_RW double minOtsuStdDev; + + /// error correction rate respect to the maximun error correction capability for each dictionary (default 0.6). + CV_PROP_RW double errorCorrectionRate; + + /** @brief April :: User-configurable parameters. + * + * Detection of quads can be done on a lower-resolution image, improving speed at a cost of + * pose accuracy and a slight decrease in detection rate. Decoding the binary payload is still + */ + CV_PROP_RW float aprilTagQuadDecimate; + + /// what Gaussian blur should be applied to the segmented image (used for quad detection?) + CV_PROP_RW float aprilTagQuadSigma; + + // April :: Internal variables + /// reject quads containing too few pixels (default 5). + CV_PROP_RW int aprilTagMinClusterPixels; + + /// how many corner candidates to consider when segmenting a group of pixels into a quad (default 10). + CV_PROP_RW int aprilTagMaxNmaxima; + + /** @brief reject quads where pairs of edges have angles that are close to straight or close to 180 degrees. + * + * Zero means that no quads are rejected. (In radians) (default 10*PI/180) + */ + CV_PROP_RW float aprilTagCriticalRad; + + /// when fitting lines to the contours, what is the maximum mean squared error + CV_PROP_RW float aprilTagMaxLineFitMse; + + /** @brief add an extra check that the white model must be (overall) brighter than the black model. + * + * When we build our model of black & white pixels, we add an extra check that the white model must be (overall) + * brighter than the black model. How much brighter? (in pixel values, [0,255]), (default 5) + */ + CV_PROP_RW int aprilTagMinWhiteBlackDiff; + + /// should the thresholded image be deglitched? Only useful for very noisy images (default 0). + CV_PROP_RW int aprilTagDeglitch; + + /** @brief to check if there is a white marker. + * + * In order to generate a "white" marker just invert a normal marker by using a tilde, ~markerImage. (default false) + */ + CV_PROP_RW bool detectInvertedMarker; + + /** @brief enable the new and faster Aruco detection strategy. + * + * Proposed in the paper: + * Romero-Ramirez et al: Speeded up detection of squared fiducial markers (2018) + * https://www.researchgate.net/publication/325787310_Speeded_Up_Detection_of_Squared_Fiducial_Markers + */ + CV_PROP_RW bool useAruco3Detection; + + /// minimum side length of a marker in the canonical image. Latter is the binarized image in which contours are searched. + CV_PROP_RW int minSideLengthCanonicalImg; + + /// range [0,1], eq (2) from paper. The parameter tau_i has a direct influence on the processing speed. + CV_PROP_RW float minMarkerLengthRatioOriginalImg; +}; + +/** @brief struct RefineParameters is used by ArucoDetector + */ +struct CV_EXPORTS_W_SIMPLE RefineParameters { + CV_WRAP RefineParameters(float minRepDistance = 10.f, float errorCorrectionRate = 3.f, bool checkAllOrders = true); + + + /** @brief Read a new set of RefineParameters from FileNode (use FileStorage.root()). + */ + CV_WRAP bool readRefineParameters(const FileNode& fn); + + /** @brief Write a set of RefineParameters to FileStorage + */ + CV_WRAP bool writeRefineParameters(FileStorage& fs, const String& name = String()); + + /** @brief minRepDistance minimum distance between the corners of the rejected candidate and the reprojected marker + in order to consider it as a correspondence. + */ + CV_PROP_RW float minRepDistance; + + /** @brief minRepDistance rate of allowed erroneous bits respect to the error correction capability of the used dictionary. + * + * -1 ignores the error correction step. + */ + CV_PROP_RW float errorCorrectionRate; + + /** @brief checkAllOrders consider the four posible corner orders in the rejectedCorners array. + * + * If it set to false, only the provided corner order is considered (default true). + */ + CV_PROP_RW bool checkAllOrders; +}; + +/** @brief The main functionality of ArucoDetector class is detection of markers in an image with detectMarkers() method. + * + * After detecting some markers in the image, you can try to find undetected markers from this dictionary with + * refineDetectedMarkers() method. + * + * @see DetectorParameters, RefineParameters + */ +class CV_EXPORTS_W ArucoDetector : public Algorithm +{ +public: + /** @brief Basic ArucoDetector constructor + * + * @param dictionary indicates the type of markers that will be searched + * @param detectorParams marker detection parameters + * @param refineParams marker refine detection parameters + */ + CV_WRAP ArucoDetector(const Dictionary &dictionary = getPredefinedDictionary(cv::aruco::DICT_4X4_50), + const DetectorParameters &detectorParams = DetectorParameters(), + const RefineParameters& refineParams = RefineParameters()); + + /** @brief Basic marker detection + * + * @param image input image + * @param corners vector of detected marker corners. For each marker, its four corners + * are provided, (e.g std::vector > ). For N detected markers, + * the dimensions of this array is Nx4. The order of the corners is clockwise. + * @param ids vector of identifiers of the detected markers. The identifier is of type int + * (e.g. std::vector). For N detected markers, the size of ids is also N. + * The identifiers have the same order than the markers in the imgPoints array. + * @param rejectedImgPoints contains the imgPoints of those squares whose inner code has not a + * correct codification. Useful for debugging purposes. + * + * Performs marker detection in the input image. Only markers included in the specific dictionary + * are searched. For each detected marker, it returns the 2D position of its corner in the image + * and its corresponding identifier. + * Note that this function does not perform pose estimation. + * @note The function does not correct lens distortion or takes it into account. It's recommended to undistort + * input image with corresponding camera model, if camera parameters are known + * @sa undistort, estimatePoseSingleMarkers, estimatePoseBoard + */ + CV_WRAP void detectMarkers(InputArray image, OutputArrayOfArrays corners, OutputArray ids, + OutputArrayOfArrays rejectedImgPoints = noArray()) const; + + /** @brief Refine not detected markers based on the already detected and the board layout + * + * @param image input image + * @param board layout of markers in the board. + * @param detectedCorners vector of already detected marker corners. + * @param detectedIds vector of already detected marker identifiers. + * @param rejectedCorners vector of rejected candidates during the marker detection process. + * @param cameraMatrix optional input 3x3 floating-point camera matrix + * \f$A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$ + * @param distCoeffs optional vector of distortion coefficients + * \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])\f$ of 4, 5, 8 or 12 elements + * @param recoveredIdxs Optional array to returns the indexes of the recovered candidates in the + * original rejectedCorners array. + * + * This function tries to find markers that were not detected in the basic detecMarkers function. + * First, based on the current detected marker and the board layout, the function interpolates + * the position of the missing markers. Then it tries to find correspondence between the reprojected + * markers and the rejected candidates based on the minRepDistance and errorCorrectionRate parameters. + * If camera parameters and distortion coefficients are provided, missing markers are reprojected + * using projectPoint function. If not, missing marker projections are interpolated using global + * homography, and all the marker corners in the board must have the same Z coordinate. + */ + CV_WRAP void refineDetectedMarkers(InputArray image, const Board &board, + InputOutputArrayOfArrays detectedCorners, + InputOutputArray detectedIds, InputOutputArrayOfArrays rejectedCorners, + InputArray cameraMatrix = noArray(), InputArray distCoeffs = noArray(), + OutputArray recoveredIdxs = noArray()) const; + + CV_WRAP const Dictionary& getDictionary() const; + CV_WRAP void setDictionary(const Dictionary& dictionary); + + CV_WRAP const DetectorParameters& getDetectorParameters() const; + CV_WRAP void setDetectorParameters(const DetectorParameters& detectorParameters); + + CV_WRAP const RefineParameters& getRefineParameters() const; + CV_WRAP void setRefineParameters(const RefineParameters& refineParameters); + + /** @brief Stores algorithm parameters in a file storage + */ + virtual void write(FileStorage& fs) const override; + + /** @brief simplified API for language bindings + */ + CV_WRAP inline void write(FileStorage& fs, const String& name) { Algorithm::write(fs, name); } + + /** @brief Reads algorithm parameters from a file storage + */ + CV_WRAP virtual void read(const FileNode& fn) override; +protected: + struct ArucoDetectorImpl; + Ptr arucoDetectorImpl; +}; + +/** @brief Draw detected markers in image + * + * @param image input/output image. It must have 1 or 3 channels. The number of channels is not altered. + * @param corners positions of marker corners on input image. + * (e.g std::vector > ). For N detected markers, the dimensions of + * this array should be Nx4. The order of the corners should be clockwise. + * @param ids vector of identifiers for markers in markersCorners . + * Optional, if not provided, ids are not painted. + * @param borderColor color of marker borders. Rest of colors (text color and first corner color) + * are calculated based on this one to improve visualization. + * + * Given an array of detected marker corners and its corresponding ids, this functions draws + * the markers in the image. The marker borders are painted and the markers identifiers if provided. + * Useful for debugging purposes. + */ +CV_EXPORTS_W void drawDetectedMarkers(InputOutputArray image, InputArrayOfArrays corners, + InputArray ids = noArray(), Scalar borderColor = Scalar(0, 255, 0)); + +/** @brief Generate a canonical marker image + * + * @param dictionary dictionary of markers indicating the type of markers + * @param id identifier of the marker that will be returned. It has to be a valid id in the specified dictionary. + * @param sidePixels size of the image in pixels + * @param img output image with the marker + * @param borderBits width of the marker border. + * + * This function returns a marker image in its canonical form (i.e. ready to be printed) + */ +CV_EXPORTS_W void generateImageMarker(const Dictionary &dictionary, int id, int sidePixels, OutputArray img, + int borderBits = 1); + +//! @} + +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/aruco_dictionary.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_dictionary.hpp new file mode 100644 index 0000000..bc7b934 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/aruco_dictionary.hpp @@ -0,0 +1,155 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_DICTIONARY_HPP +#define OPENCV_OBJDETECT_DICTIONARY_HPP + +#include + +namespace cv { +namespace aruco { + +//! @addtogroup objdetect_aruco +//! @{ + + +/** @brief Dictionary is a set of unique ArUco markers of the same size + * + * `bytesList` storing as 2-dimensions Mat with 4-th channels (CV_8UC4 type was used) and contains the marker codewords where: + * - bytesList.rows is the dictionary size + * - each marker is encoded using `nbytes = ceil(markerSize*markerSize/8.)` bytes + * - each row contains all 4 rotations of the marker, so its length is `4*nbytes` + * - the byte order in the bytesList[i] row: + * `//bytes without rotation/bytes with rotation 1/bytes with rotation 2/bytes with rotation 3//` + * So `bytesList.ptr(i)[k*nbytes + j]` is the j-th byte of i-th marker, in its k-th rotation. + * @note Python bindings generate matrix with shape of bytesList `dictionary_size x nbytes x 4`, + * but it should be indexed like C++ version. Python example for j-th byte of i-th marker, in its k-th rotation: + * `aruco_dict.bytesList[id].ravel()[k*nbytes + j]` + */ +class CV_EXPORTS_W_SIMPLE Dictionary { + + public: + CV_PROP_RW Mat bytesList; ///< marker code information. See class description for more details + CV_PROP_RW int markerSize; ///< number of bits per dimension + CV_PROP_RW int maxCorrectionBits; ///< maximum number of bits that can be corrected + + CV_WRAP Dictionary(); + + /** @brief Basic ArUco dictionary constructor + * + * @param bytesList bits for all ArUco markers in dictionary see memory layout in the class description + * @param _markerSize ArUco marker size in units + * @param maxcorr maximum number of bits that can be corrected + */ + CV_WRAP Dictionary(const Mat &bytesList, int _markerSize, int maxcorr = 0); + + /** @brief Read a new dictionary from FileNode. + * + * Dictionary example in YAML format:\n + * nmarkers: 35\n + * markersize: 6\n + * maxCorrectionBits: 5\n + * marker_0: "101011111011111001001001101100000000"\n + * ...\n + * marker_34: "011111010000111011111110110101100101" + */ + CV_WRAP bool readDictionary(const cv::FileNode& fn); + + /** @brief Write a dictionary to FileStorage, format is the same as in readDictionary(). + */ + CV_WRAP void writeDictionary(FileStorage& fs, const String& name = String()); + + /** @brief Given a matrix of bits. Returns whether if marker is identified or not. + * + * Returns reference to the marker id in the dictionary (if any) and its rotation. + */ + CV_WRAP bool identify(const Mat &onlyBits, CV_OUT int &idx, CV_OUT int &rotation, double maxCorrectionRate) const; + + /** @brief Returns Hamming distance of the input bits to the specific id. + * + * If `allRotations` flag is set, the four posible marker rotations are considered + */ + CV_WRAP int getDistanceToId(InputArray bits, int id, bool allRotations = true) const; + + + /** @brief Generate a canonical marker image + */ + CV_WRAP void generateImageMarker(int id, int sidePixels, OutputArray _img, int borderBits = 1) const; + + + /** @brief Transform matrix of bits to list of bytes with 4 marker rotations + */ + CV_WRAP static Mat getByteListFromBits(const Mat &bits); + + + /** @brief Transform list of bytes to matrix of bits + */ + CV_WRAP static Mat getBitsFromByteList(const Mat &byteList, int markerSize); +}; + + + + +/** @brief Predefined markers dictionaries/sets + * + * Each dictionary indicates the number of bits and the number of markers contained + * - DICT_ARUCO_ORIGINAL: standard ArUco Library Markers. 1024 markers, 5x5 bits, 0 minimum + distance + */ +enum PredefinedDictionaryType { + DICT_4X4_50 = 0, ///< 4x4 bits, minimum hamming distance between any two codes = 4, 50 codes + DICT_4X4_100, ///< 4x4 bits, minimum hamming distance between any two codes = 3, 100 codes + DICT_4X4_250, ///< 4x4 bits, minimum hamming distance between any two codes = 3, 250 codes + DICT_4X4_1000, ///< 4x4 bits, minimum hamming distance between any two codes = 2, 1000 codes + DICT_5X5_50, ///< 5x5 bits, minimum hamming distance between any two codes = 8, 50 codes + DICT_5X5_100, ///< 5x5 bits, minimum hamming distance between any two codes = 7, 100 codes + DICT_5X5_250, ///< 5x5 bits, minimum hamming distance between any two codes = 6, 250 codes + DICT_5X5_1000, ///< 5x5 bits, minimum hamming distance between any two codes = 5, 1000 codes + DICT_6X6_50, ///< 6x6 bits, minimum hamming distance between any two codes = 13, 50 codes + DICT_6X6_100, ///< 6x6 bits, minimum hamming distance between any two codes = 12, 100 codes + DICT_6X6_250, ///< 6x6 bits, minimum hamming distance between any two codes = 11, 250 codes + DICT_6X6_1000, ///< 6x6 bits, minimum hamming distance between any two codes = 9, 1000 codes + DICT_7X7_50, ///< 7x7 bits, minimum hamming distance between any two codes = 19, 50 codes + DICT_7X7_100, ///< 7x7 bits, minimum hamming distance between any two codes = 18, 100 codes + DICT_7X7_250, ///< 7x7 bits, minimum hamming distance between any two codes = 17, 250 codes + DICT_7X7_1000, ///< 7x7 bits, minimum hamming distance between any two codes = 14, 1000 codes + DICT_ARUCO_ORIGINAL, ///< 6x6 bits, minimum hamming distance between any two codes = 3, 1024 codes + DICT_APRILTAG_16h5, ///< 4x4 bits, minimum hamming distance between any two codes = 5, 30 codes + DICT_APRILTAG_25h9, ///< 5x5 bits, minimum hamming distance between any two codes = 9, 35 codes + DICT_APRILTAG_36h10, ///< 6x6 bits, minimum hamming distance between any two codes = 10, 2320 codes + DICT_APRILTAG_36h11, ///< 6x6 bits, minimum hamming distance between any two codes = 11, 587 codes + DICT_ARUCO_MIP_36h12 ///< 6x6 bits, minimum hamming distance between any two codes = 12, 250 codes +}; + + +/** @brief Returns one of the predefined dictionaries defined in PredefinedDictionaryType + */ +CV_EXPORTS Dictionary getPredefinedDictionary(PredefinedDictionaryType name); + + +/** @brief Returns one of the predefined dictionaries referenced by DICT_*. + */ +CV_EXPORTS_W Dictionary getPredefinedDictionary(int dict); + +/** @brief Extend base dictionary by new nMarkers + * + * @param nMarkers number of markers in the dictionary + * @param markerSize number of bits per dimension of each markers + * @param baseDictionary Include the markers in this dictionary at the beginning (optional) + * @param randomSeed a user supplied seed for theRNG() + * + * This function creates a new dictionary composed by nMarkers markers and each markers composed + * by markerSize x markerSize bits. If baseDictionary is provided, its markers are directly + * included and the rest are generated based on them. If the size of baseDictionary is higher + * than nMarkers, only the first nMarkers in baseDictionary are taken and no new marker is added. + */ +CV_EXPORTS_W Dictionary extendDictionary(int nMarkers, int markerSize, const Dictionary &baseDictionary = Dictionary(), + int randomSeed=0); + + + +//! @} +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/barcode.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/barcode.hpp new file mode 100644 index 0000000..958490a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/barcode.hpp @@ -0,0 +1,65 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. +// Copyright (c) 2020-2021 darkliang wangberlinT Certseeds + +#ifndef OPENCV_OBJDETECT_BARCODE_HPP +#define OPENCV_OBJDETECT_BARCODE_HPP + +#include +#include + +namespace cv { +namespace barcode { + +//! @addtogroup objdetect_barcode +//! @{ + +class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector +{ +public: + /** @brief Initialize the BarcodeDetector. + */ + CV_WRAP BarcodeDetector(); + /** @brief Initialize the BarcodeDetector. + * + * Parameters allow to load _optional_ Super Resolution DNN model for better quality. + * @param prototxt_path prototxt file path for the super resolution model + * @param model_path model file path for the super resolution model + */ + CV_WRAP BarcodeDetector(const std::string &prototxt_path, const std::string &model_path); + ~BarcodeDetector(); + + /** @brief Decodes barcode in image once it's found by the detect() method. + * + * @param img grayscale or color (BGR) image containing bar code. + * @param points vector of rotated rectangle vertices found by detect() method (or some other algorithm). + * For N detected barcodes, the dimensions of this array should be [N][4]. + * Order of four points in vector is bottomLeft, topLeft, topRight, bottomRight. + * @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. + * @param decoded_type vector strings, specifies the type of these barcodes + * @return true if at least one valid barcode have been found + */ + CV_WRAP bool decodeWithType(InputArray img, + InputArray points, + CV_OUT std::vector &decoded_info, + CV_OUT std::vector &decoded_type) const; + + /** @brief Both detects and decodes barcode + + * @param img grayscale or color (BGR) image containing barcode. + * @param decoded_info UTF8-encoded output vector of string(s) or empty vector of string if the codes cannot be decoded. + * @param decoded_type vector of strings, specifies the type of these barcodes + * @param points optional output vector of vertices of the found barcode rectangle. Will be empty if not found. + * @return true if at least one valid barcode have been found + */ + CV_WRAP bool detectAndDecodeWithType(InputArray img, + CV_OUT std::vector &decoded_info, + CV_OUT std::vector &decoded_type, + OutputArray points = noArray()) const; +}; +//! @} + +}} // cv::barcode:: + +#endif // OPENCV_OBJDETECT_BARCODE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/charuco_detector.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/charuco_detector.hpp new file mode 100644 index 0000000..a23960d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/charuco_detector.hpp @@ -0,0 +1,154 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_CHARUCO_DETECTOR_HPP +#define OPENCV_OBJDETECT_CHARUCO_DETECTOR_HPP + +#include "opencv2/objdetect/aruco_detector.hpp" + +namespace cv { +namespace aruco { + +//! @addtogroup objdetect_aruco +//! @{ + +struct CV_EXPORTS_W_SIMPLE CharucoParameters { + CV_WRAP CharucoParameters() { + minMarkers = 2; + tryRefineMarkers = false; + } + /// cameraMatrix optional 3x3 floating-point camera matrix + CV_PROP_RW Mat cameraMatrix; + + /// distCoeffs optional vector of distortion coefficients + CV_PROP_RW Mat distCoeffs; + + /// minMarkers number of adjacent markers that must be detected to return a charuco corner, default = 2 + CV_PROP_RW int minMarkers; + + /// try to use refine board, default false + CV_PROP_RW bool tryRefineMarkers; +}; + +class CV_EXPORTS_W CharucoDetector : public Algorithm { +public: + /** @brief Basic CharucoDetector constructor + * + * @param board ChAruco board + * @param charucoParams charuco detection parameters + * @param detectorParams marker detection parameters + * @param refineParams marker refine detection parameters + */ + CV_WRAP CharucoDetector(const CharucoBoard& board, + const CharucoParameters& charucoParams = CharucoParameters(), + const DetectorParameters &detectorParams = DetectorParameters(), + const RefineParameters& refineParams = RefineParameters()); + + CV_WRAP const CharucoBoard& getBoard() const; + CV_WRAP void setBoard(const CharucoBoard& board); + + CV_WRAP const CharucoParameters& getCharucoParameters() const; + CV_WRAP void setCharucoParameters(CharucoParameters& charucoParameters); + + CV_WRAP const DetectorParameters& getDetectorParameters() const; + CV_WRAP void setDetectorParameters(const DetectorParameters& detectorParameters); + + CV_WRAP const RefineParameters& getRefineParameters() const; + CV_WRAP void setRefineParameters(const RefineParameters& refineParameters); + + /** + * @brief detect aruco markers and interpolate position of ChArUco board corners + * @param image input image necesary for corner refinement. Note that markers are not detected and + * should be sent in corners and ids parameters. + * @param charucoCorners interpolated chessboard corners. + * @param charucoIds interpolated chessboard corners identifiers. + * @param markerCorners vector of already detected markers corners. For each marker, its four + * corners are provided, (e.g std::vector > ). For N detected markers, the + * dimensions of this array should be Nx4. The order of the corners should be clockwise. + * If markerCorners and markerCorners are empty, the function detect aruco markers and ids. + * @param markerIds list of identifiers for each marker in corners. + * If markerCorners and markerCorners are empty, the function detect aruco markers and ids. + * + * This function receives the detected markers and returns the 2D position of the chessboard corners + * from a ChArUco board using the detected Aruco markers. + * + * If markerCorners and markerCorners are empty, the detectMarkers() will run and detect aruco markers and ids. + * + * If camera parameters are provided, the process is based in an approximated pose estimation, else it is based on local homography. + * Only visible corners are returned. For each corner, its corresponding identifier is also returned in charucoIds. + * @sa findChessboardCorners + */ + CV_WRAP void detectBoard(InputArray image, OutputArray charucoCorners, OutputArray charucoIds, + InputOutputArrayOfArrays markerCorners = noArray(), + InputOutputArray markerIds = noArray()) const; + + /** + * @brief Detect ChArUco Diamond markers + * + * @param image input image necessary for corner subpixel. + * @param diamondCorners output list of detected diamond corners (4 corners per diamond). The order + * is the same than in marker corners: top left, top right, bottom right and bottom left. Similar + * format than the corners returned by detectMarkers (e.g std::vector > ). + * @param diamondIds ids of the diamonds in diamondCorners. The id of each diamond is in fact of + * type Vec4i, so each diamond has 4 ids, which are the ids of the aruco markers composing the + * diamond. + * @param markerCorners list of detected marker corners from detectMarkers function. + * If markerCorners and markerCorners are empty, the function detect aruco markers and ids. + * @param markerIds list of marker ids in markerCorners. + * If markerCorners and markerCorners are empty, the function detect aruco markers and ids. + * + * This function detects Diamond markers from the previous detected ArUco markers. The diamonds + * are returned in the diamondCorners and diamondIds parameters. If camera calibration parameters + * are provided, the diamond search is based on reprojection. If not, diamond search is based on + * homography. Homography is faster than reprojection, but less accurate. + */ + CV_WRAP void detectDiamonds(InputArray image, OutputArrayOfArrays diamondCorners, OutputArray diamondIds, + InputOutputArrayOfArrays markerCorners = noArray(), + InputOutputArray markerIds = noArray()) const; +protected: + struct CharucoDetectorImpl; + Ptr charucoDetectorImpl; +}; + +/** + * @brief Draws a set of Charuco corners + * @param image input/output image. It must have 1 or 3 channels. The number of channels is not + * altered. + * @param charucoCorners vector of detected charuco corners + * @param charucoIds list of identifiers for each corner in charucoCorners + * @param cornerColor color of the square surrounding each corner + * + * This function draws a set of detected Charuco corners. If identifiers vector is provided, it also + * draws the id of each corner. + */ +CV_EXPORTS_W void drawDetectedCornersCharuco(InputOutputArray image, InputArray charucoCorners, + InputArray charucoIds = noArray(), Scalar cornerColor = Scalar(255, 0, 0)); + +/** + * @brief Draw a set of detected ChArUco Diamond markers + * + * @param image input/output image. It must have 1 or 3 channels. The number of channels is not + * altered. + * @param diamondCorners positions of diamond corners in the same format returned by + * detectCharucoDiamond(). (e.g std::vector > ). For N detected markers, + * the dimensions of this array should be Nx4. The order of the corners should be clockwise. + * @param diamondIds vector of identifiers for diamonds in diamondCorners, in the same format + * returned by detectCharucoDiamond() (e.g. std::vector). + * Optional, if not provided, ids are not painted. + * @param borderColor color of marker borders. Rest of colors (text color and first corner color) + * are calculated based on this one. + * + * Given an array of detected diamonds, this functions draws them in the image. The marker borders + * are painted and the markers identifiers if provided. + * Useful for debugging purposes. + */ +CV_EXPORTS_W void drawDetectedDiamonds(InputOutputArray image, InputArrayOfArrays diamondCorners, + InputArray diamondIds = noArray(), + Scalar borderColor = Scalar(0, 0, 255)); + +//! @} + +} +} + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/detection_based_tracker.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/detection_based_tracker.hpp new file mode 100644 index 0000000..8050278 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/detection_based_tracker.hpp @@ -0,0 +1,222 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_OBJDETECT_DBT_HPP +#define OPENCV_OBJDETECT_DBT_HPP + +#include + +#include + +namespace cv +{ + +//! @addtogroup objdetect_cascade_classifier +//! @{ + +class CV_EXPORTS DetectionBasedTracker +{ + public: + struct CV_EXPORTS Parameters + { + int maxTrackLifetime; + int minDetectionPeriod; //the minimal time between run of the big object detector (on the whole frame) in ms (1000 mean 1 sec), default=0 + + Parameters(); + }; + + class IDetector + { + public: + IDetector(): + minObjSize(96, 96), + maxObjSize(INT_MAX, INT_MAX), + minNeighbours(2), + scaleFactor(1.1f) + {} + + virtual void detect(const cv::Mat& image, std::vector& objects) = 0; + + void setMinObjectSize(const cv::Size& min) + { + minObjSize = min; + } + void setMaxObjectSize(const cv::Size& max) + { + maxObjSize = max; + } + cv::Size getMinObjectSize() const + { + return minObjSize; + } + cv::Size getMaxObjectSize() const + { + return maxObjSize; + } + float getScaleFactor() + { + return scaleFactor; + } + void setScaleFactor(float value) + { + scaleFactor = value; + } + int getMinNeighbours() + { + return minNeighbours; + } + void setMinNeighbours(int value) + { + minNeighbours = value; + } + virtual ~IDetector() {} + + protected: + cv::Size minObjSize; + cv::Size maxObjSize; + int minNeighbours; + float scaleFactor; + }; + + DetectionBasedTracker(cv::Ptr mainDetector, cv::Ptr trackingDetector, const Parameters& params); + virtual ~DetectionBasedTracker(); + + virtual bool run(); + virtual void stop(); + virtual void resetTracking(); + + virtual void process(const cv::Mat& imageGray); + + bool setParameters(const Parameters& params); + const Parameters& getParameters() const; + + + typedef std::pair Object; + virtual void getObjects(std::vector& result) const; + virtual void getObjects(std::vector& result) const; + + enum ObjectStatus + { + DETECTED_NOT_SHOWN_YET, + DETECTED, + DETECTED_TEMPORARY_LOST, + WRONG_OBJECT + }; + struct ExtObject + { + int id; + cv::Rect location; + ObjectStatus status; + ExtObject(int _id, cv::Rect _location, ObjectStatus _status) + :id(_id), location(_location), status(_status) + { + } + }; + virtual void getObjects(std::vector& result) const; + + + virtual int addObject(const cv::Rect& location); //returns id of the new object + + protected: + class SeparateDetectionWork; + cv::Ptr separateDetectionWork; + friend void* workcycleObjectDetectorFunction(void* p); + + struct InnerParameters + { + int numLastPositionsToTrack; + int numStepsToWaitBeforeFirstShow; + int numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown; + int numStepsToShowWithoutDetecting; + + float coeffTrackingWindowSize; + float coeffObjectSizeToTrack; + float coeffObjectSpeedUsingInPrediction; + + InnerParameters(); + }; + Parameters parameters; + InnerParameters innerParameters; + + struct TrackedObject + { + typedef std::vector PositionsVector; + + PositionsVector lastPositions; + + int numDetectedFrames; + int numFramesNotDetected; + int id; + + TrackedObject(const cv::Rect& rect):numDetectedFrames(1), numFramesNotDetected(0) + { + lastPositions.push_back(rect); + id=getNextId(); + } + + static int getNextId() + { + static int _id=0; + return _id++; + } + }; + + int numTrackedSteps; + std::vector trackedObjects; + + std::vector weightsPositionsSmoothing; + std::vector weightsSizesSmoothing; + + cv::Ptr cascadeForTracking; + + void updateTrackedObjects(const std::vector& detectedObjects); + cv::Rect calcTrackedObjectPositionToShow(int i) const; + cv::Rect calcTrackedObjectPositionToShow(int i, ObjectStatus& status) const; + void detectInRegion(const cv::Mat& img, const cv::Rect& r, std::vector& detectedObjectsInRegions); +}; + +//! @} + +} //end of cv namespace + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/face.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/face.hpp new file mode 100644 index 0000000..d8e96b5 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/face.hpp @@ -0,0 +1,140 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_OBJDETECT_FACE_HPP +#define OPENCV_OBJDETECT_FACE_HPP + +#include + +namespace cv +{ + +//! @addtogroup objdetect_dnn_face +//! @{ + +/** @brief DNN-based face detector + +model download link: https://github.com/opencv/opencv_zoo/tree/master/models/face_detection_yunet + */ +class CV_EXPORTS_W FaceDetectorYN +{ +public: + virtual ~FaceDetectorYN() {} + + /** @brief Set the size for the network input, which overwrites the input size of creating model. Call this method when the size of input image does not match the input size when creating model + * + * @param input_size the size of the input image + */ + CV_WRAP virtual void setInputSize(const Size& input_size) = 0; + + CV_WRAP virtual Size getInputSize() = 0; + + /** @brief Set the score threshold to filter out bounding boxes of score less than the given value + * + * @param score_threshold threshold for filtering out bounding boxes + */ + CV_WRAP virtual void setScoreThreshold(float score_threshold) = 0; + + CV_WRAP virtual float getScoreThreshold() = 0; + + /** @brief Set the Non-maximum-suppression threshold to suppress bounding boxes that have IoU greater than the given value + * + * @param nms_threshold threshold for NMS operation + */ + CV_WRAP virtual void setNMSThreshold(float nms_threshold) = 0; + + CV_WRAP virtual float getNMSThreshold() = 0; + + /** @brief Set the number of bounding boxes preserved before NMS + * + * @param top_k the number of bounding boxes to preserve from top rank based on score + */ + CV_WRAP virtual void setTopK(int top_k) = 0; + + CV_WRAP virtual int getTopK() = 0; + + /** @brief Detects faces in the input image. Following is an example output. + + * ![image](pics/lena-face-detection.jpg) + + * @param image an image to detect + * @param faces detection results stored in a 2D cv::Mat of shape [num_faces, 15] + * - 0-1: x, y of bbox top left corner + * - 2-3: width, height of bbox + * - 4-5: x, y of right eye (blue point in the example image) + * - 6-7: x, y of left eye (red point in the example image) + * - 8-9: x, y of nose tip (green point in the example image) + * - 10-11: x, y of right corner of mouth (pink point in the example image) + * - 12-13: x, y of left corner of mouth (yellow point in the example image) + * - 14: face score + */ + CV_WRAP virtual int detect(InputArray image, OutputArray faces) = 0; + + /** @brief Creates an instance of this class with given parameters + * + * @param model the path to the requested model + * @param config the path to the config file for compability, which is not requested for ONNX models + * @param input_size the size of the input image + * @param score_threshold the threshold to filter out bounding boxes of score smaller than the given value + * @param nms_threshold the threshold to suppress bounding boxes of IoU bigger than the given value + * @param top_k keep top K bboxes before NMS + * @param backend_id the id of backend + * @param target_id the id of target device + */ + CV_WRAP static Ptr create(const String& model, + const String& config, + const Size& input_size, + float score_threshold = 0.9f, + float nms_threshold = 0.3f, + int top_k = 5000, + int backend_id = 0, + int target_id = 0); +}; + +/** @brief DNN-based face recognizer + +model download link: https://github.com/opencv/opencv_zoo/tree/master/models/face_recognition_sface + */ +class CV_EXPORTS_W FaceRecognizerSF +{ +public: + virtual ~FaceRecognizerSF() {} + + /** @brief Definition of distance used for calculating the distance between two face features + */ + enum DisType { FR_COSINE=0, FR_NORM_L2=1 }; + + /** @brief Aligning image to put face on the standard position + * @param src_img input image + * @param face_box the detection result used for indicate face in input image + * @param aligned_img output aligned image + */ + CV_WRAP virtual void alignCrop(InputArray src_img, InputArray face_box, OutputArray aligned_img) const = 0; + + /** @brief Extracting face feature from aligned image + * @param aligned_img input aligned image + * @param face_feature output face feature + */ + CV_WRAP virtual void feature(InputArray aligned_img, OutputArray face_feature) = 0; + + /** @brief Calculating the distance between two face features + * @param face_feature1 the first input feature + * @param face_feature2 the second input feature of the same size and the same type as face_feature1 + * @param dis_type defining the similarity with optional values "FR_OSINE" or "FR_NORM_L2" + */ + CV_WRAP virtual double match(InputArray face_feature1, InputArray face_feature2, int dis_type = FaceRecognizerSF::FR_COSINE) const = 0; + + /** @brief Creates an instance of this class with given parameters + * @param model the path of the onnx model used for face recognition + * @param config the path to the config file for compability, which is not requested for ONNX models + * @param backend_id the id of backend + * @param target_id the id of target device + */ + CV_WRAP static Ptr create(const String& model, const String& config, int backend_id = 0, int target_id = 0); +}; + +//! @} +} // namespace cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/graphical_code_detector.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/graphical_code_detector.hpp new file mode 100644 index 0000000..3535a8d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/graphical_code_detector.hpp @@ -0,0 +1,81 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html +#ifndef OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_HPP +#define OPENCV_OBJDETECT_GRAPHICAL_CODE_DETECTOR_HPP + +#include + +namespace cv { + +//! @addtogroup objdetect_common +//! @{ + +class CV_EXPORTS_W_SIMPLE GraphicalCodeDetector { +public: + CV_DEPRECATED_EXTERNAL // avoid using in C++ code, will be moved to "protected" (need to fix bindings first) + GraphicalCodeDetector(); + + GraphicalCodeDetector(const GraphicalCodeDetector&) = default; + GraphicalCodeDetector(GraphicalCodeDetector&&) = default; + GraphicalCodeDetector& operator=(const GraphicalCodeDetector&) = default; + GraphicalCodeDetector& operator=(GraphicalCodeDetector&&) = default; + + /** @brief Detects graphical code in image and returns the quadrangle containing the code. + @param img grayscale or color (BGR) image containing (or not) graphical code. + @param points Output vector of vertices of the minimum-area quadrangle containing the code. + */ + CV_WRAP bool detect(InputArray img, OutputArray points) const; + + /** @brief Decodes graphical code in image once it's found by the detect() method. + + Returns UTF8-encoded output string or empty string if the code cannot be decoded. + @param img grayscale or color (BGR) image containing graphical code. + @param points Quadrangle vertices found by detect() method (or some other algorithm). + @param straight_code The optional output image containing binarized code, will be empty if not found. + */ + CV_WRAP std::string decode(InputArray img, InputArray points, OutputArray straight_code = noArray()) const; + + /** @brief Both detects and decodes graphical code + + @param img grayscale or color (BGR) image containing graphical code. + @param points optional output array of vertices of the found graphical code quadrangle, will be empty if not found. + @param straight_code The optional output image containing binarized code + */ + CV_WRAP std::string detectAndDecode(InputArray img, OutputArray points = noArray(), + OutputArray straight_code = noArray()) const; + + + /** @brief Detects graphical codes in image and returns the vector of the quadrangles containing the codes. + @param img grayscale or color (BGR) image containing (or not) graphical codes. + @param points Output vector of vector of vertices of the minimum-area quadrangle containing the codes. + */ + CV_WRAP bool detectMulti(InputArray img, OutputArray points) const; + + /** @brief Decodes graphical codes in image once it's found by the detect() method. + @param img grayscale or color (BGR) image containing graphical codes. + @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. + @param points vector of Quadrangle vertices found by detect() method (or some other algorithm). + @param straight_code The optional output vector of images containing binarized codes + */ + CV_WRAP bool decodeMulti(InputArray img, InputArray points, CV_OUT std::vector& decoded_info, + OutputArrayOfArrays straight_code = noArray()) const; + + /** @brief Both detects and decodes graphical codes + @param img grayscale or color (BGR) image containing graphical codes. + @param decoded_info UTF8-encoded output vector of string or empty vector of string if the codes cannot be decoded. + @param points optional output vector of vertices of the found graphical code quadrangles. Will be empty if not found. + @param straight_code The optional vector of images containing binarized codes + */ + CV_WRAP bool detectAndDecodeMulti(InputArray img, CV_OUT std::vector& decoded_info, OutputArray points = noArray(), + OutputArrayOfArrays straight_code = noArray()) const; + struct Impl; +protected: + Ptr p; +}; + +//! @} + +} + +#endif \ No newline at end of file diff --git a/Thirdparty/opencv2/include/opencv2/objdetect/objdetect.hpp b/Thirdparty/opencv2/include/opencv2/objdetect/objdetect.hpp new file mode 100644 index 0000000..3ee284f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/objdetect/objdetect.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/objdetect.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/opencv.hpp b/Thirdparty/opencv2/include/opencv2/opencv.hpp new file mode 100644 index 0000000..d17b94a --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/opencv.hpp @@ -0,0 +1,95 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009-2010, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_ALL_HPP +#define OPENCV_ALL_HPP + +// File that defines what modules where included during the build of OpenCV +// These are purely the defines of the correct HAVE_OPENCV_modulename values +#include "opencv2/opencv_modules.hpp" + +// Then the list of defines is checked to include the correct headers +// Core library is always included --> without no OpenCV functionality available +#include "opencv2/core.hpp" + +// Then the optional modules are checked +#ifdef HAVE_OPENCV_CALIB3D +#include "opencv2/calib3d.hpp" +#endif +#ifdef HAVE_OPENCV_FEATURES2D +#include "opencv2/features2d.hpp" +#endif +#ifdef HAVE_OPENCV_DNN +#include "opencv2/dnn.hpp" +#endif +#ifdef HAVE_OPENCV_FLANN +#include "opencv2/flann.hpp" +#endif +#ifdef HAVE_OPENCV_HIGHGUI +#include "opencv2/highgui.hpp" +#endif +#ifdef HAVE_OPENCV_IMGCODECS +#include "opencv2/imgcodecs.hpp" +#endif +#ifdef HAVE_OPENCV_IMGPROC +#include "opencv2/imgproc.hpp" +#endif +#ifdef HAVE_OPENCV_ML +#include "opencv2/ml.hpp" +#endif +#ifdef HAVE_OPENCV_OBJDETECT +#include "opencv2/objdetect.hpp" +#endif +#ifdef HAVE_OPENCV_PHOTO +#include "opencv2/photo.hpp" +#endif +#ifdef HAVE_OPENCV_STITCHING +#include "opencv2/stitching.hpp" +#endif +#ifdef HAVE_OPENCV_VIDEO +#include "opencv2/video.hpp" +#endif +#ifdef HAVE_OPENCV_VIDEOIO +#include "opencv2/videoio.hpp" +#endif + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/opencv_modules.hpp b/Thirdparty/opencv2/include/opencv2/opencv_modules.hpp new file mode 100644 index 0000000..99ed98c --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/opencv_modules.hpp @@ -0,0 +1,28 @@ +/* + * ** File generated automatically, do not modify ** + * + * This file defines the list of modules available in current build configuration + * + * +*/ + +// This definition means that OpenCV is built with enabled non-free code. +// For example, patented algorithms for non-profit/non-commercial use only. +/* #undef OPENCV_ENABLE_NONFREE */ + +#define HAVE_OPENCV_CALIB3D +#define HAVE_OPENCV_CORE +#define HAVE_OPENCV_DNN +#define HAVE_OPENCV_FEATURES2D +#define HAVE_OPENCV_FLANN +#define HAVE_OPENCV_HIGHGUI +#define HAVE_OPENCV_IMGCODECS +#define HAVE_OPENCV_IMGPROC +#define HAVE_OPENCV_ML +#define HAVE_OPENCV_OBJDETECT +#define HAVE_OPENCV_PHOTO +#define HAVE_OPENCV_STITCHING +#define HAVE_OPENCV_VIDEO +#define HAVE_OPENCV_VIDEOIO + + diff --git a/Thirdparty/opencv2/include/opencv2/photo.hpp b/Thirdparty/opencv2/include/opencv2/photo.hpp new file mode 100644 index 0000000..cef4e4d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/photo.hpp @@ -0,0 +1,858 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2008-2012, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_PHOTO_HPP +#define OPENCV_PHOTO_HPP + +#include "opencv2/core.hpp" +#include "opencv2/imgproc.hpp" + +/** +@defgroup photo Computational Photography + +This module includes photo processing algorithms +@{ + @defgroup photo_inpaint Inpainting + @defgroup photo_denoise Denoising + @defgroup photo_hdr HDR imaging + +This section describes high dynamic range imaging algorithms namely tonemapping, exposure alignment, +camera calibration with multiple exposures and exposure fusion. + + @defgroup photo_decolor Contrast Preserving Decolorization + +Useful links: + +http://www.cse.cuhk.edu.hk/leojia/projects/color2gray/index.html + + @defgroup photo_clone Seamless Cloning + +Useful links: + +https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp + + @defgroup photo_render Non-Photorealistic Rendering + +Useful links: + +http://www.inf.ufrgs.br/~eslgastal/DomainTransform + +https://www.learnopencv.com/non-photorealistic-rendering-using-opencv-python-c/ + + @defgroup photo_c C API +@} + */ + +namespace cv +{ + +//! @addtogroup photo +//! @{ + +//! @addtogroup photo_inpaint +//! @{ +//! the inpainting algorithm +enum +{ + INPAINT_NS = 0, //!< Use Navier-Stokes based method + INPAINT_TELEA = 1 //!< Use the algorithm proposed by Alexandru Telea @cite Telea04 +}; + +/** @brief Restores the selected region in an image using the region neighborhood. + +@param src Input 8-bit, 16-bit unsigned or 32-bit float 1-channel or 8-bit 3-channel image. +@param inpaintMask Inpainting mask, 8-bit 1-channel image. Non-zero pixels indicate the area that +needs to be inpainted. +@param dst Output image with the same size and type as src . +@param inpaintRadius Radius of a circular neighborhood of each point inpainted that is considered +by the algorithm. +@param flags Inpainting method that could be cv::INPAINT_NS or cv::INPAINT_TELEA + +The function reconstructs the selected image area from the pixel near the area boundary. The +function may be used to remove dust and scratches from a scanned photo, or to remove undesirable +objects from still images or video. See for more details. + +@note + - An example using the inpainting technique can be found at + opencv_source_code/samples/cpp/inpaint.cpp + - (Python) An example using the inpainting technique can be found at + opencv_source_code/samples/python/inpaint.py + */ +CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask, + OutputArray dst, double inpaintRadius, int flags ); + +//! @} photo_inpaint + +//! @addtogroup photo_denoise +//! @{ + +/** @brief Perform image denoising using Non-local Means Denoising algorithm + with several computational +optimizations. Noise expected to be a gaussian white noise + +@param src Input 8-bit 1-channel, 2-channel, 3-channel or 4-channel image. +@param dst Output image with the same size and type as src . +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Parameter regulating filter strength. Big h value perfectly removes noise but also +removes image details, smaller h value preserves details but also preserves some noise + +This function expected to be applied to grayscale images. For colored images look at +fastNlMeansDenoisingColored. Advanced usage of this functions can be manual denoising of colored +image in different colorspaces. Such approach is used in fastNlMeansDenoisingColored by converting +image to CIELAB colorspace and then separately denoise L and AB components with different h +parameter. + */ +CV_EXPORTS_W void fastNlMeansDenoising( InputArray src, OutputArray dst, float h = 3, + int templateWindowSize = 7, int searchWindowSize = 21); + +/** @brief Perform image denoising using Non-local Means Denoising algorithm + with several computational +optimizations. Noise expected to be a gaussian white noise + +@param src Input 8-bit or 16-bit (only with NORM_L1) 1-channel, +2-channel, 3-channel or 4-channel image. +@param dst Output image with the same size and type as src . +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Array of parameters regulating filter strength, either one +parameter applied to all channels or one per channel in dst. Big h value +perfectly removes noise but also removes image details, smaller h +value preserves details but also preserves some noise +@param normType Type of norm used for weight calculation. Can be either NORM_L2 or NORM_L1 + +This function expected to be applied to grayscale images. For colored images look at +fastNlMeansDenoisingColored. Advanced usage of this functions can be manual denoising of colored +image in different colorspaces. Such approach is used in fastNlMeansDenoisingColored by converting +image to CIELAB colorspace and then separately denoise L and AB components with different h +parameter. + */ +CV_EXPORTS_W void fastNlMeansDenoising( InputArray src, OutputArray dst, + const std::vector& h, + int templateWindowSize = 7, int searchWindowSize = 21, + int normType = NORM_L2); + +/** @brief Modification of fastNlMeansDenoising function for colored images + +@param src Input 8-bit 3-channel image. +@param dst Output image with the same size and type as src . +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Parameter regulating filter strength for luminance component. Bigger h value perfectly +removes noise but also removes image details, smaller h value preserves details but also preserves +some noise +@param hColor The same as h but for color components. For most images value equals 10 +will be enough to remove colored noise and do not distort colors + +The function converts image to CIELAB colorspace and then separately denoise L and AB components +with given h parameters using fastNlMeansDenoising function. + */ +CV_EXPORTS_W void fastNlMeansDenoisingColored( InputArray src, OutputArray dst, + float h = 3, float hColor = 3, + int templateWindowSize = 7, int searchWindowSize = 21); + +/** @brief Modification of fastNlMeansDenoising function for images sequence where consecutive images have been +captured in small period of time. For example video. This version of the function is for grayscale +images or for manual manipulation with colorspaces. See @cite Buades2005DenoisingIS for more details +(open access [here](https://static.aminer.org/pdf/PDF/000/317/196/spatio_temporal_wiener_filtering_of_image_sequences_using_a_parametric.pdf)). + +@param srcImgs Input 8-bit 1-channel, 2-channel, 3-channel or +4-channel images sequence. All images should have the same type and +size. +@param imgToDenoiseIndex Target image to denoise index in srcImgs sequence +@param temporalWindowSize Number of surrounding images to use for target image denoising. Should +be odd. Images from imgToDenoiseIndex - temporalWindowSize / 2 to +imgToDenoiseIndex - temporalWindowSize / 2 from srcImgs will be used to denoise +srcImgs[imgToDenoiseIndex] image. +@param dst Output image with the same size and type as srcImgs images. +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Parameter regulating filter strength. Bigger h value +perfectly removes noise but also removes image details, smaller h +value preserves details but also preserves some noise + */ +CV_EXPORTS_W void fastNlMeansDenoisingMulti( InputArrayOfArrays srcImgs, OutputArray dst, + int imgToDenoiseIndex, int temporalWindowSize, + float h = 3, int templateWindowSize = 7, int searchWindowSize = 21); + +/** @brief Modification of fastNlMeansDenoising function for images sequence where consecutive images have been +captured in small period of time. For example video. This version of the function is for grayscale +images or for manual manipulation with colorspaces. See @cite Buades2005DenoisingIS for more details +(open access [here](https://static.aminer.org/pdf/PDF/000/317/196/spatio_temporal_wiener_filtering_of_image_sequences_using_a_parametric.pdf)). + +@param srcImgs Input 8-bit or 16-bit (only with NORM_L1) 1-channel, +2-channel, 3-channel or 4-channel images sequence. All images should +have the same type and size. +@param imgToDenoiseIndex Target image to denoise index in srcImgs sequence +@param temporalWindowSize Number of surrounding images to use for target image denoising. Should +be odd. Images from imgToDenoiseIndex - temporalWindowSize / 2 to +imgToDenoiseIndex - temporalWindowSize / 2 from srcImgs will be used to denoise +srcImgs[imgToDenoiseIndex] image. +@param dst Output image with the same size and type as srcImgs images. +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Array of parameters regulating filter strength, either one +parameter applied to all channels or one per channel in dst. Big h value +perfectly removes noise but also removes image details, smaller h +value preserves details but also preserves some noise +@param normType Type of norm used for weight calculation. Can be either NORM_L2 or NORM_L1 + */ +CV_EXPORTS_W void fastNlMeansDenoisingMulti( InputArrayOfArrays srcImgs, OutputArray dst, + int imgToDenoiseIndex, int temporalWindowSize, + const std::vector& h, + int templateWindowSize = 7, int searchWindowSize = 21, + int normType = NORM_L2); + +/** @brief Modification of fastNlMeansDenoisingMulti function for colored images sequences + +@param srcImgs Input 8-bit 3-channel images sequence. All images should have the same type and +size. +@param imgToDenoiseIndex Target image to denoise index in srcImgs sequence +@param temporalWindowSize Number of surrounding images to use for target image denoising. Should +be odd. Images from imgToDenoiseIndex - temporalWindowSize / 2 to +imgToDenoiseIndex - temporalWindowSize / 2 from srcImgs will be used to denoise +srcImgs[imgToDenoiseIndex] image. +@param dst Output image with the same size and type as srcImgs images. +@param templateWindowSize Size in pixels of the template patch that is used to compute weights. +Should be odd. Recommended value 7 pixels +@param searchWindowSize Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater +denoising time. Recommended value 21 pixels +@param h Parameter regulating filter strength for luminance component. Bigger h value perfectly +removes noise but also removes image details, smaller h value preserves details but also preserves +some noise. +@param hColor The same as h but for color components. + +The function converts images to CIELAB colorspace and then separately denoise L and AB components +with given h parameters using fastNlMeansDenoisingMulti function. + */ +CV_EXPORTS_W void fastNlMeansDenoisingColoredMulti( InputArrayOfArrays srcImgs, OutputArray dst, + int imgToDenoiseIndex, int temporalWindowSize, + float h = 3, float hColor = 3, + int templateWindowSize = 7, int searchWindowSize = 21); + +/** @brief Primal-dual algorithm is an algorithm for solving special types of variational problems (that is, +finding a function to minimize some functional). As the image denoising, in particular, may be seen +as the variational problem, primal-dual algorithm then can be used to perform denoising and this is +exactly what is implemented. + +It should be noted, that this implementation was taken from the July 2013 blog entry +@cite MA13 , which also contained (slightly more general) ready-to-use source code on Python. +Subsequently, that code was rewritten on C++ with the usage of openCV by Vadim Pisarevsky at the end +of July 2013 and finally it was slightly adapted by later authors. + +Although the thorough discussion and justification of the algorithm involved may be found in +@cite ChambolleEtAl, it might make sense to skim over it here, following @cite MA13 . To begin +with, we consider the 1-byte gray-level images as the functions from the rectangular domain of +pixels (it may be seen as set +\f$\left\{(x,y)\in\mathbb{N}\times\mathbb{N}\mid 1\leq x\leq n,\;1\leq y\leq m\right\}\f$ for some +\f$m,\;n\in\mathbb{N}\f$) into \f$\{0,1,\dots,255\}\f$. We shall denote the noised images as \f$f_i\f$ and with +this view, given some image \f$x\f$ of the same size, we may measure how bad it is by the formula + +\f[\left\|\left\|\nabla x\right\|\right\| + \lambda\sum_i\left\|\left\|x-f_i\right\|\right\|\f] + +\f$\|\|\cdot\|\|\f$ here denotes \f$L_2\f$-norm and as you see, the first addend states that we want our +image to be smooth (ideally, having zero gradient, thus being constant) and the second states that +we want our result to be close to the observations we've got. If we treat \f$x\f$ as a function, this is +exactly the functional what we seek to minimize and here the Primal-Dual algorithm comes into play. + +@param observations This array should contain one or more noised versions of the image that is to +be restored. +@param result Here the denoised image will be stored. There is no need to do pre-allocation of +storage space, as it will be automatically allocated, if necessary. +@param lambda Corresponds to \f$\lambda\f$ in the formulas above. As it is enlarged, the smooth +(blurred) images are treated more favorably than detailed (but maybe more noised) ones. Roughly +speaking, as it becomes smaller, the result will be more blur but more sever outliers will be +removed. +@param niters Number of iterations that the algorithm will run. Of course, as more iterations as +better, but it is hard to quantitatively refine this statement, so just use the default and +increase it if the results are poor. + */ +CV_EXPORTS_W void denoise_TVL1(const std::vector& observations,Mat& result, double lambda=1.0, int niters=30); + +//! @} photo_denoise + +//! @addtogroup photo_hdr +//! @{ + +enum { LDR_SIZE = 256 }; + +/** @brief Base class for tonemapping algorithms - tools that are used to map HDR image to 8-bit range. + */ +class CV_EXPORTS_W Tonemap : public Algorithm +{ +public: + /** @brief Tonemaps image + + @param src source image - CV_32FC3 Mat (float 32 bits 3 channels) + @param dst destination image - CV_32FC3 Mat with values in [0, 1] range + */ + CV_WRAP virtual void process(InputArray src, OutputArray dst) = 0; + + CV_WRAP virtual float getGamma() const = 0; + CV_WRAP virtual void setGamma(float gamma) = 0; +}; + +/** @brief Creates simple linear mapper with gamma correction + +@param gamma positive value for gamma correction. Gamma value of 1.0 implies no correction, gamma +equal to 2.2f is suitable for most displays. +Generally gamma \> 1 brightens the image and gamma \< 1 darkens it. + */ +CV_EXPORTS_W Ptr createTonemap(float gamma = 1.0f); + +/** @brief Adaptive logarithmic mapping is a fast global tonemapping algorithm that scales the image in +logarithmic domain. + +Since it's a global operator the same function is applied to all the pixels, it is controlled by the +bias parameter. + +Optional saturation enhancement is possible as described in @cite FL02 . + +For more information see @cite DM03 . + */ +class CV_EXPORTS_W TonemapDrago : public Tonemap +{ +public: + + CV_WRAP virtual float getSaturation() const = 0; + CV_WRAP virtual void setSaturation(float saturation) = 0; + + CV_WRAP virtual float getBias() const = 0; + CV_WRAP virtual void setBias(float bias) = 0; +}; + +/** @brief Creates TonemapDrago object + +@param gamma gamma value for gamma correction. See createTonemap +@param saturation positive saturation enhancement value. 1.0 preserves saturation, values greater +than 1 increase saturation and values less than 1 decrease it. +@param bias value for bias function in [0, 1] range. Values from 0.7 to 0.9 usually give best +results, default value is 0.85. + */ +CV_EXPORTS_W Ptr createTonemapDrago(float gamma = 1.0f, float saturation = 1.0f, float bias = 0.85f); + + +/** @brief This is a global tonemapping operator that models human visual system. + +Mapping function is controlled by adaptation parameter, that is computed using light adaptation and +color adaptation. + +For more information see @cite RD05 . + */ +class CV_EXPORTS_W TonemapReinhard : public Tonemap +{ +public: + CV_WRAP virtual float getIntensity() const = 0; + CV_WRAP virtual void setIntensity(float intensity) = 0; + + CV_WRAP virtual float getLightAdaptation() const = 0; + CV_WRAP virtual void setLightAdaptation(float light_adapt) = 0; + + CV_WRAP virtual float getColorAdaptation() const = 0; + CV_WRAP virtual void setColorAdaptation(float color_adapt) = 0; +}; + +/** @brief Creates TonemapReinhard object + +@param gamma gamma value for gamma correction. See createTonemap +@param intensity result intensity in [-8, 8] range. Greater intensity produces brighter results. +@param light_adapt light adaptation in [0, 1] range. If 1 adaptation is based only on pixel +value, if 0 it's global, otherwise it's a weighted mean of this two cases. +@param color_adapt chromatic adaptation in [0, 1] range. If 1 channels are treated independently, +if 0 adaptation level is the same for each channel. + */ +CV_EXPORTS_W Ptr +createTonemapReinhard(float gamma = 1.0f, float intensity = 0.0f, float light_adapt = 1.0f, float color_adapt = 0.0f); + +/** @brief This algorithm transforms image to contrast using gradients on all levels of gaussian pyramid, +transforms contrast values to HVS response and scales the response. After this the image is +reconstructed from new contrast values. + +For more information see @cite MM06 . + */ +class CV_EXPORTS_W TonemapMantiuk : public Tonemap +{ +public: + CV_WRAP virtual float getScale() const = 0; + CV_WRAP virtual void setScale(float scale) = 0; + + CV_WRAP virtual float getSaturation() const = 0; + CV_WRAP virtual void setSaturation(float saturation) = 0; +}; + +/** @brief Creates TonemapMantiuk object + +@param gamma gamma value for gamma correction. See createTonemap +@param scale contrast scale factor. HVS response is multiplied by this parameter, thus compressing +dynamic range. Values from 0.6 to 0.9 produce best results. +@param saturation saturation enhancement value. See createTonemapDrago + */ +CV_EXPORTS_W Ptr +createTonemapMantiuk(float gamma = 1.0f, float scale = 0.7f, float saturation = 1.0f); + +/** @brief The base class for algorithms that align images of the same scene with different exposures + */ +class CV_EXPORTS_W AlignExposures : public Algorithm +{ +public: + /** @brief Aligns images + + @param src vector of input images + @param dst vector of aligned images + @param times vector of exposure time values for each image + @param response 256x1 matrix with inverse camera response function for each pixel value, it should + have the same number of channels as images. + */ + CV_WRAP virtual void process(InputArrayOfArrays src, std::vector& dst, + InputArray times, InputArray response) = 0; +}; + +/** @brief This algorithm converts images to median threshold bitmaps (1 for pixels brighter than median +luminance and 0 otherwise) and than aligns the resulting bitmaps using bit operations. + +It is invariant to exposure, so exposure values and camera response are not necessary. + +In this implementation new image regions are filled with zeros. + +For more information see @cite GW03 . + */ +class CV_EXPORTS_W AlignMTB : public AlignExposures +{ +public: + CV_WRAP virtual void process(InputArrayOfArrays src, std::vector& dst, + InputArray times, InputArray response) CV_OVERRIDE = 0; + + /** @brief Short version of process, that doesn't take extra arguments. + + @param src vector of input images + @param dst vector of aligned images + */ + CV_WRAP virtual void process(InputArrayOfArrays src, std::vector& dst) = 0; + + /** @brief Calculates shift between two images, i. e. how to shift the second image to correspond it with the + first. + + @param img0 first image + @param img1 second image + */ + CV_WRAP virtual Point calculateShift(InputArray img0, InputArray img1) = 0; + /** @brief Helper function, that shift Mat filling new regions with zeros. + + @param src input image + @param dst result image + @param shift shift value + */ + CV_WRAP virtual void shiftMat(InputArray src, OutputArray dst, const Point shift) = 0; + /** @brief Computes median threshold and exclude bitmaps of given image. + + @param img input image + @param tb median threshold bitmap + @param eb exclude bitmap + */ + CV_WRAP virtual void computeBitmaps(InputArray img, OutputArray tb, OutputArray eb) = 0; + + CV_WRAP virtual int getMaxBits() const = 0; + CV_WRAP virtual void setMaxBits(int max_bits) = 0; + + CV_WRAP virtual int getExcludeRange() const = 0; + CV_WRAP virtual void setExcludeRange(int exclude_range) = 0; + + CV_WRAP virtual bool getCut() const = 0; + CV_WRAP virtual void setCut(bool value) = 0; +}; + +/** @brief Creates AlignMTB object + +@param max_bits logarithm to the base 2 of maximal shift in each dimension. Values of 5 and 6 are +usually good enough (31 and 63 pixels shift respectively). +@param exclude_range range for exclusion bitmap that is constructed to suppress noise around the +median value. +@param cut if true cuts images, otherwise fills the new regions with zeros. + */ +CV_EXPORTS_W Ptr createAlignMTB(int max_bits = 6, int exclude_range = 4, bool cut = true); + +/** @brief The base class for camera response calibration algorithms. + */ +class CV_EXPORTS_W CalibrateCRF : public Algorithm +{ +public: + /** @brief Recovers inverse camera response. + + @param src vector of input images + @param dst 256x1 matrix with inverse camera response function + @param times vector of exposure time values for each image + */ + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, InputArray times) = 0; +}; + +/** @brief Inverse camera response function is extracted for each brightness value by minimizing an objective +function as linear system. Objective function is constructed using pixel values on the same position +in all images, extra term is added to make the result smoother. + +For more information see @cite DM97 . + */ +class CV_EXPORTS_W CalibrateDebevec : public CalibrateCRF +{ +public: + CV_WRAP virtual float getLambda() const = 0; + CV_WRAP virtual void setLambda(float lambda) = 0; + + CV_WRAP virtual int getSamples() const = 0; + CV_WRAP virtual void setSamples(int samples) = 0; + + CV_WRAP virtual bool getRandom() const = 0; + CV_WRAP virtual void setRandom(bool random) = 0; +}; + +/** @brief Creates CalibrateDebevec object + +@param samples number of pixel locations to use +@param lambda smoothness term weight. Greater values produce smoother results, but can alter the +response. +@param random if true sample pixel locations are chosen at random, otherwise they form a +rectangular grid. + */ +CV_EXPORTS_W Ptr createCalibrateDebevec(int samples = 70, float lambda = 10.0f, bool random = false); + +/** @brief Inverse camera response function is extracted for each brightness value by minimizing an objective +function as linear system. This algorithm uses all image pixels. + +For more information see @cite RB99 . + */ +class CV_EXPORTS_W CalibrateRobertson : public CalibrateCRF +{ +public: + CV_WRAP virtual int getMaxIter() const = 0; + CV_WRAP virtual void setMaxIter(int max_iter) = 0; + + CV_WRAP virtual float getThreshold() const = 0; + CV_WRAP virtual void setThreshold(float threshold) = 0; + + CV_WRAP virtual Mat getRadiance() const = 0; +}; + +/** @brief Creates CalibrateRobertson object + +@param max_iter maximal number of Gauss-Seidel solver iterations. +@param threshold target difference between results of two successive steps of the minimization. + */ +CV_EXPORTS_W Ptr createCalibrateRobertson(int max_iter = 30, float threshold = 0.01f); + +/** @brief The base class algorithms that can merge exposure sequence to a single image. + */ +class CV_EXPORTS_W MergeExposures : public Algorithm +{ +public: + /** @brief Merges images. + + @param src vector of input images + @param dst result image + @param times vector of exposure time values for each image + @param response 256x1 matrix with inverse camera response function for each pixel value, it should + have the same number of channels as images. + */ + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, + InputArray times, InputArray response) = 0; +}; + +/** @brief The resulting HDR image is calculated as weighted average of the exposures considering exposure +values and camera response. + +For more information see @cite DM97 . + */ +class CV_EXPORTS_W MergeDebevec : public MergeExposures +{ +public: + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, + InputArray times, InputArray response) CV_OVERRIDE = 0; + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, InputArray times) = 0; +}; + +/** @brief Creates MergeDebevec object + */ +CV_EXPORTS_W Ptr createMergeDebevec(); + +/** @brief Pixels are weighted using contrast, saturation and well-exposedness measures, than images are +combined using laplacian pyramids. + +The resulting image weight is constructed as weighted average of contrast, saturation and +well-exposedness measures. + +The resulting image doesn't require tonemapping and can be converted to 8-bit image by multiplying +by 255, but it's recommended to apply gamma correction and/or linear tonemapping. + +For more information see @cite MK07 . + */ +class CV_EXPORTS_W MergeMertens : public MergeExposures +{ +public: + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, + InputArray times, InputArray response) CV_OVERRIDE = 0; + /** @brief Short version of process, that doesn't take extra arguments. + + @param src vector of input images + @param dst result image + */ + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst) = 0; + + CV_WRAP virtual float getContrastWeight() const = 0; + CV_WRAP virtual void setContrastWeight(float contrast_weiht) = 0; + + CV_WRAP virtual float getSaturationWeight() const = 0; + CV_WRAP virtual void setSaturationWeight(float saturation_weight) = 0; + + CV_WRAP virtual float getExposureWeight() const = 0; + CV_WRAP virtual void setExposureWeight(float exposure_weight) = 0; +}; + +/** @brief Creates MergeMertens object + +@param contrast_weight contrast measure weight. See MergeMertens. +@param saturation_weight saturation measure weight +@param exposure_weight well-exposedness measure weight + */ +CV_EXPORTS_W Ptr +createMergeMertens(float contrast_weight = 1.0f, float saturation_weight = 1.0f, float exposure_weight = 0.0f); + +/** @brief The resulting HDR image is calculated as weighted average of the exposures considering exposure +values and camera response. + +For more information see @cite RB99 . + */ +class CV_EXPORTS_W MergeRobertson : public MergeExposures +{ +public: + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, + InputArray times, InputArray response) CV_OVERRIDE = 0; + CV_WRAP virtual void process(InputArrayOfArrays src, OutputArray dst, InputArray times) = 0; +}; + +/** @brief Creates MergeRobertson object + */ +CV_EXPORTS_W Ptr createMergeRobertson(); + +//! @} photo_hdr + +//! @addtogroup photo_decolor +//! @{ + +/** @brief Transforms a color image to a grayscale image. It is a basic tool in digital printing, stylized +black-and-white photograph rendering, and in many single channel image processing applications +@cite CL12 . + +@param src Input 8-bit 3-channel image. +@param grayscale Output 8-bit 1-channel image. +@param color_boost Output 8-bit 3-channel image. + +This function is to be applied on color images. + */ +CV_EXPORTS_W void decolor( InputArray src, OutputArray grayscale, OutputArray color_boost); + +//! @} photo_decolor + +//! @addtogroup photo_clone +//! @{ + + +//! seamlessClone algorithm flags +enum +{ + /** The power of the method is fully expressed when inserting objects with complex outlines into a new background*/ + NORMAL_CLONE = 1, + /** The classic method, color-based selection and alpha masking might be time consuming and often leaves an undesirable + halo. Seamless cloning, even averaged with the original image, is not effective. Mixed seamless cloning based on a loose selection proves effective.*/ + MIXED_CLONE = 2, + /** Monochrome transfer allows the user to easily replace certain features of one object by alternative features.*/ + MONOCHROME_TRANSFER = 3}; + + +/** @example samples/cpp/tutorial_code/photo/seamless_cloning/cloning_demo.cpp +An example using seamlessClone function +*/ +/** @brief Image editing tasks concern either global changes (color/intensity corrections, filters, +deformations) or local changes concerned to a selection. Here we are interested in achieving local +changes, ones that are restricted to a region manually selected (ROI), in a seamless and effortless +manner. The extent of the changes ranges from slight distortions to complete replacement by novel +content @cite PM03 . + +@param src Input 8-bit 3-channel image. +@param dst Input 8-bit 3-channel image. +@param mask Input 8-bit 1 or 3-channel image. +@param p Point in dst image where object is placed. +@param blend Output image with the same size and type as dst. +@param flags Cloning method that could be cv::NORMAL_CLONE, cv::MIXED_CLONE or cv::MONOCHROME_TRANSFER + */ +CV_EXPORTS_W void seamlessClone( InputArray src, InputArray dst, InputArray mask, Point p, + OutputArray blend, int flags); + +/** @brief Given an original color image, two differently colored versions of this image can be mixed +seamlessly. + +@param src Input 8-bit 3-channel image. +@param mask Input 8-bit 1 or 3-channel image. +@param dst Output image with the same size and type as src . +@param red_mul R-channel multiply factor. +@param green_mul G-channel multiply factor. +@param blue_mul B-channel multiply factor. + +Multiplication factor is between .5 to 2.5. + */ +CV_EXPORTS_W void colorChange(InputArray src, InputArray mask, OutputArray dst, float red_mul = 1.0f, + float green_mul = 1.0f, float blue_mul = 1.0f); + +/** @brief Applying an appropriate non-linear transformation to the gradient field inside the selection and +then integrating back with a Poisson solver, modifies locally the apparent illumination of an image. + +@param src Input 8-bit 3-channel image. +@param mask Input 8-bit 1 or 3-channel image. +@param dst Output image with the same size and type as src. +@param alpha Value ranges between 0-2. +@param beta Value ranges between 0-2. + +This is useful to highlight under-exposed foreground objects or to reduce specular reflections. + */ +CV_EXPORTS_W void illuminationChange(InputArray src, InputArray mask, OutputArray dst, + float alpha = 0.2f, float beta = 0.4f); + +/** @brief By retaining only the gradients at edge locations, before integrating with the Poisson solver, one +washes out the texture of the selected region, giving its contents a flat aspect. Here Canny Edge %Detector is used. + +@param src Input 8-bit 3-channel image. +@param mask Input 8-bit 1 or 3-channel image. +@param dst Output image with the same size and type as src. +@param low_threshold %Range from 0 to 100. +@param high_threshold Value \> 100. +@param kernel_size The size of the Sobel kernel to be used. + +@note +The algorithm assumes that the color of the source image is close to that of the destination. This +assumption means that when the colors don't match, the source image color gets tinted toward the +color of the destination image. + */ +CV_EXPORTS_W void textureFlattening(InputArray src, InputArray mask, OutputArray dst, + float low_threshold = 30, float high_threshold = 45, + int kernel_size = 3); + +//! @} photo_clone + +//! @addtogroup photo_render +//! @{ + +//! Edge preserving filters +enum +{ + RECURS_FILTER = 1, //!< Recursive Filtering + NORMCONV_FILTER = 2 //!< Normalized Convolution Filtering +}; + +/** @brief Filtering is the fundamental operation in image and video processing. Edge-preserving smoothing +filters are used in many different applications @cite EM11 . + +@param src Input 8-bit 3-channel image. +@param dst Output 8-bit 3-channel image. +@param flags Edge preserving filters: cv::RECURS_FILTER or cv::NORMCONV_FILTER +@param sigma_s %Range between 0 to 200. +@param sigma_r %Range between 0 to 1. + */ +CV_EXPORTS_W void edgePreservingFilter(InputArray src, OutputArray dst, int flags = 1, + float sigma_s = 60, float sigma_r = 0.4f); + +/** @brief This filter enhances the details of a particular image. + +@param src Input 8-bit 3-channel image. +@param dst Output image with the same size and type as src. +@param sigma_s %Range between 0 to 200. +@param sigma_r %Range between 0 to 1. + */ +CV_EXPORTS_W void detailEnhance(InputArray src, OutputArray dst, float sigma_s = 10, + float sigma_r = 0.15f); + +/** @example samples/cpp/tutorial_code/photo/non_photorealistic_rendering/npr_demo.cpp +An example using non-photorealistic line drawing functions +*/ +/** @brief Pencil-like non-photorealistic line drawing + +@param src Input 8-bit 3-channel image. +@param dst1 Output 8-bit 1-channel image. +@param dst2 Output image with the same size and type as src. +@param sigma_s %Range between 0 to 200. +@param sigma_r %Range between 0 to 1. +@param shade_factor %Range between 0 to 0.1. + */ +CV_EXPORTS_W void pencilSketch(InputArray src, OutputArray dst1, OutputArray dst2, + float sigma_s = 60, float sigma_r = 0.07f, float shade_factor = 0.02f); + +/** @brief Stylization aims to produce digital imagery with a wide variety of effects not focused on +photorealism. Edge-aware filters are ideal for stylization, as they can abstract regions of low +contrast while preserving, or enhancing, high-contrast features. + +@param src Input 8-bit 3-channel image. +@param dst Output image with the same size and type as src. +@param sigma_s %Range between 0 to 200. +@param sigma_r %Range between 0 to 1. + */ +CV_EXPORTS_W void stylization(InputArray src, OutputArray dst, float sigma_s = 60, + float sigma_r = 0.45f); + +//! @} photo_render + +//! @} photo + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/photo/cuda.hpp b/Thirdparty/opencv2/include/opencv2/photo/cuda.hpp new file mode 100644 index 0000000..709ad2d --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/photo/cuda.hpp @@ -0,0 +1,157 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2008-2012, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_PHOTO_CUDA_HPP +#define OPENCV_PHOTO_CUDA_HPP + +#include "opencv2/core/cuda.hpp" + +namespace cv { namespace cuda { + +//! @addtogroup photo_denoise +//! @{ + +/** @brief Performs pure non local means denoising without any simplification, and thus it is not fast. + +@param src Source image. Supports only CV_8UC1, CV_8UC2 and CV_8UC3. +@param dst Destination image. +@param h Filter sigma regulating filter strength for color. +@param search_window Size of search window. +@param block_size Size of block used for computing weights. +@param borderMode Border type. See borderInterpolate for details. BORDER_REFLECT101 , +BORDER_REPLICATE , BORDER_CONSTANT , BORDER_REFLECT and BORDER_WRAP are supported for now. +@param stream Stream for the asynchronous version. + +@sa + fastNlMeansDenoising + */ +CV_EXPORTS void nonLocalMeans(InputArray src, OutputArray dst, + float h, + int search_window = 21, + int block_size = 7, + int borderMode = BORDER_DEFAULT, + Stream& stream = Stream::Null()); +CV_WRAP inline void nonLocalMeans(const GpuMat& src, CV_OUT GpuMat& dst, + float h, + int search_window = 21, + int block_size = 7, + int borderMode = BORDER_DEFAULT, + Stream& stream = Stream::Null()) +{ + nonLocalMeans(InputArray(src), OutputArray(dst), h, search_window, block_size, borderMode, stream); +} + +/** @brief Perform image denoising using Non-local Means Denoising algorithm + with several computational +optimizations. Noise expected to be a gaussian white noise + +@param src Input 8-bit 1-channel, 2-channel or 3-channel image. +@param dst Output image with the same size and type as src . +@param h Parameter regulating filter strength. Big h value perfectly removes noise but also +removes image details, smaller h value preserves details but also preserves some noise +@param search_window Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater search_window - greater +denoising time. Recommended value 21 pixels +@param block_size Size in pixels of the template patch that is used to compute weights. Should be +odd. Recommended value 7 pixels +@param stream Stream for the asynchronous invocations. + +This function expected to be applied to grayscale images. For colored images look at +FastNonLocalMeansDenoising::labMethod. + +@sa + fastNlMeansDenoising + */ +CV_EXPORTS void fastNlMeansDenoising(InputArray src, OutputArray dst, + float h, + int search_window = 21, + int block_size = 7, + Stream& stream = Stream::Null()); +CV_WRAP inline void fastNlMeansDenoising(const GpuMat& src, CV_OUT GpuMat& dst, + float h, + int search_window = 21, + int block_size = 7, + Stream& stream = Stream::Null()) +{ + fastNlMeansDenoising(InputArray(src), OutputArray(dst), h, search_window, block_size, stream); +} + +/** @brief Modification of fastNlMeansDenoising function for colored images + +@param src Input 8-bit 3-channel image. +@param dst Output image with the same size and type as src . +@param h_luminance Parameter regulating filter strength. Big h value perfectly removes noise but +also removes image details, smaller h value preserves details but also preserves some noise +@param photo_render float The same as h but for color components. For most images value equals 10 will be +enough to remove colored noise and do not distort colors +@param search_window Size in pixels of the window that is used to compute weighted average for +given pixel. Should be odd. Affect performance linearly: greater search_window - greater +denoising time. Recommended value 21 pixels +@param block_size Size in pixels of the template patch that is used to compute weights. Should be +odd. Recommended value 7 pixels +@param stream Stream for the asynchronous invocations. + +The function converts image to CIELAB colorspace and then separately denoise L and AB components +with given h parameters using FastNonLocalMeansDenoising::simpleMethod function. + +@sa + fastNlMeansDenoisingColored + */ +CV_EXPORTS void fastNlMeansDenoisingColored(InputArray src, OutputArray dst, + float h_luminance, float photo_render, + int search_window = 21, + int block_size = 7, + Stream& stream = Stream::Null()); +CV_WRAP inline void fastNlMeansDenoisingColored(const GpuMat& src, CV_OUT GpuMat& dst, + float h_luminance, float photo_render, + int search_window = 21, + int block_size = 7, + Stream& stream = Stream::Null()) +{ + fastNlMeansDenoisingColored(InputArray(src), OutputArray(dst), h_luminance, photo_render, search_window, block_size, stream); +} + +//! @} photo + +}} // namespace cv { namespace cuda { + +#endif /* OPENCV_PHOTO_CUDA_HPP */ diff --git a/Thirdparty/opencv2/include/opencv2/photo/legacy/constants_c.h b/Thirdparty/opencv2/include/opencv2/photo/legacy/constants_c.h new file mode 100644 index 0000000..ec1d440 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/photo/legacy/constants_c.h @@ -0,0 +1,14 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_PHOTO_LEGACY_CONSTANTS_H +#define OPENCV_PHOTO_LEGACY_CONSTANTS_H + +enum InpaintingModes +{ + CV_INPAINT_NS =0, + CV_INPAINT_TELEA =1 +}; + +#endif // OPENCV_PHOTO_LEGACY_CONSTANTS_H diff --git a/Thirdparty/opencv2/include/opencv2/photo/photo.hpp b/Thirdparty/opencv2/include/opencv2/photo/photo.hpp new file mode 100644 index 0000000..8af5e9f --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/photo/photo.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/photo.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/stitching.hpp b/Thirdparty/opencv2/include/opencv2/stitching.hpp new file mode 100644 index 0000000..8a81223 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching.hpp @@ -0,0 +1,365 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_STITCHER_HPP +#define OPENCV_STITCHING_STITCHER_HPP + +#include "opencv2/core.hpp" +#include "opencv2/features2d.hpp" +#include "opencv2/stitching/warpers.hpp" +#include "opencv2/stitching/detail/matchers.hpp" +#include "opencv2/stitching/detail/motion_estimators.hpp" +#include "opencv2/stitching/detail/exposure_compensate.hpp" +#include "opencv2/stitching/detail/seam_finders.hpp" +#include "opencv2/stitching/detail/blenders.hpp" +#include "opencv2/stitching/detail/camera.hpp" + + +#if defined(Status) +# warning Detected X11 'Status' macro definition, it can cause build conflicts. Please, include this header before any X11 headers. +#endif + + +/** +@defgroup stitching Images stitching + +This figure illustrates the stitching module pipeline implemented in the Stitcher class. Using that +class it's possible to configure/remove some steps, i.e. adjust the stitching pipeline according to +the particular needs. All building blocks from the pipeline are available in the detail namespace, +one can combine and use them separately. + +The implemented stitching pipeline is very similar to the one proposed in @cite BL07 . + +![stitching pipeline](StitchingPipeline.jpg) + +Camera models +------------- + +There are currently 2 camera models implemented in stitching pipeline. + +- _Homography model_ expecting perspective transformations between images + implemented in @ref cv::detail::BestOf2NearestMatcher cv::detail::HomographyBasedEstimator + cv::detail::BundleAdjusterReproj cv::detail::BundleAdjusterRay +- _Affine model_ expecting affine transformation with 6 DOF or 4 DOF implemented in + @ref cv::detail::AffineBestOf2NearestMatcher cv::detail::AffineBasedEstimator + cv::detail::BundleAdjusterAffine cv::detail::BundleAdjusterAffinePartial cv::AffineWarper + +Homography model is useful for creating photo panoramas captured by camera, +while affine-based model can be used to stitch scans and object captured by +specialized devices. Use @ref cv::Stitcher::create to get preconfigured pipeline for one +of those models. + +@note +Certain detailed settings of @ref cv::Stitcher might not make sense. Especially +you should not mix classes implementing affine model and classes implementing +Homography model, as they work with different transformations. + +@{ + @defgroup stitching_match Features Finding and Images Matching + @defgroup stitching_rotation Rotation Estimation + @defgroup stitching_autocalib Autocalibration + @defgroup stitching_warp Images Warping + @defgroup stitching_seam Seam Estimation + @defgroup stitching_exposure Exposure Compensation + @defgroup stitching_blend Image Blenders +@} + */ + +namespace cv { + +//! @addtogroup stitching +//! @{ + +/** @example samples/cpp/stitching.cpp +A basic example on image stitching +*/ + +/** @example samples/python/stitching.py +A basic example on image stitching in Python. +*/ + +/** @example samples/cpp/stitching_detailed.cpp +A detailed example on image stitching +*/ + +/** @brief High level image stitcher. + +It's possible to use this class without being aware of the entire stitching pipeline. However, to +be able to achieve higher stitching stability and quality of the final images at least being +familiar with the theory is recommended. + +@note +- A basic example on image stitching can be found at + opencv_source_code/samples/cpp/stitching.cpp +- A basic example on image stitching in Python can be found at + opencv_source_code/samples/python/stitching.py +- A detailed example on image stitching can be found at + opencv_source_code/samples/cpp/stitching_detailed.cpp + */ +class CV_EXPORTS_W Stitcher +{ +public: + /** + * When setting a resolution for stitching, this values is a placeholder + * for preserving the original resolution. + */ +#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/) + static constexpr double ORIG_RESOL = -1.0; +#else + // support MSVS 2013 + static const double ORIG_RESOL; // Initialized in stitcher.cpp +#endif + + enum Status + { + OK = 0, + ERR_NEED_MORE_IMGS = 1, + ERR_HOMOGRAPHY_EST_FAIL = 2, + ERR_CAMERA_PARAMS_ADJUST_FAIL = 3 + }; + + enum Mode + { + /** Mode for creating photo panoramas. Expects images under perspective + transformation and projects resulting pano to sphere. + + @sa detail::BestOf2NearestMatcher SphericalWarper + */ + PANORAMA = 0, + /** Mode for composing scans. Expects images under affine transformation does + not compensate exposure by default. + + @sa detail::AffineBestOf2NearestMatcher AffineWarper + */ + SCANS = 1, + + }; + + /** @brief Creates a Stitcher configured in one of the stitching modes. + + @param mode Scenario for stitcher operation. This is usually determined by source of images + to stitch and their transformation. Default parameters will be chosen for operation in given + scenario. + @return Stitcher class instance. + */ + CV_WRAP static Ptr create(Mode mode = Stitcher::PANORAMA); + + CV_WRAP double registrationResol() const { return registr_resol_; } + CV_WRAP void setRegistrationResol(double resol_mpx) { registr_resol_ = resol_mpx; } + + CV_WRAP double seamEstimationResol() const { return seam_est_resol_; } + CV_WRAP void setSeamEstimationResol(double resol_mpx) { seam_est_resol_ = resol_mpx; } + + CV_WRAP double compositingResol() const { return compose_resol_; } + CV_WRAP void setCompositingResol(double resol_mpx) { compose_resol_ = resol_mpx; } + + CV_WRAP double panoConfidenceThresh() const { return conf_thresh_; } + CV_WRAP void setPanoConfidenceThresh(double conf_thresh) { conf_thresh_ = conf_thresh; } + + CV_WRAP bool waveCorrection() const { return do_wave_correct_; } + CV_WRAP void setWaveCorrection(bool flag) { do_wave_correct_ = flag; } + + CV_WRAP InterpolationFlags interpolationFlags() const { return interp_flags_; } + CV_WRAP void setInterpolationFlags(InterpolationFlags interp_flags) { interp_flags_ = interp_flags; } + + detail::WaveCorrectKind waveCorrectKind() const { return wave_correct_kind_; } + void setWaveCorrectKind(detail::WaveCorrectKind kind) { wave_correct_kind_ = kind; } + + Ptr featuresFinder() { return features_finder_; } + Ptr featuresFinder() const { return features_finder_; } + void setFeaturesFinder(Ptr features_finder) + { features_finder_ = features_finder; } + + Ptr featuresMatcher() { return features_matcher_; } + Ptr featuresMatcher() const { return features_matcher_; } + void setFeaturesMatcher(Ptr features_matcher) + { features_matcher_ = features_matcher; } + + const cv::UMat& matchingMask() const { return matching_mask_; } + void setMatchingMask(const cv::UMat &mask) + { + CV_Assert(mask.type() == CV_8U && mask.cols == mask.rows); + matching_mask_ = mask.clone(); + } + + Ptr bundleAdjuster() { return bundle_adjuster_; } + const Ptr bundleAdjuster() const { return bundle_adjuster_; } + void setBundleAdjuster(Ptr bundle_adjuster) + { bundle_adjuster_ = bundle_adjuster; } + + Ptr estimator() { return estimator_; } + const Ptr estimator() const { return estimator_; } + void setEstimator(Ptr estimator) + { estimator_ = estimator; } + + Ptr warper() { return warper_; } + const Ptr warper() const { return warper_; } + void setWarper(Ptr creator) { warper_ = creator; } + + Ptr exposureCompensator() { return exposure_comp_; } + const Ptr exposureCompensator() const { return exposure_comp_; } + void setExposureCompensator(Ptr exposure_comp) + { exposure_comp_ = exposure_comp; } + + Ptr seamFinder() { return seam_finder_; } + const Ptr seamFinder() const { return seam_finder_; } + void setSeamFinder(Ptr seam_finder) { seam_finder_ = seam_finder; } + + Ptr blender() { return blender_; } + const Ptr blender() const { return blender_; } + void setBlender(Ptr b) { blender_ = b; } + + /** @brief These functions try to match the given images and to estimate rotations of each camera. + + @note Use the functions only if you're aware of the stitching pipeline, otherwise use + Stitcher::stitch. + + @param images Input images. + @param masks Masks for each input image specifying where to look for keypoints (optional). + @return Status code. + */ + CV_WRAP Status estimateTransform(InputArrayOfArrays images, InputArrayOfArrays masks = noArray()); + + /** @brief These function restors camera rotation and camera intrinsics of each camera + * that can be got with @ref Stitcher::cameras call + + @param images Input images. + @param cameras Estimated rotation of cameras for each of the input images. + @param component Indices (0-based) of images constituting the final panorama (optional). + @return Status code. + */ + Status setTransform(InputArrayOfArrays images, + const std::vector &cameras, + const std::vector &component); + /** @overload */ + Status setTransform(InputArrayOfArrays images, const std::vector &cameras); + + /** @overload */ + CV_WRAP Status composePanorama(OutputArray pano); + /** @brief These functions try to compose the given images (or images stored internally from the other function + calls) into the final pano under the assumption that the image transformations were estimated + before. + + @note Use the functions only if you're aware of the stitching pipeline, otherwise use + Stitcher::stitch. + + @param images Input images. + @param pano Final pano. + @return Status code. + */ + CV_WRAP Status composePanorama(InputArrayOfArrays images, OutputArray pano); + + /** @overload */ + CV_WRAP Status stitch(InputArrayOfArrays images, OutputArray pano); + /** @brief These functions try to stitch the given images. + + @param images Input images. + @param masks Masks for each input image specifying where to look for keypoints (optional). + @param pano Final pano. + @return Status code. + */ + CV_WRAP Status stitch(InputArrayOfArrays images, InputArrayOfArrays masks, OutputArray pano); + + std::vector component() const { return indices_; } + std::vector cameras() const { return cameras_; } + CV_WRAP double workScale() const { return work_scale_; } + + /** @brief Return the mask of the panorama. + + The mask is a 8U UMat with the values: 0xFF (white) for pixels filled by the input images, + 0 (black) for unused pixels. It can be used as the mask for inpaint. + + @return The mask. + */ + UMat resultMask() const { return result_mask_; } + +private: + Status matchImages(); + Status estimateCameraParams(); + + double registr_resol_; + double seam_est_resol_; + double compose_resol_; + double conf_thresh_; + InterpolationFlags interp_flags_; + Ptr features_finder_; + Ptr features_matcher_; + cv::UMat matching_mask_; + Ptr bundle_adjuster_; + Ptr estimator_; + bool do_wave_correct_; + detail::WaveCorrectKind wave_correct_kind_; + Ptr warper_; + Ptr exposure_comp_; + Ptr seam_finder_; + Ptr blender_; + + std::vector imgs_; + std::vector masks_; + std::vector full_img_sizes_; + std::vector features_; + std::vector pairwise_matches_; + std::vector seam_est_imgs_; + std::vector indices_; + std::vector cameras_; + UMat result_mask_; + double work_scale_; + double seam_scale_; + double seam_work_aspect_; + double warped_image_scale_; +}; + +/** + * @deprecated use Stitcher::create + */ +CV_DEPRECATED Ptr createStitcher(bool try_use_gpu = false); + +/** + * @deprecated use Stitcher::create + */ +CV_DEPRECATED Ptr createStitcherScans(bool try_use_gpu = false); + +//! @} stitching + +} // namespace cv + +#endif // OPENCV_STITCHING_STITCHER_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/autocalib.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/autocalib.hpp new file mode 100644 index 0000000..8eb6212 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/autocalib.hpp @@ -0,0 +1,86 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_AUTOCALIB_HPP +#define OPENCV_STITCHING_AUTOCALIB_HPP + +#include "opencv2/core.hpp" +#include "matchers.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_autocalib +//! @{ + +/** @brief Tries to estimate focal lengths from the given homography under the assumption that the camera +undergoes rotations around its centre only. + +@param H Homography. +@param f0 Estimated focal length along X axis. +@param f1 Estimated focal length along Y axis. +@param f0_ok True, if f0 was estimated successfully, false otherwise. +@param f1_ok True, if f1 was estimated successfully, false otherwise. + +See "Construction of Panoramic Image Mosaics with Global and Local Alignment" +by Heung-Yeung Shum and Richard Szeliski. + */ +void CV_EXPORTS_W focalsFromHomography(const Mat &H, double &f0, double &f1, bool &f0_ok, bool &f1_ok); + +/** @brief Estimates focal lengths for each given camera. + +@param features Features of images. +@param pairwise_matches Matches between all image pairs. +@param focals Estimated focal lengths for each camera. + */ +void CV_EXPORTS estimateFocal(const std::vector &features, + const std::vector &pairwise_matches, + std::vector &focals); + +bool CV_EXPORTS_W calibrateRotatingCamera(const std::vector &Hs,CV_OUT Mat &K); + +//! @} stitching_autocalib + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_AUTOCALIB_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/blenders.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/blenders.hpp new file mode 100644 index 0000000..ec35aa7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/blenders.hpp @@ -0,0 +1,184 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_BLENDERS_HPP +#define OPENCV_STITCHING_BLENDERS_HPP + +#if defined(NO) +# warning Detected Apple 'NO' macro definition, it can cause build conflicts. Please, include this header before any Apple headers. +#endif + +#include "opencv2/core.hpp" +#include "opencv2/core/cuda.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_blend +//! @{ + +/** @brief Base class for all blenders. + +Simple blender which puts one image over another +*/ +class CV_EXPORTS_W Blender +{ +public: + virtual ~Blender() {} + + enum { NO, FEATHER, MULTI_BAND }; + CV_WRAP static Ptr createDefault(int type, bool try_gpu = false); + + /** @brief Prepares the blender for blending. + + @param corners Source images top-left corners + @param sizes Source image sizes + */ + CV_WRAP virtual void prepare(const std::vector &corners, const std::vector &sizes); + /** @overload */ + CV_WRAP virtual void prepare(Rect dst_roi); + /** @brief Processes the image. + + @param img Source image + @param mask Source image mask + @param tl Source image top-left corners + */ + CV_WRAP virtual void feed(InputArray img, InputArray mask, Point tl); + /** @brief Blends and returns the final pano. + + @param dst Final pano + @param dst_mask Final pano mask + */ + CV_WRAP virtual void blend(CV_IN_OUT InputOutputArray dst,CV_IN_OUT InputOutputArray dst_mask); + +protected: + UMat dst_, dst_mask_; + Rect dst_roi_; +}; + +/** @brief Simple blender which mixes images at its borders. + */ +class CV_EXPORTS_W FeatherBlender : public Blender +{ +public: + CV_WRAP FeatherBlender(float sharpness = 0.02f); + + CV_WRAP float sharpness() const { return sharpness_; } + CV_WRAP void setSharpness(float val) { sharpness_ = val; } + + CV_WRAP void prepare(Rect dst_roi) CV_OVERRIDE; + CV_WRAP void feed(InputArray img, InputArray mask, Point tl) CV_OVERRIDE; + CV_WRAP void blend(InputOutputArray dst, InputOutputArray dst_mask) CV_OVERRIDE; + + //! Creates weight maps for fixed set of source images by their masks and top-left corners. + //! Final image can be obtained by simple weighting of the source images. + CV_WRAP Rect createWeightMaps(const std::vector &masks, const std::vector &corners, + CV_IN_OUT std::vector &weight_maps); + +private: + float sharpness_; + UMat weight_map_; + UMat dst_weight_map_; +}; + +inline FeatherBlender::FeatherBlender(float _sharpness) { setSharpness(_sharpness); } + +/** @brief Blender which uses multi-band blending algorithm (see @cite BA83). + */ +class CV_EXPORTS_W MultiBandBlender : public Blender +{ +public: + CV_WRAP MultiBandBlender(int try_gpu = false, int num_bands = 5, int weight_type = CV_32F); + + CV_WRAP int numBands() const { return actual_num_bands_; } + CV_WRAP void setNumBands(int val) { actual_num_bands_ = val; } + + CV_WRAP void prepare(Rect dst_roi) CV_OVERRIDE; + CV_WRAP void feed(InputArray img, InputArray mask, Point tl) CV_OVERRIDE; + CV_WRAP void blend(CV_IN_OUT InputOutputArray dst, CV_IN_OUT InputOutputArray dst_mask) CV_OVERRIDE; + +private: + int actual_num_bands_, num_bands_; + std::vector dst_pyr_laplace_; + std::vector dst_band_weights_; + Rect dst_roi_final_; + bool can_use_gpu_; + int weight_type_; //CV_32F or CV_16S +#if defined(HAVE_OPENCV_CUDAARITHM) && defined(HAVE_OPENCV_CUDAWARPING) + std::vector gpu_dst_pyr_laplace_; + std::vector gpu_dst_band_weights_; + std::vector gpu_tl_points_; + std::vector gpu_imgs_with_border_; + std::vector > gpu_weight_pyr_gauss_vec_; + std::vector > gpu_src_pyr_laplace_vec_; + std::vector > gpu_ups_; + cuda::GpuMat gpu_dst_mask_; + cuda::GpuMat gpu_mask_; + cuda::GpuMat gpu_img_; + cuda::GpuMat gpu_weight_map_; + cuda::GpuMat gpu_add_mask_; + int gpu_feed_idx_; + bool gpu_initialized_; +#endif +}; + + +////////////////////////////////////////////////////////////////////////////// +// Auxiliary functions + +void CV_EXPORTS_W normalizeUsingWeightMap(InputArray weight, CV_IN_OUT InputOutputArray src); + +void CV_EXPORTS_W createWeightMap(InputArray mask, float sharpness, CV_IN_OUT InputOutputArray weight); + +void CV_EXPORTS_W createLaplacePyr(InputArray img, int num_levels, CV_IN_OUT std::vector& pyr); +void CV_EXPORTS_W createLaplacePyrGpu(InputArray img, int num_levels, CV_IN_OUT std::vector& pyr); + +// Restores source image +void CV_EXPORTS_W restoreImageFromLaplacePyr(CV_IN_OUT std::vector& pyr); +void CV_EXPORTS_W restoreImageFromLaplacePyrGpu(CV_IN_OUT std::vector& pyr); + +//! @} + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_BLENDERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/camera.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/camera.hpp new file mode 100644 index 0000000..14ecf60 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/camera.hpp @@ -0,0 +1,78 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_CAMERA_HPP +#define OPENCV_STITCHING_CAMERA_HPP + +#include "opencv2/core.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching +//! @{ + +/** @brief Describes camera parameters. + +@note Translation is assumed to be zero during the whole stitching pipeline. : + */ +struct CV_EXPORTS_W_SIMPLE CameraParams +{ + CameraParams(); + CameraParams(const CameraParams& other); + CameraParams& operator =(const CameraParams& other); + CV_WRAP Mat K() const; + + CV_PROP_RW double focal; // Focal length + CV_PROP_RW double aspect; // Aspect ratio + CV_PROP_RW double ppx; // Principal point X + CV_PROP_RW double ppy; // Principal point Y + CV_PROP_RW Mat R; // Rotation + CV_PROP_RW Mat t; // Translation +}; + +//! @} + +} // namespace detail +} // namespace cv + +#endif // #ifndef OPENCV_STITCHING_CAMERA_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/exposure_compensate.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/exposure_compensate.hpp new file mode 100644 index 0000000..dea76c9 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/exposure_compensate.hpp @@ -0,0 +1,245 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_EXPOSURE_COMPENSATE_HPP +#define OPENCV_STITCHING_EXPOSURE_COMPENSATE_HPP + +#if defined(NO) +# warning Detected Apple 'NO' macro definition, it can cause build conflicts. Please, include this header before any Apple headers. +#endif + +#include "opencv2/core.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_exposure +//! @{ + +/** @brief Base class for all exposure compensators. + */ +class CV_EXPORTS_W ExposureCompensator +{ +public: + ExposureCompensator(): updateGain(true) {} + virtual ~ExposureCompensator() {} + + enum { NO, GAIN, GAIN_BLOCKS, CHANNELS, CHANNELS_BLOCKS }; + CV_WRAP static Ptr createDefault(int type); + + /** + @param corners Source image top-left corners + @param images Source images + @param masks Image masks to update (second value in pair specifies the value which should be used + to detect where image is) + */ + CV_WRAP void feed(const std::vector &corners, const std::vector &images, + const std::vector &masks); + /** @overload */ + virtual void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks) = 0; + /** @brief Compensate exposure in the specified image. + + @param index Image index + @param corner Image top-left corner + @param image Image to process + @param mask Image mask + */ + CV_WRAP virtual void apply(int index, Point corner, InputOutputArray image, InputArray mask) = 0; + CV_WRAP virtual void getMatGains(CV_OUT std::vector& ) {CV_Error(Error::StsInternal, "");} + CV_WRAP virtual void setMatGains(std::vector& ) { CV_Error(Error::StsInternal, ""); } + CV_WRAP void setUpdateGain(bool b) { updateGain = b; } + CV_WRAP bool getUpdateGain() { return updateGain; } +protected : + bool updateGain; +}; + +/** @brief Stub exposure compensator which does nothing. + */ +class CV_EXPORTS_W NoExposureCompensator : public ExposureCompensator +{ +public: + void feed(const std::vector &/*corners*/, const std::vector &/*images*/, + const std::vector > &/*masks*/) CV_OVERRIDE { } + CV_WRAP void apply(int /*index*/, Point /*corner*/, InputOutputArray /*image*/, InputArray /*mask*/) CV_OVERRIDE { } + CV_WRAP void getMatGains(CV_OUT std::vector& umv) CV_OVERRIDE { umv.clear(); return; } + CV_WRAP void setMatGains(std::vector& umv) CV_OVERRIDE { umv.clear(); return; } +}; + +/** @brief Exposure compensator which tries to remove exposure related artifacts by adjusting image +intensities, see @cite BL07 and @cite WJ10 for details. + */ +class CV_EXPORTS_W GainCompensator : public ExposureCompensator +{ +public: + // This Constructor only exists to make source level compatibility detector happy + CV_WRAP GainCompensator() + : GainCompensator(1) {} + CV_WRAP GainCompensator(int nr_feeds) + : nr_feeds_(nr_feeds), similarity_threshold_(1) {} + void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks) CV_OVERRIDE; + void singleFeed(const std::vector &corners, const std::vector &images, + const std::vector > &masks); + CV_WRAP void apply(int index, Point corner, InputOutputArray image, InputArray mask) CV_OVERRIDE; + CV_WRAP void getMatGains(CV_OUT std::vector& umv) CV_OVERRIDE ; + CV_WRAP void setMatGains(std::vector& umv) CV_OVERRIDE ; + CV_WRAP void setNrFeeds(int nr_feeds) { nr_feeds_ = nr_feeds; } + CV_WRAP int getNrFeeds() { return nr_feeds_; } + CV_WRAP void setSimilarityThreshold(double similarity_threshold) { similarity_threshold_ = similarity_threshold; } + CV_WRAP double getSimilarityThreshold() const { return similarity_threshold_; } + void prepareSimilarityMask(const std::vector &corners, const std::vector &images); + std::vector gains() const; + +private: + UMat buildSimilarityMask(InputArray src_array1, InputArray src_array2); + + Mat_ gains_; + int nr_feeds_; + double similarity_threshold_; + std::vector similarities_; +}; + +/** @brief Exposure compensator which tries to remove exposure related artifacts by adjusting image +intensities on each channel independently. + */ +class CV_EXPORTS_W ChannelsCompensator : public ExposureCompensator +{ +public: + CV_WRAP ChannelsCompensator(int nr_feeds=1) + : nr_feeds_(nr_feeds), similarity_threshold_(1) {} + void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks) CV_OVERRIDE; + CV_WRAP void apply(int index, Point corner, InputOutputArray image, InputArray mask) CV_OVERRIDE; + CV_WRAP void getMatGains(CV_OUT std::vector& umv) CV_OVERRIDE; + CV_WRAP void setMatGains(std::vector& umv) CV_OVERRIDE; + CV_WRAP void setNrFeeds(int nr_feeds) { nr_feeds_ = nr_feeds; } + CV_WRAP int getNrFeeds() { return nr_feeds_; } + CV_WRAP void setSimilarityThreshold(double similarity_threshold) { similarity_threshold_ = similarity_threshold; } + CV_WRAP double getSimilarityThreshold() const { return similarity_threshold_; } + std::vector gains() const { return gains_; } + +private: + std::vector gains_; + int nr_feeds_; + double similarity_threshold_; +}; + +/** @brief Exposure compensator which tries to remove exposure related artifacts by adjusting image blocks. + */ +class CV_EXPORTS_W BlocksCompensator : public ExposureCompensator +{ +public: + BlocksCompensator(int bl_width=32, int bl_height=32, int nr_feeds=1) + : bl_width_(bl_width), bl_height_(bl_height), nr_feeds_(nr_feeds), nr_gain_filtering_iterations_(2), + similarity_threshold_(1) {} + CV_WRAP void apply(int index, Point corner, InputOutputArray image, InputArray mask) CV_OVERRIDE; + CV_WRAP void getMatGains(CV_OUT std::vector& umv) CV_OVERRIDE; + CV_WRAP void setMatGains(std::vector& umv) CV_OVERRIDE; + CV_WRAP void setNrFeeds(int nr_feeds) { nr_feeds_ = nr_feeds; } + CV_WRAP int getNrFeeds() { return nr_feeds_; } + CV_WRAP void setSimilarityThreshold(double similarity_threshold) { similarity_threshold_ = similarity_threshold; } + CV_WRAP double getSimilarityThreshold() const { return similarity_threshold_; } + CV_WRAP void setBlockSize(int width, int height) { bl_width_ = width; bl_height_ = height; } + CV_WRAP void setBlockSize(Size size) { setBlockSize(size.width, size.height); } + CV_WRAP Size getBlockSize() const { return Size(bl_width_, bl_height_); } + CV_WRAP void setNrGainsFilteringIterations(int nr_iterations) { nr_gain_filtering_iterations_ = nr_iterations; } + CV_WRAP int getNrGainsFilteringIterations() const { return nr_gain_filtering_iterations_; } + +protected: + template + void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks); + +private: + UMat getGainMap(const GainCompensator& compensator, int bl_idx, Size bl_per_img); + UMat getGainMap(const ChannelsCompensator& compensator, int bl_idx, Size bl_per_img); + + int bl_width_, bl_height_; + std::vector gain_maps_; + int nr_feeds_; + int nr_gain_filtering_iterations_; + double similarity_threshold_; +}; + +/** @brief Exposure compensator which tries to remove exposure related artifacts by adjusting image block +intensities, see @cite UES01 for details. + */ +class CV_EXPORTS_W BlocksGainCompensator : public BlocksCompensator +{ +public: + // This Constructor only exists to make source level compatibility detector happy + CV_WRAP BlocksGainCompensator(int bl_width = 32, int bl_height = 32) + : BlocksGainCompensator(bl_width, bl_height, 1) {} + CV_WRAP BlocksGainCompensator(int bl_width, int bl_height, int nr_feeds) + : BlocksCompensator(bl_width, bl_height, nr_feeds) {} + + void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks) CV_OVERRIDE; + + // This function only exists to make source level compatibility detector happy + CV_WRAP void apply(int index, Point corner, InputOutputArray image, InputArray mask) CV_OVERRIDE { + BlocksCompensator::apply(index, corner, image, mask); } + // This function only exists to make source level compatibility detector happy + CV_WRAP void getMatGains(CV_OUT std::vector& umv) CV_OVERRIDE { BlocksCompensator::getMatGains(umv); } + // This function only exists to make source level compatibility detector happy + CV_WRAP void setMatGains(std::vector& umv) CV_OVERRIDE { BlocksCompensator::setMatGains(umv); } +}; + +/** @brief Exposure compensator which tries to remove exposure related artifacts by adjusting image block +on each channel. + */ +class CV_EXPORTS_W BlocksChannelsCompensator : public BlocksCompensator +{ +public: + CV_WRAP BlocksChannelsCompensator(int bl_width=32, int bl_height=32, int nr_feeds=1) + : BlocksCompensator(bl_width, bl_height, nr_feeds) {} + + void feed(const std::vector &corners, const std::vector &images, + const std::vector > &masks) CV_OVERRIDE; +}; +//! @} + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_EXPOSURE_COMPENSATE_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/matchers.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/matchers.hpp new file mode 100644 index 0000000..e256683 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/matchers.hpp @@ -0,0 +1,267 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_MATCHERS_HPP +#define OPENCV_STITCHING_MATCHERS_HPP + +#include "opencv2/core.hpp" +#include "opencv2/features2d.hpp" + +#include "opencv2/opencv_modules.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_match +//! @{ + +/** @brief Structure containing image keypoints and descriptors. */ +struct CV_EXPORTS_W_SIMPLE ImageFeatures +{ + CV_PROP_RW int img_idx; + CV_PROP_RW Size img_size; + CV_PROP_RW std::vector keypoints; + CV_PROP_RW UMat descriptors; + CV_WRAP std::vector getKeypoints() { return keypoints; } +}; +/** @brief + +@param featuresFinder +@param images +@param features +@param masks +*/ +CV_EXPORTS_W void computeImageFeatures( + const Ptr &featuresFinder, + InputArrayOfArrays images, + CV_OUT std::vector &features, + InputArrayOfArrays masks = noArray()); + +/** @brief + +@param featuresFinder +@param image +@param features +@param mask +*/ +CV_EXPORTS_AS(computeImageFeatures2) void computeImageFeatures( + const Ptr &featuresFinder, + InputArray image, + CV_OUT ImageFeatures &features, + InputArray mask = noArray()); + +/** @brief Structure containing information about matches between two images. + +It's assumed that there is a transformation between those images. Transformation may be +homography or affine transformation based on selected matcher. + +@sa detail::FeaturesMatcher +*/ +struct CV_EXPORTS_W_SIMPLE MatchesInfo +{ + MatchesInfo(); + MatchesInfo(const MatchesInfo &other); + MatchesInfo& operator =(const MatchesInfo &other); + + CV_PROP_RW int src_img_idx; + CV_PROP_RW int dst_img_idx; //!< Images indices (optional) + CV_PROP_RW std::vector matches; + CV_PROP_RW std::vector inliers_mask; //!< Geometrically consistent matches mask + CV_PROP_RW int num_inliers; //!< Number of geometrically consistent matches + CV_PROP_RW Mat H; //!< Estimated transformation + CV_PROP_RW double confidence; //!< Confidence two images are from the same panorama + CV_WRAP std::vector getMatches() { return matches; } + CV_WRAP std::vector getInliers() { return inliers_mask; } +}; + +/** @brief Feature matchers base class. */ +class CV_EXPORTS_W FeaturesMatcher +{ +public: + CV_WRAP virtual ~FeaturesMatcher() {} + + /** @overload + @param features1 First image features + @param features2 Second image features + @param matches_info Found matches + */ + CV_WRAP_AS(apply) void operator ()(const ImageFeatures &features1, const ImageFeatures &features2, + CV_OUT MatchesInfo& matches_info) { match(features1, features2, matches_info); } + + /** @brief Performs images matching. + + @param features Features of the source images + @param pairwise_matches Found pairwise matches + @param mask Mask indicating which image pairs must be matched + + The function is parallelized with the TBB library. + + @sa detail::MatchesInfo + */ + CV_WRAP_AS(apply2) void operator ()(const std::vector &features, CV_OUT std::vector &pairwise_matches, + const cv::UMat &mask = cv::UMat()) { match(features, pairwise_matches, mask); } + + /** @return True, if it's possible to use the same matcher instance in parallel, false otherwise + */ + CV_WRAP bool isThreadSafe() const { return is_thread_safe_; } + + /** @brief Frees unused memory allocated before if there is any. + */ + CV_WRAP virtual void collectGarbage() {} + +protected: + FeaturesMatcher(bool is_thread_safe = false) : is_thread_safe_(is_thread_safe) {} + + /** @brief This method must implement matching logic in order to make the wrappers + detail::FeaturesMatcher::operator()_ work. + + @param features1 first image features + @param features2 second image features + @param matches_info found matches + */ + virtual void match(const ImageFeatures &features1, const ImageFeatures &features2, + MatchesInfo& matches_info) = 0; + + /** @brief This method implements logic to match features between arbitrary number of features. + By default this checks every pair of inputs in the input, but the behaviour can be changed by subclasses. + + @param features vector of image features + @param pairwise_matches found matches + @param mask (optional) mask indicating which image pairs should be matched + */ + virtual void match(const std::vector &features, std::vector &pairwise_matches, + const cv::UMat &mask = cv::UMat()); + + bool is_thread_safe_; +}; + +/** @brief Features matcher which finds two best matches for each feature and leaves the best one only if the +ratio between descriptor distances is greater than the threshold match_conf + +@sa detail::FeaturesMatcher + */ +class CV_EXPORTS_W BestOf2NearestMatcher : public FeaturesMatcher +{ +public: + /** @brief Constructs a "best of 2 nearest" matcher. + + @param try_use_gpu Should try to use GPU or not + @param match_conf Match distances ration threshold + @param num_matches_thresh1 Minimum number of matches required for the 2D projective transform + estimation used in the inliers classification step + @param num_matches_thresh2 Minimum number of matches required for the 2D projective transform + re-estimation on inliers + @param matches_confindece_thresh Matching confidence threshold to take the match into account. + The threshold was determined experimentally and set to 3 by default. + */ + CV_WRAP BestOf2NearestMatcher(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, + int num_matches_thresh2 = 6, double matches_confindece_thresh = 3.); + + CV_WRAP void collectGarbage() CV_OVERRIDE; + CV_WRAP static Ptr create(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, + int num_matches_thresh2 = 6, double matches_confindece_thresh = 3.); + +protected: + + void match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo &matches_info) CV_OVERRIDE; + int num_matches_thresh1_; + int num_matches_thresh2_; + double matches_confindece_thresh_; + Ptr impl_; +}; + +class CV_EXPORTS_W BestOf2NearestRangeMatcher : public BestOf2NearestMatcher +{ +public: + CV_WRAP BestOf2NearestRangeMatcher(int range_width = 5, bool try_use_gpu = false, float match_conf = 0.3f, + int num_matches_thresh1 = 6, int num_matches_thresh2 = 6); + +protected: + // indicate that we do not want to hide the base class match method with a different signature + using BestOf2NearestMatcher::match; + void match(const std::vector &features, std::vector &pairwise_matches, + const cv::UMat &mask = cv::UMat()) CV_OVERRIDE; + + int range_width_; +}; + +/** @brief Features matcher similar to cv::detail::BestOf2NearestMatcher which +finds two best matches for each feature and leaves the best one only if the +ratio between descriptor distances is greater than the threshold match_conf. + +Unlike cv::detail::BestOf2NearestMatcher this matcher uses affine +transformation (affine transformation estimate will be placed in matches_info). + +@sa cv::detail::FeaturesMatcher cv::detail::BestOf2NearestMatcher + */ +class CV_EXPORTS_W AffineBestOf2NearestMatcher : public BestOf2NearestMatcher +{ +public: + /** @brief Constructs a "best of 2 nearest" matcher that expects affine transformation + between images + + @param full_affine whether to use full affine transformation with 6 degress of freedom or reduced + transformation with 4 degrees of freedom using only rotation, translation and uniform scaling + @param try_use_gpu Should try to use GPU or not + @param match_conf Match distances ration threshold + @param num_matches_thresh1 Minimum number of matches required for the 2D affine transform + estimation used in the inliers classification step + + @sa cv::estimateAffine2D cv::estimateAffinePartial2D + */ + CV_WRAP AffineBestOf2NearestMatcher(bool full_affine = false, bool try_use_gpu = false, + float match_conf = 0.3f, int num_matches_thresh1 = 6) : + BestOf2NearestMatcher(try_use_gpu, match_conf, num_matches_thresh1, num_matches_thresh1), + full_affine_(full_affine) {} + +protected: + void match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo &matches_info) CV_OVERRIDE; + + bool full_affine_; +}; + +//! @} stitching_match + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_MATCHERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/motion_estimators.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/motion_estimators.hpp new file mode 100644 index 0000000..c03aa52 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/motion_estimators.hpp @@ -0,0 +1,373 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_MOTION_ESTIMATORS_HPP +#define OPENCV_STITCHING_MOTION_ESTIMATORS_HPP + +#include "opencv2/core.hpp" +#include "matchers.hpp" +#include "util.hpp" +#include "camera.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_rotation +//! @{ + +/** @brief Rotation estimator base class. + +It takes features of all images, pairwise matches between all images and estimates rotations of all +cameras. + +@note The coordinate system origin is implementation-dependent, but you can always normalize the +rotations in respect to the first camera, for instance. : + */ +class CV_EXPORTS_W Estimator +{ +public: + virtual ~Estimator() {} + + /** @brief Estimates camera parameters. + + @param features Features of images + @param pairwise_matches Pairwise matches of images + @param cameras Estimated camera parameters + @return True in case of success, false otherwise + */ + CV_WRAP_AS(apply) bool operator ()(const std::vector &features, + const std::vector &pairwise_matches, + CV_OUT CV_IN_OUT std::vector &cameras) + { + return estimate(features, pairwise_matches, cameras); + } + +protected: + /** @brief This method must implement camera parameters estimation logic in order to make the wrapper + detail::Estimator::operator()_ work. + + @param features Features of images + @param pairwise_matches Pairwise matches of images + @param cameras Estimated camera parameters + @return True in case of success, false otherwise + */ + virtual bool estimate(const std::vector &features, + const std::vector &pairwise_matches, + CV_OUT std::vector &cameras) = 0; +}; + +/** @brief Homography based rotation estimator. + */ +class CV_EXPORTS_W HomographyBasedEstimator : public Estimator +{ +public: + CV_WRAP HomographyBasedEstimator(bool is_focals_estimated = false) + : is_focals_estimated_(is_focals_estimated) {} + +private: + virtual bool estimate(const std::vector &features, + const std::vector &pairwise_matches, + std::vector &cameras) CV_OVERRIDE; + + bool is_focals_estimated_; +}; + +/** @brief Affine transformation based estimator. + +This estimator uses pairwise transformations estimated by matcher to estimate +final transformation for each camera. + +@sa cv::detail::HomographyBasedEstimator + */ +class CV_EXPORTS_W AffineBasedEstimator : public Estimator +{ +public: + CV_WRAP AffineBasedEstimator(){} +private: + virtual bool estimate(const std::vector &features, + const std::vector &pairwise_matches, + std::vector &cameras) CV_OVERRIDE; +}; + +/** @brief Base class for all camera parameters refinement methods. + */ +class CV_EXPORTS_W BundleAdjusterBase : public Estimator +{ +public: + CV_WRAP Mat refinementMask() const { return refinement_mask_.clone(); } + CV_WRAP void setRefinementMask(const Mat &mask) + { + CV_Assert(mask.type() == CV_8U && mask.size() == Size(3, 3)); + refinement_mask_ = mask.clone(); + } + + CV_WRAP double confThresh() const { return conf_thresh_; } + CV_WRAP void setConfThresh(double conf_thresh) { conf_thresh_ = conf_thresh; } + + CV_WRAP TermCriteria termCriteria() { return term_criteria_; } + CV_WRAP void setTermCriteria(const TermCriteria& term_criteria) { term_criteria_ = term_criteria; } + +protected: + /** @brief Construct a bundle adjuster base instance. + + @param num_params_per_cam Number of parameters per camera + @param num_errs_per_measurement Number of error terms (components) per match + */ + BundleAdjusterBase(int num_params_per_cam, int num_errs_per_measurement) + : num_images_(0), total_num_matches_(0), + num_params_per_cam_(num_params_per_cam), + num_errs_per_measurement_(num_errs_per_measurement), + features_(0), pairwise_matches_(0), conf_thresh_(0) + { + setRefinementMask(Mat::ones(3, 3, CV_8U)); + setConfThresh(1.); + setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 1000, DBL_EPSILON)); + } + + // Runs bundle adjustment + virtual bool estimate(const std::vector &features, + const std::vector &pairwise_matches, + std::vector &cameras) CV_OVERRIDE; + + /** @brief Sets initial camera parameter to refine. + + @param cameras Camera parameters + */ + virtual void setUpInitialCameraParams(const std::vector &cameras) = 0; + /** @brief Gets the refined camera parameters. + + @param cameras Refined camera parameters + */ + virtual void obtainRefinedCameraParams(std::vector &cameras) const = 0; + /** @brief Calculates error vector. + + @param err Error column-vector of length total_num_matches \* num_errs_per_measurement + */ + virtual void calcError(Mat &err) = 0; + /** @brief Calculates the cost function jacobian. + + @param jac Jacobian matrix of dimensions + (total_num_matches \* num_errs_per_measurement) x (num_images \* num_params_per_cam) + */ + virtual void calcJacobian(Mat &jac) = 0; + + // 3x3 8U mask, where 0 means don't refine respective parameter, != 0 means refine + Mat refinement_mask_; + + int num_images_; + int total_num_matches_; + + int num_params_per_cam_; + int num_errs_per_measurement_; + + const ImageFeatures *features_; + const MatchesInfo *pairwise_matches_; + + // Threshold to filter out poorly matched image pairs + double conf_thresh_; + + //Levenberg-Marquardt algorithm termination criteria + TermCriteria term_criteria_; + + // Camera parameters matrix (CV_64F) + Mat cam_params_; + + // Connected images pairs + std::vector > edges_; +}; + + +/** @brief Stub bundle adjuster that does nothing. + */ +class CV_EXPORTS_W NoBundleAdjuster : public BundleAdjusterBase +{ +public: + CV_WRAP NoBundleAdjuster() : BundleAdjusterBase(0, 0) {} + +private: + bool estimate(const std::vector &, const std::vector &, + std::vector &) CV_OVERRIDE + { + return true; + } + void setUpInitialCameraParams(const std::vector &) CV_OVERRIDE {} + void obtainRefinedCameraParams(std::vector &) const CV_OVERRIDE {} + void calcError(Mat &) CV_OVERRIDE {} + void calcJacobian(Mat &) CV_OVERRIDE {} +}; + + +/** @brief Implementation of the camera parameters refinement algorithm which minimizes sum of the reprojection +error squares + +It can estimate focal length, aspect ratio, principal point. +You can affect only on them via the refinement mask. + */ +class CV_EXPORTS_W BundleAdjusterReproj : public BundleAdjusterBase +{ +public: + CV_WRAP BundleAdjusterReproj() : BundleAdjusterBase(7, 2) {} + +private: + void setUpInitialCameraParams(const std::vector &cameras) CV_OVERRIDE; + void obtainRefinedCameraParams(std::vector &cameras) const CV_OVERRIDE; + void calcError(Mat &err) CV_OVERRIDE; + void calcJacobian(Mat &jac) CV_OVERRIDE; + + Mat err1_, err2_; +}; + + +/** @brief Implementation of the camera parameters refinement algorithm which minimizes sum of the distances +between the rays passing through the camera center and a feature. : + +It can estimate focal length. It ignores the refinement mask for now. + */ +class CV_EXPORTS_W BundleAdjusterRay : public BundleAdjusterBase +{ +public: + CV_WRAP BundleAdjusterRay() : BundleAdjusterBase(4, 3) {} + +private: + void setUpInitialCameraParams(const std::vector &cameras) CV_OVERRIDE; + void obtainRefinedCameraParams(std::vector &cameras) const CV_OVERRIDE; + void calcError(Mat &err) CV_OVERRIDE; + void calcJacobian(Mat &jac) CV_OVERRIDE; + + Mat err1_, err2_; +}; + + +/** @brief Bundle adjuster that expects affine transformation +represented in homogeneous coordinates in R for each camera param. Implements +camera parameters refinement algorithm which minimizes sum of the reprojection +error squares + +It estimates all transformation parameters. Refinement mask is ignored. + +@sa AffineBasedEstimator AffineBestOf2NearestMatcher BundleAdjusterAffinePartial + */ +class CV_EXPORTS_W BundleAdjusterAffine : public BundleAdjusterBase +{ +public: + CV_WRAP BundleAdjusterAffine() : BundleAdjusterBase(6, 2) {} + +private: + void setUpInitialCameraParams(const std::vector &cameras) CV_OVERRIDE; + void obtainRefinedCameraParams(std::vector &cameras) const CV_OVERRIDE; + void calcError(Mat &err) CV_OVERRIDE; + void calcJacobian(Mat &jac) CV_OVERRIDE; + + Mat err1_, err2_; +}; + + +/** @brief Bundle adjuster that expects affine transformation with 4 DOF +represented in homogeneous coordinates in R for each camera param. Implements +camera parameters refinement algorithm which minimizes sum of the reprojection +error squares + +It estimates all transformation parameters. Refinement mask is ignored. + +@sa AffineBasedEstimator AffineBestOf2NearestMatcher BundleAdjusterAffine + */ +class CV_EXPORTS_W BundleAdjusterAffinePartial : public BundleAdjusterBase +{ +public: + CV_WRAP BundleAdjusterAffinePartial() : BundleAdjusterBase(4, 2) {} + +private: + void setUpInitialCameraParams(const std::vector &cameras) CV_OVERRIDE; + void obtainRefinedCameraParams(std::vector &cameras) const CV_OVERRIDE; + void calcError(Mat &err) CV_OVERRIDE; + void calcJacobian(Mat &jac) CV_OVERRIDE; + + Mat err1_, err2_; +}; + + +enum WaveCorrectKind +{ + WAVE_CORRECT_HORIZ, + WAVE_CORRECT_VERT, + WAVE_CORRECT_AUTO +}; + +/** @brief Tries to detect the wave correction kind depending +on whether a panorama spans horizontally or vertically + +@param rmats Camera rotation matrices. +@return The correction kind to use for this panorama + */ +CV_EXPORTS +WaveCorrectKind autoDetectWaveCorrectKind(const std::vector &rmats); + +/** @brief Tries to make panorama more horizontal (or vertical). + +@param rmats Camera rotation matrices. +@param kind Correction kind, see detail::WaveCorrectKind. + */ +void CV_EXPORTS_W waveCorrect(CV_IN_OUT std::vector &rmats, WaveCorrectKind kind); + + +////////////////////////////////////////////////////////////////////////////// +// Auxiliary functions + +// Returns matches graph representation in DOT language +String CV_EXPORTS_W matchesGraphAsString(std::vector &paths, std::vector &pairwise_matches, + float conf_threshold); + +CV_EXPORTS_W std::vector leaveBiggestComponent( + std::vector &features, + std::vector &pairwise_matches, + float conf_threshold); + +void CV_EXPORTS findMaxSpanningTree( + int num_images, const std::vector &pairwise_matches, + Graph &span_tree, std::vector ¢ers); + +//! @} stitching_rotation + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_MOTION_ESTIMATORS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/seam_finders.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/seam_finders.hpp new file mode 100644 index 0000000..9ccfd14 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/seam_finders.hpp @@ -0,0 +1,291 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_SEAM_FINDERS_HPP +#define OPENCV_STITCHING_SEAM_FINDERS_HPP + +#include +#include "opencv2/core.hpp" +#include "opencv2/opencv_modules.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_seam +//! @{ + +/** @brief Base class for a seam estimator. + */ +class CV_EXPORTS_W SeamFinder +{ +public: + CV_WRAP virtual ~SeamFinder() {} + enum { NO, VORONOI_SEAM, DP_SEAM }; + /** @brief Estimates seams. + + @param src Source images + @param corners Source image top-left corners + @param masks Source image masks to update + */ + CV_WRAP virtual void find(const std::vector &src, const std::vector &corners, + CV_IN_OUT std::vector &masks) = 0; + CV_WRAP static Ptr createDefault(int type); +}; + +/** @brief Stub seam estimator which does nothing. + */ +class CV_EXPORTS_W NoSeamFinder : public SeamFinder +{ +public: + CV_WRAP void find(const std::vector&, const std::vector&, CV_IN_OUT std::vector&) CV_OVERRIDE {} +}; + +/** @brief Base class for all pairwise seam estimators. + */ +class CV_EXPORTS_W PairwiseSeamFinder : public SeamFinder +{ +public: + CV_WRAP virtual void find(const std::vector &src, const std::vector &corners, + CV_IN_OUT std::vector &masks) CV_OVERRIDE; + +protected: + void run(); + /** @brief Resolves masks intersection of two specified images in the given ROI. + + @param first First image index + @param second Second image index + @param roi Region of interest + */ + virtual void findInPair(size_t first, size_t second, Rect roi) = 0; + + std::vector images_; + std::vector sizes_; + std::vector corners_; + std::vector masks_; +}; + +/** @brief Voronoi diagram-based seam estimator. + */ +class CV_EXPORTS_W VoronoiSeamFinder : public PairwiseSeamFinder +{ +public: + CV_WRAP virtual void find(const std::vector &src, const std::vector &corners, + CV_IN_OUT std::vector &masks) CV_OVERRIDE; + virtual void find(const std::vector &size, const std::vector &corners, + std::vector &masks); +private: + void findInPair(size_t first, size_t second, Rect roi) CV_OVERRIDE; +}; + + +class CV_EXPORTS_W DpSeamFinder : public SeamFinder +{ +public: + enum CostFunction { COLOR, COLOR_GRAD }; + + DpSeamFinder(CostFunction costFunc = COLOR); + CV_WRAP DpSeamFinder(String costFunc ); + + CostFunction costFunction() const { return costFunc_; } + void setCostFunction(CostFunction val) { costFunc_ = val; } + CV_WRAP void setCostFunction(String val); + + virtual void find(const std::vector &src, const std::vector &corners, + std::vector &masks) CV_OVERRIDE; + +private: + enum ComponentState + { + FIRST = 1, SECOND = 2, INTERS = 4, + INTERS_FIRST = INTERS | FIRST, + INTERS_SECOND = INTERS | SECOND + }; + + class ImagePairLess + { + public: + ImagePairLess(const std::vector &images, const std::vector &corners) + : src_(&images[0]), corners_(&corners[0]) {} + + bool operator() (const std::pair &l, const std::pair &r) const + { + Point c1 = corners_[l.first] + Point(src_[l.first].cols / 2, src_[l.first].rows / 2); + Point c2 = corners_[l.second] + Point(src_[l.second].cols / 2, src_[l.second].rows / 2); + int d1 = (c1 - c2).dot(c1 - c2); + + c1 = corners_[r.first] + Point(src_[r.first].cols / 2, src_[r.first].rows / 2); + c2 = corners_[r.second] + Point(src_[r.second].cols / 2, src_[r.second].rows / 2); + int d2 = (c1 - c2).dot(c1 - c2); + + return d1 < d2; + } + + private: + const Mat *src_; + const Point *corners_; + }; + + class ClosePoints + { + public: + ClosePoints(int minDist) : minDist_(minDist) {} + + bool operator() (const Point &p1, const Point &p2) const + { + int dist2 = (p1.x-p2.x) * (p1.x-p2.x) + (p1.y-p2.y) * (p1.y-p2.y); + return dist2 < minDist_ * minDist_; + } + + private: + int minDist_; + }; + + void process( + const Mat &image1, const Mat &image2, Point tl1, Point tl2, Mat &mask1, Mat &mask2); + + void findComponents(); + + void findEdges(); + + void resolveConflicts( + const Mat &image1, const Mat &image2, Point tl1, Point tl2, Mat &mask1, Mat &mask2); + + void computeGradients(const Mat &image1, const Mat &image2); + + bool hasOnlyOneNeighbor(int comp); + + bool closeToContour(int y, int x, const Mat_ &contourMask); + + bool getSeamTips(int comp1, int comp2, Point &p1, Point &p2); + + void computeCosts( + const Mat &image1, const Mat &image2, Point tl1, Point tl2, + int comp, Mat_ &costV, Mat_ &costH); + + bool estimateSeam( + const Mat &image1, const Mat &image2, Point tl1, Point tl2, int comp, + Point p1, Point p2, std::vector &seam, bool &isHorizontal); + + void updateLabelsUsingSeam( + int comp1, int comp2, const std::vector &seam, bool isHorizontalSeam); + + CostFunction costFunc_; + + // processing images pair data + Point unionTl_, unionBr_; + Size unionSize_; + Mat_ mask1_, mask2_; + Mat_ contour1mask_, contour2mask_; + Mat_ gradx1_, grady1_; + Mat_ gradx2_, grady2_; + + // components data + int ncomps_; + Mat_ labels_; + std::vector states_; + std::vector tls_, brs_; + std::vector > contours_; + std::set > edges_; +}; + +/** @brief Base class for all minimum graph-cut-based seam estimators. + */ +class CV_EXPORTS GraphCutSeamFinderBase +{ +public: + enum CostType { COST_COLOR, COST_COLOR_GRAD }; +}; + +/** @brief Minimum graph cut-based seam estimator. See details in @cite V03 . + */ +class CV_EXPORTS_W GraphCutSeamFinder : public GraphCutSeamFinderBase, public SeamFinder +{ +public: + GraphCutSeamFinder(int cost_type = COST_COLOR_GRAD, float terminal_cost = 10000.f, + float bad_region_penalty = 1000.f); + CV_WRAP GraphCutSeamFinder(String cost_type,float terminal_cost = 10000.f, + float bad_region_penalty = 1000.f); + + ~GraphCutSeamFinder(); + + CV_WRAP void find(const std::vector &src, const std::vector &corners, + CV_IN_OUT std::vector &masks) CV_OVERRIDE; + +private: + // To avoid GCGraph dependency + class Impl; + Ptr impl_; +}; + + +#ifdef HAVE_OPENCV_CUDALEGACY +class CV_EXPORTS GraphCutSeamFinderGpu : public GraphCutSeamFinderBase, public PairwiseSeamFinder +{ +public: + GraphCutSeamFinderGpu(int cost_type = COST_COLOR_GRAD, float terminal_cost = 10000.f, + float bad_region_penalty = 1000.f) + : cost_type_(cost_type), terminal_cost_(terminal_cost), + bad_region_penalty_(bad_region_penalty) {} + + void find(const std::vector &src, const std::vector &corners, + std::vector &masks) CV_OVERRIDE; + void findInPair(size_t first, size_t second, Rect roi) CV_OVERRIDE; + +private: + void setGraphWeightsColor(const cv::Mat &img1, const cv::Mat &img2, const cv::Mat &mask1, const cv::Mat &mask2, + cv::Mat &terminals, cv::Mat &leftT, cv::Mat &rightT, cv::Mat &top, cv::Mat &bottom); + void setGraphWeightsColorGrad(const cv::Mat &img1, const cv::Mat &img2, const cv::Mat &dx1, const cv::Mat &dx2, + const cv::Mat &dy1, const cv::Mat &dy2, const cv::Mat &mask1, const cv::Mat &mask2, + cv::Mat &terminals, cv::Mat &leftT, cv::Mat &rightT, cv::Mat &top, cv::Mat &bottom); + std::vector dx_, dy_; + int cost_type_; + float terminal_cost_; + float bad_region_penalty_; +}; +#endif + +//! @} + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_SEAM_FINDERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/timelapsers.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/timelapsers.hpp new file mode 100644 index 0000000..f6f3da8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/timelapsers.hpp @@ -0,0 +1,91 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + + +#ifndef OPENCV_STITCHING_TIMELAPSERS_HPP +#define OPENCV_STITCHING_TIMELAPSERS_HPP + +#include "opencv2/core.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching +//! @{ + +// Base Timelapser class, takes a sequence of images, applies appropriate shift, stores result in dst_. + +class CV_EXPORTS_W Timelapser +{ +public: + + enum {AS_IS, CROP}; + + virtual ~Timelapser() {} + + CV_WRAP static Ptr createDefault(int type); + + CV_WRAP virtual void initialize(const std::vector &corners, const std::vector &sizes); + CV_WRAP virtual void process(InputArray img, InputArray mask, Point tl); + CV_WRAP virtual const UMat& getDst() {return dst_;} + +protected: + + virtual bool test_point(Point pt); + + UMat dst_; + Rect dst_roi_; +}; + + +class CV_EXPORTS_W TimelapserCrop : public Timelapser +{ +public: + virtual void initialize(const std::vector &corners, const std::vector &sizes) CV_OVERRIDE; +}; + +//! @} + +} // namespace detail +} // namespace cv + +#endif // OPENCV_STITCHING_TIMELAPSERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/util.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/util.hpp new file mode 100644 index 0000000..bf7a390 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/util.hpp @@ -0,0 +1,121 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_UTIL_HPP +#define OPENCV_STITCHING_UTIL_HPP + +#include +#include "opencv2/core.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching +//! @{ + +class CV_EXPORTS DisjointSets +{ +public: + DisjointSets(int elem_count = 0) { createOneElemSets(elem_count); } + + void createOneElemSets(int elem_count); + int findSetByElem(int elem); + int mergeSets(int set1, int set2); + + std::vector parent; + std::vector size; + +private: + std::vector rank_; +}; + + +struct CV_EXPORTS GraphEdge +{ + GraphEdge(int from, int to, float weight); + bool operator <(const GraphEdge& other) const { return weight < other.weight; } + bool operator >(const GraphEdge& other) const { return weight > other.weight; } + + int from, to; + float weight; +}; + +inline GraphEdge::GraphEdge(int _from, int _to, float _weight) : from(_from), to(_to), weight(_weight) {} + + +class CV_EXPORTS Graph +{ +public: + Graph(int num_vertices = 0) { create(num_vertices); } + void create(int num_vertices) { edges_.assign(num_vertices, std::list()); } + int numVertices() const { return static_cast(edges_.size()); } + void addEdge(int from, int to, float weight); + template B forEach(B body) const; + template B walkBreadthFirst(int from, B body) const; + +private: + std::vector< std::list > edges_; +}; + + +////////////////////////////////////////////////////////////////////////////// +// Auxiliary functions + +CV_EXPORTS_W bool overlapRoi(Point tl1, Point tl2, Size sz1, Size sz2, Rect &roi); +CV_EXPORTS_W Rect resultRoi(const std::vector &corners, const std::vector &images); +CV_EXPORTS_W Rect resultRoi(const std::vector &corners, const std::vector &sizes); +CV_EXPORTS_W Rect resultRoiIntersection(const std::vector &corners, const std::vector &sizes); +CV_EXPORTS_W Point resultTl(const std::vector &corners); + +// Returns random 'count' element subset of the {0,1,...,size-1} set +CV_EXPORTS_W void selectRandomSubset(int count, int size, std::vector &subset); + +CV_EXPORTS_W int& stitchingLogLevel(); + +//! @} + +} // namespace detail +} // namespace cv + +#include "util_inl.hpp" + +#endif // OPENCV_STITCHING_UTIL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/util_inl.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/util_inl.hpp new file mode 100644 index 0000000..dafab8b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/util_inl.hpp @@ -0,0 +1,131 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_UTIL_INL_HPP +#define OPENCV_STITCHING_UTIL_INL_HPP + +#include +#include "opencv2/core.hpp" +#include "util.hpp" // Make your IDE see declarations + +//! @cond IGNORED + +namespace cv { +namespace detail { + +template +B Graph::forEach(B body) const +{ + for (int i = 0; i < numVertices(); ++i) + { + std::list::const_iterator edge = edges_[i].begin(); + for (; edge != edges_[i].end(); ++edge) + body(*edge); + } + return body; +} + + +template +B Graph::walkBreadthFirst(int from, B body) const +{ + std::vector was(numVertices(), false); + std::queue vertices; + + was[from] = true; + vertices.push(from); + + while (!vertices.empty()) + { + int vertex = vertices.front(); + vertices.pop(); + + std::list::const_iterator edge = edges_[vertex].begin(); + for (; edge != edges_[vertex].end(); ++edge) + { + if (!was[edge->to]) + { + body(*edge); + was[edge->to] = true; + vertices.push(edge->to); + } + } + } + + return body; +} + + +////////////////////////////////////////////////////////////////////////////// +// Some auxiliary math functions + +static inline +float normL2(const Point3f& a) +{ + return a.x * a.x + a.y * a.y + a.z * a.z; +} + + +static inline +float normL2(const Point3f& a, const Point3f& b) +{ + return normL2(a - b); +} + + +static inline +double normL2sq(const Mat &r) +{ + return r.dot(r); +} + + +static inline int sqr(int x) { return x * x; } +static inline float sqr(float x) { return x * x; } +static inline double sqr(double x) { return x * x; } + +} // namespace detail +} // namespace cv + +//! @endcond + +#endif // OPENCV_STITCHING_UTIL_INL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers.hpp new file mode 100644 index 0000000..d0d7869 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers.hpp @@ -0,0 +1,706 @@ + /*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_WARPERS_HPP +#define OPENCV_STITCHING_WARPERS_HPP + +#include "opencv2/core.hpp" +#include "opencv2/core/cuda.hpp" +#include "opencv2/imgproc.hpp" +#include "opencv2/opencv_modules.hpp" + +namespace cv { +namespace detail { + +//! @addtogroup stitching_warp +//! @{ + +/** @brief Rotation-only model image warper interface. + */ +class CV_EXPORTS RotationWarper +{ +public: + virtual ~RotationWarper() {} + + /** @brief Projects the image point. + + @param pt Source point + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Projected point + */ + virtual Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R) = 0; + + /** @brief Projects the image point backward. + + @param pt Projected point + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Backward-projected point + */ +#if CV_VERSION_MAJOR == 4 + virtual Point2f warpPointBackward(const Point2f& pt, InputArray K, InputArray R) + { + CV_UNUSED(pt); CV_UNUSED(K); CV_UNUSED(R); + CV_Error(Error::StsNotImplemented, ""); + } +#else + virtual Point2f warpPointBackward(const Point2f& pt, InputArray K, InputArray R) = 0; +#endif + + /** @brief Builds the projection maps according to the given camera data. + + @param src_size Source image size + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param xmap Projection map for the x axis + @param ymap Projection map for the y axis + @return Projected image minimum bounding box + */ + virtual Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) = 0; + + /** @brief Projects the image. + + @param src Source image + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param interp_mode Interpolation mode + @param border_mode Border extrapolation mode + @param dst Projected image + @return Project image top-left corner + */ + virtual Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + CV_OUT OutputArray dst) = 0; + + /** @brief Projects the image backward. + + @param src Projected image + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param interp_mode Interpolation mode + @param border_mode Border extrapolation mode + @param dst_size Backward-projected image size + @param dst Backward-projected image + */ + virtual void warpBackward(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + Size dst_size, CV_OUT OutputArray dst) = 0; + + /** + @param src_size Source image bounding box + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Projected image minimum bounding box + */ + virtual Rect warpRoi(Size src_size, InputArray K, InputArray R) = 0; + + virtual float getScale() const { return 1.f; } + virtual void setScale(float) {} +}; + +/** @brief Base class for warping logic implementation. + */ +struct CV_EXPORTS_W_SIMPLE ProjectorBase +{ + void setCameraParams(InputArray K = Mat::eye(3, 3, CV_32F), + InputArray R = Mat::eye(3, 3, CV_32F), + InputArray T = Mat::zeros(3, 1, CV_32F)); + + float scale; + float k[9]; + float rinv[9]; + float r_kinv[9]; + float k_rinv[9]; + float t[3]; +}; + +/** @brief Base class for rotation-based warper using a detail::ProjectorBase_ derived class. + */ +template +class CV_EXPORTS_TEMPLATE RotationWarperBase : public RotationWarper +{ +public: + Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R) CV_OVERRIDE; + + Point2f warpPointBackward(const Point2f &pt, InputArray K, InputArray R) CV_OVERRIDE; + + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE; + + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + OutputArray dst) CV_OVERRIDE; + + void warpBackward(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + Size dst_size, OutputArray dst) CV_OVERRIDE; + + Rect warpRoi(Size src_size, InputArray K, InputArray R) CV_OVERRIDE; + + float getScale() const CV_OVERRIDE{ return projector_.scale; } + void setScale(float val) CV_OVERRIDE { projector_.scale = val; } + +protected: + + // Detects ROI of the destination image. It's correct for any projection. + virtual void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br); + + // Detects ROI of the destination image by walking over image border. + // Correctness for any projection isn't guaranteed. + void detectResultRoiByBorder(Size src_size, Point &dst_tl, Point &dst_br); + + P projector_; +}; + + +struct CV_EXPORTS PlaneProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + +/** @brief Warper that maps an image onto the z = 1 plane. + */ +class CV_EXPORTS PlaneWarper : public RotationWarperBase +{ +public: + /** @brief Construct an instance of the plane warper class. + + @param scale Projected image scale multiplier + */ + PlaneWarper(float scale = 1.f) { projector_.scale = scale; } + + Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R) CV_OVERRIDE; + Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R, InputArray T); + + Point2f warpPointBackward(const Point2f& pt, InputArray K, InputArray R) CV_OVERRIDE; + Point2f warpPointBackward(const Point2f& pt, InputArray K, InputArray R, InputArray T); + + virtual Rect buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, CV_OUT OutputArray xmap, CV_OUT OutputArray ymap); + Rect buildMaps(Size src_size, InputArray K, InputArray R, CV_OUT OutputArray xmap, CV_OUT OutputArray ymap) CV_OVERRIDE; + + Point warp(InputArray src, InputArray K, InputArray R, + int interp_mode, int border_mode, CV_OUT OutputArray dst) CV_OVERRIDE; + virtual Point warp(InputArray src, InputArray K, InputArray R, InputArray T, int interp_mode, int border_mode, + CV_OUT OutputArray dst); + + Rect warpRoi(Size src_size, InputArray K, InputArray R) CV_OVERRIDE; + Rect warpRoi(Size src_size, InputArray K, InputArray R, InputArray T); + +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE; +}; + + +/** @brief Affine warper that uses rotations and translations + + Uses affine transformation in homogeneous coordinates to represent both rotation and + translation in camera rotation matrix. + */ +class CV_EXPORTS AffineWarper : public PlaneWarper +{ +public: + /** @brief Construct an instance of the affine warper class. + + @param scale Projected image scale multiplier + */ + AffineWarper(float scale = 1.f) : PlaneWarper(scale) {} + + /** @brief Projects the image point. + + @param pt Source point + @param K Camera intrinsic parameters + @param H Camera extrinsic parameters + @return Projected point + */ + Point2f warpPoint(const Point2f &pt, InputArray K, InputArray H) CV_OVERRIDE; + + /** @brief Projects the image point backward. + + @param pt Projected point + @param K Camera intrinsic parameters + @param H Camera extrinsic parameters + @return Backward-projected point + */ + Point2f warpPointBackward(const Point2f &pt, InputArray K, InputArray H) CV_OVERRIDE; + + /** @brief Builds the projection maps according to the given camera data. + + @param src_size Source image size + @param K Camera intrinsic parameters + @param H Camera extrinsic parameters + @param xmap Projection map for the x axis + @param ymap Projection map for the y axis + @return Projected image minimum bounding box + */ + Rect buildMaps(Size src_size, InputArray K, InputArray H, OutputArray xmap, OutputArray ymap) CV_OVERRIDE; + + /** @brief Projects the image. + + @param src Source image + @param K Camera intrinsic parameters + @param H Camera extrinsic parameters + @param interp_mode Interpolation mode + @param border_mode Border extrapolation mode + @param dst Projected image + @return Project image top-left corner + */ + Point warp(InputArray src, InputArray K, InputArray H, + int interp_mode, int border_mode, OutputArray dst) CV_OVERRIDE; + + /** + @param src_size Source image bounding box + @param K Camera intrinsic parameters + @param H Camera extrinsic parameters + @return Projected image minimum bounding box + */ + Rect warpRoi(Size src_size, InputArray K, InputArray H) CV_OVERRIDE; + +protected: + /** @brief Extracts rotation and translation matrices from matrix H representing + affine transformation in homogeneous coordinates + */ + void getRTfromHomogeneous(InputArray H, Mat &R, Mat &T); +}; + + +struct CV_EXPORTS_W_SIMPLE SphericalProjector : ProjectorBase +{ + CV_WRAP void mapForward(float x, float y, float &u, float &v); + CV_WRAP void mapBackward(float u, float v, float &x, float &y); +}; + + +/** @brief Warper that maps an image onto the unit sphere located at the origin. + + Projects image onto unit sphere with origin at (0, 0, 0) and radius scale, measured in pixels. + A 360 panorama would therefore have a resulting width of 2 * scale * PI pixels. + Poles are located at (0, -1, 0) and (0, 1, 0) points. +*/ +class CV_EXPORTS SphericalWarper : public RotationWarperBase +{ +public: + /** @brief Construct an instance of the spherical warper class. + + @param scale Radius of the projected sphere, in pixels. An image spanning the + whole sphere will have a width of 2 * scale * PI pixels. + */ + SphericalWarper(float scale) { projector_.scale = scale; } + + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE; + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, OutputArray dst) CV_OVERRIDE; +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE; +}; + + +struct CV_EXPORTS CylindricalProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +/** @brief Warper that maps an image onto the x\*x + z\*z = 1 cylinder. + */ +class CV_EXPORTS CylindricalWarper : public RotationWarperBase +{ +public: + /** @brief Construct an instance of the cylindrical warper class. + + @param scale Projected image scale multiplier + */ + CylindricalWarper(float scale) { projector_.scale = scale; } + + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE; + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, OutputArray dst) CV_OVERRIDE; +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE + { + RotationWarperBase::detectResultRoiByBorder(src_size, dst_tl, dst_br); + } +}; + + +struct CV_EXPORTS FisheyeProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS FisheyeWarper : public RotationWarperBase +{ +public: + FisheyeWarper(float scale) { projector_.scale = scale; } +}; + + +struct CV_EXPORTS StereographicProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS StereographicWarper : public RotationWarperBase +{ +public: + StereographicWarper(float scale) { projector_.scale = scale; } +}; + + +struct CV_EXPORTS CompressedRectilinearProjector : ProjectorBase +{ + float a, b; + + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS CompressedRectilinearWarper : public RotationWarperBase +{ +public: + CompressedRectilinearWarper(float scale, float A = 1, float B = 1) + { + projector_.a = A; + projector_.b = B; + projector_.scale = scale; + } +}; + + +struct CV_EXPORTS CompressedRectilinearPortraitProjector : ProjectorBase +{ + float a, b; + + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS CompressedRectilinearPortraitWarper : public RotationWarperBase +{ +public: + CompressedRectilinearPortraitWarper(float scale, float A = 1, float B = 1) + { + projector_.a = A; + projector_.b = B; + projector_.scale = scale; + } +}; + + +struct CV_EXPORTS PaniniProjector : ProjectorBase +{ + float a, b; + + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS PaniniWarper : public RotationWarperBase +{ +public: + PaniniWarper(float scale, float A = 1, float B = 1) + { + projector_.a = A; + projector_.b = B; + projector_.scale = scale; + } +}; + + +struct CV_EXPORTS PaniniPortraitProjector : ProjectorBase +{ + float a, b; + + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS PaniniPortraitWarper : public RotationWarperBase +{ +public: + PaniniPortraitWarper(float scale, float A = 1, float B = 1) + { + projector_.a = A; + projector_.b = B; + projector_.scale = scale; + } + +}; + + +struct CV_EXPORTS MercatorProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS MercatorWarper : public RotationWarperBase +{ +public: + MercatorWarper(float scale) { projector_.scale = scale; } +}; + + +struct CV_EXPORTS TransverseMercatorProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS TransverseMercatorWarper : public RotationWarperBase +{ +public: + TransverseMercatorWarper(float scale) { projector_.scale = scale; } +}; + + +class CV_EXPORTS PlaneWarperGpu : public PlaneWarper +{ +public: + PlaneWarperGpu(float scale = 1.f) : PlaneWarper(scale) {} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE + { + Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); + d_xmap_.download(xmap); + d_ymap_.download(ymap); + return result; + } + + Rect buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, OutputArray xmap, OutputArray ymap) CV_OVERRIDE + { + Rect result = buildMaps(src_size, K, R, T, d_xmap_, d_ymap_); + d_xmap_.download(xmap); + d_ymap_.download(ymap); + return result; + } + + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + OutputArray dst) CV_OVERRIDE + { + d_src_.upload(src); + Point result = warp(d_src_, K, R, interp_mode, border_mode, d_dst_); + d_dst_.download(dst); + return result; + } + + Point warp(InputArray src, InputArray K, InputArray R, InputArray T, int interp_mode, int border_mode, + OutputArray dst) CV_OVERRIDE + { + d_src_.upload(src); + Point result = warp(d_src_, K, R, T, interp_mode, border_mode, d_dst_); + d_dst_.download(dst); + return result; + } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + + Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); + + Rect buildMaps(Size src_size, InputArray K, InputArray R, InputArray T, cuda::GpuMat & xmap, cuda::GpuMat & ymap); + + Point warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, + cuda::GpuMat & dst); + + Point warp(const cuda::GpuMat & src, InputArray K, InputArray R, InputArray T, int interp_mode, int border_mode, + cuda::GpuMat & dst); + +private: + cuda::GpuMat d_xmap_, d_ymap_, d_src_, d_dst_; +}; + + +class CV_EXPORTS SphericalWarperGpu : public SphericalWarper +{ +public: + SphericalWarperGpu(float scale) : SphericalWarper(scale) {} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE + { + Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); + d_xmap_.download(xmap); + d_ymap_.download(ymap); + return result; + } + + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + OutputArray dst) CV_OVERRIDE + { + d_src_.upload(src); + Point result = warp(d_src_, K, R, interp_mode, border_mode, d_dst_); + d_dst_.download(dst); + return result; + } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + + Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); + + Point warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, + cuda::GpuMat & dst); + +private: + cuda::GpuMat d_xmap_, d_ymap_, d_src_, d_dst_; +}; + + +class CV_EXPORTS CylindricalWarperGpu : public CylindricalWarper +{ +public: + CylindricalWarperGpu(float scale) : CylindricalWarper(scale) {} + +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif + Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE + { + Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); + d_xmap_.download(xmap); + d_ymap_.download(ymap); + return result; + } + + Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + OutputArray dst) CV_OVERRIDE + { + d_src_.upload(src); + Point result = warp(d_src_, K, R, interp_mode, border_mode, d_dst_); + d_dst_.download(dst); + return result; + } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif + + Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); + + Point warp(const cuda::GpuMat & src, InputArray K, InputArray R, int interp_mode, int border_mode, + cuda::GpuMat & dst); + +private: + cuda::GpuMat d_xmap_, d_ymap_, d_src_, d_dst_; +}; + + +struct CV_EXPORTS SphericalPortraitProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +// Projects image onto unit sphere with origin at (0, 0, 0). +// Poles are located NOT at (0, -1, 0) and (0, 1, 0) points, BUT at (1, 0, 0) and (-1, 0, 0) points. +class CV_EXPORTS SphericalPortraitWarper : public RotationWarperBase +{ +public: + SphericalPortraitWarper(float scale) { projector_.scale = scale; } + +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE; +}; + +struct CV_EXPORTS CylindricalPortraitProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS CylindricalPortraitWarper : public RotationWarperBase +{ +public: + CylindricalPortraitWarper(float scale) { projector_.scale = scale; } + +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE + { + RotationWarperBase::detectResultRoiByBorder(src_size, dst_tl, dst_br); + } +}; + +struct CV_EXPORTS PlanePortraitProjector : ProjectorBase +{ + void mapForward(float x, float y, float &u, float &v); + void mapBackward(float u, float v, float &x, float &y); +}; + + +class CV_EXPORTS PlanePortraitWarper : public RotationWarperBase +{ +public: + PlanePortraitWarper(float scale) { projector_.scale = scale; } + +protected: + void detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) CV_OVERRIDE + { + RotationWarperBase::detectResultRoiByBorder(src_size, dst_tl, dst_br); + } +}; + +//! @} stitching_warp + +} // namespace detail +} // namespace cv + +#include "warpers_inl.hpp" + +#endif // OPENCV_STITCHING_WARPERS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers_inl.hpp b/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers_inl.hpp new file mode 100644 index 0000000..72b5c08 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/detail/warpers_inl.hpp @@ -0,0 +1,782 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_WARPERS_INL_HPP +#define OPENCV_STITCHING_WARPERS_INL_HPP + +#include "opencv2/core.hpp" +#include "warpers.hpp" // Make your IDE see declarations +#include + +//! @cond IGNORED + +namespace cv { +namespace detail { + +template +Point2f RotationWarperBase

    ::warpPoint(const Point2f &pt, InputArray K, InputArray R) +{ + projector_.setCameraParams(K, R); + Point2f uv; + projector_.mapForward(pt.x, pt.y, uv.x, uv.y); + return uv; +} + +template +Point2f RotationWarperBase

    ::warpPointBackward(const Point2f& pt, InputArray K, InputArray R) +{ + projector_.setCameraParams(K, R); + Point2f xy; + projector_.mapBackward(pt.x, pt.y, xy.x, xy.y); + return xy; +} + +template +Rect RotationWarperBase

    ::buildMaps(Size src_size, InputArray K, InputArray R, OutputArray _xmap, OutputArray _ymap) +{ + projector_.setCameraParams(K, R); + + Point dst_tl, dst_br; + detectResultRoi(src_size, dst_tl, dst_br); + + _xmap.create(dst_br.y - dst_tl.y + 1, dst_br.x - dst_tl.x + 1, CV_32F); + _ymap.create(dst_br.y - dst_tl.y + 1, dst_br.x - dst_tl.x + 1, CV_32F); + + Mat xmap = _xmap.getMat(), ymap = _ymap.getMat(); + + float x, y; + for (int v = dst_tl.y; v <= dst_br.y; ++v) + { + for (int u = dst_tl.x; u <= dst_br.x; ++u) + { + projector_.mapBackward(static_cast(u), static_cast(v), x, y); + xmap.at(v - dst_tl.y, u - dst_tl.x) = x; + ymap.at(v - dst_tl.y, u - dst_tl.x) = y; + } + } + + return Rect(dst_tl, dst_br); +} + + +template +Point RotationWarperBase

    ::warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + OutputArray dst) +{ + UMat xmap, ymap; + Rect dst_roi = buildMaps(src.size(), K, R, xmap, ymap); + + dst.create(dst_roi.height + 1, dst_roi.width + 1, src.type()); + remap(src, dst, xmap, ymap, interp_mode, border_mode); + + return dst_roi.tl(); +} + + +template +void RotationWarperBase

    ::warpBackward(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + Size dst_size, OutputArray dst) +{ + projector_.setCameraParams(K, R); + + Point src_tl, src_br; + detectResultRoi(dst_size, src_tl, src_br); + + Size size = src.size(); + CV_Assert(src_br.x - src_tl.x + 1 == size.width && src_br.y - src_tl.y + 1 == size.height); + + Mat xmap(dst_size, CV_32F); + Mat ymap(dst_size, CV_32F); + + float u, v; + for (int y = 0; y < dst_size.height; ++y) + { + for (int x = 0; x < dst_size.width; ++x) + { + projector_.mapForward(static_cast(x), static_cast(y), u, v); + xmap.at(y, x) = u - src_tl.x; + ymap.at(y, x) = v - src_tl.y; + } + } + + dst.create(dst_size, src.type()); + remap(src, dst, xmap, ymap, interp_mode, border_mode); +} + + +template +Rect RotationWarperBase

    ::warpRoi(Size src_size, InputArray K, InputArray R) +{ + projector_.setCameraParams(K, R); + + Point dst_tl, dst_br; + detectResultRoi(src_size, dst_tl, dst_br); + + return Rect(dst_tl, Point(dst_br.x + 1, dst_br.y + 1)); +} + + +template +void RotationWarperBase

    ::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br) +{ + float tl_uf = (std::numeric_limits::max)(); + float tl_vf = (std::numeric_limits::max)(); + float br_uf = -(std::numeric_limits::max)(); + float br_vf = -(std::numeric_limits::max)(); + + float u, v; + for (int y = 0; y < src_size.height; ++y) + { + for (int x = 0; x < src_size.width; ++x) + { + projector_.mapForward(static_cast(x), static_cast(y), u, v); + tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v); + br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v); + } + } + + dst_tl.x = static_cast(tl_uf); + dst_tl.y = static_cast(tl_vf); + dst_br.x = static_cast(br_uf); + dst_br.y = static_cast(br_vf); +} + + +template +void RotationWarperBase

    ::detectResultRoiByBorder(Size src_size, Point &dst_tl, Point &dst_br) +{ + float tl_uf = (std::numeric_limits::max)(); + float tl_vf = (std::numeric_limits::max)(); + float br_uf = -(std::numeric_limits::max)(); + float br_vf = -(std::numeric_limits::max)(); + + float u, v; + for (float x = 0; x < src_size.width; ++x) + { + projector_.mapForward(static_cast(x), 0, u, v); + tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v); + br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v); + + projector_.mapForward(static_cast(x), static_cast(src_size.height - 1), u, v); + tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v); + br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v); + } + for (int y = 0; y < src_size.height; ++y) + { + projector_.mapForward(0, static_cast(y), u, v); + tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v); + br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v); + + projector_.mapForward(static_cast(src_size.width - 1), static_cast(y), u, v); + tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v); + br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v); + } + + dst_tl.x = static_cast(tl_uf); + dst_tl.y = static_cast(tl_vf); + dst_br.x = static_cast(br_uf); + dst_br.y = static_cast(br_vf); +} + + +inline +void PlaneProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + x_ = t[0] + x_ / z_ * (1 - t[2]); + y_ = t[1] + y_ / z_ * (1 - t[2]); + + u = scale * x_; + v = scale * y_; +} + + +inline +void PlaneProjector::mapBackward(float u, float v, float &x, float &y) +{ + u = u / scale - t[0]; + v = v / scale - t[1]; + + float z; + x = k_rinv[0] * u + k_rinv[1] * v + k_rinv[2] * (1 - t[2]); + y = k_rinv[3] * u + k_rinv[4] * v + k_rinv[5] * (1 - t[2]); + z = k_rinv[6] * u + k_rinv[7] * v + k_rinv[8] * (1 - t[2]); + + x /= z; + y /= z; +} + + +inline +void SphericalProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + u = scale * atan2f(x_, z_); + float w = y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_); + v = scale * (static_cast(CV_PI) - acosf(w == w ? w : 0)); +} + + +inline +void SphericalProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float sinv = sinf(static_cast(CV_PI) - v); + float x_ = sinv * sinf(u); + float y_ = cosf(static_cast(CV_PI) - v); + float z_ = sinv * cosf(u); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + + +inline +void CylindricalProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + u = scale * atan2f(x_, z_); + v = scale * y_ / sqrtf(x_ * x_ + z_ * z_); +} + + +inline +void CylindricalProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float x_ = sinf(u); + float y_ = v; + float z_ = cosf(u); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void FisheyeProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = (float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + u = scale * v_ * cosf(u_); + v = scale * v_ * sinf(u_); +} + +inline +void FisheyeProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float u_ = atan2f(v, u); + float v_ = sqrtf(u*u + v*v); + + float sinv = sinf((float)CV_PI - v_); + float x_ = sinv * sinf(u_); + float y_ = cosf((float)CV_PI - v_); + float z_ = sinv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void StereographicProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = (float)CV_PI - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + float r = sinf(v_) / (1 - cosf(v_)); + + u = scale * r * std::cos(u_); + v = scale * r * std::sin(u_); +} + +inline +void StereographicProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float u_ = atan2f(v, u); + float r = sqrtf(u*u + v*v); + float v_ = 2 * atanf(1.f / r); + + float sinv = sinf((float)CV_PI - v_); + float x_ = sinv * sinf(u_); + float y_ = cosf((float)CV_PI - v_); + float z_ = sinv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void CompressedRectilinearProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + u = scale * a * tanf(u_ / a); + v = scale * b * tanf(v_) / cosf(u_); +} + +inline +void CompressedRectilinearProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float aatg = a * atanf(u / a); + float u_ = aatg; + float v_ = atanf(v * cosf(aatg) / b); + + float cosv = cosf(v_); + float x_ = cosv * sinf(u_); + float y_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void CompressedRectilinearPortraitProjector::mapForward(float x, float y, float &u, float &v) +{ + float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + u = - scale * a * tanf(u_ / a); + v = scale * b * tanf(v_) / cosf(u_); +} + +inline +void CompressedRectilinearPortraitProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= - scale; + v /= scale; + + float aatg = a * atanf(u / a); + float u_ = aatg; + float v_ = atanf(v * cosf( aatg ) / b); + + float cosv = cosf(v_); + float y_ = cosv * sinf(u_); + float x_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void PaniniProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + float tg = a * tanf(u_ / a); + u = scale * tg; + + float sinu = sinf(u_); + if ( fabs(sinu) < 1E-7 ) + v = scale * b * tanf(v_); + else + v = scale * b * tg * tanf(v_) / sinu; +} + +inline +void PaniniProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float lamda = a * atanf(u / a); + float u_ = lamda; + + float v_; + if ( fabs(lamda) > 1E-7) + v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda / a))); + else + v_ = atanf(v / b); + + float cosv = cosf(v_); + float x_ = cosv * sinf(u_); + float y_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void PaniniPortraitProjector::mapForward(float x, float y, float &u, float &v) +{ + float y_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float x_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + float tg = a * tanf(u_ / a); + u = - scale * tg; + + float sinu = sinf( u_ ); + if ( fabs(sinu) < 1E-7 ) + v = scale * b * tanf(v_); + else + v = scale * b * tg * tanf(v_) / sinu; +} + +inline +void PaniniPortraitProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= - scale; + v /= scale; + + float lamda = a * atanf(u / a); + float u_ = lamda; + + float v_; + if ( fabs(lamda) > 1E-7) + v_ = atanf(v * sinf(lamda) / (b * a * tanf(lamda/a))); + else + v_ = atanf(v / b); + + float cosv = cosf(v_); + float y_ = cosv * sinf(u_); + float x_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void MercatorProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + u = scale * u_; + v = scale * logf( tanf( (float)(CV_PI/4) + v_/2 ) ); +} + +inline +void MercatorProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float v_ = atanf( sinhf(v) ); + float u_ = u; + + float cosv = cosf(v_); + float x_ = cosv * sinf(u_); + float y_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void TransverseMercatorProjector::mapForward(float x, float y, float &u, float &v) +{ + float x_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float u_ = atan2f(x_, z_); + float v_ = asinf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_)); + + float B = cosf(v_) * sinf(u_); + + u = scale / 2 * logf( (1+B) / (1-B) ); + v = scale * atan2f(tanf(v_), cosf(u_)); +} + +inline +void TransverseMercatorProjector::mapBackward(float u, float v, float &x, float &y) +{ + u /= scale; + v /= scale; + + float v_ = asinf( sinf(v) / coshf(u) ); + float u_ = atan2f( sinhf(u), std::cos(v) ); + + float cosv = cosf(v_); + float x_ = cosv * sinf(u_); + float y_ = sinf(v_); + float z_ = cosv * cosf(u_); + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void SphericalPortraitProjector::mapForward(float x, float y, float &u0, float &v0) +{ + float x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float x_ = y0_; + float y_ = x0_; + float u, v; + + u = scale * atan2f(x_, z_); + v = scale * (static_cast(CV_PI) - acosf(y_ / sqrtf(x_ * x_ + y_ * y_ + z_ * z_))); + + u0 = -u;//v; + v0 = v;//u; +} + + +inline +void SphericalPortraitProjector::mapBackward(float u0, float v0, float &x, float &y) +{ + float u, v; + u = -u0;//v0; + v = v0;//u0; + + u /= scale; + v /= scale; + + float sinv = sinf(static_cast(CV_PI) - v); + float x0_ = sinv * sinf(u); + float y0_ = cosf(static_cast(CV_PI) - v); + float z_ = sinv * cosf(u); + + float x_ = y0_; + float y_ = x0_; + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void CylindricalPortraitProjector::mapForward(float x, float y, float &u0, float &v0) +{ + float x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float x_ = y0_; + float y_ = x0_; + float u, v; + + u = scale * atan2f(x_, z_); + v = scale * y_ / sqrtf(x_ * x_ + z_ * z_); + + u0 = -u;//v; + v0 = v;//u; +} + + +inline +void CylindricalPortraitProjector::mapBackward(float u0, float v0, float &x, float &y) +{ + float u, v; + u = -u0;//v0; + v = v0;//u0; + + u /= scale; + v /= scale; + + float x0_ = sinf(u); + float y0_ = v; + float z_ = cosf(u); + + float x_ = y0_; + float y_ = x0_; + + float z; + x = k_rinv[0] * x_ + k_rinv[1] * y_ + k_rinv[2] * z_; + y = k_rinv[3] * x_ + k_rinv[4] * y_ + k_rinv[5] * z_; + z = k_rinv[6] * x_ + k_rinv[7] * y_ + k_rinv[8] * z_; + + if (z > 0) { x /= z; y /= z; } + else x = y = -1; +} + +inline +void PlanePortraitProjector::mapForward(float x, float y, float &u0, float &v0) +{ + float x0_ = r_kinv[0] * x + r_kinv[1] * y + r_kinv[2]; + float y0_ = r_kinv[3] * x + r_kinv[4] * y + r_kinv[5]; + float z_ = r_kinv[6] * x + r_kinv[7] * y + r_kinv[8]; + + float x_ = y0_; + float y_ = x0_; + + x_ = t[0] + x_ / z_ * (1 - t[2]); + y_ = t[1] + y_ / z_ * (1 - t[2]); + + float u,v; + u = scale * x_; + v = scale * y_; + + u0 = -u; + v0 = v; +} + + +inline +void PlanePortraitProjector::mapBackward(float u0, float v0, float &x, float &y) +{ + float u, v; + u = -u0; + v = v0; + + u = u / scale - t[0]; + v = v / scale - t[1]; + + float z; + x = k_rinv[0] * v + k_rinv[1] * u + k_rinv[2] * (1 - t[2]); + y = k_rinv[3] * v + k_rinv[4] * u + k_rinv[5] * (1 - t[2]); + z = k_rinv[6] * v + k_rinv[7] * u + k_rinv[8] * (1 - t[2]); + + x /= z; + y /= z; +} + + +} // namespace detail +} // namespace cv + +//! @endcond + +#endif // OPENCV_STITCHING_WARPERS_INL_HPP diff --git a/Thirdparty/opencv2/include/opencv2/stitching/warpers.hpp b/Thirdparty/opencv2/include/opencv2/stitching/warpers.hpp new file mode 100644 index 0000000..0a5bf63 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/stitching/warpers.hpp @@ -0,0 +1,277 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_STITCHING_WARPER_CREATORS_HPP +#define OPENCV_STITCHING_WARPER_CREATORS_HPP + +#include "opencv2/stitching/detail/warpers.hpp" +#include + +namespace cv { + class CV_EXPORTS_W PyRotationWarper + { + Ptr rw; + + public: + CV_WRAP PyRotationWarper(String type, float scale); + CV_WRAP PyRotationWarper() {} + ~PyRotationWarper() {} + + /** @brief Projects the image point. + + @param pt Source point + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Projected point + */ + CV_WRAP Point2f warpPoint(const Point2f &pt, InputArray K, InputArray R); + + /** @brief Projects the image point backward. + + @param pt Projected point + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Backward-projected point + */ +#if CV_VERSION_MAJOR == 4 + CV_WRAP Point2f warpPointBackward(const Point2f& pt, InputArray K, InputArray R) + { + CV_UNUSED(pt); CV_UNUSED(K); CV_UNUSED(R); + CV_Error(Error::StsNotImplemented, ""); + } +#else + CV_WRAP Point2f warpPointBackward(const Point2f &pt, InputArray K, InputArray R); +#endif + /** @brief Builds the projection maps according to the given camera data. + + @param src_size Source image size + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param xmap Projection map for the x axis + @param ymap Projection map for the y axis + @return Projected image minimum bounding box + */ + CV_WRAP Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap); + + /** @brief Projects the image. + + @param src Source image + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param interp_mode Interpolation mode + @param border_mode Border extrapolation mode + @param dst Projected image + @return Project image top-left corner + */ + CV_WRAP Point warp(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + CV_OUT OutputArray dst); + + /** @brief Projects the image backward. + + @param src Projected image + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @param interp_mode Interpolation mode + @param border_mode Border extrapolation mode + @param dst_size Backward-projected image size + @param dst Backward-projected image + */ + CV_WRAP void warpBackward(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, + Size dst_size, CV_OUT OutputArray dst); + + /** + @param src_size Source image bounding box + @param K Camera intrinsic parameters + @param R Camera rotation matrix + @return Projected image minimum bounding box + */ + CV_WRAP Rect warpRoi(Size src_size, InputArray K, InputArray R); + + CV_WRAP float getScale() const { return 1.f; } + CV_WRAP void setScale(float) {} + }; + +//! @addtogroup stitching_warp +//! @{ + +/** @brief Image warper factories base class. + */ + +class CV_EXPORTS_W WarperCreator +{ +public: + CV_WRAP virtual ~WarperCreator() {} + virtual Ptr create(float scale) const = 0; +}; + + +/** @brief Plane warper factory class. + @sa detail::PlaneWarper + */ +class CV_EXPORTS PlaneWarper : public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +/** @brief Affine warper factory class. + @sa detail::AffineWarper + */ +class CV_EXPORTS AffineWarper : public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +/** @brief Cylindrical warper factory class. +@sa detail::CylindricalWarper +*/ +class CV_EXPORTS CylindricalWarper: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +/** @brief Spherical warper factory class */ +class CV_EXPORTS SphericalWarper: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +class CV_EXPORTS FisheyeWarper : public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +class CV_EXPORTS StereographicWarper: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +class CV_EXPORTS CompressedRectilinearWarper: public WarperCreator +{ + float a, b; +public: + CompressedRectilinearWarper(float A = 1, float B = 1) + { + a = A; b = B; + } + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale, a, b); } +}; + +class CV_EXPORTS CompressedRectilinearPortraitWarper: public WarperCreator +{ + float a, b; +public: + CompressedRectilinearPortraitWarper(float A = 1, float B = 1) + { + a = A; b = B; + } + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale, a, b); } +}; + +class CV_EXPORTS PaniniWarper: public WarperCreator +{ + float a, b; +public: + PaniniWarper(float A = 1, float B = 1) + { + a = A; b = B; + } + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale, a, b); } +}; + +class CV_EXPORTS PaniniPortraitWarper: public WarperCreator +{ + float a, b; +public: + PaniniPortraitWarper(float A = 1, float B = 1) + { + a = A; b = B; + } + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale, a, b); } +}; + +class CV_EXPORTS MercatorWarper: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + +class CV_EXPORTS TransverseMercatorWarper: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + + + +#ifdef HAVE_OPENCV_CUDAWARPING +class PlaneWarperGpu: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + + +class CylindricalWarperGpu: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; + + +class SphericalWarperGpu: public WarperCreator +{ +public: + Ptr create(float scale) const CV_OVERRIDE { return makePtr(scale); } +}; +#endif + +//! @} stitching_warp + +} // namespace cv + +#endif // OPENCV_STITCHING_WARPER_CREATORS_HPP diff --git a/Thirdparty/opencv2/include/opencv2/video.hpp b/Thirdparty/opencv2/include/opencv2/video.hpp new file mode 100644 index 0000000..a3dde60 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video.hpp @@ -0,0 +1,59 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_VIDEO_HPP +#define OPENCV_VIDEO_HPP + +/** + @defgroup video Video Analysis + @{ + @defgroup video_motion Motion Analysis + @defgroup video_track Object Tracking + @defgroup video_c C API + @} +*/ + +#include "opencv2/video/tracking.hpp" +#include "opencv2/video/background_segm.hpp" + +#endif //OPENCV_VIDEO_HPP diff --git a/Thirdparty/opencv2/include/opencv2/video/background_segm.hpp b/Thirdparty/opencv2/include/opencv2/video/background_segm.hpp new file mode 100644 index 0000000..e1dfa15 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video/background_segm.hpp @@ -0,0 +1,317 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_BACKGROUND_SEGM_HPP +#define OPENCV_BACKGROUND_SEGM_HPP + +#include "opencv2/core.hpp" + +namespace cv +{ + +//! @addtogroup video_motion +//! @{ + +/** @brief Base class for background/foreground segmentation. : + +The class is only used to define the common interface for the whole family of background/foreground +segmentation algorithms. + */ +class CV_EXPORTS_W BackgroundSubtractor : public Algorithm +{ +public: + /** @brief Computes a foreground mask. + + @param image Next video frame. + @param fgmask The output foreground mask as an 8-bit binary image. + @param learningRate The value between 0 and 1 that indicates how fast the background model is + learnt. Negative parameter value makes the algorithm to use some automatically chosen learning + rate. 0 means that the background model is not updated at all, 1 means that the background model + is completely reinitialized from the last frame. + */ + CV_WRAP virtual void apply(InputArray image, OutputArray fgmask, double learningRate=-1) = 0; + + /** @brief Computes a background image. + + @param backgroundImage The output background image. + + @note Sometimes the background image can be very blurry, as it contain the average background + statistics. + */ + CV_WRAP virtual void getBackgroundImage(OutputArray backgroundImage) const = 0; +}; + + +/** @brief Gaussian Mixture-based Background/Foreground Segmentation Algorithm. + +The class implements the Gaussian mixture model background subtraction described in @cite Zivkovic2004 +and @cite Zivkovic2006 . + */ +class CV_EXPORTS_W BackgroundSubtractorMOG2 : public BackgroundSubtractor +{ +public: + /** @brief Returns the number of last frames that affect the background model + */ + CV_WRAP virtual int getHistory() const = 0; + /** @brief Sets the number of last frames that affect the background model + */ + CV_WRAP virtual void setHistory(int history) = 0; + + /** @brief Returns the number of gaussian components in the background model + */ + CV_WRAP virtual int getNMixtures() const = 0; + /** @brief Sets the number of gaussian components in the background model. + + The model needs to be reinitalized to reserve memory. + */ + CV_WRAP virtual void setNMixtures(int nmixtures) = 0;//needs reinitialization! + + /** @brief Returns the "background ratio" parameter of the algorithm + + If a foreground pixel keeps semi-constant value for about backgroundRatio\*history frames, it's + considered background and added to the model as a center of a new component. It corresponds to TB + parameter in the paper. + */ + CV_WRAP virtual double getBackgroundRatio() const = 0; + /** @brief Sets the "background ratio" parameter of the algorithm + */ + CV_WRAP virtual void setBackgroundRatio(double ratio) = 0; + + /** @brief Returns the variance threshold for the pixel-model match + + The main threshold on the squared Mahalanobis distance to decide if the sample is well described by + the background model or not. Related to Cthr from the paper. + */ + CV_WRAP virtual double getVarThreshold() const = 0; + /** @brief Sets the variance threshold for the pixel-model match + */ + CV_WRAP virtual void setVarThreshold(double varThreshold) = 0; + + /** @brief Returns the variance threshold for the pixel-model match used for new mixture component generation + + Threshold for the squared Mahalanobis distance that helps decide when a sample is close to the + existing components (corresponds to Tg in the paper). If a pixel is not close to any component, it + is considered foreground or added as a new component. 3 sigma =\> Tg=3\*3=9 is default. A smaller Tg + value generates more components. A higher Tg value may result in a small number of components but + they can grow too large. + */ + CV_WRAP virtual double getVarThresholdGen() const = 0; + /** @brief Sets the variance threshold for the pixel-model match used for new mixture component generation + */ + CV_WRAP virtual void setVarThresholdGen(double varThresholdGen) = 0; + + /** @brief Returns the initial variance of each gaussian component + */ + CV_WRAP virtual double getVarInit() const = 0; + /** @brief Sets the initial variance of each gaussian component + */ + CV_WRAP virtual void setVarInit(double varInit) = 0; + + CV_WRAP virtual double getVarMin() const = 0; + CV_WRAP virtual void setVarMin(double varMin) = 0; + + CV_WRAP virtual double getVarMax() const = 0; + CV_WRAP virtual void setVarMax(double varMax) = 0; + + /** @brief Returns the complexity reduction threshold + + This parameter defines the number of samples needed to accept to prove the component exists. CT=0.05 + is a default value for all the samples. By setting CT=0 you get an algorithm very similar to the + standard Stauffer&Grimson algorithm. + */ + CV_WRAP virtual double getComplexityReductionThreshold() const = 0; + /** @brief Sets the complexity reduction threshold + */ + CV_WRAP virtual void setComplexityReductionThreshold(double ct) = 0; + + /** @brief Returns the shadow detection flag + + If true, the algorithm detects shadows and marks them. See createBackgroundSubtractorMOG2 for + details. + */ + CV_WRAP virtual bool getDetectShadows() const = 0; + /** @brief Enables or disables shadow detection + */ + CV_WRAP virtual void setDetectShadows(bool detectShadows) = 0; + + /** @brief Returns the shadow value + + Shadow value is the value used to mark shadows in the foreground mask. Default value is 127. Value 0 + in the mask always means background, 255 means foreground. + */ + CV_WRAP virtual int getShadowValue() const = 0; + /** @brief Sets the shadow value + */ + CV_WRAP virtual void setShadowValue(int value) = 0; + + /** @brief Returns the shadow threshold + + A shadow is detected if pixel is a darker version of the background. The shadow threshold (Tau in + the paper) is a threshold defining how much darker the shadow can be. Tau= 0.5 means that if a pixel + is more than twice darker then it is not shadow. See Prati, Mikic, Trivedi and Cucchiara, + *Detecting Moving Shadows...*, IEEE PAMI,2003. + */ + CV_WRAP virtual double getShadowThreshold() const = 0; + /** @brief Sets the shadow threshold + */ + CV_WRAP virtual void setShadowThreshold(double threshold) = 0; + + /** @brief Computes a foreground mask. + + @param image Next video frame. Floating point frame will be used without scaling and should be in range \f$[0,255]\f$. + @param fgmask The output foreground mask as an 8-bit binary image. + @param learningRate The value between 0 and 1 that indicates how fast the background model is + learnt. Negative parameter value makes the algorithm to use some automatically chosen learning + rate. 0 means that the background model is not updated at all, 1 means that the background model + is completely reinitialized from the last frame. + */ + CV_WRAP virtual void apply(InputArray image, OutputArray fgmask, double learningRate=-1) CV_OVERRIDE = 0; +}; + +/** @brief Creates MOG2 Background Subtractor + +@param history Length of the history. +@param varThreshold Threshold on the squared Mahalanobis distance between the pixel and the model +to decide whether a pixel is well described by the background model. This parameter does not +affect the background update. +@param detectShadows If true, the algorithm will detect shadows and mark them. It decreases the +speed a bit, so if you do not need this feature, set the parameter to false. + */ +CV_EXPORTS_W Ptr + createBackgroundSubtractorMOG2(int history=500, double varThreshold=16, + bool detectShadows=true); + +/** @brief K-nearest neighbours - based Background/Foreground Segmentation Algorithm. + +The class implements the K-nearest neighbours background subtraction described in @cite Zivkovic2006 . +Very efficient if number of foreground pixels is low. + */ +class CV_EXPORTS_W BackgroundSubtractorKNN : public BackgroundSubtractor +{ +public: + /** @brief Returns the number of last frames that affect the background model + */ + CV_WRAP virtual int getHistory() const = 0; + /** @brief Sets the number of last frames that affect the background model + */ + CV_WRAP virtual void setHistory(int history) = 0; + + /** @brief Returns the number of data samples in the background model + */ + CV_WRAP virtual int getNSamples() const = 0; + /** @brief Sets the number of data samples in the background model. + + The model needs to be reinitalized to reserve memory. + */ + CV_WRAP virtual void setNSamples(int _nN) = 0;//needs reinitialization! + + /** @brief Returns the threshold on the squared distance between the pixel and the sample + + The threshold on the squared distance between the pixel and the sample to decide whether a pixel is + close to a data sample. + */ + CV_WRAP virtual double getDist2Threshold() const = 0; + /** @brief Sets the threshold on the squared distance + */ + CV_WRAP virtual void setDist2Threshold(double _dist2Threshold) = 0; + + /** @brief Returns the number of neighbours, the k in the kNN. + + K is the number of samples that need to be within dist2Threshold in order to decide that that + pixel is matching the kNN background model. + */ + CV_WRAP virtual int getkNNSamples() const = 0; + /** @brief Sets the k in the kNN. How many nearest neighbours need to match. + */ + CV_WRAP virtual void setkNNSamples(int _nkNN) = 0; + + /** @brief Returns the shadow detection flag + + If true, the algorithm detects shadows and marks them. See createBackgroundSubtractorKNN for + details. + */ + CV_WRAP virtual bool getDetectShadows() const = 0; + /** @brief Enables or disables shadow detection + */ + CV_WRAP virtual void setDetectShadows(bool detectShadows) = 0; + + /** @brief Returns the shadow value + + Shadow value is the value used to mark shadows in the foreground mask. Default value is 127. Value 0 + in the mask always means background, 255 means foreground. + */ + CV_WRAP virtual int getShadowValue() const = 0; + /** @brief Sets the shadow value + */ + CV_WRAP virtual void setShadowValue(int value) = 0; + + /** @brief Returns the shadow threshold + + A shadow is detected if pixel is a darker version of the background. The shadow threshold (Tau in + the paper) is a threshold defining how much darker the shadow can be. Tau= 0.5 means that if a pixel + is more than twice darker then it is not shadow. See Prati, Mikic, Trivedi and Cucchiara, + *Detecting Moving Shadows...*, IEEE PAMI,2003. + */ + CV_WRAP virtual double getShadowThreshold() const = 0; + /** @brief Sets the shadow threshold + */ + CV_WRAP virtual void setShadowThreshold(double threshold) = 0; +}; + +/** @brief Creates KNN Background Subtractor + +@param history Length of the history. +@param dist2Threshold Threshold on the squared distance between the pixel and the sample to decide +whether a pixel is close to that sample. This parameter does not affect the background update. +@param detectShadows If true, the algorithm will detect shadows and mark them. It decreases the +speed a bit, so if you do not need this feature, set the parameter to false. + */ +CV_EXPORTS_W Ptr + createBackgroundSubtractorKNN(int history=500, double dist2Threshold=400.0, + bool detectShadows=true); + +//! @} video_motion + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/video/detail/tracking.detail.hpp b/Thirdparty/opencv2/include/opencv2/video/detail/tracking.detail.hpp new file mode 100644 index 0000000..3c7823b --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video/detail/tracking.detail.hpp @@ -0,0 +1,406 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_VIDEO_DETAIL_TRACKING_HPP +#define OPENCV_VIDEO_DETAIL_TRACKING_HPP + +/* + * Partially based on: + * ==================================================================================================================== + * - [AAM] S. Salti, A. Cavallaro, L. Di Stefano, Adaptive Appearance Modeling for Video Tracking: Survey and Evaluation + * - [AMVOT] X. Li, W. Hu, C. Shen, Z. Zhang, A. Dick, A. van den Hengel, A Survey of Appearance Models in Visual Object Tracking + * + * This Tracking API has been designed with PlantUML. If you modify this API please change UML files under modules/tracking/doc/uml + * + */ + +#include "opencv2/core.hpp" + +namespace cv { +namespace detail { +inline namespace tracking { + +/** @addtogroup tracking_detail +@{ +*/ + +/************************************ TrackerFeature Base Classes ************************************/ + +/** @brief Abstract base class for TrackerFeature that represents the feature. +*/ +class CV_EXPORTS TrackerFeature +{ +public: + virtual ~TrackerFeature(); + + /** @brief Compute the features in the images collection + @param images The images + @param response The output response + */ + void compute(const std::vector& images, Mat& response); + +protected: + virtual bool computeImpl(const std::vector& images, Mat& response) = 0; +}; + +/** @brief Class that manages the extraction and selection of features + +@cite AAM Feature Extraction and Feature Set Refinement (Feature Processing and Feature Selection). +See table I and section III C @cite AMVOT Appearance modelling -\> Visual representation (Table II, +section 3.1 - 3.2) + +TrackerFeatureSet is an aggregation of TrackerFeature + +@sa + TrackerFeature + +*/ +class CV_EXPORTS TrackerFeatureSet +{ +public: + TrackerFeatureSet(); + + ~TrackerFeatureSet(); + + /** @brief Extract features from the images collection + @param images The input images + */ + void extraction(const std::vector& images); + + /** @brief Add TrackerFeature in the collection. Return true if TrackerFeature is added, false otherwise + @param feature The TrackerFeature class + */ + bool addTrackerFeature(const Ptr& feature); + + /** @brief Get the TrackerFeature collection (TrackerFeature name, TrackerFeature pointer) + */ + const std::vector>& getTrackerFeatures() const; + + /** @brief Get the responses + @note Be sure to call extraction before getResponses Example TrackerFeatureSet::getResponses + */ + const std::vector& getResponses() const; + +private: + void clearResponses(); + bool blockAddTrackerFeature; + + std::vector> features; // list of features + std::vector responses; // list of response after compute +}; + +/************************************ TrackerSampler Base Classes ************************************/ + +/** @brief Abstract base class for TrackerSamplerAlgorithm that represents the algorithm for the specific +sampler. +*/ +class CV_EXPORTS TrackerSamplerAlgorithm +{ +public: + virtual ~TrackerSamplerAlgorithm(); + + /** @brief Computes the regions starting from a position in an image. + + Return true if samples are computed, false otherwise + + @param image The current frame + @param boundingBox The bounding box from which regions can be calculated + + @param sample The computed samples @cite AAM Fig. 1 variable Sk + */ + virtual bool sampling(const Mat& image, const Rect& boundingBox, std::vector& sample) = 0; +}; + +/** + * \brief Class that manages the sampler in order to select regions for the update the model of the tracker + * [AAM] Sampling e Labeling. See table I and section III B + */ + +/** @brief Class that manages the sampler in order to select regions for the update the model of the tracker + +@cite AAM Sampling e Labeling. See table I and section III B + +TrackerSampler is an aggregation of TrackerSamplerAlgorithm +@sa + TrackerSamplerAlgorithm + */ +class CV_EXPORTS TrackerSampler +{ +public: + TrackerSampler(); + + ~TrackerSampler(); + + /** @brief Computes the regions starting from a position in an image + @param image The current frame + @param boundingBox The bounding box from which regions can be calculated + */ + void sampling(const Mat& image, Rect boundingBox); + + /** @brief Return the collection of the TrackerSamplerAlgorithm + */ + const std::vector>& getSamplers() const; + + /** @brief Return the samples from all TrackerSamplerAlgorithm, @cite AAM Fig. 1 variable Sk + */ + const std::vector& getSamples() const; + + /** @brief Add TrackerSamplerAlgorithm in the collection. Return true if sampler is added, false otherwise + @param sampler The TrackerSamplerAlgorithm + */ + bool addTrackerSamplerAlgorithm(const Ptr& sampler); + +private: + std::vector> samplers; + std::vector samples; + bool blockAddTrackerSampler; + + void clearSamples(); +}; + +/************************************ TrackerModel Base Classes ************************************/ + +/** @brief Abstract base class for TrackerTargetState that represents a possible state of the target. + +See @cite AAM \f$\hat{x}^{i}_{k}\f$ all the states candidates. + +Inherits this class with your Target state, In own implementation you can add scale variation, +width, height, orientation, etc. +*/ +class CV_EXPORTS TrackerTargetState +{ +public: + virtual ~TrackerTargetState() {} + /** @brief Get the position + * @return The position + */ + Point2f getTargetPosition() const; + + /** @brief Set the position + * @param position The position + */ + void setTargetPosition(const Point2f& position); + /** @brief Get the width of the target + * @return The width of the target + */ + int getTargetWidth() const; + + /** @brief Set the width of the target + * @param width The width of the target + */ + void setTargetWidth(int width); + /** @brief Get the height of the target + * @return The height of the target + */ + int getTargetHeight() const; + + /** @brief Set the height of the target + * @param height The height of the target + */ + void setTargetHeight(int height); + +protected: + Point2f targetPosition; + int targetWidth; + int targetHeight; +}; + +/** @brief Represents the model of the target at frame \f$k\f$ (all states and scores) + +See @cite AAM The set of the pair \f$\langle \hat{x}^{i}_{k}, C^{i}_{k} \rangle\f$ +@sa TrackerTargetState +*/ +typedef std::vector, float>> ConfidenceMap; + +/** @brief Represents the estimate states for all frames + +@cite AAM \f$x_{k}\f$ is the trajectory of the target up to time \f$k\f$ + +@sa TrackerTargetState +*/ +typedef std::vector> Trajectory; + +/** @brief Abstract base class for TrackerStateEstimator that estimates the most likely target state. + +See @cite AAM State estimator + +See @cite AMVOT Statistical modeling (Fig. 3), Table III (generative) - IV (discriminative) - V (hybrid) +*/ +class CV_EXPORTS TrackerStateEstimator +{ +public: + virtual ~TrackerStateEstimator(); + + /** @brief Estimate the most likely target state, return the estimated state + @param confidenceMaps The overall appearance model as a list of :cConfidenceMap + */ + Ptr estimate(const std::vector& confidenceMaps); + + /** @brief Update the ConfidenceMap with the scores + @param confidenceMaps The overall appearance model as a list of :cConfidenceMap + */ + void update(std::vector& confidenceMaps); + + /** @brief Create TrackerStateEstimator by tracker state estimator type + @param trackeStateEstimatorType The TrackerStateEstimator name + + The modes available now: + + - "BOOSTING" -- Boosting-based discriminative appearance models. See @cite AMVOT section 4.4 + + The modes available soon: + + - "SVM" -- SVM-based discriminative appearance models. See @cite AMVOT section 4.5 + */ + static Ptr create(const String& trackeStateEstimatorType); + + /** @brief Get the name of the specific TrackerStateEstimator + */ + String getClassName() const; + +protected: + virtual Ptr estimateImpl(const std::vector& confidenceMaps) = 0; + virtual void updateImpl(std::vector& confidenceMaps) = 0; + String className; +}; + +/** @brief Abstract class that represents the model of the target. + +It must be instantiated by specialized tracker + +See @cite AAM Ak + +Inherits this with your TrackerModel +*/ +class CV_EXPORTS TrackerModel +{ +public: + TrackerModel(); + + virtual ~TrackerModel(); + + /** @brief Set TrackerEstimator, return true if the tracker state estimator is added, false otherwise + @param trackerStateEstimator The TrackerStateEstimator + @note You can add only one TrackerStateEstimator + */ + bool setTrackerStateEstimator(Ptr trackerStateEstimator); + + /** @brief Estimate the most likely target location + + @cite AAM ME, Model Estimation table I + @param responses Features extracted from TrackerFeatureSet + */ + void modelEstimation(const std::vector& responses); + + /** @brief Update the model + + @cite AAM MU, Model Update table I + */ + void modelUpdate(); + + /** @brief Run the TrackerStateEstimator, return true if is possible to estimate a new state, false otherwise + */ + bool runStateEstimator(); + + /** @brief Set the current TrackerTargetState in the Trajectory + @param lastTargetState The current TrackerTargetState + */ + void setLastTargetState(const Ptr& lastTargetState); + + /** @brief Get the last TrackerTargetState from Trajectory + */ + Ptr getLastTargetState() const; + + /** @brief Get the list of the ConfidenceMap + */ + const std::vector& getConfidenceMaps() const; + + /** @brief Get the last ConfidenceMap for the current frame + */ + const ConfidenceMap& getLastConfidenceMap() const; + + /** @brief Get the TrackerStateEstimator + */ + Ptr getTrackerStateEstimator() const; + +private: + void clearCurrentConfidenceMap(); + +protected: + std::vector confidenceMaps; + Ptr stateEstimator; + ConfidenceMap currentConfidenceMap; + Trajectory trajectory; + int maxCMLength; + + virtual void modelEstimationImpl(const std::vector& responses) = 0; + virtual void modelUpdateImpl() = 0; +}; + +/************************************ Specific TrackerStateEstimator Classes ************************************/ + +// None + +/************************************ Specific TrackerSamplerAlgorithm Classes ************************************/ + +/** @brief TrackerSampler based on CSC (current state centered), used by MIL algorithm TrackerMIL + */ +class CV_EXPORTS TrackerSamplerCSC : public TrackerSamplerAlgorithm +{ +public: + ~TrackerSamplerCSC(); + + enum MODE + { + MODE_INIT_POS = 1, //!< mode for init positive samples + MODE_INIT_NEG = 2, //!< mode for init negative samples + MODE_TRACK_POS = 3, //!< mode for update positive samples + MODE_TRACK_NEG = 4, //!< mode for update negative samples + MODE_DETECT = 5 //!< mode for detect samples + }; + + struct CV_EXPORTS Params + { + Params(); + float initInRad; //!< radius for gathering positive instances during init + float trackInPosRad; //!< radius for gathering positive instances during tracking + float searchWinSize; //!< size of search window + int initMaxNegNum; //!< # negative samples to use during init + int trackMaxPosNum; //!< # positive samples to use during training + int trackMaxNegNum; //!< # negative samples to use during training + }; + + /** @brief Constructor + @param parameters TrackerSamplerCSC parameters TrackerSamplerCSC::Params + */ + TrackerSamplerCSC(const TrackerSamplerCSC::Params& parameters = TrackerSamplerCSC::Params()); + + /** @brief Set the sampling mode of TrackerSamplerCSC + @param samplingMode The sampling mode + + The modes are: + + - "MODE_INIT_POS = 1" -- for the positive sampling in initialization step + - "MODE_INIT_NEG = 2" -- for the negative sampling in initialization step + - "MODE_TRACK_POS = 3" -- for the positive sampling in update step + - "MODE_TRACK_NEG = 4" -- for the negative sampling in update step + - "MODE_DETECT = 5" -- for the sampling in detection step + */ + void setMode(int samplingMode); + + bool sampling(const Mat& image, const Rect& boundingBox, std::vector& sample) CV_OVERRIDE; + +private: + Params params; + int mode; + RNG rng; + + std::vector sampleImage(const Mat& img, int x, int y, int w, int h, float inrad, float outrad = 0, int maxnum = 1000000); +}; + +//! @} + +}}} // namespace cv::detail::tracking + +#endif // OPENCV_VIDEO_DETAIL_TRACKING_HPP diff --git a/Thirdparty/opencv2/include/opencv2/video/legacy/constants_c.h b/Thirdparty/opencv2/include/opencv2/video/legacy/constants_c.h new file mode 100644 index 0000000..1a98f52 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video/legacy/constants_c.h @@ -0,0 +1,16 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_VIDEO_LEGACY_CONSTANTS_H +#define OPENCV_VIDEO_LEGACY_CONSTANTS_H + +enum +{ + CV_LKFLOW_PYR_A_READY = 1, + CV_LKFLOW_PYR_B_READY = 2, + CV_LKFLOW_INITIAL_GUESSES = 4, + CV_LKFLOW_GET_MIN_EIGENVALS = 8 +}; + +#endif // OPENCV_VIDEO_LEGACY_CONSTANTS_H diff --git a/Thirdparty/opencv2/include/opencv2/video/tracking.hpp b/Thirdparty/opencv2/include/opencv2/video/tracking.hpp new file mode 100644 index 0000000..8dbcfbf --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video/tracking.hpp @@ -0,0 +1,931 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_TRACKING_HPP +#define OPENCV_TRACKING_HPP + +#include "opencv2/core.hpp" +#include "opencv2/imgproc.hpp" + +namespace cv +{ + +//! @addtogroup video_track +//! @{ + +enum { OPTFLOW_USE_INITIAL_FLOW = 4, + OPTFLOW_LK_GET_MIN_EIGENVALS = 8, + OPTFLOW_FARNEBACK_GAUSSIAN = 256 + }; + +/** @brief Finds an object center, size, and orientation. + +@param probImage Back projection of the object histogram. See calcBackProject. +@param window Initial search window. +@param criteria Stop criteria for the underlying meanShift. +returns +(in old interfaces) Number of iterations CAMSHIFT took to converge +The function implements the CAMSHIFT object tracking algorithm @cite Bradski98 . First, it finds an +object center using meanShift and then adjusts the window size and finds the optimal rotation. The +function returns the rotated rectangle structure that includes the object position, size, and +orientation. The next position of the search window can be obtained with RotatedRect::boundingRect() + +See the OpenCV sample camshiftdemo.c that tracks colored objects. + +@note +- (Python) A sample explaining the camshift tracking algorithm can be found at + opencv_source_code/samples/python/camshift.py + */ +CV_EXPORTS_W RotatedRect CamShift( InputArray probImage, CV_IN_OUT Rect& window, + TermCriteria criteria ); +/** @example samples/cpp/camshiftdemo.cpp +An example using the mean-shift tracking algorithm +*/ + +/** @brief Finds an object on a back projection image. + +@param probImage Back projection of the object histogram. See calcBackProject for details. +@param window Initial search window. +@param criteria Stop criteria for the iterative search algorithm. +returns +: Number of iterations CAMSHIFT took to converge. +The function implements the iterative object search algorithm. It takes the input back projection of +an object and the initial position. The mass center in window of the back projection image is +computed and the search window center shifts to the mass center. The procedure is repeated until the +specified number of iterations criteria.maxCount is done or until the window center shifts by less +than criteria.epsilon. The algorithm is used inside CamShift and, unlike CamShift , the search +window size or orientation do not change during the search. You can simply pass the output of +calcBackProject to this function. But better results can be obtained if you pre-filter the back +projection and remove the noise. For example, you can do this by retrieving connected components +with findContours , throwing away contours with small area ( contourArea ), and rendering the +remaining contours with drawContours. + + */ +CV_EXPORTS_W int meanShift( InputArray probImage, CV_IN_OUT Rect& window, TermCriteria criteria ); + +/** @brief Constructs the image pyramid which can be passed to calcOpticalFlowPyrLK. + +@param img 8-bit input image. +@param pyramid output pyramid. +@param winSize window size of optical flow algorithm. Must be not less than winSize argument of +calcOpticalFlowPyrLK. It is needed to calculate required padding for pyramid levels. +@param maxLevel 0-based maximal pyramid level number. +@param withDerivatives set to precompute gradients for the every pyramid level. If pyramid is +constructed without the gradients then calcOpticalFlowPyrLK will calculate them internally. +@param pyrBorder the border mode for pyramid layers. +@param derivBorder the border mode for gradients. +@param tryReuseInputImage put ROI of input image into the pyramid if possible. You can pass false +to force data copying. +@return number of levels in constructed pyramid. Can be less than maxLevel. + */ +CV_EXPORTS_W int buildOpticalFlowPyramid( InputArray img, OutputArrayOfArrays pyramid, + Size winSize, int maxLevel, bool withDerivatives = true, + int pyrBorder = BORDER_REFLECT_101, + int derivBorder = BORDER_CONSTANT, + bool tryReuseInputImage = true ); + +/** @example samples/cpp/lkdemo.cpp +An example using the Lucas-Kanade optical flow algorithm +*/ + +/** @brief Calculates an optical flow for a sparse feature set using the iterative Lucas-Kanade method with +pyramids. + +@param prevImg first 8-bit input image or pyramid constructed by buildOpticalFlowPyramid. +@param nextImg second input image or pyramid of the same size and the same type as prevImg. +@param prevPts vector of 2D points for which the flow needs to be found; point coordinates must be +single-precision floating-point numbers. +@param nextPts output vector of 2D points (with single-precision floating-point coordinates) +containing the calculated new positions of input features in the second image; when +OPTFLOW_USE_INITIAL_FLOW flag is passed, the vector must have the same size as in the input. +@param status output status vector (of unsigned chars); each element of the vector is set to 1 if +the flow for the corresponding features has been found, otherwise, it is set to 0. +@param err output vector of errors; each element of the vector is set to an error for the +corresponding feature, type of the error measure can be set in flags parameter; if the flow wasn't +found then the error is not defined (use the status parameter to find such cases). +@param winSize size of the search window at each pyramid level. +@param maxLevel 0-based maximal pyramid level number; if set to 0, pyramids are not used (single +level), if set to 1, two levels are used, and so on; if pyramids are passed to input then +algorithm will use as many levels as pyramids have but no more than maxLevel. +@param criteria parameter, specifying the termination criteria of the iterative search algorithm +(after the specified maximum number of iterations criteria.maxCount or when the search window +moves by less than criteria.epsilon. +@param flags operation flags: + - **OPTFLOW_USE_INITIAL_FLOW** uses initial estimations, stored in nextPts; if the flag is + not set, then prevPts is copied to nextPts and is considered the initial estimate. + - **OPTFLOW_LK_GET_MIN_EIGENVALS** use minimum eigen values as an error measure (see + minEigThreshold description); if the flag is not set, then L1 distance between patches + around the original and a moved point, divided by number of pixels in a window, is used as a + error measure. +@param minEigThreshold the algorithm calculates the minimum eigen value of a 2x2 normal matrix of +optical flow equations (this matrix is called a spatial gradient matrix in @cite Bouguet00), divided +by number of pixels in a window; if this value is less than minEigThreshold, then a corresponding +feature is filtered out and its flow is not processed, so it allows to remove bad points and get a +performance boost. + +The function implements a sparse iterative version of the Lucas-Kanade optical flow in pyramids. See +@cite Bouguet00 . The function is parallelized with the TBB library. + +@note Some examples: + +- An example using the Lucas-Kanade optical flow algorithm can be found at + opencv_source_code/samples/cpp/lkdemo.cpp +- (Python) An example using the Lucas-Kanade optical flow algorithm can be found at + opencv_source_code/samples/python/lk_track.py +- (Python) An example using the Lucas-Kanade tracker for homography matching can be found at + opencv_source_code/samples/python/lk_homography.py + */ +CV_EXPORTS_W void calcOpticalFlowPyrLK( InputArray prevImg, InputArray nextImg, + InputArray prevPts, InputOutputArray nextPts, + OutputArray status, OutputArray err, + Size winSize = Size(21,21), int maxLevel = 3, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), + int flags = 0, double minEigThreshold = 1e-4 ); + +/** @brief Computes a dense optical flow using the Gunnar Farneback's algorithm. + +@param prev first 8-bit single-channel input image. +@param next second input image of the same size and the same type as prev. +@param flow computed flow image that has the same size as prev and type CV_32FC2. +@param pyr_scale parameter, specifying the image scale (\<1) to build pyramids for each image; +pyr_scale=0.5 means a classical pyramid, where each next layer is twice smaller than the previous +one. +@param levels number of pyramid layers including the initial image; levels=1 means that no extra +layers are created and only the original images are used. +@param winsize averaging window size; larger values increase the algorithm robustness to image +noise and give more chances for fast motion detection, but yield more blurred motion field. +@param iterations number of iterations the algorithm does at each pyramid level. +@param poly_n size of the pixel neighborhood used to find polynomial expansion in each pixel; +larger values mean that the image will be approximated with smoother surfaces, yielding more +robust algorithm and more blurred motion field, typically poly_n =5 or 7. +@param poly_sigma standard deviation of the Gaussian that is used to smooth derivatives used as a +basis for the polynomial expansion; for poly_n=5, you can set poly_sigma=1.1, for poly_n=7, a +good value would be poly_sigma=1.5. +@param flags operation flags that can be a combination of the following: + - **OPTFLOW_USE_INITIAL_FLOW** uses the input flow as an initial flow approximation. + - **OPTFLOW_FARNEBACK_GAUSSIAN** uses the Gaussian \f$\texttt{winsize}\times\texttt{winsize}\f$ + filter instead of a box filter of the same size for optical flow estimation; usually, this + option gives z more accurate flow than with a box filter, at the cost of lower speed; + normally, winsize for a Gaussian window should be set to a larger value to achieve the same + level of robustness. + +The function finds an optical flow for each prev pixel using the @cite Farneback2003 algorithm so that + +\f[\texttt{prev} (y,x) \sim \texttt{next} ( y + \texttt{flow} (y,x)[1], x + \texttt{flow} (y,x)[0])\f] + +@note Some examples: + +- An example using the optical flow algorithm described by Gunnar Farneback can be found at + opencv_source_code/samples/cpp/fback.cpp +- (Python) An example using the optical flow algorithm described by Gunnar Farneback can be + found at opencv_source_code/samples/python/opt_flow.py + */ +CV_EXPORTS_W void calcOpticalFlowFarneback( InputArray prev, InputArray next, InputOutputArray flow, + double pyr_scale, int levels, int winsize, + int iterations, int poly_n, double poly_sigma, + int flags ); + +/** @brief Computes an optimal affine transformation between two 2D point sets. + +@param src First input 2D point set stored in std::vector or Mat, or an image stored in Mat. +@param dst Second input 2D point set of the same size and the same type as A, or another image. +@param fullAffine If true, the function finds an optimal affine transformation with no additional +restrictions (6 degrees of freedom). Otherwise, the class of transformations to choose from is +limited to combinations of translation, rotation, and uniform scaling (4 degrees of freedom). + +The function finds an optimal affine transform *[A|b]* (a 2 x 3 floating-point matrix) that +approximates best the affine transformation between: + +* Two point sets +* Two raster images. In this case, the function first finds some features in the src image and + finds the corresponding features in dst image. After that, the problem is reduced to the first + case. +In case of point sets, the problem is formulated as follows: you need to find a 2x2 matrix *A* and +2x1 vector *b* so that: + +\f[[A^*|b^*] = arg \min _{[A|b]} \sum _i \| \texttt{dst}[i] - A { \texttt{src}[i]}^T - b \| ^2\f] +where src[i] and dst[i] are the i-th points in src and dst, respectively +\f$[A|b]\f$ can be either arbitrary (when fullAffine=true ) or have a form of +\f[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ -a_{12} & a_{11} & b_2 \end{bmatrix}\f] +when fullAffine=false. + +@deprecated Use cv::estimateAffine2D, cv::estimateAffinePartial2D instead. If you are using this function +with images, extract points using cv::calcOpticalFlowPyrLK and then use the estimation functions. + +@sa +estimateAffine2D, estimateAffinePartial2D, getAffineTransform, getPerspectiveTransform, findHomography + */ +CV_DEPRECATED CV_EXPORTS Mat estimateRigidTransform( InputArray src, InputArray dst, bool fullAffine ); + +enum +{ + MOTION_TRANSLATION = 0, + MOTION_EUCLIDEAN = 1, + MOTION_AFFINE = 2, + MOTION_HOMOGRAPHY = 3 +}; + +/** @brief Computes the Enhanced Correlation Coefficient value between two images @cite EP08 . + +@param templateImage single-channel template image; CV_8U or CV_32F array. +@param inputImage single-channel input image to be warped to provide an image similar to + templateImage, same type as templateImage. +@param inputMask An optional mask to indicate valid values of inputImage. + +@sa +findTransformECC + */ + +CV_EXPORTS_W double computeECC(InputArray templateImage, InputArray inputImage, InputArray inputMask = noArray()); + +/** @example samples/cpp/image_alignment.cpp +An example using the image alignment ECC algorithm +*/ + +/** @brief Finds the geometric transform (warp) between two images in terms of the ECC criterion @cite EP08 . + +@param templateImage single-channel template image; CV_8U or CV_32F array. +@param inputImage single-channel input image which should be warped with the final warpMatrix in +order to provide an image similar to templateImage, same type as templateImage. +@param warpMatrix floating-point \f$2\times 3\f$ or \f$3\times 3\f$ mapping matrix (warp). +@param motionType parameter, specifying the type of motion: + - **MOTION_TRANSLATION** sets a translational motion model; warpMatrix is \f$2\times 3\f$ with + the first \f$2\times 2\f$ part being the unity matrix and the rest two parameters being + estimated. + - **MOTION_EUCLIDEAN** sets a Euclidean (rigid) transformation as motion model; three + parameters are estimated; warpMatrix is \f$2\times 3\f$. + - **MOTION_AFFINE** sets an affine motion model (DEFAULT); six parameters are estimated; + warpMatrix is \f$2\times 3\f$. + - **MOTION_HOMOGRAPHY** sets a homography as a motion model; eight parameters are + estimated;\`warpMatrix\` is \f$3\times 3\f$. +@param criteria parameter, specifying the termination criteria of the ECC algorithm; +criteria.epsilon defines the threshold of the increment in the correlation coefficient between two +iterations (a negative criteria.epsilon makes criteria.maxcount the only termination criterion). +Default values are shown in the declaration above. +@param inputMask An optional mask to indicate valid values of inputImage. +@param gaussFiltSize An optional value indicating size of gaussian blur filter; (DEFAULT: 5) + +The function estimates the optimum transformation (warpMatrix) with respect to ECC criterion +(@cite EP08), that is + +\f[\texttt{warpMatrix} = \arg\max_{W} \texttt{ECC}(\texttt{templateImage}(x,y),\texttt{inputImage}(x',y'))\f] + +where + +\f[\begin{bmatrix} x' \\ y' \end{bmatrix} = W \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\f] + +(the equation holds with homogeneous coordinates for homography). It returns the final enhanced +correlation coefficient, that is the correlation coefficient between the template image and the +final warped input image. When a \f$3\times 3\f$ matrix is given with motionType =0, 1 or 2, the third +row is ignored. + +Unlike findHomography and estimateRigidTransform, the function findTransformECC implements an +area-based alignment that builds on intensity similarities. In essence, the function updates the +initial transformation that roughly aligns the images. If this information is missing, the identity +warp (unity matrix) is used as an initialization. Note that if images undergo strong +displacements/rotations, an initial transformation that roughly aligns the images is necessary +(e.g., a simple euclidean/similarity transform that allows for the images showing the same image +content approximately). Use inverse warping in the second image to take an image close to the first +one, i.e. use the flag WARP_INVERSE_MAP with warpAffine or warpPerspective. See also the OpenCV +sample image_alignment.cpp that demonstrates the use of the function. Note that the function throws +an exception if algorithm does not converges. + +@sa +computeECC, estimateAffine2D, estimateAffinePartial2D, findHomography + */ +CV_EXPORTS_W double findTransformECC( InputArray templateImage, InputArray inputImage, + InputOutputArray warpMatrix, int motionType, + TermCriteria criteria, + InputArray inputMask, int gaussFiltSize); + +/** @overload */ +CV_EXPORTS_W +double findTransformECC(InputArray templateImage, InputArray inputImage, + InputOutputArray warpMatrix, int motionType = MOTION_AFFINE, + TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001), + InputArray inputMask = noArray()); + +/** @example samples/cpp/kalman.cpp +An example using the standard Kalman filter +*/ + +/** @brief Kalman filter class. + +The class implements a standard Kalman filter , +@cite Welch95 . However, you can modify transitionMatrix, controlMatrix, and measurementMatrix to get +an extended Kalman filter functionality. +@note In C API when CvKalman\* kalmanFilter structure is not needed anymore, it should be released +with cvReleaseKalman(&kalmanFilter) + */ +class CV_EXPORTS_W KalmanFilter +{ +public: + CV_WRAP KalmanFilter(); + /** @overload + @param dynamParams Dimensionality of the state. + @param measureParams Dimensionality of the measurement. + @param controlParams Dimensionality of the control vector. + @param type Type of the created matrices that should be CV_32F or CV_64F. + */ + CV_WRAP KalmanFilter( int dynamParams, int measureParams, int controlParams = 0, int type = CV_32F ); + + /** @brief Re-initializes Kalman filter. The previous content is destroyed. + + @param dynamParams Dimensionality of the state. + @param measureParams Dimensionality of the measurement. + @param controlParams Dimensionality of the control vector. + @param type Type of the created matrices that should be CV_32F or CV_64F. + */ + void init( int dynamParams, int measureParams, int controlParams = 0, int type = CV_32F ); + + /** @brief Computes a predicted state. + + @param control The optional input control + */ + CV_WRAP const Mat& predict( const Mat& control = Mat() ); + + /** @brief Updates the predicted state from the measurement. + + @param measurement The measured system parameters + */ + CV_WRAP const Mat& correct( const Mat& measurement ); + + CV_PROP_RW Mat statePre; //!< predicted state (x'(k)): x(k)=A*x(k-1)+B*u(k) + CV_PROP_RW Mat statePost; //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) + CV_PROP_RW Mat transitionMatrix; //!< state transition matrix (A) + CV_PROP_RW Mat controlMatrix; //!< control matrix (B) (not used if there is no control) + CV_PROP_RW Mat measurementMatrix; //!< measurement matrix (H) + CV_PROP_RW Mat processNoiseCov; //!< process noise covariance matrix (Q) + CV_PROP_RW Mat measurementNoiseCov;//!< measurement noise covariance matrix (R) + CV_PROP_RW Mat errorCovPre; //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/ + CV_PROP_RW Mat gain; //!< Kalman gain matrix (K(k)): K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R) + CV_PROP_RW Mat errorCovPost; //!< posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k) + + // temporary matrices + Mat temp1; + Mat temp2; + Mat temp3; + Mat temp4; + Mat temp5; +}; + + +/** @brief Read a .flo file + + @param path Path to the file to be loaded + + The function readOpticalFlow loads a flow field from a file and returns it as a single matrix. + Resulting Mat has a type CV_32FC2 - floating-point, 2-channel. First channel corresponds to the + flow in the horizontal direction (u), second - vertical (v). + */ +CV_EXPORTS_W Mat readOpticalFlow( const String& path ); +/** @brief Write a .flo to disk + + @param path Path to the file to be written + @param flow Flow field to be stored + + The function stores a flow field in a file, returns true on success, false otherwise. + The flow field must be a 2-channel, floating-point matrix (CV_32FC2). First channel corresponds + to the flow in the horizontal direction (u), second - vertical (v). + */ +CV_EXPORTS_W bool writeOpticalFlow( const String& path, InputArray flow ); + +/** + Base class for dense optical flow algorithms +*/ +class CV_EXPORTS_W DenseOpticalFlow : public Algorithm +{ +public: + /** @brief Calculates an optical flow. + + @param I0 first 8-bit single-channel input image. + @param I1 second input image of the same size and the same type as prev. + @param flow computed flow image that has the same size as prev and type CV_32FC2. + */ + CV_WRAP virtual void calc( InputArray I0, InputArray I1, InputOutputArray flow ) = 0; + /** @brief Releases all inner buffers. + */ + CV_WRAP virtual void collectGarbage() = 0; +}; + +/** @brief Base interface for sparse optical flow algorithms. + */ +class CV_EXPORTS_W SparseOpticalFlow : public Algorithm +{ +public: + /** @brief Calculates a sparse optical flow. + + @param prevImg First input image. + @param nextImg Second input image of the same size and the same type as prevImg. + @param prevPts Vector of 2D points for which the flow needs to be found. + @param nextPts Output vector of 2D points containing the calculated new positions of input features in the second image. + @param status Output status vector. Each element of the vector is set to 1 if the + flow for the corresponding features has been found. Otherwise, it is set to 0. + @param err Optional output vector that contains error response for each point (inverse confidence). + */ + CV_WRAP virtual void calc(InputArray prevImg, InputArray nextImg, + InputArray prevPts, InputOutputArray nextPts, + OutputArray status, + OutputArray err = cv::noArray()) = 0; +}; + + +/** @brief Class computing a dense optical flow using the Gunnar Farneback's algorithm. + */ +class CV_EXPORTS_W FarnebackOpticalFlow : public DenseOpticalFlow +{ +public: + CV_WRAP virtual int getNumLevels() const = 0; + CV_WRAP virtual void setNumLevels(int numLevels) = 0; + + CV_WRAP virtual double getPyrScale() const = 0; + CV_WRAP virtual void setPyrScale(double pyrScale) = 0; + + CV_WRAP virtual bool getFastPyramids() const = 0; + CV_WRAP virtual void setFastPyramids(bool fastPyramids) = 0; + + CV_WRAP virtual int getWinSize() const = 0; + CV_WRAP virtual void setWinSize(int winSize) = 0; + + CV_WRAP virtual int getNumIters() const = 0; + CV_WRAP virtual void setNumIters(int numIters) = 0; + + CV_WRAP virtual int getPolyN() const = 0; + CV_WRAP virtual void setPolyN(int polyN) = 0; + + CV_WRAP virtual double getPolySigma() const = 0; + CV_WRAP virtual void setPolySigma(double polySigma) = 0; + + CV_WRAP virtual int getFlags() const = 0; + CV_WRAP virtual void setFlags(int flags) = 0; + + CV_WRAP static Ptr create( + int numLevels = 5, + double pyrScale = 0.5, + bool fastPyramids = false, + int winSize = 13, + int numIters = 10, + int polyN = 5, + double polySigma = 1.1, + int flags = 0); +}; + +/** @brief Variational optical flow refinement + +This class implements variational refinement of the input flow field, i.e. +it uses input flow to initialize the minimization of the following functional: +\f$E(U) = \int_{\Omega} \delta \Psi(E_I) + \gamma \Psi(E_G) + \alpha \Psi(E_S) \f$, +where \f$E_I,E_G,E_S\f$ are color constancy, gradient constancy and smoothness terms +respectively. \f$\Psi(s^2)=\sqrt{s^2+\epsilon^2}\f$ is a robust penalizer to limit the +influence of outliers. A complete formulation and a description of the minimization +procedure can be found in @cite Brox2004 +*/ +class CV_EXPORTS_W VariationalRefinement : public DenseOpticalFlow +{ +public: + /** @brief @ref calc function overload to handle separate horizontal (u) and vertical (v) flow components + (to avoid extra splits/merges) */ + CV_WRAP virtual void calcUV(InputArray I0, InputArray I1, InputOutputArray flow_u, InputOutputArray flow_v) = 0; + + /** @brief Number of outer (fixed-point) iterations in the minimization procedure. + @see setFixedPointIterations */ + CV_WRAP virtual int getFixedPointIterations() const = 0; + /** @copybrief getFixedPointIterations @see getFixedPointIterations */ + CV_WRAP virtual void setFixedPointIterations(int val) = 0; + + /** @brief Number of inner successive over-relaxation (SOR) iterations + in the minimization procedure to solve the respective linear system. + @see setSorIterations */ + CV_WRAP virtual int getSorIterations() const = 0; + /** @copybrief getSorIterations @see getSorIterations */ + CV_WRAP virtual void setSorIterations(int val) = 0; + + /** @brief Relaxation factor in SOR + @see setOmega */ + CV_WRAP virtual float getOmega() const = 0; + /** @copybrief getOmega @see getOmega */ + CV_WRAP virtual void setOmega(float val) = 0; + + /** @brief Weight of the smoothness term + @see setAlpha */ + CV_WRAP virtual float getAlpha() const = 0; + /** @copybrief getAlpha @see getAlpha */ + CV_WRAP virtual void setAlpha(float val) = 0; + + /** @brief Weight of the color constancy term + @see setDelta */ + CV_WRAP virtual float getDelta() const = 0; + /** @copybrief getDelta @see getDelta */ + CV_WRAP virtual void setDelta(float val) = 0; + + /** @brief Weight of the gradient constancy term + @see setGamma */ + CV_WRAP virtual float getGamma() const = 0; + /** @copybrief getGamma @see getGamma */ + CV_WRAP virtual void setGamma(float val) = 0; + + /** @brief Creates an instance of VariationalRefinement + */ + CV_WRAP static Ptr create(); +}; + +/** @brief DIS optical flow algorithm. + +This class implements the Dense Inverse Search (DIS) optical flow algorithm. More +details about the algorithm can be found at @cite Kroeger2016 . Includes three presets with preselected +parameters to provide reasonable trade-off between speed and quality. However, even the slowest preset is +still relatively fast, use DeepFlow if you need better quality and don't care about speed. + +This implementation includes several additional features compared to the algorithm described in the paper, +including spatial propagation of flow vectors (@ref getUseSpatialPropagation), as well as an option to +utilize an initial flow approximation passed to @ref calc (which is, essentially, temporal propagation, +if the previous frame's flow field is passed). +*/ +class CV_EXPORTS_W DISOpticalFlow : public DenseOpticalFlow +{ +public: + enum + { + PRESET_ULTRAFAST = 0, + PRESET_FAST = 1, + PRESET_MEDIUM = 2 + }; + + /** @brief Finest level of the Gaussian pyramid on which the flow is computed (zero level + corresponds to the original image resolution). The final flow is obtained by bilinear upscaling. + @see setFinestScale */ + CV_WRAP virtual int getFinestScale() const = 0; + /** @copybrief getFinestScale @see getFinestScale */ + CV_WRAP virtual void setFinestScale(int val) = 0; + + /** @brief Size of an image patch for matching (in pixels). Normally, default 8x8 patches work well + enough in most cases. + @see setPatchSize */ + CV_WRAP virtual int getPatchSize() const = 0; + /** @copybrief getPatchSize @see getPatchSize */ + CV_WRAP virtual void setPatchSize(int val) = 0; + + /** @brief Stride between neighbor patches. Must be less than patch size. Lower values correspond + to higher flow quality. + @see setPatchStride */ + CV_WRAP virtual int getPatchStride() const = 0; + /** @copybrief getPatchStride @see getPatchStride */ + CV_WRAP virtual void setPatchStride(int val) = 0; + + /** @brief Maximum number of gradient descent iterations in the patch inverse search stage. Higher values + may improve quality in some cases. + @see setGradientDescentIterations */ + CV_WRAP virtual int getGradientDescentIterations() const = 0; + /** @copybrief getGradientDescentIterations @see getGradientDescentIterations */ + CV_WRAP virtual void setGradientDescentIterations(int val) = 0; + + /** @brief Number of fixed point iterations of variational refinement per scale. Set to zero to + disable variational refinement completely. Higher values will typically result in more smooth and + high-quality flow. + @see setGradientDescentIterations */ + CV_WRAP virtual int getVariationalRefinementIterations() const = 0; + /** @copybrief getGradientDescentIterations @see getGradientDescentIterations */ + CV_WRAP virtual void setVariationalRefinementIterations(int val) = 0; + + /** @brief Weight of the smoothness term + @see setVariationalRefinementAlpha */ + CV_WRAP virtual float getVariationalRefinementAlpha() const = 0; + /** @copybrief getVariationalRefinementAlpha @see getVariationalRefinementAlpha */ + CV_WRAP virtual void setVariationalRefinementAlpha(float val) = 0; + + /** @brief Weight of the color constancy term + @see setVariationalRefinementDelta */ + CV_WRAP virtual float getVariationalRefinementDelta() const = 0; + /** @copybrief getVariationalRefinementDelta @see getVariationalRefinementDelta */ + CV_WRAP virtual void setVariationalRefinementDelta(float val) = 0; + + /** @brief Weight of the gradient constancy term + @see setVariationalRefinementGamma */ + CV_WRAP virtual float getVariationalRefinementGamma() const = 0; + /** @copybrief getVariationalRefinementGamma @see getVariationalRefinementGamma */ + CV_WRAP virtual void setVariationalRefinementGamma(float val) = 0; + + + /** @brief Whether to use mean-normalization of patches when computing patch distance. It is turned on + by default as it typically provides a noticeable quality boost because of increased robustness to + illumination variations. Turn it off if you are certain that your sequence doesn't contain any changes + in illumination. + @see setUseMeanNormalization */ + CV_WRAP virtual bool getUseMeanNormalization() const = 0; + /** @copybrief getUseMeanNormalization @see getUseMeanNormalization */ + CV_WRAP virtual void setUseMeanNormalization(bool val) = 0; + + /** @brief Whether to use spatial propagation of good optical flow vectors. This option is turned on by + default, as it tends to work better on average and can sometimes help recover from major errors + introduced by the coarse-to-fine scheme employed by the DIS optical flow algorithm. Turning this + option off can make the output flow field a bit smoother, however. + @see setUseSpatialPropagation */ + CV_WRAP virtual bool getUseSpatialPropagation() const = 0; + /** @copybrief getUseSpatialPropagation @see getUseSpatialPropagation */ + CV_WRAP virtual void setUseSpatialPropagation(bool val) = 0; + + /** @brief Creates an instance of DISOpticalFlow + + @param preset one of PRESET_ULTRAFAST, PRESET_FAST and PRESET_MEDIUM + */ + CV_WRAP static Ptr create(int preset = DISOpticalFlow::PRESET_FAST); +}; + +/** @brief Class used for calculating a sparse optical flow. + +The class can calculate an optical flow for a sparse feature set using the +iterative Lucas-Kanade method with pyramids. + +@sa calcOpticalFlowPyrLK + +*/ +class CV_EXPORTS_W SparsePyrLKOpticalFlow : public SparseOpticalFlow +{ +public: + CV_WRAP virtual Size getWinSize() const = 0; + CV_WRAP virtual void setWinSize(Size winSize) = 0; + + CV_WRAP virtual int getMaxLevel() const = 0; + CV_WRAP virtual void setMaxLevel(int maxLevel) = 0; + + CV_WRAP virtual TermCriteria getTermCriteria() const = 0; + CV_WRAP virtual void setTermCriteria(TermCriteria& crit) = 0; + + CV_WRAP virtual int getFlags() const = 0; + CV_WRAP virtual void setFlags(int flags) = 0; + + CV_WRAP virtual double getMinEigThreshold() const = 0; + CV_WRAP virtual void setMinEigThreshold(double minEigThreshold) = 0; + + CV_WRAP static Ptr create( + Size winSize = Size(21, 21), + int maxLevel = 3, TermCriteria crit = + TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), + int flags = 0, + double minEigThreshold = 1e-4); +}; + + + + +/** @brief Base abstract class for the long-term tracker + */ +class CV_EXPORTS_W Tracker +{ +protected: + Tracker(); +public: + virtual ~Tracker(); + + /** @brief Initialize the tracker with a known bounding box that surrounded the target + @param image The initial frame + @param boundingBox The initial bounding box + */ + CV_WRAP virtual + void init(InputArray image, const Rect& boundingBox) = 0; + + /** @brief Update the tracker, find the new most likely bounding box for the target + @param image The current frame + @param boundingBox The bounding box that represent the new target location, if true was returned, not + modified otherwise + + @return True means that target was located and false means that tracker cannot locate target in + current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed + missing from the frame (say, out of sight) + */ + CV_WRAP virtual + bool update(InputArray image, CV_OUT Rect& boundingBox) = 0; +}; + + + +/** @brief The MIL algorithm trains a classifier in an online manner to separate the object from the +background. + +Multiple Instance Learning avoids the drift problem for a robust tracking. The implementation is +based on @cite MIL . + +Original code can be found here + */ +class CV_EXPORTS_W TrackerMIL : public Tracker +{ +protected: + TrackerMIL(); // use ::create() +public: + virtual ~TrackerMIL() CV_OVERRIDE; + + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + //parameters for sampler + CV_PROP_RW float samplerInitInRadius; //!< radius for gathering positive instances during init + CV_PROP_RW int samplerInitMaxNegNum; //!< # negative samples to use during init + CV_PROP_RW float samplerSearchWinSize; //!< size of search window + CV_PROP_RW float samplerTrackInRadius; //!< radius for gathering positive instances during tracking + CV_PROP_RW int samplerTrackMaxPosNum; //!< # positive samples to use during tracking + CV_PROP_RW int samplerTrackMaxNegNum; //!< # negative samples to use during tracking + CV_PROP_RW int featureSetNumFeatures; //!< # features + }; + + /** @brief Create MIL tracker instance + * @param parameters MIL parameters TrackerMIL::Params + */ + static CV_WRAP + Ptr create(const TrackerMIL::Params ¶meters = TrackerMIL::Params()); + + //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; + //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; +}; + + + +/** @brief the GOTURN (Generic Object Tracking Using Regression Networks) tracker + * + * GOTURN (@cite GOTURN) is kind of trackers based on Convolutional Neural Networks (CNN). While taking all advantages of CNN trackers, + * GOTURN is much faster due to offline training without online fine-tuning nature. + * GOTURN tracker addresses the problem of single target tracking: given a bounding box label of an object in the first frame of the video, + * we track that object through the rest of the video. NOTE: Current method of GOTURN does not handle occlusions; however, it is fairly + * robust to viewpoint changes, lighting changes, and deformations. + * Inputs of GOTURN are two RGB patches representing Target and Search patches resized to 227x227. + * Outputs of GOTURN are predicted bounding box coordinates, relative to Search patch coordinate system, in format X1,Y1,X2,Y2. + * Original paper is here: + * As long as original authors implementation: + * Implementation of training algorithm is placed in separately here due to 3d-party dependencies: + * + * GOTURN architecture goturn.prototxt and trained model goturn.caffemodel are accessible on opencv_extra GitHub repository. + */ +class CV_EXPORTS_W TrackerGOTURN : public Tracker +{ +protected: + TrackerGOTURN(); // use ::create() +public: + virtual ~TrackerGOTURN() CV_OVERRIDE; + + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + CV_PROP_RW std::string modelTxt; + CV_PROP_RW std::string modelBin; + }; + + /** @brief Constructor + @param parameters GOTURN parameters TrackerGOTURN::Params + */ + static CV_WRAP + Ptr create(const TrackerGOTURN::Params& parameters = TrackerGOTURN::Params()); + + //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; + //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; +}; + +class CV_EXPORTS_W TrackerDaSiamRPN : public Tracker +{ +protected: + TrackerDaSiamRPN(); // use ::create() +public: + virtual ~TrackerDaSiamRPN() CV_OVERRIDE; + + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + CV_PROP_RW std::string model; + CV_PROP_RW std::string kernel_cls1; + CV_PROP_RW std::string kernel_r1; + CV_PROP_RW int backend; + CV_PROP_RW int target; + }; + + /** @brief Constructor + @param parameters DaSiamRPN parameters TrackerDaSiamRPN::Params + */ + static CV_WRAP + Ptr create(const TrackerDaSiamRPN::Params& parameters = TrackerDaSiamRPN::Params()); + + /** @brief Return tracking score + */ + CV_WRAP virtual float getTrackingScore() = 0; + + //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; + //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; +}; + +/** @brief the Nano tracker is a super lightweight dnn-based general object tracking. + * + * Nano tracker is much faster and extremely lightweight due to special model structure, the whole model size is about 1.9 MB. + * Nano tracker needs two models: one for feature extraction (backbone) and the another for localization (neckhead). + * Model download link: https://github.com/HonglinChu/SiamTrackers/tree/master/NanoTrack/models/nanotrackv2 + * Original repo is here: https://github.com/HonglinChu/NanoTrack + * Author: HongLinChu, 1628464345@qq.com + */ +class CV_EXPORTS_W TrackerNano : public Tracker +{ +protected: + TrackerNano(); // use ::create() +public: + virtual ~TrackerNano() CV_OVERRIDE; + + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + CV_PROP_RW std::string backbone; + CV_PROP_RW std::string neckhead; + CV_PROP_RW int backend; + CV_PROP_RW int target; + }; + + /** @brief Constructor + @param parameters NanoTrack parameters TrackerNano::Params + */ + static CV_WRAP + Ptr create(const TrackerNano::Params& parameters = TrackerNano::Params()); + + /** @brief Return tracking score + */ + CV_WRAP virtual float getTrackingScore() = 0; + + //void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; + //bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; +}; + +/** @brief the VIT tracker is a super lightweight dnn-based general object tracking. + * + * VIT tracker is much faster and extremely lightweight due to special model structure, the model file is about 767KB. + * Model download link: https://github.com/opencv/opencv_zoo/tree/main/models/object_tracking_vittrack + * Author: PengyuLiu, 1872918507@qq.com + */ +class CV_EXPORTS_W TrackerVit : public Tracker +{ +protected: + TrackerVit(); // use ::create() +public: + virtual ~TrackerVit() CV_OVERRIDE; + + struct CV_EXPORTS_W_SIMPLE Params + { + CV_WRAP Params(); + CV_PROP_RW std::string net; + CV_PROP_RW int backend; + CV_PROP_RW int target; + CV_PROP_RW Scalar meanvalue; + CV_PROP_RW Scalar stdvalue; + }; + + /** @brief Constructor + @param parameters vit tracker parameters TrackerVit::Params + */ + static CV_WRAP + Ptr create(const TrackerVit::Params& parameters = TrackerVit::Params()); + + /** @brief Return tracking score + */ + CV_WRAP virtual float getTrackingScore() = 0; + + // void init(InputArray image, const Rect& boundingBox) CV_OVERRIDE; + // bool update(InputArray image, CV_OUT Rect& boundingBox) CV_OVERRIDE; +}; + +//! @} video_track + +} // cv + +#endif diff --git a/Thirdparty/opencv2/include/opencv2/video/video.hpp b/Thirdparty/opencv2/include/opencv2/video/video.hpp new file mode 100644 index 0000000..8267b85 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/video/video.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/video.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/videoio.hpp b/Thirdparty/opencv2/include/opencv2/videoio.hpp new file mode 100644 index 0000000..0766bc4 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio.hpp @@ -0,0 +1,1182 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_VIDEOIO_HPP +#define OPENCV_VIDEOIO_HPP + +#include "opencv2/core.hpp" + +/** + @defgroup videoio Video I/O + + @brief Read and write video or images sequence with OpenCV + + ### See also: + - @ref videoio_overview + - Tutorials: @ref tutorial_table_of_content_app + @{ + @defgroup videoio_flags_base Flags for video I/O + @defgroup videoio_flags_others Additional flags for video I/O API backends + @defgroup videoio_hwaccel Hardware-accelerated video decoding and encoding + @defgroup videoio_c C API for video I/O + @defgroup videoio_ios iOS glue for video I/O + @defgroup videoio_winrt WinRT glue for video I/O + @defgroup videoio_registry Query I/O API backends registry + @} +*/ + +////////////////////////////////// video io ///////////////////////////////// + +typedef struct CvCapture CvCapture; +typedef struct CvVideoWriter CvVideoWriter; + +namespace cv +{ + +//! @addtogroup videoio +//! @{ + +//! @addtogroup videoio_flags_base +//! @{ + + +/** @brief cv::VideoCapture API backends identifier. + +Select preferred API for a capture object. +To be used in the VideoCapture::VideoCapture() constructor or VideoCapture::open() + +@note +- Backends are available only if they have been built with your OpenCV binaries. +See @ref videoio_overview for more information. +- Microsoft Media Foundation backend tries to use hardware accelerated transformations +if possible. Environment flag "OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS" set to 0 +disables it and may improve initialization time. More details: +https://learn.microsoft.com/en-us/windows/win32/medfound/mf-readwrite-enable-hardware-transforms +*/ +enum VideoCaptureAPIs { + CAP_ANY = 0, //!< Auto detect == 0 + CAP_VFW = 200, //!< Video For Windows (obsolete, removed) + CAP_V4L = 200, //!< V4L/V4L2 capturing support + CAP_V4L2 = CAP_V4L, //!< Same as CAP_V4L + CAP_FIREWIRE = 300, //!< IEEE 1394 drivers + CAP_FIREWARE = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE + CAP_IEEE1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE + CAP_DC1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE + CAP_CMU1394 = CAP_FIREWIRE, //!< Same value as CAP_FIREWIRE + CAP_QT = 500, //!< QuickTime (obsolete, removed) + CAP_UNICAP = 600, //!< Unicap drivers (obsolete, removed) + CAP_DSHOW = 700, //!< DirectShow (via videoInput) + CAP_PVAPI = 800, //!< PvAPI, Prosilica GigE SDK + CAP_OPENNI = 900, //!< OpenNI (for Kinect) + CAP_OPENNI_ASUS = 910, //!< OpenNI (for Asus Xtion) + CAP_ANDROID = 1000, //!< Android - not used + CAP_XIAPI = 1100, //!< XIMEA Camera API + CAP_AVFOUNDATION = 1200, //!< AVFoundation framework for iOS (OS X Lion will have the same API) + CAP_GIGANETIX = 1300, //!< Smartek Giganetix GigEVisionSDK + CAP_MSMF = 1400, //!< Microsoft Media Foundation (via videoInput). See platform specific notes above. + CAP_WINRT = 1410, //!< Microsoft Windows Runtime using Media Foundation + CAP_INTELPERC = 1500, //!< RealSense (former Intel Perceptual Computing SDK) + CAP_REALSENSE = 1500, //!< Synonym for CAP_INTELPERC + CAP_OPENNI2 = 1600, //!< OpenNI2 (for Kinect) + CAP_OPENNI2_ASUS = 1610, //!< OpenNI2 (for Asus Xtion and Occipital Structure sensors) + CAP_OPENNI2_ASTRA= 1620, //!< OpenNI2 (for Orbbec Astra) + CAP_GPHOTO2 = 1700, //!< gPhoto2 connection + CAP_GSTREAMER = 1800, //!< GStreamer + CAP_FFMPEG = 1900, //!< Open and record video file or stream using the FFMPEG library + CAP_IMAGES = 2000, //!< OpenCV Image Sequence (e.g. img_%02d.jpg) + CAP_ARAVIS = 2100, //!< Aravis SDK + CAP_OPENCV_MJPEG = 2200, //!< Built-in OpenCV MotionJPEG codec + CAP_INTEL_MFX = 2300, //!< Intel MediaSDK + CAP_XINE = 2400, //!< XINE engine (Linux) + CAP_UEYE = 2500, //!< uEye Camera API + CAP_OBSENSOR = 2600, //!< For Orbbec 3D-Sensor device/module (Astra+, Femto) + }; + + +/** @brief cv::VideoCapture generic properties identifier. + + Reading / writing properties involves many layers. Some unexpected result might happens along this chain. + Effective behaviour depends from device hardware, driver and API Backend. + @sa videoio_flags_others, VideoCapture::get(), VideoCapture::set() +*/ +enum VideoCaptureProperties { + CAP_PROP_POS_MSEC =0, //!< Current position of the video file in milliseconds. + CAP_PROP_POS_FRAMES =1, //!< 0-based index of the frame to be decoded/captured next. When the index i is set in RAW mode (CAP_PROP_FORMAT == -1) this will seek to the key frame k, where k <= i. + CAP_PROP_POS_AVI_RATIO =2, //!< Relative position of the video file: 0=start of the film, 1=end of the film. + CAP_PROP_FRAME_WIDTH =3, //!< Width of the frames in the video stream. + CAP_PROP_FRAME_HEIGHT =4, //!< Height of the frames in the video stream. + CAP_PROP_FPS =5, //!< Frame rate. + CAP_PROP_FOURCC =6, //!< 4-character code of codec. see VideoWriter::fourcc . + CAP_PROP_FRAME_COUNT =7, //!< Number of frames in the video file. + CAP_PROP_FORMAT =8, //!< Format of the %Mat objects (see Mat::type()) returned by VideoCapture::retrieve(). + //!< Set value -1 to fetch undecoded RAW video streams (as Mat 8UC1). + CAP_PROP_MODE =9, //!< Backend-specific value indicating the current capture mode. + CAP_PROP_BRIGHTNESS =10, //!< Brightness of the image (only for those cameras that support). + CAP_PROP_CONTRAST =11, //!< Contrast of the image (only for cameras). + CAP_PROP_SATURATION =12, //!< Saturation of the image (only for cameras). + CAP_PROP_HUE =13, //!< Hue of the image (only for cameras). + CAP_PROP_GAIN =14, //!< Gain of the image (only for those cameras that support). + CAP_PROP_EXPOSURE =15, //!< Exposure (only for those cameras that support). + CAP_PROP_CONVERT_RGB =16, //!< Boolean flags indicating whether images should be converted to RGB.
    + //!< *GStreamer note*: The flag is ignored in case if custom pipeline is used. It's user responsibility to interpret pipeline output. + CAP_PROP_WHITE_BALANCE_BLUE_U =17, //!< Currently unsupported. + CAP_PROP_RECTIFICATION =18, //!< Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently). + CAP_PROP_MONOCHROME =19, + CAP_PROP_SHARPNESS =20, + CAP_PROP_AUTO_EXPOSURE =21, //!< DC1394: exposure control done by camera, user can adjust reference level using this feature. + CAP_PROP_GAMMA =22, + CAP_PROP_TEMPERATURE =23, + CAP_PROP_TRIGGER =24, + CAP_PROP_TRIGGER_DELAY =25, + CAP_PROP_WHITE_BALANCE_RED_V =26, + CAP_PROP_ZOOM =27, + CAP_PROP_FOCUS =28, + CAP_PROP_GUID =29, + CAP_PROP_ISO_SPEED =30, + CAP_PROP_BACKLIGHT =32, + CAP_PROP_PAN =33, + CAP_PROP_TILT =34, + CAP_PROP_ROLL =35, + CAP_PROP_IRIS =36, + CAP_PROP_SETTINGS =37, //!< Pop up video/camera filter dialog (note: only supported by DSHOW backend currently. The property value is ignored) + CAP_PROP_BUFFERSIZE =38, + CAP_PROP_AUTOFOCUS =39, + CAP_PROP_SAR_NUM =40, //!< Sample aspect ratio: num/den (num) + CAP_PROP_SAR_DEN =41, //!< Sample aspect ratio: num/den (den) + CAP_PROP_BACKEND =42, //!< Current backend (enum VideoCaptureAPIs). Read-only property + CAP_PROP_CHANNEL =43, //!< Video input or Channel Number (only for those cameras that support) + CAP_PROP_AUTO_WB =44, //!< enable/ disable auto white-balance + CAP_PROP_WB_TEMPERATURE=45, //!< white-balance color temperature + CAP_PROP_CODEC_PIXEL_FORMAT =46, //!< (read-only) codec's pixel format. 4-character code - see VideoWriter::fourcc . Subset of [AV_PIX_FMT_*](https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/raw.c) or -1 if unknown + CAP_PROP_BITRATE =47, //!< (read-only) Video bitrate in kbits/s + CAP_PROP_ORIENTATION_META=48, //!< (read-only) Frame rotation defined by stream meta (applicable for FFmpeg and AVFoundation back-ends only) + CAP_PROP_ORIENTATION_AUTO=49, //!< if true - rotates output frames of CvCapture considering video file's metadata (applicable for FFmpeg and AVFoundation back-ends only) (https://github.com/opencv/opencv/issues/15499) + CAP_PROP_HW_ACCELERATION=50, //!< (**open-only**) Hardware acceleration type (see #VideoAccelerationType). Setting supported only via `params` parameter in cv::VideoCapture constructor / .open() method. Default value is backend-specific. + CAP_PROP_HW_DEVICE =51, //!< (**open-only**) Hardware device index (select GPU if multiple available). Device enumeration is acceleration type specific. + CAP_PROP_HW_ACCELERATION_USE_OPENCL=52, //!< (**open-only**) If non-zero, create new OpenCL context and bind it to current thread. The OpenCL context created with Video Acceleration context attached it (if not attached yet) for optimized GPU data copy between HW accelerated decoder and cv::UMat. + CAP_PROP_OPEN_TIMEOUT_MSEC=53, //!< (**open-only**) timeout in milliseconds for opening a video capture (applicable for FFmpeg and GStreamer back-ends only) + CAP_PROP_READ_TIMEOUT_MSEC=54, //!< (**open-only**) timeout in milliseconds for reading from a video capture (applicable for FFmpeg and GStreamer back-ends only) + CAP_PROP_STREAM_OPEN_TIME_USEC =55, //!< (read-only) time in microseconds since Jan 1 1970 when stream was opened. Applicable for FFmpeg backend only. Useful for RTSP and other live streams + CAP_PROP_VIDEO_TOTAL_CHANNELS = 56, //!< (read-only) Number of video channels + CAP_PROP_VIDEO_STREAM = 57, //!< (**open-only**) Specify video stream, 0-based index. Use -1 to disable video stream from file or IP cameras. Default value is 0. + CAP_PROP_AUDIO_STREAM = 58, //!< (**open-only**) Specify stream in multi-language media files, -1 - disable audio processing or microphone. Default value is -1. + CAP_PROP_AUDIO_POS = 59, //!< (read-only) Audio position is measured in samples. Accurate audio sample timestamp of previous grabbed fragment. See CAP_PROP_AUDIO_SAMPLES_PER_SECOND and CAP_PROP_AUDIO_SHIFT_NSEC. + CAP_PROP_AUDIO_SHIFT_NSEC = 60, //!< (read only) Contains the time difference between the start of the audio stream and the video stream in nanoseconds. Positive value means that audio is started after the first video frame. Negative value means that audio is started before the first video frame. + CAP_PROP_AUDIO_DATA_DEPTH = 61, //!< (open, read) Alternative definition to bits-per-sample, but with clear handling of 32F / 32S + CAP_PROP_AUDIO_SAMPLES_PER_SECOND = 62, //!< (open, read) determined from file/codec input. If not specified, then selected audio sample rate is 44100 + CAP_PROP_AUDIO_BASE_INDEX = 63, //!< (read-only) Index of the first audio channel for .retrieve() calls. That audio channel number continues enumeration after video channels. + CAP_PROP_AUDIO_TOTAL_CHANNELS = 64, //!< (read-only) Number of audio channels in the selected audio stream (mono, stereo, etc) + CAP_PROP_AUDIO_TOTAL_STREAMS = 65, //!< (read-only) Number of audio streams. + CAP_PROP_AUDIO_SYNCHRONIZE = 66, //!< (open, read) Enables audio synchronization. + CAP_PROP_LRF_HAS_KEY_FRAME = 67, //!< FFmpeg back-end only - Indicates whether the Last Raw Frame (LRF), output from VideoCapture::read() when VideoCapture is initialized with VideoCapture::open(CAP_FFMPEG, {CAP_PROP_FORMAT, -1}) or VideoCapture::set(CAP_PROP_FORMAT,-1) is called before the first call to VideoCapture::read(), contains encoded data for a key frame. + CAP_PROP_CODEC_EXTRADATA_INDEX = 68, //!< Positive index indicates that returning extra data is supported by the video back end. This can be retrieved as cap.retrieve(data, ). E.g. When reading from a h264 encoded RTSP stream, the FFmpeg backend could return the SPS and/or PPS if available (if sent in reply to a DESCRIBE request), from calls to cap.retrieve(data, ). + CAP_PROP_FRAME_TYPE = 69, //!< (read-only) FFmpeg back-end only - Frame type ascii code (73 = 'I', 80 = 'P', 66 = 'B' or 63 = '?' if unknown) of the most recently read frame. + CAP_PROP_N_THREADS = 70, //!< (**open-only**) Set the maximum number of threads to use. Use 0 to use as many threads as CPU cores (applicable for FFmpeg back-end only). +#ifndef CV_DOXYGEN + CV__CAP_PROP_LATEST +#endif + }; + +/** @brief cv::VideoWriter generic properties identifier. + @sa VideoWriter::get(), VideoWriter::set() +*/ +enum VideoWriterProperties { + VIDEOWRITER_PROP_QUALITY = 1, //!< Current quality (0..100%) of the encoded videostream. Can be adjusted dynamically in some codecs. + VIDEOWRITER_PROP_FRAMEBYTES = 2, //!< (Read-only): Size of just encoded video frame. Note that the encoding order may be different from representation order. + VIDEOWRITER_PROP_NSTRIPES = 3, //!< Number of stripes for parallel encoding. -1 for auto detection. + VIDEOWRITER_PROP_IS_COLOR = 4, //!< If it is not zero, the encoder will expect and encode color frames, otherwise it + //!< will work with grayscale frames. + VIDEOWRITER_PROP_DEPTH = 5, //!< Defaults to \ref CV_8U. + VIDEOWRITER_PROP_HW_ACCELERATION = 6, //!< (**open-only**) Hardware acceleration type (see #VideoAccelerationType). Setting supported only via `params` parameter in VideoWriter constructor / .open() method. Default value is backend-specific. + VIDEOWRITER_PROP_HW_DEVICE = 7, //!< (**open-only**) Hardware device index (select GPU if multiple available). Device enumeration is acceleration type specific. + VIDEOWRITER_PROP_HW_ACCELERATION_USE_OPENCL= 8, //!< (**open-only**) If non-zero, create new OpenCL context and bind it to current thread. The OpenCL context created with Video Acceleration context attached it (if not attached yet) for optimized GPU data copy between cv::UMat and HW accelerated encoder. + VIDEOWRITER_PROP_RAW_VIDEO = 9, //!< (**open-only**) Set to non-zero to enable encapsulation of an encoded raw video stream. Each raw encoded video frame should be passed to VideoWriter::write() as single row or column of a \ref CV_8UC1 Mat. \note If the key frame interval is not 1 then it must be manually specified by the user. This can either be performed during initialization passing \ref VIDEOWRITER_PROP_KEY_INTERVAL as one of the extra encoder params to \ref VideoWriter::VideoWriter(const String &, int, double, const Size &, const std::vector< int > ¶ms) or afterwards by setting the \ref VIDEOWRITER_PROP_KEY_FLAG with \ref VideoWriter::set() before writing each frame. FFMpeg backend only. + VIDEOWRITER_PROP_KEY_INTERVAL = 10, //!< (**open-only**) Set the key frame interval using raw video encapsulation (\ref VIDEOWRITER_PROP_RAW_VIDEO != 0). Defaults to 1 when not set. FFMpeg backend only. + VIDEOWRITER_PROP_KEY_FLAG = 11, //!< Set to non-zero to signal that the following frames are key frames or zero if not, when encapsulating raw video (\ref VIDEOWRITER_PROP_RAW_VIDEO != 0). FFMpeg backend only. +#ifndef CV_DOXYGEN + CV__VIDEOWRITER_PROP_LATEST +#endif +}; + +//! @} videoio_flags_base + +//! @addtogroup videoio_flags_others +//! @{ + +/** @name Hardware acceleration support + @{ +*/ + +/** @brief Video Acceleration type + * + * Used as value in #CAP_PROP_HW_ACCELERATION and #VIDEOWRITER_PROP_HW_ACCELERATION + * + * @note In case of FFmpeg backend, it translated to enum AVHWDeviceType (https://github.com/FFmpeg/FFmpeg/blob/master/libavutil/hwcontext.h) + */ +enum VideoAccelerationType +{ + VIDEO_ACCELERATION_NONE = 0, //!< Do not require any specific H/W acceleration, prefer software processing. + //!< Reading of this value means that special H/W accelerated handling is not added or not detected by OpenCV. + + VIDEO_ACCELERATION_ANY = 1, //!< Prefer to use H/W acceleration. If no one supported, then fallback to software processing. + //!< @note H/W acceleration may require special configuration of used environment. + //!< @note Results in encoding scenario may differ between software and hardware accelerated encoders. + + VIDEO_ACCELERATION_D3D11 = 2, //!< DirectX 11 + VIDEO_ACCELERATION_VAAPI = 3, //!< VAAPI + VIDEO_ACCELERATION_MFX = 4, //!< libmfx (Intel MediaSDK/oneVPL) +}; + +//! @} Hardware acceleration support + +/** @name IEEE 1394 drivers + @{ +*/ + +/** @brief Modes of the IEEE 1394 controlling registers +(can be: auto, manual, auto single push, absolute Latter allowed with any other mode) +every feature can have only one mode turned on at a time +*/ +enum { CAP_PROP_DC1394_OFF = -4, //!< turn the feature off (not controlled manually nor automatically). + CAP_PROP_DC1394_MODE_MANUAL = -3, //!< set automatically when a value of the feature is set by the user. + CAP_PROP_DC1394_MODE_AUTO = -2, + CAP_PROP_DC1394_MODE_ONE_PUSH_AUTO = -1, + CAP_PROP_DC1394_MAX = 31 + }; + +//! @} IEEE 1394 drivers + +/** @name OpenNI (for Kinect) + @{ +*/ + +//! OpenNI map generators +enum { CAP_OPENNI_DEPTH_GENERATOR = 1 << 31, + CAP_OPENNI_IMAGE_GENERATOR = 1 << 30, + CAP_OPENNI_IR_GENERATOR = 1 << 29, + CAP_OPENNI_GENERATORS_MASK = CAP_OPENNI_DEPTH_GENERATOR + CAP_OPENNI_IMAGE_GENERATOR + CAP_OPENNI_IR_GENERATOR + }; + +//! Properties of cameras available through OpenNI backend +enum { CAP_PROP_OPENNI_OUTPUT_MODE = 100, + CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 101, //!< In mm + CAP_PROP_OPENNI_BASELINE = 102, //!< In mm + CAP_PROP_OPENNI_FOCAL_LENGTH = 103, //!< In pixels + CAP_PROP_OPENNI_REGISTRATION = 104, //!< Flag that synchronizes the remapping depth map to image map + //!< by changing depth generator's view point (if the flag is "on") or + //!< sets this view point to its normal one (if the flag is "off"). + CAP_PROP_OPENNI_REGISTRATION_ON = CAP_PROP_OPENNI_REGISTRATION, + CAP_PROP_OPENNI_APPROX_FRAME_SYNC = 105, + CAP_PROP_OPENNI_MAX_BUFFER_SIZE = 106, + CAP_PROP_OPENNI_CIRCLE_BUFFER = 107, + CAP_PROP_OPENNI_MAX_TIME_DURATION = 108, + CAP_PROP_OPENNI_GENERATOR_PRESENT = 109, + CAP_PROP_OPENNI2_SYNC = 110, + CAP_PROP_OPENNI2_MIRROR = 111 + }; + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 5054 ) +#endif +//! OpenNI shortcuts +enum { CAP_OPENNI_IMAGE_GENERATOR_PRESENT = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, + CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_OUTPUT_MODE, + CAP_OPENNI_DEPTH_GENERATOR_PRESENT = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, + CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_BASELINE, + CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_FOCAL_LENGTH, + CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION, + CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION_ON = CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, + CAP_OPENNI_IR_GENERATOR_PRESENT = CAP_OPENNI_IR_GENERATOR + CAP_PROP_OPENNI_GENERATOR_PRESENT, + }; +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +//! OpenNI data given from depth generator +enum { CAP_OPENNI_DEPTH_MAP = 0, //!< Depth values in mm (CV_16UC1) + CAP_OPENNI_POINT_CLOUD_MAP = 1, //!< XYZ in meters (CV_32FC3) + CAP_OPENNI_DISPARITY_MAP = 2, //!< Disparity in pixels (CV_8UC1) + CAP_OPENNI_DISPARITY_MAP_32F = 3, //!< Disparity in pixels (CV_32FC1) + CAP_OPENNI_VALID_DEPTH_MASK = 4, //!< CV_8UC1 + + CAP_OPENNI_BGR_IMAGE = 5, //!< Data given from RGB image generator + CAP_OPENNI_GRAY_IMAGE = 6, //!< Data given from RGB image generator + + CAP_OPENNI_IR_IMAGE = 7 //!< Data given from IR image generator + }; + +//! Supported output modes of OpenNI image generator +enum { CAP_OPENNI_VGA_30HZ = 0, + CAP_OPENNI_SXGA_15HZ = 1, + CAP_OPENNI_SXGA_30HZ = 2, + CAP_OPENNI_QVGA_30HZ = 3, + CAP_OPENNI_QVGA_60HZ = 4 + }; + +//! @} OpenNI + +/** @name GStreamer + @{ +*/ + +enum { CAP_PROP_GSTREAMER_QUEUE_LENGTH = 200 //!< Default is 1 + }; + +//! @} GStreamer + +/** @name PvAPI, Prosilica GigE SDK + @{ +*/ + +//! PVAPI +enum { CAP_PROP_PVAPI_MULTICASTIP = 300, //!< IP for enable multicast master mode. 0 for disable multicast. + CAP_PROP_PVAPI_FRAMESTARTTRIGGERMODE = 301, //!< FrameStartTriggerMode: Determines how a frame is initiated. + CAP_PROP_PVAPI_DECIMATIONHORIZONTAL = 302, //!< Horizontal sub-sampling of the image. + CAP_PROP_PVAPI_DECIMATIONVERTICAL = 303, //!< Vertical sub-sampling of the image. + CAP_PROP_PVAPI_BINNINGX = 304, //!< Horizontal binning factor. + CAP_PROP_PVAPI_BINNINGY = 305, //!< Vertical binning factor. + CAP_PROP_PVAPI_PIXELFORMAT = 306 //!< Pixel format. + }; + +//! PVAPI: FrameStartTriggerMode +enum { CAP_PVAPI_FSTRIGMODE_FREERUN = 0, //!< Freerun + CAP_PVAPI_FSTRIGMODE_SYNCIN1 = 1, //!< SyncIn1 + CAP_PVAPI_FSTRIGMODE_SYNCIN2 = 2, //!< SyncIn2 + CAP_PVAPI_FSTRIGMODE_FIXEDRATE = 3, //!< FixedRate + CAP_PVAPI_FSTRIGMODE_SOFTWARE = 4 //!< Software + }; + +//! PVAPI: DecimationHorizontal, DecimationVertical +enum { CAP_PVAPI_DECIMATION_OFF = 1, //!< Off + CAP_PVAPI_DECIMATION_2OUTOF4 = 2, //!< 2 out of 4 decimation + CAP_PVAPI_DECIMATION_2OUTOF8 = 4, //!< 2 out of 8 decimation + CAP_PVAPI_DECIMATION_2OUTOF16 = 8 //!< 2 out of 16 decimation + }; + +//! PVAPI: PixelFormat +enum { CAP_PVAPI_PIXELFORMAT_MONO8 = 1, //!< Mono8 + CAP_PVAPI_PIXELFORMAT_MONO16 = 2, //!< Mono16 + CAP_PVAPI_PIXELFORMAT_BAYER8 = 3, //!< Bayer8 + CAP_PVAPI_PIXELFORMAT_BAYER16 = 4, //!< Bayer16 + CAP_PVAPI_PIXELFORMAT_RGB24 = 5, //!< Rgb24 + CAP_PVAPI_PIXELFORMAT_BGR24 = 6, //!< Bgr24 + CAP_PVAPI_PIXELFORMAT_RGBA32 = 7, //!< Rgba32 + CAP_PVAPI_PIXELFORMAT_BGRA32 = 8, //!< Bgra32 + }; + +//! @} PvAPI + +/** @name XIMEA Camera API + @{ +*/ + +//! Properties of cameras available through XIMEA SDK backend +enum { CAP_PROP_XI_DOWNSAMPLING = 400, //!< Change image resolution by binning or skipping. + CAP_PROP_XI_DATA_FORMAT = 401, //!< Output data format. + CAP_PROP_XI_OFFSET_X = 402, //!< Horizontal offset from the origin to the area of interest (in pixels). + CAP_PROP_XI_OFFSET_Y = 403, //!< Vertical offset from the origin to the area of interest (in pixels). + CAP_PROP_XI_TRG_SOURCE = 404, //!< Defines source of trigger. + CAP_PROP_XI_TRG_SOFTWARE = 405, //!< Generates an internal trigger. PRM_TRG_SOURCE must be set to TRG_SOFTWARE. + CAP_PROP_XI_GPI_SELECTOR = 406, //!< Selects general purpose input. + CAP_PROP_XI_GPI_MODE = 407, //!< Set general purpose input mode. + CAP_PROP_XI_GPI_LEVEL = 408, //!< Get general purpose level. + CAP_PROP_XI_GPO_SELECTOR = 409, //!< Selects general purpose output. + CAP_PROP_XI_GPO_MODE = 410, //!< Set general purpose output mode. + CAP_PROP_XI_LED_SELECTOR = 411, //!< Selects camera signalling LED. + CAP_PROP_XI_LED_MODE = 412, //!< Define camera signalling LED functionality. + CAP_PROP_XI_MANUAL_WB = 413, //!< Calculates White Balance(must be called during acquisition). + CAP_PROP_XI_AUTO_WB = 414, //!< Automatic white balance. + CAP_PROP_XI_AEAG = 415, //!< Automatic exposure/gain. + CAP_PROP_XI_EXP_PRIORITY = 416, //!< Exposure priority (0.5 - exposure 50%, gain 50%). + CAP_PROP_XI_AE_MAX_LIMIT = 417, //!< Maximum limit of exposure in AEAG procedure. + CAP_PROP_XI_AG_MAX_LIMIT = 418, //!< Maximum limit of gain in AEAG procedure. + CAP_PROP_XI_AEAG_LEVEL = 419, //!< Average intensity of output signal AEAG should achieve(in %). + CAP_PROP_XI_TIMEOUT = 420, //!< Image capture timeout in milliseconds. + CAP_PROP_XI_EXPOSURE = 421, //!< Exposure time in microseconds. + CAP_PROP_XI_EXPOSURE_BURST_COUNT = 422, //!< Sets the number of times of exposure in one frame. + CAP_PROP_XI_GAIN_SELECTOR = 423, //!< Gain selector for parameter Gain allows to select different type of gains. + CAP_PROP_XI_GAIN = 424, //!< Gain in dB. + CAP_PROP_XI_DOWNSAMPLING_TYPE = 426, //!< Change image downsampling type. + CAP_PROP_XI_BINNING_SELECTOR = 427, //!< Binning engine selector. + CAP_PROP_XI_BINNING_VERTICAL = 428, //!< Vertical Binning - number of vertical photo-sensitive cells to combine together. + CAP_PROP_XI_BINNING_HORIZONTAL = 429, //!< Horizontal Binning - number of horizontal photo-sensitive cells to combine together. + CAP_PROP_XI_BINNING_PATTERN = 430, //!< Binning pattern type. + CAP_PROP_XI_DECIMATION_SELECTOR = 431, //!< Decimation engine selector. + CAP_PROP_XI_DECIMATION_VERTICAL = 432, //!< Vertical Decimation - vertical sub-sampling of the image - reduces the vertical resolution of the image by the specified vertical decimation factor. + CAP_PROP_XI_DECIMATION_HORIZONTAL = 433, //!< Horizontal Decimation - horizontal sub-sampling of the image - reduces the horizontal resolution of the image by the specified vertical decimation factor. + CAP_PROP_XI_DECIMATION_PATTERN = 434, //!< Decimation pattern type. + CAP_PROP_XI_TEST_PATTERN_GENERATOR_SELECTOR = 587, //!< Selects which test pattern generator is controlled by the TestPattern feature. + CAP_PROP_XI_TEST_PATTERN = 588, //!< Selects which test pattern type is generated by the selected generator. + CAP_PROP_XI_IMAGE_DATA_FORMAT = 435, //!< Output data format. + CAP_PROP_XI_SHUTTER_TYPE = 436, //!< Change sensor shutter type(CMOS sensor). + CAP_PROP_XI_SENSOR_TAPS = 437, //!< Number of taps. + CAP_PROP_XI_AEAG_ROI_OFFSET_X = 439, //!< Automatic exposure/gain ROI offset X. + CAP_PROP_XI_AEAG_ROI_OFFSET_Y = 440, //!< Automatic exposure/gain ROI offset Y. + CAP_PROP_XI_AEAG_ROI_WIDTH = 441, //!< Automatic exposure/gain ROI Width. + CAP_PROP_XI_AEAG_ROI_HEIGHT = 442, //!< Automatic exposure/gain ROI Height. + CAP_PROP_XI_BPC = 445, //!< Correction of bad pixels. + CAP_PROP_XI_WB_KR = 448, //!< White balance red coefficient. + CAP_PROP_XI_WB_KG = 449, //!< White balance green coefficient. + CAP_PROP_XI_WB_KB = 450, //!< White balance blue coefficient. + CAP_PROP_XI_WIDTH = 451, //!< Width of the Image provided by the device (in pixels). + CAP_PROP_XI_HEIGHT = 452, //!< Height of the Image provided by the device (in pixels). + CAP_PROP_XI_REGION_SELECTOR = 589, //!< Selects Region in Multiple ROI which parameters are set by width, height, ... ,region mode. + CAP_PROP_XI_REGION_MODE = 595, //!< Activates/deactivates Region selected by Region Selector. + CAP_PROP_XI_LIMIT_BANDWIDTH = 459, //!< Set/get bandwidth(datarate)(in Megabits). + CAP_PROP_XI_SENSOR_DATA_BIT_DEPTH = 460, //!< Sensor output data bit depth. + CAP_PROP_XI_OUTPUT_DATA_BIT_DEPTH = 461, //!< Device output data bit depth. + CAP_PROP_XI_IMAGE_DATA_BIT_DEPTH = 462, //!< bitdepth of data returned by function xiGetImage. + CAP_PROP_XI_OUTPUT_DATA_PACKING = 463, //!< Device output data packing (or grouping) enabled. Packing could be enabled if output_data_bit_depth > 8 and packing capability is available. + CAP_PROP_XI_OUTPUT_DATA_PACKING_TYPE = 464, //!< Data packing type. Some cameras supports only specific packing type. + CAP_PROP_XI_IS_COOLED = 465, //!< Returns 1 for cameras that support cooling. + CAP_PROP_XI_COOLING = 466, //!< Start camera cooling. + CAP_PROP_XI_TARGET_TEMP = 467, //!< Set sensor target temperature for cooling. + CAP_PROP_XI_CHIP_TEMP = 468, //!< Camera sensor temperature. + CAP_PROP_XI_HOUS_TEMP = 469, //!< Camera housing temperature. + CAP_PROP_XI_HOUS_BACK_SIDE_TEMP = 590, //!< Camera housing back side temperature. + CAP_PROP_XI_SENSOR_BOARD_TEMP = 596, //!< Camera sensor board temperature. + CAP_PROP_XI_CMS = 470, //!< Mode of color management system. + CAP_PROP_XI_APPLY_CMS = 471, //!< Enable applying of CMS profiles to xiGetImage (see XI_PRM_INPUT_CMS_PROFILE, XI_PRM_OUTPUT_CMS_PROFILE). + CAP_PROP_XI_IMAGE_IS_COLOR = 474, //!< Returns 1 for color cameras. + CAP_PROP_XI_COLOR_FILTER_ARRAY = 475, //!< Returns color filter array type of RAW data. + CAP_PROP_XI_GAMMAY = 476, //!< Luminosity gamma. + CAP_PROP_XI_GAMMAC = 477, //!< Chromaticity gamma. + CAP_PROP_XI_SHARPNESS = 478, //!< Sharpness Strength. + CAP_PROP_XI_CC_MATRIX_00 = 479, //!< Color Correction Matrix element [0][0]. + CAP_PROP_XI_CC_MATRIX_01 = 480, //!< Color Correction Matrix element [0][1]. + CAP_PROP_XI_CC_MATRIX_02 = 481, //!< Color Correction Matrix element [0][2]. + CAP_PROP_XI_CC_MATRIX_03 = 482, //!< Color Correction Matrix element [0][3]. + CAP_PROP_XI_CC_MATRIX_10 = 483, //!< Color Correction Matrix element [1][0]. + CAP_PROP_XI_CC_MATRIX_11 = 484, //!< Color Correction Matrix element [1][1]. + CAP_PROP_XI_CC_MATRIX_12 = 485, //!< Color Correction Matrix element [1][2]. + CAP_PROP_XI_CC_MATRIX_13 = 486, //!< Color Correction Matrix element [1][3]. + CAP_PROP_XI_CC_MATRIX_20 = 487, //!< Color Correction Matrix element [2][0]. + CAP_PROP_XI_CC_MATRIX_21 = 488, //!< Color Correction Matrix element [2][1]. + CAP_PROP_XI_CC_MATRIX_22 = 489, //!< Color Correction Matrix element [2][2]. + CAP_PROP_XI_CC_MATRIX_23 = 490, //!< Color Correction Matrix element [2][3]. + CAP_PROP_XI_CC_MATRIX_30 = 491, //!< Color Correction Matrix element [3][0]. + CAP_PROP_XI_CC_MATRIX_31 = 492, //!< Color Correction Matrix element [3][1]. + CAP_PROP_XI_CC_MATRIX_32 = 493, //!< Color Correction Matrix element [3][2]. + CAP_PROP_XI_CC_MATRIX_33 = 494, //!< Color Correction Matrix element [3][3]. + CAP_PROP_XI_DEFAULT_CC_MATRIX = 495, //!< Set default Color Correction Matrix. + CAP_PROP_XI_TRG_SELECTOR = 498, //!< Selects the type of trigger. + CAP_PROP_XI_ACQ_FRAME_BURST_COUNT = 499, //!< Sets number of frames acquired by burst. This burst is used only if trigger is set to FrameBurstStart. + CAP_PROP_XI_DEBOUNCE_EN = 507, //!< Enable/Disable debounce to selected GPI. + CAP_PROP_XI_DEBOUNCE_T0 = 508, //!< Debounce time (x * 10us). + CAP_PROP_XI_DEBOUNCE_T1 = 509, //!< Debounce time (x * 10us). + CAP_PROP_XI_DEBOUNCE_POL = 510, //!< Debounce polarity (pol = 1 t0 - falling edge, t1 - rising edge). + CAP_PROP_XI_LENS_MODE = 511, //!< Status of lens control interface. This shall be set to XI_ON before any Lens operations. + CAP_PROP_XI_LENS_APERTURE_VALUE = 512, //!< Current lens aperture value in stops. Examples: 2.8, 4, 5.6, 8, 11. + CAP_PROP_XI_LENS_FOCUS_MOVEMENT_VALUE = 513, //!< Lens current focus movement value to be used by XI_PRM_LENS_FOCUS_MOVE in motor steps. + CAP_PROP_XI_LENS_FOCUS_MOVE = 514, //!< Moves lens focus motor by steps set in XI_PRM_LENS_FOCUS_MOVEMENT_VALUE. + CAP_PROP_XI_LENS_FOCUS_DISTANCE = 515, //!< Lens focus distance in cm. + CAP_PROP_XI_LENS_FOCAL_LENGTH = 516, //!< Lens focal distance in mm. + CAP_PROP_XI_LENS_FEATURE_SELECTOR = 517, //!< Selects the current feature which is accessible by XI_PRM_LENS_FEATURE. + CAP_PROP_XI_LENS_FEATURE = 518, //!< Allows access to lens feature value currently selected by XI_PRM_LENS_FEATURE_SELECTOR. + CAP_PROP_XI_DEVICE_MODEL_ID = 521, //!< Returns device model id. + CAP_PROP_XI_DEVICE_SN = 522, //!< Returns device serial number. + CAP_PROP_XI_IMAGE_DATA_FORMAT_RGB32_ALPHA = 529, //!< The alpha channel of RGB32 output image format. + CAP_PROP_XI_IMAGE_PAYLOAD_SIZE = 530, //!< Buffer size in bytes sufficient for output image returned by xiGetImage. + CAP_PROP_XI_TRANSPORT_PIXEL_FORMAT = 531, //!< Current format of pixels on transport layer. + CAP_PROP_XI_SENSOR_CLOCK_FREQ_HZ = 532, //!< Sensor clock frequency in Hz. + CAP_PROP_XI_SENSOR_CLOCK_FREQ_INDEX = 533, //!< Sensor clock frequency index. Sensor with selected frequencies have possibility to set the frequency only by this index. + CAP_PROP_XI_SENSOR_OUTPUT_CHANNEL_COUNT = 534, //!< Number of output channels from sensor used for data transfer. + CAP_PROP_XI_FRAMERATE = 535, //!< Define framerate in Hz. + CAP_PROP_XI_COUNTER_SELECTOR = 536, //!< Select counter. + CAP_PROP_XI_COUNTER_VALUE = 537, //!< Counter status. + CAP_PROP_XI_ACQ_TIMING_MODE = 538, //!< Type of sensor frames timing. + CAP_PROP_XI_AVAILABLE_BANDWIDTH = 539, //!< Calculate and returns available interface bandwidth(int Megabits). + CAP_PROP_XI_BUFFER_POLICY = 540, //!< Data move policy. + CAP_PROP_XI_LUT_EN = 541, //!< Activates LUT. + CAP_PROP_XI_LUT_INDEX = 542, //!< Control the index (offset) of the coefficient to access in the LUT. + CAP_PROP_XI_LUT_VALUE = 543, //!< Value at entry LUTIndex of the LUT. + CAP_PROP_XI_TRG_DELAY = 544, //!< Specifies the delay in microseconds (us) to apply after the trigger reception before activating it. + CAP_PROP_XI_TS_RST_MODE = 545, //!< Defines how time stamp reset engine will be armed. + CAP_PROP_XI_TS_RST_SOURCE = 546, //!< Defines which source will be used for timestamp reset. Writing this parameter will trigger settings of engine (arming). + CAP_PROP_XI_IS_DEVICE_EXIST = 547, //!< Returns 1 if camera connected and works properly. + CAP_PROP_XI_ACQ_BUFFER_SIZE = 548, //!< Acquisition buffer size in buffer_size_unit. Default bytes. + CAP_PROP_XI_ACQ_BUFFER_SIZE_UNIT = 549, //!< Acquisition buffer size unit in bytes. Default 1. E.g. Value 1024 means that buffer_size is in KiBytes. + CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_SIZE = 550, //!< Acquisition transport buffer size in bytes. + CAP_PROP_XI_BUFFERS_QUEUE_SIZE = 551, //!< Queue of field/frame buffers. + CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_COMMIT = 552, //!< Number of buffers to commit to low level. + CAP_PROP_XI_RECENT_FRAME = 553, //!< GetImage returns most recent frame. + CAP_PROP_XI_DEVICE_RESET = 554, //!< Resets the camera to default state. + CAP_PROP_XI_COLUMN_FPN_CORRECTION = 555, //!< Correction of column FPN. + CAP_PROP_XI_ROW_FPN_CORRECTION = 591, //!< Correction of row FPN. + CAP_PROP_XI_SENSOR_MODE = 558, //!< Current sensor mode. Allows to select sensor mode by one integer. Setting of this parameter affects: image dimensions and downsampling. + CAP_PROP_XI_HDR = 559, //!< Enable High Dynamic Range feature. + CAP_PROP_XI_HDR_KNEEPOINT_COUNT = 560, //!< The number of kneepoints in the PWLR. + CAP_PROP_XI_HDR_T1 = 561, //!< Position of first kneepoint(in % of XI_PRM_EXPOSURE). + CAP_PROP_XI_HDR_T2 = 562, //!< Position of second kneepoint (in % of XI_PRM_EXPOSURE). + CAP_PROP_XI_KNEEPOINT1 = 563, //!< Value of first kneepoint (% of sensor saturation). + CAP_PROP_XI_KNEEPOINT2 = 564, //!< Value of second kneepoint (% of sensor saturation). + CAP_PROP_XI_IMAGE_BLACK_LEVEL = 565, //!< Last image black level counts. Can be used for Offline processing to recall it. + CAP_PROP_XI_HW_REVISION = 571, //!< Returns hardware revision number. + CAP_PROP_XI_DEBUG_LEVEL = 572, //!< Set debug level. + CAP_PROP_XI_AUTO_BANDWIDTH_CALCULATION = 573, //!< Automatic bandwidth calculation. + CAP_PROP_XI_FFS_FILE_ID = 594, //!< File number. + CAP_PROP_XI_FFS_FILE_SIZE = 580, //!< Size of file. + CAP_PROP_XI_FREE_FFS_SIZE = 581, //!< Size of free camera FFS. + CAP_PROP_XI_USED_FFS_SIZE = 582, //!< Size of used camera FFS. + CAP_PROP_XI_FFS_ACCESS_KEY = 583, //!< Setting of key enables file operations on some cameras. + CAP_PROP_XI_SENSOR_FEATURE_SELECTOR = 585, //!< Selects the current feature which is accessible by XI_PRM_SENSOR_FEATURE_VALUE. + CAP_PROP_XI_SENSOR_FEATURE_VALUE = 586, //!< Allows access to sensor feature value currently selected by XI_PRM_SENSOR_FEATURE_SELECTOR. + }; + +//! @} XIMEA + + +/** @name ARAVIS Camera API + @{ +*/ + +//! Properties of cameras available through ARAVIS backend +enum { CAP_PROP_ARAVIS_AUTOTRIGGER = 600 //!< Automatically trigger frame capture if camera is configured with software trigger +}; + +//! @} ARAVIS + +/** @name AVFoundation framework for iOS + @{ +*/ + +//! Properties of cameras available through AVFOUNDATION backend +enum { CAP_PROP_IOS_DEVICE_FOCUS = 9001, + CAP_PROP_IOS_DEVICE_EXPOSURE = 9002, + CAP_PROP_IOS_DEVICE_FLASH = 9003, + CAP_PROP_IOS_DEVICE_WHITEBALANCE = 9004, + CAP_PROP_IOS_DEVICE_TORCH = 9005 + }; + +//! @} AVFoundation framework for iOS + + +/** @name Smartek Giganetix GigEVisionSDK + @{ +*/ + +//! Properties of cameras available through Smartek Giganetix Ethernet Vision backend +/* --- Vladimir Litvinenko (litvinenko.vladimir@gmail.com) --- */ +enum { CAP_PROP_GIGA_FRAME_OFFSET_X = 10001, + CAP_PROP_GIGA_FRAME_OFFSET_Y = 10002, + CAP_PROP_GIGA_FRAME_WIDTH_MAX = 10003, + CAP_PROP_GIGA_FRAME_HEIGH_MAX = 10004, + CAP_PROP_GIGA_FRAME_SENS_WIDTH = 10005, + CAP_PROP_GIGA_FRAME_SENS_HEIGH = 10006 + }; + +//! @} Smartek + +/** @name Intel Perceptual Computing SDK + @{ +*/ +enum { CAP_PROP_INTELPERC_PROFILE_COUNT = 11001, + CAP_PROP_INTELPERC_PROFILE_IDX = 11002, + CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE = 11003, + CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE = 11004, + CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD = 11005, + CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ = 11006, + CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT = 11007 + }; + +//! Intel Perceptual Streams +enum { CAP_INTELPERC_DEPTH_GENERATOR = 1 << 29, + CAP_INTELPERC_IMAGE_GENERATOR = 1 << 28, + CAP_INTELPERC_IR_GENERATOR = 1 << 27, + CAP_INTELPERC_GENERATORS_MASK = CAP_INTELPERC_DEPTH_GENERATOR + CAP_INTELPERC_IMAGE_GENERATOR + CAP_INTELPERC_IR_GENERATOR + }; + +enum { CAP_INTELPERC_DEPTH_MAP = 0, //!< Each pixel is a 16-bit integer. The value indicates the distance from an object to the camera's XY plane or the Cartesian depth. + CAP_INTELPERC_UVDEPTH_MAP = 1, //!< Each pixel contains two 32-bit floating point values in the range of 0-1, representing the mapping of depth coordinates to the color coordinates. + CAP_INTELPERC_IR_MAP = 2, //!< Each pixel is a 16-bit integer. The value indicates the intensity of the reflected laser beam. + CAP_INTELPERC_IMAGE = 3 + }; + +//! @} Intel Perceptual + +/** @name gPhoto2 connection + @{ +*/ + +/** @brief gPhoto2 properties + +If `propertyId` is less than 0 then work on widget with that __additive inversed__ camera setting ID +Get IDs by using CAP_PROP_GPHOTO2_WIDGET_ENUMERATE. +@see CvCaptureCAM_GPHOTO2 for more info +*/ +enum { CAP_PROP_GPHOTO2_PREVIEW = 17001, //!< Capture only preview from liveview mode. + CAP_PROP_GPHOTO2_WIDGET_ENUMERATE = 17002, //!< Readonly, returns (const char *). + CAP_PROP_GPHOTO2_RELOAD_CONFIG = 17003, //!< Trigger, only by set. Reload camera settings. + CAP_PROP_GPHOTO2_RELOAD_ON_CHANGE = 17004, //!< Reload all settings on set. + CAP_PROP_GPHOTO2_COLLECT_MSGS = 17005, //!< Collect messages with details. + CAP_PROP_GPHOTO2_FLUSH_MSGS = 17006, //!< Readonly, returns (const char *). + CAP_PROP_SPEED = 17007, //!< Exposure speed. Can be readonly, depends on camera program. + CAP_PROP_APERTURE = 17008, //!< Aperture. Can be readonly, depends on camera program. + CAP_PROP_EXPOSUREPROGRAM = 17009, //!< Camera exposure program. + CAP_PROP_VIEWFINDER = 17010 //!< Enter liveview mode. + }; + +//! @} gPhoto2 + + +/** @name Images backend + @{ +*/ + +/** @brief Images backend properties + +*/ +enum { CAP_PROP_IMAGES_BASE = 18000, + CAP_PROP_IMAGES_LAST = 19000 // excluding + }; + +//! @} Images + +/** @name OBSENSOR (for Orbbec 3D-Sensor device/module ) + @{ +*/ +//! OBSENSOR data given from image generator +enum VideoCaptureOBSensorDataType{ + CAP_OBSENSOR_DEPTH_MAP = 0, //!< Depth values in mm (CV_16UC1) + CAP_OBSENSOR_BGR_IMAGE = 1, //!< Data given from BGR stream generator + CAP_OBSENSOR_IR_IMAGE = 2 //!< Data given from IR stream generator(CV_16UC1) +}; + +//! OBSENSOR stream generator +enum VideoCaptureOBSensorGenerators{ + CAP_OBSENSOR_DEPTH_GENERATOR = 1 << 29, + CAP_OBSENSOR_IMAGE_GENERATOR = 1 << 28, + CAP_OBSENSOR_IR_GENERATOR = 1 << 27, + CAP_OBSENSOR_GENERATORS_MASK = CAP_OBSENSOR_DEPTH_GENERATOR + CAP_OBSENSOR_IMAGE_GENERATOR + CAP_OBSENSOR_IR_GENERATOR +}; + +//!OBSENSOR properties +enum VideoCaptureOBSensorProperties{ + // INTRINSIC + CAP_PROP_OBSENSOR_INTRINSIC_FX=26001, + CAP_PROP_OBSENSOR_INTRINSIC_FY=26002, + CAP_PROP_OBSENSOR_INTRINSIC_CX=26003, + CAP_PROP_OBSENSOR_INTRINSIC_CY=26004, +}; + +//! @} OBSENSOR + +//! @} videoio_flags_others + + +class IVideoCapture; +//! @cond IGNORED +namespace internal { class VideoCapturePrivateAccessor; } +//! @endcond IGNORED + +/** @brief Class for video capturing from video files, image sequences or cameras. + +The class provides C++ API for capturing video from cameras or for reading video files and image sequences. + +Here is how the class can be used: +@include samples/cpp/videocapture_basic.cpp + +@note In @ref videoio_c "C API" the black-box structure `CvCapture` is used instead of %VideoCapture. +@note +- (C++) A basic sample on using the %VideoCapture interface can be found at + `OPENCV_SOURCE_CODE/samples/cpp/videocapture_starter.cpp` +- (Python) A basic sample on using the %VideoCapture interface can be found at + `OPENCV_SOURCE_CODE/samples/python/video.py` +- (Python) A multi threaded video processing sample can be found at + `OPENCV_SOURCE_CODE/samples/python/video_threaded.py` +- (Python) %VideoCapture sample showcasing some features of the Video4Linux2 backend + `OPENCV_SOURCE_CODE/samples/python/video_v4l2.py` + */ +class CV_EXPORTS_W VideoCapture +{ +public: + /** @brief Default constructor + @note In @ref videoio_c "C API", when you finished working with video, release CvCapture structure with + cvReleaseCapture(), or use Ptr\ that calls cvReleaseCapture() automatically in the + destructor. + */ + CV_WRAP VideoCapture(); + + /** @overload + @brief Opens a video file or a capturing device or an IP video stream for video capturing with API Preference + + @param filename it can be: + - name of video file (eg. `video.avi`) + - or image sequence (eg. `img_%02d.jpg`, which will read samples like `img_00.jpg, img_01.jpg, img_02.jpg, ...`) + - or URL of video stream (eg. `protocol://host:port/script_name?script_params|auth`) + - or GStreamer pipeline string in gst-launch tool format in case if GStreamer is used as backend + Note that each video stream or IP camera feed has its own URL scheme. Please refer to the + documentation of source stream to know the right URL. + @param apiPreference preferred Capture API backends to use. Can be used to enforce a specific reader + implementation if multiple are available: e.g. cv::CAP_FFMPEG or cv::CAP_IMAGES or cv::CAP_DSHOW. + + @sa cv::VideoCaptureAPIs + */ + CV_WRAP explicit VideoCapture(const String& filename, int apiPreference = CAP_ANY); + + /** @overload + @brief Opens a video file or a capturing device or an IP video stream for video capturing with API Preference and parameters + + The `params` parameter allows to specify extra parameters encoded as pairs `(paramId_1, paramValue_1, paramId_2, paramValue_2, ...)`. + See cv::VideoCaptureProperties + */ + CV_WRAP explicit VideoCapture(const String& filename, int apiPreference, const std::vector& params); + + /** @overload + @brief Opens a camera for video capturing + + @param index id of the video capturing device to open. To open default camera using default backend just pass 0. + (to backward compatibility usage of camera_id + domain_offset (CAP_*) is valid when apiPreference is CAP_ANY) + @param apiPreference preferred Capture API backends to use. Can be used to enforce a specific reader + implementation if multiple are available: e.g. cv::CAP_DSHOW or cv::CAP_MSMF or cv::CAP_V4L. + + @sa cv::VideoCaptureAPIs + */ + CV_WRAP explicit VideoCapture(int index, int apiPreference = CAP_ANY); + + /** @overload + @brief Opens a camera for video capturing with API Preference and parameters + + The `params` parameter allows to specify extra parameters encoded as pairs `(paramId_1, paramValue_1, paramId_2, paramValue_2, ...)`. + See cv::VideoCaptureProperties + */ + CV_WRAP explicit VideoCapture(int index, int apiPreference, const std::vector& params); + + /** @brief Default destructor + + The method first calls VideoCapture::release to close the already opened file or camera. + */ + virtual ~VideoCapture(); + + /** @brief Opens a video file or a capturing device or an IP video stream for video capturing. + + @overload + + Parameters are same as the constructor VideoCapture(const String& filename, int apiPreference = CAP_ANY) + @return `true` if the file has been successfully opened + + The method first calls VideoCapture::release to close the already opened file or camera. + */ + CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY); + + /** @brief Opens a video file or a capturing device or an IP video stream for video capturing with API Preference and parameters + + @overload + + The `params` parameter allows to specify extra parameters encoded as pairs `(paramId_1, paramValue_1, paramId_2, paramValue_2, ...)`. + See cv::VideoCaptureProperties + + @return `true` if the file has been successfully opened + + The method first calls VideoCapture::release to close the already opened file or camera. + */ + CV_WRAP virtual bool open(const String& filename, int apiPreference, const std::vector& params); + + /** @brief Opens a camera for video capturing + + @overload + + Parameters are same as the constructor VideoCapture(int index, int apiPreference = CAP_ANY) + @return `true` if the camera has been successfully opened. + + The method first calls VideoCapture::release to close the already opened file or camera. + */ + CV_WRAP virtual bool open(int index, int apiPreference = CAP_ANY); + + /** @brief Opens a camera for video capturing with API Preference and parameters + + @overload + + The `params` parameter allows to specify extra parameters encoded as pairs `(paramId_1, paramValue_1, paramId_2, paramValue_2, ...)`. + See cv::VideoCaptureProperties + + @return `true` if the camera has been successfully opened. + + The method first calls VideoCapture::release to close the already opened file or camera. + */ + CV_WRAP virtual bool open(int index, int apiPreference, const std::vector& params); + + /** @brief Returns true if video capturing has been initialized already. + + If the previous call to VideoCapture constructor or VideoCapture::open() succeeded, the method returns + true. + */ + CV_WRAP virtual bool isOpened() const; + + /** @brief Closes video file or capturing device. + + The method is automatically called by subsequent VideoCapture::open and by VideoCapture + destructor. + + The C function also deallocates memory and clears \*capture pointer. + */ + CV_WRAP virtual void release(); + + /** @brief Grabs the next frame from video file or capturing device. + + @return `true` (non-zero) in the case of success. + + The method/function grabs the next frame from video file or camera and returns true (non-zero) in + the case of success. + + The primary use of the function is in multi-camera environments, especially when the cameras do not + have hardware synchronization. That is, you call VideoCapture::grab() for each camera and after that + call the slower method VideoCapture::retrieve() to decode and get frame from each camera. This way + the overhead on demosaicing or motion jpeg decompression etc. is eliminated and the retrieved frames + from different cameras will be closer in time. + + Also, when a connected camera is multi-head (for example, a stereo camera or a Kinect device), the + correct way of retrieving data from it is to call VideoCapture::grab() first and then call + VideoCapture::retrieve() one or more times with different values of the channel parameter. + + @ref tutorial_kinect_openni + */ + CV_WRAP virtual bool grab(); + + /** @brief Decodes and returns the grabbed video frame. + + @param [out] image the video frame is returned here. If no frames has been grabbed the image will be empty. + @param flag it could be a frame index or a driver specific flag + @return `false` if no frames has been grabbed + + The method decodes and returns the just grabbed frame. If no frames has been grabbed + (camera has been disconnected, or there are no more frames in video file), the method returns false + and the function returns an empty image (with %cv::Mat, test it with Mat::empty()). + + @sa read() + + @note In @ref videoio_c "C API", functions cvRetrieveFrame() and cv.RetrieveFrame() return image stored inside the video + capturing structure. It is not allowed to modify or release the image! You can copy the frame using + cvCloneImage and then do whatever you want with the copy. + */ + CV_WRAP virtual bool retrieve(OutputArray image, int flag = 0); + + /** @brief Stream operator to read the next video frame. + @sa read() + */ + virtual VideoCapture& operator >> (CV_OUT Mat& image); + + /** @overload + @sa read() + */ + virtual VideoCapture& operator >> (CV_OUT UMat& image); + + /** @brief Grabs, decodes and returns the next video frame. + + @param [out] image the video frame is returned here. If no frames has been grabbed the image will be empty. + @return `false` if no frames has been grabbed + + The method/function combines VideoCapture::grab() and VideoCapture::retrieve() in one call. This is the + most convenient method for reading video files or capturing data from decode and returns the just + grabbed frame. If no frames has been grabbed (camera has been disconnected, or there are no more + frames in video file), the method returns false and the function returns empty image (with %cv::Mat, test it with Mat::empty()). + + @note In @ref videoio_c "C API", functions cvRetrieveFrame() and cv.RetrieveFrame() return image stored inside the video + capturing structure. It is not allowed to modify or release the image! You can copy the frame using + cvCloneImage and then do whatever you want with the copy. + */ + CV_WRAP virtual bool read(OutputArray image); + + /** @brief Sets a property in the VideoCapture. + + @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...) + or one from @ref videoio_flags_others + @param value Value of the property. + @return `true` if the property is supported by backend used by the VideoCapture instance. + @note Even if it returns `true` this doesn't ensure that the property + value has been accepted by the capture device. See note in VideoCapture::get() + */ + CV_WRAP virtual bool set(int propId, double value); + + /** @brief Returns the specified VideoCapture property + + @param propId Property identifier from cv::VideoCaptureProperties (eg. cv::CAP_PROP_POS_MSEC, cv::CAP_PROP_POS_FRAMES, ...) + or one from @ref videoio_flags_others + @return Value for the specified property. Value 0 is returned when querying a property that is + not supported by the backend used by the VideoCapture instance. + + @note Reading / writing properties involves many layers. Some unexpected result might happens + along this chain. + @code{.txt} + VideoCapture -> API Backend -> Operating System -> Device Driver -> Device Hardware + @endcode + The returned value might be different from what really used by the device or it could be encoded + using device dependent rules (eg. steps or percentage). Effective behaviour depends from device + driver and API Backend + + */ + CV_WRAP virtual double get(int propId) const; + + /** @brief Returns used backend API name + + @note Stream should be opened. + */ + CV_WRAP String getBackendName() const; + + /** Switches exceptions mode + * + * methods raise exceptions if not successful instead of returning an error code + */ + CV_WRAP void setExceptionMode(bool enable) { throwOnFail = enable; } + + /// query if exception mode is active + CV_WRAP bool getExceptionMode() { return throwOnFail; } + + + /** @brief Wait for ready frames from VideoCapture. + + @param streams input video streams + @param readyIndex stream indexes with grabbed frames (ready to use .retrieve() to fetch actual frame) + @param timeoutNs number of nanoseconds (0 - infinite) + @return `true` if streamReady is not empty + + @throws Exception %Exception on stream errors (check .isOpened() to filter out malformed streams) or VideoCapture type is not supported + + The primary use of the function is in multi-camera environments. + The method fills the ready state vector, grabs video frame, if camera is ready. + + After this call use VideoCapture::retrieve() to decode and fetch frame data. + */ + CV_WRAP static + bool waitAny( + const std::vector& streams, + CV_OUT std::vector& readyIndex, + int64 timeoutNs = 0); + +protected: + Ptr cap; + Ptr icap; + bool throwOnFail; + + friend class internal::VideoCapturePrivateAccessor; +}; + +class IVideoWriter; + +/** @example samples/cpp/tutorial_code/videoio/video-write/video-write.cpp +Check @ref tutorial_video_write "the corresponding tutorial" for more details +*/ + +/** @example samples/cpp/videowriter_basic.cpp +An example using VideoCapture and VideoWriter class +*/ + +/** @brief Video writer class. + +The class provides C++ API for writing video files or image sequences. +*/ +class CV_EXPORTS_W VideoWriter +{ +public: + /** @brief Default constructors + + The constructors/functions initialize video writers. + - On Linux FFMPEG is used to write videos; + - On Windows FFMPEG or MSWF or DSHOW is used; + - On MacOSX AVFoundation is used. + */ + CV_WRAP VideoWriter(); + + /** @overload + @param filename Name of the output video file. + @param fourcc 4-character code of codec used to compress the frames. For example, + VideoWriter::fourcc('P','I','M','1') is a MPEG-1 codec, VideoWriter::fourcc('M','J','P','G') + is a motion-jpeg codec etc. List of codes can be obtained at + [MSDN](https://docs.microsoft.com/en-us/windows/win32/medfound/video-fourccs) page + or with this [archived page](https://web.archive.org/web/20220316062600/http://www.fourcc.org/codecs.php) + of the fourcc site for a more complete list). FFMPEG backend with MP4 container natively uses + other values as fourcc code: see [ObjectType](http://mp4ra.org/#/codecs), + so you may receive a warning message from OpenCV about fourcc code conversion. + @param fps Framerate of the created video stream. + @param frameSize Size of the video frames. + @param isColor If it is not zero, the encoder will expect and encode color frames, otherwise it + will work with grayscale frames. + + @b Tips: + - With some backends `fourcc=-1` pops up the codec selection dialog from the system. + - To save image sequence use a proper filename (eg. `img_%02d.jpg`) and `fourcc=0` + OR `fps=0`. Use uncompressed image format (eg. `img_%02d.BMP`) to save raw frames. + - Most codecs are lossy. If you want lossless video file you need to use a lossless codecs + (eg. FFMPEG FFV1, Huffman HFYU, Lagarith LAGS, etc...) + - If FFMPEG is enabled, using `codec=0; fps=0;` you can create an uncompressed (raw) video file. + - If FFMPEG is used, we allow frames of odd width or height, but in this case we truncate + the rightmost column/the bottom row. Probably, this should be handled more elegantly, + but some internal functions inside FFMPEG swscale require even width/height. + */ + CV_WRAP VideoWriter(const String& filename, int fourcc, double fps, + Size frameSize, bool isColor = true); + + /** @overload + The `apiPreference` parameter allows to specify API backends to use. Can be used to enforce a specific reader implementation + if multiple are available: e.g. cv::CAP_FFMPEG or cv::CAP_GSTREAMER. + */ + CV_WRAP VideoWriter(const String& filename, int apiPreference, int fourcc, double fps, + Size frameSize, bool isColor = true); + + /** @overload + * The `params` parameter allows to specify extra encoder parameters encoded as pairs (paramId_1, paramValue_1, paramId_2, paramValue_2, ... .) + * see cv::VideoWriterProperties + */ + CV_WRAP VideoWriter(const String& filename, int fourcc, double fps, const Size& frameSize, + const std::vector& params); + + /** @overload + */ + CV_WRAP VideoWriter(const String& filename, int apiPreference, int fourcc, double fps, + const Size& frameSize, const std::vector& params); + + /** @brief Default destructor + + The method first calls VideoWriter::release to close the already opened file. + */ + virtual ~VideoWriter(); + + /** @brief Initializes or reinitializes video writer. + + The method opens video writer. Parameters are the same as in the constructor + VideoWriter::VideoWriter. + @return `true` if video writer has been successfully initialized + + The method first calls VideoWriter::release to close the already opened file. + */ + CV_WRAP virtual bool open(const String& filename, int fourcc, double fps, + Size frameSize, bool isColor = true); + + /** @overload + */ + CV_WRAP bool open(const String& filename, int apiPreference, int fourcc, double fps, + Size frameSize, bool isColor = true); + + /** @overload + */ + CV_WRAP bool open(const String& filename, int fourcc, double fps, const Size& frameSize, + const std::vector& params); + + /** @overload + */ + CV_WRAP bool open(const String& filename, int apiPreference, int fourcc, double fps, + const Size& frameSize, const std::vector& params); + + /** @brief Returns true if video writer has been successfully initialized. + */ + CV_WRAP virtual bool isOpened() const; + + /** @brief Closes the video writer. + + The method is automatically called by subsequent VideoWriter::open and by the VideoWriter + destructor. + */ + CV_WRAP virtual void release(); + + /** @brief Stream operator to write the next video frame. + @sa write + */ + virtual VideoWriter& operator << (const Mat& image); + + /** @overload + @sa write + */ + virtual VideoWriter& operator << (const UMat& image); + + /** @brief Writes the next video frame + + @param image The written frame. In general, color images are expected in BGR format. + + The function/method writes the specified image to video file. It must have the same size as has + been specified when opening the video writer. + */ + CV_WRAP virtual void write(InputArray image); + + /** @brief Sets a property in the VideoWriter. + + @param propId Property identifier from cv::VideoWriterProperties (eg. cv::VIDEOWRITER_PROP_QUALITY) + or one of @ref videoio_flags_others + + @param value Value of the property. + @return `true` if the property is supported by the backend used by the VideoWriter instance. + */ + CV_WRAP virtual bool set(int propId, double value); + + /** @brief Returns the specified VideoWriter property + + @param propId Property identifier from cv::VideoWriterProperties (eg. cv::VIDEOWRITER_PROP_QUALITY) + or one of @ref videoio_flags_others + + @return Value for the specified property. Value 0 is returned when querying a property that is + not supported by the backend used by the VideoWriter instance. + */ + CV_WRAP virtual double get(int propId) const; + + /** @brief Concatenates 4 chars to a fourcc code + + @return a fourcc code + + This static method constructs the fourcc code of the codec to be used in the constructor + VideoWriter::VideoWriter or VideoWriter::open. + */ + CV_WRAP static int fourcc(char c1, char c2, char c3, char c4); + + /** @brief Returns used backend API name + + @note Stream should be opened. + */ + CV_WRAP String getBackendName() const; + +protected: + Ptr writer; + Ptr iwriter; + + static Ptr create(const String& filename, int fourcc, double fps, + Size frameSize, bool isColor = true); +}; + +//! @cond IGNORED +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvCapture* obj) const; }; +template<> struct DefaultDeleter{ CV_EXPORTS void operator ()(CvVideoWriter* obj) const; }; +//! @endcond IGNORED + +//! @} videoio + +} // cv + +#endif //OPENCV_VIDEOIO_HPP diff --git a/Thirdparty/opencv2/include/opencv2/videoio/cap_ios.h b/Thirdparty/opencv2/include/opencv2/videoio/cap_ios.h new file mode 100644 index 0000000..207ad46 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio/cap_ios.h @@ -0,0 +1,150 @@ +/* For iOS video I/O + * by Eduard Feicho on 29/07/12 + * Copyright 2012. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#import +#import +#import +#import +#include "opencv2/core.hpp" + +//! @addtogroup videoio_ios +//! @{ + +/////////////////////////////////////// CvAbstractCamera ///////////////////////////////////// + +@class CvAbstractCamera; + +CV_EXPORTS @interface CvAbstractCamera : NSObject +{ + UIDeviceOrientation currentDeviceOrientation; + + BOOL cameraAvailable; +} + +@property (nonatomic, strong) AVCaptureSession* captureSession; +@property (nonatomic, strong) AVCaptureConnection* videoCaptureConnection; + +@property (nonatomic, readonly) BOOL running; +@property (nonatomic, readonly) BOOL captureSessionLoaded; + +@property (nonatomic, assign) int defaultFPS; +@property (nonatomic, readonly) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer; +@property (nonatomic, assign) AVCaptureDevicePosition defaultAVCaptureDevicePosition; +@property (nonatomic, assign) AVCaptureVideoOrientation defaultAVCaptureVideoOrientation; +@property (nonatomic, assign) BOOL useAVCaptureVideoPreviewLayer; +@property (nonatomic, strong) NSString *const defaultAVCaptureSessionPreset; + +@property (nonatomic, assign) int imageWidth; +@property (nonatomic, assign) int imageHeight; + +@property (nonatomic, strong) UIView* parentView; + +- CV_UNUSED(start); +- CV_UNUSED(stop); +- CV_UNUSED(switchCameras); + +- (id)initWithParentView:(UIView*)parent; + +- CV_UNUSED(createCaptureOutput); +- CV_UNUSED(createVideoPreviewLayer); +- CV_UNUSED(updateOrientation); + +- CV_UNUSED(lockFocus); +- CV_UNUSED(unlockFocus); +- CV_UNUSED(lockExposure); +- CV_UNUSED(unlockExposure); +- CV_UNUSED(lockBalance); +- CV_UNUSED(unlockBalance); + +@end + +///////////////////////////////// CvVideoCamera /////////////////////////////////////////// + +@class CvVideoCamera; + +CV_EXPORTS @protocol CvVideoCameraDelegate + +#ifdef __cplusplus +// delegate method for processing image frames +- (void)processImage:(cv::Mat&)image; +#endif + +@end + +CV_EXPORTS @interface CvVideoCamera : CvAbstractCamera +{ + AVCaptureVideoDataOutput *videoDataOutput; + + dispatch_queue_t videoDataOutputQueue; + CALayer *customPreviewLayer; + + CMTime lastSampleTime; + +} + +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) BOOL grayscaleMode; + +@property (nonatomic, assign) BOOL recordVideo; +@property (nonatomic, assign) BOOL rotateVideo; +@property (nonatomic, strong) AVAssetWriterInput* recordAssetWriterInput; +@property (nonatomic, strong) AVAssetWriterInputPixelBufferAdaptor* recordPixelBufferAdaptor; +@property (nonatomic, strong) AVAssetWriter* recordAssetWriter; + +- (void)adjustLayoutToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; +- CV_UNUSED(layoutPreviewLayer); +- CV_UNUSED(saveVideo); +- (NSURL *)videoFileURL; +- (NSString *)videoFileString; + + +@end + +///////////////////////////////// CvPhotoCamera /////////////////////////////////////////// + +@class CvPhotoCamera; + +CV_EXPORTS @protocol CvPhotoCameraDelegate + +- (void)photoCamera:(CvPhotoCamera*)photoCamera capturedImage:(UIImage *)image; +- (void)photoCameraCancel:(CvPhotoCamera*)photoCamera; + +@end + +CV_EXPORTS @interface CvPhotoCamera : CvAbstractCamera +{ + AVCaptureStillImageOutput *stillImageOutput; +} + +@property (nonatomic, weak) id delegate; + +- CV_UNUSED(takePicture); + +@end + +//! @} videoio_ios diff --git a/Thirdparty/opencv2/include/opencv2/videoio/legacy/constants_c.h b/Thirdparty/opencv2/include/opencv2/videoio/legacy/constants_c.h new file mode 100644 index 0000000..91f85f8 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio/legacy/constants_c.h @@ -0,0 +1,434 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_VIDEOIO_LEGACY_CONSTANTS_H +#define OPENCV_VIDEOIO_LEGACY_CONSTANTS_H + +enum +{ + CV_CAP_ANY =0, // autodetect + + CV_CAP_MIL =100, // MIL proprietary drivers + + CV_CAP_VFW =200, // platform native + CV_CAP_V4L =200, + CV_CAP_V4L2 =200, + + CV_CAP_FIREWARE =300, // IEEE 1394 drivers + CV_CAP_FIREWIRE =300, + CV_CAP_IEEE1394 =300, + CV_CAP_DC1394 =300, + CV_CAP_CMU1394 =300, + + CV_CAP_STEREO =400, // TYZX proprietary drivers + CV_CAP_TYZX =400, + CV_TYZX_LEFT =400, + CV_TYZX_RIGHT =401, + CV_TYZX_COLOR =402, + CV_TYZX_Z =403, + + CV_CAP_QT =500, // QuickTime + + CV_CAP_UNICAP =600, // Unicap drivers + + CV_CAP_DSHOW =700, // DirectShow (via videoInput) + CV_CAP_MSMF =1400, // Microsoft Media Foundation (via videoInput) + + CV_CAP_PVAPI =800, // PvAPI, Prosilica GigE SDK + + CV_CAP_OPENNI =900, // OpenNI (for Kinect) + CV_CAP_OPENNI_ASUS =910, // OpenNI (for Asus Xtion) + + CV_CAP_ANDROID =1000, // Android - not used + CV_CAP_ANDROID_BACK =CV_CAP_ANDROID+99, // Android back camera - not used + CV_CAP_ANDROID_FRONT =CV_CAP_ANDROID+98, // Android front camera - not used + + CV_CAP_XIAPI =1100, // XIMEA Camera API + + CV_CAP_AVFOUNDATION = 1200, // AVFoundation framework for iOS (OS X Lion will have the same API) + + CV_CAP_GIGANETIX = 1300, // Smartek Giganetix GigEVisionSDK + + CV_CAP_INTELPERC = 1500, // Intel Perceptual Computing + + CV_CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect) + CV_CAP_GPHOTO2 = 1700, + CV_CAP_GSTREAMER = 1800, // GStreamer + CV_CAP_FFMPEG = 1900, // FFMPEG + CV_CAP_IMAGES = 2000, // OpenCV Image Sequence (e.g. img_%02d.jpg) + + CV_CAP_ARAVIS = 2100 // Aravis GigE SDK +}; + +enum +{ + // modes of the controlling registers (can be: auto, manual, auto single push, absolute Latter allowed with any other mode) + // every feature can have only one mode turned on at a time + CV_CAP_PROP_DC1394_OFF = -4, //turn the feature off (not controlled manually nor automatically) + CV_CAP_PROP_DC1394_MODE_MANUAL = -3, //set automatically when a value of the feature is set by the user + CV_CAP_PROP_DC1394_MODE_AUTO = -2, + CV_CAP_PROP_DC1394_MODE_ONE_PUSH_AUTO = -1, + CV_CAP_PROP_POS_MSEC =0, + CV_CAP_PROP_POS_FRAMES =1, + CV_CAP_PROP_POS_AVI_RATIO =2, + CV_CAP_PROP_FRAME_WIDTH =3, + CV_CAP_PROP_FRAME_HEIGHT =4, + CV_CAP_PROP_FPS =5, + CV_CAP_PROP_FOURCC =6, + CV_CAP_PROP_FRAME_COUNT =7, + CV_CAP_PROP_FORMAT =8, + CV_CAP_PROP_MODE =9, + CV_CAP_PROP_BRIGHTNESS =10, + CV_CAP_PROP_CONTRAST =11, + CV_CAP_PROP_SATURATION =12, + CV_CAP_PROP_HUE =13, + CV_CAP_PROP_GAIN =14, + CV_CAP_PROP_EXPOSURE =15, + CV_CAP_PROP_CONVERT_RGB =16, + CV_CAP_PROP_WHITE_BALANCE_BLUE_U =17, + CV_CAP_PROP_RECTIFICATION =18, + CV_CAP_PROP_MONOCHROME =19, + CV_CAP_PROP_SHARPNESS =20, + CV_CAP_PROP_AUTO_EXPOSURE =21, // exposure control done by camera, + // user can adjust reference level + // using this feature + CV_CAP_PROP_GAMMA =22, + CV_CAP_PROP_TEMPERATURE =23, + CV_CAP_PROP_TRIGGER =24, + CV_CAP_PROP_TRIGGER_DELAY =25, + CV_CAP_PROP_WHITE_BALANCE_RED_V =26, + CV_CAP_PROP_ZOOM =27, + CV_CAP_PROP_FOCUS =28, + CV_CAP_PROP_GUID =29, + CV_CAP_PROP_ISO_SPEED =30, + CV_CAP_PROP_MAX_DC1394 =31, + CV_CAP_PROP_BACKLIGHT =32, + CV_CAP_PROP_PAN =33, + CV_CAP_PROP_TILT =34, + CV_CAP_PROP_ROLL =35, + CV_CAP_PROP_IRIS =36, + CV_CAP_PROP_SETTINGS =37, + CV_CAP_PROP_BUFFERSIZE =38, + CV_CAP_PROP_AUTOFOCUS =39, + CV_CAP_PROP_SAR_NUM =40, + CV_CAP_PROP_SAR_DEN =41, + + CV_CAP_PROP_AUTOGRAB =1024, // property for videoio class CvCapture_Android only + CV_CAP_PROP_SUPPORTED_PREVIEW_SIZES_STRING=1025, // readonly, tricky property, returns cpnst char* indeed + CV_CAP_PROP_PREVIEW_FORMAT=1026, // readonly, tricky property, returns cpnst char* indeed + + // OpenNI map generators + CV_CAP_OPENNI_DEPTH_GENERATOR = 1 << 31, + CV_CAP_OPENNI_IMAGE_GENERATOR = 1 << 30, + CV_CAP_OPENNI_IR_GENERATOR = 1 << 29, + CV_CAP_OPENNI_GENERATORS_MASK = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_OPENNI_IR_GENERATOR, + + // Properties of cameras available through OpenNI interfaces + CV_CAP_PROP_OPENNI_OUTPUT_MODE = 100, + CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 101, // in mm + CV_CAP_PROP_OPENNI_BASELINE = 102, // in mm + CV_CAP_PROP_OPENNI_FOCAL_LENGTH = 103, // in pixels + CV_CAP_PROP_OPENNI_REGISTRATION = 104, // flag + CV_CAP_PROP_OPENNI_REGISTRATION_ON = CV_CAP_PROP_OPENNI_REGISTRATION, // flag that synchronizes the remapping depth map to image map + // by changing depth generator's view point (if the flag is "on") or + // sets this view point to its normal one (if the flag is "off"). + CV_CAP_PROP_OPENNI_APPROX_FRAME_SYNC = 105, + CV_CAP_PROP_OPENNI_MAX_BUFFER_SIZE = 106, + CV_CAP_PROP_OPENNI_CIRCLE_BUFFER = 107, + CV_CAP_PROP_OPENNI_MAX_TIME_DURATION = 108, + + CV_CAP_PROP_OPENNI_GENERATOR_PRESENT = 109, + CV_CAP_PROP_OPENNI2_SYNC = 110, + CV_CAP_PROP_OPENNI2_MIRROR = 111, + + CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT = CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_PROP_OPENNI_GENERATOR_PRESENT, + CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_PROP_OPENNI_OUTPUT_MODE, + CV_CAP_OPENNI_DEPTH_GENERATOR_PRESENT = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_GENERATOR_PRESENT, + CV_CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_BASELINE, + CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_FOCAL_LENGTH, + CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_REGISTRATION, + CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION_ON = CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, + CV_CAP_OPENNI_IR_GENERATOR_PRESENT = CV_CAP_OPENNI_IR_GENERATOR + CV_CAP_PROP_OPENNI_GENERATOR_PRESENT, + + // Properties of cameras available through GStreamer interface + CV_CAP_GSTREAMER_QUEUE_LENGTH = 200, // default is 1 + + // PVAPI + CV_CAP_PROP_PVAPI_MULTICASTIP = 300, // ip for anable multicast master mode. 0 for disable multicast + CV_CAP_PROP_PVAPI_FRAMESTARTTRIGGERMODE = 301, // FrameStartTriggerMode: Determines how a frame is initiated + CV_CAP_PROP_PVAPI_DECIMATIONHORIZONTAL = 302, // Horizontal sub-sampling of the image + CV_CAP_PROP_PVAPI_DECIMATIONVERTICAL = 303, // Vertical sub-sampling of the image + CV_CAP_PROP_PVAPI_BINNINGX = 304, // Horizontal binning factor + CV_CAP_PROP_PVAPI_BINNINGY = 305, // Vertical binning factor + CV_CAP_PROP_PVAPI_PIXELFORMAT = 306, // Pixel format + + // Properties of cameras available through XIMEA SDK interface + CV_CAP_PROP_XI_DOWNSAMPLING = 400, // Change image resolution by binning or skipping. + CV_CAP_PROP_XI_DATA_FORMAT = 401, // Output data format. + CV_CAP_PROP_XI_OFFSET_X = 402, // Horizontal offset from the origin to the area of interest (in pixels). + CV_CAP_PROP_XI_OFFSET_Y = 403, // Vertical offset from the origin to the area of interest (in pixels). + CV_CAP_PROP_XI_TRG_SOURCE = 404, // Defines source of trigger. + CV_CAP_PROP_XI_TRG_SOFTWARE = 405, // Generates an internal trigger. PRM_TRG_SOURCE must be set to TRG_SOFTWARE. + CV_CAP_PROP_XI_GPI_SELECTOR = 406, // Selects general purpose input + CV_CAP_PROP_XI_GPI_MODE = 407, // Set general purpose input mode + CV_CAP_PROP_XI_GPI_LEVEL = 408, // Get general purpose level + CV_CAP_PROP_XI_GPO_SELECTOR = 409, // Selects general purpose output + CV_CAP_PROP_XI_GPO_MODE = 410, // Set general purpose output mode + CV_CAP_PROP_XI_LED_SELECTOR = 411, // Selects camera signalling LED + CV_CAP_PROP_XI_LED_MODE = 412, // Define camera signalling LED functionality + CV_CAP_PROP_XI_MANUAL_WB = 413, // Calculates White Balance(must be called during acquisition) + CV_CAP_PROP_XI_AUTO_WB = 414, // Automatic white balance + CV_CAP_PROP_XI_AEAG = 415, // Automatic exposure/gain + CV_CAP_PROP_XI_EXP_PRIORITY = 416, // Exposure priority (0.5 - exposure 50%, gain 50%). + CV_CAP_PROP_XI_AE_MAX_LIMIT = 417, // Maximum limit of exposure in AEAG procedure + CV_CAP_PROP_XI_AG_MAX_LIMIT = 418, // Maximum limit of gain in AEAG procedure + CV_CAP_PROP_XI_AEAG_LEVEL = 419, // Average intensity of output signal AEAG should achieve(in %) + CV_CAP_PROP_XI_TIMEOUT = 420, // Image capture timeout in milliseconds + CV_CAP_PROP_XI_EXPOSURE = 421, // Exposure time in microseconds + CV_CAP_PROP_XI_EXPOSURE_BURST_COUNT = 422, // Sets the number of times of exposure in one frame. + CV_CAP_PROP_XI_GAIN_SELECTOR = 423, // Gain selector for parameter Gain allows to select different type of gains. + CV_CAP_PROP_XI_GAIN = 424, // Gain in dB + CV_CAP_PROP_XI_DOWNSAMPLING_TYPE = 426, // Change image downsampling type. + CV_CAP_PROP_XI_BINNING_SELECTOR = 427, // Binning engine selector. + CV_CAP_PROP_XI_BINNING_VERTICAL = 428, // Vertical Binning - number of vertical photo-sensitive cells to combine together. + CV_CAP_PROP_XI_BINNING_HORIZONTAL = 429, // Horizontal Binning - number of horizontal photo-sensitive cells to combine together. + CV_CAP_PROP_XI_BINNING_PATTERN = 430, // Binning pattern type. + CV_CAP_PROP_XI_DECIMATION_SELECTOR = 431, // Decimation engine selector. + CV_CAP_PROP_XI_DECIMATION_VERTICAL = 432, // Vertical Decimation - vertical sub-sampling of the image - reduces the vertical resolution of the image by the specified vertical decimation factor. + CV_CAP_PROP_XI_DECIMATION_HORIZONTAL = 433, // Horizontal Decimation - horizontal sub-sampling of the image - reduces the horizontal resolution of the image by the specified vertical decimation factor. + CV_CAP_PROP_XI_DECIMATION_PATTERN = 434, // Decimation pattern type. + CV_CAP_PROP_XI_TEST_PATTERN_GENERATOR_SELECTOR = 587, // Selects which test pattern generator is controlled by the TestPattern feature. + CV_CAP_PROP_XI_TEST_PATTERN = 588, // Selects which test pattern type is generated by the selected generator. + CV_CAP_PROP_XI_IMAGE_DATA_FORMAT = 435, // Output data format. + CV_CAP_PROP_XI_SHUTTER_TYPE = 436, // Change sensor shutter type(CMOS sensor). + CV_CAP_PROP_XI_SENSOR_TAPS = 437, // Number of taps + CV_CAP_PROP_XI_AEAG_ROI_OFFSET_X = 439, // Automatic exposure/gain ROI offset X + CV_CAP_PROP_XI_AEAG_ROI_OFFSET_Y = 440, // Automatic exposure/gain ROI offset Y + CV_CAP_PROP_XI_AEAG_ROI_WIDTH = 441, // Automatic exposure/gain ROI Width + CV_CAP_PROP_XI_AEAG_ROI_HEIGHT = 442, // Automatic exposure/gain ROI Height + CV_CAP_PROP_XI_BPC = 445, // Correction of bad pixels + CV_CAP_PROP_XI_WB_KR = 448, // White balance red coefficient + CV_CAP_PROP_XI_WB_KG = 449, // White balance green coefficient + CV_CAP_PROP_XI_WB_KB = 450, // White balance blue coefficient + CV_CAP_PROP_XI_WIDTH = 451, // Width of the Image provided by the device (in pixels). + CV_CAP_PROP_XI_HEIGHT = 452, // Height of the Image provided by the device (in pixels). + CV_CAP_PROP_XI_REGION_SELECTOR = 589, // Selects Region in Multiple ROI which parameters are set by width, height, ... ,region mode + CV_CAP_PROP_XI_REGION_MODE = 595, // Activates/deactivates Region selected by Region Selector + CV_CAP_PROP_XI_LIMIT_BANDWIDTH = 459, // Set/get bandwidth(datarate)(in Megabits) + CV_CAP_PROP_XI_SENSOR_DATA_BIT_DEPTH = 460, // Sensor output data bit depth. + CV_CAP_PROP_XI_OUTPUT_DATA_BIT_DEPTH = 461, // Device output data bit depth. + CV_CAP_PROP_XI_IMAGE_DATA_BIT_DEPTH = 462, // bitdepth of data returned by function xiGetImage + CV_CAP_PROP_XI_OUTPUT_DATA_PACKING = 463, // Device output data packing (or grouping) enabled. Packing could be enabled if output_data_bit_depth > 8 and packing capability is available. + CV_CAP_PROP_XI_OUTPUT_DATA_PACKING_TYPE = 464, // Data packing type. Some cameras supports only specific packing type. + CV_CAP_PROP_XI_IS_COOLED = 465, // Returns 1 for cameras that support cooling. + CV_CAP_PROP_XI_COOLING = 466, // Start camera cooling. + CV_CAP_PROP_XI_TARGET_TEMP = 467, // Set sensor target temperature for cooling. + CV_CAP_PROP_XI_CHIP_TEMP = 468, // Camera sensor temperature + CV_CAP_PROP_XI_HOUS_TEMP = 469, // Camera housing temperature + CV_CAP_PROP_XI_HOUS_BACK_SIDE_TEMP = 590, // Camera housing back side temperature + CV_CAP_PROP_XI_SENSOR_BOARD_TEMP = 596, // Camera sensor board temperature + CV_CAP_PROP_XI_CMS = 470, // Mode of color management system. + CV_CAP_PROP_XI_APPLY_CMS = 471, // Enable applying of CMS profiles to xiGetImage (see XI_PRM_INPUT_CMS_PROFILE, XI_PRM_OUTPUT_CMS_PROFILE). + CV_CAP_PROP_XI_IMAGE_IS_COLOR = 474, // Returns 1 for color cameras. + CV_CAP_PROP_XI_COLOR_FILTER_ARRAY = 475, // Returns color filter array type of RAW data. + CV_CAP_PROP_XI_GAMMAY = 476, // Luminosity gamma + CV_CAP_PROP_XI_GAMMAC = 477, // Chromaticity gamma + CV_CAP_PROP_XI_SHARPNESS = 478, // Sharpness Strength + CV_CAP_PROP_XI_CC_MATRIX_00 = 479, // Color Correction Matrix element [0][0] + CV_CAP_PROP_XI_CC_MATRIX_01 = 480, // Color Correction Matrix element [0][1] + CV_CAP_PROP_XI_CC_MATRIX_02 = 481, // Color Correction Matrix element [0][2] + CV_CAP_PROP_XI_CC_MATRIX_03 = 482, // Color Correction Matrix element [0][3] + CV_CAP_PROP_XI_CC_MATRIX_10 = 483, // Color Correction Matrix element [1][0] + CV_CAP_PROP_XI_CC_MATRIX_11 = 484, // Color Correction Matrix element [1][1] + CV_CAP_PROP_XI_CC_MATRIX_12 = 485, // Color Correction Matrix element [1][2] + CV_CAP_PROP_XI_CC_MATRIX_13 = 486, // Color Correction Matrix element [1][3] + CV_CAP_PROP_XI_CC_MATRIX_20 = 487, // Color Correction Matrix element [2][0] + CV_CAP_PROP_XI_CC_MATRIX_21 = 488, // Color Correction Matrix element [2][1] + CV_CAP_PROP_XI_CC_MATRIX_22 = 489, // Color Correction Matrix element [2][2] + CV_CAP_PROP_XI_CC_MATRIX_23 = 490, // Color Correction Matrix element [2][3] + CV_CAP_PROP_XI_CC_MATRIX_30 = 491, // Color Correction Matrix element [3][0] + CV_CAP_PROP_XI_CC_MATRIX_31 = 492, // Color Correction Matrix element [3][1] + CV_CAP_PROP_XI_CC_MATRIX_32 = 493, // Color Correction Matrix element [3][2] + CV_CAP_PROP_XI_CC_MATRIX_33 = 494, // Color Correction Matrix element [3][3] + CV_CAP_PROP_XI_DEFAULT_CC_MATRIX = 495, // Set default Color Correction Matrix + CV_CAP_PROP_XI_TRG_SELECTOR = 498, // Selects the type of trigger. + CV_CAP_PROP_XI_ACQ_FRAME_BURST_COUNT = 499, // Sets number of frames acquired by burst. This burst is used only if trigger is set to FrameBurstStart + CV_CAP_PROP_XI_DEBOUNCE_EN = 507, // Enable/Disable debounce to selected GPI + CV_CAP_PROP_XI_DEBOUNCE_T0 = 508, // Debounce time (x * 10us) + CV_CAP_PROP_XI_DEBOUNCE_T1 = 509, // Debounce time (x * 10us) + CV_CAP_PROP_XI_DEBOUNCE_POL = 510, // Debounce polarity (pol = 1 t0 - falling edge, t1 - rising edge) + CV_CAP_PROP_XI_LENS_MODE = 511, // Status of lens control interface. This shall be set to XI_ON before any Lens operations. + CV_CAP_PROP_XI_LENS_APERTURE_VALUE = 512, // Current lens aperture value in stops. Examples: 2.8, 4, 5.6, 8, 11 + CV_CAP_PROP_XI_LENS_FOCUS_MOVEMENT_VALUE = 513, // Lens current focus movement value to be used by XI_PRM_LENS_FOCUS_MOVE in motor steps. + CV_CAP_PROP_XI_LENS_FOCUS_MOVE = 514, // Moves lens focus motor by steps set in XI_PRM_LENS_FOCUS_MOVEMENT_VALUE. + CV_CAP_PROP_XI_LENS_FOCUS_DISTANCE = 515, // Lens focus distance in cm. + CV_CAP_PROP_XI_LENS_FOCAL_LENGTH = 516, // Lens focal distance in mm. + CV_CAP_PROP_XI_LENS_FEATURE_SELECTOR = 517, // Selects the current feature which is accessible by XI_PRM_LENS_FEATURE. + CV_CAP_PROP_XI_LENS_FEATURE = 518, // Allows access to lens feature value currently selected by XI_PRM_LENS_FEATURE_SELECTOR. + CV_CAP_PROP_XI_DEVICE_MODEL_ID = 521, // Return device model id + CV_CAP_PROP_XI_DEVICE_SN = 522, // Return device serial number + CV_CAP_PROP_XI_IMAGE_DATA_FORMAT_RGB32_ALPHA = 529, // The alpha channel of RGB32 output image format. + CV_CAP_PROP_XI_IMAGE_PAYLOAD_SIZE = 530, // Buffer size in bytes sufficient for output image returned by xiGetImage + CV_CAP_PROP_XI_TRANSPORT_PIXEL_FORMAT = 531, // Current format of pixels on transport layer. + CV_CAP_PROP_XI_SENSOR_CLOCK_FREQ_HZ = 532, // Sensor clock frequency in Hz. + CV_CAP_PROP_XI_SENSOR_CLOCK_FREQ_INDEX = 533, // Sensor clock frequency index. Sensor with selected frequencies have possibility to set the frequency only by this index. + CV_CAP_PROP_XI_SENSOR_OUTPUT_CHANNEL_COUNT = 534, // Number of output channels from sensor used for data transfer. + CV_CAP_PROP_XI_FRAMERATE = 535, // Define framerate in Hz + CV_CAP_PROP_XI_COUNTER_SELECTOR = 536, // Select counter + CV_CAP_PROP_XI_COUNTER_VALUE = 537, // Counter status + CV_CAP_PROP_XI_ACQ_TIMING_MODE = 538, // Type of sensor frames timing. + CV_CAP_PROP_XI_AVAILABLE_BANDWIDTH = 539, // Calculate and return available interface bandwidth(int Megabits) + CV_CAP_PROP_XI_BUFFER_POLICY = 540, // Data move policy + CV_CAP_PROP_XI_LUT_EN = 541, // Activates LUT. + CV_CAP_PROP_XI_LUT_INDEX = 542, // Control the index (offset) of the coefficient to access in the LUT. + CV_CAP_PROP_XI_LUT_VALUE = 543, // Value at entry LUTIndex of the LUT + CV_CAP_PROP_XI_TRG_DELAY = 544, // Specifies the delay in microseconds (us) to apply after the trigger reception before activating it. + CV_CAP_PROP_XI_TS_RST_MODE = 545, // Defines how time stamp reset engine will be armed + CV_CAP_PROP_XI_TS_RST_SOURCE = 546, // Defines which source will be used for timestamp reset. Writing this parameter will trigger settings of engine (arming) + CV_CAP_PROP_XI_IS_DEVICE_EXIST = 547, // Returns 1 if camera connected and works properly. + CV_CAP_PROP_XI_ACQ_BUFFER_SIZE = 548, // Acquisition buffer size in buffer_size_unit. Default bytes. + CV_CAP_PROP_XI_ACQ_BUFFER_SIZE_UNIT = 549, // Acquisition buffer size unit in bytes. Default 1. E.g. Value 1024 means that buffer_size is in KiBytes + CV_CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_SIZE = 550, // Acquisition transport buffer size in bytes + CV_CAP_PROP_XI_BUFFERS_QUEUE_SIZE = 551, // Queue of field/frame buffers + CV_CAP_PROP_XI_ACQ_TRANSPORT_BUFFER_COMMIT = 552, // Number of buffers to commit to low level + CV_CAP_PROP_XI_RECENT_FRAME = 553, // GetImage returns most recent frame + CV_CAP_PROP_XI_DEVICE_RESET = 554, // Resets the camera to default state. + CV_CAP_PROP_XI_COLUMN_FPN_CORRECTION = 555, // Correction of column FPN + CV_CAP_PROP_XI_ROW_FPN_CORRECTION = 591, // Correction of row FPN + CV_CAP_PROP_XI_SENSOR_MODE = 558, // Current sensor mode. Allows to select sensor mode by one integer. Setting of this parameter affects: image dimensions and downsampling. + CV_CAP_PROP_XI_HDR = 559, // Enable High Dynamic Range feature. + CV_CAP_PROP_XI_HDR_KNEEPOINT_COUNT = 560, // The number of kneepoints in the PWLR. + CV_CAP_PROP_XI_HDR_T1 = 561, // position of first kneepoint(in % of XI_PRM_EXPOSURE) + CV_CAP_PROP_XI_HDR_T2 = 562, // position of second kneepoint (in % of XI_PRM_EXPOSURE) + CV_CAP_PROP_XI_KNEEPOINT1 = 563, // value of first kneepoint (% of sensor saturation) + CV_CAP_PROP_XI_KNEEPOINT2 = 564, // value of second kneepoint (% of sensor saturation) + CV_CAP_PROP_XI_IMAGE_BLACK_LEVEL = 565, // Last image black level counts. Can be used for Offline processing to recall it. + CV_CAP_PROP_XI_HW_REVISION = 571, // Returns hardware revision number. + CV_CAP_PROP_XI_DEBUG_LEVEL = 572, // Set debug level + CV_CAP_PROP_XI_AUTO_BANDWIDTH_CALCULATION = 573, // Automatic bandwidth calculation, + CV_CAP_PROP_XI_FFS_FILE_ID = 594, // File number. + CV_CAP_PROP_XI_FFS_FILE_SIZE = 580, // Size of file. + CV_CAP_PROP_XI_FREE_FFS_SIZE = 581, // Size of free camera FFS. + CV_CAP_PROP_XI_USED_FFS_SIZE = 582, // Size of used camera FFS. + CV_CAP_PROP_XI_FFS_ACCESS_KEY = 583, // Setting of key enables file operations on some cameras. + CV_CAP_PROP_XI_SENSOR_FEATURE_SELECTOR = 585, // Selects the current feature which is accessible by XI_PRM_SENSOR_FEATURE_VALUE. + CV_CAP_PROP_XI_SENSOR_FEATURE_VALUE = 586, // Allows access to sensor feature value currently selected by XI_PRM_SENSOR_FEATURE_SELECTOR. + + + // Properties for Android cameras + CV_CAP_PROP_ANDROID_FLASH_MODE = 8001, + CV_CAP_PROP_ANDROID_FOCUS_MODE = 8002, + CV_CAP_PROP_ANDROID_WHITE_BALANCE = 8003, + CV_CAP_PROP_ANDROID_ANTIBANDING = 8004, + CV_CAP_PROP_ANDROID_FOCAL_LENGTH = 8005, + CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_NEAR = 8006, + CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_OPTIMAL = 8007, + CV_CAP_PROP_ANDROID_FOCUS_DISTANCE_FAR = 8008, + CV_CAP_PROP_ANDROID_EXPOSE_LOCK = 8009, + CV_CAP_PROP_ANDROID_WHITEBALANCE_LOCK = 8010, + + // Properties of cameras available through AVFOUNDATION interface + CV_CAP_PROP_IOS_DEVICE_FOCUS = 9001, + CV_CAP_PROP_IOS_DEVICE_EXPOSURE = 9002, + CV_CAP_PROP_IOS_DEVICE_FLASH = 9003, + CV_CAP_PROP_IOS_DEVICE_WHITEBALANCE = 9004, + CV_CAP_PROP_IOS_DEVICE_TORCH = 9005, + + // Properties of cameras available through Smartek Giganetix Ethernet Vision interface + /* --- Vladimir Litvinenko (litvinenko.vladimir@gmail.com) --- */ + CV_CAP_PROP_GIGA_FRAME_OFFSET_X = 10001, + CV_CAP_PROP_GIGA_FRAME_OFFSET_Y = 10002, + CV_CAP_PROP_GIGA_FRAME_WIDTH_MAX = 10003, + CV_CAP_PROP_GIGA_FRAME_HEIGH_MAX = 10004, + CV_CAP_PROP_GIGA_FRAME_SENS_WIDTH = 10005, + CV_CAP_PROP_GIGA_FRAME_SENS_HEIGH = 10006, + + CV_CAP_PROP_INTELPERC_PROFILE_COUNT = 11001, + CV_CAP_PROP_INTELPERC_PROFILE_IDX = 11002, + CV_CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE = 11003, + CV_CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE = 11004, + CV_CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD = 11005, + CV_CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ = 11006, + CV_CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT = 11007, + + // Intel PerC streams + CV_CAP_INTELPERC_DEPTH_GENERATOR = 1 << 29, + CV_CAP_INTELPERC_IMAGE_GENERATOR = 1 << 28, + CV_CAP_INTELPERC_GENERATORS_MASK = CV_CAP_INTELPERC_DEPTH_GENERATOR + CV_CAP_INTELPERC_IMAGE_GENERATOR +}; + +enum +{ + // Data given from depth generator. + CV_CAP_OPENNI_DEPTH_MAP = 0, // Depth values in mm (CV_16UC1) + CV_CAP_OPENNI_POINT_CLOUD_MAP = 1, // XYZ in meters (CV_32FC3) + CV_CAP_OPENNI_DISPARITY_MAP = 2, // Disparity in pixels (CV_8UC1) + CV_CAP_OPENNI_DISPARITY_MAP_32F = 3, // Disparity in pixels (CV_32FC1) + CV_CAP_OPENNI_VALID_DEPTH_MASK = 4, // CV_8UC1 + + // Data given from RGB image generator. + CV_CAP_OPENNI_BGR_IMAGE = 5, + CV_CAP_OPENNI_GRAY_IMAGE = 6, + + // Data given from IR image generator. + CV_CAP_OPENNI_IR_IMAGE = 7 +}; + +// Supported output modes of OpenNI image generator +enum +{ + CV_CAP_OPENNI_VGA_30HZ = 0, + CV_CAP_OPENNI_SXGA_15HZ = 1, + CV_CAP_OPENNI_SXGA_30HZ = 2, + CV_CAP_OPENNI_QVGA_30HZ = 3, + CV_CAP_OPENNI_QVGA_60HZ = 4 +}; + +enum +{ + CV_CAP_INTELPERC_DEPTH_MAP = 0, // Each pixel is a 16-bit integer. The value indicates the distance from an object to the camera's XY plane or the Cartesian depth. + CV_CAP_INTELPERC_UVDEPTH_MAP = 1, // Each pixel contains two 32-bit floating point values in the range of 0-1, representing the mapping of depth coordinates to the color coordinates. + CV_CAP_INTELPERC_IR_MAP = 2, // Each pixel is a 16-bit integer. The value indicates the intensity of the reflected laser beam. + CV_CAP_INTELPERC_IMAGE = 3 +}; + +// gPhoto2 properties, if propertyId is less than 0 then work on widget with that __additive inversed__ camera setting ID +// Get IDs by using CAP_PROP_GPHOTO2_WIDGET_ENUMERATE. +// @see CvCaptureCAM_GPHOTO2 for more info +enum +{ + CV_CAP_PROP_GPHOTO2_PREVIEW = 17001, // Capture only preview from liveview mode. + CV_CAP_PROP_GPHOTO2_WIDGET_ENUMERATE = 17002, // Readonly, returns (const char *). + CV_CAP_PROP_GPHOTO2_RELOAD_CONFIG = 17003, // Trigger, only by set. Reload camera settings. + CV_CAP_PROP_GPHOTO2_RELOAD_ON_CHANGE = 17004, // Reload all settings on set. + CV_CAP_PROP_GPHOTO2_COLLECT_MSGS = 17005, // Collect messages with details. + CV_CAP_PROP_GPHOTO2_FLUSH_MSGS = 17006, // Readonly, returns (const char *). + CV_CAP_PROP_SPEED = 17007, // Exposure speed. Can be readonly, depends on camera program. + CV_CAP_PROP_APERTURE = 17008, // Aperture. Can be readonly, depends on camera program. + CV_CAP_PROP_EXPOSUREPROGRAM = 17009, // Camera exposure program. + CV_CAP_PROP_VIEWFINDER = 17010 // Enter liveview mode. +}; + +//! Macro to construct the fourcc code of the codec. Same as CV_FOURCC() +#define CV_FOURCC_MACRO(c1, c2, c3, c4) (((c1) & 255) + (((c2) & 255) << 8) + (((c3) & 255) << 16) + (((c4) & 255) << 24)) + +/** @brief Constructs the fourcc code of the codec function + +Simply call it with 4 chars fourcc code like `CV_FOURCC('I', 'Y', 'U', 'V')` + +List of codes can be obtained at [Video Codecs by FOURCC](http://www.fourcc.org/codecs.php) page. +FFMPEG backend with MP4 container natively uses other values as fourcc code: +see [ObjectType](http://mp4ra.org/#/codecs). +*/ +CV_INLINE int CV_FOURCC(char c1, char c2, char c3, char c4) +{ + return CV_FOURCC_MACRO(c1, c2, c3, c4); +} + +//! (Windows only) Open Codec Selection Dialog +#define CV_FOURCC_PROMPT -1 +//! (Linux only) Use default codec for specified filename +#define CV_FOURCC_DEFAULT CV_FOURCC('I', 'Y', 'U', 'V') + +#endif // OPENCV_VIDEOIO_LEGACY_CONSTANTS_H diff --git a/Thirdparty/opencv2/include/opencv2/videoio/registry.hpp b/Thirdparty/opencv2/include/opencv2/videoio/registry.hpp new file mode 100644 index 0000000..cf72247 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio/registry.hpp @@ -0,0 +1,72 @@ +// This file is part of OpenCV project. +// It is subject to the license terms in the LICENSE file found in the top-level directory +// of this distribution and at http://opencv.org/license.html. + +#ifndef OPENCV_VIDEOIO_REGISTRY_HPP +#define OPENCV_VIDEOIO_REGISTRY_HPP + +#include + +namespace cv { namespace videoio_registry { +/** @addtogroup videoio_registry +This section contains API description how to query/configure available Video I/O backends. + +Runtime configuration options: +- enable debug mode: `OPENCV_VIDEOIO_DEBUG=1` +- change backend priority: `OPENCV_VIDEOIO_PRIORITY_=9999` +- disable backend: `OPENCV_VIDEOIO_PRIORITY_=0` +- specify list of backends with high priority (>100000): `OPENCV_VIDEOIO_PRIORITY_LIST=FFMPEG,GSTREAMER` + +@{ + */ + + +/** @brief Returns backend API name or "UnknownVideoAPI(xxx)" +@param api backend ID (#VideoCaptureAPIs) +*/ +CV_EXPORTS_W cv::String getBackendName(VideoCaptureAPIs api); + +/** @brief Returns list of all available backends */ +CV_EXPORTS_W std::vector getBackends(); + +/** @brief Returns list of available backends which works via `cv::VideoCapture(int index)` */ +CV_EXPORTS_W std::vector getCameraBackends(); + +/** @brief Returns list of available backends which works via `cv::VideoCapture(filename)` */ +CV_EXPORTS_W std::vector getStreamBackends(); + +/** @brief Returns list of available backends which works via `cv::VideoWriter()` */ +CV_EXPORTS_W std::vector getWriterBackends(); + +/** @brief Returns true if backend is available */ +CV_EXPORTS_W bool hasBackend(VideoCaptureAPIs api); + +/** @brief Returns true if backend is built in (false if backend is used as plugin) */ +CV_EXPORTS_W bool isBackendBuiltIn(VideoCaptureAPIs api); + +/** @brief Returns description and ABI/API version of videoio plugin's camera interface */ +CV_EXPORTS_W std::string getCameraBackendPluginVersion( + VideoCaptureAPIs api, + CV_OUT int& version_ABI, + CV_OUT int& version_API +); + +/** @brief Returns description and ABI/API version of videoio plugin's stream capture interface */ +CV_EXPORTS_W std::string getStreamBackendPluginVersion( + VideoCaptureAPIs api, + CV_OUT int& version_ABI, + CV_OUT int& version_API +); + +/** @brief Returns description and ABI/API version of videoio plugin's writer interface */ +CV_EXPORTS_W std::string getWriterBackendPluginVersion( + VideoCaptureAPIs api, + CV_OUT int& version_ABI, + CV_OUT int& version_API +); + + +//! @} +}} // namespace + +#endif // OPENCV_VIDEOIO_REGISTRY_HPP diff --git a/Thirdparty/opencv2/include/opencv2/videoio/videoio.hpp b/Thirdparty/opencv2/include/opencv2/videoio/videoio.hpp new file mode 100644 index 0000000..ec84cf7 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio/videoio.hpp @@ -0,0 +1,48 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifdef __OPENCV_BUILD +#error this is a compatibility header which should not be used inside the OpenCV library +#endif + +#include "opencv2/videoio.hpp" diff --git a/Thirdparty/opencv2/include/opencv2/videoio/videoio_c.h b/Thirdparty/opencv2/include/opencv2/videoio/videoio_c.h new file mode 100644 index 0000000..cf1a6d0 --- /dev/null +++ b/Thirdparty/opencv2/include/opencv2/videoio/videoio_c.h @@ -0,0 +1,153 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef OPENCV_VIDEOIO_H +#define OPENCV_VIDEOIO_H + +#include "opencv2/core/core_c.h" + +#include "opencv2/videoio/legacy/constants_c.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + @addtogroup videoio_c + @{ +*/ + +/****************************************************************************************\ +* Working with Video Files and Cameras * +\****************************************************************************************/ + +/** @brief "black box" capture structure + +In C++ use cv::VideoCapture +*/ +typedef struct CvCapture CvCapture; + +/** @brief start capturing frames from video file +*/ +CVAPI(CvCapture*) cvCreateFileCapture( const char* filename ); + +/** @brief start capturing frames from video file. allows specifying a preferred API to use +*/ +CVAPI(CvCapture*) cvCreateFileCaptureWithPreference( const char* filename , int apiPreference); + +/** @brief start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) +*/ +CVAPI(CvCapture*) cvCreateCameraCapture( int index ); + +/** @brief grab a frame, return 1 on success, 0 on fail. + + this function is thought to be fast +*/ +CVAPI(int) cvGrabFrame( CvCapture* capture ); + +/** @brief get the frame grabbed with cvGrabFrame(..) + + This function may apply some frame processing like + frame decompression, flipping etc. + @warning !!!DO NOT RELEASE or MODIFY the retrieved frame!!! +*/ +CVAPI(IplImage*) cvRetrieveFrame( CvCapture* capture, int streamIdx CV_DEFAULT(0) ); + +/** @brief Just a combination of cvGrabFrame and cvRetrieveFrame + + @warning !!!DO NOT RELEASE or MODIFY the retrieved frame!!! +*/ +CVAPI(IplImage*) cvQueryFrame( CvCapture* capture ); + +/** @brief stop capturing/reading and free resources +*/ +CVAPI(void) cvReleaseCapture( CvCapture** capture ); + +/** @brief retrieve capture properties +*/ +CVAPI(double) cvGetCaptureProperty( CvCapture* capture, int property_id ); +/** @brief set capture properties +*/ +CVAPI(int) cvSetCaptureProperty( CvCapture* capture, int property_id, double value ); + +/** @brief Return the type of the capturer (eg, ::CV_CAP_VFW, ::CV_CAP_UNICAP) + +It is unknown if created with ::CV_CAP_ANY +*/ +CVAPI(int) cvGetCaptureDomain( CvCapture* capture); + +/** @brief "black box" video file writer structure + +In C++ use cv::VideoWriter +*/ +typedef struct CvVideoWriter CvVideoWriter; + +/** @brief initialize video file writer +*/ +CVAPI(CvVideoWriter*) cvCreateVideoWriter( const char* filename, int fourcc, + double fps, CvSize frame_size, + int is_color CV_DEFAULT(1)); + +/** @brief write frame to video file +*/ +CVAPI(int) cvWriteFrame( CvVideoWriter* writer, const IplImage* image ); + +/** @brief close video file writer +*/ +CVAPI(void) cvReleaseVideoWriter( CvVideoWriter** writer ); + +// *************************************************************************************** +//! @name Obsolete functions/synonyms +//! @{ +#define cvCaptureFromCAM cvCreateCameraCapture //!< @deprecated use cvCreateCameraCapture() instead +#define cvCaptureFromFile cvCreateFileCapture //!< @deprecated use cvCreateFileCapture() instead +#define cvCaptureFromAVI cvCaptureFromFile //!< @deprecated use cvCreateFileCapture() instead +#define cvCreateAVIWriter cvCreateVideoWriter //!< @deprecated use cvCreateVideoWriter() instead +#define cvWriteToAVI cvWriteFrame //!< @deprecated use cvWriteFrame() instead +//! @} Obsolete... + +//! @} videoio_c + +#ifdef __cplusplus +} +#endif + +#endif //OPENCV_VIDEOIO_H diff --git a/Thirdparty/opencv2/lib/OpenCVConfig-version.cmake b/Thirdparty/opencv2/lib/OpenCVConfig-version.cmake new file mode 100644 index 0000000..f950a42 --- /dev/null +++ b/Thirdparty/opencv2/lib/OpenCVConfig-version.cmake @@ -0,0 +1,15 @@ +set(OpenCV_VERSION 4.8.0) +set(PACKAGE_VERSION ${OpenCV_VERSION}) + +set(PACKAGE_VERSION_EXACT False) +set(PACKAGE_VERSION_COMPATIBLE False) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT True) + set(PACKAGE_VERSION_COMPATIBLE True) +endif() + +if(PACKAGE_FIND_VERSION_MAJOR EQUAL 4 + AND PACKAGE_FIND_VERSION VERSION_LESS PACKAGE_VERSION) + set(PACKAGE_VERSION_COMPATIBLE True) +endif() diff --git a/Thirdparty/opencv2/lib/OpenCVConfig.cmake b/Thirdparty/opencv2/lib/OpenCVConfig.cmake new file mode 100644 index 0000000..67fcda1 --- /dev/null +++ b/Thirdparty/opencv2/lib/OpenCVConfig.cmake @@ -0,0 +1,355 @@ +# =================================================================================== +# The OpenCV CMake configuration file +# +# ** File generated automatically, do not modify ** +# +# Usage from an external project: +# In your CMakeLists.txt, add these lines: +# +# find_package(OpenCV REQUIRED) +# include_directories(${OpenCV_INCLUDE_DIRS}) # Not needed for CMake >= 2.8.11 +# target_link_libraries(MY_TARGET_NAME ${OpenCV_LIBS}) +# +# Or you can search for specific OpenCV modules: +# +# find_package(OpenCV REQUIRED core videoio) +# +# You can also mark OpenCV components as optional: + +# find_package(OpenCV REQUIRED core OPTIONAL_COMPONENTS viz) +# +# If the module is found then OPENCV__FOUND is set to TRUE. +# +# This file will define the following variables: +# - OpenCV_LIBS : The list of all imported targets for OpenCV modules. +# - OpenCV_INCLUDE_DIRS : The OpenCV include directories. +# - OpenCV_COMPUTE_CAPABILITIES : The version of compute capability. +# - OpenCV_ANDROID_NATIVE_API_LEVEL : Minimum required level of Android API. +# - OpenCV_VERSION : The version of this OpenCV build: "4.8.0" +# - OpenCV_VERSION_MAJOR : Major version part of OpenCV_VERSION: "4" +# - OpenCV_VERSION_MINOR : Minor version part of OpenCV_VERSION: "8" +# - OpenCV_VERSION_PATCH : Patch version part of OpenCV_VERSION: "0" +# - OpenCV_VERSION_STATUS : Development status of this build: "-dev" +# +# Advanced variables: +# - OpenCV_SHARED : Use OpenCV as shared library +# - OpenCV_INSTALL_PATH : OpenCV location +# - OpenCV_LIB_COMPONENTS : Present OpenCV modules list +# - OpenCV_USE_MANGLED_PATHS : Mangled OpenCV path flag +# +# Deprecated variables: +# - OpenCV_VERSION_TWEAK : Always "0" +# +# =================================================================================== + +# ====================================================== +# Version variables: +# ====================================================== +SET(OpenCV_VERSION 4.8.0) +SET(OpenCV_VERSION_MAJOR 4) +SET(OpenCV_VERSION_MINOR 8) +SET(OpenCV_VERSION_PATCH 0) +SET(OpenCV_VERSION_TWEAK 0) +SET(OpenCV_VERSION_STATUS "-dev") + +include(FindPackageHandleStandardArgs) + +if(NOT CMAKE_VERSION VERSION_LESS 2.8.8 + AND OpenCV_FIND_COMPONENTS # prevent excessive output +) + # HANDLE_COMPONENTS was introduced in CMake 2.8.8 + list(APPEND _OpenCV_FPHSA_ARGS HANDLE_COMPONENTS) + # The missing components will be handled by the FindPackageHandleStandardArgs + # module. + set(_OpenCV_HANDLE_COMPONENTS_MANUALLY FALSE) +else() + # The missing components will be handled by this config. + set(_OpenCV_HANDLE_COMPONENTS_MANUALLY TRUE) +endif() + +# Extract directory name from full path of the file currently being processed. +# Note that CMake 2.8.3 introduced CMAKE_CURRENT_LIST_DIR. We reimplement it +# for older versions of CMake to support these as well. +if(CMAKE_VERSION VERSION_LESS "2.8.3") + get_filename_component(CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +endif() + +# Extract the directory where *this* file has been installed (determined at cmake run-time) +# Get the absolute path with no ../.. relative marks, to eliminate implicit linker warnings +get_filename_component(OpenCV_CONFIG_PATH "${CMAKE_CURRENT_LIST_DIR}" REALPATH) +get_filename_component(OpenCV_INSTALL_PATH "${OpenCV_CONFIG_PATH}/../../../" REALPATH) + +# Search packages for host system instead of packages for target system. +# in case of cross compilation this macro should be defined by toolchain file +if(NOT COMMAND find_host_package) + macro(find_host_package) + find_package(${ARGN}) + endmacro() +endif() +if(NOT COMMAND find_host_program) + macro(find_host_program) + find_program(${ARGN}) + endmacro() +endif() + + + + + + + + +# Some additional settings are required if OpenCV is built as static libs +set(OpenCV_SHARED ON) + +# Enables mangled install paths, that help with side by side installs +set(OpenCV_USE_MANGLED_PATHS FALSE) + +set(OpenCV_LIB_COMPONENTS opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio) +set(__OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/include") + +set(OpenCV_INCLUDE_DIRS "") +foreach(d ${__OpenCV_INCLUDE_DIRS}) + get_filename_component(__d "${d}" REALPATH) + if(NOT EXISTS "${__d}") + if(NOT OpenCV_FIND_QUIETLY) + message(WARNING "OpenCV: Include directory doesn't exist: '${d}'. OpenCV installation may be broken. Skip...") + endif() + else() + list(APPEND OpenCV_INCLUDE_DIRS "${__d}") + endif() +endforeach() +unset(__d) + + +if(NOT TARGET opencv_core) + include(${CMAKE_CURRENT_LIST_DIR}/OpenCVModules${OpenCV_MODULES_SUFFIX}.cmake) +endif() + +if(NOT CMAKE_VERSION VERSION_LESS "2.8.11") + # Target property INTERFACE_INCLUDE_DIRECTORIES available since 2.8.11: + # * http://www.cmake.org/cmake/help/v2.8.11/cmake.html#prop_tgt:INTERFACE_INCLUDE_DIRECTORIES + foreach(__component ${OpenCV_LIB_COMPONENTS}) + if(TARGET ${__component}) + set_target_properties( + ${__component} + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OpenCV_INCLUDE_DIRS}" + ) + endif() + endforeach() +endif() + + +if(NOT DEFINED OPENCV_MAP_IMPORTED_CONFIG) + if(CMAKE_GENERATOR MATCHES "Visual Studio" OR MSVC) + # OpenCV supports Debug and Release builds only. + # But MSVS has 'RelWithDebInfo' 'MinSizeRel' configurations for applications. + # By default CMake maps these configuration on the first available (Debug) which is wrong. + # Non-Debug build of Application can't be used with OpenCV Debug build (ABI mismatch problem) + # Add mapping of RelWithDebInfo and MinSizeRel to Release here + set(OPENCV_MAP_IMPORTED_CONFIG "RELWITHDEBINFO=!Release;MINSIZEREL=!Release") + endif() +endif() +set(__remap_warnings "") +macro(ocv_map_imported_config target) + if(DEFINED OPENCV_MAP_IMPORTED_CONFIG) # list, "RELWITHDEBINFO=Release;MINSIZEREL=Release" + get_target_property(__available_configurations ${target} IMPORTED_CONFIGURATIONS) + foreach(remap ${OPENCV_MAP_IMPORTED_CONFIG}) + if(remap MATCHES "^(.+)=(!?)([^!]+)$") + set(__remap_config "${CMAKE_MATCH_1}") + set(__final_config "${CMAKE_MATCH_3}") + set(__force_flag "${CMAKE_MATCH_2}") + string(TOUPPER "${__final_config}" __final_config_upper) + string(TOUPPER "${__remap_config}" __remap_config_upper) + if(";${__available_configurations};" MATCHES ";${__remap_config_upper};" AND NOT "${__force_flag}" STREQUAL "!") + # configuration already exists, skip remap + set(__remap_warnings "${__remap_warnings}... Configuration already exists ${__remap_config} (skip mapping ${__remap_config} => ${__final_config}) (available configurations: ${__available_configurations})\n") + continue() + endif() + if(__available_configurations AND NOT ";${__available_configurations};" MATCHES ";${__final_config_upper};") + # skip, configuration is not available + if(NOT "${__force_flag}" STREQUAL "!") + set(__remap_warnings "${__remap_warnings}... Configuration is not available '${__final_config}' for ${target}, build may fail (available configurations: ${__available_configurations})\n") + endif() + endif() + set_target_properties(${target} PROPERTIES + MAP_IMPORTED_CONFIG_${__remap_config} "${__final_config}" + ) + else() + message(WARNING "Invalid entry of OPENCV_MAP_IMPORTED_CONFIG: '${remap}' (${OPENCV_MAP_IMPORTED_CONFIG})") + endif() + endforeach() + endif() +endmacro() + + +# ============================================================== +# Form list of modules (components) to find +# ============================================================== +if(NOT OpenCV_FIND_COMPONENTS) + set(OpenCV_FIND_COMPONENTS ${OpenCV_LIB_COMPONENTS}) + list(REMOVE_ITEM OpenCV_FIND_COMPONENTS opencv_java) + if(GTest_FOUND OR GTEST_FOUND) + list(REMOVE_ITEM OpenCV_FIND_COMPONENTS opencv_ts) + endif() +endif() + +set(OpenCV_WORLD_COMPONENTS ) + +# expand short module names and see if requested components exist +foreach(__cvcomponent ${OpenCV_FIND_COMPONENTS}) + # Store the name of the original component so we can set the + # OpenCV__FOUND variable which can be checked by the user. + set (__original_cvcomponent ${__cvcomponent}) + if(NOT __cvcomponent MATCHES "^opencv_") + set(__cvcomponent opencv_${__cvcomponent}) + endif() + list(FIND OpenCV_LIB_COMPONENTS ${__cvcomponent} __cvcomponentIdx) + if(__cvcomponentIdx LESS 0) + if(_OpenCV_HANDLE_COMPONENTS_MANUALLY) + # Either the component is required or the user did not set any components at + # all. In the latter case, the OpenCV_FIND_REQUIRED_ variable + # will not be defined since it is not set by this config. So let's assume + # the implicitly set components are always required. + if(NOT DEFINED OpenCV_FIND_REQUIRED_${__original_cvcomponent} OR + OpenCV_FIND_REQUIRED_${__original_cvcomponent}) + message(FATAL_ERROR "${__cvcomponent} is required but was not found") + elseif(NOT OpenCV_FIND_QUIETLY) + # The component was marked as optional using OPTIONAL_COMPONENTS + message(WARNING "Optional component ${__cvcomponent} was not found") + endif() + endif(_OpenCV_HANDLE_COMPONENTS_MANUALLY) + #indicate that module is NOT found + string(TOUPPER "${__cvcomponent}" __cvcomponentUP) + set(${__cvcomponentUP}_FOUND "${__cvcomponentUP}_FOUND-NOTFOUND") + set(OpenCV_${__original_cvcomponent}_FOUND FALSE) + else() + # Not using list(APPEND) here, because OpenCV_LIBS may not exist yet. + # Also not clearing OpenCV_LIBS anywhere, so that multiple calls + # to find_package(OpenCV) with different component lists add up. + set(OpenCV_LIBS ${OpenCV_LIBS} "${__cvcomponent}") + #indicate that module is found + string(TOUPPER "${__cvcomponent}" __cvcomponentUP) + set(${__cvcomponentUP}_FOUND 1) + set(OpenCV_${__original_cvcomponent}_FOUND TRUE) + endif() + if(OpenCV_SHARED AND ";${OpenCV_WORLD_COMPONENTS};" MATCHES ";${__cvcomponent};" AND NOT TARGET ${__cvcomponent}) + get_target_property(__implib_dbg opencv_world IMPORTED_IMPLIB_DEBUG) + get_target_property(__implib_release opencv_world IMPORTED_IMPLIB_RELEASE) + get_target_property(__location_dbg opencv_world IMPORTED_LOCATION_DEBUG) + get_target_property(__location_release opencv_world IMPORTED_LOCATION_RELEASE) + get_target_property(__include_dir opencv_world INTERFACE_INCLUDE_DIRECTORIES) + add_library(${__cvcomponent} SHARED IMPORTED) + set_target_properties(${__cvcomponent} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${__include_dir}") + if(__location_dbg) + set_property(TARGET ${__cvcomponent} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(${__cvcomponent} PROPERTIES + IMPORTED_IMPLIB_DEBUG "${__implib_dbg}" + IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "" + IMPORTED_LOCATION_DEBUG "${__location_dbg}" + ) + endif() + if(__location_release) + set_property(TARGET ${__cvcomponent} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(${__cvcomponent} PROPERTIES + IMPORTED_IMPLIB_RELEASE "${__implib_release}" + IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "" + IMPORTED_LOCATION_RELEASE "${__location_release}" + ) + endif() + endif() + if(TARGET ${__cvcomponent}) + ocv_map_imported_config(${__cvcomponent}) + endif() +endforeach() + +if(__remap_warnings AND NOT OpenCV_FIND_QUIETLY) + message("OpenCV: configurations remap warnings:\n${__remap_warnings}OpenCV: Check variable OPENCV_MAP_IMPORTED_CONFIG=${OPENCV_MAP_IMPORTED_CONFIG}") +endif() + +# ============================================================== +# Compatibility stuff +# ============================================================== +set(OpenCV_LIBRARIES ${OpenCV_LIBS}) + +# Require C++11 features for OpenCV modules +if(CMAKE_VERSION VERSION_LESS "3.1") + if(NOT OpenCV_FIND_QUIETLY AND NOT OPENCV_HIDE_WARNING_COMPILE_FEATURES) + message(STATUS "OpenCV: CMake version is low (${CMAKE_VERSION}, required 3.1+). Can't enable C++11 features: https://github.com/opencv/opencv/issues/13000") + endif() +else() + set(__target opencv_core) + if(TARGET opencv_world) + set(__target opencv_world) + endif() + set(__compile_features cxx_std_11) # CMake 3.8+ + if(DEFINED OPENCV_COMPILE_FEATURES) + set(__compile_features ${OPENCV_COMPILE_FEATURES}) # custom override + elseif(CMAKE_VERSION VERSION_LESS "3.8") + set(__compile_features cxx_auto_type cxx_rvalue_references cxx_lambdas) + endif() + if(__compile_features) + # Simulate exported result of target_compile_features(opencv_core PUBLIC ...) + set_target_properties(${__target} PROPERTIES + INTERFACE_COMPILE_FEATURES "${__compile_features}" + ) + endif() + unset(__target) + unset(__compile_features) +endif() + +# +# Some macros for samples +# +macro(ocv_check_dependencies) + set(OCV_DEPENDENCIES_FOUND TRUE) + foreach(d ${ARGN}) + if(NOT TARGET ${d}) + message(WARNING "OpenCV: Can't resolve dependency: ${d}") + set(OCV_DEPENDENCIES_FOUND FALSE) + break() + endif() + endforeach() +endmacro() + +# adds include directories in such way that directories from the OpenCV source tree go first +function(ocv_include_directories) + set(__add_before "") + file(TO_CMAKE_PATH "${OpenCV_INSTALL_PATH}" __baseDir) + foreach(dir ${ARGN}) + get_filename_component(__abs_dir "${dir}" ABSOLUTE) + if("${__abs_dir}" MATCHES "^${__baseDir}") + list(APPEND __add_before "${dir}") + else() + include_directories(AFTER SYSTEM "${dir}") + endif() + endforeach() + include_directories(BEFORE ${__add_before}) +endfunction() + +macro(ocv_include_modules) + include_directories(BEFORE "${OpenCV_INCLUDE_DIRS}") +endmacro() + +macro(ocv_include_modules_recurse) + include_directories(BEFORE "${OpenCV_INCLUDE_DIRS}") +endmacro() + +macro(ocv_target_link_libraries) + target_link_libraries(${ARGN}) +endmacro() + +# remove all matching elements from the list +macro(ocv_list_filterout lst regex) + foreach(item ${${lst}}) + if(item MATCHES "${regex}") + list(REMOVE_ITEM ${lst} "${item}") + endif() + endforeach() +endmacro() + +# We do not actually need REQUIRED_VARS to be checked for. Just use the +# installation directory for the status. +find_package_handle_standard_args(OpenCV REQUIRED_VARS OpenCV_INSTALL_PATH + VERSION_VAR OpenCV_VERSION ${_OpenCV_FPHSA_ARGS}) diff --git a/Thirdparty/opencv2/lib/OpenCVModules-debug.cmake b/Thirdparty/opencv2/lib/OpenCVModules-debug.cmake new file mode 100644 index 0000000..c9dde7b --- /dev/null +++ b/Thirdparty/opencv2/lib/OpenCVModules-debug.cmake @@ -0,0 +1,149 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Debug". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "opencv_core" for configuration "Debug" +set_property(TARGET opencv_core APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_core PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_core480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_core480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_core ) +list(APPEND _cmake_import_check_files_for_opencv_core "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_core480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_core480d.dll" ) + +# Import target "opencv_flann" for configuration "Debug" +set_property(TARGET opencv_flann APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_flann PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_flann480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_flann480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_flann ) +list(APPEND _cmake_import_check_files_for_opencv_flann "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_flann480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_flann480d.dll" ) + +# Import target "opencv_imgproc" for configuration "Debug" +set_property(TARGET opencv_imgproc APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_imgproc PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_imgproc480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_imgproc480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_imgproc ) +list(APPEND _cmake_import_check_files_for_opencv_imgproc "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_imgproc480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_imgproc480d.dll" ) + +# Import target "opencv_ml" for configuration "Debug" +set_property(TARGET opencv_ml APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_ml PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_ml480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_ml480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_ml ) +list(APPEND _cmake_import_check_files_for_opencv_ml "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_ml480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_ml480d.dll" ) + +# Import target "opencv_photo" for configuration "Debug" +set_property(TARGET opencv_photo APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_photo PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_photo480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_photo480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_photo ) +list(APPEND _cmake_import_check_files_for_opencv_photo "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_photo480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_photo480d.dll" ) + +# Import target "opencv_dnn" for configuration "Debug" +set_property(TARGET opencv_dnn APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_dnn PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_dnn480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_dnn480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_dnn ) +list(APPEND _cmake_import_check_files_for_opencv_dnn "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_dnn480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_dnn480d.dll" ) + +# Import target "opencv_features2d" for configuration "Debug" +set_property(TARGET opencv_features2d APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_features2d PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_features2d480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_features2d480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_features2d ) +list(APPEND _cmake_import_check_files_for_opencv_features2d "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_features2d480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_features2d480d.dll" ) + +# Import target "opencv_imgcodecs" for configuration "Debug" +set_property(TARGET opencv_imgcodecs APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_imgcodecs PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_imgcodecs480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_imgcodecs480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_imgcodecs ) +list(APPEND _cmake_import_check_files_for_opencv_imgcodecs "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_imgcodecs480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_imgcodecs480d.dll" ) + +# Import target "opencv_videoio" for configuration "Debug" +set_property(TARGET opencv_videoio APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_videoio PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_videoio480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_videoio480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_videoio ) +list(APPEND _cmake_import_check_files_for_opencv_videoio "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_videoio480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_videoio480d.dll" ) + +# Import target "opencv_calib3d" for configuration "Debug" +set_property(TARGET opencv_calib3d APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_calib3d PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_calib3d480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_calib3d480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_calib3d ) +list(APPEND _cmake_import_check_files_for_opencv_calib3d "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_calib3d480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_calib3d480d.dll" ) + +# Import target "opencv_highgui" for configuration "Debug" +set_property(TARGET opencv_highgui APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_highgui PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_highgui480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_highgui480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_highgui ) +list(APPEND _cmake_import_check_files_for_opencv_highgui "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_highgui480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_highgui480d.dll" ) + +# Import target "opencv_objdetect" for configuration "Debug" +set_property(TARGET opencv_objdetect APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_objdetect PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_objdetect480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_objdetect480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_objdetect ) +list(APPEND _cmake_import_check_files_for_opencv_objdetect "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_objdetect480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_objdetect480d.dll" ) + +# Import target "opencv_stitching" for configuration "Debug" +set_property(TARGET opencv_stitching APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_stitching PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_stitching480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_stitching480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_stitching ) +list(APPEND _cmake_import_check_files_for_opencv_stitching "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_stitching480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_stitching480d.dll" ) + +# Import target "opencv_video" for configuration "Debug" +set_property(TARGET opencv_video APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) +set_target_properties(opencv_video PROPERTIES + IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_video480d.lib" + IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_video480d.dll" + ) + +list(APPEND _cmake_import_check_targets opencv_video ) +list(APPEND _cmake_import_check_files_for_opencv_video "${_IMPORT_PREFIX}/x64/vc17/lib/opencv_video480d.lib" "${_IMPORT_PREFIX}/x64/vc17/bin/opencv_video480d.dll" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/Thirdparty/opencv2/lib/OpenCVModules.cmake b/Thirdparty/opencv2/lib/OpenCVModules.cmake new file mode 100644 index 0000000..bf1dfae --- /dev/null +++ b/Thirdparty/opencv2/lib/OpenCVModules.cmake @@ -0,0 +1,193 @@ +# Generated by CMake + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8) + message(FATAL_ERROR "CMake >= 2.8.0 required") +endif() +if(CMAKE_VERSION VERSION_LESS "2.8.3") + message(FATAL_ERROR "CMake >= 2.8.3 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.8.3...3.22) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_cmake_targets_defined "") +set(_cmake_targets_not_defined "") +set(_cmake_expected_targets "") +foreach(_cmake_expected_target IN ITEMS opencv_core opencv_flann opencv_imgproc opencv_ml opencv_photo opencv_dnn opencv_features2d opencv_imgcodecs opencv_videoio opencv_calib3d opencv_highgui opencv_objdetect opencv_stitching opencv_video) + list(APPEND _cmake_expected_targets "${_cmake_expected_target}") + if(TARGET "${_cmake_expected_target}") + list(APPEND _cmake_targets_defined "${_cmake_expected_target}") + else() + list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}") + endif() +endforeach() +unset(_cmake_expected_target) +if(_cmake_targets_defined STREQUAL _cmake_expected_targets) + unset(_cmake_targets_defined) + unset(_cmake_targets_not_defined) + unset(_cmake_expected_targets) + unset(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT _cmake_targets_defined STREQUAL "") + string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}") + string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n") +endif() +unset(_cmake_targets_defined) +unset(_cmake_targets_not_defined) +unset(_cmake_expected_targets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +if(_IMPORT_PREFIX STREQUAL "/") + set(_IMPORT_PREFIX "") +endif() + +# Create imported target opencv_core +add_library(opencv_core SHARED IMPORTED) + +# Create imported target opencv_flann +add_library(opencv_flann SHARED IMPORTED) + +set_target_properties(opencv_flann PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_core" +) + +# Create imported target opencv_imgproc +add_library(opencv_imgproc SHARED IMPORTED) + +set_target_properties(opencv_imgproc PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_core" +) + +# Create imported target opencv_ml +add_library(opencv_ml SHARED IMPORTED) + +set_target_properties(opencv_ml PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_core" +) + +# Create imported target opencv_photo +add_library(opencv_photo SHARED IMPORTED) + +set_target_properties(opencv_photo PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_imgproc;opencv_core;opencv_imgproc" +) + +# Create imported target opencv_dnn +add_library(opencv_dnn SHARED IMPORTED) + +set_target_properties(opencv_dnn PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_imgproc;opencv_core;opencv_imgproc" +) + +# Create imported target opencv_features2d +add_library(opencv_features2d SHARED IMPORTED) + +set_target_properties(opencv_features2d PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_flann;opencv_imgproc;opencv_core;opencv_flann;opencv_imgproc" +) + +# Create imported target opencv_imgcodecs +add_library(opencv_imgcodecs SHARED IMPORTED) + +set_target_properties(opencv_imgcodecs PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_imgproc;opencv_core;opencv_imgproc" +) + +# Create imported target opencv_videoio +add_library(opencv_videoio SHARED IMPORTED) + +set_target_properties(opencv_videoio PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_imgproc;opencv_imgcodecs;opencv_core;opencv_imgproc;opencv_imgcodecs" +) + +# Create imported target opencv_calib3d +add_library(opencv_calib3d SHARED IMPORTED) + +set_target_properties(opencv_calib3d PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_flann;opencv_imgproc;opencv_features2d;opencv_core;opencv_flann;opencv_imgproc;opencv_features2d" +) + +# Create imported target opencv_highgui +add_library(opencv_highgui SHARED IMPORTED) + +set_target_properties(opencv_highgui PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_imgproc;opencv_imgcodecs;opencv_videoio;opencv_core;opencv_imgproc;opencv_imgcodecs;opencv_videoio" +) + +# Create imported target opencv_objdetect +add_library(opencv_objdetect SHARED IMPORTED) + +set_target_properties(opencv_objdetect PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_flann;opencv_imgproc;opencv_dnn;opencv_features2d;opencv_calib3d;opencv_core;opencv_flann;opencv_imgproc;opencv_dnn;opencv_features2d;opencv_calib3d" +) + +# Create imported target opencv_stitching +add_library(opencv_stitching SHARED IMPORTED) + +set_target_properties(opencv_stitching PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_flann;opencv_imgproc;opencv_features2d;opencv_calib3d;opencv_core;opencv_flann;opencv_imgproc;opencv_features2d;opencv_calib3d" +) + +# Create imported target opencv_video +add_library(opencv_video SHARED IMPORTED) + +set_target_properties(opencv_video PROPERTIES + INTERFACE_LINK_LIBRARIES "opencv_core;opencv_flann;opencv_imgproc;opencv_dnn;opencv_features2d;opencv_calib3d;opencv_core;opencv_flann;opencv_imgproc;opencv_dnn;opencv_features2d;opencv_calib3d" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/OpenCVModules-*.cmake") +foreach(_cmake_config_file IN LISTS _cmake_config_files) + include("${_cmake_config_file}") +endforeach() +unset(_cmake_config_file) +unset(_cmake_config_files) + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(_cmake_target IN LISTS _cmake_import_check_targets) + foreach(_cmake_file IN LISTS "_cmake_import_check_files_for_${_cmake_target}") + if(NOT EXISTS "${_cmake_file}") + message(FATAL_ERROR "The imported target \"${_cmake_target}\" references the file + \"${_cmake_file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_cmake_file) + unset("_cmake_import_check_files_for_${_cmake_target}") +endforeach() +unset(_cmake_target) +unset(_cmake_import_check_targets) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/Thirdparty/opencv2/lib/opencv_calib3d480d.lib b/Thirdparty/opencv2/lib/opencv_calib3d480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..32e010be8eaac8e91b9c583930d1b292e2dacb90 GIT binary patch literal 303418 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

    &daKqYB;ICzh6X7IB7sM3p3M2_JvR2 z#qnZsOZ_079Sx0LEw@bx-^z(!$HDx2!^si}cLX_^_~ z=;-qP)vE@FN4tB5x(1i89$qzwFL_JV@!3({t1l@oJ*ce+vVk=#SB7bkfFn0Yab3B3 z$&hjet%-(}5oV#>3cVCeBz$J=ok9jhdRm=AJ*A>J>b@a^{zw*`8IcT%HOlwfY@wFd z;D8_1_lHKR*vpKxvQ3v68Hj_I8EMIs%Z&6+RWCD2AVqeYdWVr-L4Zb6OaTf-f&00> z^6jhSdEQBQ(d>QX879|C_y4A~*L^LQ(NnjL$P8|afWymNtyZS{E5Gkuu4#I=SF+yO2A&)nl z9+|9&E;YvM>f2L0t~!amk9^rrlIR}&sd&n8|B|kT znMmafh3{z6Ns790NgqLx92!?e(#r-1J9w`~DPGc0DMA7xE2-wIVvKh;8FFo=*X22M z*OS)wVJamnPO=m?5vn9AMM&&TQI2J5vxObh{N+;4cvk~^lkdg3_Od9wBlV=3jOhs# zt$}-<{2HsRU&foKbY){Ejs%ktN$|>cA~hWH)pmx0(Pjm8dfGRImOF2Aq0zWzS|G{9jO$yXPL=W z*P^AFZ$b@mGm4v=QGkSRMU7B;8=VbMa7+&%hp*sdfkPL39lYw`l7Yw zfZ>bg@Xp8pR9R{0f#$UD^AFXCPIGF*yXj@iP&o850FKSldPy&9 zCj3lMq>ZK6_8EZ0mpv1H$==fbF|IP2_)B~<+h@`%rwKn~YiR#eYduT8h}jTp%{H@r zhONCOM8h@WJ|U{iCQxU>=9Ih&8?y-5>ST1MTnnNf?m72qaF7-bC?26SK-K$r475~Q zx*A3;@b;K%Y8rjf#AN*J4EORLi;yjHMibAqAc)6X?_?P?l!bJ+t++7<3X@WZd|0Gm z;^@1ga5(kALSc`*IBmu~;5C^RN@prke(6bj$n{0k+)|mynTJS?ac-)bi|p{LckYxh zS~ixJX8YiZanS?LHzAnEH{ia`RPqvhoNYmUJN>!yEe=@!Sn`b!C)KLvfWZP4RSKf< z`XWfspkB){$A=UshjM$ATst-AaKJslqynpjz+j;`;_?dl`Lrtwrn2C4g&A02Zw(8( zm6#h$3y#SKAp2_^7Bz%Q&!wmi2+e3)Gl~bcM)sb7sk~Fvp*ve!VV|~^_KwZ8k8VWr z4TW9u&A9&3Yo-b2n5`Mn7w6zM=R%2kFWxk^=te9gd$0|sCDWp8G&xK+>6oluCJ?rd znxu0bF?~X6^}|f;u5YnjIBOXb74VVsJ$Qc&RCb%DcWU(;g$=D?Eh-)!F^P85pR&1j z*;&}3u0fjBWr6R~_|@00%mZn@FY{+VJFCMh3KkE+WuVs7(*K|F6-h9yK&=-Oj5kHK zs0~xDB)-9pC2yuld<3uR!KJ>SDlZ-W3XXAyUseaLLvO=P@_f8WF3Uap+;oo4VP+_s z(Atn}PCQf(0>0oZB^~O}6mPyq^Jm|>bP-Pp@NPmX@hMkPmH3uOU?n~w6kE^VKubFl zYP&-KIz^aSicP7_tS}eU`X$T-+}cVhED6T@C(KN#yfi&10cT%@S)hqMBH;9~$9FLJ z(f8@op}spfb2`*lhbN6hZ{qnP@ev2TFYy(pSt9WnLfcEcP0bC@ud^C2(}KeGm3cvN zQmhi}@k3AwYJCwDQjj;ub^FpMwcA#Nt};o9GDuhhv=2fnr&`XxePCdSSF zO>s`1_j`>@gHR<@M`+rP}Yb}QGI3#PF3D+&}K8-@~UJQ5zkKwXYT zltc22ATS^~)MHCCcEHvltfcu|NC4GBcorQXgZgZrFwWiV4?LW^v2wtjad8g>=R~$1 zT@#X}seAJb#r7r98AhNg)TV?z4va&MUrxLP=N5KQtOH)~6o%Y%zzdp~u5J5so6njZ z29NGC`zsw-qq)p~_IqHar-|t-&sx{<3;;JiaLs}`f1q31-Sc^NbHMe>#|Zma0+NV%{~EN5yhdy8pD zevxcR@K1cfM8m6H{7Z{7$TQy(S#1_P!3R8CA^`w+R-}@bc4(C6lzrcrqx$BaAKzVqN>J6$Fwk8xk(=F2n)t0yn z;y?$vcVK!TSqn+OW3hrzQVDw>K`5rv97Nqw`;OpQZEwym4up`Be5oyi9&5I zXbWFW*WC105+n{9=9o(b=ljoden;zse}lTYp-D9@nGzdN<1>aZrFZNxAHHE`3h_8! z%W!6x>%Q1{o#vg(a>fVs71=`sCo&AG^Zm&R;_zC%+{NIkqFbb659JQs-S|VaBT##|IiQWP zP63Q|8XR}0tMLJ?d;WFS2kRtEL_2~S^m3E867)|CUcrLZ;!tsT*TKrv9qS(6htAdS zFoAJ-?tT>7mhkW%MXOc>sTgkWwg)4at2q{mrW;6zG1oGw)q*ZY083tl_b=$=^6w97 z4TX!tkP{287lk8j{BGHS%kJ+{++}ZTI0+Zgj^G}&sw=Aw^zNP8lbxtS{pZl0`Z^>S zwC>nBqNQ3=UnDM;IDS{$p7^?Xl;Ng_sD{+{m@6PoDA|J&y&d&6$LTB_GUr*0uTgy& zHzQ984 zl|*wPrul>XpPuHt(+kx1p^zA)+-8#cIElXf)`fTiz-dK;g4^G)k_ttl$siSyEXk`?pz_iP*>%h9EuCQ;QG-$7s#1y82D~q(UL7^pYKAEw-?SIV z+p(!mtwAh@K>LEXQ&i(ShKTowp(;5`OF|?NA(Jtv463xGr>Bt-o-`~=qz(;6{+P&tK(j}02|Ba9P3ue@YFwT3M}zmR>6 zeNZfV&{y=JpXdPxjqRgU^hTNJ0T!$?=qMsxU~t)ng^tICV(DVOR!n{kYK?$SX7AV1 z?ewLG{hpxX{Cwh@!nVYBO*@Gqi~PFzhRw1fpokmWvGf(L1gW5>6#aww*?u?0Cfe2-`={H`db$>HtcR5NK(JVs) z&PYdZmqI#LB#l@uHiUkr<@!u}<{10Ix3vXsh&f3#wRpkvhz!+8>)0W@!nvgx6~Q-4 zk0juqnrGNz`j{pnx*VpGC_6DKmB|exa#ocGI9=`8pt*yuIsn<{Xa zVezW`n(nIW47UljR=U}8C_S6cBzh^0MN+}^PjFb&;np?-=67<{uB|WU233b5^W6dQ z1~_%I2OH@%JaV;~*ZQ0&$7MGP=@%;^BNTAma{V)mL=?bF0o4|VD^iI{r~y1M7HxNe zfS*%Gmp#7I-&OsS9eG)Ou|qvq4l05|!ObnXBXZR}tV*~!cvvb30XsWB^){>zFb}h5 z2C&YM&TUE7u%0;M)$+Ky7j+n3hPUY-kYO$PZpV9%hZB*eR+w$t4E0bPj$o)>idg5S z?0B;jneTR(A_xRvD#RKEa;(*+9!h1zY~^58caq&Bq!x(R$)aCWeFNr;yr+tN8|Hqb z9tw0QX+_n%6;4Fiv3whv|KILo$8vn?gy4idCzwl>C)BAjaTSJ|l>}G0*==6&RhX@r z$o3ABVTS}iifVEG#Hi931se)eN2D>Ta-cqAJPaUYsb)q`&*EzzJ||w~rjOyz1)3L* zm4ss9;&!9ht0xs>)V)oUrNH1k{bPmte1f|!X7OTTuqxyA@zmgWA{zD)L;zseKI{z; z!VN*h^oZI}R8s45B80i0^UHH!ZlN`!Ze_Ft&^ZhfhQd`4G#=3ALiKKx%QhyN@!V8j zj;$E0Ppi6Zenx2+Ryb5iChOy&gj}spjwTj4d=f&1u#P(LRZA=&+OO4sf7VN7QLxaM zifxKW`Q@T!=@x zq0_$0(f|#(QK4FB9(Gm)v{tCEwP)G0X)iMT& zNL!$lhksa}s#}ztp!-EqRZk(`aJglZ8*u^sAi*G@VA^Bpty=C8dlG_Q06X0Vq%fXH zD9M&MD9Dyb6hhaf46zcj=sDX-tPM6)>dZ;@O~jkktrGJ^QZdiL$?KK2qO@a%lA)L^W}HoJfr4|GIPs;L zxb{T|5cwT(Pt7fOWkeNh3IFU->#Ciy&T!Dg(_lJdI#<;<3x?DqRD+E(qCW zy2F6g?I0r7QfW|Kt_;^4qcA>Tb3mqynpjv{1hMQ&q_MpttDq{MtUs3!SSWlLAcg^A zd16V>JK#t%#mBFahNaxp%7zgE1~$VLss-c20i)h(+!%?%nY3jXYDYN*?X{6)q&})t zDvd3eZ_OCheQ^siM~PamRW0B^igsi*FE1(Qz7`AT;UzT95CNA|i)naz@j0=nk9*GE23=Sf!l>Bob3SawE-Z0ZgSRR(%w>v5qp z>|+-t+SzoP24OpCQd0SCP1TWRr7RMSMuO>AO$+iF*SFQU3Zkdnnij@eG1CCiuI>uU zLjm6`QW`_8(NvnH-H}n`EFX4<1ikdFs3M^7)Io4xQ!?lr_F(Li8MhgHy%ZEuka9=B zUadxbh{+W=vejP+--OE>5SXUGNP$BsRn-tlCgX`@SwS$VG^wgeP5o#FuvM?!HZEJAlNkYPgNUFVZV5y~CSoYTDU^#hqzdIDFv3YmdM=)?S zJzSuqq^7W~n$0J`SsLm)?vh)IkqJXI4f7BRx3a5@gz#$SXfRI zBaDh&-C$eI>@~6HbZ-rw@1lP6-Ydhkj(6FClM)-j;9Rj=DG>2z8FonU;7C}>k2OUV zJT9}SEt4O^5_@;Z-@$n%PpjKozzPS|!azvomlZ*v3m#r^s|4#+jwJKJb=IZ?UGwPk zUiU~6m)J zOB_;AgoFH*2QBK!vM3@+?`t5>2zYNFNP)LUbchG#wGlYBbY}wi+?uuXUL?@4ZFmx_ zHVy->KI+J5;fwpgA$9c$a!UYBMTh$sR?wb;iD=x4$|)%@0^6HIiDBAgbXvw>ZDCCd z>m}jwGw}wNe3I$}Gba{7hMhJkg=|xSpp%$@gqSiS6%^d*j?tO=(5h7P@xfU+n>>#9<$FxaVSqjBKt*pSno%PM+4RbwuJI~~rl}$7%@B;( zO%1p|vmNe%mSoP4A#O40awH&V0+h0b6y1thTDg-02mlNcNh;J6MAKbW0xO@T{#vx) z5IrzKZiTmdEK#PIMUDS>2i9_%(5g`n+1cfcIOE9Mty<4 zWzO6T+Xs)N#T^JWjDzW10U=zvmehQVvgIg1e*aMmF>Hf$|KvF`{`d&Vh(_;Aq+?BWN|v}Q#2 zE*~b|V84t9A<1|QTpJ)qu;F6F#@WyXQDS5%sVKvW*^nK|df~X8gs?N_mR;J#67{KN zq#!D_1v46gCa9UMF@-qEHl-rBLQ?fn@)ThERzDjvKI`q2TQEBUoSbTaV-;%ZiAaMV zxa-OX=c%PED`FMqMW<{?2V!1KGdcwsgDi@ApZiQySvkeBj`X1p2c`T4>IT}2;gegb^1=rnhCyQIS4 zgk5Zsl@JygJK0g*4FEiIJZMWCJXJee?sjuL(}ohQ!;%1dxTFn@-Zy0QFfP8!-3(2$ zPALh_VKrt7?pHb*h$#rh2LDt<39CjG{-5wZ1-A9j3bI4TnpzcSX&pGn*@Jm1yR(c z{2v z0k?mloK-%pEn&PvnRW_`)-d?CAQ-X@XB6J&MQ17|kTK0@?alnC?Fd)=vi2E93&9Vjt6Vt~zWk3%t{hPFD@)W{9z^~w&{mDdayP*+`2Q{KO>D8D*C>#&P2K7;#nQGolW z`HyVY8IbIu8CaAO5#a|6zalZ!jx+wBD|V{&Utz z@R!4&KcgM~9?UvpbQk#Vsac2OKeJAtiT!QXu}2>ak7uflva*iMIyih zhS#zXbC)cG6Tz%3m5QOpFDlJipL&}-Yy&T4nQgjTzu@l|;Q#4=@atJwMf$(+KV9Ix zEI2+ZEvpzr{RZb5>lu@d>WL3ReJz>0x z7;$H1QBoDw9-05oNL8-!BTCi3jeqF>MXAcPw0If!Qvr{V$T_!p0h0Esx7B9+GR$_ZHx-}~c z=XUts(ZlK{Ym7S}t52V7D~C9qsd3fN?DMT-+PJ4NZO*v5HNHhF~A;A(7Eg=^djg#>Y2rJFN41K*Za0*RnOdL z^tN;2t844NxdhN0;E2ZmQR$gu$8yk3pRd6Qd!Qp0A4kVfNsM$pJ#+FNT$2vcF^H1V zdmSWciRoeI%i)Q`=M?~^gS}vK9V%HwJqf8fY)<#hC^d(8K_nh9=~bj>cRP0qcYeIJ zCtx{L$HLVFP>0EtCBES3^3h+$B96l}9DFQchH&&I^vmP#?OoFka2&4VaIAHZAzZzP z*?q=2y~bY-xQ;M!+3PBJgCi}$#GIPizH(kKK=TU|4O_w?LpX>v`MB{}Yj90IQpaId zi%=mLrN8`K52-bI*Xe6#;hKCDiNgQ+L#@f1AOG!FxF#P>Vh}44X=xxvq3r0fi*OW< z(fYP(ZFK4=G^IxG!cq7oiK25x;fxJc^Klf8B{BFn3cU!cY~}%DCIq4H zV&%0+5HRO8adBdi^s3jZr+xK({)cns7Xr2uWw43aC69?1x7?$in~V0+NjfGgIYD2z z@d>ehP|La*YlCX{n^lPtLz2}m)Y^B#BV%^r+V?9Rk-fl1 z&o#IgA+?*|Id>;Y?Wr^d(JeQh^j{A`@64UE@cWAZ(P=ayAIGEzvB&5>t$bqudOuz3 zoh!r#V**DucxojeUs@`95PQLB4`psPAUH#WzyW~l+@Sb>(Bbh7$p16x{(aNxCm&N@?<|91Zk8&Q{^?Tn^VbouUo|DWn#JjWS}czC2|E#(hb(iR+p`|#gt zDEKmSmOA&<$4FU5Z5LGSM$7124Tq>eomXLz=1ng`qd)y#Vo5$=I?n?pSCNrM)RWM$ zuU$Fg)87H2^F1IE3y$o(rsU?st6tcNa&v)>1TsapCKUauc827JT6M;saMm(hbuJX* z@R1LMML%id`&)WL{}<`~r-ch-h!d2wUNhs=4JfVMbRE6rGBA6H`8?*9yC$Q|X6tykN|G5GDN1IShK7HGG8+)$@KI(7KHS;o+bPJ0 z9KQdI+9(tsDo$Cn3HgvK#Ni(wdJ{g@ozHGxQ3Czv>HRxa2xa8M$xR@uTPe@Zw>5{( z2m-F|o^kodr(VPk`07~oGPIg{Xn1TTPgT}EtB zLeCv@?vO30=Pq$W4GfacSg5u04_Qxd#kI3Y!%_;~{Sm=N+$UHIg(fb3S~!7h z!(C?i)CW~Pu(%446dOo9<`6Un4uYPXAWF+oAlq2rEsTFV_SVk_0mi=a7~PpDjj*@D zL?-%X+QGk@UJ3~NnFte+STfR}p4g<7=(Y5di=fFPGg!wUJNMqyGF15M>89&a8jt!awn%g+O&kqowxG`wh5!EAF4K z@QT()%}Pa_Eu1-I5k{Q#*YNbuzpB_$92u}MdlGw*n?KH04p^VR%IvSP}Wy3K6UCea=+tu;;B=Wj-adxQ(G_$$b^<4 z=1J*wv()jZ7UA$;QxH;l*4jH4qEyz1P>97rdj054?C-XJSw3MP^k1v@4=F0ra=7V& zfp-wq0wDUVErEXpO4Jm50yQFyuNQ%Db+lqR?mq`R;j?rJqRRFcRUq5gfLb;}UgMyJ zm4Ir93o5)&u9b7+Av!ZocAirRZ?9i81`%HAg3w5kEH|{W2&uD(*N!RJi)Rs6SqQ7N zjNnBONu;JJO$)tpShS^OjoSN6cx3Bn-1}VZ0g-rG%JPP?qW}sD3xzk zO!h98(y~D8la85~{UiF2uXjS?BR43YZK|Nh1oW4LObm3kEj>okVWP@%gwh;$loot} znxozg4P4FDYt;F<3nNzX2j~1{B1R@Oct_-9fJ;j-wX&ai`+>7@WesF!ardk3a?UmB!Gi}G~*yZF1QxJC~%F`zwXp@4)T zm}@{_pv!WB8iVh058H`j5Va6s!Zni*{*3_@9q`ddeKulrK(nBCH8r+R)Kh!ek}sZ~ zg?rhU+5d>T{BSr;5Wt)2iZq=^;q21$Hh3r10gSo#9Tb~k(|-Ui53PyQKYTY zIdRaoKHHHKH;Qri$q8b|`pyGysP}&p3<6M+kT_n78S{Q7%TX7+UKy$_q*^`bG|zgmTd?#^EO? z2v6k2M`fuV`5cGY_HMBXey;UgEQIHmu#p0qp&{okVZABj~Y;!tzB zxfA@u)Sh?Z2`g6Op7&NaJg$bh^o%9ql$MQpaUSkcZgWH9<0w&@PNB?y9*Eo;v zB{29uk0>2`-vzf#MjiVH9RXY;jz*Q}fOx#6ARgAT5UZ-i6^`uOqC7z-T=v6s)Uo%u zq47~RsC!P)_fMON-o*QL9PtR$O%+^9Hzv2AvO>+E#5E_+z!@~s118tOl9pcTwC0?G z!{?$k{YMXo!~-TPH`HpdVDtSea5Z>9L&9c?#cEGJ`5&kZA6YGP7GQ3P2Z^5j^nFmC zpCQLL%s|i2LwetkR+{lVIk~r`c~02OL+4!n1ycSn*}H#S4`dsiTRzfTckTVM8v1@j z?>nA?^toX?>$P+^&H*mMMf*WJZdD^*{PW9Ep21(wef~T23_j|B(LXLxXPC3+9yS?$ z507aGs!ID-TkP?mwq&J*;=&6pi8;uH$0-c1YDyLX6$y6e(k;{Q4D$&Jfp`GqHKgIn zXS_da?|Wa(e)FW>cWsf>07zq?Y>b@R7d}TD<4*(z*8z}5K%Im2UG>%;JO_J9fWWyz z37m3>C#p0)YV{a-Ui(a3J^oDK6AOr}Y*I0LS1(+$0b}%@)_aaXL3pJg8n3qpU}Rvv zQa*swUJXqN0-|T!5xEMFEQfj$K9M7r&f9=Dcb|2~BOWSgDWUF|tX`Kl9q*X@MMnZ< z!IKKOl{@Vmp3pD#H`k28yqnK?!{jH2h-i_&BtD;kk^(Y#_;p3i1NqZa{T74I3p!fA<5eo5ONJ}e~LpQhjj$JsH zUt#+P{le#^@vsa?qoMAK)em}XCf*hMn=7Fka8B=pykxlgJ3>;FVJd>;=A#k1{y--}xG9~ug- z8j%?cQc~h@9ZH%Pghevqq^S$gtNKqT6h6uY6_axJj1yL2Ov)QNhDgIOsDa5|a1aBK z<^drOFYf9(5l7-*TK{P^!?bAr%txf0rChoi=jXq56j0?;zjA0wgP0A{^OL$!Klq-j zcjEoRHw^?z!Z;o={>vScXwxJo*H=#}v7UTz&n+KYalcCzJpj1gk;MgGw>IteKyAO4R*X(;Xbp!{#|J!u zD|@{B2J(e~%>cdfexXnS`bXj2J;8pS+K#;=*8#aIR{ zT1tyQoOv72@}GU6#jLx;6J!3IA!>5%QrGA7*QdsSn)f4^`O8%`fc|}H^aZVrjj%$+o1$=K*++j@Aloi6SG+sqvsys;fiy~XK0Cpb)r)~_ z!}VkFvd4qhFBl9cKa@sU5>KYelx9usIKh-(<%pfZ_KhcgRt`A-D~%I%g%dnkE>gbN z6E5Go7JaY(lSZdbekXYH+#`HO)0=PHi4hAQN#QF2hs_WlX9?x+dwtWL8_?hPu@o}@ zY=uB~yLQYvyVtjO0j5t_OwP3-8H*tw^rEpc8|xIOD%Gnx_(Fy>W_QCFvu645zHjgN zJy0}ypD8jIE1o3t=M2$A+~D|d@y>7Y2FI8V(v-2aAYkYJc}x4Oy#}z3?I6~Stq4S3 zkmFx}`&-NlGOmMIGq)~KXVl&D51fl<)Z;sd*6-CJK-ep{)g3eg?Ue}~#OVJT5ikQC zEFE#+-&XB<3{ZaBA(R*eU}!y7T2asOsv`YqhBOAD*AKhplewtZC+;(aKNr28d-LM2 zQLj(hXNpV(&JULPbB0EV(Cb-8y|@eY`s5DM)R}ty;}gr)pkANSL9Fata54gAZB#1X z)7GbYe1m%ZvkqeIT)o~id-OEa>r*?3wlnnl!;9ukM!i0*gBbnS>(t(4>!_ZKac?rc z11SC80rWPUM9jHl-rlQcUIF-KbO4`^`v9g+uTkss{+1rQ9t31Fbz~jd0T3pM6yw@-_pJUxW>Xl!Eh zHuN6Nk*CMw0w}$v5ZrSkZE*J+e}oO9%^^=Kb|DTmL+beGk( zRL;WvmcBFta~3X>Lnb!brPnCxuF$BJlfT9rGheBw0{LcY-Wn{(DDGUABh+1xrjr)z z#TdG;^}ZV$AsVS-@lVq~Q=%M0SBBEtAwN`TOd|aX3r9)iK4JTjI$`O6ii zKoq;7Um_G{GF14@7pjWs_wPOa16DCzr=v)#t?Q$vpm=b?rkzuf2kW)oi|o}p{pJC6 z`}h3Q_FIDy(Hk@rqFRtHP-Hb1HG^kfJnb`_!5eiXWKBJvaZq=s&V1&Pg+aivNyp(> zsmy0QREC3KX%#ix#y`E}} z`A!{8nG%X6J4J%2yKTo@{=?T718;U|Xk<)V>9L_~g^%BVX)@XhyY>EI?@48vcTsnK zjLU>k|5}Aovd2OaN_5J&P`B*vee=_axDM>q(Ikg<2#WL=QFC`)!>VOCceD08AgfQG zfSK{$Wl*I1rYw~U{#HB;9D(i~90ly=OuGsZJP`Cs*IG97p94 z4N0Zag!WBXNrfWOWH6NoH7G$ydr!zDg=9$Eg3@JsY!f9HFC8 z&|1&9*OWr?2*GmklG#gIPb`t(-m!ZLA}8By2VXzx$^={C|6@{tMj4 z9mVz!=Tv6?02dIlQcB$kKf2%+^-lQFEC%zIybA#N8A^=8-uX8y!%;X!M_{`XE}o{+ z{ZqF_t|+eDgSSS0srB#iHm4Yr?5I%ZbT6Gecp{$D9m`_!7&7J`GU}YJ+mQe5!gIRg zbY%MsN_q?_tNe+*&(A=s{CE{ro^?)#Nm244RScxA@sL_T9t$DQi%0kT1~u&o4p>~% z3rHiO&L_@#dGT~SpEyxRVmm?1Fn1`MapFDoOVK(x$pa?;xkSyir|#Oc2j|+abVQ;v zPB~^tYXQP`x$26eX5u~bUwcR9$}(A8lx6ePoR9XPWplEQE7}xKL{dZH`X*e^VA$je zMqbK^{1q#a3Ndq;TCjTuIJ!z~cWLqqx%EKe-LLa+Zd~I_>`nxboU@pN~hb z{Kf%`|6HN6rQ|K@z5uhObk&iNaR?TNa`Z}nK1V1UQ_6}^&N+MQca?za>@-}WxCA+f zvU5I=Z76LE;RpG{)(irK=jaF{iH4|>?3ajy`$l46C82IiF#(X}qyQ@pGw`T$&p8#3 z^r}KdPv2E?_!k2K;cul8g6#Q>kJ`2Dy!f8QXVzkz!TCBOKI%i=7-*ByA%TZ1j$THnJL74%=h>GQT?#lZ z&~Ox~oBVVWz{9d4i-q!3K6&-Z@6l6vp%WJ0M<+nsWPfk`)}?sk@gg0GX(biLp`t;9 zdM<03POM|Zl5HU8S`Yr3KDBWbYi*0vGG3>~TdF zr#eduO#0xQxu^xQyVx9y%T}mM+86L}|?H#(eZSYRsM< zadnO?y_h8Rp~=1>YMQKT=%orC6xld2iynG;PY@7Y>W;`&pk%F- z-h`bw;j4x(`U0NIbUak-W`?;$c%7d4^rjVPrCja}mH(U~{B+8RMSIat*N4W$MwiMl zOj^>ZigmNgznah=&;_N?xiU^38zJ+9n#;zczdWDDW=6uwu}xa~4YvnlzZ|&uI5jV8 zfp=uCER)4W*)J6ZzgUV|zEHze5^8RS;8=FW$&_b<^5xY%_x4xl%PVq31B~(8i$Sb7 z{oeTfWV8{Abu8gT&?@S{oF)L29MkpVtN)BTH|u-Mhg|?w_@E>kvR%+F_)cn(!B=oul1%bo&->4_{&8bdC)NK6;)QvV5ds{Pq@qrBOrmwfmIdb2B?(R7Loo%q$96(~bh zJeFkNNR+J~p-GXKZK3>l5xa{WJ$i3L8LIY#%9T;ln5cO5Pgb-n!Fcr=4by-kt9r7| z9shAq_iUE`W6DyL;Fwc!Ar5Qq!ezH5QLxg-6`AVoGk~!|C_xGJy=5-G@$>>TB98RBtM%7{ygy3FVq{~5f)L0;7E@a zVQbAw?OYuM{@lQzse*J0N(a~@jfddQj~lxzLFpOB;%Tk#3^aywhq15%H=no+?er*v zrn(cbP^WB{2XnULDOwN=ApWCD;=MbdIa`I`P7Zk~d^rZyoG|79nTZ7gEe$(;#d9Y*EersEUj@5rz&rF@=~|9t*e=<~eYGcs3^lh*NpY$L6QrCTpO<+>ivKcS>W_#m-lRl-#wx zdDv={ySp@mgIYu3;xL2~SGCrMBW-+)a|UNDVY?65wPGU5-Q8Z1WniXKE7IN#w{O4| z>GvA0%JP2cD%XRnU3vykR?f~Vj{6i>qdz>3PB`%CEUFFspMwf=j*ni-2BlMk^dZ`Vs_fzyJ#E6>^z|1 zF*8@mnE|pE9(Ar)(ztvQp6fj*M&im6X&i*~X5TSe)xHnuIGB7|oxC3?`P~C^QTskD zMB>U2=~bY&vBhLOlihB7@Egq1@raJY(dhQ*?vfoT%5O5_$3COcZ}O;DT(0brMn!nJ zKUg_q6Go3erlV>JC6WqwzB>8*lQ?m_`0S$>p-1lVG-M*5oGZJerHeXIIyLaXWc0#6 zp`&7Rlx0>6QPDDgTzKR(^uj;sjK-BUvXVr_>Am&xePhs9`6m_&NRpX7O^!YCqeb{A zo@i)XfGg@#9x%BwNgfd~-_CB@wIv9M{>&mW^SjBhNP5%=Z5dzji{&WKPrKo9Wse_d zzS;89CPed$j)vHDWk_RFv+K2!if7>Lde#|@|C}LW(Qg0u{4p4d_7@FHwUTHqgd|Up z);-h#<4}662uWUgbj`vbAbQRnk^dYr+#k%kUwO(Wv(Z+4UdIz@7*>WUOFFZ~`xN#A5fPwCoe7-v{=bJsLH`Up16iE3PP%;$|Y?$UsyHF%QRF ztjq}lmX~!b$xwryN0y1CLp17!8vo)WZ-^D;lKRoxQHQ_chDRGLAJI^L?yHv!+k<}Y zzZqzh1emrdWkf1y{5ReZP16zJ6V+xV{6)+x>3KR-0*K>zXU8mhs#0#>CGtqr(eQ3uuZbTh)Q9vkWd z>MufL8M3_a-A-Jy1-z_89jX5em0h_4*~W5V@pDf8 z$Z6Gp@}C_->CQ@7j6I3f^}0`A8Jhzb-%v63vQ88V^6Sbq2oBR&8iBzi#+IDd^xz7N zUj3Jfpf@bu{ zWAdhnh2e;r)48N1vk0EQ?TL+u;4KP40c4df@D+ifHW{gi)m%9nYplF&AxMj9uIul> z1ZjOp)pd#}OQx{ySg@$3PuGT_p+p^I+l@fLVNo!d3I~JG3}Q9n4IxaxTNH%FME%*n zjOkQl`n3zTZ^60!9}PXsD&}5=3Lbt627Ih0Oy&8Xp0j>;08qSVqG0BeI;Bg*Y><{D zs-o4KzrTA5=J|i$LSRWV=(zrV_D}2+wwzuw?|kV01Fe5c%jf48io2H8WmHv~x!L0; zW6vMjdoIpw&;Ocx;0)~fzxJN{X13>J%O;G*p8sd>xnE{`UjNT7E3oH}>^(b(xF6$O zw&aP0*z?Eso=Y=J^Q`Q1S7Fbe*n2L^Y|pbVIe8lPJlfuKxqm%VdUbnl!+6xIW7M9D z22i(UD~j`doMF@n@vs{n-Ha#1V>J|xHj|J1AWmjCKlI%Wj4K$YA}J>M0V^f=V|=w4 z2qgCnAEj2n81H~YKP(orM0(Ak?#q4hah952Z-RzIFgp2YLHNuU3e5*Q|GWV`w4b`5 z$pCMNQJR%}eJ-A#P1Mksd6(#u*bH!pSfdyAicLgc-lQ~4wli2)II{YjI(vQZkpHM> zuan)-xDJ>!8e%sv<{zJYiqbPhMbq~umgUWThs;1UpShrMWsUSar@XFxzn{Any{=PL zG$l~)*Ew@iA1!eb?(Na|_SLII)qlU{fqTBd`tQ?Jd}UnzZ%kB-w zny#X#M9P^h6evLCN1v`309FT!gp=c58c!g{P(jwd?yEu1EE@)RW;o+%13a)_tF1Jn z_PBi<^Sid4)BpdftT~ObmG@2!ior);z^6iK7F`{s$2s=1Q zbY#Brk&1}D{Qheev=Zs@miJ$jI4n@G4_CTQ(GUGW!9yu^#Y ztiGhG;|^Q4at~IWoTFi3_j{$KKJtOu@g20_@Xcry&n5cyk7_E@MfZab{5%Lff3Ee6 zCxsoJ$T2R;S#x|q_4|{ffaePrJbq7dS?rWF|FGkkT`0}-gxI}Ja#<|YKI5i~ zZ(E7`jQK(=UM9IL5^5EBIB@#}TtybBNUjvxA^OVij#_@=0nL8#=jFQFFgNUhoiyEcUazFE8k4@07%zdFV4saF_Ls(Ys?gK|j$@^@?*|dHUNtK(pLJV=o`*076eCSJ2R*#hCglk_A5NEUTfg7mxS{Z0bz68bLrfjI4*~T? zyVoNh)*C47MX?+p$c_ZHW+b{jGaA>74LSn8;FLq>()3gJBEH_RVLkeFH|o8M3QT26 zV^Nrv&wYCfV%p@2DMR{;uywW^dh|EhfN8UV$+U_!y8;7OMJBqelu%xqsb%L*M6b;j zLI0WAD^Mr%YZsio4o~K{8c5PgTKOrlls+$hDYO#x#&<^lWC<%jQBbq?<-H$G!CAY_ zK*5!U%5?8FM_)1ld;dPIckMcXpS@Fd<`*^p9EW!1cB6O4(oepkAvE~bgO6Q`ewQC~ zG`2!d9#xm@ETw!vw^Wy^dFOr8HmIJ>>414VuGBQ7U5K**&&D*}d5HMtQ z(L8Sh*wpe4gCHvdR4$M^z8|LM0@=^#8^Tej)Z`8@e369*o-AF2;ZE$O2*Aoiwas4_bEz7#Kn+KION=K*-7iwL5-w*p)kQcYL7Lzn-nsp<`bp z;QYncZ$a)KWb{m>Cv^ZJOFb1e{QB2VEyJkcgLMo>DngG!D9;DNKk?C!V;3NXLu?p4 z386d&LNo9GMnoNpLv;*zQO=eu&d;$R{HH5N#kXLdjKd5Jg4AXXFnr;~nNR+6CCcUD zIu0|LibtW4mP=wh-fWw+2QeIB$KXjQWHC@xOef6xU>)A9{)K^oP8gCQu26{DdOSQE z5gqAK+jECECxP0s?MgGRo0Vy|;;?|&^oNjR>{0eF&I#P^Q5GlqzRIiwL#GjrgInM-hH z9r&?o5Slwdi*RJ_0kPeV!rGuIscSh^JL7tqTBjV4){N@R@>ubGe?rz-m zooFCvZERE$`3WTyY)wU?R(5e8IYEuhO^@8a8pq}&9YCuw; z=u!NYj;Jr`NAr7(sCdjkxaLcY$NaU9q$HvwLWzc<5s1YrjJ75*k4UVkLyVH2SHwxh zw!Uq%FlOXr9bf;V>V(pK|H4zc*>MeEZI5ypj;0sB~QGt4Xu#VbtFtMoulfP)w8{czVG_` z$s4bLzR$qEQMI(Dl#+Ne=Gbi+$|Tsub?{2Ozkq>$IlESgYK+_e`l;hD#6yks@A|n)7u{jnp(u|A*ffh)Hc;Kb^*V_Qh zc)DL+*gT~S5TA{RD^iI{B@`YQi?%y)5do`O!rweDgn#SO_$6OqE#`9=bZUB%eTFAH zYp6=m4?q0SIz;zd9i58I7v{;L3*;HDA!|-AIsE<|?SSrFL{~YeNNE85nmZy_4U|^J z&r~xxa0>zl)meM#ZP*MPd4XU6{`e`Q#7^<#oF!uh043+Cl*kFFpV^${_pwIssP=E96H|^ zD33A6K9g1~`*4N=7%x&W#>0t7Q!A|ho|k=M;^e}_@pIM?n*HrASAL1(-VIU9s-}#O zd-i^3ug7t}m_zr|jXUK9D4zS+7W4vSBS!FO2d%qVx<%oT&O%!9DEqkj!?rnS9|sUY zz0wqk5k;ZEwlS}@npa439H7arF4W%l+0zzH$GvZk7@3;&!$ihkxOIXj&AEV?YRy{x z7N5R#&nUo`i}=*LaS1TsgN>2oP^Dc)U z_%Rp$q|xo`{lI`3s%p`ly(V|sD?oSmpOS6~qGe}cz)Z_-(R}^E$4~hO(AsI{2dw(J6@KSA5-J#(xPqEs6!U~ z6=>_t(N-C+kEaI56Vb4bR0e=f+lMnuad*Q>Yf*gKzoyT=2Ppm>OEEG$1eg0q)P|yx zmL{jP%R$lSm*;?rMxT-zv0oP~hf&P&(e|V)r)7^%{|+suOH`_chGH>vfS~hEa~~Dt zJ0vNRUjL~`rETLMT!`@imvRV9Ya}x`jLFLQSGtrRxDDgtg#p3k8Um$ZSm975nXHe85@CIX(DFYz8$tohD`(wm7YmRy=3HaTZ()At?srG0 z0COJ`GgJyoDv({+xCA4*eo|9xWSVd$2i%no34&y4pkf7&|HTzE^MHn+N<$R<`#~$% z9j8H!^U<%I<4E&IAIx{))i<7;xT(! zTXmlRo^KzKP&MfO)Yv$>6p$2}Nb2G(LHhPifBvjNEbQ{S%9x;xj`+6QvK^=+id1Cr zD5oe@&$UxBD_J?ABH4}^uxT|$krf*VI0fYjL7EHHN%PtW6<$6p7xjKzCJB^(Z7h`g~zdbFr{ zeRX)impHFW-7q;ZM;b{W*KRY8-#TDn3m~~dLxSN6N@caavh9;0jIM3`BcA@UqZ=?& z{8?+=0R!&d^bFwdZ{UYB(41g_;~i-801l^zab{>F7wNCGtE;2R0$8+R$<&j<)^d;7 zJVIz8!Wop0l;#@8IToc$|2uVM8&Eocp|mibNGQpcIP6|pB2fq@m-4HYkUJPZsW1Yj zEGmXwc+zLXfr>JXidY*Q39I~0_D#f_)zfRZu@Y~UB81wAiOJ}|ys@A84nOOTuaiJW zxs8sWD-DK|+Zu~=TIOzP1sVq0XsC|=JgJ~!y@oX$ybjly3XO`E_JOedYYC!)XX>Az zT`M+`q%{$d#i;#=-%f}EjzJm@n3xSIzyJ}UQnD;?D~QEe8auHHth;o`c3cH2RqPNZ z2hLvZW(<1lAzwBeaR+O;2de%oFdms3jPy1>?iK>Mc0a(qPrS4AM!;W{G5mf;Vo>Ld zLpS|t6P`C!GZa*@5zXufa1USv{IwDShLLS)ia)+Kbk$XWuEvJWj5xOAGaso4ON>80 zO0sE;TS)(VRX%Y>RThx za9vX?`kcV?oN*fR?E8dyPYz#m6VPxKM?*y-egiCXrpHxg-#}C0?~Z}GIdRVV6DHuz ziK{hAT2ezfkAZ`0Rd%JN{95hn=S@Pt)-_h|Qf^gQ4AfoZtQDL0;9cZvEezat*ntJo zx{InQzH`<1xmW@9I<5b1JU4`tE5yeKdOE!yic+HCd!(Bamy~>0NyDKYzfTUW0}q33-O~9cx-V zgopJ<4}W0K4D&F2*-z^-(A^MlYYjdA@h%&G4>W{T8WN%5)*%MC5MoM#*rKo?sbz>e z&`_0mX$&IJwRH=k80s8|lAR?1!Y(-U!qsEYE>H}b`X(SsBYy<7-EyOafDa2%nS&80 zO97QPn}WNA^K<|JO;Z0@)wCQc^Pi( ztZ4oMZH60oB;1v0p=MH-FL70jatP#xLmCG$ zQyw|wjU_0X%^VKTgCRdZ40i`35gYcqY&B-Xim4cyTT<<|(@|%Kmplq%VPsJ3KdsMb zj1q`jD2$S)R{dJPaTps!2FF3y44aNsep)OXMG9J#L9Z}m<)XLYB4JPr*;cc>FQB;5 zLNO4E3lt709-%bAtX+`H39Ya2JB+@=^T3A{Duoh8!qhsvnd|8JLli)(JH4M$bHH6bCs(r8SF z5+lDC4W6y)lr{^^pjM^T`y`S^LG3x7zvaBKxaSydp|Ik{2dUvHVmH1t0y8L-;X~nR zO=C&`!3Y&WEc}zij2nkF46fTQIdcMfh}%WDIxk|Jh{Q{-UbzAz@orMl={G*})l}{| zMY>xEA`sBk#fC%6c)8%Z6xiuCHC8csf1{!auh%br*ggxrUN>iys*>`${^brqg|h2F zAjdEwtsP+Y?vp1r0wuTDDaq~F_(0vfa)0-DhOuR#zP9O-Z{vXaRtMDk;4>|E*rH17 zl0csQwEOzRnjh~3{I}Wh!)0}JU;8*Y+{8$pB6DkIjY#DDBlh6=%Iz#gmN%ga3hK5% z7=qzXfGH1gj}4(H)Y(;IXVZ7uuAYVLGCjVM-NS<_5WBwQ=`^oKTXb$;d#xHveFsZt zxiVb42?A;i;*0yn6E(4LMD++^L99q)dq-SCsz2X~4%P3>aDnCEBq|R$2&=S)AWkVR zoOk^?Jf*mkr5N(&$C6+#g7s>ui409RSsF~?WY);y6Sl0yz1dwV4G_?8Zp#eEDV#$3 zC^@F!Fc^;cWbQ`vCEqQ?z{bj%mLq}g#wN{@(vD+*iEa?JLvdozYFNO zPe@Nyfz&9uQ{<=BN7x@-?*9E8v_J0eJc`8XOn!{a4WczhGnRh1=SiSwq)AaE(EyXa zUm~&(_c2ImgCC8U4?e3K>|lJPGAG+`@L5z2EZMyNJ)rWBKP{EWfkKPFeIv23l2EfO z!7(kI8TrbGKzF-_sa_u3bwBXo0fP@j*oWM%60Ysp<0mq{v$T)!2LorWycsBa&{xVz z@XlJ=r9_`?$IwsO7TgPzJmMQA<*=5ip=H`OF7x9<*s`Zxv}Dy9p_I(nm_9m4dvi<=H)(=iT`ALiEx8$zMt& z6@m2nL+lYhS~Yq)?h&6dD6w|x|9^PU39r(Yl|3e)SLx3gq^ZPVvPh2$ar5fU%Pt>_ zH?N-diG~u=Nb{2l$}cq_`owzlOFe^BG%2b4wx;Sxvr-m`MkB%MNW(D5QlV(2r0|^0 z$J;X0dGK4m{*_uY=~*646=d$rC>AqWDdVv_Y*cc~?|?IZ(XkZ9TQOfJ0i^B<@!_Mq zq}k64lym;QZa5%$PDfItG=^HEsWiWHN0b5Qif}r%k=Du7S@KD5|7Hcor#!FI(YK zAQd12$80s~L(IVHpY%~TrSIH0WEtL+eu>3IMACSKBt3=@a(RaK$J)uP8+Y56R|BTM zvX~&ft^!&M0wz;c4UuFro=BDz1d~dWYGLAGg*ru0jb#d}nKX?V)7xqX&L{?~FSA(5 zXq$|oGOi6XsCM7+!3vbLS2$Eeyo*OrvU-ln%s1ec19oF(zP}Neh}f45A*1pr^t-Z9 z&Dj4ci_9JelOaS@j?}mB{QA>M;MHq7A`GGMro;68Rj!|BOudQ7%+rql!+gvz`?`*B zVEqjq5ds?>QpL+kTA;fj{+9kYYt^E8BLUke16vCwBaiy9qVgI3$^$?PEV6hGTn7yI zH~yWC$du&gibvJ4`Q_hU_#Erl{6j~n8N>~Vc!sSN3d_egJv;%i{FB2XZJbN5 zx>W4@xVt}7^OL;6V39V>rIAqkgvXx$^=ynA{TG7-HwZ~$g#5J5sXN-6YD-6B1m3@O zERbI=5-y4)TSAFQs=abxsb!e6il8dZTJ z##V;GGyKWu6tsrkLOctE8l+u&tU+@9M8-l3J_&amI%$ajkmWMCHDgmSU>0 zl8WMjA!4VTyv{UOX6ekr*!^R!1Z?kg2phA*^R==7l{M&}EB>+<^F_RCAZ5d%>`Ra8 zx@B&MQ9)m6%c+l??r!JwvXB2V`j3GBKL-9%Ohf~jkJKnGs6eDGq%Hb{mI;Kh0=WV~ zyAKf}G#rlnr8OpX*YBFASFOXle(xEyrN^jYb`;#^db}|Y2d0c@$rB|#Gt6Q`*320A z+6H>PmM*gbeR<|7*lGnCQ|hO`!=*6Fi~f3+0X>5nxW z{aRYR?|XgC^ptHsak}e*=2^HS|AfT`rJUeqxW`S7p9ra2UqvV9?ZsPPqcw!8zbw46?%6 zMRR)tvI!cp^4dr^5|R~mX&zCh9#8z^qq%tM@u`Lc!g`z4djg&nxI7ACq;5WK{5)Jo zCZ?nCtiWa05z52++=VAhL3x>^p-}sF-)XrmEwac0+4g9)KP{-9RRPE*TgZHyYO?sK z)5vo#nY#i{Bd2KiR3}4_+a()kR8C4s774Wm&%9ygYFvXq(~Z4P!>hrLI_7s?~11q)g?3|K~ObmG@2zn!>F6yWuG_g z#GBsJkT1=l#4yc{b@I1>1HtLgRd%$f)4OkP8MhTr@22ypgn5iyAW3tII^|q4blVs_ zdzxWjDsk~kxqy=8Qy|Askk(#u(Lr-J4h2jzHB70p)@Tuw8g7%?6WfB(U{B>^rsE#O zY4&Y@uKw~Ozb$CMGNU}bqf6*T5EF7?rJGRp%o^KIPvMdO0d`)sxMc-WqZK3_d+ zEyqWYnaa;vp%k98{yK6u;+Z4FgJ-`5HJQK@$hJ$>vXP5cR|B58c090?OQy`yVutcI z!C4th{LJw~RUKQH7_tU!%+Ku@33&M$@4Ug2*A~XMijlFbuMSy*5lUa6PLDx`3iM0_ zOG3@f80m_P1Gfd%h1EP3kmg&Y=4JH+wG%GdwO|$Qgy*T;x~Tz!f^4|}z%S6>$C*cE z4BYv0>6|>kF&}Y21&E~NrA9w^(fId03y>EJ958@D`+K*N*uNe5;L2^dpIj)$!T2g2 zFIUP-tl_p}BzDuQr+$g++akmRsq=#aAP2i`E~!VFdhmP+_!7keBRf`sT)Ta{EpOb9 zF~GD~#iS+ZR6Ccw)@i>dgNvMxUcvwoYq?@`)ABYzzr>Ed1O8pxGOcFYgM52FuGInJ z{>9_(RjtMQ7fUln1ya_htCnCR7hJb$7C|4WGM&_nv_E#uag(xvsxMWlAQiafm{b@4 zVuuTwvXX6H{bTxHS)1I8xnY(G`*#2!J>RJ;Xk+?p{|vLBeI-WV06~@q)D8D5Qd6hm z4fn4_2v7}+9r@B+pyc4}^&@wp9DHNPpc-A7mV@{2x_=VN!E#~$esX}4gG(-Yd@&1|0!noXZ`>OdHwU04a!*Q_C?GuYz)i*G*r z`SXBogMkiG4CNNaAt*406%n;44sSsLs0q>{Iq(N+Y;x2;_K4P8AJ;Uhic9t}kNt2X zP`gp1wnf{!ls1Q&l$hn`_BZL(z7`C6-j+N(c%+1=A{uf9p60Bdfh-)4d( z(ZBs4Wt&6~d`8XGyII8$AI@0mMy*I6$C0v8+rPPd651wP3YU)9;UCYz zbAoLg4q}MBu||5dsCeVsUK=wW&v3tY!{o#qX(WMc!=+04$wc1U08ur&BFihulW)Gi#wA5@%*GOU=*R7$y=9Tkr>@2I*WFI;u# zxQhYPk18g}*dEkomf`aDv#toGeV08sVghR49cKTQ^V-DVpm=1*g^F^EWDQ@8r|&x* zFyPkAzcqk5-M zVGAHD&w*U~h-}&M*tAv{k-aQcFs&g8uTIoHk4ss(lUPY>rhus$EV+8@lZ!w5Gf@?NZR%MJRKhHUG?Dv`{R=m1hL4h=>x++*zt7T%Y z@>0r4AaN4a3kB?yraI{YJudP2YJnYB;4P z_I{QS&QI~uDsAQTu-gOwd$M-%gFxXg>=g16?txPBUK>FyUTlLuB>|^o0P^xn#6v8& zxn(2Ta7WsxtBI*0y0~=7p*LJc2|t?H#FfTiDtv|mA9Xuv2Ucl5-o(Ips2x}!t&MZ+r@5=Y zJbGFa^nL>N4yjAE8Xq!yO-g8BQ|+VNPO^%f0mM8(XJ*Fo9#9c9g} zkBqAU?wny^%a7Vp^oZeUKphNhd6Y!m-cv4<+%&mw;-_luSJDvslx_YF~D)j=f zs>UFoZvjT)XGLqCeJ*c3y=>jBKI(vmXb#e(OTl|1XkAWk49&cG$O=0pVPv@g^k!H=@jKTV^WoQIS^V n*DRiokyht9p>VmbCaYtqJF4-Q^0oy5$N3I8xQ&#7MJCxCGpDUP89S|DO>y9znr{>@{SiO(Y>zZ-C z8Gp}^eDYzT0e#$~jJB#?FrV0gcy>TH#euj!IZ3kWL0o?jvJH%O2Xqm)A7b?J%LJi) z(~{h~KxjaJ_d$n792UH{Z=@-|rU8j;DnNtO17^y?KRTaxVy- zxNMulg*aX)ta}eJ+QGqs`Soo=BYw3_^2?<{BOW_l@`xccVt=RPk#+bD9@``N)for} z4jh*}S|>DM-o8R|;|XCBpWPwZv_P1|-ydPDmuwP*`5evxYd{@i{^L|ZSTDsnU><`G z;;*Y1{k0u}Fb|yNuocIxLSL|w(f)=qC5}HKc^dgd{IN~)r}aW3jv(#CQTQ#uG7A7fcl%dVVf!+gigmLEr$!88AJqLuTqmBXlBO4?iJs@o2*6oaS-A2JIIVdb*@eanE&@GtD zmkSf2D}el$n&&^r8HhrGB`@}I@RB;Gnp^5)IL1oq?`7~{pkf*E~67{Gq> zAV&Y)Ho<79^FZrDITM}u8|as8a6sIbfCm{R$h_@*0S6wYR19<^Vb2Vf2JRu0LY zsB6Tx;p;%Z=2pg9@FeVcQs}FPFxDSXzChc)T=Jb~gvK=E*evv>^BC*eTLhthYM(Rf+Ak8!{7#_}?K>oG z@LOU5>IsoIB=hbQ8qi<9MKT_sW$cU5rvu}*yCgf$69%&xNATcA$qx7e@%@__ z`z1pJGoVe_!1$WOSJw!G`1);<%_D_DY}qH-ybHg1_;l2J#50qi%ek(_>( zuz~sZWsLEcZb9gW(4GRV6JsZ$1NjN;i*IAJ4wMJbFNQ48u7&RdefS~9#MqO05o2BA zEn_8bLO(+c6_R?iQN#^d#(vjY!PHC>HgWkP#`q)3hr#&dj}Hp-+NUM?X~G2Bi>oE| z@M~gxfzjUpzb6LmV6?&mg6T#*BHjz1BMO5g-TQHVztAz+V@Bc#>=9=(#>z&)Ja)S< zh^Ln_=ATvw<}JIBPB7$L#=acw2QXeh|4Y21ld*@KBbd|gLH^%^yg)qw`fm-!9`l?a zwC}>7fj%(HXb+&hAilea(dVKb5l#0p+N^DY&|kWN(XNCnGYdzI1uxv}a4wGE5Of1` z=TXTIP>+G0Ym>}He+abcdmPaJO>e;1c!uOE_#Loo9+wPzMA$&TV1eW2iLEtEac^k$- z#Kl`AA0LSL!H5x(i-+L+5TSh*bqMIEA+LdUC)z0HY82#+6!k&#!SL>@XiMr{hWhBg7Q2E zoUxrTk06~u&!2FZh9h_h@*il8NDnc2JEIS|O)xLH6W8y=8b!UN5&a9$-wgW*v5wIu zk3~2z3GE@!hYXPX3V!sf!$N;-fzTgC`W|~y==z9?UpM3Y z3qn6QPw2l~2A%^0(BEAk`PXUa3r`bvcfI7jXnTP5`00$f3}ZTA-vAk4HljWfllL(8 z$1f7hCin(0=WS)I*~|;_Y@fOjH?CnD(D2p8R)Bs3(;l~Z`&`qXoWC{ zw+)uO6n!P}lNTBDF_b?rK6fT#O&led%duX=Y{d}_!JL$M(@M#ZGx7UOVSnsN$!$}G zO&otw^0zi&6F+vi`*L9uw_z?vd>nlTu@Zed@l*H{@$eYQbMRB znS&!Z72^=%Ws4-IuEOtC!hRddpSbXT$ptqGn|KRsCf*8LnbUCu7hcF%Z=5HX^9~4$ z7_{C2V~j!I4G%aB#Sxr0NzyPtSj1(EB;&^li>TWosh=Y(Vm!txMEw!Qc3AhTJI{u>Y2cIGy!#QHjYg-v{6vt<7QVH2O;Df#{pVKYd__rXstl6(z1nF5Z4knDXz*u>AFlR=yCbFlAx z$tHv&zBb*kjv2Zc@C2m6WDhb2em2%GrjD9Ifw zg$?v?p^qW%Un;q8wa|%gV@$>j#c?S5SB#yBvDZl6g)uPD{||jAuRn9cVJrgeZY ziIzExz3_G+ISoh9atouq3*&2`{~!89;)M~6_U|(=_5hh@9OmJOzVP(}8S6Vj5a#^3 zjBUVYfc3Z2B*zQF0@~PvjDGHN!Mv~?`nL`8)o-3Vb4=M0woAI4e4>k$WW z?m)@wG3Ef;Wf&&_{k#>DH=r*kep6(ue{L4ciw_A4XsuXl1^O_I2N;AM1|46(cmn8C zVIMIC`A+=q97enAEUewYj!&$SEJvFItYv6pfpO>}MxTT-WM<(A9>0Y#--~cSt9x4V z;^~+Joi6N~(YFEPF7(mB+HNq$S=S4~{%{+kAACj-))ks$>gB>Brl7q9X8m)L->w%X zF#a==v8N0agz=yI7<N)tfZAF~=3Zd{tsyJ941WXtjqrb< z{Ria$%r9(|>>Px-&>&%qIfK#vT`vghk9ml(UwT{+#@mrE#CH(}Si3L=W6%%oLfQW6YRR1)!X} zVXVVD1!4U35yqT8LlDOEFEZA#ZGzC+Ft#NY%$3X=g0&ftU&R=|L>U9?yI9)?_SKrh z796(-^Gu9Knfr0PUl>1tJcG3S0Q?Z+3t+zlZ8Gsv*awU)@G)ZRSjKwT63l66OMroS z31QEf%NS20|A0AquVm!`VG^I8#@Hh-6ol4#3!}dr{zGUIZ6VSJj7OUp>wzJHFmT^S zaz2jd3w`?-#yE<38u2IC2lVfv4Iw^&wi4LyL7IqbP^W?Unxf>a^Mnbkzjrd`yi)~X zJa!smJ-im_1P`E{0>+;XGS+?j1z}&chcT~1egf;S7>@w+13MY(Cvyd1p7K0nTnv8& z=0hhWKPU*3_#xz(3vdJvu41ffo)m z4q*|)kuSsu*g}lFRdNZ^L5#Rda_L3FV)oz&hL4b3g7F?PYOdsMvxG%lgme&Z-z|9? z?yV4SA0iprCM@O!9A6Oj@NUM~0KWwKAC5ED2L=eq3LL==XEXLFjER78?pDUW;ygiE z+4T-*;0QFNffzkTvL1E=^N)ua>$XP(v+{aj0dwtLl0`>^3AB3jZ@|2E8e{zha>O(6 z8=!p;{WtNzNXhq}#Bap+`MVjr1APv0E!q`ejvmhFf0`qh4`ZwWjK7>(M@fD+SJ(`${|-EUn!_?2!C{Q!h{vCi96}pH9Ns3meGA5U;9ISd-|Q1M@z)C^ z$Irxk7JO;7;?TX4C+HgZ{hgBE zB0gpyL{hPmYHCXki}2 zxRChuY{_p{3zImA{s9=SoE_Cxr=&e@7fF7+4{IR+^@I7Mh4UC=?1OIN7waYa z&?f=&{w9=utT3_<#VebA8n8vacD0RBV#2H{65u zJMh72lGi*aYzAYn*I+L6#~T>q8Tcu%&pU&$J`8=p9EbiHSObwJV);_WxD;boV100& z^0V_$zX-HX#Fwv@Jh)ES#FrnEd=hptu0Zg?tT2If=0lR#OoiR>gV#ehF=#1c z{(dX`4m^Q6O4Qvg89zjrzrV0c^38ZSz(V~%UCE&!Wgkua`7&Vn^0GdVqOUB-!x0^ zzE{}9rlRE8jlw1#zFV@p9_=6a1Z*Q#jgaguV0{C8qCxUQ)DK`b!A4>(@|kJG5#+iV z>ujVQ*jJ+70Q0OvjC~E-dSKi?k1;z?kAdE`fzdwPD3}{@4}-XAgXBY}2#vTI>(#_^ z%sYu2aE@4ho8*QK_zm8FzT`tI5f0qEQ*smL$ixR{Nv_9w0P+62B_CKSG~)UZjBZ|l zXScu@)Nf$E9AgRQAdVR0uEZFEz}%j&eui-ku@`L`@w4+8<3OWeevNj9IPkFKS13E; zRawUR-UvY$|3n*3Ja8*x{dkg)puPAp`1vu(zD{8g>sC9Qh9kIXxCCo>7OmsG`ccLn zvR)A8u$7EG_AVhAgd^(kSl9xzWfJ|J+wttic42PZAX(NROkn*LX#@70rnQ@qT3j=0c|b=zi&8%=XZ87x^Y<_i7$gCsjv3LV&&b~EN-lqs;TL>tXKgX1&kd)gRtAnF^iN8HWm zpU1is@r5%apT~VIVjbqP#CnuF@ws~>>(I9npF2;ocCXNhJ8|EUSUXbkY3L(9^SETq zGNBWA{(-rpAavq0vn6+&z;Ey|v<<{E2t5pRd=YHeA^FMWLTC2j z2zGCg{P;GZ6T6WI#4e;4 z$5=OQMLP&?Mw>;PiGG^+!?}_tRtgJf_m5@t)!PK2t=%N~^fI9lYX>ssuNDbH|Kyzx zXW)2-F#e1>2+Rq`Boj}^I0W_Sk_#DY+u4FJA1+FMI#8Gl!u<3>Vdpy}t(LHv?Ko~1 z#yX5qfpwyjv1>a8^V$Q#CeFTv(YnyS0OO;x8SUE_3Ff|yLLPM3URgD{ADhfDqseF^dSa>+*zAwKXb*b1y2^^Ca-a}MIir#YaX z|1m%r6V_eNIV`{teD;v!b7*&f`7ZQP%vm^su^3MQYd*@JcyPZ2a}JB>7%V9m!XhTG zVvIeT1#=wzGcae3aX5l3o*aVpO7H}HjrhYN$)Djbz}kuNDlk^eW$c$>oC}QCJ?T(~ zBRIPtc`a-P*0eE_EAGU70nm=JCf+sB;Q<^$9qcB?T`j4_Sc|9`;Q*N$P>Z@wG-7N{ zd~3O68^%t=q@#@f-R)Ta+%Bwz@LQr|BcsDt2&({Fh^}r)=R9E%T_{VUd$GgwI6g1T zpWMmVxfOyicjGtllXDnbJ4X=aj9Vpp)(8`5({?*F;0Uh3copbxX<)P~M&md7h4ax? z69dj>tfR;a;+i3hIsR_UN5EfDX25RSESY~q*g$`JljKimn}PYV+a#x=e2LfI$XGO& z1a`x5#u$kDO$0->sJHJ5QLz&+(i1#U6*TID&m! zBzOkWB!0P^vFA42 zKKKd7_&Mr7u^00dVC7$A%mEl@5?{KWv1dFi2y^KfjJ0|+{A{!^Kev&wTLuV5N4o{g zcQ2C6IVenE{QP#t+P)h17gr1Ytf`D`oG%D-+Y^lT#mfbu<9P-`+kpB6bgENSw>BW1 zK)(WM0@j_=81sD>3Bq_i+9={nJ0xF0p9r+CJ?L-&ju`iyfiWl0He=2S^ea~~+U9fc z`yBi|fH8jigdofr8e@I-YV>zkBd+a|yHN*#wzxyGWPs3s{)ej>?Yd_Kvj}4m;=0oq z-9Y+)*83czk3xSAwBAlezx1#m%wZN|?7u)rcH+2GSWl0U9K8+g2>8<$hjVcRzk$CH zhaPpP#S#2w17mk#d;=`pdnAm{p-%u7o?&6`Ksca%`H%zB^<{7m=GZ`=VKLg5jtN4a zzD)8;lnpR`JAkq7L|p*p0{APi?!KO}ue(z)uNx(7V19A7?KV!dcFZAyf=B@#fIRgF&-h(y?XkS9P z5qCeq=%?Qczq=QI&t~*#XnTS7MYQukpEixL=3XQSd)`_}JH`dXf-w$za75d6$^yv; zhTwh~`rmJ(pJ(>txL??fs~9V@LJ;=6fsDDX4(qpd!g^UNV{W)n5Y{cL7~@^%3BvkF zGh+eyRn zOID$OB4}(*{2FVK#BVwz2k#RGu)epIF`wTin1AgSCUFG)5zs$~u|6=LAIj)$NGCAw zI?foA&@N1_6-Fc4zDD$qc<0DvFZvfaKjAeHTZeiRETW{Vdj1Sj=FVfgLvyv#vYA1Az`6?1=df|-Vw(%$?iw+ z&I|Y#(oFmW`hYEpjI{@L6W=}|dHO-L^A94e4UF}prGk0ru&|gRIHGMiggyxv-`XSD z_>eGwbR`rf-6)tn=Li$n&4xrne-5_W$~2Hnd;Fb+6lk>9}j>Pp5o*9*e>8tN&q z-!g)+&V61G+Pfc;T(d%G#Cx7|Sb*aKp-s4!aJ1*?^VJt)}L){~m4wWoHyujLozMjGSbraaQK=S2#ghhO1 zm%~sT5q1pH0IV00USb1u5MNjuA535jc(z))SVb4RHYdCXB6! zn`b-F-{8aeO+47`a16&|!k#|T;Q<`M47Ab2zSWXnpw0m8pDQK*z`a+XccNT@`JO?H zc4D<)p1)0K#ECN{&!2|h;GbtO`bW?{F(+^Y8%9d*I#cMx%DIxSOcFYA*E-22oF{&U zc7xcvOR@(#h@T&l?0Zh=L=WsEuEThrxOboATZ@EFeC<}r){C&_dXX?s+#@-TF$=I> zGMF(pB7MO6&r!xize`xpj$+K4Fs=dCKQQ+IHu9Y?_dm;6Ig}^SyIeA<4QnKA@a&<%vbK@Fe0qwbgl4p@;KwpTl5iqa5ozeb|>%>2hpTx7scj7se3-NdS4fI=@9ndb^ z0=}?G@>xyj#K#|%Y}|>paqwA`De)DYCmvoa**gaL4ECVhh@VfB>_goq3cDqkKj{RX zVPLkwzlg7$BKbOe6PPCkOO6jmKBG+$YZ>#)YXxEb=NiVmVXq*pzinpBo3hB~tgxO# zegXTYM;LQ|H}bg~wU`bZ!Lx@Yf5RA!IF7L|@z+%j7@PbR^TTlkN$n9~0&Aclc@=CT zJ`BGhZr;Zjm+lvYZFe)qPcIjQeeO=l>(R#%=Z=<~vsT!|{|$E7j3d(4`Ltx=<5+`x zT-bj@ei3&nFBb2U1v-7oF!~x7}_)c@JaGMqUwP@0H9({RGxC zC}-lEs87Hituf}pdck}fK1FTGpA-=s%a{oYK6RYP*zK%APcnWDIwqVRjJXMt3bE>eJr*Q;Z zrb+H8;5T?=mgJ|`2%9*5tK@<0!Uo1`+8i*hf6Z}Wt{lTyKiDYzD^1!Z}Eg1)&CF-7+jJprNF^>DuT1Gz;_5ky#Rg$f}RYGp}k-b=Z7#i z8#-6=c8t}5`6J{HFusU-Pi#Ov1=jn~2Lo+yBctOv7s7fa+Ie8lL>~*xdojiY+RxC3 z6MGPbco=J3#81#}6F)uSFb_wtXQyP>7NHTlF-IeQj4~j8qDg+d1HVz8XYQBGA1riW ze(HooUnESzKz#+qCk{z|jP`|j8b^S8GR(Ob2m|QzH!}7qYXo8KMSDX0d>&(8iu4h; z4w0-tnu(91Y=E`+LdjC(2eG7%F@7%u^914{e!p6BxLz2t9@%%E$_pl}a ztkcIb#+fK5V2(uD0y~3t3>X>ANhY(&StDrP7#E;{!E8MIHD|%;5zZt3dZc- zEeLHU*2jSU(z6-U+9;T3v%)04vRCryhf!xA7M5{_!%-ZM3iFEXjA5Z35cV3zJcPag z828;O*@S!m)(ayU^E2}VgL#BWeC7#8f5jF-SnuD?*r?$mrv7|enZOAQL*xorm+p;K|9e(AA zM(2D_c6hc{WHKYv>sO4gsi_%XGjr&$Y|Z#uI%Ma#3KK|1Ya2WmsuSu{Wiy$flXJzz zO*O5pQ@S|`WMX!+#U3RU2VAx$9`L}yYGVb`|lz0I+yD!(2P(lgg7eJ9%j z3Oq44RepgAsj47cvaKc8k&jPTh(u&)&*(tff=WEWQtARCmC{#9+_iCXZ%1tU%CAR+ z^i1}rEug>?b5rIQsF1D-!me#~?TcblRen7pq-U-_RRIN_n42oUK!sFQ5O!@tee|cl zyzvMXi4O1C?N4608c)(qVVO*YL{^q}?VJ%?cEPKmp*(Z_3G)T^gxoZ#mn$SERunc( z>ni4o`POOqmST8gA0-eK7S_(n44&H6-dSwQPR??-h7;41Ov&-q2Ve8Z#{WgF4?5A}+^s<7~?rU{+h zy~UbBA-5#kns4r%-_+dO-qG4Lzc*KCE#;Ha>7)sgTz|vV@inu()Fh6?4VOG7YEjS< zVzr=(=zM|G#hDqr2<6sQ$a3toc!3@XJ$P43&UZH3Q*6yC#)VPp{u7jIlr)v#a^x@ofR|t)VO(})5Yp}8*3;p z>(c3d^{78GMQmX66wG7l_E%{y|X<@J3aw-*JfjqP^(NXstKAtK3@~(O*K+S z9@K+*XR@4?bKBu`;}c6DzUfZ&8fa87rMH-R%9uP%iWuCP|MO>7d)JypC zF>!>x&?#f}hE^1R`N+yW8yM@P&J?n-%D7UdNS$(2pPyw~Qd;4qRn=6Uzrm~ho6kY* zC<0|sAb2$pcghq8r#Dr(NKi>i8_K6QRasH4CZ!!b46EMxyx=M0^}LQ%l)GE$bfB!O z%BHGgOO>k71+|1Ne%Xpzif~@)+&0i(d)%{q&q=!Jx~Q7vyOjB;*7s_iv(~rj!dg;V z5v<}>xL)n7ppuj}lvnVotSDEL(hjepR~5e(JY~F|zm*yUzjK#P_pf)C)Fz9K#`y_r ztT)Y16^6#U$zq5d@K&uNef;h{9bW}bn+Ts0@*TcUlPnd=ic0!`Y2$Lo(q8pQW2qZD zZLGclb#+nuR8$kcS4G{9#$RXLvyl}vO-A)`be=Yu0LB#M4oY1zv4P*@aYZaMe+!PhaQ|H(gCoR8$kcmsq!5IjOBppGLfC zGp65Kn~1S*T6?^_RxK-^s|Bz2Q%kSreJ~1tp$D%945-G>g6(6q)iZnskhUbsTgU3{ zDc4m^{&=lq^_F-#ss3|3h*Y@{cM zTn!bG1>oH0P&FnL&$Qvejd5MwOQtmUbamv5`7AkkU9RXpr0IV+GNE*)HNU96C7)bx zVtGe19yOVq>+a6C#+xhERuay%Q2INeFkV|Fu}l$Qy4S4G*( z!d&56>Hr`aS6ac1QkP|rUr@(H)m1#0xvnn z3ZaIU=|Js_c>S`nsBAsxU&=!@_HsSEf~!A z#L6&reI5aZneAy{Q z??Nr!O0I31s5&ycK&V7nXwIM5(29iP1*+zziOO0m`$*YUC%?V(r84oQmoqv_NamJT zbEzj+CoH}f$Y_XCK~&mQ5>mQ-gdM-QyMQO+m9ik)Dhg)`UDr_~;Ry0We|T0xDVS&h z^qC#;VWR~oUipevNaX(5W5we1P=3q6>PmD>#DM^mzSzi}A!;SDI6Z+VD{Bk{kZrYE zdU#vNNwx3&2yWBkCbK5EAEXXCm$i|w7gUA^2Bm$J+M++Lgzbl@%hg}Gv(eX*~u`BlWo zWbz&Ph1?ma1*SHE(E_Eg!~Ah8?WY?!L?Tn9?JCq*mA*Ih8bfk0TPmPTJ*eGkiCMS#@|_>fEB_Vl@R~_3}>| zAEGl50<)Ohd@r-zcfd)?_ef_YvCPtZp{u7{QG=S+SeYmd=pU(dZNiwzH*ShhRwf>$ z7k7qzbEF7;C9zCbXTDMb<3u9Dm)Yx-VYsR?=?JYQt7Em5q%!#>a#4zFoa+R>vWt-j z4_#)eV@jx^GGUBFg3cQ`@Tw#ju8UkeYUmZBF+@CEFWf40@D-vnAR4YuM%?$|S4jMQ zRP7&s`SkloPs#wST*@~BE5Gb`jXF##7b=aTyawos@mN(28ApXkltK>+x#)VWGsp`Q zk>fC*Rm$*)2V!Lxosn4Cc_%tK6f3*xjm63?IRQ(9u`+>759ZNj<|{pBIZsa{cs zB|v3*A94vR`VFmx?DXy&-ZA%vr-64dqD3&TkGKej#Y&7i+e{)Ft7l=KWss3=lSwkhS&1RIuc38!@lzvydX!bQAxCj5G^ zu?d%w`x%vAqk)%KI6bub9w`*1LmgH|XkZb!N?)#CF@V?U!zD7EOIx~nJBuOqscun0 zD$|^w-`-iKqlR7pF2y?mJ96+w4eAC==>tZ@#dV?-7y9F#Vu}bWhR)XBTE8sP;&4Xt2BbUjTQFwk2>)*sn*l(b{P%yT|}&y-FD%DbdAEF=$Q z0-l*XM5ZU7zjnMjf(Va8nRccKq545-%oFcapmRkUx zqnGLQglRrpQ&@s_xJ)QI_Y;Sxteq#$fq_URi_|diO4zP$ne6$Nn-S3xu+JYlI?Wa2 zq#gV)Mra*I@Un|xVVprJ5`_Mgl7fKvbJ(y(XA{Kf*xNi;klP?C!xu`UKZ3NH2t&$vU3)2*x+Cp|(K$*eK zxt{ixrXD=WfR9(y&CCqOT5zGMSje?wL()3=R0ifQ-tG@|wAl#n2C4ep$xx1*xRUmz zon9>Tw$QAjm|tAXVvq5Bp)=Rv+~#%L>+l_Astk|P9KW~)Pd#9#(^5Pkk8;OL!TxeB z(dC#x7BzV4xEjwQr3A_@APqj*5KoM_9t^4adC7}?VO0sFTD=yX-dL${EowZjC1J6t za+!Sl{Cuap6V{WRROe=2sR31oyNP5Sjk%6q+}cf~FkTe-?P-yZHwXIMsO!ijHDq*N z$4b$i8dX3UF^61%wbN(Sh5BIGg`h0?VEi^w{&}ijVbahUyf3jRKPT&&IlX3f<)E_t z@V(PNLcPJ$uR2kWUE_kUyp&xC%R~PHPI)fL>%ov}t#E6PKddSN-%@Ri_N`c{a4l*) zt|eiysd7low8qQA{VsSRD66iu2GqzWp*yK(QMF9)n%2;3=ucJg@t%13g@Ek1C|SA? zki9HQmM#Qj>!W1pLO@nYp5I=&5Rg@FdiZ7OLO^zMlnrztAgk=`?$=8f@Kl4EzpA}u z7lN`Al##bzn66}cJKN{s>s-F#_C2%`Ef5+OpIq=F3=1m-Lc=yTDsT3Lg_Q!C%qTB6 z=)JG<&OA~8HP8#|j+R2kGVxO3TGaYks>dO*sd7?N)8rY$-tmr$FD=#Q==KHrDoe*} zRpVFfjMA&hqb;e2yX1=aVou3gWrZy2a(KA%f(z5`Ng-Y3u}9}s0$IhbLVSAsm&3z( zmb&>`N{f}lt4x|f&Zz$wi%c6jZlrg2Lld3;?0Ow0S!Swsz4wYZ?iI73b`mY4ua4nT= ztQ1PN{CafBCXmG_slK<9KR1z`+}=60(A7-OQ_Y=6v|9xT?@dU1%YcWmc>dtwAL!%2=sbTfD}mo7{KXR6g3AiI*0?f`kwF=U zTrDf(7?~IwLdrNqQF$3h38_hUb1O0fRAH1ugwE(PP8y)1Zq*Ri>I&wlL6E;Q+FP!j zjNK%>5tVN&8-5v20p|+EZ23iHj1?z>@Lk=Nf=5cwR~%-vFU(W)J!M)j(7D{3btVyY z^-XSXDRhPCQzoX4x;RNsTSrHGLT%BKuD0p4SiD0Z$td@}0I$D`0jPyo|MYpcWgJkBl zcec`eYf52a9$PH*?6(!WG6u~%M@pt5^%6p2rDz#|GLX+Z+@S+9K0)&Ni>b+a-)oe>DpJ~B*92N<~ z)X!E5*7s4iRADkb*I|>hQ2k{8FkicvNY;7Jsaz%B_$Gy3p2}C9;zjXBdH0eTT_H9) zOQn7r6G|u2N;!asK=QeTSzkURiK8rRg&5(t@tYdT{zG-{OVmCq-lnRxSFl=oi1Ojx zcr!flWO~ao(djl5#Znd+Pwo~&9Z8Os$&Y-^t(v{n1Wg}b<>sqTHYHS#vcYpJh48%M zN|(T$l*j)2OI>BVq<`TF$*6i;Aze}7E61E9N7Q?+{gNlFu(EAVs!~O-hN&DwqSRMi zD%EMPY;`G(Ra+LVA(QLrX`kO2+T1ApmQqWS2jKm1$~#SGvmWo60NPR~PAo!?e5FdU zEL@K##yjkkM^x(X6;-r-Tm?y#TSq0CQa4ah(%UyDE?U2ZayObv@`*G%duynzc4@1h zmVgVM9DaB^G98F zOp#lLL-OZlv^eVB9bEFY`+MVItAt zF+g`V7owG#Txl2g26Z1tr8#$(%F1F%tVo?92et5{I{x{mGDnV+j!vPnc;YyDWEvFF z(i%iCQX1P(GpoqDYMoVx1Rbn*b1VpkDw{X`h56iP)osR>)pQ-6_E zVFGcr&km+Kyw?tsa@HDUI_nEv3&)}1M(kY$+@*8daK2e3MY3pAu+-f&Q5m<%rN`=2 zR1-ff*Lb@vHccGnO@68{B}^N6mh%lDd6?RT=}9R+=)Mbv08WlL3rLPdzD3!-s^R<2 zrQR;w6q<11MLMbi%6%Zmwvx$Nb(8|LygNpH*NRp2a3z5^KI4SY*F;_p>BJHV$LaKS z8E!Wdt<@)vJ}k=CxPCW9m;^ESEOHZ2(Jo&o#1U z?P0|ku2qqY)P}|=y}99mBIEEk5$U6=7(Oy)$^mupzct_7JHM&9x4omaX?}06(2Cb% z)7w*}R@C$Ga`JBN#7MxWLqo?^nWO>aXgyRqYOr2W*tw$>B3D}C^3pADX;qMQ@9Tw# zVTz?ViLVcFZtNut) zxH@}x*EM1!OWN?FC%$`xagExEV_>fgYwXi!^Xz#)9g<0n&a%l{PW>U@L8=$fe`CCtkUJXgPO8r1_h&Z`35`j z+I*tuslw6~*HI;uub|myg==uEExr)Qhw+Q@*a=kexDba3$OQZ$a21J`UqEwa80=C3 z8L0u@5IA4v3=!AM?GBc(n-{_K1?3_%`En^%mroL<6=HFm8zd8t*XuLEH8#!=UjS;` zLab1hfujX7Z8<#fo-5Gwu+Y+m2UXn#fa!P%Sl#ZjvLNXi|K8qQ$CScl{4^6D3s0yy zRWRgbs9y4nxROc}C`lZ?LMWA5#aMj7;JtD=YeMI|E-&+g)hJddPKR%SJTfMd!Wf0V z+c}{w8!qPmhF}ue%)CNA@2o3D=~TxWNySU6YqVgML@}?|B{3x9bm`caNG32)D6}km z<%oJbsn=V;TLwk{!(!D1hNp!`7Vpd{!X${n=aVH@t`vta6y^pslU?V@cD1^9T&Ht!liV)7|Hbi&% z*fvTCwSQ($zJM3Nc=Iav=oJ7ub8pg`OgM>7XVj)X@Q^^c8VY_{$#SPTk9eZKs?enp zEzc>r8Dvb6CJEw{X_#nvp+-uTteo1BEAnO{UV&CLGf^1F&QRHML!-q?mR`}D@6D&F zAe93+HkJ#P8yF#znbd`6{Ie5r4=UeLQIeG>BG7)a!RX7B}JJsa3*aSb%0t`STDxLF1}e8<0(pUhQ^y- z1IM1CNQ2R)4Vp>owrYe`g)OBpedajB5Z80lEAUdAKCBaYDb49Mpm!_xrAkwj#33qb z_l?a;Bf5C~zA&YB9lN5;FW|+9G#yZaAa4H?B3j7~6z%Lf>N;b1~}tn?(5bbT$U zd_tR@funC7Gl@k?xP&qJYJr=YMEU9qi5i-~zPR;@>Vl_>*JrYu*ffUw6gd7|(QyBq zP_Er44TMsZch$39^W8Zne420X%C#51f33bFogzepcI8GLo`t#6S$|3xQKi7{J;IP= z1?~`*BBmLqnnLG>VKo})>Gqy%SxDbWNLh+bV*C-_pQBk|k7T53!7Wu*; zPihK<+>#!D)8v(Tddz0i@A1;SMm7~EE8ag zjK53Iz$!kKRG#j7VgJ}g`E11q{F9#4;i#sO(X@yimkN{wec&0}M8O4|zm$i6`lKYi z4O|R;w<4ehsyitQLl(0|H=iN z0&|N?RhLX!<_5-Yak&w4S*A+4;3n6tUzAxPm&3y;$&3rHh{@atL{K3&Doaytj8n}n z_l?lYlq%na^4ti$93DCU0bIR=BqDW#=nu z{`2bgc8gSx7&X$eqU+7Z0H8Zevy!!as2{VJ`L_y>lX;! z8PG4{<$CZ19lu=M-E6<4zYQt7rqq$ZHJ``OH8`(7yUUzD{4y$;|3Xs=SJ0sl#iH7=F4?t{9)iiIaC|2ru@*%oAaau^N;%iq~e zsGkb-WJW=^lrl6iV6fp8?%OY-Rg?p5JTgxH}(1f${NTpk9 zk*61P#rB?JdyBh4E44x)SLtc9!aQ%rFid%(s^9cw7WQ^z`Ee0BA#q+g;#Q&3`(Vm9 ze)^~-lWUb9p}8u_H_e7+hf<^E+tBV}oKzk=?KgdRIJ23iZFtt5H`C=$o5W{K0`vM; zDV1Tdy&I1O_0`5kB@6pkX{NP(QG08thH?2#=GhavJ-Eqr788WS`<>~ z{iHRMYwl@npEoa!g`oxRm3KdC#4Q)zj5bB3sgQmBr!dprDffL#VcgIPS=XN`k$3b) zWZ%0OrE%;}m6?U@@}tXrX=XgH>nCkNtLSZQ?s{ux4Iieg3I?Jp6AS9$A!PzZ<#L&Y zxyAihJNrpn(5kWwa9Y(sbY)^eJ>}^SR}>|Oc}HujkpH@K51g4UPfd5$+FBM(?`_5@ z`q!1h-_uA;9^JE(dpmHB{&mmPwJ*XM`qw=J{qA4{SJYo6iB7f&|0-wLrcRjVo|{rY zaQx%_CXp!xPhxf#iO|2U4E`n|KDg%^yNWnP|GH-;$fgQs-M<1?NQZODi*4M(Zk(on zU1|JHl6-K_VTBK;=-<+r++sR|e@kcDJ1HE5Jngv7=jhWuS z$GX`F=eg1GokhHbR{CVT_w**ezQuPw+?9RxEr6=Sr;FLUZ=y6Hsp9r)pwaKB-qMW* zw4YPQ*N(@|P{U}`tzrDx2xY#WP@1*&1hkHGw2lkann0Sg4jUOX_A*E9WnpR)iA%jf z1L_^U_2GIGh?CxnhX(~|+bzo6hA_Q}#HHSOf$W{^=$#y{H-R|m9XTQ>*y!kO4AYxP zoaXr{d@P|fYYk>@w2zV21k$86k<-Y=B(b;@3>pyaV{AqOanhT}X*_!qiA%jfUx@ZG zHY0&J=}qJ`p1q00sqatWV+o~MYp@ieeT=jwkS48Zd@QNB)EhJ)+Q(RL0&&ut$Z4E1 zODZn)CU6>6Zvt`Bo5*QAy@|wW9G=FB5`*OC54|kYa~fRl(Yv+B--Cx?FmA-+SB-* zqdrj(Pk+#uX#XqePY}e_pT-Xz{fUBj`V%;q<2NP!34*x#6FHh+f1)56tT`v~GFNpn z=}cE4h0OlxD5LQgD5& ze3nmI6G)TRXs0QkbIK2|=vJyl6gvK0g+Kq4nBPfwy?YI+ha6@)7j&%^x>q0tD1wuEb?N3H6sN;f9*#(?P#niD~&BM~js4|8}KZ z-BL#V3GYIw9KBPnEJx&>c4GEUxN?+^(%A`kd^%U;CkVpNtDzeC zIn+Rqz)4rW5&IU%OVc~Bc`ecyJmX5jxyEd0+2PJv9F?;dJ7;lJ&T=tA1CH)lSjl?jQ8~+caaPfbU#wRi6m6fE=ehDrY$^oK@0;UmS-# zDzdB_XO;Be7scf2cK%kv&>1%l=kLH(H!ixWq{q?h#z|L|c*mjPqw=CkApdf;A|GUx zbN*1yb3Y>eNdDn_!3-_L*yf;*Q>z9QQar&&{ecp_bP|4W{hjgw_H0TUsyPf-oPrfQ=40U&ea18CQO}FdjEo|V%aHI z)=2^91gFf)32F){9zNo;v6;cn>pXQBIlzkS%yD=`sF=-W>G?^14-5}jlumjdN=P3v zG`6M*-5p%i!5GyGv9YRxKAY7G*upz9t@sRFSZeunY|NZf@u4GPEj9k-F{_s<#IB0^ zQa)~xdMP^X_y!+39*jK8&A^V}-n9yL_+$fy_^y#9!)kh#bhgOXDWq(0%ZKpm^fqSr z73uZS*CVdb6Ujr>XGg;$@Wk+RS%?MnRut5DVy-!fgfYYB3YrbktbC)Of)u^CRj$E# ztI+pSMfnRX>eo;DswT>gCizy$l-^>@n>53-O_zJm4M&)gMpGZHQC=JCn=zy)b6u{z z*n}N;!iuS>QB8RQ$qL#O%j1=?Ws7nh?XBTvdGBJz3q{m0empWs9a9BkYndvTpq{DX znI@DXZ(m+k)q)>}P9W*FV|dVYAzmSJI?J$@EKI`9udr)wvSe!)CJ`CBybX#_;t9IB z9gL?!t5#9m->wD4qgu8wIjY6nTVPO!_Xnk;1_klbu~MqT18<uLe)FA&eqeAoOBo~^R@br20zc-HaY!;Ty zy9!h0VRwptuWXsYi&%TM0ekS|N}nTdaJt(ON{>t4^uIR6mmhUqz0Do!=6?Ot{*hJY_XkN~XHNNMpJ1CEZL3dZKp(XS>5}Mg6w-%hO5KLsmboc?lBC zAM)$dgxjwK>I6+)qJZ?@W3q&=fBYJog zv1uN@{*rHP%Jmkz{24R5sgZU_oXJlox?fGj+M3rWSFfOA+zkzVi#jrV#h9BW_BGX! z3M$4ud2-)U9T~o2%)AwEABs9Me8rg2Ine{Mv`#*p_s;Hv6^V5DEyB2?4$n@s1$;l! zf1F{C&-K&lD6@c`!SAC1X;hTOUmB3f&nUUwZrV&ptHy6fv496}{08uYe@XozO?ZFI z^Ku<{nyU{{r&8dLJEYz1Ytt9ehE$BVX<|gkFrN>xJ2HI5nETr7Mc7?2UV1_`se6Sa zI4XF>czx|u-)u;ts-itG0ebrI{f@q+;bcYcPj^%+ox=8%D$3#yYoyafpF%@f>`~2g zItx;2!D`evtkq!Wqe<XP^i%%J)DDa{|Og?zh zSdopElMBINuN|ZagH^p~Y4!GJ1u?#8=@_;3t9CmE%hzunTOHpW|U z{O?DcY0LG*Bu&1c(5KXS4*cJUO12HLDe|(L$GVkdv3FWmZ!uB|i=F*g$NwvFWxBCO zQk7jR}qWxM~8BP&GY9C)HbQR(}E2unC0IHd_OZawSxY^EEuKL*NH#J@<@781D zM$6cq3;)mJmnomn*_vM*QDU5QJQ5vidQ}Q2?#l|f*7kg7aeQ}A>A{)onTe|&15X1tF|YSRWz3EG*g3`TC09g%+pv= z7B7ioKt}sp$fKOU0j5cIa(;lrg$5M{XgK_A+@ewRl{EXK2rJyL9KPw ztEfKyU~4hL*UDC#s&K8C-*_41KH9=F8mt4u!E%MBY$NUjdwG&P06j-lWE5D(D?!$Q_B~+yE^ExBI&&i_|J={f)tnNTsAyK%^IoaKXiZhD?uZv3m9nS*C&Ac$-HmwTnYqn$nr#D`1|7iwuUr>xRm`b(S! z>uNgE2ZU$#b`~4EI>{O*B6h7xgAT96`k)~*uf4O?A9;dzb1RK_`d2CLIr9gTOMACu zgWo!zPS5^$-`3621Ag9wpxWTn20EL?Yy9tGm|il#3ruqqZzsPhU)1G%003{3*b zC~dw~@1%+&0!76^EhW86GE070a5&n4(mT}=riTWpsNZ{0NbPqkMG*+)&d0(sAC+C{ zbew5Zj9}?$xKJ6-N8JbEqQo-2-Sli_ndg&3B&e|J6XX4$sn6EX>MI_c$>$bkeNVIZ z)wVLdnO5hi)R3G@Hpx`8u78yEhfQS(mEG7$QSFX~%Y8F_4mtz-KB?-vJyE&WXY0xo z_lK?i^@mI7+4b<+(+}oXj?0-Dl$W48L%2BW8x=>Ji@p(4jJ_zU#uk4H%iquLS9`07 z3?AdIhm~hd(h7$GWR#1X4CVb}Gd=ip60HtVkKUQLMGSF5zR5=8NVUIDDxT@+!ack^ zHqi~$j1Id-89_;p%M6~{g_|Vw@Rr);^n)g>jVz-uSvKp8 zlEJePNM^`YuLX#akfBlf*dDZ0)7gMP@CcF8OtCCH8s6C5NB9j6o(Fr9O%w6A^D+^( zAVeO>_dI+rB0H1ylOLgfej1E#wr6(CD=JD$@0-L{uPrdsEmP!`n}4nwCYWiV?RA|F z#4k|lmpy&Sgp=r0Dw=OvnjnU;4H&B5g!zt*Ia zMQ_j_Sl_BzUH{lsmfY|)uIj8TQ%-9M_3il%yuV)V>yWNV*s*$bH)_;yiE^{;zZ)ry ztG!zp4P8BWCU2oPzLK|5FrxBgF3w&#f`9ST(lj6TyrqAXxucmfYj|nfHz##QDshsf z8GVRQY3QKNbKNO@MfuYBCPdOVuXTqvk#b?ZPlzy^>$I-OcdvB~=_L~dM+)X+JJft( zDxSie)YWn=wjC;st$A-$d4pD+C#MOL>FrD-?lz050+9!g!&G*BXAVyRw$|kr;ma)J z=nkrylm;)e63ffGeWXs+G+P-c^S!)K0kTS(qK5Tb5q_QgH7u;MP7))5JELUJ^xp37 zu0qkbCPI&8*5gJwElyx_d*8%2WvEPZZ+l0PcBjkE$l_%Qh z9wHKg1Ti8KL=q$NM?^$KBuJ1TCNYVa5JE5#BuGe1kVM3oN8ayL-H)n!tM0AaACvf( zF@>U%UKOz{$(G1DsX+4e!RK)DWE(GucVrDlzoOiPHH&tEN6&u(tV z(&jYkrec%iY~^uhvjb7qoKb1XIpJ32AU|Ab$(&BDuu{&8x-nH-!~zI!oQkeaq3!fR zRkk5@+Vys!y0u#0SEy3kW!Sf zkDCvg4H~U9sx6^f(K;*0i%Pq=Y($jv+K$*+DIA<%hOL)UNeV9AGOEvyA;1~5 z`N?&|>oGPT7)~HBB|k~t+N_jf3nEr-C)_jwQry3TR?wNMg;e-<#G<}o99@KxCS2JB zcy+VmKt7#UZ|*8LTeKg_1THCUO^>r-YUz+|>76#tM?tGQTCFVAR!`YH*uEH=7Z(pd}XCvUv0Zlo;e4lZ6BR6 z{eZT0>V{Z8p(k*v8}FmeG&O0clDuXY=@YnyA{A z+-VdmW2>zxbNePmf>yMI=(g0hpjPA@x4u%S)U1`AupxKa#o|P>LYvY}0ft;|mefvx z7Wr(h;nDzinA-#{q;jM`TgE9KH?sf3Z{7M*2j5+UoKl8Z)(&a{=f_>gj@L-gw&djJf^n{CrN3;IgbvxA^H)#gaG#(^QatjL4z4zW$wEpUYgSklC+bbz9U&5j-?H1w+*R^ zhcVp63Qj)uW^Ab5Eo_raQh_v6Bj4S!TBZTj@j|t_uYj31t-RSyFhklOo8K$7U7fN! zGpo35AuMQ)-y@<9r6v<%6Qi8=qEY^`V=GUZv^Q>?{B9t3z6l+Fds zLL-dC+bH)(s43gBEjj9iC~3dq@#>9nX+E1xdqrA#%7eferQpC^X%S~S&L~3P3P<*8{k!$K?gfyW_8t9#Jwa{plOEifR&X&1RIv{oznXX(rQZnH51e{V> z-d?UPwU=>dg8WTHNH~ar7cOGVIouYwnFAvI=evJKeCz&>z1%4ol^4+7NvvEKs_7ot{@Tm2_dtBh)u11uG_)~f(N?xLne~{>e z{YZ534-(xR`h%`0`b&NTLn^wpX-@nty`AEFYz3$LxAYbV_qHo^z^fn#zIrrtEbtQL z4zJjt3jN^IHR+NynNIy7Oh;+){E3{JHimw!;ehPTCEg}^!ueMnje_a& zX%K}p8C3d3!3};_pu<0VJX>%;4_DH~R=;bhJY0oT)tQ$chovH-5)@xNJpK(iKY_&& zWpb>cAM|vdV3jx|nHwpmz|mQ_yow4;G7|4cPlDT`hZuCfdK@#DF6QJ@ZSL6B?;aI~ zB5P$%#&f{`;=P}$Roe4N`wUiB00>J&>ZGamXOD*@c|4$1zIrsX&GG?>M)~T|2!F&S z*V=WW=91}-B;`ksUf2%3LhHNY(rbS7=!s&!PW12|fL6bwm(OE>yx3ihzSKCLo#WK{ z=jr+`>3CWjQV)+u1}Q+3={a(};bPK3Oo5j2A-bex9GQzF3rqq_pe00602<|#A(D79 ztl1MWiv}j>F2xhkxD$$wf)^$CabJTdQb`{h(jaZT3Dsyuz|=v=OI@rx}Fx^ijs&n3=}Y@idG zcTUM1QZoC5Zq|A@wbmYojn*EmeV%w6gl^E9=k10Gq4;T=58CENilVn5RiiGX1ZTBy3wD>}VI78Q@)n1R@uSM!iV(m^Wm5D`vgw~BFExH04ipKc zC#bXm3EzaB=F||8pgs%p(llSEd>anb4W)<%a^eq(luAf~F_n-+(nCpJYP?J{OYuuc zBI&Y(B&1N1x)SE42_@v#OLvLMX`R=iFi_|ofS@jg2}239w~8>3C(%nCFR?IDNSesT zFp*uUfmezo-2|?YP>P9YODh+*XX_O1%-%6QIv*-Nd6StvgMz(bA{BBRxwli6F51RW zX;r!cK|ZBl^BNOfFbi)&Eb*QI8xu;rOF*N>4}_LZX))Dt$viXU6MAr1vTPT#quCl355nkg z9`(dHmw|tMU$|u+Ynzt~Sg(PcmK@AZ=p((srV1>lpm||ALyLSYDzB1SgGf3cd^YGH zy>WF=mURRgNQ5B`q&EtLFMoVqB2k!?H!gEf6FuPyl?}hMgblVl$6?zz@S>~h4(TXF z?--=6pn!vw0d(>r&gkk+D_R+{AupTC|DY6O<(>#@Y1`UjE5F*VR6S4D)9cy#E=SmD zC<(l0+m)f=R_h;Bqdf&iyFRGl+-maa!$GlrFVeN+^z|% zid^w$Ms4y=tDRhRdkYF3$FPWZZgpSFGe3(t2Ndxz!Y_EykZ%mixaYVyvlB_@B~1%g zDfq*6)HYcvRg11LFe1xOaL9Xl%-LM}BF>mqG78txjmSmXbKG8PD&<}e^(0h>mX8a| zOPQlO>r?Ld>jSbzTWVq~YKz_if~pc#wl~07-MDLliGRJZ8&u2vbNl#@{15MUcYz$O ztf7`DSY=1fpUC;AM?JxBbfbU0UpA8)-n9#q-e2VXG}nq^FWc}4Vi9>{%Yu^7G}nY0 z(2^)ctAS{A?$F9gx!tT3^C^Z1b&fCGfb<$0tM|80jB+jcvVEymYTksYZM@{L8Pb~F zX<^ZJK2X%H9$j_wgL={*aNH7t8@&RZvD%-~+asO(1Fp^I(Op|A)v~*6U)fZp%Qy|S zAty|z`lLmuafg7MxzfRH(HDNZC39GLSZN!D*GhGSfjy}8^Du3o7zDZz)T?m)IKRxp z6#UBDXLr30q2g=oawZ4S24VIKaW;(OXC!noLyEks6 z56K~SjzBYBKDd?iU=v*@tf)ug)MW^r$E`>@k$kbK`(90GXUuL6L!3F2A#-dZl+WP| z?gYTi-&od20h2C)aFNX&A&_)&`m39rbYNezhWSBVzGJj#r%Shf!$zrr=n@4xDY4H7 z$ljL!SS|KQr9f(^nb8ZVus&FFnOdWf$q^~k3~AK`pcv)ZKI_K8(&(qDr85lk$a~qT z&(I^tp6M6ZHy?%SfqFp1xaoYF9z?>}NsrL5FL_^iN4@S1>`YGwiPybyTIc&?kQPB# z()H6lLUS7R3)1AR7_>ExOZ5oNDIe^5ST87z-hd%~UrLixx_)e+Q*XdfdeuU6zCMoa zc4>6e){qf-DM0UmaawE>ccIRb#=X_G_rOjAvtiz-yj5k@=BSdPy+g!_N=w+^v5FIM zQ;e%@=RgIo4S-r zTJ~_dNf=41E>T3=i*x(@VKS@mAl|+3*0)!fLPJzsZwk_C=1!-eGzi8u>@6m?SOzYJ zso%VjRPKI+!vux=Eugr7zque7eLYCW0&K>=9u1;i{6hbFzicVA=*p0Gfp$DgU%dC@ z`}j6%{^9>dl>`AGIL5s{y?1;>m=_@4N?(-slzrZ7{ny8*pF=B|QeNEOQo`^7FM2O5wAoBB2qs%bR71^zOc^Xgb zV``Km%o$|~tcMv-9JB&P*&6R2M;jm-C2J7lXnD-55g9Trie+P{IEqG0$h-(8hKg1J z%*6|G?IW4c!-^57V#N^hSl3%vi>0RM8EYz^zw|alq2bn4yAZce!DHHZ*{D$=ZeKeM zw~riDwGg*Y;n#`vA&O~pEsG-!tXGexF!KNH<- z*6{lzo~?!x8>)k@(VM6YD83Zc+(Rfn74A%I=jA0t7LkNJ=HDqhm#eH@>OgQu{7$P_ zsFrc0hT9-ZA*OlgXC@(5?3`myopAWWI^@g^fDS`%06I zx(IXu%1es&1>0$px{LK@s%+J1D^1_@6w_(ox*^)XgLT6^Z+on4zu+;3P%Vzv58#lq z0@f9HM;B0=$!Ep*!qU-Q>qqif0uearlw2k$yo6%sC-sAN0iWEf3~jM9=os*t-G$C_ z0zREgXS#sarckTzt9X513x`PS(t=Fw9s(U3*Ev!r#`{yWB-mwDZ)5hegqc~qmA-iI zw{D)E#vA_O{pQ;;UIc%8Z*kdN#OOh&{n_KehAs}ooezlB?;h2-YL=i2{~}Y)j*q$& z^q2R>o$3`Yr7zxlT1Y7UTs#o^!K0JPh4c*ynsHCBiL zv?)RM?+Q-MmZ<4CjnF)`maaoo$2k?8{vKRfiphtDcVe}1V0rOGSbqnMJXN5`8QS3& zVOqtzg>b~XFb9UCN!8L6ZAq(RGof>7Jp`|M{7xFW}Gs2mu!>Fp*6ap+5 z!?Nf!D!Fk8XP@^v%qO&Rx4%w8aIk}QGT&;Ka4-=6*POX&5W>=h)+ur(h9Qh?tyc>1 z-C^o9RI8S1wj@ow4|Bo-$w$kFVTTJ`q6l-V=9K_sAP!@Sf*~weTAW_o5M{bBl64-- zAR@r(36u`R-EJW!&Cr1{x(2t%=tCxs!F1MPL0wyTFdNtqy#X1y>?@Fj8lp8ID#hYr zlb2UqhV;AaJd!l%5*zDm!%d5450Mv+vr(p%_R^>|F`mjPRS*CMK$`t_F%&8{Uy_Nv zdXx#u8T1N5l!|Usu9Y=P1j_|uC~&V+3-<%h*A)PaF@^UHCemSjA#N9M=roZVqy(y1 z6!IB?4aFh3lyPW^vBk7_RsvIid8cIrR)h8SBCK(()jbYFL!jlAJhQUXQwI~F)glTf z9wc0c(=gH5rHM9J-->X=?*udEv(8Chc} zcproZ*os(6u2S`>rx8a+_FZmb!-)bTH@jv6kJr5kC<(zxMmUJQV^z?p|cBwK;O$b%B7ob>3>Ltx6X=P-%C$;=OE0omRWt7*SH9Uf5)K z?UYv%hXnwJoUPhPPTSxh2!_@%Lh7)h>i{IR8hMihNSW z5oke43|Tk=Tel8fX}2ff1vY9=L8j10I5LHYp^I^3IvTZ@YnOsyF)vMXqlmp}P(OIJ zUR}JNijCwdg|)hK1~k-_9)Bm-M`458IA^z}w-!@GLuB^uk?=R$Lp^25iUXk!Ct?0`LjpyMK zybL5;?~uo(LG~dE`J zKUOA|)<;xzySS_?|O7BplvD>TAc$p z>MA0!C)UN6f-faN3KP+aCNqIj^%Ll5g^C#|+1aeeRKQ-ht>_Jw^R6;lJ6|VnN3NSg zN=R)%8IPuP5u|L31&%Pq%RqfnW*%a(ePRb=S9Y0@Oc;w5NsU{H;$R~@u@d|=Ss?qg zPWe#Kb&j)vM7lVnNJ3l{V?ZM;qBnB3*z={E(+j;4qp|LfI}zGSJp(>a8+wJ?BFig? zzjjx|XpH~boqeQ8HsYRA@i@(Th3cDx%p;xvnEZekugCdB)Ro>Kcc43E_s4n7f-&tF z66THiTJboA)umBBkV~r=6O!m1P7wIB4!HxVIKqg>lwFAK03wi&6+i7t1AAXOPkILs zf&7WefeLndbuK+MKp=ax)>Vn8;tr&q%||xO#!2>!>`-C}-^@}m2Qv4F;gk-ArsJm3 zJFXu$iz4g+bK<%ejp_>eFyfjAMBc{E8GD>-Yf}v@dAdBLOFdNB@G#(?K$d7U3 zLA+qb6Vf!D?;aj3gP zEr!r(T_Bc%OEmmcL|(CidX+@xIFn*@T^iUL<|}+CwZr(IKc-|snS>UO_J-x9tMQ6x zSOMmE(Y6LOf|jEpk2$xN3_ zkHhmvH5Q#>5}6*y%@esE=x`)5$Ju6Wb;*=TXmUoyqYP@LUd>k}3DU;B& zN%k6>cz7+VSzb(%ljOy)I?lXxZY5JDp=p!sX&(=-Wi`u-Nph0B7*@xbi_I;`auW$1 zTny;06_!Rb#c4WJ4{-8K0B1#;j3{}rL`3e#3{<`+lXvr5(P9qIJHf~z)i$)rh;piv z5Jjr>RQgog(DE7Bh~>y-o%aW>Y3enJG!733L0N$bI_#q2vj^Bh(P~fON(Fw&Hp!=B zDo{kq=BHo+CM{dM9NHQpP0qxEd$dk9mTcjyKv@e)>|H7Er)d;jMqsL9;VgNlksWao zCN1zxf$EcE?scwFXtv5mb!q>@E}teeA?yFHPpXdBaW*G#(d<6v6@xra!GZM5j5ZG; zH6a63*Eq%!#bLm>C_jW#-=SDk2;VXvy z6EnS&1+emb_eT14XA7IkXoFfynLVX7!}d&i8Opkm4#e5;i#c4;GV${aM17Ki6h3>a zCBV*P+SKK?Yhqhe2ZstOi}-s9=`0uPHS7oW6!hxTNPb}(H=(3GTtSQ51EjDv$wq9r zImf6~H;A2R7s*2$1lg5x20-UP&&sg}NMUWd$#u8W64I(0#7?v`WP9hz836gMjaA&9 zPTNksN*N?JsW!?%72Vy~B@*px_O`O7SBBJCst)6bY?Sz+cpmRz5IVpu%2cYaiu3WFGaeR55~ zJt8WO()Au1lEBu5=g^aQr%37Fx_V&W4V^Tlr$OIAoG7J#?Lx#8Ik<>yIf75e)=2pq zOA~`&1wlk{7DCo7=z_?^iqpfRUFmkXNqf+=#PExX=jYCWYDG|qFN_4In#H5MN z3i47FgG#v*5GKN^&-^^GVHklnPrwnbxV5FPN!g zr)D(8fZNP7XIs!rSW=_Luhb8e4Zt{^RX&p6iq<_DZ4zE!zOYZDt#ah6I20|3*r^4V zUGSNKAPfCBZvNPbI(SRr0R|D}J3I)~nuq3vrV9tR*NY|zD6E+g{4*(? zN}i6%ZQX-B7(WpF&F2#Mm{IT>r8Te&5kLfQExB<5(0H?q6QBZ49KC~t>{I|KunH(b zk~>Fm7OR!6uWXe(cCX;LUN~e*GN<@4Q2iAiA`S8_HuYf~SMK&J z14uo^#161FEGmt9I_;#~>m8u9*RspP4XR$S4YPa5K)>|X;;c(PEnSzTD!6=z~ z1T4-a@PE~xcP(;k&7^v{+>Jngjz>+W|FbcnM6rf~DXm)@t6d5e2>Ie_slYv{n&|Lb zW7@yZiUfIKU%TbBZIC9!{cP<5iu5^qYt=o=(5|*&5ZI-!FIC}pf_{5%z?}URoOxoa z%kGWaK+ccp99b_b(P+tQ;;UU0H+#cgF6X3~nniXjH_R;VJmskpoM!5fgQCPf)3n?nH#0coS9+G@_1* z>MXj~Ou}^Pi;I{$w#+ldeRROdPnYjR7M)6;iqBcB94wcFTb9c>dTg@Som!X)Os_L$ zA#71SkUvLO7vDMESS_jOX{g++&_ zOGMIcvfgS>mse6Exm==aEcbwVi0I7$TUPfyYFv-`uiYCbD3+TpwD#vi?HC_#w{;{| z$Z563GSFVCXoO3x7tMF|R<#&JSGzgCA7j^Gil9eY1BUoX8mksd0(u4N&)wS^V&H(h z3H=nD?plQu9Pae4Siq2ik5&X?#fdEkAGTJrTwXTa3oLgnNh+1xrZwo$iWMduVsxT` zh%vfSz=!BWe$Zy}yoffI{?BqN*_FN>i|j6alugm(dB64{bsn@j@az2=66nx;e+s)B z-4(IjE)dd7r)0<@L8*oN0GRzBZ8i&s-08-^Q^b37d8btu2+j)b)Nw_3v{+bjW4(al z`rwYMiShwgt4MPd?Uw0huW@dPzon8?>me$%Y~p$-s!rmbA9rh6>b)XeWe<+AFb+2Ts?&vT!87Uaktdr9fT4BEqAc zU8BvVX@5I=$8{D_ePD~d2bOd#bieRluWPS>-SSVlpTH~s$!L*xg@p5dCkrcB5w^s= z9<5_QO&QxfEY*}alE_-QB#WDrOg6lL&Wbm+#Nlp43T9_^Zf1wuEbtY9NtzBz=H3yn ze(hkA*ub&NK?YV-&CKAAu%HHN7a4X9&UN;zNx433OlcTMdK_6C&amuoV}Jx5N7_EJ zATn0EriH3g~wPRYY9Z~*(MDVYlJHIKb5WIJLsT{&gh1KN;%4avqwejuwda>%- zp*%irCU90;@vO%8TC# zt#&CdrJ#=z=$_PatyRH6GyP3N-{oLVezTXBxz$Dk`#v$37b#xvo;7D(7ey1evb7cJ z;0_cjD_yeqNI@5A3I=)mD+Fn%mFmrzzSo+*%W*`zzA(P9Yb}apjikA$TEisuR}|Ji zQ7i8XnJ%1%b<7&CAYDUa&k(|{AQ()A9mn95nw10PW`8rsZEe>=6yM#a$#`mP1K&ei z1Ik$hPFTi)Iyx-!h9;c#9Q;H?bLNM~qdcwIypzJ7V+?s*9Fd z+K@VEz$%5>_DZ{*T=Z77*aOfAt@W%^{!oEti z(yriI;`m}q#p5hh>-!2-EWa2p6qm(HUJd-hwxFJ+;0U4f^<5ftsS>N;aSS2s?UkBQ zdn0}lQy_z{rPHXc&6rqXr&=%a43DL9-Mkg8j~JI-A;36NXBi7}cGfD3m2wG&QEwj7 zS)6Rv_6$yC1*f-J))p&Tfw-kvUlFU7(qP+j2`RIcc5!*MT3M>mjnKMWnF{I&*WQjp zppRkC`zRgZ&}yZUk%kXvAhyd@tYuzm)>j)?6V1C_x|GP}n~q7OX8i>AO7E_eu#!EY z-tdgFAeV3_%ax^NZ2`y?G5}7X7swmZX>36*;U;L{R!^=m2Tq`ukogKTt32kw@#F#* zCFfQq+Sy@Ke0Cf@I-gjzaezES0G`a?_EM)NboxpyfaqkJ$><#9aroW+TbkwbSIf1c z*853-*7O`1LE~z>4DU*#NwMJ<;aX4&RGd0osI@VDXoZ?gEu-3-0#{jpTQHFfv@fGo z8F_<9sEAv)#9K+BF;Hh|`66TiajKTPfkBEq6iprSMhfR_@jYx=L ziQ;ds)2Mx{UyTTevVyqlg@NIX|m$|O43X=TLmIE`j`5k1^; zDV^D-Wz))uwL>?$(g}*?(@Ki5#~3*=Tv{n{Mj0a}j!i2k)-q!R#qwz-#hYi0sCY)L ztT;1`krc-UIh9&_(IT$#1z6GpxxR?8o!ZiT1`{V3I5?1Mo2P3P^;QiPz~7w_w1M-lU~6Ss$;bLYkndLhHfCrcL4S zb`j|kCy!OQhjALo;&CL~hy~&nQY-O5qm_>eqcbssp`c_!cV0@1L`Ch!8`xwdhpIxp zEfdxL*=Bu7LqAGa)X+Qhn(`1r_UC?`tFJb(P zg@!wUCN1x>BX(`k2+CF5)y9bl3pmTEd{8VR69v#hZ@*kxpvm=Jaf;*23;%?q;`K~Byh@WAPFmD_+0|Q?5ba#_&z_h z!rQRFpNx@jKb4mzcfu;m;{)hnaY>Ram|*p9UoEf3EIrr1*7H%RdWG#)N4F&pttHoh zCh@`#X}AKTG`%)!8g@S#c*&ulHb)8K9FG;XUOT0ld!9j8PzqtJh6<$z8IvM~-ixlH zNfPJYd1dZ)rgTxA8#Hx-;O)bR@=Ae_yB|YO!#!pAmCj8XX=ER%5+yju7-GUi2Sf~! z2|AUU`Zr{Ok{n^`?iMfVSkDW}}0Wi!i>>ZnN-kT@_R zKG~a(s;h+7{@!@kic|CXnyT3mRWtJ5z=^DzpmL&KHVrg{oSjII3Z`eV!*@q6TnF1# zr-m$Gqa2cYr5>woUlf3U*JYGcDyH{_T$6ma=kHweQxhlA!Gmgah;#CGi#DqSMIjDxG!c2NMdbY`K*ENPCL;*q+(se=V;WgK9Py)i zbIPX9H1CTVdnz5*=@St)%HiyXtX9SIM#G^;fZHYw=sN+#ZdZ_`l z*E-DOG*@f7jKguNXiahHj0lB93$BPs&q%TsIu@3elcdelNp2dmSeS`RRvIpn;>Rso zQD?asNj9U;#?JVi3zVfgkyNU48g|6)>}H+bN}vML1uNel9mJ?*B>!~1@u-4674@CRDzyUk zaOkM`w5ETQ-b83$J0FyHkC^ih0qY$g=57iljan4`Qho2L$0nV>(r+=&1+;WmlMw0* zkWqD&kf3$yw;0^z%%}Qwh7$F^2;G9_r~^(hs#C^cH@VL?mdI@oZS;CXPbl`)XT<8)uk%Jc&Grbu@$)v6&rLy!J|XWK)9_2CEb(9G(a- zW{XLK!WU`@B5Y!~y(_;K7(`2Hb^0U=JIZlFmD{puWXP-aY)JXa9W}5Dp(l4P>LmG0&ws?^gG5dK$)sDXgH6E{tGVLCEOb}sZM0VyJORmxR@kr)2d9r2 zGOFiiko8lJyW@5((jqqP_EnO9Qdd8-%(WSu62uP$>!&C$J>vW%qaULWI`H~DtwNEE z=KHS*9|Pg-_)1F&miQV*8UjNhwdq1?ZN*at9`z*dIHVYplt&{4;2Mdg`K(f<2y1Fr zRti;VqpM_2SlXCegv0KCyEmR)ba7ypg?4%Akh(Bt4JG0}&~kBqeA-}nR_PmY|4U5Y zn#wen-*n+%r$rce4r5t$hwkiKtyD`?E?E18BZ9EBt64cXQEnBR75<~7xjUra#gbvN z-VGc1BJm_Y6r}tISVQy~yu}!v%a1JUHxZb4DUaO6%L_Bo@@j*q2zeZCczjE%8zK7h zjU!qTsf%hPK(9x~8`oX4q&KBd=?r;&D18AbqzRfTv>t41+7u3_Sg4I-qNrWQDIPe2 zJ)FoncTOr;N#n{$&4*Kuw_t}!q3xc%g(Hu3!s!0HpmwF=;WLL}O#L3f7%G$>-;VCP z7G7t_?8KUr(Be%CT8v$2sAMbEzs9|}1sqHgeJQPnh$8`iy^+Ljq;N{BXqDl3XXYXp z>S~o_!XOUihaMFuAo5%i^#}NEvB9hL(hQp)lLoJoI7u27{qoK8ZuILPCmGpOPeZz+ z{-y+Fa<5w$(!=dIS*j6qzXI#%4uo_Nc5A7EzpzTtpkoN>W(W%fBB==7hBI?c#JK zz5WzmM8fBEOpY_=PT_8@wXvivl22kMn151-J0+_`Gu=S=sR~)38v>C``(a7w6gtV_WS?QNCb`3PnRP zMFzN7z_~9th^pGc4L5(WRi=UO3Ck4=NrBmr8->4&NL^&I^uPKJI^*ZEa}%02Htqt8OzD-S9dEGL#UK>u}Rx7(E};*a>Pc1 zs2DNr5LmHaJw?guO;~_olEAJWQm>e2y(DZ(S2bKX3Yf*xn5e#zexYh-vSL^`RS=|y zF5I2mm?RkPt36e7lh_*tCQPL-C0Mj`Ddq9`N2JW`0^H+(qqr?`qHs|1zW&eV{b4_C@~y>Td9 z2qrbXjNqPfWMSL-^=5Ij$1zsi4$S@~r$-gZZFBwlg>4%)Z0JJtd_B|z*e00E?@V$> z65aH6lvFNozTR2c3c;f0c~O;WPKNT`QmG2Br%H*Jsx@UBQ_W?ecVah)`L{dBe-AgDNmHv7=C1DvKuHD#w&) zhEzy05^bK&pfh*CUMvroDF}xnk0cvqNcBVh-KzTU!2Ydp)v$7|R4*X38;Kn>C|+Lk z2Bl;1p=xQDUQx;r+>uz?KHiyWrSj%GYb%9@Uw`Zc@~YEO!YIA7)BA1 zh?4nmyisUgPYkKz&MY=_L{pDLQVa+Pb#RJUK0jrFk^~WF#6l1MtcnCETV> zA8(1r@a|CO_KkXiMMgUBAk|}jEGKm@^KpdK=F=pwT$Z#<#r%Y!xV$5KE;O!jcZHXuHV=4O^9iR=%j>{EG;8< z#u{a{5sa&(u{+^87p)|}&T6Fb`l{uMl&YU0ez9u#BBO&opKq>VzILHf>#hg|Lh2GE zwoVF=_)?Z1v7|0OVoF_l#MD9I5nJlAn=7|@K8zQt)qRDct~=t|^CX{uBU_-}rfLB| z5m|%QQ)8o^adR&>26j0l0I#1zSoz#;uF`&j7=5_Kb7f4r_@loxHM**Em0p@uRd({b zB4Eh;{%1dA7yXQX$_@{cU9N6wTM8xsR2IJonFDZQ}}BexYu@ zRNl9`w7~anEG(@SnkA?oEI6T(>=LPKZK6r;oqk$uhp$M~WuLo*&}^QxU^5k?SVJ1A zc_=AGNRVQ_fYgQ__ZjJE=ZwhK^te;CF^LP}qY34Aeqd1(uL7gRBJMHAPBz(~I$=dh zV%VfLcZqbQxd;Lcx^Hc)lKO5n4m@dUKB2Q&R#@wJ%9MIbR((n+^UZQ#+iL0~D2Zv3 zINTfz?3R~}SvuddraDpZV%OW^R4H0kW1~|+*~HQyVwlI(fve3j4&pTiL}n5*KQ-r~ zhs{HZP>5te)H0c6C^1k6;*$8yl9OBMa1>=ou{DqvJLz!{KKbc4L{BLg{rJhi6Bw5l zLYWD}QIvr)CXkBb2%-}MRdW7@LQOA%>K4yy*L66yfrhff&5bp>#}jR;0VgP0-a4A8 zoObyje2<<$az9CAWFNb5b6)wN2)OvaSb!^a&O}r;RkIArdIyMlU;!3nnJqb`dAwe& zH+z`m-r$K8Ct!sVoJ>vWouScITpiLZ9Lo2kjC%wqQk(=9O0oqxr5TlDyk2jXdYI~- zL5g%I!-Z0A#Q#QcG*)Wm|{}*{3-G^o%LF#ZBA@-%ZF3P=x z3_0V*Q5Zo%WWi^-^D`LEk#@g#!fKG`Y6oGH6vq?`)k1TD%L}4Py|`G;L}|$_YBw5n zi0)vryXwh`h zWrL%;0%m2~c)#F1y+tks!b6$|FQ64Kn)tC1!$oy5dDD>u>hEp!wo(Nuql?D3PYG4s zK>#Sed!y)UZ>bh=Z-+E|(=CkX@o6;S-8EO2pf>V8UNSZLy{%QZFUUKJ#RK^~yo_|x zRvZaV5fB|O+I>Z=k-J&-uO+@_JfHfSc2ea%Nb!m`JnnSX&C=zp>Ko+0*HNLJEb2i% z-2>qi(*t~8_pUuW3GcwE6hVWdf9dT!*Rr^q%hh*OLhk-?|Apq_WZGU9dXFCEY@vxM zqH-1aGCDhzZ@6FeQxP`AHked*!>6VsVoOYP_G5zHRz&t`8{8M6-=wOyM$*LK9-#vEJBbS!p0=sx`B0Q36AFudXRU$f-~yXO=8_J z%cNsB(B92GzFXo$*Q2|z%M54r)|=P@uJowf8+a1QG0H$U8~JoN8-!dF!Oql6Dy9u7 zyp^mHg@JV7h_bB5L}212g}OQkXHvS5z@T4mWKhpdDiD32&p_bR(M!qe*n4otl$-;7 zm*bv2f=+KVHFVKb&<_;H!^9E7KE>E%6iR!Hjfu>|8LgGDbpaE&bgZ(D7-JV**;#JKeu^}L^_z*P81acZ)B~FwV3%Jr;96T{Y_dA8Hf}fGum5(CFic|Rm zb6<10JRat|3M0v*z*M@ChvMFNLbq4SBW7cFHu6@>1vj8{*y#)@X-$IYnyOGH7A-zy zym}5J?~JR60TJessPL87(jcFTWI^i2v=ScgZ-@gTyKJlcYg9xO+$S046u5!4H<89W zB^o7MGBb`8JR4I&G`O+nP>UOHSjrD(Gs-W!2|Ut&Q|R1SE+NSewafCDFOfo+UL+UwNq#%G%I)<`fQ{=3Q|4xaqWP6y=8#p^VUKrKDrx z^E+No(=QB44WH-fD$b|P>T<7^=7;(%idKB>DpXe^4hG$H?BpK{t<6g$rTo#fIFbu6 z6QCFBPa`N<+dD7cM+sQFscEaBx)_5Cs#+qQwl4zX*fq7%5P9p(P+E0(V)!IUe%*-e zlWD19QK)<5I~M3GjS>g_vnZ^NEm4lz!}9xTdUQc7_1Pk1$$htE7RQN{8l_sU9L1gR!SnJnk$2xfJ&{SP~U@ zFGBCCa3s6oW2M1bK6NQa59TyURNvDx9b|OB(?g>Ao*v2D_d7k(ykP(AO&VS7cX~*a zC?Bx}%52)%Rk|@K5VMA}HbJsp4R0WeX>xDetngs={L`;Z6qa3l25 zWjhzxb@`gd;mU4(Fg#me38T6D?9exJ3#>O-qskOFLL2FE#7*o+9V zA`#edURs7?Me8`Hr9iZy?R#`U)q;A*@>OU3ZdMhUYm&mbMxog%e?QV0lDsCV4W`q! zl@HC<;WKz^1z#(zvr%5<`COM~>5MREjH{_$wFj}h@W%%*=8J2XcPZLfD!RsbIRW!2 zE^Bg9dhvbFM@bho7o``nl1Z_Es4`Sm*t{6DfC-Iym@7$&TuIW(((@)s?6``EisDb* zCuBs|V(il)6>w6?cbbL{L?r3&*L&en(ioYRHA$YEg!Ixhj81#Gyklmo+Y=xcN#Eqb zJ~IK0`Gb0{>~5ov?7-K`oJv?_Nz#KEib#;53!k|L?{5v|B%DZuM3DA%#p4;_04 z%5|Ju#?4t(&8F_8+?=6V08!AAKSas&2+>)@C0ltC;Dz|o9;vbw9ivvsq23|?D9-Igayvp(dom_W?f$o(w!>E_b z*BLlFbi7kimd8+F=d6}n>i-!DaH2|O5ep-=#f2lH1EWbMjK!Lkhj-$z1Ys=Jj9iQ2 zuw=sG0bGklCxfxzFR|W1e0N=y`_}u0+SIBqwil~)I)+uZ%TfPY&j(KwxZN1+BA)W1494UZuri;IW;UPmv5RnNXib2|}B9^j^;?uQAZFasoZCWT;wJ zK1-r~vv5{m<7NWARB6Og%gV={oiR19#S)X9^kb>Mx)1HG93ELx!&6036+fka?KqRs z7dSfz)2D&id8=P7NF8UZJ)Q+A=B4fNEJz(^n?0TdX-s-0cWX>2Z)3LGYh*!+S?n+# zpJdh-sST~;>`j4aL+dzuQXtyUI?jT|bsAlx6)`YJQmAP~jPcYkq&s~bY6ud@Fp6r2 zlR)M;XWQWxe z5OAq@ji29|h?7W3dt~M+OSJ@~1S;yA8&J@CAaam9R93X4*XDx_japKeA4@|z=@EoV zQcPe$$@da93q_4W0xt0H&}vHpCFvGRL#?f{fW@A{c~`kv52?uy00ds3WIPeh?+n{$ z6e5-eE8oL56-9`pacCQaT5F>Su{6#K*6$`E#L_tBMk^5^mImu94<;hS(m0JuB0wC8 z8=Jbpq_LBtd2is1MuNPp4Fd#ZZa*bNU~G+frzVM5>8VJ>o{7l41-Y+cA~mEn(p{1G z`H41Ce`I;rs!%%Q(Z7A=!i2iW2 z-;zk}_FF=9${-2VXU%)J=Ms7Yeau~#1X?$iPoVNTLp-KWpmlpM2~-{;@4h6^y8V{~ zDi4u&U=nEKQXRA&qFbkh3i>eG*MV2?wBntZ1X{NjqfjMvW0Hv7eoPXXrzY>nBoVtk znItj~lXqp3h`qi{5}gMsIx|VsUT-Fe&PU~apCoFxKckSvbZBDe+#XE~g{K+s(!|iY zeVP~w4~chbV(8pnO$>#H#Je>ybZ);UhQdSQ9h(?Bw`UVW;UV#^O$?pXw~0^%H9zP8 z>4>D>jqbIpO3($;5k>kpIwBuQ?cnH0l^%|cz{QfgI65+=j}sygT>w)j$4o5uaza%4 zZjOdX?&pMF3$>(3Lh9%kNtK?CmMX9YxvOI$Rr)$wqS($(0!Pr>kqEsYFi_O*?&zuf z{*L~&XKik$NKfSVc=WGb46n!|fjFiM+m#{;dn)c7F6U&dO?awB)Tl4#lTrcvqToe6YW zB!gm6D3uUcjig)>T@*=P{bXDXC$FPY)*MC@ z>kv-pb?Rz<8C&s%?d_q{8jwQ#f3v*Ugo}))6lf!x!f;y!+|~$O0;#~;u)Y;i52p=~ zddgZDu3iGEz}vJjjJI%>09-gLqG2MjLz6<2g%!khOOl#&Ai`#;6Ocd^hcavjBasyk z%&o34@vm?|XeiK3;{w9kUQATrmGaf289lIsSM;y+%UtPz_>unbexI(?rV9tR*Nb=+ z{O!G^s{!$Xe>kmG+o&*b+7?H}ZU+~m-oN6?-lnZqCUMpW|cunwvbZ}5S5%m{=G1mr$ zjId`C6Ri`HX;~1u`b4nQ&b3Y&QMlZjsVrb$qKtwh_3nHRks*DQLw9OT&Cbf@Aq}eQ zUsCqsRxOoHbFG$+z|A>aB-^6niTamkeUaei*1}936UYS|D;nr8&-06HGg1Zlrz6p4 zq?r%MIU8MDA12zt;10?@@;3im27CS2D1lQB7Lp{yhC_=YnM{$_&5b$2&~~ z14Hpd4lRByw5Q9h7G15Of>8$y;pIzf#&P89C z2@RQ=X|PMBRB2-Co6JAE34s@B4{Jo&v?srp|1ylP*sd`mA}Rdpt!(cK12=51G_V=K z+W^t6`zO5v)%pWYet2xPQY~RU5w~RW#v-a9tLiGI2rR$9LMRQcn|IG^ltQ>JtX|Q- zPXZ*}rwix#5uF--xU$0pGH(SjyIXF0-VlMryQ6%d!W&_cYg%><4I#`|iu-wR?p4>b zlswbE_V~6mapX?9Ry^eLO5ui!tfL_A@!6ePWD(KFQ8>lra&iA;p;@}1&@9ibHX3z* zj6gY+F_Dg>csOn_%TLMfjpa#!c;Dr?`Q=6A+bdX9)tgi(wtzzGj|ex4Ivat{3Jw(Y z2J$uGlb%G}CaW@sg19gve@*!|zf5~orzY~N?Ml@f%~2~*0!i@zB4{6D6=C|^AqfisQ6zI+t^#d|N9 z-1pKK?>%qc!74tLU*Y||7xbt1PDrE%&X>r)c<(t9U99bQ^E?#wM~{Ao9B6=4{q9lC ztkRXxJIdr@K%{*2Xy)1_2={4}uO7|T)yi1?piiTGb@a~RF3mfQ83dxN&9y%g@q z3(RatLwGag3sOKDsi~$+dDp%3KJqlK{ymr%deR z`K@5{Rh;+CFTWGj(G@Ml=E;QIPu6RTm8Df2>54Fkt~p*QV{~S$Uau-1U;+DC$0p>+ z6*+*@W>WH+CDO^s^Qy>gT%>e&h*4xLbBs)Jh^g%9dJ*7C!}?~8`zP9*-q}KXxuxVW zPp)^kMpu!s(#`5F$X5Dj6tXJ^MH#d7zjx{|W--5gZlcgG&>2oRL$WM_->L8wlCe}6 zH_*PH4xz+TVV^dRBxsT{c`e+OI7FH53v`W#T(e>Vylcvxo_mgn-y!V}xKk>(3&rI) zo%wY}o$1^kaH^?s3e&iaJlbMQ?zIu7!c&HDyjvy>1ubZuA{w3AYD1408Wggkg}u}1 zs66?V8isIq1I7pV_}~T~+gO;{y>b2>vzznS#<6?j)b#9j`YRYf=n5l718TsBEhR~` zsC}k11ucIp4R#F}5IiyD4@0V@U?Gc}ueS@;=~iAVXlyjpX-y_3%xPGMEo3q+*6D81 zYNr@(JP}VRb|jVafpxuu>Jz*aVdr;gB%tL93W~C-GXOr8PBy(tmyfwqD87wjMU0fk zG@zbD>W!+$&}sUHaj=3MexjvIq!L6LDM+g=)xr|ytE9B;*}ZYg_R+0#YDKjnr4ozc zIinJwQaH)9T*KLkGEM##s;#Ld{865ybI!=02i;rb2CCQ2EdeR@)u>;Hjp(w!p=1O^ zUEn#b!hx~`C1j~uVJ^W+r|yx+4$zlKQiz{_Xpu|3MROM3qHUTsjpgakgdMoB0^_@0 z)?w@)RX&L5d4mFqSMNtNKTXLtxlQ2*CqH$B-RxD$>?3YRgNKH*J(>&Fd@|TFZI=oJ7iPe!PRUdMSnii#}@y z%9wLf0Oq_)mb}3w<*i!M$}72?yDq_v?s49(5|fJDNmrD7UF-iZ(qdU6p$ewt4Zir! zAYA*@Qc(&|#ZX@PnLRx%FY>g@@Q^mDn9xhJ0V(>Z7|N@#s!kpDUB&f~3f0``G&yJV z52W#43rcwUomj@q2R=kq8y(FfBBSHANB#TF<%Kc!3}}0!*g-pGc#DPf#r^pRqZF2! z32-Q#`K22W#F0=dOp^2Tc%BFDjsHf2KBL7V79vq!4~}m4M*4jxtxFQUKe?gm0g_ub zLGv3C7%i71;s_>|O{ao2(npYC(=-!8jS#MWN+raGH6jn1iTFfbRGdm|3WSJsRpl-f z=?pBQ6D`b2Tf8wW2K+A5DwMPZiReI#IAB5^h2^!?cV+>BiI*sF^dwdnDrXD}M;BBm z7br{}hw7~J!Y~UB2{^=H!X^jpX`Gny5U~kUi1z{{fliqSouoK8_+4(<5_RYj+-*sM zvIw^#${P$@D<(i8f;fXDWGM+`)EZDjAc66__vp7sV-RFPN-n2VL2DA0freZfm53t= z@zcg@3Iiy|@e%QVavP<>T5)3Ph4wyc)D4Oxjs($Q;}C9+Qvk$S(en1D=-v-m@2)Vq z(17w(-dcros)J(hTq!-Q7dLm7S(EY!ylz}FARPJ{qk;UUslO1GLES5{^M4cLZ zMNorHulZ3Atspg?%g_ada^0Y_AJVXym^%c zq*h`apI(v@#_7ke_>ic<)Z>!hCA3p0m73+nP`L*l&GZ_cl`mj4G8*4wPR)&r!`2o^ zjU(Z42z8J{qA4Tbj01;GfkiAGjhMjZcbq*XL-C8{X?)x3gi}l?jjPkpa3G``2;}{F ztF3lOzTfJi@=48;6|IAPKJ7zlYUEiK(`%OI+(ExsEZ~RW2_x z<=YnG=pwzVb?az0BesVslNe$nnZ&I{`jAK_#7KIrgw0Y)f@lp_XdElB0(%ChR;n*9 zB0^Hpaa_Qtye2wKJA$nG8091fFWL59XqxRydAucNE&`gR)i^am}FjXMdAkIP2K z4s4my$dI%ShIkV-BQ9y2H%cEk!(hBuONA?hY9&e-U1=$;nV_>{;KjPwW=0+r>ng;e z@t|zhOkUqphInWK4|2&HzUeBzfFq6gbOl9i%trjXa<(4sBsy*e%9<75{)AQO83IA<`zM6H#c}sHNcT=AyihgxYeN!j!gl+mNCa zi@}qdv3N2ue`%(X!VCo6`}6UX-i&5El^YVeQ=9R$T)zbjOJOU1f^Zj>)U;!8wY4Kw zl(u8R5pb0jRt+iTEh=J{Tj_&}*iRAYZLVNaegVyEI1Rn@`hAu{o}_p|DV&0C!?d7^ z^$p)C7HaicrHDRa$b`C8o?^_6r$`;@HIU?-hc$G4N{G}O=(7~EChYXY)`UJKC8*kK zASq31Qnz{$BTJE>E`+&bfk9jssylooes^88pp3*wWuIk*QdGeJ{Mx0dZ_>#2#md5HBU4%G@PmE!iwzIAp*-NDx)JI$r8fD%3fD{? zqRyn01?{30E!G3H3b?eA23b~UcL}nrS!f>GiKTG`S~r|e5GVzxy@0}s`t1;mU^7;3 z_yV^SJY@HChgSCCkbndcH2A6Z3_4*YdHgJz1ZmyYwxHnGPM}j2)n;K0!2h>_!Nt;8SQ#CdDpDQh&! z)^AZX?lUJ+5*o}>)7Q(6&031orcW7cTHAE?TQn}Qr(4dz1%cA-q!qZ>mVO$DS?Wi^{q*)2a zcf0gU3azD@SzQrl`gjg&k2ITWe9zm+FsFKOR|J?|6Q2-=*RF?D*>rDRY5U5}vlnp= zny0DC2tXYHA}~5=s9G&ox7X{9v3f}ym=`(YG?vO~xEKpK<#8dH6b#nsQprXjMsV`A z@3p&!;3t;_`O3oI#gH400+)*wRO)w+YO7Qf0?N;O=HNUj>a%+(!d0p(`do$`{`m~cem28uk7d}6`1~ZkzXtDKcs#=<9?h^T-ap7*x_FS?|A9ev-mQb| zv;RKGZhb|Lo%iA(n}Cd0{|A2mp&WbZ`9XH|zYVhLYX{g-j}Njt@LYA?0K4#88TRxG z(CO`!8UKwETt`4vl|0Tor;+cOEX+T=oKV{gSFM%JQFXFdL|1rakd?v#VK9yk)Je^_J zemTRA#%J{_8Fn{*pZsUYhK`TzN1oxCxePiD4zP!Q6?yiy0rt9253+||Imo{BLxb#9 z_hs27rwy_1oI1pokIAu#pU$zz@O=E!8Fu{+0DlfvUhJAV#ojAEPL^^EZci+j_tY* zy5aM)_}ul|Ikw|>a_mujK7!91Kc8dA{&to<_jr!&#dF^ES@t;OyfiS#KJ;rt?D6*u zv3oBcVz*q7V^18)vHK6^SYv9CU2@hSd-`t%*lQkwt>g1Xd|nSd4t{Tt?fQA7`wfHa zqUj;F?qy(|o@K|rVTj%JJFYg@5{2!APpygmx1>t zq@fMobAB9p!1k{}em>pGu_NA?Ww+w_`dbFs#itIkk5_VR&w2R$Jt+TQ%dlth9K0NL z4&~Q4bAV;ugF5uC0e0A@@cHQh_U!uy*gNrDcJ%;z`F$wwdot|SzsRu5-#NgZ0nYK) z46s|il4FzT{0P@5Auh@4^OdfQ`=}AEyUc_4R}7 zspAIO5xouc>Xxc zuKlAdyYf%6Y}0L7_Q>t<(fGXVby>FM{W8;97; zRay4_&u7`YzMf@Qd~J|D44KEk2YmF^Jhz=Rz>dL_MVg;`0A>8wgKW7lz#akpC+Fa^ z@yx>?H{UVHodLp^t6o4Gjn9w2IKWE(F~F|+ceFF#8DJ;k z`%(V|yF3lP8qdX74zk-fpuU2CBlwTU-I;55`VH_^ z3_cL=?%tkZuf+S(7Y5ihH`xx@)9|qXt_}ue2d=Y-X__K(2zKA-H z-xr^No}YtF;CUsU6Hzx0Lp|Nn7-C1m#~l7-jy-kZAUo`$AvQTP$UZqe$WH$CA(pvy zh~2R`$S&NIW7UByJ2*VVn!k`^=e!2AKMsHJ8ra@RS@zhQV3#Ln**bjQ@&%^is2z&vaXJ3VO8qcd^B1U=aCn9 zPQq`Cug|f^kIS)}j)hObbKlSA*f5^$`0bUGId))cj-9zV$8MiMo4y6U2Y)|{&!dt4 z%U_vgV=T*V{~q%G6^JeH_e=OZ^0is^sb9>o$zK^_d(g&a;HNHpf0j*LlVx}PMwXrX zoA7D)`y2Q?c^72wM657}m|#baT{@2#4}Twl-#&ae{4$=Wh6dR@o|g}UP2;)ZM+e#A zf0|<#-;qOGg*^Y`9NYINXixF?3;6u@k3j~W%#UVS^RO)2czBlGfWJSE&uf2oh#hu6 zVj6tD`tw8V>PJymt{q|%Uxkg_f%XfZAOFG-y8?e-bmI`a1hj|a^CHkb3A%gk9%3)v zg;?Y^@Z$OU6ZrifP_Dm+-$C~h=x2X>h~4%<_>RYh*aP_c*^fd7o|8WT+CN4)<6(H7 z{tRgU9=3qzgh%iWcDVhIhS=SBs(*_1^v{Oahw&T5^l_0wo$eg^*U81zl>dCXR{7ssLgqYY{Q;{dzuKXdG%mvfAj z;44PpSMXeqw)v7-=#IAebzg>Wya6%6`(QhlK-UX%?Bp+H*>|@Ouw8gAdlLPe^9R}2 zC(tK(8UE^0l=TgWgYV6;cOR8y%fC9rz5zdyd3%nXH4D2uJI7u`dw0`64YEz&%d#WR zM)~0LGx)sutSn=jv+TU7EIVTh{Ki(;{$!TjIGSZojb+)MJnG}NESto$Zvrwve*@?r z2krf!yJQ?b1TC>8B9? z|6P{N&!J9!2X*>+_zJ{4=OX4g9`VlAh)iMe)ctedyYL)#B-&3rlYfmi2G8Qh zkO!{-9%LSg_~uN~|5M28!_YtZ3Dn=c(C-=K^XY@^@v9J1{2toUO|UnV`!M3EVZ{FD zt{|R%6mipiIrM+B>;yb#+>3VMIpBQ_W%CiVAHM|O^b4rN?;K+7pB!Yz9W}^m|Bn77 z{QY5wHLioq+ra+>=pVZq{_P#8;}@VU|2JU%659Gt<*L#uApt=6FkTV0jdMna~ z=eGZa`0`cI<;#QY!BevALm$kt509V?+JHXRdf50zj16o;8*)mH-GIMOehc)&vk~vc z@Y}hkq7U{a$T%5&#W&~J)A;*%d@c{?*mvg z|0=^a-Irm{;Pb=32iocoJ7@n8TaWVE`!)1~eibqMH?!>SI%0eDPqt%B;3&{N51JQW zkGz8|Jqe$=9scPB_|{MUCdvoC^w=*Bu}`6W+jA5A)4vX}bH9x5cn*6KF)N<2r%*rf zIq@a!`5E-%{}ZtZKF`>jW1qPZn7@y_LJYDU zZ9xuyzx+s+-SiKrZ}`0Z9{7}hMOoiF$lm!8$b`M;U>BGD%K&@Tvjc46p9k2(c-H?j z%I_7Rc?R+4Pato87X9Y`1kFpRdmlp|^rkF(9#00oefD_xJ(TP9DA&Dzjd-fAQ3xEB4s6SW37SZNE@+SDNlVK|Z zIkx3Hh*z#b+E8zw!QXp+6Mo`Sj9XlUa{6VocRxAAj=*!#R}m9_Bgx-{alTH4a(~pJm>r&`il<^v4`+^ z1nlHRJPoAfDLl7rqyEAmD~(~y;x(vyc<$VeJ`&=~hmOp#Szy2TGehiM$D-aL?@oUj z{oDz}_M6eK`U#`~&xxSF;wY3ge8hdwGyi({SH)PXxcjJ&xOF~GOc?tf~CZGrvW_dfJ@k(MUnjY<5S{TO~* zfX?R*vKc&$0{q$0IrggE@JsNI55E&};XQ~Qs~ESbW9$lJR+nFl{=u(cyzKvE*ol{- z?YsnkUxZj5pC7{K3I998uEM(q@a`DU?fPZJ0q=%y!0+$+CG_*~_lbijZ?rS#{Kz1C z0?%XU?;Z8ih#NnRvinSqoq*4o$6+&HMEr=)o4Qc6|ALh!y@8c7f;l zzlR@t1byHebL=oY>wg9I@uL`vLfdiE@rY|i&{sPX^%u|0X95fMb?;jT*oSUG8+0LT z8~*(Tv@s8TE6a9$JIi*Uom>YWaWv}WVZQ?(fc$#|F;e><5D$J9z5up+*?*v3ZH3)G ziSejsVDG3G!%tyM4$mduM!)jkF&2V)!eDRPpB`YJ#j^wBn_ow}b;46<{}Ahb7xBg6 zzXlt=3^CaO_{0lx>`Hv@nZ#Hio`*38bVClY%+Dj<_$+*S26gaQ`0CeZ+0#FZ7#h#b z_q01K3fuBJe0b6?L$6(vr(Feeo z(&_m7rENp(b)QF{<^wo%rp- z4`VFokI*N^bKz|m6T2OL0?)C30$my?m-7eM-FWu4(T~J)-YVq&8Faz3d>1h8z_`wz z4zLID?EQVv;JN=p1MI9%pl^%k_Ky#+EB_Wc;PcxLLl&MZCsAHg=&#^;0sW>6*P-qH zIkdUoL)wtfcfbZGFGYU|b^e&Ipbz*o{>FIVUDu$0b{)p!e;Y9|J`a3hkX`>9$QwKl z{wsXt6v_!cx`aLgp672wKlCNo{TRkDUkiIY8g_~C z&pq!!KMG@xx7-ce!Pwq$_J!-y~bG|SfCi5L`h?vf|7>`UOg z7xin){fG@7Mm+Sl@QZkk{5azE8xZ^A`O*h+?4sXAn%{=l9M6eoA{JgkeDYupZ3o8r ztB7-&Id=6l;;2ueKEHq%Y!_m8JTDDrS?P0#Ct!cqY(@KbEz)!++OXe(P2UCk{x!&f zzb;*mahM;0@5|x)2heYQ0{w&|(3YcZsr^%qUF*Q+rs02IMvVPd^mEZhefN8a!!|*e zkHaT?0&#mA_5TfMUv^^r1y2?_o&-6Ie}?bB3O{!l^7sRYm#=`|MO^vt(~$EOWH0cXb_bnzhi&_99kwITSTkD}c? z4Q1v)mps~YAETf$-!QSv3Tco)rw5|BO=W^7oD^Vuzg-&>$eGl4MJnz0D$8zsOyZHau zdk^@^s;Y1J^fL4!C?GaaM8(O>Fcc9|XEMwrGbEWt3wM&6%$-T@4fiIQgxxEQo-J2#A1m1QfsjZl~^Z?zzd}_rBl9^YcDo&R%=%w)Sd!?X~f{V81mK zYtJ>5?cr0pc`kg83ity44sVGwEcl0C*aCdxG02riVTYleX&Us~OV&^x?pjM(A9Z)c zoLzn%Y~CL5OBZ}|56G?EVf&)aX}6)h&q8;Z0y`eGyz51faqGgzd?8sYSJ@tar{ZtN zIndkphfekd*gLS#j=BPT`x?kX{C0+q?82)dHy6Wh#a|77U-&chCanFQ*mt*~-YXY_ z2aKU?9KOH5!3JCfJ~9fw7XHqd0=;GgzPs(gZ}Io}?cfuH+}rxeDaxJr?er>S3uxrp ze}Et1x8^gDkI%w(!0$r*_cu%M3u7MdI}h>$>-+m3V8366w(#5UQb$>{3%<8Y&|W9T zvmSUb`t~HobHNJC)5W0MRnUDmg|2=P=nVZl<0`;j0e{<-sEhx;8FgO29KOay@cHBK zlM5jm0Iz}9D454f_rlnK|AmWT_hRmr;P1;F@R4FJJMed#eXx#w&|3=dkF9`ijo%6b z`}g2AlzF$HFZi9(4t;zV&;j6@&j&9tLDLt4j~%n7@@43A%Z|l3r@_}W4Eq$nCo5>n z#W^bGsvZA*_e`_{+pF&l=#Ciwy7xNDJ)eQDy9IQqt-y1?2pT^ZvU>#k=pfjRmqP#A z2lCX0E;RQ zL9p2m#@@njt3v>bU)P}+7kWPIm&PEhVLJL*Zd3m_^UOQ=YaE=+lb!;=bxa5 zyLW`2Zq2ongC2qpQ7s9&JUt``rsUc@OwGetSL( zK6(>;GM8h{(3e}$hgaVRpEq%?W#K%r7cv5}VahV_CCCcp0-QVl81lazzH#`)AN(ii z>~-ivZ{Yj}e|z6_m9f{L$DEHnc^-6g{N4UeoSEVG)G3fzr-FY%CY-V56z~=Jh%bUZ zx)097yW!74o6i2=8KB`!egPQ*S-Ipe_y?eyc8o*c+7CYX5$uK0wUiUf*fYcMQ&zCY z4}%SJF!XEeqs<^!t~_uJ<>n*Sz!@X>7=Dd=V4r;p{?-=wh{N`Dhn>jcK-v+Ym z1MIDTuc18t4*2)mkRkZ*7ykp^hVMh&SdVpJM_vdydLZv|XR9x%KA9dhS& z)Q3!LJRNh4-$7f!AGaN11+D`BS_6KHYaqM7j;*q2ehap7mC@ti zZ#)_2L?>Z<4?#z~8h)F*iL8P@`T)q-10fF%f-imyYj8N$`Uu#w_&thoH(vrB0KcwF zA@lHis)#etC*W&@yr?f@?~j0=?hiW*c&6@$y5qoeCB}l^ipwF-E(1@#0)BY>Mt8z_ z!N=fX80*+i@cjb(+96}R*HCV}4l)40HD5rT<&cp_f`=Xj-wS?Aj)o3@H~2SxGdp4L z;WrC%?X<_SHn3?<`T+L!`xqKI=$6k7qF-;rw{#Brb`op_{5H7{{-_5*YjyBne*`^p7wCPb zK$d=hy>TjZI{f#FZuqpI1AmNvzli@{VFCZ{h<{iLo5H}H6ro=(0p0D4b2I!MdL1fA?U|%L6`j{&RsSJ z-^XvKlVA_r1>2|$U27P=4g8!6?20>Z#<(H&@ZLDvSHKs>A&+72%sUQp>1^m|_?@#B zY@}Ubk6wqmKSVsvb2vN3f3JX?e+zT)@q^%hSnHDxM|=|Kb(81emwf_j{U_A90lW-& zmo#I3o4`--_h$S(3wlKJMxeWw5W{jkd>w#$;c(Q&Zy(r2_k0_2^Iq_hi=f9`2p`9R z@O?ar{kSpg)AiurSO~s(Blh_t*y9hv$MP`f`!_g?c?f4K_}z(b*WL%Y_5j9kKjOAf zb_f1Gi8iZ5F~k;NtPf(WuP?xw%tyT`*bDfr zU%*`9cQfeje9+u;z}<(rco}n2UIcx$0kYuNkVBxgB{Lx(4eYZEFh=~AybSsO6684O z?d63ySJojbVN=#ahCGV)AI93QKLxfKez)xgoor2<2d;(q6Uf`+ZicRMCC)znjrPta zasu)Lf3IB!=TummCvO1ndyQ|Mz&son} z&seS6Y^`3~MQhfYv~84cDc@91vQD(VXPscZq`s&wRu`#V>QnBY)MwRa)bARfQNQJW z(|y2gbn;GvQ|~Ny`kg*!J@p&T*3K^K&T6CDpw3h0svY{H`u^%I`pxMHeT`nWo( zj;S~4`>B_!m#P=5Pv{q^zr*S6hSnYGUFxsYJJs9O9(y0V+uqyW$llOi&tBhN*IvtB z+y1(;mGU*5<=<=EW9)6tGCqikbNHMcXTnKR5C%x{}@=Jw{d z%tMrel-HGiD6cB7DX%DNt81wjm{U|&wbf(H?}KTsUSRyI^NP&QUJQr1(}Rn~@n z1n#G7qI^!-O>tnOm?Qz%D*3s6|mg=8VKdXMx`I7SmXCvn`PDw4Q3-u4J ze_8KYbL`o6i`{I0)85+ty1kXXv%QnOy}g6IqrIJN*@mszs{M6!YxOkeROd^u35VT- z+|MhUA^K)Z^~>s))X!RJb5C(kc29CobWd=PSB`e? zbbsZ(qrR;kXjyCC*=UMS^18#qcW(Jm6B3ahLiziUu6`!;(p31 zWkeZMD$2OBQdyzwp)6Ipl|7Z+mA#ZD%HB#&=~H@?WlFEIkCImwD~pszo!>c6IDc>+ zaenXo*7=EZsdKS&xpRSYnRAJ=r&d3gVuwq|KNYmM3|)rW_mt2uiE`$1zD^I&C7^;mPhns?XMHdfzqUv=NN zX4%`=-?4RjM{Nsr6YKZtUhcQFg1x_crhANgm;1JLu+yRJukMzuGy-hz>?^gF#|7!iknxi#nEn1y2RXN%EzV({=s=8ENqCThoS=~r& zathA+YQ5T|wy9lur+$!ng?gE4DW>uV@b_Pp;41s&uLy>h{WZilv(BAC)JSK6ia>J*`{c zTi;aOMBUgKQWxus^pC6$tX=I^`&;%m?9;W=v|a4)+O}=l-%)o|zpL(~epT60`GT^! zvX%NZbyI6I>qA9VpHly*{!M*BovCcA)M-<-L3Kd=uC|l*bN7et1?~yTq4vA#hU!A) zK;;0Xpe$D&b1rlabiQfsp#IT(%KVdgi1Rn+X6IDpY4aKLS@TfmMduc$*_q|EIMbaO z&YQ}~%1O!(l{1wM)GlYCv&eZ`Uqd|wI?KWKx72T{-&VI#>(r_0GePDADt_lE1eb28_EObJ?4GpUFN;!-RAw~ug#~OYn%aRrSrb>o}yct^>5`rrlIQU zyUIJt9p;_pFU{M`+s&Vwx0t^&e_`Hg{>gdPx!SqTx!L@gd82ugd4qYK`BU?H^C{;l z=Oy!R=8NXz=ELTr=5NeL%m>ZK%!kZpoNJvwJJ&nkR-Q0_YyQssyK|fKd-D(GljbYV zFP!JiznU+YFFCh5e>R^p|6;!E{M^}6|C;`FeJlN|`VZAJ)hG2o>HAw3DVHc0D;Fx4 znU|X1SHA3g#o1P!p`PuWsHnxd)N zO~zfu-Nw%hT{E@q^d|j8{T%Z>^Ih|&+Kt*x+RwC`wHvhSwX*g@?M&@#?JVsa?FZT! z+G*zL=5p;G_g?ob{cQcO?hEeI+Ml#%wP&vGs_svtx6U|f2A6s8_zUJI!{M=~P z_jX=T{-&7DOZJHUfnC)0)k@lscBy`td#L*z>!0>s_Urm*%ni-FZ5dCvFBt2%pV!V) zA5pJX{;WKzEU><(@9gejzhvxX-r^pm@2?-BkLyS3`{{@42kFE5A^NC(sJ==c(+|@} z^n>+^exQDUzRYb_KVyBx>a&hD{-eKWAFBRA|Gj>%+GIYZ{Ky@(SJ`)Hw`+H5ztZl~ zeyROJJ5@aow(rf#8R`$zpC}h7w<$kYKC69QYqj$Fh_|P8ArND zxIfVUYn^7CVw_>D0paqJ`xE^*^#t`q^;q@S`uEi1)qC_a^eNl* zx*c|>y|wvQ`+56)`!fAVWxjc%`-1&9`$+XD^)U5t^$z`4`Vs1#`i1&M`sc09t$*3) zy63rF)>PaiMXM@k8TQ{b2RC`d{_?)X&+Q*mKQR zb60bYIcD!?kK23c-?kn5%ho&g*R*ThtK4hctKDT*kCn52qd)2X!Tp(flln*fDg8zL zezn&!tgFpuji0FBG2V0?*LJtJEZ1~<&Ae&2x~sXWtGFfeO#O%YIYzsAgL|XCnRc%F zuzHp9tn!F5-zw?*>LYHqd%f|Jb-41fdW5pTeoa5yI>$Q8XfPYiOUx6@v)x}P=eQ>- z&nvU7r`?COhqOnvN3_SZ2esd5XPIZ4E42Y_E%O?4ZSz9wm-_AcpY`YTt;`=;E&42d zw%)4ms?X8q>I3#qjb9s|S2t4|j4x>CsMn|us#hpaD-S7~YiFxhtG`h%SN^0ts2pd` zR%d9NXz#0UsdJnQ)N9qp)z8|yn;U2!sB3DjwubhR`W59H+D&e!)$P2fyrg{Bxy0Ju zcu@bqdC(bhzHMz|O||OWFT0momsyXx?-}nKQ(V{mi=mmidAfC-I;ansN0~>PcPpm# zYsIqOH7xT(<0GR-Tc(}t{MxFVD-BX+|n_HM)F}F0=HNUOb=~MOfoLkiA^*-&p`U>I3Sf$^*)7)}_Yo&KcGoPM^I%*-d%X zx!q}V{;59W&T|$!yDIaPcI6HAAI>kG1>rhQZG|}qjXrW zId?d7l{RIDGGF}><1iin;{L?C-}sGjwe?l|8tXoNvH4T?LHAhq zVfSCg2gaK28t(IkVVdR#=D&^q7%v*O>6ri3ziPf_|HEF>`MZ6ra-4Du!rRU@FVQa6 zF4Hd6F4r#7F4W#K-!|Vd_tW;*#jf$@?4q5d`FUh6*Ve(Tp($r`dAus+Zi z+FKf17{k_xHELC?vbC>uwRV+ut#*xeopz;mh4xSL4f9QNl{Ti0YX5?Q znQOo2-0%FxdenNvddzyrdf0l`g!wDwa`!IfO7~9X3in&it=gXYQSNK* z%f{x$7mP0&8<>AHK5`y*4sj25|7t8U-#7nduI;YnK4Dp)t+L1)B1+Bwe>A)q1k2bVr*+{Wt`-E-#O9gbY`hvcc$6nxLmcrbAWTKbBuGm zbDVRObF{OMQ*@R&zteuJ{XzS^_N4ZN_PF+lv9qxQBI6xv+#0ifXS}4puj|e>`cC?D zcAx&1^=;?p`tS6=>22oz_Lf%8eb>I;&0ABQ#cs)&Wbc5A=1t0J>gno_5s`hX za*MLDwv{%=`hxvs`%Cs0?Ri$W_JDDpv9EibzK(gi^O59+ujuvqF8Z6!-OiBv7rp4d?cC$6?W}8U z;V#ghFn(|R*M8Z3+kMCVp0k_&Pv=fYb&gi=(vMN^)-Tb2;`Uoxx!-UH+_HVFwV~7C zzHYr^?X2gVkL>sKb=`}s>DuSC4(G?}W9m=L^UW_Se^H)Ow$^sF=2|xze>a{s{$#vj zd_`T~+Q6D&*V~_QH*z<2H+0u`H*h~T{%ic#`Plih;hIy-oVvo^$vIzrR9$L5rYyFW zsVnUs=X~uv?E>w`+E27|wI6AZ8jl%2FwZax+85n_sGAyxsF$essMngdb%*Y!zh=H}ziO}LykftsKcM%Rx4XCLztEr2pVhx^e$Cz5UFq&?A7yReG`g=@GxW8r zwXHR+MfN=V7uK2953Dx3-JWl6XVe=rjp_O{{a^aG-LKd?8GC7aYc1+_&JND@&bH1> zXDesAJ?tFm9N`@19PaGvl%0z69Ve&#(Rj+((HV0_oKa_$^KK)8=XI z+I(#{ZC7os)}ejYS*TUq#oGVMqw*#9Q=ba)sT^(}VIOH9WglZ7Z69YJZy#%)V1Lg( z(f+=Dl6|s$ihZhmntg_Sx_zeoL;DBz+4foXIrfk2bM5o&AKT~K7uY|sFSIYVFS0MO zFSReTFSoC>uduJOuePtTueGnUueWcoZ?u1E-(>&HzS+LTzSaJ@eVhFY`^tqd?7Qt>+xOV_+V|P_+Yi{ku^+S_vLCh|u^+V`vmdvguzzd+&i=jq2m49;kM>jc zr#_%heL$c3fIjsBed+`H)CV*XACRGZ>IM4L3-qZM=>JYH&?(xf+5y^u+F@F+cDQzg zwwe2R_lxG|&CSh!7;hT=##_d0_e=UJW0tY8-en9JTj&QGf7AY{eW3kYJ3;%NRxr=g z&)2WgH+7qh&GbQIKjV4rIqfy=AKLrcds>sRtFhcD7$0i==HA9njPs3O8HZ}0HSaW* z8uQ%wZkzkM@rE&Cj2hSKyBm4!bEd63x~spXy{&1wsw;ZCyQ|ykeolW$dqw-KK1F}s zy}+c*Ui*vo zs`fAKW9>iMLB^rR?MBhOK>w%lC9~W3zIL)U$M}(cqPDqvl6J0si1uS+GxGrBzuLjZ z7u+A~$7;K|M`}lDo0_j0uNj9JUodsu&`sUa&v$<844Cg~3*15TEBfd4{f!s2ziO{* zEyhRMVaApE-?dHkP4rgdm&PxQ*~UBC#^xfU!&qkIjXtB@m~ZT6%rn}I1xBZlGkT4E zj2`1^eI0#WeLa1JvAI6io#TF4UunLmy{xUT|I^(--%$UIzLCDtm}~51T%$J{cNlLQ z?-+gNIr?H_4`YeZ;U1(NtZm}1FgG!mn}-|C?$O#Y+NbOL|LyhF@sQfohJpT4xiGw( z<-YVXo3r-=<>e%6CaH*LT5`jsa{cU~5%NNL&q!~M=1mMBnKqrgP*EM4qa+zsEA^#* zmiCq65$_Aqw<8H62@J_}Ih8$OnE=7@SH_DyEN!dz@SVUf`Y8cn=u-d!*cTv$ZK0C) z=Rt-)1{7~02Ey8C9O>)Jm(yoR1{0p4B#3HHRWF{=l`A7(YCW0kZjwk8(=9`WM=a-5 zDbI{6luI`qZ5T9j3&E*vz-zvNXT&H8hDWlXgtYHrS{G|9Xp~Kf1dyaL?i@xFgY_P{ zrT_=2x@iFKoG->kotqy=+S6VT$WXpKOx||zp9rJfZEa->(^MK9#Cx3c3dKAUl2$-A z9?^&BEd{Q1x0XiyubIF{-a2TGyw%k#d8(^9_)-^01sR-I%r578J4*wj!S0Cp<6A5V zEYfQ^F1DB=S9A%fq`gs#X2dc{fx!Y zC9fQL%nIzM0dF!lV(Ts-DTn8fcTFNNWXn>%9{Da6#xj`jV#**E&uF4=rjr+OD^!;7 z7RP$>L&Jqq(I>^wthU6aJ04bmU|!%P#P_EK*^@Q1n{F9t=k z`6or4P@{7F`TDy0?z!Yu1t~&gxL%YQ*zY>&)tupcnW}0*cEsO^4zwi)^ZJh7ahWeZ z#Vh#jiZLZODTSESVz#o^f$3_*u=B2!%6Oz^7_Y-5bSz#Tu9zf7k++*74wUnXBgGy{ z)oq0$q&8m48I1Cn@Sd4fy+Rl>$u~Y2(*qa`lymZ0hR+0;N;8*HS(@t3`9LZN_Fe}b zG4HPDkGq4I(&0ODMbP;)P&%dZMBr+wDA_)~1>y@DkI3f~C*Faz;KW6j+xfeq-HpL#=@z*t@ecLVF`NB)0Qfd&~8m$opT(LyPjc4V{*N zDwqIwvYx~M=1fcq$Y@}0zFfp3HmO~a!GwDvgCOr+5GY8L zesF)^p3DH;SsE!rPlpLgFic9~5ur7Tny>Vm9d2l1-I%TpPS+cKo9o*x`2 z62J&elK}@-w<=^{&8xyU&CrH7sFtyzfGHxBF`qGn%cEnBmqvyd2He|~=7Cel@>p8F_E@QCFt3cETzY563C&SL+d;ptYBlJ12d&asOdV7P7p!?9n z{Ar5;csR$pn+v1qRU-g_s+g~~k%9EuahM>2scvuK*fF%#?XZor8{ z&G-U1RbX3_0|npsC9WPB6gt{GmC1>AoQf=6&_Z;-#WUu#Etuykj`N4|#in^JWBDE& zD3preOXN+)u)-!LSvU!^)M4{oOAR*W`Q-v0T+R*9lMnj*Z82XVj+@AN2ic+A1A?g# z2aXGx0vep?Hs8jfvJg4MN~&vje9yBEywp;+^AV)Xkr2c8Qkakn+~za6~U* z`c5(~-YagTrFTdM6zNM62)6=PqhUuli)YvgBQw2u?gO7BtKH+Oicn3p3npU!Q#0ifFHbhC)1Kz ztVD&46bJ)10WgHjv5qm12(3O2tmGUeOo9`zFM!osr zTw$P6KU^m7_DTc<4sh@^eW}m(X1;Y>LMt}s=1 z4mr1GmAmrg!6wA3<;#UYuvu#>*QMmeqUzZ2NSS(u(*n%8p!7<>!oy1eO5b{Z+*ASz z;yY(YiPX>Tg;8Y#7YDQn&;h>+(f?~`C%I;oCi&bKdRDgOv1&eZ69t3#7}Euq=7VldS`dXBu1>O~y*8VC>9Y z2y&2+??fU!3Kx@g!$+U<2A6<241V0%C-nt+W46 zj}dB^qCga~P(f;_9bBymR1Y14PoO@T?}=5T9`p%RrE6JZJ?cPYj3eXJGIqd#=Z_2z zjSREk``-Mrk^b&wBZYz9?*5TnITVZ45ZGgKLKI(<2xdY}dDI=E%0=Gi)zDZXjn>fN zWJ;|8NeaEzfF(|~HB^=mVCLFH9b3IzctTAJG7J-p_&RBN369dE!f;#O=he{Iaa_AScv{N8#aS zyw8(sM@I8CbW_TUYp5@$^coP5+4hLMhI(Q8&Rj9bk;FoW*F}7t%(4Vq@zy!qjQ4qR z?M!O<6S!RslR3%dkMOt}8lKSd2RU2Dwir{Zl=_ByOCtz-_kBMhdsqg*{nN4{etsY; z;^v&JD7i1)yE2_tR!ev#Nm<`OiJL{#VHq1jq&zT!NJ(G-krIBnO46F&{YaHy@1sR5 ze7!Dw!*`+QOGSY&SA(34n3q8y$$eYeo4N+cRoOrZ&ey^>VOd#V(|MM7utatNGgvOU zRmqA|t}zOL*p0!!IEAMo5lE>rMB?Q{DnjvN!Ax45MhPSH_J4fLKwH=+*dAe1gXXIPh zW6f}j?{W7uFHi9o2bMmQznEdH#qm^EljDiwuSK=Nm6&Mm3>J?^uT_YkQ9vb$Su(|} z2Ex{$P>@hQ9=|q2lIMbh){C$JuKK5ea-=LwV1`6u^9~D?RRI~oAXrq+r(jF~4dImN z2T9{j0S%9v0me0lbi~Q()`MFEdd*z+py}z_X{0+cn-pvSSnmVF-w61#|xxHkk3veI|2s^ z&59(Kff%TmYO#w`KqGTPb;x)ggLK5n@Dc3t{00d#kO~}{35jl+)ZrA+a9`tB_IWo$ zEsM+Qo+wTOiUsB*0gDhap({$^Vt2{Yp#0bfDO9TJ9FQbJkZ>L?E|U}eD|Sa54M{mt zrb?LP02h*JoYC8w>1dOnqnIOi zIT=z<2jc4$yYk7w7%~nNG|6P;;Q2w)A$PyTG;<6Rh)@d&<>8nVMuiEW_)LvHL9F<< zuRo^o8URA9O0Kabj5K6g$|qIyrAo7bJ3I+(h3;noMzSfu+2F6TG*@F>xo| z3=~H%XK{!qmgr5bL@=NX-^xmc4Bf6u1dHCIN(KzwnMwo;-jI?4C0%aGg%m1u6@&9HVeWI8+Rf&rTGlaJ* z6cw999I3!zauA@gi%ivUCsv5ymt0OtM4bXF#oAIFE|1rHVT2JYldeNxNd$SZRVT{3BISf~HyGbAz3O;Jtot#8Wv70>{GK?{Fl_vq0 z3?__4a$hC^S2AP>W6)(Q$0UIWV*oP>XZDeeUn)z8;3c@AU5E?)Gd#fTN}N|Elg%o- z_Q870#UOD$aym$ZWs@KvSw7f?a?f(;0l~AHB-B+aMDWY5d&n0|di6uLCUQS|Vuz*I zK?HQ9x3OCe30+NsW9axQ&`S@*N=m!jh6WM^QjG}Ecu1awP6Ffuk%5H9kOUyJh{S0^ zP`aZ-WUG)rOvnnL*pUO9hzM}X`Gcz`7;`!d8?y{1I%W=2Wz0KN z9W#XpM%F~f+z|0EH#T5RxrCoQfhA#Q;YCTMxKPBdms5bStD5%D>oe0tR#QLI8}d5^ zDv_x$DCIZ7BSnqa3@sWOvqY2_M>}VWH1&#R5v;cso9*DJ!CJtt=OClK!h_P+o?=era&@*kOaVRq<4 zNQ>wh6_@GQl3S!AC=E$eMm0-T6RRH4c_~zQ#o|CM39Hw@r4eI+$xvhyqg}dkEeVSo z!IcOV!js6<9gm2;nE8jDZEQ%}Sh=;DD2%g1BZUZxBY( zDFBp^Q_2aw2aPaJ`c-PMy^@MMj5N5dl5odsWN3zgq)$U;G+BDdkR?r9rj0y15sGd* zT3l_PCjwCvt<@+d1t4K)RcZw0I0-VozJf<)uaTh{2Er&J39-M3)wN1>{%=bVHU3%5$vCNKp_m4Z`{4wJCha}#=l*=DX7*Qk{iugzpMDG9W0=Axi27a4nu7>VroLy z6S?8Jqqidsnk5mM#+g0`4M*&GsF^4c_woHCec>yc{`c6O&1Cexa|6hD3n}k^@Z3k@ zahZ;ApkHGHNkZ4c)A4r@5+XYR&)bC@c4C^in>G<{G6Rmcjh=-wH%Z#{0GKEy5K&i; z=XR8gA^}$9i}I0%97M2Mpo;LvXSjXXkr1|#e)vINLSW|J#OpK8(-HLO%wg9l!{4Yf zOg_b&G6C>-8LO6X@>^|md~AUeuXMsn1e^?INsz`#O9B+3t#L3QA+1dvq4HK`KW z5JJUFhe=Re7fz%%NtJ@VNry@3&61edqweddV~2tTWuFvkX`*L``wAH0Ek&>8ju8&V z{pw4z^^Jm6?c44d8{IuyqZF)aquo=pVPkOB(bZ){N8zfYo5gM$N$xSj*$d^QdsgQA zKB9u;LWC%aOYsKcRHp4nL(N5DFc?~VOSmN}iZjN@3GmwD;Y6(fbK)auT3#B+S5}Ts zpVsF+sk#>ZV^WL8Y}HncR;jVI z-8$qPwiR-SGK}3i3OG@ZGm2yD!ZWARCNCrMySfFR0}2h>~W z>#Lht322MtiN0B&g*r^qEKm%YD~^!?k3@iHbKu!=;20$~5=tbP+hoAeZnSdX);MsC zej5q>63p#!;O(P`n>cKf1U5Rn77p7IhplCAByQMTZ*Rs0Ab`={NhiOzH{-+;!06ma zC%v~f2NY;$2_K3QF7U> zGoM4S|AO4`^1v%AoWW0?TLjyH{Aezep@f!j@yCDBWi_@1|6pSwSBa5TLmRk78x<-T zHHV6kN&^hg#&!YKnHwB}l^U6%3i}#dg4HoevBpAk^$9h)IA7>rj$~h%_qAUkx+xO& zx2O)Ap(CQO!`KK1^akisgJC zVJ{RVmE^=o1tF8~{&^GO3enQI?}b*YR2mDo=PR*nY0PA9y&!&APHg+_H3$F6f;VKN~O?WtPibZQgU>zI(Y|S)IUVV6h3GZvl=~S z%T1;!ZxzCAd7oE9W2E2ApqoHXX-9&!yGjybq%+8=k**S*5`c<1BWHn-lLUnCCIJ!M zH%V~bj7U(87kgTYc+oQ7R2qTzFUga~_SEoju4g&?`JtRjt3&n?GOeQzW#mTs8|e5N zs;e0EmI}``?AI$+(PPL|lDXyjy=V`w;1+N#A0_E_fut(3F$@=m;2)Ss<@x0aRfBLP z&&mx?sPd9hZHfhLELs%;J=F4-)3rj;KWKk9LEHo}SdWyZ!g-A>Yj?m&SSMn1I7BkWY zZcWJ{P^(&WoUinh z3-qIxJ%b8O62&r!yPl+r$j_0Pv*Kl&;l%~m$kOZXoj9$-<9qoWd1tT_8;kENoM!bj zl}2-AHkew-O*V&qZzBgNOc76Ljf9I3IYOUPYalO_gSnCA=*bnE%II^xVE{&ReKg@1 z85C(Tpo*bJTW*M-LK7=KN#$XJ4dA6>fgI_Da#1fOXQGo{J^qw&Pp&-NRa$^;GWp$H z#~6Okva(<_ksDi>j)mNF*|R)XEave*t%Si+h0gn|W3!1li?- zxq(I07qqz0i+v^XzbvIeeXTyJCp|EQpg{hAi)YO5;kaX_^5X($3nls^;PioMfL540#g)@`CZ`cvM@m4zTcc;-V8-F?ss^S#}`(Ig0oC4~?? zg3Q3eCNiDEW(W=`L;cJMn)5@L{|UA(t(>{(uJNJ#L|c~C&DL-ZZ!bn#B}6ebTI^mk_ z*&6N34OF6gkX_!W%6#x1Xbm+7^10&3P`xxKzUQ{=0aUp@oQ0j_m8bR$E0m{Z4FE(1 zVyJe=!cB3^QTa?d)0y8_uw*z|a4CU&V6p`s$(0>MJ5SPrn6w=z74tGJfd__#j4`f& z&?+*$f!ATZBX}8*B#@uQoZ-oG_B?@5NCTJ?D*3pjYDugIK`}@Rsj<;R8;ULkwM!t! z{5C=|GE$xB+i>EtY-t&+Q{FY~m_@8kaL^M(MteFqlzc=IJa6qGfJsLq5y0dlkr-go zQAh+Z`3NKen0WLNg^LbFcJ$d(8jw0>`C>5L5ioHw2^K}KG6;7q!7d>YQI%VxK2uSgF_ZQ)DJ==hAy z7rdT4WN9^Gssn|18E+dIBi)Rx@jM1kGJae&B z9L>W*3?=*KQ{o?sd3IPET{Gxp^q?~`q?^IC6*kqgAfe)vpJZdRSgnxG#3Qw_ z(q!dk;Ym2*0O=VJh}nrOyp?2tl$8ly=~Zf;-ds1;XH~s4E@Ui#VBwqy2=mpY?@?(p zb=8{*fK03z+WqOxog?MGTu*+7dg*wgK-roilgapwH+i$?`9l(peSVVY7eIu@xJI0- z#b%6MO!d7nB<7Nypvu>AQ3D@y{b;V6B=Zds!5q-0Z-v#`9hzFb!HXfxaEc|TSMIuD z6kGKinb2%RY0g-)wsweVTXRbgt?4@eVHp8pNgiw#M4wRqKB;kMoc=5$PhXp$Qpkuh zeN7O05baysFrs^msJ&dtpqm}*mjFrnAi*2b8z@~|`gjsM9Ief3+ zbDmbcl;mn`hS0|7XsSsr;)$O%5l(2}Lo|LP{I1DD5_>~vfe93xU#nd#azBto8i(+WJEw?h? zNRNGm4phCqT-uRCV&YXMq8CSRxpH@XI}fDq!8FV#CwSDRrb{9YdH8`H0I0>~vpBvC z;7p8mI6#2W#38`8gi;s`JD?*P=@r@(J`SO6S{#Xh7!M$s*U-h1($W0N%vj`{WLmm4QtC%>X*7y>fKO zJcNnUU4q09>_9Y{07Uu{>YR)@Wg8=~);qK`b`W41zU7kKKoAhDvx%sB)Yku+ia#*1*fFk?MgGUOm!w z{GHJNhDFWs;u=>r%01#dB6aoSa);4*VEUvWVakp{htJ%A67W1bklcAk{e;0qlN`#$ zdM1ZS>>BgcMhKl417r?)ws0?^jjer_Dt_v4f@f0X4$@n+?M%k!SOOxjk)^I>B#HP4 z_VAf3pQh>$+6CD{hI}>kG^leS?mm;paUr0&`{J<3J8?so*^!X4z@>v5VoZhFl z9|wtcz|W&g_TIv7|KFrpGVy+c_!qVb8U$d|DF0U+tb<&VnF*Z%q2jwHP7Q@h?|mF3 z+WW5ZNU}^2zeflEf3)d@xtzKgnR&~GF&c=*LUDn zWU0u3D)r<(Z9b6HgDR+O70A73de$Hf{hh-y69po5uqebV=Bo}aK|TcIdIz z*PfRrUsH!X^fL9(o`kktv@2d=QeTn)66}oL0*qEr7gcGztxNY2DM{iFq^u@3P^geA z=|n6H=7tMB^9sw#x$^kJ;sCCD(uXt0i@8Diy}p2u$@-yz5poHd^++(^!f0|>bTB1X zF9D3k63a5i05C3#WU06)U{Y9gFbx*~lf$BeDYyWb7#1B&zeV7pLy?6=1FmXD1Vq77 zQlk+c@(Prxfga+y)i^xkeVKNgH0YLH$_pdQ#7T+j6wc>btQ3A{vInGkIGg1x2iU!n zM?+6}LU%VJNTWvIgnKtJL@E8l>ibF+Ay8Q)2odTm7-ZVCX_PgW3y3J?qDHnr;JuUb z7EmraGB^|vOu-~%lSNNAL;!bO=y6I6bzy!V&))F=YFC0Z{mFDB*h1Br2>^e>^Al(Z zs_e3n{%)Fupu2wrcbEm!!Gf_Xzw`T=ON5OC^jvCkO^PfD-FPmV_K@P+?uB{N4HD=F zazlJ_osgeIF+X~5pc5p$#3$Da%mm9{(Mm;0XksE|k!iveaF{0To%LOXK`75brIx*c zi@bMvrp#o$5H6E;)Kx}N;Y6L>D9OXB>fzQ%CW)Mmbu>3H0=KDu&xE?9h-hUO=xEc- zwU-7pkQ=Jxd&yMPM_wK1Y#^DSzIZOLWER?aADP>fwi5mMga)<0tEnKhu-1AhiEiVt;zu^QDcJx5w?DqZw2rP0D7q^#N2{F zgA`V3a163j#c+5dsslxmEm|ZG$A;gY$Fhmq%-2Vxsd$~?1fx$USW7REje7ixbH}Q zBu|L52`({`;w|=i1$DM9m-BsYNg!Puhsgu|o|4e!X8b6{59{PL|%53$MMm`g4Ns5%Th znL$itxU@)5xSP6VtOwp-;@M=m$MfX?06qPjl(I+Ms4UYwMch=vX-yAlPUOl-W`Se* z9;oJ}VpDD?x2!Nw7$#?`5^(Cb%a0)w-Y0eBnjagIxM?u+?3e(>5}yl-nXduGe8PEh zCGRzRkbwwPi~%v)qHe=D%!HLKD)!JH|6v=FR-T+^cteSlkvEFOIEM2@@<5Dq6((y< z(tR}sA9oSivr=W(7)@o#vj_!AIh~UxcwpI#P?Yp0U=xx6^X-9|$>L++X^ZpY{&@{` zj{3?5PR407$q>-*3FGR9)0R7K2|7<^2xn^mk*qAi$0|jYvBfZ0LIZusm)C$il+*ak zwXq{!|8s=grc!!iVL1XwvcY6vl8r{d+Ii?U!8WU$_wMGSh~6b7-`nT`3-2N+V7#@j zKyom*&!z=buuv<7IyS0V%Pcx1-~%DI)cLrOi;^6f5Gk;J+r3 z9uT$t^QXz7B3^_U_a7ZKb%X9Pj zq54m#DbZ3mY<*HJAG1@aEU%AhxBOg#mkOO2iUDE9eTA`nFFlqCdA;LKBVVoYs?k(s zwN)D^2q`(?ky0kx2SmgI_cfdei-kTGLMYemNk)i3lpq~CgJ(@omhuQ;?@pG1B5li8 zNbq32udT6J7b^&s$D^~Df+Wd5F_(6cq%XiBGQzmR@t`_VJL&Z2B+WE5;^*XgY`C z3a{XRU)&8Nr*<9!zm%q$CYejPYQ~-gCzy!8uOnYUl76=AV3UKyohbM%_|$rWU#v zgG!LPx7-aYiM*oHy_lUpgmgxH1ijPSJANYpITLcsVfO?$RC5SXGe;6aHPY9I*_6{9 z^=NStBf+hLV+?cWY^GZ1f-t~%d@NSWuSw)jxr6{y`V@jkP;`CCVK11~A}KV9CS)2a z#a9^UC8D`J$X1uB3WWDeO4M@VY8;=i|n-$Hrd^~iZVp$Y~{VRG4z1YN}ZRg-O142{NojId)tI_HELH4Sa|xpX?_rdMNuq`_&N?4prYJyPL!a5EgC5Ed%bVz51L z>2cv1Tq-Vte8NXmeKUIF+x;mj6eL%^m4uz@tJRR>b|9r zG?2f(%Fx3PSNruk@HAMhRnygI!XEjoHs@(%wZse|t3bl2y7&*m_R_^JSAbo|7n2p4!53Q|2E{LQD^SR)<{Tjm%$0-s7fC5hqIUh=|%~ zlWHow<@w}Sp$BphN!E`;`Jzuz zimq{4L$V^8UZ+_RaAKP+1l zL5nzq&J7gyqt;s+(i)2du4Jd-V0)xoK}>J=AT6QlD5rLML_`I$ulV@e9K49guk>BO zGUp-2B9AB+-y;K0MorvPu*Nw7*d|J4fU@EKs$^txp;Y)t?MUCdlH#Kzt1f0e`676CNv`*J!KM z6Fr6M@xG!#=2$q~D35JUyWF$d)ZBKyqdq}v3b*6BmV*JnbHL<=*f8wc-26T`JfcPO zXAf{kSZ1Q)@FeKblLj7|8VO8_YuSp7s~)hym@@C1H$uwLJJ@7H`9+>`8L8v@e?6(Q zlv)5@RUabiA&%hWauK3t2wB0$W0oNoAxng9z)cZiZG(jqr7_rlejgQFkv|lMR8#cm zm9MggWn>u1^y!95lOw@%jQDvi&D1~yR!o*akPvm~lY6@k1I*e+&0c3BLHQGTv>9^k zw_#{#0MGGJPdd`~58^P9I2qB0O29e4ngk2eXa*}GbCE{b1$^C$gx(W^3ahSC5DE8O zP|o9!UK~Gq1jR+nq|9k9!V_9pJ?45~vC5@B1o##EnHm;X#v;BGqToq(96bmSnj)-u zQY)+r@{g068nSa{ZYP8_>nq>gUc_Q7lOA(4Fks)$fR~k8aCw09a`3t)s14%9C9&r_ z$@A(Gj{u7Z2B~`hVf)oDAMW+|n-_4O<`n7-R`4{J)EeW1%ivtDB4-IR59mdm`(+dY zbbtD%Gn_V=AjIYKpf6U)Lskf>7?G2Srvan@fn)oQaYKzVp+m5Py&hzcO!lp0 zIs79q=_h{#g0xYQwB-43yGp~kf$Ex17fn#$Yeh^>?y?1S>@1R~P0&Ea)RL-gxgsJ? z%83aNnB=6b2v8`@p2ve6(UQbL$b3F)en(qFSLBHZ@0891Trzu3cRDDgMWIe|Hb=k3 zROy63MeG&|pIH;4(7t|5{#m2`Bf&5k6`P`q>)76BiI`XjStrbR@mDAxB;Jv3uL{n0 z@jT}c$ugQ&f#F{?jMc^K7v!{YTfquN(gd1cA*`N?BAQP@TGWC2$t1QovR`>ct}?Nj zt4Un`3^cPIo) zgMF%^O~;4;^uDUO5b!QBi8b_isj%TBZkpwIK0Mi=SWTJ!NF#}_uQT}x5XACifNCL^ zlIE9Z(+p-f9?q2^3meKkINSHmtH}H39@=n)i8Qiccr1H6^WX-{Rv{b~&BN#dA^35F zmtAbaRAp;mdH8iULIsR0fnm9@wq*ARX@o5WieBd;7^psSK{$@b=oQWRa1!s^Ny zSLj_`$*Ay5eSdyhb6ak#75D9z56f=cvF+ePvIp%YEII%vZ9NU~l8CT&4s zxMz9BE?4hp(Z9c(b!#T>%|fv+>Xe}I#Qa!Y6#FiTa4FtcZEq;!5g`9AF;VW>z1|j_ zFtYtgV-y!5jVN3P_+JaZX%H@Mpq!4Qe?h;;pM0uc(oNmp|>rQ13ulQieW9YGuaX zGB&XmP%pWS+4Cq;k&=P=Ap+A(H?eH77B$d{k#`&8i-bI)MEt;Y0@waT@0rH#4~h!~ z4DB4kW&?LksT8WB#Ss4)-vPsUBs&;JGDWtK)S2w*aRK=PLLKNFS=LWp7OrIA5Tl-h zkRXAjjU9@Jq%y2N-ZF)tpV)?_P}uceaY%gzhCo^8zGae7HF`S)<6^gu3&l|aBDoX- z5OxWfgH%HiDfcfiqds|m7sCo92cb4=V5Ed3cja+C-{MN{C_t znMQ?TT#O&3s~YmEA@gUhfOo7Beec~@AXSOFPHCN0%vaA)Dl$?ODoykFxttfv6jTYx z_~|lo&R1z7q3`tCzL(X2YJ=2bpnC-%cociMK$1mOp-F&x$=0J`L;=!`gGHm}#P9?7 zLXj-d`3=BfvFQL3+6&RJq?v5~L;iS9p^_M7zM2fhLZyYIvdOSYEx2J%@9=Y8;Bk-$ zK@xT}DJKpi3IzA9N~9Qe8_DkoWr=u3M^GX&M>#L9a7xKK^K4_VN;Uag#cG44MirbO zv4~<{!3meLG$_>99wkF^vW&BmctS?e^gLV*APbWowIHC$>xN#yX0)wXVPMCSJy6?p zqQ->g67|MvY^r@x0m)+0W~n`gY;mQ&VV+GRI&x7gUmy||B1xqq<`g~#791;GKxQfX z+*%NrARlXy+_Kv|(?3SMbfY=zL88?}`$9h7rI0WKUIy#K4I@ zy~wf>;nDel7959@1I^ONFuws(MKfU4XtH)s2uwaSwz_5w}rle zqQhcsb|85q$?cUQ$7!>KMIiVE)ZZ`)MW5s;PnLV++MqWTUbdP^t7>wzWFrW<#KKbt za4(sh`2?2C+p1InqCW5tlq`v02rBh_hoBnHcOWT~%v9hv0(?gev0U&JCivU1@44}D z1m#VnE(@;?)b$6<+7C&i%#~MCZZfZgBz7T&OP7wWJSif$X%H)8?mVjp`n|H79n4q9 z(w}BnBh)#~s75h&?&H!+Kstu9kHvtPbWDJuCUv@yl$*+Q1ED{Wlu@3KfOI2V<{S3| zLnZo{01UlAl0r{l(wo2VyTCUz(wmpe7fU!rdf-7xrj6yB3PJJN%QWajm#WuhWPELs zZbd-agMGsD7CdYsQQlIfItar7bmzy0k%^LJE|;8tqAoXJ0`a|qcp)x>n>F+dHGk~7 zw)$kBpvG+BwD4VjXo~Jjc7cNT1s*4Pmx*^Ep8u9cz!1(r(@W5ReDC$T!CZMI8)(|e z5B4iFQ+;so$TsP7Cm~qUp^S(n1|eKZt+Qa$>S3{j2wrtqP$sEHIj zydfPSGQu~GBBf14Zuzm45=RGTKV!sah^taKEJaq4R5rVHmT^ z1(x89p^WRERPTpK}&1Obp<%p$25szSnI@1_2)YD2{He?!PZ zk~$5YBW04>rcOAU;{y{5;6cvIjpq^nmnblTGg0Ty1g{ULU6v`7Rjj4qz!LC=r)O(8 zUa<*J5<;RRb~`db9K4p!1_sL$$Yod$4|1|Ck#MY>c;za2{k`_u3PV|@gTvRp-d@Go zG=Ev*yeH6^SG|^b39PzbKYd<;&C9A+nWkX%`1;pQti0PrUtnS={>lXOtp*gyyt9kqFI%#5=bN~AH--< zIi`Rk2&I6yx4=_zgRRqK=NY&)Tq?d6fp7wt&Pbw#ly2PesdC&){TIY9gZmg@ueI11 z)aMm(xYTicgCZJ+#+C3@3K{Wif%1bi`Xq4~S(wTo-UJ>Z7JSrgM?7lO^GYDfP56o0z}kNo-2$3&72_t z>fV(s{H_69QT>siY5`D70A{jFMHNEQae)YJ)E=*f$09Ro_yjPj7E3k!LNTL;PXHs+ z*+^c8CZ<5}xjOVQqlRB7X4CKi7afXJ!{?9tQU5ZuZ5q)K*YK-BF%4f171i)Ps3Z+P z3?S3+!w?hK@PQ}b<{@@_NQdXe2^xN(*p?fc(;Ko^s&xg+-cHwk8skC~2fSi}zzM_h zgJ#KVz5<@^1sQnOCWHRKx_YnutWJ``7>@uF-tkOM9{ z*H27vhAI$UUIZM*%4*awOsQ{)4YEk`jIvRMlul|ph0flZBWY)OV%X3TYBRZx=AD8D zaK{x)FtcXjNTxvYBi_}~y!7%u-=C8@rel3i72J3nJjFFvq?grLxB%6~A=reAAhZ;e zwqnryB}mEA$>C?=Oi>zTF9&bM4J{d6$e|HKl^u9q3F$U6_q%g>2?3&s;Jq|%i`@RA zLExc@VtdjRw5x&!Bok@mxdcm|-c&F|d2X^7(v zR*sY-stI>r0sB-C#g#z5 z)6+X7$dBIvB(a4l)|V)jTVE)pN8EJsh|v~M`nWeE6$IGS3?jtBg#@a6HS)N z1!Nt~4Uibt`V2W!>1s_{^?(If#>=|lyRqJby6ix7C|AzmqQF2mB38SD+nZfHW9}7l zC`N$hl}ba6rQUIPL#bwp+XFqz5w$B((yK`#R==kJCnNH~Fwq@X0I4Q1)KlQ)830Rz zxk9ljMx4eG`vQpos7*kkb%SG1=MCHy92_C|6y;GvxGWrElGQLtwQd%eFjPomIlNTP zafV1RRi(ZIS!ZzJh(3WW7#cP8J#Pkf5f8j-qvOZFvCt%b3qJj5VKh%kS}TZ^3RY)< zSwkf_)4NJdIVfuZK{BB^;!m~>m4>?MbECwdWn(1K8Z;q%YGe_$UA&+(rc$I=H*%3@U2qhJiA9sF)fPp*xBP=fH&?k%%r}E_kZ$(uP3rXR<**mH*%3 z8S{Gv7#>8BgNXXE=lLQgwFM93M4RJdzrGni!XsWy|WLb};Bgp`N$EdUvFhC_yJ1_DHr z(h~D3DO(@S$xrc#M4MS)Y4^xu1XVlGmnC{+NMx)d0q$kI7gQQR8Zx9WV(6u`RU+x{ zL$SL|dxHzZS6Gv`6QgT}WI@`2^(W~qfnSy3JN9LeePLe5TwzFgkn&~u|K}H89J5L5A zxi(WCnXHmZ5S4r5f{!v)FY7q6AhYe#gUIgwfjkTpI8ulorBrMH5ph09&D34C=s*FB zoa2m=C9R>x0*72M6C4s!xOwVS650h}OuxVgB{2*n_=J6hfXw%fAd^ObL00n`PyrMa zo!IQ$`N@zWY@3*@lSRp#H9pGP;(esO6e#=gENZ?ykG)`oOH{Fki-=D`yj(=Cg|gLQ z)fOOG4We~clEZF4@jTHvXjqz%q5YL?!JkN+NpD6{V+V=q@Xi2ZMIaHP^n2x%@nVmE zIOW}$3zb6^4L#5r!XUYwBq^u#=BJU4wG%gPA{`|hHR=`)wIj1qBmm(ICy_=ZxlJMv zzDge{VEG8hg=}i2RvnKoK&0!^HLsK0RwQWPAmy3#>Al?G>Ulxe$qVc``D0U_@pLpe zhYiKv*~o^@URRK<$m$3&;H1|zP~q#%qL{_bXX7VsV{&*W1Z_kHio>HaRQgf&(3)hz zq0Mt%N1(c)5ruD%@-UW3$xyb(k;b{~tr17dwHHA~K@jDBc(Y&!>3Fl(@d*jt zK}$jyOyfpHekji!wj!F7YfFe>6H0RcBw)uRd0Wyhts{$IzKn3V&}I|54=v(MCjnqM zmfPLitOy!F4xdt)b&D^7ggXL``%{A4n9&}}+Uc2T1|*o+rV?az7EqdeDws{4Z#}e! z+or>LmjAFmrPIrELwSk2h9?k1l67w1;KnlmCEP9n(w}DzP*2^{o@r4f$`b2I82Y#4HPTCV{)hcaGzNYFwOlH( zJFP*%$pfVXjc5=@rrIaMxCNOd8~?r`D~m&QJ62^fDByp;?TN#Z4WM^}Zz zejsx&QKF2^Lt68hA^DtgJ*~8gp^o=DIQ@J8NuYcK3S1IeO++Sv^{`dqSFZUZq2rvxXzvvye2)3QR)@7u=!ha0 zIa$bxQEMQmb}=A5@|1R?=Rv|cPOZ^;~9ypr%%=-IJ!77z_YY%uGtlFz3BcJJzgwIENB zr)(x5CW=HQzwaEH|FjbiXnD3WF%g?aNdhsNGKo680lA{@HUmJmT;d03 z@z()7K`6M^IRw7qEhMio4ApB3KtWu|kR4RLmNZFO1$xB*k_JcyO2IrGc39Y zET;h}j~x^>fGrWWAx@Y$%SnZ0NZ?PX&jL;PE|UR?SjpruH3A?FBg3VR6!Tk9N(fM9 zMN0u?yqqX8G(ZQfH^Q;Aa(*%Bw&@0|WW+wqnpsdP4S+EF3dl(l@HOD(3SYMX+`3 zykLWQh(*2#kYJgf={t8WuUq|^nckW18M=FB?!5?#nyTua+NrLptw+zyVqQXEW3Z5H zSy(!fWsJo+#zqnxj19-eu&_LQKw!ihcEP-bz!oeE;wAh=WagidnUVjatLEZ!d|9UJ z|NqFy$jr#dh{(uD|IMw?wh$iuH!Cq!?cOzh=SjCe;jQKk@{T0l4{Df)DKPq1da-+b zhnMdFD$XEb(4gzY!9zw(qdT-cSq8|*5T!6eUhkej>FnRYet)EJf>$cVHm(*Q^oO_u z(+q@knxO0kUAto)|0SwFeX>yPoA})+h8J_iG~e88gdRw5GJpC0`Zafvx#iySyT&mr z)Lk*G)?Fd!^`TnE*T^;|8TmD)ZZK}wt5Y+j(P+O@ndLqUOG)zx~d zbNT=Y+1#z!oaJIBu3;l*4hgI7zX@x=2VlFfTnPFWC}>Hty_(1q}ZcqD+8h@Eg5v zDOXTY8}yMw(n~B$xdFs2gQqpee9v}%aWP?(q7|WTm?E&yx{qC%m@6Pu*ov;pYXv|F z6m`ABF-u@192Q)1w|nP~xO?1dDdtmqe~hKCgWWKH1$hX=yJd8j2o6>u^eb?V6?_Y1 z#{1r?exw5sXv0 z(`8~%X2lj>Ccu|vB{mC&aK%}*SBaHlcL@3QQU|N`mGH+zQD@(kKh0ro^JdVfzucY# ze~T4dqsoy~1O+CqCfkTaPtH%P0z-Jjo-+?;;-;AZzzK&U@7uVlP2_+>WSM{nF{tc6Zq2Zwr#?A2oH~0sErCx zP6FqP!^yScg8p~ zZMv=2X+9PX*-m@4b$D-^(ZQyxmLvH%TI4<|JS5e4^v<_qIh{95&{5LF1+v(?YwyIG zL04KU_iM9Y7|SxsRe4l$DQ%T&!QJk2CG7*I2mWXC|I7$T$>d;wYzzkjCHa3gIr$F& zUH%^iOOI$7R5t$)!&u&8W*~iuJ%}!mV**h%XSJc>IaYC-&aC1p9r|u5EnAxsD5It` z``xw4DFvz;GeGBD*CcV|lngtZ9JRLtaV5FbzsL`X*2MR7LknO|u^$ntFBn*UBBZc8<0zLtU2O`7@WzPVtW+JFMn6pRI5)g05O$YPn=(jKM38LP#S4~FEw++ z7bW1(&GsdK%XB49aQLu?g2Yt>Ud$E`>c#OfU>xwKMezZ!UJM@t)`{Q)V7>S~0M?4$ zBe=LJTI?R+W)r0Rgf}oaWa178*E}6!0!|zfo;7VL%|VmraP4NNxI_!dZ|IA_(LJ;ov3RDov^MtjlLo#COR`;;v~>cjv}5l0$2 zHx5E(^5!?Uo$4z_!bA<)W3EiF_{1X2eS?SF=v{%6pMzp+F3b8M`jD6J<^Y7cOP`_S!fPjL{~op(|OiNlhSl5&E)-?$-`TTA~GJCJ0d zn4}*BRrUQCk%zWpmzA>QMWwNVZ(x`1oYA)BIbjGn55S{!InsiwcbO_3#9Tao*r!7% zhAn99%#jrC{D*^Cdyb5g?cTUQYmdhB_RP$zc9-s;n+|3WTdnvw4YFX8KeCtx;*mmz!J$7lnL{<^y@ zy$&#Nk|kZ;{)+QPwtkKZGoy5Fxk!S&PaB>t^oU=G{RFcofA`42K{%}&qxF16*$_Nm z(PEA`S{l*ZelyRnDKdwxEK2~|Ve*hwMPU^yqc33wuGZ3+2w8jFr9ei@Nd4q$gs#|s zE7_&XR*U(c4J#tykZ#snpAdgcoL}tn;ZNz(DGQpf;gTu8D@&#PEG37p5^sZrCio)! zVC+V5z{c~%B&SX+k0Fpr{&hWxWQAT?c3&cZQ~#3UF9g97r^k#G6nNWKGOQB+V)THn z%!(YQaNyiuKk6X!E{t}oDlN=a?)Lt0YNqkeDoYoy?F3ILK-~I8I+gV^XrK1Xkv;9x zzB#EUJ|%%dDdGeqtsns@DxzzkU_+efTLiQY(^oqFSac4j`lk6r=R?8>b=D?nd0dPb zDpGT-{cS$hyys{!qBQlG13qYim`=O3hD0rcTX%Xi)P<@m6$PUlSCukN0wKzUG!Ul6 zl{5tfBo$&-6P+{dH#lXpnDh{)OItXD(E?lle2rTwv|Q(E&|V6aK?%uGfblh9YGo{_ zON}7gx0B^?2tD4hpu`wTX3%{uy3U0qOIa;$g<`=`7VVptE?r{AiT5XsO|anC+TNu9 zUa~J)0M*@-bhZfUwME>np}XzWekt}MMHS&bWbr}YgLE~WAvqk5ZO2EyiqCLLAf-?f zWkWUVsgKW^HI=GH4KVYnp!Cyel-5Ve#t^)LNXD~Mz zCFHV2OQ2oP5d6mpC#-NJc!VX{Y!uX|Nj?fI+*3%k1{xj$r4(=aBxUQW9K_f`k2_O& zgGZ`QapydKh{^7w7u{-4h8WWl+y#`VA>Oo;5`=>Ugd!lV&2 zvv^&XI|Ih=wA3aRiJ+4DHj)4M4zi$dt_pcb#(Hy~N!_eT(NY$+)srgU2Yj~_IUJQ^ z`r_GCKyteq-JWFyM!4`C_1Rj~+37jf znJjXlA8dTI#qj-p~#_h0l}n zTYUGC^YLde_t3hYa#>CY3xTzDI4FaBz6o(SdTUB=pV|h{#LpV}NEzYd0nY)GKMXclYkxJ~(P`?;LI&?A|%Leb62w zJ9+mEJD}74`qhiQ3+?v)-CMU(KztaSPTDWMbTJf1G?jTL{UR?YWl-Qe@fn_7PVlUG z1ua5ji`Fd@pr1}VPs0R3t>>Ntt@kcs;4zUsQU#I}n>uhojj`Ve-QsEtD^vhYg_U4Q zeb7*Y6hVInP))}TWDo6|exywIf`AU5zCLi?Gz9_YA=-Th4 zp99o%J%MTG$;n3@!*0M+>M=pl5)S`%bD1FTGt z9B5GYQ(WCP=-wJUXhDS;wkE>`k{E{aBa#H|`_Ub8?fb?t0FmK+czB6UcSqifZjC(U zqz98iZE%uP;|gu@)+anmeOUo^P;>sv^xFz=gF>hZ)3UFQOEAj=de zjy8$g6g%(DUs(WLX{$V*IvxF3Iugp8`gS` zhR5+V8C%l~Wdf|ttqdq=tC9IdO8cb{VE{z3nOqtf-X@9oDQTpf-#2>N)fcAI62&_M zOo~c8RWhJ-PM-a71&vA+Yq45|dP^R%YF6K0=Q({uvAPMNh?k?__agrj3ph-==7mDu zZC<{tgiGt?Hx|)Lx_+mEYK)x)WH%(aNCIU=1(&>(L_}ms)F3qqH8^k(8{$|UIXX1* zEYv7s4+*0n)wz_OL1J;8lS~v0tr3v+5}iQ^#*!Bi+wq)RK9ZIOZBi`6EN-4)Hby+| z-d;H0f}KkSLJt&o>8-VD6p(fLtc=C14VL`md-+_&S*$>h4~hq0Xb-f|E8Rp0stzCw zcU68j4B_;U&^@i;Gw^mDuxV0>D)gzh`NVr``6c#W4!6;6%#Ah$hiSlMH#lIq<|MF< zSFQ75FdgHymWr;dMHMZ9XlJN=Cge#at)x~+_-sGnTLbz5O_Y_8m9BaL)#h`P8hI71 z?hdganamqH3x!|}=m-l|bb^!`Xuj97i&;!HM<$mJ7@>maQOQ}V?Jxmd2AJj#4NAf> zmGB84RhB@v6&HBctuJb_IKv|r*;u@VPKFlsl1V79k#UI=_ecukqLwS9YsO3B0z zF-7gNCy;nu(&?2DQDHu8Sa1{AF`nUvl%1deh)V|_liB>FjZ-StQpglpO-vzJf`&#Nq5HmzbA6Nmrl=MVY9R{25;RA3kOV*h zimVStS2(iZ8Y^dkB?bE%)2A4})YS&=_9BZP%r%sSgs)waa>WD_C0jBe3{FON4EaoS zcG9N%<>ZjmV9@|1`s8H;*$9qaxwAue_1<4c#KA3lYj4pUb0DPjR+)@BRHvjFpU~W_ zQ%?3sjoZo9q*BpJA7`4A>H&npR>}8jeLEQZbCjnrBfSN(d#K5D6+8T& zNe)uiFUb}}Wg)GG;$0*?+tvj^g-kv-15!!i9a)ivL!)k1)Lk2_- zJM&{Ww4)O{f}`}hQ~0v_Q)rsV0V`zb2&h%=xXjFCXYmJivr40elK?G-6*>SY#36D3 zsAMWlPI8syN655CD^Sw>9QaZW4_t8ogqw6M-5yTu;)tdz2nRC&6aVlfM08+-^gR(wj1UbpC`2U$3U2(aU>M3e7@<#TA~ z7+-@bG!JmZ7>B=d*(#i{$NhhZ<^v?%r!nZd{W)3_LofCLU&zxVr%a$(dNXPdW=P1F z^~%sVx?K*!5yW1oC}jV*OpM$h$2);N5I`8FDgR!zSO-gWfIT2=LeWlSk`?2lRjxx( zvCyjV@&5(7)S;mOsU&5L<1+d(MM(YiwPr}plvPPfmFzOAQfRDy)dZ!*0$S#Xt`K_> zY8*&>wlLZ*jXwwM8Ls>)C>rg;PP~ssI@O2^>eOj^uSSh!J;2n5qAhzPWFQ-l`qR@b zI=nRuM+tz7-843sD9Eu3*=hE*bZVeEE7I=-3R_zWT+$WKNRAdH_Dbt7DJl zxICFfC`E3!^ITPvVoHq(t8{NyS{3n|QdjYMm6f&kg9c&IGn>Q77IA}46Q@~1^{W96 zInw7w5`^rW8w-ubGKG1^>D&l-)X!C#UEAlFsZzw45tH`;q#0+$6yFeYRcB)Nww%q* zRbeqd0*<~{yk1$A75v?R_$n@MfU1($8{o=ud;=6&wylkWRL*B1_s>OuW809m+}jm# zmTYmswPB6L>y=fxDrPRyRP*wy39JSkzdB|%u>nhxvn(@bByr6S3FL9jGNkpbeEOWL zZZ}6lK6Y=jY<#Y|irEoXR=i$CZTb1qfaDUn-vCS5ENOs-#v+;^4N7ZsqjqsA@f=Hp zW9Qy3KXkILf+NDpir1^CZ3T={DpMPD@=6#*m81=bSb|Yf`B}4GDLQB4<9Tp9C;X_e z!DF9-1{UmlXaK>^mIe@*z8XLkrJP5w@JMJFLN7Hz_*5zEI>3;gj;)!8v#BvpDCTel9=ny`~(d zPH|Kmrk0J-4jl*I-PPgjpGm4BM;rSUkIPOqu1SBK%8c%mra2IrR%6eLnw^I9bLk<@ z1RPVtI8lQ$ma^6HW~{T5zC4*6s9+q-prz zrHDFMfXD_Fui>MO0ZsZ{Jz|?c<)RlQ@eN}I*McZJiKr~#EuqW-2LW#>lnuiQ!_b0C z>jY}8RfRP<04?lD)>aE$F-Dcj47r4x>Xn<&t>^laZ z&$HFIR%pt}e4#Jlo{X%`eNDGg0;rO`lZ3%)?Se?`HNDVjk>*P0T5w@(iR)BUhQp#K zW9;laG`Fx(2a`3ASbwu)B=>Uxn^SOnIRyD?drj*bsm5a}x}*m{mKCrSgtVm^lWm9= zt+bw`!7pt$;f}SfO6-{eO1~<)T6y1;6wvy{fTvnqol5ehw3=#XuR_&)jG70Be+fl< zy)hclk|N1w#Ii%Dj0E&gEl-s#pmI`q5xtIioR6w}Bs8tqmC!~ZRFdu7@cu5hamW*Uc|iLZ5==Wi-CJ(K$VJ zSD$$)V{`>HA?URXtZ8frsb&Bv?^xZIbY-+2RZUCRL0V%qOVh#Y9a>gGt3feU%PS}; zkjEcqY^YO3u8dwwl=Q(=P-u|BSSQIJEU-ZwfJ#F>4~4ZXmRxRd0&EJLQfCG#jE|E_ zQKkT1vqK=95_s#i^=fGda3~qd!Sd4H2pkb*L*ZzwMTj`XT3UN>0veDc6?i;i@qpSj zSd57VDNjaQtbwz89q8hN&lXO{7@vZ!00#Q-taBB7a89`bI6jM91su*O=}gnAMxGI;?^&fAzT zWOy?z!rqhcT(fD6zWCR0{<-3AB*QuzATT`>6`u}}o3t}z3z4r%8}(cGv8C{ z>gask(7VF3pz8&AQ`NXA*uZB}_+!OQ*RHVq@BU2(3u&zLr;0Sxl`< zJCIm5*y`cL{7C9MQ56kQPdB zYh?}80F}1o!19)@+ozMtItV4Th5kszz=0-PdZx3~A|?BKUPsF9Th-a{Go7X@%=PyF zsxj2t4s>{QoubM43Wv!Ia41P??lU?R8Dg5XNTWjuOhcU+&Pk)gvanakPw@(Ggv#KV zi{P$}du#NE!aJ9^4q9;Z)zCXZw{fRzf7R<57JybQiN#QiOPqm@-7W3-OJOt=xy5+=pwq57%=ag4W5(cXK6z5t1c>!NG^bJdNv0 z0OC3mfVl1iAfO>NelVa{$tOzJzrOscY@s4kan+|^UqUufpo5xyIX|TsnGN?(v4wJ4 zwsYG}&&W`WrJiUFg-PT^kOa&udeC3winpByBQ=Mn(M73gl)%g7F$ZSw)giz@5)GhO zNbPdWRW$GtU5!v*$+s2W04J%I3d4pYp99^=aKVOMt)%lutrQU%y=KDh;6IuUsXb4eAl);lpN$d3Gbq3h3_0bH=ds zIAS+5+94e@qDeR9il*IE4q3`BH#791U*$lQfT^^Xz)P(n2bMOm9Fk}VIiVcBiUviq z(GcpI&CLd!#IW@^=~e@@3|kNFUJxs+d&KrKOp*>$Ii&1%4N~vVJ*DBAV~^p&Mr&aE zwHs3oDI23f>W$g2*%*eaZp`i4jVXtejnN?W#@w#i7>28E%$?eeDTkDe(IEB4+^N|Z zhO2JO!As9=_m4Y^;e5M4%KrM){Da>Q+nLw*n#td~mcva&@_?g?nw?#8WPQ{|wnj7ceZ zDOlcYf$$h?QH@zZT}C6Hz&cDp;ooO+P~R%NWbH*OaKvn5#|YfNZf@<(G)_W z$V8h|^+3>mvGZ*wqTMQVGd^V2Eco)=s-VuXs{*R>>tX3iC#;gA3}6lOAyu4qbMIbI*BYT_=(?z12v2uk*=!Ztb8URfo#qbVzyoVG6)I}LDaMlAxK${=m7GXIc2V76vB3#XS-{)&vu8! zlw+wOK&n4)&_$|JRxI8@YquVbhyB^3r~oGdx#LYxF$rsgT1nz!0zW@Yax_Cc}#W5i`$W6qyuc7(Y%%39(_nV zX>|V_Exed~EqRb*XKQO`)Oj$(Arf;^JU+xt4kph?x9*0WO6lT~KD~7}>`ekn2)=dK z_D}|e_^Orl9hWN~LMS+nY!xq4zf`HZ7a2%K?Om4oEHY7n(MtMWo}%09fVR$P{9s^C zXuYz*4vtC^gnhHW7!F%;7{DP%VbDnX0W&9#?)9fLx~VBi2Edy7Qo&GhRqd_zYf>AG zw#`oW5h7FG;;xH&Wux9uR*WSuBdObDF*jFY)x_$VC}I+gaV`l7^jcIWOw8Ayy4SXG zVcVVsKOF8KSW!`Lo=S@5(}RAecY8E^S|%NcM|d@pqWO*~%Q4vJDa-}WRr6;Z=u-X$ z)=nXWKI=f2^AT9X4v=0IS9E{OzMK;IDta(R(4+&^vgfY-@E(b%!^MM{apTn#CAfJ} z6B^#j0C!C|K;)RlGJFxkvxeJo0?2TT2oh_d3fb>M>@`^wH7eJncGZ*xCFw=kb9aBc zjT@qnM}zMk5bfnatL&z|*RSesCFkZ}C`J|w{LM^r6 z`oZlyn6as>1d}Ci37;Q72|H`5OW5O6vzm)H#k0CyD}3x zD!6R(8n|o?9eE8LN&OjMH$@gvk?Xd|^<0sJ>ow#bcKkz~ef(u|>6 z_H#w9#+7W@5?k34apQMviJe@DCNr}_fOLAjMgvCRF})>&)$27HC<2fBuVj#Vy+#An z>opl1K*tR&8JJ$Ld;($^;u%;~gl4dG7HhK@ILz#RNVZVdpk#{=t zha#VVU9wgsv1CnH7qYqYS;CSVdyrClVzER&SlEQYHsCzi z+z(+7J6JvXv#9H4=B*r{)pcG{WzdJuwCel)!O279nrJ9De6e_1mC6rSEE%*if#2)- zVvXd9E0zp8y$;-dqs|4cYlc$@za3EB`RG9KA{q(&l>rXzhlA?SYpaW!;j-fy>5e=>;W7!;}m z)91QSsYZ>~t=VjFGHTU2$!e9#BFuq3h}6~~+@W|Y!yW{A%T!p5S6E~5dSz7-4@m>O z)0}E1D#dX$R+yT5)^c^+RVd&&x&UlR)@R}X7thXe=%Uvsqy*{%)gPiow%?r*(hT*t z#tZn9b6#ONbLaC;_aS!5g3PX~SjUOc*TfZ=oyExpw|k>njpEb5!EHOf^r%8_qkf_O z4{Rq__x9jyfD~2uUZk7nu8b|OECOUWn-3=N2%R6r?dcMQp)|~qihRBVikHXdA>gbt z7}8#Ywi3u)h6lp23xB0un%GxuI+Zor-4T4WoLL)*BpxhI+7A|kVXu9%=uCUT$mP)0 z(4I|NgFsNOOQs;y#=ql3Xe=|7ug=X8AJ*}1BT7zj9z`T0De?Azc8j`=Jlv{HNk;U= z8}b702Ym>SmW#HKW9Qx#CyL}bR#Pk%W_&cMc-f#JGfPo0jO7Tb9Y7W&>De)aeqZAO zf!Jkxd}6i}S$f`IH|b$oq?mXK&hV9)-qI?xv@Q|U{PAGcZ+Ae?()ORE*PtDZ8+j>J zt1`t3LGcV|eX?S-<7uxy-Ngbnos5wg&CQEY+k|Ux)PvSX0d3e?K1dQj+1)e~@U{mT zB$!B)ttxpVEIA!_dfiS#7qT`wVsIA6yDCqMgUT#TZ%^jfH=JR)h2WhIo^1DL-RXc| z7PpM>LQm0^OXLJ0a*!KE)?7XEVWD#w(Tc*0jC7p=zuirBpzu!(GV3Y zSSeJX)N5$Ub&-Mq$#f6<-ACDdj4&vqORzVfbv^E2qAezqaWMdG=`&+Ek|?L0;XU^I z-5>NYdtIK!S2zUzhM!7#@04%ZN5_%TpLoHU7002MdAW z?~Dhdc^d}OT5Dfy>vBs>6G(~ngL5NLg(O%wMhaZ}7}{~a*9N{V$Cf5Rnv+e`Gk3SB zLC)4nn_2@)Lp0m{3C3tCN>mgL$vApC=`TlxhM@@&oyB|{Q9!J;tW>N!qDu8kQh#H~ z@_P;VQK5cs$?`Ojm*_n9jV@6h1MiNL!0K9#mH^jssIZH;EP^G=?>8afxHFu^^V%E& zttsf{(?#R*!%gxO*rZ17$?>Swx_svftv(xf+udP%V$%<|cA=WV-_0+3d^1ja&}+5u zb{p_7UnKuj>($GxS9glAg6@!l#~{gP*csN95IDVH-4U3M<&P{|CO`oRp3i_gHmt!<=Hcb$;XNUM} zy{cj|e0N8-iK`)Cn<}oT*JLSgSf7zzwuNd9W>R+bj=2c$0bgqVS1CPcr zzvs9hY^dpGGZCDU6Y@q$7oV$Z?Z7r}DmD(FvK=4yg^Z}xMpTI1_;YX()p(vJQia^g z=IjGsUED^D7fC3V6J;}Im!?ZuuL4OVdF?burBO2*)M*-u0_~gY=d68-<@Om%vb_#f zQfo@OzP7VKl`ngP6Y?|d^-pg>HMF=a_T*+w8M zuqwtp$Gi~rH|#~jndhx?S=MY)@3p~bFnd_tyij;u8!nm`y52|52li~R--8aqR@aN3 zq`8Lwr>H-vk1{%TU1Tv?$3`g*V}|T*YkWJgmw2&LiUn?A#s)UZMr4$LG>cYmqbOWT z8&9ZA>+Hm-E)RqHcre7a`Z9=~%=;rc;p*-I#)kE@Kbv9FyPMJcP}=e0^)cu{EKW$s zAC2Ko26c>2Da!LC(<-+>3u2bi9~UphA1N zW9za|u?}SLR`-(|;BbmyRVwB}G|0+qC~)ZWAwW>t-PSwA{^d-I67NvmuClnR(3a9? zT`d_Lg}ou&1k2ez&m5KQ{$)6eYpon{nwcx^wqBeo{XFh7RrnQ1-D);ZTm$n zw{5l=QkRKnmRgX7u~MC?!B`^A+*S%X;iA@5%vq%%&sVinGO9&)7BfOEmv{$@as|7_ z<>sBiXt^OY7#fct6+6!WQn`lXM@1SB9~EjmdQ|8fgGa?0j~&9axF5D~Zh~TK6%Mof ze1kXOh!@D(3^@Q;OxIxbR4_Q^W+}Ic;&RDH*`kLK?S}0|I-piU4|6;dlcS~Z{vOT| zi>4`Zu1z5+cSl2n{(+HcJ5hQtUJfWWU~UOhz@4-Vma(v^oQ33sr|?vV1^b=RV$xDm zDMbf`x{$2XR+y9PZg}3vfZXU!lS2)`u_OZ)hejzNLELs4Bktm!M655PKJ35Mh1^ir zZJp5z8B>JRVTdV0l&G2Ow3^CGCBsmz;ds>7;>&DOo*;-g2xH@dTEv+xDdNrqsFD)Z zDi7G6apg|DtcvuNKuWqP~8V}{rqISB4K4k#Hy3^ z)b8^7kn@*;;t+4ie!N&0*0M-jQ-rxvtZ#cCw8(R!UAxL})IB3b1t?AV;nUO8v;~sF zbm61;){tgOb`_-mtL}^-AvaM&INT|ynunE=-o#0zAc4#Z@dlHZsofjn7+-D)e`(|X z`j%-G!-Z+pV0d;H(<%JPM$vSKn^RRF2(BNG&iaUrzS)1ufyF#-wyXRB+al_CkG~@} zkPi`epoY?+TN{#WKFYJNbZF6I3F-)O1fML1_14~AIF0L&8epofWHv|eTu5fro)Aa$ zu^^S$rf8|2cYR&zYo^<;VQo!kN-oCSWW@IdWRIi( z+YNItBb3oa(e2CIYZtvJ>~TJfCyq+eK6fJ!b4I3oewS3XR$Z9@S*9{>%H{3D#q_w- z?Z4Pk+ZF@WtB|@^%CDk3uix^`b4T^;Ib{C_cm-Vw9Yzh z94J6An>`apE!hPx`$*#Rk#>j^JN=C!yHkymtvY`Pha3!tSDsy`)~lvP&GP4|lY+O; zSt}O#^4WtV6A5$WJE0D`XG-g{?TJQ%Q>QQLjGR<<4J((A7%~{>bf(5-k@6r=fLMU! zb14u#**XG!co}LVK_AIWmJ1a}-qrO&;bp2xNcm-I5@^yD_h`Hw3;1)_6(gds^K=n7 z8kZ~q<;p#+3LE!=WkTt?a#3DqkV0{vR)HXRNK>)I&?W{{3A9&S7jD%L3YpJBhxWyU z^G$3NdGBcj;+%oRHN?b}$O>$J@dgYOoDaZ%p_MRsO3F^^%7Wvqy4{q0x)9iWHPGc& z-t~p>(WUCD#_Y%0=?QEc)@exGD|?+s{Y^eV?pF0`Ec)t8$IaL!g6pBj!w;$DG<1&<-$31XH1?h zgDK@9Ie!?p=8v&L|FXP7in=nts++Vtu=Wd{4V{BE3OA$dd^OcraO;v$1JyI5F`h5a zD?F1K*IHx)NUWT|UeOXiZCoywauyG51?H>fDB?~ClD1fG&FeGCFlRuCE`?l89M)?) zwB=YJVp<7_QV)$n(>ZX|=|jm1soCemX{yL+0$>STL~58f#*VSI4CAJxr0Q#k$j@yM zdPcxT7W|#FKJfr&9ALTV-%-tyk9@A+yW*A}t~N@eK$*h!$D>#KQ*49*3r_OapN)ZzA#UfGZNN-&dc64U#Y)2-NDb!Nf zR)>Y?dfY!m(fqi&9{Yq zLd+$ls1sd=Rm7?=6q|#tzbQ={mTiqth>-+7I5^|R8*Ddl*swpf(MF*r#Gz@HCWsIq ztX{8+n4YDpi&gx9Tt$J3sEvz5-q@z*%92hXuaYx!5h1;Ob{bZ&axul3?S=aVJr}5o z;~C##!xM!xXz4abN*sXwYe`|9iM`a5i7Na-0T>-s39QuC!^I0Fk^7rF%9< z0ThdFX~MNB8$mfSoqNbCPD5vdF3M-H?!c1R`Zn^3v#nbR0lmskmY#_eIk_x$%T(yPbm50$+S5vpilV!R|V5+GIBCQxp)RTSYoRY62wC^VFh3Jo74 z4F&=^Adkk7bU3Feq*e~39p*_S0T+PI=F{=h)&Vkwk4F}C)}oyBePIi+k}t=RZW-V` zFZH;=E}bPH1Eg4%F|6deusj3_MlWQb+Bf?9>$!U=558i@B7rw^d| zxRWFt%P1R?V7Iwm15G!|xg2ab8v5<^uzQ`iU`TAolvd*k3`W%jj@|ef2fold>N?P+ zcceGyoRo)?2N2fv!OBb6aEm8aPe`*BJY=Er*Gh0aVW7!y{lRoM`csUy04b+22UcqH z^#-S`!m(Odhz~Jy>3g}vN$U~krCOjwNeXh*N>ss?&4d0h3sx2WF zWvw-Ul+eHyLYT0eeXug*a$W29+T3{+&yMq<%cz~J1 zOOtS}hk69|Lg;LwY9*PGDBm%c8~nZHk>&RDBh;}uza*vSLsv;FxWy}@#EDvz7O65O zQ0vmAOJWI`B3skcE|}UNVs%)`Vd;uOgsiYs`$4|_Ft1(dG_!4wGyxqZwL{WGCR z{+SUZ=fJb+A6Y}H;HbSMiag`K5;Z}|FT0_shaoiS^lu+;k4X@%eE15hU_USk_KQO$ zViE~za3{>OBSqg$m3ug{Vu7KaBSI?l z?VDa|;1ebyN+;C%O|OS(Ly z%w!mMa5e0(Gnw^!)KM+YcHrIKhZ~d>pSMqiw;M@GPD#05O9NzrW!b}NzKCEL3XBFa zUdnV>)p?LPTkeZ#M>MAO}`d!kh-6MexsMcDqKSCWZMuhW-_i;lQ zRVIu`vr&Y1R+09Su75h2KTUEngtxm`nCZ0hbk_30(i)KBC6i&v29xF@Nud<|GX-)N z%2|U>BT1bI`$8UZ4`fC>fzyXO0ZRf*G|GY*lAx#vM<4}1?GNX<38im>+kqtx9tES# zxD<%<6rq8#fdu8SaVUV+4s)#CSn1k#ZKqy?3q?mlcDahFR*#$a5~hPn?cS*u6!uXl zp4>I=HPnjn(o^8VOq$JeRdRAjIBb!=hDkoe@nM7)Xuc2BH0X?O4d(Oet2z572{}y! zmlLOzZh*nHLK$&vb{@Hsjb?Ni8`iSj+0JOZIC<#TKI|DZ-zD!)W-Sq%N`uBRH1Mp6 zNp6As{)z(g)}$0J1}4uc7N1%SH*HPCyN( zmO`Fe!4=CtD13;k{wxDwTxoAFYG?$ppS04Z-c-kKb?yelMkC=ch^?_!KjG_*?Ja7q zb*$?Phec|UR_;fF2D&$y&wy{?qI%zNbv#LdTd@Ds?`g72-m7O29%6{{aInfqkkajR z!8QV+E>=G0?oW_v5T#yz6>TFLLg3QMj&a}V25u<6WczqehG_VY5%bc0Onbp`6bGtI z={&G9wF!7X!F+AnFS5q~KpaP-oL&Q?&? z6dBNXj2nw-6Oq=km3s^jV@eAE{vYFM1EBD0iS-1f{T}UdsK_P0j(>`LP|vz6=%PqU z{p<2iQGML)COM@)LbF`Eh&j;l2=_>!qZX_a^MVFXThKyxbZ<-pf`l-RF_mGyG>=3W1nvn@d9D>zGgc^lV$*Uxs zipP|MhcDx5g)!}pW$Y@rg2NnG2sUZ^Q%nm~Znf6fwGmWnVG#Zpmc4Gps$5i-7C7iU&KXI;ngrYqG%%Gm@4}oyqUJ)#0r2q7?!liyZ=ZDL5Bt-yC?Gy> zdcG*2lg?r`gDD&=%rdjcN&oazQ6<0+YkT+~dVUXAcT4@vmgq)WH1GYF6j4+Vs$?Jk zLnXAQA6J4BaV7f|MVbhki~ASNhO$&n!kz9DT(Q0}dphcxlv+;U)=`b+MpXuly|-Cb zp9=XPs9-rn?KgXVCrn0K!Uo}9qsdmB{baf3zCihKqLo*cAPxwK{MN4Vmfjg7*JKbo z>@j=T*o_$kW(Qak7o`brgn8ky(K!}=vJ^^@B#}|RVi??mu2W-Z@47(azhaZD&sn~# zvbiRFFNBYL#|QlxqA(4EKuDjGo7zc!tTTdfr00f8pPkT7$sQEu0XCPqkM<~5&z41) zgI~Km@L|7O35o^d*0_rX!dW6WXNl34+$0Y;r%^ra``{{EBR_4!(j36m(Y|kX+X5XK zFEL~I)MZ>1!k?T}4!ppag+eB72k5pfDg_~5x@I?6Voqfrre#bD>JKH-+-?TwTppDL zInI;~P6uE_eR*0Tr(*=rPicRnU_<5v3XyhY<}IZldxjpAsx7zcj%V zu9>ZW>(1S4eWWbMRVqZh?WAS3!k~{(1AnLcDJ(#pCF~k`{nM0>< z1@%Gf)4^{Fc1rw?%hnw>ljE)yW*ePHgv8t?tq!4dB8sK4Pb8~l??6>j!eIWtXtJ~9 zp@vyIH;`(2>quT4gFjBZ|J-qb9*ER44V@eLN z^KH~95@|5FZf#sY#M$vsbY8=t40kOYrGN<9U={RwU5ycwmS(gPnNK8s zYr0EGOjhDU+-F0Se%nDJCw2+UnxJa>D$N|Fk3a~eSg+Spp*@vURiBVR)ww?H^agYv ze0e@8zBUI62m69l1Ur*iC63s3zR{WX9^*a)tMaorHfGVXx=|?ltcRlEpa*`9h%tBR zY>(5QoX?l0GffQsm@K~h)(YVUC7iG?*6JFyqzPCm3DdpUHR=j=gNgzpgj{rngSW8- zyoc)>T;h3}w+QA~OlLSv&_3latfB|AhWFB0t?=re7a)*(wDOkECUdCA#t+4wGI*65 z$?i}j?@lJH0~bD?!NhIXEX&SeFH9!RMsE2kWMC%NT@YjL{t_Swx$e}4$FfpFu|V*0 z-O^SNT0;wfWU`pGr9o*jh61@nY*IuV5L=>Y^p2dR8{IBl)r!0~c6uzMY@X+(yNz=A(y5fdT)GSh;8iG6F#A8#VMb&&Ie(Dd}5BE>o?>30H(b@3H8;R^&FBHk-dG268q%isie ztUS%F?JtLlg*E5M^I;u4vPD4(0tlDeh?6|+43RjJ!v`#HL>L!y9B|{QTDHbjZA!s4 zPD^TLox>tWD&Miey}1N z9qn`$7~~uuD|SHcIZZBr3e|QMBrC7)O#28%Q8!;!x{hb+S&gG4;TU&0yHPAt^^!(D z(HBU4Rpu;j`Z#SE-V`buYP$C2QoKMj?aB)w;~ToId?@0MlZ?A2SBC+Py*;=CbO(o~ z>>2`Dx&`*WHy_-$YfpR1*^X;O^|i=qzR5{ohfxk-u|QUyfdt;-5qgi9k2hH75=5?*fn=g zQ4pbthr>b$_Bta(ZcVcZd(4{8bvaOohR7d9AqSN74|mX9yM3^?aTHw)7VRPz;4fd_ zZPzKlyzZ21ySDJV#MCGaK*s#!QnhtHhK?-wa1YxA94N|<$E^2gjwR5bv zzfP&5sAZnYGsG+Od+iBjN-ry5YPmND2jCVo+8K}Z6PM_RGXrVLx&z=$KqUYN$X+q? z+xnsWut=CXE9fA0vadHquk(V&PFw%imiuAK0^ zi{c993IzVTpah4=)vTfpb{ttbu9;=$p@|GGq%^H&qT8XOP$z2Kxr(UV4G`GFj)Hn;4cx7t*Z@Fkw~FKzF2p4>n#n1^%iB(q#)JpBDZ zZ~m|r_+>)Rsq*WCH=u^m*QaI^hu=4PJp_l&HimF{oRSw)St)nL7*Z#Z^=JIqHBX9j zSE1z`M_y-*bp>oKh!oW5N=D<(VBUS$s3~WTq1RiT#ygVAy9V&XFiLAZ$n z@(v~qW-xEI=j zjf+CpCKjMm&+^y;;o;5fzBN;=k74bi;K=auS#lIw;MUq@YL>lh-Ifq8#4Pr;#@Jnn zO6>N+TT{V{EEa3fAC+oY%g&SY)q`?XHC?~Os9gdf<0}%~FNB0Pl=n8ccyxbyI)uoG zE++}x7xVMx0brd>ZtaA}o#0Ia@?DZ>A{PL!nHAa`>F~kqnfFf+_l+dYX0UlnqEM)l zbr6wY!^6dclj(Rdnbnp+XNB{a5W?Sq`HpbFDeUcl7KY;wMhGx0q)G%77$v}#Kpehx zO6lX{b8l$7%r7w*oe`jN+zo&-nT7?dhc1GOQ&s>MMlMQ{#U2IGC&XGowpm-s_={>J zSFJptJD6?kxm4cF+^)l=ehDBXRXJns2t2FESl$^7)2!)ae~GzdiubE?t%v!O2D7bO zcF(zpJe2A)^$xQ@AcJRHbUcTXz!Z6OSZ8LVP|QmJo=)J;phS zz;X0!*hK<&5M`#1hkypVcta@YbpaI2lx)T2W`U_yO)K6$uO0BNq05`!@@fr5;8-paQX!ngOSQ-l2X$R?OpVY`#HGmf9po!6SHt;Yd zD~boIJ6nPU1;ug42BM;>xiSPT<4q>FE;*8GsNfQ__a0)Kd#xjR@3P*r=dR-|V|ccs zovCGa5@}UL6plEP`UnR<`okTBtx$Ntcrmvp?rLdHrZ8XKQ!I4Lp8~A5a$qpP&=*0# zkNQX-n@k$+tuu4*VmW1C#d~m3xcejQSJzw#D3tmpWr3oA<}fts(J3NwU6g4p6GEi= ziY(FaLUH7lGoTTaSCNL7c-Kt0&r&l}Y?}>ng43nEwl^zP2lET29h$3HNMR^b7hp%Y zyN`pN?8Xs@qM@ed10=(y?3^XK3Rmt0&TufoY}q)2Sw$yWt5$D15?*vsk-=?63ayS@ z9z>I&@xW!~=bx`c%1h877Vgo^h;4e;lM?R z{PWVS)C`NCnJ9PNIkCLk8P&2>Fvrs@UGQF(HG;fC=`8~s{YEm1(<$*Grs($S)6Vpf z>436*QAi8vbnt~B(f8EL`;-zyVxvkFmjJqknj=F$PdoF|#jxB}%8^uotMs(frA`_^*WbTJBd<>f zCK0M3Ce`lQ)`G3uy7An_OToc3l!mNfL0?CO1UMher36Ja;o+U>vA?xm2jG(N3G#f^ z=&Hj7C!Sk#8!2hC!(l7nZ*`vb5w)CM2xV`r#l2;*zuXE1R z>1{)rF@0F5Nk^vSo0G`fgVS2Wnf9S6 z4>$QHtyftj;jFdipHXTLIXDM6b4Mrci_4U&xc~lm`sg}E8`Ko`1dmXnQ?#;%1b5Jc zTm{ETv*0QfEI)j?P3`prPB*VdA$$nV5+vBf{j=6Otq9kUS{6{@WF3Tl6HAZ1rIBN9 zEx>x}V(B>g%#Lc{!jS{oKjlcZ?BL75w$uLUctZZ0*ab}9S>gL9xarf)#Z1Qkl`{sH zV72K0uAeM50p$o7Pwq{o2(#-L5ud zjdgHBy93aj1ajG77K$`A$e}}h=Z&&G9gG^;RsxEc*%7OyfJCuOwtAYj zP>MNpDY*EAJ7sDnJ70_`*OC+lC6Y|`oO(&@FPOjEV1tz7a!KH+u65qpHTN{=f zRtY$>fa5CA350&4ncE9eE{w6@=!2C*na!1pQgkhb34FA}5`iC1uq!@YK!YYi>z*3m zW<;VQxV8%3T!fL1X4o@<^P>T34RafpLP#AlFfL3g;GBO%YK2s6GJIOk%N&k;je=Nu zqex!#fhpIZ`Kl*UHhzQ%EKPA|Yc|;1-i}iI+w}WE0K+yNgN|YlL=CB84zarJw>}tD z54KnxDQbEgJM)*?2AA!qp@fWJ-c>nxM|^nN1p2UrgT>f6e{yzKQpVm)Z&DUeik1E+*FZYnE-7|y0eZjF&iwqbh?AC3_`Us0&Xk)(7Q8G)rw{L#xe8e!BM zA0N+fy-FaGV~c;(?^D=mO*KJA6ps3jIoQ!_iAL;iz~tM2$rq|HBO+B^$|sJlxo_>g zqqP@by!?V)=QcJZ%-COjLkC=3#EcZk>B1s!OBqovWtG^w+zzZ%Qs+{^>5%wl4RC$G zyeR9bkQ;(wjnRQIlh>39&6S?ItUYWId8puWOo~CYYZHT2sp}VSh^4k^;kfLL&ME9v z8FWCAY&#dlLPu3(!Ro=)go?m!t+mB2ze-mKf-9*u_hQm-UBa0giAaUwpdZ&tnl+d1 zukWMb^nQlrY17>XM!kVhOB}Kk>!}=ByIUBnmRgyrVb&)UPG#*Q<3PXx^9FkB=xtrT ze8f|1L-AUNELGk$L@yMYP{Kh%8`GTk@u)Kz(8UKPdd{M zPLd7VI1JF1V#S=JHhwzVgC?L`g{5Mn zEB>e_JS(dUVV@F-j5nQ(v7dA_-s(Uv7E9o{dN8=hc`}}~A9S$IM_vrGxKQZVP4Cnz z4Si(O)AkA75$q|Iw{1%ev?xYFD)*HPR;>xT0`ROWWj6rp0Yr~34=Yn1dsv1JdQY>ZEdLS{7 zA5-&(K-|iq0+iBgDNy9zGad~g;(;duVaI^DHHs2;$`EX~!jNl3@}~-BkVRnek!q4m zDdmdzN`d5(rx28UjwngLR{)UtAh-!__9)c0CZDT{OS6l*K1PsI;5@9s{7JjYrPOw3 zb@g6Pb9bkhVjI{n6)d|p9l8h<4>TYL-2}J+EcH(czL-5!bR=t1hyitQZPD*grhrt$ ziX$!b^y%&~#r6&n-P+nYqnuXRR4g&LP4Hh1k4RfY+GGt1Qfd)E;VH*%P4Dm_F5<<) zpJ z+1g?CEU{-qgMbv^b;&|yXHW>pVnePwSn%8{cq>df@j*A^D%<0#2pkb%CBdh2Rb$CC zmN(`~?Jg*)ZeEm@l;)+p9M6zr;lhE)Hre>t zaI^4tu0U2pqu9Q9k)l+gSnwOT6e#40;@Qkww{rp$ebH4`^_;z9rf0AX3c(UM-VI8e zvLQEwkm*&mY4c#HHn``=5&Bj=E<2s-U2@ zpAM|kHG@q#HY-d;SEqquzV)}JWH6=%DCUQ^8XZbfK;mr+1x&LZvtVHoHnmzM{hA8r zO(*rUNlru=Q`iepv(0`PEE&0@TZeSepHRYekIPU9mJ?*8omiZjsbZR9Gb=M_!HiGU zd_yk$;Ry*FquzB~G=w}v*wEI-bal~5mUE7VGs`#T(20{lk~G@%a0F4XK(x+>8?RHC zOK0W|X=Q+5DFrf_VB63Y!;}p+dTuG5LCPH5T{11k)FQXy0X|}uc%^4buvrRi)1N~L z#Zx)8Njz`>Lb zwL%84qOcTfo?M$0i3da)A&ud9YRI)imX+v$ww^e-rbtc(1cgL&hP4r5IJU;nQ|cF( z;^rl!KZByA%_UHPln#ios)_JnXVO=kem2W1?k@^#O{6UWxFVHH;r$p{uoiE<6sBFR zaCPtnSFRvaNYtQ0f11N5WNks6f=~rZFjCNquNur2F|P8Rq(gr0&rsq9E@e3CJW$+g zF?!g^{cCr&`z8Vhf|t%=xx}!vDp1xwRCrea?Lpugz+gLTIv!9Ay(-A~FddIgLJ6rfkd=r9rf_BiNrb1oq3c+>T4rW+Um=#UPnqf?o>4MvDXpwP ztdxi_&(eG}R{7!Iu>GgzUA zdex5)t-UOnlM43zVUb!&*1j5zBYGGC)D+m91TVk58vt>n32d7rj~13TTKuF#VAk)K zfw$ir1MeV(VxhukD)GwItpC)H-Nu0Hmeu9S-^!Z z7XyaNA!uKRSIBZ$Y#UiP;K7xzMfK>8sCIx#yjAcAY}hD7h!p|U8n9d^P-k%e2%iX4 z!gL3j2T-O(BB*2|b_4z^5?yW|HxPcMB@8O~om%zF@G2o!vTP01*;2Iv;KpJ;J}7a` zgxnW^YhINSaBUSLRZoNof}Tyd4IkYeNq1lyB3(|exvBWhcsvCA9}ke6Pxz{Em@*i7 z0eyD{_f`NLA+9iLXh_RffM^u9`^Oy|lG-TZ=VA@!kf+!^4-hRHWI07BoOWW1;?b85 z{a)S@e+nr2Ed03z~CdH}*bq#w1AqBTO zrw@>8_u68_yAPaLYbI{LCYK-$I!&;s z39b3t5uRX3s+=E<1rKiZw#jPT!Wg#M#e5_2{3Zfp`%o!dthg&cb-whRypvcI+PJeD z7BGAqiBnM^Q;X4*mvSgZbwWEkBrVMD z%Pwr^?I?L)J1_dFfGxuj-0==>!mSJoI25vKTe+SZsRRaD;b1hr9<-4*;bn+5)mz~u zk2x+~^8=Z~SKcF(uW~0@Mykz}CX>G6qQu zANGAhuA;n2!!GP^!Ws2!xHHEnW5d9xwmgicSBtQ!{Ht%pc zVvHNxp$nLanrmF8g~u@JjKX)pYcw@9aN7`q6aK72WS)%qxh7QlexrLsx*WVNf-w%l~awgIr;{Gm@$O&)*VY{EreBGvlU^K zP5?rAXN+VgraR5Crqaz~z1?wVzS=sxx6MdlUsubrs7&e=JHsURBk<|nwQe-MO~BOV6J3~!UV(r zf`o@N0##B!8PFici$Rlwhnt-35a40LLk3O{2phCP!b66%e90_C+9Ug?!(879T$MD? zhEj}Vt&2iuwQdO|DBFVS6*hr2W)Cy--5|TUKwD#O>9Zkhu*l*-Mm7>K1lOW+h2^(i z%;t35^k~q1v`2Zkxz((%3GTBXIFcnM2-KqpgtMu_AfiA_x$9z<6~He&Bjj;)#QIIv z6iY8sE*MJH6#|Wl!H7}a8W?&}`LnQIs1hkf@V(}>PEk2*HB|IHLzH%X5tYRmQ(Oa9 z7m_twJZKWL%;0hOZa!ie;7#I{8N7b9GQgX}Dg(Shq%uLr4b8_X19~<=5DwOq;IN`g z!BO*kp$t@WC=ra6gg`Hc7H5?)i$fLI&R_36iPd0oA_PYjL0=Y;*Pfw1MPVRCIiuaw z5|*kG7C1>4F42L}ZyTm>7J_#%nLw{`Nv6|e4()w-s}Tr?n1e%XkA==5bI|}NXeLKN z_5fEPo*pCJMQS3kNTsxcfl29MrMsSGI(4)Ht%%1wYBz2|s&nQ;(LY2%F>)qyI!F>R zivU=#h7j0|F-lvoT}2Cs?FP6V6MZ1HwF#(j(ghm<%-n^v2S>PeNjs2%Vv`YQ{K6My z90Q*4bGN%aMXC*V7FXjHfvkTz!R0%Hevf;E{wenS$xf6R$&eR)QV;4FG1zuEmR%Fb zkMGABKA~N@7*h+b5!uYhb%dGFjN@$~PEg*kJ{`;;Ok38oTWqa@+oZ-bN8H&^*%sq*5(%FS97eL>HD~}rb&?DgTq}G+vpIZEwL}nCb$vK~z&8ZeF9Q7JHL2TE6{lK*#&blg zkuyt5bXuhP6m;N%9{GjXJu?wEcaIz#gy_07BhQCG81&~u5Y0zNU87dC-z;YI6e(R- zoDm2uGihQqZNdxPLP(?_g6xARFlF}_E#f`8NL&|sIWo37pDOmgZL zjj;uiGX7XkP6ooc`oaq$jPJytP);F?mN@Gy<+Q-ww$f?!wJb&t=w9N;tq%v_{q>^` zuA6}SCQvaKqrowh6a*I{8XlVwF86D>c0;8o*_d0MNh1yXQ5wLWJc_OX?8_7A0w4)d z%vF^D=Bi8pqpInyUGf*|+hru*tT!<<2o@tm!_>Sa*1|@LVc>}|AdN1HU5w~1D$F_` zNJWgSUD4^63NB=2Rm3=jsUcM;X`)n>_4*G(Dz|UKA}sFTjA$Z>6|-{W&{~Y9{l@1# z7n2^2MbK90V6;G}58un33fgcmv@%{=R>KN;76J3k&T945OIk1%ljShcKxjb_3yC*e zWzdo(Xgn9L3My;yK9sGODe|g)^U|eDg6ZN20%@f!_@fp*5JQzj4n&}JqXt5I5tP`1 zK4L&YTto{b-@-_N=(8Rr5K?f4LSindmuew&1lAP%*lm2b>mAoe1%kA0g;0Epda0<=e_# z^EpuHs1!mWZN4h%@g!qau>7R(YHgmcr~oD5)u+F(gUbP>t@^k#l@|%7x~J&I#}6S= ze7v^PZpeHVGzQlbCTAKTr-WPQ@w9`$T*T_br|g68!IbtTynync!Q<%wM=HbQQZ#c} zkCA(2#;dv1wy_s|CADti@{l_?3e2Y}M+YWExKshJBXdEHe(Wr6!O_)%UEc3MY|B*A`9*@xh)ZNqPL)^+!l# zk#mhI49N^W{TUHT6H+Rmuf+&@r`>B=b0Q9&9S4Y$63@CnW9dUln`saE*{qc^7@S)M z74Z}t6sj@1x*8J+J{%EpnWk|b4SC10d8VB=g3GZuZbW-5;SL8=;Zf~8L4XvlK9jrV(rAqZ7NjnTAgx8u#DV+ zC<0I0=Fq%Sz?~o&b&}V@MJP%WP8BMO3N_I*CgPo^>hD{B@%PQ=iZ9JH54~~zm z0#!U8`WL;P{2hF_-yfVj#DyXrfDX6%r;+%A{LB8s*@^sp*gGp8>8PNM5rcAByx!^z zyIbS4&J>IIbnqm2AHq#>)C#fTovDX;FrE8{hsaflz@)cs(#C^$-S0la;g9gejn1?O zOS^w)A|%3(NB!yP7HPrLLC1eVn#1XJn8y#pR}=_7obJc7SwPV!LDC|-io1n}gk zcvy^(0c`Xtgou9$?*cX)9u9^*t?&3Ng$G3iqW)koeh0cn$TS#%M}5WM{O$&_=qAuX zH!>{V=yE)sBqdlNCPeJuvqyg?|>tRGT5p3N||kS$dJpUqLpk-2iQ z=$!4XBmeuF_}%vKXc5GM7}*Z4T|gx`+S3-gh6ML z7chE7iOQl^=0v@G8O{Qbz%RCL?cZ$1%3;pm8Hb<|m4}N5l>AW^HD~S7 z+~6h76!7KE@ylz|K5jf1b-ny!PDMCDz^w9R$gA$ly}4fo`JG8}lVb7j6-4G^1{Yo{ zMeugJe}dWIn??&>@j5E97;KK89P}w@xG1nY;!}e0^PzY#FkBc3%-zvoo(f(2HW9D% zexHwYy6mVy1;vu5emz19WnxuP6uC69U?Jz~Xg($|@rl;J;_>EQAK_n@isxH*kNoek zpY?kk98>9x#t#Ob_x3uENLZTo!}jE66s3`vTK@JO=NC(kXYfFMgtGXjfftt8UIDgS zLT|$xfpG8y*Ir@m6jBR!Xn9nNVR6g4e0k&|-+IN{eZ;~tr=q|8WTCfakT?lb0PV)W zzl0GUJYZW@h!GrA_g@#3xg=t|+g_gEp87`O0CI9KV1bCWNpmxuc=y={NeD1Z70Ps4)JMa)v7KisXA00j@5a1-K|Bdv2nL<23MS?qDg4AfN z3I2syvT*)WzB0+((l_Buf*9FliW|z}eX2U)ePGY=Xx-|MPUd0|=^VH32YTY;?BOdq=q=ue<@JzG`}$9G zP;+B~`+|EAe8P^#;7qAoddbVgA~~G*Fq+Yt0hP~J0`<=?8;3&Y!+O{Cjp5Y~TmF8r zD%QgS7YV7OG3gPKu)7qhWW$XL(3i(v{NwlGg~CzefALF541DUr*TR1a2MwOsHG{u! z%J9Do0!IuU&Q8b$(>;rvFWs}P$n9d@ki&(3c~=Xb$jO2~p?ig1SjUR}8M{>M>%f_U zcixR+AH4XaTIe&_)&8RHD}FK+>?omEg^R>Km{rL>(30bST6}>k1Yh9<;eV;S0>=kE z3YSOtNX`y=12+f#5e^PKPBqttd(Z2vd*B6@FmRDzxpgm#7BL7v*#*`?*kqT7G0G0%dmT8dz_2lw{c1MkKC>1W8sFNufhR=$H4W_JtLU$_|X zuXiqV&zxHUzl1{pPvkrRF#ipm2=*np5AYL?gYKDd8Q>vs7DUg+mcdJM5YV5%HGmhG z!)<(EcL4sdBY^)x;__dtF8r6xe*VP4rHKP%EUUt0FjB#@0@XN9?TL`{B}(}Fs69%-c`WnH@^k1u;J|< zP{Nwr<_+oc=9e|I`N135=CLrXi$`x%;}sdB&YTV(-Do-xGJ7qAS?<_)PTmB?3}8|c zF9NW_8g>;FFA6Ye7@?){s_V770JI%8+IL#Z^3sivCZS%*Nm-L$i(!Mk)yJs*a=^r9XH6ZcY zUusT30C4pm12>xphqMCQ+04e{L21EBOFcrFIWF+vvhZnwR z3^S;Eh9lk6{`%F6z4rdyTesRrH}3A=Y;SKIZCv=kPx+KL2LFBXTJTsrT(rL~xgT%* zybp|!zo|DIUig&ayD3nG@A*s5Tg;#LfxRz(-G$$O@iV^vBj4-7h1Xv&|GkM14?K5h zA200U$5*)r`?q!BgE!wa=wTP|xl8WThvLVNN3;WmIW7UL!C*F81t-1tg@5+hU;1ypi-{$Y zFI><#sb@YF{|ZjJ>|PRwe4~4?e~FWxDTmY%CVp51)4(M)R2Fq5Q9Pq2=b`x_eJ>?{p9LFTp*tUar%_9|uAzMQGEWe!+D# zBu~*Eu<(sPV;h+V@IPYb}p%V#R*+O!zaJ~^MCA< z(ct%jK+uHbt%@_arPtaQOzIi$*5PXGHTv2-C8^7Qy|LvPV#rx%{$P7kfu25#l|M_Ka z|BV+=`}^D4C?WOB-NiY^(!e6it%`+l4|Q~hd)V@>d)utSh1v9TXPKR zSM|U5nSbNQJD}n(lv7cjk>wID8#yxhM@X>paRg1kHLq0f9G2*9p zvqUtNuve8;=KcP&Z+K@5H2k}zG}P;q#`GwX_MiOW&wbBJpyv&Fdcr{KeD^dSqZbuf zv-dq0ew3`r52;H}y{>9Zo3myG86`AfIRzZ!( z4U$(P8&mYci>c=FegE{$0mw7gjO6Z}|x>xcj5|8Whp{0D}Xtzl<2 zyFZve#4*LkxK|p=!~}7CgMNI6l)2ei6T^);NTKQr-t&+C_|rkvM_8(Gz73&Xw+5p= z{K?pmX?5+{tQA{@YwK=F_dWDU@Au8W_=TY5BP(g4tT6cBHZ8169j;xK1*7oZ#lQVw zKTo{(QLZ(kw_t;#$6jC2t!`?rOn27o%O@W?_yN*hKf0Wj6>E(zDE#($Kk<{lNsiOM zSWd~RB)3zPgx>n6ANjxh6!pc&6ckYEQ;~Q@m{qHjmoF&t@^@eNUVlQG{2NOssZbpo zOQtJ|CV%OD-tr#OnRk&eneI zXzkCS5B|Y7jo(Fm@RzexJj*`#?T5XeqdxffqV_)vKKR&=c>7OLAACZVidFT2rd5CL zEBC*PwCYc^wPUxtYc5jei2#d?P9v{G5-1Y!9slS(|B~ANS8}!IDsMgm6^rx(|Ky|I z@mEm$U)5{RbbC`RO!KRuw1JiVVYIfRB{@R0glAZRvrQqqP zb2{kW8a!wXPA9|GWVkr7_a!>zDK^sD_mK^)i>nyh^C=S5&06jICP5DXJN~lj`;^Se z+*iGtHD~Rj6F1)Ke8We4T9wJ?G)DYsT3i?p@j8@Ipp`*%RgRvlW1WtgKeJd~zNW0%HM zX;Dt^x_b5JNiJ_!QMIa3QaI%M+n@GBv|{df8sdy+tM;lZtHZbc$cOzHtq#{Js90)w z;Cmvq!EDOynt$-or@s1I+4=JeXPP4{+pm;|9 z+Hbwc-of204bQR%KIrfN?>|C4@aC{~v5iq~_^hG_KJQ(B|NkQ2(9J9jtLgzw%6;(< zJpLV$a<^>li&2*jvbS((2s?KVkl7_RODmM&#+-Ro(HH*K|N3`-miB-5YE!kUKGH0e z&;EPA@J_N+_Csp0k=Qv+RH+OhO*uu|WBR`Si$6ma@@+#0?(CqWCDE2RXNg>e#L{+l z*1q>^zMpn>?i3Wjj~WrMa{f?uc0TOrqkeW9bbM9~I$(NJmZ3J>O4)6%rlX^2a-aFN z?Vl%2?w}4$IDB@}2R%8}vhgfhyX2;kx1avvFMsWi_d(HN1w~cCQ=}Ld2^d->hG%1{ zuPS5v&cF2Ey@$s3sDx^`>uVF$bZj*V@J-+G$8RSIaJP~slcjYP^Kb2<3#9TR`g7lV z^=If9&%JUw!1CrSUc0pqCac|5&Bsq!(eJmgc)uyrr#uR9Nly`r_XL5|z=NSra^ro%i zq`0^4I7Dlu@gLfJc=*r0<=r$NI;FH=KCG4!Wo7!R%dfnPwATlvltB2K#Mvw14^5kR z>&;L8dD14jmJZxAi0lo`)aa&CbFDaZ?B&Bx|LyPibvnJ-tD>VyLA<}t>fsSxOk1KJ zHl_Kh6BWWc`So}AewWtDei_YB4{MUtc(%Q$XsloPRbTT1`=IH#j3!zhy@FAbyv9A| z7IM*J|MoBZ!S}X6-ANgB&xjsP9{luMk9o)Wp`nKp86Y01Sx`vhanr2X?|sj!zeDn1 zP(sP7*J;h$(f+Uh;SZ9x<1H0*a29+zzOpi_QS(ZE_U@J6Bd_G65^7eqb}2C`pECS( z_O=X7{mJ!d*e!Cg#VfPtwSD3L;qUy+Pm!1VG*3qbb2Og4%9`~t?`r)EvZh9PDrobL zD1pE31Rg0|vAnWag+NVVd zK0ZDB1B#KF_kLmzwLi|(UaqjNwX#7Ujd}Ho3%nA1^6t<1 z_P0~=mnRB!IYYW>uW08TuKv*{{uG^ecxvip*StIBlq};!Ys_zJuB$x1edM=%-!D7>eP6r`eP(|6t%DWz zs8e-3#b5ru-}j5JfZ{J%hGKH}fdjIeo{i{iWZh zb?(b_T8JmI4AHbNw5ZO1xUu;jirDyat$uK0b|4z_fTo51$-6)3?WBeN$JyFz4@P5p zG&}jTUjIM-bF!2FlPo<|leFoWXlEU-eSH59=#1M}C{zg7+gkQ;N#nkFQL$2X{>@ka z>UB`@pH@=w49CccTA`8t>9=)%iq`b6tfZ@S^8CNdod^HNuww^76e~)H(0lK__ZCX{&Af8&y?e8FZ8v?K7mZJkGpK%|S4 z6_tnl`ig>Gm^t}QG&WJ1OlVK}+JD#Uhu(I%*lI?!GLz2 zeX)U8OQ@Ca>Dh_XapikI0zt&7!)?`UapwKU@FO2D?+z3nFesD>oLvrTDc#zUk!-fC zEXzwFue3tJYu%jsw9n3U&4BYm1}8&Zxn)FI{>$@bjz!D=QK)SYhsC9byYGZ|@^ga~ zyKjZ|KPKB3)^j3WcWslz6L_ZdNvLH!3)T7#UI%OQ!Y_Fuay$3ChSfOggS7SoPMz$9 z^_@7u$sKCjio1oujJBCu74Du>)?w5uBW9p=_%zgdpM0oHAEtPadcg_|a#K)|!LoRp zRO9k9HU(n{c=eu=!TzHAcAyMC*R>As;ncAVt|*&OiP6z7*c75_o3$+WX)1X_8Kl$?F*|;Kp8;L`d z9Ef${x3TqRp)P!jk9?~6fVY)@#_s?)z@@?c0Qik{h~0ytDMqB zH5Y`LblY<*mntw@)E1|zk9Nk?ZN^XYx&X<@$RwaSsd1Q7(>*^6D*g88)DDxCx+TJs zD;*=GQ}K=$rAMv0jhK#l^s7vm4Q~ylbZpnhSs27?m=Kw(K@mr8F5e{vFU;QBy!ozqPMzrOOyM4m5xiTSn zJ9;*M675G`z<67y^0IH+96vD&TK|jDdh{$IVJiq>CHH;S>;TgJU1K^{p$T5uQKvM6 zKYwu-p3?k7&@rYI_u4___g~neWC`Z?k5<}+JJxQu)1Bt^C3VWMmn%PNS{%jba5GUp zSx(aq(&^d17MVoJhhljm*Eq$;w(Ru{>(DB|IX>S9!-eEAxK*&|6%0kPc26OVWP2p zsRkwA1r%OsP&qYoE||6)b803csC=*6-rXzR;H^{`lzSC?3c_zeh_i#vSUH3l7KKB(f+Fz32W}GC7e07rA$8v=(6rweJe!&xp>GUj+tHoVTCpw+LhRbEA@o zn!VIX%4b79Sb!FKo=nj>=nV1}I2R&~Z&Plag3_4JTMYB@hM*VejqLQAdZ84UBlJ>EpdNkZ@K z<8f7A8lin*k|$0UKgxe*5oVk$Q`(p6eT8y;m}!IDwtyP-|K3|U4@Z4D*|w-&Q&odH zT~=NF2(-LHY1vtVwFHZt0S87vp(Z+9116%OP?gw$;qIIO{86aZ62;(XA}fHwt0UBV z$xv}=3ci=TQla%i^Ufl?9;WFiT1~^PPNtKcpeDd3U2Rj4NDjp&kQ7$ea z-8*GWD}LP~=2iMDukFNnwK@W!C=H|RN|tki^rq7qx&553soGenp%hU%L*;F3+Vsi+ zjA*YV+Lu>YQLR%M!41Z?nTHv{>lm#^i)f3AXH#q3J)=5rz%_0?!6r&0sEEPX!t82{ zLT*sng&48liP@zgYb$nKC@=8!d5*>C1#XPUAg8>Fnw`|?@1@?yX5s1YCMJj2>PD2O zb;ffuW}v6FnaLnZ8>lLrONJC~z5!dkDJI}VgjJT$+*S*{ zIbpvft_m*|pSW-3_a`tuv708e_N+_|WTm=FnlHD1_-6;Y0m+^SB%sae13cPgH2rmA zlqy?b+?>?fHT$9aHsac~H!^3WR2^;(Dh``{T^H$&z`h6^qI8?eOkQ$)@fgfZ-XEcT zaeHRUllk@9KF86MIUp0{cFe)FDU6ml;N4<5b1DPhZDNRl*Ai16M8>!Ou0#*wpu*tv zm8JMx0jJL;PjTh7L{{nnzb2@GQeD(yaLK@#7&|x=i9wVMh#Qih&)PE!&)5&E?e_@; zeNL=VR{{@^hgVc#9^7)vg0g3$TTU2*_N*!*i@Yj|BcZCv&j0M$Dzs-uqLM`3gtR%4{$7!MN@iFck;xlvCg zcU*$mN5>-)>2A(rKBOgqanq?wr_KT#4cvMt6X>dINXHZ%_nf3wiho-7T7WCXiHLLz z1I153oD286w0aKivFe@DuwL7?ak;L-o|#TC(wcP=)jG9r*nDL4Y}_}TqPAWJEgMcM z(H_Z1A>yL?)LQ|K)-BtHZw1s>NHD;d>F_v804QSAks%&l-KDgnV(as>P&*pPOj4CT z)1tu&67g#XF?+IxtUQV_x`q@%lJ!ep%Bou;PQ^Sw7zg5mINtkJN z7K1N#G}OBx*F3lKSPsyfP13-a)lOjinog`~?{4^e0Y>i5VKZ768aI*6W9^DDQwo36s$?fDvu{DhXesROei^3E%@I(~k0{X@7qUch2N6AG3}3kWd{6}RS4 zKGbRRDpsKnb)k_bDH!lduf>LZ7YKLep-xK@gBq#~^UiHO)dgEOPNn|c2XPN~5hoJ^ zNr;^0bsstf<#e&aBc=lMgKNeh)Rbj$TkO7w6U`7MU1sFSmSbp`%&N%X;tq zidpXh%cU|)H;fuV>^E2#P{jlFnw>tlAf@e6FuPO#+OB{K;pwd6_}qF)M1~f&T`>vI z1}>BP7&*`pnmAxoghf1T&DH6mNq*q_qo=(BRG0Ho!5XG|yx~D-_zEuGU|t414AeFJ zTMMOV`E`oO{@nT4Ia2oL6}9LYSS(55j6G66jZII~1zH=Uuls+!=m{93D{Ik{&{ope zmC(mA=?k%+x~cEWhjBl3Rn7a7pJnI+#B1cT#*vB}^J^4wBl!M)XYa)mtgE@%lY_;@ z80UZ(Ff-7~Yhx&1eZ=$cOhjM(8g4@UEM+3rK#FRjr>4yxRyEw23yjxtGp6ewJ7Ple z%8|Mmw)|uNM7$Yx9XBJ|1|}M}{HPZRpIo+jVm7cft_hn|27= zccSWiX*OqHi+LxWh5p=B>;8lmOk;;aAIGFeM9su8huTiSnu$$o*rV92NM^~;f9#q) zJ%ID(8gj;HU9zdhLDP}!7SA4k07!4CA!%$@Co0o-T6Lp|nCW|K4N1kWQBKLLbLuga`}1Yk2%IwBUEvut#-e!4KUveLY(6yK2a( zp8-tgj@vV~5f=QWm7Qmx1&^yCY28`yOOE8PKnrfGA!+O_`1KhNPeltJUqeE%7M!}z z@KNQ%dvTwUPy<4d9zFGzL-~;4lJ>xsSOYd;etmN_Jx=p+{`{)nidTWFxx!T=mtH@i zg)Dfydnj9?T2MyonQh3u%lkslTGXazwO;D@dt#1{R7~2w{7L9Z%i8oLw3^j?k>l=5 zoH=qiug&+fF&@>5zb{snH~v*4&MfbFYcghGJgPN6qkbkZmo|Pmst4Sfc0V_^?f5)k zyqllV+M>oSNy;KG@b#B0@;&^N5f?OG2~w{<&TQRg5oQJ6%g+{hDdUzLWxbwnHf1GR zuQt4N`i;o{h4t#UVaph_Uia0eC;unbYs7smE75wjzPe=?b$GUnE6SW@9Sv|cIvY=W&9+vc2oK2B01sQ zR+YM=|5kc~YRsH($H&ERzL%Xms-t`HCSICM_JJb=jMHT&VW%TK?k^Y(JgdKC8TkkoKnp?^%rPXRzBBmUBVX0XWb5%p$A< za6h|!K{^;pwbA8AefHunyYPlo2X^cE_X|4hqS|jWX6OuTzhi{+{$YL_ECZLGcFSvEyL2Nyn**a_biD=!^c<@YY zy%V$bOhKbhRT#J|uf-0${nDA)I%Dbyu{_<=(&wP%>B4NCIrW6J?+pI21>4VIx6hh- z{OzmTSe@;8Gx?NRDE(ZieOr>d#0#l@rEm=#4o>nSTuyN9};C;wEwRJT| zP45W{C!yxQf5M_eI0w2aBzUIoH(n8CsG*1%_;-gH`>^$HO6&d#PoaFQkDZrp>56Jy z4MFO3;MFJZoQU?nyRLPp{aNPn>%1UQ?GyPa55He=0(;*>ZeO=k6Wx1i^*K8scS<6( z{(!#qBq)UtUfW8L1gLx3kM+21CT6lfsAuTp^+Iy3T8$x+67bJOH87~tg6+GH970d{ zA(hQb)q(^Icz6?R|Q>aJ&I*Lt~y>=)bC>~ZRJdd^aIf`<;?p_K) zB%{PV7uEDz9l@YZsfW-aKN2D^KiVNm0@QjqbmM1LXp!^f_ES@G;jVhAl4l*M^W5^M zTAy`J`etnXQKj{?Tw5Ksp4<5Lnb^7`)OyVNPS~L@W~S~&J5->wE?2TNTmxVXJg?qS zZ_hsUZ<8w2{6eL5Z*Nbj%k7Sl=2JI;-&^w4*t>zCNFk{3ILcgw9bE->S6R8+UhWRU zizrde0Iw{l)i}`qj`27WPMM@#FQ*66zO9%-?$!yP=)uxX`%nvumDc+dI?J)3VGMjC z!VZ7f_rzqh!zFU-c%eeNxl`=7xFGS{0m2H-Pu{l+tzfA}p;mGf?~f5<@cDqI^KcAY zO8ZiA2Yh~~PFf%T!S55W^~a2@%WI%e8%)*g-g3$l+p%VMPo?#sr%+PAOzJT^p)^!< z;GVBK>_qR-Ez^K!E?=^X$!sJvaZDRd`7S)BeOjvhj73x?X&ZqG(D|Ge_1 zUX_2Z@o$r{+HLzl#FD5U}spFpzJ5F$RRUeQItx#=JWpWzf&qzWJpqK@8LxVar)r^KlJ+Mq!}dQDQXD zuam^SXwwGYaoiU@YiOT(Sw|EF6(70ktL0LBy&kBef8l*Xq}#yTkm3_ zB0mF%S1T#&)OW_PwP>AQkZBCn+ZoMrYXUU}nU|d})uet=Y1dpMTv+RbFZxzod+CL# zmz37S3gQa&jwoBuXXx&UXbWDJ+b8RaW=1%;;T?IZD%y{~Y+iyplKu*VldP#JY!rz2 zz~v1pq*KFJ6ats2YMrRosVXZEOWIjB-cx5+-2zOn$xNY)y+{hl ztqW?hu5N$aFt%;3b|Z>`h!3pDyzT({ zN^dF*5h}?VUWEM+RTNt9@=OJckn}OBy@gDU+na5&<6;VV~ zX52qN6s~IzL~rSdEMB@0#YJVt^?a(se9Vk{Tj8o568GF9Vm_O{d~Y+J2D~E?B^omW z(5PU!pEw(oiBHBq1Z9X&Z!Y}u^q4vL=EA!w2`fuLqk@OnWiD|qvQzWzvZ)u0!TI){ zLT1hykcAX)S6{PXUP|DfZ$$K9-3Lj>F>?HVR31e-tYH&E)Bc5}hmht2g~puKps0{4 z9APxnp0@S;rial^e;AD>vO@DqhSdi+wmhg;=SjmPuacH{Z(K$F$A4lh@ z1L^F&;`y;Colj&MA|Iq~XI0nsllP!>21Vr&KC1}3{9%_kslwl2J&ie6#IlHZ*9vO& zx;f*I$+&ubYKu|hLj*kp^Vhn4r#jN0FLb!3L`Tw zNHJKE4FvDlQq_6RzOkEBo##uH$dn_bIRc@DSJ>J@`2kl9-cyAZ>nkfnkp;x9SFMOW zSkyAAhbeaULA?sB+atbw{fvniw;B?iN3d<6s&K!Vb;Dw;!u^d*W6ZEp zR7aXtQKlESE)%=_{#EGXk&g_%YKQ<6GeTvX{Zd*U6Xz|jxnK;3XLH%Ql~nR2Z~pdsr6y^-cP3B z`tYkvf?1N7EfBs!LeEOUB2jrts78depgrwd7O1hk}><*g-G&;kwm-KU}=DOb(gBjk>;AQ5bw4BsgOj> z@6==@ms7{hDPv2@%|>_`9ak;4Y~FM{S;OTs^FRr*3@D!YclI$^gkr z9k1|E`OoU4ilV~&J_ixs*>c|dJ5W9oWF9IXTE$WK$in6nm6x>ZnV+iA22PC56Gc2C zM(d)TA4#J%Nv0vPwJi&Wf3yf6epLA>OVNj)9F-@EaQJBmt26qomnPtBpQ5Kp@|76U z*)0o*d%Os3o@)P~+73jOR*0gAh?j>tDU7Qq-G(QHQ&padPF{HJM!!VhiMKklSf-hK zw5WYf75uinH7=2_=p|DmEqS@A`5EA z9nB};oS7Yw2L?>KO2KrixLK&v>`N!LScdj?PKd>Le?)W1qo^!D4H0uYW8wD67$2A$ zqJbB*{DC@(4^STPq_3~uiyrX25Ru`2ORQ!Ru@+@|8_hxwcz#3@v9pP?EA?;Myb$fm zf)Iyt>&CLG@Xl#!Ty{P=d=rk#!VpD{tFIxXRaZNc&6BU%kK?i^A_v$k`P0m{G_5Hqkregv7o*8uW;&9I$V*Ppc>^mf%ZMmL?ABB6AsP*Uf zou5fD`xQDCe7o4mD;RDXN@p&c`s@_cnU#8)U_tCzh`SRF{eNsjZ+4ZAB{$|Itq79m z*Rhjl>Lg*>;CGjyr?AEvQ{-iln}}MGuAhH_lmon0A@Y_% zAr8OZ{#w}xanEnUQwY94crva?>mrgw76~s06)Wpu-#-p_&+BE5tR!Cr7(JFV7fo%r ziHJQ>|GeL3*nwz+B_hERB4*Z&ubsC7XVylA2T$e9>%8+{W|wBhhA!NV+xSf~`ULkyO-!A8sP*6~hmEPC1kfL|bGc3pbzT zje;_UUH6A+Y~yV3u+}f+*00YmZQvR z_c;Anz9txOxx)=8+)+>s1^c=J_ZU<8rtwGiO0SV_uNkEx$OLh5Cc>U2-g?V?+>7my z8TEJGW3@9SVm#&9!7&))*~z33Ye}hlFEf5m8jJT{b}0-IZsBXLN>pRPz2*=xjZx$O ztwig!+el`(ldmC(jvV*B!?g#^LBZQN+VbV~bN0w=}DeJ)+s3PC!#-plRm`_$ush{scv* zpbDtI<`u|FvRgW{CCX~GCUUtZjq1E33;2$3^QneP7@aCSoo;>H``}i5N&2XPj;Ie3 zI}IabcEgBIrQ2G^tWpWqGfL|>{k`oVYW;DU$y~!Eb`m1S?St38+>Y6b)zN4KONKfJ zI9~6H73h1OkXgE9wU2qMLv;>xnmp{q`xc<@S+9P>dTrY#5)`s1M9n5jN51U+-d@y^ zQ$h^+nYp&strJ?tS|ZeqoneFKEpIx8mzh!AMjCg~j11F`UuFBqBzv zrI*ebI~8@cVFV7b(xCL@)N0QH)RR*c3U9yx+uSbBLhf`4-W8P6lj|qkw*mF!w5T*< zB}3Vg-j5DmgyVC%%%ZQ3B-_`}reD-NrYfY|eqY%%v?XUSDFjP`SOY&ElC%KNHP2KS zO!b-+d59&UPG;=h;3UipILiVFCYOlIQ=l@M-@c=8Io2XMJB+3-^8=_Dx3AANvoOYe zP8b&}$}M=@2wPWv%^T9bp^-vF)ZB`l&qA!w3+vyp8Li&A(RpOyFoTcWR*%?!-g9>6 zYTSRGC)4CQd?n66lCQ870*(42#g;|H9c!dc*tWZNO8d|AEmB1h6h9M@$9ry5_aclO zT%a&HePt=|+>O)ca`3t}{5(W{!$l8Xu?g+bh0%E;PcnWQ;*9OF16k5d|BF-_s;Zl1 zCF0g>V&1>eY{(uv$me1!L{Suon}^t|6sFz24gHHt6dqS$&rBz%53lm@vQTHUC&t?M z;Hr9Q6qd+}!%IS)eO!H8>QOxVxJ)6zYIvAXT;vQm@U$aW=l8CE+*8S>zc-Q<2nbA#zKvx%Yc&#M#;0!Iw5W8;AC@fY4t&?^`K*;ER4G-PCCm%9 z#i{O##@Ttv#KT>I^M;yp3LkCNv}%-7u1q?FtI&-KrC>pF+g)3n>XvGZ`KR4Kr86)# zsS#roA#xK^IgJTF%%6cdjW@}J#H-D*v3!&tHm83-DZ0^AV==y7YYBySeX=F0+fr@Z zc75J&a$k_j%@Roqe6OO1RHYNEBd8Ss;$VGB>T1J3lDoETQsD5r3iBc72=BnA=Cy57 zSnBZQgU9BAJik=CKTu@1!>>8qYR%15JIrF~V}>Kd+Y{Z4AIP-0C`|@bE zP3j85kgjXUBZyI|IQYK@>Ony}Phqe8La)!6*eb5*&LX$F9`{(NW>t3@@!{pOqyh=M~e|B zQM8V^#h_;F=H@5%p@!OIhLbj94<7w|JaWWa;E3gnz3Y^0i6eo@Q8zR8rdL)j#~GWb z=Qt@dw)~a*_u!0eE|Z+38QXQ&;ITMkTWAz9p0TzB)qH8*%7DH@*ZP2>r9_dW+D;{u zmYf7joxGX;|L{_XXyBG|=V5%Us#U}uq>EaM2;1A~bl)@_$<`4GI<-qqWk7J-UR$CX zw$euOrO7A8KLr$bYZR)tDZiN}4Q6P7<&yESa6P$uLq(k)>5zQb4!ya@YHuQlmwSCB z^7sNDoi+jQOx-KR|7&34^z5>=(Yd`EZYJLZn0C+WldWGzUV|j;~d9+e5EFt!Jf`& zoO|4ewhy;$B(OWOj;R~ zl4)>%hylZGJ*XW*o8)6-aEFj4(|{e-RXvb6aO-Fj#z4Jm-eO$G>G+Op`w)Z9f=VVl zmU?(mmj#um3+YhG68ML}k6Gg`BxuF7vI zIlORMzyRdd59&3$qsdop#@FobmkG6aPf}7!EZc2%`K6n%-45n<+r_fo4i%Ri#CAKH z+f9pQyJ`K~Nd3(;x7$9J?T)y2cop_H%iJz&(h1S4myUPeiS1^a+s%k&fA6^DjY@2{ zlet~if+M8A_F2cLV7r~o?Xngd?sh5faN@Jes?j^_5^C3!u`FzysrJ3weqM#`=djxs zHr`bGzhCy!ENnlQ-M+AKr`rGFbKfLvKabtMu<@tPVRlTKBh{wvDz~3w$`OS1wH01c zZkL?Yz54@y#v_o25!GZS>GuH%6KiK@@p|1#TzX`Ql}vUX8uwv4^Yf07*Q+Vi7hwsEmyp zGHzLj85<8ut*5Gcr_f1(ZV#n?#})^-y`*xD8eBVa7v>s0Bojr9D=;PtKL-)R8osX0 zK8#^KEORiT=5S!iI^^P}pzbmFh7?Z1jNV70QHVcdB4qMRqYblACi&55SmAqanNa5$ z|2+1h6u*BoA_eZ6*n`76bE&bpYU|4@aBLhFIBXQGZ2GC8Ev6}B*h=*XW3rp`lY6h)?xl|MO5UH z^3Bc)dQTupX%rIN^n+{|%MJJF5HeZRrE&$5xMUK>s#hm6`QngN?eVcFB!Xo^XzbDU z*_%*fd&(rNnpX0G97|33HI^W;ANzeXlDH$2L>37*33Uqe<+QU_*ny->CJ7a=qRw7K zYYW9Qe&JhH$m6lZ6Inpq^N6@}bk~44mtzK=H;jkVxNwgZl?~W7`O?+MQXY*ZvRL?8 z2>UW{^vKz0UmllO(oUj%=|29cElA>vLK0ah+`2+|DtCRqW&?UEeu<=g9eDWEP1ye3 z?%#$tVFS@91bHc~iHw04P8qomYg7cIF`yf(zto3Q6LSG9Uj48$~4@#SdK6vj2)aEBFaKv73hL8J1dQa;~i!?^P79}Uj zC+}C?e=l?*_Dp0FhA_BiGGXfyM-N(n>-Dn|L3$mm*VH=D-#NP)*MaAvQPk;LIWKU} zMzk)^TcL_*{CP);lF<{+J$q3`FGQp<+LYMaygl^}9>=xvMNX=S;^Lp>#9H~@hU3+^ zR=yOGOzc`otx=f^?%R%9^s)tx*pFBJD+cbx@#=4p#;8xRT%$VY-M<^xs8?jNx>}=% z$VC3JU!$9%id84GNmjj|vL{%H!HLN8e zlhjR*OhB0oj7GycOyM6HVr96vvF{-2?pqNl#Of}!GK~KC#VxopylsI)?8-o$bzSpg zx^(C69Sbz9;Sr%DSIuvA1a;(HCP!VIbrUZnS3abbUcYN$^35CaokCMq>6tl22biYcz00*aS3O<6#|U}cSo!k?vicEz4sJBXFP;o}#qM63Rp zMq!*O(IAAZ{JAguwH?RgbBQABr0MA6`&%qSjxQ{5#8O9xuYdRea(v0;s2d$U;Y?hI zI{KB&agucO>N)>xMIHTGqc{mV+UV-br{kCmktniHnvQljWur7#zOld&OC9Z(T)hzG z@hy|1ZgjMLW}{uGqu zqtnts7C%cAUD`HDbrw5{nQV|)Yze_=e=0(^UYX2 zZ+Jv5xH?IZNgs=0qw1=4|7!oPuD~`T0-Li;z3^`a)PE<6QgvyyyUFJj-+eR}D1Tv7 zhH|*fQq+GXic#H=X^elS?U{;|{zkGG^E1lb8D$Q5PasT;`Y*)rQFXts8u##Sto!|| z%%@z-)s>KzZpq>m8put-694)3bgTv@h=|xBtg5Ejm#b=^ci6akm6)32Ksq zHiC2hJ9W1oct+`Yh#So)BRR6%3&iC0*}KYkxF{N`sp&pfimF8_t;W6IvBj(5BdrgO z&cAAn8~X5jls;&;vVmCXM!Eq$U5~8vBpz<9h|z}@MAqSue;!?G1NJ{;_H;*C8P=^s zv37=QUFlc@BTiU`Ds`i&Uey;<@ov|jG6Aj@YU}!fHR|jT7G1H$n{D3CTc#f^1(v@e zvj|l|?tMQI1(~<|;+g0f{mtTrVN}#fnEa?0I!1Mvc^EyTe^?wL2vK=cRAz6-KBuj< z1I6eNMR;8T`L=-0<_ePvRkh*fp{v(n)rNng@yI64CeGqgc{w8=Ns@BY{|nI=Dki|3 zgOg5IUned_%!>p3b~DaA+Zug;*%9gbZyQFCGBbV<5VKGb8@Xjn7!MLsRt7>E% zTT4b!`=S=A6QuLOUwC-jhFgGfoXn`NvyhP?XziftJFIyxe<9vWA5XN)NT%Y}8>(v0 zftPPPgjIVcgxWRTOBdE}>R$F^OBXM~d)X5sv@fdvwm5aurTH7zRks_{1=^n^w@>ZGc9n)JG-1h zhZ{;|+q1v{isjhdd`ZiLNH$9%%lkhXyY`hfDIa2XM6%eA-Q3?3=b?n=Sm21=*pWBW z=FXddH`C@yWZg}%SE*=X4BiZ(G9;$0+%pw3B<5)>`UtE=6yEigl1f+Cq(vx|`4UMF z=DlR)W*Teh=eCU0e*Wf}D>vbOeu2ya%1YnxR9Kh=Hbuzg!zPRNqg)osEGJc4CS(lX zhT5`7W2pmep+@M2`}|VGWwAu^z)2mUfp6bhi6gW`W;v-NlsLKlejK5t8p}x
    @`PK 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 UbAC98HN!tM!2qt9WohC62id`I(f|Me literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_features2d480d.lib b/Thirdparty/opencv2/lib/opencv_features2d480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..1093d858ba6bc918be35adb16762cab8ba1e626a GIT binary patch literal 315994 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«P_%UD&bAFH5x&Kb){0+AMZC~bE_XGXR`G?D#$B%<7ew#O^>Yx?uH%k!5^;xAIinKoH>6&e*OesJai>*^b`V~84~O%$IcSH0E05=Jp9{MHr;73i+{LQ}x=}8Kz2*t*c^h*H z2XzZ{UWu{-y6zJ=@ClR&@WUeozVHj?5^mjH;F1fOOE~l~furw-eZc;M0{fxeARKd* zz?)D;gt1cuuH22egs;JGgs-m`_}abr8~74@OStT8fiEM^fHR7^2e>c2USQL?%q8sd zpuo^wXjg&jZxZ;}j?5*Tu}0uCKV>fAY~+LRA^4PV;qd}rI1u>+Zhk^w;S_TT`>f-z z|B8N}1O4V-(JqYc&*5IZ8S`pjmmYz}wag{F4e?8uK)wm4RKS3xfDM)-j6ku3y12Ri^~^Fox{6$0af%q1M)p|%Ti3FzMh7=D4;{eE}!_A zt_`h9v$&$aOOW++u|i>i%z4P-&d$!oovY?{6gwAp(NFPkpF0DkS=yXA5S>w;Oj{_- z?Jc#|4|kT!D<-(rWMXl3Xq745z!}e$RzOIGJZUU2J1GmXZ`;7+n#5ei(+!-Vxn5j& zZi@&A$^2ZY1Sz>nAr5RCDUDT<^QECMa)(Ao@)i{m5(c@8kfh}=joi1fcXBK-fAMq! zXK1pTw}^m{%+Hxhkdm(yV&Asz>QrK`;^_v?&|EcF5dk5YpDUFhC08lLzHO+FYX0Mm zhnB?5AKI;EFD@pe^m7=aNy%h7y>I7WV%bGgwOpaOYQ_}ikjT%IoSc%KL{iw)UvHIK zm2!V&q@{1{O#~)hSUXghv$9^TwT6qmMc%F9!9aCmMf}|>b#Qw1nMA-BI@92eA<>u8 zkEALab+T06Pv(#-)04kSwb6>f%dw<5eNT^+ov1LLSZKn_MOjT(XHVF38&V6E@rl-k z2-|R9$Y)G1l*Yy+zJbm{=TOHysk$4}$@ni+TM|MdcSMZ zG#ouWO6wA363JS=G)A6YDD)~KyE=#asIgL8nj{){PLaR||Aq!DjnF7dc56@udTBB# z{4!W+j4x_bTa`w&q%Q{}g^|0br%!IT^a2D?q1qfOjaAD<4H5Y|Y?9Im;T?^XB!6ck zPmwD-H1K_rWSIf7d+XzsTB{j2-&{>oDb3Pkoq>@Cc`|LGfnfrgY~m!9R0P!O8N#iW>g2q`b!o)aId0y z8bUC>&0e_ba5pC(H1QD27DuY8yo@4OLt^aEjzZ)uKev~|{EXg!S2!p?yU6YOjDe(j z78%XO2wnLN4Dy$s75co+ww+?k&l>2G8IamtSS~W{Mz7%iQ zR%4RTB~32cVa=~kY2w1EMsDR%Ihc25^Q@TL&Z8HfSOQU|JMBxLQNfDIR_-ZdcAgv> z{K=m`$hC?gTA0JuyPa|WU+)g1I+tigaNAi@TeSgNJ zma*qmGM+hgI}A$v}}VY~$mf*Rbx z(T)XSZOGY$v~O_RD)Z-0JH*Xb6C@Gs=npgN zw=1*S+DvQ2o7XWj*4h}xzIp8leJxuSpQ}YvXQ-u@eIHe!7J4)_Vn91_7HuEft)BWB zK;Dvww~p=G6PMMFf5KL>eM>?a?N|^-=Tp?u%JG;}W$+##|H##Q8<3qbSQ*d8k~m$+ z5vLkCZCav?`Tgkf*6Q=+Ns)vYLzmGRY&D{GO!w81o&qHp<6af{X30!p)GgjhD0{GC zYPgXhA-t+35e4AA=a404BrmMP#*Ibwi47~(H0xuPR;5Tm-d$?>n>5wUkr}BA<;qlb zq>^23W_nLDwwm;oCMGK7WOIesG~&Vt<-Z1j$GzzQ{+8 ziA1QOF&U_xhR-k4Nk!{HAGd@%QL$G=+K2Rry}QND$-YTdb3KLxMt~E2#R4rCqzT8bDq_fI0XMBzn&EO~gDv=+-_B$n#=JA59LiIQLLXcLi;5!76%n?~_0 zUO&;m4tB|RBrBD;(5N3vmD(fZoAj`^L2{&-0Dat8GOw9{^omcaG|E-&iDXG~Xrv>U z<(1$dVgM^(LPPd*e|xIUTalrll4j7 za|Z5G_t_;8K?c66A1}2U)%8kUQ$-}u6e?qtao%{#1tvFHW`cmXL)9&{cRsU*qR^s) zCuFTsU#U&QNPMET&cvcmER3ux)oPV7)x(k|V|rnt)sS>`c48>BSZaGr$q~LT@O7E_ z!sG~_r!P$*rAIhDkw#7_J;LehG_uMB5nf-akyj>&@CvasS_0X1@&2cNKAPP`y-tQDfdA)WTH!yL@iT7*QSvf;RyRA z4Xr#J4mvjzU81Cj*3f^#c#X^m2WB0m(a_ocH`_#|Y{5(;D{QPZ>dm;I9yzaxG$sk? zAE|X6#+XSNHyMP*$W3zbCRdr$7~}MW-Wn2&mA+>Ges*XMvRe2;Oavb^A^T9@Jb`p%c2lB4ZSoHHRO7^ z2rKR2OCvKvs+T7ePk;EO(LYVm>iA2Mua2Ii0a%<$8G*%p=p92M423L5Po zOy#DLR>0kn&aNX7<1j_8G(6%1u~?!v5{o_evMYvSvD9!Z7EAINgTYvgpwPs;H)g)n zV;a*7h2bTVI4s#o({W7_R^WTejpD#W3EzZ=!_&yO6J`>uS{M=$uvj^fXPa3_&GP*9 zl}r*9VyqSDZ4}Fg{40j2so6PFr7O00MW1Go!UGL`^>Rg1NJ$yU&XO))F(=4EiUx(L zFfxW-GL{8@I2s0NDqYY5XoP7Sk!WmtZA~DjBcmWAooG|yYN8E`p2BNg^odFnqbCX5 z8GU-RvC&hB^M~STH1G-wr%9{jMk138d01(Xz)8fadR)9@0AE+vQxs|&N9vQcmc~9g zEK;ZnYbvAFT1-YKeXtwoU5XPl_`wSDfl2up4Z3)p2y~%8ZnknLOyw?AYUOtFmzPbe zC)GMHT6M}&d2zs}ww1(E#wy-cp*NCOn6r}WBWR9IR{IjKqo-yyegJ@!uC0xP`vLk%Njm7T$JLk7E?$Ig~JTC@s~Q}PDNxk>O$f0 zTvD@97Ya+#q)M*LLYpKJ9R@NljoA~lhqQ&l;v6<+p-qw)>h%Y8W{Dv!>X4y((zae1 zXfsF*tDA3Xsu3XzYG{fT=6af!G16NY>yPL<0_j*V3xiMXnevH1c?UvuoO~z~iOlRA zg=VF4%wl;2q1PczJ9BWzaS)7ol7mW1mMjP3fp9Dr=^6vq#pP<)lJ$h~7Z2IE_>fwT z))-xeKuza~#At+pdKGWP6u2WHJTr64kr`nMI*YIlNMW2noG3GFvit%F13e})B&PXr zXJZ4};TVzG`?=M*|&2j7gLt;1lC zCF*#*K`AnX{*OLTUIyc~lkTl_d7JNHX{wM5vb{mA1JU ziNqdPDLJyXrt*qJofq_FsLBm#bQ0tkk>fy>AybK1P|_2lA(_%FP1fmKMp3AfC(|OA zOR8g)0UUBzlFw%j{oqSWql0ZaN#@*UqDK4>9iM!PD!>D%FlSAvSsfW}VkZNxq3B*! zn1i+8#&D}qs^S3AZm}x^bC>Y6hHg3>grD9h$K7lQhbIoDb7TivjmZ(3b+jt$TSc4+ zUTM@yW8Q0CzrEI<0MjNvN^|l05$t-v$)tfE&DQH=D%c;FVlKxFw5Y)=7j=dfNhJ_V zKpqrYO(Yu9qnvV_2T`o>$`r`8oMz5%B9&f>tjD)Rr%k3SRH~zuns^h|EH3Z%-4`^V z@^Cj3ttYWGHi=ienFJ=2!r!43u^lqIJgQzH{dBW6tstQ{EY*2Z8g zAxcXzn0&00I!{#vX5}v6`-Z8?;YHuffzH+GtfKu;zQJE0zu=isnW)FUanVmyVhK7Q zstY)AFNyRhr(7%i+N1Ky6o@U^MssW>Qt740dVEWC+GIN9roZnXecVM8qO|f_YebCL zxm=^3MV7KOY+AKx=uc(x#UXh-Aws*zL`w+~+Jj8Aln|j^Vxpyl2(6So)m}=7&`K{o zR9Z@i(Ds^apo9pmbP~HNmlCk6LH4g~Z!957yHpx^tHhL2n5Uaf#mbb4@`VvRSD+mgOeM4{1cUtkz+(>{L81nj~CCykSnMyB3uAf0Y)@YOI zgrwo#!H)g*o4-#`pUv$H-j=UeZL0zk=R2jDL-L)dVUgU@jky&Y7{%iM(da?ti!?7 z`0$fH-IRtgNhF11X^s)&@1j9N=a4+Pl7|ENm~iJosT@-Q6Ui~b)Jc|~ox!_#Cz^lt zYff?dj)4XxtENQ0NDWFhkqRXnPdArr23puPSRFa07vHLe<*(E{eKPhel^U&LJW+~> zBogq~C(_uB6m&-PV0FAg>YFhsD3*i6J~9ibFR!;c(x_|XN!_R?E{QUfHa1qxD9udi zOB<++WRhj3BT0*B(*%k-T5vI+r4W*=B`XIsa#UZLX-Gon)F>6B*<`O;WFeL0^;XU9 zj7dx)Mw`;Cq(pfV3F>Rq(Mh9&475oSl0n|@&FSkYKk!3Uhp()h#}mK>;qJB+pgO>6az z@-crwQT`PCDbt7f?~=(Hzxb!vTdl2Z)Ys7GP&929Eq(0hg>2*~Y&#=)Hn}1) z~S7u7S-lMgbG zs&2^00INGETlLmtty0ctbw+x!Is>U{bw&nQ-BZP`^Tx=!Dt0?88k@u?K=k%FV;0(B zru^jPQ#02NH*&hHw^FJ#Gv+J{F|Si8LRHJtq!KkOUEW-m(acmzNE;|kWsb=Vv?LKV zeq>#G!<0ft{!1WHU6(?LK8d?5+D=LXa=#@`B}DtKla(}9&qxm|{i~0gm<$@%!jgz! zohjMewPof=moE2IzDv_Al6kx}+9j1zYqC+9=f8c{uF+EIO>1HtzRVGeyib|dq+E7k zXU<9-jG-(@(?S4t<2*Gvo^1;d=TT3q`_l}`dOppdQX@U2LJY^#&2=LKEn2GXIGNHw z8PbuX&b3&Jsd((#5nKWZTH82(Y_M)7G3yWg<=0}986l-vnq0%v6njHOVY=~KrFFP0LM9TtFZXheBP5aX4NHgL-%@LFI` zaxo;68RW>Sd~37{WkTestAFXhGQG3oN$_^~Fy`)fQe1xMPv6L>1tCS8TejWAFVnzR zp;5_BPoXnOlC}93>2=DK$k~eiF1^>I3Gli9DCY5KLR4<(OW!tCZTqC6ys@ybRUxMdP} zD6l8l(aB^6IkGC>8m&T^5P4csYPP&yxErsb`OWrX`*d_{l0t}*Fv*G)Od4UDU16#C zSxwGINS`KI_D(k0G6%}Wl(pm{&&8EZi)@#llPuQBeDGH1XiB;JvePLMAx3Gj5J{y> zwJj|4j3$N*sj_7!Wt1+npahNiOAeHLY#H^)run(aWT4ClpB=Pha4@+MF;XBlVrj9M zFj5$Ghehh=%V1w-UX)+u9w5;>+#rkn*ECuBrJd2fdEF~s8EFRz5 zi1Lsi#w#0b;Fd|?zrdd4Qb{H=$dOg~)@T*Vgve8;qD`rC@gy2a1oSa?$CKjnLx1{4 zMlA>_;@qc6th(Ns_G1w@9y3ru5chyDQC+Ms)&TcH%qGk#)gdRKEH= z!)wj6tV`@eHYxG;BhS#{Ip4uN%c`=JP;?JBMeYn`QM?~8<#E>DPGrgTY_HaPwJ3uJ zX4?|f`LF~Q)v-@h>?;f(s@2wCCf0AD3%S}ACC(Qd#{Te7mTbW?+PR4bcyTi{U*0Up z&l}9chn82bg4$4}k4PpRRVA(N%@;xdl0 z%axN{T$!{ecKNZ9!8(Nx@g2*C++ONa5#@0%O`sRKLDp`AubjT4yNzLU-F4U?J;{kiyb-3Ct*>QbQXR` zkNg$6D3sjXMy+A?NY~sGYvu5H~Z0&r?S#aygJ zaJI61ZdoD`PB+%d@WNcGl4*1%N#Uu-e#4`e6w(#&!Cz5hm3Ojfa9M+Vz+)a3uZG9` zmRz;d$y4OY&8qJT-qe^R%M8?BEXAgj;!+%?f|Eu@(HakoRGZCuquJY4Y>M`oHz(d| zgg9fH^K{IcFZGNwAPK!fW;@hZ7J2zlzw&4j&A9ybrEUJ4n*G9RU$-Iwv6Lg?CwpGna14kV2gSY+PumIF1I}>phnO@^OzbFNAx^S5bk(*|@*A&k8-YlT!leD$R z9h7L?Q>mS778b8eb)@k^HBtput{f}1_(7;)fu@?7iN~{3OB*-TOcq#r$YfnRWNoL>TZw|J{VD`QE+`^+4v(v`7x zFlbMfukZxzI?nwY#X&_u%SpFyr?l)@Sp5D+BR$@_>jZMDsFeft$wp-Ona$P=jH<;N z2BY03T3@2q$1km|tt)QU2uvi!xNXHmrM77K;`NmgOr+|y_y8j^9Lz|M*;+<<5?A0Y4EW0ea&%{- z7T&dN%#Ga-B)!uFK9`Tx zkEg0PVMREVyBPFoI!n~^=2brW9y4~nv`UhEu&zq0J>gX)(Hsq`5} zQ`Liq7Ix8vKvJlKT>C5S4gkO*+)lf(78`=MvPgUL}HQ>9(rOH zBh#4V_{VyfrGykF8NrDaW+4)ZNs8$Z1hY^xhe?O=`+2jH1QwH)*caSp=^9d#RKr)Y zX4ystlZN1%O0!If#3UvBgwZTUrZLG0_l%e7{<6otT?7xpC#<#o2 zND{V9tF+N=i<({|N+R!^OcoYwnp4Tb4PxqZ(-sYtDrt#XrBsJ!u{3G;5lK@zV@fNG zG;jzauB(Y15J$_7{vmMM=waqWCtcv)BX5H*}3$z>3^DX9tmmfumOX{!~Id})8n7aRtB{_ z=<$_$7d%CMCYk;T0)BNyd)w24gzDP0lg;W>wY7n#a5l66p&R_#9tfOaHL=n$882vWk*Om>BRP0li_kN_}yV7PhVOGzi5PRy|&LPl3AJ`I-gW zlSGPmOmKuQFf))Ba1Y%OmH^jG;tR(O6sHMHRJPg%a(Y6j<;-D&Xh*4?ls5-YONReV zch>wT--AwjG^ab>q#75!&>XKUrS2o>NP3hGq(}Z_TuBLe6FA`0;=&?n5)KY)qW9VR ze_W(-(agus(^vXp+!2iBXS~>-{+vnU9KN|HtkIe5{ZrJqzO zeK3%fT%1CdE?T`ES>EY}HL!BAEdk!yS!ukQv%6&d$MP$q+ZE!^9SsZ6@(j;Fg64yU zK%N1*GayT}Z3%+-l$9dLeC>OF zZm(5KWYjci^0KmM(%OBaj*K9)># z)?8)Iy(&F~l%6{Sy*#g0bUi~y5ep-$5WRIe-9daqspNe~PVsWNP-@NTX8He=6CaeR zev`+M?T_}RUrrguzd_SZ_32qT2L89rAy#%1y5iWfZU)+HBkR~XHr42T7=cUu!MMkg zLB7BLTWUtqhx;-Udh&#vl0no4V{0S@GwqNJ2A}yEGwYHK^!LeTG*f2f_uwXbTY51@ zm*%Du(~XrG$b75w5$}^A*}M@hk;$+#Zr=nZ+QRBDzl7UA!#AD}lKkN&_*}&8^@zsAVW6 zcqOjUqr4*$~ud3=D*5Tl^EbJguX$~6(H3zZ}}&M^$=>;+>UI3STuG?;AQWH)+q=#8qvI12xjw_Q-(+P)l$Ox_46<0DA-nvKPZqQ!EN zDJhvaNEw}srS28;)+c*4gTCNZwMg`|%UdSAJwX3)dALtoDWsWnIn6kQqrGTGg_UPu zkaRAW4fMv#5cr@2iv=m1c`u;^jeIAb`z^nQi7_cJ=t{AEpm+9f^`8cZKm?5l^crGwP3EOsTHN zX7r3oHa%Ivpm&zsJw5AYEvNqcr1-SO6pa_7pN@o$mcO6>nP%S1`t2DQ98Y1f{QKnI zYx_EDd*4~kPzLxXH?yQd zTLLtpLbg4V#m5_l9@^8BY#VJ!e0ESc+aWo=6&yQ$|$YwEJ_1S zY?h5fekL0g91KLuk+VCuo()z0%17+{E_pQ~mPl(IeSKK&=#$18;=H36ZFWJ^vSsFs z@gzk{I+n3nE$rFS=KDA})@78qnY}`$5h}e6lzUR1+oxQ4G|%&f z@X<@XA=dn7t(4WJpKz8FyiX9{XR1{uk{GEp;Ts)r`6u&4STf6_g5j4rrIpfu+|?@c zvkRl{!boqtK2_OFo|h&B!foajSLVec6}T-}=*fVr$^ZWc(O1GfAce@i36-oU-W)qp=t6udCKVQB8wbnrTy~6gHjI zJ<*^>Z8QC+a^o9*U;32k^9~{l^98$t(|7rVGBiq@N0vBFr%)P-&dI9iEF{f}$jjm*#ao2oL(VdZ#=wZ>-RsrigdexuX#%>3fb zlD|npUf4(#;jea(f9FeQXJY*#4DRVkRISSw2f<mZ@ph!)@@JbQwpRck+c1i|z^aJ%;rKk!Q@A&->6vGN6 z%Z34R)}|{am_PF~k5qHoJg@H=KX-mMXH}jzKP&TToHIY0bBi`kfAb-4>(H5bZN@5o z!K!z}>)NqWt;Wa0_=;Mh8Ng?XBkOcTa*O#C>ErJK^}6`LH%mtynoaKkr!UMKqbCT8 zzAZ~86{{TyG?Yp6YDX?ce^)A%eOIYjDa(Ba^)Fd=r{-k#-rXhG8Tw1SyGthZMn(gZ z6BA;KfQejv&nSjInYsL)UoTwl!u1sBh{J4o!vH;HR$1PdKrf{2vBC7k;R}`8RHe}x ztc&*rm8PMREfW*+aNv?S@)v7dh);Nu4rq{Grayy*5Mkr;|J)1eNKqeE&*~B5vpmbO zk>j&9zsV!W{~x(74DXY%m8LyS@*U2>rSEdD7CfZsaSweCf&WV_r}!KqpvuB3mfXS{ zmjmWm-3UL^TKqxAivBJ>5|?xCKO>*v^8&hBbzr34sQ7O-(4vv#9bZs zDE>YV|Gs&S!-~KI;JxCFNC)n}#$kiNsc&%DR={oFblDwmaoO%KbJ&hn@9^&9(zh`-{!ay31k5z0Y9}o(vfWIBe6KVDkrEw)J-%Hg$u; z4!G1|mweG-yMD=KCoO^g#SXiu+hI$J(BBEW4s=-mB8ROlAWvNmdjkLN0nH9bJ7t5* zo@fFaU3T?5Tz3EaT(;|JE<5oQmtBkB-QVxB&CoUXB$wR=tlS70C%Ek3cZ2Q+`1g^> zCvexHuw&3+Cl5L7hynb)3ckX#O{n;92Vs zlnb8U4;x#zKo9KOeg}u$+klRjAm5*M*p9G$um|}B*3Wg>f!Dk2(r>%$w2!*%$g^Db z7_j}DL3fkG4&K>eTO91NlYfo!zs+IW0aHJ5*kiZC|DSc(?H8duLDP@ex$wuZ7kC`$ zn~`=jblrZr%WiqK%UV~s?5?l4to9m|{T%rEZqWY9VKw|-hTomvdkNlL&8lQIAz4(0$zpEj)A2QGSs>>K~`tB}! z9C|h`b=l>&x$MRtyKH}8r}JF4*C$GNPSaNpSu>jTcX3_kf1%HvgtA>?6K@U8>z z*5Ivy_s(l!BXA0QdHN?@b}?eV2YEZ<2*?IbJqJ7=$G>+(J$R|Zt^#Q{Svf4ci6diB5w9Y-0cIOUXOYQIoII%;a9`w`#G!&xD4sn zAngd$`+I+Z@&eYt-kVWxZg@HB3Cghxzh~}*I(9qCu8Ek%zfX9X!>;;_!}b8Cp0L@^ zPD8vQ{kWSQw)@|0w&_&popjh8dqO6#!xgAcUqKy38E!npWw*Z2VfOhBdw469*?h#x zJcpIP<+2@*b=Y$J`^FB~{w?Ue7W!TfUSMnZ;_;tC2k_{BJ8V7h@Xrv>z{LMJ>>=Q+ zd*BCP;=3+;6gcii$VW_`@^yzjc@@g?YLqK*(!Xr>#FI8V=XB^`unXApLk`>b6)wB} zdx*u)BR)~qPu^>@bKePHAAoX2Iq!k`u=OUFm5+DX!@#C@B8Ju?j+-vqZ3Jbw#${7q zcGBWNuP;HH`Iybt zu5;Kn_&x4#HhbXx@FVcEKiO>e3d#k)S3G31^G|ZvmcW^Hhu!)-#OK=(b7kabOXT4w z_;d^WA};qr+U^q$I|}~312kvB&%3XOpPr9;z7>4>F|@BJld(@a?5F2J{}0dx+=4v* z!)EJ%B`Dv%=OBjfvDx**kcZ!Me{Hi{-vOTiJspV2DYVyf(QX4_Gm9&jJEOuhphzeeB5Ra z!5>TTdl};Ek`JJr113;D2P2<%{>Elq07F@=IUX_`#LqE^KO43I51)Z@0DkdR*bD5m zH~JFf|D*+IlMsJPu0wnMEwsZgK&---=WUH&;IWS*=7F7&*DmDyth;Tt4RFbEs8hgR zH=`b3jQV;L{P=yBZFLHGP}esZp-_bt#b zk2!21e$NHX>W`pqBJH#-Q66~y*mE6r6maHQs5eME_mAj55hFX`_cWBx8%~67l*_%} zN4pM`QBQ9A8su&O{r<2MxbHjYtAVQ!Lt`kHJGMiaeF|}mezAXB^gX~lJUjJ8NWTMR zb0_-$|3yB~uI>i9Q_qLYN!0xsV*dH)rx0`3o&!2y3&hQ)6XD12!QLC8^WCUJ?{(P? z=wIi7r*^2z_B{|~@@CZEn-FI$^ixBinL^urn9I7?qwReQ`h;!KFK>rB|00*|jNgm4 zM}2sS%Z_@n%O1op!{4XwfV5A*wsR4i$GU9c;h@9sb@U5a*S-#UX*p~+{GNyyz3+02 zTYycgVar;S-Jfk%18#aR@{hl_!WiWEhi!KF$!PmgFCW;9at9V7efNJNrhxMvao9b7 zhV6evd-*7M9zfmy7yib-cYhLbiL|*7LH6HKW`99BgTClu9C1JBeuuW0xvUG=>yPM5 zA9UCP@LmeO^PWH%0*^h6mi6R)AIQ4+KGg5cXb)k- zuCQk}$UEl`unAcG7}_DA20N~Ru2aExxdR{l33(;J#@jm3?~S6LoQHmFoy)d;fy*8N zTs*%C?ci|_pni-%*Gtj&E<4~r^x1V_#AU^W4mn9{3FL+_S`Gm!Thjq>OrrINl7Ni}rTdrf(yUsOwLn-Mby_*^Z9Oj<;bW z{C(%%F57Ye>LAcnMc$U7o$o_mzXEOia^(4~@Wt!l)8jDa+lcbm7h{v7(MN3KvU^^L zdWt%8{FT6S;fE^xxfprsM%?U$@!_6`(}P@gCGvJ3^7aJsbL0cabnE$KIb^!K=oXuBb z`~ex)HsEKJ-zgK2kNUOOH&JG%y6g?_gN&VBwjIi@JRfDSEAsSVq<yWS2-$8k!?Rylyx(c-0ywPP_d;~H+2VWu%uR#6=$AJSd?y9+{={rLAb zTQK%R>lW)~>x0&5)~VK4tjn#-tRCy<);7*3?epy4TlZP#*!Nmz+8?*hvCg)b{V(gE z)>rJhRkOydRra9WYcIDCu~*t}WN%=vXSQQG|6~2ks#@!;wbo0lFItya7hCVMPPSfT z-EFmrko}Q8z_zho zU~OeR&w8$P8v7_an>~+h$zH;?XFIZ&vhCQ5*bCV_Hwop8?n|{M_He;&bQ99 z4zicn-S*3@9j(Kx)z)Y2*I9d7yRlcXUDzwwN31igGpyaM*I2t*ud=>vU1wcueZ&5u zeYO2}_84QZD1|7k&Urq*b(e-b`*OndkZ^~9ma;)8aB$xY=l)}B=}+j0JEk6K@_erDfg9btXVdeC~< zdd&I>+hFZ%f7fbQZ@0F#Th=?Q&sdw-)>g^-q_x<7sr4%R!`2+@c`X-&&ur&b4gYvcGCyVZY6qu!ihDyWgJ2I@nLG zJFH`@qpcmRFIksbr&!xr_gKHSiq;})*!qTbwYAy$ll7?eSL+GuAJ%i(7VLl6&)5mp zuJ$YK?^`!n2ikA8_hSFW-ea9;z0%srewqD3`}5Z4tWU5L*q_+8)(fpIt+Uui*tr-< z?!aEgUd*;-FJL>fidDAuWBal#tmjz&%kE&Gwl1)i+CBEmt(~mHt#4Y_SUrD1%b_V+pJBNLYz1Vub^y6eMtPX3g zHP4!Fy~N(kUTW`P|BXG$o?x!!Sbt@Yu(|9r?6d45b|E{R?QJcvzQ?}LZelmGhuL4) z`>k);>#bi}|7}lMzp*x2P3t&oS8J1Xt$jN?-TsjMWBYb{zP-1-&|YBgXTQnb$KKc8 z-#)-T%YNA2-gynXm;IJq%6`ReV=r*Jt&iEyaUQW>;%w`@+_{texAh78T>F#kD)wo1 z0lS8M1AW)0?F;QY?fvfg0-)qb7*8~b2;uD!@E+FkZMdk(vg{f_;>zJYz0ea(K0 zHE0c3m)KX?hgcuBKVW~*zR|wTzSsVp{d@aW&a0i>oiEs1I?r`JYH#86TRrUc_8#`j z?Kj#5yVLHlpXVIJZnc-PFWWz~x3v#uebx$VrPXWw#lFCPHydQD*lXkF9^&ciZ>aJ2;=S zFSYk)57~dRS6Q3w^Vrwer`Y-IYW8*Zfc*#ikM@K1Kbh-XW`D}w%6T>WHM^U=+FEA) zm@T(XX76Q>+B-UzuwSxU*+Od{YhUYfd$D!9^%Lth>q+}0>%G>m>|fh2bv|!@$-b6d z$G*kTNdKoz|4*C#pEms&(WW0~zujJEkJ>G}X}{Gz-af&8m%YgzvyZV)ve($}x8G-< zV!zUPhh4G{w;T4`?6O_453}ECzr{Yn9=50KN&DUQiS~Q!5qqP(!G5njVb|?L?bY^C zcFi8QkF<}rtM+>PSo_=db@s{jTKjtYKfTB^sTX-pVn5=tXL3*CFzn9j3{KGEJMz>^ zFQcin-Amlu8Rx{7B6_$McMtnlqZH{CtX8a^N)@lC@zji#nl0~eKmT}hv$jNHRcRur zr+aL)-l(?LjfV;q8R}MKf1hLMH%+?tG7Y=ER~))@d^CK)y?8ygozXE(imsG>*8Dhk zltn&a>QRZx#>=75AbC?BXz->yvm(g@D-K=OTPf9=gLHI;ccz-gQARR;ImKY5F}?@| zQE605FonN#7RIECjS+~F4exN&1#Ki%E%W}R1IxlP65HJNlqTsXS00!v;9B5e72V8UvBg)V*jB=Vq?MA^bsY2R9vl??s1( zz~fvp*pbW`CkQxGbS{Y*<#F-=4o$`81-fPhaU-25!2M`U@B{^?_9ku>lzrlVU8jpa}Zw}LB z8z(%MT6DUZA#d??&n;ep)Yhm@iKlyvlQr>Ca&NVU%RTT3+;}uBg&@B@S(45mB*#u) z)fIuBNHJYc;_0ZM|0<2)v%zvteR6bN=(b2vA7ms{bs5R@`nqr$VyPjOR*KpfeWLal zwcdz>CaY5GpJIVZoTy$U6}o%M=mIB7jV6658S%E%=@`hMP9oypoD|nmB@87Ai~L|) ziavL2tU8LmcL3McHS3LLZ&$Hd86C%ylG?EO8E=PI)tWdaR}&Qns!76O{?VRc4twc; z{%|RtjNRQ>BMj=|qjjA=^I0WLp`vx82g^DODX z0Iwq$CF}WA>bdFExU;QAr|-6*$UnF@nRP&fNqmA5^Ma95xG>n*N9II1%;s|d&Es9744fPGQD)@^?72xP7w?ygQHvqlIcR+!p5 zIhM>Fr;!Dua;pRqE8SpSNmd;rk=ZBLq%f-l66;_xqmt~g8AnIaSTz!=L2D!v`ur`> zx)w)CQ=}>>o}h_JZPD_@>nkIZ)Lo)gXjRs?lpEWMeirzIYyU^})hR@6krr)rWXYe?L| zp%o>ksgj~8$!9vCRTk~ufXwF^P#vEbt8|Uk*TlQ+NVLRPVpO*Vt!EOUNh|*-JSf*x z%_=#Zv&#ESTBF-<)ZJ_V5 zu%~%)O}RSdUH765wHSetKV|7LC?tG7B=qZ(h3dg7jwQi`oYG)JB&TRhCLR1N@q2TchC^H6H4uj3% zmP1HF(B+U454{}BngGnqEuYpe`-7Tiwe+H?(=J3=wI7D6O8@DMstTe|)fGIR0cFz< z&Mu|rQX7{XWjhnWDP1xY^aVLgXg@e(ZDdBRUQ3ygT5TkwL9WI~G*uHSZE5x6T-D}3 zohdCrgsW`8@kXs9+)?EpE{r3I<5mYJM==jc#R;aybV9oP(l~)Ec)2Ul7~a|nKlW7drV!`<;g-3vMPrjqtfAm+`PA^q^9ENa z3f`hhmM!ZZY*f-?RaBc)o9G3m?vZpsakmB$v5gOyd8Dz?ZdvXgNsM<&kIK@I1jUJ!O?W57IhZrCjdUR5bV?P zac^YzrYOj0EajL2_yYX;6DrHR57ZYS9O?@QCKcvV(vc{ovaHgmRmM6Sqss0XUtiSZ zWa@}@l?~z|c&WfOe2dUW}{Z}FYhGPY1Zxw)vHY+RdpJs zYEm&O^uc6HB8X&JN21E`-YH8WC>`A>pO^X7FE)pZ&sIx6T2n;D{!cRYHMylql+^;&fQqDK*x65Y&bB!ftG+Xg(znu8Ma}eaYk^j{Mf%Ukj1^6KMoA6pD2jwm=FOc$T8X0_EweEOmInRpwj7Ubadl=_^9OqR-v%h;wl5MA&w&6m7e)bn&C+%yzQSs;D5 zcd%o>{pRl@5BfCiKmw&IQQ4Vluu4axO3`dPHOMkkDiVXmLUY~Jk*G4HeWQA7R=4w_=(G;c7=Ax%Va_z}vgR*ox{wL!jaqQ)YlnD`OUY6mdH(5A(L#Zz$hHnI6VF4Z zcXlp{KUy4rv?TuMp!g$Ctt@_NoT@kesE$E6?T<=MolcB^3CCM3kSN zLewqc&&38cot=stBb6d6=&f{yMHCU&Qu9j@ zpCa#;6Q3__w@5(8PeC$o;PC0>g-`!k!ajw7BsR%V#`8Xz6iv98o(i?|pw59o-Xt6* zF2+k9BGE8gz68%-0p=3ara(!OTLbTN{ijFsp?F!@!e^272EW3nQ@2MzG)7CFF2_7A ziX(o}z4H`q;n%nq<8K`3zM>)eC`~NH;y9cBN~ye}Hnt&&n3`K2lwt+N&J)K}--P=X_*yoIcJvKHZLLt|dA2#o<(8ye|$TkL&_ZcM?AuJWc{qS9{~ zpiNVpIJq4X6RH`yN*C*x#c<%_1u`FCuEEB%nr7t~p&lRF@w-+FdKNys2w2p?p5Pl< zhqGxa*zqP0(fA-eND26ZA)J~nweDS=UQz|$pq84)G!5=vDsJ2D8cK6FACZrYVWVQP zQ`siP3ygXakr*laNNQN-sk=>#obZpb_m+2KLb<-1mn2Q^I{O*B`_>Z_FHhct^2i$* zgRR5$2}8Lpqt=!pWnOV;zNic%Vxuh8zW5$8?~*pbL3J@V6EEWWm=d1CToD>bQsPfd z6V*!&ZIMoREO?+h z2>0U47r};4Q7ANJYmPLk6aHitug`ImE#1-EU0u6&vRR#~wl?r-F5hp4R9+7~1+lI7 zilSI56ruw8=TWPb7->+Yk-Xu)$duIE^x!E_*NtSUYKjmg zw z#@({(^b~;`r}0Kb@|#{sRx=KzU14Ore{HoSS+~*=4OA0NhB(zvNo2$I6c8=72C;q5 zvVd43nT5N}QHA(PK3VJ?D6#;q@m_RM8 zx8uokS-B#vm&XqLqT1-vl#WmG%Q$v>oiZ?dHQlc_1@}B!W3SZqyn-&EYC|pK6 zeJWlJbIayjsj{1k>XWrrd<`lvl~#XauFSaT6deTluYcMZjw=01*pEza@XcS6VMob~ z<*}Wd$wnl+G3w2_)TerVnih4|%Jkxhrrgn3$`}N5r*DsLDk55ua%HMIQdvZ!#5K+O z7)sJKP!yCnU<-rE37q0im02^MELTgT;mQm(Ls+G!hK7EqA1qg~zY@I4TUF5*P>QJm zX_SsdNletS^G0m`&HVmI8Z@;P?A&=vYbZi_mN`E-&l1zPQe(K-heHA}goK@<^KYV~ z9c_9i2bROf`Cfia*Z8>|WPUKZlm3-=4rppW^2$NCQ{0;egjjk=b?O2`4!RYKy5*6w zk`m@QfkRmJ%rCzj-kye&^^V&6-yptc#y{Sah`yWftF{`2xgAuYgZ`&VW0RF;F?{D9 z?AH>bZ$ZT07AH~BJr>x2f&+A=-8EwWRwYP_x1&)CWi+NHCP>ya&=Fpp-0_LlhS-Z7 ze+i<(Q}L22a(uIzuAh?8s8lRu2r1pXKa)1ztI5$WSWQj+GD0O^IaX?|rGav|&0kNj zw6?ZxCK6u`q@@qkCmT4W!ldeu$;zZTHGJDhJC8hn)ylE5=gw7E{o5ILp|k7k1*rZSmX5@(g31Ol&I#s9G&;eAjs_^& zG;|_V=V;Rx2#E~0(Us{iXWg0G!Dg7=tnWM3LEftLqX(2OE(5*XJ*oprd2rw@r1o&X zC@S!Wk|@iI68h7W2uqaAD33bhg%~2pE5NGryK?(NBi&6AwrPVn#I#?aA^y2QTYB72gb5|!{YYoW;DkBL*6jsz6 zqRQ){ix&;`DKo+1 z>@3L-R&8fVzQ4jdOX7p|-Pw|_U+JAuZT_OFv{NW`bCtK>od$aI#pnsWK{%jqUlbpS zDYBZnrC7By@uy8{zvw@eJH((}^)oH+Ys-{t(k!y=$y%~&bv+B>jl3Auh*$HQN2&0NM)J1i5$X}D{CgPTDBo|XQ9wV z8blzh!@V6@UO-f9)hv~1DZS>w5zAftf{olv$Z=SzG|#U#JA1p)3ebBJ&GHM9amg&U zZlxY7>My)h@yf8)s@5j!lj`nku`Z(|t7~bzm#8+q!_u?0E51;{G{hGdGlsa&%DaFh z573V9fys%9I=;fjc6|DBFo-Q`4SYc=oqi)il)h5N3j(PTmSr!4WQyBlPk8G!)h2~p zGO6FSh6cCV@)$I& _!sESu-NnT!AZ#JvA#F%?vx*p-ZOtp!_4aRu`sjm2XfflA} zDIDRxJ+#1*`~@o>ypyKmi+MM%O-M*F zCXxL#Bvu7-=j$|i31$}I44pJzQ=?R_PSU_FA>#kt`{-V;kIs_U_G5|jj=!0GH#H;T-#J*x0z zJG95KC$bn<==h3Gkd+|U;zKF!sQ6-?w5n$+#gP`yS{%a-HaPUMiRl0q-S{ag)L$Of z$tURk2{*Jyl8<2;mGSyirF(K>40rC(qJh8LLq6JhfaWCf9sr+6voxh7$%~yL2vltY zVxhw4nI)agN-MTD2OrYfXM=8@sdZs_clI*QyWK|pSZPea#|^a6g*ydF%CuhW)b-O$ zpGDJpi~I#OG?++5_Z|>vlo^F-Xgz6@wXO|I$4jG?u6m=4_wBP*i1E=_gLFgR1Z_g5 zMZ(!rE{e#AkSS=ry-t0gzsD zuIf<#sqAuc3G^8|f>@)T__D^6mSctAGhK2NRhC@2_g-%{iBa9X$X|Q%=kckTXd?`X zG^e1(7oRyyRSqxu=jifYCVdT=uQSVg)p1M#_e`tQFt+o!Np7M;ZDqX!A)76nwGrJb z!d&Y-{m-en)(LXrcy?9_z|I(F% zEBbNdQl&OBHM~~r0&LDJFW7f(nGFy3ty;c3PL71?_{1=7Vh@jIpc$PwubYk~N93Dm zsM$%TK-(QM$2O2ADALpF6zVAz#ik9V3HlRRbY>(nDAp*ak8u+;^3)eiIjF?<-+|N9 zK2kfM(5>K&ocD2Pxf3Nl@dNjtTINW$zUdR?|T z_arHPL4xl`|B- z>eKU?(%qUq959=i$f2<{kzO`fZN|9)I&sRU2QiP!lNOpa7{zEudI`BU)5A!wb6cf9 zyISdyRvAvJj`V=~>8&w0u`5coWgVwd{O=_o+PuB3stk( zq_Si%NM(?%(chXX%%JOiltMBP!+;nmuiTLvR<*&L`SSy54y0O@M}qK`${&2vWUdz~ ziN@h7f$U&^89$7Fta|n0a4C5x5GTUa(pzw+-Rl_`bUNktUOaO$QFus!zSq`lOYsQN z=fkGZ!XEt95t--cxmBLIS$V?CL{tHpmHM;vELIOxM(F}dA%1cHGWD<}Llin?5pgHj0J2JQyLuDq1<_^Oao(yd^=w-aX@nPLR_-JyPPYLERu`pg}FvC-PI{M$1yQ5 zNxe|lC@D@E7pB~~YnG&v#l%GKL)Z+G zSCoO3cp!!ce4r&a!delsj^Jx=b402nno>~-6zS4UvHBAC-*B6TC$aS8Z+Xy1$=O%9 z6~pj`Vyr@EeZ&Vz+R0t~osC)~k+s<*@?<-LH^B)75;I<9LJ=jrKvu^yaYJLWqAgwU zKHV^I(nZKb3ES?_aT!z`P7{VKAFl12z!>mNHC3^j?A&6sS z8XqW2{=rfePW6@T(i6!h#rI<<%}`_`hHzSRT$6T%t=F20t80VNP%4*fW^y$RvJXEg z`OnUVM$q4-<$Y^9GFdM1N{J-&65d>5D4H7CgcM}2E!7BVjY|LNjH(LW{Hoat9?zt* z;XXwPK3d{m>UsZ_UI659S{J{&uvi}*6Pr@nalBlX>R2R)A@ng7KD#RNcxhV-m2un5 zywKX>#z*6w^wD@;@5Sq;yicrLSu;60yk@dGRvsRmEH%n<=O*uN_9I&f4?ZR2TXqto zq%DO(c&i$N$H{@2LuE>M=8%*Yq&Y;ThH4I3rhv^M!Wg!hWyq&z$bO>eQA;?QIzt65 z8}O6_v#c z*L$>rs4*2yHHKDOy4$QdZRrYXhnm6Q@l52*TwijSEW12XRdPs4swFwZXj=Om+`77v znO$!2W;;-1T|q?5TA*|d%|M_ewy8OsJR^akZAo(&F^xcpx1ayl-gm%9Rb~GN?7eqg zv3JO%5pya~XbgnfC2C{AM& zvj|ILOZ)2WT<3hOrQvhdA(T{eW8@*#iVYhyKG!1o43G2}JmVw#it^mZ!NQXqfM@t7 z9|324%!Rg5kC~V?<74MRVHWR#;NotgaAPFGu?(Lw3xhH?8Qu8bfnK z@QblUQb34wBD8JAhK<-Z)?1v9hEJ&eF5?3S{w|j2oNtMJV4D;#X=Bmc9R^5d?gn33 zpdl1=NNiHMY|%{Kf$o4B0H99NO57ucWZCbJdnD%u`HfS-LWS#KO}O zcx5PW4&Bmdv(GZ>5Vl`7XdTQOR1an<2=f{}1P3ot{TZ%`D0Cv)@=6Q?h-zzFEZm|W zv%31pg@E$>Y|sEbq$fzxGG;dne6ifuM(-=O_hl|^_=R&=08YhQy z+coEcwrv`-!Pyo~%_6no71L8aX;8A^Xr^Kx(^B0bII+jp@MGE%>{*%@YlI0hgd|#l zw|R%^g-&8D6IIz7q^+6V#HIAcTF_(?3rjni;T6>a$Bdbz57CZ5?I74(CX?CbCh!5d zdw!>5&45<(L9`=AgSK8WAYJ*i$t%_Y=hic*n3s)aJx7z-MJ`-a7)d}ClrW~lj09?u zRSRT+Oif+n!$7kHz5t__KgDuj*ZM%PFbJus;I2n7+yLiwM&3)zN2`+d?KC3Y(NZm`FGdrXxsVEJA1_QcmU zL%5w}pc+!&V{Qvrp=8bMN;~RnhA4SQQ)a!caHbvgrPZV;0#zYAmIX0SZcW^u zz#she3H*DKM1vZ>Y z`~_#OEA>07Uc{>$seDNxKaa>2Fk&AeaOCQHB^EZ4Td+Xe06Q{ADWy>oC+0yTN^;2s z87i-5m=>Ed-;>yzyF{1NKq}s5Y>;$hlarjP@uSiw^cK=5_!jwEGIE*!T&aPpcApPJ zWIW~4x8WzawZu3$u@OTDiBg!el>G>EFa^4IWS{EOmY3Jg>_MT~gZ5?*I+#7+ps}47 zo4rwD_5f>rsiQ0)%`#X>glz<*GUqO)VIlc7NHY#{lf6nvw^KF~_IoBB=V4XHv`%XFH(`KY2nv%5ZWy+BXmvQ^a4MMFeTkCNpIr({7 z`~*z0Hg|j*-3^)4#t<7~@jarg>37XSK`cIR{)%ZY+Q@PL%gJX)&qs+xj8(&g&8{149$0=+2G9k zVVanAWMUn&_@=?UC24QwqSx4iW)BnTg?Y(rELNrvj&`~F7f=SZX1Bgv3%p#z0{$at z7Q`}3s`gh|VDTYC_ffd7x94|g;|Jx7O;SxP-h{<}rk(w55dH=85GcN#XgELr zwq5jnQfr&=d%iUrT);oEh}2GMXjlXqdm3kg(Rn!*$?K3;RxT}`UQX&DqxFxyxz7b{ z@P{4l5qsX@k{j-y{(C?eWJ0RnT#gl9@+iF(b~|k$wco!)+ArNF(TLKqSQ2%D%qTTb zekwVxNU121$ptcWNyNHA4aClonntTv@F*!Uu2knj5o*f2k|{Tpm!%g|>RAvnYb#V= zEsaWtaSJjrV^02n$dJi*Q|?`qW^C`;yD9e`2nPK`Spum(J!nu|!W3*vr&Y&mDbg#} zMts)Djvu49np8ekQ{&eSKx&~CeY5Tzs)njnn#D}>_JCDI`%$yGNp+8v1wp?knPapU zdBYm}c2!@vPzGi83}vpAuWQe>Z)t`y#uTfyV)hxikeT+G5O~3$lwaIrdWz+8M)?(X z)5F+Lt7_nCnxS45x4+3vlDJ2jJ)QD$8=Y%xO9$Az&z_6PrWQQKqJmo4eqO`E(nD?Y zY>J>jm2oEfRaFgs#;nH_KWF3x;8O6JC838BKPI!?5siiN+O5cBmt2*6=@Qqw(PkqL zUwID&Ws0vdFrzgbUuNwoh4D5vq#bZT{E{0Y|a#>!8& zHZ2w0v4fup?vaBDOX*uUmC{IYjVAMwexh)7^xVK4j@c1BaDPD{VwYG5t}eh;g?9C^ z204^WIV|dA*Z;=2+juC<11H31nmhUqM|d5M_P0XrD}@dqSiFIqVKfUb8nnU$xD9aK z!9Tc%O7HBsrYahNn{tWrs66mc++@@4C~L90)V5SteH%Tr2h&X;4wB{6${tFwk93+VPA%N zQ$srp!d0zR>BitTGSasc?7!2hX5;rl3`o(g$UO zKtAHSGHZlitt?GCvcpIj!phz7`Xu{p{)zlS-!Cbahi2zgf*#o&sbv8Ei}UR4#dM%mGMLjui_N|kHOI^ zRtb7rH~~j1nZO*;3*c3S?)u&yfqHIRVEN#|CW82fcMC|; zW|@qjfRl!bQc9?%x}3Cl12$oQ_J7SR3e4R;keVjf|1~Nphdg$%^BkEXnL?PZqajdJ z4>lM*PD662ffxaP)XxoaQz??bzHLpY7KJTTtz}`sW*1{-v>2{o6NHwwTixBbT zcg%aLtxGf-oN&CkCM2~1C!}=cDq2;eIZ9Zgj@*hql%iHmwZ(muxoAu^N>&4?Hn!Kl zsh7Ic1QLDl0AM{JwOMhbPt>lde2>~$tFmZ)%y#fy>qGT+1d=^Ts_TlQawKTr59wBj z#-F4|Iz+tY)E^zfg$K4hW!BU<9d>WV<>T|Gr}LhfRJ2F5h?cLaT93B>?CY+YB&1a1H4}|y=`~k%VSs_k zW+tn(!9JrOQBwaPqX%+dj8i6WezQ`KkNobd{>rLVCS+h^FdfkW`-Tl5v$gL)pCHINK*CN3iT$J?n|| zuB5(7;T7TpXoJsq95jDHis&y64iM$>o^YDVD`Ff5Fqg)48p3v{Nymx4lk{oncDOG0SqTcX(*ij#4FW$; z$oV+;`~<1LvW&<{vI@9P)4Lv=7>%~kv2u_2MbSr3pN>izCu=%!7O`*~+1UC8RarWIr29p1=QEuV=^8DHb8E7obDcFb>N<&lH&C)>@tZ{I-$C=I z^ueNZ*05+h+g~A5tSs&@e8&G3kjFnlHUh7k9!TmEF-AqnLrY2_qsfquZJ*mTz%lA44899#uFVlBkL_M(Nl1O4M-U4H!}X}+ zS}aJ1QHlqw%2C3p98N}@ng}|8wqnyE|4%9&)}#Gj)jg6%4cSW!F;B|M)iU~m60Y62 zfvX5+i7B*G#y+{)9CfALt~JNVM@xBvjqkzcOB&5-#$4(B7VvPy}ta2M~DCndO6)1+dUGNZ7?LbcI`P(giN4V0lq z`;8jf#MZ7V!=oB|>QoyM)<*6TYjR|nhVQdXwj8N%dfIb5lrR`zfwsCmG=|CWBl%$e z_l^|IMjwmzXEYVb3yyJK46&dAXGsCA$I!wo#{=3EjJX@2PqP%AbZ_%v;tlT0 z^^yF>;@UuUC_fqtLWqfHQ*WkI#t;GYT8H-u&_e7T1or-|)NPmW0LX!ZcF+vj%p|F> z-T~m3uCB^x?v?`}elAP83INI~T9fpR3};CvmzN}xea>v>@ldE=Asbvu9pX6AfwDz+ z+cD}~{y?4Z@J#`ykTQ(q*^A?{5~2rp-%fg+ z4;N;9_R>@1ag~)aCQa~^q>FpF5!Dd7!LJtNk#;&KHdtuG-Ufo)Ee!P%ftbxM6Nf?# zK3=YKwHo3HNN1EBc*ikY0wUPKOcV|UC1H#IG0k9rZ5_0Nd)*Oc!r+UHABXQ;YD%l$ zlB%Q=IDttIRSrg%B}07a88L}TZ*#i|^Ll+GEQQ3g1|H5DK{Y60>MF+B|VLQ zS#}ZcL)5TN4F|pJq3z5FP^7^ynivTPQO`$>o=Sq|$t2@XAx$+=WUoy+K{Nt)Cx-9C z>4cb^@*K^k>2|A}^oWnJhdp@}S)TTYFR&ZTz)%cqqMBG#uibL8&#X<7Db}Q!L2tf0 zS{I5`HB|PI<96d2!K~c$U}b6dPMs>ti@KL~tSrbY&r3V9RjU@<|E}_J|J44GuKX<{ zNB!y6BgrmW25V~4TB*&I#&%!L&T6Byy!FW7g9oL>%NjRd(kw0Q@HF{G;E-#T2PsTH3K`7p3Lib7DytBA4RPK8Y5W zcDt-ar{dC%%5(0Iqv2l&3;#bY?O^F|$HRXQk^W}dXPO_gguys+?`hU-?_TzOcrguu zH&0W^;ZIAGhSFF4MH;x=tI{S5+rUd{TAOVB7yP{?{zv&AemyO%gYqx@qj_2c{##jD zT+*d;xAMw@!m@VVio29|?gnWd2|k3D5+@p(r#a?ZK@Q8v$znLHd0Kh&>Yv6)z!5$S zkKnMN{7CyR!(o}~kH}%4ssB*^L=I~L&T+y4=Kv&AT8pmIOdm_bgVN6X{M;35paYp5 zXc}6q(rlG%xXN*rvj6j^`PEgLrT&iXepUaW{E6*6rnM6~Ujc9&vaTrATQd?jEe)4? z@WIp0zIb%5M1h0T+O|#ClbWH~Qm*`nrN2O}A(vlDGP<=o`7LfeQpGW)_uKPOmNWyw zWyFE{quVHQTI>6disGk-pZTp7plD8_fWwJ75snm{ja-5Xdq*yw;fMYYQu;UCb@Fgl zax;wdn3o%xbsgY2*bW$l;R=IE6Xt|4ZXlW5=%0>Aj+Bw`fn(kwA*9X&#~d;PW$#g@NaRdu=E6^u z9&n{bnHqgn^+%wY@jw=Y{22RiOqAK*SF z72Nz07VtLxnA#8=an9B8IoHFOjujb`>pOHVu?OT2I)7RoAUjS&W=!Djc=3qOf4X{D z(C2^o6*n*G0*H>cLnI}V;UbWsOe^~P%o$X4U9~25h5pCgwdxwccY=nGtwHD=ty&X% z!ObVvPDUmCL~|_e?f`_wdt>MOMxn-gl7d0YDl3sft%B{n#@lYfyq{6(o=oEKVi%$` z-r`e^Sce+#DI^NZ$q-&W)cNDwqw}ZYY@90huNSXu;@SB5fx#-R2w_2VYZG znk3Y4(jkt;a^n-HiK>_}bJXdS4I|OK_7_tumgEq}K(_?DdRhy9>=bK`2nI42j)N{a&MW_*7pkR>P zx?0>Irv1X3<1T85#5!5tZm>j$3(YWCLl9mkImEeq=J}tDN(VYzL}Rd=2vND^OIHEt zTKxJeM^Enw{a>u~uT^t!6wD(zxNU`+I8NhfWA`m*&cxHkC8^TOvXiY*lw#ERXT{_;vr*z)W{b#@IKo^`=`oLfe(WyPV=h;)7z>y;wI1{8 z-r>KX9&?2?A}5n2Od(2-dGV-&H=`bNr8OSQsS@TIRU9z7L#F?zU(h;tm5hV0B(LsM zu3J3Xs0*G!lKpJr*Y<#6{qn23FB*2FR%`RI0 zSHO^|U`UD)^Nb!8?|ye?Yz6XemV$+h2=Z_}`Lb0-P}e{1J$2{Y`vFt7EhaoaK>#=0 zbL?Im35EtJF-d)J6q4e|S&_S&6#BL^jSH_wLKk@On!imzT_DHFm|T~ol=o+G+I!P* zO}17L!Hw8J0`I8Ww?=FyUb zy4nXisiyg~oD{ge5S+H)Cf#@h9?)UqKOygkliaJ}?w4iq=>6)fc)mw}&ugs58)? zBeQ?SGfnQ5gZXxdT%9k<@A}AjUrs>3YdacAK9orf#F*X6*|dpr zQX5r0VNM}ufA_$!B0yH)5Sf$76U9Yw(^Ws6It;m~&>=3%DHP^!%7^mQnvILmhti%# z)S*7C)}?S9U?+?#m#{=gTkH+F9`TlsQx)y#3 z;NAG7NrXd(4NOt4@};ZcG&;(q-3P8N2b3k^DCKqNGDa%4vh>xvCSz=6sfPhkmkr7?rTmolC@HIM{JGmEqgD3? z9c7uk^K;d`7!Acb1Vwb`r)(1A(>E?aZRth_m|T_>Dzh=W+Tfc`UyFPEO)?s-l1NkU z@l!52csuU#H&Zy8Y>yxNN^B19@wZSYEGNSa&gk^hnsvw-l}hh{L|#n|WMhY$|GJLq z2`wmV)!r+fUx(JJTdmNzOA~@WU*GcdSUi0NG!%5=6-S{1!jg}YDNjw>v>9beZ#zVA zw^}M);_^*7${(EjcH4#M53X{K$wpNavPX z8LfOFJA|(CIfdkxWsN;a#yDpzmsoB_h=>3y% zHfnSfkYY(k;qq({HnEp)^-1xQwI&FpWYXp#oZ=io@Z^=BUN{V++#(u=0hM{dU=mw^ zkqMbd)U;rUnQePuV65-h)G`-aed;X3mk+>xqOQMK#DzR#ce$1Ya zt0uwX5GRQ^7Gl*rIOFs^$R+jWSS$%5Ixp0D_3$4TkHJ$(1A_s#){rQZh*Ly0n=^7` z_9IKBd&&K+(6~wyN|F?u{L*6NkpV1<`rh7Cgy4}U|MSHxjKlNJ-|P^%I$xCDeAr1(N)qL68Hrk}Nx%RmDrG5~{fak( zOK=t6L!fXnDWVv1h#mN^y*KZ=3NYMDV6dD9VUB1+MBIFGS;O8^=zWmVJ7o51*Qszo zsHz^Fv{*zB%eO?Uh)4;SeW7g#@88|;Jv^=xpu5jGI(gb$#ztABE~@%yH(I3bcaF_+ zIz@SjT2(W%ThGMP=mRpQF75L4)0Z>BCyavF8$&sDTX9uANTBdyRZ+6HGJniml)Vor z7y=M&R}-q~6phy9M}v(zS)2e8UTKu;&UOGv`hp`_rrWs4S~6dWvLV$%s@$!8bO>{RZB&cD`8$J_po61}@^GoUOd<1e^# z4O&kAuJjL;BpBtn~F?kQz@?I6RT8RE$uUd+r*6{==sz6qb`AyxS3HJPaldVT4z9--uIH8B!?kraq5PU?Z(~@5M{AhU2Ht(K&2-cT zUa&{ygptH4Mc5MtpTB$&-ccNCkI8b{M0utS5eM1jh>!j(1}ra{VbMwt2pnF8spRvi z$0L2u%-s3+akm1pmz*Jk*|R8%VB?MurX=B=X|sFLIE=@C*)d+*tBAsMr0xkkdE~3p z5!XKyTxy(olg2y{JIn3=dULoRaJ}LTm#Zs*$|$k2<(X6Q7U`==c#?{OdKB+S-4tB% z%Ie{GQ}8ugMBo9f&@T|!FuO2UQP%1kUVdmbTB~2T#b!Biu3#Cye9$Pw@`i$?zIQO( z0O@`-N3}=$4HZ)z{oA8^(Q5ss85U1=84Ag=89gNX`CBp)E+M2wnW7>rMdRZ6ld{|V zSn=B&)FJhm|Wwyz|hd&r`_&Aiq@5_j+6@6`K0mWQiTfQ7sfz!353+@U1HUzMJAc_ra z4Gmy_fH2UC4t4d?y|emYKw1p&2+WB}kf`BlQjIusW)NO6zASag=;OPs-;iZ@!}$KS z595;t=d|XXtK(5a0rc^F8GLEiy)d2+_hCF*Sss3(w4Xhkp-dwOmdqJG>vkB?N2!mf zvXmQ1WvPcFAab%jnK)q#=4AU=cm(`Y}HjLRbWcmY$Z% zr!Y2kdKr!Djnf`lg{R;D2w`(qr|@MPrRJ-hb7wsOxV~UQ0rt;TC_evbvtj z#=w``-EX^Fw(9QJSJP!fBO@PzQGL13qtZ4rZfB^_e)e#OAmYYnG~788{i1)SffgcH4{2i!@9koaHLT(=4({tx>+ z$^%K_Z*JY?H%b1zE#VJVKQX(j&N&O@f7#2=m_+NPHH1sNaD zxE1h@ND*&SOZ=|~pS}ep{>T*ZHkHJWefiJ|l=!1k#OaB|C(bn6w@q1(XPVI|;Pl|! zplTJRxoP4^n^?}>cl^y`QO->l zN803a?w!HkZ9z@-7jdjjBSo+k1KX~}n{o3LH1&ySqCOG| z(nT_)s9DRY62(NtHa*^R#ZruInlEGGYkb?2MVMQtNbARjecsLPivX!g4z8E`G_tVnH zVP>pfRZNlFI>Z7&rUZyRafJC(J$f=YiW@imgc4+#jDxSIY7aq}KPV|y{m7fc5yNr? z16RYei7@=|d;2AbVTFc)sT=A61|L!Bz2euC=VR@~l?n#uH6rZ+3iFB@hQ#p7l=4+l z?DwixPE?9uox>H+5-`#36;^N&z#^U%xJS(#$i@H z&mN38RfyI6=*@$+As4Sv&~P>3yud(k$+q-2mSR-?S_K1H{mcU_lx{L;&yTC|7T7uk zi)GCv4=_;Va{BI?{R^w;m^;kjcIjYzAoVh=}nrqrMwM(VZ;FW8BvvCT3XlbRux zM-5@B_|jG3qFbr=WM4ZPBPO>fIKoisDOS}t4C%Yt)zrt~MnyPMovKPDjF5^){ITxy z5g3p7yNs|Hvb;F0)?rCL(OIN!b9egv=bd<)d#j91;7BjpJGI8PRrQ^SYiyg+dqH_D zl(PCOJXaK=+*`jJhlsW-h)P0%NW96ohuX={KXlvpu6g_E5$&DY z!#{rFxQ)1n?^1eC&aUo03N3t&*%^i`xMl|CSJ|zh;PX6N3N>LarL>42SC5>5TErd& z0hOQ516mNf*+ITB%gGVt zQ7S9M33vW&4pO9)6R|*5$PdZb z;P2YSIZIH&6d}%xFD)3l1ZBoSGA1p*j6IVG_fBx=V->^Z;(Q#e^v-5fu^hVid=R(p zCr&M2=!f19QF;$FG@a#|s@Hx0?vRuV<4^@p2z5zAscHAE=oFR@FIqJL^Ku-fV4*XZ zxX&fI#5}!MF>w#h)8S@Vw7eYd}=Q27%TiaQ7&{Fhm9<88r1DNP+QfKSC zFS>9pYLUlCxUzKLCN6cn-~<`uouzFMMx%!3F&fla*Z+GMuKZ&y&^SrlAc}>myYk*? z_YA|jE5|8V3|?37DWnEuG89^K*^c43k00*bWR8-jE&k|I{ZBN7e8P-Nx@cA9gT$(ec{?I!~rwpaso({=P5k5 z-FVL~#B;KYhxcE5jEC~TG#=b_26|vlQSey$vOUH}?S)yNF5HfL;i(!vqhDJPmN;J# zJpayTeyQgAX&Nrp%k4QLV*h*X#TTaFK6AQ)Nb`9!V47~9iA|Zk4ELEcEYNte<_O9> z=RaW!QsztPP^!^1%nX@d=ctIH-kq=^X^_buB7R}iT7AWcrPR%mIaX?eS z6^covu_b1*FOn@PHL0r9haFzNp#pH8lL}5Cru!%I1=E?j~dGQ7{dvq%zI!{5w zMP=+4M6YdVvkMWOuOVV$G`vToUNvB}v*?l`Ln+2-a}7tBdQ?2{qIbU8foJB6 zlku|gEjlzuWkN;eJtaxAx4kk3CFvy!E@P|<1IjCIBP8jH-QnL+l3wZrmnU3DohcrD zJ2Alzs4kOH6%MEh)nV0-LdFThkZP^?#8 zAfhrkzSjAxVK{d!6+~p56+oc=XJq9&!|w>3;QB2Ti~`PZGqMSwL zn%}nT`dPT+WXcE)v2!{ohel*!y@84{+_b%MIYt>~*`sp8>cW_){O(63Uiky_yJsty zsQ5nbsYPis*De^k2ep|TXUIIE7-joA>aLCB(Dv7w#>K`V3KLG0_oa~_7BeYKI`P#&*e6>Zecc?i$zSapofEj!Mt$k>VkwY3mP$?i#*8Co?jS(jH9ok_|=HzIP-dbAJz)e;Yo2VuFJ$C1z_8Y0uS zqb_l+f+h$CIkl2O5{)u6BH0`kMX5x2>uSHsl)QD)Ohw zqyRmCAJhz4T7i$%qdnW_Q;j5g-0;sArLVggF!@zXj-zsA^+%aj3A81<39m*f7spHg z{%#H4QO`>mtt>cfCR-RQ6|tJTdEj=m_TWh_-0qU%GYf8f23cIIe2k*Sm= zXIbUl8&PT$C|E+VNT?<+R?U_C6l5e<~5sx{8Yr_iMJ2eu$3f) z2qijm)GkyvvfZ!9PsNUKIU$!QDk>`Yv@SE}V^r|yfj&YKZc*f+7Soy90zUCd%G0ea7z1Xm9AIVWKOb z35X_PT-3SmgJ$;%l6+JI(nde=#Du zfk9LdZfGh*L_F{CmzK;&3&D*HBG@5H>T6O1CA_`}Dz$(0xb;Y-n^;V#0urA$VjtT* z;jsz0kKN25Duav8q11>Zj)|aB+p`{8fmFJM#Z=$BsSpvTv=fKqO~mMzN(NDR6XBtJ z9=H72VmJCcZdLG5w-LS98Yvy*sK%ovpbipnhRn$(E6!8I&Nk+>a~JplS8oMZv=(9> z^(%Qzu7f<^H8=`)wkk_JPRJuFmnbXJxV_gb##4V#MpK#>YXnibZwE+WT!e1)@d-c9 z##4XD5iU=tMM#6Mrrju2lvnf8fdKcPk!lqcf;3HqUy3y(Wf^P@kKCwF>xlKW0f0tSo zQy%&W(p7fXQQr3K8#~JYWj|q*G98xnRMROMt;>%F8`)zWUPg2ROIS+z($&pa=cwLC-L{|{ za7A@owQ=J10SgcgGoE=psR*GTY7U!-5khsM7=elsR!aw-s2rp2Mw~Kk%s9Loal3*r z7Ojp2Y6~NYSfd|&8sG>D)FgX>5Lu?~Ja)O(F*Vnp|NV(!IM*>@lnNnT#z;uZGRCg;fnZ?}!X3+!uYiLr@sbZIYxUJVT2Dl4b;2n&Pxz0@C2-1TzwJbsTQ4K) zR@#AGuio8mreyBiA15tAncHBB#ffkeU6oW^LdCPsFGH(Ce+@}xNx830o6OctLmldV z%bQcr-;EKy18gyQLM6fiTYF#O0zCaRDu@CRV|1}ISBLPN5!&g|d8?KqCl9nh;|XO5 zt5vJ~vz8ob(6tYi1-Q_xfPH*+*j2qTPzlFB322eu+F->qO_a_=;`COjl(q?CE{9#bq% z$RfJJ+o%UECd#7Im%nVnsK|R2B!-KwsVy$y8KZ1@FSpt<4Q+XYoMLlAG;w6at*5cO z22JV=$nG;kmV7_#&R~jPnNRy zU9sfdacJ>-FbSQR&CdzhL{}>1*&0?j_Gh&HKcwIyRB#WuELSyuFtX#Bv$iip+yBGX zh@22enCq!XpS@|Ptied1M`S$Zp;&D@NNoa1X#-6p#i*MhHw`G*ihiWQ_Ncs}6mgU7 zjGI4LjC#wX3Z`&XzmiasMX^zl5TV0gT;&Huf44#8ghZmNjfw$&^y!l~V+`W zh{2;)*$b6JaAp=`N64}cj~C{9A5o9-j0c(z$2w(?r-T(KDj7fAMoLMH^ly7kLWwa% zMv6743IYjkbpjS|eDjno>%|Kn+Jv^OCloyKPz*MqL})<5ul^aWs!0+aU?-Bf5dPw- zEsL^pEP4LrNoeJGQbt%2iUGQ&x4#f4)g_a{i*TQO${8|+&D^CJWmhYWPhN#~wWnoV zJ#YsoOT_A{66%y{Hb6cc&8zzm>8b$M?Yx&9|Ab_rd`8CTET5r#O7RM%&uEQqoH%pg zEkMaV)_m0XHh|(q2}K*&-k2ys1qp6&mfMCf5^AS?e-7C#Xl$%`H*`w-*ptKSY^26 z-kWwW!_4uo=qQq+B`Z5x6GK#9Qu*soeEs{0h~iZWg+vRtQTQ^|g{#Y#xt%sFxgAiv zCZWiO%QT@>09G0k!z~Q}e)9X=Mxt(j3}5{ao4GCvki4NG zVb++m)Qc>W4hwS?;W5Y>_=%J&`b`~!&f6dXJGzR1%6Z@Ck~7y_1yp!TMxgHmd3o(D zI~SI_RPQJ64N5f#{%P#J(EHv;ANuKR9Q)hG-rIZM`;^0;`WbtF$Jl!Z?|c8@@_93{ z_jirGTeH0@^WJsAzqVoT?-_e9_I~VRZ#ZlM_Wr)H_Y&`W56*8Taoq>T-b>x>ow|E4 zbHKgBQU3l*>b(GK_83gHT?+GDUVYRpwIzqWya;`7AIeB9buM@5LixM4>|QQqRsBdp zQ%KSUc303w-PJWHEcbUh_z(2GeQbe6al%;=Ms$awER8+i43G2!mVe7wOlBz$H4pb` zLuiA=*Z#g4@qA)~#|!#U_lYO(Y9rlG|5V1KW!j+54<1p8@Kg4xELniwkI#}&8J4<} zX%m+Clt1RR;94o)_2+hooJ^cJB7&11x_`lPhh!Hoj{u^ttr0Z{H zb>Ety(V(PT8a#w4qaLmqjxRcBf|Nt!I}HnWA_Q)0dm;WJvzg`AD=eX?ihT_~-}DDo z-}+w0!=BBGi(RD#bvCQM{E#iECI3M5?(WzrKXA)|kBvb;@Q-ru==<82WiLD*zDzY- zOkekJG&_1+6fh05!Q{ch7sgLnIq%zf>>9Lk4mZW`c`UWupBX8k>1C=9DEqIC8CX~z5s1zmvUUw38YLmRp@|VuIzgNFBkNEn z7~Sj;sM=WBS}#VGlb@%R#({0a#XXF|(K9eU31`V()Q&z%fR} zVJJc69bG6qCuP4i4DpP$z~dEtsGCFI-G9nFyg4*Z#bZ`@$~l>Y*E)r({`a<{5!ZNo zTu#X)j4OwT+J0m5lBwx{Yl4bPTT^J^&&hXlT~YmCxTf7`?0=%tKVM$T-To>5T|BUQ zlpp&4S?%AloRqtGS`+8!4X3EFgqpV?w^M&dFXLicNUwmsN)-9f_<6z50 zxr~64xY^eitwD)9MMa>MhjPAjMfXGs$Kd<&enuQq2^>zBswj>e!g?^JWnkHrfMc41 zLoW(tJsF~XQ{LfLxkV$b8iY7c60)l0tD9G$toTJi!584M1|UiWN>)|W ze7z3)pP}~8mD};Y|HuC_Vh#2`Q}3TCuH$b1R5jIMe>}FV1p1$)_V2t{j5Ro6?x5Cb z$?dD=<2s#fKnH4URbQwQ=KhXGt(C?x^?%@6nWN$`mV$Aa8WgXlPuR5`d1bDGf-kXR z4M23QP*&`sm4x5_xRxL>(*dB>qRP-q(Uz4axW!I z{_*LPlTnr|RuPbeTinG#t>U}hT`jHRB`OZC9E$h-Z~XLvEht5nCiU-yETy#b*Sl_? z=7;`&Rr|Lrcj7KRD0|jbx0Y{3d)6`qkD<7Ub8#lVY6<)C?9A<(5zlgSJWd6fFdpjk zGW_PN=i%vPg^GtNX<|K1!Z;|8!;k0wyby0`uQb8I77DS3Bf1w-w`@DyTeKB#*{(7{ zqZQt;h9XRv)`V<5?ViX)l&!xhSdz;RSVIt|264ju;>+Cm$Rn#21X@ab57!RGtG%w@ zwHI-$G2-xU%@C)WK8Kt!3o}5hRd8S+2$j~^`XXg50s}>=S z^+p`t%?zQJ4LB=vH0os=R2+c>pDNjUN`%)db?TqAsO15TMDA^mWJ9lHHzA*K) zg*XqJ)V`@?jn*)PX+T9nPaSsXUW|m^tl&_SusLT-VQLWem&-q1xdBmZF`#hDl)@+o z>3PykS4_q^`CUQLg-VU(_M8wnZhqk~i8r5jHwYY~V#6hkW1A6&(`gaL zLEUY>^po=Kc(-}Gii1wn;30J=RBLX!XB(pW!w!{aw4(AxRDW{$NX#3t!xWX4p20(U zQOFYGuHJyib~-`k8Ot8K%U@IqQRmX>r6I{{vr9&ktCIpP z7OnHG%oU>jQ<1#opRZqxe*E1^|7C{Nrg4xp7~!?wnz+}IS#;z2EI_kI@|sr`@YKM} zK0PhNSA;1-$iaqhDz{?%g){tabMTJwX^bKgF%J`qjSM?yjA z$btJ-Z9J*&nKhY&QBiYs>X@n>I9JUSRJ^~@o;0F!MV$v1&p&b)o(G$&80!1<3B~ea zp@6?W5w6j5JG)E|YL<@9T(TEu=^zD5yJ&4)G!9p?n{1XSYvitB6UU%6@?Zs3d(!^q z{%lb>2rgeYc^>8510-G<8;*+%#Ir z3`1FWJkp_46!vU?M?%L@SVuulalnf0Z^E?DTK2Y-?Ro1o}?g@(78oIVT5gn z=(*C>uWrKplP4oW!3lOd!v$5pVaE>x$9D&Or?B`+qtfLQi{-(vq5CLRXO+&0x0SaV zfh*-y6{QFp+5i;Q>Zm;S@3jc*r~rJYaroRMqc}<<6~DRp$GJ$w(-EcUQfUGzem7>- z2BhK{9KQWYMJf_uO#6vj{ebdJL>UMM{rR1HumQ1>qKxYUg3U0wiJN!od_GlW*4M_r zv&$z20MA(}o&qfxj}3S0j>ac@9o7c0uuP;7x1Dv=PDFgRikLps?!dNFtCxzoYmE?j3=gAtFb2ZIe@lys-_XN<9*04riC0L7c%hFo=j_DT)blwc%xT+>9O7J)p&F}o zuG#c<`=wz(ae<5?1j%g!@qUmgiWFhRFh`C=n01;AVdPZI$j2vqI~={Q7fQ%$z>4G7 z10#{4Bo>=(yD+|#>b=3kd!eBwnqj->s_9*8JsQ@K3jBdRBr1CEPz9Qq`-i$cw& zszf*%F_~HSF;X#mA3l8cPK=Segu-apE8U$t3eTNuT1hc`m+E*dc0zaYP??l3Xz}=O zm`V9E8Ba74^7BrS?yvyc=0R3BIIQ|B^!a6J2P%(^2}_voeLnSIrAv;5P4Qe!)!nGOk&1#{~3cT%lt&ihjxdV7+0Bu2-sF)X80&OZB3z)UZ@W>r7T>M>LAy zMw#KS$h1)qg|Vqq%S3&@GHd8IJTqS!sAU_kzsU@#U_<5B4xTXYQFRCI7_((H z=2LDdhR<>Vi_(p{Z}P%Vk8H+0y_JM3TEi(fGGDp9GZN8J&2u-8!RV-T6$PhMIDsKb z3(A{WJa*kG^k(`L6tcq3YI`ygWE%OI4Py&)4(0FN(e~8Y=! zU40^yfr6;Gwp!o(3I{-XQz_eye2!3#*|NOccZU#u!F8#YnQ654uB{ogsdclov>ax% zP6uo47sEv8`|1~yEEjC@?W_zx1c)kC7rb^kd0@?GnJ>sos<58%VxPgInW{92Mvbj@aHWf*koJ>Gf7$`gT$b6M)~ zVOWmsN<7zU{8hm@Z+VvD9y#E=l)i;LDN&PJ6s}SjiaxfG|EE*9BzxR~&wxMMxK3e? zcn;|*OakFGn&mUf%CCCfwfG_6va1;yKoU48P243GstU*9q}#4O)*vUxR$>Qq{?Y%& zB(~$n%RF$xMND%?-{Ck&hok+iko!uZ0|*vxU}so}g%{RcqEOtU(qAIkytwY*AKXKw zcN>SN@VsUcR?JuL{mY&+VP3D1=QYv*MO@0GGIc|7KYhaNC>y18jlj~}Ay);FHxpkn zQPjv0(fLfKU#j2H_`+2wLTSRm?VoN(P57@erRy3yM@j;9epEl1Izw29!SdK7JnOzJ z)flQvv;prOyYvpga;<~~f-e&gk)mBjLj%8R^3Z<;N?}+-yeby1Q=?d*x_41gNl_6z z2>0nz9}hQ#6OB@Qi}W#gYDv}<#-b|F`dA)4`@2yCU@X_MV=-ig;>Kin3S$GYs*ai8 zJmDFPvBYv9qWd^CC;d<8x(w%}Ejtb>N(hy1Za8L*5P4;3QY;EgndMN#=Oo?8U*A1_ z`}#5%i=P<_Z&+goz(0{uyNpqDkLY|;@Sok&UI2`FEJiKQ4u?@&_r ztGYL)+zKPb8xS-|oit^UC%EL9X?$`ke77EPGH73;edF?bCbCs?S4he+$v(jwRa z-Hk8y`HcHr+kZrUzZuXL?<-n6u;MF|h@biV*6DKtfcAO@EvfuzKLRZ)OVde3&u$qC zBi0V!jE(fC&mP#0{*jIhV(o@L%LUqxIQvC7|L}h<%Q~M?POQ0f^Qs#GUnd5idQ+Q) zr~ZcMfSRZ{msLe$AyuH+n0Uo$sT$iDTFyG-z6qs(wS>W{-C$-+-B@Vt}*EY;dQ>NqK+)~yML^*?s z%s=MghG`fnTP`C|Px(?*w4MLQj#)(UQ8B1{zMduJe(p}-6J=geJQTeaUVG9uq*n!x zM-t=*0=>fVeo}7g9t1wG=|xo-7=LlzuUKKACyyuIE?OT+7z2v!SV~y_WDqCgvu3xL zu?H~qk}=`!EQ26)7(#4j)=b5~&)F1o8^XRhPTZ~M;nNJ9`g!ko|JJpy0yS@No0_T6 z(0aJS+~d=NV)XI;*!i0A|AO(}$c)z_^FWEyXmp;H+#kHC^vfXh-SVw}nfD`%{U&|v zd66LApND{fRM$}YzK|I8xAnqYLZ@DS+>f&gfF3u?^k@iIh1x~I!rwa{t$|yg z!bX14Iiha=eYtY{lsv$6i;k%zR0}SLx=>IUknoDp1O%hyJofqtlhFfGDIp36swEhj zwhXrrQ6I)X+&!^r#$N`@*KJyk!Pxj)Wh}K)Ts&8R$X%UF+kO}f|6adgH^z+xGz_B3 zrzoFfWEyYNES{6IU=E<@Eun}7`h&=+LszAoi^K6faK_x7(pDv{-QoyH5H?&R6R()# zr^~?C426~brBHJWTpEB=HU`GQMpYfRD?}#Dzga}2#kxyA+ddb3rBy1W6a*3nHyNGM z!H3GyT5~c~>`xzRwlqz0RFv)fWtohifKz>x;@PrOg?pkaMHX+s>Dr&20;`Cwsmx3@ zBvjW8*4%sJgsXv5f(I0*2=K=~OeZ}hO*0e5`!+Yfx^mhzFcYEw!I@AzbgX3LSC)HI zAuKOKNJF5e9->V2gf!BPIS{L`cr9HF;&{|W%Iv>iJ#w{F zleAjLBPHla1(2xJp!9*?J}%yc`aoX^Pfe&6^${Ou6LYynJ#}ZJ|7X)i;GK;ykHV;$ zxQvCe&lR4O^$XhPZsW0VwlNzR!kj|gGkB_|)h@he(2vC-GBM&P2z%*i*L0nP`g0A3 zLU>}tu@GzLt=)%=MP9Atu!u~I@QP8Ln#>BGI%M@EybBnSP}J5X8Vz?6Z3C)=aS-Rf z?t><-z+0|S9S7X@O@sy{{L!i!Nk7Evwl<+%qDUw^>Ft}_t@Q(vIvoieM1VGam+@#9 z3YZx>^3}YpZ2-^hEFL@`ix5VfV+me)=7M)eA+N-ABt}E1%M_vVtk$30cM|4Vjq5l% zLkZ$`oeBqpsvrj<1k#GLjyQz~`O> zs5fFMj`WFoil;TP!gG61pN1>Efx#1tRzo6B5h!k~@c0W~&-4S5{stsv(fXL!!V<+p z)rLe3Pm^T>o#tcc+98PX-W`tVn1z zbslSJ!Bc|IpPtU&iAu#@jzQ@q@c($8GKm3pIa?d0{U0^>^Hr!(-6f5`Q8pTL#!-kD zu{4Z|t|H26ytFvD46Vk0Gev>6IHfE*M6p-`65a{2v@#GnUknNyx#K%H!QYLD`h+9F z{F-R*xZl#%;xKCl?{VnfE(9uD%<9XW70N+-J|LLC4x-*z(C&T|Nt4ZW0sl}ghR6@u z?nR`ao0~ce>SeTdvQ$F zp+sIob$PfpR1&VK3H!^#kRS#;NOI9J+{IkJ9YX0|kH34cRJnc-kEkqE#LAq!sCdS1;uR;|YP2+UiSk&6mI7K|H`9DiVDthjn;}-13=(z_JDoU{{ur!T}wDNk(DHYxqsry1Vo;mc_ zI{?jt3Yr2XoG(zz-sMvAh3u0oba^b<#`xLD_*;hG2V;4N8jIn!)`2)C^~k8Nx#DfR z#t()uJxqd&BdA zh)cFCBX^yCKZ*8nWS;HGKf}(=MX6HX{l1P?mA` z@IT*r@c=;mi~)6=iazI$j%aE`Qu8N8^;gy?W2q_&kAtB8#jmZJi`0LX7>DlYbHp?_ zMjS(?b*P0XYRX5@ch;!A=p%SeLEXMf8F6Z|Hf@OFXrrp+jE^9&v%^HZ`}VwwLy8@= z&gG@9F?ZuZ+oYc3_U#5&BI zH8HOCNDV_|6Z8F2x(dFS4kL!Ga5RGYBn8ltEUacr+F-$@j-Y)o8~I zNcnix`ScF0c3FU#+doEsxDzvIzQm#>y{jJLB6x1L*EudwKhUQZ8E`G`CI8()5I^{qg&R~1xJ$)Doj z08wqCCpg0Limb2D2(RFDV{B&IM{4I{C6?C|yto-Tlf_`&mv=5}#X*=8eOYR#ldgT< zxID7)PC)s(g0d7cpNHZJ$uFZg8~9Wyx_#MssxQe5Y@LQgl;YGq`d#;z&BuH6ZzyBw z-1|0%6bDweE)^(FYeKs@wbPs_sNKA&;8U(fTlo59MPI!`ZER>4NGeKIU#6;7=p1tT zGu4|K0QFl6YB?{S!W-aN=A-qwOmDnKsrepc#$gppcX@-VEVXLw>{VD<>YwT;qVk3b z3oRBNkWrwFM_GD4RED*o`203WHpICjT@6su={&Wj-=toE@NETQ*+7TPD>(yIr?uM} z6IHQ#-aUFhHbK*bXagd_T~F3#-a zuq?HdQRo-u#SHF_`{Tr#Zj_Gi4sV>+6UOu}WlR-Nh_H7(+~sPt&9y9#3ddq|9YB~D zR3j6^3!i4ZJRa-zeuy~xM&pSly}?QC)}!05m$Ke`gowhCuoLa57_S)@bt%m6>273> z&u6p*P5EKRyqkbxAE$&5_77boTY?pxT`CTF!Mxl(7>E3C32QvBqyW~E;RI_F{wutT zX<=>*pY1&Rt=*jf$tMaDs1gHdbGt!#D<~Ed3?%|s1sxNthq#L9O%kpBdf}&AkV>D* z*wFS6j?_o%`KnQFQ;CYVeR1j`+cDnuGXoO-j)BWIBUR~O=4k5%7A(M3R$o^ajV0h_JfDmdj~6zRC@P(_i^U9&ee=YNJFf@od_^Imlkj~mkBI|bW zwNr;c}o;M<(WD8&pA8LGxMX2zO24? zt#sb!FE_fo%ToH;X{UcP0yU3e$v8x|dvX1YusrX5dGS2t{NXYZsefy6rg{`?HVR>M zJ|eUBAw_rniJ7%W=;+)O9l{u?ILY6--L(?qBuB~^D*`p)puap6t8EtxLnt$>RIeyT zouaN>(|RxJZ=)16`%^R0LUWnDKR%}Q=$3$Qbn`>f+V;zDOh62~8flVIl%E!b%Yju5 zm3`!pt$0Q-D>psZGFVfSCc6GJG{sD}seS#?h?NJy?TVj}I{hM0k^syKCSpsg^K88w zFpCd+iQvFUP$F5_i_+cB29=?0PdZKiF(qgD!9de7j%b?FT@^SytM@$wvU*4~NH#gA z`W?J4;*6-`d}{O+J<-ro(_o z#~J8JA2@Q11cQn$O0c%kh&yxlz>=~^3z^^>hkR<=Yi*tsp0s3?vpJI3w8 zD2@p{GSi%J_OL|PH5KzR;_AZr81phwMO9>Dd9{Znygq!I(?nk%tIwIW`whVLvy992 zO;J>8yX=i8Btr3!Z9CqC5l^xoacWzZyF(V9KN<`X7sfG&q!b@PUc}0dmWFa+noyX&_&oL- zVw!4-DL)VV3!Y)}rK^WBeKnqyHF0APz%32fByL@^vI0#KAnJ6LD{_3St{E+k>v zQFfglR^%*0yUuhYP6DDbuZ|%KbDXM1F&uy2@69*hZPQ=yv=M>K9#Y2YqCjnJI8rT< zFQZ2mri91eMp^m~`rDyn(b7LdqS?SIDIv5@6YZ$j(bd&RWt-|-@Y68N zHZ>EGKrQ&VF+Zu@6?|7H@>t@QrAU!k7C3;x-OdI;_(U(wshx^G(b?um7&o4sSyz;Q zDShFop$9EPePIqFs*6IZws0h5SX)xShjw$`?Umn}h@^z%^IGm54F+vpf)& zd4<-dJaN8J-LcHterU|Zb(jHVo+$=v5Tf%#WlFoYaNtjvDQ&(v25S)Flu$$V7)rcw zQ}GvSigeyETXWh5!kSCUyp>UliGKh1;I(T&6cF% zoT{o+Iz?}~F}U$apy+anqW`O=H`ggk-N`7Nbn^T{knbxb%7y|#Ln=@(9bs$&<_wY! z)Na=q@DaE02kpLnE#AUksiD%tIVHibrS?(K?Ng=>OO-}gB2aMwyRN@$IC@7{*^H;V zTJFRHLe-;kGAn~cMI>QZz6-Vv8h z!?|ChqarJadXJ8ZgM0YwwF@u~ZmovS^!A8m;p62&rgZ`{;q^mVh%SHPpiyWcTBo5j z-dT}$SG0Qw6H;`CqAHvDzumDE^F*$f5mqGvk?NWd2JFS+;5&yX)jTK|FOjfUo)qlW z_CmPvl8{StxNN5;vH=`_?dt8A4Pb+euQu8cDyXlk30Fb7$e>@%{}>0k1BfMzF#36$4JsRxuJ8(={J;-iJ7Nv`fwyy5h{A06WRIOE%zX|hv_ryDAIWblt_@U&@}sdJ z>?oeeU=JRezT;ST__vfmVv$;)%B>) z$)u4t&3O{|Z5J^oUe1G@*VsCCZNE4)4CDbrMbt~o7X7yL^H0BId<qMmiYqQ)%1yb>=g^1AB*?c(+-mOBq4AkR+$b@)+`ZizUR5OHeIY>ib3}3KOTZDH#>JG*A z7j)f?cPI|Fz=2LKmrq&5$~>!6#V%Z#he$}GH4UK~{ACq#3JK{nZhu2ex<$rTlFYIZ z;i9sVn#pH2PS}And8mXt5r{RxDV3^DJ1lU^H1ygYCgTXz`Sef}sgy}a>jRxIEmYyk ztgD+J`Nu*$&mAsfh}H=o*hNuL^{k>l{kX>uD2_lBiBN4FMAC*sLFu@H|0xJ09A769 z#iKdI7^>WG?TC>Wn{%X!r%8}#;hGGRJ&C33Fn7gK5)w=l!3bxdjFufjvLd>><|#ZU zywq$l;yGH!L;JHlz(d7$7Ce`~9%DO?k?=q?8)p`=7J|Z@Lad*q?cSY%>*rXle_~g# zoEA|OIqD&g;gTa)|FFpiD2~%ma3_6hGKlX=>QRhA(E0Q?CZKidctlVi2}|X~*f3l7 zW9kSLL*G18LUDo_iW0ZarBrm(tq&ItLt30@hN9H_ z2J4LnXI!Iqe^}X9yPg7Mr|8IZg_)JfxQRfGcy=E2)ZHuYfzh7kbhHQ3?4=u5e#7-Ajlvvnr`wGO zvr7>CX?ZjjUfVvxT5;jpf6qZ{#Th!nWEVb(>;U5>?Vzf!oX?j3bu(I(&$JoYf76OF z+Rn2d{MT=oXZtL>Q64}mh1z2VN8bJu_n5QI#?dq@gjmCqzq@(~uHkbSWF}!4K+9yBGs3@hECXVu2QB#eVNOKhw;NU9Hfo)r%Jiz&kU1a(X8=y#sp Tjkna!x4;4-M$Is1>jD3NG9Lhf literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_flann480d.lib b/Thirdparty/opencv2/lib/opencv_flann480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..5d65fdba38a7304e0c63e53da3adc7fe118fdae3 GIT binary patch literal 153818 zcmeHw2YejG_5bW)nyCTP6Jo#+x-D656yHfM$VIZT*c zh(iw@LTDj`Pz;!EOgCV_*rpjUU{j1S|Mzyb%oVX z%y{ZBGmx@%oElzdhDnp*C(xQDoF2QC87B3HpFn>+mD5G*nE{mOUv84|{^g9*M(`8p z)wLGo;b)#DhMi!NaTVAD=}ORzbjAIgF703j(&d|Tx&&k({i%u5B~UJ;%NKCEVr$3; zbS2mx>9Ukbi9N4jCiNN25=eWcIQ`~smO$#e7pJmyEP>Sb5l-covIJ7Uqd4_{2+9R? zz)DUBp2-qG#=q}1DY4%sjMH`S^EzfMyNA;~j2TFOpULUA8O%WX+dG_Yg*rg`8}K0A z0%b%L6`$wy&#Re%R26~78of$~SPq64k_zCpsI*TChr$C<%<@Dl8$OrW7 z`6eYs^kyb)0X~Q{@*azz&5s1y3j7vn%gaqNzOMj$K;MFXr0;I!^zAD6_bQgye<`Pa ztHGavcHENF_NTH0(!_f?{bDRjAZ^xz)6i{L0x4zD(2L;TKq-roTeAdGrA0~jJ5r@Z zBcS~uZP|;{Vb8LJNzfJ#1KN5hr>$;>@&IkSjMJ1VmOz>cSdgYbT_PO<{RYyZr*k?4 z`W&QPp6B$-T9yDZ*7fAHb}%!Lemt4e+Na>(Am@M?oXTcHy9e3{@FDGRKBqdcH_|qv zIc?sPC6Eq>vLI~?eFczl-)K%v{g{Dt>rgL1i7htgwBv

    xms1bx9DfZl60 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 Oo>$)!fFjyK*8c+=_Ixq` literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_highgui480d.lib b/Thirdparty/opencv2/lib/opencv_highgui480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..21841529e726f88bb168777fa99d55bf9628e122 GIT binary patch literal 215720 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

    jdOeaoPhkh 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 Ig!lnl06~5&4*&oF literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_imgproc480d.lib b/Thirdparty/opencv2/lib/opencv_imgproc480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..6d305ceae1f7bf5b2499a49d0cc976e48452a7d4 GIT binary patch literal 330562 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⪼Iu!=rP2u(}Ynu4OyZYL4_~AI5HF@Xq3~Ry8Grq5!cZSL<%-JSo zY0AwHsF@H-TMxOZ7{$1MIlF6UP}3!Pc5ynD_ZdliB|+>&?1`emlQ-Fpf6{}7*aZ~D zB5$#YqEW@-ynIZycMTOrz3K0iD_@dRr$GiS%y@>tkMghFNO1s56V21`1y{+F(<_v| zf6!X)AFj~&pc|)HNk?&{a%iYsQQi`mA?X;6wpVD_DQ3|^Lrz_yjz@$k{ok)?8qo?_ zZbZ^df!pJ1b6!E>D>x3*QNG(2+%s% z9p7+Ud3=jEVe)Q6=?+W9?bh-jhOj)*YktyiVNPzcgirscjmeD;Vbc#zk*yY`R*kRC zIgKy9SPctAnH@dOfQrRFTU#IZANl_w?F(ePqpa!yj)u<8&36UBa zE#iSA-u9W1FXoI^Zp4&oX<(`ukhj+GxufZqi`N`PpfLY0w@*UKDq1BGSNE>yI2}un zs{VGVoc_@#3*5lIjWO&KoT`VE*i@z#W>`Lr04M`+fb)l&qnJe(oq>tu_)_VT=J9pw zirDm7Eab;)rD6a1cD4UTRT3FJ(~|^xJ;rf6x&(F7EKQ%_KUYkjz+9jEa*i7iI>VB> z0^hRf6^G%N?>gFgru?KQHS%fpQ@xeo#SdwljIKG8n%*6+5@#D1Mn;E=G!F+4NI%>f zzf^VuNYvjF)iL7*9HB)sO5RcApbg!{iX_eR4i&REqq_I4{NR{&xzt;=7YpUCq0%~h zMTOqm##qLU^YFNJ~1rofi)q5z4Hu*fyIj zh^6z{#L+8F(yBXp3vWt!`h?TEigWahW9t+9IQIp1K4=`4^1| zmKMgby`oUozo@T#2PY+U&J{TwYe&l9Lm8Ov5G@!&j8rN$dNIcNBR3}I=-pj4d1>7u zX^uwMe=4t3&xq_CzU9z=;o|-vpJ{ z9CQkTr2Hhj7R*tNm+_W)NabpY9w#Syhi1}=cNw^#WemHu!}6sAUfbztMoB?hhDh1Y zE|Abkq3t}Xkum@6Z2a&B{uJ`^%i75{O`js{E5^~K#Y8`0OI@3E(rZR8^g8tMzyco6 zlZynCk39?IlBtiGT4UOnww#VU2!t8m6r&#MitmNx+vhbb&=!@Fs4uD=q>Xa59PfkD z>R`&u#T*OZN7{6YB|F_M1lda9;J6YHiIF9+qcl?PdMedQxl&qE=tqfYVhjg+QU{gh zbcWyo!&7ZQf-TKdcpfHmbVJHaG``Yg#EFswW+DipKOk$!FL3Q zv7cNoWVKW{iF9NOZ$DJWa%0r&_R8A|GjcihMkop!97pKxQ|B~eVYBJ9K`E+4l}aGS zlhJUgKTz?=2M{L7iY21CCHhu96^h0z#i}%p}(FkF($CAkKb>Pm@;81PFx}dL` zn*sxLDX-a>_{lO(CmqxRC;CxMC%eSb;R^*Ay2g@-$$=DvxqkYfuxPl0R$){sS(QYG z=Q4d`-qa+WxED_pCnKh&#R%1Lp|mGT)f!H5$?Gj{ZtCsubDokKQrA_B#grnGN#P4x zjR?12p~vKSvUoXCILGQEIyZ+=`hsrbc}yV2vumx0qvqTLL&bKBI+oeh!|SG5>a9SCs1EYiNMS(NvPv5`tLNtvh=-ouxK-M@P|0(^0XI%;wu_M2` zh_%Cv8!W>wa9~SEoAf#m-={wlk}>H^yZ2quaF_Z!SK|j5RfgS_$yBQ}x;aW^-gTO# z<_ZIaQ91%doUr6uTX#jLZ(T^6!Dd)~|Ac2aO2GfyoqcZ#W)D>1doJ~291}%{Wi?l- zI6(`ffg3IzABuGqPofWfpwvMayffz=`>6lk-l+a|e>FIN9JXj-!@>OT6XtxvV(jLB zm~8ITCOht5CR_V?o6UZ&#WroS*yP?8d-Amw+xlUPZF{4|4g^+jvDjt%SnTz{tsk-2 z1#hs}9>C%F`_$K2>^bnvJ;P#Wz20Ira2fu-eqW0%0v-YHrh_bY&)b2|SgZwDi@)zb z&|=r!WV6n^%})Lc{yxuQ2Lbb6Zn2AYg*@Qa_d^G8&I=~n133G6lkNUp+&{@;M*tTe zVzIq}TR&p6$1a4OzyTkFeOoQI&(+A&VvCiVE!NOvv4@Ya*eOR^Z1kNLdnjkI+4y|~ zu4m*eb_de0dY8qn>9g6;TAQuzx7h(Do2@_9W@nyZGy8)!+aEeE!L@UX&CYwj%@%I9 z*$e9})-ev&*n;~@j>5eY;Zw*u{Yw_>-UDS&wAgL0gsu--%p9}Xp>MOv2*+t7P}8Lmmz&8#L>B@TI`BzY<8+?vzBXZcJ;SyHrKY<8J5jPA@4kt>BHAs zY=7XP_rdR{L;oV1J+aVcN8E0+Yu;+JMcd({%WQV`4(6eZk%`S$X)d$*apL>x0Yvc#llfMAn7uyVp?BW)i?bm9v?jKm} zv=Zn0+#o0;IPg7-S)VIg?0MILVWq0J5l79C`>M^W#Z|BkW-?nXTrZnD`k z7uf9d&)Mw2S6gh|s~`v1x~IkNMcHjbnQh)?v7_Mo=Weptr8lF#eh2Y%E%_Jq6S#Rk z;vLxa0>t5k(DiMk!ylU#!nX@7)(KpOwCj*|9Qf`)`u%4jR)EJ}W3fJzV;R?*_Ch`U z8uGdh^#p%!gFW}0hFAm+H;~U7 z0A>Di#NTGrfB5a<2E-oFa4{w&Jp>xc{B+^bO6 zfi2&#*lvJ*HR>~9qRdXe0qqUS=g2!yEa=#m8{B@g6z7uitjLB{qMrt3BCem zZ-w7Jih2(pK6L_o{vz5q;E^iI3V8ZICVTvN#3QcvJ!`V(%J30zz|M$^KC}xvA%DQ8 z4bTDk56(uO`Vk|zUJaTnCJ_t3IdkB5+&6J8zXWBs5oHM+51FHof8W1N)(zZ0f;I}c z{EHUb9q5A(Z#@UTUJu_N41VDD&spq9U^&{7Jlc{gcemIJAArx+AtQCIMLw?Cl{oq{WHFf_qocZ={<@+w`2twpLI-3h*o9?`8wBjJoqI z;{NhR#56GZS&N+jJ)_X^=$jFjA4C3rfwBWmy&bU*occ3#+ILv&%v%w|zeIW9@BQw= z{huQKe*&9+j{X zc68@iY;rsNXU}5$q0CSHq{a67o5lA14f;IbIuR52z3H3q z^L5a7Gko+Tiw)m|7`+8~Mt(a!gtiJXV4^R6X3%Dve}Lbpf2ZAGv%QZ)-Tc1I&i@s3 z*KD@@e9&Bkw)GsFoz;vo{3P1{OKdg(eQVzhpF!ti#~`Ng_p?`{9fQs-Kg3uCIv@A} z>Kt^A{unWjc)Mq_%_cq!`=Ilw8}WO!&7S=pw^SKaX2o}k;bFZzzhP{;m)`Zn8Un|FqfUjlysLr0-qLOXNLJY=(N57_KJTqj67<#2ArJT2Y~AzdZ>uQR=g{@xdPz5@AZ{yEC}PWba`*oShzc^!Utp?pq8eeDO$0LDG| zef^m>JN{#^{Vw!lFPX*G{vABOhR!*&*e(A+ELyYJ6R=@9?7Ihkp9`61{=#OPUxxnV zCd9^#7)xCbJK&${UlEs&qaAq~d0mBj-$FUBpjbfv_bS-&3E)4_{Ym8KT;v69+(YOG zFZ?v>$^Eb$IP1Tl`6qP2j%Mgz316Htgff7y9y}0Z?DK4P!6Wbm?79{CKl{(f({`KP z`U;yJg|uyZqWr%IUg$f#0d?+cxPBew^)Hk;V&QT&i_HW7lkoNIZD>Ex#@&YN^=Ko@ zpF+IA_6t#tokjFLD3@EFLfHc^z(4D*M1KJOJK&qU&>r6S6#9WVsL#mDP&<6n0Xu}9h`a-*Jp+GjLOG(` zwxQfk`zh-AqbOU%$))!qP7#+6BGz}>nX#qD>BfhQ4;p1-#5mFTt#P06OXDu%*Ty}@ zLG0}q)eISfM$y>A*v&iJ%(o^ihM8RHz|lg4It3i}&-jQy28&i=w)X6$0T#F%aDWPFUB z%RbF!vz^%pMdCiX7Y%8q2sEYB9RBUlT2Cp(;tuqvytG8<*X>?Ah9YHSnR zz{c4m8)F;UiEKT4H(SGc*>P+wdkFCX8|8WaGWYsm2G4oe<;q zuwSuDjV~ED8$UGOhNyqNagp(P<5R{3>;vox_HtuaV`t-2>>T!4_7e6gwinx-y`1gB zUdslIe&bMf2z%6+W!T2O?APq)#vR67<2A+_V~+U}bF1-D<8b3J;|SxO#(wP0><#So z>@CKA#>2*c7&AU$oMkLx2eTeym2tW86=N&A+Sp=z#CWB#ioK7W%t~yC<;;D}Lyb?e zC)p?1S?n|HJhrq1 zte92vB=Z>SIrC)meddSQY32vbQ_U^rt>yyjC+42!o#rphL#)?Y2V2LPz2>{kwdQ-w zx#sK5lDXd8+w3=AZSG~BU>A zwi#bH?li73eq!8W+-h8FyovpZJ;IJP4>un)-)8-g-OMgDKW|=Se!={ad7C+A*37lW zI;+d-wpLlMv2HhiX6DT|natX5b{U<zRZ5YPBB-qW7tvV z+s!MCqu6rR!MR3S(mZf*wN-e=FzO3Eo3X$Y1Rj<&DOc5X%#KQ`Uu;?&R~06 zTddXQJI&WyJ?3F%i`8kp!P?haXuaL)HV-kYR?RxV7_t7$9%aul!+40TG7mLxWH+%N zutnAy^9b{o=Ede0%?phWnOCx_@Wj21eVu)SeUp8QU2Yy`Ew>K0T8;C}&zOg?|CrrI z-fFhW)?U`<*fs1T_IdUlb}ie^ZZUsqzS7#=ny^-w^UY(-h2|@)cC*3U&Dxhe$bQfE zHIBD7Sg$a9t)q-P+0n*Et73haozAveUuE~RpRt3DMaChks~~Klp#VKlr=xtnsw*yzyUSyYWxsapSMX3&!7!Cyaj>|1zF2 z{%!on_>1wF@f0e_K+2W|<$ib}?UO_E^VSzcT-3 zK4Cs?{?)wE{JZ%obF=vk^H1hA=6B7%n5(Th*89y5n2(ufSsyk(VxD3C!93DB$a;<0 zXno53o_V!-y}8kR64T7zG`E>QHpk76nj6fu)?DijbC&fM>#f!!=Kj`f>nLlPwV!pJ zd9(S9`7iTY^V{Yb*4gHj<}TJttv{Ntvp#CwZ7#9aSZ}uGTRWS7Ht#V%VSURy-TaPu zgw<}n%X+W*b@M9oVKZmF!+MF;WX(3)tcT3^Sf4O=GAGPU=A`+kd8TDsJ6j#r|J%8< z7`B=;4G&hTrP|O)p57whTUDB{>$rixm4Wod%bVI-{j_=WKoXf6$BF$pB(73kPp|59 zRfcgGeze>OGF3qYkC zt5&Jf3AXy!5-&Z+drVIwEWj77MhZ0?@);#RoUSrT0jQepFiPnT<9He0M?seHejj~f z3FoT?9W4a8LAE5BK}cR&EEln>3THzM@XyisSqfCSXhJ0m(PVmk@~3%uWl2yQqL0-c zqShPXeI_@J1uAi@dX-e@ZX2lP{cpv20m`#2wGt6zP$v=57OAwSnY(^b^5W&Klf{0VCRHh;QNTN7wS1*t>;>nPZeHC!Dh-dwb`}ni zla-65zQ$GT)CVO^@hg4)VR*PWyu4BwZLSP#^s8q|GNC+bn|xCfUTNoTQVfL<(b=)o zSFX9`R(}4WSD(^tYXi3(0sg7?J_lt?dY4Q+;*O47ah@pTQ@y+bhG4;j2-N(Ak`X2TILWahL?o1V7po(SF>!!Hs|tRkiJji)koCz9 zYpMUlcKULR&nFUAp&w}})FgSLa2uf-{m{h>H(#uUf%Y+7u60rDuRa?wi<4N5^T*(my^RyoDs`Y=~fL;C=Ucm2!=k zB~q2Scc)1S1pyBXRf~6fderoGDB^KO*jR1AJ4GXFxrl=n^OeD2yfdA-ROQmDgT1XX zR%l^3E)X!Urv zr$Jd{pk**PI@~e{i3z$4Qo^B^fmsuPskx}ut7owUgItY~V5%lm z>eA}QxvI^*J6&452v^m3x2L8@7xNjMA-mR#wG90FNY5aEyj_oCHNI0ToKoXgmlm&_ zXQ23-d!|(U5v^T@Y)-NG18rOe#dQ_G+_I(AB^tG{%DUP>WgM$*{u86}WT+!>p00FB zzSMQY73XO~nh0}7@WdHNcjienDO_ZuzgWHs=d92v8o68}9#w-&-cqW%3N0rni_B_* zv}7tLgx7SX)X?mSoEE!EDG_Q{6=Txnb-x%gZ+%XpiCB0OKFzXdCOD!NUL=iZ3)O`e zHBDV$5K^_vz%ms}2hksVnrUGK6(mVC+MOUMRbClg zfo=)u`z4oJ2zF^RbWiz)d$9>Z{W4U9 za%BLb&%0}jI~f`wNm|^Fpink0fJRfbpi4&um-tnSXyknkjwEMgb0Lz0yA~XZpp@Vi zhDb7qRJSWcQ!3jIBFTaq45A5@%>=}pYoy+Tp=(C4*-juA@#eOfDMsfa z1L5{M1FOi6t5Y85>%F6)P&^X3v%wLk5?3oY#c!k)A1&UPFJUJ~wTv_U0$l_ZQ}6*T-8_hsD>qY))-2N^t^~Kcce{ytWH_#Mtw=Z15@|p-c2&1# zHdYj<8Z_YvRt?pmenUkB1>LrLn1#>;+{Ll66f`a}z(m^e7(QL?p@J^GD9s zyFgMirk0xJq`-(5-_rIa`e~faO>3t43_eB?;n&>6kK*qujFtL($7=k`fGzkcb^lPI z+KUOlQf(~XB9^X{g^dF_)J_gG9f)SaH+V3J!W3Alt-R_I<7sJBSvZD4i6qJ z?)y$}YFZq=)f&FFBz$XW_?Dwq7QZY^)gHb@2S3B!P-HbXNh$I?eshzM(xQD(q_b3;E~m#aN$igHTEc5ug&LVa@c68);nx=M6mvD%FLt6tnCqXKY!61@q_zZu4 zF~{FZ6<=T#9}-XLP@N0f=v@^tV&Y<{ADyyLNF=f33t#9;-rP^YR4z3jvw~-ZuA=)n z^tum5$7Xr{k4qnKmuB4@d)-^2mr~+rpx8G)*xNT=8Xo8!94}M{oYw~0;^kmskUMC3 z0SD{%<1?dEbr0o%4|SH~Gl0YS@bWMX zKL`SGuDqkCtDf838tTRzD1zs#SawH{3ahX4KcRq*$np<728b zrLCbs6!++8wKBP~GQ6>6>K(BdG!@)0dOMMm>LV&HYqheWI6#AqaM;P^9QI%6cmi^{ z`kFYkUeuHKVRKelvoM8jF#Ie%pGT;kg+G#cEb0@z!&jmP3$L?^y?xXSa^?s$Sf8~ZOb zCRY9t9>IgzJgP_%6TjndRWMEnmkWQK<=u9FWmqXuk-|G8N>YkUO%nrEIT}Pdxmu)& zzy zMM0FY-X)qb-U=saqP#2fB{aNoOy}CCS8$Z%V{x!zSFJF0+ntYP>fAD|I^2xZD&y6r zYEhgmu%;=)AiKX(p1>!7L)Yf1y5H?MxLmwxva&RpS)^{_LK$bz?@{*Sh%tRXg1J`A zi*dd5HULc&U|Ag#jQLfe#QXvpQQ?E8u$%wGY=av?LY}$}QWmDBK$4Ik$-{_;Rst6A z*b(A%@8-xtb?HJh$!%+Z4yWX}JpcWdHGVdG{JZG<=ok#Y|MX3Xdsjdf7Dos1JnXqG zK|*hTf1EUrNDd^59wpSMLopJOv=^ z+)wl(T%5ERki$TM-~`>*|TNf~uIPV?2+w%JM>A z25S0(Y;omqpQ)KNY!@lqP|SjsH~Ht$uYqrj&YSkim*tEIw>{~78$7VjzO(7I$SCabS`afs#WO! zkrp}jtSE~>LWQhVVha#~;X3F4W9~cP<0_8-MF}MI0O<*k#Qc&_b&}jdz$aO<2oOMYaefl@GTot+gQLHPi9%10cNjxh+G#^}LKS$z`B;03SR zx(!?tH9;SBPpihId=uUuF6T(_SMG0MN(FR9iW09b$R3D!l}cwJeOXfqy!F~~*(tdA zWdp}c@Lao|Mf&r_L?$WDuo*aLoK`JomK0>;?$Z{e%um1{%Qc+lU*Ipb1)=rPU?!Qy z%dXqz7W3F!FQYb<#*&bK3Jl)?*emj|eN&l4uUrv}?HLp{RzCI=^JSaJ6iQN6htrO! zOh0qRpfSLj!~iJXaeU)NEbyfza>+D=P3MX|a13;$Xpz5h9;KqL*sgc5V*u7Sg)(%? zVC6(hYp$SEg~WW=i@*gUQD=|=#>Pz1K)5W&XSxB?+#Ew!ukDxSCOo#>k|@lx@&;=2 zC8%A!HmXHF5^0#zjo>lW<}70lOkN>tX|a-~VEHzPzz7k`6^Y#FxRWB`*Lmdm$w zVA~Z6!MNpt#NMSa_dM_~Wbagh8hMy5$S3Qao0XjoE;=ozK@j6&N%xMBbGo1qvHEA;gi1Jt2sj+Ds3GSHYp;KxH01LB3SUQ>y+uKx zrwG>HH!|g+oI2BA2cD(Vi-W~oVq#gIVxtR8$@Szt8?_F%1-|b=3=m6ElJ9JB&FFN0R|Qxa zT!*RzGn>q+=NhO$O)s2XBW((|(-djxp=L!(7443WV`NQ&5_a_r9#CG8=H@Qgth1Vf zC<$=-8JIv6$2L1SjXQi`qmc7UAG=(t6}B1EZlkQeUgREKP5^RNn)0*tHOZaYS3(ip@}#IV8o9;=xtH;zRZobM>>pI{a?1w=>h9 zZh_&-#5)}ahONVIvRFqt=~KuOM&V|-}^LlW{HLppPia*6h=s%x1X zfH&IeLwo650AM={KvFt08Cq@!<+Wrw+bIEWC(Y;}NX51l@ohHITa5dQGhuBqHwS(L zwmHjfG6^`onT7gV;tgYJE#{mAC&Vexu#sUIj98N>q(j%rOis+rgR+1?KCYT3p3`6AKT|vY`X&@c67pd*sr@ zyEMzcLBY>BxKF$AZuw34*IvWHl)=Bo1_0SpDxfBP727MPy~Rkmv-j1-2kt zmW9NkZ3HGRh%Vq$F;-lSCkuHW2_Ht)V;O%vk0sDlC=xB%YPS<^bjkH*Lrr?1ou&3h zGg85CN+)<=T26xGCnZWS!5$3G3|nve2qvd~mzv(59H=&( zz0zK)y>b>DX?^HruCoFZM^G2f_tJ~Ty>;%RGmp7n=2`4Ll7$1VY`d+=Uzr9fUcZ1} zNX(sB7Q!YxO*{gU=EW3@zZX9~MKSqpQZ+5Y6PEo?vaww>+U{cCCx?M*u_!a(?&#YiLYo6XhI4p*Re3 z=z<0uMSUg*mqNKrcb99xuc$69papGu!*5NZX)o2e&zmTvd*M9JNavN{7&vDfO?}*; zkE%MRxa`WDelI(`s3yjuTm)g@;$(a5!eXH)K=F@2&Ev(rW}m`Fi&K)}qE^%_UQ0=)zlBSc{m759%nT2F zF|2;TcMA-gYVFEE%!42N)&yKS=Jp2&;)vHYaoX`{Zd;EoBBx*!gDSwReTz&HBxyfe z3Fuq87F)@;B-g>~945Wa`oYx;(V$uFW+R553~R_B!WxdRX_3HA#vWF^JrE8U_ex4B zS(_E}vTnr?4`vD_*iei6m&=L}(Gf&ESSPbopRDEN!P*lA*Z?v+>`94ZmGfZlm}v=i zkF_IA3bWHX*c1%$W_IcZLS`$5r5}PvxHR{(!obSldPNrZjBe7(;$S*^WIgP_YbL~z8HaSSAN z_r+qp_P~kU?M7HEuU%I{ZDfMf5WAVppsdA?W-WR~d40DgeTW04w)vHTxS-T85403TLSi`68M$p9J z=6H_IV2!?5mI)F(?0ip(EXa~I`W6H;vFOaat$bz2mB6YGedBs7j^!iwZ8KP|@6Jf# zUXCkx1(YGn8HvXzea1<=rpF217Ts~9mhSR+$pQk9L+JOQro@`lvX2J(5=97hEfiqk z36ZX7C*a8ssn0MVj7_|tJw43O#df#`GJbuw-qKwj!1PiWkhA^#}i6ANXY0Q z=978=szNQV@1eQ87Vh0Tcb{Ql#FraDLici|rt2J=FqM^7#rM&ITjI@0av(4B|q z(m>`ODBu9Y3AsjyWww>Wu$PB?0uR8cF|beB0HIL>gWtq-82Q5Ijpr+*0dlflA)CZh zOV$hTPbl2{BfF(?37y{-(0y ztc{a_p+ZYKk?ZKo^pqeD0`{jPh|Y)oOzK1;v^8_Y>4?Z)fB}?p1!jV&iiI(1he>fB zCsTmAz?}VVat4jJK3v`ljFB}V+>~4vkz&VgUHY|^ zLBWYjYX}rh#R&@mOOPPY8I}QqfWin~%Dp9JikWe+#=h33xmC03l7orOPOzeI0$;r- z$gT+RvQC%)Dacy{7>lUnwb+GqUN^7Zs|-q5FcQJxO({K@*anNoYI?p@`e-nLGFIMs zKM$^{|hgW?4=zXxy3vofMAudSF)&udbHaw!AMVu7M^aRS%x!{&qL zYDe%DUwNx7sQlmxO;nBz1J5E$Si3|lcPd^g(hoWljv^ofK(G-UPJqCXOtA>Z6IvSL z#dI(3(I#-#F}4tw&tS|2a2uD}dd(+6;P1pjzKCn9ku|{9R95B8WQWr`>g^7Ee?p9p zR}2mhRbi}$bywqk}sd_fy~!=1!xkB?o9f@zoHNdbq&3@t4j5z0P3?Sw~;ExMRY zl#2`d9Va<{EO!F-_^)(cF@k!)mdXU0Nk9&iotN}Ml(ST zQkQW892bQX0~C9**QXa6c4Fc&ILels7lqSCQ$wsHr3CEAd8oc3+IIYWsH~xpn&w-_U-@{SxB6vAOR8f)jFR2wyb8j*WlQc_yqxX|Yse?BII zEcQi|uodUc`~n{8Etn@Nw^FKjMXB++GvI4+W)EY5#r15N(gFL8m=KlA$-(YS ze=j6MP1cR8PE~bxx6YhC-CY)5WcmlXCrqf;>4GK|b3nnR20%NzluYHqN{G9H{K}v_ z@~;K-sceA0&RDyIFt9Myq({AK+wS|3nOy}}(rNu8ifOgDZcnCbaTjycq9hFx!vU8| zIIv9WbQaTU0llN#yo@P<&?2%4sNG!xBOdTttJ;0{yEjXCT*gdsm{(D?ZTE%ER88o4 z5L24lb~I0Ozl)QMXeK+UO_x-Wxo>nPky$r7bG^>UMpeQy*ov`tP9o8iQc9~N@IGh@ zna)s?fGEn7gVnxbfc8v=!Kd}gytpn zu$P|YRbm6l>a#2u1cJ!?#6MloQ5Ef2qhvc&=TR7JJL|Nbs)ECm*SRvx7y77$YtPYT zbWPlsNtux|K0@*o6rG9WA*IRP{R_+-07#L(q$qV40MpN6K z41hzqfDroZs9%4{HpYS{5V6}1>;kXK`xccox^~ZBJB#UcKrD@&txZT?m-VYB7-hxOS^{&YC{je%;bFey1Tz0lMW|k9 zP7jb)f*2Fe3(t{toCdmgVHK2DWG7HdlTJS6)aq1^oF>4u7rO9LUE|oS)~@5F)|T9_ zlTsB4p`2*2w^2d#cE`~@qb)$ytvp*vt8EAeJ7YIe327yWVQ{_ochd8Xd0S#@Uu(dW z{WRg1^PDE#u*|GV7E~HiC$czB= zRbM-{0yy=Zc0$k{=GKV8ey7^Kz^_ysbO<=WQD-m212Rvq-F?rm)T;d_m_5y5EHQG; zt~>l^0C5naF2JzwvJRLe%PBr)@Jcy7<$UWnJ~gtYVcIb^(VG-cBW=pwfzjKtA4l03 zyA?yy5cXl&?cUaZhc{jg<(?i$y^-(Da_9PR2(ON%ZU-1J4u;G_aDANd%dl&~F&_5E zY|w`FHJ(YvQ;(+9bI(oxP%CAIs@X^cXX`vDp89jiuo|@4TW`^R99feA>}dc#h)E5q z3S?D-y1W?HpbAg64PA$FLOxQlJuCo%ZFSZXPb1Mh!jBWp4$W^T|1i4s@_ zgpZDy#ffsa95jG4QfBs$#32!A@;Kx-dg2IG%%HT^dCK|LleLD`wwNP&o8oD-ZP~L! zZ_IuiMQh&k#eh62$sJS0pccPbVo(i^#qdE;b0c))s>Bm4p^u$-I`W}Y+p;-AZ_Iui zMQaf-imyyHAaW#(LP}Bt5F=m|xBLv*t|~emN4ym0i?%AJifQXks(`Z{8RO&EjH8t1 z>B3eV@0CVkGOz|OG*mqXG4So2hLNEi7;?(@vRq~Km=yPGE!c#5t%N_gU%Nv+TxDFL z5$+Pckp-^e&fRdf)DA4A?#Txhw)e|jB|Wyl)d4fvxK_XO+Q4*S070p5U{WPKH^gFa zi5esphntoA{rE=r>APA8(BTrPwQNrLj79Bpw=n5JKm6e%48`f!(yqQEqa&BvqqZ+5}eZ`w7v8F0HKU z*?togcJ4dXHEO~uL}^8q1(t?crUc0O5zrAU=RGDK5p2G7yCtkbbb^BJ2sm#%R2-ad zY4Cs>kWj>-$zV30%B{dR8Ij>r)>mIh^6*m?j!?ZiQhmse$nC$tkBEVAwxcQ_)8;(B z4biHt$xNH1J|x;}PV_?>iC%kG1V#|NA(l!aPdB~u002^%KFm;Y6IV6T>&W0W|N6b6z`VZ_OHXBzU=QIjGo!Sf%sQ9( z<@ibuX~*L99;`1M&3v;;k|QKAI!2QiASkKC#rU?ag+oC}&nXRcQe~la=aj~haNx=* zD71J3q?I#R%4(gi(HRmIP#CJ$1D}G*Ye7o^g`I&(LB+N3qkzI{n2}FW%CJ|Mljfg* zk0?fRgbV>9G(zd>>9S<4&R8SfQ(AVn))$6gI9>Gwq8vdr&+sOzYU&f7X1*y`Dh$Olm^>i|$>b#?<0JYC(2Y+WZr)f1c=E{%YL^*K1RazO^i`l6*uQZ*9cVZQZxmnUjhJp_KW66L7cJfgXvX2uop3Hw*sb*i&t zolF(K{h^m!qX0TXmwfx|QJAQgjA!zz+wTLaepfVY5EP`v$pd1K zciAETyyCCmE5@I8FSRy)Fdh4TOgfHA9t!a?j+X$}PP~5o<&_!jL$LfYh5I5^6q|kv;3KK1eK42xvy2?s)Xup-iR$o6+ z{Y-t)~b*Ne$sFEnUs8&kZ#Xz_Z138C$NxcHjiDyF?x_s|;Z)p{FACjw@nQrbW- zt~YZk1)Ip)AX5{_b2UJoF2_ZHI>b#L4YM0poppMaCF-@U394IU?e-Tg`-AA7cVRb{ zNuIdf6?>O;*E^YD49I%~R8t0w71FuGRi;IA;?pv&9Xesz4{WkRD<}v(V#+;BivVSL zenJmTkk3706NsAe=p6q}vnhy@b}>vnC*}{9)1(ZHikd7%A!fTatML*-yAth<`iUKE zVdYN?Ae?9MkyDPS+KY5VQIdAET`cHhgvmrl{+k zvVZ4z=iX`53+OwG`a9=NqU)``bLe=jCB2~E@qIzZJKudky{vOLj>&QVBI>4_e@T0< zOfTjY(4m)t>7_?=xL#Xcd&hIiZ|f+crBK)3kv=-T2o+GFm+)J$Y9%M}2sxGsRbPf< z5>lZ+x+kf7NctN^8uPT3)<-NcBpXcaN(%3+cxk4EdqfK1rYGP&k0jiq5k;?*v7VlX#Kdv;hBf9!gOs{(A@ejz;~AwwJLHaT%VmfB zK0#tK(V#l>t#6s1YB(RW4~NyVA!KzXh)-Md%nlhS8r1twi4za4h#9m&2#fh*|| z%>$SS3d?ll=h~Mv4?ig}n5Z!}r0VkMW9fMS8;d zSS6#dCEFBl1Z1(y4o!snX$mb7Bz>0xGtzpMDah)b(vR6M4a1yJq%&pbdsB%jxMf@7 za@b0>SzWEN!~kT&T!7b{G>+U

    sGsAvryr>n-(J6ERelUcCZH3!hG*f#jacDj!nn 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

    f6M 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

    }t;C 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�uEEuYYn>K)zw2{} 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

    UCeg88zG+{gLh^4R`DQTP{WocZ5H} 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 t?i#KmflHS6t_{5`BW@g_a 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_video480d.lib b/Thirdparty/opencv2/lib/opencv_video480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..87a1ee777e32e79995812b1a4ef5c67e78e38404 GIT binary patch literal 389042 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 tgl|@R>xmPvTH^nlFgO4 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�r(xa&#ws?>_q3)pXMLV;PE{Og@N-Rtq<$g5_X@x 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 +#include +#include + +#include +#include +#include + +namespace spdlog { + +namespace details { +static const size_t default_async_q_size = 8192; +} + +// async logger factory - creates async loggers backed with thread pool. +// if a global thread pool doesn't already exist, create it with default queue +// size of 8192 items and single thread. +template +struct async_factory_impl +{ + template + static std::shared_ptr create(std::string logger_name, SinkArgs &&...args) + { + auto ®istry_inst = details::registry::instance(); + + // create global thread pool if not already exists.. + + auto &mutex = registry_inst.tp_mutex(); + std::lock_guard tp_lock(mutex); + auto tp = registry_inst.get_tp(); + if (tp == nullptr) + { + tp = std::make_shared(details::default_async_q_size, 1U); + registry_inst.set_tp(tp); + } + + auto sink = std::make_shared(std::forward(args)...); + auto new_logger = std::make_shared(std::move(logger_name), std::move(sink), std::move(tp), OverflowPolicy); + registry_inst.initialize_logger(new_logger); + return new_logger; + } +}; + +using async_factory = async_factory_impl; +using async_factory_nonblock = async_factory_impl; + +template +inline std::shared_ptr create_async(std::string logger_name, SinkArgs &&...sink_args) +{ + return async_factory::create(std::move(logger_name), std::forward(sink_args)...); +} + +template +inline std::shared_ptr create_async_nb(std::string logger_name, SinkArgs &&...sink_args) +{ + return async_factory_nonblock::create(std::move(logger_name), std::forward(sink_args)...); +} + +// set global thread pool. +inline void init_thread_pool( + size_t q_size, size_t thread_count, std::function on_thread_start, std::function on_thread_stop) +{ + auto tp = std::make_shared(q_size, thread_count, on_thread_start, on_thread_stop); + details::registry::instance().set_tp(std::move(tp)); +} + +inline void init_thread_pool(size_t q_size, size_t thread_count, std::function on_thread_start) +{ + init_thread_pool(q_size, thread_count, on_thread_start, [] {}); +} + +inline void init_thread_pool(size_t q_size, size_t thread_count) +{ + init_thread_pool( + q_size, thread_count, [] {}, [] {}); +} + +// get the global thread pool. +inline std::shared_ptr thread_pool() +{ + return details::registry::instance().get_tp(); +} +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/async_logger-inl.h b/Thirdparty/spdlog/include/spdlog/async_logger-inl.h new file mode 100644 index 0000000..4de8382 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/async_logger-inl.h @@ -0,0 +1,90 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include + +#include +#include + +SPDLOG_INLINE spdlog::async_logger::async_logger( + std::string logger_name, sinks_init_list sinks_list, std::weak_ptr tp, async_overflow_policy overflow_policy) + : async_logger(std::move(logger_name), sinks_list.begin(), sinks_list.end(), std::move(tp), overflow_policy) +{} + +SPDLOG_INLINE spdlog::async_logger::async_logger( + std::string logger_name, sink_ptr single_sink, std::weak_ptr tp, async_overflow_policy overflow_policy) + : async_logger(std::move(logger_name), {std::move(single_sink)}, std::move(tp), overflow_policy) +{} + +// send the log message to the thread pool +SPDLOG_INLINE void spdlog::async_logger::sink_it_(const details::log_msg &msg){ + SPDLOG_TRY{if (auto pool_ptr = thread_pool_.lock()){pool_ptr->post_log(shared_from_this(), msg, overflow_policy_); +} +else +{ + throw_spdlog_ex("async log: thread pool doesn't exist anymore"); +} +} +SPDLOG_LOGGER_CATCH(msg.source) +} + +// send flush request to the thread pool +SPDLOG_INLINE void spdlog::async_logger::flush_(){ + SPDLOG_TRY{if (auto pool_ptr = thread_pool_.lock()){pool_ptr->post_flush(shared_from_this(), overflow_policy_); +} +else +{ + throw_spdlog_ex("async flush: thread pool doesn't exist anymore"); +} +} +SPDLOG_LOGGER_CATCH(source_loc()) +} + +// +// backend functions - called from the thread pool to do the actual job +// +SPDLOG_INLINE void spdlog::async_logger::backend_sink_it_(const details::log_msg &msg) +{ + for (auto &sink : sinks_) + { + if (sink->should_log(msg.level)) + { + SPDLOG_TRY + { + sink->log(msg); + } + SPDLOG_LOGGER_CATCH(msg.source) + } + } + + if (should_flush_(msg)) + { + backend_flush_(); + } +} + +SPDLOG_INLINE void spdlog::async_logger::backend_flush_() +{ + for (auto &sink : sinks_) + { + SPDLOG_TRY + { + sink->flush(); + } + SPDLOG_LOGGER_CATCH(source_loc()) + } +} + +SPDLOG_INLINE std::shared_ptr spdlog::async_logger::clone(std::string new_name) +{ + auto cloned = std::make_shared(*this); + cloned->name_ = std::move(new_name); + return cloned; +} diff --git a/Thirdparty/spdlog/include/spdlog/async_logger.h b/Thirdparty/spdlog/include/spdlog/async_logger.h new file mode 100644 index 0000000..91a93fc --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/async_logger.h @@ -0,0 +1,68 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// Fast asynchronous logger. +// Uses pre allocated queue. +// Creates a single back thread to pop messages from the queue and log them. +// +// Upon each log write the logger: +// 1. Checks if its log level is enough to log the message +// 2. Push a new copy of the message to a queue (or block the caller until +// space is available in the queue) +// Upon destruction, logs all remaining messages in the queue before +// destructing.. + +#include + +namespace spdlog { + +// Async overflow policy - block by default. +enum class async_overflow_policy +{ + block, // Block until message can be enqueued + overrun_oldest // Discard oldest message in the queue if full when trying to + // add new item. +}; + +namespace details { +class thread_pool; +} + +class SPDLOG_API async_logger final : public std::enable_shared_from_this, public logger +{ + friend class details::thread_pool; + +public: + template + async_logger(std::string logger_name, It begin, It end, std::weak_ptr tp, + async_overflow_policy overflow_policy = async_overflow_policy::block) + : logger(std::move(logger_name), begin, end) + , thread_pool_(std::move(tp)) + , overflow_policy_(overflow_policy) + {} + + async_logger(std::string logger_name, sinks_init_list sinks_list, std::weak_ptr tp, + async_overflow_policy overflow_policy = async_overflow_policy::block); + + async_logger(std::string logger_name, sink_ptr single_sink, std::weak_ptr tp, + async_overflow_policy overflow_policy = async_overflow_policy::block); + + std::shared_ptr clone(std::string new_name) override; + +protected: + void sink_it_(const details::log_msg &msg) override; + void flush_() override; + void backend_sink_it_(const details::log_msg &incoming_log_msg); + void backend_flush_(); + +private: + std::weak_ptr thread_pool_; + async_overflow_policy overflow_policy_; +}; +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "async_logger-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/cfg/argv.h b/Thirdparty/spdlog/include/spdlog/cfg/argv.h new file mode 100644 index 0000000..36d9f1c --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/cfg/argv.h @@ -0,0 +1,44 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once +#include +#include + +// +// Init log levels using each argv entry that starts with "SPDLOG_LEVEL=" +// +// set all loggers to debug level: +// example.exe "SPDLOG_LEVEL=debug" + +// set logger1 to trace level +// example.exe "SPDLOG_LEVEL=logger1=trace" + +// turn off all logging except for logger1 and logger2: +// example.exe "SPDLOG_LEVEL=off,logger1=debug,logger2=info" + +namespace spdlog { +namespace cfg { + +// search for SPDLOG_LEVEL= in the args and use it to init the levels +inline void load_argv_levels(int argc, const char **argv) +{ + const std::string spdlog_level_prefix = "SPDLOG_LEVEL="; + for (int i = 1; i < argc; i++) + { + std::string arg = argv[i]; + if (arg.find(spdlog_level_prefix) == 0) + { + auto levels_string = arg.substr(spdlog_level_prefix.size()); + helpers::load_levels(levels_string); + } + } +} + +inline void load_argv_levels(int argc, char **argv) +{ + load_argv_levels(argc, const_cast(argv)); +} + +} // namespace cfg +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/cfg/env.h b/Thirdparty/spdlog/include/spdlog/cfg/env.h new file mode 100644 index 0000000..1f39ebb --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/cfg/env.h @@ -0,0 +1,38 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once +#include +#include +#include + +// +// Init levels and patterns from env variables SPDLOG_LEVEL +// Inspired from Rust's "env_logger" crate (https://crates.io/crates/env_logger). +// Note - fallback to "info" level on unrecognized levels +// +// Examples: +// +// set global level to debug: +// export SPDLOG_LEVEL=debug +// +// turn off all logging except for logger1: +// export SPDLOG_LEVEL="*=off,logger1=debug" +// + +// turn off all logging except for logger1 and logger2: +// export SPDLOG_LEVEL="off,logger1=debug,logger2=info" + +namespace spdlog { +namespace cfg { +inline void load_env_levels() +{ + auto env_val = details::os::getenv("SPDLOG_LEVEL"); + if (!env_val.empty()) + { + helpers::load_levels(env_val); + } +} + +} // namespace cfg +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/cfg/helpers-inl.h b/Thirdparty/spdlog/include/spdlog/cfg/helpers-inl.h new file mode 100644 index 0000000..675a13a --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/cfg/helpers-inl.h @@ -0,0 +1,120 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include +#include + +#include +#include +#include +#include + +namespace spdlog { +namespace cfg { +namespace helpers { + +// inplace convert to lowercase +inline std::string &to_lower_(std::string &str) +{ + std::transform( + str.begin(), str.end(), str.begin(), [](char ch) { return static_cast((ch >= 'A' && ch <= 'Z') ? ch + ('a' - 'A') : ch); }); + return str; +} + +// inplace trim spaces +inline std::string &trim_(std::string &str) +{ + const char *spaces = " \n\r\t"; + str.erase(str.find_last_not_of(spaces) + 1); + str.erase(0, str.find_first_not_of(spaces)); + return str; +} + +// return (name,value) trimmed pair from given "name=value" string. +// return empty string on missing parts +// "key=val" => ("key", "val") +// " key = val " => ("key", "val") +// "key=" => ("key", "") +// "val" => ("", "val") + +inline std::pair extract_kv_(char sep, const std::string &str) +{ + auto n = str.find(sep); + std::string k, v; + if (n == std::string::npos) + { + v = str; + } + else + { + k = str.substr(0, n); + v = str.substr(n + 1); + } + return std::make_pair(trim_(k), trim_(v)); +} + +// return vector of key/value pairs from sequence of "K1=V1,K2=V2,.." +// "a=AAA,b=BBB,c=CCC,.." => {("a","AAA"),("b","BBB"),("c", "CCC"),...} +inline std::unordered_map extract_key_vals_(const std::string &str) +{ + std::string token; + std::istringstream token_stream(str); + std::unordered_map rv{}; + while (std::getline(token_stream, token, ',')) + { + if (token.empty()) + { + continue; + } + auto kv = extract_kv_('=', token); + rv[kv.first] = kv.second; + } + return rv; +} + +SPDLOG_INLINE void load_levels(const std::string &input) +{ + if (input.empty() || input.size() > 512) + { + return; + } + + auto key_vals = extract_key_vals_(input); + std::unordered_map levels; + level::level_enum global_level = level::info; + bool global_level_found = false; + + for (auto &name_level : key_vals) + { + auto &logger_name = name_level.first; + auto level_name = to_lower_(name_level.second); + auto level = level::from_str(level_name); + // ignore unrecognized level names + if (level == level::off && level_name != "off") + { + continue; + } + if (logger_name.empty()) // no logger name indicate global level + { + global_level_found = true; + global_level = level; + } + else + { + levels[logger_name] = level; + } + } + + details::registry::instance().set_levels(std::move(levels), global_level_found ? &global_level : nullptr); +} + +} // namespace helpers +} // namespace cfg +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/cfg/helpers.h b/Thirdparty/spdlog/include/spdlog/cfg/helpers.h new file mode 100644 index 0000000..ab7584e --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/cfg/helpers.h @@ -0,0 +1,29 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +namespace spdlog { +namespace cfg { +namespace helpers { +// +// Init levels from given string +// +// Examples: +// +// set global level to debug: "debug" +// turn off all logging except for logger1: "off,logger1=debug" +// turn off all logging except for logger1 and logger2: "off,logger1=debug,logger2=info" +// +SPDLOG_API void load_levels(const std::string &txt); +} // namespace helpers + +} // namespace cfg +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "helpers-inl.h" +#endif // SPDLOG_HEADER_ONLY diff --git a/Thirdparty/spdlog/include/spdlog/common-inl.h b/Thirdparty/spdlog/include/spdlog/common-inl.h new file mode 100644 index 0000000..728f983 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/common-inl.h @@ -0,0 +1,82 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include + +namespace spdlog { +namespace level { + +#if __cplusplus >= 201703L +constexpr +#endif + static string_view_t level_string_views[] SPDLOG_LEVEL_NAMES; + +static const char *short_level_names[] SPDLOG_SHORT_LEVEL_NAMES; + +SPDLOG_INLINE const string_view_t &to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT +{ + return level_string_views[l]; +} + +SPDLOG_INLINE const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT +{ + return short_level_names[l]; +} + +SPDLOG_INLINE spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCEPT +{ + auto it = std::find(std::begin(level_string_views), std::end(level_string_views), name); + if (it != std::end(level_string_views)) + return static_cast(std::distance(std::begin(level_string_views), it)); + + // check also for "warn" and "err" before giving up.. + if (name == "warn") + { + return level::warn; + } + if (name == "err") + { + return level::err; + } + return level::off; +} +} // namespace level + +SPDLOG_INLINE spdlog_ex::spdlog_ex(std::string msg) + : msg_(std::move(msg)) +{} + +SPDLOG_INLINE spdlog_ex::spdlog_ex(const std::string &msg, int last_errno) +{ +#ifdef SPDLOG_USE_STD_FORMAT + msg_ = std::system_error(std::error_code(last_errno, std::generic_category()), msg).what(); +#else + memory_buf_t outbuf; + fmt::format_system_error(outbuf, last_errno, msg.c_str()); + msg_ = fmt::to_string(outbuf); +#endif +} + +SPDLOG_INLINE const char *spdlog_ex::what() const SPDLOG_NOEXCEPT +{ + return msg_.c_str(); +} + +SPDLOG_INLINE void throw_spdlog_ex(const std::string &msg, int last_errno) +{ + SPDLOG_THROW(spdlog_ex(msg, last_errno)); +} + +SPDLOG_INLINE void throw_spdlog_ex(std::string msg) +{ + SPDLOG_THROW(spdlog_ex(std::move(msg))); +} + +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/common.h b/Thirdparty/spdlog/include/spdlog/common.h new file mode 100644 index 0000000..0a262eb --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/common.h @@ -0,0 +1,420 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SPDLOG_USE_STD_FORMAT +# include +# if __cpp_lib_format >= 202207L +# include +# else +# include +# endif +#endif + +#ifdef SPDLOG_COMPILED_LIB +# undef SPDLOG_HEADER_ONLY +# if defined(SPDLOG_SHARED_LIB) +# if defined(_WIN32) +# ifdef spdlog_EXPORTS +# define SPDLOG_API __declspec(dllexport) +# else // !spdlog_EXPORTS +# define SPDLOG_API __declspec(dllimport) +# endif +# else // !defined(_WIN32) +# define SPDLOG_API __attribute__((visibility("default"))) +# endif +# else // !defined(SPDLOG_SHARED_LIB) +# define SPDLOG_API +# endif +# define SPDLOG_INLINE +#else // !defined(SPDLOG_COMPILED_LIB) +# define SPDLOG_API +# define SPDLOG_HEADER_ONLY +# define SPDLOG_INLINE inline +#endif // #ifdef SPDLOG_COMPILED_LIB + +#include + +#if !defined(SPDLOG_USE_STD_FORMAT) && FMT_VERSION >= 80000 // backward compatibility with fmt versions older than 8 +# define SPDLOG_FMT_RUNTIME(format_string) fmt::runtime(format_string) +# define SPDLOG_FMT_STRING(format_string) FMT_STRING(format_string) +# if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) +# include +# endif +#else +# define SPDLOG_FMT_RUNTIME(format_string) format_string +# define SPDLOG_FMT_STRING(format_string) format_string +#endif + +// visual studio up to 2013 does not support noexcept nor constexpr +#if defined(_MSC_VER) && (_MSC_VER < 1900) +# define SPDLOG_NOEXCEPT _NOEXCEPT +# define SPDLOG_CONSTEXPR +# define SPDLOG_CONSTEXPR_FUNC inline +#else +# define SPDLOG_NOEXCEPT noexcept +# define SPDLOG_CONSTEXPR constexpr +# if __cplusplus >= 201402L +# define SPDLOG_CONSTEXPR_FUNC constexpr +# else +# define SPDLOG_CONSTEXPR_FUNC inline +# endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define SPDLOG_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +# define SPDLOG_DEPRECATED __declspec(deprecated) +#else +# define SPDLOG_DEPRECATED +#endif + +// disable thread local on msvc 2013 +#ifndef SPDLOG_NO_TLS +# if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__cplusplus_winrt) +# define SPDLOG_NO_TLS 1 +# endif +#endif + +#ifndef SPDLOG_FUNCTION +# define SPDLOG_FUNCTION static_cast(__FUNCTION__) +#endif + +#ifdef SPDLOG_NO_EXCEPTIONS +# define SPDLOG_TRY +# define SPDLOG_THROW(ex) \ + do \ + { \ + printf("spdlog fatal error: %s\n", ex.what()); \ + std::abort(); \ + } while (0) +# define SPDLOG_CATCH_STD +#else +# define SPDLOG_TRY try +# define SPDLOG_THROW(ex) throw(ex) +# define SPDLOG_CATCH_STD \ + catch (const std::exception &) \ + {} +#endif + +namespace spdlog { + +class formatter; + +namespace sinks { +class sink; +} + +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +using filename_t = std::wstring; +// allow macro expansion to occur in SPDLOG_FILENAME_T +# define SPDLOG_FILENAME_T_INNER(s) L##s +# define SPDLOG_FILENAME_T(s) SPDLOG_FILENAME_T_INNER(s) +#else +using filename_t = std::string; +# define SPDLOG_FILENAME_T(s) s +#endif + +using log_clock = std::chrono::system_clock; +using sink_ptr = std::shared_ptr; +using sinks_init_list = std::initializer_list; +using err_handler = std::function; +#ifdef SPDLOG_USE_STD_FORMAT +namespace fmt_lib = std; + +using string_view_t = std::string_view; +using memory_buf_t = std::string; + +template +# if __cpp_lib_format >= 202207L +using format_string_t = std::format_string; +# else +using format_string_t = std::string_view; +# endif + +template +struct is_convertible_to_basic_format_string : std::integral_constant>::value> +{}; + +# if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) +using wstring_view_t = std::wstring_view; +using wmemory_buf_t = std::wstring; + +template +# if __cpp_lib_format >= 202207L +using wformat_string_t = std::wformat_string; +# else +using wformat_string_t = std::wstring_view; +# endif +# endif +# define SPDLOG_BUF_TO_STRING(x) x +#else // use fmt lib instead of std::format +namespace fmt_lib = fmt; + +using string_view_t = fmt::basic_string_view; +using memory_buf_t = fmt::basic_memory_buffer; + +template +using format_string_t = fmt::format_string; + +template +using remove_cvref_t = typename std::remove_cv::type>::type; + +template +# if FMT_VERSION >= 90101 +using fmt_runtime_string = fmt::runtime_format_string; +# else +using fmt_runtime_string = fmt::basic_runtime; +# endif + +// clang doesn't like SFINAE disabled constructor in std::is_convertible<> so have to repeat the condition from basic_format_string here, +// in addition, fmt::basic_runtime is only convertible to basic_format_string but not basic_string_view +template +struct is_convertible_to_basic_format_string + : std::integral_constant>::value || std::is_same, fmt_runtime_string>::value> +{}; + +# if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) +using wstring_view_t = fmt::basic_string_view; +using wmemory_buf_t = fmt::basic_memory_buffer; + +template +using wformat_string_t = fmt::wformat_string; +# endif +# define SPDLOG_BUF_TO_STRING(x) fmt::to_string(x) +#endif + +#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT +# ifndef _WIN32 +# error SPDLOG_WCHAR_TO_UTF8_SUPPORT only supported on windows +# endif // _WIN32 +#endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT + +template +struct is_convertible_to_any_format_string : std::integral_constant::value || + is_convertible_to_basic_format_string::value> +{}; + +#if defined(SPDLOG_NO_ATOMIC_LEVELS) +using level_t = details::null_atomic_int; +#else +using level_t = std::atomic; +#endif + +#define SPDLOG_LEVEL_TRACE 0 +#define SPDLOG_LEVEL_DEBUG 1 +#define SPDLOG_LEVEL_INFO 2 +#define SPDLOG_LEVEL_WARN 3 +#define SPDLOG_LEVEL_ERROR 4 +#define SPDLOG_LEVEL_CRITICAL 5 +#define SPDLOG_LEVEL_OFF 6 + +#if !defined(SPDLOG_ACTIVE_LEVEL) +# define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO +#endif + +// Log level enum +namespace level { +enum level_enum : int +{ + trace = SPDLOG_LEVEL_TRACE, + debug = SPDLOG_LEVEL_DEBUG, + info = SPDLOG_LEVEL_INFO, + warn = SPDLOG_LEVEL_WARN, + err = SPDLOG_LEVEL_ERROR, + critical = SPDLOG_LEVEL_CRITICAL, + off = SPDLOG_LEVEL_OFF, + n_levels +}; + +#define SPDLOG_LEVEL_NAME_TRACE spdlog::string_view_t("trace", 5) +#define SPDLOG_LEVEL_NAME_DEBUG spdlog::string_view_t("debug", 5) +#define SPDLOG_LEVEL_NAME_INFO spdlog::string_view_t("info", 4) +#define SPDLOG_LEVEL_NAME_WARNING spdlog::string_view_t("warning", 7) +#define SPDLOG_LEVEL_NAME_ERROR spdlog::string_view_t("error", 5) +#define SPDLOG_LEVEL_NAME_CRITICAL spdlog::string_view_t("critical", 8) +#define SPDLOG_LEVEL_NAME_OFF spdlog::string_view_t("off", 3) + +#if !defined(SPDLOG_LEVEL_NAMES) +# define SPDLOG_LEVEL_NAMES \ + { \ + SPDLOG_LEVEL_NAME_TRACE, SPDLOG_LEVEL_NAME_DEBUG, SPDLOG_LEVEL_NAME_INFO, SPDLOG_LEVEL_NAME_WARNING, SPDLOG_LEVEL_NAME_ERROR, \ + SPDLOG_LEVEL_NAME_CRITICAL, SPDLOG_LEVEL_NAME_OFF \ + } +#endif + +#if !defined(SPDLOG_SHORT_LEVEL_NAMES) + +# define SPDLOG_SHORT_LEVEL_NAMES \ + { \ + "T", "D", "I", "W", "E", "C", "O" \ + } +#endif + +SPDLOG_API const string_view_t &to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT; +SPDLOG_API const char *to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT; +SPDLOG_API spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCEPT; + +} // namespace level + +// +// Color mode used by sinks with color support. +// +enum class color_mode +{ + always, + automatic, + never +}; + +// +// Pattern time - specific time getting to use for pattern_formatter. +// local time by default +// +enum class pattern_time_type +{ + local, // log localtime + utc // log utc +}; + +// +// Log exception +// +class SPDLOG_API spdlog_ex : public std::exception +{ +public: + explicit spdlog_ex(std::string msg); + spdlog_ex(const std::string &msg, int last_errno); + const char *what() const SPDLOG_NOEXCEPT override; + +private: + std::string msg_; +}; + +[[noreturn]] SPDLOG_API void throw_spdlog_ex(const std::string &msg, int last_errno); +[[noreturn]] SPDLOG_API void throw_spdlog_ex(std::string msg); + +struct source_loc +{ + SPDLOG_CONSTEXPR source_loc() = default; + SPDLOG_CONSTEXPR source_loc(const char *filename_in, int line_in, const char *funcname_in) + : filename{filename_in} + , line{line_in} + , funcname{funcname_in} + {} + + SPDLOG_CONSTEXPR bool empty() const SPDLOG_NOEXCEPT + { + return line == 0; + } + const char *filename{nullptr}; + int line{0}; + const char *funcname{nullptr}; +}; + +struct file_event_handlers +{ + file_event_handlers() + : before_open(nullptr) + , after_open(nullptr) + , before_close(nullptr) + , after_close(nullptr) + {} + + std::function before_open; + std::function after_open; + std::function before_close; + std::function after_close; +}; + +namespace details { + +// to_string_view + +SPDLOG_CONSTEXPR_FUNC spdlog::string_view_t to_string_view(const memory_buf_t &buf) SPDLOG_NOEXCEPT +{ + return spdlog::string_view_t{buf.data(), buf.size()}; +} + +SPDLOG_CONSTEXPR_FUNC spdlog::string_view_t to_string_view(spdlog::string_view_t str) SPDLOG_NOEXCEPT +{ + return str; +} + +#if defined(SPDLOG_WCHAR_FILENAMES) || defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) +SPDLOG_CONSTEXPR_FUNC spdlog::wstring_view_t to_string_view(const wmemory_buf_t &buf) SPDLOG_NOEXCEPT +{ + return spdlog::wstring_view_t{buf.data(), buf.size()}; +} + +SPDLOG_CONSTEXPR_FUNC spdlog::wstring_view_t to_string_view(spdlog::wstring_view_t str) SPDLOG_NOEXCEPT +{ + return str; +} +#endif + +#ifndef SPDLOG_USE_STD_FORMAT +template +inline fmt::basic_string_view to_string_view(fmt::basic_format_string fmt) +{ + return fmt; +} +#elif __cpp_lib_format >= 202207L +template +SPDLOG_CONSTEXPR_FUNC std::basic_string_view to_string_view(std::basic_format_string fmt) SPDLOG_NOEXCEPT +{ + return fmt.get(); +} +#endif + +// make_unique support for pre c++14 + +#if __cplusplus >= 201402L // C++14 and beyond +using std::enable_if_t; +using std::make_unique; +#else +template +using enable_if_t = typename std::enable_if::type; + +template +std::unique_ptr make_unique(Args &&...args) +{ + static_assert(!std::is_array::value, "arrays not supported"); + return std::unique_ptr(new T(std::forward(args)...)); +} +#endif + +// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324) +template::value, int> = 0> +constexpr T conditional_static_cast(U value) +{ + return static_cast(value); +} + +template::value, int> = 0> +constexpr T conditional_static_cast(U value) +{ + return value; +} + +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "common-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/backtracer-inl.h b/Thirdparty/spdlog/include/spdlog/details/backtracer-inl.h new file mode 100644 index 0000000..40eba40 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/backtracer-inl.h @@ -0,0 +1,75 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif +namespace spdlog { +namespace details { +SPDLOG_INLINE backtracer::backtracer(const backtracer &other) +{ + std::lock_guard lock(other.mutex_); + enabled_ = other.enabled(); + messages_ = other.messages_; +} + +SPDLOG_INLINE backtracer::backtracer(backtracer &&other) SPDLOG_NOEXCEPT +{ + std::lock_guard lock(other.mutex_); + enabled_ = other.enabled(); + messages_ = std::move(other.messages_); +} + +SPDLOG_INLINE backtracer &backtracer::operator=(backtracer other) +{ + std::lock_guard lock(mutex_); + enabled_ = other.enabled(); + messages_ = std::move(other.messages_); + return *this; +} + +SPDLOG_INLINE void backtracer::enable(size_t size) +{ + std::lock_guard lock{mutex_}; + enabled_.store(true, std::memory_order_relaxed); + messages_ = circular_q{size}; +} + +SPDLOG_INLINE void backtracer::disable() +{ + std::lock_guard lock{mutex_}; + enabled_.store(false, std::memory_order_relaxed); +} + +SPDLOG_INLINE bool backtracer::enabled() const +{ + return enabled_.load(std::memory_order_relaxed); +} + +SPDLOG_INLINE void backtracer::push_back(const log_msg &msg) +{ + std::lock_guard lock{mutex_}; + messages_.push_back(log_msg_buffer{msg}); +} + +SPDLOG_INLINE bool backtracer::empty() const +{ + std::lock_guard lock{mutex_}; + return messages_.empty(); +} + +// pop all items in the q and apply the given fun on each of them. +SPDLOG_INLINE void backtracer::foreach_pop(std::function fun) +{ + std::lock_guard lock{mutex_}; + while (!messages_.empty()) + { + auto &front_msg = messages_.front(); + fun(front_msg); + messages_.pop_front(); + } +} +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/backtracer.h b/Thirdparty/spdlog/include/spdlog/details/backtracer.h new file mode 100644 index 0000000..13785d8 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/backtracer.h @@ -0,0 +1,46 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +#include +#include +#include + +// Store log messages in circular buffer. +// Useful for storing debug data in case of error/warning happens. + +namespace spdlog { +namespace details { +class SPDLOG_API backtracer +{ + mutable std::mutex mutex_; + std::atomic enabled_{false}; + circular_q messages_; + +public: + backtracer() = default; + backtracer(const backtracer &other); + + backtracer(backtracer &&other) SPDLOG_NOEXCEPT; + backtracer &operator=(backtracer other); + + void enable(size_t size); + void disable(); + bool enabled() const; + void push_back(const log_msg &msg); + bool empty() const; + + // pop all items in the q and apply the given fun on each of them. + void foreach_pop(std::function fun); +}; + +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "backtracer-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/circular_q.h b/Thirdparty/spdlog/include/spdlog/details/circular_q.h new file mode 100644 index 0000000..e4fd5fd --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/circular_q.h @@ -0,0 +1,146 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +// circular q view of std::vector. +#pragma once + +#include +#include + +namespace spdlog { +namespace details { +template +class circular_q +{ + size_t max_items_ = 0; + typename std::vector::size_type head_ = 0; + typename std::vector::size_type tail_ = 0; + size_t overrun_counter_ = 0; + std::vector v_; + +public: + using value_type = T; + + // empty ctor - create a disabled queue with no elements allocated at all + circular_q() = default; + + explicit circular_q(size_t max_items) + : max_items_(max_items + 1) // one item is reserved as marker for full q + , v_(max_items_) + {} + + circular_q(const circular_q &) = default; + circular_q &operator=(const circular_q &) = default; + + // move cannot be default, + // since we need to reset head_, tail_, etc to zero in the moved object + circular_q(circular_q &&other) SPDLOG_NOEXCEPT + { + copy_moveable(std::move(other)); + } + + circular_q &operator=(circular_q &&other) SPDLOG_NOEXCEPT + { + copy_moveable(std::move(other)); + return *this; + } + + // push back, overrun (oldest) item if no room left + void push_back(T &&item) + { + if (max_items_ > 0) + { + v_[tail_] = std::move(item); + tail_ = (tail_ + 1) % max_items_; + + if (tail_ == head_) // overrun last item if full + { + head_ = (head_ + 1) % max_items_; + ++overrun_counter_; + } + } + } + + // Return reference to the front item. + // If there are no elements in the container, the behavior is undefined. + const T &front() const + { + return v_[head_]; + } + + T &front() + { + return v_[head_]; + } + + // Return number of elements actually stored + size_t size() const + { + if (tail_ >= head_) + { + return tail_ - head_; + } + else + { + return max_items_ - (head_ - tail_); + } + } + + // Return const reference to item by index. + // If index is out of range 0…size()-1, the behavior is undefined. + const T &at(size_t i) const + { + assert(i < size()); + return v_[(head_ + i) % max_items_]; + } + + // Pop item from front. + // If there are no elements in the container, the behavior is undefined. + void pop_front() + { + head_ = (head_ + 1) % max_items_; + } + + bool empty() const + { + return tail_ == head_; + } + + bool full() const + { + // head is ahead of the tail by 1 + if (max_items_ > 0) + { + return ((tail_ + 1) % max_items_) == head_; + } + return false; + } + + size_t overrun_counter() const + { + return overrun_counter_; + } + + void reset_overrun_counter() + { + overrun_counter_ = 0; + } + +private: + // copy from other&& and reset it to disabled state + void copy_moveable(circular_q &&other) SPDLOG_NOEXCEPT + { + max_items_ = other.max_items_; + head_ = other.head_; + tail_ = other.tail_; + overrun_counter_ = other.overrun_counter_; + v_ = std::move(other.v_); + + // put &&other in disabled, but valid state + other.max_items_ = 0; + other.head_ = other.tail_ = 0; + other.overrun_counter_ = 0; + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/console_globals.h b/Thirdparty/spdlog/include/spdlog/details/console_globals.h new file mode 100644 index 0000000..665201d --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/console_globals.h @@ -0,0 +1,32 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +namespace spdlog { +namespace details { + +struct console_mutex +{ + using mutex_t = std::mutex; + static mutex_t &mutex() + { + static mutex_t s_mutex; + return s_mutex; + } +}; + +struct console_nullmutex +{ + using mutex_t = null_mutex; + static mutex_t &mutex() + { + static mutex_t s_mutex; + return s_mutex; + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/file_helper-inl.h b/Thirdparty/spdlog/include/spdlog/details/file_helper-inl.h new file mode 100644 index 0000000..74c89a8 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/file_helper-inl.h @@ -0,0 +1,180 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace spdlog { +namespace details { + +SPDLOG_INLINE file_helper::file_helper(const file_event_handlers &event_handlers) + : event_handlers_(event_handlers) +{} + +SPDLOG_INLINE file_helper::~file_helper() +{ + close(); +} + +SPDLOG_INLINE void file_helper::open(const filename_t &fname, bool truncate) +{ + close(); + filename_ = fname; + + auto *mode = SPDLOG_FILENAME_T("ab"); + auto *trunc_mode = SPDLOG_FILENAME_T("wb"); + + if (event_handlers_.before_open) + { + event_handlers_.before_open(filename_); + } + for (int tries = 0; tries < open_tries_; ++tries) + { + // create containing folder if not exists already. + os::create_dir(os::dir_name(fname)); + if (truncate) + { + // Truncate by opening-and-closing a tmp file in "wb" mode, always + // opening the actual log-we-write-to in "ab" mode, since that + // interacts more politely with eternal processes that might + // rotate/truncate the file underneath us. + std::FILE *tmp; + if (os::fopen_s(&tmp, fname, trunc_mode)) + { + continue; + } + std::fclose(tmp); + } + if (!os::fopen_s(&fd_, fname, mode)) + { + if (event_handlers_.after_open) + { + event_handlers_.after_open(filename_, fd_); + } + return; + } + + details::os::sleep_for_millis(open_interval_); + } + + throw_spdlog_ex("Failed opening file " + os::filename_to_str(filename_) + " for writing", errno); +} + +SPDLOG_INLINE void file_helper::reopen(bool truncate) +{ + if (filename_.empty()) + { + throw_spdlog_ex("Failed re opening file - was not opened before"); + } + this->open(filename_, truncate); +} + +SPDLOG_INLINE void file_helper::flush() +{ + if (std::fflush(fd_) != 0) + { + throw_spdlog_ex("Failed flush to file " + os::filename_to_str(filename_), errno); + } +} + +SPDLOG_INLINE void file_helper::sync() +{ + if (!os::fsync(fd_)) + { + throw_spdlog_ex("Failed to fsync file " + os::filename_to_str(filename_), errno); + } +} + +SPDLOG_INLINE void file_helper::close() +{ + if (fd_ != nullptr) + { + if (event_handlers_.before_close) + { + event_handlers_.before_close(filename_, fd_); + } + + std::fclose(fd_); + fd_ = nullptr; + + if (event_handlers_.after_close) + { + event_handlers_.after_close(filename_); + } + } +} + +SPDLOG_INLINE void file_helper::write(const memory_buf_t &buf) +{ + size_t msg_size = buf.size(); + auto data = buf.data(); + if (std::fwrite(data, 1, msg_size, fd_) != msg_size) + { + throw_spdlog_ex("Failed writing to file " + os::filename_to_str(filename_), errno); + } +} + +SPDLOG_INLINE size_t file_helper::size() const +{ + if (fd_ == nullptr) + { + throw_spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(filename_)); + } + return os::filesize(fd_); +} + +SPDLOG_INLINE const filename_t &file_helper::filename() const +{ + return filename_; +} + +// +// return file path and its extension: +// +// "mylog.txt" => ("mylog", ".txt") +// "mylog" => ("mylog", "") +// "mylog." => ("mylog.", "") +// "/dir1/dir2/mylog.txt" => ("/dir1/dir2/mylog", ".txt") +// +// the starting dot in filenames is ignored (hidden files): +// +// ".mylog" => (".mylog". "") +// "my_folder/.mylog" => ("my_folder/.mylog", "") +// "my_folder/.mylog.txt" => ("my_folder/.mylog", ".txt") +SPDLOG_INLINE std::tuple file_helper::split_by_extension(const filename_t &fname) +{ + auto ext_index = fname.rfind('.'); + + // no valid extension found - return whole path and empty string as + // extension + if (ext_index == filename_t::npos || ext_index == 0 || ext_index == fname.size() - 1) + { + return std::make_tuple(fname, filename_t()); + } + + // treat cases like "/etc/rc.d/somelogfile or "/abc/.hiddenfile" + auto folder_index = fname.find_last_of(details::os::folder_seps_filename); + if (folder_index != filename_t::npos && folder_index >= ext_index - 1) + { + return std::make_tuple(fname, filename_t()); + } + + // finally - return a valid base and extension tuple + return std::make_tuple(fname.substr(0, ext_index), fname.substr(ext_index)); +} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/file_helper.h b/Thirdparty/spdlog/include/spdlog/details/file_helper.h new file mode 100644 index 0000000..f42a5eb --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/file_helper.h @@ -0,0 +1,62 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +namespace spdlog { +namespace details { + +// Helper class for file sinks. +// When failing to open a file, retry several times(5) with a delay interval(10 ms). +// Throw spdlog_ex exception on errors. + +class SPDLOG_API file_helper +{ +public: + file_helper() = default; + explicit file_helper(const file_event_handlers &event_handlers); + + file_helper(const file_helper &) = delete; + file_helper &operator=(const file_helper &) = delete; + ~file_helper(); + + void open(const filename_t &fname, bool truncate = false); + void reopen(bool truncate); + void flush(); + void sync(); + void close(); + void write(const memory_buf_t &buf); + size_t size() const; + const filename_t &filename() const; + + // + // return file path and its extension: + // + // "mylog.txt" => ("mylog", ".txt") + // "mylog" => ("mylog", "") + // "mylog." => ("mylog.", "") + // "/dir1/dir2/mylog.txt" => ("/dir1/dir2/mylog", ".txt") + // + // the starting dot in filenames is ignored (hidden files): + // + // ".mylog" => (".mylog". "") + // "my_folder/.mylog" => ("my_folder/.mylog", "") + // "my_folder/.mylog.txt" => ("my_folder/.mylog", ".txt") + static std::tuple split_by_extension(const filename_t &fname); + +private: + const int open_tries_ = 5; + const unsigned int open_interval_ = 10; + std::FILE *fd_{nullptr}; + filename_t filename_; + file_event_handlers event_handlers_; +}; +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "file_helper-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/fmt_helper.h b/Thirdparty/spdlog/include/spdlog/details/fmt_helper.h new file mode 100644 index 0000000..d986718 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/fmt_helper.h @@ -0,0 +1,164 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +#pragma once + +#include +#include +#include +#include +#include + +#ifdef SPDLOG_USE_STD_FORMAT +# include +# include +#endif + +// Some fmt helpers to efficiently format and pad ints and strings +namespace spdlog { +namespace details { +namespace fmt_helper { + +inline void append_string_view(spdlog::string_view_t view, memory_buf_t &dest) +{ + auto *buf_ptr = view.data(); + dest.append(buf_ptr, buf_ptr + view.size()); +} + +#ifdef SPDLOG_USE_STD_FORMAT +template +inline void append_int(T n, memory_buf_t &dest) +{ + // Buffer should be large enough to hold all digits (digits10 + 1) and a sign + SPDLOG_CONSTEXPR const auto BUF_SIZE = std::numeric_limits::digits10 + 2; + char buf[BUF_SIZE]; + + auto [ptr, ec] = std::to_chars(buf, buf + BUF_SIZE, n, 10); + if (ec == std::errc()) + { + dest.append(buf, ptr); + } + else + { + throw_spdlog_ex("Failed to format int", static_cast(ec)); + } +} +#else +template +inline void append_int(T n, memory_buf_t &dest) +{ + fmt::format_int i(n); + dest.append(i.data(), i.data() + i.size()); +} +#endif + +template +SPDLOG_CONSTEXPR_FUNC unsigned int count_digits_fallback(T n) +{ + // taken from fmt: https://github.com/fmtlib/fmt/blob/8.0.1/include/fmt/format.h#L899-L912 + unsigned int count = 1; + for (;;) + { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) + return count; + if (n < 100) + return count + 1; + if (n < 1000) + return count + 2; + if (n < 10000) + return count + 3; + n /= 10000u; + count += 4; + } +} + +template +inline unsigned int count_digits(T n) +{ + using count_type = typename std::conditional<(sizeof(T) > sizeof(uint32_t)), uint64_t, uint32_t>::type; +#ifdef SPDLOG_USE_STD_FORMAT + return count_digits_fallback(static_cast(n)); +#else + return static_cast(fmt:: +// fmt 7.0.0 renamed the internal namespace to detail. +// See: https://github.com/fmtlib/fmt/issues/1538 +# if FMT_VERSION < 70000 + internal +# else + detail +# endif + ::count_digits(static_cast(n))); +#endif +} + +inline void pad2(int n, memory_buf_t &dest) +{ + if (n >= 0 && n < 100) // 0-99 + { + dest.push_back(static_cast('0' + n / 10)); + dest.push_back(static_cast('0' + n % 10)); + } + else // unlikely, but just in case, let fmt deal with it + { + fmt_lib::format_to(std::back_inserter(dest), SPDLOG_FMT_STRING("{:02}"), n); + } +} + +template +inline void pad_uint(T n, unsigned int width, memory_buf_t &dest) +{ + static_assert(std::is_unsigned::value, "pad_uint must get unsigned T"); + for (auto digits = count_digits(n); digits < width; digits++) + { + dest.push_back('0'); + } + append_int(n, dest); +} + +template +inline void pad3(T n, memory_buf_t &dest) +{ + static_assert(std::is_unsigned::value, "pad3 must get unsigned T"); + if (n < 1000) + { + dest.push_back(static_cast(n / 100 + '0')); + n = n % 100; + dest.push_back(static_cast((n / 10) + '0')); + dest.push_back(static_cast((n % 10) + '0')); + } + else + { + append_int(n, dest); + } +} + +template +inline void pad6(T n, memory_buf_t &dest) +{ + pad_uint(n, 6, dest); +} + +template +inline void pad9(T n, memory_buf_t &dest) +{ + pad_uint(n, 9, dest); +} + +// return fraction of a second of the given time_point. +// e.g. +// fraction(tp) -> will return the millis part of the second +template +inline ToDuration time_fraction(log_clock::time_point tp) +{ + using std::chrono::duration_cast; + using std::chrono::seconds; + auto duration = tp.time_since_epoch(); + auto secs = duration_cast(duration); + return duration_cast(duration) - duration_cast(secs); +} + +} // namespace fmt_helper +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/log_msg-inl.h b/Thirdparty/spdlog/include/spdlog/details/log_msg-inl.h new file mode 100644 index 0000000..c6e8a7e --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/log_msg-inl.h @@ -0,0 +1,37 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include + +namespace spdlog { +namespace details { + +SPDLOG_INLINE log_msg::log_msg(spdlog::log_clock::time_point log_time, spdlog::source_loc loc, string_view_t a_logger_name, + spdlog::level::level_enum lvl, spdlog::string_view_t msg) + : logger_name(a_logger_name) + , level(lvl) + , time(log_time) +#ifndef SPDLOG_NO_THREAD_ID + , thread_id(os::thread_id()) +#endif + , source(loc) + , payload(msg) +{} + +SPDLOG_INLINE log_msg::log_msg( + spdlog::source_loc loc, string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg) + : log_msg(os::now(), loc, a_logger_name, lvl, msg) +{} + +SPDLOG_INLINE log_msg::log_msg(string_view_t a_logger_name, spdlog::level::level_enum lvl, spdlog::string_view_t msg) + : log_msg(os::now(), source_loc{}, a_logger_name, lvl, msg) +{} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/log_msg.h b/Thirdparty/spdlog/include/spdlog/details/log_msg.h new file mode 100644 index 0000000..fed51ab --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/log_msg.h @@ -0,0 +1,37 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include + +namespace spdlog { +namespace details { +struct SPDLOG_API log_msg +{ + log_msg() = default; + log_msg(log_clock::time_point log_time, source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg); + log_msg(source_loc loc, string_view_t logger_name, level::level_enum lvl, string_view_t msg); + log_msg(string_view_t logger_name, level::level_enum lvl, string_view_t msg); + log_msg(const log_msg &other) = default; + log_msg &operator=(const log_msg &other) = default; + + string_view_t logger_name; + level::level_enum level{level::off}; + log_clock::time_point time; + size_t thread_id{0}; + + // wrapping the formatted text with color (updated by pattern_formatter). + mutable size_t color_range_start{0}; + mutable size_t color_range_end{0}; + + source_loc source; + string_view_t payload; +}; +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "log_msg-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer-inl.h b/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer-inl.h new file mode 100644 index 0000000..84d83dc --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer-inl.h @@ -0,0 +1,58 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +namespace spdlog { +namespace details { + +SPDLOG_INLINE log_msg_buffer::log_msg_buffer(const log_msg &orig_msg) + : log_msg{orig_msg} +{ + buffer.append(logger_name.begin(), logger_name.end()); + buffer.append(payload.begin(), payload.end()); + update_string_views(); +} + +SPDLOG_INLINE log_msg_buffer::log_msg_buffer(const log_msg_buffer &other) + : log_msg{other} +{ + buffer.append(logger_name.begin(), logger_name.end()); + buffer.append(payload.begin(), payload.end()); + update_string_views(); +} + +SPDLOG_INLINE log_msg_buffer::log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT : log_msg{other}, buffer{std::move(other.buffer)} +{ + update_string_views(); +} + +SPDLOG_INLINE log_msg_buffer &log_msg_buffer::operator=(const log_msg_buffer &other) +{ + log_msg::operator=(other); + buffer.clear(); + buffer.append(other.buffer.data(), other.buffer.data() + other.buffer.size()); + update_string_views(); + return *this; +} + +SPDLOG_INLINE log_msg_buffer &log_msg_buffer::operator=(log_msg_buffer &&other) SPDLOG_NOEXCEPT +{ + log_msg::operator=(other); + buffer = std::move(other.buffer); + update_string_views(); + return *this; +} + +SPDLOG_INLINE void log_msg_buffer::update_string_views() +{ + logger_name = string_view_t{buffer.data(), logger_name.size()}; + payload = string_view_t{buffer.data() + logger_name.size(), payload.size()}; +} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer.h b/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer.h new file mode 100644 index 0000000..8105506 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/log_msg_buffer.h @@ -0,0 +1,33 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include + +namespace spdlog { +namespace details { + +// Extend log_msg with internal buffer to store its payload. +// This is needed since log_msg holds string_views that points to stack data. + +class SPDLOG_API log_msg_buffer : public log_msg +{ + memory_buf_t buffer; + void update_string_views(); + +public: + log_msg_buffer() = default; + explicit log_msg_buffer(const log_msg &orig_msg); + log_msg_buffer(const log_msg_buffer &other); + log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT; + log_msg_buffer &operator=(const log_msg_buffer &other); + log_msg_buffer &operator=(log_msg_buffer &&other) SPDLOG_NOEXCEPT; +}; + +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "log_msg_buffer-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/mpmc_blocking_q.h b/Thirdparty/spdlog/include/spdlog/details/mpmc_blocking_q.h new file mode 100644 index 0000000..101ea8c --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/mpmc_blocking_q.h @@ -0,0 +1,154 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// multi producer-multi consumer blocking queue. +// enqueue(..) - will block until room found to put the new message. +// enqueue_nowait(..) - will return immediately with false if no room left in +// the queue. +// dequeue_for(..) - will block until the queue is not empty or timeout have +// passed. + +#include + +#include +#include + +namespace spdlog { +namespace details { + +template +class mpmc_blocking_queue +{ +public: + using item_type = T; + explicit mpmc_blocking_queue(size_t max_items) + : q_(max_items) + {} + +#ifndef __MINGW32__ + // try to enqueue and block if no room left + void enqueue(T &&item) + { + { + std::unique_lock lock(queue_mutex_); + pop_cv_.wait(lock, [this] { return !this->q_.full(); }); + q_.push_back(std::move(item)); + } + push_cv_.notify_one(); + } + + // enqueue immediately. overrun oldest message in the queue if no room left. + void enqueue_nowait(T &&item) + { + { + std::unique_lock lock(queue_mutex_); + q_.push_back(std::move(item)); + } + push_cv_.notify_one(); + } + + // dequeue with a timeout. + // Return true, if succeeded dequeue item, false otherwise + bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration) + { + { + std::unique_lock lock(queue_mutex_); + if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); })) + { + return false; + } + popped_item = std::move(q_.front()); + q_.pop_front(); + } + pop_cv_.notify_one(); + return true; + } + + // blocking dequeue without a timeout. + void dequeue(T &popped_item) + { + { + std::unique_lock lock(queue_mutex_); + push_cv_.wait(lock, [this] { return !this->q_.empty(); }); + popped_item = std::move(q_.front()); + q_.pop_front(); + } + pop_cv_.notify_one(); + } + +#else + // apparently mingw deadlocks if the mutex is released before cv.notify_one(), + // so release the mutex at the very end each function. + + // try to enqueue and block if no room left + void enqueue(T &&item) + { + std::unique_lock lock(queue_mutex_); + pop_cv_.wait(lock, [this] { return !this->q_.full(); }); + q_.push_back(std::move(item)); + push_cv_.notify_one(); + } + + // enqueue immediately. overrun oldest message in the queue if no room left. + void enqueue_nowait(T &&item) + { + std::unique_lock lock(queue_mutex_); + q_.push_back(std::move(item)); + push_cv_.notify_one(); + } + + // dequeue with a timeout. + // Return true, if succeeded dequeue item, false otherwise + bool dequeue_for(T &popped_item, std::chrono::milliseconds wait_duration) + { + std::unique_lock lock(queue_mutex_); + if (!push_cv_.wait_for(lock, wait_duration, [this] { return !this->q_.empty(); })) + { + return false; + } + popped_item = std::move(q_.front()); + q_.pop_front(); + pop_cv_.notify_one(); + return true; + } + + // blocking dequeue without a timeout. + void dequeue(T &popped_item) + { + std::unique_lock lock(queue_mutex_); + push_cv_.wait(lock, [this] { return !this->q_.empty(); }); + popped_item = std::move(q_.front()); + q_.pop_front(); + pop_cv_.notify_one(); + } + +#endif + + size_t overrun_counter() + { + std::unique_lock lock(queue_mutex_); + return q_.overrun_counter(); + } + + size_t size() + { + std::unique_lock lock(queue_mutex_); + return q_.size(); + } + + void reset_overrun_counter() + { + std::unique_lock lock(queue_mutex_); + q_.reset_overrun_counter(); + } + +private: + std::mutex queue_mutex_; + std::condition_variable push_cv_; + std::condition_variable pop_cv_; + spdlog::details::circular_q q_; +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/null_mutex.h b/Thirdparty/spdlog/include/spdlog/details/null_mutex.h new file mode 100644 index 0000000..6550a7b --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/null_mutex.h @@ -0,0 +1,45 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include +// null, no cost dummy "mutex" and dummy "atomic" int + +namespace spdlog { +namespace details { +struct null_mutex +{ + void lock() const {} + void unlock() const {} +}; + +struct null_atomic_int +{ + int value; + null_atomic_int() = default; + + explicit null_atomic_int(int new_value) + : value(new_value) + {} + + int load(std::memory_order = std::memory_order_relaxed) const + { + return value; + } + + void store(int new_value, std::memory_order = std::memory_order_relaxed) + { + value = new_value; + } + + int exchange(int new_value, std::memory_order = std::memory_order_relaxed) + { + std::swap(new_value, value); + return new_value; // return value before the call + } +}; + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/os-inl.h b/Thirdparty/spdlog/include/spdlog/details/os-inl.h new file mode 100644 index 0000000..ea8864e --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/os-inl.h @@ -0,0 +1,635 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + +# include // for _get_osfhandle, _isatty, _fileno +# include // for _get_pid +# include +# include // for FlushFileBuffers + +# ifdef __MINGW32__ +# include +# endif + +# if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES) +# include +# include +# endif + +# include // for _mkdir/_wmkdir + +#else // unix + +# include +# include + +# ifdef __linux__ +# include //Use gettid() syscall under linux to get thread id + +# elif defined(_AIX) +# include // for pthread_getthrds_np + +# elif defined(__DragonFly__) || defined(__FreeBSD__) +# include // for pthread_getthreadid_np + +# elif defined(__NetBSD__) +# include // for _lwp_self + +# elif defined(__sun) +# include // for thr_self +# endif + +#endif // unix + +#if defined __APPLE__ +# include +#endif + +#ifndef __has_feature // Clang - feature checking macros. +# define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +namespace spdlog { +namespace details { +namespace os { + +SPDLOG_INLINE spdlog::log_clock::time_point now() SPDLOG_NOEXCEPT +{ + +#if defined __linux__ && defined SPDLOG_CLOCK_COARSE + timespec ts; + ::clock_gettime(CLOCK_REALTIME_COARSE, &ts); + return std::chrono::time_point( + std::chrono::duration_cast(std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec))); + +#else + return log_clock::now(); +#endif +} +SPDLOG_INLINE std::tm localtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT +{ + +#ifdef _WIN32 + std::tm tm; + ::localtime_s(&tm, &time_tt); +#else + std::tm tm; + ::localtime_r(&time_tt, &tm); +#endif + return tm; +} + +SPDLOG_INLINE std::tm localtime() SPDLOG_NOEXCEPT +{ + std::time_t now_t = ::time(nullptr); + return localtime(now_t); +} + +SPDLOG_INLINE std::tm gmtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT +{ + +#ifdef _WIN32 + std::tm tm; + ::gmtime_s(&tm, &time_tt); +#else + std::tm tm; + ::gmtime_r(&time_tt, &tm); +#endif + return tm; +} + +SPDLOG_INLINE std::tm gmtime() SPDLOG_NOEXCEPT +{ + std::time_t now_t = ::time(nullptr); + return gmtime(now_t); +} + +// fopen_s on non windows for writing +SPDLOG_INLINE bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode) +{ +#ifdef _WIN32 +# ifdef SPDLOG_WCHAR_FILENAMES + *fp = ::_wfsopen((filename.c_str()), mode.c_str(), _SH_DENYNO); +# else + *fp = ::_fsopen((filename.c_str()), mode.c_str(), _SH_DENYNO); +# endif +# if defined(SPDLOG_PREVENT_CHILD_FD) + if (*fp != nullptr) + { + auto file_handle = reinterpret_cast(_get_osfhandle(::_fileno(*fp))); + if (!::SetHandleInformation(file_handle, HANDLE_FLAG_INHERIT, 0)) + { + ::fclose(*fp); + *fp = nullptr; + } + } +# endif +#else // unix +# if defined(SPDLOG_PREVENT_CHILD_FD) + const int mode_flag = mode == SPDLOG_FILENAME_T("ab") ? O_APPEND : O_TRUNC; + const int fd = ::open((filename.c_str()), O_CREAT | O_WRONLY | O_CLOEXEC | mode_flag, mode_t(0644)); + if (fd == -1) + { + return true; + } + *fp = ::fdopen(fd, mode.c_str()); + if (*fp == nullptr) + { + ::close(fd); + } +# else + *fp = ::fopen((filename.c_str()), mode.c_str()); +# endif +#endif + + return *fp == nullptr; +} + +SPDLOG_INLINE int remove(const filename_t &filename) SPDLOG_NOEXCEPT +{ +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + return ::_wremove(filename.c_str()); +#else + return std::remove(filename.c_str()); +#endif +} + +SPDLOG_INLINE int remove_if_exists(const filename_t &filename) SPDLOG_NOEXCEPT +{ + return path_exists(filename) ? remove(filename) : 0; +} + +SPDLOG_INLINE int rename(const filename_t &filename1, const filename_t &filename2) SPDLOG_NOEXCEPT +{ +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + return ::_wrename(filename1.c_str(), filename2.c_str()); +#else + return std::rename(filename1.c_str(), filename2.c_str()); +#endif +} + +// Return true if path exists (file or directory) +SPDLOG_INLINE bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT +{ +#ifdef _WIN32 +# ifdef SPDLOG_WCHAR_FILENAMES + auto attribs = ::GetFileAttributesW(filename.c_str()); +# else + auto attribs = ::GetFileAttributesA(filename.c_str()); +# endif + return attribs != INVALID_FILE_ATTRIBUTES; +#else // common linux/unix all have the stat system call + struct stat buffer; + return (::stat(filename.c_str(), &buffer) == 0); +#endif +} + +#ifdef _MSC_VER +// avoid warning about unreachable statement at the end of filesize() +# pragma warning(push) +# pragma warning(disable : 4702) +#endif + +// Return file size according to open FILE* object +SPDLOG_INLINE size_t filesize(FILE *f) +{ + if (f == nullptr) + { + throw_spdlog_ex("Failed getting file size. fd is null"); + } +#if defined(_WIN32) && !defined(__CYGWIN__) + int fd = ::_fileno(f); +# if defined(_WIN64) // 64 bits + __int64 ret = ::_filelengthi64(fd); + if (ret >= 0) + { + return static_cast(ret); + } + +# else // windows 32 bits + long ret = ::_filelength(fd); + if (ret >= 0) + { + return static_cast(ret); + } +# endif + +#else // unix +// OpenBSD and AIX doesn't compile with :: before the fileno(..) +# if defined(__OpenBSD__) || defined(_AIX) + int fd = fileno(f); +# else + int fd = ::fileno(f); +# endif +// 64 bits(but not in osx, linux/musl or cygwin, where fstat64 is deprecated) +# if ((defined(__linux__) && defined(__GLIBC__)) || defined(__sun) || defined(_AIX)) && (defined(__LP64__) || defined(_LP64)) + struct stat64 st; + if (::fstat64(fd, &st) == 0) + { + return static_cast(st.st_size); + } +# else // other unix or linux 32 bits or cygwin + struct stat st; + if (::fstat(fd, &st) == 0) + { + return static_cast(st.st_size); + } +# endif +#endif + throw_spdlog_ex("Failed getting file size from fd", errno); + return 0; // will not be reached. +} + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +// Return utc offset in minutes or throw spdlog_ex on failure +SPDLOG_INLINE int utc_minutes_offset(const std::tm &tm) +{ + +#ifdef _WIN32 +# if _WIN32_WINNT < _WIN32_WINNT_WS08 + TIME_ZONE_INFORMATION tzinfo; + auto rv = ::GetTimeZoneInformation(&tzinfo); +# else + DYNAMIC_TIME_ZONE_INFORMATION tzinfo; + auto rv = ::GetDynamicTimeZoneInformation(&tzinfo); +# endif + if (rv == TIME_ZONE_ID_INVALID) + throw_spdlog_ex("Failed getting timezone info. ", errno); + + int offset = -tzinfo.Bias; + if (tm.tm_isdst) + { + offset -= tzinfo.DaylightBias; + } + else + { + offset -= tzinfo.StandardBias; + } + return offset; +#else + +# if defined(sun) || defined(__sun) || defined(_AIX) || (defined(__NEWLIB__) && !defined(__TM_GMTOFF)) || \ + (!defined(_BSD_SOURCE) && !defined(_GNU_SOURCE)) + // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris + struct helper + { + static long int calculate_gmt_offset(const std::tm &localtm = details::os::localtime(), const std::tm &gmtm = details::os::gmtime()) + { + int local_year = localtm.tm_year + (1900 - 1); + int gmt_year = gmtm.tm_year + (1900 - 1); + + long int days = ( + // difference in day of year + localtm.tm_yday - + gmtm.tm_yday + + // + intervening leap days + + ((local_year >> 2) - (gmt_year >> 2)) - (local_year / 100 - gmt_year / 100) + + ((local_year / 100 >> 2) - (gmt_year / 100 >> 2)) + + // + difference in years * 365 */ + + static_cast(local_year - gmt_year) * 365); + + long int hours = (24 * days) + (localtm.tm_hour - gmtm.tm_hour); + long int mins = (60 * hours) + (localtm.tm_min - gmtm.tm_min); + long int secs = (60 * mins) + (localtm.tm_sec - gmtm.tm_sec); + + return secs; + } + }; + + auto offset_seconds = helper::calculate_gmt_offset(tm); +# else + auto offset_seconds = tm.tm_gmtoff; +# endif + + return static_cast(offset_seconds / 60); +#endif +} + +// Return current thread id as size_t +// It exists because the std::this_thread::get_id() is much slower(especially +// under VS 2013) +SPDLOG_INLINE size_t _thread_id() SPDLOG_NOEXCEPT +{ +#ifdef _WIN32 + return static_cast(::GetCurrentThreadId()); +#elif defined(__linux__) +# if defined(__ANDROID__) && defined(__ANDROID_API__) && (__ANDROID_API__ < 21) +# define SYS_gettid __NR_gettid +# endif + return static_cast(::syscall(SYS_gettid)); +#elif defined(_AIX) + struct __pthrdsinfo buf; + int reg_size = 0; + pthread_t pt = pthread_self(); + int retval = pthread_getthrds_np(&pt, PTHRDSINFO_QUERY_TID, &buf, sizeof(buf), NULL, ®_size); + int tid = (!retval) ? buf.__pi_tid : 0; + return static_cast(tid); +#elif defined(__DragonFly__) || defined(__FreeBSD__) + return static_cast(::pthread_getthreadid_np()); +#elif defined(__NetBSD__) + return static_cast(::_lwp_self()); +#elif defined(__OpenBSD__) + return static_cast(::getthrid()); +#elif defined(__sun) + return static_cast(::thr_self()); +#elif __APPLE__ + uint64_t tid; + // There is no pthread_threadid_np prior to 10.6, and it is not supported on any PPC, + // including 10.6.8 Rosetta. __POWERPC__ is Apple-specific define encompassing ppc and ppc64. +# if (MAC_OS_X_VERSION_MAX_ALLOWED < 1060) || defined(__POWERPC__) + tid = pthread_mach_thread_np(pthread_self()); +# elif MAC_OS_X_VERSION_MIN_REQUIRED < 1060 + if (&pthread_threadid_np) + { + pthread_threadid_np(nullptr, &tid); + } + else + { + tid = pthread_mach_thread_np(pthread_self()); + } +# else + pthread_threadid_np(nullptr, &tid); +# endif + return static_cast(tid); +#else // Default to standard C++11 (other Unix) + return static_cast(std::hash()(std::this_thread::get_id())); +#endif +} + +// Return current thread id as size_t (from thread local storage) +SPDLOG_INLINE size_t thread_id() SPDLOG_NOEXCEPT +{ +#if defined(SPDLOG_NO_TLS) + return _thread_id(); +#else // cache thread id in tls + static thread_local const size_t tid = _thread_id(); + return tid; +#endif +} + +// This is avoid msvc issue in sleep_for that happens if the clock changes. +// See https://github.com/gabime/spdlog/issues/609 +SPDLOG_INLINE void sleep_for_millis(unsigned int milliseconds) SPDLOG_NOEXCEPT +{ +#if defined(_WIN32) + ::Sleep(milliseconds); +#else + std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds)); +#endif +} + +// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +SPDLOG_INLINE std::string filename_to_str(const filename_t &filename) +{ + memory_buf_t buf; + wstr_to_utf8buf(filename, buf); + return SPDLOG_BUF_TO_STRING(buf); +} +#else +SPDLOG_INLINE std::string filename_to_str(const filename_t &filename) +{ + return filename; +} +#endif + +SPDLOG_INLINE int pid() SPDLOG_NOEXCEPT +{ + +#ifdef _WIN32 + return conditional_static_cast(::GetCurrentProcessId()); +#else + return conditional_static_cast(::getpid()); +#endif +} + +// Determine if the terminal supports colors +// Based on: https://github.com/agauniyal/rang/ +SPDLOG_INLINE bool is_color_terminal() SPDLOG_NOEXCEPT +{ +#ifdef _WIN32 + return true; +#else + + static const bool result = []() { + const char *env_colorterm_p = std::getenv("COLORTERM"); + if (env_colorterm_p != nullptr) + { + return true; + } + + static constexpr std::array terms = {{"ansi", "color", "console", "cygwin", "gnome", "konsole", "kterm", "linux", + "msys", "putty", "rxvt", "screen", "vt100", "xterm", "alacritty", "vt102"}}; + + const char *env_term_p = std::getenv("TERM"); + if (env_term_p == nullptr) + { + return false; + } + + return std::any_of(terms.begin(), terms.end(), [&](const char *term) { return std::strstr(env_term_p, term) != nullptr; }); + }(); + + return result; +#endif +} + +// Determine if the terminal attached +// Source: https://github.com/agauniyal/rang/ +SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT +{ + +#ifdef _WIN32 + return ::_isatty(_fileno(file)) != 0; +#else + return ::isatty(fileno(file)) != 0; +#endif +} + +#if (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32) +SPDLOG_INLINE void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target) +{ + if (wstr.size() > static_cast((std::numeric_limits::max)()) / 2 - 1) + { + throw_spdlog_ex("UTF-16 string is too big to be converted to UTF-8"); + } + + int wstr_size = static_cast(wstr.size()); + if (wstr_size == 0) + { + target.resize(0); + return; + } + + int result_size = static_cast(target.capacity()); + if ((wstr_size + 1) * 2 > result_size) + { + result_size = ::WideCharToMultiByte(CP_UTF8, 0, wstr.data(), wstr_size, NULL, 0, NULL, NULL); + } + + if (result_size > 0) + { + target.resize(result_size); + result_size = ::WideCharToMultiByte(CP_UTF8, 0, wstr.data(), wstr_size, target.data(), result_size, NULL, NULL); + + if (result_size > 0) + { + target.resize(result_size); + return; + } + } + + throw_spdlog_ex(fmt_lib::format("WideCharToMultiByte failed. Last error: {}", ::GetLastError())); +} + +SPDLOG_INLINE void utf8_to_wstrbuf(string_view_t str, wmemory_buf_t &target) +{ + if (str.size() > static_cast((std::numeric_limits::max)()) - 1) + { + throw_spdlog_ex("UTF-8 string is too big to be converted to UTF-16"); + } + + int str_size = static_cast(str.size()); + if (str_size == 0) + { + target.resize(0); + return; + } + + // find the size to allocate for the result buffer + int result_size = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str.data(), str_size, NULL, 0); + + if (result_size > 0) + { + target.resize(result_size); + result_size = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str.data(), str_size, target.data(), result_size); + if (result_size > 0) + { + assert(result_size == target.size()); + return; + } + } + + throw_spdlog_ex(fmt_lib::format("MultiByteToWideChar failed. Last error: {}", ::GetLastError())); +} +#endif // (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32) + +// return true on success +static SPDLOG_INLINE bool mkdir_(const filename_t &path) +{ +#ifdef _WIN32 +# ifdef SPDLOG_WCHAR_FILENAMES + return ::_wmkdir(path.c_str()) == 0; +# else + return ::_mkdir(path.c_str()) == 0; +# endif +#else + return ::mkdir(path.c_str(), mode_t(0755)) == 0; +#endif +} + +// create the given directory - and all directories leading to it +// return true on success or if the directory already exists +SPDLOG_INLINE bool create_dir(const filename_t &path) +{ + if (path_exists(path)) + { + return true; + } + + if (path.empty()) + { + return false; + } + + size_t search_offset = 0; + do + { + auto token_pos = path.find_first_of(folder_seps_filename, search_offset); + // treat the entire path as a folder if no folder separator not found + if (token_pos == filename_t::npos) + { + token_pos = path.size(); + } + + auto subdir = path.substr(0, token_pos); + + if (!subdir.empty() && !path_exists(subdir) && !mkdir_(subdir)) + { + return false; // return error if failed creating dir + } + search_offset = token_pos + 1; + } while (search_offset < path.size()); + + return true; +} + +// Return directory name from given path or empty string +// "abc/file" => "abc" +// "abc/" => "abc" +// "abc" => "" +// "abc///" => "abc//" +SPDLOG_INLINE filename_t dir_name(const filename_t &path) +{ + auto pos = path.find_last_of(folder_seps_filename); + return pos != filename_t::npos ? path.substr(0, pos) : filename_t{}; +} + +std::string SPDLOG_INLINE getenv(const char *field) +{ + +#if defined(_MSC_VER) +# if defined(__cplusplus_winrt) + return std::string{}; // not supported under uwp +# else + size_t len = 0; + char buf[128]; + bool ok = ::getenv_s(&len, buf, sizeof(buf), field) == 0; + return ok ? buf : std::string{}; +# endif +#else // revert to getenv + char *buf = ::getenv(field); + return buf ? buf : std::string{}; +#endif +} + +// Do fsync by FILE handlerpointer +// Return true on success +SPDLOG_INLINE bool fsync(FILE *fp) +{ +#ifdef _WIN32 + return FlushFileBuffers(reinterpret_cast(_get_osfhandle(_fileno(fp)))) != 0; +#else + return ::fsync(fileno(fp)) == 0; +#endif +} + +} // namespace os +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/os.h b/Thirdparty/spdlog/include/spdlog/details/os.h new file mode 100644 index 0000000..37b0087 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/os.h @@ -0,0 +1,122 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include // std::time_t + +namespace spdlog { +namespace details { +namespace os { + +SPDLOG_API spdlog::log_clock::time_point now() SPDLOG_NOEXCEPT; + +SPDLOG_API std::tm localtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT; + +SPDLOG_API std::tm localtime() SPDLOG_NOEXCEPT; + +SPDLOG_API std::tm gmtime(const std::time_t &time_tt) SPDLOG_NOEXCEPT; + +SPDLOG_API std::tm gmtime() SPDLOG_NOEXCEPT; + +// eol definition +#if !defined(SPDLOG_EOL) +# ifdef _WIN32 +# define SPDLOG_EOL "\r\n" +# else +# define SPDLOG_EOL "\n" +# endif +#endif + +SPDLOG_CONSTEXPR static const char *default_eol = SPDLOG_EOL; + +// folder separator +#if !defined(SPDLOG_FOLDER_SEPS) +# ifdef _WIN32 +# define SPDLOG_FOLDER_SEPS "\\/" +# else +# define SPDLOG_FOLDER_SEPS "/" +# endif +#endif + +SPDLOG_CONSTEXPR static const char folder_seps[] = SPDLOG_FOLDER_SEPS; +SPDLOG_CONSTEXPR static const filename_t::value_type folder_seps_filename[] = SPDLOG_FILENAME_T(SPDLOG_FOLDER_SEPS); + +// fopen_s on non windows for writing +SPDLOG_API bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode); + +// Remove filename. return 0 on success +SPDLOG_API int remove(const filename_t &filename) SPDLOG_NOEXCEPT; + +// Remove file if exists. return 0 on success +// Note: Non atomic (might return failure to delete if concurrently deleted by other process/thread) +SPDLOG_API int remove_if_exists(const filename_t &filename) SPDLOG_NOEXCEPT; + +SPDLOG_API int rename(const filename_t &filename1, const filename_t &filename2) SPDLOG_NOEXCEPT; + +// Return if file exists. +SPDLOG_API bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT; + +// Return file size according to open FILE* object +SPDLOG_API size_t filesize(FILE *f); + +// Return utc offset in minutes or throw spdlog_ex on failure +SPDLOG_API int utc_minutes_offset(const std::tm &tm = details::os::localtime()); + +// Return current thread id as size_t +// It exists because the std::this_thread::get_id() is much slower(especially +// under VS 2013) +SPDLOG_API size_t _thread_id() SPDLOG_NOEXCEPT; + +// Return current thread id as size_t (from thread local storage) +SPDLOG_API size_t thread_id() SPDLOG_NOEXCEPT; + +// This is avoid msvc issue in sleep_for that happens if the clock changes. +// See https://github.com/gabime/spdlog/issues/609 +SPDLOG_API void sleep_for_millis(unsigned int milliseconds) SPDLOG_NOEXCEPT; + +SPDLOG_API std::string filename_to_str(const filename_t &filename); + +SPDLOG_API int pid() SPDLOG_NOEXCEPT; + +// Determine if the terminal supports colors +// Source: https://github.com/agauniyal/rang/ +SPDLOG_API bool is_color_terminal() SPDLOG_NOEXCEPT; + +// Determine if the terminal attached +// Source: https://github.com/agauniyal/rang/ +SPDLOG_API bool in_terminal(FILE *file) SPDLOG_NOEXCEPT; + +#if (defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT) || defined(SPDLOG_WCHAR_FILENAMES)) && defined(_WIN32) +SPDLOG_API void wstr_to_utf8buf(wstring_view_t wstr, memory_buf_t &target); + +SPDLOG_API void utf8_to_wstrbuf(string_view_t str, wmemory_buf_t &target); +#endif + +// Return directory name from given path or empty string +// "abc/file" => "abc" +// "abc/" => "abc" +// "abc" => "" +// "abc///" => "abc//" +SPDLOG_API filename_t dir_name(const filename_t &path); + +// Create a dir from the given path. +// Return true if succeeded or if this dir already exists. +SPDLOG_API bool create_dir(const filename_t &path); + +// non thread safe, cross platform getenv/getenv_s +// return empty string if field not found +SPDLOG_API std::string getenv(const char *field); + +// Do fsync by FILE objectpointer. +// Return true on success. +SPDLOG_API bool fsync(FILE *fp); + +} // namespace os +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "os-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/periodic_worker-inl.h b/Thirdparty/spdlog/include/spdlog/details/periodic_worker-inl.h new file mode 100644 index 0000000..520a2b3 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/periodic_worker-inl.h @@ -0,0 +1,28 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +namespace spdlog { +namespace details { + +// stop the worker thread and join it +SPDLOG_INLINE periodic_worker::~periodic_worker() +{ + if (worker_thread_.joinable()) + { + { + std::lock_guard lock(mutex_); + active_ = false; + } + cv_.notify_one(); + worker_thread_.join(); + } +} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/periodic_worker.h b/Thirdparty/spdlog/include/spdlog/details/periodic_worker.h new file mode 100644 index 0000000..d7d69b2 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/periodic_worker.h @@ -0,0 +1,60 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// periodic worker thread - periodically executes the given callback function. +// +// RAII over the owned thread: +// creates the thread on construction. +// stops and joins the thread on destruction (if the thread is executing a callback, wait for it to finish first). + +#include +#include +#include +#include +#include +namespace spdlog { +namespace details { + +class SPDLOG_API periodic_worker +{ +public: + template + periodic_worker(const std::function &callback_fun, std::chrono::duration interval) + { + active_ = (interval > std::chrono::duration::zero()); + if (!active_) + { + return; + } + + worker_thread_ = std::thread([this, callback_fun, interval]() { + for (;;) + { + std::unique_lock lock(this->mutex_); + if (this->cv_.wait_for(lock, interval, [this] { return !this->active_; })) + { + return; // active_ == false, so exit this thread + } + callback_fun(); + } + }); + } + periodic_worker(const periodic_worker &) = delete; + periodic_worker &operator=(const periodic_worker &) = delete; + // stop the worker thread and join it + ~periodic_worker(); + +private: + bool active_; + std::thread worker_thread_; + std::mutex mutex_; + std::condition_variable cv_; +}; +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "periodic_worker-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/registry-inl.h b/Thirdparty/spdlog/include/spdlog/details/registry-inl.h new file mode 100644 index 0000000..cb1fe84 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/registry-inl.h @@ -0,0 +1,315 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include +#include +#include + +#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER +// support for the default stdout color logger +# ifdef _WIN32 +# include +# else +# include +# endif +#endif // SPDLOG_DISABLE_DEFAULT_LOGGER + +#include +#include +#include +#include +#include + +namespace spdlog { +namespace details { + +SPDLOG_INLINE registry::registry() + : formatter_(new pattern_formatter()) +{ + +#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER + // create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows). +# ifdef _WIN32 + auto color_sink = std::make_shared(); +# else + auto color_sink = std::make_shared(); +# endif + + const char *default_logger_name = ""; + default_logger_ = std::make_shared(default_logger_name, std::move(color_sink)); + loggers_[default_logger_name] = default_logger_; + +#endif // SPDLOG_DISABLE_DEFAULT_LOGGER +} + +SPDLOG_INLINE registry::~registry() = default; + +SPDLOG_INLINE void registry::register_logger(std::shared_ptr new_logger) +{ + std::lock_guard lock(logger_map_mutex_); + register_logger_(std::move(new_logger)); +} + +SPDLOG_INLINE void registry::initialize_logger(std::shared_ptr new_logger) +{ + std::lock_guard lock(logger_map_mutex_); + new_logger->set_formatter(formatter_->clone()); + + if (err_handler_) + { + new_logger->set_error_handler(err_handler_); + } + + // set new level according to previously configured level or default level + auto it = log_levels_.find(new_logger->name()); + auto new_level = it != log_levels_.end() ? it->second : global_log_level_; + new_logger->set_level(new_level); + + new_logger->flush_on(flush_level_); + + if (backtrace_n_messages_ > 0) + { + new_logger->enable_backtrace(backtrace_n_messages_); + } + + if (automatic_registration_) + { + register_logger_(std::move(new_logger)); + } +} + +SPDLOG_INLINE std::shared_ptr registry::get(const std::string &logger_name) +{ + std::lock_guard lock(logger_map_mutex_); + auto found = loggers_.find(logger_name); + return found == loggers_.end() ? nullptr : found->second; +} + +SPDLOG_INLINE std::shared_ptr registry::default_logger() +{ + std::lock_guard lock(logger_map_mutex_); + return default_logger_; +} + +// Return raw ptr to the default logger. +// To be used directly by the spdlog default api (e.g. spdlog::info) +// This make the default API faster, but cannot be used concurrently with set_default_logger(). +// e.g do not call set_default_logger() from one thread while calling spdlog::info() from another. +SPDLOG_INLINE logger *registry::get_default_raw() +{ + return default_logger_.get(); +} + +// set default logger. +// default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map. +SPDLOG_INLINE void registry::set_default_logger(std::shared_ptr new_default_logger) +{ + std::lock_guard lock(logger_map_mutex_); + // remove previous default logger from the map + if (default_logger_ != nullptr) + { + loggers_.erase(default_logger_->name()); + } + if (new_default_logger != nullptr) + { + loggers_[new_default_logger->name()] = new_default_logger; + } + default_logger_ = std::move(new_default_logger); +} + +SPDLOG_INLINE void registry::set_tp(std::shared_ptr tp) +{ + std::lock_guard lock(tp_mutex_); + tp_ = std::move(tp); +} + +SPDLOG_INLINE std::shared_ptr registry::get_tp() +{ + std::lock_guard lock(tp_mutex_); + return tp_; +} + +// Set global formatter. Each sink in each logger will get a clone of this object +SPDLOG_INLINE void registry::set_formatter(std::unique_ptr formatter) +{ + std::lock_guard lock(logger_map_mutex_); + formatter_ = std::move(formatter); + for (auto &l : loggers_) + { + l.second->set_formatter(formatter_->clone()); + } +} + +SPDLOG_INLINE void registry::enable_backtrace(size_t n_messages) +{ + std::lock_guard lock(logger_map_mutex_); + backtrace_n_messages_ = n_messages; + + for (auto &l : loggers_) + { + l.second->enable_backtrace(n_messages); + } +} + +SPDLOG_INLINE void registry::disable_backtrace() +{ + std::lock_guard lock(logger_map_mutex_); + backtrace_n_messages_ = 0; + for (auto &l : loggers_) + { + l.second->disable_backtrace(); + } +} + +SPDLOG_INLINE void registry::set_level(level::level_enum log_level) +{ + std::lock_guard lock(logger_map_mutex_); + for (auto &l : loggers_) + { + l.second->set_level(log_level); + } + global_log_level_ = log_level; +} + +SPDLOG_INLINE void registry::flush_on(level::level_enum log_level) +{ + std::lock_guard lock(logger_map_mutex_); + for (auto &l : loggers_) + { + l.second->flush_on(log_level); + } + flush_level_ = log_level; +} + +SPDLOG_INLINE void registry::set_error_handler(err_handler handler) +{ + std::lock_guard lock(logger_map_mutex_); + for (auto &l : loggers_) + { + l.second->set_error_handler(handler); + } + err_handler_ = std::move(handler); +} + +SPDLOG_INLINE void registry::apply_all(const std::function)> &fun) +{ + std::lock_guard lock(logger_map_mutex_); + for (auto &l : loggers_) + { + fun(l.second); + } +} + +SPDLOG_INLINE void registry::flush_all() +{ + std::lock_guard lock(logger_map_mutex_); + for (auto &l : loggers_) + { + l.second->flush(); + } +} + +SPDLOG_INLINE void registry::drop(const std::string &logger_name) +{ + std::lock_guard lock(logger_map_mutex_); + auto is_default_logger = default_logger_ && default_logger_->name() == logger_name; + loggers_.erase(logger_name); + if (is_default_logger) + { + default_logger_.reset(); + } +} + +SPDLOG_INLINE void registry::drop_all() +{ + std::lock_guard lock(logger_map_mutex_); + loggers_.clear(); + default_logger_.reset(); +} + +// clean all resources and threads started by the registry +SPDLOG_INLINE void registry::shutdown() +{ + { + std::lock_guard lock(flusher_mutex_); + periodic_flusher_.reset(); + } + + drop_all(); + + { + std::lock_guard lock(tp_mutex_); + tp_.reset(); + } +} + +SPDLOG_INLINE std::recursive_mutex ®istry::tp_mutex() +{ + return tp_mutex_; +} + +SPDLOG_INLINE void registry::set_automatic_registration(bool automatic_registration) +{ + std::lock_guard lock(logger_map_mutex_); + automatic_registration_ = automatic_registration; +} + +SPDLOG_INLINE void registry::set_levels(log_levels levels, level::level_enum *global_level) +{ + std::lock_guard lock(logger_map_mutex_); + log_levels_ = std::move(levels); + auto global_level_requested = global_level != nullptr; + global_log_level_ = global_level_requested ? *global_level : global_log_level_; + + for (auto &logger : loggers_) + { + auto logger_entry = log_levels_.find(logger.first); + if (logger_entry != log_levels_.end()) + { + logger.second->set_level(logger_entry->second); + } + else if (global_level_requested) + { + logger.second->set_level(*global_level); + } + } +} + +SPDLOG_INLINE registry ®istry::instance() +{ + static registry s_instance; + return s_instance; +} + +SPDLOG_INLINE void registry::apply_logger_env_levels(std::shared_ptr new_logger) +{ + std::lock_guard lock(logger_map_mutex_); + auto it = log_levels_.find(new_logger->name()); + auto new_level = it != log_levels_.end() ? it->second : global_log_level_; + new_logger->set_level(new_level); +} + +SPDLOG_INLINE void registry::throw_if_exists_(const std::string &logger_name) +{ + if (loggers_.find(logger_name) != loggers_.end()) + { + throw_spdlog_ex("logger with name '" + logger_name + "' already exists"); + } +} + +SPDLOG_INLINE void registry::register_logger_(std::shared_ptr new_logger) +{ + auto logger_name = new_logger->name(); + throw_if_exists_(logger_name); + loggers_[logger_name] = std::move(new_logger); +} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/registry.h b/Thirdparty/spdlog/include/spdlog/details/registry.h new file mode 100644 index 0000000..4666fa2 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/registry.h @@ -0,0 +1,123 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// Loggers registry of unique name->logger pointer +// An attempt to create a logger with an already existing name will result with spdlog_ex exception. +// If user requests a non existing logger, nullptr will be returned +// This class is thread safe + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace spdlog { +class logger; + +namespace details { +class thread_pool; + +class SPDLOG_API registry +{ +public: + using log_levels = std::unordered_map; + registry(const registry &) = delete; + registry &operator=(const registry &) = delete; + + void register_logger(std::shared_ptr new_logger); + void initialize_logger(std::shared_ptr new_logger); + std::shared_ptr get(const std::string &logger_name); + std::shared_ptr default_logger(); + + // Return raw ptr to the default logger. + // To be used directly by the spdlog default api (e.g. spdlog::info) + // This make the default API faster, but cannot be used concurrently with set_default_logger(). + // e.g do not call set_default_logger() from one thread while calling spdlog::info() from another. + logger *get_default_raw(); + + // set default logger. + // default logger is stored in default_logger_ (for faster retrieval) and in the loggers_ map. + void set_default_logger(std::shared_ptr new_default_logger); + + void set_tp(std::shared_ptr tp); + + std::shared_ptr get_tp(); + + // Set global formatter. Each sink in each logger will get a clone of this object + void set_formatter(std::unique_ptr formatter); + + void enable_backtrace(size_t n_messages); + + void disable_backtrace(); + + void set_level(level::level_enum log_level); + + void flush_on(level::level_enum log_level); + + template + void flush_every(std::chrono::duration interval) + { + std::lock_guard lock(flusher_mutex_); + auto clbk = [this]() { this->flush_all(); }; + periodic_flusher_ = details::make_unique(clbk, interval); + } + + void set_error_handler(err_handler handler); + + void apply_all(const std::function)> &fun); + + void flush_all(); + + void drop(const std::string &logger_name); + + void drop_all(); + + // clean all resources and threads started by the registry + void shutdown(); + + std::recursive_mutex &tp_mutex(); + + void set_automatic_registration(bool automatic_registration); + + // set levels for all existing/future loggers. global_level can be null if should not set. + void set_levels(log_levels levels, level::level_enum *global_level); + + static registry &instance(); + + void apply_logger_env_levels(std::shared_ptr new_logger); + +private: + registry(); + ~registry(); + + void throw_if_exists_(const std::string &logger_name); + void register_logger_(std::shared_ptr new_logger); + bool set_level_from_cfg_(logger *logger); + std::mutex logger_map_mutex_, flusher_mutex_; + std::recursive_mutex tp_mutex_; + std::unordered_map> loggers_; + log_levels log_levels_; + std::unique_ptr formatter_; + spdlog::level::level_enum global_log_level_ = level::info; + level::level_enum flush_level_ = level::off; + err_handler err_handler_; + std::shared_ptr tp_; + std::unique_ptr periodic_flusher_; + std::shared_ptr default_logger_; + bool automatic_registration_ = true; + size_t backtrace_n_messages_ = 0; +}; + +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "registry-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/synchronous_factory.h b/Thirdparty/spdlog/include/spdlog/details/synchronous_factory.h new file mode 100644 index 0000000..e1e4226 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/synchronous_factory.h @@ -0,0 +1,24 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include "registry.h" + +namespace spdlog { + +// Default logger factory- creates synchronous loggers +class logger; + +struct synchronous_factory +{ + template + static std::shared_ptr create(std::string logger_name, SinkArgs &&...args) + { + auto sink = std::make_shared(std::forward(args)...); + auto new_logger = std::make_shared(std::move(logger_name), std::move(sink)); + details::registry::instance().initialize_logger(new_logger); + return new_logger; + } +}; +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/tcp_client-windows.h b/Thirdparty/spdlog/include/spdlog/details/tcp_client-windows.h new file mode 100644 index 0000000..968b257 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/tcp_client-windows.h @@ -0,0 +1,160 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#define WIN32_LEAN_AND_MEAN +// tcp client helper +#include +#include + +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "Ws2_32.lib") +#pragma comment(lib, "Mswsock.lib") +#pragma comment(lib, "AdvApi32.lib") + +namespace spdlog { +namespace details { +class tcp_client +{ + SOCKET socket_ = INVALID_SOCKET; + + static void init_winsock_() + { + WSADATA wsaData; + auto rv = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (rv != 0) + { + throw_winsock_error_("WSAStartup failed", ::WSAGetLastError()); + } + } + + static void throw_winsock_error_(const std::string &msg, int last_error) + { + char buf[512]; + ::FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, last_error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(char)), NULL); + + throw_spdlog_ex(fmt_lib::format("tcp_sink - {}: {}", msg, buf)); + } + +public: + tcp_client() + { + init_winsock_(); + } + + ~tcp_client() + { + close(); + ::WSACleanup(); + } + + bool is_connected() const + { + return socket_ != INVALID_SOCKET; + } + + void close() + { + ::closesocket(socket_); + socket_ = INVALID_SOCKET; + } + + SOCKET fd() const + { + return socket_; + } + + // try to connect or throw on failure + void connect(const std::string &host, int port) + { + if (is_connected()) + { + close(); + } + struct addrinfo hints + {}; + ZeroMemory(&hints, sizeof(hints)); + + hints.ai_family = AF_UNSPEC; // To work with IPv4, IPv6, and so on + hints.ai_socktype = SOCK_STREAM; // TCP + hints.ai_flags = AI_NUMERICSERV; // port passed as as numeric value + hints.ai_protocol = 0; + + auto port_str = std::to_string(port); + struct addrinfo *addrinfo_result; + auto rv = ::getaddrinfo(host.c_str(), port_str.c_str(), &hints, &addrinfo_result); + int last_error = 0; + if (rv != 0) + { + last_error = ::WSAGetLastError(); + WSACleanup(); + throw_winsock_error_("getaddrinfo failed", last_error); + } + + // Try each address until we successfully connect(2). + + for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next) + { + socket_ = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (socket_ == INVALID_SOCKET) + { + last_error = ::WSAGetLastError(); + WSACleanup(); + continue; + } + if (::connect(socket_, rp->ai_addr, (int)rp->ai_addrlen) == 0) + { + break; + } + else + { + last_error = ::WSAGetLastError(); + close(); + } + } + ::freeaddrinfo(addrinfo_result); + if (socket_ == INVALID_SOCKET) + { + WSACleanup(); + throw_winsock_error_("connect failed", last_error); + } + + // set TCP_NODELAY + int enable_flag = 1; + ::setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&enable_flag), sizeof(enable_flag)); + } + + // Send exactly n_bytes of the given data. + // On error close the connection and throw. + void send(const char *data, size_t n_bytes) + { + size_t bytes_sent = 0; + while (bytes_sent < n_bytes) + { + const int send_flags = 0; + auto write_result = ::send(socket_, data + bytes_sent, (int)(n_bytes - bytes_sent), send_flags); + if (write_result == SOCKET_ERROR) + { + int last_error = ::WSAGetLastError(); + close(); + throw_winsock_error_("send failed", last_error); + } + + if (write_result == 0) // (probably should not happen but in any case..) + { + break; + } + bytes_sent += static_cast(write_result); + } + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/tcp_client.h b/Thirdparty/spdlog/include/spdlog/details/tcp_client.h new file mode 100644 index 0000000..8b11dfd --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/tcp_client.h @@ -0,0 +1,146 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifdef _WIN32 +# error include tcp_client-windows.h instead +#endif + +// tcp client helper +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +namespace spdlog { +namespace details { +class tcp_client +{ + int socket_ = -1; + +public: + bool is_connected() const + { + return socket_ != -1; + } + + void close() + { + if (is_connected()) + { + ::close(socket_); + socket_ = -1; + } + } + + int fd() const + { + return socket_; + } + + ~tcp_client() + { + close(); + } + + // try to connect or throw on failure + void connect(const std::string &host, int port) + { + close(); + struct addrinfo hints + {}; + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; // To work with IPv4, IPv6, and so on + hints.ai_socktype = SOCK_STREAM; // TCP + hints.ai_flags = AI_NUMERICSERV; // port passed as as numeric value + hints.ai_protocol = 0; + + auto port_str = std::to_string(port); + struct addrinfo *addrinfo_result; + auto rv = ::getaddrinfo(host.c_str(), port_str.c_str(), &hints, &addrinfo_result); + if (rv != 0) + { + throw_spdlog_ex(fmt_lib::format("::getaddrinfo failed: {}", gai_strerror(rv))); + } + + // Try each address until we successfully connect(2). + int last_errno = 0; + for (auto *rp = addrinfo_result; rp != nullptr; rp = rp->ai_next) + { +#if defined(SOCK_CLOEXEC) + const int flags = SOCK_CLOEXEC; +#else + const int flags = 0; +#endif + socket_ = ::socket(rp->ai_family, rp->ai_socktype | flags, rp->ai_protocol); + if (socket_ == -1) + { + last_errno = errno; + continue; + } + rv = ::connect(socket_, rp->ai_addr, rp->ai_addrlen); + if (rv == 0) + { + break; + } + last_errno = errno; + ::close(socket_); + socket_ = -1; + } + ::freeaddrinfo(addrinfo_result); + if (socket_ == -1) + { + throw_spdlog_ex("::connect failed", last_errno); + } + + // set TCP_NODELAY + int enable_flag = 1; + ::setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&enable_flag), sizeof(enable_flag)); + + // prevent sigpipe on systems where MSG_NOSIGNAL is not available +#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL) + ::setsockopt(socket_, SOL_SOCKET, SO_NOSIGPIPE, reinterpret_cast(&enable_flag), sizeof(enable_flag)); +#endif + +#if !defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL) +# error "tcp_sink would raise SIGPIPE since neither SO_NOSIGPIPE nor MSG_NOSIGNAL are available" +#endif + } + + // Send exactly n_bytes of the given data. + // On error close the connection and throw. + void send(const char *data, size_t n_bytes) + { + size_t bytes_sent = 0; + while (bytes_sent < n_bytes) + { +#if defined(MSG_NOSIGNAL) + const int send_flags = MSG_NOSIGNAL; +#else + const int send_flags = 0; +#endif + auto write_result = ::send(socket_, data + bytes_sent, n_bytes - bytes_sent, send_flags); + if (write_result < 0) + { + close(); + throw_spdlog_ex("write(2) failed", errno); + } + + if (write_result == 0) // (probably should not happen but in any case..) + { + break; + } + bytes_sent += static_cast(write_result); + } + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/thread_pool-inl.h b/Thirdparty/spdlog/include/spdlog/details/thread_pool-inl.h new file mode 100644 index 0000000..dbd424f --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/thread_pool-inl.h @@ -0,0 +1,137 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +# include +#endif + +#include +#include + +namespace spdlog { +namespace details { + +SPDLOG_INLINE thread_pool::thread_pool( + size_t q_max_items, size_t threads_n, std::function on_thread_start, std::function on_thread_stop) + : q_(q_max_items) +{ + if (threads_n == 0 || threads_n > 1000) + { + throw_spdlog_ex("spdlog::thread_pool(): invalid threads_n param (valid " + "range is 1-1000)"); + } + for (size_t i = 0; i < threads_n; i++) + { + threads_.emplace_back([this, on_thread_start, on_thread_stop] { + on_thread_start(); + this->thread_pool::worker_loop_(); + on_thread_stop(); + }); + } +} + +SPDLOG_INLINE thread_pool::thread_pool(size_t q_max_items, size_t threads_n, std::function on_thread_start) + : thread_pool(q_max_items, threads_n, on_thread_start, [] {}) +{} + +SPDLOG_INLINE thread_pool::thread_pool(size_t q_max_items, size_t threads_n) + : thread_pool( + q_max_items, threads_n, [] {}, [] {}) +{} + +// message all threads to terminate gracefully join them +SPDLOG_INLINE thread_pool::~thread_pool() +{ + SPDLOG_TRY + { + for (size_t i = 0; i < threads_.size(); i++) + { + post_async_msg_(async_msg(async_msg_type::terminate), async_overflow_policy::block); + } + + for (auto &t : threads_) + { + t.join(); + } + } + SPDLOG_CATCH_STD +} + +void SPDLOG_INLINE thread_pool::post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy) +{ + async_msg async_m(std::move(worker_ptr), async_msg_type::log, msg); + post_async_msg_(std::move(async_m), overflow_policy); +} + +void SPDLOG_INLINE thread_pool::post_flush(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy) +{ + post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy); +} + +size_t SPDLOG_INLINE thread_pool::overrun_counter() +{ + return q_.overrun_counter(); +} + +void SPDLOG_INLINE thread_pool::reset_overrun_counter() +{ + q_.reset_overrun_counter(); +} + +size_t SPDLOG_INLINE thread_pool::queue_size() +{ + return q_.size(); +} + +void SPDLOG_INLINE thread_pool::post_async_msg_(async_msg &&new_msg, async_overflow_policy overflow_policy) +{ + if (overflow_policy == async_overflow_policy::block) + { + q_.enqueue(std::move(new_msg)); + } + else + { + q_.enqueue_nowait(std::move(new_msg)); + } +} + +void SPDLOG_INLINE thread_pool::worker_loop_() +{ + while (process_next_msg_()) {} +} + +// process next message in the queue +// return true if this thread should still be active (while no terminate msg +// was received) +bool SPDLOG_INLINE thread_pool::process_next_msg_() +{ + async_msg incoming_async_msg; + q_.dequeue(incoming_async_msg); + + switch (incoming_async_msg.msg_type) + { + case async_msg_type::log: { + incoming_async_msg.worker_ptr->backend_sink_it_(incoming_async_msg); + return true; + } + case async_msg_type::flush: { + incoming_async_msg.worker_ptr->backend_flush_(); + return true; + } + + case async_msg_type::terminate: { + return false; + } + + default: { + assert(false); + } + } + + return true; +} + +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/thread_pool.h b/Thirdparty/spdlog/include/spdlog/details/thread_pool.h new file mode 100644 index 0000000..52c569b --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/thread_pool.h @@ -0,0 +1,122 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace spdlog { +class async_logger; + +namespace details { + +using async_logger_ptr = std::shared_ptr; + +enum class async_msg_type +{ + log, + flush, + terminate +}; + +// Async msg to move to/from the queue +// Movable only. should never be copied +struct async_msg : log_msg_buffer +{ + async_msg_type msg_type{async_msg_type::log}; + async_logger_ptr worker_ptr; + + async_msg() = default; + ~async_msg() = default; + + // should only be moved in or out of the queue.. + async_msg(const async_msg &) = delete; + +// support for vs2013 move +#if defined(_MSC_VER) && _MSC_VER <= 1800 + async_msg(async_msg &&other) + : log_msg_buffer(std::move(other)) + , msg_type(other.msg_type) + , worker_ptr(std::move(other.worker_ptr)) + {} + + async_msg &operator=(async_msg &&other) + { + *static_cast(this) = std::move(other); + msg_type = other.msg_type; + worker_ptr = std::move(other.worker_ptr); + return *this; + } +#else // (_MSC_VER) && _MSC_VER <= 1800 + async_msg(async_msg &&) = default; + async_msg &operator=(async_msg &&) = default; +#endif + + // construct from log_msg with given type + async_msg(async_logger_ptr &&worker, async_msg_type the_type, const details::log_msg &m) + : log_msg_buffer{m} + , msg_type{the_type} + , worker_ptr{std::move(worker)} + {} + + async_msg(async_logger_ptr &&worker, async_msg_type the_type) + : log_msg_buffer{} + , msg_type{the_type} + , worker_ptr{std::move(worker)} + {} + + explicit async_msg(async_msg_type the_type) + : async_msg{nullptr, the_type} + {} +}; + +class SPDLOG_API thread_pool +{ +public: + using item_type = async_msg; + using q_type = details::mpmc_blocking_queue; + + thread_pool(size_t q_max_items, size_t threads_n, std::function on_thread_start, std::function on_thread_stop); + thread_pool(size_t q_max_items, size_t threads_n, std::function on_thread_start); + thread_pool(size_t q_max_items, size_t threads_n); + + // message all threads to terminate gracefully and join them + ~thread_pool(); + + thread_pool(const thread_pool &) = delete; + thread_pool &operator=(thread_pool &&) = delete; + + void post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy); + void post_flush(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy); + size_t overrun_counter(); + void reset_overrun_counter(); + size_t queue_size(); + +private: + q_type q_; + + std::vector threads_; + + void post_async_msg_(async_msg &&new_msg, async_overflow_policy overflow_policy); + void worker_loop_(); + + // process next message in the queue + // return true if this thread should still be active (while no terminate msg + // was received) + bool process_next_msg_(); +}; + +} // namespace details +} // namespace spdlog + +#ifdef SPDLOG_HEADER_ONLY +# include "thread_pool-inl.h" +#endif diff --git a/Thirdparty/spdlog/include/spdlog/details/udp_client-windows.h b/Thirdparty/spdlog/include/spdlog/details/udp_client-windows.h new file mode 100644 index 0000000..10894ee --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/udp_client-windows.h @@ -0,0 +1,113 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// Helper RAII over winsock udp client socket. +// Will throw on construction if socket creation failed. + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +# pragma comment(lib, "Ws2_32.lib") +# pragma comment(lib, "Mswsock.lib") +# pragma comment(lib, "AdvApi32.lib") +#endif + +namespace spdlog { +namespace details { +class udp_client +{ + static constexpr int TX_BUFFER_SIZE = 1024 * 10; + SOCKET socket_ = INVALID_SOCKET; + sockaddr_in addr_ = {}; + + static void init_winsock_() + { + WSADATA wsaData; + auto rv = ::WSAStartup(MAKEWORD(2, 2), &wsaData); + if (rv != 0) + { + throw_winsock_error_("WSAStartup failed", ::WSAGetLastError()); + } + } + + static void throw_winsock_error_(const std::string &msg, int last_error) + { + char buf[512]; + ::FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, last_error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(char)), NULL); + + throw_spdlog_ex(fmt_lib::format("udp_sink - {}: {}", msg, buf)); + } + + void cleanup_() + { + if (socket_ != INVALID_SOCKET) + { + ::closesocket(socket_); + } + socket_ = INVALID_SOCKET; + ::WSACleanup(); + } + +public: + udp_client(const std::string &host, uint16_t port) + { + init_winsock_(); + + addr_.sin_family = PF_INET; + addr_.sin_port = htons(port); + addr_.sin_addr.s_addr = INADDR_ANY; + if (InetPtonA(PF_INET, host.c_str(), &addr_.sin_addr.s_addr) != 1) + { + int last_error = ::WSAGetLastError(); + ::WSACleanup(); + throw_winsock_error_("error: Invalid address!", last_error); + } + + socket_ = ::socket(PF_INET, SOCK_DGRAM, 0); + if (socket_ == INVALID_SOCKET) + { + int last_error = ::WSAGetLastError(); + ::WSACleanup(); + throw_winsock_error_("error: Create Socket failed", last_error); + } + + int option_value = TX_BUFFER_SIZE; + if (::setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&option_value), sizeof(option_value)) < 0) + { + int last_error = ::WSAGetLastError(); + cleanup_(); + throw_winsock_error_("error: setsockopt(SO_SNDBUF) Failed!", last_error); + } + } + + ~udp_client() + { + cleanup_(); + } + + SOCKET fd() const + { + return socket_; + } + + void send(const char *data, size_t n_bytes) + { + socklen_t tolen = sizeof(struct sockaddr); + if (::sendto(socket_, data, static_cast(n_bytes), 0, (struct sockaddr *)&addr_, tolen) == -1) + { + throw_spdlog_ex("sendto(2) failed", errno); + } + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/udp_client.h b/Thirdparty/spdlog/include/spdlog/details/udp_client.h new file mode 100644 index 0000000..e8c2ccc --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/udp_client.h @@ -0,0 +1,94 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +// Helper RAII over unix udp client socket. +// Will throw on construction if the socket creation failed. + +#ifdef _WIN32 +# error "include udp_client-windows.h instead" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace spdlog { +namespace details { + +class udp_client +{ + static constexpr int TX_BUFFER_SIZE = 1024 * 10; + int socket_ = -1; + struct sockaddr_in sockAddr_; + + void cleanup_() + { + if (socket_ != -1) + { + ::close(socket_); + socket_ = -1; + } + } + +public: + udp_client(const std::string &host, uint16_t port) + { + socket_ = ::socket(PF_INET, SOCK_DGRAM, 0); + if (socket_ < 0) + { + throw_spdlog_ex("error: Create Socket Failed!"); + } + + int option_value = TX_BUFFER_SIZE; + if (::setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&option_value), sizeof(option_value)) < 0) + { + cleanup_(); + throw_spdlog_ex("error: setsockopt(SO_SNDBUF) Failed!"); + } + + sockAddr_.sin_family = AF_INET; + sockAddr_.sin_port = htons(port); + + if (::inet_aton(host.c_str(), &sockAddr_.sin_addr) == 0) + { + cleanup_(); + throw_spdlog_ex("error: Invalid address!"); + } + + ::memset(sockAddr_.sin_zero, 0x00, sizeof(sockAddr_.sin_zero)); + } + + ~udp_client() + { + cleanup_(); + } + + int fd() const + { + return socket_; + } + + // Send exactly n_bytes of the given data. + // On error close the connection and throw. + void send(const char *data, size_t n_bytes) + { + ssize_t toslen = 0; + socklen_t tolen = sizeof(struct sockaddr); + if ((toslen = ::sendto(socket_, data, n_bytes, 0, (struct sockaddr *)&sockAddr_, tolen)) == -1) + { + throw_spdlog_ex("sendto(2) failed", errno); + } + } +}; +} // namespace details +} // namespace spdlog diff --git a/Thirdparty/spdlog/include/spdlog/details/windows_include.h b/Thirdparty/spdlog/include/spdlog/details/windows_include.h new file mode 100644 index 0000000..a92390b --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/details/windows_include.h @@ -0,0 +1,11 @@ +#pragma once + +#ifndef NOMINMAX +# define NOMINMAX // prevent windows redefining min/max +#endif + +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#include diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bin_to_hex.h b/Thirdparty/spdlog/include/spdlog/fmt/bin_to_hex.h new file mode 100644 index 0000000..3bf003d --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bin_to_hex.h @@ -0,0 +1,248 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include +#include + +#if defined(__has_include) +# if __has_include() +# include +# endif +#endif + +#if __cpp_lib_span >= 202002L +# include +#endif + +// +// Support for logging binary data as hex +// format flags, any combination of the following: +// {:X} - print in uppercase. +// {:s} - don't separate each byte with space. +// {:p} - don't print the position on each line start. +// {:n} - don't split the output to lines. +// {:a} - show ASCII if :n is not set + +// +// Examples: +// +// std::vector v(200, 0x0b); +// logger->info("Some buffer {}", spdlog::to_hex(v)); +// char buf[128]; +// logger->info("Some buffer {:X}", spdlog::to_hex(std::begin(buf), std::end(buf))); +// logger->info("Some buffer {:X}", spdlog::to_hex(std::begin(buf), std::end(buf), 16)); + +namespace spdlog { +namespace details { + +template +class dump_info +{ +public: + dump_info(It range_begin, It range_end, size_t size_per_line) + : begin_(range_begin) + , end_(range_end) + , size_per_line_(size_per_line) + {} + + // do not use begin() and end() to avoid collision with fmt/ranges + It get_begin() const + { + return begin_; + } + It get_end() const + { + return end_; + } + size_t size_per_line() const + { + return size_per_line_; + } + +private: + It begin_, end_; + size_t size_per_line_; +}; +} // namespace details + +// create a dump_info that wraps the given container +template +inline details::dump_info to_hex(const Container &container, size_t size_per_line = 32) +{ + static_assert(sizeof(typename Container::value_type) == 1, "sizeof(Container::value_type) != 1"); + using Iter = typename Container::const_iterator; + return details::dump_info(std::begin(container), std::end(container), size_per_line); +} + +#if __cpp_lib_span >= 202002L + +template +inline details::dump_info::iterator> to_hex( + const std::span &container, size_t size_per_line = 32) +{ + using Container = std::span; + static_assert(sizeof(typename Container::value_type) == 1, "sizeof(Container::value_type) != 1"); + using Iter = typename Container::iterator; + return details::dump_info(std::begin(container), std::end(container), size_per_line); +} + +#endif + +// create dump_info from ranges +template +inline details::dump_info to_hex(const It range_begin, const It range_end, size_t size_per_line = 32) +{ + return details::dump_info(range_begin, range_end, size_per_line); +} + +} // namespace spdlog + +namespace +#ifdef SPDLOG_USE_STD_FORMAT + std +#else + fmt +#endif +{ + +template +struct formatter, char> +{ + const char delimiter = ' '; + bool put_newlines = true; + bool put_delimiters = true; + bool use_uppercase = false; + bool put_positions = true; // position on start of each line + bool show_ascii = false; + + // parse the format string flags + template + SPDLOG_CONSTEXPR_FUNC auto parse(ParseContext &ctx) -> decltype(ctx.begin()) + { + auto it = ctx.begin(); + while (it != ctx.end() && *it != '}') + { + switch (*it) + { + case 'X': + use_uppercase = true; + break; + case 's': + put_delimiters = false; + break; + case 'p': + put_positions = false; + break; + case 'n': + put_newlines = false; + show_ascii = false; + break; + case 'a': + if (put_newlines) + { + show_ascii = true; + } + break; + } + + ++it; + } + return it; + } + + // format the given bytes range as hex + template + auto format(const spdlog::details::dump_info &the_range, FormatContext &ctx) const -> decltype(ctx.out()) + { + SPDLOG_CONSTEXPR const char *hex_upper = "0123456789ABCDEF"; + SPDLOG_CONSTEXPR const char *hex_lower = "0123456789abcdef"; + const char *hex_chars = use_uppercase ? hex_upper : hex_lower; + +#if !defined(SPDLOG_USE_STD_FORMAT) && FMT_VERSION < 60000 + auto inserter = ctx.begin(); +#else + auto inserter = ctx.out(); +#endif + + int size_per_line = static_cast(the_range.size_per_line()); + auto start_of_line = the_range.get_begin(); + for (auto i = the_range.get_begin(); i != the_range.get_end(); i++) + { + auto ch = static_cast(*i); + + if (put_newlines && (i == the_range.get_begin() || i - start_of_line >= size_per_line)) + { + if (show_ascii && i != the_range.get_begin()) + { + *inserter++ = delimiter; + *inserter++ = delimiter; + for (auto j = start_of_line; j < i; j++) + { + auto pc = static_cast(*j); + *inserter++ = std::isprint(pc) ? static_cast(*j) : '.'; + } + } + + put_newline(inserter, static_cast(i - the_range.get_begin())); + + // put first byte without delimiter in front of it + *inserter++ = hex_chars[(ch >> 4) & 0x0f]; + *inserter++ = hex_chars[ch & 0x0f]; + start_of_line = i; + continue; + } + + if (put_delimiters && i != the_range.get_begin()) + { + *inserter++ = delimiter; + } + + *inserter++ = hex_chars[(ch >> 4) & 0x0f]; + *inserter++ = hex_chars[ch & 0x0f]; + } + if (show_ascii) // add ascii to last line + { + if (the_range.get_end() - the_range.get_begin() > size_per_line) + { + auto blank_num = size_per_line - (the_range.get_end() - start_of_line); + while (blank_num-- > 0) + { + *inserter++ = delimiter; + *inserter++ = delimiter; + if (put_delimiters) + { + *inserter++ = delimiter; + } + } + } + *inserter++ = delimiter; + *inserter++ = delimiter; + for (auto j = start_of_line; j != the_range.get_end(); j++) + { + auto pc = static_cast(*j); + *inserter++ = std::isprint(pc) ? static_cast(*j) : '.'; + } + } + return inserter; + } + + // put newline(and position header) + template + void put_newline(It inserter, std::size_t pos) const + { +#ifdef _WIN32 + *inserter++ = '\r'; +#endif + *inserter++ = '\n'; + + if (put_positions) + { + spdlog::fmt_lib::format_to(inserter, SPDLOG_FMT_STRING("{:04X}: "), pos); + } + } +}; +} // namespace std diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/args.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/args.h new file mode 100644 index 0000000..a3966d1 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/args.h @@ -0,0 +1,234 @@ +// Formatting library for C++ - dynamic format arguments +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_ARGS_H_ +#define FMT_ARGS_H_ + +#include // std::reference_wrapper +#include // std::unique_ptr +#include + +#include "core.h" + +FMT_BEGIN_NAMESPACE + +namespace detail { + +template struct is_reference_wrapper : std::false_type {}; +template +struct is_reference_wrapper> : std::true_type {}; + +template const T& unwrap(const T& v) { return v; } +template const T& unwrap(const std::reference_wrapper& v) { + return static_cast(v); +} + +class dynamic_arg_list { + // Workaround for clang's -Wweak-vtables. Unlike for regular classes, for + // templates it doesn't complain about inability to deduce single translation + // unit for placing vtable. So storage_node_base is made a fake template. + template struct node { + virtual ~node() = default; + std::unique_ptr> next; + }; + + template struct typed_node : node<> { + T value; + + template + FMT_CONSTEXPR typed_node(const Arg& arg) : value(arg) {} + + template + FMT_CONSTEXPR typed_node(const basic_string_view& arg) + : value(arg.data(), arg.size()) {} + }; + + std::unique_ptr> head_; + + public: + template const T& push(const Arg& arg) { + auto new_node = std::unique_ptr>(new typed_node(arg)); + auto& value = new_node->value; + new_node->next = std::move(head_); + head_ = std::move(new_node); + return value; + } +}; +} // namespace detail + +/** + \rst + A dynamic version of `fmt::format_arg_store`. + It's equipped with a storage to potentially temporary objects which lifetimes + could be shorter than the format arguments object. + + It can be implicitly converted into `~fmt::basic_format_args` for passing + into type-erased formatting functions such as `~fmt::vformat`. + \endrst + */ +template +class dynamic_format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + using char_type = typename Context::char_type; + + template struct need_copy { + static constexpr detail::type mapped_type = + detail::mapped_type_constant::value; + + enum { + value = !(detail::is_reference_wrapper::value || + std::is_same>::value || + std::is_same>::value || + (mapped_type != detail::type::cstring_type && + mapped_type != detail::type::string_type && + mapped_type != detail::type::custom_type)) + }; + }; + + template + using stored_type = conditional_t< + std::is_convertible>::value && + !detail::is_reference_wrapper::value, + std::basic_string, T>; + + // Storage of basic_format_arg must be contiguous. + std::vector> data_; + std::vector> named_info_; + + // Storage of arguments not fitting into basic_format_arg must grow + // without relocation because items in data_ refer to it. + detail::dynamic_arg_list dynamic_args_; + + friend class basic_format_args; + + unsigned long long get_types() const { + return detail::is_unpacked_bit | data_.size() | + (named_info_.empty() + ? 0ULL + : static_cast(detail::has_named_args_bit)); + } + + const basic_format_arg* data() const { + return named_info_.empty() ? data_.data() : data_.data() + 1; + } + + template void emplace_arg(const T& arg) { + data_.emplace_back(detail::make_arg(arg)); + } + + template + void emplace_arg(const detail::named_arg& arg) { + if (named_info_.empty()) { + constexpr const detail::named_arg_info* zero_ptr{nullptr}; + data_.insert(data_.begin(), {zero_ptr, 0}); + } + data_.emplace_back(detail::make_arg(detail::unwrap(arg.value))); + auto pop_one = [](std::vector>* data) { + data->pop_back(); + }; + std::unique_ptr>, decltype(pop_one)> + guard{&data_, pop_one}; + named_info_.push_back({arg.name, static_cast(data_.size() - 2u)}); + data_[0].value_.named_args = {named_info_.data(), named_info_.size()}; + guard.release(); + } + + public: + constexpr dynamic_format_arg_store() = default; + + /** + \rst + Adds an argument into the dynamic store for later passing to a formatting + function. + + Note that custom types and string types (but not string views) are copied + into the store dynamically allocating memory if necessary. + + **Example**:: + + fmt::dynamic_format_arg_store store; + store.push_back(42); + store.push_back("abc"); + store.push_back(1.5f); + std::string result = fmt::vformat("{} and {} and {}", store); + \endrst + */ + template void push_back(const T& arg) { + if (detail::const_check(need_copy::value)) + emplace_arg(dynamic_args_.push>(arg)); + else + emplace_arg(detail::unwrap(arg)); + } + + /** + \rst + Adds a reference to the argument into the dynamic store for later passing to + a formatting function. + + **Example**:: + + fmt::dynamic_format_arg_store store; + char band[] = "Rolling Stones"; + store.push_back(std::cref(band)); + band[9] = 'c'; // Changing str affects the output. + std::string result = fmt::vformat("{}", store); + // result == "Rolling Scones" + \endrst + */ + template void push_back(std::reference_wrapper arg) { + static_assert( + need_copy::value, + "objects of built-in types and string views are always copied"); + emplace_arg(arg.get()); + } + + /** + Adds named argument into the dynamic store for later passing to a formatting + function. ``std::reference_wrapper`` is supported to avoid copying of the + argument. The name is always copied into the store. + */ + template + void push_back(const detail::named_arg& arg) { + const char_type* arg_name = + dynamic_args_.push>(arg.name).c_str(); + if (detail::const_check(need_copy::value)) { + emplace_arg( + fmt::arg(arg_name, dynamic_args_.push>(arg.value))); + } else { + emplace_arg(fmt::arg(arg_name, arg.value)); + } + } + + /** Erase all elements from the store */ + void clear() { + data_.clear(); + named_info_.clear(); + dynamic_args_ = detail::dynamic_arg_list(); + } + + /** + \rst + Reserves space to store at least *new_cap* arguments including + *new_cap_named* named arguments. + \endrst + */ + void reserve(size_t new_cap, size_t new_cap_named) { + FMT_ASSERT(new_cap >= new_cap_named, + "Set of arguments includes set of named arguments"); + data_.reserve(new_cap); + named_info_.reserve(new_cap_named); + } +}; + +FMT_END_NAMESPACE + +#endif // FMT_ARGS_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/chrono.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/chrono.h new file mode 100644 index 0000000..b112f76 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/chrono.h @@ -0,0 +1,2069 @@ +// Formatting library for C++ - chrono support +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CHRONO_H_ +#define FMT_CHRONO_H_ + +#include +#include +#include // std::isfinite +#include // std::memcpy +#include +#include +#include +#include +#include + +#include "format.h" + +FMT_BEGIN_NAMESPACE + +// Enable tzset. +#ifndef FMT_USE_TZSET +// UWP doesn't provide _tzset. +# if FMT_HAS_INCLUDE("winapifamily.h") +# include +# endif +# if defined(_WIN32) && (!defined(WINAPI_FAMILY) || \ + (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)) +# define FMT_USE_TZSET 1 +# else +# define FMT_USE_TZSET 0 +# endif +#endif + +// Enable safe chrono durations, unless explicitly disabled. +#ifndef FMT_SAFE_DURATION_CAST +# define FMT_SAFE_DURATION_CAST 1 +#endif +#if FMT_SAFE_DURATION_CAST + +// For conversion between std::chrono::durations without undefined +// behaviour or erroneous results. +// This is a stripped down version of duration_cast, for inclusion in fmt. +// See https://github.com/pauldreik/safe_duration_cast +// +// Copyright Paul Dreik 2019 +namespace safe_duration_cast { + +template ::value && + std::numeric_limits::is_signed == + std::numeric_limits::is_signed)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + using F = std::numeric_limits; + using T = std::numeric_limits; + static_assert(F::is_integer, "From must be integral"); + static_assert(T::is_integer, "To must be integral"); + + // A and B are both signed, or both unsigned. + if (detail::const_check(F::digits <= T::digits)) { + // From fits in To without any problem. + } else { + // From does not always fit in To, resort to a dynamic check. + if (from < (T::min)() || from > (T::max)()) { + // outside range. + ec = 1; + return {}; + } + } + return static_cast(from); +} + +/** + * converts From to To, without loss. If the dynamic value of from + * can't be converted to To without loss, ec is set. + */ +template ::value && + std::numeric_limits::is_signed != + std::numeric_limits::is_signed)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + using F = std::numeric_limits; + using T = std::numeric_limits; + static_assert(F::is_integer, "From must be integral"); + static_assert(T::is_integer, "To must be integral"); + + if (detail::const_check(F::is_signed && !T::is_signed)) { + // From may be negative, not allowed! + if (fmt::detail::is_negative(from)) { + ec = 1; + return {}; + } + // From is positive. Can it always fit in To? + if (detail::const_check(F::digits > T::digits) && + from > static_cast(detail::max_value())) { + ec = 1; + return {}; + } + } + + if (detail::const_check(!F::is_signed && T::is_signed && + F::digits >= T::digits) && + from > static_cast(detail::max_value())) { + ec = 1; + return {}; + } + return static_cast(from); // Lossless conversion. +} + +template ::value)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + return from; +} // function + +// clang-format off +/** + * converts From to To if possible, otherwise ec is set. + * + * input | output + * ---------------------------------|--------------- + * NaN | NaN + * Inf | Inf + * normal, fits in output | converted (possibly lossy) + * normal, does not fit in output | ec is set + * subnormal | best effort + * -Inf | -Inf + */ +// clang-format on +template ::value)> +FMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) { + ec = 0; + using T = std::numeric_limits; + static_assert(std::is_floating_point::value, "From must be floating"); + static_assert(std::is_floating_point::value, "To must be floating"); + + // catch the only happy case + if (std::isfinite(from)) { + if (from >= T::lowest() && from <= (T::max)()) { + return static_cast(from); + } + // not within range. + ec = 1; + return {}; + } + + // nan and inf will be preserved + return static_cast(from); +} // function + +template ::value)> +FMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) { + ec = 0; + static_assert(std::is_floating_point::value, "From must be floating"); + return from; +} + +/** + * safe duration cast between integral durations + */ +template ::value), + FMT_ENABLE_IF(std::is_integral::value)> +To safe_duration_cast(std::chrono::duration from, + int& ec) { + using From = std::chrono::duration; + ec = 0; + // the basic idea is that we need to convert from count() in the from type + // to count() in the To type, by multiplying it with this: + struct Factor + : std::ratio_divide {}; + + static_assert(Factor::num > 0, "num must be positive"); + static_assert(Factor::den > 0, "den must be positive"); + + // the conversion is like this: multiply from.count() with Factor::num + // /Factor::den and convert it to To::rep, all this without + // overflow/underflow. let's start by finding a suitable type that can hold + // both To, From and Factor::num + using IntermediateRep = + typename std::common_type::type; + + // safe conversion to IntermediateRep + IntermediateRep count = + lossless_integral_conversion(from.count(), ec); + if (ec) return {}; + // multiply with Factor::num without overflow or underflow + if (detail::const_check(Factor::num != 1)) { + const auto max1 = detail::max_value() / Factor::num; + if (count > max1) { + ec = 1; + return {}; + } + const auto min1 = + (std::numeric_limits::min)() / Factor::num; + if (!std::is_unsigned::value && count < min1) { + ec = 1; + return {}; + } + count *= Factor::num; + } + + if (detail::const_check(Factor::den != 1)) count /= Factor::den; + auto tocount = lossless_integral_conversion(count, ec); + return ec ? To() : To(tocount); +} + +/** + * safe duration_cast between floating point durations + */ +template ::value), + FMT_ENABLE_IF(std::is_floating_point::value)> +To safe_duration_cast(std::chrono::duration from, + int& ec) { + using From = std::chrono::duration; + ec = 0; + if (std::isnan(from.count())) { + // nan in, gives nan out. easy. + return To{std::numeric_limits::quiet_NaN()}; + } + // maybe we should also check if from is denormal, and decide what to do about + // it. + + // +-inf should be preserved. + if (std::isinf(from.count())) { + return To{from.count()}; + } + + // the basic idea is that we need to convert from count() in the from type + // to count() in the To type, by multiplying it with this: + struct Factor + : std::ratio_divide {}; + + static_assert(Factor::num > 0, "num must be positive"); + static_assert(Factor::den > 0, "den must be positive"); + + // the conversion is like this: multiply from.count() with Factor::num + // /Factor::den and convert it to To::rep, all this without + // overflow/underflow. let's start by finding a suitable type that can hold + // both To, From and Factor::num + using IntermediateRep = + typename std::common_type::type; + + // force conversion of From::rep -> IntermediateRep to be safe, + // even if it will never happen be narrowing in this context. + IntermediateRep count = + safe_float_conversion(from.count(), ec); + if (ec) { + return {}; + } + + // multiply with Factor::num without overflow or underflow + if (detail::const_check(Factor::num != 1)) { + constexpr auto max1 = detail::max_value() / + static_cast(Factor::num); + if (count > max1) { + ec = 1; + return {}; + } + constexpr auto min1 = std::numeric_limits::lowest() / + static_cast(Factor::num); + if (count < min1) { + ec = 1; + return {}; + } + count *= static_cast(Factor::num); + } + + // this can't go wrong, right? den>0 is checked earlier. + if (detail::const_check(Factor::den != 1)) { + using common_t = typename std::common_type::type; + count /= static_cast(Factor::den); + } + + // convert to the to type, safely + using ToRep = typename To::rep; + + const ToRep tocount = safe_float_conversion(count, ec); + if (ec) { + return {}; + } + return To{tocount}; +} +} // namespace safe_duration_cast +#endif + +// Prevents expansion of a preceding token as a function-style macro. +// Usage: f FMT_NOMACRO() +#define FMT_NOMACRO + +namespace detail { +template struct null {}; +inline null<> localtime_r FMT_NOMACRO(...) { return null<>(); } +inline null<> localtime_s(...) { return null<>(); } +inline null<> gmtime_r(...) { return null<>(); } +inline null<> gmtime_s(...) { return null<>(); } + +inline const std::locale& get_classic_locale() { + static const auto& locale = std::locale::classic(); + return locale; +} + +template struct codecvt_result { + static constexpr const size_t max_size = 32; + CodeUnit buf[max_size]; + CodeUnit* end; +}; +template +constexpr const size_t codecvt_result::max_size; + +template +void write_codecvt(codecvt_result& out, string_view in_buf, + const std::locale& loc) { +#if FMT_CLANG_VERSION +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated" + auto& f = std::use_facet>(loc); +# pragma clang diagnostic pop +#else + auto& f = std::use_facet>(loc); +#endif + auto mb = std::mbstate_t(); + const char* from_next = nullptr; + auto result = f.in(mb, in_buf.begin(), in_buf.end(), from_next, + std::begin(out.buf), std::end(out.buf), out.end); + if (result != std::codecvt_base::ok) + FMT_THROW(format_error("failed to format time")); +} + +template +auto write_encoded_tm_str(OutputIt out, string_view in, const std::locale& loc) + -> OutputIt { + if (detail::is_utf8() && loc != get_classic_locale()) { + // char16_t and char32_t codecvts are broken in MSVC (linkage errors) and + // gcc-4. +#if FMT_MSC_VERSION != 0 || \ + (defined(__GLIBCXX__) && !defined(_GLIBCXX_USE_DUAL_ABI)) + // The _GLIBCXX_USE_DUAL_ABI macro is always defined in libstdc++ from gcc-5 + // and newer. + using code_unit = wchar_t; +#else + using code_unit = char32_t; +#endif + + using unit_t = codecvt_result; + unit_t unit; + write_codecvt(unit, in, loc); + // In UTF-8 is used one to four one-byte code units. + auto&& buf = basic_memory_buffer(); + for (code_unit* p = unit.buf; p != unit.end; ++p) { + uint32_t c = static_cast(*p); + if (sizeof(code_unit) == 2 && c >= 0xd800 && c <= 0xdfff) { + // surrogate pair + ++p; + if (p == unit.end || (c & 0xfc00) != 0xd800 || + (*p & 0xfc00) != 0xdc00) { + FMT_THROW(format_error("failed to format time")); + } + c = (c << 10) + static_cast(*p) - 0x35fdc00; + } + if (c < 0x80) { + buf.push_back(static_cast(c)); + } else if (c < 0x800) { + buf.push_back(static_cast(0xc0 | (c >> 6))); + buf.push_back(static_cast(0x80 | (c & 0x3f))); + } else if ((c >= 0x800 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xffff)) { + buf.push_back(static_cast(0xe0 | (c >> 12))); + buf.push_back(static_cast(0x80 | ((c & 0xfff) >> 6))); + buf.push_back(static_cast(0x80 | (c & 0x3f))); + } else if (c >= 0x10000 && c <= 0x10ffff) { + buf.push_back(static_cast(0xf0 | (c >> 18))); + buf.push_back(static_cast(0x80 | ((c & 0x3ffff) >> 12))); + buf.push_back(static_cast(0x80 | ((c & 0xfff) >> 6))); + buf.push_back(static_cast(0x80 | (c & 0x3f))); + } else { + FMT_THROW(format_error("failed to format time")); + } + } + return copy_str(buf.data(), buf.data() + buf.size(), out); + } + return copy_str(in.data(), in.data() + in.size(), out); +} + +template ::value)> +auto write_tm_str(OutputIt out, string_view sv, const std::locale& loc) + -> OutputIt { + codecvt_result unit; + write_codecvt(unit, sv, loc); + return copy_str(unit.buf, unit.end, out); +} + +template ::value)> +auto write_tm_str(OutputIt out, string_view sv, const std::locale& loc) + -> OutputIt { + return write_encoded_tm_str(out, sv, loc); +} + +template +inline void do_write(buffer& buf, const std::tm& time, + const std::locale& loc, char format, char modifier) { + auto&& format_buf = formatbuf>(buf); + auto&& os = std::basic_ostream(&format_buf); + os.imbue(loc); + using iterator = std::ostreambuf_iterator; + const auto& facet = std::use_facet>(loc); + auto end = facet.put(os, os, Char(' '), &time, format, modifier); + if (end.failed()) FMT_THROW(format_error("failed to format time")); +} + +template ::value)> +auto write(OutputIt out, const std::tm& time, const std::locale& loc, + char format, char modifier = 0) -> OutputIt { + auto&& buf = get_buffer(out); + do_write(buf, time, loc, format, modifier); + return buf.out(); +} + +template ::value)> +auto write(OutputIt out, const std::tm& time, const std::locale& loc, + char format, char modifier = 0) -> OutputIt { + auto&& buf = basic_memory_buffer(); + do_write(buf, time, loc, format, modifier); + return write_encoded_tm_str(out, string_view(buf.data(), buf.size()), loc); +} + +} // namespace detail + +FMT_MODULE_EXPORT_BEGIN + +/** + Converts given time since epoch as ``std::time_t`` value into calendar time, + expressed in local time. Unlike ``std::localtime``, this function is + thread-safe on most platforms. + */ +inline std::tm localtime(std::time_t time) { + struct dispatcher { + std::time_t time_; + std::tm tm_; + + dispatcher(std::time_t t) : time_(t) {} + + bool run() { + using namespace fmt::detail; + return handle(localtime_r(&time_, &tm_)); + } + + bool handle(std::tm* tm) { return tm != nullptr; } + + bool handle(detail::null<>) { + using namespace fmt::detail; + return fallback(localtime_s(&tm_, &time_)); + } + + bool fallback(int res) { return res == 0; } + +#if !FMT_MSC_VERSION + bool fallback(detail::null<>) { + using namespace fmt::detail; + std::tm* tm = std::localtime(&time_); + if (tm) tm_ = *tm; + return tm != nullptr; + } +#endif + }; + dispatcher lt(time); + // Too big time values may be unsupported. + if (!lt.run()) FMT_THROW(format_error("time_t value out of range")); + return lt.tm_; +} + +inline std::tm localtime( + std::chrono::time_point time_point) { + return localtime(std::chrono::system_clock::to_time_t(time_point)); +} + +/** + Converts given time since epoch as ``std::time_t`` value into calendar time, + expressed in Coordinated Universal Time (UTC). Unlike ``std::gmtime``, this + function is thread-safe on most platforms. + */ +inline std::tm gmtime(std::time_t time) { + struct dispatcher { + std::time_t time_; + std::tm tm_; + + dispatcher(std::time_t t) : time_(t) {} + + bool run() { + using namespace fmt::detail; + return handle(gmtime_r(&time_, &tm_)); + } + + bool handle(std::tm* tm) { return tm != nullptr; } + + bool handle(detail::null<>) { + using namespace fmt::detail; + return fallback(gmtime_s(&tm_, &time_)); + } + + bool fallback(int res) { return res == 0; } + +#if !FMT_MSC_VERSION + bool fallback(detail::null<>) { + std::tm* tm = std::gmtime(&time_); + if (tm) tm_ = *tm; + return tm != nullptr; + } +#endif + }; + dispatcher gt(time); + // Too big time values may be unsupported. + if (!gt.run()) FMT_THROW(format_error("time_t value out of range")); + return gt.tm_; +} + +inline std::tm gmtime( + std::chrono::time_point time_point) { + return gmtime(std::chrono::system_clock::to_time_t(time_point)); +} + +FMT_BEGIN_DETAIL_NAMESPACE + +// Writes two-digit numbers a, b and c separated by sep to buf. +// The method by Pavel Novikov based on +// https://johnnylee-sde.github.io/Fast-unsigned-integer-to-time-string/. +inline void write_digit2_separated(char* buf, unsigned a, unsigned b, + unsigned c, char sep) { + unsigned long long digits = + a | (b << 24) | (static_cast(c) << 48); + // Convert each value to BCD. + // We have x = a * 10 + b and we want to convert it to BCD y = a * 16 + b. + // The difference is + // y - x = a * 6 + // a can be found from x: + // a = floor(x / 10) + // then + // y = x + a * 6 = x + floor(x / 10) * 6 + // floor(x / 10) is (x * 205) >> 11 (needs 16 bits). + digits += (((digits * 205) >> 11) & 0x000f00000f00000f) * 6; + // Put low nibbles to high bytes and high nibbles to low bytes. + digits = ((digits & 0x00f00000f00000f0) >> 4) | + ((digits & 0x000f00000f00000f) << 8); + auto usep = static_cast(sep); + // Add ASCII '0' to each digit byte and insert separators. + digits |= 0x3030003030003030 | (usep << 16) | (usep << 40); + + constexpr const size_t len = 8; + if (const_check(is_big_endian())) { + char tmp[len]; + std::memcpy(tmp, &digits, len); + std::reverse_copy(tmp, tmp + len, buf); + } else { + std::memcpy(buf, &digits, len); + } +} + +template FMT_CONSTEXPR inline const char* get_units() { + if (std::is_same::value) return "as"; + if (std::is_same::value) return "fs"; + if (std::is_same::value) return "ps"; + if (std::is_same::value) return "ns"; + if (std::is_same::value) return "µs"; + if (std::is_same::value) return "ms"; + if (std::is_same::value) return "cs"; + if (std::is_same::value) return "ds"; + if (std::is_same>::value) return "s"; + if (std::is_same::value) return "das"; + if (std::is_same::value) return "hs"; + if (std::is_same::value) return "ks"; + if (std::is_same::value) return "Ms"; + if (std::is_same::value) return "Gs"; + if (std::is_same::value) return "Ts"; + if (std::is_same::value) return "Ps"; + if (std::is_same::value) return "Es"; + if (std::is_same>::value) return "m"; + if (std::is_same>::value) return "h"; + return nullptr; +} + +enum class numeric_system { + standard, + // Alternative numeric system, e.g. å二 instead of 12 in ja_JP locale. + alternative +}; + +// Parses a put_time-like format string and invokes handler actions. +template +FMT_CONSTEXPR const Char* parse_chrono_format(const Char* begin, + const Char* end, + Handler&& handler) { + auto ptr = begin; + while (ptr != end) { + auto c = *ptr; + if (c == '}') break; + if (c != '%') { + ++ptr; + continue; + } + if (begin != ptr) handler.on_text(begin, ptr); + ++ptr; // consume '%' + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case '%': + handler.on_text(ptr - 1, ptr); + break; + case 'n': { + const Char newline[] = {'\n'}; + handler.on_text(newline, newline + 1); + break; + } + case 't': { + const Char tab[] = {'\t'}; + handler.on_text(tab, tab + 1); + break; + } + // Year: + case 'Y': + handler.on_year(numeric_system::standard); + break; + case 'y': + handler.on_short_year(numeric_system::standard); + break; + case 'C': + handler.on_century(numeric_system::standard); + break; + case 'G': + handler.on_iso_week_based_year(); + break; + case 'g': + handler.on_iso_week_based_short_year(); + break; + // Day of the week: + case 'a': + handler.on_abbr_weekday(); + break; + case 'A': + handler.on_full_weekday(); + break; + case 'w': + handler.on_dec0_weekday(numeric_system::standard); + break; + case 'u': + handler.on_dec1_weekday(numeric_system::standard); + break; + // Month: + case 'b': + case 'h': + handler.on_abbr_month(); + break; + case 'B': + handler.on_full_month(); + break; + case 'm': + handler.on_dec_month(numeric_system::standard); + break; + // Day of the year/month: + case 'U': + handler.on_dec0_week_of_year(numeric_system::standard); + break; + case 'W': + handler.on_dec1_week_of_year(numeric_system::standard); + break; + case 'V': + handler.on_iso_week_of_year(numeric_system::standard); + break; + case 'j': + handler.on_day_of_year(); + break; + case 'd': + handler.on_day_of_month(numeric_system::standard); + break; + case 'e': + handler.on_day_of_month_space(numeric_system::standard); + break; + // Hour, minute, second: + case 'H': + handler.on_24_hour(numeric_system::standard); + break; + case 'I': + handler.on_12_hour(numeric_system::standard); + break; + case 'M': + handler.on_minute(numeric_system::standard); + break; + case 'S': + handler.on_second(numeric_system::standard); + break; + // Other: + case 'c': + handler.on_datetime(numeric_system::standard); + break; + case 'x': + handler.on_loc_date(numeric_system::standard); + break; + case 'X': + handler.on_loc_time(numeric_system::standard); + break; + case 'D': + handler.on_us_date(); + break; + case 'F': + handler.on_iso_date(); + break; + case 'r': + handler.on_12_hour_time(); + break; + case 'R': + handler.on_24_hour_time(); + break; + case 'T': + handler.on_iso_time(); + break; + case 'p': + handler.on_am_pm(); + break; + case 'Q': + handler.on_duration_value(); + break; + case 'q': + handler.on_duration_unit(); + break; + case 'z': + handler.on_utc_offset(); + break; + case 'Z': + handler.on_tz_name(); + break; + // Alternative representation: + case 'E': { + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case 'Y': + handler.on_year(numeric_system::alternative); + break; + case 'y': + handler.on_offset_year(); + break; + case 'C': + handler.on_century(numeric_system::alternative); + break; + case 'c': + handler.on_datetime(numeric_system::alternative); + break; + case 'x': + handler.on_loc_date(numeric_system::alternative); + break; + case 'X': + handler.on_loc_time(numeric_system::alternative); + break; + default: + FMT_THROW(format_error("invalid format")); + } + break; + } + case 'O': + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case 'y': + handler.on_short_year(numeric_system::alternative); + break; + case 'm': + handler.on_dec_month(numeric_system::alternative); + break; + case 'U': + handler.on_dec0_week_of_year(numeric_system::alternative); + break; + case 'W': + handler.on_dec1_week_of_year(numeric_system::alternative); + break; + case 'V': + handler.on_iso_week_of_year(numeric_system::alternative); + break; + case 'd': + handler.on_day_of_month(numeric_system::alternative); + break; + case 'e': + handler.on_day_of_month_space(numeric_system::alternative); + break; + case 'w': + handler.on_dec0_weekday(numeric_system::alternative); + break; + case 'u': + handler.on_dec1_weekday(numeric_system::alternative); + break; + case 'H': + handler.on_24_hour(numeric_system::alternative); + break; + case 'I': + handler.on_12_hour(numeric_system::alternative); + break; + case 'M': + handler.on_minute(numeric_system::alternative); + break; + case 'S': + handler.on_second(numeric_system::alternative); + break; + default: + FMT_THROW(format_error("invalid format")); + } + break; + default: + FMT_THROW(format_error("invalid format")); + } + begin = ptr; + } + if (begin != ptr) handler.on_text(begin, ptr); + return ptr; +} + +template struct null_chrono_spec_handler { + FMT_CONSTEXPR void unsupported() { + static_cast(this)->unsupported(); + } + FMT_CONSTEXPR void on_year(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_short_year(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_offset_year() { unsupported(); } + FMT_CONSTEXPR void on_century(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_iso_week_based_year() { unsupported(); } + FMT_CONSTEXPR void on_iso_week_based_short_year() { unsupported(); } + FMT_CONSTEXPR void on_abbr_weekday() { unsupported(); } + FMT_CONSTEXPR void on_full_weekday() { unsupported(); } + FMT_CONSTEXPR void on_dec0_weekday(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_dec1_weekday(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_abbr_month() { unsupported(); } + FMT_CONSTEXPR void on_full_month() { unsupported(); } + FMT_CONSTEXPR void on_dec_month(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_dec0_week_of_year(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_dec1_week_of_year(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_iso_week_of_year(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_day_of_year() { unsupported(); } + FMT_CONSTEXPR void on_day_of_month(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_day_of_month_space(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_24_hour(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_12_hour(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_minute(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_second(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_datetime(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_loc_date(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_loc_time(numeric_system) { unsupported(); } + FMT_CONSTEXPR void on_us_date() { unsupported(); } + FMT_CONSTEXPR void on_iso_date() { unsupported(); } + FMT_CONSTEXPR void on_12_hour_time() { unsupported(); } + FMT_CONSTEXPR void on_24_hour_time() { unsupported(); } + FMT_CONSTEXPR void on_iso_time() { unsupported(); } + FMT_CONSTEXPR void on_am_pm() { unsupported(); } + FMT_CONSTEXPR void on_duration_value() { unsupported(); } + FMT_CONSTEXPR void on_duration_unit() { unsupported(); } + FMT_CONSTEXPR void on_utc_offset() { unsupported(); } + FMT_CONSTEXPR void on_tz_name() { unsupported(); } +}; + +struct tm_format_checker : null_chrono_spec_handler { + FMT_NORETURN void unsupported() { FMT_THROW(format_error("no format")); } + + template + FMT_CONSTEXPR void on_text(const Char*, const Char*) {} + FMT_CONSTEXPR void on_year(numeric_system) {} + FMT_CONSTEXPR void on_short_year(numeric_system) {} + FMT_CONSTEXPR void on_offset_year() {} + FMT_CONSTEXPR void on_century(numeric_system) {} + FMT_CONSTEXPR void on_iso_week_based_year() {} + FMT_CONSTEXPR void on_iso_week_based_short_year() {} + FMT_CONSTEXPR void on_abbr_weekday() {} + FMT_CONSTEXPR void on_full_weekday() {} + FMT_CONSTEXPR void on_dec0_weekday(numeric_system) {} + FMT_CONSTEXPR void on_dec1_weekday(numeric_system) {} + FMT_CONSTEXPR void on_abbr_month() {} + FMT_CONSTEXPR void on_full_month() {} + FMT_CONSTEXPR void on_dec_month(numeric_system) {} + FMT_CONSTEXPR void on_dec0_week_of_year(numeric_system) {} + FMT_CONSTEXPR void on_dec1_week_of_year(numeric_system) {} + FMT_CONSTEXPR void on_iso_week_of_year(numeric_system) {} + FMT_CONSTEXPR void on_day_of_year() {} + FMT_CONSTEXPR void on_day_of_month(numeric_system) {} + FMT_CONSTEXPR void on_day_of_month_space(numeric_system) {} + FMT_CONSTEXPR void on_24_hour(numeric_system) {} + FMT_CONSTEXPR void on_12_hour(numeric_system) {} + FMT_CONSTEXPR void on_minute(numeric_system) {} + FMT_CONSTEXPR void on_second(numeric_system) {} + FMT_CONSTEXPR void on_datetime(numeric_system) {} + FMT_CONSTEXPR void on_loc_date(numeric_system) {} + FMT_CONSTEXPR void on_loc_time(numeric_system) {} + FMT_CONSTEXPR void on_us_date() {} + FMT_CONSTEXPR void on_iso_date() {} + FMT_CONSTEXPR void on_12_hour_time() {} + FMT_CONSTEXPR void on_24_hour_time() {} + FMT_CONSTEXPR void on_iso_time() {} + FMT_CONSTEXPR void on_am_pm() {} + FMT_CONSTEXPR void on_utc_offset() {} + FMT_CONSTEXPR void on_tz_name() {} +}; + +inline const char* tm_wday_full_name(int wday) { + static constexpr const char* full_name_list[] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + return wday >= 0 && wday <= 6 ? full_name_list[wday] : "?"; +} +inline const char* tm_wday_short_name(int wday) { + static constexpr const char* short_name_list[] = {"Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat"}; + return wday >= 0 && wday <= 6 ? short_name_list[wday] : "???"; +} + +inline const char* tm_mon_full_name(int mon) { + static constexpr const char* full_name_list[] = { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; + return mon >= 0 && mon <= 11 ? full_name_list[mon] : "?"; +} +inline const char* tm_mon_short_name(int mon) { + static constexpr const char* short_name_list[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + }; + return mon >= 0 && mon <= 11 ? short_name_list[mon] : "???"; +} + +template +struct has_member_data_tm_gmtoff : std::false_type {}; +template +struct has_member_data_tm_gmtoff> + : std::true_type {}; + +template +struct has_member_data_tm_zone : std::false_type {}; +template +struct has_member_data_tm_zone> + : std::true_type {}; + +#if FMT_USE_TZSET +inline void tzset_once() { + static bool init = []() -> bool { + _tzset(); + return true; + }(); + ignore_unused(init); +} +#endif + +template class tm_writer { + private: + static constexpr int days_per_week = 7; + + const std::locale& loc_; + const bool is_classic_; + OutputIt out_; + const std::tm& tm_; + + auto tm_sec() const noexcept -> int { + FMT_ASSERT(tm_.tm_sec >= 0 && tm_.tm_sec <= 61, ""); + return tm_.tm_sec; + } + auto tm_min() const noexcept -> int { + FMT_ASSERT(tm_.tm_min >= 0 && tm_.tm_min <= 59, ""); + return tm_.tm_min; + } + auto tm_hour() const noexcept -> int { + FMT_ASSERT(tm_.tm_hour >= 0 && tm_.tm_hour <= 23, ""); + return tm_.tm_hour; + } + auto tm_mday() const noexcept -> int { + FMT_ASSERT(tm_.tm_mday >= 1 && tm_.tm_mday <= 31, ""); + return tm_.tm_mday; + } + auto tm_mon() const noexcept -> int { + FMT_ASSERT(tm_.tm_mon >= 0 && tm_.tm_mon <= 11, ""); + return tm_.tm_mon; + } + auto tm_year() const noexcept -> long long { return 1900ll + tm_.tm_year; } + auto tm_wday() const noexcept -> int { + FMT_ASSERT(tm_.tm_wday >= 0 && tm_.tm_wday <= 6, ""); + return tm_.tm_wday; + } + auto tm_yday() const noexcept -> int { + FMT_ASSERT(tm_.tm_yday >= 0 && tm_.tm_yday <= 365, ""); + return tm_.tm_yday; + } + + auto tm_hour12() const noexcept -> int { + const auto h = tm_hour(); + const auto z = h < 12 ? h : h - 12; + return z == 0 ? 12 : z; + } + + // POSIX and the C Standard are unclear or inconsistent about what %C and %y + // do if the year is negative or exceeds 9999. Use the convention that %C + // concatenated with %y yields the same output as %Y, and that %Y contains at + // least 4 characters, with more only if necessary. + auto split_year_lower(long long year) const noexcept -> int { + auto l = year % 100; + if (l < 0) l = -l; // l in [0, 99] + return static_cast(l); + } + + // Algorithm: + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_the_week_number_from_a_month_and_day_of_the_month_or_ordinal_date + auto iso_year_weeks(long long curr_year) const noexcept -> int { + const auto prev_year = curr_year - 1; + const auto curr_p = + (curr_year + curr_year / 4 - curr_year / 100 + curr_year / 400) % + days_per_week; + const auto prev_p = + (prev_year + prev_year / 4 - prev_year / 100 + prev_year / 400) % + days_per_week; + return 52 + ((curr_p == 4 || prev_p == 3) ? 1 : 0); + } + auto iso_week_num(int tm_yday, int tm_wday) const noexcept -> int { + return (tm_yday + 11 - (tm_wday == 0 ? days_per_week : tm_wday)) / + days_per_week; + } + auto tm_iso_week_year() const noexcept -> long long { + const auto year = tm_year(); + const auto w = iso_week_num(tm_yday(), tm_wday()); + if (w < 1) return year - 1; + if (w > iso_year_weeks(year)) return year + 1; + return year; + } + auto tm_iso_week_of_year() const noexcept -> int { + const auto year = tm_year(); + const auto w = iso_week_num(tm_yday(), tm_wday()); + if (w < 1) return iso_year_weeks(year - 1); + if (w > iso_year_weeks(year)) return 1; + return w; + } + + void write1(int value) { + *out_++ = static_cast('0' + to_unsigned(value) % 10); + } + void write2(int value) { + const char* d = digits2(to_unsigned(value) % 100); + *out_++ = *d++; + *out_++ = *d; + } + + void write_year_extended(long long year) { + // At least 4 characters. + int width = 4; + if (year < 0) { + *out_++ = '-'; + year = 0 - year; + --width; + } + uint32_or_64_or_128_t n = to_unsigned(year); + const int num_digits = count_digits(n); + if (width > num_digits) out_ = std::fill_n(out_, width - num_digits, '0'); + out_ = format_decimal(out_, n, num_digits).end; + } + void write_year(long long year) { + if (year >= 0 && year < 10000) { + write2(static_cast(year / 100)); + write2(static_cast(year % 100)); + } else { + write_year_extended(year); + } + } + + void write_utc_offset(long offset) { + if (offset < 0) { + *out_++ = '-'; + offset = -offset; + } else { + *out_++ = '+'; + } + offset /= 60; + write2(static_cast(offset / 60)); + write2(static_cast(offset % 60)); + } + template ::value)> + void format_utc_offset_impl(const T& tm) { + write_utc_offset(tm.tm_gmtoff); + } + template ::value)> + void format_utc_offset_impl(const T& tm) { +#if defined(_WIN32) && defined(_UCRT) +# if FMT_USE_TZSET + tzset_once(); +# endif + long offset = 0; + _get_timezone(&offset); + if (tm.tm_isdst) { + long dstbias = 0; + _get_dstbias(&dstbias); + offset += dstbias; + } + write_utc_offset(-offset); +#else + ignore_unused(tm); + format_localized('z'); +#endif + } + + template ::value)> + void format_tz_name_impl(const T& tm) { + if (is_classic_) + out_ = write_tm_str(out_, tm.tm_zone, loc_); + else + format_localized('Z'); + } + template ::value)> + void format_tz_name_impl(const T&) { + format_localized('Z'); + } + + void format_localized(char format, char modifier = 0) { + out_ = write(out_, tm_, loc_, format, modifier); + } + + public: + tm_writer(const std::locale& loc, OutputIt out, const std::tm& tm) + : loc_(loc), + is_classic_(loc_ == get_classic_locale()), + out_(out), + tm_(tm) {} + + OutputIt out() const { return out_; } + + FMT_CONSTEXPR void on_text(const Char* begin, const Char* end) { + out_ = copy_str(begin, end, out_); + } + + void on_abbr_weekday() { + if (is_classic_) + out_ = write(out_, tm_wday_short_name(tm_wday())); + else + format_localized('a'); + } + void on_full_weekday() { + if (is_classic_) + out_ = write(out_, tm_wday_full_name(tm_wday())); + else + format_localized('A'); + } + void on_dec0_weekday(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) return write1(tm_wday()); + format_localized('w', 'O'); + } + void on_dec1_weekday(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) { + auto wday = tm_wday(); + write1(wday == 0 ? days_per_week : wday); + } else { + format_localized('u', 'O'); + } + } + + void on_abbr_month() { + if (is_classic_) + out_ = write(out_, tm_mon_short_name(tm_mon())); + else + format_localized('b'); + } + void on_full_month() { + if (is_classic_) + out_ = write(out_, tm_mon_full_name(tm_mon())); + else + format_localized('B'); + } + + void on_datetime(numeric_system ns) { + if (is_classic_) { + on_abbr_weekday(); + *out_++ = ' '; + on_abbr_month(); + *out_++ = ' '; + on_day_of_month_space(numeric_system::standard); + *out_++ = ' '; + on_iso_time(); + *out_++ = ' '; + on_year(numeric_system::standard); + } else { + format_localized('c', ns == numeric_system::standard ? '\0' : 'E'); + } + } + void on_loc_date(numeric_system ns) { + if (is_classic_) + on_us_date(); + else + format_localized('x', ns == numeric_system::standard ? '\0' : 'E'); + } + void on_loc_time(numeric_system ns) { + if (is_classic_) + on_iso_time(); + else + format_localized('X', ns == numeric_system::standard ? '\0' : 'E'); + } + void on_us_date() { + char buf[8]; + write_digit2_separated(buf, to_unsigned(tm_mon() + 1), + to_unsigned(tm_mday()), + to_unsigned(split_year_lower(tm_year())), '/'); + out_ = copy_str(std::begin(buf), std::end(buf), out_); + } + void on_iso_date() { + auto year = tm_year(); + char buf[10]; + size_t offset = 0; + if (year >= 0 && year < 10000) { + copy2(buf, digits2(static_cast(year / 100))); + } else { + offset = 4; + write_year_extended(year); + year = 0; + } + write_digit2_separated(buf + 2, static_cast(year % 100), + to_unsigned(tm_mon() + 1), to_unsigned(tm_mday()), + '-'); + out_ = copy_str(std::begin(buf) + offset, std::end(buf), out_); + } + + void on_utc_offset() { format_utc_offset_impl(tm_); } + void on_tz_name() { format_tz_name_impl(tm_); } + + void on_year(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write_year(tm_year()); + format_localized('Y', 'E'); + } + void on_short_year(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write2(split_year_lower(tm_year())); + format_localized('y', 'O'); + } + void on_offset_year() { + if (is_classic_) return write2(split_year_lower(tm_year())); + format_localized('y', 'E'); + } + + void on_century(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) { + auto year = tm_year(); + auto upper = year / 100; + if (year >= -99 && year < 0) { + // Zero upper on negative year. + *out_++ = '-'; + *out_++ = '0'; + } else if (upper >= 0 && upper < 100) { + write2(static_cast(upper)); + } else { + out_ = write(out_, upper); + } + } else { + format_localized('C', 'E'); + } + } + + void on_dec_month(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write2(tm_mon() + 1); + format_localized('m', 'O'); + } + + void on_dec0_week_of_year(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write2((tm_yday() + days_per_week - tm_wday()) / days_per_week); + format_localized('U', 'O'); + } + void on_dec1_week_of_year(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) { + auto wday = tm_wday(); + write2((tm_yday() + days_per_week - + (wday == 0 ? (days_per_week - 1) : (wday - 1))) / + days_per_week); + } else { + format_localized('W', 'O'); + } + } + void on_iso_week_of_year(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write2(tm_iso_week_of_year()); + format_localized('V', 'O'); + } + + void on_iso_week_based_year() { write_year(tm_iso_week_year()); } + void on_iso_week_based_short_year() { + write2(split_year_lower(tm_iso_week_year())); + } + + void on_day_of_year() { + auto yday = tm_yday() + 1; + write1(yday / 100); + write2(yday % 100); + } + void on_day_of_month(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) return write2(tm_mday()); + format_localized('d', 'O'); + } + void on_day_of_month_space(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) { + auto mday = to_unsigned(tm_mday()) % 100; + const char* d2 = digits2(mday); + *out_++ = mday < 10 ? ' ' : d2[0]; + *out_++ = d2[1]; + } else { + format_localized('e', 'O'); + } + } + + void on_24_hour(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) return write2(tm_hour()); + format_localized('H', 'O'); + } + void on_12_hour(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) + return write2(tm_hour12()); + format_localized('I', 'O'); + } + void on_minute(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) return write2(tm_min()); + format_localized('M', 'O'); + } + void on_second(numeric_system ns) { + if (is_classic_ || ns == numeric_system::standard) return write2(tm_sec()); + format_localized('S', 'O'); + } + + void on_12_hour_time() { + if (is_classic_) { + char buf[8]; + write_digit2_separated(buf, to_unsigned(tm_hour12()), + to_unsigned(tm_min()), to_unsigned(tm_sec()), ':'); + out_ = copy_str(std::begin(buf), std::end(buf), out_); + *out_++ = ' '; + on_am_pm(); + } else { + format_localized('r'); + } + } + void on_24_hour_time() { + write2(tm_hour()); + *out_++ = ':'; + write2(tm_min()); + } + void on_iso_time() { + char buf[8]; + write_digit2_separated(buf, to_unsigned(tm_hour()), to_unsigned(tm_min()), + to_unsigned(tm_sec()), ':'); + out_ = copy_str(std::begin(buf), std::end(buf), out_); + } + + void on_am_pm() { + if (is_classic_) { + *out_++ = tm_hour() < 12 ? 'A' : 'P'; + *out_++ = 'M'; + } else { + format_localized('p'); + } + } + + // These apply to chrono durations but not tm. + void on_duration_value() {} + void on_duration_unit() {} +}; + +struct chrono_format_checker : null_chrono_spec_handler { + FMT_NORETURN void unsupported() { FMT_THROW(format_error("no date")); } + + template + FMT_CONSTEXPR void on_text(const Char*, const Char*) {} + FMT_CONSTEXPR void on_24_hour(numeric_system) {} + FMT_CONSTEXPR void on_12_hour(numeric_system) {} + FMT_CONSTEXPR void on_minute(numeric_system) {} + FMT_CONSTEXPR void on_second(numeric_system) {} + FMT_CONSTEXPR void on_12_hour_time() {} + FMT_CONSTEXPR void on_24_hour_time() {} + FMT_CONSTEXPR void on_iso_time() {} + FMT_CONSTEXPR void on_am_pm() {} + FMT_CONSTEXPR void on_duration_value() {} + FMT_CONSTEXPR void on_duration_unit() {} +}; + +template ::value)> +inline bool isfinite(T) { + return true; +} + +// Converts value to Int and checks that it's in the range [0, upper). +template ::value)> +inline Int to_nonnegative_int(T value, Int upper) { + FMT_ASSERT(std::is_unsigned::value || + (value >= 0 && to_unsigned(value) <= to_unsigned(upper)), + "invalid value"); + (void)upper; + return static_cast(value); +} +template ::value)> +inline Int to_nonnegative_int(T value, Int upper) { + if (value < 0 || value > static_cast(upper)) + FMT_THROW(format_error("invalid value")); + return static_cast(value); +} + +template ::value)> +inline T mod(T x, int y) { + return x % static_cast(y); +} +template ::value)> +inline T mod(T x, int y) { + return std::fmod(x, static_cast(y)); +} + +// If T is an integral type, maps T to its unsigned counterpart, otherwise +// leaves it unchanged (unlike std::make_unsigned). +template ::value> +struct make_unsigned_or_unchanged { + using type = T; +}; + +template struct make_unsigned_or_unchanged { + using type = typename std::make_unsigned::type; +}; + +#if FMT_SAFE_DURATION_CAST +// throwing version of safe_duration_cast +template +To fmt_safe_duration_cast(std::chrono::duration from) { + int ec; + To to = safe_duration_cast::safe_duration_cast(from, ec); + if (ec) FMT_THROW(format_error("cannot format duration")); + return to; +} +#endif + +template ::value)> +inline std::chrono::duration get_milliseconds( + std::chrono::duration d) { + // this may overflow and/or the result may not fit in the + // target type. +#if FMT_SAFE_DURATION_CAST + using CommonSecondsType = + typename std::common_type::type; + const auto d_as_common = fmt_safe_duration_cast(d); + const auto d_as_whole_seconds = + fmt_safe_duration_cast(d_as_common); + // this conversion should be nonproblematic + const auto diff = d_as_common - d_as_whole_seconds; + const auto ms = + fmt_safe_duration_cast>(diff); + return ms; +#else + auto s = std::chrono::duration_cast(d); + return std::chrono::duration_cast(d - s); +#endif +} + +// Counts the number of fractional digits in the range [0, 18] according to the +// C++20 spec. If more than 18 fractional digits are required then returns 6 for +// microseconds precision. +template () / 10)> +struct count_fractional_digits { + static constexpr int value = + Num % Den == 0 ? N : count_fractional_digits::value; +}; + +// Base case that doesn't instantiate any more templates +// in order to avoid overflow. +template +struct count_fractional_digits { + static constexpr int value = (Num % Den == 0) ? N : 6; +}; + +constexpr long long pow10(std::uint32_t n) { + return n == 0 ? 1 : 10 * pow10(n - 1); +} + +template ::is_signed)> +constexpr std::chrono::duration abs( + std::chrono::duration d) { + // We need to compare the duration using the count() method directly + // due to a compiler bug in clang-11 regarding the spaceship operator, + // when -Wzero-as-null-pointer-constant is enabled. + // In clang-12 the bug has been fixed. See + // https://bugs.llvm.org/show_bug.cgi?id=46235 and the reproducible example: + // https://www.godbolt.org/z/Knbb5joYx. + return d.count() >= d.zero().count() ? d : -d; +} + +template ::is_signed)> +constexpr std::chrono::duration abs( + std::chrono::duration d) { + return d; +} + +template ::value)> +OutputIt format_duration_value(OutputIt out, Rep val, int) { + return write(out, val); +} + +template ::value)> +OutputIt format_duration_value(OutputIt out, Rep val, int precision) { + auto specs = basic_format_specs(); + specs.precision = precision; + specs.type = precision >= 0 ? presentation_type::fixed_lower + : presentation_type::general_lower; + return write(out, val, specs); +} + +template +OutputIt copy_unit(string_view unit, OutputIt out, Char) { + return std::copy(unit.begin(), unit.end(), out); +} + +template +OutputIt copy_unit(string_view unit, OutputIt out, wchar_t) { + // This works when wchar_t is UTF-32 because units only contain characters + // that have the same representation in UTF-16 and UTF-32. + utf8_to_utf16 u(unit); + return std::copy(u.c_str(), u.c_str() + u.size(), out); +} + +template +OutputIt format_duration_unit(OutputIt out) { + if (const char* unit = get_units()) + return copy_unit(string_view(unit), out, Char()); + *out++ = '['; + out = write(out, Period::num); + if (const_check(Period::den != 1)) { + *out++ = '/'; + out = write(out, Period::den); + } + *out++ = ']'; + *out++ = 's'; + return out; +} + +class get_locale { + private: + union { + std::locale locale_; + }; + bool has_locale_ = false; + + public: + get_locale(bool localized, locale_ref loc) : has_locale_(localized) { + if (localized) + ::new (&locale_) std::locale(loc.template get()); + } + ~get_locale() { + if (has_locale_) locale_.~locale(); + } + operator const std::locale&() const { + return has_locale_ ? locale_ : get_classic_locale(); + } +}; + +template +struct chrono_formatter { + FormatContext& context; + OutputIt out; + int precision; + bool localized = false; + // rep is unsigned to avoid overflow. + using rep = + conditional_t::value && sizeof(Rep) < sizeof(int), + unsigned, typename make_unsigned_or_unchanged::type>; + rep val; + using seconds = std::chrono::duration; + seconds s; + using milliseconds = std::chrono::duration; + bool negative; + + using char_type = typename FormatContext::char_type; + using tm_writer_type = tm_writer; + + chrono_formatter(FormatContext& ctx, OutputIt o, + std::chrono::duration d) + : context(ctx), + out(o), + val(static_cast(d.count())), + negative(false) { + if (d.count() < 0) { + val = 0 - val; + negative = true; + } + + // this may overflow and/or the result may not fit in the + // target type. +#if FMT_SAFE_DURATION_CAST + // might need checked conversion (rep!=Rep) + auto tmpval = std::chrono::duration(val); + s = fmt_safe_duration_cast(tmpval); +#else + s = std::chrono::duration_cast( + std::chrono::duration(val)); +#endif + } + + // returns true if nan or inf, writes to out. + bool handle_nan_inf() { + if (isfinite(val)) { + return false; + } + if (isnan(val)) { + write_nan(); + return true; + } + // must be +-inf + if (val > 0) { + write_pinf(); + } else { + write_ninf(); + } + return true; + } + + Rep hour() const { return static_cast(mod((s.count() / 3600), 24)); } + + Rep hour12() const { + Rep hour = static_cast(mod((s.count() / 3600), 12)); + return hour <= 0 ? 12 : hour; + } + + Rep minute() const { return static_cast(mod((s.count() / 60), 60)); } + Rep second() const { return static_cast(mod(s.count(), 60)); } + + std::tm time() const { + auto time = std::tm(); + time.tm_hour = to_nonnegative_int(hour(), 24); + time.tm_min = to_nonnegative_int(minute(), 60); + time.tm_sec = to_nonnegative_int(second(), 60); + return time; + } + + void write_sign() { + if (negative) { + *out++ = '-'; + negative = false; + } + } + + void write(Rep value, int width) { + write_sign(); + if (isnan(value)) return write_nan(); + uint32_or_64_or_128_t n = + to_unsigned(to_nonnegative_int(value, max_value())); + int num_digits = detail::count_digits(n); + if (width > num_digits) out = std::fill_n(out, width - num_digits, '0'); + out = format_decimal(out, n, num_digits).end; + } + + template void write_fractional_seconds(Duration d) { + FMT_ASSERT(!std::is_floating_point::value, ""); + constexpr auto num_fractional_digits = + count_fractional_digits::value; + + using subsecond_precision = std::chrono::duration< + typename std::common_type::type, + std::ratio<1, detail::pow10(num_fractional_digits)>>; + if (std::ratio_less::value) { + *out++ = '.'; + auto fractional = + detail::abs(d) - std::chrono::duration_cast(d); + auto subseconds = + std::chrono::treat_as_floating_point< + typename subsecond_precision::rep>::value + ? fractional.count() + : std::chrono::duration_cast(fractional) + .count(); + uint32_or_64_or_128_t n = + to_unsigned(to_nonnegative_int(subseconds, max_value())); + int num_digits = detail::count_digits(n); + if (num_fractional_digits > num_digits) + out = std::fill_n(out, num_fractional_digits - num_digits, '0'); + out = format_decimal(out, n, num_digits).end; + } + } + + void write_nan() { std::copy_n("nan", 3, out); } + void write_pinf() { std::copy_n("inf", 3, out); } + void write_ninf() { std::copy_n("-inf", 4, out); } + + template + void format_tm(const tm& time, Callback cb, Args... args) { + if (isnan(val)) return write_nan(); + get_locale loc(localized, context.locale()); + auto w = tm_writer_type(loc, out, time); + (w.*cb)(args...); + out = w.out(); + } + + void on_text(const char_type* begin, const char_type* end) { + std::copy(begin, end, out); + } + + // These are not implemented because durations don't have date information. + void on_abbr_weekday() {} + void on_full_weekday() {} + void on_dec0_weekday(numeric_system) {} + void on_dec1_weekday(numeric_system) {} + void on_abbr_month() {} + void on_full_month() {} + void on_datetime(numeric_system) {} + void on_loc_date(numeric_system) {} + void on_loc_time(numeric_system) {} + void on_us_date() {} + void on_iso_date() {} + void on_utc_offset() {} + void on_tz_name() {} + void on_year(numeric_system) {} + void on_short_year(numeric_system) {} + void on_offset_year() {} + void on_century(numeric_system) {} + void on_iso_week_based_year() {} + void on_iso_week_based_short_year() {} + void on_dec_month(numeric_system) {} + void on_dec0_week_of_year(numeric_system) {} + void on_dec1_week_of_year(numeric_system) {} + void on_iso_week_of_year(numeric_system) {} + void on_day_of_year() {} + void on_day_of_month(numeric_system) {} + void on_day_of_month_space(numeric_system) {} + + void on_24_hour(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(hour(), 2); + auto time = tm(); + time.tm_hour = to_nonnegative_int(hour(), 24); + format_tm(time, &tm_writer_type::on_24_hour, ns); + } + + void on_12_hour(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(hour12(), 2); + auto time = tm(); + time.tm_hour = to_nonnegative_int(hour12(), 12); + format_tm(time, &tm_writer_type::on_12_hour, ns); + } + + void on_minute(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(minute(), 2); + auto time = tm(); + time.tm_min = to_nonnegative_int(minute(), 60); + format_tm(time, &tm_writer_type::on_minute, ns); + } + + void on_second(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) { + if (std::is_floating_point::value) { + constexpr auto num_fractional_digits = + count_fractional_digits::value; + auto buf = memory_buffer(); + format_to(std::back_inserter(buf), runtime("{:.{}f}"), + std::fmod(val * static_cast(Period::num) / + static_cast(Period::den), + static_cast(60)), + num_fractional_digits); + if (negative) *out++ = '-'; + if (buf.size() < 2 || buf[1] == '.') *out++ = '0'; + out = std::copy(buf.begin(), buf.end(), out); + } else { + write(second(), 2); + write_fractional_seconds(std::chrono::duration(val)); + } + return; + } + auto time = tm(); + time.tm_sec = to_nonnegative_int(second(), 60); + format_tm(time, &tm_writer_type::on_second, ns); + } + + void on_12_hour_time() { + if (handle_nan_inf()) return; + format_tm(time(), &tm_writer_type::on_12_hour_time); + } + + void on_24_hour_time() { + if (handle_nan_inf()) { + *out++ = ':'; + handle_nan_inf(); + return; + } + + write(hour(), 2); + *out++ = ':'; + write(minute(), 2); + } + + void on_iso_time() { + on_24_hour_time(); + *out++ = ':'; + if (handle_nan_inf()) return; + on_second(numeric_system::standard); + } + + void on_am_pm() { + if (handle_nan_inf()) return; + format_tm(time(), &tm_writer_type::on_am_pm); + } + + void on_duration_value() { + if (handle_nan_inf()) return; + write_sign(); + out = format_duration_value(out, val, precision); + } + + void on_duration_unit() { + out = format_duration_unit(out); + } +}; + +FMT_END_DETAIL_NAMESPACE + +#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907 +using weekday = std::chrono::weekday; +#else +// A fallback version of weekday. +class weekday { + private: + unsigned char value; + + public: + weekday() = default; + explicit constexpr weekday(unsigned wd) noexcept + : value(static_cast(wd != 7 ? wd : 0)) {} + constexpr unsigned c_encoding() const noexcept { return value; } +}; + +class year_month_day {}; +#endif + +// A rudimentary weekday formatter. +template struct formatter { + private: + bool localized = false; + + public: + FMT_CONSTEXPR auto parse(basic_format_parse_context& ctx) + -> decltype(ctx.begin()) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin != end && *begin == 'L') { + ++begin; + localized = true; + } + return begin; + } + + template + auto format(weekday wd, FormatContext& ctx) const -> decltype(ctx.out()) { + auto time = std::tm(); + time.tm_wday = static_cast(wd.c_encoding()); + detail::get_locale loc(localized, ctx.locale()); + auto w = detail::tm_writer(loc, ctx.out(), time); + w.on_abbr_weekday(); + return w.out(); + } +}; + +template +struct formatter, Char> { + private: + basic_format_specs specs; + int precision = -1; + using arg_ref_type = detail::arg_ref; + arg_ref_type width_ref; + arg_ref_type precision_ref; + bool localized = false; + basic_string_view format_str; + using duration = std::chrono::duration; + + struct spec_handler { + formatter& f; + basic_format_parse_context& context; + basic_string_view format_str; + + template FMT_CONSTEXPR arg_ref_type make_arg_ref(Id arg_id) { + context.check_arg_id(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR arg_ref_type make_arg_ref(basic_string_view arg_id) { + context.check_arg_id(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR arg_ref_type make_arg_ref(detail::auto_id) { + return arg_ref_type(context.next_arg_id()); + } + + void on_error(const char* msg) { FMT_THROW(format_error(msg)); } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + f.specs.fill = fill; + } + FMT_CONSTEXPR void on_align(align_t align) { f.specs.align = align; } + FMT_CONSTEXPR void on_width(int width) { f.specs.width = width; } + FMT_CONSTEXPR void on_precision(int _precision) { + f.precision = _precision; + } + FMT_CONSTEXPR void end_precision() {} + + template FMT_CONSTEXPR void on_dynamic_width(Id arg_id) { + f.width_ref = make_arg_ref(arg_id); + } + + template FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) { + f.precision_ref = make_arg_ref(arg_id); + } + }; + + using iterator = typename basic_format_parse_context::iterator; + struct parse_range { + iterator begin; + iterator end; + }; + + FMT_CONSTEXPR parse_range do_parse(basic_format_parse_context& ctx) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin == end || *begin == '}') return {begin, begin}; + spec_handler handler{*this, ctx, format_str}; + begin = detail::parse_align(begin, end, handler); + if (begin == end) return {begin, begin}; + begin = detail::parse_width(begin, end, handler); + if (begin == end) return {begin, begin}; + if (*begin == '.') { + if (std::is_floating_point::value) + begin = detail::parse_precision(begin, end, handler); + else + handler.on_error("precision not allowed for this argument type"); + } + if (begin != end && *begin == 'L') { + ++begin; + localized = true; + } + end = detail::parse_chrono_format(begin, end, + detail::chrono_format_checker()); + return {begin, end}; + } + + public: + FMT_CONSTEXPR auto parse(basic_format_parse_context& ctx) + -> decltype(ctx.begin()) { + auto range = do_parse(ctx); + format_str = basic_string_view( + &*range.begin, detail::to_unsigned(range.end - range.begin)); + return range.end; + } + + template + auto format(const duration& d, FormatContext& ctx) const + -> decltype(ctx.out()) { + auto specs_copy = specs; + auto precision_copy = precision; + auto begin = format_str.begin(), end = format_str.end(); + // As a possible future optimization, we could avoid extra copying if width + // is not specified. + basic_memory_buffer buf; + auto out = std::back_inserter(buf); + detail::handle_dynamic_spec(specs_copy.width, + width_ref, ctx); + detail::handle_dynamic_spec(precision_copy, + precision_ref, ctx); + if (begin == end || *begin == '}') { + out = detail::format_duration_value(out, d.count(), precision_copy); + detail::format_duration_unit(out); + } else { + detail::chrono_formatter f( + ctx, out, d); + f.precision = precision_copy; + f.localized = localized; + detail::parse_chrono_format(begin, end, f); + } + return detail::write( + ctx.out(), basic_string_view(buf.data(), buf.size()), specs_copy); + } +}; + +template +struct formatter, + Char> : formatter { + FMT_CONSTEXPR formatter() { + basic_string_view default_specs = + detail::string_literal{}; + this->do_parse(default_specs.begin(), default_specs.end()); + } + + template + auto format(std::chrono::time_point val, + FormatContext& ctx) const -> decltype(ctx.out()) { + return formatter::format(localtime(val), ctx); + } +}; + +template struct formatter { + private: + enum class spec { + unknown, + year_month_day, + hh_mm_ss, + }; + spec spec_ = spec::unknown; + basic_string_view specs; + + protected: + template FMT_CONSTEXPR auto do_parse(It begin, It end) -> It { + if (begin != end && *begin == ':') ++begin; + end = detail::parse_chrono_format(begin, end, detail::tm_format_checker()); + // Replace default spec only if the new spec is not empty. + if (end != begin) specs = {begin, detail::to_unsigned(end - begin)}; + return end; + } + + public: + FMT_CONSTEXPR auto parse(basic_format_parse_context& ctx) + -> decltype(ctx.begin()) { + auto end = this->do_parse(ctx.begin(), ctx.end()); + // basic_string_view<>::compare isn't constexpr before C++17. + if (specs.size() == 2 && specs[0] == Char('%')) { + if (specs[1] == Char('F')) + spec_ = spec::year_month_day; + else if (specs[1] == Char('T')) + spec_ = spec::hh_mm_ss; + } + return end; + } + + template + auto format(const std::tm& tm, FormatContext& ctx) const + -> decltype(ctx.out()) { + const auto loc_ref = ctx.locale(); + detail::get_locale loc(static_cast(loc_ref), loc_ref); + auto w = detail::tm_writer(loc, ctx.out(), tm); + if (spec_ == spec::year_month_day) + w.on_iso_date(); + else if (spec_ == spec::hh_mm_ss) + w.on_iso_time(); + else + detail::parse_chrono_format(specs.begin(), specs.end(), w); + return w.out(); + } +}; + +FMT_MODULE_EXPORT_END +FMT_END_NAMESPACE + +#endif // FMT_CHRONO_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/color.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/color.h new file mode 100644 index 0000000..4c16327 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/color.h @@ -0,0 +1,651 @@ +// Formatting library for C++ - color support +// +// Copyright (c) 2018 - present, Victor Zverovich and fmt contributors +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_COLOR_H_ +#define FMT_COLOR_H_ + +#include "format.h" + +FMT_BEGIN_NAMESPACE +FMT_MODULE_EXPORT_BEGIN + +enum class color : uint32_t { + alice_blue = 0xF0F8FF, // rgb(240,248,255) + antique_white = 0xFAEBD7, // rgb(250,235,215) + aqua = 0x00FFFF, // rgb(0,255,255) + aquamarine = 0x7FFFD4, // rgb(127,255,212) + azure = 0xF0FFFF, // rgb(240,255,255) + beige = 0xF5F5DC, // rgb(245,245,220) + bisque = 0xFFE4C4, // rgb(255,228,196) + black = 0x000000, // rgb(0,0,0) + blanched_almond = 0xFFEBCD, // rgb(255,235,205) + blue = 0x0000FF, // rgb(0,0,255) + blue_violet = 0x8A2BE2, // rgb(138,43,226) + brown = 0xA52A2A, // rgb(165,42,42) + burly_wood = 0xDEB887, // rgb(222,184,135) + cadet_blue = 0x5F9EA0, // rgb(95,158,160) + chartreuse = 0x7FFF00, // rgb(127,255,0) + chocolate = 0xD2691E, // rgb(210,105,30) + coral = 0xFF7F50, // rgb(255,127,80) + cornflower_blue = 0x6495ED, // rgb(100,149,237) + cornsilk = 0xFFF8DC, // rgb(255,248,220) + crimson = 0xDC143C, // rgb(220,20,60) + cyan = 0x00FFFF, // rgb(0,255,255) + dark_blue = 0x00008B, // rgb(0,0,139) + dark_cyan = 0x008B8B, // rgb(0,139,139) + dark_golden_rod = 0xB8860B, // rgb(184,134,11) + dark_gray = 0xA9A9A9, // rgb(169,169,169) + dark_green = 0x006400, // rgb(0,100,0) + dark_khaki = 0xBDB76B, // rgb(189,183,107) + dark_magenta = 0x8B008B, // rgb(139,0,139) + dark_olive_green = 0x556B2F, // rgb(85,107,47) + dark_orange = 0xFF8C00, // rgb(255,140,0) + dark_orchid = 0x9932CC, // rgb(153,50,204) + dark_red = 0x8B0000, // rgb(139,0,0) + dark_salmon = 0xE9967A, // rgb(233,150,122) + dark_sea_green = 0x8FBC8F, // rgb(143,188,143) + dark_slate_blue = 0x483D8B, // rgb(72,61,139) + dark_slate_gray = 0x2F4F4F, // rgb(47,79,79) + dark_turquoise = 0x00CED1, // rgb(0,206,209) + dark_violet = 0x9400D3, // rgb(148,0,211) + deep_pink = 0xFF1493, // rgb(255,20,147) + deep_sky_blue = 0x00BFFF, // rgb(0,191,255) + dim_gray = 0x696969, // rgb(105,105,105) + dodger_blue = 0x1E90FF, // rgb(30,144,255) + fire_brick = 0xB22222, // rgb(178,34,34) + floral_white = 0xFFFAF0, // rgb(255,250,240) + forest_green = 0x228B22, // rgb(34,139,34) + fuchsia = 0xFF00FF, // rgb(255,0,255) + gainsboro = 0xDCDCDC, // rgb(220,220,220) + ghost_white = 0xF8F8FF, // rgb(248,248,255) + gold = 0xFFD700, // rgb(255,215,0) + golden_rod = 0xDAA520, // rgb(218,165,32) + gray = 0x808080, // rgb(128,128,128) + green = 0x008000, // rgb(0,128,0) + green_yellow = 0xADFF2F, // rgb(173,255,47) + honey_dew = 0xF0FFF0, // rgb(240,255,240) + hot_pink = 0xFF69B4, // rgb(255,105,180) + indian_red = 0xCD5C5C, // rgb(205,92,92) + indigo = 0x4B0082, // rgb(75,0,130) + ivory = 0xFFFFF0, // rgb(255,255,240) + khaki = 0xF0E68C, // rgb(240,230,140) + lavender = 0xE6E6FA, // rgb(230,230,250) + lavender_blush = 0xFFF0F5, // rgb(255,240,245) + lawn_green = 0x7CFC00, // rgb(124,252,0) + lemon_chiffon = 0xFFFACD, // rgb(255,250,205) + light_blue = 0xADD8E6, // rgb(173,216,230) + light_coral = 0xF08080, // rgb(240,128,128) + light_cyan = 0xE0FFFF, // rgb(224,255,255) + light_golden_rod_yellow = 0xFAFAD2, // rgb(250,250,210) + light_gray = 0xD3D3D3, // rgb(211,211,211) + light_green = 0x90EE90, // rgb(144,238,144) + light_pink = 0xFFB6C1, // rgb(255,182,193) + light_salmon = 0xFFA07A, // rgb(255,160,122) + light_sea_green = 0x20B2AA, // rgb(32,178,170) + light_sky_blue = 0x87CEFA, // rgb(135,206,250) + light_slate_gray = 0x778899, // rgb(119,136,153) + light_steel_blue = 0xB0C4DE, // rgb(176,196,222) + light_yellow = 0xFFFFE0, // rgb(255,255,224) + lime = 0x00FF00, // rgb(0,255,0) + lime_green = 0x32CD32, // rgb(50,205,50) + linen = 0xFAF0E6, // rgb(250,240,230) + magenta = 0xFF00FF, // rgb(255,0,255) + maroon = 0x800000, // rgb(128,0,0) + medium_aquamarine = 0x66CDAA, // rgb(102,205,170) + medium_blue = 0x0000CD, // rgb(0,0,205) + medium_orchid = 0xBA55D3, // rgb(186,85,211) + medium_purple = 0x9370DB, // rgb(147,112,219) + medium_sea_green = 0x3CB371, // rgb(60,179,113) + medium_slate_blue = 0x7B68EE, // rgb(123,104,238) + medium_spring_green = 0x00FA9A, // rgb(0,250,154) + medium_turquoise = 0x48D1CC, // rgb(72,209,204) + medium_violet_red = 0xC71585, // rgb(199,21,133) + midnight_blue = 0x191970, // rgb(25,25,112) + mint_cream = 0xF5FFFA, // rgb(245,255,250) + misty_rose = 0xFFE4E1, // rgb(255,228,225) + moccasin = 0xFFE4B5, // rgb(255,228,181) + navajo_white = 0xFFDEAD, // rgb(255,222,173) + navy = 0x000080, // rgb(0,0,128) + old_lace = 0xFDF5E6, // rgb(253,245,230) + olive = 0x808000, // rgb(128,128,0) + olive_drab = 0x6B8E23, // rgb(107,142,35) + orange = 0xFFA500, // rgb(255,165,0) + orange_red = 0xFF4500, // rgb(255,69,0) + orchid = 0xDA70D6, // rgb(218,112,214) + pale_golden_rod = 0xEEE8AA, // rgb(238,232,170) + pale_green = 0x98FB98, // rgb(152,251,152) + pale_turquoise = 0xAFEEEE, // rgb(175,238,238) + pale_violet_red = 0xDB7093, // rgb(219,112,147) + papaya_whip = 0xFFEFD5, // rgb(255,239,213) + peach_puff = 0xFFDAB9, // rgb(255,218,185) + peru = 0xCD853F, // rgb(205,133,63) + pink = 0xFFC0CB, // rgb(255,192,203) + plum = 0xDDA0DD, // rgb(221,160,221) + powder_blue = 0xB0E0E6, // rgb(176,224,230) + purple = 0x800080, // rgb(128,0,128) + rebecca_purple = 0x663399, // rgb(102,51,153) + red = 0xFF0000, // rgb(255,0,0) + rosy_brown = 0xBC8F8F, // rgb(188,143,143) + royal_blue = 0x4169E1, // rgb(65,105,225) + saddle_brown = 0x8B4513, // rgb(139,69,19) + salmon = 0xFA8072, // rgb(250,128,114) + sandy_brown = 0xF4A460, // rgb(244,164,96) + sea_green = 0x2E8B57, // rgb(46,139,87) + sea_shell = 0xFFF5EE, // rgb(255,245,238) + sienna = 0xA0522D, // rgb(160,82,45) + silver = 0xC0C0C0, // rgb(192,192,192) + sky_blue = 0x87CEEB, // rgb(135,206,235) + slate_blue = 0x6A5ACD, // rgb(106,90,205) + slate_gray = 0x708090, // rgb(112,128,144) + snow = 0xFFFAFA, // rgb(255,250,250) + spring_green = 0x00FF7F, // rgb(0,255,127) + steel_blue = 0x4682B4, // rgb(70,130,180) + tan = 0xD2B48C, // rgb(210,180,140) + teal = 0x008080, // rgb(0,128,128) + thistle = 0xD8BFD8, // rgb(216,191,216) + tomato = 0xFF6347, // rgb(255,99,71) + turquoise = 0x40E0D0, // rgb(64,224,208) + violet = 0xEE82EE, // rgb(238,130,238) + wheat = 0xF5DEB3, // rgb(245,222,179) + white = 0xFFFFFF, // rgb(255,255,255) + white_smoke = 0xF5F5F5, // rgb(245,245,245) + yellow = 0xFFFF00, // rgb(255,255,0) + yellow_green = 0x9ACD32 // rgb(154,205,50) +}; // enum class color + +enum class terminal_color : uint8_t { + black = 30, + red, + green, + yellow, + blue, + magenta, + cyan, + white, + bright_black = 90, + bright_red, + bright_green, + bright_yellow, + bright_blue, + bright_magenta, + bright_cyan, + bright_white +}; + +enum class emphasis : uint8_t { + bold = 1, + faint = 1 << 1, + italic = 1 << 2, + underline = 1 << 3, + blink = 1 << 4, + reverse = 1 << 5, + conceal = 1 << 6, + strikethrough = 1 << 7, +}; + +// rgb is a struct for red, green and blue colors. +// Using the name "rgb" makes some editors show the color in a tooltip. +struct rgb { + FMT_CONSTEXPR rgb() : r(0), g(0), b(0) {} + FMT_CONSTEXPR rgb(uint8_t r_, uint8_t g_, uint8_t b_) : r(r_), g(g_), b(b_) {} + FMT_CONSTEXPR rgb(uint32_t hex) + : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b(hex & 0xFF) {} + FMT_CONSTEXPR rgb(color hex) + : r((uint32_t(hex) >> 16) & 0xFF), + g((uint32_t(hex) >> 8) & 0xFF), + b(uint32_t(hex) & 0xFF) {} + uint8_t r; + uint8_t g; + uint8_t b; +}; + +FMT_BEGIN_DETAIL_NAMESPACE + +// color is a struct of either a rgb color or a terminal color. +struct color_type { + FMT_CONSTEXPR color_type() noexcept : is_rgb(), value{} {} + FMT_CONSTEXPR color_type(color rgb_color) noexcept : is_rgb(true), value{} { + value.rgb_color = static_cast(rgb_color); + } + FMT_CONSTEXPR color_type(rgb rgb_color) noexcept : is_rgb(true), value{} { + value.rgb_color = (static_cast(rgb_color.r) << 16) | + (static_cast(rgb_color.g) << 8) | rgb_color.b; + } + FMT_CONSTEXPR color_type(terminal_color term_color) noexcept + : is_rgb(), value{} { + value.term_color = static_cast(term_color); + } + bool is_rgb; + union color_union { + uint8_t term_color; + uint32_t rgb_color; + } value; +}; + +FMT_END_DETAIL_NAMESPACE + +/** A text style consisting of foreground and background colors and emphasis. */ +class text_style { + public: + FMT_CONSTEXPR text_style(emphasis em = emphasis()) noexcept + : set_foreground_color(), set_background_color(), ems(em) {} + + FMT_CONSTEXPR text_style& operator|=(const text_style& rhs) { + if (!set_foreground_color) { + set_foreground_color = rhs.set_foreground_color; + foreground_color = rhs.foreground_color; + } else if (rhs.set_foreground_color) { + if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + foreground_color.value.rgb_color |= rhs.foreground_color.value.rgb_color; + } + + if (!set_background_color) { + set_background_color = rhs.set_background_color; + background_color = rhs.background_color; + } else if (rhs.set_background_color) { + if (!background_color.is_rgb || !rhs.background_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + background_color.value.rgb_color |= rhs.background_color.value.rgb_color; + } + + ems = static_cast(static_cast(ems) | + static_cast(rhs.ems)); + return *this; + } + + friend FMT_CONSTEXPR text_style operator|(text_style lhs, + const text_style& rhs) { + return lhs |= rhs; + } + + FMT_CONSTEXPR bool has_foreground() const noexcept { + return set_foreground_color; + } + FMT_CONSTEXPR bool has_background() const noexcept { + return set_background_color; + } + FMT_CONSTEXPR bool has_emphasis() const noexcept { + return static_cast(ems) != 0; + } + FMT_CONSTEXPR detail::color_type get_foreground() const noexcept { + FMT_ASSERT(has_foreground(), "no foreground specified for this style"); + return foreground_color; + } + FMT_CONSTEXPR detail::color_type get_background() const noexcept { + FMT_ASSERT(has_background(), "no background specified for this style"); + return background_color; + } + FMT_CONSTEXPR emphasis get_emphasis() const noexcept { + FMT_ASSERT(has_emphasis(), "no emphasis specified for this style"); + return ems; + } + + private: + FMT_CONSTEXPR text_style(bool is_foreground, + detail::color_type text_color) noexcept + : set_foreground_color(), set_background_color(), ems() { + if (is_foreground) { + foreground_color = text_color; + set_foreground_color = true; + } else { + background_color = text_color; + set_background_color = true; + } + } + + friend FMT_CONSTEXPR text_style fg(detail::color_type foreground) noexcept; + + friend FMT_CONSTEXPR text_style bg(detail::color_type background) noexcept; + + detail::color_type foreground_color; + detail::color_type background_color; + bool set_foreground_color; + bool set_background_color; + emphasis ems; +}; + +/** Creates a text style from the foreground (text) color. */ +FMT_CONSTEXPR inline text_style fg(detail::color_type foreground) noexcept { + return text_style(true, foreground); +} + +/** Creates a text style from the background color. */ +FMT_CONSTEXPR inline text_style bg(detail::color_type background) noexcept { + return text_style(false, background); +} + +FMT_CONSTEXPR inline text_style operator|(emphasis lhs, emphasis rhs) noexcept { + return text_style(lhs) | rhs; +} + +FMT_BEGIN_DETAIL_NAMESPACE + +template struct ansi_color_escape { + FMT_CONSTEXPR ansi_color_escape(detail::color_type text_color, + const char* esc) noexcept { + // If we have a terminal color, we need to output another escape code + // sequence. + if (!text_color.is_rgb) { + bool is_background = esc == string_view("\x1b[48;2;"); + uint32_t value = text_color.value.term_color; + // Background ASCII codes are the same as the foreground ones but with + // 10 more. + if (is_background) value += 10u; + + size_t index = 0; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + + if (value >= 100u) { + buffer[index++] = static_cast('1'); + value %= 100u; + } + buffer[index++] = static_cast('0' + value / 10u); + buffer[index++] = static_cast('0' + value % 10u); + + buffer[index++] = static_cast('m'); + buffer[index++] = static_cast('\0'); + return; + } + + for (int i = 0; i < 7; i++) { + buffer[i] = static_cast(esc[i]); + } + rgb color(text_color.value.rgb_color); + to_esc(color.r, buffer + 7, ';'); + to_esc(color.g, buffer + 11, ';'); + to_esc(color.b, buffer + 15, 'm'); + buffer[19] = static_cast(0); + } + FMT_CONSTEXPR ansi_color_escape(emphasis em) noexcept { + uint8_t em_codes[num_emphases] = {}; + if (has_emphasis(em, emphasis::bold)) em_codes[0] = 1; + if (has_emphasis(em, emphasis::faint)) em_codes[1] = 2; + if (has_emphasis(em, emphasis::italic)) em_codes[2] = 3; + if (has_emphasis(em, emphasis::underline)) em_codes[3] = 4; + if (has_emphasis(em, emphasis::blink)) em_codes[4] = 5; + if (has_emphasis(em, emphasis::reverse)) em_codes[5] = 7; + if (has_emphasis(em, emphasis::conceal)) em_codes[6] = 8; + if (has_emphasis(em, emphasis::strikethrough)) em_codes[7] = 9; + + size_t index = 0; + for (size_t i = 0; i < num_emphases; ++i) { + if (!em_codes[i]) continue; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + buffer[index++] = static_cast('0' + em_codes[i]); + buffer[index++] = static_cast('m'); + } + buffer[index++] = static_cast(0); + } + FMT_CONSTEXPR operator const Char*() const noexcept { return buffer; } + + FMT_CONSTEXPR const Char* begin() const noexcept { return buffer; } + FMT_CONSTEXPR_CHAR_TRAITS const Char* end() const noexcept { + return buffer + std::char_traits::length(buffer); + } + + private: + static constexpr size_t num_emphases = 8; + Char buffer[7u + 3u * num_emphases + 1u]; + + static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out, + char delimiter) noexcept { + out[0] = static_cast('0' + c / 100); + out[1] = static_cast('0' + c / 10 % 10); + out[2] = static_cast('0' + c % 10); + out[3] = static_cast(delimiter); + } + static FMT_CONSTEXPR bool has_emphasis(emphasis em, emphasis mask) noexcept { + return static_cast(em) & static_cast(mask); + } +}; + +template +FMT_CONSTEXPR ansi_color_escape make_foreground_color( + detail::color_type foreground) noexcept { + return ansi_color_escape(foreground, "\x1b[38;2;"); +} + +template +FMT_CONSTEXPR ansi_color_escape make_background_color( + detail::color_type background) noexcept { + return ansi_color_escape(background, "\x1b[48;2;"); +} + +template +FMT_CONSTEXPR ansi_color_escape make_emphasis(emphasis em) noexcept { + return ansi_color_escape(em); +} + +template inline void fputs(const Char* chars, FILE* stream) { + int result = std::fputs(chars, stream); + if (result < 0) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +template <> inline void fputs(const wchar_t* chars, FILE* stream) { + int result = std::fputws(chars, stream); + if (result < 0) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +template inline void reset_color(FILE* stream) { + fputs("\x1b[0m", stream); +} + +template <> inline void reset_color(FILE* stream) { + fputs(L"\x1b[0m", stream); +} + +template inline void reset_color(buffer& buffer) { + auto reset_color = string_view("\x1b[0m"); + buffer.append(reset_color.begin(), reset_color.end()); +} + +template struct styled_arg { + const T& value; + text_style style; +}; + +template +void vformat_to(buffer& buf, const text_style& ts, + basic_string_view format_str, + basic_format_args>> args) { + bool has_style = false; + if (ts.has_emphasis()) { + has_style = true; + auto emphasis = detail::make_emphasis(ts.get_emphasis()); + buf.append(emphasis.begin(), emphasis.end()); + } + if (ts.has_foreground()) { + has_style = true; + auto foreground = detail::make_foreground_color(ts.get_foreground()); + buf.append(foreground.begin(), foreground.end()); + } + if (ts.has_background()) { + has_style = true; + auto background = detail::make_background_color(ts.get_background()); + buf.append(background.begin(), background.end()); + } + detail::vformat_to(buf, format_str, args, {}); + if (has_style) detail::reset_color(buf); +} + +FMT_END_DETAIL_NAMESPACE + +template > +void vprint(std::FILE* f, const text_style& ts, const S& format, + basic_format_args>> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, detail::to_string_view(format), args); + if (detail::is_utf8()) { + detail::print(f, basic_string_view(buf.begin(), buf.size())); + } else { + buf.push_back(Char(0)); + detail::fputs(buf.data(), f); + } +} + +/** + \rst + Formats a string and prints it to the specified file stream using ANSI + escape sequences to specify text formatting. + + **Example**:: + + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template ::value)> +void print(std::FILE* f, const text_style& ts, const S& format_str, + const Args&... args) { + vprint(f, ts, format_str, + fmt::make_format_args>>(args...)); +} + +/** + \rst + Formats a string and prints it to stdout using ANSI escape sequences to + specify text formatting. + + **Example**:: + + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template ::value)> +void print(const text_style& ts, const S& format_str, const Args&... args) { + return print(stdout, ts, format_str, args...); +} + +template > +inline std::basic_string vformat( + const text_style& ts, const S& format_str, + basic_format_args>> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, detail::to_string_view(format_str), args); + return fmt::to_string(buf); +} + +/** + \rst + Formats arguments and returns the result as a string using ANSI + escape sequences to specify text formatting. + + **Example**:: + + #include + std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}", 42); + \endrst +*/ +template > +inline std::basic_string format(const text_style& ts, const S& format_str, + const Args&... args) { + return fmt::vformat(ts, detail::to_string_view(format_str), + fmt::make_format_args>(args...)); +} + +/** + Formats a string with the given text_style and writes the output to ``out``. + */ +template ::value)> +OutputIt vformat_to( + OutputIt out, const text_style& ts, basic_string_view format_str, + basic_format_args>> args) { + auto&& buf = detail::get_buffer(out); + detail::vformat_to(buf, ts, format_str, args); + return detail::get_iterator(buf); +} + +/** + \rst + Formats arguments with the given text_style, writes the result to the output + iterator ``out`` and returns the iterator past the end of the output range. + + **Example**:: + + std::vector out; + fmt::format_to(std::back_inserter(out), + fmt::emphasis::bold | fg(fmt::color::red), "{}", 42); + \endrst +*/ +template >::value&& + detail::is_string::value> +inline auto format_to(OutputIt out, const text_style& ts, const S& format_str, + Args&&... args) -> + typename std::enable_if::type { + return vformat_to(out, ts, detail::to_string_view(format_str), + fmt::make_format_args>>(args...)); +} + +template +struct formatter, Char> : formatter { + template + auto format(const detail::styled_arg& arg, FormatContext& ctx) const + -> decltype(ctx.out()) { + const auto& ts = arg.style; + const auto& value = arg.value; + auto out = ctx.out(); + + bool has_style = false; + if (ts.has_emphasis()) { + has_style = true; + auto emphasis = detail::make_emphasis(ts.get_emphasis()); + out = std::copy(emphasis.begin(), emphasis.end(), out); + } + if (ts.has_foreground()) { + has_style = true; + auto foreground = + detail::make_foreground_color(ts.get_foreground()); + out = std::copy(foreground.begin(), foreground.end(), out); + } + if (ts.has_background()) { + has_style = true; + auto background = + detail::make_background_color(ts.get_background()); + out = std::copy(background.begin(), background.end(), out); + } + out = formatter::format(value, ctx); + if (has_style) { + auto reset_color = string_view("\x1b[0m"); + out = std::copy(reset_color.begin(), reset_color.end(), out); + } + return out; + } +}; + +/** + \rst + Returns an argument that will be formatted using ANSI escape sequences, + to be used in a formatting function. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", + fmt::styled(1.23, fmt::fg(fmt::color::green) | + fmt::bg(fmt::color::blue))); + \endrst + */ +template +FMT_CONSTEXPR auto styled(const T& value, text_style ts) + -> detail::styled_arg> { + return detail::styled_arg>{value, ts}; +} + +FMT_MODULE_EXPORT_END +FMT_END_NAMESPACE + +#endif // FMT_COLOR_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/compile.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/compile.h new file mode 100644 index 0000000..933668c --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/compile.h @@ -0,0 +1,611 @@ +// Formatting library for C++ - experimental format string compilation +// +// Copyright (c) 2012 - present, Victor Zverovich and fmt contributors +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_COMPILE_H_ +#define FMT_COMPILE_H_ + +#include "format.h" + +FMT_BEGIN_NAMESPACE +namespace detail { + +template +FMT_CONSTEXPR inline counting_iterator copy_str(InputIt begin, InputIt end, + counting_iterator it) { + return it + (end - begin); +} + +template class truncating_iterator_base { + protected: + OutputIt out_; + size_t limit_; + size_t count_ = 0; + + truncating_iterator_base() : out_(), limit_(0) {} + + truncating_iterator_base(OutputIt out, size_t limit) + : out_(out), limit_(limit) {} + + public: + using iterator_category = std::output_iterator_tag; + using value_type = typename std::iterator_traits::value_type; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + FMT_UNCHECKED_ITERATOR(truncating_iterator_base); + + OutputIt base() const { return out_; } + size_t count() const { return count_; } +}; + +// An output iterator that truncates the output and counts the number of objects +// written to it. +template ::value_type>::type> +class truncating_iterator; + +template +class truncating_iterator + : public truncating_iterator_base { + mutable typename truncating_iterator_base::value_type blackhole_; + + public: + using value_type = typename truncating_iterator_base::value_type; + + truncating_iterator() = default; + + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + truncating_iterator& operator++() { + if (this->count_++ < this->limit_) ++this->out_; + return *this; + } + + truncating_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + value_type& operator*() const { + return this->count_ < this->limit_ ? *this->out_ : blackhole_; + } +}; + +template +class truncating_iterator + : public truncating_iterator_base { + public: + truncating_iterator() = default; + + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + template truncating_iterator& operator=(T val) { + if (this->count_++ < this->limit_) *this->out_++ = val; + return *this; + } + + truncating_iterator& operator++() { return *this; } + truncating_iterator& operator++(int) { return *this; } + truncating_iterator& operator*() { return *this; } +}; + +// A compile-time string which is compiled into fast formatting code. +class compiled_string {}; + +template +struct is_compiled_string : std::is_base_of {}; + +/** + \rst + Converts a string literal *s* into a format string that will be parsed at + compile time and converted into efficient formatting code. Requires C++17 + ``constexpr if`` compiler support. + + **Example**:: + + // Converts 42 into std::string using the most efficient method and no + // runtime format string processing. + std::string s = fmt::format(FMT_COMPILE("{}"), 42); + \endrst + */ +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) +# define FMT_COMPILE(s) \ + FMT_STRING_IMPL(s, fmt::detail::compiled_string, explicit) +#else +# define FMT_COMPILE(s) FMT_STRING(s) +#endif + +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template Str> +struct udl_compiled_string : compiled_string { + using char_type = Char; + explicit constexpr operator basic_string_view() const { + return {Str.data, N - 1}; + } +}; +#endif + +template +const T& first(const T& value, const Tail&...) { + return value; +} + +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) +template struct type_list {}; + +// Returns a reference to the argument at index N from [first, rest...]. +template +constexpr const auto& get([[maybe_unused]] const T& first, + [[maybe_unused]] const Args&... rest) { + static_assert(N < 1 + sizeof...(Args), "index is out of bounds"); + if constexpr (N == 0) + return first; + else + return detail::get(rest...); +} + +template +constexpr int get_arg_index_by_name(basic_string_view name, + type_list) { + return get_arg_index_by_name(name); +} + +template struct get_type_impl; + +template struct get_type_impl> { + using type = + remove_cvref_t(std::declval()...))>; +}; + +template +using get_type = typename get_type_impl::type; + +template struct is_compiled_format : std::false_type {}; + +template struct text { + basic_string_view data; + using char_type = Char; + + template + constexpr OutputIt format(OutputIt out, const Args&...) const { + return write(out, data); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template +constexpr text make_text(basic_string_view s, size_t pos, + size_t size) { + return {{&s[pos], size}}; +} + +template struct code_unit { + Char value; + using char_type = Char; + + template + constexpr OutputIt format(OutputIt out, const Args&...) const { + return write(out, value); + } +}; + +// This ensures that the argument type is convertible to `const T&`. +template +constexpr const T& get_arg_checked(const Args&... args) { + const auto& arg = detail::get(args...); + if constexpr (detail::is_named_arg>()) { + return arg.value; + } else { + return arg; + } +} + +template +struct is_compiled_format> : std::true_type {}; + +// A replacement field that refers to argument N. +template struct field { + using char_type = Char; + + template + constexpr OutputIt format(OutputIt out, const Args&... args) const { + return write(out, get_arg_checked(args...)); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +// A replacement field that refers to argument with name. +template struct runtime_named_field { + using char_type = Char; + basic_string_view name; + + template + constexpr static bool try_format_argument( + OutputIt& out, + // [[maybe_unused]] due to unused-but-set-parameter warning in GCC 7,8,9 + [[maybe_unused]] basic_string_view arg_name, const T& arg) { + if constexpr (is_named_arg::type>::value) { + if (arg_name == arg.name) { + out = write(out, arg.value); + return true; + } + } + return false; + } + + template + constexpr OutputIt format(OutputIt out, const Args&... args) const { + bool found = (try_format_argument(out, name, args) || ...); + if (!found) { + FMT_THROW(format_error("argument with specified name is not found")); + } + return out; + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +// A replacement field that refers to argument N and has format specifiers. +template struct spec_field { + using char_type = Char; + formatter fmt; + + template + constexpr FMT_INLINE OutputIt format(OutputIt out, + const Args&... args) const { + const auto& vargs = + fmt::make_format_args>(args...); + basic_format_context ctx(out, vargs); + return fmt.format(get_arg_checked(args...), ctx); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template struct concat { + L lhs; + R rhs; + using char_type = typename L::char_type; + + template + constexpr OutputIt format(OutputIt out, const Args&... args) const { + out = lhs.format(out, args...); + return rhs.format(out, args...); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template +constexpr concat make_concat(L lhs, R rhs) { + return {lhs, rhs}; +} + +struct unknown_format {}; + +template +constexpr size_t parse_text(basic_string_view str, size_t pos) { + for (size_t size = str.size(); pos != size; ++pos) { + if (str[pos] == '{' || str[pos] == '}') break; + } + return pos; +} + +template +constexpr auto compile_format_string(S format_str); + +template +constexpr auto parse_tail(T head, S format_str) { + if constexpr (POS != + basic_string_view(format_str).size()) { + constexpr auto tail = compile_format_string(format_str); + if constexpr (std::is_same, + unknown_format>()) + return tail; + else + return make_concat(head, tail); + } else { + return head; + } +} + +template struct parse_specs_result { + formatter fmt; + size_t end; + int next_arg_id; +}; + +constexpr int manual_indexing_id = -1; + +template +constexpr parse_specs_result parse_specs(basic_string_view str, + size_t pos, int next_arg_id) { + str.remove_prefix(pos); + auto ctx = compile_parse_context(str, max_value(), nullptr, {}, + next_arg_id); + auto f = formatter(); + auto end = f.parse(ctx); + return {f, pos + fmt::detail::to_unsigned(end - str.data()), + next_arg_id == 0 ? manual_indexing_id : ctx.next_arg_id()}; +} + +template struct arg_id_handler { + arg_ref arg_id; + + constexpr int operator()() { + FMT_ASSERT(false, "handler cannot be used with automatic indexing"); + return 0; + } + constexpr int operator()(int id) { + arg_id = arg_ref(id); + return 0; + } + constexpr int operator()(basic_string_view id) { + arg_id = arg_ref(id); + return 0; + } + + constexpr void on_error(const char* message) { + FMT_THROW(format_error(message)); + } +}; + +template struct parse_arg_id_result { + arg_ref arg_id; + const Char* arg_id_end; +}; + +template +constexpr auto parse_arg_id(const Char* begin, const Char* end) { + auto handler = arg_id_handler{arg_ref{}}; + auto arg_id_end = parse_arg_id(begin, end, handler); + return parse_arg_id_result{handler.arg_id, arg_id_end}; +} + +template struct field_type { + using type = remove_cvref_t; +}; + +template +struct field_type::value>> { + using type = remove_cvref_t; +}; + +template +constexpr auto parse_replacement_field_then_tail(S format_str) { + using char_type = typename S::char_type; + constexpr auto str = basic_string_view(format_str); + constexpr char_type c = END_POS != str.size() ? str[END_POS] : char_type(); + if constexpr (c == '}') { + return parse_tail( + field::type, ARG_INDEX>(), + format_str); + } else if constexpr (c != ':') { + FMT_THROW(format_error("expected ':'")); + } else { + constexpr auto result = parse_specs::type>( + str, END_POS + 1, NEXT_ID == manual_indexing_id ? 0 : NEXT_ID); + if constexpr (result.end >= str.size() || str[result.end] != '}') { + FMT_THROW(format_error("expected '}'")); + return 0; + } else { + return parse_tail( + spec_field::type, ARG_INDEX>{ + result.fmt}, + format_str); + } + } +} + +// Compiles a non-empty format string and returns the compiled representation +// or unknown_format() on unrecognized input. +template +constexpr auto compile_format_string(S format_str) { + using char_type = typename S::char_type; + constexpr auto str = basic_string_view(format_str); + if constexpr (str[POS] == '{') { + if constexpr (POS + 1 == str.size()) + FMT_THROW(format_error("unmatched '{' in format string")); + if constexpr (str[POS + 1] == '{') { + return parse_tail(make_text(str, POS, 1), format_str); + } else if constexpr (str[POS + 1] == '}' || str[POS + 1] == ':') { + static_assert(ID != manual_indexing_id, + "cannot switch from manual to automatic argument indexing"); + constexpr auto next_id = + ID != manual_indexing_id ? ID + 1 : manual_indexing_id; + return parse_replacement_field_then_tail, Args, + POS + 1, ID, next_id>( + format_str); + } else { + constexpr auto arg_id_result = + parse_arg_id(str.data() + POS + 1, str.data() + str.size()); + constexpr auto arg_id_end_pos = arg_id_result.arg_id_end - str.data(); + constexpr char_type c = + arg_id_end_pos != str.size() ? str[arg_id_end_pos] : char_type(); + static_assert(c == '}' || c == ':', "missing '}' in format string"); + if constexpr (arg_id_result.arg_id.kind == arg_id_kind::index) { + static_assert( + ID == manual_indexing_id || ID == 0, + "cannot switch from automatic to manual argument indexing"); + constexpr auto arg_index = arg_id_result.arg_id.val.index; + return parse_replacement_field_then_tail, + Args, arg_id_end_pos, + arg_index, manual_indexing_id>( + format_str); + } else if constexpr (arg_id_result.arg_id.kind == arg_id_kind::name) { + constexpr auto arg_index = + get_arg_index_by_name(arg_id_result.arg_id.val.name, Args{}); + if constexpr (arg_index != invalid_arg_index) { + constexpr auto next_id = + ID != manual_indexing_id ? ID + 1 : manual_indexing_id; + return parse_replacement_field_then_tail< + decltype(get_type::value), Args, arg_id_end_pos, + arg_index, next_id>(format_str); + } else { + if constexpr (c == '}') { + return parse_tail( + runtime_named_field{arg_id_result.arg_id.val.name}, + format_str); + } else if constexpr (c == ':') { + return unknown_format(); // no type info for specs parsing + } + } + } + } + } else if constexpr (str[POS] == '}') { + if constexpr (POS + 1 == str.size()) + FMT_THROW(format_error("unmatched '}' in format string")); + return parse_tail(make_text(str, POS, 1), format_str); + } else { + constexpr auto end = parse_text(str, POS + 1); + if constexpr (end - POS > 1) { + return parse_tail(make_text(str, POS, end - POS), + format_str); + } else { + return parse_tail(code_unit{str[POS]}, + format_str); + } + } +} + +template ::value)> +constexpr auto compile(S format_str) { + constexpr auto str = basic_string_view(format_str); + if constexpr (str.size() == 0) { + return detail::make_text(str, 0, 0); + } else { + constexpr auto result = + detail::compile_format_string, 0, 0>( + format_str); + return result; + } +} +#endif // defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) +} // namespace detail + +FMT_MODULE_EXPORT_BEGIN + +#if defined(__cpp_if_constexpr) && defined(__cpp_return_type_deduction) + +template ::value)> +FMT_INLINE std::basic_string format(const CompiledFormat& cf, + const Args&... args) { + auto s = std::basic_string(); + cf.format(std::back_inserter(s), args...); + return s; +} + +template ::value)> +constexpr FMT_INLINE OutputIt format_to(OutputIt out, const CompiledFormat& cf, + const Args&... args) { + return cf.format(out, args...); +} + +template ::value)> +FMT_INLINE std::basic_string format(const S&, + Args&&... args) { + if constexpr (std::is_same::value) { + constexpr auto str = basic_string_view(S()); + if constexpr (str.size() == 2 && str[0] == '{' && str[1] == '}') { + const auto& first = detail::first(args...); + if constexpr (detail::is_named_arg< + remove_cvref_t>::value) { + return fmt::to_string(first.value); + } else { + return fmt::to_string(first); + } + } + } + constexpr auto compiled = detail::compile(S()); + if constexpr (std::is_same, + detail::unknown_format>()) { + return fmt::format( + static_cast>(S()), + std::forward(args)...); + } else { + return fmt::format(compiled, std::forward(args)...); + } +} + +template ::value)> +FMT_CONSTEXPR OutputIt format_to(OutputIt out, const S&, Args&&... args) { + constexpr auto compiled = detail::compile(S()); + if constexpr (std::is_same, + detail::unknown_format>()) { + return fmt::format_to( + out, static_cast>(S()), + std::forward(args)...); + } else { + return fmt::format_to(out, compiled, std::forward(args)...); + } +} +#endif + +template ::value)> +format_to_n_result format_to_n(OutputIt out, size_t n, + const S& format_str, Args&&... args) { + auto it = fmt::format_to(detail::truncating_iterator(out, n), + format_str, std::forward(args)...); + return {it.base(), it.count()}; +} + +template ::value)> +FMT_CONSTEXPR20 size_t formatted_size(const S& format_str, + const Args&... args) { + return fmt::format_to(detail::counting_iterator(), format_str, args...) + .count(); +} + +template ::value)> +void print(std::FILE* f, const S& format_str, const Args&... args) { + memory_buffer buffer; + fmt::format_to(std::back_inserter(buffer), format_str, args...); + detail::print(f, {buffer.data(), buffer.size()}); +} + +template ::value)> +void print(const S& format_str, const Args&... args) { + print(stdout, format_str, args...); +} + +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +inline namespace literals { +template constexpr auto operator""_cf() { + using char_t = remove_cvref_t; + return detail::udl_compiled_string(); +} +} // namespace literals +#endif + +FMT_MODULE_EXPORT_END +FMT_END_NAMESPACE + +#endif // FMT_COMPILE_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/core.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/core.h new file mode 100644 index 0000000..f6a37af --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/core.h @@ -0,0 +1,3323 @@ +// Formatting library for C++ - the core API for char/UTF-8 +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CORE_H_ +#define FMT_CORE_H_ + +#include // std::byte +#include // std::FILE +#include // std::strlen +#include +#include +#include +#include + +// The fmt library version in the form major * 10000 + minor * 100 + patch. +#define FMT_VERSION 90100 + +#if defined(__clang__) && !defined(__ibmxl__) +# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) +#else +# define FMT_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && \ + !defined(__NVCOMPILER) +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#else +# define FMT_GCC_VERSION 0 +#endif + +#ifndef FMT_GCC_PRAGMA +// Workaround _Pragma bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59884. +# if FMT_GCC_VERSION >= 504 +# define FMT_GCC_PRAGMA(arg) _Pragma(arg) +# else +# define FMT_GCC_PRAGMA(arg) +# endif +#endif + +#ifdef __ICL +# define FMT_ICC_VERSION __ICL +#elif defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#else +# define FMT_ICC_VERSION 0 +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VERSION _MSC_VER +# define FMT_MSC_WARNING(...) __pragma(warning(__VA_ARGS__)) +#else +# define FMT_MSC_VERSION 0 +# define FMT_MSC_WARNING(...) +#endif + +#ifdef _MSVC_LANG +# define FMT_CPLUSPLUS _MSVC_LANG +#else +# define FMT_CPLUSPLUS __cplusplus +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#if (defined(__has_include) || FMT_ICC_VERSION >= 1600 || \ + FMT_MSC_VERSION > 1900) && \ + !defined(__INTELLISENSE__) +# define FMT_HAS_INCLUDE(x) __has_include(x) +#else +# define FMT_HAS_INCLUDE(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \ + (FMT_CPLUSPLUS >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \ + (FMT_CPLUSPLUS >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +// Check if relaxed C++14 constexpr is supported. +// GCC doesn't allow throw in constexpr until version 6 (bug 67371). +#ifndef FMT_USE_CONSTEXPR +# if (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VERSION >= 1912 || \ + (FMT_GCC_VERSION >= 600 && FMT_CPLUSPLUS >= 201402L)) && \ + !FMT_ICC_VERSION && !defined(__NVCC__) +# define FMT_USE_CONSTEXPR 1 +# else +# define FMT_USE_CONSTEXPR 0 +# endif +#endif +#if FMT_USE_CONSTEXPR +# define FMT_CONSTEXPR constexpr +#else +# define FMT_CONSTEXPR +#endif + +#if ((FMT_CPLUSPLUS >= 202002L) && \ + (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE > 9)) || \ + (FMT_CPLUSPLUS >= 201709L && FMT_GCC_VERSION >= 1002) +# define FMT_CONSTEXPR20 constexpr +#else +# define FMT_CONSTEXPR20 +#endif + +// Check if constexpr std::char_traits<>::{compare,length} are supported. +#if defined(__GLIBCXX__) +# if FMT_CPLUSPLUS >= 201703L && defined(_GLIBCXX_RELEASE) && \ + _GLIBCXX_RELEASE >= 7 // GCC 7+ libstdc++ has _GLIBCXX_RELEASE. +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +# endif +#elif defined(_LIBCPP_VERSION) && FMT_CPLUSPLUS >= 201703L && \ + _LIBCPP_VERSION >= 4000 +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#elif FMT_MSC_VERSION >= 1914 && FMT_CPLUSPLUS >= 201703L +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#endif +#ifndef FMT_CONSTEXPR_CHAR_TRAITS +# define FMT_CONSTEXPR_CHAR_TRAITS +#endif + +// Check if exceptions are disabled. +#ifndef FMT_EXCEPTIONS +# if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \ + (FMT_MSC_VERSION && !_HAS_EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +# else +# define FMT_EXCEPTIONS 1 +# endif +#endif + +#ifndef FMT_DEPRECATED +# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VERSION >= 1900 +# define FMT_DEPRECATED [[deprecated]] +# else +# if (defined(__GNUC__) && !defined(__LCC__)) || defined(__clang__) +# define FMT_DEPRECATED __attribute__((deprecated)) +# elif FMT_MSC_VERSION +# define FMT_DEPRECATED __declspec(deprecated) +# else +# define FMT_DEPRECATED /* deprecated */ +# endif +# endif +#endif + +// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code +// warnings. +#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VERSION && \ + !defined(__NVCC__) +# define FMT_NORETURN [[noreturn]] +#else +# define FMT_NORETURN +#endif + +#if FMT_HAS_CPP17_ATTRIBUTE(fallthrough) +# define FMT_FALLTHROUGH [[fallthrough]] +#elif defined(__clang__) +# define FMT_FALLTHROUGH [[clang::fallthrough]] +#elif FMT_GCC_VERSION >= 700 && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520) +# define FMT_FALLTHROUGH [[gnu::fallthrough]] +#else +# define FMT_FALLTHROUGH +#endif + +#ifndef FMT_NODISCARD +# if FMT_HAS_CPP17_ATTRIBUTE(nodiscard) +# define FMT_NODISCARD [[nodiscard]] +# else +# define FMT_NODISCARD +# endif +#endif + +#ifndef FMT_USE_FLOAT +# define FMT_USE_FLOAT 1 +#endif +#ifndef FMT_USE_DOUBLE +# define FMT_USE_DOUBLE 1 +#endif +#ifndef FMT_USE_LONG_DOUBLE +# define FMT_USE_LONG_DOUBLE 1 +#endif + +#ifndef FMT_INLINE +# if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_INLINE inline __attribute__((always_inline)) +# else +# define FMT_INLINE inline +# endif +#endif + +// An inline std::forward replacement. +#define FMT_FORWARD(...) static_cast(__VA_ARGS__) + +#ifdef _MSC_VER +# define FMT_UNCHECKED_ITERATOR(It) \ + using _Unchecked_type = It // Mark iterator as checked. +#else +# define FMT_UNCHECKED_ITERATOR(It) using unchecked_type = It +#endif + +#ifndef FMT_BEGIN_NAMESPACE +# define FMT_BEGIN_NAMESPACE \ + namespace fmt { \ + inline namespace v9 { +# define FMT_END_NAMESPACE \ + } \ + } +#endif + +#ifndef FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT_BEGIN +# define FMT_MODULE_EXPORT_END +# define FMT_BEGIN_DETAIL_NAMESPACE namespace detail { +# define FMT_END_DETAIL_NAMESPACE } +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# define FMT_CLASS_API FMT_MSC_WARNING(suppress : 4275) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# endif +#else +# define FMT_CLASS_API +# if defined(FMT_EXPORT) || defined(FMT_SHARED) +# if defined(__GNUC__) || defined(__clang__) +# define FMT_API __attribute__((visibility("default"))) +# endif +# endif +#endif +#ifndef FMT_API +# define FMT_API +#endif + +// libc++ supports string_view in pre-c++17. +#if FMT_HAS_INCLUDE() && \ + (FMT_CPLUSPLUS >= 201703L || defined(_LIBCPP_VERSION)) +# include +# define FMT_USE_STRING_VIEW +#elif FMT_HAS_INCLUDE("experimental/string_view") && FMT_CPLUSPLUS >= 201402L +# include +# define FMT_USE_EXPERIMENTAL_STRING_VIEW +#endif + +#ifndef FMT_UNICODE +# define FMT_UNICODE !FMT_MSC_VERSION +#endif + +#ifndef FMT_CONSTEVAL +# if ((FMT_GCC_VERSION >= 1000 || FMT_CLANG_VERSION >= 1101) && \ + FMT_CPLUSPLUS >= 202002L && !defined(__apple_build_version__)) || \ + (defined(__cpp_consteval) && \ + (!FMT_MSC_VERSION || _MSC_FULL_VER >= 193030704)) +// consteval is broken in MSVC before VS2022 and Apple clang 13. +# define FMT_CONSTEVAL consteval +# define FMT_HAS_CONSTEVAL +# else +# define FMT_CONSTEVAL +# endif +#endif + +#ifndef FMT_USE_NONTYPE_TEMPLATE_ARGS +# if defined(__cpp_nontype_template_args) && \ + ((FMT_GCC_VERSION >= 903 && FMT_CPLUSPLUS >= 201709L) || \ + __cpp_nontype_template_args >= 201911L) && \ + !defined(__NVCOMPILER) +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 1 +# else +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 0 +# endif +#endif + +// Enable minimal optimizations for more compact code in debug mode. +FMT_GCC_PRAGMA("GCC push_options") +#if !defined(__OPTIMIZE__) && !defined(__NVCOMPILER) +FMT_GCC_PRAGMA("GCC optimize(\"Og\")") +#endif + +FMT_BEGIN_NAMESPACE +FMT_MODULE_EXPORT_BEGIN + +// Implementations of enable_if_t and other metafunctions for older systems. +template +using enable_if_t = typename std::enable_if::type; +template +using conditional_t = typename std::conditional::type; +template using bool_constant = std::integral_constant; +template +using remove_reference_t = typename std::remove_reference::type; +template +using remove_const_t = typename std::remove_const::type; +template +using remove_cvref_t = typename std::remove_cv>::type; +template struct type_identity { using type = T; }; +template using type_identity_t = typename type_identity::type; +template +using underlying_t = typename std::underlying_type::type; + +template struct disjunction : std::false_type {}; +template struct disjunction

    : P {}; +template +struct disjunction + : conditional_t> {}; + +template struct conjunction : std::true_type {}; +template struct conjunction

    : P {}; +template +struct conjunction + : conditional_t, P1> {}; + +struct monostate { + constexpr monostate() {} +}; + +// An enable_if helper to be used in template parameters which results in much +// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed +// to workaround a bug in MSVC 2019 (see #1140 and #1186). +#ifdef FMT_DOC +# define FMT_ENABLE_IF(...) +#else +# define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 +#endif + +FMT_BEGIN_DETAIL_NAMESPACE + +// Suppresses "unused variable" warnings with the method described in +// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/. +// (void)var does not work on many Intel compilers. +template FMT_CONSTEXPR void ignore_unused(const T&...) {} + +constexpr FMT_INLINE auto is_constant_evaluated( + bool default_value = false) noexcept -> bool { +#ifdef __cpp_lib_is_constant_evaluated + ignore_unused(default_value); + return std::is_constant_evaluated(); +#else + return default_value; +#endif +} + +// Suppresses "conditional expression is constant" warnings. +template constexpr FMT_INLINE auto const_check(T value) -> T { + return value; +} + +FMT_NORETURN FMT_API void assert_fail(const char* file, int line, + const char* message); + +#ifndef FMT_ASSERT +# ifdef NDEBUG +// FMT_ASSERT is not empty to avoid -Wempty-body. +# define FMT_ASSERT(condition, message) \ + ::fmt::detail::ignore_unused((condition), (message)) +# else +# define FMT_ASSERT(condition, message) \ + ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \ + ? (void)0 \ + : ::fmt::detail::assert_fail(__FILE__, __LINE__, (message))) +# endif +#endif + +#if defined(FMT_USE_STRING_VIEW) +template using std_string_view = std::basic_string_view; +#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW) +template +using std_string_view = std::experimental::basic_string_view; +#else +template struct std_string_view {}; +#endif + +#ifdef FMT_USE_INT128 +// Do nothing. +#elif defined(__SIZEOF_INT128__) && !defined(__NVCC__) && \ + !(FMT_CLANG_VERSION && FMT_MSC_VERSION) +# define FMT_USE_INT128 1 +using int128_opt = __int128_t; // An optional native 128-bit integer. +using uint128_opt = __uint128_t; +template inline auto convert_for_visit(T value) -> T { + return value; +} +#else +# define FMT_USE_INT128 0 +#endif +#if !FMT_USE_INT128 +enum class int128_opt {}; +enum class uint128_opt {}; +// Reduce template instantiations. +template auto convert_for_visit(T) -> monostate { return {}; } +#endif + +// Casts a nonnegative integer to unsigned. +template +FMT_CONSTEXPR auto to_unsigned(Int value) -> + typename std::make_unsigned::type { + FMT_ASSERT(std::is_unsigned::value || value >= 0, "negative value"); + return static_cast::type>(value); +} + +FMT_MSC_WARNING(suppress : 4566) constexpr unsigned char micro[] = "\u00B5"; + +constexpr auto is_utf8() -> bool { + // Avoid buggy sign extensions in MSVC's constant evaluation mode (#2297). + using uchar = unsigned char; + return FMT_UNICODE || (sizeof(micro) == 3 && uchar(micro[0]) == 0xC2 && + uchar(micro[1]) == 0xB5); +} +FMT_END_DETAIL_NAMESPACE + +/** + An implementation of ``std::basic_string_view`` for pre-C++17. It provides a + subset of the API. ``fmt::basic_string_view`` is used for format strings even + if ``std::string_view`` is available to prevent issues when a library is + compiled with a different ``-std`` option than the client code (which is not + recommended). + */ +template class basic_string_view { + private: + const Char* data_; + size_t size_; + + public: + using value_type = Char; + using iterator = const Char*; + + constexpr basic_string_view() noexcept : data_(nullptr), size_(0) {} + + /** Constructs a string reference object from a C string and a size. */ + constexpr basic_string_view(const Char* s, size_t count) noexcept + : data_(s), size_(count) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + FMT_CONSTEXPR_CHAR_TRAITS + FMT_INLINE + basic_string_view(const Char* s) + : data_(s), + size_(detail::const_check(std::is_same::value && + !detail::is_constant_evaluated(true)) + ? std::strlen(reinterpret_cast(s)) + : std::char_traits::length(s)) {} + + /** Constructs a string reference from a ``std::basic_string`` object. */ + template + FMT_CONSTEXPR basic_string_view( + const std::basic_string& s) noexcept + : data_(s.data()), size_(s.size()) {} + + template >::value)> + FMT_CONSTEXPR basic_string_view(S s) noexcept + : data_(s.data()), size_(s.size()) {} + + /** Returns a pointer to the string data. */ + constexpr auto data() const noexcept -> const Char* { return data_; } + + /** Returns the string size. */ + constexpr auto size() const noexcept -> size_t { return size_; } + + constexpr auto begin() const noexcept -> iterator { return data_; } + constexpr auto end() const noexcept -> iterator { return data_ + size_; } + + constexpr auto operator[](size_t pos) const noexcept -> const Char& { + return data_[pos]; + } + + FMT_CONSTEXPR void remove_prefix(size_t n) noexcept { + data_ += n; + size_ -= n; + } + + // Lexicographically compare this string reference to other. + FMT_CONSTEXPR_CHAR_TRAITS auto compare(basic_string_view other) const -> int { + size_t str_size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, str_size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + FMT_CONSTEXPR_CHAR_TRAITS friend auto operator==(basic_string_view lhs, + basic_string_view rhs) + -> bool { + return lhs.compare(rhs) == 0; + } + friend auto operator!=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) != 0; + } + friend auto operator<(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) < 0; + } + friend auto operator<=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) <= 0; + } + friend auto operator>(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) > 0; + } + friend auto operator>=(basic_string_view lhs, basic_string_view rhs) -> bool { + return lhs.compare(rhs) >= 0; + } +}; + +using string_view = basic_string_view; + +/** Specifies if ``T`` is a character type. Can be specialized by users. */ +template struct is_char : std::false_type {}; +template <> struct is_char : std::true_type {}; + +FMT_BEGIN_DETAIL_NAMESPACE + +// A base class for compile-time strings. +struct compile_string {}; + +template +struct is_compile_string : std::is_base_of {}; + +// Returns a string view of `s`. +template ::value)> +FMT_INLINE auto to_string_view(const Char* s) -> basic_string_view { + return s; +} +template +inline auto to_string_view(const std::basic_string& s) + -> basic_string_view { + return s; +} +template +constexpr auto to_string_view(basic_string_view s) + -> basic_string_view { + return s; +} +template >::value)> +inline auto to_string_view(std_string_view s) -> basic_string_view { + return s; +} +template ::value)> +constexpr auto to_string_view(const S& s) + -> basic_string_view { + return basic_string_view(s); +} +void to_string_view(...); + +// Specifies whether S is a string type convertible to fmt::basic_string_view. +// It should be a constexpr function but MSVC 2017 fails to compile it in +// enable_if and MSVC 2015 fails to compile it as an alias template. +// ADL invocation of to_string_view is DEPRECATED! +template +struct is_string : std::is_class()))> { +}; + +template struct char_t_impl {}; +template struct char_t_impl::value>> { + using result = decltype(to_string_view(std::declval())); + using type = typename result::value_type; +}; + +enum class type { + none_type, + // Integer types should go first, + int_type, + uint_type, + long_long_type, + ulong_long_type, + int128_type, + uint128_type, + bool_type, + char_type, + last_integer_type = char_type, + // followed by floating-point types. + float_type, + double_type, + long_double_type, + last_numeric_type = long_double_type, + cstring_type, + string_type, + pointer_type, + custom_type +}; + +// Maps core type T to the corresponding type enum constant. +template +struct type_constant : std::integral_constant {}; + +#define FMT_TYPE_CONSTANT(Type, constant) \ + template \ + struct type_constant \ + : std::integral_constant {} + +FMT_TYPE_CONSTANT(int, int_type); +FMT_TYPE_CONSTANT(unsigned, uint_type); +FMT_TYPE_CONSTANT(long long, long_long_type); +FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type); +FMT_TYPE_CONSTANT(int128_opt, int128_type); +FMT_TYPE_CONSTANT(uint128_opt, uint128_type); +FMT_TYPE_CONSTANT(bool, bool_type); +FMT_TYPE_CONSTANT(Char, char_type); +FMT_TYPE_CONSTANT(float, float_type); +FMT_TYPE_CONSTANT(double, double_type); +FMT_TYPE_CONSTANT(long double, long_double_type); +FMT_TYPE_CONSTANT(const Char*, cstring_type); +FMT_TYPE_CONSTANT(basic_string_view, string_type); +FMT_TYPE_CONSTANT(const void*, pointer_type); + +constexpr bool is_integral_type(type t) { + return t > type::none_type && t <= type::last_integer_type; +} + +constexpr bool is_arithmetic_type(type t) { + return t > type::none_type && t <= type::last_numeric_type; +} + +FMT_NORETURN FMT_API void throw_format_error(const char* message); + +struct error_handler { + constexpr error_handler() = default; + constexpr error_handler(const error_handler&) = default; + + // This function is intentionally not constexpr to give a compile-time error. + FMT_NORETURN void on_error(const char* message) { + throw_format_error(message); + } +}; +FMT_END_DETAIL_NAMESPACE + +/** String's character type. */ +template using char_t = typename detail::char_t_impl::type; + +/** + \rst + Parsing context consisting of a format string range being parsed and an + argument counter for automatic indexing. + You can use the ``format_parse_context`` type alias for ``char`` instead. + \endrst + */ +template +class basic_format_parse_context : private ErrorHandler { + private: + basic_string_view format_str_; + int next_arg_id_; + + FMT_CONSTEXPR void do_check_arg_id(int id); + + public: + using char_type = Char; + using iterator = typename basic_string_view::iterator; + + explicit constexpr basic_format_parse_context( + basic_string_view format_str, ErrorHandler eh = {}, + int next_arg_id = 0) + : ErrorHandler(eh), format_str_(format_str), next_arg_id_(next_arg_id) {} + + /** + Returns an iterator to the beginning of the format string range being + parsed. + */ + constexpr auto begin() const noexcept -> iterator { + return format_str_.begin(); + } + + /** + Returns an iterator past the end of the format string range being parsed. + */ + constexpr auto end() const noexcept -> iterator { return format_str_.end(); } + + /** Advances the begin iterator to ``it``. */ + FMT_CONSTEXPR void advance_to(iterator it) { + format_str_.remove_prefix(detail::to_unsigned(it - begin())); + } + + /** + Reports an error if using the manual argument indexing; otherwise returns + the next argument index and switches to the automatic indexing. + */ + FMT_CONSTEXPR auto next_arg_id() -> int { + if (next_arg_id_ < 0) { + on_error("cannot switch from manual to automatic argument indexing"); + return 0; + } + int id = next_arg_id_++; + do_check_arg_id(id); + return id; + } + + /** + Reports an error if using the automatic argument indexing; otherwise + switches to the manual indexing. + */ + FMT_CONSTEXPR void check_arg_id(int id) { + if (next_arg_id_ > 0) { + on_error("cannot switch from automatic to manual argument indexing"); + return; + } + next_arg_id_ = -1; + do_check_arg_id(id); + } + FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + FMT_CONSTEXPR void check_dynamic_spec(int arg_id); + + FMT_CONSTEXPR void on_error(const char* message) { + ErrorHandler::on_error(message); + } + + constexpr auto error_handler() const -> ErrorHandler { return *this; } +}; + +using format_parse_context = basic_format_parse_context; + +FMT_BEGIN_DETAIL_NAMESPACE +// A parse context with extra data used only in compile-time checks. +template +class compile_parse_context + : public basic_format_parse_context { + private: + int num_args_; + const type* types_; + using base = basic_format_parse_context; + + public: + explicit FMT_CONSTEXPR compile_parse_context( + basic_string_view format_str, int num_args, const type* types, + ErrorHandler eh = {}, int next_arg_id = 0) + : base(format_str, eh, next_arg_id), num_args_(num_args), types_(types) {} + + constexpr auto num_args() const -> int { return num_args_; } + constexpr auto arg_type(int id) const -> type { return types_[id]; } + + FMT_CONSTEXPR auto next_arg_id() -> int { + int id = base::next_arg_id(); + if (id >= num_args_) this->on_error("argument not found"); + return id; + } + + FMT_CONSTEXPR void check_arg_id(int id) { + base::check_arg_id(id); + if (id >= num_args_) this->on_error("argument not found"); + } + using base::check_arg_id; + + FMT_CONSTEXPR void check_dynamic_spec(int arg_id) { + if (arg_id < num_args_ && types_ && !is_integral_type(types_[arg_id])) + this->on_error("width/precision is not integer"); + } +}; +FMT_END_DETAIL_NAMESPACE + +template +FMT_CONSTEXPR void +basic_format_parse_context::do_check_arg_id(int id) { + // Argument id is only checked at compile-time during parsing because + // formatting has its own validation. + if (detail::is_constant_evaluated() && FMT_GCC_VERSION >= 1200) { + using context = detail::compile_parse_context; + if (id >= static_cast(this)->num_args()) + on_error("argument not found"); + } +} + +template +FMT_CONSTEXPR void +basic_format_parse_context::check_dynamic_spec(int arg_id) { + if (detail::is_constant_evaluated()) { + using context = detail::compile_parse_context; + static_cast(this)->check_dynamic_spec(arg_id); + } +} + +template class basic_format_arg; +template class basic_format_args; +template class dynamic_format_arg_store; + +// A formatter for objects of type T. +template +struct formatter { + // A deleted default constructor indicates a disabled formatter. + formatter() = delete; +}; + +// Specifies if T has an enabled formatter specialization. A type can be +// formattable even if it doesn't have a formatter e.g. via a conversion. +template +using has_formatter = + std::is_constructible>; + +// Checks whether T is a container with contiguous storage. +template struct is_contiguous : std::false_type {}; +template +struct is_contiguous> : std::true_type {}; + +class appender; + +FMT_BEGIN_DETAIL_NAMESPACE + +template +constexpr auto has_const_formatter_impl(T*) + -> decltype(typename Context::template formatter_type().format( + std::declval(), std::declval()), + true) { + return true; +} +template +constexpr auto has_const_formatter_impl(...) -> bool { + return false; +} +template +constexpr auto has_const_formatter() -> bool { + return has_const_formatter_impl(static_cast(nullptr)); +} + +// Extracts a reference to the container from back_insert_iterator. +template +inline auto get_container(std::back_insert_iterator it) + -> Container& { + using base = std::back_insert_iterator; + struct accessor : base { + accessor(base b) : base(b) {} + using base::container; + }; + return *accessor(it).container; +} + +template +FMT_CONSTEXPR auto copy_str(InputIt begin, InputIt end, OutputIt out) + -> OutputIt { + while (begin != end) *out++ = static_cast(*begin++); + return out; +} + +template , U>::value&& is_char::value)> +FMT_CONSTEXPR auto copy_str(T* begin, T* end, U* out) -> U* { + if (is_constant_evaluated()) return copy_str(begin, end, out); + auto size = to_unsigned(end - begin); + memcpy(out, begin, size * sizeof(U)); + return out + size; +} + +/** + \rst + A contiguous memory buffer with an optional growing ability. It is an internal + class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`. + \endrst + */ +template class buffer { + private: + T* ptr_; + size_t size_; + size_t capacity_; + + protected: + // Don't initialize ptr_ since it is not accessed to save a few cycles. + FMT_MSC_WARNING(suppress : 26495) + buffer(size_t sz) noexcept : size_(sz), capacity_(sz) {} + + FMT_CONSTEXPR20 buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) noexcept + : ptr_(p), size_(sz), capacity_(cap) {} + + FMT_CONSTEXPR20 ~buffer() = default; + buffer(buffer&&) = default; + + /** Sets the buffer data and capacity. */ + FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept { + ptr_ = buf_data; + capacity_ = buf_capacity; + } + + /** Increases the buffer capacity to hold at least *capacity* elements. */ + virtual FMT_CONSTEXPR20 void grow(size_t capacity) = 0; + + public: + using value_type = T; + using const_reference = const T&; + + buffer(const buffer&) = delete; + void operator=(const buffer&) = delete; + + auto begin() noexcept -> T* { return ptr_; } + auto end() noexcept -> T* { return ptr_ + size_; } + + auto begin() const noexcept -> const T* { return ptr_; } + auto end() const noexcept -> const T* { return ptr_ + size_; } + + /** Returns the size of this buffer. */ + constexpr auto size() const noexcept -> size_t { return size_; } + + /** Returns the capacity of this buffer. */ + constexpr auto capacity() const noexcept -> size_t { return capacity_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() const noexcept -> const T* { return ptr_; } + + /** Clears this buffer. */ + void clear() { size_ = 0; } + + // Tries resizing the buffer to contain *count* elements. If T is a POD type + // the new elements may not be initialized. + FMT_CONSTEXPR20 void try_resize(size_t count) { + try_reserve(count); + size_ = count <= capacity_ ? count : capacity_; + } + + // Tries increasing the buffer capacity to *new_capacity*. It can increase the + // capacity by a smaller amount than requested but guarantees there is space + // for at least one additional element either by increasing the capacity or by + // flushing the buffer if it is full. + FMT_CONSTEXPR20 void try_reserve(size_t new_capacity) { + if (new_capacity > capacity_) grow(new_capacity); + } + + FMT_CONSTEXPR20 void push_back(const T& value) { + try_reserve(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template void append(const U* begin, const U* end); + + template FMT_CONSTEXPR auto operator[](Idx index) -> T& { + return ptr_[index]; + } + template + FMT_CONSTEXPR auto operator[](Idx index) const -> const T& { + return ptr_[index]; + } +}; + +struct buffer_traits { + explicit buffer_traits(size_t) {} + auto count() const -> size_t { return 0; } + auto limit(size_t size) -> size_t { return size; } +}; + +class fixed_buffer_traits { + private: + size_t count_ = 0; + size_t limit_; + + public: + explicit fixed_buffer_traits(size_t limit) : limit_(limit) {} + auto count() const -> size_t { return count_; } + auto limit(size_t size) -> size_t { + size_t n = limit_ > count_ ? limit_ - count_ : 0; + count_ += size; + return size < n ? size : n; + } +}; + +// A buffer that writes to an output iterator when flushed. +template +class iterator_buffer final : public Traits, public buffer { + private: + OutputIt out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == buffer_size) flush(); + } + + void flush() { + auto size = this->size(); + this->clear(); + out_ = copy_str(data_, data_ + this->limit(size), out_); + } + + public: + explicit iterator_buffer(OutputIt out, size_t n = buffer_size) + : Traits(n), buffer(data_, 0, buffer_size), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : Traits(other), buffer(data_, 0, buffer_size), out_(other.out_) {} + ~iterator_buffer() { flush(); } + + auto out() -> OutputIt { + flush(); + return out_; + } + auto count() const -> size_t { return Traits::count() + this->size(); } +}; + +template +class iterator_buffer final + : public fixed_buffer_traits, + public buffer { + private: + T* out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == this->capacity()) flush(); + } + + void flush() { + size_t n = this->limit(this->size()); + if (this->data() == out_) { + out_ += n; + this->set(data_, buffer_size); + } + this->clear(); + } + + public: + explicit iterator_buffer(T* out, size_t n = buffer_size) + : fixed_buffer_traits(n), buffer(out, 0, n), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : fixed_buffer_traits(other), + buffer(std::move(other)), + out_(other.out_) { + if (this->data() != out_) { + this->set(data_, buffer_size); + this->clear(); + } + } + ~iterator_buffer() { flush(); } + + auto out() -> T* { + flush(); + return out_; + } + auto count() const -> size_t { + return fixed_buffer_traits::count() + this->size(); + } +}; + +template class iterator_buffer final : public buffer { + protected: + FMT_CONSTEXPR20 void grow(size_t) override {} + + public: + explicit iterator_buffer(T* out, size_t = 0) : buffer(out, 0, ~size_t()) {} + + auto out() -> T* { return &*this->end(); } +}; + +// A buffer that writes to a container with the contiguous storage. +template +class iterator_buffer, + enable_if_t::value, + typename Container::value_type>> + final : public buffer { + private: + Container& container_; + + protected: + FMT_CONSTEXPR20 void grow(size_t capacity) override { + container_.resize(capacity); + this->set(&container_[0], capacity); + } + + public: + explicit iterator_buffer(Container& c) + : buffer(c.size()), container_(c) {} + explicit iterator_buffer(std::back_insert_iterator out, size_t = 0) + : iterator_buffer(get_container(out)) {} + + auto out() -> std::back_insert_iterator { + return std::back_inserter(container_); + } +}; + +// A buffer that counts the number of code units written discarding the output. +template class counting_buffer final : public buffer { + private: + enum { buffer_size = 256 }; + T data_[buffer_size]; + size_t count_ = 0; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() != buffer_size) return; + count_ += this->size(); + this->clear(); + } + + public: + counting_buffer() : buffer(data_, 0, buffer_size) {} + + auto count() -> size_t { return count_ + this->size(); } +}; + +template +using buffer_appender = conditional_t::value, appender, + std::back_insert_iterator>>; + +// Maps an output iterator to a buffer. +template +auto get_buffer(OutputIt out) -> iterator_buffer { + return iterator_buffer(out); +} + +template +auto get_iterator(Buffer& buf) -> decltype(buf.out()) { + return buf.out(); +} +template auto get_iterator(buffer& buf) -> buffer_appender { + return buffer_appender(buf); +} + +template +struct fallback_formatter { + fallback_formatter() = delete; +}; + +// Specifies if T has an enabled fallback_formatter specialization. +template +using has_fallback_formatter = +#ifdef FMT_DEPRECATED_OSTREAM + std::is_constructible>; +#else + std::false_type; +#endif + +struct view {}; + +template struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; + +template struct named_arg_info { + const Char* name; + int id; +}; + +template +struct arg_data { + // args_[0].named_args points to named_args_ to avoid bloating format_args. + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : +1)]; + named_arg_info named_args_[NUM_NAMED_ARGS]; + + template + arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {} + arg_data(const arg_data& other) = delete; + auto args() const -> const T* { return args_ + 1; } + auto named_args() -> named_arg_info* { return named_args_; } +}; + +template +struct arg_data { + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[NUM_ARGS != 0 ? NUM_ARGS : +1]; + + template + FMT_CONSTEXPR FMT_INLINE arg_data(const U&... init) : args_{init...} {} + FMT_CONSTEXPR FMT_INLINE auto args() const -> const T* { return args_; } + FMT_CONSTEXPR FMT_INLINE auto named_args() -> std::nullptr_t { + return nullptr; + } +}; + +template +inline void init_named_args(named_arg_info*, int, int) {} + +template struct is_named_arg : std::false_type {}; +template struct is_statically_named_arg : std::false_type {}; + +template +struct is_named_arg> : std::true_type {}; + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T&, const Tail&... args) { + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T& arg, const Tail&... args) { + named_args[named_arg_count++] = {arg.name, arg_count}; + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +FMT_CONSTEXPR FMT_INLINE void init_named_args(std::nullptr_t, int, int, + const Args&...) {} + +template constexpr auto count() -> size_t { return B ? 1 : 0; } +template constexpr auto count() -> size_t { + return (B1 ? 1 : 0) + count(); +} + +template constexpr auto count_named_args() -> size_t { + return count::value...>(); +} + +template +constexpr auto count_statically_named_args() -> size_t { + return count::value...>(); +} + +struct unformattable {}; +struct unformattable_char : unformattable {}; +struct unformattable_const : unformattable {}; +struct unformattable_pointer : unformattable {}; + +template struct string_value { + const Char* data; + size_t size; +}; + +template struct named_arg_value { + const named_arg_info* data; + size_t size; +}; + +template struct custom_value { + using parse_context = typename Context::parse_context_type; + void* value; + void (*format)(void* arg, parse_context& parse_ctx, Context& ctx); +}; + +// A formatting argument value. +template class value { + public: + using char_type = typename Context::char_type; + + union { + monostate no_value; + int int_value; + unsigned uint_value; + long long long_long_value; + unsigned long long ulong_long_value; + int128_opt int128_value; + uint128_opt uint128_value; + bool bool_value; + char_type char_value; + float float_value; + double double_value; + long double long_double_value; + const void* pointer; + string_value string; + custom_value custom; + named_arg_value named_args; + }; + + constexpr FMT_INLINE value() : no_value() {} + constexpr FMT_INLINE value(int val) : int_value(val) {} + constexpr FMT_INLINE value(unsigned val) : uint_value(val) {} + constexpr FMT_INLINE value(long long val) : long_long_value(val) {} + constexpr FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {} + FMT_INLINE value(int128_opt val) : int128_value(val) {} + FMT_INLINE value(uint128_opt val) : uint128_value(val) {} + constexpr FMT_INLINE value(float val) : float_value(val) {} + constexpr FMT_INLINE value(double val) : double_value(val) {} + FMT_INLINE value(long double val) : long_double_value(val) {} + constexpr FMT_INLINE value(bool val) : bool_value(val) {} + constexpr FMT_INLINE value(char_type val) : char_value(val) {} + FMT_CONSTEXPR FMT_INLINE value(const char_type* val) { + string.data = val; + if (is_constant_evaluated()) string.size = {}; + } + FMT_CONSTEXPR FMT_INLINE value(basic_string_view val) { + string.data = val.data(); + string.size = val.size(); + } + FMT_INLINE value(const void* val) : pointer(val) {} + FMT_INLINE value(const named_arg_info* args, size_t size) + : named_args{args, size} {} + + template FMT_CONSTEXPR FMT_INLINE value(T& val) { + using value_type = remove_cvref_t; + custom.value = const_cast(&val); + // Get the formatter type through the context to allow different contexts + // have different extension points, e.g. `formatter` for `format` and + // `printf_formatter` for `printf`. + custom.format = format_custom_arg< + value_type, + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>>; + } + value(unformattable); + value(unformattable_char); + value(unformattable_const); + value(unformattable_pointer); + + private: + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg(void* arg, + typename Context::parse_context_type& parse_ctx, + Context& ctx) { + auto f = Formatter(); + parse_ctx.advance_to(f.parse(parse_ctx)); + using qualified_type = + conditional_t(), const T, T>; + ctx.advance_to(f.format(*static_cast(arg), ctx)); + } +}; + +template +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg; + +// To minimize the number of types we need to deal with, long is translated +// either to int or to long long depending on its size. +enum { long_short = sizeof(long) == sizeof(int) }; +using long_type = conditional_t; +using ulong_type = conditional_t; + +#ifdef __cpp_lib_byte +inline auto format_as(std::byte b) -> unsigned char { + return static_cast(b); +} +#endif + +template struct has_format_as { + template ::value&& std::is_integral::value)> + static auto check(U*) -> std::true_type; + static auto check(...) -> std::false_type; + + enum { value = decltype(check(static_cast(nullptr)))::value }; +}; + +// Maps formatting arguments to core types. +// arg_mapper reports errors by returning unformattable instead of using +// static_assert because it's used in the is_formattable trait. +template struct arg_mapper { + using char_type = typename Context::char_type; + + FMT_CONSTEXPR FMT_INLINE auto map(signed char val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned char val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(short val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned short val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned val) -> unsigned { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long val) -> long_type { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long val) -> ulong_type { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(long long val) -> long long { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long long val) + -> unsigned long long { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int128_opt val) -> int128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(uint128_opt val) -> uint128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(bool val) -> bool { return val; } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR FMT_INLINE auto map(T val) -> char_type { + return val; + } + template ::value || +#ifdef __cpp_char8_t + std::is_same::value || +#endif + std::is_same::value || + std::is_same::value) && + !std::is_same::value, + int> = 0> + FMT_CONSTEXPR FMT_INLINE auto map(T) -> unformattable_char { + return {}; + } + + FMT_CONSTEXPR FMT_INLINE auto map(float val) -> float { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(double val) -> double { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long double val) -> long double { + return val; + } + + FMT_CONSTEXPR FMT_INLINE auto map(char_type* val) -> const char_type* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(const char_type* val) -> const char_type* { + return val; + } + template ::value && !std::is_pointer::value && + std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return to_string_view(val); + } + template ::value && !std::is_pointer::value && + !std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T&) -> unformattable_char { + return {}; + } + template >::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return basic_string_view(val); + } + template >::value && + !std::is_convertible>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return std_string_view(val); + } + + FMT_CONSTEXPR FMT_INLINE auto map(void* val) -> const void* { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(const void* val) -> const void* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(std::nullptr_t val) -> const void* { + return val; + } + + // We use SFINAE instead of a const T* parameter to avoid conflicting with + // the C array overload. + template < + typename T, + FMT_ENABLE_IF( + std::is_pointer::value || std::is_member_pointer::value || + std::is_function::type>::value || + (std::is_convertible::value && + !std::is_convertible::value && + !has_formatter::value))> + FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer { + return {}; + } + + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T (&values)[N]) -> const T (&)[N] { + return values; + } + + template ::value&& std::is_convertible::value && + !has_format_as::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_DEPRECATED FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> decltype(std::declval().map( + static_cast>(val))) { + return map(static_cast>(val)); + } + + template ::value && + !has_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> decltype(std::declval().map(format_as(T()))) { + return map(format_as(val)); + } + + template > + struct formattable + : bool_constant() || + !std::is_const>::value || + has_fallback_formatter::value> {}; + +#if (FMT_MSC_VERSION != 0 && FMT_MSC_VERSION < 1910) || \ + FMT_ICC_VERSION != 0 || defined(__NVCC__) + // Workaround a bug in MSVC and Intel (Issue 2746). + template FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; + } +#else + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; + } + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&&) -> unformattable_const { + return {}; + } +#endif + + template , + FMT_ENABLE_IF(!is_string::value && !is_char::value && + !std::is_array::value && + !std::is_pointer::value && + !has_format_as::value && + (has_formatter::value || + has_fallback_formatter::value))> + FMT_CONSTEXPR FMT_INLINE auto map(T&& val) + -> decltype(this->do_map(std::forward(val))) { + return do_map(std::forward(val)); + } + + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& named_arg) + -> decltype(std::declval().map(named_arg.value)) { + return map(named_arg.value); + } + + auto map(...) -> unformattable { return {}; } +}; + +// A type constant after applying arg_mapper. +template +using mapped_type_constant = + type_constant().map(std::declval())), + typename Context::char_type>; + +enum { packed_arg_bits = 4 }; +// Maximum number of arguments with packed types. +enum { max_packed_args = 62 / packed_arg_bits }; +enum : unsigned long long { is_unpacked_bit = 1ULL << 63 }; +enum : unsigned long long { has_named_args_bit = 1ULL << 62 }; + +FMT_END_DETAIL_NAMESPACE + +// An output iterator that appends to a buffer. +// It is used to reduce symbol sizes for the common case. +class appender : public std::back_insert_iterator> { + using base = std::back_insert_iterator>; + + template + friend auto get_buffer(appender out) -> detail::buffer& { + return detail::get_container(out); + } + + public: + using std::back_insert_iterator>::back_insert_iterator; + appender(base it) noexcept : base(it) {} + FMT_UNCHECKED_ITERATOR(appender); + + auto operator++() noexcept -> appender& { return *this; } + auto operator++(int) noexcept -> appender { return *this; } +}; + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in basic_memory_buffer. +template class basic_format_arg { + private: + detail::value value_; + detail::type type_; + + template + friend FMT_CONSTEXPR auto detail::make_arg(T&& value) + -> basic_format_arg; + + template + friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, + const basic_format_arg& arg) + -> decltype(vis(0)); + + friend class basic_format_args; + friend class dynamic_format_arg_store; + + using char_type = typename Context::char_type; + + template + friend struct detail::arg_data; + + basic_format_arg(const detail::named_arg_info* args, size_t size) + : value_(args, size) {} + + public: + class handle { + public: + explicit handle(detail::custom_value custom) : custom_(custom) {} + + void format(typename Context::parse_context_type& parse_ctx, + Context& ctx) const { + custom_.format(custom_.value, parse_ctx, ctx); + } + + private: + detail::custom_value custom_; + }; + + constexpr basic_format_arg() : type_(detail::type::none_type) {} + + constexpr explicit operator bool() const noexcept { + return type_ != detail::type::none_type; + } + + auto type() const -> detail::type { return type_; } + + auto is_integral() const -> bool { return detail::is_integral_type(type_); } + auto is_arithmetic() const -> bool { + return detail::is_arithmetic_type(type_); + } +}; + +/** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + ``vis(value)`` will be called with the value of type ``double``. + \endrst + */ +template +FMT_CONSTEXPR FMT_INLINE auto visit_format_arg( + Visitor&& vis, const basic_format_arg& arg) -> decltype(vis(0)) { + switch (arg.type_) { + case detail::type::none_type: + break; + case detail::type::int_type: + return vis(arg.value_.int_value); + case detail::type::uint_type: + return vis(arg.value_.uint_value); + case detail::type::long_long_type: + return vis(arg.value_.long_long_value); + case detail::type::ulong_long_type: + return vis(arg.value_.ulong_long_value); + case detail::type::int128_type: + return vis(detail::convert_for_visit(arg.value_.int128_value)); + case detail::type::uint128_type: + return vis(detail::convert_for_visit(arg.value_.uint128_value)); + case detail::type::bool_type: + return vis(arg.value_.bool_value); + case detail::type::char_type: + return vis(arg.value_.char_value); + case detail::type::float_type: + return vis(arg.value_.float_value); + case detail::type::double_type: + return vis(arg.value_.double_value); + case detail::type::long_double_type: + return vis(arg.value_.long_double_value); + case detail::type::cstring_type: + return vis(arg.value_.string.data); + case detail::type::string_type: + using sv = basic_string_view; + return vis(sv(arg.value_.string.data, arg.value_.string.size)); + case detail::type::pointer_type: + return vis(arg.value_.pointer); + case detail::type::custom_type: + return vis(typename basic_format_arg::handle(arg.value_.custom)); + } + return vis(monostate()); +} + +FMT_BEGIN_DETAIL_NAMESPACE + +template +auto copy_str(InputIt begin, InputIt end, appender out) -> appender { + get_container(out).append(begin, end); + return out; +} + +template +FMT_CONSTEXPR auto copy_str(R&& rng, OutputIt out) -> OutputIt { + return detail::copy_str(rng.begin(), rng.end(), out); +} + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500 +// A workaround for gcc 4.8 to make void_t work in a SFINAE context. +template struct void_t_impl { using type = void; }; +template +using void_t = typename detail::void_t_impl::type; +#else +template using void_t = void; +#endif + +template +struct is_output_iterator : std::false_type {}; + +template +struct is_output_iterator< + It, T, + void_t::iterator_category, + decltype(*std::declval() = std::declval())>> + : std::true_type {}; + +template +struct is_back_insert_iterator : std::false_type {}; +template +struct is_back_insert_iterator> + : std::true_type {}; + +template +struct is_contiguous_back_insert_iterator : std::false_type {}; +template +struct is_contiguous_back_insert_iterator> + : is_contiguous {}; +template <> +struct is_contiguous_back_insert_iterator : std::true_type {}; + +// A type-erased reference to an std::locale to avoid a heavy include. +class locale_ref { + private: + const void* locale_; // A type-erased pointer to std::locale. + + public: + constexpr locale_ref() : locale_(nullptr) {} + template explicit locale_ref(const Locale& loc); + + explicit operator bool() const noexcept { return locale_ != nullptr; } + + template auto get() const -> Locale; +}; + +template constexpr auto encode_types() -> unsigned long long { + return 0; +} + +template +constexpr auto encode_types() -> unsigned long long { + return static_cast(mapped_type_constant::value) | + (encode_types() << packed_arg_bits); +} + +template +FMT_CONSTEXPR FMT_INLINE auto make_value(T&& val) -> value { + const auto& arg = arg_mapper().map(FMT_FORWARD(val)); + + constexpr bool formattable_char = + !std::is_same::value; + static_assert(formattable_char, "Mixing character types is disallowed."); + + constexpr bool formattable_const = + !std::is_same::value; + static_assert(formattable_const, "Cannot format a const argument."); + + // Formatting of arbitrary pointers is disallowed. If you want to output + // a pointer cast it to "void *" or "const void *". In particular, this + // forbids formatting of "[const] volatile char *" which is printed as bool + // by iostreams. + constexpr bool formattable_pointer = + !std::is_same::value; + static_assert(formattable_pointer, + "Formatting of non-void pointers is disallowed."); + + constexpr bool formattable = + !std::is_same::value; + static_assert( + formattable, + "Cannot format an argument. To make type T formattable provide a " + "formatter specialization: https://fmt.dev/latest/api.html#udt"); + return {arg}; +} + +template +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg { + basic_format_arg arg; + arg.type_ = mapped_type_constant::value; + arg.value_ = make_value(value); + return arg; +} + +// The type template parameter is there to avoid an ODR violation when using +// a fallback formatter in one translation unit and an implicit conversion in +// another (not recommended). +template +FMT_CONSTEXPR FMT_INLINE auto make_arg(T&& val) -> value { + return make_value(val); +} + +template +FMT_CONSTEXPR inline auto make_arg(T&& value) -> basic_format_arg { + return make_arg(value); +} +FMT_END_DETAIL_NAMESPACE + +// Formatting context. +template class basic_format_context { + public: + /** The character type for the output. */ + using char_type = Char; + + private: + OutputIt out_; + basic_format_args args_; + detail::locale_ref loc_; + + public: + using iterator = OutputIt; + using format_arg = basic_format_arg; + using parse_context_type = basic_format_parse_context; + template using formatter_type = formatter; + + basic_format_context(basic_format_context&&) = default; + basic_format_context(const basic_format_context&) = delete; + void operator=(const basic_format_context&) = delete; + /** + Constructs a ``basic_format_context`` object. References to the arguments are + stored in the object so make sure they have appropriate lifetimes. + */ + constexpr basic_format_context( + OutputIt out, basic_format_args ctx_args, + detail::locale_ref loc = detail::locale_ref()) + : out_(out), args_(ctx_args), loc_(loc) {} + + constexpr auto arg(int id) const -> format_arg { return args_.get(id); } + FMT_CONSTEXPR auto arg(basic_string_view name) -> format_arg { + return args_.get(name); + } + FMT_CONSTEXPR auto arg_id(basic_string_view name) -> int { + return args_.get_id(name); + } + auto args() const -> const basic_format_args& { + return args_; + } + + FMT_CONSTEXPR auto error_handler() -> detail::error_handler { return {}; } + void on_error(const char* message) { error_handler().on_error(message); } + + // Returns an iterator to the beginning of the output range. + FMT_CONSTEXPR auto out() -> iterator { return out_; } + + // Advances the begin iterator to ``it``. + void advance_to(iterator it) { + if (!detail::is_back_insert_iterator()) out_ = it; + } + + FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; } +}; + +template +using buffer_context = + basic_format_context, Char>; +using format_context = buffer_context; + +// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164. +#define FMT_BUFFER_CONTEXT(Char) \ + basic_format_context, Char> + +template +using is_formattable = bool_constant< + !std::is_base_of>().map( + std::declval()))>::value && + !detail::has_fallback_formatter::value>; + +/** + \rst + An array of references to arguments. It can be implicitly converted into + `~fmt::basic_format_args` for passing into type-erased formatting functions + such as `~fmt::vformat`. + \endrst + */ +template +class format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + static const size_t num_args = sizeof...(Args); + static const size_t num_named_args = detail::count_named_args(); + static const bool is_packed = num_args <= detail::max_packed_args; + + using value_type = conditional_t, + basic_format_arg>; + + detail::arg_data + data_; + + friend class basic_format_args; + + static constexpr unsigned long long desc = + (is_packed ? detail::encode_types() + : detail::is_unpacked_bit | num_args) | + (num_named_args != 0 + ? static_cast(detail::has_named_args_bit) + : 0); + + public: + template + FMT_CONSTEXPR FMT_INLINE format_arg_store(T&&... args) + : +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + basic_format_args(*this), +#endif + data_{detail::make_arg< + is_packed, Context, + detail::mapped_type_constant, Context>::value>( + FMT_FORWARD(args))...} { + detail::init_named_args(data_.named_args(), 0, 0, args...); + } +}; + +/** + \rst + Constructs a `~fmt::format_arg_store` object that contains references to + arguments and can be implicitly converted to `~fmt::format_args`. `Context` + can be omitted in which case it defaults to `~fmt::context`. + See `~fmt::arg` for lifetime considerations. + \endrst + */ +template +constexpr auto make_format_args(Args&&... args) + -> format_arg_store...> { + return {FMT_FORWARD(args)...}; +} + +/** + \rst + Returns a named argument to be used in a formatting function. + It should only be used in a call to a formatting function or + `dynamic_format_arg_store::push_back`. + + **Example**:: + + fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + \endrst + */ +template +inline auto arg(const Char* name, const T& arg) -> detail::named_arg { + static_assert(!detail::is_named_arg(), "nested named arguments"); + return {name, arg}; +} + +/** + \rst + A view of a collection of formatting arguments. To avoid lifetime issues it + should only be used as a parameter type in type-erased functions such as + ``vformat``:: + + void vlog(string_view format_str, format_args args); // OK + format_args args = make_format_args(42); // Error: dangling reference + \endrst + */ +template class basic_format_args { + public: + using size_type = int; + using format_arg = basic_format_arg; + + private: + // A descriptor that contains information about formatting arguments. + // If the number of arguments is less or equal to max_packed_args then + // argument types are passed in the descriptor. This reduces binary code size + // per formatting function call. + unsigned long long desc_; + union { + // If is_packed() returns true then argument values are stored in values_; + // otherwise they are stored in args_. This is done to improve cache + // locality and reduce compiled code size since storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const detail::value* values_; + const format_arg* args_; + }; + + constexpr auto is_packed() const -> bool { + return (desc_ & detail::is_unpacked_bit) == 0; + } + auto has_named_args() const -> bool { + return (desc_ & detail::has_named_args_bit) != 0; + } + + FMT_CONSTEXPR auto type(int index) const -> detail::type { + int shift = index * detail::packed_arg_bits; + unsigned int mask = (1 << detail::packed_arg_bits) - 1; + return static_cast((desc_ >> shift) & mask); + } + + constexpr FMT_INLINE basic_format_args(unsigned long long desc, + const detail::value* values) + : desc_(desc), values_(values) {} + constexpr basic_format_args(unsigned long long desc, const format_arg* args) + : desc_(desc), args_(args) {} + + public: + constexpr basic_format_args() : desc_(0), args_(nullptr) {} + + /** + \rst + Constructs a `basic_format_args` object from `~fmt::format_arg_store`. + \endrst + */ + template + constexpr FMT_INLINE basic_format_args( + const format_arg_store& store) + : basic_format_args(format_arg_store::desc, + store.data_.args()) {} + + /** + \rst + Constructs a `basic_format_args` object from + `~fmt::dynamic_format_arg_store`. + \endrst + */ + constexpr FMT_INLINE basic_format_args( + const dynamic_format_arg_store& store) + : basic_format_args(store.get_types(), store.data()) {} + + /** + \rst + Constructs a `basic_format_args` object from a dynamic set of arguments. + \endrst + */ + constexpr basic_format_args(const format_arg* args, int count) + : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count), + args) {} + + /** Returns the argument with the specified id. */ + FMT_CONSTEXPR auto get(int id) const -> format_arg { + format_arg arg; + if (!is_packed()) { + if (id < max_size()) arg = args_[id]; + return arg; + } + if (id >= detail::max_packed_args) return arg; + arg.type_ = type(id); + if (arg.type_ == detail::type::none_type) return arg; + arg.value_ = values_[id]; + return arg; + } + + template + auto get(basic_string_view name) const -> format_arg { + int id = get_id(name); + return id >= 0 ? get(id) : format_arg(); + } + + template + auto get_id(basic_string_view name) const -> int { + if (!has_named_args()) return -1; + const auto& named_args = + (is_packed() ? values_[-1] : args_[-1].value_).named_args; + for (size_t i = 0; i < named_args.size; ++i) { + if (named_args.data[i].name == name) return named_args.data[i].id; + } + return -1; + } + + auto max_size() const -> int { + unsigned long long max_packed = detail::max_packed_args; + return static_cast(is_packed() ? max_packed + : desc_ & ~detail::is_unpacked_bit); + } +}; + +/** An alias to ``basic_format_args``. */ +// A separate type would result in shorter symbols but break ABI compatibility +// between clang and gcc on ARM (#1919). +using format_args = basic_format_args; + +// We cannot use enum classes as bit fields because of a gcc bug, so we put them +// in namespaces instead (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414). +// Additionally, if an underlying type is specified, older gcc incorrectly warns +// that the type is too small. Both bugs are fixed in gcc 9.3. +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 903 +# define FMT_ENUM_UNDERLYING_TYPE(type) +#else +# define FMT_ENUM_UNDERLYING_TYPE(type) : type +#endif +namespace align { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, left, right, center, + numeric}; +} +using align_t = align::type; +namespace sign { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, minus, plus, space}; +} +using sign_t = sign::type; + +FMT_BEGIN_DETAIL_NAMESPACE + +// Workaround an array initialization issue in gcc 4.8. +template struct fill_t { + private: + enum { max_size = 4 }; + Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)}; + unsigned char size_ = 1; + + public: + FMT_CONSTEXPR void operator=(basic_string_view s) { + auto size = s.size(); + if (size > max_size) return throw_format_error("invalid fill"); + for (size_t i = 0; i < size; ++i) data_[i] = s[i]; + size_ = static_cast(size); + } + + constexpr auto size() const -> size_t { return size_; } + constexpr auto data() const -> const Char* { return data_; } + + FMT_CONSTEXPR auto operator[](size_t index) -> Char& { return data_[index]; } + FMT_CONSTEXPR auto operator[](size_t index) const -> const Char& { + return data_[index]; + } +}; +FMT_END_DETAIL_NAMESPACE + +enum class presentation_type : unsigned char { + none, + // Integer types should go first, + dec, // 'd' + oct, // 'o' + hex_lower, // 'x' + hex_upper, // 'X' + bin_lower, // 'b' + bin_upper, // 'B' + hexfloat_lower, // 'a' + hexfloat_upper, // 'A' + exp_lower, // 'e' + exp_upper, // 'E' + fixed_lower, // 'f' + fixed_upper, // 'F' + general_lower, // 'g' + general_upper, // 'G' + chr, // 'c' + string, // 's' + pointer, // 'p' + debug // '?' +}; + +// Format specifiers for built-in and string types. +template struct basic_format_specs { + int width; + int precision; + presentation_type type; + align_t align : 4; + sign_t sign : 3; + bool alt : 1; // Alternate form ('#'). + bool localized : 1; + detail::fill_t fill; + + constexpr basic_format_specs() + : width(0), + precision(-1), + type(presentation_type::none), + align(align::none), + sign(sign::none), + alt(false), + localized(false) {} +}; + +using format_specs = basic_format_specs; + +FMT_BEGIN_DETAIL_NAMESPACE + +enum class arg_id_kind { none, index, name }; + +// An argument reference. +template struct arg_ref { + FMT_CONSTEXPR arg_ref() : kind(arg_id_kind::none), val() {} + + FMT_CONSTEXPR explicit arg_ref(int index) + : kind(arg_id_kind::index), val(index) {} + FMT_CONSTEXPR explicit arg_ref(basic_string_view name) + : kind(arg_id_kind::name), val(name) {} + + FMT_CONSTEXPR auto operator=(int idx) -> arg_ref& { + kind = arg_id_kind::index; + val.index = idx; + return *this; + } + + arg_id_kind kind; + union value { + FMT_CONSTEXPR value(int id = 0) : index{id} {} + FMT_CONSTEXPR value(basic_string_view n) : name(n) {} + + int index; + basic_string_view name; + } val; +}; + +// Format specifiers with width and precision resolved at formatting rather +// than parsing time to allow re-using the same parsed specifiers with +// different sets of arguments (precompilation of format strings). +template +struct dynamic_format_specs : basic_format_specs { + arg_ref width_ref; + arg_ref precision_ref; +}; + +struct auto_id {}; + +// A format specifier handler that sets fields in basic_format_specs. +template class specs_setter { + protected: + basic_format_specs& specs_; + + public: + explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) + : specs_(specs) {} + + FMT_CONSTEXPR specs_setter(const specs_setter& other) + : specs_(other.specs_) {} + + FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + specs_.fill = fill; + } + FMT_CONSTEXPR void on_sign(sign_t s) { specs_.sign = s; } + FMT_CONSTEXPR void on_hash() { specs_.alt = true; } + FMT_CONSTEXPR void on_localized() { specs_.localized = true; } + + FMT_CONSTEXPR void on_zero() { + if (specs_.align == align::none) specs_.align = align::numeric; + specs_.fill[0] = Char('0'); + } + + FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } + FMT_CONSTEXPR void on_precision(int precision) { + specs_.precision = precision; + } + FMT_CONSTEXPR void end_precision() {} + + FMT_CONSTEXPR void on_type(presentation_type type) { specs_.type = type; } +}; + +// Format spec handler that saves references to arguments representing dynamic +// width and precision to be resolved at formatting time. +template +class dynamic_specs_handler + : public specs_setter { + public: + using char_type = typename ParseContext::char_type; + + FMT_CONSTEXPR dynamic_specs_handler(dynamic_format_specs& specs, + ParseContext& ctx) + : specs_setter(specs), specs_(specs), context_(ctx) {} + + FMT_CONSTEXPR dynamic_specs_handler(const dynamic_specs_handler& other) + : specs_setter(other), + specs_(other.specs_), + context_(other.context_) {} + + template FMT_CONSTEXPR void on_dynamic_width(Id arg_id) { + specs_.width_ref = make_arg_ref(arg_id); + } + + template FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) { + specs_.precision_ref = make_arg_ref(arg_id); + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); + } + + private: + dynamic_format_specs& specs_; + ParseContext& context_; + + using arg_ref_type = arg_ref; + + FMT_CONSTEXPR auto make_arg_ref(int arg_id) -> arg_ref_type { + context_.check_arg_id(arg_id); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(auto_id) -> arg_ref_type { + int arg_id = context_.next_arg_id(); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(basic_string_view arg_id) + -> arg_ref_type { + context_.check_arg_id(arg_id); + basic_string_view format_str( + context_.begin(), to_unsigned(context_.end() - context_.begin())); + return arg_ref_type(arg_id); + } +}; + +template constexpr bool is_ascii_letter(Char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +// Converts a character to ASCII. Returns a number > 127 on conversion failure. +template ::value)> +constexpr auto to_ascii(Char c) -> Char { + return c; +} +template ::value)> +constexpr auto to_ascii(Char c) -> underlying_t { + return c; +} + +FMT_CONSTEXPR inline auto code_point_length_impl(char c) -> int { + return "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0\0\0\2\2\2\2\3\3\4" + [static_cast(c) >> 3]; +} + +template +FMT_CONSTEXPR auto code_point_length(const Char* begin) -> int { + if (const_check(sizeof(Char) != 1)) return 1; + int len = code_point_length_impl(static_cast(*begin)); + + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + return len + !len; +} + +// Return the result via the out param to workaround gcc bug 77539. +template +FMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr& out) -> bool { + for (out = first; out != last; ++out) { + if (*out == value) return true; + } + return false; +} + +template <> +inline auto find(const char* first, const char* last, char value, + const char*& out) -> bool { + out = static_cast( + std::memchr(first, value, to_unsigned(last - first))); + return out != nullptr; +} + +// Parses the range [begin, end) as an unsigned integer. This function assumes +// that the range is non-empty and the first character is a digit. +template +FMT_CONSTEXPR auto parse_nonnegative_int(const Char*& begin, const Char* end, + int error_value) noexcept -> int { + FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); + unsigned value = 0, prev = 0; + auto p = begin; + do { + prev = value; + value = value * 10 + unsigned(*p - '0'); + ++p; + } while (p != end && '0' <= *p && *p <= '9'); + auto num_digits = p - begin; + begin = p; + if (num_digits <= std::numeric_limits::digits10) + return static_cast(value); + // Check for overflow. + const unsigned max = to_unsigned((std::numeric_limits::max)()); + return num_digits == std::numeric_limits::digits10 + 1 && + prev * 10ull + unsigned(p[-1] - '0') <= max + ? static_cast(value) + : error_value; +} + +// Parses fill and alignment. +template +FMT_CONSTEXPR auto parse_align(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + auto align = align::none; + auto p = begin + code_point_length(begin); + if (end - p <= 0) p = begin; + for (;;) { + switch (to_ascii(*p)) { + case '<': + align = align::left; + break; + case '>': + align = align::right; + break; + case '^': + align = align::center; + break; + default: + break; + } + if (align != align::none) { + if (p != begin) { + auto c = *begin; + if (c == '{') + return handler.on_error("invalid fill character '{'"), begin; + handler.on_fill(basic_string_view(begin, to_unsigned(p - begin))); + begin = p + 1; + } else + ++begin; + handler.on_align(align); + break; + } else if (p == begin) { + break; + } + p = begin; + } + return begin; +} + +template FMT_CONSTEXPR bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +template +FMT_CONSTEXPR auto do_parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + Char c = *begin; + if (c >= '0' && c <= '9') { + int index = 0; + if (c != '0') + index = + parse_nonnegative_int(begin, end, (std::numeric_limits::max)()); + else + ++begin; + if (begin == end || (*begin != '}' && *begin != ':')) + handler.on_error("invalid format string"); + else + handler(index); + return begin; + } + if (!is_name_start(c)) { + handler.on_error("invalid format string"); + return begin; + } + auto it = begin; + do { + ++it; + } while (it != end && (is_name_start(c = *it) || ('0' <= c && c <= '9'))); + handler(basic_string_view(begin, to_unsigned(it - begin))); + return it; +} + +template +FMT_CONSTEXPR FMT_INLINE auto parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + Char c = *begin; + if (c != '}' && c != ':') return do_parse_arg_id(begin, end, handler); + handler(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_width(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct width_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_width(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_width(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_width(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + FMT_ASSERT(begin != end, ""); + if ('0' <= *begin && *begin <= '9') { + int width = parse_nonnegative_int(begin, end, -1); + if (width != -1) + handler.on_width(width); + else + handler.on_error("number is too big"); + } else if (*begin == '{') { + ++begin; + if (begin != end) begin = parse_arg_id(begin, end, width_adapter{handler}); + if (begin == end || *begin != '}') + return handler.on_error("invalid format string"), begin; + ++begin; + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_precision(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct precision_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_precision(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_precision(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_precision(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + auto c = begin != end ? *begin : Char(); + if ('0' <= c && c <= '9') { + auto precision = parse_nonnegative_int(begin, end, -1); + if (precision != -1) + handler.on_precision(precision); + else + handler.on_error("number is too big"); + } else if (c == '{') { + ++begin; + if (begin != end) + begin = parse_arg_id(begin, end, precision_adapter{handler}); + if (begin == end || *begin++ != '}') + return handler.on_error("invalid format string"), begin; + } else { + return handler.on_error("missing precision specifier"), begin; + } + handler.end_precision(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_presentation_type(Char type) -> presentation_type { + switch (to_ascii(type)) { + case 'd': + return presentation_type::dec; + case 'o': + return presentation_type::oct; + case 'x': + return presentation_type::hex_lower; + case 'X': + return presentation_type::hex_upper; + case 'b': + return presentation_type::bin_lower; + case 'B': + return presentation_type::bin_upper; + case 'a': + return presentation_type::hexfloat_lower; + case 'A': + return presentation_type::hexfloat_upper; + case 'e': + return presentation_type::exp_lower; + case 'E': + return presentation_type::exp_upper; + case 'f': + return presentation_type::fixed_lower; + case 'F': + return presentation_type::fixed_upper; + case 'g': + return presentation_type::general_lower; + case 'G': + return presentation_type::general_upper; + case 'c': + return presentation_type::chr; + case 's': + return presentation_type::string; + case 'p': + return presentation_type::pointer; + case '?': + return presentation_type::debug; + default: + return presentation_type::none; + } +} + +// Parses standard format specifiers and sends notifications about parsed +// components to handler. +template +FMT_CONSTEXPR FMT_INLINE auto parse_format_specs(const Char* begin, + const Char* end, + SpecHandler&& handler) + -> const Char* { + if (1 < end - begin && begin[1] == '}' && is_ascii_letter(*begin) && + *begin != 'L') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + return begin; + } + + if (begin == end) return begin; + + begin = parse_align(begin, end, handler); + if (begin == end) return begin; + + // Parse sign. + switch (to_ascii(*begin)) { + case '+': + handler.on_sign(sign::plus); + ++begin; + break; + case '-': + handler.on_sign(sign::minus); + ++begin; + break; + case ' ': + handler.on_sign(sign::space); + ++begin; + break; + default: + break; + } + if (begin == end) return begin; + + if (*begin == '#') { + handler.on_hash(); + if (++begin == end) return begin; + } + + // Parse zero flag. + if (*begin == '0') { + handler.on_zero(); + if (++begin == end) return begin; + } + + begin = parse_width(begin, end, handler); + if (begin == end) return begin; + + // Parse precision. + if (*begin == '.') { + begin = parse_precision(begin, end, handler); + if (begin == end) return begin; + } + + if (*begin == 'L') { + handler.on_localized(); + ++begin; + } + + // Parse type. + if (begin != end && *begin != '}') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_replacement_field(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + struct id_adapter { + Handler& handler; + int arg_id; + + FMT_CONSTEXPR void operator()() { arg_id = handler.on_arg_id(); } + FMT_CONSTEXPR void operator()(int id) { arg_id = handler.on_arg_id(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + arg_id = handler.on_arg_id(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + if (begin == end) return handler.on_error("invalid format string"), end; + if (*begin == '}') { + handler.on_replacement_field(handler.on_arg_id(), begin); + } else if (*begin == '{') { + handler.on_text(begin, begin + 1); + } else { + auto adapter = id_adapter{handler, 0}; + begin = parse_arg_id(begin, end, adapter); + Char c = begin != end ? *begin : Char(); + if (c == '}') { + handler.on_replacement_field(adapter.arg_id, begin); + } else if (c == ':') { + begin = handler.on_format_specs(adapter.arg_id, begin + 1, end); + if (begin == end || *begin != '}') + return handler.on_error("unknown format specifier"), end; + } else { + return handler.on_error("missing '}' in format string"), end; + } + } + return begin + 1; +} + +template +FMT_CONSTEXPR FMT_INLINE void parse_format_string( + basic_string_view format_str, Handler&& handler) { + // Workaround a name-lookup bug in MSVC's modules implementation. + using detail::find; + + auto begin = format_str.data(); + auto end = begin + format_str.size(); + if (end - begin < 32) { + // Use a simple loop instead of memchr for small strings. + const Char* p = begin; + while (p != end) { + auto c = *p++; + if (c == '{') { + handler.on_text(begin, p - 1); + begin = p = parse_replacement_field(p - 1, end, handler); + } else if (c == '}') { + if (p == end || *p != '}') + return handler.on_error("unmatched '}' in format string"); + handler.on_text(begin, p); + begin = ++p; + } + } + handler.on_text(begin, end); + return; + } + struct writer { + FMT_CONSTEXPR void operator()(const Char* from, const Char* to) { + if (from == to) return; + for (;;) { + const Char* p = nullptr; + if (!find(from, to, Char('}'), p)) + return handler_.on_text(from, to); + ++p; + if (p == to || *p != '}') + return handler_.on_error("unmatched '}' in format string"); + handler_.on_text(from, p); + from = p + 1; + } + } + Handler& handler_; + } write = {handler}; + while (begin != end) { + // Doing two passes with memchr (one for '{' and another for '}') is up to + // 2.5x faster than the naive one-pass implementation on big format strings. + const Char* p = begin; + if (*begin != '{' && !find(begin + 1, end, Char('{'), p)) + return write(begin, end); + write(begin, p); + begin = parse_replacement_field(p, end, handler); + } +} + +template ::value> struct strip_named_arg { + using type = T; +}; +template struct strip_named_arg { + using type = remove_cvref_t; +}; + +template +FMT_CONSTEXPR auto parse_format_specs(ParseContext& ctx) + -> decltype(ctx.begin()) { + using char_type = typename ParseContext::char_type; + using context = buffer_context; + using stripped_type = typename strip_named_arg::type; + using mapped_type = conditional_t< + mapped_type_constant::value != type::custom_type, + decltype(arg_mapper().map(std::declval())), + stripped_type>; + auto f = conditional_t::value, + formatter, + fallback_formatter>(); + return f.parse(ctx); +} + +template +FMT_CONSTEXPR void check_int_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type > presentation_type::bin_upper && type != presentation_type::chr) + eh.on_error("invalid type specifier"); +} + +// Checks char specs and returns true if the type spec is char (and not int). +template +FMT_CONSTEXPR auto check_char_specs(const basic_format_specs& specs, + ErrorHandler&& eh = {}) -> bool { + if (specs.type != presentation_type::none && + specs.type != presentation_type::chr && + specs.type != presentation_type::debug) { + check_int_type_spec(specs.type, eh); + return false; + } + if (specs.align == align::numeric || specs.sign != sign::none || specs.alt) + eh.on_error("invalid format specifier for char"); + return true; +} + +// A floating-point presentation format. +enum class float_format : unsigned char { + general, // General: exponent notation or fixed point based on magnitude. + exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. + fixed, // Fixed point with the default precision of 6, e.g. 0.0012. + hex +}; + +struct float_specs { + int precision; + float_format format : 8; + sign_t sign : 8; + bool upper : 1; + bool locale : 1; + bool binary32 : 1; + bool showpoint : 1; +}; + +template +FMT_CONSTEXPR auto parse_float_type_spec(const basic_format_specs& specs, + ErrorHandler&& eh = {}) + -> float_specs { + auto result = float_specs(); + result.showpoint = specs.alt; + result.locale = specs.localized; + switch (specs.type) { + case presentation_type::none: + result.format = float_format::general; + break; + case presentation_type::general_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::general_lower: + result.format = float_format::general; + break; + case presentation_type::exp_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::exp_lower: + result.format = float_format::exp; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::fixed_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::fixed_lower: + result.format = float_format::fixed; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::hexfloat_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::hexfloat_lower: + result.format = float_format::hex; + break; + default: + eh.on_error("invalid type specifier"); + break; + } + return result; +} + +template +FMT_CONSTEXPR auto check_cstring_type_spec(presentation_type type, + ErrorHandler&& eh = {}) -> bool { + if (type == presentation_type::none || type == presentation_type::string || + type == presentation_type::debug) + return true; + if (type != presentation_type::pointer) eh.on_error("invalid type specifier"); + return false; +} + +template +FMT_CONSTEXPR void check_string_type_spec(presentation_type type, + ErrorHandler&& eh = {}) { + if (type != presentation_type::none && type != presentation_type::string && + type != presentation_type::debug) + eh.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_pointer_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type != presentation_type::none && type != presentation_type::pointer) + eh.on_error("invalid type specifier"); +} + +// A parse_format_specs handler that checks if specifiers are consistent with +// the argument type. +template class specs_checker : public Handler { + private: + detail::type arg_type_; + + FMT_CONSTEXPR void require_numeric_argument() { + if (!is_arithmetic_type(arg_type_)) + this->on_error("format specifier requires numeric argument"); + } + + public: + FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type) + : Handler(handler), arg_type_(arg_type) {} + + FMT_CONSTEXPR void on_align(align_t align) { + if (align == align::numeric) require_numeric_argument(); + Handler::on_align(align); + } + + FMT_CONSTEXPR void on_sign(sign_t s) { + require_numeric_argument(); + if (is_integral_type(arg_type_) && arg_type_ != type::int_type && + arg_type_ != type::long_long_type && arg_type_ != type::int128_type && + arg_type_ != type::char_type) { + this->on_error("format specifier requires signed argument"); + } + Handler::on_sign(s); + } + + FMT_CONSTEXPR void on_hash() { + require_numeric_argument(); + Handler::on_hash(); + } + + FMT_CONSTEXPR void on_localized() { + require_numeric_argument(); + Handler::on_localized(); + } + + FMT_CONSTEXPR void on_zero() { + require_numeric_argument(); + Handler::on_zero(); + } + + FMT_CONSTEXPR void end_precision() { + if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) + this->on_error("precision not allowed for this argument type"); + } +}; + +constexpr int invalid_arg_index = -1; + +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template +constexpr auto get_arg_index_by_name(basic_string_view name) -> int { + if constexpr (detail::is_statically_named_arg()) { + if (name == T::name) return N; + } + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name(name); + (void)name; // Workaround an MSVC bug about "unused" parameter. + return invalid_arg_index; +} +#endif + +template +FMT_CONSTEXPR auto get_arg_index_by_name(basic_string_view name) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name<0, Args...>(name); +#endif + (void)name; + return invalid_arg_index; +} + +template +class format_string_checker { + private: + // In the future basic_format_parse_context will replace compile_parse_context + // here and will use is_constant_evaluated and downcasting to access the data + // needed for compile-time checks: https://godbolt.org/z/GvWzcTjh1. + using parse_context_type = compile_parse_context; + static constexpr int num_args = sizeof...(Args); + + // Format specifier parsing function. + using parse_func = const Char* (*)(parse_context_type&); + + parse_context_type context_; + parse_func parse_funcs_[num_args > 0 ? static_cast(num_args) : 1]; + type types_[num_args > 0 ? static_cast(num_args) : 1]; + + public: + explicit FMT_CONSTEXPR format_string_checker( + basic_string_view format_str, ErrorHandler eh) + : context_(format_str, num_args, types_, eh), + parse_funcs_{&parse_format_specs...}, + types_{ + mapped_type_constant>::value...} { + } + + FMT_CONSTEXPR void on_text(const Char*, const Char*) {} + + FMT_CONSTEXPR auto on_arg_id() -> int { return context_.next_arg_id(); } + FMT_CONSTEXPR auto on_arg_id(int id) -> int { + return context_.check_arg_id(id), id; + } + FMT_CONSTEXPR auto on_arg_id(basic_string_view id) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + auto index = get_arg_index_by_name(id); + if (index == invalid_arg_index) on_error("named argument is not found"); + return context_.check_arg_id(index), index; +#else + (void)id; + on_error("compile-time checks for named arguments require C++20 support"); + return 0; +#endif + } + + FMT_CONSTEXPR void on_replacement_field(int, const Char*) {} + + FMT_CONSTEXPR auto on_format_specs(int id, const Char* begin, const Char*) + -> const Char* { + context_.advance_to(context_.begin() + (begin - &*context_.begin())); + // id >= 0 check is a workaround for gcc 10 bug (#2065). + return id >= 0 && id < num_args ? parse_funcs_[id](context_) : begin; + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); + } +}; + +// Reports a compile-time error if S is not a valid format string. +template ::value)> +FMT_INLINE void check_format_string(const S&) { +#ifdef FMT_ENFORCE_COMPILE_STRING + static_assert(is_compile_string::value, + "FMT_ENFORCE_COMPILE_STRING requires all format strings to use " + "FMT_STRING."); +#endif +} +template ::value)> +void check_format_string(S format_str) { + FMT_CONSTEXPR auto s = basic_string_view(format_str); + using checker = format_string_checker...>; + FMT_CONSTEXPR bool invalid_format = + (parse_format_string(s, checker(s, {})), true); + ignore_unused(invalid_format); +} + +template +void vformat_to( + buffer& buf, basic_string_view fmt, + basic_format_args)> args, + locale_ref loc = {}); + +FMT_API void vprint_mojibake(std::FILE*, string_view, format_args); +#ifndef _WIN32 +inline void vprint_mojibake(std::FILE*, string_view, format_args) {} +#endif +FMT_END_DETAIL_NAMESPACE + +// A formatter specialization for the core types corresponding to detail::type +// constants. +template +struct formatter::value != + detail::type::custom_type>> { + private: + detail::dynamic_format_specs specs_; + + public: + // Parses format specifiers stopping either at the end of the range or at the + // terminating '}'. + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin == end) return begin; + using handler_type = detail::dynamic_specs_handler; + auto type = detail::type_constant::value; + auto checker = + detail::specs_checker(handler_type(specs_, ctx), type); + auto it = detail::parse_format_specs(begin, end, checker); + auto eh = ctx.error_handler(); + switch (type) { + case detail::type::none_type: + FMT_ASSERT(false, "invalid argument type"); + break; + case detail::type::bool_type: + if (specs_.type == presentation_type::none || + specs_.type == presentation_type::string) { + break; + } + FMT_FALLTHROUGH; + case detail::type::int_type: + case detail::type::uint_type: + case detail::type::long_long_type: + case detail::type::ulong_long_type: + case detail::type::int128_type: + case detail::type::uint128_type: + detail::check_int_type_spec(specs_.type, eh); + break; + case detail::type::char_type: + detail::check_char_specs(specs_, eh); + break; + case detail::type::float_type: + if (detail::const_check(FMT_USE_FLOAT)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "float support disabled"); + break; + case detail::type::double_type: + if (detail::const_check(FMT_USE_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "double support disabled"); + break; + case detail::type::long_double_type: + if (detail::const_check(FMT_USE_LONG_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "long double support disabled"); + break; + case detail::type::cstring_type: + detail::check_cstring_type_spec(specs_.type, eh); + break; + case detail::type::string_type: + detail::check_string_type_spec(specs_.type, eh); + break; + case detail::type::pointer_type: + detail::check_pointer_type_spec(specs_.type, eh); + break; + case detail::type::custom_type: + // Custom format specifiers are checked in parse functions of + // formatter specializations. + break; + } + return it; + } + + template ::value, + enable_if_t<(U == detail::type::string_type || + U == detail::type::cstring_type || + U == detail::type::char_type), + int> = 0> + FMT_CONSTEXPR void set_debug_format() { + specs_.type = presentation_type::debug; + } + + template + FMT_CONSTEXPR auto format(const T& val, FormatContext& ctx) const + -> decltype(ctx.out()); +}; + +#define FMT_FORMAT_AS(Type, Base) \ + template \ + struct formatter : formatter { \ + template \ + auto format(Type const& val, FormatContext& ctx) const \ + -> decltype(ctx.out()) { \ + return formatter::format(static_cast(val), ctx); \ + } \ + } + +FMT_FORMAT_AS(signed char, int); +FMT_FORMAT_AS(unsigned char, unsigned); +FMT_FORMAT_AS(short, int); +FMT_FORMAT_AS(unsigned short, unsigned); +FMT_FORMAT_AS(long, long long); +FMT_FORMAT_AS(unsigned long, unsigned long long); +FMT_FORMAT_AS(Char*, const Char*); +FMT_FORMAT_AS(std::basic_string, basic_string_view); +FMT_FORMAT_AS(std::nullptr_t, const void*); +FMT_FORMAT_AS(detail::std_string_view, basic_string_view); + +template struct basic_runtime { basic_string_view str; }; + +/** A compile-time format string. */ +template class basic_format_string { + private: + basic_string_view str_; + + public: + template >::value)> + FMT_CONSTEVAL FMT_INLINE basic_format_string(const S& s) : str_(s) { + static_assert( + detail::count< + (std::is_base_of>::value && + std::is_reference::value)...>() == 0, + "passing views as lvalues is disallowed"); +#ifdef FMT_HAS_CONSTEVAL + if constexpr (detail::count_named_args() == + detail::count_statically_named_args()) { + using checker = detail::format_string_checker...>; + detail::parse_format_string(str_, checker(s, {})); + } +#else + detail::check_format_string(s); +#endif + } + basic_format_string(basic_runtime r) : str_(r.str) {} + + FMT_INLINE operator basic_string_view() const { return str_; } +}; + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +// Workaround broken conversion on older gcc. +template using format_string = string_view; +inline auto runtime(string_view s) -> string_view { return s; } +#else +template +using format_string = basic_format_string...>; +/** + \rst + Creates a runtime format string. + + **Example**:: + + // Check format string at runtime instead of compile-time. + fmt::print(fmt::runtime("{:d}"), "I am not a number"); + \endrst + */ +inline auto runtime(string_view s) -> basic_runtime { return {{s}}; } +#endif + +FMT_API auto vformat(string_view fmt, format_args args) -> std::string; + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and returns the result + as a string. + + **Example**:: + + #include + std::string message = fmt::format("The answer is {}.", 42); + \endrst +*/ +template +FMT_NODISCARD FMT_INLINE auto format(format_string fmt, T&&... args) + -> std::string { + return vformat(fmt, fmt::make_format_args(args...)); +} + +/** Formats a string and writes the output to ``out``. */ +template ::value)> +auto vformat_to(OutputIt out, string_view fmt, format_args args) -> OutputIt { + using detail::get_buffer; + auto&& buf = get_buffer(out); + detail::vformat_to(buf, fmt, args, {}); + return detail::get_iterator(buf); +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt``, writes the result to + the output iterator ``out`` and returns the iterator past the end of the output + range. `format_to` does not append a terminating null character. + + **Example**:: + + auto out = std::vector(); + fmt::format_to(std::back_inserter(out), "{}", 42); + \endrst + */ +template ::value)> +FMT_INLINE auto format_to(OutputIt out, format_string fmt, T&&... args) + -> OutputIt { + return vformat_to(out, fmt, fmt::make_format_args(args...)); +} + +template struct format_to_n_result { + /** Iterator past the end of the output range. */ + OutputIt out; + /** Total (not truncated) output size. */ + size_t size; +}; + +template ::value)> +auto vformat_to_n(OutputIt out, size_t n, string_view fmt, format_args args) + -> format_to_n_result { + using traits = detail::fixed_buffer_traits; + auto buf = detail::iterator_buffer(out, n); + detail::vformat_to(buf, fmt, args, {}); + return {buf.out(), buf.count()}; +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt``, writes up to ``n`` + characters of the result to the output iterator ``out`` and returns the total + (not truncated) output size and the iterator past the end of the output range. + `format_to_n` does not append a terminating null character. + \endrst + */ +template ::value)> +FMT_INLINE auto format_to_n(OutputIt out, size_t n, format_string fmt, + T&&... args) -> format_to_n_result { + return vformat_to_n(out, n, fmt, fmt::make_format_args(args...)); +} + +/** Returns the number of chars in the output of ``format(fmt, args...)``. */ +template +FMT_NODISCARD FMT_INLINE auto formatted_size(format_string fmt, + T&&... args) -> size_t { + auto buf = detail::counting_buffer<>(); + detail::vformat_to(buf, string_view(fmt), fmt::make_format_args(args...), {}); + return buf.count(); +} + +FMT_API void vprint(string_view fmt, format_args args); +FMT_API void vprint(std::FILE* f, string_view fmt, format_args args); + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and writes the output + to ``stdout``. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template +FMT_INLINE void print(format_string fmt, T&&... args) { + const auto& vargs = fmt::make_format_args(args...); + return detail::is_utf8() ? vprint(fmt, vargs) + : detail::vprint_mojibake(stdout, fmt, vargs); +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt`` and writes the + output to the file ``f``. + + **Example**:: + + fmt::print(stderr, "Don't {}!", "panic"); + \endrst + */ +template +FMT_INLINE void print(std::FILE* f, format_string fmt, T&&... args) { + const auto& vargs = fmt::make_format_args(args...); + return detail::is_utf8() ? vprint(f, fmt, vargs) + : detail::vprint_mojibake(f, fmt, vargs); +} + +FMT_MODULE_EXPORT_END +FMT_GCC_PRAGMA("GCC pop_options") +FMT_END_NAMESPACE + +#ifdef FMT_HEADER_ONLY +# include "format.h" +#endif +#endif // FMT_CORE_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/fmt.license.rst b/Thirdparty/spdlog/include/spdlog/fmt/bundled/fmt.license.rst new file mode 100644 index 0000000..f0ec3db --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/fmt.license.rst @@ -0,0 +1,27 @@ +Copyright (c) 2012 - present, Victor Zverovich + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/format-inl.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/format-inl.h new file mode 100644 index 0000000..22b1ec8 --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/format-inl.h @@ -0,0 +1,1723 @@ +// Formatting library for C++ - implementation +// +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_FORMAT_INL_H_ +#define FMT_FORMAT_INL_H_ + +#include +#include +#include // errno +#include +#include +#include +#include // std::memmove +#include +#include + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +# include +#endif + +#ifdef _WIN32 +# include // _isatty +#endif + +#include "format.h" + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_FUNC void assert_fail(const char* file, int line, const char* message) { + // Use unchecked std::fprintf to avoid triggering another assertion when + // writing to stderr fails + std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message); + // Chosen instead of std::abort to satisfy Clang in CUDA mode during device + // code pass. + std::terminate(); +} + +FMT_FUNC void throw_format_error(const char* message) { + FMT_THROW(format_error(message)); +} + +FMT_FUNC void format_error_code(detail::buffer& out, int error_code, + string_view message) noexcept { + // Report error code making sure that the output fits into + // inline_buffer_size to avoid dynamic memory allocation and potential + // bad_alloc. + out.try_resize(0); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + auto abs_value = static_cast>(error_code); + if (detail::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += detail::to_unsigned(detail::count_digits(abs_value)); + auto it = buffer_appender(out); + if (message.size() <= inline_buffer_size - error_code_size) + format_to(it, FMT_STRING("{}{}"), message, SEP); + format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code); + FMT_ASSERT(out.size() <= inline_buffer_size, ""); +} + +FMT_FUNC void report_error(format_func func, int error_code, + const char* message) noexcept { + memory_buffer full_message; + func(full_message, error_code, message); + // Don't use fwrite_fully because the latter may throw. + if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0) + std::fputc('\n', stderr); +} + +// A wrapper around fwrite that throws on error. +inline void fwrite_fully(const void* ptr, size_t size, size_t count, + FILE* stream) { + size_t written = std::fwrite(ptr, size, count, stream); + if (written < count) + FMT_THROW(system_error(errno, FMT_STRING("cannot write to file"))); +} + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +template +locale_ref::locale_ref(const Locale& loc) : locale_(&loc) { + static_assert(std::is_same::value, ""); +} + +template Locale locale_ref::get() const { + static_assert(std::is_same::value, ""); + return locale_ ? *static_cast(locale_) : std::locale(); +} + +template +FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result { + auto& facet = std::use_facet>(loc.get()); + auto grouping = facet.grouping(); + auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep(); + return {std::move(grouping), thousands_sep}; +} +template FMT_FUNC Char decimal_point_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .decimal_point(); +} +#else +template +FMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result { + return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR}; +} +template FMT_FUNC Char decimal_point_impl(locale_ref) { + return '.'; +} +#endif +} // namespace detail + +#if !FMT_MSC_VERSION +FMT_API FMT_FUNC format_error::~format_error() noexcept = default; +#endif + +FMT_FUNC std::system_error vsystem_error(int error_code, string_view format_str, + format_args args) { + auto ec = std::error_code(error_code, std::generic_category()); + return std::system_error(ec, vformat(format_str, args)); +} + +namespace detail { + +template inline bool operator==(basic_fp x, basic_fp y) { + return x.f == y.f && x.e == y.e; +} + +// Compilers should be able to optimize this into the ror instruction. +FMT_CONSTEXPR inline uint32_t rotr(uint32_t n, uint32_t r) noexcept { + r &= 31; + return (n >> r) | (n << (32 - r)); +} +FMT_CONSTEXPR inline uint64_t rotr(uint64_t n, uint32_t r) noexcept { + r &= 63; + return (n >> r) | (n << (64 - r)); +} + +// Computes 128-bit result of multiplication of two 64-bit unsigned integers. +inline uint128_fallback umul128(uint64_t x, uint64_t y) noexcept { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return {static_cast(p >> 64), static_cast(p)}; +#elif defined(_MSC_VER) && defined(_M_X64) + auto result = uint128_fallback(); + result.lo_ = _umul128(x, y, &result.hi_); + return result; +#else + const uint64_t mask = static_cast(max_value()); + + uint64_t a = x >> 32; + uint64_t b = x & mask; + uint64_t c = y >> 32; + uint64_t d = y & mask; + + uint64_t ac = a * c; + uint64_t bc = b * c; + uint64_t ad = a * d; + uint64_t bd = b * d; + + uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask); + + return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32), + (intermediate << 32) + (bd & mask)}; +#endif +} + +// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox. +namespace dragonbox { +// Computes upper 64 bits of multiplication of two 64-bit unsigned integers. +inline uint64_t umul128_upper64(uint64_t x, uint64_t y) noexcept { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return static_cast(p >> 64); +#elif defined(_MSC_VER) && defined(_M_X64) + return __umulh(x, y); +#else + return umul128(x, y).high(); +#endif +} + +// Computes upper 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_upper128(uint64_t x, + uint128_fallback y) noexcept { + uint128_fallback r = umul128(x, y.high()); + r += umul128_upper64(x, y.low()); + return r; +} + +// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept { + return umul128_upper64(static_cast(x) << 32, y); +} + +// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_lower128(uint64_t x, + uint128_fallback y) noexcept { + uint64_t high = x * y.high(); + uint128_fallback high_low = umul128(x, y.low()); + return {high + high_low.high(), high_low.low()}; +} + +// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept { + return x * y; +} + +// Computes floor(log10(pow(2, e))) for e in [-2620, 2620] using the method from +// https://fmt.dev/papers/Dragonbox.pdf#page=28, section 6.1. +inline int floor_log10_pow2(int e) noexcept { + FMT_ASSERT(e <= 2620 && e >= -2620, "too large exponent"); + static_assert((-1 >> 1) == -1, "right shift is not arithmetic"); + return (e * 315653) >> 20; +} + +// Various fast log computations. +inline int floor_log2_pow10(int e) noexcept { + FMT_ASSERT(e <= 1233 && e >= -1233, "too large exponent"); + return (e * 1741647) >> 19; +} +inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept { + FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent"); + return (e * 631305 - 261663) >> 21; +} + +static constexpr struct { + uint32_t divisor; + int shift_amount; +} div_small_pow10_infos[] = {{10, 16}, {100, 16}}; + +// Replaces n by floor(n / pow(10, N)) returning true if and only if n is +// divisible by pow(10, N). +// Precondition: n <= pow(10, N + 1). +template +bool check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept { + // The numbers below are chosen such that: + // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100, + // 2. nm mod 2^k < m if and only if n is divisible by d, + // where m is magic_number, k is shift_amount + // and d is divisor. + // + // Item 1 is a common technique of replacing division by a constant with + // multiplication, see e.g. "Division by Invariant Integers Using + // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set + // to ceil(2^k/d) for large enough k. + // The idea for item 2 originates from Schubfach. + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + n *= magic_number; + const uint32_t comparison_mask = (1u << info.shift_amount) - 1; + bool result = (n & comparison_mask) < magic_number; + n >>= info.shift_amount; + return result; +} + +// Computes floor(n / pow(10, N)) for small n and N. +// Precondition: n <= pow(10, N + 1). +template uint32_t small_division_by_pow10(uint32_t n) noexcept { + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + return (n * magic_number) >> info.shift_amount; +} + +// Computes floor(n / 10^(kappa + 1)) (float) +inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept { + // 1374389535 = ceil(2^37/100) + return static_cast((static_cast(n) * 1374389535) >> 37); +} +// Computes floor(n / 10^(kappa + 1)) (double) +inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept { + // 2361183241434822607 = ceil(2^(64+7)/1000) + return umul128_upper64(n, 2361183241434822607ull) >> 7; +} + +// Various subroutines using pow10 cache +template struct cache_accessor; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint64_t; + + static uint64_t get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + static constexpr const uint64_t pow10_significands[] = { + 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f, + 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb, + 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28, + 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb, + 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a, + 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810, + 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff, + 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd, + 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424, + 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b, + 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000, + 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000, + 0xc350000000000000, 0xf424000000000000, 0x9896800000000000, + 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000, + 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000, + 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000, + 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000, + 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000, + 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0, + 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985, + 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297, + 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7, + 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21, + 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe, + 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a, + 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f}; + return pow10_significands[k - float_info::min_k]; + } + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul96_upper64(u, cache); + return {static_cast(r >> 32), + static_cast(r) == 0}; + } + + static uint32_t compute_delta(const cache_entry_type& cache, + int beta) noexcept { + return static_cast(cache >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul96_lower64(two_f, cache); + return {((r >> (64 - beta)) & 1) != 0, + static_cast(r >> (32 - beta)) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache - (cache >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache + (cache >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (static_cast( + cache >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; + } +}; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint128_fallback; + + static uint128_fallback get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + + static constexpr const uint128_fallback pow10_significands[] = { +#if FMT_USE_FULL_CACHE_DRAGONBOX + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0x9faacf3df73609b1, 0x77b191618c54e9ad}, + {0xc795830d75038c1d, 0xd59df5b9ef6a2418}, + {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e}, + {0x9becce62836ac577, 0x4ee367f9430aec33}, + {0xc2e801fb244576d5, 0x229c41f793cda740}, + {0xf3a20279ed56d48a, 0x6b43527578c11110}, + {0x9845418c345644d6, 0x830a13896b78aaaa}, + {0xbe5691ef416bd60c, 0x23cc986bc656d554}, + {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9}, + {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa}, + {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54}, + {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69}, + {0x91376c36d99995be, 0x23100809b9c21fa2}, + {0xb58547448ffffb2d, 0xabd40a0c2832a78b}, + {0xe2e69915b3fff9f9, 0x16c90c8f323f516d}, + {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4}, + {0xb1442798f49ffb4a, 0x99cd11cfdf41779d}, + {0xdd95317f31c7fa1d, 0x40405643d711d584}, + {0x8a7d3eef7f1cfc52, 0x482835ea666b2573}, + {0xad1c8eab5ee43b66, 0xda3243650005eed0}, + {0xd863b256369d4a40, 0x90bed43e40076a83}, + {0x873e4f75e2224e68, 0x5a7744a6e804a292}, + {0xa90de3535aaae202, 0x711515d0a205cb37}, + {0xd3515c2831559a83, 0x0d5a5b44ca873e04}, + {0x8412d9991ed58091, 0xe858790afe9486c3}, + {0xa5178fff668ae0b6, 0x626e974dbe39a873}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a}, + {0xa139029f6a239f72, 0x1c1fffc1ebc44e81}, + {0xc987434744ac874e, 0xa327ffb266b56221}, + {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9}, + {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa}, + {0xc4ce17b399107c22, 0xcb550fb4384d21d4}, + {0xf6019da07f549b2b, 0x7e2a53a146606a49}, + {0x99c102844f94e0fb, 0x2eda7444cbfc426e}, + {0xc0314325637a1939, 0xfa911155fefb5309}, + {0xf03d93eebc589f88, 0x793555ab7eba27cb}, + {0x96267c7535b763b5, 0x4bc1558b2f3458df}, + {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17}, + {0xea9c227723ee8bcb, 0x465e15a979c1cadd}, + {0x92a1958a7675175f, 0x0bfacd89ec191eca}, + {0xb749faed14125d36, 0xcef980ec671f667c}, + {0xe51c79a85916f484, 0x82b7e12780e7401b}, + {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811}, + {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16}, + {0xdfbdcece67006ac9, 0x67a791e093e1d49b}, + {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1}, + {0xaecc49914078536d, 0x58fae9f773886e19}, + {0xda7f5bf590966848, 0xaf39a475506a899f}, + {0x888f99797a5e012d, 0x6d8406c952429604}, + {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84}, + {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65}, + {0x855c3be0a17fcd26, 0x5cf2eea09a550680}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0xd0601d8efc57b08b, 0xf13b94daf124da27}, + {0x823c12795db6ce57, 0x76c53d08d6b70859}, + {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f}, + {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a}, + {0xfe5d54150b090b02, 0xd3f93b35435d7c4d}, + {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0}, + {0xc6b8e9b0709f109a, 0x359ab6419ca1091c}, + {0xf867241c8cc6d4c0, 0xc30163d203c94b63}, + {0x9b407691d7fc44f8, 0x79e0de63425dcf1e}, + {0xc21094364dfb5636, 0x985915fc12f542e5}, + {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e}, + {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43}, + {0xbd8430bd08277231, 0x50c6ff782a838354}, + {0xece53cec4a314ebd, 0xa4f8bf5635246429}, + {0x940f4613ae5ed136, 0x871b7795e136be9a}, + {0xb913179899f68584, 0x28e2557b59846e40}, + {0xe757dd7ec07426e5, 0x331aeada2fe589d0}, + {0x9096ea6f3848984f, 0x3ff0d2c85def7622}, + {0xb4bca50b065abe63, 0x0fed077a756b53aa}, + {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895}, + {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d}, + {0xb080392cc4349dec, 0xbd8d794d96aacfb4}, + {0xdca04777f541c567, 0xecf0d7a0fc5583a1}, + {0x89e42caaf9491b60, 0xf41686c49db57245}, + {0xac5d37d5b79b6239, 0x311c2875c522ced6}, + {0xd77485cb25823ac7, 0x7d633293366b828c}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xa8530886b54dbdeb, 0xd9f57f830283fdfd}, + {0xd267caa862a12d66, 0xd072df63c324fd7c}, + {0x8380dea93da4bc60, 0x4247cb9e59f71e6e}, + {0xa46116538d0deb78, 0x52d9be85f074e609}, + {0xcd795be870516656, 0x67902e276c921f8c}, + {0x806bd9714632dff6, 0x00ba1cd8a3db53b7}, + {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5}, + {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce}, + {0xfad2a4b13d1b5d6c, 0x796b805720085f82}, + {0x9cc3a6eec6311a63, 0xcbe3303674053bb1}, + {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d}, + {0xf4f1b4d515acb93b, 0xee92fb5515482d45}, + {0x991711052d8bf3c5, 0x751bdd152d4d1c4b}, + {0xbf5cd54678eef0b6, 0xd262d45a78a0635e}, + {0xef340a98172aace4, 0x86fb897116c87c35}, + {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1}, + {0xbae0a846d2195712, 0x8974836059cca10a}, + {0xe998d258869facd7, 0x2bd1a438703fc94c}, + {0x91ff83775423cc06, 0x7b6306a34627ddd0}, + {0xb67f6455292cbf08, 0x1a3bc84c17b1d543}, + {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94}, + {0x8e938662882af53e, 0x547eb47b7282ee9d}, + {0xb23867fb2a35b28d, 0xe99e619a4f23aa44}, + {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5}, + {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05}, + {0xae0b158b4738705e, 0x9624ab50b148d446}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7}, + {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d}, + {0xd47487cc8470652b, 0x7647c32000696720}, + {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074}, + {0xa5fb0a17c777cf09, 0xf468107100525891}, + {0xcf79cc9db955c2cc, 0x7182148d4066eeb5}, + {0x81ac1fe293d599bf, 0xc6f14cd848405531}, + {0xa21727db38cb002f, 0xb8ada00e5a506a7d}, + {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d}, + {0xfd442e4688bd304a, 0x908f4a166d1da664}, + {0x9e4a9cec15763e2e, 0x9a598e4e043287ff}, + {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe}, + {0xf7549530e188c128, 0xd12bee59e68ef47d}, + {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf}, + {0xc13a148e3032d6e7, 0xe36a52363c1faf02}, + {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2}, + {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba}, + {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8}, + {0xebdf661791d60f56, 0x111b495b3464ad22}, + {0x936b9fcebb25c995, 0xcab10dd900beec35}, + {0xb84687c269ef3bfb, 0x3d5d514f40eea743}, + {0xe65829b3046b0afa, 0x0cb4a5a3112a5113}, + {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac}, + {0xb3f4e093db73a093, 0x59ed216765690f57}, + {0xe0f218b8d25088b8, 0x306869c13ec3532d}, + {0x8c974f7383725573, 0x1e414218c73a13fc}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0xdbac6c247d62a583, 0xdf45f746b74abf3a}, + {0x894bc396ce5da772, 0x6b8bba8c328eb784}, + {0xab9eb47c81f5114f, 0x066ea92f3f326565}, + {0xd686619ba27255a2, 0xc80a537b0efefebe}, + {0x8613fd0145877585, 0xbd06742ce95f5f37}, + {0xa798fc4196e952e7, 0x2c48113823b73705}, + {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6}, + {0x82ef85133de648c4, 0x9a984d73dbe722fc}, + {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb}, + {0xcc963fee10b7d1b3, 0x318df905079926a9}, + {0xffbbcfe994e5c61f, 0xfdf17746497f7053}, + {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634}, + {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1}, + {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1}, + {0x9c1661a651213e2d, 0x06bea10ca65c084f}, + {0xc31bfa0fe5698db8, 0x486e494fcff30a63}, + {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb}, + {0x986ddb5c6b3a76b7, 0xf89629465a75e01d}, + {0xbe89523386091465, 0xf6bbb397f1135824}, + {0xee2ba6c0678b597f, 0x746aa07ded582e2d}, + {0x94db483840b717ef, 0xa8c2a44eb4571cdd}, + {0xba121a4650e4ddeb, 0x92f34d62616ce414}, + {0xe896a0d7e51e1566, 0x77b020baf9c81d18}, + {0x915e2486ef32cd60, 0x0ace1474dc1d122f}, + {0xb5b5ada8aaff80b8, 0x0d819992132456bb}, + {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3}, + {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf}, + {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c}, + {0xad4ab7112eb3929d, 0x86c16c98d2c953c7}, + {0xd89d64d57a607744, 0xe871c7bf077ba8b8}, + {0x87625f056c7c4a8b, 0x11471cd764ad4973}, + {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0}, + {0xd389b47879823479, 0x4aff1d108d4ec2c4}, + {0x843610cb4bf160cb, 0xcedf722a585139bb}, + {0xa54394fe1eedb8fe, 0xc2974eb4ee658829}, + {0xce947a3da6a9273e, 0x733d226229feea33}, + {0x811ccc668829b887, 0x0806357d5a3f5260}, + {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8}, + {0xc9bcff6034c13052, 0xfc89b393dd02f0b6}, + {0xfc2c3f3841f17c67, 0xbbac2078d443ace3}, + {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e}, + {0xc5029163f384a931, 0x0a9e795e65d4df12}, + {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6}, + {0x99ea0196163fa42e, 0x504bced1bf8e4e46}, + {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7}, + {0xf07da27a82c37088, 0x5d767327bb4e5a4d}, + {0x964e858c91ba2655, 0x3a6a07f8d510f870}, + {0xbbe226efb628afea, 0x890489f70a55368c}, + {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f}, + {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e}, + {0xb77ada0617e3bbcb, 0x09ce6ebb40173745}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0x8f57fa54c2a9eab6, 0x9fa946824a12232e}, + {0xb32df8e9f3546564, 0x47939822dc96abfa}, + {0xdff9772470297ebd, 0x59787e2b93bc56f8}, + {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b}, + {0xaefae51477a06b03, 0xede622920b6b23f2}, + {0xdab99e59958885c4, 0xe95fab368e45ecee}, + {0x88b402f7fd75539b, 0x11dbcb0218ebb415}, + {0xaae103b5fcd2a881, 0xd652bdc29f26a11a}, + {0xd59944a37c0752a2, 0x4be76d3346f04960}, + {0x857fcae62d8493a5, 0x6f70a4400c562ddc}, + {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953}, + {0xd097ad07a71f26b2, 0x7e2000a41346a7a8}, + {0x825ecc24c873782f, 0x8ed400668c0c28c9}, + {0xa2f67f2dfa90563b, 0x728900802f0f32fb}, + {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba}, + {0xfea126b7d78186bc, 0xe2f610c84987bfa9}, + {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca}, + {0xc6ede63fa05d3143, 0x91503d1c79720dbc}, + {0xf8a95fcf88747d94, 0x75a44c6397ce912b}, + {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb}, + {0xc24452da229b021b, 0xfbe85badce996169}, + {0xf2d56790ab41c2a2, 0xfae27299423fb9c4}, + {0x97c560ba6b0919a5, 0xdccd879fc967d41b}, + {0xbdb6b8e905cb600f, 0x5400e987bbc1c921}, + {0xed246723473e3813, 0x290123e9aab23b69}, + {0x9436c0760c86e30b, 0xf9a0b6720aaf6522}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0xe7958cb87392c2c2, 0xb60b1d1230b20e05}, + {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3}, + {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4}, + {0xe2280b6c20dd5232, 0x25c6da63c38de1b1}, + {0x8d590723948a535f, 0x579c487e5a38ad0f}, + {0xb0af48ec79ace837, 0x2d835a9df0c6d852}, + {0xdcdb1b2798182244, 0xf8e431456cf88e66}, + {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900}, + {0xac8b2d36eed2dac5, 0xe272467e3d222f40}, + {0xd7adf884aa879177, 0x5b0ed81dcc6abb10}, + {0x86ccbb52ea94baea, 0x98e947129fc2b4ea}, + {0xa87fea27a539e9a5, 0x3f2398d747b36225}, + {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae}, + {0x83a3eeeef9153e89, 0x1953cf68300424ad}, + {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8}, + {0xcdb02555653131b6, 0x3792f412cb06794e}, + {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1}, + {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5}, + {0xc8de047564d20a8b, 0xf245825a5a445276}, + {0xfb158592be068d2e, 0xeed6e2f0f0d56713}, + {0x9ced737bb6c4183d, 0x55464dd69685606c}, + {0xc428d05aa4751e4c, 0xaa97e14c3c26b887}, + {0xf53304714d9265df, 0xd53dd99f4b3066a9}, + {0x993fe2c6d07b7fab, 0xe546a8038efe402a}, + {0xbf8fdb78849a5f96, 0xde98520472bdd034}, + {0xef73d256a5c0f77c, 0x963e66858f6d4441}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xbb127c53b17ec159, 0x5560c018580d5d53}, + {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7}, + {0x9226712162ab070d, 0xcab3961304ca70e9}, + {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23}, + {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b}, + {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243}, + {0xb267ed1940f1c61c, 0x55f038b237591ed4}, + {0xdf01e85f912e37a3, 0x6b6c46dec52f6689}, + {0x8b61313bbabce2c6, 0x2323ac4b3b3da016}, + {0xae397d8aa96c1b77, 0xabec975e0a0d081b}, + {0xd9c7dced53c72255, 0x96e7bd358c904a22}, + {0x881cea14545c7575, 0x7e50d64177da2e55}, + {0xaa242499697392d2, 0xdde50bd1d5d0b9ea}, + {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865}, + {0x84ec3c97da624ab4, 0xbd5af13bef0b113f}, + {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f}, + {0xcfb11ead453994ba, 0x67de18eda5814af3}, + {0x81ceb32c4b43fcf4, 0x80eacf948770ced8}, + {0xa2425ff75e14fc31, 0xa1258379a94d028e}, + {0xcad2f7f5359a3b3e, 0x096ee45813a04331}, + {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd}, + {0x9e74d1b791e07e48, 0x775ea264cf55347e}, + {0xc612062576589dda, 0x95364afe032a819e}, + {0xf79687aed3eec551, 0x3a83ddbd83f52205}, + {0x9abe14cd44753b52, 0xc4926a9672793543}, + {0xc16d9a0095928a27, 0x75b7053c0f178294}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0x971da05074da7bee, 0xd3f6fc16ebca5e04}, + {0xbce5086492111aea, 0x88f4bb1ca6bcf585}, + {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6}, + {0x9392ee8e921d5d07, 0x3aff322e62439fd0}, + {0xb877aa3236a4b449, 0x09befeb9fad487c3}, + {0xe69594bec44de15b, 0x4c2ebe687989a9b4}, + {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11}, + {0xb424dc35095cd80f, 0x538484c19ef38c95}, + {0xe12e13424bb40e13, 0x2865a5f206b06fba}, + {0x8cbccc096f5088cb, 0xf93f87b7442e45d4}, + {0xafebff0bcb24aafe, 0xf78f69a51539d749}, + {0xdbe6fecebdedd5be, 0xb573440e5a884d1c}, + {0x89705f4136b4a597, 0x31680a88f8953031}, + {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e}, + {0xd6bf94d5e57a42bc, 0x3d32907604691b4d}, + {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110}, + {0xa7c5ac471b478423, 0x0fcf80dc33721d54}, + {0xd1b71758e219652b, 0xd3c36113404ea4a9}, + {0x83126e978d4fdf3b, 0x645a1cac083126ea}, + {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4}, + {0xcccccccccccccccc, 0xcccccccccccccccd}, + {0x8000000000000000, 0x0000000000000000}, + {0xa000000000000000, 0x0000000000000000}, + {0xc800000000000000, 0x0000000000000000}, + {0xfa00000000000000, 0x0000000000000000}, + {0x9c40000000000000, 0x0000000000000000}, + {0xc350000000000000, 0x0000000000000000}, + {0xf424000000000000, 0x0000000000000000}, + {0x9896800000000000, 0x0000000000000000}, + {0xbebc200000000000, 0x0000000000000000}, + {0xee6b280000000000, 0x0000000000000000}, + {0x9502f90000000000, 0x0000000000000000}, + {0xba43b74000000000, 0x0000000000000000}, + {0xe8d4a51000000000, 0x0000000000000000}, + {0x9184e72a00000000, 0x0000000000000000}, + {0xb5e620f480000000, 0x0000000000000000}, + {0xe35fa931a0000000, 0x0000000000000000}, + {0x8e1bc9bf04000000, 0x0000000000000000}, + {0xb1a2bc2ec5000000, 0x0000000000000000}, + {0xde0b6b3a76400000, 0x0000000000000000}, + {0x8ac7230489e80000, 0x0000000000000000}, + {0xad78ebc5ac620000, 0x0000000000000000}, + {0xd8d726b7177a8000, 0x0000000000000000}, + {0x878678326eac9000, 0x0000000000000000}, + {0xa968163f0a57b400, 0x0000000000000000}, + {0xd3c21bcecceda100, 0x0000000000000000}, + {0x84595161401484a0, 0x0000000000000000}, + {0xa56fa5b99019a5c8, 0x0000000000000000}, + {0xcecb8f27f4200f3a, 0x0000000000000000}, + {0x813f3978f8940984, 0x4000000000000000}, + {0xa18f07d736b90be5, 0x5000000000000000}, + {0xc9f2c9cd04674ede, 0xa400000000000000}, + {0xfc6f7c4045812296, 0x4d00000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xc5371912364ce305, 0x6c28000000000000}, + {0xf684df56c3e01bc6, 0xc732000000000000}, + {0x9a130b963a6c115c, 0x3c7f400000000000}, + {0xc097ce7bc90715b3, 0x4b9f100000000000}, + {0xf0bdc21abb48db20, 0x1e86d40000000000}, + {0x96769950b50d88f4, 0x1314448000000000}, + {0xbc143fa4e250eb31, 0x17d955a000000000}, + {0xeb194f8e1ae525fd, 0x5dcfab0800000000}, + {0x92efd1b8d0cf37be, 0x5aa1cae500000000}, + {0xb7abc627050305ad, 0xf14a3d9e40000000}, + {0xe596b7b0c643c719, 0x6d9ccd05d0000000}, + {0x8f7e32ce7bea5c6f, 0xe4820023a2000000}, + {0xb35dbf821ae4f38b, 0xdda2802c8a800000}, + {0xe0352f62a19e306e, 0xd50b2037ad200000}, + {0x8c213d9da502de45, 0x4526f422cc340000}, + {0xaf298d050e4395d6, 0x9670b12b7f410000}, + {0xdaf3f04651d47b4c, 0x3c0cdd765f114000}, + {0x88d8762bf324cd0f, 0xa5880a69fb6ac800}, + {0xab0e93b6efee0053, 0x8eea0d047a457a00}, + {0xd5d238a4abe98068, 0x72a4904598d6d880}, + {0x85a36366eb71f041, 0x47a6da2b7f864750}, + {0xa70c3c40a64e6c51, 0x999090b65f67d924}, + {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d}, + {0x82818f1281ed449f, 0xbff8f10e7a8921a5}, + {0xa321f2d7226895c7, 0xaff72d52192b6a0e}, + {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0x9f4f2726179a2245, 0x01d762422c946591}, + {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6}, + {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3}, + {0x9b934c3b330c8577, 0x63cc55f49f88eb30}, + {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc}, + {0xf316271c7fc3908a, 0x8bef464e3945ef7b}, + {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad}, + {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318}, + {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde}, + {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b}, + {0xb975d6b6ee39e436, 0xb3e2fd538e122b45}, + {0xe7d34c64a9c85d44, 0x60dbbca87196b617}, + {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce}, + {0xb51d13aea4a488dd, 0x6babab6398bdbe42}, + {0xe264589a4dcdab14, 0xc696963c7eed2dd2}, + {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3}, + {0xb0de65388cc8ada8, 0x3b25a55f43294bcc}, + {0xdd15fe86affad912, 0x49ef0eb713f39ebf}, + {0x8a2dbf142dfcc7ab, 0x6e3569326c784338}, + {0xacb92ed9397bf996, 0x49c2c37f07965405}, + {0xd7e77a8f87daf7fb, 0xdc33745ec97be907}, + {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4}, + {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d}, + {0xd2d80db02aabd62b, 0xf50a3fa490c30191}, + {0x83c7088e1aab65db, 0x792667c6da79e0fb}, + {0xa4b8cab1a1563f52, 0x577001b891185939}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0x80b05e5ac60b6178, 0x544f8158315b05b5}, + {0xa0dc75f1778e39d6, 0x696361ae3db1c722}, + {0xc913936dd571c84c, 0x03bc3a19cd1e38ea}, + {0xfb5878494ace3a5f, 0x04ab48a04065c724}, + {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77}, + {0xc45d1df942711d9a, 0x3ba5d0bd324f8395}, + {0xf5746577930d6500, 0xca8f44ec7ee3647a}, + {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc}, + {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f}, + {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f}, + {0x95d04aee3b80ece5, 0xbba1f1d158724a13}, + {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98}, + {0xea1575143cf97226, 0xf52d09d71a3293be}, + {0x924d692ca61be758, 0x593c2626705f9c57}, + {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d}, + {0xe498f455c38b997a, 0x0b6dfb9c0f956448}, + {0x8edf98b59a373fec, 0x4724bd4189bd5ead}, + {0xb2977ee300c50fe7, 0x58edec91ec2cb658}, + {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee}, + {0x8b865b215899f46c, 0xbd79e0d20082ee75}, + {0xae67f1e9aec07187, 0xecd8590680a3aa12}, + {0xda01ee641a708de9, 0xe80e6f4820cc9496}, + {0x884134fe908658b2, 0x3109058d147fdcde}, + {0xaa51823e34a7eede, 0xbd4b46f0599fd416}, + {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b}, + {0x850fadc09923329e, 0x03e2cf6bc604ddb1}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0xcfe87f7cef46ff16, 0xe612641865679a64}, + {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f}, + {0xa26da3999aef7749, 0xe3be5e330f38f09e}, + {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6}, + {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7}, + {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb}, + {0xc646d63501a1511d, 0xb281e1fd541501b9}, + {0xf7d88bc24209a565, 0x1f225a7ca91a4227}, + {0x9ae757596946075f, 0x3375788de9b06959}, + {0xc1a12d2fc3978937, 0x0052d6b1641c83af}, + {0xf209787bb47d6b84, 0xc0678c5dbd23a49b}, + {0x9745eb4d50ce6332, 0xf840b7ba963646e1}, + {0xbd176620a501fbff, 0xb650e5a93bc3d899}, + {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf}, + {0x93ba47c980e98cdf, 0xc66f336c36b10138}, + {0xb8a8d9bbe123f017, 0xb80b0047445d4185}, + {0xe6d3102ad96cec1d, 0xa60dc059157491e6}, + {0x9043ea1ac7e41392, 0x87c89837ad68db30}, + {0xb454e4a179dd1877, 0x29babe4598c311fc}, + {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b}, + {0x8ce2529e2734bb1d, 0x1899e4a65f58660d}, + {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90}, + {0xdc21a1171d42645d, 0x76707543f4fa1f74}, + {0x899504ae72497eba, 0x6a06494a791c53a9}, + {0xabfa45da0edbde69, 0x0487db9d17636893}, + {0xd6f8d7509292d603, 0x45a9d2845d3c42b7}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xa7f26836f282b732, 0x8e6cac7768d7141f}, + {0xd1ef0244af2364ff, 0x3207d795430cd927}, + {0x8335616aed761f1f, 0x7f44e6bd49e807b9}, + {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7}, + {0xcd036837130890a1, 0x36dba887c37a8c10}, + {0x802221226be55a64, 0xc2494954da2c978a}, + {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d}, + {0xc83553c5c8965d3d, 0x6f92829494e5acc8}, + {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa}, + {0x9c69a97284b578d7, 0xff2a760414536efc}, + {0xc38413cf25e2d70d, 0xfef5138519684abb}, + {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a}, + {0x98bf2f79d5993802, 0xef2f773ffbd97a62}, + {0xbeeefb584aff8603, 0xaafb550ffacfd8fb}, + {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39}, + {0x952ab45cfa97a0b2, 0xdd945a747bf26184}, + {0xba756174393d88df, 0x94f971119aeef9e5}, + {0xe912b9d1478ceb17, 0x7a37cd5601aab85e}, + {0x91abb422ccb812ee, 0xac62e055c10ab33b}, + {0xb616a12b7fe617aa, 0x577b986b314d600a}, + {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c}, + {0x8e41ade9fbebc27d, 0x14588f13be847308}, + {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9}, + {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc}, + {0x8aec23d680043bee, 0x25de7bb9480d5855}, + {0xada72ccc20054ae9, 0xaf561aa79a10ae6b}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0x87aa9aff79042286, 0x90fb44d2f05d0843}, + {0xa99541bf57452b28, 0x353a1607ac744a54}, + {0xd3fa922f2d1675f2, 0x42889b8997915ce9}, + {0x847c9b5d7c2e09b7, 0x69956135febada12}, + {0xa59bc234db398c25, 0x43fab9837e699096}, + {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc}, + {0x8161afb94b44f57d, 0x1d1be0eebac278f6}, + {0xa1ba1ba79e1632dc, 0x6462d92a69731733}, + {0xca28a291859bbf93, 0x7d7b8f7503cfdcff}, + {0xfcb2cb35e702af78, 0x5cda735244c3d43f}, + {0x9defbf01b061adab, 0x3a0888136afa64a8}, + {0xc56baec21c7a1916, 0x088aaa1845b8fdd1}, + {0xf6c69a72a3989f5b, 0x8aad549e57273d46}, + {0x9a3c2087a63f6399, 0x36ac54e2f678864c}, + {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de}, + {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6}, + {0x969eb7c47859e743, 0x9f644ae5a4b1b326}, + {0xbc4665b596706114, 0x873d5d9f0dde1fef}, + {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb}, + {0x9316ff75dd87cbd8, 0x09a7f12442d588f3}, + {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30}, + {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb}, + {0x8fa475791a569d10, 0xf96e017d694487bd}, + {0xb38d92d760ec4455, 0x37c981dcc395a9ad}, + {0xe070f78d3927556a, 0x85bbe253f47b1418}, + {0x8c469ab843b89562, 0x93956d7478ccec8f}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f}, + {0x88fcf317f22241e2, 0x441fece3bdf81f04}, + {0xab3c2fddeeaad25a, 0xd527e81cad7626c4}, + {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075}, + {0x85c7056562757456, 0xf6872d5667844e4a}, + {0xa738c6bebb12d16c, 0xb428f8ac016561dc}, + {0xd106f86e69d785c7, 0xe13336d701beba53}, + {0x82a45b450226b39c, 0xecc0024661173474}, + {0xa34d721642b06084, 0x27f002d7f95d0191}, + {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5}, + {0xff290242c83396ce, 0x7e67047175a15272}, + {0x9f79a169bd203e41, 0x0f0062c6e984d387}, + {0xc75809c42c684dd1, 0x52c07b78a3e60869}, + {0xf92e0c3537826145, 0xa7709a56ccdf8a83}, + {0x9bbcc7a142b17ccb, 0x88a66076400bb692}, + {0xc2abf989935ddbfe, 0x6acff893d00ea436}, + {0xf356f7ebf83552fe, 0x0583f6b8c4124d44}, + {0x98165af37b2153de, 0xc3727a337a8b704b}, + {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d}, + {0xeda2ee1c7064130c, 0x1162def06f79df74}, + {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9}, + {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693}, + {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438}, + {0x910ab1d4db9914a0, 0x1d9c9892400a22a3}, + {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c}, + {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xb10d8e1456105dad, 0x7425a83e872c5f48}, + {0xdd50f1996b947518, 0xd12f124e28f7771a}, + {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70}, + {0xace73cbfdc0bfb7b, 0x636cc64d1001550c}, + {0xd8210befd30efa5a, 0x3c47f7e05401aa4f}, + {0x8714a775e3e95c78, 0x65acfaec34810a72}, + {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e}, + {0xd31045a8341ca07c, 0x1ede48111209a051}, + {0x83ea2b892091e44d, 0x934aed0aab460433}, + {0xa4e4b66b68b65d60, 0xf81da84d56178540}, + {0xce1de40642e3f4b9, 0x36251260ab9d668f}, + {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a}, + {0xa1075a24e4421730, 0xb24cf65b8612f820}, + {0xc94930ae1d529cfc, 0xdee033f26797b628}, + {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2}, + {0x9d412e0806e88aa5, 0x8e1f289560ee864f}, + {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3}, + {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc}, + {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a}, + {0xbff610b0cc6edd3f, 0x17fd090a58d32af4}, + {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1}, + {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f}, + {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2}, + {0xea53df5fd18d5513, 0x84c86189216dc5ee}, + {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5}, + {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f}, + {0xb2c71d5bca9023f8, 0x743e20e9ef511013}, + {0xdf78e4b2bd342cf6, 0x914da9246b255417}, + {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f}, + {0xae9672aba3d0c320, 0xa184ac2473b529b2}, + {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f}, + {0x8865899617fb1871, 0x7e2fa67c7a658893}, + {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8}, + {0xd51ea6fa85785631, 0x552a74227f3ea566}, + {0x8533285c936b35de, 0xd53a88958f872760}, + {0xa67ff273b8460356, 0x8a892abaf368f138}, + {0xd01fef10a657842c, 0x2d2b7569b0432d86}, + {0x8213f56a67f6b29b, 0x9c3b29620e29fc74}, + {0xa298f2c501f45f42, 0x8349f3ba91b47b90}, + {0xcb3f2f7642717713, 0x241c70a936219a74}, + {0xfe0efb53d30dd4d7, 0xed238cd383aa0111}, + {0x9ec95d1463e8a506, 0xf4363804324a40ab}, + {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6}, + {0xf81aa16fdc1b81da, 0xdd94b7868e94050b}, + {0x9b10a4e5e9913128, 0xca7cf2b4191c8327}, + {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1}, + {0xf24a01a73cf2dccf, 0xbc633b39673c8ced}, + {0x976e41088617ca01, 0xd5be0503e085d814}, + {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19}, + {0xec9c459d51852ba2, 0xddf8e7d60ed1219f}, + {0x93e1ab8252f33b45, 0xcabb90e5c942b504}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + {0xe7109bfba19c0c9d, 0x0cc512670a783ad5}, + {0x906a617d450187e2, 0x27fb2b80668b24c6}, + {0xb484f9dc9641e9da, 0xb1f9f660802dedf7}, + {0xe1a63853bbd26451, 0x5e7873f8a0396974}, + {0x8d07e33455637eb2, 0xdb0b487b6423e1e9}, + {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63}, + {0xdc5c5301c56b75f7, 0x7641a140cc7810fc}, + {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e}, + {0xac2820d9623bf429, 0x546345fa9fbdcd45}, + {0xd732290fbacaf133, 0xa97c177947ad4096}, + {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e}, + {0xa81f301449ee8c70, 0x5c68f256bfff5a75}, + {0xd226fc195c6a2f8c, 0x73832eec6fff3112}, + {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac}, + {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56}, + {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec}, + {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4}, + {0xa0555e361951c366, 0xd7e105bcc3326220}, + {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8}, + {0xfa856334878fc150, 0xb14f98f6f0feb952}, + {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4}, + {0xc3b8358109e84f07, 0x0a862f80ec4700c9}, + {0xf4a642e14c6262c8, 0xcd27bb612758c0fb}, + {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d}, + {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4}, + {0xeeea5d5004981478, 0x1858ccfce06cac75}, + {0x95527a5202df0ccb, 0x0f37801e0c43ebc9}, + {0xbaa718e68396cffd, 0xd30560258f54e6bb}, + {0xe950df20247c83fd, 0x47c6b82ef32a206a}, + {0x91d28b7416cdd27e, 0x4cdc331d57fa5442}, + {0xb6472e511c81471d, 0xe0133fe4adf8e953}, + {0xe3d8f9e563a198e5, 0x58180fddd97723a7}, + {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649}, + {0xb201833b35d63f73, 0x2cd2cc6551e513db}, + {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2}, + {0x8b112e86420f6191, 0xfb04afaf27faf783}, + {0xadd57a27d29339f6, 0x79c5db9af1f9b564}, + {0xd94ad8b1c7380874, 0x18375281ae7822bd}, + {0x87cec76f1c830548, 0x8f2293910d0b15b6}, + {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23}, + {0xd433179d9c8cb841, 0x5fa60692a46151ec}, + {0x849feec281d7f328, 0xdbc7c41ba6bcd334}, + {0xa5c7ea73224deff3, 0x12b9b522906c0801}, + {0xcf39e50feae16bef, 0xd768226b34870a01}, + {0x81842f29f2cce375, 0xe6a1158300d46641}, + {0xa1e53af46f801c53, 0x60495ae3c1097fd1}, + {0xca5e89b18b602368, 0x385bb19cb14bdfc5}, + {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6}, + {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2}, + {0xc5a05277621be293, 0xc7098b7305241886}, + { 0xf70867153aa2db38, + 0xb8cbee4fc66d1ea8 } +#else + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0xc350000000000000, 0x0000000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + { 0x95527a5202df0ccb, + 0x0f37801e0c43ebc9 } +#endif + }; + +#if FMT_USE_FULL_CACHE_DRAGONBOX + return pow10_significands[k - float_info::min_k]; +#else + static constexpr const uint64_t powers_of_5_64[] = { + 0x0000000000000001, 0x0000000000000005, 0x0000000000000019, + 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35, + 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1, + 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd, + 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9, + 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5, + 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631, + 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed, + 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9}; + + static const int compression_ratio = 27; + + // Compute base index. + int cache_index = (k - float_info::min_k) / compression_ratio; + int kb = cache_index * compression_ratio + float_info::min_k; + int offset = k - kb; + + // Get base cache. + uint128_fallback base_cache = pow10_significands[cache_index]; + if (offset == 0) return base_cache; + + // Compute the required amount of bit-shift. + int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset; + FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected"); + + // Try to recover the real cache. + uint64_t pow5 = powers_of_5_64[offset]; + uint128_fallback recovered_cache = umul128(base_cache.high(), pow5); + uint128_fallback middle_low = umul128(base_cache.low(), pow5); + + recovered_cache += middle_low.high(); + + uint64_t high_to_middle = recovered_cache.high() << (64 - alpha); + uint64_t middle_to_low = recovered_cache.low() << (64 - alpha); + + recovered_cache = + uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle, + ((middle_low.low() >> alpha) | middle_to_low)}; + FMT_ASSERT(recovered_cache.low() + 1 != 0, ""); + return {recovered_cache.high(), recovered_cache.low() + 1}; +#endif + } + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul192_upper128(u, cache); + return {r.high(), r.low() == 0}; + } + + static uint32_t compute_delta(cache_entry_type const& cache, + int beta) noexcept { + return static_cast(cache.high() >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul192_lower128(two_f, cache); + return {((r.high() >> (64 - beta)) & 1) != 0, + ((r.high() << beta) | (r.low() >> (64 - beta))) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() - + (cache.high() >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() + + (cache.high() >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return ((cache.high() >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; + } +}; + +// Various integer checks +template +bool is_left_endpoint_integer_shorter_interval(int exponent) noexcept { + const int case_shorter_interval_left_endpoint_lower_threshold = 2; + const int case_shorter_interval_left_endpoint_upper_threshold = 3; + return exponent >= case_shorter_interval_left_endpoint_lower_threshold && + exponent <= case_shorter_interval_left_endpoint_upper_threshold; +} + +// Remove trailing zeros from n and return the number of zeros removed (float) +FMT_INLINE int remove_trailing_zeros(uint32_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// Removes trailing zeros and returns the number of zeros removed (double) +FMT_INLINE int remove_trailing_zeros(uint64_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + + // This magic number is ceil(2^90 / 10^8). + constexpr uint64_t magic_number = 12379400392853802749ull; + auto nm = umul128(n, magic_number); + + // Is n is divisible by 10^8? + if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) { + // If yes, work with the quotient. + auto n32 = static_cast(nm.high() >> (90 - 64)); + + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 8; + while (true) { + auto q = rotr(n32 * mod_inv_25, 2); + if (q > max_value() / 100) break; + n32 = q; + s += 2; + } + auto q = rotr(n32 * mod_inv_5, 1); + if (q <= max_value() / 10) { + n32 = q; + s |= 1; + } + + n = n32; + return s; + } + + // If n is not divisible by 10^8, work with n itself. + const uint64_t mod_inv_5 = 0xcccccccccccccccd; + const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// The main algorithm for shorter interval case +template +FMT_INLINE decimal_fp shorter_interval_case(int exponent) noexcept { + decimal_fp ret_value; + // Compute k and beta + const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute xi and zi + using cache_entry_type = typename cache_accessor::cache_entry_type; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + + auto xi = cache_accessor::compute_left_endpoint_for_shorter_interval_case( + cache, beta); + auto zi = cache_accessor::compute_right_endpoint_for_shorter_interval_case( + cache, beta); + + // If the left endpoint is not an integer, increase it + if (!is_left_endpoint_integer_shorter_interval(exponent)) ++xi; + + // Try bigger divisor + ret_value.significand = zi / 10; + + // If succeed, remove trailing zeros if necessary and return + if (ret_value.significand * 10 >= xi) { + ret_value.exponent = minus_k + 1; + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + } + + // Otherwise, compute the round-up of y + ret_value.significand = + cache_accessor::compute_round_up_for_shorter_interval_case(cache, + beta); + ret_value.exponent = minus_k; + + // When tie occurs, choose one of them according to the rule + if (exponent >= float_info::shorter_interval_tie_lower_threshold && + exponent <= float_info::shorter_interval_tie_upper_threshold) { + ret_value.significand = ret_value.significand % 2 == 0 + ? ret_value.significand + : ret_value.significand - 1; + } else if (ret_value.significand < xi) { + ++ret_value.significand; + } + return ret_value; +} + +template decimal_fp to_decimal(T x) noexcept { + // Step 1: integer promotion & Schubfach multiplier calculation. + + using carrier_uint = typename float_info::carrier_uint; + using cache_entry_type = typename cache_accessor::cache_entry_type; + auto br = bit_cast(x); + + // Extract significand bits and exponent bits. + const carrier_uint significand_mask = + (static_cast(1) << num_significand_bits()) - 1; + carrier_uint significand = (br & significand_mask); + int exponent = + static_cast((br & exponent_mask()) >> num_significand_bits()); + + if (exponent != 0) { // Check if normal. + exponent -= exponent_bias() + num_significand_bits(); + + // Shorter interval case; proceed like Schubfach. + // In fact, when exponent == 1 and significand == 0, the interval is + // regular. However, it can be shown that the end-results are anyway same. + if (significand == 0) return shorter_interval_case(exponent); + + significand |= (static_cast(1) << num_significand_bits()); + } else { + // Subnormal case; the interval is always regular. + if (significand == 0) return {0, 0}; + exponent = + std::numeric_limits::min_exponent - num_significand_bits() - 1; + } + + const bool include_left_endpoint = (significand % 2 == 0); + const bool include_right_endpoint = include_left_endpoint; + + // Compute k and beta. + const int minus_k = floor_log10_pow2(exponent) - float_info::kappa; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute zi and deltai. + // 10^kappa <= deltai < 10^(kappa + 1) + const uint32_t deltai = cache_accessor::compute_delta(cache, beta); + const carrier_uint two_fc = significand << 1; + + // For the case of binary32, the result of integer check is not correct for + // 29711844 * 2^-82 + // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18 + // and 29711844 * 2^-81 + // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17, + // and they are the unique counterexamples. However, since 29711844 is even, + // this does not cause any problem for the endpoints calculations; it can only + // cause a problem when we need to perform integer check for the center. + // Fortunately, with these inputs, that branch is never executed, so we are + // fine. + const typename cache_accessor::compute_mul_result z_mul = + cache_accessor::compute_mul((two_fc | 1) << beta, cache); + + // Step 2: Try larger divisor; remove trailing zeros if necessary. + + // Using an upper bound on zi, we might be able to optimize the division + // better than the compiler; we are computing zi / big_divisor here. + decimal_fp ret_value; + ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result); + uint32_t r = static_cast(z_mul.result - float_info::big_divisor * + ret_value.significand); + + if (r < deltai) { + // Exclude the right endpoint if necessary. + if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) { + --ret_value.significand; + r = float_info::big_divisor; + goto small_divisor_case_label; + } + } else if (r > deltai) { + goto small_divisor_case_label; + } else { + // r == deltai; compare fractional parts. + const typename cache_accessor::compute_mul_parity_result x_mul = + cache_accessor::compute_mul_parity(two_fc - 1, cache, beta); + + if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint))) + goto small_divisor_case_label; + } + ret_value.exponent = minus_k + float_info::kappa + 1; + + // We may need to remove trailing zeros. + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + + // Step 3: Find the significand with the smaller divisor. + +small_divisor_case_label: + ret_value.significand *= 10; + ret_value.exponent = minus_k + float_info::kappa; + + uint32_t dist = r - (deltai / 2) + (float_info::small_divisor / 2); + const bool approx_y_parity = + ((dist ^ (float_info::small_divisor / 2)) & 1) != 0; + + // Is dist divisible by 10^kappa? + const bool divisible_by_small_divisor = + check_divisibility_and_divide_by_pow10::kappa>(dist); + + // Add dist / 10^kappa to the significand. + ret_value.significand += dist; + + if (!divisible_by_small_divisor) return ret_value; + + // Check z^(f) >= epsilon^(f). + // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1, + // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f). + // Since there are only 2 possibilities, we only need to care about the + // parity. Also, zi and r should have the same parity since the divisor + // is an even number. + const auto y_mul = cache_accessor::compute_mul_parity(two_fc, cache, beta); + + // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f), + // or equivalently, when y is an integer. + if (y_mul.parity != approx_y_parity) + --ret_value.significand; + else if (y_mul.is_integer & (ret_value.significand % 2 != 0)) + --ret_value.significand; + return ret_value; +} +} // namespace dragonbox + +#ifdef _MSC_VER +FMT_FUNC auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) + -> int { + auto args = va_list(); + va_start(args, fmt); + int result = vsnprintf_s(buf, size, _TRUNCATE, fmt, args); + va_end(args); + return result; +} +#endif +} // namespace detail + +template <> struct formatter { + FMT_CONSTEXPR auto parse(format_parse_context& ctx) + -> format_parse_context::iterator { + return ctx.begin(); + } + + template + auto format(const detail::bigint& n, FormatContext& ctx) const -> + typename FormatContext::iterator { + auto out = ctx.out(); + bool first = true; + for (auto i = n.bigits_.size(); i > 0; --i) { + auto value = n.bigits_[i - 1u]; + if (first) { + out = format_to(out, FMT_STRING("{:x}"), value); + first = false; + continue; + } + out = format_to(out, FMT_STRING("{:08x}"), value); + } + if (n.exp_ > 0) + out = format_to(out, FMT_STRING("p{}"), + n.exp_ * detail::bigint::bigit_bits); + return out; + } +}; + +FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) { + for_each_codepoint(s, [this](uint32_t cp, string_view) { + if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8")); + if (cp <= 0xFFFF) { + buffer_.push_back(static_cast(cp)); + } else { + cp -= 0x10000; + buffer_.push_back(static_cast(0xD800 + (cp >> 10))); + buffer_.push_back(static_cast(0xDC00 + (cp & 0x3FF))); + } + return true; + }); + buffer_.push_back(0); +} + +FMT_FUNC void format_system_error(detail::buffer& out, int error_code, + const char* message) noexcept { + FMT_TRY { + auto ec = std::error_code(error_code, std::generic_category()); + write(std::back_inserter(out), std::system_error(ec, message).what()); + return; + } + FMT_CATCH(...) {} + format_error_code(out, error_code, message); +} + +FMT_FUNC void report_system_error(int error_code, + const char* message) noexcept { + report_error(format_system_error, error_code, message); +} + +FMT_FUNC std::string vformat(string_view fmt, format_args args) { + // Don't optimize the "{}" case to keep the binary size small and because it + // can be better optimized in fmt::format anyway. + auto buffer = memory_buffer(); + detail::vformat_to(buffer, fmt, args); + return to_string(buffer); +} + +namespace detail { +#ifdef _WIN32 +using dword = conditional_t; +extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( // + void*, const void*, dword, dword*, void*); + +FMT_FUNC bool write_console(std::FILE* f, string_view text) { + auto fd = _fileno(f); + if (_isatty(fd)) { + detail::utf8_to_utf16 u16(string_view(text.data(), text.size())); + auto written = detail::dword(); + if (detail::WriteConsoleW(reinterpret_cast(_get_osfhandle(fd)), + u16.c_str(), static_cast(u16.size()), + &written, nullptr)) { + return true; + } + } + // We return false if the file descriptor was not TTY, or it was but + // SetConsoleW failed which can happen if the output has been redirected to + // NUL. In both cases when we return false, we should attempt to do regular + // write via fwrite or std::ostream::write. + return false; +} +#endif + +FMT_FUNC void print(std::FILE* f, string_view text) { +#ifdef _WIN32 + if (write_console(f, text)) return; +#endif + detail::fwrite_fully(text.data(), 1, text.size(), f); +} +} // namespace detail + +FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, args); + detail::print(f, {buffer.data(), buffer.size()}); +} + +#ifdef _WIN32 +// Print assuming legacy (non-Unicode) encoding. +FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str, + format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); + fwrite_fully(buffer.data(), 1, buffer.size(), f); +} +#endif + +FMT_FUNC void vprint(string_view format_str, format_args args) { + vprint(stdout, format_str, args); +} + +namespace detail { + +struct singleton { + unsigned char upper; + unsigned char lower_count; +}; + +inline auto is_printable(uint16_t x, const singleton* singletons, + size_t singletons_size, + const unsigned char* singleton_lowers, + const unsigned char* normal, size_t normal_size) + -> bool { + auto upper = x >> 8; + auto lower_start = 0; + for (size_t i = 0; i < singletons_size; ++i) { + auto s = singletons[i]; + auto lower_end = lower_start + s.lower_count; + if (upper < s.upper) break; + if (upper == s.upper) { + for (auto j = lower_start; j < lower_end; ++j) { + if (singleton_lowers[j] == (x & 0xff)) return false; + } + } + lower_start = lower_end; + } + + auto xsigned = static_cast(x); + auto current = true; + for (size_t i = 0; i < normal_size; ++i) { + auto v = static_cast(normal[i]); + auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v; + xsigned -= len; + if (xsigned < 0) break; + current = !current; + } + return current; +} + +// This code is generated by support/printable.py. +FMT_FUNC auto is_printable(uint32_t cp) -> bool { + static constexpr singleton singletons0[] = { + {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8}, + {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13}, + {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5}, + {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22}, + {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3}, + {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8}, + {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9}, + }; + static constexpr unsigned char singletons0_lower[] = { + 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90, + 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f, + 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1, + 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04, + 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d, + 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf, + 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d, + 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d, + 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d, + 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5, + 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7, + 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49, + 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7, + 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7, + 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e, + 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16, + 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e, + 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f, + 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf, + 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0, + 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27, + 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91, + 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7, + 0xfe, 0xff, + }; + static constexpr singleton singletons1[] = { + {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2}, + {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5}, + {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5}, + {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2}, + {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5}, + {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2}, + {0xfa, 2}, {0xfb, 1}, + }; + static constexpr unsigned char singletons1_lower[] = { + 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07, + 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36, + 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87, + 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b, + 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9, + 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66, + 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27, + 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc, + 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7, + 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6, + 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c, + 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66, + 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0, + 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93, + }; + static constexpr unsigned char normal0[] = { + 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04, + 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0, + 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01, + 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03, + 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03, + 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a, + 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15, + 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f, + 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80, + 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07, + 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06, + 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04, + 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac, + 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c, + 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11, + 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c, + 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b, + 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6, + 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03, + 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80, + 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06, + 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c, + 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17, + 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80, + 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80, + 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d, + }; + static constexpr unsigned char normal1[] = { + 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f, + 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e, + 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04, + 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09, + 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16, + 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f, + 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36, + 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33, + 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08, + 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e, + 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41, + 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03, + 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22, + 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04, + 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45, + 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03, + 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81, + 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75, + 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1, + 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a, + 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11, + 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09, + 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89, + 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6, + 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09, + 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50, + 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05, + 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83, + 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05, + 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80, + 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80, + 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07, + 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e, + 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07, + 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06, + }; + auto lower = static_cast(cp); + if (cp < 0x10000) { + return is_printable(lower, singletons0, + sizeof(singletons0) / sizeof(*singletons0), + singletons0_lower, normal0, sizeof(normal0)); + } + if (cp < 0x20000) { + return is_printable(lower, singletons1, + sizeof(singletons1) / sizeof(*singletons1), + singletons1_lower, normal1, sizeof(normal1)); + } + if (0x2a6de <= cp && cp < 0x2a700) return false; + if (0x2b735 <= cp && cp < 0x2b740) return false; + if (0x2b81e <= cp && cp < 0x2b820) return false; + if (0x2cea2 <= cp && cp < 0x2ceb0) return false; + if (0x2ebe1 <= cp && cp < 0x2f800) return false; + if (0x2fa1e <= cp && cp < 0x30000) return false; + if (0x3134b <= cp && cp < 0xe0100) return false; + if (0xe01f0 <= cp && cp < 0x110000) return false; + return cp < 0x110000; +} + +} // namespace detail + +FMT_END_NAMESPACE + +#endif // FMT_FORMAT_INL_H_ diff --git a/Thirdparty/spdlog/include/spdlog/fmt/bundled/format.h b/Thirdparty/spdlog/include/spdlog/fmt/bundled/format.h new file mode 100644 index 0000000..7c607db --- /dev/null +++ b/Thirdparty/spdlog/include/spdlog/fmt/bundled/format.h @@ -0,0 +1,4217 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - present, Victor Zverovich + + 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. + + --- Optional exception to the license --- + + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into a machine-executable object form of such + source code, you may redistribute such embedded portions in such object form + without including the above copyright and permission notices. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include // std::signbit +#include // uint32_t +#include // std::memcpy +#include // std::numeric_limits +#include // std::uninitialized_copy +#include // std::runtime_error +#include // std::system_error + +#ifdef __cpp_lib_bit_cast +# include // std::bitcast +#endif + +#include "core.h" + +#if FMT_GCC_VERSION +# define FMT_GCC_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) +#else +# define FMT_GCC_VISIBILITY_HIDDEN +#endif + +#ifdef __NVCC__ +# define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__) +#else +# define FMT_CUDA_VERSION 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_NOINLINE __attribute__((noinline)) +#else +# define FMT_NOINLINE +#endif + +#if FMT_MSC_VERSION +# define FMT_MSC_DEFAULT = default +#else +# define FMT_MSC_DEFAULT +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# if FMT_MSC_VERSION || defined(__NVCC__) +FMT_BEGIN_NAMESPACE +namespace detail { +template inline void do_throw(const Exception& x) { + // Silence unreachable code warnings in MSVC and NVCC because these + // are nearly impossible to fix in a generic code. + volatile bool b = true; + if (b) throw x; +} +} // namespace detail +FMT_END_NAMESPACE +# define FMT_THROW(x) detail::do_throw(x) +# else +# define FMT_THROW(x) throw x +# endif +# else +# define FMT_THROW(x) \ + do { \ + FMT_ASSERT(false, (x).what()); \ + } while (false) +# endif +#endif + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifndef FMT_MAYBE_UNUSED +# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) +# define FMT_MAYBE_UNUSED [[maybe_unused]] +# else +# define FMT_MAYBE_UNUSED +# endif +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. +# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ + FMT_MSC_VERSION >= 1900) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) +# define FMT_USE_USER_DEFINED_LITERALS 1 +# else +# define FMT_USE_USER_DEFINED_LITERALS 0 +# endif +#endif + +// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of +// integer formatter template instantiations to just one by only using the +// largest integer type. This results in a reduction in binary size but will +// cause a decrease in integer formatting performance. +#if !defined(FMT_REDUCE_INT_INSTANTIATIONS) +# define FMT_REDUCE_INT_INSTANTIATIONS 0 +#endif + +// __builtin_clz is broken in clang with Microsoft CodeGen: +// https://github.com/fmtlib/fmt/issues/519. +#if !FMT_MSC_VERSION +# if FMT_HAS_BUILTIN(__builtin_clz) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_clzll) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +# endif +#endif + +// __builtin_ctz is broken in Intel Compiler Classic on Windows: +// https://github.com/fmtlib/fmt/issues/2510. +#ifndef __ICL +# if FMT_HAS_BUILTIN(__builtin_ctz) || FMT_GCC_VERSION || FMT_ICC_VERSION || \ + defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZ(n) __builtin_ctz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_ctzll) || FMT_GCC_VERSION || \ + FMT_ICC_VERSION || defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZLL(n) __builtin_ctzll(n) +# endif +#endif + +#if FMT_MSC_VERSION +# include // _BitScanReverse[64], _BitScanForward[64], _umul128 +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or otherwise support +// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the +// MSVC intrinsics if the clz and clzll builtins are not available. +#if FMT_MSC_VERSION && !defined(FMT_BUILTIN_CLZLL) && \ + !defined(FMT_BUILTIN_CTZLL) +FMT_BEGIN_NAMESPACE +namespace detail { +// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning. +# if !defined(__clang__) +# pragma intrinsic(_BitScanForward) +# pragma intrinsic(_BitScanReverse) +# if defined(_WIN64) +# pragma intrinsic(_BitScanForward64) +# pragma intrinsic(_BitScanReverse64) +# endif +# endif + +inline auto clz(uint32_t x) -> int { + unsigned long r = 0; + _BitScanReverse(&r, x); + FMT_ASSERT(x != 0, ""); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. + FMT_MSC_WARNING(suppress : 6102) + return 31 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZ(n) detail::clz(n) + +inline auto clzll(uint64_t x) -> int { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 ^ (r + 32); + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return 63 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZLL(n) detail::clzll(n) + +inline auto ctz(uint32_t x) -> int { + unsigned long r = 0; + _BitScanForward(&r, x); + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return static_cast(r); +} +# define FMT_BUILTIN_CTZ(n) detail::ctz(n) + +inline auto ctzll(uint64_t x) -> int { + unsigned long r = 0; + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. +# ifdef _WIN64 + _BitScanForward64(&r, x); +# else + // Scan the low 32 bits. + if (_BitScanForward(&r, static_cast(x))) return static_cast(r); + // Scan the high 32 bits. + _BitScanForward(&r, static_cast(x >> 32)); + r += 32; +# endif + return static_cast(r); +} +# define FMT_BUILTIN_CTZLL(n) detail::ctzll(n) +} // namespace detail +FMT_END_NAMESPACE +#endif + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_CONSTEXPR inline void abort_fuzzing_if(bool condition) { + ignore_unused(condition); +#ifdef FMT_FUZZ + if (condition) throw std::runtime_error("fuzzing limit reached"); +#endif +} + +template struct string_literal { + static constexpr CharT value[sizeof...(C)] = {C...}; + constexpr operator basic_string_view() const { + return {value, sizeof...(C)}; + } +}; + +#if FMT_CPLUSPLUS < 201703L +template +constexpr CharT string_literal::value[sizeof...(C)]; +#endif + +template class formatbuf : public Streambuf { + private: + using char_type = typename Streambuf::char_type; + using streamsize = decltype(std::declval().sputn(nullptr, 0)); + using int_type = typename Streambuf::int_type; + using traits_type = typename Streambuf::traits_type; + + buffer& buffer_; + + public: + explicit formatbuf(buffer& buf) : buffer_(buf) {} + + protected: + // The put area is always empty. This makes the implementation simpler and has + // the advantage that the streambuf and the buffer are always in sync and + // sputc never writes into uninitialized memory. A disadvantage is that each + // call to sputc always results in a (virtual) call to overflow. There is no + // disadvantage here for sputn since this always results in a call to xsputn. + + auto overflow(int_type ch) -> int_type override { + if (!traits_type::eq_int_type(ch, traits_type::eof())) + buffer_.push_back(static_cast(ch)); + return ch; + } + + auto xsputn(const char_type* s, streamsize count) -> streamsize override { + buffer_.append(s, s + count); + return count; + } +}; + +// Implementation of std::bit_cast for pre-C++20. +template +FMT_CONSTEXPR20 auto bit_cast(const From& from) -> To { +#ifdef __cpp_lib_bit_cast + if (is_constant_evaluated()) return std::bit_cast(from); +#endif + auto to = To(); + // The cast suppresses a bogus -Wclass-memaccess on GCC. + std::memcpy(static_cast(&to), &from, sizeof(to)); + return to; +} + +inline auto is_big_endian() -> bool { +#ifdef _WIN32 + return false; +#elif defined(__BIG_ENDIAN__) + return true; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) + return __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__; +#else + struct bytes { + char data[sizeof(int)]; + }; + return bit_cast(1).data[0] == 0; +#endif +} + +class uint128_fallback { + private: + uint64_t lo_, hi_; + + friend uint128_fallback umul128(uint64_t x, uint64_t y) noexcept; + + public: + constexpr uint128_fallback(uint64_t hi, uint64_t lo) : lo_(lo), hi_(hi) {} + constexpr uint128_fallback(uint64_t value = 0) : lo_(value), hi_(0) {} + + constexpr uint64_t high() const noexcept { return hi_; } + constexpr uint64_t low() const noexcept { return lo_; } + + template ::value)> + constexpr explicit operator T() const { + return static_cast(lo_); + } + + friend constexpr auto operator==(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ == rhs.hi_ && lhs.lo_ == rhs.lo_; + } + friend constexpr auto operator!=(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return !(lhs == rhs); + } + friend constexpr auto operator>(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ != rhs.hi_ ? lhs.hi_ > rhs.hi_ : lhs.lo_ > rhs.lo_; + } + friend constexpr auto operator|(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ | rhs.hi_, lhs.lo_ | rhs.lo_}; + } + friend constexpr auto operator&(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ & rhs.hi_, lhs.lo_ & rhs.lo_}; + } + friend auto operator+(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> uint128_fallback { + auto result = uint128_fallback(lhs); + result += rhs; + return result; + } + friend auto operator*(const uint128_fallback& lhs, uint32_t rhs) + -> uint128_fallback { + FMT_ASSERT(lhs.hi_ == 0, ""); + uint64_t hi = (lhs.lo_ >> 32) * rhs; + uint64_t lo = (lhs.lo_ & ~uint32_t()) * rhs; + uint64_t new_lo = (hi << 32) + lo; + return {(hi >> 32) + (new_lo < lo ? 1 : 0), new_lo}; + } + friend auto operator-(const uint128_fallback& lhs, uint64_t rhs) + -> uint128_fallback { + return {lhs.hi_ - (lhs.lo_ < rhs ? 1 : 0), lhs.lo_ - rhs}; + } + FMT_CONSTEXPR auto operator>>(int shift) const -> uint128_fallback { + if (shift == 64) return {0, hi_}; + if (shift > 64) return uint128_fallback(0, hi_) >> (shift - 64); + return {hi_ >> shift, (hi_ << (64 - shift)) | (lo_ >> shift)}; + } + FMT_CONSTEXPR auto operator<<(int shift) const -> uint128_fallback { + if (shift == 64) return {lo_, 0}; + if (shift > 64) return uint128_fallback(lo_, 0) << (shift - 64); + return {hi_ << shift | (lo_ >> (64 - shift)), (lo_ << shift)}; + } + FMT_CONSTEXPR auto operator>>=(int shift) -> uint128_fallback& { + return *this = *this >> shift; + } + FMT_CONSTEXPR void operator+=(uint128_fallback n) { + uint64_t new_lo = lo_ + n.lo_; + uint64_t new_hi = hi_ + n.hi_ + (new_lo < lo_ ? 1 : 0); + FMT_ASSERT(new_hi >= hi_, ""); + lo_ = new_lo; + hi_ = new_hi; + } + + FMT_CONSTEXPR20 uint128_fallback& operator+=(uint64_t n) noexcept { + if (is_constant_evaluated()) { + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); + return *this; + } +#if FMT_HAS_BUILTIN(__builtin_addcll) && !defined(__ibmxl__) + unsigned long long carry; + lo_ = __builtin_addcll(lo_, n, 0, &carry); + hi_ += carry; +#elif FMT_HAS_BUILTIN(__builtin_ia32_addcarryx_u64) && !defined(__ibmxl__) + unsigned long long result; + auto carry = __builtin_ia32_addcarryx_u64(0, lo_, n, &result); + lo_ = result; + hi_ += carry; +#elif defined(_MSC_VER) && defined(_M_X64) + auto carry = _addcarry_u64(0, lo_, n, &lo_); + _addcarry_u64(carry, hi_, 0, &hi_); +#else + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); +#endif + return *this; + } +}; + +using uint128_t = conditional_t; + +#ifdef UINTPTR_MAX +using uintptr_t = ::uintptr_t; +#else +using uintptr_t = uint128_t; +#endif + +// Returns the largest possible value for type T. Same as +// std::numeric_limits::max() but shorter and not affected by the max macro. +template constexpr auto max_value() -> T { + return (std::numeric_limits::max)(); +} +template constexpr auto num_bits() -> int { + return std::numeric_limits::digits; +} +// std::numeric_limits::digits may return 0 for 128-bit ints. +template <> constexpr auto num_bits() -> int { return 128; } +template <> constexpr auto num_bits() -> int { return 128; } + +// A heterogeneous bit_cast used for converting 96-bit long double to uint128_t +// and 128-bit pointers to uint128_fallback. +template sizeof(From))> +inline auto bit_cast(const From& from) -> To { + constexpr auto size = static_cast(sizeof(From) / sizeof(unsigned)); + struct data_t { + unsigned value[static_cast(size)]; + } data = bit_cast(from); + auto result = To(); + if (const_check(is_big_endian())) { + for (int i = 0; i < size; ++i) + result = (result << num_bits()) | data.value[i]; + } else { + for (int i = size - 1; i >= 0; --i) + result = (result << num_bits()) | data.value[i]; + } + return result; +} + +FMT_INLINE void assume(bool condition) { + (void)condition; +#if FMT_HAS_BUILTIN(__builtin_assume) && !FMT_ICC_VERSION + __builtin_assume(condition); +#endif +} + +// An approximation of iterator_t for pre-C++20 systems. +template +using iterator_t = decltype(std::begin(std::declval())); +template using sentinel_t = decltype(std::end(std::declval())); + +// A workaround for std::string not having mutable data() until C++17. +template +inline auto get_data(std::basic_string& s) -> Char* { + return &s[0]; +} +template +inline auto get_data(Container& c) -> typename Container::value_type* { + return c.data(); +} + +#if defined(_SECURE_SCL) && _SECURE_SCL +// Make a checked iterator to avoid MSVC warnings. +template using checked_ptr = stdext::checked_array_iterator; +template +constexpr auto make_checked(T* p, size_t size) -> checked_ptr { + return {p, size}; +} +#else +template using checked_ptr = T*; +template constexpr auto make_checked(T* p, size_t) -> T* { + return p; +} +#endif + +// Attempts to reserve space for n extra characters in the output range. +// Returns a pointer to the reserved range or a reference to it. +template ::value)> +#if FMT_CLANG_VERSION >= 307 && !FMT_ICC_VERSION +__attribute__((no_sanitize("undefined"))) +#endif +inline auto +reserve(std::back_insert_iterator it, size_t n) + -> checked_ptr { + Container& c = get_container(it); + size_t size = c.size(); + c.resize(size + n); + return make_checked(get_data(c) + size, n); +} + +template +inline auto reserve(buffer_appender it, size_t n) -> buffer_appender { + buffer& buf = get_container(it); + buf.try_reserve(buf.size() + n); + return it; +} + +template +constexpr auto reserve(Iterator& it, size_t) -> Iterator& { + return it; +} + +template +using reserve_iterator = + remove_reference_t(), 0))>; + +template +constexpr auto to_pointer(OutputIt, size_t) -> T* { + return nullptr; +} +template auto to_pointer(buffer_appender it, size_t n) -> T* { + buffer& buf = get_container(it); + auto size = buf.size(); + if (buf.capacity() < size + n) return nullptr; + buf.try_resize(size + n); + return buf.data() + size; +} + +template ::value)> +inline auto base_iterator(std::back_insert_iterator& it, + checked_ptr) + -> std::back_insert_iterator { + return it; +} + +template +constexpr auto base_iterator(Iterator, Iterator it) -> Iterator { + return it; +} + +// is spectacularly slow to compile in C++20 so use a simple fill_n +// instead (#1998). +template +FMT_CONSTEXPR auto fill_n(OutputIt out, Size count, const T& value) + -> OutputIt { + for (Size i = 0; i < count; ++i) *out++ = value; + return out; +} +template +FMT_CONSTEXPR20 auto fill_n(T* out, Size count, char value) -> T* { + if (is_constant_evaluated()) { + return fill_n(out, count, value); + } + std::memset(out, value, to_unsigned(count)); + return out + count; +} + +#ifdef __cpp_char8_t +using char8_type = char8_t; +#else +enum char8_type : unsigned char {}; +#endif + +template +FMT_CONSTEXPR FMT_NOINLINE auto copy_str_noinline(InputIt begin, InputIt end, + OutputIt out) -> OutputIt { + return copy_str(begin, end, out); +} + +// A public domain branchless UTF-8 decoder by Christopher Wellons: +// https://github.com/skeeto/branchless-utf8 +/* Decode the next character, c, from s, reporting errors in e. + * + * Since this is a branchless decoder, four bytes will be read from the + * buffer regardless of the actual length of the next character. This + * means the buffer _must_ have at least three bytes of zero padding + * following the end of the data stream. + * + * Errors are reported in e, which will be non-zero if the parsed + * character was somehow invalid: invalid byte sequence, non-canonical + * encoding, or a surrogate half. + * + * The function returns a pointer to the next character. When an error + * occurs, this pointer will be a guess that depends on the particular + * error, but it will always advance at least one byte. + */ +FMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e) + -> const char* { + constexpr const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; + constexpr const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; + constexpr const int shiftc[] = {0, 18, 12, 6, 0}; + constexpr const int shifte[] = {0, 6, 4, 2, 0}; + + int len = code_point_length_impl(*s); + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + const char* next = s + len + !len; + + using uchar = unsigned char; + + // Assume a four-byte character and load four bytes. Unused bits are + // shifted out. + *c = uint32_t(uchar(s[0]) & masks[len]) << 18; + *c |= uint32_t(uchar(s[1]) & 0x3f) << 12; + *c |= uint32_t(uchar(s[2]) & 0x3f) << 6; + *c |= uint32_t(uchar(s[3]) & 0x3f) << 0; + *c >>= shiftc[len]; + + // Accumulate the various error conditions. + *e = (*c < mins[len]) << 6; // non-canonical encoding + *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? + *e |= (*c > 0x10FFFF) << 8; // out of range? + *e |= (uchar(s[1]) & 0xc0) >> 2; + *e |= (uchar(s[2]) & 0xc0) >> 4; + *e |= uchar(s[3]) >> 6; + *e ^= 0x2a; // top two bits of each tail byte correct? + *e >>= shifte[len]; + + return next; +} + +constexpr uint32_t invalid_code_point = ~uint32_t(); + +// Invokes f(cp, sv) for every code point cp in s with sv being the string view +// corresponding to the code point. cp is invalid_code_point on error. +template +FMT_CONSTEXPR void for_each_codepoint(string_view s, F f) { + auto decode = [f](const char* buf_ptr, const char* ptr) { + auto cp = uint32_t(); + auto error = 0; + auto end = utf8_decode(buf_ptr, &cp, &error); + bool result = f(error ? invalid_code_point : cp, + string_view(ptr, error ? 1 : to_unsigned(end - buf_ptr))); + return result ? (error ? buf_ptr + 1 : end) : nullptr; + }; + auto p = s.data(); + const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. + if (s.size() >= block_size) { + for (auto end = p + s.size() - block_size + 1; p < end;) { + p = decode(p, p); + if (!p) return; + } + } + if (auto num_chars_left = s.data() + s.size() - p) { + char buf[2 * block_size - 1] = {}; + copy_str(p, p + num_chars_left, buf); + const char* buf_ptr = buf; + do { + auto end = decode(buf_ptr, p); + if (!end) return; + p += end - buf_ptr; + buf_ptr = end; + } while (buf_ptr - buf < num_chars_left); + } +} + +template +inline auto compute_width(basic_string_view s) -> size_t { + return s.size(); +} + +// Computes approximate display width of a UTF-8 string. +FMT_CONSTEXPR inline size_t compute_width(string_view s) { + size_t num_code_points = 0; + // It is not a lambda for compatibility with C++14. + struct count_code_points { + size_t* count; + FMT_CONSTEXPR auto operator()(uint32_t cp, string_view) const -> bool { + *count += detail::to_unsigned( + 1 + + (cp >= 0x1100 && + (cp <= 0x115f || // Hangul Jamo init. consonants + cp == 0x2329 || // LEFT-POINTING ANGLE BRACKET + cp == 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK ... Yi except IDEOGRAPHIC HALF FILL SPACE: + (cp >= 0x2e80 && cp <= 0xa4cf && cp != 0x303f) || + (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables + (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs + (cp >= 0xfe10 && cp <= 0xfe19) || // Vertical Forms + (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK Compatibility Forms + (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth Forms + (cp >= 0xffe0 && cp <= 0xffe6) || // Fullwidth Forms + (cp >= 0x20000 && cp <= 0x2fffd) || // CJK + (cp >= 0x30000 && cp <= 0x3fffd) || + // Miscellaneous Symbols and Pictographs + Emoticons: + (cp >= 0x1f300 && cp <= 0x1f64f) || + // Supplemental Symbols and Pictographs: + (cp >= 0x1f900 && cp <= 0x1f9ff)))); + return true; + } + }; + for_each_codepoint(s, count_code_points{&num_code_points}); + return num_code_points; +} + +inline auto compute_width(basic_string_view s) -> size_t { + return compute_width( + string_view(reinterpret_cast(s.data()), s.size())); +} + +template +inline auto code_point_index(basic_string_view s, size_t n) -> size_t { + size_t size = s.size(); + return n < size ? n : size; +} + +// Calculates the index of the nth code point in a UTF-8 string. +inline auto code_point_index(string_view s, size_t n) -> size_t { + const char* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) return i; + } + return s.size(); +} + +inline auto code_point_index(basic_string_view s, size_t n) + -> size_t { + return code_point_index( + string_view(reinterpret_cast(s.data()), s.size()), n); +} + +#ifndef FMT_USE_FLOAT128 +# ifdef __SIZEOF_FLOAT128__ +# define FMT_USE_FLOAT128 1 +# else +# define FMT_USE_FLOAT128 0 +# endif +#endif +#if FMT_USE_FLOAT128 +using float128 = __float128; +#else +using float128 = void; +#endif +template using is_float128 = std::is_same; + +template +using is_floating_point = + bool_constant::value || is_float128::value>; + +template ::value> +struct is_fast_float : bool_constant::is_iec559 && + sizeof(T) <= sizeof(double)> {}; +template struct is_fast_float : std::false_type {}; + +template +using is_double_double = bool_constant::digits == 106>; + +#ifndef FMT_USE_FULL_CACHE_DRAGONBOX +# define FMT_USE_FULL_CACHE_DRAGONBOX 0 +#endif + +template +template +void buffer::append(const U* begin, const U* end) { + while (begin != end) { + auto count = to_unsigned(end - begin); + try_reserve(size_ + count); + auto free_cap = capacity_ - size_; + if (free_cap < count) count = free_cap; + std::uninitialized_copy_n(begin, count, make_checked(ptr_ + size_, count)); + size_ += count; + begin += count; + } +} + +template +struct is_locale : std::false_type {}; +template +struct is_locale> : std::true_type {}; +} // namespace detail + +FMT_MODULE_EXPORT_BEGIN + +// The number of characters to store in the basic_memory_buffer object itself +// to avoid dynamic memory allocation. +enum { inline_buffer_size = 500 }; + +/** + \rst + A dynamically growing memory buffer for trivially copyable/constructible types + with the first ``SIZE`` elements stored in the object itself. + + You can use the ``memory_buffer`` type alias for ``char`` instead. + + **Example**:: + + auto out = fmt::memory_buffer(); + format_to(std::back_inserter(out), "The answer is {}.", 42); + + This will append the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42. + + The output can be converted to an ``std::string`` with ``to_string(out)``. + \endrst + */ +template > +class basic_memory_buffer final : public detail::buffer { + private: + T store_[SIZE]; + + // Don't inherit from Allocator avoid generating type_info for it. + Allocator alloc_; + + // Deallocate memory allocated by the buffer. + FMT_CONSTEXPR20 void deallocate() { + T* data = this->data(); + if (data != store_) alloc_.deallocate(data, this->capacity()); + } + + protected: + FMT_CONSTEXPR20 void grow(size_t size) override; + + public: + using value_type = T; + using const_reference = const T&; + + FMT_CONSTEXPR20 explicit basic_memory_buffer( + const Allocator& alloc = Allocator()) + : alloc_(alloc) { + this->set(store_, SIZE); + if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T()); + } + FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); } + + private: + // Move data from other to this buffer. + FMT_CONSTEXPR20 void move(basic_memory_buffer& other) { + alloc_ = std::move(other.alloc_); + T* data = other.data(); + size_t size = other.size(), capacity = other.capacity(); + if (data == other.store_) { + this->set(store_, capacity); + detail::copy_str(other.store_, other.store_ + size, + detail::make_checked(store_, capacity)); + } else { + this->set(data, capacity); + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.set(other.store_, 0); + other.clear(); + } + this->resize(size); + } + + public: + /** + \rst + Constructs a :class:`fmt::basic_memory_buffer` object moving the content + of the other object to it. + \endrst + */ + FMT_CONSTEXPR20 basic_memory_buffer(basic_memory_buffer&& other) noexcept { + move(other); + } + + /** + \rst + Moves the content of the other ``basic_memory_buffer`` object to this one. + \endrst + */ + auto operator=(basic_memory_buffer&& other) noexcept -> basic_memory_buffer& { + FMT_ASSERT(this != &other, ""); + deallocate(); + move(other); + return *this; + } + + // Returns a copy of the allocator associated with this buffer. + auto get_allocator() const -> Allocator { return alloc_; } + + /** + Resizes the buffer to contain *count* elements. If T is a POD type new + elements may not be initialized. + */ + FMT_CONSTEXPR20 void resize(size_t count) { this->try_resize(count); } + + /** Increases the buffer capacity to *new_capacity*. */ + void reserve(size_t new_capacity) { this->try_reserve(new_capacity); } + + // Directly append data into the buffer + using detail::buffer::append; + template + void append(const ContiguousRange& range) { + append(range.data(), range.data() + range.size()); + } +}; + +template +FMT_CONSTEXPR20 void basic_memory_buffer::grow( + size_t size) { + detail::abort_fuzzing_if(size > 5000); + const size_t max_size = std::allocator_traits::max_size(alloc_); + size_t old_capacity = this->capacity(); + size_t new_capacity = old_capacity + old_capacity / 2; + if (size > new_capacity) + new_capacity = size; + else if (new_capacity > max_size) + new_capacity = size > max_size ? size : max_size; + T* old_data = this->data(); + T* new_data = + std::allocator_traits::allocate(alloc_, new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(old_data, old_data + this->size(), + detail::make_checked(new_data, new_capacity)); + this->set(new_data, new_capacity); + // deallocate must not throw according to the standard, but even if it does, + // the buffer already uses the new storage and will deallocate it in + // destructor. + if (old_data != store_) alloc_.deallocate(old_data, old_capacity); +} + +using memory_buffer = basic_memory_buffer; + +template +struct is_contiguous> : std::true_type { +}; + +namespace detail { +#ifdef _WIN32 +FMT_API bool write_console(std::FILE* f, string_view text); +#endif +FMT_API void print(std::FILE*, string_view); +} // namespace detail + +/** A formatting error such as invalid format string. */ +FMT_CLASS_API +class FMT_API format_error : public std::runtime_error { + public: + explicit format_error(const char* message) : std::runtime_error(message) {} + explicit format_error(const std::string& message) + : std::runtime_error(message) {} + format_error(const format_error&) = default; + format_error& operator=(const format_error&) = default; + format_error(format_error&&) = default; + format_error& operator=(format_error&&) = default; + ~format_error() noexcept override FMT_MSC_DEFAULT; +}; + +namespace detail_exported { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template struct fixed_string { + constexpr fixed_string(const Char (&str)[N]) { + detail::copy_str(static_cast(str), + str + N, data); + } + Char data[N] = {}; +}; +#endif + +// Converts a compile-time string to basic_string_view. +template +constexpr auto compile_string_to_view(const Char (&s)[N]) + -> basic_string_view { + // Remove trailing NUL character if needed. Won't be present if this is used + // with a raw character array (i.e. not defined as a string). + return {s, N - (std::char_traits::to_int_type(s[N - 1]) == 0 ? 1 : 0)}; +} +template +constexpr auto compile_string_to_view(detail::std_string_view s) + -> basic_string_view { + return {s.data(), s.size()}; +} +} // namespace detail_exported + +FMT_BEGIN_DETAIL_NAMESPACE + +template struct is_integral : std::is_integral {}; +template <> struct is_integral : std::true_type {}; +template <> struct is_integral : std::true_type {}; + +template +using is_signed = + std::integral_constant::is_signed || + std::is_same::value>; + +// Returns true if value is negative, false otherwise. +// Same as `value < 0` but doesn't produce warnings if T is an unsigned type. +template ::value)> +constexpr auto is_negative(T value) -> bool { + return value < 0; +} +template ::value)> +constexpr auto is_negative(T) -> bool { + return false; +} + +template +FMT_CONSTEXPR auto is_supported_floating_point(T) -> bool { + if (std::is_same()) return FMT_USE_FLOAT; + if (std::is_same()) return FMT_USE_DOUBLE; + if (std::is_same()) return FMT_USE_LONG_DOUBLE; + return true; +} + +// Smallest of uint32_t, uint64_t, uint128_t that is large enough to +// represent all values of an integral type T. +template +using uint32_or_64_or_128_t = + conditional_t() <= 32 && !FMT_REDUCE_INT_INSTANTIATIONS, + uint32_t, + conditional_t() <= 64, uint64_t, uint128_t>>; +template +using uint64_or_128_t = conditional_t() <= 64, uint64_t, uint128_t>; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ + (factor)*1000000, (factor)*10000000, (factor)*100000000, \ + (factor)*1000000000 + +// Converts value in the range [0, 100) to a string. +constexpr const char* digits2(size_t value) { + // GCC generates slightly better code when value is pointer-size. + return &"0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"[value * 2]; +} + +// Sign is a template parameter to workaround a bug in gcc 4.8. +template constexpr Char sign(Sign s) { +#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 604 + static_assert(std::is_same::value, ""); +#endif + return static_cast("\0-+ "[s]); +} + +template FMT_CONSTEXPR auto count_digits_fallback(T n) -> int { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#if FMT_USE_INT128 +FMT_CONSTEXPR inline auto count_digits(uint128_opt n) -> int { + return count_digits_fallback(n); +} +#endif + +#ifdef FMT_BUILTIN_CLZLL +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +inline auto do_count_digits(uint64_t n) -> int { + // This has comparable performance to the version by Kendall Willets + // (https://github.com/fmtlib/format-benchmark/blob/master/digits10) + // but uses smaller tables. + // Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)). + static constexpr uint8_t bsr2log10[] = { + 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, + 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20}; + auto t = bsr2log10[FMT_BUILTIN_CLZLL(n | 1) ^ 63]; + static constexpr const uint64_t zero_or_powers_of_10[] = { + 0, 0, FMT_POWERS_OF_10(1U), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + return t - (n < zero_or_powers_of_10[t]); +} +#endif + +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +FMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int { +#ifdef FMT_BUILTIN_CLZLL + if (!is_constant_evaluated()) { + return do_count_digits(n); + } +#endif + return count_digits_fallback(n); +} + +// Counts the number of digits in n. BITS = log2(radix). +template +FMT_CONSTEXPR auto count_digits(UInt n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated() && num_bits() == 32) + return (FMT_BUILTIN_CLZ(static_cast(n) | 1) ^ 31) / BITS + 1; +#endif + // Lambda avoids unreachable code warnings from NVHPC. + return [](UInt m) { + int num_digits = 0; + do { + ++num_digits; + } while ((m >>= BITS) != 0); + return num_digits; + }(n); +} + +#ifdef FMT_BUILTIN_CLZ +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +FMT_INLINE auto do_count_digits(uint32_t n) -> int { +// An optimization by Kendall Willets from https://bit.ly/3uOIQrB. +// This increments the upper 32 bits (log10(T) - 1) when >= T is added. +# define FMT_INC(T) (((sizeof(# T) - 1ull) << 32) - T) + static constexpr uint64_t table[] = { + FMT_INC(0), FMT_INC(0), FMT_INC(0), // 8 + FMT_INC(10), FMT_INC(10), FMT_INC(10), // 64 + FMT_INC(100), FMT_INC(100), FMT_INC(100), // 512 + FMT_INC(1000), FMT_INC(1000), FMT_INC(1000), // 4096 + FMT_INC(10000), FMT_INC(10000), FMT_INC(10000), // 32k + FMT_INC(100000), FMT_INC(100000), FMT_INC(100000), // 256k + FMT_INC(1000000), FMT_INC(1000000), FMT_INC(1000000), // 2048k + FMT_INC(10000000), FMT_INC(10000000), FMT_INC(10000000), // 16M + FMT_INC(100000000), FMT_INC(100000000), FMT_INC(100000000), // 128M + FMT_INC(1000000000), FMT_INC(1000000000), FMT_INC(1000000000), // 1024M + FMT_INC(1000000000), FMT_INC(1000000000) // 4B + }; + auto inc = table[FMT_BUILTIN_CLZ(n | 1) ^ 31]; + return static_cast((n + inc) >> 32); +} +#endif + +// Optional version of count_digits for better performance on 32-bit platforms. +FMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated()) { + return do_count_digits(n); + } +#endif + return count_digits_fallback(n); +} + +template constexpr auto digits10() noexcept -> int { + return std::numeric_limits::digits10; +} +template <> constexpr auto digits10() noexcept -> int { return 38; } +template <> constexpr auto digits10() noexcept -> int { return 38; } + +template struct thousands_sep_result { + std::string grouping; + Char thousands_sep; +}; + +template +FMT_API auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result; +template +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { + auto result = thousands_sep_impl(loc); + return {result.grouping, Char(result.thousands_sep)}; +} +template <> +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { + return thousands_sep_impl(loc); +} + +template +FMT_API auto decimal_point_impl(locale_ref loc) -> Char; +template inline auto decimal_point(locale_ref loc) -> Char { + return Char(decimal_point_impl(loc)); +} +template <> inline auto decimal_point(locale_ref loc) -> wchar_t { + return decimal_point_impl(loc); +} + +// Compares two characters for equality. +template auto equal2(const Char* lhs, const char* rhs) -> bool { + return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]); +} +inline auto equal2(const char* lhs, const char* rhs) -> bool { + return memcmp(lhs, rhs, 2) == 0; +} + +// Copies two characters from src to dst. +template +FMT_CONSTEXPR20 FMT_INLINE void copy2(Char* dst, const char* src) { + if (!is_constant_evaluated() && sizeof(Char) == sizeof(char)) { + memcpy(dst, src, 2); + return; + } + *dst++ = static_cast(*src++); + *dst = static_cast(*src); +} + +template struct format_decimal_result { + Iterator begin; + Iterator end; +}; + +// Formats a decimal unsigned integer value writing into out pointing to a +// buffer of specified size. The caller must ensure that the buffer is large +// enough. +template +FMT_CONSTEXPR20 auto format_decimal(Char* out, UInt value, int size) + -> format_decimal_result { + FMT_ASSERT(size >= count_digits(value), "invalid digit count"); + out += size; + Char* end = out; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + out -= 2; + copy2(out, digits2(static_cast(value % 100))); + value /= 100; + } + if (value < 10) { + *--out = static_cast('0' + value); + return {out, end}; + } + out -= 2; + copy2(out, digits2(static_cast(value))); + return {out, end}; +} + +template >::value)> +FMT_CONSTEXPR inline auto format_decimal(Iterator out, UInt value, int size) + -> format_decimal_result { + // Buffer is large enough to hold all digits (digits10 + 1). + Char buffer[digits10() + 1]; + auto end = format_decimal(buffer, value, size).end; + return {out, detail::copy_str_noinline(buffer, end, out)}; +} + +template +FMT_CONSTEXPR auto format_uint(Char* buffer, UInt value, int num_digits, + bool upper = false) -> Char* { + buffer += num_digits; + Char* end = buffer; + do { + const char* digits = upper ? "0123456789ABCDEF" : "0123456789abcdef"; + unsigned digit = static_cast(value & ((1 << BASE_BITS) - 1)); + *--buffer = static_cast(BASE_BITS < 4 ? static_cast('0' + digit) + : digits[digit]); + } while ((value >>= BASE_BITS) != 0); + return end; +} + +template +inline auto format_uint(It out, UInt value, int num_digits, bool upper = false) + -> It { + if (auto ptr = to_pointer(out, to_unsigned(num_digits))) { + format_uint(ptr, value, num_digits, upper); + return out; + } + // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1). + char buffer[num_bits() / BASE_BITS + 1]; + format_uint(buffer, value, num_digits, upper); + return detail::copy_str_noinline(buffer, buffer + num_digits, out); +} + +// A converter from UTF-8 to UTF-16. +class utf8_to_utf16 { + private: + basic_memory_buffer buffer_; + + public: + FMT_API explicit utf8_to_utf16(string_view s); + operator basic_string_view() const { return {&buffer_[0], size()}; } + auto size() const -> size_t { return buffer_.size() - 1; } + auto c_str() const -> const wchar_t* { return &buffer_[0]; } + auto str() const -> std::wstring { return {&buffer_[0], size()}; } +}; + +namespace dragonbox { + +// Type-specific information that Dragonbox uses. +template struct float_info; + +template <> struct float_info { + using carrier_uint = uint32_t; + static const int exponent_bits = 8; + static const int kappa = 1; + static const int big_divisor = 100; + static const int small_divisor = 10; + static const int min_k = -31; + static const int max_k = 46; + static const int shorter_interval_tie_lower_threshold = -35; + static const int shorter_interval_tie_upper_threshold = -35; +}; + +template <> struct float_info { + using carrier_uint = uint64_t; + static const int exponent_bits = 11; + static const int kappa = 2; + static const int big_divisor = 1000; + static const int small_divisor = 100; + static const int min_k = -292; + static const int max_k = 326; + static const int shorter_interval_tie_lower_threshold = -77; + static const int shorter_interval_tie_upper_threshold = -77; +}; + +// An 80- or 128-bit floating point number. +template +struct float_info::digits == 64 || + std::numeric_limits::digits == 113 || + is_float128::value>> { + using carrier_uint = detail::uint128_t; + static const int exponent_bits = 15; +}; + +// A double-double floating point number. +template +struct float_info::value>> { + using carrier_uint = detail::uint128_t; +}; + +template struct decimal_fp { + using significand_type = typename float_info::carrier_uint; + significand_type significand; + int exponent; +}; + +template FMT_API auto to_decimal(T x) noexcept -> decimal_fp; +} // namespace dragonbox + +// Returns true iff Float has the implicit bit which is not stored. +template constexpr bool has_implicit_bit() { + // An 80-bit FP number has a 64-bit significand an no implicit bit. + return std::numeric_limits::digits != 64; +} + +// Returns the number of significand bits stored in Float. The implicit bit is +// not counted since it is not stored. +template constexpr int num_significand_bits() { + // std::numeric_limits may not support __float128. + return is_float128() ? 112 + : (std::numeric_limits::digits - + (has_implicit_bit() ? 1 : 0)); +} + +template +constexpr auto exponent_mask() -> + typename dragonbox::float_info::carrier_uint { + using uint = typename dragonbox::float_info::carrier_uint; + return ((uint(1) << dragonbox::float_info::exponent_bits) - 1) + << num_significand_bits(); +} +template constexpr auto exponent_bias() -> int { + // std::numeric_limits may not support __float128. + return is_float128() ? 16383 + : std::numeric_limits::max_exponent - 1; +} + +// Writes the exponent exp in the form "[+-]d{2,3}" to buffer. +template +FMT_CONSTEXPR auto write_exponent(int exp, It it) -> It { + FMT_ASSERT(-10000 < exp && exp < 10000, "exponent out of range"); + if (exp < 0) { + *it++ = static_cast('-'); + exp = -exp; + } else { + *it++ = static_cast('+'); + } + if (exp >= 100) { + const char* top = digits2(to_unsigned(exp / 100)); + if (exp >= 1000) *it++ = static_cast(top[0]); + *it++ = static_cast(top[1]); + exp %= 100; + } + const char* d = digits2(to_unsigned(exp)); + *it++ = static_cast(d[0]); + *it++ = static_cast(d[1]); + return it; +} + +// A floating-point number f * pow(2, e) where F is an unsigned type. +template struct basic_fp { + F f; + int e; + + static constexpr const int num_significand_bits = + static_cast(sizeof(F) * num_bits()); + + constexpr basic_fp() : f(0), e(0) {} + constexpr basic_fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} + + // Constructs fp from an IEEE754 floating-point number. + template FMT_CONSTEXPR basic_fp(Float n) { assign(n); } + + // Assigns n to this and return true iff predecessor is closer than successor. + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::digits <= 113, "unsupported FP"); + // Assume Float is in the format [sign][exponent][significand]. + using carrier_uint = typename dragonbox::float_info::carrier_uint; + const auto num_float_significand_bits = + detail::num_significand_bits(); + const auto implicit_bit = carrier_uint(1) << num_float_significand_bits; + const auto significand_mask = implicit_bit - 1; + auto u = bit_cast(n); + f = static_cast(u & significand_mask); + auto biased_e = static_cast((u & exponent_mask()) >> + num_float_significand_bits); + // The predecessor is closer if n is a normalized power of 2 (f == 0) + // other than the smallest normalized number (biased_e > 1). + auto is_predecessor_closer = f == 0 && biased_e > 1; + if (biased_e == 0) + biased_e = 1; // Subnormals use biased exponent 1 (min exponent). + else if (has_implicit_bit()) + f += static_cast(implicit_bit); + e = biased_e - exponent_bias() - num_float_significand_bits; + if (!has_implicit_bit()) ++e; + return is_predecessor_closer; + } + + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::is_iec559, "unsupported FP"); + return assign(static_cast(n)); + } +}; + +using fp = basic_fp; + +// Normalizes the value converted from double and multiplied by (1 << SHIFT). +template +FMT_CONSTEXPR basic_fp normalize(basic_fp value) { + // Handle subnormals. + const auto implicit_bit = F(1) << num_significand_bits(); + const auto shifted_implicit_bit = implicit_bit << SHIFT; + while ((value.f & shifted_implicit_bit) == 0) { + value.f <<= 1; + --value.e; + } + // Subtract 1 to account for hidden bit. + const auto offset = basic_fp::num_significand_bits - + num_significand_bits() - SHIFT - 1; + value.f <<= offset; + value.e -= offset; + return value; +} + +// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. +FMT_CONSTEXPR inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +#if FMT_USE_INT128 + auto product = static_cast<__uint128_t>(lhs) * rhs; + auto f = static_cast(product >> 64); + return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; +#else + // Multiply 32-bit parts of significands. + uint64_t mask = (1ULL << 32) - 1; + uint64_t a = lhs >> 32, b = lhs & mask; + uint64_t c = rhs >> 32, d = rhs & mask; + uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; + // Compute mid 64-bit of result and round. + uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); + return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); +#endif +} + +FMT_CONSTEXPR inline fp operator*(fp x, fp y) { + return {multiply(x.f, y.f), x.e + y.e + 64}; +} + +template struct basic_data { + // Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. + // These are generated by support/compute-powers.py. + static constexpr uint64_t pow10_significands[87] = { + 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, + 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, + 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, + 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, + 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, + 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, + 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, + 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, + 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, + 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, + 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, + 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, + 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, + 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, + 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, + 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, + 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, + 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, + 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, + 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, + 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, + 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, + 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, + 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, + 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, + 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, + 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, + 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, + 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, + }; + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnarrowing" +#endif + // Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding + // to significands above. + static constexpr int16_t pow10_exponents[87] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, + -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, + -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, + -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, + -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, + 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, + 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, + 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic pop +#endif + + static constexpr uint64_t power_of_10_64[20] = { + 1, FMT_POWERS_OF_10(1ULL), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; +}; + +#if FMT_CPLUSPLUS < 201703L +template constexpr uint64_t basic_data::pow10_significands[]; +template constexpr int16_t basic_data::pow10_exponents[]; +template constexpr uint64_t basic_data::power_of_10_64[]; +#endif + +// This is a struct rather than an alias to avoid shadowing warnings in gcc. +struct data : basic_data<> {}; + +// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its +// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. +FMT_CONSTEXPR inline fp get_cached_power(int min_exponent, + int& pow10_exponent) { + const int shift = 32; + // log10(2) = 0x0.4d104d427de7fbcc... + const int64_t significand = 0x4d104d427de7fbcc; + int index = static_cast( + ((min_exponent + fp::num_significand_bits - 1) * (significand >> shift) + + ((int64_t(1) << shift) - 1)) // ceil + >> 32 // arithmetic shift + ); + // Decimal exponent of the first (smallest) cached power of 10. + const int first_dec_exp = -348; + // Difference between 2 consecutive decimal exponents in cached powers of 10. + const int dec_exp_step = 8; + index = (index - first_dec_exp - 1) / dec_exp_step + 1; + pow10_exponent = first_dec_exp + index * dec_exp_step; + // Using *(x + index) instead of x[index] avoids an issue with some compilers + // using the EDG frontend (e.g. nvhpc/22.3 in C++17 mode). + return {*(data::pow10_significands + index), + *(data::pow10_exponents + index)}; +} + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else +FMT_API auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) -> int; +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +// Formats a floating-point number with snprintf using the hexfloat format. +template +auto snprintf_float(T value, int precision, float_specs specs, + buffer& buf) -> int { + // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. + FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); + FMT_ASSERT(specs.format == float_format::hex, ""); + static_assert(!std::is_same::value, ""); + + // Build the format string. + char format[7]; // The longest format is "%#.*Le". + char* format_ptr = format; + *format_ptr++ = '%'; + if (specs.showpoint) *format_ptr++ = '#'; + if (precision >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + if (std::is_same()) *format_ptr++ = 'L'; + *format_ptr++ = specs.upper ? 'A' : 'a'; + *format_ptr = '\0'; + + // Format using snprintf. + auto offset = buf.size(); + for (;;) { + auto begin = buf.data() + offset; + auto capacity = buf.capacity() - offset; + abort_fuzzing_if(precision > 100000); + // Suppress the warning about a nonliteral format string. + // Cannot use auto because of a bug in MinGW (#1532). + int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; + int result = precision >= 0 + ? snprintf_ptr(begin, capacity, format, precision, value) + : snprintf_ptr(begin, capacity, format, value); + if (result < 0) { + // The buffer will grow exponentially. + buf.try_reserve(buf.capacity() + 1); + continue; + } + auto size = to_unsigned(result); + // Size equal to capacity means that the last character was truncated. + if (size < capacity) { + buf.try_resize(size + offset); + return 0; + } + buf.try_reserve(size + offset + 1); // Add 1 for the terminating '\0'. + } +} + +template +using convert_float_result = + conditional_t::value || sizeof(T) == sizeof(double), + double, T>; + +template +constexpr auto convert_float(T value) -> convert_float_result { + return static_cast>(value); +} + +template +FMT_NOINLINE FMT_CONSTEXPR auto fill(OutputIt it, size_t n, + const fill_t& fill) -> OutputIt { + auto fill_size = fill.size(); + if (fill_size == 1) return detail::fill_n(it, n, fill[0]); + auto data = fill.data(); + for (size_t i = 0; i < n; ++i) + it = copy_str(data, data + fill_size, it); + return it; +} + +// Writes the output of f, padded according to format specifications in specs. +// size: output size in code units. +// width: output display width in (terminal) column positions. +template +FMT_CONSTEXPR auto write_padded(OutputIt out, + const basic_format_specs& specs, + size_t size, size_t width, F&& f) -> OutputIt { + static_assert(align == align::left || align == align::right, ""); + unsigned spec_width = to_unsigned(specs.width); + size_t padding = spec_width > width ? spec_width - width : 0; + // Shifts are encoded as string literals because static constexpr is not + // supported in constexpr functions. + auto* shifts = align == align::left ? "\x1f\x1f\x00\x01" : "\x00\x1f\x00\x01"; + size_t left_padding = padding >> shifts[specs.align]; + size_t right_padding = padding - left_padding; + auto it = reserve(out, size + padding * specs.fill.size()); + if (left_padding != 0) it = fill(it, left_padding, specs.fill); + it = f(it); + if (right_padding != 0) it = fill(it, right_padding, specs.fill); + return base_iterator(out, it); +} + +template +constexpr auto write_padded(OutputIt out, const basic_format_specs& specs, + size_t size, F&& f) -> OutputIt { + return write_padded(out, specs, size, size, f); +} + +template +FMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes, + const basic_format_specs& specs) + -> OutputIt { + return write_padded( + out, specs, bytes.size(), [bytes](reserve_iterator it) { + const char* data = bytes.data(); + return copy_str(data, data + bytes.size(), it); + }); +} + +template +auto write_ptr(OutputIt out, UIntPtr value, + const basic_format_specs* specs) -> OutputIt { + int num_digits = count_digits<4>(value); + auto size = to_unsigned(num_digits) + size_t(2); + auto write = [=](reserve_iterator it) { + *it++ = static_cast('0'); + *it++ = static_cast('x'); + return format_uint<4, Char>(it, value, num_digits); + }; + return specs ? write_padded(out, *specs, size, write) + : base_iterator(out, write(reserve(out, size))); +} + +// Returns true iff the code point cp is printable. +FMT_API auto is_printable(uint32_t cp) -> bool; + +inline auto needs_escape(uint32_t cp) -> bool { + return cp < 0x20 || cp == 0x7f || cp == '"' || cp == '\\' || + !is_printable(cp); +} + +template struct find_escape_result { + const Char* begin; + const Char* end; + uint32_t cp; +}; + +template +using make_unsigned_char = + typename conditional_t::value, + std::make_unsigned, + type_identity>::type; + +template +auto find_escape(const Char* begin, const Char* end) + -> find_escape_result { + for (; begin != end; ++begin) { + uint32_t cp = static_cast>(*begin); + if (const_check(sizeof(Char) == 1) && cp >= 0x80) continue; + if (needs_escape(cp)) return {begin, begin + 1, cp}; + } + return {begin, nullptr, 0}; +} + +inline auto find_escape(const char* begin, const char* end) + -> find_escape_result { + if (!is_utf8()) return find_escape(begin, end); + auto result = find_escape_result{end, nullptr, 0}; + for_each_codepoint(string_view(begin, to_unsigned(end - begin)), + [&](uint32_t cp, string_view sv) { + if (needs_escape(cp)) { + result = {sv.begin(), sv.end(), cp}; + return false; + } + return true; + }); + return result; +} + +#define FMT_STRING_IMPL(s, base, explicit) \ + [] { \ + /* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \ + /* Use a macro-like name to avoid shadowing warnings. */ \ + struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \ + using char_type FMT_MAYBE_UNUSED = fmt::remove_cvref_t; \ + FMT_MAYBE_UNUSED FMT_CONSTEXPR explicit \ + operator fmt::basic_string_view() const { \ + return fmt::detail_exported::compile_string_to_view(s); \ + } \ + }; \ + return FMT_COMPILE_STRING(); \ + }() + +/** + \rst + Constructs a compile-time format string from a string literal *s*. + + **Example**:: + + // A compile-time error because 'd' is an invalid specifier for strings. + std::string s = fmt::format(FMT_STRING("{:d}"), "foo"); + \endrst + */ +#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::detail::compile_string, ) + +template +auto write_codepoint(OutputIt out, char prefix, uint32_t cp) -> OutputIt { + *out++ = static_cast('\\'); + *out++ = static_cast(prefix); + Char buf[width]; + fill_n(buf, width, static_cast('0')); + format_uint<4>(buf, cp, width); + return copy_str(buf, buf + width, out); +} + +template +auto write_escaped_cp(OutputIt out, const find_escape_result& escape) + -> OutputIt { + auto c = static_cast(escape.cp); + switch (escape.cp) { + case '\n': + *out++ = static_cast('\\'); + c = static_cast('n'); + break; + case '\r': + *out++ = static_cast('\\'); + c = static_cast('r'); + break; + case '\t': + *out++ = static_cast('\\'); + c = static_cast('t'); + break; + case '"': + FMT_FALLTHROUGH; + case '\'': + FMT_FALLTHROUGH; + case '\\': + *out++ = static_cast('\\'); + break; + default: + if (is_utf8()) { + if (escape.cp < 0x100) { + return write_codepoint<2, Char>(out, 'x', escape.cp); + } + if (escape.cp < 0x10000) { + return write_codepoint<4, Char>(out, 'u', escape.cp); + } + if (escape.cp < 0x110000) { + return write_codepoint<8, Char>(out, 'U', escape.cp); + } + } + for (Char escape_char : basic_string_view( + escape.begin, to_unsigned(escape.end - escape.begin))) { + out = write_codepoint<2, Char>(out, 'x', + static_cast(escape_char) & 0xFF); + } + return out; + } + *out++ = c; + return out; +} + +template +auto write_escaped_string(OutputIt out, basic_string_view str) + -> OutputIt { + *out++ = static_cast('"'); + auto begin = str.begin(), end = str.end(); + do { + auto escape = find_escape(begin, end); + out = copy_str(begin, escape.begin, out); + begin = escape.end; + if (!begin) break; + out = write_escaped_cp(out, escape); + } while (begin != end); + *out++ = static_cast('"'); + return out; +} + +template +auto write_escaped_char(OutputIt out, Char v) -> OutputIt { + *out++ = static_cast('\''); + if ((needs_escape(static_cast(v)) && v != static_cast('"')) || + v == static_cast('\'')) { + out = write_escaped_cp( + out, find_escape_result{&v, &v + 1, static_cast(v)}); + } else { + *out++ = v; + } + *out++ = static_cast('\''); + return out; +} + +template +FMT_CONSTEXPR auto write_char(OutputIt out, Char value, + const basic_format_specs& specs) + -> OutputIt { + bool is_debug = specs.type == presentation_type::debug; + return write_padded(out, specs, 1, [=](reserve_iterator it) { + if (is_debug) return write_escaped_char(it, value); + *it++ = value; + return it; + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, Char value, + const basic_format_specs& specs, + locale_ref loc = {}) -> OutputIt { + return check_char_specs(specs) + ? write_char(out, value, specs) + : write(out, static_cast(value), specs, loc); +} + +// Data for write_int that doesn't depend on output iterator type. It is used to +// avoid template code bloat. +template struct write_int_data { + size_t size; + size_t padding; + + FMT_CONSTEXPR write_int_data(int num_digits, unsigned prefix, + const basic_format_specs& specs) + : size((prefix >> 24) + to_unsigned(num_digits)), padding(0) { + if (specs.align == align::numeric) { + auto width = to_unsigned(specs.width); + if (width > size) { + padding = width - size; + size = width; + } + } else if (specs.precision > num_digits) { + size = (prefix >> 24) + to_unsigned(specs.precision); + padding = to_unsigned(specs.precision - num_digits); + } + } +}; + +// Writes an integer in the format +// +// where are written by write_digits(it). +// prefix contains chars in three lower bytes and the size in the fourth byte. +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, int num_digits, + unsigned prefix, + const basic_format_specs& specs, + W write_digits) -> OutputIt { + // Slightly faster check for specs.width == 0 && specs.precision == -1. + if ((specs.width | (specs.precision + 1)) == 0) { + auto it = reserve(out, to_unsigned(num_digits) + (prefix >> 24)); + if (prefix != 0) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + } + return base_iterator(out, write_digits(it)); + } + auto data = write_int_data(num_digits, prefix, specs); + return write_padded( + out, specs, data.size, [=](reserve_iterator it) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + it = detail::fill_n(it, data.padding, static_cast('0')); + return write_digits(it); + }); +} + +template class digit_grouping { + private: + thousands_sep_result sep_; + + struct next_state { + std::string::const_iterator group; + int pos; + }; + next_state initial_state() const { return {sep_.grouping.begin(), 0}; } + + // Returns the next digit group separator position. + int next(next_state& state) const { + if (!sep_.thousands_sep) return max_value(); + if (state.group == sep_.grouping.end()) + return state.pos += sep_.grouping.back(); + if (*state.group <= 0 || *state.group == max_value()) + return max_value(); + state.pos += *state.group++; + return state.pos; + } + + public: + explicit digit_grouping(locale_ref loc, bool localized = true) { + if (localized) + sep_ = thousands_sep(loc); + else + sep_.thousands_sep = Char(); + } + explicit digit_grouping(thousands_sep_result sep) : sep_(sep) {} + + Char separator() const { return sep_.thousands_sep; } + + int count_separators(int num_digits) const { + int count = 0; + auto state = initial_state(); + while (num_digits > next(state)) ++count; + return count; + } + + // Applies grouping to digits and write the output to out. + template + Out apply(Out out, basic_string_view digits) const { + auto num_digits = static_cast(digits.size()); + auto separators = basic_memory_buffer(); + separators.push_back(0); + auto state = initial_state(); + while (int i = next(state)) { + if (i >= num_digits) break; + separators.push_back(i); + } + for (int i = 0, sep_index = static_cast(separators.size() - 1); + i < num_digits; ++i) { + if (num_digits - i == separators[sep_index]) { + *out++ = separator(); + --sep_index; + } + *out++ = static_cast(digits[to_unsigned(i)]); + } + return out; + } +}; + +template +auto write_int_localized(OutputIt out, UInt value, unsigned prefix, + const basic_format_specs& specs, + const digit_grouping& grouping) -> OutputIt { + static_assert(std::is_same, UInt>::value, ""); + int num_digits = count_digits(value); + char digits[40]; + format_decimal(digits, value, num_digits); + unsigned size = to_unsigned((prefix != 0 ? 1 : 0) + num_digits + + grouping.count_separators(num_digits)); + return write_padded( + out, specs, size, size, [&](reserve_iterator it) { + if (prefix != 0) { + char sign = static_cast(prefix); + *it++ = static_cast(sign); + } + return grouping.apply(it, string_view(digits, to_unsigned(num_digits))); + }); +} + +template +auto write_int_localized(OutputIt& out, UInt value, unsigned prefix, + const basic_format_specs& specs, locale_ref loc) + -> bool { + auto grouping = digit_grouping(loc); + out = write_int_localized(out, value, prefix, specs, grouping); + return true; +} + +FMT_CONSTEXPR inline void prefix_append(unsigned& prefix, unsigned value) { + prefix |= prefix != 0 ? value << 8 : value; + prefix += (1u + (value > 0xff ? 1 : 0)) << 24; +} + +template struct write_int_arg { + UInt abs_value; + unsigned prefix; +}; + +template +FMT_CONSTEXPR auto make_write_int_arg(T value, sign_t sign) + -> write_int_arg> { + auto prefix = 0u; + auto abs_value = static_cast>(value); + if (is_negative(value)) { + prefix = 0x01000000 | '-'; + abs_value = 0 - abs_value; + } else { + constexpr const unsigned prefixes[4] = {0, 0, 0x1000000u | '+', + 0x1000000u | ' '}; + prefix = prefixes[sign]; + } + return {abs_value, prefix}; +} + +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, write_int_arg arg, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + static_assert(std::is_same>::value, ""); + auto abs_value = arg.abs_value; + auto prefix = arg.prefix; + switch (specs.type) { + case presentation_type::none: + case presentation_type::dec: { + if (specs.localized && + write_int_localized(out, static_cast>(abs_value), + prefix, specs, loc)) { + return out; + } + auto num_digits = count_digits(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_decimal(it, abs_value, num_digits).end; + }); + } + case presentation_type::hex_lower: + case presentation_type::hex_upper: { + bool upper = specs.type == presentation_type::hex_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'X' : 'x') << 8 | '0'); + int num_digits = count_digits<4>(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_uint<4, Char>(it, abs_value, num_digits, upper); + }); + } + case presentation_type::bin_lower: + case presentation_type::bin_upper: { + bool upper = specs.type == presentation_type::bin_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'B' : 'b') << 8 | '0'); + int num_digits = count_digits<1>(abs_value); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<1, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::oct: { + int num_digits = count_digits<3>(abs_value); + // Octal prefix '0' is counted as a digit, so only add it if precision + // is not greater than the number of digits. + if (specs.alt && specs.precision <= num_digits && abs_value != 0) + prefix_append(prefix, '0'); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<3, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::chr: + return write_char(out, static_cast(abs_value), specs); + default: + throw_format_error("invalid type specifier"); + } + return out; +} +template +FMT_CONSTEXPR FMT_NOINLINE auto write_int_noinline( + OutputIt out, write_int_arg arg, const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, arg, specs, loc); +} +template ::value && + !std::is_same::value && + std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int_noinline(out, make_write_int_arg(value, specs.sign), specs, + loc); +} +// An inlined version of write used in format string compilation. +template ::value && + !std::is_same::value && + !std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, make_write_int_arg(value, specs.sign), specs, loc); +} + +// An output iterator that counts the number of objects written to it and +// discards them. +class counting_iterator { + private: + size_t count_; + + public: + using iterator_category = std::output_iterator_tag; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + FMT_UNCHECKED_ITERATOR(counting_iterator); + + struct value_type { + template FMT_CONSTEXPR void operator=(const T&) {} + }; + + FMT_CONSTEXPR counting_iterator() : count_(0) {} + + FMT_CONSTEXPR size_t count() const { return count_; } + + FMT_CONSTEXPR counting_iterator& operator++() { + ++count_; + return *this; + } + FMT_CONSTEXPR counting_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + FMT_CONSTEXPR friend counting_iterator operator+(counting_iterator it, + difference_type n) { + it.count_ += static_cast(n); + return it; + } + + FMT_CONSTEXPR value_type operator*() const { return {}; } +}; + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view s, + const basic_format_specs& specs) -> OutputIt { + auto data = s.data(); + auto size = s.size(); + if (specs.precision >= 0 && to_unsigned(specs.precision) < size) + size = code_point_index(s, to_unsigned(specs.precision)); + bool is_debug = specs.type == presentation_type::debug; + size_t width = 0; + if (specs.width != 0) { + if (is_debug) + width = write_escaped_string(counting_iterator{}, s).count(); + else + width = compute_width(basic_string_view(data, size)); + } + return write_padded(out, specs, size, width, + [=](reserve_iterator it) { + if (is_debug) return write_escaped_string(it, s); + return copy_str(data, data + size, it); + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, + basic_string_view> s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + check_string_type_spec(specs.type); + return write(out, s, specs); +} +template +FMT_CONSTEXPR auto write(OutputIt out, const Char* s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + return check_cstring_type_spec(specs.type) + ? write(out, basic_string_view(s), specs, {}) + : write_ptr(out, bit_cast(s), &specs); +} + +template ::value && + !std::is_same::value && + !std::is_same::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + auto abs_value = static_cast>(value); + bool negative = is_negative(value); + // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. + if (negative) abs_value = ~abs_value + 1; + int num_digits = count_digits(abs_value); + auto size = (negative ? 1 : 0) + static_cast(num_digits); + auto it = reserve(out, size); + if (auto ptr = to_pointer(it, size)) { + if (negative) *ptr++ = static_cast('-'); + format_decimal(ptr, abs_value, num_digits); + return out; + } + if (negative) *it++ = static_cast('-'); + it = format_decimal(it, abs_value, num_digits).end; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR20 auto write_nonfinite(OutputIt out, bool isnan, + basic_format_specs specs, + const float_specs& fspecs) -> OutputIt { + auto str = + isnan ? (fspecs.upper ? "NAN" : "nan") : (fspecs.upper ? "INF" : "inf"); + constexpr size_t str_size = 3; + auto sign = fspecs.sign; + auto size = str_size + (sign ? 1 : 0); + // Replace '0'-padding with space for non-finite values. + const bool is_zero_fill = + specs.fill.size() == 1 && *specs.fill.data() == static_cast('0'); + if (is_zero_fill) specs.fill[0] = static_cast(' '); + return write_padded(out, specs, size, [=](reserve_iterator it) { + if (sign) *it++ = detail::sign(sign); + return copy_str(str, str + str_size, it); + }); +} + +// A decimal floating-point number significand * pow(10, exp). +struct big_decimal_fp { + const char* significand; + int significand_size; + int exponent; +}; + +constexpr auto get_significand_size(const big_decimal_fp& f) -> int { + return f.significand_size; +} +template +inline auto get_significand_size(const dragonbox::decimal_fp& f) -> int { + return count_digits(f.significand); +} + +template +constexpr auto write_significand(OutputIt out, const char* significand, + int significand_size) -> OutputIt { + return copy_str(significand, significand + significand_size, out); +} +template +inline auto write_significand(OutputIt out, UInt significand, + int significand_size) -> OutputIt { + return format_decimal(out, significand, significand_size).end; +} +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int exponent, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + out = write_significand(out, significand, significand_size); + return detail::fill_n(out, exponent, static_cast('0')); + } + auto buffer = memory_buffer(); + write_significand(appender(buffer), significand, significand_size); + detail::fill_n(appender(buffer), exponent, '0'); + return grouping.apply(out, string_view(buffer.data(), buffer.size())); +} + +template ::value)> +inline auto write_significand(Char* out, UInt significand, int significand_size, + int integral_size, Char decimal_point) -> Char* { + if (!decimal_point) + return format_decimal(out, significand, significand_size).end; + out += significand_size + 1; + Char* end = out; + int floating_size = significand_size - integral_size; + for (int i = floating_size / 2; i > 0; --i) { + out -= 2; + copy2(out, digits2(static_cast(significand % 100))); + significand /= 100; + } + if (floating_size % 2 != 0) { + *--out = static_cast('0' + significand % 10); + significand /= 10; + } + *--out = decimal_point; + format_decimal(out - integral_size, significand, integral_size); + return end; +} + +template >::value)> +inline auto write_significand(OutputIt out, UInt significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + // Buffer is large enough to hold digits (digits10 + 1) and a decimal point. + Char buffer[digits10() + 2]; + auto end = write_significand(buffer, significand, significand_size, + integral_size, decimal_point); + return detail::copy_str_noinline(buffer, end, out); +} + +template +FMT_CONSTEXPR auto write_significand(OutputIt out, const char* significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + out = detail::copy_str_noinline(significand, + significand + integral_size, out); + if (!decimal_point) return out; + *out++ = decimal_point; + return detail::copy_str_noinline(significand + integral_size, + significand + significand_size, out); +} + +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int integral_size, + Char decimal_point, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + return write_significand(out, significand, significand_size, integral_size, + decimal_point); + } + auto buffer = basic_memory_buffer(); + write_significand(buffer_appender(buffer), significand, + significand_size, integral_size, decimal_point); + grouping.apply( + out, basic_string_view(buffer.data(), to_unsigned(integral_size))); + return detail::copy_str_noinline(buffer.data() + integral_size, + buffer.end(), out); +} + +template > +FMT_CONSTEXPR20 auto do_write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + auto significand = f.significand; + int significand_size = get_significand_size(f); + const Char zero = static_cast('0'); + auto sign = fspecs.sign; + size_t size = to_unsigned(significand_size) + (sign ? 1 : 0); + using iterator = reserve_iterator; + + Char decimal_point = + fspecs.locale ? detail::decimal_point(loc) : static_cast('.'); + + int output_exp = f.exponent + significand_size - 1; + auto use_exp_format = [=]() { + if (fspecs.format == float_format::exp) return true; + if (fspecs.format != float_format::general) return false; + // Use the fixed notation if the exponent is in [exp_lower, exp_upper), + // e.g. 0.0001 instead of 1e-04. Otherwise use the exponent notation. + const int exp_lower = -4, exp_upper = 16; + return output_exp < exp_lower || + output_exp >= (fspecs.precision > 0 ? fspecs.precision : exp_upper); + }; + if (use_exp_format()) { + int num_zeros = 0; + if (fspecs.showpoint) { + num_zeros = fspecs.precision - significand_size; + if (num_zeros < 0) num_zeros = 0; + size += to_unsigned(num_zeros); + } else if (significand_size == 1) { + decimal_point = Char(); + } + auto abs_output_exp = output_exp >= 0 ? output_exp : -output_exp; + int exp_digits = 2; + if (abs_output_exp >= 100) exp_digits = abs_output_exp >= 1000 ? 4 : 3; + + size += to_unsigned((decimal_point ? 1 : 0) + 2 + exp_digits); + char exp_char = fspecs.upper ? 'E' : 'e'; + auto write = [=](iterator it) { + if (sign) *it++ = detail::sign(sign); + // Insert a decimal point after the first digit and add an exponent. + it = write_significand(it, significand, significand_size, 1, + decimal_point); + if (num_zeros > 0) it = detail::fill_n(it, num_zeros, zero); + *it++ = static_cast(exp_char); + return write_exponent(output_exp, it); + }; + return specs.width > 0 ? write_padded(out, specs, size, write) + : base_iterator(out, write(reserve(out, size))); + } + + int exp = f.exponent + significand_size; + if (f.exponent >= 0) { + // 1234e5 -> 123400000[.0+] + size += to_unsigned(f.exponent); + int num_zeros = fspecs.precision - exp; + abort_fuzzing_if(num_zeros > 5000); + if (fspecs.showpoint) { + ++size; + if (num_zeros <= 0 && fspecs.format != float_format::fixed) num_zeros = 1; + if (num_zeros > 0) size += to_unsigned(num_zeros); + } + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(exp)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, + f.exponent, grouping); + if (!fspecs.showpoint) return it; + *it++ = decimal_point; + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } else if (exp > 0) { + // 1234e-2 -> 12.34[0+] + int num_zeros = fspecs.showpoint ? fspecs.precision - significand_size : 0; + size += 1 + to_unsigned(num_zeros > 0 ? num_zeros : 0); + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(significand_size)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, exp, + decimal_point, grouping); + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } + // 1234e-6 -> 0.001234 + int num_zeros = -exp; + if (significand_size == 0 && fspecs.precision >= 0 && + fspecs.precision < num_zeros) { + num_zeros = fspecs.precision; + } + bool pointy = num_zeros != 0 || significand_size != 0 || fspecs.showpoint; + size += 1 + (pointy ? 1 : 0) + to_unsigned(num_zeros); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + *it++ = zero; + if (!pointy) return it; + *it++ = decimal_point; + it = detail::fill_n(it, num_zeros, zero); + return write_significand(it, significand, significand_size); + }); +} + +template class fallback_digit_grouping { + public: + constexpr fallback_digit_grouping(locale_ref, bool) {} + + constexpr Char separator() const { return Char(); } + + constexpr int count_separators(int) const { return 0; } + + template + constexpr Out apply(Out out, basic_string_view) const { + return out; + } +}; + +template +FMT_CONSTEXPR20 auto write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + if (is_constant_evaluated()) { + return do_write_float>(out, f, specs, fspecs, + loc); + } else { + return do_write_float(out, f, specs, fspecs, loc); + } +} + +template constexpr bool isnan(T value) { + return !(value >= value); // std::isnan doesn't support __float128. +} + +template +struct has_isfinite : std::false_type {}; + +template +struct has_isfinite> + : std::true_type {}; + +template ::value&& + has_isfinite::value)> +FMT_CONSTEXPR20 bool isfinite(T value) { + constexpr T inf = T(std::numeric_limits::infinity()); + if (is_constant_evaluated()) + return !detail::isnan(value) && value != inf && value != -inf; + return std::isfinite(value); +} +template ::value)> +FMT_CONSTEXPR bool isfinite(T value) { + T inf = T(std::numeric_limits::infinity()); + // std::isfinite doesn't support __float128. + return !detail::isnan(value) && value != inf && value != -inf; +} + +template ::value)> +FMT_INLINE FMT_CONSTEXPR bool signbit(T value) { + if (is_constant_evaluated()) { +#ifdef __cpp_if_constexpr + if constexpr (std::numeric_limits::is_iec559) { + auto bits = detail::bit_cast(static_cast(value)); + return (bits >> (num_bits() - 1)) != 0; + } +#endif + } + return std::signbit(static_cast(value)); +} + +enum class round_direction { unknown, up, down }; + +// Given the divisor (normally a power of 10), the remainder = v % divisor for +// some number v and the error, returns whether v should be rounded up, down, or +// whether the rounding direction can't be determined due to error. +// error should be less than divisor / 2. +FMT_CONSTEXPR inline round_direction get_round_direction(uint64_t divisor, + uint64_t remainder, + uint64_t error) { + FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. + FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. + FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. + // Round down if (remainder + error) * 2 <= divisor. + if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) + return round_direction::down; + // Round up if (remainder - error) * 2 >= divisor. + if (remainder >= error && + remainder - error >= divisor - (remainder - error)) { + return round_direction::up; + } + return round_direction::unknown; +} + +namespace digits { +enum result { + more, // Generate more digits. + done, // Done generating digits. + error // Digit generation cancelled due to an error. +}; +} + +struct gen_digits_handler { + char* buf; + int size; + int precision; + int exp10; + bool fixed; + + FMT_CONSTEXPR digits::result on_digit(char digit, uint64_t divisor, + uint64_t remainder, uint64_t error, + bool integral) { + FMT_ASSERT(remainder < divisor, ""); + buf[size++] = digit; + if (!integral && error >= remainder) return digits::error; + if (size < precision) return digits::more; + if (!integral) { + // Check if error * 2 < divisor with overflow prevention. + // The check is not needed for the integral part because error = 1 + // and divisor > (1 << 32) there. + if (error >= divisor || error >= divisor - error) return digits::error; + } else { + FMT_ASSERT(error == 1 && divisor > 2, ""); + } + auto dir = get_round_direction(divisor, remainder, error); + if (dir != round_direction::up) + return dir == round_direction::down ? digits::done : digits::error; + ++buf[size - 1]; + for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] > '9') { + buf[0] = '1'; + if (fixed) + buf[size++] = '0'; + else + ++exp10; + } + return digits::done; + } +}; + +inline FMT_CONSTEXPR20 void adjust_precision(int& precision, int exp10) { + // Adjust fixed precision by exponent because it is relative to decimal + // point. + if (exp10 > 0 && precision > max_value() - exp10) + FMT_THROW(format_error("number is too big")); + precision += exp10; +} + +// Generates output using the Grisu digit-gen algorithm. +// error: the size of the region (lower, upper) outside of which numbers +// definitely do not round to value (Delta in Grisu3). +FMT_INLINE FMT_CONSTEXPR20 auto grisu_gen_digits(fp value, uint64_t error, + int& exp, + gen_digits_handler& handler) + -> digits::result { + const fp one(1ULL << -value.e, value.e); + // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be + // zero because it contains a product of two 64-bit numbers with MSB set (due + // to normalization) - 1, shifted right by at most 60 bits. + auto integral = static_cast(value.f >> -one.e); + FMT_ASSERT(integral != 0, ""); + FMT_ASSERT(integral == value.f >> -one.e, ""); + // The fractional part of scaled value (p2 in Grisu) c = value % one. + uint64_t fractional = value.f & (one.f - 1); + exp = count_digits(integral); // kappa in Grisu. + // Non-fixed formats require at least one digit and no precision adjustment. + if (handler.fixed) { + adjust_precision(handler.precision, exp + handler.exp10); + // Check if precision is satisfied just by leading zeros, e.g. + // format("{:.2f}", 0.001) gives "0.00" without generating any digits. + if (handler.precision <= 0) { + if (handler.precision < 0) return digits::done; + // Divide by 10 to prevent overflow. + uint64_t divisor = data::power_of_10_64[exp - 1] << -one.e; + auto dir = get_round_direction(divisor, value.f / 10, error * 10); + if (dir == round_direction::unknown) return digits::error; + handler.buf[handler.size++] = dir == round_direction::up ? '1' : '0'; + return digits::done; + } + } + // Generate digits for the integral part. This can produce up to 10 digits. + do { + uint32_t digit = 0; + auto divmod_integral = [&](uint32_t divisor) { + digit = integral / divisor; + integral %= divisor; + }; + // This optimization by Milo Yip reduces the number of integer divisions by + // one per iteration. + switch (exp) { + case 10: + divmod_integral(1000000000); + break; + case 9: + divmod_integral(100000000); + break; + case 8: + divmod_integral(10000000); + break; + case 7: + divmod_integral(1000000); + break; + case 6: + divmod_integral(100000); + break; + case 5: + divmod_integral(10000); + break; + case 4: + divmod_integral(1000); + break; + case 3: + divmod_integral(100); + break; + case 2: + divmod_integral(10); + break; + case 1: + digit = integral; + integral = 0; + break; + default: + FMT_ASSERT(false, "invalid number of digits"); + } + --exp; + auto remainder = (static_cast(integral) << -one.e) + fractional; + auto result = handler.on_digit(static_cast('0' + digit), + data::power_of_10_64[exp] << -one.e, + remainder, error, true); + if (result != digits::more) return result; + } while (exp > 0); + // Generate digits for the fractional part. + for (;;) { + fractional *= 10; + error *= 10; + char digit = static_cast('0' + (fractional >> -one.e)); + fractional &= one.f - 1; + --exp; + auto result = handler.on_digit(digit, one.f, fractional, error, false); + if (result != digits::more) return result; + } +} + +class bigint { + private: + // A bigint is stored as an array of bigits (big digits), with bigit at index + // 0 being the least significant one. + using bigit = uint32_t; + using double_bigit = uint64_t; + enum { bigits_capacity = 32 }; + basic_memory_buffer bigits_; + int exp_; + + FMT_CONSTEXPR20 bigit operator[](int index) const { + return bigits_[to_unsigned(index)]; + } + FMT_CONSTEXPR20 bigit& operator[](int index) { + return bigits_[to_unsigned(index)]; + } + + static constexpr const int bigit_bits = num_bits(); + + friend struct formatter; + + FMT_CONSTEXPR20 void subtract_bigits(int index, bigit other, bigit& borrow) { + auto result = static_cast((*this)[index]) - other - borrow; + (*this)[index] = static_cast(result); + borrow = static_cast(result >> (bigit_bits * 2 - 1)); + } + + FMT_CONSTEXPR20 void remove_leading_zeros() { + int num_bigits = static_cast(bigits_.size()) - 1; + while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits; + bigits_.resize(to_unsigned(num_bigits + 1)); + } + + // Computes *this -= other assuming aligned bigints and *this >= other. + FMT_CONSTEXPR20 void subtract_aligned(const bigint& other) { + FMT_ASSERT(other.exp_ >= exp_, "unaligned bigints"); + FMT_ASSERT(compare(*this, other) >= 0, ""); + bigit borrow = 0; + int i = other.exp_ - exp_; + for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) + subtract_bigits(i, other.bigits_[j], borrow); + while (borrow > 0) subtract_bigits(i, 0, borrow); + remove_leading_zeros(); + } + + FMT_CONSTEXPR20 void multiply(uint32_t value) { + const double_bigit wide_value = value; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * wide_value + carry; + bigits_[i] = static_cast(result); + carry = static_cast(result >> bigit_bits); + } + if (carry != 0) bigits_.push_back(carry); + } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void multiply(UInt value) { + using half_uint = + conditional_t::value, uint64_t, uint32_t>; + const int shift = num_bits() - bigit_bits; + const UInt lower = static_cast(value); + const UInt upper = value >> num_bits(); + UInt carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + UInt result = lower * bigits_[i] + static_cast(carry); + carry = (upper * bigits_[i] << shift) + (result >> bigit_bits) + + (carry >> bigit_bits); + bigits_[i] = static_cast(result); + } + while (carry != 0) { + bigits_.push_back(static_cast(carry)); + carry >>= bigit_bits; + } + } + + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void assign(UInt n) { + size_t num_bigits = 0; + do { + bigits_[num_bigits++] = static_cast(n); + n >>= bigit_bits; + } while (n != 0); + bigits_.resize(num_bigits); + exp_ = 0; + } + + public: + FMT_CONSTEXPR20 bigint() : exp_(0) {} + explicit bigint(uint64_t n) { assign(n); } + + bigint(const bigint&) = delete; + void operator=(const bigint&) = delete; + + FMT_CONSTEXPR20 void assign(const bigint& other) { + auto size = other.bigits_.size(); + bigits_.resize(size); + auto data = other.bigits_.data(); + std::copy(data, data + size, make_checked(bigits_.data(), size)); + exp_ = other.exp_; + } + + template FMT_CONSTEXPR20 void operator=(Int n) { + FMT_ASSERT(n > 0, ""); + assign(uint64_or_128_t(n)); + } + + FMT_CONSTEXPR20 int num_bigits() const { + return static_cast(bigits_.size()) + exp_; + } + + FMT_NOINLINE FMT_CONSTEXPR20 bigint& operator<<=(int shift) { + FMT_ASSERT(shift >= 0, ""); + exp_ += shift / bigit_bits; + shift %= bigit_bits; + if (shift == 0) return *this; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + bigit c = bigits_[i] >> (bigit_bits - shift); + bigits_[i] = (bigits_[i] << shift) + carry; + carry = c; + } + if (carry != 0) bigits_.push_back(carry); + return *this; + } + + template FMT_CONSTEXPR20 bigint& operator*=(Int value) { + FMT_ASSERT(value > 0, ""); + multiply(uint32_or_64_or_128_t(value)); + return *this; + } + + friend FMT_CONSTEXPR20 int compare(const bigint& lhs, const bigint& rhs) { + int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits(); + if (num_lhs_bigits != num_rhs_bigits) + return num_lhs_bigits > num_rhs_bigits ? 1 : -1; + int i = static_cast(lhs.bigits_.size()) - 1; + int j = static_cast(rhs.bigits_.size()) - 1; + int end = i - j; + if (end < 0) end = 0; + for (; i >= end; --i, --j) { + bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j]; + if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1; + } + if (i != j) return i > j ? 1 : -1; + return 0; + } + + // Returns compare(lhs1 + lhs2, rhs). + friend FMT_CONSTEXPR20 int add_compare(const bigint& lhs1, const bigint& lhs2, + const bigint& rhs) { + auto minimum = [](int a, int b) { return a < b ? a : b; }; + auto maximum = [](int a, int b) { return a > b ? a : b; }; + int max_lhs_bigits = maximum(lhs1.num_bigits(), lhs2.num_bigits()); + int num_rhs_bigits = rhs.num_bigits(); + if (max_lhs_bigits + 1 < num_rhs_bigits) return -1; + if (max_lhs_bigits > num_rhs_bigits) return 1; + auto get_bigit = [](const bigint& n, int i) -> bigit { + return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0; + }; + double_bigit borrow = 0; + int min_exp = minimum(minimum(lhs1.exp_, lhs2.exp_), rhs.exp_); + for (int i = num_rhs_bigits - 1; i >= min_exp; --i) { + double_bigit sum = + static_cast(get_bigit(lhs1, i)) + get_bigit(lhs2, i); + bigit rhs_bigit = get_bigit(rhs, i); + if (sum > rhs_bigit + borrow) return 1; + borrow = rhs_bigit + borrow - sum; + if (borrow > 1) return -1; + borrow <<= bigit_bits; + } + return borrow != 0 ? -1 : 0; + } + + // Assigns pow(10, exp) to this bigint. + FMT_CONSTEXPR20 void assign_pow10(int exp) { + FMT_ASSERT(exp >= 0, ""); + if (exp == 0) return *this = 1; + // Find the top bit. + int bitmask = 1; + while (exp >= bitmask) bitmask <<= 1; + bitmask >>= 1; + // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by + // repeated squaring and multiplication. + *this = 5; + bitmask >>= 1; + while (bitmask != 0) { + square(); + if ((exp & bitmask) != 0) *this *= 5; + bitmask >>= 1; + } + *this <<= exp; // Multiply by pow(2, exp) by shifting. + } + + FMT_CONSTEXPR20 void square() { + int num_bigits = static_cast(bigits_.size()); + int num_result_bigits = 2 * num_bigits; + basic_memory_buffer n(std::move(bigits_)); + bigits_.resize(to_unsigned(num_result_bigits)); + auto sum = uint128_t(); + for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) { + // Compute bigit at position bigit_index of the result by adding + // cross-product terms n[i] * n[j] such that i + j == bigit_index. + for (int i = 0, j = bigit_index; j >= 0; ++i, --j) { + // Most terms are multiplied twice which can be optimized in the future. + sum += static_cast(n[i]) * n[j]; + } + (*this)[bigit_index] = static_cast(sum); + sum >>= num_bits(); // Compute the carry. + } + // Do the same for the top half. + for (int bigit_index = num_bigits; bigit_index < num_result_bigits; + ++bigit_index) { + for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;) + sum += static_cast(n[i++]) * n[j--]; + (*this)[bigit_index] = static_cast(sum); + sum >>= num_bits(); + } + remove_leading_zeros(); + exp_ *= 2; + } + + // If this bigint has a bigger exponent than other, adds trailing zero to make + // exponents equal. This simplifies some operations such as subtraction. + FMT_CONSTEXPR20 void align(const bigint& other) { + int exp_difference = exp_ - other.exp_; + if (exp_difference <= 0) return; + int num_bigits = static_cast(bigits_.size()); + bigits_.resize(to_unsigned(num_bigits + exp_difference)); + for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) + bigits_[j] = bigits_[i]; + std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); + exp_ -= exp_difference; + } + + // Divides this bignum by divisor, assigning the remainder to this and + // returning the quotient. + FMT_CONSTEXPR20 int divmod_assign(const bigint& divisor) { + FMT_ASSERT(this != &divisor, ""); + if (compare(*this, divisor) < 0) return 0; + FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, ""); + align(divisor); + int quotient = 0; + do { + subtract_aligned(divisor); + ++quotient; + } while (compare(*this, divisor) >= 0); + return quotient; + } +}; + +// format_dragon flags. +enum dragon { + predecessor_closer = 1, + fixup = 2, // Run fixup to correct exp10 which can be off by one. + fixed = 4, +}; + +// Formats a floating-point number using a variation of the Fixed-Precision +// Positive Floating-Point Printout ((FPP)^2) algorithm by Steele & White: +// https://fmt.dev/papers/p372-steele.pdf. +FMT_CONSTEXPR20 inline void format_dragon(basic_fp value, + unsigned flags, int num_digits, + buffer& buf, int& exp10) { + bigint numerator; // 2 * R in (FPP)^2. + bigint denominator; // 2 * S in (FPP)^2. + // lower and upper are differences between value and corresponding boundaries. + bigint lower; // (M^- in (FPP)^2). + bigint upper_store; // upper's value if different from lower. + bigint* upper = nullptr; // (M^+ in (FPP)^2). + // Shift numerator and denominator by an extra bit or two (if lower boundary + // is closer) to make lower and upper integers. This eliminates multiplication + // by 2 during later computations. + bool is_predecessor_closer = (flags & dragon::predecessor_closer) != 0; + int shift = is_predecessor_closer ? 2 : 1; + if (value.e >= 0) { + numerator = value.f; + numerator <<= value.e + shift; + lower = 1; + lower <<= value.e; + if (is_predecessor_closer) { + upper_store = 1; + upper_store <<= value.e + 1; + upper = &upper_store; + } + denominator.assign_pow10(exp10); + denominator <<= shift; + } else if (exp10 < 0) { + numerator.assign_pow10(-exp10); + lower.assign(numerator); + if (is_predecessor_closer) { + upper_store.assign(numerator); + upper_store <<= 1; + upper = &upper_store; + } + numerator *= value.f; + numerator <<= shift; + denominator = 1; + denominator <<= shift - value.e; + } else { + numerator = value.f; + numerator <<= shift; + denominator.assign_pow10(exp10); + denominator <<= shift - value.e; + lower = 1; + if (is_predecessor_closer) { + upper_store = 1ULL << 1; + upper = &upper_store; + } + } + int even = static_cast((value.f & 1) == 0); + if (!upper) upper = &lower; + if ((flags & dragon::fixup) != 0) { + if (add_compare(numerator, *upper, denominator) + even <= 0) { + --exp10; + numerator *= 10; + if (num_digits < 0) { + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + if ((flags & dragon::fixed) != 0) adjust_precision(num_digits, exp10 + 1); + } + // Invariant: value == (numerator / denominator) * pow(10, exp10). + if (num_digits < 0) { + // Generate the shortest representation. + num_digits = 0; + char* data = buf.data(); + for (;;) { + int digit = numerator.divmod_assign(denominator); + bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. + // numerator + upper >[=] pow10: + bool high = add_compare(numerator, *upper, denominator) + even > 0; + data[num_digits++] = static_cast('0' + digit); + if (low || high) { + if (!low) { + ++data[num_digits - 1]; + } else if (high) { + int result = add_compare(numerator, numerator, denominator); + // Round half to even. + if (result > 0 || (result == 0 && (digit % 2) != 0)) + ++data[num_digits - 1]; + } + buf.try_resize(to_unsigned(num_digits)); + exp10 -= num_digits - 1; + return; + } + numerator *= 10; + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + // Generate the given number of digits. + exp10 -= num_digits - 1; + if (num_digits == 0) { + denominator *= 10; + auto digit = add_compare(numerator, numerator, denominator) > 0 ? '1' : '0'; + buf.push_back(digit); + return; + } + buf.try_resize(to_unsigned(num_digits)); + for (int i = 0; i < num_digits - 1; ++i) { + int digit = numerator.divmod_assign(denominator); + buf[i] = static_cast('0' + digit); + numerator *= 10; + } + int digit = numerator.divmod_assign(denominator); + auto result = add_compare(numerator, numerator, denominator); + if (result > 0 || (result == 0 && (digit % 2) != 0)) { + if (digit == 9) { + const auto overflow = '0' + 10; + buf[num_digits - 1] = overflow; + // Propagate the carry. + for (int i = num_digits - 1; i > 0 && buf[i] == overflow; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] == overflow) { + buf[0] = '1'; + ++exp10; + } + return; + } + ++digit; + } + buf[num_digits - 1] = static_cast('0' + digit); +} + +template +FMT_CONSTEXPR20 auto format_float(Float value, int precision, float_specs specs, + buffer& buf) -> int { + // float is passed as double to reduce the number of instantiations. + static_assert(!std::is_same::value, ""); + FMT_ASSERT(value >= 0, "value is negative"); + auto converted_value = convert_float(value); + + const bool fixed = specs.format == float_format::fixed; + if (value <= 0) { // <= instead of == to silence a warning. + if (precision <= 0 || !fixed) { + buf.push_back('0'); + return 0; + } + buf.try_resize(to_unsigned(precision)); + fill_n(buf.data(), precision, '0'); + return -precision; + } + + int exp = 0; + bool use_dragon = true; + unsigned dragon_flags = 0; + if (!is_fast_float()) { + const auto inv_log2_10 = 0.3010299956639812; // 1 / log2(10) + using info = dragonbox::float_info; + const auto f = basic_fp(converted_value); + // Compute exp, an approximate power of 10, such that + // 10^(exp - 1) <= value < 10^exp or 10^exp <= value < 10^(exp + 1). + // This is based on log10(value) == log2(value) / log2(10) and approximation + // of log2(value) by e + num_fraction_bits idea from double-conversion. + exp = static_cast( + std::ceil((f.e + count_digits<1>(f.f) - 1) * inv_log2_10 - 1e-10)); + dragon_flags = dragon::fixup; + } else if (!is_constant_evaluated() && precision < 0) { + // Use Dragonbox for the shortest format. + if (specs.binary32) { + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } else { + // Use Grisu + Dragon4 for the given precision: + // https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf. + const int min_exp = -60; // alpha in Grisu. + int cached_exp10 = 0; // K in Grisu. + fp normalized = normalize(fp(converted_value)); + const auto cached_pow = get_cached_power( + min_exp - (normalized.e + fp::num_significand_bits), cached_exp10); + normalized = normalized * cached_pow; + gen_digits_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; + if (grisu_gen_digits(normalized, 1, exp, handler) != digits::error && + !is_constant_evaluated()) { + exp += handler.exp10; + buf.try_resize(to_unsigned(handler.size)); + use_dragon = false; + } else { + exp += handler.size - cached_exp10 - 1; + precision = handler.precision; + } + } + if (use_dragon) { + auto f = basic_fp(); + bool is_predecessor_closer = specs.binary32 + ? f.assign(static_cast(value)) + : f.assign(converted_value); + if (is_predecessor_closer) dragon_flags |= dragon::predecessor_closer; + if (fixed) dragon_flags |= dragon::fixed; + // Limit precision to the maximum possible number of significant digits in + // an IEEE754 double because we don't need to generate zeros. + const int max_double_digits = 767; + if (precision > max_double_digits) precision = max_double_digits; + format_dragon(f, dragon_flags, precision, buf, exp); + } + if (!fixed && !specs.showpoint) { + // Remove trailing zeros. + auto num_digits = buf.size(); + while (num_digits > 0 && buf[num_digits - 1] == '0') { + --num_digits; + ++exp; + } + buf.try_resize(num_digits); + } + return exp; +} + +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value, + basic_format_specs specs, locale_ref loc = {}) + -> OutputIt { + if (const_check(!is_supported_floating_point(value))) return out; + float_specs fspecs = parse_float_type_spec(specs); + fspecs.sign = specs.sign; + if (detail::signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } else if (fspecs.sign == sign::minus) { + fspecs.sign = sign::none; + } + + if (!detail::isfinite(value)) + return write_nonfinite(out, detail::isnan(value), specs, fspecs); + + if (specs.align == align::numeric && fspecs.sign) { + auto it = reserve(out, 1); + *it++ = detail::sign(fspecs.sign); + out = base_iterator(out, it); + fspecs.sign = sign::none; + if (specs.width != 0) --specs.width; + } + + memory_buffer buffer; + if (fspecs.format == float_format::hex) { + if (fspecs.sign) buffer.push_back(detail::sign(fspecs.sign)); + snprintf_float(convert_float(value), specs.precision, fspecs, buffer); + return write_bytes(out, {buffer.data(), buffer.size()}, + specs); + } + int precision = specs.precision >= 0 || specs.type == presentation_type::none + ? specs.precision + : 6; + if (fspecs.format == float_format::exp) { + if (precision == max_value()) + throw_format_error("number is too big"); + else + ++precision; + } else if (fspecs.format != float_format::fixed && precision == 0) { + precision = 1; + } + if (const_check(std::is_same())) fspecs.binary32 = true; + int exp = format_float(convert_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + auto f = big_decimal_fp{buffer.data(), static_cast(buffer.size()), exp}; + return write_float(out, f, specs, fspecs, loc); +} + +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value) -> OutputIt { + if (is_constant_evaluated()) + return write(out, value, basic_format_specs()); + if (const_check(!is_supported_floating_point(value))) return out; + + auto fspecs = float_specs(); + if (detail::signbit(value)) { + fspecs.sign = sign::minus; + value = -value; + } + + constexpr auto specs = basic_format_specs(); + using floaty = conditional_t::value, double, T>; + using uint = typename dragonbox::float_info::carrier_uint; + uint mask = exponent_mask(); + if ((bit_cast(value) & mask) == mask) + return write_nonfinite(out, std::isnan(value), specs, fspecs); + + auto dec = dragonbox::to_decimal(static_cast(value)); + return write_float(out, dec, specs, fspecs, {}); +} + +template ::value && + !is_fast_float::value)> +inline auto write(OutputIt out, T value) -> OutputIt { + return write(out, value, basic_format_specs()); +} + +template +auto write(OutputIt out, monostate, basic_format_specs = {}, + locale_ref = {}) -> OutputIt { + FMT_ASSERT(false, ""); + return out; +} + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view value) + -> OutputIt { + auto it = reserve(out, value.size()); + it = copy_str_noinline(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template ::value)> +constexpr auto write(OutputIt out, const T& value) -> OutputIt { + return write(out, to_string_view(value)); +} + +// FMT_ENABLE_IF() condition separated to workaround an MSVC bug. +template < + typename Char, typename OutputIt, typename T, + bool check = + std::is_enum::value && !std::is_same::value && + mapped_type_constant>::value != + type::custom_type, + FMT_ENABLE_IF(check)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + return write(out, static_cast>(value)); +} + +template ::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value, + const basic_format_specs& specs = {}, + locale_ref = {}) -> OutputIt { + return specs.type != presentation_type::none && + specs.type != presentation_type::string + ? write(out, value ? 1 : 0, specs, {}) + : write_bytes(out, value ? "true" : "false", specs); +} + +template +FMT_CONSTEXPR auto write(OutputIt out, Char value) -> OutputIt { + auto it = reserve(out, 1); + *it++ = value; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR_CHAR_TRAITS auto write(OutputIt out, const Char* value) + -> OutputIt { + if (!value) { + throw_format_error("string pointer is null"); + } else { + out = write(out, basic_string_view(value)); + } + return out; +} + +template ::value)> +auto write(OutputIt out, const T* value, + const basic_format_specs& specs = {}, locale_ref = {}) + -> OutputIt { + check_pointer_type_spec(specs.type, error_handler()); + return write_ptr(out, bit_cast(value), &specs); +} + +// A write overload that handles implicit conversions. +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) -> enable_if_t< + std::is_class::value && !is_string::value && + !is_floating_point::value && !std::is_same::value && + !std::is_same().map(value))>::value, + OutputIt> { + return write(out, arg_mapper().map(value)); +} + +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) + -> enable_if_t::value == type::custom_type, + OutputIt> { + using formatter_type = + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>; + auto ctx = Context(out, {}, {}); + return formatter_type().format(value, ctx); +} + +// An argument visitor that formats the argument and writes it via the output +// iterator. It's a class and not a generic lambda for compatibility with C++11. +template struct default_arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + basic_format_args args; + locale_ref loc; + + template auto operator()(T value) -> iterator { + return write(out, value); + } + auto operator()(typename basic_format_arg::handle h) -> iterator { + basic_format_parse_context parse_ctx({}); + context format_ctx(out, args, loc); + h.format(parse_ctx, format_ctx); + return format_ctx.out(); + } +}; + +template struct arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + const basic_format_specs& specs; + locale_ref locale; + + template + FMT_CONSTEXPR FMT_INLINE auto operator()(T value) -> iterator { + return detail::write(out, value, specs, locale); + } + auto operator()(typename basic_format_arg::handle) -> iterator { + // User-defined types are handled separately because they require access + // to the parse context. + return out; + } +}; + +template struct custom_formatter { + basic_format_parse_context& parse_ctx; + buffer_context& ctx; + + void operator()( + typename basic_format_arg>::handle h) const { + h.format(parse_ctx, ctx); + } + template void operator()(T) const {} +}; + +template +using is_integer = + bool_constant::value && !std::is_same::value && + !std::is_same::value && + !std::is_same::value>; + +template class width_checker { + public: + explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { + if (is_negative(value)) handler_.on_error("negative width"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { + handler_.on_error("width is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template class precision_checker { + public: + explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { + if (is_negative(value)) handler_.on_error("negative precision"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { + handler_.on_error("precision is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template

    >(P 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 literal 0 HcmV?d00001 diff --git a/Thirdparty/opencv2/lib/opencv_dnn480d.lib b/Thirdparty/opencv2/lib/opencv_dnn480d.lib new file mode 100644 index 0000000000000000000000000000000000000000..526e61f1b1ec1b144d56ee4e95cb597968025ee7 GIT binary patch literal 754336 zcmeEv4V)xJeRhQqx_gEYB!nOmLdc0o2p-3AA`)hHZ}-@P+vV8ZJ5EHFx!t+lf!Ud5 zcJ{bC5s?r=kPw0di4uZ{1Q8Jt5fKpyK}1wUBuEqqK_rL-kr$B=eV?l8ubQsz`d821 z9)9@yJr1}1|E{M#y1TmjPY$oN#;1-bylHRse}8_E`tRUhi~avta`3W44>^SY#( zJKoEj!$+BO#0QvDdYBd8a1Ha894K+nRm=mNr}mck!DY+=ykmC~aDKFu2|RNHa{zDT zZUN_+#rQYy!)pb+k;Cx!!|>k+NIZQFa{zA`I)L-v`$#->Is9A>+m{MBPwxjg;J>dB z@P_w+JY=7RUydK$DBz8*W*qM8kC0e&IdcK;tYL}w+{HY=-E~Ka-@k~tK(TqYK;ee( zFo8Ed!3uykcZ-k3_(dM~?Jw~aFBeIih5Q7dch>&Q`_h#X zJKn@RfdlY+0CV4VvyY|tUCN646a>7hZ)Xzle>HIYki^@N2T(kELcpCpj|sG1U@ph0 zw@Xap?;OoNCF*-Imt$s=MEyqm8)!Zxaq1q>16u1O8pF&53O`yc@nD@5I9@tj;ukNl z0#Mv@oy6YY4ac6(O8iNK6*>OsJc)fSL|(w|mq@(!Kvo3Y@9rc}bnj#W-tnvmcsE@n z;GTzk1op!(aQ2}RXWqhGjs=sUBaBl4i#{3nPMEy_t0MeZx#9}P;@p56t29C34C~eR^T{d2Z7?oeVM@AWvs}t z=qQOl-H#OoZpH7d%su%G0q>L7G7jfS^aY@B)u963y&IXpXYXO2z)|=GZaYijmNN4= zR&OtH%ogSW&XZS5`~c$*;N6P21y8t>FUw%&Fo<+>#`0|v*JvZRrH?ZO#g1a1l{GdSL+TEDIH5al1P~3cz zK;Z-DF@ZzYvI0VDT;zOVIB*7Q+_Dl5-_i!!A&G%PRuK z;fI*S3jD5Mg~Rufc(v&0+GZUU&&8&Rjv%=mZ? zzo^AmG5&FUecr%z6A3iT~_nj==r+1s*?1;;~!M?@+(NVTn8Yn8$I;of2O=f_Vb>;urYR?h9?@WPW>jB2$-isP@?6;l7 z8!%S@-r3jsScKn2%-#73iPs#@T%fq<5drUZ_z?h4ZwJ1BxHxYAxx^i4PmV93ojC45 zeL23kO5!UU(a(T;ArBPaiSbq7YWxDHFB0%R1O9NdP(O}S@0FNc&peLSg96UA7&|#W z`l5ih=w`;@d<=i%xE6m0yw{fn3Wsh&f7--~@4i;z;ComRD17Wv0cX{AjKh6$i^No! zxj=FDY>D<+=-0q@2S_lC0UW=zmk;FdTUWEfSFxtx_~z3RU%{G!#}>YmPlmlGtl+Rs;&)!dS*}-Q@!ADHk&dhF`|K89P9aQq48 zMUFp3eL42oRbtUOtN?g_f%XyD0l(Zgc*5}s=yH5}KZ#G=kADN#-zDJu;!(!o-j1~n z;QV4h;^#Lo2k_QE?Bg)}9>xkEN1T9r_jd$}ySFUlDPPJ<_MszE(R{z)5mrA1>SeK#NV%C4#)fM6DT&GX9BOi zj}$_~Q7~J_63)ozFPjD^C}2E_jJatj90Lg{cf5@Ax~%BhLyrFFn9Gymz4A0M4CbbZ58-?SaQ@~Y zAItEI@#{5c2Z2NJdnj`!FrIS!$59gFmob-PJ;p1*yAJ(~<74Xt+;4AU0&j0Im*aTw z9Ps`HvI3~{zrfZ>_&diV*GZhTAN~!Dohjg5do2_A=*!Fl+;^NP@yO1Q2Tr)v$FBI@ z6*4#v<+$bwi9WQczybI@fH@~VC*Z#CamL}CxK`pF7$X7q1&o6nKe<7`nL)n;+)E)3 zIL)&p8c$+8eUiDqI7i~=I1V@uU@QmRo6Z(+9$12Z1K$9T0I&BsABeFRb-y0t3*cV6 zTEO`@#u)+hzmM<6yfK6jGD|J=x2z&Z6< z0rwx##(;Awa^je|PQYV`NdWzW?Z=$iuL-yxa2ba)yT3#W^A_N32RV-4+9KebgL(q) z6?+Rf=fDQXUqK%5ey=RC)5XjKoNp8a+)sg*fO9`$;`lo91-zc?ePG`1*^xPew+Ofw z+|D?h!M!C`orCqnIn4b5>L!4i|6qIOeDWCq_haBU;Cyme;)a`<19)$|Qer=>lK|%i z)DUp5Mc)OSPi&F6{vovcLy#Gjc*8Yl=WCejpigkzagoFh*E3fDT;E}5=1mPqOu`S~ zdV5KHaS?Ml+%qJc@4(J?m{+?*VhUp>;J$7*iM!#0V~^7%Ui%nx0dLDKKG2u8piiy% zfW$WuKS%%1eSio3Co%6I!5fZC+XC)Dg9$u1!(5Id(YFN-z%TmX2c{(c5xfJOf4fA$ z{p1de!?_D>CNPR$)aFpw<#_YG0?wCEbHM%NE}Z@p~Zi-U2y+J@Jd$e-Cpl z;C|*20q4>4nZS3SXAa;UeVN2jFEbBt_vw@P@;=Pv_!G2=Kmor6=Dqt7A4~DOlsO-{ zU%h6r?F2Y=^mC3=&J%F|4>jO;+A^I7|zk!P!yFKCK zDEuD9yiI6#j?*xv0WQ|;0(YU-9DjiEk7HLH1H6ro`#1u>M=+;)mw0On zAATNv`8e=f0OQ|r1I+!4yClA`6LUHKVn2z)&top&U38a^z3{sibB;rQ1l+$rU%*-W zb0#r?-wDiRyGT4c!(71W#hd}S??qn)oSsK~l<`|;?)Ro79=#jaU4g>W5?@5SaTK7( z;oT(Qos9MpKzp5x_WBUk8-RQDvjWbC&|Vx@pltweuahPI2)qTH^#=&J7sC(WR4$e{ z>1E~s?u(eG1h&U7=BaEy1K{rayu`gLa9sk}7k!cA^|uLle|Z)YIO|c|-*}X{!)qlTx*g*N zaBP4@_;2*LD{k_!3x0ROxfW^xxSz+E2{`|U@rdJ<=LEb8#tx2?UJ`KnUt%2Y`3(UF zbCW>d-OK^p|9sBJ5Pre6BX1XQ&;L2(QJW(dNvuHq0r$VqUpOAWP{2866XS6I4)pM0-mzwx(Y(Z+!LcZeTwR$t}A#jlHVz5^uw8@>Q%bSDA#!aCz{Mm9w3jX^riP6hp=W^!$=xaXq$M62kISqUU+z%cq;A{k+ z1;FQxSVL_Oo(X^t+k+3A(e8lzLDUX#HhsVc!!Kjr4h4zdnPMK`{4?SO+^bI#a4vt8 zN%Y~jk9m7uF7diomz!$~XGh z9lsc_{$Z8G#n&bJpOThia38?1@ z%=!Eo61RPaIe>TYNfJwt2jDKfRpM(0GM8g1`WnZ<;3MFjkMW%2y%^5{=hJ9^z`YK6 z01mD>3*3aZ2fPE&#vFfkrGWD(j30n|9ohkKJ_Sy3+=#dUZ~qs3Kxh9x=1#&c$A3H_ zF}WT74e)bd!23Aj=eX`h0q1D=1>6fTegMu=N&Fkedyd_& z^8udhz9aKCHzYRQ%{;(4{Q&{@vS%5GbNXQt@4SLJfaju)0t~jm78+za`8@!va1T!yg)@Lo46u?PAK;JkFWfcv>ia6JNZ z*LYpKSm7%kpGW&#JM%v1#sVo zIswiJXG**s`~=*e>>%+x`U>Fu4{8FqpItBD{14_}j%RNW@YbBk1V$fb9^meOkHlA2 zF_&Y1aGK+d7YTTOg+3{8Ab#=p1CS@jSKyoD&tCGe4!`S|_t#i+aGZm_3AoG7l=#~1 z=r6z_Px?SUhaAPczr9G}{AZa5xQ7l&d>y|WZ@$6D&iKU`asm3Jz*77!WzNZ{Dd4{U zZ~^D!6Yy`KcDsQ4zmG79rTB&X*-r_$|9m#%aL&d!%kh_&3wXc#6q7g%zu?v!+6Qny zaHW7Vhj!v2m3#OGvNzx?mbt)z43m=;d~kWL0}la!^}H;LgKA= zFb{BdI!oeCxX}m3q6YfoJJDuUI)uLf_;#@I?XdZ*F1|i2rX;#~S(=$9E79M-6#!Ox-5nec~=Au@8Rt z!8K#F7vO#x+yIe!%H38gzIbFcH@(Cs}fM3-AkFWPpz%TH#vjA}L=_8o;)V0ie2DNzRappaMcEWW; z??;&P{&xrFeSbakzT@KhJ2?L0eaw6KQ2ZNyUo1oBNmlsnQRY2~KK0Nh=6!cp;2P%r z*Okosf2h|t4`AN^xXgRD#k^lU&kF1;R`{LsS>ZJ}hkXsk&7Zu?ycaHD-b*;Qb?!kd zxHi5W>h{E;`1dmA{l^wo_E_huFZqZ=A;p+c)6*G3Gr2|KER%75-o; zE9`nTVm^lzc0zpLdWLylU&{)=wHx#PdlB=#eK_-ecocl$n!Ag*cSX(r?{4PZkG$@G z1+m`3ya)S$2cUZ*^B#SWdEYw;wL!c5WQrAj?@GjRAS>W{XJMCD;19h2He!DMK~^Z< z%)I9oBiBnlO6+ED@9V_hE z3*3);giz6^NpfE-Zx$TETA>+WV8-Yd9Qb13dxa=c}| z#9_GK$}x?5m>h@U-VVoGuah{u&5A(blg|khPu-3QEW3#nIo^zW5*&ZAhr|&$E^t47 zasTT;ueURSJ0HP)kw+l&qQv3{S%KqVaDrng+7~Fgun#z& zm2f|PH~JCggj+UAeC8SSFVyWow7bB*_}!N|w_YdUUXM8eaBfBa?v{BM&@z+7pg5&U3uxGKpPq?~?;tMg?|W!HOKkVTp~` zvLeSC>@(sx4Z1+#{~nO|IsO|czUwT3!V8x&j^Y{UGl28p1rpyx{{@PZX9~EV-W7Ao zuGsI0eGwd|Un#N26S#Md{{4^W6C9-zBzo^+1&)_1aSWu>jl7h4~`4q_alCM@#N)d$ z57$$?|GbP9nveU~8Na}($bqA^QKF5po?{MU5yz&s#OBqkz)?S6pt$Q@OkjVsGf-H+ zSOROC0>>E>67N2o6*$h^RpLGOvI56hs1wJ@Pf47ExlCXO`~vUYN#gII%Q1So#QV-+ z1&&KE5pZ5?;5-TVf2fbZL->7&6;DFna^Hr=zIKFnP zK;h;(<8ZO3PvQyug0G{u3OMJrnZSE71`9lm-=|rzx=x_*Q?wPwWlX@WVhty-Cw`IR zx{C!0Uj;vb;>~IO@oU<98+`23}%Cj+N*)fO|aFTR`FRTO|Hzh!r?K1fFtSF(BZs z$6Ah~a=k$DxLsi%ZF}Dp0>z1|7)Rm%T_fP0i2MW&$M4~+xE8er3SU88f#TEw0)_v5 zmT?qM!5F}?-AxkX&#@v<_z{i+&d(+U+}jSo+tkw-C?16N-w@rJ!vfn(o8 zCH8|q0dR9a;Bg$|cmjQt<3GVyj_+MA@%ZyN4*Ui5ISxloKyh#{iS=kNj}vaEZi!Z)63I?=O{j@h?=&+%jMm*aoVm-xxKtibX7Z4%F|Wd)9BFO~S@@mT)=H=+(4|9hZ7ap_tna0uF- zV;S-X3VWdD9Ix9;V$Z`^f#Z*0gJZ9=1&XJl791t?HI5$CpQC)d#F1rI1Pc43z8wE? zfk5%?dozJ!u4F}^@ZA*>->I_#P#n5Ipm5K%OyJ9pumVu*Lwo|y;1}q>S>jB@&e3y+ zMDOLS$gzAvV#P_U$T5J}fWp9K601>jj-KyGoPanuYOhFaL_InFYCnm;K@J=jJ|lta z4-$I|`f+>l={~9ZBTy(9(C66FK;OKoNCfBh7$6wzrQAK?? zCQu8G_g^P*KK`5Iyk!#a0?#Y)y}Do~f1xD$~=o#$-)GB9%Dt>qS{gro zY=2KrPk+yv#Rrvp`g{2g`i*apAenA$(IS{8+KbDUN{a_8?M-7n6BEbGh!l8;<#kb1 zX~$DElWA!UL}JKE6G3{BD8fN(BXjFBvq~OM(Tu_k8cSx?VIUF0taQ#7NH)!aG^L}Ec^s(>LcgK!XA zUu|P%R>|Wjno+oFRviW+u^=l|z>t+eIEW4XQO!R&cxXk^^`p4e^pa*G$sogoj3G(0 zd=TeoX4`ch)oMlIs);Gekx-CR{IDUNOi{!%+-z6c)rsNicw0Z%rwOF#BHFd3MXQ^& zMtiJ0SQgV7{xDM8QkDN6j7@NQ_aqajg)TIdW38M^`A^IhO*-4Em?tgl#^rgvDvil% zN|h6blJWxsv2;3(iG!tCRJj~?)7vu;&D<$ROV#O__T~c{6@5FT zN~CHJ3=GA`ExiFLRI1Ict<-B1WsMN8bu=WI1yLQ1m8^Qx#0_@i1r2MTWjU?@+k?&N zYNI_H7C*h48YR=M#eIfBrr3+imReXQU^uQ zY1?^?*d{C_+dBO7yz(owstiGE!#{U8D@|70ygZb?-^)+8xbVT{*qLE|1KjtDdS!B! z=sk93nM0F%J7)dKL|=UJjaGkoRJp&AEkt)HY;eh90OeIYcVPtUTYBTF%Uw%7coGz& z@kn)Lt0=QtE7uNr93nS+Z9hYMMSsC73uLb@v)x1_l3H0LYNZHY_5p_Z*{i~zKiTGK zMtjxJpM9udmeQ-efl}!pN|NfWFAJ4Ytx=V$dSfRSc~tHFDMMUzs$uQC z(+(&6h} znup8;WlTg}o61w`&eCs&zcF zksKZK$CI>`r#{grnLm=qMxF>F zb}rCJ8|R~?%kVyc{mRw98$eeKuZ+`FGEWyQc&f3JGZJOZAF#{6R&SS+VhJ3>l+hDz zHR9u#?x`ca1X?hmy{6-trF4l@-}0`6vIi^SMg$oNqN-XE*#Q21j<`jlcxeh7HBubYisvB$LRk~fWyl)v>O$IA7Gu4UgaHUz3aA}<9 z-+;kvYbLQ$8{65%7?D{+gOsp>%GIh9G+Rd5(sZSD3ZDQVncB{{Rfyed;hsAi6=A>6 z*y0)wbfuV&)aFceVAMcQ?PxOGoJHsBc*rqR2t71m1HCil@k_I)96k8MEzwR?>{W^F z#}PxDR-iOdo1QJBBgc*^&ugR}FO`Nn)s!782gR?i5JXF*o=$tHtMa@;sz5?lY_ZPL zjRZ=i-cG-`5gyxDlzO~WdP}FK*oxo5g-jtiTE~hn0!yKS>P;h=ZcR*e9f9$IU*|b4 z>vOAJO@9n`r1PLoXYA-`#E@)Mw8UY*6{7>acq+Mf?C3a=1qHMc32jlIOzoJ2&w{w+ zv7=+xVg*MMNBw$7e-GP4$yXFQO-R}Zdv0u+M)UM0xg}tdQvfnB(f%y6FPkuY9CR<6QNgDVAl2uXLnx{K|2L;|>L$U#4?^Nof+xveV(x zY_UT@j;-<5!_z%}*2?n?Vhqlb(^}%*f(Il9RC@7&y2GAET5A=fW*B0Ouo{aUl3Huh zYj8JFHdyk~LiG2JbNb-CK;ykj%h)fryxC~i8gtD#F>{9HQuoa-ZV;|&%cveE@Y-Gfx$vGFcY)<~4v{PhxXud%sOdkib_nf6qgivD0} ze5%rDRO@PmW1dovmuA|nn6I85EQR`GV^7-Q4!vIJ^``4ZhdcCqeSw2Y2bBpF9orzfX;WU&cmuZQQOc_&~#%6~`G$(0f zs-FyAW3xj8XC0NvsMx_X+gwW7f@u;fZK<}Jvq?h(@mw=y(kx(p5@G=SNZE=dHExj}rHR5`^pp|yo4+jB61z3 zL={^eiG^6=puZAJ{M~mamtu*d(ON8V$X5&(V+n!MEY5oq;m2mo)Z?Yn*ov4rT(XOu zj%yC#3jDxCt2{DO!875}^0edGiF6TMwMaP#!s5zF{A`mVnr<(+zCyC72;*9TK1O-@ zP&~!Z87f`FXkCfLZ+cTiiVi#sH7BZ?M#@Tnu41;YgcGJ<@SrG_#_O0R6Db7C(TJo* zxo`x~7}E|So!s`vn$XTcL_?`^a!g6O=^R+}68`9-Kd1~bdXZ?H(I4*|Z1hs{{X@xP zeBl)}&Md!Lo+^}PBfhLmu^>d`RrRF#SODU>x?ZBx*fQRnYqT}-#c5%XDy^?h)*1;L zJ^X>)(C?di<=Zi+p@RQWU=n|-$>VS&6SizLOU}jzQ$Hx2$kU^62|?R+y~D zN=cE;vWN)-$;a008Qvq=QmNk}Mv82f#mH~4s7tpP$)XRXOi$X;iy%v|7zEqD(k1O`)Uy3V{7X_cX+DyUvo#?{AgWoXgQFb^ zd{*&SOkp`P=t@$O;-DB6`ARB+So;ds>?@4kv`tt54Q2 zTNfwJ9SadtL~$Lk60yf$aU5|gC`7sh;#0NLb2iAyIK*ZQZ6Ahu;-F5)Uz8#t%%?mR zDB?d4I%vp$Y2gUoMP6yi*A~W>FFZ%pfvqLEza?fvoP$XBF{biuE~!Ftk8A93$F((8 zS02<=LEna|-AG1fA}gmmF5& z?`Mwc5Lh$GAvT?*^lVAe;18D*C!ewl2m+NBt*^}1#>Zx{lK~%_=vz}-gloaAv39Fc z!wW?FkVOw(y}T!iDAodr1IR&<)i5#T zc&BEZ=OK#~-M9p@jvq_UH&aS)CGIDPMCUCoSE|+~s||T4Y_`0rFDPF)fX0`*Bw62L zr9OvSyCj3zqNsOdMQ%s#m~+#Pqe^kj^jc?1@jEqff!K;!a|F?jtnJfsFma$$mUA%s zwNC1Js%ns`UBdGX8>`2cgD^*W)|pl1_@O+5zchY>XI^ch9|ys8KBAI1psS&J0Vi1{ zdAw6I-YbIMqw2;bz^!D*N@&nk_5U+1M-o$}U*_E-Cw<^q!l;#?>4fvXt(%j0Xm2?5E zEeSCpEvvjuAxc_*ZX?ElC7)w@wE|oUEa1%xwyF!+BSg)6C zIGy!K3V9{Hr`L)g8;h%zosW80uNOrc)HTc}rXESf@`;X{^U09K{rqaBRqm-zHgU2r zg%?xf!B76^W^5UgB~m(#pJOESd- zYeZ}5l7Y36>Nv?(x*WH(oNt;yQ+GC8qGkp`ZfnKr5se+SR_QX_LeIuY-i+xX``v;f z8nZW8OD|`_VwNz*l-a6*_rr82EV(^C*yhRaA8`KJ0zANc4hr46;l1fLy_X&qg~1Dvy!>6tn%Iq(VY zZG0P0S6AFn>7zT`|`XAO0y1)*7o@&GmezEI)0RBYoo43p8=Ga<*XS z*)~y}W>+#JK8usWiK&56=J+MG^w&FcX(KyrBP5EIDaG$DkeV`6Dl?X->xKPPYpi4a zl4&zO)DW!3#nD=+?$i4}U4>vj9!?OwF{ro_YSY&|tucjJDc1cGEuSHScGnzDbl?n` zj2JX6t}&Es?=+!!>Os9y3lJAZTcp@bZ)vK6(RMtLAZkN6aTU}TH&0GJvQ?SLYU2zU zw6W%BqKz|TGGfrQvBprcjnjnUsRz|cEkIlt?T}(Ky^W~~M%(c~f~XDQ#8vP-OwV9n zS-xha+#C;XkEy4D*+Q_vKgm}&TgeuKouRcgJo{%hWRT!CUOFBNT zL)GxloDDUTr_O0Y;Psl>Y6~?C1|O@GmFaQxL0X5(=!FwzvcztT9^ zzgmboM;AJCYKJYFtd!jBlhLFU6~9e&qVcE8WTU1^g;B1qSK8uYanzv3FiARooLbpr zpy^^^q{q%x=c-D_H*^rQf*)g2Fd1NqOlcLq`&cg@jT`pWdQWRIjL&~q^k8KdJWaT? zy4@1D^^a-PH)omVWET&h#c7*Qnfn~ZCA_>Y?R5i>BGWusa+j9MC0m{Ne*0Xyk;kE? zco{|pQ)11j^=ofIc(-WMPPewIC0p9Y9p=&vGqf*`zXl1IYi}UR)?U|l9_DOs0kd0@ zOMDIK&uPJwrp#z$4Wsp7X{KBZFhr#2gyTA{jZC&G)8WX;pHMc8>=cz?{?S-Zj_x{x zLaH;$k>*@$+-er`O%oK=h&2kSai_@!7X3MXWn)8ADYM34rYP2J$IMh4%UAVps*ca` zy<^D*M#plHD39|mqGWLDK$R!P>@OVSy@ix(OpoYE=>S+zwktKf-w9hq(d9vR{I_m%HC3LU!QzVW z#%kHRJ zPpef4?yT?v^RBCGhnuLbpPL+8KUb?yj7`o}S`*j^9NWFpy`j=+*mOLG(=B~KF<)ju zj5dj^F!l!hMH$FUf@mv^h#Wh#7K!4evEcGX!n~N{W4EgblE}EPHr`&#_nMX`8jYo6 z8<#9za`571OBVBgMtw6Nvr+?lRkFYM9VTjwLWk}l{-`Li3gTH%vWNJ?lSBtxg={~* zWsPWG>}8|YGuC%(RLJr3!J@0Xk+E@=nE!mZB^tI&MCau+{2=i|7& zGWW^DltVVj=}>GS%Bju0%7(D;+wEopHSBHT9=_wy4_N+{o4=&>>LhN(lglR#qk9|nkfH_+=cT%n&ThmzU@#j=XC5$<- zQ7KJT@W>n5D1G@9ER5%Au3I>V;@z#;xrw*Iu89ilpZLtzyv|=NyKMp>!asC3Y zF>H31uM9)SmVe)f6&4=+mH(Kn@lA$f{QZ-7Z*6JOOr_SsN$&D4*Y`1grJS28FMt=% z7k55oEZ=MP>yWT`W7)4mqW(2c{*tv{hjjf_TGnW!Jl~LA6S-FO*OgS8Vo7Ndro_q5 zzxmbC`0`ksx@Q`XYf-!e7wl~PsCxd|KPxhMIS+2)5r&uKO%0*dw(+XQYwuUpM`c%4 zHdkAGuQ@&sl``Tcc6nOpfOQtqK|VG*7CGpej9h@YvV~8z;6Z|9uc|tjLae5iXo2^x zjO2(xO(J&`su{jwU9svIJijAKl1AP&{7v0Q@y3fj6dL~50R9-gv1A~=v`~&jx)~bb z`%V@|R{&qtF$OG7D_v|WZO5>hS@DEgz?dvQ1io6UbB4%Bhj4O}I=Jz*FBY)ax>a7A znOIre-~$)Bco&XBjaOlCcw1gu%m(Gmn$5@AQ21i3rLm>KwsOz8LdZLO8O%ITLA}L5~n4)I&^O- zZ!~I70r~R9quN3X4dQL%_4J7_jrn$JBtIgwSr^`=H3ysid%02p7igPd??mwNBjMwT?XAkMl&KawcG(J#$n$ z=n1x&WcSQ@vDQsgYJNeT@@J{q^Epc&e`4q9lCgHGK2t1|;yeqo7c9wX!#)DFVtHdw zt@wM=&%;OsX|)YmN2yjEowuiq7wJqGqx{5omj-*>~rpVjDa3 zyQsT%YOxI=-s^M5q7o^frDo_b7gRN+?I}hhwjDU1!7gJ{6Afyn>B{uzRFnF)?CagO zy?G)0>-)07v!N%OwR6{-(u)o5&3)KlK&4K=MqLlKGNkV#*(R)eZw_-^#ig&6uICaX zQw<_EvG-*~WgH*E+MLy0vrE;Ll{`_Xc?2Y~&qlR_e$`vAG)~Ffew5gTNms#WVHQrj zrjf2fk3ZgvgX&RpkL%Jss+G3&scM5U=A!U+%4TgBHtZu%GYImx%|o?<>f@C)v;OY7 z)SY$e?Li9_@YQTT!B@HpJ^nc7g4$6NiR;oms+G3&scM5Q=AxMS+Jz1K2-FOM{B844 zt)Tj=Mn(tihF7u%*lLtbkd>@Kjy+Ddplrmn)!Au^wic<~L#OUkyLV z-7*Q)2agGHAqh%b|q_Ogk8K^c;@!_E%J6=*1z)O>8f|pbUYTR*l1@)q39M`0JQ)_GIPt^r8OrIH0PE_F&ANC4s2z#(D1*&5Y6)8BQO=WRoU1{(?W+~H zk|zqaz4FJQ+5!J;%4qHk^J1-=sMP#|I_1w&wTG6=-A8N{(LbmviN0a0Xq#7@%|VUr zDigP0>s@V=eEwA%U>vn%=04E1rM%IoIR$memzioy(?WP}+@V?5$>TdI64an5Yxtj~ zX6yqL{adai}O0Dwr!2#HtZu%TPSY~sueJhUOaQJmXSD= z)f!rB)v)EY8ma=gZxT%~o~l5NJI>6Yar_-TVH@=0lh}Axa5fKzt#m^!leAJeZKazd$2d)cO8Xoqx#r|iUI3FL z2DPDbN1>Vtc}GqodlQoE1KkGqk~~4Z93O;S;`xYzAg&q$?>SRz>neT z#N2q*Zuqv)0ow`E38Gu*SmdCkH^G&T*;F;P;328=se?g8#cV2fVKvY7jgcTx)snovMJIVG>Pr2C4!zZY||aPIN3M>8Q00 ziJe0ioS|rC(>J#TTkrb3?J`hppnZp{vs0BB>x(ILCGeBtBf(J{C7V37T%|bE@s+Hn z);;8GPJJ+ks+rB*uB_yVLSF~_Y*agF{}uI0yIpPAU01PD0*@);2_D-h+2o<+F~ymV z$7DUV?jetJ>VrX4&1@cbWhGA(`a0NWquN3HA3IlRv};=|2V^TPFqtHupt6;gRW4dG zlicapOjlIPAJRFm0WgWInoa2L%;btgUyB?GsfNIVzUryDSZ%2XUK2GE%(m3C%t^~` zqDvjWZB*692pOK=1h{3PoXzrX4dskQUz1#Esiwe-;hbEz)Dx>}Qm;yIo#-jhv&>1$ zb)rih*KJhQ#t6Bd-vsz&p`6Y2ZVly(MPHL#X{n~b3p`zi&$QSrxh-_Sae{Qf)1bL+ zbS!ev@|qByj?+{%wctU5?2S!2=cehL$$)&yI!;1@Ih(;7;metHdN5y*3G4w;iD(L z`aF&7ZZIFlx`;_lE~ruN6jgJ4Y^+R7*gr>Op~S~{f_S1E*eKcLp(Q@WnU3*fJ+hsZ+P*XFxyRwoe3N??Q4))ooc1jzXtS~uI}#{92h$~{sHBAv)5H*1B(&bz&wVg8tf{zRINb9jJ&dbz_x{s@lDRZfaFp)da>03;)?Oa<_(Z#-b(^)FfA0swwbd zxVp;n)zD-O@Y^VxU^ZEU9J`jyMmIVh)0ET_2dzacw5klgkbGvdHopmL|7!R_?v_cY zM*MbOmN}y)hGL#GO~q$vwy>6_G!=UMsYK0ol*UwomRjkcxdc_MwSBIb^~_|=X~RAO zeg1;37BQ$+(BA&({_JW}&r`Oy+pB`VbfpB3?N#mb)AE|`SjTTmZMB6$o_A#hY_rqP z=KVa_${&%wK6&#~t${E7wo44E0=RDyO)#FSK#g0=Zj%!or%5_$Z9^vK&;?s4TG_14 zZNb*NK5x4WR2yjD(Mn^$ZdpOr05grU32Krx$gyk5X>_AwCrwE$aY)ZR%3ugdEt{bE zO<4Qa=WdyVY6R^(a$0S6%8sOT6|mGSoS-RPg&x0_sAfkxrV_Q(N{3Xp? zg$?@%^!eN7p;|$E4_ecetO2$fWfNp2Ymj5tQq|~2$5fhkdq~`z`h0{V)Rae@ zP2aApawSo_!KZkdE?1nu0j-tzUaR0S~9B$^;7Re>6}mYyajI(CwD)Y^vR%%KZzP_(kC zncIS`cYWS=8K^eUzN?$3*}j~ct^#hFg%j+gtI*@uGSuuy$5En|TIrCbxwOF)nqD?j zyRcy&fj)oRJX9-a@BU3Qc2hl70bDhSCYVZ9pvJ9bsmY0sqa+=*wjo1v=z<*-t!#GY zwqWaBpSN8GstvU7@@ma;Un^My%rwd-s7cl!$F3!((T$FsG$pmfAwBabgCQifY=Y)D zVeMa^yJZrp5w!D)db4TyAr86y2}v!Rruj`+ z``71gnS^Qt?L5@9q$pJZ3^j=+2uf9;#;v8N$%&4gBptQ3AvtsCf*TaAY-;AVVC!9< zw_OIR4YY61c+>X6JyiqDG+IwkldM6GT}w`*8y!1oN@|Hidgf6ELr7}b1kG>4+P^+` z%Oq4Iemh(4jp8}eRD70Z3u|dgQ=!M7O4MveX-p+(sg+i!YOU>a#jIy0Yfc;X5$N+5 zbhU^S=<%l#HQP}dQwdsXr4_1LYx`U=>zT=#(}sNn z`uqi5En-lu@b+$3Y{yip24|~DHc3{h203;;RZVWROeHC)C60)iLz%OLqGq6JZWGr2 z^|@Onp&Ieq+01cuOhwK#6`!Tq!djZrROs=i5;faV8dC{cYNZvbT5J1UG3%Mhn$w1T z1p531T`gizt)RV^+n)MU6~I-KXo9I!1!~+{mYSUCI7-q{Ya22&hc4Jb(aL6LZVR^F z^?BQ6pxTh_Yo@g_j3Qr}hGb^8td5#A4RY*hEK9J*i$MJt=Bxh>dw z*XM1QfoemxuX#D4tXYvSO+zv>TUJL+ng%)cG;(IUNns~JNiA`lp4Q5eA!aorL35h0 z_OH*KQ`8~?)d+9r=7#o6ea`ZJzm*o}D#c5ZuQpm%x#)RIai`@jSy3&2#NV6-IESdJ z1|D~1CRZH#TI5JbHRSVPwl-;bZ-7^ltmSjsD6i!-S<5PyR8AY+rE!|3sFq*hbRGjf zmq@B+PUkn1D-L}v1gGsHQ4N6yqqeuYs0v`RNi;!Xssc4`Ep<&!bgU)msI?6Vn?n~I zp=f2(G`9s?@A|y$GEi-xeV143b9NWK$Qod#Q8qzMvIaSJEjf*DbnK)lsU;5SnMWB6 zA*p2(G`|UJ|N7i5lTeMIoyGMI;`?Ki(=l5`FqW#4Ag-;VZC+X$Q=RJAY^AHVNl5B0 zY=B!f+SwHE+EU(V^mWOXnQ9CC7_lCk$r^n9YqFl8I9Y=nyOz{OH##=cl++T3G|r<8 z#*oyqiJRYqwSRr?mPx2a(9TDiSR@)N{-q7F1~_VzO>mT~L5^L^QKK6jM`=oGi9?R& zQ3gjyYS|pkZ^GKYK6lF`R3m;n_sq<+nwx6V<}dtc32U$JvzM-@rLw(xzI;G);l_j5xb~el%V;<~v7n#0ZqRZrrO|=L22thBX|-CO3xS~pSY>y$rB)gJiM@rkLGjrO7C ziAH1T*v2J`mmIu!*^7e=y0BzJtUb**RjY!&sMW5EnkUhYQZDM z=2GXJp(z?z+l7%FG3aYxor-D(?LJ%`ui*@LykhxAM@v0$n5dE9v8A46PFg+_UFtY( zqpCJW$m{$jz$**oY<_oZC}%ACn&e7LH3eQQZ#6Ans7uxWzm2j9W|K9@v1{3Ebfe=j zO-U_r$lyH6;0sADo3;5(So_!KZkdE?1nt~kZ)3-P)ow9iqXec>#1mw-QL@QHOIeCD z9c#&YYTZNP=F|swsG8aI?aE4?DD-u(&qlS=(f(E!G~y+oD0c8UOC^)j6h+&-jNHz0 zYT~z1S8Wq5$1QDiFwCS)=Xx$nd85(SMd3U-9@Q53F;r=7j#HR?AZprrH8OdMoYmsi9_T+HU1yrv}c` z6cUWLQ?tuQ%XXSW9oH>1)m8|Zp4$SLMc2({d6#zbMWU}qo}5%m2|k$S2W2;*S_+D4 zg6COE2Ch?7?eimWKFhJ0_eO2Cg;Kb0X(horlfF$K$Ym>kMEd%4^aXNEsx|Osu(D}Q zW2V`(yliNvhJHX(Nb~_aHM@MY+^0Fz@!mpHZH18Yxh;TQblq&OcWEbIB>H;f$w{>Y zK8)asxaCzCx(ax07EW-Qu0oGr%Vo189gm4xYNbOC=h6miXnNV)?ZSqA1p54K^H8lQ z?QI&(4ZI(g?cPVOi`4~8ylLOXYMfJNY8f*CWPl zaxAJP&WEYm2FtG|&{a6EjrNnACacin*K^tENXuiImRjkE!+EqhYe;$q?&h~)AAvr9 z+dNb&N_(3)ua3uI>J&AFw^<4q+@+}56uE)a)oT81a4Er6U??zvdKfsYKk)*r^$M1-9tv_)CY^Gn%Qjb z%1WLn^mVY$Mzw?X@2j*cJ#&-O)kZtVBR;vb!E7tN1jTb{=gL(}dMo!j_S+j!n=R}H z-5LTDtxaTijQKIwRb2X7b&;rQP>h+aR<)j^yDV?oDT+COrjqC+R9}IjZC={0L3OI@ z6;`@xn}i*r3malorq!B9pWO{?;?P>k8;!m$m?v^%rrH8OddA1+Ebnj9Rls$#a6s0e z!7Wti@oSlFj!nmDqLy0eAUSHiRc$bb=2gqPz;`z`>?2S!$Qy%d1?`RRVxM+grDeJ2 z)k+JjCCMj^qyv-I>W1hnh-IiyR55hQNc> zty;6y+uUTg&BRIzoF>U9IBlh6m5Y|sBzHPa(-qb72kmIl2&w^aiR?R@)7_cL6^EKi zP>UQ1sfNIV;cBxrX-8^Ws0-GR z6ivj+6!wg+tbl=b`q{l=9&F{0NME14`Ki{xm*MIxI)m*Zovb6)JVxmR z^$Af0Iuwk#EqF-peCl8kQ8Am)-5ALcgT4mVsi^xp#$y` zqyruXO>3iLk%N}Igz$9SrK+g~4-zDoT~!Bfh<>xV+l`SNF{nudHLy-aHG_6vjdwOQ zXKmk3Vx9MUI42 zL*M~_NkvZs@5D4t_@XuAFG03f1-t1=35wgR+UKVwJKeF4@s`?Z3k6MW+fJ$#aLz7@ z><%yww(>`$W){>ZZ+@yZ&X>9A5!)N<7CO8Km^~z^PuH=?K~HwGD=o{3YHGoQ<|CI~ zRp%_C`85!_3nMvVP?HF1V4aF;2JMaqXxdm^+npHND1p5c@dSNslx*_Q5}4vl$6&Ia zTKAy&=+#&C!5^yUY!Y{6B~KJ;9zh-Kvr+9t?LX9)i^)W_h|30rG&U2}?DENCw83Ep zrzx6hD+H|>u-e{2#3+I;iP?GW0ahDj6NDyfkYm@< z*yu*bV49Lz;*h*~l))B~S~g|#o3Qq;&)qT!)dA&6 z9g7^aY$dqT@s+Bk7CdBZK6P-0sF=;#Zj9uJL0<#wRP<)X-aJ@o_tfinrF*;C5+99O z)>~#lrN!Z6W;B0affe!yR4S8I&C&i%Y-zs~{5@$8?eO)F+#*T6=0* zqqn-!s?_V%`l@Dgrnfnl>>&R|Jv1=4p+oTD_iX zV|lZ2@{z5|M5@4=*=h?y?dqm>Irwdk*EOMMjxTC+_0}tfZ%e51a6Fs6txc6*H8MJA z5zdjrYb>OPhlVVq`)iF^!*yUa_TI{D75Q##*5^1iEnLly7Vfd8eyK@~w68jzE6!EJ zHU;c4Y$I1=I@Du9tGEWe%EQ%(x$*2xI;xwI z=7#okCHrBLbPal7D;te!3u6?*v+0`&HM+;awKl}Tt;ng$j7{ZM;Q8Nn)uziGJ6CD6 zO?#-+V)s=~wO1O>qlEDQ^Q8r)M`r3ZEBSiOikYjct?9Y8O^b|7&289FuP&defNa^X zWmK!Yx-v0g*E>7DIhM9iR^1F&S6NLR5MO4|Ab#Gnt1bQXTSYZmX$)8dHG*$BOj*be z+KJ=KS<}s0_SuTs2)#qAR$0W;v)*o)Kh0`B!Lr*TmgUu&4Xg3gV>A1@Q=hXT4_BErePL1MKE_OoA}u$4DOfcwYHB?Uj@UUd ze#u;oiHp;}p{(lKeC<}%?3k44OGV@N7gaxmuji=>#4m}dN_@YQ1#2ju+)y3FHR!dX ze!M~TrM>~4wp>zm=n>Lh#H_}LZ48FHqiOQ=xXdqx?C?Q)6QZg^c`cc$VfDTyRh9Zq z8CA>tZW2|V^zsH(h4gH^s$zaBxl`Ww7^bRV^T3>{Nq?wF)g$b#RTV&G(^C?v0%=dO zszTqz*`a6NET<|^HYRB`44W)e9pfE$Ra}hc#{1iyw4@!>UpQbaL5+|nS# zwAM80%?iInQSRH^s7#B$muu5A z^)eQ(lQnruf|qq&RMz=0RjSRdf@9p*$n@LWGd2`C&ZAQrd$Xb7g0!t_Wdd?5TFvR@ zl?@xJX$y(B^^|(nLa=<$l7mI_loqY8%+|)oX508sHLAF#v}k;)(i&^GDz)}(xvxCi zo+y{smKNcbi+|s!ue_uz|GYS2(zXkr)P?Jfc;Fv*!upl``ekzSnIg?kzD!p4_x6n) zz4)Lm+ahMBG%G$}Er>MOoT%2**|d&#@$NVzE%+7c&X&@Q-I?MXKO{C%{-z}5uq1Jw z_ElP^G%%iEl3Y5ramnH(2QOZ>WHJAzxVO0w%|lVj`WYW0b+$vNE8fXtBW0wbXESb4x#DlOvI6>*wT9>QP7h7KNxM)7SM z1hocY;cLpBr#>d%CMFAX2(cbZ?d!1s0jaggn3XY=Sr7yZ^_=Wj;1J09=Wh#REmE10 zQH!k|4lX~55o1X&#t*(bb2>Gc#1$@EMO$C~=o1@lI>)2MV?zVSiEkj_B4l$;UK%-W zsR+#9|H6k=am6GWr7TmP_b^m09*3>6*@YJ;V)Ralc-JJFhF>#^Dxi$h3mSlZ?zwxw z)~Lf)2}Z5S?1Hw3zl2f^7q+e2JQQ=4AgfZ%5o z{0^Lv0y<$06XIe)QwQiB27( zCf!>+#vro7>b4Bl?Ml7G#s4i_TMA5$&;jRnI`bo*c_O6<8N_8!OVvVpBN^ne2-hq=XbGRU z#BXe>wb3DX5CK{HP_*C$&$CSQPv8=oRVG$iBri%_VN00(D0<*`B8~WmiSl#F%0d zMBUOv5-TT@pvjh|Ni$7G@~C2#WO@TxX_Y3c?ct{UfGf^$TD497xDs9vIf(CWS>3EP z+GFKG+$b7~-BHY^?AL51HVuXkT8G0pKh27}9KgR08i?PZ`+NGM-Cfy2rBc7vhEMaD z8IxR^C0umJS!nFWL5jynu7uYomo-uK@=ao4pBTWtk0?AF6~Bik>XzNL&Ef{T@nJO_ zgEeV}r^9gtK3-rSK)uZO{MPHWNj%RyGG3dVZMJ3yd&{$Od=?+L^_M5TJ>UT@mO_VL zAdN~j50)@1kmKm-iTSqHL;tezB!_YAk&104&8ctcIcTi>z7-4Ll11E-xnd!T&ZdOW zrI~zjD5->8&ykSU(Ab+huYm~4tJ|tOMdD}U*^=Rjm?{>Xbf|ylJy^Fq;!@yH&+O*L zIQHF7*JkBQO2mvCgT5|BxSV6au_aJNHn*ic@6IH006V1(Q1VQ%1 zR~p296IH0$6V1(Q1f>nNhPW?K&U_G%pE-$p8>L15-W*KTVrv4wii{;rw5dIQAin>b z_xMm-uNwZ<*IO3r8?X8}Z7Z3*SZ9&Vj8* zj@VYjSACpTmBe1B%)MZGa^x&WerKh2YjZI1nHe(X?_cxBk7z6yR2VWCA2XCAB#rQi z8osWMhMVxe1{9M61ZNo<+}SeB={;-H=k(vyD5FL}uNd2a`GY?hm`x+T5GCB-r*@Bp z@=BZ;!t6q_hV!99+VHP&@^TU$Vn1KblTV8b#RZXI4B(gW5(|iw{Ce}|*R{t|Ypy{g zW*1Et8@?CJU#Z5o91m5dtE0`8jS1W_GEVe-IPBs<$LKQ0ws2j-u0-pEF_|`eSTyseLX4-=ID$Q2g(d%Q)9ar2h z38vCWF>`&2Dhz0YRDIB2!w)WUJZdd(^~xS;dP}P4V~g zb&kC2y|f&A%|~}e!WfRP;&r@y_be@rLBtZfNEZZ=(@JTs!TBP39Nxv3**0P`K(sqA zhbGT?usYprZ64vD#K7Lk%I5Sdc5C|i+y9igAiA}eaeGd^YZ6{A%+Lt$9uD~TQ(|k$ zU#5^tb2Agz$7EAt**O>Ho~d{fVl+_wasLB;ta9oL-~O&K_4NUi zxKb?eIZ4{&k2Yub!thpMJQ8*P+B{j~PjF;aI{6p}MH+7lnyk%+pOF_HR#f;~EAhG= z{X6$Yf)m>=ZvL!Z7TYG6nU=V%q1#Fj^^{-c6fnbVoA9IZZNmuoYi>D9hkX(TbF7hp z!Nk`E1)~CN+aUa%mZA;d`p_QqK#E(Y#yVWt3m5RmH~~P2W$AXG#6^37yZ|B8IR6xVF*L zm>_&GBwmC0Y3YS@9p-EPm`FU)z z?wlY_&7WXu-aLodZknkWKGmrBG>en7HJh3@&q217&+^8dQsk-mQf$qi?CPPY|CgF6iL6#yz?nB}WYc}(>UrOa(S!QRQ#gO*d&m-(%k_tGCqg}txS^pxtk=U0ht8LO>CDH(a3-2` z;Ggqq-&aPGmes(Uin6MqIV`h^9ne)nb6BqzOEY-41g}P?eoRbOqeH+@4YM?_#`3t^ zBsa8&c~;7SWHq#h^?I>1qiQ7eV`97-34zRN*hr7PS*4QtwhXnMI*uuB#QQV+k&X6+ z*m#epX{7gib!4Skn@|72$U3-|KC+r*$=NQ5&mcqU_le`xrRq>KrrMj|7{UrPThrpL z5xu?5P2_o${*_sB6}DL%K_&d}8jx#1k*8))u@!HBihR27Fym@#dahliXH1Y!_o|L+ zs|mK0j0y7TzQc@LwPwqP=%kNBr~B>5d4au0Sz|ZaY^6?bXuf^Tq(IM_U`%Q1?z{(C zuNoO0Bxh_CreHs#A#h+FZQ?}c%%d+wX$8Eeq_dfr|0?Dv9& z5U~5m;WcD(n`F~jrjB1GJ8^28WYc{H84eH8SDz-?bZ=^gCOh#AO|t1e!wjnvbK~^s zci1eR?z1CLvneH2vv|7aDBDS!o2GnwRkM-F@pPY^*&0o$*&4;uJxAF#Eq0F#S54CC z9y@b2SyEFqNvHdbGM(i+zcX7(^=Xz*_u84Q+1C8|j%AE5H`*j@61T|LWU3=wlX$x4 zAY1hdW(a#^LH5#{u%vU+4eeTNy>YZi-)5uAkE$eY$dIH-R=Yk2jy)<#$zopokuw{r%J0<1_R|; z8(aCuJIcn=isf@na-0|@4JQ)mQ8?06u_OXTE`_)A^A11^2#Dlo=9N@gz z3?t+Nw?%;QS5yQ9$zvk)KXO`SX1KS@2=W;TWALAfF>-ue$LH!pvd0KDHnb$_c0q;a z-$7}nRh_7fw@rl;&v)m09deY$g81UCvAR{=fX^bWuUCV&IvU#~9Cwae8t5b+;G9ph zYMi5$79OHDwSxSZj2Iq|Tk5N1MA@}b{wz9%^3$5FQ}Ed;ymqplKF9Wo@4oVZpGOou z0^f}Z%v8(kmD$M-Uj^IeJ1^dIW*wX5yNW+%hxdy9 z2Jg8e%?<78%BI!LS#;;-coi&YOqMO1H0;$K^UYRs!F$ZS8RxHdP&(3lTP}^u-nH4b zuHu=~nM$oy9`IjE&v|HiGk-J_EV$p?nG)Zr-oxLDG1z^Aw(ih#kFIVOuSS_Q503LP zScF}Dp&i@j8XH*hMjbOzs?N6YDSCVZiJrOgg7xrgcZ10nE#p>d_<2aaGd2DeWlGe#1?T*pI_Q;1K+tajxjGJuYK$>E0|lwcVEj^R)`}KM*m~P3*>uRt;*)I z@H(nPh557t@~h}h3#U$V-0Ss1T&_);3x2yF@aUSJ7KKY~_8z#b$#@c^} zAwCZDA^C~w=;oPf+16Y*4s^Y!h!*>=qKNn?l)F0o5>A(U`l9iD+XoUc<(QfF?DEm& z{IXzeQ*X60JyNZ-@cPu;cAfv9>v0SwB~=;PofDLzYb&d|j%m4;5iN zj=pJ$e{}QyEqo@f_tn!9C#zWSl2zW!>BD;vd+(Q=OyaioVY>kr6t66cE zp{qDMi`ZRw(we@f^!0YrL(ST`yms^`<+5}~?=(cvVTm)Sx7NTlx=a#f8%^nz^J|xL zs7s5TB$^jpcqbITUpG7K5y@kWidK;A@F zqs{T8uVv-*}^`CoCvSUJW5_i~49A%AX7Z#w=iMwBhi1TJ-ak6WN@> zeBAZO60Oh{*lU>OP-PkmrpzJKzs(ulrRZY6K;Ulemsg zSBqcZ*EH`hLByr;CSE;)yBV3IP*2agE?038Z5GZUIky4)&ptq3EByYa+`?}vWcTw{ zJl5dLmka8fpYuy<6UKT_N6yr*+9@n*`Cqxb!j=-B!!}W~`x8>7rS)6fm&I;n2lalH zMOWI;Y@JqV8J3{p;>2L3?Y~>4tCQS_g4@D%kZ;fI=Ek^*B-nK)U z))uX-?hFl*;-h0?b-gzDYkcwCd1`8JAv_~h=AiCYt({SIGs zJo!deQKen&b~QIhR8%p(wXTt+z)n}757@P^V|#5m4MvDr(XDfgjk&6FfTx8pF{0>~$G)h)qmEvl4o!l~`y)%4Rf$g-@+*6qBUQT)5Yg9{n z{pFi0V7ayntG$(~9Zoxf#O98GRn($V;fm8ASGj~`TQ9s&N{xA0iiZ=|WY$MNT52tx zu@BusRWM=WuKX2{vOBbtoBU6yWtUT-Avcm`Y<&89_L;6i&YHHZsi9ncF%Enda7sW+ zddF&kR{6lZXFA=W|F=jy3f2t?D(J+HvSE0bm8a9HZ6Zd+GOJ1C(XcO1IhGo`=(UM9 z4G*{Sv|6PdU206|uaj$@qh~tRwDwFlw=7IRGwJL;MmO+(wc?{t*8b+#$0J%XxhI@f zQ9+EVRFhKrRUDH?3d|N4dt{xP45A~Nyk@1dxq*C=xpC2lTQpS71KLyhxwu?pF2_kn zZA9zn?Y2?1s?E6%h^kg!7YFRvPWDgE=Z5t3=Eyvn9>S)P(6x2#w!PAxk&5TCFSIxHVNrM>T`=QI1D)SeXw`0 zyq0OI2S$8_2#1VTX!Mfk8))O?&%CpZ{)UDlU_+p-!*9 zGWljGGpT^<^1expo7OT<;BKOOrnkM3azQ)V6MLwyPKWIto}#U(|dW?pQ&}_ zXSB7=4vuf=yleY7HM1DbUda@>J@VJOg{y;oS$d-%+K35^iiEdmlqCTbW^giDqG0qxm-xwvpMPxv|9L2N)8Wa7Q6SB>&rYrm1w4su)EGW9B*Fq+lISjf>7*3 zaOR+`9bwHn{6lq%oF4)^b^fUKuO{B!&NK`E<63I7FjKR*tXWHF+LRqgXRRxn_1k>{ z2bucb-wGliwJCTt31IA*U-i0c;iYCTXXCnh%Ah0%q8Ls*v@Xu4ll_gU1?j%P`iSX; zQqe`k^6|Cq_L-~C&sGIeK&_MpWq-=a@JP$F_Mu znNS750(SNUN~KK?ZJbvBhDz$}D;u4?xtZL;;951BV-?rbyE#}{9a2%uJMucc{A&X}R&8L_cogSpXKvgkN*q|OhPUt%jIfm*_5BlJv3p#^6JQ< z<5ZCa8_d(vuo;(!v1iPjJozw!InyP|M{P9uTbg%9XhK=AyxOwpIQ3+~2J>`i7+wKf z?81SA`Ozf`xx)#K5?5PGtUM2AM)>=;+HyG)fm>T1VwA=_2*KQ)S{Kp-{JjQEYbHW4 zUsoCP5OZr?0e4I5t_a;E7A&u>EILj#S+K!8Ee#t|nGxET220}ApP#DR82p&Q@>rJX8pN^R!Ca<4 z)!z}t6{6q;OF>&D3Qea?qTmI~Vp#<1o)Ow?7H}{>TK84O)z)$_pU%$bZpS*=;M|(B zNjVF*BF>h!$eEW$?Z@6+ZjCunc(vvv=hU1NC0GJWd*`lqo|wl2AIz2ZYaUuorFr0k zd0QHLwzc!9&5abypVpn5pwj@{NWoHAR&efW=P>{ed@xs9cOF_!wRzx!d0QHn_OkQn z%Z3i-NNdZcDZVo zChJB9hEmyLv`%RxMBd_!MAYfdkr0EWv8>`eE5TFpJn+F>T`rDU6YHGD*Uvk#$5!-z zyN#p&w*DGx{$u=}dym^whdCl~i%Lk>{#E3%1FOi(ld8zgJ5-b1$H&R_V`|bjHb8yl;KCitLMj?~3=$@8DZUoNV*gDsmNYE&=?G`0Z-^ zy$yb^`Jjs24gB`5I5}{;7`bXpjC3rElgE#blQq_lk@MDzkrQ*(L^D*+!kuh@GP>gJri;*odF|uelM()P@CH%b!zRda;<-%pUt ziwUy-=Lz!Ze-dQ&X4T~7t*XffcxSf;z0Ir1IpB5CMzGh$)nu(d#K@zuYBDEYP0m{p zCl8$#BRk@mcw&s)dt8isv@AwmJ2pnz@V?-L7}W8{bhpgR&HG5p=JC`R7KZ}X0ck>?l3 z$VNv)SNt}7RE#`~e7y#hSG1do?Gs>x(LTkM}8XMxWO=(pDK)nxr;fW`Zs9iiJ!)no#m;U7Z= zJoi2mC-40dK7{w8r{iQ@lyNu8exvUv$VIm#$Q?_n$%&W4Cnh9_T&yN!;{-YR&KOzy zkt%ZX!&T(%z2cA&cs(e)!{g-hi3xH6bXXg>y8~AS?u*djxMASpxd*l!4>>;FH9=0> zEkUv?5=8t_f^= zJryG&{=IAm_}Pi@1w3!A9V2trf#1Rpmp=rX;wk<#PQJqXh==3k9sK(xyjvcD52MV! zf=}*vR5iH~&zPgD$)l)0?RnVe$T;aO#L0{J_mW$y$Y-}yk$cAA-`~f-@ptWZC~K6{ zt;bfAC-|wweVi{5z4hYPPWH$ z(M46{qU-QG-X~sIMW$^KC-;39aV(4Sza&Op9YXoz>G~>09{)FD*ap?)h)t@=R$HJx z{3b!Jx()s|KSl_i@pq$4@Y^Q%O?^2*YVSyphkl1LK&)K^zg@W%{CUd+X~z5RZ4#tq zThzs^6XZR-*T>%{k4cbA4nW!AxdiwvKS+=rf&U!dkAv20|EVJLP}a?O-}x2Vklr}i z7tbBHC&;T$pzI-A3^AksPU!aY1Q`SSK6_9VdG?(c*?v3J$8)O4#}_~^Je!?YMQ+2h z|M^v<<=iUrG~OR)tI5-dulpko+z9>T*AwK5FH!#ylQ)4)RM=?)(D=NyntZ-tg50cD zlS6l_Cj0IVJn*{$_2|Z3P%b}AkTcG%B1c~vBcGpDMSAfpT|Z9VSP$*i%T=W2o)}sF z+bZ(jONfh8&~8kIKm7`JdZCJ((-0@~-bj$xT*QihCdj)oOj;FRiMyCBfMy}|KkwKMZjUzu$LgjI58R4ZmG|bDTWih;|mwM~6eM^JAnN@B0pe4}KaW zcYcEQbQr(GH<#tA$XoE!lm8PVE8(9{Jr5sV0YAk1l3!PmkLn>ip5{9cH*N*)?Nww0 zJh2_(WbXFx)%76vfcS7S z+N-N!54=x23Gv`NadN?0agu<{pP@|h&w(%E)*W@I+j#D6g$!rK$X0ltj5u-QUr;u9 z-n*-cEc!m$WW4XW6MdAO5R-O{lg;q&*P!o`A5@W-pnDg7yBRu9t3v0M90u!VfQrlWa5k0WYHLr^Lvvcm^*+-vr+-`dJlG?}9%(4q5ONC&C7r|Nb0( zIQ;(N6IEn)JWuTd+3}1)KjD=hqi^yW>f|5LFPjd3nT9rK8}w0rf&R z^VUXeM;R2i0?#Mm>sun0;yG(+oV;}mVrvF56HrEo?MwUd`_B@vCE_TaGp1INv(AJMHdm20JWJn% z{C`53Z3y_E#mJi*pbYVBzbH;lT&Tr%$o)8c3GWlvhb#-wrsH`$RYekr5!>Lsv>!1F z@nQMrz=i*BbUpn1V!ZJz*)UFCMjP>FH`>aV(TBwQ?wOGN`Z&4mI>a~p`>Edow+sH+ ziE_ekbFW1`M2uQ;UyR)IG3pSWcV?kp;(7c4v^~E@UBLUa{n5sp2YpI6RUx_$tv>25vWt2p-$ns`gX(~JiESwviK`(+=YJBIWe-J6W=@F z$M2yZ|1Rp@%qsFFe%}}Gs{r%t`-oR~@(a=Lz8rR506XJ(QidJyj9(1-@cU(p&`-mY zP|=T5(0+Xn@ep=??W!u$i07)!;^fOsVV|F(4*wuVy6|4{5ZdjUIEmqzRu>~G+{2cA#Wj}(?+=du}_uvZXyeneqE~x)M zgiY}K_INM78~xgy5x4N%IDoqNd%)v;=vC_4C5m_uUwAuy#fA$_tj|c)J@RG-57nTE8+9_eJ#8*S0G-a z3~$A^{Xa)+y&vuUKTuyj1D!+RvxlG#AA+_AZQ`wSpf{cse*=F!+Z=}e%K2#T4~0De zqke*T@iF4mhp1OSK|RI$&JWPPpNV+Vg*v%2eBhU`HQwj#gt9ydF%!>4yP{3P@1O62 zI)-PnQxK<5MjW32KS8;?wHIO(p7YK`*`jRPV3Ri3=gz&+#^HJOEVL1LKA(ra-o>yz z-VdeGzWfXA1)jH0L>v4)#ACd#!g&AfHPH{kbL$9nybN~7d$5SIl+d3SF`h)-eC>4D zp#lDn=e9QxpYinGQboqzf^xhW?L3}!$6y?^tu|)>`5uLj3Z6Mdd*;2U@^Jp*w7eaVy8Mf>q3 zd=K&Do_~QSo;JjiYkN>H#=swbfqJwp+JkLS9>=5YI1b~Wr{H6Eqa1#Lem$Q4{n5Vd z2OnAsbr*8JwI=!nc<#=E2AhbjN4t<_R|8Y0yif3>+#*HYmnz8WxXVACU1N{KNtT+|)@qCbmFTV;O$NPan#Qz^4 zM&g}( zbrR%dJYRf*vGS*J^4aGo$EpOm53)QiCdkA$;ZOK`$?q{=u^xV3J3)GZ|IwNW(gE2{ z`!)Jha)P`8-d(T6$s3Td=DQeUtdFr0WIlNiz3zb2ZyQ&TGGec>~CiSvNtx#Pcxt zJqemGevEinogiaBLY;)JEgN7w4I6F%_+H5S1>{`z2Ks5R(P@7{TlXd6^KU^9Pw@*p zag1>j2~xiX#&dYyfj$Y?uNM4QLjIQ_^Yzf-W)(8yc?z}}3%O@QhwWkG8rbVS$hp=Z z(N_kYF_7g=$k6qVIC%gv-3i_Ac>sNyFA(qkSw-GF47R-ix^IfH9Ar6hVm0aA2lGq& zVr)Hx@fzN@?N?2T`&W~X?t*MbVjgD#=6v?9CYu~kO~eDM$#ZzN-yLJIJur?Phq3N> zydOjCcoh9~{PyBl%%SXwFe=5>XFk=&YZz19jrK5y zGRM>QTf_?VvEJ%H-Mt3%@H}x3+JN7qzTg=%6@L70jC)^3pXqm?^$K|7{pcg;8$X6V z_@i+m?ut2tW|Re5vhx;CY?>vaPrbU>ycp`y$JNWs%336y>HM#n`uLRFjX_#T-=vb7*S=r@ETlih03vX5#z8YVthvD1HSWI|lN83LjZo zP0o4|W&Hy58o(SIV#QaOd%YI(FmGahV&0|TH3{q44uEyVMYu}H>-*}cMP&Za$UJ=g~@Y$6)%*o-o;7H76=26Fr@T(E%v?xK^7lU>N zvaS!^cdjO5d-3h41nFOjIpJe5Hv+ppbv$HSmLPA>Lp(Sc^DB7PIvwB7#vDo);=%ct zFT4agqHT`-9pgScPaRQB?l`QPY}SK0W4t%&ttN*bjyYqL`N~1eht9)1;Af~yX|#0% z@Uua*g$H9!`&rCoPDqg3_C_6h24nAM(HFP}^9bV+U-8_BdA;Ik@afahhsHBIg}I=A zBnY_z^Qk0BP{+@UMcwxSF3(V=< z2m3q=Tb=e0U><{yJ%TcO6!Gn+z{fn@RS z18S>D?G(hhoiYFX`vlqQ5Yz|E5l;RC;`yuitqpbR$pm@j7tp7%n!JbSo+i*gu9`dy z{Hy9wP7Rpfn+$p=t1FrzdpqXV>Jnt~p=b}%kaGd%d*|>3HATZ zqe1&9v<1`Q2M5DPFM_@oA`T40Z{e%&Oomp9kLHw>@~z9)Mh@ zK%Nxj=!cyz#`}x}nQ$6xb_{HB2(^G2@vc9yQ zw2o9G??7Jn=LMtoBGx%4w>ig1wFF1Cr?(oCsSI#fDDI#{|= zC@8&BQtFWgr2#1=ttG7~RZDw{3XUxm&qQxkvet zvOC$0>`Hc&caXP}o5V)3Uc5oPUc6TPNcd3rMEO+tyV4;aB+rl^5*`%p7w!_S7H$-- z6RsC-5N;B#6|NBmg#jTYd?bD-zAx@3?kesqz9s!x`jhmY^se+*X^FI0S}3hAY$a_e zZ7y9VUn*ZLuPt0EULsy3?kepf?Ii6h?<4OmA1E9k)Csl1VZx!p*5X#;7UE&zq2e5I zme?(Ji4REkOFxnBk$xooP`W@qUp`mfPuW+QsMIO7%7MxhWwO$!+$!B7-6S0+9V;Cp zy+~dl&kMg6#w+8LNFPd}W@}FZanwc_*?X*@3(z{8@Nk`9RrRm@ZBe zo5fAVO~j4FCxr`@3zW0uGv(9e$A!m)M})(b9wn(9p&X*jQN~N-q&=iF#WTdy#N)_P z@;-Toyo(iwzmheDHH5ej6I9_$%+y~@VgxM%S&wW;HX!SewaHp!P0ZgTl8}vwEK9N= z_X z3UNnaCt(M1dvT1oHQ9>1DgH_PqxhQm2l4mfE7I?z-%2?#D`vzNdAdARo-8-X4f6NJ zTg98j^TqSTbHu~t!{kHc&B_T6(l5j(#V5p=R3$0Wv(hut zFQt>ElcW=*Go;g{Q>6#R2gLit5wR%d#iPU};v(@p>0Ie-=@RK;=|bsq@(=PK@)h|v z`LTG9xI#QoIzZY_>Q-hdUyA<{|0#YZ{$2b;yh^%Kx?I|mj3=V{FX0QJN>oKzTuWV3 z6+|L_CB)P!^)un`!Y9HP%0HDyrAMTnN>hd9@+tC3^66xuut1nZ>c|14i5y7kNiAt0 z`;$hpAK8}-kvz$fEE&cs(~)EWDUu~*AsHcyNP#RS^T|AN2sxPakVDBFau}IS4kt-6 zm-LZd(oc>cDKd+6lXa!>a4wMJwE5+@^ zmEx=7%hHf|u`o?;ly4Ew6%UmsNZSfAc`bQ~e4PAO;SOnic@z10>F1&uay2MEs__?_bWeCeyofmW693)PVy9SvUrntqxiA#H=#@Jlphv;D*Qm0C!~ds z#lMMrh`Wn#OMj6*klvS$mX4CXD{LceEnOjBF0Uh8E?y??F6}1mFYhN$66%G+g>A)c z#2)c*@nCVb_>lCVbg%Sd=_2_;`2b~qr9r7zrYg;fN)&RN^nGcWbiDKu`3-qdctJQp zTqd3>E*FQCj51eF$)^dY3cHY<$=kwTge`=b*Ci93qhlkLb`;-AGg#Mi}FrQb_O zio;@?+$uNAQ{>yl+r$gS3&bPj9(hZ$1=&~HN7_NyURXn}me-Znk(bKH$S2At$nOj9 z33p3(NgK%<%3H{r%P&d4k$x#YB_^b}^qll7X}NTYbe43c^i%O6aiO?CJVrcPyg)i% zx=gxM`X?d6PsDr0T4|CrTbZSNCH`CdT>OW4we&q{0@;iFTli9li!o6WMe%dtAHw6( zV^X&;Q#egNRlZEPR5*hy5)M+@mGy*~c%fJM5Pjl4I?^$PWN z$&B%E{`(%1@Q0>Lbdd%BkvO%HzuQ>XGU)^=HZx$^zw=%3^hq zdX4(D@{IDVvPk)r@|<#tdV`u*Ur?S`E>~|<3+mPCi^{R;_tXp23)SB!x2Q$+BK2bR zx5{$$81-oN67?$eW#w|^Hu4AZEcslKRY_GNFE?(kw22nlugu4)y;%Wgwq%;Ry)s?BPxv!=i`*-Gs60jOsZR@gt1arf>g~c| z%Gt^}${oT~(kiqGGlUjleRZO`kNO{Fg|Lk5t#pzua;kE=a*}ega+-3AvRrvmS*9E* zTq4{=enHyFLF5)8FI=Wq>U7W?+dpIHW<1z%9hGj z%GS!Z${1xkWoKm3|t@f$?YD%4_9<0t+i7Kf3kV}*u)VqZv)GpyL z^-6LNxte^B{Dj;~j#s`UA1h}n-%;c0zmG zLQcl)-dV~q%J<2un`c|yKfzD>Sc{-LZWf0o~p*H%84*HIo)9#9@sWMzf?xLmE=BtIwLDgRUc zLjH?LL%vu3vHY?8H+cgktK^hnlYW@(c36C{hj1}tFi??^pDV!hTxf0uxsXi#0Lx(vOXcxhH)tHH>u;;wHdIo6dF z{)#fMiSY9rJ|s&nMsmO)xp>fA_Gf1K(|MV4ao;KyAYe3nx1`aqO_4LnLLogj-KXcq zXwCJfGSOm1Lqq~@q02y@G^RIMNcZ&=ipZ`tP}_(*!utl3`JQ4vnJyM;8*2;2{@U8^ zNn?_k46;!bb9wwWzSj78tkGpFM{MgJ`tm54_U6dA65t%Xm~IR6;#mS_VY1LvHbL_7 zA$r8)L$jruHzl9!@62Tur1HU$E|>KMGk9AeF968qR4CI7Ja}F!@L<`ZQTN72tgxIn zit4586_cN{zp%_k*3-nhuVH0UU%KqhXgsE+-~~7aPq- zKsJ&o*T_(3Srds3oQQ7OIMEF08XLOCH`Wd&Go^+C^k!np)NBHL08GruUE{(ry#O{Q zgXd(AP$p(;5`(9bsLjpItwvX)(eowXgGne##xs8xZ;VXBRZ!6hn6h)(z z(XcI%j~q#6i{-_V#uPuYM_7JTOVVPhub9qd%joAfrnqrEaz?@&joy7kVd;*21Z0<4 zXN(kwN6P6m+AMh~1eur@-xNIESB%zqY-C}$1!KXN1nEv@Mp8l2)M<-kvufIt`Q%XT zp0({wb+gUT2nL~;R%bzr`qq4=rUe%g#*h^ZHKRz_90ho46yUZf!0k=-jZxrxrbU9b zWXUbe4yH31#we~a0L<_)s|gPPG8~I_rMZ72!iDAXbS@lIsC2eaR;Q_n6VWXiCz>f; zrilB^%jp;MWRT{xLBvE7Drn1+dK3d^`TE5HGHu-wA&;Fv-! z>Pro4{eV(u(;#NnDb{7i0YWpbX!b379vn;P;Uwd_*+99t5Z(4%#K+H&ZgM)4>cmWA za=@`HNEvl9<`Rmj@JkQ;72w8nX~2zVs=&OOIY>O#mCk-8&%R<=$FfCRI4haw7|VL< zJNR&-daTEbXv&z&wbEoww`r_|+G zQ)kCU^p%p0W=a?7;vN6`AMNrUzgSQPg_8JeRlSbDx`QW3NH#A^uAy>v*G)CYvl9nUP{jDhSZv&II%4SC17rT(nt=kPNmS_)zX1Xn!H5 zjHDeCf(!|0;86B7sKL8gyH=Frf;az~6$#tr7Ljlr!lLhA&ZNE0jt|#QP(Dmk%>I0B zC$6n1q%bY&awW&yZnHlaxI2KR4xz&~zCM%d)u$E;LGur#@^Q{1M8Y;1TXPUmaWNI4 z-DrYk?%FoYfM`aZu;gYEuw*Z$GMV%M`Z}F` z=|UlwFSORz7E+~)OkA$7S=tQCV8M-RitE5EtDCK{p-x+gdxWHWbw6FsyMXlrcjN_Pn?*D@4SsXj0PL{}PcUJwx8oSXXjB zLl@J3S~}X;eI!pM0y&w}w|$L~3I z!uYY;pKjaQ!HBJdCXEhdHfN`r8}6Y54d*qwk35i8!^{IqJ2{JotrVuJ9qwmE zB+~)Gm;P>;Kj^Ee;*4QboMsKw(0AOpwl?iAX9wJJaSsPuFi;6BC9RT`zG5-c?7)Cp zXEEhKw5icQ_e{6#v#6)8zu(0RLzI$=9srx>qMpX|f^bw9fCCkxwvJ@NvAr-(0!(Zg zz=5jY>=@441L8y<>180(01niya75~}g|=vBb~u*{zY^DfywsZH#&yRPeoRx$z!_wB zl?nu;>sBC`#jmVchE}f03AZu0kW9IvZ-8fy6x{MKd1wfu(aGl%jqcmCaSThfCG(4& zYpJ3ASj&m*o@^v+m;EB)n!={S_qn(^Fu-l13v>DT^~t{ZscgTde^0OZZ&&2E#^tay z6T_sft@&v4wDtA5MP>BFwN7{he7FA5uq~0x+4leK98R%J2ho>W_`- zGBG!vsTTHSWiqKuOD;EDpX+xVpLOXG1ZI*+<%dR!EDX)xyVlQr7v zXe(!0fD6l|0T+%bX)^2Fab%6SJLsQH*i_5R31!r`4n91$5`0)C(aMyJjpid58_ANZ zFFl;cA<}Yc8K&X5kv%fzPx~JXjNbwISl(lQNBgcj3)|n5> z5UsPjv81ZyyylRH`erZ*`qDEsi&Hm7+MfPY@5n$;FLwC!_Y90^Ta7T4YuJdQXbOP1 zUXDZPvx{s;a@mFx%PktSGi_PU9&3~sF>wP$WMbN4V#{keop=bzhv^lO504VCt&v?^ zesDbr7o`Lg98VTJkY-Hron42^g207D?Xd=_|l$~6AIDITtMh+N0 zUS>%Srsr}@Pk9C7!*iD%AC_A*X6+6UkBJ*7A`{aR6KP%Mms4K{`4Bw<@}XJMjm({! zNi`VBcFK}68Uc^A(a=q)%ie>^y?fOyCoe}^z;cEMkd6b*D;fuqB^L*%x3=)4Ui3)C z!O0e?oISdok6l+wwI=@yR{&nqA^P4oXDcX_wvLxd|a|_0W zWXd(t+n-*5d@=TdvE_@F(LDgPOYohWu!xpMhgS5 z$`gx?<&}z!V+w_3$OdGXPUX|dk}otjo7+OWd_P;Li;8yokkFyyR4s=_R3!hMNnKb( z=VR)(rs>7*X{?X7QW>3uyKp=juw>8(jK;vXJkjaFZ*&?#<=)d&*V$FE?U_W_*5@Me zHQAqwH?stoR7z!lS>D`0HeF^aCav@%QSh;TWc<-GePqU7yGJ5n8htRIDh%c_{n`vW z&kT^K$?S?s!EN-Y_@?0LzWJ?4z2(^CY<(ze>beVgD%h=(TXrraL#~J`KD1%cD-BX4~pj~a>NWY;T zK4IIFnPS-U)yOw&{$IZ*qAaF5M_fBWGqZjjB_>*_=_N*Uv40*NHa%?=d7OIDGc}iK zqIyh(pK=yG! zZfvdpYcGba07Kwxi*k z#*wSCMJV4nJu#9~aWhhKLL-aiXjXx;xLSTrd!+TNk3*Kl#rANTjs0_FeEfVqf|$$*98(9C!aXndF#v@zBujOLpk5j2mreV6J;*LQpu}q9Mn3w+h86e4U#H z<*sQB-1mSu8L%$&aKf_h%5Xr_S7A6mP&ZxB9~?JbI6p+WJi>{`eft81#I;eK!r;D- zz^Fy`N|(`o^2S|eu6&a^S2B7N)|>3yp%^O#xf7I~65I*x$a~GvtU8Z{b5_eHM)GQ> zFpQMZG$rYgLAV zWu!@^V0{vqhJ1JC5DfvdbA38scr$LgQJA|boCy9&Esf~l$yLZvS3NkK6&7IJDF!X+ zu!ew=y?v=#Bx%9F z?L|ey6*-OoQ*>FUYboHUg9lt1$vovsF<>4YbwV>wPdb3T=NZS94*mrNDkr{u_>r?p z@toMB>2sW(b0S1Khi3Q&^JJEjKJ%=UFEFol*oTiO^4zC*oLC%ZYG`ooNkSa+;EfE- z6Cq9!m}fMcz>Y%noR&six zK-aL=eY8T<7P9sG6y4h-qhZr~{c70DNDSV6eH_>7*|K}MGuEY8%%ha42ICyZo?2sl-yx!eQmut*K)y2bS<~{Ki{f zqF}q_W34VSSVuzl;T^%_yn2Iq1bh$o#o0b%Pok@6EJntL(3-je0Fmu%2sc`~OVJI= zT2f_LGZMO6A0S7th9$Xmo~x!V8orA=bImtg^JwU9-VxT28Df-6$s-ZZ@-$19$TUKw z;ErG(e#l(*+4x#_s2VJ@aK>=6y$#l5sTU*cj%QnRA_!WeWc2-b3biMU^&Zis~L z)_}FT!Q#!>T|l9`d2??!ps08}$;^0BXxGvKhK>y=I&NvA?PIVzYhH26B;=NdV}}H# zk5`bW6g(0zH(jsmbI007Um!yRGsbEME$c=~R{~a0j^&eb+mw43S9sAjmPf}U4c7_} zOO)tDJaX`EIt%Xd*!$2z(>zeB1WCcMlZ~R|sd%<5Q7O44!tS@Q>EaM;@M8LK>`rDz zQVh0Q_1EuNHU41+0`CUAlASyiI270r%dE((t$QUVe%+Kv*e-K4v3CM8m`5bw=FhRW zkRd=+3Lz43cd0xTf_Kv+rHfk<#x6(-*DFC3Y&YjceW_tB9ff<6%z(4Jl(F@aAzu`1 zk9@PsVaiCvpJbw&+j`@$4ZD7c?>jx1<@?wp14XNcdjv?0v3G0V0xc z%b@M6!q$V*HS=cw%78O{d9n#rO03}v6}k`Cp@_LAV4mu$VQtHGVEQZyM8bAyKZSpn zFGGkj3Hi!XLC4fkh@XI)Kc?R5hH;0(qBOjM=MsY8E=RQ8&6Ih4q~ce}6Y4cV_|ZMQ z8QZ5R!F_l~LHF?X*^XV}=k7sGNri(O)Xf_026k@c=4TOr70Sup4bIQT4~62YHn0`Rn?s=uLtC&@htNM5U!TeKvNv{{{LJXDv9_#K78O$vn?@ED z2kV~Lky*(ctmkw9W6Wf13US%nL!|spcKM_{GI1YYFq;EAG}(pCe*(fHVG3c^2AF|$ zAR@dfL?z&|!Sqxcwh3*L{$K{N63}oi zoh=slCp~P@t=hnUn8egxANMf>5p z6}9_{riPtOiuTdGoUsNZ+&A5uyxdgW*WL$$fh2v!eJ~_-Red0semsLVn5KeP zz)tD{`apWl>*oD|c<+w~c0hpPJIq(|W7JW@MeOcutKaFq5`w!^zydd@o3V!LKKKyj zcy5Nb(cOBnP8!;XR?RAzgd5evb0~$bkh2o_^s8EPzEG6q+UoL);ow0L-4fZfGXt8Y z9N}X4U=#74&n!8T*Yg+$Hf`oEBLj_fOS_3`xw>T~6l-ni;si&0MK$-1EZf4tA(f71 z44t)Z2LFZbwrW;6+OAh79k+=%Zfy^fA;Or{#hK$!t5rC*?q=~sKsA|~h|c4&261=L z@_{f&SQI!fa1XW_&w1Rix}fzDeQ#(t6{5xEycIn}+^7^>#q7L^yu8kNWC|e?ls{qN zl!BXzM-tXiW~$(Ax3@;W?4!^WzMDJG*=UM@SAfVQJTl}4^2wp5Y!Smn%mrZLBAIc| zT4=%2XEqI!V7$2CY7j9(E-?8nNe`(8kx95T$I0>jrhY6sqDx5M6a%KdtqL2%RMQMi zfX^0r?x_vdGCB#Dmd+d44L0ro>jPoXFtxzWQaz< z!=LL8^x%5Uk$8bpz{8)FiGjlQ@xVy<9_~k09@#ol(TRBEU?+@V*&!kYuLPCFcjUZ? zM8M78=W_CZs1^)q(6pjGGfxJ?qS5eO`ZyDB`0L>VLCMd~(-AIzM0~gWT!}w;B`CL7 z%acunDFfF{;C6uX+JPfM36~5U7kvjx5hd%1O~ex{BVDI$lW|)l(zX&G87kP7(#g!u z!YGMo_-@T@Y;J${svn((M+&Z+sO{qO5g{4@4}b2gG_1lXkC0oQig&F<-uL2_AUqEW z!wx+6&)UW5;awT)2-sfEl^l*@CJ3U8=H|`J7(`)vt3Wh-H+M%)q4MUPc(02NEOmzj z6~v-)sQB1|>%wJQ6>nkidc$X@eCLU;4_nbq=H(DIx7(!gjdM%xtVRU{g|OOr01 z>yCqqFdDj-cLj4TV9k&1=InPdu~{K31Dj6X6#`0?qc<~Hd4af0Ivx$(Hytzbl!cUW z)GLQ=Qf!%6InZoUR;kzvf?hK*uLQP<`N$RJZdRL)uTW)Ca!V8;d0Tjxi+cU5t(#jS z&wZ{2qt0oRqvg}JT_-rci`HqT8>=< z+Lj#G76ZOifu>fzxO}+)EedwcG$oIcebAy|`i(`QLII+oQ@kgZR*~xKdfJR{hFJT+ znH*ct%+IzT)#0<>2D|#Y_NMx#o@u&6Yd{VfdX~iIX1`DMNT68n{N&o$)-&CKR{Ex+ zS>NilBZ>MJ62oKa>n3TJ3-%@p>As#q5%T~8wT&|;jp-Xq=6jG`IgM>YjmEWm)TL~V z+D&x&HN1Mh%X%o`Nb0Ur#ZR^4YVFSs9d-SiOJAI__DnZ_58v#hDOJ~PUGi<9l**~D zuEG0LllP~|-k+v;e=;R?lAr2@YW4oqrvKFFy9XAx>ly-S`5Ju2!yk)tnIMZT&W7wUHaW~tECT31Pl`+n6C{mR*xPU z6{^y~M3cs7zZl}{uGK+#^;83q`pp2duVy@`Dcl@^fR)(8hp5*eK0q#u931F9reByL zc@8IB&t&bgCT3QM*}4gPCOc1qSid=huB+33Y{A9wnOg6;nNF>uYI{|Ty~}N_o%Ojz zsY1{w=is{8T1!>BI=SSzTI8pFk^biNM~X%(h1F`p?N!^_s@czG)l7jkm%#K`Rkq-5 zdUd2|;}4@c8sENQf_J#qC27&!UssLrdSXYMaSynWWL0_%V)hY%@8>dl6GR?xp6tHpMmmw8}p{GK)X=x3FRP!C1I#puel=Ti%6SHC@0p&%hv$z*CvJxsIj zppOKS!^4@y%{Ua$pX%%zO!bdsQu*4@soa_9@}V+83^t@fU{Q2#%ZqbS*JZ~ z^{JH7h{Qm`-{}8h@}ag3WO~~6)Z6`DKK6Q-m&I0#h}7K{dvS_V;}vBV^8AONqdi#b zw)5Kr!p-z#aSgZEB@2lS<}m>!=Gtv>Sc&fq!2nm-QY5)I&2S z^tE{3m&;I=hC|_t9+k9Dlqut=PV7-K$zrOOb?=eZ^|Crn zELgMGY3^ZI91<|^p>gURS}JU2%o}5zyqLf|{21HsX?_e~ z4u0Gh%QzWVYE+KfRz{T_^KKOIPA*2IK|1bVtex4aN=ZHAK|7gE_JzY zHTgQF;JeMlDM3Sy4~NGF;WwGkT*G0xxP>=bE_UI-9Q?TNDRDBc)UjFjl8h!V_AMk% zZVha3woxP9*Wu(I36Vn%?rS=nLX2(*Y2-Vm>lAtNbVa;f$3}J{oaxgQrJGocr-K;F&6swN5O1ZHTe^cyOz-(LU z;xdzEQ%t#1baQZKq==??GGN)$&gekq<@7#y5gxpOI|EMPW2-h{AD zw!AnT+_}@QQvA8Gcq9m)SETud!?L;Yq#Jc|rQf!8Mo5;Ivd|Jf*mD zz(?a6)=C9&4#VN$&dMoD^JPJEaO6n>N-^a@;Ni=W#gpdCfxza=l@!y-mkWW-mz8gTwGa699>LV;2b=ec@`;_OlUSoc4kB;M>cd6 zj$tjbKi4n}F3!yShc3QMcy6wYjE6pa85kU#S=k9GrYv9%es(@Tp6QPYo0(Gj!!W0C zYFIHtW~x9Zx6VN(IFCiS(*inqSE?yT7C|RFo}7Uky0TLLxmbqpa^v9_PJw0@4$H+Y zd{=;rT{tiYKW0`xiXju4gQFvZ9#8$}$@>?LD{mlhat_1ctIa%)yVj8bC2*LbEwCGub&AGJ(1Hg|-hacA>Bw+#)0t zqc}&v>_OcF8?$v?D{ImqUwY3fZ27}N-AC&i*`ONpvq7Ods6@spMM=sY+J61dU|Nmk6m zzE)lu9B$Sw4313CPK5QX8Th@fWGl^MG@nD3qzsN$f9($BPP;<8gZrz~asC@+rfPRk z2rv{|knT%0Xouc<3%LwxbI`fB{*(sUni|5{xM5_H(W0Ku@wonUa-eh~QH$)_Sw-!L zAYMAh^pJjTluA)$L{05WP^3*4lD(N!-AFMvlq{zETGG9F+#ESGo5>~n_2hMnv&kX- z_gd}9el0qtT0Q_H+nssRvVUY~n04k5@>bNmXh#G!K3zF2;~tBf9tkVrr~G#eazjvUBK(%|ixWN|LmeFIrr z08_JbbHPByt#z#Low<=bx@5V&jD0BEIMZqv>7bF+NbpzVe6UfUY#p*%rJOucNawOl zSMO=leN{)%J4B5L71>+?wK?oOzY}d%I;&mJ*U!zX|Nloq5M*WXR2@AXqg_#5=|KDt z*vUYUDW#BNSQMdF3-*=AH24J~eF_P$77uG3v;wmet%q(;x2`p;n`nG=w)UFvtlR;5 z&o{N$XexE`Ry${&SNHt}n^=i1%)|S0)3}%t!8SY%kCv2~Qca8L-mb6pt6Q19Cg{yB zKQFWVEJIp!=?;_iE6uI0I}$fN1%lx%CO2nVAc~>$gPW&4*0D1KQKCSDYK*b=f_ zLU$Wyvf&9viV2v#U+W0W$WKqZ4Op%n!h>&PS7AEuk;l5<* z;~4rm4NIBL`JrNqkJCbb6badt(9hx&o6tsEuTq*5TM4TwNap0!jlmRk%VB%iJ9;gn z3aKm#_Q;j0dLUJS4ct;yKuQzOtfQt&vyJM??9`v?9U1899Z6^Udj>|dTCvKDnOh>u z1HMV-*9Y_tx7O1ZvN~O8qa5iCN7vw;+7eA|T_2TtBWQ|A&s&E)!3|>(!y1~A0$ooc zV}_ryNHuGunn#6HD=4+PDfP_7+*B{}>xGAJtt+56&*d~ndT>M{O1~tOMtXZHJDRr+ zjYn!WgmH}oE6pAvizCIImO0XhHI;+~gLU14WICgbI?QZ@Awvger^!kYHLJ$N3v!-W zHC@TPrlOwiQm+V9Y^#Kj9eA}#0`RbPF<5e{VoMm1gOL)K1?+6uOSZ8R&*?G_bft$< zt?5iAUF*JPq`pp1iBtmXO!b8T)uX?gUu@rv;xp+NdRtC?ot|qS+%TMQZCoGB=P-7cuT-3`_J|7%FR9O%a;(k+Zpc z+m3NFa>Vwf3P{s45G`ezHF}33C%4RK?+lMQS~TsM=I$z(tyah?1m%YKgNzZwZ=cz}Kv-;G;et%&AOp|=IUVEy~@}Qj});^ zj!s>HRZ{fe*?(2byAiMn zZOI|b9x~mo)OJ@^+Q6pvOjP1H&U?eG3e-86)bgq`^r0uD{p+({@3nlpl12BVm9KC~OG z&pMhH#jK(xN$)*6dQ7;ma8zcO(Ysxk%g^s&O=IXc0P9!VYD*91YydBE>0VqX@=&3! zFP|$E^cyu0WBE6v8~ef#q-XTb0zz9 z;F7b%uC!T;jQVkF{h%v* zfkK}eGPZMAiw8RToD}lK=&+m}fXcO=m>Sd`3uE4>mP=!A#AZ1Sm zXvH^}M9YQ?nZsh3vB9A-o*FAGyYd{Cz}D4)R6)BquO2tp1qo)}x@(Mzv^h=21`Ojm z*fiFiIU>YVZLdf(w!zHS8iL43D4$Yju_!dmY^-BNQf+6QHPgv=W2Dw`pw^dN=(F0m zS=+dq^ncslRz+&V>gw>||F*8*AlE`qrF-`1Tl*UqxQw0PT4m~<-;f&`eT~D)bXA9G zZ5%YA6h3C9djHp>b(r;6X|TrNUh5op<)&u)Q;TX_SowanV+Y!VRwX??y%XbRtmXU- z>KBX_(?VTqBW6yt)34O#8DokhjVTuFN>0^w;QndMJ>x*UzL%kxPXd0VsO@X8b|_gG z+UBHmb|g1KU!dyqnLh5Q4~No)DZ?XLmyvJQ-6Corb?fIpBcfu9gx?Z~_y{45Sy=z?j#03AW;3TxZAWkYjJCVN2GEB&vjrR##=|+} z48TT6Phsh^Y<2<_qkM-E(zWRr=C)0J)E{2&jk$ShUc@|EIb6&$W_{}5xOJ{=b)#bq zCTpY4l%~l??F5XbHA0_VzoB81K5^{(A>>QoC#^&$31y!89*xsY`l?0c5-c$KcTI>}rB$IO=j2w!j8JM#J=4ePlVqB} zA)EK~H6HD|w&A|wnm5)KeU-5^WDYf|xx>!1gyugD$+>e=L4%S}Hi=eID_|X}nZDP+ zY4d2x!A}}pexea*L{BLTmk1a}e7*LG&OEw>qVNc?kt+hN7E_fiLv)Lk!OABHY0fpH zt!?(I@hn%xi^!O5qjKpR9_7OBn%sh+&T27CWY&>Q6M=)jaZ*_v;+mVuEnGDQa!1sz za`>~YR3V#y$kdg~_YJNZJN2~LT@1rSToqjF8;?R?!>T~KzTr!_7y*qEQ>(|SA1y{! zATvcG_d#QQELOn?Q|s-pMq`Fy%9W67z=t(S#|Ed$W{s(SaAl(CR^2WAJ?nL8Jaq^fP$)nryjW5(0i`N%ivX|9Y{P^|3}94qn$>wq4Go+YKO zTZhqivK5Rh2y+aT4dIQwePP2QElWk^N3@J_V;)Hdt)ye2^UrV^WBZ|r(cIYB(r)B{ z4A2(4FSOaHe5!!%sCx&KO$;Af7h{&N-&_G;5JM|c8lLMJ)iAlH503NrM9qGpx;nmf zAQ5WH2Un|<#y4}6np+qIYFf+!@L?86%m>z_Hp18eVW%XqPx#yUw&==dnZ-F6)oQx6 zgSNZe82yICib~B7>SHTS``Z(_^6F;>P5HIokv`C}p2vudC`y z71nl&5+bYiY4r@8D$J8%Y$VpFO7u*1pa@%5o-o6Qu8|f4lO=_Qu7>t}YHoT_eJVNB znM!K?glG+zgS_E;kh|=(8xCSxkygC)2w6rg|As?0qsa$xWAjUA-(aeLBojXCWc%`H zD2245tNft5RvHB`5xjvD{YEHO14iy))*=lP$hm-jpWIHl)_*p_WU@tLiQroX= zbq!ln$!r8Grhg2bU}*^=;FmCa8YYgR5{Wa%RI? z=Ag*`tBiR{n7s+mr0_<2Wf|ms|y% zf4v{Bb-iq-89P^-uOKElUO6f_ci}LwzJ`XnRQ3S^2Q4Z{SJor@+MBYDr6ufufv=twM;k{MG;m{RYHiEVPiX7Ed$(+u z?VyI_{fOB|19yIUST6{q>B{9p7LCk(H3eKShOl3sTZEk;0Rr1)XLc80`G|Mln1^s3 z8|VFV5$&btbeOOguFBEkzuf}+cTo1i9-P)$HClc@sDRT{gSmcv;ZzSvxy*vpoZ8NA z5&hpFtdU`@gskM6p#xoQ zV`h(WI=hLJde?-0ILQCF1* z=+2|5wlJA4_MoKv6BX-Sl7-sdP0zj_{bsQ`eP2%}uDQVxJk7H-iW;~!8#P5gcEf5J zD(G+P^ZeL0g#B{11G+AU2>PludU~7<06-RGq4EXg!}b@I50@4;SAkLcc#s1`jA+lrHaAHunjvzmi437>>B9tDPfgFPA;E=roRo~c$?SNEZ$PbiX zS9x&#_2R*#ltJ$7^5x`0_7{{3)h#JUZ3&9g;KzX-C@TjpE$rfKpRsyoj07Dm2<;{X z03z?nP#WE81}K)>%P%S}WPkO!P$}(!!C|nVqT<62l$C?CQ`q{pmX@;3%7^SLDjzB( zDRu#16>~u@gEMux@_nH`Djk3Mqf((&DfSJv;nKhIEuZA35FkD`ez4%ob|b*W>nY)x zR5%o1(x8;cB(w9&w>%%VztDWRPGK8b>YAGvq0t3nu%_ay3xZ;hN@vP8MgteJuPyjc zX-P996-dg193UwVDkbS4@`j``h4zkA%gpjcjz+~__GmOHB{E4|EiyNa`?9svT{uCQ zDW}7#XP%2d#$SzyvS>sqo11rbX3J4QTcvT2mZQ?4N+UNkoXn@ncP3tZfBW-d(;{c# zI~7RGhaMm>AF@l{d6*vR@6@K+twd%)Jy-NZe1Q#V=-?Xw>f&9f$W%PoL6+jdbqQN> zFDz0|E=X{GDZ<2Ob{+z{F>V!@bhy-DQlVAJW4Egwpev|n5oiRc5PG0@^b%IZriMK427;$z9`ksCdC#RJdfB z>=Buwf@MLh`r7JXHBZ~DWv?1EdcKE#rbs7?$-0q&A>8v-S%B5nv!fC6E%4}MC~a_G zVdZlt+HUL!RQ&abMuS$u$`rt^rvc%(F~v_JKzx1zwCqLWkWkqpDgNBu=8U{+u`VM1 z=#8HuGWHufMIhm8bmKrr1zuwo9xt5$*NI4lQYAFMtz($tE_D{3zo;xMw`k0xS+%oj zjE$#z)@oT3sUQtzq4@fO806GiDtZB$V|N-%qp4VtJ4csRTgNZ8LR<t7lpnIJ9)Rh1o&eAd!ZiJ8`Juqiu8 zHF2W*3(JX2$(t!I#KK+q0`ubgOU#QMBrYQ~LCsg}v*@@1FAWIpTwak)6Vgk3l*nJ?eRAulI^AdxxIDXFn4 zt@%ZNX-sWUr>gE`FO(k<$0T|P5eF1SWF)I6Rj6%EXR$>DM|+0ceFsx-S~NDAlgpHj z@)zj1aDB^$3zHHvSsYB|n_vS>M{rDE1~gq$B9ieJJ|YpX9%WZyLw+`Th}>*sO5Rjv zq;7aPpId|rJu2FEG9@}Ce=VZZaVx|&L6H0WAA4^CUsZL)kH>v&-LwN|ZKwJvSds%_QQwOU)PwJxm-tBA^`0xGD0vbwT} z3aI~?yS#hPy>st5bKgzE@Av=p^Qk~`mhYXJGiT16nK>}Gyt5~4c~=o>M{rwsSWKm} z2U3-;BGM$}9wxx$-ddf?wb|T}CLIM0H7w@UT*sr>*bhND)P9VnZ8}^Dh^vH5O3>9#e-XOtT9OOVvXQ}59cj~Dzh&6@*Li9j!N5CYG ze0d48P??$5(JxXAd2wS)(bo^!GL_SVNXC|Gvy6(iw!({a=shY`Of8%reOZD8j$w8S$|nJ`mZ9x>`2 zX(otendiSl*fL-`du>OXS3v6bNPu~}LSR(trm@P{f}Qs>ayGhP z78Dn+&8Id3ON;TCPRL)uMz?pdA1jbnF^lkR-@9FX1hvHJIvaq z;7V1gF9}nrrvNjWElVWexmw8I_T>*qD$&p}6vSw{9;PuQ-I1{f!+A7@8&j>KrI_KU z(q1${RC)ZRJDt1{?2xw)*h)qw#HicVs< znmJ~f+*}!-s4|SBnQIt;RGUkvjO1?V9!zm0v6*WattOxfBv(WCP`PnR1BuOC!!)W4 zA~X_*m^>!gnMwuEe1ckasw2>PQN6za-19DkUg)09sTJ?pSVT~O2dY-deMJ*YsjGlA zXv&iOOh+S>&WGK?JBX>lq|RURo_0Fc!K?B1n1>))V5~7n>as=<;CsI{<9+f$s(BQN zaUHIp?W9zCf?4?rx;2lBwoHgYDQm~RCWcw7^bW! zh2{ls4Dlm^dl~Ce3Vl5QEA+I(90^r)Dr%}G$6B;xbFd7v_^@KCg}A>ExvJ9Bz$lm) zD*fyTM^)H-C?>Ck5rr1|l;ZDocXD7!GThPf{v=D3dkY^Og?qL{EK!q6b(W`EyPONm z@qJ#6g(2Y~&|Efn5Zfr#{xlU-dkc`kaDjUOIpIyQaHxP$s{Lums=d7+OWolLu%%;2 zp-V>);ZKSM4?G%`QtIsiS*fo8HXTo;3)vz@DGxwHR_-pMPQe?a(cl(2++isW;DK7T zyB)PzwK4EoR3Csut=`>^+Ft(*x^n*xM5Ha4|%9`_rR>yS;X5`NL{3QsAQT_2nY7StJYb>n^LLQ<|!6Ry* z^%cRYr~P>%Rv*Fxw)y}f_Dp-Uvk*yE?C*hEv9|+qAsOtd3GiNkmF5=krXWc;28s9Z z>UnOHF276KPrJ(t@}LZ-vJzw z2!bD(0Jd6xFVJee3CMMoa`t-D8mCnm!4I}de*rk>4Lq+(&a8*@==^g25aId4`Eyf# z@dl;%b}#NLb*34w)K%bldwjftOVbOgT5lSwT3;HhREJ0bOGl7^mi8Bcr{e{bifqsx zlaZ?v56EhBi+FS6$0uSHdeJ}m#GcgV4da2IH;C{Z1xD#BNBPspRcCiVRyaF(5j@_e z(Af*DLRS%~LI+Qv3Vl6rD)e-~44&!G5WL*AT2}#SBCc}I_adoUZCYk`Kkz z2Jl3!)?Gl|8HKmlAuh@zluw^ZJZ4I|ki!oLGhZ5@n17qd-5NsJn)1H}M}Tm0H37N1 ziC7Zx0xZBzrQS4a)cOiwFH9GJRjD%#RjI3hG&im_J`pO@<-Itje2YwSHKRmJEmzK* zzrH>RT3`EzH%61yfh|V0&LmW|t`4My0G0Rk!YS`5z=W&)3Ve1d9gkYlR9!7p zMQS7)iNj2WN6=Mj#|_7anu2u|ymSsZ#8mr7foNvBzDb4$ zhY8PJ5$rQ4mj!<$e+g->Dr;yAi8IonRC%K`P`7eN34tPiq+>Zb1h)#Qwq(4ZGW;kf ztZ_Vf!yYAE#;~XN;tFdZfhFzfSf)LdXvO;;m4X;vx{Nyx%@Xb?!l%SrCcs0p_GOrOilA^G_k7lLRB}Wyj%vN0qlJ zVIsi{Q11qtkooTGu+AKOb)+TNs(&{83W6hz%&8{lZzKBan&umu`H-JLQ)}~1j9|{6 zZA$Z}p-zRI)wn9omH%;=lQq`~lQh?bFnBq*L1BHR+7kLxq(KO8=cO2J%-~*iDwBnm zUv+s2JPL9naA%EafqGXvYsM;mxO;8t6@2x_=~`psa&67ypejvkb6ZX*m?ON`t)>6r z;uXXr|5JY{2{d6|yu}&wKMrk5iFh)=%Y>9MlvGq1V|fWIV+c>NRUQM+4&9-)0|B5F zs`=B9B+LHAd8zGQVJ>e9OPI@r-IG#S48n&e%z7Gffp7{HW)DrQNDx6EEA|mpv0cr$ zRkHK9p3)p>ZgY)@a%}!I+_?fT8pfA-uNTH3c9J_}lQD|lDq#$Rya*10S{urf+clmk z65S;z_PM%WQ2Z1tgFImfN_kT#fn3|}DFN?3`?^cqlRyvVB+^%xU6XKL zOC~z2yfQ55#^P^D6Q-oE zYEpfi4`otqByUhsU6fvbly+o^S4B$gr9)y?roxuK{pX%S`Nci5D^K?*JYDCSMSNDy z{cGX9IO^B7_u|~Y<~*|I?ydYL8PQcKDTnB%a;NJoHc^tliPfzJ9@p@-B;UI|yM|DE zT1n{Peu~HS*|JA*+#Tc()42QCUTE?9Uf)hErBEe#9>qPA5kH9CU-ZwjJRD}xvD)YYYJCSmb!q(%H^3wyl_wJ|C)@842&Yd_Nio* za9#6Ai`lw+_?4EWTT9Eb(%pEaQA@D6DOL8ldk6sEg_v%)3S!n3quiCT#| z_n1@}IHHxL44k`%v^<(!1Xas@xu(Hz55>w|CD7Kda+iB-<+@iySN{N5R|jT2s1l*t zlbw<(g_c~it5h{|cT%VfTcK-9 z)``bjmBcR+qcn5M-AkI(C>2b8drtsd z%EQsv5^X6+j%$Z_WQeP^rZ-B<*pn?w%On@}R&PjM^Aa}B7&Ky86o3*8)*zlZ7}DxR z4*MJ^_r}2+g#I$w?VcJANo0{Q2#rHI z)JPc1Lkf*5Q<+g%{Mh$QC5%QR<3%#bOznz*!_n9jBBg{c^r9Dc91k?o5G*w?ykWes zI77RvxjmL{D(TZjpG925_<)=LB~@A}#8fJ@wuM+qTSJmdOS|*P{;)pc?%5rTT@S3{zcDgzfY3eJ-i7J5$Hkt=ArTa-WSp15JQj^g5~Hm|AI=ywipedpPAuc(+%@&qqMS>D#FY?p#_&MgDT_Q; z1i~7I#4;4F6&v7H@MxRMeN50#CH`FnI(r-%dqNgiuZD#+iWd@jyuKnB=0G$ajH!fh z9_z7GeVd{#f`%Gxt@q7++WKY~*gnvhNXQy5l_eb5`g>kEvBn^2GfX{;K?zX6;e4>E z+tVH@UjIb(VQ4JiU@hx}cg7~iL6%frvC5l5Ua*3X=!sDMBYi-r58{DCk~X3wM={PI z9yo|(6l-qURvZ@d@1)Np?4r&t_H-8RbRK;bX3gitaHpg?67y9@J38P&Si4n$weK`B z!oS#E0v>H)RCmjCYlA|xpY>7R7Po5tk1&@0rH(_6Hj*?_Oc=*wIRzMrMnvWs87HMY z6U6I7!3HCF z;u=c%_~0Qd!3Xrfr>Zn^I z$u6~edmCM>F-Y3TQdU(^u*RTK7!`o6*))p5rIMEXD%!X3)3SUOWJg#c!5wH0m+_e_ zgQ4cUj=@bWE->GtEe&L3r`>`F$)^MZM#KkX?JYfReUG*qc zlbg$0TSc7MjvjGxb7g#@dSe*AHkV+u=QP$*+SJEx$c?z+G^$DuO4t!}g_R4eI3iFRC)D{jr{t;}j!gV5hA%RtZDQC@^s9>8OM zyoa{(Sp7Dc+7#KApl)4Rx(k+$mjW|CMNmtUKGZDHbeH`)rVy(}HMd_73zDLeWdA%r zy*m44|J!Camybw85Qd2Lh?i|Q0FBt!FVk{3n}y zcdYq&{8lv4P9IJjE!x@&uDpWx z2$iZ2HVOCGA<(u?Bw~r0RI0N))!JpZIy~$XmC6yq#2$jm9)}c;Q3@p~l+bX;k)i=t z$)G}%sQt^7$MQfmN#Uh-nPQQb;}GafBT=c(Aq?XsJnVry@TA(((T=KQ7LM`Y(*eg+ zG~x70p~Cj`v_iU*>Ii^9AIh%$p?_y86D{0kT280tg#08t;r1BX&|9yPM? zhw{KAt^A{ghc}D|7OW_wPGnC`@rLohBC9;4Mi$m69!M?>OS{&`_(OSMk{3%-qYrZ& zFEp|$Op0Jw!_Zh#5WkM^4MG85+es5`a8q2xy~Vq|KE9)MF4UXm%8+L(MO@A7XwdSWub^T z)xumNYN;d)s~E7Qjz+> z&0|mFR%Fe8FpZ8;qE$t`HU=G!Mi+0HP#c4Vr{u0`^lGh-Ev`9Pby=m4Weq}qAy%fx zD0RP5^}s^yQm@pC2kBQTehzOKfMN`2zb3@@NU_v~o!HQfipv|5iKW5#$i^mTBj%r} zmV~`0Y;xcNBR{$+mWH0(+do+^mKZ^;TCh1ze&rWDl0klPoKV2<1|e_^vhFv_%bM%-7IvV6K^$#CszxIeNSn}> zd04^aWuvOftD4VnG_{SV)mpBu_HIxP#hA<84IBZk%_CexSS_?6#1`e4fUX5_>GD@z zHlz$5cpewc#9Nv(S@6}gMJmS(>C@64O*g~46>$jltJEI_7v6!c#22bF+15zJR&l!= zs9}4`M;jY{6e)2wve7}KRJCIeTNp3UeT48^|L{fpsnmBtXpVfUJwyRi)Q#O)r~yRCcNTA{)et(59v zZey3zR+qj#!pg);wPs+Mpq)HhPlVQ~bfl?1AFm)RZrjiGHE#U(?4su8ct>aRkRim# zpzw@-G7R}<#WwASBMNE(h&iMW{zU&Qo6yz^t7*7>5aBoWF8K%MM^~v3&a-*plp}`r zA|26`q}^Gb5@|@8uo0cjYTZ0g_HMv{@`SN%3|^YgvtTcXJk5ppLh%Tf#BCwCuOoURs^o(VS5^+u74zMcT`6;nzo< zx$&yJtVDmpuxOKK)Nnk&~wcJx!I?Cb0yEx+sP;H;bLY9OhT>uN95c~#>- zSP()lbqP>?Io*lU|0coJnzN8AluMO5rjbG&O| z4yL24a+OMFKc%QJXD9W7ijJP{+Jj;PSPI=76J?+Lo7hV=`M1nhSQ4A5)+-`ngGO(eP4Vsq70T}LnfceNdjmGfJj{rs~}#nvkMkj@@N?xUj# z+!p7uF@~14XYHvibbAl=H7?J_b9{+P!kn{>^7+a zLd&7};)C?fhBIxKIn6`u)d0oc*se^<%51-?NkQ^b#9d*r0WT);s@Ps7s;;&H%9O-1 zUZQEwjLN3#W6{=;$wZf*HoyrqRbsDZYV_5Dx`K4p zItH4V3E3VsWOl7fX}9Y>8qoI5&H*@|O!f^tJC|nm+4Fq^&)(b?%MS18Ohn4?*=PGJ z(HKc%-(SR*P^iTAK(wYF*3=h|Ma-y+fPJC@|Vr2;A&ZAm#8mDqtE@ zqtda7k?n;xJqSlip+q8LMeG=si!J&p+S!@ts)jOat+9rd_E>8!0g=nTw&55Eh5=Ki z3a=s%wb1|fX7{*MgAH6>!r*{)77`{1XY z(Rdodoh#7FD_{YRks7yl(%AoQ*}M7&=OfheLC#>f=6{%vaqDZ72fCw1n|wzxoKENs zRr-g59@FaVds{Go0@<&JTKmT<_lsy@wpLV^-U2+bUq zO^({M*&a9CUlCBL7of56Y`cHu=Ckm4p-vxwIL7s^0iI5*7&n0;DgXl0h6~2$xWpnt z9V|IB?vE)UJ`e(vK@P`LJ~Ar&VbO-o6BPu3Nuz)U;>eTm5JDzm?hzP&X$y_c|30sg z^5LyiE8Fp297caEy(_|eHGK$feVVSXHjdozO-=rq#Gd-n5^!DxlH)#GhBi~JwfI{S zv1mF{CPW#IsS+F=Es0dpUD8!k`jA{=?J6y)guoLJL-@T-(_sUF+*AwQ9I^9OZ-rFU ze`ils6SkU<-zBNp*IOOx8v_ zH3rynqA)1j#=>+A>M2EJ@wsRyng*V%tzq4H9~oMVIi*p)!mQHP>hnsXg~e$ljXAUW z2jw}Z^>3{{uMoWK=QkGtD0fpvA_-m=rkAu;o>LYAEletF%$e1nd(LV7TPx2ii^vwH zl{Mzf>W|+!t$%CPdCTi+YJ5+o_GzV!m1o7r-lefO!qiGVg3YhGoHf5|9<^UDWgLm9 zq_UHp2EKe!ow7m}^lqO~+E{&7N$k8htE92=tjZzy_UXeRvqBVqH%ux`1hCHuE{B$= zf7p{UrO~zHOE~+)z6}{u3fTi*o)P=R<&6B6pg8>WLib}yr(+NcEvry#$Dx`_p-vC~ zEDLdN|F(=d{kKEMr2dVSXH`!5uumV3@XNAB!kF1 zvQMqjUVZLV%D)D*IJ2xZV_tcZmt$&q2i4hSxm@;%Wo?z`RL=+#rdRLAL!!K>hiM3W zn=8)@;nHQDo$1u%cn8nG;AOdS@c4e1zzJEbxB9G-G&*rsNn_PnRWsx4ldJY&VUUIf zyAViwsLt<7zEe5LDt8Ku!f%_l6T^kXucJB|X;z^fgYR-tol};WC`?#i7tWlr^hRM) zS!3ldReE?^m|Cfa^8AtnNnvJ5Th%#bX_odmWo?z`jH+Z^3NtJ9P@Z4*%B?W9tg-5> zs#%`)$yNI(V^B^56;LSmQpch06_q_+sye4ia;p8SRoW}ht&qbi%&pK~d2WSQHHEnq z+6S52Z~ya}->;842HDG-;_R~4%JZsZ`wCO5bWopNA#qroU7>^O>`FPv_Suy>sLn1+ zXSPo)YpXn`G$~q`Roa>}udm7FoYuFo`m9P%7>aW%bx}tkP52gPmo`_QS(-U6&Ma-N zKC>(ZU7T3fT76!nRCaN4r7r3S#XUcY^xp4+bnV}9u?dyd(q?U{2+UeqIIm-JAcU*<3qrj|8Uo;6=HLB+Wf%GPC- zb?_4z``3mvt@N2W`W|x*Pan3I7pgg;@5{fXjw6*fQvWhCgw6ey^vr6w$glVO%Rp*r!c(G3_ZOoX} zch7N5>f2U%PR4Ug!u*VW%2;IeYXktY#)`9QR2&XLs?lUiOwYw08pXF4y23KZ3QAA* z&&Y3$b!OXzBr#h`p8iYUtUbMnkdh?~fYDeH@qIThs^D{2syTCzhGo>{q05|Tuh!s~ z=iAY>cLresp4ABcWte`^<_|8tSE88b27605+J&2gDj0#>8>%! zL@L^0k6@{c2w1#WheMxC$Utt*b#%%yY~ec!+PJJFSe&gfg>~9xb87oX zL9<#i9gDZcl2AY-2aC`uMyF+2V=}Zo(OPc`Yc`dZw@t)4kcTD0u4{h)EtYTLW+&ZF z*ng=e(zyu9A;hE z1ofI+3sid$FRviT;y_e4)zUyvNhuSP(Acoo!_v1PJFqXspzK~(CmOXG=|jfa7UMEq zYqcFqG-IInm2M~NzqDI1D%C)2Hh!#2-~6>n%-ve3B|)|TIA*~cp#;bHcoM34U1S^_ z{mw?h$Knp;Hu%k-IzO-f09$n-^%;%b)FiMux=2~`r{bJtO#$ZA%A6oO@~1X?fiYoP z`!Ad`=X>XCj0s)yKQ;RCX_Ln(DU_>h#H6zm_VzJIhCW__BG8$X8 zno|v9l=~h{}IBiwi4#jp-3xu@)qF^4BSept5r^?CMQ4$PzKuqRq zN@%(k1>G!+S3tQq_jgLBhE-_ehP5{Gax5?<|5H0h#1_o;q4`p5M_SwRgmDX?gcDT( zLm@n29UG!9C#^#`T4UpKZO!9y@kDELTMk!CFR@%1m#Lk%CsybplYdIqSkPL5RhgLw zyPT~MYj+U80k6>_Wi3Jh9j}d7tDXsOw^kH`wyUUyhqi4+qm1tgG+;FjSRLYkwJ=^S zJzn#8@b!&@x}W~4pW%RYNT;Y$p`b2ROjmz^U8v6JUTuA$KxAHSa3EO`P}t{e1vs(x zt!_XRqD<@n$|gqR2|OJcbyIx~H+BQfEIBu})ad6WU}H-gqiOt5t!%Hha0IY8CF4WV_XXqbf?TE(TeC~(@v4wxgd*m0Dt(adPqp!W; zLg<4_P=fmR^Tt;CmIA&$2tcFQxdM&t8d&k`#ld^_^Fcag>IstA+cFXV1EcAhvw8JF zvb5s#l&2Cle5fQ0etJ}#!cx?JN_bEuJs=z>2C5d^-r0thcqRkh?Ar23CT0~#(GI7m z0VN|zRgb-YDFI$0?6U5rFIMoH+B*?bg1T}!W!1V69$HC9x4YKALw#&~L`qXQC+6jW zpec?aA*r??r~K~xDzt1A#L07um}qGVTdv<0;m`@ruQaq>fy;da~MwmhG<5{ zLD5-2Upc#jBj}CDexOD@lr)}jlGeM|>Ob4gNzhpjHIj&*Rl`;xGRa}}3;R*{v%!86 z)`=oya0H!)OD&^L{@*cYT z&gPXhHAaw+vC#T_RxpefMc{UWfQvhl3h70P79a=C&nRH1{JF-xvNIKs7bU5v-aR@c z6GQ-f*p9*stn-lR?v@-Uw~U3+-P7u;t1rRVAk^({v;uEvR{lQ*##arRZor*G)xWL3SDulX0yfYk9GZ3nUzNgUkA8N%mj}TT8JnN|` zX1DFwU2UnP?*ic5Xu*TB3H`ZlC0|dS zNGvU70Pmlo*>rqz-%2Z@3GI*)d^I~o9fvW-Cp&9_m&5zI0DMT$#So7N02ble2!_otvlq!$$GH?7!G z<(d`S;k5`@m#({8$0g>NWJ@C6Ssw+{k$)R2-UGu>`dePHR#08q<|RFnYZR2bDFppa z&GUboL#YW8#Kz^|-OjFncgvPZP{6Vflpy@0fT8kE4vUrTQP@}GkhSM=je*W=J#?k8 zne$hg?Qk`&o=OBE(QUB|KGIqa@1%NxG+vq4&w1$Em4w;YUmJ}>w19%98II|h)es7G zrnU93y8`ztMJ0|?F{ZLirl~Ow)AatTyY$$QBh;RLe-+MSXM^qoZL#l2bN%(~|GTL!F0DGa*Y0fp zzx#`~J23<6r|Hb_X};YlG<${tF0ZBu6{(K!zuS+$J*~v?j5ffjR>sE0{ok(3{dmv| zsvO)BXmB^Ch9_HNlOr{<8s?a`gRZ+m?8m$n7suOfVS21%?qx@WJ9Vb4wi0|nm}4#k zIN4J=uw2faNTi7COh z!&p2stTTrusoFh-IDy`^Nz17YGysIFXm-7Re)l!*t;0Y(qs73pq@9 zJ#*taGzXWMTQA6eL%xmABGG;oWQkzM0(b%oBi;(<`gBJ{Iu23{WTq8D;5j;?=?S`; z@;mRsvC?isSe-oUXAnKAC5LK9mn76!iPYB(GrqX2Y`CQZk`PW$WLsl^rnbpJRSvju z%x?r_a}1CzS7?qmrrCV%wn_ec-+X#E_$|Bu61@$eUcJ*DTI6JPw4(!K^KsU`V@vV% zVLg7OZ=}4axfv>eG!IE$)S`ucSVNf@?bRVtNw}NHOE{Sm?a>6j)b1>&TiKijLh5u% zyO|L7U?mekH)BGv0tg6FGa$t2J5x|@1fp?WGN3s$4JUiGAUvJ0TcNj08cnRZP5jl8 ze$67dnuG-B&TLxZS}W56$*oI?|H zA!UiS6zpT|9U8IoDf*aTuc>W_n9S>J?0_y+Z4r!wfRzrYz>xL>XehNX(hF@@RfXf2 zs2j*tpd+n|!YaGRF{J5$r&Y}(if#T&1n(1Ns)hgK?=d^2V4YX&_>3N#SUB_2WEMg} z4XU7YRYb>+k9nO4Lne#$F^98$du} zG3N0jS1bv+l;abrNj*a{_g;z8-53OgoNl2^=BwcvQ|XrWo}pZGox{M4?*6IjAVKSp0t#VZX?d(~==^8CA*}2nBq@XyJ4!CfAZHvb% z?D9ac(F+?YAIBmPLN6JN9_(}m&IRE1F9UN_I}e>zW(4W#^{wk53{P0Nx+7Z;^;Pp_ z8(|d%FnZJgTR4Y4wTJbh6=5oC(%NXDm>IoX%GvhM*FQlISM@u}VVRr4^B?VJ;51Zh zHLE51UN?X+*`sTXe$|zgHKX)WyB^;U;XRi7FCEK(k?ahqa|{ekYP-Ot+iF}BDGdz! zljV)j3Ppmi)8-6FLxa4V596X>sk>U#L*42aF%B+k{ddAiJT=LygFs=k88N+NV4{aG za!wL}ldp=DFAkC~u_i8PlXUjOH);fQi9?pnD^{k0l<{xU~n*F zK!=LdB&T6gw6ngPF^EIuXoF-FBKcvH7RXkZW)*FTf|yAh4uD|=<@?%JtIZySQ434E zvkfb5*mc1(-}2Jt;HyFkSDvE<9BQ$`XSs5?y(hj(0=O<{}Fax9KhWKe7g2=Cd4~6HbHH|RNCi~PY4Ffz{8`k#gwNe zLxhpX=j8com@mK`<|A%K=DsaYg)W@dUn?9lpg+9%hPzDOAwU~U{UJ=Oc5EpYM1@a) z(zWfWR_!v}cH~VZCdST=G&JcsvJEQl-|0_72|+idc8?0YLkQ&cbq_(zYG;Y)$$`Sw zHdtA(-~C6(bs`td+Qzi|A_B*#WvZ*4i zh2R#n{W6z~Ls|C@Avjcc-GypUYkvfiYEWm-a?d5xM&P*4U+urr*zv;s?bZU%CBazG zSBx3E?xkI|Kq_mq$aP}9AidU&T73{){5>T%x&Y-Z$4Sw6wi&odSEIL?PLnVI+7&^j zJqhlxZ?hVtj>twrA0cQ%^O$~&pLCj}fc*$5>uQs?L+qAq# zGtdZTimvYb|78juO>3Fhj2}3txV5=%OifL5WA&K25zUoljb%l9o_z9=!v9Vz5&oI~ zN3rp@lELPW&filU`=r)H0>(2N8qH+m_3zu)XnFpgtyk|Hj-P ziy-XNVEnVF8vb&<`48jINYTFKCt)qDXrI33uMUL2yaE4TWBgzz_%l*eJjG}?!1!?y zw%ZlvGuz?MBSl9}*%AIcv}h0fXVL!d5B*8e0sHO-znZT#C@T7H(a}YNF5AC0jwN5f zXgKoN`s0qQ8D2NS_`UGQ-taHPga0oo+FASCzVP2&w7nHg0pWuIt|KaF>K>M%$pB;o2y-sOf0!l)VKdYn-uL>bkrUPt(gKC zb?ik&loYkX@9qDyNl`!Z=O`VInEx>TL@B~?yGuG$czrm`?@3(t8thkWE?RvJHtaV1 zqYq#PKkE6c!TtuJv^9)t(Eh(jQN&z>rRL9ZtuHnIVf=~hx{Jyx6z&5!!j{s({Vd&C zRD|oe_3Eu}zd3Wb_RTvN4H;5gHZJ39H==(e(x(sn(Nv7Fxv-;&Yc7};9-Pu?VXPy6<=4riP+WDBmtJz3Z!Ok`7S5Fz)C4<55Q0?77aA*0#Im8ue()nV>AE*ey`8qMMd}=2U`V(1 zitZ<<^V%){+l*H9fed64abmAZ%8IUv-Lw>~=z|!zXd&WiuEC~?u-WwIe^&7p+Fu77 zXyDzs5E#ftW-107viF`H^akV`RY9gZLT&)0Ar9>c*!GmtG&CB>$j)H+`s{GF>m9RqlN zV&H*z-qaRD*X zOykjvF>tONz|{wzX!TD!pdQXux<UGjWeNIS|5dxJ%haeFq$}4Q-=h16LxNoX{(4)f7D2T0Q0A@>O_ZD`8;^ zo12tvG~mT~QzC$@FAG^XTpU1X-Jj&H_^Jf(^waTF)Ra|MDIb#9D{ugzR~!EOtM^X^ z1f?VbohKfLMgII|pn^?S+73T&?XfU_e{%kCC{OLgdt9_h^H~ir=8eS@AuJ#EPE2T= z!*2M&E2wb>a*#a!cC;+eS8Kn799(R8dg zG$(aJ+4${iT1-zB6P;vHu_-r*xTCn@^QX6#1LcM?vC+)ruJgeJqW7==`T80_G|WVl z1VtGFE7{nHd!=aP#OY{hRr9b(7|BI8$aGBFP7ftt|9oK?AREp@MzfJESpx}A(7U6i zPCW$>osma$0VJukHekA8TKQqADI9v=;B-M))Jqx#V%gt`I$dxmi@VTG+_kTaCdvkt954GU5GpC1ULgsE&QQquPI z8$-TAX^RFzNVAtKZPXpd*vhB2;*LJf!W9Bj*~o}nsuj0Pc^xU%!a*isB^MX9KG#iK zzZ}?lyqJ8=rIdXy2kUch0R6tNMPH& zXZ@n>bM))9@sNeY$AN^rUwiCT-(t#pyN;-`qOosfq#a(q%!f1sS;j#2bXcAgVz*xY z!vRZw3K-&^7-#};Wrh0wJ$`=ZHvIkzjJbz4mh|}d4?OGUZTS5YJTY|N_b+IEeJ*}~ zB0qP}^Z&_h$4tfV@9@MB&i4->R^;WQ@BZXOm^*3A4JDvj+AZOSI!#zclt|NOYtaFO z`yhIx!GJn!WthVLEOs z$~8Rx_b)Lgev*mHe3P>`?0Dk7>gzKG&&Hhi$$WegwsNUQ<-{K!IrA&biSOd0qgl$A zH8Ui`W}WWQxOO%A3NJEIW%Vb2LI`T%<0Ik%?%4FuOpFV-n2k@uQZ~Ah{^n+Gt%%FY zADMYIpt~dxy6y;O;Yuo1`=bA=D`((3|3#p$@(*L-;-fMYPCS3;XPBXIDH|WXkhqwr z_@DoddT|-v{QS~^Nq-k71O>^LS0ayMmkXw99=6K@q6~XYQ78FV&e^K@i7pR_F&rLK z8ocD2;Y(42Utu7_2hct0b*hE^v3WX((2!^RplM|Vp!$^}s<3%TMUGr|d*cj@9Jx{v zQ#d>uOi<_B-@iTs_m8VAB+|FlB4bPScNY3Z;HC95LplpmmR>IUucc_|U9E`DEMkJr z8LyIiY;9I*no`!jHt)cPrd|fPe$B)MRbLAzP)ie<`#n_r$Hq;Mz8it>xrXySSmc&) z0)&C*x5@c)5YM$7Jj1&W&t;n`W+9&IIC!w~aTxR=R_*FOPb@&4_8Sf!eEpS%#MiTg z*J$hUH@}H~-0L}*n$PG)L@N*3XAUB|frZF}ZEPA*djIhuUwngl|3(8*YErU2o=EgU z#Ndu2bL%i-@FssG`eqoGpPM*e%{uX)(=cN2xBfWj4Uo+fDz4$KOKRT2xQ5^92&#G~ zABC#xI{L#qwYY}gGmwRCy-;xt+io~)HpVsF%)mu6kh@n<(bUW5|9UIly4_-+i6=AL z&8^#A)8F2Nw{Excut}K6r5Y7Yee%Y{`=}fLz(Yo}k-rX!J?){seW#-(dYgeLk(~r( zgnHv-NO_eY-n{rf!L-Vn98!^M-4kk95nOy0jqCo1Ot9l)M$bWPr z>V+6jDhBYe;kB=zU++%=5QfcDDt`CxolP?_2Jp`T@P)%yYOg$C#P78FY*fi~PwE7-qVxvWhE8`Tk`VRi<5~SAOO+=|w zIt0bQrWUp9?Aq~$R(JXl7Pip&XkL-p*5NIi-qC!E|6m~tiHoLd+lHrd$0xPQ`Txx0 znKU+<4r7yM%a|D^WkWaX+E3@zYI)J<_|S&Yj;_ER7Bs>y$;%dv5b#w*#1 z9!Guu$G;st8^8YvPYmIFKNSmb!XGCs##n&=7<1>6Etnkk-Fr-J7!@->VFM1(QJDxT?Jwdk+WeWD01bU zdb4Etq#EtblK%z6C}AoWA+-t~9W-V>u7YQSA*9*MmNx3NnL4s`6YlrV*^z}{RI;f? zSZ*(@ef?WJZ9dP#7BWAn)8>S+4WHs^^93HVkoZ_qY##Kih>7;=rhGmY5KS=<#S*!) z&dzjdavbcDUaKr^USnH06LTt7Vw~F4z&IuB4P{l_JLX>>;;NVy7$wc>FjmC@NBw&S zu8Qdvw%%B;L|)fTubipXfS65@{NppoO&;#v3=8IrI# zV{U`Cv(NnlPJI`B1h3K<%A<)yG;KSbOBlpn@07Jrd)NyfqO~wb5tA>Y*oY{Z>6p92 zDwLVIiil{2aWxJV8TsX;eYMEQc{Gw?xwtJYSi&qe9%2vM{Xb`Zji;~qDtLSu#YHpF zG?r}AJgEBenF9gM0u?kgli2b?#T#5xxn?WI8@#6DsD>rf5O3>9#lyImVk4yD4R-qS z(8U;U@Ol7*k`0WHkMPM9MH=77c!M_r;G-GKl`o2FmHS54A=MVzP(f5s7=>&2R3o(c zu16pGHr`$>V&e;&r|Y){8-0I^+33RID5cr2oOH}g)a-8>m|D}32B>74i9wRN z<&)MFX^0gTsG6Dkt-4x^fPKps3GgXI9F*=lbJn@5QFpzq;~3r%ZHx6SPo&0aITjgt z28~~`17FIC7~N||3|xe(a7h4!2K~H}G1&M@2AEe?)|oxIbmJGd0KTQc@Ig{WLrWCQ zuI5Nxq+bMACj119<>p8={JXfhu6k@~B_!m-F*cRcYfz6Z)%Y|j+S(dVwqY`;Pibnl zCM5K8_NJd{^&H;`@QvZDX3Dd<%OjhoVomjT4OCFmKMmIkt+|#kimr0$M&)WYF4(vY zb2Z-!f>5HQx%enAf8*coT#sJq8`Qm4}9<$)}vVNfvfN^PA>H*@Bge# z?=M8}|B9d}!{#tyBY!sT;t z=z1qkg7D$py5C#ci#e-#*g{?pl(*rmhYxuTy$x%4$U<5L1Bt!$SEu$}-4_t8)e((| zb&X2JlQwg-7XMcrR=y)~s{iYedo9CL{W>oMV3BB;nj^K5l1PYX1`v^fbIvzfQT4UM%SFp!Om*p>Q5)_#e%ZJ%?HNf^k*MctP!yJgc`c-yv_ zgNtS$Th1vzTc1Q*RrmQcG$US$dKZicrrFT3!x0zlp}x}Zx2c$ z)+wnP{#8=l99At4idx@4?VHz;T08h*6A=}MhiI_r2DjbDM!wp83f6brQG%!*N*JPV zTb*EB>7vk8v|qCp(d{HbXL{bd58WUlHl*>{qu)6l(CuuYYta2(l`$;&=oGl{vf>63 zI^xi+OJ)uLG`lFEp_d<E%5u(@7{u1U~dCWG+UNPq~NVkWo5+G0t1K`hsGg)U3)U1_>Lb6nh5MQ zMMVs3zH;aaj2QTCe*TJ7GLxn408h2dr3AG{tbcp#Oxz>(ks*OfYfZXELOaFSbfHec z`|V#p4^P4Ss-y98VYBg2w%UwMzj_bvx%N}XBU(ox(Td6feB+X3^D**se;Ky0+&?^Q!D7tP{l3S{%_C?9#pOBm;?8Y-*1uT_bN?Ve_vGfX)>a4OA<)ZXX>u`8 zw-{4?dE0Wl#W>6x15JFkW}+zY#EMs5L<$^ko4qnVu}3NJvx{Dug%tRqH-@k%K*Wh; zepS2}W2uj@%?`@1HkVK)0-F>0U^<%@VbKTcJ}m|uNBZKR3Bi>^N)o<%PoHHd2|u#W z&maO91GN_J{@rKaq9h#Uje#Zrn*)^HzjaJ*E86`(w#|+aiZNwDVAFuG`#*`FHV^lq zK7J^|q5`o4A9Td2@1q}tjQza`rc}kgJZlgghc`K+S|4gpBu37BaBP= ziEZ}A?)!ei19a?J z4Yh#pcs9P!JsE^A_)m#7%kWm_1U5RFrCg0dWhFK~@t?OaEAgiWCeIQilA{n83*}Y# z;{ktMjb4QlWmtTVL~JC)x$xfV#B2l zmGQf+X!=x)K`7=RlPoYUF3S6IKGz`YjmWF+depNNa=2uqyrJu}zp^HBiS=7fp9n^I6c^Dz z!X`ZVdy&rv1EN#a5YePzbBub6>ygd7O|JqZr{$4MN~I^1M_VSulC8KgG>?r<%J zmd`=mpv3+$e=**moUV>4BpQ_vuf6U6>=Umv0Ggi}Xs|XS7Re|tPfhNPQwF8Grv2cA z*HCv234~E1@@z??EVT0UsqdkM772uqW-oUwQZ>ywj=6I>-hP*vxWY(D@F5Z4uFmQ#$KY~h=YlqE8Dpl%eMs~)M6*X0pV=XzX7Y290 z+1TW4B-KLH-w02K5qovpwmrT^&03|7%V3^|^PVkJlxF?s4c}RWnsul;Dw=g{G}Il| zbr(Lm4tFY=buH>ER%|4MKAgJXOl;xsk~$@PR`t?MJS8-`5fxsjfv-6Tt7&Ncf>-f2 zXG{QuVe^#oa2$5ujCas~+7tj^IDDn{>PrvY`6FBfV@*_(V%yD&8V`=1I1kTPXR@$` z%}c6g-=%wev?c<`&SD`8iHpQt-0vU%`0AX{T^!d6su!_Yw zTyzpva0im=9qOGjsZ+9I;Q%%Vb%eSo|em{0mR+w-($HqkA+!V ziCM#n8l^m(6BnPk6nEg5Iq!Cp-xELguS?N)H=cn^BC>4VO?fysKe>DndN|t{xI&T} zBEs$IqdULBSm$;FO*GkNi?jAh)(Aslw^h&GfD#)gXAb9!DSNhR-Mnwmp1r`BH&!!d zKnSXqEgRHo8o&1~t8g_bIpXa6r|VnwA+6HiMV z-eQ3eRAAf!8#Z!@w6HP>I;XIGT z)ning=$}8>=^NzZBp$XN;A3q6iQ4e;IdM5$~PUa7`P zRh9=22_w`&)_Mb(0luq!@X_Sq@{97D%>CeNt+vLm&DnFw z-g()Guq6)v`)QgN@){O4iIB5pin1l@KCjXICfBl%g~LTED(=pwpO}kLao6d18k#CC z+3ty`xK}ROcNs>-{f3xd=SOH!am2p%>|HOvi2K_09)!cnBis1P2V8 zB9u3D(C+)Zi6?}cSlD`ERp0c~q!%NA?6)jrA#suL21QO>tG%J|J13srh`b?kQg(Xq z*RwIs>-TJYp>vZsza$^rdn0BD-poc95=RM&-M?VcCrGhd@|dzvbhKAiCZR_!?dm%h zwZ^SXbfI&TiY2-1`1N=`_yZGLNW3Ig=h^da--K~zw+V>qDtm>Sgsk1NN8KEhwcFYF zLgy#3I`>@kPpyi;9c*;raFlv;Y*^p@R^Xdse>5=JUMC9Skr1x6PMu}$xcrvsc$WE7 z5QGx8vhnpdh0e-={_>n})?5qt{u~tFc99KDW%Mn+a>P8$=({uMmxY`eP5IE5O?r4P z`q1w(F(z^$C?l?1P`9UVy|iu$-k#pgK^C&SQn#m{y!G;GygmI32N$h?__i^z1Ft&q z@fElO|JA_L9v|O3xrM}O{NPESevEeeJuGYzCbFqUoyKpiS-dm?$nIq!quI!ocEU1v z?23v7Xc^q+#Iv2)?d|t|`W{*a_p|YZ&P~EHxVZnppP=3T02^IM93`yJW0EVi_xK(( zF{R_l3B93P319HIKK(yLt^YS3HVG@a>wxkFpFF#68~TDD;vu8i$kr6ptDdL-VZU{a zfaqZpQEvSBM69Ac3eU^-MuZAwgyZf{A`mV;^{hv&95|*-826g|o;m%{0;raSeCN`Rx zTG0K`9KXLXfv}PaY;G!AG zmMKb4JT?9FwWuflZQ==ofqY~{#&h&PuW3=_PcV>47|6y&MUl_W#=gZU^8YY!(G29u z6SV^WxpV48T!ByK(X?+TD{%IZ59i_ve2Rli!ay#?s1;Z@>dg;v1wPHeMKh2sPt-lo zZM)u~MT$LR;7P=*(c}nHecQxL*1oP>q2EZ2%U#U0f#($NV zfzguFEL5F|T&6enOJW^FFRIhBJ*RWgNf^r2Zd4}r)N6CEW47lEE;gE(>>YsO=5

    v;3DsUEx!0E*KlB*DrHij5GnhvkktJ}iHq*sUeT{~mD!r0d5=|@)! zPdsiE%``o#-T*9-S4iJI7>E*DC}+%44tw!!=oHZDmV#99D9ssIrjUe$iO5De-PmP1Nc}#h(xVwOC1C9{_mN;&8=! zsVnni!$)fdQ`8v*Tlp;K2~8?z&TEV=lJdN_W~H0?pYX8(X#}@@T>2$rtgsKPGU3CF zleH{jE~7u`P%0d)LIyBt%0VKfZx#lpt80e_C3k7GDz{4`kt3bnp}-}I@#3ro<4{TP zso4g#Q=%!FFJ`Nw>PcU=sn1=&W&|Gx6uU%%m_Sqz0A&u5j>!X|DBxRr0YmC~PIBCw zV%dkcBoNQ4&$bIzw_JpZq^);f-VL;K5z$v^#Gw9V=_)qC*+c4ax4{;#0I4z%A(lOYcum zA!MbZlVhLm?o5nZAHUCV z<(&GRE0khSfA{lYTVvo~_Yf<{=<6pNsal1%jESF zV?Sj-nZKjh!#HAzzvmt8%y@3s|E&zbFo|LE5ql!ppyIg$3!VN#nXE)APyz-PIx_Y& zJpdXk3JY=5!9_q|!Xm_mmP4Vn!`jozFvR_D+W4>0{Pjv%OvGQP2Nw@`Y~R}=nE;vc5P0wI2r_&DT^f1YSjrS_e0A~=H!w5 zhLcWtGi3;Z;rmX9$_QGWtUE1>Yf(FDJ#QkI9q+zrtIqUu8keILKPGovrC&EWQqI~x z#K4+je}48XkT~(1U^Ix8s;WUxP7Jjl8I9%2GS9+QK_+T{K}7N*OO%WVA1%`jj7CHU zWTHS-KuD8xS@?9yFnY-_Wi?rSFmDz!4vb0XGoMU6!g&0DW~?sOdjPnfXJy7502?Ct zAJwt}`b*E^LYpB7cm+p8B87m;iwiTJ3?(9bGY(NP>;y9}sl&KpU3wHLqqRjj5C&2Z zHghr$647f-4Lh|Z?yqbJu_lkQCv1XK42*@o8gV#8NCtHci6P^GW z)x4!NG+ZT!l@q2h1hPa2%R?9>XtPR5%p^syX%NCB8Kg#U!Ao^b$+|J)s3bf{yc#@3 z`~=b(z!@0~a|o9Y8bqD*)*KVrI63j++5GbrQb*6G*WgZA&(FpGJ;Ot=0Sn@U zs+v&A{^{?k$py@GC0U;yzlb7Jh76kwYdIT5O`wd7tk~2 z{*b^ReQkjrO0Pls>lN0&AN%{;zvq=16%{4`$_wn)`F)EqE#k`Ne3vdug(Cmsu1NGZ zvvIO*q{@BCm_T>okB7Q8u0Jffne43XlGm?|5B&^gY)=io`qNNz44Uhqdd=JZ!hQS9KWI6obmGTtnO5QeeSTnnbZZO%KiBwANYJdEK(^h=$ zrJjvN z{mZYUH~G!NCP&bKRaS?|;J|pTYEEbixfD|HKZFRtc$nZhiPcmFX$_OH$2;>VanuI{ zV`n<&0jo^M>~f+9y(`~!v(6mcxTdu6@y!mpEVo^U4B81wNUmi}1wQ{MN8(>J?(5-J z!#}V?T_R`70xO41FhFf)&KX?rhHBWTdd03tRtif(!Y00_=+(`;^pDZLp>Z3xyUbL7 ze(bAroN^_3wPw&0pa`8W7@{zJyJGFCvD929PLw2P2{O4yQrPsdrAN!Zm{hVVbr=7T zTy0DQN+S^u_3KFLtF)w!rc?Xwukez~NHf2@$^qR6M^cidshpICeyA~?JZ9Zc(|Kgc z6sKKJS;4Z?8rd<5FelL=odp~KDb4n1I1r%M6vF{<OZTOG{}B3COcp{@$@^+iol{F!F7D7iN>FKT z(eS)+ELoM@F+VNqv|x!pKyv*u&T6-bE@((owY5c4$zOB}8T(bRE((CQO}p&~7FFG& z_IkBD&nf!i5`KzFnP6zYs6k;3F^-{Y+Zoci^2rNedc@<2Iaw}q`Prt%D!wnr&o^Az zYnd(Bpz!y5Ie&^lWf{kN0m)&4Z_BU{05<~65hi5d)J}E9PEb6VN^=|{#OY(3=}Gaq zK+JLWab`?~^scf)n-tLsnSap!M#K!D&x z@bjOFHh_?dtkQmUE4_o^*4$wFJq80l&9(h*ZBWg?V@pA9Cd&Bq?3?VM^NWsQBdoBG zvT`4Jc0Imy+p~^+u}EYM61l$ax#L!1vC}4+tdYxYc6xqJ11EgOK8%_(9tuf%dryzz zV+Qw@i*~j2F0J7x^|nmtt6t8s;DS^x`zpHGBE_XRAG%=R z|I~7Z4;nX-7O*M6@YwoJ~udR4!&X|9=LP|(R?FqzSrwrs1WOsVN{Kv2KbJm~mnLHAZH zt>?q+^yrG-cmFZ&1bqE|N1wm{ZNt@QFI1u(A!!aOyU|P&&iwdgf46J*O7Y^BI2m#< ze7X&IGBYulGxJ`}NRtp$Az-Jaj$5DMIhJr*mSTEW%XT|3H=zmBrET~q$@JmuI zu&2b2GVTf|ICs+W5PR|Ynfago>Jlo(sX;UOdsWBozXPqM*c#whGc; z*1xM~4v%Sm4a%d*&(+2i}iM@CIaN-~I??VzsQy;yJ0?qpdjKpU&gpoVr)H@O)j3_WF1B<1cQPsvin= zAOICW&(W|$1p}fKSje(}Bxm*yH8MS>jw}SP+&# z;pP!S@_8H{?+qrjGekjhHkBnqCENs?cX-@nug{mEFMz*S{L8ntS!&mu9!G;VqBO`Tax$SN^k}fr){S8$ zb}L?CG&=lQyi$gkK1myc8wNk3a^v-)7zAKGZ-NMrz$M#$+Dr(*bP{~fHkykF zFldFsU^2h^-g{H^Ad;qPzW7FR85+a#>x%iC6Su&9f|$e;MKkdm)1j{eC%@XIUn&@6 z<-7U9M<)nFXr2}spC5Js3IH1mVUl=|+BZoTbyhV+W`5AKhlnlI=66@bdwk{$@j7hL zVILR>aws{JeNpP^8$xe~iuNbd5Jm&FHsBWV|8_>KHh`CNLjc%CLKKVdDcy~RC$(dFI>V;&_L<`k-5*xN zHb@)lyDU%dQ7JcWwFxI5t+=RhBV##j0~Xjo$}dK3m4iiF2E1|2!>I2vBQTWUBV0x- z5*{=USL@}0!(Zp5X>!_czZR~}&M#*0pe3;|xpC{B%BN%^;!tJ7sD7CLjE+9w$68{v z_rR6k40L}>4#f}Uq?-PRP)wmk7|nY@!)h#;j1D83p5!4ERTt4&h0{D#s(`&J3SF=y z9f^uen-=jMrYK4j;m_((TIrLT`wT8Cl^$VM)Kb`N{!dqorK|O)ztxZzXpJS31Hl?a z#Sz^glnD6X60$Wv=4a%Vl6|-o-%km`csfO}ML75SISV#auR%*&3P?y~&uLT4&h+vh z8~Bo?vvGq}*gO>hUxvIz+k-!OgSE;Ed`8mIcgLY%fCFxm*zZ*-eF*s>-gT)&041EE zWxyj5^37LT!6oYpO5bb|S=$2eLa9 z@b`EZ(rv5)gA-rJ0T-%BDZ0RfMTHq^X?X;W@K$}{?)waobS?d)z^z#`gG$V=xCDnC zv#`?seW_xFC6!9KAJnKmgmz1_JqIF+&1U4&c<~sStyy6w?zjpeFe>~CFwGzW2OVzs z(PC~g9!m+~Ed#d|dr@|YG{*-P>iwaC_wS3E6c3fpNf6N4rAVrYTexm2Ei9#!zWhDQ z$#4AAra-{veQ^())BlGMH*Y`)_=Akm$qCV%);OBOKg(&+2j^Nk^H>#{I{PSeuKSUx z`Y?dSjLHe>bnMS5Bx(AwCi)&L~{Dw>VzkL%cOt7YOLbaT~sVC5f=-*HNvzt*=3(3IScJp@E05RBQCr@N@ys)OS z7T_kev#RbJ5>lR|LcJprTGaN(PswU|g=0Amre`5N*W^i6vIR+GZmmsO(rOgrfvFUz z@;dd9uV@$w0Vs37f;ANrIRR=U?GzSnBCQ>zu3l(a3#M;=(u86_lp~KrQvfP^md-AYmv|k!Ha(INM;-G;9wyRqPhrd$&L@ zw<`aU3fei)3>^b^`$sL&eO2wlwYzv_3rUe&Z4NnM_e30YG+Zq+PG+uA5uYvz6M|=U zvn?*!A=K;Pmo$q_d}p?5*3MAHg8`_pcQGE~M*_|V^WkJ4|!T+J~L zXcY5a=L!rWa3)C-z$=>?0nQaQ)M6&m(29;%GN(mHl|`_ZZ?ps{6go3qqpxxATb56I z(&S|F#i@>p1gI3$$315>x?~maMEdQ%NVZ?gsnA8KokO94^U=`3rtj40@^dE#l*z#( z;o`i^fQPo}yA^i%%0s9jK*1QNeU7Uv$-9-401V2kt z??!Oi>Tdc|EDE$AF$qQwgM?OSSNR<;L_&_%O>{Ebu|s9yN1a2fp1hVvG8=A3P2ZI| zd;Px^Avnio>C~#()4ViV6{D8s@fEM54@dL_a@DVL{%C!gr(y_6L1Dh2l@=VcHXd)U z9J&P~R=KUe6E3W<&&SRbSgVECE*@Ua>8dq$O%wklUQBw3XzJIO9cP8MTuF2ccC zjGa3U;+Wk%zQoUrH3xBnW9b?Dz0q!3*4*Rao|f;4WF!%ofsshswJa7o+^!lQ7K1~I z{jScq+FGuYWybz}{VxXh> zj$M@oJ_Pf^)=3xs5~=m#vTRZKW9CMjkLpae7$(yv_DAsTp@#Ez*tvj!XOY(9qsF@T22RwdTV5vK)YKled;h|d@dpMVWT_C5 z8k7E;>$y^H9tL%?QUf>-6$w)mxeS{A-agmjM@!osXNwZ&DNmx0YdKAySwvS*y%d=~ z_Z;qUgkAeTggT2xFu)0XYj{Yc3);{g0ka`-CD@E98yCWaB5|#KIELTa2B{c-VrSOd z=xjl9gT*N?k?{~90<3`81w-@7rf-}sv|^PMlT-;n$ywt0wYnaWX2c!Z32Ud)2-^U+ z(PH8`+9rYf@Ui0<0!!sMK8B=2)8?I`ZUh8DP=t4U{-573 z^Ks8U*V=nu`<(k;zolzlGsCH2FSVktQ+S*Gd%-y77ss3Rc5mN!;=etRQFp*$glJq>NpTrIjqMi6Lp4#i9oV5 zvk+~hGG<6R16XNOk`vah8>u74mWJr*N-kuesA#sLyerr4z_B4ZiL)B`sNVE*k` zX~ap}{f**ed6`;8=K3)Sndh7|MMVmYlejIQX1Wv{YjGYtRr(+CSWX)Z8IdRCY%gX8 z64#PWvle<0e>HOn-oUZX`AYcjuYOQU?LD&~TIcBspCW&@LU|1 zJM?rJUjw6UL5>vV@e=GD5o#t>M=@hg&PL8Y=HM|ijI?6~`V8>tS`$(P_>^Jo?#;Vl zq8dVfHw)3EpjHqFc(9F;9XJ)JOKjIHmQtxbdBF3UEy*mmok*S}ak62|Q-mW{cmzYC zgZ#j#XAFiz?)UKP!C6dUXyu+ ztTxTu^NXslQbvR=)M`YfbI$)rmj3Q0os&Fe2M~Ti;>U8K_OhS$AB*S4ApALP;*yC~ z+JU58wby#)D|EpYkt8gRKH*(&Q~&$3RA61&7FUz`?%sD^H;eoi83&0}(+2@OrBucJ zg^H86^KZ?tooH@}0l4Q#a?AnK8q+ory*}V>TApfE>%Eg-NPY|zW4mqcU1S`!PPxX} z`*wBppM&_8AO&UmFFr&~Sh$z?J&_Fk2=9`M)&?Ho&Kl~Zm;P;G-gp$DXvkw#GO_uZ` zEQyUA!U`r~wCgnyP)q}_wu?{|?YCF6&jauT(ZOYe*$i+C`h^lI8qd!yXQMzI-&#m% zclrILC&_@Hc3VX=uaOX>FN3wrkxq?aAd!VP++kqyWm=PfLyOe9U2z=5=BmZ)0sua( zUDUsl!mjrXw;C)_kkwj``}t3y`I9f8!A_agUR1(4Ll%=8tHEl_<6mZOnuQMQ>>WGg_v9)r`aN*9TdlA`jJmW*+O888Yhx zeD4WNQg-)kBG8pq%++Lx_2wZ`gR0Ql8X81*`-x6S&!y}Ok6WBPOsS-Vjjg|u&vRt{ zvt>_2@`RGe#$QTY00umsw7G8*@Eq8F2aF{uGfrBYxT}|pd8bL^mGE$w+YpnxAxW;c z%k?r>S4Z=p@&|gw-``a)qW@svjvoX1M9#k@Lm`D|;DEJ-vpR-#qhqeCp1)tm$oI6e z!f>K)q*y3XIJ5Brj7`+qx}bS{LT|U<{4Gddb3o2JKw@1-`g93$-GE-1Ol$Yuo?ekv8a?&w5wLM>Lv80>U(E->1>Nsot zLh%~`Aea&8HJ=P4%Ut(8Yz1%3AoV(CHEljLlzc;43FC*c(b_$a#+M?-xX+{^VGH@+ z$){&+LfOs_6_`WiiI|r+bTIxY^mg_vc8^|mnSz~A%SI`%%$`0LTj-C@41>3HB#jGV z53zv3+^(IueAqJn_g45bbnyCtq@5$Gr#;C?Z2DOLp?0rLTgVFPTa9U z@FnIXEOv!Gw3tg}a&*`>dW)%3ZkbG?vm)= zQ8t(V8+*6E2HlopelhmF8~>+B2Hn(+*B{y@cz6r{@}97U=H}AP<-7QXW6YK4$iL?VGv)DUPgs#K+6rqYvN50F_N#DQnuqALR#AqC5VEGAE6p8`*I;;s6P2>Q zo-5*e!&x$vAO1=t#>a`%*P$C6EC{7Xz=N5V(WVF#2C zbZ=i3gg?qzTkA8X;kiQPd1B+H)m$A9ADp=pmwV#5WZCX!f3fKqM2=tQU2ZCMFxe12uE z{rtzQRzBqy7qqf=0KEWK2XjVegG0VW6JDhw$El|GfA$zismc@8iqNk^U-l965Z}vv zJ*m<_t_Wn*TsM0~JE${gpDt?eTISAnw(?0xVl1Jj`ot<6gGjeDgn&>NY3}=Ze&rJ5 z?8mGcN;R6}1Ds?e?fts^9+icr>_v5_8Tx`E&W}fz@u>*>%qFC89pbHah^zOx%*!aQ zR9G5&d`s{fwbuK#l34KQs?GcYizXYg*4g3g@{$G<KZS@M4d+n02&{14u(r^!J_;xG$ zfV3?$6RcSl3!rK%#!ZID4xv`);yf*~thC^8TJu^)v#G2}!$^$Y zDfV#EVR>W#f^SZ=OKs66Hv7$g5l3!bS`5<3UU}k{ib@EyrgH@lV{)ege<6okN6FAC zn;7#7FSoB)1_*v@KQ`hD?Jq4BBJ7&ClA_c9_52eK0$@tVI303GP(SfG6qmG_N4`QX;iRwK8jdLXiy+o#FGT-GAD zYXNiE;Pn9;1lwi|ghfR7qX)E6V07afuolmESyLiKiXxO{VhXj6MYUC_hc^%L1c3T? z8iycoD6}a0T<71yd;{(M3xjpD0~5v4c+#Ae$+%5?=ZB`v{AySyUN*T zZUYbPuWRmkLeWd&2hl;pJdfNm@#<7n;zAwinOUB-Q07z$wwlD*J$qwK5!<1~v8$8cN*cHjZM3f;LK#dl`->o!s01!h9q}3hq5D_!5w(t$E{GIlOx^x-D*OPXBSJt(vL2EDavpUpn6ORNlj9voC~=ou50(!*kMM zhk`6D=lWOb8f1lhj~>5TfJG^2JLs$tB3OymsAR2{&#iXcW&|y}dbeo@G#Vf`O$T}f z<9EgxC+8y0CG8;7OlWN*!!nXuBWjF5R>VXhe`x?aF^_vO>f-Z&|NLALJ{bZayu!@o z|#qZ$4<17gzGz945{8(}&S1>*g+tkuL4nAKU%WL;GW^?3b zS9SKJNJ2*AJlH_3drMXX%R8b;^N-jzK{ez63gE~MG2ZLSe99VmYZZOwFwhQ9MYu)h?6(Wr_y^L2HS+axR;m02+Y;y@RlbT`dHXlphT?7 zCC7uEOEK>d0r4tb^W`=&NiTA?g{iQr({bEDgt}h39cLnA7bjafO~08DEd46CJDfc~ z2tcnWBXcD9r;yda>%`qeHiI-ZZX4}Nl|AQZA(i$&2y=?-fGG{aoRaW*O7hP$Bdbs* zCqQ+2HclA@*CQb)ne`;HI{!px&#_!#oqZA*UJz+!)k()5Lx1f;gziR>F9wof!gKge z7Rob7e4yZvP9iG*9&o`hkq-gH%F||ArAXxI@0tKifl$aV6_+Wa$_z$B#?ur{*t_415OHqO3Ry8h}+?0;8Kd30ldU&}-zrhq-e5_YM@I?#u&;wNM(?#-AfS*u9Q_cj(EtlF@5nOo z^$mDK2yD)heQGCp~>*n(1F=2xhiaQZBj{?8dc=M7q|I&FP;Wr zl@AFyopa^5DMl+9HFU~Ph1n-huFrSRF#`R7DmV{2G7%)9j8I_NenzEW#N9WgpM|Uk z)XbytPazKV#Q4D?PW?1BUMn3`l~!kZ4=naS2JS6r2!&i`+GAdSs-!SR@1D|XlhK`Q z<2f#W@m;xu7O6B?6dATth{5}Ly53v!eLo-;BohmbHA#{As5@?RECA<*lAeY7LMO(atliqm>ARdHkx+z-u-B*?YNlcJ!N#d5?8>%N3GM5ucgAD zi)DIqCfzf{BI8<4jPZqpSLf$TUOQzh$sMNWD1?_Avk!@XAj$sHwx^dk!uzUOPfmkk zQ111iLbPt^_rGC+(_RyWxL8?MU4LJ_Uw2*OOKt%9!;JONhR)AN}U|LWgShB zfSFbXM&joYrsrsT016U-s2}kn#mBf2W<5@%pV>DJ8b7&+A<=t7ai1Go=rnEO+WFD# zZM~3N$)}%%wKTOGhAU31L&D%Ir=@c{ivL#Vujl)rPmksx~hBfb?QA z6sY^UEpoY!v2GK}4)UT!boGYdgC;EPzXBS?s!7HZ;b(i1bx{se`>L|>G z8cP;v{RU!<>E@io+7{F`Wj{Jb2gI82ULq zvl~NA1}>(4GuZa+TUiNIl@BA*#vgPA<^(^Q-&gZ-z1fPRmdNj$Zaevd$HA}vm$*Cc z@+A{!Dh!kAB{!-eM-Bi`0od4I+BK>|^ZEp7zM;5pla055zCm0+D?)bqSD!+>1-8h!Ety%N0{}%3@Jr9e z-G4Ej@t;Ds1+4&?5y@3oHJLdBwBKXybZ(f_Uk$#)+y_)CY7;tfx|ewd=7$oN|GYfO z7`OxFg~D$PDQh7>E&;bnT*sK-t+Sd|<>*n%)t-K4RgShzqsy+n0S5JEJD<+sro6A^PM+K!gKcy;XkvZ1J#hGYQjM2J0?a`5RZ5==l<#p{8TyBeZn+~ zGBggBEa6v`c;*`4Y2ZYY0z>EBxBjDXhGZMl&rEz(GwUWBOS?rz60T3f$-{m(>L#ak zON>Vy#1C8tE`Zm_aB@r_0jLDJWcO3b1|223J+@j025xk!Vp?OHR-1F}j!%dP5^h3D z86Ng+|ECb^$S}4{v7mmQGOv{`6M2<8od@RHtd4r~Op1LDf}u&)4fWWFROb^op|Gr| zsZYdms`|JbW{otp`2$!hAsgm^gJM}&ji`wC0bYSnq*zfYuS{R3w_*faPOSU;3HAAD zd#0Kml53M-JvB7%RpD*S{gvH%c^6tYs(12Q>ZAJCjc*$`j;FzVPHRE)=&g~?a&cP^ zj)J>Hp-AZf---APdxm0nuJN}#TLChBqhPVcOw5Efl zoKmOhw*oUm2;5RwW3uH|LE`<^Z<;(|#mGO+?_%AbTkaoVa1l7J^L%JsIvg8^(8~Mn z(mHlP>nkvps**#izwracZ+D%gm(ZDCm}Gm8g1E;L%Gp(AT_-yHFI5kH6K0 zX0OAtwF#Lt>79#BJf@!e=uSicl*rB9a^@n*^OhV704wL2nJdGG7yAzy{!~u4L$TTc z7-m%@VC@M${)kOemt27Rh$8}snL?x2xQd4#g1+v~bclv5yen2x`Lt}&5Fm7T?K(C! zDj^zk`cEN8+ZF84LJqw&Px32Whm9`hXg5r^Sv>@YHpGnVGy!3Kcz^b-I_fDUIs^bf zE=JByp26Z=AQimAq|)hO`oZ;E;lt@gA~RME#@jN2w)RxzoTExvUb-$>9j$ijw@U(Z z{e7^t;cg$w64fh7G9XPk4(wg9E$9{IK~|V8zFUaBE-8(s2H~fHOe?@n9w3zqu19CW zq}%EU;#F>a7V|(j$;8d;HkXub&23?8cHxm4PyHik#2lLl@{ivylIGu=C^x;Eisb=QAZ+P#{ zCFyr^tbYnM5uf3<5eWRF%N<%qPDVM0wPSV9tGSC~4fy6c?_^bYHE=o5kV+xWTe47$ z#0GSAoz7R@hmkoH*kKf6E&f}Pjx2iwNr{BlQ+JJ?%%kOpJ z-&Z=ba}{HvRO9w1OD}~8SM4m6uyJhf^u%Eiq_&`z(-Etb!mjdt$HdtI-Bipg6J5;bguuZ(7fW}0XbdO&){Ov7C1@Wb$ zq5=iTxug=8R(K-R`R=_ke1tzvH}dtTx^ZF;zc+$b@M=FOVc9SHP3M|eY2qh~b#nLG zh{|W%u_N4VqryZA>dg~j0VzbpSl0P}2QZdT%@Rbc`57Q|ad_n_mW}+AJrDbn$;T|) z*x87hhCSwIEu}J~?N&u$$By-y4u1ddQ$>Qi46}~;?>9}VJU-iRKzmYI9`G*QnzgaN z%TsJ3g7`|`IS=NtB14vXK&vXB8F7MZzkb@YCX;-Dq>s-=?II^TMG9~XUnd^~^F{!J zDMVmrg3IV*p&RWJfGG{`KCwKD-B@}dInuAHC@J}B^WQB>n~|kDNO*@@zP`_82acG< z(lZyxRH^-3SZtFRXlT;BG~kG)B8|bbFa`ju0M=n|k_X~H#AO$h0^rNNHFxb^_S#mv zF~IyS$4HO-hNw8qpVO0Q>bTfArB`eCF{{}oAGsWFb9ANM#mW~`N~Aj1`N^4-xmD)^ z&!6NJHvjFRpu#iUJqVu;7CV2r<6*3{{jo<}b&ZPJ2LWlDOlU$>^Zl78iRAj9rUH%N z9WRuALPAgas`Wfbf1y?}li7CdZ5fWlsw$ro70XiK#&<|<83Q^`>kAUncy3%GYfj4$ z13o>wM`No4Q@!sc_CHa_QN(N7R(`Bqu_SWC;h9dyjO;QIVE;qhPgy@U`@zi+NOUtU zAM!vetzEGId%r~{35U9}d9-SRfd^XD!Pi*hWKEyKrPfr6q&mt1KHovz3pEWpBMiA( zVS(m;K_Xfd+}uQ>zOvPV53$`ML=;p_0p$d}$8VI|M)|?rqtW-T&1L5SX)G z&^+xgumb;u;W5KkGyn`-wo9Ctgx$BfF6}bhpG6OVoAl#6(r(e;-gCNPED%SO&hq{+ zLqhqaq>cJdAr+Hj+`&gd9SSZ}EA!D)9p_ySTp}_xxAK*k26|SUNV4}6WLS|)umt3+ zAbHzMZICrk!BS1e?d1Z4TG6yJ(co_98B|)9#8U?vNlO$xG2gBN6hM@~h{kpcJcP0KOkc%aRUQVi83fv)opIrPxT$MHM3~I-Vi58%d%k zP=d~+VU`b9BNRVHr{%+=_lW%nE*yDzhb|$F`XZeWqM-CT-wGQiq|*>zE}oOZ!vYf% z+w5Dpy_Vcn`uXJ+8(CUx6oI;;3v@XiDY=dX%(WGlV-=L`^}0#sQZslarAf~mt_-RY za&ln68l=`Sq7JE!kALSb_Opw!q4}H^1PX;j=w^u-;{A}RiwMi z3IkEnea$wV5vUV)%tr4k;1I z^RxQqUui$9Hee`*hPMsum?(k;s4_g9T+96+{P?wW{+zlqdp??h57*pQu;Oz7G`~HK zlNt-wTgK7#PoYKdIsn9`u=4)o?NT_)8Jaj(V&YqL<5C}%3@Up+Y~f`V zmmzir%zDyVX;gWQw22TaL^g6LSPYGl*i1GCpJhElzjL=tw0I^|@jIOac>F)|2o91NBDiAWefhJQ^KLjAb zNlJr;Q`iKRaI%^gP$Oq}AD}8Gir>8y`$fR`yey@R_l1H+?l&;2-vm*pCQj+R#L9#1V z&hr_mh`bsB^5|#mkEn&j(CTmL))AG|@N8c>YT_??&lKn-8vj#>8(s*fYmqT^njqEE z8=F#Q7jbg9(%XEB)K&I$|qrFeBTl z-JWadidh@Jf-6$e@I?IXkU*|{RQV4HR^iS;2p$}P@>s;Bo4des1kQb%L9>e8+a-ZvKNizMyt5NZWN6~+lUo5kVy?#}rn6c9?kr`sii>qLl?R+ZB;=gl zb_7*>8+Pta;WMErK0aL~sY52)L}FVKE-abj`Md$F)K)7+hyH7qTRd!q)AcADkB?G% z8J)0+F(9&SzWi_=C3T50DP%8C!+DqoI-o&b%LdVLJ;cUAsA>qQJH}6M9Q&5QZdGCQ zpU=x!GRH|P(%g({bTI67#eQiYtSQ8*USgO{x=Ivp5+AsZelTjtQ2Vp^tRwQ821E=r zia^u@rKpjTQOoU|_jy2Sd;>pi@LH-j7m11U!!cdO$O~WDlY&(3uyrO(DYaOWmFyAm z^QU4h;ZEfiR~c)SZKpUb9tM4`%dzWvvmYdH>8nDnq^*$H=P>>u7vW`dAE3#F)XWlu z4XBkWlfrTo*a{=BReCHX%LuForOT!AItLAS+c$vNF5cu6ZRcJcpIdZhoVl8v>(GM_ zT?uI4$*>A=JIMJpqt5)zgJ6fkbpU{JOwcU4J`=Uu16UNs!>6D>Ko3HjoWP{PHeqG#%9!1FmeN0Co?ae%He3r zXmLhDur7y_IaG%5+#&a zo8X{xVnj}-Ny-IQ&P0i=tL=IWzTAo3+s-gJ_XckfH%V)=P^|gp%XKVJImK zoGi-BH0AT5z*;#SUp@dD4QTLlBI~8lbojSluiq}8vQfwlwv*za48Yb?9rqRW*1N>k z+9G-}HY3?Q6TSy=6HP8-qyrET%@`CKax<7S`RY<$ya3dcgwr_Xcy0DhEJ8wTVuT7^ z%!*DqgUKj|+It0AIAO6DV$0@l%P?Ce!#Ltjq$*^3_}>fbMeH0LSf;db!cMAX0Hq)o z8?wRtN@I)Ys}HfHKX*#QNmef*6c-y1dWs#tIDp9j0HG?c?W}~$4biJFEsWqlDczwg zi>i{e$4k8LM#gu496E(;Sw}8TZmWV*bwOvyN!*D=<69nTfsXSfEcx2)`s_QNc`;1$ zm{giD6$?f${v>571XfTB{SavmeJ}vrP^ZFjt~g{~lNjMT*KL;nAWXKWkSQ?34dRrb zL`xj7=f-A68+oN(&0K%75zA!zLj7;Wt!h+*<*PmYw%d2#Z!f&-za(mqv|i6%E(Gj& zYkuivsoDDhq(fBj02(2*VltrZeOa7EW4RvA&)x@&DyT*!Yl$S(G;4c_R)4L=`382j zty~CW15He_Oy#~R`4Y0b{6PEl!WlYhzNM(}sLA8!aYkgDS-`Yuy~U60N~cc2v*hFl zd-F|&)W9||;uqx{UAP9iuoi8IJ)m&}3kew|CwoU)hRKKw$}57cSSHgy0fMR_a_nQ4 zqyXG&8-o}@Ky((_Imz3&L_eF=pdvB2gi_zN-`}MbktE0h*g+HrEW|P zmmHOuTM9FD5R@2&L_;>{lxfe1wXrfR7nt^g_1mi-oGX4;r?Q!q732Cs@i`?mrHydC zflVuywMD#>swU!|KC-y!;Z-}@Zzk-w=aJm8eTf_t4@%E%NB9o>czzXn+BrD%9Qjs! zR29*ZO;}$gkvFS|K0!r0UM7Pc>~YG3c0;ATl@oZOOqugyoydrC3` z@%v~h`r=3mh|*|{l#)PhizG!_ADxK{%wED}0K)no2}xmaEhAz=0Lk&dHj0-Ca1$n_ zGmfmG@Rt_JH5UwGa2QM;8JDq6q?Jb20!G1-`G)^fsP_nfN~Sg+=?VaRgy!nZSOLg( zxHW{Q;mGurtQ3N9fR=(sL;PDO&M~_^0E#SyhMuZxU5RXVn^mYmgeX?0by^U}unazrNh6H2W`39iyz_u>-3@^BiBbTtF0uK)pZ z6U$0DlL8f*VWVGZiG794;~&wihzVyRE8iF^439c|COFMXP}hQ>uwmjhl2ZOTk9t+| z!v!Yl#e(xPe4&`Q1s8_elk{DF{2kRvhtmG=N|}G|q<82r>Co#7qtIQWuj#+Ma+UBV zzec|--<;2{)jN>FU#mZOt|~i1EIS&-B*cSU`UU8tEF%s-UAR&Svana9g-1_u-*n*5$lhf`Z8}JQc;tw>ApzRWDEZlAFhuPK-+AYFNR`PAbqsFo}+A}*cdWr zH3o#0fu0j`hb{2Nu4!fd6C-4wb^x7#wFd8MAycmXW5z6OV5pg7@D}u&CK_snNxvkk0^`V}twZ+>3nn?fW3bQ7Z9@AN#XEV!7Ys>2mbM2J{MTe*CDuSF!u) zLFgTJYc!qi^r5FqjNx=v(KnjQBjjyo^v1ZE_zQoe%u~Bo)W!UCL(0? z#AmcEo@ea95EFQ4F%*4_RlmV$vU1Ye43#9aEoJ67Kj>XG{l&o?6DN zpfKxX+@N`sc7r*T(KHeoIYB@NNCToMQO*wk_7Khn3|QKiVV`X@W4am#NpbD_L$uF882k9R%EJ8>dLB57sKR$NpC-WQr-tD~8ab{wx~{TtKoZ_-~c8AOlNJ7vU>y6Kqxa);=t zmt}up%lmIcA%7IJ)6}XHebriVs1>_}4wX9P8a)OD7+_ug=>5tO2iJMxBWcvuNc452;dfL-oJbn>djfl^EKsdRrVpPCjo0 zvse0jgDX_q4W%jHqr;8gjUN*06KiYi{8NZ#Og>U3N(A9zCHK>Xijvq3TEw!m?baM}~zPkSde?oQUm=lQbu3Iq8mGlQ~sIS^b*M~pS3P#Nf-k;mW-4cDC2tm%^; z!*^HlMXKr2+@v)T;nA|tl;>lj0*f*)Uf#^GGtqiPVb%Tg9ahC?e1h0xO$>>gwD6Y0 z-#~FIyQU))Ax|j)OFztcb|S zY=Ht)jvS~bmHQ(VWG@8S);O~$!Y2bB^bAWO*q1FuS&GdRBsZb?PqhGCB>*AbE4W`S zfC{}rLw-svHDpRsN(pesxl)2e}7Qo73En6h`Mgs#$3#7o!2@ zcC^vu`z8Kr{9DKe@h?Ij)L#_a%-)d#Y~%nKOcqFw+k+KL@{b?5qM+4QbvkE+q*Qll ztdyC~cghtXVT6~z2ZD0^!4+d)htPNh9kc)B*u`kDaNC@MDs9BK%&!HDJvCo>2ewOu z#03c<^#~!lAu9mTp0~P!WDg4XXq=|%{}ggdwFCewrHove$i4KK>!_>{uS4Kl$NFN| z30dm;+e`>lf*=uv?r2tdnDS_gPVYi5A@;AVY_yg+WSCV)1rHCS zKJoZCJiRNYJa3m8koROoyjTndU}^#Ls!~!IjS4Wddn$*2AZhiDDOYgcaTt8;vVZ<& z=Qii`&i;ew@~p1GvLw{mD+4GtHz`7$swAggN&A%wKh^d1cRIo8*FevQWhCrS21H&3 zz^=tBr%ta8XOB2${ez@nzDpqjB7r7E0nw z>GWwClKs@wT=;dt%Nb;c#C@EwJXiuJ;Z4bsjsF#UOGZQ#1v~;W={rg)NqB!-;wL#CAa$_Nvo*YZ)&ERrh@2`;H!midVW{`nq!! z^H@HnimM8^u7~B2D_mVIZse&)v{9rzZVDXgJ;p3+tW0TSnz%$BLl0PC03@rIfgh~o z!x_6f@KBDDr4KW%ncNT&CMFCzoxCF)bkNB3BUAUoQA|wEnq9V|tO;mc&9tg|)Dn$G z(Bj8eihF-^zt2|+H8AERTN+xM0dpntMkGYu_J>?qG{!^%0C>0Kj=3nJyhYjj8^(;6uX{h)^UDZe( z2h=KHKkecL@=q3{HGFTPrDw29Jy5y)m?zM?UNTD}uA^r;&Zd9A#We+=740a_Vd$;f zrE6kPBk?&0eaO%_v#h2Pek;Oc+WM#hy&FZ<2xQB;s3@SDE%YfUtd@p z?$D(vn|Nq<{yLl7gwX8x4`OGmD%K;$_QVXYcA!O1*yOHfkMg^X5Ju!>y^i$Ml~-5# zGg%?`Jm?O6aaBXJo%B}~am5k_QPFfrfqdn!QOr4>jT z+piOr=7OE8#{CPUBy%w87oywawpmm|#kMqB-d7VH6UzB?lhw46;?LA4QO~Rg^mIN) zIgPQ~6Bzv=&Er_nW46uf8qqwHtAMBGyB?}}O)oz1SE_{D%{)>^$Z{J8eqO)~P{`!~ zr(1Eb*yjFO-fSC4;M1iYUCuRjTXrLB3(RVmSzUSeu8y)*yWrzcL*^Njpk-!rx8gTB zBReR4&yqWPCy()dS#O*bFUH{sv!vRAjmxwK6s?0znBu#Qzdd1N;bG-&+(x%I*RPQQ zUC%-0j(5EJL`8XN`_Ltvol%)oLqXvoitCYrY2WB+6iR{7{3TIYU&g=lr{wj05G3nf zD@a-Q`O%XJ$*dGpp6+m4ARHAR`rhkh3G@)PrbLKM>^@Iulr2GNAnqz`Y2a_^uUa{o zg#MQ)*`0gMhbIJX9Wy7%vfP4#^v+Nf{K`DXyZIBkpLVY^4WG7lEQo*G=_!H-oVn?w zgLxV(VZA(@d!Jy}hYCyix<>T|JpU9DqI?ek7Ri`dACe#Iv$z(B(`#bBrFE}D#B%5& zf>VCPR^M(0x%&J_RqFrJ#RAvmf4?|@OJ({%o#+yFs7H?(ODG~NX9s=oW$#VHU}-F1 z5o#KQry`0WP^}tdo-P_g`;&^ap=+TfI!~dGoR?Wya2+nX_;;O< zJ9M2~eaU;+2rPcMB`aN3(V_=zYH(A;;S2cqO~MyWvhPd6v8SFgT3gUG?mbP+-HA_U~cN`A}eOOqxS5%m?1Tqg!((p`1e5ZkAq>hAd!tOUI% zcd1%Q|6c_@Y)aSs@D8jhJz0dV{EOF>P z_&;a3?VMt0o~Jc~jXO}87S#Dx-Z?EDkXUY{%C&Zg=(g;Fe=J{1A*d-YK+${LHH>Os zIF$)fR7}_tDKa}ol8#Tq$850*t0tuh(7bg_*IB3XWn#imrLT0H-^*_Q)CVPT5t}Rw z@LA1mzfn*CVhI!vZzxyhIvyryD0K(xLxx-1b5%NNz)^`!h$RUe1chI-mV=aa-XoGH zfN6GkiX*L8&I_@t2VMrdIPBJ)#@alDP*N)v)Kp-YN&-YdLq;9wgQ^gsecfb&Vxt#= zUoJ62v*lifRSFXM^S8@4mbO zuAepN=y>-;uJcm<1*^X)d)9|hL%(Cuim!;wz1tk)40+vRiZt1dHRCfc6TiU&Pgw@n zcPP-D%)@RXa%IAiS5i?UQW7xKXl25vsQwyH><|Z@Ju@%;p838%N^&12 zGlPy!N;(WJDB=O~-@NsyzI*>uXouq@7Wl-6AO$P6S{`j2TQhm6rvETuXP8=lOI>#o zNorlt@s+daw?iOZGXk`RG~foiTTl2t}%mqH;oLf z%z3gEZitu(3mFRD`+%y0*p~+CnPfR5>qffXE@i3mHCVRzpn4^NjhGIlQok9Aw?swx zk)MeX-^7g=!lX|lj3TP$GI)80;Mw&%ss6`sgH9QMIT)WLP$ongpyg|r!2<6esbFL7 z@btWsF#kdZZFjpH9h+MFHm?h6{KyH6zAn`~0rIwdbFH5lKYjR|5f6S+T3;p+PJa{I40 zkO&F<)z}l~?}C1fMP1#wg0!-?ZKPdfj;+4zbBx3hFXqbD0|8hlAhi+-y^4)jX*kvV zzxo$RH_1iIvyNd@K-=$MX)W0mHV$qY#2dC7E4?#NE8tmnVBuhmlA zSyAD~Q1s+Wa2aBlBFDg#a$Ay@z)g^@eve74qLh>TP*!Zm!H2waW?zE5>m2qs9g|M2 zHf&r)V$)V{34@Le#iUwTzfq8L-oQjkWoae%c>j}L@VBS0u=R3&CFAF(%uo>k07W>g zFwIWa;{|pry$41IlGHCNncOjD{PUGD0y($k^fO(~Nv&?Oxk}|w$~f|aX#+X*cz<=R zx2?GJ+e@rXh9L^98cLOg{x?$E*7uM3;T4W>S|0!iuG=l(Zz0!>w3D4aJHW%7bG8ZA zH9F_(5@754RzST(dY0#<(j zO2>XY2!-mjEhCo$@UdP-c4HBsdNk|(?fR)p2V}@NBAZNQ(X?{FG8(DlbV=$b;Fls6 zOb#JuoS!li1@5hQ0dQdeoCVh;Z> z94};{0w{7?6?Z&U(DL+!gD)*mA@rvO+Qj3t=X~_>K3Q3QoXEstxS!IEjeG|@jGGHhqtYYl-Zj(&x@}3L{fPWCD8VU865%m~>6=I^bduQyoTlvDVMCzEnY9>lCPe9~}>-dOPiJXq|{|fYeHG(@8LBv(u+O`_|{N z?=kp^dXkRjr{(9`eJFyyB0t|%%ye2zj*Q7XebbxoZ4BxSPxYZbV;f0jI<{@bjUC$d3OwmU5&slo zoBaZi857&k#UQ&jM$1#T8ZuGoAhWMWSRV|^5a~k+uPcw0h zNPO5ZP4e`;OyFpjc@o?d<|N)@EDmg9Z=Z@X|g9SU@sH) zvUsN+`BOUA75|z7v=Xw4G%+i z!_Wf^Fmxj+LwBc?bc3{%ICOV+cc*}$bc1xGNQX#Ch#>d){k?de`_26i>~lWX`kZs^ zv-jF-Ar)b;iUTt^rK2V+y7u`arI>a3l7y5LdS@IK^<&1}Np&+4Knk)I1a^D?w1M$t zLovdIh~sdmo1)0-^!H4&v=pz_($}Hcq3ya73)Zpdvg)t#hHe08!N!aQL^wcR-u>Be z>3-Il)tvZ4)A|S$j^1I>LtTrMT7%+hul$N0ECc-x{d~WBTDcjd$~wkoATL&wI%Y|j zO9)eZDLfz}Q9rtD@x?!cdIU~UWQ^tYb6GiMo$YD{ZI~-!F;;94we2~*oFCO;aSuZt z+wFX;N!M?u{9Hd^E65OBAN`KL0ZNZT1u{}2chmu4jYk6?VD;Wrg5tea|hmP z-12p8I`jwUSyx-GMxvB|6SE45{_0%8;h4&OXmP&42oMTkz=rol_xX5<#}TSlCu!Ll zEe$@?@)vTWgG1@bzb!@!(GiD@%}TGQrfJ_krO$G1n0Afj1jRVv@pirbu--5ytJ6!% zG%hx+9Q5Iad+_nYKAaxZht+(Aho@*B(#AsL%kA59=p@C8wm_*l$IIi9b~aesNS+=# zTJ8uMXI=Wb3q4Dh53)RCxo#LkOstHLSSHOsjG!o^m(Bb6p(+)La2#VK{dZ8XKN1oEhP>^#02ko3_W08Q^*11k z{OYf`dHtgt>df8cr6H<|LDhhGA|SVQVHJleq+4}8@OAc1AY=hlEu!q-I9VPGc7ya5 z#RXp}{rvMM`+GT6@B2?4H7{sz#HrE`ZPHNy=49x8 zQ?|I!5k{Zmr8W(BHyF7RZ}=>{j0`;)5! zy-_EjmK(LmR|lp45gLajzT!%!ORk715xZ&IJv=!um|>Tr>vJ|~^atjiG8={C^!`EoAxDTnYFt0!)Ex}5A=ye&S7!Bq=^G(rbIhg+wT=8M@t88 zHNN00z_Z+VY)0`=k}uIE#QTcG=Ct=i@~53%$b0*7Gg?t>1^pEW@YH%nEOAOsr5%VY z9FNY5PX_>h;d6vZJ%NPNk%gld+nDFBofpu(17Yz@{YbTtt!# zeLY>gg#0w26k}|d`d?XMsYil=1(=~(MV`EAM#Kk?x4oBq`LkY-;Jrua09}zLIEexb zZ0RSlKu5Y9KO#R%<=kz(*CBRnht!Y_F|iiQJN@*c#N z?;todE`U|CUvI+14{C`TYJ_eZsT!ds48x7v`vhiE48W2$=?LBybZ7{~`iYtFhjEB2 z>G-#XXe0%795!}^8UhOJ+%HGpp6B4<006y6AGK2xNg{Id59kszCu50}oR%BH7asZ@ z{T@`LgOwuo-Zs$>InX!I)~6A)w^vQ;8t+ zB-$=X9h4meg+in0Ty&Kf;5}w2M1#EqdU5o3Ia`=g=k9mItERFZ5R=kRa$wzefEo-4 z08?Fah{aAXm!`diy84)My>5HhBtyAKqUDrwxZ%R8T~5B#%;AzGP>qN&;lSd0?KRKB zmsf|PmwQ8qdGdb<5w7h4ki}(;L=aUodkkYni)aw`J6weRUq6xqedFFBy%2=K*r7K= zBzsS#Je z$M@ywt*TmlZQDqwPtSq`$kd|l6p|&8pcXI9kY@sqD9Uy$1PCA4DWMpuFHNfwuQDm6 zLPY**@omqq0a7s8lu;te`!4sBXz|9H##|(7R7>^omA4B^(TH#zFAJP0Uurzm#4=by z?T;};R=#5fU?@k^s2W_1{b`aF;)$OtM$1Y9&V?N0ym|g(P4XiaaUF%^!G+92_7%cq z@g&P*f*so3$7P3OJlV_(%O-H`3;45}%)iw9O4pnGU(nDX0_r9wPtvvg z(QK%16KW~yw7|FLD@4$AKosI5p!REzka43?yuk0%_=6rRz%He$CapQ@$e)R4rQm7u zQf)j{`j{7eKxTX6mv%HEQ#9eGb@9*_{Q}ssSXmyuUEyc%7xDT_WM{uyz}eXjbWKuZ z?25L}|MiD3e7*sIJ5mVoGO7zBmJK8EL1(PIL-)!u3ng9Zv!h>eBE+cWcjvsso;{LY z%g10)wN%P{j4ZPack3PbghR<#y^3Z$>t?7PLC+ia7{U}gmEpY?3gJ{Eavh?7yD+6L zC)9lpe)c7#v(>LS=LOfjr6!X?9xtq~RhwGkWDMU3l8si%&NXNz-WYj*++yCXtPE^s zl)Y0z@c`(+4bbbhgnu?9bkq#)DVY!Q6#tApj(XBbJ>JY5J+D^urF7Rd)^STZ7#_jP z6ef|t@hFYWrqTOTosw*zYY^0o$>^nhGHf70E^>VT1rVf2Py+^h#X%a;(D=QaedW#} zDXB6-5svTIYi*~y_wbhK;@6G1-wZ4E;wD76&cse74~sTJM00p5Vd;M%jh-xtNU?m)Gs z&KeutAmBkEr2CFtzL2%**fK*$Tnd$GOJKn%zQ9(TMC$T-_$PT#F|h^{(I?mbpuI(X zFRg!s#(=dSA&k26hPya?=Ju5nmk8k{EN?;wgf9n@atSBGm!oI_&)AZt7*X43x(5)U z{z7vCWy+bYY$bF!E3(PAAF`pNHWyC_xx0TR>UGz!X+0_EGGb;lZ8u8hF~F-6lhzn; z6g50!Ex{KyQ{+>x^u{ z{2f}Dg%L*4?2OJKvRG;+fwMlbuCp236Z3;F;(nNhHEWJlsBM-6h^fYd!)rZkdUHNz zeKLsK^0j-OY!6iVz41OtS$jZA+5(ILZ8fjC{yYX}1b@Zh!NY!VVEa1IGI0}Bk<#3G zWe@SgGIeopZdyJf>3B+P;j!ft!uvV8=YrBqA7@=Fq2SH(ot~mb)?v zy+npbB=>96hsv6uSFc#!frY#CCw_3CpGNmH2jCWuZjL0d@L0njwXdYdhOvtCjJQbU z^YkH;;rEl8YnUNCAw?Bt=3Sk^^eViLyv3MleSW^{S(o0nBy036_HOf_SR)cw1kUw zJU@PtCCXwD$l}RZo?=Omvg>KyYce6ADz?oDEW+CSBZhqd$?_>))dA`y*11Z5<3N@P zB?Tnf)Hfuc>|o;-4jEBK=U|@nr2!g0hD-{K&@s?RNiV z%XZ5@gyy`?aAXYB4X9Z87hNzXc5R@pF`IXm&LEdL!-60Ap}5`n4lk)f4+1U`iXO$T zplhbRSL<&JK+4|h?-(YtU1e>qZ130D$HObpO_p4D8H4%DhKIM?GQ>~RZj>IfP1NLS za7M_NdPS;UYua%?nxG{6s;(FIfgJ@)w|1$3`2F_KerwtVUswF>^C6^d)yXn>HVB{a zfG^Wf@3wbFeikNJU*hGWl(h?o3(=7pa}6B@BZ~K8OQ6Xsxr@?cTTJUbV|?U!?3b}6 z>7Pxms3RB!h0or8bHI3F-1Du&GfX>#cD(o1?KFMk-^8 zs{&B?hDux9)MI##&TzqNe%G_TGaC0A67Fm^<%y(*HI)%tV(u@+u#K;*|KK^~0g780 zwfpm~uv}4|hgwBM8~OPc-Z@_WwB!TAI->#>rQ1$VxgqL0!w%GT)y0|8-_vZ;B}56u zCI_kK*&Qngs4zHZyxGzE9dQ4+y^f{bi>tme_rM`+f5KLJG}2GN8k?9@ zF?MS670?z9L5e3RNB+E7vS^mOJ4ShI^nS0ivr}T}^L@Q>CGX7b4!$7?L%~&20OBHu zn+#>@G`>tDiD`+jyq7bNU+bd4aIV99>#MO6=?F6N8ea*o4HkzAljI(%`?wvkSh4KY zl)2imN~Y5nHbQx8j7}J{RQw<6H_x7+Y;DB3$@EHurlxUo$8wK|-vxwBeE^Ua(i zl$&C;pa2i!F+odMV0^Zh9I|*BZMr{Gt3nIHmubUO_iY!cq5B@=sw5;##+#0^B*x@V zwIcKH3&xjS44+> z4~CQ?-m0jgfR`iRcMQqW>fC9oD85RF3%F=oi)#)K+^54v%46QbP8^*Qab56cDMWS_ z4@%JMBPfYefdALx=A0`UqtZ`DiL?0Oj|5rRz`8P~ZZ&OxLMF?250o;$Z+51Cqz(0% z^4Ua~w;C3c>PFMH+qagIUiZ?hEY3?*3WcLel#%6m%kxaEOwmfX-PEvD_rAbqSvy0D zF~FTwJ;Gw6vL|__&?hV3z0{gOh?z91Ao~>jJ_7cH=ZR+)xEWHBmdi>DXuH`e(2sG( z`xW5Sg340;1k_@yGy_XTWauaGCwS%rq;sB9^SQ3(qbU>p-s0^D``!lEa~UvF%nR1K zV16Fe9(FQ&St9^If-xA~!nZoyZ86|RW%Rc}rS$`NqBel~@-dJLap1&o&FZT>c_TLB zW|ll-naQ$X!R^1tj5S-zPy9=J48Ekt`f|Cgo3?(w2V$@6vdCKrM%%IeHwk`xvICTE zkT*i4a+(O+b~OoPTkIP`^Qk76{y_R4HetnXgAMGDnWmZOKmdce5#ZY_uWF zCGlzguYZa583zx2q8N^k09m3hgsfF?>Uv7;YGD2u2<}jZH2p=MIq33FYfZj-Mdo9F ze|2GGzkB+3^}gD>=LrS`LIR|Rv=p8Wch&uAS3;H;E>n}fv4ZlHX05wMYMlG-JpQhaoX{X^ChX`!6ZAs2G=R?HxoBOn3b$sfsGlw?qetkJmEZ44zeA z#(RGevcAcMoLTr(jmBWB5kd!8cSz|=ngduHk8-OJ*UIul|Ibn3othD4qr2}IwgO@QBSM= z;CiTkIGt@VDln1Vu2(KL?i*Vwywkt0Y@}r+dx096@;ru&=;y*n`^hO<-Q5lwScg!J zBrFMbcEScKE}k&ILmn5HKOWETwUa0Nrvd7RPLr5~H1O%Hw6;2Dgh;Z}#3Vjx(UQNu z4ajF}T~AF8;TRB!)}(*|P^w`R!Lmlg>-&=nI0`j1WM}|^n>0Oxxi;g<(T9lTO%Uu9 zC5xO8P#^MkjHrNdaI~K<;qb?WgE?HF8mciY*jKG$@JI(baI6~gqZX4f-M6S|6zIFO%R z6*bRc8s<2Kx&uDGFVH3{&>?hT<>sLa z`_UJ+AgtMi7uSt9oTyq)`(@Xqs*huRxV}j#=PbzCfbR@_5vFD{%z-tkH-tX-8-&;m zC$@_NN9(kjBQNg(limM+H=tMmelwAPEGMtu_h>?179@8m&4}M*2265lggT7kNQ||E z58JCDY@Azcqp~~Z*@V8}>UTTU41#Tvw1Ol)3Yd!z3rgc0Y17?=Esj{V5|X84_QEk!xB$6I#F@Gcp_D4rQp5MBZo=ZxFY^8efw&(e_GUs`hx1QZ|-2V_dRlUTs5=9hFS!u!c=no|} zj6>L2le%g=F5@oQj{6n3UDw&p*H=8V$ePFuQv&s=Wy+yqbMi+kWJTCWmDpsGkFS$8S1<*9R_+ zSbu$T6mJy)eQyLsNFKQhPHD(=D~{ApYoM$t*3U1#vjN}$ zKp>9o0Jo!&CMT4tM=QSTWsjL{)jDr_x!#$gwx+DTGT!P-8fB#^w#mxDu6I-502TS*@`HlF(RXdZSIk1p3=f;R4irSbx)nu&0~=)~QaWc>-BD(5 z-qw2p7>4^)BVm@`FNO2OS)S+h0DZSSQEFI%Z`AZ2%au5mCwUraol6q6vtE!(c(+Hn z%-bf3JCw;Zih=#tANF2zWT6nsE?Qs<%(Px?gO5EJ>+CL!S$I>7d?N?mv{e#+P#s1)2#!=^yQ4%s(0LvB$|cITY#06{2F9 zyuu+edx7r21%R7tdjhQNo&TiN{CbFnL?8jw^EBX>KMg5?wqLg12#Ed zogMifvq?=5JqCx}`nsj#VEHb!B%kK_bOap!X|EUihtRiL#D55nPftaa%FU8#qQW7< znMjXD*G0lWT7$7BzOu>BnikE0t$u48Wd1+8z&&tMR#jHpY<%(S8WzyVz&1lrsJ{ z?{0qSh-4^(Z^8y+?nhG2(`uZDj-b5bIlaSvo3P>Am1`X&r8k{$cf+XJ*{Y*5KJQa# zJ@b`Z?1O-5219AehMEC`Za}wyZ>EwgcjjvZ|7x7+?{ShWmlPQBR~mE$9WVj7-g@~c z8X6gL1Fg;$9HMK$DB;ks63w0Be*7)8Pii-dI z&%|PS1+}fOX%=oLlmcKnIg3@1A)!=(qTXmfd2}c6fn&~MQc$%btX5LI!Ub=3H(Rqb z^?(DZ{FWmQS>XX#CfQ`vcUE*ZW~p?}e{K#WIokv0P86BSSku> zV?(83F$a|~rE|J_&yKiipa{G9jf-Dyq;nI!PB#QbB2%ydxrl+k55OYyZ{@WKK=ROP z#gXb%&~$@bTq(cam$^hM&4bsKCKr-Kod6`QFk9>*znQDMAckZ`B1=Iil#L<4eqDZ| zV)ij*ye%hjcPvdf!AZ2Efye@tVx|ZN6El|#g`mQy#A_UFNqwEhablVIoLjCKglY>* zX-A5uKC5?a2Qj&cFMx>@c`zw3H2H*T=6;Od8VR>{v3%{6`df73{L}2yN~8D}<%b*0 zVNB(&&d~gu$v``^a=dMM$yS6w*k%bb#UY1aFiB=s2D{e{Nh2?gei$*{`>JZfHUJX~ zd}`7ch>OW!yieS5<@m!|{p#A1 z^tJ+<|7V+lX0=O;SM}rj>IJv4p=DT>=Mzku4e$@4DNqXlxGeW-?tp66=%|+1g3%1? z3DsR8OXE_fsBS9)%!Z_hs3!QpAw~F#N>?%BxOXh_HTzfj?Cn$52f~zlHxH~(LAmk_ z0I!Y-v!M<<=5~sfi$i`w(ZHTf-Ez)2NzLbdCBjXv5#sce23WKVposV<=Gx>?0xv2qtte$RCqoSos`0E>WmtRn zq_Xiya9skff+7Xt;(Hz9>6gZ$E!&)%3pe{!&o4#CDl+#NCC(d(X*r#?i(%mPcr+1E zFY)3D_!d)?Q(AnB^Lal?Et>YKK%mPgyJk^$*CAwZh{YhkpvueYi{3vWwJ%C9Yzd-g z^b}*;3Cj{20?ipQl$FZ&wVSK_4{vz+-SJ3f{~`35{}Ws~Ph$1>fJ$30@*}1Bpot0v zx`i6Vp)yH1BXNX<_0orhM2i&ZsUMVAO zup9bqL9sv`D=THP9yGIyFfRkYJ2Mg03{J0CmW!z}<{4u(UjQp^hU; z-ml1pS80H7aW=Y)D?9}?C3RPIofU^I_^+W~augTVr73USg8R}n!pyGlJk`4MnuLii z^N#?6t5OdbwJKiW>oG)2Td{HhR>*9_O_I0?=aYz-*R%G|y2^{z8&hUPWU!*vrtmUa zTBNL8ql0}bRHIzlvvabNDZvE{3L2z$jOe8Q5W?7=i<9npxk9B%>7i4(zH2`asN7j= zsKzsmq@Qt0QI_3Qp19wL_%nn8JYXnrU>dSU0&ZKEfi=p`l|NOUzr{E;fXYyqSD933 zPu0lU-LencVypc`ye>C0RW)f(r>#P}sF1O4y(zg%cBxmH680JT4ePK!H$u|z20@tz zqeBz{DBEanYMh6pFt)$@NdIWkO?I*|XY&L!3!eGCq*|AfnD-lpr+NMGdQogNz{qkc zdrxDJoUMu2#reZ>P%C)v*pVTC&ULSoE#?TA{ zN99&TdOjCEKaqp+Bib4>5k(p7ZHiB8ji_jxENkzUUfE{uJEWotuy}90ugpPt6lQmR z^yedrj;KAdZc58S=Wf0&JC7p~959(2ML|v0!w?8+y_{ zYvv~GD6BE7J{Iu+ED)_PwKm~spAIc!=;4CZ6@iD{5zu{o=6w-qk zFJi@6MQV{j!e3K_s%_J*rM`coUcBy=EPb06x1=8S*1H!u8gv+oR@PN1GTN@MP$}&H z>COGy3zsA?z`2NqSibWC){^Paz$^4*Xu&;ZG=Mm^4?~^vQe#iN-|$SqKZIN&)-hx(<(6`l#J!xWx=S6HMzFgG zjm{t%(M1gGG!~3~XppN&Ltkp-S3`&v#W_IB>-J`v838r0G{4ORfzNfo0c8hGr)s z^mi7OAMzo#Oa?My5Xaz(M6H^fffR^ZH;0GF!ARSV9GjY;gYSSst+~gi$2+(3i9_>5 zK87qzG}th@k7i0a-SfGY2L%@VeD#vR{)JSOAX?IejCR%e+?)zFz0)zJxqq#k0?(F} z?j_F7Icoz<1HyasJ=}6X_x`q0^+R`BqM%E*t(#nHEy9&<-W(u3;ziWI?K^u>q&yoq z{RM^d=F`+10ZbbX08l{DejpW!UTEL9VLY#E?em$2j89qSPhy zFGWxcul6iSFMQ}DcWc@@lj~)Cnz0-k^$;SNVg#>gd{q9?Ww&9DO{SaF0USrTmtY-^H14u~5%{t4V|dc&c>PIwbg~g96|=hr zrxs06X8yRHe8`V2sKSLwa^EbHFJ(-jL!-U4#fZ%telkCr>U%tP&X*8j>JA_LNt<%) z$c-c`)$!(MF6jzr>6-qAv{bqOZJwOL8@o^G#>{dK1kM>e43kO3L8&u)NnZAx6y2JM z+g*&oMZ_qmLI9$x#QB!d=44*s)^8LfIHCO?Q2Rh|Io3f1Pjc2Vs^=4{I$RbEuNa*DnTE8*)RN4 zD(06DXw(a4C2=*;+Dm3ba*JYrb>nIXj!#(xf*}9^P8+HqFYBJkq-kA4wNoNv{8dU> zH^*#C>{b4Dh&{p7@@7*$j?k-AG*E2ozcUnRIT{6Ytp6uC<0N=VFQSk<2 zu-WKxsQl{8#F~jTz2#=>;^@L3n5(&et}y?;i$U6a%btOva~=J%o(_#yw3zfoM7-af zO(&UP(A1|DKOEZ-oR8)a8`f`ctO^(-yzLur-GYB)A;F7)9owWrFZ(Phk(lSwm&%xA zy-^o?F3;BWtx^KDtjCr||u$j5_9(c%tF~+ zfA95P?^FmS4;DRVfRGSJ+NO_4pUX2 zb@R}TY)4AB=?A5os6L1II;Nr?F&-U4%`6w4+BJ4hW>yM^p!8gV_#e}njTqe@KE}Gx z&t|oYhmFh(UAMk?jE2Qi8xPAUC%xBal>CR#%}ADsrjQ_iZ70zPF}oaC9Gz-PdnIoKi92*to_w{pu{(V^)+~Ph2SErOCKE zM@qMr1ozR+upp|XYH^2GL_V6ZtM(HGSE0MB$q8xqHQ~EELoVMQrnDnLf|-lf0J_z0 z_d4)r^>mXZUBca~>22IDX%jf;!60K(mPord{+EdA;!2zNCp{F4Z(y3lHe|VKq4YOR zxY6jxRXP0RB=l!dken10D^ZElpK5;jsqFS-yjQ+yG=^2Ux%=;cToK(le5d31|2Tg_hV5Wp(j z;nhk?3Nzp<|GrntGNy3Bb^j2$NCC)IfEimp`W4^`J5~aI;JZDS6gE*BJeB^_H$4Sw+_D2~rg`A*YG=+y z89K)g-x*9~fE=|}8kmtrp6wEP%4(4dH1}!$5VB)F#M^n0SV~ou{$D-JToLYE-n?ccuqN**kJqco9UH#lF`By3wjwB8cFohc~g~!EWP59+V@|N}o%NFry zDG;Zs`rNWhdE}5Nti5(5Q>!@n`VF-$r8}CI8s7~FT-NgwXW&tnoff1`SB5QwPe*ql zY$--g&pvN_c@3o{^OW62{)D62Im=@%uzd*;0)d2s2%lk@_Wz9a2#QCC3JBi<(@dl#m=2I9KGm}QIv@C?|1_(f_k~C(jG>(h)m%~9S5?n z=_29K?@r7b-Xl&Va&AoDK-2P@52_J)P!WhoQjz|kAHXcki<+A0HSK#c&$Lm4wkk~{ zWg3j93Dabm2uJh?bS^m@7~FeDhAbhRXAes}JI5dLG746jbWppSd9C()j6T($!oCL+ zJF`-}KWk&fV*6MU_NQZz=l(2n47n!oWw2deG9tIh2dFnUXCfn;)K91K2$oup+QPAV zKHH{TWl6NJ)Yc7s#BAW7ZvWwc^CxGOs_t7QPf^yxyKC;{upPDW#k0H;98N+Z@8LtS zc9)+5!b4aFzZbMbUnq7w6fa^%gu7alMx(2Jd%kG8mF$B7u;JLb$Xr>WM1prgo7E~m zD>RC9nYA`*h30gaHfB`+OdS6jSg#6*x&&Q_Q4rP2T{BO_9stRQr9;c z2SPjZUoCucSrzB$+h(HcS+mCQ;^J_4(hMY^V7RctV!eC5lv+*1!a?vowkZobtks-c z;RQRmfJFflrxrZt3iv~ot%6IQK=^AJTQ0t{`Ze5`!Uid4Lt&Qw|n z0zoB%=Qui=iKJmk2m4%Wj~!1U7LO?5F9yT2A-BY(Y^=Q(eP7sD7F|+On>)EMR&Ez1 zp8paouA&wF_cmE>P2cJNs&7_BIq}mi8igUGG?jPOlPx?bDfR%mY#veF0wCca8ke=8 zcUg59#X4#$lZ&^;rVe4=Tsa`$2MdUMs?N>F;*oG$%p0|aDWL?@PmgltJ#V~Aa1TW6 zVmLuHyQzS$B=;K*TGKR6M-G825CDF7>VD?uXJ#TaMvzu2dANqaTl#Em@s1|ByJ6o< zYaFok;D6S$TdMkE$qeis3O`EIx3JJrN$g9L<*A)2eOMo-$vC++Tp%%(DX7W{RLz-U z=%;8lR;4Ek<>F0eI!L0*w+&hq4H*)RV# z+b-8et}dVOCQcrglg3>k zn|H05iPPj4Q@5x9V-Nc!3Fm`zwA~9^a9n2^-0fsG+Y^W0ax*SLT`q**em#WHUT#9} zZQtXbwO1I^n7P38`^4wJ9nY(6E=x#R*{TFEyjd0~(fC-VVnn8twK5Gp5w<_K!E4A1 zG=j}mdQ=mrMSSE5G(erq;hT6|q<6Dc+Gx`s?=Mh|jth1_=@BOJGWXRNXz>2QO#TPS zi#!Z^YcLET1`BLsZ>jYj2cje;nag|;#rYaLnDd)HOEY0VU%F8W=O8GCt`b||yg**2 zd$o!}H30vE$yL~&H^2{R9F{s03N)c^_Bhlco|2`{n0>ZGT2RD`1ce?qD!b{j1h5*G z?m^Z@3}Ru2Hn3g;Y->7{OVAhTmF&6fLnY_Q&f6!Jdxkv zXBw7dnE8FC|JbrD22(H?4q$~@ve@eB@x+I=&W}fV+JDbtNx%TPvXn%+^Ov{Ei#LGc zD4Lro2p__devu`d9pq$p8#l{&Tu+4~m;Iy5#ithlfCWl-klr8& zjZ*4h&R@4US)8g_*MdREu+n>Z{OGrJ@z#1k7~meuqbN|(T-~s!K)<=xEGz{emc?6K zpn)n^HM%p6-;WAh8e#$gbPRV^0sKkc_;mq^IKf3T2VI zr+qF;b@Xu<&iH)D(lMKw%oC5$bT*L<|m zc0j7pR+31So7O^1+q7T5?46By_d3gFi)6DT-^4~jmF33L9g&PXn6(5q|KAJzJ3>>J zZ6UyV*;mcSAWMDwSY>hB1eLN;D`v=8a2V)^+bxJEh7CXh0niCxHS(||py-x*VGz%S z)~4pFV3$nur>{*52XQ|>Xk^^{I(g|i-P7K#fjYG!o=|lTwN%%IHje)D(!=&TLpa*4het?8O9I<#@m6lHOOlYcwBx@AF{b&Y0t0| z`|J_*YrR$A1LtYoiM-YHCqYE`$Q5Sw@7(i0Vo<9{=~{3;>`u*62pIWg#eMa-H`1yL z#f0PHPOEsMV_A|QX~HqVz&sR1X-8^&dQ>xeTYE65RhjD+8=H8n_Evu|Yhs=Oy&C*( z^)(r%)KaVW*th{3XeSxc&cfN?K^|agx!?7t-d$q|9cP#N-Qkz#dv-9E1n@hU?B3<)xDOpp!1euT)Ib{yJCv>{}=L} z@?#A04swKBx=Ku;)&aYCrQ$lYacM9No09N?+|bm{&od&_4Kyr}+m9jNwid)l z@^|t6c$|dF#<;S za+_HVTNO=f1H6xEYD|f5xu^kqd3CQ!wOEVm!{ihy&6S^7h<$p;RmFNHL1=tFDq1;H z@FEmM{RIbpL;q7#?JYyD^nzrF7c>D&vyRDy9|=i=--@^dE0ny7$7Zl$pF~w>E9WPF zz>Da{Th_TmDy}u*)7~k`jNojuBg25D_8i@Bxz91rdI+WwhAqXdd-~6D0b+-V1|WEx z)xJnRJThvGG$K1oq zcTtl{q)%$<#`MW_UM>|Hr!~2k*plm)#4B}0Z4WS?>qpfG^eyi9(AS+H#RUBDnF59f=&+(YBn`u!~ z)P1?xT2idlgiN^FXm$9y@Mlm29w?{E!Lppa&hoK8OA2EaT$)A*M6Q;#K+6bvbI*+2 zXNl$v8;w)t(VPb%&B&YZY-D8-W}|}crKF(l=AhA9l~iRU;)>&%q-1Tk;doU7@b*9) z6N*%}6 z461mNoCu#+L3`)V&rcsIJKu6`^O)>?iBx5R&CXB15EyF2X>y6q-aZb+r;;XM#h47i zjL3prm`r{lf`f-(lQF0EefkaZH#2{VjdE5$MFe(tV%o;aL+Dkj>b&1r5 zO$6-a94SV}vd=4@+%^n5Q(b}qO(?Mdx@T=B%jLCxuMt|rvq4#p0y)a&hY$!>ecVlI zijzM)R;UyV+QC@g5pjeY92~Ol@Rc3DG z*10}UifWEgN0u!DnB-|kU89%Lch}v9hEZ#pgC{dc{vi~@bOAu~mY+j=0|v}O*TK_! z0E$LNV=Wc7;b$rnk0$K52gaGH5@VnR>))}3NRMU6Ts8dW(_JU3 z<*odi8}g7nyw*RYy({zkPoJ+Sa=%{6(&X6L2^Y@a{d`^h1<|DLQt-G#$Q%AmWJ45c z@ZjP#;4tDR6G7|Nx9UP6q103$0xS$XT)a$B)he`SKuJp&i>P=ENUCZK;IXMiMoU1J z<^G-l>x-tXU|LG52+o6HrYdTKvMdPM?>|qAKwVqE?@OtX_h2DUrT3$g-vo3+AC_~Z z<31xJ*RgG>pjSWH#Ps#$=?@iQjucH*2YybVA~dQ^9#y!TC+W1B7`kerWNwS0c3VWP z_+a-gTjs(!d-=WPhmSbArMu7c*}dl^?&B3cp3zU7&soW%-0u;3jZ*02(9h3*8~4$d zQ}qBC02~V4zVJktz?&guCi+O0b5+yi?;LqdWXY@l>0LOS-~%n=1=dEb`%v`cb6+5A z3S$7*c6H(w!Ab?rrfKm!F1bDV6yJP^KQ=Notyb#=7Y@`6YJMR0CmSnG3VlK=tI z0EPyD49tyrXfYAk0A|ET+gE&w+X%<4!;X?OWls`d;1{5g_O9tSU(wFyXQBO_#|-J( zUY=zf>eOL2s&ju>q2{eN)q3`ijpAtC6vosANWr~mR_7HzkPnn*twWV5G`oW{S}>o( zI`&dcQ}&WUAssRmB)N6QEUN~k(x;}xfVC;-x>14gktREy;w=bq%zkT-T+!e zFe`(u&CkFt!OFBw(`E5Ikgwxl^a~m5d?K6SkU*KsizqY|3{-idB* zBW3YBV3W1S(T%-DJ88n(o{79T&b&s>^QorFpaVh%lw~v%*0cGgh%wd3Uq-1K&$qve z5cOjKz55{1UeAg4qgV^-`~oYZR(1h4bWs?sJA?caUYs(SU^(M(PBj}Y5sq1L7D_#v zHYE?AB}aGtPqq1J^EJwbno|E^IZnwh;4+0AM2EoFQ@Wb0A->)sZ>CYdv&oRHEP;3< zI>JEGHlKott0z%cJF3Vb85Sai#HG24;^yU;Dqth^G`Xln!Dv1yXdyyb6Rk(JjQKAj zh?VgBFcBPJT?8UVmvwYkS&_br`~2mss@Ksjh!Gm(Ad{!qBd!ytn}LLkVk=ZeqCLYT z!i{08ZTmRjEFOTQLrs!o9a-b(IwHtShpkkNGtm5dsi&?m4~$@^>b3z`!NTp9@f^q+ zSmrotk+-CDA9qokFBdsFyk}T5=A)${QuUB%+^AEJ7GO_8HQp<+K&FBO~;a0ci2}%dA97FLkr3 zJZ39U;&kjw1da69O?7{e4)93f|3Zul$c!y~0)qRnypSou?sHiSmHgb9DpbGkd^!6v z@c3M2>8J18r4n8|<#9{#F>V+V4rE!EY~dA?;WObPE6;{#hP&_>WxrfHreF;NhrWMS zxoUccUAfH$_{X?F@`QW4QN^{78Rfq;CD_EvN+<3ZU#XCiopp(9lN&2s=Hpt1I?j#R zZ+z@32spM{HLW%((os4J%qIAzx3KUwZtg?SE8_Rh!NfhUNAdtjNhlDKL%>&aZ*mnw zcMio`!@zO;7=mKAn6zJQ+l#R=DdAj1DkI%SRO=yLkr+4>2aZv{_Y{7hld2{GQj*D1 zUL2>UeL+q8dXx0w`JPc6zrP6yjysEH9vstZ_}_m>fc6y-mkDe}Onmb5ZHCYS8vsA@2o z9RIdFVnDs57DWQCVliNt*nQ$KBH&MV2z+Is_$jN_E6nch%@QkJx;4(oyC2TRgE z;um58I;^jFe_DheGsJHXX_q<6MaT<@+ADjh4uvs^B4x#d z1mAiW{~=*qNIDvn?j#UAhRoj5zZgzmVAWfM%JW_QU{zgpMp+zNr&!?`__ZE&VJR@S z8jA~BJn=p7-j%_~&9SyQf#J-95c`?W)sN z>{v}aXA%`G>yyz01ZK7|CmBOsCmBvQd2YrozG)%V`1$wv=@unt|Lt<3o}sYC5=PD- z;v1dnZ>p9w;wbPlW~`Nnn_8sbHZ$|Mf-NUcY)+Ns^4}-KQIsSVcVfP6VA6mE$dJep zeg#mhj_)i9Fw z`z;)YAoIuafu#7LkS~Tyath90w~rC4_=mFqQDi_n7tV7e`A2^`jYZod_<>by{4UK=tVmY$j7>hHQymRuj?=!#^bzUy)^n z-v%x~&*)fWVG9n+`=A516ULmP>Iq$rDj!SC%UY!vgQ8Z~qXo@s0yvtHlho zK~hp0)%8eFGL{nUvnxX-jH4E%=fenwgjvdj#b1H%S?;U(^N+3tR)kujQ?t1XRnp_U zV)E8MzZd&sbf5nT#|VN%-v1N@?;hVWcCx~T07$EZWbhg;@VFL}(p(vg@{C!KVdTp} zN%kNoR3DLT>sE7;ffKiu_oOwgS_OwWZ6}93-*?|PuYKD7=Azx;Z3RQ1+}k!^r1plj zFHz3%JIvCFOvsl|1r&e^(u}1lS+>}LNf_MFb%`fRq zUlP{xlT6o)`bzyTy?xRty$vC{n~S;Dojf=l+KL8?ABhr|x8W*hV_!P~7e*La9Jmq? zSBOI#I>Do*m7Lz2xz!Yk8Wkdk8ZX>aU0gZr0o3707Fi4EKY+aTrqmj}JM>njq{m5A zx06akq)gPHsh3qQQIg*wBlB*Xy9`xD>n$(&)t%SaYZp+QzD^e1de*PGx2)+WtdG&!iN9E#Ti$ zM&s1dKKY_zF)6C#@W;72@xzodWn=pY+WFoHv6hymSV&CQah47=XO8@-J*oeGzLIq? zQyu{goI6O9la6GoRFKYrlaFOiP4=caX}-3AD`%uD~Ij(N|L<`KcCh#(}^h%ja1Kx)Q4 zk7@$v2Zz;=pS%PETj2yE&%K+;Mv1=fvB_b?JKK#}n)AA*{3wcwpmv=(vmSxO09d2c zD4KBjQVnOtZXy)7dJ}uLhlKSLpP7;iH6_Q#)X2ypqgjVx@rEl>NvKh@&)c7L@3x=_vDrrkBdUo3Ql0DADE!GlW?!kRa?=HDn z{zbZBZA&fpiYg{7SJ`JAj*RmhOgFAagH$I(;YXk`8fny^(x+ej*N42@4T6f_QVrQm={#5bkW#NbKx7bMl>oS{JhR0_13wz z!KeIF$YJ9fX{$eFWrTJEEl~Fy80f79B^QQ38-Jh?_G3Vh8XufdHCcMN^aadH?y6>0 zB}X0e?43^GbXUtY$FAo6Ini&;L9V zo2(Y{O-;qlysT5I%;1?LkScmw5X$Oo?L`wOPLYDZDup69BjBW}NWLUO7Q1Egvkj$* z-(wu-Fd#&RBX8vXT-xv|AUoy@F-?BdAJ&jitVVq^O|Z{$U}lPgraQedZ!7Us+!XR@ z=fi21DE=iSJUoCh2oxKQXTgZL*Czoo^+H~{*@+k+x|%fYYriVA9)-m4Ze4wQg3~lX zsw6~@Al0e56ehmm#A#|}#kW06K7yg2ZKZzRIhFk#W-KgC;ye*ieEd&sdlq96fGv^O zSVn_bXvaLG{G*(5zS^n~)#u5-Zy?V=?;V)AwgPPdN?!21$N-=Ypa=^R;EYLkvc-ykJ29+9`zwPaTAEE{fJ6LLbw#xS&9z zHPX&QDQyzO;^ViZ-KgCBt*uEJK^7@n^WFQ_I0@KE!Mv>I&djP0b)4mGigel?d7pM` z?0|O9WP~kT*xjdduJN_?n_DnSGd51_#9lhD~YFL?c2WgueN1ZCt8IgL5 zRa05ieU~D65&(c82~}LEevT<3nj;N* z8Nf>;<<&E})bHA&J2nQr%bHBiFt!TRk8e~}Q;P3z4vQK^9ge29ML(cXDd)F>|E~02 z1x>GFEcbukFx{TP(r?;YGH+goV&Z|V z$v0$}GK_$ zX0Yp=Ag}7$3rX#|cQ4TBHQ{lVjpfy{-mFptH!!Ctt?=LS(9hM09t&+_|Pe5rIlo_^y23+tkM2x52FWBqY@%hTCoJ&bBa?I4kcI;SC7H~cMsmIZ!@w`_QKy^h?<4gI&= z*RTH;{inZ-3r1nI!aA%Au7JJ}g9yTHL$x0r>DF40FjQk>St5u9A%sl z4yfk?Sv~q@7cl9hz&$MMF*A?reF?l)-bE0BsI&yL)Y-RKzCXHV4mHj(Y*ow`9-_PO zZ?@~%-er6Vd#HA`jNQEyzndH#9Ze?6*6t9pz9K8no^^UZ0IdeS{`LO(FX7ns$io$S zGeip)*AbaU-$YGRLTw}25*g{zXo&#h;9> zb449BRjQ|tNX)o2Q*U?8#jC992ytjfMewbiY?N%mowNLZ7t68m9=c4SXQ+A1>*nvg z(CFY38&<4L{OEL9CzWYSp}XV2JGMBDPFWP=5k6!UsU#-r$9I<*sMcCknEoBg9(Usy zpXdzhWk9%-fQ(C*mT zNptw+t;Ing3&ZSUE^!PGrrK#Pgc~m@%(c}sMMc{&J0+lgcD;jNK%Y@%^KmOVNGQZz zy{S1_@k;-P(3m{|Y#T&ekA;=T!#-wu45}G}#`p*&*1HdR7T3d6q5tkWx@|15u9yJUu#8{eq_Pg0(m3iBgB>qFD`R{6#H)R3W;~gj8a%XvCju*_4pRPyP)r3niq#{}YK9BULE~mHU@b zF4!qD=NwM0H5%{h#t$g3nwY~kYgOT4`6suh;HYQOw4S@48aBBmAy+$MGHLpkj(FNR zCjO)k)0(f0fB`%hX0f1Wutr(WC3z(CenHlZBjRLJv^LT<{kPVgo!u;CtyF^lcj?*S z4~ripN~{dx-|FjXt0@ZBy8Z|%DjO<1BV@$eWGN5Tn!XXhq0KGJaL|3HmGWd!T>{y= zN!MD%r`IY?eE_}*r^Vm1C;R~sJI*+wF75VNTvYg5#1uJ$S4d=Pv z4_d?egC5O|;F~~sNqgz<20j~X9q#c36gS?EzV3xxzeeokl)%f0AEf#Y(R(FkE{-K$ z2&A=MXf1=WoebFsP)9UEe)`I-r@HuSSsy-T)VG466`nJE#Iwlv>oM~rsR9?{40u^0)@?s(oD=IE%k{F`c9CG}w zF6jt|9w3adshqi30Q~Xba7978X&epQyPJ7vNkTP_w#p9dE15OJ!6ZdzTDcz89@QjR z9o+ILSiiq=EZED^?ekUWy|M7I!7a8eUlCR^Y|*86?g+V}a&Z}N^KhQv!lSyRD}wp! zUrlVVB_}F?Q&=)l^44HxFM;dVZfQ;UH=EW?=V!HVJ}Y9fk?{$#?r;`$GFft0bPcRx zSBKy>YU4fCsjHf%e4=D2rUfj=#U{VZ`AA$J?@}&-;ww$_2WTOBSaQe~BQyj)voXvU z7uL@SVMqM^lyrzRakyoH%NM@yMhr4I(u4F#inAH3rM3pVs3{ceJXk1{TB|Z7twGh( zI&_!E6wuMB7(VXQIboZUovB=lZIun2*}uLGC8wL%+>l~%s!sd6rWwDO&ap{?Lcb%AjEczuY6 zlcqhmdrU{w^@ur^H1stagW+*3pdeyCOwS8IwtKMy=mxFiUCR5)bigX`iS zZG$jU@u>1Vm5_7yi@7Ipd(m5JCbiMF95hOx>Fx}Z5DoorU|bO^T`!!DbvHdbSZRFJE(4@NRM~)}7OyhZuw5LGVQq4uDoDc&Az2==tpxd)UvCsW zeXd|>_a9xo=Qrlg^6zcZReCDfLu^3`ab#u#W{Bau99uTU>H-%PVt5vkjFy!@!CJEl zsZDa53?A62HXvkjd~+Ez`gzvTB52n8vS2rQHQGPQ&a@Pc)=v+(|?uxQ<1xR2q$4 z+xCwC5NiHN2Edlm>hY*6SZT>9jYHidl>8rqp*#go&Ef{W%p^g@%n&r%tBy)jUkiOi zA^)lnp4Irqq%REXA-9|108F#M+k}-r9Q40IHVITuN$H6sis+#ZEjGDHrevt4d}+c| zl}nDJXOVXQO)Ny}v~7G*iT{^K;fJv-&n4=RO`o=aUSONEwcpg^*B3v_ibqf0W!FKN zZJ!GH++2MUqQ9F4xn;+EKcZ(FW$O$tu3)Bh#;=>*(k?*S^{pyriRjX?FzF~>N)E`H ziQGazeqE!(@QE-WUH_6q!6;zYAbW!w3d0KqU|0q@1&nb(($dp7f91|*JD90yrRH7g zYs!mGl(pg(I)fVs`*Qd#4p&?)+FAVbNGrV>-~@M+9OhCdLqhCh!rfav^h1WxC6{fd z;gS!00YT{f*8|p=kSlOj_?iz75>`&_#3)yV+w|^{FU897;~V@(IMnwKHyOx@>Yrjz zv^zNRR7mxjLMJRN<5-m%^C-(in{c|jXF&7Mfc94GCGkrx3<3lmRw)x!mk}Vgm~9XI z?{8aWmOB)-NXiK6DR85WtQ-t=A3{-t5*kaK)0AkM81K=&Sd(ygMyUwq`^o!<5F9GG zgQ$gy&d(C5ti;)-xZ{T|%(=6RoX*hvP>9k;>qc$f#oo@s{=XCBhth^C1;Kn`;;ww_ z9I>cy_MlV6u1%hD7yMmC7Fhu|{SM;yZXIf1`cr}+$)~RRV+m*a3Qf^&Nn6|OvUZ$W z3(v-;&g{BmxjIo#gB8@ea0_J;8JzweaEG+gs84+EjSx#-G^+wVACai&3cV_-B*(B%sY2{`iiL&%}-WU+gV}8|H1p+2sF2y3jFa_3WY5Y z_@azRvZO`->}W|(pydDLE?;4dty%H`nmIkO?;Dd6)T$Wk-P^bG>7aZaw2}b;oEqfc zAo`b^WvUno85u~IsMWSTpA&zi5E-IXm8}u62p|8zgoOgrgcN&2bb+Mmy(hJYB@ws) zxx-H+Q5HXs$J^?;yJnIco&v{HQM3o-DN`Vm4sZg3FWH| zb#|ZAByAWDT$RRS`FVlnbMM1Ti=FQWrRwDgU#)l1aL`kOiU}eQD=M0+m@lftDC%>m z5Fz&qWR|-l504!4n6HYQTZ}?hfRrY6kFODoVM(gbGZlW6j75RB1a-ecyAwklP@f^N zH+rZG7JZ}3aAsjxQi_9`2_NibfOk}nylIPk!A%{z;!gS2|36Cs6A4S`CMRR831ysW z#U?n3K@E*lZ(X4PO{o>LF+LZ@CW|mA1 z{vUSD#<83>Rz&yFNgAF#bXxe-*~ZHaPFnRj#mAT|t#)stWNX(S4?hef2(nU=TRsXx zK426q#PXsH`DwU|-)yzD9NIYGE~p$t)P(GyG4x(@{;s`fU| zS~`X^C6;HlFh7&S-56HUV4xbM-$#8olXUTlV5*ea%E~4G-!Y^^@FoNKfU?cNy5o+5gZ20ZWs0e(ZH(9?hFC2u;V42Pqc|-ZO z_WlHB#zHK~1Q_oxrP#^6*|k)^BxR@;xV@YVO=~~ETCx!Mi{p!)2QfLPZE>jKvst%h@+L5nn9Q_R~igsc`gB9N{OIxhdf2BfUP&j%Ms7 z*EFSfygR9sc8g97uCl4fd-p3(8>ZRyJPmsg9sqfTjZ!%z+Tr!cahkd*d41wV*8BYt z37DeNSm(ByjYMT)Ej64bn17ooW^AF>9Ad4^S#O!)E|FL20tw|87Li&{ISdZldJVaK zLT-i+h3|%pL`AUsZ5t{2l-?f?XXGlWLK*Z(3oP@FN#U?${}8(AOM+TXOKxO+!!$F%Z9*lEchSY?u-3=h;i3KACw<$U$X-gazngH{TFse5y3~Rd@6J2Pq#{UC<>f->76hmhH%QUtE)Rlx|GJ&KG&Oeu<;=q2VvvB0{jIdHdHJu&|R2fEoQ z<c`d~$iniM8T=cx30LdlS& zJu<|KZlc&h0}8ths&p6Q?Jzk;k#|nKq!n!h zRXJr*zbnGtKZOrl0OI`5X@+2=6(K$c6J^K%ue!V~&G&YGRV!u9iSX{C?(T;T|k|J|0 zVctqSiY~nVr3PRN0rXU&Jl!dH!SzEnm>H){dLPB9F$g0fDm$pX77mVDld@iNW|l@nvia+S>^zDtAMhJP_c0`!N%R>*9fUlQMGGZqMo zMNlXuR@Mj{le?_EvSZR!7Z^rpv~IC{l= zxKSWNh5&$)1qv;O)?==pMb5m=56G>Mjny&kx>J5O*@r=RDzn&Ce@mbG0cmZd3jZi3T9-48ohVbBdzK(HEoQ5a5nV z2OA!s$fAvqm`Hc3Mr47Tnpv|+9jhG;8WIK;CW@Q)@T?1hFI8-0j0(^St~FK>i8GvwaHXK6Ql#LgGwZ|2@C z>=K;mY1$WeExz=$OMcF>Hl7+U3N=ezA;HVaP5`#41EfNRwZ4O@E)*F6!{~Iyxb<2v_n3Yc%FpDj_GJzd%nWYppXCdr;N-(>{dK)|;(d zvpfVpCCgM=nEkCu^0##uex(KCR-32%lZ1EgvX-+N@4t_JQgM0Vd3NRnV?!C;G$U!V zGEy@AP0_?6(_f#|u!LgpzW$EO0AMmP!Rd(?b|~t^B)jgXG*`RC8C*)&d!(Mtx4~&f z^DJxD5 z#iLH)>RmQ#N_tT{&1Hjb=E`;D`pLbC+Bu~^pIJ^aow~1t;3pD*p&S}fm>gN;CE0k= z5-F-7!a5)=~oF84gcFw$$17T<^6ZV0RiiLf5LK^T&|et*p4hofQvVu;Ye>^UEIJd=z< zYD$!Eg zc3O?4o*$TXtz-h@l03-VvTnH^Q4LO5JKmDns)W!KZyVi4NIwa1BHfz}Vh}&3j6#?z~yftZTh^RIu*+^XIzpn1B#-71~q*u);Wyf8c#)2@u+T z!**7cImT4p5MTC?^3xfv z$8Kn|Pg<^AxG?GOnUgB=KilHtwnpm3$pD6uQ;)_zCF435cS+T>7;-Xn4)H^nCo+b= z!`(d*%2XM^T2u~J`%@Y81-$Q0Rrt{Wm_hR9{R#({5(i$#n9ob&R0P&S^enIw3j1u# z_8Ht^4N^llXuldBF*2oJYjbUqnZ$6m3_NHOF{mQwcj!RG_w{pxdNTiJ;ysxpJfi}A zs3Pqi2DK*DTQcCbq(qg=^<9+yDYGM$hk+oh3HZZ&cc~XNu|mgXVWlA0HZeDw0c~+% zd^Nfm5G`~~&u0BC$mmg~m`svJ?UM*Q+vid?497#AFJH^ekZZM%;_ST`-MGDm;bV8a zSa(ZjzZRm|jg}pYQw0G8fvsV^Ct+3BQ|~hsGNS8bzhw+P{+~ zZ9YOZsP-JK%sgp1#b{%W?}kUB1Y$Q!fBhu^PnCuJLx??K4HiybTu+&a=f;^~y2CNf z4AmCK?2>Z~=3NO3)CBL>-}Sfd`L^O|RK`_;kt0zCk~mFdaTQZE$inc!l2Isa#1w@W zG}V}V+Ks2iV~zp4q&`!V&(E(+n3Iim1YpvTa4CfQ@97BYts58TX=1vT>3dZ!b=RBDVFU zk=kF^9#U55$n?rcxHzY-rHp8Jr=4l=nA`%v7*00rKk%n=_{%MAY6h|AJk>;ESb6lY z;(0MK-J+O5@oC1|nItoDH6hYF+0yHN3|aZ#oOK5j4YCsW-aQPYST}qX1qcvB$jR|M zW`6Y8Rj8fFOpa%ZcGnc@WM0rFFjvi=OVMCjar!0=UnxkzeI~^38&ytPT z9OdYzK|>2@2&$%_7+ET4@0ey^I$z6c9x^*(bgl41(d4nMkzqn_GDrv`52?zD+(f+e z_iQe}ibmjTnIjF=&Lt{gRCdI7)5y^xE_HKx%heuD%?P%@nqHT=ura|WAqo7V4v%Nf zxy~q+B)jW0lImoN;p@QqTGh|))}GMu-gm;d>*80C6bV?*K`nadj9v&ekxY(vA#^%! zIe}0vn|cDq(l82HE*b?c7Lfpk$U+cSff$d(3aE_^gV7rD{ESADO0{XHk}Fp>tDTFF zH!jKP6O~CwKBAqC+!3E^Ag3K)~Dv#Mj`C)*yA`o#Mx7`>bA5Y8(VJ@c} zFEW@D;#JeRsxLBs1R~>vpgN(T71SD`Vf7ZT2C7I}Acr24%xfc=z9Wo_Ksf>=qYy{p zniQxcv1~f7z;z(1YIof*_Bo{^a#g7Og>Qci81d-9lf~9qF^6sSXx@PG-6gc}`1-n% z@$dZu8LE&SY6SPDQiX(o$4z4@F2e!m$VPhfUku4AY=y%96Se}1ukp!Ox!!74=(i~-g&kE*G75xcJ%j!IEv$>(8^co83UW>3v zIX4Z&8lux{(Zx!Ou#*H8VD4MTQj4SjyWR>Zydh*4Wu|jWzORvjxwn^);TS~h7_0^l zTtFq0(hoZTQrTI_Nqkj?HbPFGsxU|X;0VbdxjyY78;hfbkYgUI>K z=y1FFY$Yk&X17r| z`GFha%yGG>K1uF<8PO^i|A7%#!2`(bGxLrUfYZ@oVsKcFK68VuW?0W{gb>ooVyw2#z@~5=I+~ACf;Rbr|iRR9m4;X8y{HL%+b( zm4o(E8UV!zR)*ZRaFZ~l%a%i}*o;LmVZ-bftuG)%ZW1wBu8dO2qiy{H0cB~6^xc~I zt?Rc`dFxF+R3~`?av~SI(PBzpc*zS6+4aV>80+${`l-6&UuiRiLlu}TF#JuFh1J2y z8hYdmQv5y98)7`XD{jk|tcJCQ5-}PVFnr=OvPCF5W8K*d{Ef@Vv)^(Q=}Z#>5bWfR zK-0Bt*17NDeGQak@wH7mM+LCWkJ2OmA!JZ#7z(>4vMBn930ple3&n<7{3PU&$!SdGi9lyuV;-|=Y@vy~~*fTAURP$o%{bwtv} zxe~A^`YK8js^_kJer-E@1oZlaXUcYsQJMYO4bJ{ICPVGq+iODWkx&FXg+jfz8>8g# z?kZE0Gq)%`H!Gzd3F_mYij}?SvQqyc^bXD*)@oc_f0KbJlT7JGCxZ{Tkj(aH_7t-BjK0B7Ss4E7V#I}ITY?FZQ2ut ztqKwKmt8R|rYLw?fI|*eH>p-CNEoE|fr;u%>bn|dgjsAgYJwbg+j4vB3M@6rMm0J5 zQg+4KJSs4Gyh+(~88eZTp!MFAN9d)8gI=X+>6-dWr##WuYOk$eib?z^W`Gj-(5yv3 z{a3K{K(ZaDCSpo2&s7rpr|w!9Q_d*AzpuU(sDJOWZ00*A_F!bwM`?RgNgQkmxvd)g z0)&7%8%fO=r?>LW#x?>R>$us1fj+P!<=o%BOdxh9IzrHXeb?<5D!E zC12@mCH^F?;@MfVAL5b05YbS2UV1eqxPC;bVb|*&H4| zr{tSyX58;HI@8U}A%{hS%<|uiwj6(+>lx0-z%Xpf&+4MBg zdRy__5LQr?1Vb!ILqJH`n^YIh#oyIRges~s8q_zjM`x5J;)_Lzb!fG#D{vuUe%`39) zitThk>A|to*Yz|atd|`RhYVU2GhqMq;RXN}z&|hs-EEQ>O|B$boi0t;vCB(Bu6b$8 zbM_AHGpqTYrqOp(fi&_iz2m>QCLU|=w>-`rz*5ZhXm5Vveb4T)PRpzqC_Ho^F5`ba z81M3jN@MI{6n!pveaH@n1K%;#A&L zErND@5Zz0iY3B+ayJoex`PBTyR8z}XXA=mrKV}`BoS6C5Sv)QuyvEvi-8H&yjy^|w zTRdrI|Kyn1Kir0B|Mk^XW*rj?Ac0H7Ad$0Z{ zkj`LfD*tIVn($+q(eOBPT(iZGc!HlrfCET|-Ax}ZC6uuV# zC0rsJqg~?1n&2ho7$IC9|B36C?v7-f);>$!tu z=}g}-tu)w8J_ewgsC_c(0ZZ2C=^{qSWAaW(G7asmwr6bl#j)dlcQCzbF|^(K(QOt& z*Io5YNNMywA0Prk@wVaS8F4_hgBU?BILMf8fy2#$RNQ)YuZD%%ehKTJgA9g;oErha zcU`x(dNV!BFg~Ag=KZ#V&SXUvoZ7z_iY+OMgw5q&&2T5V(W-*d6zE(~Ty~6AxsZm; z3hEuJz+GKq4hD-+1{+~$?&3#da{?P(zgJ#X5it}$LDdmDSy~m~H%#g%bCsE;rgRuf z8h?bVijtLYkQtg-wGaK4dw|oec{}SioF}T#utm)GyG2FG&sS_2!Km-5GbSaaYCV3_ zeZ#Az-nSEgNd!XL%R)cHALs0nBYv{{qOn3h!re{@F%F(6mkP)|Gh7cNDAP&$k(y1- zW6bI`#_x9f*3pz*Qz*?bDs$8*=_72iJCVOXRlBI+XrG);r4In|2LjyW!MY|>$JXI{ zij%UjB-$K>4&45tgZYTw(srikqo)bk^c6N+xiaMjR9pu;ouWE@LAHG!0au@ro$!vPpZb^1HS8`0QwS zvJr%U3tWc$Lt^HUplgq$>Sfu4p2<>TYqQjWFHj80&(P`bE!`ReeZ- z)M>7|$p0V)Pi_=j@`hq5%)U@l^ixS0i`2AodjLps!LzO6`Fr4M&s@64&g(CH%I;aK zq>0wE+YDyb7ZYkM0O$dP5+JiW=_>t;Ym0J5-ySiSQpUnJMBkMrv3#!4$eXf?+;77- zcc#igF4~$HclNwvia%b?tG%BqNTEF>{T)i+=A~uo9B4Jc@d($INev)CU`8N^;6n+I zLRm%#X)ot@g~oX^&6k6EB;PD1vcnkK;}y_3YCXl7yw=><*A*dEq>=GRR$)S7v$D?3 z)`J75n!?id{+9)kiq`d)+84+TOsJp>3?!WjdFvjH2y1;=4Rx}wV1^dat_yKU9+>?U zJx5~4JeQY0T*k#b$;}TYk6Xt1wFonSxhl!}rMT3XWoH@X`f(L;Oc8FJ`@;%I7ajn} z0rJ?IZ@wHW$R9GigkMHdFF{o1o<4e+@~e5civ*)>D9i&ZlAfXr-ZEf>26-%3cs^?*Ds?)>nxW{-=(uuW!boK? z$5mHs;R*NpYR*kT+hc)1dh9RQt{j|JwThm^iG6)K*ts+TORDfq!rKPNzKU0Gs;54% z5+rRla~iwzap>X@+V^$@rjL^w$D*Q_tPqho;e=Hzu2__bSHBHJl|Uy#q8-!;jKal3 z1Nto=!9}PB{saX+HP(a2O|*S8N?4hqiFs4Cr&cDzniTB#n&-lA5o?Wn2>vvckkzAT zBfO}UX*Salv8c|+^u;)Oqn*eL?;ei$w0*cClO}seEfWuweni6ZgOK{AB#_GKU|E zTTa$~(aUjC+{@LkalGT4`1Wg(ti9@i#TT|XS{ftCW)k<%B_wqN78w*1C_Z% z4*>(2avxB*sYT#C!sOk&mN%xTSD$$(lW)!52RL-~DF}TS!!yw+;tnNvE2?AS`S~a3 zM)F(TMTEb0DX+&S7J$131`YYBB?(otZT1Bh1+yHEPK~3CYx9pibi5_p78QK_4>kMX zTkG+$VpF2213zvjm2yAg?{57KK0fxkQ#L4?56aqBmu)*^tD)7zlCm#l0wxx~sFjp#E+0hdZes zgW$u}$cW6n_a2o)p4!kQ-;$=l3uCu_n)1+x-&p`G>^%8Hu5@^b>!R#eIEn>*vWkA6 znji1!_5w(}zI*Djin9z&M#*_dG!k)Is6zm*h8c6P0o2q$tJ@3Wj&zV^ zgr&oeRlSqq&5M9}xcXp}$&RwROirY68b7khJ|o|N-eNI2maBuI?vAP_$uF{Mv4(Y= zVsbY#Mu`i*k^TBg!1FHWFQ)qx0Ckm+vjD!M-jWg=9K5Zoauh$P&5!amyUr&T4~`n# zwEDHvo`N5v;W>;&THkUXl-sm8F&7}wpsaXpta_ws6({gI>exGNa{p~knL8?ov<%4) z0;rV0tPqOTcf-s2*(N=bhA6|38FDm0ge6(_J!RcK>2~5x^y-Y!3^a9PqT4xV^8_Db zX>8S{O-NzH;G>w|h0^XED&Y`$tYqMuzb*t)6WXjouZw1Y$V3jNB0THkuJk?%!E+R~ z=^59HCp{=_xUtBqj0Rb?soL5mvWF(yVA4821yJr5;IP-G9p|Sw5H6$PDYG=T_*^O` zOTUD9A#Cu*L4QX|U08xcky1?&;~zq;x8H#gb?(Is4pti%xh-kilXobYpLFG0T!)m1 znN_2y{0DYN*WO-R!yPZbW`!aG?8p~|NEoIK*kn^0M9t{ER=zkdo-r4A9=Or#bu=Y8 zg!=|wVm*}xRfPCbX+ir^%ilr~oT|pr&POSk#x{TVhSyk#?lq4WdW5PX;APBn;*4JP z8EY>kadPx1o*oZ8Z&=Q}LQ0;VuoTCYKtiD&IGmhJ^(MwByZ*W6at9lIk2L3VeD#J_ zN1W4nqMThIPcFTI;F;GuU)0DwbN6@J`J3OrW!}7B!x&+a(7Iobk+ZUK#gAn>o>I*9Y~2; z%#llM-sUwf&Xi12&P3_y;rHA0JUh>t_VOFkJ@LsbhpMFfaxIAJW#XR#npUWUBCOI~ zZou$E+yT-IEVS$_$Ur1sDCkYh^-5$K*j#to%au9|^Ia5+$NYAcoN?e^R)%)La`?eL zxa{dDZyUvPmapR%OWr@f|KZEM_|NO}rQiyH(-PL|#WcEcmYbGx{AQMTjBhC?#!MVl z*1-5cFY@g7y_c*dbAD@{)~745+tD>D8dc@1xsz$cLPIda@35>X!35>$`7V2*CA3C` zk6x|JtroiBdvwS$a<|`DWc%(aeBoH~RnZH>)oVO&U#E+v&|*WIp?t1u`1y&w2TH`a zIea&%Uu+kThR>jW*(IJwb4D6R)FF>SlP!cTZgo^MU!F#C{7(LT$9`tB53EzQ@%V;$ zis6Z|SY=WSnm{RXW5+S5Lb2tY_a9_iFE#3=yS5IV!gEBu3ZrgAd_zv=ArG8LY8wB? ztg_tzE#a`NIr`{%Ntz3?ppd)wUeeT(5CCKbf~jK;$IXb>4>AuA-#)i{69^XUGw z&AKuMu4USYI`pvETqBaUxkbj}RHqUxdgz({m=HvvqW4`ng2<*{+|xN_`wKzCw~n99 zRj|)L-^;sH=+v>7|LAGS8)YXn2)Ht6U)~SYR~deoJ(|*@N|V9u6QqFI|K&1#m^(_d zPX)7lxZC~J>gTn2^h`DmXtwf5gKOy@U9M_j8=wtQ-dMa0@<~#BOCrXRoSejFb3&Xw z)L+?fHbVdTzJ{CM08NYYjZS4^^w{ORqAv-1qVpRX8zq#q0U~Ln*}&A2siw6WTX4|! zwQ8e=9ky7io3;ymm>|BERy(qa>&LY}LLsjQNX#G&XaY$sJ_nH*U7I)ht|xoFN}6VV z^q8UT%b>Mfs_Qiuspm`wMmUBet6*7T4fXN-4n@%t>!=UGb&$kn(?3xdDHuYe6>#k$J_U|JZrgWP8j^(6wjL67{DeMS*WY1lE22g!Q59Q86x z4JxW$g*=|}kxWn#r!6C?M_;ikVT3!L7CNnKQkxn^66xB}dMsF!MM4>?=#ra3m;~h_ zaa9c#kz1q!-=%Vv7rvWrERpJ&);z)e+vE!3bHia*p&oS6q<2P&%1TgmIi-zP$0{QC zAxp|D#u4;i-}oM&GF$!)b~Nc*P_=ROy0CBaPJGEyJTz4p@6oqRGRfhW7X(+EXccnw zED`Yy|BtJ$V2ZN|wqD#8ci+X`U6;k(U4pw?@Zjzi++BhbEV#P`3lJc<1rH&@w|VQU zTet2X=$WeX^vpcnr_YI_;FW{*UqJ{^-0cXslF^=SZv$Ja``Wp0bZf62w{~+npXK!I zR!Y`A8TP5A%Q}{LPSD{Qnd3?gA!AE)RebXrp${YxvqiONI=X>)JOz=CA!MZSGUA9l z%*;R#!oJ^YG>Pq0cSe`3>fegPyj({Aci4l&$DK~fd5ORLoVIwE9zl7m(@gGH&uQ`nU^PFMhcEL(Bx*yuU@ zEhgbz*ByZ!=g(b36pKv0E#(!Xq#DJ`X-i5vh~nZQMe;sr(N5Q;5^|d3jOwFT_|wF_(}*m)RV@Q^7i+3=Vw~0>b7!IcSVRJa7Gtuo zy4;8ha6NjT{M2L(QT#i}9fNC#lt2j*MD#mdpTeC~T>ppAnrd}8&AsdfcLZ;VZyorW{$l_I$IEHu}<%3X^rzPGz7_l+Dmk@F(HQeJD+TPY=}+7aL1$^~u$m zNbw3cZKd~4{v}O(h7cxGs<0HdIb5a+Rq;me8Z6XsOqPq`kvGe>FMDp+$awI@+rNGH zl7K^L4p7RDOr7-BBO{2K#ucl%o?UXg@T>s;d3a7cnT&(wQP7%{8#z(~{B}b-+8t zvk4TpUN8Nyzh%-E?YGQs`Fsk1YBR;rEF2-hMF{K&k))E=Ny`edM0&^LIqnRke^lN{ zThKt3)R=_bnw0<*ebU(2)OopbxNAJWG-uS7Q2u?L@S&CTZLECh3N`{uSz<2&o;4AM z9GTUhbO|)KLlEY*oirPt6ZZ&NJ_sPr9}&!`5=p~&Pp2~f4+X!;x;p zY1)R=MkdEaN|%<6Vg%FubyTW1Q)cHnHa6D!`f4`@7Y9xp=i(F3*P&bFoW@`Z`wO8$ zZgYqfvj}`xi2(8-3A{!@m-!x!pFpxuJ#Y64jsv&^QKkW7+S!?=VJxF;QvW)(PtF>G*{_nVYfXda`F*%=2N+c`^FmNU38JOv zfj)suVuj0 zG(U_%IfzsK6FWn(Io&8@H~zpu0u{woQA<{ zQzAZ@L@OeN<)$716a*I1LIk46Pet{)f;5rD&`t89ZT^c{`d9k!GXOl_V(~U#nJjXMMWA@~;4wGKzdAQ^$V$ z3J8C=byL;l_3bIS8fGK~rh$y~NIsBf4iVKqF^5KMPJvDJGZZ5f2V%Ppd zs74^l;#+A`oI1Wk)MVkCyH4kr9`Q$pbb{`n`>$kIWE-}>yN+|o9+Lh(YTD{jHH?}o zA`eXpOJ#iunRb9*Mm-=&p2ku}i$5HnTQqavu|A*Upp)}7s1@+z@j=XJcIOty45G_D z0?E?!Q|Zl3m>NHJ;xxWr;CNm$V&p(~+ZAs4FLq-UEcWY@3K|GN4)|oz!orkgK$=tY zYl5}mk2FqjYE292-HwU2$g;)->5i1{mDfxA(T<09lEg5($C)qwbHXjpUwOria&I9= z**wF66D@|(_rrvpYf96n z#A&LEq>J}WX?zG$`oAq$x(F`WtGKi-_qbCc%>R{bXrQxK2{^5-gbq&K3E|`$<8B+W z3XxgZg-5$Y>P%O-V|VKvK8kl=#$YP6#ZxxcvqYNHgv^y5R*QW$R6gV7e<7*fGXxI~ zk_bC(9Y&2Q>qq%>cdD&ha(AA~|9&%r4zKb-I@v#>kFh zQmS>kXEN@1X%)-TfR(%Eer3HE5 z@Jp9K4*S@pnZbNgcZ%%Gm5u2$$$xqm%tU8c2dCoe_-y3vMln4HHngrlgFkwzVvR%L zge+rKSozIit&-K>Dwj(DCVM1!)g~TXh$8b6n48zpx~paw{A`)ogkWwS*BQB>N$c2{ z0p~5Fg5*bCyv|JWUcb)+Yc(SLGV-2gibUGZ!8;w?DBKFI!K4T#Me}J9db>I0pAtVb z9sdq-|GuX;h%yMX`O^U>kCL>>83Qr1d3`xnzn(bKC2Gc87Qx<}Sd{dl8op_Z98QvW zv?A!wS2`+w589=-e@>K6##x>ix5Cy~dgj5qdny{Whe{JGM9<-?C8?TuuJ2CW@|Xa9 znA)f(gBcd@#g? zZASL+YuIjQ8I|U&X(@e|vSJdd9nWL~+a+#mJjKE6U7>h7N<7T%w zZ&Js&PEx<@KZhBEG5e>4;~w+(UOM32Sjze84c zSJw;5q6Jf{0%>h4@&uIPDRn&Nk)uy>jn8|#cvx74IG#tTg6e)3hr$Z7@E9c|VqE}T zxY<%9HM}lj#8mX5ng!%(#*^?R2e!`dor4&KBQ;^Q8}8Xl1bNG?zLROP_Y#&gBTEit zbb#utCWGTI;rOOS+G;a#?for+c6vr{r;XmHWT@ut`8OpYia9TmgJQyTDZ%kOM6_7$G*qg^tieG-x|*7x;0zH+v)crDcrqcVp+qIyd;SKlGmEUzJ@u51bN&waIp+)&*|O*(6M#Z1Pc#JX zjp0zJiV;gAp3i+AywC!iyS*_NvTl{!%$ZfCi*28Xth3|Hx#ka(Kn^0!071~Vl1mE+%`7%7xaZA= zTno{OX3ynE(fRFCJ2gtN^&jh=02&C`mAYm=cJIFQVZC2uBb3&{ zvs~P7koSC39vIyuU^&9TWpH_q&yh^w=D`{jqp-(^#~{!1&bE8Y(D)Hu__U(i=t1C} zfR{w4c;`nX&rYAF<9`U{H=HB$Vo4e(0~MCdPcDEkRUhS`KX2HY$ELig>zA@gh2O5* z7RduQ-Nv{O&0z#q%ioCz&d*)9Q6zV7B-lhq)6$eCl)1lgY!GuZ`{OYrv^y+rg zGAe>pR;sl_P5)WGg1_Mj=!_2Wg~KH7oW&)(%!##?28j!NA=5;k9| zD7E`p=psg%6evAp?#{02CW^c{dWfeKGn9K8$|FQmi?V{#yFSpLpt^gUKz;q4QqTz| zwNw52tjbjaUot(ZSp`wEg!d!}hgD znnuxwBq|1V?}7WTfAU{{%k97^lt2KeSQ?l;=8}y=8DG-7K}&h0XnBk%z63| zhEkRVHm+oLJ9_>or~iocf2q!qX)z&dE9yM%7WU{<4rd&gEsSQD&2zZ36&E|%bT2X< z2|bkk6}pRG^Q|20I5#&t4&0WN+R&NqG-bVqxNP5VRL8 z)Uq(PD=egG>%(8OE5Fpl+M*4ahLk38&K<3AggS!0e6DOHxXtRJTu2oP#{6L`kmcOF zxpC!}|B&8@ZZ(%(m(Fr;_*MJ-lVv= ztVBG0t38cG94;8$&yP~zs^#tT*KQ}a{x7Q1*Okob=iIg`iFZ;&%n7frBa&QzP*|am z1E5%DJ)pt!Tw(3H-8%M+lDb>oD!Cximndc#meic_*yKM<71L(>Yeuvrj-H@kLb2X& zL9Q}MG+zy~^InAgUk=&quK{SjNpD@CNtGC*1}a&^VxjN-bZCHi3Ru!LJVszPdp`ey zS*%ln_u$FC1|c*Dsq z3azxSFT~N7dxJS51kZ*wUnht?Yu(IPf%me!cIq?Wy9cIjxErg2pfUmWFn6+9%(3Q^ zavf$`=N_h0y>@b-OB^yD--p^P1zdd#xWZoPKv=I>kB8^8+xnj`4t>$jrHKQF5DKn{>loI+m#6xBY-A-8u|^V})eW(;t`{YBhsAO)~0DuC(G0fXp|EVLc zp10DHyDMn|`5e((LxMnn_KbC5szIxmoqz`O=?z~1izJoxWAj4#+=WlefOVR*kCHXsL^{e4t#2CS2^mw+r7hvmZinK zjq5-JdHKbb^>;;CcV@1>Iy1ZdJ8bN5q7oM4ax(HjHgffk?;J^_k1orZ2Ht~NG{?hZ zh-2aN*mbQq=AMehiWAM*RVt;JfI0zEvwsqOK?en?3oDaF>@}ACVZL$8Cz)?krrW?r z8j&tK_Or1=OCy>}cWNC+=~fv89Adg?>kNSOk*|0IlQ|1mM?J3=8&HSv`{3LgabU|90W@($6GPEc zdw`xe4?vym4d8zRUJiDLSeD(8^?Wo|PXl|h9~Shks+yQO?9JMm^`P^pkEMQ>HaIWe z)9vxxoO=H7aZbX;f`h5C%D$pS!koS9Nc=^d$ruUh#=k13beuG8xXO%V3wc7 zxzJSdD>yH!o@#|7BW2*Agz7ELrb4SsHLbI|{|F#Zb?3^2#1Prz%j9o;hef^xD*h1@ zso&>`MI;8$J7Ta;81|KBh-zc|;$jN24`g4R$Wski75n(L#Y5A!S2<`hf-$TiCH9!2 z{3@1(NyaiC{nK5UYAUGHaUnlAx>OGuo1myVrK?~fEwe|op$xj8?Qk$!a424Tzv4IA z5H>mUm-N3%e3Q+fj?+6GpZ>?;gH-$5Y6nea51SSo1|Wiw%{Q4(WUXaZS(-jL(X^z( zV4NAxi^v_8tp^#ix_EN5@0up0JnH#MFsqfS5>EiM6#YC#`wlIZ1%sV4zFI5(kIETU zithY8t`XBDJ8WDI+gng63q&}mA;7E?mx)M8!)G}|ET&?Q1hR4*{w@e6;Agl6&TN9yL6q;GPfE2oBtw%@F>=2Ytb$)&HFyE2=Kt|`0qJ@u|> zEVP>kO;LJ{c>fR@#kfE($CuEnXQptslAm6(iFL)8y)c>Mno|rVb26;RZQ<&*lMnj4 zX8id{(if&?Kmxmc05|Y-aDL5|)@tXnC%`FlAu`YUYIo48LRxW<#e>rL{ELUu z$gS%MJOC$v_J-S47p;`&aSwtjW1aDXNMW;;aWYN#O^MYZ+#nHvs{|4D;y^IWXU*gx zr4Yo+R;a!1cHUiW4%(tQJ)33?Pypp>!N$z-m;@4&$nGGtaxQK58$6Nv!q-F4T+tX> z1fsu@m$FoSsBoxBS|JBh49;=4c#NzMz@She_|I@$000ZJ7$0c0j=q;Z%!Vi187U%b z_?w31n{uR&RN`x9I-C1s2$r|m!|9#8r=E!= ziZ!lSD=1w5ob3Y!)l;Y+!T~6_55OoLZy@Piq8>RUo?L#s5CldJu105D5zo6Cb(DjB z`wAOB`!1;CxnAwN61-?8BTx!#GxkUK%~_hX<=O)OYcv0U84LJ6GDG7nq_A*E5)BHj zw(7VbIaHXs5<%jEta(05-e{H*w-j5p%!RnA^Oi+g>eNW&vY&Mgk9$GZ*B@X(zS3Z= zviAFRnRtT?@2DD*$seP5WVN%AqU(YzwM%qP_moM4CJAW&a%l4U1VF1LxuFc?F}Fkc zg=7(}mH_$%lT#RilPkKcjZD13qM=G_(^yL7LTKB7gXIr;C{m{bt8cY!2a)#A4e{rG z196_D(abY6I4QmdZL3N+KJMF7RGT=hU|pHolX@9dKd^^94k){w8(f!rn01kSCQ~hw z)->xYs7*609fz&jhEB$V4DbyEjKVb|w~1JzhSTo{m3xG0`ESe0o-eY!^Rbs&iPdS9 zPWQw(;^DY2m8a>zl~e?lA!CVHhe*>W#}PDUpxkGqwEGc~wfnpKE=#^?e|mY#%Hr`y z@Y9v#lh@ntXwUHgKe!v@77^=wo=zq{q~O@CuoQDqWZC$gET=d%FxTdgPP>a|18>Nq z8O=p?V_%m=1&~skpPt9yoSoHr=&P;gQ&eUvtNi;f4%8p6#QO_Nl!P|2>z?{oUaJK| zZi-{;{=Kj1Fvw#Q4yAqHGC2Nz4LaHp|yZYz25e z*38zt!;kht=ja$~eAj8vMt`Ps*%M&~3G&O8(BbbB#@fQ`J{ikqTcOtBQ!xP_y{QA37-j;6S>|)?>P%L&N5L-&If@edS(e zOi48lS*ai>id;gzCCT;&%a$Ep2q-;nHF6E54ofHdy=&~GL5+@PL1#h1`tr1IFcC&} zj54*Omooo460n?TCGb?|uurZ5n5W_5gqjgmnLR1VXgwU$Q2K{GZc06NENPabvnmi* z>~+Bu6tv+eMqnD7_{+i4*lFcWenlx3f7*ibN&TG(b;9T^q9SRAzn!FRl++|f!gf9h zU%z2}m%M%}^uPm$HV8}@2{k@G-&B~ma)D<_)*LTn4WcR2$@Yhwe>|Yuo?jh^48K;>`;h>pI@KrmF zQ&hGg&KNhM_Zi*4*F;F7NF$_ZRTGj}`6O&k*52~=WzSHBPv=4Pqn~NJw~ekK+djhA z1(&c{T6_>hi%_BW8`n`Ss*u_2#9x9+JRJZ=gBi{N!IbQgXp95xB0EM4ID12{i@yz& zsr!!Bm}jKMo4n4Z`}0rz{N!)*_3w;|pZb_wxgED#E6`$5y|8I=+}%#N@+2;qck)@@ z?q7r!hrOn0ha#z=lv9g`^ptybKtDEQO(s zJq7C{RrGxLK!Z5sFPE|(q}K4pjPxqbW(L9C8UJ{V)EDM<&7ysF*PUzPh?UR9c_8XP z*)I~Yf`KA^YF)OdG{RZTEgY<&Ta{&h@xhJHyz$rb)IWssdCt+T1SNDu-C#8Zl<6Lq z2v_vc6+M?erzJ?9;~Z>!h!irkJ)gH>z~qdIW4V8Nzyn+;)Pv)ofp@}^;qs}=l9`m5 z@dWmClGvt;i}(r>ADm7WdLOG9CpfJFt!m?3%poRO34f-Vc=GnIFhY~Y%81GlO5Zn5 z)y^%%51-e&7wkIWd)+iAUC>=mMJ4BIF%bev9n=90_ThRTWp`hQq4-!zJHKviFIRVk zypwZITj|gUd%26TN(*$%k_%Z(8k6n zsQC0uYbn}LEuvmKyeEoG2l~3 zr2UpyDI4rCl+sJMo2S1u&$&e6Dm$_&(SEtQDE{)Dlj!!^d(yLC?eOl=U(erYdUrf7LGcH_s z`8=3~*e_$$$Z8)7$lr}>5}i-?P^O^oYFS771)Yy7C#rQ@?7xisdh;g7dCZ8z>XxHe zdJYLn5**-|yLDwW*L2qKh(ZW}FCJVxOBc})<$1TG(5C1@5gom8H7m`rTgH=E+n`9} zv(~OnTSJCUEXBaW_hzL!kw@P~^Z;I)7b(?0xFJd>V0R~&S}(4`2P&*Gpj#x1>t?7g z-Lh{yt&+NcU1$*dJbIB$Mcp9T@%S@(R=4a}67TFmY*7asv;OygZ37YT4wIgJ)bKPv zS*ci~4WdK@MTBSxC=)}|9qm66;uJ!ITW{kiB!JX7sd&kBEp8klAzFVBmY z5xy7ZU=@j;CzF>%J$JcCdMl2oTs!QFkD?aKmAfm0YXVz4eX$kORWU^)j#@yYTVQ_XP zUG?;rBy2)@a)Of>Pd9BW*HAZfO^PNS@?^n5(pY}CX;jJ39~kkTSimIf^qpcY#HB|k+JecRV% zxOy5RS+QQJ(Wj)~{UU3mZg~u!Ky01fzeDacx)h$~xA^AN8Pxp^W3PZXlLSUBh8-JB z%Gr(Xia7%FnXn>h*7S`R)=50)y{~&`<=GMc)(3j!XbFNu*z(%(L!*><r z>=?cr$X2EpL_@O)l86l5r^ zN_tH5SqDmfzmw8Vyhmr>N=Ez4s$wI-+}cw#&ON((f{H7T9bMJTIIiwupj7iuvn^{4 zYXa_ui1f%=Xspz4&1C9t(1qV!U!MQztTs!92QsVR~rU~rZQoFwro=W3<>RJhOa? z7s<3Q=@ODXy7c9DJ`resst9J90RE91mI}wl^w0hGb|eHGg-3*$MtgCq{8}E@jSY2d z5PCB$ruOu)XhiN!m{VSDSBCB}$e6mDnOPX1nUqO_HP(%DjNW7`lEGKfCBm`ZvT6U3RLM&!3==|y?UXjL~x!t4;eV z=fcRuHg(@Hgm^a`VVdE8>-UnSTI-Sk@U#q&8V=?5DF*-48dT@D5d3HsP*bNMw_Mgs z8_gxq(!ytr*{}DF$+pIbwK*I=I-IY3OR4o8p#PB}gLx@2s+`=|r2|=A^EkRhjkziM z-bId*7yIjL3Jw5}6-sNh#E?<;7t#=G13 z=kzo!PV*y674vrMCy<(JshMLQDY&Ii0Frqb{I-Y02YfOi!We^q=ZG_{J+dDPf!llk zt;4feU&4_xt&P;xT57``Y?xJH}vRvd0u?h~K=}R2*s_Wu&7b z196_7h>M@m&o^q0c2v2gc@KR7BXu!dzjF=ozG}b$qW0P4^!|u)2e#(?8nJ!X@OLeR z!g9x-i1?j&wwbotYQ;$hkOX`ARoWw=>->h@r@U*1H5d3|BLVTFKh0<9T*5S| z*=!<{n!njpe3&h9QeE0i&^Q0wGMHJ>N>+=Jsb1n{iC>cY;m`vrwIk9pzohLmYy64E zeRP!jt&vomk`Dzii)yM8B~pG18M~A|27scJhduu;4}e!#qEQEY?NP5}8&yn`Ey4z9 zKapknXKHtG#+6_0SAHreBFK0uXbH1EAIHRHPAj0?PR&C`Ukc0B3CGt1tMn90a+eFs zd3CoHX?Ai&0>q>=ZbC?3`9KiF%xBy|faA{V5BQ;d!_vz71%qM<|!`wr0y;E{<7GyA>WaZR$9xNZj9 zc`T9N(4nCe`1#Ga)kG7MnakW5{X^(u<_Lghl5IU7S-RQa#$A_~#eMX-tiX@FhK_7rc~%Sq*ld^|GpO{phw>uMV6#`corljP$Y$=9%#DA>r! z4MHksuW-zv{*lLv-GLzzeuMxqPY4JVB{mUAYW9*8HPOhZ`(`3|dF$6Y*S9wP!m+en z6wwyaX%33-7T)!xkdZ=Ca=BSuYbbATeQGi9PvwDA>VG5ydJ}+9*ny8gzb>P-rJ0lZ zY)bjuhcQMHcGLH4Vaw(FqN(A;s)=(Qr>S<_SPizrxrYwu^P@Rh%=1Akh zbPs;kI`pjP>D>d*n(i%olu8-j&rAlDz=|9olvKDe79ST!n!E0Yb9ugP9P%)F+wh#~ zNeE1HLX23TtWEgMpa}cl(b^UhN-qmUR0MTS-i`RTrP zq_Qu{nh&BH+^^^OY8vITZWL{P9j&*cukNVE;tK8mJ`e>Hp$4F$(vuQ4jaj-RkRbJT zbRR#7<=tzMEoVH`B`%ZdJY~3Q#j9N9;TI*&;}sfN(`SWYa;P2UNouk$<@IR#ew~_c zUhYj*A;gW-JClpUYTD+Dh>bWaKOdQ}Rk%%s6x2s$ z=5|N>X+OI%wq8QeV2m($g;Dd?pA+jC9`74}^xw&(?%I1QWmM=&6+%CsKOi)G#}S~9wVHuHwiFP;EbYYw#ScjyH^<< zn$>8}kr_;9;@4!~N*j}52oRfk>rGAn%P(Y2tK0aeVovAnL;Vlcfdw@U2rh@}Ms`$1 zf4Br)>pp=Rtglf9+CACF#D@I(p=0ZW_pn@ra2;OW$4Fo~E8seiXEV){P;MG)5@~8w zPF3+yD{V}U%5T@Yw`*c5WS5$3THobQ2Di)onSQSPx8gn6u{DS|$mbnwp=#r|(la+M z9ATP9+i&@NofO|gaHp*!rb@pm(fzxC5($^SQK$=*pEeAR%89QgDqM46L4{7b z*`(d9C+iE}+2NjlhXMvsn?)ZyT&EEzv&T0RN~?Mq zzm?ZIiDBOSDMzMfWLO$s{tQj#B$&-U%IaF1-DJOG>YB;AVRv<- zAd#d_i);gyc2@M0-~$rG*$Jz@SS|!8>&pe>d)wUhZmY80j#{nQ8{0XX>pDwJZ~JL* z*DG~WOO6X?H;m;B_)Y##6e}^BE z;=6a0XmM#c5vxI^3$MdEbOg8|p!@C7sWGCZS9^7x)zm|( zI2z(q>~u17>tkok;jYp)Agt^Lmi>o>QU3U)$f;I}kzmT8LXpU!o*1Im?`x{NZw+KQ zwLKbHMgkii9=ZiFF&bS82*&?wJ{Y;2Bj004uC=l8YQ3=|TegXIR<{0Pz|Q5e>67O; zRE62Kc@$jsH6myaz(wLc!L4z_^o7|8uSze5@Fxem@ zijW@EMUoi( zLi0*=2fyxeB&k+NXP0GA@7@>hf!H=9mVVm8jL683+{8i^X=@DZ6Ogdn)Ld1PpqYGa zeVUwhuvqtkz>oeE`ZtZTZ5Cc1|J_3mR~NuA71x23;|^h5jhyEy;|&CD{x_1 z=dx8~Ipge{&g1J20xvDo_M9O?(=vL)GaDtBJOC3Tkxd|$Y-x55+T*I;v zF!FM<)Kqbw`4A#M0!!S=q5EaLrC1jHnxa}gJzFzRs+r5D4YcR?>R-RS4=nJkUaO@x zJE%_ZxV;t7fc<6za8#M)fD1Z#mv*k`ilV+N8^x?<7|uG0O?;0bqEiOAm46TG5Rs2q zq|!+Z<{uwf){f-WPXEd&)zA|Zda5uBt20gLY>F;*?hb%wy{etqLs86bIYhrRqsb3Ye-yyRA;F|y&p}%mwd1Y&I z@oc-+NN1DOc5_^lsZwMsS82IEdn40Gvl2GOxw3=?urS$Q*ng+>=XITaH<)(VX*sk)MhUGpzWg!A!ScJr$$Ed~!Kc_pS;sTS z$ApMPa-JxJmnq*knv){u{OhY2T^0_OQ%c60I_Vq1UjnQ8wqCz~3;30nlkfFA@MN9Z zEY0%bMds!JGIt<~2!~J%>-NKBMUPIrkTF#V#JNbFcZa?aWGCX#bGr)x)ETI90DOdS z7>IFU$V>=1sJ2jKCNu;p4w@%!EsNpsihaW}97R+P1&wBVr3UkGHVss`6PU@KMXGS3 zf&m}$`&cj?atzZ5K5i5(2oYb=3(S|CRL|oT3Fs$bDY3MFn#=F45L3!YLz7~`rD7{1 z>p&Fgrf*8BiIha>zSjwj)ZF}}@wt73v==vv2kGD=KDb8u?ss9FbH6<6e38R>guz86 zNz$?qo?Vs6^q%i`(zMQ;K8F-oDfln-^9UEr5bp0lYbs2S5vCJ^C1AyMGdcv#AWWHS zr{MArWn<-T))AWyCRj=N@(0;;ZBiclzX=6QA9mPO)D_Af3AHccLqi&u4tOJ$ooVKbitbse$^ zQ>IbZw8>O4o@0H4kAAc40hY6i*zby8U)3K{QDCLB>nQ554g6fYW1S&{l2V|WoIq^1CuJ>o~DNXXZ!2pPnGFQ zDC2@ZMP>%^C+Pwba!_-y$-mOx0U!W$0L?fUE^@%(hgo?qTZqG(7bBKir$X^$Ds516 ziyLT>CLClR56YHPY&fTu9(wZ7<1W;>Q_W;jKB@^uH8#$7(d+bKqa(_q)^(Q%RR^V= zbC}bZi@61*OhRBnUgicE=fg+;a_CKld3@On?}niLAi#7y5cvuOKp*{K)j;AVWmj}D z1uL8?bB-USOV(pbtB-Um8_8OyEa$$MuQO;osadwh9Z)9Jg}Qe~DFr3NVAQal`&?lx;z4FDJGwR9p*m9fR@l(a#fIPdAo#0k zR!8Ggupsy4XXN|l;wfEJNI1Fy7Ca+PTe&LY6b2kPlTibah6XxP5>^+9dLT7agGi|v zfeuVfAn*nznv@)%$VS8?Ua9INo-egASc|~x&CbxShNDLwdIw13ut-JPQI%**&15^x z;1K`-Xa-owv^WC?3)^ytxox~enIhY6+ZKy)P_voZN>3XNRx&t;li=)5?jDk39+{|GjYr538ohBqW%v)_flR31fA zk2Ouv>&_NE!h~$0jodRw0U!DgAvkNtP|ppCjb25PRXxTp#P%bO2}l@bE+lSYMj)rK zill&mDr%*!GhdsU;BaQ&f<$ z28NJKX=04ZoVNSOmM0^?ht~DhV9ZLGw`$5oRelx?_jysp?Z@-kTC4LO_!9iBYzW5+ z6_JX0Kicxc?q*CF_oOh&7WpOf>RcjBU=cc_azx|H5%dH589@bpW4h?^akvi7(X95wT-sSUEDb?CzP zzsZL0Z#4K24k7V4;;x?@bSd062*uJ>jysSGxtW@w1`=Q>H32p?Dt?hE?iK|~*cT2R zT6#o3s3+YBLo9LR;z~v>wY0!Lgj8_+;w?uY>%1!5-uen;f9zpnteHOyoGa9ays0iQ zGn1Y@w5sYHgQqwuS99yRC&P>`Q*`-0i@m;(K)8oX0M}$ChQ5x&ThyS{ndW?YxxqJGA{(C^A(QcB2S)c7sck)+&&yn`KI~8q zA8lQ$h0p#iej&Fr1#1)LK)62x;Hv?g$X1q$bg4{)oL-w&!C)V1Kg!ZkwYa#rFr6^^ z11P>q0en_k2P!to7!nv@1yXb>iiw}dm?-n4Sq%TtF9_W(_%Rg3uQ0DyZ4{lOimk0! zwx(nC`uaRFh1mrH!0!N9@vLY<_ib6S6S*}-Fh%s?_weCA1MJA~F=Il_S7#!JZqm>N zP)C-zsM`};No)%vgTi)ifq5Z4CVxYU#qe;6i8xI)nb@$2jD z=^g;TghWTUHfDu*Qirgq{ZQ6OL&bChiV}9(WhuHOZolJZ>t%isOPux#i{n6OcMW&` z-oyV$+7Nt-_~CcFETY!kr+)}pY=Z6;=ndW)0xy6 z@Fv(w#*zSeNY8jV8}g$eaZX@pxx$UGM8%PrtfD>VfwXIfVnR-T$$aQNZdN>Z@*~fC zVd?mqYeQ9CuGQN3^mpSFFeCIsz>X_lc-}X3jk$j2=p(KRH4|Act|ee(kcnL8+-HTF zc-s7i$d@MSu;|qPN7+}!MfHVU4?}l%4Lx)>$j}W#hk(@3-6hg7bT`rs(n=_ev~(kg zG>Cvmh{!kmzxVFFdT-9%taIk9-`;2M{j6uL!oLp9KHX39Dayp3JRFRqNzv6zBu;)W zcoG$FyyG5f^7F;s;y&!L?@JtZ0gklT^1!WfaM!}5?NUt5Ujv7YhJI%~zbro)6g zMv%um7uDlAH1l2d##-{Y5pl(0sTepdI1avo?*60h7jGK#G}$H7F@q?so#SFpzRAa^ zg`*&FBa8{Kdy!i;&bTzQ)b_7=R8 ziS;w^VRa!efpsJ4zzCTOujxERUr4ohZQt5=TOTvGX+1M!vJrtZcpz;^ts!r1j9$0k z$mFI$@nDQt%Y_HNb=IuNYjxR{WIvvY8eeSOMv!uUbkPi9@5gg!E3s4&7_mGPu9{tq z8na3?Cy&2USl@(d%yk4Uvvg>i{2p;)Q0f9-Qn7)Oh7~r{y^>%rrt2`*geW(T4WL*1 z9b`*was}H=t;KL~RGBZQGXniz5Eq#S09a5$tCpShPOV7orIurl7TL@Su7jGh@dB-0 z=82ynlRk^p~zKjlxL#AyRKt#P*%A-^K=du4Uwt|xVG)#3IZ)!zb{J*G?!|U!50xD*hqrT)8&I}^q3l7g_TC$XqcymQo2P3%2F$g9vJbn+JpqAmoV({G1#7Uvdh%K@1Ax;0r{FmH*lZef;&h> zxA;M!Jtx9&x>b&OwXeRxa@-ZC#2xx^+$JhzL(7qHsM zAiF-E-KCvjr_aeF`Yon}l8fDs&i@=3`tGdi0LX|E&j)0IREMdKLb%k6!VYRh`$aw9A8=iG#OIS=1PYpp#MmKtJcrt(q+d9pq?#59>+6T3AoW z+xy={?tgip0E9cGp1>q0HYnm~{nxe^zb;bdm-km^N051(F!jYkbB0SPMjiA{g)OQd z@8>n_?Lc3M1aZdj5K0+!5<6iv{^B)G_t|FsjNC-ag?Lyr2tv>oV7OP)=CW⪙NH_1 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

    8L!AMC_q{052*@Ofo5 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 OnJ< literal 0 HcmV?d00001 diff --git a/Thirdparty/irrKlang/media/license.txt b/Thirdparty/irrKlang/media/license.txt new file mode 100644 index 0000000..a83a20b --- /dev/null +++ b/Thirdparty/irrKlang/media/license.txt @@ -0,0 +1,155 @@ +The music files are out-takes of the following tracks: + +helltroopers.ogg +helltroopers.mp3 - Hell Troopers Main Title (c) 1999 Nikolaus Gebhardt + +ophelia.ogg +ophelia.mp3 - ophelias symphony, by Tomas PhUsIoN 2006 + see http://ccmixter.org/media/files/phusion/6442 + license: Creative Commons Attribution 2.5 (see below) + +getout.ogg +getout.mp3 - never get out, by tone_group 2007 + license: Creative Commons Attribution 2.5 (see below) + http://ccmixter.org/media/files/seb_grenning/8920 + license: Creative Commons Attribution 2.5 (see below) + +MF-3DAYS.S3M +MF-PANTS.MOD +MF-W-90.XM - Fred Scalliet also known as MAGIC FRED + http://www.commoncontent.org/catalog/audio/music/3083/ + http://fred.dsimprove.be/index2.php?menu=122 + license: Attribution-NonCommercial-ShareAlike 2.0 (see below) + and: http://fred.dsimprove.be/license.htm + + +================================================================================================== +Creative Commons + + +Attribution 2.5 +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions +"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. +"Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. +"Licensor" means the individual or entity that offers the Work under the terms of this License. +"Original Author" means the individual or entity who created the Work. +"Work" means the copyrightable work of authorship offered under the terms of this License. +"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: +to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; +to create and reproduce Derivative Works; +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works. + +For the avoidance of doubt, where the work is a musical composition: +Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work. +Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions). +Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: +You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(b), as requested. +If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination +This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. +Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous +Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. +Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. +If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. +This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. +« Back to Commons Deed + + +================================================================================================== +Creative Commons + + +Attribution-NonCommercial-ShareAlike 2.0 +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions +"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. +"Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. +"Licensor" means the individual or entity that offers the Work under the terms of this License. +"Original Author" means the individual or entity who created the Work. +"Work" means the copyrightable work of authorship offered under the terms of this License. +"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. +"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: +to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; +to create and reproduce Derivative Works; +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; +to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f). + +4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: +You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. +You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. +You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. +If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +For the avoidance of doubt, where the Work is a musical composition: +Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation. +Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. +Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination +This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. +Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous +Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. +Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. +If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. +No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. +This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. diff --git a/Thirdparty/irrKlang/media/ophelia.mp3 b/Thirdparty/irrKlang/media/ophelia.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..854effb1258815f30a5c1158ee475332780cb5e2 GIT binary patch literal 659456 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�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 z

  • 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 z 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≧FVMr*46A=A68{!{!BT@>cVb;ndw= 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≧Ub7cEdjdCjFHGeJ z@9XW+2Jb6)^ed~fUs6(pWbXyQ$ew?u3=_3P6{K~>J9GY0I z2pLW<#g9vaZ|^_3csnq>o+p5Ew;r?8PINPAJBTW(wC6s)ADA-FJrYso6NQwS>?m{e zKcEcqASE2prR^R^mjxkR=3ben%NOj?=<-<}MVGUc6rpJ9K=PG6q8df7p$WUCCU7gs zlVZHn=8ZReASh3#uf^3gZrAiflU}dCT|$Y?Fi)dJ7SQOMsonIXrn3Ulm_XqS_%6@ROml0*TPDkOl9A$hm)@?O`Q;~W6zYu z!FXQrxR%O0$97*=dQp66RO-;+0!@ul%FMWS@?{5iZc4AKv=&8nWk>qDgJY>2Dvl$1 z6yA_M8rugbzc(mLMx}n8x96gI9$YuFo*%h-IH*bWxcza|6W!@*enc=&ojq8VpC7m) zTMe~047FEtb3{F-1{trx%j?l-86v{I^MdcL{I{&iHwK^Vi|9R5`;(mGnU#%V$!$gK zgJzUeVi;?Y)ON7&>t+BLUlZ>@--LG86&b^3rVziv z`a-z*`otu_H+S;?L46BV-|T(r)A~|3H;BT1)1**2IM57|hpK8wW3)Olo14FLsQVpl zgif7B2r9o`kJhELiR)2*Jyq3Y^tpx-PqeJqQj%nrXf#^V$JyR=KDWB^Kuml0I#nem z(H)5pBK?S!$I1NyAHug$o%I&WrHyT!rGqu{CmYKhee#vWLoz^?<-SXpBI)&8yq+w} z4^g<+YuT>~U8}}1iYl^uK>8f{$`}fSTxrJ5`LJm9WwuL=0@lj3;5V_-IuH}*hNUiW z^ftTp7OW2D!VUGKi_`q-$!*{jB;`A+(depR$za7I!CW1DC5b^7oIeF&XbL`;AWtpV zj-U&s_&s(yUT{h^iF1RQRs5uaQ{>4?LPir(mpUqUR?>KpM>Ii>l-DbBgk6}pEPW{_gR`_c>POk2Jt?RltH^iF`cxwAtK;oaO zXAv@Wg1>t3zw+|w@65jSG&=NL@KQyb68=NZc6QuPKdrEhN58IL?VYijQ$@hS-)cb3 zlM9Q*pV}Uj-j%=|*-Ir1;&ph0ynA;)_0q1@34B*x^Ios{uM{kS+zlMkO32IZKZpSS zUNm6s?#&c*MnF6fOpG9amemtct?Fn=W9W8e1tpPIcCF7yX66^yuI@ddP{4Zw`_${s-8$cx2|=5 zWz;XOQ(TWIK2a5)OvN9h;=@98^Yt?m0TMWJuSoElfUzU10Idb`9CHs%CY)eDk-)^9#w^q-e%##hr{C{8TD{ z>Irl8M#P8W+1Sr^4#7jv6w6Tif&twWwAi|W2DPBA0UNJ0NG5GL1}%7qUsNrR;4}5V^0=QG0#t74IQdZ8zpJ4A1QMY~e&eOpAnB4a+TUn>Agkn- zbt<@sUE!>2D8>bzR2ZKwD(ccN|GZVJdDC3Ei~ry9?pagrZ%S|XXxn^QIKL9^5tVw} zrR1Ax`%%79(CAt7zujhU;{gxh=8t#a$KPgfMLLnOqt6;FA3@JISg_!9X;KB-N4?Li z&EEAljPsdOb64@v^r)=SQgmJJZYey@FXlbX#4-0Uf5P|AFtyKByLWMI?nn|s2Jzp? zy~ETle4~EOC!XFAG!k=Z(=?xcYkx4Bgw%(Vkhu-aU~4caF}aWV2a^z|dLe6m9&82cav6}aiC37bD!o9xY{hzd=tbNK zAIF|S|5P5!xi!{5wZxxZ>gRW%6xJ8RzJwR^``Jo&Z_!p1_MwCrq>e?Ug)+%Bv5pN|(mEX==uym%NC4u_f99L#2Yx#EhQL)kaJveSIPw}MzOIy~<*{_d@& zKTAMvG3Qd(!QFFM^YF{uRslSt&^w)*pYXTx7RxWWFS}a2=e`(r2d8#arOOFV@WENQ&)^tWh zNm3LVrj#IN|FTGdz{9r)b@XMg!xuI9+q`~u{5BhjnoD7PF>sd&KyX8n+ijqA?Fvny zupZBlJyhebcJFJvGu8y>X&#UmPT)z}(~yD*{9 z6q%(APA!PhWHG3>tgA_~M>%iVS|DH<^AgWq_Cu48ME%+;j|k%5MSRkG4!TM)mgZd< z4DY=L=_-tqIm{Ut9*AlJZNc4IT-itDLhIkPCih;^3yClgB9XWJ{5=GZM7ZB^H@Lsk z`4D*5h&VwL2gNcK@afMP8vU!GZFbG)7z^>1tkiE!RraU+ra3CtHYzw}2Yvjl!39(5 z*2Rw&FeUy;@+l6G%^heQ4 zJrB6gRpFxG7JYm?_n#UJp<=e3?N<>U?EDvyH@DkIsWkV3S^#VS^&Y7N#TDh{gMN!k z`Q%2=i{f1eZqgL>Ua#NZ>-+k) zuajrz|Cuvq&di*dIdh61!#zbp-F6?{+OZ?#zUKLuqcb6NEbM)iHD3jK&a8y4UC&}h z9A}~!Y0){t>;@0U+=aW8EG82z5i{8M`ECA;B|!xrW84^`PSI~)#HqIS63wEC zB$B^yBQ-PR$( zbdWe>708g#8+RzPAe5cnjpqDe^5gAPNzz8*#+{*iDUwS*9)r)&`oSF(Hb|Nxde>K3 zn||NW;di0$pQ|pUCO(g_+$@zD;v&c>(y~+KP^Kbp=lAMYSln-$JUCWbobtZC?K~3k z#1N9wE)K{|joI&XEz@vU%bmLFgYc-Przy_r*dAe(^0g>EJm3a%qPLm^Tw~&|`O(!ftWX{)3ex2Xd`i%fV+%zyW z>v89B15<|MRZH0@HllOU+! z=j1NaIt(7Bu9R1Dg=i0rEj2i_ibLEG#ot<4r6)ApVJ3-n)SX~aycXxgb+affsvg4xDvHdDctLa4KI|=fQ7C2_|agj#;yM z%{o*1Cu9Qr`g@pw6NqGzSDMZyvxlUL-K6X z6%w=Zw5F-F-c;0EeMzu43`DjqDss*DMl4ccL6K!aky@iFpCuy{`2~t3&z;KiYa{2W zuprM&HMGW6o>z^K=gW|$QxR-6G^JG31w*S**G`e|-8f=36t+u|S}rS}x)F+8t|Aq| z7O7RVqRz=F(oAg`v6Jo0tla_!p?DRYMoT(a%Ub=Sq0WM8wM0ABL>WAz;B2!OgKxFz zw0I*+Nj-RmX1t^r&y=?=?|{M7s~@Ji^A#~j%B?SKyB&mnGteCzN#V11U$}UEHsa;l zPG7H}_;W^xPbXl|#!4#;O#Cl&TD?J}#YnKLxV^Z$3P#!{+rfCAxcCVDR@8^!gAlc? zP4AQOl8nOZjPxMF!N!sR!0SwFQ~?UZJ5$t@N3-XOoY^z_iD}rPQ%@R4b-3#; zHprKnL&>Ga){$$nkv#Bz!jW2jn?AnQ`z|i-PH)5X50YH#6{9kN6S%Su1_jc;2$R`T zB58=T1`Hx?D}%T;p42dkXOvBfXAc`j+HMcxG0x|{o2prXa6ZPii*_hWKv&ZU4(MfO z3D(-eqRVJ5n*W>~r7-{>3 z7zzBrwLmH+(W#IXj02stwjhopdvAW)n@H>3{AF0f7*#ZOZ2QFlFHci5CmX4N+E@Y< zrESDHl(hJTm9AdtwrNgi(mkhibL7`8KRZG6%UP%R6$+ao7Bu!@#o7JxFOfepEI*&P z{KE3PHk(f{-}KMlGaxd;N%Qj&_iZ~qZR+rM-?yzd@$G%v-%GBceVJqZhTONEiXZ3G z|E~MCsKaN|9<^>A5@Sy0zO!E94DLH`yzp!mW+lJlZdJ?0q7|(vmjV9d7 zYkJ2$DY~|U=~CF_fq59&EAi96MtHug*9UrufWJR7KZ%!oE?^$I*5CHob-#!71@KuG zCx3mPi`OV8&pj#ZoEUabDsWCLaM}Mk5nBl6AkjybU$X1|6Z}x-P7v_|>8KUbdI;IM z#Sq16{EII@+QO2C6qeXT3EBB|X?MN|C=YM?&yh{6IHoWkACkkq@LXJ#xg>p^%^D?79PDsY`8leGxd=u|0sPRMQcu7vEd_*HAM)r=YAq zA*l29dUZU-#k_AxGf%@8&R+Mw#M%7K_3#7{s5tc&+h+yUsikTay2eqBz{3?hevlY?4TTFXeM9g%(cpjN^ z#v~(4nRcaR#V4o>bmDNJR7~Jo&OpZzYQ1c^f!4J1ix#6e$-Hh^>Cap?FIz{HP8-im zuFecX++qbS>oQqjR5E!L?YjtBW2Tf#{pzW@>fBdf%Fg5L?=rTRYTX@GxH?nk9Q^Pw z(?UGrowe4Z@BuQ$qpWkD^(g3FbGtmsMG<8?Xb>>dujI)FMG!dAEmlI%In*65+;mo% z!FcdV6N8sD@l$Fosv&!^eRfk7^nDkv6P+@Kn0ylY_F4`9Bf4T8y#8W1-oGl>UIUl2 zrP9h5N%=>2d@osM<*WAED#;i7144>9h^`bFK?@q**FKA5t4Z-Ve~D;%#;a%L#JOH^ zlv)X{e$3dV%dnG>7hz;8)6}ckDucasbI}Wanm;CKKs#k|Jz029ok@rame2g4I1W$a zr99>RtNG-euTe!l-TA^nzy5hN_wGX2c<=73+%=>rchi9bY03KMmz*~2Tty(QTxhCT zbd<3o*m+N`=gmgl8t%LqPq-!Ad8dA;rK3deY{q35C9N~)Al{cMct}=9q>v9ri6L!j zKqWeh;(J|RgHqer6vIQPEt9W(+MzpN`G1X00YfcQq22jQ_*>h}eW&~uera=ubozS(VO8e^xa0?h&wD~d_*Y_ zax4>pQrjz7MzqK#IDJ%NrXXfBGM!0%^x3bXhL-1j4BbL0&|p^Bo~yHI%py&fMgE0x zBusbZN44pu{FrT;!w~!?D!WWAW|u!LH;`)(>Mhu$+fXTE@=W86Xbs}typMf2=sir} zKe4ToW6ZRz@4MdRc{SQ^%|(67j-y&9BG|N8h3)>Sf*?LrrZnT-rY(( zUYxH(0(&dYv4v0%+by&o?KP$E2wxDSo0$QwW>$cR|VJ@iPc>|NRV5ULnr0S{FPDZ&{c@x?P3)bD~r#7_Gu zi42&@F%}2&f)e2if0*Hds%XPL&;y!RcPp#!iQ9*(9e#08F=ycVFdS)F&5G1yntLBS zz_=QW(?21G=ynAT@5Y{gF0+g`TQR|ozgJcMq1~M6+YYK&O0)Y(#_oU4_{#YwukDA@ zphw!4Q)%xOct?(9YL?8%>{Y*w)cN{O)3ptE!GlLK!g-f4RavG%1Nrs^@67f6&NFN}O=Dy@-uOF79dVu--CM*x4A#rbB(Sw;&KR|0KI)BQdb4`x zA;y;u=pDpKN83%dYkrYM+1_(NK57CK#hzTAclv24(5p)9+}wkRx zr(_aYW0~D;MMGW2)JZFBaaJJjtTjLskKiw?jkYA%i7jK+U%YsoG8uOM!rzb0pTW4x z4n^`gF{=btpu_YxbUCibEKf&Kbd9+LHY#(cx5xey%A)etdP%H1S6EKa1}bN#In{!F z&PVbpABm)XMg(%660_f_&GtK8?$lL(_V;C{qh~E7d&BbDpLN53rhA!5ovLz*_HNN2 znQbYv7i+Kg7Y>c57`(eJaZwa^!>z(neb2k#yLKx>1`bpMi`;czq{9XC6V;*}q|lu$ zV0U?p4y3PLcn!Fh3s=4s{+_ar`wQUyoVJM}*f88*5bn9#$>qeWfG%15kuyfe93CDQ z8>B)|rC)X(J^%g>Aphh6Z^3l428`aTqxKCL`$oPrI3;dNyqQWhI2F0AEdHb3^Wkdg zf|j?Kz0#j^9-WmVw^74CG7Z?3)Fx6`QD$JzR3!MR+J&p3SWSGEBC1)E&z|uDyoPlM zf{=CWUXHSb3x_!_=SB?zdALe^qQg(p9D6IL!CmD3_3O;+&b^A32|uW^y;})Ne}Msk zWYq+a?HGRQG6MC|&pGY`e%52?Z<-ulq%8meJV)-Hb6yj0kFp<2@4->*}xp)YQY zw>lLo4pb%hPE`W$i60tjPN90y$(tI`D-eQ%qVqB&jix7M8KiR^>d;_11wKRVU$#jC zrR$JDibki4YHS`NFD^k2aHSi= zx7Tzrayc(xVperiD?@$e@)|_UJRx~3%^O$$#ORenBYfg`rn=TkrKa8+Y`T|c4ucmC z{rjQL9|%aE)LyeC$kV4?Zq^68w)KLnpQ%*Vra?{CZ{#g}i2EZeYF3;3&(76b+G=ih zYnC=RXFb5J;fLI*UiAhe<6D~`ZD*GuR;29@q-JPc*nIWvFxt7I`YCyBr{2c3tFLoO zU~lN{ep~Bf=dTo9#{sQbQYrOKJ^j$8S19iG<7dTq&!}c;<3m5UJu&yz~zLq%M3B89B${>CSWwoD; zPA&4CD~*_}xm~N<>HA)B3~xZ+bfb<+m}3VWqN-?wl)hEW^1!(;i|U`&2?#<9t{}Ez z#cZsQdda|VP?H4f@n~S5h8p= z5t{r6lSYW}8AX`qN7!eC2xW@!Nk77SBOp0O5%%#Tyf#9FSAIo=H=#oZ)bZvYhpSw7 zB#@7=o$B5-LaOCTbw8=--R-A71cBSndVmXPH*qO5cIQ#)3X%ou4e68SF&flHRx}6FmH8N6CoCe);BwD1kg@}y!X5UG81_q9)o4oz5ZPXamApIW=qA8)JB#zjcR$?7lLcpEW7?Kz#0tgU+V|~X zf_=G69F%pMI?O|zrc<{ZMM8$2E@P($v!PhZH|*Z13d$^MX=KHXs*ZF&Ju`(3T@*RtV>44B5*D zPP^_xDvRMsyKUUikr9szCD$>Giv1F7Q84%hxvCdPV17aZ>gvleZ-#n!;zPQ}JLhk?4o6i>8P zyqw2xZZ@&{nry7Y6^kKoX+{uaq#w*%Cw9iniCzTPRqkHb_Gi8^^eNQzuL zdMx(G_}H5|21MGWj$;%nAf=>{C?OL4IcYODr1VJ?WW7mYVEoa9xszBTjHOFrcXas@ zm#kACj^kbHovH#Tgk(Wa4U&2^yrWyFM{3r{Rj{L5;l68B>eT{%2J~(JCP$K%BKdbW zUs!TxAU3~_U~Jgsy-zb&Wa1gv`$*q%_=mw>p|%W%y|?2$bGGvY3rwB~r6)5r4tan5 z7}8GG&?7CM25qWSApf9R$bD}IM^Z7E?o8F6#;9z?C22KWvf)O|LemJo?qcc7D4bad zoyo~av&TQ1Y_oB#NLKiKD^J_rACi}O9M_}|!Vevi9&Vz+{j%y`^2?gzm$lyHW#&VU z&6a156aU7jcG`jimSo7mu_cbf1D!R&k3!J$+sTGPt@wQ_`aUD-+`3sTQv&kVg zHe^=6I9fu+Yvz0_CjxU`Khpijfad09Q~TH{7)Xknt1N|N+a`M&*_gY&Z7Ox9A8xSc zB#AjKag?2dgdcIi#Y!g4pVRE zsrDl25kk%r44pJzsn>Zly@nrbz;!3DP>ZTW6Nf&vj3cVfmDmod2~8h`K~wy%II5*9 zd4k@Ec5A}UnAC@P*WAnvI%Zd?4@V{2-I_wCSbePquj!+krYmN*xHpvks?e4^$1i45 z8^e*zH+)Lpq{>NC8I0GwXRr2{Q;omQfBF8TPXwh$zHAka|4gP)(YIZc1W=NdM zla1~3rC0Tq@?IiC>zKu-MVmoNwVnENvvuXQW`i_GQ_y@r=qouvR{n%%`$4DY1VK2Z z+PchUIK>8qQ>R7qaM!B0q*Rix^)_(PsVW`H4d& zu^GRa(sh|S`9Xg=Q2DOX5|f~xDd-NrT94WwiCu!OSI{ay=x!T?tRyJXD)VRx-rxs! z5G)~gDE{V!=UfK#`Ry#{5ql%$G5Q!ihx7$gedgg4@~)gGA$Xs8l6_{OeWCsAsIgw` z?BSd(^=FadeX`7IvaVz(QYP|rx`mFiL0);2$;r8wqmt3cx3tV948?XYzucLn?cs#4 zUj6xz6lJsrdY4-0Xd5aQncL`j!&!B$FuLRt^U9~`~I4< zKfyqdSc|#D+v17$U##Gnlf?_k0M@j*zl5RIuRLbQ^3{ z$wr^jJ~!-5V}C+Zf+`lJT*gyJD4EDgbEYPF=puPsQsV|ppBHJlfnrkLC>#f0vDbYk zCPInGvNe(G{!PL+9KTru#z7|-gH2{Zn(At9_{Ft@O)sTClr}>71mjKo)7fYW=$>gb zXh!%5hnBd}P4~EGmAGeyooMQs(!9${jEfU2VVt8bA8VW(WhroG!W*_@wtiXagRs$t zc_)yIu9YR*)W;;fa{E}K79*JtpK|aj)3G+HW9>+{hxc6l?jf+$qzz6D>~KnK_rYQJ zw9@XG<;vIjTE)dxwi#y93{?j*weO-CHr;2NVGXpF^j*oJo0+siRmsI&rWIyRLF2Ll zjf)!LAqa^DuERo2u!iPgSlzEcRv+b;}KmplH9crZyPlJLhsty*VR?dz2 zjCB_1%snh}_ZsIcEc2TCv%fuz?9xsR1MeM4kiXovw#hclF6?-|HXW}lvzU& zhW#%OU2K|TNG*%*QZ3D$>A6Z<`N-8}?iCzkqU#r41jm2l(eChFBF?aQ-nCm@${=rT z&_->enaa%kpEOz?XQ0(+W9byMR+(+IavJR(SP&eJ`rD0Gwo9XZ>?0ekJh#!lZ#i89 zm^bfG%juDpf0r-ZF7I4!Kl9WPxE=n1+5fuNq(_~zLY6Q}_dnxikG)tCrk^nY!o)0L z;t=K*RCa2dzfG9fE`*u*k%Woo66Pw3$GKI*kc>QB6%$_{ z$7#wT{cIPhaM(vk1ykq9%2VRs*kkeP+L?6Lr_Kzgcl>enYmtjLEnUL$tWQ*aTl_e?>4@K$Wggu&!-r( z4bV*!US_VPocA~KA>Xj+mD#+$aimXA&xMZ_q5k{XrSQKU$D&P- z$@AXMx-xXjfr8c2w;#fSf?2&UP}F8g|9i}alsC=K?}MC3vlQt(lb?5xAD+l5??{DD zv*GWd(H<=R{X~vshT~BpiE>`PVjMsWd%t#$t#LA54;xH#C(MS99Pcaat8s5>qpBPQ zJkCuu>sMFP_Vy~Ry9(yuloC=Mw5d+hgQh1fyG?-jKK?!_QCu6nlbQq7M?w2(VQD~2 zYZMw)(4uv0yqlvq<-`#MP2A~mZ_;eD39R%*3PTgbb*~^PS6*EWBHH5$F0Dq|l8o|r zmmDEJn4v$B)_VMu?-Fu`7Wjp{*AGGrVYM;Y)P7e5ETHX#Nz{eygv_nkW=pg}(m4F| zKKs-=gN|$toizd>7H|x>JvC3H0ZEZbD1)1KrVa?ReEkph6H@EumHQ$r0($T4Jm^&aQkO=O0`NgdJO-*is>Q@sxcOtbwT?j&%|<>e}C6asU4jc zKzlkA3)<4lt%9Yh_Y1U#wB_$icR^oYX%N;Ma>#?!x~OSmximqMnNd?X+xVqixS+z& zeF_yfU5_q`eQUAY;2C~9A0QnIaVjQn^!DmA;_*#LvCh z)aUu^)vq36Y$(enl0}L2$y3u1UnnS8}q-tMcV)~}Y z5@MxcF%N5RiC-l0fuQQ?&>CMv_AOqg!VMi{M!`C4zYXwH|KfCzu(&hc!Ur6Sd>o71 z)+Mw)w+D79GSYUvLi~=HyclzR%$WN2>ahJ0jXzy-Zl)R2?NvIbV!Gm^dm8n~(>n1X zocr7IY&rLe1d`=0kqs^e-%Vp@8j2l zQb)OGS7QZpr*{C)7HLG$sOHWp!P^bBe{-t2m#RsMdbX^gX0MUX_D8Wd3CvM6YX06{ zJBac8L#{Z7HCpV7GdOMVHstlWgL!qsjOI}CC~(San)2XO6ftR?xX6Y-DBW86^YSzG zeNg(l^cfj9?3Bsz99+cKBt)q;7zEaes-$lgu z?)fS=opnoVmVP$t-YNG+-0HQ@=JeYC`1p1vH`CnntKBNIeEsbH+Kq^@>uHEb-?-c9K)ahvN{r$8yHnN5s z`yR6Vp!W6K7oGEb*F17H>+i)V1IqkgVZ1pC*ZrlDG)ArSF z0y7ZG=UJ`i?O12`9cJW@3O7euenk2i2ZzS+bAx^snx7ByQylaGU-tqS@~i0K4J}Ru z-J!IYW_&WV;8IP);t!<2Ivx~M!vj^rstU3q6GM*z<74O%)KR#(v#J&UwS*LK!RvLy z`>EZ4P;a$6L1tGXBk#Bm&17oP@wut&Uc;g(WWRfIq{oYs;5$Q%sOKcU@KHiS~SbuvVN z+wnKfE_|7r$Pz%MXQ&2+M72UuowH=7zky=BLp4Wrtce{V>5g(n`Ry9};z3?uV6GRl zo3m^BWy8|flHMQhxhLdSS#(SmF7+cYe=ugrr|2Lzi;Y z(geX6ivK;S1YO-Rkcn>cZYxUSv|u zR(}qlxvLBXiP`AOIx|7bwQgEe=$`ui#`e#@ZwgeTw{ptcaul2!g!>#Kyr_uEpS)@C z()Z7D{$w$5KNHTD-nvo9e1DBl0FzuSvb&L4EcVKj67W%YFb9u0xp;tpKR@)RIKo;& z&Qxu_GBw9R7I9tz#ti7VkG5C+^~U>?M90ht$Y8#ilV8C}@^BwGUxy7}laiJ?S>%*MuG>cv)FPm3a-ZJHxUC%Ak(y8zH z48IFsQp>DK%$*(Pn${_i6$iL&W>vK*S>{}?UzPdF5?45$Iz}1hd52@02UMM{{=3oR zm9dS-DF%a8U(fv#dKqiwYG8v_fR6Tm!Q3r2>p9+OnwGE3ua@f5Z-+<#{7eP0`h*K+OX9Q+6fWbQ8(&^F=4t1>wt4RXSpmyol2W{KOZ zTp}yZEaIWt=fN&N9i>X?E2(1+y`Xo2zmf><#uldcC!!xG-8VG8;SW2XCQl3{n>qZ% zy(GCyx~r%@GnXpTheFNV>}3ROD)p{Fp+_*>;=Mm!LR-64P!~g=-a*9edoja*{(aW2 z+q9rho}%*z$|rfeTU!E0f07%*5*o}k)G56OXK*|XxAM~@z}|MAb(2LWVajpOyNFJ* zBC|L-Oa#|GLA4w&kCROUSZPQ(pD%G=^qxZCdLhv6HXNwzyYtob_LsO{zfwai?y4Py zzn=S@!pyz`p_L$(w__aHS5-r>i$QjXOE#Pa?#Yf z_<85A?eH!EGtPVWyK}393Bw(QqG`1dB7Lci87$S`J0e(=KB#&VAqLB|yM%vDjAG<|db17p#A&kTZ^8q0W}%nld@#|O2B^+& zLlPh7TmjeNJw`r#&t>>wD83J6%lqQa5%9Sy8?N`6cft3^+3>%N6n;ZCd@d@;UD98Z z4Nr{}oPW|PL8y!t+Fv7Y?-n*O3@xSHtdnQwA2KaU@6 zvy0t@C0@e>y4TE7^{B>D9mo1D>9mYwRUcD6Ney}A6O%tWub;J&&q8zBRflBF+CIt2 z;c&b+|BeOTx3JX0wv{`#gx8KvE@4#pc*>fg^aaSDKsAsazK-dn!!^<;jN%5qJjrM= z9t1Hz$*)Nw)TzboLsGYZo44gq=6Sd1Jd+Vnt=Y)m91^)!k#8rmUzC}zihC>CuZ;H< zlHQd2GZBP(e)V{xas4b6`vg_@p2s+XALS&WwlIci^wiD|uITpO`oX~9r1h->*FIpH z-L4(g>WuZp(9UuJbGl+3pQXY3z6Zah*2T z2SLFMNX}cx7GsasZPR!KfeWX0wD1ditwge;6k}X3mjK0r1>yiTARh^7FZoGYNF9|+ zfdN7=TdU6RQ`sd%^eV;>N6N>qC|k@DAwEVf?KATf{0j(6Z3|UMLWMxRYg1&v zcO~0?Mk6_;+bH&oH1BUq31K1gDP%xuUA>x~vPm5BrkEx&UW)NsP%-1Co%n3Z$P4C| zDp5I-^kKE`FPM^1_2N#^kRONTu6w+r-~B+^6LSM{nT?TrL8UV9^Zpz)NuLO?_?q+w zzAE+$_P3^o-r4pyi|&x8tx&%N3oUcr`RQX0w(6gbw*Bmp-t$1#oDc6mKi$RdPcYvI z8kHW;6hNJR4LWG~Li3!Ve-0MJCAJc!P$njdq@4pYvl-4``%Dm=XJs+vZP@t%Tp!bTDrMNd`9 zkor@3^K!zvQme?Nn{;?s z2yWj0%DOx2=tepHC-c)rvG#b1=M%|1f_@!y(M%Mw8zDTi*3ZiOObUO#nwwwNf|O}b zSAs1!T+6*$##q0-Gg$@rjaLQc!eSWSx#q}DVaif(AHRzBJ)wBzqshX``LU)qeQwKa zkoxCWtvNPKu_aIL)}UaTeZzf>h%7S3zNHa|?F0mrGg?DM5oal(s_HNP==loQ35nRt zjV#8iXI70$gqr)dt~w_)rWt$u7E}LY<;6#q_d}D-N0hhRFR$_MD9_4^tK56+6KA&? z!^PgyKY3@6w=1C)M5_#lX5R16J7%KS;gyZyrZ?%*41xP2``V{$TK&o>b1JMC0&%!B zxvzH@`Q+NrW&Wn8LlUA&udviE1~wCFIr?A7bxj4H1&I(_T&BdwPs#GdEM@Uu|$*=ivF=9_uqVB@nJHTaWO9;ek2zC?Rl{dPLgR zGvTmxVROj;T}wUg@_(yNKjrt(I^Fd5*NImtjD=mlPNE3{L?SpU=GH9FG`VPvJM_Xv zez8*GNrgIwlj@2XL!bABpS?4f=EQDB`(XO#IZn4&IO=`xNAC<8;lT~F1TUhh-wpKb zDccTf<2?9WUU{YXXAJYlK`c<29Xw_G%Mbi?=!BMu11tNl-N$Nw(-)AZ-%lp>`%<8A zK+mZEag+|0fn|I3p7Fd#H8x1~{secL{j`TGt$&{^%J3NX-n=!7;U~GzZ}2x2Z=bRa zv|#7FejeLWW?uZyrtijd<9>qBy7norhYZNw%+0yO*Z&mUk4iI{3D z?PXqQQZ?uwHX6Wjmh>a|F`4y3}bZ@qY2|ViS9~!i)#8DE6xN1~>YxB`8l|ZLzDO;D zWls0LS`S+c{Ql#o4=erbob+aWDp3$q&Ad}zF>H_hNU;*6Ri&e1F}{UeNNLf;_cv@w znM?5=a=PkS(iujz+*>XR+s%))S^i}u+$LjP>}bTuG+ZjVs@KXC6Ex5K2~iN^i~Neb zBn4{fP&jlt)-im(wmWyQKVkJ9i1Q+3oVmaYMlO%!4Hk#YaW_;>$*<^MWAXICtY5wqv5gAjq_z_9AO%hiOnE4n!?o)OuAu_luZZn>EUJ~oIQ8) zHbiCLA!^CgpUqQ8K6eimzs%t>=vdi**<|O#JRNd!o>#MaZw$~EP;fMDq>Ex4<@6od zKJgn=0e$m3pvEPfk!am??Vd~u(bv3|mz>*>nm)I#>FxHD@?`X*sEQoD?;S@6WEL5` zW$;^?Q(_4$9#YG$y_>QqdA*mWRK%>)Z&yQ>5~hZI%ZULV-NYc>txEUUiysX3_4vKg z-dA6|eL6(pbih1)?upm(krkaq`VOpGM>5ntI$yxT9+gmaKZr%u5#?0hIk1_p)wB#2 z*Bap{vsi5d60-=0AD|{Qll@AxQn{1mt6j}5}@Jvk`i16=|@hmUI}<{ z!(3tc25Gztm0)_@dBi(cze?kIk9f8GYOl@@&yYGN^6ka^ZAhKK$+#V$Ewt`_$I#F{ z_9h({1Tob|2DRwiO?%r@gfmv+7ioQ;zpAmaQq1TNsRGTkgfaqu)3xziWO4Co$v()H zxPHdTIs6Wi1X+327HjX;DPaE*&Hng*zQZ{swU=q_jvOSDx6=eg;N`vA`vILhCz{{f zcD=Yu9X3#AfRKh-)$1PojNytve$yz;ZyPo;MYNbA`fl+qv7Vxw_g~|;Q*Ph4R8Bbl zlA5;8#7j5QlkGSH*{703ja=a;70Od=yxBoK5#|vxAfJuOr@ByCr^^TrM34Cf=b@6E zg{s41&jPH`Gb%p?I#PAM&NnsVHjO38I8Dw~b-j3igv7L`8D|mm$)ng=_q$K(%5Yv% z4{0RkgBJcGb9((a7TZRCT6!A;`!nw0`g(Gm;w~p{-zHU%hoamWJ+Kq}T{`$oC4ZZK z6=7kw)wk;=^W`%tD8s`#QR9zv>D~Q>n-1U>FyMl#hS)>B8oP z-Qc?niY_67_tu`<>2xTKt-$a<3=Wdm1?lg-W#+HL*SE~IrKLAI2yzmd-py~)p3>_w z@3R}Yru_*Dc@KbB;0t=eemjw^J}XJB8HX6|G-b5<3{$^wT-EdDfMwrH0glGL5h%to z=^Ot>`odx91AP?}OZa7qc;!j(6tATD2E0-hG*ST!XB6AR_$3gx8Gfm-{9;s6=^u>! zNPelv;g?H%et}mWX6eucyo}cb2R5(L0VPy+yk-Rp$P z&Dh?8g5Noxn`dEP1LU6rm>Fiw%$^qx^gBU*RRzew^^k0^_)hXOSvdP;P*J~%=_~)7Srdx^0(l@|7RZCP*LN=u?i@3sJW$gY$C)r@Wr0s;bABvl!drp~ zB|8g<3+@oF4djUlzXyU1PcQsjHco7fiJ+R|Hk$prK{RMOTbw!XOFhH|Uh{Up9*0Td z$!fDHrW7=I8Gd_#@(AQ3X-E?C9^YeV{WA1-7Z&(Uy1wbC)Ft7(Cd}`c36w!?IgMeY zps&fd=$QKwv1VA)a9{d_e0r}9@;{v&Bplu!g|4sxsima#UfoOEP{~iOs<>qrCRcjz z=bSh-ISplUJB~j}7DM`Oa;2N;w=WYYs+caSN~rAj<>^m&mWj>eSwz{!(;csP%f!x_ zX<teNX!_?D=^V zJxJYhcTXd3IGM!xJawJq#8CTZ2b~T5kzXB%X&*dg7r^+7W4dhcJ(n&ql^Y2I4}wr3GOoWn>K z;f)sI{W1t27?kg?7c_Nk+SfD(>tii_{RlyQwuDq48$vTlk2J-!2Z~!Yhz(2sC(#T& zeRunC{cOO`G@7r~W#JZV><sovS}QQU{J&8Eb(J^oATI+{j^H6 zgzT3H)p+Ie5%JAbbxj zGJKpFp8h7%i#>z-Q}-$TDdzP=%q*KVd-jP?t3f3=nwy-ITdyH_O*i>w#~nil@{Bzm z5a~c-__alT=agTUTeNupAEy7qA7-*1f&N4Ayoso`61Kep`tJ@OC=rn2@8^e)|NZ!c zcY}}VkI~KtXi}tvkt=q3pyS_zz2d)MDD~9OZ)N_1M3}m&@m4#ON_|bQlO$Cp-g$as zlAKJIb}t|^X|&^MAt|%tDQb`8uiY8JJoq#M#blT{E?B0nEd=W1Nngh>xV)B$0X1|o zSnA@R2FnF}S1lo)F*cNK|G^`=h@9(QH_W|ZnEUZz?w(=pEx5BoB4@zoavmIsi6tO+ z{#0=HHZ;g7yU+hv)N?n!eBE;%c;Zi+oK;q#}S zTUSzy?FLDEjvAV@_zn${Oo_Lb^gZB{lp+#$Kz6d@ILeRT%XAPwJR|QbpvYG{e-H80 zT+&N)ZZ!^j%_AuT1?YWzh1UmaafT>JIQmDh-BVKXi&bLo3?&;Zeq6XnS>rPc{NerK zMGj#W#}Fmxuf|)E?C(>HjU;Z!uuvIpVctQcZIH}p@^sOQEEJ7jA@4R$vYLZJ#yE2k zC5f8G?ihHLK+#=}fsu9FzF$oY7SA>UofD^a_^|Rd9Djm3S-xK;GBA-5B?hz)L8+c< ztl>aCVVUX(ho_$(KAsF7p=D8)pN*bY$B$yEoujW9tMWh$cY$?klGi97lp(RgQ~x{#FU zhtS&LEGo?zO75q@w{)#=nJrvwH!|b(JVQ_J|Lp8D=dZxgm_VxdgQlX^VmFTfpUBB% zXEcF^;TCdO%c&B>8|Q^MT~=o*XBJYkfn$G7~#u92^8{e`9k z8~I4%JskZrh~cB(z|W!RPw{iy-k*cM<{u;D`=_`2tX@6PSCoTle)F_Y)5khJgahYn zl9=UfN_6MTDOq83;0zgq#TE9!p1%FbpYG*tz_6eOtELzmm}N}|8l{3i4nf+%;wgTD zUz@xu*C%zqWY0`ct#hmj;hyXxeLoIFy)R!nLw8wyho2wvsyknPW^l_9(n~*ahdRL$ zb%HCH{PDY=Ob3grtu)2G)3_5^>8gHe&i`gaeQqw7vYIdmgY148WGz7?JCOSp72}XP z8wRlBzros_prS~89^0iQ4|^=iV4xMh(Y_-gpQVxal@E4LjLl$?KA-W;r@FbnC~Qr2eM$vr zvN~%TCsbzhZsM`n3<2T343=S4{syE&!eU!}=ZCer00yFatQ zzr!vY5;UIo^eb-+b{3eP-*iwq!elkb&rMv!n-iKoxtI2P z7abOgv>Y=Y%GH(+tik(Hyw_L9FWBdPJ*sBT#Z2Ca$N763i3UT?=P3?F`J5;>Pcvg2 zbrBr3lp)9Id*PT(Msl1s9!E7L$Z@Ks$>!oUjydCSOqV@%9MfdWXUd+|ar{^u6}k^g zNM!*IW5o@})G;{9bczATk$d2X?O`1g^Kq1-xKYRvVH_oz9pQ+N#!)2oAYZkcJR^An zYcK>MJMP^z=EzLjshCWvJ*@Jr$PJ}v0$EEHF~CM445B28(>!OzS2ov6_{R8_@-5>V zc=#G9Iqd9 z_%TgCPUXiO{Wy&ur|QS){5VZN>iBWGeteD}b^38WKR%})7x3f!fi>YsiyqYOu8C?~ zX*(6ed6sZ5(SX#z5YBn;{}Ac^|3tKbH3gBDeGIKiEUiidTCIe?|Bulsheq&}n)V2q z_Fu|a18brY^DOfDbGOM#%wI8L{qNTEf3JQ6yfo4Bps7~ER*TD9wp!0I_Wtiw>z`hof%VJ-?liTS zZEG<88}2H#?kuC++d3y{8mna)3l^#4O-2i7z8=^RUU&3ubvU4Y~L znyY8#3I83j_TR&8V0|?CjqaLyi_V1sI_3Xubp9bU2G+-t7j@TMWJ_NVlztcPe~cJ^ zPpJdz6UlSBYZ`4~$)KYFHH&QCR|R?hiMIaeitL)_jy1Z`o}AX* z+DvMbVY?PJL7w0B^JF$@C*zr^KqfC`F$%M3-K}kzES6-lxaLfM8qK)L6epr=lp-8T z#=2WOGAVA#ric;M0GlObV6Ktg73qF+}g`nqiN2_R_@ zOuZNr@it^4Jv9KTc`DIZPbRGuJ!J0f4zH}*1OgIdiPYVcN6}4caGM((+h2y zXE-y>hdVPs>nMnC(}sZCy5{EACePIezgfUA`U{aQiSa|luPV4h0i;GFl(R2 zxO2+O;QN=Sa`8Q27ktN9d^vPB1m8^h-;my3fk!v9cX#4K$PvoE*JhJRzgg(DDJrH;lx55!b%+i! zV$?L?^q9E!So;CAT3GCx{>>lIh_nBp%U>m4K3Pby|8s(T#SRaK)LvA%wy8M149}qc zm1`p{>f1cDm$-=R-*BrgG!-;3QPYS*Kb5O$I+zu>bEmS!HP~b9 zdne1Wk*af=^CAz28&TWAZ3Rw0n=$t7uCTYbK#z@8#kkP;EJ+RvB_~ZDpz4to;fj&s zPmY@Shxzg2eth&JBgemVFB6~3mDfI-vRgRz{hhEG$dKsX!BojRfImUa_vxGIpTqO@ zcFE&xzo~b=r5f{KiiQX0>@p3H&e;h*ap&v`r}091j@_`g`*rYd=*QY`p?{?({vPHs z{#Jij$UT4rAaXe zROgM+Op@T4?hC!)=UCK~Yl6~uZnGOb@)w``Nz&_t5&gxUKl4wUdwYRJK#Gy&N1?MH zc4Z-hTZ;%O;Y|%^W?^bwT>DSjKSbGX^tqDK>RWuYi{QP@QC9V7XAl1JV2s&JaAp?Z z;=zZ)%y|X)4SGbOjZ|1A-c?URmv0+p>q;Kx)>cE8qa!N^A}hB+h!W@$NHQof_+kfT zMyF7JTe<1(bVfiXJIql5m>}ygKsN;k>sQkRvPiFwc;*8vE}Me}NjozXb8UE_>LMdjv#n zPnhEoQ`I{5kcM{>r-|JvJ^frRb@dmCMdOq^G~TONqv2tSgV}n;crHuMiOjVgLSPI& ztUr+zkAil|u=pE$GiP4J zIe{I{{EOVGdWYKF`!UMnXH9|sz*_p-NAYN(9T2F#j^Zq*3B1Ow^bz|8TQDMuzsxxm zWt4arl2##pc+>T{~f-Kq*+MqvLU((-vz!*_YOBhvC6CQXwE?qGZ1PJHhel^lm4t^6?3 zemMbmgfq@B%UO_d&X*G<-}yr6w7kmya&|aRL~giJdDz$IxGa~RPAnf`Q$JeX^x67{ zR6ho&NQ*3=qy`6*WA6<$v#stFE@C@7(jt37Ncj7#XHjGNbIJ;`51~_u$%i2=(kkOY z>CHLi(VhoG)ADO2v%Ea`w;=NE7M^O1tnA`d^w3hX2UecG6fe`B6U?ACCAXXo($Z$% zSDQWXbl+flR<;0d+V9>NWPd@77&P~WXJ}X3K)l=YZr`Ssq(7?aW@;Kn_8 zQqwt;59!SoaMQkS-a&2rqf+{Zc(cuBZm9?9t;}8 zwn=B<(DM@A`SL(Mh5A}VHoKo2=kT1d%M@LuAP#i}_GBclIg?PvSP|2xBDq|^YArXO z-};6>&H0hkjK`_>DAL4}T;(?oWs8lL{dJP$-KU~VXduJZEKrJXHsx>#uW7lxZve#}wHQJcrdn=wiOI*E zRX~E9g9M)?0Yzxqut-htnQR8;JhA3$*b|vi4nj-;#%HD!>Tlio@)lEje}pC4!_DpC zRyFQwFTA=p>`5olZR(6)Xwo_+Scj*2`V_dWK08Q(v3S^h4^>lux))p>)Pcb7Y-EwlSe%xRGTp4yxDQN$8D0CB+ z{hoAcda!n~TrRg+f1R2w&F?a^kTNdy*I3gPZq1fS{i99%#eeL@*I6HF)l>)s+P=k? zc_wGDw}@%onjSHu+61D_>x5`U{`k(^tyLP+&a1%b{ucf?tH+IR7J@Aw2SHP-^e6ab z@l5>{756hLjtt4HOqq3SOt$?gvN8uH=8E6QM=>-wh`F4mEqUv?>QjO#d!{szC3WPv zn5JXs{!T5wLDGAHj2awn*x$4uOQ`F5iRE7XxLa(x%%;cci&9lADAKxE}`YJT_vIr%w>U#BT~IP>88idSc*j=o)asxip4z^%f;? z7lz$wskH^8F-3CIg7$Ceuh-2XR>yeQ6qh~gUcDu~oq}mnwZhx#2PYEC*wfLOwQxK^ z1qX|D2hyD|mEY*C7)_?Q$LRR5J3}ubG5;|K3J0Ge&{;qD3_Y}vV|JW44Lh9V>v7NH z%50O4BH7&HrX%a*vDU#_e|AnMYm$x8K_2ke_$3)x2$4u;I$947b0Fy?BaKJ%H_oy7 zOs>MQQz$wCqAYwep(@kAU4zCYwPCPtAP^URc?Jh&S_BEgjGo{3;Ue-BX46e2ow zVQ*VjGC7}!6-;=g2f6zkoYM3Lny#arGt9Ua1Mf`wp=kIRU|+LXh-VCF*z>{E4>=iW zxg89yIEKkDcuGj-ieFp3R~2*G(AWq-m{f zR@$^k_1H>VA=JG~P`A=%Z*=DiG0O0ZGrt02+zG{@L;5PQqn$?{j#S?T9lbvTZ}wfE zsc(iJC6*P^5)wHhC~X_&#MR=dr=Ht1ZggV$;;FSYSVbt1$#R;jLt%?b#>vPFUeXUS zdK7AkJo-$wh)-hWdf6WB)uT!p;KKtaZ{!^d2E;L=YZ(nMD>Nfv86%-*RX_H8m@&=5 z>{?nZ&qc$`qUMT=8Wzt`=K+t;xy94@wV0P~ZdxF8+ON~ErkaMu_m%KtTwc@hk(DFVGpx89=Mp$2ECdj(c)f z7LO8lyust%3?A(D+_WG$E;9+_J)Fh&`Y642c4XyZ;WRh0@>hHCg-C^>%;G+!`a9{9 zTmC-7>5$A@n_h%~cJyVH2;9(lLVe$Pw{%=H9 zrYuQsQMR^Cwn^tQf9h><;%Ytf77^3Ml$GI z0U&-0_+bA|gE<>MJ{zD&hWv$DbNbBT7q9a1PecD^Lw^xIvhq^cGB1bthfLl`zZ=4z z`}q9%1pK*4yFF`phlM+!J2tI;?GTm1JbmLi8HDW8uxS^x%&?yvf1a};=VWOHFVAgm z25qFu3z3z2NB5dN+UM;D#||cchd%e@!paTwmy-+l?1R!GwWf?y_}=7==bi6txL_^Y zCpRtVi)8vUhb5U?nwJ@x#!wlg;g;5I*Lv=3=`$CvR&-}Wc8BtGPK^y6qpu0LqHoe_Jm!CvWLhBw_BLeEp2LFbRFX`Hjj0HN=}w_+Co#Ee z-S&-=9nUHl`7)T=93o`LHiZzrxpmVw#_!m=gV8;;DYWA`XEQbr!`vrridKHW)!5f2 z5A4|CJkqykLr3NF3o-IC`E@a|<6+l&V{*)nttM4w6q8(vJh(R1e~7cb>4eI@%f?K8 zy>fc|vd12jjP6?}er+9W8fQfHKU-N!tn(0S7>if{gtg2q1OJm+{jG*8*=JhJ0eBwWNrasTG#S1Y?0 zj-fw{PQ9MTjQG=88EffR4y~%8SpouSHXcHEtM|X=I8Q;Ey?1Ptzag9<&r{Ss?7XLK z)YidoM0UKe4C#)jd?%9nk+6S_)Ed7-I|dZyJUv%X3u$Y?AFb%K=ya3VG)e+8ao69_&>Y(MZ#Zq(qmPr0_S%;iMAF$ zkG3myo};mfNVS^gdd1KNyJR$5LDT+~)$!7Wdr#^=h{X_bOWH5i=xgq4DOv&EDAO;Hama*V4acxVLi8@l^bzw+`3}+K-qWvZ*|$)e zB(;pbvP4(wOm*gKtJUDjoT=Mq^vHw1OTBprEL7N3SNVM8x+1mP#>yR$l-9GLR?EcX z-<6Yj^}g>remdvP+!h>wl3VFXZ*sDJr6QRU%ZSd~f?D!)=_R&q4Wd%#Xu;w8GNNB3T>h+{W9CC=;& zot$*~R<$H@1D@Y$HrXfjAMjfGWqflcOZ+r41?5WMJKRm~tV{Dp=XWvRLWar>TKjh= zjNI%_nD*?3K-#%oJM{QG<(tK@`esaLA&wc>JLY)er2?_GrYZsLr&A3(d|W3^ZJ>-_uXUp z7}hcSz2p{Csq6UTjCSeIM|@ z>-_Hq|NFTA?eV``{O?x(`+NV}>wjPNzn=fyZoZvy%8!g=Mxu`$8#O+rAN%D{{UyC2 ziY||6ETgqr{(t}eZ=wJl#~j$vx9h;07StbilUW&RgCY!|qx#5yV>qrgHneAGT&OTK zKC~C}uDwJ1hKfV`hYkpph7JiG7CIs{iTT(kLZ1pv51kbHOsF>s@TmM$ zesqst?s4{*eF}OD){cE}&z^CEg>&}0FEVHEG5h|xXpjBp9q{{ues=JRLyM1iwCoS% z=S@E4xO=Dl`o!wl*PMRoIUlco;^HqP2d^DkojgEAH#jI%5Gg9Xh%0tf+J3vmMpAOv(>_Jai- zKrPU7=?@kx1sZ``paO^j{f&eH%YhD{5vTw{K=0Sd16T?)1NA@!5CVF?MjD_Qs0Av3 zDA4~^@&lFw9Y8&h0HQ$G0`dZyfqI|<=)DAgAOXaH-mj1jXas733LpyfUrfHha-aif z1Zsf_APV$fL^!Y<=l~jlTA%`m0{vem99Rx?0F6Kl2mw6}_yf&AJ&*vRK>wG(4d?*s zfeIi5^jt`MpaZA}5SYyKmv#XA)x16!hl8~0mOh1(EC~H1S|!bfqEbTM1kJ< z_ydhVEl>eOf&O#I4_FR#0F6K`Pys}N{<8@OmIEC?BTx%e03o3FEXo8rfJUGehyuOy zNCR{L^*{^=0X=iU184+lfeN7KO#FampdLs7F(3r=o|kpc$wK5CV2ocAO!T*5C`Z0>VXO% z1oTvsH_!-F03o@n$Oni4{U;FzSPC=(F`)lM$_F}tdY}U6Pf$Kk0YriRPm>N<3N!0(w44dY~St075{|C-4Irfdmi*dM8sCpc$wIVnBZd zc>*0kJx~Eefv%4e4+sH`A0s{x142OWG2{a@1GPX5=r5-{pdP3ILO{>a_yLVT0*C^= zM-d080Qx7956}oy0R3gSfo7l{NB}V)1oRw97|;PU0tp}ngn-_O;0tsBjX*6>0fc~_ zBS;5y0F6K`Pys}N{y5>la-ajK2NFOO=sg^Npc$wKDu58sdl-H|J&*umKnUnLl=wh1 zPz%I>{up=x9Y8%$0fc~_L!b-L2-E@$fX?J;O_)2_KsAQ|DnOSXWrsb{w@9gf# zxOux}x10a&o)2GUe!p|(%$djTocZnV{0^W7D1ZPkpt&P#2j~Dbpa2NK>;rj#0nhEQR_29iRj#00&GRKo95uHJ|`U00WHPaI63gC;<{MwTJov8c+fxfB_~i&;v9; z0?nSVEkFZGfC2~r156%JH=qY-KnYL)0hrxkTfhM505zZhNB{$xanJz@fCO;B><0A# zIzS0f00EdJun&L+aKPjW^#VFT4JZH-z<_2klm(Ok37B1=PCy4J0Rk{PgASkpB|rf< zV0MD-0X?7w6aWceK(h$;38(=QzyY%m^nd}-0ct=2kN^&t1&|Nu0UA&O6hHtNpl=6y zKnYL)0hstuAD{pTz|4cT0y;nm5P*RT+W|^|0tf&Dj2x&FPyz&i0nHec2XufEpa2{& z{k&Xd0Ca#FPyhsg0nI-xSLp#Ypa4h!2h9J3Jiq|x05w1YIAFfNTxA4wfD#}995DX~ z+W>k%4Nw39n1290U;uOg1rR{nD2lN&;d$- z1TdiaJJ11Y00&IBVV{5wPy-5p1aQE73(5lqKnJJ+3LpUUO{gEx0ZM=bFu?Tfaup32 z&5#EWIdGm~Ndh=v`UdI)bbuOA00e*m&0oWD0cwB*FrfJ>&;e>d0T6)s2GkGGfC3-^ z)0a>upav8G3E+VFI_LleKms^m`U2Vj&;SLPufcu*8c+fhKmZtE`W*HJ=m9lA0R(^n zrmIj7pav8G0bqdX3Ty-D03|>G7+|^#dO!`301lWw10A3T9=tTMR+#r&^m_MOQq|ba zs*ON3uo>6_Yy%9y4xk3u4eSN>0sDdX03%QjGy;c!Cg2Eg4EO+O22KHIfRBI{;2h8j zTmVeKCEzk}6}Sdm2W|kjfFA(@)|bnN`!yUriKS>+0N0lt7gfUawI zScU=pfPp|fFbeoR^(R63XMw4}d|)xK3fK(n1oi_5fe(PQz;)mja35%w4EGYy0U&^$ zKm;%thyz9gDL^_f9e4qF1t`YzAt9L%>PkW8f3u67V^23*b+L`vT|y_yK?BF*@pYoB_uf_~jYUH>^~7 zxouIQv81T4z$YTTe_87BHOe8Y;9byKKeDBx`uS3C?}^D_;ln46PaXx!QOV(9kGqFA zi7l4z4e)pPMXI*Tv;16TE4AI0hx~C-dertvuTuW&`d_fiW7q$RE$`pePwiTziq85E zo*xPtjj*NI6nRWQ%lyP$u_KOmtEaatFl_t@U1t-3mgr}&u}R}dG6vwXMdj*o!(82+Ipb9^RPN5_ZS%N!rlv5${^ zOiIW@36-bO3M90yM=Oxfx)H6|5&=uJzbu=K*4c?UmJ*v1<+IB$`PHm^)Lter`Awks zSLcE$%U+`MGcWqe$>^xqh;#cZ?(h73`DV1=8UQVs^Ml%j_J`_b&JWVD&rdYSD4}DI zx2##$vux{VK>(;;1%MJ-XD8-3)S&z=$AQ}Kz5P;;$=i2ai~jzO|5oZPOZX9VPqEui zf{faabWHn^j@^EAtV|+oE2#dlV{WIJyoWTN)f}AXyy?~XsE!OT6o>)CC;%Nx3y=XB zxv-Ny(D3fy<{1NwiyKa&a!eXNZde!%0y;KE&ptm$kCM>(bD3p*mgT?oA9GH4OhHi3 zv&%=v>4wHyK~jt!H#}+h=uueG(3F_bqsPW#F{2YkkHtnqJ2a4ws zTaFr)!2wh~I|U=*UmdUA;WPU|^)TxkEXLAo6aoPy4o7a0QCJ3)INVr^Y?aVl^7Q*WO{4JXgQ+tK8fz# z5`G#P>p5$?ki^|Tk2uATSf=I6_RiQlUnwgs@?UlMIS~&h-^}eemAh)VypC!VQBLB4 zS4BqUYgi9~E^xup=CR_g!#&#RuU22Y+5Lup;G5^G)4K)zV{djWv`d$BLVeHk4!*Pt z_qYKMrk%eH93vmwgN9pY-BnRRdhCLwf!>pNoadcfh~Yzc3GO-f4qn2Rz5ZjAv-Y#9 z9_zG+UtN$D(EAQ12)ML5ZWTRcsZKw&LBv(Bj2K!*-s|I@*m$tBk%|rOH~5UUh;}J* z7nsPY3xm^cJ{Pd6WYJ(czohYMWl+SNRJD`s=n8su^1wX3a*V}!%HqhZ;<;HoSa*F# zA<1r*%!B`!+dNX3qZj59!fc&n7PB&kS(&92q5{o=FIdH9Q^I*lVP3P~DlVLDEvb}1 z4c3xZAxkfWGT9~x)MKl`q8aEmS?Axi8-6I?z8r_hpO)(S-EzO*m_%{Ea}Zu3LH1AN!N~R`K*U`E|>baC+JF@f`%R9$BcEZ6dj?LdPq6J zMO?4o0(r0|CwKu@9BknB(BBL$J>?qgJa$AnpI+#L1x&%R$~pRM0lm)$`(X+uTFud` zLyObae$F9C_>^$`aWSQU-OYu2(+JCsyaZhw*E6=CG{Yr#5N~_WWfdb|%H^$`Rm+i8 zx(up#X-Pyk0@EYA1T#;zm+j|$R=ND*IFH)BSDj`S_!`3H%H zzCZce@$A=nA6tx+5x%&5q9|QSyUKRv!-ue(P$`Y;zFNGcG`m0-<*B`VmP|NJ%Hs7- za*ssZV=Av8)?>W;M+ZftzE0e#D((H%@m@`fkA-Z#0d*z#;(^PmN9^3@%F|?fYI}== zL{0}eUuVB|wCuwUXHF-1j6b#Pw19svB%RCq@)9+nsJ|>eB#8N1CVlZ(@#e7dCgZ-8 z(gWKM9ERO3I@IiWdYRWT0Y6N0T^tl)*ygJ3Ajs4SJhh|6CDh==ZezL)9*|Ax-U$eb zM42C3GWn!b4Q`lVG|@FcTN%7>~>R5^$Z8XGkM%7$uSX z7Y%9B>zG@RD2)>MatG^AdcSe?>g0Yh#crp9`fO2&Q^8Ud9x}Z_Zjg1kTL*ubv$l(t z>%KW)OXa5SJ=QrD6sYjc(;C7{<<@-4S<|JAyQs4J#_n%9733t~OQ&lT8|sUO4lEpE z);wj_aM}kxr6_dO1ee!`s8{azpx=5zKg;os6mP*@j794tcPa1Abdk^bXQZFB^8M>l zs%np)Jf4UzEj^Ta?raBNpT)H`JKq_w&q=;6o64&6R$cT~Up&%oQg!{IDIZ^58kc-E zu75YtX5GcwmgR?!Z#Yn!=u{Fkc~0-yX{yy_ld$tdr#$rWM4yA zrFm-MOCsUi_+qtMI8V)+J*QYr6#E==m)y`vE|P9DNVm_-60<_m7jNuz!QZdNzf*l$ z=PBfZLHjj>nqvmk@S^u?qP4t1$IM={mBN>@g#ELMbKpN+tkxB)mBQJS*&gg6nFmNeDE@`tybxoxD4*yv$rD>nK$kg|4-IY`A+qo~7kY(sG^<3+2pZJC=gI@0w z%O~Cao5e0^+|%lNAAHtFLY5qlNqlA2`ACK9if^Ldix}XZKlZdmlT0AZPqDF{+*njY zJE@qC_#C>pD8N)!9U1vT-eE=y8+eCeWIOylF`vl+{ z_n=QO81jBopTNu7C#ZVRCm8#SKEaXzR-d59AMX>umoxMU;w^oGWdYD9SQcRG6D)*2 zK~(~->I#m0UQ;mJll%~&^^$Lt()d_G<@%zdZyJhq^JlDIxV-%SrQPmfhonhg`}BUb zzO(#hjNZqa+wN_AAt~SLr6~=&cHEtRP+5h0443f5UGW%?GaAjsoB8d+Iu>OGz3MNf zjPoCU97kV&#OPtY?uX07E$vHmNH z7T^ya#p1a*Vd)2>Jn7Adwx=(7c`p6nO-0$%mBT^T1SQH_Wa(eRbJ>gaTn^|)auwos z!3x0@1^;|^IV<})wQH+N;Bj6fYue#@v>D}GP`>QRFGvf! z-FQ2&pDeh_iF*<}V8UAr+I(pe$uNY86?g+2l*nda(?jD@6MdA}fx2e9~I%>ui z)r=9QGick9J>MM}P_fQsea{LH>IK;TNb9xBH}w}zwO+frk)Q2&4*bsN06aFaNQ31o z99ImL#ctqyQt>0R7839+Jx26>7x0zDrV@xA(ejOKk4dZIK4Zz!qbKszF)l7pv^t8i?+lbl>diq<Qy_B%jhC zzA>u+FAWmcXK}+yrGC&xSzqC#LxS~A9C8)GU+<(LS5e}~NjH7MC=BOogl-?0<`uYu zRX|40xrw=M>t-;~uT89&A1B5!7$q13elHvm(?CAZ?x6vH>FOznK{H9ePLJ$ zvxj4q-bTGs>2%&bTSXel9=#xiOsCN$8$Hle@1tObajJ31g8FWodZ#{1y9b>yW z;s;&k4%G8{1wNF0S8lr_t=SEI_-)x$XzQNVyOeWEQmd0(qg=L-)_V=g*GK7jQH}N1 zyPNn*=kggXsli;@Dk$X*yj#zzfRtP_yKJM;$K%%%vOnIy`;G4Q`UU;g(9k{4o|*6o z`c$p>75n2eVAU809kZDZ`=iD1hR!hSiRZ9CViG68IJ zc@k1WLS>X_1rl1P(F!EAu1717(7F+=*b)ItwA(D3jMmu+8R?L&#HK{+>@rM#H7g$- z0+X2hCQu+7AA4I=2IV_!l@42_!&d3ARsMgrRhp2k@{RGC4rAqCZ>)6KDxX|ir61TT zcl>DWA+T+gFZK7RpUppH+h+Oa9teFg5UQnKt42op1o4YBNpF)_>35qMmTJi4x6RJ zX89kpSt9%7kzEj}kZq5#Pa+-LKKb8rM@DwUyWrc1{2P$(Jo}x&1bVs6 z=kYtp`%Ui*4xdMd&*T57&tn~Yh9C2t#^Lk$2Yen)r@)RFH@;}tgzgg}9gdHGx#Oeb z{qgs`KceUUf6MPN6l{sTW+f)Y!ah-A+Y^)YpXg6?d@l3ZbK$q>4rA1)FA!+6Cl0r> zCyH72M9N`Lbof60#lDZv!@c~N&)&!NeO!TjA2)|b?;BVf?r?zoH3vwzHjZb)?|UZv zxi&=?9+5aQ)w8|3!=~u)gLL>of&=D%%%+GsRZK$m#RI{uHB`ZKcb4{5ey(}u^iO14iCHbSJ34 z!wUEpTLB&Kd%y2}@4smS3YY*687$!0&$a=^wW~gVd(7*J5kHPvQ?O{pT8B@e zWBl{OF-o4?@y~yOPvJ7;Q&`!5cmDwn3*fI>03FYR-}gNDbM1dlJi_(!&{5!%k_In- zj&abAanQCg+>UY3|H*OC$o`i)RuB>qLgJ_Sd2YLj}qgIhSu}YKU+fiX#ec^i!U>oNDm;x5fgv$ zSL|*m1Ybx^h7xQG6o?NJ8r_Nn9tZtdYeH5p zw9Zb<9vB@XqjCtejs0k8rVdLU%7?^6LS*uoNQe(2DRQlm5Ur&x<#A?Tj1DcqNM?c2 zq59CtgfCgk8T$Vo88H?vvl5QQ9S(}^B^U~N#!FBHdB4d^@GpphG!okWt5J~V^u-!P zd~z5j=)0>f$`BKEtRZ?Yr&k$oNOKGX;u_Gz>0!8IGB{$5HibHy@Iin?ZKqSRCn(~QH7erJSS$xK zUdHGzIGEd94+1WyHA!!hl;u-~MDp@1+WOH4LD|%|Ez*)vw~5OoP#H+Hzng$>w5-Cv zi3I#>57`iMyO&~Ka-TB(8XqjAFBS{2 z5szVtat<+sN4*?c><^W_#>2Szl;xLiG<@T6y%S_B2@w+wkpqDb30pM8gYOqgww7)d zzrJnMw$SMXM1&{5?ks^HFVZT!3#8I||Cr)rn^RnJ<}QC9uM(-CNF6B}9U+T~4#~^P z9G8}@R%Pb+;_2%|=>&vP+?B7xjH?J-Ny_lff-Fxy2SPlZ6!1<)7EF(?*-!_;`1n(K z`E$hcZ_qnyLd2U4&Y?wX%hy%~ ziRyRBT2j**>TBwQSIc`;!^X#Y?5{84v`^u9mnTeoc}(HqHOo&X;%`iDkT=x_ACvc3 zZP@{op&qdU8XLxjn zcge_i!)trU#uSTBWJ-FKZb{ho1qzipf-Zv)R!e$Ty!7@m-<}l}9x2OV+iN#XM+#b7 zFI=m?231_$D4NqOM1ietoI3LL(x#1|KC+SjssifTaBT6Y-fq`>9fz2lBa|+apwOWU z*ITc_&NuQ8z-@22|4~$0M-)U91yS5+iGnyUxOg^Q>~k_ka@QodOh`UA3GU#MoA9vE zxqYK>yA9`S76IoBmfg(lUdhXw+i^z2*~|fW)Z3#PvZLM&ee+bq?QmSWg^m*4zjiHr zSLvpYuUy&OUbK4RtAW#eM!$3PXm~*L4_(h5&G_LNiE62`FM*51-k2XB>RS2qq0?X9 z%<=y9!W|1Nv9;u}n5R36*E`!JMj;eU340*UmU{w~97|yjW396>alWOzLE47sV;bLP`2Z7d z@EJ{XnZ{4Y?a~r60D_4^NKSM907JtdEpM=aBW=#_Lg#n6mfyK1W}vYl`aXB?WnOd{ z&$%ffos`_bCAT2BDCKg6cDt=`yQz@mP|ov}ZdXXjZ8O}i!mCEfHxR$nC{R+uS1`dV zw07DT7Xncr=^-xU33==degfZFbS01Ydq;3YFIa8UbUxQGv(He?;kggPF#k6<6YQEiLf*kXy^=*gF}I|gTU;v;e~FDA-Y zD_linoe^kt&|wfMW5{eG0MiGFp4sJZ2oiCrb-hB5FSbNLKA+lg(z%NB{K~8#QQ=O1 zhzohJuPj*a>Qb4V`nhZ8Z#k^z6Lo%SI)xx!9HGZ3*2EK_1T% zrFA~46lvd<_eO~YuitA{Hee|BaRT%Ss_QR*aO4{7qbAM&BV~r>Yv1TgF&bByuS$Bx z=t{e`d*gtt-EVx<<^S79o#Gddv}6?UF}(l4+UV*%5&ieo_Neo9Jii`_-uU~TU#L%Q z4ZZsw?rx0LQhh_U?osH`@l@35ui&x3v5(w~S;9W@;k)B5JXNTED7@pT%dz|siI(S# zFII=e^RP4mESFF>6TK1aDVWzVthx+aQr~mW(w>EK2vi;xhwa?rQcx$&mwrv&cgf%n z9C7+epHlaxx$pe&sZDIV+!~$7vp-dWUlNRS| zK#I3XOX_wm$d@KqC1q8!sFi4bHO2HPZqELJeZEVD^9 z`C7sArlB@zZ(W%niyq!p;D(|;)^LjaEAV2=Qps?$6&H*k~lD8wBn9S_3~S z8~I&41Mf=1>Yi^@qQH!u2i_I?PT47Kn@lc2#C1aLkncu_5Uo_Hv`SzwERNm#ShxIdisUrWgTCFpTv z*xF%Vtvs<|<9Qd?4Po%L=dgd7;UqZhU)Ecv1{Q43w0Nu95_K<$wayqaQ8d0Xn;tC) z0Nqq*(j1h~Iy)hIBGS#bDbYH+43oba^gO#fvb-f<55m&5+`SI!FJuz&Go4*QqG z{^hWL{ePYXq)YICBPl4 zgqzh9ey?KxE*k-Q#{bJ1@}AV+WgY%s4*xGM0XHy8kMRHU2K8_D|5~TYYF{U!{L5s+ zn^$u5;XG=xfIcL~3VpCkeX%p|=Sbm`V2Z-P>jL?IqThG_0n5kzefMAafVGpVD`R@D z4{2Ec_OhNw!CUJ%Uj{B-u{-_!%L)l__iAdcTs~&`#giW%UOs+ecD$fnKvBN`YS((t zMEteaojW~!HYvr|@0pdY0&RJ)77w#nD1z{}&o@VgJHLlz+fp5tc9xuF{5T}EeS5U{Sv>B6CnV$Uob4nu1 z;GWu1g?~V~28sN9pyGwR*7JTVdc57Ided8ho2$BSaur?`cE>WX6A$fZ`6U@9-PKBV4~*gsGOcor^)=S{wbm7Bj7N;( zk7!r3vOq8PrCoX3g)bTWO&Zq*z3^pHcI}8V#w-jxSAVK?FF0k%4jkWrW_bm_ubBmg zJYQ~lfkEx5&4h_;*OAUu3g?YvId_&b);3pe{km*?cXmT~mCemd@7&O1%Y(Uc)!BID zgcbw2m2}>uaNZ0X=Q_V*NTb>%)9r#DI6!-9yPY-QJ4ol93g=Ch9lT@k*B83Rgr4CV zDw{P5L!pa4?a&?Xxc>cRIO#ogMs6OQbbpHj*ul8CjNV_}nEu*pqDej%R-CU$Juhh2 zAxG9>c76xlvr)X~l$#CP&+e+NTC%+MWTI0+2$}#lGba~jt{=x;=j5|?(Ijcbq?N5@ z`f8Z`HoVw7E;;Dq+i}T_H&r%+vEuf}y>A^Z*k@%8WD%~04I3T4cEVMZS8d>r>V z+h@Sx2gb~X`}^J_{_b|L!QVy=e|5?9cYBM&1aGZBo{#z$dYd2EHRv(3`x_-JKd?_B z?@8@%IQ+mIeqe|AG1i%U9e!XAKd`^mZ0^7B`SoYo!6rf9g7E`G16&^A2c}q?_r|ErLbkwA%;NuLs4GPNUs<$ZDa-$Bugv2A zHBB$@V*I~k{4TzMcT1(AXl~lB!ZrSUkMWDGQeWYPFwyBkn-nALA{UoUIg1^BUl2be zl7d-zmn;2_S^l@C`5p21Ys~L-Bu(&<4hG4`3@Eq!-`fyX786y%8&viO z#*h5n?OrFJ%GeQW2u^B@D~=uR>$}V0|K;%i(n)6NZ2?vt{$I-~M!uBGTRE$iBdc^7 zRPoZ1kn|AeRUtpDs?DDpHZs>GW8_(!@5y(JfBfZ8f5-U8;#tz-obuwi<@upsns{Mcdta>W0# zL@NR_jU_qkU(%7z;ST$kBmP&OUO1Z)W}76?@113xTfm}m#Q$={|8m6ta>W0dQ<|q1 zz9bSl#y|dD;(vWK@wpd1%H4WKIOWI9gKDByI_zH#`PPk+Iqr(p7 zu!A}5V2(KWjh!y|`?dIYs!!|eu!B7^4*vi4_(!=V{{0g?{_*OHAJzFO1=@dpzB@5l zcefbXzgBuaI{sHD2pZE4#%?W#*k9ZK&hfuc0QTQ%|Kh_5L*shUiDM@;#*LjA8I?mY zGMrP(JdCK0Cv84RldWwiraj{ihIH)lkn9*>O2|VAm8a1PB($zaE0EB-5v|w~0ZVi) zvTU;bIYfg7k*OuCJ}RDSF5MIv6t#_1`g2euzL3@uu8sM+)MGOuF-{&vmRl2e%5{wcg~ z1vv`gT*F18rZ1(5RPzRx6TyuFWdn6v)&*mb+lLA)O%! z+JhBD=qE*VIT6~*PdghK%I{HD&|@_>L|jc(aVhO)(e!Iy3}2X4V94^-ZaZ%fzpZe7 zOYOXcG}P;yw;I#0E%;*iv;soutCe_1h92u#CJ$N7?J2G{R>?zE(xkfflk*Rkeb`}q zdFw=9Pk?1>aSAsr`9b<=YPwo;Kx!omWCpaj0c%f;ut~S><9l5;fLer6!jr@2Ym~pap zN9~@0wcB^p_TVHh5T7XQ?Y1qn>G)TRdzYdrW-QbTEfYu{?7j6y?**!by-T;LM&Qn< zt|P72F5lE&IMsR$=8)Xm3_H%evGs$+u=5!s%+M`z%qjUt##9c0^VjcJ=aj_Qb4rHb zQ9FN%KNG(8*%d1?WA)z++p*&P+k5<40_&zw1TGEbunK4P{5ORksyX!63)k?c?w$Yn zw}mBGPyl~bn!mWtr}w9G@7JxI@sGXPJmc^b@=xSN-S3U{ODde`@v zabCRn;>|VhuL$ZMpqMtV`Y>ojA_3JA-8xvjY+SsTWevlEuP@0He$zkVU`8W3{2$8} zp}vX97I*9}e7&>#Dow1oW8XmDliF7q3di=VaULA=PtMKa^*=@B>4)`y@@@@4BIiN+edk-~hr(|GmM&7sry)z22xw17CX3H$2v*bmer*}9sWkOK@Zsc_c zuX(JpaLMw+{SGWyzCF=N7Y;Epb24*hzL1lVnLDmvvjlDX^w~)sXT2s#C!H-bZMKiA zNyAGPiY4oaqxpDoH2=);nCSEKi1C;?J@=0duKf?pN6E>Z`)owI4kJW@Q__fXX-U3K z^6-gTDJ`k9Nn?GYTcxF(e%6vj9i!7JK}BDybf_bhp%8p%lLWr8la&HL+jeoj@tJCY z5?^eY5ik_F<-^g!y3$t{;hm$*K8urdmxH zA*egI*Im;Nf|1QJ(_-iJz59;|h7XC1zqwtu^n`7K%2$+vxjLbmv`tWXNjOC(oU0Sm zKa@Qae<+&}da!L5aJf)?vi9d*4=U+$aBjB-P2TQnqhruZox?r{XCV+y#G?|j=^#Ci zV~x+xhjoX2&T4y8q7wrN+2Lrk0tv0_(F!EAZbU1#M8Fc=a9K7Pt+Nw4*GN}lQ=)Zt z879A)mCwG%nfxZmci89n--CQs29E_tYc(1Y^OcetX30g$%@KR;H^yH3lk9W9Z|rH_@1A?}Abbxz?r+=w%7<>K{oI>> z)Q1k^g@A+IxU_7wDl^9yU$;Y)PSCD(yYlrIRzcusT1`Tb1v5dyJfEioyo&?tr^nZ9 zs5=f$Y*Tspw5)@`Q%j2@MU7IGs7a}z%IXB^KQjG69k_8x=Yyik?&_7x$bg(YRH0+FAh)T6&Pj1s$_n1T!s6>ql1!$ zro@aMJvJ8R-JC4hN5=C8nmc-D%v8mz#yY+^1Sd@qDw;Q~QB9l3z)!>lJ!@@lkMUJ99p@ z<0Sa;oS$|tNVI5=KLHaD^p~aVb#;+BZ%{gKqMdmm_*)oW8B*VI-n^v&tBBC^g32!= zLmNVDZgN}5DtS+XbYA+rrEsEJ1eKaXSC?DP8+6W_jIc5J7VhFJ7_V+OQ5l~3-O%}@u0{?+zKanS z2RhZ{h^wbQc<<`9lIGlHcvrR}FRjCz$`126_X;Dh;%&~p6_YAPcAU7<_meWB z8aV}kN5G0ZS0lR-tH3LurEvS%<%biU7NVIobFa7oCS ztC%@;Mjp(;nR*R&9DXPH^ElXf|85w#GdX+-{=nP>4m(|&o$l1^7x!Hi>^xOC@}=(jMB_r94i9sF57!Tgn@x zZHPXm@okn5F!2VT(L|SN{B+zdEinU1d4nMmlsSKZp<$4gH`u_DHs^Pt^SfNj?_3iz z(AW@tpF8+6FS?B9+?0?`N^aniTVO7rT&~b=w-s(T6_OmvdA`!^3Msj5mfSQ7uNo!a z;F8-$fszuwf(c%swbQ=1;F!Pjapv!I*y$X0I)|O^wEEr$pY@TDCC6hDUzv425_4Vg zP4s(w@`U`~+3BW0zl8ClW6kHu_M>~O`8?~=U+84>bz3SWCrGt2n*`o;DN-%Vo35hG zn=YW4X+gGnFldzxFx)kmneH=2s8owM znUlH-T(APA`HW0TXcU>}O6s^YA&s6*2%N%F{HDYNcJU3k*Mc8@zLDTixELQoXa?=& z^_RwpJ;3D-yT}XQs~HrG!JfZ=V}~Aw4<2 z7b^C$`=iIV{u446gP9`R8Kxuz#>EXM!GiH14IeiwOal^fRbup6wp>&%(xc>NU0D9- zvDO(ECmvG}@?N&fNA6K>whCB-cI-!nj)ta$Ls7I_rYXU;swh}8dtjOZRVAh6JfE3| zDPVpB6O{O^{&T27zr}y8SRx%d8_f7sq+^d? zjRqMdzdm-OFV-OX8~d@X?kZa7f6!yy(oQ0298SMm)nlFZ@aQFrQd)S@l6V;F zBadnF?}Tna%+m|TaO5eABeRPC;_)18AGX^VT^#LX`K(%QQ1M(TVflz4NqRGidhl&R zUS3H*_|PbuGB_O4vIT}w-Xd80U1LfMlif=(FS$<{e~k|o(ie-Jf@K}U6y+RZFpqjE zwAddiTr0%5`IP0Ie-DU{YY*eVn9{=n)|k>@>zLA^!wMx^OE-&O-!^KSs(=Xfg*)3BDo`R_(;S2$rlO&N;qJ z9VDvXSw|U4n>%`BPgUo7@;T=yBK4z0oJ+P4_@_k}n7Lx5Dq`DlPmNQ(8MZ5VVBOMz zb<1b6b~aeIU~q?1fj3yU(jH;mGRWe}WWHIyux?#;-LXw~3d5Lbr2vJjA=L9@5tOdW#dBh0OOc)`0 z&N4#uEI+Ld25<&z3xZ3zJ;YU1*+U~lQ+>6eFhX<_?!19?t|s;MFjSNozd|JWYD?S0 z2+!=x9R5M0U;{zIUE01b=y5!`( zwBBVs%=%VQ5ztcC`3$OaWY2d;22`wbS>Ln586jbWD@Er|6Ed?8GWF4pQ9zz zm#1lu61{Ns^Q9@ z*ZXje?Zn|VAx>d=O^6uaoSvMwPwh)EBqhfX#c_m=^6JnnOQT{(dtg6DRSsBybYDt1=q`U)CBdLvd@ zKoOq&0Q;vkUv-YgPs(u~M4{15puEWW02L+z}UJANpbS25D^WleY; z<5y-y@*DY;@bo^oGtECd`?GzOU88Byc=wN*A;Q8*ekC0w((aJqys#F7SgD_zDix=Z zb26C685*k@M#6B+ae`Iv7uGe0UGPy!hlEqSpa(Bkp4xzO27H=+E9Z09P8ZkI716Gd z;;GF7W6`DhR+_unu>I_=+NveXYfmOR6@=2@S54R>0WIGGjH2 zs|+vpj!O>u_;y_Kp~!C35%?LVY5DO3A6jF7ZbZMH%$}P0;_%7i^3w7$t%Ea1uJm1# z+WE{gt9(C!N?hSuIL2c30Wl#Q?|a-blm7kJ zcFy6xGV3kBu0y)6gRczi3WQTauMiZV0L}yLA>%CI4qqj2!Rzor;7_x^!2X!@m)KwS z!`@Lp=1~dR5|Ex5zlhc??`zC2+*r)$gwbOk*dQ!E^%@S$A!QWv=v5BG`^p?MnRCGk2hA||e61LhMhzZ@^oxd${VWMlG6 zFKVtV@ z@zP)&H>BXEK4d|7u-2Up2*$7bU^ln>6^lT~w#pCuD(xJc5C}?}nr@XB1 z`HB5xgjk}U32)_>ponNikGK0&Z+a_mb5-|EPTVC4xG0lXK)POxRy5{s6VHSY3<=c> z4Ml6$R+T6tiKa7(QSF9?9=gzS;c}3OACrNC9XU_o6{Naeovf(IPYE1(p2Uwt%5d7% zSd?$x?^?GfO*)V)C!#(oqQsBtc$|Qag{9+B5+p(aQ;!(MA7HMhl<_>dD;B_fsy(&o z=L}+%QZS7cWRo>@dV!IjpOqpW95#4(A})Gf)7)5Bbj8(V6raId&ne?I{S~|cE##Jb z-(#F*aEP19+MVJ1oa8cyH8GIn4WfAcq^D?925+q^%9oh27De7N zFMB4|Pb53$(8UoS&bd7LBM;Z2uHQ=v{3-MuEwz1T$Ju>nBcnOiiDDmmcRRY%UlAnY zKEi#jG9JDRcOdtA9Gn2gZ57VOSWG2B=gFkNR@aGq35cz^Pd>x)7XzTQ$gqd*bm>wW1ZBe6=bpnR{Z zOsbMbhhdRk34I0FZ?y=<{n8>>3<2iY!Qk}2_#!Js{RhW8*Whmw9+j;YR;boPo&+*c?}|@E zdh?0d-h8Pykc@hre<%^-DpZ}S{=E8`#&!Gf(Z^@%w?;J>^3c~3I#~~nkBEcgEP8O9 zT)cgIuA3+NMd^1XQ|lTPac7OncyEnLd1}os&N1}qU;VWTt>@X>+tS~Mg5(~(iqV;E z8xnh2I`m!u$yD2>V_u)k@3M5Za>@g3x?9#wG3p;Iovoa?p3%WIx9PC=+jLA@@Ftdy z+4gXoj%f>ijHR=c(;sisF>RqwuynR^Z)rY&R(OUG<`u1&|Zg>Gf( zm~t1|bWB?)6H8|+hhIjzWXpZRv_)~PO~NslSvuRcMyEC%(-ut3(%H(HT-$U^Tg+}O9aEnt=+O5Td}lG&$lRe# z$F#*HW$A3&Vt#EprY-6&ES;?!&C)S#(Xn;5a#UAlTh=w|-lk*PqGs!C+v-Bv$}w%h zd$V-5as*4qw1s5rY~@U0wryG0NPVkK$F#-VkELUdV?djZX-ji7OJ^&me5y^yw1t+l zbhdKpIHZH`T-G%*j%d>{Z83~w>1^9Jk80B~ZK1}pbhdKFacw%LEynRIovj=_kbXtvH)j(pR$ zE$bRl>)UipTNG6+oo!p)rZyeZ7UFG|&Q{L6wN1ygMZKM+vz1fqLON@|g}Fxh+BO~2 z76V&n+qQXsTREmJl#!*gl{410>6o_Y8(2D9IpzC|uI(DpN85BvTXbxlZCk?!ZRMD@ z5T{r=TRHvdHr<1^e8|$-$|=s;bgXNn{G?6Cv_)}&rDOJSu}#Ocg}lPj*~*zeZ__bt zQGChL*~*dMRQ{qLXzP0YVqx6%mWl!}z*O^=ss`8sR0A7;D&S`ftnuSF|BMC3XD``( z?q|$Bpl|H>DKD0+-2CpbPrkO8>VHu&qY&XzqDR;O*@&@Er%%g$NwcVIb=8)d0|$?P zc;V{TcYenBA~EhI^&1(>BWp9+PTD?}k zu4-fT<}KR{J8E|C-M9ZeV}0YHrX$BbXg+o3qn2~67fhEfU%hty#@FVXx9{Bj;r`DU zhs)!)69`34&MsnCi5u?j;px@hyMxrHqpx45&Rq!qfUbevg1QIy2~qSr^o+@w zQ=ZS7I&Hctd&W%lteo7u7iPaWXYRb0=D+;Pt8{*WMq5}^T(V%{qSD2$y{=obbXnQ* zH&&FdTvf4p&DuBhmFw15ZP>V}`mN1xZ`r!-9mDn=J8O3B-m|xM-@E${y!Q`dU4292 z!9(vi9X@jO*zpfeG@m?m`pkzPecW>P-1*i|E_`abcGU`t5nTs2^eAB3`;DzN~KJxQjrs@R5+~b0DJ=I00MLvwJ87TK$m5KuN)1ZFX2L(C<$oM2!0_xN%6%8l>1wa92D5C%#Q9ZVZver+`f^uqT z3!s<@z)}fIHGt>9wn&f4fJ_4>pcya%dcXiYs{Y$DYyG->s1G0kBVc$1hAvkw5B0>Jk}xeCaKvO17y;8FE| z7Hh3v@gAJh1JE8=VhvCpmK4ZTD;&$Gpt}I|wm`k0SAbr57Idd!zsI3|kZIsi^)DV~ ztzZ2$)CJ&(uV6cX07!tk4KnDPZ$e#2256M`EgUB-6@U_WRQ;~Qt@Z2MZBVHJ3N3$v z`uH1EG%R%h{WI(fXofr-mU_@(ur$Nc1Q>y4qMbfRmx~GEH`kRs0TvG?p$_ewF^NEo^%Y7m z9n4D8+t~y26MJD(B;HsTcPTc>t0UH5>W3Zk>x_AHCa~wb1Yk#rKrY%JDccoMdKL^76?kb?c3_%ya_bSjoR=2zpN@T*JQ+KkG6idVIt!~yorWELR)u|{oPpg>S7Sk$IoPw$=V6soXJg+^pM#B> zF%R3To{y2auVA}hps^8i3a}gVwAh-Li?B&_3D!%q5EB=bV)sj4!|pHAVdB@9V!fA^ zVd=}?z&4eaV?S4{!lu5t8vA_RT5QfnJ=SUSI_%@ERoI5@8?gnusxeLNW^CDkEm&>c zHthR@1}yQ&4(#0zYB2ff-Pom%_hPGC_hGXx?#I%uzK5y4G-74udaUKUMr_cJhhRFV zCcDc-VO%an3wbiQJ~BF!YA&4;};8XAIqk8VlEFEG>u`2iIpD{nOASxIRgAhvDPl`i!TO z5|ZKiB-6V_Pk`$)fsP)R0@o*n{xW$YT%U<_Da8Nu{5C zeiB@tN%XhVpM~r5EWKC#99*C0=-n?U;rb})8}riO`lQj5=ybR~>9n{g1Fla7eSgtp zxIUBV-b*v#`ef3Z%BR5fnLocAH{-6r3kBWZxgKW4y+4QB4XTbHDLC?B46RyupTJ@zGu8*2-`EC|mpIP+JKj%Dj zeYgp>@2{@#Sqp&AC@j@|;PXbpXV4$$w?Rb=h0p5%_*_OpK9n(nz8Nh6x(6(SH>k{@ zd#GZYaAl;megf(xp}YZ>re6QK`i-{w%}_Un+5`1Bcl*!PKV4yMKb-}~_&l^9miRO{ zS86yqDTCv9 z9qM`m^h;nLE1+(qhkO(0b+DuXH7XC7LHDTo$??|u4J)C(a%dMU30PvQU|U$4D?q;n z>Rk={2Au-(Y0y)!BvDyF53&wz^N7?X*;>D@3hG`Db!~uiu@06XH^b5d7~g^=Wnqc>dJm;Z*7hSEmAFx5h~20%0*3LhOlXtIl#MESBIuGgKB}FA zF^mQ<81YX7Ml|yODGVb33Qz(xpa+bA3BV|DDgp?A1SmiOD1o-rG-s=-8KBQ?w6q{ENuzS->SL>V5C)ESFly}xn`@19BP%@YWw9{%O=CdLFUUAcZUPxiox_w5hV8-2X0%RQR9}oNo}K)Hojlu4e$h^zV<*qGljqsVFWJfS?c|s3XY?Br@Y`7Jwnvz`35oxH_P-fAarvy4_kHi@`TYUE_`I_A+H39A_MSc4gd{!Z7x`~|&-vxdZ+y@B<@|5_ zznx#8{T|-zH+hf$TYvKkeg5zM#`pMt_#5Bj|H*HBkN@Yt@jd=u|Hl8De`x>T{6oIS zf8*c!ihcf@e&c)m|N4#Z@!#vVH09GvGOM z)4p_XNV6ffLmY=V10gPeSPlD1_N9kbKsn@Bz;-D_HpH!Y`_gq*LYbOgbsulLIBZt0osQ+4v`J9;tG^Q8~>ST&mYbIzw*~H+@CJi z+@J0a;SCWFQ3|mF;yA=Di02Tcdi&FLY7eBZ(AuAV#%O=~b_fCN7ihzNNE>yb4Ja2w zd7}m#3+1H{J^ueQrr-JJUeMksI0jN3NCgO_5XVQtzA-Q!NS_BlTY->5ltP_&*zX+# z<*=;-WucHh9}V+><9@f@({@koi=ihDczFuMDNt_;v;nC*#DD7l|M`EffKPUIdRk&a z9{dEHI4LbD(>_m}mYJ59mXMw{6Mk?vCo4NSC%wqIM(^@-q{AT#$mEae@9LeSD+h#`%Xw zj1GZ^d)VialboKMkelo>*mW@KI@rbCWs3U{56ok5;?T*0@oAY!Sp~TQ5!`t5(lU~J zpK=A^$?&TS1;cZa6Q&7#CTHd32}V!J%*sg?_@oyk6y=Kl;sgSp+}z}x-V9R`($e8i zQ;QSw#CEx22fJL{F3HhZoR^a}WlC~Ra+26C9|~|yb+OpqF4tb5u5OpBuHGB8Peg=& zc%&eq*U{u&r#Za=r1d#X=ye+R7xyohBcRLVBtcPft{^iD8idJ;6aEP(CpjAi?y3%B zPVcGdzeKs>$;o*I$;p}G^n~2LNpYK=pO%Nic;ErHCp;LXSnTv$CVzGOTRJ@jv&(h; zOVk&oxGzc^4u!6JKbkZ>KRG{H5Soyakdd61oYR}WI4u`W?hLpTk_2|pXGngYI4eb* zk(`kQ3-6zkla(Weg-Gg|?UbCX3~^FI9*h-sW&9;A$bm}WF(EyDazbLy|51DeS%Q2)x*$m)7G%P99;6BI zIS)Q3!XIQ4!&Vl2PK3{ya8k0MZZhPv1S#-28*1f1KC^dRHf(1>&19&TE70t%xj*dd z>CJ)KzuQfNW2XEcyM1He>V&hVsV*2BIl=|)efIDQ^cVbYD-l{thyVVzGah z`Tg&hMnHc(b?b`;ZVJOgBK!q@{=>(P6pRiY5h57x6CNz^4-bbQxbqDk9XZ<9C$MKW z;d{Gx52UY$*b1==Vn4)Dh(2lGbMIxIu7RrQEpyxM$gjjSy=zt>yiY) zS>nWm?4F;l|9ia&BD1pK7M5Amvm!Ia3B5Lwl4qpBA7ky?6vq0E4v8BP?jJVRKiD_w z_r8$uAfHIVSX2-JX9-SG#Bf1GAAwv@AJ;=57ZDZFBkLiM>uCxih79fX5;` zIzt8vM)V0F=@CHEBY@;L*S@2Cf`k17p|Q+=t{ZV?e#T^YS;Nb>FN?&~gv`w3^jz29 z21fV%}|G3e<{&B%RLH>e>zQX-A{I5dw6{Dwgx%r8y;=kCwV)rrP zg!G<0qOXMiZX_!|FB@(t|J8=8z&9&Dz4v~U2*>9oi!;&+VFKw{y_e?yk@kf(IX@)@ zD)nt=Nzr|A&5FYENu}(S4iTzfG`sv|rB(icIa<1arj+|E!I^aGm>{^lV@~ z>j-WdSp{%=`fHv2m3nGI-@v{d<$nxGO3O)3%!5Dio0;^l%KL?nhF5|hsjnNx(O1&E z-tQ0V+njsd&VYB9gvsg2Ju{H-H}h|K2;j{#x$yt7;pJv0C;n~!uef{i{cYBI^7>y7 zRe@@$PN~ic9f6LHxKzACTqa(rTB<7e&%XcUd&jMSy*fGqII2{G9V)cVhQKJJ+FwzxmD0NsRkvCX#aV{>A)t7=kOPXD#_A^c=4f zl9I&P3Gh4$Cn&e~o7`b~@Jy2Xmpli~9h{*5q0?jM_ecCIc;0ye&pzQZl2y|$#0zd3G0Oio_prv3RXev1hTDMh!Z!$S( zeozCn8?S=a?%O~~=MiW|o`WCcTkw747tk-h8K|drfX-7wrj=A;6watJ?W6`HysXW% zj?`yV&KNQ6BL^_Qs?8ZyKP#qFX3Ho#J22g{L5xW3#&oS4%(Q8HF{%qNM%W}_R8qYe zh3CFZx9>>i*RcRb$sw3gst9A+e?~H@F%y`!nu(0iHjZgqKABN`m&~Y!rZK|(>5Nb@ zo9UdA%LwH&m^S^HOxKh-jBrvZ)2UX@2#?QY6r$%b3SE_q!p;Ru*T_Xo*T=<-Xw_0i z=)Rm$xV3`mp1z9d(q6-K9{Gb&3|z-_zF5yFRBU7fW}6w&$t{d<#5P9Z&2~nRx06v+ z-pzDu+rx-l_c5K-`x!ytL8hzz5TlTKgz0KM%81I3GYYCFna5u!dZuIk zbEc#I1=EeaVieZAW)wa(FbaNe8R6P@O!wROj8O8C5ia_~bUgaZblH4``8P5m`Ww?B z{J|&$G%=kEn;GG)7Dhqm7xdrC2$r-l9hce}fnq1qIjjrncQaj)0#@)vz;;y%S%Fx@ ziYO5)2vT6Xo-44zLPb`fuEch4f^b!4yUr-H-N7oX;JFIhovz9X+ErQMd^J{Jpw0@n zKsfYc1;_ib-G~O;#c8mj5t?k*6-`zcqQ!RI(qcuC+N|iFHro}U!*<=(VY?%A+3uUV ztT0HA6<*O}1%CRhP_EB*c^a^SqXulZjUg-8V90i98L^_dMy#O8i0w)-W`z$SM)qe# zvi_{V&V=n+VZsVKA)PXS72JjxX37e8nX)1^GqyX^j1}I2K+RdfMsv2i9b%#d+s#_A zLQ_jtRAk8t??ZTq+3rPRR@fkB1%wqVT4TiuKSAnk&5G7SytQV#aT~UKu?^ex$c7a- z+rqK7Z1)9QR-k9c3MSdHqP=#k@T(o$g$`sza|W`4nt^P$sy!Eon+pX!$cB9U$DAAb}EQRzm23Wko)aM!T|te268kux1bp?7t52%9ZVEf^uayw#(3sEw*=KONK(~3;7V(j&@_a zlOUhz#tI4`odaow8!K7_WlP;y;YvtXL4Hji6|8n+OIP&C$`-n@Wl*=Y*o`gEhjyTi z(qt%uHp`&x9v?z4*bjYn_lI^>p`D+uZ0Tzl-)$Hh2iyBx*|L=|?wOD#xU$6~VA~b; z>%o|tUD)zRFn<>2x*1}Y3tJZL!j_;ge*;Lr!5Uq6X3KU%TI$S}jEA*zb!N+zoY~Sx zgIM9QL2OysAhtXb)_Wjqx4=2L=)`ufabg9D5Ux&aX*-;&OK`4MLK^MJifkO&lJ{^v zPr!Md;lLK-4s2PsJzH|to-LaTsXtr;3ihnv0$da2aBU19$d-26vBiuXTb2*0n;qNz z&Xz6TVat|A!8N4=amj`)n`Oh2t~TuO*Vb$aT!-W+Yqq)-uFZp1tWT5`Tc&Eol9ZVB zP872x+G3cqCF`AH$#!d7vZTy{6->5Zz11vO^0+x$HV&fQj4j`8##Z~9v1i}H>tvBB zTRO;;ExSH|^+_MVp6xe)J$Jx_Ju}LLEql|StuF7+3N7Ka#u&5bB8}PZ&+uAYV8jZ= zM(i1xAC?5a7C~SDo zWR<;Rno{2~_e0(={k$5OLX+3bTEQ#k_UjkS%*)T2l0)^(qovQ79a&GA2cb`x9FNCL zuI``Ai^hk{#hVWp>!bIX=L_#K&S`fUr4e_SvDS5rudO-KFIh49bnFy?`Jwb?`3B5dl+uXZl-$DE~eUbC&PEa`)chr#&7FZ=3K@W#)sI< zcx!HAgikgwg2U^Xl3DP69I%#A81M(<_ii;K0jrqe1uL036IL*a4$GP9pGz6}#U)JH zy2VUQ3cR;_Eo8cs7ciaoD;b}C^O(+p3Pxe%T&A;sIph1Glg>AOD8eq4l&HHx+tb} z&Ui+}VJy>jH=LPU8p>3<1T!-qk6~07jb_@tMl#Cp{TSh<;mof9Z$`O`U=&XdV+6_Y zjAM$x`|40edBI@jm(-oF%e_bly>6ly)jHZJ7#;kPtF$rd>djY3)6m zX{vq${f>SDO%vY%MUB@$o2duN*^hzH;Q{D+Q3nKDYk^|SRq)O7BItN=7W_EGfqpXp z&=^q#)D2F6uWt_nc*X%5>vsdujP0O(>}Jq`tp^?EYk<1?3h@2MVxaYIJ`g;d3tBgo zfY!wYz+g!h__%lqFjx}@ly;8?ow5+1aCaooX(GXAOB9$!x&w_R4xqC}42%p+fawHX zpmbUde9;zxD{q@<@8b>hpX=_^CMzz{AJ)+{vi<;l?$Sp3!Oz9?gOHi@0zoX@Z#zjF zt+1vgE0pN-;@h(J>UFZ(E{W`o!XMON6*I59-u;m=aTSPZsT>*Q-GmGi7@|pHK;z-PLNi?Qi z5s&>WNWs)%(lG-`4yI>Nh<$l52kUpM4AVVaf$3Dt$5baQ!rJVYVv66FW9rN*Okw69 z*e_%~*8OoKrnYknrWU>(>uBAHec!bQYxdcXwLCqDea%0DDXAaFbk?85bi`Gd)?OJV z9LQkbcF8eaqiXEO;K#5w6@R!d2fY;L5d%xbUue;vGI_ zxbUeNK6{2auB2^&mv6JcOFS*{xfd+)ws0}7S}(>0saE)$FIKopt~EZV*&1JvZ-bZo zu))hRZSmH(wz%RXJG}Ca9X`{4ATFvJhzo4&@z$mGxbT-ft}w{~S3K{4SK2w^#q%8T ziq{aN6JEZ-319Hp39lG22=7=o2(NrU2yaE4@tGCQ_^(#s#0X-32du?t(9{ za>cu2UGdKKu6SvkD?VS%4Hpn@xG>udU$DasFRpdNJK7*W&>a^9yW?#+?zqx=cf6H$ z$LBqA$18ri<3-vY_yT7ST*=P^SB-|q^uUXXJ@9$UJ@CTK9{BA29=O6u54?-^z<*VH z;PY!daNz~01JQNP125sB9^-+}JOTBfu4sz~-oDHO&I8nkw%R6o;L?#EIOgtw`}Oz0 z1#Qs(3wQk2Id@#L+Z`8`yW^K8x#Jw}j`Mo%_{J9%+u>=;?eG^)cDU^YTUc*fyu8^4pSjoumxyif$EU3Er~cOXhWl1Hk!Xd- zHHq=4GBIwUDaJ>vv&6THE%9OdEpQVz3miLbj`OHFzK=D-w-IJ|J7D9q5na*8TBo8;o b6ee#g?- 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

    KZ=`L(eA2^ujuXC>P=JzI)>NSrI$+4v!nc}E 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⪙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 J-fyqi{~z1EjBx+} literal 0 HcmV?d00001 diff --git a/Thirdparty/SDL2/lib/x86/SDL2.dll b/Thirdparty/SDL2/lib/x86/SDL2.dll new file mode 100644 index 0000000000000000000000000000000000000000..524fce1b82b06330ac592ec3329c075ecf4940d2 GIT binary patch literal 2278912 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%0DOw+cGY}$(RKxon5u>CxFo?+I8s%w9H<{LaK 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